feature: task-dnd-ux (3/3) - #31
Conversation
… role=button to SubtaskRow - DraggableTaskEntry deliberately strips role from dnd-kit attributes so the wrapper is not matched by interactive selectors; update the two tests to assert the actual contract (no role/aria-pressed, tabindex=0, aria-roledescription=draggable) instead of role=button. - SubtaskRow's keyboard-interactive row (tabIndex + Enter/Space handler) lacked role=button; add it for a11y correctness. Safe for TaskOrganizationPointerSensor since [role=button] is not in its INTERACTIVE_SELECTOR. Fixes 4 failing platform-unit-test specs on PR #31 CI (ubuntu+windows).
c1d378b to
3b9a3ab
Compare
|
Update: fixed a bug where pinned shortcut cards on Welcome Recent Tasks and History did nothing when clicked. |
|
Update: fixed pinned folder shortcuts not opening. Clicking a pinned folder card previously only toggled the collapsed manual-folder row further down the view, so the shortcut itself never opened. Pinned folder cards now expand in place like a regular folder, listing member tasks as compact rows that open the task on click, and collapse on a second click. Regression tests updated for both Welcome Recent Tasks and History (commit cd41efa, mirrored from |
7d3f50f to
4fe79fa
Compare
ec9d71e to
402f670
Compare
… role=button to SubtaskRow - DraggableTaskEntry deliberately strips role from dnd-kit attributes so the wrapper is not matched by interactive selectors; update the two tests to assert the actual contract (no role/aria-pressed, tabindex=0, aria-roledescription=draggable) instead of role=button. - SubtaskRow's keyboard-interactive row (tabIndex + Enter/Space handler) lacked role=button; add it for a11y correctness. Safe for TaskOrganizationPointerSensor since [role=button] is not in its INTERACTIVE_SELECTOR. Fixes 4 failing platform-unit-test specs on PR #31 CI (ubuntu+windows).
27cfa20 to
8f4160c
Compare
bf84cc1 to
044753a
Compare
f9b7251 to
3d4b652
Compare
… role=button to SubtaskRow - DraggableTaskEntry deliberately strips role from dnd-kit attributes so the wrapper is not matched by interactive selectors; update the two tests to assert the actual contract (no role/aria-pressed, tabindex=0, aria-roledescription=draggable) instead of role=button. - SubtaskRow's keyboard-interactive row (tabIndex + Enter/Space handler) lacked role=button; add it for a11y correctness. Safe for TaskOrganizationPointerSensor since [role=button] is not in its INTERACTIVE_SELECTOR. Fixes 4 failing platform-unit-test specs on PR #31 CI (ubuntu+windows).
… role=button to SubtaskRow - DraggableTaskEntry deliberately strips role from dnd-kit attributes so the wrapper is not matched by interactive selectors; update the two tests to assert the actual contract (no role/aria-pressed, tabindex=0, aria-roledescription=draggable) instead of role=button. - SubtaskRow's keyboard-interactive row (tabIndex + Enter/Space handler) lacked role=button; add it for a11y correctness. Safe for TaskOrganizationPointerSensor since [role=button] is not in its INTERACTIVE_SELECTOR. Fixes 4 failing platform-unit-test specs on PR #31 CI (ubuntu+windows).
044753a to
5cab0cc
Compare
3d4b652 to
cf24be7
Compare
… role=button to SubtaskRow - DraggableTaskEntry deliberately strips role from dnd-kit attributes so the wrapper is not matched by interactive selectors; update the two tests to assert the actual contract (no role/aria-pressed, tabindex=0, aria-roledescription=draggable) instead of role=button. - SubtaskRow's keyboard-interactive row (tabIndex + Enter/Space handler) lacked role=button; add it for a11y correctness. Safe for TaskOrganizationPointerSensor since [role=button] is not in its INTERACTIVE_SELECTOR. Fixes 4 failing platform-unit-test specs on PR #31 CI (ubuntu+windows).
707bafe to
edac770
Compare
…ence - Add Zod-based type contracts in packages/types/src/task-organization.ts - Add TaskOrganizationStore with atomic read-modify-write via safeUpdateJson - Add safeUpdateJson helper to src/utils/safeWriteJson.ts - Add taskOrganization to GlobalFileNames - Export TaskOrganizationStore types from @roo-code/types - Add ExtensionMessage/WebviewMessage fields for task organization - 29 tests covering CRUD, folder management, pinning, and concurrency - Fix all no-explicit-any lint errors with proper type narrowing
…vider state assembly - Add taskOrganizationMessageHandler.ts: validates mutation requests via Zod, applies through TaskOrganizationStore, posts typed results to webview - Add taskOrganizationMessageHandler.spec.ts: 6 tests covering validation, success, store rejection, and unexpected error paths - Wire taskOrganizationMutation case in webviewMessageHandler.ts - Integrate TaskOrganizationStore into ClineProvider: constructor init, dispose, getTaskOrganizationStore() getter, reconcile on history writes, and taskOrganization state in getStateToPostToWebview()
- Add TaskOrganizationStore for atomic persistence - Add DnD controller and UI components with dnd-kit - Add folder creation and drag-drop composition - Add pin buttons with ErrorBoundary protection - Add selection mode folder actions and DeleteFoldersDialog - Convert to whole-card drag with interactive control guard - Add localization for DnD UX redesign features - Stabilize DnD components and Welcome screen integration
…nd folders Three bugs caused workspace A's tasks/pins/folders to leak into workspace B: 1. HistoryPreview passed undefined as cwd to buildGroupedOrganizationProjection, disabling workspace filtering entirely in the preview. 2. HistoryView's renderPinnedHeader iterated ALL organization.pins (global state) without workspace filtering. Pinned tasks from other workspaces displayed raw task IDs as labels (the 'encrypted numbers' symptom). 3. buildGroupedOrganizationProjection always included folder projections even when all members belonged to other workspaces, causing empty folders from workspace A to appear in workspace B. Fix: pass cwd to the projection in HistoryView, filter pins by workspace when showAllWorkspaces is false, and skip folders with no visible members when cwd is provided. Genuinely empty folders (zero taskIds) are preserved.
Distinguish cwd === undefined (show all workspaces) from cwd === empty string (no workspace open). Previously !cwd treated both identically, causing workspace-specific folders and pins to appear when no workspace was open. - isVisibleInWorkspace: !cwd → cwd === undefined - folder skip condition: cwd && ... → cwd !== undefined && ...
… role=button to SubtaskRow - DraggableTaskEntry deliberately strips role from dnd-kit attributes so the wrapper is not matched by interactive selectors; update the two tests to assert the actual contract (no role/aria-pressed, tabindex=0, aria-roledescription=draggable) instead of role=button. - SubtaskRow's keyboard-interactive row (tabIndex + Enter/Space handler) lacked role=button; add it for a11y correctness. Safe for TaskOrganizationPointerSensor since [role=button] is not in its INTERACTIVE_SELECTOR. Fixes 4 failing platform-unit-test specs on PR #31 CI (ubuntu+windows).
* refactor(types): canonicalize provider settings identifiers * refactor(cli): canonicalize provider identifiers * refactor(cli): extract option resolution helpers * test(cli): cover run option resolution * fix(cli): resolve specialized provider model IDs
15fbb1f to
bd2d8a2
Compare
67f980a to
5a5b996
Compare
… mode, dialog, and interaction tests
87a9679 to
f67bcd5
Compare
Co-authored-by: Roomote <roomote@roomote.dev>
…1190) Co-authored-by: Roomote <roomote@roomote.dev>
- task-org-ui.test.ts: replace non-existent api.getState() with real RooCodeAPI surface (isTaskInHistory, getTaskHistoryItem, getCurrentTaskStack); fixes TS2339/TS7006 e2e-mock errors. - playwright-ct.config.ts: alias '@/i18n/TranslationContext' to the CT mock. Components in the TaskOrganization fixture chain import useAppTranslation via '@/i18n/...' which bypassed the existing '@src/i18n/...' alias, pulling the real TranslationContext -> ExtensionStateContext -> @roo-code/types barrel (zod) into the CT bundle and throwing 'ReferenceError: z is not defined' at mount.
…nt, e2e fixtures) - webview-visual: wrap TaskOrganizationFixture with TooltipProvider so Radix-based tooltips render in Playwright CT (was empty 520x32 render); regenerate the 3 dark-theme baselines from the now-correct render - compile(eslint): remove unused taskGroup helper and TaskGroup import from the visual fixture (@typescript-eslint/no-unused-vars) - e2e-mock: add task-org-ui.json aimock fixtures returning attempt_completion for the 5 task-org-ui prompt markers; tasks previously hit mock 404 'No fixture matched' and timed out in waitUntilCompleted
…ames (Zoo-Code-Org#1073) * fix(telemetry): record tool usage once centrally, sanitize raw tool names * fix(telemetry): defer native MCP usage recording until validation passes * fix(telemetry): narrow UseMcpToolTool callback, harden test mocks, close coverage gaps * test(telemetry): complete native MCP mock so validateToolExists runs the real path
Co-authored-by: Roomote <roomote@roomote.dev>
Co-authored-by: Roomote <roomote@roomote.dev>
Co-authored-by: Roomote <roomote@roomote.dev>
|
Closing to recreate with main as target base branch. This PR had stale base branch references after fork sync. |
Stack Position
feature/task-dnd-uxDescription
Full Feature Description
feature/task-dnd-uxtask-organization.ts,TaskOrganizationStore.ts,safeWriteJson.ts,taskOrganizationMessageHandler.ts,ClineProvider.ts,HistoryView.tsx,ExtensionStateContext.tsx.Why Split Into 17 PRs
Instead of submitting this feature as a single unified PR, it was split into individual PRs because as code size grows, safely reviewing a PR becomes very difficult. The feature was broken into mutually exclusive individual PRs so that each can be reviewed independently.
What This PR Specifically Changes
Adds history folder/group/pin UI, pointer/keyboard DnD, dialog, optimistic reconciliation/rollback, empty/error state, locale, accessibility, and visual snapshot. Does not duplicate store/handler.
Included Files
webview-ui/src/components/history/HistoryView.tsxwebview-ui/src/components/history/TaskOrganizationDndSurface.tsxwebview-ui/src/components/history/useTaskOrganizationDnd.tswebview-ui/src/context/ExtensionStateContext.tsxwebview-ui/src/components/history/HistoryView.task-organization.visual.tsxExclusion Scope