import { throttle, LayoutTool, Util } from '@ibizstudio/runtime'; import { DashboardControlBase } from '../../../widgets'; import { IPSDBPortletPart, IPSLanguageRes } from '@ibizstudio/runtime'; /** * 数据看板部件基类 * * @export * @class AppDashboardBase * @extends {DashboardControlBase} */ export class AppDashboardBase extends DashboardControlBase { /** * 绘制门户部件内容 * * @param {IPSDBPortletPart} modelJson * @memberof AppDashboardBase */ renderPortletContent(modelJson: IPSDBPortletPart, index?: number) { if (!modelJson) { return; } if (modelJson.portletType == 'CONTAINER') { // 绘制门户部件(容器) const childPortlets = modelJson.getPSControls(); let cardClass = !childPortlets ? 'portlet-card' : 'portlet-card custom-card'; let cardPadding = childPortlets ? 0 : 10; let isShowTitle = !!(modelJson.showTitleBar && modelJson.title); const controlClassNames: any = { [Util.srfFilePath2(modelJson.codeName)]: true, }; if (modelJson.getPSSysCss?.()?.cssName) { Object.assign(controlClassNames, { [modelJson.getPSSysCss()?.cssName || '']: true }); } let labelCaption: any = this.$tl((modelJson.getTitlePSLanguageRes() as IPSLanguageRes)?.lanResTag, modelJson.title); return (
{isShowTitle && [

{labelCaption}

, , ]}
{this.renderPortlets(modelJson)}
); } else { let { targetCtrlName, targetCtrlParam, targetCtrlEvent } = this.computeTargetCtrlData(modelJson); Object.assign(targetCtrlParam.dynamicProps, { ...this.dynamicProps }); Object.assign(targetCtrlParam.staticProps, { ...this.staticProps }); // 绘制门户部件(非容器) return this.$createElement(targetCtrlName, { props: targetCtrlParam, ref: modelJson.name, on: targetCtrlEvent, }); } } /** * 绘制门户部件布局 * * @memberof AppDashboardBase */ renderPortlets(modelJson: any) { if (!modelJson) { return; } const layout = modelJson.getPSLayout?.()?.layout; if (!layout) { return this.renderPortletContent(modelJson); } // 栅格布局 if (layout == 'TABLE_24COL' || layout == 'TABLE_12COL') { return ( {modelJson.getPSControls?.()?.map((item: any, index: number) => { let attrs = LayoutTool.getGridOptions(item.getPSLayoutPos()); return {this.renderPortletContent(item, index)}; })} ); } // FLEX布局 if (layout == 'FLEX') { const flexStyle = LayoutTool.getFlexStyle(modelJson.getPSLayout?.()); return (
{modelJson.getPSControls?.()?.map((item: any, index: number) => { let detailStyle = LayoutTool.getFlexStyle2(item.getPSLayoutPos()); return
{this.renderPortletContent(item, index)}
; })}
); } } /** * 绘制静态布局内容 * * @returns * @memberof AppDashboardBase */ renderStaticDashboard(): any { return this.renderPortlets(this.controlInstance); } /** * 绘制自定义门户部件 * * @param {*} item * @returns * @memberof AppDashboardBase */ renderCustomPortlet(customModel: any) { let { targetCtrlName, targetCtrlParam, targetCtrlEvent } = this.computeTargetCtrlData(customModel.modelData); Object.assign(targetCtrlParam.dynamicProps, { isAdaptiveSize: true }); return this.$createElement(targetCtrlName, { key: Util.createUUID(), props: targetCtrlParam, ref: customModel.modelData.name, on: targetCtrlEvent, }); } /** * 绘制动态自定义布局内容 * * @returns * @memberof AppDashboardBase */ renderCustomizedDashboard(): any { return (
{this.customModelData.map((item: any, index: number) => { let itemStyle = { zIndex: 10, position: 'absolute', height: item.h * this.layoutRowH + 'px', width: `calc(100% / ${this.layoutColNum} * ${item.w})`, top: item.y * this.layoutRowH + 'px', left: `calc(100% / ${this.layoutColNum} * ${item.x})`, }; return (
{this.renderCustomPortlet(item)}
); })}
); } /** * 绘制内容 * * @returns * @memberof AppDashboardBase */ render(): any { if (!this.controlIsLoaded) { return null; } const { controlClassNames } = this.renderOptions; return (
{this.isEnableCustomized && ( throttle(this.handleClick, params, this)}> )} {this.dashboardType == 'default' && this.renderStaticDashboard()} {this.dashboardType == 'custom' && this.renderCustomizedDashboard()}
); } }