@trail-ui/react
Version:
118 lines (115 loc) • 3.84 kB
TypeScript
import { RowData, AccessorKeyColumnDef, ColumnSort, Cell, Table } from '@tanstack/react-table';
import { SortOrder } from './constants.js';
import { StylesConfig } from 'react-select';
import { PaginationProps } from '../pagination/pagination.js';
import 'react/jsx-runtime';
declare module '@tanstack/react-table' {
interface TableMeta<TData extends RowData> {
updateData: (rowIndex: string, columnId: string, value: unknown) => void;
}
}
type EditableTableColumnDef<TData> = Omit<AccessorKeyColumnDef<TData, any>, 'meta'> & {
meta?: ColumnMeta<TData>;
accessorKey: keyof TData | '';
};
type EditableTableProps<TData, IdType> = {
tableId?: string;
tableName: string;
data: TData[];
columns: EditableTableColumnDef<TData>[];
isLoading: boolean;
handleSaveData: (data: SaveData<TData, IdType>) => void;
idSelector: (data: TData) => IdType;
tableHeight?: string;
checkBoxSelectedName: string;
selectAllCheckBoxName?: string;
tableInstanceRef?: any;
setColumnFilters?: (value: any) => void;
hiddenColumnIds?: string[];
isCellDisabled?: (data: TData, column: EditableTableColumnDef<TData>['id']) => boolean;
serverPagination?: boolean;
totalCount?: number;
currentPage?: number;
onPageChange?: (page: number) => void;
currentPageSize?: number;
onPageSizeChange?: (limit: number) => void;
defaultSortingHeaders?: ColumnSort[];
handleSort?: (sortData: {
columnId: string;
order: SortOrder;
}) => void;
globalFilter?: string;
setGlobalFilter?: (value: any) => void;
paginationSizeOptions?: PaginationProps['sizeOptions'];
};
type EditableTableCellProps<TData, IdType> = {
cell: Cell<TData, unknown>;
rowHeaderId?: string;
checkBoxSelectedName?: string;
isCellDisabled?: EditableTableProps<TData, IdType>['isCellDisabled'];
};
interface SaveData<TData, IdType> {
rowId: IdType;
columnId: string;
accessorKey: keyof TData | '';
value: string | number | boolean;
}
type ColumnMeta<TData> = CheckBoxMetaData<TData> | LinkMetaData | MultiSelectMetaData | TextInputMetaData | SelectMetaData | SwitchMetaData<TData>;
interface CheckBoxMetaData<TData> {
type: 'checkbox';
label?: (data: TData) => string;
}
interface LinkMetaData {
type: 'link';
}
interface MultiSelectMetaData {
type: 'multiselect';
placeholder: string;
label: string;
options: {
label: string;
value: string | number;
}[];
customStyles: StylesConfig<MultiSelectMetaData['options'][0], true>;
}
interface TextInputMetaData {
type: 'text' | 'date' | 'number';
placeholder: string;
label: string;
step?: number;
}
interface SelectMetaData {
type: 'select';
placeholder: string;
label: string;
options: {
label: string;
value: string;
}[];
}
interface SwitchMetaData<TData> {
type: 'switch';
label?: (data: TData) => string;
activeText?: string;
inactiveText?: string;
}
interface Row<TData> {
getValue(columnId: string): unknown;
original: TData;
}
interface FocusData {
rowIndex: number;
columnIndex: number;
isHeader: boolean;
}
interface FocusHandlerContextType {
tableRef: React.RefObject<HTMLTableElement>;
focusedCell: FocusData;
setFocusedCell: (focusData: FocusData) => void;
}
interface TableContextType<TData, IdType> {
handleSaveData: EditableTableProps<TData, IdType>['handleSaveData'];
idSelector: EditableTableProps<TData, IdType>['idSelector'];
table: Table<TData>;
}
export { CheckBoxMetaData, ColumnMeta, EditableTableCellProps, EditableTableColumnDef, EditableTableProps, FocusData, FocusHandlerContextType, LinkMetaData, MultiSelectMetaData, Row, SaveData, SelectMetaData, SwitchMetaData, TableContextType, TextInputMetaData };