import { ReactElement } from 'react'; import { ListColProps } from '..'; export type SortDirection = 'asc' | 'desc' | 'none'; export type SortOrder = SortDirection[]; export type Filter = { [K in keyof T]?: T[K][]; }; export type Sort = { [K in keyof T]?: Exclude; }; export interface PaginatedQuery { page: number; size: number; total: number; } export interface Query { filter?: Filter; sort?: Sort; } export type FilterValues = Filter[keyof T]; export type QueryType = keyof Query; export interface OnQuery { (payload: { dimension: keyof Row; value: Type extends 'sort' ? SortDirection : FilterValues; }): void; } export type OnSort = OnQuery; export type OnFilter = OnQuery; export type QueryChangeEvent = { type: 'filter'; payload: { dimension: keyof T; value: FilterValues; }; } | { type: 'sort'; payload: { dimension: keyof T; value: SortDirection; }; } | { type: 'reset'; payload?: never; }; export interface OnQueryChange { (change: QueryChangeEvent): void; } export type IdentifiableKeys = Extract; export type FilterOption = string | { text: string; value: string; }; export interface ColumnConfig { key: keyof T; /** * Whether this column's _data rows_ should also behave like a header. * This will cause the column to be sticky and slightly offset from the rest of the data. */ header?: string; type?: ListColProps['type']; size?: ListColProps['size']; render?: (row: T) => ReactElement | null; sortable?: boolean; filters?: string[]; options?: FilterOption[]; /** * Working with the `size` prop, will indicate that this field should expand to fill extra space. */ fill?: boolean; justify?: 'left' | 'right'; } interface RowChangePayload { rowId?: Id; toggle?: boolean; } export interface RowChange { (payload: RowChangePayload): void; } export interface RowStateChange { (change: { type: Types; payload: RowChangePayload; }): void; } export type SelectEvents = 'select' | 'select-all'; export type ExpandEvents = 'expand'; export interface ExpandRow { (props: { row: Row; onCollapse: () => void; }): React.ReactNode; } export interface DataListControls, Cols extends ColumnConfig[]> { id: string; idKey: IdKey; rows: Row[]; expanded?: Row[IdKey][]; selected?: Row[IdKey][]; columns: Cols; query?: Query; onQueryChange?: OnQueryChange; onRowSelect?: RowStateChange; onRowExpand?: RowStateChange; expandedContent?: ExpandRow; } export {};