import { Maybe, ObjectForExtending } from './utils.type'; import { ColumnDefaultOmitted } from './data-grid.type'; import { ColumnRowsGrouping } from '../feature-rows-grouping/types'; import { KeyText } from '../feature-key-text/types'; import { FilterComponentInPopoverProps } from '../feature-filtering/header-filter-button/types'; import { CellMouseEvent, RenderCellProps, RenderEditCellProps, RenderSummaryCellProps, SortColumn } from 'react-data-grid'; import { ComponentProps, ReactElement, ReactNode } from 'react'; import { TextFieldProps } from '../../TextField'; import { NumberFormat } from '../../NumberFormat'; import { Combobox } from '../../Combobox'; export type { CellMouseEvent, RenderCellProps, RenderEditCellProps, RenderSummaryCellProps, SortColumn, }; export type Comparator = (a: Row, b: Row) => number; type FilterCb = (filterV: Mode extends 'multiple' ? string[] : string, rowValue: string) => boolean; export type RenderSubRowCell = (renderCellProps: RenderCellProps, lvl: number) => ReactNode; export type RenderSubRowEditCell = (renderCellProps: RenderEditCellProps, lvl: number) => 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, 'value' | 'onChange' | 'onBlur' | 'ref' | 'size'>>; } | { component: 'select'; options: { type: 'constant'; options: SelectOptions[]; }; selectProps?: Partial, 'value' | 'onChange' | 'items' | 'ref' | 'size' | 'portal'>>; } | { component: 'select'; options: { type: 'stateInRowContext'; optionsKeyInRowContext: string; }; } | { component: RenderSubRowEditCell; }); export type CommonFormat = { alignContent?: 'right' | 'left' | 'center'; }; export type CustomFormat = CommonFormat & { customFormat: (value: string) => React.ReactNode; }; export type NumberFormatOptions = CommonFormat & { type: 'number'; decimalSeparator?: string; thousandSeparator?: string; minimumFractionDigits?: number; maximumFractionDigits?: number; useGrouping?: boolean; locales?: string | string[]; alignContent?: 'right' | 'left' | 'center'; }; export type ContentFormat = 'number' | CustomFormat | NumberFormatOptions; export type KeyTextColumnConfig = ((props: { keyText: KeyText; }) => ColumnConfig) | ColumnConfig; export type ColumnConfig = ColumnDefaultOmitted & { nameAsString?: 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; }; export type ColumnOrColumnGroupConfig = ColumnConfig | ColumnGroupConfig; export declare interface ColumnGroupConfig { readonly key: string; readonly name: string | ReactElement; readonly headerCellClass?: Maybe; readonly children: readonly ColumnOrColumnGroupConfig[]; }