From 26807984ee3511dbec69cd424e3f5ecbbc725501 Mon Sep 17 00:00:00 2001 From: indigo Date: Sat, 18 Jul 2026 02:15:55 +0800 Subject: [PATCH] Phase 3: Unify controls across shot/asset/task toolbars and detail panels 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). --- .../src/components/asset/AssetBrowser.vue | 83 ++----- .../src/components/asset/AssetDetailPanel.vue | 68 ++--- .../src/components/asset/AssetReferences.vue | 4 +- .../components/asset/AssetTableToolbar.vue | 216 ++++------------ frontend/src/components/asset/columns.ts | 7 +- .../src/components/episode/EpisodeList.vue | 2 +- .../project/ProjectMemberManagement.vue | 2 +- .../settings/EpisodeManagementSection.vue | 2 +- .../components/shared/ClearFiltersButton.vue | 13 + .../components/shared/ColumnToggleList.vue | 99 ++++++++ .../components/shared/DetailPanelError.vue | 19 ++ .../components/shared/DetailPanelHeader.vue | 27 ++ .../components/shared/DetailPanelLoading.vue | 12 + .../components/shared/DetailPanelOverlay.vue | 35 +++ .../shared/DetailPanelToggleButton.vue | 20 ++ .../src/components/shared/SegmentedToggle.vue | 36 +++ .../{asset => shared}/TaskStatusFilter.vue | 143 +++++------ frontend/src/components/shot/ShotBrowser.vue | 55 +---- frontend/src/components/shot/ShotCard.vue | 2 +- .../src/components/shot/ShotDetailPanel.vue | 108 ++++---- .../src/components/shot/ShotTableToolbar.vue | 230 ++++------------- .../components/shot/ShotTaskStatusFilter.vue | 204 --------------- .../src/components/shot/ShotsTableView.vue | 2 +- frontend/src/components/shot/columns.ts | 7 +- frontend/src/components/task/TaskBrowser.vue | 48 +--- .../components/task/TaskBulkActionsMenu.vue | 33 +-- .../src/components/task/TaskDetailPanel.vue | 48 ++-- .../src/components/task/TaskTableToolbar.vue | 232 ++++-------------- frontend/src/components/task/columns.ts | 6 +- .../ui/command/CheckableCommandItem.vue | 25 ++ frontend/src/components/ui/command/index.ts | 1 + .../ui/sidebar/SidebarColumnSwitch.vue | 58 ++--- .../src/composables/useDebouncedSearch.ts | 11 + frontend/src/views/ProjectsView.vue | 2 +- 34 files changed, 714 insertions(+), 1146 deletions(-) create mode 100644 frontend/src/components/shared/ClearFiltersButton.vue create mode 100644 frontend/src/components/shared/ColumnToggleList.vue create mode 100644 frontend/src/components/shared/DetailPanelError.vue create mode 100644 frontend/src/components/shared/DetailPanelHeader.vue create mode 100644 frontend/src/components/shared/DetailPanelLoading.vue create mode 100644 frontend/src/components/shared/DetailPanelOverlay.vue create mode 100644 frontend/src/components/shared/DetailPanelToggleButton.vue create mode 100644 frontend/src/components/shared/SegmentedToggle.vue rename frontend/src/components/{asset => shared}/TaskStatusFilter.vue (70%) delete mode 100644 frontend/src/components/shot/ShotTaskStatusFilter.vue create mode 100644 frontend/src/components/ui/command/CheckableCommandItem.vue create mode 100644 frontend/src/composables/useDebouncedSearch.ts diff --git a/frontend/src/components/asset/AssetBrowser.vue b/frontend/src/components/asset/AssetBrowser.vue index 3f97478..6e3694f 100644 --- a/frontend/src/components/asset/AssetBrowser.vue +++ b/frontend/src/components/asset/AssetBrowser.vue @@ -173,63 +173,30 @@ @confirm-delete="handleDeleteAsset" /> - - - - - - - - - - - - + + + + + @@ -253,7 +220,7 @@ import { DialogHeader, DialogTitle, } from "@/components/ui/dialog"; -import { Sheet, SheetContent } from "@/components/ui/sheet"; +import DetailPanelOverlay from "@/components/shared/DetailPanelOverlay.vue"; import AssetCard from "./AssetCard.vue"; import AssetForm from "./AssetForm.vue"; import AssetDetailPanel from "./AssetDetailPanel.vue"; diff --git a/frontend/src/components/asset/AssetDetailPanel.vue b/frontend/src/components/asset/AssetDetailPanel.vue index fd8cd37..69a7327 100644 --- a/frontend/src/components/asset/AssetDetailPanel.vue +++ b/frontend/src/components/asset/AssetDetailPanel.vue @@ -1,50 +1,31 @@