salix-front/src/stores/useNavigationStore.js

107 lines
2.7 KiB
JavaScript
Raw Normal View History

2022-11-24 06:21:45 +00:00
import axios from 'axios';
2022-11-29 13:45:48 +00:00
import { ref } from 'vue';
2022-11-24 06:21:45 +00:00
import { defineStore } from 'pinia';
2022-11-29 13:45:48 +00:00
import { toLowerCamel } from 'src/filters';
import { useRole } from 'src/composables/useRole';
import routes from 'src/router/modules';
2022-11-24 06:21:45 +00:00
2022-11-29 06:10:04 +00:00
export const useNavigationStore = defineStore('navigationStore', () => {
const modules = [
'shelving',
'order',
'customer',
'entry',
'travel',
'invoiceOut',
2023-12-20 14:43:09 +00:00
'invoiceIn',
'supplier',
'claim',
'route',
'ticket',
'worker',
'wagon',
];
2022-11-29 13:45:48 +00:00
const pinnedModules = ref([]);
const role = useRole();
2022-11-24 06:21:45 +00:00
2022-11-29 13:45:48 +00:00
function getModules() {
const modulesRoutes = ref([]);
for (const module of modules) {
const moduleDef = routes.find((route) => toLowerCamel(route.name) === module);
2022-12-13 11:21:12 +00:00
if (!moduleDef) continue;
2022-11-29 13:45:48 +00:00
const item = addMenuItem(module, moduleDef, modulesRoutes.value);
if (!item) continue;
item.module = module;
item.isPinned = false;
if (pinnedModules.value.includes(module)) {
item.isPinned = true;
}
}
return modulesRoutes;
}
function getPinnedModules() {
const modules = getModules();
2022-12-02 08:54:49 +00:00
return modules && modules.value.filter((item) => item.isPinned);
2022-11-29 13:45:48 +00:00
}
function addMenuItem(module, route, parent) {
const { meta } = route;
2024-01-27 15:14:50 +00:00
let { menuChildren = null } = meta;
if (menuChildren)
menuChildren = menuChildren.map(({ name, title, icon }) => ({
2024-01-27 15:08:56 +00:00
name,
icon,
title: `${module}.pageTitles.${title}`,
}));
2022-11-29 13:45:48 +00:00
if (meta && meta.roles && role.hasAny(meta.roles) === false) return;
const item = {
name: route.name,
2024-01-27 15:14:50 +00:00
children: menuChildren,
2022-11-29 13:45:48 +00:00
};
if (meta) {
item.title = `${module}.pageTitles.${meta.title}`;
item.icon = meta.icon;
}
parent.push(item);
return item;
}
2022-11-29 06:10:04 +00:00
2022-11-24 06:21:45 +00:00
async function fetchPinned() {
2022-11-29 13:45:48 +00:00
if (pinnedModules.value.length) return;
2022-11-24 06:21:45 +00:00
2022-11-29 13:45:48 +00:00
const response = await axios.get('StarredModules/getStarredModules');
pinnedModules.value = response.data.map((row) => row.moduleFk);
2022-11-24 06:21:45 +00:00
}
2022-11-29 06:10:04 +00:00
function togglePinned(module) {
2022-11-29 13:45:48 +00:00
if (pinnedModules.value.includes(module)) {
const index = pinnedModules.value.indexOf(module);
pinnedModules.value.splice(index, 1);
2022-11-29 06:10:04 +00:00
return;
}
2022-11-29 13:45:48 +00:00
pinnedModules.value.push(module);
2022-11-29 06:10:04 +00:00
}
2022-11-24 06:21:45 +00:00
return {
modules,
2022-11-29 13:45:48 +00:00
pinnedModules,
getModules,
getPinnedModules,
fetchPinned,
2022-11-29 06:10:04 +00:00
togglePinned,
2022-11-29 13:45:48 +00:00
addMenuItem,
2022-11-24 06:21:45 +00:00
};
});