<#ibizinclude> ./CONTROL-BASE.template.ftl </#ibizinclude> <#assign import_block> import ${srfclassname('${ctrl.codeName}')}Model from '@/app-core/ctrl-model/app/${srffilepath2(ctrl.codeName)}-${ctrl.getControlType()?lower_case}-model'; import { Environment } from '@/environments/environment'; </#assign> <#ibizinclude> ../@MACRO/CONTROL/CONTROL_HEADER-BASE.vue.ftl </#ibizinclude> /** * 部件样式 * * @protected * @type {(string | 'ICONVIEW' | 'LISTVIEW' | 'SWIPERVIEW' | 'LISTVIEW2' | 'LISTVIEW3' | 'LISTVIEW4')} 默认空字符串 | 图标视图 | 列表视图 | 图片滑动视图 | 列表视图(无刷新) | 列表视图(无滑动) | 列表视图(无背景) * @memberof ${srfclassname('${ctrl.codeName}')} */ @Prop({ default: '' }) protected controlStyle!: string | 'ICONVIEW' | 'LISTVIEW' | 'SWIPERVIEW' | 'LISTVIEW2' | 'LISTVIEW3' | 'LISTVIEW4'; /** * 获取多项数据 * * @returns {any[]} * @memberof ${srfclassname('${ctrl.codeName}')} */ public getDatas(): any[] { return []; } /** * 获取单项树 * * @returns {*} * @memberof ${srfclassname('${ctrl.codeName}')} */ public getData(): any { return null; } /** * 菜单模型 * * @type {${srfclassname('${ctrl.codeName}')}Mode} * @memberof ${srfclassname('${ctrl.codeName}')} */ public menuMode: ${srfclassname('${ctrl.codeName}')}Model = new ${srfclassname('${ctrl.codeName}')}Model(); /** * 显示处理提示 * * @type {boolean} * @memberof ${srfclassname('${ctrl.codeName}')} */ @Prop({ default: true }) protected showBusyIndicator?: boolean; /** * 菜单数据 * * @private * @type {any[]} * @memberof ${srfclassname('${ctrl.codeName}')} */ @Provide() private menus: any[] = []; /** * 菜单收缩改变 * * @type {boolean} * @memberof ${srfclassname('${ctrl.codeName}')} */ @Model() protected collapsechange?: boolean; /** * 监听菜单收缩 * * @param {*} newVal * @param {*} oldVal * @memberof ${srfclassname('${ctrl.codeName}')} */ @Watch('collapsechange') onCollapsechangeChange(newVal: any, oldVal: any) { if (newVal !== this.isCollapse) { this.isCollapse = !this.isCollapse; } } /** * 当前模式,菜单在顶部还是在底部 * * @type {*} * @memberof ${srfclassname('${ctrl.codeName}')} */ @Prop() mode: any; /** * 当前菜单是否在默认视图上 * * @type {*} * @memberof ${srfclassname('${ctrl.codeName}')} */ @Prop({ default: false }) isDefaultPage?: boolean; /** * 默认打开视图 * * @type {*} * @memberof ${srfclassname('${ctrl.codeName}')} */ @Prop() defPSAppView: any; /** * 默认激活的index * * @type {*} * @memberof ${srfclassname('${ctrl.codeName}')} */ @Provide() defaultActive: any = null; /** * 当前选中主题 * * @type {*} * @memberof ${srfclassname('${ctrl.codeName}')} */ @Prop() selectTheme: any; /** * 默认打开的index数组 * * @type {any[]} * @memberof ${srfclassname('${ctrl.codeName}')} */ @Provide() protected defaultOpeneds: any[] = []; /** * 是否展开 * * @type {boolean} * @memberof ${srfclassname('${ctrl.codeName}')} */ @Provide() protected isCollapse: boolean = false; /** * 触发方式,默认click * * @type {string} * @memberof ${srfclassname('${ctrl.codeName}')} */ @Provide() trigger: string = 'click'; /** * 计数器数据 * * @type {*} * @memberof ${srfclassname('${ctrl.codeName}')} */ protected counterdata: any = {}; /** * vue 生命周期 * * @memberof ${srfclassname('${ctrl.codeName}')} */ protected created() { this.afterCreated(); } /** * 执行created后的逻辑 * * @memberof ${srfclassname('${ctrl.codeName}')} */ protected afterCreated(){ if (Object.is(this.mode, 'horizontal')) { this.trigger = 'hover'; } if (this.viewState) { this.viewStateEvent = this.viewState.subscribe(({ tag, action, data }) => { if (!Object.is(tag, this.name)) { return; } this.load(data); }); } } /** * vue 生命周期 * * @memberof ${srfclassname('${ctrl.codeName}')} */ protected destroyed() { this.afterDestroy(); } /** * 执行destroyed后的逻辑 * * @memberof ${srfclassname('${ctrl.codeName}')} */ protected afterDestroy() { if (this.viewStateEvent) { this.viewStateEvent.unsubscribe(); } <#if destroyed_block??> ${destroyed_block} </#if> } /** * 获取菜单项数据 * * @private * @param {any[]} items * @param {string} name * @returns * @memberof ${srfclassname('${ctrl.codeName}')} */ private compute(items: any[], name: string) { const item: any = {}; items.some((_item: any) => { if (name && Object.is(_item.name, name)) { Object.assign(item, _item); this.setHideSideBar(_item); return true; } if (_item.items && Array.isArray(_item.items)) { const subItem = this.compute(_item.items, name); if (Object.keys(subItem).length > 0) { Object.assign(item, subItem); return true; } } return false; }); return item; } /** * 设置是否隐藏菜单栏 * * @private * @param {*} item * @memberof ${srfclassname('${ctrl.codeName}')} */ private setHideSideBar(item: any): void { <#if view.isDefaultPage?? && view.isDefaultPage()> if (item.hidesidebar) { this.$emit('collapsechange', true); } </#if> } /** * 菜单项选中处理 * * @param {*} index * @param {any[]} indexs * @returns * @memberof ${srfclassname('${ctrl.codeName}')} */ protected select(index: any, indexs: any[]) { let item = this.compute(this.menus, index); if (Object.keys(item).length === 0) { return; } this.click(item); } /** * 菜单点击 * * @private * @param {*} item 菜单数据 * @memberof ${srfclassname('${ctrl.codeName}')} */ private click(item: any) { if (item) { switch (item.appfunctag) { <#if ctrl.getPSAppFuncs()??> <#assign appFuncs = ctrl.getPSAppFuncs()> <#list appFuncs as singFuncs> case '${singFuncs.getCodeName()}': this.click${singFuncs.codeName}(item); return; </#list> </#if> default: console.warn('未指定应用功能'); } } } <#if ctrl.getPSAppFuncs()??> <@ibizindent blank=4> <#list ctrl.getPSAppFuncs() as singleFuncs> ${P.getLogicCode(singleFuncs,"LOGIC.vue").code} </#list> </@ibizindent> </#if> /** * 数据加载 * * @param {*} data * @memberof ${srfclassname('${ctrl.codeName}')} */ protected load(data: any) { this.dataProcess(this.menuMode.getAppMenuItems()); this.menus = this.menuMode.getAppMenuItems(); if(Environment.enablePermissionValid){ this.computedEffectiveMenus(this.menus); } } /** * 计算有效菜单项 * * @param {*} data * @memberof Main */ public computedEffectiveMenus(inputMenus:Array<any>){ inputMenus.forEach((_item:any) =>{ if(!this.$store.getters['authresource/getAuthMenu'](_item)){ _item.hidden = true; if (_item.items && _item.items.length > 0) { this.computedEffectiveMenus(_item.items); } } }) } /** * 数据处理 * * @private * @param {any[]} items * @memberof ${srfclassname('${ctrl.codeName}')} */ private dataProcess(items: any[]): void { items.forEach((_item: any) => { if (_item.expanded) { this.defaultOpeneds.push(_item.id); } if (_item.items && _item.items.length > 0) { this.dataProcess(_item.items) } }); } /** * 提示框主题样式 * * @readonly * @type {string} * @memberof ${srfclassname('${ctrl.codeName}')} */ get popperClass(): string { return 'app-popper-menu ' + this.selectTheme; } <#ibizinclude> ../@MACRO/CONTROL/CONTROL_BOTTOM-BASE.vue.ftl </#ibizinclude> <#ibizinclude> ../@MACRO/CONTROL/CONTROL-BASE.style.ftl </#ibizinclude>