infi-grid 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +141 -0
- package/README.md +654 -0
- package/fesm2022/infi-grid.mjs +10314 -0
- package/fesm2022/infi-grid.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/components/cell-editor.component.d.ts +42 -0
- package/lib/components/filter-popup.component.d.ts +89 -0
- package/lib/components/filter-row.component.d.ts +104 -0
- package/lib/components/grid.component.d.ts +155 -0
- package/lib/components/header-row.component.d.ts +76 -0
- package/lib/components/row.component.d.ts +106 -0
- package/lib/components/summary-row.component.d.ts +40 -0
- package/lib/components/tooltip-controller.d.ts +43 -0
- package/lib/components/viewport.component.d.ts +217 -0
- package/lib/core/accessor.d.ts +6 -0
- package/lib/core/config-resolver.d.ts +16 -0
- package/lib/core/defaults.d.ts +7 -0
- package/lib/core/filter-engine.d.ts +44 -0
- package/lib/core/format.d.ts +11 -0
- package/lib/core/keys.d.ts +24 -0
- package/lib/core/row-ops.d.ts +20 -0
- package/lib/core/sort-engine.d.ts +11 -0
- package/lib/core/summary-engine.d.ts +35 -0
- package/lib/core/template-registry.d.ts +27 -0
- package/lib/core/theme.d.ts +2 -0
- package/lib/core/tooltip-position.d.ts +24 -0
- package/lib/core/values.d.ts +21 -0
- package/lib/core/virtual-math.d.ts +57 -0
- package/lib/directives/grid-template-component.d.ts +16 -0
- package/lib/directives/outlet.directive.d.ts +25 -0
- package/lib/directives/template.directives.d.ts +98 -0
- package/lib/grid.module.d.ts +15 -0
- package/lib/models/api.types.d.ts +249 -0
- package/lib/models/column.types.d.ts +184 -0
- package/lib/models/config.types.d.ts +390 -0
- package/lib/models/crud.types.d.ts +179 -0
- package/lib/models/data.types.d.ts +41 -0
- package/lib/models/events.types.d.ts +98 -0
- package/lib/models/filter.types.d.ts +78 -0
- package/lib/models/index.d.ts +12 -0
- package/lib/models/selection.types.d.ts +173 -0
- package/lib/models/sort.types.d.ts +22 -0
- package/lib/models/summary.types.d.ts +78 -0
- package/lib/models/template.types.d.ts +126 -0
- package/lib/models/tooltip.types.d.ts +48 -0
- package/lib/state/filter-popup.service.d.ts +30 -0
- package/lib/state/grid-api.d.ts +4 -0
- package/lib/state/grid-store.d.ts +584 -0
- package/lib/state/tooltip.service.d.ts +38 -0
- package/package.json +41 -0
- package/public-api.d.ts +8 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"infi-grid.mjs","sources":["../../../projects/infi-grid/src/lib/core/template-registry.ts","../../../projects/infi-grid/src/lib/directives/template.directives.ts","../../../projects/infi-grid/src/lib/directives/outlet.directive.ts","../../../projects/infi-grid/src/lib/models/filter.types.ts","../../../projects/infi-grid/src/lib/core/values.ts","../../../projects/infi-grid/src/lib/core/filter-engine.ts","../../../projects/infi-grid/src/lib/components/filter-popup.component.ts","../../../projects/infi-grid/src/lib/core/theme.ts","../../../projects/infi-grid/src/lib/core/accessor.ts","../../../projects/infi-grid/src/lib/core/defaults.ts","../../../projects/infi-grid/src/lib/core/format.ts","../../../projects/infi-grid/src/lib/core/config-resolver.ts","../../../projects/infi-grid/src/lib/core/keys.ts","../../../projects/infi-grid/src/lib/core/row-ops.ts","../../../projects/infi-grid/src/lib/core/sort-engine.ts","../../../projects/infi-grid/src/lib/core/summary-engine.ts","../../../projects/infi-grid/src/lib/state/grid-api.ts","../../../projects/infi-grid/src/lib/state/grid-store.ts","../../../projects/infi-grid/src/lib/state/filter-popup.service.ts","../../../projects/infi-grid/src/lib/core/tooltip-position.ts","../../../projects/infi-grid/src/lib/state/tooltip.service.ts","../../../projects/infi-grid/src/lib/core/virtual-math.ts","../../../projects/infi-grid/src/lib/components/tooltip-controller.ts","../../../projects/infi-grid/src/lib/components/filter-row.component.ts","../../../projects/infi-grid/src/lib/components/cell-editor.component.ts","../../../projects/infi-grid/src/lib/components/row.component.ts","../../../projects/infi-grid/src/lib/components/header-row.component.ts","../../../projects/infi-grid/src/lib/components/summary-row.component.ts","../../../projects/infi-grid/src/lib/components/viewport.component.ts","../../../projects/infi-grid/src/lib/components/grid.component.ts","../../../projects/infi-grid/src/lib/directives/grid-template-component.ts","../../../projects/infi-grid/src/lib/grid.module.ts","../../../projects/infi-grid/src/public-api.ts","../../../projects/infi-grid/src/infi-grid.ts"],"sourcesContent":["import type { GridDataType } from '../models/column.types';\nimport type { GridTemplate } from '../models/template.types';\n\n/** Templates declared with `<ng-template infiGrid…>` directives inside `<infi-grid>`. */\nexport interface TemplateRegistry {\n readonly display: TemplateGroup;\n readonly edit: TemplateGroup;\n readonly header: TemplateGroup;\n readonly summary: TemplateGroup;\n readonly cellTooltip: TemplateGroup;\n readonly headerTooltip: TemplateGroup;\n readonly loading: GridTemplate<any> | null;\n readonly empty: GridTemplate<any> | null;\n readonly error: GridTemplate<any> | null;\n}\n\nexport interface TemplateGroup {\n readonly byField: ReadonlyMap<string, GridTemplate<any>>;\n readonly byType: ReadonlyMap<GridDataType, GridTemplate<any>>;\n /** Directive without `field` or `type`: applies to every column. */\n readonly fallback: GridTemplate<any> | null;\n}\n\nconst EMPTY_GROUP: TemplateGroup = { byField: new Map(), byType: new Map(), fallback: null };\n\nexport const EMPTY_TEMPLATE_REGISTRY: TemplateRegistry = {\n display: EMPTY_GROUP,\n edit: EMPTY_GROUP,\n header: EMPTY_GROUP,\n summary: EMPTY_GROUP,\n cellTooltip: EMPTY_GROUP,\n headerTooltip: EMPTY_GROUP,\n loading: null,\n empty: null,\n error: null,\n};\n\nexport interface TemplateDirectiveLike {\n readonly template: GridTemplate<any>;\n readonly field: string | undefined;\n readonly type: GridDataType | undefined;\n}\n\nexport function buildTemplateGroup(directives: readonly TemplateDirectiveLike[]): TemplateGroup {\n if (directives.length === 0) return EMPTY_GROUP;\n const byField = new Map<string, GridTemplate<any>>();\n const byType = new Map<GridDataType, GridTemplate<any>>();\n let fallback: GridTemplate<any> | null = null;\n for (const d of directives) {\n if (d.field) byField.set(d.field, d.template);\n else if (d.type) byType.set(d.type, d.template);\n else fallback = d.template;\n }\n return { byField, byType, fallback };\n}\n","import { Directive, inject, input, TemplateRef } from '@angular/core';\nimport type { GridDataType } from '../models/column.types';\nimport type { GridHeaderTooltipContext, GridTooltipContext } from '../models/tooltip.types';\nimport type {\n GridCellContext,\n GridDeleteConfirmContext,\n GridEditContext,\n GridEmptyContext,\n GridErrorContext,\n GridHeaderContext,\n GridLoadingContext,\n GridSummaryCellContext,\n} from '../models/template.types';\n\n/**\n * Display-mode cell template.\n * `<ng-template infiGridCell=\"price\" let-value let-row=\"row\">…</ng-template>` targets one column;\n * `<ng-template infiGridCell type=\"date\" let-value>…</ng-template>` targets every date column.\n */\n@Directive({ selector: 'ng-template[infiGridCell]', standalone: true })\nexport class GridCellTemplateDirective<TRow = any, TValue = any> {\n readonly templateRef = inject<TemplateRef<GridCellContext<TRow, TValue>>>(TemplateRef);\n /** Column field. Leave empty and set `type` to target a data type. */\n readonly field = input<string | undefined>(undefined, { alias: 'infiGridCell' });\n readonly type = input<GridDataType | undefined>(undefined);\n\n static ngTemplateContextGuard<TRow, TValue>(\n _dir: GridCellTemplateDirective<TRow, TValue>,\n ctx: unknown,\n ): ctx is GridCellContext<TRow, TValue> {\n return true;\n }\n}\n\n/** Edit-mode cell template: `infiGridEdit=\"field\"` or `infiGridEdit type=\"number\"`. */\n@Directive({ selector: 'ng-template[infiGridEdit]', standalone: true })\nexport class GridEditTemplateDirective<TRow = any, TValue = any> {\n readonly templateRef = inject<TemplateRef<GridEditContext<TRow, TValue>>>(TemplateRef);\n readonly field = input<string | undefined>(undefined, { alias: 'infiGridEdit' });\n readonly type = input<GridDataType | undefined>(undefined);\n\n static ngTemplateContextGuard<TRow, TValue>(\n _dir: GridEditTemplateDirective<TRow, TValue>,\n ctx: unknown,\n ): ctx is GridEditContext<TRow, TValue> {\n return true;\n }\n}\n\n/** Header template: `infiGridHeader=\"field\"`, or without a field for every column. */\n@Directive({ selector: 'ng-template[infiGridHeader]', standalone: true })\nexport class GridHeaderTemplateDirective<TRow = any> {\n readonly templateRef = inject<TemplateRef<GridHeaderContext<TRow>>>(TemplateRef);\n readonly field = input<string | undefined>(undefined, { alias: 'infiGridHeader' });\n readonly type = input<GridDataType | undefined>(undefined);\n\n static ngTemplateContextGuard<TRow>(_dir: GridHeaderTemplateDirective<TRow>, ctx: unknown): ctx is GridHeaderContext<TRow> {\n return true;\n }\n}\n\n/** Summary cell template: `infiGridSummary=\"field\"`, or without a field for every column. */\n@Directive({ selector: 'ng-template[infiGridSummary]', standalone: true })\nexport class GridSummaryTemplateDirective<TRow = any> {\n readonly templateRef = inject<TemplateRef<GridSummaryCellContext<TRow>>>(TemplateRef);\n readonly field = input<string | undefined>(undefined, { alias: 'infiGridSummary' });\n readonly type = input<GridDataType | undefined>(undefined);\n\n static ngTemplateContextGuard<TRow>(_dir: GridSummaryTemplateDirective<TRow>, ctx: unknown): ctx is GridSummaryCellContext<TRow> {\n return true;\n }\n}\n\n/** Loading template: `<ng-template infiGridLoading>…</ng-template>`. */\n@Directive({ selector: 'ng-template[infiGridLoading]', standalone: true })\nexport class GridLoadingTemplateDirective<TRow = any> {\n readonly templateRef = inject<TemplateRef<GridLoadingContext<TRow>>>(TemplateRef);\n\n static ngTemplateContextGuard<TRow>(_dir: GridLoadingTemplateDirective<TRow>, ctx: unknown): ctx is GridLoadingContext<TRow> {\n return true;\n }\n}\n\n/** Empty-data (\"No Data Found\") template: `<ng-template infiGridEmpty let-reason>…</ng-template>`. */\n@Directive({ selector: 'ng-template[infiGridEmpty]', standalone: true })\nexport class GridEmptyTemplateDirective<TRow = any> {\n readonly templateRef = inject<TemplateRef<GridEmptyContext<TRow>>>(TemplateRef);\n\n static ngTemplateContextGuard<TRow>(_dir: GridEmptyTemplateDirective<TRow>, ctx: unknown): ctx is GridEmptyContext<TRow> {\n return true;\n }\n}\n\n/** Error template: `<ng-template infiGridError let-error>…</ng-template>`. */\n@Directive({ selector: 'ng-template[infiGridError]', standalone: true })\nexport class GridErrorTemplateDirective<TRow = any> {\n readonly templateRef = inject<TemplateRef<GridErrorContext<TRow>>>(TemplateRef);\n\n static ngTemplateContextGuard<TRow>(_dir: GridErrorTemplateDirective<TRow>, ctx: unknown): ctx is GridErrorContext<TRow> {\n return true;\n }\n}\n\n/**\n * Delete confirmation, replacing the built-in dialog:\n * `<ng-template infiGridDeleteConfirm let-count=\"count\" let-confirm=\"confirm\" let-cancel=\"cancel\">…</ng-template>`.\n */\n@Directive({ selector: 'ng-template[infiGridDeleteConfirm]', standalone: true })\nexport class GridDeleteConfirmTemplateDirective<TRow = any> {\n readonly templateRef = inject<TemplateRef<GridDeleteConfirmContext<TRow>>>(TemplateRef);\n\n static ngTemplateContextGuard<TRow>(\n _dir: GridDeleteConfirmTemplateDirective<TRow>,\n ctx: unknown,\n ): ctx is GridDeleteConfirmContext<TRow> {\n return true;\n }\n}\n\n/**\n * Cell tooltip template: `<ng-template infiGridCellTooltip=\"price\" let-value let-row=\"row\">…</ng-template>`\n * for one column, `type=\"date\"` for a data type, or no field for every column.\n */\n@Directive({ selector: 'ng-template[infiGridCellTooltip]', standalone: true })\nexport class GridCellTooltipTemplateDirective<TRow = any, TValue = any> {\n readonly templateRef = inject<TemplateRef<GridTooltipContext<TRow, TValue>>>(TemplateRef);\n readonly field = input<string | undefined>(undefined, { alias: 'infiGridCellTooltip' });\n readonly type = input<GridDataType | undefined>(undefined);\n\n static ngTemplateContextGuard<TRow, TValue>(\n _dir: GridCellTooltipTemplateDirective<TRow, TValue>,\n ctx: unknown,\n ): ctx is GridTooltipContext<TRow, TValue> {\n return true;\n }\n}\n\n/** Header tooltip template: `<ng-template infiGridHeaderTooltip=\"price\" let-column let-description=\"description\">…</ng-template>`. */\n@Directive({ selector: 'ng-template[infiGridHeaderTooltip]', standalone: true })\nexport class GridHeaderTooltipTemplateDirective<TRow = any> {\n readonly templateRef = inject<TemplateRef<GridHeaderTooltipContext<TRow>>>(TemplateRef);\n readonly field = input<string | undefined>(undefined, { alias: 'infiGridHeaderTooltip' });\n readonly type = input<GridDataType | undefined>(undefined);\n\n static ngTemplateContextGuard<TRow>(\n _dir: GridHeaderTooltipTemplateDirective<TRow>,\n ctx: unknown,\n ): ctx is GridHeaderTooltipContext<TRow> {\n return true;\n }\n}\n","import {\n ComponentRef,\n Directive,\n EmbeddedViewRef,\n Input,\n OnChanges,\n OnDestroy,\n reflectComponentType,\n TemplateRef,\n Type,\n ViewContainerRef,\n inject,\n} from '@angular/core';\nimport type { GridTemplate } from '../models/template.types';\n\nconst contextInputCache = new WeakMap<Type<unknown>, boolean>();\n\nfunction hasContextInput(type: Type<unknown>): boolean {\n let known = contextInputCache.get(type);\n if (known === undefined) {\n known = !!reflectComponentType(type)?.inputs.some((i) => i.templateName === 'context');\n contextInputCache.set(type, known);\n }\n return known;\n}\n\n/**\n * Renders a `TemplateRef` or a component with a context object.\n *\n * The view is created once and reused when rows are recycled during scrolling:\n * for templates the new context is copied into the existing view context (no re-creation,\n * no proxy); for components the `context` input is updated.\n */\n@Directive({ selector: '[infiGridOutlet]', standalone: true })\nexport class GridOutletDirective<C extends object = any> implements OnChanges, OnDestroy {\n // Decorator inputs on purpose: signal inputs would schedule an app-wide change detection\n // on every scroll frame in zone.js apps; see docs/GUIDE.md (\"Change detection\").\n @Input('infiGridOutlet') template: GridTemplate<C> | null = null;\n @Input('infiGridOutletContext') context: C | null = null;\n\n private readonly vcr = inject(ViewContainerRef);\n private viewRef: EmbeddedViewRef<C> | null = null;\n private componentRef: ComponentRef<unknown> | null = null;\n private rendered: GridTemplate<C> | null = null;\n\n ngOnChanges(): void {\n if (this.template !== this.rendered) {\n this.clear();\n this.rendered = this.template;\n this.create();\n } else {\n this.update();\n }\n }\n\n ngOnDestroy(): void {\n this.clear();\n }\n\n private create(): void {\n const template = this.template;\n if (!template || !this.context) return;\n if (template instanceof TemplateRef) {\n this.viewRef = this.vcr.createEmbeddedView(template, { ...this.context });\n } else {\n this.componentRef = this.vcr.createComponent(template);\n if (hasContextInput(template)) this.componentRef.setInput('context', this.context);\n }\n }\n\n private update(): void {\n const context = this.context;\n if (!context) return;\n if (this.viewRef) {\n Object.assign(this.viewRef.context, context);\n } else if (this.componentRef && this.rendered && !(this.rendered instanceof TemplateRef) && hasContextInput(this.rendered)) {\n this.componentRef.setInput('context', context);\n } else if (!this.viewRef && !this.componentRef) {\n this.create();\n }\n }\n\n private clear(): void {\n this.vcr.clear();\n this.viewRef = null;\n this.componentRef = null;\n }\n}\n","import type { GridDataType } from './column.types';\n\nexport type TextFilterOperator =\n | 'contains'\n | 'notContains'\n | 'equals'\n | 'notEquals'\n | 'startsWith'\n | 'endsWith'\n | 'empty'\n | 'notEmpty';\n\nexport type NumberFilterOperator =\n | 'equals'\n | 'notEquals'\n | 'greaterThan'\n | 'greaterThanOrEqual'\n | 'lessThan'\n | 'lessThanOrEqual'\n | 'between'\n | 'empty'\n | 'notEmpty';\n\nexport type DateFilterOperator =\n | 'equals'\n | 'notEquals'\n | 'before'\n | 'after'\n | 'onOrBefore'\n | 'onOrAfter'\n | 'between'\n | 'empty'\n | 'notEmpty';\n\nexport type BooleanFilterOperator = 'isTrue' | 'isFalse' | 'empty' | 'notEmpty';\n\n/** Built-in operators, or the `key` of a custom operator. */\nexport type FilterOperator =\n | TextFilterOperator\n | NumberFilterOperator\n | DateFilterOperator\n | BooleanFilterOperator\n | (string & {});\n\n/**\n * One condition, e.g. `{ operator: 'greaterThan', value: 100 }`.\n * Dates are given as `Date`, timestamp or `'YYYY-MM-DD'`. `between` uses `value` and `valueTo` (inclusive).\n */\nexport interface FilterCondition {\n operator: FilterOperator;\n value?: unknown;\n valueTo?: unknown;\n}\n\n/**\n * Filter for one column. A row passes when it matches the conditions (combined with `logic`)\n * AND its value is in `values` (the Excel-style checkbox list). Leave a part out to skip it.\n */\nexport interface ColumnFilterModel {\n conditions?: FilterCondition[];\n /** How `conditions` are combined. Default `'and'`. */\n logic?: 'and' | 'or';\n /**\n * Selected values from the checkbox list. `null`/`undefined` means \"all values\".\n * Blanks are represented by `null`; dates by `'YYYY-MM-DD'` strings.\n */\n values?: readonly unknown[] | null;\n}\n\n/** Filter state of the whole grid, keyed by column field. */\nexport type FilterModel = Readonly<Record<string, ColumnFilterModel>>;\n\n/** A developer-defined filter operator shown in the filter popup. */\nexport interface CustomFilterOperator<TRow = any> {\n /** Unique key stored in the filter model. */\n key: string;\n /** Label shown in the operator dropdown. */\n label: string;\n /** How many value inputs the operator needs. Default 1. */\n inputs?: 0 | 1 | 2;\n predicate: (cellValue: unknown, value: unknown, valueTo: unknown, row: TRow) => boolean;\n}\n\n/** Filter icon visibility: always shown, or only while hovering the header (always shown when a filter is active). */\nexport type FilterIconVisibility = 'always' | 'hover';\n\n/** Column-level filter configuration. Every property overrides the global `filtering` value. */\nexport interface ColumnFilterConfig<TRow = any> {\n showIcon?: boolean;\n iconVisibility?: FilterIconVisibility;\n /** Operators offered in the popup, in order. Defaults to all operators of the column type. */\n operators?: readonly FilterOperator[];\n /** Operator selected when the popup opens with no condition. */\n defaultOperator?: FilterOperator;\n customOperators?: readonly CustomFilterOperator<TRow>[];\n /** Show the Excel-style checkbox list of values. */\n valueList?: boolean;\n /** Show the condition section (operator + value). */\n conditions?: boolean;\n /** Maximum conditions in the popup (1 to 5). */\n maxConditions?: 1 | 2 | 3 | 4 | 5;\n caseSensitive?: boolean;\n /** Replace the built-in matching logic for this column. */\n predicate?: (row: TRow, model: ColumnFilterModel, cellValue: unknown) => boolean;\n}\n\n/** Column filter configuration after merging with the global configuration. */\nexport interface ResolvedColumnFilter<TRow = any> {\n readonly operators: readonly FilterOperator[];\n readonly defaultOperator: FilterOperator;\n readonly customOperators: readonly CustomFilterOperator<TRow>[];\n readonly valueList: boolean;\n readonly conditions: boolean;\n readonly maxConditions: number;\n readonly caseSensitive: boolean;\n readonly predicate: ((row: TRow, model: ColumnFilterModel, cellValue: unknown) => boolean) | null;\n}\n\n/** Operators offered for each data type (in popup order). */\nexport const FILTER_OPERATORS_BY_TYPE: Readonly<Record<GridDataType, readonly FilterOperator[]>> = {\n text: ['contains', 'notContains', 'equals', 'notEquals', 'startsWith', 'endsWith', 'empty', 'notEmpty'],\n number: [\n 'equals',\n 'notEquals',\n 'greaterThan',\n 'greaterThanOrEqual',\n 'lessThan',\n 'lessThanOrEqual',\n 'between',\n 'empty',\n 'notEmpty',\n ],\n date: ['equals', 'notEquals', 'before', 'after', 'onOrBefore', 'onOrAfter', 'between', 'empty', 'notEmpty'],\n boolean: ['isTrue', 'isFalse', 'empty', 'notEmpty'],\n};\n\n/** Number of value inputs each built-in operator needs. */\nexport const FILTER_OPERATOR_INPUTS: Readonly<Record<string, 0 | 1 | 2>> = {\n contains: 1,\n notContains: 1,\n equals: 1,\n notEquals: 1,\n startsWith: 1,\n endsWith: 1,\n greaterThan: 1,\n greaterThanOrEqual: 1,\n lessThan: 1,\n lessThanOrEqual: 1,\n before: 1,\n after: 1,\n onOrBefore: 1,\n onOrAfter: 1,\n between: 2,\n empty: 0,\n notEmpty: 0,\n isTrue: 0,\n isFalse: 0,\n};\n","/**\n * Value normalization shared by sorting, filtering, formatting and summaries.\n * Everything here is allocation-free on the hot path and never throws.\n */\n\nconst DATE_ONLY = /^(\\d{4})-(\\d{2})-(\\d{2})$/;\n\nexport function isBlank(value: unknown): boolean {\n if (value === null || value === undefined || value === '') return true;\n if (typeof value === 'number') return Number.isNaN(value);\n if (value instanceof Date) return Number.isNaN(value.getTime());\n return false;\n}\n\n/** Number or null. Booleans become 1/0, dates their timestamp. */\nexport function toNumber(value: unknown): number | null {\n if (typeof value === 'number') return Number.isNaN(value) ? null : value;\n if (value === null || value === undefined || value === '') return null;\n if (typeof value === 'boolean') return value ? 1 : 0;\n if (value instanceof Date) {\n const t = value.getTime();\n return Number.isNaN(t) ? null : t;\n }\n if (typeof value === 'string' && value.trim() === '') return null;\n const n = Number(value);\n return Number.isNaN(n) ? null : n;\n}\n\n/** Timestamp (ms) or null. `'YYYY-MM-DD'` strings are read as local dates. */\nexport function toTimestamp(value: unknown): number | null {\n if (value === null || value === undefined || value === '') return null;\n if (value instanceof Date) {\n const t = value.getTime();\n return Number.isNaN(t) ? null : t;\n }\n if (typeof value === 'number') return Number.isFinite(value) ? value : null;\n if (typeof value === 'string') {\n const m = DATE_ONLY.exec(value);\n if (m) return new Date(Number(m[1]), Number(m[2]) - 1, Number(m[3])).getTime();\n const t = Date.parse(value);\n return Number.isNaN(t) ? null : t;\n }\n return null;\n}\n\n/** true / false / null. Accepts booleans, 1/0 and 'true'/'false'/'yes'/'no'. */\nexport function toBoolean(value: unknown): boolean | null {\n if (typeof value === 'boolean') return value;\n if (value === null || value === undefined || value === '') return null;\n if (typeof value === 'number') return Number.isNaN(value) ? null : value !== 0;\n if (typeof value === 'string') {\n const s = value.trim().toLowerCase();\n if (s === 'true' || s === '1' || s === 'yes' || s === 'y') return true;\n if (s === 'false' || s === '0' || s === 'no' || s === 'n') return false;\n return null;\n }\n return Boolean(value);\n}\n\n/** Local calendar day as a sortable number: 2024-05-01 → 20240501. */\nexport function dayNumber(timestamp: number): number {\n const d = new Date(timestamp);\n return d.getFullYear() * 10000 + (d.getMonth() + 1) * 100 + d.getDate();\n}\n\n/** Local calendar day as `'YYYY-MM-DD'`. */\nexport function dayKey(timestamp: number): string {\n const d = new Date(timestamp);\n const m = d.getMonth() + 1;\n const day = d.getDate();\n return `${d.getFullYear()}-${m < 10 ? '0' : ''}${m}-${day < 10 ? '0' : ''}${day}`;\n}\n\n/** Timestamp of local midnight for a `'YYYY-MM-DD'` key. */\nexport function dayKeyToTimestamp(key: string): number | null {\n const m = DATE_ONLY.exec(key);\n return m ? new Date(Number(m[1]), Number(m[2]) - 1, Number(m[3])).getTime() : null;\n}\n\n/** Relative float comparison so that computed values like 0.1 + 0.2 equal 0.3. */\nexport function numbersEqual(a: number, b: number): boolean {\n if (a === b) return true;\n return Math.abs(a - b) <= 1e-9 * Math.max(1, Math.abs(a), Math.abs(b));\n}\n\nconst collators = new Map<string, Intl.Collator>();\n\n/** Cached, case-insensitive, number-aware collator (\"item 2\" < \"item 10\"). */\nexport function getCollator(locale: string | undefined): Intl.Collator {\n const key = locale ?? '';\n let collator = collators.get(key);\n if (!collator) {\n collator = new Intl.Collator(locale, { numeric: true, sensitivity: 'base' });\n collators.set(key, collator);\n }\n return collator;\n}\n","import type { GridDataType, ResolvedColumn } from '../models/column.types';\nimport {\n FILTER_OPERATOR_INPUTS,\n type ColumnFilterModel,\n type FilterCondition,\n type FilterModel,\n} from '../models/filter.types';\nimport {\n dayKey,\n dayKeyToTimestamp,\n dayNumber,\n getCollator,\n isBlank,\n numbersEqual,\n toBoolean,\n toNumber,\n toTimestamp,\n} from './values';\n\nexport type RowPredicate<TRow> = (row: TRow) => boolean;\ntype ValuePredicate = (value: unknown, row: any) => boolean;\n\n/** True when the model would remove rows. */\nexport function isColumnFilterActive(model: ColumnFilterModel | null | undefined): boolean {\n if (!model) return false;\n if (Array.isArray(model.values)) return true;\n return (model.conditions ?? []).some((c) => c && typeof c.operator === 'string' && c.operator !== '');\n}\n\n/** Removes inactive column entries. */\nexport function normalizeFilterModel(model: FilterModel | null | undefined): FilterModel {\n const out: Record<string, ColumnFilterModel> = {};\n if (!model) return out;\n for (const field of Object.keys(model)) {\n const m = model[field];\n if (isColumnFilterActive(m)) out[field] = m;\n }\n return out;\n}\n\n/**\n * Key used by the Excel-style value list: text → string, number → number,\n * date → `'YYYY-MM-DD'`, boolean → true/false. Blanks → `null`.\n */\nexport function valueKey(value: unknown, type: GridDataType): string | number | boolean | null {\n switch (type) {\n case 'number':\n return toNumber(value);\n case 'date': {\n const t = toTimestamp(value);\n return t === null ? null : dayKey(t);\n }\n case 'boolean':\n return toBoolean(value);\n default:\n return isBlank(value) ? null : String(value);\n }\n}\n\nfunction hasInput(value: unknown): boolean {\n return !(value === null || value === undefined || (typeof value === 'string' && value.trim() === ''));\n}\n\nfunction textCondition(cond: FilterCondition, caseSensitive: boolean): ValuePredicate | null {\n const op = cond.operator;\n const isEmpty = (v: unknown) => isBlank(v) || String(v).trim() === '';\n if (op === 'empty') return (v) => isEmpty(v);\n if (op === 'notEmpty') return (v) => !isEmpty(v);\n if (!hasInput(cond.value)) return null;\n const norm = caseSensitive ? (s: string) => s : (s: string) => s.toLowerCase();\n const needle = norm(String(cond.value));\n const text = (v: unknown) => (v == null ? '' : norm(typeof v === 'string' ? v : String(v)));\n switch (op) {\n case 'contains':\n return (v) => text(v).includes(needle);\n case 'notContains':\n return (v) => !text(v).includes(needle);\n case 'equals':\n return (v) => text(v) === needle;\n case 'notEquals':\n return (v) => text(v) !== needle;\n case 'startsWith':\n return (v) => text(v).startsWith(needle);\n case 'endsWith':\n return (v) => text(v).endsWith(needle);\n default:\n return null;\n }\n}\n\nfunction numberCondition(cond: FilterCondition): ValuePredicate | null {\n const op = cond.operator;\n if (op === 'empty') return (v) => toNumber(v) === null;\n if (op === 'notEmpty') return (v) => toNumber(v) !== null;\n const a = hasInput(cond.value) ? toNumber(cond.value) : null;\n const b = hasInput(cond.valueTo) ? toNumber(cond.valueTo) : null;\n if (op === 'between') {\n if (a === null && b === null) return null;\n const lo = a !== null && b !== null ? Math.min(a, b) : a;\n const hi = a !== null && b !== null ? Math.max(a, b) : b;\n return (v) => {\n const n = toNumber(v);\n return n !== null && (lo === null || n >= lo) && (hi === null || n <= hi);\n };\n }\n if (a === null) return null;\n switch (op) {\n case 'equals':\n return (v) => {\n const n = toNumber(v);\n return n !== null && numbersEqual(n, a);\n };\n case 'notEquals':\n return (v) => {\n const n = toNumber(v);\n return n === null || !numbersEqual(n, a);\n };\n // Comparisons use the same float tolerance as `equals`, so 0.1 + 0.2 is not \"greater than\" 0.3.\n case 'greaterThan':\n return (v) => {\n const n = toNumber(v);\n return n !== null && n > a && !numbersEqual(n, a);\n };\n case 'greaterThanOrEqual':\n return (v) => {\n const n = toNumber(v);\n return n !== null && (n >= a || numbersEqual(n, a));\n };\n case 'lessThan':\n return (v) => {\n const n = toNumber(v);\n return n !== null && n < a && !numbersEqual(n, a);\n };\n case 'lessThanOrEqual':\n return (v) => {\n const n = toNumber(v);\n return n !== null && (n <= a || numbersEqual(n, a));\n };\n default:\n return null;\n }\n}\n\nfunction toDay(value: unknown): number | null {\n const t = toTimestamp(value);\n return t === null ? null : dayNumber(t);\n}\n\nfunction dateCondition(cond: FilterCondition): ValuePredicate | null {\n const op = cond.operator;\n if (op === 'empty') return (v) => toTimestamp(v) === null;\n if (op === 'notEmpty') return (v) => toTimestamp(v) !== null;\n const a = hasInput(cond.value) ? toDay(cond.value) : null;\n const b = hasInput(cond.valueTo) ? toDay(cond.valueTo) : null;\n if (op === 'between') {\n if (a === null && b === null) return null;\n const lo = a !== null && b !== null ? Math.min(a, b) : a;\n const hi = a !== null && b !== null ? Math.max(a, b) : b;\n return (v) => {\n const d = toDay(v);\n return d !== null && (lo === null || d >= lo) && (hi === null || d <= hi);\n };\n }\n if (a === null) return null;\n switch (op) {\n case 'equals':\n return (v) => toDay(v) === a;\n case 'notEquals':\n return (v) => toDay(v) !== a;\n case 'before':\n return (v) => {\n const d = toDay(v);\n return d !== null && d < a;\n };\n case 'after':\n return (v) => {\n const d = toDay(v);\n return d !== null && d > a;\n };\n case 'onOrBefore':\n return (v) => {\n const d = toDay(v);\n return d !== null && d <= a;\n };\n case 'onOrAfter':\n return (v) => {\n const d = toDay(v);\n return d !== null && d >= a;\n };\n default:\n return null;\n }\n}\n\nfunction booleanCondition(cond: FilterCondition): ValuePredicate | null {\n switch (cond.operator) {\n case 'isTrue':\n return (v) => toBoolean(v) === true;\n case 'isFalse':\n return (v) => toBoolean(v) === false;\n case 'empty':\n return (v) => toBoolean(v) === null;\n case 'notEmpty':\n return (v) => toBoolean(v) !== null;\n case 'equals': {\n const target = toBoolean(cond.value);\n return target === null ? null : (v) => toBoolean(v) === target;\n }\n default:\n return null;\n }\n}\n\n/** Compiles one condition; `null` means the condition is incomplete and is ignored. */\nexport function compileCondition<TRow>(column: ResolvedColumn<TRow>, cond: FilterCondition): ValuePredicate | null {\n if (!cond || typeof cond.operator !== 'string') return null;\n const custom = column.filter.customOperators.find((o) => o.key === cond.operator);\n if (custom) {\n const inputs = custom.inputs ?? 1;\n if (inputs >= 1 && !hasInput(cond.value)) return null;\n return (v, row) => custom.predicate(v, cond.value, cond.valueTo, row);\n }\n if (!(cond.operator in FILTER_OPERATOR_INPUTS)) return null;\n switch (column.type) {\n case 'number':\n return numberCondition(cond);\n case 'date':\n return dateCondition(cond);\n case 'boolean':\n return booleanCondition(cond);\n default:\n return textCondition(cond, column.filter.caseSensitive);\n }\n}\n\n/** Compiles the filter of one column into a row predicate, or `null` when it removes nothing. */\nexport function compileColumnFilter<TRow>(\n column: ResolvedColumn<TRow>,\n model: ColumnFilterModel,\n): RowPredicate<TRow> | null {\n if (!isColumnFilterActive(model)) return null;\n const get = column.getValue;\n const custom = column.filter.predicate;\n if (custom) return (row) => custom(row, model, get(row));\n\n const conditions = (model.conditions ?? [])\n .map((c) => compileCondition(column, c))\n .filter((p): p is ValuePredicate => p !== null);\n let conditionPredicate: ValuePredicate | null = null;\n if (conditions.length === 1) {\n conditionPredicate = conditions[0];\n } else if (conditions.length > 1) {\n conditionPredicate =\n model.logic === 'or'\n ? (v, row) => conditions.some((p) => p(v, row))\n : (v, row) => conditions.every((p) => p(v, row));\n }\n\n let valuePredicate: ValuePredicate | null = null;\n if (Array.isArray(model.values)) {\n const type = column.type;\n const allowed = new Set(model.values.map((v) => valueKey(v, type)));\n valuePredicate = (v) => allowed.has(valueKey(v, type));\n }\n\n if (conditionPredicate && valuePredicate) {\n const c = conditionPredicate;\n const vp = valuePredicate;\n return (row) => {\n const v = get(row);\n return vp(v, row) && c(v, row);\n };\n }\n const only = conditionPredicate ?? valuePredicate;\n if (!only) return null;\n return (row) => only(get(row), row);\n}\n\n/** Compiles the whole filter model (optionally skipping one column, for Excel-style cascading value lists). */\nexport function compileFilterModel<TRow>(\n model: FilterModel,\n columns: ReadonlyMap<string, ResolvedColumn<TRow>>,\n excludeField?: string,\n): RowPredicate<TRow>[] {\n const predicates: RowPredicate<TRow>[] = [];\n for (const field of Object.keys(model)) {\n if (field === excludeField) continue;\n const column = columns.get(field);\n if (!column) continue;\n const p = compileColumnFilter(column, model[field]);\n if (p) predicates.push(p);\n }\n return predicates;\n}\n\n/**\n * Keeps the rows that pass every predicate, preserving `order` (sorted indexes, or natural order when null).\n * Rows in `alwaysInclude` pass regardless (rows just added, kept visible until the filter changes).\n * Returns `null` when nothing is filtered, so callers can reuse `order` without copying.\n */\nexport function filterIndices<TRow>(\n data: readonly TRow[],\n order: readonly number[] | null,\n predicates: readonly RowPredicate<TRow>[],\n alwaysInclude: ReadonlySet<TRow> | null = null,\n): number[] | null {\n if (predicates.length === 0) return null;\n const out: number[] = [];\n const count = order ? order.length : data.length;\n const single = predicates.length === 1 ? predicates[0] : null;\n const keep = alwaysInclude !== null && alwaysInclude.size > 0 ? alwaysInclude : null;\n for (let k = 0; k < count; k++) {\n const i = order ? order[k] : k;\n const row = data[i];\n if (keep !== null && keep.has(row)) {\n out.push(i);\n continue;\n }\n if (single) {\n if (single(row)) out.push(i);\n continue;\n }\n let pass = true;\n for (let p = 0; p < predicates.length; p++) {\n if (!predicates[p](row)) {\n pass = false;\n break;\n }\n }\n if (pass) out.push(i);\n }\n return out;\n}\n\nexport interface ValueListItem {\n key: string | number | boolean | null;\n label: string;\n count: number;\n}\n\nexport interface ValueListResult {\n items: ValueListItem[];\n truncated: boolean;\n}\n\n/**\n * Distinct values of a column for the Excel-style checkbox list, from the rows that pass\n * the filters of all *other* columns (like Excel). Sorted ascending, blanks last.\n */\nexport function distinctValues<TRow>(\n data: readonly TRow[],\n column: ResolvedColumn<TRow>,\n model: FilterModel,\n columns: ReadonlyMap<string, ResolvedColumn<TRow>>,\n options: { locale: string | undefined; blanksLabel: string; limit: number },\n): ValueListResult {\n const predicates = compileFilterModel(model, columns, column.field);\n const counts = new Map<string | number | boolean | null, number>();\n const get = column.getValue;\n const type = column.type;\n outer: for (let i = 0; i < data.length; i++) {\n const row = data[i];\n for (let p = 0; p < predicates.length; p++) {\n if (!predicates[p](row)) continue outer;\n }\n const key = valueKey(get(row), type);\n counts.set(key, (counts.get(key) ?? 0) + 1);\n }\n\n const keys = Array.from(counts.keys());\n const collator = getCollator(options.locale);\n keys.sort((a, b) => {\n if (a === b) return 0;\n if (a === null) return 1;\n if (b === null) return -1;\n if (typeof a === 'number' && typeof b === 'number') return a - b;\n if (typeof a === 'boolean' && typeof b === 'boolean') return a ? -1 : 1;\n return collator.compare(String(a), String(b));\n });\n\n const truncated = keys.length > options.limit;\n const limited = truncated ? keys.slice(0, options.limit) : keys;\n const items = limited.map((key) => ({\n key,\n count: counts.get(key) ?? 0,\n label:\n key === null\n ? options.blanksLabel\n : type === 'date'\n ? column.formatValue(dayKeyToTimestamp(String(key)))\n : column.formatValue(key),\n }));\n return { items, truncated };\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n ViewEncapsulation,\n computed,\n inject,\n signal,\n} from '@angular/core';\nimport type { ResolvedColumn } from '../models/column.types';\nimport type { GridText } from '../models/config.types';\nimport { FILTER_OPERATOR_INPUTS, type ColumnFilterModel, type FilterCondition } from '../models/filter.types';\nimport type { SortDirection } from '../models/sort.types';\nimport { isColumnFilterActive, valueKey, type ValueListItem, type ValueListResult } from '../core/filter-engine';\nimport { dayKey, toTimestamp } from '../core/values';\n\ninterface ConditionDraft {\n operator: string;\n value: string;\n valueTo: string;\n}\n\nexport interface FilterPopupSetup {\n column: ResolvedColumn;\n text: GridText;\n model: ColumnFilterModel | null;\n showSortButtons: boolean;\n sortDirection: SortDirection | null;\n loadValues: () => ValueListResult;\n apply: (model: ColumnFilterModel | null) => void;\n cancel: () => void;\n sort: (direction: SortDirection) => void;\n /** Some column is filtered (offers \"Clear all filters\"). */\n anyFiltered: boolean;\n clearAll: () => void;\n}\n\nconst ITEM_HEIGHT = 28;\nconst LIST_MAX_HEIGHT = 224;\nlet nextId = 0;\n\nfunction toInputText(value: unknown, type: string): string {\n if (value === null || value === undefined) return '';\n if (type === 'date') {\n const t = toTimestamp(value);\n return t === null ? '' : dayKey(t);\n }\n return String(value);\n}\n\n/**\n * Excel-style filter popup: Clear filter, sort buttons, 1 to 5 typed conditions (AND/OR), a searchable checkbox\n * list of values (virtualized, so 100k distinct values stay fast), and Clear all filters / Cancel / Apply.\n * Nothing is applied before Apply; Cancel and Escape close without applying.\n */\n@Component({\n selector: 'infi-grid-filter-popup',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: {\n class: 'infi-grid-popup',\n role: 'dialog',\n '[attr.aria-label]': 'title',\n '(keydown)': 'onKeydown($event)',\n },\n template: `\n <div class=\"infi-grid-popup__head\">\n <div class=\"infi-grid-popup__title\">{{ column.header }}</div>\n @if (setup.model) {\n <button type=\"button\" class=\"infi-grid-popup__btn infi-grid-popup__btn--link\" (click)=\"clear()\">{{ text.clearFilter }}</button>\n }\n </div>\n @if (showSortButtons) {\n <div class=\"infi-grid-popup__sort\">\n <button type=\"button\" class=\"infi-grid-popup__sort-btn\" [class.is-active]=\"sortDirection === 'asc'\" (click)=\"setup.sort('asc')\">\n <svg viewBox=\"0 0 10 14\" width=\"9\" height=\"12\" aria-hidden=\"true\"><path d=\"M5 1 9 6H1z\" /></svg>\n {{ text.sortAscending }}\n </button>\n <button type=\"button\" class=\"infi-grid-popup__sort-btn\" [class.is-active]=\"sortDirection === 'desc'\" (click)=\"setup.sort('desc')\">\n <svg viewBox=\"0 0 10 14\" width=\"9\" height=\"12\" aria-hidden=\"true\"><path d=\"M5 13 1 8h8z\" /></svg>\n {{ text.sortDescending }}\n </button>\n </div>\n }\n @if (showConditions) {\n <div class=\"infi-grid-popup__conditions\">\n @for (cond of conditions(); track $index; let i = $index) {\n @if (i === 1) {\n <div class=\"infi-grid-popup__logic\" role=\"radiogroup\">\n <label>\n <input type=\"radio\" [attr.name]=\"'logic-' + uid\" [checked]=\"logic() === 'and'\" (change)=\"logic.set('and')\" />\n {{ text.and }}\n </label>\n <label>\n <input type=\"radio\" [attr.name]=\"'logic-' + uid\" [checked]=\"logic() === 'or'\" (change)=\"logic.set('or')\" />\n {{ text.or }}\n </label>\n </div>\n } @else if (i > 1) {\n <div class=\"infi-grid-popup__logic-label\">{{ logic() === 'or' ? text.or : text.and }}</div>\n }\n <div class=\"infi-grid-popup__condition\">\n <select class=\"infi-grid-popup__operator\" [attr.aria-label]=\"'Condition ' + (i + 1)\" (change)=\"setOperator(i, $event)\">\n <option value=\"\" [selected]=\"cond.operator === ''\">—</option>\n @for (op of operators; track op) {\n <option [value]=\"op\" [selected]=\"op === cond.operator\">{{ operatorLabel(op) }}</option>\n }\n </select>\n @if (conditions().length > 1) {\n <button\n type=\"button\"\n class=\"infi-grid-popup__remove\"\n [attr.aria-label]=\"text.removeCondition\"\n [attr.title]=\"text.removeCondition\"\n (click)=\"removeCondition(i)\"\n >\n ×\n </button>\n }\n @if (inputCount(cond.operator) >= 1) {\n <input\n class=\"infi-grid-popup__input\"\n [attr.type]=\"inputType\"\n [attr.step]=\"inputType === 'number' ? 'any' : null\"\n [value]=\"cond.value\"\n [attr.placeholder]=\"text.valuePlaceholder\"\n [attr.aria-label]=\"text.valuePlaceholder\"\n (input)=\"setConditionValue(i, 'value', $event)\"\n />\n }\n @if (inputCount(cond.operator) === 2) {\n <input\n class=\"infi-grid-popup__input\"\n [attr.type]=\"inputType\"\n [attr.step]=\"inputType === 'number' ? 'any' : null\"\n [value]=\"cond.valueTo\"\n [attr.placeholder]=\"text.valueToPlaceholder\"\n [attr.aria-label]=\"text.valueToPlaceholder\"\n (input)=\"setConditionValue(i, 'valueTo', $event)\"\n />\n }\n </div>\n }\n @if (canAddCondition()) {\n <button type=\"button\" class=\"infi-grid-popup__btn infi-grid-popup__btn--link infi-grid-popup__add\" (click)=\"addCondition()\">\n + {{ text.addCondition }}\n </button>\n }\n </div>\n }\n @if (showValueList) {\n <div class=\"infi-grid-popup__values\">\n <input\n type=\"search\"\n class=\"infi-grid-popup__search\"\n [placeholder]=\"text.search\"\n [attr.aria-label]=\"text.search\"\n [value]=\"search()\"\n (input)=\"onSearch($event)\"\n />\n <label class=\"infi-grid-popup__item infi-grid-popup__item--all\">\n <input\n type=\"checkbox\"\n [checked]=\"allState() === 'all'\"\n [indeterminate]=\"allState() === 'some'\"\n (change)=\"toggleAll($event)\"\n />\n <span class=\"infi-grid-popup__item-label\">{{ text.selectAll }}</span>\n </label>\n <div class=\"infi-grid-popup__list\" [style.height.px]=\"listHeight()\" (scroll)=\"onListScroll($event)\">\n <div class=\"infi-grid-popup__list-canvas\" [style.height.px]=\"filteredItems().length * itemHeight\">\n @for (entry of visibleItems(); track entry.index) {\n <label class=\"infi-grid-popup__item\" [style.top.px]=\"entry.index * itemHeight\">\n <input type=\"checkbox\" [checked]=\"isSelected(entry.item)\" (change)=\"toggle(entry.item, $event)\" />\n <span class=\"infi-grid-popup__item-label\">{{ entry.item.label }}</span>\n <span class=\"infi-grid-popup__item-count\">{{ entry.item.count }}</span>\n </label>\n }\n </div>\n </div>\n @if (filteredItems().length === 0) {\n <div class=\"infi-grid-popup__note\">{{ text.noMatchingValues }}</div>\n }\n @if (truncated()) {\n <div class=\"infi-grid-popup__note\">{{ truncatedText() }}</div>\n }\n </div>\n }\n <div class=\"infi-grid-popup__actions\">\n @if (setup.anyFiltered) {\n <button type=\"button\" class=\"infi-grid-popup__btn infi-grid-popup__btn--link\" (click)=\"setup.clearAll()\">{{ text.clearAllFilters }}</button>\n }\n <span class=\"infi-grid-popup__spacer\"></span>\n <button type=\"button\" class=\"infi-grid-popup__btn\" (click)=\"setup.cancel()\">{{ text.cancel }}</button>\n <button\n type=\"button\"\n class=\"infi-grid-popup__btn infi-grid-popup__btn--primary\"\n [disabled]=\"!canApply()\"\n (click)=\"apply()\"\n >\n {{ text.apply }}\n </button>\n </div>\n `,\n})\nexport class GridFilterPopupComponent {\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n readonly uid = ++nextId;\n readonly itemHeight = ITEM_HEIGHT;\n\n setup!: FilterPopupSetup;\n column!: ResolvedColumn;\n text!: GridText;\n title = '';\n operators: readonly string[] = [];\n inputType = 'text';\n showConditions = true;\n showValueList = true;\n showSortButtons = false;\n sortDirection: SortDirection | null = null;\n private maxConditions = 2;\n\n readonly conditions = signal<ConditionDraft[]>([]);\n readonly logic = signal<'and' | 'or'>('and');\n readonly search = signal('');\n readonly items = signal<ValueListItem[]>([]);\n readonly truncated = signal(false);\n private readonly selected = new Set<unknown>();\n private readonly selectionVersion = signal(0);\n private readonly listScroll = signal(0);\n\n readonly filteredItems = computed(() => {\n const q = this.search().trim().toLowerCase();\n const items = this.items();\n return q ? items.filter((i) => i.label.toLowerCase().includes(q)) : items;\n });\n\n readonly listHeight = computed(() => Math.min(LIST_MAX_HEIGHT, Math.max(ITEM_HEIGHT, this.filteredItems().length * ITEM_HEIGHT)));\n\n readonly visibleItems = computed(() => {\n const list = this.filteredItems();\n const start = Math.max(0, Math.floor(this.listScroll() / ITEM_HEIGHT) - 2);\n const count = Math.ceil(LIST_MAX_HEIGHT / ITEM_HEIGHT) + 4;\n return list.slice(start, start + count).map((item, k) => ({ item, index: start + k }));\n });\n\n readonly allState = computed<'all' | 'some' | 'none'>(() => {\n this.selectionVersion();\n const list = this.filteredItems();\n let n = 0;\n for (const item of list) if (this.selected.has(item.key)) n++;\n return n === 0 ? 'none' : n === list.length ? 'all' : 'some';\n });\n\n readonly canApply = computed(() => {\n if (!this.showValueList || this.filteredItems().length === 0) return true;\n return this.allState() !== 'none';\n });\n\n /** Another condition can be added: below the maximum, and the last one is complete. */\n readonly canAddCondition = computed(() => {\n const list = this.conditions();\n const last = list[list.length - 1];\n return list.length < this.maxConditions && !!last && this.isComplete(last);\n });\n\n readonly truncatedText = computed(() =>\n this.text.valueListTruncated.replace('{count}', String(this.items().length)),\n );\n\n /** Called once by the popup service before the first render. */\n init(setup: FilterPopupSetup): void {\n this.setup = setup;\n const column = setup.column;\n this.column = column;\n this.text = setup.text;\n this.title = column.header;\n this.operators = column.filter.operators;\n this.inputType = column.type === 'number' ? 'number' : column.type === 'date' ? 'date' : 'text';\n this.showConditions = column.filter.conditions;\n this.showValueList = column.filter.valueList;\n this.showSortButtons = setup.showSortButtons;\n this.sortDirection = setup.sortDirection;\n this.maxConditions = column.filter.maxConditions;\n\n const model = setup.model;\n const drafts: ConditionDraft[] = (model?.conditions ?? []).slice(0, this.maxConditions).map((c) => ({\n operator: c.operator,\n value: toInputText(c.value, column.type),\n valueTo: toInputText(c.valueTo, column.type),\n }));\n if (drafts.length === 0) drafts.push(this.emptyCondition());\n this.conditions.set(drafts);\n this.logic.set(model?.logic === 'or' ? 'or' : 'and');\n\n if (this.showValueList) {\n const result = setup.loadValues();\n this.items.set(result.items);\n this.truncated.set(result.truncated);\n if (Array.isArray(model?.values)) {\n for (const v of model.values) this.selected.add(valueKey(v, column.type));\n } else {\n for (const item of result.items) this.selected.add(item.key);\n }\n this.selectionVersion.update((v) => v + 1);\n }\n }\n\n focusFirst(): void {\n const el = this.host.nativeElement.querySelector<HTMLElement>(\n '.infi-grid-popup__input, .infi-grid-popup__search, .infi-grid-popup__operator, button',\n );\n el?.focus();\n }\n\n operatorLabel(op: string): string {\n const custom = this.column.filter.customOperators.find((o) => o.key === op);\n return custom?.label ?? this.text.operators[op] ?? op;\n }\n\n inputCount(op: string): number {\n if (!op) return 0;\n const custom = this.column.filter.customOperators.find((o) => o.key === op);\n if (custom) return custom.inputs ?? 1;\n return FILTER_OPERATOR_INPUTS[op] ?? 1;\n }\n\n setOperator(index: number, event: Event): void {\n const operator = (event.target as HTMLSelectElement).value;\n this.updateCondition(index, { operator });\n }\n\n setConditionValue(index: number, key: 'value' | 'valueTo', event: Event): void {\n this.updateCondition(index, { [key]: (event.target as HTMLInputElement).value });\n }\n\n private updateCondition(index: number, patch: Partial<ConditionDraft>): void {\n this.conditions.set(this.conditions().map((c, i) => (i === index ? { ...c, ...patch } : c)));\n }\n\n addCondition(): void {\n if (!this.canAddCondition()) return;\n this.conditions.set([...this.conditions(), this.emptyCondition()]);\n // Focus the new condition's operator.\n queueMicrotask(() => {\n const operators = this.host.nativeElement.querySelectorAll<HTMLElement>('.infi-grid-popup__operator');\n operators[operators.length - 1]?.focus();\n });\n }\n\n removeCondition(index: number): void {\n const next = this.conditions().filter((_, i) => i !== index);\n this.conditions.set(next.length > 0 ? next : [this.emptyCondition()]);\n }\n\n /** A new condition row: the column's default operator, when it takes a value (booleans pick one). */\n private emptyCondition(): ConditionDraft {\n const operator = this.column.filter.defaultOperator;\n const needsInput = this.inputCount(operator) > 0;\n return { operator: this.column.type === 'boolean' || !needsInput ? '' : operator, value: '', valueTo: '' };\n }\n\n private isComplete(c: ConditionDraft): boolean {\n const inputs = this.inputCount(c.operator);\n return c.operator !== '' && (inputs === 0 || (c.value !== '' && (inputs < 2 || c.valueTo !== '')));\n }\n\n onSearch(event: Event): void {\n this.search.set((event.target as HTMLInputElement).value);\n this.listScroll.set(0);\n const list = this.host.nativeElement.querySelector('.infi-grid-popup__list');\n if (list) list.scrollTop = 0;\n }\n\n onListScroll(event: Event): void {\n this.listScroll.set((event.target as HTMLElement).scrollTop);\n }\n\n isSelected(item: ValueListItem): boolean {\n this.selectionVersion();\n return this.selected.has(item.key);\n }\n\n toggle(item: ValueListItem, event: Event): void {\n if ((event.target as HTMLInputElement).checked) this.selected.add(item.key);\n else this.selected.delete(item.key);\n this.selectionVersion.update((v) => v + 1);\n }\n\n toggleAll(event: Event): void {\n const checked = (event.target as HTMLInputElement).checked;\n for (const item of this.filteredItems()) {\n if (checked) this.selected.add(item.key);\n else this.selected.delete(item.key);\n }\n this.selectionVersion.update((v) => v + 1);\n }\n\n onKeydown(event: KeyboardEvent): void {\n event.stopPropagation();\n if (event.key === 'Escape') {\n event.preventDefault();\n this.setup.cancel();\n } else if (event.key === 'Enter' && !(event.target instanceof HTMLButtonElement) && !(event.target instanceof HTMLSelectElement)) {\n event.preventDefault();\n if (this.canApply()) this.apply();\n }\n }\n\n clear(): void {\n this.setup.apply(null);\n }\n\n apply(): void {\n const type = this.column.type;\n const parse = (raw: string): unknown => {\n if (raw === '') return undefined;\n if (type === 'number') {\n const n = Number(raw);\n return Number.isNaN(n) ? undefined : n;\n }\n return raw;\n };\n const conditions: FilterCondition[] = [];\n if (this.showConditions) {\n for (const draft of this.conditions()) {\n if (!draft.operator) continue;\n const inputs = this.inputCount(draft.operator);\n const value = parse(draft.value);\n const valueTo = parse(draft.valueTo);\n if (inputs >= 1 && value === undefined && (inputs < 2 || valueTo === undefined)) continue;\n const condition: FilterCondition = { operator: draft.operator };\n if (value !== undefined) condition.value = value;\n if (valueTo !== undefined) condition.valueTo = valueTo;\n conditions.push(condition);\n }\n }\n\n let values: unknown[] | null = null;\n if (this.showValueList && this.items().length > 0) {\n const searching = this.search().trim() !== '';\n const scope = searching ? this.filteredItems() : this.items();\n const chosen = scope.filter((i) => this.selected.has(i.key)).map((i) => i.key);\n // Everything selected (and not searching) means \"no value filter\". A truncated list can't express that.\n const everything = !searching && chosen.length === this.items().length;\n if (!everything || (this.truncated() && !everything)) values = chosen;\n }\n\n const model: ColumnFilterModel = {};\n if (conditions.length) {\n model.conditions = conditions;\n if (conditions.length > 1) model.logic = this.logic();\n }\n if (values) model.values = values;\n this.setup.apply(isColumnFilterActive(model) ? model : null);\n }\n}\n","/** CSS custom properties used for theming (copied onto the filter popup, which lives in `<body>`). */\nexport const THEME_VARIABLES: readonly string[] = [\n '--infi-grid-font-family',\n '--infi-grid-font-size',\n '--infi-grid-bg',\n '--infi-grid-fg',\n '--infi-grid-muted-fg',\n '--infi-grid-border-color',\n '--infi-grid-cell-border-color',\n '--infi-grid-cell-padding',\n '--infi-grid-header-bg',\n '--infi-grid-header-fg',\n '--infi-grid-row-alt-bg',\n '--infi-grid-row-hover-bg',\n '--infi-grid-accent',\n '--infi-grid-accent-fg',\n '--infi-grid-summary-bg',\n '--infi-grid-editing-bg',\n '--infi-grid-invalid',\n '--infi-grid-popup-bg',\n '--infi-grid-popup-shadow',\n '--infi-grid-input-bg',\n '--infi-grid-radius',\n '--infi-grid-overlay-bg',\n '--infi-grid-selected-bg',\n '--infi-grid-selected-hover-bg',\n '--infi-grid-active-row-bg',\n '--infi-grid-selected-cell-bg',\n '--infi-grid-danger',\n '--infi-grid-added-color',\n '--infi-grid-modified-color',\n '--infi-grid-modified-bg',\n '--infi-grid-tooltip-bg',\n '--infi-grid-tooltip-fg',\n];\n","/**\n * Compiled field accessors. `'price'` reads `row.price`; `'customer.name'` reads `row.customer?.name`.\n * Compiling once per column keeps the per-cell cost to a property read.\n */\n\nconst UNSAFE_KEYS = new Set(['__proto__', 'constructor', 'prototype']);\n\nexport function compileGetter(field: string): (row: any) => any {\n if (!field.includes('.')) {\n return (row: any) => (row == null ? undefined : row[field]);\n }\n const parts = field.split('.');\n return (row: any) => {\n let value = row;\n for (let i = 0; i < parts.length; i++) {\n if (value == null) return undefined;\n value = value[parts[i]];\n }\n return value;\n };\n}\n\nexport function compileSetter(field: string): ((row: any, value: any) => void) | null {\n const parts = field.split('.');\n if (parts.some((p) => p === '' || UNSAFE_KEYS.has(p))) return null;\n if (parts.length === 1) {\n return (row: any, value: any) => {\n if (row != null) row[field] = value;\n };\n }\n const last = parts[parts.length - 1];\n const path = parts.slice(0, -1);\n return (row: any, value: any) => {\n let target = row;\n for (const part of path) {\n if (target == null) return;\n if (target[part] == null) target[part] = {};\n target = target[part];\n }\n if (target != null) target[last] = value;\n };\n}\n","import type { GridText } from '../models/config.types';\n\nexport const DEFAULT_ROW_HEIGHT = 36;\nexport const DEFAULT_HEADER_HEIGHT = 40;\nexport const DEFAULT_COLUMN_WIDTH = 150;\nexport const DEFAULT_MIN_COLUMN_WIDTH = 48;\nexport const DEFAULT_MAX_COLUMN_WIDTH = 4000;\n\nexport const DEFAULT_TEXT: GridText = {\n loading: 'Loading…',\n noData: 'No data found',\n noResults: 'No rows match the current filters',\n error: 'Something went wrong while loading the data.',\n apply: 'Apply',\n cancel: 'Cancel',\n clear: 'Clear',\n selectAll: '(Select all)',\n blanks: '(Blanks)',\n search: 'Search values',\n and: 'And',\n or: 'Or',\n sortAscending: 'Sort ascending',\n sortDescending: 'Sort descending',\n valuePlaceholder: 'Value',\n valueToPlaceholder: 'To',\n valueListTruncated: 'Showing the first {count} values',\n noMatchingValues: 'No matching values',\n booleanTrue: 'Yes',\n booleanFalse: 'No',\n selectRow: 'Select row',\n selectAllRows: 'Select all rows',\n required: 'Required',\n keyRequired: 'A key is required',\n duplicateKey: 'This key is already used',\n deleteRowConfirm: 'Delete this row?',\n deleteRowsConfirm: 'Delete {count} rows?',\n delete: 'Delete',\n editRow: 'Edit row',\n deleteRow: 'Delete row',\n saveRow: 'Save',\n cancelRowEdit: 'Cancel',\n addRow: 'Add row',\n actions: 'Actions',\n restoreRow: 'Restore row',\n clearFilter: 'Clear filter',\n clearAllFilters: 'Clear all filters',\n addCondition: 'Add condition',\n removeCondition: 'Remove condition',\n filterColumn: 'Filter {column}',\n filteredColumn: 'Filter {column} (filtered)',\n filterPlaceholder: 'Filter…',\n filterOperator: 'Operator: {operator}',\n allValues: '(All)',\n pendingChanges: '{count} unsaved changes',\n undo: 'Undo',\n redo: 'Redo',\n discardChanges: 'Discard',\n saveChanges: 'Save',\n saving: 'Saving…',\n saveFailed: 'Saving failed. Your changes are still here.',\n operators: {\n contains: 'Contains',\n notContains: 'Does not contain',\n equals: 'Equals',\n notEquals: 'Does not equal',\n startsWith: 'Begins with',\n endsWith: 'Ends with',\n empty: 'Is empty',\n notEmpty: 'Is not empty',\n greaterThan: 'Greater than',\n greaterThanOrEqual: 'Greater than or equal to',\n lessThan: 'Less than',\n lessThanOrEqual: 'Less than or equal to',\n between: 'Between',\n before: 'Before',\n after: 'After',\n onOrBefore: 'On or before',\n onOrAfter: 'On or after',\n isTrue: 'Is true',\n isFalse: 'Is false',\n },\n summaryLabels: {\n sum: 'Sum',\n avg: 'Avg',\n count: 'Count',\n min: 'Min',\n max: 'Max',\n },\n};\n","import type { ColumnConfig, GridDataType } from '../models/column.types';\nimport type { GridText } from '../models/config.types';\nimport { toBoolean, toNumber, toTimestamp } from './values';\n\nconst numberFormats = new Map<string, Intl.NumberFormat>();\nconst dateFormats = new Map<string, Intl.DateTimeFormat>();\n\n/** `Intl.NumberFormat` instances are expensive to create, so they are cached by locale + options. */\nexport function getNumberFormat(locale: string | undefined, options?: Intl.NumberFormatOptions): Intl.NumberFormat {\n const key = `${locale ?? ''}|${options ? JSON.stringify(options) : ''}`;\n let format = numberFormats.get(key);\n if (!format) {\n format = new Intl.NumberFormat(locale, options ?? { maximumFractionDigits: 2 });\n numberFormats.set(key, format);\n }\n return format;\n}\n\nexport function getDateFormat(locale: string | undefined, options?: Intl.DateTimeFormatOptions): Intl.DateTimeFormat {\n const key = `${locale ?? ''}|${options ? JSON.stringify(options) : ''}`;\n let format = dateFormats.get(key);\n if (!format) {\n format = new Intl.DateTimeFormat(locale, options ?? { year: 'numeric', month: 'short', day: '2-digit' });\n dateFormats.set(key, format);\n }\n return format;\n}\n\nexport type ValueFormatter = (value: any, row?: any) => string;\n\n/**\n * Builds the display formatter of a column. A failing custom `valueFormatter`\n * shows `#ERROR` in the cell and is reported once through `onError`.\n */\nexport function createFormatter(\n column: Pick<ColumnConfig, 'valueFormatter' | 'numberFormat' | 'dateFormat' | 'booleanLabels'>,\n type: GridDataType,\n locale: string | undefined,\n text: GridText,\n onError?: (error: unknown) => void,\n): ValueFormatter {\n const custom = column.valueFormatter;\n if (custom) {\n let reported = false;\n return (value, row) => {\n try {\n const out = custom(value, row);\n return out == null ? '' : String(out);\n } catch (error) {\n if (!reported) {\n reported = true;\n onError?.(error);\n }\n return '#ERROR';\n }\n };\n }\n switch (type) {\n case 'number': {\n const nf = getNumberFormat(locale, column.numberFormat);\n return (value) => {\n const n = toNumber(value);\n return n === null ? '' : nf.format(n);\n };\n }\n case 'date': {\n const df = getDateFormat(locale, column.dateFormat);\n return (value) => {\n const t = toTimestamp(value);\n return t === null ? '' : df.format(t);\n };\n }\n case 'boolean': {\n const labels = column.booleanLabels ?? { true: text.booleanTrue, false: text.booleanFalse };\n return (value) => {\n const b = toBoolean(value);\n return b === null ? '' : b ? labels.true : labels.false;\n };\n }\n default:\n return (value) => {\n if (value == null) return '';\n if (value instanceof Date) return getDateFormat(locale).format(value);\n return String(value);\n };\n }\n}\n","import type { ColumnConfig, GridDataType, GridEditorType, ResolvedColumn } from '../models/column.types';\nimport type { EditConfig, GridConfig, GridText, ResolvedGridConfig } from '../models/config.types';\nimport type { GridErrorEvent } from '../models/events.types';\nimport type { CellSelectionConfig, SelectionConfig } from '../models/selection.types';\nimport type { GridTooltipMode, GridTooltipPlacement, TooltipConfig } from '../models/tooltip.types';\nimport { FILTER_OPERATORS_BY_TYPE, type ColumnFilterConfig, type ResolvedColumnFilter } from '../models/filter.types';\nimport type { SortDirection } from '../models/sort.types';\nimport type { ColumnSummaryConfig, GridSummaryType, ResolvedColumnSummary } from '../models/summary.types';\nimport { compileGetter, compileSetter } from './accessor';\nimport {\n DEFAULT_COLUMN_WIDTH,\n DEFAULT_HEADER_HEIGHT,\n DEFAULT_MAX_COLUMN_WIDTH,\n DEFAULT_MIN_COLUMN_WIDTH,\n DEFAULT_ROW_HEIGHT,\n DEFAULT_TEXT,\n} from './defaults';\nimport { createFormatter } from './format';\nimport type { TemplateRegistry } from './template-registry';\n\nconst DATA_TYPES: readonly GridDataType[] = ['text', 'number', 'date', 'boolean'];\nconst SUMMARY_TYPES: readonly GridSummaryType[] = ['sum', 'avg', 'count', 'min', 'max'];\n\nconst DEFAULT_EDITOR: Readonly<Record<GridDataType, GridEditorType>> = {\n text: 'text',\n number: 'number',\n date: 'date',\n boolean: 'checkbox',\n};\n\nfunction positive(value: number | undefined, fallback: number): number {\n return typeof value === 'number' && value > 0 && Number.isFinite(value) ? value : fallback;\n}\n\n/** Filter popup conditions: 1 to 5. */\nfunction clampConditions(value: number | undefined, fallback: number): number {\n return typeof value === 'number' && Number.isFinite(value) ? Math.min(5, Math.max(1, Math.floor(value))) : fallback;\n}\n\nfunction nonNegative(value: number | undefined, fallback: number): number {\n return typeof value === 'number' && value >= 0 && Number.isFinite(value) ? Math.floor(value) : fallback;\n}\n\nfunction mergeText(text: GridConfig['text']): GridText {\n if (!text) return DEFAULT_TEXT;\n return {\n ...DEFAULT_TEXT,\n ...stripUndefined(text),\n operators: { ...DEFAULT_TEXT.operators, ...text.operators },\n summaryLabels: { ...DEFAULT_TEXT.summaryLabels, ...stripUndefined(text.summaryLabels ?? {}) },\n } as GridText;\n}\n\nfunction validCycle(cycle: readonly (SortDirection | null)[] | undefined): readonly (SortDirection | null)[] | null {\n if (!cycle || cycle.length === 0) return null;\n return cycle.every((c) => c === 'asc' || c === 'desc' || c === null) ? cycle : null;\n}\n\n/** Copies an object without its `undefined` properties, so they don't override defaults when spread. */\nexport function stripUndefined<T extends object>(value: T): Partial<T> {\n const out: Partial<T> = {};\n for (const key of Object.keys(value) as (keyof T)[]) {\n if (value[key] !== undefined) out[key] = value[key];\n }\n return out;\n}\n\nfunction resolveSelection<TRow>(s: SelectionConfig<TRow> | undefined): ResolvedGridConfig<TRow>['selection'] {\n const mode = s?.mode === 'single' || s?.mode === 'multiple' ? s.mode : 'none';\n return {\n mode,\n checkbox: s?.checkbox ?? mode === 'multiple',\n checkboxWidth: positive(s?.checkboxWidth, 40),\n headerCheckbox: s?.headerCheckbox ?? true,\n selectOnClick: s?.selectOnClick ?? true,\n selectAllScope: s?.selectAllScope === 'all' ? 'all' : 'filtered',\n onFilter: s?.onFilter === 'clear' || s?.onFilter === 'keep' ? s.onFilter : 'deselectHidden',\n scrollToSelection: s?.scrollToSelection === true,\n keyboard: s?.keyboard ?? true,\n rowSelectable: typeof s?.rowSelectable === 'function' ? s.rowSelectable : null,\n };\n}\n\nfunction resolveCellSelection(c: CellSelectionConfig | undefined): ResolvedGridConfig['cellSelection'] {\n const enabled = c?.enabled === true;\n return { enabled, activeRow: enabled && c?.activeRow === true };\n}\n\nfunction resolveActionColumn<TRow>(e: EditConfig<TRow>): ResolvedGridConfig<TRow>['editing']['actionColumn'] {\n const raw = e.actionColumn;\n if (!raw) return null;\n const a = raw === true ? {} : raw;\n const edit = a.edit ?? true;\n const del = a.delete ?? e.allowDelete === true;\n const add = a.add ?? e.allowAdd === true;\n // Two buttons while editing (save, cancel); otherwise edit and/or delete.\n const buttons = Math.max(edit ? 2 : 0, del ? (edit ? 2 : 1) : 0, add ? 1 : 0, 1);\n return { edit, delete: del, add, width: positive(a.width, 12 + 28 * buttons) };\n}\n\nconst TOOLTIP_MODES: readonly GridTooltipMode[] = ['truncated', 'always', 'never'];\nconst PLACEMENTS: readonly GridTooltipPlacement[] = ['top', 'bottom', 'left', 'right'];\n\nfunction resolveTooltips(t: TooltipConfig | undefined): ResolvedGridConfig['tooltips'] {\n return {\n enabled: t?.enabled ?? true,\n cells: t?.cells && TOOLTIP_MODES.includes(t.cells) ? t.cells : 'truncated',\n headers: t?.headers && TOOLTIP_MODES.includes(t.headers) ? t.headers : 'truncated',\n showDelay: nonNegative(t?.showDelay, 500),\n hideDelay: nonNegative(t?.hideDelay, 100),\n placement: t?.placement && PLACEMENTS.includes(t.placement) ? t.placement : 'top',\n disabledTypes: t?.disabledTypes ?? [],\n };\n}\n\n/** Fills every default of the grid configuration. */\nexport function resolveConfig<TRow>(config: GridConfig<TRow> | null | undefined): ResolvedGridConfig<TRow> {\n const c: GridConfig<TRow> = config ?? {};\n const text = mergeText(c.text);\n const rowHeight = positive(c.rowHeight, DEFAULT_ROW_HEIGHT);\n const v = c.virtualization ?? {};\n const s = c.sorting ?? {};\n const f = c.filtering ?? {};\n const e = c.editing ?? {};\n const su = c.summary ?? {};\n const l = c.loading ?? {};\n const em = c.emptyState ?? {};\n const er = c.errorState ?? {};\n const r = c.dataRefresh ?? {};\n const pk = c.primaryKey;\n return {\n primaryKey: typeof pk === 'function' || (typeof pk === 'string' && pk !== '') ? pk : null,\n dataRefresh: {\n filter: r.filter === 'reset' ? 'reset' : 'keep',\n sort: r.sort === 'reset' ? 'reset' : 'keep',\n selection: r.selection === 'reset' ? 'reset' : 'keep',\n scroll: r.scroll === 'top' ? 'top' : 'keep',\n },\n selection: resolveSelection(c.selection),\n cellSelection: resolveCellSelection(c.cellSelection),\n tooltips: resolveTooltips(c.tooltips),\n events: {\n clickMode: c.events?.clickMode === 'waitForDoubleClick' ? 'waitForDoubleClick' : 'immediate',\n doubleClickDelay: positive(c.events?.doubleClickDelay, 250),\n preventContextMenu: c.events?.preventContextMenu === true,\n },\n rowHeight,\n headerHeight: positive(c.headerHeight, DEFAULT_HEADER_HEIGHT),\n summaryRowHeight: positive(c.summaryRowHeight, rowHeight),\n defaultColumn: c.defaultColumn ?? {},\n rowClass: c.rowClass ?? null,\n rowStyle: c.rowStyle ?? null,\n stripedRows: c.stripedRows ?? true,\n resizableColumns: c.resizableColumns ?? true,\n keyboardNavigation: c.keyboardNavigation ?? true,\n locale: c.locale,\n theme: c.theme ?? 'light',\n ariaLabel: c.ariaLabel ?? 'Data grid',\n virtualization: {\n rows: v.rows ?? true,\n columns: v.columns ?? true,\n rowBuffer: nonNegative(v.rowBuffer, 6),\n columnBuffer: nonNegative(v.columnBuffer, 2),\n syncScroll: v.syncScroll ?? true,\n },\n sorting: {\n enabled: s.enabled ?? true,\n multiSort: s.multiSort ?? true,\n multiSortKey: s.multiSortKey ?? 'shift',\n maxSortColumns: typeof s.maxSortColumns === 'number' && s.maxSortColumns > 0 ? s.maxSortColumns : Infinity,\n showSortIcon: s.showSortIcon ?? true,\n sortIconVisibility: s.sortIconVisibility ?? 'hover',\n showSortIndex: s.showSortIndex ?? true,\n cycle: validCycle(s.cycle) ?? ['asc', 'desc', null],\n nulls: s.nulls ?? 'last',\n initialSort: s.initialSort ?? [],\n },\n filtering: {\n enabled: f.enabled ?? true,\n showFilterIcon: f.showFilterIcon ?? true,\n filterIconVisibility: f.filterIconVisibility ?? 'always',\n valueList: f.valueList ?? true,\n conditions: f.conditions ?? true,\n maxConditions: clampConditions(f.maxConditions, 2),\n caseSensitive: f.caseSensitive ?? false,\n showSortButtons: f.showSortButtons ?? true,\n valueListLimit: positive(f.valueListLimit, 100_000),\n initialFilter: f.initialFilter ?? {},\n mode: f.mode === 'row' || f.mode === 'both' ? f.mode : 'menu',\n rowDebounce: nonNegative(f.rowDebounce, 300),\n rowHeight: positive(f.rowHeight, rowHeight),\n },\n editing: {\n enabled: e.enabled ?? false,\n mode: e.mode ?? 'cell',\n trigger: e.trigger ?? 'dblclick',\n commitOnBlur: e.commitOnBlur ?? true,\n gridEditMode: e.gridEditMode ?? false,\n allowAdd: e.allowAdd === true,\n allowDelete: e.allowDelete === true,\n addPosition: e.addPosition === 'bottom' ? 'bottom' : 'top',\n newRow: typeof e.newRow === 'function' ? e.newRow : null,\n rowValidator: typeof e.rowValidator === 'function' ? e.rowValidator : null,\n confirmDelete: e.confirmDelete ?? true,\n actionColumn: resolveActionColumn(e),\n batch: e.batch === true,\n undoLimit: nonNegative(e.undoLimit, 100),\n loadingWhileSaving: e.loadingWhileSaving ?? true,\n batchToolbar: e.batchToolbar ?? true,\n saveHandler: typeof e.saveHandler === 'function' ? e.saveHandler : null,\n },\n summary: {\n enabled: su.enabled ?? null,\n sticky: su.sticky ?? true,\n scope: su.scope ?? 'filtered',\n showLabels: su.showLabels ?? true,\n },\n loading: {\n enabled: l.enabled ?? true,\n useCustomTemplate: l.useCustomTemplate ?? true,\n blockGrid: l.blockGrid ?? true,\n message: l.message ?? text.loading,\n },\n emptyState: {\n enabled: em.enabled ?? true,\n useCustomTemplate: em.useCustomTemplate ?? true,\n showWhenFiltered: em.showWhenFiltered ?? true,\n message: em.message ?? text.noData,\n filteredMessage: em.filteredMessage ?? text.noResults,\n },\n errorState: {\n enabled: er.enabled ?? true,\n useCustomTemplate: er.useCustomTemplate ?? true,\n message: er.message ?? text.error,\n },\n templates: c.templates ?? {},\n text,\n };\n}\n\nfunction resolveSummary<TRow>(\n raw: ColumnSummaryConfig<TRow> | GridSummaryType | undefined,\n config: ResolvedGridConfig<TRow>,\n field: string,\n onError?: (event: GridErrorEvent) => void,\n): ResolvedColumnSummary<TRow> | null {\n if (!raw) return null;\n const s: ColumnSummaryConfig<TRow> = typeof raw === 'string' ? { type: raw } : raw;\n if (s.enabled === false) return null;\n const type = s.fn ? 'custom' : (s.type ?? 'sum');\n if (type !== 'custom' && !SUMMARY_TYPES.includes(type)) {\n onError?.({ source: 'config', field, error: new Error(`Unknown summary type \"${String(type)}\" on column \"${field}\"`) });\n return null;\n }\n return {\n type,\n fn: s.fn ?? null,\n label: s.label ?? (type === 'custom' ? '' : config.text.summaryLabels[type]),\n formatter: s.formatter ?? null,\n scope: s.scope ?? config.summary.scope,\n dependsOn: s.dependsOn ?? null,\n };\n}\n\nfunction resolveFilter<TRow>(\n f: ColumnFilterConfig<TRow>,\n type: GridDataType,\n config: ResolvedGridConfig<TRow>,\n): ResolvedColumnFilter<TRow> {\n const custom = f.customOperators ?? [];\n const base = f.operators ?? FILTER_OPERATORS_BY_TYPE[type];\n const operators = [...base, ...custom.map((c) => c.key).filter((key) => !base.includes(key))];\n return {\n operators,\n defaultOperator: f.defaultOperator && operators.includes(f.defaultOperator) ? f.defaultOperator : (operators[0] ?? 'equals'),\n customOperators: custom,\n valueList: f.valueList ?? config.filtering.valueList,\n conditions: f.conditions ?? config.filtering.conditions,\n maxConditions: clampConditions(f.maxConditions, config.filtering.maxConditions),\n caseSensitive: f.caseSensitive ?? config.filtering.caseSensitive,\n predicate: f.predicate ?? null,\n };\n}\n\n/**\n * Merges each column with `defaultColumn` and the global flags (column settings win),\n * compiles accessors/formatters, and resolves templates (most specific first):\n * column property → field directive → type template (config, then directive) → default column → built-in.\n */\nexport function resolveColumns<TRow>(\n columns: readonly ColumnConfig<TRow>[] | null | undefined,\n config: ResolvedGridConfig<TRow>,\n registry: TemplateRegistry,\n onError?: (event: GridErrorEvent) => void,\n): ResolvedColumn<TRow>[] {\n const out: ResolvedColumn<TRow>[] = [];\n const seen = new Set<string>();\n const defaults = stripUndefined(config.defaultColumn) as Partial<ColumnConfig<TRow>>;\n const list = columns ?? [];\n for (let i = 0; i < list.length; i++) {\n const input = list[i];\n if (!input || typeof input.field !== 'string' || input.field === '') {\n onError?.({ source: 'config', error: new Error(`Column at index ${i} has no \"field\"`) });\n continue;\n }\n if (seen.has(input.field)) {\n onError?.({ source: 'config', field: input.field, error: new Error(`Duplicate column field \"${input.field}\"`) });\n continue;\n }\n seen.add(input.field);\n\n const merged: ColumnConfig<TRow> = {\n ...defaults,\n ...stripUndefined(input),\n field: input.field,\n sort: { ...stripUndefined(defaults.sort ?? {}), ...stripUndefined(input.sort ?? {}) },\n filter: { ...stripUndefined(defaults.filter ?? {}), ...stripUndefined(input.filter ?? {}) },\n editorOptions: { ...stripUndefined(defaults.editorOptions ?? {}), ...stripUndefined(input.editorOptions ?? {}) },\n };\n const field = merged.field;\n const type: GridDataType = merged.type && DATA_TYPES.includes(merged.type) ? merged.type : 'text';\n const minWidth = Math.max(10, merged.minWidth ?? DEFAULT_MIN_COLUMN_WIDTH);\n const maxWidth = Math.max(minWidth, merged.maxWidth ?? DEFAULT_MAX_COLUMN_WIDTH);\n const width = Math.min(maxWidth, Math.max(minWidth, merged.width ?? DEFAULT_COLUMN_WIDTH));\n const sort = merged.sort ?? {};\n const filter = merged.filter ?? {};\n const editorOptions = merged.editorOptions ?? {};\n const templates = config.templates;\n\n const getValue = merged.valueGetter ?? compileGetter(field);\n const setValue = merged.valueSetter ?? (merged.valueGetter ? null : compileSetter(field));\n const formatValue = createFormatter(merged, type, config.locale, config.text, (error) =>\n onError?.({ source: 'format', field, error }),\n );\n\n out.push({\n field,\n header: merged.header ?? field,\n type,\n width,\n minWidth,\n maxWidth,\n align: merged.align ?? (type === 'number' ? 'right' : type === 'boolean' ? 'center' : 'left'),\n hidden: merged.hidden ?? false,\n resizable: merged.resizable ?? config.resizableColumns,\n sortable: merged.sortable ?? config.sorting.enabled,\n filterable: merged.filterable ?? config.filtering.enabled,\n editable: merged.editable ?? config.editing.enabled,\n required: merged.required === true,\n showSortIcon: sort.showIcon ?? config.sorting.showSortIcon,\n sortIconVisibility: sort.iconVisibility ?? config.sorting.sortIconVisibility,\n showFilterIcon: filter.showIcon ?? config.filtering.showFilterIcon,\n filterIconVisibility: filter.iconVisibility ?? config.filtering.filterIconVisibility,\n editor: merged.editor ?? (editorOptions.options ? 'select' : DEFAULT_EDITOR[type]),\n editorOptions,\n summary: resolveSummary(input.summary ?? defaults.summary, config, field, onError),\n sort,\n filter: resolveFilter(filter, type, config),\n displayTemplate:\n input.displayTemplate ??\n registry.display.byField.get(field) ??\n templates.displayByType?.[type] ??\n registry.display.byType.get(type) ??\n defaults.displayTemplate ??\n registry.display.fallback ??\n null,\n editTemplate:\n input.editTemplate ??\n registry.edit.byField.get(field) ??\n templates.editByType?.[type] ??\n registry.edit.byType.get(type) ??\n defaults.editTemplate ??\n registry.edit.fallback ??\n null,\n headerTemplate:\n input.headerTemplate ??\n registry.header.byField.get(field) ??\n registry.header.byType.get(type) ??\n templates.header ??\n defaults.headerTemplate ??\n registry.header.fallback ??\n null,\n summaryTemplate:\n input.summaryTemplate ??\n registry.summary.byField.get(field) ??\n registry.summary.byType.get(type) ??\n templates.summary ??\n defaults.summaryTemplate ??\n registry.summary.fallback ??\n null,\n tooltipTemplate:\n input.tooltipTemplate ??\n registry.cellTooltip.byField.get(field) ??\n registry.cellTooltip.byType.get(type) ??\n defaults.tooltipTemplate ??\n registry.cellTooltip.fallback ??\n null,\n headerTooltipTemplate:\n input.headerTooltipTemplate ??\n registry.headerTooltip.byField.get(field) ??\n registry.headerTooltip.byType.get(type) ??\n defaults.headerTooltipTemplate ??\n registry.headerTooltip.fallback ??\n null,\n index: out.length,\n config: merged,\n getValue,\n setValue,\n formatValue,\n });\n }\n return out;\n}\n\n/** Whether a column is editable for a given row (it must also be writable). */\nexport function isColumnEditable<TRow>(column: ResolvedColumn<TRow>, row: TRow): boolean {\n if (column.setValue === null) return false;\n const editable = column.editable;\n if (typeof editable === 'function') {\n try {\n return editable(row) === true;\n } catch {\n return false;\n }\n }\n return editable === true;\n}\n","import type { GridRowKey } from '../models/data.types';\nimport { compileGetter } from './accessor';\n\n/** Returns the key of a row. */\nexport type KeyAccessor<TRow> = (row: TRow) => GridRowKey;\n\nconst identity = <TRow>(row: TRow): GridRowKey => row as GridRowKey;\n\n/** Compiles `config.primaryKey` (field, dot path or function). Without one, the row object is the key. */\nexport function compileKeyAccessor<TRow>(primaryKey: string | ((row: TRow) => GridRowKey) | null): KeyAccessor<TRow> {\n if (typeof primaryKey === 'function') return primaryKey;\n if (typeof primaryKey === 'string' && primaryKey !== '') return compileGetter(primaryKey) as KeyAccessor<TRow>;\n return identity;\n}\n\n/** A key that can't identify a row: `null`, `undefined`, `''` or `NaN`. */\nexport function isMissingKey(key: unknown): boolean {\n return key === null || key === undefined || key === '' || (typeof key === 'number' && Number.isNaN(key));\n}\n\n/** Data position of each key, built once per data version. */\nexport interface KeyIndex {\n /** Key → position in the data array (the first row wins when keys repeat). */\n readonly positions: ReadonlyMap<GridRowKey, number>;\n /** Distinct keys that occur more than once (at most 10 are listed). */\n readonly duplicates: readonly GridRowKey[];\n /** Number of distinct repeated keys (`duplicates` lists at most 10 of them). */\n readonly distinctDuplicateCount: number;\n /** Rows sharing a key with an earlier row. */\n readonly duplicateCount: number;\n /** Rows without a usable key. */\n readonly missingCount: number;\n}\n\nconst MAX_LISTED = 10;\n\n/** Builds the key index of `data` in one pass. `checkMissing` is false when rows are their own keys. */\nexport function buildKeyIndex<TRow>(data: readonly TRow[], keyOf: KeyAccessor<TRow>, checkMissing: boolean): KeyIndex {\n const positions = new Map<GridRowKey, number>();\n const duplicates: GridRowKey[] = [];\n const repeated = new Set<GridRowKey>();\n let duplicateCount = 0;\n let missingCount = 0;\n for (let i = 0; i < data.length; i++) {\n const key = keyOf(data[i]);\n if (checkMissing && isMissingKey(key)) {\n missingCount++;\n continue;\n }\n if (positions.has(key)) {\n duplicateCount++;\n if (!repeated.has(key)) {\n repeated.add(key);\n if (duplicates.length < MAX_LISTED) duplicates.push(key);\n }\n continue;\n }\n positions.set(key, i);\n }\n return { positions, duplicates, distinctDuplicateCount: repeated.size, duplicateCount, missingCount };\n}\n\n/** Human-readable description of the problems in a key index, or null when the keys are valid. */\nexport function describeKeyProblems(index: KeyIndex, primaryKey: string | null): string | null {\n const name = primaryKey ? `\"${primaryKey}\"` : 'primaryKey';\n const parts: string[] = [];\n if (index.duplicateCount > 0) {\n const shown = index.duplicates.map((k) => JSON.stringify(typeof k === 'bigint' ? String(k) : k)).join(', ');\n parts.push(`${index.duplicateCount} row(s) repeat a ${name} value (${shown}${index.duplicates.length < index.distinctDuplicateCount ? ', …' : ''})`);\n }\n if (index.missingCount > 0) parts.push(`${index.missingCount} row(s) have no ${name} value`);\n return parts.length ? `Primary keys must be unique and present: ${parts.join('; ')}.` : null;\n}\n","/**\n * Helpers for adding, updating and deleting rows: emptiness, row copies (for `oldRow` snapshots and\n * validation previews), positions and validation results.\n */\nimport type { GridAddPosition, GridRowValidationResult } from '../models/crud.types';\n\nconst UNSAFE_KEYS = new Set(['__proto__', 'constructor', 'prototype']);\n\n/** Values a `required` field doesn't accept: null, undefined, blank text, NaN and invalid dates. */\nexport function isEmptyValue(value: unknown): boolean {\n if (value === null || value === undefined) return true;\n if (typeof value === 'string') return value.trim() === '';\n if (typeof value === 'number') return Number.isNaN(value);\n if (value instanceof Date) return Number.isNaN(value.getTime());\n return false;\n}\n\n/** Objects that can be copied property by property (not dates, maps, sets or other built-ins with internal state). */\nfunction isCopyable(value: unknown): value is object {\n if (value === null || typeof value !== 'object') return false;\n return !(value instanceof Date || value instanceof Map || value instanceof Set || ArrayBuffer.isView(value));\n}\n\n/** Shallow copy that keeps the prototype, so class instances keep their methods and getters. */\nexport function shallowCopy<T>(value: T): T {\n if (Array.isArray(value)) return value.slice() as T;\n if (!isCopyable(value)) return value;\n return Object.assign(Object.create(Object.getPrototypeOf(value)), value) as T;\n}\n\n/**\n * Copy of a row in which the objects along each dot path are copied too, so that writing those paths on\n * the copy leaves the row unchanged (and the copy keeps the old values when the row is written).\n * With `oneLevel`, every object property of the row is copied as well, for custom `valueSetter`s that may\n * write into nested objects outside their field path.\n */\nexport function copyAlongPaths<T>(row: T, paths: Iterable<string>, oneLevel = false): T {\n const root = shallowCopy(row) as Record<string, unknown>;\n if (!isCopyable(root)) return row;\n const copied = new Set<string>();\n if (oneLevel) {\n for (const key of Object.keys(root)) {\n if (isCopyable(root[key])) {\n root[key] = shallowCopy(root[key]);\n copied.add(key);\n }\n }\n }\n for (const path of paths) {\n const parts = path.split('.');\n if (parts.length < 2 || parts.some((p) => UNSAFE_KEYS.has(p))) continue;\n let target: Record<string, unknown> = root;\n let prefix = '';\n for (let i = 0; i < parts.length - 1; i++) {\n const part = parts[i];\n prefix = prefix ? `${prefix}.${part}` : part;\n const child = target[part];\n if (!isCopyable(child)) break;\n if (!copied.has(prefix)) {\n target[part] = shallowCopy(child);\n copied.add(prefix);\n }\n target = target[part] as Record<string, unknown>;\n }\n }\n return root as T;\n}\n\n/** Data index for a new row. */\nexport function resolveAddPosition(position: GridAddPosition | undefined, fallback: 'top' | 'bottom', length: number): number {\n const p = position ?? fallback;\n if (p === 'top') return 0;\n if (p === 'bottom') return length;\n if (typeof p === 'number' && Number.isFinite(p)) return Math.max(0, Math.min(length, Math.floor(p)));\n return fallback === 'top' ? 0 : length;\n}\n\n/** Adds the messages of a `rowValidator` result to `errors` (`'$row'` for a row-level message). Existing messages win. */\nexport function mergeRowValidation(result: GridRowValidationResult, errors: Record<string, string>): void {\n if (!result) return;\n if (typeof result === 'string') {\n errors['$row'] ??= result;\n return;\n }\n if (typeof result !== 'object') return;\n for (const field of Object.keys(result)) {\n const message = result[field];\n if (typeof message === 'string' && message !== '') errors[field] ??= message;\n }\n}\n","import type { ResolvedColumn } from '../models/column.types';\nimport type { SortModelItem } from '../models/sort.types';\nimport { getCollator, isBlank, toBoolean, toNumber, toTimestamp } from './values';\n\nexport interface SortOptions {\n locale: string | undefined;\n nulls: 'first' | 'last';\n}\n\ninterface SortSpec {\n /** Pre-extracted sort keys by data index (numbers, or null for blanks). */\n keys: readonly (number | null)[] | null;\n /** Raw values, only for custom comparators. */\n raw: readonly unknown[] | null;\n dir: 1 | -1;\n comparator: ((a: unknown, b: unknown, rowA: any, rowB: any) => number) | null;\n}\n\n/**\n * Text keys are turned into ranks: the distinct strings are sorted once with the collator,\n * then every row compares plain numbers. For low-cardinality columns (status, country) this\n * replaces n·log(n) collator calls by u·log(u) with u = number of distinct values.\n */\nfunction textRanks(values: readonly unknown[], locale: string | undefined): (number | null)[] {\n const collator = getCollator(locale);\n const distinct = new Map<string, number>();\n const strings: (string | null)[] = new Array(values.length);\n for (let i = 0; i < values.length; i++) {\n const v = values[i];\n if (isBlank(v)) {\n strings[i] = null;\n continue;\n }\n const s = typeof v === 'string' ? v : String(v);\n strings[i] = s;\n if (!distinct.has(s)) distinct.set(s, 0);\n }\n const sorted = Array.from(distinct.keys()).sort(collator.compare);\n let rank = 0;\n for (let i = 0; i < sorted.length; i++) {\n if (i > 0 && collator.compare(sorted[i - 1], sorted[i]) !== 0) rank++;\n distinct.set(sorted[i], rank);\n }\n const ranks: (number | null)[] = new Array(values.length);\n for (let i = 0; i < strings.length; i++) {\n const s = strings[i];\n ranks[i] = s === null ? null : (distinct.get(s) as number);\n }\n return ranks;\n}\n\nfunction buildSpec<TRow>(\n data: readonly TRow[],\n column: ResolvedColumn<TRow>,\n direction: 'asc' | 'desc',\n options: SortOptions,\n): SortSpec {\n const n = data.length;\n const raw: unknown[] = new Array(n);\n const get = column.getValue;\n for (let i = 0; i < n; i++) raw[i] = get(data[i]);\n const dir = direction === 'desc' ? -1 : 1;\n const comparator = column.sort.comparator ?? null;\n if (comparator) return { keys: null, raw, dir, comparator };\n\n let keys: (number | null)[];\n switch (column.type) {\n case 'number':\n keys = raw.map(toNumber);\n break;\n case 'date':\n keys = raw.map(toTimestamp);\n break;\n case 'boolean':\n keys = raw.map((v) => {\n const b = toBoolean(v);\n return b === null ? null : b ? 1 : 0;\n });\n break;\n default:\n keys = textRanks(raw, options.locale);\n }\n return { keys, raw: null, dir, comparator: null };\n}\n\n/**\n * Returns data indexes in sorted order, or `null` when the model has no usable entry\n * (natural data order). The sort is stable; ties keep their original order.\n */\nexport function sortIndices<TRow>(\n data: readonly TRow[],\n model: readonly SortModelItem[],\n columns: ReadonlyMap<string, ResolvedColumn<TRow>>,\n options: SortOptions,\n): number[] | null {\n const specs: SortSpec[] = [];\n for (const item of model) {\n const column = columns.get(item.field);\n if (column && (item.direction === 'asc' || item.direction === 'desc')) {\n specs.push(buildSpec(data, column, item.direction, options));\n }\n }\n if (specs.length === 0) return null;\n\n const n = data.length;\n const index: number[] = new Array(n);\n for (let i = 0; i < n; i++) index[i] = i;\n const blankOrder = options.nulls === 'first' ? -1 : 1;\n\n index.sort((a, b) => {\n for (let s = 0; s < specs.length; s++) {\n const spec = specs[s];\n if (spec.comparator) {\n const c = spec.comparator((spec.raw as unknown[])[a], (spec.raw as unknown[])[b], data[a], data[b]);\n if (c) return c > 0 ? spec.dir : -spec.dir;\n continue;\n }\n const keys = spec.keys as (number | null)[];\n const ka = keys[a];\n const kb = keys[b];\n if (ka === kb) continue;\n // Blanks stay at the end (or start) for both directions, like Excel.\n if (ka === null) return blankOrder;\n if (kb === null) return -blankOrder;\n return ka < kb ? -spec.dir : spec.dir;\n }\n return a - b;\n });\n return index;\n}\n","import type { GridApi } from '../models/api.types';\nimport type { GridDataType, ResolvedColumn } from '../models/column.types';\nimport type { GridErrorEvent } from '../models/events.types';\nimport type { FilterModel } from '../models/filter.types';\nimport type { SortModelItem } from '../models/sort.types';\nimport type {\n GridSummaryContext,\n GridSummaryHelpers,\n GridSummaryResult,\n GridSummaryType,\n} from '../models/summary.types';\nimport { getNumberFormat } from './format';\nimport { getCollator, isBlank, toNumber, toTimestamp } from './values';\n\nfunction sum(values: readonly unknown[]): number {\n let total = 0;\n for (let i = 0; i < values.length; i++) {\n const n = toNumber(values[i]);\n if (n !== null) total += n;\n }\n return total;\n}\n\nfunction avg(values: readonly unknown[]): number | null {\n let total = 0;\n let count = 0;\n for (let i = 0; i < values.length; i++) {\n const n = toNumber(values[i]);\n if (n !== null) {\n total += n;\n count++;\n }\n }\n return count === 0 ? null : total / count;\n}\n\nfunction count(values: readonly unknown[]): number {\n let c = 0;\n for (let i = 0; i < values.length; i++) if (!isBlank(values[i])) c++;\n return c;\n}\n\n/**\n * Min/max that understands numbers, dates (returns a Date) and text (collator order).\n * Without a column type, the kind is taken from the first non-blank value.\n */\nfunction extreme(values: readonly unknown[], sign: 1 | -1, type?: GridDataType): unknown {\n let mode: 'number' | 'date' | 'text' | null =\n type === 'date' ? 'date' : type === 'number' || type === 'boolean' ? 'number' : type === 'text' ? 'text' : null;\n let bestNumber = 0;\n let bestText = '';\n let found = false;\n const collator = getCollator(undefined);\n for (let i = 0; i < values.length; i++) {\n const v = values[i];\n if (isBlank(v)) continue;\n if (mode === null) {\n mode = v instanceof Date ? 'date' : typeof v === 'string' ? 'text' : toNumber(v) !== null ? 'number' : 'text';\n }\n if (mode === 'text') {\n const s = String(v);\n if (!found || collator.compare(s, bestText) * sign > 0) {\n bestText = s;\n found = true;\n }\n continue;\n }\n const n = mode === 'date' ? toTimestamp(v) : toNumber(v);\n if (n === null) continue;\n if (!found || (n - bestNumber) * sign > 0) {\n bestNumber = n;\n found = true;\n }\n }\n if (!found) return null;\n return mode === 'date' ? new Date(bestNumber) : mode === 'number' ? bestNumber : bestText;\n}\n\nexport const SUMMARY_HELPERS: GridSummaryHelpers = {\n sum,\n avg,\n count,\n min: (values) => extreme(values, -1),\n max: (values) => extreme(values, 1),\n};\n\nfunction builtIn(type: GridSummaryType, values: readonly unknown[], columnType: GridDataType): unknown {\n switch (type) {\n case 'sum':\n return sum(values);\n case 'avg':\n return avg(values);\n case 'count':\n return count(values);\n case 'min':\n return extreme(values, -1, columnType);\n case 'max':\n return extreme(values, 1, columnType);\n }\n}\n\nexport interface SummaryInput<TRow> {\n data: readonly TRow[];\n /** Rows after filtering (and sorting). */\n rows: readonly TRow[];\n columns: readonly ResolvedColumn<TRow>[];\n /** Edit counter per field; a summary is recalculated only when its fields changed. */\n fieldVersion: (field: string) => number;\n /** Increases on every edit; used for custom summaries without `dependsOn`. */\n editVersion: number;\n /** Changes on `recalculateSummary()` for the given field (or all fields). */\n forceVersion: (field: string) => string;\n api: GridApi<TRow>;\n filterModel: FilterModel;\n sortModel: readonly SortModelItem[];\n locale: string | undefined;\n onError?: (event: GridErrorEvent) => void;\n}\n\ninterface CacheEntry {\n deps: readonly unknown[];\n result: GridSummaryResult;\n}\n\nfunction sameDeps(a: readonly unknown[], b: readonly unknown[]): boolean {\n if (a.length !== b.length) return false;\n for (let i = 0; i < a.length; i++) if (a[i] !== b[i]) return false;\n return true;\n}\n\n/**\n * Calculates column summaries with a per-column cache. A column is recalculated only when\n * its rows, its column definition, or the fields it depends on changed, so editing one cell\n * recalculates one summary instead of all of them.\n */\nexport class SummaryEngine<TRow> {\n private cache = new Map<string, CacheEntry>();\n\n compute(input: SummaryInput<TRow>): Record<string, GridSummaryResult> {\n const results: Record<string, GridSummaryResult> = {};\n const byField = new Map<string, ResolvedColumn<TRow>>();\n for (const c of input.columns) if (c.summary) byField.set(c.field, c);\n const inProgress = new Set<string>();\n\n const evaluate = (field: string): GridSummaryResult | undefined => {\n const existing = results[field];\n if (existing) return existing;\n const column = byField.get(field);\n if (!column || !column.summary) return undefined;\n if (inProgress.has(field)) return undefined; // circular formula\n const summary = column.summary;\n const scopeRows = summary.scope === 'all' ? input.data : input.rows;\n const deps: unknown[] = [scopeRows, column, input.forceVersion(field)];\n if (summary.type === 'custom') {\n if (summary.dependsOn) for (const f of summary.dependsOn) deps.push(input.fieldVersion(f));\n else deps.push(input.editVersion);\n deps.push(input.data);\n } else {\n deps.push(input.fieldVersion(field));\n }\n const cached = this.cache.get(field);\n if (cached && sameDeps(cached.deps, deps)) {\n results[field] = cached.result;\n return cached.result;\n }\n\n inProgress.add(field);\n const get = column.getValue;\n let valuesCache: unknown[] | null = null;\n const values = (): unknown[] => {\n if (!valuesCache) {\n valuesCache = new Array(scopeRows.length);\n for (let i = 0; i < scopeRows.length; i++) valuesCache[i] = get(scopeRows[i]);\n }\n return valuesCache;\n };\n\n let value: unknown = null;\n let error: unknown = null;\n try {\n if (summary.type === 'custom' && summary.fn) {\n const ctx: GridSummaryContext<TRow> = {\n data: input.data,\n rows: scopeRows,\n get values() {\n return values();\n },\n column,\n field,\n api: input.api,\n scope: summary.scope,\n filterModel: input.filterModel,\n sortModel: input.sortModel,\n getSummary: (other: string) => evaluate(other)?.value,\n fn: SUMMARY_HELPERS,\n };\n value = summary.fn(ctx);\n } else if (summary.type !== 'custom') {\n value = builtIn(summary.type, values(), column.type);\n }\n } catch (e) {\n error = e;\n value = null;\n input.onError?.({ source: 'summary', field, error: e });\n }\n inProgress.delete(field);\n\n const result: GridSummaryResult = {\n field,\n value,\n formattedValue: error ? '#ERROR' : this.format(value, column, input.locale),\n label: summary.label,\n error,\n };\n this.cache.set(field, { deps, result });\n results[field] = result;\n return result;\n };\n\n for (const field of byField.keys()) evaluate(field);\n for (const field of Array.from(this.cache.keys())) if (!byField.has(field)) this.cache.delete(field);\n return results;\n }\n\n clear(): void {\n this.cache.clear();\n }\n\n private format(value: unknown, column: ResolvedColumn<TRow>, locale: string | undefined): string {\n const summary = column.summary;\n if (summary?.formatter) {\n try {\n return summary.formatter(value, column);\n } catch {\n return '#ERROR';\n }\n }\n if (value === null || value === undefined) return '';\n if (summary?.type === 'count') return getNumberFormat(locale, { maximumFractionDigits: 0 }).format(value as number);\n if (typeof value === 'number') {\n return column.type === 'number' ? column.formatValue(value) : getNumberFormat(locale).format(value);\n }\n if (value instanceof Date) return column.type === 'date' ? column.formatValue(value) : value.toLocaleDateString(locale);\n return String(value);\n }\n}\n","import type { GridApi, GridColumnState, GridScrollPosition, VirtualizationState } from '../models/api.types';\nimport type { GridRowKey } from '../models/data.types';\nimport type { ColumnFilterModel, FilterCondition } from '../models/filter.types';\nimport type { SortDirection, SortModelItem } from '../models/sort.types';\nimport type { ResolvedColumnSummary } from '../models/summary.types';\nimport type { GridStore } from './grid-store';\n\nconst EMPTY_VIRTUALIZATION: VirtualizationState = {\n rowVirtualization: true,\n columnVirtualization: true,\n totalRows: 0,\n totalColumns: 0,\n firstVisibleRow: -1,\n lastVisibleRow: -1,\n firstRenderedRow: -1,\n lastRenderedRow: -1,\n firstVisibleColumn: -1,\n lastVisibleColumn: -1,\n firstRenderedColumn: -1,\n lastRenderedColumn: -1,\n renderedRowCount: 0,\n renderedColumnCount: 0,\n renderedCellCount: 0,\n scrollTop: 0,\n scrollLeft: 0,\n viewportWidth: 0,\n viewportHeight: 0,\n rowHeight: 0,\n totalHeight: 0,\n totalWidth: 0,\n scrollScale: 1,\n};\n\nfunction isCondition(value: ColumnFilterModel | FilterCondition): value is FilterCondition {\n return typeof (value as FilterCondition).operator === 'string';\n}\n\n/** Builds the public API object on top of the store. */\nexport function createGridApi<TRow>(store: GridStore<TRow>): GridApi<TRow> {\n const visibleRange = () => {\n const state = store.viewport?.getVirtualizationState();\n return state ?? null;\n };\n\n const scrollToSelection = (key: GridRowKey, scroll: boolean | undefined) => {\n if (!(scroll ?? store.config().selection.scrollToSelection)) return;\n const index = store.viewIndexOfKey(key);\n if (index >= 0) store.viewport?.scrollToRow(index, 'auto');\n };\n\n const api: GridApi<TRow> = {\n getConfig: () => store.config(),\n getColumns: () => store.columns(),\n getColumn: (field) => store.columnsByField().get(field),\n getDisplayedColumns: () => store.layout().columns.map((lc) => lc.col),\n getVisibleColumns: () => {\n const state = visibleRange();\n const columns = store.layout().columns;\n if (!state || state.firstVisibleColumn < 0) return [];\n return columns.slice(state.firstVisibleColumn, state.lastVisibleColumn + 1).map((lc) => lc.col);\n },\n getColumnState: () => {\n const sort = store.sortModel();\n const filter = store.filterModel();\n return store.layout().columns.map(\n (lc): GridColumnState => {\n const sortIndex = sort.findIndex((s) => s.field === lc.key);\n return {\n field: lc.key,\n width: lc.width,\n left: lc.left,\n index: lc.index,\n hidden: false,\n sort: sortIndex >= 0 ? sort[sortIndex].direction : null,\n sortIndex: sortIndex >= 0 ? sortIndex + 1 : null,\n filterActive: filter[lc.key] !== undefined,\n };\n },\n );\n },\n getColumnWidth: (field) => store.columnWidth(field),\n getData: () => store.data(),\n getDisplayedRows: () => store.viewRows(),\n getVisibleRows: () => {\n const state = visibleRange();\n if (!state || state.firstVisibleRow < 0) return [];\n return store.viewRows().slice(state.firstVisibleRow, state.lastVisibleRow + 1);\n },\n getRow: (rowIndex) => store.viewRows()[rowIndex],\n getRowKey: (row) => store.keyOf()(row),\n getRowByKey: (key) => store.rowByKey(key),\n getRowIndexByKey: (key) => store.viewIndexOfKey(key),\n getFilterModel: () => store.filterModel(),\n getSortModel: () => store.sortModel(),\n getSummaryConfig: () => {\n const config = store.config().summary;\n const columns: Record<string, ResolvedColumnSummary<TRow>> = {};\n for (const c of store.summaryColumns()) if (c.summary) columns[c.field] = c.summary;\n return { enabled: store.summaryVisible(), sticky: config.sticky, scope: config.scope, columns };\n },\n getSummaryValues: () => store.summaries(),\n getVirtualizationState: () => store.viewport?.getVirtualizationState() ?? EMPTY_VIRTUALIZATION,\n getEditState: () => store.getEditState(),\n\n applyFilter: (field, filter) => {\n if (filter === null) store.setColumnFilter(field, null);\n else store.setColumnFilter(field, isCondition(filter) ? { conditions: [filter] } : filter);\n },\n setFilterModel: (model) => store.setFilterModel(model),\n clearFilter: (field) => store.clearFilter(field),\n clearAllFilters: () => store.clearFilter(),\n isFiltered: (field) => (field === undefined ? Object.keys(store.filterModel()).length > 0 : store.filterModel()[field] !== undefined),\n getDisplayedRowCount: () => store.rowCount(),\n openFilter: (field) => store.openFilterPopup(field, null),\n closeFilter: () => store.closeFilterPopup(),\n\n applySort: ((fieldOrModel: string | readonly SortModelItem[], direction?: SortDirection, options?: { multi?: boolean }) => {\n if (typeof fieldOrModel === 'string') store.applySort(fieldOrModel, direction ?? 'asc', options?.multi === true);\n else store.setSortModel(fieldOrModel);\n }) as GridApi<TRow>['applySort'],\n clearSort: (field) => store.clearSort(field),\n\n setData: (data, options) => store.setData(data, options),\n updateData: (data, options) => store.setData(data, options),\n refreshData: (options) => store.refreshData(options),\n refresh: () => store.refresh(),\n updateCell: (rowIndex, field, value) => store.updateCell(rowIndex, field, value),\n refreshRows: (rows) => store.refreshRows(rows),\n\n enterEditMode: (rowIndex, field) => {\n const ok = store.startEdit(rowIndex, field);\n if (ok) store.viewport?.scrollToRow(rowIndex, 'auto');\n return ok;\n },\n exitEditMode: (options) => {\n if (options?.commit === false) {\n store.cancelEdit();\n return true;\n }\n return store.commitEdit();\n },\n isEditing: () => store.editSession() !== null || store.gridEditMode(),\n setGridEditMode: (enabled) => store.setGridEditMode(enabled),\n isGridEditMode: () => store.gridEditMode(),\n\n addRow: (row, options) => store.addRow(row, options, 'api'),\n beginAddRow: (options) => store.beginAddRow(options),\n updateRow: (key, changes) => store.updateRow(key, changes as Readonly<Record<string, unknown>>),\n deleteRow: (key) => store.deleteRows([key], 'api'),\n deleteRows: (keys) => store.deleteRows(keys, 'api'),\n requestDeleteRows: (keys) => store.requestDelete(keys, 'api'),\n deleteSelectedRows: () => store.requestDelete([...store.selection().keys()], 'api'),\n getPendingChanges: () => store.getPendingChanges(),\n hasPendingChanges: () => store.hasPendingChanges(),\n saveChanges: (handler) => store.saveChanges(handler),\n cancelChanges: () => store.cancelChanges(),\n undo: () => store.undo(),\n redo: () => store.redo(),\n canUndo: () => store.canUndo(),\n canRedo: () => store.canRedo(),\n\n selectRowByKey: (key, options) => {\n const changed = store.selectKeys([key], 'api') > 0;\n if (changed) scrollToSelection(key, options?.scroll);\n return changed;\n },\n deselectRowByKey: (key) => store.deselectKeys([key], 'api') > 0,\n selectRowsByKeys: (keys, options) => {\n const count = store.selectKeys(keys, 'api');\n if (count > 0 && keys.length > 0) scrollToSelection(keys[0], options?.scroll);\n return count;\n },\n deselectRowsByKeys: (keys) => store.deselectKeys(keys, 'api'),\n toggleRowSelection: (key) => {\n if (store.selection().has(key)) store.deselectKeys([key], 'api');\n else store.selectKeys([key], 'api');\n return store.selection().has(key);\n },\n selectAll: (options) => store.selectAll('api', options?.scope),\n deselectAll: (options) => store.deselectAll('api', options?.scope ?? 'all'),\n clearSelection: () => {\n store.deselectAll('api', 'all');\n },\n getSelectedRows: () => [...store.selection().values()],\n getSelectedKeys: () => [...store.selection().keys()],\n isRowSelected: (key) => store.selection().has(key),\n\n getSelectedCell: () => store.getSelectedCell(),\n selectCell: (key, field, options) => store.selectCellByKey(key, field, options?.scroll === true),\n clearCellSelection: () => store.clearCellSelection(),\n\n recalculateSummary: (fields) => store.recalculateSummary(fields),\n\n scrollToRow: (rowIndex, position: GridScrollPosition = 'auto') => store.viewport?.scrollToRow(rowIndex, position),\n scrollToRowByKey: (key, position: GridScrollPosition = 'auto') => {\n const index = store.viewIndexOfKey(key);\n if (index < 0) return false;\n store.viewport?.scrollToRow(index, position);\n return true;\n },\n scrollToColumn: (field, position: GridScrollPosition = 'auto') => {\n const index = typeof field === 'number' ? field : (store.layout().byField.get(field)?.index ?? -1);\n if (index >= 0) store.viewport?.scrollToColumn(index, position);\n },\n\n setColumns: (columns) => store.setColumns(columns),\n setColumnWidth: (field, width) => store.setColumnWidth(field, width),\n resetColumnWidth: (field) => store.resetColumnWidth(field),\n setColumnVisible: (field, visible) => store.setColumnVisible(field, visible),\n\n setLoading: (loading) => store.setLoading(loading),\n isLoading: () => store.loading(),\n setError: (error) => store.setError(error),\n getError: () => store.error(),\n };\n return api;\n}\n","import { computed, Injectable, signal, untracked, type OnDestroy, type Signal } from '@angular/core';\nimport type { GridApi, GridEditState, VirtualizationState } from '../models/api.types';\nimport type { ColumnConfig, ResolvedColumn } from '../models/column.types';\nimport type { GridConfig, ResolvedGridConfig } from '../models/config.types';\nimport type {\n GridAddPosition,\n GridAddRowOptions,\n GridBeginAddRowOptions,\n GridChangeSet,\n GridCrudResult,\n GridPendingChangeEvent,\n GridPendingUpdate,\n GridSaveFailedEvent,\n GridSaveResult,\n GridRowAddedEvent,\n GridRowAddingEvent,\n GridRowDeletedEvent,\n GridRowDeletingEvent,\n GridRowUpdatedEvent,\n GridRowUpdatingEvent,\n} from '../models/crud.types';\nimport type {\n GridCellEvent,\n GridCellValueChangeEvent,\n GridRowEvent,\n GridViewportChangeEvent,\n GridColumnResizeEvent,\n GridEditEvent,\n GridErrorEvent,\n GridFilterChangeEvent,\n GridHeaderClickEvent,\n GridSortChangeEvent,\n} from '../models/events.types';\nimport type { ColumnFilterModel, FilterModel } from '../models/filter.types';\nimport type { SortDirection, SortModelItem } from '../models/sort.types';\nimport type { GridSummaryResult } from '../models/summary.types';\nimport type {\n GridRowKey,\n GridDataRefreshEvent,\n GridDataRefreshReason,\n GridLoadingChangeEvent,\n GridRefreshOptions,\n GridRefreshResult,\n} from '../models/data.types';\nimport type {\n GridCellSelectionChangeEvent,\n GridCellSelectionSource,\n GridRowSelectionEvent,\n GridSelectedCell,\n GridSelectionChangeEvent,\n GridSelectionClearedEvent,\n GridSelectionClickEvent,\n GridSelectionSource,\n} from '../models/selection.types';\nimport { compileGetter, compileSetter } from '../core/accessor';\nimport { isColumnEditable, resolveColumns, resolveConfig } from '../core/config-resolver';\nimport { buildKeyIndex, compileKeyAccessor, describeKeyProblems, isMissingKey, type KeyIndex } from '../core/keys';\nimport { copyAlongPaths, isEmptyValue, mergeRowValidation, resolveAddPosition } from '../core/row-ops';\nimport { compileFilterModel, filterIndices, normalizeFilterModel } from '../core/filter-engine';\nimport { sortIndices } from '../core/sort-engine';\nimport { SummaryEngine } from '../core/summary-engine';\nimport { EMPTY_TEMPLATE_REGISTRY, type TemplateRegistry } from '../core/template-registry';\nimport { dayKey, toBoolean, toNumber, toTimestamp } from '../core/values';\nimport { createGridApi } from './grid-api';\n\n/** One displayed column with its current position. */\nexport interface LayoutColumn<TRow = any> {\n readonly key: string;\n readonly col: ResolvedColumn<TRow>;\n /** Position among displayed columns. */\n readonly index: number;\n /** Position among displayed columns that have a display template, or -1 (see the row component). */\n readonly templateIndex: number;\n /** Position among displayed columns that have a header template, or -1. */\n readonly headerTemplateIndex: number;\n /** Position among displayed columns that have a summary template, or -1. */\n readonly summaryTemplateIndex: number;\n readonly left: number;\n readonly width: number;\n}\n\nexport interface ColumnLayout<TRow = any> {\n readonly columns: readonly LayoutColumn<TRow>[];\n readonly offsets: readonly number[];\n /** Width of every column plus the pinned regions. */\n readonly totalWidth: number;\n readonly byField: ReadonlyMap<string, LayoutColumn<TRow>>;\n /** Pinned region at the left (the selection checkboxes); data columns start after it. */\n readonly leadingWidth: number;\n /** Pinned region at the right (the action column). */\n readonly trailingWidth: number;\n /** Added to a column's position for `aria-colindex` (the checkbox column is column 1). */\n readonly ariaColOffset: number;\n}\n\n/** Mutable edit session (drafts are stored here, not in the DOM, so they survive row recycling). */\nexport interface EditSession<TRow = any> {\n row: TRow;\n /** View index of the row (-1 for the inline add row). */\n rowIndex: number;\n mode: 'cell' | 'row';\n fields: string[];\n focusField: string;\n values: Record<string, unknown>;\n original: Record<string, unknown>;\n errors: Record<string, string | null>;\n /** The inline add row: `row` is a draft that isn't in the data yet. */\n isNew: boolean;\n /** Where the add row is shown and the row is added (add row only). */\n position: 'top' | 'bottom';\n}\n\n/** An open delete confirmation (built-in dialog or `infiGridDeleteConfirm` template). */\nexport interface DeleteRequest<TRow = any> {\n readonly rows: readonly TRow[];\n readonly keys: readonly GridRowKey[];\n readonly source: 'ui' | 'api' | 'keyboard';\n confirm(): void;\n cancel(): void;\n}\n\n/** Implemented by the viewport; lets the API scroll and read what is rendered. */\nexport interface ViewportHandle {\n scrollToRow(rowIndex: number, position: 'auto' | 'start' | 'center' | 'end'): void;\n scrollToColumn(columnIndex: number, position: 'auto' | 'start' | 'center' | 'end'): void;\n getVirtualizationState(): VirtualizationState;\n focus(): void;\n /** Moves the focus to a cell (with `cellSelection`, also the selected cell; `source` defaults to `'api'`). */\n focusCell(rowIndex: number, field: string, source?: GridCellSelectionSource): void;\n}\n\n/** Implemented by the filter popup service. */\nexport interface FilterPopupHandle {\n open(field: string, anchor: HTMLElement | null): void;\n close(): void;\n isOpen(): boolean;\n}\n\nexport type GridListenedEvent =\n | 'cellClick'\n | 'cellDoubleClick'\n | 'rowClick'\n | 'rowDoubleClick'\n | 'viewportChange'\n | 'selectionClick'\n | 'headerClick'\n | 'cellContextMenu'\n | 'cellMouseEnter'\n | 'cellMouseLeave'\n | 'cellSelectionChange';\n\n/** Callbacks wired to the component outputs. */\nexport interface GridEventSink<TRow> {\n /** Whether the host listens to a frequent event (avoids entering the zone for nothing). */\n listens?(name: GridListenedEvent): boolean;\n cellClick?(e: GridCellEvent<TRow>): void;\n cellDoubleClick?(e: GridCellEvent<TRow>): void;\n rowClick?(e: GridRowEvent<TRow>): void;\n rowDoubleClick?(e: GridRowEvent<TRow>): void;\n headerClick?(e: GridHeaderClickEvent<TRow>): void;\n cellContextMenu?(e: GridCellEvent<TRow>): void;\n cellMouseEnter?(e: GridCellEvent<TRow>): void;\n cellMouseLeave?(e: GridCellEvent<TRow>): void;\n viewportChange?(e: GridViewportChangeEvent): void;\n sortChange?(e: GridSortChangeEvent): void;\n filterChange?(e: GridFilterChangeEvent): void;\n cellValueChange?(e: GridCellValueChangeEvent<TRow>): void;\n editStart?(e: GridEditEvent<TRow>): void;\n editCommit?(e: GridEditEvent<TRow>): void;\n editCancel?(e: GridEditEvent<TRow>): void;\n columnResize?(e: GridColumnResizeEvent<TRow>): void;\n gridError?(e: GridErrorEvent): void;\n dataRefresh?(e: GridDataRefreshEvent): void;\n loadingChange?(e: GridLoadingChangeEvent): void;\n selectionChange?(e: GridSelectionChangeEvent<TRow>): void;\n rowSelected?(e: GridRowSelectionEvent<TRow>): void;\n rowDeselected?(e: GridRowSelectionEvent<TRow>): void;\n selectionCleared?(e: GridSelectionClearedEvent<TRow>): void;\n selectionClick?(e: GridSelectionClickEvent<TRow>): void;\n cellSelectionChange?(e: GridCellSelectionChangeEvent<TRow>): void;\n rowAdding?(e: GridRowAddingEvent<TRow>): void;\n rowAdded?(e: GridRowAddedEvent<TRow>): void;\n rowUpdating?(e: GridRowUpdatingEvent<TRow>): void;\n rowUpdated?(e: GridRowUpdatedEvent<TRow>): void;\n rowDeleting?(e: GridRowDeletingEvent<TRow>): void;\n rowDeleted?(e: GridRowDeletedEvent<TRow>): void;\n /** The data array after an add or delete (for `[(data)]`). */\n dataChange?(data: readonly TRow[]): void;\n changesSaved?(e: GridChangeSet<TRow>): void;\n changesCancelled?(e: GridChangeSet<TRow>): void;\n changesSaveFailed?(e: GridSaveFailedEvent<TRow>): void;\n pendingChange?(e: GridPendingChangeEvent): void;\n}\n\nexport interface GridInputs<TRow> {\n data: Signal<readonly TRow[] | null | undefined>;\n columns: Signal<readonly ColumnConfig<TRow>[] | null | undefined>;\n config: Signal<GridConfig<TRow> | null | undefined>;\n loading: Signal<boolean>;\n error: Signal<unknown>;\n registry: Signal<TemplateRegistry>;\n}\n\nconst EMPTY_ARRAY: readonly never[] = [];\nconst EMPTY_SELECTION: ReadonlyMap<GridRowKey, any> = new Map();\nconst EMPTY_SET: ReadonlySet<any> = new Set();\nconst EMPTY_MAP: ReadonlyMap<any, any> = new Map();\n\n/** A row added in batch mode, not in the data until saved. */\ninterface PendingAdd<TRow> {\n readonly row: TRow;\n readonly key: GridRowKey;\n /** Where it goes when saved; `'bottom'` rows are shown last, the others first. */\n readonly position: GridAddPosition;\n}\n\n/** Pending values of a data row in batch mode. */\ninterface PendingUpdate<TRow> {\n /** The data row (unchanged until saved). */\n row: TRow;\n readonly key: GridRowKey;\n /** Field → pending value. */\n values: Map<string, unknown>;\n /** Field → value in the data when it was first changed. */\n original: Map<string, unknown>;\n /** A column with a custom `valueSetter` changed: copies go one level deeper. */\n custom: boolean;\n}\n\n/** One undoable step of batch mode. */\ninterface BatchStep {\n undo(): void;\n redo(): void;\n}\n\n/** The rendering state of a row in batch mode. */\nexport interface RowChangeState {\n readonly kind: 'added' | 'modified' | 'deleted';\n /** Changed fields (modified rows). */\n readonly fields: ReadonlyMap<string, unknown> | null;\n}\n\nconst ADDED_STATE: RowChangeState = { kind: 'added', fields: null };\nconst DELETED_STATE: RowChangeState = { kind: 'deleted', fields: null };\nconst EMPTY_CHANGES: GridChangeSet<any> = {\n added: [],\n addedKeys: [],\n updated: [],\n updatedKeys: [],\n deleted: [],\n deletedKeys: [],\n count: 0,\n};\n\n/** Waits for a save handler's result: a Promise, an Observable (until it completes) or a plain value. */\nfunction settle(result: unknown): Promise<unknown> {\n if (result !== null && typeof result === 'object' && typeof (result as { subscribe?: unknown }).subscribe === 'function') {\n return new Promise((resolve, reject) => {\n let last: unknown;\n (result as { subscribe(o: object): unknown }).subscribe({\n next: (value: unknown) => (last = value),\n error: reject,\n complete: () => resolve(last),\n });\n });\n }\n return Promise.resolve(result);\n}\n\n/** Rows added and removed by one selection operation. */\ninterface SelectionDelta<TRow> {\n addedKeys: GridRowKey[];\n addedRows: TRow[];\n removedKeys: GridRowKey[];\n removedRows: TRow[];\n}\n\n/** A selection gesture (click, checkbox, key) worked out before it is applied, so `selectionClick` can cancel it. */\nexport interface SelectionPlan<TRow> {\n row: TRow;\n key: GridRowKey;\n selecting: boolean;\n apply(): void;\n}\n\n/** Memoizes a function's result (event collections are only built when read). */\nfunction lazy<T>(fn: () => T): () => T {\n let done = false;\n let value: T;\n return () => {\n if (!done) {\n value = fn();\n done = true;\n }\n return value;\n };\n}\n\nfunction firstEntry<K, V>(map: ReadonlyMap<K, V>): [K, V] | null {\n for (const entry of map) return entry;\n return null;\n}\n\n/** Equality used to skip no-op edits (dates compare by time, not by object). */\nfunction sameValue(a: unknown, b: unknown): boolean {\n if (Object.is(a, b)) return true;\n if (a instanceof Date && b instanceof Date) return a.getTime() === b.getTime();\n return false;\n}\nconst EMPTY_SUMMARIES: Readonly<Record<string, GridSummaryResult>> = {};\n\n/** Copies an options object without its `undefined` properties (so they don't override defaults). */\nfunction stripUndefinedProps<T extends object>(value: T | undefined): Partial<T> {\n const out: Partial<T> = {};\n if (!value) return out;\n for (const key of Object.keys(value) as (keyof T)[]) if (value[key] !== undefined) out[key] = value[key];\n return out;\n}\n\n/**\n * A value that follows its input but can be overridden through the API\n * until the input itself changes (like a `linkedSignal`).\n */\nfunction overridable<T>(source: () => T): { value: Signal<T>; set(value: T): void } {\n const override = signal<{ source: T; value: T } | null>(null, { equal: () => false });\n const value = computed(() => {\n const s = source();\n const o = override();\n return o !== null && Object.is(o.source, s) ? o.value : s;\n });\n return { value, set: (v: T) => override.set({ source: untracked(source), value: v }) };\n}\n\n/**\n * Per-grid state. Configuration, data, sort and filter state are signals; the row pipeline is\n * `data → sort (indexes) → filter (keeps sort order) → view rows`. Changing a filter never re-sorts,\n * and editing a cell never re-sorts or re-filters (call `refresh()` for that).\n */\n@Injectable()\nexport class GridStore<TRow = any> implements OnDestroy {\n readonly api: GridApi<TRow> = createGridApi(this);\n events: GridEventSink<TRow> = {};\n viewport: ViewportHandle | null = null;\n filterPopup: FilterPopupHandle | null = null;\n /**\n * `virtualization.syncScroll`: where the pinned regions (checkbox and action columns) are placed inside their row,\n * header, filter or summary row (`left` of the start and end regions), or null without syncScroll (they are sticky).\n * A plain object, not a signal: the viewport updates it and the regions already drawn on every sideways scroll frame\n * (without change detection); rows read it when they are drawn.\n */\n pinPlacement: { start: number; end: number } | null = null;\n\n private inputs: GridInputs<TRow> | null = null;\n private readonly bound = signal(false);\n\n private readonly dataState = overridable<readonly TRow[]>(() => (this.bound() ? (this.inputs!.data() ?? EMPTY_ARRAY) : EMPTY_ARRAY));\n private readonly columnState = overridable<readonly ColumnConfig<TRow>[]>(() =>\n this.bound() ? (this.inputs!.columns() ?? EMPTY_ARRAY) : EMPTY_ARRAY,\n );\n private readonly loadingState = overridable<boolean>(() => (this.bound() ? this.inputs!.loading() === true : false));\n private readonly errorState = overridable<unknown>(() => (this.bound() ? this.inputs!.error() : null));\n\n readonly data = this.dataState.value;\n readonly loading = this.loadingState.value;\n readonly error = this.errorState.value;\n\n readonly config: Signal<ResolvedGridConfig<TRow>> = computed(() =>\n resolveConfig(this.bound() ? this.inputs!.config() : null),\n );\n private readonly registry = computed(() => (this.bound() ? this.inputs!.registry() : EMPTY_TEMPLATE_REGISTRY));\n\n readonly columns: Signal<readonly ResolvedColumn<TRow>[]> = computed(() => {\n const columns = resolveColumns(this.columnState.value(), this.config(), this.registry(), (e) => this.reportError(e));\n if (!this.config().editing.batch) return columns;\n // Batch mode: values are read from the copy of the row with its pending values (one map lookup).\n return columns.map((column) => {\n const read = column.getValue;\n return { ...column, getValue: (row: TRow) => read(this.mergedRows.size === 0 ? row : (this.mergedRows.get(row) ?? row)) };\n });\n });\n readonly columnsByField = computed(() => new Map(this.columns().map((c) => [c.field, c] as const)));\n\n // ----- row identity -----\n\n /** The configured primary key (compared by value, so a new config object doesn't rebuild the index). */\n private readonly primaryKey = computed(() => this.config().primaryKey);\n /** Key of a row: the primary key value, or the row object itself without a primary key. */\n readonly keyOf = computed(() => compileKeyAccessor<TRow>(this.primaryKey()));\n readonly hasPrimaryKey = computed(() => this.primaryKey() !== null);\n\n private readonly widthOverrides = signal<ReadonlyMap<string, number>>(new Map());\n private readonly visibilityOverrides = signal<ReadonlyMap<string, boolean>>(new Map());\n\n /** Width of the pinned checkbox column (0 without one). A number, so other config changes keep the layout. */\n private readonly leadingWidth = computed(() => {\n const selection = this.config().selection;\n return selection.mode !== 'none' && selection.checkbox ? selection.checkboxWidth : 0;\n });\n /** Width of the pinned action column (0 without one). */\n private readonly trailingWidth = computed(() => this.config().editing.actionColumn?.width ?? 0);\n\n readonly layout: Signal<ColumnLayout<TRow>> = computed(() => {\n const widths = this.widthOverrides();\n const visibility = this.visibilityOverrides();\n const leadingWidth = this.leadingWidth();\n const trailingWidth = this.trailingWidth();\n const columns: LayoutColumn<TRow>[] = [];\n const offsets: number[] = [];\n const byField = new Map<string, LayoutColumn<TRow>>();\n let x = leadingWidth;\n let templated = 0;\n let headerTemplated = 0;\n let summaryTemplated = 0;\n for (const col of this.columns()) {\n const visible = visibility.get(col.field) ?? !col.hidden;\n if (!visible) continue;\n const override = widths.get(col.field);\n const width = override === undefined ? col.width : Math.min(col.maxWidth, Math.max(col.minWidth, override));\n const templateIndex = col.displayTemplate ? templated++ : -1;\n const headerTemplateIndex = col.headerTemplate ? headerTemplated++ : -1;\n const summaryTemplateIndex = col.summaryTemplate ? summaryTemplated++ : -1;\n const lc: LayoutColumn<TRow> = {\n key: col.field,\n col,\n index: columns.length,\n templateIndex,\n headerTemplateIndex,\n summaryTemplateIndex,\n left: x,\n width,\n };\n columns.push(lc);\n offsets.push(x);\n byField.set(col.field, lc);\n x += width;\n }\n return { columns, offsets, totalWidth: x + trailingWidth, byField, leadingWidth, trailingWidth, ariaColOffset: leadingWidth > 0 ? 1 : 0 };\n });\n\n /**\n * Height of the filter row (`filtering.mode` `'row'` or `'both'`): `filtering.rowHeight` while a displayed column\n * is filterable, else 0. With filtering off there is no empty row under the header.\n */\n readonly filterRowHeight = computed(() => {\n const filtering = this.config().filtering;\n if (filtering.mode === 'menu') return 0;\n return this.layout().columns.some((lc) => lc.col.filterable) ? filtering.rowHeight : 0;\n });\n\n readonly sortModel = signal<readonly SortModelItem[]>([]);\n readonly filterModel = signal<FilterModel>({});\n\n /** Bumped by `refresh()` to re-run sorting and filtering on mutated data. */\n private readonly structureVersion = signal(0);\n\n /** Key → data position. Lazy: built the first time something needs a key lookup. */\n readonly keyIndex = computed<KeyIndex>(() => {\n this.structureVersion();\n const data = this.data();\n const index = buildKeyIndex(data, this.keyOf(), this.hasPrimaryKey());\n this.reportKeyProblems(data, index);\n return index;\n });\n private keyReportFor: readonly TRow[] | null = null;\n /** Bumped on every edit; drives summary recalculation and row re-rendering. */\n readonly editVersion = signal(0);\n /** Bumped when every rendered row must rebuild (refresh, template changes). */\n readonly renderNonce = signal(0);\n\n private readonly rowVersions = new WeakMap<object, number>();\n private readonly fieldVersions = new Map<string, number>();\n private summaryForceAll = 0;\n private readonly summaryForce = new Map<string, number>();\n private readonly summaryNonce = signal(0);\n private readonly summaryEngine = new SummaryEngine<TRow>();\n\n /** Data indexes in sorted order, or null for the natural order. */\n readonly sortedIndices = computed<readonly number[] | null>(() => {\n this.structureVersion();\n const config = this.config();\n try {\n return sortIndices(this.data(), this.sortModel(), this.columnsByField(), {\n locale: config.locale,\n nulls: config.sorting.nulls,\n });\n } catch (error) {\n this.reportError({ source: 'sort', error });\n return null;\n }\n });\n\n /** Data indexes of the sorted and filtered data rows, or null when nothing is sorted or filtered. */\n private readonly dataViewIndices = computed<readonly number[] | null>(() => {\n const order = this.sortedIndices();\n const kept = this.keptRows();\n try {\n const predicates = compileFilterModel(this.filterModel(), this.columnsByField());\n return filterIndices(this.data(), order, predicates, kept) ?? order;\n } catch (error) {\n this.reportError({ source: 'filter', error });\n return order;\n }\n });\n\n /**\n * Data index of every displayed row in display order (-1 for pending adds of batch mode, which are shown\n * first or last), or null when the view is the data itself.\n */\n readonly viewIndices = computed<readonly number[] | null>(() => {\n const base = this.dataViewIndices();\n const top = this.pendingTop();\n const bottom = this.pendingBottom();\n if (top.length === 0 && bottom.length === 0) return base;\n const count = base === null ? this.data().length : base.length;\n const out = new Array<number>(top.length + count + bottom.length);\n let k = 0;\n for (let i = 0; i < top.length; i++) out[k++] = -1;\n for (let i = 0; i < count; i++) out[k++] = base === null ? i : base[i];\n for (let i = 0; i < bottom.length; i++) out[k++] = -1;\n return out;\n });\n\n readonly viewRows = computed<readonly TRow[]>(() => {\n const indices = this.viewIndices();\n const data = this.data();\n if (indices === null) return data;\n const top = this.pendingTop();\n const bottom = this.pendingBottom();\n const bottomStart = indices.length - bottom.length;\n const rows = new Array<TRow>(indices.length);\n for (let i = 0; i < indices.length; i++) {\n const position = indices[i];\n rows[i] = position >= 0 ? data[position] : i < top.length ? top[i] : bottom[i - bottomStart];\n }\n return rows;\n });\n\n // Both also depend on the refresh version: after an in-place change (push, splice), the arrays keep\n // their reference, so their length is only re-read when `refresh()`/`refreshData()` bumps it.\n readonly rowCount = computed(() => {\n this.structureVersion();\n return this.viewRows().length;\n });\n readonly dataLength = computed(() => {\n this.structureVersion();\n return this.data().length;\n });\n\n readonly summaryColumns = computed(() => this.columns().filter((c) => c.summary !== null));\n\n /** Rows the summaries use: the displayed rows, without the pending deletes of batch mode. */\n private readonly summaryRows = computed<readonly TRow[]>(() => {\n const rows = this.viewRows();\n const deletes = this.pendingDeletes();\n if (deletes.size === 0) return rows;\n const keyOf = this.keyOf();\n return rows.filter((row) => !deletes.has(keyOf(row)));\n });\n\n /** Rows of `scope: 'all'` summaries: the data with the pending adds and without the pending deletes. */\n private readonly summaryData = computed<readonly TRow[]>(() => {\n const rows = this.allRows();\n const deletes = this.pendingDeletes();\n if (deletes.size === 0) return rows;\n const keyOf = this.keyOf();\n return rows.filter((row) => !deletes.has(keyOf(row)));\n });\n readonly summaryVisible = computed(() => this.config().summary.enabled ?? this.summaryColumns().length > 0);\n\n /** The last summaries, returned again when every result came from the cache (the summary row doesn't re-render). */\n private lastSummaries: Readonly<Record<string, GridSummaryResult>> = EMPTY_SUMMARIES;\n\n readonly summaries = computed<Readonly<Record<string, GridSummaryResult>>>(() => {\n const columns = this.summaryColumns();\n if (columns.length === 0) return EMPTY_SUMMARIES;\n const editVersion = this.editVersion();\n this.summaryNonce();\n const next = this.summaryEngine.compute({\n data: this.summaryData(),\n rows: this.summaryRows(),\n columns,\n fieldVersion: (f) => this.fieldVersions.get(f) ?? 0,\n editVersion,\n forceVersion: (f) => `${this.summaryForceAll}.${this.summaryForce.get(f) ?? 0}`,\n api: this.api,\n filterModel: untracked(this.filterModel),\n sortModel: untracked(this.sortModel),\n locale: this.config().locale,\n onError: (e) => this.reportError(e),\n });\n const previous = this.lastSummaries;\n const fields = Object.keys(next);\n if (fields.length === Object.keys(previous).length && fields.every((f) => previous[f] === next[f])) return previous;\n this.lastSummaries = next;\n return next;\n });\n\n readonly editSession = signal<EditSession<TRow> | null>(null);\n readonly gridEditMode = signal(false);\n /** Field whose filter popup is open. */\n readonly openFilterField = signal<string | null>(null);\n\n /** Wires the component inputs. Called once by the grid component. */\n bind(inputs: GridInputs<TRow>): void {\n this.inputs = inputs;\n this.bound.set(true);\n }\n\n /** Applies `initialSort`, `initialFilter` and `gridEditMode` from the configuration. */\n applyInitialState(): void {\n const config = this.config();\n if (config.sorting.initialSort.length) this.sortModel.set([...config.sorting.initialSort]);\n const filter = normalizeFilterModel(config.filtering.initialFilter);\n if (Object.keys(filter).length) this.filterModel.set(filter);\n if (config.editing.gridEditMode) this.gridEditMode.set(true);\n }\n\n reportError(event: GridErrorEvent): void {\n this.events.gridError?.(event);\n }\n\n // ----- rows -----\n\n rowVersion(row: TRow): number {\n return typeof row === 'object' && row !== null ? (this.rowVersions.get(row as object) ?? 0) : 0;\n }\n\n private bumpRow(row: TRow): void {\n if (typeof row === 'object' && row !== null) {\n this.rowVersions.set(row as object, (this.rowVersions.get(row as object) ?? 0) + 1);\n }\n }\n\n private bumpField(field: string): void {\n this.fieldVersions.set(field, (this.fieldVersions.get(field) ?? 0) + 1);\n }\n\n /**\n * Marks what a changed field affects for summaries: the field, columns above or below it in a dot path\n * (`customer` / `customer.name`), and computed columns (their inputs are unknown).\n */\n private bumpChangedField(field: string): void {\n this.bumpField(field);\n for (const column of this.columns()) {\n const f = column.field;\n if (f === field) continue;\n if (column.config.valueGetter || f.startsWith(field + '.') || field.startsWith(f + '.')) this.bumpField(f);\n }\n }\n\n // ----- data refresh -----\n\n /** Replaces the data (the API counterpart of a new `[data]` array). */\n setData(data: readonly TRow[], options?: GridRefreshOptions): GridRefreshResult {\n this.dataState.set(data ?? EMPTY_ARRAY);\n return this.afterDataChange('setData', options, false);\n }\n\n /** Re-reads the current data after it was changed in place (push, splice, edited objects). */\n refreshData(options?: GridRefreshOptions): GridRefreshResult {\n this.structureVersion.update((v) => v + 1);\n this.summaryForceAll++;\n this.summaryNonce.update((v) => v + 1);\n this.renderNonce.update((v) => v + 1);\n return this.afterDataChange('refreshData', options, false);\n }\n\n /**\n * Called by the component when the `[data]` or `[loading]` input changed. Runs during change\n * detection, so the resulting events are emitted right after it (in a microtask).\n */\n inputsChanged(dataChanged: boolean, dataFirstChange: boolean, loadingChanged: boolean): void {\n // `[(data)]` binding back the array of an add or delete is not new data.\n if (dataChanged && !dataFirstChange && this.inputs?.data() !== this.crudData) this.afterDataChange('input', undefined, true);\n if (loadingChanged) this.syncLoading('input', true);\n }\n\n /** Applies the refresh policy and reconciles grid state with the new data. */\n afterDataChange(reason: GridDataRefreshReason, options: GridRefreshOptions | undefined, defer: boolean): GridRefreshResult {\n const policy = { ...this.config().dataRefresh, ...stripUndefinedProps(options) };\n if (this.keptRows().size > 0) this.keptRows.set(EMPTY_SET);\n this.rebasePending(defer);\n let filterReset = false;\n let sortReset = false;\n if (policy.filter === 'reset' && Object.keys(this.filterModel()).length > 0) {\n this.filterModel.set({});\n filterReset = true;\n }\n if (policy.sort === 'reset' && this.sortModel().length > 0) {\n this.sortModel.set([]);\n sortReset = true;\n }\n this.retargetEdit();\n const removedSelectionKeys = this.reconcileSelection(policy.selection === 'reset', defer);\n this.reconcileSelectedCell('dataRefresh', defer);\n if (policy.scroll === 'top') this.emit(() => this.viewport?.scrollToRow(0, 'start'), defer);\n const result: GridRefreshResult = {\n rowCount: this.data().length,\n displayedRowCount: this.rowCount(),\n removedSelectionKeys,\n filterReset,\n sortReset,\n };\n const sink = this.events;\n if (filterReset) this.emit(() => this.emitFilterChange(), defer);\n if (sortReset) this.emit(() => sink.sortChange?.({ sortModel: this.sortModel() }), defer);\n this.emit(() => sink.dataRefresh?.({ reason, ...result }), defer);\n return result;\n }\n\n /** Keeps an open edit session on the same row (found again by key), or cancels it if the row is gone. */\n private retargetEdit(): void {\n const session = this.editSession();\n if (!session || session.isNew) return;\n let row: TRow | undefined;\n if (this.hasPrimaryKey()) row = this.rowByKey(this.keyOf()(session.row));\n else if (this.data().includes(session.row)) row = session.row;\n const rowIndex = row === undefined ? -1 : this.viewRows().indexOf(row);\n if (row === undefined || rowIndex < 0) {\n this.cancelEdit(false);\n return;\n }\n if (row !== session.row || rowIndex !== session.rowIndex) this.editSession.set({ ...session, row, rowIndex });\n }\n\n /**\n * After a data change: drops selected keys whose rows are gone (and, with `onFilter: 'deselectHidden'`, rows the\n * filter now hides), or everything with `reset`. Rows that still exist keep their selection, even as new objects.\n */\n private reconcileSelection(reset: boolean, defer: boolean): readonly GridRowKey[] {\n const prev = this.selection();\n if (prev.size === 0) return EMPTY_ARRAY;\n const delta: SelectionDelta<TRow> = { addedKeys: [], addedRows: [], removedKeys: [], removedRows: [] };\n const next = new Map<GridRowKey, TRow>();\n const positions = this.keyIndex().positions;\n const data = this.data();\n const mask = this.config().selection.onFilter === 'deselectHidden' ? this.displayedMask() : null;\n let replacedObjects = false;\n const adds = this.pendingAdds();\n for (const [key, row] of prev) {\n const position = reset ? undefined : positions.get(key);\n // Pending adds of batch mode aren't in the data but are displayed (and never filtered).\n const current = position === undefined ? (reset ? undefined : adds.get(key)?.row) : data[position];\n if (current === undefined || (mask !== null && position !== undefined && mask[position] === 0)) {\n delta.removedKeys.push(key);\n delta.removedRows.push(row);\n continue;\n }\n if (current !== row) replacedObjects = true;\n next.set(key, current);\n }\n if (delta.removedKeys.length > 0) this.commitSelection(prev, next, delta, 'dataRefresh', null, null, defer);\n else if (replacedObjects) {\n this.selection.set(next); // same keys, new row objects: no event\n this.rangeBase = null; // it holds the old objects\n }\n return delta.removedKeys;\n }\n\n /** The row with this key, if it is in the data (or a pending add of batch mode). */\n rowByKey(key: GridRowKey): TRow | undefined {\n const position = this.keyIndex().positions.get(key);\n if (position !== undefined) return this.data()[position];\n return this.pendingAdds().get(key)?.row;\n }\n\n /** View index of the row with this key, or -1 when it isn't displayed. O(1) without sort/filter, else O(n). */\n viewIndexOfKey(key: GridRowKey): number {\n const top = this.pendingTop();\n const add = this.pendingAdds().get(key);\n if (add !== undefined) {\n const index = top.indexOf(add.row);\n if (index >= 0) return index;\n const bottom = this.pendingBottom();\n const fromEnd = bottom.indexOf(add.row);\n return fromEnd < 0 ? -1 : this.viewRows().length - bottom.length + fromEnd;\n }\n const position = this.keyIndex().positions.get(key);\n if (position === undefined) return -1;\n const base = this.dataViewIndices();\n const index = base === null ? position : base.indexOf(position);\n return index < 0 ? -1 : index + top.length;\n }\n\n private reportKeyProblems(data: readonly TRow[], index: KeyIndex): void {\n if (data.length === 0) return;\n const pk = this.primaryKey();\n const message = describeKeyProblems(index, typeof pk === 'string' ? pk : null);\n // Deferred: the index is often built while rendering.\n if (message) queueMicrotask(() => this.reportError({ source: 'data', error: new Error(message) }));\n }\n\n // ----- deferred events -----\n\n private deferred: (() => void)[] | null = null;\n private held: (() => void)[] | null = null;\n\n /**\n * Runs `fn` now, or right after the current change detection when the change came from an input.\n * Inside `withHeldEvents()`, synchronous events wait until the operation has updated all state.\n */\n private emit(fn: () => void, defer: boolean): void {\n if (!defer && this.held !== null) {\n this.held.push(fn);\n return;\n }\n if (!defer) {\n fn();\n return;\n }\n if (this.deferred === null) {\n this.deferred = [];\n queueMicrotask(() => {\n const queue = this.deferred ?? [];\n this.deferred = null;\n for (const run of queue) run();\n });\n }\n this.deferred.push(fn);\n }\n\n /** Runs an operation, then emits its events in order, so every handler sees the final state. */\n private withHeldEvents(fn: () => void): void {\n if (this.held !== null) {\n fn();\n return;\n }\n const queue: (() => void)[] = (this.held = []);\n try {\n fn();\n } finally {\n this.held = null;\n for (const run of queue) run();\n }\n }\n\n setColumns(columns: readonly ColumnConfig<TRow>[]): void {\n this.columnState.set(columns ?? EMPTY_ARRAY);\n this.reconcileSelectedCell('columns', false);\n }\n\n /** Called when the `[columns]` input changed (during change detection: events follow in a microtask). */\n columnsChanged(): void {\n this.reconcileSelectedCell('columns', true);\n }\n\n refresh(): void {\n this.refreshData();\n }\n\n refreshRows(rows: readonly TRow[]): void {\n for (const row of rows) this.bumpRow(row);\n this.summaryForceAll++;\n this.editVersion.update((v) => v + 1);\n }\n\n /** Writes a value into a row; re-renders only that row and recalculates only affected summaries. */\n setCellValue(row: TRow, rowIndex: number, field: string, value: unknown, source: 'edit' | 'api'): boolean {\n const column = this.columnsByField().get(field);\n if (!column || !column.setValue) {\n this.reportError({ source: 'edit', field, error: new Error(`Column \"${field}\" cannot be written`) });\n return false;\n }\n const oldValue = column.getValue(row);\n if (sameValue(oldValue, value)) return false;\n try {\n column.setValue(row, value);\n } catch (error) {\n this.reportError({ source: 'edit', field, error });\n return false;\n }\n this.bumpRow(row);\n this.bumpChangedField(field);\n this.editVersion.update((v) => v + 1);\n this.events.cellValueChange?.({ row, rowIndex, field, column, oldValue, newValue: value, source });\n return true;\n }\n\n updateCell(rowIndex: number, field: string, value: unknown): void {\n const row = this.viewRows()[rowIndex];\n if (row !== undefined) this.setCellValue(row, rowIndex, field, value, 'api');\n }\n\n // ----- sorting -----\n\n setSortModel(model: readonly SortModelItem[]): void {\n const columns = this.columnsByField();\n const seen = new Set<string>();\n const clean = model.filter((m) => {\n if (!m || !columns.has(m.field) || seen.has(m.field)) return false;\n if (m.direction !== 'asc' && m.direction !== 'desc') return false;\n seen.add(m.field);\n return true;\n });\n const max = this.config().sorting.maxSortColumns;\n this.sortModel.set(clean.slice(0, max === Infinity ? undefined : max));\n this.events.sortChange?.({ sortModel: this.sortModel() });\n }\n\n /** Header click: cycles the column's direction. `multi` adds it to the existing sort. */\n toggleSort(field: string, multi: boolean): void {\n const column = this.columnsByField().get(field);\n if (!column || !column.sortable) return;\n const config = this.config().sorting;\n const cycle = column.sort.cycle && column.sort.cycle.length ? column.sort.cycle : config.cycle;\n const model = this.sortModel();\n const current = model.find((m) => m.field === field)?.direction ?? null;\n const position = cycle.indexOf(current);\n const next = position === -1 ? cycle[0] : cycle[(position + 1) % cycle.length];\n if (multi && config.multiSort) {\n const others = model.filter((m) => m.field !== field);\n if (next === null) this.setSortModel(others);\n else if (current === null) this.setSortModel([...others, { field, direction: next }]);\n else this.setSortModel(model.map((m) => (m.field === field ? { field, direction: next } : m)));\n } else {\n this.setSortModel(next === null ? [] : [{ field, direction: next }]);\n }\n }\n\n applySort(field: string, direction: SortDirection = 'asc', multi = false): void {\n const model = this.sortModel();\n if (multi) {\n const exists = model.some((m) => m.field === field);\n this.setSortModel(\n exists ? model.map((m) => (m.field === field ? { field, direction } : m)) : [...model, { field, direction }],\n );\n } else {\n this.setSortModel([{ field, direction }]);\n }\n }\n\n clearSort(field?: string): void {\n this.setSortModel(field ? this.sortModel().filter((m) => m.field !== field) : []);\n }\n\n // ----- filtering -----\n\n setFilterModel(model: FilterModel): void {\n // Rows kept visible after being added are filtered like the others from now on.\n if (this.keptRows().size > 0) this.keptRows.set(EMPTY_SET);\n this.filterModel.set(normalizeFilterModel(model));\n this.emitFilterChange();\n this.syncSelectionWithFilter();\n }\n\n setColumnFilter(field: string, model: ColumnFilterModel | null): void {\n const next: Record<string, ColumnFilterModel> = { ...this.filterModel() };\n if (model) next[field] = model;\n else delete next[field];\n this.setFilterModel(next);\n }\n\n clearFilter(field?: string): void {\n if (field) this.setColumnFilter(field, null);\n else this.setFilterModel({});\n }\n\n private emitFilterChange(): void {\n const sink = this.events.filterChange;\n if (sink) sink({ filterModel: this.filterModel(), displayedRowCount: this.rowCount() });\n }\n\n openFilterPopup(field: string, anchor: HTMLElement | null): void {\n this.filterPopup?.open(field, anchor);\n }\n\n closeFilterPopup(): void {\n this.filterPopup?.close();\n }\n\n // ----- selection -----\n\n /** Selected rows by key, in selection order. Copy-on-write: every change creates a new map. */\n readonly selection = signal<ReadonlyMap<GridRowKey, TRow>>(EMPTY_SELECTION);\n /** Row of the last click (or Space): where Shift ranges start. */\n private selectionAnchor: GridRowKey | null = null;\n /**\n * The selection a Shift range is added to: the selection right after the click that set the anchor. Repeated Shift\n * gestures recompute the range on top of it, so the range can grow and shrink. Any other change resets it.\n */\n private rangeBase: ReadonlyMap<GridRowKey, TRow> | null = null;\n\n /** 1 for each data position that is displayed; null when every row is displayed. Cached per view. */\n readonly displayedMask = computed<Uint8Array | null>(() => {\n const indices = this.dataViewIndices();\n if (indices === null) return null;\n const mask = new Uint8Array(this.data().length);\n for (let i = 0; i < indices.length; i++) mask[indices[i]] = 1;\n return mask;\n });\n\n /** Every row: the data and, in batch mode, the pending adds. */\n private readonly allRows = computed<readonly TRow[]>(() => {\n const data = this.data();\n const adds = this.pendingAdds();\n if (adds.size === 0) return data;\n const rows = data.slice();\n for (const add of adds.values()) rows.push(add.row);\n return rows;\n });\n\n /** State of the header checkbox over the rows in `selectAllScope`. */\n readonly headerSelectionState = computed<'none' | 'some' | 'all'>(() => {\n const selection = this.selection();\n const scopeAll = this.config().selection.selectAllScope === 'all';\n const rows = scopeAll ? this.allRows() : this.viewRows();\n if (selection.size === 0 || rows.length === 0) return 'none';\n const positions = this.keyIndex().positions;\n const mask = scopeAll ? null : this.displayedMask();\n const adds = this.pendingAdds();\n let selectedInScope = 0;\n for (const key of selection.keys()) {\n const position = positions.get(key);\n if (position === undefined ? adds.has(key) : mask === null || mask[position] === 1) selectedInScope++;\n }\n if (selectedInScope === 0) return 'none';\n const check = this.config().selection.rowSelectable !== null || this.pendingDeletes().size > 0;\n const selectable = check ? this.countSelectable(rows) : rows.length;\n return selectedInScope >= selectable ? 'all' : 'some';\n });\n\n private countSelectable(rows: readonly TRow[]): number {\n let n = 0;\n for (const row of rows) if (this.isRowSelectable(row)) n++;\n return n;\n }\n\n isRowSelectable(row: TRow): boolean {\n // Rows deleted in batch mode stay visible until saved, but can't be selected.\n const deletes = this.pendingDeletes();\n if (deletes.size > 0 && deletes.has(this.keyOf()(row))) return false;\n const fn = this.config().selection.rowSelectable;\n if (!fn) return true;\n try {\n return !!fn(row);\n } catch (error) {\n this.reportError({ source: 'config', error });\n return false;\n }\n }\n\n isRowSelected(row: TRow): boolean {\n return this.selection().has(this.keyOf()(row));\n }\n\n /** Selects rows by key. `replace` replaces the selection; in single mode only the last key is kept. */\n selectKeys(keys: readonly GridRowKey[], source: GridSelectionSource, replace = false): number {\n const entries: [GridRowKey, TRow][] = [];\n for (const key of keys) {\n const row = this.rowByKey(key);\n if (row !== undefined) entries.push([key, row]);\n }\n return this.selectEntries(entries, source, replace, keys.length === 1 ? entries[0] ?? null : null);\n }\n\n /** Selects the given rows (known key and object). Returns the number of rows newly selected. */\n selectEntries(\n entries: readonly [GridRowKey, TRow][],\n source: GridSelectionSource,\n replace: boolean,\n acted: [GridRowKey, TRow] | null,\n ): number {\n const mode = this.config().selection.mode;\n if (mode === 'none') return 0;\n const usable = entries.filter(([, row]) => this.isRowSelectable(row));\n const prev = this.selection();\n const delta: SelectionDelta<TRow> = { addedKeys: [], addedRows: [], removedKeys: [], removedRows: [] };\n let next: Map<GridRowKey, TRow>;\n if (mode === 'single' || replace) {\n const chosen = mode === 'single' ? usable.slice(-1) : usable;\n if (chosen.length === 0 && !replace) return 0;\n next = new Map(chosen);\n for (const [key, row] of prev) {\n if (!next.has(key)) {\n delta.removedKeys.push(key);\n delta.removedRows.push(row);\n }\n }\n for (const [key, row] of next) {\n if (!prev.has(key)) {\n delta.addedKeys.push(key);\n delta.addedRows.push(row);\n }\n }\n } else {\n next = new Map(prev);\n for (const [key, row] of usable) {\n if (next.has(key)) continue;\n next.set(key, row);\n delta.addedKeys.push(key);\n delta.addedRows.push(row);\n }\n }\n if (!this.commitSelection(prev, next, delta, source, acted?.[1] ?? null, acted?.[0] ?? null, false)) return 0;\n if (acted) this.selectionAnchor = acted[0];\n return delta.addedKeys.length;\n }\n\n /** Deselects rows by key. Returns the number of rows deselected. */\n deselectKeys(keys: Iterable<GridRowKey>, source: GridSelectionSource, acted: [GridRowKey, TRow] | null = null): number {\n const prev = this.selection();\n if (prev.size === 0) return 0;\n const next = new Map(prev);\n const delta: SelectionDelta<TRow> = { addedKeys: [], addedRows: [], removedKeys: [], removedRows: [] };\n for (const key of keys) {\n const row = next.get(key);\n if (row === undefined && !next.has(key)) continue;\n next.delete(key);\n delta.removedKeys.push(key);\n delta.removedRows.push(row as TRow);\n }\n if (!this.commitSelection(prev, next, delta, source, acted?.[1] ?? null, acted?.[0] ?? null, false)) return 0;\n return delta.removedKeys.length;\n }\n\n /** Selects every row in scope (the filtered rows by default). Returns the number of rows newly selected. */\n selectAll(source: GridSelectionSource, scope = this.config().selection.selectAllScope): number {\n if (this.config().selection.mode !== 'multiple') return 0;\n const rows = scope === 'all' ? this.allRows() : this.viewRows();\n const keyOf = this.keyOf();\n const entries: [GridRowKey, TRow][] = new Array(rows.length);\n for (let i = 0; i < rows.length; i++) entries[i] = [keyOf(rows[i]), rows[i]];\n return this.selectEntries(entries, source, false, null);\n }\n\n /** Deselects the rows in scope (every selected row by default). Returns the number of rows deselected. */\n deselectAll(source: GridSelectionSource, scope: 'filtered' | 'all' = 'all'): number {\n const selection = this.selection();\n if (selection.size === 0) return 0;\n if (scope === 'all') return this.deselectKeys([...selection.keys()], source);\n const keyOf = this.keyOf();\n const displayed = this.viewRows();\n const keys: GridRowKey[] = [];\n for (const row of displayed) {\n const key = keyOf(row);\n if (selection.has(key)) keys.push(key);\n }\n return this.deselectKeys(keys, source);\n }\n\n /**\n * Works out what a click, checkbox or key on the row at `rowIndex` does to the selection, without applying it.\n * Returns null when the gesture changes nothing (selection off, row not selectable).\n *\n * Every gesture toggles the row: multiple mode keeps the other rows, single mode replaces the selected row (and\n * deselects it when it is the clicked one). Ctrl/Cmd doesn't change that. In multiple mode, Shift selects the rows\n * from the anchor (the last clicked row) to this one, on top of the selection the anchor click left.\n */\n planSelection(\n rowIndex: number,\n gesture: 'click' | 'checkbox' | 'toggle',\n modifiers: { ctrl: boolean; shift: boolean },\n source: GridSelectionSource,\n ): SelectionPlan<TRow> | null {\n const mode = this.config().selection.mode;\n const rows = this.viewRows();\n const row = rows[rowIndex];\n if (mode === 'none' || row === undefined || !this.isRowSelectable(row)) return null;\n const key = this.keyOf()(row);\n const selection = this.selection();\n const acted: [GridRowKey, TRow] = [key, row];\n if (mode === 'multiple' && modifiers.shift && gesture !== 'toggle') {\n const anchorIndex = this.selectionAnchor === null ? -1 : this.viewIndexOfKey(this.selectionAnchor);\n const from = anchorIndex < 0 ? rowIndex : anchorIndex;\n const [start, end] = from <= rowIndex ? [from, rowIndex] : [rowIndex, from];\n const keyOf = this.keyOf();\n const range: [GridRowKey, TRow][] = [];\n for (let i = start; i <= end; i++) range.push([keyOf(rows[i]), rows[i]]);\n const anchor = anchorIndex < 0 ? key : this.selectionAnchor;\n const base = anchorIndex >= 0 && this.rangeBase !== null ? this.rangeBase : selection;\n return {\n row,\n key,\n selecting: true,\n apply: () => {\n this.selectRange(base, range, source, acted);\n this.selectionAnchor = anchor; // ranges keep their anchor and their base\n this.rangeBase = base;\n },\n };\n }\n const selected = selection.has(key);\n return {\n row,\n key,\n selecting: !selected,\n apply: () => {\n if (selected) this.deselectKeys([key], source, acted);\n else this.selectEntries([acted], source, mode === 'single', acted);\n this.selectionAnchor = key;\n this.rangeBase = this.selection();\n },\n };\n }\n\n /** Multiple mode: the selection becomes `base` plus the selectable rows of `range` (both in that order). */\n private selectRange(\n base: ReadonlyMap<GridRowKey, TRow>,\n range: readonly [GridRowKey, TRow][],\n source: GridSelectionSource,\n acted: [GridRowKey, TRow],\n ): void {\n const prev = this.selection();\n const next = new Map(base);\n for (const [key, row] of range) if (!next.has(key) && this.isRowSelectable(row)) next.set(key, row);\n const delta: SelectionDelta<TRow> = { addedKeys: [], addedRows: [], removedKeys: [], removedRows: [] };\n for (const [key, row] of prev) {\n if (!next.has(key)) {\n delta.removedKeys.push(key);\n delta.removedRows.push(row);\n }\n }\n for (const [key, row] of next) {\n if (!prev.has(key)) {\n delta.addedKeys.push(key);\n delta.addedRows.push(row);\n }\n }\n this.commitSelection(prev, next, delta, source, acted[1], acted[0], false);\n }\n\n /**\n * After a `selection.mode` change: `'none'` deselects every row and `'single'` keeps only the last selected row\n * (`selectionChange` with source `'api'`, after the change detection that applied the config).\n */\n private reconcileSelectionMode(): void {\n const prev = this.selection();\n const mode = this.config().selection.mode;\n const keep = mode === 'none' ? 0 : mode === 'single' ? 1 : prev.size;\n if (prev.size <= keep) return;\n const entries = [...prev];\n const cut = entries.length - keep;\n const delta: SelectionDelta<TRow> = { addedKeys: [], addedRows: [], removedKeys: [], removedRows: [] };\n for (const [key, row] of entries.slice(0, cut)) {\n delta.removedKeys.push(key);\n delta.removedRows.push(row);\n }\n this.commitSelection(prev, new Map(entries.slice(cut)), delta, 'api', null, null, true);\n }\n\n /** Applies a plan after `(selectionClick)` had the chance to cancel it. Returns false when cancelled. */\n runSelectionPlan(plan: SelectionPlan<TRow>, source: GridSelectionClickEvent['source'], rowIndex: number, event: Event): boolean {\n if (this.events.listens?.('selectionClick')) {\n const click: GridSelectionClickEvent<TRow> = { source, row: plan.row, key: plan.key, rowIndex, selecting: plan.selecting, event, cancel: false };\n this.events.selectionClick?.(click);\n if (click.cancel) return false;\n }\n plan.apply();\n return true;\n }\n\n /** Header checkbox: selects every row in scope, or deselects them when all are selected. */\n toggleSelectAll(event: Event): void {\n const config = this.config().selection;\n if (config.mode !== 'multiple') return;\n const selectAll = this.headerSelectionState() !== 'all';\n if (this.events.listens?.('selectionClick')) {\n const click: GridSelectionClickEvent<TRow> = { source: 'selectAll', row: null, key: null, rowIndex: -1, selecting: selectAll, event, cancel: false };\n this.events.selectionClick?.(click);\n if (click.cancel) return;\n }\n if (selectAll) this.selectAll('selectAll');\n else this.deselectAll('selectAll', config.selectAllScope === 'all' ? 'all' : 'filtered');\n }\n\n /** Selects the rows between the anchor and `rowIndex` (Shift+arrow keys). */\n extendSelectionTo(rowIndex: number, fromIndex: number): void {\n if (this.config().selection.mode !== 'multiple') return;\n if (this.selectionAnchor === null || this.viewIndexOfKey(this.selectionAnchor) < 0) {\n const anchorRow = this.viewRows()[fromIndex];\n if (anchorRow === undefined) return;\n this.selectionAnchor = this.keyOf()(anchorRow);\n }\n const plan = this.planSelection(rowIndex, 'click', { ctrl: false, shift: true }, 'keyboard');\n if (plan) plan.apply();\n }\n\n /** With `onFilter` set, deselects the rows a new filter hides (or everything with `'clear'`). */\n private syncSelectionWithFilter(): void {\n const policy = this.config().selection.onFilter;\n const selection = this.selection();\n if (policy === 'keep' || selection.size === 0) return;\n if (policy === 'clear') {\n this.deselectKeys([...selection.keys()], 'filter');\n return;\n }\n const mask = this.displayedMask();\n if (mask === null) return;\n const positions = this.keyIndex().positions;\n const adds = this.pendingAdds();\n const hidden: GridRowKey[] = [];\n for (const key of selection.keys()) {\n const position = positions.get(key);\n if (position === undefined ? !adds.has(key) : mask[position] === 0) hidden.push(key);\n }\n if (hidden.length > 0) this.deselectKeys(hidden, 'filter');\n }\n\n /** Stores a new selection and emits the selection events. Returns false when nothing changed. */\n private commitSelection(\n prev: ReadonlyMap<GridRowKey, TRow>,\n next: ReadonlyMap<GridRowKey, TRow>,\n delta: SelectionDelta<TRow>,\n source: GridSelectionSource,\n row: TRow | null,\n key: GridRowKey | null,\n defer: boolean,\n ): boolean {\n if (delta.addedKeys.length === 0 && delta.removedKeys.length === 0) return false;\n this.selection.set(next);\n // Click gestures set their own range base after this; every other change starts a new one.\n this.rangeBase = null;\n if (next.size === 0) this.selectionAnchor = null;\n const sink = this.events;\n const single = this.config().selection.mode === 'single';\n const oldEntry = single ? firstEntry(prev) : null;\n const newEntry = single ? firstEntry(next) : null;\n const previousRows = lazy(() => [...prev.values()]);\n const previousKeys = lazy(() => [...prev.keys()]);\n const currentRows = lazy(() => [...next.values()]);\n const currentKeys = lazy(() => [...next.keys()]);\n const change: GridSelectionChangeEvent<TRow> = {\n source,\n action: delta.addedKeys.length > 0 && delta.removedKeys.length > 0 ? 'change' : delta.addedKeys.length > 0 ? 'select' : 'deselect',\n row,\n key,\n added: delta.addedRows,\n addedKeys: delta.addedKeys,\n removed: delta.removedRows,\n removedKeys: delta.removedKeys,\n oldRow: oldEntry?.[1] ?? null,\n newRow: newEntry?.[1] ?? null,\n oldKey: oldEntry?.[0] ?? null,\n newKey: newEntry?.[0] ?? null,\n get previousSelection() {\n return previousRows();\n },\n get previousKeys() {\n return previousKeys();\n },\n get currentSelection() {\n return currentRows();\n },\n get currentKeys() {\n return currentKeys();\n },\n };\n this.emit(() => sink.selectionChange?.(change), defer);\n const rowEvent = (rows: TRow[], keys: GridRowKey[]): GridRowSelectionEvent<TRow> => ({\n source,\n row: rows[0],\n key: keys[0],\n rows,\n keys,\n get currentSelection() {\n return currentRows();\n },\n get currentKeys() {\n return currentKeys();\n },\n });\n if (delta.removedKeys.length > 0) this.emit(() => sink.rowDeselected?.(rowEvent(delta.removedRows, delta.removedKeys)), defer);\n if (delta.addedKeys.length > 0) this.emit(() => sink.rowSelected?.(rowEvent(delta.addedRows, delta.addedKeys)), defer);\n if (next.size === 0 && prev.size > 0) {\n this.emit(\n () =>\n sink.selectionCleared?.({\n source,\n get previousSelection() {\n return previousRows();\n },\n get previousKeys() {\n return previousKeys();\n },\n }),\n defer,\n );\n }\n return true;\n }\n\n // ----- cell selection (`cellSelection`) -----\n\n /**\n * The selected cell, by row key and field, so it follows its row through sort, filter, scrolling and refresh. `hint`\n * is the view index where it was selected: finding the row again right after a click costs nothing.\n */\n readonly selectedCell = signal<{ readonly key: GridRowKey; readonly field: string; readonly hint: number } | null>(null);\n\n /** View index of the selected cell's row: -1 without one, or while a filter hides it. Cached per view. */\n readonly selectedCellIndex = computed(() => {\n const cell = this.selectedCell();\n if (cell === null) return -1;\n // In-place changes (push, splice + refresh) keep the arrays: the version tells the index is stale.\n this.structureVersion();\n const hinted = this.viewRows()[cell.hint];\n return hinted !== undefined && this.keyOf()(hinted) === cell.key ? cell.hint : this.viewIndexOfKey(cell.key);\n });\n\n /** `getSelectedCell()`: null without a selected cell, and while cell selection is off. */\n getSelectedCell(): GridSelectedCell<TRow> | null {\n const cell = this.config().cellSelection.enabled ? this.selectedCell() : null;\n if (cell === null) return null;\n const rowIndex = this.selectedCellIndex();\n const row = rowIndex >= 0 ? this.viewRows()[rowIndex] : this.rowByKey(cell.key);\n return row === undefined ? null : { row, key: cell.key, field: cell.field, rowIndex };\n }\n\n /**\n * Selects a cell (`rowIndex`: its view index, or -1 when unknown) or, with `null`, clears the selected cell. Emits\n * `cellSelectionChange` when the selected cell changed. Never changes the row selection.\n */\n setSelectedCell(\n next: { key: GridRowKey; field: string; rowIndex: number } | null,\n source: GridCellSelectionSource,\n event: Event | null,\n defer = false,\n ): boolean {\n const prev = this.selectedCell();\n if (next === null ? prev === null : prev !== null && prev.key === next.key && prev.field === next.field) return false;\n this.selectedCell.set(next === null ? null : { key: next.key, field: next.field, hint: next.rowIndex });\n const sink = this.events;\n if (sink.listens?.('cellSelectionChange')) {\n const change = this.cellSelectionEvent(source, event, prev);\n this.emit(() => sink.cellSelectionChange?.(change), defer);\n }\n return true;\n }\n\n /** `selectCell()`: selects a displayed cell (row not filtered out, column not hidden). */\n selectCellByKey(key: GridRowKey, field: string, scroll: boolean): boolean {\n if (!this.config().cellSelection.enabled) return false;\n const rowIndex = this.viewIndexOfKey(key);\n const lc = this.layout().byField.get(field);\n if (rowIndex < 0 || lc === undefined || !this.setSelectedCell({ key, field, rowIndex }, 'api', null)) return false;\n if (scroll) {\n this.viewport?.scrollToRow(rowIndex, 'auto');\n this.viewport?.scrollToColumn(lc.index, 'auto');\n }\n return true;\n }\n\n /** `clearCellSelection()`. */\n clearCellSelection(): void {\n if (this.config().cellSelection.enabled) this.setSelectedCell(null, 'api', null);\n }\n\n private cellSelectionEvent(\n source: GridCellSelectionSource,\n event: Event | null,\n prev: { readonly key: GridRowKey; readonly field: string } | null,\n ): GridCellSelectionChangeEvent<TRow> {\n const previous = prev === null ? null : { key: prev.key, field: prev.field };\n const cell = this.selectedCell();\n const rowIndex = cell === null ? -1 : this.selectedCellIndex();\n const row = cell === null ? undefined : rowIndex >= 0 ? this.viewRows()[rowIndex] : this.rowByKey(cell.key);\n if (cell === null || row === undefined) {\n return { source, row: null, key: null, rowIndex: -1, dataIndex: -1, field: null, column: null, value: undefined, formattedValue: '', previous, event };\n }\n const column = this.columnsByField().get(cell.field) ?? null;\n const value = column === null ? undefined : column.getValue(row);\n const indices = this.viewIndices();\n return {\n source,\n row,\n key: cell.key,\n rowIndex,\n dataIndex: rowIndex < 0 ? -1 : indices === null ? rowIndex : (indices[rowIndex] ?? -1),\n field: cell.field,\n column,\n value,\n formattedValue: column === null ? '' : column.formatValue(value, row),\n previous,\n event,\n };\n }\n\n /** Clears the selected cell when its row left the data or its column was removed (filters and hidden columns keep it). */\n private reconcileSelectedCell(source: 'dataRefresh' | 'delete' | 'columns', defer: boolean): void {\n const cell = this.selectedCell();\n if (cell === null || (this.rowByKey(cell.key) !== undefined && this.columnsByField().has(cell.field))) return;\n this.setSelectedCell(null, source, null, defer);\n }\n\n // ----- add, update, delete -----\n\n /** Rows added while a filter is active, kept visible until the filter changes or the data is replaced. */\n private readonly keptRows = signal<ReadonlySet<TRow>>(EMPTY_SET);\n /** The array made by the last add or delete, so its echo through `[(data)]` isn't treated as new data. */\n private crudData: readonly TRow[] | null = null;\n /** The open delete confirmation, if any. */\n readonly deleteRequest = signal<DeleteRequest<TRow> | null>(null);\n private readonly pathGetters = new Map<string, (row: TRow) => unknown>();\n private readonly pathSetters = new Map<string, ((row: TRow, value: unknown) => void) | null>();\n\n /** The primary-key field, when the primary key is a field rather than a function. */\n readonly primaryKeyField = computed(() => {\n const pk = this.primaryKey();\n return typeof pk === 'string' ? pk : null;\n });\n\n ngOnDestroy(): void {\n this.deleteRequest()?.cancel();\n }\n\n /** `addRow()`: the object becomes the row (see the API documentation), then it is validated and added. */\n addRow(values: Partial<TRow> | null | undefined, options: GridAddRowOptions | undefined, source: 'ui' | 'api'): GridCrudResult<TRow> {\n if (this.saving()) return { ok: false, reason: 'busy' };\n const row = this.createRow(values, false);\n return this.insertNewRow(row, options?.position, source, options?.scroll ?? true, null);\n }\n\n /** Opens the inline add row: a draft row in row edit mode, added when the edit is committed. */\n beginAddRow(options?: GridBeginAddRowOptions<TRow>): boolean {\n if (this.saving()) return false;\n const current = this.editSession();\n if (current?.isNew) return true;\n if (current && !this.commitEdit()) return false;\n const row = this.createRow(options?.values, true);\n const fields = this.layout()\n .columns.filter((lc) => this.isEditableOnAdd(lc.col, row))\n .map((lc) => lc.key);\n if (fields.length === 0) return false;\n const columns = this.columnsByField();\n const values: Record<string, unknown> = {};\n const original: Record<string, unknown> = {};\n for (const f of fields) {\n const v = columns.get(f)!.getValue(row);\n values[f] = v;\n original[f] = v;\n }\n const position = options?.position === 'top' || options?.position === 'bottom' ? options.position : this.config().editing.addPosition;\n const session: EditSession<TRow> = {\n row,\n rowIndex: -1,\n mode: 'row',\n fields,\n focusField: fields[0],\n values,\n original,\n errors: {},\n isNew: true,\n position,\n };\n this.editSession.set(session);\n this.events.editStart?.({ state: this.publicEditState(session) });\n return true;\n }\n\n /** `updateRow()`. */\n updateRow(key: GridRowKey, changes: Readonly<Record<string, unknown>> | null | undefined): GridCrudResult<TRow> {\n if (this.saving()) return { ok: false, reason: 'busy', key };\n const row = this.rowByKey(key);\n if (row === undefined) return { ok: false, reason: 'notFound', key };\n return this.applyUpdate(row, key, changes ?? {}, 'api', null, -1);\n }\n\n /** Deletes rows now, without confirmation. */\n deleteRows(keys: readonly GridRowKey[], source: 'ui' | 'api' | 'keyboard'): GridCrudResult<TRow> {\n if (this.saving()) return { ok: false, reason: 'busy' };\n const found = this.findRows(keys);\n if (found.rows.length === 0) return { ok: false, reason: 'notFound', rows: [], keys: [] };\n const rows = found.rows;\n const foundKeys = found.keys;\n const deleting: GridRowDeletingEvent<TRow> = { rows, keys: foundKeys, source, cancel: false };\n this.events.rowDeleting?.(deleting);\n if (deleting.cancel) return { ok: false, reason: 'cancelled', row: rows[0], key: foundKeys[0], rows, keys: foundKeys };\n if (this.config().editing.batch) return this.deletePending(rows, foundKeys, source);\n this.withHeldEvents(() => {\n const data = this.data();\n const removed = new Uint8Array(data.length);\n for (const position of found.positions) removed[position] = 1;\n const next: TRow[] = [];\n for (let i = 0; i < data.length; i++) if (removed[i] === 0) next.push(data[i]);\n this.commitData(next);\n const kept = this.keptRows();\n if (kept.size > 0) {\n const stillKept = new Set(kept);\n for (const row of rows) stillKept.delete(row);\n this.keptRows.set(stillKept);\n }\n const sink = this.events;\n this.emit(() => sink.dataChange?.(next), false);\n this.emit(() => sink.rowDeleted?.({ row: rows[0], key: foundKeys[0], rows, keys: foundKeys, pending: false, source }), false);\n // An edit of a deleted row is cancelled; other edits follow their row to its new index.\n const session = this.editSession();\n const deletedKeys = new Set(foundKeys);\n if (session && !session.isNew && deletedKeys.has(this.keyOf()(session.row))) this.cancelEdit();\n else this.retargetEdit();\n const selection = this.selection();\n const deselect = selection.size === 0 ? EMPTY_ARRAY : foundKeys.filter((key) => selection.has(key));\n if (deselect.length > 0) this.deselectKeys(deselect, 'delete');\n this.reconcileSelectedCell('delete', false);\n this.emitCrudRefresh(deselect);\n });\n return { ok: true, row: rows[0], key: foundKeys[0], rows, keys: foundKeys };\n }\n\n /** Deletes rows after the configured confirmation (the built-in dialog or the `infiGridDeleteConfirm` template). */\n requestDelete(keys: readonly GridRowKey[], source: 'ui' | 'api' | 'keyboard'): Promise<GridCrudResult<TRow>> {\n if (this.saving()) return Promise.resolve({ ok: false, reason: 'busy' });\n // Rows already deleted in batch mode need no confirmation.\n const deletes = this.pendingDeletes();\n if (deletes.size > 0) keys = keys.filter((key) => !deletes.has(key));\n if (!this.config().editing.confirmDelete) return Promise.resolve(this.deleteRows(keys, source));\n const found = this.findRows(keys);\n if (found.rows.length === 0) return Promise.resolve({ ok: false, reason: 'notFound', rows: [], keys: [] });\n const { rows, keys: foundKeys } = found;\n if (this.deleteRequest() !== null) return Promise.resolve({ ok: false, reason: 'busy', rows, keys: foundKeys });\n return new Promise<GridCrudResult<TRow>>((resolve) => {\n let done = false;\n const close = (): boolean => {\n if (done) return false;\n done = true;\n if (this.deleteRequest() === request) this.deleteRequest.set(null);\n return true;\n };\n const request: DeleteRequest<TRow> = {\n rows,\n keys: foundKeys,\n source,\n confirm: () => {\n if (close()) resolve(this.deleteRows(foundKeys, source));\n },\n cancel: () => {\n if (close()) resolve({ ok: false, reason: 'cancelled', row: rows[0], key: foundKeys[0], rows, keys: foundKeys });\n },\n };\n this.deleteRequest.set(request);\n });\n }\n\n /** Whether a cell gets an editor. Keys are read-only once a row is added; the add row uses `editableOnAdd`. */\n isCellEditable(column: ResolvedColumn<TRow>, row: TRow, isNew = false): boolean {\n if (isNew) return this.isEditableOnAdd(column, row);\n if (column.field === this.primaryKeyField() || this.isPendingDelete(row)) return false;\n return isColumnEditable(column, row);\n }\n\n private isEditableOnAdd(column: ResolvedColumn<TRow>, row: TRow): boolean {\n if (!column.setValue) return false;\n const rule = column.config.editableOnAdd;\n if (typeof rule === 'function') {\n try {\n return rule(row) === true;\n } catch {\n return false;\n }\n }\n if (typeof rule === 'boolean') return rule;\n // The key column (never editable on existing rows) gets an editor only when there is no generated key to keep.\n if (column.field === this.primaryKeyField()) return isMissingKey(this.keyOf()(row));\n return isColumnEditable(column, row);\n }\n\n /**\n * The object of a new row: the `editing.newRow` object with `values` applied, or `values` itself\n * (a copy with `copy`); then column defaults fill the fields that are still undefined.\n */\n private createRow(values: Partial<TRow> | null | undefined, copy: boolean): TRow {\n const init = this.config().editing.newRow;\n let row: Record<string, unknown>;\n if (init) {\n let base: unknown = null;\n try {\n base = init();\n } catch (error) {\n this.reportError({ source: 'edit', error });\n }\n row = base !== null && typeof base === 'object' ? (base as Record<string, unknown>) : {};\n if (values) Object.assign(row, values);\n } else if (values !== null && typeof values === 'object') {\n row = copy ? { ...(values as Record<string, unknown>) } : (values as Record<string, unknown>);\n } else {\n row = {};\n }\n for (const column of this.columns()) {\n const fallback = column.config.defaultValue;\n if (fallback === undefined || !column.setValue || column.getValue(row as TRow) !== undefined) continue;\n try {\n column.setValue(row as TRow, typeof fallback === 'function' ? (fallback as (r: TRow) => unknown)(row as TRow) : fallback);\n } catch (error) {\n this.reportError({ source: 'edit', field: column.field, error });\n }\n }\n return row as TRow;\n }\n\n /** Validates a new row and inserts it (copy-on-write). `session` is the add row being committed. */\n private insertNewRow(\n row: TRow,\n position: GridAddPosition | undefined,\n source: 'ui' | 'api',\n scroll: boolean,\n session: EditSession<TRow> | null,\n ): GridCrudResult<TRow> {\n const errors = this.validateNewRow(row);\n let check = this.checkNewKey(row, errors);\n if (check.reason !== null || Object.keys(errors).length > 0) {\n return { ok: false, reason: check.reason ?? 'invalid', errors, row, key: check.key };\n }\n const index = resolveAddPosition(position, this.config().editing.addPosition, this.data().length);\n const adding: GridRowAddingEvent<TRow> = { row, key: check.key, position: index, source, cancel: false };\n this.events.rowAdding?.(adding);\n if (adding.cancel) return { ok: false, reason: 'cancelled', row, key: check.key };\n if (this.keyOf()(row) !== check.key) {\n // A handler changed the key (for example to a server-generated one): check it again.\n const keyErrors: Record<string, string> = {};\n check = this.checkNewKey(row, keyErrors);\n if (check.reason !== null) return { ok: false, reason: check.reason, errors: keyErrors, row, key: check.key };\n }\n const key = check.key;\n if (this.config().editing.batch) {\n return this.addPending(row, key, position ?? this.config().editing.addPosition, index, source, scroll, session);\n }\n let at = index;\n this.withHeldEvents(() => {\n if (session !== null && this.editSession() === session) this.editSession.set(null);\n const data = this.data();\n at = Math.min(index, data.length);\n const next = data.slice();\n next.splice(at, 0, row);\n this.commitData(next);\n if (Object.keys(this.filterModel()).length > 0) this.keptRows.set(new Set(this.keptRows()).add(row));\n this.retargetEdit();\n const sink = this.events;\n this.emit(() => sink.dataChange?.(next), false);\n this.emit(() => sink.rowAdded?.({ row, key, position: at, pending: false, source }), false);\n this.emitCrudRefresh(EMPTY_ARRAY);\n });\n if (scroll) this.revealRow(key, source === 'ui');\n return { ok: true, row, key };\n }\n\n /**\n * Validates and writes changes into a row, in place: `required` and column validators, the key must not\n * change, `rowValidator` on a preview copy; then `rowUpdating` (cancelable), the writes, `cellValueChange`\n * per field and `rowUpdated`. `session` is the edit session that produced the changes (closed before writing).\n */\n private applyUpdate(\n row: TRow,\n key: GridRowKey,\n changes: Readonly<Record<string, unknown>>,\n source: 'edit' | 'api',\n session: EditSession<TRow> | null,\n rowIndexHint: number,\n ): GridCrudResult<TRow> {\n if (this.isPendingDelete(row)) return { ok: false, reason: 'readOnly', row, key };\n const columns = this.columnsByField();\n // In batch mode, the row as displayed: with its pending values.\n const base = this.displayRow(row);\n const fields: string[] = [];\n const writers: ((target: TRow, value: unknown) => void)[] = [];\n const oldValues: Record<string, unknown> = {};\n const newValues: Record<string, unknown> = {};\n const errors: Record<string, string> = {};\n let customSetter = false;\n for (const field of Object.keys(changes)) {\n const value = changes[field];\n const column = columns.get(field);\n const current = column ? column.getValue(row) : this.readPath(base, field);\n if (sameValue(current, value)) continue;\n const write = column ? column.setValue : this.pathSetter(field);\n if (!write) return { ok: false, reason: 'readOnly', errors: { [field]: 'This field cannot be written' }, row, key };\n if (column?.config.valueSetter) customSetter = true;\n if (column) {\n const message = this.checkValue(column, value, row);\n if (message) errors[field] = message;\n }\n fields.push(field);\n writers.push(write);\n oldValues[field] = current;\n newValues[field] = value;\n }\n const close = () => {\n if (session !== null && this.editSession() === session) this.editSession.set(null);\n };\n if (fields.length === 0) {\n close();\n return { ok: true, row, key };\n }\n const rowValidator = this.config().editing.rowValidator;\n if (this.hasPrimaryKey() || rowValidator !== null) {\n // Checks that need the row as it will be: on a copy, so a refused update leaves the row untouched.\n const preview = copyAlongPaths(base, fields, customSetter);\n for (let i = 0; i < fields.length; i++) {\n try {\n writers[i](preview, newValues[fields[i]]);\n } catch {\n // Reported when the row itself is written.\n }\n }\n if (this.hasPrimaryKey() && this.keyOf()(preview) !== key) {\n return { ok: false, reason: 'primaryKeyChange', errors: { [this.primaryKeyField() ?? '$row']: 'The key of a row cannot change' }, row, key };\n }\n this.runRowValidator(preview, errors);\n }\n if (Object.keys(errors).length > 0) return { ok: false, reason: 'invalid', errors, row, key };\n const updating: GridRowUpdatingEvent<TRow> = { row, key, oldValues, newValues, changedFields: fields, source, cancel: false };\n this.events.rowUpdating?.(updating);\n if (updating.cancel) return { ok: false, reason: 'cancelled', row, key };\n const oldRow = copyAlongPaths(base, fields, customSetter);\n if (this.config().editing.batch) {\n return this.updatePending(row, key, { fields, writers, oldValues, newValues, oldRow, custom: customSetter }, source, session);\n }\n this.withHeldEvents(() => {\n close();\n const rowIndex = rowIndexHint >= 0 ? rowIndexHint : session !== null ? session.rowIndex : this.viewIndexOfKey(key);\n const sink = this.events;\n for (let i = 0; i < fields.length; i++) {\n const field = fields[i];\n try {\n writers[i](row, newValues[field]);\n } catch (error) {\n this.reportError({ source: 'edit', field, error });\n }\n this.bumpChangedField(field);\n const column = columns.get(field);\n if (column) {\n const change: GridCellValueChangeEvent<TRow> = { row, rowIndex, field, column, oldValue: oldValues[field], newValue: newValues[field], source };\n this.emit(() => sink.cellValueChange?.(change), false);\n }\n }\n this.bumpRow(row);\n this.editVersion.update((v) => v + 1);\n this.emit(() => sink.rowUpdated?.({ row, oldRow, key, oldValues, newValues, changedFields: fields, pending: false, source }), false);\n });\n return { ok: true, row, key };\n }\n\n /** `required`, column validators and `editing.rowValidator` for a new row. */\n private validateNewRow(row: TRow): Record<string, string> {\n const errors: Record<string, string> = {};\n for (const column of this.columns()) {\n const message = this.checkValue(column, column.getValue(row), row);\n if (message) errors[column.field] = message;\n }\n this.runRowValidator(row, errors);\n return errors;\n }\n\n /** `required` and the column validator for a value (already converted to the column type). */\n private checkValue(column: ResolvedColumn<TRow>, value: unknown, row: TRow): string | null {\n if (column.required && isEmptyValue(value)) return this.config().text.required;\n const validator = column.config.validator;\n if (!validator) return null;\n try {\n return validator(value, row) || null;\n } catch (error) {\n this.reportError({ source: 'edit', field: column.field, error });\n return 'Invalid value';\n }\n }\n\n private runRowValidator(row: TRow, errors: Record<string, string>): void {\n const validator = this.config().editing.rowValidator;\n if (!validator) return;\n try {\n mergeRowValidation(validator(row), errors);\n } catch (error) {\n this.reportError({ source: 'edit', error });\n errors['$row'] ??= 'Invalid row';\n }\n }\n\n /** A new row needs a key that no row uses yet (with a primary key; without one, the row object is the key). */\n private checkNewKey(row: TRow, errors: Record<string, string>): { key: GridRowKey; reason: 'missingKey' | 'duplicateKey' | null } {\n const key = this.keyOf()(row);\n const field = this.primaryKeyField() ?? '$row';\n const text = this.config().text;\n if (this.hasPrimaryKey() && isMissingKey(key)) {\n errors[field] ??= text.keyRequired;\n return { key, reason: 'missingKey' };\n }\n if (this.keyIndex().positions.has(key) || this.pendingAdds().has(key)) {\n errors[field] ??= text.duplicateKey;\n return { key, reason: 'duplicateKey' };\n }\n return { key, reason: null };\n }\n\n /** Rows of the given keys in the data or the pending adds (each key once), with their data positions (-1: pending). */\n private findRows(keys: readonly GridRowKey[]): { rows: TRow[]; keys: GridRowKey[]; positions: number[] } {\n const index = this.keyIndex().positions;\n const data = this.data();\n const rows: TRow[] = [];\n const found: GridRowKey[] = [];\n const positions: number[] = [];\n const adds = this.pendingAdds();\n const seen = new Set<GridRowKey>();\n for (const key of keys) {\n if (seen.has(key)) continue;\n seen.add(key);\n const position = index.get(key);\n const row = position === undefined ? adds.get(key)?.row : data[position];\n if (row === undefined) continue;\n rows.push(row);\n found.push(key);\n positions.push(position ?? -1);\n }\n return { rows, keys: found, positions };\n }\n\n /** Stores the array made by an add or delete. The bound array is never changed. */\n private commitData(next: readonly TRow[]): void {\n this.crudData = next;\n this.dataState.set(next);\n }\n\n private emitCrudRefresh(removedSelectionKeys: readonly GridRowKey[], reason: 'crud' | 'save' = 'crud'): void {\n const sink = this.events;\n if (!sink.dataRefresh) return;\n const event: GridDataRefreshEvent = {\n reason,\n rowCount: this.data().length,\n displayedRowCount: this.rowCount(),\n removedSelectionKeys,\n filterReset: false,\n sortReset: false,\n };\n this.emit(() => sink.dataRefresh?.(event), false);\n }\n\n /** Scrolls a row into view; with `focus`, its first cell also gets the focus. */\n private revealRow(key: GridRowKey, focus: boolean): void {\n const viewport = this.viewport;\n const index = viewport ? this.viewIndexOfKey(key) : -1;\n if (!viewport || index < 0) return;\n const first = this.layout().columns[0]?.key;\n if (focus && first !== undefined) viewport.focusCell(index, first);\n else viewport.scrollToRow(index, 'auto');\n }\n\n /** Errors of a refused commit, on the editors (messages for other fields go on the focused editor). */\n private showEditErrors(session: EditSession<TRow>, result: GridCrudResult<TRow>): void {\n if (this.editSession() !== session || !result.errors) return;\n const errors: Record<string, string | null> = { ...session.errors };\n const columns = this.columnsByField();\n const other: string[] = [];\n for (const field of Object.keys(result.errors)) {\n const message = result.errors[field];\n if (session.fields.includes(field)) errors[field] = message;\n else other.push(field === '$row' ? message : `${columns.get(field)?.header ?? field}: ${message}`);\n }\n if (other.length > 0) {\n const focus = session.focusField;\n errors[focus] = [errors[focus], ...other].filter((m) => !!m).join(' · ');\n }\n this.editSession.set({ ...session, errors });\n }\n\n private readPath(row: TRow, field: string): unknown {\n let get = this.pathGetters.get(field);\n if (!get) {\n get = compileGetter(field);\n this.pathGetters.set(field, get);\n }\n return get(row);\n }\n\n private pathSetter(field: string): ((row: TRow, value: unknown) => void) | null {\n let set = this.pathSetters.get(field);\n if (set === undefined) {\n set = compileSetter(field);\n this.pathSetters.set(field, set);\n }\n return set;\n }\n\n // ----- batch editing (`editing.batch`) -----\n\n /** Pending adds, in the order they were made. */\n readonly pendingAdds = signal<ReadonlyMap<GridRowKey, PendingAdd<TRow>>>(EMPTY_MAP);\n /** Rows marked for deletion (shown struck through until saved). */\n readonly pendingDeletes = signal<ReadonlyMap<GridRowKey, TRow>>(EMPTY_MAP);\n /** Pending values of data rows, by key. Mutable: rows re-render through their version. */\n private readonly pendingUpdates = new Map<GridRowKey, PendingUpdate<TRow>>();\n /** Data row → its copy with the pending values: what the grid shows, sorts, filters and sums. */\n private readonly mergedRows = new Map<TRow, TRow>();\n /** Bumped once per change of the pending state (toolbar, `canUndo()`). */\n readonly pendingVersion = signal(0);\n /** A save handler is running: changes are refused until it settles. */\n readonly saving = signal(false);\n /** The last save failed (until the next change). */\n readonly saveFailed = signal(false);\n private undoStack: BatchStep[] = [];\n private redoStack: BatchStep[] = [];\n\n /** Pending adds shown first (newest first, as if each was inserted at the top). */\n private readonly pendingTop = computed<readonly TRow[]>(() => {\n const rows: TRow[] = [];\n for (const add of this.pendingAdds().values()) if (add.position !== 'bottom') rows.push(add.row);\n return rows.reverse();\n });\n\n /** Pending adds shown last, in order. */\n private readonly pendingBottom = computed<readonly TRow[]>(() => {\n const rows: TRow[] = [];\n for (const add of this.pendingAdds().values()) if (add.position === 'bottom') rows.push(add.row);\n return rows;\n });\n\n /** The row as displayed: in batch mode, a copy with its pending values. */\n displayRow(row: TRow): TRow {\n return this.mergedRows.size === 0 ? row : (this.mergedRows.get(row) ?? row);\n }\n\n /** The batch state of a row, for rendering (null without changes). */\n rowChange(row: TRow): RowChangeState | null {\n const deletes = this.pendingDeletes();\n const adds = this.pendingAdds();\n if (deletes.size === 0 && adds.size === 0 && this.pendingUpdates.size === 0) return null;\n const key = this.keyOf()(row);\n if (deletes.has(key)) return DELETED_STATE;\n if (adds.has(key)) return ADDED_STATE;\n const update = this.pendingUpdates.get(key);\n return update ? { kind: 'modified', fields: update.values } : null;\n }\n\n private isPendingDelete(row: TRow): boolean {\n const deletes = this.pendingDeletes();\n return deletes.size > 0 && deletes.has(this.keyOf()(row));\n }\n\n hasPendingChanges(): boolean {\n return this.pendingAdds().size > 0 || this.pendingDeletes().size > 0 || this.pendingUpdates.size > 0;\n }\n\n canUndo(): boolean {\n return this.config().editing.batch && this.undoStack.length > 0 && !this.saving();\n }\n\n canRedo(): boolean {\n return this.config().editing.batch && this.redoStack.length > 0 && !this.saving();\n }\n\n /** Undoes the last pending change. An open edit of a data row is discarded first. */\n undo(): boolean {\n if (!this.canUndo()) return false;\n this.discardRowEdit();\n const step = this.undoStack.pop()!;\n this.withHeldEvents(() => {\n step.undo();\n this.redoStack.push(step);\n this.emitPendingChange('undo');\n });\n return true;\n }\n\n redo(): boolean {\n if (!this.canRedo()) return false;\n this.discardRowEdit();\n const step = this.redoStack.pop()!;\n this.withHeldEvents(() => {\n step.redo();\n this.undoStack.push(step);\n this.emitPendingChange('redo');\n });\n return true;\n }\n\n getPendingChanges(): GridChangeSet<TRow> {\n const adds = [...this.pendingAdds().values()];\n const deletes = this.pendingDeletes();\n const updated: GridPendingUpdate<TRow>[] = [];\n for (const [key, update] of this.pendingUpdates) {\n if (deletes.has(key)) continue;\n updated.push({\n key,\n row: this.mergedRows.get(update.row) ?? update.row,\n original: update.row,\n changes: Object.fromEntries(update.values),\n oldValues: Object.fromEntries(update.original),\n });\n }\n return {\n added: adds.map((add) => add.row),\n addedKeys: adds.map((add) => add.key),\n updated,\n updatedKeys: updated.map((update) => update.key),\n deleted: [...deletes.values()],\n deletedKeys: [...deletes.keys()],\n count: adds.length + updated.length + deletes.size,\n };\n }\n\n /**\n * Commits an open edit, runs the save handler (default `editing.saveHandler`) and applies the changes to the\n * data when it succeeds. A handler that throws or rejects keeps everything pending. Never rejects.\n */\n async saveChanges(handler?: (changes: GridChangeSet<TRow>) => unknown): Promise<GridSaveResult<TRow>> {\n if (this.saving()) return { ok: false, reason: 'busy', changes: this.getPendingChanges() };\n if (!this.commitEdit()) return { ok: false, reason: 'invalid', changes: this.getPendingChanges() };\n const changes = this.getPendingChanges();\n if (changes.count === 0) return { ok: true, changes };\n const run = handler ?? this.config().editing.saveHandler;\n if (run) {\n this.saving.set(true);\n this.pendingVersion.update((v) => v + 1);\n try {\n await settle(run(changes));\n } catch (error) {\n this.saving.set(false);\n this.saveFailed.set(true);\n this.pendingVersion.update((v) => v + 1);\n this.events.changesSaveFailed?.({ error, changes });\n return { ok: false, reason: 'failed', error, changes };\n }\n this.saving.set(false);\n }\n this.applyChanges(changes);\n return { ok: true, changes };\n }\n\n /** Discards every pending change (and an open edit). Returns what was discarded. */\n cancelChanges(): GridChangeSet<TRow> {\n const changes = this.getPendingChanges();\n if (this.saving()) return EMPTY_CHANGES;\n if (changes.count === 0 && this.undoStack.length === 0 && this.redoStack.length === 0) return changes;\n const added = [...this.pendingAdds().keys()];\n this.withHeldEvents(() => {\n this.cancelEdit();\n this.clearPending();\n this.forgetRows(added);\n this.retargetEdit();\n this.emit(() => this.events.changesCancelled?.(changes), false);\n this.emitPendingChange('cancel');\n });\n return changes;\n }\n\n /** Batch mode: takes rows off the pending deletes (the action column's restore button). */\n restoreRows(keys: readonly GridRowKey[]): boolean {\n if (this.saving()) return false;\n const deletes = this.pendingDeletes();\n const entries: [GridRowKey, TRow][] = [];\n for (const key of keys) {\n const row = deletes.get(key);\n if (row !== undefined) entries.push([key, row]);\n }\n if (entries.length === 0) return false;\n this.withHeldEvents(() => {\n this.setPendingDeletes(entries, false);\n this.recordStep({ undo: () => this.setPendingDeletes(entries, true), redo: () => this.setPendingDeletes(entries, false) });\n this.emitPendingChange('restore');\n });\n return true;\n }\n\n /**\n * Called when the `[config]` input changed: a selection the new `selection.mode` can't hold is reduced, turning cell\n * selection off forgets the selected cell (no event: the feature is off), and turning batch mode off discards the\n * pending changes.\n */\n configChanged(): void {\n this.reconcileSelectionMode();\n if (!this.config().cellSelection.enabled && this.selectedCell() !== null) this.selectedCell.set(null);\n if (this.config().editing.batch || (!this.hasPendingChanges() && this.undoStack.length === 0)) return;\n queueMicrotask(() => {\n if (!this.config().editing.batch) this.cancelChanges();\n });\n }\n\n /** Records a validated new row as a pending add. */\n private addPending(\n row: TRow,\n key: GridRowKey,\n position: GridAddPosition,\n index: number,\n source: 'ui' | 'api',\n scroll: boolean,\n session: EditSession<TRow> | null,\n ): GridCrudResult<TRow> {\n const entry: PendingAdd<TRow> = { row, key, position };\n this.withHeldEvents(() => {\n if (session !== null && this.editSession() === session) this.editSession.set(null);\n const sink = this.events;\n this.emit(() => sink.rowAdded?.({ row, key, position: index, pending: true, source }), false);\n this.setPendingAdds([entry], true);\n this.recordStep({ undo: () => this.setPendingAdds([entry], false), redo: () => this.setPendingAdds([entry], true) });\n this.emitPendingChange('add');\n });\n if (scroll) this.revealRow(key, source === 'ui');\n return { ok: true, row, key };\n }\n\n /**\n * Records validated changes: a pending add is changed in place (it is the grid's own object); a data row\n * gets pending values and a display copy.\n */\n private updatePending(\n row: TRow,\n key: GridRowKey,\n change: {\n fields: string[];\n writers: ((target: TRow, value: unknown) => void)[];\n oldValues: Record<string, unknown>;\n newValues: Record<string, unknown>;\n oldRow: TRow;\n custom: boolean;\n },\n source: 'edit' | 'api',\n session: EditSession<TRow> | null,\n ): GridCrudResult<TRow> {\n const { fields, writers, oldValues, newValues, oldRow, custom } = change;\n const added = this.pendingAdds().has(key);\n this.withHeldEvents(() => {\n if (session !== null && this.editSession() === session) this.editSession.set(null);\n if (added) {\n const write = (values: Record<string, unknown>) => {\n for (let i = 0; i < fields.length; i++) {\n try {\n writers[i](row, values[fields[i]]);\n } catch (error) {\n this.reportError({ source: 'edit', field: fields[i], error });\n }\n }\n this.afterPendingWrite(row, fields);\n };\n write(newValues);\n this.recordStep({ undo: () => write(oldValues), redo: () => write(newValues) });\n } else {\n const before = this.pendingSnapshot(key);\n this.setPendingValues(row, key, fields, oldValues, newValues, custom);\n const after = this.pendingSnapshot(key);\n this.recordStep({ undo: () => this.restorePending(key, row, before), redo: () => this.restorePending(key, row, after) });\n }\n const display = this.displayRow(row);\n const sink = this.events;\n this.emit(() => sink.rowUpdated?.({ row: display, oldRow, key, oldValues, newValues, changedFields: fields, pending: true, source }), false);\n this.emitPendingChange('update');\n });\n return { ok: true, row: this.displayRow(row), key };\n }\n\n /** Marks rows as deleted; pending adds are dropped instead. */\n private deletePending(rows: readonly TRow[], keys: readonly GridRowKey[], source: 'ui' | 'api' | 'keyboard'): GridCrudResult<TRow> {\n const adds = this.pendingAdds();\n const deletes = this.pendingDeletes();\n const dropped: PendingAdd<TRow>[] = [];\n const marked: [GridRowKey, TRow][] = [];\n for (let i = 0; i < keys.length; i++) {\n const add = adds.get(keys[i]);\n if (add !== undefined) dropped.push(add);\n else if (!deletes.has(keys[i])) marked.push([keys[i], rows[i]]);\n }\n const apply = (deleted: boolean) => {\n if (dropped.length > 0) this.setPendingAdds(dropped, !deleted);\n if (marked.length > 0) this.setPendingDeletes(marked, deleted);\n };\n this.withHeldEvents(() => {\n const sink = this.events;\n this.emit(() => sink.rowDeleted?.({ row: rows[0], key: keys[0], rows, keys, pending: true, source }), false);\n apply(true);\n if (dropped.length > 0 || marked.length > 0) {\n this.recordStep({ undo: () => apply(false), redo: () => apply(true) });\n this.emitPendingChange('delete');\n }\n });\n return { ok: true, row: rows[0], key: keys[0], rows, keys };\n }\n\n private setPendingAdds(entries: readonly PendingAdd<TRow>[], present: boolean): void {\n const next = new Map(this.pendingAdds());\n for (const entry of entries) {\n if (present) next.set(entry.key, entry);\n else next.delete(entry.key);\n this.bumpRow(entry.row);\n }\n this.pendingAdds.set(next);\n this.editVersion.update((v) => v + 1);\n if (!present) this.forgetRows(entries.map((entry) => entry.key));\n this.retargetEdit();\n }\n\n private setPendingDeletes(entries: readonly [GridRowKey, TRow][], deleted: boolean): void {\n const next = new Map(this.pendingDeletes());\n for (const [key, row] of entries) {\n if (deleted) next.set(key, row);\n else next.delete(key);\n this.bumpRow(row);\n }\n this.pendingDeletes.set(next);\n this.editVersion.update((v) => v + 1);\n if (deleted) this.forgetRows(entries.map(([key]) => key));\n }\n\n /**\n * Rows that were removed or marked deleted: their edit is cancelled and they are deselected. The selected cell only\n * goes with rows that left the grid (a row marked deleted is still shown until the save).\n */\n private forgetRows(keys: readonly GridRowKey[]): void {\n const session = this.editSession();\n if (session && !session.isNew && keys.includes(this.keyOf()(session.row))) this.cancelEdit();\n const selection = this.selection();\n const deselect = selection.size === 0 ? EMPTY_ARRAY : keys.filter((key) => selection.has(key));\n if (deselect.length > 0) this.deselectKeys(deselect, 'delete');\n this.reconcileSelectedCell('delete', false);\n }\n\n /** Stores pending values of a data row. A value equal to the data's drops that change. */\n private setPendingValues(\n row: TRow,\n key: GridRowKey,\n fields: readonly string[],\n oldValues: Readonly<Record<string, unknown>>,\n newValues: Readonly<Record<string, unknown>>,\n custom: boolean,\n ): void {\n let update = this.pendingUpdates.get(key);\n if (!update) {\n update = { row, key, values: new Map(), original: new Map(), custom: false };\n this.pendingUpdates.set(key, update);\n }\n update.custom ||= custom;\n for (const field of fields) {\n if (!update.original.has(field)) update.original.set(field, oldValues[field]);\n if (sameValue(newValues[field], update.original.get(field))) {\n update.values.delete(field);\n update.original.delete(field);\n } else {\n update.values.set(field, newValues[field]);\n }\n }\n this.rebuildMerged(update);\n this.afterPendingWrite(row, fields);\n }\n\n /** Rebuilds the display copy of a row with pending values (or forgets the row when none are left). */\n private rebuildMerged(update: PendingUpdate<TRow>): void {\n this.mergedRows.delete(update.row);\n if (update.values.size === 0) {\n this.pendingUpdates.delete(update.key);\n return;\n }\n const merged = copyAlongPaths(update.row, update.values.keys(), update.custom);\n const columns = this.columnsByField();\n for (const [field, value] of update.values) {\n const column = columns.get(field);\n const write = column ? column.setValue : this.pathSetter(field);\n try {\n write?.(merged, value);\n } catch {\n // Reported when the change is saved.\n }\n }\n this.mergedRows.set(update.row, merged);\n }\n\n private pendingSnapshot(key: GridRowKey): Omit<PendingUpdate<TRow>, 'row' | 'key'> | null {\n const update = this.pendingUpdates.get(key);\n return update ? { values: new Map(update.values), original: new Map(update.original), custom: update.custom } : null;\n }\n\n /** Undo/redo of an update: puts back the pending values a row had. */\n private restorePending(key: GridRowKey, row: TRow, snapshot: Omit<PendingUpdate<TRow>, 'row' | 'key'> | null): void {\n const current = this.pendingUpdates.get(key);\n const target = this.dataRowByKey(key) ?? current?.row ?? row;\n const fields = new Set<string>([...(current?.values.keys() ?? []), ...(snapshot?.values.keys() ?? [])]);\n if (current) this.mergedRows.delete(current.row);\n this.pendingUpdates.delete(key);\n if (snapshot !== null) {\n const update: PendingUpdate<TRow> = {\n row: target,\n key,\n values: new Map(snapshot.values),\n original: new Map(snapshot.original),\n custom: snapshot.custom,\n };\n this.pendingUpdates.set(key, update);\n this.rebuildMerged(update);\n }\n this.afterPendingWrite(target, [...fields]);\n }\n\n private afterPendingWrite(row: TRow, fields: Iterable<string>): void {\n for (const field of fields) this.bumpChangedField(field);\n this.bumpRow(row);\n this.editVersion.update((v) => v + 1);\n }\n\n /** Writes the saved changes into the data: values in place, deletes and adds as a new array. */\n private applyChanges(changes: GridChangeSet<TRow>): void {\n const keyOf = this.keyOf();\n const columns = this.columnsByField();\n const adds = [...this.pendingAdds().values()];\n this.withHeldEvents(() => {\n for (const update of changes.updated) {\n // Found again by key, in case the data was replaced while the save was running.\n const row = this.dataRowByKey(update.key) ?? update.original;\n for (const field of Object.keys(update.changes)) {\n const column = columns.get(field);\n const write = column ? column.setValue : this.pathSetter(field);\n try {\n write?.(row, update.changes[field]);\n } catch (error) {\n this.reportError({ source: 'edit', field, error });\n }\n }\n }\n const structural = changes.added.length > 0 || changes.deleted.length > 0;\n let next = this.data();\n if (structural) {\n const deleted = new Set<GridRowKey>(changes.deletedKeys);\n const rows = deleted.size > 0 ? next.filter((row) => !deleted.has(keyOf(row))) : next.slice();\n const fallback = this.config().editing.addPosition;\n for (const add of adds) rows.splice(resolveAddPosition(add.position, fallback, rows.length), 0, add.row);\n next = rows;\n }\n this.clearPending();\n if (structural) this.commitData(next);\n this.retargetEdit();\n this.reconcileSelectedCell('delete', false);\n const sink = this.events;\n if (structural) this.emit(() => sink.dataChange?.(next), false);\n this.emit(() => sink.changesSaved?.(changes), false);\n if (structural) this.emitCrudRefresh(EMPTY_ARRAY, 'save');\n this.emitPendingChange('save');\n });\n }\n\n /** Forgets every pending change and the undo history; every rendered row is drawn again. */\n private clearPending(): void {\n this.pendingAdds.set(EMPTY_MAP);\n this.pendingDeletes.set(EMPTY_MAP);\n this.pendingUpdates.clear();\n this.mergedRows.clear();\n this.undoStack = [];\n this.redoStack = [];\n this.saveFailed.set(false);\n this.summaryForceAll++;\n this.summaryNonce.update((v) => v + 1);\n this.editVersion.update((v) => v + 1);\n this.renderNonce.update((v) => v + 1);\n }\n\n /** After the data was replaced or refreshed, pending changes follow their rows by key (or go with them). */\n private rebasePending(defer: boolean): void {\n if (this.pendingUpdates.size === 0 && this.pendingDeletes().size === 0) return;\n let dropped = false;\n for (const update of [...this.pendingUpdates.values()]) {\n const row = this.dataRowByKey(update.key);\n this.mergedRows.delete(update.row);\n if (row === undefined) {\n this.pendingUpdates.delete(update.key);\n dropped = true;\n continue;\n }\n update.row = row;\n this.rebuildMerged(update);\n }\n const deletes = this.pendingDeletes();\n if (deletes.size > 0) {\n const next = new Map<GridRowKey, TRow>();\n for (const key of deletes.keys()) {\n const row = this.dataRowByKey(key);\n if (row !== undefined) next.set(key, row);\n }\n dropped ||= next.size !== deletes.size;\n this.pendingDeletes.set(next);\n }\n if (dropped) this.emitPendingChange('refresh', defer);\n }\n\n /** Records an undoable step; a new change clears the redo history. */\n private recordStep(step: BatchStep): void {\n this.redoStack = [];\n const limit = this.config().editing.undoLimit;\n if (limit <= 0) return;\n this.undoStack.push(step);\n if (this.undoStack.length > limit) this.undoStack.splice(0, this.undoStack.length - limit);\n }\n\n /** Undo/redo discard an open edit of a data row (an open add row stays). */\n private discardRowEdit(): void {\n const session = this.editSession();\n if (session && !session.isNew) this.cancelEdit();\n }\n\n private emitPendingChange(action: GridPendingChangeEvent['action'], defer = false): void {\n if (action !== 'save') this.saveFailed.set(false);\n this.pendingVersion.update((v) => v + 1);\n const sink = this.events;\n if (!sink.pendingChange) return;\n const deletes = this.pendingDeletes();\n let updated = 0;\n for (const key of this.pendingUpdates.keys()) if (!deletes.has(key)) updated++;\n const event: GridPendingChangeEvent = {\n action,\n hasChanges: this.hasPendingChanges(),\n added: this.pendingAdds().size,\n updated,\n deleted: deletes.size,\n canUndo: this.canUndo(),\n canRedo: this.canRedo(),\n };\n this.emit(() => sink.pendingChange?.(event), defer);\n }\n\n /** The data row with this key (never a pending add). */\n private dataRowByKey(key: GridRowKey): TRow | undefined {\n const position = this.keyIndex().positions.get(key);\n return position === undefined ? undefined : this.data()[position];\n }\n\n // ----- columns -----\n\n /**\n * Sets a column's width (clamped to min/max). `startWidth` is the width when a drag started, so every\n * event of one drag reports the same `oldWidth`.\n */\n setColumnWidth(field: string, width: number, finished = true, source: 'user' | 'api' = 'api', startWidth?: number): void {\n const lc = this.layout().byField.get(field);\n if (!lc) return;\n const oldWidth = startWidth ?? lc.width;\n const clamped = Math.round(Math.min(lc.col.maxWidth, Math.max(lc.col.minWidth, width)));\n if (clamped !== lc.width) {\n const next = new Map(this.widthOverrides());\n next.set(field, clamped);\n this.widthOverrides.set(next);\n }\n this.events.columnResize?.({ field, column: lc.col, oldWidth, newWidth: clamped, width: clamped, finished, source });\n }\n\n /** Restores the configured width of one column, or of every resized column. */\n resetColumnWidth(field?: string): void {\n const overrides = this.widthOverrides();\n const fields = field === undefined ? [...overrides.keys()] : overrides.has(field) ? [field] : [];\n if (fields.length === 0) return;\n const before = this.layout().byField;\n const next = new Map(overrides);\n for (const f of fields) next.delete(f);\n this.widthOverrides.set(next);\n const after = this.layout().byField;\n for (const f of fields) {\n const lc = after.get(f);\n const old = before.get(f);\n if (!lc || !old) continue;\n this.events.columnResize?.({ field: f, column: lc.col, oldWidth: old.width, newWidth: lc.width, width: lc.width, finished: true, source: 'reset' });\n }\n }\n\n setColumnVisible(field: string, visible: boolean): void {\n const next = new Map(this.visibilityOverrides());\n next.set(field, visible);\n this.visibilityOverrides.set(next);\n }\n\n columnWidth(field: string): number | undefined {\n return this.layout().byField.get(field)?.width;\n }\n\n // ----- summaries -----\n\n recalculateSummary(fields?: string | readonly string[]): void {\n if (fields === undefined) this.summaryForceAll++;\n else for (const f of typeof fields === 'string' ? [fields] : fields) this.summaryForce.set(f, (this.summaryForce.get(f) ?? 0) + 1);\n this.summaryNonce.update((v) => v + 1);\n }\n\n // ----- states -----\n\n setLoading(loading: boolean): void {\n this.loadingState.set(loading);\n this.syncLoading('api', false);\n }\n\n private lastLoading = false;\n\n /** Emits `loadingChange` once per real change of the effective loading state. */\n private syncLoading(source: 'input' | 'api', defer: boolean): void {\n const loading = this.loading();\n if (loading === this.lastLoading) return;\n this.lastLoading = loading;\n this.emit(() => this.events.loadingChange?.({ loading, source }), defer);\n }\n\n setError(error: unknown): void {\n this.errorState.set(error);\n }\n\n // ----- editing -----\n\n /** Editable fields of a row, in display order (never the primary-key field). */\n editableFields(row: TRow): string[] {\n return this.layout()\n .columns.filter((lc) => this.isCellEditable(lc.col, row))\n .map((lc) => lc.key);\n }\n\n /**\n * Starts editing a cell (field given) or a whole row. In row mode (`editing.mode: 'row'`),\n * starting on a cell edits the whole row with that cell focused.\n */\n startEdit(rowIndex: number, field?: string): boolean {\n if (this.saving()) return false;\n if (this.gridEditMode()) {\n if (field) this.viewport?.focusCell(rowIndex, field);\n return true;\n }\n const row = this.viewRows()[rowIndex];\n if (row === undefined) return false;\n const current = this.editSession();\n if (current) {\n if (current.row === row && (!field || current.fields.includes(field))) return true;\n if (!this.commitEdit()) return false;\n }\n const rowMode = !field || this.config().editing.mode === 'row';\n const editable = this.editableFields(row);\n const fields = rowMode ? editable : editable.filter((f) => f === field);\n if (fields.length === 0) return false;\n const values: Record<string, unknown> = {};\n const original: Record<string, unknown> = {};\n const columns = this.columnsByField();\n for (const f of fields) {\n const v = columns.get(f)!.getValue(row);\n values[f] = v;\n original[f] = v;\n }\n const session: EditSession<TRow> = {\n row,\n rowIndex,\n mode: rowMode ? 'row' : 'cell',\n fields,\n focusField: field && fields.includes(field) ? field : fields[0],\n values,\n original,\n errors: {},\n isNew: false,\n position: 'top',\n };\n this.editSession.set(session);\n this.events.editStart?.({ state: this.publicEditState(session) });\n return true;\n }\n\n /** Stores a draft value and re-validates it. */\n setDraft(field: string, value: unknown): string | null {\n const session = this.editSession();\n if (!session || !session.fields.includes(field)) return null;\n session.values[field] = value;\n const error = this.validate(session.row, field, value);\n if ((session.errors[field] ?? null) !== error) {\n session.errors[field] = error;\n // A new object, so the (OnPush) editing row sees the change and shows the message.\n this.editSession.set({ ...session });\n }\n return error;\n }\n\n /**\n * Saves the current session: updates the row (`rowUpdating`/`rowUpdated`, source `'edit'`), or adds the\n * inline add row. Returns false and keeps editing when validation fails or a handler cancels.\n */\n commitEdit(): boolean {\n const session = this.editSession();\n if (!session) return true;\n let invalid = false;\n for (const f of session.fields) {\n const error = this.validate(session.row, f, session.values[f]);\n session.errors[f] = error;\n if (error) invalid = true;\n }\n if (invalid) {\n this.editSession.set({ ...session });\n return false;\n }\n const columns = this.columnsByField();\n const changes: Record<string, unknown> = {};\n for (const f of session.fields) {\n const column = columns.get(f);\n if (column) changes[f] = this.parseEditedValue(column, session.values[f], session.original[f]);\n }\n const result = session.isNew\n ? this.commitNewRow(session, changes)\n : this.applyUpdate(session.row, this.keyOf()(session.row), changes, 'edit', session, session.rowIndex);\n if (!result.ok) {\n this.showEditErrors(session, result);\n return false;\n }\n this.events.editCommit?.({ state: this.publicEditState(session) });\n return true;\n }\n\n /** Writes the add row's values into its draft and adds it. */\n private commitNewRow(session: EditSession<TRow>, changes: Readonly<Record<string, unknown>>): GridCrudResult<TRow> {\n const columns = this.columnsByField();\n for (const field of Object.keys(changes)) {\n try {\n columns.get(field)?.setValue?.(session.row, changes[field]);\n } catch (error) {\n this.reportError({ source: 'edit', field, error });\n }\n }\n return this.insertNewRow(session.row, session.position, 'ui', true, session);\n }\n\n cancelEdit(emit = true): void {\n const session = this.editSession();\n if (!session) return;\n this.editSession.set(null);\n if (!emit) return;\n const state = this.publicEditState(session);\n this.emit(() => this.events.editCancel?.({ state }), false);\n }\n\n /**\n * Grid edit mode: every change is validated and saved immediately (as an update with source `'edit'`).\n * `saved` is false when the value was refused or a `rowUpdating` handler cancelled.\n */\n commitGridCell(row: TRow, rowIndex: number, field: string, value: unknown): { error: string | null; saved: boolean } {\n const column = this.columnsByField().get(field);\n if (!column || this.saving()) return { error: null, saved: false };\n const error = this.validate(row, field, value);\n if (error) return { error, saved: false };\n const parsed = this.parseEditedValue(column, value, column.getValue(row));\n const result = this.applyUpdate(row, this.keyOf()(row), { [field]: parsed }, 'edit', null, rowIndex);\n if (result.ok) return { error: null, saved: true };\n return { error: result.errors?.[field] ?? result.errors?.['$row'] ?? null, saved: false };\n }\n\n setGridEditMode(enabled: boolean): void {\n // An open add row stays open: it is independent of the editors of grid edit mode.\n const session = this.editSession();\n if (enabled && session && !session.isNew) {\n if (!this.commitEdit()) this.cancelEdit();\n }\n this.gridEditMode.set(enabled);\n }\n\n getEditState(): GridEditState<TRow> | null {\n const s = this.editSession();\n return s ? this.publicEditState(s) : null;\n }\n\n private publicEditState(s: EditSession<TRow>): GridEditState<TRow> {\n return {\n row: s.row,\n rowIndex: s.rowIndex,\n isNew: s.isNew,\n fields: [...s.fields],\n mode: s.mode,\n values: { ...s.values },\n errors: { ...s.errors },\n };\n }\n\n /** Validates an editor value: a number for number columns, then `required` and the column validator. */\n private validate(row: TRow, field: string, value: unknown): string | null {\n const column = this.columnsByField().get(field);\n if (!column) return null;\n if (column.type === 'number' && value !== null && value !== undefined && value !== '' && toNumber(value) === null) {\n return 'Enter a number';\n }\n return this.checkValue(column, this.parseEditedValue(column, value, column.getValue(row)), row);\n }\n\n /** Converts editor output back to the column type, keeping the shape of the original value. */\n parseEditedValue(column: ResolvedColumn<TRow>, value: unknown, original: unknown): unknown {\n if (value === '' || value === undefined) return column.type === 'text' ? (value ?? '') : null;\n switch (column.type) {\n case 'number':\n return toNumber(value);\n case 'boolean':\n return toBoolean(value);\n case 'date': {\n const t = toTimestamp(value);\n if (t === null) return null;\n if (typeof original === 'string') return original.length === 10 ? dayKey(t) : new Date(t).toISOString();\n if (typeof original === 'number') return t;\n return new Date(t);\n }\n default:\n return value;\n }\n }\n}\n","import {\n ApplicationRef,\n ComponentRef,\n EnvironmentInjector,\n Injectable,\n Injector,\n NgZone,\n OnDestroy,\n createComponent,\n inject,\n} from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\nimport { distinctValues } from '../core/filter-engine';\nimport { GridFilterPopupComponent } from '../components/filter-popup.component';\nimport { THEME_VARIABLES } from '../core/theme';\nimport { GridStore, type FilterPopupHandle } from './grid-store';\n\n/**\n * Opens the Excel-style filter popup in `document.body`, so it is never clipped by the grid\n * or by transformed/overflow-hidden ancestors. Theme variables are copied from the grid.\n */\n@Injectable()\nexport class GridFilterPopupService implements FilterPopupHandle, OnDestroy {\n private readonly store = inject(GridStore);\n private readonly appRef = inject(ApplicationRef);\n private readonly environmentInjector = inject(EnvironmentInjector);\n private readonly injector = inject(Injector);\n private readonly document = inject(DOCUMENT);\n private readonly zone = inject(NgZone);\n\n /** The `<infi-grid>` element; set by the grid component. */\n host: HTMLElement | null = null;\n private ref: ComponentRef<GridFilterPopupComponent> | null = null;\n private anchor: HTMLElement | null = null;\n private listeners: (() => void)[] = [];\n\n constructor() {\n this.store.filterPopup = this;\n }\n\n ngOnDestroy(): void {\n this.close();\n if (this.store.filterPopup === this) this.store.filterPopup = null;\n }\n\n isOpen(): boolean {\n return this.ref !== null;\n }\n\n open(field: string, anchor: HTMLElement | null): void {\n this.close();\n const store = this.store;\n const column = store.columnsByField().get(field);\n const layoutColumn = store.layout().byField.get(field);\n if (!column || !layoutColumn || !column.filterable) return;\n if (!anchor) {\n // Opened through the API: bring the column into view, then anchor on its header.\n store.viewport?.scrollToColumn(layoutColumn.index, 'auto');\n const escaped = CSS.escape(field);\n anchor =\n this.host?.querySelector<HTMLElement>(`[data-filter-field=\"${escaped}\"]`) ??\n this.host?.querySelector<HTMLElement>(`.infi-grid__header-cell[data-field=\"${escaped}\"]`) ??\n this.host;\n }\n if (!anchor) return;\n const config = store.config();\n const ref = createComponent(GridFilterPopupComponent, {\n environmentInjector: this.environmentInjector,\n elementInjector: this.injector,\n });\n ref.instance.init({\n column,\n text: config.text,\n model: store.filterModel()[field] ?? null,\n showSortButtons: config.filtering.showSortButtons && column.sortable,\n sortDirection: store.sortModel().find((s) => s.field === field)?.direction ?? null,\n loadValues: () =>\n distinctValues(store.data(), column, store.filterModel(), store.columnsByField(), {\n locale: config.locale,\n blanksLabel: config.text.blanks,\n limit: config.filtering.valueListLimit,\n }),\n apply: (model) => {\n store.setColumnFilter(field, model);\n this.close(true);\n },\n cancel: () => this.close(true),\n sort: (direction) => {\n store.applySort(field, direction);\n this.close(true);\n },\n anyFiltered: Object.keys(store.filterModel()).length > 0,\n clearAll: () => {\n store.clearFilter();\n this.close(true);\n },\n });\n const element = ref.location.nativeElement as HTMLElement;\n this.applyTheme(element);\n this.appRef.attachView(ref.hostView);\n this.document.body.appendChild(element);\n this.ref = ref;\n this.anchor = anchor;\n store.openFilterField.set(field);\n ref.changeDetectorRef.detectChanges();\n this.position();\n ref.instance.focusFirst();\n\n this.zone.runOutsideAngular(() => {\n const onPointerDown = (e: Event) => {\n const target = e.target as Node | null;\n if (target && (element.contains(target) || this.anchor?.contains(target))) return;\n this.zone.run(() => this.close());\n };\n const onResize = () => this.zone.run(() => this.close());\n const onScroll = (e: Event) => {\n const target = e.target as Node | null;\n if (target && element.contains(target)) return;\n this.position();\n };\n this.document.addEventListener('pointerdown', onPointerDown, true);\n window.addEventListener('resize', onResize);\n this.document.addEventListener('scroll', onScroll, true);\n this.listeners.push(\n () => this.document.removeEventListener('pointerdown', onPointerDown, true),\n () => window.removeEventListener('resize', onResize),\n () => this.document.removeEventListener('scroll', onScroll, true),\n );\n });\n }\n\n /** Closes the popup; `restoreFocus` returns focus to the header filter button. */\n close(restoreFocus = false): void {\n const ref = this.ref;\n if (!ref) return;\n for (const off of this.listeners) off();\n this.listeners = [];\n this.ref = null;\n this.appRef.detachView(ref.hostView);\n ref.destroy();\n const anchor = this.anchor;\n this.anchor = null;\n this.store.openFilterField.set(null);\n if (restoreFocus && anchor?.isConnected) anchor.focus({ preventScroll: true });\n }\n\n private position(): void {\n const ref = this.ref;\n const anchor = this.anchor;\n if (!ref || !anchor) return;\n const element = ref.location.nativeElement as HTMLElement;\n const cell = anchor.closest<HTMLElement>('.infi-grid__header-cell') ?? anchor;\n const rect = cell.getBoundingClientRect();\n const width = element.offsetWidth;\n const height = element.offsetHeight;\n const vw = window.innerWidth;\n const vh = window.innerHeight;\n let left = rect.left;\n if (left + width > vw - 8) left = Math.max(8, vw - 8 - width);\n let top = rect.bottom + 2;\n if (top + height > vh - 8) top = Math.max(8, rect.top - height - 2);\n element.style.left = `${Math.round(left)}px`;\n element.style.top = `${Math.round(top)}px`;\n }\n\n private applyTheme(element: HTMLElement): void {\n const host = this.host;\n if (!host) return;\n const theme = Array.from(host.classList).filter((c) => c.startsWith('infi-grid-theme-'));\n element.classList.add(...theme);\n const styles = getComputedStyle(host);\n for (const name of THEME_VARIABLES) {\n const value = styles.getPropertyValue(name);\n if (value) element.style.setProperty(name, value);\n }\n }\n}\n","import type { GridTooltipPlacement } from '../models/tooltip.types';\n\nexport interface TooltipRect {\n readonly left: number;\n readonly top: number;\n readonly width: number;\n readonly height: number;\n}\n\nexport interface TooltipPosition {\n readonly left: number;\n readonly top: number;\n /** The side used: the preferred one, or the opposite side when the preferred one has no room. */\n readonly placement: GridTooltipPlacement;\n}\n\nconst OPPOSITE: Readonly<Record<GridTooltipPlacement, GridTooltipPlacement>> = {\n top: 'bottom',\n bottom: 'top',\n left: 'right',\n right: 'left',\n};\n\n/**\n * Places a tooltip of `size` next to `anchor` (both in viewport coordinates), centered on it.\n * Flips to the opposite side when the preferred side has no room, then keeps it inside the viewport.\n */\nexport function placeTooltip(\n anchor: TooltipRect,\n size: { readonly width: number; readonly height: number },\n viewport: { readonly width: number; readonly height: number },\n placement: GridTooltipPlacement,\n gap = 6,\n margin = 4,\n): TooltipPosition {\n const fits = (side: GridTooltipPlacement): boolean => {\n switch (side) {\n case 'top':\n return anchor.top - gap - size.height >= margin;\n case 'bottom':\n return anchor.top + anchor.height + gap + size.height <= viewport.height - margin;\n case 'left':\n return anchor.left - gap - size.width >= margin;\n case 'right':\n return anchor.left + anchor.width + gap + size.width <= viewport.width - margin;\n }\n };\n const side = !fits(placement) && fits(OPPOSITE[placement]) ? OPPOSITE[placement] : placement;\n let left: number;\n let top: number;\n if (side === 'top' || side === 'bottom') {\n left = anchor.left + (anchor.width - size.width) / 2;\n top = side === 'top' ? anchor.top - gap - size.height : anchor.top + anchor.height + gap;\n } else {\n top = anchor.top + (anchor.height - size.height) / 2;\n left = side === 'left' ? anchor.left - gap - size.width : anchor.left + anchor.width + gap;\n }\n const clamp = (value: number, max: number) => Math.max(margin, Math.min(value, max - margin));\n return {\n left: Math.round(clamp(left, viewport.width - size.width)),\n top: Math.round(clamp(top, viewport.height - size.height)),\n placement: side,\n };\n}\n","import {\n ComponentRef,\n EmbeddedViewRef,\n EnvironmentInjector,\n Injectable,\n Injector,\n OnDestroy,\n TemplateRef,\n createComponent,\n inject,\n reflectComponentType,\n type Type,\n} from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\nimport type { GridTemplate } from '../models/template.types';\nimport type { GridTooltipPlacement } from '../models/tooltip.types';\nimport { THEME_VARIABLES } from '../core/theme';\nimport { placeTooltip } from '../core/tooltip-position';\n\n/** Text, or a template (TemplateRef or component) with its context. */\nexport type TooltipContent = string | { readonly template: GridTemplate<any>; readonly context: object };\n\nlet nextId = 0;\n\n/**\n * The grid's single tooltip, in `document.body` so it is never clipped. Created on first use, reused for every\n * cell and header, and removed with the grid. Templates are rendered on show (checked once: they aren't\n * attached to the application, which would make showing a tooltip check the whole app) and destroyed on hide.\n */\n@Injectable()\nexport class GridTooltipService implements OnDestroy {\n private readonly environmentInjector = inject(EnvironmentInjector);\n private readonly injector = inject(Injector);\n private readonly document = inject(DOCUMENT);\n\n /** The `<infi-grid>` element (for the theme); set by the grid component. */\n host: HTMLElement | null = null;\n readonly id = `infi-grid-tooltip-${++nextId}`;\n private element: HTMLElement | null = null;\n private view: { readonly ref: EmbeddedViewRef<unknown> } | { readonly component: ComponentRef<unknown> } | null = null;\n private anchor: HTMLElement | null = null;\n\n /** True while the tooltip is shown. */\n get visible(): boolean {\n return this.anchor !== null;\n }\n\n /** Shows `content` next to `anchor` (replacing what was shown). */\n show(anchor: HTMLElement, content: TooltipContent, placement: GridTooltipPlacement): void {\n const element = this.ensureElement();\n this.clear();\n if (typeof content === 'string') element.textContent = content;\n else this.render(element, content);\n this.applyTheme(element);\n element.hidden = false;\n const rect = anchor.getBoundingClientRect();\n const view = this.document.defaultView;\n const position = placeTooltip(\n rect,\n { width: element.offsetWidth, height: element.offsetHeight },\n { width: view?.innerWidth ?? 0, height: view?.innerHeight ?? 0 },\n placement,\n );\n element.style.left = `${position.left}px`;\n element.style.top = `${position.top}px`;\n element.dataset['placement'] = position.placement;\n this.anchor = anchor;\n anchor.setAttribute('aria-describedby', this.id);\n }\n\n hide(): void {\n if (!this.element || this.anchor === null) return;\n this.clear();\n this.element.hidden = true;\n }\n\n ngOnDestroy(): void {\n this.hide();\n this.element?.remove();\n this.element = null;\n }\n\n private ensureElement(): HTMLElement {\n if (this.element) return this.element;\n const element = this.document.createElement('div');\n element.className = 'infi-grid-tooltip';\n element.id = this.id;\n element.setAttribute('role', 'tooltip');\n element.hidden = true;\n this.document.body.appendChild(element);\n this.element = element;\n return element;\n }\n\n private render(element: HTMLElement, content: Exclude<TooltipContent, string>): void {\n const template = content.template;\n if (template instanceof TemplateRef) {\n const view = template.createEmbeddedView({ ...content.context }, this.injector);\n view.detectChanges();\n for (const node of view.rootNodes) element.appendChild(node);\n this.view = { ref: view };\n } else {\n const ref = createComponent(template as Type<unknown>, {\n environmentInjector: this.environmentInjector,\n elementInjector: this.injector,\n });\n if (reflectComponentType(template as Type<unknown>)?.inputs.some((i) => i.templateName === 'context')) {\n ref.setInput('context', content.context);\n }\n ref.changeDetectorRef.detectChanges();\n element.appendChild(ref.location.nativeElement);\n this.view = { component: ref };\n }\n }\n\n /** Destroys rendered views and detaches the tooltip from its anchor. */\n private clear(): void {\n const view = this.view;\n if (view) {\n if ('ref' in view) view.ref.destroy();\n else view.component.destroy();\n this.view = null;\n }\n if (this.element) this.element.textContent = '';\n if (this.anchor?.getAttribute('aria-describedby') === this.id) this.anchor.removeAttribute('aria-describedby');\n this.anchor = null;\n }\n\n private applyTheme(element: HTMLElement): void {\n const host = this.host;\n if (!host) return;\n element.className = 'infi-grid-tooltip';\n for (const cls of Array.from(host.classList)) if (cls.startsWith('infi-grid-theme-')) element.classList.add(cls);\n const styles = getComputedStyle(host);\n for (const name of THEME_VARIABLES) {\n const value = styles.getPropertyValue(name);\n if (value) element.style.setProperty(name, value);\n else element.style.removeProperty(name);\n }\n }\n}\n","/**\n * Pure virtualization math. Row heights are fixed, so every position is O(1);\n * column positions use prefix sums and binary search.\n */\n\n/**\n * Browsers cap element height (Chrome ~33.5M px, Firefox ~17.9M px). Above this height the\n * rows canvas stays at this size and scroll positions are scaled to the real row positions.\n */\nexport const MAX_CANVAS_HEIGHT = 15_000_000;\n\nexport interface VerticalMetrics {\n /** Height of all rows (rowCount × rowHeight). */\n totalHeight: number;\n /** Height of the scrollable rows canvas (≤ MAX_CANVAS_HEIGHT). */\n canvasHeight: number;\n /** totalHeight / canvasHeight scroll ratio, 1 when no scaling is needed. */\n scale: number;\n /** Scroll position in real row coordinates. */\n virtualTop: number;\n /** Subtract from `rowIndex × rowHeight` to get the row's position inside the canvas. */\n offset: number;\n}\n\nexport function computeVerticalMetrics(\n scrollTop: number,\n viewportHeight: number,\n rowCount: number,\n rowHeight: number,\n maxCanvasHeight = MAX_CANVAS_HEIGHT,\n): VerticalMetrics {\n const totalHeight = rowCount * rowHeight;\n const top = Math.max(0, scrollTop);\n if (totalHeight <= maxCanvasHeight) {\n const virtualTop = Math.min(top, Math.max(0, totalHeight - viewportHeight));\n return { totalHeight, canvasHeight: totalHeight, scale: 1, virtualTop: Math.max(0, virtualTop), offset: 0 };\n }\n const canvasHeight = maxCanvasHeight;\n const scrollRange = Math.max(1, canvasHeight - viewportHeight);\n const virtualRange = Math.max(0, totalHeight - viewportHeight);\n const scale = virtualRange / scrollRange;\n const virtualTop = Math.min(virtualRange, Math.min(top, scrollRange) * scale);\n return { totalHeight, canvasHeight, scale, virtualTop, offset: virtualTop - Math.min(top, scrollRange) };\n}\n\nexport interface IndexRange {\n /** First rendered index (inclusive). */\n start: number;\n /** Last rendered index (exclusive). */\n end: number;\n /** First index inside the viewport (inclusive). */\n visibleStart: number;\n /** Last index inside the viewport (exclusive). */\n visibleEnd: number;\n}\n\nexport function computeRowRange(\n metrics: VerticalMetrics,\n viewportHeight: number,\n rowCount: number,\n rowHeight: number,\n buffer: number,\n virtualize: boolean,\n): IndexRange {\n if (rowCount <= 0) return { start: 0, end: 0, visibleStart: 0, visibleEnd: 0 };\n const visibleStart = Math.min(rowCount - 1, Math.max(0, Math.floor(metrics.virtualTop / rowHeight)));\n const visibleEnd = Math.min(rowCount, Math.max(visibleStart + 1, Math.ceil((metrics.virtualTop + viewportHeight) / rowHeight)));\n if (!virtualize) return { start: 0, end: rowCount, visibleStart, visibleEnd };\n return {\n start: Math.max(0, visibleStart - buffer),\n end: Math.min(rowCount, visibleEnd + buffer),\n visibleStart,\n visibleEnd,\n };\n}\n\n/** Pool size needed to cover the viewport plus buffers; rendered rows reuse these slots. */\nexport function rowPoolSize(viewportHeight: number, rowHeight: number, buffer: number): number {\n return Math.max(1, Math.ceil(viewportHeight / rowHeight) + 1 + buffer * 2);\n}\n\nexport interface ColumnOffsets {\n offsets: number[];\n total: number;\n}\n\nexport function computeColumnOffsets(widths: readonly number[]): ColumnOffsets {\n const offsets = new Array<number>(widths.length);\n let x = 0;\n for (let i = 0; i < widths.length; i++) {\n offsets[i] = x;\n x += widths[i];\n }\n return { offsets, total: x };\n}\n\n/** Index of the column containing x (the last column whose left edge is ≤ x). */\nexport function columnIndexAt(offsets: readonly number[], x: number): number {\n let lo = 0;\n let hi = offsets.length - 1;\n if (hi < 0) return -1;\n while (lo < hi) {\n const mid = (lo + hi + 1) >> 1;\n if (offsets[mid] <= x) lo = mid;\n else hi = mid - 1;\n }\n return lo;\n}\n\nexport function computeColumnRange(\n scrollLeft: number,\n viewportWidth: number,\n offsets: readonly number[],\n buffer: number,\n virtualize: boolean,\n): IndexRange {\n const count = offsets.length;\n if (count === 0) return { start: 0, end: 0, visibleStart: 0, visibleEnd: 0 };\n const left = Math.max(0, scrollLeft);\n const visibleStart = Math.max(0, columnIndexAt(offsets, left));\n let visibleEnd = columnIndexAt(offsets, left + Math.max(0, viewportWidth - 1)) + 1;\n visibleEnd = Math.min(count, Math.max(visibleStart + 1, visibleEnd));\n if (!virtualize) return { start: 0, end: count, visibleStart, visibleEnd };\n // A zero-width viewport (not measured yet) still renders the first columns.\n if (viewportWidth <= 0) visibleEnd = Math.min(count, visibleStart + 1);\n return {\n start: Math.max(0, visibleStart - buffer),\n end: Math.min(count, visibleEnd + buffer),\n visibleStart,\n visibleEnd,\n };\n}\n\n/**\n * Largest column window any horizontal scroll position can render (visible columns + buffers),\n * and the largest number of flagged columns (e.g. columns with templates) in such a window.\n * Used to size the cell pools once, so they never grow (and create views) while scrolling.\n */\nexport function maxColumnWindow(\n offsets: readonly number[],\n totalWidth: number,\n viewportWidth: number,\n buffer: number,\n flags: readonly (readonly boolean[])[],\n): { columns: number; flagged: number[] } {\n const n = offsets.length;\n const flagged = flags.map(() => 0);\n if (n === 0) return { columns: 0, flagged };\n const prefix = flags.map((f) => {\n const p = new Array<number>(n + 1);\n p[0] = 0;\n for (let i = 0; i < n; i++) p[i + 1] = p[i] + (f[i] ? 1 : 0);\n return p;\n });\n const vw = Math.max(1, viewportWidth);\n let columns = 0;\n for (let i = 0; i < n; i++) {\n // With column i first, the window is widest when scrolled to just before i's right edge.\n const right = i + 1 < n ? offsets[i + 1] : totalWidth;\n const last = columnIndexAt(offsets, Math.max(offsets[i], right - 1) + vw - 1);\n const start = Math.max(0, i - buffer);\n const end = Math.min(n, last + 1 + buffer);\n if (end - start > columns) columns = end - start;\n for (let k = 0; k < prefix.length; k++) {\n const count = prefix[k][end] - prefix[k][start];\n if (count > flagged[k]) flagged[k] = count;\n }\n }\n return { columns, flagged };\n}\n\nexport type ScrollAlign = 'auto' | 'start' | 'center' | 'end';\n\n/** Target position (in real coordinates) that brings [itemStart, itemStart + itemSize) into view. */\nexport function alignedScrollTarget(\n itemStart: number,\n itemSize: number,\n viewportSize: number,\n current: number,\n contentSize: number,\n align: ScrollAlign,\n): number {\n let target = current;\n const itemEnd = itemStart + itemSize;\n switch (align) {\n case 'start':\n target = itemStart;\n break;\n case 'center':\n target = itemStart - (viewportSize - itemSize) / 2;\n break;\n case 'end':\n target = itemEnd - viewportSize;\n break;\n default:\n if (itemStart < current) target = itemStart;\n else if (itemEnd > current + viewportSize) target = itemEnd - viewportSize;\n }\n return Math.max(0, Math.min(target, Math.max(0, contentSize - viewportSize)));\n}\n\n/** Converts a real row position to the element's scrollTop (undoes scroll scaling). */\nexport function virtualToScrollTop(virtualTop: number, metrics: VerticalMetrics): number {\n return metrics.scale === 1 ? virtualTop : virtualTop / metrics.scale;\n}\n","import type { ResolvedColumn } from '../models/column.types';\nimport type { GridRowKey } from '../models/data.types';\nimport type { GridHeaderTooltipContext, GridTooltipContext, GridTooltipMode } from '../models/tooltip.types';\nimport type { GridStore } from '../state/grid-store';\nimport type { GridTooltipService, TooltipContent } from '../state/tooltip.service';\n\n/**\n * What a tooltip points at. Body cells are identified by row key and field, not by element: elements are\n * recycled while scrolling, so a recycled element can never keep a stale tooltip.\n */\nexport interface TooltipTarget {\n readonly kind: 'cell' | 'header' | 'summary';\n readonly field: string;\n /** The element the tooltip is placed against. */\n readonly element: HTMLElement;\n readonly key?: GridRowKey;\n readonly row?: unknown;\n readonly rowIndex?: number;\n}\n\nfunction sameTarget(a: TooltipTarget | null, b: TooltipTarget | null): boolean {\n if (a === null || b === null) return a === b;\n return a.kind === b.kind && a.field === b.field && (a.kind !== 'cell' || a.key === b.key);\n}\n\n/** Text cut off by its box (ellipsis). One layout read; for template cells the first child counts too. */\nfunction isTruncated(element: HTMLElement): boolean {\n if (element.scrollWidth > element.clientWidth) return true;\n const child = element.firstElementChild as HTMLElement | null;\n return child !== null && child.clientWidth > 0 && child.scrollWidth > child.clientWidth;\n}\n\n/**\n * Decides when the grid's tooltip shows and with what: the target under the pointer or the keyboard focus,\n * whether its text is cut off (measured once per target, never per frame), the show and hide delays, and the\n * content (a column's `tooltip` function, a tooltip template, or the text).\n */\nexport class GridTooltipController<TRow> {\n private target: TooltipTarget | null = null;\n private timer: ReturnType<typeof setTimeout> | null = null;\n\n constructor(\n private readonly store: GridStore<TRow>,\n private readonly tooltip: GridTooltipService,\n ) {}\n\n /** The pointer (or the keyboard focus) is now on `next`, or on nothing. */\n point(next: TooltipTarget | null): void {\n if (sameTarget(this.target, next)) return;\n this.target = next;\n this.clearTimer();\n const config = this.store.config().tooltips;\n const content = next === null ? null : this.content(next);\n if (next === null || content === null) {\n if (this.tooltip.visible) this.schedule(() => this.tooltip.hide(), next === null ? config.hideDelay : 0);\n return;\n }\n // While a tooltip is shown, moving to the next cell switches at once.\n this.schedule(\n () => {\n if (this.target === next && next.element.isConnected) this.tooltip.show(next.element, content, config.placement);\n },\n this.tooltip.visible ? 0 : config.showDelay,\n );\n }\n\n /** Hides it and forgets the target (scrolling, re-rendering): the next pointer move finds the new target. */\n reset(): void {\n this.target = null;\n this.clearTimer();\n this.tooltip.hide();\n }\n\n /** Hides it but keeps the target, so it only comes back on another target (pointer down, key press). */\n dismiss(): void {\n this.clearTimer();\n this.tooltip.hide();\n }\n\n destroy(): void {\n this.clearTimer();\n this.target = null;\n }\n\n private schedule(run: () => void, delay: number): void {\n if (delay <= 0) {\n run();\n return;\n }\n this.timer = setTimeout(() => {\n this.timer = null;\n run();\n }, delay);\n }\n\n private clearTimer(): void {\n if (this.timer !== null) clearTimeout(this.timer);\n this.timer = null;\n }\n\n /** What a target shows, or null (tooltip off, text not cut off, nothing to say). */\n private content(target: TooltipTarget): TooltipContent | null {\n if (target.kind === 'summary') return this.summaryContent(target.element);\n const column = this.store.columnsByField().get(target.field);\n if (!column) return null;\n return target.kind === 'header' ? this.headerContent(column, target.element) : this.cellContent(column, target);\n }\n\n private cellContent(column: ResolvedColumn<TRow>, target: TooltipTarget): TooltipContent | null {\n const store = this.store;\n const config = store.config().tooltips;\n const rule = column.config.tooltip;\n if (rule === false || target.element.classList.contains('is-editing')) return null;\n const row = target.row as TRow;\n const view = store.displayRow(row);\n const value = column.getValue(row);\n const formattedValue = column.formatValue(value, view);\n const truncated = isTruncated(target.element);\n const context: GridTooltipContext<TRow> = {\n $implicit: value,\n value,\n formattedValue,\n row: view,\n rowIndex: target.rowIndex ?? -1,\n column,\n field: column.field,\n truncated,\n api: store.api,\n };\n if (typeof rule === 'function') {\n try {\n return rule(context) || null;\n } catch (error) {\n store.reportError({ source: 'format', field: column.field, error });\n return null;\n }\n }\n let mode: GridTooltipMode;\n if (rule === 'always' || rule === 'truncated' || rule === 'never') mode = rule;\n else if (rule === true) mode = config.cells === 'never' ? 'truncated' : config.cells;\n else if (config.disabledTypes.includes(column.type)) return null;\n else mode = config.cells;\n if (mode === 'never' || (mode === 'truncated' && !truncated)) return null;\n if (column.tooltipTemplate) return { template: column.tooltipTemplate, context };\n return formattedValue === '' ? null : formattedValue;\n }\n\n private headerContent(column: ResolvedColumn<TRow>, element: HTMLElement): TooltipContent | null {\n const config = this.store.config().tooltips;\n const rule = column.config.headerTooltip;\n if (rule === false) return null;\n const mode: GridTooltipMode =\n typeof rule === 'string' ? rule : rule === true ? (config.headers === 'never' ? 'truncated' : config.headers) : config.headers;\n const description = column.config.description || null;\n const truncated = isTruncated(element.querySelector<HTMLElement>('.infi-grid__header-label') ?? element);\n // A description always shows; otherwise the header text, by mode.\n if (description === null && (mode === 'never' || (mode === 'truncated' && !truncated))) return null;\n if (column.headerTooltipTemplate) {\n const context: GridHeaderTooltipContext<TRow> = {\n $implicit: column,\n column,\n header: column.header,\n description,\n truncated,\n api: this.store.api,\n };\n return { template: column.headerTooltipTemplate, context };\n }\n if (description === null) return column.header || null;\n return truncated ? `${column.header}\\n${description}` : description;\n }\n\n /** Summary cells show their label and value when they are cut off. */\n private summaryContent(element: HTMLElement): string | null {\n if (this.store.config().tooltips.cells === 'never') return null;\n const value = element.querySelector<HTMLElement>('.infi-grid__summary-value');\n if (!value) return null;\n const label = element.querySelector<HTMLElement>('.infi-grid__summary-label');\n if (!isTruncated(value) && !(label && isTruncated(label)) && !isTruncated(element)) return null;\n return `${label?.textContent ?? ''} ${value.textContent ?? ''}`.trim() || null;\n }\n}\n","import {\n AfterViewChecked,\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n Input,\n NgZone,\n OnChanges,\n OnDestroy,\n ViewEncapsulation,\n inject,\n} from '@angular/core';\nimport { DOCUMENT } from '@angular/common';\nimport type { GridDataType, ResolvedColumn } from '../models/column.types';\nimport type { GridText } from '../models/config.types';\nimport { FILTER_OPERATOR_INPUTS, type ColumnFilterModel, type FilterCondition, type FilterModel } from '../models/filter.types';\nimport { DEFAULT_TEXT } from '../core/defaults';\nimport { isColumnFilterActive } from '../core/filter-engine';\nimport { THEME_VARIABLES } from '../core/theme';\nimport { dayKey, toTimestamp } from '../core/values';\nimport { GridStore, type LayoutColumn } from '../state/grid-store';\n\ninterface FilterCellView {\n key: string | null;\n ariaCol: number | null;\n left: number;\n width: number;\n cls: string;\n /** Booleans use a select instead of the input. */\n boolean: boolean;\n inputType: string;\n text: string;\n booleanValue: string;\n /** The applied first condition takes two values (`between`): edited in the popup only. */\n locked: boolean;\n /** The operator takes no value (`empty`): the input is disabled. */\n noInput: boolean;\n symbol: string;\n operatorLabel: string;\n inputLabel: string;\n active: boolean;\n}\n\nconst EMPTY_CELL: FilterCellView = {\n key: null,\n ariaCol: null,\n left: 0,\n width: 0,\n cls: 'infi-grid__filter-cell infi-grid__filter-cell--empty',\n boolean: false,\n inputType: 'text',\n text: '',\n booleanValue: '',\n locked: false,\n noInput: false,\n symbol: '',\n operatorLabel: '',\n inputLabel: '',\n active: false,\n};\n\n/** Short symbols of the built-in operators on the operator buttons. */\nconst SYMBOLS: Readonly<Record<string, string>> = {\n contains: '∗a∗',\n notContains: '≠∗',\n equals: '=',\n notEquals: '≠',\n startsWith: 'a∗',\n endsWith: '∗a',\n greaterThan: '>',\n greaterThanOrEqual: '≥',\n lessThan: '<',\n lessThanOrEqual: '≤',\n before: '<',\n after: '>',\n onOrBefore: '≤',\n onOrAfter: '≥',\n between: '↔',\n empty: '∅',\n notEmpty: '!∅',\n};\n\nfunction toInputText(value: unknown, type: GridDataType): string {\n if (value === null || value === undefined) return '';\n if (type === 'date') {\n const t = toTimestamp(value);\n return t === null ? '' : dayKey(t);\n }\n return String(value);\n}\n\n/**\n * The filter row (`filtering.mode: 'row' | 'both'`, shown while a displayed column is filterable, see\n * `GridStore.filterRowHeight`): one cell per column under the header, with an operator button, a typed input\n * (a select for booleans) and a clear button. It edits the first condition of the column's filter and keeps\n * the rest (more conditions, the value list), so the popup shows the same filter.\n *\n * Cells are pooled like header cells: horizontal scrolling rebinds them. Typed text is kept per field, so a\n * recycled input never loses it; an input whose column scrolls away is applied and blurred first.\n */\n@Component({\n selector: 'div[infi-grid-filter-row]',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: { class: 'infi-grid__filter-row', role: 'row' },\n template: `\n @if (leading > 0) {\n <div class=\"infi-grid__pin infi-grid__pin--start\" role=\"gridcell\" aria-colindex=\"1\" [style.width.px]=\"leading\" [class.is-placed]=\"pins !== null\" [style.left.px]=\"pins?.start\"></div>\n }\n @for (cell of cells; track $index) {\n <div role=\"gridcell\" [class]=\"cell.cls\" [style.left.px]=\"cell.left\" [style.width.px]=\"cell.width\" [attr.aria-colindex]=\"cell.ariaCol\" [attr.data-field]=\"cell.key\">\n <button\n type=\"button\"\n class=\"infi-grid__filter-op\"\n [class.is-hidden]=\"cell.boolean\"\n [attr.aria-label]=\"cell.operatorLabel\"\n [attr.title]=\"cell.operatorLabel\"\n aria-haspopup=\"listbox\"\n (click)=\"openMenu($event, cell)\"\n [textContent]=\"cell.symbol\"\n ></button>\n <input\n class=\"infi-grid__filter-input\"\n [class.is-hidden]=\"cell.boolean\"\n [attr.type]=\"cell.inputType\"\n [attr.step]=\"cell.inputType === 'number' ? 'any' : null\"\n [disabled]=\"cell.locked || cell.noInput\"\n [attr.placeholder]=\"text.filterPlaceholder\"\n [attr.aria-label]=\"cell.inputLabel\"\n (input)=\"onInput($event, cell)\"\n (keydown)=\"onKeydown($event, cell)\"\n />\n <select\n class=\"infi-grid__filter-select\"\n [class.is-hidden]=\"!cell.boolean\"\n [value]=\"cell.booleanValue\"\n [attr.aria-label]=\"cell.inputLabel\"\n (change)=\"onBoolean($event, cell)\"\n (keydown)=\"onKeydown($event, cell)\"\n >\n <option value=\"\">{{ text.allValues }}</option>\n <option value=\"isTrue\">{{ text.booleanTrue }}</option>\n <option value=\"isFalse\">{{ text.booleanFalse }}</option>\n <option value=\"empty\">{{ text.blanks }}</option>\n </select>\n <button\n type=\"button\"\n class=\"infi-grid__filter-clear\"\n [class.is-hidden]=\"!cell.active\"\n [attr.aria-label]=\"text.clearFilter\"\n [attr.title]=\"text.clearFilter\"\n (click)=\"clear(cell)\"\n >\n ×\n </button>\n </div>\n }\n @if (trailing > 0) {\n <div class=\"infi-grid__pin infi-grid__pin--end\" role=\"gridcell\" [style.width.px]=\"trailing\" [class.is-placed]=\"pins !== null\" [style.left.px]=\"pins?.end\"></div>\n }\n `,\n})\nexport class GridFilterRowComponent implements OnChanges, AfterViewChecked, OnDestroy {\n @Input() columns: readonly LayoutColumn[] = [];\n @Input() columnPool = 0;\n @Input() filterModel: FilterModel = {};\n @Input() nonce = 0;\n @Input() leading = 0;\n @Input() trailing = 0;\n\n private readonly store = inject(GridStore);\n\n /** Where the pinned regions are placed with syncScroll, or null (sticky): see `GridStore.pinPlacement`. */\n protected get pins(): { start: number; end: number } | null {\n return this.store.pinPlacement;\n }\n\n private readonly zone = inject(NgZone);\n private readonly cdr = inject(ChangeDetectorRef);\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly document = inject(DOCUMENT);\n\n cells: FilterCellView[] = [];\n text: GridText = DEFAULT_TEXT;\n /** Typed text not applied yet, by field (survives recycling). */\n private readonly drafts = new Map<string, string>();\n /** Operator chosen in the menu, by field (until the filter changes elsewhere). */\n private readonly operators = new Map<string, string>();\n private readonly timers = new Map<string, ReturnType<typeof setTimeout>>();\n /** Fields this row applied, so their next model change isn't taken as a change from elsewhere. */\n private readonly ownChanges = new Set<string>();\n private previousModel: FilterModel = {};\n /** Field each input slot was last written for (the input values are written by hand, see `ngAfterViewChecked`). */\n private readonly boundFields: (string | null)[] = [];\n private menu: { element: HTMLElement; field: string; close(): void } | null = null;\n\n ngOnChanges(): void {\n const store = this.store;\n this.text = store.config().text;\n this.syncWithModel();\n // An input whose column is scrolled away is applied and blurred before its cell shows another column.\n const active = this.document.activeElement;\n if (active instanceof HTMLElement && this.host.nativeElement.contains(active)) {\n const field = active.closest<HTMLElement>('.infi-grid__filter-cell')?.dataset['field'];\n if (field && !this.columns.some((lc) => lc.key === field)) {\n this.flush(field);\n active.blur();\n }\n }\n const pool = Math.max(this.columnPool, this.columns.length);\n const cells: FilterCellView[] = new Array(pool);\n const ariaOffset = this.leading > 0 ? 1 : 0;\n for (const lc of this.columns) cells[lc.index % pool] = this.buildCell(lc, ariaOffset);\n for (let k = 0; k < pool; k++) if (cells[k] === undefined) cells[k] = EMPTY_CELL;\n this.cells = cells;\n }\n\n /**\n * Writes the inputs' values by hand: a value binding only writes when the bound value changes, so a reused\n * input could keep text typed for another column. An input is written when its slot shows another column,\n * or when it isn't focused and shows something else (the filter changed elsewhere).\n */\n ngAfterViewChecked(): void {\n const inputs = this.host.nativeElement.querySelectorAll<HTMLInputElement>('.infi-grid__filter-input');\n const active = this.document.activeElement;\n for (let k = 0; k < inputs.length && k < this.cells.length; k++) {\n const cell = this.cells[k];\n const input = inputs[k];\n if (cell.key !== this.boundFields[k] || (input !== active && input.value !== cell.text)) {\n input.value = cell.text;\n this.boundFields[k] = cell.key;\n }\n }\n }\n\n ngOnDestroy(): void {\n for (const timer of this.timers.values()) clearTimeout(timer);\n this.timers.clear();\n this.menu?.close();\n }\n\n /** A filter changed elsewhere (popup, API): the row shows it, unless that column is being typed into. */\n private syncWithModel(): void {\n const model = this.filterModel;\n if (model === this.previousModel) return;\n const previous = this.previousModel;\n this.previousModel = model;\n for (const field of new Set([...Object.keys(previous), ...Object.keys(model)])) {\n if (previous[field] === model[field]) continue;\n if (this.ownChanges.delete(field)) continue;\n if (this.timers.has(field)) continue;\n this.drafts.delete(field);\n this.operators.delete(field);\n }\n }\n\n private buildCell(lc: LayoutColumn, ariaOffset: number): FilterCellView {\n const column = lc.col;\n const field = column.field;\n const text = this.text;\n if (!column.filterable) {\n return { ...EMPTY_CELL, key: field, ariaCol: lc.index + 1 + ariaOffset, left: lc.left, width: lc.width, cls: 'infi-grid__filter-cell is-disabled' };\n }\n const applied = this.filterModel[field] ?? null;\n const first = applied?.conditions?.[0] ?? null;\n const operator = this.operatorOf(column, first);\n const inputs = this.inputCount(column, operator);\n const locked = first !== null && first.operator === operator && inputs === 2;\n const draft = this.drafts.get(field);\n const shown = locked\n ? `${toInputText(first!.value, column.type)} – ${toInputText(first!.valueTo, column.type)}`\n : (draft ?? (first && first.operator === operator ? toInputText(first.value, column.type) : ''));\n const label = this.operatorLabel(column, operator);\n let cls = 'infi-grid__filter-cell';\n if (isColumnFilterActive(applied)) cls += ' is-active';\n return {\n key: field,\n ariaCol: lc.index + 1 + ariaOffset,\n left: lc.left,\n width: lc.width,\n cls,\n boolean: column.type === 'boolean',\n // A two-value condition is shown as text (\"10 – 20\"), which a number or date input would refuse.\n inputType: locked ? 'text' : column.type === 'number' ? 'number' : column.type === 'date' ? 'date' : 'text',\n text: shown,\n booleanValue: column.type === 'boolean' && first ? first.operator : '',\n locked,\n noInput: inputs === 0,\n symbol: SYMBOLS[operator] ?? label.slice(0, 2),\n operatorLabel: text.filterOperator.replace('{operator}', label),\n inputLabel: text.filterColumn.replace('{column}', column.header),\n active: isColumnFilterActive(applied) || (draft !== undefined && draft !== ''),\n };\n }\n\n /** The operator of a column's cell: chosen in the menu, else the applied one, else the column default. */\n private operatorOf(column: ResolvedColumn, first: FilterCondition | null): string {\n const chosen = this.operators.get(column.field);\n if (chosen) return chosen;\n if (first) return first.operator;\n const operators = this.rowOperators(column);\n return operators.includes(column.filter.defaultOperator) ? column.filter.defaultOperator : (operators[0] ?? 'contains');\n }\n\n /** Operators offered by the row: the column's, without two-value ones (those are in the popup). */\n private rowOperators(column: ResolvedColumn): string[] {\n return column.filter.operators.filter((op) => this.inputCount(column, op) < 2);\n }\n\n private inputCount(column: ResolvedColumn, operator: string): number {\n const custom = column.filter.customOperators.find((o) => o.key === operator);\n if (custom) return custom.inputs ?? 1;\n return FILTER_OPERATOR_INPUTS[operator] ?? 1;\n }\n\n private operatorLabel(column: ResolvedColumn, operator: string): string {\n const custom = column.filter.customOperators.find((o) => o.key === operator);\n return custom?.label ?? this.text.operators[operator] ?? operator;\n }\n\n onInput(event: Event, cell: FilterCellView): void {\n const field = cell.key;\n if (!field || !this.store.columnsByField().get(field)?.filterable) return;\n this.drafts.set(field, (event.target as HTMLInputElement).value);\n this.schedule(field);\n }\n\n onBoolean(event: Event, cell: FilterCellView): void {\n const field = cell.key;\n const column = field ? this.store.columnsByField().get(field) : undefined;\n if (!field || !column?.filterable) return;\n const operator = (event.target as HTMLSelectElement).value;\n this.writeFirst(column, operator ? { operator } : null);\n }\n\n onKeydown(event: KeyboardEvent, cell: FilterCellView): void {\n const field = cell.key;\n if (!field) return;\n if (event.key === 'Enter') {\n event.preventDefault();\n this.flush(field);\n } else if (event.key === 'Escape') {\n // Back to the applied value.\n event.preventDefault();\n event.stopPropagation();\n this.cancelTimer(field);\n this.drafts.delete(field);\n this.refresh();\n const input = event.target as HTMLInputElement;\n if (input.classList.contains('infi-grid__filter-input')) input.value = this.cells.find((c) => c.key === field)?.text ?? '';\n } else if (event.key === 'Tab') {\n this.moveFocus(event, field);\n }\n }\n\n clear(cell: FilterCellView): void {\n const field = cell.key;\n if (!field) return;\n this.cancelTimer(field);\n this.drafts.delete(field);\n this.operators.delete(field);\n const column = this.store.columnsByField().get(field);\n if (column) this.writeFirst(column, null);\n this.refresh();\n }\n\n /** Applies a field's typed text after `filtering.rowDebounce`. */\n private schedule(field: string): void {\n this.cancelTimer(field);\n const delay = this.store.config().filtering.rowDebounce;\n this.timers.set(\n field,\n setTimeout(() => {\n this.timers.delete(field);\n this.zone.run(() => this.flush(field));\n }, delay),\n );\n }\n\n private cancelTimer(field: string): void {\n const timer = this.timers.get(field);\n if (timer !== undefined) clearTimeout(timer);\n this.timers.delete(field);\n }\n\n /** Applies a field's typed text now. */\n private flush(field: string): void {\n this.cancelTimer(field);\n const column = this.store.columnsByField().get(field);\n const draft = this.drafts.get(field);\n if (!column?.filterable || draft === undefined) return;\n this.drafts.delete(field);\n const applied = this.store.filterModel()[field]?.conditions?.[0] ?? null;\n const operator = this.operatorOf(column, applied);\n const value = this.parse(column, draft);\n this.writeFirst(column, value === undefined ? null : { operator, value });\n }\n\n private parse(column: ResolvedColumn, raw: string): unknown {\n const text = raw.trim();\n if (text === '') return undefined;\n if (column.type === 'number') {\n const n = Number(text);\n return Number.isNaN(n) ? undefined : n;\n }\n return column.type === 'text' ? raw : text;\n }\n\n /** Sets (or removes) the first condition of a column's filter, keeping its other conditions and value list. */\n private writeFirst(column: ResolvedColumn, condition: FilterCondition | null): void {\n const store = this.store;\n const current: ColumnFilterModel = store.filterModel()[column.field] ?? {};\n const rest = (current.conditions ?? []).slice(1);\n const conditions = condition ? [condition, ...rest] : rest;\n const model: ColumnFilterModel = { ...current, conditions };\n if (conditions.length === 0) delete model.conditions;\n if (conditions.length < 2) delete model.logic;\n this.ownChanges.add(column.field);\n store.setColumnFilter(column.field, isColumnFilterActive(model) ? model : null);\n }\n\n private refresh(): void {\n this.ngOnChanges();\n this.cdr.markForCheck();\n }\n\n /** Tab / Shift+Tab: the next or previous column's filter, in column order (scrolling it into view). */\n private moveFocus(event: KeyboardEvent, field: string): void {\n const columns = this.store.layout().columns;\n let index = columns.findIndex((lc) => lc.key === field);\n const step = event.shiftKey ? -1 : 1;\n do index += step;\n while (index >= 0 && index < columns.length && !columns[index].col.filterable);\n const next = columns[index];\n if (!next) return;\n event.preventDefault();\n this.flush(field);\n this.store.viewport?.scrollToColumn(next.index, 'auto');\n const escaped = CSS.escape(next.key);\n const target = this.host.nativeElement.querySelector<HTMLElement>(\n `.infi-grid__filter-cell[data-field=\"${escaped}\"] .infi-grid__filter-input:not(.is-hidden), .infi-grid__filter-cell[data-field=\"${escaped}\"] .infi-grid__filter-select:not(.is-hidden)`,\n );\n target?.focus();\n }\n\n // ----- operator menu (in <body>, so it is never clipped) -----\n\n openMenu(event: MouseEvent, cell: FilterCellView): void {\n const field = cell.key;\n const column = field ? this.store.columnsByField().get(field) : undefined;\n if (!field || !column?.filterable) return;\n const reopen = this.menu?.field !== field;\n this.menu?.close();\n if (!reopen) return;\n const button = event.currentTarget as HTMLElement;\n const current = this.operatorOf(column, this.store.filterModel()[field]?.conditions?.[0] ?? null);\n const doc = this.document;\n const menu = doc.createElement('div');\n menu.className = 'infi-grid-popup infi-grid-menu';\n menu.setAttribute('role', 'listbox');\n menu.setAttribute('aria-label', column.header);\n for (const operator of this.rowOperators(column)) {\n const item = doc.createElement('button');\n item.type = 'button';\n item.className = 'infi-grid-menu__item' + (operator === current ? ' is-selected' : '');\n item.setAttribute('role', 'option');\n item.setAttribute('aria-selected', String(operator === current));\n item.dataset['operator'] = operator;\n const symbol = doc.createElement('span');\n symbol.className = 'infi-grid-menu__symbol';\n symbol.textContent = SYMBOLS[operator] ?? '';\n item.append(symbol, this.operatorLabel(column, operator));\n menu.appendChild(item);\n }\n this.applyTheme(menu);\n doc.body.appendChild(menu);\n const rect = button.getBoundingClientRect();\n const view = doc.defaultView;\n const left = Math.min(rect.left, (view?.innerWidth ?? 0) - menu.offsetWidth - 8);\n const below = rect.bottom + 2 + menu.offsetHeight <= (view?.innerHeight ?? 0) - 8;\n menu.style.left = `${Math.max(8, Math.round(left))}px`;\n menu.style.top = `${Math.round(below ? rect.bottom + 2 : Math.max(8, rect.top - 2 - menu.offsetHeight))}px`;\n const items = Array.from(menu.querySelectorAll<HTMLButtonElement>('.infi-grid-menu__item'));\n const pick = (operator: string) => {\n close();\n this.zone.run(() => this.choose(column, operator));\n button.focus();\n };\n const onPointerDown = (e: Event) => {\n if (!menu.contains(e.target as Node) && e.target !== button) close();\n };\n const onKeydown = (e: KeyboardEvent) => {\n const index = items.indexOf(doc.activeElement as HTMLButtonElement);\n if (e.key === 'ArrowDown' || e.key === 'ArrowUp') {\n e.preventDefault();\n const next = (index + (e.key === 'ArrowDown' ? 1 : -1) + items.length) % items.length;\n items[next].focus();\n } else if (e.key === 'Escape' || e.key === 'Tab') {\n e.preventDefault();\n close();\n button.focus();\n }\n };\n const onClick = (e: Event) => {\n const item = (e.target as Element).closest<HTMLElement>('.infi-grid-menu__item');\n if (item?.dataset['operator']) pick(item.dataset['operator']);\n };\n const onScroll = (e: Event) => {\n if (!menu.contains(e.target as Node)) close();\n };\n const close = () => {\n if (this.menu?.element !== menu) return;\n this.menu = null;\n doc.removeEventListener('pointerdown', onPointerDown, true);\n doc.removeEventListener('scroll', onScroll, true);\n menu.remove();\n };\n this.zone.runOutsideAngular(() => {\n menu.addEventListener('keydown', onKeydown);\n menu.addEventListener('click', onClick);\n doc.addEventListener('pointerdown', onPointerDown, true);\n doc.addEventListener('scroll', onScroll, true);\n });\n this.menu = { element: menu, field, close };\n (items.find((i) => i.dataset['operator'] === current) ?? items[0])?.focus();\n }\n\n /** An operator was picked: applied at once when it needs no value or a value is there. */\n private choose(column: ResolvedColumn, operator: string): void {\n const field = column.field;\n this.operators.set(field, operator);\n const applied = this.store.filterModel()[field]?.conditions?.[0] ?? null;\n const text = this.drafts.get(field) ?? (applied ? toInputText(applied.value, column.type) : '');\n if (this.inputCount(column, operator) === 0) {\n this.cancelTimer(field);\n this.drafts.delete(field);\n this.writeFirst(column, { operator });\n } else if (text.trim() !== '') {\n this.drafts.set(field, text);\n this.flush(field);\n } else if (applied && this.inputCount(column, applied.operator) === 0) {\n // From \"empty\" to an operator that needs a value: nothing to filter by yet.\n this.writeFirst(column, null);\n }\n this.refresh();\n }\n\n private applyTheme(element: HTMLElement): void {\n const host = this.host.nativeElement.closest<HTMLElement>('.infi-grid');\n if (!host) return;\n for (const cls of Array.from(host.classList)) if (cls.startsWith('infi-grid-theme-')) element.classList.add(cls);\n const styles = getComputedStyle(host);\n for (const name of THEME_VARIABLES) {\n const value = styles.getPropertyValue(name);\n if (value) element.style.setProperty(name, value);\n }\n }\n}\n","import {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n Input,\n NgZone,\n OnChanges,\n SimpleChanges,\n ViewChild,\n ViewEncapsulation,\n inject,\n} from '@angular/core';\nimport type { GridEditorOptions, GridSelectOption } from '../models/column.types';\nimport type { GridEditContext } from '../models/template.types';\nimport { dayKey, toBoolean, toNumber, toTimestamp } from '../core/values';\nimport { GridStore } from '../state/grid-store';\n\n/**\n * Built-in editors: text, number, dropdown (select), checkbox and date picker.\n * In a normal edit session values are drafts until committed; in grid edit mode (`live`)\n * each change is saved immediately.\n */\n@Component({\n selector: 'infi-grid-cell-editor',\n standalone: true,\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: { class: 'infi-grid__editor', '[class.is-invalid]': 'error !== null', '[attr.title]': 'error' },\n template: `\n @switch (context.column.editor) {\n @case ('checkbox') {\n <input\n #input\n class=\"infi-grid__editor-check\"\n type=\"checkbox\"\n [attr.aria-label]=\"context.column.header\"\n (change)=\"onCheckbox($event)\"\n (keydown)=\"onKeydown($event)\"\n (blur)=\"onBlur()\"\n />\n }\n @case ('select') {\n <select\n #input\n class=\"infi-grid__editor-input\"\n [attr.aria-label]=\"context.column.header\"\n (change)=\"onSelect($event)\"\n (keydown)=\"onKeydown($event)\"\n (blur)=\"onBlur()\"\n >\n <option value=\"-1\"></option>\n @for (option of options; track $index) {\n <option [value]=\"$index\">{{ option.label }}</option>\n }\n </select>\n }\n @case ('date') {\n <input\n #input\n class=\"infi-grid__editor-input\"\n type=\"date\"\n [attr.aria-label]=\"context.column.header\"\n (input)=\"onText($event)\"\n (change)=\"onChange($event)\"\n (keydown)=\"onKeydown($event)\"\n (blur)=\"onBlur()\"\n />\n }\n @case ('number') {\n <input\n #input\n class=\"infi-grid__editor-input infi-grid__editor-input--number\"\n type=\"number\"\n [attr.aria-label]=\"context.column.header\"\n [attr.min]=\"opts.min ?? null\"\n [attr.max]=\"opts.max ?? null\"\n [attr.step]=\"opts.step ?? 'any'\"\n [attr.placeholder]=\"opts.placeholder ?? null\"\n (input)=\"onText($event)\"\n (change)=\"onChange($event)\"\n (keydown)=\"onKeydown($event)\"\n (blur)=\"onBlur()\"\n />\n }\n @default {\n <input\n #input\n class=\"infi-grid__editor-input\"\n type=\"text\"\n [attr.aria-label]=\"context.column.header\"\n [attr.maxlength]=\"opts.maxLength ?? null\"\n [attr.placeholder]=\"opts.placeholder ?? null\"\n (input)=\"onText($event)\"\n (change)=\"onChange($event)\"\n (keydown)=\"onKeydown($event)\"\n (blur)=\"onBlur()\"\n />\n }\n }\n @if (error) {\n <span class=\"infi-grid__editor-error\" role=\"alert\" [attr.title]=\"error\" [attr.aria-label]=\"error\">!</span>\n }\n `,\n})\nexport class GridCellEditorComponent implements OnChanges, AfterViewInit {\n // Decorator inputs keep scrolling free of app-wide change detection (see outlet.directive.ts).\n @Input({ required: true }) context!: GridEditContext;\n /** Grid edit mode: save on every change instead of keeping a draft. */\n @Input() live = false;\n /** The data row (`context.row` can be a copy showing pending values in batch mode). */\n @Input() source: unknown = undefined;\n\n @ViewChild('input') private inputRef?: ElementRef<HTMLInputElement | HTMLSelectElement>;\n\n private readonly store = inject(GridStore);\n private readonly zone = inject(NgZone);\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\n\n opts: GridEditorOptions = {};\n options: readonly GridSelectOption[] = [];\n error: string | null = null;\n private boundRow: unknown = undefined;\n private boundField: string | null = null;\n\n ngOnChanges(changes: SimpleChanges): void {\n if (!changes['context']) return;\n const ctx = this.context;\n this.opts = ctx.editorOptions ?? {};\n const raw = this.opts.options;\n this.options = typeof raw === 'function' ? raw(ctx.row) : (raw ?? []);\n this.error = ctx.error;\n // Rows are recycled while scrolling: refresh the input when it now shows another row or cell.\n const row = this.source ?? ctx.row;\n if (row !== this.boundRow || ctx.field !== this.boundField) {\n this.boundRow = row;\n this.boundField = ctx.field;\n if (this.inputRef) this.writeValue();\n }\n }\n\n ngAfterViewInit(): void {\n this.writeValue();\n if (this.context.autoFocus) {\n queueMicrotask(() => {\n const el = this.inputRef?.nativeElement;\n if (!el || !el.isConnected) return;\n el.focus();\n if (el instanceof HTMLInputElement && (el.type === 'text' || el.type === 'number')) el.select();\n });\n }\n }\n\n /** Puts the current value into the native control (not bound, so typing never loses the caret). */\n private writeValue(): void {\n const el = this.inputRef?.nativeElement;\n if (!el) return;\n const value = this.context.value;\n switch (this.context.column.editor) {\n case 'checkbox':\n (el as HTMLInputElement).checked = toBoolean(value) === true;\n break;\n case 'select': {\n const index = this.options.findIndex((o) => o.value === value || (o.value != null && String(o.value) === String(value)));\n (el as HTMLSelectElement).value = String(index);\n break;\n }\n case 'date': {\n const t = toTimestamp(value);\n el.value = t === null ? '' : dayKey(t);\n break;\n }\n case 'number': {\n const n = toNumber(value);\n el.value = n === null ? (typeof value === 'string' ? value : '') : String(n);\n break;\n }\n default:\n el.value = value == null ? '' : String(value);\n }\n }\n\n onText(event: Event): void {\n if (this.live) return;\n this.setDraft((event.target as HTMLInputElement).value);\n }\n\n onChange(event: Event): void {\n if (this.live) this.save((event.target as HTMLInputElement).value);\n }\n\n onCheckbox(event: Event): void {\n const checked = (event.target as HTMLInputElement).checked;\n if (this.live) this.save(checked);\n else {\n this.setDraft(checked);\n // A checkbox saves right away when it is the only editor; in row mode it waits for the row.\n if (this.store.editSession()?.mode === 'cell') this.context.commit();\n }\n }\n\n onSelect(event: Event): void {\n const index = Number((event.target as HTMLSelectElement).value);\n const value = index >= 0 ? this.options[index]?.value : null;\n if (this.live) this.save(value);\n else this.setDraft(value);\n }\n\n onKeydown(event: KeyboardEvent): void {\n // Keys typed in an editor never reach grid navigation.\n event.stopPropagation();\n if (this.live) {\n if (event.key === 'Escape') {\n this.writeValue();\n this.inputRef?.nativeElement.blur();\n }\n return;\n }\n if (event.key === 'Enter') {\n event.preventDefault();\n if (this.inputRef) this.syncDraftFromInput();\n if (this.store.commitEdit()) this.store.viewport?.focus();\n else this.error = this.store.editSession()?.errors[this.context.field] ?? null;\n } else if (event.key === 'Escape') {\n event.preventDefault();\n this.store.cancelEdit();\n this.store.viewport?.focus();\n } else if (event.key === 'Tab' && this.store.editSession()?.mode === 'cell') {\n event.preventDefault();\n this.syncDraftFromInput();\n this.moveToNextEditable(event.shiftKey ? -1 : 1);\n }\n }\n\n onBlur(): void {\n if (this.live || !this.store.config().editing.commitOnBlur) return;\n const row = this.source ?? this.context.row;\n const grid = this.host.nativeElement.closest('.infi-grid');\n setTimeout(() => {\n const session = this.store.editSession();\n // The add row is only added explicitly (Enter or ✓), never by leaving it.\n if (!session || session.row !== row || session.isNew) return;\n const active = document.activeElement;\n // Focus moved to another editor of this grid: the next editor of the row (row mode), or this editor\n // drawn again in another row slot (rows above it were added or deleted). Keep editing.\n if (active && grid?.contains(active) && active.closest('.infi-grid__editor')) return;\n this.zone.run(() => this.store.commitEdit());\n });\n }\n\n private syncDraftFromInput(): void {\n const el = this.inputRef?.nativeElement;\n if (!el) return;\n const editor = this.context.column.editor;\n if (editor === 'text' || editor === 'number' || editor === 'date') this.setDraft(el.value);\n }\n\n private setDraft(value: unknown): void {\n this.context.value = value;\n this.error = this.store.setDraft(this.context.field, value);\n }\n\n private save(value: unknown): void {\n const result = this.store.commitGridCell(this.source ?? this.context.row, this.context.rowIndex, this.context.field, value);\n this.error = result.error;\n // Refused by a `rowUpdating` handler: show the saved value again.\n if (!result.saved && result.error === null) this.writeValue();\n }\n\n /** Tab / Shift+Tab: save and edit the next editable cell (wrapping to the next row). */\n private moveToNextEditable(direction: 1 | -1): void {\n const rowIndex = this.context.rowIndex;\n const field = this.context.field;\n if (!this.store.commitEdit()) {\n this.error = this.store.editSession()?.errors[field] ?? null;\n return;\n }\n const rows = this.store.viewRows();\n let r = rowIndex;\n let fields = this.store.editableFields(rows[r]);\n let i = fields.indexOf(field) + direction;\n while (r >= 0 && r < rows.length) {\n if (i >= 0 && i < fields.length) {\n const target = fields[i];\n this.store.viewport?.focusCell(r, target, 'keyboard');\n this.store.startEdit(r, target);\n this.store.viewport?.scrollToRow(r, 'auto');\n return;\n }\n r += direction;\n if (r < 0 || r >= rows.length) break;\n fields = this.store.editableFields(rows[r]);\n i = direction === 1 ? 0 : fields.length - 1;\n }\n this.store.viewport?.focus();\n }\n}\n","import { ChangeDetectionStrategy, Component, Input, OnChanges, SimpleChanges, ViewEncapsulation, inject } from '@angular/core';\nimport type { GridClassValue, GridStyleValue, ResolvedColumn } from '../models/column.types';\nimport type { GridCellContext, GridEditContext, GridTemplate } from '../models/template.types';\nimport { DEFAULT_TEXT } from '../core/defaults';\nimport { toBoolean } from '../core/values';\nimport { GridOutletDirective } from '../directives/outlet.directive';\nimport { GridStore, type EditSession, type LayoutColumn, type RowChangeState } from '../state/grid-store';\nimport { GridCellEditorComponent } from './cell-editor.component';\n\n/** `text` cells (also booleans and empty slots) are a single element with `textContent`. */\ntype CellKind = 'text' | 'template' | 'editor';\n\ninterface CellView {\n key: string | null;\n ariaCol: number | null;\n /** `aria-selected` with cell selection (`'true'` on the selected cell), else null (no attribute). */\n ariaSelected: 'true' | 'false' | null;\n left: number;\n width: number;\n cls: string;\n style: GridStyleValue | null;\n kind: CellKind;\n text: string;\n template: GridTemplate<any> | null;\n context: GridCellContext | GridEditContext | null;\n}\n\nconst EMPTY_CELL: CellView = {\n key: null,\n ariaCol: null,\n ariaSelected: null,\n left: 0,\n width: 0,\n cls: 'infi-grid__cell infi-grid__cell--empty',\n style: null,\n kind: 'text',\n text: '',\n template: null,\n context: null,\n};\n\nconst EMPTY_TEMPLATE_CELL: CellView = { ...EMPTY_CELL, kind: 'template' };\nconst HIDDEN_TEMPLATE_CLS = 'infi-grid__cell infi-grid__cell--empty';\n\nconst ACTION_CLS = 'infi-grid__action';\nconst HIDDEN_ACTION_CLS = 'infi-grid__action is-hidden';\nconst HIDDEN_ACTIONS = {\n edit: HIDDEN_ACTION_CLS,\n delete: HIDDEN_ACTION_CLS,\n save: HIDDEN_ACTION_CLS,\n cancel: HIDDEN_ACTION_CLS,\n restore: HIDDEN_ACTION_CLS,\n};\n\nexport function classList(value: GridClassValue): string {\n if (!value) return '';\n return typeof value === 'string' ? value : value.join(' ');\n}\n\n/**\n * One grid row. OnPush with plain `@Input`s: it re-renders only when its row, row version,\n * columns, edit state or focus (with cell selection: the selected cell) change, so updating one cell re-renders one row.\n *\n * Cells live in fixed pools of slots: plain cells in `cells` (column `i` → slot `i % columnPool`)\n * and template cells in `templateCells` (template column `t` → slot `t % templatePool`; with `templateKey`s, a column\n * takes a slot that last showed a column with the same key, see `assignTemplateSlots`).\n * Scrolling in any direction therefore rebinds existing elements and template views instead of\n * creating new ones — creating views would make Angular check the whole application.\n * Editors (only on rows being edited) are rendered separately in `editorCells`.\n */\n@Component({\n selector: 'div[infi-grid-row]',\n standalone: true,\n imports: [GridOutletDirective, GridCellEditorComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n // `data-row-index` / `aria-rowindex` are set by the viewport (hidden spare rows have none).\n host: {\n role: 'row',\n '[class]': 'hostClass',\n '[style]': 'hostStyle',\n },\n template: `\n @if (leading > 0) {\n <div\n class=\"infi-grid__pin infi-grid__pin--start infi-grid__selector\"\n role=\"gridcell\"\n aria-colindex=\"1\"\n [style.width.px]=\"leading\"\n [class.is-placed]=\"pins !== null\"\n [style.left.px]=\"pins?.start\"\n >\n @if (!addRow) {\n <input\n type=\"checkbox\"\n class=\"infi-grid__selector-box\"\n tabindex=\"-1\"\n [checked]=\"selected\"\n [disabled]=\"!selectable\"\n [attr.aria-label]=\"selectLabel\"\n />\n }\n </div>\n }\n @for (cell of cells; track $index) {\n <div\n role=\"gridcell\"\n [class]=\"cell.cls\"\n [style]=\"cell.style\"\n [style.left.px]=\"cell.left\"\n [style.width.px]=\"cell.width\"\n [attr.aria-colindex]=\"cell.ariaCol\"\n [attr.aria-selected]=\"cell.ariaSelected\"\n [attr.data-field]=\"cell.key\"\n [textContent]=\"cell.text\"\n ></div>\n }\n @for (cell of templateCells; track $index) {\n <div\n role=\"gridcell\"\n [class]=\"cell.cls\"\n [style]=\"cell.style\"\n [style.left.px]=\"cell.left\"\n [style.width.px]=\"cell.width\"\n [attr.aria-colindex]=\"cell.ariaCol\"\n [attr.aria-selected]=\"cell.ariaSelected\"\n [attr.data-field]=\"cell.key\"\n >\n <ng-container [infiGridOutlet]=\"cell.template\" [infiGridOutletContext]=\"cell.context\" />\n </div>\n }\n @for (cell of editorCells; track cell.key) {\n <div\n role=\"gridcell\"\n [class]=\"cell.cls\"\n [style]=\"cell.style\"\n [style.left.px]=\"cell.left\"\n [style.width.px]=\"cell.width\"\n [attr.aria-colindex]=\"cell.ariaCol\"\n [attr.aria-selected]=\"cell.ariaSelected\"\n [attr.data-field]=\"cell.key\"\n >\n @if (cell.template) {\n <ng-container [infiGridOutlet]=\"cell.template\" [infiGridOutletContext]=\"cell.context\" />\n } @else {\n <infi-grid-cell-editor [context]=\"$any(cell.context)\" [live]=\"gridEditMode\" [source]=\"row\" />\n }\n </div>\n }\n <!-- The action buttons are static and shown or hidden with classes, so recycled rows never create views. -->\n @if (trailing > 0) {\n <div\n class=\"infi-grid__pin infi-grid__pin--end infi-grid__actions\"\n role=\"gridcell\"\n [attr.aria-colindex]=\"actionsAriaCol\"\n [style.width.px]=\"trailing\"\n [class.is-placed]=\"pins !== null\"\n [style.left.px]=\"pins?.end\"\n >\n <button type=\"button\" tabindex=\"-1\" data-action=\"edit\" [class]=\"actions.edit\" [disabled]=\"!canEdit\" [attr.aria-label]=\"text.editRow\" [attr.title]=\"text.editRow\">\n <svg viewBox=\"0 0 16 16\" width=\"14\" height=\"14\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M11.1 1.9a1.5 1.5 0 0 1 2.1 0l.9.9a1.5 1.5 0 0 1 0 2.1L5.6 13.4 2 14l.6-3.6z\" /></svg>\n </button>\n <button type=\"button\" tabindex=\"-1\" data-action=\"delete\" [class]=\"actions.delete\" [attr.aria-label]=\"text.deleteRow\" [attr.title]=\"text.deleteRow\">\n <svg viewBox=\"0 0 16 16\" width=\"14\" height=\"14\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M6 2h4l.5 1H14v1.5H2V3h3.5zM3.5 5.5h9l-.7 8.1a1 1 0 0 1-1 .9H5.2a1 1 0 0 1-1-.9z\" /></svg>\n </button>\n <button type=\"button\" tabindex=\"-1\" data-action=\"save\" [class]=\"actions.save\" [attr.aria-label]=\"text.saveRow\" [attr.title]=\"text.saveRow\">\n <svg viewBox=\"0 0 16 16\" width=\"14\" height=\"14\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M6.2 11.6 2.6 8 1.5 9.1l4.7 4.7L14.5 5.5 13.4 4.4z\" /></svg>\n </button>\n <button type=\"button\" tabindex=\"-1\" data-action=\"cancel\" [class]=\"actions.cancel\" [attr.aria-label]=\"text.cancelRowEdit\" [attr.title]=\"text.cancelRowEdit\">\n <svg viewBox=\"0 0 16 16\" width=\"14\" height=\"14\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M4.1 3 3 4.1 6.9 8 3 11.9 4.1 13 8 9.1l3.9 3.9 1.1-1.1L9.1 8 13 4.1 11.9 3 8 6.9z\" /></svg>\n </button>\n <button type=\"button\" tabindex=\"-1\" data-action=\"restore\" [class]=\"actions.restore\" [attr.aria-label]=\"text.restoreRow\" [attr.title]=\"text.restoreRow\">\n <svg viewBox=\"0 0 16 16\" width=\"14\" height=\"14\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M3.5 2v4.5H8V5H5.9a5 5 0 1 1-1.3 5.6l-1.4.5A6.5 6.5 0 1 0 5 3.9V2z\" /></svg>\n </button>\n </div>\n }\n `,\n})\nexport class GridRowComponent<TRow = any> implements OnChanges {\n // Plain @Input()s on purpose: signal inputs would schedule an app-wide change detection\n // on every scroll frame in zone.js apps (see docs/GUIDE.md, \"Change detection\").\n @Input() row: TRow | null = null;\n @Input() rowIndex = 0;\n @Input() dataIndex = 0;\n @Input() columns: readonly LayoutColumn<TRow>[] = [];\n /** Number of plain-cell slots (≥ columns.length). */\n @Input() columnPool = 0;\n /** Number of template-cell slots (≥ template columns in `columns`). */\n @Input() templatePool = 0;\n /** Changes when this row's data was edited. */\n @Input() version = 0;\n /** Changes when every row must rebuild. */\n @Input() nonce = 0;\n @Input() edit: EditSession<TRow> | null = null;\n @Input() gridEditMode = false;\n @Input() focusField: string | null = null;\n /** Selection state (drawn by the checkbox; the row class is set by the viewport). */\n @Input() selected = false;\n @Input() selectable = true;\n /** Width of the pinned checkbox cell (0: no checkbox column). */\n @Input() leading = 0;\n /** Width of the pinned action column (0: none). */\n @Input() trailing = 0;\n /** The inline add row (its row is a draft that isn't in the data yet). */\n @Input() addRow = false;\n\n private readonly store = inject<GridStore<TRow>>(GridStore);\n\n /** Where the pinned regions are placed with syncScroll, or null (sticky): see `GridStore.pinPlacement`. */\n protected get pins(): { start: number; end: number } | null {\n return this.store.pinPlacement;\n }\n\n cells: CellView[] = [];\n templateCells: CellView[] = [];\n editorCells: CellView[] = [];\n hostClass = 'infi-grid__row';\n hostStyle: GridStyleValue | null = null;\n selectLabel = '';\n /** Classes of the action buttons (hidden ones get `is-hidden`). */\n actions = HIDDEN_ACTIONS;\n canEdit = false;\n actionsAriaCol = 0;\n text = DEFAULT_TEXT;\n private errorReported = false;\n /** What each template slot last showed (a kept, hidden view still shows it): field, template and `templateKey`. */\n private slotFields: (string | null)[] = [];\n private slotTemplates: unknown[] = [];\n private slotKeys: (string | null)[] = [];\n private ariaColOffset = 0;\n /** Cell selection: the focused cell is the selected cell. */\n private cellSelection = false;\n\n ngOnChanges(changes: SimpleChanges): void {\n // A selection change only affects the checkbox: no need to rebuild the cells.\n let other = false;\n for (const name in changes) if (name !== 'selected' && name !== 'selectable') other = true;\n if (!other) return;\n const row = this.row;\n if (row === null) {\n this.cells = [];\n this.templateCells = [];\n this.editorCells = [];\n this.hostClass = 'infi-grid__row';\n this.hostStyle = null;\n return;\n }\n const store = this.store;\n const config = store.config();\n const api = store.api;\n const rowIndex = this.rowIndex;\n this.ariaColOffset = this.leading > 0 ? 1 : 0;\n this.cellSelection = config.cellSelection.enabled && !this.addRow;\n this.text = config.text;\n if (this.leading > 0) this.selectLabel = `${config.text.selectRow} ${rowIndex + 1}`;\n const edit = this.edit;\n const rowEditing = edit !== null;\n const gridEdit = this.gridEditMode;\n // Batch mode: what to show (a copy with the pending values) and how the row changed.\n const view = store.displayRow(row);\n const change = this.addRow ? null : store.rowChange(row);\n if (this.trailing > 0) this.buildActions(row, rowEditing, change);\n\n let rowCls = 'infi-grid__row';\n if (this.addRow) rowCls += ' infi-grid__row--add';\n else if (config.stripedRows && rowIndex % 2 === 1) rowCls += ' infi-grid__row--odd';\n if (rowEditing) rowCls += ' infi-grid__row--editing';\n if (change !== null) rowCls += ' infi-grid__row--' + change.kind;\n const rowClass = config.rowClass;\n if (rowClass) {\n const extra = typeof rowClass === 'function' ? this.safe(() => rowClass(view, rowIndex)) : rowClass;\n const s = classList(extra ?? null);\n if (s) rowCls += ' ' + s;\n }\n this.hostClass = rowCls;\n const rowStyle = config.rowStyle;\n this.hostStyle = rowStyle ? (this.safe(() => rowStyle(view, rowIndex)) ?? null) : null;\n const modified = change?.fields ?? null;\n\n const pool = Math.max(this.columnPool, this.columns.length);\n let templated = 0;\n let keyed = false;\n for (const lc of this.columns) {\n if (lc.templateIndex < 0) continue;\n templated++;\n if (lc.col.config.templateKey != null) keyed = true;\n }\n const templatePool = Math.max(this.templatePool, templated);\n const cells: CellView[] = new Array(pool);\n const templateCells: CellView[] = new Array(templatePool);\n const editorCells: CellView[] = [];\n const placed: { lc: LayoutColumn<TRow>; cell: CellView }[] = [];\n for (let i = 0; i < this.columns.length; i++) {\n const lc = this.columns[i];\n const cell = this.buildCell(lc, row, view, modified, rowIndex, edit, rowEditing, gridEdit, api);\n if (cell.kind === 'editor') editorCells.push(cell);\n else if (cell.kind === 'template' && lc.templateIndex >= 0) {\n if (keyed) placed.push({ lc, cell });\n else templateCells[lc.templateIndex % templatePool] = cell;\n } else cells[lc.index % pool] = cell;\n }\n if (keyed) this.assignTemplateSlots(placed, templateCells);\n for (let k = 0; k < pool; k++) if (cells[k] === undefined) cells[k] = EMPTY_CELL;\n for (let k = 0; k < templatePool; k++) {\n if (templateCells[k] !== undefined) continue;\n // Keep the previous template view alive but hidden: destroying and re-creating it would\n // make Angular check the whole application while scrolling sideways.\n const previous = this.templateCells[k];\n templateCells[k] =\n previous && previous.template ? { ...previous, key: null, ariaCol: null, ariaSelected: null, cls: HIDDEN_TEMPLATE_CLS } : EMPTY_TEMPLATE_CELL;\n }\n this.cells = cells;\n this.templateCells = templateCells;\n this.editorCells = editorCells;\n }\n\n /**\n * Template slots when columns have `templateKey`s: a column keeps the slot it already has; otherwise it takes a\n * free slot that last showed a column with the same template and key (its view only updates), then a slot never\n * used, then any free slot (its view re-renders). The viewport sizes the pool for the most columns of each key that\n * can be in view, so once the slots have met their keys, scrolling sideways only updates cells.\n */\n private assignTemplateSlots(placed: { lc: LayoutColumn<TRow>; cell: CellView }[], templateCells: CellView[]): void {\n const total = templateCells.length;\n const fields = this.slotFields;\n const templates = this.slotTemplates;\n const keys = this.slotKeys;\n const taken = new Array<boolean>(total).fill(false);\n const slotOf = new Map<string, number>();\n for (let k = 0; k < total; k++) {\n const field = fields[k];\n if (field != null && !slotOf.has(field)) slotOf.set(field, k);\n }\n const put = (k: number, entry: { lc: LayoutColumn<TRow>; cell: CellView }) => {\n templateCells[k] = entry.cell;\n taken[k] = true;\n const old = fields.indexOf(entry.lc.key);\n if (old >= 0 && old !== k) fields[old] = null;\n fields[k] = entry.lc.key;\n templates[k] = entry.cell.template;\n keys[k] = entry.lc.col.config.templateKey ?? null;\n };\n let pending: { lc: LayoutColumn<TRow>; cell: CellView }[] = [];\n for (const entry of placed) {\n const k = slotOf.get(entry.lc.key);\n if (k !== undefined && !taken[k]) put(k, entry);\n else pending.push(entry);\n }\n const rest: { lc: LayoutColumn<TRow>; cell: CellView }[] = [];\n for (const entry of pending) {\n const key = entry.lc.col.config.templateKey ?? null;\n let match = -1;\n for (let k = 0; k < total && match < 0; k++) if (!taken[k] && templates[k] === entry.cell.template && keys[k] === key) match = k;\n if (match >= 0) put(match, entry);\n else rest.push(entry);\n }\n pending = rest;\n for (const entry of pending) {\n let match = -1;\n for (let k = 0; k < total && match < 0; k++) if (!taken[k] && templates[k] === undefined) match = k;\n for (let k = 0; k < total && match < 0; k++) if (!taken[k]) match = k;\n put(match, entry);\n }\n }\n\n /** Which action buttons show: edit/delete normally, save/cancel while editing, restore on deleted rows (batch). */\n private buildActions(row: TRow, rowEditing: boolean, change: RowChangeState | null): void {\n const store = this.store;\n const config = store.config().editing.actionColumn;\n this.actionsAriaCol = store.layout().columns.length + 1 + this.ariaColOffset;\n if (!config) {\n this.actions = HIDDEN_ACTIONS;\n return;\n }\n const show = (visible: boolean) => (visible ? ACTION_CLS : HIDDEN_ACTION_CLS);\n const deleted = change?.kind === 'deleted';\n // The add row is always edited; its ✓ adds and its ✕ discards.\n const editing = rowEditing || this.addRow;\n this.canEdit = config.edit && !editing && !deleted && store.editableFields(row).length > 0;\n this.actions = {\n edit: show(config.edit && !editing && !deleted),\n delete: show(config.delete && !editing && !deleted),\n save: show(editing),\n cancel: show(editing),\n restore: show(deleted),\n };\n }\n\n private buildCell(\n lc: LayoutColumn<TRow>,\n row: TRow,\n view: TRow,\n modified: ReadonlyMap<string, unknown> | null,\n rowIndex: number,\n edit: EditSession<TRow> | null,\n rowEditing: boolean,\n gridEdit: boolean,\n api: GridEditContext['api'],\n ): CellView {\n const col = lc.col;\n const field = col.field;\n const value = col.getValue(row);\n const text = col.formatValue(value, view);\n const editable = this.store.isCellEditable(col, row, this.addRow);\n const editingCell = (edit !== null && edit.fields.includes(field)) || (gridEdit && editable);\n\n let cls = 'infi-grid__cell infi-grid__cell--' + col.align;\n if (editable) cls += ' is-editable';\n if (editingCell) cls += ' is-editing';\n if (modified !== null && modified.has(field)) cls += ' is-modified';\n const focused = this.focusField === field;\n if (focused) cls += this.cellSelection ? ' is-focused is-selected' : ' is-focused';\n const ariaSelected = this.cellSelection ? (focused ? 'true' : 'false') : null;\n const userClass = col.config.cellClass;\n if (userClass) {\n const c =\n typeof userClass === 'function'\n ? classList(this.safe(() => userClass({ row: view, value, rowIndex, field, column: col })) ?? null)\n : classList(userClass);\n if (c) cls += ' ' + c;\n }\n const userStyle = col.config.cellStyle;\n const style =\n userStyle === undefined\n ? null\n : typeof userStyle === 'function'\n ? (this.safe(() => userStyle({ row: view, value, rowIndex, field, column: col })) ?? null)\n : userStyle;\n const ariaCol = lc.index + 1 + this.ariaColOffset;\n\n if (editingCell) {\n const draft = edit !== null && field in edit.values ? edit.values[field] : value;\n const error = edit !== null ? (edit.errors[field] ?? null) : null;\n if (error) cls += ' is-invalid';\n const context = this.editContext(col, lc, view, value, draft, text, error, edit, rowEditing, api);\n return { key: field, ariaCol, ariaSelected, left: lc.left, width: lc.width, cls, style, kind: 'editor', text, template: col.editTemplate, context };\n }\n if (col.displayTemplate) {\n const context: GridCellContext = {\n $implicit: value,\n value,\n formattedValue: text,\n row: view,\n rowIndex,\n dataIndex: this.dataIndex,\n column: col,\n columnIndex: lc.index,\n field,\n editing: false,\n rowEditing,\n api,\n };\n return { key: field, ariaCol, ariaSelected, left: lc.left, width: lc.width, cls, style, kind: 'template', text, template: col.displayTemplate, context };\n }\n if (col.type === 'boolean') {\n const b = toBoolean(value);\n cls += b === true ? ' infi-grid__cell--true' : b === false ? ' infi-grid__cell--false' : '';\n }\n return { key: field, ariaCol, ariaSelected, left: lc.left, width: lc.width, cls, style, kind: 'text', text, template: null, context: null };\n }\n\n private editContext(\n col: ResolvedColumn<TRow>,\n lc: LayoutColumn<TRow>,\n view: TRow,\n value: unknown,\n draft: unknown,\n text: string,\n error: string | null,\n edit: EditSession<TRow> | null,\n rowEditing: boolean,\n api: GridEditContext['api'],\n ): GridEditContext {\n const store = this.store;\n const row = this.row as TRow;\n const rowIndex = this.rowIndex;\n const field = col.field;\n const context: GridEditContext = {\n $implicit: draft,\n value: draft,\n formattedValue: text,\n originalValue: edit !== null && field in edit.original ? edit.original[field] : value,\n row: view,\n rowIndex,\n dataIndex: this.dataIndex,\n column: col,\n columnIndex: lc.index,\n field,\n editing: true,\n rowEditing,\n api,\n error,\n editorOptions: col.editorOptions,\n autoFocus: edit !== null && edit.focusField === field,\n setValue: (v: unknown) => {\n context.value = v;\n context.$implicit = v;\n if (edit !== null) context.error = store.setDraft(field, v);\n else context.error = store.commitGridCell(row, rowIndex, field, v).error;\n },\n commit: () => {\n if (edit !== null && store.commitEdit()) store.viewport?.focus();\n },\n cancel: () => {\n if (edit !== null) {\n store.cancelEdit();\n store.viewport?.focus();\n }\n },\n };\n return context;\n }\n\n private safe<T>(fn: () => T): T | null {\n try {\n return fn();\n } catch (error) {\n if (!this.errorReported) {\n this.errorReported = true;\n this.store.reportError({ source: 'format', error });\n }\n return null;\n }\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n Input,\n NgZone,\n OnChanges,\n ViewEncapsulation,\n inject,\n} from '@angular/core';\nimport type { GridStyleValue, ResolvedColumn } from '../models/column.types';\nimport type { FilterModel } from '../models/filter.types';\nimport type { SortDirection, SortModelItem } from '../models/sort.types';\nimport type { GridHeaderContext, GridTemplate } from '../models/template.types';\nimport { DEFAULT_TEXT } from '../core/defaults';\nimport { GridOutletDirective } from '../directives/outlet.directive';\nimport { GridStore, type LayoutColumn } from '../state/grid-store';\nimport { classList } from './row.component';\n\ninterface HeaderView {\n key: string | null;\n col: ResolvedColumn | null;\n header: string;\n /** Native `title` (only when the grid's tooltips are off). */\n title: string | null;\n ariaCol: number | null;\n left: number;\n width: number;\n cls: string;\n style: GridStyleValue | null;\n sortable: boolean;\n ariaSort: 'ascending' | 'descending' | 'none' | null;\n sortIndexText: string;\n sortIconCls: string;\n filterBtnCls: string;\n filterLabel: string | null;\n filterActive: boolean;\n resizeCls: string;\n template: GridTemplate<GridHeaderContext> | null;\n context: GridHeaderContext | null;\n}\n\nconst EMPTY_HEADER: HeaderView = {\n key: null,\n col: null,\n header: '',\n title: null,\n ariaCol: null,\n left: 0,\n width: 0,\n cls: 'infi-grid__header-cell infi-grid__header-cell--empty',\n style: null,\n sortable: false,\n ariaSort: null,\n sortIndexText: '',\n sortIconCls: 'infi-grid__sort-icon is-hidden',\n filterBtnCls: 'infi-grid__filter-btn is-hidden',\n filterLabel: null,\n filterActive: false,\n resizeCls: 'infi-grid__resize-handle is-hidden',\n template: null,\n context: null,\n};\n\n/**\n * The single header row: labels/templates, sort icon with sort order, filter button, resize handle.\n * Header cells use the same slot pool as body cells and toggle icons with CSS classes,\n * so horizontal scrolling never creates or destroys views.\n */\n@Component({\n selector: 'div[infi-grid-header-row]',\n standalone: true,\n imports: [GridOutletDirective],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: { class: 'infi-grid__header-row', role: 'row', 'aria-rowindex': '1' },\n template: `\n @if (leading > 0) {\n <div\n class=\"infi-grid__pin infi-grid__pin--start infi-grid__selector\"\n role=\"columnheader\"\n aria-colindex=\"1\"\n [style.width.px]=\"leading\"\n [class.is-placed]=\"pins !== null\"\n [style.left.px]=\"pins?.start\"\n >\n @if (selectAll) {\n <input\n type=\"checkbox\"\n class=\"infi-grid__selector-box\"\n [checked]=\"selectionState === 'all'\"\n [indeterminate]=\"selectionState === 'some'\"\n [attr.aria-label]=\"selectAllLabel\"\n (click)=\"onSelectAll($event)\"\n />\n }\n </div>\n }\n <!-- Plain headers and template headers use separate slot pools (no view churn when scrolling sideways). -->\n @for (h of headers; track $index) {\n <div\n role=\"columnheader\"\n [class]=\"h.cls\"\n [style]=\"h.style\"\n [style.left.px]=\"h.left\"\n [style.width.px]=\"h.width\"\n [attr.aria-colindex]=\"h.ariaCol\"\n [attr.aria-sort]=\"h.ariaSort\"\n [attr.data-field]=\"h.key\"\n >\n <div\n class=\"infi-grid__header-main\"\n [attr.title]=\"h.title\"\n (click)=\"onHeaderClick($event, h)\"\n (mousedown)=\"$event.shiftKey && $event.preventDefault()\"\n >\n <div class=\"infi-grid__header-label\">\n <span class=\"infi-grid__header-text\" [textContent]=\"h.header\"></span>\n </div>\n <span [class]=\"h.sortIconCls\" aria-hidden=\"true\">\n <svg viewBox=\"0 0 10 14\" width=\"9\" height=\"13\" focusable=\"false\">\n <path class=\"infi-grid__sort-up\" d=\"M5 1 9 6H1z\" />\n <path class=\"infi-grid__sort-down\" d=\"M5 13 1 8h8z\" />\n </svg>\n <span class=\"infi-grid__sort-index\" [textContent]=\"h.sortIndexText\"></span>\n </span>\n </div>\n <button\n type=\"button\"\n [class]=\"h.filterBtnCls\"\n [attr.aria-label]=\"h.filterLabel\"\n [attr.aria-pressed]=\"h.filterLabel ? h.filterActive : null\"\n [attr.data-filter-field]=\"h.filterLabel ? h.key : null\"\n [attr.tabindex]=\"h.filterLabel ? null : -1\"\n (click)=\"onFilterClick($event, h)\"\n >\n <svg viewBox=\"0 0 16 16\" width=\"13\" height=\"13\" focusable=\"false\" aria-hidden=\"true\">\n <path d=\"M1.5 2.5h13l-5 6v4.5l-3 1.5v-6z\" />\n </svg>\n </button>\n <div [class]=\"h.resizeCls\" (pointerdown)=\"onResizeStart($event, h)\"></div>\n </div>\n }\n @for (h of templateHeaders; track $index) {\n <div\n role=\"columnheader\"\n [class]=\"h.cls\"\n [style]=\"h.style\"\n [style.left.px]=\"h.left\"\n [style.width.px]=\"h.width\"\n [attr.aria-colindex]=\"h.ariaCol\"\n [attr.aria-sort]=\"h.ariaSort\"\n [attr.data-field]=\"h.key\"\n >\n <div\n class=\"infi-grid__header-main\"\n [attr.title]=\"h.title\"\n (click)=\"onHeaderClick($event, h)\"\n (mousedown)=\"$event.shiftKey && $event.preventDefault()\"\n >\n <div class=\"infi-grid__header-label\">\n <ng-container [infiGridOutlet]=\"h.template\" [infiGridOutletContext]=\"h.context\" />\n </div>\n <span [class]=\"h.sortIconCls\" aria-hidden=\"true\">\n <svg viewBox=\"0 0 10 14\" width=\"9\" height=\"13\" focusable=\"false\">\n <path class=\"infi-grid__sort-up\" d=\"M5 1 9 6H1z\" />\n <path class=\"infi-grid__sort-down\" d=\"M5 13 1 8h8z\" />\n </svg>\n <span class=\"infi-grid__sort-index\" [textContent]=\"h.sortIndexText\"></span>\n </span>\n </div>\n <button\n type=\"button\"\n [class]=\"h.filterBtnCls\"\n [attr.aria-label]=\"h.filterLabel\"\n [attr.aria-pressed]=\"h.filterLabel ? h.filterActive : null\"\n [attr.data-filter-field]=\"h.filterLabel ? h.key : null\"\n [attr.tabindex]=\"h.filterLabel ? null : -1\"\n (click)=\"onFilterClick($event, h)\"\n >\n <svg viewBox=\"0 0 16 16\" width=\"13\" height=\"13\" focusable=\"false\" aria-hidden=\"true\">\n <path d=\"M1.5 2.5h13l-5 6v4.5l-3 1.5v-6z\" />\n </svg>\n </button>\n <div [class]=\"h.resizeCls\" (pointerdown)=\"onResizeStart($event, h)\"></div>\n </div>\n }\n @if (trailing > 0) {\n <div\n class=\"infi-grid__pin infi-grid__pin--end infi-grid__actions\"\n role=\"columnheader\"\n [attr.aria-colindex]=\"actionsAriaCol\"\n [attr.aria-label]=\"text.actions\"\n [style.width.px]=\"trailing\"\n [class.is-placed]=\"pins !== null\"\n [style.left.px]=\"pins?.end\"\n >\n @if (showAdd) {\n <button type=\"button\" class=\"infi-grid__action infi-grid__action--add\" data-action=\"add\" [attr.aria-label]=\"text.addRow\" [attr.title]=\"text.addRow\">\n <svg viewBox=\"0 0 16 16\" width=\"14\" height=\"14\" aria-hidden=\"true\" focusable=\"false\"><path d=\"M7.25 2h1.5v5.25H14v1.5H8.75V14h-1.5V8.75H2v-1.5h5.25z\" /></svg>\n </button>\n }\n </div>\n }\n `,\n})\nexport class GridHeaderRowComponent implements OnChanges {\n @Input() columns: readonly LayoutColumn[] = [];\n @Input() columnPool = 0;\n @Input() templatePool = 0;\n @Input() sortModel: readonly SortModelItem[] = [];\n @Input() filterModel: FilterModel = {};\n @Input() openFilterField: string | null = null;\n @Input() nonce = 0;\n /** Width of the pinned checkbox cell (0: no checkbox column). */\n @Input() leading = 0;\n /** Show the select-all checkbox. */\n @Input() selectAll = false;\n @Input() selectionState: 'none' | 'some' | 'all' = 'none';\n /** Width of the pinned action column (0: none). */\n @Input() trailing = 0;\n\n private readonly store = inject(GridStore);\n\n /** Where the pinned regions are placed with syncScroll, or null (sticky): see `GridStore.pinPlacement`. */\n protected get pins(): { start: number; end: number } | null {\n return this.store.pinPlacement;\n }\n\n private readonly zone = inject(NgZone);\n headers: HeaderView[] = [];\n templateHeaders: HeaderView[] = [];\n selectAllLabel = '';\n text = DEFAULT_TEXT;\n showAdd = false;\n actionsAriaCol = 0;\n private resizing = false;\n private ariaColOffset = 0;\n\n ngOnChanges(): void {\n const config = this.store.config();\n this.ariaColOffset = this.leading > 0 ? 1 : 0;\n this.text = config.text;\n this.selectAllLabel = config.text.selectAllRows;\n this.showAdd = config.editing.actionColumn?.add === true;\n this.actionsAriaCol = this.store.layout().columns.length + 1 + this.ariaColOffset;\n const pool = Math.max(this.columnPool, this.columns.length);\n let templated = 0;\n for (const lc of this.columns) if (lc.headerTemplateIndex >= 0) templated++;\n const templatePool = Math.max(this.templatePool, templated);\n const headers: HeaderView[] = new Array(pool);\n const templateHeaders: HeaderView[] = new Array(templatePool);\n for (const lc of this.columns) {\n if (lc.headerTemplateIndex >= 0) templateHeaders[lc.headerTemplateIndex % templatePool] = this.buildHeader(lc);\n else headers[lc.index % pool] = this.buildHeader(lc);\n }\n for (let k = 0; k < pool; k++) if (headers[k] === undefined) headers[k] = EMPTY_HEADER;\n for (let k = 0; k < templatePool; k++) {\n if (templateHeaders[k] !== undefined) continue;\n // Keep the previous template view alive but hidden instead of destroying it.\n const previous = this.templateHeaders[k];\n templateHeaders[k] = previous?.template ? { ...previous, key: null, ariaCol: null, cls: EMPTY_HEADER.cls } : EMPTY_HEADER;\n }\n this.headers = headers;\n this.templateHeaders = templateHeaders;\n }\n\n private buildHeader(lc: LayoutColumn): HeaderView {\n const store = this.store;\n const config = store.config();\n const col = lc.col;\n const field = col.field;\n const sortModel = this.sortModel;\n const sortPos = sortModel.findIndex((s) => s.field === field);\n const sortDir: SortDirection | null = sortPos >= 0 ? sortModel[sortPos].direction : null;\n const showIndex = sortPos >= 0 && sortModel.length > 1 && config.sorting.showSortIndex;\n const filterActive = this.filterModel[field] !== undefined;\n const sortable = col.sortable;\n const showSortIcon =\n col.showSortIcon && (sortable || sortDir !== null) && (col.sortIconVisibility !== 'sorted' || sortDir !== null);\n let sortIconCls = 'infi-grid__sort-icon';\n if (!showSortIcon) sortIconCls += ' is-hidden';\n if (sortDir) sortIconCls += ' is-sorted is-' + sortDir;\n if (col.sortIconVisibility === 'hover') sortIconCls += ' infi-grid__sort-icon--hover';\n // In `'row'` mode the filter row replaces the popup.\n const showFilterIcon = col.filterable && col.showFilterIcon && config.filtering.mode !== 'row';\n let filterBtnCls = 'infi-grid__filter-btn';\n if (!showFilterIcon) filterBtnCls += ' is-hidden';\n if (filterActive) filterBtnCls += ' is-active';\n if (this.openFilterField === field) filterBtnCls += ' is-open';\n if (col.filterIconVisibility === 'hover') filterBtnCls += ' infi-grid__filter-btn--hover';\n let cls = 'infi-grid__header-cell infi-grid__header-cell--' + col.align;\n if (sortable) cls += ' is-sortable';\n if (sortDir) cls += ' is-sorted';\n if (filterActive) cls += ' is-filtered';\n const extra = classList(col.config.headerClass);\n if (extra) cls += ' ' + extra;\n const template = col.headerTemplate;\n const context: GridHeaderContext | null = template\n ? {\n $implicit: col,\n column: col,\n columnIndex: lc.index,\n header: col.header,\n sortDirection: sortDir,\n sortIndex: sortPos >= 0 ? sortPos + 1 : null,\n filterActive,\n api: store.api,\n toggleSort: (m?: boolean) => store.toggleSort(field, m === true),\n openFilter: (anchor?: HTMLElement) => store.openFilterPopup(field, anchor ?? null),\n }\n : null;\n return {\n key: field,\n col,\n header: col.header,\n title: config.tooltips.enabled ? null : col.header || null,\n ariaCol: lc.index + 1 + this.ariaColOffset,\n left: lc.left,\n width: lc.width,\n cls,\n style: col.config.headerStyle ?? null,\n sortable,\n ariaSort: sortDir === 'asc' ? 'ascending' : sortDir === 'desc' ? 'descending' : sortable ? 'none' : null,\n sortIndexText: showIndex ? String(sortPos + 1) : '',\n sortIconCls,\n filterBtnCls,\n filterLabel: showFilterIcon\n ? (filterActive ? config.text.filteredColumn : config.text.filterColumn).replace('{column}', col.header)\n : null,\n filterActive,\n resizeCls: col.resizable ? 'infi-grid__resize-handle' : 'infi-grid__resize-handle is-hidden',\n template,\n context,\n };\n }\n\n /** Emits `(headerClick)`; returns true when a handler cancelled the built-in reaction. */\n private emitHeaderClick(event: MouseEvent, h: HeaderView, area: 'label' | 'filterButton'): boolean {\n const sink = this.store.events;\n if (!h.key || !h.col || !sink.listens?.('headerClick')) return false;\n const index = this.store.layout().byField.get(h.key)?.index ?? -1;\n const click = { column: h.col, field: h.key, columnIndex: index, area, event, cancel: false };\n sink.headerClick?.(click);\n return click.cancel;\n }\n\n onHeaderClick(event: MouseEvent, h: HeaderView): void {\n if (!h.key || this.resizing) return;\n if (this.emitHeaderClick(event, h, 'label') || !h.sortable) return;\n const key = this.store.config().sorting.multiSortKey;\n const multi =\n key === 'always' || (key === 'shift' && event.shiftKey) || (key === 'ctrl' && (event.ctrlKey || event.metaKey));\n this.store.toggleSort(h.key, multi);\n }\n\n onSelectAll(event: MouseEvent): void {\n // The click isn't cancelled: with zone.js, Angular draws the new state during the click, and a cancelled click makes\n // the browser restore the old state afterwards. The box is set from the selection instead, also when nothing changed.\n this.store.toggleSelectAll(event);\n const box = event.target;\n if (box instanceof HTMLInputElement) {\n const state = this.store.headerSelectionState();\n box.checked = state === 'all';\n box.indeterminate = state === 'some';\n }\n }\n\n onFilterClick(event: MouseEvent, h: HeaderView): void {\n event.stopPropagation();\n if (!h.key || !h.filterLabel) return;\n if (this.emitHeaderClick(event, h, 'filterButton')) return;\n if (this.store.openFilterField() === h.key) this.store.closeFilterPopup();\n else this.store.openFilterPopup(h.key, event.currentTarget as HTMLElement);\n }\n\n onResizeStart(event: PointerEvent, h: HeaderView): void {\n if (event.button !== 0 || !h.key || !h.col?.resizable) return;\n event.preventDefault();\n event.stopPropagation();\n const handle = event.currentTarget as HTMLElement;\n const startX = event.clientX;\n const startWidth = h.width;\n const field = h.key;\n this.resizing = true;\n try {\n handle.setPointerCapture(event.pointerId);\n } catch {\n // Capture can be refused (e.g. synthetic events); dragging still works while over the handle.\n }\n handle.classList.add('is-active');\n let frame = 0;\n let pending = startWidth;\n const move = (e: PointerEvent) => {\n pending = startWidth + e.clientX - startX;\n if (!frame) {\n frame = requestAnimationFrame(() => {\n frame = 0;\n this.store.setColumnWidth(field, pending, false, 'user', startWidth);\n });\n }\n };\n const end = (e: PointerEvent) => {\n if (frame) cancelAnimationFrame(frame);\n handle.removeEventListener('pointermove', move);\n handle.removeEventListener('pointerup', end);\n handle.removeEventListener('pointercancel', end);\n handle.classList.remove('is-active');\n this.zone.run(() => this.store.setColumnWidth(field, startWidth + e.clientX - startX, true, 'user', startWidth));\n // The click that ends a drag must not sort the column.\n setTimeout(() => (this.resizing = false));\n };\n this.zone.runOutsideAngular(() => {\n handle.addEventListener('pointermove', move);\n handle.addEventListener('pointerup', end);\n handle.addEventListener('pointercancel', end);\n });\n }\n}\n","import { ChangeDetectionStrategy, Component, Input, OnChanges, ViewEncapsulation, inject } from '@angular/core';\nimport type { GridSummaryResult } from '../models/summary.types';\nimport type { GridSummaryCellContext, GridTemplate } from '../models/template.types';\nimport { GridOutletDirective } from '../directives/outlet.directive';\nimport { GridStore, type LayoutColumn } from '../state/grid-store';\n\ninterface SummaryCellView {\n key: string | null;\n ariaCol: number | null;\n left: number;\n width: number;\n cls: string;\n label: string;\n value: string;\n title: string | null;\n template: GridTemplate<GridSummaryCellContext> | null;\n context: GridSummaryCellContext | null;\n}\n\nconst EMPTY_SUMMARY_CELL: SummaryCellView = {\n key: null,\n ariaCol: null,\n left: 0,\n width: 0,\n cls: 'infi-grid__summary-cell infi-grid__cell--empty',\n label: '',\n value: '',\n title: null,\n template: null,\n context: null,\n};\n\n/** Summary row cells (label + value, or a summary template), pooled like body cells. */\n@Component({\n selector: 'div[infi-grid-summary-row]',\n standalone: true,\n imports: [GridOutletDirective],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: { class: 'infi-grid__summary-row', role: 'row' },\n template: `\n @if (leading > 0) {\n <div\n class=\"infi-grid__pin infi-grid__pin--start infi-grid__selector\"\n role=\"gridcell\"\n aria-colindex=\"1\"\n [style.width.px]=\"leading\"\n [class.is-placed]=\"pins !== null\"\n [style.left.px]=\"pins?.start\"\n ></div>\n }\n @for (c of cells; track $index) {\n <div\n role=\"gridcell\"\n [class]=\"c.cls\"\n [style.left.px]=\"c.left\"\n [style.width.px]=\"c.width\"\n [attr.aria-colindex]=\"c.ariaCol\"\n [attr.data-field]=\"c.key\"\n [attr.title]=\"c.title\"\n >\n <span class=\"infi-grid__summary-label\" [textContent]=\"c.label\"></span>\n <span class=\"infi-grid__summary-value\" [textContent]=\"c.value\"></span>\n </div>\n }\n @for (c of templateCells; track $index) {\n <div\n role=\"gridcell\"\n [class]=\"c.cls\"\n [style.left.px]=\"c.left\"\n [style.width.px]=\"c.width\"\n [attr.aria-colindex]=\"c.ariaCol\"\n [attr.data-field]=\"c.key\"\n [attr.title]=\"c.title\"\n >\n <ng-container [infiGridOutlet]=\"c.template\" [infiGridOutletContext]=\"c.context\" />\n </div>\n }\n @if (trailing > 0) {\n <div class=\"infi-grid__pin infi-grid__pin--end\" role=\"gridcell\" [style.width.px]=\"trailing\" [class.is-placed]=\"pins !== null\" [style.left.px]=\"pins?.end\"></div>\n }\n `,\n})\nexport class GridSummaryRowComponent implements OnChanges {\n @Input() columns: readonly LayoutColumn[] = [];\n @Input() columnPool = 0;\n @Input() templatePool = 0;\n @Input() results: Readonly<Record<string, GridSummaryResult>> = {};\n /** Width of the pinned checkbox cell (0: no checkbox column). */\n @Input() leading = 0;\n /** Width of the pinned action column (0: none). */\n @Input() trailing = 0;\n\n private readonly store = inject(GridStore);\n\n /** Where the pinned regions are placed with syncScroll, or null (sticky): see `GridStore.pinPlacement`. */\n protected get pins(): { start: number; end: number } | null {\n return this.store.pinPlacement;\n }\n\n cells: SummaryCellView[] = [];\n templateCells: SummaryCellView[] = [];\n\n ngOnChanges(): void {\n const config = this.store.config();\n const api = this.store.api;\n const showLabels = config.summary.showLabels;\n // With the grid's tooltips on, a cut-off summary shows the grid tooltip instead of the native title.\n const nativeTitle = !config.tooltips.enabled;\n const ariaColOffset = this.leading > 0 ? 1 : 0;\n const pool = Math.max(this.columnPool, this.columns.length);\n let templated = 0;\n for (const lc of this.columns) if (lc.summaryTemplateIndex >= 0) templated++;\n const templatePool = Math.max(this.templatePool, templated);\n const cells: SummaryCellView[] = new Array(pool);\n const templateCells: SummaryCellView[] = new Array(templatePool);\n for (const lc of this.columns) {\n const col = lc.col;\n const result = this.results[col.field] ?? null;\n const label = result && showLabels && result.label ? `${result.label}:` : '';\n let cls = 'infi-grid__summary-cell infi-grid__cell--' + col.align;\n if (result?.error) cls += ' is-error';\n if (!result) cls += ' is-blank';\n const template = result ? col.summaryTemplate : null;\n const context: GridSummaryCellContext | null =\n template && result\n ? {\n $implicit: result.value,\n value: result.value,\n formattedValue: result.formattedValue,\n label: result.label,\n result,\n column: col,\n field: col.field,\n api,\n }\n : null;\n const view: SummaryCellView = {\n key: col.field,\n ariaCol: lc.index + 1 + ariaColOffset,\n left: lc.left,\n width: lc.width,\n cls,\n label,\n value: result ? result.formattedValue : '',\n title: result && nativeTitle ? `${label} ${result.formattedValue}`.trim() : null,\n template,\n context,\n };\n // Columns with a summary template always use the template pool (even while their value is empty).\n if (lc.summaryTemplateIndex >= 0) templateCells[lc.summaryTemplateIndex % templatePool] = view;\n else cells[lc.index % pool] = view;\n }\n for (let k = 0; k < pool; k++) if (cells[k] === undefined) cells[k] = EMPTY_SUMMARY_CELL;\n for (let k = 0; k < templatePool; k++) {\n if (templateCells[k] !== undefined) continue;\n const previous = this.templateCells[k];\n templateCells[k] = previous?.template ? { ...previous, key: null, ariaCol: null, cls: EMPTY_SUMMARY_CELL.cls } : EMPTY_SUMMARY_CELL;\n }\n this.cells = cells;\n this.templateCells = templateCells;\n }\n}\n","import { NgTemplateOutlet } from '@angular/common';\nimport {\n ChangeDetectionStrategy,\n ChangeDetectorRef,\n Component,\n ElementRef,\n NgZone,\n OnDestroy,\n ViewChild,\n ViewEncapsulation,\n afterNextRender,\n inject,\n} from '@angular/core';\nimport type { VirtualizationState } from '../models/api.types';\nimport type { GridRowKey } from '../models/data.types';\nimport type { GridCellEvent, GridRowEvent } from '../models/events.types';\nimport type { ResolvedColumn } from '../models/column.types';\nimport type { ResolvedGridConfig } from '../models/config.types';\nimport type { FilterModel } from '../models/filter.types';\nimport type { SortModelItem } from '../models/sort.types';\nimport type { GridCellSelectionSource } from '../models/selection.types';\nimport type { GridSummaryResult } from '../models/summary.types';\nimport {\n alignedScrollTarget,\n computeColumnRange,\n computeRowRange,\n computeVerticalMetrics,\n maxColumnWindow,\n rowPoolSize,\n virtualToScrollTop,\n type IndexRange,\n type VerticalMetrics,\n} from '../core/virtual-math';\nimport { GridStore, type ColumnLayout, type EditSession, type LayoutColumn, type ViewportHandle } from '../state/grid-store';\nimport { GridTooltipService } from '../state/tooltip.service';\nimport { GridTooltipController, type TooltipTarget } from './tooltip-controller';\nimport { GridFilterRowComponent } from './filter-row.component';\nimport { GridHeaderRowComponent } from './header-row.component';\nimport { GridRowComponent } from './row.component';\nimport { GridSummaryRowComponent } from './summary-row.component';\n\n/**\n * A reusable row slot. Slot `k` renders the row whose index ≡ k (mod pool size).\n * Slots are never destroyed while scrolling: an unused slot keeps its last row and is hidden,\n * because creating or destroying views makes Angular check the whole application.\n */\ninterface RowSlot<TRow> {\n readonly key: number;\n row: TRow | null;\n hidden: boolean;\n columns: readonly LayoutColumn<TRow>[];\n rowIndex: number;\n dataIndex: number;\n top: number;\n transform: string;\n version: number;\n edit: EditSession<TRow> | null;\n focusField: string | null;\n selected: boolean;\n selectable: boolean;\n /** The row of the selected cell, with `cellSelection.activeRow`. */\n active: boolean;\n stamp: number;\n}\n\ninterface RenderWindow<TRow> {\n slots: RowSlot<TRow>[];\n columns: readonly LayoutColumn<TRow>[];\n /** Number of plain-cell slots per row (never shrinks while scrolling). */\n columnPool: number;\n /** Number of template-cell slots per row (never shrinks while scrolling). */\n templatePool: number;\n layout: ColumnLayout<TRow>;\n rowRange: IndexRange;\n colRange: IndexRange;\n metrics: VerticalMetrics;\n rowCount: number;\n /** Displayed data columns. */\n columnCount: number;\n /** `aria-colcount`: data columns plus the checkbox and action columns. */\n ariaColCount: number;\n rowHeight: number;\n headerHeight: number;\n /** Height of the filter row (0 without one). */\n filterRowHeight: number;\n /** Rows above the data rows for `aria-rowindex`: the header, and the filter row. */\n headerRows: number;\n summaryHeight: number;\n summaryVisible: boolean;\n summarySticky: boolean;\n summaries: Readonly<Record<string, GridSummaryResult>>;\n sortModel: readonly SortModelItem[];\n filterModel: FilterModel;\n openFilterField: string | null;\n gridEditMode: boolean;\n renderNonce: number;\n canvasWidth: number;\n canvasRowsHeight: number;\n rowsViewportHeight: number;\n /** `virtualization.syncScroll`: the content is positioned by `applyScroll()`. */\n syncScroll: boolean;\n /** Width of the stage with syncScroll: the viewport without its scrollbar. */\n stageWidth: number;\n /** Top of the rows area in the canvas: the header block and the top add row. */\n rowsTop: number;\n /** Height of the rows area (at least the viewport's rows height with a sticky summary row). */\n rowsBoxHeight: number;\n ariaLabel: string;\n selectionOn: boolean;\n multiselect: boolean;\n leadingWidth: number;\n trailingWidth: number;\n selectAllVisible: boolean;\n headerSelectionState: 'none' | 'some' | 'all';\n /** The inline add row's session, and where its band is pinned. */\n addSession: EditSession<TRow> | null;\n addTop: boolean;\n addBottom: boolean;\n /** Bottom offset of the bottom add band (above a sticky summary row). */\n addBottomOffset: number;\n}\n\ninterface Memo {\n config: ResolvedGridConfig;\n layout: ColumnLayout;\n rows: readonly unknown[];\n edit: EditSession | null;\n gridEditMode: boolean;\n summaryVisible: boolean;\n summaries: Readonly<Record<string, GridSummaryResult>>;\n sortModel: readonly SortModelItem[];\n filterModel: FilterModel;\n filterRowHeight: number;\n openFilterField: string | null;\n editVersion: number;\n renderNonce: number;\n scrollTop: number;\n scrollLeft: number;\n width: number;\n height: number;\n focusRow: number;\n focusField: string | null;\n selection: ReadonlyMap<GridRowKey, unknown>;\n headerSelectionState: 'none' | 'some' | 'all';\n}\n\n/**\n * With `templateKey`s: one flag list per template and key (template columns only), for pool sizing. Empty when no\n * template column has a key.\n */\nfunction templateKeyFlags(columns: readonly LayoutColumn[]): boolean[][] {\n if (!columns.some((lc) => lc.templateIndex >= 0 && lc.col.config.templateKey != null)) return [];\n const groups = new Map<unknown, Map<string | null, number>>();\n let count = 0;\n const groupOf = columns.map((lc) => {\n if (lc.templateIndex < 0) return -1;\n const key = lc.col.config.templateKey ?? null;\n let byKey = groups.get(lc.col.displayTemplate);\n if (!byKey) groups.set(lc.col.displayTemplate, (byKey = new Map()));\n let group = byKey.get(key);\n if (group === undefined) byKey.set(key, (group = count++));\n return group;\n });\n return Array.from({ length: count }, (_, g) => groupOf.map((x) => x === g));\n}\n\n/** Elements inside cells that handle their own clicks (a click on them never selects the row). */\nconst INTERACTIVE = 'input, select, textarea, button, a[href], label, [contenteditable=\"true\"], .infi-grid__editor';\n\ninterface RowHit {\n rowIndex: number;\n /** The clicked cell's field, or null outside the cells. */\n field: string | null;\n /** The click was on the row's selection checkbox. */\n selector: boolean;\n}\n\nconst EMPTY_SUMMARIES: Readonly<Record<string, GridSummaryResult>> = {};\n\n/**\n * The scroll container: header (sticky), virtualized rows, summary row (sticky or inline).\n *\n * Performance design:\n * - scroll, resize, click and key listeners run outside Angular's zone;\n * - on scroll, only this component is checked (`detectChanges()`), and only when the rendered\n * row/column window actually changed — the rest of the application is never checked;\n * - rows live in a fixed pool of slots that are reused, so fast scrolling rebinds existing DOM\n * instead of creating and destroying it;\n * - with `virtualization.syncScroll` (default), the drawn content stays in view while the browser scrolls on its own\n * thread, and moves in the same frame as the rows and columns drawn for the new position: fast scrolling never\n * shows areas that aren't drawn yet (see applyScroll()).\n */\n@Component({\n selector: 'infi-grid-viewport',\n standalone: true,\n imports: [NgTemplateOutlet, GridHeaderRowComponent, GridFilterRowComponent, GridRowComponent, GridSummaryRowComponent],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n host: { class: 'infi-grid__viewport-host' },\n template: `\n @let win = renderWindow();\n <div\n #scroller\n class=\"infi-grid__viewport\"\n tabindex=\"0\"\n role=\"grid\"\n [attr.aria-label]=\"win.ariaLabel\"\n [attr.aria-rowcount]=\"win.rowCount + win.headerRows + (win.summaryVisible ? 1 : 0)\"\n [attr.aria-colcount]=\"win.ariaColCount\"\n [attr.aria-multiselectable]=\"win.multiselect ? 'true' : null\"\n >\n <div class=\"infi-grid__canvas\" [style.width.px]=\"win.canvasWidth\">\n <!--\n syncScroll: the stage stays in view while the browser scrolls (sticky), and the grid moves the content inside\n it (left of the inner block, transform of the rows track) in the frame it draws the new rows and columns: see\n applyScroll(). Without syncScroll both are plain blocks.\n -->\n <div class=\"infi-grid__stage\" [class.infi-grid__stage--sync]=\"win.syncScroll\" [style.width.px]=\"win.syncScroll ? win.stageWidth : null\">\n <div #inner class=\"infi-grid__stage-inner\" [style.width.px]=\"win.syncScroll ? win.canvasWidth : null\">\n <div class=\"infi-grid__header\" role=\"rowgroup\" [style.height.px]=\"win.headerHeight + win.filterRowHeight\">\n <div\n infi-grid-header-row\n [style.height.px]=\"win.headerHeight\"\n [columns]=\"win.columns\"\n [columnPool]=\"win.columnPool\"\n [templatePool]=\"win.templatePool\"\n [sortModel]=\"win.sortModel\"\n [filterModel]=\"win.filterModel\"\n [openFilterField]=\"win.openFilterField\"\n [nonce]=\"win.renderNonce\"\n [leading]=\"win.leadingWidth\"\n [selectAll]=\"win.selectAllVisible\"\n [selectionState]=\"win.headerSelectionState\"\n [trailing]=\"win.trailingWidth\"\n ></div>\n @if (win.filterRowHeight > 0) {\n <div\n infi-grid-filter-row\n aria-rowindex=\"2\"\n [style.height.px]=\"win.filterRowHeight\"\n [columns]=\"win.columns\"\n [columnPool]=\"win.columnPool\"\n [filterModel]=\"win.filterModel\"\n [nonce]=\"win.renderNonce\"\n [leading]=\"win.leadingWidth\"\n [trailing]=\"win.trailingWidth\"\n ></div>\n }\n </div>\n @if (win.addTop) {\n <ng-container *ngTemplateOutlet=\"addBand; context: { $implicit: win }\" />\n }\n <!-- With a sticky summary, the rows area fills the viewport so the summary stays pinned at the bottom even with few rows. -->\n <div\n #rows\n class=\"infi-grid__rows\"\n role=\"rowgroup\"\n [style.height.px]=\"win.canvasRowsHeight\"\n [style.min-height.px]=\"win.summaryVisible && win.summarySticky ? win.rowsViewportHeight : null\"\n >\n <!-- With syncScroll, the track sticks under the header and the grid moves it (applyScroll). -->\n <div\n #track\n class=\"infi-grid__rows-track\"\n role=\"presentation\"\n [class.infi-grid__rows-track--sync]=\"win.syncScroll\"\n [style.top.px]=\"win.syncScroll ? win.rowsTop : null\"\n >\n @for (slot of win.slots; track slot.key) {\n <div\n infi-grid-row\n [class.infi-grid__row--hidden]=\"slot.hidden\"\n [class.infi-grid__row--selected]=\"slot.selected\"\n [class.infi-grid__row--active]=\"slot.active\"\n [attr.data-row-index]=\"slot.hidden ? null : slot.rowIndex\"\n [attr.aria-rowindex]=\"slot.hidden ? null : slot.rowIndex + 1 + win.headerRows\"\n [attr.aria-hidden]=\"slot.hidden ? 'true' : null\"\n [attr.aria-selected]=\"slot.hidden || !win.selectionOn ? null : slot.selected\"\n [style.transform]=\"slot.transform\"\n [style.height.px]=\"win.rowHeight\"\n [row]=\"slot.row\"\n [rowIndex]=\"slot.rowIndex\"\n [dataIndex]=\"slot.dataIndex\"\n [columns]=\"slot.columns\"\n [columnPool]=\"win.columnPool\"\n [templatePool]=\"win.templatePool\"\n [version]=\"slot.version\"\n [nonce]=\"win.renderNonce\"\n [edit]=\"slot.edit\"\n [gridEditMode]=\"win.gridEditMode\"\n [focusField]=\"slot.focusField\"\n [selected]=\"slot.selected\"\n [selectable]=\"slot.selectable\"\n [leading]=\"win.leadingWidth\"\n [trailing]=\"win.trailingWidth\"\n ></div>\n }\n </div>\n </div>\n @if (win.addBottom) {\n <ng-container *ngTemplateOutlet=\"addBand; context: { $implicit: win }\" />\n }\n @if (win.summaryVisible) {\n <div\n class=\"infi-grid__summary\"\n role=\"rowgroup\"\n [class.infi-grid__summary--sticky]=\"win.summarySticky\"\n [style.height.px]=\"win.summaryHeight\"\n >\n <div\n infi-grid-summary-row\n [columns]=\"win.columns\"\n [columnPool]=\"win.columnPool\"\n [templatePool]=\"win.templatePool\"\n [results]=\"win.summaries\"\n [leading]=\"win.leadingWidth\"\n [trailing]=\"win.trailingWidth\"\n [attr.aria-rowindex]=\"win.rowCount + 1 + win.headerRows\"\n ></div>\n </div>\n }\n </div>\n </div>\n </div>\n </div>\n <!-- The inline add row: pinned under the header or above the summary row, outside the virtual rows. -->\n <ng-template #addBand let-win>\n <div\n class=\"infi-grid__add-band\"\n role=\"rowgroup\"\n [class.infi-grid__add-band--top]=\"win.addTop\"\n [class.infi-grid__add-band--bottom]=\"win.addBottom\"\n [style.top.px]=\"win.addTop ? win.headerHeight + win.filterRowHeight : null\"\n [style.bottom.px]=\"win.addBottom ? win.addBottomOffset : null\"\n [style.height.px]=\"win.rowHeight\"\n >\n <div\n infi-grid-row\n [style.height.px]=\"win.rowHeight\"\n [row]=\"win.addSession.row\"\n [rowIndex]=\"-1\"\n [dataIndex]=\"-1\"\n [columns]=\"win.columns\"\n [columnPool]=\"win.columnPool\"\n [templatePool]=\"win.templatePool\"\n [version]=\"0\"\n [nonce]=\"win.renderNonce\"\n [edit]=\"win.addSession\"\n [gridEditMode]=\"false\"\n [focusField]=\"null\"\n [leading]=\"win.leadingWidth\"\n [trailing]=\"win.trailingWidth\"\n [addRow]=\"true\"\n ></div>\n </div>\n </ng-template>\n `,\n})\nexport class GridViewportComponent<TRow = any> implements ViewportHandle, OnDestroy {\n @ViewChild('scroller', { static: true }) private scrollerRef!: ElementRef<HTMLDivElement>;\n @ViewChild('rows', { static: true }) private rowsRef!: ElementRef<HTMLDivElement>;\n @ViewChild('inner', { static: true }) private innerRef?: ElementRef<HTMLDivElement>;\n @ViewChild('track', { static: true }) private trackRef?: ElementRef<HTMLDivElement>;\n\n private readonly store = inject<GridStore<TRow>>(GridStore);\n private readonly cdr = inject(ChangeDetectorRef);\n private readonly zone = inject(NgZone);\n private readonly tips = new GridTooltipController<TRow>(this.store, inject(GridTooltipService));\n\n // Hot-path state: plain fields, not signals, so scrolling never notifies Angular's scheduler.\n private scrollTop = 0;\n private scrollLeft = 0;\n private viewportWidth = 0;\n private viewportHeight = 0;\n private focusRow = -1;\n private focusField: string | null = null;\n /** Offsets written by applyScroll(). */\n private appliedLeft = 0;\n private appliedTop = 0;\n\n private win: RenderWindow<TRow> | null = null;\n private memo: Memo | null = null;\n private slots: RowSlot<TRow>[] = [];\n private columnPool = 0;\n private templatePool = 0;\n private poolLayout: ColumnLayout<TRow> | null = null;\n private poolWidth = -1;\n private stamp = 0;\n private resizeObserver: ResizeObserver | null = null;\n private readonly cleanup: (() => void)[] = [];\n private destroyed = false;\n\n constructor() {\n this.store.viewport = this;\n afterNextRender(() => this.attach());\n }\n\n ngOnDestroy(): void {\n this.destroyed = true;\n this.clearPendingClick();\n this.tips.destroy();\n if (this.hoverFrame) cancelAnimationFrame(this.hoverFrame);\n for (const fn of this.cleanup) fn();\n this.resizeObserver?.disconnect();\n if (this.store.viewport === this) this.store.viewport = null;\n }\n\n /** Called from the template. Returns the cached window unless an input of the window changed. */\n renderWindow(): RenderWindow<TRow> {\n const s = this.store;\n // Read every signal on every call so the template stays subscribed to all of them.\n const config = s.config();\n const layout = s.layout();\n const rows = s.viewRows();\n const indices = s.viewIndices();\n const edit = s.editSession();\n const gridEditMode = s.gridEditMode();\n const summaryVisible = s.summaryVisible();\n const summaries = summaryVisible ? s.summaries() : EMPTY_SUMMARIES;\n const sortModel = s.sortModel();\n const filterModel = s.filterModel();\n const filterRowHeight = s.filterRowHeight();\n const openFilterField = s.openFilterField();\n const editVersion = s.editVersion();\n const renderNonce = s.renderNonce();\n const selection = s.selection();\n const selectAllVisible = config.selection.mode === 'multiple' && config.selection.headerCheckbox && layout.leadingWidth > 0;\n // Read here (not only when the window is rebuilt) so the template stays subscribed to it.\n const headerSelectionState = selectAllVisible ? s.headerSelectionState() : 'none';\n if (config.cellSelection.enabled) {\n // The selected cell is the focused cell, found by key: it follows its row through sort, filter and refresh.\n const cell = s.selectedCell();\n this.focusRow = cell === null ? -1 : s.selectedCellIndex();\n this.focusField = cell === null ? null : cell.field;\n }\n\n const m = this.memo;\n if (\n this.win &&\n m &&\n m.config === config &&\n m.layout === layout &&\n m.rows === rows &&\n m.edit === edit &&\n m.gridEditMode === gridEditMode &&\n m.summaryVisible === summaryVisible &&\n m.summaries === summaries &&\n m.sortModel === sortModel &&\n m.filterModel === filterModel &&\n m.filterRowHeight === filterRowHeight &&\n m.openFilterField === openFilterField &&\n m.editVersion === editVersion &&\n m.renderNonce === renderNonce &&\n m.scrollTop === this.scrollTop &&\n m.scrollLeft === this.scrollLeft &&\n m.width === this.viewportWidth &&\n m.height === this.viewportHeight &&\n m.focusRow === this.focusRow &&\n m.focusField === this.focusField &&\n m.selection === selection &&\n m.headerSelectionState === headerSelectionState\n ) {\n this.applyScroll();\n return this.win;\n }\n // Something drawn changed: a shown tooltip may describe a cell that moved or changed.\n if (this.memo !== null) this.tips.reset();\n this.memo = {\n config,\n layout,\n rows,\n edit,\n gridEditMode,\n summaryVisible,\n summaries,\n sortModel,\n filterModel,\n filterRowHeight,\n openFilterField,\n editVersion,\n renderNonce,\n scrollTop: this.scrollTop,\n scrollLeft: this.scrollLeft,\n width: this.viewportWidth,\n height: this.viewportHeight,\n focusRow: this.focusRow,\n focusField: this.focusField,\n selection,\n headerSelectionState,\n };\n\n const rowHeight = config.rowHeight;\n const selectionOn = config.selection.mode !== 'none';\n const activeRow = config.cellSelection.activeRow ? this.focusRow : -1;\n const keyOf = s.keyOf();\n // Rows deleted in batch mode can't be selected either.\n const checkSelectable = selectionOn && (config.selection.rowSelectable !== null || s.pendingDeletes().size > 0);\n const headerHeight = config.headerHeight;\n const summarySticky = config.summary.sticky;\n const summaryHeight = summaryVisible ? config.summaryRowHeight : 0;\n const addSession = edit !== null && edit.isNew ? edit : null;\n const rowsViewportHeight = Math.max(\n 0,\n this.viewportHeight -\n headerHeight -\n filterRowHeight -\n (summaryVisible && summarySticky ? summaryHeight : 0) -\n (addSession ? rowHeight : 0),\n );\n const rowCount = rows.length;\n const virt = config.virtualization;\n const metrics = computeVerticalMetrics(this.scrollTop, rowsViewportHeight, rowCount, rowHeight);\n const rowRange = computeRowRange(metrics, rowsViewportHeight, rowCount, rowHeight, virt.rowBuffer, virt.rows);\n const colRange = computeColumnRange(this.scrollLeft, this.viewportWidth, layout.offsets, virt.columnBuffer, virt.columns);\n\n // Keep the same columns array while the column window is unchanged, so rows don't re-render.\n const prev = this.win;\n const columns =\n prev && prev.layout === layout && prev.colRange.start === colRange.start && prev.colRange.end === colRange.end\n ? prev.columns\n : layout.columns.slice(colRange.start, colRange.end);\n this.sizeColumnPools(layout, virt.columnBuffer, virt.columns);\n // Safety net: the pools always cover the current window.\n this.columnPool = Math.max(this.columnPool, colRange.end - colRange.start);\n let cellTemplates = 0;\n let headerTemplates = 0;\n let summaryTemplates = 0;\n for (const lc of columns) {\n if (lc.templateIndex >= 0) cellTemplates++;\n if (lc.headerTemplateIndex >= 0) headerTemplates++;\n if (lc.summaryTemplateIndex >= 0) summaryTemplates++;\n }\n this.templatePool = Math.max(this.templatePool, cellTemplates, headerTemplates, summaryTemplates);\n\n const poolSize = virt.rows\n ? Math.min(rowCount, rowPoolSize(rowsViewportHeight, rowHeight, virt.rowBuffer))\n : rowCount;\n if (this.slots.length !== poolSize) {\n // Spare slots are pre-filled (hidden) with the first row, so their cells exist before they are\n // first needed; using a slot for the first time while scrolling would otherwise create views.\n const warm = rows.length > 0 ? rows[0] : null;\n this.slots = Array.from({ length: poolSize }, (_, key) => ({\n key,\n row: warm,\n hidden: true,\n columns: columns,\n rowIndex: -1,\n dataIndex: -1,\n top: -1,\n transform: '',\n version: 0,\n edit: null,\n focusField: null,\n selected: false,\n selectable: true,\n active: false,\n stamp: 0,\n }));\n }\n const slots = this.slots;\n const stamp = ++this.stamp;\n const offset = metrics.offset;\n for (let r = rowRange.start; r < rowRange.end; r++) {\n const slot = slots[r % poolSize];\n const row = rows[r];\n if (slot.row !== row || slot.rowIndex !== r) {\n slot.row = row;\n slot.rowIndex = r;\n slot.dataIndex = indices ? indices[r] : r;\n }\n const top = r * rowHeight - offset;\n if (slot.top !== top) {\n slot.top = top;\n slot.transform = `translateY(${top}px)`;\n }\n slot.version = s.rowVersion(row);\n slot.edit = edit !== null && edit.row === row ? edit : null;\n slot.focusField = this.focusRow === r ? this.focusField : null;\n slot.selected = selection.size > 0 && selection.has(keyOf(row));\n slot.selectable = checkSelectable ? s.isRowSelectable(row) : true;\n slot.active = r === activeRow;\n slot.columns = columns;\n slot.hidden = false;\n slot.stamp = stamp;\n }\n for (let k = 0; k < slots.length; k++) {\n const slot = slots[k];\n if (slot.stamp !== stamp) {\n // Keep the stale row (no re-render) and hide the slot.\n slot.hidden = true;\n slot.edit = null;\n slot.focusField = null;\n slot.selected = false;\n slot.active = false;\n if (slot.row === null && rows.length > 0) {\n slot.row = rows[0];\n slot.columns = columns;\n }\n }\n }\n\n this.win = {\n slots,\n columns,\n columnPool: this.columnPool,\n templatePool: this.templatePool,\n layout,\n rowRange,\n colRange,\n metrics,\n rowCount,\n columnCount: layout.columns.length,\n ariaColCount: layout.columns.length + layout.ariaColOffset + (layout.trailingWidth > 0 ? 1 : 0),\n rowHeight,\n headerHeight,\n filterRowHeight,\n headerRows: filterRowHeight > 0 ? 2 : 1,\n summaryHeight,\n summaryVisible,\n summarySticky,\n summaries,\n sortModel,\n filterModel,\n openFilterField,\n gridEditMode,\n renderNonce,\n canvasWidth: Math.max(layout.totalWidth, this.viewportWidth),\n canvasRowsHeight: metrics.canvasHeight,\n rowsViewportHeight,\n syncScroll: virt.syncScroll,\n stageWidth: this.viewportWidth,\n rowsTop: headerHeight + filterRowHeight + (addSession !== null && addSession.position === 'top' ? rowHeight : 0),\n rowsBoxHeight: summaryVisible && summarySticky ? Math.max(metrics.canvasHeight, rowsViewportHeight) : metrics.canvasHeight,\n ariaLabel: config.ariaLabel,\n selectionOn,\n multiselect: config.selection.mode === 'multiple',\n leadingWidth: layout.leadingWidth,\n trailingWidth: layout.trailingWidth,\n selectAllVisible,\n headerSelectionState,\n addSession,\n addTop: addSession !== null && addSession.position === 'top',\n addBottom: addSession !== null && addSession.position === 'bottom',\n addBottomOffset: summaryVisible && summarySticky ? summaryHeight : 0,\n };\n this.applyScroll();\n return this.win;\n }\n\n /**\n * syncScroll: moves the content to the current scroll position. The stage is sticky, so while the browser scrolls\n * on its own thread it stays in view with the content drawn for the last position (the rows track sticks under the\n * header the same way). The content only moves here: from the scroll handler, in the same task that draws the rows\n * and columns for the new position, so a frame never shows the new position without them. Not template bindings:\n * the offsets change on every scroll frame, also when the drawn window doesn't (no change detection then).\n *\n * The offsets are the ones the browser gives the sticky elements: the stage moves right by `scrollLeft` (the inner\n * block moves back by the same amount), the track moves down by `scrollTop`, up to the end of the rows area.\n */\n private applyScroll(): void {\n const win = this.win;\n const inner = this.innerRef?.nativeElement;\n const track = this.trackRef?.nativeElement;\n if (!win || !inner || !track) return;\n const left = win.syncScroll ? Math.max(0, this.scrollLeft) : 0;\n const top = win.syncScroll ? Math.min(Math.max(0, this.scrollTop), win.rowsBoxHeight) : 0;\n if (left !== this.appliedLeft) {\n this.appliedLeft = left;\n inner.style.left = left === 0 ? '' : `${-left}px`;\n }\n if (top !== this.appliedTop) {\n this.appliedTop = top;\n track.style.transform = top === 0 ? '' : `translateY(${-top}px)`;\n }\n this.placePins(inner, win, left);\n }\n\n /**\n * syncScroll: places the pinned regions (checkbox and action columns of the rows, header, filter and summary rows)\n * at the viewport edges. Without syncScroll they are sticky, but a sticky element in every row makes the browser\n * give every row its own layer: dozens of layers to update while scrolling. With syncScroll the grid moves the\n * content itself, so it places them too (`is-placed`, absolutely positioned): rows place theirs when they are drawn\n * (`GridStore.pinPlacement`), and this moves the ones already drawn, in the frame the content moves.\n */\n private placePins(inner: HTMLElement, win: RenderWindow<TRow>, left: number): void {\n const store = this.store;\n if (!win.syncScroll) {\n if (store.pinPlacement === null) return;\n store.pinPlacement = null;\n for (const pin of Array.from(inner.querySelectorAll<HTMLElement>('.infi-grid__pin.is-placed'))) {\n pin.classList.remove('is-placed');\n pin.style.left = '';\n }\n return;\n }\n const end = left + win.stageWidth - win.trailingWidth;\n const placement = store.pinPlacement;\n if (placement !== null && placement.start === left && placement.end === end) return;\n if (placement === null) store.pinPlacement = { start: left, end };\n else {\n placement.start = left;\n placement.end = end;\n }\n const startPx = `${left}px`;\n const endPx = `${end}px`;\n for (const pin of Array.from(inner.querySelectorAll<HTMLElement>('.infi-grid__pin'))) {\n if (!pin.classList.contains('is-placed')) pin.classList.add('is-placed');\n const value = pin.classList.contains('infi-grid__pin--end') ? endPx : startPx;\n if (pin.style.left !== value) pin.style.left = value;\n }\n }\n\n /**\n * Sizes the cell pools for the widest window the layout can produce, once per layout/viewport\n * width, so scrolling sideways never grows them (growing creates views, which makes Angular check\n * the whole application). Pools only grow; they are capped at the number of displayed columns.\n */\n private sizeColumnPools(layout: ColumnLayout<TRow>, buffer: number, virtualize: boolean): void {\n if (this.poolLayout === layout && this.poolWidth === this.viewportWidth) return;\n this.poolLayout = layout;\n this.poolWidth = this.viewportWidth;\n const count = layout.columns.length;\n if (!virtualize || this.viewportWidth <= 0) {\n if (!virtualize) this.columnPool = count;\n return;\n }\n const keyed = templateKeyFlags(layout.columns);\n const max = maxColumnWindow(layout.offsets, layout.totalWidth, this.viewportWidth, buffer, [\n layout.columns.map((lc) => lc.templateIndex >= 0),\n layout.columns.map((lc) => lc.headerTemplateIndex >= 0),\n layout.columns.map((lc) => lc.summaryTemplateIndex >= 0),\n ...keyed,\n ]);\n this.columnPool = Math.min(count, Math.max(this.columnPool, max.columns));\n this.templatePool = Math.max(this.templatePool, max.flagged[0], max.flagged[1], max.flagged[2]);\n // With templateKeys, a row's template cells take slots that last showed the same key (see the row component):\n // enough slots for the most columns of each key that can be in view, so every key keeps its own cells.\n if (keyed.length > 0) this.templatePool = Math.max(this.templatePool, max.flagged.slice(3).reduce((a, b) => a + b, 0));\n }\n\n // ----- ViewportHandle -----\n\n scrollToRow(rowIndex: number, position: 'auto' | 'start' | 'center' | 'end'): void {\n const el = this.scrollerRef?.nativeElement;\n const config = this.store.config();\n const rowCount = this.store.rowCount();\n if (!el || rowCount === 0) return;\n const index = Math.max(0, Math.min(rowCount - 1, Math.floor(rowIndex)));\n const rvh = this.win?.rowsViewportHeight ?? 0;\n const metrics = computeVerticalMetrics(this.scrollTop, rvh, rowCount, config.rowHeight);\n const target = alignedScrollTarget(\n index * config.rowHeight,\n config.rowHeight,\n rvh,\n metrics.virtualTop,\n metrics.totalHeight,\n position,\n );\n el.scrollTop = virtualToScrollTop(target, metrics);\n this.onScroll();\n }\n\n scrollToColumn(columnIndex: number, position: 'auto' | 'start' | 'center' | 'end'): void {\n const el = this.scrollerRef?.nativeElement;\n const layout = this.store.layout();\n const lc = layout.columns[columnIndex];\n if (!el || !lc) return;\n el.scrollLeft = this.alignColumn(layout, lc, position);\n this.onScroll();\n }\n\n /** Horizontal scroll position that shows a column next to (not under) the pinned regions. */\n private alignColumn(layout: ColumnLayout<TRow>, lc: LayoutColumn<TRow>, position: 'auto' | 'start' | 'center' | 'end'): number {\n const pinned = layout.leadingWidth + layout.trailingWidth;\n return alignedScrollTarget(\n lc.left - layout.leadingWidth,\n lc.width,\n Math.max(lc.width, this.viewportWidth - pinned),\n this.scrollLeft,\n layout.totalWidth - pinned,\n position,\n );\n }\n\n getVirtualizationState(): VirtualizationState {\n const win = this.win;\n const config = this.store.config();\n if (!win) {\n return {\n rowVirtualization: config.virtualization.rows,\n columnVirtualization: config.virtualization.columns,\n totalRows: this.store.rowCount(),\n totalColumns: this.store.layout().columns.length,\n firstVisibleRow: -1,\n lastVisibleRow: -1,\n firstRenderedRow: -1,\n lastRenderedRow: -1,\n firstVisibleColumn: -1,\n lastVisibleColumn: -1,\n firstRenderedColumn: -1,\n lastRenderedColumn: -1,\n renderedRowCount: 0,\n renderedColumnCount: 0,\n renderedCellCount: 0,\n scrollTop: 0,\n scrollLeft: 0,\n viewportWidth: 0,\n viewportHeight: 0,\n rowHeight: config.rowHeight,\n totalHeight: 0,\n totalWidth: 0,\n scrollScale: 1,\n };\n }\n const { rowRange, colRange } = win;\n const renderedRows = rowRange.end - rowRange.start;\n const renderedCols = colRange.end - colRange.start;\n const hasRows = win.rowCount > 0;\n const hasCols = win.columnCount > 0;\n return {\n rowVirtualization: config.virtualization.rows,\n columnVirtualization: config.virtualization.columns,\n totalRows: win.rowCount,\n totalColumns: win.columnCount,\n firstVisibleRow: hasRows ? rowRange.visibleStart : -1,\n lastVisibleRow: hasRows ? rowRange.visibleEnd - 1 : -1,\n firstRenderedRow: hasRows ? rowRange.start : -1,\n lastRenderedRow: hasRows ? rowRange.end - 1 : -1,\n firstVisibleColumn: hasCols ? colRange.visibleStart : -1,\n lastVisibleColumn: hasCols ? colRange.visibleEnd - 1 : -1,\n firstRenderedColumn: hasCols ? colRange.start : -1,\n lastRenderedColumn: hasCols ? colRange.end - 1 : -1,\n renderedRowCount: renderedRows,\n renderedColumnCount: renderedCols,\n renderedCellCount: renderedRows * renderedCols,\n scrollTop: this.scrollTop,\n scrollLeft: this.scrollLeft,\n viewportWidth: this.viewportWidth,\n viewportHeight: this.viewportHeight,\n rowHeight: win.rowHeight,\n totalHeight: win.metrics.totalHeight,\n totalWidth: win.layout.totalWidth,\n scrollScale: win.metrics.scale,\n };\n }\n\n focus(): void {\n this.scrollerRef?.nativeElement.focus({ preventScroll: true });\n }\n\n focusCell(rowIndex: number, field: string, source: GridCellSelectionSource = 'api'): void {\n this.setFocus(rowIndex, field, true, source);\n this.focus();\n }\n\n // ----- DOM wiring -----\n\n private attach(): void {\n if (this.destroyed) return;\n const el = this.scrollerRef.nativeElement;\n const rowsEl = this.rowsRef.nativeElement;\n this.zone.runOutsideAngular(() => {\n const listen = <K extends keyof HTMLElementEventMap>(\n target: HTMLElement,\n type: K,\n handler: (e: HTMLElementEventMap[K]) => void,\n options?: AddEventListenerOptions,\n ) => {\n target.addEventListener(type, handler, options);\n this.cleanup.push(() => target.removeEventListener(type, handler, options));\n };\n listen(el, 'scroll', () => this.onScroll(), { passive: true });\n listen(el, 'keydown', (e) => this.onKeydown(e));\n listen(rowsEl, 'click', (e) => this.onClick(e));\n // After the row handler: action buttons of rows, of the add row and of the header.\n listen(el, 'click', (e) => this.onActionClick(e));\n listen(rowsEl, 'dblclick', (e) => this.onDoubleClick(e));\n // Shift+click selects a range of rows, not text (with cell selection, only the checkboxes select rows).\n listen(rowsEl, 'mousedown', (e) => {\n const config = this.store.config();\n if (!e.shiftKey || config.selection.mode !== 'multiple') return;\n if (!config.cellSelection.enabled || (e.target instanceof Element && e.target.closest('.infi-grid__selector'))) e.preventDefault();\n });\n listen(rowsEl, 'contextmenu', (e) => this.onContextMenu(e));\n // Cells, headers and summary cells: hover events and tooltips.\n listen(el, 'pointermove', (e) => this.onPointerMove(e), { passive: true });\n listen(\n el,\n 'pointerleave',\n (e) => {\n this.setHover(null, e);\n this.tips.point(null);\n },\n { passive: true },\n );\n listen(el, 'pointerdown', () => this.tips.dismiss(), { passive: true });\n listen(el, 'focusin', (e) => this.onFocusIn(e));\n listen(el, 'focusout', () => this.tips.point(null));\n if (typeof ResizeObserver !== 'undefined') {\n this.resizeObserver = new ResizeObserver(() => this.measure());\n this.resizeObserver.observe(el);\n }\n });\n this.measure(true);\n }\n\n private measure(force = false): void {\n if (this.destroyed) return;\n const el = this.scrollerRef.nativeElement;\n const width = el.clientWidth;\n const height = el.clientHeight;\n if (!force && width === this.viewportWidth && height === this.viewportHeight) return;\n this.viewportWidth = width;\n this.viewportHeight = height;\n this.scrollTop = el.scrollTop;\n this.scrollLeft = el.scrollLeft;\n this.cdr.detectChanges();\n }\n\n /** Scroll handler (outside the zone). Checks only this component, and only if the window changed. */\n private onScroll(): void {\n if (this.destroyed) return;\n const el = this.scrollerRef.nativeElement;\n const top = el.scrollTop;\n const left = el.scrollLeft;\n if (top === this.scrollTop && left === this.scrollLeft) return;\n const horizontal = left !== this.scrollLeft;\n this.scrollTop = top;\n this.scrollLeft = left;\n if (horizontal && this.store.openFilterField() !== null) this.zone.run(() => this.store.closeFilterPopup());\n // Rows move under the pointer: end the hover and the tooltip; the next pointer move finds the new cell.\n if (this.hover) this.setHover(null, new Event('scroll'));\n this.tips.reset();\n // New rows or columns: draw them (renderWindow() also moves the content); otherwise only move the content.\n if (this.windowChanged()) this.cdr.detectChanges();\n else this.applyScroll();\n const sink = this.store.events;\n if (sink.listens?.('viewportChange')) {\n const state = this.getVirtualizationState();\n this.zone.run(() => sink.viewportChange?.({ state }));\n }\n }\n\n /** True when the new scroll position needs different rows/columns (or scaled positions). */\n private windowChanged(): boolean {\n const win = this.win;\n if (!win) return true;\n if (win.metrics.scale !== 1) return true;\n const config = this.store.config();\n const metrics = computeVerticalMetrics(this.scrollTop, win.rowsViewportHeight, win.rowCount, win.rowHeight);\n const rows = computeRowRange(metrics, win.rowsViewportHeight, win.rowCount, win.rowHeight, config.virtualization.rowBuffer, config.virtualization.rows);\n if (rows.start !== win.rowRange.start || rows.end !== win.rowRange.end || rows.visibleStart !== win.rowRange.visibleStart || rows.visibleEnd !== win.rowRange.visibleEnd) return true;\n const cols = computeColumnRange(this.scrollLeft, this.viewportWidth, win.layout.offsets, config.virtualization.columnBuffer, config.virtualization.columns);\n return cols.start !== win.colRange.start || cols.end !== win.colRange.end || cols.visibleStart !== win.colRange.visibleStart || cols.visibleEnd !== win.colRange.visibleEnd;\n }\n\n /** The row (and cell) under a pointer event, from the DOM attributes the viewport renders. */\n private hitRow(event: Event): RowHit | null {\n const target = event.target;\n if (!(target instanceof Element)) return null;\n const rowEl = target.closest<HTMLElement>('[data-row-index]');\n if (!rowEl || !this.rowsRef.nativeElement.contains(rowEl)) return null;\n const rowIndex = Number(rowEl.dataset['rowIndex']);\n if (!Number.isInteger(rowIndex) || rowIndex < 0) return null;\n const field = target.closest<HTMLElement>('.infi-grid__cell')?.dataset['field'] || null;\n return { rowIndex, field, selector: target.closest('.infi-grid__selector') !== null };\n }\n\n private dataIndexAt(rowIndex: number): number {\n const indices = this.store.viewIndices();\n return indices === null ? rowIndex : (indices[rowIndex] ?? -1);\n }\n\n private cellEvent(row: TRow, rowIndex: number, column: ResolvedColumn<TRow>, event: Event): GridCellEvent<TRow> {\n const value = column.getValue(row);\n return {\n row,\n key: this.store.keyOf()(row),\n rowIndex,\n dataIndex: this.dataIndexAt(rowIndex),\n field: column.field,\n column,\n value,\n formattedValue: column.formatValue(value, row),\n event,\n cancel: false,\n };\n }\n\n /**\n * Emits the click (or double-click) events of a row. They always fire; a handler that sets `cancel`\n * stops the grid's built-in reaction. Returns true when a handler cancelled.\n */\n private emitClickEvents(row: TRow, hit: RowHit, event: MouseEvent, kind: 'click' | 'dblclick'): boolean {\n const store = this.store;\n const sink = store.events;\n let cancelled = false;\n const column = hit.field ? store.columnsByField().get(hit.field) : undefined;\n const cellName = kind === 'click' ? 'cellClick' : 'cellDoubleClick';\n if (column && sink.listens?.(cellName)) {\n const cellEvent = this.cellEvent(row, hit.rowIndex, column, event);\n this.zone.run(() => (kind === 'click' ? sink.cellClick : sink.cellDoubleClick)?.(cellEvent));\n cancelled = cellEvent.cancel;\n }\n const rowName = kind === 'click' ? 'rowClick' : 'rowDoubleClick';\n if (sink.listens?.(rowName)) {\n const rowEvent: GridRowEvent<TRow> = {\n row,\n key: store.keyOf()(row),\n rowIndex: hit.rowIndex,\n dataIndex: this.dataIndexAt(hit.rowIndex),\n field: hit.field,\n event,\n cancel: false,\n };\n this.zone.run(() => (kind === 'click' ? sink.rowClick : sink.rowDoubleClick)?.(rowEvent));\n cancelled = cancelled || rowEvent.cancel;\n }\n return cancelled;\n }\n\n /** Click events waiting for a possible double click (`events.clickMode: 'waitForDoubleClick'`). */\n private pendingClick: ReturnType<typeof setTimeout> | null = null;\n\n private clearPendingClick(): void {\n if (this.pendingClick !== null) clearTimeout(this.pendingClick);\n this.pendingClick = null;\n }\n\n private onClick(event: MouseEvent): void {\n // The action column handles its own clicks (onActionClick); they never select or edit the row.\n if (event.target instanceof Element && event.target.closest('.infi-grid__actions')) return;\n const hit = this.hitRow(event);\n if (!hit) return;\n const row = this.store.viewRows()[hit.rowIndex];\n if (row === undefined) return;\n if (!hit.selector) {\n this.onRowClick(event, hit, row);\n return;\n }\n // The checkbox column. The browser has already toggled the box. The click isn't cancelled: with zone.js, Angular\n // draws the new state during the click, and a cancelled click makes the browser restore the old state afterwards.\n // Instead the box is set from the selection when the click is handled, also when nothing changed.\n try {\n this.onRowClick(event, hit, row);\n } finally {\n this.syncSelectorBox(event.target, row);\n }\n }\n\n /** Makes a row's checkbox show that row's selection state. */\n private syncSelectorBox(target: EventTarget | null, row: TRow): void {\n if (!(target instanceof Element)) return;\n const box = target.closest('.infi-grid__selector')?.querySelector<HTMLInputElement>('.infi-grid__selector-box');\n if (box) box.checked = this.store.selection().has(this.store.keyOf()(row));\n }\n\n private onRowClick(event: MouseEvent, hit: RowHit, row: TRow): void {\n const store = this.store;\n const config = store.config();\n // With cell selection, the focused cell is the selected cell: it moves after the click events (they can cancel it).\n const cells = config.cellSelection.enabled;\n const target = event.target as Element;\n const insideEditor = target.closest('.infi-grid__editor, .infi-grid__cell.is-editing') !== null;\n if (!cells && hit.field && !insideEditor && (hit.rowIndex !== this.focusRow || hit.field !== this.focusField)) {\n this.setFocus(hit.rowIndex, hit.field, false);\n }\n // The second click of a double click does nothing: the dblclick event follows.\n if (event.detail >= 2) return;\n let cancelled = false;\n if (config.events.clickMode === 'immediate') {\n cancelled = this.emitClickEvents(row, hit, event, 'click');\n } else {\n this.clearPendingClick();\n this.pendingClick = setTimeout(() => {\n this.pendingClick = null;\n this.emitClickEvents(row, hit, event, 'click');\n }, config.events.doubleClickDelay);\n }\n if (cancelled) return;\n if (cells && hit.field && !insideEditor) this.setFocus(hit.rowIndex, hit.field, false, 'click', event);\n const interactive = !hit.selector && target.closest(INTERACTIVE) !== null;\n // Clicks select rows through the checkbox, and through cells and rows only without cell selection.\n if (hit.selector || (!cells && !insideEditor && !interactive && config.selection.selectOnClick)) {\n const gesture = hit.selector ? 'checkbox' : 'click';\n const source = hit.selector ? 'checkbox' : hit.field ? 'cell' : 'row';\n const plan = store.planSelection(hit.rowIndex, gesture, { ctrl: event.ctrlKey || event.metaKey, shift: event.shiftKey }, source);\n if (plan) this.zone.run(() => store.runSelectionPlan(plan, source, hit.rowIndex, event));\n }\n if (hit.field && !hit.selector && !insideEditor && config.editing.trigger === 'click') {\n const field = hit.field;\n this.zone.run(() => store.startEdit(hit.rowIndex, field));\n }\n }\n\n /** Buttons of the action column: edit, delete, save and cancel on rows (and the add row), add in the header. */\n private onActionClick(event: MouseEvent): void {\n const target = event.target;\n if (!(target instanceof Element)) return;\n const button = target.closest<HTMLButtonElement>('.infi-grid__actions [data-action]');\n if (!button || button.disabled || !this.scrollerRef.nativeElement.contains(button)) return;\n const store = this.store;\n const action = button.dataset['action'];\n const rowEl = button.closest<HTMLElement>('.infi-grid__row');\n const addRow = rowEl?.classList.contains('infi-grid__row--add') === true;\n const rowIndex = rowEl && !addRow ? Number(rowEl.dataset['rowIndex'] ?? -1) : -1;\n const row = rowIndex >= 0 ? store.viewRows()[rowIndex] : undefined;\n this.zone.run(() => {\n switch (action) {\n case 'add':\n store.beginAddRow();\n break;\n case 'edit':\n if (row !== undefined) store.startEdit(rowIndex);\n break;\n case 'delete':\n if (row !== undefined) void store.requestDelete([store.keyOf()(row)], 'ui');\n break;\n case 'save':\n if (store.commitEdit()) this.focus();\n break;\n case 'cancel':\n store.cancelEdit();\n this.focus();\n break;\n case 'restore':\n if (row !== undefined) store.restoreRows([store.keyOf()(row)]);\n break;\n }\n });\n }\n\n private onContextMenu(event: MouseEvent): void {\n const hit = this.hitRow(event);\n if (!hit || !hit.field) return;\n const store = this.store;\n if (store.config().events.preventContextMenu) event.preventDefault();\n const row = store.viewRows()[hit.rowIndex];\n const column = store.columnsByField().get(hit.field);\n if (row === undefined || !column || !store.events.listens?.('cellContextMenu')) return;\n const cellEvent = this.cellEvent(row, hit.rowIndex, column, event);\n this.zone.run(() => store.events.cellContextMenu?.(cellEvent));\n }\n\n // ----- hover tracking (cellMouseEnter / cellMouseLeave, tooltips) -----\n\n /** The hovered cell, identified by row key and field (not by element: elements are recycled). */\n private hover: { key: GridRowKey; field: string; row: TRow; rowIndex: number } | null = null;\n private hoverFrame = 0;\n private hoverEvent: PointerEvent | null = null;\n\n private listensToHover(): boolean {\n const sink = this.store.events;\n return !!(sink.listens?.('cellMouseEnter') || sink.listens?.('cellMouseLeave'));\n }\n\n /** At most one hit test per animation frame, however fast the pointer moves. */\n private onPointerMove(event: PointerEvent): void {\n if (event.pointerType === 'touch') return;\n const tooltips = this.store.config().tooltips.enabled;\n const events = this.listensToHover();\n if (!tooltips && !events) return;\n this.hoverEvent = event;\n if (this.hoverFrame) return;\n this.hoverFrame = requestAnimationFrame(() => {\n this.hoverFrame = 0;\n const e = this.hoverEvent;\n this.hoverEvent = null;\n if (!e || this.destroyed) return;\n const hit = this.hitRow(e);\n const row = hit ? this.store.viewRows()[hit.rowIndex] : undefined;\n const cell =\n hit && hit.field && row !== undefined ? { key: this.store.keyOf()(row), field: hit.field, row, rowIndex: hit.rowIndex } : null;\n const current = this.hover;\n if (!(cell && current && current.key === cell.key && current.field === cell.field)) this.setHover(cell, e);\n if (tooltips) this.tips.point(this.tooltipTarget(e.target, cell));\n });\n }\n\n /** The cell, header or summary cell under the pointer that can have a tooltip. */\n private tooltipTarget(target: EventTarget | null, cell: { key: GridRowKey; field: string; row: TRow; rowIndex: number } | null): TooltipTarget | null {\n if (!(target instanceof Element)) return null;\n if (cell) {\n const element = target.closest<HTMLElement>('.infi-grid__cell');\n return element ? { kind: 'cell', field: cell.field, element, key: cell.key, row: cell.row, rowIndex: cell.rowIndex } : null;\n }\n const header = target.closest<HTMLElement>('.infi-grid__header-cell');\n if (header) {\n const field = header.dataset['field'];\n return field && !target.closest('.infi-grid__filter-btn, .infi-grid__resize-handle') ? { kind: 'header', field, element: header } : null;\n }\n const summary = target.closest<HTMLElement>('.infi-grid__summary-cell');\n const field = summary?.dataset['field'];\n return summary && field ? { kind: 'summary', field, element: summary } : null;\n }\n\n /** Keyboard focus on a header's filter button shows the header tooltip. */\n private onFocusIn(event: FocusEvent): void {\n if (!this.store.config().tooltips.enabled || !(event.target instanceof Element)) return;\n const header = event.target.closest<HTMLElement>('.infi-grid__header-cell');\n const field = header?.dataset['field'];\n if (header && field && event.target.closest('.infi-grid__filter-btn')) this.tips.point({ kind: 'header', field, element: header });\n }\n\n /** Keyboard focus moved to a cell: its tooltip shows after the delay, as on hover. */\n private focusTooltip(rowIndex: number, field: string): void {\n if (!this.store.config().tooltips.enabled) return;\n const row = this.store.viewRows()[rowIndex];\n const element = this.rowsRef.nativeElement.querySelector<HTMLElement>(\n `.infi-grid__row[data-row-index=\"${rowIndex}\"] .infi-grid__cell[data-field=\"${CSS.escape(field)}\"]`,\n );\n if (row === undefined || !element) return;\n this.tips.point({ kind: 'cell', field, element, key: this.store.keyOf()(row), row, rowIndex });\n }\n\n /** Changes the hovered cell, emitting leave for the old one and enter for the new one. */\n private setHover(next: { key: GridRowKey; field: string; row: TRow; rowIndex: number } | null, event: Event): void {\n const previous = this.hover;\n if (previous === next || (!previous && !next)) return;\n this.hover = next;\n const store = this.store;\n const sink = store.events;\n const columns = store.columnsByField();\n if (previous && sink.listens?.('cellMouseLeave')) {\n const column = columns.get(previous.field);\n if (column) {\n const leave = this.cellEvent(previous.row, previous.rowIndex, column, event);\n this.zone.run(() => sink.cellMouseLeave?.(leave));\n }\n }\n if (next && sink.listens?.('cellMouseEnter')) {\n const column = columns.get(next.field);\n if (column) {\n const enter = this.cellEvent(next.row, next.rowIndex, column, event);\n this.zone.run(() => sink.cellMouseEnter?.(enter));\n }\n }\n }\n\n private onDoubleClick(event: MouseEvent): void {\n this.clearPendingClick();\n const hit = this.hitRow(event);\n if (!hit || hit.selector) return;\n const store = this.store;\n const row = store.viewRows()[hit.rowIndex];\n if (row === undefined) return;\n const cancelled = this.emitClickEvents(row, hit, event, 'dblclick');\n const insideEditor = event.target instanceof Element && event.target.closest('.infi-grid__editor, .infi-grid__cell.is-editing') !== null;\n if (!cancelled && hit.field && !insideEditor && store.config().editing.trigger === 'dblclick') {\n const field = hit.field;\n this.zone.run(() => store.startEdit(hit.rowIndex, field));\n }\n }\n\n private onKeydown(event: KeyboardEvent): void {\n const store = this.store;\n const config = store.config();\n // Any key hides a tooltip (Escape included).\n this.tips.dismiss();\n if (!config.keyboardNavigation || event.defaultPrevented) return;\n const target = event.target as HTMLElement;\n if (target !== this.scrollerRef.nativeElement && target.closest('input, select, textarea, button, [contenteditable=\"true\"]')) return;\n const rowCount = store.rowCount();\n const columns = store.layout().columns;\n if (rowCount === 0 || columns.length === 0) return;\n // Batch mode: Ctrl/Cmd+Z undoes, Ctrl/Cmd+Shift+Z or Ctrl+Y redoes.\n const mod = event.ctrlKey || event.metaKey;\n const letter = event.key.toLowerCase();\n if (config.editing.batch && mod && !event.altKey && (letter === 'z' || letter === 'y')) {\n event.preventDefault();\n const redo = letter === 'y' || event.shiftKey;\n this.zone.run(() => (redo ? store.redo() : store.undo()));\n return;\n }\n const focus = this.focusPosition();\n if (event.key === 'Delete' && config.editing.allowDelete && store.editSession() === null) {\n // The selected rows, or the focused row when nothing is selected (with the configured confirmation).\n const selected = store.selection();\n const focused = focus.row >= 0 ? store.viewRows()[focus.row] : undefined;\n const keys = selected.size > 0 ? [...selected.keys()] : focused !== undefined ? [store.keyOf()(focused)] : [];\n if (keys.length > 0) {\n event.preventDefault();\n this.zone.run(() => void store.requestDelete(keys, 'keyboard'));\n }\n return;\n }\n const selection = config.selection;\n const selectionKeys = selection.keyboard && selection.mode !== 'none';\n if (selectionKeys && selection.mode === 'multiple' && (event.ctrlKey || event.metaKey) && event.key.toLowerCase() === 'a') {\n event.preventDefault();\n this.zone.run(() => store.selectAll('keyboard'));\n return;\n }\n let r = focus.row;\n let c = focus.field === null ? -1 : columns.findIndex((lc) => lc.key === focus.field);\n if (r < 0 || r >= rowCount || c < 0) {\n if (!['ArrowDown', 'ArrowUp', 'ArrowLeft', 'ArrowRight', 'Home', 'End', 'PageDown', 'PageUp'].includes(event.key)) return;\n event.preventDefault();\n const start = Math.min(rowCount - 1, Math.max(0, this.win?.rowRange.visibleStart ?? 0));\n this.setFocus(start, columns[Math.min(columns.length - 1, Math.max(0, this.win?.colRange.visibleStart ?? 0))].key, true, 'keyboard', event);\n return;\n }\n if (selectionKeys && event.key === ' ' && !event.ctrlKey && !event.metaKey && !event.altKey) {\n event.preventDefault();\n const plan = store.planSelection(r, 'toggle', { ctrl: false, shift: false }, 'keyboard');\n if (plan) this.zone.run(() => store.runSelectionPlan(plan, 'keyboard', r, event));\n return;\n }\n const fromRow = r;\n const page = Math.max(1, Math.floor((this.win?.rowsViewportHeight ?? config.rowHeight) / config.rowHeight) - 1);\n switch (event.key) {\n case 'ArrowDown':\n r++;\n break;\n case 'ArrowUp':\n r--;\n break;\n case 'ArrowRight':\n c++;\n break;\n case 'ArrowLeft':\n c--;\n break;\n case 'PageDown':\n r += page;\n break;\n case 'PageUp':\n r -= page;\n break;\n case 'Home':\n if (event.ctrlKey || event.metaKey) r = 0;\n c = 0;\n break;\n case 'End':\n if (event.ctrlKey || event.metaKey) r = rowCount - 1;\n c = columns.length - 1;\n break;\n case 'Enter':\n case 'F2': {\n event.preventDefault();\n const field = columns[c].key;\n this.zone.run(() => {\n if (store.gridEditMode()) this.focusEditorAt(r, field);\n else store.startEdit(r, field);\n });\n return;\n }\n case 'Escape':\n if (store.editSession()) this.zone.run(() => store.cancelEdit());\n return;\n default:\n return;\n }\n event.preventDefault();\n r = Math.max(0, Math.min(rowCount - 1, r));\n c = Math.max(0, Math.min(columns.length - 1, c));\n this.setFocus(r, columns[c].key, true, 'keyboard', event);\n this.focusTooltip(r, columns[c].key);\n if (selectionKeys && event.shiftKey && r !== fromRow && selection.mode === 'multiple') {\n const to = r;\n this.zone.run(() => store.extendSelectionTo(to, fromRow));\n }\n }\n\n private focusEditorAt(rowIndex: number, field: string): void {\n const rowEl = this.rowsRef.nativeElement.querySelector(`[data-row-index=\"${rowIndex}\"]`);\n const input = rowEl?.querySelector<HTMLElement>(`.infi-grid__cell[data-field=\"${CSS.escape(field)}\"] input, .infi-grid__cell[data-field=\"${CSS.escape(field)}\"] select`);\n input?.focus();\n }\n\n /** The focused cell. With cell selection it is the selected cell (by key, so it is right also before a re-render). */\n private focusPosition(): { row: number; field: string | null } {\n const store = this.store;\n if (!store.config().cellSelection.enabled) return { row: this.focusRow, field: this.focusField };\n const cell = store.selectedCell();\n return cell === null ? { row: -1, field: null } : { row: store.selectedCellIndex(), field: cell.field };\n }\n\n /** Moves the focus to a cell; with cell selection, that cell becomes the selected cell (`source` and `event` say why). */\n private setFocus(rowIndex: number, field: string, scrollIntoView: boolean, source: GridCellSelectionSource = 'api', event: Event | null = null): void {\n const store = this.store;\n if (store.config().cellSelection.enabled) {\n const row = store.viewRows()[rowIndex];\n if (row !== undefined) store.setSelectedCell({ key: store.keyOf()(row), field, rowIndex }, source, event);\n }\n this.focusRow = rowIndex;\n this.focusField = field;\n if (scrollIntoView) {\n const el = this.scrollerRef.nativeElement;\n const config = this.store.config();\n const rowCount = this.store.rowCount();\n const rvh = this.win?.rowsViewportHeight ?? 0;\n const metrics = computeVerticalMetrics(this.scrollTop, rvh, rowCount, config.rowHeight);\n const targetTop = alignedScrollTarget(rowIndex * config.rowHeight, config.rowHeight, rvh, metrics.virtualTop, metrics.totalHeight, 'auto');\n const layout = this.store.layout();\n const lc = layout.byField.get(field);\n const targetLeft = lc ? this.alignColumn(layout, lc, 'auto') : this.scrollLeft;\n if (targetTop !== metrics.virtualTop) el.scrollTop = virtualToScrollTop(targetTop, metrics);\n if (targetLeft !== this.scrollLeft) el.scrollLeft = targetLeft;\n this.scrollTop = el.scrollTop;\n this.scrollLeft = el.scrollLeft;\n }\n this.cdr.detectChanges();\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n EventEmitter,\n NgZone,\n OnChanges,\n OnInit,\n Output,\n SimpleChanges,\n ViewChild,\n ViewEncapsulation,\n afterNextRender,\n computed,\n contentChildren,\n inject,\n input,\n} from '@angular/core';\nimport type { GridApi } from '../models/api.types';\nimport type { ColumnConfig } from '../models/column.types';\nimport type { GridConfig } from '../models/config.types';\nimport type {\n GridChangeSet,\n GridPendingChangeEvent,\n GridRowAddedEvent,\n GridRowAddingEvent,\n GridRowDeletedEvent,\n GridRowDeletingEvent,\n GridRowUpdatedEvent,\n GridRowUpdatingEvent,\n GridSaveFailedEvent,\n} from '../models/crud.types';\nimport type { GridDataRefreshEvent, GridLoadingChangeEvent } from '../models/data.types';\nimport type {\n GridCellSelectionChangeEvent,\n GridRowSelectionEvent,\n GridSelectionChangeEvent,\n GridSelectionClearedEvent,\n GridSelectionClickEvent,\n} from '../models/selection.types';\nimport type {\n GridCellEvent,\n GridCellValueChangeEvent,\n GridColumnResizeEvent,\n GridEditEvent,\n GridErrorEvent,\n GridFilterChangeEvent,\n GridHeaderClickEvent,\n GridReadyEvent,\n GridRowEvent,\n GridSortChangeEvent,\n GridViewportChangeEvent,\n} from '../models/events.types';\nimport type {\n GridDeleteConfirmContext,\n GridEmptyContext,\n GridEmptyReason,\n GridErrorContext,\n GridLoadingContext,\n GridTemplate,\n} from '../models/template.types';\nimport { buildTemplateGroup, type TemplateRegistry } from '../core/template-registry';\nimport {\n GridCellTemplateDirective,\n GridCellTooltipTemplateDirective,\n GridDeleteConfirmTemplateDirective,\n GridEditTemplateDirective,\n GridEmptyTemplateDirective,\n GridErrorTemplateDirective,\n GridHeaderTemplateDirective,\n GridHeaderTooltipTemplateDirective,\n GridLoadingTemplateDirective,\n GridSummaryTemplateDirective,\n} from '../directives/template.directives';\nimport { GridOutletDirective } from '../directives/outlet.directive';\nimport { GridFilterPopupService } from '../state/filter-popup.service';\nimport { GridTooltipService } from '../state/tooltip.service';\nimport { GridStore, type GridListenedEvent } from '../state/grid-store';\nimport { GridViewportComponent } from './viewport.component';\n\ninterface OverlayState<C> {\n template: GridTemplate<C> | null;\n context: C;\n}\n\ntype FieldTemplateDirective = { templateRef: GridTemplate<any>; field: () => string | undefined; type: () => any };\n\nfunction toGroup(directives: readonly FieldTemplateDirective[]) {\n return buildTemplateGroup(directives.map((d) => ({ template: d.templateRef, field: d.field() || undefined, type: d.type() })));\n}\n\nfunction errorMessage(error: unknown, fallback: string): string {\n if (typeof error === 'string' && error.trim()) return error;\n if (error instanceof Error && error.message) return error.message;\n if (error && typeof error === 'object' && typeof (error as { message?: unknown }).message === 'string') {\n return (error as { message: string }).message || fallback;\n }\n return fallback;\n}\n\n/**\n * Every Grid API method is also available on the component instance, so a parent can call\n * `@ViewChild(InfiGridComponent) grid; grid.selectRowByKey(1)` as well as `grid.api.selectRowByKey(1)`.\n */\nexport interface InfiGridComponent<TRow = any> extends GridApi<TRow> {}\n\n/**\n * `<infi-grid>`: virtualized data grid with Excel-style filtering, multi-sort, editing,\n * summaries and templates.\n *\n * ```html\n * <infi-grid [data]=\"rows\" [columns]=\"columns\" [config]=\"config\" (gridReady)=\"api = $event.api\" />\n * ```\n */\n@Component({\n selector: 'infi-grid',\n standalone: true,\n imports: [GridViewportComponent, GridOutletDirective],\n providers: [GridStore, GridFilterPopupService, GridTooltipService],\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n styleUrl: './grid.component.css',\n host: {\n '[class]': 'hostClass()',\n '[style.--infi-grid-row-height.px]': 'store.config().rowHeight',\n '[style.--infi-grid-header-height.px]': 'headerBlockHeight()',\n '[style.--infi-grid-summary-height.px]': 'overlayBottom()',\n '[style.--infi-grid-toolbar-height.px]': 'batchBar() ? 40 : 0',\n '[attr.aria-busy]': 'loadingOverlay() ? \"true\" : null',\n },\n template: `\n <infi-grid-viewport />\n @if (errorOverlay(); as error) {\n <div class=\"infi-grid__overlay infi-grid__overlay--error\" role=\"alert\">\n @if (error.template) {\n <ng-container [infiGridOutlet]=\"error.template\" [infiGridOutletContext]=\"error.context\" />\n } @else {\n <div class=\"infi-grid__state\">\n <svg class=\"infi-grid__state-icon\" viewBox=\"0 0 24 24\" width=\"28\" height=\"28\" aria-hidden=\"true\">\n <circle cx=\"12\" cy=\"12\" r=\"10\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" />\n <path d=\"M12 7v6M12 16.5v.5\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" />\n </svg>\n <div class=\"infi-grid__state-text\">{{ error.context.message }}</div>\n </div>\n }\n </div>\n }\n @if (emptyOverlay(); as empty) {\n <div class=\"infi-grid__overlay infi-grid__overlay--empty\" role=\"status\">\n @if (empty.template) {\n <ng-container [infiGridOutlet]=\"empty.template\" [infiGridOutletContext]=\"empty.context\" />\n } @else {\n <div class=\"infi-grid__state\">\n <div class=\"infi-grid__state-text\">{{ empty.context.message }}</div>\n @if (empty.context.reason === 'noResults') {\n <button type=\"button\" class=\"infi-grid__state-action\" (click)=\"empty.context.clearFilters()\">\n {{ store.config().text.clear }}\n </button>\n }\n </div>\n }\n </div>\n }\n @if (deleteConfirm(); as confirm) {\n <div #confirmOverlay class=\"infi-grid__overlay infi-grid__overlay--confirm\" (keydown)=\"onConfirmKeydown($event, confirm.context)\">\n @if (confirm.template) {\n <ng-container [infiGridOutlet]=\"confirm.template\" [infiGridOutletContext]=\"confirm.context\" />\n } @else {\n <div class=\"infi-grid__dialog\" role=\"alertdialog\" aria-modal=\"true\" [attr.aria-label]=\"confirm.context.message\">\n <div class=\"infi-grid__dialog-text\">{{ confirm.context.message }}</div>\n <div class=\"infi-grid__dialog-actions\">\n <button type=\"button\" class=\"infi-grid__dialog-btn\" (click)=\"confirm.context.cancel()\">\n {{ store.config().text.cancel }}\n </button>\n <button type=\"button\" class=\"infi-grid__dialog-btn infi-grid__dialog-btn--danger\" (click)=\"confirm.context.confirm()\">\n {{ store.config().text.delete }}\n </button>\n </div>\n </div>\n }\n </div>\n }\n @if (batchBar(); as bar) {\n <div class=\"infi-grid__batchbar\" role=\"toolbar\" [attr.aria-label]=\"bar.message\">\n <span class=\"infi-grid__batchbar-status\" [class.is-error]=\"bar.failed\" role=\"status\" aria-live=\"polite\">{{ bar.message }}</span>\n <button type=\"button\" class=\"infi-grid__batchbar-btn\" [disabled]=\"!bar.canUndo\" (click)=\"api.undo()\">{{ bar.text.undo }}</button>\n <button type=\"button\" class=\"infi-grid__batchbar-btn\" [disabled]=\"!bar.canRedo\" (click)=\"api.redo()\">{{ bar.text.redo }}</button>\n <button type=\"button\" class=\"infi-grid__batchbar-btn\" [disabled]=\"bar.saving || !bar.hasChanges\" (click)=\"api.cancelChanges()\">\n {{ bar.text.discardChanges }}\n </button>\n <button\n type=\"button\"\n class=\"infi-grid__batchbar-btn infi-grid__batchbar-btn--primary\"\n [disabled]=\"bar.saving || !bar.hasChanges\"\n (click)=\"api.saveChanges()\"\n >\n {{ bar.saving ? bar.text.saving : bar.text.saveChanges }}\n </button>\n </div>\n }\n @if (loadingOverlay(); as loading) {\n <div\n class=\"infi-grid__overlay infi-grid__overlay--loading\"\n [class.is-blocking]=\"blockWhileLoading()\"\n role=\"status\"\n aria-live=\"polite\"\n >\n @if (loading.template) {\n <ng-container [infiGridOutlet]=\"loading.template\" [infiGridOutletContext]=\"loading.context\" />\n } @else {\n <div class=\"infi-grid__state\">\n <span class=\"infi-grid__spinner\" aria-hidden=\"true\"></span>\n <div class=\"infi-grid__state-text\">{{ loading.context.message }}</div>\n </div>\n }\n </div>\n }\n `,\n})\nexport class InfiGridComponent<TRow = any> implements OnInit, OnChanges {\n /** The rows to show. */\n readonly data = input<readonly TRow[] | null | undefined>(null);\n /** Column definitions. */\n readonly columns = input<readonly ColumnConfig<TRow>[] | null | undefined>(null);\n /** Grid configuration and feature flags. */\n readonly config = input<GridConfig<TRow> | null | undefined>(null);\n /** Shows the loading state. */\n readonly loading = input<boolean>(false);\n /** Shows the error state when set (any value: string, Error, HTTP error…). */\n readonly error = input<unknown>(null);\n\n @Output() readonly gridReady = new EventEmitter<GridReadyEvent<TRow>>();\n @Output() readonly sortChange = new EventEmitter<GridSortChangeEvent>();\n @Output() readonly filterChange = new EventEmitter<GridFilterChangeEvent>();\n @Output() readonly cellValueChange = new EventEmitter<GridCellValueChangeEvent<TRow>>();\n @Output() readonly editStart = new EventEmitter<GridEditEvent<TRow>>();\n @Output() readonly editCommit = new EventEmitter<GridEditEvent<TRow>>();\n @Output() readonly editCancel = new EventEmitter<GridEditEvent<TRow>>();\n @Output() readonly cellClick = new EventEmitter<GridCellEvent<TRow>>();\n @Output() readonly cellDoubleClick = new EventEmitter<GridCellEvent<TRow>>();\n @Output() readonly rowClick = new EventEmitter<GridRowEvent<TRow>>();\n @Output() readonly rowDoubleClick = new EventEmitter<GridRowEvent<TRow>>();\n /** A click on a header's label or filter button (before sorting / opening the filter; cancelable). */\n @Output() readonly headerClick = new EventEmitter<GridHeaderClickEvent<TRow>>();\n /** Right click on a cell (`events.preventContextMenu` suppresses the browser menu). */\n @Output() readonly cellContextMenu = new EventEmitter<GridCellEvent<TRow>>();\n /** The pointer entered a cell (identified by row key and field; not fired while scrolling). */\n @Output() readonly cellMouseEnter = new EventEmitter<GridCellEvent<TRow>>();\n /** The pointer left a cell. */\n @Output() readonly cellMouseLeave = new EventEmitter<GridCellEvent<TRow>>();\n @Output() readonly columnResize = new EventEmitter<GridColumnResizeEvent<TRow>>();\n /** Emits while scrolling (only computed when you listen to it). */\n @Output() readonly viewportChange = new EventEmitter<GridViewportChangeEvent>();\n /** Errors the grid caught (the grid never logs to the console). */\n @Output() readonly gridError = new EventEmitter<GridErrorEvent>();\n /** The effective loading state changed (from `[loading]` or `setLoading()`). */\n @Output() readonly loadingChange = new EventEmitter<GridLoadingChangeEvent>();\n /** The data was replaced or refreshed and the grid state was reconciled with it. */\n @Output() readonly dataRefresh = new EventEmitter<GridDataRefreshEvent>();\n /** The selection changed (once per operation, with the added/removed rows and the old/new selection). */\n @Output() readonly selectionChange = new EventEmitter<GridSelectionChangeEvent<TRow>>();\n /** Rows were selected by one operation. */\n @Output() readonly rowSelected = new EventEmitter<GridRowSelectionEvent<TRow>>();\n /** Rows were deselected by one operation. */\n @Output() readonly rowDeselected = new EventEmitter<GridRowSelectionEvent<TRow>>();\n /** The selection became empty. */\n @Output() readonly selectionCleared = new EventEmitter<GridSelectionClearedEvent<TRow>>();\n /** A click (or key) is about to change the selection; set `cancel` to prevent it. */\n @Output() readonly selectionClick = new EventEmitter<GridSelectionClickEvent<TRow>>();\n /** The selected cell changed (`cellSelection.enabled`): click, keyboard, API, or its row or column went away. */\n @Output() readonly cellSelectionChange = new EventEmitter<GridCellSelectionChangeEvent<TRow>>();\n /** A row is about to be added (after validation); set `cancel` to prevent it. */\n @Output() readonly rowAdding = new EventEmitter<GridRowAddingEvent<TRow>>();\n /** A row was added (inline add row or `addRow()`). */\n @Output() readonly rowAdded = new EventEmitter<GridRowAddedEvent<TRow>>();\n /** A row is about to change (inline edit or `updateRow()`); set `cancel` to prevent it. */\n @Output() readonly rowUpdating = new EventEmitter<GridRowUpdatingEvent<TRow>>();\n /** A row changed, with its old values, new values and a copy of the old row. */\n @Output() readonly rowUpdated = new EventEmitter<GridRowUpdatedEvent<TRow>>();\n /** Rows are about to be deleted (after the confirmation); set `cancel` to prevent it. */\n @Output() readonly rowDeleting = new EventEmitter<GridRowDeletingEvent<TRow>>();\n /** Rows were deleted (once per operation). */\n @Output() readonly rowDeleted = new EventEmitter<GridRowDeletedEvent<TRow>>();\n /**\n * The new data array after an add or delete (the bound array is never changed). Bind `[(data)]=\"rows\"`\n * to keep your array in sync.\n */\n @Output() readonly dataChange = new EventEmitter<readonly TRow[]>();\n /** Batch mode: the pending changes were saved (and applied to the data). */\n @Output() readonly changesSaved = new EventEmitter<GridChangeSet<TRow>>();\n /** Batch mode: the pending changes were discarded. */\n @Output() readonly changesCancelled = new EventEmitter<GridChangeSet<TRow>>();\n /** Batch mode: the save handler threw or rejected; the changes are still pending. */\n @Output() readonly changesSaveFailed = new EventEmitter<GridSaveFailedEvent<TRow>>();\n /** Batch mode: the pending changes or the undo history changed. */\n @Output() readonly pendingChange = new EventEmitter<GridPendingChangeEvent>();\n\n private readonly cellTemplates = contentChildren(GridCellTemplateDirective);\n private readonly editTemplates = contentChildren(GridEditTemplateDirective);\n private readonly headerTemplates = contentChildren(GridHeaderTemplateDirective);\n private readonly summaryTemplates = contentChildren(GridSummaryTemplateDirective);\n private readonly loadingTemplates = contentChildren(GridLoadingTemplateDirective);\n private readonly emptyTemplates = contentChildren(GridEmptyTemplateDirective);\n private readonly errorTemplates = contentChildren(GridErrorTemplateDirective);\n private readonly deleteConfirmTemplates = contentChildren(GridDeleteConfirmTemplateDirective);\n private readonly cellTooltipTemplates = contentChildren(GridCellTooltipTemplateDirective);\n private readonly headerTooltipTemplates = contentChildren(GridHeaderTooltipTemplateDirective);\n\n protected readonly store = inject<GridStore<TRow>>(GridStore);\n private readonly zone = inject(NgZone);\n private readonly popup = inject(GridFilterPopupService);\n\n /** Grid reference / API. Also emitted by `(gridReady)`. */\n readonly api: GridApi<TRow> = this.store.api;\n\n private readonly registry = computed<TemplateRegistry>(() => ({\n display: toGroup(this.cellTemplates()),\n edit: toGroup(this.editTemplates()),\n header: toGroup(this.headerTemplates()),\n summary: toGroup(this.summaryTemplates()),\n cellTooltip: toGroup(this.cellTooltipTemplates()),\n headerTooltip: toGroup(this.headerTooltipTemplates()),\n loading: this.loadingTemplates()[0]?.templateRef ?? null,\n empty: this.emptyTemplates()[0]?.templateRef ?? null,\n error: this.errorTemplates()[0]?.templateRef ?? null,\n }));\n\n protected readonly hostClass = computed(() => `infi-grid infi-grid-theme-${this.store.config().theme}`);\n\n /** The header plus the filter row (when there is one): overlays start below it. */\n protected readonly headerBlockHeight = computed(() => this.store.config().headerHeight + this.store.filterRowHeight());\n\n protected readonly overlayBottom = computed(() => {\n const config = this.store.config();\n return this.store.summaryVisible() && config.summary.sticky ? config.summaryRowHeight : 0;\n });\n\n protected readonly blockWhileLoading = computed(() => this.store.config().loading.blockGrid);\n\n protected readonly errorOverlay = computed<OverlayState<GridErrorContext<TRow>> | null>(() => {\n const store = this.store;\n const config = store.config();\n const error = store.error();\n if (!config.errorState.enabled || error === null || error === undefined || error === false) return null;\n const registry = this.registry();\n return {\n template: config.errorState.useCustomTemplate ? (config.templates.error ?? registry.error) : null,\n context: {\n $implicit: error,\n error,\n message: errorMessage(error, config.errorState.message),\n api: store.api,\n dismiss: () => store.setError(null),\n },\n };\n });\n\n protected readonly emptyOverlay = computed<OverlayState<GridEmptyContext<TRow>> | null>(() => {\n const store = this.store;\n const config = store.config();\n const empty = config.emptyState;\n // The error state is independent and takes precedence; the empty state waits for loading to finish.\n if (!empty.enabled || store.loading() || this.errorOverlay()) return null;\n // The add row is shown where the message would be.\n if (store.editSession()?.isNew) return null;\n const dataEmpty = store.dataLength() === 0;\n const filteredEmpty = !dataEmpty && store.rowCount() === 0;\n if (!dataEmpty && !(filteredEmpty && empty.showWhenFiltered)) return null;\n const reason: GridEmptyReason = dataEmpty ? 'noData' : 'noResults';\n const registry = this.registry();\n return {\n template: empty.useCustomTemplate ? (config.templates.empty ?? registry.empty) : null,\n context: {\n $implicit: reason,\n reason,\n message: dataEmpty ? empty.message : empty.filteredMessage,\n api: store.api,\n clearFilters: () => store.clearFilter(),\n },\n };\n });\n\n protected readonly loadingOverlay = computed<OverlayState<GridLoadingContext<TRow>> | null>(() => {\n const store = this.store;\n const config = store.config();\n const saving = store.saving() && config.editing.loadingWhileSaving;\n if (!config.loading.enabled || !(store.loading() || saving)) return null;\n const registry = this.registry();\n return {\n template: config.loading.useCustomTemplate ? (config.templates.loading ?? registry.loading) : null,\n context: { $implicit: true, loading: true, message: config.loading.message, api: store.api },\n };\n });\n\n /** The batch toolbar: shown in batch mode while there are changes, undo steps, a save or a failed save. */\n protected readonly batchBar = computed(() => {\n const store = this.store;\n const config = store.config();\n if (!config.editing.batch || !config.editing.batchToolbar) return null;\n store.pendingVersion();\n const saving = store.saving();\n const failed = store.saveFailed();\n const hasChanges = store.hasPendingChanges();\n const canUndo = store.canUndo();\n const canRedo = store.canRedo();\n if (!hasChanges && !canUndo && !canRedo && !saving && !failed) return null;\n const text = config.text;\n const count = store.getPendingChanges().count;\n return {\n text,\n saving,\n failed,\n hasChanges,\n canUndo,\n canRedo,\n message: failed ? text.saveFailed : text.pendingChanges.replace('{count}', String(count)),\n };\n });\n\n protected readonly deleteConfirm = computed<OverlayState<GridDeleteConfirmContext<TRow>> | null>(() => {\n const request = this.store.deleteRequest();\n if (!request) return null;\n const text = this.store.config().text;\n const count = request.rows.length;\n return {\n template: this.deleteConfirmTemplates()[0]?.templateRef ?? null,\n context: {\n $implicit: request.rows,\n rows: request.rows,\n keys: request.keys,\n count,\n message: count === 1 ? text.deleteRowConfirm : text.deleteRowsConfirm.replace('{count}', String(count)),\n source: request.source,\n api: this.store.api,\n confirm: () => this.closeConfirm(() => request.confirm()),\n cancel: () => this.closeConfirm(() => request.cancel()),\n },\n };\n });\n\n /** Focuses the dialog's confirm button (or the template's first control) when it opens. */\n @ViewChild('confirmOverlay')\n private set confirmOverlay(ref: ElementRef<HTMLElement> | undefined) {\n if (!ref) return;\n const overlay = ref.nativeElement;\n queueMicrotask(() => {\n if (!overlay.isConnected || overlay.contains(document.activeElement)) return;\n const controls = this.focusable(overlay);\n (overlay.querySelector<HTMLElement>('.infi-grid__dialog-btn--danger') ?? controls[0])?.focus();\n });\n }\n\n private closeConfirm(run: () => void): void {\n run();\n this.store.viewport?.focus();\n }\n\n /** Keeps the focus inside the confirmation (Tab cycles); Escape cancels. */\n protected onConfirmKeydown(event: KeyboardEvent, context: GridDeleteConfirmContext<TRow>): void {\n if (event.key === 'Escape') {\n event.preventDefault();\n context.cancel();\n return;\n }\n if (event.key !== 'Tab') return;\n const controls = this.focusable(event.currentTarget as HTMLElement);\n if (controls.length === 0) return;\n const index = controls.indexOf(document.activeElement as HTMLElement);\n const next = event.shiftKey ? (index <= 0 ? controls.length - 1 : index - 1) : (index + 1) % controls.length;\n event.preventDefault();\n controls[next].focus();\n }\n\n private focusable(container: HTMLElement): HTMLElement[] {\n return Array.from(\n container.querySelectorAll<HTMLElement>('button, [href], input, select, textarea, [tabindex]:not([tabindex=\"-1\"])'),\n ).filter((el) => !(el as HTMLButtonElement).disabled);\n }\n\n constructor() {\n const host = inject<ElementRef<HTMLElement>>(ElementRef).nativeElement;\n this.popup.host = host;\n inject(GridTooltipService).host = host;\n this.store.bind({\n data: this.data,\n columns: this.columns,\n config: this.config,\n loading: this.loading,\n error: this.error,\n registry: this.registry,\n });\n this.wireEvents();\n // Expose every API method on the component itself (see the interface above).\n const self = this as unknown as Record<string, unknown>;\n for (const [name, method] of Object.entries(this.api)) if (!(name in self)) self[name] = method;\n afterNextRender(() => this.gridReady.emit({ api: this.api }));\n }\n\n ngOnInit(): void {\n this.store.applyInitialState();\n }\n\n ngOnChanges(changes: SimpleChanges): void {\n const data = changes['data'];\n if (data || changes['loading']) this.store.inputsChanged(!!data, data?.firstChange ?? false, !!changes['loading']);\n if (changes['config'] && !changes['config'].firstChange) this.store.configChanged();\n if (changes['columns'] && !changes['columns'].firstChange) this.store.columnsChanged();\n }\n\n /** Forwards store events to the outputs, always inside Angular's zone. */\n private wireEvents(): void {\n const zone = this.zone;\n const emit = <T>(emitter: EventEmitter<T>) => (event: T) => {\n if (!emitter.observed) return;\n if (NgZone.isInAngularZone()) emitter.emit(event);\n else zone.run(() => emitter.emit(event));\n };\n const listened: Record<GridListenedEvent, EventEmitter<unknown>> = {\n cellClick: this.cellClick as EventEmitter<unknown>,\n cellDoubleClick: this.cellDoubleClick as EventEmitter<unknown>,\n rowClick: this.rowClick as EventEmitter<unknown>,\n rowDoubleClick: this.rowDoubleClick as EventEmitter<unknown>,\n headerClick: this.headerClick as EventEmitter<unknown>,\n cellContextMenu: this.cellContextMenu as EventEmitter<unknown>,\n cellMouseEnter: this.cellMouseEnter as EventEmitter<unknown>,\n cellMouseLeave: this.cellMouseLeave as EventEmitter<unknown>,\n viewportChange: this.viewportChange as EventEmitter<unknown>,\n selectionClick: this.selectionClick as EventEmitter<unknown>,\n cellSelectionChange: this.cellSelectionChange as EventEmitter<unknown>,\n };\n this.store.events = {\n listens: (name) => listened[name].observed,\n cellClick: emit(this.cellClick),\n cellDoubleClick: emit(this.cellDoubleClick),\n rowClick: emit(this.rowClick),\n rowDoubleClick: emit(this.rowDoubleClick),\n headerClick: emit(this.headerClick),\n cellContextMenu: emit(this.cellContextMenu),\n cellMouseEnter: emit(this.cellMouseEnter),\n cellMouseLeave: emit(this.cellMouseLeave),\n viewportChange: emit(this.viewportChange),\n sortChange: emit(this.sortChange),\n filterChange: emit(this.filterChange),\n cellValueChange: emit(this.cellValueChange),\n editStart: emit(this.editStart),\n editCommit: emit(this.editCommit),\n editCancel: emit(this.editCancel),\n columnResize: emit(this.columnResize),\n gridError: emit(this.gridError),\n dataRefresh: emit(this.dataRefresh),\n loadingChange: emit(this.loadingChange),\n selectionChange: emit(this.selectionChange),\n rowSelected: emit(this.rowSelected),\n rowDeselected: emit(this.rowDeselected),\n selectionCleared: emit(this.selectionCleared),\n selectionClick: emit(this.selectionClick),\n cellSelectionChange: emit(this.cellSelectionChange),\n rowAdding: emit(this.rowAdding),\n rowAdded: emit(this.rowAdded),\n rowUpdating: emit(this.rowUpdating),\n rowUpdated: emit(this.rowUpdated),\n rowDeleting: emit(this.rowDeleting),\n rowDeleted: emit(this.rowDeleted),\n dataChange: emit(this.dataChange),\n changesSaved: emit(this.changesSaved),\n changesCancelled: emit(this.changesCancelled),\n changesSaveFailed: emit(this.changesSaveFailed),\n pendingChange: emit(this.pendingChange),\n };\n }\n}\n","import { Directive, input } from '@angular/core';\n\n/**\n * Base class for components used as grid templates (cell, edit, header, summary, loading, empty, error).\n * It declares the `context` input the grid sets.\n *\n * ```ts\n * @Component({ template: `<b>{{ context().value }}</b>` })\n * export class PriceCell extends GridTemplateComponent<GridCellContext<Order, number>> {}\n * ```\n * Components that don't extend it can declare their own `context` input instead.\n */\n@Directive()\nexport abstract class GridTemplateComponent<C> {\n readonly context = input.required<C>();\n}\n","import { NgModule } from '@angular/core';\nimport { InfiGridComponent } from './components/grid.component';\nimport { GridTemplateComponent } from './directives/grid-template-component';\nimport {\n GridCellTemplateDirective,\n GridCellTooltipTemplateDirective,\n GridDeleteConfirmTemplateDirective,\n GridEditTemplateDirective,\n GridEmptyTemplateDirective,\n GridErrorTemplateDirective,\n GridHeaderTemplateDirective,\n GridHeaderTooltipTemplateDirective,\n GridLoadingTemplateDirective,\n GridSummaryTemplateDirective,\n} from './directives/template.directives';\n\n/** Everything needed in a template: `imports: [INFI_GRID]` in a standalone component. */\nexport const INFI_GRID = [\n InfiGridComponent,\n GridCellTemplateDirective,\n GridEditTemplateDirective,\n GridHeaderTemplateDirective,\n GridSummaryTemplateDirective,\n GridLoadingTemplateDirective,\n GridEmptyTemplateDirective,\n GridErrorTemplateDirective,\n GridDeleteConfirmTemplateDirective,\n GridCellTooltipTemplateDirective,\n GridHeaderTooltipTemplateDirective,\n] as const;\n\n/** For NgModule-based applications: `imports: [InfiGridModule]`. */\n@NgModule({\n imports: [...INFI_GRID],\n exports: [...INFI_GRID],\n})\nexport class InfiGridModule {}\n\nexport { GridTemplateComponent };\n","/*\n * Public API Surface of infi-grid\n */\n\n// Components, directives, module\nexport { InfiGridComponent } from './lib/components/grid.component';\nexport {\n GridCellTemplateDirective,\n GridCellTooltipTemplateDirective,\n GridDeleteConfirmTemplateDirective,\n GridEditTemplateDirective,\n GridEmptyTemplateDirective,\n GridErrorTemplateDirective,\n GridHeaderTemplateDirective,\n GridHeaderTooltipTemplateDirective,\n GridLoadingTemplateDirective,\n GridSummaryTemplateDirective,\n} from './lib/directives/template.directives';\nexport { GridTemplateComponent } from './lib/directives/grid-template-component';\nexport { INFI_GRID, InfiGridModule } from './lib/grid.module';\n\n// Public types: grid, column, filter, sort, summary, template, API, virtualization and event configuration\nexport * from './lib/models';\n\n// Helpers for custom summary functions and filters\nexport { SUMMARY_HELPERS } from './lib/core/summary-engine';\nexport { MAX_CANVAS_HEIGHT } from './lib/core/virtual-math';\nexport { DEFAULT_TEXT } from './lib/core/defaults';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["nextId","toInputText","UNSAFE_KEYS","EMPTY_SUMMARIES","EMPTY_CELL"],"mappings":"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"}
|