Extracts duplication that built up as shot/asset/task features reached
parity: CheckableCommandItem/ColumnToggleList replace 14+ hand-rolled
checkbox-list blocks, shared toolbar pieces (debounced search, detail-panel
toggle, clear-filters, segmented view/context toggle) replace copy-pasted
markup in the three table toolbars, icon-only buttons standardize on the
icon-sm size, TaskBulkActionsMenu's Assign To submenu matches Set Status,
and a shared DetailPanelOverlay/Header/Loading/Error shell backs all three
detail panels (adding a previously-missing error state to the task panel).
Phase 2 of frontend_tasks.md - close feature gaps between domains:
- Asset user-assignment popover, ported from shot's EditableTaskStatus,
wired through columns.ts and AssetBrowser.vue.
- Asset column-locking toggle: two-pane frozen-column layout ported
into AssetsDataTable.vue (adapted for asset's page-scroll layout,
which has no bounded-height container like shot's).
- Task table row-actions menu (View Details + Reassign only - no
Delete/Edit, since no backend support exists for either).
- Real select-task/create-task behavior on asset and shot detail
panels: clicking a task swaps in the actual TaskDetailPanel in
place; "Add Task" opens a task-type picker that creates real tasks
via the existing createAssetTask/createShotTask services.
- create-note/upload-reference/publish-version implemented via a
task-picker that deep-links into TaskDetailPanel's Notes/
Attachments/Submissions tabs (new initialTab prop), reusing the
already-working task-level components instead of building three new
bespoke forms. Also fixed shot's pre-existing dead "Add Note"/
"Upload Reference" buttons the same way.
- Consolidated ProjectMembersManager.vue and ProjectMemberManagement.vue
into one component, combining remove-confirmation and approved-user
filtering with toast feedback and the shared Select/Dialog UI kit.
- Wired ProjectDetailView's "Manage Members" to navigate to the
project's Settings > Team tab.
Also fixed a bug in this session's own new code: TaskBrowser.vue's
row-click handler is a no-op by design, so the new row-actions menu
needed to emit row-double-click (which actually opens the panel)
instead.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>