@thkl/agrid 0.1.10 → 0.1.12
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/README.md +155 -6
- package/fesm2022/thkl-agrid.mjs +3516 -715
- package/fesm2022/thkl-agrid.mjs.map +1 -1
- package/package.json +1 -1
- package/types/thkl-agrid.d.ts +1081 -70
- package/types/thkl-agrid.d.ts.map +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"thkl-agrid.mjs","sources":["../../../src/app/agrid/agrid.utils.ts","../../../src/app/agrid/rendering/agrid-cell.component.ts","../../../src/app/agrid/infrastructure/agrid-browser.adapter.ts","../../../src/app/agrid/selection/agrid-clipboard.handler.ts","../../../src/app/agrid/columns/agrid-column-layout.model.ts","../../../src/app/agrid/agrid-localization.ts","../../../src/app/agrid/columns/agrid-column-menu.component.ts","../../../src/app/agrid/columns/agrid-column-menu.component.html","../../../src/app/agrid/columns/agrid-column-menu.controller.ts","../../../src/app/agrid/columns/agrid-column-reorder.controller.ts","../../../src/app/agrid/columns/agrid-column-sizing.controller.ts","../../../src/app/agrid/columns/agrid-column-state.service.ts","../../../src/app/agrid/rows/agrid-drag.handler.ts","../../../src/app/agrid/editing/agrid-edit.controller.ts","../../../src/app/agrid/selection/agrid-find.controller.ts","../../../src/app/agrid/selection/agrid-find-panel.component.ts","../../../src/app/agrid/selection/agrid-find-panel.component.html","../../../src/app/agrid/rows/agrid-group.controller.ts","../../../src/app/agrid/rows/agrid-tree.controller.ts","../../../src/app/agrid/selection/agrid-navigation.controller.ts","../../../src/app/agrid/rendering/agrid-presentation.service.ts","../../../src/app/agrid/rendering/agrid-menu-bar.component.ts","../../../src/app/agrid/rendering/agrid-menu-bar.component.html","../../../src/app/agrid/agrid-control.ts","../../../src/app/agrid/agrid-datasource.ts","../../../src/app/agrid/agrid-provider.ts","../../../src/app/agrid/rows/agrid-projection.model.ts","../../../src/app/agrid/selection/agrid-range.controller.ts","../../../src/app/agrid/rows/agrid-row.controller.ts","../../../src/app/agrid/editing/agrid-sidebar.controller.ts","../../../src/app/agrid/editing/agrid-sidebar.component.ts","../../../src/app/agrid/editing/agrid-sidebar.component.html","../../../src/app/agrid/infrastructure/agrid-variable-row-size.strategy.ts","../../../src/app/agrid/agrid.component.ts","../../../src/app/agrid/agrid.component.html","../../../src/app/agrid/agrid-page-selector.component.ts","../../../src/app/agrid/agrid-page-selector.component.html","../../../src/app/agrid/agrid-tree.component.ts","../../../src/app/agrid/agrid-tree.component.html","../../../src/app/agrid/agrid-tree-provider.ts","../../../src/app/agrid/agrid.types.ts","../../../src/app/agrid/thkl-agrid.ts"],"sourcesContent":["import { ColumnFilter } from './agrid-control';\nimport {\n AgridPathTreeConfig,\n AgridTreeConfig,\n ColDef,\n DetailRowItem,\n GridItem,\n PathTreeNodeItem,\n TreeRowItem,\n ValueOption,\n} from './agrid.types';\n\n// Display resolution\n\n// Matches YYYY-MM-DD with optional time component — strict enough to avoid false positives.\nconst ISO_DATE_RE = /^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}(:\\d{2}(\\.\\d+)?)?(Z|[+-]\\d{2}:?\\d{2})?)?$/;\n\n/** Returns true if the value is a Date object or an ISO date string. */\nexport function looksLikeDate(raw: unknown): boolean {\n if (raw instanceof Date) return true;\n if (typeof raw === 'string') return ISO_DATE_RE.test(raw.trim());\n return false;\n}\n\n/**\n * Formats a raw value as a human-readable date string.\n * Accepts Date objects and ISO strings.\n * Returns empty string for null/undefined, raw string if unparseable.\n */\nexport function formatDateValue(raw: unknown, locale?: string, calendarDate = false): string {\n if (raw == null || raw === '') return '';\n const dateInputValue = calendarDate ? getDateInputValue(raw) : '';\n const d = dateInputValue\n ? new Date(`${dateInputValue}T00:00:00.000Z`)\n : raw instanceof Date ? raw : new Date(raw as string);\n if (isNaN(d.getTime())) return String(raw);\n return d.toLocaleDateString(locale, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n ...(calendarDate ? { timeZone: 'UTC' } : {}),\n });\n}\n\n/** Converts a supported date value to the `YYYY-MM-DD` format required by date inputs. */\nexport function getDateInputValue(raw: unknown): string {\n if (raw == null || raw === '') return '';\n const date = raw instanceof Date ? raw : new Date(raw as string);\n return Number.isNaN(date.getTime()) ? '' : date.toISOString().slice(0, 10);\n}\n\n/**\n * Converts a date input value back to the storage form used by the original value.\n *\n * `Date` objects remain `Date` objects. ISO timestamps retain their original time and zone\n * suffix, while date-only strings and previously empty values remain date-only strings.\n */\nexport function coerceDateInputValue(value: string, originalValue: unknown): unknown {\n if (value === '') return '';\n if (originalValue instanceof Date) return new Date(`${value}T00:00:00.000Z`);\n if (\n typeof originalValue === 'string'\n && /^\\d{4}-\\d{2}-\\d{2}T/.test(originalValue)\n ) {\n return `${value}${originalValue.slice(10)}`;\n }\n return value;\n}\n\n/** Resolve the display string for a raw cell value via ValueOption label, formatter, or coercion. */\nexport function getDisplayForField(col: ColDef | undefined, raw: unknown, locale?: string): string {\n if (!col) return String(raw ?? '');\n if (col.values?.length) {\n const opt = col.values.find(v =>\n typeof v === 'string' ? v === raw : (v as ValueOption).value === raw\n );\n if (opt !== undefined) return typeof opt === 'string' ? opt : (opt as ValueOption).label;\n }\n if (col.formatter) return col.formatter(raw);\n if (col.type === 'date' || looksLikeDate(raw)) {\n return formatDateValue(raw, locale, col.type === 'date');\n }\n return String(raw ?? '');\n}\n\n/** Returns whether a virtual-scroll item represents a data row. */\nexport function isDataRowItem<T extends object>(\n item: GridItem<T>,\n): item is { row: T; originalIndex: number } {\n return typeof item === 'object' && item !== null && 'row' in item && !('detailFor' in item);\n}\n\n/** Returns whether a virtual-scroll item represents a master/detail panel row. */\nexport function isDetailRowItem<T extends object>(item: GridItem<T>): item is DetailRowItem<T> {\n return typeof item === 'object' && item !== null && 'detailFor' in item;\n}\n\n/** Returns whether a virtual-scroll item represents a group header. */\nexport function isGroupHeaderItem(\n item: GridItem,\n): item is { groupLabel: string; count: number; collapsed: boolean; aggregates?: Record<string, unknown> } {\n return typeof item === 'object' && item !== null && 'groupLabel' in item;\n}\n\n/**\n * Returns whether a virtual-scroll item represents a tree row.\n *\n * Tree rows also pass {@link isDataRowItem} (they carry `row` + `originalIndex`); this guard\n * additionally narrows to the indentation/expansion fields via the `level` discriminator.\n */\nexport function isTreeRowItem<T extends object>(item: GridItem<T>): item is TreeRowItem<T> {\n return isDataRowItem(item) && 'level' in item;\n}\n\n/** Returns whether a virtual-scroll item is a generated path-tree branch node. */\nexport function isPathTreeNodeItem(item: GridItem): item is PathTreeNodeItem {\n return typeof item === 'object' && item !== null && 'pathNodeId' in item;\n}\n\n/** Returns whether a tree configuration derives its hierarchy from path segments. */\nexport function isPathTreeConfig<T extends object>(\n config: AgridTreeConfig<T>,\n): config is AgridPathTreeConfig<T> {\n return typeof config.getPath === 'function';\n}\n\n// Filtering\n\n/** Apply text substring and value-set filters, returning the surviving row indices. */\nexport function applyTextAndValueFilters(\n rows: Record<string, unknown>[],\n indices: number[],\n filters: Record<string, ColumnFilter>,\n colMap: Map<string, ColDef>,\n locale?: string,\n): number[] {\n let result = indices;\n for (const [field, filter] of Object.entries(filters)) {\n const col = colMap.get(field);\n if (filter.text) {\n const lc = filter.text.toLowerCase();\n result = result.filter(i => getDisplayForField(col, rows[i][field], locale).toLowerCase().includes(lc));\n }\n if (filter.selectedValues !== null) {\n const allowed = new Set(filter.selectedValues);\n result = result.filter(i => allowed.has(String(rows[i][field] ?? '')));\n }\n if (filter.operator && filter.operand != null && filter.operand !== '') {\n result = result.filter(i => passesConditionFilter(col, rows[i][field], filter, locale));\n }\n }\n return result;\n}\n\n/**\n * Evaluate a text, number, or date condition for one cell value.\n */\nexport function passesConditionFilter(\n col: ColDef | undefined,\n raw: unknown,\n filter: ColumnFilter,\n locale?: string,\n): boolean {\n if (col?.type !== 'number' && col?.type !== 'date') {\n const value = getDisplayForField(col, raw, locale).toLocaleLowerCase(locale);\n const operand = String(filter.operand ?? '').toLocaleLowerCase(locale);\n switch (filter.operator) {\n case 'eq': return value === operand;\n case 'neq': return value !== operand;\n case 'startsWith': return value.startsWith(operand);\n case 'endsWith': return value.endsWith(operand);\n case 'includes': return value.includes(operand);\n case 'notIncludes': return !value.includes(operand);\n case 'like': {\n const escaped = operand.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const pattern = escaped.replace(/%/g, '.*').replace(/_/g, '.');\n return new RegExp(`^${pattern}$`, 'u').test(value);\n }\n default: return true;\n }\n }\n\n const isDate = col?.type === 'date' || looksLikeDate(raw);\n const toNum = (v: unknown): number =>\n isDate\n ? (v instanceof Date ? v.getTime() : new Date(v as string).getTime())\n : Number(v);\n const value = toNum(raw);\n if (Number.isNaN(value)) return false;\n const a = toNum(filter.operand);\n if (Number.isNaN(a)) return true;\n switch (filter.operator) {\n case 'eq': return value === a;\n case 'neq': return value !== a;\n case 'gt': return value > a;\n case 'gte': return value >= a;\n case 'lt': return value < a;\n case 'lte': return value <= a;\n case 'between': {\n const b = toNum(filter.operand2);\n if (Number.isNaN(b)) return value >= a;\n return value >= Math.min(a, b) && value <= Math.max(a, b);\n }\n default: return true;\n }\n}\n\n/**\n * Keep only the rows where at least one of the given columns' display value contains\n * `text` (case-insensitive). An empty/whitespace `text` returns the indices unchanged.\n */\nexport function applyQuickFilter(\n rows: Record<string, unknown>[],\n indices: number[],\n text: string,\n cols: ColDef[],\n locale?: string,\n): number[] {\n const q = text.trim().toLowerCase();\n if (!q) return indices;\n return indices.filter(i =>\n cols.some(col => getDisplayForField(col, rows[i][col.field], locale).toLowerCase().includes(q)),\n );\n}\n\n// Sorting\n\n/**\n * Sort indices by one or more columns in priority order.\n * Each entry is `[field, ColumnFilter]`; the first entry has the highest priority.\n * Ties are broken by subsequent entries.\n */\nexport function applySortToIndices(\n rows: Record<string, unknown>[],\n indices: number[],\n sortEntries: [string, ColumnFilter][],\n colMap: Map<string, ColDef>,\n locale?: string,\n): number[] {\n if (sortEntries.length === 0) return indices;\n\n const collator = new Intl.Collator(locale, { numeric: true, sensitivity: 'base' });\n const fields = sortEntries.map(([field, filter]) => {\n const col = colMap.get(field);\n const dateLike = new Uint8Array(indices.length);\n const dateValues = new Float64Array(indices.length);\n const numericValues = new Float64Array(indices.length);\n numericValues.fill(Number.NaN);\n const displayValues = new Array<string>(indices.length);\n\n for (let position = 0; position < indices.length; position++) {\n const index = indices[position];\n const raw = rows[index][field];\n const isDateLike = col?.type === 'date' || looksLikeDate(raw);\n const dateValue = isDateLike\n ? raw instanceof Date ? raw.getTime() : new Date(raw as string).getTime()\n : Number.NaN;\n const numericValue = col?.type === 'number'\n && !col.formatter\n && !col.values?.length\n && typeof raw === 'number'\n && Number.isFinite(raw)\n ? raw\n : Number.NaN;\n dateLike[position] = isDateLike ? 1 : 0;\n dateValues[position] = Number.isNaN(dateValue) ? -1 : dateValue;\n numericValues[position] = numericValue;\n displayValues[position] = isDateLike ? '' : getDisplayForField(col, raw, locale);\n }\n\n return {\n direction: filter.sort === 'desc' ? -1 : 1,\n dateLike,\n dateValues,\n numericValues,\n displayValues,\n };\n });\n const positions = Array.from({ length: indices.length }, (_, position) => position);\n\n positions.sort((a, b) => {\n for (let fieldIndex = 0; fieldIndex < fields.length; fieldIndex++) {\n const field = fields[fieldIndex];\n let comparison: number;\n if (field.dateLike[a] || field.dateLike[b]) {\n comparison = field.dateValues[a] - field.dateValues[b];\n } else if (\n !Number.isNaN(field.numericValues[a])\n && !Number.isNaN(field.numericValues[b])\n ) {\n comparison = field.numericValues[a] - field.numericValues[b];\n } else {\n comparison = collator.compare(field.displayValues[a], field.displayValues[b]);\n }\n if (comparison !== 0) {\n return comparison * field.direction;\n }\n }\n return a - b;\n });\n\n return positions.map(position => indices[position]);\n}\n\n// Grouping\n\n/**\n * Bucket rows by the display value of `groupField`, sort group keys alphabetically,\n * optionally sort within groups by a secondary sort, and interleave group-header items.\n * Does NOT append the add-row null sentinel — the caller does that.\n */\n/** Built-in aggregate function names supported by the footer and group subtotals. */\ntype BuiltinAggregate = 'sum' | 'avg' | 'min' | 'max' | 'count';\n\n/**\n * Compute aggregate values for the given rows across every column that has a static\n * (`ColDef.aggregate`) or control-configured aggregate. Returns a `field → value` map containing\n * only aggregated columns. Shared by the grid footer and per-group subtotals.\n */\nexport function computeAggregates(\n rows: Record<string, unknown>[],\n indices: number[],\n cols: ColDef[],\n controlAggregates: Record<string, BuiltinAggregate>,\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const col of cols) {\n const aggregate: ColDef['aggregate'] = controlAggregates[col.field] ?? col.aggregate;\n if (!aggregate) continue;\n if (typeof aggregate === 'function') {\n const values = indices.map(index => rows[index][col.field]);\n result[col.field] = (aggregate as (values: unknown[]) => unknown)(values);\n continue;\n }\n\n let count = 0;\n let numericCount = 0;\n let sum = 0;\n let min = Infinity;\n let max = -Infinity;\n for (const index of indices) {\n const raw = rows[index][col.field];\n if (raw != null && raw !== '') count++;\n\n const value = Number(raw);\n if (Number.isNaN(value)) continue;\n numericCount++;\n sum += value;\n if (value < min) min = value;\n if (value > max) max = value;\n }\n\n switch (aggregate) {\n case 'sum':\n result[col.field] = sum;\n break;\n case 'avg':\n result[col.field] = numericCount ? sum / numericCount : null;\n break;\n case 'min':\n result[col.field] = numericCount ? min : null;\n break;\n case 'max':\n result[col.field] = numericCount ? max : null;\n break;\n case 'count':\n result[col.field] = count;\n break;\n }\n }\n return result;\n}\n\nexport function buildGroupedItems(\n rows: Record<string, unknown>[],\n indices: number[],\n groupField: string,\n colMap: Map<string, ColDef>,\n sortEntries: [string, ColumnFilter][],\n expandedLabels: Set<string>,\n locale?: string,\n aggregateCols: ColDef[] = [],\n controlAggregates: Record<string, BuiltinAggregate> = {},\n): GridItem[] {\n const hasAggregates = aggregateCols.some(\n col => controlAggregates[col.field] ?? col.aggregate,\n );\n const groupCol = colMap.get(groupField);\n\n const groups = new Map<string, number[]>();\n for (const i of indices) {\n const key = getDisplayForField(groupCol, rows[i][groupField], locale);\n if (!groups.has(key)) groups.set(key, []);\n groups.get(key)!.push(i);\n }\n\n const sortedKeys = [...groups.keys()].sort((a, b) =>\n a.localeCompare(b, locale, { sensitivity: 'base' })\n );\n\n const nonGroupSorts = sortEntries.filter(([f]) => f !== groupField);\n if (nonGroupSorts.length > 0) {\n for (const [, groupRows] of groups) {\n const sorted = applySortToIndices(rows, groupRows, nonGroupSorts, colMap, locale);\n groupRows.splice(0, groupRows.length, ...sorted);\n }\n }\n\n const items: GridItem[] = [];\n for (const key of sortedKeys) {\n const groupRows = groups.get(key)!;\n const isExpanded = expandedLabels.has(key);\n const aggregates = hasAggregates\n ? computeAggregates(rows, groupRows, aggregateCols, controlAggregates)\n : undefined;\n items.push({ groupLabel: key, count: groupRows.length, collapsed: !isExpanded, aggregates });\n if (isExpanded) {\n for (const i of groupRows) items.push({ row: rows[i], originalIndex: i });\n }\n }\n return items;\n}\n\n/** Row accessors required to flatten a hierarchy. @internal */\nexport interface TreeAccessors<T extends object> {\n getId: (row: T) => string | number;\n getParentId: (row: T) => string | number | null | undefined;\n}\n\n/**\n * Flatten a parent/child hierarchy into a depth-first list of {@link TreeRowItem}s for the\n * virtual scroll list, honoring the expanded-id set.\n *\n * `indices` is the already filtered and sorted set of source-array positions; sibling order\n * follows that order. A row is treated as a **root** when its parent id is `null`/`undefined`\n * or when that parent is not present in `indices` (orphan). Children of a collapsed row are\n * omitted. Cycles and rows visited more than once are guarded so the walk always terminates.\n *\n * @param rows The full data-source array.\n * @param indices Filtered/sorted source positions to include, in display order.\n * @param accessors `getId` / `getParentId` for the rows.\n * @param expandedIds Ids whose children should be rendered.\n * @param forceExpandedIds Ids forced open regardless of `expandedIds` — used to reveal the\n * ancestor path of filter matches. Optional.\n */\nexport function buildTreeItems<T extends object>(\n rows: T[],\n indices: number[],\n accessors: TreeAccessors<T>,\n expandedIds: Set<string | number>,\n forceExpandedIds?: Set<string | number>,\n): GridItem<T>[] {\n const { getId, getParentId } = accessors;\n\n const includedIds = new Set<string | number>();\n for (const i of indices) includedIds.add(getId(rows[i]));\n\n // Bucket each included row under its parent, preserving the incoming (sorted) order.\n const childrenByParent = new Map<string | number, number[]>();\n const roots: number[] = [];\n for (const i of indices) {\n const parentId = getParentId(rows[i]);\n if (parentId == null || !includedIds.has(parentId)) {\n roots.push(i);\n continue;\n }\n const siblings = childrenByParent.get(parentId);\n if (siblings) siblings.push(i);\n else childrenByParent.set(parentId, [i]);\n }\n\n const items: GridItem<T>[] = [];\n const visited = new Set<string | number>();\n\n const visit = (index: number, level: number): void => {\n const row = rows[index];\n const id = getId(row);\n if (visited.has(id)) return; // cycle / duplicate-parent guard\n visited.add(id);\n\n const children = childrenByParent.get(id);\n const expandable = !!children?.length;\n const expanded = expandable && (expandedIds.has(id) || !!forceExpandedIds?.has(id));\n items.push({ row, originalIndex: index, level, expandable, expanded });\n\n if (expanded && children) {\n for (const childIndex of children) visit(childIndex, level + 1);\n }\n };\n\n for (const rootIndex of roots) visit(rootIndex, 0);\n return items;\n}\n\n/** Stable expansion id for a generated path prefix. */\nexport function pathTreeNodeId(path: readonly (string | number)[]): string {\n return `__agrid_path__${JSON.stringify(path.map(String))}`;\n}\n\nexport function pathTreeNodeUuid(path: readonly (string | number)[]): string {\n const source = JSON.stringify(path.map(String));\n let a = 0x9e3779b9;\n let b = 0x85ebca6b;\n let c = 0xc2b2ae35;\n let d = 0x27d4eb2f;\n\n for (let i = 0; i < source.length; i++) {\n const code = source.charCodeAt(i);\n a = Math.imul(a ^ code, 0x85ebca6b);\n b = Math.imul(b ^ code, 0xc2b2ae35);\n c = Math.imul(c ^ code, 0x27d4eb2f);\n d = Math.imul(d ^ code, 0x165667b1);\n }\n\n const hex = [a, b, c, d]\n .map(value => (value >>> 0).toString(16).padStart(8, '0'))\n .join('')\n .split('');\n hex[12] = '5';\n hex[16] = ((parseInt(hex[16], 16) & 0x3) | 0x8).toString(16);\n return `${hex.slice(0, 8).join('')}-${hex.slice(8, 12).join('')}-${hex.slice(12, 16).join('')}-${hex.slice(16, 20).join('')}-${hex.slice(20, 32).join('')}`;\n}\n\n/** Builds display-only branch nodes and datasource-backed leaves from path segments. */\nexport function buildPathTreeItems<T extends object>(\n rows: T[],\n indices: number[],\n config: AgridPathTreeConfig<T>,\n expandedIds: Set<string | number>,\n forceExpanded = false,\n): GridItem<T>[] {\n type Branch = {\n id: string;\n uuid: string;\n label: string;\n level: number;\n children: Map<string, Branch>;\n leaves: { originalIndex: number; label: string }[];\n };\n\n const roots = new Map<string, Branch>();\n for (const originalIndex of indices) {\n const rawPath = config.getPath(rows[originalIndex]).filter(\n segment => String(segment).length > 0,\n );\n if (rawPath.length === 0) continue;\n const path = rawPath.map(String);\n const formatSegment = (level: number, leaf: boolean): string =>\n config.formatPathSegment?.({\n row: rows[originalIndex],\n segment: rawPath[level],\n level,\n path: rawPath.slice(0, level + 1),\n leaf,\n }) ?? path[level];\n const resolveNodeUuid = (prefix: readonly string[]): string =>\n String(config.nodeUuid?.(rows[originalIndex])\n ?? config.nodeUUid?.(rows[originalIndex])\n ?? pathTreeNodeUuid(prefix));\n let branches = roots;\n for (let level = 0; level < path.length - 1; level++) {\n const prefix = path.slice(0, level + 1);\n const id = pathTreeNodeId(prefix);\n let branch = branches.get(id);\n if (!branch) {\n branch = {\n id,\n uuid: resolveNodeUuid(prefix),\n label: formatSegment(level, false),\n level,\n children: new Map(),\n leaves: [],\n };\n branches.set(id, branch);\n }\n if (level === path.length - 2) {\n branch.leaves.push({\n originalIndex,\n label: formatSegment(path.length - 1, true),\n });\n }\n branches = branch.children;\n }\n if (path.length === 1) {\n const id = pathTreeNodeId([]);\n let branch = roots.get(id);\n if (!branch) {\n branch = {\n id,\n uuid: resolveNodeUuid([]),\n label: '',\n level: -1,\n children: new Map(),\n leaves: [],\n };\n roots.set(id, branch);\n }\n branch.leaves.push({ originalIndex, label: formatSegment(0, true) });\n }\n }\n\n const items: GridItem<T>[] = [];\n const visit = (branch: Branch): void => {\n const isHiddenRoot = branch.level < 0;\n const expanded = forceExpanded || expandedIds.has(branch.id);\n if (!isHiddenRoot) {\n items.push({\n uuid: branch.uuid,\n pathNodeId: branch.id,\n pathLabel: branch.label,\n level: branch.level,\n expandable: true,\n expanded,\n });\n }\n if (!isHiddenRoot && !expanded) return;\n for (const child of branch.children.values()) visit(child);\n for (const leaf of branch.leaves) {\n items.push({\n row: rows[leaf.originalIndex],\n originalIndex: leaf.originalIndex,\n level: isHiddenRoot ? 0 : branch.level + 1,\n expandable: false,\n expanded: false,\n treeLabel: leaf.label,\n });\n }\n };\n for (const branch of roots.values()) visit(branch);\n return items;\n}\n\n// Selection range\n\n/** Build the set of original indices spanning from `fromOrig` to `toOrig` in display order. */\nexport function buildSelectionRange(fromOrig: number, toOrig: number, items: GridItem[]): Set<number> {\n const fromDisp = items.findIndex(item => isDataRowItem(item) && item.originalIndex === fromOrig);\n const toDisp = items.findIndex(item => isDataRowItem(item) && item.originalIndex === toOrig);\n if (fromDisp === -1 || toDisp === -1) return new Set();\n const [lo, hi] = [Math.min(fromDisp, toDisp), Math.max(fromDisp, toDisp)];\n const next = new Set<number>();\n for (let i = lo; i <= hi; i++) {\n const item = items[i];\n if (isDataRowItem(item)) next.add(item.originalIndex);\n }\n return next;\n}\n\n/** Test a complete proposed editor value against a regex input mask. */\nexport function matchesInputMask(value: unknown, mask: RegExp): boolean {\n const flags = mask.flags.replace(/[gy]/g, '');\n return new RegExp(`^(?:${mask.source})$`, flags).test(String(value ?? ''));\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n computed,\n effect,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { ColDef, ValueOption } from '../agrid.types';\nimport {\n coerceDateInputValue,\n getDisplayForField,\n getDateInputValue,\n matchesInputMask,\n} from '../agrid.utils';\n\n/**\n * Individual cell component used inside `AgridComponent`.\n *\n * Renders a read-only span when not editing, and an `<input>` or `<select>`\n * (for columns with `ColDef.values`) when in edit mode.\n *\n * Not intended for direct use — `AgridComponent` manages all inputs and outputs.\n */\n@Component({\n selector: 'agrid-cell',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: {\n role: 'gridcell',\n '[class.selected]': 'selected()',\n '[class.editing]': 'editing()',\n '[class.ag-cell--tree]': 'treeCell()',\n '[class.ag-cell--with-info]': 'showInfoIcon() && !editing()',\n '[attr.aria-readonly]': '!editable() ? \"true\" : null',\n '[attr.title]': 'displayValue()',\n '(click)': 'activate.emit($event)',\n '(dblclick)': 'startEdit.emit()',\n tabindex: '-1',\n },\n template: `\n @if (booleanCell()) {\n <input\n type=\"checkbox\"\n class=\"ag-cell-checkbox\"\n [checked]=\"booleanChecked()\"\n [disabled]=\"!editable()\"\n [attr.aria-label]=\"col().header\"\n (click)=\"onCheckboxClick($event)\"\n (dblclick)=\"$event.stopPropagation()\"\n />\n } @else if (editing()) {\n @if (col().values?.length) {\n <select\n #editSelect\n class=\"ag-cell-select\"\n (change)=\"onSelectChange($event)\"\n >\n @for (opt of valueOptions(); track opt.label; let idx = $index) {\n <option [value]=\"idx\" [selected]=\"idx === selectedOptionIndex()\">{{ opt.label }}</option>\n }\n </select>\n } @else {\n <input\n #editInput\n class=\"ag-cell-input\"\n [class.ag-cell-input--invalid]=\"!!error()\"\n [type]=\"col().type === 'date' ? 'date' : col().type === 'number' ? 'number' : 'text'\"\n [value]=\"editorValue()\"\n (input)=\"onInput($event)\"\n />\n }\n @if (error(); as msg) {\n <span class=\"ag-cell-error\" role=\"alert\">{{ msg }}</span>\n }\n } @else {\n @if (treeCell()) {\n <span class=\"ag-tree-prefix\" [style.padding-left.px]=\"treeLevel() * treeIndent\">\n @if (treeExpandable()) {\n <button\n type=\"button\"\n class=\"ag-tree-twisty\"\n [class.ag-tree-twisty--expanded]=\"treeExpanded()\"\n [attr.aria-label]=\"treeExpanded() ? 'Collapse' : 'Expand'\"\n (click)=\"onTreeToggle($event)\"\n >▶</button>\n } @else {\n <span class=\"ag-tree-twisty-spacer\"></span>\n }\n </span>\n }\n @if (col().cellRenderer) {\n <span class=\"ag-cell-value\" [innerHTML]=\"renderedHtml()\"></span>\n } @else {\n <span class=\"ag-cell-value\">{{ displayValue() }}</span>\n }\n }\n @if (showInfoIcon() && !editing()) {\n <button\n type=\"button\"\n class=\"ag-cell-info\"\n aria-label=\"More information\"\n title=\"More information\"\n (pointerdown)=\"$event.stopPropagation()\"\n (click)=\"onInfoClick($event)\"\n (dblclick)=\"$event.stopPropagation()\"\n >?</button>\n }\n `,\n styleUrl: './agrid-cell.component.css',\n})\nexport class AgridCellComponent {\n /** Column definition for this cell. */\n col = input.required<ColDef>();\n\n /** Absolute row index within the data source. */\n rowIndex = input.required<number>();\n\n /** Column index within `colDefs`. */\n colIndex = input.required<number>();\n\n /** Current field value from the data source (displayed when not editing). */\n value = input.required<unknown>();\n\n /** Optional display-only text override; editing still uses the original {@link value}. */\n displayValueOverride = input<string | null>(null);\n\n /** Full row data — passed to `cellRenderer` when set. */\n row = input<Record<string, unknown>>({});\n\n /** Locale used for built-in date formatting. */\n locale = input<string | undefined>(undefined);\n\n /** Whether this cell has the active selection outline. */\n selected = input<boolean>(false);\n\n /** Whether this cell is currently in edit mode. */\n editing = input<boolean>(false);\n\n /** Whether this cell may be edited (drives the boolean checkbox enabled state). */\n editable = input<boolean>(true);\n\n /** Whether a right-aligned information button is visible in this cell. */\n showInfoIcon = input<boolean>(false);\n\n /** Validation error message to show under the editor, or `null` when the value is valid. */\n error = input<string | null>(null);\n\n /** Whether this cell is the tree column and should render indentation + a twisty. */\n treeCell = input<boolean>(false);\n\n /** Depth of the row in the tree (drives indentation). Root rows are `0`. */\n treeLevel = input<number>(0);\n\n /** Whether the row has children and can be expanded/collapsed. */\n treeExpandable = input<boolean>(false);\n\n /** Whether the row is currently expanded. */\n treeExpanded = input<boolean>(false);\n\n /** Emitted when the user clicks the expand/collapse twisty. */\n treeToggle = output<void>();\n\n /** Indentation in pixels applied per tree level. */\n readonly treeIndent = 16;\n\n /**\n * Optional character to pre-fill the edit input when the user presses a printable key\n * while the cell is selected (type-to-start-editing behavior).\n */\n seedChar = input<string>('');\n\n /** Whether an unseeded text editor should select all text when focused. */\n selectTextOnEdit = input<boolean>(true);\n\n /**\n * Emitted on single click — the grid selects this cell.\n * For `values` columns the grid also enters edit mode immediately.\n */\n activate = output<MouseEvent>();\n\n /** Emitted on double-click — the grid enters edit mode. */\n startEdit = output<void>();\n\n /** Emitted when a boolean-column checkbox is toggled, carrying the new value. */\n booleanToggle = output<boolean>();\n\n /** Emitted when the cell's optional information button is clicked. */\n infoClick = output<void>();\n\n /**\n * Emitted on every keystroke inside the edit input or on every select change.\n * The grid stores the latest value in `currentDraft` so it can commit on Tab / Enter.\n */\n draftChange = output<unknown>();\n\n /** Live draft value managed by the cell during an active edit. */\n readonly draft = signal<unknown>('');\n\n /** String value accepted by the active native input element. */\n readonly editorValue = computed((): string => {\n const draft = this.draft();\n if (this.col().type === 'date') {\n return getDateInputValue(draft);\n }\n return String(draft ?? '');\n });\n\n /** Mask selected for the current row and cell, if this is a maskable text column. */\n readonly resolvedInputMask = computed((): RegExp | null => {\n const col = this.col();\n if (!col.inputMask || col.type === 'number' || col.type === 'date' || col.type === 'boolean') {\n return null;\n }\n return col.inputMask({\n row: this.row(),\n value: this.value(),\n column: col,\n }) ?? null;\n });\n\n /** Whether this cell renders as an inline boolean checkbox (no edit mode). */\n readonly booleanCell = computed(\n (): boolean => this.col().type === 'boolean' && !this.col().cellRenderer,\n );\n\n /** Truthiness of the current boolean value (accepts `true`, `'true'`, `1`, `'1'`). */\n readonly booleanChecked = computed((): boolean => {\n const v = this.value();\n return v === true || v === 1 || v === 'true' || v === '1';\n });\n\n readonly renderedHtml = computed((): string => {\n const renderer = this.col().cellRenderer;\n if (!renderer) return '';\n return renderer({ value: this.value(), row: this.row() });\n });\n\n /**\n * Normalized list of value options (always `{ label, rawValue }` regardless of whether\n * `ColDef.values` is `string[]` or `ValueOption[]`).\n */\n readonly valueOptions = computed(() => {\n const vals = this.col().values ?? [];\n return vals.map(v =>\n typeof v === 'string'\n ? { label: v, rawValue: v as unknown }\n : { label: (v as ValueOption).label, rawValue: (v as ValueOption).value }\n );\n });\n\n /**\n * The string shown in the cell when not editing.\n * Priority: ValueOption label → `ColDef.formatter` → raw string.\n */\n readonly displayValue = computed((): string => {\n return this.displayValueOverride()\n ?? getDisplayForField(this.col(), this.value(), this.locale());\n });\n\n /**\n * Index of the currently selected option in `valueOptions`.\n * Used to drive `<option [value]=\"idx\" [selected]=\"idx === selectedOptionIndex()\">`.\n * Index-based approach avoids string/type coercion for non-string raw values.\n */\n readonly selectedOptionIndex = computed((): number => {\n const raw = this.draft();\n return this.valueOptions().findIndex(o => o.rawValue === raw);\n });\n\n private readonly inputEl = viewChild<ElementRef<HTMLInputElement>>('editInput');\n private readonly selectEl = viewChild<ElementRef<HTMLSelectElement>>('editSelect');\n\n constructor() {\n effect(() => {\n if (this.editing()) {\n const seed = this.seedChar();\n const isDate = this.col().type === 'date';\n const existingDate = isDate ? getDateInputValue(this.value()) : '';\n const dateInitial = existingDate || (isDate && seed === '' ? new Date().toISOString().slice(0, 10) : '');\n const initialValue = isDate\n ? dateInitial\n : seed !== '' ? seed : this.value();\n const mask = this.resolvedInputMask();\n const acceptedInitialValue = seed !== '' && mask && !matchesInputMask(initialValue, mask)\n ? this.value()\n : initialValue;\n this.draft.set(acceptedInitialValue);\n\n setTimeout(() => {\n const input = this.inputEl()?.nativeElement;\n if (input) {\n const displaySeed = isDate\n ? dateInitial\n : String(acceptedInitialValue ?? '');\n input.value = displaySeed;\n input.focus();\n if (input.type === 'text' && !seed && this.selectTextOnEdit()) input.select();\n else if (input.type === 'text') {\n const len = displaySeed.length;\n input.setSelectionRange(len, len);\n }\n return;\n }\n\n const sel = this.selectEl()?.nativeElement;\n if (sel) {\n const idx = this.selectedOptionIndex();\n if (idx >= 0) sel.value = String(idx);\n sel.focus();\n try {\n (sel as HTMLSelectElement & { showPicker?: () => void }).showPicker?.();\n } catch {\n sel.click();\n }\n }\n });\n }\n });\n }\n\n /** Toggle a boolean cell's value, driven entirely from data (no DOM toggle). */\n onCheckboxClick(event: MouseEvent): void {\n event.stopPropagation();\n event.preventDefault();\n if (!this.editable()) return;\n this.booleanToggle.emit(!this.booleanChecked());\n }\n\n /** Emit a tree expand/collapse request without selecting or editing the cell. */\n onTreeToggle(event: MouseEvent): void {\n event.stopPropagation();\n this.treeToggle.emit();\n }\n\n /** Emits the information action without activating or editing the cell. */\n onInfoClick(event: MouseEvent): void {\n event.preventDefault();\n event.stopPropagation();\n this.infoClick.emit();\n }\n\n /** Forward `<input>` changes to the grid. */\n onInput(event: Event): void {\n const input = event.target as HTMLInputElement;\n const val = input.value;\n const mask = this.resolvedInputMask();\n if (mask && !matchesInputMask(val, mask)) {\n input.value = String(this.draft() ?? '');\n input.setSelectionRange(input.value.length, input.value.length);\n return;\n }\n const draft = this.col().type === 'date'\n ? coerceDateInputValue(val, this.value())\n : val;\n this.draft.set(draft);\n this.draftChange.emit(draft);\n }\n\n /**\n * Forward `<select>` changes to the grid.\n * Maps the option index back to the raw value (preserves original type — number, object, etc.).\n */\n onSelectChange(event: Event): void {\n const idx = Number((event.target as HTMLSelectElement).value);\n const opts = this.valueOptions();\n const rawValue = opts[idx]?.rawValue ?? '';\n this.draft.set(rawValue);\n this.draftChange.emit(rawValue);\n }\n}\n","/** Guarded access to browser-only APIs used by the grid. @internal */\nexport class AgridBrowserAdapter {\n /** Creates an adapter using injected browser globals or the current environment. */\n constructor(\n private readonly doc: Document | null =\n typeof document === 'undefined' ? null : document,\n private readonly win: Window | null =\n typeof window === 'undefined' ? null : window,\n ) {}\n\n /** Returns whether both document and window APIs are available. */\n get available(): boolean {\n return this.doc !== null && this.win !== null;\n }\n\n /** Registers a document event listener when a document is available. */\n addDocumentListener<K extends keyof DocumentEventMap>(\n type: K,\n listener: (event: DocumentEventMap[K]) => void,\n ): void {\n this.doc?.addEventListener(type, listener as EventListener);\n }\n\n /** Removes a previously registered document event listener. */\n removeDocumentListener<K extends keyof DocumentEventMap>(\n type: K,\n listener: (event: DocumentEventMap[K]) => void,\n ): void {\n this.doc?.removeEventListener(type, listener as EventListener);\n }\n\n /** Returns the element stack at viewport coordinates. */\n elementsFromPoint(x: number, y: number): Element[] {\n return this.doc?.elementsFromPoint?.(x, y) ?? [];\n }\n\n /** Appends an element to the document body when available. */\n appendToBody(element: HTMLElement): boolean {\n if (!this.doc?.body) return false;\n this.doc.body.appendChild(element);\n return true;\n }\n\n /** Sets cursor and text-selection styles on the document body. */\n setBodyInteraction(cursor: string, userSelect: string): void {\n if (!this.doc?.body) return;\n this.doc.body.style.cursor = cursor;\n this.doc.body.style.userSelect = userSelect;\n }\n\n /** Returns the viewport width or infinity during server rendering. */\n viewportWidth(): number {\n return this.win?.innerWidth ?? Number.POSITIVE_INFINITY;\n }\n\n /** Returns the viewport height or infinity during server rendering. */\n viewportHeight(): number {\n return this.win?.innerHeight ?? Number.POSITIVE_INFINITY;\n }\n\n /** Returns computed styles when a window is available. */\n computedStyle(element: Element): CSSStyleDeclaration | null {\n return this.win?.getComputedStyle?.(element) ?? null;\n }\n\n /** Creates a 2D canvas context for text measurement. */\n createCanvasContext(): CanvasRenderingContext2D | null {\n return this.doc?.createElement('canvas').getContext('2d') ?? null;\n }\n\n /** Schedules a callback with the environment timer. */\n schedule(callback: () => void, delay = 0): ReturnType<typeof setTimeout> {\n return setTimeout(callback, delay);\n }\n\n /** Writes text to the system clipboard, returning whether it succeeded. */\n async writeClipboard(text: string): Promise<boolean> {\n try {\n const clipboard = this.win?.navigator.clipboard;\n if (!clipboard?.writeText) return false;\n await clipboard.writeText(text);\n return true;\n } catch {\n return false;\n }\n }\n\n /** Downloads text through a temporary object URL and anchor element. */\n downloadText(filename: string, text: string, mimeType: string): boolean {\n const urlApi = (this.win as unknown as { URL?: typeof URL } | null)?.URL\n ?? (typeof URL === 'undefined' ? null : URL);\n if (!this.doc?.body || !urlApi?.createObjectURL) return false;\n let url: string | null = null;\n let anchor: HTMLAnchorElement | null = null;\n try {\n url = urlApi.createObjectURL(new Blob([text], { type: mimeType }));\n anchor = this.doc.createElement('a');\n anchor.href = url;\n anchor.download = filename;\n anchor.style.display = 'none';\n this.doc.body.appendChild(anchor);\n anchor.click();\n return true;\n } catch {\n return false;\n } finally {\n anchor?.remove();\n if (url) urlApi.revokeObjectURL(url);\n }\n }\n}\n","import { Signal, WritableSignal } from '@angular/core';\nimport { AgridControl, HistoryEntry } from '../agrid-control';\nimport { AgridDataSource } from '../agrid-datasource';\nimport { CellPosition, ColDef, GridEditEvent, GridItem } from '../agrid.types';\nimport { getDisplayForField, isDataRowItem } from '../agrid.utils';\n\n/** Rectangular selection represented by source row and visible column positions. @internal */\nexport type CellRange = { anchor: CellPosition; focus: CellPosition };\n\ntype VisibleCellBounds = {\n rowStart: number;\n rowEnd: number;\n colStart: number;\n colEnd: number;\n};\n\n/** Dependencies and callbacks required by {@link AgridClipboardHandler}. @internal */\nexport interface AgridClipboardHandlerOptions {\n control: Signal<AgridControl | null>;\n dataSource: Signal<AgridDataSource>;\n filteredItems: Signal<GridItem[]>;\n visibleColDefs: Signal<ColDef[]>;\n locale: Signal<string>;\n selectedCell: WritableSignal<CellPosition | null>;\n selectedRange: WritableSignal<CellRange | null>;\n markedRowIndices: Signal<ReadonlySet<number>>;\n isCellEditable: (col: ColDef, originalIndex: number) => boolean;\n onCellEdit: (event: GridEditEvent) => void;\n scrollToCell: (displayIndex: number, colIndex: number) => void;\n}\n\n/** Handles selection serialization and spreadsheet-style clipboard paste operations. @internal */\nexport class AgridClipboardHandler {\n constructor(private readonly opts: AgridClipboardHandlerOptions) {}\n\n /** Writes the current cell or range selection to a clipboard event as TSV. */\n copy(event: ClipboardEvent): void {\n const text = this.getSelectedTsv();\n if (!text) return;\n event.clipboardData?.setData('text/plain', text);\n event.preventDefault();\n }\n\n /** Reads plain text from a clipboard event and pastes it at the selection. */\n paste(event: ClipboardEvent): void {\n const text = event.clipboardData?.getData('text/plain');\n if (!text || !this.opts.selectedCell()) return;\n event.preventDefault();\n this.pasteTextAtSelection(text);\n }\n\n /** Serializes the current cell or range selection as tab-separated text. */\n getSelectedTsv(): string {\n const bounds = this.getVisibleRangeBounds();\n const selected = this.opts.selectedCell();\n const marked = this.opts.markedRowIndices();\n if (!bounds && !selected && marked.size === 0) return '';\n\n const rowStart = bounds?.rowStart ?? (\n selected ? this.findDisplayIndex(selected.rowIndex) : -1\n );\n const rowEnd = bounds?.rowEnd ?? rowStart;\n const colStart = bounds?.colStart ?? selected?.colIndex ?? 0;\n const colEnd = bounds?.colEnd ?? selected?.colIndex\n ?? this.opts.visibleColDefs().length - 1;\n const rows = this.opts.filteredItems();\n const cols = this.opts.visibleColDefs();\n const dataRows = this.opts.dataSource().rows();\n const lines: string[] = [];\n const copiedIndices = new Set<number>();\n\n if (rowStart >= 0) {\n for (let displayIndex = rowStart; displayIndex <= rowEnd; displayIndex++) {\n const item = rows[displayIndex];\n if (!isDataRowItem(item)) continue;\n lines.push(this.serializeRow(item.row, cols, colStart, colEnd));\n copiedIndices.add(item.originalIndex);\n }\n }\n\n for (const originalIndex of [...marked].sort((a, b) => a - b)) {\n if (copiedIndices.has(originalIndex)) continue;\n const row = dataRows[originalIndex];\n if (!row) continue;\n lines.push(this.serializeRow(row, cols, colStart, colEnd));\n }\n\n return lines.join('\\n');\n }\n\n private serializeRow(\n row: Record<string, unknown>,\n cols: ColDef[],\n colStart: number,\n colEnd: number,\n ): string {\n const cells: string[] = [];\n for (let colIndex = colStart; colIndex <= colEnd; colIndex++) {\n const col = cols[colIndex];\n if (!col) continue;\n cells.push(this.escapeTsvValue(\n getDisplayForField(col, row[col.field], this.opts.locale())\n ));\n }\n return cells.join('\\t');\n }\n\n /** Applies delimited text to editable cells beginning at the active selection. */\n pasteTextAtSelection(text: string): void {\n const bounds = this.getActiveSelectionBounds();\n if (!bounds) return;\n const start = this.positionFromVisibleCell(bounds.rowStart, bounds.colStart);\n const rows = this.parseDelimitedText(text);\n if (rows.length === 0) return;\n\n const items = this.opts.filteredItems();\n const cols = this.opts.visibleColDefs();\n const dataSource = this.opts.dataSource();\n let lastPosition = start;\n const historyEntries: HistoryEntry[] = [];\n\n for (let rowOffset = 0; rowOffset < rows.length; rowOffset++) {\n const item = items[bounds.rowStart + rowOffset];\n if (!isDataRowItem(item)) continue;\n for (let colOffset = 0; colOffset < rows[rowOffset].length; colOffset++) {\n const colIndex = start.colIndex + colOffset;\n const col = cols[colIndex];\n if (!col || !this.opts.isCellEditable(col, item.originalIndex)) continue;\n const oldValue = dataSource.getRow(item.originalIndex)[col.field];\n const newValue = this.coercePastedValue(rows[rowOffset][colOffset], col);\n if (oldValue === newValue) continue;\n\n dataSource.patchRow(item.originalIndex, { [col.field]: newValue });\n const edit = {\n rowIndex: item.originalIndex,\n field: col.field,\n oldValue,\n newValue,\n };\n historyEntries.push(edit);\n this.opts.onCellEdit({\n position: { rowIndex: item.originalIndex, colIndex },\n field: col.field,\n oldValue,\n newValue,\n });\n lastPosition = { rowIndex: item.originalIndex, colIndex };\n }\n }\n\n this.opts.control()?.pushEditBatch(historyEntries);\n this.opts.selectedRange.set({ anchor: start, focus: lastPosition });\n this.opts.selectedCell.set(lastPosition);\n this.opts.scrollToCell(this.findDisplayIndex(lastPosition.rowIndex), lastPosition.colIndex);\n }\n\n private getVisibleRangeBounds(): VisibleCellBounds | null {\n const range = this.opts.selectedRange();\n if (!range) return null;\n const anchorDisplayIndex = this.findDisplayIndex(range.anchor.rowIndex);\n const focusDisplayIndex = this.findDisplayIndex(range.focus.rowIndex);\n if (anchorDisplayIndex < 0 || focusDisplayIndex < 0) return null;\n return {\n rowStart: Math.min(anchorDisplayIndex, focusDisplayIndex),\n rowEnd: Math.max(anchorDisplayIndex, focusDisplayIndex),\n colStart: Math.min(range.anchor.colIndex, range.focus.colIndex),\n colEnd: Math.max(range.anchor.colIndex, range.focus.colIndex),\n };\n }\n\n private getActiveSelectionBounds(): VisibleCellBounds | null {\n const range = this.getVisibleRangeBounds();\n if (range) return range;\n const selected = this.opts.selectedCell();\n if (!selected) return null;\n const displayIndex = this.findDisplayIndex(selected.rowIndex);\n if (displayIndex < 0) return null;\n return {\n rowStart: displayIndex,\n rowEnd: displayIndex,\n colStart: selected.colIndex,\n colEnd: selected.colIndex,\n };\n }\n\n private findDisplayIndex(originalIndex: number): number {\n return this.opts.filteredItems().findIndex(\n item => isDataRowItem(item) && item.originalIndex === originalIndex\n );\n }\n\n private positionFromVisibleCell(displayIndex: number, colIndex: number): CellPosition {\n const item = this.opts.filteredItems()[displayIndex];\n if (isDataRowItem(item)) return { rowIndex: item.originalIndex, colIndex };\n return this.opts.selectedCell() ?? { rowIndex: 0, colIndex };\n }\n\n private escapeTsvValue(value: string): string {\n return /[\"\\t\\n\\r]/.test(value) ? `\"${value.replace(/\"/g, '\"\"')}\"` : value;\n }\n\n private parseDelimitedText(text: string): string[][] {\n const normalized = text.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n').replace(/\\n$/, '');\n const delimiter = normalized.includes('\\t') ? '\\t' : ',';\n const rows: string[][] = [];\n let row: string[] = [];\n let cell = '';\n let quoted = false;\n\n for (let i = 0; i < normalized.length; i++) {\n const char = normalized[i];\n if (quoted) {\n if (char === '\"' && normalized[i + 1] === '\"') {\n cell += '\"';\n i++;\n } else if (char === '\"') {\n quoted = false;\n } else {\n cell += char;\n }\n } else if (char === '\"') {\n quoted = true;\n } else if (char === delimiter) {\n row.push(cell);\n cell = '';\n } else if (char === '\\n') {\n row.push(cell);\n rows.push(row);\n row = [];\n cell = '';\n } else {\n cell += char;\n }\n }\n\n row.push(cell);\n rows.push(row);\n return rows.filter(values => values.length > 1 || values[0] !== '');\n }\n\n private coercePastedValue(value: string, col: ColDef): unknown {\n if (col.values?.length) {\n const match = col.values.find(option =>\n typeof option === 'string'\n ? option === value\n : option.label === value || String(option.value) === value\n );\n if (match !== undefined) return typeof match === 'string' ? match : match.value;\n }\n if (col.type === 'number') {\n const numberValue = Number(value);\n return value.trim() === '' || Number.isNaN(numberValue) ? value : numberValue;\n }\n return value;\n }\n}\n","import { Signal, computed } from '@angular/core';\nimport { AgridControl } from '../agrid-control';\nimport { ColDef, HeaderGroup } from '../agrid.types';\n\n/** One contiguous segment in the optional grouped-header row. @internal */\nexport interface AgridHeaderGroupRun {\n key: string;\n id: string | null;\n label: string;\n fields: string[];\n span: number;\n}\n\n/** Reactive inputs required by {@link AgridColumnLayoutModel}. @internal */\nexport interface AgridColumnLayoutOptions {\n control: Signal<AgridControl | null>;\n colDefs: Signal<ColDef[]>;\n headerGroups: Signal<HeaderGroup[]>;\n showControlColumn: Signal<boolean>;\n controlColumnWidth: Signal<number>;\n getColumnWidth: (col: ColDef) => number;\n getColumnWidthToken: (col: ColDef) => string;\n}\n\n/**\n * Computes visible, ordered, pinned, and scrollable columns plus pane dimensions.\n * @internal\n */\nexport class AgridColumnLayoutModel {\n constructor(private readonly opts: AgridColumnLayoutOptions) {}\n\n /** Columns visible after hidden state, ordering, and left-pinning are applied. */\n readonly visibleColDefs = computed(() => {\n const control = this.opts.control();\n let columns = control\n ? this.opts.colDefs().filter(col => !control.hiddenColumns().has(col.field))\n : this.opts.colDefs().filter(col => !col.hidden);\n\n if (control) {\n const order = control.columnOrder();\n if (order.length > 0) {\n const orderMap = new Map(order.map((field, index) => [field, index]));\n columns = [...columns].sort((a, b) =>\n (orderMap.get(a.field) ?? Infinity) - (orderMap.get(b.field) ?? Infinity)\n );\n }\n const pinned = control.pinnedColumns();\n if (pinned.size > 0) {\n columns = [\n ...columns.filter(col => pinned.has(col.field)),\n ...columns.filter(col => !pinned.has(col.field)),\n ];\n }\n } else {\n const pinned = columns.filter(col => col.pinned === 'left');\n if (pinned.length > 0) {\n columns = [...pinned, ...columns.filter(col => col.pinned !== 'left')];\n }\n }\n return columns;\n });\n\n /** Visible columns pinned to the left edge. */\n readonly pinnedColDefs = computed(() => {\n const control = this.opts.control();\n if (control) {\n const pinned = control.pinnedColumns();\n return pinned.size > 0\n ? this.visibleColDefs().filter(col => pinned.has(col.field))\n : [];\n }\n return this.visibleColDefs().filter(col => col.pinned === 'left');\n });\n\n /** Visible columns pinned to the right edge. */\n readonly rightPinnedColDefs = computed(() => {\n const control = this.opts.control();\n if (control) {\n const pinned = control.pinnedRightColumns();\n return pinned.size > 0\n ? this.visibleColDefs().filter(col => pinned.has(col.field))\n : [];\n }\n return this.visibleColDefs().filter(col => col.pinned === 'right');\n });\n\n /** Visible columns rendered in the horizontally scrollable pane. */\n readonly scrollableColDefs = computed(() => {\n const left = new Set(this.pinnedColDefs().map(col => col.field));\n const right = new Set(this.rightPinnedColDefs().map(col => col.field));\n return this.visibleColDefs().filter(col => !left.has(col.field) && !right.has(col.field));\n });\n\n readonly hasPinnedPane = computed(() =>\n this.opts.showControlColumn() || this.pinnedColDefs().length > 0\n );\n readonly hasRightPinnedPane = computed(() => this.rightPinnedColDefs().length > 0);\n readonly hasFilterableColumns = computed(() =>\n this.visibleColDefs().some(col => col.filterable)\n );\n readonly hasHeaderGroups = computed(() =>\n this.visibleColDefs().some(col => this.groupLabel(col.group) !== null)\n );\n\n readonly pinnedHeaderGroupRuns = computed(() =>\n this.buildHeaderGroupRuns(this.pinnedColDefs(), 'left')\n );\n readonly scrollableHeaderGroupRuns = computed(() =>\n this.buildHeaderGroupRuns(this.scrollableColDefs(), 'center')\n );\n readonly rightHeaderGroupRuns = computed(() =>\n this.buildHeaderGroupRuns(this.rightPinnedColDefs(), 'right')\n );\n\n readonly gridTemplateColumns = computed(() => {\n const columns = this.widthTokens(this.visibleColDefs());\n return this.opts.showControlColumn()\n ? `${this.opts.controlColumnWidth()}px ${columns}`\n : columns;\n });\n\n readonly pinnedGridTemplateColumns = computed(() => {\n const columns = this.widthTokens(this.pinnedColDefs());\n if (this.opts.showControlColumn()) {\n const controlWidth = `${this.opts.controlColumnWidth()}px`;\n return columns ? `${controlWidth} ${columns}` : controlWidth;\n }\n return columns;\n });\n\n readonly scrollableGridTemplateColumns = computed(() =>\n this.widthTokens(this.scrollableColDefs())\n );\n readonly rightGridTemplateColumns = computed(() =>\n this.widthTokens(this.rightPinnedColDefs())\n );\n\n readonly totalWidth = computed(() =>\n this.width(this.visibleColDefs())\n + (this.opts.showControlColumn() ? this.opts.controlColumnWidth() : 0)\n );\n readonly pinnedPaneWidth = computed(() =>\n this.width(this.pinnedColDefs())\n + (this.opts.showControlColumn() ? this.opts.controlColumnWidth() : 0)\n );\n readonly rightPinnedPaneWidth = computed(() => this.width(this.rightPinnedColDefs()));\n readonly scrollableTotalWidth = computed(() => this.width(this.scrollableColDefs()));\n\n private width(columns: ColDef[]): number {\n return columns.reduce((sum, col) => sum + this.opts.getColumnWidth(col), 0);\n }\n\n private widthTokens(columns: ColDef[]): string {\n return columns.map(col => this.opts.getColumnWidthToken(col)).join(' ');\n }\n\n private buildHeaderGroupRuns(columns: ColDef[], pane: string): AgridHeaderGroupRun[] {\n const runs: AgridHeaderGroupRun[] = [];\n for (const col of columns) {\n const label = this.groupLabel(col.group);\n const id = label === null ? null : col.group ?? null;\n const previous = runs[runs.length - 1];\n if (id !== null && previous?.id === id) {\n previous.fields.push(col.field);\n previous.span++;\n continue;\n }\n runs.push({\n key: `${pane}:${col.field}`,\n id,\n label: label ?? '',\n fields: [col.field],\n span: 1,\n });\n }\n return runs;\n }\n\n private groupLabel(groupId: string | undefined): string | null {\n if (!groupId) return null;\n return this.opts.headerGroups().find(group => group.id === groupId)?.label ?? null;\n }\n}\n","/** Built-in locale identifiers supplied by the grid. */\nexport type AgridLocaleKey = 'en' | 'de';\n\n/** Complete set of user-facing strings and label factories used by the grid. */\nexport interface AgridLocaleText {\n actions: string;\n addRow: string;\n aggregate: string;\n aggregateAvg: string;\n aggregateCount: string;\n aggregateMax: string;\n aggregateMin: string;\n aggregateSum: string;\n autosizeColumn: string;\n blank: string;\n clearAllFilters: string;\n clearFilter: string;\n clearSort: string;\n close: string;\n columnMenu: string;\n columns: string;\n detail: string;\n toggleDetail: string;\n hiddenColumn: string;\n filterCondition: string;\n filterConditionMenu: string;\n filterValue: string;\n filterNoCondition: string;\n filterOpEquals: string;\n filterOpNotEquals: string;\n filterOpGreater: string;\n filterOpGreaterEqual: string;\n filterOpLess: string;\n filterOpLessEqual: string;\n filterOpBetween: string;\n filterOpBefore: string;\n filterOpAfter: string;\n filterOpOn: string;\n filterOpLike: string;\n filterOpStartsWith: string;\n filterOpEndsWith: string;\n filterOpIncludes: string;\n filterOpNotIncludes: string;\n copyCellValue: string;\n copyRow: string;\n confirmDeleteRow: string;\n confirmNo: string;\n confirmYes: string;\n deleteRow: string;\n filterPlaceholder: string;\n findPlaceholder: string;\n firstPage: string;\n grid: string;\n groupBy: (header: string) => string;\n hideColumn: string;\n insertRowAbove: string;\n insertRowBelow: string;\n lastPage: string;\n loading: string;\n markRow: string;\n next: string;\n noRows: string;\n pagination: string;\n pinColumn: string;\n pinColumnRight: string;\n unpinColumnRight: string;\n pinRowTop: string;\n pinRowBottom: string;\n unpinRow: string;\n previous: string;\n resizeColumn: string;\n rows: (count: number) => string;\n quickFilterPlaceholder: string;\n searchValuesPlaceholder: string;\n selectAll: string;\n sortOnlyByThis: string;\n sortAscending: string;\n sortDescending: string;\n ungroup: string;\n unpinColumn: string;\n save: string;\n}\n\n/** Partial locale text supplied to {@link AgridProvider.addLocalization}. */\nexport type AgridLocaleTextOverrides = Partial<AgridLocaleText>;\n\n/** Built-in English and German grid translations. */\nexport const AGRID_LOCALE_TEXT: Record<AgridLocaleKey, AgridLocaleText> = {\n en: {\n actions: 'Actions',\n addRow: 'Add row',\n aggregate: 'Aggregate',\n aggregateAvg: 'Average',\n aggregateCount: 'Count',\n aggregateMax: 'Maximum',\n aggregateMin: 'Minimum',\n aggregateSum: 'Sum',\n autosizeColumn: 'Autosize column',\n blank: '(blank)',\n clearAllFilters: 'Clear all filters',\n clearFilter: 'Clear filter',\n clearSort: 'Clear sort',\n close: 'Close',\n columnMenu: 'Column menu',\n columns: 'Columns',\n detail: 'Detail',\n toggleDetail: 'Toggle detail panel',\n hiddenColumn: '(hidden)',\n filterCondition: 'Condition',\n filterConditionMenu: 'Filter condition',\n filterValue: 'Value',\n filterNoCondition: 'No condition',\n filterOpEquals: 'Equals',\n filterOpNotEquals: 'Not equal',\n filterOpGreater: 'Greater than',\n filterOpGreaterEqual: 'Greater or equal',\n filterOpLess: 'Less than',\n filterOpLessEqual: 'Less or equal',\n filterOpBetween: 'Between',\n filterOpBefore: 'Before',\n filterOpAfter: 'After',\n filterOpOn: 'On',\n filterOpLike: 'Like (% and _ wildcards)',\n filterOpStartsWith: 'Starts with',\n filterOpEndsWith: 'Ends with',\n filterOpIncludes: 'Includes',\n filterOpNotIncludes: 'Does not include',\n copyCellValue: 'Copy cell',\n copyRow: 'Copy row',\n confirmDeleteRow: 'Sure to delete?',\n confirmNo: 'No',\n confirmYes: 'Yes',\n deleteRow: 'Delete row',\n filterPlaceholder: 'Filter...',\n findPlaceholder: 'Find',\n firstPage: 'First page',\n grid: 'Data grid',\n groupBy: header => `Group by ${header}`,\n hideColumn: 'Hide column',\n insertRowAbove: 'Insert row above',\n insertRowBelow: 'Insert row below',\n lastPage: 'Last page',\n loading: 'Loading...',\n markRow: 'Mark row for copying',\n next: 'Next',\n noRows: 'No rows to display',\n pagination: 'Pagination',\n pinColumn: 'Pin left',\n pinColumnRight: 'Pin right',\n unpinColumnRight: 'Unpin right',\n pinRowTop: 'Pin row to top',\n pinRowBottom: 'Pin row to bottom',\n unpinRow: 'Unpin row',\n previous: 'Previous',\n resizeColumn: 'Resize column',\n rows: count => `${count} ${count === 1 ? 'row' : 'rows'}`,\n quickFilterPlaceholder: 'Search all columns...',\n searchValuesPlaceholder: 'Search values...',\n selectAll: '(Select All)',\n sortOnlyByThis: 'Sort only by this column',\n sortAscending: 'Sort ascending',\n sortDescending: 'Sort descending',\n ungroup: 'Ungroup',\n unpinColumn: 'Unpin column',\n save: 'Save',\n },\n de: {\n actions: 'Aktionen',\n addRow: 'Zeile hinzufügen',\n aggregate: 'Aggregat',\n aggregateAvg: 'Durchschnitt',\n aggregateCount: 'Anzahl',\n aggregateMax: 'Maximum',\n aggregateMin: 'Minimum',\n aggregateSum: 'Summe',\n autosizeColumn: 'Spaltenbreite anpassen',\n blank: '(leer)',\n clearAllFilters: 'Alle Filter löschen',\n clearFilter: 'Filter löschen',\n clearSort: 'Sortierung löschen',\n close: 'Schließen',\n columnMenu: 'Spaltenmenü',\n columns: 'Spalten',\n detail: 'Details',\n toggleDetail: 'Detailbereich umschalten',\n hiddenColumn: '(ausgeblendet)',\n filterCondition: 'Bedingung',\n filterConditionMenu: 'Filterbedingung',\n filterValue: 'Wert',\n filterNoCondition: 'Keine Bedingung',\n filterOpEquals: 'Gleich',\n filterOpNotEquals: 'Ungleich',\n filterOpGreater: 'Größer als',\n filterOpGreaterEqual: 'Größer oder gleich',\n filterOpLess: 'Kleiner als',\n filterOpLessEqual: 'Kleiner oder gleich',\n filterOpBetween: 'Zwischen',\n filterOpBefore: 'Vor',\n filterOpAfter: 'Nach',\n filterOpOn: 'Am',\n filterOpLike: 'Wie (% und _ Platzhalter)',\n filterOpStartsWith: 'Beginnt mit',\n filterOpEndsWith: 'Endet mit',\n filterOpIncludes: 'Enthält',\n filterOpNotIncludes: 'Enthält nicht',\n copyCellValue: 'Zelle kopieren',\n copyRow: 'Zeile kopieren',\n confirmDeleteRow: 'Wirklich löschen?',\n confirmNo: 'Nein',\n confirmYes: 'Ja',\n deleteRow: 'Zeile löschen',\n filterPlaceholder: 'Filtern...',\n findPlaceholder: 'Suchen',\n firstPage: 'Erste Seite',\n grid: 'Datentabelle',\n groupBy: header => `Nach ${header} gruppieren`,\n hideColumn: 'Spalte ausblenden',\n insertRowAbove: 'Zeile darüber einfügen',\n insertRowBelow: 'Zeile darunter einfügen',\n lastPage: 'Letzte Seite',\n loading: 'Wird geladen...',\n markRow: 'Zeile zum Kopieren markieren',\n next: 'Weiter',\n noRows: 'Keine Zeilen vorhanden',\n pagination: 'Seitennavigation',\n pinColumn: 'Links fixieren',\n pinColumnRight: 'Rechts fixieren',\n unpinColumnRight: 'Rechts lösen',\n pinRowTop: 'Zeile oben fixieren',\n pinRowBottom: 'Zeile unten fixieren',\n unpinRow: 'Zeilenfixierung lösen',\n previous: 'Zurück',\n resizeColumn: 'Spaltenbreite ändern',\n rows: count => `${count} ${count === 1 ? 'Zeile' : 'Zeilen'}`,\n quickFilterPlaceholder: 'Alle Spalten durchsuchen...',\n searchValuesPlaceholder: 'Werte suchen...',\n selectAll: '(Alle auswählen)',\n sortOnlyByThis: 'Nur nach dieser Spalte sortieren',\n sortAscending: 'Aufsteigend sortieren',\n sortDescending: 'Absteigend sortieren',\n ungroup: 'Gruppierung aufheben',\n unpinColumn: 'Fixierung lösen',\n save: 'Speichern',\n },\n};\n\n/** Resolves 'auto' to the browser's navigator.language, falling back to 'en-US'. */\nexport function resolveLocale(locale: string): string {\n if (locale !== 'auto') return locale;\n return (typeof navigator !== 'undefined' ? navigator.language : null) ?? 'en-US';\n}\n\n/**\n * Resolves built-in locale text and merges the best matching custom overrides.\n *\n * Matching prefers an exact locale key, then a primary-language match.\n */\nexport function resolveAgridLocaleText(\n locale: string | undefined,\n localizations: ReadonlyMap<string, AgridLocaleTextOverrides>,\n): AgridLocaleText {\n const resolved = resolveLocale(locale ?? 'auto');\n const normalized = resolved.toLowerCase();\n const primaryTag = normalized.split('-')[0];\n\n const base = normalized.startsWith('de') ? AGRID_LOCALE_TEXT.de : AGRID_LOCALE_TEXT.en;\n\n // Prefer exact match (case-insensitive), fall back to primary-language match (e.g. 'fr' matches 'fr-FR')\n let overrides: AgridLocaleTextOverrides | undefined;\n for (const [key, value] of localizations) {\n const k = key.toLowerCase();\n if (k === normalized) { overrides = value; break; }\n if (!overrides && k.split('-')[0] === primaryTag) { overrides = value; }\n }\n\n return { ...base, ...overrides };\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n afterNextRender,\n computed,\n effect,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { AgridLocaleText, AGRID_LOCALE_TEXT } from '../agrid-localization';\nimport { FilterOperator } from '../agrid-control';\nimport { AgridBrowserAdapter } from '../infrastructure/agrid-browser.adapter';\n\n/** Clamp a floating menu so it remains inside the browser viewport. @internal */\nexport function fitColumnMenuToViewport(\n x: number,\n y: number,\n width: number,\n height: number,\n viewportWidth: number,\n viewportHeight: number,\n margin = 8,\n): { x: number; y: number } {\n return {\n x: Math.max(margin, Math.min(x, viewportWidth - width - margin)),\n y: Math.max(margin, Math.min(y, viewportHeight - height - margin)),\n };\n}\n\n/** Display model for one value-filter option in the column menu. */\nexport interface AgridColumnMenuValueItem {\n /** Human-readable value label shown in the menu. */\n label: string;\n /** Raw value string used by the filter state. */\n rawStr: string;\n /** Whether this value is present in the current cross-filtered row set. */\n active: boolean;\n /** Whether this value is currently selected in the value filter. */\n selected: boolean;\n}\n\n/** Floating column menu for sort, column actions, grouping, and value filters. */\n@Component({\n selector: 'agrid-column-menu',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './agrid-column-menu.component.html',\n styleUrl: './agrid-column-menu.component.css',\n})\nexport class AgridColumnMenuComponent {\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly destroyRef = inject(DestroyRef);\n private readonly browser = new AgridBrowserAdapter();\n private resizeObserver: ResizeObserver | null = null;\n\n /** Localized labels used in the menu. */\n localeText = input<AgridLocaleText>(AGRID_LOCALE_TEXT.en);\n\n /** Fixed viewport x-position for the menu. */\n x = input.required<number>();\n\n /** Fixed viewport y-position for the menu. */\n y = input.required<number>();\n\n /** Viewport-fitted coordinates used by the rendered menu. */\n readonly position = signal({ x: 0, y: 0 });\n\n /** Header label for the active column. */\n header = input.required<string>();\n\n /** Current sort direction for the active column. */\n sortDir = input<'asc' | 'desc' | null>(null);\n\n /** Whether sort controls are available for this grid. */\n sortable = input<boolean>(true);\n\n /** Whether stateful column actions should be shown. */\n showColumnActions = input<boolean>(false);\n\n /** Current pin state of the active column. */\n pinned = input<'left' | 'right' | false>(false);\n\n /** Whether the active column supports grouping. */\n groupable = input<boolean>(false);\n\n /** Whether the grid is currently grouped by the active column. */\n grouped = input<boolean>(false);\n\n /** Whether the active column supports value-filter controls. */\n filterable = input<boolean>(false);\n\n /** Whether to show the Excel-style distinct-value picker. */\n showValueFilter = input<boolean>(true);\n\n /** Condition-filter input type for the active column, or `null` to hide the condition UI. */\n filterType = input<'text' | 'number' | 'date' | null>(null);\n\n /** Current condition operator, or `null` when none is selected. */\n operator = input<FilterOperator | null>(null);\n\n /** Current primary condition operand. */\n operand = input<string>('');\n\n /** Current secondary condition operand (used by `between`). */\n operand2 = input<string>('');\n\n /** Emits the selected condition operator, or `null` to clear it. */\n operatorChange = output<FilterOperator | null>();\n\n /** Emits the primary condition operand text. */\n operandChange = output<string>();\n\n /** Emits the secondary condition operand text (used by `between`). */\n operand2Change = output<string>();\n\n /** Current search text for the value-filter option list. */\n search = input<string>('');\n\n /** Whether the value filter currently allows every value. */\n allSelected = input<boolean>(true);\n\n /** Visible value-filter option rows. */\n valueItems = input<AgridColumnMenuValueItem[]>([]);\n\n /** 1-based priority of this column in the current multi-sort stack (0 = not sorted). */\n sortPriority = input<number>(0);\n\n /** Whether more than one column is currently sorted. */\n hasMultiSort = input<boolean>(false);\n\n /**\n * Emits a sort direction — toggles this column in the multi-sort stack\n * (adds if not sorted, clears if same direction clicked again).\n */\n sort = output<'asc' | 'desc'>();\n\n /** Emits to replace all sorts with only this column at the given direction. */\n resetSort = output<'asc' | 'desc'>();\n\n /** Requests autosizing the active column. */\n autosize = output<void>();\n\n /** Requests toggling left-pin for the active column. */\n togglePin = output<void>();\n\n /** Requests toggling right-pin for the active column. */\n togglePinRight = output<void>();\n\n /** Requests hiding the active column. */\n hide = output<void>();\n\n /** Requests toggling grouping for the active column. */\n toggleGroup = output<void>();\n\n /** Requests clearing filter and sort state for the active column. */\n clearFilter = output<void>();\n\n /** Requests clearing filter and sort state for every column. */\n clearAll = output<void>();\n\n /** Emits value-filter search text changes. */\n searchChange = output<string>();\n\n /** Requests selecting or deselecting all value-filter options. */\n toggleAll = output<void>();\n\n /** Requests toggling one value-filter option by raw string value. */\n toggleValue = output<string>();\n\n /** Active aggregate function for this column set via the control, or `null` if none. */\n aggregate = input<'sum' | 'avg' | 'min' | 'max' | 'count' | null>(null);\n\n /** Emits the aggregate to set, or `null` to clear it. */\n setAggregate = output<'sum' | 'avg' | 'min' | 'max' | 'count' | null>();\n\n readonly aggregateOptions = computed(() => {\n const t = this.localeText();\n return [\n { value: 'sum' as const, symbol: 'Σ', label: t.aggregateSum },\n { value: 'avg' as const, symbol: 'Ø', label: t.aggregateAvg },\n { value: 'min' as const, symbol: '↓', label: t.aggregateMin },\n { value: 'max' as const, symbol: '↑', label: t.aggregateMax },\n { value: 'count' as const, symbol: '#', label: t.aggregateCount },\n ];\n });\n\n /** Condition operators offered for the active column, labeled per column type. */\n readonly operatorOptions = computed<{ value: FilterOperator; label: string }[]>(() => {\n const t = this.localeText();\n if (this.filterType() === 'date') {\n return [\n { value: 'eq', label: t.filterOpOn },\n { value: 'lt', label: t.filterOpBefore },\n { value: 'gt', label: t.filterOpAfter },\n { value: 'between', label: t.filterOpBetween },\n ];\n }\n if (this.filterType() === 'text') {\n return [\n { value: 'eq', label: t.filterOpEquals },\n { value: 'neq', label: t.filterOpNotEquals },\n { value: 'like', label: t.filterOpLike },\n { value: 'startsWith', label: t.filterOpStartsWith },\n { value: 'endsWith', label: t.filterOpEndsWith },\n { value: 'includes', label: t.filterOpIncludes },\n { value: 'notIncludes', label: t.filterOpNotIncludes },\n ];\n }\n return [\n { value: 'eq', label: t.filterOpEquals },\n { value: 'neq', label: t.filterOpNotEquals },\n { value: 'gt', label: t.filterOpGreater },\n { value: 'gte', label: t.filterOpGreaterEqual },\n { value: 'lt', label: t.filterOpLess },\n { value: 'lte', label: t.filterOpLessEqual },\n { value: 'between', label: t.filterOpBetween },\n ];\n });\n\n /** Native input type for operand fields (date columns use a date picker). */\n readonly operandInputType = computed(() =>\n this.filterType() === 'date' ? 'date' : this.filterType() === 'number' ? 'number' : 'text',\n );\n\n constructor() {\n effect(() => {\n this.position.set({ x: this.x(), y: this.y() });\n this.scheduleViewportFit();\n });\n\n afterNextRender(() => {\n const menu = this.menuElement();\n this.fitToViewport();\n if (menu && typeof ResizeObserver !== 'undefined') {\n this.resizeObserver = new ResizeObserver(() => this.fitToViewport());\n this.resizeObserver.observe(menu);\n }\n });\n\n this.destroyRef.onDestroy(() => this.resizeObserver?.disconnect());\n }\n\n private scheduleViewportFit(): void {\n setTimeout(() => this.fitToViewport());\n }\n\n private fitToViewport(): void {\n const menu = this.menuElement();\n if (!menu || !this.browser.available) return;\n const rect = menu.getBoundingClientRect();\n this.position.set(fitColumnMenuToViewport(\n this.x(),\n this.y(),\n rect.width,\n rect.height,\n this.browser.viewportWidth(),\n this.browser.viewportHeight(),\n ));\n }\n\n private menuElement(): HTMLElement | null {\n return this.elementRef.nativeElement.querySelector<HTMLElement>('.ag-filter-menu');\n }\n}\n","<div\n class=\"ag-filter-menu\"\n role=\"dialog\"\n [attr.aria-label]=\"localeText().columnMenu + ': ' + header()\"\n [style.left.px]=\"position().x\"\n [style.top.px]=\"position().y\"\n (click)=\"$event.stopPropagation()\"\n>\n @if (sortable()) {\n <div class=\"ag-filter-menu-section\">\n <button\n class=\"ag-filter-menu-item\"\n [class.ag-filter-menu-item--active]=\"sortDir() === 'asc'\"\n (click)=\"sort.emit('asc')\"\n >\n ↑ {{ localeText().sortAscending }}\n @if (sortPriority() > 0) {\n <span class=\"ag-sort-priority-badge\">{{ sortPriority() }}</span>\n }\n </button>\n <button\n class=\"ag-filter-menu-item\"\n [class.ag-filter-menu-item--active]=\"sortDir() === 'desc'\"\n (click)=\"sort.emit('desc')\"\n >\n ↓ {{ localeText().sortDescending }}\n @if (sortPriority() > 0) {\n <span class=\"ag-sort-priority-badge\">{{ sortPriority() }}</span>\n }\n </button>\n @if (hasMultiSort() && sortPriority() > 0) {\n <button class=\"ag-filter-menu-item ag-filter-menu-item--muted\" (click)=\"resetSort.emit(sortDir()!)\">{{ localeText().sortOnlyByThis }}</button>\n }\n @if (sortDir()) {\n <button class=\"ag-filter-menu-item\" (click)=\"sort.emit(sortDir()!)\">{{ localeText().clearSort }}</button>\n }\n </div>\n }\n\n @if (showColumnActions()) {\n <div class=\"ag-filter-menu-section ag-filter-menu-section--border\">\n <button class=\"ag-filter-menu-item\" (click)=\"autosize.emit()\">↔ {{ localeText().autosizeColumn }}</button>\n <button\n class=\"ag-filter-menu-item\"\n [class.ag-filter-menu-item--active]=\"pinned() === 'left'\"\n (click)=\"togglePin.emit()\"\n >⊣ {{ pinned() === 'left' ? localeText().unpinColumn : localeText().pinColumn }}</button>\n <button\n class=\"ag-filter-menu-item\"\n [class.ag-filter-menu-item--active]=\"pinned() === 'right'\"\n (click)=\"togglePinRight.emit()\"\n >⊢ {{ pinned() === 'right' ? localeText().unpinColumnRight : localeText().pinColumnRight }}</button>\n <button class=\"ag-filter-menu-item\" (click)=\"hide.emit()\">{{ localeText().hideColumn }}</button>\n </div>\n }\n\n @if (showColumnActions()) {\n <div class=\"ag-filter-menu-section ag-filter-menu-section--border\">\n <span class=\"ag-filter-menu-aggregate-label\">{{ localeText().aggregate }}</span>\n <div class=\"ag-filter-menu-aggregate-btns\">\n @for (opt of aggregateOptions(); track opt.value) {\n <button\n class=\"ag-aggregate-btn\"\n [class.ag-aggregate-btn--active]=\"aggregate() === opt.value\"\n [title]=\"opt.label\"\n (click)=\"setAggregate.emit(aggregate() === opt.value ? null : opt.value)\"\n >{{ opt.symbol }}</button>\n }\n </div>\n </div>\n }\n\n @if (groupable()) {\n <div class=\"ag-filter-menu-section ag-filter-menu-section--border\">\n <button\n class=\"ag-filter-menu-item\"\n [class.ag-filter-menu-item--active]=\"grouped()\"\n (click)=\"toggleGroup.emit()\"\n >{{ grouped() ? '⊟ ' + localeText().ungroup : '⊞ ' + localeText().groupBy(header()) }}</button>\n </div>\n }\n\n @if (filterable()) {\n <div class=\"ag-filter-menu-section ag-filter-menu-section--border\">\n <button class=\"ag-filter-menu-item ag-filter-menu-item--muted\" (click)=\"clearFilter.emit()\">\n ✕ {{ localeText().clearFilter }}\n </button>\n <button class=\"ag-filter-menu-item ag-filter-menu-item--muted\" (click)=\"clearAll.emit()\">\n ✕ {{ localeText().clearAllFilters }}\n </button>\n </div>\n\n @if (filterType()) {\n <div class=\"ag-filter-menu-section ag-filter-menu-section--border ag-filter-menu-condition\">\n <span class=\"ag-filter-menu-aggregate-label\">{{ localeText().filterCondition }}</span>\n <div class=\"ag-filter-menu-operators\">\n <button\n type=\"button\"\n class=\"ag-filter-menu-operator-btn ag-filter-menu-operator-btn--clear\"\n [class.ag-filter-menu-operator-btn--active]=\"!operator()\"\n (click)=\"operatorChange.emit(null)\"\n >{{ localeText().filterNoCondition }}</button>\n @for (op of operatorOptions(); track op.value) {\n <button\n type=\"button\"\n class=\"ag-filter-menu-operator-btn\"\n [class.ag-filter-menu-operator-btn--active]=\"op.value === operator()\"\n (click)=\"operatorChange.emit(op.value)\"\n >{{ op.label }}</button>\n }\n </div>\n @if (operator()) {\n <label class=\"ag-filter-menu-operand-label\" for=\"agrid-filter-operand\">\n {{ localeText().filterValue }}\n </label>\n <input\n id=\"agrid-filter-operand\"\n class=\"ag-filter-menu-operand\"\n [type]=\"operandInputType()\"\n [value]=\"operand()\"\n (input)=\"operandChange.emit($any($event.target).value)\"\n (click)=\"$event.stopPropagation()\"\n />\n @if (operator() === 'between') {\n <input\n class=\"ag-filter-menu-operand\"\n [type]=\"operandInputType()\"\n [value]=\"operand2()\"\n (input)=\"operand2Change.emit($any($event.target).value)\"\n (click)=\"$event.stopPropagation()\"\n />\n }\n }\n </div>\n }\n\n @if (showValueFilter()) {\n <div class=\"ag-filter-menu-section ag-filter-menu-section--border\">\n <input\n class=\"ag-filter-menu-search\"\n [value]=\"search()\"\n (input)=\"searchChange.emit($any($event.target).value)\"\n [placeholder]=\"localeText().searchValuesPlaceholder\"\n (click)=\"$event.stopPropagation()\"\n />\n </div>\n\n <div class=\"ag-filter-menu-values\">\n <label class=\"ag-filter-menu-value\">\n <input\n type=\"checkbox\"\n [checked]=\"allSelected()\"\n (change)=\"toggleAll.emit()\"\n />\n <span class=\"ag-filter-menu-value-label\">{{ localeText().selectAll }}</span>\n </label>\n @for (item of valueItems(); track item.rawStr) {\n <label\n class=\"ag-filter-menu-value\"\n [class.ag-filter-menu-value--inactive]=\"!item.active\"\n >\n <input\n type=\"checkbox\"\n [checked]=\"item.selected\"\n [disabled]=\"!item.active\"\n (change)=\"toggleValue.emit(item.rawStr)\"\n />\n <span class=\"ag-filter-menu-value-label\">{{ item.label || localeText().blank }}</span>\n </label>\n }\n </div>\n }\n }\n</div>\n","import { DestroyRef, Signal, computed, signal } from '@angular/core';\nimport { AgridBrowserAdapter } from '../infrastructure/agrid-browser.adapter';\nimport { AgridColumnMenuValueItem } from './agrid-column-menu.component';\nimport { AgridControl, FilterOperator } from '../agrid-control';\nimport { AgridDataSource } from '../agrid-datasource';\nimport { ColDef, FilterChangeEvent, SortChangeEvent, ValueOption } from '../agrid.types';\nimport { passesConditionFilter } from '../agrid.utils';\n\n/** Position and target field of the open column menu. @internal */\nexport type AgridColumnMenuState = {\n field: string;\n x: number;\n y: number;\n};\n\n/** Dependencies and callbacks required by {@link AgridColumnMenuController}. @internal */\nexport interface AgridColumnMenuControllerOptions {\n control: Signal<AgridControl | null>;\n dataSource: Signal<AgridDataSource>;\n colDefs: Signal<ColDef[]>;\n serverSideFiltering: Signal<boolean>;\n filterDebounceMs: Signal<number>;\n sortOption: Signal<'single' | 'multi' | 'none'>;\n effectiveSortOrder: () => string[];\n autosizeColumn: (col: ColDef) => void;\n onFilterChange: (event: FilterChangeEvent) => void;\n onSortChange: (event: SortChangeEvent) => void;\n}\n\n/** Owns column-menu state, filters, sorting, and menu-triggered column mutations. @internal */\nexport class AgridColumnMenuController {\n readonly menu = signal<AgridColumnMenuState | null>(null);\n readonly search = signal('');\n\n readonly items = computed<{ label: string; rawStr: string }[]>(() => {\n const menu = this.menu();\n if (!menu) return [];\n const col = this.getColDef(menu.field);\n if (!col?.filterable) return [];\n const values = col?.values;\n if (values?.length) {\n return values\n .map(value => typeof value === 'string'\n ? { label: value, rawStr: value }\n : {\n label: (value as ValueOption).label,\n rawStr: String((value as ValueOption).value),\n })\n .sort((a, b) => a.label.localeCompare(b.label, undefined, { sensitivity: 'base' }));\n }\n\n const rows = this.opts.dataSource().rows();\n const rawValues = [...new Set(rows.map(row => String(row[menu.field] ?? '')))];\n return rawValues\n .map(rawStr => ({\n label: col?.formatter ? col.formatter(rawStr) : rawStr,\n rawStr,\n }))\n .sort((a, b) =>\n a.label.localeCompare(b.label, undefined, { numeric: true, sensitivity: 'base' }),\n );\n });\n\n readonly visibleItems = computed(() => {\n const search = this.search().toLowerCase();\n return this.items().filter(item => !search || item.label.toLowerCase().includes(search));\n });\n\n readonly activeValues = computed(() => {\n const menu = this.menu();\n if (!menu) return new Set<string>();\n const rows = this.opts.dataSource().rows();\n const control = this.opts.control();\n let indices = rows.map((_, index) => index);\n if (control) {\n for (const [field, filter] of Object.entries(control.filters())) {\n if (field === menu.field) continue;\n if (filter.text) {\n const search = filter.text.toLowerCase();\n indices = indices.filter(index =>\n String(rows[index][field] ?? '').toLowerCase().includes(search),\n );\n }\n if (filter.selectedValues !== null) {\n const allowed = new Set(filter.selectedValues);\n indices = indices.filter(index => allowed.has(String(rows[index][field] ?? '')));\n }\n if (filter.operator && filter.operand != null && filter.operand !== '') {\n const filterCol = this.getColDef(field);\n indices = indices.filter(index =>\n passesConditionFilter(filterCol, rows[index][field], filter),\n );\n }\n }\n }\n return new Set(indices.map(index => String(rows[index][menu.field] ?? '')));\n });\n\n readonly valueItems = computed<AgridColumnMenuValueItem[]>(() => {\n const menu = this.menu();\n if (!menu) return [];\n return this.visibleItems().map(item => ({\n ...item,\n active: this.activeValues().has(item.rawStr),\n selected: this.isValueSelected(menu.field, item.rawStr),\n }));\n });\n\n private readonly filterDebounces = new Map<string, ReturnType<typeof setTimeout>>();\n\n constructor(\n private readonly opts: AgridColumnMenuControllerOptions,\n destroyRef: DestroyRef,\n private readonly browser = new AgridBrowserAdapter(),\n ) {\n destroyRef.onDestroy(() => {\n for (const timer of this.filterDebounces.values()) clearTimeout(timer);\n this.filterDebounces.clear();\n });\n }\n\n /** Returns the active text filter for a field. */\n getTextFilter(field: string): string {\n return this.opts.control()?.getFilter(field).text ?? '';\n }\n\n /** Returns the condition-filter input type for a filterable field. */\n getFilterType(field: string): 'text' | 'number' | 'date' | null {\n const col = this.getColDef(field);\n if (!col?.filterable || col.type === 'boolean') return null;\n return col.type === 'number' || col.type === 'date' ? col.type : 'text';\n }\n\n /** Returns the condition operator for a field, or `null`. */\n getFilterOperator(field: string): FilterOperator | null {\n return this.opts.control()?.getFilter(field).operator ?? null;\n }\n\n /** Returns the primary condition operand for a field. */\n getFilterOperand(field: string): string {\n return this.opts.control()?.getFilter(field).operand ?? '';\n }\n\n /** Returns the secondary condition operand (used by `between`). */\n getFilterOperand2(field: string): string {\n return this.opts.control()?.getFilter(field).operand2 ?? '';\n }\n\n /** Sets the condition operator; clearing it (`null`) also drops the operands. */\n setFilterOperator(field: string, operator: FilterOperator | null): void {\n const control = this.opts.control();\n if (!control) return;\n if (!operator) {\n control.setRangeFilter(field, null, null, null);\n } else {\n const current = control.getFilter(field);\n control.setRangeFilter(field, operator, current.operand ?? '', current.operand2 ?? '');\n }\n this.emitRangeServer(field, false);\n }\n\n /** Sets the primary condition operand. */\n setFilterOperand(field: string, value: string): void {\n const control = this.opts.control();\n if (!control) return;\n const current = control.getFilter(field);\n control.setRangeFilter(field, current.operator ?? 'eq', value, current.operand2 ?? '');\n this.emitRangeServer(field, true);\n }\n\n /** Sets the secondary condition operand (used by `between`). */\n setFilterOperand2(field: string, value: string): void {\n const control = this.opts.control();\n if (!control) return;\n const current = control.getFilter(field);\n control.setRangeFilter(field, current.operator ?? 'between', current.operand ?? '', value);\n this.emitRangeServer(field, true);\n }\n\n /**\n * In server-side filtering mode, emit a {@link FilterChangeEvent} carrying the current\n * condition so the host can refetch. Operand edits are debounced; operator changes are immediate.\n * No-op in client mode (the projection layer filters locally).\n */\n private emitRangeServer(field: string, debounce: boolean): void {\n if (!this.opts.serverSideFiltering()) return;\n const emit = () => {\n const f = this.opts.control()?.getFilter(field);\n this.opts.onFilterChange({\n field,\n value: '',\n operator: f?.operator ?? null,\n operand: f?.operand ?? null,\n operand2: f?.operand2 ?? null,\n });\n };\n this.cancelFilterDebounce(field);\n const delay = this.opts.filterDebounceMs();\n if (!debounce || delay === 0) {\n emit();\n return;\n }\n this.filterDebounces.set(field, setTimeout(() => {\n this.filterDebounces.delete(field);\n emit();\n }, delay));\n }\n\n /** Returns the active sort direction, respecting disabled sorting. */\n getSort(field: string): 'asc' | 'desc' | null {\n return this.opts.sortOption() === 'none'\n ? null\n : this.opts.control()?.getFilter(field).sort ?? null;\n }\n\n /** Returns a field's one-based position in the sort stack. */\n getSortPriority(field: string): number {\n return this.opts.control()?.getSortPriority(field) ?? 0;\n }\n\n /** Returns whether multiple sort fields are currently active. */\n hasMultiSort(): boolean {\n return this.opts.sortOption() === 'multi' && this.opts.effectiveSortOrder().length > 1;\n }\n\n /** Returns whether the value filter currently includes every value. */\n isAllSelected(field: string): boolean {\n return this.opts.control()?.getFilter(field).selectedValues === null;\n }\n\n /** Returns whether a raw value survives filters on other columns. */\n isValueActive(rawStr: string): boolean {\n return this.activeValues().has(rawStr);\n }\n\n /** Returns whether a raw value is selected by the field's value filter. */\n isValueSelected(field: string, value: string): boolean {\n const selected = this.opts.control()?.getFilter(field).selectedValues;\n return selected == null || selected.includes(value);\n }\n\n /** Returns whether a field has active filter or sort state. */\n hasActiveFilter(field: string): boolean {\n return this.opts.control()?.hasActiveFilter(field) ?? false;\n }\n\n /** Updates a text filter and emits its debounced server-side event. */\n onTextFilterChange(event: Event, field: string): void {\n const value = (event.target as HTMLInputElement).value;\n this.opts.control()?.setTextFilter(field, value);\n if (!this.opts.serverSideFiltering()) return;\n\n this.cancelFilterDebounce(field);\n const delay = this.opts.filterDebounceMs();\n if (delay === 0) {\n this.opts.onFilterChange({ field, value });\n return;\n }\n this.filterDebounces.set(field, setTimeout(() => {\n this.filterDebounces.delete(field);\n this.opts.onFilterChange({ field, value });\n }, delay));\n }\n\n /** Opens the column menu at a viewport position. */\n open(event: MouseEvent, field: string): void {\n event.stopPropagation();\n this.search.set('');\n this.menu.set({\n field,\n x: Math.min(event.clientX, this.browser.viewportWidth() - 220),\n y: event.clientY,\n });\n }\n\n /** Closes the column menu. */\n close(): void {\n this.menu.set(null);\n }\n\n /** Updates the distinct-value search text. */\n setSearch(value: string): void {\n this.search.set(value);\n }\n\n /** Applies or clears a sort according to the configured sorting mode. */\n sort(field: string, direction: 'asc' | 'desc'): void {\n const control = this.opts.control();\n if (!control || this.opts.sortOption() === 'none') return;\n if (control.getFilter(field).sort === direction) {\n const previous = control.getFilter(field);\n control.clearFilter(field);\n if (previous.text) control.setTextFilter(field, previous.text);\n if (previous.selectedValues !== null) {\n control.setSelectedValues(field, previous.selectedValues);\n }\n if (previous.operator) {\n control.setRangeFilter(\n field,\n previous.operator,\n previous.operand ?? null,\n previous.operand2 ?? null,\n );\n }\n if (this.opts.serverSideFiltering()) {\n this.opts.onSortChange({ field, direction: null });\n }\n } else if (this.opts.sortOption() === 'single') {\n const previousFields = control.sortOrder().filter(sortedField => sortedField !== field);\n control.setSort(field, direction);\n if (this.opts.serverSideFiltering()) {\n for (const previousField of previousFields) {\n this.opts.onSortChange({ field: previousField, direction: null });\n }\n this.opts.onSortChange({ field, direction });\n }\n } else {\n control.addSort(field, direction);\n if (this.opts.serverSideFiltering()) {\n this.opts.onSortChange({ field, direction });\n }\n }\n this.close();\n }\n\n /** Clears filter and sort state for one field. */\n clearFilter(field: string): void {\n const control = this.opts.control();\n if (!control) return;\n this.cancelFilterDebounce(field);\n const previous = control.getFilter(field);\n control.clearFilter(field);\n if (this.opts.serverSideFiltering()) {\n if (previous.text) this.opts.onFilterChange({ field, value: '' });\n if (previous.operator) {\n this.opts.onFilterChange({ field, value: '', operator: null, operand: null, operand2: null });\n }\n if (previous.sort) this.opts.onSortChange({ field, direction: null });\n }\n this.close();\n }\n\n /** Replaces the multi-sort stack with one field and direction. */\n resetSort(field: string, direction: 'asc' | 'desc'): void {\n const control = this.opts.control();\n if (!control || this.opts.sortOption() !== 'multi') return;\n const previousFields = control.sortOrder().filter(sortedField => sortedField !== field);\n control.setSort(field, direction);\n if (this.opts.serverSideFiltering()) {\n for (const previousField of previousFields) {\n this.opts.onSortChange({ field: previousField, direction: null });\n }\n this.opts.onSortChange({ field, direction });\n }\n this.close();\n }\n\n /** Toggles grouping by a field. */\n toggleGroupBy(field: string): void {\n const control = this.opts.control();\n if (!control) return;\n control.setGroupBy(control.groupByField() === field ? null : field);\n this.close();\n }\n\n /** Clears filter and sort state for every field. */\n clearAll(): void {\n const control = this.opts.control();\n if (!control) return;\n for (const field of this.filterDebounces.keys()) this.cancelFilterDebounce(field);\n const previous = control.filters();\n control.clearAllFilters();\n if (this.opts.serverSideFiltering()) {\n for (const [field, filter] of Object.entries(previous)) {\n if (filter.text) this.opts.onFilterChange({ field, value: '' });\n if (filter.operator) {\n this.opts.onFilterChange({ field, value: '', operator: null, operand: null, operand2: null });\n }\n if (filter.sort) this.opts.onSortChange({ field, direction: null });\n }\n }\n this.close();\n }\n\n /** Selects or deselects every distinct value for a field. */\n toggleAll(field: string): void {\n const control = this.opts.control();\n if (!control) return;\n control.setSelectedValues(\n field,\n control.getFilter(field).selectedValues === null ? [] : null,\n );\n }\n\n /** Toggles one raw value in a field's value filter. */\n toggleValue(field: string, rawStr: string): void {\n const control = this.opts.control();\n if (!control) return;\n const allValues = this.items().map(item => item.rawStr);\n const current = control.getFilter(field).selectedValues ?? allValues;\n const next = current.includes(rawStr)\n ? current.filter(value => value !== rawStr)\n : [...current, rawStr];\n control.setSelectedValues(field, next.length === allValues.length ? null : next);\n }\n\n /** Toggles left pinning for a field. */\n togglePin(field: string): void {\n this.opts.control()?.togglePinned(field);\n this.close();\n }\n\n /** Toggles right pinning for a field. */\n togglePinRight(field: string): void {\n this.opts.control()?.togglePinnedRight(field);\n this.close();\n }\n\n /** Autosizes a field and closes the menu. */\n autosize(field: string): void {\n const col = this.getColDef(field);\n if (!col) return;\n this.opts.autosizeColumn(col);\n this.close();\n }\n\n /** Sets a built-in aggregate for a field. */\n setAggregate(\n field: string,\n aggregate: 'sum' | 'avg' | 'min' | 'max' | 'count' | null,\n ): void {\n this.opts.control()?.setAggregate(field, aggregate);\n this.close();\n }\n\n /** Hides a field and closes the menu. */\n hideColumn(field: string): void {\n this.opts.control()?.setColumnVisibility(field, false);\n this.close();\n }\n\n /** Toggles field visibility from the sidebar column list. */\n toggleColumnVisibility(field: string): void {\n this.opts.control()?.toggleColumnVisibility(field);\n }\n\n /** Sets visibility for several fields from a sidebar header-group toggle. */\n setColumnsVisibility(fields: string[], visible: boolean): void {\n const control = this.opts.control();\n if (!control) return;\n for (const field of fields) {\n control.setColumnVisibility(field, visible);\n }\n }\n\n private getColDef(field: string): ColDef | undefined {\n return this.opts.colDefs().find(col => col.field === field);\n }\n\n private cancelFilterDebounce(field: string): void {\n const timer = this.filterDebounces.get(field);\n if (timer === undefined) return;\n clearTimeout(timer);\n this.filterDebounces.delete(field);\n }\n}\n","import { DestroyRef, Signal, signal } from '@angular/core';\nimport { AgridBrowserAdapter } from '../infrastructure/agrid-browser.adapter';\nimport { AgridControl } from '../agrid-control';\nimport { ColDef } from '../agrid.types';\n\n/** View state for the floating column header shown during a reorder drag. @internal */\nexport interface AgridColumnDragPreview {\n field: string;\n fields: string[];\n label: string;\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\ntype AgridColumnDropTarget = {\n field: string;\n left: number;\n right: number;\n top: number;\n bottom: number;\n};\n\n/** Dependencies required by {@link AgridColumnReorderController}. @internal */\nexport interface AgridColumnReorderControllerOptions {\n control: Signal<AgridControl | null>;\n visibleColDefs: Signal<ColDef[]>;\n getColDef: (field: string) => ColDef | undefined;\n}\n\n/** Owns column header drag/drop state and column reordering. @internal */\nexport class AgridColumnReorderController {\n private readonly dragFields = signal<string[]>([]);\n private readonly dragOverField = signal<string | null>(null);\n private readonly dragInsertBefore = signal(true);\n readonly preview = signal<AgridColumnDragPreview | null>(null);\n private dragStartFields: string[] = [];\n private dragLabel = '';\n private dragStartX = 0;\n private dragStartY = 0;\n private pointerOffsetX = 0;\n private pointerOffsetY = 0;\n private draggedWidth = 0;\n private draggedHeight = 0;\n private dropTargets: AgridColumnDropTarget[] = [];\n\n constructor(\n private readonly opts: AgridColumnReorderControllerOptions,\n destroyRef: DestroyRef,\n private readonly browser = new AgridBrowserAdapter(),\n ) {\n destroyRef.onDestroy(() => this.cancel());\n }\n\n /** Arms a column reorder gesture for an unlocked header. */\n start(event: PointerEvent, field: string): void {\n const col = this.opts.getColDef(field);\n this.startFields(event, [field], col?.header ?? field);\n }\n\n /** Arms a grouped-header reorder gesture for a contiguous field segment. */\n startGroup(event: PointerEvent, fields: readonly string[], label: string): void {\n this.startFields(event, fields, label);\n }\n\n private startFields(event: PointerEvent, fields: readonly string[], label: string): void {\n if (!this.opts.control() || event.button !== 0) return;\n if (fields.length === 0 || fields.some(field => this.opts.getColDef(field)?.locked)) return;\n const header = event.currentTarget as HTMLElement | null;\n const rect = header?.getBoundingClientRect();\n this.dragStartFields = [...fields];\n this.dragLabel = label;\n this.dragStartX = event.clientX;\n this.dragStartY = event.clientY;\n this.draggedWidth = rect?.width ?? 0;\n this.draggedHeight = rect?.height ?? 32;\n this.pointerOffsetX = rect ? event.clientX - rect.left : 0;\n this.pointerOffsetY = rect ? event.clientY - rect.top : 0;\n this.dropTargets = this.captureDropTargets(header);\n this.browser.addDocumentListener('pointermove', this.dragMove);\n this.browser.addDocumentListener('pointerup', this.dragUp);\n this.browser.addDocumentListener('pointercancel', this.dragCancel);\n }\n\n /** Returns whether the field is currently being dragged. */\n isDragging(field: string): boolean {\n return this.dragFields().includes(field);\n }\n\n /** Returns the active drop-indicator side for a field. */\n getDropSide(field: string): 'before' | 'after' | null {\n if (this.dragOverField() !== field || this.dragFields().includes(field)) return null;\n return this.dragInsertBefore() ? 'before' : 'after';\n }\n\n /** Horizontal translation used to animate headers away from the pending insertion gap. */\n getHeaderOffset(field: string): number {\n const movingFields = this.dragFields();\n const overField = this.dragOverField();\n if (movingFields.length === 0 || !overField || movingFields.includes(field)\n || this.draggedWidth <= 0) return 0;\n\n const fields = this.opts.visibleColDefs().map(col => col.field);\n const fromIndex = fields.findIndex(value => movingFields.includes(value));\n const remaining = fields.filter(value => !movingFields.includes(value));\n const overIndex = remaining.indexOf(overField);\n const fieldIndex = remaining.indexOf(field);\n if (fromIndex < 0 || overIndex < 0 || fieldIndex < 0) return 0;\n\n const insertionIndex = overIndex + (this.dragInsertBefore() ? 0 : 1);\n if (insertionIndex < fromIndex && fieldIndex >= insertionIndex && fieldIndex < fromIndex) {\n return this.draggedWidth;\n }\n if (insertionIndex > fromIndex && fieldIndex >= fromIndex && fieldIndex < insertionIndex) {\n return -this.draggedWidth;\n }\n return 0;\n }\n\n private readonly dragMove = (event: PointerEvent): void => {\n if (this.dragStartFields.length === 0) return;\n if (this.dragFields().length === 0) {\n if (Math.abs(event.clientX - this.dragStartX) < 5) return;\n this.dragFields.set([...this.dragStartFields]);\n this.preview.set({\n field: this.dragStartFields[0],\n fields: [...this.dragStartFields],\n label: this.dragLabel,\n x: event.clientX - this.pointerOffsetX,\n y: event.clientY - this.pointerOffsetY,\n width: this.draggedWidth,\n height: this.draggedHeight,\n });\n } else {\n this.preview.update(preview => preview ? {\n ...preview,\n x: event.clientX - this.pointerOffsetX,\n y: event.clientY - this.pointerOffsetY,\n } : null);\n }\n const hovered = this.getHoveredHeaderCell(event.clientX, event.clientY);\n if (hovered && !this.dragFields().includes(hovered.field)) {\n this.dragOverField.set(hovered.field);\n this.dragInsertBefore.set(hovered.insertBefore);\n } else {\n this.dragOverField.set(null);\n }\n };\n\n private readonly dragUp = (): void => {\n this.removeListeners();\n const from = this.dragFields();\n const to = this.dragOverField();\n if (from.length > 0 && to) {\n this.opts.control()?.moveColumns(\n this.opts.visibleColDefs().map(col => col.field),\n from,\n to,\n this.dragInsertBefore(),\n );\n }\n this.dragFields.set([]);\n this.dragOverField.set(null);\n this.dragInsertBefore.set(true);\n this.preview.set(null);\n this.dragStartFields = [];\n this.dragLabel = '';\n this.dropTargets = [];\n };\n\n private readonly dragCancel = (): void => this.cancel();\n\n private cancel(): void {\n this.removeListeners();\n this.dragFields.set([]);\n this.dragOverField.set(null);\n this.dragInsertBefore.set(true);\n this.preview.set(null);\n this.dragStartFields = [];\n this.dragLabel = '';\n this.dropTargets = [];\n }\n\n private removeListeners(): void {\n this.browser.removeDocumentListener('pointermove', this.dragMove);\n this.browser.removeDocumentListener('pointerup', this.dragUp);\n this.browser.removeDocumentListener('pointercancel', this.dragCancel);\n }\n\n private getHoveredHeaderCell(x: number, _y: number): { field: string; insertBefore: boolean } | null {\n const target = this.dropTargets.find(rect => x >= rect.left && x <= rect.right);\n return target\n ? { field: target.field, insertBefore: x < target.left + (target.right - target.left) / 2 }\n : null;\n }\n\n private captureDropTargets(header: HTMLElement | null): AgridColumnDropTarget[] {\n const root = header?.closest('.ag-wrapper') ?? header?.ownerDocument;\n if (!root) return [];\n return Array.from(root.querySelectorAll<HTMLElement>('.ag-header-cell[data-col-field]'))\n .map(element => {\n const field = element.dataset['colField'];\n const rect = element.getBoundingClientRect();\n return field ? {\n field,\n left: rect.left,\n right: rect.right,\n top: rect.top,\n bottom: rect.bottom,\n } : null;\n })\n .filter((target): target is AgridColumnDropTarget => target !== null);\n }\n\n}\n","import { DestroyRef, Signal, signal } from '@angular/core';\nimport { AgridBrowserAdapter } from '../infrastructure/agrid-browser.adapter';\nimport { AgridControl } from '../agrid-control';\nimport { ColDef, GridItem } from '../agrid.types';\nimport { getDisplayForField, isDataRowItem } from '../agrid.utils';\n\n/** Dependencies required by {@link AgridColumnSizingController}. @internal */\nexport interface AgridColumnSizingOptions {\n control: Signal<AgridControl | null>;\n filteredItems: Signal<GridItem[]>;\n visibleColDefs: Signal<ColDef[]>;\n scrollableColDefs: Signal<ColDef[]>;\n locale: Signal<string>;\n isColumnPinned: (field: string) => boolean;\n wrapperElement: () => HTMLElement;\n scrollerElement: () => HTMLElement;\n}\n\n/**\n * Owns column widths, resize interactions, autosizing, and horizontal visibility.\n * @internal\n */\nexport class AgridColumnSizingController {\n private readonly localWidths = signal<Record<string, number>>({});\n private resizeState: { field: string; startX: number; startWidth: number } | null = null;\n\n constructor(\n private readonly opts: AgridColumnSizingOptions,\n destroyRef: DestroyRef,\n private readonly browser = new AgridBrowserAdapter(),\n ) {\n destroyRef.onDestroy(() => this.finishResize());\n }\n\n /** Returns a column's effective fixed width, or `0` for flexible columns. */\n getWidth(col: ColDef): number {\n const override = this.widthOverride(col.field);\n if (override !== undefined) return override;\n return col.width == null || col.width === -1 ? 0 : col.width;\n }\n\n /** Returns the CSS grid width token for a column. */\n getWidthToken(col: ColDef): string {\n const override = this.widthOverride(col.field);\n if (override !== undefined) return `${override}px`;\n return col.width == null || col.width === -1 ? '1fr' : `${col.width}px`;\n }\n\n /** Stores a clamped runtime width in the control or local fallback state. */\n setWidth(field: string, width: number): void {\n const control = this.opts.control();\n if (control) {\n control.setColumnWidth(field, width);\n } else {\n this.localWidths.update(widths => ({\n ...widths,\n [field]: Math.max(40, width),\n }));\n }\n }\n\n /** Starts pointer-driven resizing for an unlocked column. */\n startResize(event: MouseEvent, col: ColDef): void {\n if (col.locked) return;\n event.preventDefault();\n event.stopPropagation();\n const renderedWidth = (event.currentTarget as HTMLElement)\n .closest<HTMLElement>('.ag-header-cell')\n ?.getBoundingClientRect().width;\n this.resizeState = {\n field: col.field,\n startX: event.clientX,\n startWidth: this.getWidth(col) || renderedWidth || 100,\n };\n this.browser.setBodyInteraction('col-resize', 'none');\n this.browser.addDocumentListener('mousemove', this.resizeMove);\n this.browser.addDocumentListener('mouseup', this.resizeUp);\n }\n\n /** Adjusts an unlocked column width with keyboard arrow keys. */\n resizeFromKeyboard(event: KeyboardEvent, col: ColDef): void {\n if (col.locked || (event.key !== 'ArrowLeft' && event.key !== 'ArrowRight')) return;\n event.preventDefault();\n const delta = event.key === 'ArrowLeft' ? -10 : 10;\n this.setWidth(col.field, this.getWidth(col) + delta);\n }\n\n /** Sizes one unlocked column to fit its header and visible values. */\n autosizeColumn(col: ColDef): void {\n if (col.locked) return;\n const context = this.getAutosizeContext();\n if (!context) return;\n this.setWidth(col.field, this.measureAutosizeWidth(col, context));\n }\n\n /** Sizes every unlocked visible column to its current content. */\n autosizeAllColumns(): void {\n const context = this.getAutosizeContext();\n if (!context) return;\n for (const col of this.opts.visibleColDefs()) {\n if (!col.locked) this.setWidth(col.field, this.measureAutosizeWidth(col, context));\n }\n }\n\n /** Horizontally scrolls an unpinned column into view. */\n scrollColumnToKeepVisible(colIndex: number): void {\n const col = this.opts.visibleColDefs()[colIndex];\n if (!col || this.opts.isColumnPinned(col.field)) return;\n\n const scroller = this.opts.scrollerElement();\n const { start, end } = this.getScrollableColumnBounds(col.field);\n const maxScrollLeft = Math.max(0, scroller.scrollWidth - scroller.clientWidth);\n let nextScrollLeft = scroller.scrollLeft;\n\n if (start < nextScrollLeft) {\n nextScrollLeft = start;\n } else if (end > nextScrollLeft + scroller.clientWidth) {\n nextScrollLeft = end - scroller.clientWidth;\n }\n\n nextScrollLeft = Math.max(0, Math.min(maxScrollLeft, nextScrollLeft));\n if (nextScrollLeft !== scroller.scrollLeft) scroller.scrollLeft = nextScrollLeft;\n }\n\n private readonly resizeMove = (event: MouseEvent): void => {\n if (!this.resizeState) return;\n this.setWidth(\n this.resizeState.field,\n this.resizeState.startWidth + (event.clientX - this.resizeState.startX),\n );\n };\n\n private readonly resizeUp = (): void => this.finishResize();\n\n private finishResize(): void {\n this.resizeState = null;\n this.browser.setBodyInteraction('', '');\n this.browser.removeDocumentListener('mousemove', this.resizeMove);\n this.browser.removeDocumentListener('mouseup', this.resizeUp);\n }\n\n private widthOverride(field: string): number | undefined {\n return this.opts.control()?.columnWidths()[field] ?? this.localWidths()[field];\n }\n\n private getScrollableColumnBounds(field: string): { start: number; end: number } {\n let start = 0;\n for (const col of this.opts.scrollableColDefs()) {\n const width = this.getWidth(col);\n if (col.field === field) return { start, end: start + width };\n start += width;\n }\n return { start: 0, end: 0 };\n }\n\n private measureAutosizeWidth(\n col: ColDef,\n context: CanvasRenderingContext2D,\n ): number {\n const values = [col.header];\n for (const item of this.opts.filteredItems()) {\n if (!isDataRowItem(item)) continue;\n values.push(getDisplayForField(col, item.row[col.field], this.opts.locale()));\n }\n const measured = values.reduce(\n (max, value) => Math.max(max, context.measureText(value).width),\n 0,\n );\n return Math.max(40, Math.min(500, Math.ceil(measured + 42)));\n }\n\n private getAutosizeContext(): CanvasRenderingContext2D | null {\n const context = this.browser.createCanvasContext();\n if (!context) return null;\n const style = this.browser.computedStyle(this.opts.wrapperElement());\n if (style) context.font = `${style.fontWeight} ${style.fontSize} ${style.fontFamily}`;\n return context;\n }\n}\n","import { Signal, computed } from '@angular/core';\nimport { AgridControl } from '../agrid-control';\nimport { ColDef } from '../agrid.types';\n\n/** Reactive column state consumed by {@link AgridColumnStateService}. @internal */\nexport interface AgridColumnStateOptions {\n control: Signal<AgridControl | null>;\n colDefs: Signal<ColDef[]>;\n visibleColDefs: Signal<ColDef[]>;\n pinnedColDefs: Signal<ColDef[]>;\n rightPinnedColDefs: Signal<ColDef[]>;\n showControlColumn: Signal<boolean>;\n}\n\n/** Provides template-facing column lookup, pinning, visibility, and ARIA state. @internal */\nexport class AgridColumnStateService {\n constructor(private readonly opts: AgridColumnStateOptions) {}\n\n private readonly columnsByField = computed(() =>\n new Map(this.opts.colDefs().map(col => [col.field, col])),\n );\n\n private readonly visibleIndexByField = computed(() =>\n new Map(this.opts.visibleColDefs().map((col, index) => [col.field, index])),\n );\n\n /** Finds a column definition by field name. */\n getColDef(field: string): ColDef | undefined {\n return this.columnsByField().get(field);\n }\n\n /** Returns a field's zero-based index among visible columns. */\n getVisibleColIndex(field: string): number {\n return this.visibleIndexByField().get(field) ?? -1;\n }\n\n /** Converts a visible data-column index to a one-based ARIA index. */\n getAriaColIndex(colIndex: number): number {\n return colIndex + 1 + (this.opts.showControlColumn() ? 1 : 0);\n }\n\n /** Returns whether a field is hidden by the grid control. */\n isColumnHidden(field: string): boolean {\n return this.opts.control()?.isColumnHidden(field) ?? false;\n }\n\n /** Returns whether the grid is grouped by the field. */\n isGroupedByField(field: string): boolean {\n return this.opts.control()?.groupByField() === field;\n }\n\n /** Returns whether a field is pinned to the left. */\n isColumnPinned(field: string): boolean {\n return this.opts.pinnedColDefs().some(col => col.field === field);\n }\n\n /** Returns whether a field is pinned to the right. */\n isColumnPinnedRight(field: string): boolean {\n return this.opts.rightPinnedColDefs().some(col => col.field === field);\n }\n\n /** Returns the field's current pin side, or `false` when unpinned. */\n getColumnPinState(field: string): 'left' | 'right' | false {\n if (this.isColumnPinned(field)) return 'left';\n if (this.isColumnPinnedRight(field)) return 'right';\n return false;\n }\n\n /** Returns whether the field is the first right-pinned column. */\n isFirstRightPinnedColumn(field: string): boolean {\n const cols = this.opts.rightPinnedColDefs();\n return cols.length > 0 && cols[0].field === field;\n }\n\n /** Returns whether the field is the last left-pinned column. */\n isLastPinnedColumn(field: string): boolean {\n const cols = this.opts.pinnedColDefs();\n return cols.length > 0 && cols[cols.length - 1].field === field;\n }\n}\n","import { DestroyRef, Signal, WritableSignal, signal } from '@angular/core';\nimport { AgridBrowserAdapter } from '../infrastructure/agrid-browser.adapter';\nimport { AgridDataSource } from '../agrid-datasource';\nimport { ColDef, GridItem, RowReorderEvent } from '../agrid.types';\nimport { buildSelectionRange, getDisplayForField } from '../agrid.utils';\n\n/** Dependencies and callbacks required by {@link AgridDragHandler}. @internal */\nexport interface AgridDragHandlerOptions {\n dataSource: Signal<AgridDataSource>;\n filteredItems: () => GridItem[];\n locale: () => string | undefined;\n selectedIndices: WritableSignal<Set<number>>;\n onReorder: (event: RowReorderEvent) => void;\n onSelectionChange: () => void;\n}\n\n/**\n * Handles both row-reorder drag and drag-select. The two share `_getHoveredRow`\n * and the same pointer-event lifecycle pattern, so they live together.\n *\n * Signals exposed here are read by the component's `displayItems` computed\n * to render the ghost row during a reorder drag.\n *\n * @internal\n */\nexport class AgridDragHandler {\n readonly reorderOriginalIndex = signal<number | null>(null);\n readonly reorderOverIndex = signal<number | null>(null);\n readonly reorderInsertBefore = signal<boolean>(true);\n\n private _overlayEl: HTMLElement | null = null;\n private _offsetX = 0;\n private _offsetY = 0;\n private _dragSelAnchor: number | null = null;\n\n constructor(\n private readonly opts: AgridDragHandlerOptions,\n destroyRef: DestroyRef,\n private readonly browser = new AgridBrowserAdapter(),\n ) {\n destroyRef.onDestroy(() => this._cleanupReorder());\n destroyRef.onDestroy(() => this._cancelDragSelect());\n }\n\n /** Starts a row reorder gesture and creates its floating preview. */\n startReorder(event: PointerEvent, originalIndex: number): void {\n event.preventDefault();\n event.stopPropagation();\n const rowEl = (event.currentTarget as HTMLElement).closest<HTMLElement>('.ag-row');\n if (!rowEl) return;\n const rect = rowEl.getBoundingClientRect();\n this.reorderOriginalIndex.set(originalIndex);\n this._offsetX = event.clientX - rect.left;\n this._offsetY = event.clientY - rect.top;\n\n const overlay = rowEl.cloneNode(true) as HTMLElement;\n overlay.removeAttribute('data-original-index');\n Object.assign(overlay.style, {\n position: 'fixed', top: `${rect.top}px`, left: `${rect.left}px`,\n width: `${rect.width}px`, height: `${rect.height}px`,\n pointerEvents: 'none', zIndex: '9999', background: '#fff',\n border: '1px solid #1a73e8', borderRadius: '4px',\n boxShadow: '0 4px 16px rgba(0,0,0,0.15)', overflow: 'hidden',\n opacity: '0.95', cursor: 'grabbing',\n });\n if (!this.browser.appendToBody(overlay)) {\n this._clearReorder();\n return;\n }\n this._overlayEl = overlay;\n this.browser.addDocumentListener('pointermove', this._reorderMove);\n this.browser.addDocumentListener('pointerup', this._reorderUp);\n this.browser.addDocumentListener('pointercancel', this._reorderCancel);\n }\n\n /** Returns the formatted value shown in a reorder ghost cell. */\n getGhostDisplay(col: ColDef): string {\n const idx = this.reorderOriginalIndex();\n if (idx === null) return '';\n return getDisplayForField(col, this.opts.dataSource().rows()[idx]?.[col.field], this.opts.locale());\n }\n\n private readonly _reorderMove = (e: PointerEvent): void => {\n if (this._overlayEl) {\n this._overlayEl.style.top = `${e.clientY - this._offsetY}px`;\n this._overlayEl.style.left = `${e.clientX - this._offsetX}px`;\n }\n const hovered = this._getHoveredRow(e.clientX, e.clientY);\n if (hovered) {\n if (this.reorderOverIndex() !== hovered.originalIndex) this.reorderOverIndex.set(hovered.originalIndex);\n if (this.reorderInsertBefore() !== hovered.insertBefore) this.reorderInsertBefore.set(hovered.insertBefore);\n } else {\n this.reorderOverIndex.set(null);\n }\n };\n\n private readonly _reorderUp = (_e: PointerEvent): void => {\n this._removeReorderListeners();\n const overlay = this._overlayEl;\n this._overlayEl = null;\n if (overlay) {\n overlay.style.transition = 'opacity 80ms ease';\n overlay.style.opacity = '0';\n this.browser.schedule(() => overlay.remove(), 90);\n }\n const oldIndex = this.reorderOriginalIndex();\n const overIdx = this.reorderOverIndex();\n if (oldIndex !== null && overIdx !== null) {\n const newIndex = this.reorderInsertBefore() ? overIdx : overIdx + 1;\n const shouldEmit = oldIndex !== newIndex;\n this._clearReorder();\n if (shouldEmit) {\n this.opts.onReorder({ row: { ...this.opts.dataSource().rows()[oldIndex] }, oldIndex, newIndex });\n }\n } else {\n this._clearReorder();\n }\n };\n\n private readonly _reorderCancel = (): void => this._cleanupReorder();\n\n private _cleanupReorder(): void {\n this._removeReorderListeners();\n this._overlayEl?.remove();\n this._overlayEl = null;\n this._clearReorder();\n }\n\n private _removeReorderListeners(): void {\n this.browser.removeDocumentListener('pointermove', this._reorderMove);\n this.browser.removeDocumentListener('pointerup', this._reorderUp);\n this.browser.removeDocumentListener('pointercancel', this._reorderCancel);\n }\n\n private _clearReorder(): void {\n this.reorderOriginalIndex.set(null);\n this.reorderOverIndex.set(null);\n this.reorderInsertBefore.set(true);\n }\n\n /** Starts pointer-driven multi-row selection from an anchor row. */\n startDragSelect(originalIndex: number): void {\n this._dragSelAnchor = originalIndex;\n this.browser.addDocumentListener('pointermove', this._dragSelMove);\n this.browser.addDocumentListener('pointerup', this._dragSelUp);\n this.browser.addDocumentListener('pointercancel', this._dragSelCancel);\n }\n\n private readonly _dragSelMove = (e: PointerEvent): void => {\n const anchor = this._dragSelAnchor;\n if (anchor === null) return;\n const hovered = this._getHoveredRow(e.clientX, e.clientY);\n if (!hovered) return;\n this.opts.selectedIndices.set(\n buildSelectionRange(anchor, hovered.originalIndex, this.opts.filteredItems())\n );\n };\n\n private readonly _dragSelUp = (): void => {\n this._removeDragSelectListeners();\n this._dragSelAnchor = null;\n this.opts.onSelectionChange();\n };\n\n private readonly _dragSelCancel = (): void => this._cancelDragSelect();\n\n private _cancelDragSelect(): void {\n this._removeDragSelectListeners();\n this._dragSelAnchor = null;\n }\n\n private _removeDragSelectListeners(): void {\n this.browser.removeDocumentListener('pointermove', this._dragSelMove);\n this.browser.removeDocumentListener('pointerup', this._dragSelUp);\n this.browser.removeDocumentListener('pointercancel', this._dragSelCancel);\n }\n\n private _getHoveredRow(x: number, y: number): { originalIndex: number; insertBefore: boolean } | null {\n for (const el of this.browser.elementsFromPoint(x, y)) {\n const rowEl = (el as HTMLElement).closest<HTMLElement>('.ag-row[data-original-index]');\n if (!rowEl) continue;\n const rect = rowEl.getBoundingClientRect();\n return {\n originalIndex: Number(rowEl.dataset['originalIndex']),\n insertBefore: y < rect.top + rect.height / 2,\n };\n }\n return null;\n }\n}\n","import { Signal, WritableSignal, signal } from '@angular/core';\nimport { CellRange } from '../selection/agrid-clipboard.handler';\nimport { AgridControl, HistoryEntry, HistoryItem } from '../agrid-control';\nimport { AgridDataSource } from '../agrid-datasource';\nimport { CellPosition, ColDef, GridEditEvent } from '../agrid.types';\n\n/** Dependencies and callbacks required by {@link AgridEditController}. @internal */\nexport interface AgridEditControllerOptions {\n control: Signal<AgridControl | null>;\n dataSource: Signal<AgridDataSource>;\n visibleColDefs: Signal<ColDef[]>;\n readonlyGrid: Signal<boolean>;\n selectedCell: WritableSignal<CellPosition | null>;\n selectedRange: WritableSignal<CellRange | null>;\n findDisplayIndex: (originalIndex: number) => number;\n scrollToCell: (displayIndex: number, colIndex: number) => void;\n focusGrid: () => void;\n onCellEdit: (event: GridEditEvent) => void;\n /** Called when a `ColDef.validate` hook rejects a committed value. */\n onValidationFailed: (event: { rowIndex: number; field: string; value: unknown; message: string }) => void;\n}\n\n/** Active cell validation error: the rejecting cell position, field, and message. @internal */\nexport interface CellValidationError {\n rowIndex: number;\n colIndex: number;\n field: string;\n message: string;\n}\n\n/**\n * Owns cell edit state, commit/cancel transitions, and undo/redo application.\n * @internal\n */\nexport class AgridEditController {\n readonly editingCell = signal<CellPosition | null>(null);\n readonly currentDraft = signal<unknown>(null);\n readonly editSeedChar = signal<string>('');\n /** Whether a newly focused text editor should select all text. */\n readonly selectTextOnEdit = signal<boolean>(true);\n /** The active cell validation error, or `null` when the last commit was accepted. */\n readonly validationError = signal<CellValidationError | null>(null);\n\n constructor(private readonly opts: AgridEditControllerOptions) {}\n\n /** Returns whether a cell can be edited in the current grid state. */\n isCellEditable(col: ColDef | undefined, originalIndex?: number): boolean {\n if (!col || this.opts.readonlyGrid() || col.editable === false) return false;\n if (originalIndex === undefined || !col.cellReadonly) return true;\n const row = this.opts.dataSource().getRow(originalIndex);\n if (!row) return false;\n return !col.cellReadonly({\n row,\n value: row[col.field],\n column: col,\n originalIndex,\n });\n }\n\n /** Replaces the value currently staged by the active editor. */\n setDraft(value: unknown): void {\n this.currentDraft.set(value);\n }\n\n /** Starts editing a cell, optionally seeded by a typed character. */\n start(originalIndex: number, colIndex: number, seedChar: string, selectText = true): void {\n const col = this.opts.visibleColDefs()[colIndex];\n if (!this.isCellEditable(col, originalIndex)) return;\n this.validationError.set(null);\n const currentValue = this.opts.dataSource().getRow(originalIndex)[col.field];\n this.opts.selectedRange.set(null);\n this.opts.selectedCell.set({ rowIndex: originalIndex, colIndex });\n let initialDraft: unknown;\n if (seedChar !== '') {\n initialDraft = seedChar;\n } else if (col.type === 'date' && (currentValue == null || currentValue === '')) {\n initialDraft = new Date().toISOString().slice(0, 10);\n } else {\n initialDraft = currentValue;\n }\n this.currentDraft.set(initialDraft);\n this.editSeedChar.set(seedChar);\n this.selectTextOnEdit.set(selectText);\n this.editingCell.set({ rowIndex: originalIndex, colIndex });\n const displayIndex = this.opts.findDisplayIndex(originalIndex);\n if (displayIndex >= 0) this.opts.scrollToCell(displayIndex, colIndex);\n }\n\n /**\n * Commits the staged value and records the edit in history.\n * Returns `false` (keeping the cell in edit mode) when a `ColDef.validate` hook rejects the\n * value; `true` when the edit is committed or there was no change.\n */\n commit(): boolean {\n const position = this.editingCell();\n if (!position) return true;\n const col = this.opts.visibleColDefs()[position.colIndex];\n if (!col) {\n this.cancel();\n return true;\n }\n\n const row = this.opts.dataSource().getRow(position.rowIndex);\n if (!this.isCellEditable(col, position.rowIndex)) {\n this.cancel();\n return true;\n }\n const oldValue = row[col.field];\n const newValue = this.currentDraft();\n if (oldValue !== newValue) {\n const message = col.validate?.(newValue as never, row as never) ?? null;\n if (message) {\n this.validationError.set({ ...position, field: col.field, message });\n this.opts.onValidationFailed({ rowIndex: position.rowIndex, field: col.field, value: newValue, message });\n return false;\n }\n this.opts.dataSource().patchRow(position.rowIndex, { [col.field]: newValue });\n this.opts.control()?.pushEdit({\n rowIndex: position.rowIndex,\n field: col.field,\n oldValue,\n newValue,\n });\n this.opts.onCellEdit({ position, field: col.field, oldValue, newValue });\n }\n this.validationError.set(null);\n this.clearEditState();\n this.opts.focusGrid();\n return true;\n }\n\n /**\n * Commit a value directly to a cell without entering edit mode (e.g. a boolean checkbox\n * toggle). Records the change in history and emits the edit just like {@link commit}.\n */\n setCellValue(rowIndex: number, colIndex: number, newValue: unknown): boolean {\n const col = this.opts.visibleColDefs()[colIndex];\n if (!this.isCellEditable(col, rowIndex)) return false;\n const row = this.opts.dataSource().getRow(rowIndex);\n const oldValue = row[col.field];\n if (oldValue === newValue) return true;\n const message = col.validate?.(newValue as never, row as never) ?? null;\n if (message) {\n this.validationError.set({ rowIndex, colIndex, field: col.field, message });\n this.opts.onValidationFailed({ rowIndex, field: col.field, value: newValue, message });\n return false;\n }\n this.opts.dataSource().patchRow(rowIndex, { [col.field]: newValue });\n this.opts.control()?.pushEdit({ rowIndex, field: col.field, oldValue, newValue });\n this.opts.onCellEdit({\n position: { rowIndex, colIndex },\n field: col.field,\n oldValue,\n newValue,\n });\n this.validationError.set(null);\n return true;\n }\n\n /** Discards the active edit without changing row data. */\n cancel(): void {\n this.validationError.set(null);\n this.clearEditState();\n }\n\n /** Applies the previous edit-history value to the data source. */\n undo(): void {\n const item = this.opts.control()?.undo();\n if (item) this.applyHistoryItem(item, 'oldValue');\n }\n\n /** Reapplies the next edit-history value to the data source. */\n redo(): void {\n const item = this.opts.control()?.redo();\n if (item) this.applyHistoryItem(item, 'newValue');\n }\n\n /** Reconciles active edit coordinates after a row is removed. */\n onRowRemoved(originalIndex: number): void {\n const editing = this.editingCell();\n if (editing?.rowIndex === originalIndex) {\n this.clearEditState();\n } else if (editing && editing.rowIndex > originalIndex) {\n this.editingCell.set({ ...editing, rowIndex: editing.rowIndex - 1 });\n }\n }\n\n private applyHistoryItem(item: HistoryItem, valueKey: 'oldValue' | 'newValue'): void {\n const entries = Array.isArray(item) ? item : [item];\n const ordered = valueKey === 'oldValue' ? [...entries].reverse() : entries;\n for (const entry of ordered) this.applyHistoryEntry(entry, entry[valueKey]);\n }\n\n private applyHistoryEntry(entry: HistoryEntry, value: unknown): void {\n const oldValue = this.opts.dataSource().getRow(entry.rowIndex)[entry.field];\n this.opts.dataSource().patchRow(entry.rowIndex, { [entry.field]: value });\n const colIndex = this.opts.visibleColDefs().findIndex(col => col.field === entry.field);\n this.opts.onCellEdit({\n position: { rowIndex: entry.rowIndex, colIndex },\n field: entry.field,\n oldValue,\n newValue: value,\n });\n }\n\n private clearEditState(): void {\n this.editingCell.set(null);\n this.editSeedChar.set('');\n this.selectTextOnEdit.set(true);\n }\n}\n","import { Signal, WritableSignal, computed, signal } from '@angular/core';\nimport { CellRange } from './agrid-clipboard.handler';\nimport { AgridDataSource } from '../agrid-datasource';\nimport { CellPosition, ColDef } from '../agrid.types';\nimport { getDisplayForField } from '../agrid.utils';\n\n/** Location of a formatted-value match in source coordinates. @internal */\nexport type AgridFindMatch = {\n rowIndex: number;\n colIndex: number;\n};\n\n/** Dependencies and callbacks required by {@link AgridFindController}. @internal */\nexport interface AgridFindControllerOptions {\n dataSource: Signal<AgridDataSource>;\n filteredSortedIndices: Signal<number[]>;\n visibleColDefs: Signal<ColDef[]>;\n locale: Signal<string>;\n selectedCell: WritableSignal<CellPosition | null>;\n selectedRange: WritableSignal<CellRange | null>;\n revealMatch: (originalIndex: number, colIndex: number) => void;\n focusGrid: () => void;\n}\n\n/** Owns in-grid find state, formatted-value matching, and match navigation. @internal */\nexport class AgridFindController {\n readonly open = signal(false);\n readonly query = signal('');\n readonly activeIndex = signal(-1);\n\n readonly matches = computed<AgridFindMatch[]>(() => {\n const query = this.query().trim().toLowerCase();\n if (!query) return [];\n const cols = this.opts.visibleColDefs();\n const rows = this.opts.dataSource().rows();\n const matches: AgridFindMatch[] = [];\n this.opts.filteredSortedIndices().forEach(rowIndex => {\n const row = rows[rowIndex];\n if (!row) return;\n for (let colIndex = 0; colIndex < cols.length; colIndex++) {\n const col = cols[colIndex];\n const value = getDisplayForField(col, row[col.field], this.opts.locale()).toLowerCase();\n if (value.includes(query)) {\n matches.push({ rowIndex, colIndex });\n }\n }\n });\n return matches;\n });\n\n constructor(private readonly opts: AgridFindControllerOptions) {}\n\n /** Opens the find panel. */\n show(): void {\n this.opts.selectedCell.set(null);\n this.opts.selectedRange.set(null);\n this.activeIndex.set(-1);\n this.open.set(true);\n }\n\n /** Closes the find panel and returns focus to the grid. */\n close(): void {\n this.open.set(false);\n this.opts.focusGrid();\n }\n\n /** Replaces the search query without moving focus away from the find input. */\n setQuery(value: string): void {\n this.query.set(value);\n this.activeIndex.set(-1);\n }\n\n /** Selects the next or previous match, wrapping at either end. */\n goToMatch(direction: 1 | -1): void {\n const matches = this.matches();\n if (matches.length === 0) {\n this.activeIndex.set(-1);\n return;\n }\n const current = this.activeIndex();\n const next = current < 0\n ? (direction === 1 ? 0 : matches.length - 1)\n : (current + direction + matches.length) % matches.length;\n this.activeIndex.set(next);\n const match = matches[next];\n this.opts.selectedRange.set(null);\n this.opts.selectedCell.set({ rowIndex: match.rowIndex, colIndex: match.colIndex });\n this.opts.revealMatch(match.rowIndex, match.colIndex);\n }\n\n /** Returns whether a cell matches the current query. */\n isMatchCell(originalIndex: number, colIndex: number): boolean {\n return this.matches().some(\n match => match.rowIndex === originalIndex && match.colIndex === colIndex,\n );\n }\n\n /** Returns whether a cell is the currently active match. */\n isActiveMatchCell(originalIndex: number, colIndex: number): boolean {\n const match = this.matches()[this.activeIndex()];\n return !!match && match.rowIndex === originalIndex && match.colIndex === colIndex;\n }\n}\n","import {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n input,\n output,\n viewChild,\n} from '@angular/core';\nimport { AgridLocaleText, AGRID_LOCALE_TEXT } from '../agrid-localization';\n\n/** Floating find panel used by `AgridComponent` for in-grid search navigation. */\n@Component({\n selector: 'agrid-find-panel',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './agrid-find-panel.component.html',\n styleUrl: './agrid-find-panel.component.css',\n})\nexport class AgridFindPanelComponent implements AfterViewInit {\n /** Localized labels used in the find panel. */\n localeText = input<AgridLocaleText>(AGRID_LOCALE_TEXT.en);\n\n /** Current find query shown in the input. */\n query = input<string>('');\n\n /** Number of cells matching the current query. */\n matchCount = input<number>(0);\n\n /** Zero-based active match index, or `-1` when no match is active. */\n activeIndex = input<number>(-1);\n\n /** Emits whenever the user changes the find query. */\n queryChange = output<string>();\n\n /** Requests navigation to the next match. */\n next = output<void>();\n\n /** Requests navigation to the previous match. */\n previous = output<void>();\n\n /** Requests closing the find panel. */\n close = output<void>();\n\n private readonly findInput = viewChild.required<ElementRef<HTMLInputElement>>('findInput');\n\n /** Focuses and selects the find input after Angular has rendered the panel. */\n ngAfterViewInit(): void {\n setTimeout(() => {\n const input = this.findInput().nativeElement;\n input.focus();\n input.select();\n });\n }\n\n /** Returns the compact `active / total` label displayed next to the input. */\n countLabel(): string {\n const count = this.matchCount();\n return count === 0 ? '0 / 0' : `${this.activeIndex() + 1} / ${count}`;\n }\n\n /** Handles Enter, Shift+Enter, and Escape while preventing grid-level key handling. */\n onKeyDown(event: KeyboardEvent): void {\n event.stopPropagation();\n if (event.key === 'Enter') {\n event.preventDefault();\n event.shiftKey ? this.previous.emit() : this.next.emit();\n } else if (event.key === 'Escape') {\n event.preventDefault();\n this.close.emit();\n }\n }\n}\n","<div class=\"ag-find-panel\" role=\"search\" (click)=\"$event.stopPropagation()\">\n <input\n #findInput\n class=\"ag-find-input\"\n [value]=\"query()\"\n (input)=\"queryChange.emit($any($event.target).value)\"\n (keydown)=\"onKeyDown($event)\"\n [placeholder]=\"localeText().findPlaceholder\"\n [attr.aria-label]=\"localeText().findPlaceholder\"\n />\n <span class=\"ag-find-count\" aria-live=\"polite\">{{ countLabel() }}</span>\n <button class=\"ag-find-btn\" [title]=\"localeText().previous\" [attr.aria-label]=\"localeText().previous\"\n (click)=\"previous.emit()\">↑</button>\n <button class=\"ag-find-btn\" [title]=\"localeText().next\" [attr.aria-label]=\"localeText().next\"\n (click)=\"next.emit()\">↓</button>\n <button class=\"ag-find-btn\" [title]=\"localeText().close\" [attr.aria-label]=\"localeText().close\"\n (click)=\"close.emit()\">✕</button>\n</div>\n","import { Signal, signal } from '@angular/core';\nimport { AgridControl } from '../agrid-control';\nimport { GridItem, GroupAction } from '../agrid.types';\nimport { isGroupHeaderItem } from '../agrid.utils';\n\n/** Expanded group labels associated with the active grouping field. @internal */\nexport type AgridExpandedGroups = {\n field: string | null;\n labels: Set<string>;\n};\n\n/** Dependencies required by {@link AgridGroupController}. @internal */\nexport interface AgridGroupControllerOptions {\n control: Signal<AgridControl | null>;\n groupDescription: Signal<((label: string) => string) | null>;\n}\n\n/** Owns group expansion state and the group-action context menu. @internal */\nexport class AgridGroupController {\n readonly expandedGroups = signal<AgridExpandedGroups>({\n field: null,\n labels: new Set(),\n });\n readonly actionsMenu = signal<{ x: number; y: number; label: string } | null>(null);\n\n constructor(private readonly opts: AgridGroupControllerOptions) {}\n\n /** Toggles one group label within the active grouping field. */\n toggle(label: string): void {\n const groupField = this.opts.control()?.groupByField() ?? null;\n this.expandedGroups.update(state => {\n const labels = state.field === groupField ? new Set(state.labels) : new Set<string>();\n if (labels.has(label)) labels.delete(label);\n else labels.add(label);\n return { field: groupField, labels };\n });\n }\n\n /** Expands every group header present in the supplied projection. */\n expandAll(items: GridItem[]): void {\n const groupField = this.opts.control()?.groupByField() ?? null;\n if (!groupField) return;\n const labels = new Set<string>();\n for (const item of items) {\n if (isGroupHeaderItem(item)) labels.add(item.groupLabel);\n }\n this.expandedGroups.set({ field: groupField, labels });\n }\n\n /** Collapses all groups for the active grouping field. */\n collapseAll(): void {\n const groupField = this.opts.control()?.groupByField() ?? null;\n this.expandedGroups.set({ field: groupField, labels: new Set() });\n }\n\n /** Returns the configured description for a group label. */\n getDescription(label: string): string {\n return this.opts.groupDescription()?.(label) ?? '';\n }\n\n /** Opens the action menu for a group label. */\n openActionsMenu(event: MouseEvent, label: string): void {\n event.stopPropagation();\n this.actionsMenu.set({ x: event.clientX, y: event.clientY, label });\n }\n\n /** Closes the group action menu. */\n closeActionsMenu(): void {\n this.actionsMenu.set(null);\n }\n\n /** Runs a group action and closes its menu. */\n runAction(action: GroupAction, label: string): void {\n action.action(label);\n this.closeActionsMenu();\n }\n}\n","import { signal } from '@angular/core';\n\n/**\n * Owns the expand/collapse state of a hierarchical (tree) grid.\n *\n * Expansion is keyed by **node id** (from {@link AgridTreeConfig.getId}), independent of any\n * column or grouping field, so it works at arbitrary depth. Ids that no longer exist in the\n * data simply never match and are harmless, so the state does not need to be reset when the\n * underlying rows change.\n *\n * Mirrors {@link AgridGroupController} in spirit but is intentionally option-free — the grid\n * component supplies node ids to {@link expandAll} from the current data source.\n * @internal\n */\nexport class AgridTreeController {\n /** Ids of the nodes that are currently expanded (their children are visible). */\n readonly expandedIds = signal<Set<string | number>>(new Set());\n\n /** Returns `true` when the node with `id` is currently expanded. */\n isExpanded(id: string | number): boolean {\n return this.expandedIds().has(id);\n }\n\n /** Toggle the expanded state of a single node. */\n toggle(id: string | number): void {\n this.expandedIds.update(ids => {\n const next = new Set(ids);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n return next;\n });\n }\n\n /** Explicitly expand or collapse a single node. */\n setExpanded(id: string | number, expanded: boolean): void {\n this.expandedIds.update(ids => {\n if (expanded === ids.has(id)) return ids;\n const next = new Set(ids);\n if (expanded) next.add(id);\n else next.delete(id);\n return next;\n });\n }\n\n /** Expand every node in `ids` (typically all expandable nodes in the data source). */\n expandAll(ids: Iterable<string | number>): void {\n this.expandedIds.set(new Set(ids));\n }\n\n /** Collapse every node. */\n collapseAll(): void {\n this.expandedIds.set(new Set());\n }\n}\n","import { Signal, WritableSignal } from '@angular/core';\nimport { CellRange } from './agrid-clipboard.handler';\nimport { AgridControl } from '../agrid-control';\nimport { AgridDataSource } from '../agrid-datasource';\nimport { AgridEnterEditAction, CellPosition, ColDef, GridItem, NewRecord } from '../agrid.types';\nimport { isDataRowItem, isGroupHeaderItem } from '../agrid.utils';\n\n/** Minimal vertical viewport API used by grid navigation. @internal */\nexport interface AgridVerticalViewport {\n /** Returns the current vertical scroll offset in pixels. */\n measureScrollOffset(): number;\n /** Returns the visible viewport height in pixels. */\n getViewportSize(): number;\n /** Scrolls the viewport to an absolute vertical offset. */\n scrollToOffset(offset: number): void;\n}\n\n/** Dependencies and callbacks required by {@link AgridNavigationController}. @internal */\nexport interface AgridNavigationControllerOptions {\n control: Signal<AgridControl | null>;\n dataSource: Signal<AgridDataSource>;\n filteredItems: Signal<GridItem[]>;\n filteredSortedIndices: Signal<number[]>;\n colDefs: Signal<ColDef[]>;\n visibleColDefs: Signal<ColDef[]>;\n rowHeight: Signal<number>;\n allowAddRows: Signal<boolean>;\n autoAddRows: Signal<boolean>;\n enterEditAction: Signal<AgridEnterEditAction>;\n selectedCell: WritableSignal<CellPosition | null>;\n selectedRange: WritableSignal<CellRange | null>;\n editingCell: Signal<CellPosition | null>;\n isEditing: (originalIndex: number, colIndex: number) => boolean;\n isCellEditable: (col: ColDef | undefined, originalIndex: number) => boolean;\n toggleTreeCell: (originalIndex: number, colIndex: number) => boolean;\n startEdit: (originalIndex: number, colIndex: number, seedChar: string, selectText?: boolean) => void;\n commitEdit: () => boolean;\n cancelEdit: () => void;\n undoEdit: () => void;\n redoEdit: () => void;\n extendRangeTo: (originalIndex: number, colIndex: number) => void;\n openFind: () => void;\n focusGrid: () => void;\n viewport: () => AgridVerticalViewport;\n scrollColumnToKeepVisible: (colIndex: number) => void;\n onPrepareAddRecord: (event: Pick<NewRecord, 'index' | 'data'>) => void;\n}\n\n/**\n * Owns grid keyboard navigation, cell activation, add-row creation, and visibility scrolling.\n * @internal\n */\nexport class AgridNavigationController {\n constructor(private readonly opts: AgridNavigationControllerOptions) {}\n\n /** Activates a cell, optionally extending the current range selection. */\n activateCell(originalIndex: number, colIndex: number, event?: MouseEvent): void {\n if (this.opts.isEditing(originalIndex, colIndex)) return;\n this.opts.cancelEdit();\n if (event?.shiftKey && this.opts.selectedCell()) {\n this.opts.extendRangeTo(originalIndex, colIndex);\n this.opts.focusGrid();\n return;\n }\n this.opts.selectedRange.set(null);\n this.opts.selectedCell.set({ rowIndex: originalIndex, colIndex });\n const col = this.opts.visibleColDefs()[colIndex];\n if (col.values?.length) this.opts.startEdit(originalIndex, colIndex, '');\n else this.opts.focusGrid();\n }\n\n /** Creates and selects a row from the add-row placeholder. */\n activateAddRow(): void {\n this.opts.cancelEdit();\n this.addRowAndSelect();\n }\n\n /** Clears cell and range navigation when focus moves to a grid control. */\n deactivateCell(): void {\n this.opts.cancelEdit();\n this.opts.selectedCell.set(null);\n this.opts.selectedRange.set(null);\n }\n\n /** Inserts an initialized blank row and emits the preparation callback. */\n insertRowAt(atIndex: number): void {\n const emptyRow = this.buildEmptyRow();\n const insertedIndex = this.opts.dataSource().addRow(emptyRow, atIndex);\n this.opts.onPrepareAddRecord({ index: insertedIndex, data: emptyRow });\n }\n\n /** Handles grid-level navigation, editing, history, find, and add-row shortcuts. */\n handleKeyDown(event: KeyboardEvent): void {\n if ((event.target as Element)?.closest(\n '.ag-sidebar, .ag-filter-input, .ag-filter-menu, .ag-menu-bar',\n )) return;\n\n if ((event.ctrlKey || event.metaKey) && !event.altKey && event.key.toLowerCase() === 'f') {\n event.preventDefault();\n this.opts.openFind();\n return;\n }\n\n if ((event.ctrlKey || event.metaKey) && !event.altKey) {\n if (event.key === 'z') {\n event.preventDefault();\n event.shiftKey ? this.opts.redoEdit() : this.opts.undoEdit();\n return;\n }\n if (event.key === 'y') {\n event.preventDefault();\n this.opts.redoEdit();\n return;\n }\n }\n\n const sel = this.opts.selectedCell();\n if (\n event.key === 'Enter'\n && (event.ctrlKey || event.metaKey)\n && !event.altKey\n && !event.shiftKey\n && sel\n && this.opts.toggleTreeCell(sel.rowIndex, sel.colIndex)\n ) {\n event.preventDefault();\n return;\n }\n\n if (this.opts.editingCell()) {\n switch (event.key) {\n case 'Tab':\n event.preventDefault();\n if (this.opts.commitEdit()) this.moveSelection(0, event.shiftKey ? -1 : 1);\n break;\n case 'Enter':\n event.preventDefault();\n if (this.opts.commitEdit()) this.applyEnterEditAction(event.shiftKey);\n break;\n case 'Escape':\n event.preventDefault();\n this.opts.cancelEdit();\n this.opts.focusGrid();\n break;\n }\n return;\n }\n\n const isOnAddRow = this.opts.allowAddRows()\n && !this.opts.autoAddRows()\n && sel?.rowIndex === this.opts.dataSource().length;\n switch (event.key) {\n case 'ArrowUp':\n event.preventDefault();\n this.moveSelection(-1, 0, event.shiftKey);\n break;\n case 'ArrowDown':\n event.preventDefault();\n this.moveSelection(1, 0, event.shiftKey);\n break;\n case 'ArrowLeft':\n event.preventDefault();\n this.moveSelection(0, -1, event.shiftKey);\n break;\n case 'ArrowRight':\n event.preventDefault();\n this.moveSelection(0, 1, event.shiftKey);\n break;\n case 'Tab':\n event.preventDefault();\n this.moveSelection(0, event.shiftKey ? -1 : 1);\n break;\n case 'Enter':\n event.preventDefault();\n if (sel) {\n if (isOnAddRow) this.addRowAndSelect();\n else this.opts.startEdit(sel.rowIndex, sel.colIndex, '');\n }\n break;\n case 'F2':\n event.preventDefault();\n if (sel) {\n if (isOnAddRow) this.addRowAndSelect();\n else this.opts.startEdit(sel.rowIndex, sel.colIndex, '');\n }\n break;\n default:\n if (sel && event.key.length === 1 && !event.ctrlKey && !event.metaKey && !event.altKey) {\n if (isOnAddRow) this.addRowAndSelect();\n else this.opts.startEdit(sel.rowIndex, sel.colIndex, event.key);\n }\n }\n }\n\n private applyEnterEditAction(reverse: boolean): void {\n switch (this.opts.enterEditAction()) {\n case 'nextColumn':\n this.moveToNextEditableColumn(reverse ? -1 : 1);\n break;\n case 'nextRow':\n this.moveSelection(reverse ? -1 : 1, 0);\n break;\n case 'nothing':\n this.opts.focusGrid();\n break;\n }\n }\n\n private moveToNextEditableColumn(direction: 1 | -1): void {\n const items = this.opts.filteredItems();\n const cols = this.opts.visibleColDefs();\n const selected = this.opts.selectedCell();\n if (!selected || items.length === 0 || cols.length === 0) {\n this.opts.focusGrid();\n return;\n }\n\n const currentDisplayIndex = this.selectedDisplayIndex();\n if (currentDisplayIndex < 0) {\n this.opts.focusGrid();\n return;\n }\n\n let displayIndex = currentDisplayIndex;\n let colIndex = selected.colIndex + direction;\n\n while (displayIndex >= 0 && displayIndex < items.length) {\n while (colIndex >= 0 && colIndex < cols.length) {\n const item = items[displayIndex];\n const col = cols[colIndex];\n if (isDataRowItem(item) && this.opts.isCellEditable(col, item.originalIndex)) {\n this.opts.selectedRange.set(null);\n this.opts.selectedCell.set({ rowIndex: item.originalIndex, colIndex });\n this.scrollToKeepVisible(displayIndex, colIndex);\n if (this.isTextColumn(col)) this.opts.startEdit(item.originalIndex, colIndex, '', false);\n else this.opts.focusGrid();\n return;\n }\n colIndex += direction;\n }\n displayIndex += direction;\n colIndex = direction > 0 ? 0 : cols.length - 1;\n while (\n displayIndex >= 0\n && displayIndex < items.length\n && isGroupHeaderItem(items[displayIndex])\n ) {\n displayIndex += direction;\n }\n }\n\n this.opts.focusGrid();\n }\n\n private isTextColumn(col: ColDef): boolean {\n return !col.values?.length && (col.type === undefined || col.type === 'text');\n }\n\n /** Finds a data row's current index in the projected display items. */\n findDisplayIndex(originalIndex: number): number {\n return this.opts.filteredItems().findIndex(\n item => isDataRowItem(item) && item.originalIndex === originalIndex,\n );\n }\n\n /** Navigates client pagination as needed and reveals a data-source row. */\n revealRow(originalIndex: number): void {\n const filteredIndex = this.opts.filteredSortedIndices().indexOf(originalIndex);\n if (filteredIndex < 0) return;\n\n const ctrl = this.opts.control();\n const pageSize = ctrl?.pageSize() ?? 0;\n if (ctrl && pageSize > 0 && ctrl.totalRows() === 0 && !ctrl.groupByField()) {\n ctrl.setPage(Math.floor(filteredIndex / pageSize) + 1);\n }\n\n setTimeout(() => {\n const displayIndex = this.findDisplayIndex(originalIndex);\n if (displayIndex >= 0) this.scrollToKeepVisible(displayIndex, 0);\n });\n }\n\n /** Scrolls a display row and optional column into the visible viewport. */\n scrollToKeepVisible(displayIndex: number, colIndex: number | null = null): void {\n const viewport = this.opts.viewport();\n const itemSize = this.opts.rowHeight();\n const scrollOffset = viewport.measureScrollOffset();\n const viewportSize = viewport.getViewportSize();\n if (displayIndex * itemSize < scrollOffset) {\n viewport.scrollToOffset(displayIndex * itemSize);\n } else if ((displayIndex + 1) * itemSize > scrollOffset + viewportSize) {\n viewport.scrollToOffset((displayIndex + 1) * itemSize - viewportSize);\n }\n\n if (colIndex !== null) this.opts.scrollColumnToKeepVisible(colIndex);\n }\n\n private moveSelection(dRow: number, dCol: number, extendRange = false): void {\n const items = this.opts.filteredItems();\n if (items.length === 0) {\n if (\n this.opts.allowAddRows()\n && this.opts.autoAddRows()\n && this.opts.dataSource().length === 0\n ) {\n this.addRowAndSelect();\n }\n return;\n }\n const cols = this.opts.visibleColDefs().length;\n let di = this.selectedDisplayIndex();\n let ci = this.opts.selectedCell()?.colIndex ?? 0;\n if (di === -1) {\n di = 0;\n ci = 0;\n }\n let newDi = di + dRow;\n let newCi = ci + dCol;\n const onAddRow = items[newDi] === null;\n if (!onAddRow) {\n if (newCi < 0) {\n newDi--;\n newCi = cols - 1;\n }\n if (newCi >= cols) {\n newDi++;\n newCi = 0;\n }\n }\n\n const skipDir = dRow < 0 ? -1 : 1;\n let skipDi = newDi;\n while (skipDi >= 0 && skipDi < items.length && isGroupHeaderItem(items[skipDi])) skipDi += skipDir;\n if (skipDi >= 0 && skipDi < items.length) newDi = skipDi;\n\n if (this.opts.autoAddRows() && newDi >= items.length) {\n const emptyRow = this.buildEmptyRow();\n const insertedIndex = this.opts.dataSource().addRow(emptyRow);\n const colIndex = Math.min(newCi, cols - 1);\n const newDisplayIdx = this.findDisplayIndex(insertedIndex);\n this.opts.selectedCell.set({ rowIndex: insertedIndex, colIndex });\n if (newDisplayIdx >= 0) this.scrollToKeepVisible(newDisplayIdx, colIndex);\n this.opts.focusGrid();\n this.opts.onPrepareAddRecord({ index: insertedIndex, data: emptyRow });\n return;\n }\n\n newDi = Math.max(0, Math.min(items.length - 1, newDi));\n newCi = Math.max(0, Math.min(cols - 1, newCi));\n const newItem = items[newDi];\n if (newItem === null) {\n this.opts.selectedRange.set(null);\n this.opts.selectedCell.set({ rowIndex: this.opts.dataSource().length, colIndex: 0 });\n } else if (isDataRowItem(newItem)) {\n if (extendRange) {\n this.opts.extendRangeTo(newItem.originalIndex, newCi);\n } else {\n this.opts.selectedRange.set(null);\n this.opts.selectedCell.set({ rowIndex: newItem.originalIndex, colIndex: newCi });\n }\n }\n this.scrollToKeepVisible(newDi, newCi);\n this.opts.focusGrid();\n }\n\n private selectedDisplayIndex(): number {\n const sel = this.opts.selectedCell();\n if (!sel) return -1;\n const items = this.opts.filteredItems();\n if (sel.rowIndex >= this.opts.dataSource().length) return items.length - 1;\n return items.findIndex(item => isDataRowItem(item) && item.originalIndex === sel.rowIndex);\n }\n\n private addRowAndSelect(): void {\n const emptyRow = this.buildEmptyRow();\n const insertedIndex = this.opts.dataSource().addRow(emptyRow);\n this.opts.selectedRange.set(null);\n this.opts.selectedCell.set({ rowIndex: insertedIndex, colIndex: 0 });\n this.opts.focusGrid();\n const displayIdx = this.findDisplayIndex(insertedIndex);\n if (displayIdx >= 0) this.scrollToKeepVisible(displayIdx, 0);\n this.opts.onPrepareAddRecord({ index: insertedIndex, data: emptyRow });\n }\n\n private buildEmptyRow(): Record<string, unknown> {\n const row: Record<string, unknown> = {};\n for (const col of this.opts.colDefs()) row[col.field] = col.type === 'number' ? 0 : '';\n return row;\n }\n}\n","import { Signal } from '@angular/core';\nimport { AgridBrowserAdapter } from '../infrastructure/agrid-browser.adapter';\nimport { AgridControl } from '../agrid-control';\nimport { ColDef, GridItem } from '../agrid.types';\nimport { getDisplayForField, isDataRowItem } from '../agrid.utils';\n\n/** Reactive display state required by {@link AgridPresentationService}. @internal */\nexport interface AgridPresentationOptions {\n control: Signal<AgridControl | null>;\n visibleColDefs: Signal<ColDef[]>;\n filteredItems: Signal<GridItem[]>;\n locale: Signal<string>;\n /** Optional host callback returning CSS classes for a whole data row. */\n getRowClass?: Signal<((params: { row: Record<string, unknown>; index: number }) => string) | undefined>;\n}\n\n/**\n * Provides display formatting and CSV export without coupling them to the grid component.\n * @internal\n */\nexport class AgridPresentationService {\n constructor(\n private readonly opts: AgridPresentationOptions,\n private readonly browser = new AgridBrowserAdapter(),\n ) {}\n\n /** Returns the formatted tooltip text for a cell value. */\n getCellTitle(col: ColDef, value: unknown): string {\n return getDisplayForField(col, value, this.opts.locale());\n }\n\n /** Resolves dynamic CSS classes configured for a cell. */\n getCellClass(col: ColDef, value: unknown, row: Record<string, unknown>): string {\n return col.cellClass?.({ value, row }) ?? '';\n }\n\n /** Resolves dynamic CSS classes configured for a whole data row. */\n getRowClass(row: Record<string, unknown>, index: number): string {\n return this.opts.getRowClass?.()?.({ row, index }) ?? '';\n }\n\n /** Returns the compact label for a built-in aggregate. */\n getAggregateLabel(col: ColDef): string {\n const aggregate = this.opts.control()?.aggregates()[col.field] ?? col.aggregate;\n if (!aggregate || typeof aggregate === 'function') return '';\n return { sum: 'Σ', avg: 'Ø', min: '↓', max: '↑', count: '#' }[aggregate] ?? '';\n }\n\n /** Returns whether a column has a static or runtime aggregate. */\n hasAggregate(col: ColDef): boolean {\n return this.opts.control()?.aggregates()[col.field] !== undefined || !!col.aggregate;\n }\n\n /** Formats a computed footer value for display. */\n getFooterDisplay(col: ColDef, value: unknown): string {\n if (value == null || value === '') return '';\n if (col.formatter) return col.formatter(value);\n if (typeof value === 'number') return value.toLocaleString(this.opts.locale());\n return String(value);\n }\n\n /** Downloads the currently projected rows and visible columns as CSV. */\n exportCsv(filename: string): void {\n const cols = this.opts.visibleColDefs();\n const rows = this.opts.filteredItems()\n .filter(isDataRowItem)\n .map(item => item.row);\n const escape = (value: string): string =>\n /[,\"\\n\\r]/.test(value) ? `\"${value.replace(/\"/g, '\"\"')}\"` : value;\n const header = cols.map(col => escape(col.header)).join(',');\n const locale = this.opts.locale();\n const body = rows\n .map(row => cols\n .map(col => escape(getDisplayForField(col, row[col.field], locale)))\n .join(','))\n .join('\\n');\n this.browser.downloadText(\n filename,\n `${header}\\n${body}`,\n 'text/csv;charset=utf-8;',\n );\n }\n}\n","import { ChangeDetectionStrategy, Component, input, output } from '@angular/core';\nimport {\n AgridMenuBarContext,\n AgridMenuBarItem,\n AgridMenuBarMenuItem,\n AgridMenuBarState,\n} from '../agrid.types';\n\n/** Internal renderer for provider-configured grid commands and dropdown items. */\n@Component({\n selector: 'agrid-menu-bar',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './agrid-menu-bar.component.html',\n styleUrl: './agrid-menu-bar.component.css',\n})\nexport class AgridMenuBarComponent<T extends object = any> {\n items = input<readonly AgridMenuBarItem<T>[]>([]);\n context = input.required<AgridMenuBarContext<T>>();\n label = input<string>('Actions');\n openItemId = input<string | null>(null);\n\n action = output<string>();\n openItemIdChange = output<string | null>();\n\n resolveState(state: AgridMenuBarState<T> | undefined, fallback: boolean): boolean {\n if (typeof state === 'function') return state(this.context());\n return state ?? fallback;\n }\n\n isActive(item: AgridMenuBarMenuItem<T>): boolean {\n return this.resolveState(item.active, false);\n }\n\n isDisabled(item: AgridMenuBarMenuItem<T>): boolean {\n return this.resolveState(item.disabled, false);\n }\n\n visibleChildren(item: AgridMenuBarItem<T>): AgridMenuBarMenuItem<T>[] {\n return (item.items ?? []).filter(child => this.resolveState(child.visible, true));\n }\n\n runAction(event: Event, item: AgridMenuBarMenuItem<T>): void {\n event.stopPropagation();\n if (!this.resolveState(item.visible, true) || this.isDisabled(item)) return;\n this.action.emit(item.id);\n this.openItemIdChange.emit(null);\n }\n\n toggleMenu(event: Event, item: AgridMenuBarItem<T>): void {\n event.preventDefault();\n event.stopPropagation();\n if (this.isDisabled(item) || this.visibleChildren(item).length === 0) return;\n this.openItemIdChange.emit(this.openItemId() === item.id ? null : item.id);\n }\n\n onTriggerKeydown(event: KeyboardEvent, item: AgridMenuBarItem<T>): void {\n if (event.key !== 'ArrowDown' && event.key !== 'ArrowUp') return;\n event.preventDefault();\n event.stopPropagation();\n if (this.isDisabled(item) || this.visibleChildren(item).length === 0) return;\n this.openItemIdChange.emit(item.id);\n const group = (event.currentTarget as HTMLElement).closest('.ag-menu-bar-group');\n setTimeout(() => {\n const enabled = group?.querySelectorAll<HTMLButtonElement>(\n '.ag-menu-bar-dropdown [role=\"menuitem\"]:not(:disabled)',\n );\n const target = event.key === 'ArrowUp' ? enabled?.[enabled.length - 1] : enabled?.[0];\n target?.focus();\n });\n }\n\n onMenuKeydown(event: KeyboardEvent): void {\n const menu = event.currentTarget as HTMLElement;\n const items = Array.from(\n menu.querySelectorAll<HTMLButtonElement>('[role=\"menuitem\"]:not(:disabled)'),\n );\n if (event.key === 'Escape') {\n event.preventDefault();\n event.stopPropagation();\n this.openItemIdChange.emit(null);\n menu.closest('.ag-menu-bar-group')\n ?.querySelector<HTMLButtonElement>('.ag-menu-bar-trigger')\n ?.focus();\n return;\n }\n if (!['ArrowDown', 'ArrowUp', 'Home', 'End'].includes(event.key) || items.length === 0) return;\n event.preventDefault();\n event.stopPropagation();\n const current = items.indexOf(event.target as HTMLButtonElement);\n const next = event.key === 'Home'\n ? 0\n : event.key === 'End'\n ? items.length - 1\n : event.key === 'ArrowDown'\n ? (current + 1 + items.length) % items.length\n : (current - 1 + items.length) % items.length;\n items[next].focus();\n }\n}\n","<div class=\"ag-menu-bar\" role=\"toolbar\" [attr.aria-label]=\"label()\">\n @for (item of items(); track item.id) {\n @let children = visibleChildren(item);\n <div class=\"ag-menu-bar-group\" [attr.data-menu-id]=\"item.id\">\n <button type=\"button\" class=\"ag-menu-bar-button\"\n [class.ag-menu-bar-button--active]=\"isActive(item)\"\n [class.ag-menu-bar-button--split]=\"children.length > 0\"\n [disabled]=\"isDisabled(item)\"\n [attr.aria-pressed]=\"item.active !== undefined ? isActive(item) : null\"\n (click)=\"runAction($event, item)\">\n @if (item.icon) {\n <span class=\"ag-menu-bar-icon\" aria-hidden=\"true\">{{ item.icon }}</span>\n }\n <span class=\"ag-menu-bar-label\">{{ item.label }}</span>\n </button>\n @if (children.length > 0) {\n <button type=\"button\" class=\"ag-menu-bar-trigger\"\n [class.ag-menu-bar-trigger--open]=\"openItemId() === item.id\"\n [attr.aria-label]=\"item.label + ': ' + label()\"\n [attr.aria-expanded]=\"openItemId() === item.id\" aria-haspopup=\"menu\"\n [disabled]=\"isDisabled(item)\"\n (click)=\"toggleMenu($event, item)\"\n (keydown)=\"onTriggerKeydown($event, item)\">▾</button>\n @if (openItemId() === item.id) {\n <div class=\"ag-menu-bar-dropdown\" role=\"menu\" [attr.aria-label]=\"item.label\"\n (click)=\"$event.stopPropagation()\" (keydown)=\"onMenuKeydown($event)\">\n @for (child of children; track child.id) {\n <button type=\"button\" class=\"ag-menu-bar-dropdown-item\" role=\"menuitem\"\n [class.ag-menu-bar-dropdown-item--active]=\"isActive(child)\"\n [disabled]=\"isDisabled(child)\"\n [attr.aria-current]=\"isActive(child) ? 'true' : null\"\n (click)=\"runAction($event, child)\">\n <span class=\"ag-menu-bar-dropdown-check\" aria-hidden=\"true\">{{ isActive(child) ? '✓' : '' }}</span>\n @if (child.icon) {\n <span class=\"ag-menu-bar-icon\" aria-hidden=\"true\">{{ child.icon }}</span>\n }\n <span class=\"ag-menu-bar-label\">{{ child.label }}</span>\n </button>\n }\n </div>\n }\n }\n </div>\n }\n</div>\n","import { Signal, computed, signal } from '@angular/core';\n\n/**\n * A single reversible cell edit stored in the undo/redo history.\n * Both `oldValue` and `newValue` are the raw values as stored in the data source.\n */\nexport interface HistoryEntry {\n rowIndex: number;\n field: string;\n oldValue: unknown;\n newValue: unknown;\n}\n\n/** A single undo/redo history item. Multi-cell operations are stored as one batch. */\nexport type HistoryItem = HistoryEntry | HistoryEntry[];\n\n/**\n * Per-column filter state stored inside {@link AgridControl}.\n *\n * All three fields are independent — text, value selection, and sort are ANDed together\n * when computing the visible rows.\n */\n/**\n * Comparison operator for a column condition filter.\n * For `date` columns `gt`/`lt`/`eq` read as after / before / on.\n */\nexport type FilterOperator =\n | 'eq'\n | 'neq'\n | 'gt'\n | 'gte'\n | 'lt'\n | 'lte'\n | 'between'\n | 'like'\n | 'startsWith'\n | 'endsWith'\n | 'includes'\n | 'notIncludes';\n\nexport interface ColumnFilter {\n /** Free-text substring filter (case-insensitive). Empty string = no text filter. */\n text: string;\n /**\n * Allowed values for the value-picker filter.\n * - `null` → all values pass (no value filter active)\n * - `string[]` → only rows whose field value is in this list are shown\n */\n selectedValues: string[] | null;\n /** Sort direction, or `null` when this column is not sorted. */\n sort: 'asc' | 'desc' | null;\n /**\n * Condition operator for text, number, or date columns, or `null`/omitted when none.\n * Combined with text and value filters using AND semantics.\n */\n operator?: FilterOperator | null;\n /** Primary comparison operand (number as string, or `yyyy-mm-dd`). */\n operand?: string | null;\n /** Upper-bound operand used only when {@link operator} is `'between'`. */\n operand2?: string | null;\n}\n\n/** Serializable snapshot of the grid's UI state. Used with `toJSON` / `fromJSON`. */\nexport interface AgridControlState {\n /** Per-field column width overrides in pixels. */\n columnWidths: Record<string, number>;\n /** Per-field filter and sort state. Fields with default state may be omitted. */\n filters: Record<string, ColumnFilter>;\n /** Global quick-filter text matched across all visible columns. Empty string when inactive. */\n quickFilter?: string;\n /** When `true`, rows can be reordered by dragging the control-column handle. */\n allowRowReorder?: boolean;\n /** Field to group rows by, or `null` / omitted for no grouping. */\n groupByField?: string | null;\n /** Fields that are currently hidden from the grid view. */\n hiddenColumns?: string[];\n /** Ordered list of field names defining the column display order. */\n columnOrder?: string[];\n /** Fields that are pinned to the left edge. */\n pinnedColumns?: string[];\n /** Fields that are pinned to the right edge. */\n pinnedRightColumns?: string[];\n /** Ordered list of field names currently sorted, from highest to lowest priority. */\n sortOrder?: string[];\n /** Number of rows per page. `0` means no pagination (show all rows). */\n pageSize?: number;\n /** Current page (1-based). */\n currentPage?: number;\n /**\n * Total row count supplied by the server. When greater than zero the grid enters\n * server-side pagination mode: it no longer slices rows locally and instead emits\n * a `(pageChange)` event so the host can fetch the correct slice.\n */\n totalRows?: number;\n /** Per-field aggregate function set via the column menu. Only built-in string values are serializable. */\n aggregates?: Record<string, 'sum' | 'avg' | 'min' | 'max' | 'count'>;\n}\n\n/**\n * Signal-based container for mutable grid UI state such as column widths and active filters.\n *\n * Assign an instance to `AgridProvider.control` so the grid can store runtime state\n * in a place the host component can persist across sessions.\n *\n * @example\n * ```ts\n * // Restore saved state:\n * readonly ctrl = AgridControl.fromJSON(\n * JSON.parse(localStorage.getItem('grid') ?? '{}')\n * );\n *\n * // Save on demand:\n * localStorage.setItem('grid', JSON.stringify(this.ctrl.toJSON()));\n * ```\n */\nexport class AgridControl {\n private readonly _columnWidths = signal<Record<string, number>>({});\n private readonly _filters = signal<Record<string, ColumnFilter>>({});\n private readonly _quickFilter = signal<string>('');\n private readonly _allowRowReorder = signal<boolean>(false);\n private readonly _groupByField = signal<string | null>(null);\n private readonly _hiddenColumns = signal<Set<string>>(new Set());\n private readonly _columnOrder = signal<string[]>([]);\n private readonly _pinnedColumns = signal<Set<string>>(new Set());\n private readonly _pinnedRightColumns = signal<Set<string>>(new Set());\n private readonly _pageSize = signal<number>(0);\n private readonly _currentPage = signal<number>(1);\n private readonly _totalRows = signal<number>(0);\n private readonly _aggregates = signal<Record<string, 'sum' | 'avg' | 'min' | 'max' | 'count'>>({});\n private readonly _sortOrder = signal<string[]>([]);\n\n /** @param state Optional initial state, e.g. deserialized from storage. */\n constructor(state?: Partial<AgridControlState>) {\n if (state?.columnWidths) this._columnWidths.set({ ...state.columnWidths });\n if (state?.filters) this._filters.set({ ...state.filters });\n if (state?.quickFilter) this._quickFilter.set(state.quickFilter);\n if (state?.allowRowReorder) this._allowRowReorder.set(state.allowRowReorder);\n if (state?.groupByField !== undefined) this._groupByField.set(state.groupByField ?? null);\n if (state?.hiddenColumns?.length) this._hiddenColumns.set(new Set(state.hiddenColumns));\n if (state?.columnOrder?.length) this._columnOrder.set([...state.columnOrder]);\n if (state?.pinnedColumns?.length) this._pinnedColumns.set(new Set(state.pinnedColumns));\n if (state?.pinnedRightColumns?.length) this._pinnedRightColumns.set(new Set(state.pinnedRightColumns));\n if (state?.pageSize) this._pageSize.set(state.pageSize);\n if (state?.currentPage) this._currentPage.set(state.currentPage);\n if (state?.totalRows) this._totalRows.set(state.totalRows);\n if (state?.aggregates) this._aggregates.set({ ...state.aggregates });\n if (state?.sortOrder?.length) this._sortOrder.set([...state.sortOrder]);\n }\n\n /**\n * When `true`, the control column shows a drag handle and rows can be\n * reordered by dragging. Requires `showControlColumn` to be enabled on the grid.\n */\n readonly allowRowReorder: Signal<boolean> = this._allowRowReorder.asReadonly();\n\n /** Enable or disable row reordering at runtime. */\n setAllowRowReorder(value: boolean): void {\n this._allowRowReorder.set(value);\n }\n\n /**\n * The field currently used to group rows, or `null` when grouping is off.\n * When set, rows are bucketed by the display value of this field and a header\n * row is inserted before each group. Secondary sorts still apply within groups.\n */\n readonly groupByField: Signal<string | null> = this._groupByField.asReadonly();\n\n /**\n * Enable grouping by `field`, or pass `null` to turn grouping off.\n */\n setGroupBy(field: string | null): void {\n this._groupByField.set(field);\n }\n\n /**\n * Global quick-filter text. When non-empty (and not in server-side filtering mode),\n * the grid keeps only rows where at least one visible column's display value contains\n * this text (case-insensitive).\n */\n readonly quickFilter: Signal<string> = this._quickFilter.asReadonly();\n\n /** Set the global quick-filter text. Pass an empty string to clear it. */\n setQuickFilter(text: string): void {\n this._quickFilter.set(text);\n }\n\n /**\n * Reactive set of field names that are currently hidden.\n * An empty set means all columns are visible.\n */\n readonly hiddenColumns: Signal<Set<string>> = this._hiddenColumns.asReadonly();\n\n /** Return `true` when the given field is currently hidden. */\n isColumnHidden(field: string): boolean {\n return this._hiddenColumns().has(field);\n }\n\n /**\n * Show or hide a column by field name.\n * Hiding a column does not clear its filter or sort — they resume when it is shown again.\n */\n setColumnVisibility(field: string, visible: boolean): void {\n this._hiddenColumns.update(set => {\n const next = new Set(set);\n if (visible) next.delete(field);\n else next.add(field);\n return next;\n });\n }\n\n /** Toggle the visibility of a column. */\n toggleColumnVisibility(field: string): void {\n this.setColumnVisibility(field, this.isColumnHidden(field));\n }\n\n // ── Column order ──────────────────────────────────────────────────────────\n\n /**\n * Ordered list of field names that defines the left-to-right column display order.\n * An empty array means \"use the original `colDefs` order\".\n */\n readonly columnOrder: Signal<string[]> = this._columnOrder.asReadonly();\n\n /** Replace the entire column order with a new list of field names. */\n setColumnOrder(fields: string[]): void {\n this._columnOrder.set([...fields]);\n }\n\n /**\n * Move `fromField` to a new position relative to `toField`.\n * `currentVisibleOrder` should be the current `visibleColDefs` field array so the\n * operation works correctly whether or not an order has been set before.\n */\n moveColumn(currentVisibleOrder: string[], fromField: string, toField: string, insertBefore: boolean): void {\n this.moveColumns(currentVisibleOrder, [fromField], toField, insertBefore);\n }\n\n /**\n * Move an ordered block of fields to a new position relative to `toField`.\n * Fields absent from `currentVisibleOrder` are ignored.\n */\n moveColumns(\n currentVisibleOrder: string[],\n fromFields: readonly string[],\n toField: string,\n insertBefore: boolean,\n ): void {\n const order = [...currentVisibleOrder];\n const moving = order.filter(field => fromFields.includes(field));\n if (moving.length === 0 || moving.includes(toField)) return;\n const remaining = order.filter(field => !moving.includes(field));\n const toIdx = remaining.indexOf(toField);\n if (toIdx === -1) return;\n remaining.splice(insertBefore ? toIdx : toIdx + 1, 0, ...moving);\n this._columnOrder.set(remaining);\n }\n\n // ── Pinned columns ────────────────────────────────────────────────────────\n\n /** Reactive set of field names currently pinned to the left edge. */\n readonly pinnedColumns: Signal<Set<string>> = this._pinnedColumns.asReadonly();\n\n /** Return `true` when the given field is pinned. */\n isPinned(field: string): boolean {\n return this._pinnedColumns().has(field);\n }\n\n /** Pin or unpin a column to the left edge. Pinning left auto-unpins right. */\n setPinned(field: string, pinned: boolean): void {\n this._pinnedColumns.update(set => {\n const next = new Set(set);\n if (pinned) next.add(field); else next.delete(field);\n return next;\n });\n if (pinned) this._pinnedRightColumns.update(s => { const n = new Set(s); n.delete(field); return n; });\n }\n\n /** Toggle left-pin state of a column. */\n togglePinned(field: string): void {\n this.setPinned(field, !this.isPinned(field));\n }\n\n // ── Right pinning ─────────────────────────────────────────────────────────\n\n /** Reactive set of field names currently pinned to the right edge. */\n readonly pinnedRightColumns: Signal<Set<string>> = this._pinnedRightColumns.asReadonly();\n\n /** Return `true` when the given field is pinned to the right edge. */\n isPinnedRight(field: string): boolean {\n return this._pinnedRightColumns().has(field);\n }\n\n /** Pin or unpin a column to the right edge. Pinning right auto-unpins left. */\n setPinnedRight(field: string, pinned: boolean): void {\n this._pinnedRightColumns.update(set => {\n const next = new Set(set);\n if (pinned) next.add(field); else next.delete(field);\n return next;\n });\n if (pinned) this._pinnedColumns.update(s => { const n = new Set(s); n.delete(field); return n; });\n }\n\n /** Toggle right-pin state of a column. */\n togglePinnedRight(field: string): void {\n this.setPinnedRight(field, !this.isPinnedRight(field));\n }\n\n // ── Pagination ────────────────────────────────────────────────────────────\n\n /** Number of rows per page. `0` means all rows are shown (no pagination). */\n readonly pageSize: Signal<number> = this._pageSize.asReadonly();\n\n /** Current page number (1-based). */\n readonly currentPage: Signal<number> = this._currentPage.asReadonly();\n\n /** Set rows per page. Pass `0` to disable pagination. Resets to page 1. */\n setPageSize(size: number): void {\n this._pageSize.set(Math.max(0, size));\n this._currentPage.set(1);\n }\n\n /** Navigate to a specific page (1-based). Clamped to valid range by the grid. */\n setPage(page: number): void {\n this._currentPage.set(Math.max(1, page));\n }\n\n /**\n * Set the total number of rows available on the server.\n * When greater than zero the grid switches to **server-side pagination mode**:\n * - Rows in the data source are shown as-is (no local slicing).\n * - `totalPages` is derived from this value instead of the local row count.\n * - A `(pageChange)` event is emitted whenever the user navigates to a new page.\n *\n * Pass `0` to return to client-side pagination.\n */\n setTotalRows(count: number): void {\n this._totalRows.set(Math.max(0, count));\n }\n\n /**\n * Total server-side row count. `0` means client-side mode (grid slices locally).\n */\n readonly totalRows: Signal<number> = this._totalRows.asReadonly();\n\n // ── Aggregates ────────────────────────────────────────────────────────────\n\n /** Per-field aggregate overrides set via the column menu. */\n readonly aggregates: Signal<Record<string, 'sum' | 'avg' | 'min' | 'max' | 'count'>> = this._aggregates.asReadonly();\n\n /**\n * Set or clear the aggregate function for a column.\n * Pass `null` to remove the aggregate (hides the footer cell for that column).\n */\n setAggregate(field: string, fn: 'sum' | 'avg' | 'min' | 'max' | 'count' | null): void {\n this._aggregates.update(a => {\n const next = { ...a };\n if (fn === null) delete next[field];\n else next[field] = fn;\n return next;\n });\n }\n\n // ── Undo / redo history ────────────────────────────────────────────────────\n\n private readonly _history = signal<HistoryItem[]>([]);\n private readonly _historyPointer = signal<number>(-1);\n private static readonly MAX_HISTORY = 100;\n\n /** `true` when there is at least one edit that can be undone. */\n readonly canUndo = computed(() => this._historyPointer() >= 0);\n\n /** `true` when there is at least one edit that can be re-applied. */\n readonly canRedo = computed(() => this._historyPointer() < this._history().length - 1);\n\n /**\n * Record a committed cell edit in the history.\n * Calling this discards any redo entries that came after the current pointer.\n * Called automatically by the grid after every cell commit.\n */\n pushEdit(entry: HistoryEntry): void {\n this.pushHistoryItem(entry);\n }\n\n /** Record a multi-cell edit as one undo/redo step. */\n pushEditBatch(entries: HistoryEntry[]): void {\n if (entries.length === 0) return;\n this.pushHistoryItem(entries.length === 1 ? entries[0] : [...entries]);\n }\n\n private pushHistoryItem(item: HistoryItem): void {\n const pointer = this._historyPointer();\n const base = this._history().slice(0, pointer + 1);\n base.push(item);\n const trimmed = base.length > AgridControl.MAX_HISTORY\n ? base.slice(base.length - AgridControl.MAX_HISTORY)\n : base;\n this._history.set(trimmed);\n this._historyPointer.set(trimmed.length - 1);\n }\n\n /**\n * Move one step back in history and return the entry to reverse, or `null` if\n * already at the beginning. The caller is responsible for applying `oldValue`\n * back to the data source.\n */\n undo(): HistoryItem | null {\n const p = this._historyPointer();\n if (p < 0) return null;\n this._historyPointer.set(p - 1);\n return this._history()[p];\n }\n\n /**\n * Move one step forward in history and return the entry to re-apply, or `null`\n * if already at the end. The caller is responsible for applying `newValue` back\n * to the data source.\n */\n redo(): HistoryItem | null {\n const p = this._historyPointer();\n const h = this._history();\n if (p >= h.length - 1) return null;\n this._historyPointer.set(p + 1);\n return h[p + 1];\n }\n\n /** Clear the entire undo/redo history. */\n clearHistory(): void {\n this._history.set([]);\n this._historyPointer.set(-1);\n }\n\n /**\n * Reactive map of `field → pixel width`.\n * Only fields whose width was explicitly overridden are present; the grid falls\n * back to `ColDef.width` for fields not in this map.\n */\n readonly columnWidths: Signal<Record<string, number>> = this._columnWidths.asReadonly();\n\n /**\n * Reactive map of `field → ColumnFilter`.\n * Only fields with at least one active filter/sort condition are present.\n */\n readonly filters: Signal<Record<string, ColumnFilter>> = this._filters.asReadonly();\n\n // ── Column widths ──────────────────────────────────────────────────────────\n\n /**\n * Return the effective width for a column, falling back to `defaultWidth`\n * if no override exists.\n */\n getColumnWidth(field: string, defaultWidth: number): number {\n return this._columnWidths()[field] ?? defaultWidth;\n }\n\n /**\n * Set the width for a column. Enforces a minimum of 40 px.\n * Called by the grid when the user drags a resize handle.\n */\n setColumnWidth(field: string, width: number): void {\n this._columnWidths.update(w => ({ ...w, [field]: Math.max(40, width) }));\n }\n\n // ── Filters & sort ─────────────────────────────────────────────────────────\n\n /**\n * Return the current filter state for a field.\n * Returns a default (inactive) filter when no state is stored for the field.\n */\n getFilter(field: string): ColumnFilter {\n return this._filters()[field] ?? { text: '', selectedValues: null, sort: null };\n }\n\n /**\n * Set the free-text filter for a column.\n * An empty string removes the text filter for that column.\n */\n setTextFilter(field: string, text: string): void {\n this._filters.update(f => ({\n ...f,\n [field]: { ...this.getFilter(field), text },\n }));\n }\n\n /**\n * Set the value-picker selection for a column.\n * Pass `null` to show all values (clear the value filter).\n */\n setSelectedValues(field: string, values: string[] | null): void {\n this._filters.update(f => ({\n ...f,\n [field]: { ...this.getFilter(field), selectedValues: values },\n }));\n }\n\n /**\n * Set a column condition filter. Text columns support string operators while number/date\n * columns support comparison operators.\n * Pass `operator: null` (or an empty `operand`) to clear it. `operand2` is only used\n * by the `'between'` operator.\n */\n setRangeFilter(\n field: string,\n operator: FilterOperator | null,\n operand: string | null,\n operand2: string | null = null,\n ): void {\n this._filters.update(f => ({\n ...f,\n [field]: { ...this.getFilter(field), operator, operand, operand2 },\n }));\n }\n\n /** Ordered list of sorted field names, from highest to lowest priority. */\n readonly sortOrder: Signal<string[]> = this._sortOrder.asReadonly();\n\n /** Return the 1-based sort priority of a field, or `0` if it is not sorted. */\n getSortPriority(field: string): number {\n const idx = this._sortOrder().indexOf(field);\n return idx === -1 ? 0 : idx + 1;\n }\n\n /**\n * Set the sort direction for a column, clearing all other sorts.\n * Pass `null` to remove the sort entirely.\n * For multi-column sort use {@link addSort}.\n */\n setSort(field: string, sort: 'asc' | 'desc' | null): void {\n this._filters.update(f => {\n const next: Record<string, ColumnFilter> = {};\n for (const [k, v] of Object.entries(f)) {\n next[k] = k === field ? { ...v, sort } : { ...v, sort: null };\n }\n if (!next[field]) next[field] = { text: '', selectedValues: null, sort };\n return next;\n });\n this._sortOrder.set(sort ? [field] : []);\n }\n\n /**\n * Add a column to the multi-sort stack or update its direction.\n * If the column is already sorted, only its direction is updated (priority unchanged).\n * If not yet sorted, it is appended as the lowest-priority sort key.\n */\n addSort(field: string, sort: 'asc' | 'desc'): void {\n this._filters.update(f => ({\n ...f,\n [field]: { ...(f[field] ?? { text: '', selectedValues: null }), sort },\n }));\n this._sortOrder.update(order =>\n order.includes(field) ? order : [...order, field]\n );\n }\n\n /**\n * Remove all active filters and sort for a single column.\n */\n clearFilter(field: string): void {\n this._filters.update(f => {\n const next = { ...f };\n delete next[field];\n return next;\n });\n this._sortOrder.update(o => o.filter(f => f !== field));\n }\n\n /** Remove all active filters and sorts for every column, including the quick filter. */\n clearAllFilters(): void {\n this._filters.set({});\n this._sortOrder.set([]);\n this._quickFilter.set('');\n }\n\n /**\n * Return `true` when the given field has any active filter or sort.\n * Useful for showing a visual indicator on the column header.\n */\n hasActiveFilter(field: string): boolean {\n const f = this.getFilter(field);\n const hasRange = !!f.operator && f.operand != null && f.operand !== '';\n return !!(f.text || f.selectedValues !== null || f.sort || hasRange);\n }\n\n /** Return `true` when the quick filter or ANY column has an active filter or sort. */\n hasAnyActiveFilter(): boolean {\n return !!this._quickFilter() || Object.values(this._filters()).some(\n f => f.text || f.selectedValues !== null || f.sort\n || (!!f.operator && f.operand != null && f.operand !== '')\n );\n }\n\n // ── Serialization ──────────────────────────────────────────────────────────\n\n /** Serialize current state to a plain object suitable for JSON storage. */\n toJSON(): AgridControlState {\n return {\n columnWidths: { ...this._columnWidths() },\n filters: { ...this._filters() },\n quickFilter: this._quickFilter() || undefined,\n allowRowReorder: this._allowRowReorder(),\n groupByField: this._groupByField() ?? undefined,\n hiddenColumns: [...this._hiddenColumns()],\n columnOrder: [...this._columnOrder()],\n pinnedColumns: [...this._pinnedColumns()],\n pinnedRightColumns: [...this._pinnedRightColumns()],\n pageSize: this._pageSize(),\n currentPage: this._currentPage(),\n totalRows: this._totalRows(),\n aggregates: { ...this._aggregates() },\n sortOrder: [...this._sortOrder()],\n };\n }\n\n /** Restore an `AgridControl` from a previously serialized state. */\n static fromJSON(state: Partial<AgridControlState>): AgridControl {\n return new AgridControl(state);\n }\n}\n","import { Signal, WritableSignal, isWritableSignal, linkedSignal, signal } from '@angular/core';\n\n/**\n * Signal-based data container shared between the grid and the host component.\n *\n * Both the grid and the host component hold a reference to the same `AgridDataSource`\n * instance. Mutations made by either side (e.g. the grid calling `patchRow` when a cell\n * is committed, or the host calling `setData` to load fresh data) are immediately reflected\n * in the grid because {@link rows} is a readonly Angular signal.\n *\n * @example\n * ```ts\n * readonly ds = new AgridDataSource(generateRows(1000));\n *\n * // Later — update one row from outside the grid:\n * this.ds.patchRow(5, { salary: 99000 });\n * ```\n */\nexport class AgridDataSource<T extends object = any> {\n private readonly _linkedRows = signal<Signal<T[]> | null>(null);\n private readonly _rows = linkedSignal<T[]>(() => this._linkedRows()?.() ?? []);\n private _writableLinkedRows: WritableSignal<T[]> | null = null;\n private readonly _rowAdded = signal<{ index: number; sequence: number } | null>(null);\n private _changeSequence = 0;\n\n /**\n * @param initialData Rows to seed the data source with.\n * The array is shallow-copied so external mutations do not affect the source.\n */\n constructor(initialData: T[] = []) {\n this._rows.set([...initialData]);\n }\n\n /**\n * Readonly signal of the current row array.\n * Read it inside Angular templates or `computed()` to react to changes automatically.\n */\n readonly rows: Signal<T[]> = this._rows.asReadonly();\n\n /** Latest row insertion, used by attached grids to reveal the inserted row. */\n readonly rowAdded: Signal<{ index: number; sequence: number } | null> =\n this._rowAdded.asReadonly();\n\n /**\n * Link an external row signal to this data source.\n *\n * Whenever `source` changes, its array becomes the current datasource value without an\n * intermediate effect or array copy. If `source` is writable, datasource mutations are written\n * back to it automatically. Mutations remain local when linking a readonly signal.\n */\n linkSignal(source: Signal<T[]>): void {\n this._writableLinkedRows = isWritableSignal(source)\n ? source as WritableSignal<T[]>\n : null;\n this._linkedRows.set(source);\n }\n\n /**\n * Replace the entire row array.\n * Triggers a full grid re-render via the signal.\n */\n setData(rows: T[]): void {\n this.setRows([...rows]);\n }\n\n /**\n * Overwrite the row at `index` with a new row object.\n * Use {@link patchRow} when you only want to change specific fields.\n */\n updateRow(index: number, row: T): void {\n this.updateRows(rows => {\n const next = [...rows];\n next[index] = row;\n return next;\n });\n }\n\n /**\n * Merge `patch` into the existing row at `index`, leaving other fields untouched.\n * The grid calls this internally when a cell edit is committed.\n */\n patchRow(index: number, patch: Partial<T>): void {\n this.updateRows(rows => {\n const next = [...rows];\n next[index] = { ...next[index], ...patch } as T;\n return next;\n });\n }\n\n /**\n * Insert a row into the data source and return the index at which it was inserted.\n *\n * @param row The row object to insert.\n * @param atIndex Optional insertion index. Defaults to the end of the array.\n * @returns The index the row was inserted at.\n */\n addRow(row: T, atIndex?: number): number {\n let insertedAt!: number;\n this.updateRows(rows => {\n if (atIndex === undefined) {\n insertedAt = rows.length;\n return [...rows, row];\n }\n insertedAt = atIndex;\n const next = [...rows];\n next.splice(atIndex, 0, row);\n return next;\n });\n this._rowAdded.set({ index: insertedAt, sequence: ++this._changeSequence });\n return insertedAt;\n }\n\n /**\n * Remove the row at `index`.\n * The grid adjusts `selectedCell` and `editingCell` internally when a deletion occurs\n * via the control column context menu.\n */\n removeRow(index: number): void {\n this.updateRows(rows => rows.filter((_, i) => i !== index));\n }\n\n /**\n * Move the row at `from` to position `to` (insert-before semantics).\n * Designed to be called directly from a `(rowReorder)` handler:\n * ```ts\n * onReorder(e: RowReorderEvent) { this.ds.moveRow(e.oldIndex, e.newIndex); }\n * ```\n */\n moveRow(from: number, to: number): void {\n if (from === to) return;\n this.updateRows(rows => {\n const arr = [...rows];\n const [item] = arr.splice(from, 1);\n arr.splice(to > from ? to - 1 : to, 0, item);\n return arr;\n });\n }\n\n /** Return the current row at `index` (non-reactive snapshot). */\n getRow(index: number): T {\n return this._rows()[index];\n }\n\n /** Current number of rows (non-reactive snapshot). */\n get length(): number {\n return this._rows().length;\n }\n\n private updateRows(update: (rows: T[]) => T[]): void {\n this.setRows(update(this._rows()));\n }\n\n private setRows(rows: T[]): void {\n this._writableLinkedRows?.set(rows);\n this._rows.set(rows);\n }\n}\n","import { signal, WritableSignal } from '@angular/core';\nimport { AgridControl } from './agrid-control';\nimport { AgridDataSource } from './agrid-datasource';\nimport { AgridLocaleTextOverrides } from './agrid-localization';\nimport {\n AGridOptions,\n AgridEnterEditAction,\n AgridMenuBarItem,\n AgridTreeConfig,\n CellContextMenuItem,\n ColDef,\n GroupAction,\n HeaderGroup,\n} from './agrid.types';\n\n/** Configuration used to create an {@link AgridProvider}. */\nexport interface AgridProviderConfig<T extends object = any> extends Partial<AGridOptions> {\n /** Row data source. A new empty data source is created when omitted. */\n datasource?: AgridDataSource<T>;\n /** Stateful grid control. A default control is created when omitted. */\n control?: AgridControl;\n /** Initial column definitions in display order. */\n columns?: ColDef<T>[];\n /** Labels used by columns with a matching `group` identifier. */\n headerGroups?: HeaderGroup[];\n /**\n * Render rows as a hierarchical tree. When set, rows are nested by the configured\n * parent/child accessors and an expand/collapse twisty is shown on `treeField`.\n * Mutually exclusive with grouping and pagination.\n */\n treeConfig?: AgridTreeConfig<T>;\n /** Row height in pixels. Must be fixed for CDK virtual scroll. @default 32 */\n rowHeight?: number;\n /** Minimum height of the grid host element (e.g. `'200px'`). */\n minHeight?: string;\n /** Maximum height of the grid host element (e.g. `'500px'`). */\n maxHeight?: string;\n /** Show a `+ Add row` placeholder at the bottom. */\n allowAddRows?: boolean;\n /** Automatically insert a blank row when navigating past the last real row. */\n autoAddRows?: boolean;\n /** Show a 24 px control column with a drag handle and right-click context menu. */\n showControlColumn?: boolean;\n /** Show row-marking checkboxes in a 48 px control column for clipboard inclusion. @default false */\n enableRowMarking?: boolean;\n /** Show the sidebar panel. */\n showSidebar?: boolean;\n /** Automatically open the detail panel when a row is selected. */\n autoOpenDetail?: boolean;\n /**\n * Emit filter and sort changes for server processing instead of applying them locally.\n * The Excel-style value picker is hidden in this mode. @default false\n */\n serverSideFiltering?: boolean;\n /** Delay before emitting server-side text filter changes. Set to `0` to disable. @default 300 */\n filterDebounceMs?: number;\n /**\n * Show the global quick-filter box above the grid. In client mode it filters rows whose\n * visible columns contain the text; in `serverSideFiltering` mode it emits `(quickFilterChange)`\n * instead of filtering locally. @default false\n */\n enableQuickFilter?: boolean;\n /**\n * Optional command bar rendered above the column headers. Buttons and dropdown items emit\n * their id through the grid's single `(menuBarAction)` output.\n */\n menuBarItems?: AgridMenuBarItem<T>[];\n /**\n * Sorting behavior: one active column, multiple columns, or disabled entirely.\n * @default 'multi'\n */\n sortOption?: 'single' | 'multi' | 'none';\n /**\n * Row selection mode.\n * - `'none'` — no selection (default)\n * - `'single'` — click to select/deselect\n * - `'multi'` — Ctrl+click toggles, Shift+click extends range, click+drag sweeps\n */\n rowSelection?: 'single' | 'multi' | 'none';\n /**\n * Behavior after pressing Enter while an inline cell editor is active.\n * - `'nothing'` — commit and keep the current cell selected\n * - `'nextColumn'` — commit and move to the next column in the same row\n * - `'nextRow'` — commit and move to the same column one row down\n * @default 'nextRow'\n */\n enterEditAction?: AgridEnterEditAction;\n /** Returns a short description string shown next to the group label. */\n groupDescription?: ((label: string) => string) | null;\n /** Actions shown in the group header's `⋮` menu. */\n groupActions?: GroupAction[];\n /**\n * Extra items appended to the cell right-click context menu.\n * Pass `null` entries to insert separator lines.\n */\n cellMenuItems?: (CellContextMenuItem<T> | null)[];\n /** Shade every other row slightly for easier reading. @default false */\n zebraStripes?: boolean;\n /** Show a color marker on cells changed through grid editing. @default false */\n showChangedCellIndicator?: boolean;\n /** Ask for confirmation before grid row-delete actions. @default false */\n confirmRowDelete?: boolean;\n /** Make the entire grid read-only. @default false */\n readonly?: boolean;\n\n /** Restrict editing to the sidebar editor instead of inline cells. */\n useSidebarEditor?: boolean;\n\n /** Show a loading overlay over the grid body. @default false */\n loading?: boolean;\n /** Message shown when the grid has no rows to display. */\n emptyText?: string;\n\n /**\n * Return one or more CSS class names applied to a whole data row, based on its data and index.\n * Complements the per-cell {@link ColDef.cellClass}.\n *\n * @example\n * ```ts\n * getRowClass: ({ row }) => row.status === 'overdue' ? 'row-danger' : ''\n * ```\n */\n getRowClass?: (params: { row: T; index: number }) => string;\n\n /**\n * Designate rows to pin to the top or bottom of the grid body. Pinned rows stay visible during\n * vertical scroll and are excluded from grouping and pagination, but remain fully interactive\n * (editable/selectable) because they keep their real data-source index.\n *\n * Return `'top'`, `'bottom'`, or `undefined` (a normal scrolling row).\n *\n * @example\n * ```ts\n * pinRow: row => row.isSummary ? 'bottom' : undefined\n * ```\n */\n pinRow?: (row: T, index: number) => 'top' | 'bottom' | undefined;\n\n /**\n * Enable master/detail rows: each flat data row, or each leaf row in tree mode, can expand to\n * reveal a detail panel rendered beneath it. Requires {@link detailRenderer}. Grouped mode is\n * not supported. @default false\n */\n masterDetail?: boolean;\n /**\n * Returns the HTML shown inside an expanded detail panel. Angular's built-in HTML sanitization\n * is applied automatically (same as {@link ColDef.cellRenderer}).\n *\n * @example\n * ```ts\n * detailRenderer: ({ row }) => `<div class=\"detail\">${row.notes}</div>`\n * ```\n */\n detailRenderer?: (params: { row: T }) => string;\n /** Fixed height in pixels of an expanded detail panel row. @default 200 */\n detailRowHeight?: number;\n}\n\n/**\n * Bundles a grid's data source, control state, columns, and display options.\n *\n * Create one provider per independent grid instance. A provider may be selected\n * from an array when a component renders multiple grids.\n */\nexport class AgridProvider<T extends object = any> {\n /** Mutable row data consumed by the grid. */\n datasource: AgridDataSource<T>;\n /** Runtime UI state and imperative grid controls. */\n control: AgridControl;\n /** Reactive column definitions in display order. */\n readonly columns: WritableSignal<ColDef<T>[]>;\n /** Header-group labels referenced by column definitions. */\n headerGroups: HeaderGroup[];\n /** Tree configuration, or `null` when the grid is not in tree mode. */\n treeConfig: AgridTreeConfig<T> | null;\n /** Shared grid options such as locale. */\n options: AGridOptions;\n\n private readonly _localizations = new Map<string, AgridLocaleTextOverrides>();\n\n /** Read-only view of registered per-locale text overrides. Used by the grid to resolve locale text. */\n get localizations(): ReadonlyMap<string, AgridLocaleTextOverrides> {\n return this._localizations;\n }\n\n /**\n * Register locale-specific label overrides. Call multiple times for multiple locales.\n * When `locale` is `'auto'`, the grid matches the browser language against registered locales\n * (exact match first, then primary-language match, e.g. `'fr'` matches a browser locale of `'fr-FR'`).\n *\n * @example\n * provider.addLocalization('fr-FR', { addRow: 'Ajouter une ligne', noRows: 'Aucune donnée' });\n */\n addLocalization(locale: string, overrides: AgridLocaleTextOverrides): this {\n this._localizations.set(locale, overrides);\n return this;\n }\n\n /** Fixed virtual-scroll row height in pixels. */\n rowHeight: number;\n /** Minimum CSS height of the grid host. */\n minHeight?: string;\n /** Maximum CSS height of the grid host. */\n maxHeight?: string;\n /** Whether the add-row placeholder is shown. */\n allowAddRows: boolean;\n /** Whether the control column is rendered. */\n showControlColumn: boolean;\n /** Whether rows can be marked for inclusion in clipboard copies. */\n enableRowMarking: boolean;\n /** Whether the sidebar is available. */\n showSidebar: boolean;\n /** Whether selecting a row automatically opens its detail panel. */\n autoOpenDetail: boolean;\n /** Whether filter and sort operations are delegated to the host. */\n serverSideFiltering: boolean;\n /** Delay before server-side filter events are emitted. */\n filterDebounceMs: number;\n /** Whether the global quick-filter box is shown above the grid. */\n enableQuickFilter: boolean;\n /** Commands rendered in the optional menu bar above the column headers. */\n menuBarItems: AgridMenuBarItem<T>[];\n /** Enabled sorting mode. */\n sortOption: 'single' | 'multi' | 'none';\n /** Toggle auto-add-rows without recreating the provider. @default signal(false) */\n readonly autoAddRows: WritableSignal<boolean>;\n /** Enabled row-selection mode. */\n rowSelection: 'single' | 'multi' | 'none';\n /** Behavior after pressing Enter while an inline cell editor is active. */\n enterEditAction: AgridEnterEditAction;\n /** Optional description shown beside each group heading. */\n groupDescription: ((label: string) => string) | null;\n /** Actions available from group headers. */\n groupActions: GroupAction[];\n /** Additional cell context-menu entries. */\n cellMenuItems: (CellContextMenuItem<T> | null)[];\n /** Whether alternating data rows receive stripe styling. */\n zebraStripes: boolean;\n /** Whether committed cell changes receive a visual marker. */\n showChangedCellIndicator: boolean;\n /** Whether grid row-delete actions require in-row confirmation. */\n confirmRowDelete: boolean;\n /** Optional empty-state text override. */\n emptyText?: string;\n /** Whether edits are restricted to the sidebar editor. */\n useSidebarEditor: boolean;\n\n /** Optional callback returning CSS classes for a whole data row. */\n getRowClass?: (params: { row: T; index: number }) => string;\n /** Optional callback designating rows pinned to the top or bottom of the body. */\n pinRow?: (row: T, index: number) => 'top' | 'bottom' | undefined;\n /** Whether master/detail expandable detail rows are enabled. */\n masterDetail: boolean;\n /** Returns the sanitized HTML rendered inside an expanded detail panel. */\n detailRenderer?: (params: { row: T }) => string;\n /** Fixed height in pixels of an expanded detail panel row. */\n detailRowHeight: number;\n\n /** Toggle the loading overlay without recreating the provider. @default signal(false) */\n readonly loading: WritableSignal<boolean>;\n /** Toggle readonly mode without recreating the provider. @default signal(false) */\n readonly readonlyGrid: WritableSignal<boolean>;\n\n /** Creates a provider from the supplied data, state, columns, and display options. */\n constructor(config: AgridProviderConfig<T> = {}) {\n this.options = { locale: config.locale ?? 'auto' };\n this.datasource = config.datasource ?? new AgridDataSource<T>([]);\n this.control = config.control ?? new AgridControl({ allowRowReorder: true });\n this.columns = signal(config.columns ?? []);\n this.headerGroups = config.headerGroups ?? [];\n this.treeConfig = config.treeConfig ?? null;\n\n this.rowHeight = config.rowHeight ?? 32;\n this.minHeight = config.minHeight;\n this.maxHeight = config.maxHeight;\n this.allowAddRows = config.allowAddRows ?? false;\n this.autoAddRows = signal(config.autoAddRows ?? false);\n this.showControlColumn = config.showControlColumn ?? false;\n this.enableRowMarking = config.enableRowMarking ?? false;\n this.showSidebar = config.showSidebar ?? false;\n this.autoOpenDetail = config.autoOpenDetail ?? false;\n this.serverSideFiltering = config.serverSideFiltering ?? false;\n this.filterDebounceMs = Math.max(0, config.filterDebounceMs ?? 300);\n this.enableQuickFilter = config.enableQuickFilter ?? false;\n this.menuBarItems = config.menuBarItems ?? [];\n this.sortOption = config.sortOption ?? 'multi';\n this.rowSelection = config.rowSelection ?? 'none';\n this.enterEditAction = config.enterEditAction ?? 'nextRow';\n this.groupDescription = config.groupDescription ?? null;\n this.groupActions = config.groupActions ?? [];\n this.cellMenuItems = config.cellMenuItems ?? [];\n this.zebraStripes = config.zebraStripes ?? false;\n this.showChangedCellIndicator = config.showChangedCellIndicator ?? false;\n this.confirmRowDelete = config.confirmRowDelete ?? false;\n this.emptyText = config.emptyText;\n this.loading = signal(config.loading ?? false);\n this.readonlyGrid = signal(config.readonly ?? false);\n this.useSidebarEditor = config.useSidebarEditor ?? false;\n this.getRowClass = config.getRowClass;\n this.pinRow = config.pinRow;\n this.masterDetail = config.masterDetail ?? false;\n this.detailRenderer = config.detailRenderer;\n this.detailRowHeight = config.detailRowHeight ?? 200;\n }\n\n /** Returns the current reactive row array. */\n getGridData(): T[] {\n return this.datasource.rows();\n }\n}\n","import { Signal, computed } from '@angular/core';\nimport { AgridControl, ColumnFilter } from '../agrid-control';\nimport { AgridDataSource } from '../agrid-datasource';\nimport { AgridTreeConfig, ColDef, GridItem } from '../agrid.types';\nimport {\n applyQuickFilter,\n applySortToIndices,\n applyTextAndValueFilters,\n buildGroupedItems,\n buildPathTreeItems,\n buildTreeItems,\n computeAggregates,\n isPathTreeConfig,\n} from '../agrid.utils';\n\n/** Expanded labels associated with the current grouping field. @internal */\nexport interface AgridGroupExpansionState {\n field: string | null;\n labels: Set<string>;\n}\n\n/** Reactive inputs required by {@link AgridProjectionModel}. @internal */\nexport interface AgridProjectionOptions {\n dataSource: Signal<AgridDataSource>;\n control: Signal<AgridControl | null>;\n colDefs: Signal<ColDef[]>;\n visibleColDefs: Signal<ColDef[]>;\n locale: Signal<string>;\n serverSideFiltering: Signal<boolean>;\n sortOption: Signal<'single' | 'multi' | 'none'>;\n allowAddRows: Signal<boolean>;\n autoAddRows: Signal<boolean>;\n expandedGroups: Signal<AgridGroupExpansionState>;\n /** Tree configuration, or `null` when the grid is not in tree mode. */\n treeConfig: Signal<AgridTreeConfig | null>;\n /** Expanded node ids when tree mode is active. */\n expandedTreeIds: Signal<Set<string | number>>;\n /** Host callback designating rows pinned to the top/bottom, or `undefined` when not pinning. */\n pinRow?: Signal<((row: Record<string, unknown>, index: number) => 'top' | 'bottom' | undefined) | undefined>;\n /** Whether master/detail expandable rows are enabled. */\n masterDetail?: Signal<boolean>;\n /** Original indices of rows whose detail panel is currently expanded. */\n expandedDetailIds?: Signal<Set<number>>;\n}\n\n/**\n * Computes the visible row projection and aggregate state from grid data and controls.\n * @internal\n */\nexport class AgridProjectionModel {\n constructor(private readonly opts: AgridProjectionOptions) {}\n\n /** Filtered and sorted source indices before pagination or grouping. */\n readonly filteredSortedIndices = computed<number[]>(() => {\n const rows = this.opts.dataSource().rows();\n const control = this.opts.control();\n const colMap = this.columnMap();\n let indices = rows.map((_, index) => index);\n\n if (!control || this.opts.serverSideFiltering()) return indices;\n\n const filters = control.filters();\n indices = applyTextAndValueFilters(\n rows,\n indices,\n filters,\n colMap,\n this.opts.locale(),\n );\n const quick = control.quickFilter();\n if (quick) {\n indices = applyQuickFilter(rows, indices, quick, this.opts.visibleColDefs(), this.opts.locale());\n }\n if (control.groupByField()) return indices;\n\n const sortEntries = this.sortEntries(filters);\n return sortEntries.length\n ? applySortToIndices(rows, indices, sortEntries, colMap, this.opts.locale())\n : indices;\n });\n\n /** Total filtered row count, unaffected by client-side pagination. */\n readonly filteredRowCount = computed(() => this.filteredSortedIndices().length);\n\n /** Whether row pinning is active: a `pinRow` callback is supplied and not in tree mode. */\n private readonly pinningActive = computed(() => !!this.opts.pinRow?.() && !this.opts.treeConfig());\n\n /**\n * Partitions the filtered+sorted indices into top-pinned, bottom-pinned, and a body set.\n * Pinned rows keep their real source index, so editing/selection over them is unchanged.\n */\n private readonly partitionPinned = computed<{ top: number[]; bottom: number[]; bodySet: Set<number> }>(() => {\n if (!this.pinningActive()) return { top: [], bottom: [], bodySet: new Set<number>() };\n const rows = this.opts.dataSource().rows();\n const pinRow = this.opts.pinRow!()!;\n const top: number[] = [];\n const bottom: number[] = [];\n const bodySet = new Set<number>();\n for (const index of this.filteredSortedIndices()) {\n const where = pinRow(rows[index], index);\n if (where === 'top') top.push(index);\n else if (where === 'bottom') bottom.push(index);\n else bodySet.add(index);\n }\n return { top, bottom, bodySet };\n });\n\n /** Top-pinned rows as data-row items, in filtered+sorted order. */\n readonly pinnedTopItems = computed<{ row: Record<string, unknown>; originalIndex: number }[]>(() => {\n const rows = this.opts.dataSource().rows();\n return this.partitionPinned().top.map(originalIndex => ({ row: rows[originalIndex], originalIndex }));\n });\n\n /** Bottom-pinned rows as data-row items, in filtered+sorted order. */\n readonly pinnedBottomItems = computed<{ row: Record<string, unknown>; originalIndex: number }[]>(() => {\n const rows = this.opts.dataSource().rows();\n return this.partitionPinned().bottom.map(originalIndex => ({ row: rows[originalIndex], originalIndex }));\n });\n\n /** All source indices in active sort order, ignoring filters. Used for tree ancestor ordering. */\n private readonly allSortedIndices = computed<number[]>(() => {\n const rows = this.opts.dataSource().rows();\n const control = this.opts.control();\n const indices = rows.map((_, index) => index);\n if (!control || this.opts.serverSideFiltering()) return indices;\n const sortEntries = this.sortEntries(control.filters());\n return sortEntries.length\n ? applySortToIndices(rows, indices, sortEntries, this.columnMap(), this.opts.locale())\n : indices;\n });\n\n /** Total page count using server total when server-side pagination is active. */\n readonly totalPages = computed(() => {\n const control = this.opts.control();\n const pageSize = control?.pageSize() ?? 0;\n if (pageSize <= 0) return 1;\n const count = (control?.totalRows() ?? 0) > 0\n ? control!.totalRows()\n : this.filteredSortedIndices().length;\n return Math.max(1, Math.ceil(count / pageSize));\n });\n\n /** Whether client or server pagination controls should be rendered. */\n readonly showPagination = computed(() => {\n const control = this.opts.control();\n if (this.opts.treeConfig()) return false;\n return (control?.pageSize() ?? 0) > 0 && !control?.groupByField();\n });\n\n /** Whether at least one visible column has an aggregate footer. */\n readonly showFooter = computed(() => {\n const aggregates = this.opts.control()?.aggregates() ?? {};\n return this.opts.visibleColDefs().some(col => col.aggregate || aggregates[col.field]);\n });\n\n /** Aggregate values computed over all filtered rows, before pagination. */\n readonly footerValues = computed<Record<string, unknown>>(() =>\n computeAggregates(\n this.opts.dataSource().rows(),\n this.filteredSortedIndices(),\n this.opts.visibleColDefs(),\n this.opts.control()?.aggregates() ?? {},\n ),\n );\n\n /** Filtered, sorted, paginated, and optionally grouped virtual-scroll items. */\n readonly filteredItems = computed<GridItem[]>(() => {\n const rows = this.opts.dataSource().rows();\n const control = this.opts.control();\n let indices = this.filteredSortedIndices();\n\n // Tree mode takes precedence over grouping/pagination: the already filtered-and-sorted\n // indices are flattened into a hierarchy honoring the expanded-id set.\n const treeConfig = this.opts.treeConfig();\n if (treeConfig) {\n const expandedIds = this.opts.expandedTreeIds();\n\n // When a text/value filter is active, keep the ancestors of every match visible (and\n // force their path open) so deep matches don't vanish under filtered-out parents.\n const filters = control?.filters() ?? {};\n const filterActive = !this.opts.serverSideFiltering()\n && Object.values(filters).some(f => f.text || f.selectedValues !== null);\n\n if (isPathTreeConfig(treeConfig)) {\n const items = this.appendTreeDetailItems(\n buildPathTreeItems(\n rows,\n indices,\n treeConfig,\n expandedIds,\n filterActive && treeConfig.keepAncestorsOnFilter !== false,\n ),\n rows,\n treeConfig,\n );\n this.appendAddRow(items);\n return items;\n }\n\n if (filterActive && treeConfig.keepAncestorsOnFilter !== false) {\n const { getId, getParentId } = treeConfig;\n const idToIndex = new Map<string | number, number>();\n rows.forEach((row, index) => idToIndex.set(getId(row), index));\n\n const visible = new Set<number>(indices);\n const forced = new Set<string | number>();\n for (const matched of indices) {\n let parentId = getParentId(rows[matched]);\n while (parentId != null && idToIndex.has(parentId)) {\n const parentIndex = idToIndex.get(parentId)!;\n forced.add(parentId);\n if (visible.has(parentIndex)) break; // chain already added by an earlier match\n visible.add(parentIndex);\n parentId = getParentId(rows[parentIndex]);\n }\n }\n\n const ordered = this.allSortedIndices().filter(index => visible.has(index));\n const items = this.appendTreeDetailItems(\n buildTreeItems(rows, ordered, treeConfig, expandedIds, forced),\n rows,\n treeConfig,\n );\n this.appendAddRow(items);\n return items;\n }\n\n const items = this.appendTreeDetailItems(\n buildTreeItems(rows, indices, treeConfig, expandedIds),\n rows,\n treeConfig,\n );\n this.appendAddRow(items);\n return items;\n }\n\n // Pull pinned rows out of the body; they render in fixed top/bottom containers instead.\n if (this.pinningActive()) {\n const bodySet = this.partitionPinned().bodySet;\n indices = indices.filter(index => bodySet.has(index));\n }\n\n if (control) {\n const groupField = control.groupByField();\n const pageSize = control.pageSize();\n const serverPagination = control.totalRows() > 0;\n if (pageSize > 0 && !serverPagination && !groupField) {\n const page = Math.max(1, Math.min(control.currentPage(), this.totalPages()));\n indices = indices.slice((page - 1) * pageSize, page * pageSize);\n }\n\n if (groupField) {\n const expansion = this.opts.expandedGroups();\n const expandedLabels = expansion.field === groupField\n ? expansion.labels\n : new Set<string>();\n const filters = control.filters();\n const sortEntries = this.opts.serverSideFiltering()\n ? []\n : this.sortEntries(filters);\n const items = buildGroupedItems(\n rows,\n indices,\n groupField,\n this.columnMap(),\n sortEntries,\n expandedLabels,\n this.opts.locale(),\n this.opts.visibleColDefs(),\n control.aggregates(),\n );\n this.appendAddRow(items);\n return items;\n }\n }\n\n // Flat mode: optionally interleave a master/detail panel item after each expanded row.\n const expandedDetail = this.opts.masterDetail?.() ? this.opts.expandedDetailIds?.() : null;\n const items: GridItem[] = [];\n for (const originalIndex of indices) {\n const row = rows[originalIndex];\n items.push({ row, originalIndex });\n if (expandedDetail?.has(originalIndex)) items.push({ detailFor: originalIndex, row });\n }\n this.appendAddRow(items);\n return items;\n });\n\n /** Returns sorted fields after applying the configured sorting mode. */\n effectiveSortOrder(): string[] {\n const option = this.opts.sortOption();\n if (option === 'none') return [];\n const order = this.opts.control()?.sortOrder() ?? [];\n return option === 'single' ? order.slice(-1) : order;\n }\n\n private columnMap(): Map<string, ColDef> {\n return new Map(this.opts.colDefs().map(col => [col.field, col]));\n }\n\n private sortEntries(filters: Record<string, ColumnFilter>): [string, ColumnFilter][] {\n return this.effectiveSortOrder()\n .map(field => [field, filters[field]] as [string, ColumnFilter])\n .filter(([, filter]) => !!filter?.sort);\n }\n\n private appendTreeDetailItems(\n items: GridItem[],\n rows: Record<string, unknown>[],\n treeConfig: AgridTreeConfig,\n ): GridItem[] {\n const expandedDetail = this.opts.masterDetail?.() ? this.opts.expandedDetailIds?.() : null;\n if (!expandedDetail?.size) return items;\n\n const parentIds = !isPathTreeConfig(treeConfig)\n ? new Set(\n rows\n .map(row => treeConfig.getParentId(row))\n .filter((id): id is string | number => id !== null && id !== undefined),\n )\n : new Set<string | number>();\n const result: GridItem[] = [];\n for (const item of items) {\n result.push(item);\n if (\n item\n && typeof item === 'object'\n && 'originalIndex' in item\n && (\n isPathTreeConfig(treeConfig)\n || !parentIds.has(treeConfig.getId(item.row))\n )\n && expandedDetail.has(item.originalIndex)\n ) {\n result.push({ detailFor: item.originalIndex, row: item.row });\n }\n }\n return result;\n }\n\n private appendAddRow(items: GridItem[]): void {\n if (this.opts.allowAddRows() && !this.opts.autoAddRows()) items.push(null);\n }\n}\n","import { DestroyRef, Signal, WritableSignal, signal } from '@angular/core';\nimport { AgridBrowserAdapter } from '../infrastructure/agrid-browser.adapter';\nimport { CellRange } from './agrid-clipboard.handler';\nimport { AgridControl, HistoryEntry } from '../agrid-control';\nimport { AgridDataSource } from '../agrid-datasource';\nimport { CellPosition, ColDef, GridEditEvent, GridItem } from '../agrid.types';\nimport { isDataRowItem } from '../agrid.utils';\n\n/** Rectangular bounds in projected row and visible column coordinates. @internal */\nexport type VisibleCellBounds = {\n rowStart: number;\n rowEnd: number;\n colStart: number;\n colEnd: number;\n};\n\n/** Dependencies and callbacks required by {@link AgridRangeController}. @internal */\nexport interface AgridRangeControllerOptions {\n control: Signal<AgridControl | null>;\n dataSource: Signal<AgridDataSource>;\n filteredItems: Signal<GridItem[]>;\n visibleColDefs: Signal<ColDef[]>;\n selectedCell: WritableSignal<CellPosition | null>;\n selectedRange: WritableSignal<CellRange | null>;\n isCellEditable: (col: ColDef, originalIndex: number) => boolean;\n cancelEdit: () => void;\n findDisplayIndex: (originalIndex: number) => number;\n scrollToCell: (displayIndex: number, colIndex: number) => void;\n onCellEdit: (event: GridEditEvent) => void;\n}\n\n/** Owns cell-range calculations and fill-handle drag/application behavior. @internal */\nexport class AgridRangeController {\n readonly fillPreviewBounds = signal<VisibleCellBounds | null>(null);\n private fillDragSource: VisibleCellBounds | null = null;\n\n constructor(\n private readonly opts: AgridRangeControllerOptions,\n destroyRef: DestroyRef,\n private readonly browser = new AgridBrowserAdapter(),\n ) {\n destroyRef.onDestroy(() => this.cancelFill());\n }\n\n /** Extends the current range focus to a source row and visible column. */\n extendTo(rowIndex: number, colIndex: number): void {\n const selected = this.opts.selectedCell();\n const anchor = this.opts.selectedRange()?.anchor ?? selected ?? { rowIndex, colIndex };\n const focus = { rowIndex, colIndex };\n this.opts.selectedCell.set(focus);\n this.opts.selectedRange.set({ anchor, focus });\n }\n\n /** Returns selected range bounds in projected display coordinates. */\n getVisibleRangeBounds(): VisibleCellBounds | null {\n const range = this.opts.selectedRange();\n if (!range) return null;\n const anchorDisplayIndex = this.opts.findDisplayIndex(range.anchor.rowIndex);\n const focusDisplayIndex = this.opts.findDisplayIndex(range.focus.rowIndex);\n if (anchorDisplayIndex < 0 || focusDisplayIndex < 0) return null;\n return {\n rowStart: Math.min(anchorDisplayIndex, focusDisplayIndex),\n rowEnd: Math.max(anchorDisplayIndex, focusDisplayIndex),\n colStart: Math.min(range.anchor.colIndex, range.focus.colIndex),\n colEnd: Math.max(range.anchor.colIndex, range.focus.colIndex),\n };\n }\n\n /** Returns range bounds, falling back to the active cell. */\n getActiveSelectionBounds(): VisibleCellBounds | null {\n const range = this.getVisibleRangeBounds();\n if (range) return range;\n const selected = this.opts.selectedCell();\n if (!selected) return null;\n const displayIndex = this.opts.findDisplayIndex(selected.rowIndex);\n if (displayIndex < 0) return null;\n return {\n rowStart: displayIndex,\n rowEnd: displayIndex,\n colStart: selected.colIndex,\n colEnd: selected.colIndex,\n };\n }\n\n /** Returns whether a cell is inside the selected range. */\n isRangeSelected(originalIndex: number, colIndex: number): boolean {\n const range = this.getVisibleRangeBounds();\n if (!range) return false;\n const displayIndex = this.opts.findDisplayIndex(originalIndex);\n return displayIndex >= range.rowStart && displayIndex <= range.rowEnd\n && colIndex >= range.colStart && colIndex <= range.colEnd;\n }\n\n /** Returns whether a cell owns the selection's fill handle. */\n isFillHandleCell(originalIndex: number, colIndex: number): boolean {\n const bounds = this.getActiveSelectionBounds();\n if (!bounds) return false;\n const displayIndex = this.opts.findDisplayIndex(originalIndex);\n return displayIndex === bounds.rowEnd && colIndex === bounds.colEnd;\n }\n\n /** Returns whether a cell is inside the pending fill extension. */\n isFillPreviewCell(originalIndex: number, colIndex: number): boolean {\n const source = this.fillDragSource;\n const target = this.fillPreviewBounds();\n if (!source || !target) return false;\n const displayIndex = this.opts.findDisplayIndex(originalIndex);\n const insideTarget = displayIndex >= target.rowStart && displayIndex <= target.rowEnd\n && colIndex >= target.colStart && colIndex <= target.colEnd;\n const insideSource = displayIndex >= source.rowStart && displayIndex <= source.rowEnd\n && colIndex >= source.colStart && colIndex <= source.colEnd;\n return insideTarget && !insideSource;\n }\n\n /** Starts a fill-handle drag from the active selection corner. */\n startFill(event: PointerEvent, originalIndex: number, colIndex: number): void {\n if (event.button !== 0 || !this.isFillHandleCell(originalIndex, colIndex)) return;\n if (!this.isFillHandleHit(event)) return;\n const bounds = this.getActiveSelectionBounds();\n if (!bounds) return;\n event.preventDefault();\n event.stopPropagation();\n this.opts.cancelEdit();\n this.fillDragSource = bounds;\n this.fillPreviewBounds.set(null);\n this.browser.addDocumentListener('pointermove', this.fillDragMove);\n this.browser.addDocumentListener('pointerup', this.fillDragUp);\n this.browser.addDocumentListener('pointercancel', this.fillDragCancel);\n }\n\n /** Repeats source values across the target range as one history operation. */\n applyFill(source: VisibleCellBounds, target: VisibleCellBounds): void {\n const items = this.opts.filteredItems();\n const cols = this.opts.visibleColDefs();\n const sourceRows = this.getDataDisplayIndices(source.rowStart, source.rowEnd);\n const targetRows = this.getDataDisplayIndices(target.rowStart, target.rowEnd);\n if (sourceRows.length === 0 || targetRows.length === 0) return;\n\n const sourceValues = sourceRows.map(displayIndex => {\n const item = items[displayIndex];\n return isDataRowItem(item)\n ? cols.slice(source.colStart, source.colEnd + 1).map(col => item.row[col.field])\n : [];\n });\n\n let lastPosition: CellPosition | null = null;\n const historyEntries: HistoryEntry[] = [];\n for (let rowOffset = 0; rowOffset < targetRows.length; rowOffset++) {\n const displayIndex = targetRows[rowOffset];\n const item = items[displayIndex];\n if (!isDataRowItem(item)) continue;\n for (let colIndex = target.colStart; colIndex <= target.colEnd; colIndex++) {\n const insideSource = displayIndex >= source.rowStart && displayIndex <= source.rowEnd\n && colIndex >= source.colStart && colIndex <= source.colEnd;\n if (insideSource) continue;\n const col = cols[colIndex];\n if (!col || !this.opts.isCellEditable(col, item.originalIndex)) continue;\n const sourceRowIndex = rowOffset % sourceValues.length;\n const sourceRowValues = sourceValues[sourceRowIndex];\n if (sourceRowValues.length === 0) continue;\n const sourceColIndex = (colIndex - source.colStart) % sourceRowValues.length;\n const oldValue = this.opts.dataSource().getRow(item.originalIndex)[col.field];\n const newValue = sourceRowValues[sourceColIndex];\n if (oldValue === newValue) continue;\n\n this.opts.dataSource().patchRow(item.originalIndex, { [col.field]: newValue });\n historyEntries.push({\n rowIndex: item.originalIndex,\n field: col.field,\n oldValue,\n newValue,\n });\n this.opts.onCellEdit({\n position: { rowIndex: item.originalIndex, colIndex },\n field: col.field,\n oldValue,\n newValue,\n });\n lastPosition = { rowIndex: item.originalIndex, colIndex };\n }\n }\n\n this.opts.control()?.pushEditBatch(historyEntries);\n const targetItem = items[target.rowEnd];\n if (isDataRowItem(targetItem)) {\n this.opts.selectedCell.set({ rowIndex: targetItem.originalIndex, colIndex: target.colEnd });\n this.opts.selectedRange.set({\n anchor: this.positionFromVisibleCell(source.rowStart, source.colStart),\n focus: { rowIndex: targetItem.originalIndex, colIndex: target.colEnd },\n });\n } else if (lastPosition) {\n this.opts.selectedCell.set(lastPosition);\n }\n }\n\n private readonly fillDragMove = (event: PointerEvent): void => {\n const source = this.fillDragSource;\n if (!source) return;\n const target = this.getHoveredCellPosition(event.clientX, event.clientY);\n if (!target) {\n this.fillPreviewBounds.set(null);\n return;\n }\n const targetDisplayIndex = this.opts.findDisplayIndex(target.rowIndex);\n if (targetDisplayIndex < 0) {\n this.fillPreviewBounds.set(null);\n return;\n }\n const rowEnd = Math.max(source.rowEnd, targetDisplayIndex);\n const colEnd = Math.max(source.colEnd, target.colIndex);\n if (rowEnd === source.rowEnd && colEnd === source.colEnd) {\n this.fillPreviewBounds.set(null);\n return;\n }\n this.fillPreviewBounds.set({\n rowStart: source.rowStart,\n rowEnd,\n colStart: source.colStart,\n colEnd,\n });\n this.opts.scrollToCell(rowEnd, colEnd);\n };\n\n private readonly fillDragUp = (): void => {\n this.stopFillListeners();\n const source = this.fillDragSource;\n const target = this.fillPreviewBounds();\n this.fillDragSource = null;\n this.fillPreviewBounds.set(null);\n if (source && target) this.applyFill(source, target);\n };\n\n private readonly fillDragCancel = (): void => this.cancelFill();\n\n private cancelFill(): void {\n this.stopFillListeners();\n this.fillDragSource = null;\n this.fillPreviewBounds.set(null);\n }\n\n private stopFillListeners(): void {\n this.browser.removeDocumentListener('pointermove', this.fillDragMove);\n this.browser.removeDocumentListener('pointerup', this.fillDragUp);\n this.browser.removeDocumentListener('pointercancel', this.fillDragCancel);\n }\n\n private isFillHandleHit(event: PointerEvent): boolean {\n const rect = (event.currentTarget as HTMLElement).getBoundingClientRect();\n return event.clientX >= rect.right - 8 && event.clientY >= rect.bottom - 8;\n }\n\n private getHoveredCellPosition(x: number, y: number): CellPosition | null {\n for (const element of this.browser.elementsFromPoint(x, y)) {\n const cell = (element as HTMLElement)\n .closest<HTMLElement>('agrid-cell[data-cell-row][data-cell-col]');\n if (!cell) continue;\n const rowIndex = Number(cell.dataset['cellRow']);\n const colIndex = Number(cell.dataset['cellCol']);\n if (Number.isFinite(rowIndex) && Number.isFinite(colIndex)) {\n return { rowIndex, colIndex };\n }\n }\n return null;\n }\n\n private getDataDisplayIndices(start: number, end: number): number[] {\n const items = this.opts.filteredItems();\n const indices: number[] = [];\n for (let displayIndex = start; displayIndex <= end; displayIndex++) {\n if (isDataRowItem(items[displayIndex])) indices.push(displayIndex);\n }\n return indices;\n }\n\n private positionFromVisibleCell(displayIndex: number, colIndex: number): CellPosition {\n const item = this.opts.filteredItems()[displayIndex];\n if (isDataRowItem(item)) return { rowIndex: item.originalIndex, colIndex };\n return this.opts.selectedCell() ?? { rowIndex: 0, colIndex };\n }\n}\n","import { Signal, WritableSignal, computed, signal } from '@angular/core';\nimport { AgridBrowserAdapter } from '../infrastructure/agrid-browser.adapter';\nimport { AgridDataSource } from '../agrid-datasource';\nimport {\n CellPosition,\n ColDef,\n GridItem,\n RecordEditEvent,\n RowClickEvent,\n RowSelectEvent,\n} from '../agrid.types';\nimport { buildSelectionRange, getDisplayForField, isDataRowItem } from '../agrid.utils';\n\n/**\n * Whether a pointer event originated inside an editable form control. Used to avoid calling\n * `preventDefault()` on a row pointerdown, which would otherwise cancel native text selection\n * (and caret placement) inside an active cell editor.\n */\nfunction isEditableEventTarget(target: EventTarget | null): boolean {\n return target instanceof HTMLInputElement\n || target instanceof HTMLTextAreaElement\n || target instanceof HTMLSelectElement\n || (target instanceof HTMLElement && target.isContentEditable);\n}\n\n/** Dependencies and callbacks required by {@link AgridRowController}. @internal */\nexport interface AgridRowControllerOptions {\n dataSource: Signal<AgridDataSource>;\n filteredItems: Signal<GridItem[]>;\n visibleColDefs: Signal<ColDef[]>;\n locale: Signal<string>;\n markedRowIndices: Signal<ReadonlySet<number>>;\n rowSelection: Signal<'none' | 'single' | 'multi'>;\n selectedCell: WritableSignal<CellPosition | null>;\n editingCell: Signal<CellPosition | null>;\n insertRowAt: (index: number) => void;\n startDragSelect: (originalIndex: number) => void;\n onRowSelect: (event: RowSelectEvent | null) => void;\n onRowClick: (event: RowClickEvent) => void;\n onRowRemoved: (event: Pick<RecordEditEvent, 'index' | 'data'>) => void;\n onEditRowRemoved: (originalIndex: number) => void;\n closeFilterMenu: () => void;\n closeGroupActionsMenu: () => void;\n}\n\n/** Screen position and row targeted by the row context menu. @internal */\nexport type AgridRowContextMenu = { x: number; y: number; rowIndex: number };\n\n/** Screen position and cell data targeted by the cell context menu. @internal */\nexport type AgridCellContextMenu = {\n x: number;\n y: number;\n rowIndex: number;\n colIndex: number;\n field: string;\n value: unknown;\n row: Record<string, unknown>;\n};\n\n/**\n * Owns row selection, row/cell context menus, and row-level operations.\n * @internal\n */\nexport class AgridRowController {\n readonly contextMenu = signal<AgridRowContextMenu | null>(null);\n readonly cellContextMenu = signal<AgridCellContextMenu | null>(null);\n readonly selectedIndices = signal<Set<number>>(new Set());\n readonly selectedRowIndices: Signal<ReadonlySet<number>> =\n this.selectedIndices.asReadonly() as Signal<ReadonlySet<number>>;\n readonly selectedRowIndex = computed<number | null>(() => {\n const selected = this.selectedIndices();\n return selected.size > 0 ? [...selected][0] : null;\n });\n\n private selectionPivot: number | null = null;\n\n constructor(\n private readonly opts: AgridRowControllerOptions,\n private readonly browser = new AgridBrowserAdapter(),\n ) {}\n\n /** Returns whether the data-source row is currently selected. */\n isRowSelected(originalIndex: number): boolean {\n return this.selectedIndices().has(originalIndex);\n }\n\n /** Returns whether a virtual item is a selected data row. */\n isPinnedPaneRowSelected(item: GridItem): boolean {\n return isDataRowItem(item) && this.isRowSelected(item.originalIndex);\n }\n\n /** Clears all selected rows and emits the selection change. */\n clearSelection(): void {\n if (this.selectedIndices().size === 0) return;\n this.selectedIndices.set(new Set());\n this.opts.onRowSelect(null);\n }\n\n /** Applies pointer selection semantics for the configured selection mode. */\n selectFromPointer(event: PointerEvent, originalIndex: number, allowDragSelect: boolean): void {\n const mode = this.opts.rowSelection();\n if (mode === 'none' || event.button !== 0) return;\n\n if (mode === 'single') {\n const already = this.selectedIndices().has(originalIndex);\n this.selectedIndices.set(already ? new Set() : new Set([originalIndex]));\n this.emitSelection();\n return;\n }\n\n const ctrl = event.ctrlKey || event.metaKey;\n const shift = event.shiftKey;\n\n if (ctrl) {\n const next = new Set(this.selectedIndices());\n if (next.has(originalIndex)) next.delete(originalIndex);\n else next.add(originalIndex);\n this.selectedIndices.set(next);\n this.selectionPivot = originalIndex;\n this.emitSelection();\n } else if (shift && this.selectionPivot !== null) {\n this.selectedIndices.set(\n buildSelectionRange(this.selectionPivot, originalIndex, this.opts.filteredItems()),\n );\n this.emitSelection();\n } else {\n if (!isEditableEventTarget(event.target)) event.preventDefault();\n this.selectedIndices.set(new Set([originalIndex]));\n this.selectionPivot = originalIndex;\n\n if (allowDragSelect) this.opts.startDragSelect(originalIndex);\n else this.emitSelection();\n }\n }\n\n /** Emits a row click unless a cell edit is active. */\n clickRow(item: { row: Record<string, unknown>; originalIndex: number }): void {\n if (this.opts.editingCell()) return;\n this.opts.onRowClick({ row: item.row, originalIndex: item.originalIndex });\n }\n\n /** Opens the row context menu at the pointer position. */\n openRowContextMenu(event: MouseEvent, originalIndex: number): void {\n event.preventDefault();\n event.stopPropagation();\n this.contextMenu.set({ x: event.clientX, y: event.clientY, rowIndex: originalIndex });\n }\n\n /** Closes the row context menu. */\n closeContextMenu(): void {\n this.contextMenu.set(null);\n }\n\n /** Opens the cell context menu and closes conflicting menus. */\n openCellContextMenu(\n event: MouseEvent,\n rowIndex: number,\n colIndex: number,\n col: ColDef,\n row: Record<string, unknown>,\n ): void {\n event.preventDefault();\n event.stopPropagation();\n this.closeContextMenu();\n this.opts.closeFilterMenu();\n this.opts.closeGroupActionsMenu();\n this.cellContextMenu.set({\n x: event.clientX,\n y: event.clientY,\n rowIndex,\n colIndex,\n field: col.field,\n value: row[col.field],\n row,\n });\n }\n\n /** Closes the cell context menu. */\n closeCellContextMenu(): void {\n this.cellContextMenu.set(null);\n }\n\n /** Copies a cell plus the same field from marked rows to the clipboard. */\n copyCellToClipboard(originalIndex: number, col: ColDef): void {\n const rows = this.opts.dataSource().rows();\n const text = this.copyIndices(originalIndex)\n .map(index => getDisplayForField(col, rows[index]?.[col.field], this.opts.locale()))\n .join('\\n');\n void this.browser.writeClipboard(text);\n this.closeCellContextMenu();\n }\n\n /** Copies a row plus all marked rows as tab-separated text. */\n copyRowToClipboard(originalIndex: number): void {\n const rows = this.opts.dataSource().rows();\n const cols = this.opts.visibleColDefs();\n const text = this.copyIndices(originalIndex)\n .map(index => cols\n .map(col => getDisplayForField(col, rows[index]?.[col.field], this.opts.locale()))\n .join('\\t'))\n .join('\\n');\n void this.browser.writeClipboard(text);\n this.closeCellContextMenu();\n }\n\n private copyIndices(primaryIndex: number): number[] {\n const length = this.opts.dataSource().length;\n const indices = [primaryIndex];\n for (const index of [...this.opts.markedRowIndices()].sort((a, b) => a - b)) {\n if (index !== primaryIndex && index >= 0 && index < length) indices.push(index);\n }\n return indices;\n }\n\n /** Inserts a row through the grid's central insertion callback. */\n insertRowAt(index: number): void {\n this.opts.insertRowAt(index);\n this.closeCellContextMenu();\n }\n\n /** Removes a row and reconciles selection and editing indices. */\n deleteRow(originalIndex: number): void {\n const removedRow = this.opts.dataSource().getRow(originalIndex);\n this.opts.dataSource().removeRow(originalIndex);\n\n const selectedCell = this.opts.selectedCell();\n if (selectedCell?.rowIndex === originalIndex) {\n this.opts.selectedCell.set(null);\n } else if (selectedCell && selectedCell.rowIndex > originalIndex) {\n this.opts.selectedCell.update(cell => cell ? { ...cell, rowIndex: cell.rowIndex - 1 } : null);\n }\n\n this.opts.onEditRowRemoved(originalIndex);\n\n if (this.selectedIndices().has(originalIndex)) {\n this.selectedIndices.update(indices => {\n const next = new Set(indices);\n next.delete(originalIndex);\n return next;\n });\n this.emitSelection();\n }\n this.contextMenu.set(null);\n this.opts.onRowRemoved({ index: originalIndex, data: removedRow });\n }\n\n /** Emits the current selected rows, or `null` when selection is empty. */\n emitSelection(): void {\n const indices = this.selectedIndices();\n if (indices.size === 0) {\n this.opts.onRowSelect(null);\n return;\n }\n const rows = this.opts.dataSource().rows();\n this.opts.onRowSelect({\n rows: [...indices].map(index => ({ row: rows[index], originalIndex: index })),\n });\n }\n}\n","import { Signal, computed, signal } from '@angular/core';\nimport { AgridControl } from '../agrid-control';\nimport { AgridDataSource } from '../agrid-datasource';\nimport { AgridSidebarEdit } from './agrid-sidebar.component';\nimport { ColDef, GridEditEvent, ValueOption } from '../agrid.types';\nimport { coerceDateInputValue } from '../agrid.utils';\n\n/** Dependencies and callbacks required by {@link AgridSidebarController}. @internal */\nexport interface AgridSidebarControllerOptions {\n control: Signal<AgridControl | null>;\n dataSource: Signal<AgridDataSource>;\n colDefs: Signal<ColDef[]>;\n visibleColDefs: Signal<ColDef[]>;\n selectedRowIndex: Signal<number | null>;\n autoOpenDetail: Signal<boolean>;\n useSidebarEditor: Signal<boolean>;\n isCellEditable: (col: ColDef, originalIndex: number) => boolean;\n onFieldChange: (event: GridEditEvent) => void;\n onCellEdit: (event: GridEditEvent) => void;\n /** Called when a `ColDef.validate` hook rejects a sidebar value. */\n onValidationFailed: (event: { rowIndex: number; field: string; value: unknown; message: string }) => void;\n}\n\n/** Owns sidebar visibility, selected-row projection, and detail-panel edits. @internal */\nexport class AgridSidebarController {\n readonly open = signal(false);\n readonly tab = signal<'columns' | 'detail'>('columns');\n readonly row = computed<Record<string, unknown> | null>(() => {\n const index = this.opts.selectedRowIndex();\n return index === null ? null : this.opts.dataSource().rows()[index] ?? null;\n });\n readonly hiddenColumns = computed<ReadonlySet<string>>(\n () => this.opts.control()?.hiddenColumns() ?? new Set<string>(),\n );\n /** Per-field validation messages for rejected sidebar edits (`field → message`). */\n readonly validationErrors = signal<Record<string, string>>({});\n\n constructor(private readonly opts: AgridSidebarControllerOptions) {}\n\n /** Remove the stored validation message for one field, if any. */\n private clearFieldError(field: string): void {\n if (!(field in this.validationErrors())) return;\n this.validationErrors.update(errors => {\n const next = { ...errors };\n delete next[field];\n return next;\n });\n }\n\n /** Opens the detail tab when automatic detail display is enabled. */\n syncAutoOpen(): void {\n if (this.opts.autoOpenDetail() && this.opts.selectedRowIndex() !== null) {\n this.open.set(true);\n this.tab.set('detail');\n }\n }\n\n /** Toggles sidebar visibility without changing the active tab. */\n toggle(): void {\n this.open.update(value => !value);\n }\n\n /** Opens the sidebar. */\n openSidebar(): void {\n this.open.set(true);\n }\n\n /** Closes the sidebar. */\n closeSidebar(): void {\n this.open.set(false);\n }\n\n /** Selects a tab, or closes the sidebar when selecting its active tab. */\n selectTab(tab: 'columns' | 'detail'): void {\n if (this.open() && this.tab() === tab) {\n this.open.set(false);\n } else {\n this.tab.set(tab);\n this.open.set(true);\n }\n }\n\n /** Commits an edit emitted by the sidebar component. */\n edit(event: AgridSidebarEdit): void {\n this.commitEdit(event.field, event.col, event.value);\n }\n\n /** Returns the currently selected data-source row index. */\n selectedRowIndex(): number | null {\n return this.opts.selectedRowIndex();\n }\n\n /** Coerces and commits a sidebar field value to the selected row. */\n commitEdit(field: string, col: ColDef, stringValue: string): void {\n const index = this.opts.selectedRowIndex();\n if (index === null) return;\n if (!this.opts.isCellEditable(col, index)) return;\n let newValue: unknown = stringValue;\n if (col.type === 'number') {\n newValue = stringValue === '' ? null : Number(stringValue);\n } else if (col.type === 'date') {\n newValue = coerceDateInputValue(\n stringValue,\n this.opts.dataSource().getRow(index)[field],\n );\n } else if (col.values?.length) {\n const option = col.values.find(value =>\n typeof value === 'string'\n ? value === stringValue\n : String((value as ValueOption).value) === stringValue,\n );\n newValue = option === undefined\n ? stringValue\n : typeof option === 'string' ? option : (option as ValueOption).value;\n }\n\n const row = this.opts.dataSource().getRow(index);\n const oldValue = row[field];\n if (oldValue === newValue) return;\n const message = col.validate?.(newValue as never, row as never) ?? null;\n if (message) {\n this.validationErrors.update(errors => ({ ...errors, [field]: message }));\n this.opts.onValidationFailed({ rowIndex: index, field, value: newValue, message });\n return;\n }\n this.clearFieldError(field);\n this.opts.dataSource().patchRow(index, { [field]: newValue });\n const colIndex = this.opts.visibleColDefs().findIndex(column => column.field === field);\n this.opts.control()?.pushEdit({ rowIndex: index, field, oldValue, newValue });\n const event = {\n position: { rowIndex: index, colIndex },\n field,\n oldValue,\n newValue,\n };\n this.opts.onFieldChange(event);\n if (!this.opts.useSidebarEditor()) {\n this.opts.onCellEdit(event);\n }\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core';\nimport { AgridLocaleText, AGRID_LOCALE_TEXT } from '../agrid-localization';\nimport { getDateInputValue, getDisplayForField, looksLikeDate, matchesInputMask } from '../agrid.utils';\nimport { ColDef, HeaderGroup } from '../agrid.types';\n\n/** Field edit emitted by the sidebar detail form. @internal */\nexport interface AgridSidebarEdit {\n /** Data field being edited. */\n field: string;\n /** Column definition controlling value coercion and editability. */\n col: ColDef;\n /** Raw string value produced by the form control. */\n value: string;\n}\n\n/** Display and edit model for one sidebar detail field. @internal */\nexport interface AgridSidebarDetailField {\n /** Human-readable field label. */\n label: string;\n /** Formatted read-only display value. */\n value: string;\n /** Original value stored in the row. */\n rawValue: unknown;\n /** String value supplied to the field editor. */\n inputValue: string;\n /** Whether the corresponding grid column is hidden. */\n hidden: boolean;\n /** Whether the field can be edited in the current grid state. */\n editable: boolean;\n /** Column definition associated with the field. */\n col: ColDef;\n}\n\n/** Visibility change requested from a grouped sidebar column entry. @internal */\nexport interface AgridSidebarGroupToggle {\n /** Fields belonging to the selected header group. */\n fields: string[];\n /** Requested visibility for every field in the group. */\n visible: boolean;\n}\n\n/** Grouped or standalone entry rendered in the sidebar column tree. @internal */\nexport type AgridSidebarColumnEntry =\n | { kind: 'column'; col: ColDef }\n | { kind: 'group'; id: string; label: string; columns: ColDef[] };\n\n/** Sidebar view for column visibility and selected-row details. @internal */\n@Component({\n selector: 'agrid-sidebar',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './agrid-sidebar.component.html',\n styleUrl: './agrid-sidebar.component.css',\n})\nexport class AgridSidebarComponent {\n open = input<boolean>(false);\n activeTab = input<'columns' | 'detail'>('columns');\n columns = input<ColDef[]>([]);\n headerGroups = input<HeaderGroup[]>([]);\n row = input<Record<string, unknown> | null>(null);\n rowIndex = input<number | null>(null);\n hiddenColumns = input<ReadonlySet<string>>(new Set());\n locale = input<string | undefined>(undefined);\n localeText = input<AgridLocaleText>(AGRID_LOCALE_TEXT.en);\n readonlyGrid = input<boolean>(false);\n useSidebarEditor = input<boolean>(false);\n isCellEditable = input<(col: ColDef, originalIndex: number) => boolean>(\n col => col.editable !== false,\n );\n /** Per-field validation messages (`field → message`) for rejected detail edits. */\n errors = input<Record<string, string>>({});\n\n close = output<void>();\n tabChange = output<'columns' | 'detail'>();\n toggleColumn = output<string>();\n toggleColumnGroup = output<AgridSidebarGroupToggle>();\n detailEdit = output<AgridSidebarEdit>();\n save = output<AgridSidebarDetailField[]>();\n\n readonly columnEntries = computed<AgridSidebarColumnEntry[]>(() => {\n const groupLabels = new Map(this.headerGroups().map(group => [group.id, group.label]));\n const entries: AgridSidebarColumnEntry[] = [];\n const groupedEntries = new Map<string, Extract<AgridSidebarColumnEntry, { kind: 'group' }>>();\n\n for (const col of this.columns()) {\n const groupId = col.group;\n const groupLabel = groupId ? groupLabels.get(groupId) : undefined;\n if (!groupId || !groupLabel) {\n entries.push({ kind: 'column', col });\n continue;\n }\n\n let entry = groupedEntries.get(groupId);\n if (!entry) {\n entry = { kind: 'group', id: groupId, label: groupLabel, columns: [] };\n groupedEntries.set(groupId, entry);\n entries.push(entry);\n }\n entry.columns.push(col);\n }\n\n return entries;\n });\n\n /** Whether every column in a group is currently visible. */\n isGroupVisible(columns: ColDef[]): boolean {\n const hidden = this.hiddenColumns();\n return columns.every(col => !hidden.has(col.field));\n }\n\n /** Whether a group contains both visible and hidden columns. */\n isGroupPartiallyVisible(columns: ColDef[]): boolean {\n const hidden = this.hiddenColumns();\n const visibleCount = columns.filter(col => !hidden.has(col.field)).length;\n return visibleCount > 0 && visibleCount < columns.length;\n }\n\n /** Emits a visibility request for all columns belonging to a group. */\n onGroupToggle(columns: ColDef[], event: Event): void {\n this.toggleColumnGroup.emit({\n fields: columns.map(col => col.field),\n visible: (event.target as HTMLInputElement).checked,\n });\n }\n\n /** Apply the row-aware input mask while preserving the sidebar's change-to-commit behavior. */\n onDetailMaskInput(field: AgridSidebarDetailField, event: Event): void {\n const input = event.target as HTMLInputElement;\n const row = this.row();\n if (row && field.col.inputMask && field.col.type !== 'number' && field.col.type !== 'date') {\n const mask = field.col.inputMask({\n row,\n value: field.rawValue,\n column: field.col,\n });\n if (mask && !matchesInputMask(input.value, mask)) {\n input.value = input.dataset['agridMaskValue'] ?? field.inputValue;\n return;\n }\n input.dataset['agridMaskValue'] = input.value;\n }\n }\n\n /** Forward the final sidebar value after native change/blur. */\n onDetailChange(field: AgridSidebarDetailField, event: Event): void {\n this.onDetailMaskInput(field, event);\n this.detailEdit.emit({\n field: field.col.field,\n col: field.col,\n value: (event.target as HTMLInputElement).value,\n });\n }\n\n readonly detailFields = computed<AgridSidebarDetailField[] | null>(() => {\n const row = this.row();\n if (!row) return null;\n const locale = this.locale();\n const readonlyGrid = this.readonlyGrid();\n const hiddenColumns = this.hiddenColumns();\n const rowIndex = this.rowIndex();\n return this.columns().map(col => {\n const rawValue = row[col.field];\n let inputValue = String(rawValue ?? '');\n if (col.type === 'date' || looksLikeDate(rawValue)) {\n inputValue = getDateInputValue(rawValue);\n }\n return {\n label: col.header,\n value: getDisplayForField(col, rawValue, locale),\n rawValue,\n inputValue,\n hidden: hiddenColumns.has(col.field),\n editable: !readonlyGrid && rowIndex !== null && this.isCellEditable()(col, rowIndex),\n col,\n };\n });\n });\n}\n","@if (open()) {\n <div class=\"ag-sidebar\" role=\"region\"\n [attr.aria-label]=\"activeTab() === 'columns' ? localeText().columns : localeText().detail\">\n <div class=\"ag-sidebar-header\">\n <span>{{ activeTab() === 'columns' ? localeText().columns : localeText().detail }}</span>\n <button class=\"ag-sidebar-close\" (click)=\"close.emit()\" [title]=\"localeText().close\"\n [attr.aria-label]=\"localeText().close\">✕</button>\n </div>\n\n @if (activeTab() === 'columns') {\n @for (entry of columnEntries(); track entry.kind === 'group' ? 'group-' + entry.id : 'column-' + entry.col.field) {\n @if (entry.kind === 'group') {\n <div class=\"ag-sidebar-group\">\n <label class=\"ag-sidebar-item ag-sidebar-group-label\" (click)=\"$event.stopPropagation()\">\n <input\n type=\"checkbox\"\n [checked]=\"isGroupVisible(entry.columns)\"\n [indeterminate]=\"isGroupPartiallyVisible(entry.columns)\"\n (change)=\"onGroupToggle(entry.columns, $event)\"\n />\n {{ entry.label }}\n </label>\n <div class=\"ag-sidebar-group-children\">\n @for (col of entry.columns; track col.field) {\n <label class=\"ag-sidebar-item ag-sidebar-group-child\" (click)=\"$event.stopPropagation()\">\n <input\n type=\"checkbox\"\n [checked]=\"!hiddenColumns().has(col.field)\"\n (change)=\"toggleColumn.emit(col.field)\"\n />\n {{ col.header }}\n </label>\n }\n </div>\n </div>\n } @else {\n <label class=\"ag-sidebar-item\" (click)=\"$event.stopPropagation()\">\n <input\n type=\"checkbox\"\n [checked]=\"!hiddenColumns().has(entry.col.field)\"\n (change)=\"toggleColumn.emit(entry.col.field)\"\n />\n {{ entry.col.header }}\n </label>\n }\n }\n } @else {\n @if (detailFields(); as fields) {\n @for (field of fields; track field.col.field) {\n <div class=\"ag-detail-field\">\n <span class=\"ag-detail-label\">\n {{ field.label }}\n @if (field.hidden) {\n <span class=\"ag-detail-hidden\">{{ localeText().hiddenColumn }}</span>\n }\n </span>\n @if (field.editable && field.col.values?.length) {\n <select\n class=\"ag-detail-input\"\n [class.ag-detail-input--invalid]=\"!!errors()[field.col.field]\"\n (change)=\"detailEdit.emit({\n field: field.col.field,\n col: field.col,\n value: $any($event.target).value\n })\"\n >\n @for (opt of field.col.values; track $index) {\n @if ($any(opt).value !== undefined) {\n <option [value]=\"$any(opt).value\" [selected]=\"$any(opt).value === field.rawValue\">\n {{ $any(opt).label }}\n </option>\n } @else {\n <option [value]=\"opt\" [selected]=\"opt === field.rawValue\">{{ opt }}</option>\n }\n }\n </select>\n } @else if (field.editable) {\n <input\n class=\"ag-detail-input\"\n [class.ag-detail-input--invalid]=\"!!errors()[field.col.field]\"\n [type]=\"field.col.type === 'number' ? 'number' : field.col.type === 'date' ? 'date' : 'text'\"\n [value]=\"field.inputValue\"\n (input)=\"onDetailMaskInput(field, $event)\"\n (change)=\"onDetailChange(field, $event)\"\n />\n } @else {\n <span class=\"ag-detail-value\">{{ field.value }}</span>\n }\n @if (errors()[field.col.field]; as msg) {\n <span class=\"ag-detail-error\" role=\"alert\">{{ msg }}</span>\n }\n </div>\n }\n @if (useSidebarEditor()) {\n <div class=\"ag-detail-field\">\n <button class=\"ag-button\" (click)=\"save.emit(fields)\">{{ localeText().save }}</button>\n </div>\n }\n } @else {\n <div class=\"ag-detail-empty\">{{ localeText().noRows }}</div>\n }\n }\n </div>\n}\n\n<div class=\"ag-sidebar-strip\">\n <button\n class=\"ag-sidebar-strip-btn\"\n [class.active]=\"open() && activeTab() === 'columns'\"\n [attr.aria-pressed]=\"open() && activeTab() === 'columns'\"\n (click)=\"tabChange.emit('columns')\"\n >{{ localeText().columns }}</button>\n <button\n class=\"ag-sidebar-strip-btn\"\n [class.active]=\"open() && activeTab() === 'detail'\"\n [attr.aria-pressed]=\"open() && activeTab() === 'detail'\"\n (click)=\"tabChange.emit('detail')\"\n >{{ localeText().detail }}</button>\n</div>\n","import { ListRange } from '@angular/cdk/collections';\nimport {\n CdkVirtualScrollViewport,\n VIRTUAL_SCROLL_STRATEGY,\n VirtualScrollStrategy,\n} from '@angular/cdk/scrolling';\nimport { Directive, OnChanges, forwardRef, input } from '@angular/core';\nimport { Observable, Subject, distinctUntilChanged } from 'rxjs';\n\n/** Pixels rendered above and below the viewport so scrolling does not reveal blank rows. */\nconst BUFFER_PX = 200;\n\n/**\n * A {@link VirtualScrollStrategy} that supports a different height per item instead of the single\n * fixed `itemSize` used by CDK's {@link FixedSizeVirtualScrollStrategy}.\n *\n * Item heights are supplied as a flat array (one entry per virtual item) and converted into a\n * prefix-sum offset table, so any row — a normal data row or a tall master/detail panel — can have\n * its own height while scroll position math stays O(log n) via binary search.\n *\n * When every item shares the same height (the common case with no detail rows open) the behavior\n * is equivalent to the fixed-size strategy, so the default code path is regression-safe.\n * @internal\n */\nexport class AgridVariableRowSizeStrategy implements VirtualScrollStrategy {\n private viewport: CdkVirtualScrollViewport | null = null;\n private sizes: number[] = [];\n /** Cumulative offsets; `offsets[i]` is the top of item `i`, `offsets[n]` is the total size. */\n private offsets: number[] = [0];\n\n private readonly indexChange = new Subject<number>();\n readonly scrolledIndexChange: Observable<number> = this.indexChange.pipe(distinctUntilChanged());\n\n attach(viewport: CdkVirtualScrollViewport): void {\n this.viewport = viewport;\n this.updateTotalContentSize();\n this.updateRenderedRange();\n }\n\n detach(): void {\n this.indexChange.complete();\n this.viewport = null;\n }\n\n /** Replace the per-item heights and re-measure. Called by the directive when inputs change. */\n updateItemSizes(sizes: number[]): void {\n this.sizes = sizes;\n const offsets = new Array<number>(sizes.length + 1);\n offsets[0] = 0;\n for (let i = 0; i < sizes.length; i++) offsets[i + 1] = offsets[i] + sizes[i];\n this.offsets = offsets;\n if (this.viewport) {\n this.updateTotalContentSize();\n this.updateRenderedRange();\n }\n }\n\n onContentScrolled(): void {\n this.updateRenderedRange();\n }\n\n onDataLengthChanged(): void {\n this.updateTotalContentSize();\n this.updateRenderedRange();\n }\n\n onContentRendered(): void {\n /* no-op: heights are supplied, not measured from the DOM */\n }\n\n onRenderedOffsetChanged(): void {\n /* no-op */\n }\n\n scrollToIndex(index: number, behavior: ScrollBehavior): void {\n if (!this.viewport) return;\n const clamped = Math.max(0, Math.min(index, this.sizes.length));\n this.viewport.scrollToOffset(this.offsets[clamped] ?? 0, behavior);\n }\n\n private get totalSize(): number {\n return this.offsets[this.offsets.length - 1] ?? 0;\n }\n\n private updateTotalContentSize(): void {\n this.viewport?.setTotalContentSize(this.totalSize);\n }\n\n /** Largest item index whose top offset is `<= offset` (binary search over the prefix sums). */\n private indexAt(offset: number): number {\n const o = this.offsets;\n let lo = 0;\n let hi = o.length - 1;\n while (lo < hi) {\n const mid = (lo + hi + 1) >> 1;\n if (o[mid] <= offset) lo = mid;\n else hi = mid - 1;\n }\n return lo;\n }\n\n private updateRenderedRange(): void {\n const viewport = this.viewport;\n if (!viewport) return;\n\n const dataLength = viewport.getDataLength();\n const n = Math.min(this.sizes.length, dataLength);\n if (n === 0) {\n viewport.setRenderedRange({ start: 0, end: 0 });\n viewport.setRenderedContentOffset(0);\n this.indexChange.next(0);\n return;\n }\n\n const scrollOffset = viewport.measureScrollOffset();\n const viewportSize = viewport.getViewportSize();\n const start = Math.max(0, this.indexAt(scrollOffset - BUFFER_PX));\n const end = Math.min(n, this.indexAt(scrollOffset + viewportSize + BUFFER_PX) + 1);\n\n const range: ListRange = { start, end };\n viewport.setRenderedRange(range);\n viewport.setRenderedContentOffset(this.offsets[start] ?? 0);\n this.indexChange.next(this.indexAt(scrollOffset));\n }\n}\n\n/**\n * Wires {@link AgridVariableRowSizeStrategy} into a `cdk-virtual-scroll-viewport`.\n *\n * Apply alongside an `agridVariableRowSize` binding carrying the per-item height array. Replaces\n * the viewport's `[itemSize]` binding. The same height array is fed to every (left/body/right)\n * viewport so the panes stay row-aligned.\n * @internal\n */\n@Directive({\n selector: 'cdk-virtual-scroll-viewport[agridVariableRowSize]',\n providers: [\n {\n provide: VIRTUAL_SCROLL_STRATEGY,\n useFactory: (d: AgridVariableRowSizeDirective) => d.strategy,\n deps: [forwardRef(() => AgridVariableRowSizeDirective)],\n },\n ],\n})\nexport class AgridVariableRowSizeDirective implements OnChanges {\n /** Per-item heights in pixels, one entry per virtual-scroll item. */\n readonly itemSizes = input<number[]>([], { alias: 'agridVariableRowSize' });\n\n readonly strategy = new AgridVariableRowSizeStrategy();\n\n ngOnChanges(): void {\n this.strategy.updateItemSizes(this.itemSizes());\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n Signal,\n afterNextRender,\n computed,\n effect,\n inject,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { CdkVirtualScrollViewport, ScrollingModule } from '@angular/cdk/scrolling';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { AgridCellComponent } from './rendering/agrid-cell.component';\nimport { AgridBrowserAdapter } from './infrastructure/agrid-browser.adapter';\nimport { AgridClipboardHandler, CellRange } from './selection/agrid-clipboard.handler';\nimport { AgridColumnLayoutModel } from './columns/agrid-column-layout.model';\nimport { AgridColumnMenuComponent } from './columns/agrid-column-menu.component';\nimport { AgridColumnMenuController } from './columns/agrid-column-menu.controller';\nimport { AgridColumnReorderController } from './columns/agrid-column-reorder.controller';\nimport { AgridColumnSizingController } from './columns/agrid-column-sizing.controller';\nimport { AgridColumnStateService } from './columns/agrid-column-state.service';\nimport { AgridControl, FilterOperator } from './agrid-control';\nimport { AgridDataSource } from './agrid-datasource';\nimport { AgridDragHandler } from './rows/agrid-drag.handler';\nimport { AgridEditController } from './editing/agrid-edit.controller';\nimport { AgridFindController } from './selection/agrid-find.controller';\nimport { AgridFindPanelComponent } from './selection/agrid-find-panel.component';\nimport { AgridGroupController } from './rows/agrid-group.controller';\nimport { AgridTreeController } from './rows/agrid-tree.controller';\nimport { AgridLocaleText, resolveAgridLocaleText, resolveLocale } from './agrid-localization';\nimport { AgridNavigationController } from './selection/agrid-navigation.controller';\nimport { AgridPresentationService } from './rendering/agrid-presentation.service';\nimport { AgridMenuBarComponent } from './rendering/agrid-menu-bar.component';\nimport { AgridProvider } from './agrid-provider';\nimport { AgridProjectionModel } from './rows/agrid-projection.model';\nimport { AgridRangeController } from './selection/agrid-range.controller';\nimport { AgridCellContextMenu, AgridRowController } from './rows/agrid-row.controller';\nimport { AgridSidebarController } from './editing/agrid-sidebar.controller';\nimport {\n AgridSidebarComponent,\n AgridSidebarDetailField,\n AgridSidebarEdit,\n} from './editing/agrid-sidebar.component';\nimport {\n isDataRowItem as isDataRowItemFn,\n isDetailRowItem as isDetailRowItemFn,\n isGroupHeaderItem as isGroupHeaderItemFn,\n isPathTreeNodeItem as isPathTreeNodeItemFn,\n isPathTreeConfig,\n isTreeRowItem as isTreeRowItemFn,\n pathTreeNodeId,\n} from './agrid.utils';\nimport { AgridVariableRowSizeDirective } from './infrastructure/agrid-variable-row-size.strategy';\nimport {\n AgridField, AgridMenuBarContext, AgridMenuBarItem, AgridMenuBarMenuItem, AgridMenuBarState,\n CellContextMenuItem, CellInfoEvent, CellPosition, ColDef, DetailRowItem, FilterChangeEvent, GridEditEvent,\n GridItem, GroupAction, NewRecord, PageChangeEvent, PathTreeNodeItem, RecordEditEvent, RowClickEvent,\n RowReorderEvent, RowSelectEvent, RowUpdateEvent, SortChangeEvent, TreeNodeClickEvent, ValidationFailedEvent,\n} from './agrid.types';\n\n// Re-export for backward compatibility with existing imports of GridItem from this file.\nexport type { GridItem };\n\n/**\n * Excel-like data grid for Angular 21.\n *\n * ## Minimal setup\n * ```html\n * <agrid [provider]=\"gridProvider\" />\n * ```\n *\n * ### Keyboard shortcuts\n * | Key | Action |\n * |-----|--------|\n * | Arrow keys | Move selection |\n * | Tab / Shift+Tab | Move right / left (wraps rows) |\n * | Enter | Enter edit mode |\n * | Ctrl/Cmd+Enter | Toggle an expandable tree node |\n * | F2 | Enter edit mode |\n * | Printable key | Enter edit mode with seeded character |\n * | Escape | Close any open menu or cancel edit |\n * | Tab / Enter (while editing) | Commit and move according to navigation settings |\n */\n@Component({\n selector: 'agrid',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n ScrollingModule,\n NgTemplateOutlet,\n AgridVariableRowSizeDirective,\n AgridCellComponent,\n AgridMenuBarComponent,\n AgridColumnMenuComponent,\n AgridFindPanelComponent,\n AgridSidebarComponent,\n ],\n templateUrl: './agrid.component.html',\n styleUrl: './agrid.component.css',\n host: {\n '[class.ag-zebra]': 'zebraStripes()',\n '[style.min-height]': 'minHeight()',\n '[style.max-height]': 'maxHeight()',\n },\n})\nexport class AgridComponent<T extends object = any> {\n\n // ── Inputs ───────────────────────────────────────────────────────────────────\n\n /** Grid provider containing columns, data source, control, and options. */\n provider = input<AgridProvider<T>>(new AgridProvider<T>());\n\n // All display / behaviour options are read from the provider.\n readonly rowHeight = computed(() => this.provider().rowHeight);\n readonly minHeight = computed(() => this.provider().minHeight);\n readonly maxHeight = computed(() => this.provider().maxHeight);\n readonly allowAddRows = computed(() => this.provider().allowAddRows);\n readonly autoAddRows = computed(() => this.provider().autoAddRows());\n readonly enableRowMarking = computed(() => this.provider().enableRowMarking);\n readonly showControlColumn = computed(() =>\n this.provider().showControlColumn || this.enableRowMarking() || this.masterDetail()\n );\n readonly controlColumnWidth = computed(() => this.enableRowMarking() ? 48 : 24);\n readonly showSidebar = computed(() => this.provider().showSidebar);\n readonly autoOpenDetail = computed(() => this.provider().autoOpenDetail);\n readonly serverSideFiltering = computed(() => this.provider().serverSideFiltering);\n readonly filterDebounceMs = computed(() => this.provider().filterDebounceMs);\n readonly enableQuickFilter = computed(() => this.provider().enableQuickFilter);\n readonly menuBarItems = computed(() => this.provider().menuBarItems);\n readonly quickFilterValue = computed(() => this.control()?.quickFilter() ?? '');\n readonly sortOption = computed(() => this.provider().sortOption);\n readonly rowSelection = computed(() => this.provider().rowSelection);\n readonly enterEditAction = computed(() => this.provider().enterEditAction);\n readonly groupDescription = computed(() => this.provider().groupDescription);\n readonly groupActions = computed(() => this.provider().groupActions);\n readonly cellMenuItems = computed(() => this.provider().cellMenuItems);\n readonly headerGroups = computed(() => this.provider().headerGroups);\n readonly treeConfig = computed(() => this.provider().treeConfig);\n readonly zebraStripes = computed(() => this.provider().zebraStripes);\n readonly showChangedCellIndicator = computed(\n () => this.provider().showChangedCellIndicator,\n );\n readonly confirmRowDelete = computed(() => this.provider().confirmRowDelete);\n readonly readonlyGrid = computed(() => this.provider().readonlyGrid());\n readonly loading = computed(() => this.provider().loading());\n readonly emptyText = computed(() => this.provider().emptyText);\n readonly useSidebarEditor = computed(() => this.provider().useSidebarEditor);\n\n /** Host callback for per-row CSS classes, or `undefined`. */\n readonly rowClassFn = computed(() => this.provider().getRowClass as\n | ((params: { row: Record<string, unknown>; index: number }) => string)\n | undefined);\n /** Host callback designating pinned rows, or `undefined`. */\n readonly pinRowFn = computed(() => this.provider().pinRow as\n | ((row: Record<string, unknown>, index: number) => 'top' | 'bottom' | undefined)\n | undefined);\n\n /**\n * Effective pin resolver fed to the projection: a runtime UI override wins (including an explicit\n * `null` unpin), otherwise the provider `pinRow` predicate decides. Returns `undefined` when\n * neither pinning source is active, so the projection's pinning path stays off.\n */\n readonly effectivePinRow = computed(() => {\n const predicate = this.pinRowFn();\n const overrides = this._pinnedRows();\n if (!predicate && overrides.size === 0) return undefined;\n return (row: Record<string, unknown>, index: number): 'top' | 'bottom' | undefined => {\n const override = overrides.get(index);\n if (override !== undefined) return override ?? undefined;\n return predicate?.(row, index);\n };\n });\n /** Whether master/detail is enabled and applicable (flat rows or tree leaves; not grouped). */\n readonly masterDetail = computed(\n () => this.provider().masterDetail && !!this.provider().detailRenderer\n && !this.control()?.groupByField(),\n );\n /** Fixed detail-panel height in pixels. */\n readonly detailRowHeight = computed(() => this.provider().detailRowHeight);\n\n /** Column definitions from the active provider. */\n readonly colDefs = computed<ColDef[]>(\n () => this.provider().columns() as unknown as ColDef[],\n );\n\n /** Signal-based data container from the active provider. */\n readonly dataSource = computed<AgridDataSource>(() => this.provider().datasource);\n\n private readonly treeParentIds = computed(() => {\n const config = this.treeConfig();\n if (!config || isPathTreeConfig(config)) return new Set<string | number>();\n const ids = new Set<string | number>();\n for (const row of this.dataSource().rows()) {\n const parentId = config.getParentId(row as T);\n if (parentId !== null && parentId !== undefined) ids.add(parentId);\n }\n return ids;\n });\n\n /** Grid UI state container from the active provider. */\n readonly control = computed<AgridControl | null>(() => this.provider().control);\n\n /** Resolved locale code used for date formatting and built-in localization lookup. 'auto' is replaced with navigator.language. */\n readonly locale = computed<string>(() => resolveLocale(this.provider().options.locale));\n\n /** Resolved built-in locale text merged with provider customizations. */\n readonly localeText = computed<AgridLocaleText>(() =>\n resolveAgridLocaleText(this.provider().options.locale, this.provider().localizations)\n );\n\n /** Effective empty-state label. */\n readonly emptyTextLabel = computed<string>(() => this.emptyText() ?? this.localeText().noRows);\n\n // ── Outputs ──────────────────────────────────────────────────────────────────\n\n /** Emitted after the user commits a cell edit. */\n cellEdit = output<GridEditEvent<T>>();\n\n /**\n * Emitted after an edit changes a row.\n * Includes the row index, current data, provider, and data source.\n */\n recordEdit = output<RecordEditEvent<T>>();\n\n /** Emitted after a row is removed, with its former index and captured row data. */\n rowRemoved = output<RecordEditEvent<T>>();\n\n /** Emitted when the grid inserts a blank row. Use `dataSource.patchRow()` to populate it. */\n prepareAddRecord = output<NewRecord<T>>();\n\n /** Emitted when the user finishes dragging a row. Call `dataSource.moveRow()` to apply. */\n rowReorder = output<RowReorderEvent<T>>();\n\n /** Emitted when the row selection changes. `null` = selection cleared. */\n rowSelect = output<RowSelectEvent<T> | null>();\n\n rowDoubleClicked = output<RowClickEvent<T>>();\n\n /** Emitted when the user single-clicks a data row. */\n rowClick = output<RowClickEvent<T>>();\n\n /** Emitted when the user single-clicks a generated path-tree branch node. */\n treeNodeClick = output<TreeNodeClickEvent>();\n\n /** Emitted when the user double-clicks a generated path-tree branch node. */\n treeNodeDoubleClicked = output<TreeNodeClickEvent>();\n\n /**\n * Emitted once after a changed row is left during inline editing, or when the sidebar editor\n * save button is used.\n */\n rowChanged = output<RowUpdateEvent<T>>();\n /**\n * Emitted when the user navigates to a new page in **server-side pagination mode**\n * (i.e. when `AgridControl.totalRows` is greater than zero).\n * The host should fetch the indicated row slice and update the data source.\n */\n pageChange = output<PageChangeEvent>();\n\n /** Emitted when a header filter changes in server-side filtering mode. */\n filterChange = output<FilterChangeEvent>();\n\n /** Emitted when a column sort changes in server-side filtering mode. */\n sortChange = output<SortChangeEvent>();\n\n /**\n * Emitted (debounced) when the global quick-filter text changes in server-side filtering mode.\n * The host should refetch rows matching the text. Not emitted in client mode, where the grid\n * filters locally.\n */\n quickFilterChange = output<string>();\n\n /** Emitted when a `ColDef.validate` hook rejects a committed value (inline or sidebar). */\n validationFailed = output<ValidationFailedEvent>();\n\n /** Emitted when a column's optional cell information button is clicked. */\n cellInfo = output<CellInfoEvent<T>>();\n\n /** Emitted for every enabled menu-bar button or dropdown item, carrying its configured id. */\n menuBarAction = output<string>();\n\n // ── Public state ─────────────────────────────────────────────────────────────\n\n /** Currently focused cell, or `null`. */\n readonly selectedCell = signal<CellPosition | null>(null);\n\n /** Original index of the row awaiting delete confirmation, or `null`. */\n readonly pendingDeleteRow = signal<number | null>(null);\n\n /** Original indices of rows whose master/detail panel is currently expanded. */\n private readonly _expandedDetailIds = signal<Set<number>>(new Set());\n\n /**\n * Runtime per-row pin overrides set through the UI (keyed by original index). A `null` value\n * explicitly unpins a row that the `pinRow` predicate would otherwise pin. Merged with the\n * provider predicate by {@link effectivePinRow}.\n */\n private readonly _pinnedRows = signal<Map<number, 'top' | 'bottom' | null>>(new Map());\n\n private readonly markedIndices = signal<Set<number>>(new Set());\n\n /** Original datasource indices marked for inclusion in copy operations. */\n readonly markedRowIndices: Signal<ReadonlySet<number>> =\n this.markedIndices.asReadonly() as Signal<ReadonlySet<number>>;\n\n /** Horizontal position of the delete prompt inside the scrollable row. */\n readonly deleteConfirmationLeft = signal(0);\n\n /** Visible width available to the delete prompt. */\n readonly deleteConfirmationWidth = signal(0);\n\n /** Rectangular cell range selected by Shift+arrow or Shift+click. */\n readonly selectedRange = signal<CellRange | null>(null);\n\n /** @internal Stable callback passed to child components for row-aware editability checks. */\n readonly isCellEditableForRow = (col: ColDef, originalIndex: number): boolean =>\n this.isCellEditable(col, originalIndex);\n\n /** Fill-handle drag preview bounds, in visible row/column coordinates. */\n get fillPreviewBounds() { return this.rangeController.fillPreviewBounds; }\n\n /** Position of the cell in edit mode, or `null`. */\n get editingCell() { return this.editController.editingCell; }\n\n /** Draft value while editing — committed on Tab/Enter, discarded on Escape. */\n get currentDraft() { return this.editController.currentDraft; }\n\n /** Seed character typed to enter edit mode (e.g. pressing 'A'). */\n get editSeedChar() { return this.editController.editSeedChar; }\n\n /** Whether the active text editor should select all text when it opens. */\n get selectTextOnEdit() { return this.editController.selectTextOnEdit; }\n\n /** Toggle the sidebar open/closed. */\n toggleSidebar(): void { this.sidebarController.toggle(); }\n\n /** @internal */\n onSidebarStripClick(tab: 'columns' | 'detail'): void {\n this.sidebarController.selectTab(tab);\n }\n\n /** @internal */\n onSidebarDetailEdit(event: AgridSidebarEdit): void {\n this.sidebarController.edit(event);\n }\n\n /** @internal Commit an edit made via the detail panel. */\n commitDetailEdit(field: string, col: ColDef, stringValue: string): void {\n this.sidebarController.commitEdit(field, col, stringValue);\n }\n\n onSidebarDetailSave(_event: AgridSidebarDetailField[]): void {\n const originalIndex = this.sidebarController.selectedRowIndex();\n if (originalIndex === null) return;\n this.emitRowChanged(originalIndex);\n this.emitRecordEdit(originalIndex);\n this.sidebarController.closeSidebar();\n }\n\n /**\n * Download the currently visible, filtered rows as a CSV file.\n * Uses display values (ValueOption labels, formatters) and respects column visibility.\n * Group header rows are excluded — only data rows are exported.\n *\n * @param filename Output filename, defaults to `'export.csv'`.\n */\n exportCsv(filename = 'export.csv'): void {\n this.presentation.exportCsv(filename);\n }\n\n /** @internal */ goToFirstPage(): void { this.control()?.setPage(1); }\n /** @internal */ goToLastPage(): void { this.control()?.setPage(this.totalPages()); }\n /** @internal */ goToNextPage(): void { const c = this.control(); if (c) c.setPage(Math.min(c.currentPage() + 1, this.totalPages())); }\n /** @internal */ goToPrevPage(): void { const c = this.control(); if (c) c.setPage(Math.max(c.currentPage() - 1, 1)); }\n\n /** Resize every visible column to fit its header and current row values. */\n autosizeAllColumns(): void {\n this.columnSizing.autosizeAllColumns();\n }\n\n /**\n * Clears changed-cell markers after persistence succeeds.\n * Omit `originalIndex` to clear every marker; omit `fields` to clear the whole row.\n */\n clearChangedCells(originalIndex?: number, fields?: readonly string[]): void {\n if (originalIndex === undefined) {\n this.changedCells.set(new Set());\n return;\n }\n\n const fieldSet = fields ? new Set(fields) : null;\n this.changedCells.update(current => {\n const next = new Set(current);\n for (const key of current) {\n const marker = this.parseChangedCellKey(key);\n if (marker.rowIndex === originalIndex && (!fieldSet || fieldSet.has(marker.field))) {\n next.delete(key);\n }\n }\n return next;\n });\n }\n\n /** @internal Whether a cell has an unsaved-change marker. */\n isCellChanged(originalIndex: number, field: string): boolean {\n return this.changedCells().has(this.changedCellKey(originalIndex, field));\n }\n\n /** @internal Full display value for a cell — used as the `title` tooltip attribute. */\n getCellTitle(col: ColDef, value: unknown): string {\n return this.presentation.getCellTitle(col, value);\n }\n\n /** @internal Dynamic CSS class string for a cell from `ColDef.cellClass`. */\n getCellClass(col: ColDef, value: unknown, row: Record<string, unknown>): string {\n return this.presentation.getCellClass(col, value, row);\n }\n\n /** @internal Short symbol shown before the footer aggregate value. */\n getAggregateLabel(col: ColDef): string {\n return this.presentation.getAggregateLabel(col);\n }\n\n /** @internal Whether a column has a static or control-configured aggregate. */\n hasAggregate(col: ColDef): boolean {\n return this.presentation.hasAggregate(col);\n }\n\n /** @internal Formatted footer value — uses the column formatter when set, otherwise locale number. */\n getFooterDisplay(col: ColDef, value: unknown): string {\n return this.presentation.getFooterDisplay(col, value);\n }\n\n // ── Internal signals ─────────────────────────────────────────────────────────\n\n private readonly groupController = new AgridGroupController({\n control: this.control,\n groupDescription: this.groupDescription,\n });\n\n readonly treeController = new AgridTreeController();\n\n // ── Derived state ─────────────────────────────────────────────────────────────\n\n readonly allowRowReorder = computed(() =>\n (this.control()?.allowRowReorder() ?? false) && !this.control()?.groupByField()\n );\n\n /** `true` when there is a committed edit that can be undone (Ctrl+Z). */\n readonly canUndo = computed(() => this.control()?.canUndo() ?? false);\n\n /** `true` when there is a previously undone edit that can be re-applied (Ctrl+Y / Ctrl+Shift+Z). */\n readonly canRedo = computed(() => this.control()?.canRedo() ?? false);\n\n private readonly columnLayout = new AgridColumnLayoutModel({\n control: this.control,\n colDefs: this.colDefs,\n headerGroups: this.headerGroups,\n showControlColumn: this.showControlColumn,\n controlColumnWidth: this.controlColumnWidth,\n getColumnWidth: col => this.getColumnWidth(col),\n getColumnWidthToken: col => this.getColumnWidthToken(col),\n });\n\n /** Columns currently visible after hidden state, ordering, and pinning are applied. */\n readonly visibleColDefs = this.columnLayout.visibleColDefs;\n /** Columns currently pinned to the left in display order. */\n readonly pinnedColDefs = this.columnLayout.pinnedColDefs;\n /** Columns currently pinned to the right in display order. */\n readonly rightPinnedColDefs = this.columnLayout.rightPinnedColDefs;\n /** Columns rendered in the horizontally scrollable pane. */\n readonly scrollableColDefs = this.columnLayout.scrollableColDefs;\n readonly rightGridTemplateColumns = this.columnLayout.rightGridTemplateColumns;\n readonly rightPinnedPaneWidth = this.columnLayout.rightPinnedPaneWidth;\n readonly hasRightPinnedPane = this.columnLayout.hasRightPinnedPane;\n readonly hasPinnedPane = this.columnLayout.hasPinnedPane;\n readonly hasFilterableColumns = this.columnLayout.hasFilterableColumns;\n readonly hasHeaderGroups = this.columnLayout.hasHeaderGroups;\n readonly pinnedHeaderGroupRuns = this.columnLayout.pinnedHeaderGroupRuns;\n readonly scrollableHeaderGroupRuns = this.columnLayout.scrollableHeaderGroupRuns;\n readonly rightHeaderGroupRuns = this.columnLayout.rightHeaderGroupRuns;\n\n private readonly columnState = new AgridColumnStateService({\n control: this.control,\n colDefs: this.colDefs,\n visibleColDefs: this.visibleColDefs,\n pinnedColDefs: this.pinnedColDefs,\n rightPinnedColDefs: this.rightPinnedColDefs,\n showControlColumn: this.showControlColumn,\n });\n\n private readonly projection: AgridProjectionModel = new AgridProjectionModel({\n dataSource: this.dataSource,\n control: this.control,\n colDefs: this.colDefs,\n visibleColDefs: this.visibleColDefs,\n locale: this.locale,\n serverSideFiltering: this.serverSideFiltering,\n sortOption: this.sortOption,\n allowAddRows: this.allowAddRows,\n autoAddRows: this.autoAddRows,\n expandedGroups: this.groupController.expandedGroups,\n treeConfig: this.treeConfig,\n expandedTreeIds: this.treeController.expandedIds,\n pinRow: this.effectivePinRow,\n masterDetail: this.masterDetail,\n expandedDetailIds: this._expandedDetailIds,\n });\n\n private readonly editController = new AgridEditController({\n control: this.control,\n dataSource: this.dataSource,\n visibleColDefs: this.visibleColDefs,\n readonlyGrid: this.readonlyGrid,\n selectedCell: this.selectedCell,\n selectedRange: this.selectedRange,\n findDisplayIndex: originalIndex => this.findDisplayIndex(originalIndex),\n scrollToCell: (displayIndex, colIndex) => this.scrollToKeepVisible(displayIndex, colIndex),\n focusGrid: () => this.wrapperEl().nativeElement.focus(),\n onCellEdit: event => this.emitEditEvents(event),\n onValidationFailed: event => this.validationFailed.emit({ ...event, source: 'inline' }),\n });\n\n /** Total filtered row count regardless of current page. */\n readonly filteredRowCount = this.projection.filteredRowCount;\n\n /** Total number of pages given the current filter and page size. */\n readonly totalPages = this.projection.totalPages;\n\n readonly showPagination = this.projection.showPagination;\n\n /** Number of semantic header rows currently rendered. */\n readonly headerRowCount = computed(() => this.hasHeaderGroups() ? 2 : 1);\n\n /** Number of rendered semantic rows, including header and pinned rows. */\n readonly ariaRowCount = computed(() =>\n this.displayItems().length + this.headerRowCount() + (this.showFooter() ? 1 : 0)\n + this.pinnedTopItems().length + this.pinnedBottomItems().length\n );\n\n /** Number of visible semantic columns, including the optional control column. */\n readonly ariaColCount = computed(() =>\n this.visibleColDefs().length + (this.showControlColumn() ? 1 : 0)\n );\n\n /** True when no rows or group headers are visible (ignores add-row sentinel and ghost). */\n readonly isEmpty = computed(() =>\n !this.loading() && this.filteredItems().every(item => item === null || item === 'ghost')\n );\n\n /**\n * @internal Effective aggregate for the column menu — string values only.\n * Custom function aggregates from ColDef can't be represented in the menu so they return null.\n */\n getEffectiveAggregate(col: ColDef): 'sum' | 'avg' | 'min' | 'max' | 'count' | null {\n const ctrlAgg = this.control()?.aggregates()[col.field];\n if (ctrlAgg !== undefined) return ctrlAgg;\n const colAgg = col.aggregate;\n return typeof colAgg === 'string' ? colAgg : null;\n }\n\n /** True when at least one visible column has an aggregate function (from ColDef or control). */\n readonly showFooter = this.projection.showFooter;\n\n /** Computed aggregate value per column field, over currently filtered rows. */\n readonly footerValues = this.projection.footerValues;\n\n readonly gridTemplateColumns = this.columnLayout.gridTemplateColumns;\n readonly pinnedGridTemplateColumns = this.columnLayout.pinnedGridTemplateColumns;\n readonly scrollableGridTemplateColumns = this.columnLayout.scrollableGridTemplateColumns;\n readonly totalWidth = this.columnLayout.totalWidth;\n readonly pinnedPaneWidth = this.columnLayout.pinnedPaneWidth;\n readonly scrollableTotalWidth = this.columnLayout.scrollableTotalWidth;\n\n /**\n * Filtered, sorted, and optionally grouped row list for `*cdkVirtualFor`.\n * Appends `null` when the explicit add-row placeholder is active.\n */\n readonly filteredItems: Signal<GridItem[]> = this.projection.filteredItems;\n\n /** Virtual scroll source — injects ghost row during a reorder drag. */\n /** Maps originalIndex → true if the data row should receive the odd-row stripe. Counts only data rows, so group headers don't shift the pattern. */\n readonly dataRowIsOdd = computed<Map<number, boolean>>(() => {\n const map = new Map<number, boolean>();\n let rank = 0;\n for (const item of this.filteredItems()) {\n if (isDataRowItemFn(item)) map.set(item.originalIndex, (rank++ % 2) !== 0);\n }\n return map;\n });\n\n readonly displayItems = computed<GridItem[]>(() => {\n const items = this.filteredItems();\n const dragIdx = this.dragHandler.reorderOriginalIndex();\n if (dragIdx === null) return items;\n\n const sourcePos = items.findIndex(item => isDataRowItemFn(item) && item.originalIndex === dragIdx);\n const withoutSource: GridItem[] = sourcePos === -1\n ? [...items]\n : [...items.slice(0, sourcePos), ...items.slice(sourcePos + 1)];\n\n const overIdx = this.dragHandler.reorderOverIndex();\n if (overIdx === null) return withoutSource;\n\n const targetPos = withoutSource.findIndex(item => isDataRowItemFn(item) && item.originalIndex === overIdx);\n if (targetPos === -1) return withoutSource;\n\n const insertAt = this.dragHandler.reorderInsertBefore() ? targetPos : targetPos + 1;\n const result = [...withoutSource];\n result.splice(insertAt, 0, 'ghost');\n return result;\n });\n\n /** Rows pinned to the top of the body (rendered in a fixed container, outside virtual scroll). */\n readonly pinnedTopItems = this.projection.pinnedTopItems;\n /** Rows pinned to the bottom of the body (rendered in a fixed container, outside virtual scroll). */\n readonly pinnedBottomItems = this.projection.pinnedBottomItems;\n /** Whether any top-pinned rows are present. */\n readonly hasPinnedTopRows = computed(() => this.pinnedTopItems().length > 0);\n /** Whether any bottom-pinned rows are present. */\n readonly hasPinnedBottomRows = computed(() => this.pinnedBottomItems().length > 0);\n\n /**\n * Per-item heights fed to the variable-size virtual-scroll strategy: a detail panel uses the\n * configured detail height, every other row uses the standard row height. With no detail rows\n * open the array is uniform, so scrolling matches the fixed-size strategy.\n */\n readonly itemSizes = computed<number[]>(() => {\n const h = this.rowHeight();\n const dh = this.detailRowHeight();\n return this.displayItems().map(item => (isDetailRowItemFn(item) ? dh : h));\n });\n\n // ── Menu signals ─────────────────────────────────────────────────────────────\n\n readonly groupActionsMenu = this.groupController.actionsMenu;\n\n // ── Infrastructure ────────────────────────────────────────────────────────────\n\n private readonly viewport = viewChild.required<CdkVirtualScrollViewport>('scrollViewport');\n private readonly pinnedViewport = viewChild<CdkVirtualScrollViewport>('pinnedViewport');\n private readonly rightPinnedViewport = viewChild<CdkVirtualScrollViewport>('rightPinnedViewport');\n private readonly wrapperEl = viewChild.required<ElementRef<HTMLDivElement>>('wrapper');\n private readonly horizontalScrollerEl =\n viewChild.required<ElementRef<HTMLDivElement>>('horizontalScroller');\n private readonly destroyRef = inject(DestroyRef);\n private readonly _hostEl = inject(ElementRef<HTMLElement>);\n private readonly browser = new AgridBrowserAdapter();\n\n private readonly rangeController = new AgridRangeController({\n control: this.control,\n dataSource: this.dataSource,\n filteredItems: this.filteredItems,\n visibleColDefs: this.visibleColDefs,\n selectedCell: this.selectedCell,\n selectedRange: this.selectedRange,\n isCellEditable: (col, originalIndex) => this.isCellEditable(col, originalIndex),\n cancelEdit: () => this.cancelCurrent(),\n findDisplayIndex: originalIndex => this.findDisplayIndex(originalIndex),\n scrollToCell: (displayIndex, colIndex) => this.scrollToKeepVisible(displayIndex, colIndex),\n onCellEdit: event => this.emitEditEvents(event),\n }, this.destroyRef);\n\n private readonly columnSizing = new AgridColumnSizingController({\n control: this.control,\n filteredItems: this.filteredItems,\n visibleColDefs: this.visibleColDefs,\n scrollableColDefs: this.scrollableColDefs,\n locale: this.locale,\n isColumnPinned: field => this.isColumnPinned(field),\n wrapperElement: () => this.wrapperEl().nativeElement,\n scrollerElement: () => this.horizontalScrollerEl().nativeElement,\n }, this.destroyRef);\n\n private readonly columnMenuController = new AgridColumnMenuController({\n control: this.control,\n dataSource: this.dataSource,\n colDefs: this.colDefs,\n serverSideFiltering: this.serverSideFiltering,\n filterDebounceMs: this.filterDebounceMs,\n sortOption: this.sortOption,\n effectiveSortOrder: () => this.projection.effectiveSortOrder(),\n autosizeColumn: col => this.columnSizing.autosizeColumn(col),\n onFilterChange: event => this.filterChange.emit(event),\n onSortChange: event => this.sortChange.emit(event),\n }, this.destroyRef);\n\n readonly filterMenu = this.columnMenuController.menu;\n readonly filterMenuSearch = this.columnMenuController.search;\n readonly filterMenuItems = this.columnMenuController.items;\n readonly filterMenuVisibleItems = this.columnMenuController.visibleItems;\n readonly filterMenuActiveValues = this.columnMenuController.activeValues;\n readonly columnMenuValueItems = this.columnMenuController.valueItems;\n\n private readonly presentation = new AgridPresentationService({\n control: this.control,\n visibleColDefs: this.visibleColDefs,\n filteredItems: this.filteredItems,\n locale: this.locale,\n getRowClass: this.rowClassFn,\n });\n\n private readonly findController = new AgridFindController({\n dataSource: this.dataSource,\n filteredSortedIndices: this.projection.filteredSortedIndices,\n visibleColDefs: this.visibleColDefs,\n locale: this.locale,\n selectedCell: this.selectedCell,\n selectedRange: this.selectedRange,\n revealMatch: (originalIndex, colIndex) => this.revealFindMatch(originalIndex, colIndex),\n focusGrid: () => this.wrapperEl().nativeElement.focus(),\n });\n\n readonly findOpen = this.findController.open;\n readonly findQuery = this.findController.query;\n readonly findActiveIndex = this.findController.activeIndex;\n readonly findMatches = this.findController.matches;\n\n private readonly navigationController = new AgridNavigationController({\n control: this.control,\n dataSource: this.dataSource,\n filteredItems: this.filteredItems,\n filteredSortedIndices: this.projection.filteredSortedIndices,\n colDefs: this.colDefs,\n visibleColDefs: this.visibleColDefs,\n rowHeight: this.rowHeight,\n allowAddRows: this.allowAddRows,\n autoAddRows: this.autoAddRows,\n enterEditAction: this.enterEditAction,\n selectedCell: this.selectedCell,\n selectedRange: this.selectedRange,\n editingCell: this.editController.editingCell,\n isEditing: (originalIndex, colIndex) => this.isEditing(originalIndex, colIndex),\n isCellEditable: (col, originalIndex) => this.editController.isCellEditable(col, originalIndex),\n toggleTreeCell: (originalIndex, colIndex) =>\n this.toggleTreeCell(originalIndex, colIndex),\n startEdit: (originalIndex, colIndex, seedChar, selectText) =>\n this.editController.start(originalIndex, colIndex, seedChar, selectText),\n commitEdit: () => this.editController.commit(),\n cancelEdit: () => this.editController.cancel(),\n undoEdit: () => this.editController.undo(),\n redoEdit: () => this.editController.redo(),\n extendRangeTo: (originalIndex, colIndex) =>\n this.rangeController.extendTo(originalIndex, colIndex),\n openFind: () => this.findController.show(),\n focusGrid: () => this.wrapperEl().nativeElement.focus(),\n viewport: () => this.viewport(),\n scrollColumnToKeepVisible: colIndex =>\n this.columnSizing.scrollColumnToKeepVisible(colIndex),\n onPrepareAddRecord: event => this.prepareAddRecord.emit({\n ...event,\n provider: this.provider(),\n datasource: this.dataSource(),\n }),\n });\n\n private readonly rowController = new AgridRowController({\n dataSource: this.dataSource,\n filteredItems: this.filteredItems,\n visibleColDefs: this.visibleColDefs,\n locale: this.locale,\n markedRowIndices: this.markedRowIndices,\n rowSelection: this.rowSelection,\n selectedCell: this.selectedCell,\n editingCell: this.editController.editingCell,\n insertRowAt: index => {\n this.reconcileMarkedRowsAfterInsertion(index);\n this.navigationController.insertRowAt(index);\n },\n startDragSelect: originalIndex => this.dragHandler.startDragSelect(originalIndex),\n onRowSelect: event => this.rowSelect.emit(event),\n onRowClick: event => this.rowClick.emit(event),\n onRowRemoved: event => {\n this.reconcileDirtyInlineRowsAfterRemoval(event.index);\n this.reconcileMarkedRowsAfterRemoval(event.index);\n this.rowRemoved.emit(this.createRecordEvent(event.index, event.data));\n },\n onEditRowRemoved: originalIndex => this.editController.onRowRemoved(originalIndex),\n closeFilterMenu: () => this.columnMenuController.close(),\n closeGroupActionsMenu: () => this.closeGroupActionsMenu(),\n });\n\n readonly selectedRowIndices = this.rowController.selectedRowIndices;\n readonly selectedRowIndex = this.rowController.selectedRowIndex;\n readonly contextMenu = this.rowController.contextMenu;\n readonly cellContextMenuState = this.rowController.cellContextMenu;\n\n /** Id of the menu-bar button whose dropdown is open, or `null`. */\n readonly openMenuBarItemId = signal<string | null>(null);\n\n /** Runtime state passed to menu-bar visibility, active, and disabled resolvers. */\n readonly menuBarContext = computed<AgridMenuBarContext<T>>(() => {\n const datasource = this.dataSource();\n const rows = datasource.rows() as T[];\n const selectedRows = [...this.selectedRowIndices()]\n .sort((a, b) => a - b)\n .map(originalIndex => ({ row: rows[originalIndex], originalIndex }))\n .filter((entry): entry is { row: T; originalIndex: number } => !!entry.row);\n return {\n rows,\n selectedRows,\n selectedCell: this.selectedCell(),\n provider: this.provider(),\n datasource,\n };\n });\n\n /** Menu-bar buttons currently allowed by their visibility resolvers. */\n readonly visibleMenuBarItems = computed(() =>\n this.menuBarItems().filter(item => this.isMenuBarItemVisible(item)),\n );\n\n private readonly sidebarController = new AgridSidebarController({\n control: this.control,\n dataSource: this.dataSource,\n colDefs: this.colDefs,\n visibleColDefs: this.visibleColDefs,\n selectedRowIndex: this.selectedRowIndex,\n autoOpenDetail: this.autoOpenDetail,\n useSidebarEditor: this.useSidebarEditor,\n isCellEditable: (col, originalIndex) => this.isCellEditable(col, originalIndex),\n onFieldChange: event => this.markCellChanged(event),\n onCellEdit: event => this.emitSidebarEditEvents(event),\n onValidationFailed: event => this.validationFailed.emit({ ...event, source: 'sidebar' }),\n });\n\n readonly sidebarOpen = this.sidebarController.open;\n /** @internal Per-field sidebar validation messages. */\n readonly sidebarValidationErrors = this.sidebarController.validationErrors;\n readonly sidebarTab = this.sidebarController.tab;\n readonly sidebarRow = this.sidebarController.row;\n readonly sidebarHiddenColumns = this.sidebarController.hiddenColumns;\n\n private readonly clipboardHandler = new AgridClipboardHandler({\n control: this.control,\n dataSource: this.dataSource,\n filteredItems: this.filteredItems,\n visibleColDefs: this.visibleColDefs,\n locale: this.locale,\n selectedCell: this.selectedCell,\n selectedRange: this.selectedRange,\n markedRowIndices: this.markedRowIndices,\n isCellEditable: (col, originalIndex) => this.isCellEditable(col, originalIndex),\n onCellEdit: event => this.emitEditEvents(event),\n scrollToCell: (displayIndex, colIndex) => this.scrollToKeepVisible(displayIndex, colIndex),\n });\n\n readonly dragHandler = new AgridDragHandler({\n dataSource: this.dataSource,\n filteredItems: () => this.filteredItems(),\n locale: () => this.locale(),\n selectedIndices: this.rowController.selectedIndices,\n onReorder: e => {\n this.reconcileMarkedRowsAfterMove(e.oldIndex, e.newIndex);\n this.rowReorder.emit(e);\n },\n onSelectionChange: () => this.rowController.emitSelection(),\n }, this.destroyRef);\n\n private readonly columnReorder = new AgridColumnReorderController({\n control: this.control,\n visibleColDefs: this.visibleColDefs,\n getColDef: field => this.getColDef(field),\n }, this.destroyRef);\n\n readonly columnDragPreview = this.columnReorder.preview;\n\n /** @internal Start a column header drag. */\n onColHeaderPointerDown(event: PointerEvent, field: string): void {\n this.columnReorder.start(event, field);\n }\n\n /** @internal Start dragging all columns in one contiguous grouped-header segment. */\n onHeaderGroupPointerDown(event: PointerEvent, fields: string[], label: string): void {\n this.columnReorder.startGroup(event, fields, label);\n }\n\n /** @internal Whether any field in a grouped-header segment is being dragged. */\n isHeaderGroupDragging(fields: string[]): boolean {\n return fields.some(field => this.columnReorder.isDragging(field));\n }\n\n /** @internal Whether a grouped-header segment contains a locked column. */\n isHeaderGroupLocked(fields: string[]): boolean {\n return fields.some(field => this.getColDef(field)?.locked);\n }\n\n /** @internal Whether the given column header is being dragged. */\n isColDragging(field: string): boolean {\n return this.columnReorder.isDragging(field);\n }\n\n /** @internal Template helper for drop-indicator class. */\n getColDropSide(field: string): 'before' | 'after' | null {\n return this.columnReorder.getDropSide(field);\n }\n\n /** @internal Horizontal animation offset for a header during column reordering. */\n getColReorderOffset(field: string): number {\n return this.columnReorder.getHeaderOffset(field);\n }\n\n hasContextMenuEntries() {\n const hme = (!this.readonlyGrid() && !this.treeConfig())\n return hme;\n }\n\n // ── Setup ─────────────────────────────────────────────────────────────────────\n\n private readonly _seededControls = new WeakSet<AgridControl>();\n private readonly dirtyInlineRows = new Set<number>();\n private dirtyRowsDataSource: AgridDataSource | null = null;\n private readonly changedCells = signal<ReadonlySet<string>>(new Set());\n private changedCellsDataSource: AgridDataSource | null = null;\n\n private emitEditEvents(event: GridEditEvent): void {\n this.cellEdit.emit(event as GridEditEvent<T>);\n this.emitRecordEdit(event.position.rowIndex);\n this.markInlineRowDirty(event.position.rowIndex);\n this.markCellChanged(event);\n }\n\n private emitSidebarEditEvents(event: GridEditEvent): void {\n this.cellEdit.emit(event as GridEditEvent<T>);\n this.emitRecordEdit(event.position.rowIndex);\n }\n\n private emitRecordEdit(index: number): void {\n const datasource = this.dataSource();\n const event = this.createRecordEvent(index, datasource.getRow(index));\n queueMicrotask(() => this.recordEdit.emit(event));\n }\n\n private markInlineRowDirty(index: number): void {\n const datasource = this.dataSource();\n if (this.dirtyRowsDataSource !== datasource) {\n this.dirtyInlineRows.clear();\n this.dirtyRowsDataSource = datasource;\n }\n this.dirtyInlineRows.add(index);\n }\n\n private markCellChanged(event: GridEditEvent): void {\n if (!this.showChangedCellIndicator()) return;\n const datasource = this.dataSource();\n if (this.changedCellsDataSource !== datasource) {\n this.changedCells.set(new Set());\n this.changedCellsDataSource = datasource;\n }\n this.changedCells.update(current => {\n const next = new Set(current);\n next.add(this.changedCellKey(event.position.rowIndex, event.field));\n return next;\n });\n }\n\n private changedCellKey(rowIndex: number, field: string): string {\n return JSON.stringify([rowIndex, field]);\n }\n\n private parseChangedCellKey(key: string): { rowIndex: number; field: string } {\n const [rowIndex, field] = JSON.parse(key) as [number, string];\n return { rowIndex, field };\n }\n\n private flushDirtyInlineRows(activeRowIndex: number | null = null): void {\n const datasource = this.dataSource();\n if (this.dirtyRowsDataSource !== datasource) {\n this.dirtyInlineRows.clear();\n this.dirtyRowsDataSource = datasource;\n return;\n }\n\n for (const index of [...this.dirtyInlineRows].sort((a, b) => a - b)) {\n if (index === activeRowIndex) continue;\n this.dirtyInlineRows.delete(index);\n if (index >= 0 && index < datasource.length) this.emitRowChanged(index);\n }\n }\n\n private reconcileDirtyInlineRowsAfterRemoval(removedIndex: number): void {\n const shifted = new Set<number>();\n for (const index of this.dirtyInlineRows) {\n if (index < removedIndex) shifted.add(index);\n else if (index > removedIndex) shifted.add(index - 1);\n }\n this.dirtyInlineRows.clear();\n for (const index of shifted) this.dirtyInlineRows.add(index);\n this.reconcileChangedCellsAfterRemoval(removedIndex);\n }\n\n private reconcileChangedCellsAfterRemoval(removedIndex: number): void {\n const shifted = new Set<string>();\n for (const key of this.changedCells()) {\n const marker = this.parseChangedCellKey(key);\n if (marker.rowIndex < removedIndex) shifted.add(key);\n else if (marker.rowIndex > removedIndex) {\n shifted.add(this.changedCellKey(marker.rowIndex - 1, marker.field));\n }\n }\n this.changedCells.set(shifted);\n }\n\n private emitRowChanged(originalIndex: number): void {\n this.rowChanged.emit({\n row: this.dataSource().getRow(originalIndex),\n originalIndex,\n } as RowUpdateEvent<T>);\n }\n\n private createRecordEvent(index: number, data: Record<string, unknown>): RecordEditEvent {\n const datasource = this.dataSource();\n return {\n index,\n data,\n provider: this.provider(),\n datasource,\n };\n }\n\n constructor() {\n effect(() => this.sidebarController.syncAutoOpen());\n\n effect(() => {\n const datasource = this.dataSource();\n if (this.changedCellsDataSource === datasource) return;\n this.changedCellsDataSource = datasource;\n this.changedCells.set(new Set());\n });\n\n effect(() => {\n const activeRowIndex = this.selectedCell()?.rowIndex ?? null;\n this.flushDirtyInlineRows(activeRowIndex);\n });\n\n afterNextRender(() => {\n const wrapper = this.wrapperEl().nativeElement;\n const onKeyDown = (event: KeyboardEvent) => this.onKeyDown(event);\n wrapper.addEventListener('keydown', onKeyDown, { capture: true });\n this.destroyRef.onDestroy(() =>\n wrapper.removeEventListener('keydown', onKeyDown, { capture: true })\n );\n });\n\n const onDocumentKeyDown = (event: KeyboardEvent) => {\n if (event.key !== 'Escape' || event.defaultPrevented) return;\n if (this.closeOpenMenus()) {\n event.preventDefault();\n event.stopPropagation();\n }\n };\n this.browser.addDocumentListener('keydown', onDocumentKeyDown);\n\n // Emit pageChange whenever page or pageSize changes in server-side pagination mode.\n effect(() => {\n const ctrl = this.control();\n if (!ctrl || ctrl.totalRows() <= 0 || ctrl.pageSize() <= 0) return;\n const page = ctrl.currentPage();\n const pageSize = ctrl.pageSize();\n const totalRows = ctrl.totalRows();\n const startRow = (page - 1) * pageSize;\n const endRow = Math.min(page * pageSize, totalRows) - 1;\n this.pageChange.emit({ page, pageSize, startRow, endRow });\n });\n\n effect(() => {\n const added = this.dataSource().rowAdded();\n if (!added) return;\n this.navigationController.revealRow(added.index);\n });\n\n // Deselect when clicking outside the grid.\n const onOutsidePointerDown = (e: PointerEvent) => {\n const isInsideGrid = this._hostEl.nativeElement.contains(e.target as Node);\n if (!isInsideGrid) {\n this.closeOpenMenus();\n queueMicrotask(() => this.flushDirtyInlineRows());\n }\n if (this.rowSelection() === 'none') return;\n if (this.selectedRowIndices().size === 0) return;\n if (isInsideGrid) return;\n this.rowController.clearSelection();\n };\n this.browser.addDocumentListener('pointerdown', onOutsidePointerDown);\n this.destroyRef.onDestroy(() => {\n this.browser.removeDocumentListener('keydown', onDocumentKeyDown);\n this.browser.removeDocumentListener('pointerdown', onOutsidePointerDown);\n if (this.quickFilterTimer !== null) clearTimeout(this.quickFilterTimer);\n });\n\n // Re-sync pinned pane scroll after displayItems changes — CDK independently adjusts\n // each viewport when item count changes (group/ungroup, collapse), which can leave\n // the panes offset by one row.\n effect(() => {\n this.displayItems();\n setTimeout(() => {\n const viewport = this.viewport();\n viewport.checkViewportSize();\n this.pinnedViewport()?.checkViewportSize();\n this.rightPinnedViewport()?.checkViewportSize();\n\n const offset = viewport.measureScrollOffset();\n this.pinnedViewport()?.scrollToOffset(offset);\n this.rightPinnedViewport()?.scrollToOffset(offset);\n }, 0);\n });\n\n // Seed ColDef.hidden and ColDef.pinned into the control once per control instance.\n effect(() => {\n const ctrl = this.control();\n const cols = this.colDefs();\n if (!ctrl || this._seededControls.has(ctrl)) return;\n this._seededControls.add(ctrl);\n for (const col of cols) {\n if (col.hidden) ctrl.setColumnVisibility(col.field, false);\n if (col.pinned === 'left') ctrl.setPinned(col.field, true);\n if (col.pinned === 'right') ctrl.setPinnedRight(col.field, true);\n }\n });\n }\n\n // ── Template helpers — type guards ────────────────────────────────────────────\n\n /** @internal */\n isDataRowItem(item: GridItem): item is { row: Record<string, unknown>; originalIndex: number } {\n return isDataRowItemFn(item);\n }\n\n /** @internal */\n isGroupHeaderItem(item: GridItem): item is { groupLabel: string; count: number; collapsed: boolean } {\n return isGroupHeaderItemFn(item);\n }\n\n /** @internal */\n isPathTreeNodeItem(item: GridItem): boolean {\n return isPathTreeNodeItemFn(item);\n }\n\n /** @internal */\n getItemOriginalIndex(item: GridItem): number | null {\n return isDataRowItemFn(item) ? item.originalIndex : null;\n }\n\n /** @internal True when the item is a master/detail panel row. */\n isDetailRowItem(item: GridItem): item is DetailRowItem {\n return isDetailRowItemFn(item);\n }\n\n /** @internal Rendered pixel height of a virtual-scroll item (detail panels are taller). */\n rowPx(item: GridItem): number {\n return isDetailRowItemFn(item) ? this.detailRowHeight() : this.rowHeight();\n }\n\n /** @internal Resolved HTML for an expanded detail panel (auto-sanitized by `[innerHTML]`). */\n detailHtml(item: GridItem): string {\n if (!isDetailRowItemFn(item)) return '';\n return this.provider().detailRenderer?.({ row: item.row as T }) ?? '';\n }\n\n /** @internal Resolved per-row CSS classes from the host `getRowClass` callback. */\n getRowClass(row: Record<string, unknown>, index: number): string {\n return this.presentation.getRowClass(row, index);\n }\n\n /** Whether the master/detail panel for `originalIndex` is currently expanded. */\n isDetailExpanded(originalIndex: number): boolean {\n return this._expandedDetailIds().has(originalIndex);\n }\n\n /** @internal Whether a data row may show a master/detail panel. */\n canToggleDetail(item: GridItem): boolean {\n if (!this.masterDetail() || !isDataRowItemFn(item)) return false;\n const config = this.treeConfig();\n return !config\n || isPathTreeConfig(config)\n || !this.treeParentIds().has(config.getId(item.row as T));\n }\n\n /** Toggle the master/detail panel for a row by its original (data-source) index. */\n toggleDetail(originalIndex: number): void {\n const row = this.dataSource().getRow(originalIndex);\n const config = this.treeConfig();\n if (\n !row\n || (\n config\n && !isPathTreeConfig(config)\n && this.treeParentIds().has(config.getId(row as T))\n )\n ) return;\n this._expandedDetailIds.update(ids => {\n const next = new Set(ids);\n if (next.has(originalIndex)) next.delete(originalIndex);\n else next.add(originalIndex);\n return next;\n });\n }\n\n /** @internal Template handler for the detail expander chevron. */\n onDetailToggle(originalIndex: number): void {\n this.toggleDetail(originalIndex);\n }\n\n /** Effective pin position of a row (`'top'`, `'bottom'`, or `undefined`). */\n rowPinState(originalIndex: number): 'top' | 'bottom' | undefined {\n const resolver = this.effectivePinRow();\n if (!resolver) return undefined;\n return resolver(this.dataSource().rows()[originalIndex], originalIndex);\n }\n\n /**\n * Pin a row to the top or bottom of the body, or unpin it with `null`.\n * Keyed by the row's original (data-source) index; the pinned row stays fully interactive.\n */\n pinRowTo(originalIndex: number, position: 'top' | 'bottom' | null): void {\n this._pinnedRows.update(map => {\n const next = new Map(map);\n // When no predicate could re-pin the row, an unpin can simply drop the override.\n if (position === null && !this.pinRowFn()) next.delete(originalIndex);\n else next.set(originalIndex, position);\n return next;\n });\n }\n\n /** @internal Template handler for the pin/unpin context-menu items; closes the open menus. */\n onPinRow(originalIndex: number, position: 'top' | 'bottom' | null): void {\n this.pinRowTo(originalIndex, position);\n this.rowController.closeContextMenu();\n this.rowController.closeCellContextMenu();\n }\n\n // ── Template helpers — tree ───────────────────────────────────────────────────\n\n /** @internal True when `col` is the configured tree column. */\n isTreeCell(col: ColDef): boolean {\n return this.treeConfig()?.treeField === col.field;\n }\n\n /** @internal Tree depth of a row item (0 when not a tree row). */\n treeRowLevel(item: GridItem): number {\n return isTreeRowItemFn(item) || isPathTreeNodeItemFn(item) ? item.level : 0;\n }\n\n /** @internal Whether a tree row has children and can be expanded. */\n treeRowExpandable(item: GridItem): boolean {\n return (isTreeRowItemFn(item) || isPathTreeNodeItemFn(item)) && item.expandable;\n }\n\n /** @internal Whether a tree row is currently expanded. */\n treeRowExpanded(item: GridItem): boolean {\n return (isTreeRowItemFn(item) || isPathTreeNodeItemFn(item)) && item.expanded;\n }\n\n /** @internal Display-only final path segment for a datasource-backed path-tree leaf. */\n treeCellDisplayOverride(item: GridItem, col: ColDef): string | null {\n return isTreeRowItemFn(item) && this.isTreeCell(col) ? item.treeLabel ?? null : null;\n }\n\n /** @internal Whether the configured info action is visible for this cell. */\n showCellInfoIcon(col: ColDef, row: Record<string, unknown>): boolean {\n return typeof col.infoIcon === 'function'\n ? col.infoIcon({ value: row[col.field], row })\n : col.infoIcon === true;\n }\n\n /** @internal Emits the typed cell information action. */\n onCellInfo(originalIndex: number, col: ColDef, row: Record<string, unknown>): void {\n this.cellInfo.emit({\n row: row as T,\n field: col.field as AgridField<T>,\n value: row[col.field],\n originalIndex,\n column: col,\n } as unknown as CellInfoEvent<T>);\n }\n\n /** @internal Label of a generated path-tree branch. */\n pathTreeLabel(item: GridItem): string {\n return isPathTreeNodeItemFn(item) ? item.pathLabel : '';\n }\n\n /** @internal Toggle the expand/collapse state of a tree row from its twisty. */\n onTreeToggle(item: GridItem): void {\n const config = this.treeConfig();\n if (!config) return;\n if (isPathTreeNodeItemFn(item)) {\n this.treeController.toggle(item.pathNodeId);\n } else if (isTreeRowItemFn(item) && !isPathTreeConfig(config)) {\n this.treeController.toggle(config.getId(item.row as T));\n }\n }\n\n /** @internal Emits the generated path-tree branch click event. */\n onTreeNodeClick(item: GridItem): void {\n if (!isPathTreeNodeItemFn(item)) return;\n this.treeNodeClick.emit(this.toTreeNodeClickEvent(item));\n }\n\n /** @internal Emits the generated path-tree branch double-click event. */\n onTreeNodeDoubleClick(item: GridItem): void {\n if (!isPathTreeNodeItemFn(item)) return;\n this.treeNodeDoubleClicked.emit(this.toTreeNodeClickEvent(item));\n }\n\n private toTreeNodeClickEvent(item: PathTreeNodeItem): TreeNodeClickEvent {\n return {\n uuid: item.uuid,\n pathNodeId: item.pathNodeId,\n pathLabel: item.pathLabel,\n level: item.level,\n expanded: item.expanded,\n node: { ...item },\n };\n }\n\n private toggleTreeCell(originalIndex: number, colIndex: number): boolean {\n const config = this.treeConfig();\n const col = this.visibleColDefs()[colIndex];\n if (!config || !col || config.treeField !== col.field) return false;\n\n const item = this.displayItems().find(\n candidate => isDataRowItemFn(candidate) && candidate.originalIndex === originalIndex,\n );\n if (!item || !isTreeRowItemFn(item) || !item.expandable || isPathTreeConfig(config)) return false;\n\n this.treeController.toggle(config.getId(item.row as T));\n return true;\n }\n\n /** Expand every expandable node in the tree. No-op when not in tree mode. */\n expandAllNodes(): void {\n const config = this.treeConfig();\n if (!config) return;\n if (isPathTreeConfig(config)) {\n const ids = new Set<string>();\n for (const row of this.dataSource().rows() as T[]) {\n const path = config.getPath(row).map(String).filter(Boolean);\n for (let length = 1; length < path.length; length++) {\n ids.add(pathTreeNodeId(path.slice(0, length)));\n }\n }\n this.treeController.expandAll(ids);\n return;\n }\n const expandable = new Set<string | number>();\n for (const row of this.dataSource().rows()) {\n const parentId = config.getParentId(row as T);\n if (parentId != null) expandable.add(parentId);\n }\n this.treeController.expandAll(expandable);\n }\n\n /** Collapse every node in the tree. No-op when not in tree mode. */\n collapseAllNodes(): void {\n this.treeController.collapseAll();\n }\n\n /** @internal CDK trackBy — arrow to preserve `this`. */\n readonly trackByItem = (_di: number, item: GridItem): string | number => {\n if (item === 'ghost') return '__ghost__';\n if (item === null) return -1;\n if (isGroupHeaderItemFn(item)) return `__group__${item.groupLabel}`;\n if (isDetailRowItemFn(item)) return `__detail__${item.detailFor}`;\n if (isPathTreeNodeItemFn(item)) return item.pathNodeId;\n return item.originalIndex;\n };\n\n // ── Template helpers — cell/selection state ───────────────────────────────────\n\n /** @internal */\n isSelected(originalIndex: number, ci: number): boolean {\n const sel = this.selectedCell();\n return sel?.rowIndex === originalIndex && sel?.colIndex === ci;\n }\n\n /** @internal */\n isEditing(originalIndex: number, ci: number): boolean {\n const ed = this.editingCell();\n return ed?.rowIndex === originalIndex && ed?.colIndex === ci;\n }\n\n /** @internal */\n getSeedChar(originalIndex: number, ci: number): string {\n return this.isEditing(originalIndex, ci) ? this.editSeedChar() : '';\n }\n\n /** @internal */\n isAddRowSelected(): boolean {\n const sel = this.selectedCell();\n return this.allowAddRows() && sel?.rowIndex === this.dataSource().length;\n }\n\n /** @internal */\n isRowSelected(originalIndex: number): boolean {\n return this.rowController.isRowSelected(originalIndex);\n }\n\n /** @internal Selection class for the separate pinned/control viewport. */\n isPinnedPaneRowSelected(item: GridItem): boolean {\n return this.rowController.isPinnedPaneRowSelected(item);\n }\n\n // ── Template helpers — filter menu ────────────────────────────────────────────\n\n /** @internal */\n /** @internal 1-based sort priority for a column, 0 if not sorted. */\n getSortPriority(field: string): number { return this.columnMenuController.getSortPriority(field); }\n\n /** @internal Whether more than one column is currently sorted. */\n hasMultiSort(): boolean {\n return this.columnMenuController.hasMultiSort();\n }\n\n getTextFilter(field: string): string { return this.columnMenuController.getTextFilter(field); }\n\n /** @internal Condition input type for a column, or `null` when unsupported. */\n getMenuFilterType(field: string): 'text' | 'number' | 'date' | null {\n return this.columnMenuController.getFilterType(field);\n }\n\n /** @internal Short label for an active header condition. */\n getConditionButtonLabel(field: string): string {\n switch (this.getMenuOperator(field)) {\n case 'eq': return '=';\n case 'neq': return '≠';\n case 'gt': return '>';\n case 'gte': return '≥';\n case 'lt': return '<';\n case 'lte': return '≤';\n case 'between': return '↔';\n case 'like': return '~';\n case 'startsWith': return 'A…';\n case 'endsWith': return '…Z';\n case 'includes': return '⊃';\n case 'notIncludes': return '⊅';\n default: return '⋯';\n }\n }\n\n /** @internal */\n getMenuOperator(field: string): FilterOperator | null {\n return this.columnMenuController.getFilterOperator(field);\n }\n\n /** @internal */\n getMenuOperand(field: string): string { return this.columnMenuController.getFilterOperand(field); }\n\n /** @internal */\n getMenuOperand2(field: string): string {\n return this.columnMenuController.getFilterOperand2(field);\n }\n\n /** @internal */\n onMenuOperatorChange(field: string, operator: FilterOperator | null): void {\n this.columnMenuController.setFilterOperator(field, operator);\n }\n\n /** @internal */\n onMenuOperandChange(field: string, value: string): void {\n this.columnMenuController.setFilterOperand(field, value);\n }\n\n /** @internal */\n onMenuOperand2Change(field: string, value: string): void {\n this.columnMenuController.setFilterOperand2(field, value);\n }\n\n /** @internal */\n getSort(field: string): 'asc' | 'desc' | null {\n return this.columnMenuController.getSort(field);\n }\n\n /** @internal */\n isMenuAllSelected(field: string): boolean {\n return this.columnMenuController.isAllSelected(field);\n }\n\n /** @internal */\n isMenuValueActive(rawStr: string): boolean {\n return this.columnMenuController.isValueActive(rawStr);\n }\n\n /** @internal */\n isMenuValueSelected(field: string, value: string): boolean {\n return this.columnMenuController.isValueSelected(field, value);\n }\n\n /** @internal */\n hasActiveFilter(field: string): boolean {\n return this.columnMenuController.hasActiveFilter(field);\n }\n\n /** @internal */\n getColDef(field: string): ColDef | undefined { return this.columnState.getColDef(field); }\n\n /** @internal */\n getVisibleColIndex(field: string): number {\n return this.columnState.getVisibleColIndex(field);\n }\n\n /** @internal Convert a zero-based visible data-column index to a one-based ARIA index. */\n getAriaColIndex(colIndex: number): number {\n return this.columnState.getAriaColIndex(colIndex);\n }\n\n /** @internal */\n isColumnHidden(field: string): boolean { return this.columnState.isColumnHidden(field); }\n\n /** @internal */\n isGroupedByField(field: string): boolean { return this.columnState.isGroupedByField(field); }\n\n /** @internal */\n isColumnPinned(field: string): boolean {\n return this.columnState.isColumnPinned(field);\n }\n\n isColumnPinnedRight(field: string): boolean {\n return this.columnState.isColumnPinnedRight(field);\n }\n\n /** Returns `'left'`, `'right'`, or `false` — used by the column menu. */\n getColumnPinState(field: string): 'left' | 'right' | false {\n return this.columnState.getColumnPinState(field);\n }\n\n isFirstRightPinnedColumn(field: string): boolean {\n return this.columnState.isFirstRightPinnedColumn(field);\n }\n\n /** @internal Returns `true` for the rightmost pinned column (used to draw the separator shadow). */\n isLastPinnedColumn(field: string): boolean {\n return this.columnState.isLastPinnedColumn(field);\n }\n\n // ── Row selection ─────────────────────────────────────────────────────────────\n\n /** @internal */\n onRowPointerDown(event: PointerEvent, originalIndex: number): void {\n this.rowController.selectFromPointer(event, originalIndex, true);\n }\n\n /** @internal Emits rowClick when the user single-clicks a data row outside of a cell editor. */\n onRowClick(event: MouseEvent, item: { row: Record<string, unknown>; originalIndex: number }): void {\n this.rowController.clickRow(item);\n }\n\n // ── Cell interaction ──────────────────────────────────────────────────────────\n\n /** @internal */\n onActivate(originalIndex: number, ci: number, event?: MouseEvent): void {\n this.navigationController.activateCell(originalIndex, ci, event);\n }\n\n /** @internal */\n onActivateAddRow(): void {\n this.navigationController.activateAddRow();\n }\n\n /** @internal */\n onStartEdit(originalIndex: number, ci: number): void {\n const row = this.dataSource().rows()[originalIndex];\n this.rowDoubleClicked.emit({ row, originalIndex });\n if (this.isEditing(originalIndex, ci)) return;\n this.enterEdit(originalIndex, ci, '');\n }\n\n /** @internal */\n onDraftChange(value: unknown): void { this.editController.setDraft(value); }\n\n private quickFilterTimer: ReturnType<typeof setTimeout> | null = null;\n\n /**\n * @internal Quick-filter input handler. Stores the text on the control (drives the bound value\n * and client-side filtering) and, in server mode, emits a debounced `quickFilterChange` instead.\n */\n onQuickFilterInput(event: Event): void {\n const text = (event.target as HTMLInputElement).value;\n this.control()?.setQuickFilter(text);\n if (!this.serverSideFiltering()) return;\n if (this.quickFilterTimer !== null) clearTimeout(this.quickFilterTimer);\n const delay = this.filterDebounceMs();\n if (delay === 0) {\n this.quickFilterChange.emit(text);\n return;\n }\n this.quickFilterTimer = setTimeout(() => {\n this.quickFilterTimer = null;\n this.quickFilterChange.emit(text);\n }, delay);\n }\n\n /** @internal Whether a column is editable in the current grid state (drives boolean checkboxes). */\n isColEditable(col: ColDef, originalIndex?: number): boolean {\n return this.editController.isCellEditable(col, originalIndex);\n }\n\n /** @internal Inline validation message for a cell, or `null` when the cell has no active error. */\n cellValidationError(originalIndex: number, ci: number): string | null {\n const error = this.editController.validationError();\n return error && error.rowIndex === originalIndex && error.colIndex === ci ? error.message : null;\n }\n\n /** @internal Commit a boolean-column checkbox toggle directly to the data source. */\n onBooleanToggle(originalIndex: number, ci: number, value: boolean): void {\n this.editController.setCellValue(originalIndex, ci, value);\n }\n\n /** @internal Starts a fill-handle drag from the bottom-right corner of the selection. */\n onCellPointerDown(event: PointerEvent, originalIndex: number, colIndex: number): void {\n this.rangeController.startFill(event, originalIndex, colIndex);\n }\n\n /** @internal Main keyboard handler delegated from the wrapper div. */\n onKeyDown(event: KeyboardEvent): void {\n if (event.key === 'Escape' && this.closeOpenMenus()) {\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n if (event.key === 'Escape' && this.pendingDeleteRow() !== null) {\n event.preventDefault();\n event.stopPropagation();\n this.cancelRowDelete();\n return;\n }\n this.navigationController.handleKeyDown(event);\n }\n\n /** @internal Clears cell navigation while a header filter control owns focus. */\n onGridFocusIn(event: FocusEvent): void {\n if ((event.target as Element | null)?.closest('.ag-filter-input, .ag-filter-menu')) {\n this.navigationController.deactivateCell();\n }\n }\n\n /** Open the find panel and focus its input. */\n openFind(): void {\n this.findController.show();\n }\n\n /** @internal */\n closeFind(): void {\n this.findController.close();\n }\n\n /** @internal */\n onFindInput(value: string): void {\n this.findController.setQuery(value);\n }\n\n /** @internal */\n goToFindMatch(direction: 1 | -1): void {\n this.findController.goToMatch(direction);\n }\n\n private revealFindMatch(originalIndex: number, colIndex: number): void {\n const config = this.treeConfig();\n if (config) {\n const rows = this.dataSource().rows() as T[];\n const expanded = new Set(this.treeController.expandedIds());\n if (isPathTreeConfig(config)) {\n const path = config.getPath(rows[originalIndex]).map(String).filter(Boolean);\n for (let length = 1; length < path.length; length++) {\n expanded.add(pathTreeNodeId(path.slice(0, length)));\n }\n } else {\n const idToRow = new Map(rows.map(row => [config.getId(row), row]));\n const visited = new Set<string | number>();\n let parentId = config.getParentId(rows[originalIndex]);\n while (parentId !== null && parentId !== undefined && !visited.has(parentId)) {\n visited.add(parentId);\n expanded.add(parentId);\n const parent = idToRow.get(parentId);\n if (!parent) break;\n parentId = config.getParentId(parent);\n }\n }\n this.treeController.expandAll(expanded);\n } else {\n const control = this.control();\n const pageSize = control?.pageSize() ?? 0;\n const filteredIndex = this.projection.filteredSortedIndices().indexOf(originalIndex);\n if (control && pageSize > 0 && control.totalRows() === 0 && filteredIndex >= 0) {\n control.setPage(Math.floor(filteredIndex / pageSize) + 1);\n }\n }\n\n setTimeout(() => {\n const displayIndex = this.navigationController.findDisplayIndex(originalIndex);\n if (displayIndex >= 0) {\n this.navigationController.scrollToKeepVisible(displayIndex, colIndex);\n }\n });\n }\n\n // ── Row reorder ───────────────────────────────────────────────────────────────\n\n /** @internal Ghost cell display during a reorder drag. */\n getGhostCellDisplay(col: ColDef): string { return this.dragHandler.getGhostDisplay(col); }\n\n /** @internal Delegates to AgridDragHandler. */\n onHandlePointerDown(event: PointerEvent, originalIndex: number): void {\n if (!this.allowRowReorder()) return;\n this.dragHandler.startReorder(event, originalIndex);\n }\n\n /** @internal Handles the control column without letting the row receive a second pointer event. */\n onControlPointerDown(event: PointerEvent, originalIndex: number): void {\n event.stopPropagation();\n if (this.allowRowReorder() && event.pointerType === 'mouse' && event.button === 0) {\n this.onHandlePointerDown(event, originalIndex);\n return;\n }\n this.rowController.selectFromPointer(event, originalIndex, false);\n }\n\n /** @internal Toggle whether a row is included in subsequent copy operations. */\n toggleRowMarked(originalIndex: number): void {\n this.markedIndices.update(indices => {\n const next = new Set(indices);\n if (next.has(originalIndex)) next.delete(originalIndex);\n else next.add(originalIndex);\n return next;\n });\n }\n\n /** @internal Returns whether a row is marked for copying. */\n isRowMarked(originalIndex: number): boolean {\n return this.markedIndices().has(originalIndex);\n }\n\n /** Clear every row marked for clipboard inclusion. */\n clearMarkedRows(): void {\n this.markedIndices.set(new Set());\n }\n\n /** @internal Copy the active range or cell as TSV. */\n onCopy(event: ClipboardEvent): void {\n this.clipboardHandler.copy(event);\n }\n\n /** @internal Paste TSV/CSV-like plain text into the current cell. */\n onPaste(event: ClipboardEvent): void {\n if (this.editingCell()) return;\n this.clipboardHandler.paste(event);\n }\n\n // ── Column resize ─────────────────────────────────────────────────────────────\n\n /** @internal Starts pointer-based column resizing. */\n onResizeStart(event: MouseEvent, col: ColDef): void {\n this.columnSizing.startResize(event, col);\n }\n\n /** @internal Resize a column from its keyboard-accessible separator handle. */\n onResizeKeyDown(event: KeyboardEvent, col: ColDef): void {\n this.columnSizing.resizeFromKeyboard(event, col);\n }\n\n /** @internal Autosize a column to fit its header and currently visible row values. */\n onAutosizeColumn(event: MouseEvent, col: ColDef): void {\n if (col.locked) return;\n event.preventDefault();\n event.stopPropagation();\n this.columnSizing.autosizeColumn(col);\n const selected = this.selectedCell();\n if (selected) this.columnSizing.scrollColumnToKeepVisible(selected.colIndex);\n }\n\n // ── Row context menu ──────────────────────────────────────────────────────────\n\n /** @internal */\n onControlContextMenu(event: MouseEvent, originalIndex: number): void {\n this.rowController.openRowContextMenu(event, originalIndex);\n }\n\n /** @internal */\n closeContextMenu(): void { this.rowController.closeContextMenu(); }\n\n /** @internal */\n onCellContextMenu(event: MouseEvent, rowIndex: number, colIndex: number, col: ColDef, row: Record<string, unknown>): void {\n this.rowController.openCellContextMenu(event, rowIndex, colIndex, col, row);\n }\n\n /** @internal */\n closeCellContextMenu(): void { this.rowController.closeCellContextMenu(); }\n\n /** @internal Closes any row, cell, menu-bar, group-action, or column menu owned by this grid. */\n closeOpenMenus(): boolean {\n const hadOpenMenu = this.contextMenu() !== null\n || this.cellContextMenuState() !== null\n || this.openMenuBarItemId() !== null\n || this.groupActionsMenu() !== null\n || this.filterMenu() !== null;\n if (!hadOpenMenu) return false;\n this.rowController.closeContextMenu();\n this.rowController.closeCellContextMenu();\n this.closeMenuBarMenu();\n this.groupController.closeActionsMenu();\n this.columnMenuController.close();\n return true;\n }\n\n /** @internal Resolves a menu-bar state callback against the current grid state. */\n resolveMenuBarState(state: AgridMenuBarState<T> | undefined, fallback: boolean): boolean {\n if (typeof state === 'function') return state(this.menuBarContext());\n return state ?? fallback;\n }\n\n /** @internal Whether a menu-bar button or dropdown item should be rendered. */\n isMenuBarItemVisible(item: AgridMenuBarMenuItem<T>): boolean {\n return this.resolveMenuBarState(item.visible, true);\n }\n\n /** @internal Whether a menu-bar button or dropdown item is active. */\n isMenuBarItemActive(item: AgridMenuBarMenuItem<T>): boolean {\n return this.resolveMenuBarState(item.active, false);\n }\n\n /** @internal Whether a menu-bar button or dropdown item is disabled. */\n isMenuBarItemDisabled(item: AgridMenuBarMenuItem<T>): boolean {\n return this.resolveMenuBarState(item.disabled, false);\n }\n\n /** @internal Visible dropdown entries for a menu-bar button. */\n visibleMenuBarChildren(item: AgridMenuBarItem<T>): AgridMenuBarMenuItem<T>[] {\n return (item.items ?? []).filter(child => this.isMenuBarItemVisible(child));\n }\n\n /** @internal Emits one menu-bar action and closes its dropdown. */\n runMenuBarAction(event: Event, item: AgridMenuBarMenuItem<T>): void {\n event.stopPropagation();\n if (!this.isMenuBarItemVisible(item) || this.isMenuBarItemDisabled(item)) return;\n this.menuBarAction.emit(item.id);\n this.closeMenuBarMenu();\n }\n\n /** @internal Opens or closes a split button's additional command menu. */\n toggleMenuBarMenu(event: Event, item: AgridMenuBarItem<T>): void {\n event.preventDefault();\n event.stopPropagation();\n if (this.visibleMenuBarChildren(item).length === 0) return;\n this.rowController.closeContextMenu();\n this.rowController.closeCellContextMenu();\n this.groupController.closeActionsMenu();\n this.columnMenuController.close();\n this.openMenuBarItemId.update(id => id === item.id ? null : item.id);\n }\n\n /** @internal Opens a dropdown from the keyboard and focuses its first/last enabled item. */\n onMenuBarTriggerKeydown(event: KeyboardEvent, item: AgridMenuBarItem<T>): void {\n if (event.key !== 'ArrowDown' && event.key !== 'ArrowUp') return;\n event.preventDefault();\n event.stopPropagation();\n if (this.visibleMenuBarChildren(item).length === 0) return;\n this.openMenuBarItemId.set(item.id);\n const group = (event.currentTarget as HTMLElement).closest('.ag-menu-bar-group');\n setTimeout(() => {\n const enabled = group?.querySelectorAll<HTMLButtonElement>(\n '.ag-menu-bar-dropdown [role=\"menuitem\"]:not(:disabled)',\n );\n const target = event.key === 'ArrowUp' ? enabled?.[enabled.length - 1] : enabled?.[0];\n target?.focus();\n });\n }\n\n /** @internal Provides standard keyboard navigation within an open menu-bar dropdown. */\n onMenuBarMenuKeydown(event: KeyboardEvent): void {\n const menu = event.currentTarget as HTMLElement;\n const items = Array.from(menu.querySelectorAll<HTMLButtonElement>(\n '[role=\"menuitem\"]:not(:disabled)',\n ));\n if (event.key === 'Escape') {\n event.preventDefault();\n event.stopPropagation();\n this.closeMenuBarMenu();\n menu.closest('.ag-menu-bar-group')\n ?.querySelector<HTMLButtonElement>('.ag-menu-bar-trigger')\n ?.focus();\n return;\n }\n if (!['ArrowDown', 'ArrowUp', 'Home', 'End'].includes(event.key) || items.length === 0) return;\n event.preventDefault();\n event.stopPropagation();\n const current = items.indexOf(event.target as HTMLButtonElement);\n const next = event.key === 'Home'\n ? 0\n : event.key === 'End'\n ? items.length - 1\n : event.key === 'ArrowDown'\n ? (current + 1 + items.length) % items.length\n : (current - 1 + items.length) % items.length;\n items[next].focus();\n }\n\n /** @internal Closes the currently open menu-bar dropdown. */\n closeMenuBarMenu(): void {\n this.openMenuBarItemId.set(null);\n }\n\n /** @internal Synchronizes dropdown state and closes competing grid menus when one opens. */\n onMenuBarOpenItemChange(id: string | null): void {\n if (id !== null) {\n this.rowController.closeContextMenu();\n this.rowController.closeCellContextMenu();\n this.groupController.closeActionsMenu();\n this.columnMenuController.close();\n }\n this.openMenuBarItemId.set(id);\n }\n\n /** @internal Runs a typed provider context-menu action against erased controller state. */\n runCellMenuItem(item: CellContextMenuItem<T>, menu: AgridCellContextMenu): void {\n item.action({\n value: menu.value as T[AgridField<T>],\n row: menu.row as unknown as T,\n field: menu.field as AgridField<T>,\n originalIndex: menu.rowIndex,\n });\n this.closeCellContextMenu();\n }\n\n /** @internal Copy one field from the target and marked rows. */\n copyCellToClipboard(originalIndex: number, col: ColDef): void {\n this.rowController.copyCellToClipboard(originalIndex, col);\n }\n\n /** @internal Copy the target and marked rows using all visible fields. */\n copyRowToClipboard(originalIndex: number): void {\n this.rowController.copyRowToClipboard(originalIndex);\n }\n\n /** @internal Insert a blank row at a specific position and emit prepareAddRecord. */\n insertRowAt(atIndex: number): void {\n this.rowController.insertRowAt(atIndex);\n }\n\n /** Start confirmation or immediately delete the row at `originalIndex`. */\n deleteRow(originalIndex: number): void {\n if (this.confirmRowDelete()) {\n this.updateDeleteConfirmationPosition();\n this.pendingDeleteRow.set(originalIndex);\n this.rowController.closeContextMenu();\n this.rowController.closeCellContextMenu();\n this.browser.schedule(() => {\n (this._hostEl.nativeElement as HTMLElement)\n .querySelector<HTMLButtonElement>('[data-delete-confirm-no]')\n ?.focus();\n });\n return;\n }\n this.deleteRowImmediately(originalIndex);\n }\n\n /** @internal Returns whether this row is awaiting delete confirmation. */\n isRowPendingDelete(originalIndex: number): boolean {\n return this.pendingDeleteRow() === originalIndex;\n }\n\n /** @internal Delete the row currently awaiting confirmation. */\n confirmPendingRowDelete(): void {\n const originalIndex = this.pendingDeleteRow();\n if (originalIndex === null) return;\n this.pendingDeleteRow.set(null);\n this.deleteRowImmediately(originalIndex);\n }\n\n /** @internal Cancel the active row-delete confirmation. */\n cancelRowDelete(): void {\n this.pendingDeleteRow.set(null);\n this.wrapperEl().nativeElement.focus();\n }\n\n private deleteRowImmediately(originalIndex: number): void {\n this.rowController.deleteRow(originalIndex);\n this.rowController.closeCellContextMenu();\n }\n\n private updateDeleteConfirmationPosition(): void {\n const scroller = this.horizontalScrollerEl().nativeElement;\n this.deleteConfirmationLeft.set(scroller.scrollLeft);\n this.deleteConfirmationWidth.set(scroller.clientWidth);\n }\n\n // ── Group expand / collapse ───────────────────────────────────────────────────\n\n /** @internal */\n onGroupHeaderClick(label: string): void {\n this.groupController.toggle(label);\n }\n\n /** Expand all groups. No-op when grouping is not active. */\n expandGroups(): void {\n this.groupController.expandAll(this.filteredItems());\n }\n\n /** Collapse all groups. No-op when grouping is not active. */\n collapseGroups(): void {\n this.groupController.collapseAll();\n }\n\n /** @internal */\n getGroupDescription(label: string): string {\n return this.groupController.getDescription(label);\n }\n\n /** @internal */\n openGroupActionsMenu(event: MouseEvent, label: string): void {\n this.groupController.openActionsMenu(event, label);\n }\n\n /** @internal */\n closeGroupActionsMenu(): void { this.groupController.closeActionsMenu(); }\n\n /** @internal */\n onGroupAction(action: GroupAction, label: string): void {\n this.groupController.runAction(action, label);\n }\n\n // ── Filter row & menu ─────────────────────────────────────────────────────────\n\n /** @internal */\n onTextFilterChange(event: Event, field: string): void {\n this.columnMenuController.onTextFilterChange(event, field);\n }\n\n /** @internal */\n openFilterMenu(event: MouseEvent, field: string): void {\n this.columnMenuController.open(event, field);\n }\n\n /** @internal */\n closeFilterMenu(): void { this.columnMenuController.close(); }\n\n /** @internal */\n onFilterMenuSearch(value: string): void {\n this.columnMenuController.setSearch(value);\n }\n\n /** @internal */\n onMenuSort(field: string, dir: 'asc' | 'desc'): void {\n this.columnMenuController.sort(field, dir);\n }\n\n /** @internal */\n onMenuClearFilter(field: string): void {\n this.columnMenuController.clearFilter(field);\n }\n\n /** @internal */\n /** @internal Replace the entire sort stack with a single sort on this column. */\n onMenuResetSort(field: string, dir: 'asc' | 'desc'): void {\n this.columnMenuController.resetSort(field, dir);\n }\n\n onMenuToggleGroupBy(field: string): void {\n this.columnMenuController.toggleGroupBy(field);\n }\n\n /** @internal */\n onMenuClearAll(): void {\n this.columnMenuController.clearAll();\n }\n\n /** @internal */\n onMenuToggleAll(field: string): void {\n this.columnMenuController.toggleAll(field);\n }\n\n /** @internal */\n onMenuToggleValue(field: string, rawStr: string): void {\n this.columnMenuController.toggleValue(field, rawStr);\n }\n\n /** @internal */\n onSidebarToggleColumn(field: string): void {\n this.columnMenuController.toggleColumnVisibility(field);\n }\n\n /** @internal Sets every column in a sidebar header group to the requested visibility. */\n onSidebarToggleColumnGroup(fields: string[], visible: boolean): void {\n this.columnMenuController.setColumnsVisibility(fields, visible);\n }\n\n /** @internal Mirrors vertical scrolling from the main viewport into both pinned panes. */\n onBodyScroll(): void {\n const offset = this.viewport().measureScrollOffset();\n this.pinnedViewport()?.scrollToOffset(offset);\n this.rightPinnedViewport()?.scrollToOffset(offset);\n }\n\n /** @internal Keeps the row-delete prompt visible while columns scroll horizontally. */\n onHorizontalScroll(): void {\n this.updateDeleteConfirmationPosition();\n }\n\n /** @internal */\n onRightPinnedBodyScroll(): void {\n const right = this.rightPinnedViewport();\n if (!right) return;\n const offset = right.measureScrollOffset();\n if (Math.abs(offset - this.viewport().measureScrollOffset()) < 1) return;\n this.viewport().scrollToOffset(offset);\n this.pinnedViewport()?.scrollToOffset(offset);\n }\n\n /** @internal */\n onMenuTogglePin(field: string): void {\n this.columnMenuController.togglePin(field);\n }\n\n /** @internal */\n onMenuTogglePinRight(field: string): void {\n this.columnMenuController.togglePinRight(field);\n }\n\n /** @internal */\n onMenuAutosizeColumn(field: string): void {\n this.columnMenuController.autosize(field);\n }\n\n /** @internal */\n onMenuSetAggregate(field: string, agg: 'sum' | 'avg' | 'min' | 'max' | 'count' | null): void {\n this.columnMenuController.setAggregate(field, agg);\n }\n\n /** @internal */\n onMenuHideColumn(field: string): void {\n this.columnMenuController.hideColumn(field);\n }\n\n // ── Private helpers ───────────────────────────────────────────────────────────\n\n private findDisplayIndex(originalIndex: number): number {\n return this.navigationController.findDisplayIndex(originalIndex);\n }\n\n private reconcileMarkedRowsAfterInsertion(insertedIndex: number): void {\n if (this.markedIndices().size === 0) return;\n this.markedIndices.update(indices => new Set(\n [...indices].map(index => index >= insertedIndex ? index + 1 : index)\n ));\n }\n\n private reconcileMarkedRowsAfterRemoval(removedIndex: number): void {\n if (this.markedIndices().size === 0) return;\n this.markedIndices.update(indices => new Set(\n [...indices]\n .filter(index => index !== removedIndex)\n .map(index => index > removedIndex ? index - 1 : index)\n ));\n }\n\n private reconcileMarkedRowsAfterMove(oldIndex: number, newIndex: number): void {\n if (this.markedIndices().size === 0 || oldIndex === newIndex) return;\n const destination = newIndex > oldIndex ? newIndex - 1 : newIndex;\n this.markedIndices.update(indices => new Set([...indices].map(index => {\n if (index === oldIndex) return destination;\n if (oldIndex < destination && index > oldIndex && index <= destination) return index - 1;\n if (destination < oldIndex && index >= destination && index < oldIndex) return index + 1;\n return index;\n })));\n }\n\n private isCellEditable(col: ColDef, originalIndex?: number): boolean {\n return this.editController.isCellEditable(col, originalIndex);\n }\n\n private enterEdit(originalIndex: number, ci: number, seedChar: string, selectText = true): void {\n this.editController.start(originalIndex, ci, seedChar, selectText);\n }\n\n private cancelCurrent(): void {\n this.editController.cancel();\n }\n\n /** @internal */\n isRangeSelected(originalIndex: number, colIndex: number): boolean {\n return this.rangeController.isRangeSelected(originalIndex, colIndex);\n }\n\n /** @internal */\n isFindMatchCell(originalIndex: number, colIndex: number): boolean {\n return this.findController.isMatchCell(originalIndex, colIndex);\n }\n\n /** @internal */\n isActiveFindMatchCell(originalIndex: number, colIndex: number): boolean {\n return this.findController.isActiveMatchCell(originalIndex, colIndex);\n }\n\n /** @internal */\n isFillHandleCell(originalIndex: number, colIndex: number): boolean {\n return this.rangeController.isFillHandleCell(originalIndex, colIndex);\n }\n\n /** @internal */\n isFillPreviewCell(originalIndex: number, colIndex: number): boolean {\n return this.rangeController.isFillPreviewCell(originalIndex, colIndex);\n }\n\n private scrollToKeepVisible(displayIndex: number, colIndex: number | null = null): void {\n this.navigationController.scrollToKeepVisible(displayIndex, colIndex);\n }\n\n /** @internal Current rendered width for a column. */\n getColumnWidth(col: ColDef): number {\n return this.columnSizing.getWidth(col);\n }\n\n private getColumnWidthToken(col: ColDef): string {\n return this.columnSizing.getWidthToken(col);\n }\n\n}\n","<div #wrapper class=\"ag-wrapper\" tabindex=\"0\" role=\"grid\" [attr.aria-label]=\"localeText().grid\"\n [attr.aria-rowcount]=\"ariaRowCount()\" [attr.aria-colcount]=\"ariaColCount()\"\n [attr.aria-multiselectable]=\"rowSelection() === 'multi' ? 'true' : null\"\n [attr.aria-readonly]=\"readonlyGrid() ? 'true' : null\" [attr.aria-busy]=\"loading() ? 'true' : null\"\n (copy)=\"onCopy($event)\" (paste)=\"onPaste($event)\" (focusin)=\"onGridFocusIn($event)\"\n (click)=\"closeContextMenu(); closeCellContextMenu(); closeFilterMenu(); closeGroupActionsMenu(); closeMenuBarMenu()\">\n @if (visibleMenuBarItems().length > 0 || enableQuickFilter()) {\n <div class=\"ag-toolbar\">\n @if (visibleMenuBarItems().length > 0) {\n <agrid-menu-bar [items]=\"visibleMenuBarItems()\" [context]=\"menuBarContext()\"\n [label]=\"localeText().actions\" [openItemId]=\"openMenuBarItemId()\"\n (openItemIdChange)=\"onMenuBarOpenItemChange($event)\" (action)=\"menuBarAction.emit($event)\" />\n }\n @if (enableQuickFilter()) {\n <input class=\"ag-quick-filter\" type=\"search\" [value]=\"quickFilterValue()\" (input)=\"onQuickFilterInput($event)\"\n [placeholder]=\"localeText().quickFilterPlaceholder\" [attr.aria-label]=\"localeText().quickFilterPlaceholder\" />\n }\n </div>\n }\n <div class=\"ag-main-area\">\n <div class=\"ag-grid-split\" [class.ag-has-right-pane]=\"hasRightPinnedPane()\">\n @if (hasPinnedPane()) {\n <div class=\"ag-pinned-pane\" [style.width.px]=\"pinnedPaneWidth()\">\n @if (hasHeaderGroups()) {\n <div class=\"ag-header-groups ag-header-groups--pinned\" role=\"row\" aria-rowindex=\"1\"\n [style.grid-template-columns]=\"pinnedGridTemplateColumns()\" [style.width.px]=\"pinnedPaneWidth()\">\n @if (showControlColumn()) {\n <div class=\"ag-header-group-cell ag-header-group-cell--empty\"></div>\n }\n @for (run of pinnedHeaderGroupRuns(); track run.key) {\n <div class=\"ag-header-group-cell\" role=\"columnheader\" [attr.data-header-group]=\"run.id\"\n [class.ag-header-group-cell--empty]=\"!run.id\"\n [class.ag-header-group-cell--locked]=\"isHeaderGroupLocked(run.fields)\"\n [class.ag-header-group-cell--dragging]=\"isHeaderGroupDragging(run.fields)\"\n [style.grid-column]=\"'span ' + run.span\"\n (pointerdown)=\"run.id && onHeaderGroupPointerDown($event, run.fields, run.label)\">\n {{ run.label }}\n </div>\n }\n </div>\n }\n <div class=\"ag-header ag-header--pinned\" role=\"row\" [attr.aria-rowindex]=\"headerRowCount()\"\n [class.ag-header--with-filters]=\"hasFilterableColumns()\"\n [style.grid-template-columns]=\"pinnedGridTemplateColumns()\" [style.width.px]=\"pinnedPaneWidth()\">\n @if (showControlColumn()) {\n <div class=\"ag-header-cell ag-control-header\" role=\"columnheader\" aria-colindex=\"1\">\n <div class=\"ag-header-cell-top\"></div>\n @if (hasFilterableColumns()) {\n <div class=\"ag-header-cell-filter\"></div>\n }\n </div>\n }\n @for (col of pinnedColDefs(); track col.field) {\n <div class=\"ag-header-cell ag-header-cell--pinned\" role=\"columnheader\"\n [attr.aria-colindex]=\"getAriaColIndex(getVisibleColIndex(col.field))\"\n [attr.aria-sort]=\"getSort(col.field) === 'asc' ? 'ascending' : getSort(col.field) === 'desc' ? 'descending' : 'none'\"\n [class.ag-header-cell--filtered]=\"hasActiveFilter(col.field)\"\n [class.ag-header-cell--dragging]=\"isColDragging(col.field)\"\n [class.ag-header-cell--drop-before]=\"getColDropSide(col.field) === 'before'\"\n [class.ag-header-cell--drop-after]=\"getColDropSide(col.field) === 'after'\"\n [style.transform]=\"'translateX(' + getColReorderOffset(col.field) + 'px)'\"\n [class.ag-header-cell--pinned-last]=\"isLastPinnedColumn(col.field)\" [attr.data-col-field]=\"col.field\"\n (pointerdown)=\"onColHeaderPointerDown($event, col.field)\">\n <div class=\"ag-header-cell-top\">\n <span class=\"ag-header-cell-label\">{{ col.header }}</span>\n @if (getSort(col.field); as dir) {\n <span class=\"ag-sort-badge\">{{ dir === 'asc' ? '↑' : '↓' }}@if (hasMultiSort()) {<sup\n class=\"ag-sort-priority\">{{ getSortPriority(col.field) }}</sup>}</span>\n }\n <button class=\"ag-header-menu-btn\" [class.ag-header-menu-btn--active]=\"hasActiveFilter(col.field)\"\n [title]=\"localeText().columnMenu\" [attr.aria-label]=\"localeText().columnMenu + ': ' + col.header\"\n [attr.aria-expanded]=\"filterMenu()?.field === col.field\" aria-haspopup=\"menu\"\n (click)=\"openFilterMenu($event, col.field)\" (pointerdown)=\"$event.stopPropagation()\">▾</button>\n </div>\n @if (hasFilterableColumns()) {\n <div class=\"ag-header-cell-filter\">\n @if (col.filterable) {\n <input class=\"ag-filter-input\" [value]=\"getTextFilter(col.field)\"\n (input)=\"onTextFilterChange($event, col.field)\" (click)=\"$event.stopPropagation()\"\n [placeholder]=\"localeText().filterPlaceholder\"\n [attr.aria-label]=\"localeText().filterPlaceholder + ' ' + col.header\" />\n @if (getMenuFilterType(col.field)) {\n <button type=\"button\" class=\"ag-filter-condition-btn\"\n [class.ag-filter-condition-btn--active]=\"!!getMenuOperator(col.field)\"\n [title]=\"localeText().filterConditionMenu\"\n [attr.aria-label]=\"localeText().filterConditionMenu + ': ' + col.header\"\n [attr.aria-expanded]=\"filterMenu()?.field === col.field\"\n (click)=\"openFilterMenu($event, col.field)\"\n (pointerdown)=\"$event.stopPropagation()\">{{ getConditionButtonLabel(col.field) }}</button>\n }\n }\n </div>\n }\n <div class=\"ag-resize-handle\" role=\"separator\" [attr.tabindex]=\"col.locked ? -1 : 0\"\n aria-orientation=\"vertical\" [attr.aria-disabled]=\"col.locked ? 'true' : null\"\n [attr.aria-label]=\"localeText().resizeColumn + ': ' + col.header\"\n [attr.aria-valuenow]=\"getColumnWidth(col)\" (keydown)=\"onResizeKeyDown($event, col)\"\n (mousedown)=\"onResizeStart($event, col)\" (pointerdown)=\"$event.stopPropagation()\"\n (dblclick)=\"onAutosizeColumn($event, col)\"></div>\n </div>\n }\n </div>\n\n <ng-template #leftRow let-item let-ariaIndex=\"ariaIndex\">\n <div role=\"row\" [attr.aria-rowindex]=\"ariaIndex\"\n [attr.data-control]=\"true\"\n [attr.aria-selected]=\"isDataRowItem(item) && isRowSelected(item.originalIndex) ? 'true' : null\"\n [class.ag-row]=\"!isGroupHeaderItem(item) && !isDetailRowItem(item)\" [class.ag-add-row]=\"item === null\"\n [class.ag-add-row--selected]=\"item === null && isAddRowSelected()\" [class.ag-ghost-row]=\"item === 'ghost'\"\n [class.ag-group-header-row]=\"isGroupHeaderItem(item)\" [class.ag-detail-row]=\"isDetailRowItem(item)\"\n [class.ag-row--odd]=\"isDataRowItem(item) && dataRowIsOdd().get(item.originalIndex) === true\"\n [class.ag-row--selected]=\"isPinnedPaneRowSelected(item)\"\n [class.ag-row--marked]=\"isDataRowItem(item) && isRowMarked(item.originalIndex)\"\n [class.ag-row--pending-delete]=\"isDataRowItem(item) && isRowPendingDelete(item.originalIndex)\"\n [class]=\"isDataRowItem(item) ? getRowClass(item.row, item.originalIndex) : ''\"\n [attr.data-original-index]=\"getItemOriginalIndex(item)\" [style.height.px]=\"rowPx(item)\"\n [style.grid-template-columns]=\"isDataRowItem(item) || item === 'ghost' ? pinnedGridTemplateColumns() : null\"\n (pointerdown)=\"isDataRowItem(item) && onRowPointerDown($event, item.originalIndex)\"\n (click)=\"isDataRowItem(item) && onRowClick($event, item)\">\n @if (isDataRowItem(item)) {\n @if (showControlColumn()) {\n <div class=\"ag-control-cell\" role=\"rowheader\" aria-colindex=\"1\"\n [class.ag-control-cell--reorder]=\"allowRowReorder()\"\n (contextmenu)=\"onControlContextMenu($event, item.originalIndex)\" (click)=\"$event.stopPropagation()\"\n (pointerdown)=\"onControlPointerDown($event, item.originalIndex)\">\n @if (canToggleDetail(item)) {\n <button class=\"ag-detail-toggle\" type=\"button\"\n [class.ag-detail-toggle--expanded]=\"isDetailExpanded(item.originalIndex)\"\n [attr.aria-expanded]=\"isDetailExpanded(item.originalIndex)\"\n [attr.aria-label]=\"localeText().toggleDetail\" (pointerdown)=\"$event.stopPropagation()\"\n (click)=\"onDetailToggle(item.originalIndex); $event.stopPropagation()\">▶</button>\n }\n @if (enableRowMarking()) {\n <input class=\"ag-row-marker\" type=\"checkbox\" [checked]=\"isRowMarked(item.originalIndex)\"\n [attr.aria-label]=\"localeText().markRow\" (pointerdown)=\"$event.stopPropagation()\"\n (click)=\"$event.stopPropagation()\" (change)=\"toggleRowMarked(item.originalIndex)\" />\n }\n </div>\n }\n @for (col of pinnedColDefs(); track col.field) {\n @let ci = getVisibleColIndex(col.field);\n <agrid-cell [col]=\"col\" [rowIndex]=\"item.originalIndex\" [colIndex]=\"ci\" [value]=\"item.row[col.field]\"\n [displayValueOverride]=\"treeCellDisplayOverride(item, col)\"\n [row]=\"item.row\" [locale]=\"locale()\" [attr.data-cell-row]=\"item.originalIndex\" [attr.data-cell-col]=\"ci\"\n [attr.data-col-field]=\"col.field\" [attr.aria-colindex]=\"getAriaColIndex(ci)\"\n [attr.aria-selected]=\"isSelected(item.originalIndex, ci) || isRangeSelected(item.originalIndex, ci)\"\n [selected]=\"isSelected(item.originalIndex, ci)\" [editing]=\"isEditing(item.originalIndex, ci)\"\n [editable]=\"isColEditable(col, item.originalIndex)\" [error]=\"cellValidationError(item.originalIndex, ci)\"\n [showInfoIcon]=\"showCellInfoIcon(col, item.row)\"\n [seedChar]=\"getSeedChar(item.originalIndex, ci)\" [selectTextOnEdit]=\"selectTextOnEdit()\"\n [treeCell]=\"isTreeCell(col)\"\n [treeLevel]=\"treeRowLevel(item)\" [treeExpandable]=\"treeRowExpandable(item)\"\n [treeExpanded]=\"treeRowExpanded(item)\"\n [class.ag-cell--range-selected]=\"isRangeSelected(item.originalIndex, ci)\"\n [class.ag-cell--fill-preview]=\"isFillPreviewCell(item.originalIndex, ci)\"\n [class.ag-cell--fill-handle]=\"isFillHandleCell(item.originalIndex, ci)\"\n [class.ag-cell--find-match]=\"isFindMatchCell(item.originalIndex, ci)\"\n [class.ag-cell--find-active]=\"isActiveFindMatchCell(item.originalIndex, ci)\"\n [class.ag-cell--changed]=\"isCellChanged(item.originalIndex, col.field)\"\n [class.ag-column-reorder-item--dragging]=\"isColDragging(col.field)\"\n [style.transform]=\"'translateX(' + getColReorderOffset(col.field) + 'px)'\"\n [class]=\"getCellClass(col, item.row[col.field], item.row)\" [class.ag-cell--pinned]=\"true\"\n [class.ag-cell--pinned-last]=\"isLastPinnedColumn(col.field)\"\n (pointerdown)=\"onCellPointerDown($event, item.originalIndex, ci)\"\n (activate)=\"onActivate(item.originalIndex, ci, $event)\" (startEdit)=\"onStartEdit(item.originalIndex, ci)\"\n (draftChange)=\"onDraftChange($event)\" (booleanToggle)=\"onBooleanToggle(item.originalIndex, ci, $event)\"\n (infoClick)=\"onCellInfo(item.originalIndex, col, item.row)\"\n (treeToggle)=\"onTreeToggle(item)\"\n (contextmenu)=\"onCellContextMenu($event, item.originalIndex, ci, col, item.row)\" />\n }\n } @else if (item === null) {\n <div class=\"ag-pinned-row-spacer\"></div>\n } @else if (item === 'ghost') {\n @if (showControlColumn()) {\n <div class=\"ag-control-cell ag-control-cell--reorder ag-ghost-handle\"></div>\n }\n @for (col of pinnedColDefs(); track col.field) {\n <div class=\"ag-ghost-cell ag-cell--pinned\"\n [class.ag-column-reorder-item--dragging]=\"isColDragging(col.field)\"\n [style.transform]=\"'translateX(' + getColReorderOffset(col.field) + 'px)'\"\n [class.ag-cell--pinned-last]=\"isLastPinnedColumn(col.field)\">{{\n getGhostCellDisplay(col) }}</div>\n }\n } @else {\n <div class=\"ag-pinned-row-spacer\"></div>\n }\n </div>\n </ng-template>\n\n @if (hasPinnedTopRows()) {\n <div class=\"ag-pinned-rows ag-pinned-rows--top ag-pinned-body\" [style.width.px]=\"pinnedPaneWidth()\">\n @for (item of pinnedTopItems(); track item.originalIndex) {\n <ng-container [ngTemplateOutlet]=\"leftRow\"\n [ngTemplateOutletContext]=\"{ $implicit: item, ariaIndex: headerRowCount() + 1 + $index }\" />\n }\n </div>\n }\n\n <cdk-virtual-scroll-viewport #pinnedViewport class=\"ag-body ag-pinned-body\" [agridVariableRowSize]=\"itemSizes()\"\n [style.width.px]=\"pinnedPaneWidth()\">\n <ng-container *cdkVirtualFor=\"let item of displayItems(); let di = index; trackBy: trackByItem\">\n <ng-container [ngTemplateOutlet]=\"leftRow\"\n [ngTemplateOutletContext]=\"{ $implicit: item, ariaIndex: di + headerRowCount() + 1 + pinnedTopItems().length }\" />\n </ng-container>\n </cdk-virtual-scroll-viewport>\n\n @if (hasPinnedBottomRows()) {\n <div class=\"ag-pinned-rows ag-pinned-rows--bottom ag-pinned-body\" [style.width.px]=\"pinnedPaneWidth()\">\n @for (item of pinnedBottomItems(); track item.originalIndex) {\n <ng-container [ngTemplateOutlet]=\"leftRow\"\n [ngTemplateOutletContext]=\"{ $implicit: item, ariaIndex: headerRowCount() + 1 + pinnedTopItems().length + displayItems().length + $index }\" />\n }\n </div>\n }\n\n @if (showFooter()) {\n <div class=\"ag-footer\" role=\"row\" [attr.aria-rowindex]=\"displayItems().length + headerRowCount() + 1\"\n [style.grid-template-columns]=\"pinnedGridTemplateColumns()\">\n @if (showControlColumn()) {\n <div class=\"ag-footer-cell ag-footer-cell--control\" role=\"gridcell\" aria-colindex=\"1\"></div>\n }\n @for (col of pinnedColDefs(); track col.field) {\n <div class=\"ag-footer-cell\" role=\"gridcell\"\n [class.ag-column-reorder-item--dragging]=\"isColDragging(col.field)\"\n [style.transform]=\"'translateX(' + getColReorderOffset(col.field) + 'px)'\"\n [attr.aria-colindex]=\"getAriaColIndex(getVisibleColIndex(col.field))\"\n [class.ag-footer-cell--pinned-last]=\"isLastPinnedColumn(col.field)\">\n @if (hasAggregate(col)) {\n <span class=\"ag-footer-label\">{{ getAggregateLabel(col) }}</span>\n {{ getFooterDisplay(col, footerValues()[col.field]) }}\n }\n </div>\n }\n </div>\n }\n </div>\n }\n\n <div class=\"ag-scroll-pane\">\n <div #horizontalScroller class=\"ag-horizontal-scroll\" (scroll)=\"onHorizontalScroll()\">\n @if (hasHeaderGroups()) {\n <div class=\"ag-header-groups\" role=\"row\" aria-rowindex=\"1\"\n [style.grid-template-columns]=\"scrollableGridTemplateColumns()\"\n [style.min-width.px]=\"scrollableTotalWidth()\">\n @for (run of scrollableHeaderGroupRuns(); track run.key) {\n <div class=\"ag-header-group-cell\" role=\"columnheader\" [attr.data-header-group]=\"run.id\"\n [class.ag-header-group-cell--empty]=\"!run.id\"\n [class.ag-header-group-cell--locked]=\"isHeaderGroupLocked(run.fields)\"\n [class.ag-header-group-cell--dragging]=\"isHeaderGroupDragging(run.fields)\"\n [style.grid-column]=\"'span ' + run.span\"\n (pointerdown)=\"run.id && onHeaderGroupPointerDown($event, run.fields, run.label)\">\n {{ run.label }}\n </div>\n }\n </div>\n }\n <div class=\"ag-header\" role=\"row\" [attr.aria-rowindex]=\"headerRowCount()\"\n [class.ag-header--with-filters]=\"hasFilterableColumns()\"\n [style.grid-template-columns]=\"scrollableGridTemplateColumns()\"\n [style.min-width.px]=\"scrollableTotalWidth()\">\n @for (col of scrollableColDefs(); track col.field) {\n <div class=\"ag-header-cell\" role=\"columnheader\"\n [attr.aria-colindex]=\"getAriaColIndex(getVisibleColIndex(col.field))\"\n [attr.aria-sort]=\"getSort(col.field) === 'asc' ? 'ascending' : getSort(col.field) === 'desc' ? 'descending' : 'none'\"\n [class.ag-header-cell--filtered]=\"hasActiveFilter(col.field)\"\n [class.ag-header-cell--dragging]=\"isColDragging(col.field)\"\n [class.ag-header-cell--drop-before]=\"getColDropSide(col.field) === 'before'\"\n [class.ag-header-cell--drop-after]=\"getColDropSide(col.field) === 'after'\"\n [style.transform]=\"'translateX(' + getColReorderOffset(col.field) + 'px)'\"\n [attr.data-col-field]=\"col.field\" (pointerdown)=\"onColHeaderPointerDown($event, col.field)\">\n <div class=\"ag-header-cell-top\">\n <span class=\"ag-header-cell-label\">{{ col.header }}</span>\n @if (getSort(col.field); as dir) {\n <span class=\"ag-sort-badge\">{{ dir === 'asc' ? '↑' : '↓' }}@if (hasMultiSort()) {<sup\n class=\"ag-sort-priority\">{{ getSortPriority(col.field) }}</sup>}</span>\n }\n @if (isGroupedByField(col.field)) {\n <span class=\"ag-sort-badge\">⊟</span>\n }\n <button class=\"ag-header-menu-btn\" [class.ag-header-menu-btn--active]=\"hasActiveFilter(col.field)\"\n [title]=\"localeText().columnMenu\" [attr.aria-label]=\"localeText().columnMenu + ': ' + col.header\"\n [attr.aria-expanded]=\"filterMenu()?.field === col.field\" aria-haspopup=\"menu\"\n (click)=\"openFilterMenu($event, col.field)\" (pointerdown)=\"$event.stopPropagation()\">▾</button>\n </div>\n @if (hasFilterableColumns()) {\n <div class=\"ag-header-cell-filter\">\n @if (col.filterable) {\n <input class=\"ag-filter-input\" [value]=\"getTextFilter(col.field)\"\n (input)=\"onTextFilterChange($event, col.field)\" (click)=\"$event.stopPropagation()\"\n [placeholder]=\"localeText().filterPlaceholder\"\n [attr.aria-label]=\"localeText().filterPlaceholder + ' ' + col.header\" />\n @if (getMenuFilterType(col.field)) {\n <button type=\"button\" class=\"ag-filter-condition-btn\"\n [class.ag-filter-condition-btn--active]=\"!!getMenuOperator(col.field)\"\n [title]=\"localeText().filterConditionMenu\"\n [attr.aria-label]=\"localeText().filterConditionMenu + ': ' + col.header\"\n [attr.aria-expanded]=\"filterMenu()?.field === col.field\"\n (click)=\"openFilterMenu($event, col.field)\"\n (pointerdown)=\"$event.stopPropagation()\">{{ getConditionButtonLabel(col.field) }}</button>\n }\n }\n </div>\n }\n <div class=\"ag-resize-handle\" role=\"separator\" [attr.tabindex]=\"col.locked ? -1 : 0\"\n aria-orientation=\"vertical\" [attr.aria-disabled]=\"col.locked ? 'true' : null\"\n [attr.aria-label]=\"localeText().resizeColumn + ': ' + col.header\"\n [attr.aria-valuenow]=\"getColumnWidth(col)\" (keydown)=\"onResizeKeyDown($event, col)\"\n (mousedown)=\"onResizeStart($event, col)\" (pointerdown)=\"$event.stopPropagation()\"\n (dblclick)=\"onAutosizeColumn($event, col)\"></div>\n </div>\n }\n </div>\n\n <ng-template #bodyRow let-item let-ariaIndex=\"ariaIndex\">\n <div role=\"row\" [attr.aria-rowindex]=\"ariaIndex\"\n [attr.aria-selected]=\"isDataRowItem(item) && isRowSelected(item.originalIndex) ? 'true' : null\"\n [class.ag-row]=\"!isGroupHeaderItem(item) && !isDetailRowItem(item)\" [class.ag-add-row]=\"item === null\"\n [class.ag-add-row--selected]=\"item === null && isAddRowSelected()\" [class.ag-ghost-row]=\"item === 'ghost'\"\n [class.ag-group-header-row]=\"isGroupHeaderItem(item)\" [class.ag-detail-row]=\"isDetailRowItem(item)\"\n [class.ag-row--odd]=\"isDataRowItem(item) && dataRowIsOdd().get(item.originalIndex) === true\"\n [class.ag-row--selected]=\"isDataRowItem(item) && isRowSelected(item.originalIndex)\"\n [class.ag-row--marked]=\"isDataRowItem(item) && isRowMarked(item.originalIndex)\"\n [class.ag-row--pending-delete]=\"isDataRowItem(item) && isRowPendingDelete(item.originalIndex)\"\n [class]=\"isDataRowItem(item) ? getRowClass(item.row, item.originalIndex) : ''\"\n [attr.data-original-index]=\"getItemOriginalIndex(item)\" [style.height.px]=\"rowPx(item)\"\n [style.grid-template-columns]=\"isDataRowItem(item) || item === 'ghost' ? scrollableGridTemplateColumns() : null\"\n (pointerdown)=\"isDataRowItem(item) && onRowPointerDown($event, item.originalIndex)\"\n (click)=\"isDataRowItem(item) && onRowClick($event, item)\">\n @if (isDataRowItem(item)) {\n @for (col of scrollableColDefs(); track col.field) {\n @let ci = getVisibleColIndex(col.field);\n <agrid-cell [col]=\"col\" [rowIndex]=\"item.originalIndex\" [colIndex]=\"ci\" [value]=\"item.row[col.field]\"\n [displayValueOverride]=\"treeCellDisplayOverride(item, col)\"\n [row]=\"item.row\" [locale]=\"locale()\" [attr.data-cell-row]=\"item.originalIndex\" [attr.data-cell-col]=\"ci\"\n [attr.data-col-field]=\"col.field\" [attr.aria-colindex]=\"getAriaColIndex(ci)\"\n [attr.aria-selected]=\"isSelected(item.originalIndex, ci) || isRangeSelected(item.originalIndex, ci)\"\n [selected]=\"isSelected(item.originalIndex, ci)\" [editing]=\"isEditing(item.originalIndex, ci)\"\n [editable]=\"isColEditable(col, item.originalIndex)\" [error]=\"cellValidationError(item.originalIndex, ci)\"\n [showInfoIcon]=\"showCellInfoIcon(col, item.row)\"\n [seedChar]=\"getSeedChar(item.originalIndex, ci)\" [selectTextOnEdit]=\"selectTextOnEdit()\"\n [treeCell]=\"isTreeCell(col)\"\n [treeLevel]=\"treeRowLevel(item)\" [treeExpandable]=\"treeRowExpandable(item)\"\n [treeExpanded]=\"treeRowExpanded(item)\"\n [class.ag-cell--range-selected]=\"isRangeSelected(item.originalIndex, ci)\"\n [class.ag-cell--fill-preview]=\"isFillPreviewCell(item.originalIndex, ci)\"\n [class.ag-cell--fill-handle]=\"isFillHandleCell(item.originalIndex, ci)\"\n [class]=\"getCellClass(col, item.row[col.field], item.row)\"\n [class.ag-cell--changed]=\"isCellChanged(item.originalIndex, col.field)\"\n [class.ag-column-reorder-item--dragging]=\"isColDragging(col.field)\"\n [style.transform]=\"'translateX(' + getColReorderOffset(col.field) + 'px)'\"\n [class.ag-cell--find-match]=\"isFindMatchCell(item.originalIndex, ci)\"\n [class.ag-cell--find-active]=\"isActiveFindMatchCell(item.originalIndex, ci)\"\n (pointerdown)=\"onCellPointerDown($event, item.originalIndex, ci)\"\n (activate)=\"onActivate(item.originalIndex, ci, $event)\"\n (startEdit)=\"onStartEdit(item.originalIndex, ci)\" (draftChange)=\"onDraftChange($event)\"\n (booleanToggle)=\"onBooleanToggle(item.originalIndex, ci, $event)\" (treeToggle)=\"onTreeToggle(item)\"\n (infoClick)=\"onCellInfo(item.originalIndex, col, item.row)\"\n (contextmenu)=\"onCellContextMenu($event, item.originalIndex, ci, col, item.row)\" />\n }\n } @else if (item === null) {\n <div class=\"ag-add-row-label\" (click)=\"onActivateAddRow()\">\n <span class=\"ag-add-row-icon\">+</span> {{ localeText().addRow }}\n </div>\n } @else if (item === 'ghost') {\n @for (col of scrollableColDefs(); track col.field) {\n <div class=\"ag-ghost-cell\" [class.ag-column-reorder-item--dragging]=\"isColDragging(col.field)\"\n [style.transform]=\"'translateX(' + getColReorderOffset(col.field) + 'px)'\">{{\n getGhostCellDisplay(col) }}</div>\n }\n } @else if (isDetailRowItem(item)) {\n <div class=\"ag-detail-panel\" [style.height.px]=\"detailRowHeight()\"\n [style.min-width.px]=\"scrollableTotalWidth()\" [innerHTML]=\"detailHtml(item)\"></div>\n } @else if (isPathTreeNodeItem(item)) {\n <div class=\"ag-path-tree-content\" [style.min-width.px]=\"scrollableTotalWidth()\"\n [style.padding-left.px]=\"treeRowLevel(item) * 16 + 8\"\n (click)=\"onTreeNodeClick(item); $event.stopPropagation()\"\n (dblclick)=\"onTreeNodeDoubleClick(item); $event.stopPropagation()\">\n <button type=\"button\" class=\"ag-tree-twisty\"\n [class.ag-tree-twisty--expanded]=\"treeRowExpanded(item)\"\n [attr.aria-expanded]=\"treeRowExpanded(item)\"\n (click)=\"onTreeToggle(item); $event.stopPropagation()\">▶</button>\n <span>{{ pathTreeLabel(item) }}</span>\n </div>\n } @else {\n <div class=\"ag-group-header-content\" [style.min-width.px]=\"scrollableTotalWidth()\">\n <div class=\"ag-group-header-main\"\n (click)=\"onGroupHeaderClick(item.groupLabel); $event.stopPropagation()\">\n <span class=\"ag-group-icon\" [class.ag-group-icon--expanded]=\"!item.collapsed\">▶</span>\n <span class=\"ag-group-label\">{{ item.groupLabel }}</span>\n @if (groupActions().length > 0) {\n <button class=\"ag-group-actions-btn\" [title]=\"localeText().actions\"\n (click)=\"openGroupActionsMenu($event, item.groupLabel)\">⋮</button>\n }\n <span class=\"ag-group-count\">{{ item.count }}</span>\n @if (getGroupDescription(item.groupLabel); as desc) {\n <span class=\"ag-group-description\">{{ desc }}</span>\n }\n @if (item.aggregates; as aggs) {\n <span class=\"ag-group-aggregates\">\n @for (col of visibleColDefs(); track col.field) {\n @if (hasAggregate(col) && aggs[col.field] !== undefined) {\n <span class=\"ag-group-aggregate\">\n <span class=\"ag-group-aggregate-col\">{{ col.header }}</span>\n <span class=\"ag-group-aggregate-op\">{{ getAggregateLabel(col) }}</span>\n {{ getFooterDisplay(col, aggs[col.field]) }}\n </span>\n }\n }\n </span>\n }\n </div>\n </div>\n }\n @if (isDataRowItem(item) && isRowPendingDelete(item.originalIndex)) {\n <div class=\"ag-delete-confirmation\" role=\"alertdialog\" [attr.aria-label]=\"localeText().confirmDeleteRow\"\n [style.left.px]=\"deleteConfirmationLeft()\" [style.width.px]=\"deleteConfirmationWidth() || null\"\n (pointerdown)=\"$event.stopPropagation()\" (click)=\"$event.stopPropagation()\">\n <span class=\"ag-delete-confirmation-text\">{{ localeText().confirmDeleteRow }}</span>\n <button class=\"ag-delete-confirmation-btn ag-delete-confirmation-btn--yes\" type=\"button\"\n (click)=\"confirmPendingRowDelete()\">{{ localeText().confirmYes }}</button>\n <button class=\"ag-delete-confirmation-btn\" type=\"button\" data-delete-confirm-no\n (click)=\"cancelRowDelete()\">{{ localeText().confirmNo }}</button>\n </div>\n }\n </div>\n </ng-template>\n\n @if (hasPinnedTopRows()) {\n <div class=\"ag-pinned-rows ag-pinned-rows--top\" [style.min-width.px]=\"scrollableTotalWidth()\">\n @for (item of pinnedTopItems(); track item.originalIndex) {\n <ng-container [ngTemplateOutlet]=\"bodyRow\"\n [ngTemplateOutletContext]=\"{ $implicit: item, ariaIndex: headerRowCount() + 1 + $index }\" />\n }\n </div>\n }\n\n <cdk-virtual-scroll-viewport #scrollViewport class=\"ag-body\" [agridVariableRowSize]=\"itemSizes()\"\n [style.min-width.px]=\"scrollableTotalWidth()\" (scroll)=\"onBodyScroll()\">\n <ng-container *cdkVirtualFor=\"let item of displayItems(); let di = index; trackBy: trackByItem\">\n <ng-container [ngTemplateOutlet]=\"bodyRow\"\n [ngTemplateOutletContext]=\"{ $implicit: item, ariaIndex: di + headerRowCount() + 1 + pinnedTopItems().length }\" />\n </ng-container>\n </cdk-virtual-scroll-viewport>\n\n @if (hasPinnedBottomRows()) {\n <div class=\"ag-pinned-rows ag-pinned-rows--bottom\" [style.min-width.px]=\"scrollableTotalWidth()\">\n @for (item of pinnedBottomItems(); track item.originalIndex) {\n <ng-container [ngTemplateOutlet]=\"bodyRow\"\n [ngTemplateOutletContext]=\"{ $implicit: item, ariaIndex: headerRowCount() + 1 + pinnedTopItems().length + displayItems().length + $index }\" />\n }\n </div>\n }\n\n @if (showFooter()) {\n <div class=\"ag-footer\" role=\"row\" [attr.aria-rowindex]=\"displayItems().length + headerRowCount() + 1\"\n [style.grid-template-columns]=\"scrollableGridTemplateColumns()\"\n [style.min-width.px]=\"scrollableTotalWidth()\">\n @for (col of scrollableColDefs(); track col.field) {\n <div class=\"ag-footer-cell\" role=\"gridcell\"\n [class.ag-column-reorder-item--dragging]=\"isColDragging(col.field)\"\n [style.transform]=\"'translateX(' + getColReorderOffset(col.field) + 'px)'\"\n [attr.aria-colindex]=\"getAriaColIndex(getVisibleColIndex(col.field))\">\n @if (hasAggregate(col)) {\n <span class=\"ag-footer-label\">{{ getAggregateLabel(col) }}</span>\n {{ getFooterDisplay(col, footerValues()[col.field]) }}\n }\n </div>\n }\n </div>\n }\n </div>\n </div>\n\n @if (hasRightPinnedPane()) {\n <div class=\"ag-pinned-pane ag-pinned-pane--right\" [style.width.px]=\"rightPinnedPaneWidth()\">\n @if (hasHeaderGroups()) {\n <div class=\"ag-header-groups\" role=\"row\" aria-rowindex=\"1\"\n [style.grid-template-columns]=\"rightGridTemplateColumns()\" [style.width.px]=\"rightPinnedPaneWidth()\">\n @for (run of rightHeaderGroupRuns(); track run.key) {\n <div class=\"ag-header-group-cell\" role=\"columnheader\" [attr.data-header-group]=\"run.id\"\n [class.ag-header-group-cell--empty]=\"!run.id\"\n [class.ag-header-group-cell--locked]=\"isHeaderGroupLocked(run.fields)\"\n [class.ag-header-group-cell--dragging]=\"isHeaderGroupDragging(run.fields)\"\n [style.grid-column]=\"'span ' + run.span\"\n (pointerdown)=\"run.id && onHeaderGroupPointerDown($event, run.fields, run.label)\">\n {{ run.label }}\n </div>\n }\n </div>\n }\n <div class=\"ag-header\" role=\"row\" [attr.aria-rowindex]=\"headerRowCount()\"\n [class.ag-header--with-filters]=\"hasFilterableColumns()\"\n [style.grid-template-columns]=\"rightGridTemplateColumns()\" [style.width.px]=\"rightPinnedPaneWidth()\">\n @for (col of rightPinnedColDefs(); track col.field) {\n <div class=\"ag-header-cell ag-header-cell--pinned\" role=\"columnheader\"\n [attr.aria-colindex]=\"getAriaColIndex(getVisibleColIndex(col.field))\"\n [attr.aria-sort]=\"getSort(col.field) === 'asc' ? 'ascending' : getSort(col.field) === 'desc' ? 'descending' : 'none'\"\n [class.ag-header-cell--filtered]=\"hasActiveFilter(col.field)\"\n [class.ag-header-cell--dragging]=\"isColDragging(col.field)\"\n [class.ag-header-cell--drop-before]=\"getColDropSide(col.field) === 'before'\"\n [class.ag-header-cell--drop-after]=\"getColDropSide(col.field) === 'after'\"\n [style.transform]=\"'translateX(' + getColReorderOffset(col.field) + 'px)'\"\n [class.ag-header-cell--pinned-first]=\"isFirstRightPinnedColumn(col.field)\" [attr.data-col-field]=\"col.field\"\n (pointerdown)=\"onColHeaderPointerDown($event, col.field)\">\n <div class=\"ag-header-cell-top\">\n <span class=\"ag-header-cell-label\">{{ col.header }}</span>\n @if (getSort(col.field); as dir) {\n <span class=\"ag-sort-badge\">{{ dir === 'asc' ? '↑' : '↓' }}@if (hasMultiSort()) {<sup\n class=\"ag-sort-priority\">{{ getSortPriority(col.field) }}</sup>}</span>\n }\n @if (isGroupedByField(col.field)) {\n <span class=\"ag-sort-badge\">'⊟ '</span>\n }\n <button class=\"ag-header-menu-btn\" [class.ag-header-menu-btn--active]=\"hasActiveFilter(col.field)\"\n [title]=\"localeText().columnMenu\" [attr.aria-label]=\"localeText().columnMenu + ': ' + col.header\"\n [attr.aria-expanded]=\"filterMenu()?.field === col.field\" aria-haspopup=\"menu\"\n (click)=\"openFilterMenu($event, col.field)\" (pointerdown)=\"$event.stopPropagation()\">▾</button>\n </div>\n @if (hasFilterableColumns()) {\n <div class=\"ag-header-cell-filter\">\n @if (col.filterable) {\n <input class=\"ag-filter-input\" [value]=\"getTextFilter(col.field)\"\n (input)=\"onTextFilterChange($event, col.field)\" (click)=\"$event.stopPropagation()\"\n [placeholder]=\"localeText().filterPlaceholder\"\n [attr.aria-label]=\"localeText().filterPlaceholder + ' ' + col.header\" />\n @if (getMenuFilterType(col.field)) {\n <button type=\"button\" class=\"ag-filter-condition-btn\"\n [class.ag-filter-condition-btn--active]=\"!!getMenuOperator(col.field)\"\n [title]=\"localeText().filterConditionMenu\"\n [attr.aria-label]=\"localeText().filterConditionMenu + ': ' + col.header\"\n [attr.aria-expanded]=\"filterMenu()?.field === col.field\"\n (click)=\"openFilterMenu($event, col.field)\"\n (pointerdown)=\"$event.stopPropagation()\">{{ getConditionButtonLabel(col.field) }}</button>\n }\n }\n </div>\n }\n <div class=\"ag-resize-handle\" role=\"separator\" [attr.tabindex]=\"col.locked ? -1 : 0\"\n aria-orientation=\"vertical\" [attr.aria-disabled]=\"col.locked ? 'true' : null\"\n [attr.aria-label]=\"localeText().resizeColumn + ': ' + col.header\"\n [attr.aria-valuenow]=\"getColumnWidth(col)\" (keydown)=\"onResizeKeyDown($event, col)\"\n (mousedown)=\"onResizeStart($event, col)\" (pointerdown)=\"$event.stopPropagation()\"\n (dblclick)=\"onAutosizeColumn($event, col)\"></div>\n </div>\n }\n </div>\n\n <ng-template #rightRow let-item let-ariaIndex=\"ariaIndex\">\n <div role=\"row\" [attr.aria-rowindex]=\"ariaIndex\"\n [attr.aria-selected]=\"isDataRowItem(item) && isRowSelected(item.originalIndex) ? 'true' : null\"\n [class.ag-row]=\"!isGroupHeaderItem(item) && !isDetailRowItem(item)\" [class.ag-add-row]=\"item === null\"\n [class.ag-ghost-row]=\"item === 'ghost'\" [class.ag-group-header-row]=\"isGroupHeaderItem(item)\"\n [class.ag-detail-row]=\"isDetailRowItem(item)\"\n [class.ag-row--odd]=\"isDataRowItem(item) && dataRowIsOdd().get(item.originalIndex) === true\"\n [class.ag-row--selected]=\"isDataRowItem(item) && isRowSelected(item.originalIndex)\"\n [class.ag-row--marked]=\"isDataRowItem(item) && isRowMarked(item.originalIndex)\"\n [class.ag-row--pending-delete]=\"isDataRowItem(item) && isRowPendingDelete(item.originalIndex)\"\n [class]=\"isDataRowItem(item) ? getRowClass(item.row, item.originalIndex) : ''\"\n [style.height.px]=\"rowPx(item)\"\n [style.grid-template-columns]=\"isDataRowItem(item) || item === 'ghost' ? rightGridTemplateColumns() : null\">\n @if (isDataRowItem(item)) {\n @for (col of rightPinnedColDefs(); track col.field) {\n @let ci = getVisibleColIndex(col.field);\n <agrid-cell [col]=\"col\" [rowIndex]=\"item.originalIndex\" [colIndex]=\"ci\" [value]=\"item.row[col.field]\"\n [displayValueOverride]=\"treeCellDisplayOverride(item, col)\"\n [row]=\"item.row\" [locale]=\"locale()\" [attr.data-cell-row]=\"item.originalIndex\" [attr.data-cell-col]=\"ci\"\n [attr.data-col-field]=\"col.field\" [attr.aria-colindex]=\"getAriaColIndex(ci)\"\n [attr.aria-selected]=\"isSelected(item.originalIndex, ci) || isRangeSelected(item.originalIndex, ci)\"\n [selected]=\"isSelected(item.originalIndex, ci)\" [editing]=\"isEditing(item.originalIndex, ci)\"\n [editable]=\"isColEditable(col, item.originalIndex)\" [error]=\"cellValidationError(item.originalIndex, ci)\"\n [showInfoIcon]=\"showCellInfoIcon(col, item.row)\"\n [seedChar]=\"getSeedChar(item.originalIndex, ci)\" [selectTextOnEdit]=\"selectTextOnEdit()\"\n [treeCell]=\"isTreeCell(col)\"\n [treeLevel]=\"treeRowLevel(item)\" [treeExpandable]=\"treeRowExpandable(item)\"\n [treeExpanded]=\"treeRowExpanded(item)\" [class]=\"getCellClass(col, item.row[col.field], item.row)\"\n [class.ag-cell--range-selected]=\"isRangeSelected(item.originalIndex, ci)\"\n [class.ag-cell--fill-preview]=\"isFillPreviewCell(item.originalIndex, ci)\"\n [class.ag-cell--fill-handle]=\"isFillHandleCell(item.originalIndex, ci)\"\n [class.ag-cell--changed]=\"isCellChanged(item.originalIndex, col.field)\"\n [class.ag-column-reorder-item--dragging]=\"isColDragging(col.field)\"\n [style.transform]=\"'translateX(' + getColReorderOffset(col.field) + 'px)'\"\n [class.ag-cell--find-match]=\"isFindMatchCell(item.originalIndex, ci)\"\n [class.ag-cell--find-active]=\"isActiveFindMatchCell(item.originalIndex, ci)\"\n [class.ag-cell--pinned]=\"true\" [class.ag-cell--pinned-first]=\"isFirstRightPinnedColumn(col.field)\"\n (pointerdown)=\"onCellPointerDown($event, item.originalIndex, ci)\"\n (activate)=\"onActivate(item.originalIndex, ci, $event)\" (startEdit)=\"onStartEdit(item.originalIndex, ci)\"\n (draftChange)=\"onDraftChange($event)\" (booleanToggle)=\"onBooleanToggle(item.originalIndex, ci, $event)\"\n (infoClick)=\"onCellInfo(item.originalIndex, col, item.row)\"\n (treeToggle)=\"onTreeToggle(item)\"\n (contextmenu)=\"onCellContextMenu($event, item.originalIndex, ci, col, item.row)\" />\n }\n } @else if (item === null) {\n <div class=\"ag-pinned-row-spacer\"></div>\n } @else if (item === 'ghost') {\n @for (col of rightPinnedColDefs(); track col.field) {\n <div class=\"ag-ghost-cell ag-cell--pinned\"\n [class.ag-column-reorder-item--dragging]=\"isColDragging(col.field)\"\n [style.transform]=\"'translateX(' + getColReorderOffset(col.field) + 'px)'\"\n [class.ag-cell--pinned-first]=\"isFirstRightPinnedColumn(col.field)\">{{ getGhostCellDisplay(col) }}</div>\n }\n } @else {\n <div class=\"ag-pinned-row-spacer\"></div>\n }\n </div>\n </ng-template>\n\n @if (hasPinnedTopRows()) {\n <div class=\"ag-pinned-rows ag-pinned-rows--top ag-pinned-body ag-right-pinned-body\"\n [style.width.px]=\"rightPinnedPaneWidth()\">\n @for (item of pinnedTopItems(); track item.originalIndex) {\n <ng-container [ngTemplateOutlet]=\"rightRow\"\n [ngTemplateOutletContext]=\"{ $implicit: item, ariaIndex: headerRowCount() + 1 + $index }\" />\n }\n </div>\n }\n\n <cdk-virtual-scroll-viewport #rightPinnedViewport class=\"ag-body ag-pinned-body ag-right-pinned-body\"\n [agridVariableRowSize]=\"itemSizes()\" [style.width.px]=\"rightPinnedPaneWidth()\"\n (scroll)=\"onRightPinnedBodyScroll()\">\n <ng-container *cdkVirtualFor=\"let item of displayItems(); let di = index; trackBy: trackByItem\">\n <ng-container [ngTemplateOutlet]=\"rightRow\"\n [ngTemplateOutletContext]=\"{ $implicit: item, ariaIndex: di + headerRowCount() + 1 + pinnedTopItems().length }\" />\n </ng-container>\n </cdk-virtual-scroll-viewport>\n\n @if (hasPinnedBottomRows()) {\n <div class=\"ag-pinned-rows ag-pinned-rows--bottom ag-pinned-body ag-right-pinned-body\"\n [style.width.px]=\"rightPinnedPaneWidth()\">\n @for (item of pinnedBottomItems(); track item.originalIndex) {\n <ng-container [ngTemplateOutlet]=\"rightRow\"\n [ngTemplateOutletContext]=\"{ $implicit: item, ariaIndex: headerRowCount() + 1 + pinnedTopItems().length + displayItems().length + $index }\" />\n }\n </div>\n }\n\n @if (showFooter()) {\n <div class=\"ag-footer\" role=\"row\" [attr.aria-rowindex]=\"displayItems().length + headerRowCount() + 1\"\n [style.grid-template-columns]=\"rightGridTemplateColumns()\">\n @for (col of rightPinnedColDefs(); track col.field) {\n <div class=\"ag-footer-cell\" role=\"gridcell\"\n [class.ag-column-reorder-item--dragging]=\"isColDragging(col.field)\"\n [style.transform]=\"'translateX(' + getColReorderOffset(col.field) + 'px)'\"\n [attr.aria-colindex]=\"getAriaColIndex(getVisibleColIndex(col.field))\"\n [class.ag-footer-cell--pinned-first]=\"isFirstRightPinnedColumn(col.field)\">\n @if (hasAggregate(col)) {\n <span class=\"ag-footer-label\">{{ getAggregateLabel(col) }}</span>\n {{ getFooterDisplay(col, footerValues()[col.field]) }}\n }\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n\n @if (loading()) {\n <div class=\"ag-state-overlay\" role=\"status\" aria-live=\"polite\">{{ localeText().loading }}</div>\n } @else if (isEmpty()) {\n <div class=\"ag-state-overlay\" role=\"status\" aria-live=\"polite\">{{ emptyTextLabel() }}</div>\n }\n\n @if (showSidebar()) {\n <agrid-sidebar [open]=\"sidebarOpen()\" [activeTab]=\"sidebarTab()\" [columns]=\"colDefs()\"\n [headerGroups]=\"headerGroups()\" [row]=\"sidebarRow()\" [rowIndex]=\"selectedRowIndex()\"\n [hiddenColumns]=\"sidebarHiddenColumns()\" [locale]=\"locale()\"\n [localeText]=\"localeText()\" [readonlyGrid]=\"readonlyGrid()\" [useSidebarEditor]=\"useSidebarEditor()\"\n [isCellEditable]=\"isCellEditableForRow\"\n [errors]=\"sidebarValidationErrors()\" (close)=\"toggleSidebar()\" (tabChange)=\"onSidebarStripClick($event)\"\n (toggleColumn)=\"onSidebarToggleColumn($event)\"\n (toggleColumnGroup)=\"onSidebarToggleColumnGroup($event.fields, $event.visible)\"\n (detailEdit)=\"onSidebarDetailEdit($event)\" (save)=\"onSidebarDetailSave($event)\" />\n }\n </div><!-- /.ag-main-area -->\n\n @if (showPagination()) {\n <nav class=\"ag-pagination\" [attr.aria-label]=\"localeText().pagination\">\n <button class=\"ag-page-btn\" [attr.aria-label]=\"localeText().firstPage\" [disabled]=\"control()!.currentPage() <= 1\"\n (click)=\"goToFirstPage()\">«</button>\n <button class=\"ag-page-btn\" [attr.aria-label]=\"localeText().previous\" [disabled]=\"control()!.currentPage() <= 1\"\n (click)=\"goToPrevPage()\">‹</button>\n <span class=\"ag-page-info\" aria-live=\"polite\">{{ control()!.currentPage() }} / {{ totalPages() }}</span>\n <button class=\"ag-page-btn\" [disabled]=\"control()!.currentPage() >= totalPages()\"\n [attr.aria-label]=\"localeText().next\" (click)=\"goToNextPage()\">›</button>\n <button class=\"ag-page-btn\" [disabled]=\"control()!.currentPage() >= totalPages()\"\n [attr.aria-label]=\"localeText().lastPage\" (click)=\"goToLastPage()\">»</button>\n <span class=\"ag-page-count\">{{ localeText().rows(filteredRowCount()) }}</span>\n </nav>\n }\n\n @if (findOpen()) {\n <agrid-find-panel [query]=\"findQuery()\" [matchCount]=\"findMatches().length\" [activeIndex]=\"findActiveIndex()\"\n [localeText]=\"localeText()\" (queryChange)=\"onFindInput($event)\" (previous)=\"goToFindMatch(-1)\"\n (next)=\"goToFindMatch(1)\" (close)=\"closeFind()\" />\n }\n\n <!-- Row context menu -->\n @if (contextMenu(); as menu) {\n @if(hasContextMenuEntries()) {\n <div class=\"ag-context-menu\" role=\"menu\" [style.left.px]=\"menu.x\" [style.top.px]=\"menu.y\"\n (click)=\"$event.stopPropagation()\">\n @if (!treeConfig()) {\n @if (rowPinState(menu.rowIndex)) {\n <button class=\"ag-context-item\" role=\"menuitem\" (click)=\"onPinRow(menu.rowIndex, null)\">{{ localeText().unpinRow\n }}</button>\n } @else {\n <button class=\"ag-context-item\" role=\"menuitem\" (click)=\"onPinRow(menu.rowIndex, 'top')\">{{ localeText().pinRowTop\n }}</button>\n <button class=\"ag-context-item\" role=\"menuitem\" (click)=\"onPinRow(menu.rowIndex, 'bottom')\">{{\n localeText().pinRowBottom }}</button>\n }\n <div class=\"ag-context-separator\" role=\"separator\"></div>\n }\n @if (!readonlyGrid()) {\n <button class=\"ag-context-item ag-context-item--danger\" role=\"menuitem\" (click)=\"deleteRow(menu.rowIndex)\">\n {{ localeText().deleteRow }}\n </button>\n }\n </div>\n }\n }\n\n <!-- Cell context menu -->\n @if (cellContextMenuState(); as menu) {\n @let col = getColDef(menu.field)!;\n <div class=\"ag-context-menu\" role=\"menu\" [style.left.px]=\"menu.x\" [style.top.px]=\"menu.y\"\n (click)=\"$event.stopPropagation()\">\n <button class=\"ag-context-item\" role=\"menuitem\" (click)=\"copyCellToClipboard(menu.rowIndex, col)\">{{\n localeText().copyCellValue\n }}</button>\n <button class=\"ag-context-item\" role=\"menuitem\" (click)=\"copyRowToClipboard(menu.rowIndex)\">{{ localeText().copyRow\n }}</button>\n @if (!treeConfig()) {\n <div class=\"ag-context-separator\" role=\"separator\"></div>\n @if (rowPinState(menu.rowIndex)) {\n <button class=\"ag-context-item\" role=\"menuitem\" (click)=\"onPinRow(menu.rowIndex, null)\">{{ localeText().unpinRow\n }}</button>\n } @else {\n <button class=\"ag-context-item\" role=\"menuitem\" (click)=\"onPinRow(menu.rowIndex, 'top')\">{{ localeText().pinRowTop\n }}</button>\n <button class=\"ag-context-item\" role=\"menuitem\" (click)=\"onPinRow(menu.rowIndex, 'bottom')\">{{\n localeText().pinRowBottom }}</button>\n }\n }\n @if (allowAddRows() && !readonlyGrid()) {\n <div class=\"ag-context-separator\" role=\"separator\"></div>\n <button class=\"ag-context-item\" role=\"menuitem\" (click)=\"insertRowAt(menu.rowIndex)\">{{ localeText().insertRowAbove\n }}</button>\n <button class=\"ag-context-item\" role=\"menuitem\" (click)=\"insertRowAt(menu.rowIndex + 1)\">{{\n localeText().insertRowBelow }}</button>\n }\n @if (!readonlyGrid()) {\n <div class=\"ag-context-separator\" role=\"separator\"></div>\n <button class=\"ag-context-item ag-context-item--danger\" role=\"menuitem\" (click)=\"deleteRow(menu.rowIndex)\">{{\n localeText().deleteRow }}</button>\n }\n @if (cellMenuItems().length) {\n <div class=\"ag-context-separator\" role=\"separator\"></div>\n @for (item of cellMenuItems(); track $index) {\n @if (item === null) {\n <div class=\"ag-context-separator\" role=\"separator\"></div>\n } @else {\n <button class=\"ag-context-item\" role=\"menuitem\" [class.ag-context-item--danger]=\"item.danger\"\n [disabled]=\"item.disabled\" (click)=\"runCellMenuItem(item, menu)\">{{\n item.label }}</button>\n }\n }\n }\n </div>\n }\n\n <!-- Group actions menu -->\n @if (groupActionsMenu(); as menu) {\n <div class=\"ag-context-menu\" role=\"menu\" [style.left.px]=\"menu.x\" [style.top.px]=\"menu.y\"\n (click)=\"$event.stopPropagation()\">\n @for (action of groupActions(); track action.label) {\n <button class=\"ag-context-item\" role=\"menuitem\" (click)=\"onGroupAction(action, menu.label)\">\n {{ action.label }}\n </button>\n }\n </div>\n }\n\n <!-- Filter dropdown -->\n @if (filterMenu(); as menu) {\n <agrid-column-menu [x]=\"menu.x\" [y]=\"menu.y\" [header]=\"getColDef(menu.field)?.header ?? menu.field\"\n [sortDir]=\"getSort(menu.field)\" [sortable]=\"sortOption() !== 'none'\" [showColumnActions]=\"!!control()\"\n [pinned]=\"getColumnPinState(menu.field)\" [groupable]=\"!!getColDef(menu.field)?.groupable\"\n [grouped]=\"isGroupedByField(menu.field)\" [filterable]=\"!!getColDef(menu.field)?.filterable\"\n [showValueFilter]=\"!serverSideFiltering()\" [filterType]=\"getMenuFilterType(menu.field)\"\n [operator]=\"getMenuOperator(menu.field)\" [operand]=\"getMenuOperand(menu.field)\"\n [operand2]=\"getMenuOperand2(menu.field)\" (operatorChange)=\"onMenuOperatorChange(menu.field, $event)\"\n (operandChange)=\"onMenuOperandChange(menu.field, $event)\"\n (operand2Change)=\"onMenuOperand2Change(menu.field, $event)\" [search]=\"filterMenuSearch()\"\n [allSelected]=\"isMenuAllSelected(menu.field)\"\n [valueItems]=\"serverSideFiltering() || !getColDef(menu.field)?.filterable ? [] : columnMenuValueItems()\"\n [localeText]=\"localeText()\" [sortPriority]=\"getSortPriority(menu.field)\" [hasMultiSort]=\"hasMultiSort()\"\n (sort)=\"onMenuSort(menu.field, $event)\" (resetSort)=\"onMenuResetSort(menu.field, $event)\"\n (autosize)=\"onMenuAutosizeColumn(menu.field)\" (togglePin)=\"onMenuTogglePin(menu.field)\"\n (togglePinRight)=\"onMenuTogglePinRight(menu.field)\" (hide)=\"onMenuHideColumn(menu.field)\"\n (toggleGroup)=\"onMenuToggleGroupBy(menu.field)\" (clearFilter)=\"onMenuClearFilter(menu.field)\"\n (clearAll)=\"onMenuClearAll()\" (searchChange)=\"onFilterMenuSearch($event)\" (toggleAll)=\"onMenuToggleAll(menu.field)\"\n (toggleValue)=\"onMenuToggleValue(menu.field, $event)\" [aggregate]=\"getEffectiveAggregate(getColDef(menu.field)!)\"\n (setAggregate)=\"onMenuSetAggregate(menu.field, $event)\" />\n }\n\n @if (columnDragPreview(); as preview) {\n <div class=\"ag-column-drag-preview\" [style.left.px]=\"preview.x\" [style.top.px]=\"preview.y\"\n [style.width.px]=\"preview.width\" [style.height.px]=\"preview.height\">\n <span>{{ preview.label }}</span>\n </div>\n }\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n HostListener,\n computed,\n effect,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\n\n/** Identifier supported by the standalone page selector. */\nexport type AgridPageId = string | number;\n\n/** One selectable page. IDs must be unique within the item list. */\nexport interface AgridPageItem<TId extends AgridPageId = AgridPageId> {\n id: string;\n pageNumber: TId;\n label: string;\n}\n\nlet nextPageSelectorId = 0;\n\n/** Compact previous/input/dropdown/next control for navigating a labeled page list. */\n@Component({\n selector: 'agrid-page-selector',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './agrid-page-selector.component.html',\n styleUrl: './agrid-page-selector.component.css',\n})\nexport class AgridPageSelectorComponent<TId extends AgridPageId = AgridPageId> {\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n readonly listboxId = `agrid-page-options-${nextPageSelectorId++}`;\n\n items = input<readonly AgridPageItem<TId>[]>([]);\n selectedId = input<string | null>(null);\n selectedPageNumber = input<TId | null>(null);\n disabled = input<boolean>(false);\n previousLabel = input<string>('Previous page');\n nextLabel = input<string>('Next page');\n inputLabel = input<string>('Page ID');\n menuLabel = input<string>('Choose a page');\n emptyText = input<string>('No pages');\n\n selectPage = output<AgridPageItem<TId>>();\n\n readonly menuOpen = signal(false);\n readonly draft = signal('');\n readonly invalid = signal(false);\n readonly activeId = signal<string | null>(null);\n readonly focusedOptionIndex = signal(-1);\n\n readonly activeIndex = computed(() =>\n this.items().findIndex(item => this.idsEqual(item.id, this.activeId())),\n );\n readonly hasPrevious = computed(() => !this.disabled() && this.activeIndex() > 0);\n readonly hasNext = computed(() => {\n const index = this.activeIndex();\n return !this.disabled() && index >= 0 && index < this.items().length - 1;\n });\n\n constructor() {\n effect(() => {\n const id = this.selectedId();\n this.activeId.set(id);\n const item = this.items().find(i=>i.id===id);\n this.draft.set(item?.pageNumber == null ? '' : String(item?.pageNumber));\n this.draft.set(id == null ? '' : String(id));\n this.invalid.set(false);\n });\n\n effect(() => {\n const nr = this.selectedPageNumber();\n // fetch the page \n const item = this.items().find(i=>i.pageNumber===nr);\n this.activeId.set(item?.id??null);\n this.draft.set(item?.pageNumber == null ? '' : String(item?.pageNumber));\n this.invalid.set(false);\n });\n }\n\n previous(): void {\n if (!this.hasPrevious()) return;\n this.choose(this.items()[this.activeIndex() - 1]);\n }\n\n next(): void {\n if (!this.hasNext()) return;\n this.choose(this.items()[this.activeIndex() + 1]);\n }\n\n toggleMenu(event: Event): void {\n event.preventDefault();\n event.stopPropagation();\n if (this.disabled() || this.items().length === 0) return;\n this.menuOpen() ? this.closeMenu() : this.openMenu();\n }\n\n openMenu(): void {\n if (this.disabled() || this.items().length === 0) return;\n const current = this.activeIndex();\n this.focusedOptionIndex.set(current >= 0 ? current : 0);\n this.menuOpen.set(true);\n this.scrollFocusedOptionIntoView();\n }\n\n closeMenu(): void {\n this.menuOpen.set(false);\n this.focusedOptionIndex.set(-1);\n }\n\n onInput(event: Event): void {\n this.draft.set((event.target as HTMLInputElement).value);\n this.invalid.set(false);\n this.closeMenu();\n }\n\n onInputKeydown(event: KeyboardEvent): void {\n if (event.key === 'Escape') {\n event.preventDefault();\n this.closeMenu();\n this.resetDraft();\n return;\n }\n if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {\n event.preventDefault();\n if (!this.menuOpen()) this.openMenu();\n else this.moveOption(event.key === 'ArrowDown' ? 1 : -1);\n return;\n }\n if (event.key === 'Home' && this.menuOpen()) {\n event.preventDefault();\n this.focusedOptionIndex.set(0);\n this.scrollFocusedOptionIntoView();\n return;\n }\n if (event.key === 'End' && this.menuOpen()) {\n event.preventDefault();\n this.focusedOptionIndex.set(this.items().length - 1);\n this.scrollFocusedOptionIntoView();\n return;\n }\n if (event.key !== 'Enter') return;\n event.preventDefault();\n const focused = this.menuOpen() ? this.items()[this.focusedOptionIndex()] : undefined;\n if (focused) this.choose(focused);\n else this.selectDraft();\n }\n\n choose(item: AgridPageItem<TId>): void {\n if (this.disabled()) return;\n this.activeId.set(item.id);\n this.draft.set(String(item.id));\n this.invalid.set(false);\n this.closeMenu();\n this.selectPage.emit(item);\n }\n\n optionId(index: number): string {\n return `${this.listboxId}-option-${index}`;\n }\n\n isSelected(item: AgridPageItem<TId>): boolean {\n return this.idsEqual(item.id, this.activeId());\n }\n\n @HostListener('document:pointerdown', ['$event'])\n onDocumentPointerDown(event: PointerEvent): void {\n if (!this.menuOpen()) return;\n if (!this.elementRef.nativeElement.contains(event.target as Node)) this.closeMenu();\n }\n\n private selectDraft(): void {\n const value = this.draft().trim();\n const item = this.items().find(candidate => String(candidate.id) === value);\n if (item) this.choose(item);\n else this.invalid.set(true);\n }\n\n private resetDraft(): void {\n const id = this.activeId();\n this.draft.set(id == null ? '' : String(id));\n this.invalid.set(false);\n }\n\n private moveOption(direction: 1 | -1): void {\n const count = this.items().length;\n if (count === 0) return;\n const current = this.focusedOptionIndex();\n this.focusedOptionIndex.set((current + direction + count) % count);\n this.scrollFocusedOptionIntoView();\n }\n\n private scrollFocusedOptionIntoView(): void {\n queueMicrotask(() => this.elementRef.nativeElement\n .querySelector<HTMLElement>(`#${this.optionId(this.focusedOptionIndex())}`)\n ?.scrollIntoView?.({ block: 'nearest' }));\n }\n\n private idsEqual(left: string, right: string | null): boolean {\n return right !== null && left === right;\n }\n}\n","<div class=\"ag-page-selector\" [class.ag-page-selector--disabled]=\"disabled()\">\n <button type=\"button\" class=\"ag-page-nav\" [disabled]=\"!hasPrevious()\"\n [attr.aria-label]=\"previousLabel()\" [title]=\"previousLabel()\" (click)=\"previous()\">\n <span aria-hidden=\"true\">‹</span>\n </button>\n\n <div class=\"ag-page-combo\">\n <div class=\"ag-page-input-group\" [class.ag-page-input-group--open]=\"menuOpen()\"\n [class.ag-page-input-group--invalid]=\"invalid()\">\n <input class=\"ag-page-input\" type=\"text\" inputmode=\"text\" autocomplete=\"off\"\n role=\"combobox\" [value]=\"draft()\" [disabled]=\"disabled()\"\n [attr.aria-label]=\"inputLabel()\" [attr.aria-expanded]=\"menuOpen()\"\n [attr.aria-controls]=\"menuOpen() ? listboxId : null\"\n [attr.aria-activedescendant]=\"menuOpen() && focusedOptionIndex() >= 0 ? optionId(focusedOptionIndex()) : null\"\n [attr.aria-invalid]=\"invalid() ? 'true' : null\"\n (input)=\"onInput($event)\" (keydown)=\"onInputKeydown($event)\" />\n <button type=\"button\" class=\"ag-page-trigger\" [disabled]=\"disabled() || items().length === 0\"\n [attr.aria-label]=\"menuLabel()\" [title]=\"menuLabel()\"\n [attr.aria-expanded]=\"menuOpen()\" aria-haspopup=\"listbox\"\n (click)=\"toggleMenu($event)\">\n <span aria-hidden=\"true\">▾</span>\n </button>\n </div>\n\n @if (menuOpen()) {\n <div [id]=\"listboxId\" class=\"ag-page-options\" role=\"listbox\"\n [attr.aria-label]=\"menuLabel()\" (pointerdown)=\"$event.stopPropagation()\">\n @for (item of items(); track item.id; let index = $index) {\n <button type=\"button\" class=\"ag-page-option\" role=\"option\" [id]=\"optionId(index)\"\n [class.ag-page-option--selected]=\"isSelected(item)\"\n [class.ag-page-option--focused]=\"focusedOptionIndex() === index\"\n [attr.aria-selected]=\"isSelected(item)\"\n (mouseenter)=\"focusedOptionIndex.set(index)\" (click)=\"choose(item)\">\n <span class=\"ag-page-option-id\">{{ item.pageNumber }}</span>\n <span class=\"ag-page-option-label\">{{ item.label }}</span>\n </button>\n } @empty {\n <div class=\"ag-page-empty\">{{ emptyText() }}</div>\n }\n </div>\n }\n </div>\n\n <button type=\"button\" class=\"ag-page-nav\" [disabled]=\"!hasNext()\"\n [attr.aria-label]=\"nextLabel()\" [title]=\"nextLabel()\" (click)=\"next()\">\n <span aria-hidden=\"true\">›</span>\n </button>\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n computed,\n effect,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { AgridDataSource } from './agrid-datasource';\nimport { AgridTreeProvider } from './agrid-tree-provider';\nimport { AgridTreeController } from './rows/agrid-tree.controller';\nimport {\n AgridTreeNodeEvent,\n AgridTreeSelectionEvent,\n GridItem,\n PathTreeNodeItem,\n TreeRowItem,\n} from './agrid.types';\nimport {\n buildPathTreeItems,\n buildTreeItems,\n isPathTreeConfig,\n pathTreeNodeId,\n} from './agrid.utils';\n\ntype StandaloneTreeItem<T extends object> = TreeRowItem<T> | PathTreeNodeItem;\n\nfunction isPathNode<T extends object>(item: StandaloneTreeItem<T>): item is PathTreeNodeItem {\n return 'pathNodeId' in item;\n}\n\n/** Standalone accessible tree control backed by the same projection logic as `AgridComponent`. */\n@Component({\n selector: 'agrid-tree',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './agrid-tree.component.html',\n styleUrl: './agrid-tree.component.css',\n host: { '[style.--agrid-tree-row-height.px]': 'provider().rowHeight' },\n})\nexport class AgridTreeComponent<T extends object = any> {\n provider = input.required<AgridTreeProvider<T>>();\n\n nodeClick = output<AgridTreeNodeEvent<T>>();\n nodeDoubleClicked = output<AgridTreeNodeEvent<T>>();\n selectionChange = output<AgridTreeSelectionEvent<T>>();\n\n private readonly treeController = new AgridTreeController();\n private readonly treeElement = viewChild<ElementRef<HTMLElement>>('tree');\n private initializedProvider: AgridTreeProvider<T> | null = null;\n\n readonly focusedIndex = signal(0);\n readonly selectedKeys = signal<Set<string>>(new Set());\n readonly expandedIds = this.treeController.expandedIds;\n\n readonly items = computed<StandaloneTreeItem<T>[]>(() => {\n const provider = this.provider();\n const rows = provider.datasource.rows();\n const indices = rows.map((_, index) => index);\n const config = provider.treeConfig;\n const projected: GridItem<T>[] = isPathTreeConfig(config)\n ? buildPathTreeItems(rows, indices, config, this.expandedIds())\n : buildTreeItems(rows, indices, config, this.expandedIds());\n return projected.filter((item): item is StandaloneTreeItem<T> =>\n item !== null && typeof item === 'object' && 'level' in item\n && ('pathNodeId' in item || 'row' in item),\n );\n });\n\n constructor() {\n effect(() => {\n const provider = this.provider();\n if (provider === this.initializedProvider) return;\n this.initializedProvider = provider;\n this.selectedKeys.set(new Set());\n this.focusedIndex.set(0);\n provider.treeConfig.defaultExpanded ? this.expandAllNodes() : this.collapseAllNodes();\n });\n }\n\n /** Expands every branch currently represented by the datasource. */\n expandAllNodes(): void {\n const provider = this.provider();\n const config = provider.treeConfig;\n const rows = provider.datasource.rows();\n if (isPathTreeConfig(config)) {\n const ids = new Set<string>();\n for (const row of rows) {\n const path = config.getPath(row).map(String).filter(Boolean);\n for (let length = 1; length < path.length; length++) {\n ids.add(pathTreeNodeId(path.slice(0, length)));\n }\n }\n this.treeController.expandAll(ids);\n return;\n }\n const ids = new Set<string | number>();\n for (const row of rows) {\n const parentId = config.getParentId(row);\n if (parentId != null) ids.add(parentId);\n }\n this.treeController.expandAll(ids);\n }\n\n /** Collapses every branch. */\n collapseAllNodes(): void {\n this.treeController.collapseAll();\n }\n\n /** Toggles one expandable node. */\n toggleNode(item: StandaloneTreeItem<T>): void {\n if (!item.expandable) return;\n this.treeController.toggle(this.expansionId(item));\n }\n\n /** @internal */\n label(item: StandaloneTreeItem<T>): string {\n if (isPathNode(item)) return item.pathLabel;\n if (item.treeLabel !== undefined) return item.treeLabel;\n const provider = this.provider();\n return provider.getLabel?.(item.row) ?? String(item.row[provider.treeConfig.treeField] ?? '');\n }\n\n /** @internal */\n description(item: StandaloneTreeItem<T>): string | undefined {\n return isPathNode(item) ? undefined : this.provider().getDescription?.(item.row);\n }\n\n /** @internal */\n isSelected(item: StandaloneTreeItem<T>): boolean {\n return this.selectedKeys().has(this.selectionKey(item));\n }\n\n /** @internal */\n onNodeClick(event: MouseEvent, item: StandaloneTreeItem<T>, index: number): void {\n event.stopPropagation();\n this.focusedIndex.set(index);\n this.select(item, event.metaKey || event.ctrlKey);\n this.nodeClick.emit(this.toEvent(item));\n }\n\n /** @internal */\n onNodeDoubleClick(event: MouseEvent, item: StandaloneTreeItem<T>): void {\n event.stopPropagation();\n this.nodeDoubleClicked.emit(this.toEvent(item));\n }\n\n /** @internal */\n onKeydown(event: KeyboardEvent, item: StandaloneTreeItem<T>, index: number): void {\n const items = this.items();\n if (event.key === 'ArrowDown') return this.moveFocus(event, Math.min(index + 1, items.length - 1));\n if (event.key === 'ArrowUp') return this.moveFocus(event, Math.max(index - 1, 0));\n if (event.key === 'Home') return this.moveFocus(event, 0);\n if (event.key === 'End') return this.moveFocus(event, items.length - 1);\n if (event.key === 'ArrowRight' && item.expandable) {\n event.preventDefault();\n if (!item.expanded) this.toggleNode(item);\n else this.moveFocus(event, Math.min(index + 1, items.length - 1));\n return;\n }\n if (event.key === 'ArrowLeft') {\n event.preventDefault();\n if (item.expandable && item.expanded) this.toggleNode(item);\n else {\n const parent = this.findParentIndex(index, item.level);\n if (parent >= 0) this.focusNode(parent);\n }\n return;\n }\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n this.select(item, event.metaKey || event.ctrlKey);\n this.nodeClick.emit(this.toEvent(item));\n }\n }\n\n /** @internal */\n trackItem(_index: number, item: StandaloneTreeItem<T>): string {\n return this.selectionKey(item);\n }\n\n private select(item: StandaloneTreeItem<T>, additive: boolean): void {\n const mode = this.provider().selection;\n if (mode === 'none') return;\n const key = this.selectionKey(item);\n this.selectedKeys.update(current => {\n const next = mode === 'multi' && additive ? new Set(current) : new Set<string>();\n if (mode === 'multi' && additive && next.has(key)) next.delete(key);\n else next.add(key);\n return next;\n });\n const selected = this.items().filter(candidate => this.selectedKeys().has(this.selectionKey(candidate)));\n this.selectionChange.emit({ nodes: selected.map(candidate => this.toEvent(candidate)) });\n }\n\n private toEvent(item: StandaloneTreeItem<T>): AgridTreeNodeEvent<T> {\n if (isPathNode(item)) {\n return {\n kind: 'branch', id: item.pathNodeId, uuid: item.uuid, label: item.pathLabel,\n level: item.level, expandable: true, expanded: item.expanded,\n };\n }\n const config = this.provider().treeConfig;\n const id = isPathTreeConfig(config) ? item.originalIndex : config.getId(item.row);\n return {\n kind: 'row', id, label: this.label(item), level: item.level,\n expandable: item.expandable, expanded: item.expanded,\n row: item.row, originalIndex: item.originalIndex,\n };\n }\n\n private expansionId(item: StandaloneTreeItem<T>): string | number {\n if (isPathNode(item)) return item.pathNodeId;\n const config = this.provider().treeConfig;\n return isPathTreeConfig(config) ? item.originalIndex : config.getId(item.row);\n }\n\n private selectionKey(item: StandaloneTreeItem<T>): string {\n return isPathNode(item)\n ? `branch:${item.pathNodeId}`\n : `row:${this.expansionId(item)}`;\n }\n\n private moveFocus(event: KeyboardEvent, index: number): void {\n event.preventDefault();\n this.focusNode(index);\n }\n\n private focusNode(index: number): void {\n this.focusedIndex.set(index);\n queueMicrotask(() => this.treeElement()?.nativeElement\n .querySelector<HTMLElement>(`[data-tree-index=\"${index}\"]`)?.focus());\n }\n\n private findParentIndex(index: number, level: number): number {\n for (let candidate = index - 1; candidate >= 0; candidate--) {\n if (this.items()[candidate].level < level) return candidate;\n }\n return -1;\n }\n}\n","<div #tree class=\"ag-tree\" role=\"tree\" [attr.aria-label]=\"provider().ariaLabel\"\n [attr.aria-multiselectable]=\"provider().selection === 'multi' ? 'true' : null\">\n @for (item of items(); track trackItem($index, item); let index = $index) {\n <div class=\"ag-tree-node\" role=\"treeitem\" [attr.data-tree-index]=\"index\"\n [attr.tabindex]=\"focusedIndex() === index ? 0 : -1\"\n [attr.aria-level]=\"item.level + 1\"\n [attr.aria-expanded]=\"item.expandable ? item.expanded : null\"\n [attr.aria-selected]=\"provider().selection !== 'none' ? isSelected(item) : null\"\n [class.ag-tree-node--selected]=\"isSelected(item)\"\n [style.padding-left.px]=\"8 + item.level * 20\"\n (click)=\"onNodeClick($event, item, index)\"\n (dblclick)=\"onNodeDoubleClick($event, item)\"\n (keydown)=\"onKeydown($event, item, index)\">\n <button class=\"ag-tree-toggle\" type=\"button\" tabindex=\"-1\"\n [class.ag-tree-toggle--expanded]=\"item.expanded\"\n [class.ag-tree-toggle--hidden]=\"!item.expandable\"\n [attr.aria-label]=\"(item.expanded ? 'Collapse ' : 'Expand ') + label(item)\"\n (click)=\"toggleNode(item); $event.stopPropagation()\">▸</button>\n <span class=\"ag-tree-content\">\n <span class=\"ag-tree-label\">{{ label(item) }}</span>\n @if (description(item); as detail) {\n <span class=\"ag-tree-description\">{{ detail }}</span>\n }\n </span>\n </div>\n } @empty {\n <div class=\"ag-tree-empty\">{{ provider().emptyText }}</div>\n }\n</div>\n","import { AgridDataSource } from './agrid-datasource';\nimport { AgridTreeConfig, AgridTreeSelectionMode } from './agrid.types';\n\n/** Configuration accepted by {@link AgridTreeProvider}. */\nexport interface AgridTreeProviderConfig<T extends object> {\n datasource: AgridDataSource<T>;\n treeConfig: AgridTreeConfig<T>;\n /** Label for parent-linked rows. Defaults to the configured `treeField` value. */\n getLabel?: (row: T) => string;\n /** Optional secondary text shown beneath a row label. */\n getDescription?: (row: T) => string | undefined;\n /** Selection behavior. Defaults to `single`. */\n selection?: AgridTreeSelectionMode;\n /** Fixed node height in pixels. Defaults to `36`. */\n rowHeight?: number;\n /** Accessible name for the tree. Defaults to `Tree`. */\n ariaLabel?: string;\n /** Text shown when the datasource is empty. */\n emptyText?: string;\n}\n\n/** Provider-style configuration and datasource container for `<agrid-tree>`. */\nexport class AgridTreeProvider<T extends object = any> {\n readonly datasource: AgridDataSource<T>;\n readonly treeConfig: AgridTreeConfig<T>;\n readonly getLabel?: (row: T) => string;\n readonly getDescription?: (row: T) => string | undefined;\n readonly selection: AgridTreeSelectionMode;\n readonly rowHeight: number;\n readonly ariaLabel: string;\n readonly emptyText: string;\n\n constructor(config: AgridTreeProviderConfig<T>) {\n this.datasource = config.datasource;\n this.treeConfig = config.treeConfig;\n this.getLabel = config.getLabel;\n this.getDescription = config.getDescription;\n this.selection = config.selection ?? 'single';\n this.rowHeight = config.rowHeight ?? 36;\n this.ariaLabel = config.ariaLabel ?? 'Tree';\n this.emptyText = config.emptyText ?? 'No items';\n }\n}\n","import type { AgridDataSource } from './agrid-datasource';\nimport type { AgridProvider } from './agrid-provider';\nimport type { FilterOperator } from './agrid-control';\n\n/** String-valued property names available on a row type. */\nexport type AgridField<T extends object> = Extract<keyof T, string>;\n\n/** Behavior after pressing Enter while an inline cell editor is active. */\nexport type AgridEnterEditAction = 'nothing' | 'nextColumn' | 'nextRow';\n\n/** Parameters passed to a row-aware cell readonly resolver. */\nexport interface CellReadonlyParams<\n T extends object = any,\n K extends AgridField<T> = AgridField<T>,\n> {\n /** Datasource row containing the cell. */\n row: T;\n /** Current raw field value. */\n value: T[K];\n /** Column definition for the cell. */\n column: ColDef<T, K>;\n /** Zero-based index of the row in the datasource. */\n originalIndex: number;\n}\n\n/** Global options shared by grid providers. */\nexport interface AGridOptions {\n /**\n * Locale used for built-in labels, date formatting, and comparisons.\n * Use `'auto'` to resolve the browser locale.\n */\n locale: string;\n}\n\n/**\n * A single item in the cell right-click context menu.\n * Pass `null` in the array to render a separator line.\n */\nexport interface CellContextMenuItem<T extends object = any> {\n /** Label shown in the menu. */\n label: string;\n /** Called when the item is clicked. */\n action: (params: {\n value: T[AgridField<T>];\n row: T;\n field: AgridField<T>;\n originalIndex: number;\n }) => void;\n /** Grays out the item and prevents clicks. */\n disabled?: boolean;\n /** Renders the item in red (destructive action). */\n danger?: boolean;\n}\n\n/** Current grid state supplied to menu-bar visibility, active, and disabled resolvers. */\nexport interface AgridMenuBarContext<T extends object = any> {\n /** Current datasource rows. */\n rows: readonly T[];\n /** Currently selected rows with their original datasource indices. */\n selectedRows: readonly { row: T; originalIndex: number }[];\n /** Currently selected cell, or `null`. */\n selectedCell: CellPosition | null;\n /** Provider that owns the menu bar. */\n provider: AgridProvider<T>;\n /** Datasource that owns the current rows. */\n datasource: AgridDataSource<T>;\n}\n\n/** Static or runtime-resolved menu-bar state. */\nexport type AgridMenuBarState<T extends object = any> =\n | boolean\n | ((context: AgridMenuBarContext<T>) => boolean);\n\n/** Shared configuration for menu-bar buttons and dropdown items. */\nexport interface AgridMenuBarMenuItem<T extends object = any> {\n /** Stable command id emitted through `(menuBarAction)`. */\n id: string;\n /** Visible command label. */\n label: string;\n /** Optional compact icon or glyph shown before the label. */\n icon?: string;\n /** Whether the command is rendered. Defaults to `true`. */\n visible?: AgridMenuBarState<T>;\n /** Whether the command receives active styling. Defaults to `false`. */\n active?: AgridMenuBarState<T>;\n /** Whether the command is disabled. Defaults to `false`. */\n disabled?: AgridMenuBarState<T>;\n}\n\n/** Top-level menu-bar button with optional additional dropdown commands. */\nexport interface AgridMenuBarItem<T extends object = any>\n extends AgridMenuBarMenuItem<T> {\n /** Additional commands opened from the button's dropdown chevron. */\n items?: AgridMenuBarMenuItem<T>[];\n}\n\n/**\n * A structured value option used when the data field stores a raw value (e.g. a numeric ID)\n * but the cell should display a human-readable label.\n *\n * @example\n * ```ts\n * values: [\n * { value: 1, label: 'Engineering' },\n * { value: 2, label: 'Sales' },\n * ]\n * ```\n */\nexport interface ValueOption<TValue = unknown> {\n /** Raw value stored in the data source (e.g. `1`, `'ENG'`). */\n value: TValue;\n /** Human-readable label shown in the cell, dropdown, and filter menu. */\n label: string;\n}\n\n/** Width sentinel that makes a column fill the remaining horizontal space. */\nexport const ColDefAutoSize = -1;\n\n/** Label definition for a group displayed above contiguous column headers. */\nexport interface HeaderGroup {\n /** Stable identifier referenced by {@link ColDefBase.group}. */\n id: string;\n /** Text displayed in the grouped header row. */\n label: string;\n}\n\n/** Defines the behavior shared by every typed column. */\nexport interface ColDefBase<T extends object, K extends AgridField<T>> {\n /** Data field name — must match a key in the row object. */\n field: K;\n /** Text displayed in the column header. */\n header: string;\n /** Optional header-group identifier configured through `AgridProvider.headerGroups`. */\n group?: string;\n /**\n * Default column width in pixels. Can be overridden at runtime via {@link AgridControl}.\n * Use `-1` (or omit) to make the column auto-scale and fill available space (`1fr`).\n */\n width?: number;\n /**\n * Semantic type of the field.\n * - `'number'` — blank rows initialize this field to `0` instead of `''`; enables numeric\n * range filters (`>`, `<`, `between`, …) in the column menu.\n * - `'date'` — uses a native date editor and built-in localized display formatting; enables\n * date range filters (before / after / between) in the column menu.\n * - `'boolean'` — renders an inline checkbox that toggles the value on click (no edit mode).\n */\n type?: 'text' | 'number' | 'date' | 'boolean';\n /**\n * Set to `false` to make the column read-only.\n * Defaults to `true` (editable) when omitted.\n */\n editable?: boolean;\n /**\n * Return `true` to make this specific cell read-only at runtime.\n * Runs with the current row, value, column definition, and original datasource index.\n * `editable: false` still makes the whole column read-only before this callback is checked.\n *\n * @example\n * ```ts\n * { field: 'approval', cellReadonly: ({ row }) => row.status !== 'Draft' }\n * ```\n */\n cellReadonly?: (params: CellReadonlyParams<T, K>) => boolean;\n /**\n * Fixed list of allowed values shown in a `<select>` dropdown when editing.\n *\n * - `string[]` — simple list; the stored value equals the displayed label.\n * - `ValueOption[]` — structured list; the stored value (`value`) differs from the\n * displayed label (`label`). Useful when the dataset stores IDs but should show names.\n */\n values?: string[] | ValueOption<T[K]>[];\n /**\n * Optional display formatter applied when the column has no `values` list.\n * Receives the raw cell value and returns the string to display in the cell.\n *\n * @example\n * ```ts\n * { field: 'salary', formatter: v => `$${Number(v).toLocaleString()}` }\n * ```\n */\n formatter?: (value: T[K]) => string;\n /**\n * Resolve an input mask for this specific string cell. The callback receives the current\n * row, cell value, and column definition, so different rows in one column can use different\n * regular expressions. Return `null` or `undefined` to leave the cell unrestricted.\n *\n * The expression is matched against the complete proposed editor value. It should accept\n * partial values so the user can build the final value one character at a time.\n *\n * @example\n * ```ts\n * {\n * field: 'reference',\n * inputMask: ({ row }) => row.numeric\n * ? /\\d{0,3}(?:-\\d{0,5}(?:-\\d{0,5})?)?/\n * : /[a-z0-9]{0,3}(?: [a-z0-9]{0,3}(?: [a-z0-9]{0,5})?)?/i,\n * }\n * ```\n */\n inputMask?: (params: InputMaskParams<T, K>) => RegExp | null | undefined;\n /**\n * Set to `true` to show a filter input and value-picker in the filter row for this column.\n * At least one filterable column must exist for the filter row to appear.\n */\n filterable?: boolean;\n /**\n * Set to `true` to allow grouping the grid by this column.\n * When set, the filter dropdown shows a \"Group by\" toggle for this column.\n */\n groupable?: boolean;\n /**\n * Set to `true` to hide this column when the grid first renders.\n * The column remains in the dataset and can be re-shown via the sidebar column picker\n * or programmatically via `AgridControl.setColumnVisibility()`.\n */\n hidden?: boolean;\n /**\n * Pin this column to the left edge of the grid so it stays visible during horizontal scroll.\n * Can also be toggled at runtime via `AgridControl.setPinned()`.\n */\n pinned?: 'left' | 'right';\n /**\n * Aggregate function shown in the footer row for this column.\n * Built-in: `'sum'`, `'avg'`, `'min'`, `'max'`, `'count'`.\n * Pass a custom function to compute any value from the visible row values.\n * The footer only appears when at least one column has `aggregate` set.\n *\n * @example\n * ```ts\n * { field: 'salary', aggregate: 'sum' }\n * { field: 'score', aggregate: values => values.filter(v => Number(v) > 90).length }\n * ```\n */\n aggregate?: 'sum' | 'avg' | 'min' | 'max' | 'count' | ((values: unknown[]) => unknown);\n /**\n * Return one or more CSS class names to apply to every cell in this column based on the\n * cell's value and row data. Useful for conditional highlighting without a custom renderer.\n *\n * @example\n * ```ts\n * { field: 'score', cellClass: ({ value }) => Number(value) < 50 ? 'cell-danger' : '' }\n * ```\n */\n cellClass?: (params: { value: T[K]; row: T }) => string;\n /**\n * Set to `true` to prevent the column from being resized, reordered, or autosized.\n * The column can still be hidden, filtered, and sorted.\n */\n locked?: boolean;\n /**\n * Validate a committed value before it is written to the row. Return an error message to\n * reject the edit (the value is not written and the message is shown), or `null`/`undefined`\n * to accept it. Runs on inline commit, boolean-checkbox toggle, and sidebar save.\n *\n * @example\n * ```ts\n * { field: 'email', validate: v => /@/.test(String(v)) ? null : 'Invalid email' }\n * ```\n */\n validate?: (value: T[K], row: T) => string | null | undefined;\n /**\n * Custom cell renderer. Returns an HTML string displayed instead of the plain text value.\n * Angular's built-in HTML sanitization is applied automatically.\n *\n * @example\n * ```ts\n * { field: 'status', cellRenderer: ({ value }) =>\n * `<span class=\"badge badge-${value}\">${value}</span>` }\n * ```\n */\n cellRenderer?: (params: { value: T[K]; row: T }) => string;\n /**\n * Show a right-aligned info button in this column's cells.\n * Pass a predicate to show it only for selected rows or values.\n */\n infoIcon?: boolean | ((params: { value: T[K]; row: T }) => boolean);\n}\n\n/**\n * Defines a column whose `field`, formatter value, renderer value, and row are\n * derived from the supplied row type.\n */\nexport type ColDef<\n T extends object = any,\n K extends AgridField<T> = AgridField<T>,\n> = K extends AgridField<T> ? ColDefBase<T, K> : never;\n\n/** Parameters passed to a row-aware {@link ColDefBase.inputMask} resolver. */\nexport interface InputMaskParams<\n T extends object = any,\n K extends AgridField<T> = AgridField<T>,\n> {\n row: T;\n value: T[K];\n column: ColDef<T, K>;\n}\n\n/**\n * Defines a single action shown in the group header's action menu.\n * Pass an array of these to `<agrid [groupActions]=\"...\">`.\n */\nexport interface GroupAction {\n /** Label shown in the dropdown. */\n label: string;\n /** Called with the group's display label when the item is clicked. */\n action: (groupLabel: string) => void;\n}\n\n/**\n * Internal row item used in the virtual scroll list.\n * - `{ row, originalIndex }` — a real data row\n * - `null` — the add-row placeholder\n * - `'ghost'` — the drop-target ghost inserted while dragging\n * - `{ groupLabel, count, collapsed, aggregates? }` — group header row when grouping is active\n * (`aggregates` holds per-group subtotals when aggregated columns exist)\n * - `{ row, originalIndex, level, expandable, expanded }` — a tree row when tree mode is active\n */\nexport type GridItem<T extends object = Record<string, unknown>> =\n | { row: T; originalIndex: number }\n | null\n | 'ghost'\n | { groupLabel: string; count: number; collapsed: boolean; aggregates?: Record<string, unknown> }\n | TreeRowItem<T>\n | PathTreeNodeItem\n | DetailRowItem<T>;\n\n/** A generated, display-only branch node produced by path-based tree data. */\nexport interface PathTreeNodeItem {\n /** Stable UUID for this generated branch node. */\n uuid: string;\n /** Stable expansion id derived from the complete path to this node. */\n pathNodeId: string;\n /** Segment label shown for this branch. */\n pathLabel: string;\n /** Zero-based depth in the generated tree. */\n level: number;\n /** Path branch nodes always have descendants. */\n expandable: true;\n /** Whether the branch's descendants are currently visible. */\n expanded: boolean;\n}\n\n/**\n * A master/detail panel row rendered immediately beneath its expanded parent data row.\n *\n * Carries the parent's `originalIndex` (so the panel can be re-collapsed and tracked) and the\n * parent `row` (passed to `detailRenderer`). It is intentionally *not* a data-row item — selection,\n * editing, and cell rendering skip it.\n */\nexport interface DetailRowItem<T extends object = Record<string, unknown>> {\n /** Original index of the parent data row this detail panel belongs to. */\n detailFor: number;\n /** The parent row's data, passed to `detailRenderer`. */\n row: T;\n}\n\n/**\n * A data row rendered inside a hierarchical tree.\n *\n * Structurally a superset of the plain `{ row, originalIndex }` data-row item, so it also\n * satisfies {@link GridItem}'s data-row checks — selection, editing, and cell rendering treat\n * it exactly like a flat row. The extra fields drive indentation and the expand/collapse twisty.\n */\nexport interface TreeRowItem<T extends object = Record<string, unknown>> {\n /** The underlying row object from the data source. */\n row: T;\n /** Zero-based index of the row in the (flat) data source. */\n originalIndex: number;\n /** Depth in the tree. Root rows are `0`; each level of nesting adds `1`. */\n level: number;\n /** `true` when this row has at least one child row in the current projection. */\n expandable: boolean;\n /** `true` when this row is expandable and currently expanded (its children are visible). */\n expanded: boolean;\n /** Optional display-only label for the tree cell, used by path-based trees. */\n treeLabel?: string;\n}\n\n/**\n * Host-supplied configuration that turns the grid into a tree.\n *\n * Hierarchy is expressed over the existing flat row array using either stable id/parent-id\n * accessors or a path accessor. Path mode creates display-only branch nodes while leaves retain\n * their original datasource indices, so selection, editing, and persistence remain row-based.\n *\n * @example\n * ```ts\n * treeConfig: {\n * getId: row => row.id,\n * getParentId: row => row.managerId,\n * treeField: 'name',\n * }\n *\n * // Or derive branches from a delimited field:\n * treeConfig: {\n * getPath: row => row.oz.split('.'),\n * treeField: 'oz',\n * }\n * ```\n */\ninterface AgridTreeConfigBase<T extends object> {\n /** Field whose cell shows the indentation and expand/collapse twisty. */\n treeField: AgridField<T>;\n /** Expand all nodes when the tree first renders. Defaults to `false` (all collapsed). */\n defaultExpanded?: boolean;\n /**\n * When filtering, keep the ancestors of any matching row visible even if they don't match.\n * Defaults to `true`. (Applied by the projection layer, not by {@link GridItem} flattening.)\n */\n keepAncestorsOnFilter?: boolean;\n}\n\n/** Tree configuration for rows that already expose stable id and parent-id values. */\nexport interface AgridParentTreeConfig<T extends object = any> extends AgridTreeConfigBase<T> {\n /** Return a stable, unique id for a row. Used as the expansion key and for parent lookups. */\n getId: (row: T) => string | number;\n /** Return the id of a row's parent, or `null`/`undefined` for a root row. */\n getParentId: (row: T) => string | number | null | undefined;\n getPath?: never;\n}\n\n/** Values supplied when formatting one path-tree segment for display. */\nexport interface AgridPathSegmentParams<T extends object = any> {\n /** Datasource row that produced this path. Shared branches use the first matching row. */\n row: T;\n /** Raw segment returned by `getPath`. */\n segment: string | number;\n /** Zero-based position of the segment in the path. */\n level: number;\n /** Raw path prefix ending at this segment. */\n path: readonly (string | number)[];\n /** Whether this segment represents the datasource-backed leaf row. */\n leaf: boolean;\n}\n\n/** Tree configuration that derives display-only branch nodes from each row's path segments. */\nexport interface AgridPathTreeConfig<T extends object = any> extends AgridTreeConfigBase<T> {\n /** Return ordered path segments, for example `['01', '01', '0001']`. */\n getPath: (row: T) => readonly (string | number)[];\n /**\n * Return a stable UUID for generated branch nodes created from this row.\n * Shared branches use the first matching row, matching {@link formatPathSegment}.\n */\n nodeUuid?: (row: T) => string | number;\n /**\n * Return a stable UUID for generated branch nodes created from this row.\n * @deprecated Use {@link nodeUuid}. Kept as a compatibility alias for the original typo.\n */\n nodeUUid?: (row: T) => string | number;\n /** Format a segment for display without changing its identity, grouping, or sort order. */\n formatPathSegment?: (params: AgridPathSegmentParams<T>) => string;\n getId?: never;\n getParentId?: never;\n}\n\n/** Supported tree data modes: explicit parent links or generated path segments. */\nexport type AgridTreeConfig<T extends object = any> =\n | AgridParentTreeConfig<T>\n | AgridPathTreeConfig<T>;\n\n/** Selection behavior for the standalone tree control. */\nexport type AgridTreeSelectionMode = 'none' | 'single' | 'multi';\n\n/** Normalized row or generated-branch event emitted by the standalone tree control. */\nexport interface AgridTreeNodeEvent<T extends object = any> {\n kind: 'row' | 'branch';\n id: string | number;\n uuid?: string;\n label: string;\n level: number;\n expandable: boolean;\n expanded: boolean;\n row?: T;\n originalIndex?: number;\n}\n\n/** Current standalone-tree selection after a user interaction. */\nexport interface AgridTreeSelectionEvent<T extends object = any> {\n nodes: AgridTreeNodeEvent<T>[];\n}\n\n/** Zero-based position of a cell inside the grid. */\nexport interface CellPosition {\n /** Zero-based row index in the data array. */\n rowIndex: number;\n /** Zero-based column index in {@link ColDef} order. */\n colIndex: number;\n}\n\n/**\n * Emitted by `(validationFailed)` when a {@link ColDefBase.validate} hook rejects a committed\n * value. The value is not written to the row.\n */\nexport interface ValidationFailedEvent<T extends object = any> {\n /** Zero-based index of the row whose edit was rejected. */\n rowIndex: number;\n /** Field that failed validation. */\n field: AgridField<T>;\n /** The rejected value. */\n value: unknown;\n /** Message returned by the `validate` hook. */\n message: string;\n /** Which editing surface produced the rejected edit. */\n source: 'inline' | 'sidebar';\n}\n\n/** Emitted by `(cellEdit)` after the user commits a cell change. */\nexport type GridEditEvent<T extends object = any> = {\n [K in AgridField<T>]: {\n /** Position of the edited cell. */\n position: CellPosition;\n /** The `ColDef.field` that was changed. */\n field: K;\n /** Previous field value before the edit. */\n oldValue: T[K];\n /** New field value after the edit. */\n newValue: T[K];\n }\n}[AgridField<T>];\n\n/** Emitted when the optional info button inside a cell is clicked. */\nexport type CellInfoEvent<T extends object = any> = {\n [K in AgridField<T>]: {\n /** Datasource row containing the clicked cell. */\n row: T;\n /** Column field containing the clicked info button. */\n field: K;\n /** Current raw field value. */\n value: T[K];\n /** Zero-based index of the row in the datasource. */\n originalIndex: number;\n /** Column definition for the clicked cell. */\n column: ColDef<T, K>;\n }\n}[AgridField<T>];\n\n/**\n * Emitted asynchronously after an edit changes a row and the data source has been updated.\n *\n * Unlike {@link GridEditEvent}, this row-level event identifies the provider and\n * data source that own the edited record, which is useful when rendering multiple grids.\n */\nexport interface RecordEditEvent<T extends object = any> {\n /** Zero-based index of the edited row in the data source. */\n index: number;\n /** Current row data after the edit has been applied. */\n data: T;\n /** Exact provider instance that emitted the event. */\n provider: AgridProvider<T>;\n /** Exact data source containing the edited row. */\n datasource: AgridDataSource<T>;\n}\n\n/**\n * Compatibility alias for the provider-aware event emitted by `(rowRemoved)`.\n * @deprecated Use {@link RecordEditEvent}.\n */\nexport type RowRemovedEvent<T extends object = any> = RecordEditEvent<T>;\n\n/**\n * Emitted by `(rowSelect)` when the selection changes. `null` means all rows were deselected.\n * In `'single'` mode `rows` always has at most one entry.\n */\nexport interface RowSelectEvent<T extends object = any> {\n /** Selected rows and their original data-source indices. */\n rows: { row: T; originalIndex: number }[];\n}\n\n/** Emitted when the user clicks a data row. */\nexport interface RowClickEvent<T extends object = any> {\n /** Snapshot of the clicked row. */\n row: T;\n /** Zero-based index of the row in the data source. */\n originalIndex: number;\n}\n\n/** Emitted when the user clicks or double-clicks a generated path-tree branch node. */\nexport interface TreeNodeClickEvent {\n /** Stable UUID for the generated branch node. */\n uuid: string;\n /** Stable expansion id derived from the complete path to this node. */\n pathNodeId: string;\n /** Segment label shown for this branch. */\n pathLabel: string;\n /** Zero-based depth in the generated tree. */\n level: number;\n /** Whether the branch's descendants are currently visible. */\n expanded: boolean;\n /** Snapshot of the generated branch node. */\n node: PathTreeNodeItem;\n}\n\n/**\n * Emitted after an inline-edited row is left, or after the user saves through the sidebar editor.\n */\nexport interface RowUpdateEvent<T extends object = any> {\n /** Updated row data. */\n row: T;\n /** Zero-based index of the updated row in the data source. */\n originalIndex: number;\n}\n\n/**\n * Emitted by `(rowReorder)` when the user finishes dragging a row to a new position.\n * The grid does **not** reorder data itself — call `dataSource.moveRow(oldIndex, newIndex)`\n * (or your own equivalent) inside the handler.\n */\nexport interface RowReorderEvent<T extends object = any> {\n /** Snapshot of the row data at drag time. */\n row: T;\n /** Index of the row in the data source before the move. */\n oldIndex: number;\n /**\n * Target position in the data source (insert-before semantics).\n * Pass both `oldIndex` and `newIndex` to {@link AgridDataSource.moveRow}.\n */\n newIndex: number;\n}\n\n/**\n * Emitted by `(pageChange)` when the user navigates to a different page in server-side\n * pagination mode (i.e. when `AgridControl.totalRows` is set to a value greater than zero).\n * The host should fetch the rows for `startRow..endRow` from the server and push them into\n * the data source — the grid itself does not slice or filter the data in this mode.\n */\nexport interface PageChangeEvent {\n /** New page number (1-based). */\n page: number;\n /** Rows per page as configured on `AgridControl`. */\n pageSize: number;\n /** Zero-based index of the first row on this page. */\n startRow: number;\n /** Zero-based index of the last row on this page (inclusive). */\n endRow: number;\n}\n\n/** Emitted when a header text filter or column-menu condition changes server-side. */\nexport interface FilterChangeEvent {\n /** Field name of the filtered column. */\n field: string;\n /** Current free-text filter value. An empty string clears the text filter. */\n value: string;\n /**\n * Text, number, or date condition operator from the column-menu UI.\n * `null` clears the condition.\n * When set, `value` is empty and the operands live in {@link operand} / {@link operand2}.\n */\n operator?: FilterOperator | null;\n /** Primary condition operand. Present with {@link operator}. */\n operand?: string | null;\n /** Upper-bound operand, present only when {@link operator} is `'between'`. */\n operand2?: string | null;\n}\n\n/** Emitted when a sort changes in server-side filtering mode. */\nexport interface SortChangeEvent {\n /** Field name of the sorted column. */\n field: string;\n /** Current direction. `null` clears the sort. */\n direction: 'asc' | 'desc' | null;\n}\n\n/**\n * Emitted by `(prepareAddRecord)` when the grid has inserted a blank row.\n * Use this to populate the new row with real defaults via {@link AgridDataSource.updateRow} or\n * {@link AgridDataSource.patchRow}.\n */\nexport interface NewRecord<T extends object = any> {\n /** Index at which the blank row was inserted in the data source. */\n index: number;\n /** The empty row object the grid created (field values are `''` / `0` by type). */\n data: T;\n /** Exact provider instance that emitted this event. Useful when rendering multiple grids. */\n provider: AgridProvider<T>;\n /** Exact data source containing the inserted row. */\n datasource: AgridDataSource<T>;\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["isDataRowItemFn","isDetailRowItemFn","isGroupHeaderItemFn","isPathTreeNodeItemFn","isTreeRowItemFn"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"thkl-agrid.mjs","sources":["../../../src/app/agrid/editing/agrid-cell-editor.ts","../../../src/app/agrid/rendering/agrid-cell-renderer.ts","../../../src/app/agrid/agrid-localization.ts","../../../src/app/agrid/agrid.utils.ts","../../../src/app/agrid/rendering/agrid-cell-span.ts","../../../src/app/agrid/rendering/agrid-cell.component.ts","../../../src/app/agrid/rendering/agrid-pane-header.component.ts","../../../src/app/agrid/rendering/agrid-pane-header.component.html","../../../src/app/agrid/infrastructure/agrid-browser.adapter.ts","../../../src/app/agrid/selection/agrid-clipboard.handler.ts","../../../src/app/agrid/columns/agrid-column-layout.model.ts","../../../src/app/agrid/columns/agrid-column-virtualization.controller.ts","../../../src/app/agrid/columns/agrid-column-menu.component.ts","../../../src/app/agrid/columns/agrid-column-menu.component.html","../../../src/app/agrid/columns/agrid-column-menu.controller.ts","../../../src/app/agrid/columns/agrid-column-reorder.controller.ts","../../../src/app/agrid/columns/agrid-column-sizing.controller.ts","../../../src/app/agrid/columns/agrid-column-state.service.ts","../../../src/app/agrid/agrid-datasource.ts","../../../src/app/agrid/rows/agrid-drag.handler.ts","../../../src/app/agrid/editing/agrid-detail.controller.ts","../../../src/app/agrid/editing/agrid-edit.controller.ts","../../../src/app/agrid/selection/agrid-find.controller.ts","../../../src/app/agrid/selection/agrid-find-panel.component.ts","../../../src/app/agrid/selection/agrid-find-panel.component.html","../../../src/app/agrid/selection/agrid-selection-summary.ts","../../../src/app/agrid/rows/agrid-group.controller.ts","../../../src/app/agrid/rows/agrid-tree.controller.ts","../../../src/app/agrid/selection/agrid-navigation.controller.ts","../../../src/app/agrid/infrastructure/agrid-xlsx.ts","../../../src/app/agrid/rendering/agrid-presentation.service.ts","../../../src/app/agrid/rendering/agrid-menu-icon.component.ts","../../../src/app/agrid/rendering/agrid-menu-icon.component.html","../../../src/app/agrid/rendering/agrid-menu-bar.component.ts","../../../src/app/agrid/rendering/agrid-menu-bar.component.html","../../../src/app/agrid/rendering/agrid-menu-bar.controller.ts","../../../src/app/agrid/agrid-control.ts","../../../src/app/agrid/agrid-provider.ts","../../../src/app/agrid/agrid-pivot.ts","../../../src/app/agrid/agrid-server-side-row-model.ts","../../../src/app/agrid/rows/agrid-projection.model.ts","../../../src/app/agrid/selection/agrid-range.controller.ts","../../../src/app/agrid/rows/agrid-row.controller.ts","../../../src/app/agrid/editing/agrid-sidebar.controller.ts","../../../src/app/agrid/editing/agrid-sidebar.component.ts","../../../src/app/agrid/editing/agrid-sidebar.component.html","../../../src/app/agrid/infrastructure/agrid-variable-row-size.strategy.ts","../../../src/app/agrid/agrid.component.ts","../../../src/app/agrid/agrid.component.html","../../../src/app/agrid/agrid-page-selector.component.ts","../../../src/app/agrid/agrid-page-selector.component.html","../../../src/app/agrid/agrid-tree.component.ts","../../../src/app/agrid/agrid-tree.component.html","../../../src/app/agrid/agrid-tree-provider.ts","../../../src/app/agrid/agrid.types.ts","../../../src/app/agrid/infrastructure/agrid-chart.ts","../../../src/app/agrid/agrid-chart-provider.ts","../../../src/app/agrid/rendering/agrid-chart.component.ts","../../../src/app/agrid/thkl-agrid.ts"],"sourcesContent":["import { InjectionToken, Signal } from '@angular/core';\nimport { ColDef } from '../agrid.types';\n\n/**\n * Context handed to a custom cell editor component through dependency injection.\n *\n * A custom editor is any standalone component referenced by {@link ColDef.cellEditor}.\n * The grid instantiates it while a cell is in edit mode and provides this context via the\n * {@link AGRID_EDITOR_CONTEXT} token. The editor is purely an *input surface*: it reads the\n * current value and pushes drafts back through {@link setDraft}. The grid keeps full ownership\n * of validation, history (undo/redo), and the commit/cancel lifecycle — so Tab, Enter, and\n * Escape continue to work without the editor doing anything.\n *\n * @example\n * ```ts\n * @Component({\n * selector: 'rating-editor',\n * template: `\n * <select #s [value]=\"ctx.value()\" (change)=\"ctx.setDraft(+s.value); ctx.commit()\">\n * @for (n of [1,2,3,4,5]; track n) { <option [value]=\"n\">{{ n }} ★</option> }\n * </select>`,\n * })\n * export class RatingEditor {\n * readonly ctx = inject(AGRID_EDITOR_CONTEXT);\n * }\n *\n * // ColDef: { field: 'rating', cellEditor: RatingEditor }\n * ```\n */\nexport interface AgridEditorContext<TValue = unknown> {\n /** The cell's current value at the moment editing started. */\n readonly value: Signal<TValue>;\n /** The full row record the cell belongs to. */\n readonly row: Signal<Record<string, unknown>>;\n /** The column definition this cell is rendered from. */\n readonly column: Signal<ColDef>;\n /**\n * The printable character that triggered type-to-edit, or `''` when editing started another\n * way (double-click, Enter, F2). Useful for seeding a free-text editor.\n */\n readonly seedChar: Signal<string>;\n /** Stage a new value. The grid commits whatever was last staged on Tab/Enter. */\n setDraft(value: unknown): void;\n /** Programmatically commit the staged value (same as the user pressing Enter). */\n commit(): void;\n /** Programmatically discard the edit (same as the user pressing Escape). */\n cancel(): void;\n}\n\n/** DI token a custom {@link ColDef.cellEditor} component injects to talk to the grid. */\nexport const AGRID_EDITOR_CONTEXT = new InjectionToken<AgridEditorContext>('AGRID_EDITOR_CONTEXT');\n","import { InjectionToken, Signal } from '@angular/core';\nimport { ColDef } from '../agrid.types';\n\n/**\n * Context handed to a custom cell renderer component through dependency injection.\n *\n * A custom renderer is any standalone component referenced by {@link ColDef.cellRendererComponent}.\n * The grid instantiates it for the cell's *display* (read) state and provides this context via the\n * {@link AGRID_RENDERER_CONTEXT} token. Unlike the HTML-string {@link ColDef.cellRenderer}, a\n * component renderer supports full Angular bindings, event handlers, and child components — and\n * needs no manual escaping or sanitization.\n *\n * @example\n * ```ts\n * @Component({\n * selector: 'status-badge',\n * template: `<span class=\"badge\" [class]=\"'badge--' + value()\">{{ value() }}</span>`,\n * })\n * export class StatusBadge {\n * private readonly ctx = inject(AGRID_RENDERER_CONTEXT);\n * readonly value = computed(() => String(this.ctx.value() ?? ''));\n * }\n *\n * // ColDef: { field: 'status', cellRendererComponent: StatusBadge }\n * ```\n */\nexport interface AgridRendererContext<TValue = unknown> {\n /** The cell's current value. */\n readonly value: Signal<TValue>;\n /** The full row record the cell belongs to. */\n readonly row: Signal<Record<string, unknown>>;\n /** The column definition this cell is rendered from. */\n readonly column: Signal<ColDef>;\n}\n\n/** DI token a custom {@link ColDef.cellRendererComponent} component injects to read cell data. */\nexport const AGRID_RENDERER_CONTEXT = new InjectionToken<AgridRendererContext>('AGRID_RENDERER_CONTEXT');\n","/** Built-in locale identifiers supplied by the grid. */\nexport type AgridLocaleKey = 'en' | 'de';\n\n/** Complete set of user-facing strings and label factories used by the grid. */\nexport interface AgridLocaleText {\n actions: string;\n addRow: string;\n aggregate: string;\n aggregateAvg: string;\n aggregateCount: string;\n aggregateCustom: string;\n aggregateMax: string;\n aggregateMin: string;\n aggregateSum: string;\n autosizeColumn: string;\n blank: string;\n clearAllFilters: string;\n clearFilter: string;\n clearSort: string;\n close: string;\n columnMenu: string;\n columns: string;\n collapse: string;\n detail: string;\n toggleDetail: string;\n hiddenColumn: string;\n filterCondition: string;\n filterConditionMenu: string;\n filterValue: string;\n filterNoCondition: string;\n filterOpEquals: string;\n filterOpNotEquals: string;\n filterOpGreater: string;\n filterOpGreaterEqual: string;\n filterOpLess: string;\n filterOpLessEqual: string;\n filterOpBetween: string;\n filterOpBefore: string;\n filterOpAfter: string;\n filterOpOn: string;\n filterOpLike: string;\n filterOpStartsWith: string;\n filterOpEndsWith: string;\n filterOpIncludes: string;\n filterOpNotIncludes: string;\n copyCellValue: string;\n copyRow: string;\n confirmDeleteRow: string;\n confirmNo: string;\n confirmYes: string;\n deleteRow: string;\n filterPlaceholder: string;\n findPlaceholder: string;\n firstPage: string;\n grid: string;\n groupBy: (header: string) => string;\n hideColumn: string;\n insertRowAbove: string;\n insertRowBelow: string;\n lastPage: string;\n loading: string;\n markRow: string;\n moreInformation: string;\n next: string;\n noRows: string;\n pagination: string;\n pivot: string;\n pivotDescription: string;\n pivotRows: string;\n pivotColumns: string;\n pivotValues: string;\n pinColumn: string;\n pinColumnRight: string;\n unpinColumnRight: string;\n pinRowTop: string;\n pinRowBottom: string;\n unpinRow: string;\n previous: string;\n resizeColumn: string;\n expand: string;\n rows: (count: number) => string;\n quickFilterPlaceholder: string;\n searchValuesPlaceholder: string;\n selectAll: string;\n sortOnlyByThis: string;\n sortAscending: string;\n sortDescending: string;\n ungroup: string;\n unpinColumn: string;\n save: string;\n saveConfig:string;\n export:string;\n exportCsv:string;\n exportXlsx:string;\n templates:string;\n}\n\n/** Partial locale text supplied to {@link AgridProvider.addLocalization}. */\nexport type AgridLocaleTextOverrides = Partial<AgridLocaleText>;\n\n/** Built-in English and German grid translations. */\nexport const AGRID_LOCALE_TEXT: Record<AgridLocaleKey, AgridLocaleText> = {\n en: {\n actions: 'Actions',\n addRow: 'Add row',\n aggregate: 'Aggregate',\n aggregateAvg: 'Average',\n aggregateCount: 'Count',\n aggregateCustom: 'Custom function',\n aggregateMax: 'Maximum',\n aggregateMin: 'Minimum',\n aggregateSum: 'Sum',\n autosizeColumn: 'Autosize column',\n blank: '(blank)',\n clearAllFilters: 'Clear all filters',\n clearFilter: 'Clear filter',\n clearSort: 'Clear sort',\n close: 'Close',\n columnMenu: 'Column menu',\n columns: 'Columns',\n collapse: 'Collapse',\n detail: 'Detail',\n toggleDetail: 'Toggle detail panel',\n hiddenColumn: '(hidden)',\n filterCondition: 'Condition',\n filterConditionMenu: 'Filter condition',\n filterValue: 'Value',\n filterNoCondition: 'No condition',\n filterOpEquals: 'Equals',\n filterOpNotEquals: 'Not equal',\n filterOpGreater: 'Greater than',\n filterOpGreaterEqual: 'Greater or equal',\n filterOpLess: 'Less than',\n filterOpLessEqual: 'Less or equal',\n filterOpBetween: 'Between',\n filterOpBefore: 'Before',\n filterOpAfter: 'After',\n filterOpOn: 'On',\n filterOpLike: 'Like (% and _ wildcards)',\n filterOpStartsWith: 'Starts with',\n filterOpEndsWith: 'Ends with',\n filterOpIncludes: 'Includes',\n filterOpNotIncludes: 'Does not include',\n copyCellValue: 'Copy cell',\n copyRow: 'Copy row',\n confirmDeleteRow: 'Sure to delete?',\n confirmNo: 'No',\n confirmYes: 'Yes',\n deleteRow: 'Delete row',\n filterPlaceholder: 'Filter...',\n findPlaceholder: 'Find',\n firstPage: 'First page',\n grid: 'Data grid',\n groupBy: header => `Group by ${header}`,\n hideColumn: 'Hide column',\n insertRowAbove: 'Insert row above',\n insertRowBelow: 'Insert row below',\n lastPage: 'Last page',\n loading: 'Loading...',\n markRow: 'Mark row for copying',\n moreInformation: 'More information',\n next: 'Next',\n noRows: 'No rows to display',\n pagination: 'Pagination',\n pivot: 'Pivot',\n pivotDescription: 'Configure the fields used to build the pivot result.',\n pivotRows: 'Rows',\n pivotColumns: 'Columns',\n pivotValues: 'Values',\n pinColumn: 'Pin left',\n pinColumnRight: 'Pin right',\n unpinColumnRight: 'Unpin right',\n pinRowTop: 'Pin row to top',\n pinRowBottom: 'Pin row to bottom',\n unpinRow: 'Unpin row',\n previous: 'Previous',\n resizeColumn: 'Resize column',\n expand: 'Expand',\n rows: count => `${count} ${count === 1 ? 'row' : 'rows'}`,\n quickFilterPlaceholder: 'Search all columns...',\n searchValuesPlaceholder: 'Search values...',\n selectAll: '(Select All)',\n sortOnlyByThis: 'Sort only by this column',\n sortAscending: 'Sort ascending',\n sortDescending: 'Sort descending',\n ungroup: 'Ungroup',\n unpinColumn: 'Unpin column',\n save: 'Save',\n saveConfig:'Save Config',\n export: 'Export',\n exportCsv:'Export to csv',\n exportXlsx:'Export to xlsx',\n templates:' templates',\n },\n de: {\n actions: 'Aktionen',\n addRow: 'Zeile hinzufügen',\n aggregate: 'Aggregat',\n aggregateAvg: 'Durchschnitt',\n aggregateCount: 'Anzahl',\n aggregateCustom: 'Benutzerdefinierte Funktion',\n aggregateMax: 'Maximum',\n aggregateMin: 'Minimum',\n aggregateSum: 'Summe',\n autosizeColumn: 'Spaltenbreite anpassen',\n blank: '(leer)',\n clearAllFilters: 'Alle Filter löschen',\n clearFilter: 'Filter löschen',\n clearSort: 'Sortierung löschen',\n close: 'Schließen',\n columnMenu: 'Spaltenmenü',\n columns: 'Spalten',\n collapse: 'Einklappen',\n detail: 'Details',\n toggleDetail: 'Detailbereich umschalten',\n hiddenColumn: '(ausgeblendet)',\n filterCondition: 'Bedingung',\n filterConditionMenu: 'Filterbedingung',\n filterValue: 'Wert',\n filterNoCondition: 'Keine Bedingung',\n filterOpEquals: 'Gleich',\n filterOpNotEquals: 'Ungleich',\n filterOpGreater: 'Größer als',\n filterOpGreaterEqual: 'Größer oder gleich',\n filterOpLess: 'Kleiner als',\n filterOpLessEqual: 'Kleiner oder gleich',\n filterOpBetween: 'Zwischen',\n filterOpBefore: 'Vor',\n filterOpAfter: 'Nach',\n filterOpOn: 'Am',\n filterOpLike: 'Wie (% und _ Platzhalter)',\n filterOpStartsWith: 'Beginnt mit',\n filterOpEndsWith: 'Endet mit',\n filterOpIncludes: 'Enthält',\n filterOpNotIncludes: 'Enthält nicht',\n copyCellValue: 'Zelle kopieren',\n copyRow: 'Zeile kopieren',\n confirmDeleteRow: 'Wirklich löschen?',\n confirmNo: 'Nein',\n confirmYes: 'Ja',\n deleteRow: 'Zeile löschen',\n filterPlaceholder: 'Filtern...',\n findPlaceholder: 'Suchen',\n firstPage: 'Erste Seite',\n grid: 'Datentabelle',\n groupBy: header => `Nach ${header} gruppieren`,\n hideColumn: 'Spalte ausblenden',\n insertRowAbove: 'Zeile darüber einfügen',\n insertRowBelow: 'Zeile darunter einfügen',\n lastPage: 'Letzte Seite',\n loading: 'Wird geladen...',\n markRow: 'Zeile zum Kopieren markieren',\n moreInformation: 'Weitere Informationen',\n next: 'Weiter',\n noRows: 'Keine Zeilen vorhanden',\n pagination: 'Seitennavigation',\n pivot: 'Pivot',\n pivotDescription: 'Felder für das Pivot-Ergebnis konfigurieren.',\n pivotRows: 'Zeilen',\n pivotColumns: 'Spalten',\n pivotValues: 'Werte',\n pinColumn: 'Links fixieren',\n pinColumnRight: 'Rechts fixieren',\n unpinColumnRight: 'Rechts lösen',\n pinRowTop: 'Zeile oben fixieren',\n pinRowBottom: 'Zeile unten fixieren',\n unpinRow: 'Zeilenfixierung lösen',\n previous: 'Zurück',\n resizeColumn: 'Spaltenbreite ändern',\n expand: 'Ausklappen',\n rows: count => `${count} ${count === 1 ? 'Zeile' : 'Zeilen'}`,\n quickFilterPlaceholder: 'Alle Spalten durchsuchen...',\n searchValuesPlaceholder: 'Werte suchen...',\n selectAll: '(Alle auswählen)',\n sortOnlyByThis: 'Nur nach dieser Spalte sortieren',\n sortAscending: 'Aufsteigend sortieren',\n sortDescending: 'Absteigend sortieren',\n ungroup: 'Gruppierung aufheben',\n unpinColumn: 'Fixierung lösen',\n save: 'Speichern',\n saveConfig: 'Konfig.speichern',\n export:'Export',\n exportCsv:'Export nach csv',\n exportXlsx:'Export nach xlsx',\n templates:' Vorlagen'\n },\n};\n\n/** Resolves 'auto' to the browser's navigator.language, falling back to 'en-US'. */\nexport function resolveLocale(locale: string): string {\n if (locale !== 'auto') return locale;\n return (typeof navigator !== 'undefined' ? navigator.language : null) ?? 'en-US';\n}\n\n/**\n * Resolves built-in locale text and merges the best matching custom overrides.\n *\n * Matching prefers an exact locale key, then a primary-language match.\n */\nexport function resolveAgridLocaleText(\n locale: string | undefined,\n localizations: ReadonlyMap<string, AgridLocaleTextOverrides>,\n): AgridLocaleText {\n const resolved = resolveLocale(locale ?? 'auto');\n const normalized = resolved.toLowerCase();\n const primaryTag = normalized.split('-')[0];\n\n const base = normalized.startsWith('de') ? AGRID_LOCALE_TEXT.de : AGRID_LOCALE_TEXT.en;\n\n // Prefer exact match (case-insensitive), fall back to primary-language match (e.g. 'fr' matches 'fr-FR')\n let overrides: AgridLocaleTextOverrides | undefined;\n for (const [key, value] of localizations) {\n const k = key.toLowerCase();\n if (k === normalized) { overrides = value; break; }\n if (!overrides && k.split('-')[0] === primaryTag) { overrides = value; }\n }\n\n return { ...base, ...overrides };\n}\n","import { ColumnFilter } from './agrid-control';\nimport {\n AgridExportGroup,\n AgridPathTreeConfig,\n AgridTreeConfig,\n ColDef,\n DetailRowItem,\n GridItem,\n PathTreeNodeItem,\n TreeRowItem,\n ValueOption,\n} from './agrid.types';\n\n// Display resolution\n\n// Matches YYYY-MM-DD with optional time component — strict enough to avoid false positives.\nconst ISO_DATE_RE = /^\\d{4}-\\d{2}-\\d{2}(T\\d{2}:\\d{2}(:\\d{2}(\\.\\d+)?)?(Z|[+-]\\d{2}:?\\d{2})?)?$/;\n\n/** Returns true if the value is a Date object or an ISO date string. */\nexport function looksLikeDate(raw: unknown): boolean {\n if (raw instanceof Date) return true;\n if (typeof raw === 'string') return ISO_DATE_RE.test(raw.trim());\n return false;\n}\n\n/**\n * Formats a raw value as a human-readable date string.\n * Accepts Date objects and ISO strings.\n * Returns empty string for null/undefined, raw string if unparseable.\n */\nexport function formatDateValue(raw: unknown, locale?: string, calendarDate = false): string {\n if (raw == null || raw === '') return '';\n const dateInputValue = calendarDate ? getDateInputValue(raw) : '';\n const d = dateInputValue\n ? new Date(`${dateInputValue}T00:00:00.000Z`)\n : raw instanceof Date ? raw : new Date(raw as string);\n if (isNaN(d.getTime())) return String(raw);\n return d.toLocaleDateString(locale, {\n year: 'numeric',\n month: 'short',\n day: 'numeric',\n ...(calendarDate ? { timeZone: 'UTC' } : {}),\n });\n}\n\n/** Converts a supported date value to the `YYYY-MM-DD` format required by date inputs. */\nexport function getDateInputValue(raw: unknown): string {\n if (raw == null || raw === '') return '';\n const date = raw instanceof Date ? raw : new Date(raw as string);\n return Number.isNaN(date.getTime()) ? '' : date.toISOString().slice(0, 10);\n}\n\n/**\n * Converts a date input value back to the storage form used by the original value.\n *\n * `Date` objects remain `Date` objects. ISO timestamps retain their original time and zone\n * suffix, while date-only strings and previously empty values remain date-only strings.\n */\nexport function coerceDateInputValue(value: string, originalValue: unknown): unknown {\n if (value === '') return '';\n if (originalValue instanceof Date) return new Date(`${value}T00:00:00.000Z`);\n if (\n typeof originalValue === 'string'\n && /^\\d{4}-\\d{2}-\\d{2}T/.test(originalValue)\n ) {\n return `${value}${originalValue.slice(10)}`;\n }\n return value;\n}\n\n/**\n * Converts a numeric editor draft to its storage value.\n * Both dot and comma are accepted as decimal separators; invalid drafts are preserved so\n * column validation can report them instead of silently changing the user's input.\n */\nexport function coerceNumberInputValue(value: unknown): unknown {\n if (typeof value !== 'string') return value;\n const trimmed = value.trim();\n if (trimmed === '') return null;\n const numeric = Number(trimmed.includes('.') ? trimmed : trimmed.replace(',', '.'));\n return Number.isNaN(numeric) ? value : numeric;\n}\n\n/** Resolve the display string for a raw cell value via ValueOption label, formatter, or coercion. */\nexport function getDisplayForField(col: ColDef | undefined, raw: unknown, locale?: string): string {\n if (!col) return String(raw ?? '');\n if (col.values?.length) {\n const opt = col.values.find(v =>\n typeof v === 'string' ? v === raw : (v as ValueOption).value === raw\n );\n if (opt !== undefined) return typeof opt === 'string' ? opt : (opt as ValueOption).label;\n }\n if (col.formatter) return col.formatter(raw);\n if (col.type === 'date' || looksLikeDate(raw)) {\n return formatDateValue(raw, locale, col.type === 'date');\n }\n return String(raw ?? '');\n}\n\n/** Returns whether a virtual-scroll item represents a data row. */\nexport function isDataRowItem<T extends object>(\n item: GridItem<T>,\n): item is { row: T; originalIndex: number } {\n return typeof item === 'object' && item !== null && 'row' in item && !('detailFor' in item);\n}\n\n/** Returns whether a virtual-scroll item represents a master/detail panel row. */\nexport function isDetailRowItem<T extends object>(item: GridItem<T>): item is DetailRowItem<T> {\n return typeof item === 'object' && item !== null && 'detailFor' in item;\n}\n\n/** Returns whether a virtual-scroll item represents a group header. */\nexport function isGroupHeaderItem(\n item: GridItem,\n): item is { groupLabel: string; count: number; collapsed: boolean; aggregates?: Record<string, unknown> } {\n return typeof item === 'object' && item !== null && 'groupLabel' in item;\n}\n\n/**\n * Returns whether a virtual-scroll item represents a tree row.\n *\n * Tree rows also pass {@link isDataRowItem} (they carry `row` + `originalIndex`); this guard\n * additionally narrows to the indentation/expansion fields via the `level` discriminator.\n */\nexport function isTreeRowItem<T extends object>(item: GridItem<T>): item is TreeRowItem<T> {\n return isDataRowItem(item) && 'level' in item;\n}\n\n/** Returns whether a virtual-scroll item is a generated path-tree branch node. */\nexport function isPathTreeNodeItem(item: GridItem): item is PathTreeNodeItem {\n return typeof item === 'object' && item !== null && 'pathNodeId' in item;\n}\n\n/** Returns whether a tree configuration derives its hierarchy from path segments. */\nexport function isPathTreeConfig<T extends object>(\n config: AgridTreeConfig<T>,\n): config is AgridPathTreeConfig<T> {\n return typeof config.getPath === 'function';\n}\n\n// Filtering\n\n/** Apply text substring and value-set filters, returning the surviving row indices. */\nexport function applyTextAndValueFilters(\n rows: Record<string, unknown>[],\n indices: number[],\n filters: Record<string, ColumnFilter>,\n colMap: Map<string, ColDef>,\n locale?: string,\n): number[] {\n let result = indices;\n for (const [field, filter] of Object.entries(filters)) {\n const col = colMap.get(field);\n if (filter.text) {\n const lc = filter.text.toLowerCase();\n result = result.filter(i => getDisplayForField(col, rows[i][field], locale).toLowerCase().includes(lc));\n }\n if (filter.selectedValues !== null) {\n const allowed = new Set(filter.selectedValues);\n result = result.filter(i => allowed.has(String(rows[i][field] ?? '')));\n }\n if (filter.operator && filter.operand != null && filter.operand !== '') {\n result = result.filter(i => passesConditionFilter(col, rows[i][field], filter, locale));\n }\n }\n return result;\n}\n\n/**\n * Evaluate a text, number, or date condition for one cell value.\n */\nexport function passesConditionFilter(\n col: ColDef | undefined,\n raw: unknown,\n filter: ColumnFilter,\n locale?: string,\n): boolean {\n if (col?.type !== 'number' && col?.type !== 'date') {\n const value = getDisplayForField(col, raw, locale).toLocaleLowerCase(locale);\n const operand = String(filter.operand ?? '').toLocaleLowerCase(locale);\n switch (filter.operator) {\n case 'eq': return value === operand;\n case 'neq': return value !== operand;\n case 'startsWith': return value.startsWith(operand);\n case 'endsWith': return value.endsWith(operand);\n case 'includes': return value.includes(operand);\n case 'notIncludes': return !value.includes(operand);\n case 'like': {\n const escaped = operand.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&');\n const pattern = escaped.replace(/%/g, '.*').replace(/_/g, '.');\n return new RegExp(`^${pattern}$`, 'u').test(value);\n }\n default: return true;\n }\n }\n\n const isDate = col?.type === 'date' || looksLikeDate(raw);\n const toNum = (v: unknown): number =>\n isDate\n ? (v instanceof Date ? v.getTime() : new Date(v as string).getTime())\n : Number(v);\n const value = toNum(raw);\n if (Number.isNaN(value)) return false;\n const a = toNum(filter.operand);\n if (Number.isNaN(a)) return true;\n switch (filter.operator) {\n case 'eq': return value === a;\n case 'neq': return value !== a;\n case 'gt': return value > a;\n case 'gte': return value >= a;\n case 'lt': return value < a;\n case 'lte': return value <= a;\n case 'between': {\n const b = toNum(filter.operand2);\n if (Number.isNaN(b)) return value >= a;\n return value >= Math.min(a, b) && value <= Math.max(a, b);\n }\n default: return true;\n }\n}\n\n/**\n * Keep only the rows where at least one of the given columns' display value contains\n * `text` (case-insensitive). An empty/whitespace `text` returns the indices unchanged.\n */\nexport function applyQuickFilter(\n rows: Record<string, unknown>[],\n indices: number[],\n text: string,\n cols: ColDef[],\n locale?: string,\n): number[] {\n const q = text.trim().toLowerCase();\n if (!q) return indices;\n return indices.filter(i =>\n cols.some(col => getDisplayForField(col, rows[i][col.field], locale).toLowerCase().includes(q)),\n );\n}\n\n// Sorting\n\n/**\n * Sort indices by one or more columns in priority order.\n * Each entry is `[field, ColumnFilter]`; the first entry has the highest priority.\n * Ties are broken by subsequent entries.\n */\nexport function applySortToIndices(\n rows: Record<string, unknown>[],\n indices: number[],\n sortEntries: [string, ColumnFilter][],\n colMap: Map<string, ColDef>,\n locale?: string,\n): number[] {\n if (sortEntries.length === 0) return indices;\n\n const collator = new Intl.Collator(locale, { numeric: true, sensitivity: 'base' });\n const fields = sortEntries.map(([field, filter]) => {\n const col = colMap.get(field);\n const dateLike = new Uint8Array(indices.length);\n const dateValues = new Float64Array(indices.length);\n const numericValues = new Float64Array(indices.length);\n numericValues.fill(Number.NaN);\n const displayValues = new Array<string>(indices.length);\n\n for (let position = 0; position < indices.length; position++) {\n const index = indices[position];\n const raw = rows[index][field];\n const isDateLike = col?.type === 'date' || looksLikeDate(raw);\n const dateValue = isDateLike\n ? raw instanceof Date ? raw.getTime() : new Date(raw as string).getTime()\n : Number.NaN;\n const numericValue = col?.type === 'number'\n && !col.formatter\n && !col.values?.length\n && typeof raw === 'number'\n && Number.isFinite(raw)\n ? raw\n : Number.NaN;\n dateLike[position] = isDateLike ? 1 : 0;\n dateValues[position] = Number.isNaN(dateValue) ? -1 : dateValue;\n numericValues[position] = numericValue;\n displayValues[position] = isDateLike ? '' : getDisplayForField(col, raw, locale);\n }\n\n return {\n direction: filter.sort === 'desc' ? -1 : 1,\n dateLike,\n dateValues,\n numericValues,\n displayValues,\n };\n });\n const positions = Array.from({ length: indices.length }, (_, position) => position);\n\n positions.sort((a, b) => {\n for (let fieldIndex = 0; fieldIndex < fields.length; fieldIndex++) {\n const field = fields[fieldIndex];\n let comparison: number;\n if (field.dateLike[a] || field.dateLike[b]) {\n comparison = field.dateValues[a] - field.dateValues[b];\n } else if (\n !Number.isNaN(field.numericValues[a])\n && !Number.isNaN(field.numericValues[b])\n ) {\n comparison = field.numericValues[a] - field.numericValues[b];\n } else {\n comparison = collator.compare(field.displayValues[a], field.displayValues[b]);\n }\n if (comparison !== 0) {\n return comparison * field.direction;\n }\n }\n return a - b;\n });\n\n return positions.map(position => indices[position]);\n}\n\n// Grouping\n\n/**\n * Bucket rows by the display value of `groupField`, sort group keys alphabetically,\n * optionally sort within groups by a secondary sort, and interleave group-header items.\n * Does NOT append the add-row null sentinel — the caller does that.\n */\n/** Built-in aggregate function names shared by footers, groups, and tree-node rollups. */\ntype BuiltinAggregate = 'sum' | 'avg' | 'min' | 'max' | 'count';\n\n/**\n * Compute aggregate values for the given rows across every column that has a static\n * (`ColDef.aggregate`) or control-configured aggregate. Returns a `field → value` map containing\n * only aggregated columns. Shared by the grid footer, per-group subtotals, and tree-node rollups.\n *\n * Numeric aggregates coerce values through `Number`; nonnumeric values are skipped. `count`\n * counts non-null/non-empty values, while custom functions receive all raw values in index order.\n * A control aggregate takes precedence over the static column definition.\n *\n * @param rows Complete datasource rows addressed by `indices`.\n * @param indices Source indices included in this aggregate, in projection order.\n * @param cols Columns inspected for static or runtime aggregate configuration.\n * @param controlAggregates Runtime aggregate overrides keyed by field.\n * @returns A field-to-result map containing only configured aggregate columns.\n */\nexport function computeAggregates(\n rows: Record<string, unknown>[],\n indices: number[],\n cols: ColDef[],\n controlAggregates: Record<string, BuiltinAggregate>,\n): Record<string, unknown> {\n const result: Record<string, unknown> = {};\n for (const col of cols) {\n const aggregate: ColDef['aggregate'] = controlAggregates[col.field] ?? col.aggregate;\n if (!aggregate) continue;\n if (typeof aggregate === 'function') {\n const values = indices.map(index => rows[index][col.field]);\n result[col.field] = (aggregate as (values: unknown[]) => unknown)(values);\n continue;\n }\n\n let count = 0;\n let numericCount = 0;\n let sum = 0;\n let min = Infinity;\n let max = -Infinity;\n for (const index of indices) {\n const raw = rows[index][col.field];\n if (raw != null && raw !== '') count++;\n\n const value = Number(raw);\n if (Number.isNaN(value)) continue;\n numericCount++;\n sum += value;\n if (value < min) min = value;\n if (value > max) max = value;\n }\n\n switch (aggregate) {\n case 'sum':\n result[col.field] = sum;\n break;\n case 'avg':\n result[col.field] = numericCount ? sum / numericCount : null;\n break;\n case 'min':\n result[col.field] = numericCount ? min : null;\n break;\n case 'max':\n result[col.field] = numericCount ? max : null;\n break;\n case 'count':\n result[col.field] = count;\n break;\n }\n }\n return result;\n}\n\n/**\n * Groups filtered/sorted source rows by `groupField`'s display value for export, in first-seen\n * order, attaching each group's per-column subtotals. Unlike the on-screen projection, every group\n * is fully expanded and no pagination is applied, so the result is the complete grouped dataset.\n */\nexport function buildExportGroups(\n rows: Record<string, unknown>[],\n indices: number[],\n groupField: string,\n groupCol: ColDef | undefined,\n cols: ColDef[],\n controlAggregates: Record<string, BuiltinAggregate>,\n locale?: string,\n): AgridExportGroup[] {\n const order: string[] = [];\n const byLabel = new Map<string, number[]>();\n for (const index of indices) {\n const row = rows[index];\n if (!row) continue;\n const label = getDisplayForField(groupCol, row[groupField], locale);\n let bucket = byLabel.get(label);\n if (!bucket) {\n bucket = [];\n byLabel.set(label, bucket);\n order.push(label);\n }\n bucket.push(index);\n }\n return order.map(label => {\n const groupIndices = byLabel.get(label) as number[];\n return {\n label,\n rows: groupIndices.map(index => rows[index]),\n aggregates: computeAggregates(rows, groupIndices, cols, controlAggregates),\n };\n });\n}\n\nexport function buildGroupedItems(\n rows: Record<string, unknown>[],\n indices: number[],\n groupField: string,\n colMap: Map<string, ColDef>,\n sortEntries: [string, ColumnFilter][],\n expandedLabels: Set<string>,\n locale?: string,\n aggregateCols: ColDef[] = [],\n controlAggregates: Record<string, BuiltinAggregate> = {},\n): GridItem[] {\n const hasAggregates = aggregateCols.some(\n col => controlAggregates[col.field] ?? col.aggregate,\n );\n const groupCol = colMap.get(groupField);\n\n const groups = new Map<string, number[]>();\n for (const i of indices) {\n const key = getDisplayForField(groupCol, rows[i][groupField], locale);\n if (!groups.has(key)) groups.set(key, []);\n groups.get(key)!.push(i);\n }\n\n const sortedKeys = [...groups.keys()].sort((a, b) =>\n a.localeCompare(b, locale, { sensitivity: 'base' })\n );\n\n const nonGroupSorts = sortEntries.filter(([f]) => f !== groupField);\n if (nonGroupSorts.length > 0) {\n for (const [, groupRows] of groups) {\n const sorted = applySortToIndices(rows, groupRows, nonGroupSorts, colMap, locale);\n groupRows.splice(0, groupRows.length, ...sorted);\n }\n }\n\n const items: GridItem[] = [];\n for (const key of sortedKeys) {\n const groupRows = groups.get(key)!;\n const isExpanded = expandedLabels.has(key);\n const aggregates = hasAggregates\n ? computeAggregates(rows, groupRows, aggregateCols, controlAggregates)\n : undefined;\n items.push({ groupLabel: key, count: groupRows.length, collapsed: !isExpanded, aggregates });\n if (isExpanded) {\n for (const i of groupRows) items.push({ row: rows[i], originalIndex: i });\n }\n }\n return items;\n}\n\n/** Row accessors required to flatten a hierarchy. @internal */\nexport interface TreeAccessors<T extends object> {\n getId: (row: T) => string | number;\n getParentId: (row: T) => string | number | null | undefined;\n}\n\n/**\n * Flatten a parent/child hierarchy into a depth-first list of {@link TreeRowItem}s for the\n * virtual scroll list, honoring the expanded-id set.\n *\n * `indices` is the already filtered and sorted set of source-array positions; sibling order\n * follows that order. A row is treated as a **root** when its parent id is `null`/`undefined`\n * or when that parent is not present in `indices` (orphan). Children of a collapsed row are\n * omitted. Cycles and rows visited more than once are guarded so the walk always terminates.\n *\n * @param rows The full data-source array.\n * @param indices Filtered/sorted source positions to include, in display order.\n * @param accessors `getId` / `getParentId` for the rows.\n * @param expandedIds Ids whose children should be rendered.\n * @param forceExpandedIds Ids forced open regardless of `expandedIds` — used to reveal the\n * ancestor path of filter matches. Optional.\n * @param aggregateCols Columns whose configured aggregate should be attached to expandable nodes.\n * Pass an empty array to disable tree rollups.\n * @param controlAggregates Runtime aggregate overrides. These take precedence over each column's\n * static aggregate function.\n * @returns Visible tree rows. Expandable rows include `aggregates` when aggregation is enabled.\n */\nexport function buildTreeItems<T extends object>(\n rows: T[],\n indices: number[],\n accessors: TreeAccessors<T>,\n expandedIds: Set<string | number>,\n forceExpandedIds?: Set<string | number>,\n aggregateCols: ColDef[] = [],\n controlAggregates: Record<string, BuiltinAggregate> = {},\n): GridItem<T>[] {\n const { getId, getParentId } = accessors;\n\n const includedIds = new Set<string | number>();\n for (const i of indices) includedIds.add(getId(rows[i]));\n\n // Bucket each included row under its parent, preserving the incoming (sorted) order.\n const childrenByParent = new Map<string | number, number[]>();\n const roots: number[] = [];\n for (const i of indices) {\n const parentId = getParentId(rows[i]);\n if (parentId == null || !includedIds.has(parentId)) {\n roots.push(i);\n continue;\n }\n const siblings = childrenByParent.get(parentId);\n if (siblings) siblings.push(i);\n else childrenByParent.set(parentId, [i]);\n }\n\n const items: GridItem<T>[] = [];\n const visited = new Set<string | number>();\n const hasAggregates = aggregateCols.some(\n col => controlAggregates[col.field] ?? col.aggregate,\n );\n\n // Cache each subtree's leaf indices. Besides preventing repeated traversal for nested visible\n // parents, leaf-only aggregation avoids double-counting parent rows that store their own subtotal.\n // This walk uses the complete filtered hierarchy and is intentionally independent of expansion.\n const leafMemo = new Map<string | number, number[]>();\n const collectLeaves = (index: number, visiting = new Set<string | number>()): number[] => {\n const id = getId(rows[index]);\n const cached = leafMemo.get(id);\n if (cached) return cached;\n // A cyclic edge cannot produce a valid leaf. Excluding that edge keeps aggregation finite and\n // matches the renderer's existing policy of omitting duplicate/cyclic visits.\n if (visiting.has(id)) return [];\n visiting.add(id);\n const children = childrenByParent.get(id);\n const leaves = children?.length\n ? children.flatMap(childIndex => collectLeaves(childIndex, visiting))\n : [index];\n visiting.delete(id);\n leafMemo.set(id, leaves);\n return leaves;\n };\n\n const visit = (index: number, level: number): void => {\n const row = rows[index];\n const id = getId(row);\n if (visited.has(id)) return; // cycle / duplicate-parent guard\n visited.add(id);\n\n const children = childrenByParent.get(id);\n const expandable = !!children?.length;\n const expanded = expandable && (expandedIds.has(id) || !!forceExpandedIds?.has(id));\n const aggregates = expandable && hasAggregates\n ? computeAggregates(\n rows as unknown as Record<string, unknown>[],\n collectLeaves(index),\n aggregateCols,\n controlAggregates,\n )\n : undefined;\n items.push({ row, originalIndex: index, level, expandable, expanded, aggregates });\n\n if (expanded && children) {\n for (const childIndex of children) visit(childIndex, level + 1);\n }\n };\n\n for (const rootIndex of roots) visit(rootIndex, 0);\n return items;\n}\n\n/**\n * Return the stable expansion key for a generated path prefix.\n * String normalization makes numeric and string path segments share the same branch identity.\n */\nexport function pathTreeNodeId(path: readonly (string | number)[]): string {\n return `__agrid_path__${JSON.stringify(path.map(String))}`;\n}\n\n/**\n * Derive a deterministic UUID-shaped identifier for a generated path branch.\n *\n * This is an identity helper, not a cryptographic hash. Four independently mixed 32-bit lanes\n * provide stable output, after which the version and variant nibbles are normalized to a\n * v5-shaped UUID layout. It does not implement RFC 4122 namespace/SHA-1 UUID generation.\n */\nexport function pathTreeNodeUuid(path: readonly (string | number)[]): string {\n const source = JSON.stringify(path.map(String));\n let a = 0x9e3779b9;\n let b = 0x85ebca6b;\n let c = 0xc2b2ae35;\n let d = 0x27d4eb2f;\n\n for (let i = 0; i < source.length; i++) {\n const code = source.charCodeAt(i);\n a = Math.imul(a ^ code, 0x85ebca6b);\n b = Math.imul(b ^ code, 0xc2b2ae35);\n c = Math.imul(c ^ code, 0x27d4eb2f);\n d = Math.imul(d ^ code, 0x165667b1);\n }\n\n const hex = [a, b, c, d]\n .map(value => (value >>> 0).toString(16).padStart(8, '0'))\n .join('')\n .split('');\n hex[12] = '5';\n hex[16] = ((parseInt(hex[16], 16) & 0x3) | 0x8).toString(16);\n return `${hex.slice(0, 8).join('')}-${hex.slice(8, 12).join('')}-${hex.slice(12, 16).join('')}-${hex.slice(16, 20).join('')}-${hex.slice(20, 32).join('')}`;\n}\n\n/**\n * Build a depth-first projection from datasource paths.\n *\n * Every non-final path segment becomes a display-only {@link PathTreeNodeItem}; the final segment\n * remains a datasource-backed {@link TreeRowItem}. Shared prefixes are coalesced by their stable\n * path id. When aggregate columns are supplied, each generated branch receives values computed\n * over every datasource row sharing that prefix, regardless of expansion state.\n *\n * @param rows Complete datasource rows.\n * @param indices Filtered and sorted datasource indices included in the tree.\n * @param config Path extraction, labeling, and identity configuration.\n * @param expandedIds Generated branch ids whose children should be emitted.\n * @param forceExpanded Whether filtering should reveal every generated branch in the projection.\n * @param aggregateCols Columns whose configured aggregates should be attached to branch nodes.\n * @param controlAggregates Runtime aggregate overrides keyed by field.\n * @returns Visible generated branches and datasource leaves in depth-first order.\n */\nexport function buildPathTreeItems<T extends object>(\n rows: T[],\n indices: number[],\n config: AgridPathTreeConfig<T>,\n expandedIds: Set<string | number>,\n forceExpanded = false,\n aggregateCols: ColDef[] = [],\n controlAggregates: Record<string, BuiltinAggregate> = {},\n): GridItem<T>[] {\n /** Mutable construction node used before branches are flattened into immutable grid items. */\n type Branch = {\n /** Stable expansion identity derived from the complete path prefix. */\n id: string;\n /** Consumer-facing UUID, either host supplied or deterministically generated. */\n uuid: string;\n /** Formatted segment displayed for this prefix. */\n label: string;\n /** Zero-based tree depth; `-1` denotes the hidden root for one-segment paths. */\n level: number;\n /** Nested branch prefixes, preserving first-seen datasource order. */\n children: Map<string, Branch>;\n /** Datasource-backed final path segments directly below this branch. */\n leaves: { originalIndex: number; label: string }[];\n /** All datasource indices sharing this prefix, including leaves in nested branches. */\n descendantIndices: number[];\n };\n\n const roots = new Map<string, Branch>();\n for (const originalIndex of indices) {\n const rawPath = config.getPath(rows[originalIndex]).filter(\n segment => String(segment).length > 0,\n );\n if (rawPath.length === 0) continue;\n const path = rawPath.map(String);\n const formatSegment = (level: number, leaf: boolean): string =>\n config.formatPathSegment?.({\n row: rows[originalIndex],\n segment: rawPath[level],\n level,\n path: rawPath.slice(0, level + 1),\n leaf,\n }) ?? path[level];\n const resolveNodeUuid = (prefix: readonly string[]): string =>\n String(config.nodeUuid?.(rows[originalIndex])\n ?? config.nodeUUid?.(rows[originalIndex])\n ?? pathTreeNodeUuid(prefix));\n let branches = roots;\n for (let level = 0; level < path.length - 1; level++) {\n const prefix = path.slice(0, level + 1);\n const id = pathTreeNodeId(prefix);\n let branch = branches.get(id);\n if (!branch) {\n branch = {\n id,\n uuid: resolveNodeUuid(prefix),\n label: formatSegment(level, false),\n level,\n children: new Map(),\n leaves: [],\n descendantIndices: [],\n };\n branches.set(id, branch);\n }\n branch.descendantIndices.push(originalIndex);\n if (level === path.length - 2) {\n branch.leaves.push({\n originalIndex,\n label: formatSegment(path.length - 1, true),\n });\n }\n branches = branch.children;\n }\n if (path.length === 1) {\n const id = pathTreeNodeId([]);\n let branch = roots.get(id);\n if (!branch) {\n branch = {\n id,\n uuid: resolveNodeUuid([]),\n label: '',\n level: -1,\n children: new Map(),\n leaves: [],\n descendantIndices: [],\n };\n roots.set(id, branch);\n }\n branch.leaves.push({ originalIndex, label: formatSegment(0, true) });\n branch.descendantIndices.push(originalIndex);\n }\n }\n\n const items: GridItem<T>[] = [];\n const hasAggregates = aggregateCols.some(\n col => controlAggregates[col.field] ?? col.aggregate,\n );\n const visit = (branch: Branch): void => {\n const isHiddenRoot = branch.level < 0;\n const expanded = forceExpanded || expandedIds.has(branch.id);\n if (!isHiddenRoot) {\n items.push({\n uuid: branch.uuid,\n pathNodeId: branch.id,\n pathLabel: branch.label,\n level: branch.level,\n expandable: true,\n expanded,\n aggregates: hasAggregates\n ? computeAggregates(\n rows as unknown as Record<string, unknown>[],\n branch.descendantIndices,\n aggregateCols,\n controlAggregates,\n )\n : undefined,\n });\n }\n if (!isHiddenRoot && !expanded) return;\n for (const child of branch.children.values()) visit(child);\n for (const leaf of branch.leaves) {\n items.push({\n row: rows[leaf.originalIndex],\n originalIndex: leaf.originalIndex,\n level: isHiddenRoot ? 0 : branch.level + 1,\n expandable: false,\n expanded: false,\n treeLabel: leaf.label,\n });\n }\n };\n for (const branch of roots.values()) visit(branch);\n return items;\n}\n\n// Selection range\n\n/** Build the set of original indices spanning from `fromOrig` to `toOrig` in display order. */\nexport function buildSelectionRange(fromOrig: number, toOrig: number, items: GridItem[]): Set<number> {\n const fromDisp = items.findIndex(item => isDataRowItem(item) && item.originalIndex === fromOrig);\n const toDisp = items.findIndex(item => isDataRowItem(item) && item.originalIndex === toOrig);\n if (fromDisp === -1 || toDisp === -1) return new Set();\n const [lo, hi] = [Math.min(fromDisp, toDisp), Math.max(fromDisp, toDisp)];\n const next = new Set<number>();\n for (let i = lo; i <= hi; i++) {\n const item = items[i];\n if (isDataRowItem(item)) next.add(item.originalIndex);\n }\n return next;\n}\n\n/** Test a complete proposed editor value against a regex input mask. */\nexport function matchesInputMask(value: unknown, mask: RegExp): boolean {\n const flags = mask.flags.replace(/[gy]/g, '');\n return new RegExp(`^(?:${mask.source})$`, flags).test(String(value ?? ''));\n}\n","import { ColDef } from '../agrid.types';\n\n/** Resolved horizontal layout for one cell within one pane. @internal */\nexport interface AgridCellSpanLayout {\n covered: boolean;\n span: number;\n}\n\n/** Anchor column and width covering a requested pane-local column. @internal */\nexport interface AgridCellSpanAnchor {\n anchorIndex: number;\n span: number;\n}\n\n/** Resolves and sanitizes a configured span without allowing it to leave its pane. @internal */\nexport function resolveCellSpan<T extends object>(\n col: ColDef<T>,\n row: T,\n originalIndex: number,\n remainingColumns: number,\n): number {\n const configured = typeof col.colSpan === 'function'\n ? col.colSpan({ row, value: row[col.field], column: col, originalIndex })\n : col.colSpan;\n const span = Number.isFinite(configured) ? Math.floor(configured as number) : 1;\n return Math.max(1, Math.min(span, remainingColumns));\n}\n\n/** Computes whether a pane cell is an anchor or covered by an earlier anchor. @internal */\nexport function resolveCellSpanLayout<T extends object>(\n columns: readonly ColDef<T>[],\n columnIndex: number,\n row: T,\n originalIndex: number,\n): AgridCellSpanLayout {\n if (columnIndex < 0 || columnIndex >= columns.length) return { covered: false, span: 1 };\n\n const anchor = resolveCellSpanAnchor(columns, columnIndex, row, originalIndex);\n return anchor.anchorIndex === columnIndex\n ? { covered: false, span: anchor.span }\n : { covered: true, span: 1 };\n}\n\n/** Finds the rendered anchor that owns a pane-local logical column. @internal */\nexport function resolveCellSpanAnchor<T extends object>(\n columns: readonly ColDef<T>[],\n columnIndex: number,\n row: T,\n originalIndex: number,\n): AgridCellSpanAnchor {\n if (columnIndex < 0 || columnIndex >= columns.length) {\n return { anchorIndex: columnIndex, span: 1 };\n }\n\n let coveredUntil = 0;\n for (let index = 0; index <= columnIndex;) {\n const span = resolveCellSpan(\n columns[index],\n row,\n originalIndex,\n columns.length - index,\n );\n coveredUntil = index + span;\n if (columnIndex < coveredUntil) return { anchorIndex: index, span };\n index = coveredUntil;\n }\n return { anchorIndex: columnIndex, span: 1 };\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n Injector,\n computed,\n effect,\n inject,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { NgComponentOutlet } from '@angular/common';\nimport { CellFormat, ColDef, ValueOption } from '../agrid.types';\nimport { AGRID_EDITOR_CONTEXT, AgridEditorContext } from '../editing/agrid-cell-editor';\nimport { AGRID_RENDERER_CONTEXT, AgridRendererContext } from './agrid-cell-renderer';\nimport { AgridLocaleText, AGRID_LOCALE_TEXT } from '../agrid-localization';\nimport {\n coerceDateInputValue,\n getDisplayForField,\n getDateInputValue,\n matchesInputMask,\n} from '../agrid.utils';\nimport { resolveCellSpanLayout } from './agrid-cell-span';\n\n/**\n * Individual cell component used inside `AgridComponent`.\n *\n * Renders a read-only span when not editing, and an `<input>` or `<select>`\n * (for columns with `ColDef.values`) when in edit mode.\n *\n * Not intended for direct use — `AgridComponent` manages all inputs and outputs.\n */\n@Component({\n selector: 'agrid-cell',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [NgComponentOutlet],\n host: {\n role: 'gridcell',\n '[class.selected]': 'selected()',\n '[class.editing]': 'editing()',\n '[class.ag-cell--tree]': 'treeCell()',\n '[class.ag-cell--with-info]': 'showInfoIcon() && !editing()',\n '[attr.aria-readonly]': '!editable() ? \"true\" : null',\n '[attr.aria-colspan]': 'cellSpanLayout().span > 1 ? cellSpanLayout().span : null',\n '[style.display]': 'cellSpanLayout().covered ? \"none\" : null',\n '[style.grid-column]': 'cellSpanLayout().span > 1 ? \"span \" + cellSpanLayout().span : null',\n '[attr.title]': 'displayValue()',\n '[style.background-color]': 'resolvedCellFormat().backgroundColor ?? null',\n '[style.border-color]': 'resolvedCellFormat().borderColor ?? null',\n '[style.color]': 'resolvedCellFormat().color ?? null',\n '[style.font]': 'resolvedCellFormat().font ?? null',\n '[style.font-family]': 'resolvedCellFormat().fontFamily ?? null',\n '[style.font-size]': 'resolvedCellFormat().fontSize ?? null',\n '[style.font-style]': 'resolvedCellFormat().fontStyle ?? null',\n '[style.font-weight]': 'resolvedCellFormat().fontWeight ?? null',\n '[style.text-decoration]': 'resolvedCellFormat().textDecoration ?? null',\n '[style.text-align]': 'resolvedTextAlign()',\n '(click)': 'activate.emit($event)',\n '(dblclick)': 'startEdit.emit()',\n tabindex: '-1',\n },\n template: `\n @if (booleanCell()) {\n <input\n type=\"checkbox\"\n class=\"ag-cell-checkbox\"\n [checked]=\"booleanChecked()\"\n [disabled]=\"!editable()\"\n [attr.aria-label]=\"col().header\"\n (click)=\"onCheckboxClick($event)\"\n (dblclick)=\"$event.stopPropagation()\"\n />\n } @else if (editing()) {\n @if (col().cellEditor; as editor) {\n <div\n class=\"ag-cell-editor\"\n (pointerdown)=\"$event.stopPropagation()\"\n (click)=\"$event.stopPropagation()\"\n (dblclick)=\"$event.stopPropagation()\"\n >\n <ng-container [ngComponentOutlet]=\"editor\" [ngComponentOutletInjector]=\"editorInjector\" />\n </div>\n } @else if (col().values?.length) {\n <select\n #editSelect\n class=\"ag-cell-select\"\n (change)=\"onSelectChange($event)\"\n >\n @for (opt of valueOptions(); track opt.label; let idx = $index) {\n <option [value]=\"idx\" [selected]=\"idx === selectedOptionIndex()\">{{ opt.label }}</option>\n }\n </select>\n } @else {\n <input\n #editInput\n class=\"ag-cell-input\"\n [class.ag-cell-input--invalid]=\"!!error()\"\n [type]=\"col().type === 'date' ? 'date' : 'text'\"\n [attr.inputmode]=\"col().type === 'number' ? 'decimal' : null\"\n [value]=\"editorValue()\"\n (input)=\"onInput($event)\"\n />\n }\n @if (error(); as msg) {\n <span class=\"ag-cell-error\" role=\"alert\">{{ msg }}</span>\n }\n } @else {\n @if (treeCell()) {\n <span class=\"ag-tree-prefix\" [style.padding-left.px]=\"treeLevel() * treeIndent\">\n @if (treeExpandable()) {\n <button\n type=\"button\"\n class=\"ag-tree-twisty\"\n [class.ag-tree-twisty--expanded]=\"treeExpanded()\"\n [attr.aria-label]=\"treeExpanded() ? localeText().collapse : localeText().expand\"\n (click)=\"onTreeToggle($event)\"\n >▶</button>\n } @else {\n <span class=\"ag-tree-twisty-spacer\"></span>\n }\n </span>\n }\n @if (col().cellRendererComponent; as renderer) {\n <ng-container [ngComponentOutlet]=\"renderer\" [ngComponentOutletInjector]=\"rendererInjector\" />\n } @else if (col().cellRenderer) {\n <span class=\"ag-cell-value\" [innerHTML]=\"renderedHtml()\"></span>\n } @else {\n <span class=\"ag-cell-value\">{{ displayValue() }}</span>\n }\n }\n @if (showInfoIcon() && !editing()) {\n <button\n type=\"button\"\n class=\"ag-cell-info\"\n [attr.aria-label]=\"localeText().moreInformation\"\n [title]=\"localeText().moreInformation\"\n (pointerdown)=\"$event.stopPropagation()\"\n (click)=\"onInfoClick($event)\"\n (dblclick)=\"$event.stopPropagation()\"\n >?</button>\n }\n `,\n styleUrl: './agrid-cell.component.css',\n})\nexport class AgridCellComponent {\n localeText = input<AgridLocaleText>(AGRID_LOCALE_TEXT.en);\n /** Column definition for this cell. */\n col = input.required<ColDef>();\n\n /** Visible columns in this cell's pane, used to clamp spans at pane boundaries. */\n paneColumns = input<readonly ColDef[]>([]);\n\n /** Absolute row index within the data source. */\n rowIndex = input.required<number>();\n\n /** Column index within `colDefs`. */\n colIndex = input.required<number>();\n\n /** Current field value from the data source (displayed when not editing). */\n value = input.required<unknown>();\n\n /** Optional display-only text override; editing still uses the original {@link value}. */\n displayValueOverride = input<string | null>(null);\n\n /** Full row data — passed to `cellRenderer` when set. */\n row = input<Record<string, unknown>>({});\n\n /** Horizontal span and coverage state for this row. */\n readonly cellSpanLayout = computed(() => resolveCellSpanLayout(\n this.paneColumns(),\n this.paneColumns().indexOf(this.col()),\n this.row(),\n this.rowIndex(),\n ));\n\n /** Runtime formatting resolved from the column definition and current cell context. */\n readonly resolvedCellFormat = computed((): CellFormat => {\n const col = this.col();\n return col.cellFormat?.({\n row: this.row(),\n value: this.value(),\n column: col,\n originalIndex: this.rowIndex(),\n }) ?? {};\n });\n\n /** Per-cell formatting wins over the column's default text alignment. */\n readonly resolvedTextAlign = computed(() => {\n const configured = this.col().textAlign;\n const columnDefault = typeof configured === 'function' ? configured() : configured;\n return this.resolvedCellFormat().textAlign ?? columnDefault ?? null;\n });\n\n /** Locale used for built-in date formatting. */\n locale = input<string | undefined>(undefined);\n\n /** Whether this cell has the active selection outline. */\n selected = input<boolean>(false);\n\n /** Whether this cell is currently in edit mode. */\n editing = input<boolean>(false);\n\n /** Whether this cell may be edited (drives the boolean checkbox enabled state). */\n editable = input<boolean>(true);\n\n /** Whether a right-aligned information button is visible in this cell. */\n showInfoIcon = input<boolean>(false);\n\n /** Validation error message to show under the editor, or `null` when the value is valid. */\n error = input<string | null>(null);\n\n /** Whether this cell is the tree column and should render indentation + a twisty. */\n treeCell = input<boolean>(false);\n\n /** Depth of the row in the tree (drives indentation). Root rows are `0`. */\n treeLevel = input<number>(0);\n\n /** Whether the row has children and can be expanded/collapsed. */\n treeExpandable = input<boolean>(false);\n\n /** Whether the row is currently expanded. */\n treeExpanded = input<boolean>(false);\n\n /** Emitted when the user clicks the expand/collapse twisty. */\n treeToggle = output<void>();\n\n /** Indentation in pixels applied per tree level. */\n readonly treeIndent = 16;\n\n /**\n * Optional character to pre-fill the edit input when the user presses a printable key\n * while the cell is selected (type-to-start-editing behavior).\n */\n seedChar = input<string>('');\n\n /** Whether an unseeded text editor should select all text when focused. */\n selectTextOnEdit = input<boolean>(true);\n\n /**\n * Emitted on single click — the grid selects this cell.\n * For `values` columns the grid also enters edit mode immediately.\n */\n activate = output<MouseEvent>();\n\n /** Emitted on double-click — the grid enters edit mode. */\n startEdit = output<void>();\n\n /** Emitted when a boolean-column checkbox is toggled, carrying the new value. */\n booleanToggle = output<boolean>();\n\n /** Emitted when the cell's optional information button is clicked. */\n infoClick = output<void>();\n\n /**\n * Emitted on every keystroke inside the edit input or on every select change.\n * The grid stores the latest value in `currentDraft` so it can commit on Tab / Enter.\n */\n draftChange = output<unknown>();\n\n /** Emitted when a custom editor requests a commit (e.g. selecting a value). */\n readonly editorCommit = output<void>();\n\n /** Emitted when a custom editor requests cancellation. */\n readonly editorCancel = output<void>();\n\n /** Live draft value managed by the cell during an active edit. */\n readonly draft = signal<unknown>('');\n\n /**\n * Context exposed to a {@link ColDef.cellEditor} component via {@link AGRID_EDITOR_CONTEXT}.\n * The signals are the cell's own inputs, so the editor stays reactive to value/row changes.\n */\n private readonly editorContext: AgridEditorContext = {\n value: this.value,\n row: this.row,\n column: this.col,\n seedChar: this.seedChar,\n setDraft: value => {\n this.draft.set(value);\n this.draftChange.emit(value);\n },\n commit: () => this.editorCommit.emit(),\n cancel: () => this.editorCancel.emit(),\n };\n\n /** Injector that supplies {@link AGRID_EDITOR_CONTEXT} to a custom editor component. */\n protected readonly editorInjector = Injector.create({\n providers: [{ provide: AGRID_EDITOR_CONTEXT, useValue: this.editorContext }],\n parent: inject(Injector),\n });\n\n /**\n * Context exposed to a {@link ColDef.cellRendererComponent} via {@link AGRID_RENDERER_CONTEXT}.\n * Display-only — the signals are the cell's own inputs, so the renderer stays reactive.\n */\n private readonly rendererContext: AgridRendererContext = {\n value: this.value,\n row: this.row,\n column: this.col,\n };\n\n /** Injector that supplies {@link AGRID_RENDERER_CONTEXT} to a custom renderer component. */\n protected readonly rendererInjector = Injector.create({\n providers: [{ provide: AGRID_RENDERER_CONTEXT, useValue: this.rendererContext }],\n parent: inject(Injector),\n });\n\n /** String value accepted by the active native input element. */\n readonly editorValue = computed((): string => {\n const draft = this.draft();\n if (this.col().type === 'date') {\n return getDateInputValue(draft);\n }\n return String(draft ?? '');\n });\n\n /** Mask selected for the current row and cell, if this is a maskable text column. */\n readonly resolvedInputMask = computed((): RegExp | null => {\n const col = this.col();\n if (!col.inputMask || col.type === 'number' || col.type === 'date' || col.type === 'boolean') {\n return null;\n }\n return col.inputMask({\n row: this.row(),\n value: this.value(),\n column: col,\n }) ?? null;\n });\n\n /** Whether this cell renders as an inline boolean checkbox (no edit mode). */\n readonly booleanCell = computed(\n (): boolean =>\n this.col().type === 'boolean'\n && !this.col().cellRenderer\n && !this.col().cellRendererComponent,\n );\n\n /** Truthiness of the current boolean value (accepts `true`, `'true'`, `1`, `'1'`). */\n readonly booleanChecked = computed((): boolean => {\n const v = this.value();\n return v === true || v === 1 || v === 'true' || v === '1';\n });\n\n readonly renderedHtml = computed((): string => {\n const renderer = this.col().cellRenderer;\n if (!renderer) return '';\n return renderer({ value: this.value(), row: this.row() });\n });\n\n /**\n * Normalized list of value options (always `{ label, rawValue }` regardless of whether\n * `ColDef.values` is `string[]` or `ValueOption[]`).\n */\n readonly valueOptions = computed(() => {\n const vals = this.col().values ?? [];\n return vals.map(v =>\n typeof v === 'string'\n ? { label: v, rawValue: v as unknown }\n : { label: (v as ValueOption).label, rawValue: (v as ValueOption).value }\n );\n });\n\n /**\n * The string shown in the cell when not editing.\n * Priority: ValueOption label → `ColDef.formatter` → raw string.\n */\n readonly displayValue = computed((): string => {\n return this.displayValueOverride()\n ?? getDisplayForField(this.col(), this.value(), this.locale());\n });\n\n /**\n * Index of the currently selected option in `valueOptions`.\n * Used to drive `<option [value]=\"idx\" [selected]=\"idx === selectedOptionIndex()\">`.\n * Index-based approach avoids string/type coercion for non-string raw values.\n */\n readonly selectedOptionIndex = computed((): number => {\n const raw = this.draft();\n return this.valueOptions().findIndex(o => o.rawValue === raw);\n });\n\n private readonly inputEl = viewChild<ElementRef<HTMLInputElement>>('editInput');\n private readonly selectEl = viewChild<ElementRef<HTMLSelectElement>>('editSelect');\n\n constructor() {\n effect(() => {\n if (this.editing()) {\n const seed = this.seedChar();\n const isDate = this.col().type === 'date';\n const existingDate = isDate ? getDateInputValue(this.value()) : '';\n const dateInitial = existingDate || (isDate && seed === '' ? new Date().toISOString().slice(0, 10) : '');\n const initialValue = isDate\n ? dateInitial\n : seed !== '' ? seed : this.value();\n const mask = this.resolvedInputMask();\n const acceptedInitialValue = seed !== '' && mask && !matchesInputMask(initialValue, mask)\n ? this.value()\n : initialValue;\n this.draft.set(acceptedInitialValue);\n\n setTimeout(() => {\n const input = this.inputEl()?.nativeElement;\n if (input) {\n const displaySeed = isDate\n ? dateInitial\n : String(acceptedInitialValue ?? '');\n input.value = displaySeed;\n input.focus();\n if (input.type === 'text' && !seed && this.selectTextOnEdit()) input.select();\n else if (input.type === 'text') {\n const len = displaySeed.length;\n input.setSelectionRange(len, len);\n }\n return;\n }\n\n const sel = this.selectEl()?.nativeElement;\n if (sel) {\n const idx = this.selectedOptionIndex();\n if (idx >= 0) sel.value = String(idx);\n sel.focus();\n try {\n (sel as HTMLSelectElement & { showPicker?: () => void }).showPicker?.();\n } catch {\n sel.click();\n }\n }\n });\n }\n });\n }\n\n /** Toggle a boolean cell's value, driven entirely from data (no DOM toggle). */\n onCheckboxClick(event: MouseEvent): void {\n event.stopPropagation();\n event.preventDefault();\n if (!this.editable()) return;\n this.booleanToggle.emit(!this.booleanChecked());\n }\n\n /** Emit a tree expand/collapse request without selecting or editing the cell. */\n onTreeToggle(event: MouseEvent): void {\n event.stopPropagation();\n this.treeToggle.emit();\n }\n\n /** Emits the information action without activating or editing the cell. */\n onInfoClick(event: MouseEvent): void {\n event.preventDefault();\n event.stopPropagation();\n this.infoClick.emit();\n }\n\n /** Forward `<input>` changes to the grid. */\n onInput(event: Event): void {\n const input = event.target as HTMLInputElement;\n const val = input.value;\n const mask = this.resolvedInputMask();\n if (mask && !matchesInputMask(val, mask)) {\n input.value = String(this.draft() ?? '');\n input.setSelectionRange(input.value.length, input.value.length);\n return;\n }\n const draft = this.col().type === 'date'\n ? coerceDateInputValue(val, this.value())\n : val;\n this.draft.set(draft);\n this.draftChange.emit(draft);\n }\n\n /**\n * Forward `<select>` changes to the grid.\n * Maps the option index back to the raw value (preserves original type — number, object, etc.).\n */\n onSelectChange(event: Event): void {\n const idx = Number((event.target as HTMLSelectElement).value);\n const opts = this.valueOptions();\n const rawValue = opts[idx]?.rawValue ?? '';\n this.draft.set(rawValue);\n this.draftChange.emit(rawValue);\n }\n}\n","import { ChangeDetectionStrategy, Component, input, output } from '@angular/core';\nimport { AgridHeaderColumn, ColDef } from '../agrid.types';\nimport { AgridHeaderGroup } from '../columns/agrid-column-layout.model';\nimport { AgridLocaleText } from '../agrid-localization';\n\n/** Which of the three grid panes this header belongs to. @internal */\nexport type AgridPaneVariant = 'left' | 'center' | 'right';\n\n/** Payload for header interactions that need the original DOM event plus the target column. @internal */\nexport interface AgridPaneHeaderColumnEvent<E extends Event = Event> {\n event: E;\n field: string;\n}\n\n/** Payload for resize interactions, which operate on the full {@link ColDef}. @internal */\nexport interface AgridPaneHeaderResizeEvent<E extends Event = Event> {\n event: E;\n col: ColDef;\n}\n\n/** Payload for grabbing a grouped-header segment. @internal */\nexport interface AgridPaneHeaderGroupEvent {\n event: PointerEvent;\n fields: string[];\n label: string;\n}\n\n/**\n * Renders the grouped-header row, header-cell row, and inline filter row for a single grid pane.\n *\n * Presentational only: every binding is fed from the parent's header view-model\n * ({@link AgridHeaderColumn} / {@link AgridHeaderGroup}) and every interaction is re-emitted with\n * its original DOM event so {@link AgridComponent} keeps ownership of the behavior. The three panes\n * (`left` / `center` / `right`) differ only in a handful of variant-driven classes, the control\n * column (left), and the grouped badge (center/right) — all handled by {@link variant}.\n *\n * Host uses `display: contents` so it adds no layout box: the two header rows stay direct children\n * of the pane, preserving the existing flex/grid layout and CSS (no stylesheet rule targets the\n * header via a child combinator).\n *\n * Not intended for direct use — `AgridComponent` owns all inputs and outputs.\n */\n@Component({\n selector: 'agrid-pane-header',\n changeDetection: ChangeDetectionStrategy.OnPush,\n host: { style: 'display: contents' },\n templateUrl: './agrid-pane-header.component.html',\n styleUrl: './agrid-pane-header.component.css',\n})\nexport class AgridPaneHeaderComponent {\n /** Which pane this header renders. Drives the small structural differences between panes. */\n readonly variant = input.required<AgridPaneVariant>();\n\n /** Grouped-header segments for this pane (empty when no header groups are configured). */\n readonly headerGroups = input.required<AgridHeaderGroup[]>();\n /** Per-column header view-model for this pane. */\n readonly columns = input.required<AgridHeaderColumn[]>();\n\n /** CSS `grid-template-columns` value for this pane. */\n readonly gridTemplateColumns = input.required<string>();\n /** Fixed pane width in px — applied for the `left` and `right` (pinned) variants. */\n readonly paneWidth = input.required<number>();\n /** Total content width in px — applied as `min-width` for the scrollable `center` variant. */\n readonly totalWidth = input.required<number>();\n\n readonly hasHeaderGroups = input.required<boolean>();\n readonly hasFilterableColumns = input.required<boolean>();\n readonly headerRowCount = input.required<number>();\n readonly showControlColumn = input.required<boolean>();\n readonly localeText = input.required<AgridLocaleText>();\n readonly pivotHeaderLabel = input<string | null | undefined>(null);\n readonly pivotRowColumnField = input<string | null | undefined>(null);\n readonly hasMultiSort = input.required<boolean>();\n /** Field of the column whose filter menu is currently open, for `aria-expanded`. */\n readonly filterMenuField = input<string | null>(null);\n /** Fields currently marked as complete columns. */\n readonly markedColumnFields = input<ReadonlySet<string>>(new Set());\n\n readonly headerGroupPointerDown = output<AgridPaneHeaderGroupEvent>();\n readonly colHeaderPointerDown = output<AgridPaneHeaderColumnEvent<PointerEvent>>();\n readonly colHeaderClick = output<AgridPaneHeaderColumnEvent<MouseEvent>>();\n readonly filterMenuOpen = output<AgridPaneHeaderColumnEvent<MouseEvent>>();\n readonly filterConditionMenuOpen = output<AgridPaneHeaderColumnEvent<MouseEvent>>();\n readonly textFilterChange = output<AgridPaneHeaderColumnEvent>();\n readonly resizeKeyDown = output<AgridPaneHeaderResizeEvent<KeyboardEvent>>();\n readonly resizeStart = output<AgridPaneHeaderResizeEvent<MouseEvent>>();\n readonly autosizeColumn = output<AgridPaneHeaderResizeEvent<MouseEvent>>();\n}\n","@if (hasHeaderGroups()) {\n<div\n class=\"ag-header-groups\"\n role=\"row\"\n aria-rowindex=\"1\"\n [class.ag-header-groups--pinned]=\"variant() === 'left'\"\n [style.grid-template-columns]=\"gridTemplateColumns()\"\n [style.width.px]=\"variant() === 'center' ? null : paneWidth()\"\n [style.min-width.px]=\"variant() === 'center' ? totalWidth() : null\"\n>\n @if (variant() === 'left' && showControlColumn()) {\n <div class=\"ag-header-group-cell ag-header-group-cell--empty\"></div>\n }\n @for (run of headerGroups(); track run.key) {\n <div\n class=\"ag-header-group-cell\"\n role=\"columnheader\"\n [attr.data-header-group]=\"run.id\"\n [class.ag-header-group-cell--empty]=\"!run.id\"\n [class.ag-header-group-cell--locked]=\"run.locked\"\n [class.ag-header-group-cell--dragging]=\"run.dragging\"\n [style.grid-column]=\"'span ' + run.span\"\n (pointerdown)=\"run.id && headerGroupPointerDown.emit({ event: $event, fields: run.fields, label: run.label })\"\n >\n {{ run.label }}\n </div>\n }\n</div>\n}\n\n<div\n class=\"ag-header\"\n role=\"row\"\n [attr.aria-rowindex]=\"headerRowCount()\"\n [class.ag-header--pinned]=\"variant() === 'left'\"\n [class.ag-header--with-filters]=\"hasFilterableColumns()\"\n [style.grid-template-columns]=\"gridTemplateColumns()\"\n [style.width.px]=\"variant() === 'center' ? null : paneWidth()\"\n [style.min-width.px]=\"variant() === 'center' ? totalWidth() : null\"\n>\n @if (variant() === 'left' && showControlColumn()) {\n <div class=\"ag-header-cell ag-control-header\" role=\"columnheader\" aria-colindex=\"1\">\n <div class=\"ag-header-cell-top\"></div>\n @if (hasFilterableColumns()) {\n <div class=\"ag-header-cell-filter\"></div>\n }\n </div>\n }\n @for (c of columns(); track c.field) {\n @let col = c.col;\n <div\n class=\"ag-header-cell\"\n role=\"columnheader\"\n [class.ag-header-cell--pinned]=\"variant() !== 'center'\"\n [attr.aria-colindex]=\"c.ariaColIndex\"\n [attr.aria-sort]=\"c.sort === 'asc' ? 'ascending' : c.sort === 'desc' ? 'descending' : 'none'\"\n [class.ag-header-cell--filtered]=\"c.hasFilter\"\n [class.ag-header-cell--dragging]=\"c.dragging\"\n [class.ag-header-cell--marked]=\"markedColumnFields().has(col.field)\"\n [class.ag-header-cell--drop-before]=\"c.dropSide === 'before'\"\n [class.ag-header-cell--drop-after]=\"c.dropSide === 'after'\"\n [style.transform]=\"'translateX(' + c.reorderOffset + 'px)'\"\n [class.ag-header-cell--pinned-last]=\"variant() === 'left' && c.lastPinned\"\n [class.ag-header-cell--pinned-first]=\"variant() === 'right' && c.firstRightPinned\"\n [attr.data-col-field]=\"col.field\"\n (pointerdown)=\"colHeaderPointerDown.emit({ event: $event, field: col.field })\"\n (click)=\"colHeaderClick.emit({ event: $event, field: col.field })\"\n >\n <div class=\"ag-header-cell-top\">\n <span class=\"ag-header-cell-label\"\n >{{ col.header }}\n @if (pivotHeaderLabel() && pivotRowColumnField() !== col.field) {\n ({{ pivotHeaderLabel() }})\n }\n </span>\n @if (c.sort; as dir) {\n <span class=\"ag-sort-badge\"\n >{{ dir === 'asc' ? '↑' : '↓' }}@if (hasMultiSort()) {<sup class=\"ag-sort-priority\">{{\n c.sortPriority\n }}</sup>}</span\n >\n }\n @if (c.grouped && variant() !== 'left') {\n <span class=\"ag-sort-badge\">{{ variant() === 'right' ? \"'⊟ '\" : '⊟' }}</span>\n }\n <button\n class=\"ag-header-menu-btn\"\n [class.ag-header-menu-btn--active]=\"c.hasFilter\"\n [title]=\"localeText().columnMenu\"\n [attr.aria-label]=\"localeText().columnMenu + ': ' + col.header\"\n [attr.aria-expanded]=\"filterMenuField() === col.field\"\n aria-haspopup=\"menu\"\n (click)=\"$event.stopPropagation(); filterMenuOpen.emit({ event: $event, field: col.field })\"\n (pointerdown)=\"$event.stopPropagation()\"\n >\n ▾\n </button>\n </div>\n @if (hasFilterableColumns()) {\n <div class=\"ag-header-cell-filter\">\n @if (col.filterable) {\n <input\n class=\"ag-filter-input\"\n [value]=\"c.textFilter\"\n (input)=\"textFilterChange.emit({ event: $event, field: col.field })\"\n (click)=\"$event.stopPropagation()\"\n [placeholder]=\"localeText().filterPlaceholder\"\n [attr.aria-label]=\"localeText().filterPlaceholder + ' ' + col.header\"\n />\n @if (c.menuFilterType) {\n <button\n type=\"button\"\n class=\"ag-filter-condition-btn\"\n [class.ag-filter-condition-btn--active]=\"c.hasCondition\"\n [title]=\"localeText().filterConditionMenu\"\n [attr.aria-label]=\"localeText().filterConditionMenu + ': ' + col.header\"\n [attr.aria-expanded]=\"filterMenuField() === col.field\"\n (click)=\"$event.stopPropagation(); filterConditionMenuOpen.emit({ event: $event, field: col.field })\"\n (pointerdown)=\"$event.stopPropagation()\"\n >\n {{ c.conditionLabel }}\n </button>\n }\n }\n </div>\n }\n <div\n class=\"ag-resize-handle\"\n role=\"separator\"\n [attr.tabindex]=\"col.locked ? -1 : 0\"\n aria-orientation=\"vertical\"\n [attr.aria-disabled]=\"col.locked ? 'true' : null\"\n [attr.aria-label]=\"localeText().resizeColumn + ': ' + col.header\"\n [attr.aria-valuenow]=\"c.columnWidth\"\n (keydown)=\"resizeKeyDown.emit({ event: $event, col })\"\n (mousedown)=\"resizeStart.emit({ event: $event, col })\"\n (pointerdown)=\"$event.stopPropagation()\"\n (dblclick)=\"autosizeColumn.emit({ event: $event, col })\"\n ></div>\n </div>\n }\n</div>\n","/** Guarded access to browser-only APIs used by the grid. @internal */\nexport class AgridBrowserAdapter {\n /** Creates an adapter using injected browser globals or the current environment. */\n constructor(\n private readonly doc: Document | null =\n typeof document === 'undefined' ? null : document,\n private readonly win: Window | null =\n typeof window === 'undefined' ? null : window,\n ) {}\n\n /** Returns whether both document and window APIs are available. */\n get available(): boolean {\n return this.doc !== null && this.win !== null;\n }\n\n /** Registers a document event listener when a document is available. */\n addDocumentListener<K extends keyof DocumentEventMap>(\n type: K,\n listener: (event: DocumentEventMap[K]) => void,\n ): void {\n this.doc?.addEventListener(type, listener as EventListener);\n }\n\n /** Removes a previously registered document event listener. */\n removeDocumentListener<K extends keyof DocumentEventMap>(\n type: K,\n listener: (event: DocumentEventMap[K]) => void,\n ): void {\n this.doc?.removeEventListener(type, listener as EventListener);\n }\n\n /** Returns the element stack at viewport coordinates. */\n elementsFromPoint(x: number, y: number): Element[] {\n return this.doc?.elementsFromPoint?.(x, y) ?? [];\n }\n\n /** Appends an element to the document body when available. */\n appendToBody(element: HTMLElement): boolean {\n if (!this.doc?.body) return false;\n this.doc.body.appendChild(element);\n return true;\n }\n\n /** Sets cursor and text-selection styles on the document body. */\n setBodyInteraction(cursor: string, userSelect: string): void {\n if (!this.doc?.body) return;\n this.doc.body.style.cursor = cursor;\n this.doc.body.style.userSelect = userSelect;\n }\n\n /** Returns the viewport width or infinity during server rendering. */\n viewportWidth(): number {\n return this.win?.innerWidth ?? Number.POSITIVE_INFINITY;\n }\n\n /** Returns the viewport height or infinity during server rendering. */\n viewportHeight(): number {\n return this.win?.innerHeight ?? Number.POSITIVE_INFINITY;\n }\n\n /** Returns computed styles when a window is available. */\n computedStyle(element: Element): CSSStyleDeclaration | null {\n return this.win?.getComputedStyle?.(element) ?? null;\n }\n\n /** Creates a 2D canvas context for text measurement. */\n createCanvasContext(): CanvasRenderingContext2D | null {\n return this.doc?.createElement('canvas').getContext('2d') ?? null;\n }\n\n /** Schedules a callback with the environment timer. */\n schedule(callback: () => void, delay = 0): ReturnType<typeof setTimeout> {\n return setTimeout(callback, delay);\n }\n\n /** Writes text to the system clipboard, returning whether it succeeded. */\n async writeClipboard(text: string): Promise<boolean> {\n try {\n const clipboard = this.win?.navigator.clipboard;\n if (!clipboard?.writeText) return false;\n await clipboard.writeText(text);\n return true;\n } catch {\n return false;\n }\n }\n\n /** Downloads text through a temporary object URL and anchor element. */\n downloadText(filename: string, text: string, mimeType: string): boolean {\n return this.downloadBlob(filename, new Blob([text], { type: mimeType }));\n }\n\n /** Downloads raw bytes (e.g. a generated `.xlsx`) through a temporary object URL. */\n downloadBytes(filename: string, bytes: Uint8Array, mimeType: string): boolean {\n // Copy into a fresh ArrayBuffer-backed view so the Blob part type is satisfied.\n const part = new Uint8Array(bytes);\n return this.downloadBlob(filename, new Blob([part], { type: mimeType }));\n }\n\n private downloadBlob(filename: string, blob: Blob): boolean {\n const urlApi = (this.win as unknown as { URL?: typeof URL } | null)?.URL\n ?? (typeof URL === 'undefined' ? null : URL);\n if (!this.doc?.body || !urlApi?.createObjectURL) return false;\n let url: string | null = null;\n let anchor: HTMLAnchorElement | null = null;\n try {\n url = urlApi.createObjectURL(blob);\n anchor = this.doc.createElement('a');\n anchor.href = url;\n anchor.download = filename;\n anchor.style.display = 'none';\n this.doc.body.appendChild(anchor);\n anchor.click();\n return true;\n } catch {\n return false;\n } finally {\n anchor?.remove();\n if (url) urlApi.revokeObjectURL(url);\n }\n }\n}\n","import { Signal, WritableSignal } from '@angular/core';\nimport { AgridControl, HistoryEntry } from '../agrid-control';\nimport { AgridDataSource } from '../agrid-datasource';\nimport { CellPosition, ColDef, GridEditEvent, GridItem } from '../agrid.types';\nimport { getDisplayForField, isDataRowItem } from '../agrid.utils';\n\n/** Rectangular selection represented by source row and visible column positions. @internal */\nexport type CellRange = { anchor: CellPosition; focus: CellPosition };\n\ntype VisibleCellBounds = {\n rowStart: number;\n rowEnd: number;\n colStart: number;\n colEnd: number;\n};\n\n/** Dependencies and callbacks required by {@link AgridClipboardHandler}. @internal */\nexport interface AgridClipboardHandlerOptions {\n control: Signal<AgridControl | null>;\n dataSource: Signal<AgridDataSource>;\n filteredItems: Signal<GridItem[]>;\n visibleColDefs: Signal<ColDef[]>;\n locale: Signal<string>;\n selectedCell: WritableSignal<CellPosition | null>;\n selectedRange: WritableSignal<CellRange | null>;\n markedRowIndices: Signal<ReadonlySet<number>>;\n isCellEditable: (col: ColDef, originalIndex: number) => boolean;\n onCellEdit: (event: GridEditEvent) => void;\n scrollToCell: (displayIndex: number, colIndex: number) => void;\n}\n\n/** Handles selection serialization and spreadsheet-style clipboard paste operations. @internal */\nexport class AgridClipboardHandler {\n constructor(private readonly opts: AgridClipboardHandlerOptions) {}\n\n /** Writes the current cell or range selection to a clipboard event as TSV. */\n copy(event: ClipboardEvent): void {\n const text = this.getSelectedTsv();\n if (!text) return;\n event.clipboardData?.setData('text/plain', text);\n event.preventDefault();\n }\n\n /** Reads plain text from a clipboard event and pastes it at the selection. */\n paste(event: ClipboardEvent): void {\n const text = event.clipboardData?.getData('text/plain');\n if (!text || !this.opts.selectedCell()) return;\n event.preventDefault();\n this.pasteTextAtSelection(text);\n }\n\n /** Serializes the current cell or range selection as tab-separated text. */\n getSelectedTsv(): string {\n const bounds = this.getVisibleRangeBounds();\n const selected = this.opts.selectedCell();\n const marked = this.opts.markedRowIndices();\n if (!bounds && !selected && marked.size === 0) return '';\n\n const rowStart = bounds?.rowStart ?? (\n selected ? this.findDisplayIndex(selected.rowIndex) : -1\n );\n const rowEnd = bounds?.rowEnd ?? rowStart;\n const colStart = bounds?.colStart ?? selected?.colIndex ?? 0;\n const colEnd = bounds?.colEnd ?? selected?.colIndex\n ?? this.opts.visibleColDefs().length - 1;\n const rows = this.opts.filteredItems();\n const cols = this.opts.visibleColDefs();\n const dataRows = this.opts.dataSource().rows();\n const lines: string[] = [];\n const copiedIndices = new Set<number>();\n\n if (rowStart >= 0) {\n for (let displayIndex = rowStart; displayIndex <= rowEnd; displayIndex++) {\n const item = rows[displayIndex];\n if (!isDataRowItem(item)) continue;\n lines.push(this.serializeRow(item.row, cols, colStart, colEnd));\n copiedIndices.add(item.originalIndex);\n }\n }\n\n for (const originalIndex of [...marked].sort((a, b) => a - b)) {\n if (copiedIndices.has(originalIndex)) continue;\n const row = dataRows[originalIndex];\n if (!row) continue;\n lines.push(this.serializeRow(row, cols, colStart, colEnd));\n }\n\n return lines.join('\\n');\n }\n\n private serializeRow(\n row: Record<string, unknown>,\n cols: ColDef[],\n colStart: number,\n colEnd: number,\n ): string {\n const cells: string[] = [];\n for (let colIndex = colStart; colIndex <= colEnd; colIndex++) {\n const col = cols[colIndex];\n if (!col) continue;\n cells.push(this.escapeTsvValue(\n getDisplayForField(col, row[col.field], this.opts.locale())\n ));\n }\n return cells.join('\\t');\n }\n\n /** Applies delimited text to editable cells beginning at the active selection. */\n pasteTextAtSelection(text: string): void {\n const bounds = this.getActiveSelectionBounds();\n if (!bounds) return;\n const start = this.positionFromVisibleCell(bounds.rowStart, bounds.colStart);\n const rows = this.parseDelimitedText(text);\n if (rows.length === 0) return;\n\n const items = this.opts.filteredItems();\n const cols = this.opts.visibleColDefs();\n const dataSource = this.opts.dataSource();\n let lastPosition = start;\n const historyEntries: HistoryEntry[] = [];\n\n for (let rowOffset = 0; rowOffset < rows.length; rowOffset++) {\n const item = items[bounds.rowStart + rowOffset];\n if (!isDataRowItem(item)) continue;\n for (let colOffset = 0; colOffset < rows[rowOffset].length; colOffset++) {\n const colIndex = start.colIndex + colOffset;\n const col = cols[colIndex];\n if (!col || !this.opts.isCellEditable(col, item.originalIndex)) continue;\n const oldValue = dataSource.getRow(item.originalIndex)[col.field];\n const newValue = this.coercePastedValue(rows[rowOffset][colOffset], col);\n if (oldValue === newValue) continue;\n\n dataSource.patchRow(item.originalIndex, { [col.field]: newValue });\n const edit = {\n rowIndex: item.originalIndex,\n field: col.field,\n oldValue,\n newValue,\n };\n historyEntries.push(edit);\n this.opts.onCellEdit({\n position: { rowIndex: item.originalIndex, colIndex },\n field: col.field,\n oldValue,\n newValue,\n });\n lastPosition = { rowIndex: item.originalIndex, colIndex };\n }\n }\n\n this.opts.control()?.pushEditBatch(historyEntries);\n this.opts.selectedRange.set({ anchor: start, focus: lastPosition });\n this.opts.selectedCell.set(lastPosition);\n this.opts.scrollToCell(this.findDisplayIndex(lastPosition.rowIndex), lastPosition.colIndex);\n }\n\n private getVisibleRangeBounds(): VisibleCellBounds | null {\n const range = this.opts.selectedRange();\n if (!range) return null;\n const anchorDisplayIndex = this.findDisplayIndex(range.anchor.rowIndex);\n const focusDisplayIndex = this.findDisplayIndex(range.focus.rowIndex);\n if (anchorDisplayIndex < 0 || focusDisplayIndex < 0) return null;\n return {\n rowStart: Math.min(anchorDisplayIndex, focusDisplayIndex),\n rowEnd: Math.max(anchorDisplayIndex, focusDisplayIndex),\n colStart: Math.min(range.anchor.colIndex, range.focus.colIndex),\n colEnd: Math.max(range.anchor.colIndex, range.focus.colIndex),\n };\n }\n\n private getActiveSelectionBounds(): VisibleCellBounds | null {\n const range = this.getVisibleRangeBounds();\n if (range) return range;\n const selected = this.opts.selectedCell();\n if (!selected) return null;\n const displayIndex = this.findDisplayIndex(selected.rowIndex);\n if (displayIndex < 0) return null;\n return {\n rowStart: displayIndex,\n rowEnd: displayIndex,\n colStart: selected.colIndex,\n colEnd: selected.colIndex,\n };\n }\n\n private findDisplayIndex(originalIndex: number): number {\n return this.opts.filteredItems().findIndex(\n item => isDataRowItem(item) && item.originalIndex === originalIndex\n );\n }\n\n private positionFromVisibleCell(displayIndex: number, colIndex: number): CellPosition {\n const item = this.opts.filteredItems()[displayIndex];\n if (isDataRowItem(item)) return { rowIndex: item.originalIndex, colIndex };\n return this.opts.selectedCell() ?? { rowIndex: 0, colIndex };\n }\n\n private escapeTsvValue(value: string): string {\n return /[\"\\t\\n\\r]/.test(value) ? `\"${value.replace(/\"/g, '\"\"')}\"` : value;\n }\n\n private parseDelimitedText(text: string): string[][] {\n const normalized = text.replace(/\\r\\n/g, '\\n').replace(/\\r/g, '\\n').replace(/\\n$/, '');\n const delimiter = normalized.includes('\\t') ? '\\t' : ',';\n const rows: string[][] = [];\n let row: string[] = [];\n let cell = '';\n let quoted = false;\n\n for (let i = 0; i < normalized.length; i++) {\n const char = normalized[i];\n if (quoted) {\n if (char === '\"' && normalized[i + 1] === '\"') {\n cell += '\"';\n i++;\n } else if (char === '\"') {\n quoted = false;\n } else {\n cell += char;\n }\n } else if (char === '\"') {\n quoted = true;\n } else if (char === delimiter) {\n row.push(cell);\n cell = '';\n } else if (char === '\\n') {\n row.push(cell);\n rows.push(row);\n row = [];\n cell = '';\n } else {\n cell += char;\n }\n }\n\n row.push(cell);\n rows.push(row);\n return rows.filter(values => values.length > 1 || values[0] !== '');\n }\n\n private coercePastedValue(value: string, col: ColDef): unknown {\n if (col.values?.length) {\n const match = col.values.find(option =>\n typeof option === 'string'\n ? option === value\n : option.label === value || String(option.value) === value\n );\n if (match !== undefined) return typeof match === 'string' ? match : match.value;\n }\n if (col.type === 'number') {\n const numberValue = Number(value);\n return value.trim() === '' || Number.isNaN(numberValue) ? value : numberValue;\n }\n return value;\n }\n}\n","import { Signal, computed } from '@angular/core';\nimport { AgridControl } from '../agrid-control';\nimport { ColDef, HeaderGroup } from '../agrid.types';\n\n/** One contiguous segment in the optional grouped-header row. @internal */\nexport interface AgridHeaderGroupRun {\n key: string;\n id: string | null;\n label: string;\n fields: string[];\n span: number;\n}\n\n/** A grouped-header run enriched with reactive lock/drag state. @internal */\nexport interface AgridHeaderGroup extends AgridHeaderGroupRun {\n locked: boolean;\n dragging: boolean;\n}\n\n/** Reactive inputs required by {@link AgridColumnLayoutModel}. @internal */\nexport interface AgridColumnLayoutOptions {\n control: Signal<AgridControl | null>;\n colDefs: Signal<ColDef[]>;\n headerGroups: Signal<HeaderGroup[]>;\n showControlColumn: Signal<boolean>;\n controlColumnWidth: Signal<number>;\n getColumnWidth: (col: ColDef) => number;\n getColumnWidthToken: (col: ColDef) => string;\n}\n\n/**\n * Computes visible, ordered, pinned, and scrollable columns plus pane dimensions.\n * @internal\n */\nexport class AgridColumnLayoutModel {\n constructor(private readonly opts: AgridColumnLayoutOptions) {}\n\n /** Columns visible after hidden state, ordering, and left-pinning are applied. */\n readonly visibleColDefs = computed(() => {\n const control = this.opts.control();\n let columns = control\n ? this.opts.colDefs().filter(col => !control.hiddenColumns().has(col.field))\n : this.opts.colDefs().filter(col => !col.hidden);\n\n if (control) {\n const order = control.columnOrder();\n if (order.length > 0) {\n const orderMap = new Map(order.map((field, index) => [field, index]));\n columns = [...columns].sort((a, b) =>\n (orderMap.get(a.field) ?? Infinity) - (orderMap.get(b.field) ?? Infinity)\n );\n }\n const pinned = control.pinnedColumns();\n if (pinned.size > 0) {\n columns = [\n ...columns.filter(col => pinned.has(col.field)),\n ...columns.filter(col => !pinned.has(col.field)),\n ];\n }\n } else {\n const pinned = columns.filter(col => col.pinned === 'left');\n if (pinned.length > 0) {\n columns = [...pinned, ...columns.filter(col => col.pinned !== 'left')];\n }\n }\n return columns;\n });\n\n /** Visible columns pinned to the left edge. */\n readonly pinnedColDefs = computed(() => {\n const control = this.opts.control();\n if (control) {\n const pinned = control.pinnedColumns();\n return pinned.size > 0\n ? this.visibleColDefs().filter(col => pinned.has(col.field))\n : [];\n }\n return this.visibleColDefs().filter(col => col.pinned === 'left');\n });\n\n /** Visible columns pinned to the right edge. */\n readonly rightPinnedColDefs = computed(() => {\n const control = this.opts.control();\n if (control) {\n const pinned = control.pinnedRightColumns();\n return pinned.size > 0\n ? this.visibleColDefs().filter(col => pinned.has(col.field))\n : [];\n }\n return this.visibleColDefs().filter(col => col.pinned === 'right');\n });\n\n /** Visible columns rendered in the horizontally scrollable pane. */\n readonly scrollableColDefs = computed(() => {\n const left = new Set(this.pinnedColDefs().map(col => col.field));\n const right = new Set(this.rightPinnedColDefs().map(col => col.field));\n return this.visibleColDefs().filter(col => !left.has(col.field) && !right.has(col.field));\n });\n\n readonly hasPinnedPane = computed(() =>\n this.opts.showControlColumn() || this.pinnedColDefs().length > 0\n );\n readonly hasRightPinnedPane = computed(() => this.rightPinnedColDefs().length > 0);\n readonly hasFilterableColumns = computed(() =>\n this.visibleColDefs().some(col => col.filterable)\n );\n readonly hasHeaderGroups = computed(() =>\n this.visibleColDefs().some(col => this.groupLabel(col.group) !== null)\n );\n\n readonly pinnedHeaderGroupRuns = computed(() =>\n this.buildHeaderGroupRuns(this.pinnedColDefs(), 'left')\n );\n readonly scrollableHeaderGroupRuns = computed(() =>\n this.buildHeaderGroupRuns(this.scrollableColDefs(), 'center')\n );\n readonly rightHeaderGroupRuns = computed(() =>\n this.buildHeaderGroupRuns(this.rightPinnedColDefs(), 'right')\n );\n\n readonly gridTemplateColumns = computed(() => {\n const columns = this.widthTokens(this.visibleColDefs());\n return this.opts.showControlColumn()\n ? `${this.opts.controlColumnWidth()}px ${columns}`\n : columns;\n });\n\n readonly pinnedGridTemplateColumns = computed(() => {\n const columns = this.widthTokens(this.pinnedColDefs());\n if (this.opts.showControlColumn()) {\n const controlWidth = `${this.opts.controlColumnWidth()}px`;\n return columns ? `${controlWidth} ${columns}` : controlWidth;\n }\n return columns;\n });\n\n readonly scrollableGridTemplateColumns = computed(() =>\n this.widthTokens(this.scrollableColDefs())\n );\n readonly rightGridTemplateColumns = computed(() =>\n this.widthTokens(this.rightPinnedColDefs())\n );\n\n readonly totalWidth = computed(() =>\n this.width(this.visibleColDefs())\n + (this.opts.showControlColumn() ? this.opts.controlColumnWidth() : 0)\n );\n readonly pinnedPaneWidth = computed(() =>\n this.width(this.pinnedColDefs())\n + (this.opts.showControlColumn() ? this.opts.controlColumnWidth() : 0)\n );\n readonly rightPinnedPaneWidth = computed(() => this.width(this.rightPinnedColDefs()));\n readonly scrollableTotalWidth = computed(() => this.width(this.scrollableColDefs()));\n\n private width(columns: ColDef[]): number {\n return columns.reduce((sum, col) => sum + this.opts.getColumnWidth(col), 0);\n }\n\n private widthTokens(columns: ColDef[]): string {\n return columns.map(col => this.opts.getColumnWidthToken(col)).join(' ');\n }\n\n private buildHeaderGroupRuns(columns: ColDef[], pane: string): AgridHeaderGroupRun[] {\n const runs: AgridHeaderGroupRun[] = [];\n for (const col of columns) {\n const label = this.groupLabel(col.group);\n const id = label === null ? null : col.group ?? null;\n const previous = runs[runs.length - 1];\n if (id !== null && previous?.id === id) {\n previous.fields.push(col.field);\n previous.span++;\n continue;\n }\n runs.push({\n key: `${pane}:${col.field}`,\n id,\n label: label ?? '',\n fields: [col.field],\n span: 1,\n });\n }\n return runs;\n }\n\n private groupLabel(groupId: string | undefined): string | null {\n if (!groupId) return null;\n return this.opts.headerGroups().find(group => group.id === groupId)?.label ?? null;\n }\n}\n","import { Signal, computed } from '@angular/core';\n\n/**\n * The contiguous slice of scrollable columns to render, plus the pixel widths of the\n * hidden columns on either side (used to size leading/trailing spacer grid items so the\n * full column layout and scroll width are preserved).\n * @internal\n */\nexport interface AgridColumnWindow {\n /** Index of the first rendered scrollable column (inclusive). */\n start: number;\n /** Index just past the last rendered scrollable column (exclusive). */\n end: number;\n /** Combined width of the hidden columns before {@link start}. */\n leftWidth: number;\n /** Combined width of the hidden columns from {@link end} onward. */\n rightWidth: number;\n}\n\n/** Reactive inputs required by {@link AgridColumnVirtualizationController}. @internal */\nexport interface AgridColumnVirtualizationOptions {\n /** Ordered widths of the scrollable-pane columns. */\n columnWidths: Signal<number[]>;\n /** Current horizontal scroll offset of the scrollable pane. */\n scrollLeft: Signal<number>;\n /** Visible width of the scrollable pane viewport. */\n viewportWidth: Signal<number>;\n /**\n * At or below this scrollable-column count virtualization is skipped (the full set renders).\n * A very large value effectively disables virtualization.\n */\n minColumns: Signal<number>;\n /** Extra pixels rendered beyond each edge to avoid blank flashes while scrolling. */\n overscanPx?: number;\n}\n\n/**\n * Computes which scrollable columns are within (or near) the horizontal viewport, so the\n * grid can render only those cells per row instead of every visible column. Pure and\n * DOM-free — the component feeds it scroll metrics and consumes {@link window}.\n * @internal\n */\nexport class AgridColumnVirtualizationController {\n private readonly overscanPx: number;\n\n constructor(private readonly opts: AgridColumnVirtualizationOptions) {\n this.overscanPx = opts.overscanPx ?? 240;\n }\n\n /**\n * The current column window. When virtualization is inactive (too few columns or an\n * unmeasured viewport) this spans every column with zero-width spacers, so callers render\n * exactly as they would without virtualization.\n */\n readonly window = computed<AgridColumnWindow>(() => {\n const widths = this.opts.columnWidths();\n const count = widths.length;\n const viewportWidth = this.opts.viewportWidth();\n if (count <= this.opts.minColumns() || viewportWidth <= 0) {\n return { start: 0, end: count, leftWidth: 0, rightWidth: 0 };\n }\n\n // prefix[i] is the left edge of column i; prefix[count] is the total width.\n const prefix = new Array<number>(count + 1);\n prefix[0] = 0;\n for (let i = 0; i < count; i++) prefix[i + 1] = prefix[i] + widths[i];\n const total = prefix[count];\n\n const scrollLeft = this.opts.scrollLeft();\n const min = scrollLeft - this.overscanPx;\n const max = scrollLeft + viewportWidth + this.overscanPx;\n\n // First column whose right edge crosses the (overscanned) left boundary.\n let start = 0;\n while (start < count && prefix[start + 1] <= min) start++;\n if (start >= count) start = count - 1; // scrolled past the end — keep the last column\n // First column whose left edge is past the (overscanned) right boundary.\n let end = start;\n while (end < count && prefix[end] < max) end++;\n if (end <= start) end = Math.min(count, start + 1);\n\n return { start, end, leftWidth: prefix[start], rightWidth: total - prefix[end] };\n });\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n afterNextRender,\n computed,\n effect,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\nimport { AgridLocaleText, AGRID_LOCALE_TEXT } from '../agrid-localization';\nimport { FilterOperator } from '../agrid-control';\nimport { AgridBrowserAdapter } from '../infrastructure/agrid-browser.adapter';\nimport { AgridColumnHeaderMenuItem } from '../agrid.types';\n\n/** Clamp a floating menu so it remains inside the browser viewport. @internal */\nexport function fitColumnMenuToViewport(\n x: number,\n y: number,\n width: number,\n height: number,\n viewportWidth: number,\n viewportHeight: number,\n margin = 8,\n): { x: number; y: number } {\n return {\n x: Math.max(margin, Math.min(x, viewportWidth - width - margin)),\n y: Math.max(margin, Math.min(y, viewportHeight - height - margin)),\n };\n}\n\n/** Display model for one value-filter option in the column menu. */\nexport interface AgridColumnMenuValueItem {\n /** Human-readable value label shown in the menu. */\n label: string;\n /** Raw value string used by the filter state. */\n rawStr: string;\n /** Whether this value is present in the current cross-filtered row set. */\n active: boolean;\n /** Whether this value is currently selected in the value filter. */\n selected: boolean;\n}\n\n/** Floating column menu for sort, column actions, grouping, and value filters. */\n@Component({\n selector: 'agrid-column-menu',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './agrid-column-menu.component.html',\n styleUrl: './agrid-column-menu.component.css',\n})\nexport class AgridColumnMenuComponent {\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n private readonly destroyRef = inject(DestroyRef);\n private readonly browser = new AgridBrowserAdapter();\n private resizeObserver: ResizeObserver | null = null;\n\n /** Localized labels used in the menu. */\n localeText = input<AgridLocaleText>(AGRID_LOCALE_TEXT.en);\n\n /** Fixed viewport x-position for the menu. */\n x = input.required<number>();\n\n /** Fixed viewport y-position for the menu. */\n y = input.required<number>();\n\n /** Viewport-fitted coordinates used by the rendered menu. */\n readonly position = signal({ x: 0, y: 0 });\n\n /** Header label for the active column. */\n header = input.required<string>();\n\n /** Current sort direction for the active column. */\n sortDir = input<'asc' | 'desc' | null>(null);\n\n /** Whether sort controls are available for this grid. */\n sortable = input<boolean>(true);\n\n /** Whether stateful column actions should be shown. */\n showColumnActions = input<boolean>(false);\n\n /** Whether the aggregation actions should be shown. */\n showAggregationActions = input<boolean>(true); \n\n /** Custom commands appended for the active column. */\n customItems = input<readonly AgridColumnHeaderMenuItem[]>([]);\n\n /** Emits the key of a selected custom command. */\n customAction = output<string>();\n\n /** Current pin state of the active column. */\n pinned = input<'left' | 'right' | false>(false);\n\n /** Whether the active column supports grouping. */\n groupable = input<boolean>(false);\n\n /** Whether the grid is currently grouped by the active column. */\n grouped = input<boolean>(false);\n\n /** Whether the active column supports value-filter controls. */\n filterable = input<boolean>(false);\n\n /** Whether clear-filter commands are shown above the condition controls. */\n showFilterActions = input<boolean>(true);\n\n /** Whether to show the Excel-style distinct-value picker. */\n showValueFilter = input<boolean>(true);\n\n /** Condition-filter input type for the active column, or `null` to hide the condition UI. */\n filterType = input<'text' | 'number' | 'date' | null>(null);\n\n /** Current condition operator, or `null` when none is selected. */\n operator = input<FilterOperator | null>(null);\n\n /** Current primary condition operand. */\n operand = input<string>('');\n\n /** Current secondary condition operand (used by `between`). */\n operand2 = input<string>('');\n\n /** Emits the selected condition operator, or `null` to clear it. */\n operatorChange = output<FilterOperator | null>();\n\n /** Emits the primary condition operand text. */\n operandChange = output<string>();\n\n /** Emits the secondary condition operand text (used by `between`). */\n operand2Change = output<string>();\n\n /** Current search text for the value-filter option list. */\n search = input<string>('');\n\n /** Whether the value filter currently allows every value. */\n allSelected = input<boolean>(true);\n\n /** Visible value-filter option rows. */\n valueItems = input<AgridColumnMenuValueItem[]>([]);\n\n /** 1-based priority of this column in the current multi-sort stack (0 = not sorted). */\n sortPriority = input<number>(0);\n\n /** Whether more than one column is currently sorted. */\n hasMultiSort = input<boolean>(false);\n\n /**\n * Emits a sort direction — toggles this column in the multi-sort stack\n * (adds if not sorted, clears if same direction clicked again).\n */\n sort = output<'asc' | 'desc'>();\n\n /** Emits to replace all sorts with only this column at the given direction. */\n resetSort = output<'asc' | 'desc'>();\n\n /** Requests autosizing the active column. */\n autosize = output<void>();\n\n /** Requests toggling left-pin for the active column. */\n togglePin = output<void>();\n\n /** Requests toggling right-pin for the active column. */\n togglePinRight = output<void>();\n\n /** Requests hiding the active column. */\n hide = output<void>();\n\n /** Requests toggling grouping for the active column. */\n toggleGroup = output<void>();\n\n /** Requests clearing filter and sort state for the active column. */\n clearFilter = output<void>();\n\n /** Requests clearing filter and sort state for every column. */\n clearAll = output<void>();\n\n /** Emits value-filter search text changes. */\n searchChange = output<string>();\n\n /** Requests selecting or deselecting all value-filter options. */\n toggleAll = output<void>();\n\n /** Requests toggling one value-filter option by raw string value. */\n toggleValue = output<string>();\n\n /** Active aggregate function for this column set via the control, or `null` if none. */\n aggregate = input<'sum' | 'avg' | 'min' | 'max' | 'count' | null>(null);\n\n /** Emits the aggregate to set, or `null` to clear it. */\n setAggregate = output<'sum' | 'avg' | 'min' | 'max' | 'count' | null>();\n\n readonly aggregateOptions = computed(() => {\n const t = this.localeText();\n return [\n { value: 'sum' as const, symbol: 'Σ', label: t.aggregateSum },\n { value: 'avg' as const, symbol: 'Ø', label: t.aggregateAvg },\n { value: 'min' as const, symbol: '↓', label: t.aggregateMin },\n { value: 'max' as const, symbol: '↑', label: t.aggregateMax },\n { value: 'count' as const, symbol: '#', label: t.aggregateCount },\n ];\n });\n\n /** Condition operators offered for the active column, labeled per column type. */\n readonly operatorOptions = computed<{ value: FilterOperator; label: string }[]>(() => {\n const t = this.localeText();\n if (this.filterType() === 'date') {\n return [\n { value: 'eq', label: t.filterOpOn },\n { value: 'lt', label: t.filterOpBefore },\n { value: 'gt', label: t.filterOpAfter },\n { value: 'between', label: t.filterOpBetween },\n ];\n }\n if (this.filterType() === 'text') {\n return [\n { value: 'eq', label: t.filterOpEquals },\n { value: 'neq', label: t.filterOpNotEquals },\n { value: 'like', label: t.filterOpLike },\n { value: 'startsWith', label: t.filterOpStartsWith },\n { value: 'endsWith', label: t.filterOpEndsWith },\n { value: 'includes', label: t.filterOpIncludes },\n { value: 'notIncludes', label: t.filterOpNotIncludes },\n ];\n }\n return [\n { value: 'eq', label: t.filterOpEquals },\n { value: 'neq', label: t.filterOpNotEquals },\n { value: 'gt', label: t.filterOpGreater },\n { value: 'gte', label: t.filterOpGreaterEqual },\n { value: 'lt', label: t.filterOpLess },\n { value: 'lte', label: t.filterOpLessEqual },\n { value: 'between', label: t.filterOpBetween },\n ];\n });\n\n /** Native input type for operand fields (date columns use a date picker). */\n readonly operandInputType = computed(() =>\n this.filterType() === 'date' ? 'date' : this.filterType() === 'number' ? 'number' : 'text',\n );\n\n constructor() {\n effect(() => {\n this.position.set({ x: this.x(), y: this.y() });\n this.scheduleViewportFit();\n });\n\n afterNextRender(() => {\n const menu = this.menuElement();\n this.fitToViewport();\n if (menu && typeof ResizeObserver !== 'undefined') {\n this.resizeObserver = new ResizeObserver(() => this.fitToViewport());\n this.resizeObserver.observe(menu);\n }\n });\n\n this.destroyRef.onDestroy(() => this.resizeObserver?.disconnect());\n }\n\n private scheduleViewportFit(): void {\n setTimeout(() => this.fitToViewport());\n }\n\n private fitToViewport(): void {\n const menu = this.menuElement();\n if (!menu || !this.browser.available) return;\n const rect = menu.getBoundingClientRect();\n this.position.set(fitColumnMenuToViewport(\n this.x(),\n this.y(),\n rect.width,\n rect.height,\n this.browser.viewportWidth(),\n this.browser.viewportHeight(),\n ));\n }\n\n private menuElement(): HTMLElement | null {\n return this.elementRef.nativeElement.querySelector<HTMLElement>('.ag-filter-menu');\n }\n}\n","<div\n class=\"ag-filter-menu\"\n role=\"dialog\"\n [attr.aria-label]=\"localeText().columnMenu + ': ' + header()\"\n [style.left.px]=\"position().x\"\n [style.top.px]=\"position().y\"\n (click)=\"$event.stopPropagation()\"\n>\n @if (sortable()) {\n <div class=\"ag-filter-menu-section\">\n <button\n class=\"ag-filter-menu-item\"\n [class.ag-filter-menu-item--active]=\"sortDir() === 'asc'\"\n (click)=\"sort.emit('asc')\"\n >\n ↑ {{ localeText().sortAscending }}\n @if (sortPriority() > 0) {\n <span class=\"ag-sort-priority-badge\">{{ sortPriority() }}</span>\n }\n </button>\n <button\n class=\"ag-filter-menu-item\"\n [class.ag-filter-menu-item--active]=\"sortDir() === 'desc'\"\n (click)=\"sort.emit('desc')\"\n >\n ↓ {{ localeText().sortDescending }}\n @if (sortPriority() > 0) {\n <span class=\"ag-sort-priority-badge\">{{ sortPriority() }}</span>\n }\n </button>\n @if (hasMultiSort() && sortPriority() > 0) {\n <button class=\"ag-filter-menu-item ag-filter-menu-item--muted\" (click)=\"resetSort.emit(sortDir()!)\">{{ localeText().sortOnlyByThis }}</button>\n }\n @if (sortDir()) {\n <button class=\"ag-filter-menu-item\" (click)=\"sort.emit(sortDir()!)\">{{ localeText().clearSort }}</button>\n }\n </div>\n }\n\n @if (showColumnActions()) {\n <div class=\"ag-filter-menu-section ag-filter-menu-section--border\">\n <button class=\"ag-filter-menu-item\" (click)=\"autosize.emit()\">↔ {{ localeText().autosizeColumn }}</button>\n <button\n class=\"ag-filter-menu-item\"\n [class.ag-filter-menu-item--active]=\"pinned() === 'left'\"\n (click)=\"togglePin.emit()\"\n >⊣ {{ pinned() === 'left' ? localeText().unpinColumn : localeText().pinColumn }}</button>\n <button\n class=\"ag-filter-menu-item\"\n [class.ag-filter-menu-item--active]=\"pinned() === 'right'\"\n (click)=\"togglePinRight.emit()\"\n >⊢ {{ pinned() === 'right' ? localeText().unpinColumnRight : localeText().pinColumnRight }}</button>\n <button class=\"ag-filter-menu-item\" (click)=\"hide.emit()\">{{ localeText().hideColumn }}</button>\n </div>\n }\n\n @if (showColumnActions() && showAggregationActions()) {\n <div class=\"ag-filter-menu-section ag-filter-menu-section--border\">\n <span class=\"ag-filter-menu-aggregate-label\">{{ localeText().aggregate }}</span>\n <div class=\"ag-filter-menu-aggregate-btns\">\n @for (opt of aggregateOptions(); track opt.value) {\n <button\n class=\"ag-aggregate-btn\"\n [class.ag-aggregate-btn--active]=\"aggregate() === opt.value\"\n [title]=\"opt.label\"\n (click)=\"setAggregate.emit(aggregate() === opt.value ? null : opt.value)\"\n >{{ opt.symbol }}</button>\n }\n </div>\n </div>\n }\n\n @if (customItems().length > 0) {\n <div class=\"ag-filter-menu-section ag-filter-menu-section--border ag-filter-menu-custom\">\n @for (item of customItems(); track item.key) {\n <button type=\"button\" [class]=\"[... item.itemClasses??[], ...['ag-filter-menu-item'] ].join(' ')\" [disabled]=\"item.disabled\"\n [attr.data-command-key]=\"item.key\" (click)=\"customAction.emit(item.key)\">\n @if (item.icon) { <span [class]=\"[...item.iconClasses??[] , ... ['ag-filter-menu-item-icon']].join(' ')\" >{{ item.icon }}</span> }\n {{ item.label }}\n </button>\n }\n </div>\n }\n\n @if (groupable()) {\n <div class=\"ag-filter-menu-section ag-filter-menu-section--border\">\n <button\n class=\"ag-filter-menu-item\"\n [class.ag-filter-menu-item--active]=\"grouped()\"\n (click)=\"toggleGroup.emit()\"\n >{{ grouped() ? '⊟ ' + localeText().ungroup : '⊞ ' + localeText().groupBy(header()) }}</button>\n </div>\n }\n\n @if (filterable()) {\n @if (showFilterActions()) {\n <div class=\"ag-filter-menu-section ag-filter-menu-section--border\">\n <button class=\"ag-filter-menu-item ag-filter-menu-item--muted\" (click)=\"clearFilter.emit()\">\n ✕ {{ localeText().clearFilter }}\n </button>\n <button class=\"ag-filter-menu-item ag-filter-menu-item--muted\" (click)=\"clearAll.emit()\">\n ✕ {{ localeText().clearAllFilters }}\n </button>\n </div>\n }\n\n @if (filterType()) {\n <div class=\"ag-filter-menu-section ag-filter-menu-section--border ag-filter-menu-condition\">\n <span class=\"ag-filter-menu-aggregate-label\">{{ localeText().filterCondition }}</span>\n <div class=\"ag-filter-menu-operators\">\n <button\n type=\"button\"\n class=\"ag-filter-menu-operator-btn ag-filter-menu-operator-btn--clear\"\n [class.ag-filter-menu-operator-btn--active]=\"!operator()\"\n (click)=\"operatorChange.emit(null)\"\n >{{ localeText().filterNoCondition }}</button>\n @for (op of operatorOptions(); track op.value) {\n <button\n type=\"button\"\n class=\"ag-filter-menu-operator-btn\"\n [class.ag-filter-menu-operator-btn--active]=\"op.value === operator()\"\n (click)=\"operatorChange.emit(op.value)\"\n >{{ op.label }}</button>\n }\n </div>\n @if (operator()) {\n <label class=\"ag-filter-menu-operand-label\" for=\"agrid-filter-operand\">\n {{ localeText().filterValue }}\n </label>\n <input\n id=\"agrid-filter-operand\"\n class=\"ag-filter-menu-operand\"\n [type]=\"operandInputType()\"\n [value]=\"operand()\"\n (input)=\"operandChange.emit($any($event.target).value)\"\n (click)=\"$event.stopPropagation()\"\n />\n @if (operator() === 'between') {\n <input\n class=\"ag-filter-menu-operand\"\n [type]=\"operandInputType()\"\n [value]=\"operand2()\"\n (input)=\"operand2Change.emit($any($event.target).value)\"\n (click)=\"$event.stopPropagation()\"\n />\n }\n }\n </div>\n }\n\n @if (showValueFilter()) {\n <div class=\"ag-filter-menu-section ag-filter-menu-section--border\">\n <input\n class=\"ag-filter-menu-search\"\n [value]=\"search()\"\n (input)=\"searchChange.emit($any($event.target).value)\"\n [placeholder]=\"localeText().searchValuesPlaceholder\"\n (click)=\"$event.stopPropagation()\"\n />\n </div>\n\n <div class=\"ag-filter-menu-values\">\n <label class=\"ag-filter-menu-value\">\n <input\n type=\"checkbox\"\n [checked]=\"allSelected()\"\n (change)=\"toggleAll.emit()\"\n />\n <span class=\"ag-filter-menu-value-label\">{{ localeText().selectAll }}</span>\n </label>\n @for (item of valueItems(); track item.rawStr) {\n <label\n class=\"ag-filter-menu-value\"\n [class.ag-filter-menu-value--inactive]=\"!item.active\"\n >\n <input\n type=\"checkbox\"\n [checked]=\"item.selected\"\n [disabled]=\"!item.active\"\n (change)=\"toggleValue.emit(item.rawStr)\"\n />\n <span class=\"ag-filter-menu-value-label\">{{ item.label || localeText().blank }}</span>\n </label>\n }\n </div>\n }\n }\n</div>\n","import { DestroyRef, Signal, computed, signal } from '@angular/core';\nimport { AgridBrowserAdapter } from '../infrastructure/agrid-browser.adapter';\nimport { AgridColumnMenuValueItem } from './agrid-column-menu.component';\nimport { AgridControl, FilterOperator } from '../agrid-control';\nimport { AgridDataSource } from '../agrid-datasource';\nimport { ColDef, FilterChangeEvent, SortChangeEvent, ValueOption } from '../agrid.types';\nimport { passesConditionFilter } from '../agrid.utils';\n\n/** Position and target field of the open column menu. @internal */\nexport type AgridColumnMenuState = {\n field: string;\n mode: 'column' | 'condition';\n x: number;\n y: number;\n};\n\n/** Dependencies and callbacks required by {@link AgridColumnMenuController}. @internal */\nexport interface AgridColumnMenuControllerOptions {\n control: Signal<AgridControl | null>;\n dataSource: Signal<AgridDataSource>;\n colDefs: Signal<ColDef[]>;\n serverSideFiltering: Signal<boolean>;\n filterDebounceMs: Signal<number>;\n sortOption: Signal<'single' | 'multi' | 'none'>;\n effectiveSortOrder: () => string[];\n autosizeColumn: (col: ColDef) => void;\n onFilterChange: (event: FilterChangeEvent) => void;\n onSortChange: (event: SortChangeEvent) => void;\n}\n\n/** Owns column-menu state, filters, sorting, and menu-triggered column mutations. @internal */\nexport class AgridColumnMenuController {\n readonly menu = signal<AgridColumnMenuState | null>(null);\n readonly search = signal('');\n\n readonly items = computed<{ label: string; rawStr: string }[]>(() => {\n const menu = this.menu();\n if (!menu) return [];\n const col = this.getColDef(menu.field);\n if (!col?.filterable) return [];\n const values = col?.values;\n if (values?.length) {\n return values\n .map(value => typeof value === 'string'\n ? { label: value, rawStr: value }\n : {\n label: (value as ValueOption).label,\n rawStr: String((value as ValueOption).value),\n })\n .sort((a, b) => a.label.localeCompare(b.label, undefined, { sensitivity: 'base' }));\n }\n\n const rows = this.opts.dataSource().rows();\n const rawValues = [...new Set(rows.map(row => String(row[menu.field] ?? '')))];\n return rawValues\n .map(rawStr => ({\n label: col?.formatter ? col.formatter(rawStr) : rawStr,\n rawStr,\n }))\n .sort((a, b) =>\n a.label.localeCompare(b.label, undefined, { numeric: true, sensitivity: 'base' }),\n );\n });\n\n readonly visibleItems = computed(() => {\n const search = this.search().toLowerCase();\n return this.items().filter(item => !search || item.label.toLowerCase().includes(search));\n });\n\n readonly activeValues = computed(() => {\n const menu = this.menu();\n if (!menu) return new Set<string>();\n const col = this.getColDef(menu.field);\n if (this.opts.serverSideFiltering() && col?.values?.length) {\n return new Set(this.items().map(item => item.rawStr));\n }\n const rows = this.opts.dataSource().rows();\n const control = this.opts.control();\n let indices = rows.map((_, index) => index);\n if (control) {\n for (const [field, filter] of Object.entries(control.filters())) {\n if (field === menu.field) continue;\n if (filter.text) {\n const search = filter.text.toLowerCase();\n indices = indices.filter(index =>\n String(rows[index][field] ?? '').toLowerCase().includes(search),\n );\n }\n if (filter.selectedValues !== null) {\n const allowed = new Set(filter.selectedValues);\n indices = indices.filter(index => allowed.has(String(rows[index][field] ?? '')));\n }\n if (filter.operator && filter.operand != null && filter.operand !== '') {\n const filterCol = this.getColDef(field);\n indices = indices.filter(index =>\n passesConditionFilter(filterCol, rows[index][field], filter),\n );\n }\n }\n }\n return new Set(indices.map(index => String(rows[index][menu.field] ?? '')));\n });\n\n readonly valueItems = computed<AgridColumnMenuValueItem[]>(() => {\n const menu = this.menu();\n if (!menu) return [];\n return this.visibleItems().map(item => ({\n ...item,\n active: this.activeValues().has(item.rawStr),\n selected: this.isValueSelected(menu.field, item.rawStr),\n }));\n });\n\n private readonly filterDebounces = new Map<string, ReturnType<typeof setTimeout>>();\n\n constructor(\n private readonly opts: AgridColumnMenuControllerOptions,\n destroyRef: DestroyRef,\n private readonly browser = new AgridBrowserAdapter(),\n ) {\n destroyRef.onDestroy(() => {\n for (const timer of this.filterDebounces.values()) clearTimeout(timer);\n this.filterDebounces.clear();\n });\n }\n\n /** Returns the active text filter for a field. */\n getTextFilter(field: string): string {\n return this.opts.control()?.getFilter(field).text ?? '';\n }\n\n /** Returns the condition-filter input type for a filterable field. */\n getFilterType(field: string): 'text' | 'number' | 'date' | null {\n const col = this.getColDef(field);\n if (!col?.filterable || col.type === 'boolean') return null;\n return col.type === 'number' || col.type === 'date' ? col.type : 'text';\n }\n\n /** Returns the condition operator for a field, or `null`. */\n getFilterOperator(field: string): FilterOperator | null {\n return this.opts.control()?.getFilter(field).operator ?? null;\n }\n\n /** Returns the primary condition operand for a field. */\n getFilterOperand(field: string): string {\n return this.opts.control()?.getFilter(field).operand ?? '';\n }\n\n /** Returns the secondary condition operand (used by `between`). */\n getFilterOperand2(field: string): string {\n return this.opts.control()?.getFilter(field).operand2 ?? '';\n }\n\n /** Sets the condition operator; clearing it (`null`) also drops the operands. */\n setFilterOperator(field: string, operator: FilterOperator | null): void {\n const control = this.opts.control();\n if (!control) return;\n if (!operator) {\n control.setRangeFilter(field, null, null, null);\n } else {\n const current = control.getFilter(field);\n control.setRangeFilter(field, operator, current.operand ?? '', current.operand2 ?? '');\n }\n this.emitRangeServer(field, false);\n }\n\n /** Sets the primary condition operand. */\n setFilterOperand(field: string, value: string): void {\n const control = this.opts.control();\n if (!control) return;\n const current = control.getFilter(field);\n control.setRangeFilter(field, current.operator ?? 'eq', value, current.operand2 ?? '');\n this.emitRangeServer(field, true);\n }\n\n /** Sets the secondary condition operand (used by `between`). */\n setFilterOperand2(field: string, value: string): void {\n const control = this.opts.control();\n if (!control) return;\n const current = control.getFilter(field);\n control.setRangeFilter(field, current.operator ?? 'between', current.operand ?? '', value);\n this.emitRangeServer(field, true);\n }\n\n /**\n * In server-side filtering mode, emit a {@link FilterChangeEvent} carrying the current\n * condition so the host can refetch. Operand edits are debounced; operator changes are immediate.\n * No-op in client mode (the projection layer filters locally).\n */\n private emitRangeServer(field: string, debounce: boolean): void {\n if (!this.opts.serverSideFiltering()) return;\n const emit = () => {\n const f = this.opts.control()?.getFilter(field);\n this.opts.onFilterChange({\n field,\n value: '',\n operator: f?.operator ?? null,\n operand: f?.operand ?? null,\n operand2: f?.operand2 ?? null,\n });\n };\n this.cancelFilterDebounce(field);\n const delay = this.opts.filterDebounceMs();\n if (!debounce || delay === 0) {\n emit();\n return;\n }\n this.filterDebounces.set(field, setTimeout(() => {\n this.filterDebounces.delete(field);\n emit();\n }, delay));\n }\n\n /** Returns the active sort direction, respecting disabled sorting. */\n getSort(field: string): 'asc' | 'desc' | null {\n return this.opts.sortOption() === 'none'\n ? null\n : this.opts.control()?.getFilter(field).sort ?? null;\n }\n\n /** Returns a field's one-based position in the sort stack. */\n getSortPriority(field: string): number {\n return this.opts.control()?.getSortPriority(field) ?? 0;\n }\n\n /** Returns whether multiple sort fields are currently active. */\n hasMultiSort(): boolean {\n return this.opts.sortOption() === 'multi' && this.opts.effectiveSortOrder().length > 1;\n }\n\n /** Returns whether the value filter currently includes every value. */\n isAllSelected(field: string): boolean {\n return this.opts.control()?.getFilter(field).selectedValues === null;\n }\n\n /** Returns whether a raw value survives filters on other columns. */\n isValueActive(rawStr: string): boolean {\n return this.activeValues().has(rawStr);\n }\n\n /** Returns whether a raw value is selected by the field's value filter. */\n isValueSelected(field: string, value: string): boolean {\n const selected = this.opts.control()?.getFilter(field).selectedValues;\n return selected == null || selected.includes(value);\n }\n\n /** Returns whether a field has active filter or sort state. */\n hasActiveFilter(field: string): boolean {\n return this.opts.control()?.hasActiveFilter(field) ?? false;\n }\n\n /** Updates a text filter and emits its debounced server-side event. */\n onTextFilterChange(event: Event, field: string): void {\n const value = (event.target as HTMLInputElement).value;\n this.opts.control()?.setTextFilter(field, value);\n if (!this.opts.serverSideFiltering()) return;\n\n this.cancelFilterDebounce(field);\n const delay = this.opts.filterDebounceMs();\n if (delay === 0) {\n this.opts.onFilterChange({ field, value });\n return;\n }\n this.filterDebounces.set(field, setTimeout(() => {\n this.filterDebounces.delete(field);\n this.opts.onFilterChange({ field, value });\n }, delay));\n }\n\n /** Opens the requested column menu, or closes it when that column is already open. */\n open(event: MouseEvent, field: string, mode: 'column' | 'condition' = 'column'): void {\n event.stopPropagation();\n if (this.menu()?.field === field && this.menu()?.mode === mode) {\n this.close();\n return;\n }\n this.search.set('');\n this.menu.set({\n field,\n mode,\n x: Math.min(event.clientX, this.browser.viewportWidth() - 220),\n y: event.clientY,\n });\n }\n\n /** Closes the column menu. */\n close(): void {\n this.menu.set(null);\n }\n\n /** Updates the distinct-value search text. */\n setSearch(value: string): void {\n this.search.set(value);\n }\n\n /** Applies or clears a sort according to the configured sorting mode. */\n sort(field: string, direction: 'asc' | 'desc'): void {\n const control = this.opts.control();\n if (!control || this.opts.sortOption() === 'none') return;\n if (control.getFilter(field).sort === direction) {\n const previous = control.getFilter(field);\n control.clearFilter(field);\n if (previous.text) control.setTextFilter(field, previous.text);\n if (previous.selectedValues !== null) {\n control.setSelectedValues(field, previous.selectedValues);\n }\n if (previous.operator) {\n control.setRangeFilter(\n field,\n previous.operator,\n previous.operand ?? null,\n previous.operand2 ?? null,\n );\n }\n if (this.opts.serverSideFiltering()) {\n this.opts.onSortChange({ field, direction: null });\n }\n } else if (this.opts.sortOption() === 'single') {\n const previousFields = control.sortOrder().filter(sortedField => sortedField !== field);\n control.setSort(field, direction);\n if (this.opts.serverSideFiltering()) {\n for (const previousField of previousFields) {\n this.opts.onSortChange({ field: previousField, direction: null });\n }\n this.opts.onSortChange({ field, direction });\n }\n } else {\n control.addSort(field, direction);\n if (this.opts.serverSideFiltering()) {\n this.opts.onSortChange({ field, direction });\n }\n }\n this.close();\n }\n\n /** Clears filter and sort state for one field. */\n clearFilter(field: string): void {\n const control = this.opts.control();\n if (!control) return;\n this.cancelFilterDebounce(field);\n const previous = control.getFilter(field);\n control.clearFilter(field);\n if (this.opts.serverSideFiltering()) {\n if (previous.text) this.opts.onFilterChange({ field, value: '' });\n if (previous.operator) {\n this.opts.onFilterChange({ field, value: '', operator: null, operand: null, operand2: null });\n }\n if (previous.sort) this.opts.onSortChange({ field, direction: null });\n }\n this.close();\n }\n\n /** Replaces the multi-sort stack with one field and direction. */\n resetSort(field: string, direction: 'asc' | 'desc'): void {\n const control = this.opts.control();\n if (!control || this.opts.sortOption() !== 'multi') return;\n const previousFields = control.sortOrder().filter(sortedField => sortedField !== field);\n control.setSort(field, direction);\n if (this.opts.serverSideFiltering()) {\n for (const previousField of previousFields) {\n this.opts.onSortChange({ field: previousField, direction: null });\n }\n this.opts.onSortChange({ field, direction });\n }\n this.close();\n }\n\n /** Toggles grouping by a field. */\n toggleGroupBy(field: string): void {\n const control = this.opts.control();\n if (!control) return;\n control.setGroupBy(control.groupByField() === field ? null : field);\n this.close();\n }\n\n /** Clears filter and sort state for every field. */\n clearAll(): void {\n const control = this.opts.control();\n if (!control) return;\n for (const field of this.filterDebounces.keys()) this.cancelFilterDebounce(field);\n const previous = control.filters();\n control.clearAllFilters();\n if (this.opts.serverSideFiltering()) {\n for (const [field, filter] of Object.entries(previous)) {\n if (filter.text) this.opts.onFilterChange({ field, value: '' });\n if (filter.operator) {\n this.opts.onFilterChange({ field, value: '', operator: null, operand: null, operand2: null });\n }\n if (filter.sort) this.opts.onSortChange({ field, direction: null });\n }\n }\n this.close();\n }\n\n /** Selects or deselects every distinct value for a field. */\n toggleAll(field: string): void {\n const control = this.opts.control();\n if (!control) return;\n control.setSelectedValues(\n field,\n control.getFilter(field).selectedValues === null ? [] : null,\n );\n }\n\n /** Toggles one raw value in a field's value filter. */\n toggleValue(field: string, rawStr: string): void {\n const control = this.opts.control();\n if (!control) return;\n const allValues = this.items().map(item => item.rawStr);\n const current = control.getFilter(field).selectedValues ?? allValues;\n const next = current.includes(rawStr)\n ? current.filter(value => value !== rawStr)\n : [...current, rawStr];\n control.setSelectedValues(field, next.length === allValues.length ? null : next);\n }\n\n /** Toggles left pinning for a field. */\n togglePin(field: string): void {\n this.opts.control()?.togglePinned(field);\n this.close();\n }\n\n /** Toggles right pinning for a field. */\n togglePinRight(field: string): void {\n this.opts.control()?.togglePinnedRight(field);\n this.close();\n }\n\n /** Autosizes a field and closes the menu. */\n autosize(field: string): void {\n const col = this.getColDef(field);\n if (!col) return;\n this.opts.autosizeColumn(col);\n this.close();\n }\n\n /** Sets a built-in aggregate for a field. */\n setAggregate(\n field: string,\n aggregate: 'sum' | 'avg' | 'min' | 'max' | 'count' | null,\n ): void {\n this.opts.control()?.setAggregate(field, aggregate);\n this.close();\n }\n\n /** Hides a field and closes the menu. */\n hideColumn(field: string): void {\n this.opts.control()?.setColumnVisibility(field, false);\n this.close();\n }\n\n /** Toggles field visibility from the sidebar column list. */\n toggleColumnVisibility(field: string): void {\n this.opts.control()?.toggleColumnVisibility(field);\n }\n\n /** Sets visibility for several fields from a sidebar header-group toggle. */\n setColumnsVisibility(fields: string[], visible: boolean): void {\n const control = this.opts.control();\n if (!control) return;\n for (const field of fields) {\n control.setColumnVisibility(field, visible);\n }\n }\n\n private getColDef(field: string): ColDef | undefined {\n return this.opts.colDefs().find(col => col.field === field);\n }\n\n private cancelFilterDebounce(field: string): void {\n const timer = this.filterDebounces.get(field);\n if (timer === undefined) return;\n clearTimeout(timer);\n this.filterDebounces.delete(field);\n }\n}\n","import { DestroyRef, Signal, signal } from '@angular/core';\nimport { AgridBrowserAdapter } from '../infrastructure/agrid-browser.adapter';\nimport { AgridControl } from '../agrid-control';\nimport { ColDef } from '../agrid.types';\n\n/** View state for the floating column header shown during a reorder drag. @internal */\nexport interface AgridColumnDragPreview {\n field: string;\n fields: string[];\n label: string;\n x: number;\n y: number;\n width: number;\n height: number;\n}\n\ntype AgridColumnDropTarget = {\n field: string;\n left: number;\n right: number;\n top: number;\n bottom: number;\n};\n\n/** Dependencies required by {@link AgridColumnReorderController}. @internal */\nexport interface AgridColumnReorderControllerOptions {\n control: Signal<AgridControl | null>;\n visibleColDefs: Signal<ColDef[]>;\n getColDef: (field: string) => ColDef | undefined;\n}\n\n/** Owns column header drag/drop state and column reordering. @internal */\nexport class AgridColumnReorderController {\n private readonly dragFields = signal<string[]>([]);\n private readonly dragOverField = signal<string | null>(null);\n private readonly dragInsertBefore = signal(true);\n readonly preview = signal<AgridColumnDragPreview | null>(null);\n private dragStartFields: string[] = [];\n private dragLabel = '';\n private dragStartX = 0;\n private dragStartY = 0;\n private pointerOffsetX = 0;\n private pointerOffsetY = 0;\n private draggedWidth = 0;\n private draggedHeight = 0;\n private dropTargets: AgridColumnDropTarget[] = [];\n\n constructor(\n private readonly opts: AgridColumnReorderControllerOptions,\n destroyRef: DestroyRef,\n private readonly browser = new AgridBrowserAdapter(),\n ) {\n destroyRef.onDestroy(() => this.cancel());\n }\n\n /** Arms a column reorder gesture for an unlocked header. */\n start(event: PointerEvent, field: string): void {\n const col = this.opts.getColDef(field);\n this.startFields(event, [field], col?.header ?? field);\n }\n\n /** Arms a grouped-header reorder gesture for a contiguous field segment. */\n startGroup(event: PointerEvent, fields: readonly string[], label: string): void {\n this.startFields(event, fields, label);\n }\n\n private startFields(event: PointerEvent, fields: readonly string[], label: string): void {\n if (!this.opts.control() || event.button !== 0) return;\n if (fields.length === 0 || fields.some(field => this.opts.getColDef(field)?.locked)) return;\n const header = event.currentTarget as HTMLElement | null;\n const rect = header?.getBoundingClientRect();\n this.dragStartFields = [...fields];\n this.dragLabel = label;\n this.dragStartX = event.clientX;\n this.dragStartY = event.clientY;\n this.draggedWidth = rect?.width ?? 0;\n this.draggedHeight = rect?.height ?? 32;\n this.pointerOffsetX = rect ? event.clientX - rect.left : 0;\n this.pointerOffsetY = rect ? event.clientY - rect.top : 0;\n this.dropTargets = this.captureDropTargets(header);\n this.browser.addDocumentListener('pointermove', this.dragMove);\n this.browser.addDocumentListener('pointerup', this.dragUp);\n this.browser.addDocumentListener('pointercancel', this.dragCancel);\n }\n\n /** Returns whether the field is currently being dragged. */\n isDragging(field: string): boolean {\n return this.dragFields().includes(field);\n }\n\n /** Returns the active drop-indicator side for a field. */\n getDropSide(field: string): 'before' | 'after' | null {\n if (this.dragOverField() !== field || this.dragFields().includes(field)) return null;\n return this.dragInsertBefore() ? 'before' : 'after';\n }\n\n /** Horizontal translation used to animate headers away from the pending insertion gap. */\n getHeaderOffset(field: string): number {\n const movingFields = this.dragFields();\n const overField = this.dragOverField();\n if (movingFields.length === 0 || !overField || movingFields.includes(field)\n || this.draggedWidth <= 0) return 0;\n\n const fields = this.opts.visibleColDefs().map(col => col.field);\n const fromIndex = fields.findIndex(value => movingFields.includes(value));\n const remaining = fields.filter(value => !movingFields.includes(value));\n const overIndex = remaining.indexOf(overField);\n const fieldIndex = remaining.indexOf(field);\n if (fromIndex < 0 || overIndex < 0 || fieldIndex < 0) return 0;\n\n const insertionIndex = overIndex + (this.dragInsertBefore() ? 0 : 1);\n if (insertionIndex < fromIndex && fieldIndex >= insertionIndex && fieldIndex < fromIndex) {\n return this.draggedWidth;\n }\n if (insertionIndex > fromIndex && fieldIndex >= fromIndex && fieldIndex < insertionIndex) {\n return -this.draggedWidth;\n }\n return 0;\n }\n\n private readonly dragMove = (event: PointerEvent): void => {\n if (this.dragStartFields.length === 0) return;\n if (this.dragFields().length === 0) {\n if (Math.abs(event.clientX - this.dragStartX) < 5) return;\n this.dragFields.set([...this.dragStartFields]);\n this.preview.set({\n field: this.dragStartFields[0],\n fields: [...this.dragStartFields],\n label: this.dragLabel,\n x: event.clientX - this.pointerOffsetX,\n y: event.clientY - this.pointerOffsetY,\n width: this.draggedWidth,\n height: this.draggedHeight,\n });\n } else {\n this.preview.update(preview => preview ? {\n ...preview,\n x: event.clientX - this.pointerOffsetX,\n y: event.clientY - this.pointerOffsetY,\n } : null);\n }\n const hovered = this.getHoveredHeaderCell(event.clientX, event.clientY);\n if (hovered && !this.dragFields().includes(hovered.field)) {\n this.dragOverField.set(hovered.field);\n this.dragInsertBefore.set(hovered.insertBefore);\n } else {\n this.dragOverField.set(null);\n }\n };\n\n private readonly dragUp = (): void => {\n this.removeListeners();\n const from = this.dragFields();\n const to = this.dragOverField();\n if (from.length > 0 && to) {\n this.opts.control()?.moveColumns(\n this.opts.visibleColDefs().map(col => col.field),\n from,\n to,\n this.dragInsertBefore(),\n );\n }\n this.dragFields.set([]);\n this.dragOverField.set(null);\n this.dragInsertBefore.set(true);\n this.preview.set(null);\n this.dragStartFields = [];\n this.dragLabel = '';\n this.dropTargets = [];\n };\n\n private readonly dragCancel = (): void => this.cancel();\n\n private cancel(): void {\n this.removeListeners();\n this.dragFields.set([]);\n this.dragOverField.set(null);\n this.dragInsertBefore.set(true);\n this.preview.set(null);\n this.dragStartFields = [];\n this.dragLabel = '';\n this.dropTargets = [];\n }\n\n private removeListeners(): void {\n this.browser.removeDocumentListener('pointermove', this.dragMove);\n this.browser.removeDocumentListener('pointerup', this.dragUp);\n this.browser.removeDocumentListener('pointercancel', this.dragCancel);\n }\n\n private getHoveredHeaderCell(x: number, _y: number): { field: string; insertBefore: boolean } | null {\n const target = this.dropTargets.find(rect => x >= rect.left && x <= rect.right);\n return target\n ? { field: target.field, insertBefore: x < target.left + (target.right - target.left) / 2 }\n : null;\n }\n\n private captureDropTargets(header: HTMLElement | null): AgridColumnDropTarget[] {\n const root = header?.closest('.ag-wrapper') ?? header?.ownerDocument;\n if (!root) return [];\n return Array.from(root.querySelectorAll<HTMLElement>('.ag-header-cell[data-col-field]'))\n .map(element => {\n const field = element.dataset['colField'];\n const rect = element.getBoundingClientRect();\n return field ? {\n field,\n left: rect.left,\n right: rect.right,\n top: rect.top,\n bottom: rect.bottom,\n } : null;\n })\n .filter((target): target is AgridColumnDropTarget => target !== null);\n }\n\n}\n","import { DestroyRef, Signal, signal } from '@angular/core';\nimport { AgridBrowserAdapter } from '../infrastructure/agrid-browser.adapter';\nimport { AgridControl } from '../agrid-control';\nimport { ColDef, GridItem } from '../agrid.types';\nimport { getDisplayForField, isDataRowItem } from '../agrid.utils';\n\n/** Dependencies required by {@link AgridColumnSizingController}. @internal */\nexport interface AgridColumnSizingOptions {\n control: Signal<AgridControl | null>;\n filteredItems: Signal<GridItem[]>;\n visibleColDefs: Signal<ColDef[]>;\n scrollableColDefs: Signal<ColDef[]>;\n locale: Signal<string>;\n isColumnPinned: (field: string) => boolean;\n wrapperElement: () => HTMLElement;\n scrollerElement: () => HTMLElement;\n}\n\n/**\n * Owns column widths, resize interactions, autosizing, and horizontal visibility.\n * @internal\n */\nexport class AgridColumnSizingController {\n private readonly localWidths = signal<Record<string, number>>({});\n private resizeState: { field: string; startX: number; startWidth: number } | null = null;\n\n constructor(\n private readonly opts: AgridColumnSizingOptions,\n destroyRef: DestroyRef,\n private readonly browser = new AgridBrowserAdapter(),\n ) {\n destroyRef.onDestroy(() => this.finishResize());\n }\n\n /** Returns a column's effective fixed width, or `0` for flexible columns. */\n getWidth(col: ColDef): number {\n const override = this.widthOverride(col.field);\n if (override !== undefined) return override;\n return col.width == null || col.width === -1 ? 0 : col.width;\n }\n\n /** Returns the CSS grid width token for a column. */\n getWidthToken(col: ColDef): string {\n const override = this.widthOverride(col.field);\n if (override !== undefined) return `${override}px`;\n return col.width == null || col.width === -1 ? '1fr' : `${col.width}px`;\n }\n\n /** Stores a clamped runtime width in the control or local fallback state. */\n setWidth(field: string, width: number): void {\n const control = this.opts.control();\n if (control) {\n control.setColumnWidth(field, width);\n } else {\n this.localWidths.update(widths => ({\n ...widths,\n [field]: Math.max(40, width),\n }));\n }\n }\n\n /** Starts pointer-driven resizing for an unlocked column. */\n startResize(event: MouseEvent, col: ColDef): void {\n if (col.locked) return;\n event.preventDefault();\n event.stopPropagation();\n const renderedWidth = (event.currentTarget as HTMLElement)\n .closest<HTMLElement>('.ag-header-cell')\n ?.getBoundingClientRect().width;\n this.resizeState = {\n field: col.field,\n startX: event.clientX,\n startWidth: this.getWidth(col) || renderedWidth || 100,\n };\n this.browser.setBodyInteraction('col-resize', 'none');\n this.browser.addDocumentListener('mousemove', this.resizeMove);\n this.browser.addDocumentListener('mouseup', this.resizeUp);\n }\n\n /** Adjusts an unlocked column width with keyboard arrow keys. */\n resizeFromKeyboard(event: KeyboardEvent, col: ColDef): void {\n if (col.locked || (event.key !== 'ArrowLeft' && event.key !== 'ArrowRight')) return;\n event.preventDefault();\n const delta = event.key === 'ArrowLeft' ? -10 : 10;\n this.setWidth(col.field, this.getWidth(col) + delta);\n }\n\n /** Sizes one unlocked column to fit its header and visible values. */\n autosizeColumn(col: ColDef): void {\n if (col.locked) return;\n const context = this.getAutosizeContext();\n if (!context) return;\n this.setWidth(col.field, this.measureAutosizeWidth(col, context));\n }\n\n /** Sizes every unlocked visible column to its current content. */\n autosizeAllColumns(): void {\n const context = this.getAutosizeContext();\n if (!context) return;\n for (const col of this.opts.visibleColDefs()) {\n if (!col.locked) this.setWidth(col.field, this.measureAutosizeWidth(col, context));\n }\n }\n\n /** Horizontally scrolls an unpinned column into view. */\n scrollColumnToKeepVisible(colIndex: number): void {\n const col = this.opts.visibleColDefs()[colIndex];\n if (!col || this.opts.isColumnPinned(col.field)) return;\n\n const scroller = this.opts.scrollerElement();\n const { start, end } = this.getScrollableColumnBounds(col.field);\n const maxScrollLeft = Math.max(0, scroller.scrollWidth - scroller.clientWidth);\n let nextScrollLeft = scroller.scrollLeft;\n\n if (start < nextScrollLeft) {\n nextScrollLeft = start;\n } else if (end > nextScrollLeft + scroller.clientWidth) {\n nextScrollLeft = end - scroller.clientWidth;\n }\n\n nextScrollLeft = Math.max(0, Math.min(maxScrollLeft, nextScrollLeft));\n if (nextScrollLeft !== scroller.scrollLeft) scroller.scrollLeft = nextScrollLeft;\n }\n\n private readonly resizeMove = (event: MouseEvent): void => {\n if (!this.resizeState) return;\n this.setWidth(\n this.resizeState.field,\n this.resizeState.startWidth + (event.clientX - this.resizeState.startX),\n );\n };\n\n private readonly resizeUp = (): void => this.finishResize();\n\n private finishResize(): void {\n this.resizeState = null;\n this.browser.setBodyInteraction('', '');\n this.browser.removeDocumentListener('mousemove', this.resizeMove);\n this.browser.removeDocumentListener('mouseup', this.resizeUp);\n }\n\n private widthOverride(field: string): number | undefined {\n return this.opts.control()?.columnWidths()[field] ?? this.localWidths()[field];\n }\n\n private getScrollableColumnBounds(field: string): { start: number; end: number } {\n let start = 0;\n for (const col of this.opts.scrollableColDefs()) {\n const width = this.getWidth(col);\n if (col.field === field) return { start, end: start + width };\n start += width;\n }\n return { start: 0, end: 0 };\n }\n\n private measureAutosizeWidth(\n col: ColDef,\n context: CanvasRenderingContext2D,\n ): number {\n const values = [col.header];\n for (const item of this.opts.filteredItems()) {\n if (!isDataRowItem(item)) continue;\n values.push(getDisplayForField(col, item.row[col.field], this.opts.locale()));\n }\n const measured = values.reduce(\n (max, value) => Math.max(max, context.measureText(value).width),\n 0,\n );\n return Math.max(40, Math.min(500, Math.ceil(measured + 42)));\n }\n\n private getAutosizeContext(): CanvasRenderingContext2D | null {\n const context = this.browser.createCanvasContext();\n if (!context) return null;\n const style = this.browser.computedStyle(this.opts.wrapperElement());\n if (style) context.font = `${style.fontWeight} ${style.fontSize} ${style.fontFamily}`;\n return context;\n }\n}\n","import { Signal, computed } from '@angular/core';\nimport { AgridControl } from '../agrid-control';\nimport { ColDef } from '../agrid.types';\n\n/** Reactive column state consumed by {@link AgridColumnStateService}. @internal */\nexport interface AgridColumnStateOptions {\n control: Signal<AgridControl | null>;\n colDefs: Signal<ColDef[]>;\n visibleColDefs: Signal<ColDef[]>;\n pinnedColDefs: Signal<ColDef[]>;\n rightPinnedColDefs: Signal<ColDef[]>;\n showControlColumn: Signal<boolean>;\n}\n\n/** Provides template-facing column lookup, pinning, visibility, and ARIA state. @internal */\nexport class AgridColumnStateService {\n constructor(private readonly opts: AgridColumnStateOptions) {}\n\n private readonly columnsByField = computed(() =>\n new Map(this.opts.colDefs().map(col => [col.field, col])),\n );\n\n private readonly visibleIndexByField = computed(() =>\n new Map(this.opts.visibleColDefs().map((col, index) => [col.field, index])),\n );\n\n /** Finds a column definition by field name. */\n getColDef(field: string): ColDef | undefined {\n return this.columnsByField().get(field);\n }\n\n /** Returns a field's zero-based index among visible columns. */\n getVisibleColIndex(field: string): number {\n return this.visibleIndexByField().get(field) ?? -1;\n }\n\n /** Converts a visible data-column index to a one-based ARIA index. */\n getAriaColIndex(colIndex: number): number {\n return colIndex + 1 + (this.opts.showControlColumn() ? 1 : 0);\n }\n\n /** Returns whether a field is hidden by the grid control. */\n isColumnHidden(field: string): boolean {\n return this.opts.control()?.isColumnHidden(field) ?? false;\n }\n\n /** Returns whether the grid is grouped by the field. */\n isGroupedByField(field: string): boolean {\n return this.opts.control()?.groupByField() === field;\n }\n\n /** Returns whether a field is pinned to the left. */\n isColumnPinned(field: string): boolean {\n return this.opts.pinnedColDefs().some(col => col.field === field);\n }\n\n /** Returns whether a field is pinned to the right. */\n isColumnPinnedRight(field: string): boolean {\n return this.opts.rightPinnedColDefs().some(col => col.field === field);\n }\n\n /** Returns the field's current pin side, or `false` when unpinned. */\n getColumnPinState(field: string): 'left' | 'right' | false {\n if (this.isColumnPinned(field)) return 'left';\n if (this.isColumnPinnedRight(field)) return 'right';\n return false;\n }\n\n /** Returns whether the field is the first right-pinned column. */\n isFirstRightPinnedColumn(field: string): boolean {\n const cols = this.opts.rightPinnedColDefs();\n return cols.length > 0 && cols[0].field === field;\n }\n\n /** Returns whether the field is the last left-pinned column. */\n isLastPinnedColumn(field: string): boolean {\n const cols = this.opts.pinnedColDefs();\n return cols.length > 0 && cols[cols.length - 1].field === field;\n }\n}\n","import { Signal, WritableSignal, isWritableSignal, linkedSignal, signal } from '@angular/core';\n\n/**\n * Signal-based data container shared between the grid and the host component.\n *\n * Both the grid and the host component hold a reference to the same `AgridDataSource`\n * instance. Mutations made by either side (e.g. the grid calling `patchRow` when a cell\n * is committed, or the host calling `setData` to load fresh data) are immediately reflected\n * in the grid because {@link rows} is a readonly Angular signal.\n *\n * @example\n * ```ts\n * readonly ds = new AgridDataSource(generateRows(1000));\n *\n * // Later — update one row from outside the grid:\n * this.ds.patchRow(5, { salary: 99000 });\n * ```\n */\nexport class AgridDataSource<T extends object = any> {\n private readonly _linkedRows = signal<Signal<T[]> | null>(null);\n private readonly _rows = linkedSignal<T[]>(() => this._linkedRows()?.() ?? []);\n private _writableLinkedRows: WritableSignal<T[]> | null = null;\n private readonly _rowAdded = signal<{ index: number; sequence: number } | null>(null);\n private _changeSequence = 0;\n\n /**\n * @param initialData Rows to seed the data source with.\n * The array is shallow-copied so external mutations do not affect the source.\n */\n constructor(initialData: T[] = []) {\n this._rows.set([...initialData]);\n }\n\n /**\n * Readonly signal of the current row array.\n * Read it inside Angular templates or `computed()` to react to changes automatically.\n */\n readonly rows: Signal<T[]> = this._rows.asReadonly();\n\n /** Latest row insertion, used by attached grids to reveal the inserted row. */\n readonly rowAdded: Signal<{ index: number; sequence: number } | null> =\n this._rowAdded.asReadonly();\n\n /**\n * Link an external row signal to this data source.\n *\n * Whenever `source` changes, its array becomes the current datasource value without an\n * intermediate effect or array copy. If `source` is writable, datasource mutations are written\n * back to it automatically. Mutations remain local when linking a readonly signal.\n */\n linkSignal(source: Signal<T[]>): void {\n this._writableLinkedRows = isWritableSignal(source)\n ? source as WritableSignal<T[]>\n : null;\n this._linkedRows.set(source);\n }\n\n /**\n * Replace the entire row array.\n * Triggers a full grid re-render via the signal.\n */\n setData(rows: T[]): void {\n this.setRows([...rows]);\n }\n\n /**\n * Overwrite the row at `index` with a new row object.\n * Use {@link patchRow} when you only want to change specific fields.\n */\n updateRow(index: number, row: T): void {\n this.updateRows(rows => {\n const next = [...rows];\n next[index] = row;\n return next;\n });\n }\n\n /**\n * Merge `patch` into the existing row at `index`, leaving other fields untouched.\n * The grid calls this internally when a cell edit is committed.\n */\n patchRow(index: number, patch: Partial<T>): void {\n this.updateRows(rows => {\n const next = [...rows];\n next[index] = { ...next[index], ...patch } as T;\n return next;\n });\n }\n\n /**\n * Insert a row into the data source and return the index at which it was inserted.\n *\n * @param row The row object to insert.\n * @param atIndex Optional insertion index. Defaults to the end of the array.\n * @returns The index the row was inserted at.\n */\n addRow(row: T, atIndex?: number): number {\n let insertedAt!: number;\n this.updateRows(rows => {\n if (atIndex === undefined) {\n insertedAt = rows.length;\n return [...rows, row];\n }\n insertedAt = atIndex;\n const next = [...rows];\n next.splice(atIndex, 0, row);\n return next;\n });\n this._rowAdded.set({ index: insertedAt, sequence: ++this._changeSequence });\n return insertedAt;\n }\n\n /**\n * Remove the row at `index`.\n * The grid adjusts `selectedCell` and `editingCell` internally when a deletion occurs\n * via the control column context menu.\n */\n removeRow(index: number): void {\n this.updateRows(rows => rows.filter((_, i) => i !== index));\n }\n\n /**\n * Move the row at `from` to position `to` (insert-before semantics).\n * Designed to be called directly from a `(rowReorder)` handler:\n * ```ts\n * onReorder(e: RowReorderEvent) { this.ds.moveRow(e.oldIndex, e.newIndex); }\n * ```\n */\n moveRow(from: number, to: number): void {\n if (from === to) return;\n this.updateRows(rows => {\n const arr = [...rows];\n const [item] = arr.splice(from, 1);\n arr.splice(to > from ? to - 1 : to, 0, item);\n return arr;\n });\n }\n\n /** Return the current row at `index` (non-reactive snapshot). */\n getRow(index: number): T {\n return this._rows()[index];\n }\n\n /** Current number of rows (non-reactive snapshot). */\n get length(): number {\n return this._rows().length;\n }\n\n private updateRows(update: (rows: T[]) => T[]): void {\n this.setRows(update(this._rows()));\n }\n\n /** Replace the backing row array without copying. Intended for specialized datasource models. */\n protected setRows(rows: T[]): void {\n this._writableLinkedRows?.set(rows);\n this._rows.set(rows);\n }\n}\n","import { DestroyRef, Signal, WritableSignal, signal } from '@angular/core';\nimport { AgridBrowserAdapter } from '../infrastructure/agrid-browser.adapter';\nimport { AgridDataSource } from '../agrid-datasource';\nimport { ColDef, GridItem, RowReorderEvent } from '../agrid.types';\nimport { buildSelectionRange, getDisplayForField } from '../agrid.utils';\n\n/** Dependencies and callbacks required by {@link AgridDragHandler}. @internal */\nexport interface AgridDragHandlerOptions {\n dataSource: Signal<AgridDataSource>;\n filteredItems: () => GridItem[];\n locale: () => string | undefined;\n selectedIndices: WritableSignal<Set<number>>;\n onReorder: (event: RowReorderEvent) => void;\n onSelectionChange: () => void;\n}\n\n/**\n * Handles both row-reorder drag and drag-select. The two share `_getHoveredRow`\n * and the same pointer-event lifecycle pattern, so they live together.\n *\n * Signals exposed here are read by the component's `displayItems` computed\n * to render the ghost row during a reorder drag.\n *\n * @internal\n */\nexport class AgridDragHandler {\n readonly reorderOriginalIndex = signal<number | null>(null);\n readonly reorderOverIndex = signal<number | null>(null);\n readonly reorderInsertBefore = signal<boolean>(true);\n\n private _overlayEl: HTMLElement | null = null;\n private _offsetX = 0;\n private _offsetY = 0;\n private _dragSelAnchor: number | null = null;\n\n constructor(\n private readonly opts: AgridDragHandlerOptions,\n destroyRef: DestroyRef,\n private readonly browser = new AgridBrowserAdapter(),\n ) {\n destroyRef.onDestroy(() => this._cleanupReorder());\n destroyRef.onDestroy(() => this._cancelDragSelect());\n }\n\n /** Starts a row reorder gesture and creates its floating preview. */\n startReorder(event: PointerEvent, originalIndex: number): void {\n event.preventDefault();\n event.stopPropagation();\n const rowEl = (event.currentTarget as HTMLElement).closest<HTMLElement>('.ag-row');\n if (!rowEl) return;\n const rect = rowEl.getBoundingClientRect();\n this.reorderOriginalIndex.set(originalIndex);\n this._offsetX = event.clientX - rect.left;\n this._offsetY = event.clientY - rect.top;\n\n const overlay = rowEl.cloneNode(true) as HTMLElement;\n overlay.removeAttribute('data-original-index');\n Object.assign(overlay.style, {\n position: 'fixed', top: `${rect.top}px`, left: `${rect.left}px`,\n width: `${rect.width}px`, height: `${rect.height}px`,\n pointerEvents: 'none', zIndex: '9999', background: '#fff',\n border: '1px solid #1a73e8', borderRadius: '4px',\n boxShadow: '0 4px 16px rgba(0,0,0,0.15)', overflow: 'hidden',\n opacity: '0.95', cursor: 'grabbing',\n });\n if (!this.browser.appendToBody(overlay)) {\n this._clearReorder();\n return;\n }\n this._overlayEl = overlay;\n this.browser.addDocumentListener('pointermove', this._reorderMove);\n this.browser.addDocumentListener('pointerup', this._reorderUp);\n this.browser.addDocumentListener('pointercancel', this._reorderCancel);\n }\n\n /** Returns the formatted value shown in a reorder ghost cell. */\n getGhostDisplay(col: ColDef): string {\n const idx = this.reorderOriginalIndex();\n if (idx === null) return '';\n return getDisplayForField(col, this.opts.dataSource().rows()[idx]?.[col.field], this.opts.locale());\n }\n\n private readonly _reorderMove = (e: PointerEvent): void => {\n if (this._overlayEl) {\n this._overlayEl.style.top = `${e.clientY - this._offsetY}px`;\n this._overlayEl.style.left = `${e.clientX - this._offsetX}px`;\n }\n const hovered = this._getHoveredRow(e.clientX, e.clientY);\n if (hovered) {\n if (this.reorderOverIndex() !== hovered.originalIndex) this.reorderOverIndex.set(hovered.originalIndex);\n if (this.reorderInsertBefore() !== hovered.insertBefore) this.reorderInsertBefore.set(hovered.insertBefore);\n } else {\n this.reorderOverIndex.set(null);\n }\n };\n\n private readonly _reorderUp = (_e: PointerEvent): void => {\n this._removeReorderListeners();\n const overlay = this._overlayEl;\n this._overlayEl = null;\n if (overlay) {\n overlay.style.transition = 'opacity 80ms ease';\n overlay.style.opacity = '0';\n this.browser.schedule(() => overlay.remove(), 90);\n }\n const oldIndex = this.reorderOriginalIndex();\n const overIdx = this.reorderOverIndex();\n if (oldIndex !== null && overIdx !== null) {\n const newIndex = this.reorderInsertBefore() ? overIdx : overIdx + 1;\n const shouldEmit = oldIndex !== newIndex;\n this._clearReorder();\n if (shouldEmit) {\n this.opts.onReorder({ row: { ...this.opts.dataSource().rows()[oldIndex] }, oldIndex, newIndex });\n }\n } else {\n this._clearReorder();\n }\n };\n\n private readonly _reorderCancel = (): void => this._cleanupReorder();\n\n private _cleanupReorder(): void {\n this._removeReorderListeners();\n this._overlayEl?.remove();\n this._overlayEl = null;\n this._clearReorder();\n }\n\n private _removeReorderListeners(): void {\n this.browser.removeDocumentListener('pointermove', this._reorderMove);\n this.browser.removeDocumentListener('pointerup', this._reorderUp);\n this.browser.removeDocumentListener('pointercancel', this._reorderCancel);\n }\n\n private _clearReorder(): void {\n this.reorderOriginalIndex.set(null);\n this.reorderOverIndex.set(null);\n this.reorderInsertBefore.set(true);\n }\n\n /** Starts pointer-driven multi-row selection from an anchor row. */\n startDragSelect(originalIndex: number): void {\n this._dragSelAnchor = originalIndex;\n this.browser.addDocumentListener('pointermove', this._dragSelMove);\n this.browser.addDocumentListener('pointerup', this._dragSelUp);\n this.browser.addDocumentListener('pointercancel', this._dragSelCancel);\n }\n\n private readonly _dragSelMove = (e: PointerEvent): void => {\n const anchor = this._dragSelAnchor;\n if (anchor === null) return;\n const hovered = this._getHoveredRow(e.clientX, e.clientY);\n if (!hovered) return;\n this.opts.selectedIndices.set(\n buildSelectionRange(anchor, hovered.originalIndex, this.opts.filteredItems())\n );\n };\n\n private readonly _dragSelUp = (): void => {\n this._removeDragSelectListeners();\n this._dragSelAnchor = null;\n this.opts.onSelectionChange();\n };\n\n private readonly _dragSelCancel = (): void => this._cancelDragSelect();\n\n private _cancelDragSelect(): void {\n this._removeDragSelectListeners();\n this._dragSelAnchor = null;\n }\n\n private _removeDragSelectListeners(): void {\n this.browser.removeDocumentListener('pointermove', this._dragSelMove);\n this.browser.removeDocumentListener('pointerup', this._dragSelUp);\n this.browser.removeDocumentListener('pointercancel', this._dragSelCancel);\n }\n\n private _getHoveredRow(x: number, y: number): { originalIndex: number; insertBefore: boolean } | null {\n for (const el of this.browser.elementsFromPoint(x, y)) {\n const rowEl = (el as HTMLElement).closest<HTMLElement>('.ag-row[data-original-index]');\n if (!rowEl) continue;\n const rect = rowEl.getBoundingClientRect();\n return {\n originalIndex: Number(rowEl.dataset['originalIndex']),\n insertBefore: y < rect.top + rect.height / 2,\n };\n }\n return null;\n }\n}\n","import { Signal, WritableSignal, signal } from '@angular/core';\nimport { CellRange } from '../selection/agrid-clipboard.handler';\nimport { AgridControl } from '../agrid-control';\nimport { AgridDataSource } from '../agrid-datasource';\nimport {\n CellPosition,\n ColDef,\n DetailAction,\n DetailRowItem,\n GridEditEvent,\n GridItem,\n RowDetailActionEvent,\n ValidationFailedEvent,\n ValueOption,\n} from '../agrid.types';\nimport {\n coerceDateInputValue,\n coerceNumberInputValue,\n getDisplayForField,\n isDataRowItem,\n isDetailRowItem,\n} from '../agrid.utils';\n\n/** Dependencies and callbacks required by {@link AgridDetailController}. @internal */\nexport interface AgridDetailControllerOptions<T extends object = any> {\n dataSource: Signal<AgridDataSource>;\n control: Signal<AgridControl | null>;\n /** Column rendered as the expanded panel's multiline detail field, when configured. */\n detailColumn: Signal<ColDef | null>;\n locale: Signal<string>;\n displayItems: Signal<GridItem[]>;\n visibleColDefs: Signal<ColDef[]>;\n selectedCell: WritableSignal<CellPosition | null>;\n selectedRange: WritableSignal<CellRange | null>;\n /** Truthy while an inline cell edit is active (suppresses keyboard hand-off). */\n editingCell: Signal<CellPosition | null>;\n isCellEditable: (col: ColDef, rowIndex: number) => boolean;\n /** Renders the host-supplied detail panel HTML for a row. */\n renderDetailHtml: (row: Record<string, unknown>) => string;\n emitEditEvents: (event: GridEditEvent<T>) => void;\n emitValidationFailed: (event: ValidationFailedEvent) => void;\n emitDetailAction: (event: RowDetailActionEvent<T>) => void;\n /** Schedules a callback after the next render (browser adapter). */\n schedule: (fn: () => void) => void;\n /** Resolves the live textarea element for a detail row, if rendered. */\n queryTextarea: (rowIndex: number) => HTMLTextAreaElement | null;\n}\n\n/**\n * Owns the master/detail panel's multiline field editor: draft state, validation,\n * text-template actions, and keyboard hand-off from the grid into the detail textarea.\n *\n * Expansion of detail panels is intentionally *not* owned here — it lives with the\n * projection model in the host component, since it changes which rows are rendered.\n * @internal\n */\nexport class AgridDetailController<T extends object = any> {\n /** Datasource row currently editing its expanded detail field, or `null`. */\n readonly editingRow = signal<number | null>(null);\n /** In-flight text of the multiline detail editor. */\n readonly draft = signal('');\n /** Validation message for the active detail edit, or `null` when valid. */\n readonly validationError = signal<string | null>(null);\n\n /** Cell to restore selection to after a keyboard-initiated detail edit closes. */\n private returnCell: CellPosition | null = null;\n\n /**\n * Memoized detail-panel HTML keyed by the detail item. The projection recreates detail items\n * only when their data changes, so the cache hits across change-detection passes and invalidates\n * naturally when the row (and thus the item reference) changes — old items are GC'd via WeakMap.\n */\n private readonly htmlCache = new WeakMap<object, string>();\n\n constructor(private readonly opts: AgridDetailControllerOptions<T>) {}\n\n /** Resolved HTML for an expanded detail panel (auto-sanitized by `[innerHTML]`). */\n detailHtml(item: GridItem): string {\n if (!isDetailRowItem(item)) return '';\n const cached = this.htmlCache.get(item);\n if (cached !== undefined) return cached;\n const html = this.opts.renderDetailHtml(item.row);\n this.htmlCache.set(item, html);\n return html;\n }\n\n /** Formatted value shown while a configured detail field is not being edited. */\n detailFieldDisplay(item: DetailRowItem): string {\n const col = this.opts.detailColumn();\n return col ? getDisplayForField(col, item.row[col.field], this.opts.locale()) : '';\n }\n\n /** Whether the configured detail field can be edited for this row. */\n isDetailFieldEditable(item: DetailRowItem): boolean {\n const col = this.opts.detailColumn();\n return !!col && this.opts.isCellEditable(col, item.detailFor);\n }\n\n /** Enter multiline editing for one expanded detail row. */\n startDetailFieldEdit(item: DetailRowItem, event?: Event): void {\n const col = this.opts.detailColumn();\n if (!col || !this.opts.isCellEditable(col, item.detailFor)) return;\n event?.preventDefault();\n event?.stopPropagation();\n this.returnCell = event instanceof KeyboardEvent ? this.opts.selectedCell() : null;\n this.opts.selectedCell.set(null);\n this.opts.selectedRange.set(null);\n this.editingRow.set(item.detailFor);\n this.draft.set(String(item.row[col.field] ?? ''));\n this.validationError.set(null);\n this.opts.schedule(() => {\n this.focusTextarea(item.detailFor);\n });\n }\n\n /** Keep the multiline draft synchronized with textarea input. */\n onDetailDraftInput(event: Event): void {\n this.draft.set((event.target as HTMLTextAreaElement).value);\n }\n\n /** Commit on blur or Ctrl/Cmd+Enter, and cancel on Escape. */\n onDetailEditorKeydown(item: DetailRowItem, event: KeyboardEvent): void {\n event.stopPropagation();\n if (event.key === 'Escape') {\n event.preventDefault();\n this.cancelDetailFieldEdit();\n } else if (event.key === 'Enter' && (event.ctrlKey || event.metaKey)) {\n event.preventDefault();\n this.commitDetailFieldEdit(item);\n }\n }\n\n private focusTextarea(rowIndex: number): void {\n this.opts.queryTextarea(rowIndex)?.focus();\n }\n\n /** Insert a configured text template into the active detail textarea. */\n applyDetailAction(item: DetailRowItem, action: DetailAction, event: Event): void {\n event.preventDefault();\n event.stopPropagation();\n if (!action.text) {\n this.opts.emitDetailAction({\n id: action.id,\n row: item.row,\n originalIndex: item.detailFor,\n } as RowDetailActionEvent<T>);\n return;\n }\n if (!this.isDetailFieldEditable(item)) return;\n if (this.editingRow() !== item.detailFor) {\n this.startDetailFieldEdit(item, event);\n }\n const text = typeof action.text === 'function'\n ? action.text({ row: item.row, rowIndex: item.detailFor })\n : action.text ?? '';\n const textarea = this.opts.queryTextarea(item.detailFor);\n const current = this.draft();\n const start = textarea?.selectionStart ?? current.length;\n const end = textarea?.selectionEnd ?? start;\n const next = `${current.slice(0, start)}${text}${current.slice(end)}`;\n this.draft.set(next);\n this.validationError.set(null);\n this.opts.schedule(() => {\n const editor = this.opts.queryTextarea(item.detailFor);\n if (!editor) return;\n const caret = start + text.length;\n editor.focus();\n editor.setSelectionRange(caret, caret);\n });\n }\n\n private detailKeyboardTarget(direction: 1 | -1): DetailRowItem | null {\n const sel = this.opts.selectedCell();\n if (!sel) return null;\n const items = this.opts.displayItems();\n const selectedIndex = items.findIndex(item =>\n isDataRowItem(item) && item.originalIndex === sel.rowIndex,\n );\n if (selectedIndex < 0) return null;\n const candidate = items[selectedIndex + direction];\n return isDetailRowItem(candidate) && this.isDetailFieldEditable(candidate)\n ? candidate\n : null;\n }\n\n /**\n * Hand keyboard focus from the grid into an adjacent detail editor when the selection\n * leaves the row's first/last column toward an editable detail panel. Returns whether\n * the event was consumed.\n */\n focusDetailEditorFromKeyboard(event: KeyboardEvent): boolean {\n if (this.opts.editingCell() || this.editingRow() !== null) return false;\n if (event.ctrlKey || event.metaKey || event.altKey) return false;\n const sel = this.opts.selectedCell();\n if (!sel) return false;\n const direction = event.key === 'ArrowRight' || (event.key === 'Tab' && !event.shiftKey)\n ? 1\n : event.key === 'ArrowLeft' || (event.key === 'Tab' && event.shiftKey)\n ? -1\n : null;\n if (direction === null) return false;\n const lastColIndex = this.opts.visibleColDefs().length - 1;\n if ((direction === 1 && sel.colIndex < lastColIndex) || (direction === -1 && sel.colIndex > 0)) {\n return false;\n }\n const target = this.detailKeyboardTarget(direction);\n if (!target) return false;\n event.preventDefault();\n event.stopPropagation();\n this.startDetailFieldEdit(target, event);\n return true;\n }\n\n /** Commit a multiline detail edit through normal grid edit semantics. */\n commitDetailFieldEdit(item: DetailRowItem): void {\n if (this.editingRow() !== item.detailFor) return;\n const col = this.opts.detailColumn();\n if (!col || !this.opts.isCellEditable(col, item.detailFor)) {\n this.cancelDetailFieldEdit();\n return;\n }\n const row = this.opts.dataSource().getRow(item.detailFor);\n const oldValue = row[col.field];\n let newValue: unknown = this.draft();\n if (col.type === 'number') {\n newValue = coerceNumberInputValue(newValue);\n } else if (col.type === 'date') {\n newValue = coerceDateInputValue(String(newValue), oldValue);\n } else if (col.values?.length) {\n const option = col.values.find(value =>\n typeof value === 'string'\n ? value === newValue\n : String((value as ValueOption).value) === newValue,\n );\n if (option !== undefined) {\n newValue = typeof option === 'string' ? option : (option as ValueOption).value;\n }\n }\n if (oldValue !== newValue) {\n const message = col.validate?.(newValue as never, row as never) ?? null;\n if (message) {\n this.validationError.set(message);\n this.opts.emitValidationFailed({\n rowIndex: item.detailFor,\n field: col.field,\n value: newValue,\n message,\n source: 'detail',\n });\n this.opts.schedule(() => this.focusTextarea(item.detailFor));\n return;\n }\n this.opts.dataSource().patchRow(item.detailFor, { [col.field]: newValue });\n this.opts.control()?.pushEdit({ rowIndex: item.detailFor, field: col.field, oldValue, newValue });\n this.opts.emitEditEvents({\n position: {\n rowIndex: item.detailFor,\n colIndex: this.opts.visibleColDefs().findIndex(column => column.field === col.field),\n },\n field: col.field,\n oldValue,\n newValue,\n } as GridEditEvent<T>);\n }\n this.cancelDetailFieldEdit();\n }\n\n /** Discard the active multiline detail draft, restoring keyboard selection if needed. */\n cancelDetailFieldEdit(): void {\n this.editingRow.set(null);\n this.draft.set('');\n this.validationError.set(null);\n if (this.returnCell) {\n this.opts.selectedCell.set(this.returnCell);\n this.returnCell = null;\n }\n }\n}\n","import { Signal, WritableSignal, signal } from '@angular/core';\nimport { CellRange } from '../selection/agrid-clipboard.handler';\nimport { AgridControl, HistoryEntry, HistoryItem } from '../agrid-control';\nimport { AgridDataSource } from '../agrid-datasource';\nimport { CellPosition, ColDef, GridEditEvent } from '../agrid.types';\nimport { coerceNumberInputValue } from '../agrid.utils';\n\n/** Dependencies and callbacks required by {@link AgridEditController}. @internal */\nexport interface AgridEditControllerOptions {\n control: Signal<AgridControl | null>;\n dataSource: Signal<AgridDataSource>;\n visibleColDefs: Signal<ColDef[]>;\n readonlyGrid: Signal<boolean>;\n selectedCell: WritableSignal<CellPosition | null>;\n selectedRange: WritableSignal<CellRange | null>;\n findDisplayIndex: (originalIndex: number) => number;\n scrollToCell: (displayIndex: number, colIndex: number) => void;\n focusGrid: () => void;\n onCellEdit: (event: GridEditEvent) => void;\n /** Called when a `ColDef.validate` hook rejects a committed value. */\n onValidationFailed: (event: { rowIndex: number; field: string; value: unknown; message: string }) => void;\n}\n\n/** Active cell validation error: the rejecting cell position, field, and message. @internal */\nexport interface CellValidationError {\n rowIndex: number;\n colIndex: number;\n field: string;\n message: string;\n}\n\n/**\n * Owns cell edit state, commit/cancel transitions, and undo/redo application.\n * @internal\n */\nexport class AgridEditController {\n readonly editingCell = signal<CellPosition | null>(null);\n readonly currentDraft = signal<unknown>(null);\n readonly editSeedChar = signal<string>('');\n /** Whether a newly focused text editor should select all text. */\n readonly selectTextOnEdit = signal<boolean>(true);\n /** The active cell validation error, or `null` when the last commit was accepted. */\n readonly validationError = signal<CellValidationError | null>(null);\n\n constructor(private readonly opts: AgridEditControllerOptions) {}\n\n /** Returns whether a cell can be edited in the current grid state. */\n isCellEditable(col: ColDef | undefined, originalIndex?: number): boolean {\n if (!col || this.opts.readonlyGrid() || col.editable === false) return false;\n if (originalIndex === undefined || !col.cellReadonly) return true;\n const row = this.opts.dataSource().getRow(originalIndex);\n if (!row) return false;\n return !col.cellReadonly({\n row,\n value: row[col.field],\n column: col,\n originalIndex,\n });\n }\n\n /** Replaces the value currently staged by the active editor. */\n setDraft(value: unknown): void {\n this.currentDraft.set(value);\n }\n\n /** Starts editing a cell, optionally seeded by a typed character. */\n start(originalIndex: number, colIndex: number, seedChar: string, selectText = true): void {\n const col = this.opts.visibleColDefs()[colIndex];\n if (!this.isCellEditable(col, originalIndex)) return;\n this.validationError.set(null);\n const currentValue = this.opts.dataSource().getRow(originalIndex)[col.field];\n this.opts.selectedRange.set(null);\n this.opts.selectedCell.set({ rowIndex: originalIndex, colIndex });\n let initialDraft: unknown;\n if (seedChar !== '') {\n initialDraft = seedChar;\n } else if (col.type === 'date' && (currentValue == null || currentValue === '')) {\n initialDraft = new Date().toISOString().slice(0, 10);\n } else {\n initialDraft = currentValue;\n }\n this.currentDraft.set(initialDraft);\n this.editSeedChar.set(seedChar);\n this.selectTextOnEdit.set(selectText);\n this.editingCell.set({ rowIndex: originalIndex, colIndex });\n const displayIndex = this.opts.findDisplayIndex(originalIndex);\n if (displayIndex >= 0) this.opts.scrollToCell(displayIndex, colIndex);\n }\n\n /**\n * Commits the staged value and records the edit in history.\n * Returns `false` (keeping the cell in edit mode) when a `ColDef.validate` hook rejects the\n * value; `true` when the edit is committed or there was no change.\n */\n commit(): boolean {\n const position = this.editingCell();\n if (!position) return true;\n const col = this.opts.visibleColDefs()[position.colIndex];\n if (!col) {\n this.cancel();\n return true;\n }\n\n const row = this.opts.dataSource().getRow(position.rowIndex);\n if (!this.isCellEditable(col, position.rowIndex)) {\n this.cancel();\n return true;\n }\n const oldValue = row[col.field];\n const newValue = col.type === 'number'\n ? coerceNumberInputValue(this.currentDraft())\n : this.currentDraft();\n if (oldValue !== newValue) {\n const message = col.validate?.(newValue as never, row as never) ?? null;\n if (message) {\n this.validationError.set({ ...position, field: col.field, message });\n this.opts.onValidationFailed({ rowIndex: position.rowIndex, field: col.field, value: newValue, message });\n return false;\n }\n this.opts.dataSource().patchRow(position.rowIndex, { [col.field]: newValue });\n this.opts.control()?.pushEdit({\n rowIndex: position.rowIndex,\n field: col.field,\n oldValue,\n newValue,\n });\n this.opts.onCellEdit({ position, field: col.field, oldValue, newValue });\n }\n this.validationError.set(null);\n this.clearEditState();\n this.opts.focusGrid();\n return true;\n }\n\n /**\n * Commit a value directly to a cell without entering edit mode (e.g. a boolean checkbox\n * toggle). Records the change in history and emits the edit just like {@link commit}.\n */\n setCellValue(rowIndex: number, colIndex: number, newValue: unknown): boolean {\n const col = this.opts.visibleColDefs()[colIndex];\n if (!this.isCellEditable(col, rowIndex)) return false;\n const row = this.opts.dataSource().getRow(rowIndex);\n const oldValue = row[col.field];\n if (oldValue === newValue) return true;\n const message = col.validate?.(newValue as never, row as never) ?? null;\n if (message) {\n this.validationError.set({ rowIndex, colIndex, field: col.field, message });\n this.opts.onValidationFailed({ rowIndex, field: col.field, value: newValue, message });\n return false;\n }\n this.opts.dataSource().patchRow(rowIndex, { [col.field]: newValue });\n this.opts.control()?.pushEdit({ rowIndex, field: col.field, oldValue, newValue });\n this.opts.onCellEdit({\n position: { rowIndex, colIndex },\n field: col.field,\n oldValue,\n newValue,\n });\n this.validationError.set(null);\n return true;\n }\n\n /** Discards the active edit without changing row data. */\n cancel(): void {\n this.validationError.set(null);\n this.clearEditState();\n }\n\n /** Applies the previous edit-history value to the data source. */\n undo(): void {\n const item = this.opts.control()?.undo();\n if (item) this.applyHistoryItem(item, 'oldValue');\n }\n\n /** Reapplies the next edit-history value to the data source. */\n redo(): void {\n const item = this.opts.control()?.redo();\n if (item) this.applyHistoryItem(item, 'newValue');\n }\n\n /** Reconciles active edit coordinates after a row is removed. */\n onRowRemoved(originalIndex: number): void {\n const editing = this.editingCell();\n if (editing?.rowIndex === originalIndex) {\n this.clearEditState();\n } else if (editing && editing.rowIndex > originalIndex) {\n this.editingCell.set({ ...editing, rowIndex: editing.rowIndex - 1 });\n }\n }\n\n private applyHistoryItem(item: HistoryItem, valueKey: 'oldValue' | 'newValue'): void {\n const entries = Array.isArray(item) ? item : [item];\n const ordered = valueKey === 'oldValue' ? [...entries].reverse() : entries;\n for (const entry of ordered) this.applyHistoryEntry(entry, entry[valueKey]);\n }\n\n private applyHistoryEntry(entry: HistoryEntry, value: unknown): void {\n const oldValue = this.opts.dataSource().getRow(entry.rowIndex)[entry.field];\n this.opts.dataSource().patchRow(entry.rowIndex, { [entry.field]: value });\n const colIndex = this.opts.visibleColDefs().findIndex(col => col.field === entry.field);\n this.opts.onCellEdit({\n position: { rowIndex: entry.rowIndex, colIndex },\n field: entry.field,\n oldValue,\n newValue: value,\n });\n }\n\n private clearEditState(): void {\n this.editingCell.set(null);\n this.editSeedChar.set('');\n this.selectTextOnEdit.set(true);\n }\n}\n","import { Signal, WritableSignal, computed, signal } from '@angular/core';\nimport { CellRange } from './agrid-clipboard.handler';\nimport { AgridDataSource } from '../agrid-datasource';\nimport { CellPosition, ColDef } from '../agrid.types';\nimport { getDisplayForField } from '../agrid.utils';\n\n/** Location of a formatted-value match in source coordinates. @internal */\nexport type AgridFindMatch = {\n rowIndex: number;\n colIndex: number;\n};\n\n/** Dependencies and callbacks required by {@link AgridFindController}. @internal */\nexport interface AgridFindControllerOptions {\n dataSource: Signal<AgridDataSource>;\n filteredSortedIndices: Signal<number[]>;\n visibleColDefs: Signal<ColDef[]>;\n locale: Signal<string>;\n selectedCell: WritableSignal<CellPosition | null>;\n selectedRange: WritableSignal<CellRange | null>;\n revealMatch: (originalIndex: number, colIndex: number) => void;\n focusGrid: () => void;\n}\n\n/** Owns in-grid find state, formatted-value matching, and match navigation. @internal */\nexport class AgridFindController {\n readonly open = signal(false);\n readonly query = signal('');\n readonly activeIndex = signal(-1);\n\n readonly matches = computed<AgridFindMatch[]>(() => {\n const query = this.query().trim().toLowerCase();\n if (!query) return [];\n const cols = this.opts.visibleColDefs();\n const rows = this.opts.dataSource().rows();\n const matches: AgridFindMatch[] = [];\n this.opts.filteredSortedIndices().forEach(rowIndex => {\n const row = rows[rowIndex];\n if (!row) return;\n for (let colIndex = 0; colIndex < cols.length; colIndex++) {\n const col = cols[colIndex];\n const value = getDisplayForField(col, row[col.field], this.opts.locale()).toLowerCase();\n if (value.includes(query)) {\n matches.push({ rowIndex, colIndex });\n }\n }\n });\n return matches;\n });\n\n constructor(private readonly opts: AgridFindControllerOptions) {}\n\n /** Opens the find panel. */\n show(): void {\n this.opts.selectedCell.set(null);\n this.opts.selectedRange.set(null);\n this.activeIndex.set(-1);\n this.open.set(true);\n }\n\n /** Closes the find panel and returns focus to the grid. */\n close(): void {\n this.open.set(false);\n this.opts.focusGrid();\n }\n\n /** Replaces the search query without moving focus away from the find input. */\n setQuery(value: string): void {\n this.query.set(value);\n this.activeIndex.set(-1);\n }\n\n /** Selects the next or previous match, wrapping at either end. */\n goToMatch(direction: 1 | -1): void {\n const matches = this.matches();\n if (matches.length === 0) {\n this.activeIndex.set(-1);\n return;\n }\n const current = this.activeIndex();\n const next = current < 0\n ? (direction === 1 ? 0 : matches.length - 1)\n : (current + direction + matches.length) % matches.length;\n this.activeIndex.set(next);\n const match = matches[next];\n this.opts.selectedRange.set(null);\n this.opts.selectedCell.set({ rowIndex: match.rowIndex, colIndex: match.colIndex });\n this.opts.revealMatch(match.rowIndex, match.colIndex);\n }\n\n /** Returns whether a cell matches the current query. */\n isMatchCell(originalIndex: number, colIndex: number): boolean {\n return this.matches().some(\n match => match.rowIndex === originalIndex && match.colIndex === colIndex,\n );\n }\n\n /** Returns whether a cell is the currently active match. */\n isActiveMatchCell(originalIndex: number, colIndex: number): boolean {\n const match = this.matches()[this.activeIndex()];\n return !!match && match.rowIndex === originalIndex && match.colIndex === colIndex;\n }\n}\n","import {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n input,\n output,\n viewChild,\n} from '@angular/core';\nimport { AgridLocaleText, AGRID_LOCALE_TEXT } from '../agrid-localization';\n\n/** Floating find panel used by `AgridComponent` for in-grid search navigation. */\n@Component({\n selector: 'agrid-find-panel',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './agrid-find-panel.component.html',\n styleUrl: './agrid-find-panel.component.css',\n})\nexport class AgridFindPanelComponent implements AfterViewInit {\n /** Localized labels used in the find panel. */\n localeText = input<AgridLocaleText>(AGRID_LOCALE_TEXT.en);\n\n /** Current find query shown in the input. */\n query = input<string>('');\n\n /** Number of cells matching the current query. */\n matchCount = input<number>(0);\n\n /** Zero-based active match index, or `-1` when no match is active. */\n activeIndex = input<number>(-1);\n\n /** Emits whenever the user changes the find query. */\n queryChange = output<string>();\n\n /** Requests navigation to the next match. */\n next = output<void>();\n\n /** Requests navigation to the previous match. */\n previous = output<void>();\n\n /** Requests closing the find panel. */\n close = output<void>();\n\n private readonly findInput = viewChild.required<ElementRef<HTMLInputElement>>('findInput');\n\n /** Focuses and selects the find input after Angular has rendered the panel. */\n ngAfterViewInit(): void {\n setTimeout(() => {\n const input = this.findInput().nativeElement;\n input.focus();\n input.select();\n });\n }\n\n /** Returns the compact `active / total` label displayed next to the input. */\n countLabel(): string {\n const count = this.matchCount();\n return count === 0 ? '0 / 0' : `${this.activeIndex() + 1} / ${count}`;\n }\n\n /** Handles Enter, Shift+Enter, and Escape while preventing grid-level key handling. */\n onKeyDown(event: KeyboardEvent): void {\n event.stopPropagation();\n if (event.key === 'Enter') {\n event.preventDefault();\n event.shiftKey ? this.previous.emit() : this.next.emit();\n } else if (event.key === 'Escape') {\n event.preventDefault();\n this.close.emit();\n }\n }\n}\n","<div class=\"ag-find-panel\" role=\"search\" (click)=\"$event.stopPropagation()\">\n <input\n #findInput\n class=\"ag-find-input\"\n [value]=\"query()\"\n (input)=\"queryChange.emit($any($event.target).value)\"\n (keydown)=\"onKeyDown($event)\"\n [placeholder]=\"localeText().findPlaceholder\"\n [attr.aria-label]=\"localeText().findPlaceholder\"\n />\n <span class=\"ag-find-count\" aria-live=\"polite\">{{ countLabel() }}</span>\n <button class=\"ag-find-btn\" [title]=\"localeText().previous\" [attr.aria-label]=\"localeText().previous\"\n (click)=\"previous.emit()\">↑</button>\n <button class=\"ag-find-btn\" [title]=\"localeText().next\" [attr.aria-label]=\"localeText().next\"\n (click)=\"next.emit()\">↓</button>\n <button class=\"ag-find-btn\" [title]=\"localeText().close\" [attr.aria-label]=\"localeText().close\"\n (click)=\"close.emit()\">✕</button>\n</div>\n","import { AgridSelectionSummary, ColDef, GridItem } from '../agrid.types';\nimport { isDataRowItem } from '../agrid.utils';\n\n/** Rectangular selection in projected-row and visible-column coordinates. @internal */\nexport interface AgridSelectionSummaryBounds {\n rowStart: number;\n rowEnd: number;\n colStart: number;\n colEnd: number;\n}\n\n/** Computes spreadsheet-style statistics from numeric cells in a visible selection. @internal */\nexport function computeSelectionSummary(\n items: readonly GridItem[],\n columns: readonly ColDef[],\n bounds: AgridSelectionSummaryBounds | null,\n): AgridSelectionSummary | null {\n if (!bounds) return null;\n\n const values: number[] = [];\n for (let rowIndex = bounds.rowStart; rowIndex <= bounds.rowEnd; rowIndex++) {\n const item = items[rowIndex];\n if (!isDataRowItem(item)) continue;\n\n for (let colIndex = bounds.colStart; colIndex <= bounds.colEnd; colIndex++) {\n const column = columns[colIndex];\n if (!column) continue;\n const raw = item.row[column.field];\n const numeric = typeof raw === 'number'\n ? raw\n : column.type === 'number' && raw !== '' && raw != null\n ? Number(raw)\n : Number.NaN;\n if (Number.isFinite(numeric)) values.push(numeric);\n }\n }\n\n if (values.length === 0) return null;\n const sum = values.reduce((total, value) => total + value, 0);\n return {\n count: values.length,\n sum,\n average: sum / values.length,\n min: Math.min(...values),\n max: Math.max(...values),\n };\n}\n","import { Signal, signal } from '@angular/core';\nimport { AgridControl } from '../agrid-control';\nimport { GridItem, GroupAction } from '../agrid.types';\nimport { isGroupHeaderItem } from '../agrid.utils';\n\n/** Expanded group labels associated with the active grouping field. @internal */\nexport type AgridExpandedGroups = {\n field: string | null;\n labels: Set<string>;\n};\n\n/** Dependencies required by {@link AgridGroupController}. @internal */\nexport interface AgridGroupControllerOptions {\n control: Signal<AgridControl | null>;\n groupDescription: Signal<((label: string) => string) | null>;\n}\n\n/** Owns group expansion state and the group-action context menu. @internal */\nexport class AgridGroupController {\n readonly expandedGroups = signal<AgridExpandedGroups>({\n field: null,\n labels: new Set(),\n });\n readonly actionsMenu = signal<{ x: number; y: number; label: string } | null>(null);\n\n constructor(private readonly opts: AgridGroupControllerOptions) {}\n\n /** Toggles one group label within the active grouping field. */\n toggle(label: string): void {\n const groupField = this.opts.control()?.groupByField() ?? null;\n this.expandedGroups.update(state => {\n const labels = state.field === groupField ? new Set(state.labels) : new Set<string>();\n if (labels.has(label)) labels.delete(label);\n else labels.add(label);\n return { field: groupField, labels };\n });\n }\n\n /** Expands every group header present in the supplied projection. */\n expandAll(items: GridItem[]): void {\n const groupField = this.opts.control()?.groupByField() ?? null;\n if (!groupField) return;\n const labels = new Set<string>();\n for (const item of items) {\n if (isGroupHeaderItem(item)) labels.add(item.groupLabel);\n }\n this.expandedGroups.set({ field: groupField, labels });\n }\n\n /** Collapses all groups for the active grouping field. */\n collapseAll(): void {\n const groupField = this.opts.control()?.groupByField() ?? null;\n this.expandedGroups.set({ field: groupField, labels: new Set() });\n }\n\n /** Returns the configured description for a group label. */\n getDescription(label: string): string {\n return this.opts.groupDescription()?.(label) ?? '';\n }\n\n /** Opens the action menu for a group label. */\n openActionsMenu(event: MouseEvent, label: string): void {\n event.stopPropagation();\n this.actionsMenu.set({ x: event.clientX, y: event.clientY, label });\n }\n\n /** Closes the group action menu. */\n closeActionsMenu(): void {\n this.actionsMenu.set(null);\n }\n\n /** Runs a group action and closes its menu. */\n runAction(action: GroupAction, label: string): void {\n action.action(label);\n this.closeActionsMenu();\n }\n}\n","import { signal } from '@angular/core';\n\n/**\n * Owns the expand/collapse state of a hierarchical (tree) grid.\n *\n * Expansion is keyed by **node id** (from {@link AgridTreeConfig.getId}), independent of any\n * column or grouping field, so it works at arbitrary depth. Ids that no longer exist in the\n * data simply never match and are harmless, so the state does not need to be reset when the\n * underlying rows change.\n *\n * Mirrors {@link AgridGroupController} in spirit but is intentionally option-free — the grid\n * component supplies node ids to {@link expandAll} from the current data source.\n * @internal\n */\nexport class AgridTreeController {\n /** Ids of the nodes that are currently expanded (their children are visible). */\n readonly expandedIds = signal<Set<string | number>>(new Set());\n\n /** Returns `true` when the node with `id` is currently expanded. */\n isExpanded(id: string | number): boolean {\n return this.expandedIds().has(id);\n }\n\n /** Toggle the expanded state of a single node. */\n toggle(id: string | number): void {\n this.expandedIds.update(ids => {\n const next = new Set(ids);\n if (next.has(id)) next.delete(id);\n else next.add(id);\n return next;\n });\n }\n\n /** Explicitly expand or collapse a single node. */\n setExpanded(id: string | number, expanded: boolean): void {\n this.expandedIds.update(ids => {\n if (expanded === ids.has(id)) return ids;\n const next = new Set(ids);\n if (expanded) next.add(id);\n else next.delete(id);\n return next;\n });\n }\n\n /** Expand every node in `ids` (typically all expandable nodes in the data source). */\n expandAll(ids: Iterable<string | number>): void {\n this.expandedIds.set(new Set(ids));\n }\n\n /** Collapse every node. */\n collapseAll(): void {\n this.expandedIds.set(new Set());\n }\n}\n","import { Signal, WritableSignal } from '@angular/core';\nimport { CellRange } from './agrid-clipboard.handler';\nimport { AgridControl } from '../agrid-control';\nimport { AgridDataSource } from '../agrid-datasource';\nimport { AgridEnterEditAction, CellPosition, ColDef, GridItem, NewRecord } from '../agrid.types';\nimport { isDataRowItem, isGroupHeaderItem } from '../agrid.utils';\n\n/** Minimal vertical viewport API used by grid navigation. @internal */\nexport interface AgridVerticalViewport {\n /** Returns the current vertical scroll offset in pixels. */\n measureScrollOffset(): number;\n /** Returns the visible viewport height in pixels. */\n getViewportSize(): number;\n /** Scrolls the viewport to an absolute vertical offset. */\n scrollToOffset(offset: number): void;\n}\n\n/** Dependencies and callbacks required by {@link AgridNavigationController}. @internal */\nexport interface AgridNavigationControllerOptions {\n control: Signal<AgridControl | null>;\n dataSource: Signal<AgridDataSource>;\n filteredItems: Signal<GridItem[]>;\n filteredSortedIndices: Signal<number[]>;\n colDefs: Signal<ColDef[]>;\n visibleColDefs: Signal<ColDef[]>;\n rowHeight: Signal<number>;\n allowAddRows: Signal<boolean>;\n autoAddRows: Signal<boolean>;\n enterEditAction: Signal<AgridEnterEditAction>;\n selectedCell: WritableSignal<CellPosition | null>;\n selectedRange: WritableSignal<CellRange | null>;\n editingCell: Signal<CellPosition | null>;\n isEditing: (originalIndex: number, colIndex: number) => boolean;\n isCellEditable: (col: ColDef | undefined, originalIndex: number) => boolean;\n toggleTreeCell: (originalIndex: number, colIndex: number) => boolean;\n startEdit: (originalIndex: number, colIndex: number, seedChar: string, selectText?: boolean) => void;\n commitEdit: () => boolean;\n cancelEdit: () => void;\n undoEdit: () => void;\n redoEdit: () => void;\n extendRangeTo: (originalIndex: number, colIndex: number) => void;\n openFind: () => void;\n focusGrid: () => void;\n viewport: () => AgridVerticalViewport;\n scrollColumnToKeepVisible: (colIndex: number) => void;\n /** Maps a logical destination to its rendered span anchor or next visible cell. */\n resolveCellColumn?: (originalIndex: number, colIndex: number, direction: -1 | 0 | 1) => number;\n onPrepareAddRecord: (event: Pick<NewRecord, 'index' | 'data'>) => void;\n}\n\n/**\n * Owns grid keyboard navigation, cell activation, add-row creation, and visibility scrolling.\n * @internal\n */\nexport class AgridNavigationController {\n constructor(private readonly opts: AgridNavigationControllerOptions) {}\n\n /** Activates a cell, optionally extending the current range selection. */\n activateCell(originalIndex: number, colIndex: number, event?: MouseEvent): void {\n colIndex = this.opts.resolveCellColumn?.(originalIndex, colIndex, 0) ?? colIndex;\n if (this.opts.isEditing(originalIndex, colIndex)) return;\n if (this.opts.editingCell() && !this.opts.commitEdit()) return;\n if (event?.shiftKey && this.opts.selectedCell()) {\n this.opts.extendRangeTo(originalIndex, colIndex);\n this.opts.focusGrid();\n return;\n }\n this.opts.selectedRange.set(null);\n this.opts.selectedCell.set({ rowIndex: originalIndex, colIndex });\n const col = this.opts.visibleColDefs()[colIndex];\n if (col.values?.length) this.opts.startEdit(originalIndex, colIndex, '');\n else this.opts.focusGrid();\n }\n\n /** Creates and selects a row from the add-row placeholder. */\n activateAddRow(): void {\n this.opts.cancelEdit();\n this.addRowAndSelect();\n }\n\n /** Clears cell and range navigation when focus moves to a grid control. */\n deactivateCell(): void {\n this.opts.cancelEdit();\n this.opts.selectedCell.set(null);\n this.opts.selectedRange.set(null);\n }\n\n /** Inserts an initialized blank row and emits the preparation callback. */\n insertRowAt(atIndex: number): void {\n const emptyRow = this.buildEmptyRow();\n const insertedIndex = this.opts.dataSource().addRow(emptyRow, atIndex);\n this.opts.onPrepareAddRecord({ index: insertedIndex, data: emptyRow });\n }\n\n /** Handles grid-level navigation, editing, history, find, and add-row shortcuts. */\n handleKeyDown(event: KeyboardEvent): void {\n if ((event.target as Element)?.closest(\n '.ag-sidebar, .ag-filter-input, .ag-filter-menu, .ag-menu-bar, .ag-detail-column-textarea',\n )) return;\n\n if ((event.ctrlKey || event.metaKey) && !event.altKey && event.key.toLowerCase() === 'f') {\n event.preventDefault();\n this.opts.openFind();\n return;\n }\n\n if ((event.ctrlKey || event.metaKey) && !event.altKey) {\n if (event.key === 'z') {\n event.preventDefault();\n event.shiftKey ? this.opts.redoEdit() : this.opts.undoEdit();\n return;\n }\n if (event.key === 'y') {\n event.preventDefault();\n this.opts.redoEdit();\n return;\n }\n }\n\n const sel = this.opts.selectedCell();\n if (\n event.key === 'Enter'\n && (event.ctrlKey || event.metaKey)\n && !event.altKey\n && !event.shiftKey\n && sel\n && this.opts.toggleTreeCell(sel.rowIndex, sel.colIndex)\n ) {\n event.preventDefault();\n return;\n }\n\n if (this.opts.editingCell()) {\n switch (event.key) {\n case 'Tab':\n event.preventDefault();\n if (this.opts.commitEdit()) this.moveSelection(0, event.shiftKey ? -1 : 1);\n break;\n case 'Enter':\n event.preventDefault();\n if (this.opts.commitEdit()) this.applyEnterEditAction(event.shiftKey);\n break;\n case 'Escape':\n event.preventDefault();\n this.opts.cancelEdit();\n this.opts.focusGrid();\n break;\n }\n return;\n }\n\n const isOnAddRow = this.opts.allowAddRows()\n && !this.opts.autoAddRows()\n && sel?.rowIndex === this.opts.dataSource().length;\n switch (event.key) {\n case 'ArrowUp':\n event.preventDefault();\n this.moveSelection(-1, 0, event.shiftKey);\n break;\n case 'ArrowDown':\n event.preventDefault();\n this.moveSelection(1, 0, event.shiftKey);\n break;\n case 'ArrowLeft':\n event.preventDefault();\n this.moveSelection(0, -1, event.shiftKey);\n break;\n case 'ArrowRight':\n event.preventDefault();\n this.moveSelection(0, 1, event.shiftKey);\n break;\n case 'PageUp':\n event.preventDefault();\n this.moveSelectionByPage(-1, event.shiftKey);\n break;\n case 'PageDown':\n event.preventDefault();\n this.moveSelectionByPage(1, event.shiftKey);\n break;\n case 'Home':\n event.preventDefault();\n this.moveSelectionToBoundary('start', event.ctrlKey || event.metaKey, event.shiftKey);\n break;\n case 'End':\n event.preventDefault();\n this.moveSelectionToBoundary('end', event.ctrlKey || event.metaKey, event.shiftKey);\n break;\n case 'Tab':\n event.preventDefault();\n this.moveSelection(0, event.shiftKey ? -1 : 1);\n break;\n case 'Enter':\n event.preventDefault();\n if (sel) {\n if (isOnAddRow) this.addRowAndSelect();\n else this.opts.startEdit(sel.rowIndex, sel.colIndex, '');\n }\n break;\n case 'F2':\n event.preventDefault();\n if (sel) {\n if (isOnAddRow) this.addRowAndSelect();\n else this.opts.startEdit(sel.rowIndex, sel.colIndex, '');\n }\n break;\n default:\n if (sel && event.key.length === 1 && !event.ctrlKey && !event.metaKey && !event.altKey) {\n if (isOnAddRow) this.addRowAndSelect();\n else this.opts.startEdit(sel.rowIndex, sel.colIndex, event.key);\n }\n }\n }\n\n private applyEnterEditAction(reverse: boolean): void {\n switch (this.opts.enterEditAction()) {\n case 'nextColumn':\n this.moveToNextEditableColumn(reverse ? -1 : 1);\n break;\n case 'nextRow':\n this.moveSelection(reverse ? -1 : 1, 0);\n break;\n case 'nothing':\n this.opts.focusGrid();\n break;\n }\n }\n\n private moveToNextEditableColumn(direction: 1 | -1): void {\n const items = this.opts.filteredItems();\n const cols = this.opts.visibleColDefs();\n const selected = this.opts.selectedCell();\n if (!selected || items.length === 0 || cols.length === 0) {\n this.opts.focusGrid();\n return;\n }\n\n const currentDisplayIndex = this.selectedDisplayIndex();\n if (currentDisplayIndex < 0) {\n this.opts.focusGrid();\n return;\n }\n\n let displayIndex = currentDisplayIndex;\n let colIndex = selected.colIndex + direction;\n\n while (displayIndex >= 0 && displayIndex < items.length) {\n while (colIndex >= 0 && colIndex < cols.length) {\n const item = items[displayIndex];\n const col = cols[colIndex];\n if (isDataRowItem(item) && this.opts.isCellEditable(col, item.originalIndex)) {\n this.opts.selectedRange.set(null);\n this.opts.selectedCell.set({ rowIndex: item.originalIndex, colIndex });\n this.scrollToKeepVisible(displayIndex, colIndex);\n if (this.isTextColumn(col)) this.opts.startEdit(item.originalIndex, colIndex, '', false);\n else this.opts.focusGrid();\n return;\n }\n colIndex += direction;\n }\n displayIndex += direction;\n colIndex = direction > 0 ? 0 : cols.length - 1;\n while (\n displayIndex >= 0\n && displayIndex < items.length\n && isGroupHeaderItem(items[displayIndex])\n ) {\n displayIndex += direction;\n }\n }\n\n this.opts.focusGrid();\n }\n\n private isTextColumn(col: ColDef): boolean {\n return !col.values?.length && (col.type === undefined || col.type === 'text');\n }\n\n /** Finds a data row's current index in the projected display items. */\n findDisplayIndex(originalIndex: number): number {\n return this.opts.filteredItems().findIndex(\n item => isDataRowItem(item) && item.originalIndex === originalIndex,\n );\n }\n\n /** Navigates client pagination as needed and reveals a data-source row. */\n revealRow(originalIndex: number): void {\n const filteredIndex = this.opts.filteredSortedIndices().indexOf(originalIndex);\n if (filteredIndex < 0) return;\n\n const ctrl = this.opts.control();\n const pageSize = ctrl?.pageSize() ?? 0;\n if (ctrl && pageSize > 0 && ctrl.totalRows() === 0 && !ctrl.groupByField()) {\n ctrl.setPage(Math.floor(filteredIndex / pageSize) + 1);\n }\n\n setTimeout(() => {\n const displayIndex = this.findDisplayIndex(originalIndex);\n if (displayIndex >= 0) this.scrollToKeepVisible(displayIndex, 0);\n });\n }\n\n /** Scrolls a display row and optional column into the visible viewport. */\n scrollToKeepVisible(displayIndex: number, colIndex: number | null = null): void {\n const viewport = this.opts.viewport();\n const itemSize = this.opts.rowHeight();\n const scrollOffset = viewport.measureScrollOffset();\n const viewportSize = viewport.getViewportSize();\n if (displayIndex * itemSize < scrollOffset) {\n viewport.scrollToOffset(displayIndex * itemSize);\n } else if ((displayIndex + 1) * itemSize > scrollOffset + viewportSize) {\n viewport.scrollToOffset((displayIndex + 1) * itemSize - viewportSize);\n }\n\n if (colIndex !== null) this.opts.scrollColumnToKeepVisible(colIndex);\n }\n\n private moveSelection(dRow: number, dCol: number, extendRange = false): void {\n const items = this.opts.filteredItems();\n if (items.length === 0) {\n if (\n this.opts.allowAddRows()\n && this.opts.autoAddRows()\n && this.opts.dataSource().length === 0\n ) {\n this.addRowAndSelect();\n }\n return;\n }\n const cols = this.opts.visibleColDefs().length;\n let di = this.selectedDisplayIndex();\n let ci = this.opts.selectedCell()?.colIndex ?? 0;\n if (di === -1) {\n di = 0;\n ci = 0;\n }\n let newDi = di + dRow;\n let newCi = ci + dCol;\n const onAddRow = items[newDi] === null;\n if (!onAddRow) {\n if (newCi < 0) {\n newDi--;\n newCi = cols - 1;\n }\n if (newCi >= cols) {\n newDi++;\n newCi = 0;\n }\n }\n\n const skipDir = dRow < 0 || (dRow === 0 && dCol < 0) ? -1 : 1;\n let skipDi = newDi;\n while (\n skipDi >= 0\n && skipDi < items.length\n && items[skipDi] !== null\n && !isDataRowItem(items[skipDi])\n ) {\n skipDi += skipDir;\n }\n if (skipDi >= 0 && skipDi < items.length) newDi = skipDi;\n\n if (this.opts.autoAddRows() && newDi >= items.length) {\n const emptyRow = this.buildEmptyRow();\n const insertedIndex = this.opts.dataSource().addRow(emptyRow);\n const colIndex = Math.min(newCi, cols - 1);\n const newDisplayIdx = this.findDisplayIndex(insertedIndex);\n this.opts.selectedCell.set({ rowIndex: insertedIndex, colIndex });\n if (newDisplayIdx >= 0) this.scrollToKeepVisible(newDisplayIdx, colIndex);\n this.opts.focusGrid();\n this.opts.onPrepareAddRecord({ index: insertedIndex, data: emptyRow });\n return;\n }\n\n newDi = Math.max(0, Math.min(items.length - 1, newDi));\n newCi = Math.max(0, Math.min(cols - 1, newCi));\n let newItem = items[newDi];\n if (isDataRowItem(newItem)) {\n newCi = this.opts.resolveCellColumn?.(\n newItem.originalIndex,\n newCi,\n dCol === 0 ? 0 : dCol > 0 ? 1 : -1,\n ) ?? newCi;\n if (newCi >= cols && newDi < items.length - 1) {\n newDi++;\n newCi = 0;\n while (newDi < items.length - 1 && !isDataRowItem(items[newDi])) newDi++;\n newItem = items[newDi];\n } else if (newCi < 0 && newDi > 0) {\n newDi--;\n newCi = cols - 1;\n while (newDi > 0 && !isDataRowItem(items[newDi])) newDi--;\n newItem = items[newDi];\n }\n newCi = Math.max(0, Math.min(cols - 1, newCi));\n }\n if (newItem === null) {\n this.opts.selectedRange.set(null);\n this.opts.selectedCell.set({ rowIndex: this.opts.dataSource().length, colIndex: 0 });\n } else if (isDataRowItem(newItem)) {\n if (extendRange) {\n this.opts.extendRangeTo(newItem.originalIndex, newCi);\n } else {\n this.opts.selectedRange.set(null);\n this.opts.selectedCell.set({ rowIndex: newItem.originalIndex, colIndex: newCi });\n }\n }\n this.scrollToKeepVisible(newDi, newCi);\n this.opts.focusGrid();\n }\n\n /** Move by the number of complete data rows currently visible in the viewport. */\n private moveSelectionByPage(direction: -1 | 1, extendRange: boolean): void {\n const items = this.opts.filteredItems();\n const dataRows = items\n .map((item, displayIndex) => ({ item, displayIndex }))\n .filter((entry): entry is {\n item: Extract<GridItem, { row: object; originalIndex: number }>;\n displayIndex: number;\n } => isDataRowItem(entry.item));\n if (dataRows.length === 0) return;\n\n const selected = this.opts.selectedCell();\n const current = selected\n ? dataRows.findIndex(entry => entry.item.originalIndex === selected.rowIndex)\n : -1;\n const rowsPerPage = Math.max(\n 1,\n Math.floor(this.opts.viewport().getViewportSize() / this.opts.rowHeight()),\n );\n const target = current < 0\n ? direction > 0 ? 0 : dataRows.length - 1\n : Math.max(0, Math.min(dataRows.length - 1, current + direction * rowsPerPage));\n this.selectProjectedRow(\n dataRows[target].item.originalIndex,\n dataRows[target].displayIndex,\n selected?.colIndex ?? 0,\n extendRange,\n );\n }\n\n /**\n * Home/End move horizontally within the selected row; Ctrl/Cmd moves to the corresponding\n * corner of the projected grid, matching common spreadsheet and ARIA-grid conventions.\n */\n private moveSelectionToBoundary(\n edge: 'start' | 'end',\n wholeGrid: boolean,\n extendRange: boolean,\n ): void {\n const items = this.opts.filteredItems();\n const cols = this.opts.visibleColDefs();\n if (items.length === 0 || cols.length === 0) return;\n\n const selected = this.opts.selectedCell();\n let displayIndex = selected ? this.selectedDisplayIndex() : -1;\n if (wholeGrid || displayIndex < 0 || !isDataRowItem(items[displayIndex])) {\n const step = edge === 'start' ? 1 : -1;\n displayIndex = edge === 'start' ? 0 : items.length - 1;\n while (displayIndex >= 0 && displayIndex < items.length && !isDataRowItem(items[displayIndex])) {\n displayIndex += step;\n }\n }\n const item = items[displayIndex];\n if (!isDataRowItem(item)) return;\n this.selectProjectedRow(\n item.originalIndex,\n displayIndex,\n edge === 'start' ? 0 : cols.length - 1,\n extendRange,\n );\n }\n\n /** Apply a projected keyboard destination and keep both axes visible. */\n private selectProjectedRow(\n originalIndex: number,\n displayIndex: number,\n colIndex: number,\n extendRange: boolean,\n ): void {\n colIndex = this.opts.resolveCellColumn?.(originalIndex, colIndex, 0) ?? colIndex;\n if (extendRange && this.opts.selectedCell()) {\n this.opts.extendRangeTo(originalIndex, colIndex);\n } else {\n this.opts.selectedRange.set(null);\n this.opts.selectedCell.set({ rowIndex: originalIndex, colIndex });\n }\n this.scrollToKeepVisible(displayIndex, colIndex);\n this.opts.focusGrid();\n }\n\n private selectedDisplayIndex(): number {\n const sel = this.opts.selectedCell();\n if (!sel) return -1;\n const items = this.opts.filteredItems();\n if (sel.rowIndex >= this.opts.dataSource().length) return items.length - 1;\n return items.findIndex(item => isDataRowItem(item) && item.originalIndex === sel.rowIndex);\n }\n\n private addRowAndSelect(): void {\n const emptyRow = this.buildEmptyRow();\n const insertedIndex = this.opts.dataSource().addRow(emptyRow);\n this.opts.selectedRange.set(null);\n this.opts.selectedCell.set({ rowIndex: insertedIndex, colIndex: 0 });\n this.opts.focusGrid();\n const displayIdx = this.findDisplayIndex(insertedIndex);\n if (displayIdx >= 0) this.scrollToKeepVisible(displayIdx, 0);\n this.opts.onPrepareAddRecord({ index: insertedIndex, data: emptyRow });\n }\n\n private buildEmptyRow(): Record<string, unknown> {\n const row: Record<string, unknown> = {};\n for (const col of this.opts.colDefs()) row[col.field] = col.type === 'number' ? 0 : '';\n return row;\n }\n}\n","/**\n * Zero-dependency `.xlsx` writer.\n *\n * An `.xlsx` file is a ZIP archive of small OOXML parts. This module emits both with no runtime\n * dependency: ZIP entries are written **STORED** (uncompressed), which every spreadsheet app\n * accepts, so no DEFLATE implementation is needed — only a CRC32 table and the OOXML XML.\n *\n * Trade-off: files are uncompressed, so very large exports produce large downloads. That is fine\n * for typical grid exports; a DEFLATE pass could be added later without changing this API.\n * @internal\n */\n\n/** A single typed cell in an exported sheet. @internal */\nexport type XlsxCell =\n | { kind: 'string'; value: string }\n | { kind: 'number'; value: number }\n | { kind: 'date'; value: Date }\n | { kind: 'boolean'; value: boolean }\n | { kind: 'empty' };\n\n/** One data/summary row, with optional outline depth and bold emphasis. @internal */\nexport interface XlsxRow {\n cells: XlsxCell[];\n /** Outline/group depth used for Excel's collapsible row grouping (0 = top level). */\n level?: number;\n /** Render the row with the bold style (used for group subtotal rows). */\n emphasized?: boolean;\n}\n\n/** One worksheet: a bold header row followed by typed data rows. @internal */\nexport interface XlsxSheet {\n /** Tab name. Sanitized to Excel's constraints (≤31 chars, no `\\ / ? * [ ] :`). */\n name: string;\n header: string[];\n rows: XlsxRow[];\n /** Declare a collapsible row outline (summary rows sit above their detail rows). */\n outline?: boolean;\n}\n\n// Style indices baked into styles.xml below: 0 = default, 1 = bold header, 2 = date.\nconst STYLE_HEADER = 1;\nconst STYLE_DATE = 2;\nconst DATE_NUM_FMT_ID = 164;\n\nconst XLSX_MIME =\n 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet';\n\n/** MIME type to use when downloading the bytes returned by {@link buildXlsx}. @internal */\nexport const XLSX_CONTENT_TYPE = XLSX_MIME;\n\nconst encoder = new TextEncoder();\n\n/** Builds a complete `.xlsx` workbook as bytes from one or more sheets. */\nexport function buildXlsx(sheets: XlsxSheet[]): Uint8Array {\n const files: ZipEntry[] = [\n { name: '[Content_Types].xml', data: encoder.encode(contentTypesXml(sheets.length)) },\n { name: '_rels/.rels', data: encoder.encode(ROOT_RELS) },\n { name: 'xl/workbook.xml', data: encoder.encode(workbookXml(sheets)) },\n { name: 'xl/_rels/workbook.xml.rels', data: encoder.encode(workbookRelsXml(sheets.length)) },\n { name: 'xl/styles.xml', data: encoder.encode(STYLES_XML) },\n ...sheets.map((sheet, i) => ({\n name: `xl/worksheets/sheet${i + 1}.xml`,\n data: encoder.encode(sheetXml(sheet)),\n })),\n ];\n return zipStored(files);\n}\n\n/** Converts a JS `Date` to an Excel serial number (1900 date system, via the 1899-12-30 epoch). */\nexport function excelSerial(date: Date): number {\n // Use the date's wall-clock components so values do not drift across time zones.\n const utc = Date.UTC(\n date.getFullYear(), date.getMonth(), date.getDate(),\n date.getHours(), date.getMinutes(), date.getSeconds(),\n );\n const epoch = Date.UTC(1899, 11, 30);\n return (utc - epoch) / 86_400_000;\n}\n\n// ── OOXML parts ───────────────────────────────────────────────────────────────\n\nconst ROOT_RELS =\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n` +\n `<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">` +\n `<Relationship Id=\"rId1\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument\" Target=\"xl/workbook.xml\"/>` +\n `</Relationships>`;\n\nconst STYLES_XML =\n `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n` +\n `<styleSheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\">` +\n `<numFmts count=\"1\"><numFmt numFmtId=\"${DATE_NUM_FMT_ID}\" formatCode=\"yyyy-mm-dd\"/></numFmts>` +\n `<fonts count=\"2\"><font><sz val=\"11\"/><name val=\"Calibri\"/></font><font><b/><sz val=\"11\"/><name val=\"Calibri\"/></font></fonts>` +\n `<fills count=\"2\"><fill><patternFill patternType=\"none\"/></fill><fill><patternFill patternType=\"gray125\"/></fill></fills>` +\n `<borders count=\"1\"><border/></borders>` +\n `<cellStyleXfs count=\"1\"><xf numFmtId=\"0\" fontId=\"0\" fillId=\"0\" borderId=\"0\"/></cellStyleXfs>` +\n `<cellXfs count=\"3\">` +\n `<xf numFmtId=\"0\" fontId=\"0\" fillId=\"0\" borderId=\"0\" xfId=\"0\"/>` +\n `<xf numFmtId=\"0\" fontId=\"1\" fillId=\"0\" borderId=\"0\" xfId=\"0\" applyFont=\"1\"/>` +\n `<xf numFmtId=\"${DATE_NUM_FMT_ID}\" fontId=\"0\" fillId=\"0\" borderId=\"0\" xfId=\"0\" applyNumberFormat=\"1\"/>` +\n `</cellXfs>` +\n `<cellStyles count=\"1\"><cellStyle name=\"Normal\" xfId=\"0\" builtinId=\"0\"/></cellStyles>` +\n `</styleSheet>`;\n\nfunction contentTypesXml(sheetCount: number): string {\n const overrides = Array.from({ length: sheetCount }, (_, i) =>\n `<Override PartName=\"/xl/worksheets/sheet${i + 1}.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml\"/>`,\n ).join('');\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n` +\n `<Types xmlns=\"http://schemas.openxmlformats.org/package/2006/content-types\">` +\n `<Default Extension=\"rels\" ContentType=\"application/vnd.openxmlformats-package.relationships+xml\"/>` +\n `<Default Extension=\"xml\" ContentType=\"application/xml\"/>` +\n `<Override PartName=\"/xl/workbook.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml\"/>` +\n `<Override PartName=\"/xl/styles.xml\" ContentType=\"application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml\"/>` +\n overrides +\n `</Types>`;\n}\n\nfunction workbookXml(sheets: XlsxSheet[]): string {\n const entries = sheets.map((sheet, i) =>\n `<sheet name=\"${escapeAttr(sheetName(sheet.name, i))}\" sheetId=\"${i + 1}\" r:id=\"rId${i + 1}\"/>`,\n ).join('');\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n` +\n `<workbook xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\">` +\n `<sheets>${entries}</sheets></workbook>`;\n}\n\nfunction workbookRelsXml(sheetCount: number): string {\n const sheetRels = Array.from({ length: sheetCount }, (_, i) =>\n `<Relationship Id=\"rId${i + 1}\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet\" Target=\"worksheets/sheet${i + 1}.xml\"/>`,\n ).join('');\n const stylesRel =\n `<Relationship Id=\"rId${sheetCount + 1}\" Type=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles\" Target=\"styles.xml\"/>`;\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n` +\n `<Relationships xmlns=\"http://schemas.openxmlformats.org/package/2006/relationships\">` +\n sheetRels + stylesRel + `</Relationships>`;\n}\n\nfunction sheetXml(sheet: XlsxSheet): string {\n const headerCells = sheet.header\n .map((label, c) => `<c r=\"${cellRef(c, 1)}\" s=\"${STYLE_HEADER}\" t=\"inlineStr\"><is><t${preserve(label)}>${escapeText(label)}</t></is></c>`)\n .join('');\n const rows = [`<row r=\"1\">${headerCells}</row>`];\n sheet.rows.forEach((row, ri) => {\n const r = ri + 2;\n const cells = row.cells.map((cell, c) => cellXml(cellRef(c, r), cell, row.emphasized)).join('');\n const level = row.level ? ` outlineLevel=\"${row.level}\"` : '';\n rows.push(`<row r=\"${r}\"${level}>${cells}</row>`);\n });\n // `summaryBelow=\"0\"` puts each group's summary row above its (indented) detail rows.\n const sheetPr = sheet.outline ? `<sheetPr><outlinePr summaryBelow=\"0\"/></sheetPr>` : '';\n const freeze =\n `<sheetViews><sheetView workbookViewId=\"0\">` +\n `<pane ySplit=\"1\" topLeftCell=\"A2\" activePane=\"bottomLeft\" state=\"frozen\"/>` +\n `<selection pane=\"bottomLeft\" activeCell=\"A2\" sqref=\"A2\"/></sheetView></sheetViews>`;\n return `<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>\\n` +\n `<worksheet xmlns=\"http://schemas.openxmlformats.org/spreadsheetml/2006/main\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\">` +\n sheetPr + freeze + `<sheetData>${rows.join('')}</sheetData></worksheet>`;\n}\n\nfunction cellXml(ref: string, cell: XlsxCell, emphasized = false): string {\n const bold = emphasized ? ` s=\"${STYLE_HEADER}\"` : '';\n switch (cell.kind) {\n case 'number':\n return Number.isFinite(cell.value) ? `<c r=\"${ref}\"${bold}><v>${cell.value}</v></c>` : `<c r=\"${ref}\"${bold}/>`;\n case 'boolean':\n return `<c r=\"${ref}\" t=\"b\"><v>${cell.value ? 1 : 0}</v></c>`;\n case 'date':\n return `<c r=\"${ref}\" s=\"${STYLE_DATE}\"><v>${excelSerial(cell.value)}</v></c>`;\n case 'string':\n return `<c r=\"${ref}\"${bold} t=\"inlineStr\"><is><t${preserve(cell.value)}>${escapeText(cell.value)}</t></is></c>`;\n case 'empty':\n return `<c r=\"${ref}\"${bold}/>`;\n }\n}\n\n// ── Helpers ───────────────────────────────────────────────────────────────────\n\n/** Converts a zero-based column index to a spreadsheet column letter (0→A, 26→AA). */\nexport function columnLetter(index: number): string {\n let n = index + 1;\n let letters = '';\n while (n > 0) {\n const remainder = (n - 1) % 26;\n letters = String.fromCharCode(65 + remainder) + letters;\n n = Math.floor((n - 1) / 26);\n }\n return letters;\n}\n\nfunction cellRef(col: number, row: number): string {\n return `${columnLetter(col)}${row}`;\n}\n\nfunction sheetName(name: string, index: number): string {\n const cleaned = (name || `Sheet${index + 1}`).replace(/[\\\\/?*[\\]:]/g, ' ').slice(0, 31);\n return cleaned || `Sheet${index + 1}`;\n}\n\nfunction escapeText(value: string): string {\n return value.replace(/[&<>]/g, ch => (ch === '&' ? '&' : ch === '<' ? '<' : '>'));\n}\n\nfunction escapeAttr(value: string): string {\n return escapeText(value).replace(/\"/g, '"');\n}\n\nfunction preserve(value: string): string {\n return /^\\s|\\s$/.test(value) ? ' xml:space=\"preserve\"' : '';\n}\n\n// ── STORED ZIP container ──────────────────────────────────────────────────────\n\ninterface ZipEntry {\n name: string;\n data: Uint8Array;\n}\n\nconst CRC_TABLE = (() => {\n const table = new Uint32Array(256);\n for (let n = 0; n < 256; n++) {\n let c = n;\n for (let k = 0; k < 8; k++) c = c & 1 ? 0xed_b8_83_20 ^ (c >>> 1) : c >>> 1;\n table[n] = c >>> 0;\n }\n return table;\n})();\n\nfunction crc32(bytes: Uint8Array): number {\n let crc = 0xff_ff_ff_ff;\n for (let i = 0; i < bytes.length; i++) {\n crc = CRC_TABLE[(crc ^ bytes[i]) & 0xff] ^ (crc >>> 8);\n }\n return (crc ^ 0xff_ff_ff_ff) >>> 0;\n}\n\nfunction zipStored(files: ZipEntry[]): Uint8Array {\n const local: number[] = [];\n const central: number[] = [];\n const u16 = (arr: number[], v: number) => arr.push(v & 0xff, (v >>> 8) & 0xff);\n const u32 = (arr: number[], v: number) =>\n arr.push(v & 0xff, (v >>> 8) & 0xff, (v >>> 16) & 0xff, (v >>> 24) & 0xff);\n const bytes = (arr: number[], src: Uint8Array) => {\n for (let i = 0; i < src.length; i++) arr.push(src[i]);\n };\n\n for (const file of files) {\n const nameBytes = encoder.encode(file.name);\n const crc = crc32(file.data);\n const size = file.data.length;\n const offset = local.length;\n\n // Local file header (DOS date 1980-01-01, no time).\n u32(local, 0x04_03_4b_50);\n u16(local, 20); u16(local, 0); u16(local, 0); u16(local, 0); u16(local, 0x21);\n u32(local, crc); u32(local, size); u32(local, size);\n u16(local, nameBytes.length); u16(local, 0);\n bytes(local, nameBytes);\n bytes(local, file.data);\n\n // Central directory record.\n u32(central, 0x02_01_4b_50);\n u16(central, 20); u16(central, 20); u16(central, 0); u16(central, 0);\n u16(central, 0); u16(central, 0x21);\n u32(central, crc); u32(central, size); u32(central, size);\n u16(central, nameBytes.length); u16(central, 0); u16(central, 0);\n u16(central, 0); u16(central, 0); u32(central, 0);\n u32(central, offset);\n bytes(central, nameBytes);\n }\n\n const cdOffset = local.length;\n const eocd: number[] = [];\n u32(eocd, 0x06_05_4b_50);\n u16(eocd, 0); u16(eocd, 0);\n u16(eocd, files.length); u16(eocd, files.length);\n u32(eocd, central.length); u32(eocd, cdOffset); u16(eocd, 0);\n\n return Uint8Array.from([...local, ...central, ...eocd]);\n}\n","import { Signal } from '@angular/core';\nimport { AgridBrowserAdapter } from '../infrastructure/agrid-browser.adapter';\nimport { XLSX_CONTENT_TYPE, XlsxCell, XlsxRow, XlsxSheet, buildXlsx } from '../infrastructure/agrid-xlsx';\nimport { AgridControl } from '../agrid-control';\nimport { AgridExportGroup, ColDef } from '../agrid.types';\nimport { getDisplayForField } from '../agrid.utils';\n\n/** Reactive display state required by {@link AgridPresentationService}. @internal */\nexport interface AgridPresentationOptions {\n control: Signal<AgridControl | null>;\n visibleColDefs: Signal<ColDef[]>;\n /**\n * Rows an export should contain: the full filtered + sorted set in display order, independent of\n * grouping, pagination, and collapsed-group state (which only affect what is rendered on screen).\n */\n exportRows: Signal<Record<string, unknown>[]>;\n /** Grouped export structure when the grid is grouped, or `null` for a flat export. */\n exportGroups?: Signal<AgridExportGroup[] | null>;\n locale: Signal<string>;\n /** Optional host callback returning CSS classes for a whole data row. */\n getRowClass?: Signal<((params: { row: Record<string, unknown>; index: number }) => string) | undefined>;\n}\n\n/**\n * Provides display formatting and CSV export without coupling them to the grid component.\n * @internal\n */\nexport class AgridPresentationService {\n constructor(\n private readonly opts: AgridPresentationOptions,\n private readonly browser = new AgridBrowserAdapter(),\n ) {}\n\n /** Returns the formatted tooltip text for a cell value. */\n getCellTitle(col: ColDef, value: unknown): string {\n return getDisplayForField(col, value, this.opts.locale());\n }\n\n /** Resolves dynamic CSS classes configured for a cell. */\n getCellClass(col: ColDef, value: unknown, row: Record<string, unknown>): string {\n return col.cellClass?.({ value, row }) ?? '';\n }\n\n /** Resolves dynamic CSS classes configured for a whole data row. */\n getRowClass(row: Record<string, unknown>, index: number): string {\n return this.opts.getRowClass?.()?.({ row, index }) ?? '';\n }\n\n /** Returns the compact label for a built-in aggregate. */\n getAggregateLabel(col: ColDef): string {\n const aggregate = this.opts.control()?.aggregates()[col.field] ?? col.aggregate;\n if (!aggregate || typeof aggregate === 'function') return '';\n return { sum: 'Σ', avg: 'Ø', min: '↓', max: '↑', count: '#' }[aggregate] ?? '';\n }\n\n /** Returns whether a column has a static or runtime aggregate. */\n hasAggregate(col: ColDef): boolean {\n return this.opts.control()?.aggregates()[col.field] !== undefined || !!col.aggregate;\n }\n\n /** Formats a computed footer value for display. */\n getFooterDisplay(col: ColDef, value: unknown): string {\n if (value == null || value === '') return '';\n if (col.formatter) return col.formatter(value);\n if (typeof value === 'number') return value.toLocaleString(this.opts.locale());\n return String(value);\n }\n\n /** Downloads the current filtered, sorted rows and visible columns as CSV. */\n exportCsv(filename: string): void {\n const cols = this.opts.visibleColDefs();\n const rows = this.opts.exportRows();\n const escape = (value: string): string =>\n /[,\"\\n\\r]/.test(value) ? `\"${value.replace(/\"/g, '\"\"')}\"` : value;\n const header = cols.map(col => escape(col.header)).join(',');\n const locale = this.opts.locale();\n const body = rows\n .map(row => cols\n .map(col => escape(getDisplayForField(col, row[col.field], locale)))\n .join(','))\n .join('\\n');\n this.browser.downloadText(\n filename,\n `${header}\\n${body}`,\n 'text/csv;charset=utf-8;',\n );\n }\n\n /**\n * Downloads the current filtered, sorted rows and visible columns as an `.xlsx` workbook.\n * When the grid is grouped, emits a collapsible Excel row outline with per-group subtotal rows.\n */\n exportXlsx(filename: string, sheetName = 'Sheet1'): void {\n const cols = this.opts.visibleColDefs();\n const locale = this.opts.locale();\n const groups = this.opts.exportGroups?.() ?? null;\n const sheet = groups\n ? this.buildGroupedSheet(sheetName, cols, groups, locale)\n : this.buildFlatSheet(sheetName, cols, this.opts.exportRows(), locale);\n this.browser.downloadBytes(filename, buildXlsx([sheet]), XLSX_CONTENT_TYPE);\n }\n\n private buildFlatSheet(\n name: string,\n cols: ColDef[],\n rows: Record<string, unknown>[],\n locale: string,\n ): XlsxSheet {\n return {\n name,\n header: cols.map(col => col.header),\n rows: rows.map(row => ({ cells: cols.map(col => this.toXlsxCell(col, row[col.field], locale)) })),\n };\n }\n\n private buildGroupedSheet(\n name: string,\n cols: ColDef[],\n groups: AgridExportGroup[],\n locale: string,\n ): XlsxSheet {\n const rows: XlsxRow[] = [];\n for (const group of groups) {\n // Summary row (level 0): group label in the first column, subtotals in aggregate columns.\n const summary: XlsxCell[] = cols.map((col, index) => {\n if (index === 0) return { kind: 'string', value: `${group.label} (${group.rows.length})` };\n const value = group.aggregates[col.field];\n if (value == null) return { kind: 'empty' };\n return typeof value === 'number' && Number.isFinite(value)\n ? { kind: 'number', value }\n : { kind: 'string', value: String(value) };\n });\n rows.push({ cells: summary, level: 0, emphasized: true });\n for (const row of group.rows) {\n rows.push({ cells: cols.map(col => this.toXlsxCell(col, row[col.field], locale)), level: 1 });\n }\n }\n return { name, header: cols.map(col => col.header), rows, outline: true };\n }\n\n /**\n * Maps a raw cell value to a typed spreadsheet cell so Excel keeps numbers and dates native\n * (sortable, summable). Mapped value lists and custom formatters fall back to display text.\n */\n private toXlsxCell(col: ColDef, raw: unknown, locale: string): XlsxCell {\n if (raw == null || raw === '') return { kind: 'empty' };\n if (col.values?.length) return { kind: 'string', value: getDisplayForField(col, raw, locale) };\n if (col.type === 'number' && typeof raw === 'number' && Number.isFinite(raw)) {\n return { kind: 'number', value: raw };\n }\n if (col.type === 'boolean' && typeof raw === 'boolean') return { kind: 'boolean', value: raw };\n if (col.type === 'date') {\n const date = raw instanceof Date ? raw : new Date(raw as string | number);\n if (!Number.isNaN(date.getTime())) return { kind: 'date', value: date };\n }\n return { kind: 'string', value: getDisplayForField(col, raw, locale) };\n }\n}\n","import { ChangeDetectionStrategy, Component, input } from \"@angular/core\";\n\n@Component({\n selector: 'agrid-menu-icon',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [],\n styleUrls: ['./agrid-menu-icon.component.css'],\n templateUrl: 'agrid-menu-icon.component.html',\n // Using a fallback empty string prevents 'undefined' from rendering as a string in the HTML\n host: { \n '[class]': 'class() || \"\"' \n },\n})\nexport class AgridMenuBarIcon {\n class = input<string>();\n}","<span aria-hidden=\"true\"><ng-content></ng-content></span>","import { ChangeDetectionStrategy, Component, input, output } from '@angular/core';\nimport {\n AgridMenuBarContext,\n AgridMenuBarItem,\n AgridMenuBarMenuItem,\n AgridMenuBarState,\n} from '../agrid.types';\nimport { AgridMenuBarIcon } from './agrid-menu-icon.component';\n\n/** Internal renderer for provider-configured grid commands and dropdown items. */\n@Component({\n selector: 'agrid-menu-bar',\n imports:[AgridMenuBarIcon],\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './agrid-menu-bar.component.html',\n styleUrl: './agrid-menu-bar.component.css',\n})\nexport class AgridMenuBarComponent<T extends object = any> {\n items = input<readonly AgridMenuBarItem<T>[]>([]);\n context = input.required<AgridMenuBarContext<T>>();\n label = input<string>('Actions');\n openItemId = input<string | null>(null);\n\n action = output<string>();\n openItemIdChange = output<string | null>();\n\n resolveState(state: AgridMenuBarState<T> | undefined, fallback: boolean): boolean {\n if (typeof state === 'function') return state(this.context());\n return state ?? fallback;\n }\n\n isActive(item: AgridMenuBarMenuItem<T>): boolean {\n return this.resolveState(item.active, false);\n }\n\n isDisabled(item: AgridMenuBarMenuItem<T>): boolean {\n return this.resolveState(item.disabled, false);\n }\n\n visibleChildren(item: AgridMenuBarItem<T>): AgridMenuBarMenuItem<T>[] {\n return (item.items ?? []).filter(child => this.resolveState(child.visible, true));\n }\n\n runAction(event: Event, item: AgridMenuBarMenuItem<T>): void {\n event.stopPropagation();\n if (!this.resolveState(item.visible, true) || this.isDisabled(item)) return;\n this.action.emit(item.id);\n this.openItemIdChange.emit(null);\n }\n\n toggleMenu(event: Event, item: AgridMenuBarItem<T>): void {\n event.preventDefault();\n event.stopPropagation();\n if (this.isDisabled(item) || this.visibleChildren(item).length === 0) return;\n this.openItemIdChange.emit(this.openItemId() === item.id ? null : item.id);\n }\n\n onTriggerKeydown(event: KeyboardEvent, item: AgridMenuBarItem<T>): void {\n if (event.key !== 'ArrowDown' && event.key !== 'ArrowUp') return;\n event.preventDefault();\n event.stopPropagation();\n if (this.isDisabled(item) || this.visibleChildren(item).length === 0) return;\n this.openItemIdChange.emit(item.id);\n const group = (event.currentTarget as HTMLElement).closest('.ag-menu-bar-group');\n setTimeout(() => {\n const enabled = group?.querySelectorAll<HTMLButtonElement>(\n '.ag-menu-bar-dropdown [role=\"menuitem\"]:not(:disabled)',\n );\n const target = event.key === 'ArrowUp' ? enabled?.[enabled.length - 1] : enabled?.[0];\n target?.focus();\n });\n }\n\n onMenuKeydown(event: KeyboardEvent): void {\n const menu = event.currentTarget as HTMLElement;\n const items = Array.from(\n menu.querySelectorAll<HTMLButtonElement>('[role=\"menuitem\"]:not(:disabled)'),\n );\n if (event.key === 'Escape') {\n event.preventDefault();\n event.stopPropagation();\n this.openItemIdChange.emit(null);\n menu.closest('.ag-menu-bar-group')\n ?.querySelector<HTMLButtonElement>('.ag-menu-bar-trigger')\n ?.focus();\n return;\n }\n if (!['ArrowDown', 'ArrowUp', 'Home', 'End'].includes(event.key) || items.length === 0) return;\n event.preventDefault();\n event.stopPropagation();\n const current = items.indexOf(event.target as HTMLButtonElement);\n const next = event.key === 'Home'\n ? 0\n : event.key === 'End'\n ? items.length - 1\n : event.key === 'ArrowDown'\n ? (current + 1 + items.length) % items.length\n : (current - 1 + items.length) % items.length;\n items[next].focus();\n }\n}\n","<div class=\"ag-menu-bar\" role=\"toolbar\" [attr.aria-label]=\"label()\">\n @for (item of items(); track item.id) {\n @let children = visibleChildren(item);\n <div class=\"ag-menu-bar-group\" [attr.data-menu-id]=\"item.id\">\n <button type=\"button\" class=\"ag-menu-bar-button\"\n [class.ag-menu-bar-button--active]=\"isActive(item)\"\n [class.ag-menu-bar-button--split]=\"children.length > 0\"\n [disabled]=\"isDisabled(item)\"\n [attr.aria-pressed]=\"item.active !== undefined ? isActive(item) : null\"\n (click)=\"runAction($event, item)\">\n @if (item.icon) {\n <agrid-menu-icon [class]=\"item.class\">{{item.icon}}</agrid-menu-icon>\n }\n <span class=\"ag-menu-bar-label\">{{ item.label }}</span>\n </button>\n @if (children.length > 0) {\n <button type=\"button\" class=\"ag-menu-bar-trigger\"\n [class.ag-menu-bar-trigger--open]=\"openItemId() === item.id\"\n [attr.aria-label]=\"item.label + ': ' + label()\"\n [attr.aria-expanded]=\"openItemId() === item.id\" aria-haspopup=\"menu\"\n [disabled]=\"isDisabled(item)\"\n (click)=\"toggleMenu($event, item)\"\n (keydown)=\"onTriggerKeydown($event, item)\">▾</button>\n @if (openItemId() === item.id) {\n <div class=\"ag-menu-bar-dropdown\" role=\"menu\" [attr.aria-label]=\"item.label\"\n (click)=\"$event.stopPropagation()\" (keydown)=\"onMenuKeydown($event)\">\n @for (child of children; track child.id) {\n <button type=\"button\" class=\"ag-menu-bar-dropdown-item\" role=\"menuitem\"\n [class.ag-menu-bar-dropdown-item--active]=\"isActive(child)\"\n [disabled]=\"isDisabled(child)\"\n [attr.aria-current]=\"isActive(child) ? 'true' : null\"\n (click)=\"runAction($event, child)\">\n <span class=\"ag-menu-bar-dropdown-check\" aria-hidden=\"true\">{{ isActive(child) ? '✓' : '' }}</span>\n @if (child.icon) {\n <agrid-menu-icon [class]=\"item.class\">{{child.icon}}</agrid-menu-icon>\n }\n <span class=\"ag-menu-bar-label\">{{ child.label }}</span>\n </button>\n }\n </div>\n }\n }\n </div>\n }\n</div>\n","import { Signal, computed, signal } from '@angular/core';\nimport { AgridDataSource } from '../agrid-datasource';\nimport { AgridProvider } from '../agrid-provider';\nimport {\n AgridMenuBarContext,\n AgridMenuBarItem,\n AgridMenuBarMenuItem,\n AgridMenuBarState,\n CellPosition,\n} from '../agrid.types';\n\n/** Synthetic id of the built-in \"save configuration\" entry. @internal */\nexport const AGRID_SAVE_CONFIG_ACTION = '_internal_save_config';\nexport const AGRID_EXPORT_ACTION = '_internal_export';\nexport const AGRID_EXPORT_CSV_ACTION = '_internal_export_csv';\nexport const AGRID_EXPORT_XLSX_ACTION = '_internal_export_xlsx';\n\n\n/** Dependencies and callbacks required by {@link AgridMenuBarController}. @internal */\nexport interface AgridMenuBarControllerOptions<T extends object = any> {\n dataSource: Signal<AgridDataSource>;\n provider: Signal<AgridProvider<T>>;\n selectedRowIndices: Signal<ReadonlySet<number>>;\n selectedCell: Signal<CellPosition | null>;\n menuBarItems: Signal<AgridMenuBarItem<T>[]>;\n /** Grid id used both to gate config persistence and to key the saved entry. */\n gridId: Signal<string | undefined>;\n /** Localized label for the built-in save-configuration entry. */\n saveConfigLabel: Signal<string>;\n /** Enable Export Menu */\n enableExportButtons: Signal<boolean | undefined>;\n /** Localized labels for the built-in export entry. */\n exportLabel: Signal<string>;\n exportCsvLabel: Signal<string>;\n exportXlsxLabel: Signal<string>;\n\n /** Emits a user-defined menu-bar action id. */\n emitAction: (id: string) => void;\n /** Closes other grid menus when a dropdown opens. */\n closeOtherMenus: () => void;\n /** Persists the current grid configuration (e.g. to local storage). */\n persistSettings: () => void;\n /** the Export Action */\n exportData:(format:string)=>void;\n}\n\n/**\n * Owns the menu-bar toolbar's open-dropdown state, the runtime context fed to\n * visibility/active/disabled resolvers, the resolved set of visible buttons, and\n * action dispatch (including the built-in save-configuration entry).\n * @internal\n */\nexport class AgridMenuBarController<T extends object = any> {\n /** Id of the menu-bar button whose dropdown is open, or `null`. */\n readonly openItemId = signal<string | null>(null);\n\n /** Runtime state passed to menu-bar visibility, active, and disabled resolvers. */\n readonly context = computed<AgridMenuBarContext<T>>(() => {\n const datasource = this.opts.dataSource();\n const rows = datasource.rows() as T[];\n const selectedRows = [...this.opts.selectedRowIndices()]\n .sort((a, b) => a - b)\n .map(originalIndex => ({ row: rows[originalIndex], originalIndex }))\n .filter((entry): entry is { row: T; originalIndex: number } => !!entry.row);\n return {\n rows,\n selectedRows,\n selectedCell: this.opts.selectedCell(),\n provider: this.opts.provider(),\n datasource,\n };\n });\n\n /** Menu-bar buttons currently allowed by their visibility resolvers. */\n readonly visibleItems = computed(() => {\n const userEntries = this.opts.menuBarItems().filter(item => this.isItemVisible(item));\n const buildInActions: AgridMenuBarItem[] = this.opts.gridId()\n ? [{ id: AGRID_SAVE_CONFIG_ACTION, label: this.opts.saveConfigLabel(), icon: '↓' }]\n : [];\n\n if (this.opts.enableExportButtons()) {\n buildInActions.push(\n {\n id: AGRID_EXPORT_ACTION, label: this.opts.exportLabel(),\n items: [\n { id: AGRID_EXPORT_CSV_ACTION, label: this.opts.exportCsvLabel() },\n { id: AGRID_EXPORT_XLSX_ACTION, label: this.opts.exportXlsxLabel() }\n ]\n });\n }\n return [...buildInActions, ...userEntries];\n });\n\n constructor(private readonly opts: AgridMenuBarControllerOptions<T>) { }\n\n /** Whether a menu-bar button or dropdown item should be rendered. */\n isItemVisible(item: AgridMenuBarMenuItem<T>): boolean {\n return this.resolveState(item.visible, true);\n }\n\n /** Closes the currently open menu-bar dropdown. */\n close(): void {\n this.openItemId.set(null);\n }\n\n /** Synchronizes dropdown state and closes competing grid menus when one opens. */\n onOpenItemChange(id: string | null): void {\n if (id !== null) this.opts.closeOtherMenus();\n this.openItemId.set(id);\n }\n\n /** Dispatches a menu-bar action, persisting config for the built-in save entry. */\n runAction(id: string): void {\n\n if (id === AGRID_SAVE_CONFIG_ACTION && this.opts.gridId()) {\n this.opts.persistSettings();\n return;\n }\n\n if (id === AGRID_EXPORT_CSV_ACTION && this.opts.enableExportButtons()) {\n this.opts.exportData('csv');\n return;\n }\n\n if (id === AGRID_EXPORT_XLSX_ACTION && this.opts.enableExportButtons()) {\n this.opts.exportData('xlsx');\n return;\n }\n\n this.opts.emitAction(id);\n }\n\n private resolveState(state: AgridMenuBarState<T> | undefined, fallback: boolean): boolean {\n if (typeof state === 'function') return state(this.context());\n return state ?? fallback;\n }\n}\n","import { Signal, WritableSignal, computed, signal } from '@angular/core';\n\n/** @internal */\nexport interface ɵAgridControlRuntimeState {\n loading: WritableSignal<boolean>;\n readonly: WritableSignal<boolean>;\n autoAddRows: WritableSignal<boolean>;\n}\n\nconst CONTROL_RUNTIME_STATE = new WeakMap<AgridControl, ɵAgridControlRuntimeState>();\n\n/**\n * A single reversible cell edit stored in the undo/redo history.\n * Both `oldValue` and `newValue` are the raw values as stored in the data source.\n */\nexport interface HistoryEntry {\n rowIndex: number;\n field: string;\n oldValue: unknown;\n newValue: unknown;\n}\n\n/** A single undo/redo history item. Multi-cell operations are stored as one batch. */\nexport type HistoryItem = HistoryEntry | HistoryEntry[];\n\n/**\n * Per-column filter state stored inside {@link AgridControl}.\n *\n * All three fields are independent — text, value selection, and sort are ANDed together\n * when computing the visible rows.\n */\n/**\n * Comparison operator for a column condition filter.\n * For `date` columns `gt`/`lt`/`eq` read as after / before / on.\n */\nexport type FilterOperator =\n | 'eq'\n | 'neq'\n | 'gt'\n | 'gte'\n | 'lt'\n | 'lte'\n | 'between'\n | 'like'\n | 'startsWith'\n | 'endsWith'\n | 'includes'\n | 'notIncludes';\n\nexport interface ColumnFilter {\n /** Free-text substring filter (case-insensitive). Empty string = no text filter. */\n text: string;\n /**\n * Allowed values for the value-picker filter.\n * - `null` → all values pass (no value filter active)\n * - `string[]` → only rows whose field value is in this list are shown\n */\n selectedValues: string[] | null;\n /** Sort direction, or `null` when this column is not sorted. */\n sort: 'asc' | 'desc' | null;\n /**\n * Condition operator for text, number, or date columns, or `null`/omitted when none.\n * Combined with text and value filters using AND semantics.\n */\n operator?: FilterOperator | null;\n /** Primary comparison operand (number as string, or `yyyy-mm-dd`). */\n operand?: string | null;\n /** Upper-bound operand used only when {@link operator} is `'between'`. */\n operand2?: string | null;\n}\n\n/** Transient row indication state produced by {@link AgridControl.indicate}. */\nexport interface AgridRowIndication {\n /** CSS color shown while the row flash is active. */\n color: string;\n /** Fade duration in milliseconds. */\n durationMs: number;\n /** `true` while the row flash is present. */\n active: boolean;\n}\n\n/** Serializable snapshot of the grid's UI state. Used with `toJSON` / `fromJSON`. */\nexport interface AgridControlState {\n /** Per-field column width overrides in pixels. */\n columnWidths: Record<string, number>;\n /** Per-field filter and sort state. Fields with default state may be omitted. */\n filters: Record<string, ColumnFilter>;\n /** Global quick-filter text matched across all visible columns. Empty string when inactive. */\n quickFilter?: string;\n /** When `true`, rows can be reordered by dragging the control-column handle. */\n allowRowReorder?: boolean;\n /** Field to group rows by, or `null` / omitted for no grouping. */\n groupByField?: string | null;\n /** Fields that are currently hidden from the grid view. */\n hiddenColumns?: string[];\n /** Ordered list of field names defining the column display order. */\n columnOrder?: string[];\n /** Fields that are pinned to the left edge. */\n pinnedColumns?: string[];\n /** Fields that are pinned to the right edge. */\n pinnedRightColumns?: string[];\n /** Ordered list of field names currently sorted, from highest to lowest priority. */\n sortOrder?: string[];\n /** Number of rows per page. `0` means no pagination (show all rows). */\n pageSize?: number;\n /** Current page (1-based). */\n currentPage?: number;\n /**\n * Total row count supplied by the server. When greater than zero the grid enters\n * server-side pagination mode: it no longer slices rows locally and instead emits\n * a `(pageChange)` event so the host can fetch the correct slice.\n */\n totalRows?: number;\n /** Per-field aggregate function set via the column menu. Only built-in string values are serializable. */\n aggregates?: Record<string, 'sum' | 'avg' | 'min' | 'max' | 'count'>;\n}\n\n/**\n * Signal-based container for mutable grid UI state such as column widths and active filters.\n *\n * Assign an instance to `AgridProvider.control` so the grid can store runtime state\n * in a place the host component can persist across sessions.\n *\n * @example\n * ```ts\n * // Restore saved state:\n * readonly ctrl = AgridControl.fromJSON(\n * JSON.parse(localStorage.getItem('grid') ?? '{}')\n * );\n *\n * // Save on demand:\n * localStorage.setItem('grid', JSON.stringify(this.ctrl.toJSON()));\n * ```\n */\nexport class AgridControl {\n private readonly _columnWidths = signal<Record<string, number>>({});\n private readonly _filters = signal<Record<string, ColumnFilter>>({});\n private readonly _quickFilter = signal<string>('');\n private readonly _allowRowReorder = signal<boolean>(false);\n private readonly _groupByField = signal<string | null>(null);\n private readonly _hiddenColumns = signal<Set<string>>(new Set());\n private readonly _columnOrder = signal<string[]>([]);\n private readonly _pinnedColumns = signal<Set<string>>(new Set());\n private readonly _pinnedRightColumns = signal<Set<string>>(new Set());\n private readonly _pageSize = signal<number>(0);\n private readonly _currentPage = signal<number>(1);\n private readonly _totalRows = signal<number>(0);\n private readonly _aggregates = signal<Record<string, 'sum' | 'avg' | 'min' | 'max' | 'count'>>({});\n private readonly _sortOrder = signal<string[]>([]);\n private readonly _loading = signal(false);\n private readonly _readonly = signal(false);\n private readonly _autoAddRows = signal(false);\n private readonly _rowIndications = signal<ReadonlyMap<number, AgridRowIndication>>(new Map());\n private readonly _changedCells = signal<ReadonlySet<string>>(new Set());\n private readonly rowIndicationTimers = new Map<number, ReturnType<typeof setTimeout>[]>();\n\n /** @param state Optional initial state, e.g. deserialized from storage. */\n constructor(state?: Partial<AgridControlState>) {\n CONTROL_RUNTIME_STATE.set(this, {\n loading: this._loading,\n readonly: this._readonly,\n autoAddRows: this._autoAddRows,\n });\n if (state) this.loadState(state);\n }\n\n // ── Runtime grid state ────────────────────────────────────────────────────\n\n /** Whether the grid displays its loading overlay. This transient state is not serialized. */\n readonly loading: Signal<boolean> = this._loading.asReadonly();\n\n /** Show or hide the grid loading overlay. */\n setLoading(value: boolean): void {\n this._loading.set(value);\n }\n\n /** Transient row flash indicators keyed by original datasource row index. */\n readonly rowIndications: Signal<ReadonlyMap<number, AgridRowIndication>> =\n this._rowIndications.asReadonly();\n\n /**\n * Flash one datasource row with `color`, then fade back over `durationMs`.\n * This is transient UI state and is not serialized.\n */\n indicate(rowIndex: number, color: string, durationMs = 1000): void {\n const duration = Math.max(0, durationMs);\n this.clearRowIndicationTimers(rowIndex);\n this._rowIndications.update(current => {\n const next = new Map(current);\n next.set(rowIndex, { color, durationMs: duration, active: true });\n return next;\n });\n const removeTimer = setTimeout(() => {\n this._rowIndications.update(current => {\n if (!current.has(rowIndex)) return current;\n const next = new Map(current);\n next.delete(rowIndex);\n return next;\n });\n this.rowIndicationTimers.delete(rowIndex);\n }, duration);\n this.rowIndicationTimers.set(rowIndex, [removeTimer]);\n }\n\n private clearRowIndicationTimers(rowIndex: number): void {\n for (const timer of this.rowIndicationTimers.get(rowIndex) ?? []) clearTimeout(timer);\n this.rowIndicationTimers.delete(rowIndex);\n }\n\n /** Changed-cell markers keyed by original datasource row index and field. */\n readonly changedCells: Signal<ReadonlySet<string>> = this._changedCells.asReadonly();\n\n /** Mark one cell as changed. Used by the grid when `showChangedCellIndicator` is enabled. */\n markChangedCell(rowIndex: number, field: string): void {\n this._changedCells.update(current => {\n const next = new Set(current);\n next.add(this.changedCellKey(rowIndex, field));\n return next;\n });\n }\n\n /**\n * Clears changed-cell markers after persistence succeeds.\n * Omit `rowIndex` to clear every marker; omit `fields` to clear the whole row.\n */\n clearChangedCells(rowIndex?: number, fields?: readonly string[]): void {\n if (rowIndex === undefined) {\n this._changedCells.set(new Set());\n return;\n }\n\n const fieldSet = fields ? new Set(fields) : null;\n this._changedCells.update(current => {\n const next = new Set(current);\n for (const key of current) {\n const marker = this.parseChangedCellKey(key);\n if (marker.rowIndex === rowIndex && (!fieldSet || fieldSet.has(marker.field))) {\n next.delete(key);\n }\n }\n return next;\n });\n }\n\n /** Returns whether one cell is currently marked as changed. */\n isCellChanged(rowIndex: number, field: string): boolean {\n return this._changedCells().has(this.changedCellKey(rowIndex, field));\n }\n\n /** Reconciles changed-cell markers after a datasource row is removed. */\n reconcileChangedCellsAfterRemoval(removedIndex: number): void {\n const shifted = new Set<string>();\n for (const key of this._changedCells()) {\n const marker = this.parseChangedCellKey(key);\n if (marker.rowIndex < removedIndex) shifted.add(key);\n else if (marker.rowIndex > removedIndex) {\n shifted.add(this.changedCellKey(marker.rowIndex - 1, marker.field));\n }\n }\n this._changedCells.set(shifted);\n }\n\n private changedCellKey(rowIndex: number, field: string): string {\n return JSON.stringify([rowIndex, field]);\n }\n\n private parseChangedCellKey(key: string): { rowIndex: number; field: string } {\n const [rowIndex, field] = JSON.parse(key) as [number, string];\n return { rowIndex, field };\n }\n\n /** Whether all grid editing and mutation UI is disabled. This transient state is not serialized. */\n readonly readonly: Signal<boolean> = this._readonly.asReadonly();\n\n /** Enable or disable readonly mode at runtime. */\n setReadonly(value: boolean): void {\n this._readonly.set(value);\n }\n\n /** Whether navigation beyond the final row automatically inserts a row. Not serialized. */\n readonly autoAddRows: Signal<boolean> = this._autoAddRows.asReadonly();\n\n /** Enable or disable automatic row insertion at runtime. */\n setAutoAddRows(value: boolean): void {\n this._autoAddRows.set(value);\n }\n\n /**\n * When `true`, the control column shows a drag handle and rows can be\n * reordered by dragging. Requires `showControlColumn` to be enabled on the grid.\n */\n readonly allowRowReorder: Signal<boolean> = this._allowRowReorder.asReadonly();\n\n /** Enable or disable row reordering at runtime. */\n setAllowRowReorder(value: boolean): void {\n this._allowRowReorder.set(value);\n }\n\n /**\n * The field currently used to group rows, or `null` when grouping is off.\n * When set, rows are bucketed by the display value of this field and a header\n * row is inserted before each group. Secondary sorts still apply within groups.\n */\n readonly groupByField: Signal<string | null> = this._groupByField.asReadonly();\n\n /**\n * Enable grouping by `field`, or pass `null` to turn grouping off.\n */\n setGroupBy(field: string | null): void {\n this._groupByField.set(field);\n }\n\n /**\n * Global quick-filter text. When non-empty (and not in server-side filtering mode),\n * the grid keeps only rows where at least one visible column's display value contains\n * this text (case-insensitive).\n */\n readonly quickFilter: Signal<string> = this._quickFilter.asReadonly();\n\n /** Set the global quick-filter text. Pass an empty string to clear it. */\n setQuickFilter(text: string): void {\n this._quickFilter.set(text);\n }\n\n /**\n * Reactive set of field names that are currently hidden.\n * An empty set means all columns are visible.\n */\n readonly hiddenColumns: Signal<Set<string>> = this._hiddenColumns.asReadonly();\n\n /** Return `true` when the given field is currently hidden. */\n isColumnHidden(field: string): boolean {\n return this._hiddenColumns().has(field);\n }\n\n /**\n * Show or hide a column by field name.\n * Hiding a column does not clear its filter or sort — they resume when it is shown again.\n */\n setColumnVisibility(field: string, visible: boolean): void {\n this._hiddenColumns.update(set => {\n const next = new Set(set);\n if (visible) next.delete(field);\n else next.add(field);\n return next;\n });\n }\n\n /** Toggle the visibility of a column. */\n toggleColumnVisibility(field: string): void {\n this.setColumnVisibility(field, this.isColumnHidden(field));\n }\n\n // ── Column order ──────────────────────────────────────────────────────────\n\n /**\n * Ordered list of field names that defines the left-to-right column display order.\n * An empty array means \"use the original `colDefs` order\".\n */\n readonly columnOrder: Signal<string[]> = this._columnOrder.asReadonly();\n\n /** Replace the entire column order with a new list of field names. */\n setColumnOrder(fields: string[]): void {\n this._columnOrder.set([...fields]);\n }\n\n /**\n * Move `fromField` to a new position relative to `toField`.\n * `currentVisibleOrder` should be the current `visibleColDefs` field array so the\n * operation works correctly whether or not an order has been set before.\n */\n moveColumn(currentVisibleOrder: string[], fromField: string, toField: string, insertBefore: boolean): void {\n this.moveColumns(currentVisibleOrder, [fromField], toField, insertBefore);\n }\n\n /**\n * Move an ordered block of fields to a new position relative to `toField`.\n * Fields absent from `currentVisibleOrder` are ignored.\n */\n moveColumns(\n currentVisibleOrder: string[],\n fromFields: readonly string[],\n toField: string,\n insertBefore: boolean,\n ): void {\n const order = [...currentVisibleOrder];\n const moving = order.filter(field => fromFields.includes(field));\n if (moving.length === 0 || moving.includes(toField)) return;\n const remaining = order.filter(field => !moving.includes(field));\n const toIdx = remaining.indexOf(toField);\n if (toIdx === -1) return;\n remaining.splice(insertBefore ? toIdx : toIdx + 1, 0, ...moving);\n this._columnOrder.set(remaining);\n }\n\n // ── Pinned columns ────────────────────────────────────────────────────────\n\n /** Reactive set of field names currently pinned to the left edge. */\n readonly pinnedColumns: Signal<Set<string>> = this._pinnedColumns.asReadonly();\n\n /** Return `true` when the given field is pinned. */\n isPinned(field: string): boolean {\n return this._pinnedColumns().has(field);\n }\n\n /** Pin or unpin a column to the left edge. Pinning left auto-unpins right. */\n setPinned(field: string, pinned: boolean): void {\n this._pinnedColumns.update(set => {\n const next = new Set(set);\n if (pinned) next.add(field); else next.delete(field);\n return next;\n });\n if (pinned) this._pinnedRightColumns.update(s => { const n = new Set(s); n.delete(field); return n; });\n }\n\n /** Toggle left-pin state of a column. */\n togglePinned(field: string): void {\n this.setPinned(field, !this.isPinned(field));\n }\n\n // ── Right pinning ─────────────────────────────────────────────────────────\n\n /** Reactive set of field names currently pinned to the right edge. */\n readonly pinnedRightColumns: Signal<Set<string>> = this._pinnedRightColumns.asReadonly();\n\n /** Return `true` when the given field is pinned to the right edge. */\n isPinnedRight(field: string): boolean {\n return this._pinnedRightColumns().has(field);\n }\n\n /** Pin or unpin a column to the right edge. Pinning right auto-unpins left. */\n setPinnedRight(field: string, pinned: boolean): void {\n this._pinnedRightColumns.update(set => {\n const next = new Set(set);\n if (pinned) next.add(field); else next.delete(field);\n return next;\n });\n if (pinned) this._pinnedColumns.update(s => { const n = new Set(s); n.delete(field); return n; });\n }\n\n /** Toggle right-pin state of a column. */\n togglePinnedRight(field: string): void {\n this.setPinnedRight(field, !this.isPinnedRight(field));\n }\n\n // ── Pagination ────────────────────────────────────────────────────────────\n\n /** Number of rows per page. `0` means all rows are shown (no pagination). */\n readonly pageSize: Signal<number> = this._pageSize.asReadonly();\n\n /** Current page number (1-based). */\n readonly currentPage: Signal<number> = this._currentPage.asReadonly();\n\n /** Set rows per page. Pass `0` to disable pagination. Resets to page 1. */\n setPageSize(size: number): void {\n this._pageSize.set(Math.max(0, size));\n this._currentPage.set(1);\n }\n\n /** Navigate to a specific page (1-based). Clamped to valid range by the grid. */\n setPage(page: number): void {\n this._currentPage.set(Math.max(1, page));\n }\n\n /**\n * Set the total number of rows available on the server.\n * When greater than zero the grid switches to **server-side pagination mode**:\n * - Rows in the data source are shown as-is (no local slicing).\n * - `totalPages` is derived from this value instead of the local row count.\n * - A `(pageChange)` event is emitted whenever the user navigates to a new page.\n *\n * Pass `0` to return to client-side pagination.\n */\n setTotalRows(count: number): void {\n this._totalRows.set(Math.max(0, count));\n }\n\n /**\n * Total server-side row count. `0` means client-side mode (grid slices locally).\n */\n readonly totalRows: Signal<number> = this._totalRows.asReadonly();\n\n // ── Aggregates ────────────────────────────────────────────────────────────\n\n /** Per-field aggregate overrides set via the column menu. */\n readonly aggregates: Signal<Record<string, 'sum' | 'avg' | 'min' | 'max' | 'count'>> = this._aggregates.asReadonly();\n\n /**\n * Set or clear the aggregate function for a column.\n * Pass `null` to remove the aggregate (hides the footer cell for that column).\n */\n setAggregate(field: string, fn: 'sum' | 'avg' | 'min' | 'max' | 'count' | null): void {\n this._aggregates.update(a => {\n const next = { ...a };\n if (fn === null) delete next[field];\n else next[field] = fn;\n return next;\n });\n }\n\n // ── Undo / redo history ────────────────────────────────────────────────────\n\n private readonly _history = signal<HistoryItem[]>([]);\n private readonly _historyPointer = signal<number>(-1);\n private static readonly MAX_HISTORY = 100;\n\n /** `true` when there is at least one edit that can be undone. */\n readonly canUndo = computed(() => this._historyPointer() >= 0);\n\n /** `true` when there is at least one edit that can be re-applied. */\n readonly canRedo = computed(() => this._historyPointer() < this._history().length - 1);\n\n /**\n * Record a committed cell edit in the history.\n * Calling this discards any redo entries that came after the current pointer.\n * Called automatically by the grid after every cell commit.\n */\n pushEdit(entry: HistoryEntry): void {\n this.pushHistoryItem(entry);\n }\n\n /** Record a multi-cell edit as one undo/redo step. */\n pushEditBatch(entries: HistoryEntry[]): void {\n if (entries.length === 0) return;\n this.pushHistoryItem(entries.length === 1 ? entries[0] : [...entries]);\n }\n\n private pushHistoryItem(item: HistoryItem): void {\n const pointer = this._historyPointer();\n const base = this._history().slice(0, pointer + 1);\n base.push(item);\n const trimmed = base.length > AgridControl.MAX_HISTORY\n ? base.slice(base.length - AgridControl.MAX_HISTORY)\n : base;\n this._history.set(trimmed);\n this._historyPointer.set(trimmed.length - 1);\n }\n\n /**\n * Move one step back in history and return the entry to reverse, or `null` if\n * already at the beginning. The caller is responsible for applying `oldValue`\n * back to the data source.\n */\n undo(): HistoryItem | null {\n const p = this._historyPointer();\n if (p < 0) return null;\n this._historyPointer.set(p - 1);\n return this._history()[p];\n }\n\n /**\n * Move one step forward in history and return the entry to re-apply, or `null`\n * if already at the end. The caller is responsible for applying `newValue` back\n * to the data source.\n */\n redo(): HistoryItem | null {\n const p = this._historyPointer();\n const h = this._history();\n if (p >= h.length - 1) return null;\n this._historyPointer.set(p + 1);\n return h[p + 1];\n }\n\n /** Clear the entire undo/redo history. */\n clearHistory(): void {\n this._history.set([]);\n this._historyPointer.set(-1);\n }\n\n /**\n * Reactive map of `field → pixel width`.\n * Only fields whose width was explicitly overridden are present; the grid falls\n * back to `ColDef.width` for fields not in this map.\n */\n readonly columnWidths: Signal<Record<string, number>> = this._columnWidths.asReadonly();\n\n /**\n * Reactive map of `field → ColumnFilter`.\n * Only fields with at least one active filter/sort condition are present.\n */\n readonly filters: Signal<Record<string, ColumnFilter>> = this._filters.asReadonly();\n\n // ── Column widths ──────────────────────────────────────────────────────────\n\n /**\n * Return the effective width for a column, falling back to `defaultWidth`\n * if no override exists.\n */\n getColumnWidth(field: string, defaultWidth: number): number {\n return this._columnWidths()[field] ?? defaultWidth;\n }\n\n /**\n * Set the width for a column. Enforces a minimum of 40 px.\n * Called by the grid when the user drags a resize handle.\n */\n setColumnWidth(field: string, width: number): void {\n this._columnWidths.update(w => ({ ...w, [field]: Math.max(40, width) }));\n }\n\n // ── Filters & sort ─────────────────────────────────────────────────────────\n\n /**\n * Return the current filter state for a field.\n * Returns a default (inactive) filter when no state is stored for the field.\n */\n getFilter(field: string): ColumnFilter {\n return this._filters()[field] ?? { text: '', selectedValues: null, sort: null };\n }\n\n /**\n * Set the free-text filter for a column.\n * An empty string removes the text filter for that column.\n */\n setTextFilter(field: string, text: string): void {\n this._filters.update(f => ({\n ...f,\n [field]: { ...this.getFilter(field), text },\n }));\n }\n\n /**\n * Set the value-picker selection for a column.\n * Pass `null` to show all values (clear the value filter).\n */\n setSelectedValues(field: string, values: string[] | null): void {\n this._filters.update(f => ({\n ...f,\n [field]: { ...this.getFilter(field), selectedValues: values },\n }));\n }\n\n /**\n * Set a column condition filter. Text columns support string operators while number/date\n * columns support comparison operators.\n * Pass `operator: null` (or an empty `operand`) to clear it. `operand2` is only used\n * by the `'between'` operator.\n */\n setRangeFilter(\n field: string,\n operator: FilterOperator | null,\n operand: string | null,\n operand2: string | null = null,\n ): void {\n this._filters.update(f => ({\n ...f,\n [field]: { ...this.getFilter(field), operator, operand, operand2 },\n }));\n }\n\n /** Ordered list of sorted field names, from highest to lowest priority. */\n readonly sortOrder: Signal<string[]> = this._sortOrder.asReadonly();\n\n /** Return the 1-based sort priority of a field, or `0` if it is not sorted. */\n getSortPriority(field: string): number {\n const idx = this._sortOrder().indexOf(field);\n return idx === -1 ? 0 : idx + 1;\n }\n\n /**\n * Set the sort direction for a column, clearing all other sorts.\n * Pass `null` to remove the sort entirely.\n * For multi-column sort use {@link addSort}.\n */\n setSort(field: string, sort: 'asc' | 'desc' | null): void {\n this._filters.update(f => {\n const next: Record<string, ColumnFilter> = {};\n for (const [k, v] of Object.entries(f)) {\n next[k] = k === field ? { ...v, sort } : { ...v, sort: null };\n }\n if (!next[field]) next[field] = { text: '', selectedValues: null, sort };\n return next;\n });\n this._sortOrder.set(sort ? [field] : []);\n }\n\n /**\n * Add a column to the multi-sort stack or update its direction.\n * If the column is already sorted, only its direction is updated (priority unchanged).\n * If not yet sorted, it is appended as the lowest-priority sort key.\n */\n addSort(field: string, sort: 'asc' | 'desc'): void {\n this._filters.update(f => ({\n ...f,\n [field]: { ...(f[field] ?? { text: '', selectedValues: null }), sort },\n }));\n this._sortOrder.update(order =>\n order.includes(field) ? order : [...order, field]\n );\n }\n\n /**\n * Remove all active filters and sort for a single column.\n */\n clearFilter(field: string): void {\n this._filters.update(f => {\n const next = { ...f };\n delete next[field];\n return next;\n });\n this._sortOrder.update(o => o.filter(f => f !== field));\n }\n\n /** Remove all active filters and sorts for every column, including the quick filter. */\n clearAllFilters(): void {\n this._filters.set({});\n this._sortOrder.set([]);\n this._quickFilter.set('');\n }\n\n /**\n * Return `true` when the given field has any active filter or sort.\n * Useful for showing a visual indicator on the column header.\n */\n hasActiveFilter(field: string): boolean {\n const f = this.getFilter(field);\n const hasRange = !!f.operator && f.operand != null && f.operand !== '';\n return !!(f.text || f.selectedValues !== null || f.sort || hasRange);\n }\n\n /** Return `true` when the quick filter or ANY column has an active filter or sort. */\n hasAnyActiveFilter(): boolean {\n return !!this._quickFilter() || Object.values(this._filters()).some(\n f => f.text || f.selectedValues !== null || f.sort\n || (!!f.operator && f.operand != null && f.operand !== '')\n );\n }\n\n // ── Serialization ──────────────────────────────────────────────────────────\n\n /**\n * Replace the live serializable state from a plain object.\n * Missing properties reset to their defaults, making a loaded snapshot deterministic.\n * Transient loading, readonly, auto-add, selection, and edit-history state are preserved.\n */\n loadState(state: Partial<AgridControlState>): void {\n this._columnWidths.set({ ...(state.columnWidths ?? {}) });\n this._filters.set({ ...(state.filters ?? {}) });\n this._quickFilter.set(state.quickFilter ?? '');\n this._allowRowReorder.set(state.allowRowReorder ?? false);\n this._groupByField.set(state.groupByField ?? null);\n this._hiddenColumns.set(new Set(state.hiddenColumns ?? []));\n this._columnOrder.set([...(state.columnOrder ?? [])]);\n this._pinnedColumns.set(new Set(state.pinnedColumns ?? []));\n this._pinnedRightColumns.set(new Set(state.pinnedRightColumns ?? []));\n this._pageSize.set(state.pageSize ?? 0);\n this._currentPage.set(state.currentPage ?? 1);\n this._totalRows.set(state.totalRows ?? 0);\n this._aggregates.set({ ...(state.aggregates ?? {}) });\n this._sortOrder.set([...(state.sortOrder ?? [])]);\n }\n\n /** Serialize current state to a plain object suitable for JSON storage. */\n toJSON(): AgridControlState {\n return {\n columnWidths: { ...this._columnWidths() },\n filters: { ...this._filters() },\n quickFilter: this._quickFilter() || undefined,\n allowRowReorder: this._allowRowReorder(),\n groupByField: this._groupByField() ?? undefined,\n hiddenColumns: [...this._hiddenColumns()],\n columnOrder: [...this._columnOrder()],\n pinnedColumns: [...this._pinnedColumns()],\n pinnedRightColumns: [...this._pinnedRightColumns()],\n pageSize: this._pageSize(),\n currentPage: this._currentPage(),\n totalRows: this._totalRows(),\n aggregates: { ...this._aggregates() },\n sortOrder: [...this._sortOrder()],\n };\n }\n\n /** Restore an `AgridControl` from a previously serialized state. */\n static fromJSON(state: Partial<AgridControlState>): AgridControl {\n return new AgridControl(state);\n }\n}\n\n/** @internal Bridge for deprecated writable signals on AgridProvider. */\nexport function ɵgetAgridControlRuntimeState(control: AgridControl): ɵAgridControlRuntimeState {\n return CONTROL_RUNTIME_STATE.get(control)!;\n}\n","import { Signal, computed, signal, WritableSignal } from '@angular/core';\nimport { AgridControl, AgridControlState, ɵgetAgridControlRuntimeState } from './agrid-control';\nimport { AgridDataSource } from './agrid-datasource';\nimport { AgridServerSideRowModel } from './agrid-server-side-row-model';\nimport { AgridLocaleTextOverrides } from './agrid-localization';\nimport {\n AGridOptions,\n AgridEnterEditAction,\n AgridField,\n AgridMenuBarItem,\n AgridPivotConfig,\n AgridTreeConfig,\n CellContextMenuItem,\n ColDef,\n DetailAction,\n GroupAction,\n HeaderGroup,\n} from './agrid.types';\n\n/** JSON-safe pivot subset used by persisted grid settings. */\nexport interface AgridPivotSettings {\n rowField: string;\n columnField: string;\n valueField: string;\n aggregate: 'sum' | 'avg' | 'min' | 'max' | 'count';\n}\n\n/**\n * Versioned, JSON-safe snapshot that can be stored in local storage or a backend.\n * Functions, datasource rows, selection, loading state, and edit history are intentionally absent.\n */\nexport interface AgridSettings {\n version: 1;\n control: AgridControlState;\n pivotConfig: AgridPivotSettings | null;\n}\n\n/** Configuration used to create an {@link AgridProvider}. */\nexport interface AgridProviderConfig<T extends object = any> extends Partial<AGridOptions> {\n /** Row data source. A new empty data source is created when omitted. */\n datasource?: AgridDataSource<T>;\n /**\n * Lazy block-based server-side row model. When supplied it becomes the provider datasource and\n * filtering, sorting, and quick filtering are included in block requests automatically.\n */\n serverSideRowModel?: AgridServerSideRowModel<T>;\n /** Stateful grid control. A default control is created when omitted. */\n control?: AgridControl;\n /** Initial column definitions in display order. */\n columns?: ColDef<T>[];\n /**\n * Derive a read-only client-side pivot table from the datasource.\n * The first release supports one row field, one column field, and one value field.\n * Enable `showSidebar` to let users change this configuration from the grid's Pivot tab.\n */\n pivotConfig?: AgridPivotConfig<T>;\n /** Labels used by columns with a matching `group` identifier. */\n headerGroups?: HeaderGroup[];\n /**\n * Render rows as a hierarchical tree. When set, rows are nested by the configured\n * parent/child accessors and an expand/collapse twisty is shown on `treeField`.\n *\n * Set `aggregateTreeNodes` in this configuration to display each aggregate column's\n * descendant-leaf rollup on expandable nodes. Tree mode is mutually exclusive with grouping\n * and pagination.\n */\n treeConfig?: AgridTreeConfig<T>;\n /** Row height in pixels. Must be fixed for CDK virtual scroll. @default 32 */\n rowHeight?: number;\n /** Minimum height of the grid host element (e.g. `'200px'`). */\n minHeight?: string;\n /** Maximum height of the grid host element (e.g. `'500px'`). */\n maxHeight?: string;\n /** Show a `+ Add row` placeholder at the bottom. */\n allowAddRows?: boolean;\n /** Automatically insert a blank row when navigating past the last real row. */\n autoAddRows?: boolean;\n /** Show a 24 px control column with a drag handle and right-click context menu. */\n showControlColumn?: boolean;\n /** Show row-marking checkboxes in a 48 px control column for clipboard inclusion. @default false */\n enableRowMarking?: boolean;\n /** Allow clicking column headers to mark complete columns. @default false */\n enableColumnMarking?: boolean;\n /** Show the sidebar panel. */\n showSidebar?: boolean;\n /** Automatically open the detail panel when a row is selected. */\n autoOpenDetail?: boolean;\n /**\n * Emit filter and sort changes for server processing instead of applying them locally.\n * The distinct-value picker is hidden unless the column supplies an explicit `values` list.\n * @default false\n */\n serverSideFiltering?: boolean;\n /** Delay before emitting server-side text filter changes. Set to `0` to disable. @default 300 */\n filterDebounceMs?: number;\n /**\n * Show the global quick-filter box above the grid. In client mode it filters rows whose\n * visible columns contain the text; in `serverSideFiltering` mode it emits `(quickFilterChange)`\n * instead of filtering locally. @default false\n */\n enableQuickFilter?: boolean;\n /**\n * Optional command bar rendered above the column headers. Buttons and dropdown items emit\n * their id through the grid's single `(menuBarAction)` output.\n */\n menuBarItems?: AgridMenuBarItem<T>[];\n /**\n * Sorting behavior: one active column, multiple columns, or disabled entirely.\n * @default 'multi'\n */\n sortOption?: 'single' | 'multi' | 'none';\n /**\n * Row selection mode.\n * - `'none'` — no selection (default)\n * - `'single'` — click to select/deselect\n * - `'multi'` — Ctrl+click toggles, Shift+click extends range, click+drag sweeps\n */\n rowSelection?: 'single' | 'multi' | 'none';\n /**\n * Behavior after pressing Enter while an inline cell editor is active.\n * - `'nothing'` — commit and keep the current cell selected\n * - `'nextColumn'` — commit and move to the next column in the same row\n * - `'nextRow'` — commit and move to the same column one row down\n * @default 'nextRow'\n */\n enterEditAction?: AgridEnterEditAction;\n /** Returns a short description string shown next to the group label. */\n groupDescription?: ((label: string) => string) | null;\n /** Actions shown in the group header's `⋮` menu. */\n groupActions?: GroupAction[];\n /**\n * Extra items appended to the cell right-click context menu.\n * Pass `null` entries to insert separator lines.\n */\n cellMenuItems?: (CellContextMenuItem<T> | null)[];\n /** Shade every other row slightly for easier reading. @default false */\n zebraStripes?: boolean;\n /**\n * Render only the scrollable columns near the horizontal viewport once the scrollable-column\n * count exceeds this threshold. Lower it to virtualize sooner, or set a very large value\n * (e.g. `Infinity`) to disable column virtualization entirely. @default 30\n */\n columnVirtualizationThreshold?: number;\n /** Show a color marker on cells changed through grid editing. @default false */\n showChangedCellIndicator?: boolean;\n /** Ask for confirmation before grid row-delete actions. @default false */\n confirmRowDelete?: boolean;\n /** Make the entire grid read-only. @default false */\n readonly?: boolean;\n\n /** Restrict editing to the sidebar editor instead of inline cells. */\n useSidebarEditor?: boolean;\n\n /** Show a loading overlay over the grid body. @default false */\n loading?: boolean;\n /** Message shown when the grid has no rows to display. */\n emptyText?: string;\n\n /**\n * Return one or more CSS class names applied to a whole data row, based on its data and index.\n * Complements the per-cell {@link ColDef.cellClass}.\n *\n * @example\n * ```ts\n * getRowClass: ({ row }) => row.status === 'overdue' ? 'row-danger' : ''\n * ```\n */\n getRowClass?: (params: { row: T; index: number }) => string;\n\n /**\n * Designate rows to pin to the top or bottom of the grid body. Pinned rows stay visible during\n * vertical scroll and are excluded from grouping and pagination, but remain fully interactive\n * (editable/selectable) because they keep their real data-source index.\n *\n * Return `'top'`, `'bottom'`, or `undefined` (a normal scrolling row).\n *\n * @example\n * ```ts\n * pinRow: row => row.isSummary ? 'bottom' : undefined\n * ```\n */\n pinRow?: (row: T, index: number) => 'top' | 'bottom' | undefined;\n\n /**\n * Enable master/detail rows: each flat data row, or each leaf row in tree mode, can expand to\n * reveal a detail panel rendered beneath it. Requires {@link detailRenderer}. Grouped mode is\n * not supported. @default false\n */\n masterDetail?: boolean;\n /**\n * Returns the HTML shown inside an expanded detail panel. Angular's built-in HTML sanitization\n * is applied automatically (same as {@link ColDef.cellRenderer}).\n *\n * @example\n * ```ts\n * detailRenderer: ({ row }) => `<div class=\"detail\">${row.notes}</div>`\n * ```\n */\n detailRenderer?: (params: { row: T }) => string;\n /** Column displayed as a multiline editable field beneath the custom detail renderer. */\n detailColumnField?: AgridField<T>;\n /** Optional text-template buttons shown above the editable master/detail textarea. */\n detailActions?: DetailAction<T>[];\n /** Fixed height in pixels of an expanded detail panel row. @default 200 */\n detailRowHeight?: number;\n\n /** this is the id of the grid its stored in the provider the grid will read it as signal */\n gridId?:string;\n\n /** Hides the grids status bar if set to true. @default false */\n hideGridStatusBar?:boolean;\n\n /** Enable Menubuttons for csv and xsls export @default false */\n enableExportButtons?:boolean;\n}\n\n/**\n * Bundles a grid's data source, control state, columns, and display options.\n *\n * Create one provider per independent grid instance. A provider may be selected\n * from an array when a component renders multiple grids.\n */\n/**\n * Live export hooks installed by the rendered grid component so the provider can export the\n * grid's current filtered/visible projection without the caller holding a component reference.\n * @internal\n */\nexport interface AgridExportBridge {\n csv: (filename: string) => void;\n xlsx: (filename: string) => void;\n}\n\nexport class AgridProvider<T extends object = any> {\n /** Mutable row data consumed by the grid. */\n datasource: AgridDataSource<T>;\n /** Lazy server-side model, or `null` for the regular client-side datasource. */\n serverSideRowModel: AgridServerSideRowModel<T> | null;\n /** Runtime UI state and imperative grid controls. */\n control: AgridControl;\n /** Reactive column definitions in display order. */\n readonly columns: WritableSignal<ColDef<T>[]>;\n private readonly _pivotConfig = signal<AgridPivotConfig<T> | null>(null);\n /**\n * Client-side pivot configuration, or `null` for the normal row view.\n * Assigning a new configuration reactively rebuilds the derived pivot rows and columns.\n */\n get pivotConfig(): AgridPivotConfig<T> | null {\n return this._pivotConfig();\n }\n set pivotConfig(config: AgridPivotConfig<T> | null) {\n this._pivotConfig.set(config);\n }\n /** Header-group labels referenced by column definitions. */\n headerGroups: HeaderGroup[];\n /** Tree configuration, or `null` when the grid is not in tree mode. */\n treeConfig: AgridTreeConfig<T> | null;\n /** Shared grid options such as locale. */\n options: AGridOptions;\n\n private readonly _localizations = new Map<string, AgridLocaleTextOverrides>();\n private exportBridge: AgridExportBridge | null = null;\n private readonly _visibleRows = signal<readonly T[] | null>(null);\n\n /**\n * The grid's currently filtered and sorted rows, as published by the rendered grid component.\n * Falls back to every datasource row when no grid is attached. Link a chart to this signal to\n * keep it in sync with the grid's filters and sorting.\n */\n readonly visibleRows: Signal<readonly T[]> = computed(\n () => this._visibleRows() ?? this.datasource.rows(),\n );\n\n /**\n * @internal Published by the rendered grid whenever its filtered/sorted projection changes.\n * Pass `null` on teardown so {@link visibleRows} falls back to the raw datasource. The grid works\n * in terms of record rows; the public {@link visibleRows} re-types them as `T`.\n */\n ɵsetVisibleRows(rows: readonly Record<string, unknown>[] | null): void {\n this._visibleRows.set(rows as readonly T[] | null);\n }\n\n /** Read-only view of registered per-locale text overrides. Used by the grid to resolve locale text. */\n get localizations(): ReadonlyMap<string, AgridLocaleTextOverrides> {\n return this._localizations;\n }\n\n /**\n * Register locale-specific label overrides. Call multiple times for multiple locales.\n * When `locale` is `'auto'`, the grid matches the browser language against registered locales\n * (exact match first, then primary-language match, e.g. `'fr'` matches a browser locale of `'fr-FR'`).\n *\n * @example\n * provider.addLocalization('fr-FR', { addRow: 'Ajouter une ligne', noRows: 'Aucune donnée' });\n */\n addLocalization(locale: string, overrides: AgridLocaleTextOverrides): this {\n this._localizations.set(locale, overrides);\n return this;\n }\n\n /** Fixed virtual-scroll row height in pixels. */\n rowHeight: number;\n /** Minimum CSS height of the grid host. */\n minHeight?: string;\n /** Maximum CSS height of the grid host. */\n maxHeight?: string;\n /** Whether the add-row placeholder is shown. */\n allowAddRows: boolean;\n /** Whether the control column is rendered. */\n showControlColumn: boolean;\n /** Whether rows can be marked for inclusion in clipboard copies. */\n enableRowMarking: boolean;\n /** Whether complete columns can be marked from their headers. */\n enableColumnMarking: boolean;\n /** Whether the sidebar is available. */\n showSidebar: boolean;\n /** Whether selecting a row automatically opens its detail panel. */\n autoOpenDetail: boolean;\n /** Whether filter and sort operations are delegated to the host. */\n serverSideFiltering: boolean;\n /** Delay before server-side filter events are emitted. */\n filterDebounceMs: number;\n /** Whether the global quick-filter box is shown above the grid. */\n enableQuickFilter: boolean;\n /** Commands rendered in the optional menu bar above the column headers. */\n menuBarItems: AgridMenuBarItem<T>[];\n /** Enabled sorting mode. */\n sortOption: 'single' | 'multi' | 'none';\n /** @deprecated Use `control.autoAddRows` and `control.setAutoAddRows()` instead. */\n readonly autoAddRows: WritableSignal<boolean>;\n /** Enabled row-selection mode. */\n rowSelection: 'single' | 'multi' | 'none';\n /** Behavior after pressing Enter while an inline cell editor is active. */\n enterEditAction: AgridEnterEditAction;\n /** Optional description shown beside each group heading. */\n groupDescription: ((label: string) => string) | null;\n /** Actions available from group headers. */\n groupActions: GroupAction[];\n /** Additional cell context-menu entries. */\n cellMenuItems: (CellContextMenuItem<T> | null)[];\n /** Whether alternating data rows receive stripe styling. */\n zebraStripes: boolean;\n /** Scrollable-column count above which column virtualization activates. */\n columnVirtualizationThreshold: number;\n /** Whether committed cell changes receive a visual marker. */\n showChangedCellIndicator: boolean;\n /** Whether grid row-delete actions require in-row confirmation. */\n confirmRowDelete: boolean;\n /** Optional empty-state text override. */\n emptyText?: string;\n /** Whether edits are restricted to the sidebar editor. */\n useSidebarEditor: boolean;\n\n /** Optional callback returning CSS classes for a whole data row. */\n getRowClass?: (params: { row: T; index: number }) => string;\n /** Optional callback designating rows pinned to the top or bottom of the body. */\n pinRow?: (row: T, index: number) => 'top' | 'bottom' | undefined;\n /** Whether master/detail expandable detail rows are enabled. */\n masterDetail: boolean;\n /** Returns the sanitized HTML rendered inside an expanded detail panel. */\n detailRenderer?: (params: { row: T }) => string;\n /** Column displayed as a multiline field inside expanded detail panels. */\n detailColumnField?: AgridField<T>;\n /** Text-template buttons shown above the editable master/detail textarea. */\n detailActions: DetailAction<T>[];\n /** Fixed height in pixels of an expanded detail panel row. */\n detailRowHeight: number;\n\n /** its used to save the config */\n gridId?:string;\n\n /** Hides the summary status bar */\n hideGridStatusBar?:boolean;\n\n /** Enables export Menu if true */\n enableExportButtons?: boolean;\n\n /** @deprecated Use `control.loading` and `control.setLoading()` instead. */\n readonly loading: WritableSignal<boolean>;\n /** @deprecated Use `control.readonly` and `control.setReadonly()` instead. */\n readonly readonlyGrid: WritableSignal<boolean>;\n\n /** Creates a provider from the supplied data, state, columns, and display options. */\n constructor(config: AgridProviderConfig<T> = {}) {\n if (config.serverSideRowModel && (config.treeConfig || config.pivotConfig)) {\n throw new Error('AgridServerSideRowModel does not support treeConfig or pivotConfig.');\n }\n if (config.treeConfig && config.pivotConfig) {\n throw new Error('treeConfig and pivotConfig are mutually exclusive.');\n }\n this.options = { locale: config.locale ?? 'auto' };\n this.serverSideRowModel = config.serverSideRowModel ?? null;\n this.datasource = this.serverSideRowModel ?? config.datasource ?? new AgridDataSource<T>([]);\n this.control = config.control ?? new AgridControl({ allowRowReorder: true });\n const runtimeState = ɵgetAgridControlRuntimeState(this.control);\n this.columns = signal(config.columns ?? []);\n this.pivotConfig = config.pivotConfig ?? null;\n this.headerGroups = config.headerGroups ?? [];\n this.treeConfig = config.treeConfig ?? null;\n\n this.rowHeight = config.rowHeight ?? 32;\n this.minHeight = config.minHeight;\n this.maxHeight = config.maxHeight;\n this.allowAddRows = config.allowAddRows ?? false;\n if (config.autoAddRows !== undefined) this.control.setAutoAddRows(config.autoAddRows);\n this.autoAddRows = runtimeState.autoAddRows;\n this.showControlColumn = config.showControlColumn ?? false;\n this.enableRowMarking = config.enableRowMarking ?? false;\n this.enableColumnMarking = config.enableColumnMarking ?? false;\n this.showSidebar = config.showSidebar ?? false;\n this.autoOpenDetail = config.autoOpenDetail ?? false;\n this.serverSideFiltering = this.serverSideRowModel ? true : config.serverSideFiltering ?? false;\n this.filterDebounceMs = Math.max(0, config.filterDebounceMs ?? 300);\n this.enableQuickFilter = config.enableQuickFilter ?? false;\n this.menuBarItems = config.menuBarItems ?? [];\n this.sortOption = config.sortOption ?? 'multi';\n this.rowSelection = config.rowSelection ?? 'none';\n this.enterEditAction = config.enterEditAction ?? 'nextRow';\n this.groupDescription = config.groupDescription ?? null;\n this.groupActions = config.groupActions ?? [];\n this.cellMenuItems = config.cellMenuItems ?? [];\n this.zebraStripes = config.zebraStripes ?? false;\n this.columnVirtualizationThreshold = config.columnVirtualizationThreshold ?? 30;\n this.showChangedCellIndicator = config.showChangedCellIndicator ?? false;\n this.confirmRowDelete = config.confirmRowDelete ?? false;\n this.emptyText = config.emptyText;\n if (config.loading !== undefined) this.control.setLoading(config.loading);\n if (config.readonly !== undefined) this.control.setReadonly(config.readonly);\n this.loading = runtimeState.loading;\n this.readonlyGrid = runtimeState.readonly;\n this.useSidebarEditor = config.useSidebarEditor ?? false;\n this.getRowClass = config.getRowClass;\n this.pinRow = config.pinRow;\n this.masterDetail = config.masterDetail ?? false;\n this.detailRenderer = config.detailRenderer;\n this.detailColumnField = config.detailColumnField;\n this.detailActions = config.detailActions ?? [];\n this.detailRowHeight = config.detailRowHeight ?? 200;\n this.gridId = config.gridId;\n this.hideGridStatusBar = config.hideGridStatusBar;\n this.enableExportButtons = config.enableExportButtons;\n }\n\n /** Returns the current reactive row array. */\n getGridData(): T[] {\n return this.datasource.rows();\n }\n\n /**\n * Return a detached, JSON-safe snapshot of persistent grid and pivot settings.\n * Custom pivot aggregate functions cannot be serialized and produce an explicit error.\n */\n saveSettings(): AgridSettings {\n const pivot = this.pivotConfig;\n const aggregate = pivot?.aggregate;\n if (typeof aggregate === 'function') {\n throw new Error('Custom pivot aggregate functions cannot be saved as JSON settings.');\n }\n return {\n version: 1,\n control: this.control.toJSON(),\n pivotConfig: pivot\n ? {\n rowField: pivot.rowField,\n columnField: pivot.columnField,\n valueField: pivot.valueField,\n aggregate: aggregate ?? 'sum',\n }\n : null,\n };\n }\n\n /**\n * Apply a previously saved snapshot to this live provider.\n * Existing component instances update immediately because both control and pivot state are\n * signal-backed. Unknown versions and pivot fields fail early with actionable errors.\n */\n loadSettings(settings: AgridSettings): void {\n if (settings.version !== 1) {\n throw new Error(`Unsupported aGrid settings version: ${settings.version}`);\n }\n if (settings.pivotConfig) {\n if (this.serverSideRowModel || this.treeConfig) {\n throw new Error('Saved pivot settings cannot be loaded with treeConfig or a server-side row model.');\n }\n const fields = new Set<string>(this.columns().map(column => column.field as string));\n const pivotFields = [\n settings.pivotConfig.rowField,\n settings.pivotConfig.columnField,\n settings.pivotConfig.valueField,\n ];\n if (pivotFields.some(field => !fields.has(field))) {\n throw new Error('Saved pivot settings reference a column that is not configured.');\n }\n }\n this.control.loadState(settings.control);\n this.pivotConfig = settings.pivotConfig as AgridPivotConfig<T> | null;\n }\n\n /**\n * Download the grid's current filtered, visible rows as a CSV file.\n *\n * Uses display values (value-list labels, formatters) and respects column visibility; group\n * header rows are excluded. Requires a rendered `<agrid>` bound to this provider — when no grid\n * is mounted (e.g. before first render) this is a no-op.\n *\n * @param filename Output filename, defaults to `'export.csv'`.\n */\n exportCsv(filename = 'export.csv'): void {\n this.exportBridge?.csv(filename);\n }\n\n /**\n * Download the grid's current filtered, visible rows as an `.xlsx` workbook.\n *\n * Numbers and dates are written as native, sortable/summable cells; value-list columns and\n * custom formatters fall back to display text. Requires a rendered `<agrid>` bound to this\n * provider — a no-op when no grid is mounted. Generated with zero third-party dependencies.\n *\n * @param filename Output filename, defaults to `'export.xlsx'`.\n */\n exportXlsx(filename = 'export.xlsx'): void {\n this.exportBridge?.xlsx(filename);\n }\n\n /**\n * @internal Installed by the rendered `<agrid>` so {@link exportCsv}/{@link exportXlsx} reach the\n * live projection. Pass `null` on teardown.\n */\n ɵattachExport(bridge: AgridExportBridge | null): void {\n this.exportBridge = bridge;\n }\n}\n","import { AgridAggregate, AgridPivotConfig, ColDef } from './agrid.types';\nimport { getDisplayForField } from './agrid.utils';\n\n/** Derived rows and columns consumed by the normal grid pipeline in pivot mode. @internal */\nexport interface AgridPivotResult {\n rows: Record<string, unknown>[];\n columns: ColDef[];\n}\n\n/** Apply one supported aggregate to the raw values in a pivot bucket. */\nfunction aggregatePivotValues(values: unknown[], aggregate: AgridAggregate): unknown {\n if (typeof aggregate === 'function') return aggregate(values);\n if (aggregate === 'count') {\n return values.reduce<number>(\n (count, value) => count + (value != null && value !== '' ? 1 : 0),\n 0,\n );\n }\n\n const numeric = values\n .map(value => Number(value))\n .filter(value => !Number.isNaN(value));\n if (aggregate === 'sum') return numeric.reduce((sum, value) => sum + value, 0);\n if (numeric.length === 0) return null;\n if (aggregate === 'avg') {\n return numeric.reduce((sum, value) => sum + value, 0) / numeric.length;\n }\n let result = numeric[0];\n for (let index = 1; index < numeric.length; index++) {\n result = aggregate === 'min'\n ? Math.min(result, numeric[index])\n : Math.max(result, numeric[index]);\n }\n return result;\n}\n\n/**\n * Convert flat datasource rows into a read-only cross-tabulation.\n *\n * Distinct row and column values retain their raw identity while their configured column\n * formatters supply labels. Generated field names are private implementation keys, avoiding\n * collisions with source fields. Empty intersections are represented by `null`.\n */\nexport function buildPivotResult<T extends object>(\n rows: T[],\n sourceColumns: ColDef<T>[],\n config: AgridPivotConfig<T>,\n locale?: string,\n): AgridPivotResult {\n // ColDef is deliberately row-type invariant because callback parameters contain T. Pivoting\n // reads only display metadata, so normalize definitions to the renderer's untyped view here.\n const normalizedColumns = sourceColumns as unknown as ColDef[];\n const columnMap = new Map(normalizedColumns.map(column => [column.field, column]));\n const rowColumn = columnMap.get(config.rowField);\n const pivotColumn = columnMap.get(config.columnField);\n const valueColumn = columnMap.get(config.valueField);\n if (!rowColumn || !pivotColumn || !valueColumn) {\n throw new Error('Pivot rowField, columnField, and valueField must reference configured columns.');\n }\n\n const buckets = new Map<unknown, Map<unknown, unknown[]>>();\n const rowLabels = new Map<unknown, string>();\n const columnLabels = new Map<unknown, string>();\n for (const row of rows) {\n const record = row as Record<string, unknown>;\n const rowValue = record[config.rowField];\n const columnValue = record[config.columnField];\n rowLabels.set(rowValue, getDisplayForField(rowColumn, rowValue, locale));\n columnLabels.set(columnValue, getDisplayForField(pivotColumn, columnValue, locale));\n let columns = buckets.get(rowValue);\n if (!columns) {\n columns = new Map();\n buckets.set(rowValue, columns);\n }\n const values = columns.get(columnValue);\n if (values) values.push(record[config.valueField]);\n else columns.set(columnValue, [record[config.valueField]]);\n }\n\n const byLabel = (labels: Map<unknown, string>) =>\n ([a]: [unknown, unknown], [b]: [unknown, unknown]) =>\n (labels.get(a) ?? '').localeCompare(labels.get(b) ?? '', locale, { sensitivity: 'base' });\n const pivotValues = [...columnLabels.entries()].sort(byLabel(columnLabels)).map(([value]) => value);\n const rowValues = [...rowLabels.entries()].sort(byLabel(rowLabels)).map(([value]) => value);\n const aggregate = config.aggregate ?? 'sum';\n\n const columns: ColDef[] = [\n { ...rowColumn, editable: false, aggregate: undefined },\n ...pivotValues.map((value, index): ColDef => ({\n field: `__agrid_pivot_${index}`,\n header: columnLabels.get(value) ?? String(value ?? ''),\n type: valueColumn.type,\n width: valueColumn.width,\n // A count describes bucket cardinality rather than the source value's unit (for example\n // dollars), so carrying a currency/percentage formatter onto it would be misleading.\n formatter: aggregate === 'count'\n ? undefined\n : valueColumn.formatter as ((value: any) => string) | undefined,\n editable: false,\n })),\n ];\n\n const pivotRows = rowValues.map(rowValue => {\n const result: Record<string, unknown> = { [config.rowField]: rowValue };\n pivotValues.forEach((columnValue, index) => {\n const values = buckets.get(rowValue)?.get(columnValue);\n result[`__agrid_pivot_${index}`] = values\n ? aggregatePivotValues(values, aggregate)\n : null;\n });\n return result;\n });\n\n return { rows: pivotRows, columns };\n}\n","import { Signal, signal } from '@angular/core';\nimport { AgridControl, ColumnFilter } from './agrid-control';\nimport { AgridDataSource } from './agrid-datasource';\n\nconst SERVER_ROW_PLACEHOLDER = Symbol('agrid-server-row-placeholder');\n\ntype ServerRowPlaceholder = { readonly [SERVER_ROW_PLACEHOLDER]: true };\nconst PLACEHOLDER: ServerRowPlaceholder = { [SERVER_ROW_PLACEHOLDER]: true };\n\n/** Sort entry sent to a server-side row datasource. */\nexport interface AgridServerSideSort {\n field: string;\n direction: 'asc' | 'desc';\n}\n\n/** Immutable request for one half-open row block (`startRow <= row < endRow`). */\nexport interface AgridServerSideRequest {\n startRow: number;\n endRow: number;\n filters: Readonly<Record<string, ColumnFilter>>;\n sort: readonly AgridServerSideSort[];\n quickFilter: string;\n}\n\n/** Rows returned by a server-side datasource. Supply `rowCount` when the total is known. */\nexport interface AgridServerSideResult<T extends object> {\n rows: T[];\n rowCount?: number;\n}\n\n/** Fetches blocks for {@link AgridServerSideRowModel}. */\nexport interface AgridServerSideDatasource<T extends object> {\n getRows(request: AgridServerSideRequest): Promise<AgridServerSideResult<T>>;\n}\n\n/** Configuration for the lazy, block-cached server-side row model. */\nexport interface AgridServerSideRowModelConfig<T extends object> {\n datasource: AgridServerSideDatasource<T>;\n /** Number of rows requested per block. @default 100 */\n blockSize?: number;\n /** Maximum loaded blocks retained in memory. @default 10 */\n maxBlocksInCache?: number;\n /** Known initial total. Omit when the server determines it from the first request. */\n initialRowCount?: number;\n}\n\ninterface ServerQuery {\n filters: Record<string, ColumnFilter>;\n sort: AgridServerSideSort[];\n quickFilter: string;\n}\n\n/**\n * Sparse datasource that lazy-loads row blocks while retaining global datasource indices.\n * Attach it to an `AgridProvider` through `serverSideRowModel`.\n */\nexport class AgridServerSideRowModel<T extends object = any> extends AgridDataSource<T> {\n readonly blockSize: number;\n readonly maxBlocksInCache: number;\n\n private readonly remote: AgridServerSideDatasource<T>;\n private slots: (T | ServerRowPlaceholder)[] = [];\n private readonly loadedBlocks = new Map<number, number>();\n private readonly loadingBlocks = new Set<number>();\n private query: ServerQuery = { filters: {}, sort: [], quickFilter: '' };\n private queryKey = '';\n private generation = 0;\n private accessSequence = 0;\n private knownRowCount = false;\n private readonly _loading = signal(false);\n private readonly _error = signal<unknown | null>(null);\n private readonly _rowCount = signal(0);\n\n /** Whether at least one block request is in flight. */\n readonly loading: Signal<boolean> = this._loading.asReadonly();\n /** Most recent load error, cleared by the next successful request or refresh. */\n readonly error: Signal<unknown | null> = this._error.asReadonly();\n /** Current logical row count represented by the virtual scrollbar. */\n readonly rowCount: Signal<number> = this._rowCount.asReadonly();\n\n constructor(config: AgridServerSideRowModelConfig<T>) {\n super();\n this.remote = config.datasource;\n this.blockSize = Math.max(1, Math.floor(config.blockSize ?? 100));\n this.maxBlocksInCache = Math.max(1, Math.floor(config.maxBlocksInCache ?? 10));\n const initial = config.initialRowCount;\n this.knownRowCount = initial !== undefined;\n this.replaceSlots(this.createPlaceholders(Math.max(0, initial ?? this.blockSize)));\n }\n\n /** Update server query state. A changed query invalidates cached blocks and starts at row zero. */\n setQuery(control: AgridControl | null, sortFields: readonly string[]): boolean {\n const filters = cloneFilters(control?.filters() ?? {});\n const sort = sortFields.flatMap(field => {\n const direction = filters[field]?.sort;\n return direction ? [{ field, direction }] : [];\n });\n const quickFilter = control?.quickFilter() ?? '';\n const key = JSON.stringify({ filters, sort, quickFilter });\n if (key === this.queryKey) return false;\n this.queryKey = key;\n this.query = { filters, sort, quickFilter };\n this.reset();\n return true;\n }\n\n /** Invalidate all cached blocks while preserving a known total row count. */\n refresh(): void {\n this.reset();\n }\n\n /** Ensure every block intersecting the requested half-open range is loaded. */\n ensureRange(startRow: number, endRow: number): void {\n const count = this.slots.length;\n if (!count) return;\n const start = Math.max(0, Math.min(Math.floor(startRow), count - 1));\n const end = Math.max(start + 1, Math.min(Math.ceil(endRow), count));\n const firstBlock = Math.floor(start / this.blockSize);\n const lastBlock = Math.floor((end - 1) / this.blockSize);\n for (let block = firstBlock; block <= lastBlock; block++) void this.loadBlock(block);\n }\n\n /** Whether a logical datasource row has not been loaded yet. */\n isPlaceholder(index: number): boolean {\n return isServerRowPlaceholder(this.slots[index]);\n }\n\n private reset(): void {\n this.generation++;\n this.loadedBlocks.clear();\n this.loadingBlocks.clear();\n this._loading.set(false);\n this._error.set(null);\n const length = this.knownRowCount ? this._rowCount() : this.blockSize;\n this.replaceSlots(this.createPlaceholders(length));\n }\n\n private async loadBlock(block: number): Promise<void> {\n if (this.loadedBlocks.has(block) || this.loadingBlocks.has(block)) {\n if (this.loadedBlocks.has(block)) this.loadedBlocks.set(block, ++this.accessSequence);\n return;\n }\n const startRow = block * this.blockSize;\n if (startRow >= this.slots.length) return;\n const endRow = Math.min(startRow + this.blockSize, this.slots.length);\n const generation = this.generation;\n this.loadingBlocks.add(block);\n this._loading.set(true);\n try {\n const result = await this.remote.getRows({\n startRow,\n endRow,\n filters: this.query.filters,\n sort: this.query.sort,\n quickFilter: this.query.quickFilter,\n });\n if (generation !== this.generation) return;\n this.applyBlock(block, startRow, result);\n this._error.set(null);\n } catch (error) {\n if (generation === this.generation) this._error.set(error);\n } finally {\n if (generation === this.generation) {\n this.loadingBlocks.delete(block);\n this._loading.set(this.loadingBlocks.size > 0);\n }\n }\n }\n\n private applyBlock(block: number, startRow: number, result: AgridServerSideResult<T>): void {\n if (result.rowCount !== undefined) {\n this.knownRowCount = true;\n this.resize(Math.max(0, Math.floor(result.rowCount)));\n } else if (result.rows.length < this.blockSize) {\n this.knownRowCount = true;\n this.resize(startRow + result.rows.length);\n } else if (!this.knownRowCount && startRow + result.rows.length >= this.slots.length) {\n this.resize(this.slots.length + this.blockSize);\n }\n\n const next = [...this.slots];\n for (let index = 0; index < result.rows.length; index++) {\n const target = startRow + index;\n if (target >= next.length) break;\n next[target] = result.rows[index];\n }\n this.loadedBlocks.set(block, ++this.accessSequence);\n this.evictBlocks(block, next);\n this.replaceSlots(next);\n }\n\n private evictBlocks(activeBlock: number, slots: (T | ServerRowPlaceholder)[]): void {\n while (this.loadedBlocks.size > this.maxBlocksInCache) {\n const candidate = [...this.loadedBlocks]\n .filter(([block]) => block !== activeBlock)\n .sort((left, right) => left[1] - right[1])[0];\n if (!candidate) return;\n const [block] = candidate;\n this.loadedBlocks.delete(block);\n const start = block * this.blockSize;\n const end = Math.min(start + this.blockSize, slots.length);\n for (let index = start; index < end; index++) slots[index] = placeholder();\n }\n }\n\n private resize(length: number): void {\n if (length === this.slots.length) return;\n if (length < this.slots.length) this.slots = this.slots.slice(0, length);\n else this.slots = [...this.slots, ...this.createPlaceholders(length - this.slots.length)];\n this._rowCount.set(length);\n }\n\n private replaceSlots(slots: (T | ServerRowPlaceholder)[]): void {\n this.slots = slots;\n this._rowCount.set(slots.length);\n this.setRows(slots as T[]);\n }\n\n private createPlaceholders(length: number): ServerRowPlaceholder[] {\n return Array.from({ length }, () => placeholder());\n }\n}\n\n/** @internal */\nexport function isServerRowPlaceholder(value: unknown): value is ServerRowPlaceholder {\n return !!value && typeof value === 'object' && SERVER_ROW_PLACEHOLDER in value;\n}\n\nfunction placeholder(): ServerRowPlaceholder {\n return PLACEHOLDER;\n}\n\nfunction cloneFilters(filters: Record<string, ColumnFilter>): Record<string, ColumnFilter> {\n return Object.fromEntries(Object.entries(filters).map(([field, filter]) => [field, {\n ...filter,\n selectedValues: filter.selectedValues ? [...filter.selectedValues] : null,\n }]));\n}\n","import { Signal, computed } from '@angular/core';\nimport { AgridControl, ColumnFilter } from '../agrid-control';\nimport { AgridDataSource } from '../agrid-datasource';\nimport { AgridServerSideRowModel } from '../agrid-server-side-row-model';\nimport { AgridTreeConfig, ColDef, GridItem } from '../agrid.types';\nimport {\n applyQuickFilter,\n applySortToIndices,\n applyTextAndValueFilters,\n buildGroupedItems,\n buildPathTreeItems,\n buildTreeItems,\n computeAggregates,\n isPathTreeConfig,\n} from '../agrid.utils';\n\n/** Expanded labels associated with the current grouping field. @internal */\nexport interface AgridGroupExpansionState {\n field: string | null;\n labels: Set<string>;\n}\n\n/** Reactive inputs required by {@link AgridProjectionModel}. @internal */\nexport interface AgridProjectionOptions {\n dataSource: Signal<AgridDataSource>;\n control: Signal<AgridControl | null>;\n colDefs: Signal<ColDef[]>;\n visibleColDefs: Signal<ColDef[]>;\n locale: Signal<string>;\n serverSideFiltering: Signal<boolean>;\n sortOption: Signal<'single' | 'multi' | 'none'>;\n allowAddRows: Signal<boolean>;\n autoAddRows: Signal<boolean>;\n expandedGroups: Signal<AgridGroupExpansionState>;\n /** Tree configuration, or `null` when the grid is not in tree mode. */\n treeConfig: Signal<AgridTreeConfig | null>;\n /** Whether rows/columns are already reduced into a derived pivot table. */\n pivotMode?: Signal<boolean>;\n /** Expanded node ids when tree mode is active. */\n expandedTreeIds: Signal<Set<string | number>>;\n /** Host callback designating rows pinned to the top/bottom, or `undefined` when not pinning. */\n pinRow?: Signal<((row: Record<string, unknown>, index: number) => 'top' | 'bottom' | undefined) | undefined>;\n /** Whether master/detail expandable rows are enabled. */\n masterDetail?: Signal<boolean>;\n /** Original indices of rows whose detail panel is currently expanded. */\n expandedDetailIds?: Signal<Set<number>>;\n}\n\n/**\n * Computes the visible row projection and aggregate state from grid data and controls.\n * @internal\n */\nexport class AgridProjectionModel {\n constructor(private readonly opts: AgridProjectionOptions) {}\n\n /** Filtered and sorted source indices before pagination or grouping. */\n readonly filteredSortedIndices = computed<number[]>(() => {\n const rows = this.opts.dataSource().rows();\n const control = this.opts.control();\n const colMap = this.columnMap();\n let indices = rows.map((_, index) => index);\n\n if (!control || this.opts.serverSideFiltering()) return indices;\n\n const filters = control.filters();\n indices = applyTextAndValueFilters(\n rows,\n indices,\n filters,\n colMap,\n this.opts.locale(),\n );\n const quick = control.quickFilter();\n if (quick) {\n indices = applyQuickFilter(rows, indices, quick, this.opts.visibleColDefs(), this.opts.locale());\n }\n if (control.groupByField() && !this.opts.pivotMode?.()) return indices;\n\n const sortEntries = this.sortEntries(filters);\n return sortEntries.length\n ? applySortToIndices(rows, indices, sortEntries, colMap, this.opts.locale())\n : indices;\n });\n\n /** Total filtered row count, unaffected by client-side pagination. */\n readonly filteredRowCount = computed(() => this.filteredSortedIndices().length);\n\n /** Whether row pinning is active: a `pinRow` callback is supplied and not in tree mode. */\n private readonly pinningActive = computed(() =>\n !(this.opts.dataSource() instanceof AgridServerSideRowModel)\n && !!this.opts.pinRow?.()\n && !this.opts.treeConfig()\n );\n\n /**\n * Partitions the filtered+sorted indices into top-pinned, bottom-pinned, and a body set.\n * Pinned rows keep their real source index, so editing/selection over them is unchanged.\n */\n private readonly partitionPinned = computed<{ top: number[]; bottom: number[]; bodySet: Set<number> }>(() => {\n if (!this.pinningActive()) return { top: [], bottom: [], bodySet: new Set<number>() };\n const rows = this.opts.dataSource().rows();\n const pinRow = this.opts.pinRow!()!;\n const top: number[] = [];\n const bottom: number[] = [];\n const bodySet = new Set<number>();\n for (const index of this.filteredSortedIndices()) {\n const where = pinRow(rows[index], index);\n if (where === 'top') top.push(index);\n else if (where === 'bottom') bottom.push(index);\n else bodySet.add(index);\n }\n return { top, bottom, bodySet };\n });\n\n /** Top-pinned rows as data-row items, in filtered+sorted order. */\n readonly pinnedTopItems = computed<{ row: Record<string, unknown>; originalIndex: number }[]>(() => {\n const rows = this.opts.dataSource().rows();\n return this.partitionPinned().top.map(originalIndex => ({ row: rows[originalIndex], originalIndex }));\n });\n\n /** Bottom-pinned rows as data-row items, in filtered+sorted order. */\n readonly pinnedBottomItems = computed<{ row: Record<string, unknown>; originalIndex: number }[]>(() => {\n const rows = this.opts.dataSource().rows();\n return this.partitionPinned().bottom.map(originalIndex => ({ row: rows[originalIndex], originalIndex }));\n });\n\n /** All source indices in active sort order, ignoring filters. Used for tree ancestor ordering. */\n private readonly allSortedIndices = computed<number[]>(() => {\n const rows = this.opts.dataSource().rows();\n const control = this.opts.control();\n const indices = rows.map((_, index) => index);\n if (!control || this.opts.serverSideFiltering()) return indices;\n const sortEntries = this.sortEntries(control.filters());\n return sortEntries.length\n ? applySortToIndices(rows, indices, sortEntries, this.columnMap(), this.opts.locale())\n : indices;\n });\n\n /** Total page count using server total when server-side pagination is active. */\n readonly totalPages = computed(() => {\n const control = this.opts.control();\n const pageSize = control?.pageSize() ?? 0;\n if (pageSize <= 0) return 1;\n const count = (control?.totalRows() ?? 0) > 0\n ? control!.totalRows()\n : this.filteredSortedIndices().length;\n return Math.max(1, Math.ceil(count / pageSize));\n });\n\n /** Whether client or server pagination controls should be rendered. */\n readonly showPagination = computed(() => {\n if (this.opts.dataSource() instanceof AgridServerSideRowModel) return false;\n const control = this.opts.control();\n if (this.opts.treeConfig()) return false;\n return (control?.pageSize() ?? 0) > 0\n && (!control?.groupByField() || !!this.opts.pivotMode?.());\n });\n\n /** Whether at least one visible column has an aggregate footer. */\n readonly showFooter = computed(() => {\n if (this.opts.dataSource() instanceof AgridServerSideRowModel) return false;\n // Aggregating already-aggregated pivot cells is not generally valid (for example avg of avg).\n if (this.opts.pivotMode?.()) return false;\n const aggregates = this.opts.control()?.aggregates() ?? {};\n return this.opts.visibleColDefs().some(col => col.aggregate || aggregates[col.field]);\n });\n\n /** Aggregate values computed over all filtered rows, before pagination. */\n readonly footerValues = computed<Record<string, unknown>>(() =>\n computeAggregates(\n this.opts.dataSource().rows(),\n this.filteredSortedIndices(),\n this.opts.visibleColDefs(),\n this.opts.control()?.aggregates() ?? {},\n ),\n );\n\n /** Filtered, sorted, paginated, and optionally grouped virtual-scroll items. */\n readonly filteredItems = computed<GridItem[]>(() => {\n const rows = this.opts.dataSource().rows();\n const serverModel = this.opts.dataSource() instanceof AgridServerSideRowModel\n ? this.opts.dataSource() as AgridServerSideRowModel\n : null;\n const control = this.opts.control();\n let indices = this.filteredSortedIndices();\n\n // Server-side blocks already arrive filtered and sorted. Preserve their global indices and\n // represent unloaded sparse slots as non-interactive virtual rows.\n if (serverModel) {\n return indices.map(originalIndex => serverModel.isPlaceholder(originalIndex)\n ? { loading: true, originalIndex }\n : { row: rows[originalIndex], originalIndex });\n }\n\n // Tree mode takes precedence over grouping/pagination: the already filtered-and-sorted\n // indices are flattened into a hierarchy honoring the expanded-id set.\n const treeConfig = this.opts.treeConfig();\n if (treeConfig) {\n const expandedIds = this.opts.expandedTreeIds();\n // Passing no columns keeps the tree builders allocation-free when rollups are disabled.\n // Runtime control aggregates override static ColDef.aggregate values inside the builders.\n const treeAggregateCols = treeConfig.aggregateTreeNodes\n ? this.opts.visibleColDefs()\n : [];\n const treeControlAggregates = treeConfig.aggregateTreeNodes\n ? control?.aggregates() ?? {}\n : {};\n\n // When a text/value filter is active, keep the ancestors of every match visible (and\n // force their path open) so deep matches don't vanish under filtered-out parents.\n const filters = control?.filters() ?? {};\n const filterActive = !this.opts.serverSideFiltering()\n && Object.values(filters).some(f => f.text || f.selectedValues !== null);\n\n if (isPathTreeConfig(treeConfig)) {\n const items = this.appendTreeDetailItems(\n buildPathTreeItems(\n rows,\n indices,\n treeConfig,\n expandedIds,\n filterActive && treeConfig.keepAncestorsOnFilter !== false,\n treeAggregateCols,\n treeControlAggregates,\n ),\n rows,\n treeConfig,\n );\n this.appendAddRow(items);\n return items;\n }\n\n if (filterActive && treeConfig.keepAncestorsOnFilter !== false) {\n const { getId, getParentId } = treeConfig;\n const idToIndex = new Map<string | number, number>();\n rows.forEach((row, index) => idToIndex.set(getId(row), index));\n\n const visible = new Set<number>(indices);\n const forced = new Set<string | number>();\n for (const matched of indices) {\n let parentId = getParentId(rows[matched]);\n while (parentId != null && idToIndex.has(parentId)) {\n const parentIndex = idToIndex.get(parentId)!;\n forced.add(parentId);\n if (visible.has(parentIndex)) break; // chain already added by an earlier match\n visible.add(parentIndex);\n parentId = getParentId(rows[parentIndex]);\n }\n }\n\n const ordered = this.allSortedIndices().filter(index => visible.has(index));\n const items = this.appendTreeDetailItems(\n buildTreeItems(\n rows,\n ordered,\n treeConfig,\n expandedIds,\n forced,\n treeAggregateCols,\n treeControlAggregates,\n ),\n rows,\n treeConfig,\n );\n this.appendAddRow(items);\n return items;\n }\n\n const items = this.appendTreeDetailItems(\n buildTreeItems(\n rows,\n indices,\n treeConfig,\n expandedIds,\n undefined,\n treeAggregateCols,\n treeControlAggregates,\n ),\n rows,\n treeConfig,\n );\n this.appendAddRow(items);\n return items;\n }\n\n // Pull pinned rows out of the body; they render in fixed top/bottom containers instead.\n if (this.pinningActive()) {\n const bodySet = this.partitionPinned().bodySet;\n indices = indices.filter(index => bodySet.has(index));\n }\n\n if (control) {\n const groupField = control.groupByField();\n const pageSize = control.pageSize();\n const serverPagination = control.totalRows() > 0;\n if (pageSize > 0 && !serverPagination && !groupField) {\n const page = Math.max(1, Math.min(control.currentPage(), this.totalPages()));\n indices = indices.slice((page - 1) * pageSize, page * pageSize);\n }\n\n if (groupField && !this.opts.pivotMode?.()) {\n const expansion = this.opts.expandedGroups();\n const expandedLabels = expansion.field === groupField\n ? expansion.labels\n : new Set<string>();\n const filters = control.filters();\n const sortEntries = this.opts.serverSideFiltering()\n ? []\n : this.sortEntries(filters);\n const items = buildGroupedItems(\n rows,\n indices,\n groupField,\n this.columnMap(),\n sortEntries,\n expandedLabels,\n this.opts.locale(),\n this.opts.visibleColDefs(),\n control.aggregates(),\n );\n this.appendAddRow(items);\n return items;\n }\n }\n\n // Flat mode: optionally interleave a master/detail panel item after each expanded row.\n const expandedDetail = this.opts.masterDetail?.() ? this.opts.expandedDetailIds?.() : null;\n const items: GridItem[] = [];\n for (const originalIndex of indices) {\n const row = rows[originalIndex];\n items.push({ row, originalIndex });\n if (expandedDetail?.has(originalIndex)) items.push({ detailFor: originalIndex, row });\n }\n this.appendAddRow(items);\n return items;\n });\n\n /** Returns sorted fields after applying the configured sorting mode. */\n effectiveSortOrder(): string[] {\n const option = this.opts.sortOption();\n if (option === 'none') return [];\n const order = this.opts.control()?.sortOrder() ?? [];\n return option === 'single' ? order.slice(-1) : order;\n }\n\n private columnMap(): Map<string, ColDef> {\n return new Map(this.opts.colDefs().map(col => [col.field, col]));\n }\n\n private sortEntries(filters: Record<string, ColumnFilter>): [string, ColumnFilter][] {\n return this.effectiveSortOrder()\n .map(field => [field, filters[field]] as [string, ColumnFilter])\n .filter(([, filter]) => !!filter?.sort);\n }\n\n private appendTreeDetailItems(\n items: GridItem[],\n rows: Record<string, unknown>[],\n treeConfig: AgridTreeConfig,\n ): GridItem[] {\n const expandedDetail = this.opts.masterDetail?.() ? this.opts.expandedDetailIds?.() : null;\n if (!expandedDetail?.size) return items;\n\n const parentIds = !isPathTreeConfig(treeConfig)\n ? new Set(\n rows\n .map(row => treeConfig.getParentId(row))\n .filter((id): id is string | number => id !== null && id !== undefined),\n )\n : new Set<string | number>();\n const result: GridItem[] = [];\n for (const item of items) {\n result.push(item);\n if (\n item\n && typeof item === 'object'\n && 'originalIndex' in item\n && 'row' in item\n && (\n isPathTreeConfig(treeConfig)\n || !parentIds.has(treeConfig.getId(item.row))\n )\n && expandedDetail.has(item.originalIndex)\n ) {\n result.push({ detailFor: item.originalIndex, row: item.row });\n }\n }\n return result;\n }\n\n private appendAddRow(items: GridItem[]): void {\n if (this.opts.allowAddRows() && !this.opts.autoAddRows()) items.push(null);\n }\n}\n","import { DestroyRef, Signal, WritableSignal, signal } from '@angular/core';\nimport { AgridBrowserAdapter } from '../infrastructure/agrid-browser.adapter';\nimport { CellRange } from './agrid-clipboard.handler';\nimport { AgridControl, HistoryEntry } from '../agrid-control';\nimport { AgridDataSource } from '../agrid-datasource';\nimport { CellPosition, ColDef, GridEditEvent, GridItem } from '../agrid.types';\nimport { isDataRowItem } from '../agrid.utils';\n\n/** Rectangular bounds in projected row and visible column coordinates. @internal */\nexport type VisibleCellBounds = {\n rowStart: number;\n rowEnd: number;\n colStart: number;\n colEnd: number;\n};\n\n/** Dependencies and callbacks required by {@link AgridRangeController}. @internal */\nexport interface AgridRangeControllerOptions {\n control: Signal<AgridControl | null>;\n dataSource: Signal<AgridDataSource>;\n filteredItems: Signal<GridItem[]>;\n visibleColDefs: Signal<ColDef[]>;\n selectedCell: WritableSignal<CellPosition | null>;\n selectedRange: WritableSignal<CellRange | null>;\n isCellEditable: (col: ColDef, originalIndex: number) => boolean;\n cancelEdit: () => void;\n findDisplayIndex: (originalIndex: number) => number;\n scrollToCell: (displayIndex: number, colIndex: number) => void;\n verticalViewportElement: () => HTMLElement;\n horizontalViewportElement: () => HTMLElement;\n onCellEdit: (event: GridEditEvent) => void;\n}\n\n/** Owns cell-range calculations and fill-handle drag/application behavior. @internal */\nexport class AgridRangeController {\n readonly fillPreviewBounds = signal<VisibleCellBounds | null>(null);\n private fillDragSource: VisibleCellBounds | null = null;\n private selectionDragAnchor: CellPosition | null = null;\n private selectionDragMoved = false;\n private suppressActivation = false;\n private dragPointer: { x: number; y: number } | null = null;\n private autoScrollTimer: ReturnType<typeof setTimeout> | null = null;\n\n constructor(\n private readonly opts: AgridRangeControllerOptions,\n destroyRef: DestroyRef,\n private readonly browser = new AgridBrowserAdapter(),\n ) {\n destroyRef.onDestroy(() => this.cancelFill());\n destroyRef.onDestroy(() => this.cancelSelectionDrag());\n }\n\n /** Starts a pointer-driven rectangular selection from a data cell. */\n startSelection(event: PointerEvent, rowIndex: number, colIndex: number): void {\n if (event.button !== 0 || this.selectionDragAnchor) return;\n this.opts.cancelEdit();\n if (event.shiftKey && this.opts.selectedCell()) {\n this.extendTo(rowIndex, colIndex);\n this.suppressActivation = true;\n return;\n }\n const anchor = { rowIndex, colIndex };\n this.selectionDragAnchor = anchor;\n this.selectionDragMoved = false;\n this.suppressActivation = false;\n this.dragPointer = { x: event.clientX, y: event.clientY };\n this.opts.selectedCell.set(anchor);\n this.opts.selectedRange.set(null);\n this.browser.setBodyInteraction('cell', 'none');\n this.browser.addDocumentListener('pointermove', this.selectionDragMove);\n this.browser.addDocumentListener('pointerup', this.selectionDragUp);\n this.browser.addDocumentListener('pointercancel', this.selectionDragCancel);\n }\n\n /** Consumes the click generated after a completed range drag. */\n consumeSuppressedActivation(): boolean {\n if (!this.suppressActivation) return false;\n this.suppressActivation = false;\n return true;\n }\n\n /** Extends the current range focus to a source row and visible column. */\n extendTo(rowIndex: number, colIndex: number): void {\n const selected = this.opts.selectedCell();\n const anchor = this.opts.selectedRange()?.anchor ?? selected ?? { rowIndex, colIndex };\n const focus = { rowIndex, colIndex };\n this.opts.selectedCell.set(focus);\n this.opts.selectedRange.set({ anchor, focus });\n }\n\n /** Returns selected range bounds in projected display coordinates. */\n getVisibleRangeBounds(): VisibleCellBounds | null {\n const range = this.opts.selectedRange();\n if (!range) return null;\n const anchorDisplayIndex = this.opts.findDisplayIndex(range.anchor.rowIndex);\n const focusDisplayIndex = this.opts.findDisplayIndex(range.focus.rowIndex);\n if (anchorDisplayIndex < 0 || focusDisplayIndex < 0) return null;\n return {\n rowStart: Math.min(anchorDisplayIndex, focusDisplayIndex),\n rowEnd: Math.max(anchorDisplayIndex, focusDisplayIndex),\n colStart: Math.min(range.anchor.colIndex, range.focus.colIndex),\n colEnd: Math.max(range.anchor.colIndex, range.focus.colIndex),\n };\n }\n\n /** Returns range bounds, falling back to the active cell. */\n getActiveSelectionBounds(): VisibleCellBounds | null {\n const range = this.getVisibleRangeBounds();\n if (range) return range;\n const selected = this.opts.selectedCell();\n if (!selected) return null;\n const displayIndex = this.opts.findDisplayIndex(selected.rowIndex);\n if (displayIndex < 0) return null;\n return {\n rowStart: displayIndex,\n rowEnd: displayIndex,\n colStart: selected.colIndex,\n colEnd: selected.colIndex,\n };\n }\n\n /** Returns whether a cell is inside the selected range. */\n isRangeSelected(originalIndex: number, colIndex: number): boolean {\n const range = this.getVisibleRangeBounds();\n if (!range) return false;\n const displayIndex = this.opts.findDisplayIndex(originalIndex);\n return displayIndex >= range.rowStart && displayIndex <= range.rowEnd\n && colIndex >= range.colStart && colIndex <= range.colEnd;\n }\n\n /** Returns whether a cell owns the selection's fill handle. */\n isFillHandleCell(originalIndex: number, colIndex: number): boolean {\n const bounds = this.getActiveSelectionBounds();\n if (!bounds) return false;\n const displayIndex = this.opts.findDisplayIndex(originalIndex);\n return displayIndex === bounds.rowEnd && colIndex === bounds.colEnd;\n }\n\n /** Returns whether a cell is inside the pending fill extension. */\n isFillPreviewCell(originalIndex: number, colIndex: number): boolean {\n const source = this.fillDragSource;\n const target = this.fillPreviewBounds();\n if (!source || !target) return false;\n const displayIndex = this.opts.findDisplayIndex(originalIndex);\n const insideTarget = displayIndex >= target.rowStart && displayIndex <= target.rowEnd\n && colIndex >= target.colStart && colIndex <= target.colEnd;\n const insideSource = displayIndex >= source.rowStart && displayIndex <= source.rowEnd\n && colIndex >= source.colStart && colIndex <= source.colEnd;\n return insideTarget && !insideSource;\n }\n\n /** Starts a fill-handle drag from the active selection corner. */\n startFill(event: PointerEvent, originalIndex: number, colIndex: number): boolean {\n if (event.button !== 0 || !this.isFillHandleCell(originalIndex, colIndex)) return false;\n if (!this.isFillHandleHit(event)) return false;\n const bounds = this.getActiveSelectionBounds();\n if (!bounds) return false;\n event.preventDefault();\n event.stopPropagation();\n this.opts.cancelEdit();\n this.fillDragSource = bounds;\n this.fillPreviewBounds.set(null);\n this.browser.addDocumentListener('pointermove', this.fillDragMove);\n this.browser.addDocumentListener('pointerup', this.fillDragUp);\n this.browser.addDocumentListener('pointercancel', this.fillDragCancel);\n return true;\n }\n\n /** Repeats source values across the target range as one history operation. */\n applyFill(source: VisibleCellBounds, target: VisibleCellBounds): void {\n const items = this.opts.filteredItems();\n const cols = this.opts.visibleColDefs();\n const sourceRows = this.getDataDisplayIndices(source.rowStart, source.rowEnd);\n const targetRows = this.getDataDisplayIndices(target.rowStart, target.rowEnd);\n if (sourceRows.length === 0 || targetRows.length === 0) return;\n\n const sourceValues = sourceRows.map(displayIndex => {\n const item = items[displayIndex];\n return isDataRowItem(item)\n ? cols.slice(source.colStart, source.colEnd + 1).map(col => item.row[col.field])\n : [];\n });\n\n let lastPosition: CellPosition | null = null;\n const historyEntries: HistoryEntry[] = [];\n for (let rowOffset = 0; rowOffset < targetRows.length; rowOffset++) {\n const displayIndex = targetRows[rowOffset];\n const item = items[displayIndex];\n if (!isDataRowItem(item)) continue;\n for (let colIndex = target.colStart; colIndex <= target.colEnd; colIndex++) {\n const insideSource = displayIndex >= source.rowStart && displayIndex <= source.rowEnd\n && colIndex >= source.colStart && colIndex <= source.colEnd;\n if (insideSource) continue;\n const col = cols[colIndex];\n if (!col || !this.opts.isCellEditable(col, item.originalIndex)) continue;\n const sourceRowIndex = rowOffset % sourceValues.length;\n const sourceRowValues = sourceValues[sourceRowIndex];\n if (sourceRowValues.length === 0) continue;\n const sourceColIndex = (colIndex - source.colStart) % sourceRowValues.length;\n const oldValue = this.opts.dataSource().getRow(item.originalIndex)[col.field];\n const newValue = sourceRowValues[sourceColIndex];\n if (oldValue === newValue) continue;\n\n this.opts.dataSource().patchRow(item.originalIndex, { [col.field]: newValue });\n historyEntries.push({\n rowIndex: item.originalIndex,\n field: col.field,\n oldValue,\n newValue,\n });\n this.opts.onCellEdit({\n position: { rowIndex: item.originalIndex, colIndex },\n field: col.field,\n oldValue,\n newValue,\n });\n lastPosition = { rowIndex: item.originalIndex, colIndex };\n }\n }\n\n this.opts.control()?.pushEditBatch(historyEntries);\n const targetItem = items[target.rowEnd];\n if (isDataRowItem(targetItem)) {\n this.opts.selectedCell.set({ rowIndex: targetItem.originalIndex, colIndex: target.colEnd });\n this.opts.selectedRange.set({\n anchor: this.positionFromVisibleCell(source.rowStart, source.colStart),\n focus: { rowIndex: targetItem.originalIndex, colIndex: target.colEnd },\n });\n } else if (lastPosition) {\n this.opts.selectedCell.set(lastPosition);\n }\n }\n\n private readonly fillDragMove = (event: PointerEvent): void => {\n const source = this.fillDragSource;\n if (!source) return;\n const target = this.getHoveredCellPosition(event.clientX, event.clientY);\n if (!target) {\n this.fillPreviewBounds.set(null);\n return;\n }\n const targetDisplayIndex = this.opts.findDisplayIndex(target.rowIndex);\n if (targetDisplayIndex < 0) {\n this.fillPreviewBounds.set(null);\n return;\n }\n const rowEnd = Math.max(source.rowEnd, targetDisplayIndex);\n const colEnd = Math.max(source.colEnd, target.colIndex);\n if (rowEnd === source.rowEnd && colEnd === source.colEnd) {\n this.fillPreviewBounds.set(null);\n return;\n }\n this.fillPreviewBounds.set({\n rowStart: source.rowStart,\n rowEnd,\n colStart: source.colStart,\n colEnd,\n });\n this.opts.scrollToCell(rowEnd, colEnd);\n };\n\n private readonly fillDragUp = (): void => {\n this.stopFillListeners();\n const source = this.fillDragSource;\n const target = this.fillPreviewBounds();\n this.fillDragSource = null;\n this.fillPreviewBounds.set(null);\n if (source && target) this.applyFill(source, target);\n };\n\n private readonly fillDragCancel = (): void => this.cancelFill();\n\n private cancelFill(): void {\n this.stopFillListeners();\n this.fillDragSource = null;\n this.fillPreviewBounds.set(null);\n }\n\n private stopFillListeners(): void {\n this.browser.removeDocumentListener('pointermove', this.fillDragMove);\n this.browser.removeDocumentListener('pointerup', this.fillDragUp);\n this.browser.removeDocumentListener('pointercancel', this.fillDragCancel);\n }\n\n private readonly selectionDragMove = (event: PointerEvent): void => {\n if (!this.selectionDragAnchor) return;\n event.preventDefault();\n this.dragPointer = { x: event.clientX, y: event.clientY };\n this.updateSelectionFromPointer();\n this.updateAutoScroll();\n };\n\n private readonly selectionDragUp = (): void => {\n this.suppressActivation = this.selectionDragMoved;\n this.stopSelectionDrag();\n };\n\n private readonly selectionDragCancel = (): void => this.cancelSelectionDrag();\n\n private cancelSelectionDrag(): void {\n this.suppressActivation = false;\n this.stopSelectionDrag();\n }\n\n private stopSelectionDrag(): void {\n this.browser.removeDocumentListener('pointermove', this.selectionDragMove);\n this.browser.removeDocumentListener('pointerup', this.selectionDragUp);\n this.browser.removeDocumentListener('pointercancel', this.selectionDragCancel);\n if (this.autoScrollTimer !== null) clearTimeout(this.autoScrollTimer);\n this.autoScrollTimer = null;\n this.selectionDragAnchor = null;\n this.selectionDragMoved = false;\n this.dragPointer = null;\n this.browser.setBodyInteraction('', '');\n }\n\n private updateSelectionFromPointer(): void {\n const anchor = this.selectionDragAnchor;\n const pointer = this.dragPointer;\n if (!anchor || !pointer) return;\n const verticalRect = this.opts.verticalViewportElement().getBoundingClientRect();\n const horizontalRect = this.opts.horizontalViewportElement().getBoundingClientRect();\n const x = Math.max(horizontalRect.left + 1, Math.min(horizontalRect.right - 1, pointer.x));\n const y = Math.max(verticalRect.top + 1, Math.min(verticalRect.bottom - 1, pointer.y));\n const target = this.getHoveredCellPosition(x, y);\n if (!target || (target.rowIndex === anchor.rowIndex && target.colIndex === anchor.colIndex)) return;\n this.selectionDragMoved = true;\n this.opts.selectedCell.set(target);\n this.opts.selectedRange.set({ anchor, focus: target });\n }\n\n private updateAutoScroll(): void {\n if (!this.selectionDragAnchor || !this.dragPointer) return;\n const { x, y } = this.dragPointer;\n const verticalRect = this.opts.verticalViewportElement().getBoundingClientRect();\n const horizontalEl = this.opts.horizontalViewportElement();\n const horizontalRect = horizontalEl.getBoundingClientRect();\n const verticalDelta = this.edgeScrollDelta(y, verticalRect.top, verticalRect.bottom);\n const horizontalDelta = this.edgeScrollDelta(x, horizontalRect.left, horizontalRect.right);\n if (verticalDelta === 0 && horizontalDelta === 0) {\n if (this.autoScrollTimer !== null) clearTimeout(this.autoScrollTimer);\n this.autoScrollTimer = null;\n return;\n }\n if (this.autoScrollTimer !== null) return;\n const tick = (): void => {\n if (!this.selectionDragAnchor || !this.dragPointer) {\n this.autoScrollTimer = null;\n return;\n }\n const pointer = this.dragPointer;\n const vRect = this.opts.verticalViewportElement().getBoundingClientRect();\n const hEl = this.opts.horizontalViewportElement();\n const hRect = hEl.getBoundingClientRect();\n const dy = this.edgeScrollDelta(pointer.y, vRect.top, vRect.bottom);\n const dx = this.edgeScrollDelta(pointer.x, hRect.left, hRect.right);\n if (dy === 0 && dx === 0) {\n this.autoScrollTimer = null;\n return;\n }\n if (dy !== 0) this.opts.verticalViewportElement().scrollTop += dy;\n if (dx !== 0) hEl.scrollLeft += dx;\n this.updateSelectionFromPointer();\n this.autoScrollTimer = this.browser.schedule(tick, 16);\n };\n this.autoScrollTimer = this.browser.schedule(tick, 16);\n }\n\n private edgeScrollDelta(position: number, start: number, end: number): number {\n if (position < start) return -Math.min(32, Math.max(6, Math.ceil((start - position) / 3)));\n if (position > end) return Math.min(32, Math.max(6, Math.ceil((position - end) / 3)));\n return 0;\n }\n\n private isFillHandleHit(event: PointerEvent): boolean {\n const rect = (event.currentTarget as HTMLElement).getBoundingClientRect();\n return event.clientX >= rect.right - 8 && event.clientY >= rect.bottom - 8;\n }\n\n private getHoveredCellPosition(x: number, y: number): CellPosition | null {\n for (const element of this.browser.elementsFromPoint(x, y)) {\n const cell = (element as HTMLElement)\n .closest<HTMLElement>('agrid-cell[data-cell-row][data-cell-col]');\n if (!cell) continue;\n const rowIndex = Number(cell.dataset['cellRow']);\n const colIndex = Number(cell.dataset['cellCol']);\n if (Number.isFinite(rowIndex) && Number.isFinite(colIndex)) {\n return { rowIndex, colIndex };\n }\n }\n return null;\n }\n\n private getDataDisplayIndices(start: number, end: number): number[] {\n const items = this.opts.filteredItems();\n const indices: number[] = [];\n for (let displayIndex = start; displayIndex <= end; displayIndex++) {\n if (isDataRowItem(items[displayIndex])) indices.push(displayIndex);\n }\n return indices;\n }\n\n private positionFromVisibleCell(displayIndex: number, colIndex: number): CellPosition {\n const item = this.opts.filteredItems()[displayIndex];\n if (isDataRowItem(item)) return { rowIndex: item.originalIndex, colIndex };\n return this.opts.selectedCell() ?? { rowIndex: 0, colIndex };\n }\n}\n","import { Signal, WritableSignal, computed, signal } from '@angular/core';\nimport { AgridBrowserAdapter } from '../infrastructure/agrid-browser.adapter';\nimport { AgridDataSource } from '../agrid-datasource';\nimport {\n CellPosition,\n ColDef,\n GridItem,\n RecordEditEvent,\n RowClickEvent,\n RowSelectEvent,\n} from '../agrid.types';\nimport { buildSelectionRange, getDisplayForField, isDataRowItem } from '../agrid.utils';\n\n/**\n * Whether a pointer event originated inside an editable form control. Used to avoid calling\n * `preventDefault()` on a row pointerdown, which would otherwise cancel native text selection\n * (and caret placement) inside an active cell editor.\n */\nfunction isEditableEventTarget(target: EventTarget | null): boolean {\n return target instanceof HTMLInputElement\n || target instanceof HTMLTextAreaElement\n || target instanceof HTMLSelectElement\n || (target instanceof HTMLElement && target.isContentEditable);\n}\n\n/** Dependencies and callbacks required by {@link AgridRowController}. @internal */\nexport interface AgridRowControllerOptions {\n dataSource: Signal<AgridDataSource>;\n filteredItems: Signal<GridItem[]>;\n visibleColDefs: Signal<ColDef[]>;\n locale: Signal<string>;\n markedRowIndices: Signal<ReadonlySet<number>>;\n rowSelection: Signal<'none' | 'single' | 'multi'>;\n selectedCell: WritableSignal<CellPosition | null>;\n editingCell: Signal<CellPosition | null>;\n insertRowAt: (index: number) => void;\n startDragSelect: (originalIndex: number) => void;\n onRowSelect: (event: RowSelectEvent | null) => void;\n onRowClick: (event: RowClickEvent) => void;\n onRowRemoved: (event: Pick<RecordEditEvent, 'index' | 'data'>) => void;\n onEditRowRemoved: (originalIndex: number) => void;\n closeFilterMenu: () => void;\n closeGroupActionsMenu: () => void;\n /** Whether row deletion requires an inline confirmation prompt. */\n confirmRowDelete: Signal<boolean>;\n /** Focuses the confirmation prompt's \"No\" button once it renders. */\n focusDeleteConfirmButton: () => void;\n /** Returns focus to the grid body (e.g. after cancelling a delete). */\n focusGrid: () => void;\n /** Current horizontal scroll offset and width used to position the prompt. */\n measureScroller: () => { left: number; width: number };\n}\n\n/** Screen position and row targeted by the row context menu. @internal */\nexport type AgridRowContextMenu = { x: number; y: number; rowIndex: number };\n\n/** Screen position and cell data targeted by the cell context menu. @internal */\nexport type AgridCellContextMenu = {\n x: number;\n y: number;\n rowIndex: number;\n colIndex: number;\n field: string;\n value: unknown;\n row: Record<string, unknown>;\n};\n\n/**\n * Owns row selection, row/cell context menus, and row-level operations.\n * @internal\n */\nexport class AgridRowController {\n readonly contextMenu = signal<AgridRowContextMenu | null>(null);\n readonly cellContextMenu = signal<AgridCellContextMenu | null>(null);\n /** Original index of the row awaiting delete confirmation, or `null`. */\n readonly pendingDeleteRow = signal<number | null>(null);\n /** Left offset (px) of the inline delete-confirmation prompt. */\n readonly deleteConfirmationLeft = signal(0);\n /** Width (px) of the inline delete-confirmation prompt. */\n readonly deleteConfirmationWidth = signal(0);\n readonly selectedIndices = signal<Set<number>>(new Set());\n readonly selectedRowIndices: Signal<ReadonlySet<number>> =\n this.selectedIndices.asReadonly() as Signal<ReadonlySet<number>>;\n readonly selectedRowIndex = computed<number | null>(() => {\n const selected = this.selectedIndices();\n return selected.size > 0 ? [...selected][0] : null;\n });\n\n private selectionPivot: number | null = null;\n\n constructor(\n private readonly opts: AgridRowControllerOptions,\n private readonly browser = new AgridBrowserAdapter(),\n ) {}\n\n /** Returns whether the data-source row is currently selected. */\n isRowSelected(originalIndex: number): boolean {\n return this.selectedIndices().has(originalIndex);\n }\n\n /** Returns whether a virtual item is a selected data row. */\n isPinnedPaneRowSelected(item: GridItem): boolean {\n return isDataRowItem(item) && this.isRowSelected(item.originalIndex);\n }\n\n /** Clears all selected rows and emits the selection change. */\n clearSelection(): void {\n if (this.selectedIndices().size === 0) return;\n this.selectedIndices.set(new Set());\n this.opts.onRowSelect(null);\n }\n\n /** Applies pointer selection semantics for the configured selection mode. */\n selectFromPointer(event: PointerEvent, originalIndex: number, allowDragSelect: boolean): void {\n const mode = this.opts.rowSelection();\n if (mode === 'none' || event.button !== 0) return;\n\n if (mode === 'single') {\n const already = this.selectedIndices().has(originalIndex);\n this.selectedIndices.set(already ? new Set() : new Set([originalIndex]));\n this.emitSelection();\n return;\n }\n\n const ctrl = event.ctrlKey || event.metaKey;\n const shift = event.shiftKey;\n\n if (ctrl) {\n const next = new Set(this.selectedIndices());\n if (next.has(originalIndex)) next.delete(originalIndex);\n else next.add(originalIndex);\n this.selectedIndices.set(next);\n this.selectionPivot = originalIndex;\n this.emitSelection();\n } else if (shift && this.selectionPivot !== null) {\n this.selectedIndices.set(\n buildSelectionRange(this.selectionPivot, originalIndex, this.opts.filteredItems()),\n );\n this.emitSelection();\n } else {\n if (!isEditableEventTarget(event.target)) event.preventDefault();\n this.selectedIndices.set(new Set([originalIndex]));\n this.selectionPivot = originalIndex;\n\n if (allowDragSelect) this.opts.startDragSelect(originalIndex);\n else this.emitSelection();\n }\n }\n\n /** Emits a row click unless a cell edit is active. */\n clickRow(item: { row: Record<string, unknown>; originalIndex: number }): void {\n if (this.opts.editingCell()) return;\n this.opts.onRowClick({ row: item.row, originalIndex: item.originalIndex });\n }\n\n /** Opens the row context menu at the pointer position. */\n openRowContextMenu(event: MouseEvent, originalIndex: number): void {\n event.preventDefault();\n event.stopPropagation();\n this.contextMenu.set({ x: event.clientX, y: event.clientY, rowIndex: originalIndex });\n }\n\n /** Closes the row context menu. */\n closeContextMenu(): void {\n this.contextMenu.set(null);\n }\n\n /** Opens the cell context menu and closes conflicting menus. */\n openCellContextMenu(\n event: MouseEvent,\n rowIndex: number,\n colIndex: number,\n col: ColDef,\n row: Record<string, unknown>,\n ): void {\n event.preventDefault();\n event.stopPropagation();\n this.closeContextMenu();\n this.opts.closeFilterMenu();\n this.opts.closeGroupActionsMenu();\n this.cellContextMenu.set({\n x: event.clientX,\n y: event.clientY,\n rowIndex,\n colIndex,\n field: col.field,\n value: row[col.field],\n row,\n });\n }\n\n /** Closes the cell context menu. */\n closeCellContextMenu(): void {\n this.cellContextMenu.set(null);\n }\n\n /** Copies a cell plus the same field from marked rows to the clipboard. */\n copyCellToClipboard(originalIndex: number, col: ColDef): void {\n const rows = this.opts.dataSource().rows();\n const text = this.copyIndices(originalIndex)\n .map(index => getDisplayForField(col, rows[index]?.[col.field], this.opts.locale()))\n .join('\\n');\n void this.browser.writeClipboard(text);\n this.closeCellContextMenu();\n }\n\n /** Copies a row plus all marked rows as tab-separated text. */\n copyRowToClipboard(originalIndex: number): void {\n const rows = this.opts.dataSource().rows();\n const cols = this.opts.visibleColDefs();\n const text = this.copyIndices(originalIndex)\n .map(index => cols\n .map(col => getDisplayForField(col, rows[index]?.[col.field], this.opts.locale()))\n .join('\\t'))\n .join('\\n');\n void this.browser.writeClipboard(text);\n this.closeCellContextMenu();\n }\n\n private copyIndices(primaryIndex: number): number[] {\n const length = this.opts.dataSource().length;\n const indices = [primaryIndex];\n for (const index of [...this.opts.markedRowIndices()].sort((a, b) => a - b)) {\n if (index !== primaryIndex && index >= 0 && index < length) indices.push(index);\n }\n return indices;\n }\n\n /** Inserts a row through the grid's central insertion callback. */\n insertRowAt(index: number): void {\n this.opts.insertRowAt(index);\n this.closeCellContextMenu();\n }\n\n /** Removes a row and reconciles selection and editing indices. */\n deleteRow(originalIndex: number): void {\n const removedRow = this.opts.dataSource().getRow(originalIndex);\n this.opts.dataSource().removeRow(originalIndex);\n\n const selectedCell = this.opts.selectedCell();\n if (selectedCell?.rowIndex === originalIndex) {\n this.opts.selectedCell.set(null);\n } else if (selectedCell && selectedCell.rowIndex > originalIndex) {\n this.opts.selectedCell.update(cell => cell ? { ...cell, rowIndex: cell.rowIndex - 1 } : null);\n }\n\n this.opts.onEditRowRemoved(originalIndex);\n\n if (this.selectedIndices().has(originalIndex)) {\n this.selectedIndices.update(indices => {\n const next = new Set(indices);\n next.delete(originalIndex);\n return next;\n });\n this.emitSelection();\n }\n this.contextMenu.set(null);\n this.opts.onRowRemoved({ index: originalIndex, data: removedRow });\n }\n\n /** Starts confirmation or immediately deletes the row at `originalIndex`. */\n requestDeleteRow(originalIndex: number): void {\n if (this.opts.confirmRowDelete()) {\n this.repositionDeleteConfirmation();\n this.pendingDeleteRow.set(originalIndex);\n this.closeContextMenu();\n this.closeCellContextMenu();\n this.browser.schedule(() => this.opts.focusDeleteConfirmButton());\n return;\n }\n this.deleteRowImmediately(originalIndex);\n }\n\n /** Returns whether this row is awaiting delete confirmation. */\n isRowPendingDelete(originalIndex: number): boolean {\n return this.pendingDeleteRow() === originalIndex;\n }\n\n /** Deletes the row currently awaiting confirmation. */\n confirmPendingRowDelete(): void {\n const originalIndex = this.pendingDeleteRow();\n if (originalIndex === null) return;\n this.pendingDeleteRow.set(null);\n this.deleteRowImmediately(originalIndex);\n }\n\n /** Cancels the active row-delete confirmation and restores grid focus. */\n cancelRowDelete(): void {\n this.pendingDeleteRow.set(null);\n this.opts.focusGrid();\n }\n\n /** Recomputes the prompt's offset/width so it tracks horizontal scrolling. */\n repositionDeleteConfirmation(): void {\n const { left, width } = this.opts.measureScroller();\n this.deleteConfirmationLeft.set(left);\n this.deleteConfirmationWidth.set(width);\n }\n\n private deleteRowImmediately(originalIndex: number): void {\n this.deleteRow(originalIndex);\n this.closeCellContextMenu();\n }\n\n /** Emits the current selected rows, or `null` when selection is empty. */\n emitSelection(): void {\n const indices = this.selectedIndices();\n if (indices.size === 0) {\n this.opts.onRowSelect(null);\n return;\n }\n const rows = this.opts.dataSource().rows();\n this.opts.onRowSelect({\n rows: [...indices].map(index => ({ row: rows[index], originalIndex: index })),\n });\n }\n}\n","import { Signal, computed, signal } from '@angular/core';\nimport { AgridControl } from '../agrid-control';\nimport { AgridDataSource } from '../agrid-datasource';\nimport { AgridSidebarEdit, AgridSidebarTab } from './agrid-sidebar.component';\nimport { ColDef, GridEditEvent, ValueOption } from '../agrid.types';\nimport { coerceDateInputValue, coerceNumberInputValue } from '../agrid.utils';\n\n/** Dependencies and callbacks required by {@link AgridSidebarController}. @internal */\nexport interface AgridSidebarControllerOptions {\n control: Signal<AgridControl | null>;\n dataSource: Signal<AgridDataSource>;\n colDefs: Signal<ColDef[]>;\n visibleColDefs: Signal<ColDef[]>;\n selectedRowIndex: Signal<number | null>;\n autoOpenDetail: Signal<boolean>;\n useSidebarEditor: Signal<boolean>;\n isCellEditable: (col: ColDef, originalIndex: number) => boolean;\n onFieldChange: (event: GridEditEvent) => void;\n onCellEdit: (event: GridEditEvent) => void;\n /** Called when a `ColDef.validate` hook rejects a sidebar value. */\n onValidationFailed: (event: { rowIndex: number; field: string; value: unknown; message: string }) => void;\n}\n\n/** Owns sidebar visibility, selected-row projection, and detail-panel edits. @internal */\nexport class AgridSidebarController {\n readonly open = signal(false);\n readonly tab = signal<AgridSidebarTab>('columns');\n readonly row = computed<Record<string, unknown> | null>(() => {\n const index = this.opts.selectedRowIndex();\n return index === null ? null : this.opts.dataSource().rows()[index] ?? null;\n });\n readonly hiddenColumns = computed<ReadonlySet<string>>(\n () => this.opts.control()?.hiddenColumns() ?? new Set<string>(),\n );\n /** Per-field validation messages for rejected sidebar edits (`field → message`). */\n readonly validationErrors = signal<Record<string, string>>({});\n\n constructor(private readonly opts: AgridSidebarControllerOptions) {}\n\n /** Remove the stored validation message for one field, if any. */\n private clearFieldError(field: string): void {\n if (!(field in this.validationErrors())) return;\n this.validationErrors.update(errors => {\n const next = { ...errors };\n delete next[field];\n return next;\n });\n }\n\n /** Opens the detail tab when automatic detail display is enabled. */\n syncAutoOpen(): void {\n if (this.opts.autoOpenDetail() && this.opts.selectedRowIndex() !== null) {\n this.open.set(true);\n this.tab.set('detail');\n }\n }\n\n /** Toggles sidebar visibility without changing the active tab. */\n toggle(): void {\n this.open.update(value => !value);\n }\n\n /** Opens the sidebar. */\n openSidebar(): void {\n this.open.set(true);\n }\n\n /** Closes the sidebar. */\n closeSidebar(): void {\n this.open.set(false);\n }\n\n /** Selects a tab, or closes the sidebar when selecting its active tab. */\n selectTab(tab: AgridSidebarTab): void {\n if (this.open() && this.tab() === tab) {\n this.open.set(false);\n } else {\n this.tab.set(tab);\n this.open.set(true);\n }\n }\n\n /** Commits an edit emitted by the sidebar component. */\n edit(event: AgridSidebarEdit): void {\n this.commitEdit(event.field, event.col, event.value);\n }\n\n /** Returns the currently selected data-source row index. */\n selectedRowIndex(): number | null {\n return this.opts.selectedRowIndex();\n }\n\n /** Coerces and commits a sidebar field value to the selected row. */\n commitEdit(field: string, col: ColDef, stringValue: string): void {\n const index = this.opts.selectedRowIndex();\n if (index === null) return;\n if (!this.opts.isCellEditable(col, index)) return;\n let newValue: unknown = stringValue;\n if (col.type === 'number') {\n newValue = coerceNumberInputValue(stringValue);\n } else if (col.type === 'date') {\n newValue = coerceDateInputValue(\n stringValue,\n this.opts.dataSource().getRow(index)[field],\n );\n } else if (col.values?.length) {\n const option = col.values.find(value =>\n typeof value === 'string'\n ? value === stringValue\n : String((value as ValueOption).value) === stringValue,\n );\n newValue = option === undefined\n ? stringValue\n : typeof option === 'string' ? option : (option as ValueOption).value;\n }\n\n const row = this.opts.dataSource().getRow(index);\n const oldValue = row[field];\n if (oldValue === newValue) return;\n const message = col.validate?.(newValue as never, row as never) ?? null;\n if (message) {\n this.validationErrors.update(errors => ({ ...errors, [field]: message }));\n this.opts.onValidationFailed({ rowIndex: index, field, value: newValue, message });\n return;\n }\n this.clearFieldError(field);\n this.opts.dataSource().patchRow(index, { [field]: newValue });\n const colIndex = this.opts.visibleColDefs().findIndex(column => column.field === field);\n this.opts.control()?.pushEdit({ rowIndex: index, field, oldValue, newValue });\n const event = {\n position: { rowIndex: index, colIndex },\n field,\n oldValue,\n newValue,\n };\n this.opts.onFieldChange(event);\n if (!this.opts.useSidebarEditor()) {\n this.opts.onCellEdit(event);\n }\n }\n}\n","import { ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core';\nimport { AgridLocaleText, AGRID_LOCALE_TEXT } from '../agrid-localization';\nimport { getDateInputValue, getDisplayForField, looksLikeDate, matchesInputMask } from '../agrid.utils';\nimport { AgridPivotConfig, ColDef, HeaderGroup } from '../agrid.types';\n\n/** Tabs available from the grid's vertical sidebar strip. @internal */\nexport type AgridSidebarTab = 'columns' | 'detail' | 'pivot';\n\n/** Field edit emitted by the sidebar detail form. @internal */\nexport interface AgridSidebarEdit {\n /** Data field being edited. */\n field: string;\n /** Column definition controlling value coercion and editability. */\n col: ColDef;\n /** Raw string value produced by the form control. */\n value: string;\n}\n\n/** Display and edit model for one sidebar detail field. @internal */\nexport interface AgridSidebarDetailField {\n /** Human-readable field label. */\n label: string;\n /** Formatted read-only display value. */\n value: string;\n /** Original value stored in the row. */\n rawValue: unknown;\n /** String value supplied to the field editor. */\n inputValue: string;\n /** Whether the corresponding grid column is hidden. */\n hidden: boolean;\n /** Whether the field can be edited in the current grid state. */\n editable: boolean;\n /** Column definition associated with the field. */\n col: ColDef;\n}\n\n/** Visibility change requested from a grouped sidebar column entry. @internal */\nexport interface AgridSidebarGroupToggle {\n /** Fields belonging to the selected header group. */\n fields: string[];\n /** Requested visibility for every field in the group. */\n visible: boolean;\n}\n\n/** Grouped or standalone entry rendered in the sidebar column tree. @internal */\nexport type AgridSidebarColumnEntry =\n | { kind: 'column'; col: ColDef }\n | { kind: 'group'; id: string; label: string; columns: ColDef[] };\n\n/** Sidebar view for column visibility and selected-row details. @internal */\n@Component({\n selector: 'agrid-sidebar',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './agrid-sidebar.component.html',\n styleUrl: './agrid-sidebar.component.css',\n})\nexport class AgridSidebarComponent {\n open = input<boolean>(false);\n activeTab = input<AgridSidebarTab>('columns');\n columns = input<ColDef[]>([]);\n /** Original datasource columns available as pivot dimensions and values. */\n pivotColumns = input<ColDef[]>([]);\n /** Active pivot configuration; `null` hides the pivot tab. */\n pivotConfig = input<AgridPivotConfig | null>(null);\n headerGroups = input<HeaderGroup[]>([]);\n row = input<Record<string, unknown> | null>(null);\n rowIndex = input<number | null>(null);\n hiddenColumns = input<ReadonlySet<string>>(new Set());\n locale = input<string | undefined>(undefined);\n localeText = input<AgridLocaleText>(AGRID_LOCALE_TEXT.en);\n readonlyGrid = input<boolean>(false);\n useSidebarEditor = input<boolean>(false);\n isCellEditable = input<(col: ColDef, originalIndex: number) => boolean>(\n col => col.editable !== false,\n );\n /** Per-field validation messages (`field → message`) for rejected detail edits. */\n errors = input<Record<string, string>>({});\n\n close = output<void>();\n tabChange = output<AgridSidebarTab>();\n toggleColumn = output<string>();\n toggleColumnGroup = output<AgridSidebarGroupToggle>();\n detailEdit = output<AgridSidebarEdit>();\n save = output<AgridSidebarDetailField[]>();\n /** Emits a complete replacement configuration after one pivot control changes. */\n pivotChange = output<AgridPivotConfig>();\n\n /** Built-in aggregate selected by the sidebar, or `custom` for host functions. */\n readonly pivotAggregate = computed(() => {\n const aggregate = this.pivotConfig()?.aggregate ?? 'sum';\n return typeof aggregate === 'function' ? 'custom' : aggregate;\n });\n\n /** Localized title for the currently active sidebar tab. */\n activeTabLabel(): string {\n const locale = this.localeText();\n if (this.activeTab() === 'pivot') return locale.pivot;\n return this.activeTab() === 'columns' ? locale.columns : locale.detail;\n }\n\n /** Replace one pivot dimension/value field while preserving the other settings. */\n onPivotFieldChange(\n field: 'rowField' | 'columnField' | 'valueField',\n event: Event,\n ): void {\n const config = this.pivotConfig();\n if (!config) return;\n this.pivotChange.emit({\n ...config,\n [field]: (event.target as HTMLSelectElement).value,\n });\n }\n\n /** Replace the pivot aggregate with one of the serializable built-in functions. */\n onPivotAggregateChange(event: Event): void {\n const config = this.pivotConfig();\n if (!config) return;\n const aggregate = (event.target as HTMLSelectElement).value;\n if (aggregate === 'custom') return;\n this.pivotChange.emit({\n ...config,\n aggregate: aggregate as 'sum' | 'avg' | 'min' | 'max' | 'count',\n });\n }\n\n readonly columnEntries = computed<AgridSidebarColumnEntry[]>(() => {\n const groupLabels = new Map(this.headerGroups().map(group => [group.id, group.label]));\n const entries: AgridSidebarColumnEntry[] = [];\n const groupedEntries = new Map<string, Extract<AgridSidebarColumnEntry, { kind: 'group' }>>();\n\n for (const col of this.columns()) {\n const groupId = col.group;\n const groupLabel = groupId ? groupLabels.get(groupId) : undefined;\n if (!groupId || !groupLabel) {\n entries.push({ kind: 'column', col });\n continue;\n }\n\n let entry = groupedEntries.get(groupId);\n if (!entry) {\n entry = { kind: 'group', id: groupId, label: groupLabel, columns: [] };\n groupedEntries.set(groupId, entry);\n entries.push(entry);\n }\n entry.columns.push(col);\n }\n\n return entries;\n });\n\n /** Whether every column in a group is currently visible. */\n isGroupVisible(columns: ColDef[]): boolean {\n const hidden = this.hiddenColumns();\n return columns.every(col => !hidden.has(col.field));\n }\n\n /** Whether a group contains both visible and hidden columns. */\n isGroupPartiallyVisible(columns: ColDef[]): boolean {\n const hidden = this.hiddenColumns();\n const visibleCount = columns.filter(col => !hidden.has(col.field)).length;\n return visibleCount > 0 && visibleCount < columns.length;\n }\n\n /** Emits a visibility request for all columns belonging to a group. */\n onGroupToggle(columns: ColDef[], event: Event): void {\n this.toggleColumnGroup.emit({\n fields: columns.map(col => col.field),\n visible: (event.target as HTMLInputElement).checked,\n });\n }\n\n /** Apply the row-aware input mask while preserving the sidebar's change-to-commit behavior. */\n onDetailMaskInput(field: AgridSidebarDetailField, event: Event): void {\n const input = event.target as HTMLInputElement;\n const row = this.row();\n if (row && field.col.inputMask && field.col.type !== 'number' && field.col.type !== 'date') {\n const mask = field.col.inputMask({\n row,\n value: field.rawValue,\n column: field.col,\n });\n if (mask && !matchesInputMask(input.value, mask)) {\n input.value = input.dataset['agridMaskValue'] ?? field.inputValue;\n return;\n }\n input.dataset['agridMaskValue'] = input.value;\n }\n }\n\n /** Forward the final sidebar value after native change/blur. */\n onDetailChange(field: AgridSidebarDetailField, event: Event): void {\n this.onDetailMaskInput(field, event);\n this.detailEdit.emit({\n field: field.col.field,\n col: field.col,\n value: (event.target as HTMLInputElement).value,\n });\n }\n\n readonly detailFields = computed<AgridSidebarDetailField[] | null>(() => {\n const row = this.row();\n if (!row) return null;\n const locale = this.locale();\n const readonlyGrid = this.readonlyGrid();\n const hiddenColumns = this.hiddenColumns();\n const rowIndex = this.rowIndex();\n return this.columns().map(col => {\n const rawValue = row[col.field];\n let inputValue = String(rawValue ?? '');\n if (col.type === 'date' || looksLikeDate(rawValue)) {\n inputValue = getDateInputValue(rawValue);\n }\n return {\n label: col.header,\n value: getDisplayForField(col, rawValue, locale),\n rawValue,\n inputValue,\n hidden: hiddenColumns.has(col.field),\n editable: !readonlyGrid && rowIndex !== null && this.isCellEditable()(col, rowIndex),\n col,\n };\n });\n });\n}\n","@if (open()) {\n <div class=\"ag-sidebar\" role=\"region\"\n [attr.aria-label]=\"activeTabLabel()\">\n <div class=\"ag-sidebar-header\">\n <span>{{ activeTabLabel() }}</span>\n <button class=\"ag-sidebar-close\" (click)=\"close.emit()\" [title]=\"localeText().close\"\n [attr.aria-label]=\"localeText().close\">✕</button>\n </div>\n\n @if (activeTab() === 'columns') {\n @for (entry of columnEntries(); track entry.kind === 'group' ? 'group-' + entry.id : 'column-' + entry.col.field) {\n @if (entry.kind === 'group') {\n <div class=\"ag-sidebar-group\">\n <label class=\"ag-sidebar-item ag-sidebar-group-label\" (click)=\"$event.stopPropagation()\">\n <input\n type=\"checkbox\"\n [checked]=\"isGroupVisible(entry.columns)\"\n [indeterminate]=\"isGroupPartiallyVisible(entry.columns)\"\n (change)=\"onGroupToggle(entry.columns, $event)\"\n />\n {{ entry.label }}\n </label>\n <div class=\"ag-sidebar-group-children\">\n @for (col of entry.columns; track col.field) {\n <label class=\"ag-sidebar-item ag-sidebar-group-child\" (click)=\"$event.stopPropagation()\">\n <input\n type=\"checkbox\"\n [checked]=\"!hiddenColumns().has(col.field)\"\n (change)=\"toggleColumn.emit(col.field)\"\n />\n {{ col.header }}\n </label>\n }\n </div>\n </div>\n } @else {\n <label class=\"ag-sidebar-item\" (click)=\"$event.stopPropagation()\">\n <input\n type=\"checkbox\"\n [checked]=\"!hiddenColumns().has(entry.col.field)\"\n (change)=\"toggleColumn.emit(entry.col.field)\"\n />\n {{ entry.col.header }}\n </label>\n }\n }\n } @else if (activeTab() === 'pivot' && pivotConfig(); as pivot) {\n <div class=\"ag-pivot-config\">\n <p class=\"ag-pivot-description\">{{ localeText().pivotDescription }}</p>\n\n <label class=\"ag-pivot-field\">\n <span>{{ localeText().pivotRows }}</span>\n <select [value]=\"pivot.rowField\"\n (change)=\"onPivotFieldChange('rowField', $event)\">\n @for (col of pivotColumns(); track col.field) {\n <option [value]=\"col.field\" [selected]=\"col.field === pivot.rowField\">{{ col.header }}</option>\n }\n </select>\n </label>\n\n <label class=\"ag-pivot-field\">\n <span>{{ localeText().pivotColumns }}</span>\n <select [value]=\"pivot.columnField\"\n (change)=\"onPivotFieldChange('columnField', $event)\">\n @for (col of pivotColumns(); track col.field) {\n <option [value]=\"col.field\" [selected]=\"col.field === pivot.columnField\">{{ col.header }}</option>\n }\n </select>\n </label>\n\n <label class=\"ag-pivot-field\">\n <span>{{ localeText().pivotValues }}</span>\n <select [value]=\"pivot.valueField\"\n (change)=\"onPivotFieldChange('valueField', $event)\">\n @for (col of pivotColumns(); track col.field) {\n <option [value]=\"col.field\" [selected]=\"col.field === pivot.valueField\">{{ col.header }}</option>\n }\n </select>\n </label>\n\n <label class=\"ag-pivot-field\">\n <span>{{ localeText().aggregate }}</span>\n <select [value]=\"pivotAggregate()\" (change)=\"onPivotAggregateChange($event)\">\n <option value=\"sum\" [selected]=\"pivotAggregate() === 'sum'\">{{ localeText().aggregateSum }}</option>\n <option value=\"avg\" [selected]=\"pivotAggregate() === 'avg'\">{{ localeText().aggregateAvg }}</option>\n <option value=\"min\" [selected]=\"pivotAggregate() === 'min'\">{{ localeText().aggregateMin }}</option>\n <option value=\"max\" [selected]=\"pivotAggregate() === 'max'\">{{ localeText().aggregateMax }}</option>\n <option value=\"count\" [selected]=\"pivotAggregate() === 'count'\">{{ localeText().aggregateCount }}</option>\n @if (pivotAggregate() === 'custom') {\n <option value=\"custom\" disabled selected>{{ localeText().aggregateCustom }}</option>\n }\n </select>\n </label>\n\n <div class=\"ag-pivot-columns-heading\">{{ localeText().columns }}</div>\n <div class=\"ag-pivot-column-list\">\n @for (entry of columnEntries(); track entry.kind === 'group' ? 'pivot-group-' + entry.id : 'pivot-column-' + entry.col.field) {\n @if (entry.kind === 'group') {\n <div class=\"ag-sidebar-group\">\n <label class=\"ag-sidebar-item ag-sidebar-group-label\" (click)=\"$event.stopPropagation()\">\n <input type=\"checkbox\"\n [checked]=\"isGroupVisible(entry.columns)\"\n [indeterminate]=\"isGroupPartiallyVisible(entry.columns)\"\n (change)=\"onGroupToggle(entry.columns, $event)\" />\n {{ entry.label }}\n </label>\n <div class=\"ag-sidebar-group-children\">\n @for (col of entry.columns; track col.field) {\n <label class=\"ag-sidebar-item ag-sidebar-group-child\" (click)=\"$event.stopPropagation()\">\n <input type=\"checkbox\"\n [checked]=\"!hiddenColumns().has(col.field)\"\n (change)=\"toggleColumn.emit(col.field)\" />\n {{ col.header }}\n </label>\n }\n </div>\n </div>\n } @else {\n <label class=\"ag-sidebar-item\" (click)=\"$event.stopPropagation()\">\n <input type=\"checkbox\"\n [checked]=\"!hiddenColumns().has(entry.col.field)\"\n (change)=\"toggleColumn.emit(entry.col.field)\" />\n {{ entry.col.header }}\n </label>\n }\n }\n </div>\n </div>\n } @else {\n @if (detailFields(); as fields) {\n @for (field of fields; track field.col.field) {\n <div class=\"ag-detail-field\">\n <span class=\"ag-detail-label\">\n {{ field.label }}\n @if (field.hidden) {\n <span class=\"ag-detail-hidden\">{{ localeText().hiddenColumn }}</span>\n }\n </span>\n @if (field.editable && field.col.values?.length) {\n <select\n class=\"ag-detail-input\"\n [class.ag-detail-input--invalid]=\"!!errors()[field.col.field]\"\n (change)=\"detailEdit.emit({\n field: field.col.field,\n col: field.col,\n value: $any($event.target).value\n })\"\n >\n @for (opt of field.col.values; track $index) {\n @if ($any(opt).value !== undefined) {\n <option [value]=\"$any(opt).value\" [selected]=\"$any(opt).value === field.rawValue\">\n {{ $any(opt).label }}\n </option>\n } @else {\n <option [value]=\"opt\" [selected]=\"opt === field.rawValue\">{{ opt }}</option>\n }\n }\n </select>\n } @else if (field.editable) {\n <input\n class=\"ag-detail-input\"\n [class.ag-detail-input--invalid]=\"!!errors()[field.col.field]\"\n [type]=\"field.col.type === 'date' ? 'date' : 'text'\"\n [attr.inputmode]=\"field.col.type === 'number' ? 'decimal' : null\"\n [value]=\"field.inputValue\"\n (input)=\"onDetailMaskInput(field, $event)\"\n (change)=\"onDetailChange(field, $event)\"\n />\n } @else {\n <span class=\"ag-detail-value\">{{ field.value }}</span>\n }\n @if (errors()[field.col.field]; as msg) {\n <span class=\"ag-detail-error\" role=\"alert\">{{ msg }}</span>\n }\n </div>\n }\n @if (useSidebarEditor()) {\n <div class=\"ag-detail-field\">\n <button class=\"ag-button\" (click)=\"save.emit(fields)\">{{ localeText().save }}</button>\n </div>\n }\n } @else {\n <div class=\"ag-detail-empty\">{{ localeText().noRows }}</div>\n }\n }\n </div>\n}\n\n<div class=\"ag-sidebar-strip\">\n <button\n class=\"ag-sidebar-strip-btn\"\n [class.active]=\"open() && activeTab() === 'columns'\"\n [attr.aria-pressed]=\"open() && activeTab() === 'columns'\"\n (click)=\"tabChange.emit('columns')\"\n >{{ localeText().columns }}</button>\n <button\n class=\"ag-sidebar-strip-btn\"\n [class.active]=\"open() && activeTab() === 'detail'\"\n [attr.aria-pressed]=\"open() && activeTab() === 'detail'\"\n (click)=\"tabChange.emit('detail')\"\n >{{ localeText().detail }}</button>\n @if (pivotConfig()) {\n <button\n class=\"ag-sidebar-strip-btn\"\n [class.active]=\"open() && activeTab() === 'pivot'\"\n [attr.aria-pressed]=\"open() && activeTab() === 'pivot'\"\n (click)=\"tabChange.emit('pivot')\"\n >{{ localeText().pivot }}</button>\n }\n</div>\n","import { ListRange } from '@angular/cdk/collections';\nimport {\n CdkVirtualScrollViewport,\n VIRTUAL_SCROLL_STRATEGY,\n VirtualScrollStrategy,\n} from '@angular/cdk/scrolling';\nimport { Directive, OnChanges, forwardRef, input } from '@angular/core';\nimport { Observable, Subject, distinctUntilChanged } from 'rxjs';\n\n/** Pixels rendered above and below the viewport so scrolling does not reveal blank rows. */\nconst BUFFER_PX = 200;\n\n/**\n * A {@link VirtualScrollStrategy} that supports a different height per item instead of the single\n * fixed `itemSize` used by CDK's {@link FixedSizeVirtualScrollStrategy}.\n *\n * Item heights are supplied as a flat array (one entry per virtual item) and converted into a\n * prefix-sum offset table, so any row — a normal data row or a tall master/detail panel — can have\n * its own height while scroll position math stays O(log n) via binary search.\n *\n * When every item shares the same height (the common case with no detail rows open) the behavior\n * is equivalent to the fixed-size strategy, so the default code path is regression-safe.\n * @internal\n */\nexport class AgridVariableRowSizeStrategy implements VirtualScrollStrategy {\n private viewport: CdkVirtualScrollViewport | null = null;\n private sizes: number[] = [];\n /** Cumulative offsets; `offsets[i]` is the top of item `i`, `offsets[n]` is the total size. */\n private offsets: number[] = [0];\n\n private readonly indexChange = new Subject<number>();\n readonly scrolledIndexChange: Observable<number> = this.indexChange.pipe(distinctUntilChanged());\n\n attach(viewport: CdkVirtualScrollViewport): void {\n this.viewport = viewport;\n this.updateTotalContentSize();\n this.updateRenderedRange();\n }\n\n detach(): void {\n this.indexChange.complete();\n this.viewport = null;\n }\n\n /** Replace the per-item heights and re-measure. Called by the directive when inputs change. */\n updateItemSizes(sizes: number[]): void {\n this.sizes = sizes;\n const offsets = new Array<number>(sizes.length + 1);\n offsets[0] = 0;\n for (let i = 0; i < sizes.length; i++) offsets[i + 1] = offsets[i] + sizes[i];\n this.offsets = offsets;\n if (this.viewport) {\n this.updateTotalContentSize();\n this.updateRenderedRange();\n }\n }\n\n onContentScrolled(): void {\n this.updateRenderedRange();\n }\n\n onDataLengthChanged(): void {\n this.updateTotalContentSize();\n this.updateRenderedRange();\n }\n\n onContentRendered(): void {\n /* no-op: heights are supplied, not measured from the DOM */\n }\n\n onRenderedOffsetChanged(): void {\n /* no-op */\n }\n\n scrollToIndex(index: number, behavior: ScrollBehavior): void {\n if (!this.viewport) return;\n const clamped = Math.max(0, Math.min(index, this.sizes.length));\n this.viewport.scrollToOffset(this.offsets[clamped] ?? 0, behavior);\n }\n\n private get totalSize(): number {\n return this.offsets[this.offsets.length - 1] ?? 0;\n }\n\n private updateTotalContentSize(): void {\n this.viewport?.setTotalContentSize(this.totalSize);\n }\n\n /** Largest item index whose top offset is `<= offset` (binary search over the prefix sums). */\n private indexAt(offset: number): number {\n const o = this.offsets;\n let lo = 0;\n let hi = o.length - 1;\n while (lo < hi) {\n const mid = (lo + hi + 1) >> 1;\n if (o[mid] <= offset) lo = mid;\n else hi = mid - 1;\n }\n return lo;\n }\n\n private updateRenderedRange(): void {\n const viewport = this.viewport;\n if (!viewport) return;\n\n const dataLength = viewport.getDataLength();\n const n = Math.min(this.sizes.length, dataLength);\n if (n === 0) {\n viewport.setRenderedRange({ start: 0, end: 0 });\n viewport.setRenderedContentOffset(0);\n this.indexChange.next(0);\n return;\n }\n\n const scrollOffset = viewport.measureScrollOffset();\n const viewportSize = viewport.getViewportSize();\n const start = Math.max(0, this.indexAt(scrollOffset - BUFFER_PX));\n const end = Math.min(n, this.indexAt(scrollOffset + viewportSize + BUFFER_PX) + 1);\n\n const range: ListRange = { start, end };\n viewport.setRenderedRange(range);\n viewport.setRenderedContentOffset(this.offsets[start] ?? 0);\n this.indexChange.next(this.indexAt(scrollOffset));\n }\n}\n\n/**\n * Wires {@link AgridVariableRowSizeStrategy} into a `cdk-virtual-scroll-viewport`.\n *\n * Apply alongside an `agridVariableRowSize` binding carrying the per-item height array. Replaces\n * the viewport's `[itemSize]` binding. The same height array is fed to every (left/body/right)\n * viewport so the panes stay row-aligned.\n * @internal\n */\n@Directive({\n selector: 'cdk-virtual-scroll-viewport[agridVariableRowSize]',\n providers: [\n {\n provide: VIRTUAL_SCROLL_STRATEGY,\n useFactory: (d: AgridVariableRowSizeDirective) => d.strategy,\n deps: [forwardRef(() => AgridVariableRowSizeDirective)],\n },\n ],\n})\nexport class AgridVariableRowSizeDirective implements OnChanges {\n /** Per-item heights in pixels, one entry per virtual-scroll item. */\n readonly itemSizes = input<number[]>([], { alias: 'agridVariableRowSize' });\n\n readonly strategy = new AgridVariableRowSizeStrategy();\n\n ngOnChanges(): void {\n this.strategy.updateItemSizes(this.itemSizes());\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n OnChanges,\n Signal,\n afterNextRender,\n afterRenderEffect,\n computed,\n effect,\n inject,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { CdkVirtualScrollViewport, ScrollingModule } from '@angular/cdk/scrolling';\nimport { NgTemplateOutlet } from '@angular/common';\nimport { AgridCellComponent } from './rendering/agrid-cell.component';\nimport { AgridPaneHeaderComponent } from './rendering/agrid-pane-header.component';\nimport { AgridBrowserAdapter } from './infrastructure/agrid-browser.adapter';\nimport { AgridClipboardHandler, CellRange } from './selection/agrid-clipboard.handler';\nimport {\n AgridColumnLayoutModel,\n AgridHeaderGroup,\n AgridHeaderGroupRun,\n} from './columns/agrid-column-layout.model';\nimport { AgridColumnVirtualizationController } from './columns/agrid-column-virtualization.controller';\nimport { AgridColumnMenuComponent } from './columns/agrid-column-menu.component';\nimport { AgridColumnMenuController } from './columns/agrid-column-menu.controller';\nimport { AgridColumnReorderController } from './columns/agrid-column-reorder.controller';\nimport { AgridColumnSizingController } from './columns/agrid-column-sizing.controller';\nimport { AgridColumnStateService } from './columns/agrid-column-state.service';\nimport { AgridControl, FilterOperator } from './agrid-control';\nimport { AgridDataSource } from './agrid-datasource';\nimport { AgridDragHandler } from './rows/agrid-drag.handler';\nimport { AgridDetailController } from './editing/agrid-detail.controller';\nimport { AgridEditController } from './editing/agrid-edit.controller';\nimport { AgridFindController } from './selection/agrid-find.controller';\nimport { AgridFindPanelComponent } from './selection/agrid-find-panel.component';\nimport { computeSelectionSummary } from './selection/agrid-selection-summary';\nimport { AgridGroupController } from './rows/agrid-group.controller';\nimport { AgridTreeController } from './rows/agrid-tree.controller';\nimport { AgridLocaleText, resolveAgridLocaleText, resolveLocale } from './agrid-localization';\nimport { AgridNavigationController } from './selection/agrid-navigation.controller';\nimport { AgridPresentationService } from './rendering/agrid-presentation.service';\nimport { resolveCellSpanAnchor } from './rendering/agrid-cell-span';\nimport { AgridMenuBarComponent } from './rendering/agrid-menu-bar.component';\nimport { AgridMenuBarController } from './rendering/agrid-menu-bar.controller';\nimport { AgridProvider, AgridSettings } from './agrid-provider';\nimport { buildPivotResult } from './agrid-pivot';\nimport { AgridProjectionModel } from './rows/agrid-projection.model';\nimport { AgridRangeController } from './selection/agrid-range.controller';\nimport { AgridCellContextMenu, AgridRowController } from './rows/agrid-row.controller';\nimport { AgridSidebarController } from './editing/agrid-sidebar.controller';\nimport {\n AgridSidebarComponent,\n AgridSidebarDetailField,\n AgridSidebarEdit,\n AgridSidebarTab,\n} from './editing/agrid-sidebar.component';\nimport {\n buildExportGroups,\n isDataRowItem as isDataRowItemFn,\n isDetailRowItem as isDetailRowItemFn,\n isGroupHeaderItem as isGroupHeaderItemFn,\n isPathTreeNodeItem as isPathTreeNodeItemFn,\n isPathTreeConfig,\n isTreeRowItem as isTreeRowItemFn,\n pathTreeNodeId,\n} from './agrid.utils';\nimport { AgridVariableRowSizeDirective } from './infrastructure/agrid-variable-row-size.strategy';\nimport {\n AgridAggregate, AgridSelectionSummary,\n AgridBodyColumn, AgridField, AgridHeaderColumn, AgridPivotConfig,\n CellContextMenuItem, CellInfoEvent, CellPosition, ColDef, ColumnHeaderActionEvent, ColumnMarkEvent, DetailAction, DetailRowItem, FilterChangeEvent, FirstDataRenderedEvent, GridEditEvent,\n GridItem, GroupAction, NewRecord, PageChangeEvent, PathTreeNodeItem, RecordEditEvent, RowClickEvent,\n RowMarkEvent, RowReorderEvent, RowSelectEvent, RowUpdateEvent, SortChangeEvent, TreeNodeClickEvent, ValidationFailedEvent, ValueOption,\n RowDetailActionEvent,\n} from './agrid.types';\n\n// Re-export for backward compatibility with existing imports of GridItem from this file.\nexport type { GridItem };\n\n/**\n * Excel-like data grid for Angular 21.\n *\n * ## Minimal setup\n * ```html\n * <agrid [provider]=\"gridProvider\" />\n * ```\n *\n * ### Keyboard shortcuts\n * | Key | Action |\n * |-----|--------|\n * | Arrow keys | Move selection |\n * | Page Up / Page Down | Move by one visible viewport page |\n * | Home / End | Move to the first / last cell in the current row |\n * | Ctrl/Cmd+Home / Ctrl/Cmd+End | Move to the first / last cell in the grid |\n * | Tab / Shift+Tab | Move right / left (wraps rows) |\n * | Enter | Enter edit mode |\n * | Ctrl/Cmd+Enter | Toggle an expandable tree node |\n * | F2 | Enter edit mode |\n * | Printable key | Enter edit mode with seeded character |\n * | Escape | Close any open menu or cancel edit |\n * | Tab / Enter (while editing) | Commit and move according to navigation settings |\n */\n@Component({\n selector: 'agrid',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n ScrollingModule,\n NgTemplateOutlet,\n AgridVariableRowSizeDirective,\n AgridCellComponent,\n AgridPaneHeaderComponent,\n AgridMenuBarComponent,\n AgridColumnMenuComponent,\n AgridFindPanelComponent,\n AgridSidebarComponent,\n ],\n templateUrl: './agrid.component.html',\n styleUrl: './agrid.component.css',\n host: {\n '[class.ag-zebra]': 'zebraStripes()',\n '[style.min-height]': 'minHeight()',\n '[style.max-height]': 'maxHeight()',\n },\n})\nexport class AgridComponent<T extends object = any> implements OnChanges {\n\n // ── Inputs ───────────────────────────────────────────────────────────────────\n\n /** Grid provider containing columns, data source, control, and options. */\n provider = input<AgridProvider<T>>(new AgridProvider<T>());\n private restoredProvider?: AgridProvider<T>;\n\n // All display / behaviour options are read from the provider.\n readonly rowHeight = computed(() => this.provider().rowHeight);\n readonly minHeight = computed(() => this.provider().minHeight);\n readonly maxHeight = computed(() => this.provider().maxHeight);\n readonly allowAddRows = computed(() => this.provider().allowAddRows && !this.provider().pivotConfig);\n readonly autoAddRows = computed(() =>\n !this.provider().pivotConfig && (this.control()?.autoAddRows() ?? false)\n );\n readonly enableRowMarking = computed(() => this.provider().enableRowMarking);\n readonly enableColumnMarking = computed(() => this.provider().enableColumnMarking);\n readonly showControlColumn = computed(() =>\n this.provider().showControlColumn || this.enableRowMarking() || this.masterDetail()\n );\n readonly controlColumnWidth = computed(() => this.enableRowMarking() ? 48 : 24);\n readonly showSidebar = computed(() => this.provider().showSidebar);\n readonly autoOpenDetail = computed(() => this.provider().autoOpenDetail);\n readonly serverSideFiltering = computed(() => this.provider().serverSideFiltering);\n readonly filterDebounceMs = computed(() => this.provider().filterDebounceMs);\n readonly enableQuickFilter = computed(() => this.provider().enableQuickFilter);\n readonly menuBarItems = computed(() => this.provider().menuBarItems);\n readonly quickFilterValue = computed(() => this.control()?.quickFilter() ?? '');\n readonly sortOption = computed(() => this.provider().sortOption);\n readonly rowSelection = computed(() => this.provider().rowSelection);\n readonly enterEditAction = computed(() => this.provider().enterEditAction);\n readonly groupDescription = computed(() => this.provider().groupDescription);\n readonly groupActions = computed(() => this.provider().groupActions);\n readonly cellMenuItems = computed(() => this.provider().cellMenuItems);\n readonly headerGroups = computed(() => this.provider().headerGroups);\n readonly treeConfig = computed(() => this.provider().treeConfig);\n /** Whether the provider is rendering a derived client-side pivot table. */\n readonly pivotMode = computed(() => !!this.provider().pivotConfig);\n readonly zebraStripes = computed(() => this.provider().zebraStripes);\n readonly showChangedCellIndicator = computed(\n () => this.provider().showChangedCellIndicator,\n );\n readonly confirmRowDelete = computed(() => this.provider().confirmRowDelete);\n readonly readonlyGrid = computed(() =>\n !!this.provider().pivotConfig || (this.control()?.readonly() ?? false)\n );\n readonly loading = computed(() => this.control()?.loading() ?? false);\n readonly emptyText = computed(() => this.provider().emptyText);\n readonly useSidebarEditor = computed(() => this.provider().useSidebarEditor);\n readonly hideGridStatusBar = computed(() => this.provider().hideGridStatusBar);\n\n /** Host callback for per-row CSS classes, or `undefined`. */\n readonly rowClassFn = computed(() => this.provider().getRowClass as\n | ((params: { row: Record<string, unknown>; index: number }) => string)\n | undefined);\n /** Host callback designating pinned rows, or `undefined`. */\n readonly pinRowFn = computed(() => this.provider().pinRow as\n | ((row: Record<string, unknown>, index: number) => 'top' | 'bottom' | undefined)\n | undefined);\n\n readonly pivotRowColumnField = computed(() => {\n return this.provider().pivotConfig?.rowField;\n })\n\n readonly pivotHeaderLabel = computed(() => {\n const aggr: AgridAggregate | undefined = this.provider().pivotConfig?.aggregate;\n const vcfield = this.provider().pivotConfig?.valueField;\n const valueColumn = this.provider().columns().find(c => c.field === vcfield);\n switch (aggr) {\n case \"sum\":\n return `${this.localeText().aggregateSum} ${valueColumn?.header ?? ''}`;\n case \"avg\":\n return `${this.localeText().aggregateAvg} ${valueColumn?.header ?? ''}`;\n case \"count\":\n return `${this.localeText().aggregateCount} ${valueColumn?.header ?? ''}`;\n case \"max\":\n return `${this.localeText().aggregateMax} ${valueColumn?.header ?? ''}`;\n case \"min\":\n return `${this.localeText().aggregateMin} ${valueColumn?.header ?? ''}`;\n default:\n return undefined;\n }\n });\n /**\n * Effective pin resolver fed to the projection: a runtime UI override wins (including an explicit\n * `null` unpin), otherwise the provider `pinRow` predicate decides. Returns `undefined` when\n * neither pinning source is active, so the projection's pinning path stays off.\n */\n readonly effectivePinRow = computed(() => {\n const predicate = this.pinRowFn();\n const overrides = this._pinnedRows();\n if (!predicate && overrides.size === 0) return undefined;\n return (row: Record<string, unknown>, index: number): 'top' | 'bottom' | undefined => {\n const override = overrides.get(index);\n if (override !== undefined) return override ?? undefined;\n return predicate?.(row, index);\n };\n });\n /** Whether master/detail is enabled and applicable (flat rows or tree leaves; not grouped). */\n readonly masterDetail = computed(\n () => this.provider().masterDetail && !!this.provider().detailRenderer\n && !this.control()?.groupByField() && !this.provider().pivotConfig,\n );\n /** Fixed detail-panel height in pixels. */\n readonly detailRowHeight = computed(() => this.provider().detailRowHeight);\n /** Column configured as the expanded panel's multiline detail field. */\n readonly detailColumn = computed<ColDef | null>(() => {\n const field = this.provider().detailColumnField;\n return field ? this.colDefs().find(col => col.field === field) ?? null : null;\n });\n /** Text-template buttons configured for the expanded panel's multiline detail field. */\n readonly detailActions = computed(() => this.provider().detailActions);\n // Detail-field editor state lives on `detailController`; re-exported below for the template.\n\n /** Read-only pivot rows and generated columns, or `null` in the normal datasource view. */\n private readonly pivotResult = computed(() => {\n const provider = this.provider();\n if (!provider.pivotConfig) return null;\n return buildPivotResult(\n provider.datasource.rows(),\n provider.columns(),\n provider.pivotConfig,\n resolveLocale(provider.options.locale),\n );\n });\n /** Reactive row projection linked into a stable datasource instance for pivot mode. */\n private readonly pivotRows = computed(() => this.pivotResult()?.rows ?? []);\n private readonly pivotDataSource = new AgridDataSource<Record<string, unknown>>();\n\n /** Column definitions from the active provider or generated by the active pivot. */\n readonly colDefs = computed<ColDef[]>(\n () => this.pivotResult()?.columns\n ?? this.provider().columns() as unknown as ColDef[],\n );\n\n /** Signal-based source rows or a derived, read-only pivot datasource. */\n readonly dataSource = computed<AgridDataSource>(() => {\n return this.pivotResult() ? this.pivotDataSource : this.provider().datasource;\n });\n\n /** Active lazy server-side row model, when configured on the provider. */\n readonly serverSideRowModel = computed(() => this.provider().serverSideRowModel);\n\n private readonly treeParentIds = computed(() => {\n const config = this.treeConfig();\n if (!config || isPathTreeConfig(config)) return new Set<string | number>();\n const ids = new Set<string | number>();\n for (const row of this.dataSource().rows()) {\n const parentId = config.getParentId(row as T);\n if (parentId !== null && parentId !== undefined) ids.add(parentId);\n }\n return ids;\n });\n\n /** Grid UI state container from the active provider. */\n readonly control = computed<AgridControl | null>(() => this.provider().control);\n\n /** Resolved locale code used for date formatting and built-in localization lookup. 'auto' is replaced with navigator.language. */\n readonly locale = computed<string>(() => resolveLocale(this.provider().options.locale));\n\n /** Resolved built-in locale text merged with provider customizations. */\n readonly localeText = computed<AgridLocaleText>(() =>\n resolveAgridLocaleText(this.provider().options.locale, this.provider().localizations)\n );\n\n /** Effective empty-state label. */\n readonly emptyTextLabel = computed<string>(() => this.emptyText() ?? this.localeText().noRows);\n\n readonly gridId = computed<string | undefined>(() => this.provider().gridId)\n\n readonly enableExportButtons = computed<boolean | undefined>(() => this.provider().enableExportButtons)\n\n // ── Outputs ──────────────────────────────────────────────────────────────────\n\n /** Emitted after the user commits a cell edit. */\n cellEdit = output<GridEditEvent<T>>();\n\n /**\n * Emitted after an edit changes a row.\n * Includes the row index, current data, provider, and data source.\n */\n recordEdit = output<RecordEditEvent<T>>();\n\n /** Emitted after a row is removed, with its former index and captured row data. */\n rowRemoved = output<RecordEditEvent<T>>();\n\n /** Emitted when the grid inserts a blank row. Use `dataSource.patchRow()` to populate it. */\n prepareAddRecord = output<NewRecord<T>>();\n\n /** Emitted when the user finishes dragging a row. Call `dataSource.moveRow()` to apply. */\n rowReorder = output<RowReorderEvent<T>>();\n\n /** Emitted when the row selection changes. `null` = selection cleared. */\n rowSelect = output<RowSelectEvent<T> | null>();\n\n /** Emitted when a row is marked or unmarked from its row header. */\n rowMark = output<RowMarkEvent<T>>();\n\n /** Emitted when a complete column is marked or unmarked from its header. */\n columnMark = output<ColumnMarkEvent<T>>();\n\n /** Emitted when a custom column-header menu command is selected. */\n columnHeaderAction = output<ColumnHeaderActionEvent<T>>();\n\n /** Emitted once after the first non-empty datasource render has completed. */\n firstDataRendered = output<FirstDataRenderedEvent<T>>();\n\n rowDoubleClicked = output<RowClickEvent<T>>();\n\n /** Emitted when the user single-clicks a data row. */\n rowClick = output<RowClickEvent<T>>();\n\n /** Emitted when the user single-clicks a generated path-tree branch node. */\n treeNodeClick = output<TreeNodeClickEvent>();\n\n /** Emitted after sidebar changes produce a new persistable grid settings snapshot. */\n settingsChange = output<AgridSettings>();\n\n /** Emitted when the user double-clicks a generated path-tree branch node. */\n treeNodeDoubleClicked = output<TreeNodeClickEvent>();\n\n /**\n * Emitted once after a changed row is left during inline editing, or when the sidebar editor\n * save button is used.\n */\n rowChanged = output<RowUpdateEvent<T>>();\n /**\n * Emitted when the user navigates to a new page in **server-side pagination mode**\n * (i.e. when `AgridControl.totalRows` is greater than zero).\n * The host should fetch the indicated row slice and update the data source.\n */\n pageChange = output<PageChangeEvent>();\n\n /** Emitted when a header filter changes in server-side filtering mode. */\n filterChange = output<FilterChangeEvent>();\n\n /** Emitted when a column sort changes in server-side filtering mode. */\n sortChange = output<SortChangeEvent>();\n\n /**\n * Emitted (debounced) when the global quick-filter text changes in server-side filtering mode.\n * The host should refetch rows matching the text. Not emitted in client mode, where the grid\n * filters locally.\n */\n quickFilterChange = output<string>();\n\n /** Emitted when a `ColDef.validate` hook rejects a committed value (inline or sidebar). */\n validationFailed = output<ValidationFailedEvent>();\n\n /** Emitted when a column's optional cell information button is clicked. */\n cellInfo = output<CellInfoEvent<T>>();\n\n /** Emitted for every enabled menu-bar button or dropdown item, carrying its configured id. */\n menuBarAction = output<string>();\n\n /** Emitted if there is a Detail pane Action without text property */\n detailAction = output<RowDetailActionEvent<T>>();\n\n // ── Public state ─────────────────────────────────────────────────────────────\n\n /** Currently focused cell, or `null`. */\n readonly selectedCell = signal<CellPosition | null>(null);\n\n /** Original indices of rows whose master/detail panel is currently expanded. */\n private readonly _expandedDetailIds = signal<Set<number>>(new Set());\n\n /**\n * Runtime per-row pin overrides set through the UI (keyed by original index). A `null` value\n * explicitly unpins a row that the `pinRow` predicate would otherwise pin. Merged with the\n * provider predicate by {@link effectivePinRow}.\n */\n private readonly _pinnedRows = signal<Map<number, 'top' | 'bottom' | null>>(new Map());\n\n private readonly markedIndices = signal<Set<number>>(new Set());\n private readonly markedFields = signal<Set<string>>(new Set());\n private firstDataRenderedEmitted = false;\n\n /** Original datasource indices marked for inclusion in copy operations. */\n readonly markedRowIndices: Signal<ReadonlySet<number>> =\n this.markedIndices.asReadonly() as Signal<ReadonlySet<number>>;\n /** Fields currently marked as complete columns. */\n readonly markedColumnFields: Signal<ReadonlySet<string>> =\n this.markedFields.asReadonly() as Signal<ReadonlySet<string>>;\n\n /** Rectangular cell range selected by Shift+arrow or Shift+click. */\n readonly selectedRange = signal<CellRange | null>(null);\n\n /** @internal Stable callback passed to child components for row-aware editability checks. */\n readonly isCellEditableForRow = (col: ColDef, originalIndex: number): boolean =>\n this.isCellEditable(col, originalIndex);\n\n /** Fill-handle drag preview bounds, in visible row/column coordinates. */\n get fillPreviewBounds() { return this.rangeController.fillPreviewBounds; }\n\n /** Position of the cell in edit mode, or `null`. */\n get editingCell() { return this.editController.editingCell; }\n\n /** Draft value while editing — committed on Tab/Enter, discarded on Escape. */\n get currentDraft() { return this.editController.currentDraft; }\n\n /** Seed character typed to enter edit mode (e.g. pressing 'A'). */\n get editSeedChar() { return this.editController.editSeedChar; }\n\n /** Whether the active text editor should select all text when it opens. */\n get selectTextOnEdit() { return this.editController.selectTextOnEdit; }\n\n /** Toggle the sidebar open/closed. */\n toggleSidebar(): void { this.sidebarController.toggle(); }\n\n /** @internal */\n onSidebarStripClick(tab: AgridSidebarTab): void {\n this.sidebarController.selectTab(tab);\n }\n\n /** @internal Replace the active pivot configuration from the sidebar controls. */\n onSidebarPivotChange(config: AgridPivotConfig): void {\n this.provider().pivotConfig = config;\n this.emitSettingsChange();\n }\n\n /** Return a detached, JSON-safe snapshot suitable for persistence by the host application. */\n saveSettings(): AgridSettings {\n return this.provider().saveSettings();\n }\n\n /** Apply a saved settings snapshot to this live grid. */\n loadSettings(settings: AgridSettings): void {\n this.provider().loadSettings(settings);\n }\n\n /** Emit when the active state is JSON-safe; custom function aggregates remain host-owned. */\n private emitSettingsChange(): void {\n try {\n this.settingsChange.emit(this.saveSettings());\n } catch (error) {\n if (!(error instanceof Error) || !error.message.includes('cannot be saved')) throw error;\n }\n }\n\n\n ngOnChanges(): void {\n const provider = this.provider();\n\n if (\n provider === this.restoredProvider ||\n !provider.gridId\n ) {\n return;\n }\n\n this.restoredProvider = provider;\n const key = `agrid_settings_${provider.gridId}`;\n const saved = localStorage.getItem(key);\n\n if (!saved) return;\n\n try {\n provider.loadSettings(JSON.parse(saved));\n } catch {\n localStorage.removeItem(key);\n }\n }\n\n /** @internal */\n onSidebarDetailEdit(event: AgridSidebarEdit): void {\n this.sidebarController.edit(event);\n }\n\n /** @internal Commit an edit made via the detail panel. */\n commitDetailEdit(field: string, col: ColDef, stringValue: string): void {\n this.sidebarController.commitEdit(field, col, stringValue);\n }\n\n onSidebarDetailSave(_event: AgridSidebarDetailField[]): void {\n const originalIndex = this.sidebarController.selectedRowIndex();\n if (originalIndex === null) return;\n this.emitRowChanged(originalIndex);\n this.emitRecordEdit(originalIndex);\n this.sidebarController.closeSidebar();\n }\n\n /** @internal */ goToFirstPage(): void { this.control()?.setPage(1); }\n /** @internal */ goToLastPage(): void { this.control()?.setPage(this.totalPages()); }\n /** @internal */ goToNextPage(): void { const c = this.control(); if (c) c.setPage(Math.min(c.currentPage() + 1, this.totalPages())); }\n /** @internal */ goToPrevPage(): void { const c = this.control(); if (c) c.setPage(Math.max(c.currentPage() - 1, 1)); }\n\n /** Resize every visible column to fit its header and current row values. */\n autosizeAllColumns(): void {\n this.columnSizing.autosizeAllColumns();\n }\n\n /** return yes if we have saved config so a autosize from the client can be surpressed */\n hasSavedSizeConfig(): boolean {\n const provider = this.provider();\n const key = `agrid_settings_${provider.gridId}`;\n const saved = localStorage.getItem(key);\n try {\n if (saved !== null) {\n const config = JSON.parse(saved);\n return config && config.control && config.control.columnWidths;\n }\n return false;\n } catch (error) {\n return false;\n }\n }\n /**\n * Clears changed-cell markers after persistence succeeds.\n * Omit `originalIndex` to clear every marker; omit `fields` to clear the whole row.\n */\n clearChangedCells(originalIndex?: number, fields?: readonly string[]): void {\n this.control()?.clearChangedCells(originalIndex, fields);\n }\n\n /** @internal Whether a cell has an unsaved-change marker. */\n isCellChanged(originalIndex: number, field: string): boolean {\n return this.control()?.isCellChanged(originalIndex, field) ?? false;\n }\n\n /** @internal Whether a row is currently in the colored phase of a control indication. */\n rowIndicationActive(originalIndex: number): boolean {\n return this.control()?.rowIndications().has(originalIndex) ?? false;\n }\n\n /** @internal CSS color for a transient row indication. */\n rowIndicationColor(originalIndex: number): string | null {\n return this.control()?.rowIndications().get(originalIndex)?.color ?? null;\n }\n\n /** @internal Fade duration for a transient row indication. */\n rowIndicationDuration(originalIndex: number): number | null {\n return this.control()?.rowIndications().get(originalIndex)?.durationMs ?? null;\n }\n\n /** @internal Full display value for a cell — used as the `title` tooltip attribute. */\n getCellTitle(col: ColDef, value: unknown): string {\n return this.presentation.getCellTitle(col, value);\n }\n\n /** @internal Dynamic CSS class string for a cell from `ColDef.cellClass`. */\n getCellClass(col: ColDef, value: unknown, row: Record<string, unknown>): string {\n return this.presentation.getCellClass(col, value, row);\n }\n\n /** @internal Short symbol shown before the footer aggregate value. */\n getAggregateLabel(col: ColDef): string {\n return this.presentation.getAggregateLabel(col);\n }\n\n /** @internal Whether a column has a static or control-configured aggregate. */\n hasAggregate(col: ColDef): boolean {\n return this.presentation.hasAggregate(col);\n }\n\n /** @internal Formatted footer value — uses the column formatter when set, otherwise locale number. */\n getFooterDisplay(col: ColDef, value: unknown): string {\n return this.presentation.getFooterDisplay(col, value);\n }\n\n // ── Internal signals ─────────────────────────────────────────────────────────\n\n private readonly groupController = new AgridGroupController({\n control: this.control,\n groupDescription: this.groupDescription,\n });\n\n readonly treeController = new AgridTreeController();\n\n // ── Derived state ─────────────────────────────────────────────────────────────\n\n readonly allowRowReorder = computed(() =>\n (this.control()?.allowRowReorder() ?? false)\n && !this.control()?.groupByField()\n && !this.provider().pivotConfig\n );\n\n /** `true` when there is a committed edit that can be undone (Ctrl+Z). */\n readonly canUndo = computed(() => this.control()?.canUndo() ?? false);\n\n /** `true` when there is a previously undone edit that can be re-applied (Ctrl+Y / Ctrl+Shift+Z). */\n readonly canRedo = computed(() => this.control()?.canRedo() ?? false);\n\n private readonly columnLayout = new AgridColumnLayoutModel({\n control: this.control,\n colDefs: this.colDefs,\n headerGroups: this.headerGroups,\n showControlColumn: this.showControlColumn,\n controlColumnWidth: this.controlColumnWidth,\n getColumnWidth: col => this.getColumnWidth(col),\n getColumnWidthToken: col => this.getColumnWidthToken(col),\n });\n\n /** Columns currently visible after hidden state, ordering, and pinning are applied. */\n readonly visibleColDefs = this.columnLayout.visibleColDefs;\n /** Columns currently pinned to the left in display order. */\n readonly pinnedColDefs = this.columnLayout.pinnedColDefs;\n /** Columns currently pinned to the right in display order. */\n readonly rightPinnedColDefs = this.columnLayout.rightPinnedColDefs;\n /** Columns rendered in the horizontally scrollable pane. */\n readonly scrollableColDefs = this.columnLayout.scrollableColDefs;\n readonly rightGridTemplateColumns = this.columnLayout.rightGridTemplateColumns;\n readonly rightPinnedPaneWidth = this.columnLayout.rightPinnedPaneWidth;\n readonly hasRightPinnedPane = this.columnLayout.hasRightPinnedPane;\n readonly hasPinnedPane = this.columnLayout.hasPinnedPane;\n readonly hasFilterableColumns = this.columnLayout.hasFilterableColumns;\n readonly hasHeaderGroups = this.columnLayout.hasHeaderGroups;\n readonly pinnedHeaderGroupRuns = this.columnLayout.pinnedHeaderGroupRuns;\n readonly scrollableHeaderGroupRuns = this.columnLayout.scrollableHeaderGroupRuns;\n readonly rightHeaderGroupRuns = this.columnLayout.rightHeaderGroupRuns;\n\n /** @internal Header view-model for the left-pinned, scrollable, and right-pinned panes. */\n readonly pinnedHeaderColumns = computed(() => this.buildHeaderColumns(this.pinnedColDefs()));\n readonly scrollableHeaderColumns = computed(() => this.buildHeaderColumns(this.scrollableColDefs()));\n readonly rightHeaderColumns = computed(() => this.buildHeaderColumns(this.rightPinnedColDefs()));\n\n /** @internal Grouped-header view-model per pane (run + reactive lock/drag state). */\n readonly pinnedHeaderGroups = computed(() => this.buildHeaderGroups(this.pinnedHeaderGroupRuns()));\n readonly scrollableHeaderGroups = computed(() =>\n this.buildHeaderGroups(this.scrollableHeaderGroupRuns())\n );\n readonly rightHeaderGroups = computed(() => this.buildHeaderGroups(this.rightHeaderGroupRuns()));\n\n /**\n * Resolves every per-column header/filter binding into a flat view-model. Called from the\n * pane header computeds; reads the same signal-backed helpers the template used directly, so\n * the result is memoized and recomputed only when sort/filter/drag/sizing state changes.\n */\n private buildHeaderColumns(cols: ColDef[]): AgridHeaderColumn[] {\n return cols.map(col => {\n const field = col.field;\n return {\n col,\n field,\n ariaColIndex: this.getAriaColIndex(this.getVisibleColIndex(field)),\n sort: this.getSort(field),\n sortPriority: this.getSortPriority(field),\n hasFilter: this.hasActiveFilter(field),\n dragging: this.isColDragging(field),\n dropSide: this.getColDropSide(field),\n reorderOffset: this.getColReorderOffset(field),\n grouped: this.isGroupedByField(field),\n lastPinned: this.isLastPinnedColumn(field),\n firstRightPinned: this.isFirstRightPinnedColumn(field),\n columnWidth: this.getColumnWidth(col),\n textFilter: this.getTextFilter(field),\n menuFilterType: this.getMenuFilterType(field),\n hasCondition: this.getMenuOperator(field) !== null,\n conditionLabel: this.getConditionButtonLabel(field),\n };\n });\n }\n\n private buildHeaderGroups(runs: AgridHeaderGroupRun[]): AgridHeaderGroup[] {\n return runs.map(run => ({\n ...run,\n locked: this.isHeaderGroupLocked(run.fields),\n dragging: this.isHeaderGroupDragging(run.fields),\n }));\n }\n\n /** @internal Body view-model for the left-pinned, scrollable, and right-pinned panes. */\n readonly pinnedBodyColumns = computed(() => this.buildBodyColumns(this.pinnedColDefs()));\n readonly scrollableBodyColumns = computed(() => this.buildBodyColumns(this.scrollableColDefs()));\n readonly rightBodyColumns = computed(() => this.buildBodyColumns(this.rightPinnedColDefs()));\n\n /**\n * Resolves the per-column bindings shared by every data, footer, and ghost cell. Reads only\n * layout/drag/pinning signals, so the result is reused across all rows and recomputes only\n * when columns move, resize, drag, or change pinning.\n */\n private buildBodyColumns(cols: ColDef[]): AgridBodyColumn[] {\n return cols.map(col => {\n const field = col.field;\n const visibleColIndex = this.getVisibleColIndex(field);\n return {\n col,\n field,\n visibleColIndex,\n ariaColIndex: this.getAriaColIndex(visibleColIndex),\n dragging: this.isColDragging(field),\n reorderOffset: this.getColReorderOffset(field),\n lastPinned: this.isLastPinnedColumn(field),\n firstRightPinned: this.isFirstRightPinnedColumn(field),\n };\n });\n }\n\n\n private readonly columnState = new AgridColumnStateService({\n control: this.control,\n colDefs: this.colDefs,\n visibleColDefs: this.visibleColDefs,\n pinnedColDefs: this.pinnedColDefs,\n rightPinnedColDefs: this.rightPinnedColDefs,\n showControlColumn: this.showControlColumn,\n });\n\n private readonly projection: AgridProjectionModel = new AgridProjectionModel({\n dataSource: this.dataSource,\n control: this.control,\n colDefs: this.colDefs,\n visibleColDefs: this.visibleColDefs,\n locale: this.locale,\n serverSideFiltering: this.serverSideFiltering,\n sortOption: this.sortOption,\n allowAddRows: this.allowAddRows,\n autoAddRows: this.autoAddRows,\n expandedGroups: this.groupController.expandedGroups,\n treeConfig: this.treeConfig,\n pivotMode: this.pivotMode,\n expandedTreeIds: this.treeController.expandedIds,\n pinRow: this.effectivePinRow,\n masterDetail: this.masterDetail,\n expandedDetailIds: this._expandedDetailIds,\n });\n\n private readonly editController = new AgridEditController({\n control: this.control,\n dataSource: this.dataSource,\n visibleColDefs: this.visibleColDefs,\n readonlyGrid: this.readonlyGrid,\n selectedCell: this.selectedCell,\n selectedRange: this.selectedRange,\n findDisplayIndex: originalIndex => this.findDisplayIndex(originalIndex),\n scrollToCell: (displayIndex, colIndex) => this.scrollToKeepVisible(displayIndex, colIndex),\n focusGrid: () => this.wrapperEl().nativeElement.focus(),\n onCellEdit: event => this.emitEditEvents(event),\n onValidationFailed: event => this.validationFailed.emit({ ...event, source: 'inline' }),\n });\n\n /** Total filtered row count regardless of current page. */\n readonly filteredRowCount = this.projection.filteredRowCount;\n\n /** Total number of pages given the current filter and page size. */\n readonly totalPages = this.projection.totalPages;\n\n readonly showPagination = this.projection.showPagination;\n\n /** Number of semantic header rows currently rendered. */\n readonly headerRowCount = computed(() => this.hasHeaderGroups() ? 2 : 1);\n\n /** Number of rendered semantic rows, including header and pinned rows. */\n readonly ariaRowCount = computed(() =>\n this.displayItems().length + this.headerRowCount() + (this.showFooter() ? 1 : 0)\n + this.pinnedTopItems().length + this.pinnedBottomItems().length\n );\n\n /** Number of visible semantic columns, including the optional control column. */\n readonly ariaColCount = computed(() =>\n this.visibleColDefs().length + (this.showControlColumn() ? 1 : 0)\n );\n\n /** True when no rows or group headers are visible (ignores add-row sentinel and ghost). */\n readonly isEmpty = computed(() =>\n !this.loading() && this.filteredItems().every(item => item === null || item === 'ghost')\n );\n\n /**\n * @internal Effective aggregate for the column menu — string values only.\n * Custom function aggregates from ColDef can't be represented in the menu so they return null.\n */\n getEffectiveAggregate(col: ColDef): 'sum' | 'avg' | 'min' | 'max' | 'count' | null {\n const ctrlAgg = this.control()?.aggregates()[col.field];\n if (ctrlAgg !== undefined) return ctrlAgg;\n const colAgg = col.aggregate;\n return typeof colAgg === 'string' ? colAgg : null;\n }\n\n /** True when at least one visible column has an aggregate function (from ColDef or control). */\n readonly showFooter = this.projection.showFooter;\n\n /** Computed aggregate value per column field, over currently filtered rows. */\n readonly footerValues = this.projection.footerValues;\n\n readonly gridTemplateColumns = this.columnLayout.gridTemplateColumns;\n readonly pinnedGridTemplateColumns = this.columnLayout.pinnedGridTemplateColumns;\n readonly scrollableGridTemplateColumns = this.columnLayout.scrollableGridTemplateColumns;\n readonly totalWidth = this.columnLayout.totalWidth;\n readonly pinnedPaneWidth = this.columnLayout.pinnedPaneWidth;\n readonly scrollableTotalWidth = this.columnLayout.scrollableTotalWidth;\n\n /** Live horizontal scroll metrics of the scrollable pane, fed to column virtualization. */\n private readonly colScrollLeft = signal(0);\n private readonly colViewportWidth = signal(0);\n\n /** Scrollable-column count above which column virtualization activates. */\n readonly columnVirtualizationThreshold = computed(\n () => this.provider().columnVirtualizationThreshold,\n );\n\n /** Windows the scrollable-pane columns to those near the horizontal viewport. */\n private readonly columnVirtualization = new AgridColumnVirtualizationController({\n columnWidths: computed(() => this.scrollableColDefs().map(col => this.getColumnWidth(col))),\n scrollLeft: this.colScrollLeft,\n viewportWidth: this.colViewportWidth,\n minColumns: this.columnVirtualizationThreshold,\n });\n\n /** @internal Current rendered column window (full set + zero spacers when inactive). */\n readonly columnWindow = this.columnVirtualization.window;\n\n /** @internal Scrollable body columns sliced to the active window. */\n readonly virtualScrollableBodyColumns = computed(() => {\n const window = this.columnWindow();\n return this.scrollableBodyColumns().slice(window.start, window.end);\n });\n\n /** @internal Number of hidden scrollable columns after the window (trailing spacer span). */\n readonly columnWindowRightSpan = computed(() =>\n this.scrollableBodyColumns().length - this.columnWindow().end,\n );\n\n /**\n * Filtered, sorted, and optionally grouped row list for `*cdkVirtualFor`.\n * Appends `null` when the explicit add-row placeholder is active.\n */\n readonly filteredItems: Signal<GridItem[]> = this.projection.filteredItems;\n\n /**\n * @internal The full filtered + sorted row set (grouping/pagination ignored). Reused for export\n * and published to the provider as `visibleRows` so charts and consumers can react to filters.\n */\n readonly ɵvisibleRows = computed(() => {\n const rows = this.dataSource().rows();\n return this.projection.filteredSortedIndices()\n .map(index => rows[index])\n .filter((row): row is Record<string, unknown> => !!row);\n });\n\n /** Virtual scroll source — injects ghost row during a reorder drag. */\n /** Maps originalIndex → true if the data row should receive the odd-row stripe. Counts only data rows, so group headers don't shift the pattern. */\n readonly dataRowIsOdd = computed<Map<number, boolean>>(() => {\n const map = new Map<number, boolean>();\n let rank = 0;\n for (const item of this.filteredItems()) {\n if (isDataRowItemFn(item)) map.set(item.originalIndex, (rank++ % 2) !== 0);\n }\n return map;\n });\n\n readonly displayItems = computed<GridItem[]>(() => {\n const items = this.filteredItems();\n const dragIdx = this.dragHandler.reorderOriginalIndex();\n if (dragIdx === null) return items;\n\n const sourcePos = items.findIndex(item => isDataRowItemFn(item) && item.originalIndex === dragIdx);\n const withoutSource: GridItem[] = sourcePos === -1\n ? [...items]\n : [...items.slice(0, sourcePos), ...items.slice(sourcePos + 1)];\n\n const overIdx = this.dragHandler.reorderOverIndex();\n if (overIdx === null) return withoutSource;\n\n const targetPos = withoutSource.findIndex(item => isDataRowItemFn(item) && item.originalIndex === overIdx);\n if (targetPos === -1) return withoutSource;\n\n const insertAt = this.dragHandler.reorderInsertBefore() ? targetPos : targetPos + 1;\n const result = [...withoutSource];\n result.splice(insertAt, 0, 'ghost');\n return result;\n });\n\n /** Rows pinned to the top of the body (rendered in a fixed container, outside virtual scroll). */\n readonly pinnedTopItems = this.projection.pinnedTopItems;\n /** Rows pinned to the bottom of the body (rendered in a fixed container, outside virtual scroll). */\n readonly pinnedBottomItems = this.projection.pinnedBottomItems;\n /** Whether any top-pinned rows are present. */\n readonly hasPinnedTopRows = computed(() => this.pinnedTopItems().length > 0);\n /** Whether any bottom-pinned rows are present. */\n readonly hasPinnedBottomRows = computed(() => this.pinnedBottomItems().length > 0);\n\n /**\n * Per-item heights fed to the variable-size virtual-scroll strategy: a detail panel uses the\n * configured detail height, every other row uses the standard row height. With no detail rows\n * open the array is uniform, so scrolling matches the fixed-size strategy.\n */\n readonly itemSizes = computed<number[]>(() => {\n const h = this.rowHeight();\n const dh = this.detailRowHeight();\n return this.displayItems().map(item => (isDetailRowItemFn(item) ? dh : h));\n });\n\n // ── Menu signals ─────────────────────────────────────────────────────────────\n\n readonly groupActionsMenu = this.groupController.actionsMenu;\n\n // ── Infrastructure ────────────────────────────────────────────────────────────\n\n private readonly viewport = viewChild.required<CdkVirtualScrollViewport>('scrollViewport');\n private readonly pinnedViewport = viewChild<CdkVirtualScrollViewport>('pinnedViewport');\n private readonly rightPinnedViewport = viewChild<CdkVirtualScrollViewport>('rightPinnedViewport');\n private readonly wrapperEl = viewChild.required<ElementRef<HTMLDivElement>>('wrapper');\n private readonly horizontalScrollerEl =\n viewChild.required<ElementRef<HTMLDivElement>>('horizontalScroller');\n private readonly destroyRef = inject(DestroyRef);\n private readonly _hostEl = inject(ElementRef<HTMLElement>);\n private readonly browser = new AgridBrowserAdapter();\n private viewReady = false;\n\n private readonly rangeController = new AgridRangeController({\n control: this.control,\n dataSource: this.dataSource,\n filteredItems: this.filteredItems,\n visibleColDefs: this.visibleColDefs,\n selectedCell: this.selectedCell,\n selectedRange: this.selectedRange,\n isCellEditable: (col, originalIndex) => this.isCellEditable(col, originalIndex),\n cancelEdit: () => this.cancelCurrent(),\n findDisplayIndex: originalIndex => this.findDisplayIndex(originalIndex),\n scrollToCell: (displayIndex, colIndex) => this.scrollToKeepVisible(displayIndex, colIndex),\n verticalViewportElement: () => this.viewport().elementRef.nativeElement,\n horizontalViewportElement: () => this.horizontalScrollerEl().nativeElement,\n onCellEdit: event => this.emitEditEvents(event),\n }, this.destroyRef);\n\n /** Live numeric statistics for the active cell or rectangular range. */\n readonly selectionSummary = computed<AgridSelectionSummary | null>(() =>\n computeSelectionSummary(\n this.filteredItems(),\n this.visibleColDefs(),\n this.rangeController.getActiveSelectionBounds(),\n )\n );\n\n /** Locale-formatted status-bar values derived from {@link selectionSummary}. */\n readonly selectionSummaryDisplay = computed(() => {\n const summary = this.selectionSummary();\n if (!summary) return null;\n const locale = this.locale();\n const format = (value: number): string => value.toLocaleString(locale, {\n maximumFractionDigits: 2,\n });\n return {\n count: summary.count.toLocaleString(locale),\n sum: format(summary.sum),\n average: format(summary.average),\n min: format(summary.min),\n max: format(summary.max),\n };\n });\n\n private readonly columnSizing = new AgridColumnSizingController({\n control: this.control,\n filteredItems: this.filteredItems,\n visibleColDefs: this.visibleColDefs,\n scrollableColDefs: this.scrollableColDefs,\n locale: this.locale,\n isColumnPinned: field => this.isColumnPinned(field),\n wrapperElement: () => this.wrapperEl().nativeElement,\n scrollerElement: () => this.horizontalScrollerEl().nativeElement,\n }, this.destroyRef);\n\n private readonly columnMenuController = new AgridColumnMenuController({\n control: this.control,\n dataSource: this.dataSource,\n colDefs: this.colDefs,\n serverSideFiltering: this.serverSideFiltering,\n filterDebounceMs: this.filterDebounceMs,\n sortOption: this.sortOption,\n effectiveSortOrder: () => this.projection.effectiveSortOrder(),\n autosizeColumn: col => this.columnSizing.autosizeColumn(col),\n onFilterChange: event => this.filterChange.emit(event),\n onSortChange: event => this.sortChange.emit(event),\n }, this.destroyRef);\n\n readonly filterMenu = this.columnMenuController.menu;\n readonly filterMenuSearch = this.columnMenuController.search;\n readonly filterMenuItems = this.columnMenuController.items;\n readonly filterMenuVisibleItems = this.columnMenuController.visibleItems;\n readonly filterMenuActiveValues = this.columnMenuController.activeValues;\n readonly columnMenuValueItems = this.columnMenuController.valueItems;\n\n private readonly presentation = new AgridPresentationService({\n control: this.control,\n visibleColDefs: this.visibleColDefs,\n // Export the full filtered + sorted set, not the rendered projection: grouping,\n // pagination, and collapsed groups must not drop rows from the file.\n exportRows: this.ɵvisibleRows,\n // When grouped, export a fully-expanded grouped structure with subtotals (xlsx outline).\n exportGroups: computed(() => {\n const control = this.control();\n const groupField = control?.groupByField();\n if (!control || !groupField || this.pivotMode()) return null;\n const cols = this.visibleColDefs();\n const groupCol = cols.find(col => col.field === groupField)\n ?? this.colDefs().find(col => col.field === groupField);\n return buildExportGroups(\n this.dataSource().rows(),\n this.projection.filteredSortedIndices(),\n groupField,\n groupCol,\n cols,\n control.aggregates(),\n this.locale(),\n );\n }),\n locale: this.locale,\n getRowClass: this.rowClassFn,\n });\n\n private readonly findController = new AgridFindController({\n dataSource: this.dataSource,\n filteredSortedIndices: this.projection.filteredSortedIndices,\n visibleColDefs: this.visibleColDefs,\n locale: this.locale,\n selectedCell: this.selectedCell,\n selectedRange: this.selectedRange,\n revealMatch: (originalIndex, colIndex) => this.revealFindMatch(originalIndex, colIndex),\n focusGrid: () => this.wrapperEl().nativeElement.focus(),\n });\n\n readonly findOpen = this.findController.open;\n readonly findQuery = this.findController.query;\n readonly findActiveIndex = this.findController.activeIndex;\n readonly findMatches = this.findController.matches;\n\n private readonly detailController = new AgridDetailController<T>({\n dataSource: this.dataSource,\n control: this.control,\n detailColumn: this.detailColumn,\n locale: this.locale,\n displayItems: this.displayItems,\n visibleColDefs: this.visibleColDefs,\n selectedCell: this.selectedCell,\n selectedRange: this.selectedRange,\n editingCell: this.editController.editingCell,\n isCellEditable: (col, originalIndex) => this.isCellEditable(col, originalIndex),\n renderDetailHtml: row => this.provider().detailRenderer?.({ row: row as T }) ?? '',\n emitEditEvents: event => this.emitEditEvents(event),\n emitValidationFailed: event => this.validationFailed.emit(event),\n emitDetailAction: event => this.detailAction.emit(event),\n schedule: fn => this.browser.schedule(fn),\n queryTextarea: rowIndex =>\n (this._hostEl.nativeElement as HTMLElement).querySelector<HTMLTextAreaElement>(\n `textarea[data-detail-row=\"${rowIndex}\"]`,\n ),\n });\n\n /** @internal Detail-field editor state, re-exported for the template. */\n readonly detailEditingRow = this.detailController.editingRow;\n readonly detailDraft = this.detailController.draft;\n readonly detailValidationError = this.detailController.validationError;\n\n private readonly navigationController = new AgridNavigationController({\n control: this.control,\n dataSource: this.dataSource,\n filteredItems: this.filteredItems,\n filteredSortedIndices: this.projection.filteredSortedIndices,\n colDefs: this.colDefs,\n visibleColDefs: this.visibleColDefs,\n rowHeight: this.rowHeight,\n allowAddRows: this.allowAddRows,\n autoAddRows: this.autoAddRows,\n enterEditAction: this.enterEditAction,\n selectedCell: this.selectedCell,\n selectedRange: this.selectedRange,\n editingCell: this.editController.editingCell,\n isEditing: (originalIndex, colIndex) => this.isEditing(originalIndex, colIndex),\n isCellEditable: (col, originalIndex) => this.editController.isCellEditable(col, originalIndex),\n toggleTreeCell: (originalIndex, colIndex) =>\n this.toggleTreeCell(originalIndex, colIndex),\n startEdit: (originalIndex, colIndex, seedChar, selectText) =>\n this.editController.start(originalIndex, colIndex, seedChar, selectText),\n commitEdit: () => this.editController.commit(),\n cancelEdit: () => this.editController.cancel(),\n undoEdit: () => this.editController.undo(),\n redoEdit: () => this.editController.redo(),\n extendRangeTo: (originalIndex, colIndex) =>\n this.rangeController.extendTo(originalIndex, colIndex),\n openFind: () => this.findController.show(),\n focusGrid: () => this.wrapperEl().nativeElement.focus(),\n viewport: () => this.viewport(),\n scrollColumnToKeepVisible: colIndex =>\n this.columnSizing.scrollColumnToKeepVisible(colIndex),\n resolveCellColumn: (originalIndex, colIndex, direction) =>\n this.resolveSpannedColumn(originalIndex, colIndex, direction),\n onPrepareAddRecord: event => this.prepareAddRecord.emit({\n ...event,\n provider: this.provider(),\n datasource: this.dataSource(),\n }),\n });\n\n /** Maps logical covered columns to a rendered span anchor (or past it when moving right). */\n private resolveSpannedColumn(originalIndex: number, colIndex: number, direction: -1 | 0 | 1): number {\n const row = this.dataSource().getRow(originalIndex);\n const visible = this.visibleColDefs();\n const col = visible[colIndex];\n if (!row || !col) return colIndex;\n\n const panes = [this.pinnedColDefs(), this.scrollableColDefs(), this.rightPinnedColDefs()];\n const pane = panes.find(columns => columns.includes(col));\n if (!pane) return colIndex;\n const paneIndex = pane.indexOf(col);\n const anchor = resolveCellSpanAnchor(pane, paneIndex, row, originalIndex);\n if (anchor.anchorIndex === paneIndex) return colIndex;\n\n const targetPaneIndex = direction > 0 ? anchor.anchorIndex + anchor.span : anchor.anchorIndex;\n const target = pane[targetPaneIndex];\n if (target) return visible.indexOf(target);\n return direction > 0 ? colIndex + 1 : visible.indexOf(pane[anchor.anchorIndex]);\n }\n\n private readonly rowController = new AgridRowController({\n dataSource: this.dataSource,\n filteredItems: this.filteredItems,\n visibleColDefs: this.visibleColDefs,\n locale: this.locale,\n markedRowIndices: this.markedRowIndices,\n rowSelection: this.rowSelection,\n selectedCell: this.selectedCell,\n editingCell: this.editController.editingCell,\n insertRowAt: index => {\n this.reconcileMarkedRowsAfterInsertion(index);\n this.navigationController.insertRowAt(index);\n },\n startDragSelect: originalIndex => this.dragHandler.startDragSelect(originalIndex),\n onRowSelect: event => this.rowSelect.emit(event),\n onRowClick: event => this.rowClick.emit(event),\n onRowRemoved: event => {\n this.reconcileDirtyInlineRowsAfterRemoval(event.index);\n this.reconcileMarkedRowsAfterRemoval(event.index);\n this.rowRemoved.emit(this.createRecordEvent(event.index, event.data));\n },\n onEditRowRemoved: originalIndex => this.editController.onRowRemoved(originalIndex),\n closeFilterMenu: () => this.columnMenuController.close(),\n closeGroupActionsMenu: () => this.closeGroupActionsMenu(),\n confirmRowDelete: this.confirmRowDelete,\n focusDeleteConfirmButton: () => {\n (this._hostEl.nativeElement as HTMLElement)\n .querySelector<HTMLButtonElement>('[data-delete-confirm-no]')\n ?.focus();\n },\n focusGrid: () => this.wrapperEl().nativeElement.focus(),\n measureScroller: () => {\n const scroller = this.horizontalScrollerEl().nativeElement;\n return { left: scroller.scrollLeft, width: scroller.clientWidth };\n },\n });\n\n readonly selectedRowIndices = this.rowController.selectedRowIndices;\n readonly selectedRowIndex = this.rowController.selectedRowIndex;\n readonly contextMenu = this.rowController.contextMenu;\n readonly cellContextMenuState = this.rowController.cellContextMenu;\n readonly pendingDeleteRow = this.rowController.pendingDeleteRow;\n readonly deleteConfirmationLeft = this.rowController.deleteConfirmationLeft;\n readonly deleteConfirmationWidth = this.rowController.deleteConfirmationWidth;\n\n private readonly menuBarController = new AgridMenuBarController<T>({\n dataSource: this.dataSource,\n provider: this.provider,\n selectedRowIndices: this.selectedRowIndices,\n selectedCell: this.selectedCell,\n menuBarItems: this.menuBarItems,\n gridId: this.gridId,\n enableExportButtons: this.enableExportButtons,\n saveConfigLabel: computed(() => this.localeText().saveConfig),\n exportLabel: computed(() => this.localeText().export),\n exportCsvLabel: computed(() => this.localeText().exportCsv),\n exportXlsxLabel: computed(() => this.localeText().exportXlsx),\n emitAction: id => this.menuBarAction.emit(id),\n closeOtherMenus: () => {\n this.rowController.closeContextMenu();\n this.rowController.closeCellContextMenu();\n this.groupController.closeActionsMenu();\n this.columnMenuController.close();\n },\n persistSettings: () => {\n const gridConfig = this.provider().saveSettings();\n localStorage.setItem(`agrid_settings_${this.gridId()}`, JSON.stringify(gridConfig));\n },\n exportData: (format) => {\n switch (format) {\n case 'csv': \n this.provider().exportCsv();\n break;\n case 'xlsx':\n this.provider().exportXlsx();\n break;\n }\n },\n });\n\n /** Id of the menu-bar button whose dropdown is open, or `null`. */\n readonly openMenuBarItemId = this.menuBarController.openItemId;\n /** Runtime state passed to menu-bar visibility, active, and disabled resolvers. */\n readonly menuBarContext = this.menuBarController.context;\n /** Menu-bar buttons currently allowed by their visibility resolvers. */\n readonly visibleMenuBarItems = this.menuBarController.visibleItems;\n\n private readonly sidebarController = new AgridSidebarController({\n control: this.control,\n dataSource: this.dataSource,\n colDefs: this.colDefs,\n visibleColDefs: this.visibleColDefs,\n selectedRowIndex: this.selectedRowIndex,\n autoOpenDetail: this.autoOpenDetail,\n useSidebarEditor: this.useSidebarEditor,\n isCellEditable: (col, originalIndex) => this.isCellEditable(col, originalIndex),\n onFieldChange: event => this.markCellChanged(event),\n onCellEdit: event => this.emitSidebarEditEvents(event),\n onValidationFailed: event => this.validationFailed.emit({ ...event, source: 'sidebar' }),\n });\n\n readonly sidebarOpen = this.sidebarController.open;\n /** @internal Per-field sidebar validation messages. */\n readonly sidebarValidationErrors = this.sidebarController.validationErrors;\n readonly sidebarTab = this.sidebarController.tab;\n readonly sidebarRow = this.sidebarController.row;\n readonly sidebarHiddenColumns = this.sidebarController.hiddenColumns;\n /** Original provider columns used as pivot field choices. */\n readonly sidebarPivotColumns = computed<ColDef[]>(\n () => this.provider().columns() as unknown as ColDef[],\n );\n\n private readonly clipboardHandler = new AgridClipboardHandler({\n control: this.control,\n dataSource: this.dataSource,\n filteredItems: this.filteredItems,\n visibleColDefs: this.visibleColDefs,\n locale: this.locale,\n selectedCell: this.selectedCell,\n selectedRange: this.selectedRange,\n markedRowIndices: this.markedRowIndices,\n isCellEditable: (col, originalIndex) => this.isCellEditable(col, originalIndex),\n onCellEdit: event => this.emitEditEvents(event),\n scrollToCell: (displayIndex, colIndex) => this.scrollToKeepVisible(displayIndex, colIndex),\n });\n\n readonly dragHandler = new AgridDragHandler({\n dataSource: this.dataSource,\n filteredItems: () => this.filteredItems(),\n locale: () => this.locale(),\n selectedIndices: this.rowController.selectedIndices,\n onReorder: e => {\n this.reconcileMarkedRowsAfterMove(e.oldIndex, e.newIndex);\n this.rowReorder.emit(e);\n },\n onSelectionChange: () => this.rowController.emitSelection(),\n }, this.destroyRef);\n\n private readonly columnReorder = new AgridColumnReorderController({\n control: this.control,\n visibleColDefs: this.visibleColDefs,\n getColDef: field => this.getColDef(field),\n }, this.destroyRef);\n\n readonly columnDragPreview = this.columnReorder.preview;\n\n /** @internal Start a column header drag. */\n onColHeaderPointerDown(event: PointerEvent, field: string): void {\n this.columnReorder.start(event, field);\n }\n\n /** @internal Toggles a complete column when its non-interactive header surface is clicked. */\n onColHeaderClick(event: MouseEvent, field: string): void {\n const target = event.target as Element | null;\n if (!this.enableColumnMarking() || target?.closest('button, input, .ag-resize-handle')) return;\n this.toggleColumnMarked(field);\n }\n\n /** @internal Start dragging all columns in one contiguous grouped-header segment. */\n onHeaderGroupPointerDown(event: PointerEvent, fields: string[], label: string): void {\n this.columnReorder.startGroup(event, fields, label);\n }\n\n /** @internal Whether any field in a grouped-header segment is being dragged. */\n isHeaderGroupDragging(fields: string[]): boolean {\n return fields.some(field => this.columnReorder.isDragging(field));\n }\n\n /** @internal Whether a grouped-header segment contains a locked column. */\n isHeaderGroupLocked(fields: string[]): boolean {\n return fields.some(field => this.getColDef(field)?.locked);\n }\n\n /** @internal Whether the given column header is being dragged. */\n isColDragging(field: string): boolean {\n return this.columnReorder.isDragging(field);\n }\n\n /** @internal Template helper for drop-indicator class. */\n getColDropSide(field: string): 'before' | 'after' | null {\n return this.columnReorder.getDropSide(field);\n }\n\n /** @internal Horizontal animation offset for a header during column reordering. */\n getColReorderOffset(field: string): number {\n return this.columnReorder.getHeaderOffset(field);\n }\n\n hasContextMenuEntries() {\n const hme = (!this.readonlyGrid() && !this.treeConfig())\n return hme;\n }\n\n // ── Setup ─────────────────────────────────────────────────────────────────────\n\n private readonly _seededControls = new WeakSet<AgridControl>();\n private readonly dirtyInlineRows = new Set<number>();\n private dirtyRowsDataSource: AgridDataSource | null = null;\n private changedCellsDataSource: AgridDataSource | null = null;\n\n private emitEditEvents(event: GridEditEvent): void {\n this.cellEdit.emit(event as GridEditEvent<T>);\n this.emitRecordEdit(event.position.rowIndex);\n this.markInlineRowDirty(event.position.rowIndex);\n this.markCellChanged(event);\n }\n\n private emitSidebarEditEvents(event: GridEditEvent): void {\n this.cellEdit.emit(event as GridEditEvent<T>);\n this.emitRecordEdit(event.position.rowIndex);\n }\n\n private emitRecordEdit(index: number): void {\n const datasource = this.dataSource();\n const event = this.createRecordEvent(index, datasource.getRow(index));\n queueMicrotask(() => this.recordEdit.emit(event));\n }\n\n private markInlineRowDirty(index: number): void {\n const datasource = this.dataSource();\n if (this.dirtyRowsDataSource !== datasource) {\n this.dirtyInlineRows.clear();\n this.dirtyRowsDataSource = datasource;\n }\n this.dirtyInlineRows.add(index);\n }\n\n private markCellChanged(event: GridEditEvent): void {\n if (!this.showChangedCellIndicator()) return;\n const datasource = this.dataSource();\n if (this.changedCellsDataSource !== datasource) {\n this.control()?.clearChangedCells();\n this.changedCellsDataSource = datasource;\n }\n this.control()?.markChangedCell(event.position.rowIndex, event.field);\n }\n\n private flushDirtyInlineRows(activeRowIndex: number | null = null): void {\n const datasource = this.dataSource();\n if (this.dirtyRowsDataSource !== datasource) {\n this.dirtyInlineRows.clear();\n this.dirtyRowsDataSource = datasource;\n return;\n }\n\n for (const index of [...this.dirtyInlineRows].sort((a, b) => a - b)) {\n if (index === activeRowIndex) continue;\n this.dirtyInlineRows.delete(index);\n if (index >= 0 && index < datasource.length) this.emitRowChanged(index);\n }\n }\n\n private reconcileDirtyInlineRowsAfterRemoval(removedIndex: number): void {\n const shifted = new Set<number>();\n for (const index of this.dirtyInlineRows) {\n if (index < removedIndex) shifted.add(index);\n else if (index > removedIndex) shifted.add(index - 1);\n }\n this.dirtyInlineRows.clear();\n for (const index of shifted) this.dirtyInlineRows.add(index);\n this.control()?.reconcileChangedCellsAfterRemoval(removedIndex);\n }\n\n private emitRowChanged(originalIndex: number): void {\n this.rowChanged.emit({\n row: this.dataSource().getRow(originalIndex),\n originalIndex,\n } as RowUpdateEvent<T>);\n }\n\n private createRecordEvent(index: number, data: Record<string, unknown>): RecordEditEvent {\n const datasource = this.dataSource();\n return {\n index,\n data,\n provider: this.provider(),\n datasource,\n };\n }\n\n constructor() {\n // Keep one datasource identity so selection/controllers are not reset whenever source data\n // causes the computed pivot rows to be regenerated.\n this.pivotDataSource.linkSignal(this.pivotRows);\n effect(() => this.sidebarController.syncAutoOpen());\n\n // Expose CSV/XLSX export through the provider so callers don't need a ViewChild on the grid.\n effect(onCleanup => {\n const provider = this.provider();\n provider.ɵattachExport({\n csv: filename => this.presentation.exportCsv(filename),\n xlsx: filename => this.presentation.exportXlsx(filename),\n });\n onCleanup(() => provider.ɵattachExport(null));\n });\n\n // Publish the live filtered/sorted rows so charts (and other consumers) can react to filters.\n effect(() => this.provider().ɵsetVisibleRows(this.ɵvisibleRows()));\n this.destroyRef.onDestroy(() => this.provider().ɵsetVisibleRows(null));\n\n afterRenderEffect(() => {\n if (this.firstDataRenderedEmitted) return;\n const datasource = this.dataSource();\n const rows = datasource.rows() as T[];\n const hasRenderedData = [\n ...this.pinnedTopItems(),\n ...this.displayItems(),\n ...this.pinnedBottomItems(),\n ].some(isDataRowItemFn);\n if (rows.length === 0 || !hasRenderedData) return;\n\n this.firstDataRenderedEmitted = true;\n const event: FirstDataRenderedEvent<T> = {\n rows,\n rowCount: rows.length,\n provider: this.provider(),\n datasource,\n };\n queueMicrotask(() => this.firstDataRendered.emit(event));\n });\n\n effect(() => {\n const datasource = this.dataSource();\n if (this.changedCellsDataSource === datasource) return;\n this.changedCellsDataSource = datasource;\n this.control()?.clearChangedCells();\n });\n\n effect(() => {\n const activeRowIndex = this.selectedCell()?.rowIndex ?? null;\n this.flushDirtyInlineRows(activeRowIndex);\n });\n\n afterNextRender(() => {\n this.viewReady = true;\n this.syncColumnViewportMetrics();\n const wrapper = this.wrapperEl().nativeElement;\n const renderedRangeSubscription = this.viewport().renderedRangeStream.subscribe(() =>\n this.ensureServerRowsVisible()\n );\n const onKeyDown = (event: KeyboardEvent) => this.onKeyDown(event);\n wrapper.addEventListener('keydown', onKeyDown, { capture: true });\n // Keep the column-virtualization viewport width current when the grid is resized without\n // a horizontal scroll (e.g. a layout/container change or sidebar toggle).\n const ResizeObserverCtor = globalThis.ResizeObserver;\n const resizeObserver = ResizeObserverCtor\n ? new ResizeObserverCtor(() => this.syncColumnViewportMetrics())\n : null;\n resizeObserver?.observe(this.horizontalScrollerEl().nativeElement);\n this.destroyRef.onDestroy(() => {\n renderedRangeSubscription.unsubscribe();\n wrapper.removeEventListener('keydown', onKeyDown, { capture: true });\n resizeObserver?.disconnect();\n });\n this.ensureServerRowsVisible();\n });\n\n // Query changes invalidate lazy blocks. The model owns request cancellation by generation,\n // so late responses from an old filter/sort state cannot overwrite current rows.\n effect(() => {\n const model = this.serverSideRowModel();\n const ctrl = this.control();\n if (!model) return;\n ctrl?.filters();\n ctrl?.sortOrder();\n ctrl?.quickFilter();\n const changed = model.setQuery(ctrl, this.projection.effectiveSortOrder());\n if (changed && this.viewReady) this.viewport().scrollToIndex(0);\n queueMicrotask(() => this.ensureServerRowsVisible());\n });\n\n const onDocumentKeyDown = (event: KeyboardEvent) => {\n if (event.key !== 'Escape' || event.defaultPrevented) return;\n if (this.closeOpenMenus()) {\n event.preventDefault();\n event.stopPropagation();\n }\n };\n this.browser.addDocumentListener('keydown', onDocumentKeyDown);\n\n // Emit pageChange whenever page or pageSize changes in server-side pagination mode.\n effect(() => {\n const ctrl = this.control();\n if (!ctrl || ctrl.totalRows() <= 0 || ctrl.pageSize() <= 0) return;\n const page = ctrl.currentPage();\n const pageSize = ctrl.pageSize();\n const totalRows = ctrl.totalRows();\n const startRow = (page - 1) * pageSize;\n const endRow = Math.min(page * pageSize, totalRows) - 1;\n this.pageChange.emit({ page, pageSize, startRow, endRow });\n });\n\n effect(() => {\n const added = this.dataSource().rowAdded();\n if (!added) return;\n this.navigationController.revealRow(added.index);\n });\n\n // Deselect when clicking outside the grid.\n const onOutsidePointerDown = (e: PointerEvent) => {\n const isInsideGrid = this._hostEl.nativeElement.contains(e.target as Node);\n if (!isInsideGrid) {\n this.closeOpenMenus();\n queueMicrotask(() => this.flushDirtyInlineRows());\n }\n if (this.rowSelection() === 'none') return;\n if (this.selectedRowIndices().size === 0) return;\n if (isInsideGrid) return;\n this.rowController.clearSelection();\n };\n this.browser.addDocumentListener('pointerdown', onOutsidePointerDown);\n this.destroyRef.onDestroy(() => {\n this.browser.removeDocumentListener('keydown', onDocumentKeyDown);\n this.browser.removeDocumentListener('pointerdown', onOutsidePointerDown);\n if (this.quickFilterTimer !== null) clearTimeout(this.quickFilterTimer);\n });\n\n // Re-sync pinned pane scroll after displayItems changes — CDK independently adjusts\n // each viewport when item count changes (group/ungroup, collapse), which can leave\n // the panes offset by one row.\n effect(() => {\n this.displayItems();\n setTimeout(() => {\n const viewport = this.viewport();\n viewport.checkViewportSize();\n this.pinnedViewport()?.checkViewportSize();\n this.rightPinnedViewport()?.checkViewportSize();\n\n const offset = viewport.measureScrollOffset();\n this.pinnedViewport()?.scrollToOffset(offset);\n this.rightPinnedViewport()?.scrollToOffset(offset);\n }, 0);\n });\n\n // Seed ColDef.hidden and ColDef.pinned into the control once per control instance.\n effect(() => {\n const ctrl = this.control();\n const cols = this.colDefs();\n if (!ctrl || this._seededControls.has(ctrl)) return;\n this._seededControls.add(ctrl);\n for (const col of cols) {\n if (col.hidden) ctrl.setColumnVisibility(col.field, false);\n if (col.pinned === 'left') ctrl.setPinned(col.field, true);\n if (col.pinned === 'right') ctrl.setPinnedRight(col.field, true);\n }\n });\n }\n\n // ── Template helpers — type guards ────────────────────────────────────────────\n\n /** @internal */\n isDataRowItem(item: GridItem): item is { row: Record<string, unknown>; originalIndex: number } {\n return isDataRowItemFn(item);\n }\n\n /** @internal Whether this virtual row is waiting for a server-side block. */\n isLoadingRow(item: GridItem): item is { loading: true; originalIndex: number } {\n return !!item && typeof item === 'object' && 'loading' in item;\n }\n\n /** @internal */\n isGroupHeaderItem(item: GridItem): item is { groupLabel: string; count: number; collapsed: boolean } {\n return isGroupHeaderItemFn(item);\n }\n\n /** @internal */\n isPathTreeNodeItem(item: GridItem): boolean {\n return isPathTreeNodeItemFn(item);\n }\n\n /** @internal */\n getItemOriginalIndex(item: GridItem): number | null {\n return isDataRowItemFn(item) ? item.originalIndex : null;\n }\n\n /** @internal True when the item is a master/detail panel row. */\n isDetailRowItem(item: GridItem): item is DetailRowItem {\n return isDetailRowItemFn(item);\n }\n\n /** @internal Rendered pixel height of a virtual-scroll item (detail panels are taller). */\n rowPx(item: GridItem): number {\n return isDetailRowItemFn(item) ? this.detailRowHeight() : this.rowHeight();\n }\n\n /** @internal Resolved HTML for an expanded detail panel (auto-sanitized by `[innerHTML]`). */\n detailHtml(item: GridItem): string {\n return this.detailController.detailHtml(item);\n }\n\n /** @internal Formatted value shown while a configured detail field is not being edited. */\n detailFieldDisplay(item: DetailRowItem): string {\n return this.detailController.detailFieldDisplay(item);\n }\n\n /** @internal Whether the configured detail field can be edited for this row. */\n isDetailFieldEditable(item: DetailRowItem): boolean {\n return this.detailController.isDetailFieldEditable(item);\n }\n\n /** @internal Enter multiline editing for one expanded detail row. */\n startDetailFieldEdit(item: DetailRowItem, event?: Event): void {\n this.detailController.startDetailFieldEdit(item, event);\n }\n\n /** @internal Keep the multiline draft synchronized with textarea input. */\n onDetailDraftInput(event: Event): void {\n this.detailController.onDetailDraftInput(event);\n }\n\n /** @internal Commit on blur or Ctrl/Cmd+Enter, and cancel on Escape. */\n onDetailEditorKeydown(item: DetailRowItem, event: KeyboardEvent): void {\n this.detailController.onDetailEditorKeydown(item, event);\n }\n\n /** @internal Insert a configured text template into the active detail textarea. */\n applyDetailAction(item: DetailRowItem, action: DetailAction, event: Event): void {\n this.detailController.applyDetailAction(item, action, event);\n }\n\n private focusDetailEditorFromKeyboard(event: KeyboardEvent): boolean {\n return this.detailController.focusDetailEditorFromKeyboard(event);\n }\n\n /** @internal Commit a multiline detail edit through normal grid edit semantics. */\n commitDetailFieldEdit(item: DetailRowItem): void {\n this.detailController.commitDetailFieldEdit(item);\n }\n\n /** @internal Discard the active multiline detail draft. */\n cancelDetailFieldEdit(): void {\n this.detailController.cancelDetailFieldEdit();\n }\n\n /** @internal Resolved per-row CSS classes from the host `getRowClass` callback. */\n getRowClass(row: Record<string, unknown>, index: number): string {\n return this.presentation.getRowClass(row, index);\n }\n\n /** Whether the master/detail panel for `originalIndex` is currently expanded. */\n isDetailExpanded(originalIndex: number): boolean {\n return this._expandedDetailIds().has(originalIndex);\n }\n\n /** @internal Whether a data row may show a master/detail panel. */\n canToggleDetail(item: GridItem): boolean {\n if (!this.masterDetail() || !isDataRowItemFn(item)) return false;\n const config = this.treeConfig();\n return !config\n || isPathTreeConfig(config)\n || !this.treeParentIds().has(config.getId(item.row as T));\n }\n\n /** Toggle the master/detail panel for a row by its original (data-source) index. */\n toggleDetail(originalIndex: number): void {\n const row = this.dataSource().getRow(originalIndex);\n const config = this.treeConfig();\n if (\n !row\n || (\n config\n && !isPathTreeConfig(config)\n && this.treeParentIds().has(config.getId(row as T))\n )\n ) return;\n this._expandedDetailIds.update(ids => {\n const next = new Set(ids);\n if (next.has(originalIndex)) next.delete(originalIndex);\n else next.add(originalIndex);\n return next;\n });\n }\n\n /** @internal Template handler for the detail expander chevron. */\n onDetailToggle(originalIndex: number): void {\n this.toggleDetail(originalIndex);\n }\n\n /** Effective pin position of a row (`'top'`, `'bottom'`, or `undefined`). */\n rowPinState(originalIndex: number): 'top' | 'bottom' | undefined {\n const resolver = this.effectivePinRow();\n if (!resolver) return undefined;\n return resolver(this.dataSource().rows()[originalIndex], originalIndex);\n }\n\n /**\n * Pin a row to the top or bottom of the body, or unpin it with `null`.\n * Keyed by the row's original (data-source) index; the pinned row stays fully interactive.\n */\n pinRowTo(originalIndex: number, position: 'top' | 'bottom' | null): void {\n this._pinnedRows.update(map => {\n const next = new Map(map);\n // When no predicate could re-pin the row, an unpin can simply drop the override.\n if (position === null && !this.pinRowFn()) next.delete(originalIndex);\n else next.set(originalIndex, position);\n return next;\n });\n }\n\n /** @internal Template handler for the pin/unpin context-menu items; closes the open menus. */\n onPinRow(originalIndex: number, position: 'top' | 'bottom' | null): void {\n this.pinRowTo(originalIndex, position);\n this.rowController.closeContextMenu();\n this.rowController.closeCellContextMenu();\n }\n\n // ── Template helpers — tree ───────────────────────────────────────────────────\n\n /** @internal True when `col` is the configured tree column. */\n isTreeCell(col: ColDef): boolean {\n return this.treeConfig()?.treeField === col.field;\n }\n\n /** @internal Tree depth of a row item (0 when not a tree row). */\n treeRowLevel(item: GridItem): number {\n return isTreeRowItemFn(item) || isPathTreeNodeItemFn(item) ? item.level : 0;\n }\n\n /** @internal Whether a tree row has children and can be expanded. */\n treeRowExpandable(item: GridItem): boolean {\n return (isTreeRowItemFn(item) || isPathTreeNodeItemFn(item)) && item.expandable;\n }\n\n /** @internal Whether a tree row is currently expanded. */\n treeRowExpanded(item: GridItem): boolean {\n return (isTreeRowItemFn(item) || isPathTreeNodeItemFn(item)) && item.expanded;\n }\n\n /**\n * @internal Resolve the non-persistent value shown by a tree cell.\n *\n * A formatted path-leaf label wins in the tree column. In every other aggregate column, an\n * expandable parent shows its descendant rollup instead of its stored value. Returning `null`\n * delegates to the normal cell formatter. The source row is never mutated.\n */\n treeCellDisplayOverride(item: GridItem, col: ColDef): string | null {\n if (!isTreeRowItemFn(item)) return null;\n if (this.isTreeCell(col) && item.treeLabel != null) return item.treeLabel;\n if (item.aggregates && col.field in item.aggregates) {\n return this.getFooterDisplay(col, item.aggregates[col.field]);\n }\n return null;\n }\n\n /**\n * @internal True when a datasource-backed tree parent cell displays a computed rollup.\n * The template uses this to prevent editing a display-only value into the source parent row.\n * Generated path branches are not cell components and render their aggregates separately.\n */\n isTreeAggregateCell(item: GridItem, col: ColDef): boolean {\n return isTreeRowItemFn(item) && !!item.aggregates && col.field in item.aggregates;\n }\n\n /** @internal Whether the configured info action is visible for this cell. */\n showCellInfoIcon(col: ColDef, row: Record<string, unknown>): boolean {\n return typeof col.infoIcon === 'function'\n ? col.infoIcon({ value: row[col.field], row })\n : col.infoIcon === true;\n }\n\n /** @internal Emits the typed cell information action. */\n onCellInfo(originalIndex: number, col: ColDef, row: Record<string, unknown>): void {\n this.cellInfo.emit({\n row: row as T,\n field: col.field as AgridField<T>,\n value: row[col.field],\n originalIndex,\n column: col,\n } as unknown as CellInfoEvent<T>);\n }\n\n /** @internal Label of a generated path-tree branch. */\n pathTreeLabel(item: GridItem): string {\n return isPathTreeNodeItemFn(item) ? item.pathLabel : '';\n }\n\n /** @internal Toggle the expand/collapse state of a tree row from its twisty. */\n onTreeToggle(item: GridItem): void {\n const config = this.treeConfig();\n if (!config) return;\n if (isPathTreeNodeItemFn(item)) {\n this.treeController.toggle(item.pathNodeId);\n } else if (isTreeRowItemFn(item) && !isPathTreeConfig(config)) {\n this.treeController.toggle(config.getId(item.row as T));\n }\n }\n\n /** @internal Emits the generated path-tree branch click event. */\n onTreeNodeClick(item: GridItem): void {\n if (!isPathTreeNodeItemFn(item)) return;\n this.treeNodeClick.emit(this.toTreeNodeClickEvent(item));\n }\n\n /** @internal Emits the generated path-tree branch double-click event. */\n onTreeNodeDoubleClick(item: GridItem): void {\n if (!isPathTreeNodeItemFn(item)) return;\n this.treeNodeDoubleClicked.emit(this.toTreeNodeClickEvent(item));\n }\n\n private toTreeNodeClickEvent(item: PathTreeNodeItem): TreeNodeClickEvent {\n return {\n uuid: item.uuid,\n pathNodeId: item.pathNodeId,\n pathLabel: item.pathLabel,\n level: item.level,\n expanded: item.expanded,\n node: { ...item },\n };\n }\n\n private toggleTreeCell(originalIndex: number, colIndex: number): boolean {\n const config = this.treeConfig();\n const col = this.visibleColDefs()[colIndex];\n if (!config || !col || config.treeField !== col.field) return false;\n\n const item = this.displayItems().find(\n candidate => isDataRowItemFn(candidate) && candidate.originalIndex === originalIndex,\n );\n if (!item || !isTreeRowItemFn(item) || !item.expandable || isPathTreeConfig(config)) return false;\n\n this.treeController.toggle(config.getId(item.row as T));\n return true;\n }\n\n /** Expand every expandable node in the tree. No-op when not in tree mode. */\n expandAllNodes(): void {\n const config = this.treeConfig();\n if (!config) return;\n if (isPathTreeConfig(config)) {\n const ids = new Set<string>();\n for (const row of this.dataSource().rows() as T[]) {\n const path = config.getPath(row).map(String).filter(Boolean);\n for (let length = 1; length < path.length; length++) {\n ids.add(pathTreeNodeId(path.slice(0, length)));\n }\n }\n this.treeController.expandAll(ids);\n return;\n }\n const expandable = new Set<string | number>();\n for (const row of this.dataSource().rows()) {\n const parentId = config.getParentId(row as T);\n if (parentId != null) expandable.add(parentId);\n }\n this.treeController.expandAll(expandable);\n }\n\n /** Collapse every node in the tree. No-op when not in tree mode. */\n collapseAllNodes(): void {\n this.treeController.collapseAll();\n }\n\n /** @internal CDK trackBy — arrow to preserve `this`. */\n readonly trackByItem = (_di: number, item: GridItem): string | number => {\n if (item === 'ghost') return '__ghost__';\n if (item === null) return -1;\n if (this.isLoadingRow(item)) return `__loading__${item.originalIndex}`;\n if (isGroupHeaderItemFn(item)) return `__group__${item.groupLabel}`;\n if (isDetailRowItemFn(item)) return `__detail__${item.detailFor}`;\n if (isPathTreeNodeItemFn(item)) return item.pathNodeId;\n return item.originalIndex;\n };\n\n // ── Template helpers — cell/selection state ───────────────────────────────────\n\n /** @internal */\n isSelected(originalIndex: number, ci: number): boolean {\n const sel = this.selectedCell();\n return sel?.rowIndex === originalIndex && sel?.colIndex === ci;\n }\n\n /** @internal */\n isEditing(originalIndex: number, ci: number): boolean {\n const ed = this.editingCell();\n return ed?.rowIndex === originalIndex && ed?.colIndex === ci;\n }\n\n /** @internal */\n getSeedChar(originalIndex: number, ci: number): string {\n return this.isEditing(originalIndex, ci) ? this.editSeedChar() : '';\n }\n\n /** @internal */\n isAddRowSelected(): boolean {\n const sel = this.selectedCell();\n return this.allowAddRows() && sel?.rowIndex === this.dataSource().length;\n }\n\n /** @internal */\n isRowSelected(originalIndex: number): boolean {\n return this.rowController.isRowSelected(originalIndex);\n }\n\n /** @internal Selection class for the separate pinned/control viewport. */\n isPinnedPaneRowSelected(item: GridItem): boolean {\n return this.rowController.isPinnedPaneRowSelected(item);\n }\n\n // ── Template helpers — filter menu ────────────────────────────────────────────\n\n /** @internal */\n /** @internal 1-based sort priority for a column, 0 if not sorted. */\n getSortPriority(field: string): number { return this.columnMenuController.getSortPriority(field); }\n\n /** @internal Whether more than one column is currently sorted. */\n hasMultiSort(): boolean {\n return this.columnMenuController.hasMultiSort();\n }\n\n getTextFilter(field: string): string { return this.columnMenuController.getTextFilter(field); }\n\n /** @internal Condition input type for a column, or `null` when unsupported. */\n getMenuFilterType(field: string): 'text' | 'number' | 'date' | null {\n return this.columnMenuController.getFilterType(field);\n }\n\n /** @internal Short label for an active header condition. */\n getConditionButtonLabel(field: string): string {\n switch (this.getMenuOperator(field)) {\n case 'eq': return '=';\n case 'neq': return '≠';\n case 'gt': return '>';\n case 'gte': return '≥';\n case 'lt': return '<';\n case 'lte': return '≤';\n case 'between': return '↔';\n case 'like': return '~';\n case 'startsWith': return 'A…';\n case 'endsWith': return '…Z';\n case 'includes': return '⊃';\n case 'notIncludes': return '⊅';\n default: return '⋯';\n }\n }\n\n /** @internal */\n getMenuOperator(field: string): FilterOperator | null {\n return this.columnMenuController.getFilterOperator(field);\n }\n\n /** @internal */\n getMenuOperand(field: string): string { return this.columnMenuController.getFilterOperand(field); }\n\n /** @internal */\n getMenuOperand2(field: string): string {\n return this.columnMenuController.getFilterOperand2(field);\n }\n\n /** @internal */\n onMenuOperatorChange(field: string, operator: FilterOperator | null): void {\n this.columnMenuController.setFilterOperator(field, operator);\n }\n\n /** @internal */\n onMenuOperandChange(field: string, value: string): void {\n this.columnMenuController.setFilterOperand(field, value);\n }\n\n /** @internal */\n onMenuOperand2Change(field: string, value: string): void {\n this.columnMenuController.setFilterOperand2(field, value);\n }\n\n /** @internal */\n getSort(field: string): 'asc' | 'desc' | null {\n return this.columnMenuController.getSort(field);\n }\n\n /** @internal */\n isMenuAllSelected(field: string): boolean {\n return this.columnMenuController.isAllSelected(field);\n }\n\n /** @internal */\n isMenuValueActive(rawStr: string): boolean {\n return this.columnMenuController.isValueActive(rawStr);\n }\n\n /** @internal */\n isMenuValueSelected(field: string, value: string): boolean {\n return this.columnMenuController.isValueSelected(field, value);\n }\n\n /** @internal */\n hasActiveFilter(field: string): boolean {\n return this.columnMenuController.hasActiveFilter(field);\n }\n\n /** @internal */\n getColDef(field: string): ColDef | undefined { return this.columnState.getColDef(field); }\n\n /** @internal */\n getVisibleColIndex(field: string): number {\n return this.columnState.getVisibleColIndex(field);\n }\n\n /** @internal Convert a zero-based visible data-column index to a one-based ARIA index. */\n getAriaColIndex(colIndex: number): number {\n return this.columnState.getAriaColIndex(colIndex);\n }\n\n /** @internal */\n isColumnHidden(field: string): boolean { return this.columnState.isColumnHidden(field); }\n\n /** @internal */\n isGroupedByField(field: string): boolean { return this.columnState.isGroupedByField(field); }\n\n /** @internal */\n isColumnPinned(field: string): boolean {\n return this.columnState.isColumnPinned(field);\n }\n\n isColumnPinnedRight(field: string): boolean {\n return this.columnState.isColumnPinnedRight(field);\n }\n\n /** Returns `'left'`, `'right'`, or `false` — used by the column menu. */\n getColumnPinState(field: string): 'left' | 'right' | false {\n return this.columnState.getColumnPinState(field);\n }\n\n isFirstRightPinnedColumn(field: string): boolean {\n return this.columnState.isFirstRightPinnedColumn(field);\n }\n\n /** @internal Returns `true` for the rightmost pinned column (used to draw the separator shadow). */\n isLastPinnedColumn(field: string): boolean {\n return this.columnState.isLastPinnedColumn(field);\n }\n\n // ── Row selection ─────────────────────────────────────────────────────────────\n\n /** @internal */\n onRowPointerDown(event: PointerEvent, originalIndex: number): void {\n this.rowController.selectFromPointer(event, originalIndex, true);\n }\n\n /** @internal Emits rowClick when the user single-clicks a data row outside of a cell editor. */\n onRowClick(event: MouseEvent, item: { row: Record<string, unknown>; originalIndex: number }): void {\n this.rowController.clickRow(item);\n }\n\n // ── Cell interaction ──────────────────────────────────────────────────────────\n\n /** @internal */\n onActivate(originalIndex: number, ci: number, event?: MouseEvent): void {\n if (this.rangeController.consumeSuppressedActivation()) return;\n this.navigationController.activateCell(originalIndex, ci, event);\n }\n\n /** @internal */\n onActivateAddRow(): void {\n this.navigationController.activateAddRow();\n }\n\n /** @internal */\n onStartEdit(originalIndex: number, ci: number): void {\n const row = this.dataSource().rows()[originalIndex];\n this.rowDoubleClicked.emit({ row, originalIndex });\n if (this.isEditing(originalIndex, ci)) return;\n this.enterEdit(originalIndex, ci, '');\n }\n\n /** @internal */\n onDraftChange(value: unknown): void { this.editController.setDraft(value); }\n\n /** @internal A custom cell editor requested a commit (e.g. picking a value). */\n onEditorCommit(): void { this.editController.commit(); }\n\n /** @internal A custom cell editor requested cancellation. */\n onEditorCancel(): void { this.editController.cancel(); }\n\n private quickFilterTimer: ReturnType<typeof setTimeout> | null = null;\n\n /**\n * @internal Quick-filter input handler. Stores the text on the control (drives the bound value\n * and client-side filtering) and, in server mode, emits a debounced `quickFilterChange` instead.\n */\n onQuickFilterInput(event: Event): void {\n const text = (event.target as HTMLInputElement).value;\n this.control()?.setQuickFilter(text);\n if (!this.serverSideFiltering()) return;\n if (this.quickFilterTimer !== null) clearTimeout(this.quickFilterTimer);\n const delay = this.filterDebounceMs();\n if (delay === 0) {\n this.quickFilterChange.emit(text);\n return;\n }\n this.quickFilterTimer = setTimeout(() => {\n this.quickFilterTimer = null;\n this.quickFilterChange.emit(text);\n }, delay);\n }\n\n /** @internal Whether a column is editable in the current grid state (drives boolean checkboxes). */\n isColEditable(col: ColDef, originalIndex?: number): boolean {\n return this.editController.isCellEditable(col, originalIndex);\n }\n\n /** @internal Inline validation message for a cell, or `null` when the cell has no active error. */\n cellValidationError(originalIndex: number, ci: number): string | null {\n const error = this.editController.validationError();\n return error && error.rowIndex === originalIndex && error.colIndex === ci ? error.message : null;\n }\n\n /** @internal Commit a boolean-column checkbox toggle directly to the data source. */\n onBooleanToggle(originalIndex: number, ci: number, value: boolean): void {\n this.editController.setCellValue(originalIndex, ci, value);\n }\n\n /** @internal Starts a fill-handle drag from the bottom-right corner of the selection. */\n onCellPointerDown(event: PointerEvent, originalIndex: number, colIndex: number): void {\n if (this.rangeController.startFill(event, originalIndex, colIndex)) return;\n this.rangeController.startSelection(event, originalIndex, colIndex);\n }\n\n /** @internal Main keyboard handler delegated from the wrapper div. */\n onKeyDown(event: KeyboardEvent): void {\n if (event.key === 'Escape' && this.closeOpenMenus()) {\n event.preventDefault();\n event.stopPropagation();\n return;\n }\n if (event.key === 'Escape' && this.pendingDeleteRow() !== null) {\n event.preventDefault();\n event.stopPropagation();\n this.cancelRowDelete();\n return;\n }\n if (this.focusDetailEditorFromKeyboard(event)) return;\n this.navigationController.handleKeyDown(event);\n }\n\n /** @internal Clears cell navigation while a header filter control owns focus. */\n onGridFocusIn(event: FocusEvent): void {\n if ((event.target as Element | null)?.closest('.ag-filter-input, .ag-filter-menu')) {\n this.navigationController.deactivateCell();\n }\n }\n\n /** Open the find panel and focus its input. */\n openFind(): void {\n this.findController.show();\n }\n\n /** @internal */\n closeFind(): void {\n this.findController.close();\n }\n\n /** @internal */\n onFindInput(value: string): void {\n this.findController.setQuery(value);\n }\n\n /** @internal */\n goToFindMatch(direction: 1 | -1): void {\n this.findController.goToMatch(direction);\n }\n\n private revealFindMatch(originalIndex: number, colIndex: number): void {\n const config = this.treeConfig();\n if (config) {\n const rows = this.dataSource().rows() as T[];\n const expanded = new Set(this.treeController.expandedIds());\n if (isPathTreeConfig(config)) {\n const path = config.getPath(rows[originalIndex]).map(String).filter(Boolean);\n for (let length = 1; length < path.length; length++) {\n expanded.add(pathTreeNodeId(path.slice(0, length)));\n }\n } else {\n const idToRow = new Map(rows.map(row => [config.getId(row), row]));\n const visited = new Set<string | number>();\n let parentId = config.getParentId(rows[originalIndex]);\n while (parentId !== null && parentId !== undefined && !visited.has(parentId)) {\n visited.add(parentId);\n expanded.add(parentId);\n const parent = idToRow.get(parentId);\n if (!parent) break;\n parentId = config.getParentId(parent);\n }\n }\n this.treeController.expandAll(expanded);\n } else {\n const control = this.control();\n const pageSize = control?.pageSize() ?? 0;\n const filteredIndex = this.projection.filteredSortedIndices().indexOf(originalIndex);\n if (control && pageSize > 0 && control.totalRows() === 0 && filteredIndex >= 0) {\n control.setPage(Math.floor(filteredIndex / pageSize) + 1);\n }\n }\n\n setTimeout(() => {\n const displayIndex = this.navigationController.findDisplayIndex(originalIndex);\n if (displayIndex >= 0) {\n this.navigationController.scrollToKeepVisible(displayIndex, colIndex);\n }\n });\n }\n\n // ── Row reorder ───────────────────────────────────────────────────────────────\n\n /** @internal Ghost cell display during a reorder drag. */\n getGhostCellDisplay(col: ColDef): string { return this.dragHandler.getGhostDisplay(col); }\n\n /** @internal Delegates to AgridDragHandler. */\n onHandlePointerDown(event: PointerEvent, originalIndex: number): void {\n if (!this.allowRowReorder()) return;\n this.dragHandler.startReorder(event, originalIndex);\n }\n\n /** @internal Handles the control column without letting the row receive a second pointer event. */\n onControlPointerDown(event: PointerEvent, originalIndex: number): void {\n event.stopPropagation();\n if (this.allowRowReorder() && event.pointerType === 'mouse' && event.button === 0) {\n this.onHandlePointerDown(event, originalIndex);\n return;\n }\n this.rowController.selectFromPointer(event, originalIndex, false);\n }\n\n /** @internal Marks a row when its control-column header surface is clicked. */\n onControlCellClick(event: MouseEvent, originalIndex: number): void {\n event.stopPropagation();\n if (this.enableRowMarking()) this.toggleRowMarked(originalIndex);\n }\n\n /** Toggle whether a row is included in subsequent copy operations and emit its new state. */\n toggleRowMarked(originalIndex: number): void {\n this.setRowMarked(originalIndex, !this.markedIndices().has(originalIndex));\n }\n\n /** Set one row's mark state and emit `rowMark` when that state changes. */\n setRowMarked(originalIndex: number, marked: boolean): void {\n const row = this.dataSource().getRow(originalIndex) as T | undefined;\n if (!row || this.markedIndices().has(originalIndex) === marked) return;\n this.markedIndices.update(indices => {\n const next = new Set(indices);\n if (marked) next.add(originalIndex);\n else next.delete(originalIndex);\n return next;\n });\n this.rowMark.emit({ row, originalIndex, marked });\n }\n\n /** @internal Returns whether a row is marked for copying. */\n isRowMarked(originalIndex: number): boolean {\n return this.markedIndices().has(originalIndex);\n }\n\n /** Clear every row marked for clipboard inclusion. */\n clearMarkedRows(): void {\n this.markedIndices.set(new Set());\n }\n\n /** Set one complete column's mark state and emit `columnMark` when it changes. */\n setColumnMarked(field: string, marked: boolean): void {\n const column = this.getColDef(field) as ColDef<T> | undefined;\n if (!column || this.markedFields().has(field) === marked) return;\n this.markedFields.update(fields => {\n const next = new Set(fields);\n if (marked) next.add(field);\n else next.delete(field);\n return next;\n });\n this.columnMark.emit({ column, field: column.field, marked });\n }\n\n /** Toggle one complete column's mark state. */\n toggleColumnMarked(field: string): void {\n this.setColumnMarked(field, !this.markedFields().has(field));\n }\n\n /** Clear all marked columns. */\n clearMarkedColumns(): void {\n this.markedFields.set(new Set());\n }\n\n /** @internal Emits a custom header command for its typed column and closes the menu. */\n onColumnHeaderAction(field: string, key: string): void {\n const column = this.getColDef(field) as ColDef<T> | undefined;\n if (!column) return;\n this.columnHeaderAction.emit({ column, key });\n this.columnMenuController.close();\n }\n\n /** @internal Copy the active range or cell as TSV. */\n onCopy(event: ClipboardEvent): void {\n this.clipboardHandler.copy(event);\n }\n\n /** @internal Paste TSV/CSV-like plain text into the current cell. */\n onPaste(event: ClipboardEvent): void {\n if (this.editingCell()) return;\n this.clipboardHandler.paste(event);\n }\n\n // ── Column resize ─────────────────────────────────────────────────────────────\n\n /** @internal Starts pointer-based column resizing. */\n onResizeStart(event: MouseEvent, col: ColDef): void {\n this.columnSizing.startResize(event, col);\n }\n\n /** @internal Resize a column from its keyboard-accessible separator handle. */\n onResizeKeyDown(event: KeyboardEvent, col: ColDef): void {\n this.columnSizing.resizeFromKeyboard(event, col);\n }\n\n /** @internal Autosize a column to fit its header and currently visible row values. */\n onAutosizeColumn(event: MouseEvent, col: ColDef): void {\n if (col.locked) return;\n event.preventDefault();\n event.stopPropagation();\n this.columnSizing.autosizeColumn(col);\n const selected = this.selectedCell();\n if (selected) this.columnSizing.scrollColumnToKeepVisible(selected.colIndex);\n }\n\n // ── Row context menu ──────────────────────────────────────────────────────────\n\n /** @internal */\n onControlContextMenu(event: MouseEvent, originalIndex: number): void {\n this.rowController.openRowContextMenu(event, originalIndex);\n }\n\n /** @internal */\n closeContextMenu(): void { this.rowController.closeContextMenu(); }\n\n /** @internal */\n onCellContextMenu(event: MouseEvent, rowIndex: number, colIndex: number, col: ColDef, row: Record<string, unknown>): void {\n this.rowController.openCellContextMenu(event, rowIndex, colIndex, col, row);\n }\n\n /** @internal */\n closeCellContextMenu(): void { this.rowController.closeCellContextMenu(); }\n\n /** @internal Closes any row, cell, menu-bar, group-action, or column menu owned by this grid. */\n closeOpenMenus(): boolean {\n const hadOpenMenu = this.contextMenu() !== null\n || this.cellContextMenuState() !== null\n || this.openMenuBarItemId() !== null\n || this.groupActionsMenu() !== null\n || this.filterMenu() !== null;\n if (!hadOpenMenu) return false;\n this.rowController.closeContextMenu();\n this.rowController.closeCellContextMenu();\n this.closeMenuBarMenu();\n this.groupController.closeActionsMenu();\n this.columnMenuController.close();\n return true;\n }\n\n /** @internal Closes the currently open menu-bar dropdown. */\n closeMenuBarMenu(): void {\n this.menuBarController.close();\n }\n\n /** @internal Synchronizes dropdown state and closes competing grid menus when one opens. */\n onMenuBarOpenItemChange(id: string | null): void {\n this.menuBarController.onOpenItemChange(id);\n }\n\n /** @internal Dispatches a menu-bar action (or persists config for the built-in save entry). */\n onMenuBarAction(id: string): void {\n this.menuBarController.runAction(id);\n }\n\n /** @internal Runs a typed provider context-menu action against erased controller state. */\n runCellMenuItem(item: CellContextMenuItem<T>, menu: AgridCellContextMenu): void {\n item.action({\n value: menu.value as T[AgridField<T>],\n row: menu.row as unknown as T,\n field: menu.field as AgridField<T>,\n originalIndex: menu.rowIndex,\n });\n this.closeCellContextMenu();\n }\n\n /** @internal Copy one field from the target and marked rows. */\n copyCellToClipboard(originalIndex: number, col: ColDef): void {\n this.rowController.copyCellToClipboard(originalIndex, col);\n }\n\n /** @internal Copy the target and marked rows using all visible fields. */\n copyRowToClipboard(originalIndex: number): void {\n this.rowController.copyRowToClipboard(originalIndex);\n }\n\n /** @internal Insert a blank row at a specific position and emit prepareAddRecord. */\n insertRowAt(atIndex: number): void {\n this.rowController.insertRowAt(atIndex);\n }\n\n /** Start confirmation or immediately delete the row at `originalIndex`. */\n deleteRow(originalIndex: number): void {\n this.rowController.requestDeleteRow(originalIndex);\n }\n\n /** @internal Returns whether this row is awaiting delete confirmation. */\n isRowPendingDelete(originalIndex: number): boolean {\n return this.rowController.isRowPendingDelete(originalIndex);\n }\n\n /** @internal Delete the row currently awaiting confirmation. */\n confirmPendingRowDelete(): void {\n this.rowController.confirmPendingRowDelete();\n }\n\n /** @internal Cancel the active row-delete confirmation. */\n cancelRowDelete(): void {\n this.rowController.cancelRowDelete();\n }\n\n // ── Group expand / collapse ───────────────────────────────────────────────────\n\n /** @internal */\n onGroupHeaderClick(label: string): void {\n this.groupController.toggle(label);\n }\n\n /** Expand all groups. No-op when grouping is not active. */\n expandGroups(): void {\n this.groupController.expandAll(this.filteredItems());\n }\n\n /** Collapse all groups. No-op when grouping is not active. */\n collapseGroups(): void {\n this.groupController.collapseAll();\n }\n\n /** @internal */\n getGroupDescription(label: string): string {\n return this.groupController.getDescription(label);\n }\n\n /** @internal */\n openGroupActionsMenu(event: MouseEvent, label: string): void {\n this.groupController.openActionsMenu(event, label);\n }\n\n /** @internal */\n closeGroupActionsMenu(): void { this.groupController.closeActionsMenu(); }\n\n /** @internal */\n onGroupAction(action: GroupAction, label: string): void {\n this.groupController.runAction(action, label);\n }\n\n // ── Filter row & menu ─────────────────────────────────────────────────────────\n\n /** @internal */\n onTextFilterChange(event: Event, field: string): void {\n this.columnMenuController.onTextFilterChange(event, field);\n }\n\n /** @internal */\n openFilterMenu(event: MouseEvent, field: string, mode: 'column' | 'condition' = 'column'): void {\n this.columnMenuController.open(event, field, mode);\n }\n\n /** @internal */\n closeFilterMenu(): void { this.columnMenuController.close(); }\n\n /** @internal */\n onFilterMenuSearch(value: string): void {\n this.columnMenuController.setSearch(value);\n }\n\n /** @internal */\n onMenuSort(field: string, dir: 'asc' | 'desc'): void {\n this.columnMenuController.sort(field, dir);\n }\n\n /** @internal */\n onMenuClearFilter(field: string): void {\n this.columnMenuController.clearFilter(field);\n }\n\n /** @internal */\n /** @internal Replace the entire sort stack with a single sort on this column. */\n onMenuResetSort(field: string, dir: 'asc' | 'desc'): void {\n this.columnMenuController.resetSort(field, dir);\n }\n\n onMenuToggleGroupBy(field: string): void {\n this.columnMenuController.toggleGroupBy(field);\n }\n\n /** @internal */\n onMenuClearAll(): void {\n this.columnMenuController.clearAll();\n }\n\n /** @internal */\n onMenuToggleAll(field: string): void {\n this.columnMenuController.toggleAll(field);\n }\n\n /** @internal */\n onMenuToggleValue(field: string, rawStr: string): void {\n this.columnMenuController.toggleValue(field, rawStr);\n }\n\n /** @internal */\n onSidebarToggleColumn(field: string): void {\n this.columnMenuController.toggleColumnVisibility(field);\n this.emitSettingsChange();\n }\n\n /** @internal Sets every column in a sidebar header group to the requested visibility. */\n onSidebarToggleColumnGroup(fields: string[], visible: boolean): void {\n this.columnMenuController.setColumnsVisibility(fields, visible);\n this.emitSettingsChange();\n }\n\n /** @internal Mirrors vertical scrolling from the main viewport into both pinned panes. */\n onBodyScroll(): void {\n const offset = this.viewport().measureScrollOffset();\n this.pinnedViewport()?.scrollToOffset(offset);\n this.rightPinnedViewport()?.scrollToOffset(offset);\n }\n\n private ensureServerRowsVisible(): void {\n const model = this.serverSideRowModel();\n if (!model || !this.viewReady) return;\n const viewport = this.viewport();\n const range = viewport.getRenderedRange();\n const start = Math.max(0, range.start - model.blockSize);\n const end = Math.max(range.end, range.start + model.blockSize) + model.blockSize;\n model.ensureRange(start, end);\n }\n\n /** @internal Keeps the row-delete prompt visible while columns scroll horizontally. */\n onHorizontalScroll(): void {\n this.syncColumnViewportMetrics();\n this.rowController.repositionDeleteConfirmation();\n }\n\n /** @internal Refreshes the scroll offset / viewport width driving column virtualization. */\n private syncColumnViewportMetrics(): void {\n const scroller = this.horizontalScrollerEl().nativeElement;\n this.colScrollLeft.set(scroller.scrollLeft);\n this.colViewportWidth.set(scroller.clientWidth);\n }\n\n /** @internal */\n onRightPinnedBodyScroll(): void {\n const right = this.rightPinnedViewport();\n if (!right) return;\n const offset = right.measureScrollOffset();\n if (Math.abs(offset - this.viewport().measureScrollOffset()) < 1) return;\n this.viewport().scrollToOffset(offset);\n this.pinnedViewport()?.scrollToOffset(offset);\n }\n\n /** @internal */\n onMenuTogglePin(field: string): void {\n this.columnMenuController.togglePin(field);\n }\n\n /** @internal */\n onMenuTogglePinRight(field: string): void {\n this.columnMenuController.togglePinRight(field);\n }\n\n /** @internal */\n onMenuAutosizeColumn(field: string): void {\n this.columnMenuController.autosize(field);\n }\n\n /** @internal */\n onMenuSetAggregate(field: string, agg: 'sum' | 'avg' | 'min' | 'max' | 'count' | null): void {\n this.columnMenuController.setAggregate(field, agg);\n }\n\n /** @internal */\n onMenuHideColumn(field: string): void {\n this.columnMenuController.hideColumn(field);\n }\n\n // ── Private helpers ───────────────────────────────────────────────────────────\n\n private findDisplayIndex(originalIndex: number): number {\n return this.navigationController.findDisplayIndex(originalIndex);\n }\n\n private reconcileMarkedRowsAfterInsertion(insertedIndex: number): void {\n if (this.markedIndices().size === 0) return;\n this.markedIndices.update(indices => new Set(\n [...indices].map(index => index >= insertedIndex ? index + 1 : index)\n ));\n }\n\n private reconcileMarkedRowsAfterRemoval(removedIndex: number): void {\n if (this.markedIndices().size === 0) return;\n this.markedIndices.update(indices => new Set(\n [...indices]\n .filter(index => index !== removedIndex)\n .map(index => index > removedIndex ? index - 1 : index)\n ));\n }\n\n private reconcileMarkedRowsAfterMove(oldIndex: number, newIndex: number): void {\n if (this.markedIndices().size === 0 || oldIndex === newIndex) return;\n const destination = newIndex > oldIndex ? newIndex - 1 : newIndex;\n this.markedIndices.update(indices => new Set([...indices].map(index => {\n if (index === oldIndex) return destination;\n if (oldIndex < destination && index > oldIndex && index <= destination) return index - 1;\n if (destination < oldIndex && index >= destination && index < oldIndex) return index + 1;\n return index;\n })));\n }\n\n private isCellEditable(col: ColDef, originalIndex?: number): boolean {\n return this.editController.isCellEditable(col, originalIndex);\n }\n\n private enterEdit(originalIndex: number, ci: number, seedChar: string, selectText = true): void {\n this.editController.start(originalIndex, ci, seedChar, selectText);\n }\n\n private cancelCurrent(): void {\n this.editController.cancel();\n }\n\n /** @internal */\n isRangeSelected(originalIndex: number, colIndex: number): boolean {\n return this.rangeController.isRangeSelected(originalIndex, colIndex);\n }\n\n /** @internal */\n isFindMatchCell(originalIndex: number, colIndex: number): boolean {\n return this.findController.isMatchCell(originalIndex, colIndex);\n }\n\n /** @internal */\n isActiveFindMatchCell(originalIndex: number, colIndex: number): boolean {\n return this.findController.isActiveMatchCell(originalIndex, colIndex);\n }\n\n /** @internal */\n isFillHandleCell(originalIndex: number, colIndex: number): boolean {\n return this.rangeController.isFillHandleCell(originalIndex, colIndex);\n }\n\n /** @internal */\n isFillPreviewCell(originalIndex: number, colIndex: number): boolean {\n return this.rangeController.isFillPreviewCell(originalIndex, colIndex);\n }\n\n private scrollToKeepVisible(displayIndex: number, colIndex: number | null = null): void {\n this.navigationController.scrollToKeepVisible(displayIndex, colIndex);\n }\n\n /** @internal Current rendered width for a column. */\n getColumnWidth(col: ColDef): number {\n return this.columnSizing.getWidth(col);\n }\n\n private getColumnWidthToken(col: ColDef): string {\n return this.columnSizing.getWidthToken(col);\n }\n\n}\n","<div #wrapper class=\"ag-wrapper\" tabindex=\"0\" role=\"grid\" [attr.aria-label]=\"localeText().grid\"\n [attr.aria-rowcount]=\"ariaRowCount()\" [attr.aria-colcount]=\"ariaColCount()\"\n [attr.aria-multiselectable]=\"rowSelection() === 'multi' ? 'true' : null\"\n [attr.aria-readonly]=\"readonlyGrid() ? 'true' : null\" [attr.aria-busy]=\"loading() ? 'true' : null\"\n (copy)=\"onCopy($event)\" (paste)=\"onPaste($event)\" (focusin)=\"onGridFocusIn($event)\"\n (click)=\"closeContextMenu(); closeCellContextMenu(); closeFilterMenu(); closeGroupActionsMenu(); closeMenuBarMenu()\">\n @if (visibleMenuBarItems().length > 0 || enableQuickFilter()) {\n <div class=\"ag-toolbar\">\n @if (visibleMenuBarItems().length > 0) {\n <agrid-menu-bar [items]=\"visibleMenuBarItems()\" [context]=\"menuBarContext()\" [label]=\"localeText().actions\"\n [openItemId]=\"openMenuBarItemId()\" (openItemIdChange)=\"onMenuBarOpenItemChange($event)\"\n (action)=\"onMenuBarAction($event)\" />\n }\n @if (enableQuickFilter()) {\n <input class=\"ag-quick-filter\" type=\"search\" [value]=\"quickFilterValue()\" (input)=\"onQuickFilterInput($event)\"\n [placeholder]=\"localeText().quickFilterPlaceholder\" [attr.aria-label]=\"localeText().quickFilterPlaceholder\" />\n }\n </div>\n }\n <div class=\"ag-main-area\">\n <div class=\"ag-grid-split\" [class.ag-has-right-pane]=\"hasRightPinnedPane()\">\n @if (hasPinnedPane()) {\n <div class=\"ag-pinned-pane\" [style.width.px]=\"pinnedPaneWidth()\">\n <agrid-pane-header\n variant=\"left\"\n [headerGroups]=\"pinnedHeaderGroups()\"\n [columns]=\"pinnedHeaderColumns()\"\n [gridTemplateColumns]=\"pinnedGridTemplateColumns()\"\n [paneWidth]=\"pinnedPaneWidth()\"\n [totalWidth]=\"pinnedPaneWidth()\"\n [hasHeaderGroups]=\"hasHeaderGroups()\"\n [hasFilterableColumns]=\"hasFilterableColumns()\"\n [headerRowCount]=\"headerRowCount()\"\n [showControlColumn]=\"showControlColumn()\"\n [localeText]=\"localeText()\"\n [pivotHeaderLabel]=\"pivotHeaderLabel()\"\n [pivotRowColumnField]=\"pivotRowColumnField()\"\n [hasMultiSort]=\"hasMultiSort()\"\n [filterMenuField]=\"filterMenu()?.field ?? null\"\n [markedColumnFields]=\"markedColumnFields()\"\n (headerGroupPointerDown)=\"onHeaderGroupPointerDown($event.event, $event.fields, $event.label)\"\n (colHeaderPointerDown)=\"onColHeaderPointerDown($event.event, $event.field)\"\n (colHeaderClick)=\"onColHeaderClick($event.event, $event.field)\"\n (filterMenuOpen)=\"openFilterMenu($event.event, $event.field)\"\n (filterConditionMenuOpen)=\"openFilterMenu($event.event, $event.field, 'condition')\"\n (textFilterChange)=\"onTextFilterChange($event.event, $event.field)\"\n (resizeKeyDown)=\"onResizeKeyDown($event.event, $event.col)\"\n (resizeStart)=\"onResizeStart($event.event, $event.col)\"\n (autosizeColumn)=\"onAutosizeColumn($event.event, $event.col)\"\n />\n\n <ng-template #leftRow let-item let-ariaIndex=\"ariaIndex\">\n <div role=\"row\" [attr.aria-rowindex]=\"ariaIndex\" [attr.data-control]=\"true\"\n [attr.aria-selected]=\"isDataRowItem(item) && isRowSelected(item.originalIndex) ? 'true' : null\"\n [class.ag-row]=\"!isGroupHeaderItem(item) && !isDetailRowItem(item)\" [class.ag-add-row]=\"item === null\"\n [class.ag-add-row--selected]=\"item === null && isAddRowSelected()\" [class.ag-ghost-row]=\"item === 'ghost'\"\n [class.ag-group-header-row]=\"isGroupHeaderItem(item)\" [class.ag-detail-row]=\"isDetailRowItem(item)\"\n [class.ag-row--odd]=\"isDataRowItem(item) && dataRowIsOdd().get(item.originalIndex) === true\"\n [class.ag-row--selected]=\"isPinnedPaneRowSelected(item)\"\n [class.ag-row--marked]=\"isDataRowItem(item) && isRowMarked(item.originalIndex)\"\n [class.ag-row--pending-delete]=\"isDataRowItem(item) && isRowPendingDelete(item.originalIndex)\"\n [class.ag-row--indicating]=\"isDataRowItem(item) && rowIndicationActive(item.originalIndex)\"\n [class]=\"isDataRowItem(item) ? getRowClass(item.row, item.originalIndex) : ''\"\n [attr.data-original-index]=\"getItemOriginalIndex(item)\" [style.height.px]=\"rowPx(item)\"\n [style.--agrid-row-indication-color]=\"isDataRowItem(item) ? rowIndicationColor(item.originalIndex) : null\"\n [style.--agrid-row-indication-duration.ms]=\"isDataRowItem(item) ? rowIndicationDuration(item.originalIndex) : null\"\n [style.grid-template-columns]=\"isDataRowItem(item) || isLoadingRow(item) || item === 'ghost' ? pinnedGridTemplateColumns() : null\"\n (pointerdown)=\"isDataRowItem(item) && onRowPointerDown($event, item.originalIndex)\"\n (click)=\"isDataRowItem(item) && onRowClick($event, item)\">\n @if (isDataRowItem(item)) {\n @if (showControlColumn()) {\n <div class=\"ag-control-cell\" role=\"rowheader\" aria-colindex=\"1\"\n [class.ag-control-cell--reorder]=\"allowRowReorder()\"\n [class.ag-control-cell--marking]=\"enableRowMarking()\"\n (contextmenu)=\"onControlContextMenu($event, item.originalIndex)\"\n (click)=\"onControlCellClick($event, item.originalIndex)\"\n (pointerdown)=\"onControlPointerDown($event, item.originalIndex)\">\n @if (canToggleDetail(item)) {\n <button class=\"ag-detail-toggle\" type=\"button\"\n [class.ag-detail-toggle--expanded]=\"isDetailExpanded(item.originalIndex)\"\n [attr.aria-expanded]=\"isDetailExpanded(item.originalIndex)\"\n [attr.aria-label]=\"localeText().toggleDetail\" (pointerdown)=\"$event.stopPropagation()\"\n (click)=\"onDetailToggle(item.originalIndex); $event.stopPropagation()\">▶</button>\n }\n @if (enableRowMarking()) {\n <input class=\"ag-row-marker\" type=\"checkbox\" [checked]=\"isRowMarked(item.originalIndex)\"\n [attr.aria-label]=\"localeText().markRow\" (pointerdown)=\"$event.stopPropagation()\"\n (click)=\"$event.stopPropagation()\" (change)=\"toggleRowMarked(item.originalIndex)\" />\n }\n </div>\n }\n @for (bc of pinnedBodyColumns(); track bc.field) {\n @let col = bc.col;\n @let ci = bc.visibleColIndex;\n <agrid-cell [col]=\"col\" [paneColumns]=\"pinnedColDefs()\" [rowIndex]=\"item.originalIndex\" [colIndex]=\"ci\" [value]=\"item.row[col.field]\" [localeText]=\"localeText()\"\n [displayValueOverride]=\"treeCellDisplayOverride(item, col)\" [row]=\"item.row\" [locale]=\"locale()\"\n [attr.data-cell-row]=\"item.originalIndex\" [attr.data-cell-col]=\"ci\" [attr.data-col-field]=\"col.field\"\n [attr.aria-colindex]=\"bc.ariaColIndex\"\n [attr.aria-selected]=\"isSelected(item.originalIndex, ci) || isRangeSelected(item.originalIndex, ci)\"\n [selected]=\"isSelected(item.originalIndex, ci)\" [editing]=\"isEditing(item.originalIndex, ci)\"\n [editable]=\"isColEditable(col, item.originalIndex) && !isTreeAggregateCell(item, col)\"\n [error]=\"cellValidationError(item.originalIndex, ci)\" [showInfoIcon]=\"showCellInfoIcon(col, item.row)\"\n [seedChar]=\"getSeedChar(item.originalIndex, ci)\" [selectTextOnEdit]=\"selectTextOnEdit()\"\n [treeCell]=\"isTreeCell(col)\" [treeLevel]=\"treeRowLevel(item)\" [treeExpandable]=\"treeRowExpandable(item)\"\n [treeExpanded]=\"treeRowExpanded(item)\"\n [class.ag-cell--range-selected]=\"isRangeSelected(item.originalIndex, ci)\"\n [class.ag-cell--fill-preview]=\"isFillPreviewCell(item.originalIndex, ci)\"\n [class.ag-cell--fill-handle]=\"isFillHandleCell(item.originalIndex, ci)\"\n [class.ag-cell--find-match]=\"isFindMatchCell(item.originalIndex, ci)\"\n [class.ag-cell--find-active]=\"isActiveFindMatchCell(item.originalIndex, ci)\"\n [class.ag-cell--changed]=\"isCellChanged(item.originalIndex, col.field)\"\n [class.ag-column--marked]=\"markedColumnFields().has(col.field)\"\n [class.ag-column-reorder-item--dragging]=\"bc.dragging\"\n [style.transform]=\"'translateX(' + bc.reorderOffset + 'px)'\"\n [class]=\"getCellClass(col, item.row[col.field], item.row)\" [class.ag-cell--pinned]=\"true\"\n [class.ag-cell--pinned-last]=\"bc.lastPinned\"\n (pointerdown)=\"onCellPointerDown($event, item.originalIndex, ci)\"\n (activate)=\"onActivate(item.originalIndex, ci, $event)\" (startEdit)=\"onStartEdit(item.originalIndex, ci)\"\n (draftChange)=\"onDraftChange($event)\" (editorCommit)=\"onEditorCommit()\" (editorCancel)=\"onEditorCancel()\"\n (booleanToggle)=\"onBooleanToggle(item.originalIndex, ci, $event)\"\n (infoClick)=\"onCellInfo(item.originalIndex, col, item.row)\" (treeToggle)=\"onTreeToggle(item)\"\n (contextmenu)=\"onCellContextMenu($event, item.originalIndex, ci, col, item.row)\" />\n }\n } @else if (isLoadingRow(item)) {\n <div class=\"ag-loading-row\" aria-hidden=\"true\"><span></span></div>\n } @else if (item === null) {\n <div class=\"ag-pinned-row-spacer\"></div>\n } @else if (item === 'ghost') {\n @if (showControlColumn()) {\n <div class=\"ag-control-cell ag-control-cell--reorder ag-ghost-handle\"></div>\n }\n @for (bc of pinnedBodyColumns(); track bc.field) {\n <div class=\"ag-ghost-cell ag-cell--pinned\"\n [class.ag-column-reorder-item--dragging]=\"bc.dragging\"\n [style.transform]=\"'translateX(' + bc.reorderOffset + 'px)'\"\n [class.ag-cell--pinned-last]=\"bc.lastPinned\">{{\n getGhostCellDisplay(bc.col) }}</div>\n }\n } @else {\n <div class=\"ag-pinned-row-spacer\"></div>\n }\n </div>\n </ng-template>\n\n @if (hasPinnedTopRows()) {\n <div class=\"ag-pinned-rows ag-pinned-rows--top ag-pinned-body\" [style.width.px]=\"pinnedPaneWidth()\">\n @for (item of pinnedTopItems(); track item.originalIndex) {\n <ng-container [ngTemplateOutlet]=\"leftRow\"\n [ngTemplateOutletContext]=\"{ $implicit: item, ariaIndex: headerRowCount() + 1 + $index }\" />\n }\n </div>\n }\n\n <cdk-virtual-scroll-viewport #pinnedViewport class=\"ag-body ag-pinned-body\" [agridVariableRowSize]=\"itemSizes()\"\n [style.width.px]=\"pinnedPaneWidth()\">\n <ng-container *cdkVirtualFor=\"let item of displayItems(); let di = index; trackBy: trackByItem\">\n <ng-container [ngTemplateOutlet]=\"leftRow\"\n [ngTemplateOutletContext]=\"{ $implicit: item, ariaIndex: di + headerRowCount() + 1 + pinnedTopItems().length }\" />\n </ng-container>\n </cdk-virtual-scroll-viewport>\n\n @if (hasPinnedBottomRows()) {\n <div class=\"ag-pinned-rows ag-pinned-rows--bottom ag-pinned-body\" [style.width.px]=\"pinnedPaneWidth()\">\n @for (item of pinnedBottomItems(); track item.originalIndex) {\n <ng-container [ngTemplateOutlet]=\"leftRow\"\n [ngTemplateOutletContext]=\"{ $implicit: item, ariaIndex: headerRowCount() + 1 + pinnedTopItems().length + displayItems().length + $index }\" />\n }\n </div>\n }\n\n @if (showFooter()) {\n <div class=\"ag-footer\" role=\"row\" [attr.aria-rowindex]=\"displayItems().length + headerRowCount() + 1\"\n [style.grid-template-columns]=\"pinnedGridTemplateColumns()\">\n @if (showControlColumn()) {\n <div class=\"ag-footer-cell ag-footer-cell--control\" role=\"gridcell\" aria-colindex=\"1\"></div>\n }\n @for (bc of pinnedBodyColumns(); track bc.field) {\n @let col = bc.col;\n <div class=\"ag-footer-cell\" role=\"gridcell\"\n [class.ag-column--marked]=\"markedColumnFields().has(col.field)\"\n [class.ag-column-reorder-item--dragging]=\"bc.dragging\"\n [style.transform]=\"'translateX(' + bc.reorderOffset + 'px)'\"\n [attr.aria-colindex]=\"bc.ariaColIndex\"\n [class.ag-footer-cell--pinned-last]=\"bc.lastPinned\">\n @if (hasAggregate(col)) {\n <span class=\"ag-footer-label\">{{ getAggregateLabel(col) }}</span>\n {{ getFooterDisplay(col, footerValues()[col.field]) }}\n }\n </div>\n }\n </div>\n }\n </div>\n }\n\n <div class=\"ag-scroll-pane\">\n <div #horizontalScroller class=\"ag-horizontal-scroll\" (scroll)=\"onHorizontalScroll()\">\n <agrid-pane-header\n variant=\"center\"\n [headerGroups]=\"scrollableHeaderGroups()\"\n [columns]=\"scrollableHeaderColumns()\"\n [gridTemplateColumns]=\"scrollableGridTemplateColumns()\"\n [paneWidth]=\"scrollableTotalWidth()\"\n [totalWidth]=\"scrollableTotalWidth()\"\n [hasHeaderGroups]=\"hasHeaderGroups()\"\n [hasFilterableColumns]=\"hasFilterableColumns()\"\n [headerRowCount]=\"headerRowCount()\"\n [showControlColumn]=\"showControlColumn()\"\n [localeText]=\"localeText()\"\n [pivotHeaderLabel]=\"pivotHeaderLabel()\"\n [pivotRowColumnField]=\"pivotRowColumnField()\"\n [hasMultiSort]=\"hasMultiSort()\"\n [filterMenuField]=\"filterMenu()?.field ?? null\"\n [markedColumnFields]=\"markedColumnFields()\"\n (headerGroupPointerDown)=\"onHeaderGroupPointerDown($event.event, $event.fields, $event.label)\"\n (colHeaderPointerDown)=\"onColHeaderPointerDown($event.event, $event.field)\"\n (colHeaderClick)=\"onColHeaderClick($event.event, $event.field)\"\n (filterMenuOpen)=\"openFilterMenu($event.event, $event.field)\"\n (filterConditionMenuOpen)=\"openFilterMenu($event.event, $event.field, 'condition')\"\n (textFilterChange)=\"onTextFilterChange($event.event, $event.field)\"\n (resizeKeyDown)=\"onResizeKeyDown($event.event, $event.col)\"\n (resizeStart)=\"onResizeStart($event.event, $event.col)\"\n (autosizeColumn)=\"onAutosizeColumn($event.event, $event.col)\"\n />\n\n <ng-template #bodyRow let-item let-ariaIndex=\"ariaIndex\">\n <div role=\"row\" [attr.aria-rowindex]=\"ariaIndex\"\n [attr.aria-selected]=\"isDataRowItem(item) && isRowSelected(item.originalIndex) ? 'true' : null\"\n [class.ag-row]=\"!isGroupHeaderItem(item) && !isDetailRowItem(item)\" [class.ag-add-row]=\"item === null\"\n [class.ag-add-row--selected]=\"item === null && isAddRowSelected()\" [class.ag-ghost-row]=\"item === 'ghost'\"\n [class.ag-group-header-row]=\"isGroupHeaderItem(item)\" [class.ag-detail-row]=\"isDetailRowItem(item)\"\n [class.ag-row--odd]=\"isDataRowItem(item) && dataRowIsOdd().get(item.originalIndex) === true\"\n [class.ag-row--selected]=\"isDataRowItem(item) && isRowSelected(item.originalIndex)\"\n [class.ag-row--marked]=\"isDataRowItem(item) && isRowMarked(item.originalIndex)\"\n [class.ag-row--pending-delete]=\"isDataRowItem(item) && isRowPendingDelete(item.originalIndex)\"\n [class.ag-row--indicating]=\"isDataRowItem(item) && rowIndicationActive(item.originalIndex)\"\n [class]=\"isDataRowItem(item) ? getRowClass(item.row, item.originalIndex) : ''\"\n [attr.data-original-index]=\"getItemOriginalIndex(item)\" [style.height.px]=\"rowPx(item)\"\n [style.--agrid-row-indication-color]=\"isDataRowItem(item) ? rowIndicationColor(item.originalIndex) : null\"\n [style.--agrid-row-indication-duration.ms]=\"isDataRowItem(item) ? rowIndicationDuration(item.originalIndex) : null\"\n [style.grid-template-columns]=\"isDataRowItem(item) || isLoadingRow(item) || item === 'ghost' ? scrollableGridTemplateColumns() : null\"\n (pointerdown)=\"isDataRowItem(item) && onRowPointerDown($event, item.originalIndex)\"\n (click)=\"isDataRowItem(item) && onRowClick($event, item)\">\n @if (isDataRowItem(item)) {\n @if (columnWindow().leftWidth > 0) {\n <div class=\"ag-virtual-col-spacer\" aria-hidden=\"true\"\n [style.grid-column]=\"'1 / span ' + columnWindow().start\"></div>\n }\n @for (bc of virtualScrollableBodyColumns(); track bc.field) {\n @let col = bc.col;\n @let ci = bc.visibleColIndex;\n <agrid-cell [col]=\"col\" [paneColumns]=\"scrollableColDefs()\" [rowIndex]=\"item.originalIndex\" [colIndex]=\"ci\" [value]=\"item.row[col.field]\" [localeText]=\"localeText()\"\n [displayValueOverride]=\"treeCellDisplayOverride(item, col)\" [row]=\"item.row\" [locale]=\"locale()\"\n [attr.data-cell-row]=\"item.originalIndex\" [attr.data-cell-col]=\"ci\" [attr.data-col-field]=\"col.field\"\n [attr.aria-colindex]=\"bc.ariaColIndex\"\n [attr.aria-selected]=\"isSelected(item.originalIndex, ci) || isRangeSelected(item.originalIndex, ci)\"\n [selected]=\"isSelected(item.originalIndex, ci)\" [editing]=\"isEditing(item.originalIndex, ci)\"\n [editable]=\"isColEditable(col, item.originalIndex) && !isTreeAggregateCell(item, col)\"\n [error]=\"cellValidationError(item.originalIndex, ci)\" [showInfoIcon]=\"showCellInfoIcon(col, item.row)\"\n [seedChar]=\"getSeedChar(item.originalIndex, ci)\" [selectTextOnEdit]=\"selectTextOnEdit()\"\n [treeCell]=\"isTreeCell(col)\" [treeLevel]=\"treeRowLevel(item)\" [treeExpandable]=\"treeRowExpandable(item)\"\n [treeExpanded]=\"treeRowExpanded(item)\"\n [class.ag-cell--range-selected]=\"isRangeSelected(item.originalIndex, ci)\"\n [class.ag-cell--fill-preview]=\"isFillPreviewCell(item.originalIndex, ci)\"\n [class.ag-cell--fill-handle]=\"isFillHandleCell(item.originalIndex, ci)\"\n [class]=\"getCellClass(col, item.row[col.field], item.row)\"\n [class.ag-cell--changed]=\"isCellChanged(item.originalIndex, col.field)\"\n [class.ag-column--marked]=\"markedColumnFields().has(col.field)\"\n [class.ag-column-reorder-item--dragging]=\"bc.dragging\"\n [style.transform]=\"'translateX(' + bc.reorderOffset + 'px)'\"\n [class.ag-cell--find-match]=\"isFindMatchCell(item.originalIndex, ci)\"\n [class.ag-cell--find-active]=\"isActiveFindMatchCell(item.originalIndex, ci)\"\n (pointerdown)=\"onCellPointerDown($event, item.originalIndex, ci)\"\n (activate)=\"onActivate(item.originalIndex, ci, $event)\"\n (startEdit)=\"onStartEdit(item.originalIndex, ci)\" (draftChange)=\"onDraftChange($event)\"\n (editorCommit)=\"onEditorCommit()\" (editorCancel)=\"onEditorCancel()\"\n (booleanToggle)=\"onBooleanToggle(item.originalIndex, ci, $event)\" (treeToggle)=\"onTreeToggle(item)\"\n (infoClick)=\"onCellInfo(item.originalIndex, col, item.row)\"\n (contextmenu)=\"onCellContextMenu($event, item.originalIndex, ci, col, item.row)\" />\n }\n @if (columnWindowRightSpan() > 0) {\n <div class=\"ag-virtual-col-spacer\" aria-hidden=\"true\"\n [style.grid-column]=\"'span ' + columnWindowRightSpan()\"></div>\n }\n } @else if (isLoadingRow(item)) {\n <div class=\"ag-loading-row\" aria-hidden=\"true\"><span></span></div>\n } @else if (item === null) {\n <div class=\"ag-add-row-label\" (click)=\"onActivateAddRow()\">\n <span class=\"ag-add-row-icon\">+</span> {{ localeText().addRow }}\n </div>\n } @else if (item === 'ghost') {\n @for (bc of scrollableBodyColumns(); track bc.field) {\n <div class=\"ag-ghost-cell\" [class.ag-column-reorder-item--dragging]=\"bc.dragging\"\n [style.transform]=\"'translateX(' + bc.reorderOffset + 'px)'\">{{\n getGhostCellDisplay(bc.col) }}</div>\n }\n } @else if (isDetailRowItem(item)) {\n <div class=\"ag-detail-panel\" [style.height.px]=\"detailRowHeight()\"\n [style.min-width.px]=\"scrollableTotalWidth()\">\n <div [innerHTML]=\"detailHtml(item)\"></div>\n @if (detailColumn(); as detailCol) {\n <div class=\"ag-detail-column-field\">\n <span class=\"ag-detail-column-label\">{{ detailCol.header }}</span>\n @if (detailActions().length && isDetailFieldEditable(item)) {\n <div class=\"ag-detail-action-bar\" role=\"toolbar\" [attr.aria-label]=\"detailCol.header + localeText().templates\">\n @for (action of detailActions(); track action.id) {\n <button type=\"button\" class=\"ag-detail-action-btn\"\n (click)=\"applyDetailAction(item, action, $event)\">{{ action.label }}</button>\n }\n </div>\n }\n @if (detailEditingRow() === item.detailFor) {\n <textarea class=\"ag-detail-column-textarea\" [attr.data-detail-row]=\"item.detailFor\"\n [class.ag-detail-column-textarea--invalid]=\"!!detailValidationError()\"\n [value]=\"detailDraft()\" (input)=\"onDetailDraftInput($event)\"\n (pointerdown)=\"$event.stopPropagation()\"\n (keydown)=\"onDetailEditorKeydown(item, $event)\"\n (blur)=\"commitDetailFieldEdit(item)\"></textarea>\n @if (detailValidationError(); as message) {\n <span class=\"ag-detail-column-error\" role=\"alert\">{{ message }}</span>\n }\n } @else {\n <div class=\"ag-detail-column-value\" [class.ag-detail-column-value--editable]=\"isDetailFieldEditable(item)\"\n [attr.tabindex]=\"isDetailFieldEditable(item) ? 0 : null\"\n (click)=\"startDetailFieldEdit(item, $event)\"\n (keydown.enter)=\"startDetailFieldEdit(item, $event)\">{{ detailFieldDisplay(item) }}</div>\n }\n </div>\n }\n </div>\n } @else if (isPathTreeNodeItem(item)) {\n <div class=\"ag-path-tree-content\" [style.min-width.px]=\"scrollableTotalWidth()\"\n [style.padding-left.px]=\"treeRowLevel(item) * 16 + 8\"\n (click)=\"onTreeNodeClick(item); $event.stopPropagation()\"\n (dblclick)=\"onTreeNodeDoubleClick(item); $event.stopPropagation()\">\n <button type=\"button\" class=\"ag-tree-twisty\" [class.ag-tree-twisty--expanded]=\"treeRowExpanded(item)\"\n [attr.aria-expanded]=\"treeRowExpanded(item)\"\n (click)=\"onTreeToggle(item); $event.stopPropagation()\">▶</button>\n <span>{{ pathTreeLabel(item) }}</span>\n @if (item.aggregates; as aggregates) {\n <span class=\"ag-group-aggregates\">\n @for (col of visibleColDefs(); track col.field) {\n @if (col.field !== treeConfig()!.treeField && aggregates[col.field] !== undefined) {\n <span class=\"ag-group-aggregate\">\n <span class=\"ag-group-aggregate-col\">{{ col.header }}</span>\n <span class=\"ag-group-aggregate-op\">{{ getAggregateLabel(col) }}</span>\n {{ getFooterDisplay(col, aggregates[col.field]) }}\n </span>\n }\n }\n </span>\n }\n </div>\n } @else {\n <div class=\"ag-group-header-content\" [style.min-width.px]=\"scrollableTotalWidth()\">\n <div class=\"ag-group-header-main\"\n (click)=\"onGroupHeaderClick(item.groupLabel); $event.stopPropagation()\">\n <span class=\"ag-group-icon\" [class.ag-group-icon--expanded]=\"!item.collapsed\">▶</span>\n <span class=\"ag-group-label\">{{ item.groupLabel }}</span>\n @if (groupActions().length > 0) {\n <button class=\"ag-group-actions-btn\" [title]=\"localeText().actions\"\n (click)=\"openGroupActionsMenu($event, item.groupLabel)\">⋮</button>\n }\n <span class=\"ag-group-count\">{{ item.count }}</span>\n @if (getGroupDescription(item.groupLabel); as desc) {\n <span class=\"ag-group-description\">{{ desc }}</span>\n }\n @if (item.aggregates; as aggs) {\n <span class=\"ag-group-aggregates\">\n @for (col of visibleColDefs(); track col.field) {\n @if (hasAggregate(col) && aggs[col.field] !== undefined) {\n <span class=\"ag-group-aggregate\">\n <span class=\"ag-group-aggregate-col\">{{ col.header }}</span>\n <span class=\"ag-group-aggregate-op\">{{ getAggregateLabel(col) }}</span>\n {{ getFooterDisplay(col, aggs[col.field]) }}\n </span>\n }\n }\n </span>\n }\n </div>\n </div>\n }\n @if (isDataRowItem(item) && isRowPendingDelete(item.originalIndex)) {\n <div class=\"ag-delete-confirmation\" role=\"alertdialog\" [attr.aria-label]=\"localeText().confirmDeleteRow\"\n [style.left.px]=\"deleteConfirmationLeft()\" [style.width.px]=\"deleteConfirmationWidth() || null\"\n (pointerdown)=\"$event.stopPropagation()\" (click)=\"$event.stopPropagation()\">\n <span class=\"ag-delete-confirmation-text\">{{ localeText().confirmDeleteRow }}</span>\n <button class=\"ag-delete-confirmation-btn ag-delete-confirmation-btn--yes\" type=\"button\"\n (click)=\"confirmPendingRowDelete()\">{{ localeText().confirmYes }}</button>\n <button class=\"ag-delete-confirmation-btn\" type=\"button\" data-delete-confirm-no\n (click)=\"cancelRowDelete()\">{{ localeText().confirmNo }}</button>\n </div>\n }\n </div>\n </ng-template>\n\n @if (hasPinnedTopRows()) {\n <div class=\"ag-pinned-rows ag-pinned-rows--top\" [style.min-width.px]=\"scrollableTotalWidth()\">\n @for (item of pinnedTopItems(); track item.originalIndex) {\n <ng-container [ngTemplateOutlet]=\"bodyRow\"\n [ngTemplateOutletContext]=\"{ $implicit: item, ariaIndex: headerRowCount() + 1 + $index }\" />\n }\n </div>\n }\n\n <cdk-virtual-scroll-viewport #scrollViewport class=\"ag-body\" [agridVariableRowSize]=\"itemSizes()\"\n [style.min-width.px]=\"scrollableTotalWidth()\" (scroll)=\"onBodyScroll()\">\n <ng-container *cdkVirtualFor=\"let item of displayItems(); let di = index; trackBy: trackByItem\">\n <ng-container [ngTemplateOutlet]=\"bodyRow\"\n [ngTemplateOutletContext]=\"{ $implicit: item, ariaIndex: di + headerRowCount() + 1 + pinnedTopItems().length }\" />\n </ng-container>\n </cdk-virtual-scroll-viewport>\n\n @if (hasPinnedBottomRows()) {\n <div class=\"ag-pinned-rows ag-pinned-rows--bottom\" [style.min-width.px]=\"scrollableTotalWidth()\">\n @for (item of pinnedBottomItems(); track item.originalIndex) {\n <ng-container [ngTemplateOutlet]=\"bodyRow\"\n [ngTemplateOutletContext]=\"{ $implicit: item, ariaIndex: headerRowCount() + 1 + pinnedTopItems().length + displayItems().length + $index }\" />\n }\n </div>\n }\n\n @if (showFooter()) {\n <div class=\"ag-footer\" role=\"row\" [attr.aria-rowindex]=\"displayItems().length + headerRowCount() + 1\"\n [style.grid-template-columns]=\"scrollableGridTemplateColumns()\"\n [style.min-width.px]=\"scrollableTotalWidth()\">\n @for (bc of scrollableBodyColumns(); track bc.field) {\n @let col = bc.col;\n <div class=\"ag-footer-cell\" role=\"gridcell\"\n [class.ag-column--marked]=\"markedColumnFields().has(col.field)\"\n [class.ag-column-reorder-item--dragging]=\"bc.dragging\"\n [style.transform]=\"'translateX(' + bc.reorderOffset + 'px)'\"\n [attr.aria-colindex]=\"bc.ariaColIndex\">\n @if (hasAggregate(col)) {\n <span class=\"ag-footer-label\">{{ getAggregateLabel(col) }}</span>\n {{ getFooterDisplay(col, footerValues()[col.field]) }}\n }\n </div>\n }\n </div>\n }\n </div>\n </div>\n\n @if (hasRightPinnedPane()) {\n <div class=\"ag-pinned-pane ag-pinned-pane--right\" [style.width.px]=\"rightPinnedPaneWidth()\">\n <agrid-pane-header\n variant=\"right\"\n [headerGroups]=\"rightHeaderGroups()\"\n [columns]=\"rightHeaderColumns()\"\n [gridTemplateColumns]=\"rightGridTemplateColumns()\"\n [paneWidth]=\"rightPinnedPaneWidth()\"\n [totalWidth]=\"rightPinnedPaneWidth()\"\n [hasHeaderGroups]=\"hasHeaderGroups()\"\n [hasFilterableColumns]=\"hasFilterableColumns()\"\n [headerRowCount]=\"headerRowCount()\"\n [showControlColumn]=\"showControlColumn()\"\n [localeText]=\"localeText()\"\n [pivotHeaderLabel]=\"pivotHeaderLabel()\"\n [pivotRowColumnField]=\"pivotRowColumnField()\"\n [hasMultiSort]=\"hasMultiSort()\"\n [filterMenuField]=\"filterMenu()?.field ?? null\"\n [markedColumnFields]=\"markedColumnFields()\"\n (headerGroupPointerDown)=\"onHeaderGroupPointerDown($event.event, $event.fields, $event.label)\"\n (colHeaderPointerDown)=\"onColHeaderPointerDown($event.event, $event.field)\"\n (colHeaderClick)=\"onColHeaderClick($event.event, $event.field)\"\n (filterMenuOpen)=\"openFilterMenu($event.event, $event.field)\"\n (filterConditionMenuOpen)=\"openFilterMenu($event.event, $event.field, 'condition')\"\n (textFilterChange)=\"onTextFilterChange($event.event, $event.field)\"\n (resizeKeyDown)=\"onResizeKeyDown($event.event, $event.col)\"\n (resizeStart)=\"onResizeStart($event.event, $event.col)\"\n (autosizeColumn)=\"onAutosizeColumn($event.event, $event.col)\"\n />\n\n <ng-template #rightRow let-item let-ariaIndex=\"ariaIndex\">\n <div role=\"row\" [attr.aria-rowindex]=\"ariaIndex\"\n [attr.aria-selected]=\"isDataRowItem(item) && isRowSelected(item.originalIndex) ? 'true' : null\"\n [class.ag-row]=\"!isGroupHeaderItem(item) && !isDetailRowItem(item)\" [class.ag-add-row]=\"item === null\"\n [class.ag-ghost-row]=\"item === 'ghost'\" [class.ag-group-header-row]=\"isGroupHeaderItem(item)\"\n [class.ag-detail-row]=\"isDetailRowItem(item)\"\n [class.ag-row--odd]=\"isDataRowItem(item) && dataRowIsOdd().get(item.originalIndex) === true\"\n [class.ag-row--selected]=\"isDataRowItem(item) && isRowSelected(item.originalIndex)\"\n [class.ag-row--marked]=\"isDataRowItem(item) && isRowMarked(item.originalIndex)\"\n [class.ag-row--pending-delete]=\"isDataRowItem(item) && isRowPendingDelete(item.originalIndex)\"\n [class.ag-row--indicating]=\"isDataRowItem(item) && rowIndicationActive(item.originalIndex)\"\n [class]=\"isDataRowItem(item) ? getRowClass(item.row, item.originalIndex) : ''\"\n [style.height.px]=\"rowPx(item)\"\n [style.--agrid-row-indication-color]=\"isDataRowItem(item) ? rowIndicationColor(item.originalIndex) : null\"\n [style.--agrid-row-indication-duration.ms]=\"isDataRowItem(item) ? rowIndicationDuration(item.originalIndex) : null\"\n [style.grid-template-columns]=\"isDataRowItem(item) || isLoadingRow(item) || item === 'ghost' ? rightGridTemplateColumns() : null\">\n @if (isDataRowItem(item)) {\n @for (bc of rightBodyColumns(); track bc.field) {\n @let col = bc.col;\n @let ci = bc.visibleColIndex;\n <agrid-cell [col]=\"col\" [paneColumns]=\"rightPinnedColDefs()\" [rowIndex]=\"item.originalIndex\" [colIndex]=\"ci\" [value]=\"item.row[col.field]\" [localeText]=\"localeText()\"\n [displayValueOverride]=\"treeCellDisplayOverride(item, col)\" [row]=\"item.row\" [locale]=\"locale()\"\n [attr.data-cell-row]=\"item.originalIndex\" [attr.data-cell-col]=\"ci\" [attr.data-col-field]=\"col.field\"\n [attr.aria-colindex]=\"bc.ariaColIndex\"\n [attr.aria-selected]=\"isSelected(item.originalIndex, ci) || isRangeSelected(item.originalIndex, ci)\"\n [selected]=\"isSelected(item.originalIndex, ci)\" [editing]=\"isEditing(item.originalIndex, ci)\"\n [editable]=\"isColEditable(col, item.originalIndex) && !isTreeAggregateCell(item, col)\"\n [error]=\"cellValidationError(item.originalIndex, ci)\" [showInfoIcon]=\"showCellInfoIcon(col, item.row)\"\n [seedChar]=\"getSeedChar(item.originalIndex, ci)\" [selectTextOnEdit]=\"selectTextOnEdit()\"\n [treeCell]=\"isTreeCell(col)\" [treeLevel]=\"treeRowLevel(item)\" [treeExpandable]=\"treeRowExpandable(item)\"\n [treeExpanded]=\"treeRowExpanded(item)\" [class]=\"getCellClass(col, item.row[col.field], item.row)\"\n [class.ag-cell--range-selected]=\"isRangeSelected(item.originalIndex, ci)\"\n [class.ag-cell--fill-preview]=\"isFillPreviewCell(item.originalIndex, ci)\"\n [class.ag-cell--fill-handle]=\"isFillHandleCell(item.originalIndex, ci)\"\n [class.ag-cell--changed]=\"isCellChanged(item.originalIndex, col.field)\"\n [class.ag-column--marked]=\"markedColumnFields().has(col.field)\"\n [class.ag-column-reorder-item--dragging]=\"bc.dragging\"\n [style.transform]=\"'translateX(' + bc.reorderOffset + 'px)'\"\n [class.ag-cell--find-match]=\"isFindMatchCell(item.originalIndex, ci)\"\n [class.ag-cell--find-active]=\"isActiveFindMatchCell(item.originalIndex, ci)\"\n [class.ag-cell--pinned]=\"true\" [class.ag-cell--pinned-first]=\"bc.firstRightPinned\"\n (pointerdown)=\"onCellPointerDown($event, item.originalIndex, ci)\"\n (activate)=\"onActivate(item.originalIndex, ci, $event)\" (startEdit)=\"onStartEdit(item.originalIndex, ci)\"\n (draftChange)=\"onDraftChange($event)\" (editorCommit)=\"onEditorCommit()\" (editorCancel)=\"onEditorCancel()\"\n (booleanToggle)=\"onBooleanToggle(item.originalIndex, ci, $event)\"\n (infoClick)=\"onCellInfo(item.originalIndex, col, item.row)\" (treeToggle)=\"onTreeToggle(item)\"\n (contextmenu)=\"onCellContextMenu($event, item.originalIndex, ci, col, item.row)\" />\n }\n } @else if (isLoadingRow(item)) {\n <div class=\"ag-loading-row\" aria-hidden=\"true\"><span></span></div>\n } @else if (item === null) {\n <div class=\"ag-pinned-row-spacer\"></div>\n } @else if (item === 'ghost') {\n @for (bc of rightBodyColumns(); track bc.field) {\n <div class=\"ag-ghost-cell ag-cell--pinned\"\n [class.ag-column-reorder-item--dragging]=\"bc.dragging\"\n [style.transform]=\"'translateX(' + bc.reorderOffset + 'px)'\"\n [class.ag-cell--pinned-first]=\"bc.firstRightPinned\">{{ getGhostCellDisplay(bc.col) }}</div>\n }\n } @else {\n <div class=\"ag-pinned-row-spacer\"></div>\n }\n </div>\n </ng-template>\n\n @if (hasPinnedTopRows()) {\n <div class=\"ag-pinned-rows ag-pinned-rows--top ag-pinned-body ag-right-pinned-body\"\n [style.width.px]=\"rightPinnedPaneWidth()\">\n @for (item of pinnedTopItems(); track item.originalIndex) {\n <ng-container [ngTemplateOutlet]=\"rightRow\"\n [ngTemplateOutletContext]=\"{ $implicit: item, ariaIndex: headerRowCount() + 1 + $index }\" />\n }\n </div>\n }\n\n <cdk-virtual-scroll-viewport #rightPinnedViewport class=\"ag-body ag-pinned-body ag-right-pinned-body\"\n [agridVariableRowSize]=\"itemSizes()\" [style.width.px]=\"rightPinnedPaneWidth()\"\n (scroll)=\"onRightPinnedBodyScroll()\">\n <ng-container *cdkVirtualFor=\"let item of displayItems(); let di = index; trackBy: trackByItem\">\n <ng-container [ngTemplateOutlet]=\"rightRow\"\n [ngTemplateOutletContext]=\"{ $implicit: item, ariaIndex: di + headerRowCount() + 1 + pinnedTopItems().length }\" />\n </ng-container>\n </cdk-virtual-scroll-viewport>\n\n @if (hasPinnedBottomRows()) {\n <div class=\"ag-pinned-rows ag-pinned-rows--bottom ag-pinned-body ag-right-pinned-body\"\n [style.width.px]=\"rightPinnedPaneWidth()\">\n @for (item of pinnedBottomItems(); track item.originalIndex) {\n <ng-container [ngTemplateOutlet]=\"rightRow\"\n [ngTemplateOutletContext]=\"{ $implicit: item, ariaIndex: headerRowCount() + 1 + pinnedTopItems().length + displayItems().length + $index }\" />\n }\n </div>\n }\n\n @if (showFooter()) {\n <div class=\"ag-footer\" role=\"row\" [attr.aria-rowindex]=\"displayItems().length + headerRowCount() + 1\"\n [style.grid-template-columns]=\"rightGridTemplateColumns()\">\n @for (bc of rightBodyColumns(); track bc.field) {\n @let col = bc.col;\n <div class=\"ag-footer-cell\" role=\"gridcell\"\n [class.ag-column--marked]=\"markedColumnFields().has(col.field)\"\n [class.ag-column-reorder-item--dragging]=\"bc.dragging\"\n [style.transform]=\"'translateX(' + bc.reorderOffset + 'px)'\"\n [attr.aria-colindex]=\"bc.ariaColIndex\"\n [class.ag-footer-cell--pinned-first]=\"bc.firstRightPinned\">\n @if (hasAggregate(col)) {\n <span class=\"ag-footer-label\">{{ getAggregateLabel(col) }}</span>\n {{ getFooterDisplay(col, footerValues()[col.field]) }}\n }\n </div>\n }\n </div>\n }\n </div>\n }\n </div>\n\n @if (loading()) {\n <div class=\"ag-state-overlay\" role=\"status\" aria-live=\"polite\">{{ localeText().loading }}</div>\n } @else if (isEmpty()) {\n <div class=\"ag-state-overlay\" role=\"status\" aria-live=\"polite\">{{ emptyTextLabel() }}</div>\n }\n\n @if (showSidebar()) {\n <agrid-sidebar [open]=\"sidebarOpen()\" [activeTab]=\"sidebarTab()\" [columns]=\"colDefs()\"\n [pivotColumns]=\"sidebarPivotColumns()\" [pivotConfig]=\"provider().pivotConfig\" [headerGroups]=\"headerGroups()\"\n [row]=\"sidebarRow()\" [rowIndex]=\"selectedRowIndex()\" [hiddenColumns]=\"sidebarHiddenColumns()\" [locale]=\"locale()\"\n [localeText]=\"localeText()\" [readonlyGrid]=\"readonlyGrid()\" [useSidebarEditor]=\"useSidebarEditor()\"\n [isCellEditable]=\"isCellEditableForRow\" [errors]=\"sidebarValidationErrors()\" (close)=\"toggleSidebar()\"\n (tabChange)=\"onSidebarStripClick($event)\" (toggleColumn)=\"onSidebarToggleColumn($event)\"\n (toggleColumnGroup)=\"onSidebarToggleColumnGroup($event.fields, $event.visible)\"\n (pivotChange)=\"onSidebarPivotChange($event)\" (detailEdit)=\"onSidebarDetailEdit($event)\"\n (save)=\"onSidebarDetailSave($event)\" />\n }\n </div><!-- /.ag-main-area -->\n\n @if (!hideGridStatusBar() && selectionSummaryDisplay(); as summary) {\n <div class=\"ag-status-bar\" role=\"status\" aria-live=\"polite\">\n <span><strong>{{ localeText().aggregateCount }}:</strong> {{ summary.count }}</span>\n <span><strong>{{ localeText().aggregateSum }}:</strong> {{ summary.sum }}</span>\n <span><strong>{{ localeText().aggregateAvg }}:</strong> {{ summary.average }}</span>\n <span><strong>{{ localeText().aggregateMin }}:</strong> {{ summary.min }}</span>\n <span><strong>{{ localeText().aggregateMax }}:</strong> {{ summary.max }}</span>\n </div>\n }\n\n @if (showPagination()) {\n <nav class=\"ag-pagination\" [attr.aria-label]=\"localeText().pagination\">\n <button class=\"ag-page-btn\" [attr.aria-label]=\"localeText().firstPage\" [disabled]=\"control()!.currentPage() <= 1\"\n (click)=\"goToFirstPage()\">«</button>\n <button class=\"ag-page-btn\" [attr.aria-label]=\"localeText().previous\" [disabled]=\"control()!.currentPage() <= 1\"\n (click)=\"goToPrevPage()\">‹</button>\n <span class=\"ag-page-info\" aria-live=\"polite\">{{ control()!.currentPage() }} / {{ totalPages() }}</span>\n <button class=\"ag-page-btn\" [disabled]=\"control()!.currentPage() >= totalPages()\"\n [attr.aria-label]=\"localeText().next\" (click)=\"goToNextPage()\">›</button>\n <button class=\"ag-page-btn\" [disabled]=\"control()!.currentPage() >= totalPages()\"\n [attr.aria-label]=\"localeText().lastPage\" (click)=\"goToLastPage()\">»</button>\n <span class=\"ag-page-count\">{{ localeText().rows(filteredRowCount()) }}</span>\n </nav>\n }\n\n @if (findOpen()) {\n <agrid-find-panel [query]=\"findQuery()\" [matchCount]=\"findMatches().length\" [activeIndex]=\"findActiveIndex()\"\n [localeText]=\"localeText()\" (queryChange)=\"onFindInput($event)\" (previous)=\"goToFindMatch(-1)\"\n (next)=\"goToFindMatch(1)\" (close)=\"closeFind()\" />\n }\n\n <!-- Row context menu -->\n @if (contextMenu(); as menu) {\n @if(hasContextMenuEntries()) {\n <div class=\"ag-context-menu\" role=\"menu\" [style.left.px]=\"menu.x\" [style.top.px]=\"menu.y\"\n (click)=\"$event.stopPropagation()\">\n @if (!treeConfig()) {\n @if (rowPinState(menu.rowIndex)) {\n <button class=\"ag-context-item\" role=\"menuitem\" (click)=\"onPinRow(menu.rowIndex, null)\">{{ localeText().unpinRow\n }}</button>\n } @else {\n <button class=\"ag-context-item\" role=\"menuitem\" (click)=\"onPinRow(menu.rowIndex, 'top')\">{{ localeText().pinRowTop\n }}</button>\n <button class=\"ag-context-item\" role=\"menuitem\" (click)=\"onPinRow(menu.rowIndex, 'bottom')\">{{\n localeText().pinRowBottom }}</button>\n }\n <div class=\"ag-context-separator\" role=\"separator\"></div>\n }\n @if (!readonlyGrid()) {\n <button class=\"ag-context-item ag-context-item--danger\" role=\"menuitem\" (click)=\"deleteRow(menu.rowIndex)\">\n {{ localeText().deleteRow }}\n </button>\n }\n </div>\n }\n }\n\n <!-- Cell context menu -->\n @if (cellContextMenuState(); as menu) {\n @let col = getColDef(menu.field)!;\n <div class=\"ag-context-menu\" role=\"menu\" [style.left.px]=\"menu.x\" [style.top.px]=\"menu.y\"\n (click)=\"$event.stopPropagation()\">\n <button class=\"ag-context-item\" role=\"menuitem\" (click)=\"copyCellToClipboard(menu.rowIndex, col)\">{{\n localeText().copyCellValue\n }}</button>\n <button class=\"ag-context-item\" role=\"menuitem\" (click)=\"copyRowToClipboard(menu.rowIndex)\">{{ localeText().copyRow\n }}</button>\n @if (!treeConfig()) {\n <div class=\"ag-context-separator\" role=\"separator\"></div>\n @if (rowPinState(menu.rowIndex)) {\n <button class=\"ag-context-item\" role=\"menuitem\" (click)=\"onPinRow(menu.rowIndex, null)\">{{ localeText().unpinRow\n }}</button>\n } @else {\n <button class=\"ag-context-item\" role=\"menuitem\" (click)=\"onPinRow(menu.rowIndex, 'top')\">{{ localeText().pinRowTop\n }}</button>\n <button class=\"ag-context-item\" role=\"menuitem\" (click)=\"onPinRow(menu.rowIndex, 'bottom')\">{{\n localeText().pinRowBottom }}</button>\n }\n }\n @if (allowAddRows() && !readonlyGrid()) {\n <div class=\"ag-context-separator\" role=\"separator\"></div>\n <button class=\"ag-context-item\" role=\"menuitem\" (click)=\"insertRowAt(menu.rowIndex)\">{{ localeText().insertRowAbove\n }}</button>\n <button class=\"ag-context-item\" role=\"menuitem\" (click)=\"insertRowAt(menu.rowIndex + 1)\">{{\n localeText().insertRowBelow }}</button>\n }\n @if (!readonlyGrid()) {\n <div class=\"ag-context-separator\" role=\"separator\"></div>\n <button class=\"ag-context-item ag-context-item--danger\" role=\"menuitem\" (click)=\"deleteRow(menu.rowIndex)\">{{\n localeText().deleteRow }}</button>\n }\n @if (cellMenuItems().length) {\n <div class=\"ag-context-separator\" role=\"separator\"></div>\n @for (item of cellMenuItems(); track $index) {\n @if (item === null) {\n <div class=\"ag-context-separator\" role=\"separator\"></div>\n } @else {\n <button class=\"ag-context-item\" role=\"menuitem\" [class.ag-context-item--danger]=\"item.danger\"\n [disabled]=\"item.disabled\" (click)=\"runCellMenuItem(item, menu)\">{{\n item.label }}</button>\n }\n }\n }\n </div>\n }\n\n <!-- Group actions menu -->\n @if (groupActionsMenu(); as menu) {\n <div class=\"ag-context-menu\" role=\"menu\" [style.left.px]=\"menu.x\" [style.top.px]=\"menu.y\"\n (click)=\"$event.stopPropagation()\">\n @for (action of groupActions(); track action.label) {\n <button class=\"ag-context-item\" role=\"menuitem\" (click)=\"onGroupAction(action, menu.label)\">\n {{ action.label }}\n </button>\n }\n </div>\n }\n\n <!-- Filter dropdown -->\n @if (filterMenu(); as menu) {\n <agrid-column-menu [x]=\"menu.x\" [y]=\"menu.y\" [header]=\"getColDef(menu.field)?.header ?? menu.field\"\n [sortDir]=\"getSort(menu.field)\" [sortable]=\"menu.mode === 'column' && sortOption() !== 'none'\"\n [showColumnActions]=\"menu.mode === 'column' && !!control()\"\n [showAggregationActions]=\"menu.mode === 'column' && pivotRowColumnField()===null\"\n [pinned]=\"getColumnPinState(menu.field)\" [groupable]=\"menu.mode === 'column' && !!getColDef(menu.field)?.groupable\"\n [grouped]=\"isGroupedByField(menu.field)\" [filterable]=\"!!getColDef(menu.field)?.filterable\"\n [showFilterActions]=\"menu.mode === 'column'\"\n [showValueFilter]=\"menu.mode === 'column' && (!serverSideFiltering() || !!getColDef(menu.field)?.values?.length)\"\n [filterType]=\"getMenuFilterType(menu.field)\" [operator]=\"getMenuOperator(menu.field)\"\n [operand]=\"getMenuOperand(menu.field)\" [operand2]=\"getMenuOperand2(menu.field)\"\n (operatorChange)=\"onMenuOperatorChange(menu.field, $event)\"\n (operandChange)=\"onMenuOperandChange(menu.field, $event)\"\n (operand2Change)=\"onMenuOperand2Change(menu.field, $event)\" [search]=\"filterMenuSearch()\"\n [allSelected]=\"isMenuAllSelected(menu.field)\" [valueItems]=\"(serverSideFiltering() && !getColDef(menu.field)?.values?.length)\n || !getColDef(menu.field)?.filterable ? [] : columnMenuValueItems()\" [localeText]=\"localeText()\"\n [sortPriority]=\"getSortPriority(menu.field)\" [hasMultiSort]=\"hasMultiSort()\" (sort)=\"onMenuSort(menu.field, $event)\"\n (resetSort)=\"onMenuResetSort(menu.field, $event)\" (autosize)=\"onMenuAutosizeColumn(menu.field)\"\n (togglePin)=\"onMenuTogglePin(menu.field)\" (togglePinRight)=\"onMenuTogglePinRight(menu.field)\"\n (hide)=\"onMenuHideColumn(menu.field)\" (toggleGroup)=\"onMenuToggleGroupBy(menu.field)\"\n (clearFilter)=\"onMenuClearFilter(menu.field)\" (clearAll)=\"onMenuClearAll()\"\n (searchChange)=\"onFilterMenuSearch($event)\" (toggleAll)=\"onMenuToggleAll(menu.field)\"\n (toggleValue)=\"onMenuToggleValue(menu.field, $event)\" [aggregate]=\"getEffectiveAggregate(getColDef(menu.field)!)\"\n [customItems]=\"menu.mode === 'column' ? getColDef(menu.field)?.headerMenuItems ?? [] : []\"\n (customAction)=\"onColumnHeaderAction(menu.field, $event)\"\n (setAggregate)=\"onMenuSetAggregate(menu.field, $event)\" />\n }\n\n @if (columnDragPreview(); as preview) {\n <div class=\"ag-column-drag-preview\" [style.left.px]=\"preview.x\" [style.top.px]=\"preview.y\"\n [style.width.px]=\"preview.width\" [style.height.px]=\"preview.height\">\n <span>{{ preview.label }}</span>\n </div>\n }\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n HostListener,\n computed,\n effect,\n inject,\n input,\n output,\n signal,\n} from '@angular/core';\n\n/** Identifier supported by the standalone page selector. */\nexport type AgridPageId = string | number;\n\n/** One selectable page. IDs must be unique within the item list. */\nexport interface AgridPageItem<TId extends AgridPageId = AgridPageId> {\n id: string;\n pageNumber: TId;\n label: string;\n}\n\nlet nextPageSelectorId = 0;\n\n/** Compact previous/input/dropdown/next control for navigating a labeled page list. */\n@Component({\n selector: 'agrid-page-selector',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './agrid-page-selector.component.html',\n styleUrl: './agrid-page-selector.component.css',\n})\nexport class AgridPageSelectorComponent<TId extends AgridPageId = AgridPageId> {\n private readonly elementRef = inject<ElementRef<HTMLElement>>(ElementRef);\n readonly listboxId = `agrid-page-options-${nextPageSelectorId++}`;\n\n items = input<readonly AgridPageItem<TId>[]>([]);\n selectedId = input<string | null>(null);\n selectedPageNumber = input<TId | null>(null);\n disabled = input<boolean>(false);\n previousLabel = input<string>('Previous page');\n nextLabel = input<string>('Next page');\n inputLabel = input<string>('Page ID');\n menuLabel = input<string>('Choose a page');\n emptyText = input<string>('No pages');\n\n selectPage = output<AgridPageItem<TId>>();\n\n readonly menuOpen = signal(false);\n readonly draft = signal('');\n readonly invalid = signal(false);\n readonly activeId = signal<string | null>(null);\n readonly focusedOptionIndex = signal(-1);\n\n readonly activeIndex = computed(() =>\n this.items().findIndex(item => this.idsEqual(item.id, this.activeId())),\n );\n readonly hasPrevious = computed(() => !this.disabled() && this.activeIndex() > 0);\n readonly hasNext = computed(() => {\n const index = this.activeIndex();\n return !this.disabled() && index >= 0 && index < this.items().length - 1;\n });\n\n constructor() {\n effect(() => {\n const id = this.selectedId();\n this.activeId.set(id);\n const item = this.items().find(i=>i.id===id);\n this.draft.set(item?.pageNumber == null ? '' : String(item?.pageNumber));\n this.draft.set(id == null ? '' : String(id));\n this.invalid.set(false);\n });\n\n effect(() => {\n const nr = this.selectedPageNumber();\n // fetch the page \n const item = this.items().find(i=>i.pageNumber===nr);\n this.activeId.set(item?.id??null);\n this.draft.set(item?.pageNumber == null ? '' : String(item?.pageNumber));\n this.invalid.set(false);\n });\n }\n\n previous(): void {\n if (!this.hasPrevious()) return;\n this.choose(this.items()[this.activeIndex() - 1]);\n }\n\n next(): void {\n if (!this.hasNext()) return;\n this.choose(this.items()[this.activeIndex() + 1]);\n }\n\n toggleMenu(event: Event): void {\n event.preventDefault();\n event.stopPropagation();\n if (this.disabled() || this.items().length === 0) return;\n this.menuOpen() ? this.closeMenu() : this.openMenu();\n }\n\n openMenu(): void {\n if (this.disabled() || this.items().length === 0) return;\n const current = this.activeIndex();\n this.focusedOptionIndex.set(current >= 0 ? current : 0);\n this.menuOpen.set(true);\n this.scrollFocusedOptionIntoView();\n }\n\n closeMenu(): void {\n this.menuOpen.set(false);\n this.focusedOptionIndex.set(-1);\n }\n\n onInput(event: Event): void {\n this.draft.set((event.target as HTMLInputElement).value);\n this.invalid.set(false);\n this.closeMenu();\n }\n\n onInputKeydown(event: KeyboardEvent): void {\n if (event.key === 'Escape') {\n event.preventDefault();\n this.closeMenu();\n this.resetDraft();\n return;\n }\n if (event.key === 'ArrowDown' || event.key === 'ArrowUp') {\n event.preventDefault();\n if (!this.menuOpen()) this.openMenu();\n else this.moveOption(event.key === 'ArrowDown' ? 1 : -1);\n return;\n }\n if (event.key === 'Home' && this.menuOpen()) {\n event.preventDefault();\n this.focusedOptionIndex.set(0);\n this.scrollFocusedOptionIntoView();\n return;\n }\n if (event.key === 'End' && this.menuOpen()) {\n event.preventDefault();\n this.focusedOptionIndex.set(this.items().length - 1);\n this.scrollFocusedOptionIntoView();\n return;\n }\n if (event.key !== 'Enter') return;\n event.preventDefault();\n const focused = this.menuOpen() ? this.items()[this.focusedOptionIndex()] : undefined;\n if (focused) this.choose(focused);\n else this.selectDraft();\n }\n\n choose(item: AgridPageItem<TId>): void {\n if (this.disabled()) return;\n this.activeId.set(item.id);\n this.draft.set(String(item.id));\n this.invalid.set(false);\n this.closeMenu();\n this.selectPage.emit(item);\n }\n\n optionId(index: number): string {\n return `${this.listboxId}-option-${index}`;\n }\n\n isSelected(item: AgridPageItem<TId>): boolean {\n return this.idsEqual(item.id, this.activeId());\n }\n\n @HostListener('document:pointerdown', ['$event'])\n onDocumentPointerDown(event: PointerEvent): void {\n if (!this.menuOpen()) return;\n if (!this.elementRef.nativeElement.contains(event.target as Node)) this.closeMenu();\n }\n\n private selectDraft(): void {\n const value = this.draft().trim();\n const item = this.items().find(candidate => String(candidate.id) === value);\n if (item) this.choose(item);\n else this.invalid.set(true);\n }\n\n private resetDraft(): void {\n const id = this.activeId();\n this.draft.set(id == null ? '' : String(id));\n this.invalid.set(false);\n }\n\n private moveOption(direction: 1 | -1): void {\n const count = this.items().length;\n if (count === 0) return;\n const current = this.focusedOptionIndex();\n this.focusedOptionIndex.set((current + direction + count) % count);\n this.scrollFocusedOptionIntoView();\n }\n\n private scrollFocusedOptionIntoView(): void {\n queueMicrotask(() => this.elementRef.nativeElement\n .querySelector<HTMLElement>(`#${this.optionId(this.focusedOptionIndex())}`)\n ?.scrollIntoView?.({ block: 'nearest' }));\n }\n\n private idsEqual(left: string, right: string | null): boolean {\n return right !== null && left === right;\n }\n}\n","<div class=\"ag-page-selector\" [class.ag-page-selector--disabled]=\"disabled()\">\n <button type=\"button\" class=\"ag-page-nav\" [disabled]=\"!hasPrevious()\"\n [attr.aria-label]=\"previousLabel()\" [title]=\"previousLabel()\" (click)=\"previous()\">\n <span aria-hidden=\"true\">‹</span>\n </button>\n\n <div class=\"ag-page-combo\">\n <div class=\"ag-page-input-group\" [class.ag-page-input-group--open]=\"menuOpen()\"\n [class.ag-page-input-group--invalid]=\"invalid()\">\n <input class=\"ag-page-input\" type=\"text\" inputmode=\"text\" autocomplete=\"off\"\n role=\"combobox\" [value]=\"draft()\" [disabled]=\"disabled()\"\n [attr.aria-label]=\"inputLabel()\" [attr.aria-expanded]=\"menuOpen()\"\n [attr.aria-controls]=\"menuOpen() ? listboxId : null\"\n [attr.aria-activedescendant]=\"menuOpen() && focusedOptionIndex() >= 0 ? optionId(focusedOptionIndex()) : null\"\n [attr.aria-invalid]=\"invalid() ? 'true' : null\"\n (input)=\"onInput($event)\" (keydown)=\"onInputKeydown($event)\" />\n <button type=\"button\" class=\"ag-page-trigger\" [disabled]=\"disabled() || items().length === 0\"\n [attr.aria-label]=\"menuLabel()\" [title]=\"menuLabel()\"\n [attr.aria-expanded]=\"menuOpen()\" aria-haspopup=\"listbox\"\n (click)=\"toggleMenu($event)\">\n <span aria-hidden=\"true\">▾</span>\n </button>\n </div>\n\n @if (menuOpen()) {\n <div [id]=\"listboxId\" class=\"ag-page-options\" role=\"listbox\"\n [attr.aria-label]=\"menuLabel()\" (pointerdown)=\"$event.stopPropagation()\">\n @for (item of items(); track item.id; let index = $index) {\n <button type=\"button\" class=\"ag-page-option\" role=\"option\" [id]=\"optionId(index)\"\n [class.ag-page-option--selected]=\"isSelected(item)\"\n [class.ag-page-option--focused]=\"focusedOptionIndex() === index\"\n [attr.aria-selected]=\"isSelected(item)\"\n (mouseenter)=\"focusedOptionIndex.set(index)\" (click)=\"choose(item)\">\n <span class=\"ag-page-option-id\">{{ item.pageNumber }}</span>\n <span class=\"ag-page-option-label\">{{ item.label }}</span>\n </button>\n } @empty {\n <div class=\"ag-page-empty\">{{ emptyText() }}</div>\n }\n </div>\n }\n </div>\n\n <button type=\"button\" class=\"ag-page-nav\" [disabled]=\"!hasNext()\"\n [attr.aria-label]=\"nextLabel()\" [title]=\"nextLabel()\" (click)=\"next()\">\n <span aria-hidden=\"true\">›</span>\n </button>\n</div>\n","import {\n ChangeDetectionStrategy,\n Component,\n ElementRef,\n computed,\n effect,\n input,\n output,\n signal,\n viewChild,\n} from '@angular/core';\nimport { AgridDataSource } from './agrid-datasource';\nimport { AgridLocaleText, AGRID_LOCALE_TEXT } from './agrid-localization';\nimport { AgridTreeProvider } from './agrid-tree-provider';\nimport { AgridTreeController } from './rows/agrid-tree.controller';\nimport {\n AgridTreeNodeEvent,\n AgridTreeSelectionEvent,\n GridItem,\n PathTreeNodeItem,\n TreeRowItem,\n} from './agrid.types';\nimport {\n buildPathTreeItems,\n buildTreeItems,\n isPathTreeConfig,\n pathTreeNodeId,\n} from './agrid.utils';\n\ntype StandaloneTreeItem<T extends object> = TreeRowItem<T> | PathTreeNodeItem;\n\nfunction isPathNode<T extends object>(item: StandaloneTreeItem<T>): item is PathTreeNodeItem {\n return 'pathNodeId' in item;\n}\n\n/** Standalone accessible tree control backed by the same projection logic as `AgridComponent`. */\n@Component({\n selector: 'agrid-tree',\n changeDetection: ChangeDetectionStrategy.OnPush,\n templateUrl: './agrid-tree.component.html',\n styleUrl: './agrid-tree.component.css',\n host: { '[style.--agrid-tree-row-height.px]': 'provider().rowHeight' },\n})\nexport class AgridTreeComponent<T extends object = any> {\n provider = input.required<AgridTreeProvider<T>>();\n localeText = input<AgridLocaleText>(AGRID_LOCALE_TEXT.en);\n\n nodeClick = output<AgridTreeNodeEvent<T>>();\n nodeDoubleClicked = output<AgridTreeNodeEvent<T>>();\n selectionChange = output<AgridTreeSelectionEvent<T>>();\n\n private readonly treeController = new AgridTreeController();\n private readonly treeElement = viewChild<ElementRef<HTMLElement>>('tree');\n private initializedProvider: AgridTreeProvider<T> | null = null;\n\n readonly focusedIndex = signal(0);\n readonly selectedKeys = signal<Set<string>>(new Set());\n readonly expandedIds = this.treeController.expandedIds;\n\n readonly items = computed<StandaloneTreeItem<T>[]>(() => {\n const provider = this.provider();\n const rows = provider.datasource.rows();\n const indices = rows.map((_, index) => index);\n const config = provider.treeConfig;\n const projected: GridItem<T>[] = isPathTreeConfig(config)\n ? buildPathTreeItems(rows, indices, config, this.expandedIds())\n : buildTreeItems(rows, indices, config, this.expandedIds());\n return projected.filter((item): item is StandaloneTreeItem<T> =>\n item !== null && typeof item === 'object' && 'level' in item\n && ('pathNodeId' in item || 'row' in item),\n );\n });\n\n constructor() {\n effect(() => {\n const provider = this.provider();\n if (provider === this.initializedProvider) return;\n this.initializedProvider = provider;\n this.selectedKeys.set(new Set());\n this.focusedIndex.set(0);\n provider.treeConfig.defaultExpanded ? this.expandAllNodes() : this.collapseAllNodes();\n });\n }\n\n /** Expands every branch currently represented by the datasource. */\n expandAllNodes(): void {\n const provider = this.provider();\n const config = provider.treeConfig;\n const rows = provider.datasource.rows();\n if (isPathTreeConfig(config)) {\n const ids = new Set<string>();\n for (const row of rows) {\n const path = config.getPath(row).map(String).filter(Boolean);\n for (let length = 1; length < path.length; length++) {\n ids.add(pathTreeNodeId(path.slice(0, length)));\n }\n }\n this.treeController.expandAll(ids);\n return;\n }\n const ids = new Set<string | number>();\n for (const row of rows) {\n const parentId = config.getParentId(row);\n if (parentId != null) ids.add(parentId);\n }\n this.treeController.expandAll(ids);\n }\n\n /** Collapses every branch. */\n collapseAllNodes(): void {\n this.treeController.collapseAll();\n }\n\n /** Toggles one expandable node. */\n toggleNode(item: StandaloneTreeItem<T>): void {\n if (!item.expandable) return;\n this.treeController.toggle(this.expansionId(item));\n }\n\n /** @internal */\n label(item: StandaloneTreeItem<T>): string {\n if (isPathNode(item)) return item.pathLabel;\n if (item.treeLabel !== undefined) return item.treeLabel;\n const provider = this.provider();\n return provider.getLabel?.(item.row) ?? String(item.row[provider.treeConfig.treeField] ?? '');\n }\n\n /** @internal */\n description(item: StandaloneTreeItem<T>): string | undefined {\n return isPathNode(item) ? undefined : this.provider().getDescription?.(item.row);\n }\n\n /** @internal */\n isSelected(item: StandaloneTreeItem<T>): boolean {\n return this.selectedKeys().has(this.selectionKey(item));\n }\n\n /** @internal */\n onNodeClick(event: MouseEvent, item: StandaloneTreeItem<T>, index: number): void {\n event.stopPropagation();\n this.focusedIndex.set(index);\n this.select(item, event.metaKey || event.ctrlKey);\n this.nodeClick.emit(this.toEvent(item));\n }\n\n /** @internal */\n onNodeDoubleClick(event: MouseEvent, item: StandaloneTreeItem<T>): void {\n event.stopPropagation();\n this.nodeDoubleClicked.emit(this.toEvent(item));\n }\n\n /** @internal */\n onKeydown(event: KeyboardEvent, item: StandaloneTreeItem<T>, index: number): void {\n const items = this.items();\n if (event.key === 'ArrowDown') return this.moveFocus(event, Math.min(index + 1, items.length - 1));\n if (event.key === 'ArrowUp') return this.moveFocus(event, Math.max(index - 1, 0));\n if (event.key === 'Home') return this.moveFocus(event, 0);\n if (event.key === 'End') return this.moveFocus(event, items.length - 1);\n if (event.key === 'ArrowRight' && item.expandable) {\n event.preventDefault();\n if (!item.expanded) this.toggleNode(item);\n else this.moveFocus(event, Math.min(index + 1, items.length - 1));\n return;\n }\n if (event.key === 'ArrowLeft') {\n event.preventDefault();\n if (item.expandable && item.expanded) this.toggleNode(item);\n else {\n const parent = this.findParentIndex(index, item.level);\n if (parent >= 0) this.focusNode(parent);\n }\n return;\n }\n if (event.key === 'Enter' || event.key === ' ') {\n event.preventDefault();\n this.select(item, event.metaKey || event.ctrlKey);\n this.nodeClick.emit(this.toEvent(item));\n }\n }\n\n /** @internal */\n trackItem(_index: number, item: StandaloneTreeItem<T>): string {\n return this.selectionKey(item);\n }\n\n private select(item: StandaloneTreeItem<T>, additive: boolean): void {\n const mode = this.provider().selection;\n if (mode === 'none') return;\n const key = this.selectionKey(item);\n this.selectedKeys.update(current => {\n const next = mode === 'multi' && additive ? new Set(current) : new Set<string>();\n if (mode === 'multi' && additive && next.has(key)) next.delete(key);\n else next.add(key);\n return next;\n });\n const selected = this.items().filter(candidate => this.selectedKeys().has(this.selectionKey(candidate)));\n this.selectionChange.emit({ nodes: selected.map(candidate => this.toEvent(candidate)) });\n }\n\n private toEvent(item: StandaloneTreeItem<T>): AgridTreeNodeEvent<T> {\n if (isPathNode(item)) {\n return {\n kind: 'branch', id: item.pathNodeId, uuid: item.uuid, label: item.pathLabel,\n level: item.level, expandable: true, expanded: item.expanded,\n };\n }\n const config = this.provider().treeConfig;\n const id = isPathTreeConfig(config) ? item.originalIndex : config.getId(item.row);\n return {\n kind: 'row', id, label: this.label(item), level: item.level,\n expandable: item.expandable, expanded: item.expanded,\n row: item.row, originalIndex: item.originalIndex,\n };\n }\n\n private expansionId(item: StandaloneTreeItem<T>): string | number {\n if (isPathNode(item)) return item.pathNodeId;\n const config = this.provider().treeConfig;\n return isPathTreeConfig(config) ? item.originalIndex : config.getId(item.row);\n }\n\n private selectionKey(item: StandaloneTreeItem<T>): string {\n return isPathNode(item)\n ? `branch:${item.pathNodeId}`\n : `row:${this.expansionId(item)}`;\n }\n\n private moveFocus(event: KeyboardEvent, index: number): void {\n event.preventDefault();\n this.focusNode(index);\n }\n\n private focusNode(index: number): void {\n this.focusedIndex.set(index);\n queueMicrotask(() => this.treeElement()?.nativeElement\n .querySelector<HTMLElement>(`[data-tree-index=\"${index}\"]`)?.focus());\n }\n\n private findParentIndex(index: number, level: number): number {\n for (let candidate = index - 1; candidate >= 0; candidate--) {\n if (this.items()[candidate].level < level) return candidate;\n }\n return -1;\n }\n}\n","<div #tree class=\"ag-tree\" role=\"tree\" [attr.aria-label]=\"provider().ariaLabel\"\n [attr.aria-multiselectable]=\"provider().selection === 'multi' ? 'true' : null\">\n @for (item of items(); track trackItem($index, item); let index = $index) {\n <div class=\"ag-tree-node\" role=\"treeitem\" [attr.data-tree-index]=\"index\"\n [attr.tabindex]=\"focusedIndex() === index ? 0 : -1\"\n [attr.aria-level]=\"item.level + 1\"\n [attr.aria-expanded]=\"item.expandable ? item.expanded : null\"\n [attr.aria-selected]=\"provider().selection !== 'none' ? isSelected(item) : null\"\n [class.ag-tree-node--selected]=\"isSelected(item)\"\n [style.padding-left.px]=\"8 + item.level * 20\"\n (click)=\"onNodeClick($event, item, index)\"\n (dblclick)=\"onNodeDoubleClick($event, item)\"\n (keydown)=\"onKeydown($event, item, index)\">\n <button class=\"ag-tree-toggle\" type=\"button\" tabindex=\"-1\"\n [class.ag-tree-toggle--expanded]=\"item.expanded\"\n [class.ag-tree-toggle--hidden]=\"!item.expandable\"\n [attr.aria-label]=\"(item.expanded ? localeText().collapse : localeText().expand) + ' ' + label(item)\"\n (click)=\"toggleNode(item); $event.stopPropagation()\">▸</button>\n <span class=\"ag-tree-content\">\n <span class=\"ag-tree-label\">{{ label(item) }}</span>\n @if (description(item); as detail) {\n <span class=\"ag-tree-description\">{{ detail }}</span>\n }\n </span>\n </div>\n } @empty {\n <div class=\"ag-tree-empty\">{{ provider().emptyText }}</div>\n }\n</div>\n","import { AgridDataSource } from './agrid-datasource';\nimport { AgridTreeConfig, AgridTreeSelectionMode } from './agrid.types';\n\n/** Configuration accepted by {@link AgridTreeProvider}. */\nexport interface AgridTreeProviderConfig<T extends object> {\n /** Flat datasource whose rows are linked by parent ids or path segments. */\n datasource: AgridDataSource<T>;\n /**\n * Hierarchy, identity, labeling, filtering, and initial-expansion configuration.\n * `aggregateTreeNodes` is ignored because the standalone tree has no grid columns.\n */\n treeConfig: AgridTreeConfig<T>;\n /** Label for parent-linked rows. Defaults to the configured `treeField` value. */\n getLabel?: (row: T) => string;\n /** Optional secondary text shown beneath a row label. */\n getDescription?: (row: T) => string | undefined;\n /** Selection behavior. Defaults to `single`. */\n selection?: AgridTreeSelectionMode;\n /** Fixed node height in pixels. Defaults to `36`. */\n rowHeight?: number;\n /** Accessible name for the tree. Defaults to `Tree`. */\n ariaLabel?: string;\n /** Text shown when the datasource is empty. */\n emptyText?: string;\n}\n\n/** Provider-style configuration and datasource container for `<agrid-tree>`. */\nexport class AgridTreeProvider<T extends object = any> {\n /** Rows projected into the standalone tree. */\n readonly datasource: AgridDataSource<T>;\n /** Shared hierarchy configuration; column-specific aggregation is not used here. */\n readonly treeConfig: AgridTreeConfig<T>;\n /** Optional host label resolver for parent-linked datasource rows. */\n readonly getLabel?: (row: T) => string;\n /** Optional host resolver for secondary node text. */\n readonly getDescription?: (row: T) => string | undefined;\n /** Effective node selection behavior. */\n readonly selection: AgridTreeSelectionMode;\n /** Effective fixed node height in pixels. */\n readonly rowHeight: number;\n /** Effective accessible name applied to the tree root. */\n readonly ariaLabel: string;\n /** Effective empty-state message. */\n readonly emptyText: string;\n\n /** Normalize optional standalone-tree settings and retain the reactive datasource. */\n constructor(config: AgridTreeProviderConfig<T>) {\n this.datasource = config.datasource;\n this.treeConfig = config.treeConfig;\n this.getLabel = config.getLabel;\n this.getDescription = config.getDescription;\n this.selection = config.selection ?? 'single';\n this.rowHeight = config.rowHeight ?? 36;\n this.ariaLabel = config.ariaLabel ?? 'Tree';\n this.emptyText = config.emptyText ?? 'No items';\n }\n}\n","import type { AgridDataSource } from './agrid-datasource';\nimport type { AgridProvider } from './agrid-provider';\nimport type { FilterOperator } from './agrid-control';\nimport type { Signal, Type } from '@angular/core';\n\n/** String-valued property names available on a row type. */\nexport type AgridField<T extends object> = Extract<keyof T, string>;\n\n/** Aggregate functions shared by footers, groups, tree rollups, and pivot values. */\nexport type AgridAggregate =\n | 'sum'\n | 'avg'\n | 'min'\n | 'max'\n | 'count'\n | ((values: unknown[]) => unknown);\n\n/**\n * Client-side pivot-table configuration.\n *\n * The initial pivot implementation supports one row dimension, one column dimension, and one\n * value field. The resulting table is derived from the datasource and is always read-only.\n */\nexport interface AgridPivotConfig<T extends object = any> {\n /** Source field whose distinct values become pivot rows. */\n rowField: AgridField<T>;\n /** Source field whose distinct values become generated pivot columns. */\n columnField: AgridField<T>;\n /** Source field aggregated at each row/column intersection. */\n valueField: AgridField<T>;\n /** Aggregate applied to each intersection. Defaults to `'sum'`. */\n aggregate?: AgridAggregate;\n}\n\n/** Behavior after pressing Enter while an inline cell editor is active. */\nexport type AgridEnterEditAction = 'nothing' | 'nextColumn' | 'nextRow';\n\n/** Parameters passed to a row-aware cell readonly resolver. */\nexport interface CellReadonlyParams<\n T extends object = any,\n K extends AgridField<T> = AgridField<T>,\n> {\n /** Datasource row containing the cell. */\n row: T;\n /** Current raw field value. */\n value: T[K];\n /** Column definition for the cell. */\n column: ColDef<T, K>;\n /** Zero-based index of the row in the datasource. */\n originalIndex: number;\n}\n\n/** Parameters passed to a row-aware cell formatting resolver. */\nexport type CellFormatParams<\n T extends object = any,\n K extends AgridField<T> = AgridField<T>,\n> = CellReadonlyParams<T, K>;\n\n/** Parameters passed to a row-aware horizontal cell-span resolver. */\nexport type CellSpanParams<\n T extends object = any,\n K extends AgridField<T> = AgridField<T>,\n> = CellReadonlyParams<T, K>;\n\n/** Supported visual overrides returned by {@link ColDefBase.cellFormat}. */\nexport interface CellFormat {\n /** CSS background color, such as `'#fff4cc'` or `'var(--warning-bg)'`. */\n backgroundColor?: string;\n /** CSS border color. The cell's existing right and bottom borders use this color. */\n borderColor?: string;\n /** CSS text color. */\n color?: string;\n /** CSS `font` shorthand. Individual font properties below can override parts of it. */\n font?: string;\n /** CSS font family. */\n fontFamily?: string;\n /** CSS font size, including its unit (for example `'0.875rem'`). */\n fontSize?: string;\n /** CSS font style. */\n fontStyle?: 'normal' | 'italic' | 'oblique' | string;\n /** CSS font weight. */\n fontWeight?: string | number;\n /** CSS text decoration. */\n textDecoration?: string;\n /** CSS horizontal text alignment. */\n textAlign?: 'left' | 'right' | 'center' | 'justify' | string;\n}\n\n/** Global options shared by grid providers. */\nexport interface AGridOptions {\n /**\n * Locale used for built-in labels, date formatting, and comparisons.\n * Use `'auto'` to resolve the browser locale.\n */\n locale: string;\n}\n\n/**\n * A single item in the cell right-click context menu.\n * Pass `null` in the array to render a separator line.\n */\nexport interface CellContextMenuItem<T extends object = any> {\n /** Label shown in the menu. */\n label: string;\n /** Called when the item is clicked. */\n action: (params: {\n value: T[AgridField<T>];\n row: T;\n field: AgridField<T>;\n originalIndex: number;\n }) => void;\n /** Grays out the item and prevents clicks. */\n disabled?: boolean;\n /** Renders the item in red (destructive action). */\n danger?: boolean;\n}\n\n/** Current grid state supplied to menu-bar visibility, active, and disabled resolvers. */\nexport interface AgridMenuBarContext<T extends object = any> {\n /** Current datasource rows. */\n rows: readonly T[];\n /** Currently selected rows with their original datasource indices. */\n selectedRows: readonly { row: T; originalIndex: number }[];\n /** Currently selected cell, or `null`. */\n selectedCell: CellPosition | null;\n /** Provider that owns the menu bar. */\n provider: AgridProvider<T>;\n /** Datasource that owns the current rows. */\n datasource: AgridDataSource<T>;\n}\n\n/** Static or runtime-resolved menu-bar state. */\nexport type AgridMenuBarState<T extends object = any> =\n | boolean\n | ((context: AgridMenuBarContext<T>) => boolean);\n\n/** Shared configuration for menu-bar buttons and dropdown items. */\nexport interface AgridMenuBarMenuItem<T extends object = any> {\n /** Stable command id emitted through `(menuBarAction)`. */\n id: string;\n /** Visible command label. */\n label: string;\n /** Optional compact icon or glyph shown before the label. */\n icon?: string;\n /** Whether the command is rendered. Defaults to `true`. */\n visible?: AgridMenuBarState<T>;\n /** Whether the command receives active styling. Defaults to `false`. */\n active?: AgridMenuBarState<T>;\n /** Whether the command is disabled. Defaults to `false`. */\n disabled?: AgridMenuBarState<T>;\n /** Additional classes */\n class?:string;\n}\n\n/** Top-level menu-bar button with optional additional dropdown commands. */\nexport interface AgridMenuBarItem<T extends object = any>\n extends AgridMenuBarMenuItem<T> {\n /** Additional commands opened from the button's dropdown chevron. */\n items?: AgridMenuBarMenuItem<T>[];\n}\n\n/**\n * A structured value option used when the data field stores a raw value (e.g. a numeric ID)\n * but the cell should display a human-readable label.\n *\n * @example\n * ```ts\n * values: [\n * { value: 1, label: 'Engineering' },\n * { value: 2, label: 'Sales' },\n * ]\n * ```\n */\nexport interface ValueOption<TValue = unknown> {\n /** Raw value stored in the data source (e.g. `1`, `'ENG'`). */\n value: TValue;\n /** Human-readable label shown in the cell, dropdown, and filter menu. */\n label: string;\n}\n\n/** Width sentinel that makes a column fill the remaining horizontal space. */\nexport const ColDefAutoSize = -1;\n\n/** Label definition for a group displayed above contiguous column headers. */\nexport interface HeaderGroup {\n /** Stable identifier referenced by {@link ColDefBase.group}. */\n id: string;\n /** Text displayed in the grouped header row. */\n label: string;\n}\n\n/** Custom command appended to a column's header menu. */\nexport interface AgridColumnHeaderMenuItem {\n /** Stable key emitted through `(columnHeaderAction)`. */\n key: string;\n /** Visible command label. */\n label: string;\n /** Optional compact icon or glyph shown before the label. */\n icon?: string;\n /** Disable the command without hiding it. */\n disabled?: boolean;\n /** Class a optional classes for the icon */\n iconClasses?: string[];\n /** Classes to apply on the complete button */\n itemClasses?: string[];\n}\n\n/** Defines the behavior shared by every typed column. */\nexport interface ColDefBase<T extends object, K extends AgridField<T>> {\n /** Data field name — must match a key in the row object. */\n field: K;\n /** Text displayed in the column header. */\n header: string;\n /** Optional header-group identifier configured through `AgridProvider.headerGroups`. */\n group?: string;\n /** Custom commands appended to this column's header menu. */\n headerMenuItems?: AgridColumnHeaderMenuItem[];\n /**\n * Default column width in pixels. Can be overridden at runtime via {@link AgridControl}.\n * Use `-1` (or omit) to make the column auto-scale and fill available space (`1fr`).\n */\n width?: number;\n /**\n * Semantic type of the field.\n * - `'number'` — blank rows initialize this field to `0` instead of `''`; enables numeric\n * range filters (`>`, `<`, `between`, …) in the column menu.\n * - `'date'` — uses a native date editor and built-in localized display formatting; enables\n * date range filters (before / after / between) in the column menu.\n * - `'boolean'` — renders an inline checkbox that toggles the value on click (no edit mode).\n */\n type?: 'text' | 'number' | 'date' | 'boolean';\n /**\n * Set to `false` to make the column read-only.\n * Defaults to `true` (editable) when omitted.\n */\n editable?: boolean;\n /**\n * Return `true` to make this specific cell read-only at runtime.\n * Runs with the current row, value, column definition, and original datasource index.\n * `editable: false` still makes the whole column read-only before this callback is checked.\n *\n * @example\n * ```ts\n * { field: 'approval', cellReadonly: ({ row }) => row.status !== 'Draft' }\n * ```\n */\n cellReadonly?: (params: CellReadonlyParams<T, K>) => boolean;\n /**\n * Return visual overrides for this specific cell at runtime.\n * Runs with the current row, value, column definition, and original datasource index.\n * Return `null` or `undefined` to use the grid's normal styling.\n *\n * @example\n * ```ts\n * {\n * field: 'balance',\n * cellFormat: ({ value }) => value < 0\n * ? { backgroundColor: '#fee2e2', color: '#991b1b', fontWeight: 600 }\n * : undefined,\n * }\n * ```\n */\n cellFormat?: (params: CellFormatParams<T, K>) => CellFormat | null | undefined;\n /**\n * Default horizontal alignment for every cell in this column.\n * A `textAlign` returned by {@link cellFormat} overrides this value for that cell.\n */\n textAlign?: 'left' | 'center' | 'right' | Signal<'left' | 'center' | 'right'>;\n /**\n * Number of adjacent visible columns occupied by this cell.\n *\n * Spans are clamped to the current left-pinned, scrollable, or right-pinned pane and never\n * cross a pane boundary. Covered cells remain part of the data model but are not rendered.\n * Return `1` (the default) to render a normal cell.\n *\n * @example\n * ```ts\n * { field: 'name', colSpan: ({ row }) => row.isSummary ? 3 : 1 }\n * ```\n */\n colSpan?: number | ((params: CellSpanParams<T, K>) => number);\n /**\n * Fixed list of allowed values shown in a `<select>` dropdown when editing.\n *\n * - `string[]` — simple list; the stored value equals the displayed label.\n * - `ValueOption[]` — structured list; the stored value (`value`) differs from the\n * displayed label (`label`). Useful when the dataset stores IDs but should show names.\n */\n values?: string[] | ValueOption<T[K]>[];\n /**\n * Optional display formatter applied when the column has no `values` list.\n * Receives the raw cell value and returns the string to display in the cell.\n *\n * @example\n * ```ts\n * { field: 'salary', formatter: v => `$${Number(v).toLocaleString()}` }\n * ```\n */\n formatter?: (value: T[K]) => string;\n /**\n * Resolve an input mask for this specific string cell. The callback receives the current\n * row, cell value, and column definition, so different rows in one column can use different\n * regular expressions. Return `null` or `undefined` to leave the cell unrestricted.\n *\n * The expression is matched against the complete proposed editor value. It should accept\n * partial values so the user can build the final value one character at a time.\n *\n * @example\n * ```ts\n * {\n * field: 'reference',\n * inputMask: ({ row }) => row.numeric\n * ? /\\d{0,3}(?:-\\d{0,5}(?:-\\d{0,5})?)?/\n * : /[a-z0-9]{0,3}(?: [a-z0-9]{0,3}(?: [a-z0-9]{0,5})?)?/i,\n * }\n * ```\n */\n inputMask?: (params: InputMaskParams<T, K>) => RegExp | null | undefined;\n /**\n * Set to `true` to show a filter input and value-picker in the filter row for this column.\n * At least one filterable column must exist for the filter row to appear.\n */\n filterable?: boolean;\n /**\n * Set to `true` to allow grouping the grid by this column.\n * When set, the filter dropdown shows a \"Group by\" toggle for this column.\n */\n groupable?: boolean;\n /**\n * Set to `true` to hide this column when the grid first renders.\n * The column remains in the dataset and can be re-shown via the sidebar column picker\n * or programmatically via `AgridControl.setColumnVisibility()`.\n */\n hidden?: boolean;\n /**\n * Pin this column to the left edge of the grid so it stays visible during horizontal scroll.\n * Can also be toggled at runtime via `AgridControl.setPinned()`.\n */\n pinned?: 'left' | 'right';\n /**\n * Aggregate function shown in the footer row for this column.\n * Built-in: `'sum'`, `'avg'`, `'min'`, `'max'`, `'count'`.\n * Pass a custom function to compute any value from the visible row values.\n * The footer only appears when at least one column has `aggregate` set.\n *\n * @example\n * ```ts\n * { field: 'salary', aggregate: 'sum' }\n * { field: 'score', aggregate: values => values.filter(v => Number(v) > 90).length }\n * ```\n */\n aggregate?: AgridAggregate;\n /**\n * Return one or more CSS class names to apply to every cell in this column based on the\n * cell's value and row data. Useful for conditional highlighting without a custom renderer.\n *\n * @example\n * ```ts\n * { field: 'score', cellClass: ({ value }) => Number(value) < 50 ? 'cell-danger' : '' }\n * ```\n */\n cellClass?: (params: { value: T[K]; row: T }) => string;\n /**\n * Set to `true` to prevent the column from being resized, reordered, or autosized.\n * The column can still be hidden, filtered, and sorted.\n */\n locked?: boolean;\n /**\n * Validate a committed value before it is written to the row. Return an error message to\n * reject the edit (the value is not written and the message is shown), or `null`/`undefined`\n * to accept it. Runs on inline commit, boolean-checkbox toggle, and sidebar save.\n *\n * @example\n * ```ts\n * { field: 'email', validate: v => /@/.test(String(v)) ? null : 'Invalid email' }\n * ```\n */\n validate?: (value: T[K], row: T) => string | null | undefined;\n /**\n * Custom component rendered for the cell's display (read) state, instead of the plain text value.\n * The component injects {@link AGRID_RENDERER_CONTEXT} to read the value, row, and column. Unlike\n * {@link cellRenderer}, this supports full Angular bindings, event handlers, and child components\n * with no manual escaping.\n *\n * @example\n * ```ts\n * { field: 'status', cellRendererComponent: StatusBadgeComponent }\n * ```\n */\n cellRendererComponent?: Type<unknown>;\n /**\n * Custom cell renderer. Returns an HTML string displayed instead of the plain text value.\n * Angular's built-in HTML sanitization is applied automatically.\n *\n * @deprecated Use {@link cellRendererComponent} instead. A component renderer supports Angular\n * bindings and event handlers, and avoids the HTML-string escaping/sanitization caveats. The\n * string renderer remains supported for now but will be removed in a future release.\n *\n * @example\n * ```ts\n * { field: 'status', cellRenderer: ({ value }) =>\n * `<span class=\"badge badge-${value}\">${value}</span>` }\n * ```\n */\n cellRenderer?: (params: { value: T[K]; row: T }) => string;\n /**\n * Custom editor component shown while the cell is in edit mode, instead of the built-in\n * text input / dropdown / checkbox. The component injects {@link AGRID_EDITOR_CONTEXT} to read\n * the current value and stage drafts; the grid keeps ownership of validation, history, and the\n * commit/cancel lifecycle, so Tab, Enter, and Escape work without extra wiring.\n *\n * @example\n * ```ts\n * { field: 'rating', cellEditor: RatingEditor }\n * ```\n */\n cellEditor?: Type<unknown>;\n /**\n * Show a right-aligned info button in this column's cells.\n * Pass a predicate to show it only for selected rows or values.\n */\n infoIcon?: boolean | ((params: { value: T[K]; row: T }) => boolean);\n}\n\n/**\n * Defines a column whose `field`, formatter value, renderer value, and row are\n * derived from the supplied row type.\n */\nexport type ColDef<\n T extends object = any,\n K extends AgridField<T> = AgridField<T>,\n> = K extends AgridField<T> ? ColDefBase<T, K> : never;\n\n/** Parameters passed to a row-aware {@link ColDefBase.inputMask} resolver. */\nexport interface InputMaskParams<\n T extends object = any,\n K extends AgridField<T> = AgridField<T>,\n> {\n row: T;\n value: T[K];\n column: ColDef<T, K>;\n}\n\n/**\n * Defines a single action shown in the group header's action menu.\n * Pass an array of these to `<agrid [groupActions]=\"...\">`.\n */\nexport interface GroupAction {\n /** Label shown in the dropdown. */\n label: string;\n /** Called with the group's display label when the item is clicked. */\n action: (groupLabel: string) => void;\n}\n\n/** Parameters passed to a master/detail text-template action. */\nexport interface DetailActionParams<T extends object = any> {\n /** Row shown by the expanded detail panel. */\n row: T;\n /** Original datasource index of the row. */\n rowIndex: number;\n}\n\n/**\n * One group's export payload: its label, member rows in display order, and the per-column\n * subtotal map. Produced for grouped exports so formats that support it (e.g. `.xlsx`) can emit\n * collapsible outlines with subtotal rows. @internal\n */\nexport interface AgridExportGroup {\n label: string;\n rows: Record<string, unknown>[];\n /** Per-column aggregate values (field → value), only for columns with a configured aggregate. */\n aggregates: Record<string, unknown>;\n}\n\n/** Text-template button shown above the editable master/detail textarea. */\nexport interface DetailAction<T extends object = any> {\n id: string;\n /** Button text. */\n label: string;\n /** Text inserted into the detail textarea, or a row-aware resolver. */\n text?: string | ((params: DetailActionParams<T>) => string);\n}\n\n/**\n * Internal row item used in the virtual scroll list.\n * - `{ row, originalIndex }` — a real data row\n * - `null` — the add-row placeholder\n * - `'ghost'` — the drop-target ghost inserted while dragging\n * - `{ groupLabel, count, collapsed, aggregates? }` — group header row when grouping is active\n * (`aggregates` holds per-group subtotals when aggregated columns exist)\n * - `{ row, originalIndex, level, expandable, expanded }` — a tree row when tree mode is active\n */\nexport type GridItem<T extends object = Record<string, unknown>> =\n | { row: T; originalIndex: number }\n | { loading: true; originalIndex: number }\n | null\n | 'ghost'\n | { groupLabel: string; count: number; collapsed: boolean; aggregates?: Record<string, unknown> }\n | TreeRowItem<T>\n | PathTreeNodeItem\n | DetailRowItem<T>;\n\n/** A generated, display-only branch node produced by path-based tree data. */\nexport interface PathTreeNodeItem {\n /** Stable UUID for this generated branch node. */\n uuid: string;\n /** Stable expansion id derived from the complete path to this node. */\n pathNodeId: string;\n /** Segment label shown for this branch. */\n pathLabel: string;\n /** Zero-based depth in the generated tree. */\n level: number;\n /** Path branch nodes always have descendants. */\n expandable: true;\n /** Whether the branch's descendants are currently visible. */\n expanded: boolean;\n /**\n * Field-to-value rollups computed from all datasource leaves below this generated branch.\n * Present only when the grid enables {@link AgridTreeConfig.aggregateTreeNodes}; standalone\n * trees do not compute column aggregates.\n * @internal\n */\n aggregates?: Record<string, unknown>;\n}\n\n/**\n * A master/detail panel row rendered immediately beneath its expanded parent data row.\n *\n * Carries the parent's `originalIndex` (so the panel can be re-collapsed and tracked) and the\n * parent `row` (passed to `detailRenderer`). It is intentionally *not* a data-row item — selection,\n * editing, and cell rendering skip it.\n */\nexport interface DetailRowItem<T extends object = Record<string, unknown>> {\n /** Original index of the parent data row this detail panel belongs to. */\n detailFor: number;\n /** The parent row's data, passed to `detailRenderer`. */\n row: T;\n}\n\n/**\n * A data row rendered inside a hierarchical tree.\n *\n * Structurally a superset of the plain `{ row, originalIndex }` data-row item, so it also\n * satisfies {@link GridItem}'s data-row checks — selection, editing, and cell rendering treat\n * it exactly like a flat row. The extra fields drive indentation and the expand/collapse twisty.\n */\nexport interface TreeRowItem<T extends object = Record<string, unknown>> {\n /** The underlying row object from the data source. */\n row: T;\n /** Zero-based index of the row in the (flat) data source. */\n originalIndex: number;\n /** Depth in the tree. Root rows are `0`; each level of nesting adds `1`. */\n level: number;\n /** `true` when this row has at least one child row in the current projection. */\n expandable: boolean;\n /** `true` when this row is expandable and currently expanded (its children are visible). */\n expanded: boolean;\n /** Optional display-only label for the tree cell, used by path-based trees. */\n treeLabel?: string;\n /**\n * Field-to-value rollups computed from this node's descendant leaves. Parent rows are excluded\n * so a stored subtotal is not counted again. Present only for expandable rows when enabled.\n * @internal\n */\n aggregates?: Record<string, unknown>;\n}\n\n/**\n * Host-supplied configuration that turns the grid into a tree.\n *\n * Hierarchy is expressed over the existing flat row array using either stable id/parent-id\n * accessors or a path accessor. Path mode creates display-only branch nodes while leaves retain\n * their original datasource indices, so selection, editing, and persistence remain row-based.\n *\n * @example\n * ```ts\n * treeConfig: {\n * getId: row => row.id,\n * getParentId: row => row.managerId,\n * treeField: 'name',\n * }\n *\n * // Or derive branches from a delimited field:\n * treeConfig: {\n * getPath: row => row.oz.split('.'),\n * treeField: 'oz',\n * }\n * ```\n */\ninterface AgridTreeConfigBase<T extends object> {\n /** Field whose cell shows the indentation and expand/collapse twisty. */\n treeField: AgridField<T>;\n /** Expand all nodes when the tree first renders. Defaults to `false` (all collapsed). */\n defaultExpanded?: boolean;\n /**\n * When filtering, keep the ancestors of any matching row visible even if they don't match.\n * Defaults to `true`. (Applied by the projection layer, not by {@link GridItem} flattening.)\n */\n keepAncestorsOnFilter?: boolean;\n /**\n * Display aggregate-column rollups on expandable nodes in `AgridComponent` tree mode.\n *\n * Parent/id trees aggregate descendant leaves and deliberately exclude intermediate parent\n * values to avoid counting stored subtotals twice. Generated path branches aggregate every\n * datasource leaf below that branch. Expansion does not affect the result, while active filters\n * limit the contributing leaves. Aggregate cells on datasource-backed parents are display-only.\n *\n * The function comes from {@link ColDef.aggregate} or a runtime\n * `AgridControl.setAggregate()` override. The standalone `AgridTreeComponent` has no columns and\n * therefore ignores this option.\n *\n * @default false\n * @example\n * ```ts\n * const columns = [\n * { field: 'name', header: 'Name' },\n * { field: 'amount', header: 'Amount', aggregate: 'sum' },\n * ];\n *\n * const treeConfig = {\n * getId: row => row.id,\n * getParentId: row => row.parentId,\n * treeField: 'name',\n * aggregateTreeNodes: true,\n * };\n * ```\n */\n aggregateTreeNodes?: boolean;\n}\n\n/** Tree configuration for rows that already expose stable id and parent-id values. */\nexport interface AgridParentTreeConfig<T extends object = any> extends AgridTreeConfigBase<T> {\n /** Return a stable, unique id for a row. Used as the expansion key and for parent lookups. */\n getId: (row: T) => string | number;\n /** Return the id of a row's parent, or `null`/`undefined` for a root row. */\n getParentId: (row: T) => string | number | null | undefined;\n getPath?: never;\n}\n\n/** Values supplied when formatting one path-tree segment for display. */\nexport interface AgridPathSegmentParams<T extends object = any> {\n /** Datasource row that produced this path. Shared branches use the first matching row. */\n row: T;\n /** Raw segment returned by `getPath`. */\n segment: string | number;\n /** Zero-based position of the segment in the path. */\n level: number;\n /** Raw path prefix ending at this segment. */\n path: readonly (string | number)[];\n /** Whether this segment represents the datasource-backed leaf row. */\n leaf: boolean;\n}\n\n/** Tree configuration that derives display-only branch nodes from each row's path segments. */\nexport interface AgridPathTreeConfig<T extends object = any> extends AgridTreeConfigBase<T> {\n /** Return ordered path segments, for example `['01', '01', '0001']`. */\n getPath: (row: T) => readonly (string | number)[];\n /**\n * Return a stable UUID for generated branch nodes created from this row.\n * Shared branches use the first matching row, matching {@link formatPathSegment}.\n */\n nodeUuid?: (row: T) => string | number;\n /**\n * Return a stable UUID for generated branch nodes created from this row.\n * @deprecated Use {@link nodeUuid}. Kept as a compatibility alias for the original typo.\n */\n nodeUUid?: (row: T) => string | number;\n /** Format a segment for display without changing its identity, grouping, or sort order. */\n formatPathSegment?: (params: AgridPathSegmentParams<T>) => string;\n getId?: never;\n getParentId?: never;\n}\n\n/** Supported tree data modes: explicit parent links or generated path segments. */\nexport type AgridTreeConfig<T extends object = any> =\n | AgridParentTreeConfig<T>\n | AgridPathTreeConfig<T>;\n\n/** Selection behavior for the standalone tree control. */\nexport type AgridTreeSelectionMode = 'none' | 'single' | 'multi';\n\n/** Normalized row or generated-branch event emitted by the standalone tree control. */\nexport interface AgridTreeNodeEvent<T extends object = any> {\n kind: 'row' | 'branch';\n id: string | number;\n uuid?: string;\n label: string;\n level: number;\n expandable: boolean;\n expanded: boolean;\n row?: T;\n originalIndex?: number;\n}\n\n/** Current standalone-tree selection after a user interaction. */\nexport interface AgridTreeSelectionEvent<T extends object = any> {\n nodes: AgridTreeNodeEvent<T>[];\n}\n\n/** Zero-based position of a cell inside the grid. */\nexport interface CellPosition {\n /** Zero-based row index in the data array. */\n rowIndex: number;\n /** Zero-based column index in {@link ColDef} order. */\n colIndex: number;\n}\n\n/**\n * Emitted by `(validationFailed)` when a {@link ColDefBase.validate} hook rejects a committed\n * value. The value is not written to the row.\n */\nexport interface ValidationFailedEvent<T extends object = any> {\n /** Zero-based index of the row whose edit was rejected. */\n rowIndex: number;\n /** Field that failed validation. */\n field: AgridField<T>;\n /** The rejected value. */\n value: unknown;\n /** Message returned by the `validate` hook. */\n message: string;\n /** Which editing surface produced the rejected edit. */\n source: 'inline' | 'sidebar' | 'detail';\n}\n\n/** Emitted by `(cellEdit)` after the user commits a cell change. */\nexport type GridEditEvent<T extends object = any> = {\n [K in AgridField<T>]: {\n /** Position of the edited cell. */\n position: CellPosition;\n /** The `ColDef.field` that was changed. */\n field: K;\n /** Previous field value before the edit. */\n oldValue: T[K];\n /** New field value after the edit. */\n newValue: T[K];\n }\n}[AgridField<T>];\n\n/** Emitted when the optional info button inside a cell is clicked. */\nexport type CellInfoEvent<T extends object = any> = {\n [K in AgridField<T>]: {\n /** Datasource row containing the clicked cell. */\n row: T;\n /** Column field containing the clicked info button. */\n field: K;\n /** Current raw field value. */\n value: T[K];\n /** Zero-based index of the row in the datasource. */\n originalIndex: number;\n /** Column definition for the clicked cell. */\n column: ColDef<T, K>;\n }\n}[AgridField<T>];\n\n/**\n * Emitted asynchronously after an edit changes a row and the data source has been updated.\n *\n * Unlike {@link GridEditEvent}, this row-level event identifies the provider and\n * data source that own the edited record, which is useful when rendering multiple grids.\n */\nexport interface RecordEditEvent<T extends object = any> {\n /** Zero-based index of the edited row in the data source. */\n index: number;\n /** Current row data after the edit has been applied. */\n data: T;\n /** Exact provider instance that emitted the event. */\n provider: AgridProvider<T>;\n /** Exact data source containing the edited row. */\n datasource: AgridDataSource<T>;\n}\n\n/**\n * Compatibility alias for the provider-aware event emitted by `(rowRemoved)`.\n * @deprecated Use {@link RecordEditEvent}.\n */\nexport type RowRemovedEvent<T extends object = any> = RecordEditEvent<T>;\n\n/**\n * Emitted by `(rowSelect)` when the selection changes. `null` means all rows were deselected.\n * In `'single'` mode `rows` always has at most one entry.\n */\nexport interface RowSelectEvent<T extends object = any> {\n /** Selected rows and their original data-source indices. */\n rows: { row: T; originalIndex: number }[];\n}\n\n/** Emitted when a row is marked or unmarked through the row header or marker checkbox. */\nexport interface RowMarkEvent<T extends object = any> {\n /** Row whose mark state changed. */\n row: T;\n /** Zero-based index of the row in the data source. */\n originalIndex: number;\n /** Current mark state after the interaction. */\n marked: boolean;\n}\n\n/** Emitted when a column is marked or unmarked from its header. */\nexport interface ColumnMarkEvent<T extends object = any> {\n column: ColDef<T>;\n field: AgridField<T>;\n marked: boolean;\n}\n\n/** Emitted when a custom column-header menu command is selected. */\nexport interface ColumnHeaderActionEvent<T extends object = any> {\n column: ColDef<T>;\n key: string;\n}\n\n/** Emitted once after the grid first renders with rows from its active datasource. */\nexport interface FirstDataRenderedEvent<T extends object = any> {\n /** Rows present in the datasource for the first non-empty render. */\n rows: readonly T[];\n /** Number of rows present for that render. */\n rowCount: number;\n /** Provider attached to the rendered grid. */\n provider: AgridProvider<T>;\n /** Active datasource that supplied the rows. */\n datasource: AgridDataSource<T>;\n}\n\n/** Live numeric statistics for the active cell or range selection. */\nexport interface AgridSelectionSummary {\n count: number;\n sum: number;\n average: number;\n min: number;\n max: number;\n}\n\n/** Emitted when the user clicks a data row. */\nexport interface RowClickEvent<T extends object = any> {\n /** Snapshot of the clicked row. */\n row: T;\n /** Zero-based index of the row in the data source. */\n originalIndex: number;\n}\n\n/** Emitted when the user clicks or double-clicks a generated path-tree branch node. */\nexport interface TreeNodeClickEvent {\n /** Stable UUID for the generated branch node. */\n uuid: string;\n /** Stable expansion id derived from the complete path to this node. */\n pathNodeId: string;\n /** Segment label shown for this branch. */\n pathLabel: string;\n /** Zero-based depth in the generated tree. */\n level: number;\n /** Whether the branch's descendants are currently visible. */\n expanded: boolean;\n /** Snapshot of the generated branch node. */\n node: PathTreeNodeItem;\n}\n\n/**\n * Emitted after an inline-edited row is left, or after the user saves through the sidebar editor.\n */\nexport interface RowUpdateEvent<T extends object = any> {\n /** Updated row data. */\n row: T;\n /** Zero-based index of the updated row in the data source. */\n originalIndex: number;\n}\n\nexport interface RowDetailActionEvent<T extends object = any> {\n /** the id of the button */\n id: string;\n /** Updated row data. */\n row: T;\n /** Zero-based index of the updated row in the data source. */\n originalIndex: number;\n}\n\n\n/**\n * Emitted by `(rowReorder)` when the user finishes dragging a row to a new position.\n * The grid does **not** reorder data itself — call `dataSource.moveRow(oldIndex, newIndex)`\n * (or your own equivalent) inside the handler.\n */\nexport interface RowReorderEvent<T extends object = any> {\n /** Snapshot of the row data at drag time. */\n row: T;\n /** Index of the row in the data source before the move. */\n oldIndex: number;\n /**\n * Target position in the data source (insert-before semantics).\n * Pass both `oldIndex` and `newIndex` to {@link AgridDataSource.moveRow}.\n */\n newIndex: number;\n}\n\n/**\n * Emitted by `(pageChange)` when the user navigates to a different page in server-side\n * pagination mode (i.e. when `AgridControl.totalRows` is set to a value greater than zero).\n * The host should fetch the rows for `startRow..endRow` from the server and push them into\n * the data source — the grid itself does not slice or filter the data in this mode.\n */\nexport interface PageChangeEvent {\n /** New page number (1-based). */\n page: number;\n /** Rows per page as configured on `AgridControl`. */\n pageSize: number;\n /** Zero-based index of the first row on this page. */\n startRow: number;\n /** Zero-based index of the last row on this page (inclusive). */\n endRow: number;\n}\n\n/** Emitted when a header text filter or column-menu condition changes server-side. */\nexport interface FilterChangeEvent {\n /** Field name of the filtered column. */\n field: string;\n /** Current free-text filter value. An empty string clears the text filter. */\n value: string;\n /**\n * Text, number, or date condition operator from the column-menu UI.\n * `null` clears the condition.\n * When set, `value` is empty and the operands live in {@link operand} / {@link operand2}.\n */\n operator?: FilterOperator | null;\n /** Primary condition operand. Present with {@link operator}. */\n operand?: string | null;\n /** Upper-bound operand, present only when {@link operator} is `'between'`. */\n operand2?: string | null;\n}\n\n/** Emitted when a sort changes in server-side filtering mode. */\nexport interface SortChangeEvent {\n /** Field name of the sorted column. */\n field: string;\n /** Current direction. `null` clears the sort. */\n direction: 'asc' | 'desc' | null;\n}\n\n/**\n * Emitted by `(prepareAddRecord)` when the grid has inserted a blank row.\n * Use this to populate the new row with real defaults via {@link AgridDataSource.updateRow} or\n * {@link AgridDataSource.patchRow}.\n */\nexport interface NewRecord<T extends object = any> {\n /** Index at which the blank row was inserted in the data source. */\n index: number;\n /** The empty row object the grid created (field values are `''` / `0` by type). */\n data: T;\n /** Exact provider instance that emitted this event. Useful when rendering multiple grids. */\n provider: AgridProvider<T>;\n /** Exact data source containing the inserted row. */\n datasource: AgridDataSource<T>;\n}\n\n/**\n * Precomputed per-column header state. @internal\n *\n * The header/filter rows would otherwise call a dozen helpers per column on every\n * change-detection pass (e.g. `getSort`, `hasActiveFilter`, `isColDragging`). The header\n * view-model computeds resolve all of that once per column — and only when an underlying\n * signal changes — so the template reads plain fields instead.\n */\nexport interface AgridHeaderColumn {\n col: ColDef;\n field: string;\n ariaColIndex: number;\n sort: 'asc' | 'desc' | null;\n sortPriority: number;\n hasFilter: boolean;\n dragging: boolean;\n dropSide: 'before' | 'after' | null;\n reorderOffset: number;\n grouped: boolean;\n lastPinned: boolean;\n firstRightPinned: boolean;\n columnWidth: number;\n textFilter: string;\n menuFilterType: 'text' | 'number' | 'date' | null;\n hasCondition: boolean;\n conditionLabel: string;\n}\n\n/**\n * Precomputed per-column state for the data-row, footer, and ghost cell loops. @internal\n *\n * Deliberately leaner than {@link AgridHeaderColumn}: it omits sort/filter state so the body\n * view-model only changes on column layout, drag, or pinning — sorting or filtering does not\n * invalidate it (and therefore does not force every rendered cell to re-render).\n */\nexport interface AgridBodyColumn {\n col: ColDef;\n field: string;\n visibleColIndex: number;\n ariaColIndex: number;\n dragging: boolean;\n reorderOffset: number;\n lastPinned: boolean;\n firstRightPinned: boolean;\n}\n","/**\n * Zero-dependency chart geometry. Pure math that turns a typed dataset + a diagram type into flat\n * SVG primitives (bars, line/area paths, pie slices, gridlines, labels), so the chart component\n * only has to emit elements. No charting library — same hand-rolled approach as the xlsx writer\n * and the sparkline helper.\n */\n\n/** Supported diagram types. */\nexport type AgridChartType = 'column' | 'bar' | 'line' | 'area' | 'pie' | 'donut';\n\n/** One data series (a row of values aligned to {@link AgridChartData.categories}). */\nexport interface AgridChartSeries {\n /** Series name shown in the legend. */\n name?: string;\n /** Explicit colour; falls back to the palette by index. */\n color?: string;\n values: number[];\n}\n\n/** The dataset fed to a chart: one or more series sharing a category axis. */\nexport interface AgridChartData {\n /** Category labels (x-axis ticks, or pie/donut slice labels). */\n categories?: string[];\n series: AgridChartSeries[];\n}\n\n/** Box dimensions and styling knobs the dataset is laid out into. */\nexport interface AgridChartOptions {\n width: number;\n height: number;\n palette?: string[];\n /** Whether value/category axes and gridlines are produced (cartesian types only). */\n showAxis?: boolean;\n}\n\nexport interface ChartBar {\n x: number; y: number; width: number; height: number;\n color: string; value: number; seriesIndex: number; categoryIndex: number;\n}\nexport interface ChartPath { d: string; color: string; name: string; }\nexport interface ChartPoint { x: number; y: number; color: string; }\nexport interface ChartSlice {\n d: string; color: string; value: number; label: string;\n percentText: string; labelX: number; labelY: number; full: boolean;\n}\nexport interface ChartGridline { x1: number; y1: number; x2: number; y2: number; }\nexport interface ChartLabel {\n x: number; y: number; text: string;\n anchor: 'start' | 'middle' | 'end'; baseline: 'auto' | 'middle' | 'hanging';\n}\nexport interface ChartLegendItem { name: string; color: string; }\n\n/** Flat, drawable primitives for a chart. */\nexport interface AgridChartLayout {\n type: AgridChartType;\n width: number;\n height: number;\n bars: ChartBar[];\n areas: ChartPath[];\n lines: ChartPath[];\n points: ChartPoint[];\n slices: ChartSlice[];\n gridlines: ChartGridline[];\n axisLabels: ChartLabel[];\n legend: ChartLegendItem[];\n}\n\n/** Default qualitative palette (colour-blind-friendly-ish, distinct hues). */\nexport const AGRID_CHART_PALETTE = [\n '#3b82f6', '#f59e0b', '#10b981', '#ef4444',\n '#8b5cf6', '#ec4899', '#14b8a6', '#f97316',\n];\n\nconst round = (n: number): number => Math.round(n * 100) / 100;\n\nfunction labelFor(value: number): string {\n const abs = Math.abs(value);\n if (abs >= 1_000_000) return `${round(value / 1_000_000)}M`;\n if (abs >= 1_000) return `${round(value / 1_000)}k`;\n return String(round(value));\n}\n\nconst EMPTY = (type: AgridChartType, width: number, height: number): AgridChartLayout => ({\n type, width, height,\n bars: [], areas: [], lines: [], points: [], slices: [], gridlines: [], axisLabels: [], legend: [],\n});\n\n/** Builds drawable geometry for a chart. Empty/invalid input yields an empty layout. */\nexport function buildChart(\n type: AgridChartType,\n data: AgridChartData,\n options: AgridChartOptions,\n): AgridChartLayout {\n const { width, height } = options;\n const palette = options.palette ?? AGRID_CHART_PALETTE;\n const series = data.series?.filter(s => s.values?.length) ?? [];\n if (series.length === 0 || width <= 0 || height <= 0) return EMPTY(type, width, height);\n\n const categories = data.categories ?? series[0].values.map((_, i) => String(i + 1));\n const colorOf = (i: number, override?: string): string => override ?? palette[i % palette.length];\n\n if (type === 'pie' || type === 'donut') {\n return buildPie(type, series[0], categories, options, colorOf);\n }\n return buildCartesian(type, series, categories, options, colorOf);\n}\n\nfunction buildPie(\n type: AgridChartType,\n series: AgridChartSeries,\n categories: string[],\n options: AgridChartOptions,\n colorOf: (i: number, override?: string) => string,\n): AgridChartLayout {\n const { width, height } = options;\n const values = series.values.map(v => (Number.isFinite(v) && v > 0 ? v : 0));\n const total = values.reduce((sum, v) => sum + v, 0);\n const layout = EMPTY(type, width, height);\n if (total <= 0) return layout;\n\n const cx = width / 2;\n const cy = height / 2;\n const radius = Math.max(0, Math.min(width, height) / 2 - 6);\n const innerR = type === 'donut' ? radius * 0.58 : 0;\n const labelR = (radius + innerR) / 2;\n\n let angle = 0; // radians, 0 at top, clockwise\n values.forEach((value, i) => {\n if (value <= 0) return;\n const percent = value / total;\n const start = angle;\n const end = angle + percent * Math.PI * 2;\n angle = end;\n const mid = (start + end) / 2;\n const color = colorOf(i);\n const full = percent >= 0.999;\n layout.slices.push({\n d: arcPath(cx, cy, radius, start, end, innerR, full),\n color,\n value,\n label: categories[i] ?? String(i + 1),\n percentText: `${Math.round(percent * 100)}%`,\n labelX: round(cx + labelR * Math.sin(mid)),\n labelY: round(cy - labelR * Math.cos(mid)),\n full,\n });\n layout.legend.push({ name: categories[i] ?? String(i + 1), color });\n });\n return layout;\n}\n\nfunction buildCartesian(\n type: AgridChartType,\n series: AgridChartSeries[],\n categories: string[],\n options: AgridChartOptions,\n colorOf: (i: number, override?: string) => string,\n): AgridChartLayout {\n const { width, height } = options;\n const showAxis = options.showAxis ?? true;\n const horizontal = type === 'bar';\n const layout = EMPTY(type, width, height);\n\n const all = series.flatMap(s => s.values).filter(v => Number.isFinite(v));\n if (all.length === 0) return layout;\n const forceZero = type === 'column' || type === 'bar' || type === 'area';\n let vMin = forceZero ? Math.min(0, ...all) : Math.min(...all);\n let vMax = forceZero ? Math.max(0, ...all) : Math.max(...all);\n if (vMin === vMax) { vMax += 1; if (!forceZero) vMin -= 1; }\n\n const pad = {\n top: 10,\n right: 12,\n bottom: showAxis ? 22 : 6,\n left: showAxis ? (horizontal ? 70 : 44) : 6,\n };\n const plot = {\n x: pad.left, y: pad.top,\n width: Math.max(0, width - pad.left - pad.right),\n height: Math.max(0, height - pad.top - pad.bottom),\n };\n\n // Value axis: position along the value dimension (y for column/line/area, x for bar).\n const valuePos = (v: number): number => {\n const t = (v - vMin) / (vMax - vMin);\n return horizontal ? plot.x + t * plot.width : plot.y + plot.height - t * plot.height;\n };\n const baseline = valuePos(0 >= vMin && 0 <= vMax ? 0 : vMin);\n\n // Category axis: even slots across the category dimension.\n const n = categories.length;\n const slot = (horizontal ? plot.height : plot.width) / Math.max(1, n);\n const catStart = (i: number): number => (horizontal ? plot.y : plot.x) + i * slot;\n\n if (showAxis) {\n for (let i = 0; i <= 4; i++) {\n const v = vMin + (i / 4) * (vMax - vMin);\n const p = valuePos(v);\n if (horizontal) {\n layout.gridlines.push({ x1: round(p), y1: plot.y, x2: round(p), y2: plot.y + plot.height });\n layout.axisLabels.push({ x: round(p), y: plot.y + plot.height + 4, text: labelFor(v), anchor: 'middle', baseline: 'hanging' });\n } else {\n layout.gridlines.push({ x1: plot.x, y1: round(p), x2: plot.x + plot.width, y2: round(p) });\n layout.axisLabels.push({ x: plot.x - 6, y: round(p), text: labelFor(v), anchor: 'end', baseline: 'middle' });\n }\n }\n categories.forEach((label, i) => {\n const center = catStart(i) + slot / 2;\n if (horizontal) {\n layout.axisLabels.push({ x: plot.x - 6, y: round(center), text: label, anchor: 'end', baseline: 'middle' });\n } else {\n layout.axisLabels.push({ x: round(center), y: plot.y + plot.height + 4, text: label, anchor: 'middle', baseline: 'hanging' });\n }\n });\n }\n\n if (type === 'line' || type === 'area') {\n series.forEach((s, si) => {\n const color = colorOf(si, s.color);\n const pts = s.values.map((v, i) => ({\n x: horizontal ? valuePos(v) : catStart(i) + slot / 2,\n y: horizontal ? catStart(i) + slot / 2 : valuePos(v),\n }));\n const d = pts.map((p, i) => `${i === 0 ? 'M' : 'L'} ${round(p.x)} ${round(p.y)}`).join(' ');\n layout.lines.push({ d, color, name: s.name ?? `Series ${si + 1}` });\n if (type === 'area') {\n const first = pts[0];\n const last = pts[pts.length - 1];\n const areaD = `${d} L ${round(last.x)} ${round(baseline)} L ${round(first.x)} ${round(baseline)} Z`;\n layout.areas.push({ d: areaD, color, name: s.name ?? `Series ${si + 1}` });\n }\n pts.forEach(p => layout.points.push({ x: round(p.x), y: round(p.y), color }));\n layout.legend.push({ name: s.name ?? `Series ${si + 1}`, color });\n });\n return layout;\n }\n\n // Grouped column / bar charts.\n const groupInset = slot * 0.15;\n const groupWidth = slot - groupInset * 2;\n const barThick = Math.max(1, groupWidth / series.length);\n series.forEach((s, si) => {\n const color = colorOf(si, s.color);\n s.values.forEach((value, ci) => {\n if (!Number.isFinite(value)) return;\n const v = valuePosClamped(value, vMin, vMax);\n const start = catStart(ci) + groupInset + si * barThick;\n const edge = valuePos(v);\n if (horizontal) {\n layout.bars.push({\n x: round(Math.min(edge, baseline)), y: round(start),\n width: round(Math.abs(edge - baseline)), height: round(barThick * 0.84),\n color, value, seriesIndex: si, categoryIndex: ci,\n });\n } else {\n layout.bars.push({\n x: round(start), y: round(Math.min(edge, baseline)),\n width: round(barThick * 0.84), height: round(Math.abs(edge - baseline)),\n color, value, seriesIndex: si, categoryIndex: ci,\n });\n }\n });\n layout.legend.push({ name: s.name ?? `Series ${si + 1}`, color });\n });\n return layout;\n}\n\nfunction valuePosClamped(value: number, vMin: number, vMax: number): number {\n return Math.max(vMin, Math.min(vMax, value));\n}\n\n/** SVG arc (pie wedge or donut segment). Angles in radians, 0 at top, clockwise. */\nfunction arcPath(\n cx: number, cy: number, r: number,\n start: number, end: number, innerR: number, full: boolean,\n): string {\n const point = (radius: number, angle: number): [number, number] =>\n [round(cx + radius * Math.sin(angle)), round(cy - radius * Math.cos(angle))];\n\n if (full) {\n // A single full-circle slice: two half arcs (and a hole for donuts).\n const outer = `M ${round(cx)} ${round(cy - r)} A ${r} ${r} 0 1 1 ${round(cx)} ${round(cy + r)} A ${r} ${r} 0 1 1 ${round(cx)} ${round(cy - r)} Z`;\n if (innerR <= 0) return outer;\n const hole = `M ${round(cx)} ${round(cy - innerR)} A ${innerR} ${innerR} 0 1 0 ${round(cx)} ${round(cy + innerR)} A ${innerR} ${innerR} 0 1 0 ${round(cx)} ${round(cy - innerR)} Z`;\n return `${outer} ${hole}`;\n }\n\n const large = end - start > Math.PI ? 1 : 0;\n const [x0, y0] = point(r, start);\n const [x1, y1] = point(r, end);\n if (innerR <= 0) {\n return `M ${round(cx)} ${round(cy)} L ${x0} ${y0} A ${r} ${r} 0 ${large} 1 ${x1} ${y1} Z`;\n }\n const [ix1, iy1] = point(innerR, end);\n const [ix0, iy0] = point(innerR, start);\n return `M ${x0} ${y0} A ${r} ${r} 0 ${large} 1 ${x1} ${y1} L ${ix1} ${iy1} A ${innerR} ${innerR} 0 ${large} 0 ${ix0} ${iy0} Z`;\n}\n","import { Signal, WritableSignal, computed, signal } from '@angular/core';\nimport { AgridChartData, AgridChartType } from './infrastructure/agrid-chart';\n\n/**\n * Construction options for an {@link AgridChartProvider}.\n *\n * Provide a static {@link data} set, or link a live {@link source} (e.g. a grid provider's\n * `visibleRows`) together with a {@link transform} so the chart follows the grid's filtering and\n * sorting automatically.\n */\nexport interface AgridChartProviderConfig<T = any> {\n /** Diagram type: column, bar, line, area, pie, or donut. */\n type: AgridChartType;\n /** Static dataset. Ignored when {@link source} + {@link transform} are provided. */\n data?: AgridChartData;\n /**\n * A reactive row source to derive the dataset from — typically a grid provider's `visibleRows`,\n * which reflects the grid's current filters and sorting. Requires {@link transform}.\n */\n source?: Signal<readonly T[]>;\n /**\n * Turns the {@link source} rows (and the current chart type) into a chart dataset. Re-runs\n * whenever the source rows or the chart type change.\n */\n transform?: (rows: readonly T[], type: AgridChartType) => AgridChartData;\n /** Chart height in pixels (width follows the host). @default 220 */\n height?: number;\n /** Show the series/category legend below the chart. @default true */\n showLegend?: boolean;\n /** Draw value/category axes for cartesian types. @default true */\n showAxis?: boolean;\n /** Override the colour palette. */\n palette?: string[];\n}\n\nconst EMPTY_DATA: AgridChartData = { series: [] };\n\n/**\n * Bundles a chart's type, dataset, and display options behind one object, so a chart is configured\n * exactly like a grid: `<agrid-chart [provider]=\"chartProvider\" />`.\n *\n * @example Static data\n * ```ts\n * new AgridChartProvider({ type: 'column', data: { categories: ['Q1','Q2'], series: [{ values: [10, 14] }] } });\n * ```\n *\n * @example Linked to a grid (follows filters/sorting)\n * ```ts\n * new AgridChartProvider({\n * type: 'column',\n * source: gridProvider.visibleRows,\n * transform: (rows, type) => ({ categories: rows.map(r => r.region), series: [{ values: rows.map(r => r.total) }] }),\n * });\n * ```\n */\nexport class AgridChartProvider<T = any> {\n /** Diagram type. Writable — set it to switch chart type at runtime. */\n readonly type: WritableSignal<AgridChartType>;\n /** The dataset rendered by the chart (derived from the source when linked). */\n readonly data: Signal<AgridChartData>;\n /** Chart height in pixels. */\n readonly height: WritableSignal<number>;\n /** Whether the legend is shown. */\n readonly showLegend: WritableSignal<boolean>;\n /** Whether cartesian axes are drawn. */\n readonly showAxis: WritableSignal<boolean>;\n /** Colour palette override, or `undefined` for the default. */\n readonly palette: WritableSignal<string[] | undefined>;\n\n /** Writable backing store in static mode; `null` when the data is derived from a source. */\n private readonly _data: WritableSignal<AgridChartData> | null;\n\n constructor(config: AgridChartProviderConfig<T>) {\n this.type = signal(config.type);\n\n if (config.source) {\n const { source, transform } = config;\n if (!transform) {\n throw new Error('AgridChartProvider: `transform` is required when `source` is provided.');\n }\n this._data = null;\n this.data = computed(() => transform(source(), this.type()));\n } else {\n const data = signal(config.data ?? EMPTY_DATA);\n this._data = data;\n this.data = data;\n }\n\n this.height = signal(config.height ?? 220);\n this.showLegend = signal(config.showLegend ?? true);\n this.showAxis = signal(config.showAxis ?? true);\n this.palette = signal(config.palette);\n }\n\n /** Replace the dataset. Only valid in static mode (no linked {@link AgridChartProviderConfig.source}). */\n setData(data: AgridChartData): void {\n if (!this._data) {\n throw new Error('AgridChartProvider: setData() is unavailable when a `source` is linked — the dataset is derived from it.');\n }\n this._data.set(data);\n }\n}\n","import {\n ChangeDetectionStrategy,\n Component,\n DestroyRef,\n ElementRef,\n afterNextRender,\n computed,\n inject,\n input,\n signal,\n} from '@angular/core';\nimport { buildChart } from '../infrastructure/agrid-chart';\nimport { AgridChartProvider } from '../agrid-chart-provider';\n\n/**\n * Zero-dependency chart component. Configured exactly like the grid — hand it an\n * {@link AgridChartProvider} and it renders an SVG column / bar / line / area / pie / donut chart\n * with no charting library. The chart sizes itself to the host width (observed) and the provider's\n * height.\n *\n * @example\n * ```html\n * <agrid-chart [provider]=\"chartProvider\" />\n * ```\n */\n@Component({\n selector: 'agrid-chart',\n changeDetection: ChangeDetectionStrategy.OnPush,\n template: `\n <svg\n class=\"agrid-chart__svg\"\n role=\"img\"\n [attr.width]=\"width()\"\n [attr.height]=\"height()\"\n >\n @for (g of layout().gridlines; track $index) {\n <line class=\"agrid-chart__grid\" [attr.x1]=\"g.x1\" [attr.y1]=\"g.y1\" [attr.x2]=\"g.x2\" [attr.y2]=\"g.y2\" />\n }\n @for (a of layout().areas; track $index) {\n <path [attr.d]=\"a.d\" [attr.fill]=\"a.color\" fill-opacity=\"0.15\" />\n }\n @for (l of layout().lines; track $index) {\n <path\n class=\"agrid-chart__line\"\n fill=\"none\"\n [attr.d]=\"l.d\"\n [attr.stroke]=\"l.color\"\n />\n }\n @for (p of layout().points; track $index) {\n <circle [attr.cx]=\"p.x\" [attr.cy]=\"p.y\" r=\"2\" [attr.fill]=\"p.color\" />\n }\n @for (b of layout().bars; track $index) {\n <rect rx=\"1\" [attr.x]=\"b.x\" [attr.y]=\"b.y\" [attr.width]=\"b.width\" [attr.height]=\"b.height\" [attr.fill]=\"b.color\" />\n }\n @for (s of layout().slices; track $index) {\n <path class=\"agrid-chart__slice\" [attr.d]=\"s.d\" [attr.fill]=\"s.color\" />\n }\n @for (lbl of layout().axisLabels; track $index) {\n <text\n class=\"agrid-chart__axis\"\n [attr.x]=\"lbl.x\"\n [attr.y]=\"lbl.y\"\n [attr.text-anchor]=\"lbl.anchor\"\n [attr.dominant-baseline]=\"lbl.baseline\"\n >{{ lbl.text }}</text>\n }\n @if (sliceLabels()) {\n @for (s of layout().slices; track $index) {\n <text\n class=\"agrid-chart__slice-label\"\n [attr.x]=\"s.labelX\"\n [attr.y]=\"s.labelY\"\n text-anchor=\"middle\"\n dominant-baseline=\"middle\"\n >{{ s.percentText }}</text>\n }\n }\n </svg>\n @if (showLegend() && layout().legend.length) {\n <ul class=\"agrid-chart__legend\">\n @for (item of layout().legend; track $index) {\n <li>\n <span class=\"agrid-chart__swatch\" [style.background-color]=\"item.color\"></span>\n {{ item.name }}\n </li>\n }\n </ul>\n }\n `,\n styles: `\n :host { display: block; width: 100%; font-family: inherit; }\n .agrid-chart__svg { display: block; }\n .agrid-chart__grid { stroke: var(--agrid-chart-grid, #e5e7eb); stroke-width: 1; }\n .agrid-chart__line { stroke-width: 1.75; stroke-linejoin: round; stroke-linecap: round; }\n .agrid-chart__slice { stroke: var(--agrid-chart-slice-stroke, #fff); stroke-width: 1; }\n .agrid-chart__axis { fill: var(--agrid-chart-axis, #6b7280); font-size: 10px; }\n .agrid-chart__slice-label { fill: #fff; font-size: 10px; font-weight: 600; }\n .agrid-chart__legend {\n display: flex; flex-wrap: wrap; gap: 4px 14px;\n margin: 6px 0 0; padding: 0; list-style: none;\n font-size: 12px; color: var(--agrid-chart-axis, #4b5563);\n }\n .agrid-chart__legend li { display: inline-flex; align-items: center; gap: 5px; }\n .agrid-chart__swatch { width: 10px; height: 10px; border-radius: 2px; display: inline-block; }\n `,\n})\nexport class AgridChartComponent {\n /** All chart configuration — type, data, and display options. */\n readonly provider = input.required<AgridChartProvider>();\n\n private readonly host = inject(ElementRef<HTMLElement>);\n protected readonly width = signal(0);\n\n protected readonly height = computed(() => this.provider().height());\n protected readonly showLegend = computed(() => this.provider().showLegend());\n protected readonly sliceLabels = computed(\n () => this.provider().type() === 'pie' || this.provider().type() === 'donut',\n );\n\n protected readonly layout = computed(() => {\n const provider = this.provider();\n return buildChart(provider.type(), provider.data(), {\n width: this.width(),\n height: provider.height(),\n palette: provider.palette(),\n showAxis: provider.showAxis(),\n });\n });\n\n constructor() {\n const destroyRef = inject(DestroyRef);\n afterNextRender(() => {\n const el = this.host.nativeElement;\n const measure = () => this.width.set(el.clientWidth);\n measure();\n const ResizeObserverCtor = globalThis.ResizeObserver;\n const observer = ResizeObserverCtor ? new ResizeObserverCtor(measure) : null;\n observer?.observe(el);\n destroyRef.onDestroy(() => observer?.disconnect());\n });\n }\n}\n\n// Re-exported chart types/helpers live with the component for a single import surface.\nexport { AgridChartProvider } from '../agrid-chart-provider';\nexport type { AgridChartProviderConfig } from '../agrid-chart-provider';\nexport type {\n AgridChartData,\n AgridChartLayout,\n AgridChartOptions,\n AgridChartSeries,\n AgridChartType,\n} from '../infrastructure/agrid-chart';\nexport { AGRID_CHART_PALETTE, buildChart } from '../infrastructure/agrid-chart';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["isDataRowItemFn","isDetailRowItemFn","isGroupHeaderItemFn","isPathTreeNodeItemFn","isTreeRowItemFn"],"mappings":"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"}
|