import { Module } from 'vuex'; import { RouteConfig } from 'vue-router/types/router'; import { cloneDeep } from 'lodash'; import CrudOverview from '../crud/crud-overview.vue'; import CrudEditor from './crud-editor.vue'; import store from '../stores'; import { actions as crudActions, getters as crudGetters, mutations as crudMutations, state as crudState } from '../stores/modules/crud-store'; import CrudStoreModel, { CrudStoreAdditionalFieldsModel, CrudStoreCustomFieldsModel } from '../stores/types/CrudStoreModel'; import RootState from '../stores/types/RootStateModel'; export default class CrudFactory { public static generate( module: string, fields?: string[], additionalFields?: CrudStoreAdditionalFieldsModel, customFields?: CrudStoreCustomFieldsModel ): RouteConfig { this.registerStoreModule(module, fields, additionalFields, customFields); return this.setupRoutes(module); } public static generateSingleton(module: string) { this.registerStoreModule(module); return this.setupSingletonRoutes(module); } private static registerStoreModule( module: string, fields?: string[], additionalFields?: CrudStoreAdditionalFieldsModel, customFields?: CrudStoreCustomFieldsModel ) { crudState.path = module; crudState.overview.fields = fields; crudState.overview.additionalFields = additionalFields; crudState.overview.customFields = customFields; store.registerModule( module, cloneDeep({ namespaced: true, state: crudState, getters: crudGetters, actions: crudActions, mutations: crudMutations }) as Module ); } private static setupRoutes(module: string): RouteConfig { const crudStore = store.state[`${module}`] as CrudStoreModel; return { name: module, // @ts-ignore template: '', children: [ { path: '', name: `index-${module}`, component: CrudOverview, meta: { module }, props: () => ({ module, crudStore }) }, { path: 'create', name: `create-${module}`, component: CrudEditor, meta: { module }, props: (route) => ({ query: route.query, module, crudStore }) }, { path: ':id', name: `${module}-editor`, component: CrudEditor, meta: { module }, props: (route) => ({ id: route.params.id, module, crudStore }) }, { path: 'copy', name: `copy-${module}`, component: CrudEditor, meta: { module }, props: (route) => ({ crudItem: route.params.item, query: route.query, module, crudStore }) }, { path: 'translate', name: `translate-${module}`, component: CrudEditor, meta: { module }, props: (route) => ({ crudItem: route.params.item, query: route.query, module, crudStore }) } ] }; } private static setupSingletonRoutes(module: string): RouteConfig { const crudStore = store.state[`${module}`] as CrudStoreModel; return { name: module, // @ts-ignore template: '', children: [ { path: ':id?', name: `${module}-editor`, component: CrudEditor, props: (route) => ({ crudItem: route.params.item, query: route.query, id: route.params.id, module, crudStore }) }, { path: 'translate', name: `translate-${module}`, component: CrudEditor, meta: { module }, props: (route) => ({ crudItem: route.params.item, query: route.query, module, crudStore }) } ] }; } }