|  |  |  | @ -7,7 +7,6 @@ import { FG_Plugin } from 'src/plugins'; | 
		
	
		
			
				|  |  |  |  | import routes from 'src/router/routes'; | 
		
	
		
			
				|  |  |  |  | import { axios } from 'boot/axios'; | 
		
	
		
			
				|  |  |  |  | import { AxiosResponse } from 'axios'; | 
		
	
		
			
				|  |  |  |  | import { flatRoutes } from '@dreamonkey/vue-routes-flattener'; | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  | const config = { | 
		
	
		
			
				|  |  |  |  |   // Do not change required Modules !!
 | 
		
	
	
		
			
				
					|  |  |  | @ -44,21 +43,16 @@ function combineRoutes( | 
		
	
		
			
				|  |  |  |  |   target.forEach(target => { | 
		
	
		
			
				|  |  |  |  |     if (target.path === mainPath) { | 
		
	
		
			
				|  |  |  |  |       source.forEach((sourceMainConfig: FG_Plugin.PluginRouteConfig) => { | 
		
	
		
			
				|  |  |  |  |         const targetMainConfig = target.children?.find( | 
		
	
		
			
				|  |  |  |  |           (targetMainConfig: RouteConfig) => { | 
		
	
		
			
				|  |  |  |  |             return sourceMainConfig.path === targetMainConfig.path; | 
		
	
		
			
				|  |  |  |  |           } | 
		
	
		
			
				|  |  |  |  |         ); | 
		
	
		
			
				|  |  |  |  |         const targetMainConfig = target.children?.find((targetMainConfig: RouteConfig) => { | 
		
	
		
			
				|  |  |  |  |           return sourceMainConfig.path === targetMainConfig.path; | 
		
	
		
			
				|  |  |  |  |         }); | 
		
	
		
			
				|  |  |  |  |         if (targetMainConfig) { | 
		
	
		
			
				|  |  |  |  |           const sourceChildren: RouteConfig[] = []; | 
		
	
		
			
				|  |  |  |  |           sourceMainConfig.children?.forEach(child => { | 
		
	
		
			
				|  |  |  |  |             sourceChildren.push(<RouteConfig>child); | 
		
	
		
			
				|  |  |  |  |           }); | 
		
	
		
			
				|  |  |  |  |           if (targetMainConfig.children) { | 
		
	
		
			
				|  |  |  |  |             targetMainConfig.children = Object.assign( | 
		
	
		
			
				|  |  |  |  |               targetMainConfig.children, | 
		
	
		
			
				|  |  |  |  |               sourceChildren | 
		
	
		
			
				|  |  |  |  |             ); | 
		
	
		
			
				|  |  |  |  |             targetMainConfig.children = Object.assign(targetMainConfig.children, sourceChildren); | 
		
	
		
			
				|  |  |  |  |           } else { | 
		
	
		
			
				|  |  |  |  |             targetMainConfig.children = sourceChildren; | 
		
	
		
			
				|  |  |  |  |           } | 
		
	
	
		
			
				
					|  |  |  | @ -66,6 +60,12 @@ function combineRoutes( | 
		
	
		
			
				|  |  |  |  |           if (target.children === undefined) { | 
		
	
		
			
				|  |  |  |  |             target.children = []; | 
		
	
		
			
				|  |  |  |  |           } | 
		
	
		
			
				|  |  |  |  |           if ( | 
		
	
		
			
				|  |  |  |  |             sourceMainConfig.children && | 
		
	
		
			
				|  |  |  |  |             sourceMainConfig.children.length > 0 && | 
		
	
		
			
				|  |  |  |  |             !sourceMainConfig.component | 
		
	
		
			
				|  |  |  |  |           ) | 
		
	
		
			
				|  |  |  |  |             sourceMainConfig.component = () => import('src/components/navigation/EmptyParent.vue'); | 
		
	
		
			
				|  |  |  |  |           target.children.push(<RouteConfig>sourceMainConfig); | 
		
	
		
			
				|  |  |  |  |         } | 
		
	
		
			
				|  |  |  |  |       }); | 
		
	
	
		
			
				
					|  |  |  | @ -79,26 +79,22 @@ function combineMainLinks( | 
		
	
		
			
				|  |  |  |  |   target: FG_Plugin.PluginMainLink[], | 
		
	
		
			
				|  |  |  |  |   source: FG_Plugin.PluginRouteConfig | 
		
	
		
			
				|  |  |  |  | ): FG_Plugin.PluginMainLink[] { | 
		
	
		
			
				|  |  |  |  |   const targetPluginMainLink: | 
		
	
		
			
				|  |  |  |  |     | FG_Plugin.PluginMainLink | 
		
	
		
			
				|  |  |  |  |     | undefined = target.find( | 
		
	
		
			
				|  |  |  |  |   const targetPluginMainLink: FG_Plugin.PluginMainLink | undefined = target.find( | 
		
	
		
			
				|  |  |  |  |     (targetPluginMainLink: FG_Plugin.PluginMainLink) => { | 
		
	
		
			
				|  |  |  |  |       console.log(targetPluginMainLink.title, source.title); | 
		
	
		
			
				|  |  |  |  |       return targetPluginMainLink.title == source.title; | 
		
	
		
			
				|  |  |  |  |     } | 
		
	
		
			
				|  |  |  |  |   ); | 
		
	
		
			
				|  |  |  |  |   if (targetPluginMainLink) { | 
		
	
		
			
				|  |  |  |  |     source.children?.forEach( | 
		
	
		
			
				|  |  |  |  |       (sourcePluginChildLink: FG_Plugin.PluginRouteConfig) => { | 
		
	
		
			
				|  |  |  |  |         targetPluginMainLink.children.push(<FG_Plugin.PluginChildLink>{ | 
		
	
		
			
				|  |  |  |  |           title: sourcePluginChildLink.title, | 
		
	
		
			
				|  |  |  |  |           icon: sourcePluginChildLink.icon, | 
		
	
		
			
				|  |  |  |  |           link: sourcePluginChildLink.name, | 
		
	
		
			
				|  |  |  |  |           name: sourcePluginChildLink.name, | 
		
	
		
			
				|  |  |  |  |           permissions: sourcePluginChildLink.meta?.permissions | 
		
	
		
			
				|  |  |  |  |         }); | 
		
	
		
			
				|  |  |  |  |       } | 
		
	
		
			
				|  |  |  |  |     ); | 
		
	
		
			
				|  |  |  |  |     source.children?.forEach((sourcePluginChildLink: FG_Plugin.PluginRouteConfig) => { | 
		
	
		
			
				|  |  |  |  |       targetPluginMainLink.children.push(<FG_Plugin.PluginChildLink>{ | 
		
	
		
			
				|  |  |  |  |         title: sourcePluginChildLink.title, | 
		
	
		
			
				|  |  |  |  |         icon: sourcePluginChildLink.icon, | 
		
	
		
			
				|  |  |  |  |         link: sourcePluginChildLink.name, | 
		
	
		
			
				|  |  |  |  |         name: sourcePluginChildLink.name, | 
		
	
		
			
				|  |  |  |  |         permissions: sourcePluginChildLink.meta?.permissions | 
		
	
		
			
				|  |  |  |  |       }); | 
		
	
		
			
				|  |  |  |  |     }); | 
		
	
		
			
				|  |  |  |  |   } else { | 
		
	
		
			
				|  |  |  |  |     const mainLink: FG_Plugin.PluginMainLink = <FG_Plugin.PluginMainLink>{ | 
		
	
		
			
				|  |  |  |  |       title: source.title, | 
		
	
	
		
			
				
					|  |  |  | @ -158,36 +154,18 @@ function loadPlugin( | 
		
	
		
			
				|  |  |  |  |     }); | 
		
	
		
			
				|  |  |  |  |     if (plugin) { | 
		
	
		
			
				|  |  |  |  |       if (plugin.mainRoutes) { | 
		
	
		
			
				|  |  |  |  |         loadedPlugins.routes = combineRoutes( | 
		
	
		
			
				|  |  |  |  |           loadedPlugins.routes, | 
		
	
		
			
				|  |  |  |  |           plugin.mainRoutes, | 
		
	
		
			
				|  |  |  |  |           '/main' | 
		
	
		
			
				|  |  |  |  |         ); | 
		
	
		
			
				|  |  |  |  |         loadedPlugins.routes = combineRoutes(loadedPlugins.routes, plugin.mainRoutes, '/main'); | 
		
	
		
			
				|  |  |  |  |         plugin.mainRoutes.forEach(route => { | 
		
	
		
			
				|  |  |  |  |           loadedPlugins.mainLinks = combineMainLinks( | 
		
	
		
			
				|  |  |  |  |             loadedPlugins.mainLinks, | 
		
	
		
			
				|  |  |  |  |             route | 
		
	
		
			
				|  |  |  |  |           ); | 
		
	
		
			
				|  |  |  |  |           loadedPlugins.mainLinks = combineMainLinks(loadedPlugins.mainLinks, route); | 
		
	
		
			
				|  |  |  |  |         }); | 
		
	
		
			
				|  |  |  |  |         loadedPlugins.shortcuts = loadShortCuts( | 
		
	
		
			
				|  |  |  |  |           loadedPlugins.shortcuts, | 
		
	
		
			
				|  |  |  |  |           plugin.mainRoutes | 
		
	
		
			
				|  |  |  |  |         ); | 
		
	
		
			
				|  |  |  |  |         loadedPlugins.shortcuts = loadShortCuts(loadedPlugins.shortcuts, plugin.mainRoutes); | 
		
	
		
			
				|  |  |  |  |       } | 
		
	
		
			
				|  |  |  |  |       if (plugin.outRoutes) { | 
		
	
		
			
				|  |  |  |  |         loadedPlugins.routes = combineRoutes( | 
		
	
		
			
				|  |  |  |  |           loadedPlugins.routes, | 
		
	
		
			
				|  |  |  |  |           plugin.outRoutes | 
		
	
		
			
				|  |  |  |  |         ); | 
		
	
		
			
				|  |  |  |  |         loadedPlugins.shortcutsOut = loadShortCuts( | 
		
	
		
			
				|  |  |  |  |           loadedPlugins.shortcutsOut, | 
		
	
		
			
				|  |  |  |  |           plugin.outRoutes | 
		
	
		
			
				|  |  |  |  |         ); | 
		
	
		
			
				|  |  |  |  |         loadedPlugins.routes = combineRoutes(loadedPlugins.routes, plugin.outRoutes); | 
		
	
		
			
				|  |  |  |  |         loadedPlugins.shortcutsOut = loadShortCuts(loadedPlugins.shortcutsOut, plugin.outRoutes); | 
		
	
		
			
				|  |  |  |  |       } | 
		
	
		
			
				|  |  |  |  |       if (plugin.widgets.length > 0) { | 
		
	
		
			
				|  |  |  |  |         plugin.widgets.forEach( | 
		
	
		
			
				|  |  |  |  |           widget => (widget.name = plugin.name + '_' + widget.name) | 
		
	
		
			
				|  |  |  |  |         ); | 
		
	
		
			
				|  |  |  |  |         plugin.widgets.forEach(widget => (widget.name = plugin.name + '_' + widget.name)); | 
		
	
		
			
				|  |  |  |  |         Array.prototype.push.apply(loadedPlugins.widgets, plugin.widgets); | 
		
	
		
			
				|  |  |  |  |       } | 
		
	
		
			
				|  |  |  |  |       if (plugin.store) { | 
		
	
	
		
			
				
					|  |  |  | @ -258,26 +236,22 @@ export default boot<Store<StateInterface>>(({ Vue, router, store }) => { | 
		
	
		
			
				|  |  |  |  |                 config.loadModules.includes(requiredModule) | 
		
	
		
			
				|  |  |  |  |               ) | 
		
	
		
			
				|  |  |  |  |             ) { | 
		
	
		
			
				|  |  |  |  |               console.error( | 
		
	
		
			
				|  |  |  |  |                 `Plugin ${plugin.name} need Plugin ${requiredModule}` | 
		
	
		
			
				|  |  |  |  |               ); | 
		
	
		
			
				|  |  |  |  |               console.error(`Plugin ${plugin.name} need Plugin ${requiredModule}`); | 
		
	
		
			
				|  |  |  |  |               router.push({ name: 'error' }).catch(e => { | 
		
	
		
			
				|  |  |  |  |                 console.warn(e); | 
		
	
		
			
				|  |  |  |  |               }); | 
		
	
		
			
				|  |  |  |  |             } | 
		
	
		
			
				|  |  |  |  |           }); | 
		
	
		
			
				|  |  |  |  |           plugin.requiredBackendModules.forEach( | 
		
	
		
			
				|  |  |  |  |             (requiredBackendModule: string) => { | 
		
	
		
			
				|  |  |  |  |               if (!(requiredBackendModule in backend.plugins)) { | 
		
	
		
			
				|  |  |  |  |                 console.error( | 
		
	
		
			
				|  |  |  |  |                   `Plugin ${plugin.name} need Plugin ${requiredBackendModule} in backend.` | 
		
	
		
			
				|  |  |  |  |                 ); | 
		
	
		
			
				|  |  |  |  |                 router.push({ name: 'error' }).catch(err => { | 
		
	
		
			
				|  |  |  |  |                   console.warn(err); | 
		
	
		
			
				|  |  |  |  |                 }); | 
		
	
		
			
				|  |  |  |  |               } | 
		
	
		
			
				|  |  |  |  |           plugin.requiredBackendModules.forEach((requiredBackendModule: string) => { | 
		
	
		
			
				|  |  |  |  |             if (!(requiredBackendModule in backend.plugins)) { | 
		
	
		
			
				|  |  |  |  |               console.error( | 
		
	
		
			
				|  |  |  |  |                 `Plugin ${plugin.name} need Plugin ${requiredBackendModule} in backend.` | 
		
	
		
			
				|  |  |  |  |               ); | 
		
	
		
			
				|  |  |  |  |               router.push({ name: 'error' }).catch(err => { | 
		
	
		
			
				|  |  |  |  |                 console.warn(err); | 
		
	
		
			
				|  |  |  |  |               }); | 
		
	
		
			
				|  |  |  |  |             } | 
		
	
		
			
				|  |  |  |  |           ); | 
		
	
		
			
				|  |  |  |  |           }); | 
		
	
		
			
				|  |  |  |  |         }); | 
		
	
		
			
				|  |  |  |  |       } | 
		
	
		
			
				|  |  |  |  |     }) | 
		
	
	
		
			
				
					|  |  |  | @ -306,7 +280,7 @@ export default boot<Store<StateInterface>>(({ Vue, router, store }) => { | 
		
	
		
			
				|  |  |  |  |   loadedPlugins.widgets.sort((a, b) => b.priority - a.priority); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |   // add new routes for plugins, flatten them to allow empty parent routes
 | 
		
	
		
			
				|  |  |  |  |   router.addRoutes(flatRoutes(loadedPlugins.routes)); | 
		
	
		
			
				|  |  |  |  |   router.addRoutes(loadedPlugins.routes); | 
		
	
		
			
				|  |  |  |  | 
 | 
		
	
		
			
				|  |  |  |  |   // save plugins in VM-variable
 | 
		
	
		
			
				|  |  |  |  |   // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
 | 
		
	
	
		
			
				
					|  |  |  | 
 |