diff --git a/.task/checksum/build-frontend--DEV--RUNNER-npm- b/.task/checksum/build-frontend--DEV--RUNNER-npm- index e008a24..1a829c9 100644 --- a/.task/checksum/build-frontend--DEV--RUNNER-npm- +++ b/.task/checksum/build-frontend--DEV--RUNNER-npm- @@ -1 +1 @@ -cd84020b5c141a3842ad91546a552d0 +bcd40faf16720fe7180c537d7deb93f9 diff --git a/.task/checksum/windows-common-generate-bindings b/.task/checksum/windows-common-generate-bindings index 843ebf7..5bd0fc9 100644 --- a/.task/checksum/windows-common-generate-bindings +++ b/.task/checksum/windows-common-generate-bindings @@ -1 +1 @@ -d56685eca1698f613f797ff4d81f460a +caf892d1dc4259ca637eae8b231784f9 diff --git a/frontend/src/App.vue b/frontend/src/App.vue index 34f9408..4a7f6eb 100644 --- a/frontend/src/App.vue +++ b/frontend/src/App.vue @@ -2,7 +2,7 @@ import { computed, onMounted, onUnmounted, ref, watch } from 'vue' import { useRoute, useRouter } from 'vue-router' import { useI18n } from 'vue-i18n' -import { LayoutDashboard, ScrollText, Settings, X, Database, SlidersHorizontal, Home, ListTodo, TicketCheck, CalendarDays, CalendarCheck2, Sparkles, UserRound, ClipboardList, Wrench, Rocket, ChevronDown, Bell, StickyNote, ListFilter, Palette, Bot, Users, NotebookPen, CloudUpload, Power, Image, Activity, Package, Shield, Plus, Pin, PinOff } from 'lucide-vue-next' +import { LayoutDashboard, ScrollText, Settings, X, Database, SlidersHorizontal, Home, ListTodo, TicketCheck, CalendarDays, CalendarCheck2, Sparkles, UserRound, ClipboardList, Wrench, Rocket, ChevronDown, Bell, StickyNote, ListFilter, Palette, Bot, Users, NotebookPen, CloudUpload, Power, Image, Activity, Package, Shield, Plus, Pin } from 'lucide-vue-next' import { useAppStore } from './store' import DatabaseSetup from './components/DatabaseSetup.vue' import BrowserBlocked from './components/BrowserBlocked.vue' @@ -108,7 +108,7 @@ const navGroups = [ ] } ] -// ---- 概览快捷入口:把其它分区菜单钉到「概览」二级导航 ---- +// ---- 顶栏快捷入口:把常用菜单钉到 TitleBar「快捷」下拉 ---- const SHORTCUT_KEY = 'cc-nav-shortcuts' const loadShortcuts = () => { try { @@ -128,7 +128,7 @@ const catalogByTo = computed(() => { } return map }) -// 可钉到概览的项:非概览内置、且当前用户可见 +// 可钉到顶栏的项:非概览内置、且当前用户可见 const pinnableItems = computed(() => { const overviewTos = new Set(navGroups[0].items.map(it => it.to)) const out = [] @@ -146,7 +146,6 @@ function addShortcut(to) { if (navShortcuts.value.includes(to)) return navShortcuts.value = [...navShortcuts.value, to] saveShortcuts() - shortcutPicker.value = false } function removeShortcut(to) { navShortcuts.value = navShortcuts.value.filter(x => x !== to) @@ -157,18 +156,19 @@ function toggleShortcut(to) { else addShortcut(to) } +// 钉到顶栏「快捷」菜单的项(带徽标数字,供 TitleBar 渲染) +const pinnedShortcuts = computed(() => navShortcuts.value + .map(to => catalogByTo.value.get(to)) + .filter(it => it && (!it.adminOnly || store.syncStatus.userId === 1)) + .map(it => ({ + to: it.to, + label: it.label, + icon: it.icon, + badge: it.badge ? (store.badges[it.badge] || 0) : 0 + }))) + // adminOnly 项只对云端管理员(id=1)展示 -const visibleItems = g => { - let items = g.items.filter(it => !it.adminOnly || store.syncStatus.userId === 1) - if (g.id === 'overview') { - const extras = navShortcuts.value - .map(to => catalogByTo.value.get(to)) - .filter(it => it && (!it.adminOnly || store.syncStatus.userId === 1)) - .map(it => ({ ...it, shortcut: true })) - items = [...items, ...extras] - } - return items -} +const visibleItems = g => g.items.filter(it => !it.adminOnly || store.syncStatus.userId === 1) const itemActive = it => it.match ? it.match(route) : route.path === it.to.split('?')[0] // 导航徽标:badge 显示数字,dot 只显示小圆点;一级 rail 在组内任一非零时亮点 const badgeVal = it => it.badge ? (store.badges[it.badge] || 0) : 0 @@ -186,7 +186,6 @@ watch(() => route.fullPath, () => { const g = groupOfRoute() if (g) activeGroupId.value = g railFlyout.value = null - if (g !== 'overview') shortcutPicker.value = false for (const grp of navGroups) { for (const it of grp.items) if (it.children && itemActive(it)) expandedParents.value[it.label] = true } @@ -288,7 +287,7 @@ watch(activeTask, task => {