101 lines
3.0 KiB
TypeScript
Executable File
101 lines
3.0 KiB
TypeScript
Executable File
import { type Router } from 'vue-router';
|
|
import { VIEWS } from '@/constants';
|
|
import { DataStoreModule } from '@/features/dataStore/module.descriptor';
|
|
import { registerResource } from '@/moduleInitializer/resourceRegistry';
|
|
import { useUIStore } from '@/stores/ui.store';
|
|
import { useSettingsStore } from '@/stores/settings.store';
|
|
import { InsightsModule } from '../features/insights/module.descriptor';
|
|
import type { FrontendModuleDescription } from '@/moduleInitializer/module.types';
|
|
import * as modalRegistry from '@/moduleInitializer/modalRegistry';
|
|
|
|
/**
|
|
* Hard-coding modules list until we have a dynamic way to load modules.
|
|
*/
|
|
const modules: FrontendModuleDescription[] = [InsightsModule, DataStoreModule];
|
|
|
|
/**
|
|
* Initialize modules resources (used in ResourcesListLayout), done in init.ts
|
|
*/
|
|
export const registerModuleResources = () => {
|
|
modules.forEach((module) => {
|
|
module.resources?.forEach((resource) => {
|
|
registerResource(resource);
|
|
});
|
|
});
|
|
};
|
|
|
|
/**
|
|
* Initialize modules project tabs (used in ProjectHeader), done in init.ts
|
|
*/
|
|
export const registerModuleProjectTabs = () => {
|
|
const uiStore = useUIStore();
|
|
modules.forEach((module) => {
|
|
if (module.projectTabs) {
|
|
if (module.projectTabs.overview) {
|
|
uiStore.registerCustomTabs('overview', module.id, module.projectTabs.overview);
|
|
}
|
|
if (module.projectTabs.project) {
|
|
uiStore.registerCustomTabs('project', module.id, module.projectTabs.project);
|
|
}
|
|
if (module.projectTabs.shared) {
|
|
uiStore.registerCustomTabs('shared', module.id, module.projectTabs.shared);
|
|
}
|
|
}
|
|
});
|
|
};
|
|
|
|
/**
|
|
* Middleware function to check if a module is available
|
|
*/
|
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
const checkModuleAvailability = (options: any) => {
|
|
if (!options?.to?.meta?.moduleName || typeof options.to.meta.moduleName !== 'string') {
|
|
return true;
|
|
}
|
|
return useSettingsStore().isModuleActive(options.to.meta.moduleName);
|
|
};
|
|
|
|
/**
|
|
* Initialize module modals, done in init.ts
|
|
*/
|
|
export const registerModuleModals = () => {
|
|
modules.forEach((module) => {
|
|
module.modals?.forEach((modalDef) => {
|
|
modalRegistry.register(modalDef);
|
|
});
|
|
});
|
|
// Subscribe to modal registry changes
|
|
useUIStore().initializeModalsFromRegistry();
|
|
};
|
|
|
|
/**
|
|
* Initialize module routes, done in main.ts
|
|
*/
|
|
export const registerModuleRoutes = (router: Router) => {
|
|
modules.forEach((module) => {
|
|
module.routes?.forEach((route) => {
|
|
// Prepare the enhanced route with module metadata and custom middleware that checks module availability
|
|
const enhancedRoute = {
|
|
...route,
|
|
meta: {
|
|
...route.meta,
|
|
moduleName: module.id,
|
|
// Merge middleware options if custom middleware is present
|
|
...(route.meta?.middleware?.includes('custom') && {
|
|
middlewareOptions: {
|
|
...route.meta?.middlewareOptions,
|
|
custom: checkModuleAvailability,
|
|
},
|
|
}),
|
|
},
|
|
};
|
|
|
|
if (route.meta?.projectRoute) {
|
|
router.addRoute(VIEWS.PROJECT_DETAILS, enhancedRoute);
|
|
} else {
|
|
router.addRoute(enhancedRoute);
|
|
}
|
|
});
|
|
});
|
|
};
|