UNPKG

fastlion-amis

Version:

一种MIS页面生成工具

399 lines (344 loc) 12 kB
import { Instance, SnapshotIn, types } from 'mobx-state-tree'; import { extendObject, createObject, getVariable, cloneObject, setVariable, deleteVariable } from '../utils/helper'; import { dataMapping } from '../utils/tpl-builtin'; import { SimpleMap } from '../utils/SimpleMap'; import { StoreNode } from './node'; import { LionExport, rowExport } from '../renderers/Lion/Table/LionTable/components/LionExport/index'; import { LionLoginAmazon } from '../renderers/Lion/components/Actions/LoginAmazon' import compact from 'lodash/compact'; export const iRendererStore = StoreNode.named('iRendererStore') .props({ hasRemoteData: types.optional(types.boolean, false), data: types.optional(types.frozen(), {}), initedAt: 0, // 初始 init 的时刻 updatedAt: 0, // 从服务端更新时刻 pristine: types.optional(types.frozen(), {}), action: types.optional(types.frozen(), undefined), dialogOpen: false, dialogData: types.optional(types.frozen(), undefined), drawerOpen: false, drawerHidden: false, drawerData: types.optional(types.frozen(), undefined), // Aug lionChildViewOpen: false, lionChildViewData: types.optional(types.frozen(), undefined), lionChildViewSiblings: types.optional(types.frozen(), []), // 用来保存childView挂载处原本的dom节点 updateType: '', // 数据更新来源 以判断是否需要保留原数据 当前只有input-table使用 // Jay hiddenIputTable: types.optional(types.frozen(), {}), // 用来保存隐藏的inputTable的数据 inputTableData: types.optional(types.frozen(), {}), // 用来保存inputTable增删改的数据 disabledFormItem: types.optional(types.frozen(), {}), // 禁用某些表单选项,例如checkboxex,radio,select目前用到的场景是根据input-table-dynamic的原始数据已有值来禁用 autoFillObj: types.optional(types.frozen(), {}), // 保存所有表单项的autoFill对象,只是为了给inputTable判断新增数据所用 replace: types.optional(types.frozen(), {}),// 保存当前表单项的上下对象 }) .views(self => ({ getValueByName(name: string, canAccessSuper: boolean = true) { return getVariable(self.data, name, canAccessSuper); }, getPristineValueByName(name: string) { return getVariable(self.pristine, name, false); } })) .actions(self => { const dialogCallbacks = new SimpleMap<(result?: any) => void>(); return { initData(data: object = {}, skipSetPristine = false) { self.initedAt = Date.now(); !skipSetPristine && (self.pristine = data); self.data = data; }, reset() { self.data = self.pristine; }, updateData(data: object = {}, tag?: object, replace?: boolean) { const prev = self.data; let newData; if (tag) { let proto = createObject((self.data as any).__super || null, tag); newData = createObject(proto, { ...(replace ? {} : self.data), ...data }); } else { newData = extendObject(self.data, data, !replace); } Object.defineProperty(newData, '__prev', { value: { ...prev }, enumerable: false, configurable: false, writable: false }); self.data = newData; }, // Jay // input-table组件增删改时的处理函数 // name是input-table的name属性值,即作为表单项的name changeInputTableValue(value: any, name: string) { self.inputTableData = { ...self.inputTableData, [name]: value }; }, updateHiddenInputTable(value: any) { self.hiddenIputTable = { ...self.hiddenIputTable, ...value } }, // Jay // 禁用某些表单选项,例如checkboxex,radio abandonFormItem(value: any, name: string) { self.disabledFormItem = { ...self.disabledFormItem, [name]: value }; }, // Jay // 保存所有表单项中的autoFill对象 setAutoFillObj(obj: { [key: string]: string }) { self.autoFillObj = { ...self.autoFillObj, ...obj }; }, setUpdateType(type: string = '') { self.updateType = type }, changeValue( name: string, value: any, changePristine?: boolean, force?: boolean, otherModifier?: (data: Object) => void ) { if (!name) { return; } const origin = getVariable(self.data, name, false); if (value === origin && !force) { return; } const prev = self.data; const data = cloneObject(self.data); if (prev.__prev) { // 基于之前的 __prev 改 const prevData = cloneObject(prev.__prev); setVariable(prevData, name, origin); Object.defineProperty(data, '__prev', { value: prevData, enumerable: false, configurable: false, writable: false }); } else { Object.defineProperty(data, '__prev', { value: { ...prev }, enumerable: false, configurable: false, writable: false }); } if (value === undefined) { deleteVariable(data, name); } else { setVariable(data, name, value); } otherModifier?.(data); if (changePristine) { const pristine = cloneObject(self.pristine); setVariable(pristine, name, value); otherModifier?.(pristine); self.pristine = pristine; } if (!data.__pristine) { Object.defineProperty(data, '__pristine', { value: self.pristine, enumerable: false, configurable: false, writable: false }); } self.data = data; }, setCurrentAction(action: object) { self.action = action; }, openDialog(ctx: any, additonal?: object, callback?: (ret: any) => void) { let proto = ctx.__super ? ctx.__super : self.data; if (additonal) { proto = createObject(proto, additonal); } const data = createObject(proto, { ...ctx }); if (self.action.dialog && self.action.dialog.data) { self.dialogData = dataMapping(self.action.dialog.data, data); const clonedAction = { ...self.action, dialog: { ...self.action.dialog } }; delete clonedAction.dialog.data; self.action = clonedAction; } else { self.dialogData = data; } self.dialogOpen = true; callback && dialogCallbacks.set(self.dialogData, callback); }, closeDialog(result?: any) { const callback = dialogCallbacks.get(self.dialogData); self.dialogOpen = false; if (callback) { dialogCallbacks.delete(self.dialogData); setTimeout(() => callback(result), 200); } }, openDrawer(ctx: any, additonal?: object, callback?: (ret: any) => void) { if (self.drawerOpen) { self.drawerHidden = false return } let proto = ctx.__super ? ctx.__super : self.data; if (additonal) { proto = createObject(proto, additonal); } const data = createObject(proto, { ...ctx }); if (self.action.drawer.data) { self.drawerData = dataMapping(self.action.drawer.data, data); const clonedAction = { ...self.action, dialog: { ...self.action.dialog } }; delete clonedAction.dialog.data; self.action = clonedAction; } else { self.drawerData = data; } self.drawerOpen = true; if (callback) { dialogCallbacks.set(self.drawerData, callback); } }, closeDrawer(result?: any, saveStateOnClose?: boolean) { if (saveStateOnClose) { self.drawerHidden = true return } const callback = dialogCallbacks.get(self.drawerData); self.drawerOpen = false; if (callback) { dialogCallbacks.delete(self.drawerData); setTimeout(() => callback(result), 200); } }, // Aug 打开子页面 openLionChildView( ctx: any, env: any, additonal?: object, callback?: (ret: any) => void ) { let proto = ctx.__super ? ctx.__super : self.data; if (additonal) { proto = createObject(proto, additonal); } const data = createObject(proto, { ...ctx }); if (self.action.lionChildView.data) { self.lionChildViewData = dataMapping( self.action.lionChildView.data, data ); const clonedAction = { ...self.action, lionChildView: { ...self.action.lionChildView } }; delete clonedAction.lionChildView.data; self.action = clonedAction; } else { self.lionChildViewData = data; } const { modalContainer } = self.action.lionChildView; // 隐藏原层级元素 const con = modalContainer && document.querySelector(modalContainer); const envCon = (() => { if (env && env.getModalContainer) { if (typeof env.getModalContainer === 'function') { return env.getModalContainer(); } return env.getModalContainer; } return undefined; })(); const node = con || envCon || undefined; const children: HTMLElement[] = Array.from(node.children); self.lionChildViewSiblings = children; children.forEach(child => { child.style.display = 'none'; }); // 打开新页面 self.lionChildViewOpen = true; if (callback) { dialogCallbacks.set(self.lionChildViewData, callback); } }, // Aug 关闭子页面 closeLionChildView(result?: any) { const callback = dialogCallbacks.get(self.lionChildViewData); self.lionChildViewOpen = false; // 显示原层级元素 setTimeout(() => { self.lionChildViewSiblings.forEach((item: HTMLElement) => { item.style.display = 'block'; }); }, 300); if (callback) { dialogCallbacks.delete(self.lionChildViewData); setTimeout(() => callback(result), 200); } }, openLionExport(ctx: any, env: any, normalSelectAll?: boolean, callback?: (result: boolean) => void) { env.fetcher(self.action.api, { ...ctx, ...self.data, ...self.data.__super, }).then((res: any) => { if (res.status === 0 && res.data !== null) { const data = res.data if (data.exportType === 2) { rowExport(self.action, { ...ctx, ...self.data.__super, ...data, ids: ctx.tempIds }, env).then(res2 => callback && callback(res2)) } else { const obj = createObject(self.data, ctx) LionExport(self.action, { ...ctx, ...data }, obj, env, normalSelectAll); } } else { env.alert(res.msg) } }) }, openAmazonLoginPage(ctx: any, env: any) { LionLoginAmazon(self.action, ctx, env) }, replaceDialog(data: any) { self.replace = data } }; }); export type IIRendererStore = Instance<typeof iRendererStore>; export type SIRendererStore = SnapshotIn<typeof iRendererStore>; // export type SIRendererStore = typeof iRendererStore.SnapshotType;