// TaskEditView.jsx — Workspace task detail editor.
// Uses the same Material icons + status overlays as the rest of the product
// (MIcon + StatusOverlay are defined in Pipeline.jsx and exposed on window).
const TEV_TREE = [
{
id: 'g1', kind: 'folder', label: 'Component integration tests with real SignalR (3 of 3)',
expanded: true, folderStatus: 'pulse-amber',
children: [
{ id: 't1', kind: 'Extension', label: 'Add broadcast-trigger helper method', overlay: 'check-green' },
{ id: 't2', kind: 'Extension', label: 'Create SignalRIntegrationCompon...', overlay: 'check-green' },
{ id: 't3', kind: 'Extension', label: 'Implement MergeQueuePanel SignalR tests', overlay: 'pulse-amber', selected: true },
{ id: 't4', kind: 'Description', label: 'Update SignalR testing documentation', overlay: 'dot-blue' },
],
},
{
id: 'g2', kind: 'folder', label: 'Git-based workflows', expanded: true, folderStatus: 'dot-purple',
children: [
{ id: 't5', kind: 'Extension', label: 'Add manual workflow refresh button', overlay: 'check-green' },
{ id: 't6', kind: 'Extension', label: 'Build per-project workflow rollouts', overlay: 'dot-blue' },
{ id: 't7', kind: 'Extension', label: 'Create webhook handler for workflows', overlay: 'pulse-amber' },
{ id: 't8', kind: 'BugReport', label: 'Fix workflow file loader race', overlay: 'error-red' },
{ id: 't9', kind: 'Extension', label: 'Implement workflow validation', overlay: 'dot-purple' },
{ id: 't10', kind: 'Extension', label: 'Remove workflow create/update legacy', overlay: 'x-gray' },
{ id: 't11', kind: 'Extension', label: 'Update workflow settings UI', overlay: 'dot-blue' },
],
},
{
id: 'g3', kind: 'folder', label: 'Ideas', expanded: true, folderStatus: 'dot-blue',
children: [
{ id: 't13', kind: 'Extension', label: 'Feedback & Bug Report System', overlay: 'dot-purple' },
{ id: 't14', kind: 'LocalOffer', label: 'Idea Inbox — rapid feature capture', overlay: 'dot-purple' },
{ id: 't15', kind: 'Extension', label: 'Static Site Generation', overlay: 'dot-blue' },
{ id: 't16', kind: 'Extension', label: 'Wizard Framework & New Project flow', overlay: 'pulse-amber' },
],
},
{
id: 'g4', kind: 'folder', label: 'Infrastructure', expanded: true, folderStatus: 'check-green',
children: [
{
id: 'sg1', kind: 'folder', label: 'Activate Containerized Workflows',
expanded: true, folderStatus: 'pulse-amber',
children: [
{ id: 't18', kind: 'Extension', label: 'Add runs_on to a workflow', overlay: 'check-green' },
],
},
],
},
];
function TevTreeRow({ node, depth = 0 }) {
const [expanded, setExpanded] = React.useState(node.expanded ?? false);
const isFolder = node.kind === 'folder';
const isLeaf = !node.children;
return (
<>
!isLeaf && setExpanded((x) => !x)}
>
{!isLeaf ? (
▸
) : (
)}
{isFolder
?
: }
{node.overlay ? : null}
{isFolder && node.folderStatus ? : null}
{node.label}
{!isLeaf && expanded && (
{node.children.map((c) => (
))}
)}
>
);
}
function TaskEditView({ embedded = false, initialTab = 'content' }) {
const [mode, setMode] = React.useState('edit');
const [tab, setTab] = React.useState(initialTab);
const [execOpen, setExecOpen] = React.useState(false);
React.useEffect(() => {
if (!execOpen) return;
const onDoc = (e) => {
if (!e.target.closest('.tev-exec-wrap')) setExecOpen(false);
};
document.addEventListener('click', onDoc);
return () => document.removeEventListener('click', onDoc);
}, [execOpen]);
return (
{!embedded && (
SourceWeaver
/
SourceWeaver
/
Component integration tests with real SignalR (3 of 3)
/
Implement MergeQueuePanel SignalR tests
WORKSPACE
WORKFLOWS
MERGE QUEUE
SETTINGS
)}
setTab('content')}
>Content
setTab('activity')}
>Activity
{tab === 'activity' ? (
) : (
Implement MergeQueuePanel SignalR tests
SAVE
setMode('edit')}
>EDIT
setMode('split')}
>SPLIT
setMode('preview')}
>PREVIEW
▶
RUN
setExecOpen((x) => !x)}
aria-haspopup="true"
aria-expanded={execOpen}
>
Workspace Task Execution
▾
{execOpen && (
Workflows
Workspace Task Execution
default
Create/Update tickets
v2.1
Califry feature
v0.7
Hotfix triage
v1.4
Spike & report
v0.3
+ Add workflow…
)}
# Implement MergeQueuePanel SignalR tests
## Overview
Create a proof-of-concept test class demonstrating real SignalR testing by covering MergeQueuePanel component scenarios. This validates the complete testing chain: render component → trigger server state change → verify broadcast-driven re-render within timeout.
## Technical Decisions
Target MergeQueuePanel component (chosen due to history of hub-driven refresh bugs)
Minimum 2 tests as specified
Use seeded queue state for test setup
Test state changes via endpoint triggers (enqueue/approve/retry operations)
All assertions must use bounded timeout pattern
## Scope
In scope:
New test class using SignalRIntegrationComponentTestBase
▾ Properties
▸ Links (2 depends on, 1 blocks)
Status
Open
▾
Priority
Medium
▾
Tags
Add tag…
▾
)}
);
}
Object.assign(window, { TaskEditView });