import { PropType } from 'vue' import { DefaultRow } from '../table/defaults' import { ComponentInternalInstance, Ref, VNode } from 'vue' import { Table } from '../table/defaults' type CI = { column: TableColumnCtx; $index: number; } type Filters = { text: string value: string }[] type FilterMethods = (value, row: T, column: TableColumnCtx) => void type ValueOf = T[keyof T] interface TableColumnCtx { id: string realWidth: number type: string label: string className: string labelClassName: string property: string prop: string width: string | number minWidth: string | number renderHeader: (data: CI) => VNode sortable: boolean | string sortMethod: (a: T, b: T) => number sortBy: string | ((row: T, index: number) => string) | string[] resizable: boolean columnKey: string rawColumnKey: string align: string headerAlign: string showTooltipWhenOverflow: boolean showOverflowTooltip: boolean fixed: boolean | string formatter: ( row: T, column: TableColumnCtx, cellValue, index: number, ) => VNode selectable: (row: T, index: number) => boolean reserveSelection: boolean filterMethod: FilterMethods filteredValue: string[] filters: Filters filterPlacement: string filterMultiple: boolean index: number | ((index: number) => number) sortOrders: ('ascending' | 'descending' | null)[] renderCell: (data: any) => void colSpan: number rowSpan: number children: TableColumnCtx[] level: number filterable: boolean | FilterMethods | Filters order: string isColumnGroup: boolean columns: TableColumnCtx[] getColumnIndex: () => number no: number } interface TableColumn extends ComponentInternalInstance { vnode: { vParent: TableColumn | Table } & VNode vParent: TableColumn | Table columnId: string columnConfig: Ref>> } export type { Filters, FilterMethods, TableColumnCtx, TableColumn, ValueOf } export default { type: { type: String, default: 'default', }, label: String, className: String, labelClassName: String, property: String, prop: String, width: { type: [String, Number], default: '', }, minWidth: { type: [String, Number], default: '', }, renderHeader: Function as PropType< TableColumnCtx['renderHeader'] >, sortable: { type: [Boolean, String], default: false, }, sortMethod: Function as PropType['sortMethod']>, sortBy: [String, Function, Array] as PropType< TableColumnCtx['sortBy'] >, resizable: { type: Boolean, default: true, }, columnKey: String, align: String, headerAlign: String, showTooltipWhenOverflow: Boolean, showOverflowTooltip: Boolean, fixed: [Boolean, String], formatter: Function as PropType['formatter']>, selectable: Function as PropType['selectable']>, reserveSelection: Boolean, filterMethod: Function as PropType< TableColumnCtx['filterMethod'] >, filteredValue: Array as PropType['filteredValue']>, filters: Array as PropType['filters']>, filterPlacement: String, filterMultiple: { type: Boolean, default: true, }, index: [Number, Function] as PropType['index']>, sortOrders: { type: Array as PropType['sortOrders']>, default: () => { return ['ascending', 'descending', null] }, validator: (val: TableColumnCtx['sortOrders']) => { return val.every( (order: string) => ['ascending', 'descending', null].indexOf(order) > -1, ) }, }, }