Files
mayfly-go/mayfly_go_web/src/components/pagetable/index.ts
2023-07-01 21:24:07 +08:00

244 lines
5.6 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { dateFormat } from '@/common/utils/date';
import { getTextWidth } from '@/common/utils/string';
export class TableColumn {
/**
* 属性字段
*/
prop: string;
/**
* 显示表头
*/
label: string;
/**
* 是否自动计算宽度
*/
autoWidth: boolean = true;
/**
* 自动计算宽度时,累加该值(可能列值会进行转换添加图标等,宽度需要比计算出来的更宽些)
*/
addWidth: number = 0;
/**
* 最小宽度
*/
minWidth: number | string;
/**
* 是否插槽是的话插槽名则为prop属性名
*/
slot: boolean = false;
showOverflowTooltip: boolean = true;
sortable: boolean = false;
type: string;
width: number | string;
fixed: any;
align: string = "center"
/**
* 指定格式化函数对原始值进行格式化,如时间格式化等
* param1: data, param2: prop
*/
formatFunc: Function
/**
* 是否显示该列
*/
show: boolean = true
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 rowData[this.prop];
}
static new(prop: string, label: string): TableColumn {
return new TableColumn(prop, label)
}
setMinWidth(minWidth: number | string): TableColumn {
this.minWidth = minWidth
this.autoWidth = false;
return this;
}
setAddWidth(addWidth: number): TableColumn {
this.addWidth = addWidth
return this;
}
/**
* 标识该列为插槽
* @returns this
*/
isSlot(): TableColumn {
this.slot = true
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 dateFormat(data[prop])
})
return this;
}
fixedRight(): TableColumn {
this.fixed = "right";
return this;
}
fixedLeft(): TableColumn {
this.fixed = "left";
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 = 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;
};
}
export class TableQuery {
/**
* 属性字段
*/
prop: string;
/**
* 显示表头
*/
label: string;
/**
* 查询类型text、select、date
*/
type: string;
/**
* select可选值
*/
options: any;
/**
* 插槽名
*/
slot: string;
constructor(prop: string, label: string) {
this.prop = prop;
this.label = label;
}
static new(prop: string, label: string): TableQuery {
return new TableQuery(prop, label)
}
static text(prop: string, label: string): TableQuery {
const tq = new TableQuery(prop, label)
tq.type = 'text';
return tq;
}
static select(prop: string, label: string): TableQuery {
const tq = new TableQuery(prop, label)
tq.type = 'select';
return tq;
}
static date(prop: string, label: string): TableQuery {
const tq = new TableQuery(prop, label)
tq.type = 'date';
return tq;
}
static slot(prop: string, label: string, slotName: string): TableQuery {
const tq = new TableQuery(prop, label)
tq.slot = slotName;
return tq;
}
setOptions(options: any): TableQuery {
this.options = options;
return this
}
}