ff-admin/src/stores/admin/navigation.ts

164 lines
5.1 KiB
TypeScript
Raw Normal View History

2024-08-23 14:42:32 +02:00
import { defineStore } from "pinia";
import { shallowRef, defineAsyncComponent } from "vue";
export interface navigationModel {
club: navigationSplitModel;
settings: navigationSplitModel;
user: navigationSplitModel;
}
export interface navigationSplitModel {
topTitle?: string;
top?: Array<navigationLinkModel>;
mainTitle: string;
main: Array<navigationLinkModel>;
}
export type topLevelNavigationType = "club" | "settings" | "user";
export interface topLevelNavigationModel {
key: topLevelNavigationType;
title: string;
levelDefault: string;
}
export interface navigationLinkModel {
key: string;
title: string;
component: any;
}
export const useNavigationStore = defineStore("navigation", {
state: () => {
return {
activeNavigation: "club" as topLevelNavigationType,
activeLink: null as null | navigationLinkModel,
topLevel: [
{
key: "club",
title: "Verein",
levelDefault: "#members",
},
{
key: "settings",
title: "Einstellungen",
levelDefault: "#qualification",
},
2024-08-25 13:37:23 +02:00
{
key: "user",
title: "Benutzer",
levelDefault: "#user",
},
2024-08-23 14:42:32 +02:00
] as Array<topLevelNavigationModel>,
navigation: {
club: {
mainTitle: "Verein",
main: [
{
key: "#members",
title: "Mitglieder",
component: shallowRef(defineAsyncComponent(() => import("@/views/admin/members/Overview.vue"))),
},
{
key: "#calendar",
title: "Termine",
component: shallowRef(defineAsyncComponent(() => import("@/views/admin/members/Overview.vue"))),
},
{
key: "#newsletter",
title: "Newsletter",
component: shallowRef(defineAsyncComponent(() => import("@/views/admin/members/Overview.vue"))),
},
{
key: "#protocol",
2024-08-25 10:10:11 +02:00
title: "Protokolle",
2024-08-23 14:42:32 +02:00
component: shallowRef(defineAsyncComponent(() => import("@/views/admin/members/Overview.vue"))),
},
],
},
settings: {
mainTitle: "Einstellungen",
main: [
{
key: "#qualification",
title: "Qualifikationen",
component: shallowRef(defineAsyncComponent(() => import("@/views/admin/members/Overview.vue"))),
},
{
key: "#award",
title: "Auszeichnungen",
component: shallowRef(defineAsyncComponent(() => import("@/views/admin/members/Overview.vue"))),
},
{
key: "#executive_position",
title: "Vereinsämter",
component: shallowRef(defineAsyncComponent(() => import("@/views/admin/members/Overview.vue"))),
},
{
key: "#communication",
title: "Mitgliederdaten",
component: shallowRef(defineAsyncComponent(() => import("@/views/admin/members/Overview.vue"))),
},
],
},
user: {
mainTitle: "Benutzer",
main: [
{
key: "#user",
title: "Benutzer",
component: shallowRef(defineAsyncComponent(() => import("@/views/admin/members/Overview.vue"))),
},
{
key: "#roles",
title: "Rollen",
component: shallowRef(defineAsyncComponent(() => import("@/views/admin/members/Overview.vue"))),
},
],
},
} as navigationModel,
2024-08-25 13:37:23 +02:00
componentOverwrite: null as null | any,
2024-08-23 14:42:32 +02:00
};
},
getters: {
activeNavigationObject: (state) => (state.navigation[state.activeNavigation] ?? {}) as navigationSplitModel,
activeTopLevelObject: (state) =>
(state.topLevel.find((elem) => elem.key == state.activeNavigation) ?? {}) as topLevelNavigationModel,
},
actions: {
setTopLevel(key: topLevelNavigationType, disableSubLink: boolean = true) {
let level = this.topLevel.find((e) => e.key == key) ?? null;
if (!level) {
this.activeNavigation = "club";
if (!disableSubLink) this.setLink(this.topLevel.find((e) => e.key == "club")?.levelDefault ?? null);
else this.setLink(null);
} else {
this.activeNavigation = level.key;
if (!disableSubLink) this.setLink(level.levelDefault);
else this.setLink(null);
}
},
setLink(key: string | null) {
let nav = this.navigation[this.activeNavigation];
if (!nav) {
this.activeLink = null;
return;
}
let links = [...Object.values(nav.main), ...Object.values(nav.top ?? {})];
this.activeLink = links.find((e) => e.key == key) ?? null;
},
setTopLevelNav(topLeveLinks: Array<topLevelNavigationModel>) {
this.topLevel = topLeveLinks;
},
2024-08-25 13:37:23 +02:00
setComponentOverwrite(component: any) {
this.componentOverwrite = component;
},
resetComponentOverwrite() {
this.componentOverwrite = null;
},
2024-08-23 14:42:32 +02:00
resetNavigation() {
this.$reset();
},
},
});