Modules store and bar (#112)

* Register views globally

* Use global private view in debug route

* Register login route

* Add barebones login form

* Add auth check on routing

* Add tests and extract checkAuth function

* Fix tests of router

* Move stores into subfolders

* Register modules from modules store

* Register name / icon in modules store

* Update module configs

* Render v-button in module sidebar

* Render correct paths in module sidebar

* Add activated style to button

* Use correct color for button in module bar

* Use correct icons for system modules

* Add tests for modules store

* Remove readme in favor of inline comments
This commit is contained in:
Rijk van Zanten
2020-02-19 15:21:54 -05:00
committed by GitHub
parent a16569f45d
commit 031bae4ac8
31 changed files with 270 additions and 96 deletions

View File

@@ -1,8 +1,10 @@
import { ModuleConfig } from '@/modules/types';
import { ModuleConfig } from '@/types/modules';
import Collections from './collections.vue';
const config: ModuleConfig = {
id: 'collections',
icon: 'box',
name: i18n => i18n.tc('collection', 2),
routes: [
{
path: '/',

View File

@@ -1,8 +1,10 @@
import { ModuleConfig } from '@/modules/types';
import { ModuleConfig } from '@/types/modules';
import Files from './files.vue';
const config: ModuleConfig = {
id: 'files',
icon: 'collections',
name: i18n => i18n.t('collections.directus_files'),
routes: [
{
path: '/',

6
src/modules/index.ts Normal file
View File

@@ -0,0 +1,6 @@
import CollectionsModule from './collections/';
import FilesModule from './files/';
import SettingsModule from './settings/';
import UsersModule from './users/';
export default [CollectionsModule, FilesModule, SettingsModule, UsersModule];

View File

@@ -1,23 +0,0 @@
import Vue from 'vue';
import { registerModule } from './register';
import { ModuleConfig } from './types';
import router from '@/router';
jest.mock('@/router', () => ({
addRoutes: jest.fn()
}));
describe('Modules / Register', () => {
beforeEach(() => {
(router.addRoutes as jest.Mock).mockClear();
});
it('Registers the routes in router', () => {
const mockModule: ModuleConfig = {
id: 'test-module',
routes: []
};
registerModule(mockModule);
expect(router.addRoutes).toBeCalledWith([]);
});
});

View File

@@ -1,26 +0,0 @@
import router from '@/router';
import { ModuleConfig } from '@/modules/types';
import CollectionsModule from './collections/';
import FilesModule from './files/';
import SettingsModule from './settings/';
import UsersModule from './users/';
// The core modules are available regardless of project, so they can be registered immediately
[CollectionsModule, FilesModule, SettingsModule, UsersModule].forEach(registerModule);
export function registerModule(config: ModuleConfig) {
const routes = config.routes.map(route => ({
...route,
path: `/:project/${config.id}${route.path}`
}));
router.addRoutes(routes);
}
/**
* @NOTE
* The system modules that are registered here will most likely have to be re-registered on login
* as reset the router on logout to prevent custom modules from persisting between project switches
* wrongly
*/

View File

@@ -1,8 +1,10 @@
import { ModuleConfig } from '@/modules/types';
import { ModuleConfig } from '@/types/modules';
import Settings from './settings.vue';
const config: ModuleConfig = {
id: 'settings',
icon: 'settings',
name: i18n => i18n.t('settings'),
routes: [
{
path: '/',

View File

@@ -1,6 +0,0 @@
import { RouteConfig } from 'vue-router';
export type ModuleConfig = {
id: string;
routes: RouteConfig[];
};

View File

@@ -1,8 +1,10 @@
import { ModuleConfig } from '@/modules/types';
import { ModuleConfig } from '@/types/modules';
import Users from './users.vue';
const config: ModuleConfig = {
id: 'users',
icon: 'people',
name: i18n => i18n.t('collections.directus_users'),
routes: [
{
path: '/',