import { throttle, Util } from '@ibizstudio/runtime';
import { PanelControlBase } from '../../../widgets';
import {
IPSDEViewPanel,
IPSPanel,
IPSPanelButton,
IPSPanelContainer,
IPSPanelControl,
IPSPanelItem,
IPSPanelRawItem,
IPSPanelTabPage,
IPSPanelTabPanel,
IPSSysCss,
IPSSysPanelField,
IPSUIAction,
} from '@ibizstudio/runtime';
import { Watch } from '../../../decorators';
/**
* 面板部件基类
*
* @export
* @class AppPanelBase
* @extends {PanelControlBase}
*/
export class AppPanelBase extends PanelControlBase {
/**
* 监听数据对象
*
* @memberof AppPanelBase
*/
@Watch('data', { deep: true })
onDataChange(newVal: any, oldVal: any) {
if (newVal) {
this.computeButtonState(newVal);
this.panelLogic({ name: '', newVal: null, oldVal: null });
this.$forceUpdate();
}
}
/**
* FLEX布局时类名映射
*
* @memberof AppPanelBase
*/
classObj: any = {
BUTTON: 'app-viewpanel-button',
FIELD: 'app-viewpanel-field',
RAWITEM: 'app-viewpanel-rowitem',
TABPAGE: 'app-viewpanel-tabpage',
TABPANEL: 'app-viewpanel-tabpanel',
};
/**
* 获取FLEX布局时类名
* @param item
*/
renderDetailClass(item: any) {
// 映射类名
let detailClass: any = this.classObj[item.itemType] || '';
detailClass += ` viewpanel-${item.itemType.toLowerCase()}-${item.name.toLowerCase()}`;
if (item?.getPSSysCss?.()) {
detailClass += ` ${item.getPSSysCss().cssName}`;
}
return detailClass;
}
/**
* 获取栅格布局的props
*
* @param {*} parent 父
* @param {*} child 子
* @returns {*}
* @memberof AppPanelBase
*/
getGridLayoutProps(parent: any, child: any): any {
let layout = parent?.getPSLayout().layout;
let { colXS, colSM, colMD, colLG, colXSOffset, colSMOffset, colMDOffset, colLGOffset } = child.getPSLayoutPos();
// 设置初始值
colXS = !colXS || colXS == -1 ? 24 : colXS;
colSM = !colSM || colSM == -1 ? 24 : colSM;
colMD = !colMD || colMD == -1 ? 24 : colMD;
colLG = !colLG || colLG == -1 ? 24 : colLG;
colXSOffset = !colXSOffset || colXSOffset == -1 ? 0 : colXSOffset;
colSMOffset = !colSMOffset || colSMOffset == -1 ? 0 : colSMOffset;
colMDOffset = !colMDOffset || colMDOffset == -1 ? 0 : colMDOffset;
colLGOffset = !colLGOffset || colLGOffset == -1 ? 0 : colLGOffset;
if (layout == 'TABLE_12COL') {
// 重新计算12列的栅格数值
colXS = Math.min(colXS * 2, 24);
colSM = Math.min(colSM * 2, 24);
colMD = Math.min(colMD * 2, 24);
colLG = Math.min(colXS * 2, 24);
// 重新计算12列的栅格偏移
let sign = (num: number) => (num == 0 ? 0 : num / Math.abs(num));
colXSOffset = sign(colXSOffset) * Math.min(colXSOffset * 2, 24);
colSMOffset = sign(colSMOffset) * Math.min(colSMOffset * 2, 24);
colMDOffset = sign(colMDOffset) * Math.min(colMDOffset * 2, 24);
colLGOffset = sign(colLGOffset) * Math.min(colLGOffset * 2, 24);
}
return {
xs: { span: colXS, offset: colXSOffset },
sm: { span: colSM, offset: colSMOffset },
md: { span: colMD, offset: colMDOffset },
lg: { span: colLG, offset: colLGOffset },
};
}
/**
* 绘制顶级面板成员集合
*
* @memberof AppPanelBase
*/
renderRootPSPanelItems(controlInstance: IPSPanel) {
return controlInstance.getRootPSPanelItems()?.map((container: any, index: number) => {
return this.renderByDetailType(container);
});
}
/**
* 根据detailType绘制对应detail
*
* @param {*} modelJson
* @memberof AppPanelBase
*/
renderByDetailType(modelJson: any) {
if (modelJson.getPSSysPFPlugin()) {
const pluginInstance: any = this.PluginFactory.getPluginInstance('CONTROLITEM', modelJson.getPSSysPFPlugin().pluginCode);
if (pluginInstance) {
return pluginInstance.renderCtrlItem(this.$createElement, modelJson, this, this.data);
}
} else {
switch (modelJson.itemType) {
case 'CONTAINER':
return this.renderContainer(modelJson);
case 'BUTTON':
return this.renderButton(modelJson);
case 'FIELD':
return this.renderField(modelJson);
case 'RAWITEM':
return this.renderRawitem(modelJson);
case 'TABPANEL':
return this.renderTabPanel(modelJson);
case 'TABPAGE':
return this.renderTabPage(modelJson);
case 'CONTROL':
return this.renderControl(modelJson);
}
}
}
/**
* 绘制面板Container
*
* @memberof AppPanelBase
*/
renderContainer(container: IPSPanelContainer) {
const panelItems: IPSPanelItem[] = container.getPSPanelItems() || [];
let layout = container.getPSLayout() as any;
let layoutMode = container.getPSLayout()?.layout;
let css = container.getPSSysCss() as IPSSysCss;
let containerClass = {
'app-viewpanel-container': true,
[`viewpanel-container-${container.name.toLowerCase()}`]: true,
'show-caption': container.showCaption,
};
if (css && css.cssName) {
Object.assign(containerClass, { [css.cssName]: true });
}
let containerStyle = {};
if (container.width) {
Object.assign(containerStyle, { width: container.width + 'px' });
}
if (container.height) {
Object.assign(containerStyle, { height: container.height + 'px' });
}
if (this.detailsModel[container.name] && !this.detailsModel[container.name].visible) {
Object.assign(containerStyle, { display: 'none' });
}
// FLEX布局
if (layout && layoutMode == 'FLEX') {
const containerGrow = (container.getPSLayoutPos() as any)?.grow;
Object.assign(containerStyle, {
overflow: 'auto',
display: 'flex',
'flex-grow': containerGrow && containerGrow != -1 ? containerGrow : 0,
});
const { dir, align, vAlign } = layout;
if (dir) {
Object.assign(containerStyle, { 'flex-direction': dir });
}
if (align) {
Object.assign(containerStyle, { 'justify-content': align });
}
if (vAlign) {
Object.assign(containerStyle, { 'align-items': vAlign });
}
return (
{caption}