import { TemplateRef } from '@angular/core'; export interface GridColumnDef> { field: string; title: string; width?: number; sortable?: boolean; filterable?: boolean; groupable?: boolean; editable?: boolean; align?: 'left' | 'center' | 'right'; headerTemplate?: TemplateRef>; cellTemplate?: TemplateRef>; editCellTemplate?: TemplateRef>; footerTemplate?: TemplateRef>; aggregation?: 'sum' | 'avg' | 'count' | 'min' | 'max'; pinned?: 'left' | 'right' | null; hidden?: boolean; category?: string; mergeRows?: boolean; minWidth?: number; maxWidth?: number; columnType?: 'text' | 'number' | 'date' | 'boolean' | 'enum'; enumValues?: string[]; validators?: GridCellValidator[]; resizable?: boolean; lockPosition?: boolean; cellClass?: string | ((params: { value: unknown; row: T; }) => string); } export interface GridSortState { field: string; dir: 'asc' | 'desc'; } export interface GridFilterState { field: string; value: string; operator?: 'contains' | 'startsWith' | 'endsWith' | 'eq' | 'in'; selectedValues?: string[]; } export interface GridGroupState { field: string; dir?: 'asc' | 'desc'; } export interface GridPageChangeEvent { page: number; pageSize: number; } export interface GridSortChangeEvent { sort: GridSortState | null; } export interface GridFilterChangeEvent { filters: GridFilterState[]; } export interface GridGroupChangeEvent { group: GridGroupState | null; } export interface GridDataStateChangeEvent { page: number; pageSize: number; sort: GridSortState | null; filters: GridFilterState[]; group: GridGroupState | null; } export interface GridRowClickEvent> { row: T; index: number; } export interface GridRowUpdateEvent> { previous: T; updated: T; index: number; } export interface GridGroupResult> { key: string; value: unknown; field: string; count: number; items: T[]; subGroups?: GridGroupResult[]; level?: number; aggregates?: Record; } export interface GridHeaderTemplateContext> { $implicit: GridColumnDef; column: GridColumnDef; sort: GridSortState | null; filters: GridFilterState[]; isServerMode: boolean; } export interface GridCellTemplateContext> { $implicit: unknown; value: unknown; row: T; column: GridColumnDef; index: number; editing: boolean; draftValue?: unknown; updateDraft?: (val: unknown) => void; } export interface GridRowTemplateContext> { $implicit: T; row: T; index: number; editing: boolean; expanded: boolean; } export interface GridDetailTemplateContext> { $implicit: T; row: T; index: number; } export interface GridFooterTemplateContext> { $implicit: GridColumnDef; column: GridColumnDef; aggregationValue: string; data: T[]; } export interface GridCellValidator { type: 'required' | 'min' | 'max' | 'minLength' | 'maxLength' | 'pattern' | 'custom'; value?: unknown; message: string; validate?: (value: unknown, row: Record) => boolean; } export interface TreeDataConfig { childrenField: string; hasChildrenField?: string; levelField?: string; expandedByDefault?: boolean; } export interface FilterExpression { operator: 'AND' | 'OR'; conditions: (FilterCondition | FilterExpression)[]; } export interface FilterCondition { field: string; type: 'contains' | 'eq' | 'neq' | 'gt' | 'gte' | 'lt' | 'lte' | 'between' | 'startsWith' | 'endsWith' | 'in' | 'before' | 'after' | 'isTrue' | 'isFalse' | 'isEmpty' | 'isNotEmpty'; value: unknown; valueTo?: unknown; } export interface GridInfiniteScrollEvent { startRow: number; endRow: number; sortModel: GridSortState[]; filterModel: GridFilterState[]; groupModel: GridGroupState[]; } export interface GridCellValidationError { field: string; rowIndex: number; message: string; validator: GridCellValidator; } export interface GridEditChangeset> { added: T[]; updated: { previous: T; current: T; dirtyFields: string[]; }[]; deleted: T[]; } export interface GridStatusBarAggregates { count: number; sum: number | null; average: number | null; min: number | null; max: number | null; }