From 54344c322adb52762c3c73dbc9552610cea3fef5 Mon Sep 17 00:00:00 2001 From: "marcel.kocisek" Date: Wed, 19 Feb 2025 18:19:38 +0100 Subject: [PATCH] Added abilty to store breadcrumbs in store, not just from router - there are bugs in vue-router and query strings and meta --- .../layout/components/AppBreadcrumbs.vue | 45 +++++++++++-------- .../packages/lib/src/modules/layout/store.ts | 4 +- .../project/views/ProjectViewTemplate.vue | 3 +- 3 files changed, 32 insertions(+), 20 deletions(-) diff --git a/web-app/packages/lib/src/modules/layout/components/AppBreadcrumbs.vue b/web-app/packages/lib/src/modules/layout/components/AppBreadcrumbs.vue index 7ab51f3f..3ef7239a 100644 --- a/web-app/packages/lib/src/modules/layout/components/AppBreadcrumbs.vue +++ b/web-app/packages/lib/src/modules/layout/components/AppBreadcrumbs.vue @@ -49,35 +49,44 @@ import { MenuItem } from 'primevue/menuitem' import { computed } from 'vue' import { useRoute } from 'vue-router' +import { useLayoutStore } from '../store' + type EnhancedMenuItem = MenuItem & { path: string; active?: boolean } +const layoutStore = useLayoutStore() const route = useRoute() // Merge all matched meta.breadcrumps with current route breadcrumps const items = computed(() => - [ - ...route.matched.reduce((acc, curr) => { - if (curr.name === route.name) return acc + layoutStore.breadcrumps?.length + ? layoutStore.breadcrumps?.map((item, index, items) => ({ + label: item.title, + path: item.path, + active: index === items.length - 1 + })) + : [ + ...route.matched.reduce((acc, curr) => { + if (curr.name === route.name) return acc - return [ - ...acc, - ...(curr.meta?.breadcrump ?? []).map((item) => ({ + return [ + ...acc, + ...(curr.meta?.breadcrump ?? []).map((item) => ({ + label: item.title, + path: item.path + })) + ] + }, []), + // adding current route wich is not in matched meta + ...(route.meta.breadcrump ?? []).map((item) => ({ label: item.title, path: item.path })) ] - }, []), - // adding current route wich is not in matched meta - ...(route.meta.breadcrump ?? []).map((item) => ({ - label: item.title, - path: item.path - })) - ] - // last will be active - .map((item, index, items) => ({ - ...item, - active: index === items.length - 1 - })) + // last will be active + .map((item, index, items) => ({ + ...item, + active: index === items.length - 1 + })) ) diff --git a/web-app/packages/lib/src/modules/layout/store.ts b/web-app/packages/lib/src/modules/layout/store.ts index 2f3aef49..d75ef80a 100644 --- a/web-app/packages/lib/src/modules/layout/store.ts +++ b/web-app/packages/lib/src/modules/layout/store.ts @@ -11,6 +11,7 @@ export interface LayoutState { isUnderOverlayBreakpoint: boolean /** Parsed closed elements from local storage and pushed back to local storage */ closedElements: string[] + breadcrumps: { title: string; path: string }[] } const CLOSED_ELEMENTS_KEY = 'mm-closed-elements' @@ -20,7 +21,8 @@ export const useLayoutStore = defineStore('layoutModule', { overlayBreakpoint: 1200, drawer: false, isUnderOverlayBreakpoint: false, - closedElements: [] + closedElements: [], + breadcrumps: [] }), getters: { /** diff --git a/web-app/packages/lib/src/modules/project/views/ProjectViewTemplate.vue b/web-app/packages/lib/src/modules/project/views/ProjectViewTemplate.vue index 4b88329b..57b5eee6 100644 --- a/web-app/packages/lib/src/modules/project/views/ProjectViewTemplate.vue +++ b/web-app/packages/lib/src/modules/project/views/ProjectViewTemplate.vue @@ -352,7 +352,8 @@ export default defineComponent({ */ tabClick(index: number) { this.$router.push({ - name: this.tabs[index].route + name: this.tabs[index].route, + query: {} }) } }