export type ColumnType = { name: string; label?: string; hidden?: boolean; sort?: ((a: RowType, b: RowType) => number) | undefined; // eslint-disable-next-line @typescript-eslint/no-explicit-any render?: ({ value, row }: { value: any; row: T }) => React.ReactNode; headerRender?: HeaderRenderType; }; export type ColumnStateType = { name: string; label: string; hidden: boolean; sort?: ((a: RowType, b: RowType) => number) | undefined; sorted: { on: boolean; asc?: boolean; }; headerRender?: HeaderRenderType; }; export type HeaderRenderType = ({ label }: { label: React.ReactNode }) => React.ReactNode; // this is the type saved as state and returned export type HeaderType = { name: string; label?: string; hidden?: boolean; sorted: { on: boolean; asc?: boolean; }; sort?: ((a: RowType, b: RowType) => number) | undefined; render: () => React.ReactNode; }; // eslint-disable-next-line @typescript-eslint/no-explicit-any export type DataType = { [key: string]: any }; export type ColumnByNamesType = { [key: string]: ColumnType; }; export type RenderFunctionType = ({ value, row }: RenderFunctionArgsType) => React.ReactNode | undefined; type RenderFunctionArgsType = { // eslint-disable-next-line @typescript-eslint/no-explicit-any value: any; row: T; }; export type ColumnByNameType = Omit>, "name" | "sort">; export interface RowType { id: number; cells: CellType[]; hidden?: boolean; selected?: boolean; original: T; } export type CellType = { // eslint-disable-next-line @typescript-eslint/no-explicit-any value: any; render: () => React.ReactNode; }; export interface UseTableTypeParams { columns: ColumnType[]; data: T[]; options?: { sortable?: boolean; selectable?: boolean; filter?: (row: RowType[]) => RowType[]; filterOn?: boolean; }; } export interface UseTablePropsType { columns: ColumnType[]; data: T[]; options?: { sortable?: boolean; selectable?: boolean; filter?: (row: RowType[]) => RowType[]; }; } export interface UseTableOptionsType { sortable?: boolean; selectable?: boolean; pagination?: boolean; sortColumn?: string; filter?: (row: RowType[]) => RowType[]; } export interface UseTableReturnType { headers: HeaderType[]; originalRows: RowType[]; rows: RowType[]; selectedRows: RowType[]; dispatch: React.Dispatch>; toggleSort: (columnName: string, isAscOverride?: boolean) => void; selectRow: (id: number) => void; toggleAll: () => void; setSearchString: (searchString: string) => void; toggleAllState: boolean; pagination: PaginatorType; } type PaginatorType = { nextPage: () => void; prevPage: () => void; page: number; perPage: number; canNext: boolean; canPrev: boolean; }; export type TableState = { columnsByName: ColumnByNamesType; columns: ColumnStateType[]; rows: RowType[]; originalRows: RowType[]; selectedRows: RowType[]; filterOn: boolean; sortColumn: string | null | undefined; toggleAllState: boolean; pagination: PaginatorType; paginationEnabled: boolean; }; export type TableAction = | { type: "TOGGLE_SORT"; columnName: string; isAscOverride?: boolean } | { type: "SELECT_ROW"; rowId: number } | { type: "GLOBAL_FILTER"; filter: (row: RowType[]) => RowType[] } | { type: "SEARCH_STRING"; searchString: string } | { type: "GLOBAL_FILTER_OFF" } | { type: "SET_ROWS"; data: RowType[] } | { type: "NEXT_PAGE" } | { type: "PREV_PAGE" } | { type: "TOGGLE_ALL" };