ivue-material-plus
Version:
A high quality UI components Library with Vue.js
584 lines (560 loc) • 13.9 kB
text/typescript
import type {
ComponentInternalInstance,
VNode,
Ref,
PropType,
CSSProperties,
InjectionKey,
} from 'vue';
import { oneOf } from '../../../utils/assist';
import type { TableColumnCtx } from '../table-column/defaults';
import type { Store } from '../store/index';
import type TableLayout from '../table-layout';
// 列表行hover状态
type HoverState = NonNullable<{
cell: HTMLElement;
column: TableColumnCtx;
row: TableColumnCtx;
}>;
// 渲染可展开的按钮的内容
type RenderExpanded = ({ row, $index, store, expanded }: Column) => VNode;
// 列表行
type Column = {
row: TableColumnCtx;
$index: number;
store: Store;
expanded: boolean;
};
// 列表行样式
type ColumnCls =
| string
| ((data: { row: TableColumnCtx; rowIndex: number }) => string);
type ColumnStyle =
| CSSProperties
| ((data: { row: TableColumnCtx; rowIndex: number }) => CSSProperties);
// 自定义的合计计算方法
type SummaryMethod = (data: {
columns: TableColumnCtx[];
data: any[];
}) => string[];
// 设置表格单元、行和列的布局方式
type Layout = 'fixed' | 'auto';
type CellStyle =
| CSSProperties
| ((data: {
row: TableColumnCtx;
rowIndex: number;
column: TableColumnCtx;
columnIndex: number;
}) => CSSProperties);
type CellCls =
| string
| ((data: {
row: TableColumnCtx;
rowIndex: number;
column: TableColumnCtx;
columnIndex: number;
}) => string);
// refs
interface TableRefs {
tableWrapper?: HTMLElement;
headerWrapper?: HTMLElement;
footerWrapper?: HTMLElement;
fixedBodyWrapper?: HTMLElement;
rightFixedBodyWrapper?: HTMLElement;
bodyWrapper?: HTMLElement;
[key: string]: any;
}
// 树节点
interface TreeNode {
expanded?: boolean;
loading?: boolean;
noLazyChildren?: boolean;
indent?: number;
level?: number;
display?: boolean;
}
// 渲染行数据
interface RenderRowData {
treeNode?: TreeNode;
store: Store;
_self: Table;
expanded: boolean;
column: TableColumnCtx;
row: TableColumnCtx;
$index: number;
cellIndex: number;
}
// 表格状态
interface TableState {
isGroup: Ref<boolean>;
resizeState: Ref<{
width: null | number;
height: null | number;
}>;
updateLayout: () => void;
debouncedUpdateLayout: () => void;
}
// 过滤
interface Filter {
column: TableColumnCtx;
values: string[];
silent: boolean;
}
interface Sort {
prop: string;
order: 'ascending' | 'descending';
init?: boolean;
silent?: boolean;
}
// 表格 data
interface Table extends ComponentInternalInstance {
// onMounted 是否渲染完成
$ready?: boolean;
// 列表行hover状态
hoverState?: HoverState | null;
// 渲染可展开的按钮的内容
renderExpanded?: RenderExpanded;
// store
store?: Store;
// layout
layout?: TableLayout;
// refs
refs: TableRefs;
// id
tableId?: string;
// 行id
columnId?: string;
// 表格状态
state?: TableState;
}
// 表格 props
interface TableProps {
data: any[];
// 列的宽度是否自撑开
fit?: boolean;
// 是否带有纵向边框
border: boolean;
// Table 的最大高度。 合法的值为数字或者单位为 px 的高度。
maxHeight: string | number;
// 是否显示表头
showHeader?: boolean;
// 渲染嵌套数据的配置选项
// { hasChildren: 'hasChildren', children: 'children' }
treeProps?: {
hasChildren?: string;
children?: string;
};
// 行数据的 Key
rowKey?: string | ((row: TableColumnCtx) => string);
// 是否默认展开所有行,当 Table 包含展开行存在或者为树形表格时有效
defaultExpandAll?: boolean;
// 在多选表格中,当仅有部分行被选中时,点击表头的多选框时的行为。
// 若为 true,则选中所有行;若为 false,则取消选择所有行
selectOnIndeterminate?: boolean;
// 是否懒加载子节点数据
lazy?: boolean;
// 是否在表尾显示合计行
showSummary?: boolean;
// 设置表格单元、行和列的布局方式
tableLayout: Layout;
// Table 的高度 默认为自动高度
height?: string | number;
// 默认的排序列的 prop 和顺序。
// 它的 prop 属性指定默认的排序的列,order 指定默认排序的顺序
defaultSort?: Sort;
// 内容
context?: Table;
// 是否为斑马纹 table
stripe?: boolean;
// 行的 className 的回调方法,也可以使用字符串为所有行设置一个固定的 className。
rowClassName?: ColumnCls;
// 行的 style 的回调方法,也可以使用一个固定的 Object 为所有行设置一样的 Style
rowStyle?: ColumnStyle;
// 是否要高亮当前行
highlightCurrentRow?: boolean;
// 以通过该属性设置 Table 目前的展开行
expandRowKeys?: any[];
// 加载子节点数据的函数
load?: (
row: TableColumnCtx,
treeNode: TreeNode,
resolve: (data: any[]) => void
) => void;
// 合计行第一列的文本
sumText?: string;
// 自定义的合计计算方法
summaryMethod?: SummaryMethod;
// 合并行或列的计算方法
spanMethod?: (data: {
row: TableColumnCtx;
rowIndex: number;
column: TableColumnCtx;
columnIndex: number;
}) =>
| number[]
| {
rowspan: number;
colspan: number;
}
| undefined;
// 表头单元格的 style 的回调方法,也可以使用一个固定的 Object 为所有表头单元格设置一样的 Style
headerCellStyle?: CellStyle;
// 表头单元格的 className 的回调方法,也可以使用字符串为所有表头单元格设置一个固定的 className
headerCellClassName?: CellCls;
// 表头行的 style 的回调方法,也可以使用一个固定的 Object 为所有表头行设置一样的 Style
headerRowStyle?: ColumnStyle;
// 表头行的 className 的回调方法
headerRowClassName?: ColumnCls;
// 单元格的 style 的回调方法
cellStyle?: CellStyle;
// 单元格的 className 的回调方法
cellClassName?: CellCls;
// tooltip 主题
tooltipTheme?: 'dark' | 'light';
// tooltip点击是否阻止当前事件在捕获和冒泡阶段的进一步传播
tooltipStop?: boolean;
}
// 行样式
type rowClass =
| string
| ((data: { row: TableColumnCtx; rowIndex: number }) => string);
// 行的 style 的回调方法,也可以使用一个固定的 Object 为所有行设置一样的 Style。
type rowStyle =
| CSSProperties
| ((data: { row: TableColumnCtx; rowIndex: number }) => CSSProperties);
export const TableContextKey: InjectionKey<Table> = Symbol('ivue-table');
export default {
/**
* 显示的数据
*
* @type {Array}
*/
data: {
type: Array as PropType<TableColumnCtx[]>,
default: () => {
return [];
},
},
/**
* 列的宽度是否自撑开
*
* @type {Boolean}
*/
fit: {
type: Boolean,
default: true,
},
/**
* 是否带有纵向边框
*
* @type {Boolean}
*/
border: {
type: Boolean,
default: false,
},
/**
* Table 的高度, 默认为自动高度。
* 如果 height 为 number 类型,单位 px;
* 如果 height 为 string 类型,
* 则这个高度会设置为 Table 的 style.height 的值,
* Table 的高度会受控于外部样式。
*
* @type {String | Number}
*/
height: {
type: [String, Number],
default: null,
},
/**
* Table 的最大高度。 合法的值为数字或者单位为 px 的高度。
*
* @type {String, Number}
*/
maxHeight: {
type: [String, Number],
default: null,
},
/**
* 是否显示表头
*
* @type {Boolean}
*/
showHeader: {
type: Boolean,
default: true,
},
/**
* 渲染嵌套数据的配置选项
*
* { hasChildren: 'hasChildren', children: 'children' }
*
* @type {Object}
*/
treeProps: {
type: Object as PropType<TableProps['treeProps']>,
default: () => {
return {
hasChildren: 'hasChildren',
children: 'children',
};
},
},
/**
* 行数据的 Key
*
* @type {String, Function}
*/
rowKey: {
type: [String, Function] as PropType<TableProps['rowKey']>,
},
/**
* 是否默认展开所有行,当 Table 包含展开行存在或者为树形表格时有效
*
* @type {Boolean}
*/
defaultExpandAll: {
type: Boolean,
default: false,
},
/**
* 在多选表格中,当仅有部分行被选中时,点击表头的多选框时的行为。
* 若为 true,则选中所有行;若为 false,则取消选择所有行
*
* @type {Boolean}
*/
selectOnIndeterminate: {
type: Boolean,
default: true,
},
/**
* indent 展示树形数据时,树节点的缩进
*
* @type {Number}
*/
indent: {
type: Number,
default: 16,
},
/**
* 是否懒加载子节点数据
*
* @type {Boolean}
*/
lazy: {
type: Boolean,
default: false,
},
/**
* 是否在表尾显示合计行
*
* @type {Boolean}
*/
showSummary: {
type: Boolean,
default: false,
},
/**
* 设置表格单元、行和列的布局方式
*
* fixed / auto
*
* @type {String}
*/
tableLayout: {
type: String as PropType<Layout>,
validator(value: string) {
return oneOf(value, ['fixed', 'auto']);
},
default: 'fixed',
},
/**
* 默认的排序列的 prop 和顺序。
* 它的 prop 属性指定默认的排序的列,order 指定默认排序的顺序
*
* @type {object}
*/
defaultSort: {
type: Object as PropType<TableProps['defaultSort']>,
},
/**
* 提示
*
* @type {String}
*/
placeholder: {
type: String,
default: 'No Data',
},
/**
* 滚动条总是显示
*
* @type {Boolean}
*/
scrollbarAlways: {
type: Boolean,
default: false,
},
/**
* 是否为斑马纹 table
*
* @type {Boolean}
*/
stripe: {
type: Boolean,
default: false,
},
/**
* 行的 className 的回调方法,也可以使用字符串为所有行设置一个固定的 className。
*
* @type {String | Function}
*/
rowClassName: {
type: [String, Function] as PropType<TableProps['rowClassName']>,
},
/**
* 行的 style 的回调方法,也可以使用一个固定的 Object 为所有行设置一样的 Style。
*
* @type {Object, Function}
*/
rowStyle: {
type: [Object, Function] as PropType<TableProps['rowStyle']>,
},
/**
* 是否要高亮当前行
*
* @type {Boolean}
*/
highlightCurrentRow: {
type: Boolean,
default: false,
},
/**
* 可以通过该属性设置 Table 目前的展开行
*
* @type {Array}
*/
expandRowKeys: {
type: Array as PropType<TableProps['expandRowKeys']>,
},
/**
* 加载子节点数据的函数
*
* @type {Function}
*/
load: {
type: Function as PropType<TableProps['load']>,
},
/**
* 合计行第一列的文本
*
* @type {String}
*/
sumText: {
type: String,
default: '合计',
},
/**
* 自定义的合计计算方法
*
* @type {Function}
*/
summaryMethod: {
type: Function as PropType<TableProps['summaryMethod']>,
},
/**
* 合并行或列的计算方法
*
* @type {Function}
*/
spanMethod: {
type: Function as PropType<TableProps['spanMethod']>,
},
/**
* 表头单元格的 style 的回调方法,
* 也可以使用一个固定的 Object 为所有表头单元格设置一样的 Style
*
* @type {Object, Function}
*/
headerCellStyle: {
type: [Object, Function] as PropType<TableProps['headerCellStyle']>,
},
/**
* 表头单元格的 className 的回调方法,
* 也可以使用字符串为所有表头单元格设置一个固定的 className
*
* @type {String, Function}
*/
headerCellClassName: {
type: [String, Function] as PropType<TableProps['headerCellClassName']>,
},
/**
* 表头行的 style 的回调方法,
* 也可以使用一个固定的 Object 为所有表头行设置一样的 Style
*
* @type {Object, Function}
*/
headerRowStyle: {
type: [Object, Function] as PropType<TableProps['headerRowStyle']>,
},
/**
* 表头行的 className 的回调方法
*
* @type {String, Function}
*/
headerRowClassName: {
type: [String, Function] as PropType<TableProps['headerRowClassName']>,
},
/**
* 单元格的 style 的回调方法
*
* @type {Object, Function}
*/
cellStyle: {
type: [Object, Function] as PropType<TableProps['cellStyle']>,
},
/**
* 单元格的 className 的回调方法
*
* @type {String, Function}
*/
cellClassName: {
type: [String, Function] as PropType<TableProps['cellClassName']>,
},
/**
* tooltip主题
*
* @type {String}
*/
tooltipTheme: {
type: String as PropType<TableProps['tooltipTheme']>,
validator(value: string) {
return oneOf(value, ['dark', 'light']);
},
default: 'dark',
},
/**
* tooltip点击是否阻止当前事件在捕获和冒泡阶段的进一步传播
*
* @type {String}
*/
tooltipStop: {
type: Boolean,
default: false,
},
};
export type {
Table,
TableProps,
TreeNode,
RenderRowData,
Sort,
rowClass,
rowStyle,
ColumnCls,
Filter,
SummaryMethod,
TableRefs,
RenderExpanded,
};