ivue-material-plus
Version:
A high quality UI components Library with Vue.js
366 lines (356 loc) • 8.13 kB
text/typescript
import type { VNode, ComponentInternalInstance, Ref, PropType } from 'vue';
import type { Table, TableRefs } from '../table/defaults';
import { oneOf } from '../../../utils/assist';
// 插槽内容 slots
type SlotsContent = { column: TableColumnCtx; $index: number };
type FilterMethods = (value, row: any, column: TableColumnCtx) => void;
// 数据过滤的选项
// 数组格式,数组中的元素需要有 text 和 value 属性。 数组中的每个元素都需要有 text 和 value 属性。
// array[{ text, value }]
type Filters = {
text: string;
value: string;
}[];
// 列参数
interface TableColumnCtx {
id: string;
prop: string;
label: string;
width: string | number;
minWidth: string | number;
children?: TableColumnCtx[];
isSubColumn: boolean;
type: string;
sortable: boolean | string;
property: string;
align: string;
headerAlign: string;
showOverflowTooltip: boolean;
filters: Filters;
filterMethod: FilterMethods;
filterPlacement: string;
filterOpened?: boolean;
index: number | ((index: number) => number);
rawColumnKey: string;
renderHeader: (data: SlotsContent) => VNode;
renderCell: (data: any) => void;
formatter: (
row: Record<string, any>,
column: TableColumnCtx,
cellValue,
index: number
) => VNode | string;
columnWidth: number;
className: string;
fixed: boolean | string;
getColumnIndex: () => number;
currentIndex: number;
level: number;
rowSpan: number;
colSpan: number;
order: string | null;
labelClassName: string;
columns: TableColumnCtx[];
resizable: boolean;
selectable: (row: any, index: number | string) => boolean;
reserveSelection: boolean;
sortOrders: ('ascending' | 'descending' | null)[];
sortBy: string | ((row: any, index: number) => string) | string[];
sortMethod: (a: any, b: any) => number;
columnKey: string;
filterable: boolean | FilterMethods | Filters;
filterMultiple: boolean;
filteredValue: string[];
}
// 列节点内容
interface TableColumn extends ComponentInternalInstance {
vnode: {
vParent: TableColumn | Table;
} & VNode;
vParent: TableColumn | Table;
columnId: string;
columnConfig: Ref<Partial<TableColumnCtx>>;
}
interface ColumnParent {
columnConfig?: Ref<Partial<TableColumnCtx>>;
tableId?: string;
vnode?: {
vParent?: TableColumn | Table;
} & VNode;
parent?: Table;
refs?: TableRefs;
columnId?: string;
}
export type { TableColumnCtx, TableColumn, ColumnParent };
export default {
/**
* 对应列的类型
*
* selection / index / expand
*
* @type {String}
*/
type: {
type: String,
validator(value: string | boolean) {
return oneOf(value, ['selection', 'index', 'expand', 'default']);
},
default: 'default',
},
/**
* 字段名称 对应列内容的字段名
*
* @type {String}
*/
prop: {
type: String,
},
/**
* column 的 key
*
* @type {String}
*/
label: {
type: String,
},
/**
* 对应列的宽度
*
* @type {String | Number}
*/
width: {
type: [String, Number],
default: '',
},
/**
* 对应列的最小宽度
*
* @type {String | Number}
*/
minWidth: {
type: [String, Number],
default: '',
},
/**
* 对应列是否可以排序
*
* @type {Boolean | String}
*/
sortable: {
type: [Boolean, String],
validator(value: string | boolean) {
return oneOf(value, ['custom', false, true]);
},
default: false,
},
/**
* 字段名称 对应列内容的字段名
*
* @type {String}
*/
property: {
type: String,
},
/**
* 对齐方式
*
* left / center / right
*
* @type {String}
*/
align: {
type: String,
validator(value: string | boolean) {
return oneOf(value, ['left', 'center', 'right']);
},
default: 'left',
},
/**
* 表头对齐方式
*
* left / center / right
*
* @type {String}
*/
headerAlign: {
type: String,
validator(value: string | boolean) {
return oneOf(value, ['left', 'center', 'right', '']);
},
default: '',
},
/**
* 当内容过长被隐藏时显示 tooltip
*
* @type {Boolean}
*/
showOverflowTooltip: {
type: Boolean,
default: false,
},
/**
* 数据过滤的选项
* 数组格式,数组中的元素需要有 text 和 value 属性
* 数组中的每个元素都需要有 text 和 value 属性。
*
* @type {Array}
*/
filters: {
type: Array as PropType<TableColumnCtx['filters']>,
},
/**
* 数据过滤使用的方法
* 如果是多选的筛选项
* 对每一条数据会执行多次
* 任意一次返回 true 就会显示。
*
* @type {Function}
*/
filterMethod: {
type: Function as PropType<TableColumnCtx['filterMethod']>,
},
/**
* 过滤弹出框的定位
*
* @type {String}
*/
filterPlacement: {
type: String,
default: 'bottom-start',
},
/**
* 如果设置了 type=index,可以通过传递 index 属性来自定义索引
*
* @type {Number, Function}
*/
index: {
type: [Number, Function] as PropType<TableColumnCtx['index']>,
},
/**
* 列标题 Label 区域渲染使用的 Function
*
* @type {Function}
*/
renderHeader: {
type: Function as PropType<TableColumnCtx['renderHeader']>,
},
/**
* 用来格式化内容
*
* @type {Function}
*/
formatter: {
type: Function as PropType<TableColumnCtx['formatter']>,
},
/**
* 列的 className
*
* @type {String}
*/
className: {
type: String,
},
/**
* 列是否固定在左侧或者右侧。
*
* @type {Boolean | String}
*/
fixed: {
type: [Boolean, String],
validator(value: string | boolean) {
return oneOf(value, ['left', 'right', true, false]);
},
},
/**
* 当前列标题的自定义类名
*
* @type {String}
*/
labelClassName: {
type: String,
},
/**
* 对应列是否可以通过拖动改变宽度(需要在设置 border 属性为真)
*
* @type {Boolean}
*/
resizable: {
type: Boolean,
default: true,
},
/**
* 仅对 type=selection 的列有效,
* 类型为 Function,
* Function 的返回值用来决定这一行的 CheckBox 是否可以勾选
*
* @type {Function}
*/
selectable: {
type: Function as PropType<TableColumnCtx['selectable']>,
},
/**
* 保存数据更新前选中的值
*
* @type {Boolean}
*/
reserveSelection: {
type: Boolean,
default: false,
},
/**
* 数据在排序时所使用排序策略的轮转顺序
*
* @type {Array}
*/
sortOrders: {
type: Array as PropType<TableColumnCtx['sortOrders']>,
default: () => {
return ['ascending', 'descending', null];
},
},
/**
* 没有指定数据按照哪个属性进行排序
*
* @type {String, Function, Array}
*/
sortBy: {
type: [String, Function, Array] as PropType<TableColumnCtx['sortBy']>,
},
/**
* 自定义排序方法
*
* @type {Function}
*/
sortMethod: {
type: Function as PropType<TableColumnCtx['sortMethod']>,
},
/**
* column 的 key, column 的 key
* 如果需要使用 filter-change 事件
* 则需要此属性标识是哪个 column 的筛选条件
*
* @type {String}
*/
columnKey: {
type: String,
},
/**
* 数据过滤的选项是否多选
*
* @type {Boolean}
*/
filterMultiple: {
type: Boolean,
default: true,
},
/**
* 选中的数据过滤项
* 如果需要自定义表头过滤的渲染方式
* 可能会需要此属性。
*
* @type {Array}
*/
filteredValue: {
type: Array as PropType<TableColumnCtx['filteredValue']>,
},
};