import { ObjectForExtending } from './utils.type'; import { MergedCellsAlign } from './merged-cells.type'; import { ColumnDefaultOmitted } from './glide-type'; import { CtxsType } from './ctxs.type'; import { HeaderAlignment } from './columns-grouping.type'; import { CellActiveState, CellContent, CellHoverState, CellInfoGlideInstance, CellThemeOverrideResult, ContentFormat, EditingCellInfoGlideInstance, HeaderCellInfoGlideInstance, PreviewCellInfoGlideInstance } from '../TableGlideInstance/type'; import { SortColumn, SortDirection } from '../feature-sorting/types'; import { ColumnRowsGrouping } from '../feature-rows-grouping/types'; import { KeyText } from '../feature-key-text/types'; import { FilterComponentInPopoverProps } from '../feature-filtering/header-filter-button/types'; import { CellEditorComboboxProps, CellEditorNumberFormatProps, CellEditorTextAreaProps, ComboboxItemOption } from '../feature-edit/types'; import { ReactElement, ReactNode } from 'react'; export type { SortColumn, SortDirection }; export type HeaderCellInfo = Omit, 'column' | 'ctxs'> & { column: ColumnConfig; ctxs: CtxsType; }; export type CellInfo = Omit, 'column' | 'ctxs' | 'hovered' | 'active'> & { column: ColumnConfig; ctxs: CtxsType; hovered: CellHoverState; active: CellActiveState; }; export type { CellInfo as RenderCellProps }; export type EditingCellInfo = Omit, 'column'> & { column: ColumnConfig; }; export type PreviewCellInfo = Omit, 'column'> & { column: ColumnConfig; }; export type Comparator = (a: Row, b: Row) => number; type FilterCb = (filterV: Mode extends 'multiple' ? string[] : string, rowValue: string) => boolean; export type RenderSubRowCell = (renderCellProps: CellInfo, lvl: number) => CellContent; export type RenderRowCustomEditCell = (renderCellProps: EditingCellInfo, lvl: number, disableLeftOffset: boolean | undefined) => ReactNode; export type SelectOptions = { value: string | number; text: string | number; }; export type Editing = { error?: { value: (row: RowType, treeLevel: number) => boolean; }; editedSuccessfully?: { value: (row: RowType, treeLevel: number) => boolean; }; editable?: ((row: RowType) => boolean) | boolean; } & ({ component: 'inputString'; inputProps?: Partial>; } | { component: 'inputNumber'; inputProps?: Partial>; } | { component: 'select'; options: { type: 'constant'; options: SelectOptions[]; }; selectProps?: Partial, 'value' | 'onChange' | 'items' | 'ref' | 'size' | 'portal'>>; } | { component: 'select'; options: { type: 'stateInRowContext'; optionsKeyInRowContext: string; }; } | { component: RenderRowCustomEditCell; }); export type KeyTextColumnConfig = ((props: { keyText: KeyText; }) => ColumnConfig) | ColumnConfig; export type RenderCellPreview = 'none' | 'cellEditorAsPreview' | ((cellInfo: PreviewCellInfo) => ReactNode); export type ColumnConfig = ColumnDefaultOmitted & { renderCell?: (cellInfo: CellInfo) => CellContent; renderCellPreview?: RenderCellPreview; nameAsString?: string; copyData?: string | ((row: Row) => string); sortingType?: 'stringSort' | 'numberSort' | Comparator; searching?: { valueInRow: (row: Row) => string | number; }; filtering?: { keyInFilterState: string; valueInRow?: (row: Row) => string | number; } & ({ component: 'input'; filter: 'includes' | 'startWith' | 'equal' | FilterCb<'single'>; } | { component: 'select'; beforeList?: (props: FilterComponentInPopoverProps>) => ReactNode; afterList?: (props: FilterComponentInPopoverProps>) => ReactNode; filter: { typeOfValue: 'single'; filteringType?: FilterCb<'single'>; } | { typeOfValue: 'multiple'; filteringType?: FilterCb<'multiple'>; }; selectOptions: { type: 'constant'; options: SelectOptions[]; } | { type: 'stateInHeaderContext'; optionsKeyInHeaderContext: string; }; listMaxHeight?: string; } | { component: 'custom'; customRender: (props: FilterComponentInPopoverProps>) => ReactNode; filter?: (filterValue: unknown, rowValue: unknown) => boolean; compareWithClearedValue?: (clearedValue: unknown, currV: unknown) => boolean; }); contentFormat?: ContentFormat; editingCell?: Editing; subRow?: { isColumnWithArrow?: boolean | ((props: { keyText: KeyText; }) => boolean); hideHeaderExpandAllArrow?: boolean; parentKeyAsDefault?: boolean; contentFormat?: ContentFormat; renderSubRowCell?: RenderSubRowCell; } & ({ keyOfColumnInSubRow: string | number | ((lvl: number) => string | number); editingCell: Editing; } | { editingCell?: undefined; keyOfColumnInSubRow?: string | number | ((lvl: number) => string | number); }); rowsGrouping?: ColumnRowsGrouping>; keyText?: KeyTextColumnConfig; themeOverride?: (cellInfo: CellInfo, lvl: number) => CellThemeOverrideResult | undefined; squashedHeaderAlign?: HeaderAlignment; mergedCellsAlign?: MergedCellsAlign | ((row: Row) => MergedCellsAlign | undefined); }; export type ColumnOrColumnGroupConfig = ColumnConfig | ColumnGroupConfig; export declare interface ColumnGroupConfig { readonly key: string; readonly name: string | ReactElement; readonly children: readonly ColumnOrColumnGroupConfig[]; readonly squashedHeaderAlign?: HeaderAlignment; }