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>
- Pass episode_id filter to backend API instead of client-side filtering,
reducing payload size when an episode is selected
- Skip getShot refetch in ShotDetailPanel when initialShot prop is provided
- Fix redundant DB query in list_shots: read project.custom_task_statuses
directly from the already-fetched project object
- Add missing indexes on Task.shot_id, Task.assigned_user_id,
Task.deleted_at and Episode.project_id; add add_perf_indexes.py
migration script to apply them to existing databases
- Center login page layout
- Update CLAUDE.md and AGENTS.md with correct venv path
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>