@thkl/agrid 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +51 -0
- package/fesm2022/thkl-agrid.mjs +4799 -0
- package/fesm2022/thkl-agrid.mjs.map +1 -0
- package/package.json +45 -0
- package/types/thkl-agrid.d.ts +1496 -0
- package/types/thkl-agrid.d.ts.map +1 -0
|
@@ -0,0 +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/selection/agrid-navigation.controller.ts","../../../src/app/agrid/rendering/agrid-presentation.service.ts","../../../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/agrid.component.ts","../../../src/app/agrid/agrid.component.html","../../../src/app/agrid/agrid.types.ts","../../../src/app/agrid/thkl-agrid.ts"],"sourcesContent":["import { ColumnFilter } from './agrid-control';\nimport { ColDef, GridItem, ValueOption } 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(item: GridItem): item is { row: Record<string, unknown>; originalIndex: number } {\n return typeof item === 'object' && item !== null && 'row' in item;\n}\n\n/** Returns whether a virtual-scroll item represents a group header. */\nexport function isGroupHeaderItem(item: GridItem): item is { groupLabel: string; count: number; collapsed: boolean } {\n return typeof item === 'object' && item !== null && 'groupLabel' in item;\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 }\n return result;\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 interface SortKey {\n display: string;\n dateLike: boolean;\n dateValue: number;\n numericValue: number | null;\n }\n\n const collator = new Intl.Collator(locale, { numeric: true, sensitivity: 'base' });\n const fields = sortEntries.map(([field, filter]) => ({\n field,\n direction: filter.sort === 'desc' ? -1 : 1,\n col: colMap.get(field),\n }));\n const decorated = indices.map((index, position) => ({\n index,\n position,\n keys: fields.map(({ field, col }): SortKey => {\n const raw = rows[index][field];\n const dateLike = col?.type === 'date' || looksLikeDate(raw);\n const dateValue = dateLike\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 : null;\n return {\n display: dateLike ? '' : getDisplayForField(col, raw, locale),\n dateLike,\n dateValue: Number.isNaN(dateValue) ? -1 : dateValue,\n numericValue,\n };\n }),\n }));\n\n decorated.sort((a, b) => {\n for (let fieldIndex = 0; fieldIndex < fields.length; fieldIndex++) {\n const keyA = a.keys[fieldIndex];\n const keyB = b.keys[fieldIndex];\n let comparison: number;\n if (keyA.dateLike || keyB.dateLike) {\n comparison = keyA.dateValue - keyB.dateValue;\n } else if (keyA.numericValue !== null && keyB.numericValue !== null) {\n comparison = keyA.numericValue - keyB.numericValue;\n } else {\n comparison = collator.compare(keyA.display, keyB.display);\n }\n if (comparison !== 0) {\n return comparison * fields[fieldIndex].direction;\n }\n }\n return a.position - b.position;\n });\n\n return decorated.map(item => item.index);\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 */\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): GridItem[] {\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 items.push({ groupLabel: key, count: groupRows.length, collapsed: !isExpanded });\n if (isExpanded) {\n for (const i of groupRows) items.push({ row: rows[i], originalIndex: i });\n }\n }\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","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 formatDateValue,\n getDateInputValue,\n looksLikeDate,\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 '[attr.aria-readonly]': 'col().editable === false ? \"true\" : null',\n '(click)': 'activate.emit($event)',\n '(dblclick)': 'startEdit.emit()',\n tabindex: '-1',\n },\n template: `\n @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 [type]=\"col().type === 'date' ? 'date' : col().type === 'number' ? 'number' : 'text'\"\n [value]=\"editorValue()\"\n (input)=\"onInput($event)\"\n />\n }\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 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 /** 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 /**\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 /**\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 /**\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 return this.col().type === 'date'\n ? getDateInputValue(draft)\n : String(draft ?? '');\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 const raw = this.value();\n const col = this.col();\n\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\n if (col.formatter) return col.formatter(raw);\n if (col.type === 'date' || looksLikeDate(raw)) {\n return formatDateValue(raw, this.locale(), col.type === 'date');\n }\n return String(raw ?? '');\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 this.draft.set(initialValue);\n\n setTimeout(() => {\n const input = this.inputEl()?.nativeElement;\n if (input) {\n const displaySeed = isDate\n ? dateInitial\n : seed !== '' ? seed : String(this.value() ?? '');\n input.value = displaySeed;\n input.focus();\n if (input.type === 'text' && !seed) 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 /** Forward `<input>` changes to the grid. */\n onInput(event: Event): void {\n const val = (event.target as HTMLInputElement).value;\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 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 isCellEditable: (col: ColDef) => 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 if (!bounds && !selected) return '';\n\n const rowStart = bounds?.rowStart ?? this.findDisplayIndex(selected!.rowIndex);\n const rowEnd = bounds?.rowEnd ?? rowStart;\n const colStart = bounds?.colStart ?? selected!.colIndex;\n const colEnd = bounds?.colEnd ?? selected!.colIndex;\n const rows = this.opts.filteredItems();\n const cols = this.opts.visibleColDefs();\n const lines: string[] = [];\n\n for (let displayIndex = rowStart; displayIndex <= rowEnd; displayIndex++) {\n const item = rows[displayIndex];\n if (!isDataRowItem(item)) continue;\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, item.row[col.field], this.opts.locale())\n ));\n }\n lines.push(cells.join('\\t'));\n }\n return lines.join('\\n');\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)) 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 } from '../agrid.types';\n\n/** Reactive inputs required by {@link AgridColumnLayoutModel}. @internal */\nexport interface AgridColumnLayoutOptions {\n control: Signal<AgridControl | null>;\n colDefs: Signal<ColDef[]>;\n showControlColumn: Signal<boolean>;\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\n readonly gridTemplateColumns = computed(() => {\n const columns = this.widthTokens(this.visibleColDefs());\n return this.opts.showControlColumn() ? `24px ${columns}` : columns;\n });\n\n readonly pinnedGridTemplateColumns = computed(() => {\n const columns = this.widthTokens(this.pinnedColDefs());\n if (this.opts.showControlColumn()) return columns ? `24px ${columns}` : '24px';\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()) + (this.opts.showControlColumn() ? 24 : 0)\n );\n readonly pinnedPaneWidth = computed(() =>\n this.width(this.pinnedColDefs()) + (this.opts.showControlColumn() ? 24 : 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","/** 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 hiddenColumn: string;\n copyCellValue: string;\n copyRow: 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 next: string;\n noRows: string;\n pagination: string;\n pinColumn: string;\n pinColumnRight: string;\n unpinColumnRight: string;\n previous: string;\n resizeColumn: string;\n rows: (count: number) => 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 hiddenColumn: '(hidden)',\n copyCellValue: 'Copy cell',\n copyRow: 'Copy row',\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 next: 'Next',\n noRows: 'No rows to display',\n pagination: 'Pagination',\n pinColumn: 'Pin left',\n pinColumnRight: 'Pin right',\n unpinColumnRight: 'Unpin right',\n previous: 'Previous',\n resizeColumn: 'Resize column',\n rows: count => `${count} ${count === 1 ? 'row' : 'rows'}`,\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 hiddenColumn: '(ausgeblendet)',\n copyCellValue: 'Zelle kopieren',\n copyRow: 'Zeile kopieren',\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 next: 'Weiter',\n noRows: 'Keine Zeilen vorhanden',\n pagination: 'Seitennavigation',\n pinColumn: 'Links fixieren',\n pinColumnRight: 'Rechts fixieren',\n unpinColumnRight: 'Rechts lösen',\n previous: 'Zurück',\n resizeColumn: 'Spaltenbreite ändern',\n rows: count => `${count} ${count === 1 ? 'Zeile' : 'Zeilen'}`,\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 { ChangeDetectionStrategy, Component, computed, input, output } from '@angular/core';\nimport { AgridLocaleText, AGRID_LOCALE_TEXT } from '../agrid-localization';\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 /** 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 /** 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 /** 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","<div\n class=\"ag-filter-menu\"\n role=\"dialog\"\n [attr.aria-label]=\"localeText().columnMenu + ': ' + header()\"\n [style.left.px]=\"x()\"\n [style.top.px]=\"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 (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 } from '../agrid-control';\nimport { AgridDataSource } from '../agrid-datasource';\nimport { ColDef, FilterChangeEvent, SortChangeEvent, ValueOption } from '../agrid.types';\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 }\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 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 (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.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.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 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/** 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 dragField = signal<string | null>(null);\n private readonly dragOverField = signal<string | null>(null);\n private readonly dragInsertBefore = signal(true);\n private dragStartField: string | null = null;\n private dragStartX = 0;\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 if (!this.opts.control() || event.button !== 0) return;\n if (this.opts.getColDef(field)?.locked) return;\n this.dragStartField = field;\n this.dragStartX = event.clientX;\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.dragField() === 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.dragField() === field) return null;\n return this.dragInsertBefore() ? 'before' : 'after';\n }\n\n private readonly dragMove = (event: PointerEvent): void => {\n if (!this.dragStartField) return;\n if (this.dragField() === null) {\n if (Math.abs(event.clientX - this.dragStartX) < 5) return;\n this.dragField.set(this.dragStartField);\n }\n const hovered = this.getHoveredHeaderCell(event.clientX, event.clientY);\n if (hovered && hovered.field !== this.dragField()) {\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.dragField();\n const to = this.dragOverField();\n if (from && to) {\n this.opts.control()?.moveColumn(\n this.opts.visibleColDefs().map(col => col.field),\n from,\n to,\n this.dragInsertBefore(),\n );\n }\n this.dragField.set(null);\n this.dragOverField.set(null);\n this.dragInsertBefore.set(true);\n this.dragStartField = null;\n };\n\n private readonly dragCancel = (): void => this.cancel();\n\n private cancel(): void {\n this.removeListeners();\n this.dragField.set(null);\n this.dragOverField.set(null);\n this.dragInsertBefore.set(true);\n this.dragStartField = null;\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 for (const el of this.browser.elementsFromPoint(x, y)) {\n const headerEl = (el as HTMLElement).closest<HTMLElement>('.ag-header-cell[data-col-field]');\n if (!headerEl?.dataset['colField']) continue;\n const rect = headerEl.getBoundingClientRect();\n return { field: headerEl.dataset['colField'], insertBefore: x < rect.left + rect.width / 2 };\n }\n return null;\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 } 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 /** Finds a column definition by field name. */\n getColDef(field: string): ColDef | undefined {\n return this.opts.colDefs().find(col => col.field === field);\n }\n\n /** Returns a field's zero-based index among visible columns. */\n getVisibleColIndex(field: string): number {\n return this.opts.visibleColDefs().findIndex(col => col.field === field);\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}\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\n constructor(private readonly opts: AgridEditControllerOptions) {}\n\n /** Returns whether a column can be edited in the current grid state. */\n isCellEditable(col: ColDef | undefined): boolean {\n return !!col && !this.opts.readonlyGrid() && col.editable !== false;\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): void {\n const col = this.opts.visibleColDefs()[colIndex];\n if (!this.isCellEditable(col)) return;\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.editingCell.set({ rowIndex: originalIndex, colIndex });\n const displayIndex = this.opts.findDisplayIndex(originalIndex);\n if (displayIndex >= 0) this.opts.scrollToCell(displayIndex, colIndex);\n }\n\n /** Commits the staged value and records the edit in history. */\n commit(): void {\n const position = this.editingCell();\n if (!position) return;\n const col = this.opts.visibleColDefs()[position.colIndex];\n if (!col) {\n this.cancel();\n return;\n }\n\n const oldValue = this.opts.dataSource().getRow(position.rowIndex)[col.field];\n const newValue = this.currentDraft();\n if (oldValue !== newValue) {\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.clearEditState();\n this.opts.focusGrid();\n }\n\n /** Discards the active edit without changing row data. */\n cancel(): void {\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 }\n}\n","import { Signal, WritableSignal, computed, signal } from '@angular/core';\nimport { CellRange } from './agrid-clipboard.handler';\nimport { CellPosition, ColDef, GridItem } from '../agrid.types';\nimport { getDisplayForField, isDataRowItem } from '../agrid.utils';\n\n/** Location of a formatted-value match in source and display coordinates. @internal */\nexport type AgridFindMatch = {\n rowIndex: number;\n displayIndex: number;\n colIndex: number;\n};\n\n/** Dependencies and callbacks required by {@link AgridFindController}. @internal */\nexport interface AgridFindControllerOptions {\n filteredItems: Signal<GridItem[]>;\n visibleColDefs: Signal<ColDef[]>;\n locale: Signal<string>;\n selectedCell: WritableSignal<CellPosition | null>;\n selectedRange: WritableSignal<CellRange | null>;\n scrollToCell: (displayIndex: 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 matches: AgridFindMatch[] = [];\n this.opts.filteredItems().forEach((item, displayIndex) => {\n if (!isDataRowItem(item)) return;\n for (let colIndex = 0; colIndex < cols.length; colIndex++) {\n const col = cols[colIndex];\n const value = getDisplayForField(col, item.row[col.field], this.opts.locale()).toLowerCase();\n if (value.includes(query)) {\n matches.push({ rowIndex: item.originalIndex, displayIndex, 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.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 and selects its first match. */\n setQuery(value: string): void {\n this.query.set(value);\n this.activeIndex.set(-1);\n this.goToMatch(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.scrollToCell(match.displayIndex, 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, WritableSignal } from '@angular/core';\nimport { CellRange } from './agrid-clipboard.handler';\nimport { AgridControl } from '../agrid-control';\nimport { AgridDataSource } from '../agrid-datasource';\nimport { 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 selectedCell: WritableSignal<CellPosition | null>;\n selectedRange: WritableSignal<CellRange | null>;\n editingCell: Signal<CellPosition | null>;\n isEditing: (originalIndex: number, colIndex: number) => boolean;\n startEdit: (originalIndex: number, colIndex: number, seedChar: string) => void;\n commitEdit: () => void;\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 /** 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('.ag-sidebar')) 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 if (this.opts.editingCell()) {\n switch (event.key) {\n case 'Tab':\n event.preventDefault();\n this.opts.commitEdit();\n this.moveSelection(0, event.shiftKey ? -1 : 1);\n break;\n case 'Enter':\n event.preventDefault();\n this.opts.commitEdit();\n this.moveSelection(1, 0);\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 sel = this.opts.selectedCell();\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 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 /** 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}\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 /** 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 { 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 */\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\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 /** 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 _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?.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 * 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 const order = [...currentVisibleOrder];\n const fromIdx = order.indexOf(fromField);\n if (fromIdx === -1) return;\n order.splice(fromIdx, 1);\n const toIdx = order.indexOf(toField);\n if (toIdx === -1) { this._columnOrder.set(order); return; }\n order.splice(insertBefore ? toIdx : toIdx + 1, 0, fromField);\n this._columnOrder.set(order);\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 /** 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. */\n clearAllFilters(): void {\n this._filters.set({});\n this._sortOrder.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 return !!(f.text || f.selectedValues !== null || f.sort);\n }\n\n /** Return `true` when ANY column has an active filter or sort. */\n hasAnyActiveFilter(): boolean {\n return Object.values(this._filters()).some(\n f => f.text || f.selectedValues !== null || f.sort\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 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 { AGridOptions, CellContextMenuItem, ColDef, GroupAction } 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 /** 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 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 * 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 /** 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 /** 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/**\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 /** 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 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 /** 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 /** 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 /** Optional empty-state text override. */\n emptyText?: string;\n /** Whether edits are restricted to the sidebar editor. */\n useSidebarEditor: boolean;\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\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.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.sortOption = config.sortOption ?? 'multi';\n this.rowSelection = config.rowSelection ?? 'none';\n this.groupDescription = config.groupDescription ?? null;\n this.groupActions = config.groupActions ?? [];\n this.cellMenuItems = config.cellMenuItems ?? [];\n this.zebraStripes = config.zebraStripes ?? 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 }\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 { ColDef, GridItem } from '../agrid.types';\nimport {\n applySortToIndices,\n applyTextAndValueFilters,\n buildGroupedItems,\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}\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 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 /** 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 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 const rows = this.opts.dataSource().rows();\n const indices = this.filteredSortedIndices();\n const controlAggregates = this.opts.control()?.aggregates() ?? {};\n const result: Record<string, unknown> = {};\n\n for (const col of this.opts.visibleColDefs()) {\n const aggregate: ColDef['aggregate'] = controlAggregates[col.field] ?? col.aggregate;\n if (!aggregate) continue;\n const values = indices.map(index => rows[index][col.field]);\n if (typeof aggregate === 'function') {\n result[col.field] = (aggregate as (values: unknown[]) => unknown)(values);\n continue;\n }\n\n const numbers = values.map(Number).filter(value => !Number.isNaN(value));\n switch (aggregate) {\n case 'sum':\n result[col.field] = numbers.reduce((sum, value) => sum + value, 0);\n break;\n case 'avg':\n result[col.field] = numbers.length\n ? numbers.reduce((sum, value) => sum + value, 0) / numbers.length\n : null;\n break;\n case 'min':\n result[col.field] = numbers.length ? Math.min(...numbers) : null;\n break;\n case 'max':\n result[col.field] = numbers.length ? Math.max(...numbers) : null;\n break;\n case 'count':\n result[col.field] = values.filter(value => value != null && value !== '').length;\n break;\n }\n }\n return result;\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 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 );\n this.appendAddRow(items);\n return items;\n }\n }\n\n const items: GridItem[] = indices.map(originalIndex => ({\n row: rows[originalIndex],\n originalIndex,\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 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) => 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)) 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/** Dependencies and callbacks required by {@link AgridRowController}. @internal */\nexport interface AgridRowControllerOptions {\n dataSource: Signal<AgridDataSource>;\n filteredItems: Signal<GridItem[]>;\n visibleColDefs: Signal<ColDef[]>;\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 (!(event.target instanceof HTMLSelectElement)) event.preventDefault();\n this.selectedIndices.set(new Set([originalIndex]));\n this.selectionPivot = originalIndex;\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's formatted display value to the clipboard. */\n copyCellToClipboard(value: unknown, col: ColDef): void {\n void this.browser.writeClipboard(getDisplayForField(col, value));\n this.closeCellContextMenu();\n }\n\n /** Copies the visible values of a row as tab-separated text. */\n copyRowToClipboard(row: Record<string, unknown>): void {\n const text = this.opts.visibleColDefs()\n .map(col => getDisplayForField(col, row[col.field]))\n .join('\\t');\n void this.browser.writeClipboard(text);\n this.closeCellContextMenu();\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 onCellEdit: (event: GridEditEvent) => 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\n constructor(private readonly opts: AgridSidebarControllerOptions) {}\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 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 oldValue = this.opts.dataSource().getRow(index)[field];\n if (oldValue === newValue) return;\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 if (!this.opts.useSidebarEditor()) {\n this.opts.onCellEdit({\n position: { rowIndex: index, colIndex },\n field,\n oldValue,\n newValue,\n });\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 } from '../agrid.utils';\nimport { ColDef } 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/** 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 row = input<Record<string, unknown> | 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\n close = output<void>();\n tabChange = output<'columns' | 'detail'>();\n toggleColumn = output<string>();\n detailEdit = output<AgridSidebarEdit>();\n save = output<AgridSidebarDetailField[]>();\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 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 && col.editable !== false,\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 (col of columns(); track col.field) {\n <label class=\"ag-sidebar-item\" (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 } @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 || useSidebarEditor()) && field.col.values?.length) {\n <select\n class=\"ag-detail-input\"\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 || useSidebarEditor()) {\n <input\n class=\"ag-detail-input\"\n [type]=\"field.col.type === 'number' ? 'number' : field.col.type === 'date' ? 'date' : 'text'\"\n [value]=\"field.inputValue\"\n (change)=\"detailEdit.emit({\n field: field.col.field,\n col: field.col,\n value: $any($event.target).value\n })\"\n />\n } @else {\n <span class=\"ag-detail-value\">{{ field.value }}</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 {\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 { 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 } 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 { AgridLocaleText, resolveAgridLocaleText, resolveLocale } from './agrid-localization';\nimport { AgridNavigationController } from './selection/agrid-navigation.controller';\nimport { AgridPresentationService } from './rendering/agrid-presentation.service';\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 isGroupHeaderItem as isGroupHeaderItemFn,\n} from './agrid.utils';\nimport {\n AgridField, CellContextMenuItem, CellPosition, ColDef, FilterChangeEvent, GridEditEvent,\n GridItem, GroupAction, NewRecord, PageChangeEvent, RecordEditEvent, RowClickEvent,\n RowReorderEvent, RowSelectEvent, RowUpdateEvent, SortChangeEvent,\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 / F2 | Enter edit mode |\n * | Printable key | Enter edit mode with seeded character |\n * | Escape | Cancel edit |\n * | Tab / Enter (while editing) | Commit and move right / down |\n */\n@Component({\n selector: 'agrid',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [\n ScrollingModule,\n AgridCellComponent,\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 showControlColumn = computed(() => this.provider().showControlColumn);\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 sortOption = computed(() => this.provider().sortOption);\n readonly rowSelection = computed(() => this.provider().rowSelection);\n readonly groupDescription = computed(() => this.provider().groupDescription);\n readonly groupActions = computed(() => this.provider().groupActions);\n readonly cellMenuItems = computed(() => this.provider().cellMenuItems);\n readonly zebraStripes = computed(() => this.provider().zebraStripes);\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 /** 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 /** 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 has changed and saved a record via the sidebar editor save button */\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 // ── Public state ─────────────────────────────────────────────────────────────\n\n /** Currently focused cell, or `null`. */\n readonly selectedCell = signal<CellPosition | null>(null);\n\n /** Rectangular cell range selected by Shift+arrow or Shift+click. */\n readonly selectedRange = signal<CellRange | null>(null);\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 /** 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 const row = this.dataSource().getRow(originalIndex);\n const saveEvent: RowUpdateEvent = { row, originalIndex };\n this.rowChanged.emit(saveEvent);\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 /** @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 // ── 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 showControlColumn: this.showControlColumn,\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\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 });\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 });\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 rendered semantic rows, including the header row. */\n readonly ariaRowCount = computed(() =>\n this.displayItems().length + 1 + (this.showFooter() ? 1 : 0)\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 // ── 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 => this.isCellEditable(col),\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 });\n\n private readonly findController = new AgridFindController({\n filteredItems: this.filteredItems,\n visibleColDefs: this.visibleColDefs,\n locale: this.locale,\n selectedCell: this.selectedCell,\n selectedRange: this.selectedRange,\n scrollToCell: (displayIndex, colIndex) =>\n this.navigationController.scrollToKeepVisible(displayIndex, 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 selectedCell: this.selectedCell,\n selectedRange: this.selectedRange,\n editingCell: this.editController.editingCell,\n isEditing: (originalIndex, colIndex) => this.isEditing(originalIndex, colIndex),\n startEdit: (originalIndex, colIndex, seedChar) =>\n this.editController.start(originalIndex, colIndex, seedChar),\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 rowSelection: this.rowSelection,\n selectedCell: this.selectedCell,\n editingCell: this.editController.editingCell,\n insertRowAt: index => this.navigationController.insertRowAt(index),\n startDragSelect: originalIndex => this.dragHandler.startDragSelect(originalIndex),\n onRowSelect: event => this.rowSelect.emit(event),\n onRowClick: event => this.rowClick.emit(event),\n onRowRemoved: event => this.rowRemoved.emit(this.createRecordEvent(event.index, event.data)),\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 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 onCellEdit: event => this.emitEditEvents(event),\n });\n\n readonly sidebarOpen = this.sidebarController.open;\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 isCellEditable: col => this.isCellEditable(col),\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 => this.rowReorder.emit(e),\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 /** @internal Start a column header drag. */\n onColHeaderPointerDown(event: PointerEvent, field: string): void {\n this.columnReorder.start(event, field);\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 // ── Setup ─────────────────────────────────────────────────────────────────────\n\n private readonly _seededControls = new WeakSet<AgridControl>();\n\n private emitEditEvents(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 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 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 // 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 if (this.rowSelection() === 'none') return;\n if (this.selectedRowIndices().size === 0) return;\n if (this._hostEl.nativeElement.contains(e.target as Node)) return;\n this.rowController.clearSelection();\n };\n this.browser.addDocumentListener('pointerdown', onOutsidePointerDown);\n this.destroyRef.onDestroy(() => {\n this.browser.removeDocumentListener('pointerdown', onOutsidePointerDown);\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 getItemOriginalIndex(item: GridItem): number | null {\n return isDataRowItemFn(item) ? item.originalIndex : null;\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 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 */\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 /** @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 this.navigationController.handleKeyDown(event);\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 // ── 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()) {\n this.onHandlePointerDown(event, originalIndex);\n return;\n }\n this.rowController.selectFromPointer(event, originalIndex, false);\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 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 the display value of one cell to the clipboard. */\n copyCellToClipboard(value: unknown, col: ColDef): void {\n this.rowController.copyCellToClipboard(value, col);\n }\n\n /** @internal Copy all visible column values of a row as TSV to the clipboard. */\n copyRowToClipboard(row: Record<string, unknown>): void {\n this.rowController.copyRowToClipboard(row);\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 /** Delete the row at `originalIndex`, adjusting stale cell/edit pointers. */\n deleteRow(originalIndex: number): void {\n this.rowController.deleteRow(originalIndex);\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 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 */\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 isCellEditable(col: ColDef): boolean {\n return this.editController.isCellEditable(col);\n }\n\n private enterEdit(originalIndex: number, ci: number, seedChar: string): void {\n this.editController.start(originalIndex, ci, seedChar);\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\"\n [attr.aria-busy]=\"loading() ? 'true' : null\" (copy)=\"onCopy($event)\" (paste)=\"onPaste($event)\"\n (click)=\"closeContextMenu(); closeCellContextMenu(); closeFilterMenu(); closeGroupActionsMenu()\">\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 <div class=\"ag-header ag-header--pinned\" role=\"row\" aria-rowindex=\"1\"\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 [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)\"\n (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 }\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)\"\n (pointerdown)=\"$event.stopPropagation()\" (dblclick)=\"onAutosizeColumn($event, col)\"></div>\n </div>\n }\n </div>\n\n <cdk-virtual-scroll-viewport #pinnedViewport class=\"ag-body ag-pinned-body\" [itemSize]=\"rowHeight()\"\n [style.width.px]=\"pinnedPaneWidth()\">\n <div *cdkVirtualFor=\"let item of displayItems(); let di = index; trackBy: trackByItem\" role=\"row\"\n [attr.aria-rowindex]=\"di + 2\"\n [attr.aria-selected]=\"isDataRowItem(item) && isRowSelected(item.originalIndex) ? 'true' : null\"\n [class.ag-row]=\"!isGroupHeaderItem(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)\"\n [class.ag-row--odd]=\"isDataRowItem(item) && dataRowIsOdd().get(item.originalIndex) === true\"\n [class.ag-row--selected]=\"isPinnedPaneRowSelected(item)\"\n [attr.data-original-index]=\"getItemOriginalIndex(item)\" [style.height.px]=\"rowHeight()\"\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)\"></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 [row]=\"item.row\" [locale]=\"locale()\" [attr.title]=\"getCellTitle(col, item.row[col.field])\"\n [attr.data-cell-row]=\"item.originalIndex\" [attr.data-cell-col]=\"ci\"\n [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 [seedChar]=\"getSeedChar(item.originalIndex, ci)\"\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]=\"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)\"\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\" [class.ag-cell--pinned-last]=\"isLastPinnedColumn(col.field)\">{{\n getGhostCellDisplay(col) }}</div>\n }\n } @else {\n <div class=\"ag-pinned-group-spacer\"></div>\n }\n </div>\n </cdk-virtual-scroll-viewport>\n\n @if (showFooter()) {\n <div class=\"ag-footer\" role=\"row\" [attr.aria-rowindex]=\"displayItems().length + 2\"\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 [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\">\n <div class=\"ag-header\" role=\"row\" aria-rowindex=\"1\"\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 [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)\"\n (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 }\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)\"\n (pointerdown)=\"$event.stopPropagation()\" (dblclick)=\"onAutosizeColumn($event, col)\"></div>\n </div>\n }\n </div>\n\n <cdk-virtual-scroll-viewport #scrollViewport class=\"ag-body\" [itemSize]=\"rowHeight()\"\n [style.min-width.px]=\"scrollableTotalWidth()\" (scroll)=\"onBodyScroll()\">\n <div *cdkVirtualFor=\"let item of displayItems(); let di = index; trackBy: trackByItem\" role=\"row\"\n [attr.aria-rowindex]=\"di + 2\"\n [attr.aria-selected]=\"isDataRowItem(item) && isRowSelected(item.originalIndex) ? 'true' : null\"\n [class.ag-row]=\"!isGroupHeaderItem(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)\"\n [class.ag-row--odd]=\"isDataRowItem(item) && dataRowIsOdd().get(item.originalIndex) === true\"\n [class.ag-row--selected]=\"isDataRowItem(item) && isRowSelected(item.originalIndex)\"\n [attr.data-original-index]=\"getItemOriginalIndex(item)\" [style.height.px]=\"rowHeight()\"\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 [row]=\"item.row\" [locale]=\"locale()\" [attr.title]=\"getCellTitle(col, item.row[col.field])\"\n [attr.data-cell-row]=\"item.originalIndex\" [attr.data-cell-col]=\"ci\"\n [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 [seedChar]=\"getSeedChar(item.originalIndex, ci)\"\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--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 (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\">{{ getGhostCellDisplay(col) }}</div>\n }\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 </div>\n </div>\n }\n </div>\n </cdk-virtual-scroll-viewport>\n\n @if (showFooter()) {\n <div class=\"ag-footer\" role=\"row\" [attr.aria-rowindex]=\"displayItems().length + 2\"\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 [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 <div class=\"ag-header\" role=\"row\" aria-rowindex=\"1\"\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--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)\"\n (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 }\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)\"\n (pointerdown)=\"$event.stopPropagation()\" (dblclick)=\"onAutosizeColumn($event, col)\"></div>\n </div>\n }\n </div>\n\n <cdk-virtual-scroll-viewport #rightPinnedViewport class=\"ag-body ag-pinned-body ag-right-pinned-body\"\n [itemSize]=\"rowHeight()\" [style.width.px]=\"rightPinnedPaneWidth()\" (scroll)=\"onRightPinnedBodyScroll()\">\n <div *cdkVirtualFor=\"let item of displayItems(); let di = index; trackBy: trackByItem\" role=\"row\"\n [attr.aria-rowindex]=\"di + 2\"\n [attr.aria-selected]=\"isDataRowItem(item) && isRowSelected(item.originalIndex) ? 'true' : null\"\n [class.ag-row]=\"!isGroupHeaderItem(item)\" [class.ag-add-row]=\"item === null\"\n [class.ag-ghost-row]=\"item === 'ghost'\" [class.ag-group-header-row]=\"isGroupHeaderItem(item)\"\n [class.ag-row--odd]=\"isDataRowItem(item) && dataRowIsOdd().get(item.originalIndex) === true\"\n [class.ag-row--selected]=\"isDataRowItem(item) && isRowSelected(item.originalIndex)\"\n [style.height.px]=\"rowHeight()\"\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 [row]=\"item.row\" [locale]=\"locale()\" [attr.title]=\"getCellTitle(col, item.row[col.field])\"\n [attr.data-cell-row]=\"item.originalIndex\" [attr.data-cell-col]=\"ci\"\n [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 [seedChar]=\"getSeedChar(item.originalIndex, ci)\"\n [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--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)\"\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-cell--pinned-first]=\"isFirstRightPinnedColumn(col.field)\">{{ getGhostCellDisplay(col) }}</div>\n }\n } @else {\n <div class=\"ag-pinned-group-spacer\"></div>\n }\n </div>\n </cdk-virtual-scroll-viewport>\n\n @if (showFooter()) {\n <div class=\"ag-footer\" role=\"row\" [attr.aria-rowindex]=\"displayItems().length + 2\"\n [style.grid-template-columns]=\"rightGridTemplateColumns()\">\n @for (col of rightPinnedColDefs(); track col.field) {\n <div class=\"ag-footer-cell\" role=\"gridcell\"\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\n [open]=\"sidebarOpen()\"\n [activeTab]=\"sidebarTab()\"\n [columns]=\"colDefs()\"\n [row]=\"sidebarRow()\"\n [hiddenColumns]=\"sidebarHiddenColumns()\"\n [locale]=\"locale()\"\n [localeText]=\"localeText()\"\n [readonlyGrid]=\"readonlyGrid()\"\n [useSidebarEditor]=\"useSidebarEditor()\"\n (close)=\"toggleSidebar()\"\n (tabChange)=\"onSidebarStripClick($event)\"\n (toggleColumn)=\"onSidebarToggleColumn($event)\"\n (detailEdit)=\"onSidebarDetailEdit($event)\"\n (save)=\"onSidebarDetailSave($event)\"\n />\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\"\n [disabled]=\"control()!.currentPage() <= 1\" (click)=\"goToFirstPage()\">«</button>\n <button class=\"ag-page-btn\" [attr.aria-label]=\"localeText().previous\"\n [disabled]=\"control()!.currentPage() <= 1\" (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\"\n (click)=\"goToNextPage()\">›</button>\n <button class=\"ag-page-btn\" [disabled]=\"control()!.currentPage() >= totalPages()\"\n [attr.aria-label]=\"localeText().lastPage\"\n (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 <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 ag-context-item--danger\" role=\"menuitem\" (click)=\"deleteRow(menu.rowIndex)\">\n {{ localeText().deleteRow }}\n </button>\n </div>\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.value, col)\">{{ localeText().copyCellValue\n }}</button>\n <button class=\"ag-context-item\" role=\"menuitem\" (click)=\"copyRowToClipboard(menu.row)\">{{ localeText().copyRow }}</button>\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 }}</button>\n <button class=\"ag-context-item\" role=\"menuitem\" (click)=\"insertRowAt(menu.rowIndex + 1)\">{{ 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\"\n (click)=\"deleteRow(menu.rowIndex); closeCellContextMenu()\">{{ 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\" [disabled]=\"item.disabled\"\n (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'\"\n [showColumnActions]=\"!!control()\" [pinned]=\"getColumnPinState(menu.field)\"\n [groupable]=\"!!getColDef(menu.field)?.groupable\" [grouped]=\"isGroupedByField(menu.field)\"\n [filterable]=\"!!getColDef(menu.field)?.filterable\" [showValueFilter]=\"!serverSideFiltering()\"\n [search]=\"filterMenuSearch()\"\n [allSelected]=\"isMenuAllSelected(menu.field)\"\n [valueItems]=\"serverSideFiltering() || !getColDef(menu.field)?.filterable ? [] : columnMenuValueItems()\"\n [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 (setAggregate)=\"onMenuSetAggregate(menu.field, $event)\" />\n }\n</div>\n","import type { AgridDataSource } from './agrid-datasource';\nimport type { AgridProvider } from './agrid-provider';\n\n/** String-valued property names available on a row type. */\nexport type AgridField<T extends object> = Extract<keyof T, string>;\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/**\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/** 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 /**\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 `''`.\n * - `'date'` — uses a native date editor and built-in localized display formatting.\n */\n type?: 'text' | 'number' | 'date';\n /**\n * Set to `false` to make the column read-only.\n * Defaults to `true` (editable) when omitted.\n */\n editable?: 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 * 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 * 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\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/**\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 }` — group header row when grouping 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 };\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/** 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/**\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 after the user saves a row through the sidebar editor. */\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 text filter changes in server-side filtering mode. */\nexport interface FilterChangeEvent {\n /** Field name of the filtered column. */\n field: string;\n /** Current filter text. An empty string clears the filter. */\n value: string;\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","isGroupHeaderItemFn"],"mappings":"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"}
|