import { IPSAppDEPickupView, IPSDEPickupViewPanel } from '@ibizstudio/runtime'; import { MPickupViewEngine, ModelTool, throttle, MPickUpViewInterface, Util } from '@ibizstudio/runtime'; import { MainViewBase } from './mainview-base'; /** * 数据多项选择视图基类 * * @export * @class MPickUpViewBase * @extends {MainViewBase} * @implements {MPickUpViewInterface} */ export class MPickUpViewBase extends MainViewBase implements MPickUpViewInterface { /** * 视图实例 * * @memberof MPickUpViewBase */ declare viewInstance: IPSAppDEPickupView; /** * 选择视图面板实例 * * @memberof MPickUpViewBase */ pickUpViewPanelInstance!: IPSDEPickupViewPanel; /** * 视图引擎 * * @public * @type {Engine} * @memberof MPickUpViewBase */ engine: MPickupViewEngine = new MPickupViewEngine(); /** * 监听部件动态参数变化 * * @param {*} newVal * @param {*} oldVal * @memberof MPickUpViewBase */ onDynamicPropsChange(newVal: any, oldVal: any) { super.onDynamicPropsChange(newVal, oldVal); if (this.viewparams?.selectedData) { this.selectedData = JSON.stringify(this.viewparams.selectedData); } } /** * 监听部件静态参数变化 * * @param {*} newVal * @param {*} oldVal * @memberof MPickUpViewBase */ onStaticPropsChange(newVal: any, oldVal: any) { this.isShowButton = newVal?.isShowButton !== false; super.onStaticPropsChange(newVal, oldVal); } /** * 引擎初始化 * * @public * @memberof MPickUpViewBase */ engineInit(): void { if (this.Environment && this.Environment.isPreviewMode) { return; } let engineOpts = ({ view: this, parentContainer: this.$parent, p2k: '0', pickupViewPanel: (this.$refs[this.pickUpViewPanelInstance?.name] as any).ctrl, keyPSDEField: this.appDeCodeName.toLowerCase(), majorPSDEField: this.appDeMajorFieldName.toLowerCase(), }); this.engine.init(engineOpts); } /** * 视图初始化 * * @memberof MPickUpViewBase */ async viewMounted() { super.viewMounted(); if (this.viewparams?.selectedData) { this.engine.onCtrlEvent('pickupviewpanel', 'selectionchange', this.viewparams.selectedData); } } /** * 初始化分页导航视图实例 * * @memberof MPickUpViewBase */ async viewModelInit() { this.viewInstance = (this.staticProps?.modeldata) as IPSAppDEPickupView; await super.viewModelInit(); this.pickUpViewPanelInstance = ModelTool.findPSControlByType("PICKUPVIEWPANEL", this.viewInstance.getPSControls()); } /** * 渲染视图主体内容区 * * @memberof MPickUpViewBase */ renderMainContent() { return [this.renderBodyMessage(),
{this.renderControlContent()}
{this.isShowButton &&
{this.renderButtons()}
} {this.isShowButton &&
{this.renderMpickerSelect()}
}
, this.isShowButton && this.renderFooter(), ] } /** * 渲染视图底部按钮 * @memberof MPickUpViewBase */ renderFooter() { const { viewStyle } = this.viewInstance; const style2 = const defaultStyle = 0 ? false : true} on-click={(...params: any[]) => throttle(this.onClickOk, params, this)}>{this.containerModel?.view_okbtn?.text}    throttle(this.onClickCancel, params, this)}>{this.containerModel?.view_cancelbtn?.text} return viewStyle === 'STYLE2' ? style2 : defaultStyle; } /** * 渲染按钮 * * @memberof MPickUpViewBase */ renderButtons() { return
throttle(this.onCLickRight, params, this)}> throttle(this.onCLickLeft, params, this)}> throttle(this.onCLickAllRight, params, this)}> throttle(this.onCLickAllLeft, params, this)}>
} /** * 渲染多数据选择 * * @memberof MPickUpViewBase */ renderMpickerSelect() { return
{this.viewSelections.map((item: any, index: number) => { return
throttle(this.selectionsClick, [item], this)} on-dblclick={() => throttle(this.selectionsDBLClick, [item], this)}> {item.srfmajortext}
})}
} /** * 渲染选择视图面板 * * @memberof MPickUpViewBase */ renderControlContent() { let { targetCtrlName, targetCtrlParam, targetCtrlEvent } = this.computeTargetCtrlData(this.pickUpViewPanelInstance); return this.$createElement(targetCtrlName, { props: targetCtrlParam, ref: this.pickUpViewPanelInstance?.name, on: targetCtrlEvent }); } /** * 计算目标部件所需参数 * * @param {string} [controlType] * @returns * @memberof MPickUpViewBase */ computeTargetCtrlData(controlInstance: any) { const { targetCtrlName, targetCtrlParam, targetCtrlEvent } = super.computeTargetCtrlData(controlInstance); Object.assign(targetCtrlParam.dynamicProps, { selectedData: this.selectedData, }) Object.assign(targetCtrlParam.staticProps, { isSingleSelect: false, isShowButton: this.isShowButton, }) return { targetCtrlName, targetCtrlParam, targetCtrlEvent } } /** * 部件事件 * * @param controlname 部件名称 * @param action 行为 * @param data 数据 * * @memberof MPickUpViewBase */ onCtrlEvent(controlname: string, action: string, data: any) { if (action === 'load') { this.containerModel[`view_${controlname}`].datas = []; } super.onCtrlEvent(controlname, action, data); } /** * 是否显示按钮 * * @type {boolean} * @memberof MPickUpViewBase */ isShowButton: boolean = true; /** * 选中数据的字符串 * * @type {string} * @memberof MPickUpViewBase */ selectedData: string = ""; /** * 是否初始化已选中项 * * @type {any[]} * @memberof MPickUpViewBase */ isInitSelected: boolean = false; /** * 视图选中数据 * * @type {any[]} * @memberof MPickUpViewBase */ viewSelections: any[] = []; /** * 是否单选 * * @type {boolean} * @memberof MPickUpViewBase */ isSingleSelect: boolean = false; /** * 选中数据单击 * * @param {*} item * @memberof MPickUpViewBase */ selectionsClick(item: any): void { item._select = !item._select; const removeSelect: boolean = this.viewSelections.some((selection: any) => selection._select); this.containerModel.view_leftbtn.disabled = !removeSelect; } /** * 选中树双击 * * @param {*} item * @memberof MPickUpViewBase */ selectionsDBLClick(item: any): void { const index: number = this.viewSelections.findIndex((selection: any) => Object.is(selection.srfkey, item.srfkey)); if (index !== -1) { this.viewSelections.splice(index, 1); } const removeSelect: boolean = this.viewSelections.some((selection: any) => selection._select); this.containerModel.view_leftbtn.disabled = !removeSelect; this.selectedData = JSON.stringify(this.viewSelections); } /** * 删除右侧全部选中数据 * * @memberof MPickUpViewBase */ onCLickLeft(): void { const _selectiions = [...Util.deepCopy(this.viewSelections)]; _selectiions.forEach((item: any) => { if (!item._select) { return; } const index = this.viewSelections.findIndex((selection: any) => Object.is(item.srfkey, selection.srfkey)); if (index !== -1) { this.viewSelections.splice(index, 1); } }); const removeSelect: boolean = this.viewSelections.some((selection: any) => selection._select); this.containerModel.view_leftbtn.disabled = !removeSelect; this.selectedData = JSON.stringify(this.viewSelections); } /** * 添加左侧选中数据 * * @memberof MPickUpViewBase */ onCLickRight(): void { Object.values(this.containerModel).forEach((model: any) => { if (!Object.is(model.type, 'PICKUPVIEWPANEL')) { return; } let newSelections: any[] = []; model.selections.forEach((item: any) => { const index: number = this.viewSelections.findIndex((selection: any) => Object.is(item.srfkey, selection.srfkey)); if (index === -1) { let _item: any = { ...Util.deepCopy(item) }; Object.assign(_item, { _select: false }) newSelections.push(_item); } else { newSelections.push(this.viewSelections[index]); } }); this.viewSelections = this.removeDuplicates([...newSelections, ...this.viewSelections]); }); } /** * 去重 * * @memberof MPickUpViewBase */ removeDuplicates(data: any): Array { const uniqueSet = new Set(data); return [...uniqueSet]; } /** * 选中数据全部删除 * * @memberof MPickUpViewBase */ onCLickAllLeft(): void { if (this.Environment && this.Environment.isPreviewMode) { return; } this.viewSelections = []; this.containerModel.view_leftbtn.disabled = true; this.engine.onCtrlEvent('pickupviewpanel', 'selectionchange', []); this.selectedData = JSON.stringify(this.viewSelections); } /** * 添加左侧面板所有数据到右侧 * * @memberof MPickUpViewBase */ onCLickAllRight(): void { if (this.Environment && this.Environment.isPreviewMode) { return; } Object.values(this.containerModel).forEach((model: any) => { if (!Object.is(model.type, 'PICKUPVIEWPANEL')) { return; } if (model.datas.length > 0) { model.datas.forEach((data: any, index: any) => { if (!data.srfmajortext) { let fieldCodeName = this.appDeMajorFieldName.toLowerCase(); Object.assign(data, { srfmajortext: data[fieldCodeName] }); } }) } model.datas.forEach((item: any) => { const index: number = this.viewSelections.findIndex((selection: any) => Object.is(item.srfkey, selection.srfkey)); if (index === -1) { let _item: any = { ...Util.deepCopy(item) }; Object.assign(_item, { _select: false }) this.viewSelections.push(_item); } }); }); this.selectedData = JSON.stringify(this.viewSelections); } /** * 确定 * * @memberof MPickUpViewBase */ onClickOk(): void { this.$emit('view-event', { viewName: this.viewInstance?.name, action: 'viewdataschange', data: this.viewSelections }); this.$emit('view-event', { viewName: this.viewInstance?.name, action: 'close', data: null }); } /** * 取消 * * @memberof MPickUpViewBase */ onClickCancel(): void { this.$emit('view-event', { viewName: this.viewInstance?.name, action: 'viewdataschange', data: null }); this.$emit('view-event', { viewName: this.viewInstance?.name, action: 'close', data: null }); } }