export class LayoutUtil { /** * 唯一实例 * * @private * @static * @memberof LayoutUtil */ private static readonly instance = new LayoutUtil(); /** * Creates an instance of LayoutUtil. * @memberof LayoutUtil */ private constructor() { } /** * 栅格布局模式 * * @type {('xs' | 'sm' | 'md' | 'lg')} * @memberof LayoutUtil */ gridLayoutMode: 'xs' | 'sm' | 'md' | 'lg' = 'lg'; /** * 计算栅格样式 * * @param {*} item * @param {*} pData * @param {boolean} [flex=false] * @return {*} {*} * @memberof LayoutUtil */ calcColClass(item: any, pData: any, flex = false): any { if (flex) { return {}; } // 计算栅格布局占位 const col = this.getGridCol(item, pData); const colClass: any = {}; if (col != null) { colClass[`ant-col-${col}`] = !flex; } // 计算栅格布局偏移 const offset = this.getGridOffset(item, pData); if (offset) { colClass[`ant-col-offset-${offset}`] = !flex; } return colClass; } /** * 计算项样式 * * @param {*} data * @param {*} pData * @param {boolean} [flex=false] 是否为flex布局模式 * @return {*} {*} * @memberof LayoutUtil */ formatStyle(data: any, pData: any, flex = false): any { const style: any = {}; if (data) { // 计算高度 if (Object.is(data.heightmode, "FULL")) { style.height = 'auto'; } else if (data.height) { style.height = data.height + (Object.is(data.heightmode, "PERCENTAGE") ? '%' : 'px'); } else { if (pData && Object.is(pData.itemtype, "PSSysViewPanel")) { if (Object.is(data.itemtype, "CONTAINER") || Object.is(data.itemtype, "CTRLPOS")) { style['flex-grow'] = 1; } } else { style.height = 'auto'; } } // 计算宽度 if (Object.is(data.widthmode, "FULL")) { style.width = 'auto'; } else if (data.width) { style.width = data.width + (Object.is(data.widthmode, "PERCENTAGE") ? '%' : 'px'); } // 计算对齐模式 if (flex) { if (data.flexgrow) { style['flex-grow'] = data.flexgrow; } if (pData && (!pData.flexdir || pData.flexdir.indexOf("row") != -1)) { Object.assign(style, this.getVerticalAlign(data, pData, flex)); } else { Object.assign(style, this.getHorizontalAlign(data, pData, flex)); } } else { Object.assign(style, this.getHorizontalAlign(data, pData, flex)); } // 换行模式 Object.assign(style, this.getSwapMode(data)); // 计算边距 Object.assign(style, this.getBorderStyle(data)); } return style; } /** * 获取换行模式 * * @param {*} data * @memberof LayoutUtil */ getSwapMode(data: any) { const style: any = {}; if (data.swapmode) { if (data.layoutmode == "FLEX") { if (data.swapmode == "NOWRAP") { style['flex-wrap'] = 'nowrap'; } else { style['flex-wrap'] = 'wrap'; } } else { if (data.swapmode == "NOWRAP") { style['white-space'] = 'nowrap'; } else { style['white-space'] = 'pre-wrap'; } } } return style } /** * 获取边框样式 * * @param {*} data * @memberof LayoutUtil */ getBorderStyle(data: any) { const style: any = {}; if (data.spacingleft) { if (data.spacingleft.indexOf('OUTER') != -1) { style['margin-left'] = this.getSpacingStyle(data.spacingleft.replace('OUTER', '')); } else { style['padding-left'] = this.getSpacingStyle(data.spacingleft.replace('INNER', '')); } } if (data.spacingright) { if (data.spacingright.indexOf('OUTER') != -1) { style['margin-right'] = this.getSpacingStyle(data.spacingright.replace('OUTER', '')); } else { style['padding-right'] = this.getSpacingStyle(data.spacingright.replace('INNER', '')); } } if (data.spacingtop) { if (data.spacingtop.indexOf('OUTER') != -1) { style['margin-top'] = this.getSpacingStyle(data.spacingtop.replace('OUTER', '')); } else { style['padding-top'] = this.getSpacingStyle(data.spacingtop.replace('INNER', '')); } } if (data.spacingbottom) { if (data.spacingbottom.indexOf('OUTER') != -1) { style['margin-bottom'] = this.getSpacingStyle(data.spacingbottom.replace('OUTER', '')); } else { style['padding-bottom'] = this.getSpacingStyle(data.spacingbottom.replace('INNER', '')); } } return style; } /** * 获取边距样式 * * @param {string} tag * @memberof LayoutUtil */ getSpacingStyle(tag: string) { let spacing = '0px'; switch (tag) { case 'NONE': spacing = '0px'; break; case 'SMALL': spacing = '8px'; break; case 'MEDIUM': spacing = '16px'; break; case 'LARGE': spacing = '24px'; break; default: spacing = '0px'; break; } return spacing; } /** * 获取水平对齐样式 * * @param {*} data * @param {*} pData * @param {boolean} [flex=false] * @return {*} * @memberof LayoutUtil */ getHorizontalAlign(data: any, pData: any, flex = false) { const style: any = {}; const horizontal = data.halignself || pData?.height; switch (horizontal) { case 'LEFT': if (flex) { style['align-self'] = 'flex-start'; } else { style['float'] = 'left'; } break; case 'RIGHT': if (flex) { style['align-self'] = 'flex-end'; } else { style['float'] = 'right'; } break; case 'CENTER': if (flex) { style['align-self'] = 'center'; } else { style['margin'] = 'auto'; style['float'] = 'none'; style['display'] = 'table'; } break; } return style; } /** * 获取垂直对齐样式 * * @param {*} data * @param {*} pData * @param {boolean} [flex=false] * @memberof LayoutUtil */ getVerticalAlign(data: any, pData: any, flex = false) { const style: any = {}; const vertical = data.valignself || pData?.valign; switch (vertical) { case 'TOP': if (flex) { style['align-self'] = 'flex-start'; } break; case 'BOTTOM': if (flex) { style['align-self'] = 'flex-end'; } break; case 'MIDDLE': if (flex) { style['align-self'] = 'center'; } break; } return style; } /** * 获取栅格布局值,不存在时从父数据获取 * * @param {*} data * @param {*} pData * @return {*} {(number | null)} * @memberof LayoutUtil */ getGridCol(data: any, pData: any): number | null { let val: string = data['col_' + this.gridLayoutMode]; if (pData && !val) { val = pData['child_col_' + this.gridLayoutMode]; } if (!val || val <= '0' || val > '24') { val = '24'; } if (val) { const num: number = parseInt(val); const layoutMode: string = data.layoutmode || pData?.layoutmode; if (Object.is(layoutMode, 'TABLE_12COL')) { if (num > 0 && num <= 12) { return num * 2; } } if (num > 0 && num <= 24) { return num; } } return null; } /** * 获取栅格布局值,不存在时从父数据获取 * * @param {*} data * @param {*} pData * @return {*} {(number | null)} * @memberof LayoutUtil */ getGridOffset(data: any, pData: any): number | null { let val: string = data['col_' + this.gridLayoutMode + '_os']; if (pData && !val) { val = pData['child_col_' + this.gridLayoutMode + '_os']; } if (val) { const num: number = parseInt(val); const layoutMode: string = data.layoutmode || pData?.layoutmode; if (Object.is(layoutMode, 'TABLE_12COL')) { if (num > 0 && num <= 12) { return num * 2; } } if (num > 0 && num <= 24) { return num; } } return null; } /** * 获取实例 * * @static * @return {*} {LayoutUtil} * @memberof LayoutUtil */ static getInstance(): LayoutUtil { return this.instance; } }