import * as React from 'react'; interface CustomEventLike { detail: T; } export interface FilteringOptions { filteringFunction?: (item: T, filteringText: string, filteringFields?: string[]) => boolean; fields?: string[]; } export interface SortingState { isDescending?: boolean; sortingColumn: SortingColumn; } export interface SortingColumn { sortingField?: string; sortingComparator?: (a: T, b: T) => number; } export interface SelectionChangeDetail { selectedItems: ReadonlyArray; } export type TrackBy = string | ((item: T) => string); export interface UseCollectionOptions { filtering?: FilteringOptions & { empty?: React.ReactNode; noMatch?: React.ReactNode; defaultFilteringText?: string; }; propertyFiltering?: { empty?: React.ReactNode; noMatch?: React.ReactNode; filteringProperties: readonly PropertyFilterProperty[]; filteringFunction?: (item: T, query: PropertyFilterQuery) => boolean; defaultQuery?: PropertyFilterQuery; freeTextFiltering?: PropertyFilterFreeTextFiltering; }; sorting?: { defaultState?: SortingState; }; pagination?: { defaultPage?: number; pageSize?: number; allowPageOutOfRange?: boolean; }; selection?: { defaultSelectedItems?: ReadonlyArray; keepSelection?: boolean; trackBy?: TrackBy; }; expandableRows?: ExpandableRowsProps; } export interface ExpandableRowsProps { getId(item: ItemType): string; getParentId(item: ItemType): null | string; defaultExpandedItems?: ReadonlyArray; } export interface CollectionState { filteringText: string; propertyFilteringQuery: PropertyFilterQuery; currentPageIndex: number; sortingState?: SortingState; selectedItems: ReadonlyArray; expandedItems: ReadonlyArray; } export interface CollectionActions { setFiltering(filteringText: string): void; setCurrentPage(pageNumber: number): void; setSorting(state: SortingState): void; setSelectedItems(selectedItems: ReadonlyArray): void; setPropertyFiltering(query: PropertyFilterQuery): void; setExpandedItems(items: ReadonlyArray): void; } interface UseCollectionResultBase { items: ReadonlyArray; allPageItems: ReadonlyArray; actions: CollectionActions; collectionProps: { empty?: React.ReactNode; onSortingChange?(event: CustomEventLike>): void; sortingColumn?: SortingColumn; sortingDescending?: boolean; selectedItems?: ReadonlyArray; onSelectionChange?(event: CustomEventLike>): void; expandableRows?: { getItemChildren: (item: T) => T[]; isItemExpandable: (item: T) => boolean; expandedItems: ReadonlyArray; onExpandableItemToggle(event: CustomEventLike<{ item: T; expanded: boolean; }>): void; }; trackBy?: string | ((item: T) => string); ref: React.RefObject; totalItemsCount: number; firstIndex: number; }; filterProps: { disabled?: boolean; filteringText: string; onChange(event: CustomEventLike<{ filteringText: string; }>): void; }; propertyFilterProps: { query: PropertyFilterQuery; onChange(event: CustomEventLike): void; filteringProperties: readonly PropertyFilterProperty[]; filteringOptions: readonly PropertyFilterOption[]; freeTextFiltering?: PropertyFilterFreeTextFiltering; }; paginationProps: { disabled?: boolean; currentPageIndex: number; onChange(event: CustomEventLike<{ currentPageIndex: number; }>): void; }; } export interface UseCollectionResult extends UseCollectionResultBase { filteredItemsCount: number | undefined; paginationProps: UseCollectionResultBase['paginationProps'] & { pagesCount: number; }; } export interface CollectionRef { scrollToTop: () => void; } export type PropertyFilterOperator = '<' | '<=' | '>' | '>=' | ':' | '!:' | '=' | '!=' | '^' | string; export interface PropertyFilterOperatorExtended { operator: PropertyFilterOperator; tokenType?: PropertyFilterTokenType; match?: PropertyFilterOperatorMatch; form?: PropertyFilterOperatorForm; format?: PropertyFilterOperatorFormat; } export type PropertyFilterTokenType = 'value' | 'enum'; export type PropertyFilterOperatorMatch = PropertyFilterOperatorMatchByType | PropertyFilterOperatorMatchCustom; export type PropertyFilterOperatorMatchByType = 'date' | 'datetime'; export type PropertyFilterOperatorMatchCustom = (itemValue: unknown, tokenValue: TokenValue) => boolean; export interface PropertyFilterOperatorFormProps { value: null | TokenValue; onChange: (value: null | TokenValue) => void; filter?: string; operator: PropertyFilterOperator; } export type PropertyFilterOperatorForm = React.FC>; export type PropertyFilterOperatorFormat = (value: TokenValue) => string; export type PropertyFilterOperation = 'and' | 'or'; export interface PropertyFilterToken { value: any; propertyKey?: string; operator: PropertyFilterOperator; } export interface PropertyFilterTokenGroup { operation: PropertyFilterOperation; tokens: readonly (PropertyFilterToken | PropertyFilterTokenGroup)[]; } export interface PropertyFilterQuery { tokens: readonly PropertyFilterToken[]; operation: PropertyFilterOperation; tokenGroups?: readonly (PropertyFilterToken | PropertyFilterTokenGroup)[]; } export interface PropertyFilterProperty { key: string; groupValuesLabel: string; propertyLabel: string; operators?: readonly (PropertyFilterOperator | PropertyFilterOperatorExtended)[]; defaultOperator?: PropertyFilterOperator; group?: string; } export interface PropertyFilterOption { propertyKey: string; value: string; label?: string; tags?: ReadonlyArray; filteringTags?: ReadonlyArray; } export interface PropertyFilterFreeTextFiltering { operators?: readonly PropertyFilterOperator[]; defaultOperator?: PropertyFilterOperator; } export {};