import type { CSSProperties, VNodeChild } from "vue"; import type { XySemanticClassNames, XySemanticStyles } from "../core"; export type XyTableKey = string; export type XyTableRecord = Record; export type XyTableSize = "lg" | "md" | "sm"; export type XyTableOrientation = "horizontal" | "vertical"; export type XyTableAlign = "center" | "left" | "right"; export type XyTableFixed = "left" | "right" | boolean; export type XyTableSortOrder = "ascend" | "descend" | null; export type XyTableRowKey = keyof T | string | ((record: T, index: number) => string); export interface XyTableFilterOption { label: string; value: string; } export interface XyTableColumn { align?: XyTableAlign; className?: string; dataIndex?: keyof T | string | Array; ellipsis?: boolean; fixed?: XyTableFixed; filteredValue?: string[]; filters?: XyTableFilterOption[]; key?: string; maxWidth?: number | string; minWidth?: number | string; render?: (value: unknown, record: T, index: number) => VNodeChild; resizable?: boolean; sorter?: boolean | ((a: T, b: T) => number); sortOrder?: XyTableSortOrder; style?: CSSProperties; title: string; width?: number | string; } export interface XyTableNormalizedColumn extends XyTableColumn { key: string; } export interface XyTableHeaderSlotProps { column: XyTableNormalizedColumn; index: number; title: string; } export interface XyTableCellSlotProps { column: XyTableNormalizedColumn; index: number; record: T; row: T; rowIndex: number; value: unknown; } export type XyTableSlots = { cell?: (props: XyTableCellSlotProps) => VNodeChild; empty?: () => VNodeChild; header?: (props: XyTableHeaderSlotProps) => VNodeChild; loading?: () => VNodeChild; } & Partial) => VNodeChild>> & Partial) => VNodeChild>> & Record; export interface XyTablePagination { current?: number; disabled?: boolean; hideOnSinglePage?: boolean; pageSize?: number; pageSizeOptions?: number[]; showQuickJumper?: boolean; showSizeChanger?: boolean; showTotal?: boolean | ((total: number, range: [number, number]) => string); simple?: boolean; size?: "md" | "sm"; total?: number; } export interface XyTableRowSelection { defaultSelectedRowKeys?: string[]; disabled?: boolean; getCheckboxProps?: (record: T) => { disabled?: boolean; }; onChange?: (selectedRowKeys: string[], selectedRows: T[]) => void; selectedRowKeys?: string[]; type?: "checkbox" | "radio"; } export interface XyTableVirtualOptions { enabled?: boolean; height?: number | string; overscan?: number; rowHeight?: number; } export interface XyTableTreeOptions { childrenColumnName?: string; defaultExpandedRowKeys?: string[]; expandedRowKeys?: string[]; expandOnRowClick?: boolean; indentSize?: number; rowExpandable?: (record: T) => boolean; } export interface XyTableResizableOptions { columns?: boolean; minColumnWidth?: number; minRowHeight?: number; rows?: boolean; } export interface XyTableScroll { x?: number | string; y?: number | string; } export interface XyTableSorterState { columnKey: string; order: Exclude; } export interface XyTableChangeEvent { currentDataSource: T[]; filters: Record; pagination: { current: number; pageSize: number; total: number; }; sorter: XyTableSorterState | null; } export type XyTableSemanticDom = "body" | "cell" | "container" | "empty" | "expander" | "header" | "headerCell" | "headerRow" | "loading" | "pagination" | "resizeHandle" | "root" | "row" | "selection" | "table" | "verticalLabel" | "verticalValue"; export interface XyTableSemanticProps { bordered: boolean; columnCount: number; empty: boolean; loading: boolean; orientation: XyTableOrientation; rowCount: number; size: XyTableSize; striped: boolean; virtual: boolean; } export type XyTableClassNames = XySemanticClassNames; export type XyTableStyles = XySemanticStyles;