From f20563e31e176230e0141b5dc7c4511b38c311a6 Mon Sep 17 00:00:00 2001 From: AJ Slater Date: Thu, 29 Oct 2026 14:47:11 -0700 Subject: [PATCH 1/2] feat(frontend): register Vuetify labs components Auto-import the labs components (VCheckboxGroup, VSplitBtn). Co-Authored-By: Claude Opus 5.5 --- frontend/vite.config.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/vite.config.js b/frontend/vite.config.js index 9743dea60..f09386c00 100644 --- a/frontend/vite.config.js +++ b/frontend/vite.config.js @@ -206,7 +206,7 @@ const config = defineConfig(({ mode }) => { define: defineObj, plugins: [ vue(), - vuetify({ autoImport: true }), + vuetify({ autoImport: { labs: true } }), // Lint runs ESLint over the frontend; vitest needn't run it again. !IS_TEST_ENV && checker({ From 0371d5525394ade9944d858c515ef4d8a7dd6404 Mon Sep 17 00:00:00 2001 From: AJ Slater Date: Thu, 29 Oct 2026 14:47:11 -0700 Subject: [PATCH 2/2] feat(admin): library Poll / Force Update as a split button Experiment. Poll is the button and Force Update its one menu item. Both confirmations sit outside the menu, which unmounts its content when it closes, so ConfirmDialog gains a controlled mode: bound to a modelValue it renders no activator and reports every close. Co-Authored-By: Claude Opus 5.5 --- .../components/admin/tabs/admin-section.scss | 6 +- .../components/admin/tabs/library-table.vue | 42 +++++- frontend/src/components/confirm-dialog.vue | 28 +++- frontend/tests/unit/confirm-dialog.test.js | 90 +++++++++++++ .../tests/unit/library-table-poll.test.js | 127 ++++++++++++++++++ 5 files changed, 282 insertions(+), 11 deletions(-) create mode 100644 frontend/tests/unit/confirm-dialog.test.js create mode 100644 frontend/tests/unit/library-table-poll.test.js diff --git a/frontend/src/components/admin/tabs/admin-section.scss b/frontend/src/components/admin/tabs/admin-section.scss index e5fca17a4..fa047b9d8 100644 --- a/frontend/src/components/admin/tabs/admin-section.scss +++ b/frontend/src/components/admin/tabs/admin-section.scss @@ -144,11 +144,13 @@ // The icon-button cluster in a data table's Actions column: dimmed until // hovered so the rows stay calm. - .adminActionCell :deep(> button) { + .adminActionCell :deep(> button), + .adminActionCell :deep(> .v-split-btn .v-btn) { opacity: 0.7; } - .adminActionCell :deep(> button:hover) { + .adminActionCell :deep(> button:hover), + .adminActionCell :deep(> .v-split-btn .v-btn:hover) { opacity: 1; } diff --git a/frontend/src/components/admin/tabs/library-table.vue b/frontend/src/components/admin/tabs/library-table.vue index 5c985a3ec..edb1b2a8d 100644 --- a/frontend/src/components/admin/tabs/library-table.vue +++ b/frontend/src/components/admin/tabs/library-table.vue @@ -45,22 +45,44 @@