From 8b6034dcfae892c2739f979aa6b388b59f6ea63a Mon Sep 17 00:00:00 2001 From: Rex Lorenzo Date: Fri, 12 Jun 2026 01:56:11 -0700 Subject: [PATCH 1/7] VPR-59 feat(cms): add CMS left nav and redesign hub with recent activity - Left nav now mirrors legacy CMS (Home, content blocks, files, left-nav sections, permission-gated); nav, hub cards, and page titles share "Manage X" wording, and /CMS/ canonicalizes to /CMS/Home so the Home link highlights - Hub: permission-filtered 2x2 tool cards plus a recent-activity rail (recently edited blocks/files deep-link to their editors via existing list APIs); zero-permission visitors get an info banner instead of a blank page - Import and Bulk Encrypt moved off the hub into a File Tools menu on Manage Files; the Upload File nav link opens the upload dialog via ?upload=1 - Shell a11y (all areas): visible focus ring on flat card actions, left nav items announce as links, drawer landmark labeled, new "Skip to section menu" link, and in-page anchor navigation no longer steals focus or scroll position - Shared router: scroll position survives query-only navigation, hash links scroll to their target; createSpaRouter.ts renamed to create-spa-router.ts (kebab convention) with new unit tests --- VueApp/src/CAHFS/router/index.ts | 2 +- VueApp/src/CMS/components/RecentActivity.vue | 145 +++++++++++++++++ VueApp/src/CMS/pages/BulkEncrypt.vue | 2 +- VueApp/src/CMS/pages/CmsHome.vue | 147 ++++++++++++------ VueApp/src/CMS/pages/ContentBlockEdit.vue | 2 +- VueApp/src/CMS/pages/ContentBlocks.vue | 2 +- VueApp/src/CMS/pages/FileAuditLog.vue | 2 +- VueApp/src/CMS/pages/Files.vue | 58 ++++++- VueApp/src/CMS/pages/ImportFiles.vue | 2 +- VueApp/src/CMS/pages/LeftNavEdit.vue | 2 +- VueApp/src/CMS/pages/LeftNavMenus.vue | 2 +- .../src/CMS/pages/ManageLinkCollections.vue | 2 +- VueApp/src/CMS/router/index.ts | 8 +- VueApp/src/CMS/router/routes.ts | 12 +- VueApp/src/CTS/router/index.ts | 2 +- VueApp/src/ClinicalScheduler/router/index.ts | 2 +- VueApp/src/Computing/router/index.ts | 2 +- .../src/Effort/components/EffortLeftNav.vue | 1 + VueApp/src/Effort/router/index.ts | 2 +- VueApp/src/Students/router/index.ts | 2 +- VueApp/src/composables/use-route-focus.ts | 7 +- VueApp/src/layouts/LeftNav.vue | 15 +- VueApp/src/layouts/ViperLayout.vue | 8 + .../__tests__/create-spa-router.test.ts | 81 ++++++++++ VueApp/src/shared/create-spa-router.ts | 29 ++++ VueApp/src/shared/createSpaRouter.ts | 20 --- VueApp/src/styles/base.css | 13 ++ web/Areas/CMS/Services/CmsNavMenu.cs | 43 ++++- 28 files changed, 522 insertions(+), 93 deletions(-) create mode 100644 VueApp/src/CMS/components/RecentActivity.vue create mode 100644 VueApp/src/shared/__tests__/create-spa-router.test.ts create mode 100644 VueApp/src/shared/create-spa-router.ts delete mode 100644 VueApp/src/shared/createSpaRouter.ts diff --git a/VueApp/src/CAHFS/router/index.ts b/VueApp/src/CAHFS/router/index.ts index 1ee7424d1..bf695865a 100644 --- a/VueApp/src/CAHFS/router/index.ts +++ b/VueApp/src/CAHFS/router/index.ts @@ -1,4 +1,4 @@ -import { createSpaRouter } from "@/shared/createSpaRouter" +import { createSpaRouter } from "@/shared/create-spa-router" import { routes } from "./routes" import { useRequireLogin } from "@/composables/RequireLogin" import { checkHasOnePermission } from "@/composables/CheckPagePermission" diff --git a/VueApp/src/CMS/components/RecentActivity.vue b/VueApp/src/CMS/components/RecentActivity.vue new file mode 100644 index 000000000..596166bc1 --- /dev/null +++ b/VueApp/src/CMS/components/RecentActivity.vue @@ -0,0 +1,145 @@ + + + diff --git a/VueApp/src/CMS/pages/BulkEncrypt.vue b/VueApp/src/CMS/pages/BulkEncrypt.vue index 5224965a2..365c10a4b 100644 --- a/VueApp/src/CMS/pages/BulkEncrypt.vue +++ b/VueApp/src/CMS/pages/BulkEncrypt.vue @@ -1,7 +1,7 @@