diff --git a/frontend/src/router/index.js b/frontend/src/router/index.js index 2405699..9d60bb9 100644 --- a/frontend/src/router/index.js +++ b/frontend/src/router/index.js @@ -5,6 +5,7 @@ import SettingsLayout from '../views/settings/SettingsLayout.vue' import { setupComplete, setupSkipped, isSetupLoaded, refreshSetupState } from '../composables/setupState' import { loadEnabledPlugins, isPluginEnabled } from '../composables/enabledPlugins' import { useToast } from '../composables/toast' +import { getFacilityName } from '../utils/siteSettings' // Auto-discover all route modules from routes/ directory const routeModules = import.meta.glob('./routes/*.js', { eager: true }) @@ -137,6 +138,43 @@ const router = createRouter({ routes }) +// --- Document titles: " ShopDB - " --------------------------- +// Facility name comes from public settings (cached after first fetch); the +// page label comes from meta.title when a route sets one, else a prettified +// route name with spellings for the odd ones. +const TITLE_SPELLINGS = { + 'pcs': 'PCs', + 'usb': 'USB Devices', + 'geenforce': 'GE-Enforce', + 'knowledgebase': 'Knowledge Base', + 'printedparts': '3D Printed Parts', + 'parts-kiosk': 'Parts Kiosk', + 'tv': 'TV Slideshow', + 'shopfloor': 'Shopfloor Dashboard', + 'measuringtools': 'Measuring Tools', + 'networkdevices': 'Network', +} + +function pageTitleFor(route) { + if (route.meta?.title) return route.meta.title + const name = String(route.name || '') + if (!name) return '' + const base = name.replace(/-(new|edit|detail)$/, '') + if (TITLE_SPELLINGS[base]) return TITLE_SPELLINGS[base] + return base.split('-').map(word => + word.charAt(0).toUpperCase() + word.slice(1)).join(' ') +} + +router.afterEach(async (to) => { + let siteTitle = 'ShopDB' + try { + const facility = await getFacilityName() + if (facility && facility !== 'ShopDB') siteTitle = `${facility} ShopDB` + } catch (titleError) { /* settings unavailable - plain ShopDB */ } + const page = pageTitleFor(to) + document.title = page && page !== 'Home' ? `${siteTitle} - ${page}` : siteTitle +}) + // Navigation guard router.beforeEach(async (to, from, next) => { const authStore = useAuthStore() diff --git a/frontend/src/views/AppLayout.vue b/frontend/src/views/AppLayout.vue index 530584b..24f0cd6 100644 --- a/frontend/src/views/AppLayout.vue +++ b/frontend/src/views/AppLayout.vue @@ -42,7 +42,8 @@