Files
mayfly-go/mayfly_go_web/src/components/pagetable/index.ts

252 lines
6.2 KiB
TypeScript
Raw Normal View History

import EnumValue from '@/common/Enum';
import { formatDate } from '@/common/utils/format';
import { getValueByPath } from '@/common/utils/object';
import { getTextWidth } from '@/common/utils/string';
export class TableColumn {
/**
*
*/
prop: string;
/**
*
*/
label: string;
/**
*
*/
autoWidth: boolean = true;
/**
*
*/
addWidth: number = 0;
/**
*
*/
minWidth: number | string;
/**
* slotName为空则插槽名为prop属性名
*/
2023-07-01 21:24:07 +08:00
slot: boolean = false;
/**
*
*/
slotName: string = '';
showOverflowTooltip: boolean = true;
sortable: boolean = false;
/**
* selection则显示多选框
* index 1
*
* tag类型tag进行展示
*
*/
type: string;
/**
* EnumValue值等
*/
typeParam: any;
width: number | string;
fixed: any;
align: string = 'left';
/**
*
* param1: data, param2: prop
*/
formatFunc: Function;
/**
*
*/
show: boolean = true;
/**
* json文本等
*/
isBeautify: boolean = false;
constructor(prop: string, label: string) {
this.prop = prop;
this.label = label;
}
/**
*
* @param rowData
* @returns
*/
getValueByData(rowData: any) {
if (this.formatFunc) {
return this.formatFunc(rowData, this.prop);
}
return getValueByPath(rowData, this.prop);
}
static new(prop: string, label: string): TableColumn {
return new TableColumn(prop, label);
}
2023-07-02 17:06:00 +08:00
noShowOverflowTooltip(): TableColumn {
this.showOverflowTooltip = false;
2023-07-02 17:06:00 +08:00
return this;
}
setMinWidth(minWidth: number | string): TableColumn {
this.minWidth = minWidth;
this.autoWidth = false;
return this;
}
setAddWidth(addWidth: number): TableColumn {
this.addWidth = addWidth;
return this;
}
/**
*
* @returns this
*/
alignCenter(): TableColumn {
this.align = 'center';
return this;
}
/**
* 使
* @param param , AccountStatusEnum
* @returns this
*/
typeTag(param: any): TableColumn {
this.type = 'tag';
this.typeParam = param;
return this;
}
typeText(): TableColumn {
this.type = 'text';
return this;
}
typeJson(): TableColumn {
this.type = 'jsonText';
return this;
}
2023-07-01 21:24:07 +08:00
/**
*
* @returns this
*/
isSlot(slotName: string = ''): TableColumn {
this.slot = true;
this.slotName = slotName;
return this;
}
/**
*
* @param func ( -> data: 该行对应的数据prop: 该列对应的prop属性值)
* @returns
*/
setFormatFunc(func: Function): TableColumn {
this.formatFunc = func;
return this;
}
/**
* 使
* @returns this
*/
isTime(): TableColumn {
this.setFormatFunc((data: any, prop: string) => {
return formatDate(getValueByPath(data, prop));
});
return this;
}
/**
*
* @returns this
*/
isEnum(enums: any): TableColumn {
this.setFormatFunc((data: any, prop: string) => {
return EnumValue.getLabelByValue(enums, getValueByPath(data, prop));
});
return this;
}
fixedRight(): TableColumn {
this.fixed = 'right';
return this;
}
fixedLeft(): TableColumn {
this.fixed = 'left';
return this;
}
canBeautify(): TableColumn {
this.isBeautify = true;
return this;
}
/**
*
* @param str
* @param tableData
* @param label label也参与宽度计算
* @returns
*/
autoCalculateMinWidth = (tableData: any) => {
const prop = this.prop;
const label = this.label;
if (!tableData || !tableData.length || tableData.length === 0 || tableData === undefined) {
return 0;
}
let maxWidthText = '';
let maxWidthValue;
// 为了兼容formatFunc格式化回调函数
let maxData;
// 获取该列中最长的数据(内容)
for (let i = 0; i < tableData.length; i++) {
let nowData = tableData[i];
let nowValue = getValueByPath(nowData, prop);
if (!nowValue) {
continue;
}
// 转为字符串比较长度
let nowText = nowValue + '';
if (nowText.length > maxWidthText.length) {
maxWidthText = nowText;
maxWidthValue = nowValue;
maxData = nowData;
}
}
if (this.formatFunc && maxWidthValue) {
maxWidthText = this.formatFunc(maxData, prop) + '';
}
// 需要加上表格的内间距等,视情况加
const contentWidth: number = getTextWidth(maxWidthText) + 30;
// 获取label的宽度取较大的宽度
const columnWidth: number = getTextWidth(label) + 60;
const flexWidth: number = contentWidth > columnWidth ? contentWidth : columnWidth;
// 设置上限与累加需要额外增加的宽度
this.minWidth = (flexWidth > 400 ? 400 : flexWidth) + this.addWidth;
};
}