UNPKG

fastlion-amis

Version:

一种MIS页面生成工具

223 lines (196 loc) 5.16 kB
import { Instance, SnapshotIn, types } from 'mobx-state-tree'; import { Navigation } from '../components/AsideNav'; import { RendererEnv } from '../factory'; import { createObject, filterTree, findTree, guid, mapTree } from '../utils/helper'; import { ServiceStore } from './service'; export const AppStore = ServiceStore.named('AppStore') .props({ pages: types.frozen(), activePage: types.frozen(), folded: false, offScreen: false }) .views(self => ({ get navigations(): Array<Navigation> { if (Array.isArray(self.pages)) { return mapTree(self.pages, item => { let visible = item?.visible; if ( visible !== false && item.path && !~item.path.indexOf('http') && ~item.path.indexOf(':') ) { visible = false; } return { label: item.label, icon: item.icon, path: item.path, children: item.children, className: item.className, visible }; }); } return [ { label: self.__('App.navigation'), children: [] } ]; }, get bcn() { return self.activePage?.bcn || []; }, get pageData() { return createObject(self.data, { params: self.activePage?.params || {} }); } })) .actions(self => ({ toggleFolded() { self.folded = !self.folded; }, toggleOffScreen() { self.offScreen = !self.offScreen; }, setPages(pages: any) { if (pages && !Array.isArray(pages)) { pages = [pages]; } else if (!Array.isArray(pages)) { return; } pages = mapTree(pages, (item, index, level, paths) => { let path = item.link || item.url; if (item.schema || item.schemaApi) { path = item.url || `/${paths .map(item => item.index) .concat(index) .map(index => `page-${index + 1}`) .join('/')}`; if (path && path[0] !== '/') { let parentPath = '/'; let index = paths.length; while (index > 0) { const item = paths[index - 1]; if (item?.path) { parentPath = item.path + '/'; break; } index--; } path = parentPath + path; } } return { ...item, index, id: item.id || guid(), label: item.label, icon: item.icon, path }; }); self.pages = pages; }, rewrite(to: string, env: RendererEnv) { let page = findTree(self.pages, item => { if (item.path === to) { return true; } return false; }); if (page) { this.setActivePage(page, env); } }, setActivePage(page: any, env: RendererEnv, params?: any) { // 同一个页面直接返回。 if (self.activePage?.id === page.id) { return; } let bcn: Array<any> = []; findTree(self.pages, (item, index, level, paths) => { if (item.id === page.id) { bcn = paths.filter(item => item.path && item.label); bcn.push({ ...item, path: '' }); self.__; if (bcn[0].path !== '/') { bcn.unshift({ label: self.__('App.home'), path: '/' }); } return true; } return false; }); self.activePage = { ...page, params: params || {}, bcn }; if (page.label) { document.title = page.label; } if (page.schema) { self.schema = page.schema; self.schemaKey = '' + Date.now(); } else if (page.schemaApi) { self.schema = null; self.fetchSchema(page.schemaApi, self.activePage, { method: 'get' }); } else if (page.redirect) { env.jumpTo(page.redirect); return; } else if (page.rewrite) { this.rewrite(page.rewrite, env); } else { self.schema = null; self.schemaKey = ''; } }, updateActivePage(env: RendererEnv) { if (!Array.isArray(self.pages)) { return; } let matched: any; let page = findTree(self.pages, item => { if (item.path) { matched = env.isCurrentUrl(item.path, item); if (matched) { return true; } } return false; }); if (page) { this.setActivePage( page, env, typeof matched === 'object' ? matched.params : undefined ); } else { const page = findTree(self.pages, item => item.isDefaultPage); if (page) { this.setActivePage(page, env); } else { self.activePage = null; } } } })); export type IAppStore = Instance<typeof AppStore>; export type SAppStore = SnapshotIn<typeof AppStore>;