@nexterajs/ui 0.0.2 → 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/README.md +279 -34
- package/fesm2022/nexterajs-ui-charts.mjs +1096 -0
- package/fesm2022/nexterajs-ui-charts.mjs.map +1 -0
- package/fesm2022/nexterajs-ui-core.mjs +652 -12
- package/fesm2022/nexterajs-ui-core.mjs.map +1 -1
- package/fesm2022/nexterajs-ui-display.mjs +1142 -0
- package/fesm2022/nexterajs-ui-display.mjs.map +1 -0
- package/fesm2022/nexterajs-ui-dropdowns.mjs +321 -33
- package/fesm2022/nexterajs-ui-dropdowns.mjs.map +1 -1
- package/fesm2022/nexterajs-ui-file-uploader.mjs +572 -10
- package/fesm2022/nexterajs-ui-file-uploader.mjs.map +1 -1
- package/fesm2022/nexterajs-ui-forms.mjs +2027 -136
- package/fesm2022/nexterajs-ui-forms.mjs.map +1 -1
- package/fesm2022/nexterajs-ui-grid.mjs +1222 -188
- package/fesm2022/nexterajs-ui-grid.mjs.map +1 -1
- package/fesm2022/nexterajs-ui-intl.mjs +103 -11
- package/fesm2022/nexterajs-ui-intl.mjs.map +1 -1
- package/fesm2022/nexterajs-ui-navigation.mjs +1054 -0
- package/fesm2022/nexterajs-ui-navigation.mjs.map +1 -0
- package/fesm2022/nexterajs-ui-notify.mjs +46 -44
- package/fesm2022/nexterajs-ui-notify.mjs.map +1 -1
- package/fesm2022/nexterajs-ui-overlay.mjs +1671 -0
- package/fesm2022/nexterajs-ui-overlay.mjs.map +1 -0
- package/fesm2022/nexterajs-ui-pivot.mjs +51 -26
- package/fesm2022/nexterajs-ui-pivot.mjs.map +1 -1
- package/fesm2022/nexterajs-ui-shell.mjs +542 -0
- package/fesm2022/nexterajs-ui-shell.mjs.map +1 -0
- package/fesm2022/nexterajs-ui-tree-view.mjs +5 -2
- package/fesm2022/nexterajs-ui-tree-view.mjs.map +1 -1
- package/fesm2022/nexterajs-ui-validation.mjs +42 -11
- package/fesm2022/nexterajs-ui-validation.mjs.map +1 -1
- package/fesm2022/nexterajs-ui.mjs +5 -0
- package/fesm2022/nexterajs-ui.mjs.map +1 -1
- package/package.json +33 -2
- package/styles/_dropdown.scss +5 -5
- package/styles/_editor.scss +52 -17
- package/styles/_mixins.scss +1 -1
- package/styles/_scrollbar.scss +5 -5
- package/styles/_status.scss +21 -0
- package/styles/_toast.scss +14 -14
- package/styles/_tokens.scss +420 -3
- package/styles/_widget.scss +14 -3
- package/styles/index.scss +6 -4
- package/types/nexterajs-ui-charts.d.ts +446 -0
- package/types/nexterajs-ui-core.d.ts +387 -22
- package/types/nexterajs-ui-display.d.ts +720 -0
- package/types/nexterajs-ui-dropdowns.d.ts +191 -48
- package/types/nexterajs-ui-file-uploader.d.ts +236 -7
- package/types/nexterajs-ui-forms.d.ts +675 -30
- package/types/nexterajs-ui-grid.d.ts +448 -93
- package/types/nexterajs-ui-intl.d.ts +39 -4
- package/types/nexterajs-ui-navigation.d.ts +531 -0
- package/types/nexterajs-ui-notify.d.ts +4 -2
- package/types/nexterajs-ui-overlay.d.ts +703 -0
- package/types/nexterajs-ui-pivot.d.ts +56 -48
- package/types/nexterajs-ui-shell.d.ts +294 -0
- package/types/nexterajs-ui-tree-view.d.ts +6 -3
- package/types/nexterajs-ui-validation.d.ts +20 -11
- package/types/nexterajs-ui.d.ts +5 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"nexterajs-ui-grid.mjs","sources":["../../../projects/nextera-ui/grid/src/lib/grid/nxe-format.util.ts","../../../projects/nextera-ui/grid/src/lib/grid/nxe-grid-dom.ts","../../../projects/nextera-ui/grid/src/lib/grid/nxe-grid-drag.ts","../../../projects/nextera-ui/grid/src/lib/grid/nxe-grid.types.ts","../../../projects/nextera-ui/grid/src/lib/grid/nxe-header-filter.component.ts","../../../projects/nextera-ui/grid/src/lib/grid/nxe-column.component.ts","../../../projects/nextera-ui/grid/src/lib/grid/nxe-selection.component.ts","../../../projects/nextera-ui/grid/src/lib/grid/nxe-header-filter.model.ts","../../../projects/nextera-ui/grid/src/lib/grid/nxe-header-filter-panel.component.ts","../../../projects/nextera-ui/grid/src/lib/grid/nxe-header-filter-panel.component.html","../../../projects/nextera-ui/grid/src/lib/grid/nxe-header-filter-overlay.ts","../../../projects/nextera-ui/grid/src/lib/grid/nxe-grouping.component.ts","../../../projects/nextera-ui/grid/src/lib/grid/nxe-summary.component.ts","../../../projects/nextera-ui/grid/src/lib/grid/nxe-paging.component.ts","../../../projects/nextera-ui/grid/src/lib/grid/nxe-editing.component.ts","../../../projects/nextera-ui/grid/src/lib/grid/nxe-filter-row.component.ts","../../../projects/nextera-ui/grid/src/lib/grid/nxe-master-detail.component.ts","../../../projects/nextera-ui/grid/src/lib/grid/nxe-scrolling.component.ts","../../../projects/nextera-ui/grid/src/lib/grid/nxe-excel-export.service.ts","../../../projects/nextera-ui/grid/src/lib/grid/nxe-grid-resize.ts","../../../projects/nextera-ui/grid/src/lib/grid/nxe-pager.util.ts","../../../projects/nextera-ui/grid/src/lib/grid/nxe-data-grid.component.ts","../../../projects/nextera-ui/grid/src/lib/grid/nxe-data-grid.component.html","../../../projects/nextera-ui/grid/src/public-api.ts","../../../projects/nextera-ui/grid/src/nexterajs-ui-grid.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\n// Shared value-formatting helpers for the nxe grid family — the single source of truth for how\n// a dx-style column/field `format` renders. Extracted from nxe-data-grid's private\n// `defaultFormat()`/`datePattern()` (the grid delegates here unchanged); the pivot resolves its\n// data-field formats through the same functions so both widgets can never drift apart.\n//\n// dx `{ type }` format objects resolve to the library's own LDML masks:\n// { type: 'fixedPoint', precision: N } → '#,##0' + N decimals\n// { type: 'currency', precision: N } → the same mask — deliberately WITHOUT a currency\n// symbol (recorded in DEFAULTS.md)\n// { type: 'percent', precision: N } → value × 100 + '%' (Excel's own '%' code multiplies,\n// so the exported mask carries a bare '%')\n// { type: '<date pattern>' } → the pattern itself (the app's `Format.DATE`)\n// { formatter } → the function's own text\n\nimport { formatDisplay, parseDateValue } from '@nexterajs/ui/intl';\nimport {\n formatNumber,\n NXE_EN_US_SEPARATORS,\n NxeNumberSeparators,\n parseNumberFormat,\n} from '@nexterajs/ui/intl';\nimport { NxeColumnDataType, NxeColumnFormat } from './nxe-grid.types';\n\n/** `precision: 2` → `'.00'`; absent/zero precision → `''` (dx defaults fixedPoint to 0). */\nfunction precisionDecimals(precision: number | undefined): string {\n return precision && precision > 0 ? '.' + '0'.repeat(precision) : '';\n}\n\n/** Resolve a `format` to a date display pattern — a `{ type }` object's `type` IS the pattern. */\nexport function nxeDatePattern(format: NxeColumnFormat | undefined, fallback = 'dd MMM yyyy'): string {\n if (!format) {\n return fallback;\n }\n return typeof format === 'string' ? format : format.type ?? fallback;\n}\n\n/**\n * Resolve a `format` to the LDML number mask the library's number engine understands: string\n * masks pass through; `{ type: 'fixedPoint' | 'currency', precision }` build a grouped mask\n * (`currency` deliberately carries NO symbol — DEFAULTS.md). Anything else → `undefined`.\n */\nexport function nxeNumberMask(format: NxeColumnFormat | undefined): string | undefined {\n if (!format) {\n return undefined;\n }\n if (typeof format === 'string') {\n return format;\n }\n if (format.type === 'fixedPoint' || format.type === 'currency') {\n return '#,##0' + precisionDecimals(format.precision);\n }\n return undefined;\n}\n\n/**\n * Format a numeric value per a dx-style `format` (string mask, `{ type }` object, or\n * `{ formatter }`). No format / an unresolvable one → `String(value)` (the grid's untyped\n * rendering).\n */\nexport function nxeFormatNumberValue(\n value: number,\n format: NxeColumnFormat | undefined,\n separators: NxeNumberSeparators = NXE_EN_US_SEPARATORS,\n): string {\n if (format && typeof format === 'object') {\n if (typeof format.formatter === 'function') {\n return String(format.formatter(value));\n }\n if (format.type === 'percent') {\n const mask = '#,##0' + precisionDecimals(format.precision) + '%';\n return formatNumber(value * 100, parseNumberFormat(mask), separators);\n }\n }\n const mask = nxeNumberMask(format);\n return mask ? formatNumber(value, parseNumberFormat(mask), separators) : String(value);\n}\n\n/**\n * Derive the Excel `numFmt` mask for a `format`: string masks go through\n * {@link nxeExcelNumberMask} (the same conversion the grid export uses), fixedPoint/currency\n * come from {@link nxeNumberMask}, percent appends a bare `%` (Excel multiplies by 100 itself),\n * and any other `{ type }` is a date pattern used as-is. `{ formatter }`-only objects →\n * `undefined` (callers fall back to exporting the formatted text).\n */\nexport function nxeExcelNumFmt(format: NxeColumnFormat | undefined): string | undefined {\n if (!format) {\n return undefined;\n }\n if (typeof format === 'string') {\n return nxeExcelNumberMask(format);\n }\n if (typeof format.formatter === 'function') {\n return undefined;\n }\n if (format.type === 'percent') {\n return '#,##0' + precisionDecimals(format.precision) + '%';\n }\n return nxeNumberMask(format) ?? format.type ?? undefined;\n}\n\n/** Excel's digit placeholders. */\nconst NXE_DIGIT_PLACEHOLDERS = new Set(['0', '#', '?']);\n\n/**\n * Excel `numFmt` for a dx LDML string mask.\n *\n * The two languages disagree on one character. In Excel an unquoted comma after the last digit\n * placeholder SCALES the value by 1/1000, while dx's LDML engine ignores it (see the golden\n * transcript in `@nexterajs/ui/intl`). The consumer percent mask `#,##0.00,'%'` therefore\n * exported 100 as \"0.10%\". Dropped here, per `;` section: every unquoted comma after the\n * section's decimal point, and a comma that follows a digit placeholder with no placeholder\n * after it before the section's decimal point or end (`#,##0,'%'`, `#,##0,.00`) — none of them\n * ever meant anything to dx. Grouping commas between integer placeholders stay, and\n * single-quoted literals become Excel's double-quoted ones.\n */\nexport function nxeExcelNumberMask(mask: string): string {\n const chars = Array.from(mask);\n // Whether each character is part of a single-quoted literal (its quotes included).\n const quoted: boolean[] = [];\n let inQuote = false;\n for (const ch of chars) {\n if (ch === \"'\") {\n inQuote = !inQuote;\n quoted.push(true);\n } else {\n quoted.push(inQuote);\n }\n }\n /** A digit placeholder follows the comma at `i` in its section's integer part: it groups. */\n const groups = (i: number): boolean => {\n for (let j = i + 1; j < chars.length; j++) {\n if (quoted[j]) {\n continue;\n }\n if (chars[j] === '.' || chars[j] === ';') {\n return false;\n }\n if (NXE_DIGIT_PLACEHOLDERS.has(chars[j])) {\n return true;\n }\n }\n return false;\n };\n\n let out = '';\n let afterPoint = false;\n // The last unquoted character that was not a comma, within the current section.\n let prev = '';\n for (let i = 0; i < chars.length; i++) {\n const ch = chars[i];\n if (ch === \"'\") {\n out += '\"';\n continue;\n }\n if (!quoted[i]) {\n if (ch === ';') {\n afterPoint = false;\n prev = '';\n out += ch;\n continue;\n }\n if (ch === '.') {\n afterPoint = true;\n }\n if (ch === ',') {\n if (afterPoint || (NXE_DIGIT_PLACEHOLDERS.has(prev) && !groups(i))) {\n continue;\n }\n } else {\n prev = ch;\n }\n }\n out += ch;\n }\n return out;\n}\n\n/**\n * dx `getValueDataType` (m_columns_controller_utils.js:230-236): the type a value contributes\n * to column type inference. `null`, arrays and functions contribute nothing.\n */\nexport function nxeValueDataType(v: unknown): NxeColumnDataType | 'object' | undefined {\n if (v == null || Array.isArray(v)) {\n return undefined;\n }\n if (v instanceof Date) {\n return 'date';\n }\n const t = typeof v;\n return t === 'string' || t === 'number' || t === 'boolean' || t === 'object' ? t : undefined;\n}\n\n/**\n * dx's number-column deserializer (m_columns_controller_utils.js:263 `updateSerializers`):\n * `parseFloat`, so \"20.5\" is 20.5 and \"1,234\" is 1 exactly as dx shows it. `NaN` when the\n * value is not numeric at all, which callers render raw.\n */\nexport function nxeNumberValue(raw: unknown): number {\n return typeof raw === 'number' ? raw : parseFloat(String(raw));\n}\n\n/**\n * The data grid's default cell rendering (pure extraction of nxe-data-grid's `defaultFormat`):\n * `dataType`/`format` → display text.\n *\n * dx's format_helper (format_helper.js:23-43) formats by the VALUE, not by the column type: any\n * JS number meets any valid `format`, whatever the column declared. So a number in an untyped\n * or string column still takes its mask, and a number column honours object formats as well.\n */\nexport function nxeDefaultFormat(\n dataType: NxeColumnDataType | 'object' | undefined,\n format: NxeColumnFormat | undefined,\n raw: any,\n separators: NxeNumberSeparators = NXE_EN_US_SEPARATORS,\n): string {\n if (raw == null || raw === '') {\n return '';\n }\n switch (dataType) {\n case 'number': {\n const num = nxeNumberValue(raw);\n return isNaN(num) ? String(raw) : nxeFormatNumberValue(num, format, separators);\n }\n case 'date': {\n const dt = parseDateValue(raw);\n return dt ? formatDisplay(dt, nxeDatePattern(format)) : String(raw);\n }\n case 'boolean':\n return raw ? '✓' : '';\n default:\n // No format (or an unresolvable one) leaves the number as String(value), as dx does.\n return typeof raw === 'number' ? nxeFormatNumberValue(raw, format, separators) : String(raw);\n }\n}\n","/**\n * DOM lookups shared by the grid component and its drag/resize controllers.\n *\n * Both questions here used to be answered with `querySelector('.nxe-header-row')`, which stopped\n * being right once bands could add header rows above the leaves.\n */\n\n/**\n * The bottom `.nxe-header-row` of THIS grid.\n *\n * Used for header-strip geometry — the drop highlight and the drag indicator's vertical extent.\n * It must belong to this grid rather than a nested master-detail grid; those live in the tbody,\n * so the first `thead` in document order is always the outer grid's own.\n *\n * It is NOT one cell per column — see {@link nxeHeaderLeafCells}.\n */\nexport function nxeLeafHeaderRow(host: HTMLElement): HTMLTableRowElement | null {\n const thead = host.querySelector<HTMLElement>(\n '.nxe-datagrid-content > .nxe-datagrid-table > thead',\n );\n const rows = thead?.querySelectorAll<HTMLTableRowElement>('.nxe-header-row');\n return rows && rows.length ? rows[rows.length - 1] : null;\n}\n\n/**\n * The header cell of each visible data column, in visible-column order.\n *\n * Deliberately not \"the cells of the bottom header row\". A top-level column in a banded grid is\n * emitted in the FIRST header row with a rowspan reaching the bottom, so the bottom row holds\n * only the leaves that sit under a band: `Name | Shared(Gross, Comm) | Total` puts Name and Total\n * in row 0 and just Gross and Comm in row 1. Reading the bottom row loses half the columns, and\n * everything that indexes these by visible position — auto-width, resize, reorder, keyboard\n * focus — then addresses the wrong column.\n *\n * `role=\"columnheader\"` plus `aria-colindex` is the discriminator: every leaf header cell carries\n * both, a band is a column header without a number, and a command cell (group indent, detail\n * expander, select-all, edit) is numbered, as dx numbers it, but is no column header\n * (m_column_headers.js:193). The number already accounts for the lead command columns, so sorting\n * on it recovers visible order across however many rows the header happens to have.\n */\nexport function nxeHeaderLeafCells(host: HTMLElement): HTMLTableCellElement[] {\n const thead = host.querySelector<HTMLElement>(\n '.nxe-datagrid-content > .nxe-datagrid-table > thead',\n );\n if (!thead) {\n return [];\n }\n return Array.from(\n thead.querySelectorAll<HTMLTableCellElement>('.nxe-header-row > [role=\"columnheader\"][aria-colindex]'),\n ).sort(\n (a, b) => Number(a.getAttribute('aria-colindex')) - Number(b.getAttribute('aria-colindex')),\n );\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\nimport { NgZone } from '@angular/core';\r\nimport { NxeColumnComponent } from './nxe-column.component';\r\nimport { nxeLeafHeaderRow } from './nxe-grid-dom';\r\n\r\n/**\r\n * Pointer-based drag engines (drag-to-group parity with DevExtreme, baselined against the\r\n * bright deployment 2026-07-27; gesture core shared with the pivot field panel since P3-C2).\r\n *\r\n * Deliberately NOT CDK DragDrop: the drop topologies are \"header → group panel\", \"chip →\r\n * anywhere outside = ungroup/remove\", \"chip ↔ chip = reorder\" — not list-to-list — and the\r\n * ghosts must be dx's exact clones (`.nxe-datagrid-drag-header` for the grid,\r\n * `.nxe-pivotgrid-fields-container.nxe-drag` for the pivot panel). Document-level listeners run\r\n * outside the zone; Angular re-enters only on drop. No `setPointerCapture` (throws for\r\n * synthetic pointerIds under Karma).\r\n *\r\n * dx baseline facts encoded here:\r\n * - grid ghost: `div.nxe-datagrid-drag-header.nxe-datagrid-text-content.nxe-widget.nxe-datagrid-drag-action`\r\n * appended to <body>, caption text only, positioned near the cursor;\r\n * - insertion indicator: `div.nxe-block-separator` placed between panel chips;\r\n * - chip drag highlights the header row with `nxe-datagrid-drop-highlight`;\r\n * - the source cell/chip stays in place, dimmed;\r\n * - header→panel drop APPENDS as the last group level (indicator after the last chip).\r\n */\r\n\r\n/** Movement (px) before a press becomes a drag — below this a release is a normal click. */\r\nconst DRAG_START_DELTA = 5;\r\n/** Ghost offset from the pointer (px), tuned against the bright screenshots. */\r\nconst GHOST_OFFSET = 8;\r\n\r\n/**\r\n * One-shot suppression of the click a completed gesture is about to fire, shared by the drag and\r\n * resize engines. Strictly gesture-scoped: clears once that trailing click has passed (even when\r\n * it lands on an element without a consuming handler) and expires after 500ms, so a later genuine\r\n * click is never eaten.\r\n */\r\nexport class NxeGestureClickSuppression {\r\n private pending = false;\r\n private until = 0;\r\n\r\n arm(): void {\r\n this.pending = true;\r\n this.until = performance.now() + 500;\r\n // Capture runs before the bubble-phase consumers; the macrotask runs after dispatch.\r\n document.addEventListener(\r\n 'click',\r\n () => setTimeout(() => (this.pending = false)),\r\n { capture: true, once: true },\r\n );\r\n }\r\n\r\n consume(): boolean {\r\n const suppress = this.pending && performance.now() < this.until;\r\n this.pending = false;\r\n return suppress;\r\n }\r\n}\r\n\r\n/**\r\n * Owner-side contract of {@link NxeDragGesture}. The gesture core owns the press → threshold →\r\n * drag lifecycle (document listeners outside the zone, ghost mounting/positioning, Escape /\r\n * pointercancel semantics, click suppression, ghost/source/body teardown); the delegate owns the\r\n * payload, the drop-target hit-testing, and any indicators/highlights beyond the ghost itself.\r\n */\r\nexport interface NxeDragGestureDelegate {\r\n /** Build the ghost's element (classes + content). The gesture appends it to <body> and\r\n * keeps it `position: fixed` at pointer + offset. Called once, when the threshold passes. */\r\n createGhost(): HTMLElement;\r\n /** Class(es) that dim the pressed source element for the duration of the drag. */\r\n sourceDragClasses: readonly string[];\r\n /** The 5px threshold just passed — add initial highlights (e.g. the grid's header-row\r\n * drop highlight for chip drags). */\r\n dragStarted?(): void;\r\n /** Pointer tracking while a drag is active — update drop targets / indicators. */\r\n dragMove(x: number, y: number): void;\r\n /** Pointer released after a REAL drag. Runs inside the Angular zone; the ghost, source dim,\r\n * and `clearDropVisuals` teardown have already happened (imperative DOM must be gone\r\n * before any signal write re-runs an @for over the drop zone). */\r\n drop(): void;\r\n /** Remove indicators/highlights the delegate created. Must be idempotent — also runs on\r\n * cancel and destroy. */\r\n clearDropVisuals(): void;\r\n /** Gesture over (drop dispatched, sub-threshold release, cancel, destroy) — drop payload. */\r\n reset?(): void;\r\n}\r\n\r\n/**\r\n * The shared pointer-gesture core (extracted from the grid controller in P3-C2 so the pivot\r\n * field panel reuses it rather than copy-pasting). Behavior is the audited 2026-07-27 gesture:\r\n * press arms, 5px starts, Escape cancels (suppressing the held pointer's release click),\r\n * pointercancel cancels silently, drop arms one-shot click suppression.\r\n */\r\nexport class NxeDragGesture {\r\n private active: {\r\n /** The pointer that started the gesture — other pointers (second touch) are ignored. */\r\n pointerId: number;\r\n startX: number;\r\n startY: number;\r\n source: HTMLElement;\r\n started: boolean;\r\n ghost: HTMLElement | null;\r\n } | null = null;\r\n private readonly suppression = new NxeGestureClickSuppression();\r\n\r\n private readonly onMove = (e: PointerEvent): void => this.pointerMove(e);\r\n private readonly onUp = (e: PointerEvent): void => {\r\n if (this.active && e.pointerId !== this.active.pointerId) {\r\n return;\r\n }\r\n this.pointerUp();\r\n };\r\n private readonly onCancel = (e: PointerEvent): void => {\r\n if (this.active && e.pointerId !== this.active.pointerId) {\r\n return;\r\n }\r\n // pointercancel fires no trailing click — cancel WITHOUT arming click suppression.\r\n this.cancel(false);\r\n };\r\n private readonly onKey = (e: KeyboardEvent): void => {\r\n if (e.key === 'Escape') {\r\n this.cancel(true); // the still-held pointer's release click will follow\r\n }\r\n };\r\n\r\n constructor(\r\n private readonly zone: NgZone,\r\n private readonly delegate: NxeDragGestureDelegate,\r\n ) {}\r\n\r\n /** Arm a gesture on pointerdown. Returns false (payload must NOT be set) when refused. */\r\n begin(event: PointerEvent): boolean {\r\n if (event.button !== 0 || this.active) {\r\n return false;\r\n }\r\n this.active = {\r\n pointerId: event.pointerId,\r\n startX: event.clientX,\r\n startY: event.clientY,\r\n source: event.currentTarget as HTMLElement,\r\n started: false,\r\n ghost: null,\r\n };\r\n this.zone.runOutsideAngular(() => {\r\n document.addEventListener('pointermove', this.onMove);\r\n document.addEventListener('pointerup', this.onUp);\r\n document.addEventListener('pointercancel', this.onCancel);\r\n document.addEventListener('keydown', this.onKey);\r\n });\r\n return true;\r\n }\r\n\r\n /**\r\n * One-shot suppression of the click browsers fire right after a drag's pointerup — call at\r\n * the top of header/chip/funnel click handlers so a drop never doubles as a click action.\r\n */\r\n consumeClick(): boolean {\r\n return this.suppression.consume();\r\n }\r\n\r\n destroy(): void {\r\n if (this.active) {\r\n this.cancel(false);\r\n }\r\n }\r\n\r\n private pointerMove(e: PointerEvent): void {\r\n const a = this.active;\r\n if (!a || e.pointerId !== a.pointerId) {\r\n return;\r\n }\r\n if (!a.started) {\r\n if (Math.hypot(e.clientX - a.startX, e.clientY - a.startY) < DRAG_START_DELTA) {\r\n return;\r\n }\r\n a.started = true;\r\n a.ghost = this.mountGhost(a);\r\n for (const cls of this.delegate.sourceDragClasses) {\r\n a.source.classList.add(cls);\r\n }\r\n document.body.classList.add('nxe-grid-dragging');\r\n this.delegate.dragStarted?.();\r\n }\r\n if (e.cancelable) {\r\n e.preventDefault(); // no text selection / touch scroll mid-drag\r\n }\r\n if (a.ghost) {\r\n a.ghost.style.left = `${e.clientX + GHOST_OFFSET}px`;\r\n a.ghost.style.top = `${e.clientY + GHOST_OFFSET}px`;\r\n }\r\n this.delegate.dragMove(e.clientX, e.clientY);\r\n }\r\n\r\n private mountGhost(a: { startX: number; startY: number }): HTMLElement {\r\n const ghost = this.delegate.createGhost();\r\n ghost.style.position = 'fixed';\r\n ghost.style.left = `${a.startX + GHOST_OFFSET}px`;\r\n ghost.style.top = `${a.startY + GHOST_OFFSET}px`;\r\n ghost.style.pointerEvents = 'none';\r\n ghost.style.zIndex = '10000';\r\n document.body.appendChild(ghost);\r\n return ghost;\r\n }\r\n\r\n private pointerUp(): void {\r\n const a = this.active;\r\n this.detachListeners();\r\n this.active = null;\r\n if (!a) {\r\n return;\r\n }\r\n if (!a.started) {\r\n this.delegate.reset?.();\r\n return; // plain click — let the click event do its job\r\n }\r\n this.suppression.arm();\r\n // Imperative DOM must be gone BEFORE any signal write re-runs a drop zone's @for.\r\n this.teardownVisuals(a);\r\n this.zone.run(() => this.delegate.drop());\r\n this.delegate.reset?.();\r\n }\r\n\r\n private cancel(willClickFollow: boolean): void {\r\n const a = this.active;\r\n this.detachListeners();\r\n this.active = null;\r\n if (!a) {\r\n return;\r\n }\r\n if (a.started) {\r\n if (willClickFollow) {\r\n this.suppression.arm(); // Escape: the held pointer's release click still fires\r\n }\r\n this.teardownVisuals(a);\r\n }\r\n this.delegate.reset?.();\r\n }\r\n\r\n private teardownVisuals(a: { source: HTMLElement; ghost: HTMLElement | null }): void {\r\n a.ghost?.remove();\r\n a.ghost = null;\r\n for (const cls of this.delegate.sourceDragClasses) {\r\n a.source.classList.remove(cls);\r\n }\r\n document.body.classList.remove('nxe-grid-dragging');\r\n this.delegate.clearDropVisuals();\r\n }\r\n\r\n private detachListeners(): void {\r\n document.removeEventListener('pointermove', this.onMove);\r\n document.removeEventListener('pointerup', this.onUp);\r\n document.removeEventListener('pointercancel', this.onCancel);\r\n document.removeEventListener('keydown', this.onKey);\r\n }\r\n}\r\n\r\nexport interface NxeGridDragHooks {\r\n zone: NgZone;\r\n host: () => HTMLElement;\r\n /** Header dropped on the group panel. */\r\n onGroupDrop: (col: NxeColumnComponent) => void;\r\n /** Chip dropped outside the panel. */\r\n onChipRemove: (col: NxeColumnComponent) => void;\r\n /** Chip dropped at another panel position. */\r\n onChipMove: (fromLevel: number, toLevel: number) => void;\r\n /** dx `allowColumnReordering` (default false) — enables the header-row drop zone. */\r\n reorderEnabled: () => boolean;\r\n /** Header dropped between two headers: move visible column `from` to insertion `slot`. */\r\n onColumnMove: (fromVisibleIndex: number, insertionSlot: number) => void;\r\n /** Data-column header cells (command cells excluded), for reorder hit-testing. */\r\n headerDataCells: () => HTMLElement[];\r\n}\r\n\r\ninterface GridDragState {\r\n kind: 'header' | 'chip';\r\n col: NxeColumnComponent;\r\n /** Chip drags: the group level being dragged. Header drags: the visible column index. */\r\n level: number;\r\n separator: HTMLElement | null;\r\n /** Reorder drop indicator (vertical bar between headers). */\r\n colIndicator: HTMLElement | null;\r\n overPanel: boolean;\r\n /** Chip drags: insertion slot among the panel chips while hovering the panel. */\r\n dropIndex: number | null;\r\n /** Header drags with reordering on: insertion slot among the data headers. */\r\n headerSlot: number | null;\r\n}\r\n\r\n/** The data grid's drag controller — payload + drop topology over the shared gesture core. */\r\nexport class NxeGridDragController {\r\n private drag: GridDragState | null = null;\r\n private readonly gesture: NxeDragGesture;\r\n\r\n constructor(private readonly hooks: NxeGridDragHooks) {\r\n this.gesture = new NxeDragGesture(hooks.zone, {\r\n // Exact class list observed on bright's dx ghost + an nxe hook for fallback styling.\r\n createGhost: () => {\r\n const ghost = document.createElement('div');\r\n ghost.className =\r\n 'nxe-datagrid-drag-header nxe-datagrid-text-content nxe-widget nxe-datagrid-drag-action nxe-grid-drag-ghost';\r\n const col = this.drag?.col;\r\n ghost.textContent = col ? col.caption() || col.dataField() : '';\r\n ghost.style.whiteSpace = 'nowrap';\r\n return ghost;\r\n },\r\n sourceDragClasses: ['nxe-drag-source'],\r\n dragStarted: () => {\r\n if (this.drag?.kind === 'chip') {\r\n // dx: while a chip is dragged, the header row is the highlighted return target.\r\n this.headerRow()?.classList.add('nxe-datagrid-drop-highlight');\r\n }\r\n },\r\n dragMove: (x, y) => {\r\n if (this.drag) {\r\n this.updateDropTarget(this.drag, x, y);\r\n }\r\n },\r\n drop: () => this.completeDrop(),\r\n clearDropVisuals: () => {\r\n if (this.drag) {\r\n this.removeSeparator(this.drag);\r\n this.removeColIndicator(this.drag);\r\n }\r\n this.headerRow()?.classList.remove('nxe-datagrid-drop-highlight');\r\n },\r\n reset: () => {\r\n this.drag = null;\r\n },\r\n });\r\n }\r\n\r\n startHeaderDrag(col: NxeColumnComponent, visibleIndex: number, event: PointerEvent): void {\r\n this.begin('header', col, visibleIndex, event);\r\n }\r\n\r\n startChipDrag(col: NxeColumnComponent, level: number, event: PointerEvent): void {\r\n this.begin('chip', col, level, event);\r\n }\r\n\r\n /** See {@link NxeDragGesture.consumeClick}. */\r\n consumeClick(): boolean {\r\n return this.gesture.consumeClick();\r\n }\r\n\r\n destroy(): void {\r\n this.gesture.destroy();\r\n }\r\n\r\n private begin(kind: 'header' | 'chip', col: NxeColumnComponent, level: number, event: PointerEvent): void {\r\n if (!this.gesture.begin(event)) {\r\n return;\r\n }\r\n this.drag = {\r\n kind,\r\n col,\r\n level,\r\n separator: null,\r\n colIndicator: null,\r\n overPanel: false,\r\n dropIndex: null,\r\n headerSlot: null,\r\n };\r\n }\r\n\r\n private updateDropTarget(a: GridDragState, x: number, y: number): void {\r\n const panel = this.panel();\r\n const rect = panel?.getBoundingClientRect();\r\n a.overPanel = !!rect && x >= rect.left && x <= rect.right && y >= rect.top && y <= rect.bottom;\r\n if (!panel || !a.overPanel) {\r\n a.dropIndex = null;\r\n this.removeSeparator(a);\r\n if (a.kind === 'header') {\r\n this.updateHeaderReorderTarget(a, x, y);\r\n }\r\n return;\r\n }\r\n this.removeColIndicator(a);\r\n a.headerSlot = null;\r\n const chips = Array.from(panel.querySelectorAll<HTMLElement>('.nxe-group-panel-item'));\r\n if (a.kind === 'header') {\r\n // dx appends on header→panel drop; the indicator sits after the last chip.\r\n a.dropIndex = chips.length;\r\n this.placeSeparator(a, panel, chips, chips.length);\r\n return;\r\n }\r\n let index = chips.length;\r\n for (let i = 0; i < chips.length; i++) {\r\n const r = chips[i].getBoundingClientRect();\r\n if (x < r.left + r.width / 2) {\r\n index = i;\r\n break;\r\n }\r\n }\r\n a.dropIndex = index;\r\n this.placeSeparator(a, panel, chips, index);\r\n }\r\n\r\n /** Header-row drop zone (only with `allowColumnReordering`): slot between data headers. */\r\n private updateHeaderReorderTarget(a: GridDragState, x: number, y: number): void {\r\n if (!this.hooks.reorderEnabled()) {\r\n a.headerSlot = null;\r\n this.removeColIndicator(a);\r\n return;\r\n }\r\n const rowRect = this.headerRow()?.getBoundingClientRect();\r\n if (!rowRect || x < rowRect.left || x > rowRect.right || y < rowRect.top || y > rowRect.bottom) {\r\n a.headerSlot = null;\r\n this.removeColIndicator(a);\r\n return;\r\n }\r\n const cells = this.hooks.headerDataCells();\r\n if (!cells.length) {\r\n return;\r\n }\r\n let slot = cells.length;\r\n for (let i = 0; i < cells.length; i++) {\r\n const r = cells[i].getBoundingClientRect();\r\n if (x < r.left + r.width / 2) {\r\n slot = i;\r\n break;\r\n }\r\n }\r\n a.headerSlot = slot;\r\n if (!a.colIndicator) {\r\n a.colIndicator = document.createElement('div');\r\n a.colIndicator.className = 'nxe-col-drop-indicator';\r\n document.body.appendChild(a.colIndicator);\r\n }\r\n const edge =\r\n slot < cells.length\r\n ? cells[slot].getBoundingClientRect().left\r\n : cells[cells.length - 1].getBoundingClientRect().right;\r\n a.colIndicator.style.left = `${edge - 1}px`;\r\n a.colIndicator.style.top = `${rowRect.top}px`;\r\n a.colIndicator.style.height = `${rowRect.height}px`;\r\n }\r\n\r\n private removeColIndicator(a: GridDragState): void {\r\n a.colIndicator?.remove();\r\n a.colIndicator = null;\r\n }\r\n\r\n private completeDrop(): void {\r\n const a = this.drag;\r\n if (!a) {\r\n return;\r\n }\r\n if (a.kind === 'header') {\r\n if (a.overPanel) {\r\n this.hooks.onGroupDrop(a.col);\r\n } else if (a.headerSlot != null) {\r\n this.hooks.onColumnMove(a.level, a.headerSlot);\r\n }\r\n return;\r\n }\r\n if (!a.overPanel) {\r\n this.hooks.onChipRemove(a.col);\r\n return;\r\n }\r\n if (a.dropIndex != null) {\r\n const target = a.dropIndex > a.level ? a.dropIndex - 1 : a.dropIndex;\r\n if (target !== a.level) {\r\n this.hooks.onChipMove(a.level, target);\r\n }\r\n }\r\n }\r\n\r\n private placeSeparator(a: GridDragState, panel: HTMLElement, chips: HTMLElement[], index: number): void {\r\n if (!a.separator) {\r\n a.separator = document.createElement('div');\r\n a.separator.className = 'nxe-block-separator';\r\n a.separator.textContent = ' '; // dx renders the separator as an block\r\n }\r\n const reference = chips[index] ?? null;\r\n if (a.separator.parentElement !== panel || a.separator.nextElementSibling !== reference) {\r\n panel.insertBefore(a.separator, reference);\r\n }\r\n }\r\n\r\n private removeSeparator(a: GridDragState): void {\r\n a.separator?.remove();\r\n a.separator = null;\r\n }\r\n\r\n private panel(): HTMLElement | null {\r\n return this.hooks.host().querySelector('.nxe-datagrid-group-panel');\r\n }\r\n\r\n private headerRow(): HTMLElement | null {\r\n return nxeLeafHeaderRow(this.hooks.host());\r\n }\r\n}\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\n// Shared types for the nxe-data-grid family. Row data is `any` to mirror DevExtreme's untyped\r\n// grid (the app stores plain JS records and reads arbitrary fields off `key.data`).\r\n\r\n/** A DevExtreme-style column `format`: a number-mask string, a date format string, or `{ type }`. */\r\nexport interface NxeColumnFormatObject {\r\n type?: string;\r\n precision?: number;\r\n /** dx parity: a custom `formatter` wins over `type` (resolved in nxe-format.util). */\r\n formatter?: (value: any) => string;\r\n}\r\nexport type NxeColumnFormat = string | NxeColumnFormatObject;\r\n\r\n/**\r\n * A column's declared `dataType`. Leaving it unset is not the same as `'string'`: as in dx\r\n * (m_columns_controller.js `updateColumnDataTypes`), an unset type is inferred from the loaded\r\n * values, which is what right-aligns and formats a numeric column nobody typed.\r\n */\r\nexport type NxeColumnDataType = 'string' | 'number' | 'date' | 'boolean';\r\n\r\n/** Column `customizeText` callback — `(info) => string` (used by `formatAccounting`). */\r\nexport type NxeCustomizeText = (info: { value: any; valueText: string }) => string;\r\n\r\n/**\r\n * The `$implicit` context object handed to a cell template, mirroring DevExtreme's cell info.\r\n * Templates read `cell.data.<field>` (live row object), `cell.rowIndex`, and `cell.columnIndex`.\r\n * `value`/`displayValue`/`text`/`key`/`column` are provided for parity (presently unread in cells).\r\n */\r\nexport interface NxeCellInfo<T = any> {\r\n data: T;\r\n rowIndex: number;\r\n columnIndex: number;\r\n value: any;\r\n displayValue: any;\r\n text: string;\r\n key: T;\r\n column: { dataField?: string; caption?: string } | null;\r\n}\r\n\r\n/**\r\n * The `$implicit` context of an `editCellTemplate`, mirroring DevExtreme's edit-cell info.\r\n *\r\n * `data` is the LIVE row object. That is the load-bearing part: the dominant template shape\r\n * assigns straight to it (`ctx.data.amount = $event`) rather than calling `setValue`, exactly as\r\n * it did under dx, and the grid reads display text back off the same object.\r\n *\r\n * `setValue` is provided for dx parity and routes through the grid's own write path — committing\r\n * in `cell` mode, buffering in `row` mode — so a template that uses it participates in Save and\r\n * Cancel. A template that writes `data` directly bypasses the buffer, and therefore Cancel; dx\r\n * behaves the same way, because it hands out the raw row and does not police it.\r\n */\r\nexport interface NxeEditCellInfo<T = any> {\r\n data: T;\r\n key: any;\r\n value: any;\r\n displayValue: any;\r\n text: string;\r\n rowIndex: number;\r\n columnIndex: number;\r\n column: {\r\n dataField?: string;\r\n caption?: string;\r\n dataType?: string;\r\n format?: NxeColumnFormat;\r\n } | null;\r\n /** dx parity: commits in `cell` mode, buffers in `row` mode. */\r\n setValue: (newValue: any) => void;\r\n component: NxeGridInstance<T>;\r\n}\r\n\r\n/** dx `rowType` — which kind of row a prepared cell belongs to. */\r\nexport type NxeRowType = 'header' | 'filter' | 'data' | 'group' | 'groupFooter' | 'totalFooter';\r\n\r\n/** The row half of a prepared event, shared by `onCellPrepared` and `onRowPrepared`. */\r\nexport interface NxeRowInfo<T = any> {\r\n rowType: NxeRowType;\r\n data: T | undefined;\r\n key: any;\r\n rowIndex: number;\r\n /** Group nesting level for a group or group-footer row; absent elsewhere. */\r\n groupIndex?: number;\r\n /** dx handlers written against older builds read this name instead. */\r\n groupLevel?: number;\r\n isExpanded?: boolean;\r\n isSelected?: boolean;\r\n}\r\n\r\n/**\r\n * DevExtreme-shaped `onCellPrepared` payload, emitted once per rendered cell after the DOM is\r\n * written — `cellElement` is the real `<td>`, and handlers are expected to mutate it.\r\n *\r\n * The declarative `mergeColumns` and `rowClass` inputs are the recommended way to do what most\r\n * handlers do. This exists because applications carry handlers that cannot be rewritten.\r\n */\r\nexport interface NxeCellPreparedEvent<T = any> {\r\n data: T | undefined;\r\n key: any;\r\n value: any;\r\n displayValue: any;\r\n text: string;\r\n /** Visible-column index, command columns excluded; -1 for a cell that spans columns. */\r\n columnIndex: number;\r\n /** 0-based data-row index; -1 for header, filter and total-footer rows. */\r\n rowIndex: number;\r\n column: { dataField?: string; caption?: string; dataType?: string; index: number } | null;\r\n row: NxeRowInfo<T> | null;\r\n rowType: NxeRowType;\r\n cellElement: HTMLTableCellElement;\r\n component: NxeGridInstance<T>;\r\n element: HTMLElement;\r\n}\r\n\r\n/** DevExtreme-shaped `onRowPrepared` payload. `rowClass` covers the common case declaratively. */\r\nexport interface NxeRowPreparedEvent<T = any> extends NxeRowInfo<T> {\r\n rowElement: HTMLTableRowElement;\r\n columnCount: number;\r\n component: NxeGridInstance<T>;\r\n element: HTMLElement;\r\n}\r\n\r\n/**\r\n * The `$implicit` context of a `groupCellTemplate`, replacing the `\"Caption: value\"` text in a\r\n * group row's caption cell. `value` is the raw group key; `text` is what the grid would have\r\n * rendered.\r\n */\r\nexport interface NxeGroupCellInfo<T = any> {\r\n data: T[];\r\n key: any;\r\n value: any;\r\n displayValue: any;\r\n text: string;\r\n groupIndex: number;\r\n columnIndex: number;\r\n column: { dataField?: string; caption?: string } | null;\r\n component: NxeGridInstance<T>;\r\n}\r\n\r\n/**\r\n * DevExtreme-shaped `onOptionChanged` payload. Emitted for internal paging\r\n * (`paging.pageIndex`) and for runtime grouping changes (`columns[<i>].groupIndex`, where `<i>`\r\n * is the column's content-children declaration index) — one event per user gesture, carrying\r\n * `previousValue`/`value` exactly as generic-list's persistence handler expects.\r\n */\r\nexport interface NxeGridOptionChangedEvent {\r\n name: string;\r\n fullName: string;\r\n value: any;\r\n previousValue?: any;\r\n}\r\n\r\n/** DevExtreme-shaped `onSelectionChanged` payload (handlers read `selectedRowsData[0]?.<field>`). */\r\nexport interface NxeGridSelectionChangedEvent<T = any> {\r\n selectedRowsData: T[];\r\n selectedRowKeys: T[];\r\n currentSelectedRowKeys: T[];\r\n currentDeselectedRowKeys: T[];\r\n component: NxeGridInstance<T>;\r\n element: HTMLElement | null;\r\n}\r\n\r\n/**\r\n * The `.instance` facade surface — only the methods the codebase actually calls\r\n * (`getSelectedRowsData` ×12 in templates, `refresh` ×13, `columnOption(field,'visible',bool)` ×3).\r\n */\r\nexport interface NxeExportColumn {\r\n caption: string;\r\n dataField: string;\r\n /** The declared type, else the inferred one; `undefined` while nothing could be inferred. */\r\n dataType: NxeColumnDataType | undefined;\r\n format: NxeColumnFormat | undefined;\r\n}\r\n\r\n/** dx TreeList node shape — the slice `exportTreeToExcel` walks (`data` + `children`). */\r\nexport interface NxeTreeListNode<T = any> {\r\n key?: any;\r\n data?: T;\r\n children: NxeTreeListNode<T>[];\r\n level?: number;\r\n hasChildren?: boolean;\r\n}\r\n\r\nexport interface NxeGridInstance<T = any> {\r\n getSelectedRowsData(): T[];\r\n getSelectedRowKeys(): T[];\r\n refresh(): void;\r\n /**\r\n * dx `clearFilter()`: no argument clears the filter row AND header filters (including\r\n * declarative `filterValues` seeds); `'row'`/`'header'` clear one kind. `'search'`,\r\n * `'filterValue'`, `'dataSource'` are accepted no-ops (those filters don't exist here).\r\n */\r\n clearFilter(filterName?: 'row' | 'header' | 'search' | 'filterValue' | 'dataSource'): void;\r\n /** Only the `(field, 'visible', boolean)` setter form is used (export show/hide toggle). */\r\n columnOption(dataField: string, optionName: 'visible', value: boolean): void;\r\n /** Export model: currently-visible columns (honours columnOption visibility toggles). */\r\n getVisibleColumns(): NxeExportColumn[];\r\n /** Export model: the filtered+sorted data rows (all pages). */\r\n getVisibleRows(): T[];\r\n /**\r\n * dx `totalCount()`: data rows after filtering, across all pages. Read as\r\n * `e.component.totalCount()` from a cell-prepared handler to size a merge run.\r\n */\r\n totalCount(): number;\r\n /** dx TreeList parity: virtual root whose `children` are the top-level nodes (empty for flat grids). */\r\n getRootNode(): NxeTreeListNode<T>;\r\n /** DevExtreme parity no-op (layout is CSS-driven); triggers a refresh tick. */\r\n updateDimensions(): void;\r\n /** Collapses a master-detail row / tree-list node by key (orbit addition). */\r\n collapseRow(key: any): void;\r\n /** Expands a tree-list node by key, overriding a manual collapse (orbit addition). */\r\n expandRow(key: any): void;\r\n /**\r\n * Ungroups every grouped column (real dx semantics), emitting one `columns[i].groupIndex`\r\n * removal per level in descending order so generic-list's persistence replay converges.\r\n */\r\n clearGrouping(): void;\r\n /** Expands all groups / tree nodes (orbit addition). */\r\n expandAll(): void;\r\n /** Commits the pending row edit, if any (dx parity; cell edits commit on blur). */\r\n saveEditData(): void;\r\n /** The grid's host element (dx parity: `e.component.element()`). */\r\n element(): HTMLElement;\r\n}\r\n","import { ChangeDetectionStrategy, Component, input, ViewEncapsulation } from '@angular/core';\r\n\r\n/**\r\n * `nxe-header-filter` — drop-in replacement for DevExtreme `dxo-header-filter` (grid child option).\r\n *\r\n * Adds a funnel icon to each filterable column header; clicking it opens a popup of the column's\r\n * distinct values (checkbox list + optional search) to filter the grid. The app uses essentially\r\n * one shape: `[search]=\"{ enabled: true }\" [visible]=\"true\"` (60 files). Legacy `[allowSearch]`\r\n * (1×) folds into `search.enabled`.\r\n */\r\n@Component({\r\n selector: 'nxe-header-filter',\r\n standalone: true,\r\n template: '',\r\n host: { style: 'display: none' },\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class NxeHeaderFilterComponent {\r\n readonly visible = input(true);\r\n readonly search = input<{ enabled?: boolean } | undefined>(undefined);\r\n /** Legacy alias for `search.enabled` (one holdout). */\r\n readonly allowSearch = input<boolean | undefined>(undefined);\r\n /**\r\n * dx `headerFilter.dataSource` — a fixed `{ text, value }` list shown instead of the values\r\n * derived from the rows.\r\n */\r\n readonly dataSource = input<readonly { text?: string; value?: any }[] | undefined>(undefined);\r\n\r\n /** Whether the in-popup search box shows.\r\n *\r\n * Defaults to **true**, matching the legacy DevExtreme deployment: a popup listing every\r\n * distinct value in a column is close to unusable without one. 60 of the app's templates\r\n * already opt in explicitly, so this only changes the handful that never said either way —\r\n * and an explicit `[search]=\"{ enabled: false }\"` still turns it off. */\r\n searchEnabled(): boolean {\r\n return this.search()?.enabled ?? this.allowSearch() ?? true;\r\n }\r\n}\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n contentChild,\r\n contentChildren,\r\n input,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { NxeExpr } from '@nexterajs/ui/core';\r\nimport { NxeHeaderFilterComponent } from './nxe-header-filter.component';\r\nimport { NxeColumnDataType, NxeColumnFormat, NxeCustomizeText } from './nxe-grid.types';\r\n\r\n/**\r\n * `nxe-column` — drop-in replacement for DevExtreme `dxi-column`.\r\n *\r\n * A no-render config element collected by the parent `nxe-data-grid` via `contentChildren`.\r\n * Carries the column's display/format/behaviour config as signals. Works inside `@for`/`@if`\r\n * with full property binding (column sets are computed at render time; `dataField`/`caption`\r\n * are sometimes expressions). There are no command-button columns or `calculate*` options here.\r\n */\r\n@Component({\r\n selector: 'nxe-column',\r\n standalone: true,\r\n template: '',\r\n host: { style: 'display: none' },\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class NxeColumnComponent {\r\n readonly caption = input<string>('');\r\n /** Bound row field (supports dotted paths and bound/ternary expressions). */\r\n readonly dataField = input<string>('');\r\n /**\r\n * Unset = dx: inferred from the loaded data (m_columns_controller.js:914-975), so a numeric\r\n * column nobody typed still right-aligns and honours its `format`. Declaring it wins.\r\n */\r\n readonly dataType = input<NxeColumnDataType | undefined>(undefined);\r\n /** px width — number (`[width]=\"150\"`) or numeric string (`width=\"200\"`). */\r\n readonly width = input<number | string | undefined>(undefined);\r\n readonly minWidth = input<number | string | undefined>(undefined);\r\n readonly alignment = input<'left' | 'center' | 'right' | undefined>(undefined);\r\n /** Number-mask string (`#,##0.00`), date format string, or `{ type: 'dd MMM yyyy' }`. */\r\n readonly format = input<NxeColumnFormat | undefined>(undefined);\r\n /** `(info:{value}) => string` (e.g. `formatAccounting` for parenthesized negatives). */\r\n readonly customizeText = input<NxeCustomizeText | undefined>(undefined);\r\n /** Name of a sibling `<ng-template nxeTemplate=\"...\">` to render the cell. */\r\n readonly cellTemplate = input<string | undefined>(undefined);\r\n /**\r\n * DevExtreme column `lookup` (orbit addition): raw values resolve to display text through\r\n * `dataSource` (`{ lookup: { dataSource, valueExpr: 'lovCode', displayExpr: 'lovName' } }`).\r\n * Inline cell editing renders a `<select>` over the same list.\r\n */\r\n readonly lookup = input<\r\n { dataSource: readonly any[]; valueExpr?: NxeExpr; displayExpr?: NxeExpr } | undefined\r\n >(undefined);\r\n\r\n readonly allowSorting = input(true);\r\n /** dx parity: whether the header can be dragged into the group panel (default true). */\r\n readonly allowGrouping = input(true);\r\n /** dx parity: whether this column shows a resize handle when the grid allows resizing. */\r\n readonly allowResizing = input(true);\r\n readonly allowFiltering = input(true);\r\n readonly allowEditing = input(true);\r\n readonly allowExporting = input(true);\r\n readonly allowSearch = input(true);\r\n readonly allowHeaderFiltering = input(true);\r\n readonly visible = input(true);\r\n\r\n readonly sortOrder = input<'asc' | 'desc' | undefined>(undefined);\r\n readonly sortIndex = input<number | undefined>(undefined);\r\n readonly groupIndex = input<number | undefined>(undefined);\r\n readonly fixed = input(false);\r\n readonly filterValues = input<any[] | undefined>(undefined);\r\n /** Column `type` (only `type=\"date\"` seen — a display hint, NOT a command column). */\r\n readonly type = input<string | undefined>(undefined);\r\n /**\r\n * dx `cssClass` — extra classes on this column's header, filter and data cells. The escape\r\n * hatch for one-off cell styling that does not warrant a `cellTemplate`.\r\n */\r\n readonly cssClass = input<string | undefined>(undefined);\r\n /**\r\n * dx `editCellTemplate` — the sibling `<ng-template nxeTemplate=\"NAME\">` rendered while this\r\n * cell is being edited, in place of the built-in editor. Its context is a\r\n * {@link NxeEditCellInfo}, whose `data` is the live row: a template that assigns\r\n * `ctx.data.field = $event` writes straight through, which is how dx's own edit templates\r\n * were used.\r\n */\r\n readonly editCellTemplate = input<string | undefined>(undefined);\r\n /**\r\n * dx `groupCellTemplate` — replaces the `\"Caption: value\"` text in a group row's caption\r\n * cell when this column is the one grouped by.\r\n */\r\n readonly groupCellTemplate = input<string | undefined>(undefined);\r\n\r\n /**\r\n * Child columns declared inside this one — dx's banded header. Empty for an ordinary column.\r\n *\r\n * `descendants: false` is explicit rather than relied upon: a band's grandchildren belong to\r\n * its children, and flattening them here would collapse the very nesting the band expresses.\r\n */\r\n readonly childColumns = contentChildren(NxeColumnComponent, { descendants: false });\r\n\r\n /**\r\n * A `<nxe-header-filter>` declared inside this column, dx's per-column `headerFilter`\r\n * config. Only its `dataSource` is read here; visibility and search stay grid-level.\r\n */\r\n readonly headerFilterConfig = contentChild(NxeHeaderFilterComponent);\r\n\r\n /** dx `isBand`: a column that groups other columns under a shared header instead of a field. */\r\n readonly isBand = computed(() => this.childColumns().length > 0);\r\n}\r\n","import { ChangeDetectionStrategy, Component, input, ViewEncapsulation } from '@angular/core';\r\n\r\n/**\r\n * `nxe-selection` — drop-in replacement for DevExtreme `dxo-selection` (grid child option).\r\n *\r\n * A no-render config element collected by `nxe-data-grid` via `contentChild`. The app only uses\r\n * `mode` (\"single\" ×17 / \"multiple\" ×14, plain string attrs), `selectAllMode=\"page\"`,\r\n * `showCheckBoxesMode` (\"always\" ×11 shows the checkbox column; \"false\"/\"none\" hide it →\r\n * selection by row click). `recursive` is tree-list-only (ignored here).\r\n */\r\n@Component({\r\n selector: 'nxe-selection',\r\n standalone: true,\r\n template: '',\r\n host: { style: 'display: none' },\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class NxeSelectionComponent {\r\n readonly mode = input<'single' | 'multiple' | 'none'>('single');\r\n readonly selectAllMode = input<'page' | 'allPages'>('page');\r\n /** \"always\" shows the checkbox column; anything else (\"false\"/\"none\"/\"onClick\") hides it. */\r\n readonly showCheckBoxesMode = input<string>('onClick');\r\n readonly recursive = input(false);\r\n /** dx parity: row-body clicks toggle selection even when checkboxes are shown. */\r\n readonly selectByClick = input(false);\r\n}\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\nimport { computed, signal } from '@angular/core';\r\nimport { parseDateValue } from '@nexterajs/ui/intl';\r\n\r\n/**\r\n * Header-filter state model — the draft/apply/search machinery extracted from\r\n * `nxe-data-grid` (pivot parity Phase 3a) so the pivot's field panel can reuse it on pages\r\n * that have no data grid. Pure signals/computeds, no Angular DI, ZERO behavior change:\r\n * every computed/method body is a verbatim move from `nxe-data-grid.component.ts`.\r\n *\r\n * The model is generic over the column type `C` (the grid passes `NxeColumnComponent`; the\r\n * pivot will pass its field descriptor) and reads rows/values through a\r\n * {@link NxeHeaderFilterSource} adapter, so it owns only the frozen semantics:\r\n * `(Blanks)` first, Yes/No boolean buckets, the date Year > Month > Day tree, dx search\r\n * scoping of (Select All), check-on-open, and \"everything checked = no filter\" on apply.\r\n * (Select All)'s indeterminate state ({@link NxeHeaderFilterModel.someChecked}) is derived\r\n * from the same draft and search scope, and changes none of these rules.\r\n */\r\n\r\n/**\r\n * Header-filter key for blank-ish values (`null`/`undefined`/`''`) — dx lists them as one\r\n * `(Blanks)` bucket, FIRST (bright audit). A symbol can never collide with data values.\r\n */\r\nexport const NXE_HF_BLANKS: unique symbol = Symbol('nxe-hf-blanks');\r\n\r\n/** A node of the date-column header-filter tree (dx: Year > Month > Day, bright audit). */\r\nexport interface NxeHfDateNode {\r\n label: string;\r\n key: string;\r\n children: NxeHfDateNode[];\r\n /** The draft-set entries this node covers (day keys, or the blanks sentinel). */\r\n leafKeys: any[];\r\n}\r\n\r\n/**\r\n * Normalizes a raw cell value to its header-filter key: blank-ish → the `(Blanks)` sentinel,\r\n * date columns → a `yyyy-MM-dd` day key (the tree's leaf unit), else the raw value.\r\n */\r\nexport function nxeHfKey(raw: any, isDate: boolean): any {\r\n if (raw == null || raw === '') {\r\n return NXE_HF_BLANKS;\r\n }\r\n if (isDate) {\r\n const dt = parseDateValue(raw);\r\n return dt ? dt.toFormat('yyyy-MM-dd') : String(raw);\r\n }\r\n return raw;\r\n}\r\n\r\n/** How the model reads rows and column values — the host (grid, pivot) supplies these. */\r\nexport interface NxeHeaderFilterSource<C> {\r\n /** The rows the value list is built from. dx does NOT cascade header-filter lists for\r\n client arrays (bright audit V6) — the grid passes its FULL dataSource here. */\r\n rows(): readonly any[];\r\n /** Raw cell value of a row for this column (dotted-path aware on the grid). */\r\n rawValue(column: C, row: any): any;\r\n /** Formatted display text for a row — used for non-blank, non-boolean-bucket items. */\r\n displayText(column: C, row: any): string;\r\n /** Date column → values bucket into the Year > Month > Day tree. */\r\n isDate(column: C): boolean;\r\n /** dx sorts lookup columns by display text, everything else by raw value. */\r\n sortByDisplayText(column: C): boolean;\r\n /** dx boolean buckets label Yes/No (Yes first); `null` = not a boolean bucket. */\r\n boolLabel(column: C, raw: any): 'Yes' | 'No' | null;\r\n /** Raw-value comparator (numbers numeric, dates by instant, else locale strings). */\r\n compare(a: any, b: any): number;\r\n /**\r\n * dx `headerFilter.dataSource` on a column: a fixed `{ text, value }` list replacing the\r\n * values derived from the rows. Returning `null` (the default) keeps the derived list.\r\n *\r\n * A fixed list is used verbatim — declared order, no `(Blanks)` sentinel, and values that\r\n * never occur in the data still listed. That is dx's behaviour and the point of supplying\r\n * one: a boolean column whose rows are all `true` should still offer \"No\".\r\n */\r\n fixedItems?(column: C): { key: any; text: string }[] | null;\r\n}\r\n\r\nexport class NxeHeaderFilterModel<C = unknown> {\r\n private static readonly MONTH_NAMES = [\r\n 'January', 'February', 'March', 'April', 'May', 'June',\r\n 'July', 'August', 'September', 'October', 'November', 'December',\r\n ];\r\n\r\n /** The column whose popup is open (`null` = closed). */\r\n readonly column = signal<C | null>(null);\r\n /** The checked key set being edited in the popup (committed by the host on OK). */\r\n readonly draft = signal<ReadonlySet<any>>(new Set());\r\n readonly search = signal('');\r\n readonly expanded = signal<ReadonlySet<string>>(new Set());\r\n\r\n constructor(private readonly source: NxeHeaderFilterSource<C>) {}\r\n\r\n /** This column's header-filter key for a raw value. */\r\n key(column: C, raw: any): any {\r\n return nxeHfKey(raw, this.source.isDate(column));\r\n }\r\n\r\n /** Distinct {key, text} for the open column — `(Blanks)` first, then Yes/No or values ascending. */\r\n readonly distinct = computed<{ key: any; text: string }[]>(() => {\r\n const col = this.column();\r\n if (!col) {\r\n return [];\r\n }\r\n const fixed = this.source.fixedItems?.(col);\r\n if (fixed) {\r\n return fixed;\r\n }\r\n const seen = new Map<any, { key: any; text: string; raw: any }>();\r\n for (const row of this.source.rows()) {\r\n const raw = this.source.rawValue(col, row);\r\n const key = this.key(col, raw);\r\n if (!seen.has(key)) {\r\n seen.set(key, {\r\n key,\r\n raw,\r\n text:\r\n key === NXE_HF_BLANKS\r\n ? '(Blanks)'\r\n : (this.source.boolLabel(col, raw) ?? this.source.displayText(col, row)),\r\n });\r\n }\r\n }\r\n // dx sorts lookup columns by display text, everything else by raw value.\r\n const byDisplay = this.source.sortByDisplayText(col);\r\n return [...seen.values()]\r\n .sort((a, b) => {\r\n if (a.key === NXE_HF_BLANKS) {\r\n return -1;\r\n }\r\n if (b.key === NXE_HF_BLANKS) {\r\n return 1;\r\n }\r\n const la = this.source.boolLabel(col, a.raw);\r\n const lb = this.source.boolLabel(col, b.raw);\r\n if (la && lb) {\r\n return la === lb ? 0 : la === 'Yes' ? -1 : 1;\r\n }\r\n return byDisplay ? a.text.localeCompare(b.text) : this.source.compare(a.raw, b.raw);\r\n })\r\n .map(({ key, text }) => ({ key, text }));\r\n });\r\n\r\n readonly distinctFiltered = computed(() => {\r\n const q = this.search().trim().toLowerCase();\r\n return q ? this.distinct().filter((d) => d.text.toLowerCase().includes(q)) : this.distinct();\r\n });\r\n\r\n // --- Date-column header filter: Year > Month > Day tree (dx groupInterval default) ----------\r\n readonly isDate = computed(() => {\r\n const col = this.column();\r\n return !!col && this.source.isDate(col);\r\n });\r\n\r\n readonly dateTree = computed<NxeHfDateNode[]>(() => {\r\n const col = this.column();\r\n if (!col || !this.source.isDate(col)) {\r\n return [];\r\n }\r\n const days = new Set<string>();\r\n const unparseable = new Map<string, any>();\r\n let hasBlanks = false;\r\n for (const row of this.source.rows()) {\r\n const key = this.key(col, this.source.rawValue(col, row));\r\n if (key === NXE_HF_BLANKS) {\r\n hasBlanks = true;\r\n } else if (typeof key === 'string' && /^\\d{4}-\\d{2}-\\d{2}$/.test(key)) {\r\n days.add(key);\r\n } else {\r\n // nxeHfKey's String(raw) fallback for unparseable dates — a flat leaf, not Y>M>D\r\n unparseable.set(String(key), key);\r\n }\r\n }\r\n const out: NxeHfDateNode[] = [];\r\n if (hasBlanks) {\r\n out.push({ label: '(Blanks)', key: 'blanks', children: [], leafKeys: [NXE_HF_BLANKS] });\r\n }\r\n const byYear = new Map<string, Map<number, string[]>>();\r\n for (const day of [...days].sort()) {\r\n const year = day.slice(0, 4);\r\n const month = Number(day.slice(5, 7));\r\n if (!byYear.has(year)) {\r\n byYear.set(year, new Map());\r\n }\r\n const months = byYear.get(year)!;\r\n if (!months.has(month)) {\r\n months.set(month, []);\r\n }\r\n months.get(month)!.push(day);\r\n }\r\n for (const [year, months] of byYear) {\r\n const monthNodes: NxeHfDateNode[] = [];\r\n for (const [month, dayKeys] of months) {\r\n monthNodes.push({\r\n label: NxeHeaderFilterModel.MONTH_NAMES[month - 1],\r\n key: `m:${year}-${month}`,\r\n children: dayKeys.map((d) => ({\r\n label: String(Number(d.slice(8, 10))),\r\n key: `d:${d}`,\r\n children: [],\r\n leafKeys: [d],\r\n })),\r\n leafKeys: dayKeys,\r\n });\r\n }\r\n out.push({\r\n label: year,\r\n key: `y:${year}`,\r\n children: monthNodes,\r\n leafKeys: monthNodes.flatMap((m) => m.leafKeys),\r\n });\r\n }\r\n for (const [label, key] of [...unparseable].sort((a, b) => a[0].localeCompare(b[0]))) {\r\n out.push({ label, key: `o:${label}`, children: [], leafKeys: [key] });\r\n }\r\n return out;\r\n });\r\n\r\n /**\r\n * Search prunes the tree dx-style: a node stays if its label matches or a descendant does;\r\n * a matched-label node with no matching descendants collapses to a leaf (keeps all its keys).\r\n */\r\n readonly dateTreeFiltered = computed<NxeHfDateNode[]>(() => {\r\n const q = this.search().trim().toLowerCase();\r\n if (!q) {\r\n return this.dateTree();\r\n }\r\n const prune = (nodes: NxeHfDateNode[]): NxeHfDateNode[] =>\r\n nodes\r\n .map((n) => {\r\n const kids = prune(n.children);\r\n if (kids.length) {\r\n return { ...n, children: kids, leafKeys: kids.flatMap((k) => k.leafKeys) };\r\n }\r\n if (n.label.toLowerCase().includes(q)) {\r\n return { ...n, children: [] };\r\n }\r\n return null;\r\n })\r\n .filter((n): n is NxeHfDateNode => !!n);\r\n return prune(this.dateTree());\r\n });\r\n\r\n toggleExpand(key: string): void {\r\n this.expanded.update((set) => {\r\n const next = new Set(set);\r\n next.has(key) ? next.delete(key) : next.add(key);\r\n return next;\r\n });\r\n }\r\n\r\n /** While searching every surviving branch shows expanded (dx auto-expands matches). */\r\n nodeExpanded(key: string): boolean {\r\n return this.search().trim() ? true : this.expanded().has(key);\r\n }\r\n\r\n nodeChecked(n: NxeHfDateNode): boolean {\r\n const draft = this.draft();\r\n return n.leafKeys.length > 0 && n.leafKeys.every((k) => draft.has(k));\r\n }\r\n\r\n nodeIndeterminate(n: NxeHfDateNode): boolean {\r\n const draft = this.draft();\r\n return !this.nodeChecked(n) && n.leafKeys.some((k) => draft.has(k));\r\n }\r\n\r\n toggleNode(n: NxeHfDateNode): void {\r\n const removing = this.nodeChecked(n);\r\n this.draft.update((set) => {\r\n const next = new Set(set);\r\n for (const k of n.leafKeys) {\r\n removing ? next.delete(k) : next.add(k);\r\n }\r\n return next;\r\n });\r\n }\r\n\r\n /** Every selectable key of the open column (tree leaves for dates, list keys otherwise). */\r\n readonly allKeys = computed<any[]>(() =>\r\n this.isDate()\r\n ? this.dateTree().flatMap((n) => n.leafKeys)\r\n : this.distinct().map((d) => d.key),\r\n );\r\n\r\n /** The keys currently shown in the popup — with a search active, only the matches. */\r\n readonly visibleKeys = computed<any[]>(() =>\r\n this.isDate()\r\n ? this.dateTreeFiltered().flatMap((n) => n.leafKeys)\r\n : this.distinctFiltered().map((d) => d.key),\r\n );\r\n\r\n /** (Select All) state/toggle operate on the VISIBLE keys (dx: search scopes Select All). */\r\n readonly allChecked = computed(() => {\r\n const all = this.visibleKeys();\r\n const draft = this.draft();\r\n return all.length > 0 && all.every((k) => draft.has(k));\r\n });\r\n\r\n /**\r\n * (Select All)'s third state: some visible keys checked, but not all. dx shows it as the\r\n * indeterminate square (the select-all dxCheckBox's `value: undefined`). It is never true\r\n * together with {@link allChecked}, so check-on-open, which checks everything when no filter\r\n * is applied, always opens on a fully checked box and never on a half-checked one.\r\n */\r\n readonly someChecked = computed(() => {\r\n if (this.allChecked()) {\r\n return false;\r\n }\r\n const draft = this.draft();\r\n return this.visibleKeys().some((k) => draft.has(k));\r\n });\r\n\r\n /** Whether every key of the whole column is checked — decides \"no filter\" on apply. */\r\n readonly fullChecked = computed(() => {\r\n const all = this.allKeys();\r\n const draft = this.draft();\r\n return all.length > 0 && all.every((k) => draft.has(k));\r\n });\r\n\r\n /**\r\n * Reset the popup state for `column` (check-on-open — FROZEN, see DEFAULTS.md):\r\n * no applied filter → everything checked; else start from the applied set.\r\n */\r\n open(column: C, applied: ReadonlySet<any> | undefined): void {\r\n this.column.set(column);\r\n this.search.set('');\r\n this.expanded.set(new Set());\r\n this.draft.set(applied ? new Set(applied) : new Set(this.allKeys()));\r\n }\r\n\r\n close(): void {\r\n this.column.set(null);\r\n }\r\n\r\n toggleValue(value: any): void {\r\n this.draft.update((set) => {\r\n const next = new Set(set);\r\n next.has(value) ? next.delete(value) : next.add(value);\r\n return next;\r\n });\r\n }\r\n\r\n toggleAll(): void {\r\n const visible = this.visibleKeys();\r\n const removing = this.allChecked();\r\n this.draft.update((set) => {\r\n const next = new Set(set);\r\n for (const k of visible) {\r\n removing ? next.delete(k) : next.add(k);\r\n }\r\n return next;\r\n });\r\n }\r\n\r\n /**\r\n * The set the host stores on OK: everything checked (or nothing to choose from) =\r\n * explicit \"no filter\" (`null` so a declarative seed can't resurrect); else the\r\n * allowed-key set (empty = empty grid).\r\n */\r\n applyResult(): ReadonlySet<any> | null {\r\n const clear = this.fullChecked() || this.allKeys().length === 0;\r\n return clear ? null : new Set(this.draft());\r\n }\r\n}\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\nimport { NgTemplateOutlet } from '@angular/common';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n ElementRef,\r\n input,\r\n output,\r\n viewChild,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { NxeHeaderFilterModel } from './nxe-header-filter.model';\r\n\r\n/**\r\n * The header-filter popup panel — the `.nxe-hf-*` chunk extracted from `nxe-data-grid`'s\r\n * template (pivot parity Phase 3a) so the pivot can open the same popup on pages with no\r\n * data grid. Same DOM, same FROZEN classes (`.nxe-hf-item`/`.nxe-hf-search`/… — DEFAULTS.md):\r\n * the host element carries `nxe-header-filter-menu nxe-hf-panel`, exactly where the old\r\n * template's root `<div>` sat inside the overlay pane. The dx-parity pass only added to that DOM:\r\n * the `input.nxe-hf-search` now sits in a `.nxe-hf-searchbox` with its magnifier and clear\r\n * button, and rows also carry `.nxe-hf-list-item` / `.nxe-hf-tree-item`.\r\n *\r\n * Renders whatever {@link NxeHeaderFilterModel} it is given — checkbox list or the date\r\n * Year > Month > Day tree — and emits `applied`/`cancelled` for the host to commit/close;\r\n * the panel itself never touches the host's filter state.\r\n */\r\n@Component({\r\n selector: 'nxe-header-filter-panel',\r\n standalone: true,\r\n imports: [NgTemplateOutlet],\r\n templateUrl: './nxe-header-filter-panel.component.html',\r\n styleUrl: './nxe-header-filter-panel.component.scss',\r\n host: { class: 'nxe-header-filter-menu nxe-hf-panel' },\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class NxeHeaderFilterPanelComponent {\r\n readonly model = input.required<NxeHeaderFilterModel<any>>();\r\n /** Live predicate (re-read every CD, like the grid template did) — a mid-open config\r\n change to `search.enabled` still shows/hides the box. */\r\n readonly searchEnabled = input<() => boolean>(() => true);\r\n /** OK — the host commits the draft and closes. */\r\n readonly applied = output<void>();\r\n /** Cancel — the host closes without committing. */\r\n readonly cancelled = output<void>();\r\n\r\n private readonly searchInput = viewChild<ElementRef<HTMLInputElement>>('searchInput');\r\n\r\n protected showSearch(): boolean {\r\n return this.searchEnabled()();\r\n }\r\n\r\n /** The search box's clear button (dx search mode forces `showClearButton`): empties the\r\n search and keeps the caret in the box, as dx's clear does. */\r\n protected clearSearch(): void {\r\n this.model().search.set('');\r\n this.searchInput()?.nativeElement.focus();\r\n }\r\n}\r\n","@if (showSearch()) {\r\n <!-- dx builds this as a dxTextBox in mode 'search' (the list/tree searchEnabled option), which\r\n forces showClearButton: a magnifier in a 34px slot inside the left border, and a clear\r\n button in a 34px area inside the right border that only exists while there is text to\r\n clear. Both glyphs are drawn here from primitives; the DXIcons font is not used. -->\r\n <div class=\"nxe-hf-searchbox\">\r\n <!-- The magnifier both search boxes share (dx draws them with one rule,\r\n .dx-searchbox .dx-icon-search): a r4.75 ring and a 45deg handle, 1.9px strokes. Keep\r\n it identical to the tree view's (nxe-tree-view.component.html). -->\r\n <svg class=\"nxe-hf-search-icon\" viewBox=\"0 0 34 34\" aria-hidden=\"true\" focusable=\"false\">\r\n <circle cx=\"15\" cy=\"15\" r=\"4.75\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\" />\r\n <path d=\"M18.5 18.5 23.5 23.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\" />\r\n </svg>\r\n <input\r\n #searchInput\r\n class=\"nxe-hf-search\"\r\n type=\"text\"\r\n placeholder=\"Search\"\r\n aria-label=\"Search\"\r\n [value]=\"model().search()\"\r\n (input)=\"model().search.set($any($event.target).value)\" />\r\n @if (model().search()) {\r\n <button\r\n class=\"nxe-hf-search-clear\"\r\n type=\"button\"\r\n tabindex=\"-1\"\r\n aria-label=\"Clear\"\r\n (mousedown)=\"$event.preventDefault()\"\r\n (click)=\"clearSearch()\">\r\n <!-- The editors' clear glyph: a 16px disc with a 2px x cut out, two 2px bars\r\n each running corner to corner of the 8px square centred on the disc, drawn as\r\n a plus and turned 45deg. -->\r\n <svg viewBox=\"0 0 18 18\" aria-hidden=\"true\" focusable=\"false\">\r\n <path\r\n fill=\"currentColor\"\r\n fill-rule=\"evenodd\"\r\n transform=\"rotate(45 9 9)\"\r\n d=\"M9 1a8 8 0 1 1 0 16A8 8 0 1 1 9 1ZM8 3.343h2V8h4.657v2H10v4.657H8V10H3.343V8H8Z\" />\r\n </svg>\r\n </button>\r\n }\r\n </div>\r\n}\r\n<div class=\"nxe-hf-list\" [class.nxe-hf-tree]=\"model().isDate()\">\r\n <label class=\"nxe-hf-item nxe-hf-selectall\">\r\n <input\r\n type=\"checkbox\"\r\n [checked]=\"model().allChecked()\"\r\n [indeterminate]=\"model().someChecked()\"\r\n (change)=\"model().toggleAll()\" />\r\n <span>Select All</span>\r\n </label>\r\n @if (model().isDate()) {\r\n <!-- dx date header filter: Year > Month > Day checkbox tree -->\r\n <ng-container\r\n [ngTemplateOutlet]=\"hfTreeNodes\"\r\n [ngTemplateOutletContext]=\"{ $implicit: model().dateTreeFiltered() }\" />\r\n } @else {\r\n @for (item of model().distinctFiltered(); track item.key) {\r\n <label class=\"nxe-hf-item nxe-hf-list-item\">\r\n <input\r\n type=\"checkbox\"\r\n [checked]=\"model().draft().has(item.key)\"\r\n (change)=\"model().toggleValue(item.key)\" />\r\n <span>{{ item.text }}</span>\r\n </label>\r\n }\r\n }\r\n</div>\r\n<div class=\"nxe-hf-actions\">\r\n <button type=\"button\" class=\"nxe-hf-btn nxe-hf-ok\" (click)=\"applied.emit()\">OK</button>\r\n <button type=\"button\" class=\"nxe-hf-btn\" (click)=\"cancelled.emit()\">Cancel</button>\r\n</div>\r\n\r\n<!-- Recursive date-tree nodes for the header-filter popup. Each node's first grid row is dx's\r\n .dx-treeview-item: the toggle (or its stub) and the label share it, the label spanning the\r\n whole row so its hover paints the full row, as dx's does. -->\r\n<ng-template #hfTreeNodes let-nodes>\r\n @for (n of nodes; track n.key) {\r\n <div class=\"nxe-hf-tree-node\">\r\n @if (n.children.length) {\r\n <span\r\n class=\"nxe-hf-tree-toggle\"\r\n [class.nxe-expanded]=\"model().nodeExpanded(n.key)\"\r\n (click)=\"model().toggleExpand(n.key)\"></span>\r\n } @else {\r\n <span class=\"nxe-hf-tree-toggle-stub\"></span>\r\n }\r\n <label class=\"nxe-hf-item nxe-hf-tree-item\">\r\n <input\r\n type=\"checkbox\"\r\n [checked]=\"model().nodeChecked(n)\"\r\n [indeterminate]=\"model().nodeIndeterminate(n)\"\r\n (change)=\"model().toggleNode(n)\" />\r\n <span>{{ n.label }}</span>\r\n </label>\r\n @if (n.children.length && model().nodeExpanded(n.key)) {\r\n <div class=\"nxe-hf-tree-children\">\r\n <ng-container\r\n [ngTemplateOutlet]=\"hfTreeNodes\"\r\n [ngTemplateOutletContext]=\"{ $implicit: n.children }\" />\r\n </div>\r\n }\r\n </div>\r\n }\r\n</ng-template>\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\nimport { Overlay, OverlayRef } from '@angular/cdk/overlay';\r\nimport { ComponentPortal } from '@angular/cdk/portal';\r\nimport { ViewContainerRef } from '@angular/core';\r\nimport { nxePane } from '@nexterajs/ui/styling';\r\nimport { NxeHeaderFilterModel } from './nxe-header-filter.model';\r\nimport { NxeHeaderFilterPanelComponent } from './nxe-header-filter-panel.component';\r\n\r\n/**\r\n * CDK overlay wiring for the header-filter popup — extracted from `nxe-data-grid` (pivot\r\n * parity Phase 3a) so any host (grid header funnel, pivot field panel) opens the identical\r\n * popup: dropped below the origin start-aligned (end-aligned fallback), repositioning on\r\n * scroll, closing on a transparent-backdrop click, pane carrying `nxePane('nxe-hf-pane')`\r\n * (the `.nxe-widget` font contract for body-level panes).\r\n */\r\nexport interface NxeHeaderFilterOverlayOptions {\r\n overlay: Overlay;\r\n /** Anchors the panel in the caller's injector AND change-detection tree — exactly what\r\n the grid's old `TemplatePortal(panel, viewContainerRef)` attachment did. */\r\n viewContainerRef: ViewContainerRef;\r\n /** The clicked funnel/trigger element the panel connects to. */\r\n origin: HTMLElement;\r\n model: NxeHeaderFilterModel<any>;\r\n /** Live predicate for the in-popup search box (re-read every CD). */\r\n searchEnabled: () => boolean;\r\n /** OK — commit the draft and close (the host disposes/detaches the returned ref). */\r\n onApply: () => void;\r\n /** Cancel button or backdrop click — close without committing. */\r\n onClose: () => void;\r\n}\r\n\r\n/** Create + attach the header-filter popup; the caller keeps the ref to detach/dispose. */\r\nexport function openNxeHeaderFilterOverlay(options: NxeHeaderFilterOverlayOptions): OverlayRef {\r\n const overlayRef = options.overlay.create({\r\n positionStrategy: options.overlay\r\n .position()\r\n .flexibleConnectedTo(options.origin)\r\n .withPositions([\r\n { originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top' },\r\n { originX: 'end', originY: 'bottom', overlayX: 'end', overlayY: 'top' },\r\n ]),\r\n scrollStrategy: options.overlay.scrollStrategies.reposition(),\r\n hasBackdrop: true,\r\n backdropClass: 'cdk-overlay-transparent-backdrop',\r\n panelClass: nxePane('nxe-hf-pane'),\r\n });\r\n overlayRef.backdropClick().subscribe(() => options.onClose());\r\n // Escape closes the filter menu (dx). This subscription is also what makes CDK deliver the\r\n // key here at all: OverlayKeyboardDispatcher dispatches to the topmost overlay that HAS a\r\n // keydown observer, so without it Escape fell through to whatever overlay sits underneath —\r\n // on the pivot that is the field chooser, which would close and strand this popup on a\r\n // detached anchor.\r\n overlayRef.keydownEvents().subscribe((event) => {\r\n if (event.key === 'Escape') {\r\n event.stopPropagation();\r\n options.onClose();\r\n }\r\n });\r\n const panelRef = overlayRef.attach(\r\n new ComponentPortal(NxeHeaderFilterPanelComponent, options.viewContainerRef),\r\n );\r\n panelRef.setInput('model', options.model);\r\n panelRef.setInput('searchEnabled', options.searchEnabled);\r\n panelRef.instance.applied.subscribe(() => options.onApply());\r\n panelRef.instance.cancelled.subscribe(() => options.onClose());\r\n return overlayRef;\r\n}\r\n","import { ChangeDetectionStrategy, Component, input, ViewEncapsulation } from '@angular/core';\r\n\r\n/** `dxo-grouping` — only `[autoExpandAll]=\"true\"` is used (24 grids). */\r\n@Component({\r\n selector: 'nxe-grouping',\r\n standalone: true,\r\n template: '',\r\n host: { style: 'display: none' },\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class NxeGroupingComponent {\r\n readonly autoExpandAll = input(true);\r\n}\r\n\r\n/** `dxo-group-panel` — only `[visible]` is used (23 grids). */\r\n@Component({\r\n selector: 'nxe-group-panel',\r\n standalone: true,\r\n template: '',\r\n host: { style: 'display: none' },\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class NxeGroupPanelComponent {\r\n readonly visible = input<boolean | 'auto'>(false);\r\n}\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n contentChildren,\r\n Directive,\r\n input,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { NxeColumnFormat, NxeCustomizeText } from './nxe-grid.types';\r\n\r\n/** Structural shape the grid reads off a total/group summary item. */\r\nexport interface NxeSummaryItemLike {\r\n column(): string;\r\n summaryType(): 'sum' | 'count' | 'min' | 'max' | 'avg' | 'custom';\r\n name(): string | undefined;\r\n displayFormat(): string;\r\n customizeText(): NxeCustomizeText | undefined;\r\n valueFormat(): NxeColumnFormat | undefined;\r\n alignByColumn(): boolean;\r\n showInGroupFooter(): boolean;\r\n showInColumn(): string | undefined;\r\n}\r\n\r\n/** Shared base for total/group summary items. The app only uses `summaryType=\"sum\"`. */\r\n@Directive()\r\nabstract class NxeSummaryItemBase implements NxeSummaryItemLike {\r\n readonly column = input<string>('');\r\n readonly summaryType = input<'sum' | 'count' | 'min' | 'max' | 'avg' | 'custom'>('sum');\r\n /** Identifier passed to `calculateCustomSummary` for `summaryType='custom'` items. */\r\n readonly name = input<string | undefined>(undefined);\r\n /** Positional template; `{0}` is replaced by the customized/formatted value. */\r\n readonly displayFormat = input<string>('{0}');\r\n readonly customizeText = input<NxeCustomizeText | undefined>(undefined);\r\n readonly valueFormat = input<NxeColumnFormat | undefined>(undefined);\r\n readonly alignByColumn = input(false);\r\n /** Render this group aggregate in a footer row under the group instead of the group row. */\r\n readonly showInGroupFooter = input(false);\r\n readonly showInColumn = input<string | undefined>(undefined);\r\n}\r\n\r\n/** `dxi-total-item` — a grand-total footer aggregate. */\r\n@Component({\r\n selector: 'nxe-total-item',\r\n standalone: true,\r\n template: '',\r\n host: { style: 'display: none' },\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class NxeTotalItemComponent extends NxeSummaryItemBase {}\r\n\r\n/** `dxi-group-item` — a per-group footer aggregate. */\r\n@Component({\r\n selector: 'nxe-group-item',\r\n standalone: true,\r\n template: '',\r\n host: { style: 'display: none' },\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class NxeGroupItemComponent extends NxeSummaryItemBase {}\r\n\r\n/** `dxo-summary` — container collecting `nxe-total-item` / `nxe-group-item` children. */\r\n@Component({\r\n selector: 'nxe-summary',\r\n standalone: true,\r\n template: '<ng-content />',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class NxeSummaryComponent {\r\n /**\r\n * DevExtreme `calculateCustomSummary` (orbit addition): called with the dx protocol —\r\n * `{name, summaryProcess:'start'}`, then `'calculate'` once per row (`options.value` = the\r\n * row object), then `'finalize'`; the handler mutates `options.totalValue`.\r\n */\r\n readonly calculateCustomSummary = input<((options: any) => void) | undefined>(undefined);\r\n readonly totalItems = contentChildren(NxeTotalItemComponent);\r\n readonly groupItems = contentChildren(NxeGroupItemComponent);\r\n}\r\n","import { ChangeDetectionStrategy, Component, input, model, ViewEncapsulation } from '@angular/core';\r\n\r\n/** `dxo-paging` — internal client paging. Presence enables paging; `[pageSize]`/`[pageIndex]` used. */\r\n@Component({\r\n selector: 'nxe-paging',\r\n standalone: true,\r\n template: '',\r\n host: { style: 'display: none' },\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class NxePagingComponent {\r\n readonly pageSize = input<number>(20);\r\n /** Two-way: dx supports `[(pageIndex)]`, and a consumer drives the pager from outside with it. */\r\n readonly pageIndex = model<number>(0);\r\n readonly enabled = input<boolean>(true);\r\n}\r\n\r\n/** `dxo-pager` — the pager UI config. */\r\n@Component({\r\n selector: 'nxe-pager',\r\n standalone: true,\r\n template: '',\r\n host: { style: 'display: none' },\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class NxePagerComponent {\r\n /** `'auto'` shows the pager only when there is more than one page (dx `isVisible`). */\r\n readonly visible = input<boolean | 'auto'>('auto');\r\n /** `'auto'` offers half, the same and double the page size (dx `getPageSizes`). */\r\n readonly allowedPageSizes = input<number[] | 'auto'>('auto');\r\n readonly showPageSizeSelector = input(false);\r\n readonly showNavigationButtons = input(false);\r\n readonly showInfo = input(false);\r\n /**\r\n * `'full'` and `'adaptive'` list the page sizes as buttons; `'compact'` uses a drop-down and\r\n * always shows the navigation buttons, as dx's small mode does.\r\n */\r\n readonly displayMode = input<'adaptive' | 'compact' | 'full'>('adaptive');\r\n /** dx `pager.infoText`: `{0}` the page, `{1}` the page count, `{2}` the item count. */\r\n readonly infoText = input<string | undefined>(undefined);\r\n /** dx `pager.label`: the pager's accessible name. */\r\n readonly label = input<string>('Page navigation');\r\n}\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\nimport { ChangeDetectionStrategy, Component, input, model, ViewEncapsulation } from '@angular/core';\r\n\r\n/** A tracked inline change (matches the app's local `Change<T>` shape). */\r\nexport interface NxeGridChange<T = any> {\r\n type: 'insert' | 'update' | 'remove';\r\n key: any;\r\n data: Partial<T>;\r\n}\r\n\r\n/**\r\n * `dxo-editing` — inline editing config. In this app editing is almost always template-driven\r\n * (cell templates host `nxe-*` editors two-way-bound to `key.data.<field>`), so `mode=\"cell\"` +\r\n * `allowUpdating` are effectively decorative there. `mode=\"row\"` with `[(changes)]`/`[(editRowKey)]`\r\n * (autonumber-detail) and native cell editors (job-upsert) drive the grid's native inline editing.\r\n */\r\n@Component({\r\n selector: 'nxe-editing',\r\n standalone: true,\r\n template: '',\r\n host: { style: 'display: none' },\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class NxeEditingComponent {\r\n readonly mode = input<'cell' | 'row' | 'batch'>('cell');\r\n readonly allowUpdating = input(false);\r\n readonly allowAdding = input(false);\r\n readonly allowDeleting = input(false);\r\n /** Two-way tracked changes (autonumber-detail's `Change<T>[]`). */\r\n readonly changes = model<NxeGridChange[]>([]);\r\n /** Two-way key of the row currently in edit mode (row mode). */\r\n readonly editRowKey = model<any>(null);\r\n}\r\n","import { ChangeDetectionStrategy, Component, input, ViewEncapsulation } from '@angular/core';\r\n\r\n/**\r\n * `nxe-filter-row` — drop-in for DevExtreme `dxo-filter-row` (orbit addition; psak expressed\r\n * the same config through the grid's `[filterRow]` object input, which remains supported).\r\n * A no-render config element read by the parent `nxe-data-grid`.\r\n */\r\n@Component({\r\n selector: 'nxe-filter-row',\r\n standalone: true,\r\n template: '',\r\n host: { style: 'display: none' },\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class NxeFilterRowComponent {\r\n readonly visible = input(false);\r\n /** DevExtreme parity (`auto`/`onClick`); the nxe filter row always applies on input. */\r\n readonly applyFilter = input<string | undefined>(undefined);\r\n}\r\n","import { ChangeDetectionStrategy, Component, input, ViewEncapsulation } from '@angular/core';\r\n\r\n/**\r\n * `nxe-master-detail` — drop-in for DevExtreme `dxo-master-detail` (orbit addition).\r\n *\r\n * A no-render config element read by the parent `nxe-data-grid`. When `enabled`, the grid\r\n * prepends a `nxe-command-expand` column; expanding a row renders a\r\n * `<tr class=\"nxe-master-detail-row\">` hosting the named sibling\r\n * `<ng-template nxeTemplate=\"...\">` with `{ data, rowIndex, key }` — instantiated ONLY while\r\n * expanded, preserving the app's lazy nested-grid loading (`onRowExpanding` fires first).\r\n */\r\n@Component({\r\n selector: 'nxe-master-detail',\r\n standalone: true,\r\n template: '',\r\n host: { style: 'display: none' },\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class NxeMasterDetailComponent {\r\n readonly enabled = input(false);\r\n /** Name of the sibling `nxeTemplate` rendered as the detail section (default `detail`). */\r\n readonly template = input<string>('detail');\r\n}\r\n","import { ChangeDetectionStrategy, Component, input, ViewEncapsulation } from '@angular/core';\r\n\r\n/**\r\n * `dxo-scrolling` — accepted for parity.\r\n *\r\n * Grid: the only usage is `rowRenderingMode=\"virtual\"` (ledger-list), which renders only\r\n * visible rows but loads all data; nxe-data-grid renders all rows (datasets are small\r\n * enough), so it stays a no-op config there.\r\n *\r\n * Pivot (LIVE since W4 Lane 3): `NxePivotGridComponent` contentChild's this and\r\n * `mode: 'virtual'` arms ROW WINDOWING — for `rowHeaderLayout: 'tree'` ONLY (the standard\r\n * layout's rowspan-merged parent labels conflict with row slicing; DEFAULTS.md). Render-only:\r\n * fixed 31px row pitch, spacer rows keep the scrollbar honest, and the model/export/chart\r\n * always see every row. The DA page projects `mode=\"virtual\"` but renders the standard\r\n * layout → no-op there, dx-consistent with its pane-based virtual scrolling being a render\r\n * optimization, never a data change.\r\n */\r\n@Component({\r\n selector: 'nxe-scrolling',\r\n standalone: true,\r\n template: '',\r\n host: { style: 'display: none' },\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class NxeScrollingComponent {\r\n readonly mode = input<'standard' | 'virtual' | 'infinite'>('standard');\r\n readonly rowRenderingMode = input<'standard' | 'virtual'>('standard');\r\n}\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\nimport { Workbook } from '@nexterajs/ui/excel';\r\nimport { nxeSaveAs } from '@nexterajs/ui/excel';\r\nimport { parseDateValue } from '@nexterajs/ui/intl';\r\nimport { nxeDatePattern, nxeExcelNumberMask, nxeNumberValue } from './nxe-format.util';\r\nimport { NxeExportColumn, NxeGridInstance } from './nxe-grid.types';\r\n\r\nexport interface NxeExcelExportOptions {\r\n /** File name (`.xlsx` appended if missing). */\r\n fileName: string;\r\n sheetName?: string;\r\n /** Default true — sets the sheet auto-filter over the header range. */\r\n autoFilter?: boolean;\r\n /** Default true — defaults every cell font to 'Calibri Light' (form-report passes false). */\r\n applyFont?: boolean;\r\n}\r\n\r\nfunction getRaw(row: any, field: string): any {\r\n if (!field || row == null) {\r\n return undefined;\r\n }\r\n return field.includes('.') ? field.split('.').reduce((o: any, k) => o?.[k], row) : row[field];\r\n}\r\n\r\n/** A cell's exceljs value + optional number format. */\r\nfunction cellValue(row: any, col: NxeExportColumn): { value: any; numFmt?: string } {\r\n const raw = getRaw(row, col.dataField);\r\n if (raw == null || raw === '') {\r\n return { value: '' };\r\n }\r\n switch (col.dataType) {\r\n case 'number': {\r\n // The same parseFloat deserializer the cell display uses, so a cell exports the number\r\n // it shows. dx exports that raw number too (exceljs/export.js:207-221).\r\n const num = nxeNumberValue(raw);\r\n if (isNaN(num)) {\r\n return { value: String(raw) };\r\n }\r\n // dx number masks ≈ exceljs numFmt, minus the scaling commas Excel reads differently.\r\n const mask = typeof col.format === 'string' ? nxeExcelNumberMask(col.format) : undefined;\r\n return { value: num, numFmt: mask };\r\n }\r\n case 'date': {\r\n const dt = parseDateValue(raw);\r\n if (!dt) {\r\n return { value: String(raw) };\r\n }\r\n // exceljs date codes are lowercase (dd mmm yyyy hh:mm).\r\n return { value: dt.toJSDate(), numFmt: nxeDatePattern(col.format).toLowerCase() };\r\n }\r\n case 'boolean':\r\n return { value: raw ? 'true' : 'false' };\r\n default:\r\n return { value: String(raw) };\r\n }\r\n}\r\n\r\n/**\r\n * Replacement for DevExtreme's `exportDataGrid({component, worksheet, autoFilterEnabled})`.\r\n * Walks an {@link NxeGridInstance}'s currently-visible columns + filtered/sorted rows into an\r\n * exceljs sheet (header row + autofilter + per-column numFmt), defaults the font to 'Calibri\r\n * Light' (preserving the app's `formatExcel`), and saves via `nxeSaveAs` — matching the prior\r\n * `report.helper.exportExcel` pipeline.\r\n */\r\nexport async function exportNxeGridToExcel(\r\n grid: NxeGridInstance,\r\n opts: NxeExcelExportOptions,\r\n): Promise<void> {\r\n const workbook = new Workbook();\r\n const ws = workbook.addWorksheet(opts.sheetName);\r\n const cols = grid.getVisibleColumns();\r\n const rows = grid.getVisibleRows();\r\n\r\n ws.addRow(cols.map((c) => c.caption));\r\n for (const row of rows) {\r\n const cells = cols.map((c) => cellValue(row, c));\r\n const r = ws.addRow(cells.map((c) => c.value));\r\n cells.forEach((c, i) => {\r\n if (c.numFmt) {\r\n r.getCell(i + 1).numFmt = c.numFmt;\r\n }\r\n });\r\n }\r\n if (opts.autoFilter !== false && cols.length > 0) {\r\n ws.autoFilter = { from: { row: 1, column: 1 }, to: { row: 1, column: cols.length } };\r\n }\r\n if (opts.applyFont !== false) {\r\n ws.eachRow((row) =>\r\n row.eachCell((cell) => {\r\n if (!cell.font?.name) {\r\n cell.font = Object.assign(cell.font || {}, { name: 'Calibri Light' });\r\n }\r\n }),\r\n );\r\n }\r\n const buffer = await workbook.xlsx.writeBuffer();\r\n const fileName = opts.fileName.endsWith('.xlsx') ? opts.fileName : `${opts.fileName}.xlsx`;\r\n nxeSaveAs(new Blob([buffer], { type: 'application/octet-stream' }), fileName);\r\n}\r\n\r\n/** Options for {@link exportDataGrid} — mirrors DevExtreme's worksheet-injection call form. */\r\nexport interface NxeExportDataGridOptions {\r\n component: NxeGridInstance;\r\n /**\r\n * Caller-supplied worksheet — exceljs `Worksheet` or the in-house one; typed loosely\r\n * because the two APIs are structural cousins, not the same declared type.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n worksheet: any;\r\n autoFilterEnabled?: boolean;\r\n}\r\n\r\n/**\r\n * Drop-in for DevExtreme's `exportDataGrid({component, worksheet, autoFilterEnabled})`\r\n * (orbit addition): writes the grid's visible columns + rows into the CALLER's worksheet —\r\n * the caller keeps ownership of the workbook, post-formatting, and saving\r\n * (`report.helper.exportExcel` pipeline).\r\n */\r\nexport async function exportDataGrid(opts: NxeExportDataGridOptions): Promise<void> {\r\n const ws = opts.worksheet;\r\n const cols = opts.component.getVisibleColumns();\r\n const rows = opts.component.getVisibleRows();\r\n\r\n ws.addRow(cols.map((c) => c.caption));\r\n for (const row of rows) {\r\n const cells = cols.map((c) => cellValue(row, c));\r\n const r = ws.addRow(cells.map((c) => c.value));\r\n cells.forEach((c, i) => {\r\n if (c.numFmt) {\r\n r.getCell(i + 1).numFmt = c.numFmt;\r\n }\r\n });\r\n }\r\n if (opts.autoFilterEnabled && cols.length > 0) {\r\n ws.autoFilter = { from: { row: 1, column: 1 }, to: { row: 1, column: cols.length } };\r\n }\r\n}\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\nimport { NgZone } from '@angular/core';\r\nimport { NxeGestureClickSuppression } from './nxe-grid-drag';\r\nimport { nxeHeaderLeafCells } from './nxe-grid-dom';\r\n\r\n/**\r\n * Pointer-based column-resize engine (dx `allowColumnResizing` parity).\r\n *\r\n * `widget` mode resizes only the dragged column — the table width follows; `nextColumn` (dx\r\n * default) trades width with the next visible column at constant table width; both clamp at\r\n * `columnMinWidth`. During the drag we write `<col>`/table widths directly (no change detection\r\n * per pointermove); the grid commits the final widths into its override signal on release —\r\n * freezing the layout exactly like dx does after the first manual resize.\r\n */\r\n\r\nexport interface NxeGridResizeHooks {\r\n zone: NgZone;\r\n host: () => HTMLElement;\r\n mode: () => 'nextColumn' | 'widget';\r\n minWidth: () => number;\r\n /** Drag started — the grid pauses its auto-width engine. */\r\n onStart: () => void;\r\n /** Escape/pointercancel — inline styles were restored, resume auto-width. */\r\n onCancel: () => void;\r\n /** Final widths per affected column; the grid freezes overrides and emits width events. */\r\n onCommit: (changes: { field: string; from: number; to: number }[]) => void;\r\n}\r\n\r\ninterface ActiveResize {\r\n field: string;\r\n nextField: string | null;\r\n /** The pointer that started the gesture — other pointers (second touch) are ignored. */\r\n pointerId: number;\r\n startX: number;\r\n startW: number;\r\n startNextW: number;\r\n colEl: HTMLTableColElement;\r\n nextColEl: HTMLTableColElement | null;\r\n tableEl: HTMLTableElement;\r\n startTableW: number;\r\n prevColStyle: string;\r\n prevNextStyle: string;\r\n prevTableStyle: string;\r\n lastW: number;\r\n lastNextW: number;\r\n}\r\n\r\nexport class NxeGridResizeController {\r\n private active: ActiveResize | null = null;\r\n private readonly suppression = new NxeGestureClickSuppression();\r\n\r\n private readonly onMove = (e: PointerEvent): void => this.pointerMove(e);\r\n private readonly onUp = (e: PointerEvent): void => {\r\n if (this.active && e.pointerId !== this.active.pointerId) {\r\n return;\r\n }\r\n this.pointerUp();\r\n };\r\n private readonly onCancelEv = (e: PointerEvent): void => {\r\n if (this.active && e.pointerId !== this.active.pointerId) {\r\n return;\r\n }\r\n this.cancel();\r\n };\r\n private readonly onKey = (e: KeyboardEvent): void => {\r\n if (e.key === 'Escape') {\r\n this.cancel();\r\n }\r\n };\r\n\r\n constructor(private readonly hooks: NxeGridResizeHooks) {}\r\n\r\n /** `visibleIndex`/`lead` locate the header cell + `<col>`; `nextField` only in nextColumn mode. */\r\n start(\r\n field: string,\r\n nextField: string | null,\r\n visibleIndex: number,\r\n lead: number,\r\n event: PointerEvent,\r\n ): void {\r\n if (event.button !== 0 || this.active) {\r\n return;\r\n }\r\n event.stopPropagation(); // the header td above would otherwise start a group drag\r\n event.preventDefault();\r\n const host = this.hooks.host();\r\n const table = host.querySelector<HTMLTableElement>('.nxe-datagrid-content > .nxe-datagrid-table');\r\n if (!table) {\r\n return;\r\n }\r\n const cols = Array.from(table.querySelectorAll<HTMLTableColElement>(':scope > colgroup > col'));\r\n // The colgroup still counts command columns, so it keeps the lead offset; the header\r\n // cells do not, because they are gathered by column rather than by cell position.\r\n const headerCells = nxeHeaderLeafCells(host);\r\n const colEl = cols[lead + visibleIndex];\r\n const cell = headerCells[visibleIndex];\r\n if (!colEl || !cell) {\r\n return;\r\n }\r\n const nextColEl = nextField != null ? cols[lead + visibleIndex + 1] ?? null : null;\r\n const nextCell = nextField != null ? headerCells[visibleIndex + 1] : null;\r\n this.active = {\r\n field,\r\n nextField,\r\n pointerId: event.pointerId,\r\n startX: event.clientX,\r\n startW: cell.getBoundingClientRect().width,\r\n startNextW: nextCell ? nextCell.getBoundingClientRect().width : 0,\r\n colEl,\r\n nextColEl,\r\n tableEl: table,\r\n startTableW: table.getBoundingClientRect().width,\r\n prevColStyle: colEl.style.width,\r\n prevNextStyle: nextColEl?.style.width ?? '',\r\n prevTableStyle: table.style.width,\r\n lastW: cell.getBoundingClientRect().width,\r\n lastNextW: nextCell ? nextCell.getBoundingClientRect().width : 0,\r\n };\r\n this.hooks.onStart();\r\n document.body.classList.add('nxe-grid-resizing');\r\n this.hooks.zone.runOutsideAngular(() => {\r\n document.addEventListener('pointermove', this.onMove);\r\n document.addEventListener('pointerup', this.onUp);\r\n document.addEventListener('pointercancel', this.onCancelEv);\r\n document.addEventListener('keydown', this.onKey);\r\n });\r\n }\r\n\r\n consumeClick(): boolean {\r\n return this.suppression.consume();\r\n }\r\n\r\n destroy(): void {\r\n if (this.active) {\r\n this.cancel();\r\n }\r\n }\r\n\r\n private pointerMove(e: PointerEvent): void {\r\n const a = this.active;\r\n if (!a || e.pointerId !== a.pointerId) {\r\n return;\r\n }\r\n const min = this.hooks.minWidth();\r\n const delta = e.clientX - a.startX;\r\n if (this.hooks.mode() === 'widget' || !a.nextColEl) {\r\n const w = Math.max(min, a.startW + delta);\r\n a.colEl.style.width = `${w}px`;\r\n a.tableEl.style.width = `${a.startTableW + (w - a.startW)}px`;\r\n a.lastW = w;\r\n return;\r\n }\r\n // nextColumn: trade with the neighbor, both clamped, table width constant.\r\n let w = Math.max(min, a.startW + delta);\r\n let next = a.startNextW - (w - a.startW);\r\n if (next < min) {\r\n next = min;\r\n w = a.startW + a.startNextW - min;\r\n }\r\n a.colEl.style.width = `${w}px`;\r\n a.nextColEl.style.width = `${next}px`;\r\n a.lastW = w;\r\n a.lastNextW = next;\r\n }\r\n\r\n private pointerUp(): void {\r\n const a = this.active;\r\n this.teardown();\r\n if (!a) {\r\n return;\r\n }\r\n this.suppression.arm();\r\n // A zero-movement release is a plain click on the handle — no freeze, no no-op event.\r\n if (a.lastW === a.startW && a.lastNextW === a.startNextW) {\r\n this.hooks.zone.run(() => this.hooks.onCancel());\r\n return;\r\n }\r\n const changes: { field: string; from: number; to: number }[] = [\r\n { field: a.field, from: a.startW, to: a.lastW },\r\n ];\r\n if (a.nextField && a.lastNextW !== a.startNextW) {\r\n changes.push({ field: a.nextField, from: a.startNextW, to: a.lastNextW });\r\n }\r\n this.hooks.zone.run(() => this.hooks.onCommit(changes));\r\n }\r\n\r\n private cancel(): void {\r\n const a = this.active;\r\n this.teardown();\r\n if (!a) {\r\n return;\r\n }\r\n this.suppression.arm();\r\n a.colEl.style.width = a.prevColStyle;\r\n if (a.nextColEl) {\r\n a.nextColEl.style.width = a.prevNextStyle;\r\n }\r\n a.tableEl.style.width = a.prevTableStyle;\r\n this.hooks.zone.run(() => this.hooks.onCancel());\r\n }\r\n\r\n private teardown(): void {\r\n this.active = null;\r\n document.body.classList.remove('nxe-grid-resizing');\r\n document.removeEventListener('pointermove', this.onMove);\r\n document.removeEventListener('pointerup', this.onUp);\r\n document.removeEventListener('pointercancel', this.onCancelEv);\r\n document.removeEventListener('keydown', this.onKey);\r\n }\r\n}\r\n","/**\r\n * The pager's page list and info text, as DevExtreme 24.2.3's pagination builds them.\r\n *\r\n * Pure functions, so the grid holds the only state (the sliding window, carried between renders\r\n * by a linkedSignal) and the rules can be specced without rendering a grid.\r\n */\r\n\r\n/** dx `maxPagesCount` (grid_core/pager/m_pager.js): up to this many pages are all listed. */\r\nexport const NXE_PAGER_MAX_PAGES = 10;\r\n/** dx `PAGES_LIMITER` (pagination/pages/large.js): the pages kept around the current one. */\r\nconst WINDOW = 4;\r\n\r\n/** dx's `dxPagination-infoText` message. */\r\nexport const NXE_PAGER_INFO_TEXT = 'Page {0} of {1} ({2} items)';\r\n\r\n/** One entry of the page list: a page button, or dx's `. . .` separator. */\r\nexport interface NxePagerItem {\r\n /** Stable track key: the page index, or `low` / `high` for the separators. */\r\n readonly key: string;\r\n /** 0-based page index; -1 for a separator. */\r\n readonly page: number;\r\n readonly separator: boolean;\r\n}\r\n\r\n/** The page list plus the sliding-window state dx keeps between renders. */\r\nexport interface NxePagerWindow {\r\n /** The four consecutive pages dx shows between the first and the last (empty until a slide). */\r\n readonly window: readonly number[];\r\n /** The pages of `window` a click can land on without the window moving. */\r\n readonly reuse: readonly number[];\r\n readonly items: readonly NxePagerItem[];\r\n}\r\n\r\nconst pageItem = (page: number): NxePagerItem => ({ key: String(page), page, separator: false });\r\nconst separatorItem = (key: 'low' | 'high'): NxePagerItem => ({ key, page: -1, separator: true });\r\n\r\n/**\r\n * The page list for `pageIndex` of `pageCount`, given the previous render's window.\r\n *\r\n * dx `PagesLarge` (pagination/pages/large.js). Ten pages or fewer are all listed. Beyond that the\r\n * list is the first page, a window of four, the last page, and a `. . .` separator wherever pages\r\n * are skipped. The window stays put while the new page is one of its inner pages (so clicking\r\n * through it does not scroll the numbers under the pointer), and otherwise moves so the page\r\n * lands one in from its edge.\r\n */\r\nexport function nxePagerWindow(pageCount: number, pageIndex: number, prev?: NxePagerWindow): NxePagerWindow {\r\n const slide = prev?.window ?? [];\r\n const reuse = prev?.reuse ?? [];\r\n if (pageCount <= NXE_PAGER_MAX_PAGES) {\r\n // dx leaves its window state untouched here, so it resumes if the count grows again.\r\n return { window: slide, reuse, items: Array.from({ length: pageCount }, (_, i) => pageItem(i)) };\r\n }\r\n const last = pageCount - 1;\r\n const reusable = reuse.length > 0 && reuse[reuse.length - 1] < last && reuse.includes(pageIndex);\r\n let next = slide;\r\n let nextReuse = reuse;\r\n if (!reusable) {\r\n let start: number;\r\n if (pageIndex === slide[0]) {\r\n start = pageIndex - 1;\r\n } else if (pageIndex === slide[slide.length - 1]) {\r\n start = pageIndex + 2 - WINDOW;\r\n } else if (pageIndex < WINDOW) {\r\n start = 1;\r\n } else if (pageIndex >= pageCount - WINDOW) {\r\n start = pageCount - WINDOW - 1;\r\n } else {\r\n start = pageIndex - 1;\r\n }\r\n // Only a window left over from a different page count can land outside 1..last-4; dx\r\n // would list pages that do not exist, so keep it inside the list.\r\n start = Math.min(Math.max(start, 1), pageCount - WINDOW - 1);\r\n next = Array.from({ length: WINDOW }, (_, i) => start + i);\r\n }\r\n const start = next[0];\r\n const kind = start === 1 ? 'high' : start + WINDOW === last ? 'low' : 'both';\r\n if (!reusable) {\r\n nextReuse = kind === 'both' ? next.slice(1, -1) : kind === 'high' ? next.slice(0, -1) : next.slice(1);\r\n }\r\n const items: NxePagerItem[] = [pageItem(0)];\r\n if (kind !== 'high') {\r\n items.push(separatorItem('low'));\r\n }\r\n items.push(...next.map(pageItem));\r\n if (kind !== 'low') {\r\n items.push(separatorItem('high'));\r\n }\r\n items.push(pageItem(last));\r\n return { window: next, reuse: nextReuse, items };\r\n}\r\n\r\n/**\r\n * dx's info text: `{0}` is the 1-based page, `{1}` the page count and `{2}` the item count\r\n * (pagination/info.js, formatted by core/utils/string `format`).\r\n */\r\nexport function nxePagerInfoText(\r\n template: string,\r\n pageIndex: number,\r\n pageCount: number,\r\n itemCount: number,\r\n): string {\r\n const values = [String(pageIndex + 1), String(pageCount), String(itemCount)];\r\n return template.replace(/\\{(\\d+)\\}/g, (match, i: string) => values[Number(i)] ?? match);\r\n}\r\n\r\n/**\r\n * dx `getPageSizes` (grid_core/pager/m_pager.js): an explicit list as given; `'auto'` offers half,\r\n * the same and double the configured page size, and nothing when that size is 1 or less.\r\n */\r\nexport function nxePagerPageSizes(allowed: readonly number[] | 'auto' | undefined, pageSize: number): number[] {\r\n if (Array.isArray(allowed)) {\r\n return [...allowed];\r\n }\r\n return allowed === 'auto' && pageSize > 1 ? [Math.floor(pageSize / 2), pageSize, 2 * pageSize] : [];\r\n}\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\nimport { Overlay, OverlayRef } from '@angular/cdk/overlay';\r\nimport { TemplatePortal } from '@angular/cdk/portal';\r\nimport { NgTemplateOutlet } from '@angular/common';\r\nimport {\r\n afterNextRender,\r\n afterRenderEffect,\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n contentChild,\r\n contentChildren,\r\n DestroyRef,\r\n ElementRef,\r\n EventEmitter,\r\n inject,\r\n input,\r\n linkedSignal,\r\n model,\r\n NgZone,\r\n OnDestroy,\r\n output,\r\n Output,\r\n signal,\r\n TemplateRef,\r\n untracked,\r\n viewChild,\r\n ViewContainerRef,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport {\r\n NXE_DEFAULT_OPTIONS,\r\n nxeResolveExpr,\r\n nxeResolveText,\r\n NxeTemplateDirective,\r\n} from '@nexterajs/ui/core';\r\nimport { nxeHeaderLeafCells } from './nxe-grid-dom';\r\nimport { parseDateValue } from '@nexterajs/ui/intl';\r\nimport { formatNumber, NXE_NUMBER_SEPARATORS, parseNumberFormat } from '@nexterajs/ui/intl';\r\nimport { NxeColumnComponent } from './nxe-column.component';\r\nimport { NxeEditingComponent } from './nxe-editing.component';\r\nimport { nxeDefaultFormat, nxeValueDataType } from './nxe-format.util';\r\nimport { NxeGridDragController } from './nxe-grid-drag';\r\nimport { NxeGridResizeController } from './nxe-grid-resize';\r\nimport { NxeFilterRowComponent } from './nxe-filter-row.component';\r\nimport { NxeMasterDetailComponent } from './nxe-master-detail.component';\r\nimport { NxeGroupPanelComponent, NxeGroupingComponent } from './nxe-grouping.component';\r\nimport { NxeHeaderFilterComponent } from './nxe-header-filter.component';\r\nimport { openNxeHeaderFilterOverlay } from './nxe-header-filter-overlay';\r\nimport { NxeHeaderFilterModel, nxeHfKey } from './nxe-header-filter.model';\r\nimport { NxePagerComponent, NxePagingComponent } from './nxe-paging.component';\r\nimport { NXE_PAGER_INFO_TEXT, nxePagerInfoText, nxePagerPageSizes, NxePagerWindow, nxePagerWindow } from './nxe-pager.util';\r\nimport { NxeSelectionComponent } from './nxe-selection.component';\r\nimport { nxePane } from '@nexterajs/ui/styling';\r\nimport { NxeSummaryComponent, NxeSummaryItemLike } from './nxe-summary.component';\r\nimport {\r\n NxeCellInfo,\r\n NxeCellPreparedEvent,\r\n NxeColumnDataType,\r\n NxeEditCellInfo,\r\n NxeGroupCellInfo,\r\n NxeRowInfo,\r\n NxeRowPreparedEvent,\r\n NxeRowType,\r\n NxeGridInstance,\r\n NxeGridOptionChangedEvent,\r\n NxeGridSelectionChangedEvent,\r\n} from './nxe-grid.types';\r\n\r\ninterface SortState {\r\n field: string;\r\n dir: 'asc' | 'desc';\r\n}\r\n\r\n/**\r\n * A column's effective type: declared, or inferred from its values. dx's inference can also land\r\n * on 'object' (m_columns_controller_utils.js getValueDataType), which aligns and formats as text.\r\n */\r\ntype NxeColType = NxeColumnDataType | 'object';\r\n\r\n/** dx filter-row operations (`selectedFilterOperation`). */\r\nexport type NxeFilterOp =\r\n | 'contains'\r\n | 'notcontains'\r\n | 'startswith'\r\n | 'endswith'\r\n | '='\r\n | '<>'\r\n | '<'\r\n | '<='\r\n | '>'\r\n | '>='\r\n | 'between';\r\n\r\n/** One column's filter-row state: chosen operation + the typed editor text(s). */\r\ninterface FilterRowEntry {\r\n op: NxeFilterOp;\r\n text: string;\r\n /** Second editor of a `between` range. */\r\n text2?: string;\r\n /**\r\n * The user picked `op` from the operation menu. Until then `op` is only the column default and\r\n * the chooser shows dx's magnifier: dx leaves `selectedFilterOperation` unset and draws\r\n * `dx-icon-filter-operation-default` (m_filter_row.js), whatever operation the filter applies.\r\n */\r\n chosen?: boolean;\r\n}\r\n\r\ninterface TreeNode {\r\n key: any;\r\n data: any;\r\n children: TreeNode[];\r\n level: number;\r\n hasChildren: boolean;\r\n}\r\n\r\n/** Flattened render rows when grouping or tree hierarchy is active. */\r\ntype GridRenderRow =\r\n | {\r\n kind: 'data';\r\n row: any;\r\n rowIndex: number;\r\n // tree-list only:\r\n level?: number;\r\n hasChildren?: boolean;\r\n expanded?: boolean;\r\n nodeKey?: any;\r\n }\r\n | {\r\n kind: 'group';\r\n level: number;\r\n column: NxeColumnComponent;\r\n text: string;\r\n /** Raw group key, before formatting — dx hands this to `groupCellTemplate` as `value`. */\r\n value: any;\r\n /** The rows in this group, dx's `data` for a group cell. */\r\n rows: readonly any[];\r\n groupKey: string;\r\n collapsed: boolean;\r\n /** `alignByColumn` group sums keyed by target dataField (`showInColumn ?? column`). */\r\n alignedSums: Map<string, string>;\r\n /** Non-aligned group items appended to the caption — dx `Caption: Key (a, b)`. */\r\n captionSuffix: string;\r\n }\r\n | {\r\n kind: 'groupFooter';\r\n level: number;\r\n /** Per-column formatted sums for items with `showInGroupFooter` (orbit addition). */\r\n sums: Map<string, string>;\r\n };\r\n\r\n/** One `<td>` in the header, which may span columns (a band) or rows (a leaf above the bottom). */\r\nexport interface NxeHeaderCell {\r\n column: NxeColumnComponent;\r\n colspan: number;\r\n rowspan: number;\r\n isBand: boolean;\r\n /** Index into the visible leaf columns; null for a band, which sorts and resizes nothing. */\r\n leafIndex: number | null;\r\n}\r\n\r\n/** Classify a rendered `<tr>` for dx's `rowType`, or null for rows dx does not report. */\r\nfunction nxeRowTypeOf(tr: HTMLTableRowElement): NxeRowType | null {\r\n const c = tr.classList;\r\n if (c.contains('nxe-header-row')) {\r\n return 'header';\r\n }\r\n if (c.contains('nxe-datagrid-filter-row')) {\r\n return 'filter';\r\n }\r\n if (c.contains('nxe-data-row')) {\r\n return 'data';\r\n }\r\n if (c.contains('nxe-group-footer-row')) {\r\n return 'groupFooter';\r\n }\r\n if (c.contains('nxe-group-row')) {\r\n return 'group';\r\n }\r\n if (tr.parentElement?.classList.contains('nxe-datagrid-total-footer')) {\r\n return 'totalFooter';\r\n }\r\n return null;\r\n}\r\n\r\n/** Depth-first leaves of a declared column tree: a band contributes its children, not itself. */\r\nfunction flattenLeafColumns(cols: readonly NxeColumnComponent[]): NxeColumnComponent[] {\r\n const out: NxeColumnComponent[] = [];\r\n for (const col of cols) {\r\n if (col.isBand()) {\r\n out.push(...flattenLeafColumns(col.childColumns()));\r\n } else {\r\n out.push(col);\r\n }\r\n }\r\n return out;\r\n}\r\n\r\n/**\r\n * A row's side of a collapsed border: the widest top or bottom border across the `<tr>` and its\r\n * cells, as computed (a `none` border computes to 0). Null, or anything but a row, has none.\r\n */\r\nfunction nxeRowEdge(row: Element | null | undefined, side: 'top' | 'bottom'): number {\r\n if (!(row instanceof HTMLTableRowElement)) {\r\n return 0;\r\n }\r\n const prop = `border-${side}-width`;\r\n let width = parseFloat(getComputedStyle(row).getPropertyValue(prop)) || 0;\r\n for (const cell of Array.from(row.cells)) {\r\n width = Math.max(width, parseFloat(getComputedStyle(cell).getPropertyValue(prop)) || 0);\r\n }\r\n return width;\r\n}\r\n\r\n\r\n/**\r\n * `nxe-data-grid` — drop-in replacement for DevExtreme `dx-data-grid` (read-only core, slice 9a).\r\n *\r\n * Renders a single `<table>` under the library's own class namespace (`nxe-widget nxe-datagrid`,\r\n * `nxe-row`/`nxe-header-row`/`nxe-data-row`/`nxe-datagrid-headers`/`nxe-datagrid-rowsview`, `td`s).\r\n * The structure still mirrors dx's, name for name, so the visual contract carries over\r\n * (4px cell padding, #f8fafc header, #525252 header text, row/hover/alt colours) — but the\r\n * `dx-` prefix is gone; `provideNxeDxCompat()` re-emits it for stylesheets not yet migrated.\r\n * Columns are\r\n * collected from `nxe-column` content children; named `cellTemplate`s resolve to sibling\r\n * `<ng-template nxeTemplate=\"name\">` blocks rendered with `{ data, rowIndex, columnIndex, ... }`\r\n * (the live row object, so in-cell `nxe-*` editors can write through `key.data.<field>`).\r\n *\r\n * The `.instance` facade exposes only what the app calls: `getSelectedRowsData()` (12 template\r\n * sites), `refresh()` (13), `columnOption(field,'visible',bool)` (3). Selection UI, header-filter,\r\n * grouping and summary land in slice 9b.\r\n */\r\n@Component({\r\n selector: 'nxe-data-grid, nxe-tree-list',\r\n standalone: true,\r\n imports: [NgTemplateOutlet],\r\n templateUrl: './nxe-data-grid.component.html',\r\n styleUrl: './nxe-data-grid.component.scss',\r\n host: { class: 'nxe-widget nxe-data-grid' },\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class NxeDataGridComponent implements OnDestroy {\r\n private readonly elementRef = inject(ElementRef<HTMLElement>);\r\n private readonly overlay = inject(Overlay);\r\n private readonly viewContainerRef = inject(ViewContainerRef);\r\n private readonly ngZone = inject(NgZone);\r\n private readonly destroyRef = inject(DestroyRef);\r\n private readonly defaults = inject(NXE_DEFAULT_OPTIONS);\r\n /** Locale separators for every number this grid renders — cells, summaries and group text. */\r\n private readonly separators = inject(NXE_NUMBER_SEPARATORS);\r\n\r\n /** Pointer drag engine: drag-to-group, chip drag-out (ungroup), chip/column reorder. */\r\n protected readonly drag = new NxeGridDragController({\r\n zone: this.ngZone,\r\n host: () => this.elementRef.nativeElement,\r\n onGroupDrop: (col) => this.groupByColumn(col),\r\n onChipRemove: (col) => this.ungroupColumn(col.dataField()),\r\n onChipMove: (from, to) => this.moveGroup(from, to),\r\n reorderEnabled: () => this.allowColumnReordering(),\r\n onColumnMove: (from, slot) => this.moveColumnByVisible(from, slot),\r\n headerDataCells: () => nxeHeaderLeafCells(this.elementRef.nativeElement as HTMLElement),\r\n });\r\n\r\n /** Pointer resize engine (dx allowColumnResizing). */\r\n protected readonly resize = new NxeGridResizeController({\r\n zone: this.ngZone,\r\n host: () => this.elementRef.nativeElement,\r\n mode: () => this.columnResizingMode(),\r\n minWidth: () => this.columnMinWidth() ?? 50,\r\n onStart: () => (this.resizeActive = true),\r\n onCancel: () => (this.resizeActive = false),\r\n onCommit: (changes) => this.commitColumnResize(changes),\r\n });\r\n private resizeActive = false;\r\n\r\n /**\r\n * Columns exactly as declared: top-level leaves and bands, bands still holding their children.\r\n * Only the header model reads this — everything else wants leaves.\r\n */\r\n private readonly declaredColumns = contentChildren(NxeColumnComponent, { descendants: false });\r\n\r\n /**\r\n * The data columns: bands flattened away, depth-first, in declaration order.\r\n *\r\n * Keeping `columns()` meaning \"the columns that carry data\" is what stops banded headers\r\n * being a rewrite. Sorting, grouping, filtering, summaries, resize, export and the whole\r\n * `<tbody>` are about leaves and continue to work untouched; bands exist only in `<thead>`.\r\n */\r\n protected readonly columns = computed<readonly NxeColumnComponent[]>(() =>\r\n flattenLeafColumns(this.declaredColumns()),\r\n );\r\n\r\n /** True when any declared column is a band, i.e. the header needs more than one row. */\r\n protected readonly hasBands = computed(() => this.declaredColumns().some((c) => c.isBand()));\r\n private readonly templates = contentChildren(NxeTemplateDirective);\r\n protected readonly selection = contentChild(NxeSelectionComponent);\r\n protected readonly headerFilter = contentChild(NxeHeaderFilterComponent);\r\n protected readonly grouping = contentChild(NxeGroupingComponent);\r\n protected readonly groupPanel = contentChild(NxeGroupPanelComponent);\r\n protected readonly summaryCmp = contentChild(NxeSummaryComponent);\r\n protected readonly pagingCmp = contentChild(NxePagingComponent);\r\n protected readonly pagerCmp = contentChild(NxePagerComponent);\r\n protected readonly editingCmp = contentChild(NxeEditingComponent);\r\n protected readonly filterRowCmp = contentChild(NxeFilterRowComponent);\r\n protected readonly masterDetail = contentChild(NxeMasterDetailComponent);\r\n\r\n // --- Inputs (mirror dx-data-grid; object-literal inputs accepted as-is for drop-in parity) ---\r\n readonly dataSource = input<readonly any[] | null | undefined>([]);\r\n readonly keyExpr = input<string | undefined>(undefined);\r\n // Presentation options resolve as `binding ?? NXE_DEFAULT_OPTIONS ?? literal`. The raw input\r\n // is aliased so the element keeps its dx name, and the public member stays the resolved\r\n // value — every read site, template included, goes through the cascade without knowing.\r\n //\r\n // The default has to be `undefined`, not `false`: \"unset\" is a distinct state from \"set to\r\n // false\", and only the former defers to the token. A `booleanAttribute` transform here would\r\n // fold one into the other and silently disable the middle rung.\r\n readonly hoverStateEnabledInput = input<boolean | undefined>(undefined, {\r\n alias: 'hoverStateEnabled',\r\n });\r\n readonly showColumnLinesInput = input<boolean | undefined>(undefined, {\r\n alias: 'showColumnLines',\r\n });\r\n readonly showRowLinesInput = input<boolean | undefined>(undefined, { alias: 'showRowLines' });\r\n readonly showBordersInput = input<boolean | undefined>(undefined, { alias: 'showBorders' });\r\n readonly wordWrapEnabledInput = input<boolean | undefined>(undefined, {\r\n alias: 'wordWrapEnabled',\r\n });\r\n readonly columnAutoWidthInput = input<boolean | undefined>(undefined, {\r\n alias: 'columnAutoWidth',\r\n });\r\n readonly rowAlternationEnabledInput = input<boolean | undefined>(undefined, {\r\n alias: 'rowAlternationEnabled',\r\n });\r\n\r\n /** dx resolves `nxe-tree-list` against the `treeList` slice, not `dataGrid`. */\r\n private readonly widgetDefaults = computed(\r\n () => (this.treeMode ? this.defaults.treeList : this.defaults.dataGrid) ?? {},\r\n );\r\n\r\n readonly hoverStateEnabled = computed(\r\n () => this.hoverStateEnabledInput() ?? this.widgetDefaults().hoverStateEnabled ?? false,\r\n );\r\n // The literals are DevExtreme 24.2.3's generic defaults: showColumnLines true, showRowLines\r\n // false and wordWrapEnabled false (m_rows_view.js:1180-1182), showBorders false\r\n // (m_grid_view.js:743). dxTreeList shares them and changes them only for the Material themes\r\n // (tree_list/m_widget_base.js:39-52), so both hosts use the same literals. The library shipped\r\n // column lines off and row lines and wrapping on, the reverse of dx, so every grid that bound\r\n // neither option drew the wrong lines.\r\n readonly showColumnLines = computed(\r\n () => this.showColumnLinesInput() ?? this.widgetDefaults().showColumnLines ?? true,\r\n );\r\n readonly showRowLines = computed(\r\n () => this.showRowLinesInput() ?? this.widgetDefaults().showRowLines ?? false,\r\n );\r\n readonly showBorders = computed(\r\n () => this.showBordersInput() ?? this.widgetDefaults().showBorders ?? false,\r\n );\r\n readonly wordWrapEnabled = computed(\r\n () => this.wordWrapEnabledInput() ?? this.widgetDefaults().wordWrapEnabled ?? false,\r\n );\r\n readonly columnAutoWidth = computed(\r\n () => this.columnAutoWidthInput() ?? this.widgetDefaults().columnAutoWidth ?? false,\r\n );\r\n readonly rowAlternationEnabled = computed(\r\n () => this.rowAlternationEnabledInput() ?? this.widgetDefaults().rowAlternationEnabled ?? false,\r\n );\r\n readonly remoteOperations = input<any>(false);\r\n /**\r\n * dx `syncLookupFilterValues` — accepted, and deliberately inert. It asks dx to narrow a\r\n * lookup column's header-filter list to the values still reachable under the other filters.\r\n * This grid never cascades those lists for client arrays (see `hfBaseRows`), so `false` is\r\n * already what it does; `true` is the option we do not honour.\r\n * @nxeInert grid — parity/data-grid.yaml \"syncLookupFilterValues\".\r\n */\r\n readonly syncLookupFilterValues = input(true);\r\n readonly columnMinWidth = input<number | undefined>(undefined);\r\n /** dx `height` — a bare number means px, anything else passes through. */\r\n readonly height = input<number | string | undefined>(undefined);\r\n protected readonly heightStyle = computed(() => {\r\n const h = this.height();\r\n if (h === undefined || h === null || h === '') {\r\n return null;\r\n }\r\n return /^-?\\d+(\\.\\d+)?$/.test(String(h)) ? `${h}px` : String(h);\r\n });\r\n readonly noDataTextInput = input<string | undefined>(undefined, { alias: 'noDataText' });\r\n readonly noDataText = computed(\r\n () => this.noDataTextInput() ?? this.widgetDefaults().noDataText ?? 'No data',\r\n );\r\n readonly loadPanel = input<{ enabled?: boolean } | undefined>(undefined);\r\n readonly paging = input<{ enabled?: boolean; pageSize?: number } | undefined>(undefined);\r\n readonly filterRow = input<{ visible?: boolean } | undefined>(undefined);\r\n /** Object-input forms of the config elements (dx accepts both; orbit uses both styles). */\r\n readonly headerFilterOptions = input<\r\n { visible?: boolean; search?: { enabled?: boolean } } | undefined\r\n >(undefined, { alias: 'headerFilter' });\r\n readonly groupingOptions = input<{ autoExpandAll?: boolean } | undefined>(undefined, {\r\n alias: 'grouping',\r\n });\r\n readonly groupPanelOptions = input<{ visible?: boolean } | undefined>(undefined, {\r\n alias: 'groupPanel',\r\n });\r\n readonly scrolling = input<any>(undefined);\r\n /**\r\n * dx `sorting`. Unbound means dx's default mode 'single'. `false` and `null` are accepted as dx\r\n * reads them - no mode, so headers keep their sort slot but a click never sorts.\r\n */\r\n readonly sorting = input<{ mode?: 'single' | 'multiple' | 'none' } | false | null | undefined>(\r\n undefined,\r\n );\r\n readonly allowColumnResizing = input(false);\r\n /** dx columnResizingMode: 'nextColumn' (default) trades width; 'widget' grows the table. */\r\n readonly columnResizingMode = input<'nextColumn' | 'widget'>('nextColumn');\r\n /** dx allowColumnReordering (default false — matches every dx-era template in this app). */\r\n readonly allowColumnReordering = input(false);\r\n readonly repaintChangesOnly = input(false);\r\n readonly showColumnHeaders = input(true);\r\n\r\n // --- Tree-list inputs (dx-tree-list) -------------------------------------------------------\r\n readonly parentIdExpr = input<string | undefined>(undefined);\r\n readonly dataStructure = input<'plain' | 'tree'>('plain');\r\n readonly rootValue = input<unknown>(undefined);\r\n readonly autoExpandAll = input(false);\r\n readonly expandedRowKeys = model<any[]>([]);\r\n /** Tree-list multi-select keys (`[(selectedRowKeys)]`); recursive via dxo-selection. */\r\n readonly selectedRowKeys = model<any[]>([]);\r\n\r\n /**\r\n * Declarative cell merge (orbit addition, replaces the legacy `onCellPrepared` DOM surgery):\r\n * dataFields merged hierarchically left→right — consecutive rows with equal values render one\r\n * cell with `rowspan`; a break in an earlier field breaks all later fields.\r\n */\r\n readonly mergeColumns = input<readonly string[]>([]);\r\n\r\n readonly onSelectionChanged = output<NxeGridSelectionChangedEvent>();\r\n readonly onRowClick = output<{ data: any; rowIndex: number; component: NxeGridInstance }>();\r\n /** Fires after the rendered row set changes (dx parity; used for post-render DOM work). */\r\n readonly onContentReady = output<{ component: NxeGridInstance; element: HTMLElement }>();\r\n /**\r\n * dx parity: `{ fullName: 'paging.pageIndex', value }` for internal paging and\r\n * `{ fullName: 'columns[<i>].groupIndex', previousValue, value }` for runtime grouping\r\n * changes (one event per gesture — the contract generic-list's persistence handler expects).\r\n */\r\n readonly onOptionChanged = output<NxeGridOptionChangedEvent>();\r\n /** Extra CSS classes for a data row (replaces dx `onRowPrepared` class tweaks). */\r\n readonly rowClass = input<((row: any) => string) | undefined>(undefined);\r\n\r\n /**\r\n * dx `onCellPrepared` / `onRowPrepared`, fired once per rendered cell and row after the DOM\r\n * is written, with the real element for handlers that mutate it.\r\n *\r\n * Classic EventEmitters, NOT `output()`, for the same reason the pivot uses them: `.observed`\r\n * gates a per-cell walk, so a grid that binds neither pays nothing. That gate is the whole\r\n * cost model here — without it every grid would walk every cell on every render.\r\n *\r\n * `mergeColumns` and `rowClass` are the supported way to do what most handlers do; these\r\n * exist because applications carry handlers that cannot be rewritten.\r\n */\r\n @Output() readonly onCellPrepared = new EventEmitter<NxeCellPreparedEvent>();\r\n @Output() readonly onRowPrepared = new EventEmitter<NxeRowPreparedEvent>();\r\n\r\n protected rowClassFor(row: any): string {\r\n return this.rowClass()?.(row) ?? '';\r\n }\r\n /** Master-detail expand lifecycle (fires before the detail template instantiates). */\r\n readonly onRowExpanding = output<{ key: any; component: NxeGridInstance }>();\r\n readonly onRowExpanded = output<{ key: any; component: NxeGridInstance }>();\r\n\r\n /** Set imperatively by `app-data-pagination-wrapper` (a group-count summary). Stored for 9b. */\r\n summary: any = undefined;\r\n\r\n private readonly hoveredIndex = signal<number | null>(null);\r\n private readonly sort = signal<SortState | null>(null);\r\n private readonly sortInit = signal(false);\r\n private readonly visibilityOverride = signal<ReadonlyMap<string, boolean>>(new Map());\r\n /** Filter-row state per dataField (operation + typed text) — controlled editors read it back. */\r\n private readonly filterRowState = signal<ReadonlyMap<string, FilterRowEntry>>(new Map());\r\n /**\r\n * Header-filter runtime overrides: field → allowed-key set, or `null` for \"user explicitly\r\n * cleared\" (a declarative `filterValues` seed must NOT resurrect after Select All → OK).\r\n * Absent field = untouched → the column's `filterValues` input seeds the filter (dx parity).\r\n */\r\n private readonly hfOverride = signal<ReadonlyMap<string, ReadonlySet<any> | null>>(new Map());\r\n private readonly selectedSet = signal<ReadonlySet<any>>(new Set());\r\n private readonly refreshTick = signal(0);\r\n\r\n /**\r\n * Header-filter popup working state — the draft/search/tree machinery lives in\r\n * {@link NxeHeaderFilterModel} (extracted for pivot reuse, Phase 3a); the grid supplies\r\n * its rows/columns through the source adapter and keeps the aliases the specs poke.\r\n */\r\n protected readonly hf = new NxeHeaderFilterModel<NxeColumnComponent>({\r\n rows: () => this.hfBaseRows(),\r\n fixedItems: (col: NxeColumnComponent) => {\r\n const items = col.headerFilterConfig()?.dataSource();\r\n // dx uses a supplied list verbatim: declared order, no (Blanks), and values that do\r\n // not occur in the data still offered - which is the reason to supply one.\r\n return items\r\n ? items.map((i) => ({ key: i.value, text: String(i.text ?? i.value ?? '') }))\r\n : null;\r\n },\r\n rawValue: (col, row) => this.getRaw(row, col.dataField()),\r\n displayText: (col, row) => this.cellText(col, row),\r\n isDate: (col) => this.colType(col) === 'date',\r\n sortByDisplayText: (col) => !!col.lookup(),\r\n boolLabel: (col, raw) => this.hfBoolLabel(col, raw),\r\n compare: (a, b) => this.compare(a, b),\r\n });\r\n protected readonly hfColumn = this.hf.column;\r\n protected readonly hfDraft = this.hf.draft;\r\n private hfOverlayRef?: OverlayRef;\r\n\r\n /**\r\n * The current page.\r\n *\r\n * A `linkedSignal` over `nxe-paging`'s own `pageIndex` so the binding is genuinely two-way:\r\n * a host that sets `[(pageIndex)]` moves the grid, and `goToPage` writes back. Declaring the\r\n * input without this would satisfy an audit while doing nothing — the option would resolve\r\n * and be ignored, which is worse than not accepting it.\r\n */\r\n protected readonly pageIndex = linkedSignal(() => this.pagingCmp()?.pageIndex() ?? 0);\r\n private readonly userPageSize = signal<number | null>(null);\r\n\r\n /** DevExtreme `.instance` facade — `#gridAll.instance.<method>()`. */\r\n private readonly facade: NxeGridInstance = {\r\n getSelectedRowsData: () => this.selectedRowsData(),\r\n getSelectedRowKeys: () => this.rowKeys(this.selectedRowsData()),\r\n refresh: () => this.refreshTick.update((v) => v + 1),\r\n clearFilter: (filterName?: 'row' | 'header' | 'search' | 'filterValue' | 'dataSource') => {\r\n if (!filterName || filterName === 'row') {\r\n this.filterRowState.set(new Map());\r\n }\r\n if (!filterName || filterName === 'header') {\r\n // Explicit nulls so declarative `filterValues` seeds don't resurrect (dx clears\r\n // column.filterValues even when configured declaratively).\r\n const cleared = new Map<string, ReadonlySet<any> | null>();\r\n for (const col of this.columns()) {\r\n if (col.filterValues()?.length) {\r\n cleared.set(col.dataField(), null);\r\n }\r\n }\r\n this.hfOverride.set(cleared);\r\n }\r\n },\r\n columnOption: (field, optionName, value) => {\r\n if (optionName === 'visible') {\r\n this.setColumnVisible(field, value);\r\n }\r\n },\r\n getVisibleColumns: () =>\r\n this.visibleColumns().map((c) => {\r\n const type = this.colType(c);\r\n return {\r\n caption: c.caption(),\r\n dataField: c.dataField(),\r\n // An inferred 'object' column exports as text, as an untyped one always did.\r\n dataType: type === 'object' ? 'string' : type,\r\n format: c.format(),\r\n };\r\n }),\r\n getVisibleRows: () => this.displayRows(),\r\n totalCount: () => this.displayRows().length,\r\n getRootNode: () => ({\r\n key: undefined,\r\n data: undefined,\r\n level: -1,\r\n hasChildren: this.treeRoots().length > 0,\r\n children: this.treeRoots(),\r\n }),\r\n updateDimensions: () => this.refreshTick.update((v) => v + 1),\r\n clearGrouping: () => this.clearGroupingInternal(),\r\n expandAll: () => {\r\n this.groupExpandDefault.set(true);\r\n this.groupExpandOverride.set(new Map());\r\n if (this.treeMode) {\r\n const keyF = this.keyExpr() ?? 'id';\r\n const all = new Map<any, boolean>();\r\n for (const r of (this.dataSource() ?? []) as any[]) {\r\n all.set(r[keyF], true);\r\n }\r\n this.expandOverride.set(all);\r\n }\r\n },\r\n saveEditData: () => {\r\n const editing = this.editingCmp();\r\n const key = editing?.editRowKey();\r\n if (editing && key != null) {\r\n const row = ((this.dataSource() ?? []) as any[]).find((r) => this.rowKey(r) === key);\r\n if (row) {\r\n this.saveRowEdit(row, new Event('save'));\r\n }\r\n }\r\n },\r\n element: () => this.elementRef.nativeElement,\r\n expandRow: (key: any) => {\r\n // Symmetric with collapseRow for the tree list: writes the same override map the\r\n // expander arrows use, so a programmatic reveal wins over an earlier manual collapse\r\n // (the [expandedRowKeys] seed alone cannot — overrides take precedence over it).\r\n if (this.treeMode) {\r\n this.expandOverride.update((m) => new Map(m).set(key, true));\r\n }\r\n },\r\n collapseRow: (key: any) => {\r\n // Master-detail collapse by key; tree-list node collapse for tree mode.\r\n this.expandedDetails.update((set) => {\r\n const next = new Set(set);\r\n next.delete(key);\r\n return next;\r\n });\r\n if (this.treeMode) {\r\n this.expandOverride.update((m) => new Map(m).set(key, false));\r\n }\r\n // dx grouped-grid form: collapseRow(['X','Y']) collapses that group path.\r\n if (!this.treeMode && Array.isArray(key) && this.groupColumns().length) {\r\n let groupKey = '';\r\n key.forEach((value, level) => {\r\n groupKey = `${groupKey}/${level}:${typeof value}:${String(value)}`;\r\n });\r\n this.groupExpandOverride.update((m) => new Map(m).set(groupKey, false));\r\n }\r\n },\r\n };\r\n get instance(): NxeGridInstance {\r\n return this.facade;\r\n }\r\n\r\n /** Guards against a handler that schedules another render re-entering the walk. */\r\n private preparedDepth = 0;\r\n\r\n constructor() {\r\n // Registered before onContentReady so cells are prepared by the time it fires, as in dx.\r\n afterRenderEffect(() => {\r\n this.renderRows();\r\n this.visibleColumns();\r\n untracked(() => this.emitPreparedEvents());\r\n });\r\n\r\n // A cellTemplate that draws a check box centres its column, header and cells, the way a\r\n // boolean column is centred. Only the rendered cells can say what a template draws, so\r\n // this reads them after render; the DOM walk is untracked, like emitPreparedEvents.\r\n afterRenderEffect(() => {\r\n this.renderRows();\r\n this.visibleColumns();\r\n untracked(() => this.detectTemplateCheckboxColumns());\r\n });\r\n\r\n // dx onContentReady parity: fire after the rendered row set reaches the DOM.\r\n afterRenderEffect(() => {\r\n this.renderRows();\r\n this.onContentReady.emit({ component: this.facade, element: this.elementRef.nativeElement });\r\n });\r\n\r\n // dx columnAutoWidth parity: measure natural column widths after render, then apply\r\n // fixed-layout pixel widths distributed like dx (explicit widths kept; free columns share\r\n // the remaining container width proportionally to their max-content size).\r\n afterRenderEffect(() => {\r\n this.renderRows();\r\n this.visibleColumns();\r\n this.columnAutoWidth();\r\n this.wordWrapEnabled();\r\n this.containerW();\r\n untracked(() => this.scheduleAutoWidthMeasure());\r\n });\r\n afterNextRender(() => {\r\n const rv = this.elementRef.nativeElement.querySelector('.nxe-datagrid-rowsview');\r\n if (rv && typeof ResizeObserver !== 'undefined') {\r\n this.resizeObserver = new ResizeObserver((entries) => {\r\n const w = Math.round(entries[0]?.contentRect?.width ?? 0);\r\n if (w > 0 && Math.abs(w - this.containerW()) > 1) {\r\n this.containerW.set(w);\r\n }\r\n });\r\n this.resizeObserver.observe(rv);\r\n }\r\n });\r\n\r\n // The free-space row: re-read whenever the rows view (the grid's height) or its table (the\r\n // rows) changes size. The paged case needs no reading beyond the row height, so a page\r\n // change that keeps the table's height still resolves through `freeSpace` alone.\r\n afterNextRender(() => {\r\n const host = this.elementRef.nativeElement as HTMLElement;\r\n // This grid's own elements: a nested master-detail grid's come later in the document.\r\n const rv = host.querySelector<HTMLElement>('.nxe-datagrid-rowsview');\r\n const table = rv?.querySelector<HTMLTableElement>(\r\n ':scope > .nxe-datagrid-content > .nxe-datagrid-table',\r\n );\r\n if (!rv || !table || typeof ResizeObserver === 'undefined') {\r\n return;\r\n }\r\n const observer = new ResizeObserver(() => this.measureFreeSpace(rv, table));\r\n observer.observe(rv);\r\n observer.observe(table);\r\n this.destroyRef.onDestroy(() => observer.disconnect());\r\n });\r\n }\r\n\r\n // --- Column auto-width engine (dx columnAutoWidth parity) ----------------------------------\r\n private readonly autoWidths = signal<{ widths: readonly (string | null)[]; tableWidth: string } | null>(null);\r\n private readonly containerW = signal(0);\r\n private resizeObserver: ResizeObserver | null = null;\r\n private autoWidthPending = false;\r\n private lastAutoWidthKey = '';\r\n\r\n private scheduleAutoWidthMeasure(): void {\r\n // Frozen after a manual resize (dx stops redistributing), paused while a resize drag\r\n // writes the colgroup directly.\r\n if (!this.columnAutoWidth() || this.resizeActive || this.widthOverride().size) {\r\n if (this.autoWidths() !== null) {\r\n this.lastAutoWidthKey = '';\r\n this.autoWidths.set(null);\r\n }\r\n return;\r\n }\r\n if (this.autoWidthPending) {\r\n return;\r\n }\r\n this.autoWidthPending = true;\r\n requestAnimationFrame(() => {\r\n this.autoWidthPending = false;\r\n this.measureAutoWidths();\r\n });\r\n }\r\n\r\n private measureAutoWidths(): void {\r\n const host = this.elementRef.nativeElement as HTMLElement;\r\n const table = host.querySelector<HTMLTableElement>('.nxe-datagrid-content > .nxe-datagrid-table');\r\n const rowsview = host.querySelector<HTMLElement>('.nxe-datagrid-rowsview');\r\n if (!table || !rowsview) {\r\n return;\r\n }\r\n const cols = this.visibleColumns();\r\n const lead =\r\n this.groupLevelCount() + (this.masterDetailEnabled() ? 1 : 0) + (this.showCheckboxes() ? 1 : 0);\r\n // One cell per visible column, gathered across the header rows: with bands a top-level\r\n // column sits in the first row and spans down, so no single row holds them all.\r\n const cells = nxeHeaderLeafCells(host);\r\n const container = rowsview.clientWidth;\r\n if (cells.length !== cols.length || container <= 0) {\r\n return;\r\n }\r\n\r\n // Measurement pass: natural max-content widths (no wrap), reverted before paint.\r\n const colEls = Array.from(table.querySelectorAll<HTMLTableColElement>(':scope > colgroup > col'))\r\n .slice(lead, lead + cols.length);\r\n const prevLayout = table.style.tableLayout;\r\n const prevWidth = table.style.width;\r\n const prevColWidths = colEls.map((c) => c.style.width);\r\n // dx's best-fit pass moves the header tbody into the rows table as `dx-header\r\n // dx-datagrid-best-fit` (m_grid_view.js:187-206). Its rules unfloat the indicator block and\r\n // show every `dx-sort-none` placeholder at 14px, so each sortable column measures 17px wider\r\n // (34px centred, with the hidden mirror) whether sorted or not - and sorting never changes a\r\n // width. The class goes on our thead, which is that tbody's counterpart.\r\n const thead = table.querySelector<HTMLElement>(':scope > thead');\r\n thead?.classList.add('nxe-datagrid-best-fit');\r\n table.style.tableLayout = 'auto';\r\n table.style.width = 'max-content';\r\n colEls.forEach((c) => (c.style.width = ''));\r\n const measured = cells.map((c) => c.getBoundingClientRect().width);\r\n thead?.classList.remove('nxe-datagrid-best-fit');\r\n table.style.tableLayout = prevLayout;\r\n table.style.width = prevWidth;\r\n colEls.forEach((c, i) => (c.style.width = prevColWidths[i]));\r\n\r\n // dx-style distribution: explicit px widths kept; free columns get the remaining space\r\n // proportionally to measured max-content (never below columnMinWidth; last col absorbs\r\n // rounding). Over-constrained -> keep max-content and let the rowsview scroll.\r\n const explicit = cols.map((c) => {\r\n const w = this.colWidth(c);\r\n if (w == null) {\r\n return null;\r\n }\r\n const n = parseFloat(w);\r\n return Number.isFinite(n) && (w.endsWith('px') || /^\\d+(\\.\\d+)?$/.test(w)) ? n : null;\r\n });\r\n const specialSum =\r\n 30 * this.groupLevelCount() +\r\n (this.masterDetailEnabled() ? 30 : 0) +\r\n (this.showCheckboxes() ? 70 : 0) +\r\n (this.rowEditCommandVisible() ? 100 : 0);\r\n const fixedSum = explicit.reduce((s: number, w) => s + (w ?? 0), 0) + specialSum;\r\n const freeIdx = explicit.map((w, i) => (w == null ? i : -1)).filter((i) => i >= 0);\r\n const out: (string | null)[] = explicit.map((w) => (w == null ? null : `${w}px`));\r\n const minW = this.columnMinWidth() ?? 50;\r\n let total = fixedSum;\r\n if (freeIdx.length) {\r\n const freeSum = freeIdx.reduce((s, i) => s + measured[i], 0) || 1;\r\n const avail = container - fixedSum;\r\n if (avail >= freeSum) {\r\n const scale = avail / freeSum;\r\n let used = 0;\r\n freeIdx.forEach((i, k) => {\r\n const w = k === freeIdx.length - 1\r\n ? Math.max(minW, avail - used)\r\n : Math.max(minW, Math.round(measured[i] * scale * 100) / 100);\r\n used += w;\r\n out[i] = `${w}px`;\r\n });\r\n total += used;\r\n } else {\r\n freeIdx.forEach((i) => {\r\n const w = Math.max(minW, Math.ceil(measured[i]));\r\n total += w;\r\n out[i] = `${w}px`;\r\n });\r\n }\r\n }\r\n const tableWidth = total > container + 1 ? `${Math.ceil(total)}px` : '100%';\r\n const key = `${out.join('|')}@${tableWidth}@${container}`;\r\n if (key !== this.lastAutoWidthKey) {\r\n this.lastAutoWidthKey = key;\r\n this.autoWidths.set({ widths: out, tableWidth });\r\n }\r\n }\r\n\r\n /**\r\n * A column with no frozen/declared width appearing AFTER a manual resize froze the layout\r\n * (ungrouped chip, re-shown via columnOption): give it dx's default column width instead of\r\n * letting the pinned table width squeeze it to ~0.\r\n */\r\n private frozenColWidth(col: NxeColumnComponent): number {\r\n const manual = this.widthOverride().get(col.dataField());\r\n if (manual != null) {\r\n return manual;\r\n }\r\n const declared = parseFloat(this.colWidth(col) ?? '');\r\n return Number.isFinite(declared) ? declared : 100;\r\n }\r\n\r\n protected effectiveColWidth(col: NxeColumnComponent, idx: number): string | null {\r\n const aw = this.autoWidths();\r\n if (aw && this.columnAutoWidth()) {\r\n return aw.widths[idx] ?? this.colWidth(col);\r\n }\r\n const w = this.colWidth(col);\r\n if (w == null && this.widthOverride().size) {\r\n return `${this.frozenColWidth(col)}px`;\r\n }\r\n return w;\r\n }\r\n\r\n protected tableWidthStyle(): string {\r\n // After a manual resize the layout is frozen: widget mode sizes the table to the sum of\r\n // its columns (dx grows/shrinks the table); nextColumn keeps filling the container.\r\n if (this.widthOverride().size && this.columnResizingMode() === 'widget') {\r\n let total =\r\n 30 * this.groupLevelCount() +\r\n (this.masterDetailEnabled() ? 30 : 0) +\r\n (this.showCheckboxes() ? 40 : 0) +\r\n (this.rowEditCommandVisible() ? 100 : 0);\r\n for (const col of this.visibleColumns()) {\r\n total += this.frozenColWidth(col);\r\n }\r\n return `${Math.round(total)}px`;\r\n }\r\n if (this.widthOverride().size) {\r\n return '100%';\r\n }\r\n const aw = this.autoWidths();\r\n return aw && this.columnAutoWidth() ? aw.tableWidth : '100%';\r\n }\r\n\r\n // --- Selection (dxo-selection) ---------------------------------------------------------------\r\n protected readonly selectionEnabled = computed(() => {\r\n const s = this.selection();\r\n return !!s && s.mode() !== 'none';\r\n });\r\n protected readonly selectionMode = computed(() => this.selection()?.mode() ?? 'single');\r\n protected readonly showCheckboxes = computed(() => {\r\n if (!this.selectionEnabled()) {\r\n return false;\r\n }\r\n // Tree-list multiple selection shows checkboxes by default (dx behaviour).\r\n return (\r\n this.selection()?.showCheckBoxesMode() === 'always' ||\r\n (this.treeMode && this.selectionMode() === 'multiple')\r\n );\r\n });\r\n /** Selected rows in dataSource order (stale refs from old data naturally filtered out). */\r\n protected readonly selectedRowsData = computed<any[]>(() => {\r\n if (this.treeMode) {\r\n const keySet = new Set(this.selectedRowKeys());\r\n return keySet.size === 0\r\n ? []\r\n : ((this.dataSource() ?? []) as any[]).filter((r) => keySet.has(this.rowKey(r)));\r\n }\r\n const set = this.selectedSet();\r\n return set.size === 0 ? [] : ((this.dataSource() ?? []) as any[]).filter((r) => set.has(r));\r\n });\r\n protected readonly allSelected = computed(() => {\r\n if (this.treeMode) {\r\n const rows = (this.dataSource() ?? []) as any[];\r\n const keys = this.selectedRowKeys();\r\n return rows.length > 0 && rows.every((r) => keys.includes(this.rowKey(r)));\r\n }\r\n const rows = this.displayRows();\r\n const set = this.selectedSet();\r\n return rows.length > 0 && rows.every((r) => set.has(r));\r\n });\r\n protected readonly someSelected = computed(() =>\r\n this.treeMode\r\n ? this.selectedRowKeys().length > 0\r\n : this.displayRows().some((r) => this.selectedSet().has(r)),\r\n );\r\n\r\n private rowKey(row: any): any {\r\n const k = this.keyExpr();\r\n return k ? row?.[k] : row;\r\n }\r\n\r\n private treeDescendantKeys(row: any): any[] {\r\n const start = this.rowKey(row);\r\n const out: any[] = [];\r\n const find = (nodes: TreeNode[]): TreeNode | null => {\r\n for (const n of nodes) {\r\n if (n.key === start) return n;\r\n const f = find(n.children);\r\n if (f) return f;\r\n }\r\n return null;\r\n };\r\n const node = find(this.treeRoots());\r\n const collect = (n: TreeNode): void => {\r\n out.push(n.key);\r\n n.children.forEach(collect);\r\n };\r\n if (node) collect(node);\r\n return out.length ? out : [start];\r\n }\r\n\r\n private toggleTreeSelection(row: any): void {\r\n const key = this.rowKey(row);\r\n // dx parity: single mode REPLACES the selection, and re-clicking the selected row keeps\r\n // it selected. A toggle here would immediately undo a key the host page just wrote into\r\n // [(selectedRowKeys)] from its own onRowClick handler — the output fires before this\r\n // runs, so the toggle would find the key present and delete it, ending every click with\r\n // an empty selection.\r\n if (this.selectionMode() !== 'multiple') {\r\n const previous = this.selectedRowKeys();\r\n const added = previous.includes(key) ? [] : [key];\r\n const removed = previous.filter((k) => k !== key);\r\n this.selectedRowKeys.set([key]);\r\n this.emitTreeSelectionChanged([key], added, removed);\r\n return;\r\n }\r\n const recursive = this.selection()?.recursive() ?? false;\r\n const keys = new Set(this.selectedRowKeys());\r\n const selecting = !keys.has(key);\r\n const affected = recursive ? this.treeDescendantKeys(row) : [key];\r\n for (const k of affected) {\r\n selecting ? keys.add(k) : keys.delete(k);\r\n }\r\n const arr = [...keys];\r\n this.selectedRowKeys.set(arr);\r\n this.emitTreeSelectionChanged(arr, selecting ? affected : [], selecting ? [] : affected);\r\n }\r\n\r\n private emitTreeSelectionChanged(allKeys: any[], added: any[], removed: any[]): void {\r\n const keySet = new Set(allKeys);\r\n const data = ((this.dataSource() ?? []) as any[]).filter((r) => keySet.has(this.rowKey(r)));\r\n this.onSelectionChanged.emit({\r\n selectedRowsData: data,\r\n selectedRowKeys: allKeys,\r\n currentSelectedRowKeys: added,\r\n currentDeselectedRowKeys: removed,\r\n component: this.facade,\r\n element: this.elementRef.nativeElement,\r\n });\r\n }\r\n\r\n // --- Grouping + summary (dxo-grouping / dxo-group-panel / dxo-summary) ------------------------\r\n /** `grouping.autoExpandAll` from the child element or object input; dx default is true. */\r\n private readonly groupAutoExpand = computed(\r\n () => this.grouping()?.autoExpandAll() ?? this.groupingOptions()?.autoExpandAll ?? true,\r\n );\r\n /** The current expand default — `expandAll()` flips it to true; an input change resets it. */\r\n private readonly groupExpandDefault = linkedSignal<boolean, boolean>({\r\n source: () => this.groupAutoExpand(),\r\n computation: (v) => v,\r\n });\r\n /**\r\n * Per-groupKey manual toggles. Reset when the autoExpandAll option flips or the group\r\n * configuration changes (dx repaints and re-applies the default; drag-created groups inherit it).\r\n */\r\n private readonly groupExpandOverride = linkedSignal<string, ReadonlyMap<string, boolean>>({\r\n source: () => `${this.groupAutoExpand()}|${this.groupedFields().join('\\u0000')}`,\r\n computation: () => new Map(),\r\n });\r\n\r\n private isGroupExpanded(groupKey: string): boolean {\r\n return this.groupExpandOverride().get(groupKey) ?? this.groupExpandDefault();\r\n }\r\n\r\n protected readonly groupPanelVisible = computed(\r\n () => this.groupPanel()?.visible() === true || this.groupPanelOptions()?.visible === true,\r\n );\r\n protected readonly isGrouped = computed(() => this.groupColumns().length > 0);\r\n\r\n private readonly totalItems = computed(() => this.summaryCmp()?.totalItems() ?? []);\r\n private readonly groupItems = computed(() => this.summaryCmp()?.groupItems() ?? []);\r\n\r\n protected readonly hasTotalFooter = computed(\r\n () => this.totalItems().length > 0 && this.displayRows().length > 0,\r\n );\r\n\r\n /** Grand-total sums keyed by dataField → formatted text (alignByColumn placement). */\r\n protected readonly totalSums = computed(() => {\r\n const map = new Map<string, string>();\r\n const rows = this.displayRows();\r\n for (const item of this.totalItems()) {\r\n map.set(item.column(), this.summaryText(item, rows));\r\n }\r\n return map;\r\n });\r\n\r\n // --- Internal paging (dxo-paging) -----------------------------------------------------------\r\n protected readonly pagingEnabled = computed(() => !!this.pagingCmp() && this.pagingCmp()!.enabled());\r\n protected readonly effectivePageSize = computed(\r\n () => this.userPageSize() ?? this.pagingCmp()?.pageSize() ?? 20,\r\n );\r\n protected readonly pageCount = computed(() =>\r\n this.pagingEnabled() ? Math.max(1, Math.ceil(this.displayRows().length / this.effectivePageSize())) : 1,\r\n );\r\n /**\r\n * The page shown: `pageIndex` held inside the page count. A filter can leave the bound index\r\n * past the last page; dx moves it back (m_data_source_adapter.js:454), and the rows, the\r\n * pager's selected button, its info text and prev/next all read this one value.\r\n */\r\n protected readonly currentPage = computed(() => Math.max(0, Math.min(this.pageIndex(), this.pageCount() - 1)));\r\n /** The filtered/sorted rows visible on the current page (all rows when paging is off). */\r\n protected readonly pagedRows = computed<any[]>(() => {\r\n const rows = this.displayRows();\r\n if (!this.pagingEnabled()) {\r\n return rows;\r\n }\r\n const ps = this.effectivePageSize();\r\n const pi = this.currentPage();\r\n return rows.slice(pi * ps, pi * ps + ps);\r\n });\r\n /**\r\n * dx `PagerView.isVisible` (m_pager.js): `true` always, `'auto'` only while there is more than\r\n * one page to move between, and never under virtual or infinite scrolling.\r\n */\r\n protected readonly pagerVisible = computed(() => {\r\n const p = this.pagerCmp();\r\n if (!p) {\r\n return false;\r\n }\r\n const mode = this.scrolling()?.mode;\r\n return (\r\n p.visible() === true ||\r\n (p.visible() === 'auto' &&\r\n this.pagingEnabled() &&\r\n this.pageCount() > 1 &&\r\n mode !== 'virtual' &&\r\n mode !== 'infinite')\r\n );\r\n });\r\n protected readonly pageSizes = computed<number[]>(() =>\r\n nxePagerPageSizes(this.pagerCmp()?.allowedPageSizes(), this.pagingCmp()?.pageSize() ?? 20),\r\n );\r\n /** dx's small mode: a page-size drop-down, and the navigation buttons whatever the option says. */\r\n protected readonly pagerCompact = computed(() => this.pagerCmp()?.displayMode() === 'compact');\r\n /** dx `getRenderPrevButton` (pages/page_index_selector.js): `!isLargeDisplayMode || showNavigationButtons`. */\r\n protected readonly pagerNavVisible = computed(\r\n () => this.pagerCompact() || !!this.pagerCmp()?.showNavigationButtons(),\r\n );\r\n /**\r\n * The page buttons and `. . .` separators. A linkedSignal because dx's list keeps a sliding\r\n * window between renders (pages/large.js): the previous window decides whether the next one\r\n * moves.\r\n */\r\n private readonly pagerWindow = linkedSignal<{ count: number; index: number }, NxePagerWindow>({\r\n source: () => ({ count: this.pageCount(), index: this.currentPage() }),\r\n computation: (src, prev) => nxePagerWindow(src.count, src.index, prev?.value),\r\n });\r\n protected readonly pageItems = computed(() => this.pagerWindow().items);\r\n\r\n // --- Tree-list hierarchy (dx-tree-list) -----------------------------------------------------\r\n /** True when the host element is `<nxe-tree-list>` (vs `<nxe-data-grid>`). */\r\n protected readonly treeMode =\r\n (this.elementRef.nativeElement as HTMLElement).tagName.toLowerCase() === 'nxe-tree-list';\r\n\r\n private readonly expandOverride = signal<ReadonlyMap<any, boolean>>(new Map());\r\n\r\n /** Tree assembled from the flat dataSource via keyExpr/parentIdExpr/rootValue. */\r\n private readonly treeRoots = computed<TreeNode[]>(() => {\r\n if (!this.treeMode) {\r\n return [];\r\n }\r\n const rows = (this.dataSource() ?? []) as any[];\r\n const keyF = this.keyExpr() ?? 'id';\r\n const parentF = this.parentIdExpr() ?? 'parentId';\r\n const root = this.rootValue();\r\n const byKey = new Map<any, TreeNode>();\r\n for (const r of rows) {\r\n byKey.set(r[keyF], { key: r[keyF], data: r, children: [], level: 0, hasChildren: false });\r\n }\r\n const roots: TreeNode[] = [];\r\n for (const r of rows) {\r\n const node = byKey.get(r[keyF])!;\r\n const pk = r[parentF];\r\n const parent = root !== undefined && pk === root ? undefined : byKey.get(pk);\r\n if (parent && parent !== node) {\r\n parent.children.push(node);\r\n parent.hasChildren = true;\r\n } else {\r\n roots.push(node);\r\n }\r\n }\r\n const assign = (nodes: TreeNode[], lvl: number): void => {\r\n for (const n of nodes) {\r\n n.level = lvl;\r\n assign(n.children, lvl + 1);\r\n }\r\n };\r\n assign(roots, 0);\r\n return roots;\r\n });\r\n\r\n private readonly treeExpanded = computed<ReadonlySet<any>>(() => {\r\n const override = this.expandOverride();\r\n const expandAll = this.autoExpandAll();\r\n const seeded = new Set(this.expandedRowKeys());\r\n const out = new Set<any>();\r\n const walk = (nodes: TreeNode[]): void => {\r\n for (const n of nodes) {\r\n if (n.hasChildren) {\r\n const def = expandAll || seeded.has(n.key);\r\n if (override.get(n.key) ?? def) {\r\n out.add(n.key);\r\n }\r\n }\r\n walk(n.children);\r\n }\r\n };\r\n walk(this.treeRoots());\r\n return out;\r\n });\r\n\r\n protected toggleTreeNode(key: any, event: Event): void {\r\n event.stopPropagation();\r\n const expanded = this.treeExpanded().has(key);\r\n this.expandOverride.update((m) => new Map(m).set(key, !expanded));\r\n }\r\n\r\n /** Flattened group + data render rows (tree hierarchy, then grouping, then flat). */\r\n protected readonly renderRows = computed<GridRenderRow[]>(() => {\r\n if (this.treeMode) {\r\n this.refreshTick(); // role-tab mutates selectedRowKeys then calls .instance.refresh()\r\n const expanded = this.treeExpanded();\r\n const out: GridRenderRow[] = [];\r\n let idx = 0;\r\n const walk = (nodes: TreeNode[]): void => {\r\n for (const n of nodes) {\r\n out.push({\r\n kind: 'data',\r\n row: n.data,\r\n rowIndex: idx++,\r\n level: n.level,\r\n hasChildren: n.hasChildren,\r\n expanded: expanded.has(n.key),\r\n nodeKey: n.key,\r\n });\r\n if (n.hasChildren && expanded.has(n.key)) {\r\n walk(n.children);\r\n }\r\n }\r\n };\r\n walk(this.treeRoots());\r\n return out;\r\n }\r\n const groupCols = this.groupColumns();\r\n const rows = this.pagedRows();\r\n if (groupCols.length === 0) {\r\n return rows.map((row, i) => ({ kind: 'data', row, rowIndex: i }) as GridRenderRow);\r\n }\r\n const out: GridRenderRow[] = [];\r\n const items = this.groupItems();\r\n let dataIndex = 0;\r\n\r\n const walk = (subset: any[], level: number, parentKey: string): void => {\r\n const col = groupCols[level];\r\n const field = col.dataField();\r\n // Contiguous partition by group value — displayRows pre-sorts by the group chain, so\r\n // first-seen bucket order IS the dx group order.\r\n const buckets = new Map<any, any[]>();\r\n for (const r of subset) {\r\n const v = this.getRaw(r, field);\r\n if (!buckets.has(v)) {\r\n buckets.set(v, []);\r\n }\r\n buckets.get(v)!.push(r);\r\n }\r\n for (const [value, bucket] of buckets) {\r\n const groupKey = `${parentKey}/${level}:${typeof value}:${String(value)}`;\r\n const isCollapsed = !this.isGroupExpanded(groupKey);\r\n // dx three-way split: footer items → group footer row; alignByColumn items →\r\n // summary cells aligned under their column; the rest → \"(a, b)\" caption suffix.\r\n const alignedSums = new Map<string, string>();\r\n const captionParts: string[] = [];\r\n const footerSums = new Map<string, string>();\r\n for (const item of items) {\r\n const text = this.summaryText(item, bucket);\r\n if (item.showInGroupFooter()) {\r\n footerSums.set(this.summaryTarget(item), text);\r\n } else if (item.alignByColumn()) {\r\n alignedSums.set(this.summaryTarget(item), text);\r\n } else {\r\n captionParts.push(text);\r\n }\r\n }\r\n out.push({\r\n kind: 'group',\r\n level,\r\n column: col,\r\n text: this.cellText(col, bucket[0]),\r\n value: this.getRaw(bucket[0], col.dataField()),\r\n rows: bucket,\r\n groupKey,\r\n collapsed: isCollapsed,\r\n alignedSums,\r\n captionSuffix: captionParts.length ? ` (${captionParts.join(', ')})` : '',\r\n });\r\n if (!isCollapsed) {\r\n if (level + 1 < groupCols.length) {\r\n walk(bucket, level + 1, groupKey);\r\n } else {\r\n for (const r of bucket) {\r\n out.push({ kind: 'data', row: r, rowIndex: dataIndex++ });\r\n }\r\n }\r\n if (footerSums.size) {\r\n out.push({ kind: 'groupFooter', level, sums: footerSums });\r\n }\r\n }\r\n }\r\n };\r\n walk(rows, 0, '');\r\n return out;\r\n });\r\n\r\n /**\r\n * The dataField a group summary renders under: dx `_calculateSummaryCells` (m_summary.js:443)\r\n * takes `showInColumn` when it names a column, else the item's own `column`.\r\n *\r\n * Keying footers on `column()` alone put an item that names only `showInColumn` (broker's\r\n * `name=\"totalSumInsured\" showInColumn=\"totalSumInsured\" summaryType=\"custom\"`) under its\r\n * empty `column` - i.e. in whichever column happens to have no dataField.\r\n */\r\n private summaryTarget(item: NxeSummaryItemLike): string {\r\n const target = item.showInColumn();\r\n return target && this.columnByField().has(target) ? target : item.column();\r\n }\r\n\r\n /** Computes + formats a summary item over a set of rows. */\r\n private summaryText(item: NxeSummaryItemLike, rows: any[]): string {\r\n const field = item.column();\r\n let value: number;\r\n switch (item.summaryType()) {\r\n case 'custom':\r\n value = this.customSummaryValue(item, rows);\r\n break;\r\n case 'count':\r\n value = rows.length;\r\n break;\r\n case 'min':\r\n case 'max':\r\n case 'avg':\r\n case 'sum':\r\n default: {\r\n const nums = rows\r\n .map((r) => Number(this.getRaw(r, field)))\r\n .filter((n) => !isNaN(n));\r\n if (item.summaryType() === 'min') value = Math.min(...nums);\r\n else if (item.summaryType() === 'max') value = Math.max(...nums);\r\n else if (item.summaryType() === 'avg') value = nums.reduce((a, b) => a + b, 0) / (nums.length || 1);\r\n else value = nums.reduce((a, b) => a + b, 0);\r\n }\r\n }\r\n const fmt = item.valueFormat();\r\n const valueText =\r\n typeof fmt === 'string'\r\n ? formatNumber(value, parseNumberFormat(fmt), this.separators)\r\n : String(value);\r\n const ct = item.customizeText();\r\n const text = ct ? ct({ value, valueText }) : valueText;\r\n return item.displayFormat().replace('{0}', text);\r\n }\r\n\r\n /**\r\n * DevExtreme `calculateCustomSummary` protocol replay (orbit addition): `start`, then\r\n * `calculate` once per row (`options.value` = the row object, matching the app's\r\n * `generateSummaryFunction` which reads row properties), then `finalize`.\r\n */\r\n private customSummaryValue(item: NxeSummaryItemLike, rows: any[]): number {\r\n const fn = this.summaryCmp()?.calculateCustomSummary();\r\n if (!fn) {\r\n return 0;\r\n }\r\n const options: any = { name: item.name(), summaryProcess: 'start', totalValue: 0 };\r\n fn(options);\r\n options.summaryProcess = 'calculate';\r\n for (const row of rows) {\r\n options.value = row;\r\n fn(options);\r\n }\r\n options.summaryProcess = 'finalize';\r\n delete options.value;\r\n fn(options);\r\n return Number(options.totalValue) || 0;\r\n }\r\n\r\n protected toggleGroup(groupKey: string): void {\r\n const expanded = this.isGroupExpanded(groupKey);\r\n this.groupExpandOverride.update((m) => new Map(m).set(groupKey, !expanded));\r\n }\r\n\r\n protected goToPage(index: number): void {\r\n const next = Math.max(0, Math.min(index, this.pageCount() - 1));\r\n if (next !== this.pageIndex()) {\r\n this.pageIndex.set(next);\r\n // Write back so `[(pageIndex)]` reflects a page the grid moved to itself.\r\n this.pagingCmp()?.pageIndex.set(next);\r\n this.onOptionChanged.emit({ name: 'paging', fullName: 'paging.pageIndex', value: next });\r\n }\r\n }\r\n protected prevPage(): void {\r\n this.goToPage(this.currentPage() - 1);\r\n }\r\n protected nextPage(): void {\r\n this.goToPage(this.currentPage() + 1);\r\n }\r\n protected changePageSize(size: number): void {\r\n this.userPageSize.set(size);\r\n this.pageIndex.set(0);\r\n }\r\n protected onPageSizeSelect(event: Event): void {\r\n this.changePageSize(Number((event.target as HTMLSelectElement).value));\r\n }\r\n /** dx's info text, `Page {0} of {1} ({2} items)` unless `infoText` says otherwise (pagination/info.js). */\r\n protected readonly pageInfo = computed(() =>\r\n nxePagerInfoText(\r\n this.pagerCmp()?.infoText() ?? NXE_PAGER_INFO_TEXT,\r\n this.currentPage(),\r\n this.pageCount(),\r\n this.displayRows().length,\r\n ),\r\n );\r\n\r\n // --- Runtime group state (drag-to-group backbone) --------------------------------------------\r\n private static readonly fieldArrayEqual = (a: readonly string[], b: readonly string[]): boolean =>\r\n a.length === b.length && a.every((v, i) => v === b[i]);\r\n\r\n /**\r\n * Declarative seed: ordered dataFields of columns declaring `groupIndex`. Custom equality so\r\n * unrelated column-input churn (captions, widths, lookups) can never reset runtime drag state.\r\n */\r\n private readonly declaredGroupFields = computed<readonly string[]>(\r\n () =>\r\n this.columns()\r\n .filter((c) => c.groupIndex() != null)\r\n .sort((a, b) => (a.groupIndex() ?? 0) - (b.groupIndex() ?? 0))\r\n .map((c) => c.dataField()),\r\n { equal: NxeDataGridComponent.fieldArrayEqual },\r\n );\r\n\r\n /**\r\n * THE group state — array order == group level. Runtime gestures (drag-to-group, chip\r\n * drag-out/reorder, clearGrouping) win until the declarative seed itself changes\r\n * (generic-list re-seeds `groupIndex` from localStorage through `filterResource`).\r\n */\r\n private readonly groupedFields = linkedSignal<readonly string[], readonly string[]>({\r\n source: () => this.declaredGroupFields(),\r\n computation: (seed) => seed,\r\n });\r\n\r\n /**\r\n * Per-grouped-column sort direction (dx: grouping a column sorts it ascending; clicking its\r\n * group-panel chip cycles asc↔desc). Pruned to the currently grouped fields so a re-grouped\r\n * column starts fresh at `asc`.\r\n */\r\n private readonly groupSortDir = linkedSignal<\r\n readonly string[],\r\n ReadonlyMap<string, 'asc' | 'desc'>\r\n >({\r\n source: () => this.groupedFields(),\r\n computation: (fields, previous) => {\r\n const prev = previous?.value;\r\n const next = new Map<string, 'asc' | 'desc'>();\r\n if (prev) {\r\n for (const field of fields) {\r\n const dir = prev.get(field);\r\n if (dir) {\r\n next.set(field, dir);\r\n }\r\n }\r\n }\r\n return next;\r\n },\r\n });\r\n\r\n /** Columns moved into group rows, in group-level order. */\r\n protected readonly groupColumns = computed(() =>\r\n this.groupedFields()\r\n .map((field) => this.columns().find((c) => c.dataField() === field))\r\n .filter((c): c is NxeColumnComponent => !!c),\r\n );\r\n\r\n /** The active sort direction of a grouped column (chip indicator + group-order comparator). */\r\n protected groupDir(col: NxeColumnComponent): 'asc' | 'desc' {\r\n return this.groupSortDir().get(col.dataField()) ?? col.sortOrder() ?? 'asc';\r\n }\r\n\r\n /** Chip click (dx): cycle the grouped column's sort asc↔desc — never back to none. */\r\n protected sortGroupColumn(col: NxeColumnComponent): void {\r\n const field = col.dataField();\r\n if (!this.groupedFields().includes(field)) {\r\n return;\r\n }\r\n const next = this.groupDir(col) === 'asc' ? 'desc' : 'asc';\r\n this.groupSortDir.update((m) => new Map(m).set(field, next));\r\n }\r\n\r\n /** Gesture: drag a header into the group panel — append as the last group level. */\r\n protected groupByColumn(col: NxeColumnComponent): void {\r\n const field = col.dataField();\r\n // allowGrouping guard here too: with allowColumnReordering on, headers are draggable\r\n // even when the column refuses grouping — a panel drop must then be a no-op.\r\n if (!field || !col.allowGrouping() || this.groupedFields().includes(field)) {\r\n return;\r\n }\r\n const level = this.groupedFields().length;\r\n // dx moves an active user sort on this column onto the group level (chip indicator).\r\n const current = this.sortInit() ? this.sort() : null;\r\n this.groupedFields.update((fields) => [...fields, field]);\r\n if (current?.field === field) {\r\n this.groupSortDir.update((m) => new Map(m).set(field, current.dir));\r\n this.sort.set(null);\r\n }\r\n this.emitGroupIndexChange(this.columns().indexOf(col), null, level);\r\n }\r\n\r\n /** Gesture: drag a chip out of the group panel — remove that group level. */\r\n protected ungroupColumn(field: string): void {\r\n const fields = this.groupedFields();\r\n const level = fields.indexOf(field);\r\n if (level === -1) {\r\n return;\r\n }\r\n // dx keeps the column sorted when it leaves the group panel: restore its group direction\r\n // as the header sort — unless another column already carries the active user sort.\r\n const col = this.columns().find((c) => c.dataField() === field);\r\n const dir = col ? this.groupDir(col) : 'asc';\r\n this.groupedFields.set(fields.filter((f) => f !== field));\r\n if (!this.effectiveSort()) {\r\n this.sortInit.set(true);\r\n this.sort.set({ field, dir });\r\n }\r\n this.emitGroupIndexChange(\r\n this.columns().findIndex((c) => c.dataField() === field),\r\n level,\r\n null,\r\n );\r\n }\r\n\r\n /**\r\n * Gesture: reorder chips within the group panel — move a group level.\r\n *\r\n * Emission contract: generic-list's frozen handler replays each event as a positional SWAP,\r\n * while a chip drag is a MOVE. The two only coincide for adjacent positions, so a distance-n\r\n * move emits n adjacent-swap events (each adjacent swap == the corresponding move step) —\r\n * the replayed array converges to exactly the grid's order.\r\n */\r\n protected moveGroup(from: number, to: number): void {\r\n const fields = this.groupedFields();\r\n if (from === to || from < 0 || to < 0 || from >= fields.length || to >= fields.length) {\r\n return;\r\n }\r\n const next = [...fields];\r\n const [moved] = next.splice(from, 1);\r\n next.splice(to, 0, moved);\r\n this.groupedFields.set(next);\r\n const movedColumnIndex = this.columns().findIndex((c) => c.dataField() === moved);\r\n const step = from < to ? 1 : -1;\r\n for (let level = from; level !== to; level += step) {\r\n this.emitGroupIndexChange(movedColumnIndex, level, level + step);\r\n }\r\n }\r\n\r\n /**\r\n * Real dx `clearGrouping()`: ungroup everything. Removal events fire in DESCENDING level\r\n * order so generic-list's `splice(previousValue, 1)` replay converges to `[]`.\r\n */\r\n private clearGroupingInternal(): void {\r\n const fields = this.groupedFields();\r\n if (!fields.length) {\r\n return;\r\n }\r\n this.groupedFields.set([]);\r\n for (let level = fields.length - 1; level >= 0; level--) {\r\n this.emitGroupIndexChange(\r\n this.columns().findIndex((c) => c.dataField() === fields[level]),\r\n level,\r\n null,\r\n );\r\n }\r\n }\r\n\r\n private emitGroupIndexChange(\r\n columnIndex: number,\r\n previousValue: number | null,\r\n value: number | null,\r\n ): void {\r\n this.onOptionChanged.emit({\r\n name: 'columns',\r\n fullName: `columns[${columnIndex}].groupIndex`,\r\n previousValue,\r\n value,\r\n });\r\n }\r\n\r\n // --- Runtime column order (allowColumnReordering) + width (allowColumnResizing) overrides ----\r\n private readonly declaredFieldOrder = computed<readonly string[]>(\r\n () => this.columns().map((c) => c.dataField()),\r\n { equal: NxeDataGridComponent.fieldArrayEqual },\r\n );\r\n /** Runtime column order; header drag-reorder wins until the declared column set changes. */\r\n private readonly fieldOrder = linkedSignal<readonly string[], readonly string[]>({\r\n source: () => this.declaredFieldOrder(),\r\n computation: (seed) => seed,\r\n });\r\n\r\n private readonly declaredWidthsKey = computed(() =>\r\n this.columns()\r\n .map((c) => `${c.dataField()}:${c.width() ?? ''}`)\r\n .join('|'),\r\n );\r\n /**\r\n * Manual column widths (px). Populated on the first resize with a snapshot of every rendered\r\n * width — freezing the layout like dx — and reset when declared widths change.\r\n */\r\n private readonly widthOverride = linkedSignal<string, ReadonlyMap<string, number>>({\r\n source: () => this.declaredWidthsKey(),\r\n computation: () => new Map(),\r\n });\r\n\r\n /** Visible data columns: `visible`/`columnOption` honoured, grouped columns excluded. */\r\n protected readonly visibleColumns = computed(() => {\r\n const grouped = new Set(this.groupColumns());\r\n const filtered = this.columns().filter((c) => {\r\n if (grouped.has(c)) {\r\n return false;\r\n }\r\n const override = this.visibilityOverride().get(c.dataField());\r\n return override ?? c.visible();\r\n });\r\n const pos = new Map<string, number>();\r\n this.fieldOrder().forEach((f, i) => pos.set(f, i));\r\n return [...filtered].sort(\r\n (a, b) => (pos.get(a.dataField()) ?? 0) - (pos.get(b.dataField()) ?? 0),\r\n );\r\n });\r\n\r\n /**\r\n * How many header rows the band structure needs, counted over the VISIBLE tree.\r\n *\r\n * Pruning matters: a band whose every leaf is hidden or grouped away contributes no row, so\r\n * a grid that loses its last band collapses back to a single header row rather than keeping\r\n * an empty one.\r\n */\r\n protected readonly headerDepth = computed(() => {\r\n const visible = new Set(this.visibleColumns());\r\n const depthOf = (cols: readonly NxeColumnComponent[]): number => {\r\n let d = 0;\r\n for (const col of cols) {\r\n if (col.isBand()) {\r\n const inner = depthOf(col.childColumns());\r\n if (inner > 0) {\r\n d = Math.max(d, 1 + inner);\r\n }\r\n } else if (visible.has(col)) {\r\n d = Math.max(d, 1);\r\n }\r\n }\r\n return d;\r\n };\r\n return Math.max(1, depthOf(this.declaredColumns()));\r\n });\r\n\r\n /**\r\n * The header as rows of cells: bands carry `colspan`, leaves above the bottom row carry\r\n * `rowspan`, which is dx's own banded markup.\r\n */\r\n protected readonly headerRows = computed<NxeHeaderCell[][]>(() => {\r\n const visible = this.visibleColumns();\r\n const visibleSet = new Set(visible);\r\n const indexOfLeaf = new Map<NxeColumnComponent, number>();\r\n visible.forEach((c, i) => indexOfLeaf.set(c, i));\r\n\r\n const visibleLeaves = (col: NxeColumnComponent): number =>\r\n col.isBand()\r\n ? col.childColumns().reduce((n, c) => n + visibleLeaves(c), 0)\r\n : visibleSet.has(col)\r\n ? 1\r\n : 0;\r\n\r\n // Siblings render in visible-leaf order, not declaration order: a drag-reorder rewrites\r\n // `visibleColumns()` and the header has to follow, or the body reorders under a header\r\n // that did not. A band takes the position of its leftmost leaf.\r\n const orderOf = (col: NxeColumnComponent): number => {\r\n if (!col.isBand()) {\r\n return indexOfLeaf.get(col) ?? Number.MAX_SAFE_INTEGER;\r\n }\r\n return col.childColumns().reduce((min, c) => Math.min(min, orderOf(c)), Number.MAX_SAFE_INTEGER);\r\n };\r\n\r\n const depth = this.headerDepth();\r\n const rows: NxeHeaderCell[][] = Array.from({ length: depth }, () => []);\r\n const walk = (cols: readonly NxeColumnComponent[], level: number): void => {\r\n for (const col of [...cols].sort((a, b) => orderOf(a) - orderOf(b))) {\r\n const span = visibleLeaves(col);\r\n if (span === 0) {\r\n continue;\r\n }\r\n if (col.isBand()) {\r\n rows[level].push({\r\n column: col,\r\n colspan: span,\r\n rowspan: 1,\r\n isBand: true,\r\n leafIndex: null,\r\n });\r\n walk(col.childColumns(), level + 1);\r\n } else {\r\n rows[level].push({\r\n column: col,\r\n colspan: 1,\r\n rowspan: depth - level,\r\n isBand: false,\r\n leafIndex: indexOfLeaf.get(col) ?? null,\r\n });\r\n }\r\n }\r\n };\r\n walk(this.declaredColumns(), 0);\r\n return rows;\r\n });\r\n\r\n /** Drag-reorder drop: move visible column `fromVis` to insertion `slot` (dx visibleIndex). */\r\n protected moveColumnByVisible(fromVis: number, slot: number): void {\r\n const vis = this.visibleColumns();\r\n const moved = vis[fromVis]?.dataField();\r\n if (!moved) {\r\n return;\r\n }\r\n const target = slot > fromVis ? slot - 1 : slot;\r\n if (target === fromVis) {\r\n return;\r\n }\r\n const without = vis.filter((_, i) => i !== fromVis);\r\n const anchor = without[target]?.dataField() ?? null;\r\n const order = this.fieldOrder().filter((f) => f !== moved);\r\n const idx = anchor ? order.indexOf(anchor) : order.length;\r\n const next = [...order];\r\n next.splice(idx, 0, moved);\r\n this.fieldOrder.set(next);\r\n this.onOptionChanged.emit({\r\n name: 'columns',\r\n fullName: `columns[${this.columns().findIndex((c) => c.dataField() === moved)}].visibleIndex`,\r\n previousValue: fromVis,\r\n value: target,\r\n });\r\n }\r\n\r\n /** True when this header renders a resize handle on its right edge. */\r\n protected resizeHandleVisible(col: NxeColumnComponent, ci: number): boolean {\r\n if (!this.allowColumnResizing() || !col.allowResizing()) {\r\n return false;\r\n }\r\n return this.columnResizingMode() === 'widget' || ci < this.visibleColumns().length - 1;\r\n }\r\n\r\n protected startColumnResize(col: NxeColumnComponent, ci: number, event: PointerEvent): void {\r\n const next =\r\n this.columnResizingMode() === 'nextColumn' ? this.visibleColumns()[ci + 1] ?? null : null;\r\n this.resize.start(col.dataField(), next?.dataField() ?? null, ci, this.leadCellCount(), event);\r\n }\r\n\r\n /** A visible column's position, for cells rendered outside the main `@for` index. */\r\n protected visibleIndexOf(col: NxeColumnComponent): number {\r\n return this.visibleColumns().indexOf(col);\r\n }\r\n\r\n /** Command columns preceding the data columns — the offset dx's 1-based aria-colindex counts from. */\r\n protected leadCellCount(): number {\r\n return (\r\n this.groupLevelCount() +\r\n (this.masterDetailEnabled() ? 1 : 0) +\r\n (this.showCheckboxes() ? 1 : 0)\r\n );\r\n }\r\n\r\n // dx numbers every cell of a rows-view row, command cells included (`_setCellAriaAttributes`,\r\n // m_columns_view.js:681-693): the group indents are 1..n, then the master-detail expander, the\r\n // selection column, the data columns and the edit column. Apps address cells by it - bright's\r\n // merge helper lifts `td[aria-colindex=\"1\"]` out of a merged row, which in a grouped grid is\r\n // the indent cell - so the command cells carry it too.\r\n /** The master-detail expander's aria-colindex: straight after the group indents. */\r\n protected readonly expandColIndex = computed(() => this.groupLevelCount() + 1);\r\n /** The selection column's aria-colindex: after the indents and the expander. */\r\n protected readonly selectColIndex = computed(\r\n () => this.groupLevelCount() + (this.masterDetailEnabled() ? 1 : 0) + 1,\r\n );\r\n /** The row-edit command column's aria-colindex: after the last data column. */\r\n protected readonly editColIndex = computed(\r\n () => this.leadCellCount() + this.visibleColumns().length + 1,\r\n );\r\n\r\n /** Resize commit: freeze all rendered widths (dx post-resize behavior) + emit width events. */\r\n private commitColumnResize(changes: { field: string; from: number; to: number }[]): void {\r\n const map = new Map(this.widthOverride());\r\n const cells = nxeHeaderLeafCells(this.elementRef.nativeElement as HTMLElement);\r\n this.visibleColumns().forEach((c, i) => {\r\n const cell = cells[i];\r\n if (cell) {\r\n map.set(c.dataField(), Math.round(cell.getBoundingClientRect().width * 100) / 100);\r\n }\r\n });\r\n for (const ch of changes) {\r\n map.set(ch.field, Math.round(ch.to * 100) / 100);\r\n }\r\n this.resizeActive = false;\r\n this.widthOverride.set(map);\r\n for (const ch of changes) {\r\n this.onOptionChanged.emit({\r\n name: 'columns',\r\n fullName: `columns[${this.columns().findIndex((c) => c.dataField() === ch.field)}].width`,\r\n previousValue: ch.from,\r\n value: ch.to,\r\n });\r\n }\r\n }\r\n\r\n protected readonly filterRowVisible = computed(\r\n () => this.filterRow()?.visible === true || this.filterRowCmp()?.visible() === true,\r\n );\r\n\r\n // --- Master-detail (dxo-master-detail, orbit addition) --------------------------------------\r\n protected readonly masterDetailEnabled = computed(() => this.masterDetail()?.enabled() === true);\r\n private readonly expandedDetails = signal<ReadonlySet<any>>(new Set());\r\n\r\n protected isDetailExpanded(row: any): boolean {\r\n return this.expandedDetails().has(this.rowKey(row));\r\n }\r\n\r\n protected toggleDetail(row: any, event: Event): void {\r\n event.stopPropagation();\r\n const key = this.rowKey(row);\r\n const expanding = !this.expandedDetails().has(key);\r\n if (expanding) {\r\n this.onRowExpanding.emit({ key, component: this.facade });\r\n }\r\n this.expandedDetails.update((set) => {\r\n const next = new Set(set);\r\n expanding ? next.add(key) : next.delete(key);\r\n return next;\r\n });\r\n if (expanding) {\r\n this.onRowExpanded.emit({ key, component: this.facade });\r\n }\r\n }\r\n\r\n protected detailTemplate() {\r\n return this.templateFor(this.masterDetail()?.template());\r\n }\r\n\r\n protected detailContext(row: any, rowIndex: number): { $implicit: { data: any; rowIndex: number; key: any } } {\r\n return { $implicit: { data: row, rowIndex, key: this.rowKey(row) } };\r\n }\r\n\r\n /** Group indent levels (dx renders one 30px command column per group level; grid mode only). */\r\n protected readonly groupLevelCount = computed(() =>\r\n this.treeMode ? 0 : this.groupColumns().length,\r\n );\r\n\r\n protected indents(count: number): number[] {\r\n return Array.from({ length: count }, (_, i) => i);\r\n }\r\n\r\n /** Visible columns from the first alignByColumn target onward — each gets its own summary td. */\r\n protected groupRowTrailing(item: {\r\n level: number;\r\n alignedSums: Map<string, string>;\r\n }): NxeColumnComponent[] {\r\n if (!item.alignedSums.size) {\r\n return [];\r\n }\r\n const cols = this.visibleColumns();\r\n const first = cols.findIndex((c) => item.alignedSums.has(c.dataField()));\r\n if (first === -1) {\r\n return [];\r\n }\r\n let trailing = cols.slice(first);\r\n // The caption cell needs at least one column of room — trim leading trailing cells\r\n // instead of letting the colspan clamp shift the summary alignment.\r\n const maxTrailing =\r\n this.allColCount() - item.level - 2 - (this.rowEditCommandVisible() ? 1 : 0);\r\n if (trailing.length > maxTrailing) {\r\n trailing = trailing.slice(trailing.length - Math.max(0, maxTrailing));\r\n }\r\n return trailing;\r\n }\r\n\r\n /** dx group-cell span: everything after the expand cell not taken by aligned summary cells. */\r\n protected groupCellColspan(item: { level: number; alignedSums: Map<string, string> }): number {\r\n const trailing = this.groupRowTrailing(item).length;\r\n const editTd = trailing > 0 && this.rowEditCommandVisible() ? 1 : 0;\r\n return Math.max(1, this.allColCount() - item.level - 1 - trailing - editTd);\r\n }\r\n\r\n /** Total column count including command columns (indents/checkbox/expand/edit) for colspans. */\r\n protected readonly allColCount = computed(\r\n () =>\r\n (this.groupLevelCount() +\r\n this.visibleColumns().length +\r\n (this.showCheckboxes() ? 1 : 0) +\r\n (this.masterDetailEnabled() ? 1 : 0) +\r\n (this.rowEditCommandVisible() ? 1 : 0)) ||\r\n 1,\r\n );\r\n\r\n // --- Inline editing (dxo-editing, orbit addition) -------------------------------------------\r\n protected readonly cellEditingEnabled = computed(() => {\r\n const e = this.editingCmp();\r\n return !!e && e.mode() === 'cell' && e.allowUpdating();\r\n });\r\n protected readonly rowEditingEnabled = computed(() => {\r\n const e = this.editingCmp();\r\n return !!e && e.mode() === 'row' && e.allowUpdating();\r\n });\r\n protected readonly rowEditCommandVisible = computed(() => this.rowEditingEnabled());\r\n\r\n /** The single cell in edit mode (`cell` mode): row ref + dataField. */\r\n protected readonly editingCell = signal<{ row: any; field: string } | null>(null);\r\n /** Buffered values for the row in edit mode (`row` mode), keyed by dataField. */\r\n protected readonly rowEditBuffer = signal<Record<string, any>>({});\r\n\r\n protected isEditingCell(row: any, col: NxeColumnComponent): boolean {\r\n const c = this.editingCell();\r\n return !!c && c.row === row && c.field === col.dataField();\r\n }\r\n\r\n protected isRowEditing(row: any): boolean {\r\n return this.rowEditingEnabled() && this.editingCmp()?.editRowKey() === this.rowKey(row);\r\n }\r\n\r\n protected editableCell(col: NxeColumnComponent): boolean {\r\n if (col.allowEditing() === false || !col.dataField()) {\r\n return false;\r\n }\r\n // A `cellTemplate` cell renders its own content, so the built-in editor stays out of its\r\n // way. Naming an `editCellTemplate` is an explicit request to edit it anyway — which is\r\n // broker's dominant shape, where `customizeText`/`format` render the cell at rest and a\r\n // projected editor takes over on click.\r\n return !!col.editCellTemplate() || !col.cellTemplate();\r\n }\r\n\r\n protected onCellClick(row: any, col: NxeColumnComponent, event: Event): void {\r\n if (!this.cellEditingEnabled() || !this.editableCell(col)) {\r\n return;\r\n }\r\n event.stopPropagation();\r\n // A boolean cell already shows its editor (dx showEditorAlways); only its checkbox\r\n // toggles, so a click beside the box does not swap anything in.\r\n if (this.booleanInPlace(col)) {\r\n return;\r\n }\r\n this.editingCell.set({ row, field: col.dataField() });\r\n }\r\n\r\n /**\r\n * dx `readOnly: !options.setValue` (m_editing.js:210): a grid checkbox is editable only where\r\n * dx gives the cell a setValue - cell mode on an editable column (m_editing.js:1832-1847). Row\r\n * mode's resting rows stay read-only; the row being edited renders the editor instead.\r\n */\r\n protected booleanReadOnly(col: NxeColumnComponent): boolean {\r\n return !(this.cellEditingEnabled() && this.editableCell(col));\r\n }\r\n\r\n /**\r\n * A boolean cell that is its own editor: cell mode, editable, and no editCellTemplate asking\r\n * to take over. The resting checkbox toggles in place, as dx's always-shown dxCheckBox does.\r\n */\r\n protected booleanInPlace(col: NxeColumnComponent): boolean {\r\n return this.isBooleanCell(col) && !this.booleanReadOnly(col) && !col.editCellTemplate();\r\n }\r\n\r\n /** A resting boolean checkbox was clicked: toggle it when it is editable, else let it be. */\r\n protected onBooleanCellClick(row: any, col: NxeColumnComponent, event: Event): void {\r\n if (!this.booleanInPlace(col)) {\r\n return;\r\n }\r\n event.stopPropagation();\r\n this.commitCellEdit(row, col, this.getRaw(row, col.dataField()) !== true);\r\n }\r\n\r\n /**\r\n * The checkbox editor's state: the buffered value in the row being edited, else the row's.\r\n * Read as the native editor it replaces read it - any value but '' and 'false' is checked.\r\n */\r\n protected editorChecked(row: any, col: NxeColumnComponent): boolean {\r\n const text = this.editorInputValue(row, col);\r\n return !!text && text !== 'false';\r\n }\r\n\r\n /** A click or Space on the checkbox editor. Space must not scroll the page or reach the grid. */\r\n protected toggleEditorCheck(row: any, col: NxeColumnComponent, mode: 'cell' | 'row', event: Event): void {\r\n event.preventDefault();\r\n event.stopPropagation();\r\n const next = !this.editorChecked(row, col);\r\n mode === 'cell' ? this.commitCellEdit(row, col, next) : this.bufferRowEdit(col, next);\r\n }\r\n\r\n /** dx cell-mode semantics: commit to the row on blur/Enter (client-side array write-through). */\r\n protected commitCellEdit(row: any, col: NxeColumnComponent, rawInput: any): void {\r\n this.writeCell(row, col, rawInput);\r\n this.editingCell.set(null);\r\n this.refreshTick.update((v) => v + 1);\r\n }\r\n\r\n /** Write a cell value through the grid's own path, leaving edit state alone (dx `setValue`). */\r\n private writeCellValue(row: any, col: NxeColumnComponent, value: any): void {\r\n this.writeCell(row, col, value);\r\n this.refreshTick.update((v) => v + 1);\r\n }\r\n\r\n protected cancelCellEdit(): void {\r\n this.editingCell.set(null);\r\n }\r\n\r\n /**\r\n * Leave cell-edit state when focus goes somewhere outside the cell.\r\n *\r\n * The built-in editor commits on its own blur, but a projected `editCellTemplate` has no such\r\n * contract, so the cell needs to notice for itself. Nothing is committed here: those templates\r\n * write through the live row object, so leaving edit state is purely a view change.\r\n *\r\n * A projected picker opens its panel in a CDK overlay appended to `<body>`, which means focus\r\n * legitimately leaves the `<td>` while the edit is still going on — hence the second guard.\r\n */\r\n protected onEditCellFocusOut(row: any, col: NxeColumnComponent, event: FocusEvent): void {\r\n if (!col.editCellTemplate() || !this.isEditingCell(row, col)) {\r\n return;\r\n }\r\n const td = event.currentTarget as HTMLElement | null;\r\n const next = event.relatedTarget as Node | null;\r\n if (!td || (next && td.contains(next))) {\r\n return;\r\n }\r\n if (document.querySelector('.cdk-overlay-container')?.hasChildNodes()) {\r\n return;\r\n }\r\n this.editingCell.set(null);\r\n }\r\n\r\n private writeCell(row: any, col: NxeColumnComponent, rawInput: any): void {\r\n const field = col.dataField();\r\n let value: any = rawInput;\r\n if (this.colType(col) === 'number' && typeof rawInput === 'string') {\r\n const n = Number(rawInput.replace(/,/g, ''));\r\n value = rawInput.trim() === '' || isNaN(n) ? null : n;\r\n }\r\n if (field.includes('.')) {\r\n const parts = field.split('.');\r\n const last = parts.pop()!;\r\n const target = parts.reduce((o: any, k) => (o == null ? o : o[k]), row);\r\n if (target != null) {\r\n target[last] = value;\r\n }\r\n return;\r\n }\r\n row[field] = value;\r\n }\r\n\r\n protected startRowEdit(row: any, event: Event): void {\r\n event.stopPropagation();\r\n this.editingCmp()?.editRowKey.set(this.rowKey(row));\r\n this.rowEditBuffer.set({});\r\n }\r\n\r\n protected bufferRowEdit(col: NxeColumnComponent, rawInput: any): void {\r\n this.rowEditBuffer.update((b) => ({ ...b, [col.dataField()]: rawInput }));\r\n }\r\n\r\n /** dx row-mode Save: apply the buffer to the row and record an `update` change. */\r\n protected saveRowEdit(row: any, event: Event): void {\r\n event.stopPropagation();\r\n const editing = this.editingCmp();\r\n if (!editing) {\r\n return;\r\n }\r\n const buffer = this.rowEditBuffer();\r\n const data: Record<string, any> = {};\r\n for (const [field, raw] of Object.entries(buffer)) {\r\n const col = this.columns().find((c) => c.dataField() === field);\r\n if (col) {\r\n this.writeCell(row, col, raw);\r\n data[field] = this.getRaw(row, field);\r\n }\r\n }\r\n if (Object.keys(data).length) {\r\n editing.changes.update((list) => [\r\n ...list.filter((c) => !(c.type === 'update' && c.key === this.rowKey(row))),\r\n { type: 'update', key: this.rowKey(row), data },\r\n ]);\r\n }\r\n editing.editRowKey.set(null);\r\n this.rowEditBuffer.set({});\r\n this.refreshTick.update((v) => v + 1);\r\n }\r\n\r\n protected cancelRowEdit(event: Event): void {\r\n event.stopPropagation();\r\n this.editingCmp()?.editRowKey.set(null);\r\n this.rowEditBuffer.set({});\r\n }\r\n\r\n protected editorInputValue(row: any, col: NxeColumnComponent): string {\r\n if (this.isRowEditing(row)) {\r\n const buffered = this.rowEditBuffer()[col.dataField()];\r\n if (buffered !== undefined) {\r\n return String(buffered);\r\n }\r\n }\r\n const raw = this.getRaw(row, col.dataField());\r\n return raw == null ? '' : String(raw);\r\n }\r\n\r\n // --- Cell merge (`[mergeColumns]`, orbit addition) ------------------------------------------\r\n /**\r\n * Rowspan map over `renderRows`: `\"<renderIndex>:<field>\"` → span (>1 = merged head,\r\n * 0 = suppressed continuation, absent = normal cell). Hierarchical: a value break in an\r\n * earlier merge column breaks all later ones; group/detail rows break every run.\r\n */\r\n protected readonly mergeSpans = computed<ReadonlyMap<string, number>>(() => {\r\n const fields = this.mergeColumns();\r\n const map = new Map<string, number>();\r\n if (!fields.length) {\r\n return map;\r\n }\r\n const rows = this.renderRows();\r\n // runStart[f] = renderRows index where the current run for field f began.\r\n const runStart = new Map<string, number>();\r\n const runLength = new Map<string, number>();\r\n const flush = (field: string): void => {\r\n const start = runStart.get(field);\r\n const len = runLength.get(field) ?? 0;\r\n if (start !== undefined && len > 1) {\r\n map.set(`${start}:${field}`, len);\r\n for (let i = start + 1; i < start + len; i++) {\r\n map.set(`${i}:${field}`, 0);\r\n }\r\n }\r\n runStart.delete(field);\r\n runLength.delete(field);\r\n };\r\n let prevRow: any = null;\r\n rows.forEach((item, idx) => {\r\n if (item.kind !== 'data') {\r\n fields.forEach(flush);\r\n prevRow = null;\r\n return;\r\n }\r\n let broken = false;\r\n for (const field of fields) {\r\n const same =\r\n !broken &&\r\n prevRow != null &&\r\n this.getRaw(prevRow, field) === this.getRaw(item.row, field) &&\r\n this.getRaw(item.row, field) != null &&\r\n this.getRaw(item.row, field) !== '';\r\n if (same) {\r\n runLength.set(field, (runLength.get(field) ?? 1) + 1);\r\n } else {\r\n broken = true;\r\n flush(field);\r\n runStart.set(field, idx);\r\n runLength.set(field, 1);\r\n }\r\n }\r\n prevRow = item.row;\r\n });\r\n fields.forEach(flush);\r\n return map;\r\n });\r\n\r\n protected mergeSpan(renderIndex: number, col: NxeColumnComponent): number | null {\r\n if (!this.mergeColumns().includes(col.dataField())) {\r\n return null;\r\n }\r\n return this.mergeSpans().get(`${renderIndex}:${col.dataField()}`) ?? null;\r\n }\r\n\r\n protected isMergeSuppressed(renderIndex: number, col: NxeColumnComponent): boolean {\r\n return this.mergeSpan(renderIndex, col) === 0;\r\n }\r\n\r\n private readonly columnByField = computed<ReadonlyMap<string, NxeColumnComponent>>(() => {\r\n const map = new Map<string, NxeColumnComponent>();\r\n for (const c of this.columns()) {\r\n map.set(c.dataField(), c);\r\n }\r\n return map;\r\n });\r\n\r\n private readonly filterRowPredicate = computed<((row: any) => boolean) | null>(() => {\r\n const state = this.filterRowState();\r\n if (!state.size) {\r\n return null;\r\n }\r\n const byField = this.columnByField();\r\n const matchers: ((row: any) => boolean)[] = [];\r\n for (const [field, entry] of state) {\r\n const col = byField.get(field);\r\n if (!col) {\r\n continue;\r\n }\r\n const matcher = this.buildFilterRowMatcher(col, entry);\r\n if (matcher) {\r\n matchers.push(matcher);\r\n }\r\n }\r\n return matchers.length ? (row) => matchers.every((m) => m(row)) : null;\r\n });\r\n\r\n /** Builds one column's filter-row matcher; null when the entry has no effective value yet. */\r\n private buildFilterRowMatcher(\r\n col: NxeColumnComponent,\r\n entry: FilterRowEntry,\r\n ): ((row: any) => boolean) | null {\r\n const kind = this.frEditorKind(col);\r\n const t1 = entry.text.trim();\r\n const t2 = (entry.text2 ?? '').trim();\r\n if (!t1 && !t2) {\r\n return null;\r\n }\r\n if (kind === 'lookup' || kind === 'boolean') {\r\n // select editors: dx filters by '=' on the raw value; 'false' must NOT match blanks\r\n return (row) => {\r\n const raw = this.getRaw(row, col.dataField());\r\n if (kind === 'boolean') {\r\n return t1 === 'true' ? raw === true : raw === false;\r\n }\r\n return String(raw ?? '') === t1;\r\n };\r\n }\r\n if (kind === 'number') {\r\n const v1 = t1 ? Number(t1.replace(/,/g, '')) : null;\r\n const v2 = t2 ? Number(t2.replace(/,/g, '')) : null;\r\n if ((t1 && Number.isNaN(v1)) || (t2 && Number.isNaN(v2))) {\r\n return null; // dx applies nothing until the editor holds a valid number\r\n }\r\n return (row) => {\r\n const raw = this.getRaw(row, col.dataField());\r\n const n = raw == null || raw === '' ? null : Number(raw);\r\n if (n == null || Number.isNaN(n)) {\r\n return entry.op === '<>';\r\n }\r\n return this.matchScalar(entry.op, n, v1, v2);\r\n };\r\n }\r\n if (kind === 'date') {\r\n const d1 = t1 ? this.dayKey(t1) : null;\r\n const d2 = t2 ? this.dayKey(t2) : null;\r\n if ((t1 && !d1) || (t2 && !d2)) {\r\n return null;\r\n }\r\n return (row) => {\r\n const raw = this.getRaw(row, col.dataField());\r\n const day = raw == null || raw === '' ? null : this.dayKey(raw);\r\n if (!day) {\r\n return entry.op === '<>';\r\n }\r\n // dx expands date '=' to the whole day — day keys compare lexicographically.\r\n return this.matchScalar(entry.op, day, d1, d2);\r\n };\r\n }\r\n // string operations, case-insensitive over the displayed text\r\n const q = t1.toLowerCase();\r\n return (row) => {\r\n const text = this.cellText(col, row).toLowerCase();\r\n switch (entry.op) {\r\n case 'notcontains':\r\n return !text.includes(q);\r\n case 'startswith':\r\n return text.startsWith(q);\r\n case 'endswith':\r\n return text.endsWith(q);\r\n case '=':\r\n return text === q;\r\n case '<>':\r\n return text !== q;\r\n default:\r\n return text.includes(q);\r\n }\r\n };\r\n }\r\n\r\n private matchScalar<T extends number | string>(\r\n op: NxeFilterOp,\r\n value: T,\r\n v1: T | null,\r\n v2: T | null,\r\n ): boolean {\r\n switch (op) {\r\n case '<>':\r\n return value !== v1;\r\n case '<':\r\n return v1 != null && value < v1;\r\n case '<=':\r\n return v1 != null && value <= v1;\r\n case '>':\r\n return v1 != null && value > v1;\r\n case '>=':\r\n return v1 != null && value >= v1;\r\n case 'between':\r\n return (v1 == null || value >= v1) && (v2 == null || value <= v2);\r\n default:\r\n return value === v1;\r\n }\r\n }\r\n\r\n private dayKey(raw: any): string | null {\r\n const dt = parseDateValue(raw);\r\n return dt ? dt.toFormat('yyyy-MM-dd') : null;\r\n }\r\n\r\n /**\r\n * The applied header filters: runtime overrides win; untouched columns fall back to their\r\n * declarative `filterValues` seed. Values are normalized through `hfKey`.\r\n */\r\n private readonly effectiveHeaderFilters = computed<ReadonlyMap<string, ReadonlySet<any>>>(() => {\r\n const out = new Map<string, ReadonlySet<any>>();\r\n const override = this.hfOverride();\r\n for (const col of this.columns()) {\r\n const field = col.dataField();\r\n if (!field || out.has(field)) {\r\n continue;\r\n }\r\n if (override.has(field)) {\r\n const set = override.get(field);\r\n if (set) {\r\n out.set(field, set);\r\n }\r\n } else {\r\n const seed = col.filterValues();\r\n if (seed?.length) {\r\n out.set(field, new Set(seed.map((v) => this.hfKey(col, v))));\r\n }\r\n }\r\n }\r\n return out;\r\n });\r\n\r\n private readonly headerFilterPredicate = computed<((row: any) => boolean) | null>(() => {\r\n const hf = this.effectiveHeaderFilters();\r\n if (!hf.size) {\r\n return null;\r\n }\r\n const byField = this.columnByField();\r\n const entries = [...hf].map(([field, set]) => ({ field, set, col: byField.get(field) }));\r\n return (row) =>\r\n entries.every(({ field, set, col }) =>\r\n set.has(col ? this.hfKey(col, this.getRaw(row, field)) : this.getRaw(row, field)),\r\n );\r\n });\r\n\r\n /** dataSource → filter-row filters → header filters (sorting happens in `displayRows`). */\r\n private readonly filteredRows = computed<any[]>(() => {\r\n this.refreshTick();\r\n let rows = (this.dataSource() ?? []) as any[];\r\n const rowFilter = this.filterRowPredicate();\r\n if (rowFilter) {\r\n rows = rows.filter(rowFilter);\r\n }\r\n const hf = this.headerFilterPredicate();\r\n if (hf) {\r\n rows = rows.filter(hf);\r\n }\r\n return rows;\r\n });\r\n\r\n /**\r\n * dx sort semantics: grouped columns lead the sort expression in level order (each by its\r\n * group direction), then the user/declarative sort applies WITHIN the innermost groups.\r\n * Ungrouped grids keep the single-column behavior unchanged.\r\n */\r\n protected readonly displayRows = computed<any[]>(() => {\r\n const rows = this.filteredRows();\r\n const chain: SortState[] = [];\r\n if (!this.treeMode) {\r\n for (const col of this.groupColumns()) {\r\n chain.push({ field: col.dataField(), dir: this.groupDir(col) });\r\n }\r\n }\r\n const user = this.effectiveSort();\r\n if (user && !chain.some((s) => s.field === user.field)) {\r\n chain.push(user);\r\n }\r\n if (!chain.length) {\r\n return rows;\r\n }\r\n return [...rows].sort((a, b) => {\r\n for (const s of chain) {\r\n const r = this.compare(this.getRaw(a, s.field), this.getRaw(b, s.field));\r\n if (r !== 0) {\r\n return s.dir === 'asc' ? r : -r;\r\n }\r\n }\r\n return 0;\r\n });\r\n });\r\n\r\n protected readonly loading = computed(\r\n () => this.dataSource() == null && this.loadPanel()?.enabled !== false,\r\n );\r\n\r\n /**\r\n * dx `isEmpty()` = `!items().length` (m_data_controller.js:1044-1046), toggled as `dx-empty`\r\n * on the rows view in `_renderCore` (m_rows_view.js:710) whether loading or not.\r\n *\r\n * Keyed on `renderRows` - what the `<tbody>` iterates, dx's `items()` - not `displayRows`. The\r\n * two agree for flat and grouped grids (`pagedRows` clamps the page), but a tree list builds\r\n * `renderRows` from the unfiltered source while `displayRows` applies the filters, so a tree\r\n * whose filter matches nothing still renders rows and must not also show an empty body.\r\n */\r\n protected readonly isEmpty = computed(() => this.renderRows().length === 0);\r\n\r\n // --- Free-space row (dx m_rows_view.js updateFreeSpaceRowHeight, :816-861) --------------------\r\n /**\r\n * What the last reading of this grid's own layout found.\r\n *\r\n * - `bounded` is dx's `hasHeight`: the rows view is sized by the grid, not by its rows.\r\n * - `room` is dx's `elementHeightWithoutScrollbar - contentHeight` (m_rows_view.js:840-842): the\r\n * rows view's inner height less the table as it stands with the free-space row empty and the\r\n * last row keeping its line. Neither the row's height nor the last-row-border state changes\r\n * it, so what it decides cannot change the next reading.\r\n * - `fill` is dx's `resultHeight` (:844-848): the height that leaves the table 1px short of\r\n * the rows view (`_getHeightCorrection`, 1 in Chrome).\r\n * - `rowHeight` is dx's `_rowHeight`, the average rendered row. It sizes the gap that a short\r\n * last page leaves.\r\n */\r\n private readonly freeSpaceMeasure = signal(\r\n { bounded: false, room: 0, fill: 0, rowHeight: 0 },\r\n {\r\n equal: (a, b) =>\r\n a.bounded === b.bounded &&\r\n Math.abs(a.room - b.room) < 0.01 &&\r\n Math.abs(a.fill - b.fill) < 0.01 &&\r\n Math.abs(a.rowHeight - b.rowHeight) < 0.01,\r\n },\r\n );\r\n\r\n /**\r\n * dx's three cases, in its order:\r\n * - no rows: the row shows at 0px, so the last row keeps no border to lose (:857-860);\r\n * - a bounded grid whose rows leave room: the row fills it, less the 1px dx subtracts in\r\n * Chrome (`_getHeightCorrection`), and column lines run to the bottom (:837-855);\r\n * - an unbounded grid on a short page of several: the row holds the missing rows' height, so\r\n * the grid keeps its height from page to page (:823-835).\r\n *\r\n * `visible` drives the last row's border in a bordered grid (`_updateLastRowBorder`, :931-937).\r\n */\r\n private readonly freeSpace = computed<{ height: number; visible: boolean }>(() => {\r\n if (this.isEmpty()) {\r\n return { height: 0, visible: true };\r\n }\r\n const m = this.freeSpaceMeasure();\r\n if (m.bounded) {\r\n return m.room > 0\r\n ? { height: Math.max(0, m.fill), visible: true }\r\n : { height: 0, visible: false };\r\n }\r\n const missing = this.effectivePageSize() - this.pagedRows().length;\r\n const mode = this.scrolling()?.mode;\r\n if (\r\n !this.treeMode &&\r\n this.pagingEnabled() &&\r\n missing > 0 &&\r\n this.pageCount() > 1 &&\r\n mode !== 'virtual' &&\r\n mode !== 'infinite'\r\n ) {\r\n return { height: missing * m.rowHeight, visible: true };\r\n }\r\n return { height: 0, visible: false };\r\n });\r\n protected readonly freeSpaceHeight = computed(() => this.freeSpace().height);\r\n protected readonly freeSpaceVisible = computed(() => this.freeSpace().visible);\r\n\r\n /**\r\n * One reading of the rows view, from the ResizeObserver that watches it and its table.\r\n *\r\n * dx hides the free-space row and then measures (m_rows_view.js:837-848). This reading cannot\r\n * hide it - that would shrink the document and could clamp its scroll position - so it takes\r\n * the row's part of the table back out arithmetically, from quantities that do not move with\r\n * what the reading decides:\r\n *\r\n * - The row's box comes out whole: the height it was given, or with none, its halves of the\r\n * collapsed borders above and below it (0.5px under a last row with a 1px frame).\r\n * - With no free space shown, a bordered grid's last row gives its line to the box\r\n * (`nxe-last-row-border`, `border-bottom-width:0`), which makes the table a line shorter.\r\n * That line is put back, at the grid's line width, so the answer is the same either way.\r\n *\r\n * Read naively off the table, either one feeds back: the half-line reads as room, which shows\r\n * the row, which gives the line back, which removes the room - a flip every frame - and a\r\n * filled row in a rows view that hugs its table reads as its own room, 1px less each time.\r\n *\r\n * The second case gets its own rule. A rows view that hugs its table while the row adds height\r\n * of its own is sized by that row, so it has no room, whatever `height` says: the row lets go\r\n * at once. (A bounded grid resized to exactly its table height less the 1px lands here too, and\r\n * fills again on the next reading.)\r\n *\r\n * Whether the grid is bounded (dx `hasHeight`): an explicit `height` other than 'auto' always\r\n * is (m_grid_view.js:597-604, `isHeightSpecified`), even a percentage that resolves to auto,\r\n * and then has no room while its rows view hugs. Otherwise a rows view that does not hug is\r\n * bounded by CSS, and one that hugs while the row holds free space is not, so a grid that\r\n * loses its height lets go of the space. When they coincide with no free space held (an exact\r\n * fit), the previous answer stands.\r\n */\r\n private measureFreeSpace(rowsView: HTMLElement, table: HTMLTableElement): void {\r\n const tbody = table.tBodies[0];\r\n const fsRow = tbody?.lastElementChild;\r\n if (\r\n !(fsRow instanceof HTMLTableRowElement) ||\r\n !fsRow.classList.contains('nxe-freespace-row') ||\r\n this.isEmpty()\r\n ) {\r\n return;\r\n }\r\n const prev = this.freeSpaceMeasure();\r\n const last = fsRow.previousElementSibling;\r\n // The collapsed borders above and below the row: the last row's line, and the total\r\n // footer's top line when there is one (the table's own edge otherwise, which has none).\r\n const above = Math.max(nxeRowEdge(last, 'bottom'), nxeRowEdge(fsRow, 'top'));\r\n const below = Math.max(nxeRowEdge(fsRow, 'bottom'), nxeRowEdge(table.tFoot?.rows[0], 'top'));\r\n // The last row's line as it is with free space shown. The last-row-border rule strips it\r\n // to 0 only on a data row; it is drawn at the grid's line width.\r\n let line = above;\r\n if (rowsView.classList.contains('nxe-last-row-border') && last?.classList.contains('nxe-data-row')) {\r\n const token = parseFloat(getComputedStyle(rowsView).getPropertyValue('--nxe-ui-grid-line-width'));\r\n line = Number.isFinite(token) ? token : 1;\r\n }\r\n const fsHeight = fsRow.getBoundingClientRect().height;\r\n // The row adds height of its own, beyond its halves of the borders around it.\r\n const holding = fsHeight > (above + below) / 2 + 0.01;\r\n const tableHeight = table.getBoundingClientRect().height;\r\n // Everything but the free-space row, the last row keeping its line: dx's `rowsHeight`.\r\n const rowsHeight = tableHeight - fsHeight - above / 2 + line / 2;\r\n // And with the row empty: dx's `contentHeight`.\r\n const contentHeight = rowsHeight + (line + below) / 2;\r\n // Less borders and a horizontal scrollbar: dx's `elementHeightWithoutScrollbar`.\r\n const inner =\r\n rowsView.getBoundingClientRect().height - (rowsView.offsetHeight - rowsView.clientHeight);\r\n const h = this.heightStyle();\r\n const hugging = Math.abs(inner - tableHeight) < 0.5;\r\n const bounded = (h !== null && h !== 'auto') || (hugging ? prev.bounded && !holding : true);\r\n const rows = tbody.rows.length - 1;\r\n this.freeSpaceMeasure.set({\r\n bounded,\r\n room: hugging && holding ? 0 : inner - contentHeight,\r\n fill: inner - rowsHeight - 1,\r\n rowHeight: rows > 0 ? (tbody.getBoundingClientRect().height - fsHeight) / rows : prev.rowHeight,\r\n });\r\n }\r\n\r\n /**\r\n * dx `updateColumnDataTypes` (m_columns_controller.js:914-977): a column with no declared\r\n * `dataType` takes the type of its values, and mixed values make it 'string'.\r\n *\r\n * A lookup column is typed by its DISPLAY values - dx's `lookup.dataType`, which is what dx\r\n * aligns, formats and edits a lookup by (:901) - and a value with no lookup match contributes\r\n * nothing: dx's `lookup.calculateCellValue` returns `valueMap[value]`, undefined for a missing\r\n * key, so `getValueDataType` skips it (:946). A not-yet-loaded list must not type the column.\r\n *\r\n * Once inferred, a type sticks. dx infers only while `dataType` is unset (:935) and stops once\r\n * every column is typed (:289), so a later load of mixed values cannot flip a column; the\r\n * previous value of this linkedSignal carries that. The refresh tick is in the source because\r\n * rows mutated in place (inline editing, `refresh()`) can type a column that was all blanks.\r\n *\r\n * dx samples the loaded page (or the first group's leaves); this scans the client array,\r\n * which only differs when the types are mixed beyond that sample.\r\n */\r\n private readonly inferredTypes = linkedSignal<\r\n { rows: readonly any[]; cols: readonly NxeColumnComponent[] },\r\n ReadonlyMap<NxeColumnComponent, { field: string; type: NxeColType }>\r\n >({\r\n source: () => {\r\n this.refreshTick();\r\n return { rows: this.dataSource() ?? [], cols: this.columns() };\r\n },\r\n computation: ({ rows, cols }, previous) => {\r\n const out = new Map<NxeColumnComponent, { field: string; type: NxeColType }>();\r\n for (const col of cols) {\r\n const kept = previous?.value.get(col);\r\n // A rebound dataField is a different column as far as its values are concerned.\r\n if (kept && kept.field === col.dataField()) {\r\n out.set(col, kept);\r\n }\r\n }\r\n if (!rows.length) {\r\n return out;\r\n }\r\n for (const col of cols) {\r\n const field = col.dataField();\r\n if (out.has(col) || col.dataType() || !field) {\r\n continue;\r\n }\r\n const display = this.lookupDisplayMap(col);\r\n let type: NxeColType | undefined;\r\n for (const row of rows) {\r\n let value = this.getRaw(row, field);\r\n if (display) {\r\n if (!display.has(value)) {\r\n continue;\r\n }\r\n value = display.get(value);\r\n }\r\n const valueType = nxeValueDataType(value);\r\n type = type ?? valueType;\r\n if (type && valueType && type !== valueType) {\r\n type = 'string';\r\n break;\r\n }\r\n }\r\n if (type) {\r\n out.set(col, { field, type });\r\n }\r\n }\r\n return out;\r\n },\r\n });\r\n\r\n /** A lookup's value → raw display value, first match winning as in `lookupText`; null without one. */\r\n private lookupDisplayMap(col: NxeColumnComponent): Map<unknown, unknown> | null {\r\n const lookup = col.lookup();\r\n if (!lookup) {\r\n return null;\r\n }\r\n const valueExpr = lookup.valueExpr ?? 'lovCode';\r\n const displayExpr = lookup.displayExpr ?? 'lovName';\r\n const map = new Map<unknown, unknown>();\r\n for (const item of lookup.dataSource ?? []) {\r\n const key = nxeResolveExpr(valueExpr, item);\r\n if (!map.has(key)) {\r\n map.set(key, nxeResolveExpr(displayExpr, item));\r\n }\r\n }\r\n return map;\r\n }\r\n\r\n /**\r\n * The column's effective type - its declared `dataType`, else the inferred one - which is what\r\n * dx's `column.dataType` holds after inference. Every type-driven decision reads this, never\r\n * `col.dataType()` directly, or an undeclared column would behave as text in one place and\r\n * as a number in the next.\r\n */\r\n protected colType(col: NxeColumnComponent): NxeColType | undefined {\r\n return col.dataType() ?? this.inferredTypes().get(col)?.type;\r\n }\r\n\r\n /** The active sort: an explicit user click, else the first column declaring `sortOrder`. */\r\n private effectiveSort(): SortState | null {\r\n if (this.sortInit()) {\r\n return this.sort();\r\n }\r\n const sorted = this.columns().find((c) => c.sortOrder());\r\n return sorted ? { field: sorted.dataField(), dir: sorted.sortOrder()! } : null;\r\n }\r\n\r\n // --- Rendering helpers -----------------------------------------------------------------------\r\n\r\n /**\r\n * dx `getAlignmentByDataType` (m_columns_controller_utils.js) over the effective type:\r\n * number right, boolean centre, everything else left. A lookup aligns by its display text\r\n * (dx `lookup.dataType`, :901), which is text - so left, even over numeric codes.\r\n */\r\n /**\r\n * Columns whose cellTemplate draws a check box (nxe-check-box, mat-checkbox, a native\r\n * checkbox input or anything with role=checkbox). align() centres them like a boolean column,\r\n * header and cells, unless the column asks for center or right. dx centres only by dataType,\r\n * so a template check box over non-boolean data (or no dataField) would sit at the left there;\r\n * a check box reads as a boolean whatever feeds it, so here it is centred too.\r\n *\r\n * Sticky, as an inferred type is: a column that drew a check box keeps its alignment when a\r\n * filter or an empty page leaves no row to look at. A column that goes away drops out.\r\n */\r\n private readonly templateCheckboxColumns = signal<ReadonlySet<NxeColumnComponent>>(new Set());\r\n\r\n private detectTemplateCheckboxColumns(): void {\r\n const cols = this.visibleColumns();\r\n const current = this.templateCheckboxColumns();\r\n let next: Set<NxeColumnComponent> | null = null;\r\n for (const col of current) {\r\n if (!cols.includes(col)) {\r\n (next ??= new Set(current)).delete(col);\r\n }\r\n }\r\n const candidates = cols.filter((c) => !!c.cellTemplate() && !current.has(c));\r\n if (candidates.length) {\r\n const host = this.elementRef.nativeElement as HTMLElement;\r\n // This grid's own table and rows: a nested master-detail grid's come later, and its\r\n // rows live in a master-detail row, never in one of these data rows' cells' place.\r\n const table = host.querySelector<HTMLTableElement>('.nxe-datagrid-content > .nxe-datagrid-table');\r\n // A few rows are enough to know what a template draws, and keep this cheap on long pages.\r\n const rows = table\r\n ? Array.from(table.querySelectorAll<HTMLTableRowElement>(':scope > tbody > tr.nxe-data-row')).slice(0, 20)\r\n : [];\r\n const lead = this.leadCellCount();\r\n for (const col of candidates) {\r\n const index = lead + cols.indexOf(col) + 1;\r\n const drawsCheckbox = rows.some((tr) =>\r\n tr.querySelector(\r\n `:scope > td[aria-colindex=\"${index}\"] :is(nxe-check-box, mat-checkbox, input[type=\"checkbox\"], [role=\"checkbox\"])`,\r\n ),\r\n );\r\n if (drawsCheckbox) {\r\n (next ??= new Set(current)).add(col);\r\n }\r\n }\r\n }\r\n if (next) {\r\n this.templateCheckboxColumns.set(next);\r\n }\r\n }\r\n\r\n /** Boolean data (declared or inferred) or a cellTemplate seen drawing a check box. */\r\n private isCheckboxColumn(col: NxeColumnComponent): boolean {\r\n return (this.colType(col) === 'boolean' && !col.lookup()) || this.templateCheckboxColumns().has(col);\r\n }\r\n\r\n protected align(col: NxeColumnComponent): string {\r\n const a = col.alignment();\r\n // A check box column - boolean data, or a cellTemplate that draws a check box - is centred,\r\n // header and cells, unless it asks for center or right. 'left' counts as the default here:\r\n // apps bind alignment=\"left\" onto every column that has none of its own (Bright's generic\r\n // list does), and that must not pin a check box to the left.\r\n if (a !== 'center' && a !== 'right' && this.isCheckboxColumn(col)) {\r\n return 'center';\r\n }\r\n if (a) {\r\n return a;\r\n }\r\n if (col.lookup()) {\r\n return 'left';\r\n }\r\n switch (this.colType(col)) {\r\n case 'number':\r\n return 'right';\r\n case 'boolean':\r\n return 'center';\r\n default:\r\n return 'left';\r\n }\r\n }\r\n\r\n /**\r\n * The filter cell's text-align: dx sets the filter editor's input to the column alignment\r\n * unless it is centre (m_filter_row.js:390-395).\r\n */\r\n protected filterCellAlign(col: NxeColumnComponent): string | null {\r\n const a = this.align(col);\r\n return a === 'center' ? null : a;\r\n }\r\n\r\n protected colWidth(col: NxeColumnComponent): string | null {\r\n const manual = this.widthOverride().get(col.dataField());\r\n if (manual != null) {\r\n return `${manual}px`;\r\n }\r\n const w = col.width();\r\n if (w == null) {\r\n return null;\r\n }\r\n return typeof w === 'number' ? `${w}px` : /^\\d+$/.test(w) ? `${w}px` : w;\r\n }\r\n\r\n protected getRaw(row: any, dataField: string): any {\r\n if (!dataField || row == null) {\r\n return undefined;\r\n }\r\n if (dataField.includes('.')) {\r\n return dataField.split('.').reduce((o: any, k) => (o == null ? o : o[k]), row);\r\n }\r\n return row[dataField];\r\n }\r\n\r\n /**\r\n * dx `showEditorAlways` (m_columns_controller.js:912): a boolean-typed column - declared or\r\n * inferred - renders a checkbox, unless it is a lookup or has its own cellTemplate. Decided\r\n * per column, not per value: a column whose values are mixed infers 'string' and shows text,\r\n * as in dx.\r\n */\r\n protected isBooleanCell(col: NxeColumnComponent): boolean {\r\n return this.colType(col) === 'boolean' && !col.lookup() && !col.cellTemplate();\r\n }\r\n\r\n /** Resolve the displayed cell text: lookup > customizeText > dataType/format > raw string. */\r\n protected cellText(col: NxeColumnComponent, row: any): string {\r\n const raw = this.getRaw(row, col.dataField());\r\n const valueText = this.lookupText(col, raw) ?? this.defaultFormat(col, raw);\r\n const ct = col.customizeText();\r\n return ct ? ct({ value: raw, valueText }) : valueText;\r\n }\r\n\r\n /** Column `lookup` resolution (orbit addition): raw value → display text via the lookup list. */\r\n private lookupText(col: NxeColumnComponent, raw: any): string | null {\r\n const lookup = col.lookup();\r\n if (!lookup || raw == null) {\r\n return null;\r\n }\r\n const valueExpr = lookup.valueExpr ?? 'lovCode';\r\n const displayExpr = lookup.displayExpr ?? 'lovName';\r\n const match = (lookup.dataSource ?? []).find(\r\n (item: any) => nxeResolveExpr(valueExpr, item) === raw,\r\n );\r\n return match ? nxeResolveText(displayExpr, match) || String(raw) : String(raw);\r\n }\r\n\r\n private defaultFormat(col: NxeColumnComponent, raw: any): string {\r\n return nxeDefaultFormat(this.colType(col), col.format(), raw, this.separators);\r\n }\r\n\r\n protected templateFor(name: string | undefined) {\r\n if (!name) {\r\n return null;\r\n }\r\n return this.templates().find((t) => t.name() === name)?.templateRef ?? null;\r\n }\r\n\r\n protected cellContext(row: any, rowIndex: number, columnIndex: number, col: NxeColumnComponent): {\r\n $implicit: NxeCellInfo;\r\n } {\r\n const value = this.getRaw(row, col.dataField());\r\n return {\r\n $implicit: {\r\n data: row,\r\n rowIndex,\r\n columnIndex,\r\n value,\r\n displayValue: value,\r\n text: this.cellText(col, row),\r\n key: row,\r\n column: { dataField: col.dataField(), caption: col.caption() },\r\n },\r\n };\r\n }\r\n\r\n protected editCellContext(\r\n row: any,\r\n rowIndex: number,\r\n columnIndex: number,\r\n col: NxeColumnComponent,\r\n ): { $implicit: NxeEditCellInfo } {\r\n const value = this.getRaw(row, col.dataField());\r\n // Captured now rather than read inside setValue: which write path applies is decided by\r\n // the state the template was rendered in, and `cell` mode clears `editingCell` on commit.\r\n const cellMode = this.isEditingCell(row, col);\r\n return {\r\n $implicit: {\r\n data: row,\r\n key: this.rowKey(row),\r\n value,\r\n displayValue: value,\r\n text: this.cellText(col, row),\r\n rowIndex,\r\n columnIndex,\r\n column: {\r\n dataField: col.dataField(),\r\n caption: col.caption(),\r\n dataType: this.colType(col),\r\n format: col.format(),\r\n },\r\n // dx's setValue changes the cell value; it does not end the edit. The editor\r\n // closes when focus leaves, which `onEditCellFocusOut` handles. Committing here\r\n // instead would also fight the click that triggered it: clearing the edit state\r\n // mid-dispatch lets the same event bubble to the cell and reopen it.\r\n setValue: (newValue: any) =>\r\n cellMode ? this.writeCellValue(row, col, newValue) : this.bufferRowEdit(col, newValue),\r\n component: this.facade,\r\n },\r\n };\r\n }\r\n\r\n protected groupCellContext(item: {\r\n column: NxeColumnComponent;\r\n text: string;\r\n value: any;\r\n rows: readonly any[];\r\n level: number;\r\n captionSuffix: string;\r\n }): { $implicit: NxeGroupCellInfo } {\r\n return {\r\n $implicit: {\r\n data: [...item.rows],\r\n key: item.value,\r\n value: item.value,\r\n displayValue: item.text,\r\n // What the grid would have rendered, suffix included, so a template can decorate\r\n // the default rather than having to rebuild it.\r\n text: `${item.column.caption()}: ${item.text}${item.captionSuffix}`,\r\n groupIndex: item.level,\r\n columnIndex: this.columns().indexOf(item.column),\r\n column: { dataField: item.column.dataField(), caption: item.column.caption() },\r\n component: this.facade,\r\n },\r\n };\r\n }\r\n\r\n /**\r\n * dx `onCellPrepared` / `onRowPrepared`.\r\n *\r\n * Emitted from a render hook rather than an effect, because the payload carries the real\r\n * `<td>`: it cannot exist before the DOM does. `afterRenderEffect` is the sanctioned\r\n * primitive for that here, and the walk runs inside `untracked()` so a handler that happens\r\n * to read a signal cannot enrol it in this hook's dependency set — the invisible-dependency\r\n * failure the `effect()` ban exists to prevent.\r\n */\r\n private emitPreparedEvents(): void {\r\n if (!this.onCellPrepared.observed && !this.onRowPrepared.observed) {\r\n return;\r\n }\r\n // A handler that writes a signal schedules another render, and therefore another\r\n // emission. dx re-fires on repaint too and the merge helpers are idempotent, but a\r\n // pathological handler should fail safe rather than hang the tab.\r\n if (this.preparedDepth > 0) {\r\n return;\r\n }\r\n const host = this.elementRef.nativeElement as HTMLElement;\r\n const table = host.querySelector<HTMLTableElement>(\r\n '.nxe-datagrid-content > .nxe-datagrid-table',\r\n );\r\n if (!table) {\r\n return;\r\n }\r\n // Own rows only: a nested master-detail grid renders its own rows deeper inside a cell,\r\n // and section.parentElement === table is what separates them.\r\n const rows = Array.from(table.querySelectorAll<HTMLTableRowElement>('tr')).filter(\r\n (tr) => tr.parentElement?.parentElement === table,\r\n );\r\n const cols = this.visibleColumns();\r\n const dataItems = this.renderRows().filter((r) => r.kind === 'data');\r\n const groupItems = this.renderRows().filter((r) => r.kind === 'group');\r\n\r\n this.preparedDepth++;\r\n try {\r\n let dataSeen = 0;\r\n let groupSeen = 0;\r\n for (const tr of rows) {\r\n const rowType = nxeRowTypeOf(tr);\r\n if (!rowType) {\r\n continue;\r\n }\r\n let info: NxeRowInfo;\r\n if (rowType === 'data') {\r\n const item = dataItems[dataSeen++] as { row: any; rowIndex: number } | undefined;\r\n info = {\r\n rowType,\r\n data: item?.row,\r\n key: item ? this.rowKey(item.row) : undefined,\r\n rowIndex: item?.rowIndex ?? -1,\r\n isSelected: item ? this.isSelected(item.row) : false,\r\n };\r\n } else if (rowType === 'group') {\r\n const item = groupItems[groupSeen++] as\r\n | { rows: readonly any[]; value: any; level: number; collapsed: boolean }\r\n | undefined;\r\n info = {\r\n rowType,\r\n data: item?.rows as any,\r\n key: item?.value,\r\n rowIndex: -1,\r\n // dx handlers read one name or the other depending on vintage; supply both.\r\n groupIndex: item?.level,\r\n groupLevel: item?.level,\r\n isExpanded: item ? !item.collapsed : undefined,\r\n };\r\n } else {\r\n info = { rowType, data: undefined, key: undefined, rowIndex: -1 };\r\n }\r\n\r\n if (this.onRowPrepared.observed) {\r\n this.onRowPrepared.emit({\r\n ...info,\r\n rowElement: tr,\r\n columnCount: tr.cells.length,\r\n component: this.facade,\r\n element: host,\r\n });\r\n }\r\n if (!this.onCellPrepared.observed) {\r\n continue;\r\n }\r\n const lead = this.leadCellCount();\r\n for (const td of Array.from(tr.cells)) {\r\n // Read the column off `aria-colindex` rather than counting cells.\r\n //\r\n // Counting was wrong in four separate ways, all silent, and every one of them\r\n // the shape this event exists to serve. A data row's grouping indent cells\r\n // carry only `nxe-datagrid-group-space`, which no class test here listed, so\r\n // in a grouped grid every cell reported the column one place to its left per\r\n // group level and the last column was never reported at all. `mergeColumns`\r\n // deletes the covered `<td>`s, so a continuation row is short and shifts the\r\n // other way. A band adds a header row whose cells are not leaves. And the\r\n // counter restarted per `<tr>`, so a banded header row numbered from zero.\r\n //\r\n // `aria-colindex` numbers every data cell, leaf header cell, filter cell and\r\n // summary cell, and already includes the lead command columns, so it survives\r\n // all four. Command cells carry it too, as dx's do, but their numbers fall\r\n // outside the data columns' range (at or below the lead count, or past the last\r\n // column). Those, the cells without one (a band) and the group caption - dx\r\n // numbers it as the cell after its toggle, which can be a data column's number\r\n // - are not columns and are reported with `column: null` and index -1.\r\n const colAttr = td.classList.contains('nxe-group-cell') ? null : td.getAttribute('aria-colindex');\r\n const at = colAttr ? Number(colAttr) - 1 - lead : -1;\r\n const col = at >= 0 ? cols[at] : undefined;\r\n const columnIndex = col ? at : -1;\r\n const value =\r\n col && rowType === 'data' && info.data\r\n ? this.getRaw(info.data, col.dataField())\r\n : undefined;\r\n this.onCellPrepared.emit({\r\n data: info.data,\r\n key: info.key,\r\n value,\r\n displayValue: value,\r\n text: td.textContent ?? '',\r\n columnIndex,\r\n rowIndex: info.rowIndex,\r\n column: col\r\n ? {\r\n dataField: col.dataField(),\r\n caption: col.caption(),\r\n dataType: this.colType(col),\r\n index: columnIndex,\r\n }\r\n : null,\r\n row: info,\r\n rowType,\r\n cellElement: td,\r\n component: this.facade,\r\n element: host,\r\n });\r\n }\r\n }\r\n } finally {\r\n this.preparedDepth--;\r\n }\r\n }\r\n\r\n // --- Keyboard navigation (WAI-ARIA grid pattern) ---------------------------------------------\r\n\r\n /**\r\n * The single cell holding the grid's tab stop.\r\n *\r\n * A grid is one stop in the tab order, not one per cell — a 200-row table would otherwise be\r\n * 1,400 tab presses to get past. Row `-1` is the header, so ArrowUp from the first data row\r\n * reaches the column headers rather than stopping dead.\r\n */\r\n protected readonly focusedCell = signal<{ row: number; col: number }>({ row: -1, col: 0 });\r\n\r\n /**\r\n * The rows the keyboard and `aria-rowindex` address: the data rows actually RENDERED.\r\n *\r\n * Emphatically not `pagedRows()`. That is the page's data BEFORE grouping and tree collapse\r\n * take rows out of the DOM, while `renderRows` renumbers densely over what it emits - so with\r\n * one group collapsed `pagedRows()` counts three rows where two have a cell to focus. Every\r\n * consumer of the count is then wrong in a different way: `aria-rowcount` claims a row a\r\n * reader cannot reach, Ctrl+End targets an index with no DOM behind it and movement silently\r\n * does nothing, and Enter and Space read `pagedRows()[row]` - which is a DIFFERENT row than\r\n * the one under the cursor, so Space selects something the user is not looking at.\r\n */\r\n protected readonly navigableRows = computed<any[]>(() =>\r\n this.renderRows()\r\n .filter((r) => r.kind === 'data')\r\n .map((r) => r.row),\r\n );\r\n\r\n protected isCellTabStop(row: number, col: number): boolean {\r\n const cell = this.focusedCell();\r\n return cell.row === row && cell.col === col;\r\n }\r\n\r\n protected focusCell(row: number, col: number): void {\r\n this.focusedCell.set({ row, col });\r\n }\r\n\r\n /** dx marks the sorted column for assistive tech as well as with the arrow glyph. */\r\n protected ariaSort(col: NxeColumnComponent): 'ascending' | 'descending' | null {\r\n if (!col.allowSorting()) {\r\n return null;\r\n }\r\n const dir = this.sortDir(col);\r\n return dir === 'asc' ? 'ascending' : dir === 'desc' ? 'descending' : null;\r\n }\r\n\r\n /**\r\n * The DOM cell at a logical position, addressed by `aria-colindex` rather than by offset.\r\n *\r\n * Offsets break twice over. A band cell carries `role=\"columnheader\"` too, so counting\r\n * header cells finds bands as well as leaves; and `mergeColumns` deletes the covered `<td>`s,\r\n * so a data row can be short. `aria-colindex` is emitted on every cell and already includes\r\n * the lead command columns, so it names the position exactly rather than by counting.\r\n *\r\n * Both lookups stay inside this grid's own table: a master-detail grid renders a whole second\r\n * grid into a `<td>`, and its rows would otherwise answer to the outer grid's arrow keys.\r\n */\r\n private cellAt(row: number, col: number): HTMLElement | null {\r\n const host = this.elementRef.nativeElement as HTMLElement;\r\n const colIndex = this.leadCellCount() + col + 1;\r\n if (row < 0) {\r\n return nxeHeaderLeafCells(host)[col] ?? null;\r\n }\r\n const tbody = host.querySelector<HTMLElement>(\r\n '.nxe-datagrid-content > .nxe-datagrid-table > tbody',\r\n );\r\n return (\r\n tbody?.querySelector<HTMLElement>(\r\n `:scope > .nxe-data-row[aria-rowindex=\"${row + 1}\"] > [aria-colindex=\"${colIndex}\"]`,\r\n ) ?? null\r\n );\r\n }\r\n\r\n /** Move the tab stop and put real DOM focus on the cell that now holds it. */\r\n private moveFocus(row: number, col: number): void {\r\n const maxRow = this.navigableRows().length - 1;\r\n const maxCol = this.visibleColumns().length - 1;\r\n const targetRow = Math.max(-1, Math.min(row, maxRow));\r\n const nextCol = Math.max(0, Math.min(col, maxCol));\r\n\r\n // A merged cell's rowspan removes the `<td>`s beneath it, so a position can have no cell\r\n // of its own. Keep going the way we were headed until one does — landing on the covering\r\n // cell instead would make ArrowDown into a merged block a dead end.\r\n const step = targetRow > this.focusedCell().row ? 1 : -1;\r\n let probe = targetRow;\r\n let cell = this.cellAt(probe, nextCol);\r\n while (!cell && probe + step >= -1 && probe + step <= maxRow) {\r\n probe += step;\r\n cell = this.cellAt(probe, nextCol);\r\n }\r\n if (!cell) {\r\n return;\r\n }\r\n this.focusedCell.set({ row: probe, col: nextCol });\r\n cell.focus();\r\n }\r\n\r\n /**\r\n * Arrow-key movement over cells.\r\n *\r\n * Deliberately not bound to the rowsview: a projected editor inside a cell needs its own\r\n * arrow keys, so anything originating inside an editor is left alone.\r\n */\r\n protected onGridKeydown(event: KeyboardEvent): void {\r\n const target = event.target as HTMLElement | null;\r\n if (\r\n target &&\r\n target.closest('input, textarea, select, [contenteditable=\"true\"], .nxe-grid-cell-editor-check')\r\n ) {\r\n return;\r\n }\r\n const { row, col } = this.focusedCell();\r\n const rows = this.navigableRows();\r\n const lastRow = rows.length - 1;\r\n const lastCol = this.visibleColumns().length - 1;\r\n\r\n switch (event.key) {\r\n case 'ArrowRight':\r\n event.preventDefault();\r\n this.moveFocus(row, col + 1);\r\n break;\r\n case 'ArrowLeft':\r\n event.preventDefault();\r\n this.moveFocus(row, col - 1);\r\n break;\r\n case 'ArrowDown':\r\n event.preventDefault();\r\n this.moveFocus(row + 1, col);\r\n break;\r\n case 'ArrowUp':\r\n event.preventDefault();\r\n this.moveFocus(row - 1, col);\r\n break;\r\n case 'Home':\r\n event.preventDefault();\r\n this.moveFocus(event.ctrlKey ? -1 : row, 0);\r\n break;\r\n case 'End':\r\n event.preventDefault();\r\n this.moveFocus(event.ctrlKey ? lastRow : row, lastCol);\r\n break;\r\n case 'PageDown':\r\n event.preventDefault();\r\n this.pagingEnabled() ? this.nextPage() : this.moveFocus(lastRow, col);\r\n break;\r\n case 'PageUp':\r\n event.preventDefault();\r\n this.pagingEnabled() ? this.prevPage() : this.moveFocus(-1, col);\r\n break;\r\n case 'Enter':\r\n case 'F2': {\r\n if (row < 0) {\r\n // On a header, Enter sorts — the same thing a click does.\r\n event.preventDefault();\r\n const col0 = this.visibleColumns()[col];\r\n if (col0) {\r\n this.onHeaderClick(col0);\r\n }\r\n break;\r\n }\r\n const rowData = rows[row];\r\n const column = this.visibleColumns()[col];\r\n if (rowData && column && this.cellEditingEnabled() && this.editableCell(column)) {\r\n event.preventDefault();\r\n if (this.booleanInPlace(column)) {\r\n // The checkbox is already the editor, and it takes no focus of its own:\r\n // Enter does what a click on it does.\r\n this.commitCellEdit(rowData, column, this.getRaw(rowData, column.dataField()) !== true);\r\n break;\r\n }\r\n this.editingCell.set({ row: rowData, field: column.dataField() });\r\n }\r\n break;\r\n }\r\n case ' ': {\r\n if (row < 0 || this.selectionMode() === 'none') {\r\n break;\r\n }\r\n event.preventDefault();\r\n const rowData = rows[row];\r\n if (rowData) {\r\n this.toggleRow(rowData);\r\n }\r\n break;\r\n }\r\n default:\r\n }\r\n }\r\n\r\n // --- Interaction -----------------------------------------------------------------------------\r\n\r\n /** True when this header can start a drag gesture (to the group panel and/or a reorder). */\r\n protected headerDraggable(col: NxeColumnComponent): boolean {\r\n if (this.treeMode || !col.dataField()) {\r\n return false;\r\n }\r\n // Reordering is off for banded grids: dragging a leaf out of its band has no meaning in\r\n // dx, and letting it happen here would tear the band apart. Grouping still works, and a\r\n // band whose leaves are all grouped away simply disappears.\r\n return (\r\n (this.groupPanelVisible() && col.allowGrouping()) ||\r\n (this.allowColumnReordering() && !this.hasBands())\r\n );\r\n }\r\n\r\n protected onHeaderPointerDown(col: NxeColumnComponent, ci: number, event: PointerEvent): void {\r\n if (this.headerDraggable(col)) {\r\n this.drag.startHeaderDrag(col, ci, event);\r\n }\r\n }\r\n\r\n protected onChipPointerDown(col: NxeColumnComponent, level: number, event: PointerEvent): void {\r\n this.drag.startChipDrag(col, level, event);\r\n }\r\n\r\n /**\r\n * Chip click (dx): toggle the grouped column's sort — unless this click ends a drag. dx sends\r\n * it through the same changeSortOrder as a header click (m_sorting.js:134), so the same gate.\r\n */\r\n protected onChipClick(col: NxeColumnComponent): void {\r\n if (this.drag.consumeClick() || !this.clickSorts(col)) {\r\n return;\r\n }\r\n this.sortGroupColumn(col);\r\n }\r\n\r\n protected onHeaderClick(col: NxeColumnComponent): void {\r\n if (this.drag.consumeClick() || this.resize.consumeClick()) {\r\n return; // this click is the tail of a drag/resize gesture, not a sort request\r\n }\r\n if (!this.clickSorts(col)) {\r\n return;\r\n }\r\n const field = col.dataField();\r\n if (!field) {\r\n return;\r\n }\r\n this.sortInit.set(true);\r\n const current = this.effectiveSort();\r\n if (!current || current.field !== field) {\r\n this.sort.set({ field, dir: 'asc' });\r\n } else if (current.dir === 'asc') {\r\n this.sort.set({ field, dir: 'desc' });\r\n } else {\r\n this.sort.set(null);\r\n }\r\n }\r\n\r\n protected sortDir(col: NxeColumnComponent): 'asc' | 'desc' | null {\r\n const s = this.effectiveSort();\r\n return s && s.field === col.dataField() ? s.dir : null;\r\n }\r\n\r\n /**\r\n * `sorting.mode` as dx's sorting code reads the option: unbound is dx's default 'single', an\r\n * object gives its `mode` (default 'single'), and anything else - `[sorting]=\"false\"` or\r\n * `null` - has no mode at all.\r\n */\r\n private sortingMode(): 'single' | 'multiple' | 'none' | undefined {\r\n const s = this.sorting();\r\n if (s === undefined) {\r\n return 'single';\r\n }\r\n return s ? (s.mode ?? 'single') : undefined;\r\n }\r\n\r\n /**\r\n * dx changeSortOrder (m_columns_controller.js:758-766) acts only in mode 'single' or\r\n * 'multiple', and only on a column that allows sorting. `[sorting]=\"false\"` still renders the\r\n * sort slot, but a header or chip click never sorts.\r\n */\r\n private clickSorts(col: NxeColumnComponent): boolean {\r\n const mode = this.sortingMode();\r\n return col.allowSorting() && (mode === 'single' || mode === 'multiple');\r\n }\r\n\r\n /**\r\n * dx `isSortingAllowed` (m_sorting_mixin.js:37): a sortable column, unless the mode is\r\n * literally 'none'. A column with no dataField is never sortable (m_columns_controller.js:\r\n * 1383-1388). Gates the `nxe-datagrid-action` class, and the sort slot of an unsorted column.\r\n */\r\n protected sortAllowed(col: NxeColumnComponent): boolean {\r\n const s = this.sorting();\r\n return col.allowSorting() && !!col.dataField() && (s ? s.mode : undefined) !== 'none';\r\n }\r\n\r\n /**\r\n * Whether the header renders dx's sort span: always for the sorted column, and as an empty\r\n * `nxe-sort-none` placeholder for any other sortable one (m_sorting_mixin.js:38-46). The\r\n * placeholder is display:none in the fixed table and 14px wide in the best-fit pass.\r\n */\r\n protected sortSlot(col: NxeColumnComponent): boolean {\r\n return this.sortDir(col) !== null || this.sortAllowed(col);\r\n }\r\n\r\n protected onRowEnter(index: number): void {\r\n if (this.hoverStateEnabled()) {\r\n this.hoveredIndex.set(index);\r\n }\r\n }\r\n protected onRowLeave(): void {\r\n this.hoveredIndex.set(null);\r\n }\r\n protected isHovered(index: number): boolean {\r\n return this.hoveredIndex() === index;\r\n }\r\n\r\n protected isSelected(row: any): boolean {\r\n return this.treeMode\r\n ? this.selectedRowKeys().includes(this.rowKey(row))\r\n : this.selectedSet().has(row);\r\n }\r\n\r\n /** Row body click: single-select (LOV pickers) or toggle when checkboxes are hidden. */\r\n protected onDataRowClick(row: any, rowIndex = 0): void {\r\n this.onRowClick.emit({ data: row, rowIndex, component: this.facade });\r\n if (!this.selectionEnabled()) {\r\n return;\r\n }\r\n if (\r\n this.selectionMode() === 'multiple' &&\r\n this.showCheckboxes() &&\r\n !this.selection()?.selectByClick()\r\n ) {\r\n return; // checkbox-driven; row click is a no-op\r\n }\r\n this.toggleRow(row);\r\n }\r\n\r\n protected onCheckboxClick(row: any, event: Event): void {\r\n event.stopPropagation();\r\n this.toggleRow(row);\r\n }\r\n\r\n private toggleRow(row: any): void {\r\n if (this.treeMode) {\r\n this.toggleTreeSelection(row);\r\n return;\r\n }\r\n const set = new Set(this.selectedSet());\r\n let currentSelected: any[] = [];\r\n let currentDeselected: any[] = [];\r\n if (this.selectionMode() === 'single') {\r\n currentDeselected = [...set].filter((r) => r !== row);\r\n set.clear();\r\n set.add(row);\r\n currentSelected = [row];\r\n } else if (set.has(row)) {\r\n set.delete(row);\r\n currentDeselected = [row];\r\n } else {\r\n set.add(row);\r\n currentSelected = [row];\r\n }\r\n this.selectedSet.set(set);\r\n this.emitSelectionChanged(currentSelected, currentDeselected);\r\n }\r\n\r\n protected toggleSelectAll(event: Event): void {\r\n event.stopPropagation();\r\n if (this.treeMode) {\r\n const allKeys = ((this.dataSource() ?? []) as any[]).map((r) => this.rowKey(r));\r\n if (this.allSelected()) {\r\n this.selectedRowKeys.set([]);\r\n this.emitTreeSelectionChanged([], [], allKeys);\r\n } else {\r\n this.selectedRowKeys.set(allKeys);\r\n this.emitTreeSelectionChanged(allKeys, allKeys, []);\r\n }\r\n return;\r\n }\r\n const rows = this.displayRows();\r\n if (this.allSelected()) {\r\n this.selectedSet.set(new Set());\r\n this.emitSelectionChanged([], rows);\r\n } else {\r\n this.selectedSet.set(new Set(rows));\r\n this.emitSelectionChanged(rows, []);\r\n }\r\n }\r\n\r\n private emitSelectionChanged(currentSelected: any[], currentDeselected: any[]): void {\r\n const data = this.selectedRowsData();\r\n this.onSelectionChanged.emit({\r\n selectedRowsData: data,\r\n selectedRowKeys: this.rowKeys(data),\r\n currentSelectedRowKeys: this.rowKeys(currentSelected),\r\n currentDeselectedRowKeys: this.rowKeys(currentDeselected),\r\n component: this.facade,\r\n element: this.elementRef.nativeElement,\r\n });\r\n }\r\n\r\n private rowKeys(rows: any[]): any[] {\r\n const key = this.keyExpr();\r\n return key ? rows.map((r) => r?.[key]) : rows;\r\n }\r\n\r\n // --- Filter row (dxo-filter-row): typed editors + dx operation-chooser menu ------------------\r\n private static readonly STRING_OPS: { op: NxeFilterOp; label: string }[] = [\r\n { op: 'contains', label: 'Contains' },\r\n { op: 'notcontains', label: 'Does not contain' },\r\n { op: 'startswith', label: 'Starts with' },\r\n { op: 'endswith', label: 'Ends with' },\r\n { op: '=', label: 'Equals' },\r\n { op: '<>', label: 'Does not equal' },\r\n ];\r\n private static readonly SCALAR_OPS: { op: NxeFilterOp; label: string }[] = [\r\n { op: '=', label: 'Equals' },\r\n { op: '<>', label: 'Does not equal' },\r\n { op: '<', label: 'Less than' },\r\n { op: '>', label: 'Greater than' },\r\n { op: '<=', label: 'Less than or equal to' },\r\n { op: '>=', label: 'Greater than or equal to' },\r\n { op: 'between', label: 'Between' },\r\n ];\r\n private static readonly OP_ICON_SLUGS: Record<NxeFilterOp, string> = {\r\n contains: 'contains',\r\n notcontains: 'not-contains',\r\n startswith: 'starts-with',\r\n endswith: 'ends-with',\r\n '=': 'equals',\r\n '<>': 'not-equals',\r\n '<': 'less',\r\n '<=': 'less-equal',\r\n '>': 'greater',\r\n '>=': 'greater-equal',\r\n between: 'between',\r\n };\r\n\r\n protected readonly frMenuColumn = signal<NxeColumnComponent | null>(null);\r\n private frMenuOverlayRef?: OverlayRef;\r\n private readonly frMenuPanel = viewChild<TemplateRef<unknown>>('frOpMenu');\r\n\r\n /** Which editor a filter cell renders (mirrors dx: select for lookup/boolean, typed inputs). */\r\n protected frEditorKind(col: NxeColumnComponent): 'lookup' | 'boolean' | 'date' | 'number' | 'text' {\r\n if (col.lookup()) {\r\n return 'lookup';\r\n }\r\n const type = this.colType(col);\r\n return type === 'boolean' || type === 'date' || type === 'number' ? type : 'text';\r\n }\r\n\r\n /** dx shows the operation-chooser magnifier only for typed (non-select) editors. */\r\n protected frHasOpMenu(col: NxeColumnComponent): boolean {\r\n const kind = this.frEditorKind(col);\r\n return kind !== 'lookup' && kind !== 'boolean';\r\n }\r\n\r\n private frDefaultOp(col: NxeColumnComponent): NxeFilterOp {\r\n return this.frEditorKind(col) === 'text' ? 'contains' : '=';\r\n }\r\n\r\n protected frOp(col: NxeColumnComponent): NxeFilterOp {\r\n return this.filterRowState().get(col.dataField())?.op ?? this.frDefaultOp(col);\r\n }\r\n\r\n protected frText(col: NxeColumnComponent): string {\r\n return this.filterRowState().get(col.dataField())?.text ?? '';\r\n }\r\n\r\n protected frText2(col: NxeColumnComponent): string {\r\n return this.filterRowState().get(col.dataField())?.text2 ?? '';\r\n }\r\n\r\n /**\r\n * The chooser glyph: dx's magnifier ('default') until an operation is picked from the menu,\r\n * then that operation's own. Only the slug varies - the template emits `nxe-icon-filter-operation-*`\r\n * and nothing prefixed `dx-`, which the compat mirror would strip for want of an nxe twin.\r\n */\r\n protected frOpIconSlug(col: NxeColumnComponent): string {\r\n const entry = this.filterRowState().get(col.dataField());\r\n return entry?.chosen ? NxeDataGridComponent.OP_ICON_SLUGS[entry.op] : 'default';\r\n }\r\n\r\n protected opIconSlug(op: NxeFilterOp): string {\r\n return NxeDataGridComponent.OP_ICON_SLUGS[op];\r\n }\r\n\r\n protected setFilterRowText(col: NxeColumnComponent, text: string, second = false): void {\r\n const field = col.dataField();\r\n const next = new Map(this.filterRowState());\r\n const prev = next.get(field) ?? { op: this.frDefaultOp(col), text: '' };\r\n next.set(field, second ? { ...prev, text2: text } : { ...prev, text });\r\n this.filterRowState.set(next);\r\n }\r\n\r\n protected openFilterOpMenu(col: NxeColumnComponent, event: Event): void {\r\n event.stopPropagation();\r\n this.frMenuColumn.set(col);\r\n this.frMenuOverlayRef?.dispose();\r\n const origin = event.currentTarget as HTMLElement;\r\n this.frMenuOverlayRef = this.overlay.create({\r\n positionStrategy: this.overlay\r\n .position()\r\n .flexibleConnectedTo(origin)\r\n .withPositions([\r\n { originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top' },\r\n { originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom' },\r\n ]),\r\n scrollStrategy: this.overlay.scrollStrategies.reposition(),\r\n hasBackdrop: true,\r\n backdropClass: 'cdk-overlay-transparent-backdrop',\r\n panelClass: nxePane('nxe-fr-op-pane'),\r\n });\r\n this.frMenuOverlayRef.backdropClick().subscribe(() => this.closeFilterOpMenu());\r\n const panel = this.frMenuPanel();\r\n if (panel) {\r\n this.frMenuOverlayRef.attach(new TemplatePortal(panel, this.viewContainerRef));\r\n }\r\n }\r\n\r\n protected frMenuOps(): { op: NxeFilterOp; label: string }[] {\r\n const col = this.frMenuColumn();\r\n if (!col) {\r\n return [];\r\n }\r\n return this.frEditorKind(col) === 'text'\r\n ? NxeDataGridComponent.STRING_OPS\r\n : NxeDataGridComponent.SCALAR_OPS;\r\n }\r\n\r\n protected selectFilterOp(op: NxeFilterOp): void {\r\n const col = this.frMenuColumn();\r\n if (col) {\r\n const field = col.dataField();\r\n const next = new Map(this.filterRowState());\r\n const prev = next.get(field) ?? { op: this.frDefaultOp(col), text: '' };\r\n next.set(field, {\r\n ...prev,\r\n op,\r\n chosen: true,\r\n ...(op !== 'between' ? { text2: undefined } : {}),\r\n });\r\n this.filterRowState.set(next);\r\n }\r\n this.closeFilterOpMenu();\r\n }\r\n\r\n /** dx Reset menu item: restore the default operation and clear the editor. */\r\n protected resetFilterRow(): void {\r\n const col = this.frMenuColumn();\r\n if (col) {\r\n const next = new Map(this.filterRowState());\r\n next.delete(col.dataField());\r\n this.filterRowState.set(next);\r\n }\r\n this.closeFilterOpMenu();\r\n }\r\n\r\n protected closeFilterOpMenu(): void {\r\n this.frMenuOverlayRef?.detach();\r\n this.frMenuColumn.set(null);\r\n }\r\n\r\n // --- Header filter (dxo-header-filter) -------------------------------------------------------\r\n protected readonly headerFilterEnabled = computed(\r\n () => this.headerFilter()?.visible() === true || this.headerFilterOptions()?.visible === true,\r\n );\r\n\r\n protected hasHeaderFilter(col: NxeColumnComponent): boolean {\r\n return this.effectiveHeaderFilters().has(col.dataField());\r\n }\r\n\r\n /** Whether this column shows a funnel — the grid has header filtering on AND the column opts in.\r\n Named because the header cell asks three times (the caption's indicator class, the wrapper's\r\n existence, the funnel itself) and the group-panel chip asks again. */\r\n protected headerFilterVisible(col: NxeColumnComponent): boolean {\r\n return this.headerFilterEnabled() && col.allowHeaderFiltering();\r\n }\r\n\r\n /**\r\n * Normalizes a raw cell value to its header-filter key: blank-ish → the `(Blanks)` sentinel,\r\n * date columns → a `yyyy-MM-dd` day key (the tree's leaf unit), else the raw value.\r\n */\r\n private hfKey(col: NxeColumnComponent, raw: any): any {\r\n return nxeHfKey(raw, this.colType(col) === 'date');\r\n }\r\n\r\n /** dx does NOT cascade header-filter lists for client arrays (bright audit V6). */\r\n private hfBaseRows(): any[] {\r\n return (this.dataSource() ?? []) as any[];\r\n }\r\n\r\n private hfBoolLabel(col: NxeColumnComponent, raw: any): 'Yes' | 'No' | null {\r\n if (col.lookup()) {\r\n return null;\r\n }\r\n if (raw === true) {\r\n return 'Yes';\r\n }\r\n if (raw === false || this.colType(col) === 'boolean') {\r\n return 'No';\r\n }\r\n return null;\r\n }\r\n\r\n /** (Select All) checkbox state — spec-pinned alias of the model's computed\r\n ((Select All) operates on the VISIBLE keys: dx scopes it to the search). */\r\n protected readonly hfAllChecked = this.hf.allChecked;\r\n\r\n /** Default true — see NxeHeaderFilterComponent.searchEnabled. The two branches have to agree,\r\n since a grid can be configured either by the content child or by the object input. */\r\n protected hfSearchEnabled(): boolean {\r\n return (\r\n this.headerFilter()?.searchEnabled() ??\r\n this.headerFilterOptions()?.search?.enabled ??\r\n true\r\n );\r\n }\r\n\r\n protected openHeaderFilter(col: NxeColumnComponent, event: Event): void {\r\n event.stopPropagation();\r\n if (this.drag.consumeClick()) {\r\n return; // the funnel was merely the landing spot of an aborted drag\r\n }\r\n // No applied filter → everything checked; else start from the applied set.\r\n this.hf.open(col, this.effectiveHeaderFilters().get(col.dataField()));\r\n\r\n this.hfOverlayRef?.dispose();\r\n this.hfOverlayRef = openNxeHeaderFilterOverlay({\r\n overlay: this.overlay,\r\n viewContainerRef: this.viewContainerRef,\r\n origin: event.currentTarget as HTMLElement,\r\n model: this.hf,\r\n searchEnabled: () => this.hfSearchEnabled(),\r\n onApply: () => this.hfApply(),\r\n onClose: () => this.closeHeaderFilter(),\r\n });\r\n }\r\n\r\n protected hfApply(): void {\r\n const col = this.hf.column();\r\n if (col) {\r\n const next = new Map(this.hfOverride());\r\n // Everything checked (or nothing to choose from) = explicit \"no filter\" (`null` so a\r\n // declarative seed can't resurrect); else the allowed-key set (empty = empty grid).\r\n next.set(col.dataField(), this.hf.applyResult());\r\n this.hfOverride.set(next);\r\n }\r\n this.closeHeaderFilter();\r\n }\r\n\r\n protected closeHeaderFilter(): void {\r\n this.hfOverlayRef?.detach();\r\n this.hf.close();\r\n }\r\n\r\n private setColumnVisible(field: string, visible: boolean): void {\r\n this.visibilityOverride.update((m) => {\r\n const next = new Map(m);\r\n next.set(field, visible);\r\n return next;\r\n });\r\n }\r\n\r\n private compare(a: any, b: any): number {\r\n if (a == null && b == null) return 0;\r\n if (a == null) return -1;\r\n if (b == null) return 1;\r\n if (typeof a === 'number' && typeof b === 'number') return a - b;\r\n const da = parseDateValue(a);\r\n const db = parseDateValue(b);\r\n if (da && db) return da.toMillis() - db.toMillis();\r\n return String(a).localeCompare(String(b));\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.drag.destroy();\r\n this.resize.destroy();\r\n this.hfOverlayRef?.dispose();\r\n this.frMenuOverlayRef?.dispose();\r\n this.resizeObserver?.disconnect();\r\n }\r\n}\r\n","<div\r\n class=\"nxe-widget nxe-datagrid\"\r\n [class.nxe-datagrid-borders]=\"showBorders()\"\r\n [style.height]=\"heightStyle()\">\r\n <div class=\"nxe-gridbase-container\">\r\n @if (groupPanelVisible()) {\r\n <div class=\"nxe-datagrid-header-panel\">\r\n <div class=\"nxe-datagrid-group-panel\">\r\n @if (groupColumns().length === 0) {\r\n <span class=\"nxe-group-panel-message\">Drag a column header here to group by that column</span>\r\n } @else {\r\n @for (col of groupColumns(); track col.dataField(); let li = $index) {\r\n <!-- dx chip DOM: caption + sort indicator + header-filter button (bright audit) -->\r\n <div\r\n class=\"nxe-group-panel-item nxe-datagrid-action nxe-datagrid-drag-action\"\r\n tabindex=\"0\"\r\n (pointerdown)=\"onChipPointerDown(col, li, $event)\"\r\n (click)=\"onChipClick(col)\">{{ col.caption() }}<div class=\"nxe-column-indicators\" role=\"presentation\"><span\r\n class=\"nxe-sort\"\r\n [class.nxe-sort-up]=\"groupDir(col) === 'asc'\"\r\n [class.nxe-sort-down]=\"groupDir(col) === 'desc'\"></span>@if (headerFilterVisible(col)) {<span\r\n class=\"nxe-grid-hf-icon\"\r\n [class.nxe-hf-active]=\"hasHeaderFilter(col)\"\r\n (pointerdown)=\"$event.stopPropagation()\"\r\n (click)=\"openHeaderFilter(col, $event)\"></span>}</div></div>\r\n }\r\n }\r\n </div>\r\n </div>\r\n }\r\n <!-- dx drops the last row's bottom line in a bordered grid when no free-space row follows\r\n it, so the rows view's own border is the only line there (m_rows_view.js:931-937). -->\r\n <div\r\n class=\"nxe-datagrid-rowsview nxe-datagrid-after-headers\"\r\n [class.nxe-datagrid-nowrap]=\"!wordWrapEnabled()\"\r\n [class.nxe-empty]=\"isEmpty()\"\r\n [class.nxe-last-row-border]=\"showBorders() && !freeSpaceVisible()\">\r\n <div class=\"nxe-datagrid-content\">\r\n <!-- role=grid (treegrid when hierarchical) rather than the implicit table role:\r\n this is an interactive widget with a single tab stop and arrow-key movement,\r\n not a static table.\r\n\r\n aria-rowcount counts the PAGE, because aria-rowindex is page-relative and the\r\n two have to agree. Making the index absolute would be more literally correct\r\n for a paged grid, but consuming code addresses cells through it\r\n (`tr[aria-rowindex=N] > td[aria-colindex=M]`), so the index is a contract. -->\r\n <table\r\n class=\"nxe-datagrid-table nxe-datagrid-table-fixed\"\r\n [attr.role]=\"treeMode ? 'treegrid' : 'grid'\"\r\n [attr.aria-rowcount]=\"navigableRows().length\"\r\n [attr.aria-colcount]=\"visibleColumns().length + leadCellCount() + (rowEditCommandVisible() ? 1 : 0)\"\r\n [style.width]=\"tableWidthStyle()\"\r\n (keydown)=\"onGridKeydown($event)\">\r\n <colgroup>\r\n @for (i of indents(groupLevelCount()); track i) {\r\n <col style=\"width: 30px\" />\r\n }\r\n @if (masterDetailEnabled()) {\r\n <col style=\"width: 30px\" />\r\n }\r\n @if (showCheckboxes()) {\r\n <col style=\"width: 40px\" />\r\n }\r\n @for (col of visibleColumns(); track $index; let ci = $index) {\r\n <col [style.width]=\"effectiveColWidth(col, ci)\" />\r\n }\r\n @if (rowEditCommandVisible()) {\r\n <col style=\"width: 100px\" />\r\n }\r\n </colgroup>\r\n <thead class=\"nxe-datagrid-headers\">\r\n <!-- Bands add header rows: a band cell spans its visible leaves with\r\n colspan, and a leaf above the bottom row spans down with rowspan.\r\n That is dx's own banded markup, and it keeps the LAST header row\r\n all-leaves - which the auto-width, resize and drag code relies on. -->\r\n @for (hrow of headerRows(); track $index; let hi = $index) {\r\n <tr\r\n class=\"nxe-row nxe-header-row\"\r\n role=\"row\"\r\n [class.nxe-column-lines]=\"showColumnLines()\">\r\n @if (hi === 0) {\r\n <!-- dx numbers the header's command cells like the body's\r\n (m_columns_view.js:681-693); they are not role=columnheader\r\n (m_column_headers.js:193), which keeps them out of the leaf\r\n header list (nxeHeaderLeafCells). -->\r\n @for (i of indents(groupLevelCount()); track i) {\r\n <td\r\n class=\"nxe-command-expand nxe-datagrid-group-space nxe-cell-focus-disabled\"\r\n [attr.aria-colindex]=\"i + 1\"\r\n [attr.rowspan]=\"headerDepth() > 1 ? headerDepth() : null\"></td>\r\n }\r\n @if (masterDetailEnabled()) {\r\n <!-- dx gives every cell of an 'expand' command column the\r\n group-space class (m_columns_view.js:290-293), which drops\r\n the column line between it and the next cell. -->\r\n <td\r\n class=\"nxe-command-expand nxe-datagrid-group-space\"\r\n [attr.aria-colindex]=\"expandColIndex()\"\r\n [attr.rowspan]=\"headerDepth() > 1 ? headerDepth() : null\"></td>\r\n }\r\n @if (showCheckboxes()) {\r\n <td\r\n class=\"nxe-command-select\"\r\n [attr.aria-colindex]=\"selectColIndex()\"\r\n [attr.rowspan]=\"headerDepth() > 1 ? headerDepth() : null\">\r\n @if (selectionMode() === 'multiple') {\r\n <span\r\n class=\"nxe-select-checkbox nxe-grid-checkbox nxe-checkbox nxe-datagrid-checkbox-size\"\r\n role=\"checkbox\"\r\n [attr.aria-checked]=\"allSelected() ? 'true' : someSelected() ? 'mixed' : 'false'\"\r\n [class.nxe-checked]=\"allSelected()\"\r\n [class.nxe-indeterminate]=\"someSelected() && !allSelected()\"\r\n (click)=\"toggleSelectAll($event)\">\r\n <span class=\"nxe-grid-checkbox-box\"></span>\r\n </span>\r\n }\r\n </td>\r\n }\r\n }\r\n @for (cell of hrow; track $index) {\r\n @if (cell.isBand) {\r\n <!-- dx gives a band the alignment of any column: left unless set\r\n (a band has no dataType to right-align or centre it by). -->\r\n <td\r\n class=\"nxe-band-cell\"\r\n role=\"columnheader\"\r\n [class]=\"cell.column.cssClass()\"\r\n [attr.colspan]=\"cell.colspan > 1 ? cell.colspan : null\"\r\n [style.text-align]=\"align(cell.column)\">\r\n <div class=\"nxe-datagrid-text-content\">{{ cell.column.caption() }}</div>\r\n </td>\r\n } @else {\r\n @let hDir = sortDir(cell.column);\r\n @let hHf = headerFilterVisible(cell.column);\r\n @let hSortSlot = sortSlot(cell.column);\r\n @let hInd = hSortSlot || hHf;\r\n @let hAlign = align(cell.column);\r\n <!-- dx places the indicator block before the caption when column lines are\r\n on or the column is right-aligned (m_column_headers.js createCellContent,\r\n m_column_state_mixin.js _applyColumnState), floated to the cell edge\r\n only with column lines: right, or left for a right-aligned column. -->\r\n @let hLead = hInd && (showColumnLines() || hAlign === 'right');\r\n @let hFloat = showColumnLines() ? (hAlign === 'right' ? 'left' : 'right') : null;\r\n <td\r\n [class]=\"cell.column.cssClass()\"\r\n role=\"columnheader\"\r\n [attr.aria-colindex]=\"leadCellCount() + cell.leafIndex + 1\"\r\n [attr.aria-sort]=\"ariaSort(cell.column)\"\r\n [attr.tabindex]=\"isCellTabStop(-1, cell.leafIndex) ? 0 : -1\"\r\n (focus)=\"focusCell(-1, cell.leafIndex)\"\r\n [attr.rowspan]=\"cell.rowspan > 1 ? cell.rowspan : null\"\r\n [style.text-align]=\"hAlign\"\r\n [class.nxe-cell-focus-disabled]=\"!cell.column.allowSorting()\"\r\n [class.nxe-datagrid-action]=\"sortAllowed(cell.column)\"\r\n [class.nxe-datagrid-drag-action]=\"headerDraggable(cell.column)\"\r\n (pointerdown)=\"onHeaderPointerDown(cell.column, cell.leafIndex, $event)\"\r\n (click)=\"onHeaderClick(cell.column)\">\r\n @if (hLead) {\r\n <ng-container\r\n [ngTemplateOutlet]=\"headerIndicators\"\r\n [ngTemplateOutletContext]=\"{ $implicit: cell.column, dir: hDir, sortSlot: hSortSlot, hf: hHf, hfFirst: hAlign === 'right', float: hFloat }\" />\r\n }\r\n <!-- dx _alignCaptionByCenter: a centred caption gets an unfloated,\r\n invisible copy of the indicator block on its other side, so the\r\n caption centres on the cell rather than caption + arrow centring\r\n as a group. Spacers only: no sort or funnel classes (specs and\r\n apps pick funnels by index) and no handlers - a click there falls\r\n through to the cell and sorts, as dx's hidden clone lets it. -->\r\n @if (hInd && hAlign === 'center') {\r\n <div\r\n class=\"nxe-column-indicators nxe-visibility-hidden\"\r\n role=\"presentation\"\r\n aria-hidden=\"true\">\r\n @if (hSortSlot) {\r\n <span\r\n class=\"nxe-column-indicator-spacer\"\r\n [class.nxe-column-indicator-spacer-none]=\"!hDir\"></span>\r\n }\r\n @if (hHf) {\r\n <span class=\"nxe-column-indicator-spacer\"></span>\r\n }\r\n </div>\r\n }\r\n <!-- The indicator classes are load-bearing, not decorative: they gate dx's\r\n caption budget (`.dx-header-row .dx-sort-indicator{max-width:calc(100%\r\n - 17px)}` and family) and, with the alignment classes, the 3px gap to\r\n the block. dx sets alignment-left for left and centre columns and\r\n alignment-right for right and centre ones, whenever the cell has an\r\n indicator slot at all - even an unsorted, hidden one. -->\r\n <div\r\n class=\"nxe-datagrid-text-content\"\r\n [class.nxe-text-content-alignment-left]=\"hInd && hAlign !== 'right'\"\r\n [class.nxe-text-content-alignment-right]=\"hInd && hAlign !== 'left'\"\r\n [class.nxe-sort-indicator]=\"hDir !== null\"\r\n [class.nxe-header-filter-indicator]=\"hHf\">\r\n {{ cell.column.caption() }}\r\n </div>\r\n @if (hInd && !hLead) {\r\n <ng-container\r\n [ngTemplateOutlet]=\"headerIndicators\"\r\n [ngTemplateOutletContext]=\"{ $implicit: cell.column, dir: hDir, sortSlot: hSortSlot, hf: hHf, hfFirst: hAlign === 'right', float: null }\" />\r\n }\r\n @if (resizeHandleVisible(cell.column, cell.leafIndex)) {\r\n <span\r\n class=\"nxe-col-resize-handle\"\r\n (pointerdown)=\"startColumnResize(cell.column, cell.leafIndex, $event)\"></span>\r\n }\r\n </td>\r\n }\r\n }\r\n @if (hi === 0 && rowEditCommandVisible()) {\r\n <td\r\n class=\"nxe-command-edit\"\r\n [attr.aria-colindex]=\"editColIndex()\"\r\n [attr.rowspan]=\"headerDepth() > 1 ? headerDepth() : null\"></td>\r\n }\r\n </tr>\r\n }\r\n @if (filterRowVisible()) {\r\n <!-- The headers view toggles column lines on every row it renders, the\r\n filter row included (m_column_headers.js:205-207). -->\r\n <!-- Every filter-row cell is numbered, as the headers view numbers it\r\n (m_columns_view.js:681-693). -->\r\n <tr class=\"nxe-row nxe-datagrid-filter-row\" [class.nxe-column-lines]=\"showColumnLines()\">\r\n @for (i of indents(groupLevelCount()); track i) {\r\n <td class=\"nxe-command-expand nxe-datagrid-group-space\" [attr.aria-colindex]=\"i + 1\"></td>\r\n }\r\n @if (masterDetailEnabled()) {\r\n <td class=\"nxe-command-expand nxe-datagrid-group-space\" [attr.aria-colindex]=\"expandColIndex()\"></td>\r\n }\r\n @if (showCheckboxes()) {\r\n <td class=\"nxe-command-select\" [attr.aria-colindex]=\"selectColIndex()\"></td>\r\n }\r\n @for (col of visibleColumns(); track $index; let ci = $index) {\r\n <!-- dx filter cell: td.dx-editor-cell > .dx-editor-with-menu >\r\n [.dx-menu op chooser][typed editor] (dx-compat.css contract) -->\r\n <td\r\n class=\"nxe-editor-cell\"\r\n [class]=\"col.cssClass()\"\r\n [attr.aria-colindex]=\"leadCellCount() + ci + 1\">\r\n @if (col.allowFiltering()) {\r\n @switch (frEditorKind(col)) {\r\n @case ('lookup') {\r\n <select\r\n class=\"nxe-texteditor-input nxe-grid-filter-input\"\r\n [value]=\"frText(col)\"\r\n (click)=\"$event.stopPropagation()\"\r\n (change)=\"setFilterRowText(col, $any($event.target).value)\">\r\n <option value=\"\">(All)</option>\r\n @for (item of col.lookup()!.dataSource; track $index) {\r\n <option [value]=\"item[col.lookup()!.valueExpr ?? 'lovCode']\">\r\n {{ item[col.lookup()!.displayExpr ?? 'lovName'] }}\r\n </option>\r\n }\r\n </select>\r\n }\r\n @case ('boolean') {\r\n <select\r\n class=\"nxe-texteditor-input nxe-grid-filter-input\"\r\n [value]=\"frText(col)\"\r\n (click)=\"$event.stopPropagation()\"\r\n (change)=\"setFilterRowText(col, $any($event.target).value)\">\r\n <option value=\"\">(All)</option>\r\n <option value=\"true\">true</option>\r\n <option value=\"false\">false</option>\r\n </select>\r\n }\r\n @default {\r\n <div class=\"nxe-editor-with-menu\">\r\n <div class=\"nxe-menu nxe-menu-base\">\r\n <ul class=\"nxe-menu-horizontal\">\r\n <li>\r\n <div\r\n class=\"nxe-menu-item\"\r\n title=\"Filter operation\"\r\n (click)=\"openFilterOpMenu(col, $event)\">\r\n <div class=\"nxe-menu-item-content\">\r\n <span\r\n class=\"nxe-icon nxe-icon-filter-operation-{{ frOpIconSlug(col) }}\"></span>\r\n </div>\r\n </div>\r\n </li>\r\n </ul>\r\n </div>\r\n <!-- dx sets the FIRST input's text-align to the column\r\n alignment inline, unless centre (m_filter_row.js:390-395). -->\r\n <input\r\n class=\"nxe-texteditor-input nxe-grid-filter-input\"\r\n [type]=\"frEditorKind(col) === 'date' ? 'date' : 'text'\"\r\n [attr.inputmode]=\"frEditorKind(col) === 'number' ? 'decimal' : null\"\r\n [style.text-align]=\"filterCellAlign(col)\"\r\n [value]=\"frText(col)\"\r\n (input)=\"setFilterRowText(col, $any($event.target).value)\"\r\n (click)=\"$event.stopPropagation()\" />\r\n @if (frOp(col) === 'between') {\r\n <input\r\n class=\"nxe-texteditor-input nxe-grid-filter-input nxe-fr-second\"\r\n [type]=\"frEditorKind(col) === 'date' ? 'date' : 'text'\"\r\n [attr.inputmode]=\"frEditorKind(col) === 'number' ? 'decimal' : null\"\r\n [value]=\"frText2(col)\"\r\n (input)=\"setFilterRowText(col, $any($event.target).value, true)\"\r\n (click)=\"$event.stopPropagation()\" />\r\n }\r\n </div>\r\n }\r\n }\r\n }\r\n </td>\r\n }\r\n @if (rowEditCommandVisible()) {\r\n <td class=\"nxe-command-edit\" [attr.aria-colindex]=\"editColIndex()\"></td>\r\n }\r\n </tr>\r\n }\r\n </thead>\r\n <tbody>\r\n @for (item of renderRows(); track $index; let ri = $index) {\r\n @if (item.kind === 'group') {\r\n <!-- dx group-row anatomy (bright audit): [indent cells][expand chevron\r\n cell][dx-group-cell colspan][alignByColumn summary cells]. dx numbers\r\n every cell of a rows-view row, command cells included\r\n (m_columns_view.js:681-693), and the caption as the cell after the\r\n toggle (m_rows_view.js:626-635, columnIndex groupIndex + 1). That\r\n number can be a data column's, so dx looks group rows up with\r\n `:not(.dx-group-cell)` (m_columns_view.js:942), and onCellPrepared\r\n reports the caption as no column. -->\r\n <tr\r\n class=\"nxe-row nxe-group-row\"\r\n [class.nxe-column-lines]=\"showColumnLines()\"\r\n [attr.aria-roledescription]=\"item.collapsed ? 'Collapsed row' : 'Expanded row'\">\r\n @for (i of indents(item.level); track i) {\r\n <td class=\"nxe-command-expand nxe-datagrid-group-space\" [attr.aria-colindex]=\"i + 1\"></td>\r\n }\r\n <td\r\n class=\"nxe-command-expand nxe-datagrid-group-space nxe-datagrid-expand nxe-selection-disabled\"\r\n [attr.aria-colindex]=\"item.level + 1\"\r\n [attr.aria-label]=\"item.collapsed ? 'Expand' : 'Collapse'\"\r\n (click)=\"toggleGroup(item.groupKey)\">\r\n <div\r\n [class.nxe-datagrid-group-opened]=\"!item.collapsed\"\r\n [class.nxe-datagrid-group-closed]=\"item.collapsed\"></div>\r\n </td>\r\n <td\r\n class=\"nxe-group-cell\"\r\n [attr.aria-colindex]=\"item.level + 2\"\r\n [attr.colspan]=\"groupCellColspan(item)\">\r\n @if (templateFor(item.column.groupCellTemplate()); as gtpl) {\r\n <ng-container\r\n [ngTemplateOutlet]=\"gtpl\"\r\n [ngTemplateOutletContext]=\"groupCellContext(item)\" />\r\n } @else {\r\n {{ item.column.caption() }}: {{ item.text }}{{ item.captionSuffix }}\r\n }\r\n </td>\r\n @for (col of groupRowTrailing(item); track col.dataField()) {\r\n <td\r\n class=\"nxe-datagrid-summary-item\"\r\n [attr.aria-colindex]=\"leadCellCount() + visibleIndexOf(col) + 1\"\r\n [style.text-align]=\"align(col)\">\r\n {{ item.alignedSums.get(col.dataField()) || '' }}\r\n </td>\r\n }\r\n @if (groupRowTrailing(item).length && rowEditCommandVisible()) {\r\n <td class=\"nxe-command-edit\" [attr.aria-colindex]=\"editColIndex()\"></td>\r\n }\r\n </tr>\r\n } @else if (item.kind === 'groupFooter') {\r\n <!-- dx's group footer: dx-datagrid-group-footer, and column lines like\r\n any row the rows view renders (m_rows_view.js:222-229). Row lines are\r\n data rows' only (:228); the line under a footer is the column-lines\r\n rule's. -->\r\n <tr\r\n class=\"nxe-row nxe-group-footer-row nxe-datagrid-group-footer\"\r\n [class]=\"'nxe-group-footer-level-' + item.level\"\r\n [class.nxe-column-lines]=\"showColumnLines()\">\r\n @for (i of indents(groupLevelCount()); track i) {\r\n <td class=\"nxe-command-expand nxe-datagrid-group-space\" [attr.aria-colindex]=\"i + 1\"></td>\r\n }\r\n @if (masterDetailEnabled()) {\r\n <td class=\"nxe-command-expand nxe-datagrid-group-space\" [attr.aria-colindex]=\"expandColIndex()\"></td>\r\n }\r\n @if (showCheckboxes()) {\r\n <td class=\"nxe-command-select\" [attr.aria-colindex]=\"selectColIndex()\"></td>\r\n }\r\n @for (col of visibleColumns(); track col.dataField()) {\r\n <td\r\n class=\"nxe-datagrid-summary-item\"\r\n [attr.aria-colindex]=\"leadCellCount() + visibleIndexOf(col) + 1\"\r\n [style.text-align]=\"align(col)\">\r\n {{ item.sums.get(col.dataField()) || '' }}\r\n </td>\r\n }\r\n @if (rowEditCommandVisible()) {\r\n <td class=\"nxe-command-edit\" [attr.aria-colindex]=\"editColIndex()\"></td>\r\n }\r\n </tr>\r\n } @else {\r\n <tr\r\n class=\"nxe-row nxe-data-row\"\r\n role=\"row\"\r\n [class]=\"rowClassFor(item.row)\"\r\n [attr.aria-rowindex]=\"item.rowIndex + 1\"\r\n [attr.aria-selected]=\"selectionMode() === 'none' ? null : isSelected(item.row)\"\r\n [class.nxe-row-lines]=\"showRowLines()\"\r\n [class.nxe-column-lines]=\"showColumnLines()\"\r\n [class.nxe-row-alt]=\"rowAlternationEnabled() && item.rowIndex % 2 === 1\"\r\n [class.nxe-selection]=\"isSelected(item.row)\"\r\n [class.nxe-state-hover]=\"isHovered(item.rowIndex)\"\r\n [class.nxe-edit-row]=\"isRowEditing(item.row)\"\r\n (mouseenter)=\"onRowEnter(item.rowIndex)\"\r\n (mouseleave)=\"onRowLeave()\"\r\n (click)=\"onDataRowClick(item.row, item.rowIndex)\">\r\n @for (i of indents(groupLevelCount()); track i) {\r\n <td class=\"nxe-command-expand nxe-datagrid-group-space\" [attr.aria-colindex]=\"i + 1\"></td>\r\n }\r\n @if (masterDetailEnabled()) {\r\n <!-- dx reuses the group row's toggle for the detail row\r\n (m_master_detail.js:33-43, m_utils.js:462-474), and any click\r\n in the cell toggles (m_grouping.js:523-532 `closest('.dx-datagrid-expand')`).\r\n toggleDetail stops the click there, as dx-selection-disabled does. -->\r\n <td\r\n class=\"nxe-command-expand nxe-datagrid-group-space nxe-datagrid-expand nxe-selection-disabled\"\r\n [attr.aria-colindex]=\"expandColIndex()\"\r\n [attr.aria-label]=\"isDetailExpanded(item.row) ? 'Collapse' : 'Expand'\"\r\n (click)=\"toggleDetail(item.row, $event)\">\r\n <div\r\n [class.nxe-datagrid-group-opened]=\"isDetailExpanded(item.row)\"\r\n [class.nxe-datagrid-group-closed]=\"!isDetailExpanded(item.row)\"></div>\r\n </td>\r\n }\r\n @if (showCheckboxes()) {\r\n <td class=\"nxe-command-select\" [attr.aria-colindex]=\"selectColIndex()\">\r\n <span\r\n class=\"nxe-select-checkbox nxe-grid-checkbox nxe-checkbox nxe-datagrid-checkbox-size\"\r\n role=\"checkbox\"\r\n [attr.aria-checked]=\"isSelected(item.row)\"\r\n [class.nxe-checked]=\"isSelected(item.row)\"\r\n (click)=\"onCheckboxClick(item.row, $event)\">\r\n <span class=\"nxe-grid-checkbox-box\"></span>\r\n </span>\r\n </td>\r\n }\r\n @for (col of visibleColumns(); track $index; let ci = $index) {\r\n @if (!isMergeSuppressed(ri, col)) {\r\n <td\r\n [class]=\"col.cssClass()\"\r\n role=\"gridcell\"\r\n [attr.aria-colindex]=\"leadCellCount() + ci + 1\"\r\n [attr.tabindex]=\"isCellTabStop(item.rowIndex, ci) ? 0 : -1\"\r\n (focus)=\"focusCell(item.rowIndex, ci)\"\r\n [attr.aria-roledescription]=\"\r\n editableCell(col) && (cellEditingEnabled() || rowEditingEnabled())\r\n ? 'Editable'\r\n : null\r\n \"\r\n [style.text-align]=\"align(col)\"\r\n [attr.rowspan]=\"mergeSpan(ri, col)\"\r\n [class.nxe-editor-cell]=\"isEditingCell(item.row, col) || (isRowEditing(item.row) && editableCell(col))\"\r\n (click)=\"onCellClick(item.row, col, $event)\"\r\n (focusout)=\"onEditCellFocusOut(item.row, col, $event)\">\r\n @if (treeMode && ci === 0) {\r\n <!-- dx's tree icons (dx-treelist-icon-container): one 14px slot\r\n per level, then the 14x18 toggle or, on a leaf, one more slot.\r\n Floated as dx floats it in the fixed table, so the text\r\n wraps beside it and starts flush after it. Not named\r\n nxe-treelist-*: the dx mirror would hand it to an app's\r\n newer-dx tree layout (18px slots). -->\r\n <span class=\"nxe-tree-icons\">\r\n @for (i of indents(item.level || 0); track i) {\r\n <span class=\"nxe-tree-expander-stub\"></span>\r\n }\r\n @if (item.hasChildren) {\r\n <span\r\n class=\"nxe-tree-expander\"\r\n [class.nxe-collapsed]=\"!item.expanded\"\r\n (click)=\"toggleTreeNode(item.nodeKey, $event)\"></span>\r\n } @else {\r\n <span class=\"nxe-tree-expander-stub\"></span>\r\n }\r\n </span>\r\n }\r\n @if (isEditingCell(item.row, col) || (isRowEditing(item.row) && editableCell(col))) {\r\n @if (templateFor(col.editCellTemplate()); as etpl) {\r\n <ng-container\r\n [ngTemplateOutlet]=\"etpl\"\r\n [ngTemplateOutletContext]=\"editCellContext(item.row, item.rowIndex, ci, col)\" />\r\n } @else if (isEditingCell(item.row, col)) {\r\n <ng-container\r\n [ngTemplateOutlet]=\"cellEditor\"\r\n [ngTemplateOutletContext]=\"{ row: item.row, col: col, mode: 'cell' }\" />\r\n } @else {\r\n <ng-container\r\n [ngTemplateOutlet]=\"cellEditor\"\r\n [ngTemplateOutletContext]=\"{ row: item.row, col: col, mode: 'row' }\" />\r\n }\r\n } @else if (templateFor(col.cellTemplate()); as tpl) {\r\n <ng-container\r\n [ngTemplateOutlet]=\"tpl\"\r\n [ngTemplateOutletContext]=\"cellContext(item.row, item.rowIndex, ci, col)\" />\r\n } @else if (isBooleanCell(col)) {\r\n <!-- dx showEditorAlways: a boolean cell is a dx checkbox, not\r\n \"true\"/\"false\". It is read-only unless the grid edits cells\r\n and the column is editable (m_editing.js:210, 1832-1847);\r\n then one click toggles the value in place. -->\r\n <span\r\n class=\"nxe-grid-checkbox nxe-grid-checkbox-readonly nxe-checkbox nxe-datagrid-checkbox-size\"\r\n role=\"checkbox\"\r\n [class.nxe-grid-checkbox-left]=\"align(col) === 'left'\"\r\n [class.nxe-grid-checkbox-right]=\"align(col) === 'right'\"\r\n [class.nxe-checked]=\"getRaw(item.row, col.dataField()) === true\"\r\n [class.nxe-state-readonly]=\"booleanReadOnly(col)\"\r\n [attr.aria-checked]=\"getRaw(item.row, col.dataField()) === true\"\r\n [attr.aria-readonly]=\"booleanReadOnly(col) ? 'true' : null\"\r\n (click)=\"onBooleanCellClick(item.row, col, $event)\">\r\n <span class=\"nxe-grid-checkbox-box\"></span>\r\n </span>\r\n } @else {\r\n <!-- In an ng-container so the text node carries no padding space:\r\n after the tree icons one would render as a 3px gap. -->\r\n <ng-container>{{ cellText(col, item.row) }}</ng-container>\r\n }\r\n </td>\r\n }\r\n }\r\n @if (rowEditCommandVisible()) {\r\n <td class=\"nxe-command-edit nxe-datagrid-drag-action\" [attr.aria-colindex]=\"editColIndex()\">\r\n @if (isRowEditing(item.row)) {\r\n <a class=\"nxe-link nxe-link-save\" (click)=\"saveRowEdit(item.row, $event)\">Save</a>\r\n <a class=\"nxe-link nxe-link-cancel\" (click)=\"cancelRowEdit($event)\">Cancel</a>\r\n } @else {\r\n <a class=\"nxe-link nxe-link-edit\" (click)=\"startRowEdit(item.row, $event)\">Edit</a>\r\n }\r\n </td>\r\n }\r\n </tr>\r\n @if (masterDetailEnabled() && isDetailExpanded(item.row)) {\r\n <!-- dx's detail row takes row lines as well as column lines, and its one\r\n cell is dx-master-detail-cell (m_master_detail.js:290-294, :325),\r\n rendered as column 0 - so aria-colindex 1. -->\r\n <tr\r\n class=\"nxe-row nxe-master-detail-row\"\r\n [class.nxe-row-lines]=\"showRowLines()\"\r\n [class.nxe-column-lines]=\"showColumnLines()\">\r\n <td class=\"nxe-master-detail-cell nxe-cell-focus-disabled\" aria-colindex=\"1\" [attr.colspan]=\"allColCount()\">\r\n @if (detailTemplate(); as tpl) {\r\n <ng-container\r\n [ngTemplateOutlet]=\"tpl\"\r\n [ngTemplateOutletContext]=\"detailContext(item.row, item.rowIndex)\" />\r\n }\r\n </td>\r\n </tr>\r\n }\r\n }\r\n }\r\n <!-- dx's free-space row (m_rows_view.js:448-466): one cell per column, so the\r\n column lines run on through the space it fills. The row is\r\n role=\"presentation\", as dx's `_createEmptyRow` makes it, so assistive tech\r\n inside role=grid does not meet a row of empty gridcells; its cells take\r\n no role and no aria-colindex: nothing that addresses cells may count them. -->\r\n <tr\r\n role=\"presentation\"\r\n class=\"nxe-row nxe-freespace-row\"\r\n [class.nxe-column-lines]=\"showColumnLines()\"\r\n [style.height.px]=\"freeSpaceHeight() || null\">\r\n @for (i of indents(groupLevelCount()); track i) {\r\n <td class=\"nxe-command-expand nxe-datagrid-group-space\"></td>\r\n }\r\n @if (masterDetailEnabled()) {\r\n <td class=\"nxe-command-expand nxe-datagrid-group-space\"></td>\r\n }\r\n @if (showCheckboxes()) {\r\n <td class=\"nxe-command-select\"></td>\r\n }\r\n @for (col of visibleColumns(); track $index) {\r\n <td [class]=\"col.cssClass()\"></td>\r\n }\r\n @if (rowEditCommandVisible()) {\r\n <td class=\"nxe-command-edit\"></td>\r\n }\r\n </tr>\r\n </tbody>\r\n @if (hasTotalFooter()) {\r\n <tfoot class=\"nxe-datagrid-total-footer\">\r\n <tr class=\"nxe-row\">\r\n @for (i of indents(groupLevelCount()); track i) {\r\n <td class=\"nxe-command-expand nxe-datagrid-group-space\" [attr.aria-colindex]=\"i + 1\"></td>\r\n }\r\n @if (masterDetailEnabled()) {\r\n <td class=\"nxe-command-expand nxe-datagrid-group-space\" [attr.aria-colindex]=\"expandColIndex()\"></td>\r\n }\r\n @if (showCheckboxes()) {\r\n <td class=\"nxe-command-select\" [attr.aria-colindex]=\"selectColIndex()\"></td>\r\n }\r\n @for (col of visibleColumns(); track col.dataField()) {\r\n <td\r\n class=\"nxe-datagrid-summary-item\"\r\n [attr.aria-colindex]=\"leadCellCount() + visibleIndexOf(col) + 1\"\r\n [style.text-align]=\"align(col)\">\r\n {{ totalSums().get(col.dataField()) || '' }}\r\n </td>\r\n }\r\n @if (rowEditCommandVisible()) {\r\n <td class=\"nxe-command-edit\" [attr.aria-colindex]=\"editColIndex()\"></td>\r\n }\r\n </tr>\r\n </tfoot>\r\n }\r\n </table>\r\n </div>\r\n\r\n @if (isEmpty()) {\r\n <!-- dx `.dx-datagrid-rowsview.dx-empty{height:100px}`: our rows view also holds the\r\n <thead>, so the empty body is its own box after the table. dx appends the nodata\r\n span to the rows view outside its scrollable (m_utils.js:206-210) and positions the\r\n load panel `of:` the rows view, header excluded (m_rows_view.js:1023) - both live\r\n in this box. The load panel can: loading() implies a null source, hence no rows.\r\n If the total footer is ever shown for empty data (dx m_summary.js:487-503), this\r\n box has to move between the <tbody> and the <tfoot>. -->\r\n <div class=\"nxe-datagrid-empty-body\">\r\n @if (!loading()) {\r\n <span class=\"nxe-datagrid-nodata\">{{ noDataText() }}</span>\r\n } @else {\r\n <div class=\"nxe-datagrid-loadpanel\"><span class=\"nxe-grid-spinner\"></span></div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n\r\n @if (pagerVisible()) {\r\n <!-- dx's pager (pagination/content.js) under dx's class names: the page sizes float left;\r\n the pages float right - the info text, then prev, the page buttons and next. dx\r\n renders div[role=button]s; these are real buttons with dx's labels. The prev/next\r\n buttons are empty: the chevron is drawn by CSS. At either end dx only takes the\r\n button out of the tab order (page_index_selector.js), so it keeps focus rather than\r\n dropping it as a disabled button would; a click there is a no-op (goToPage clamps). -->\r\n <div\r\n class=\"nxe-datagrid-pager nxe-pager nxe-grid-pager\"\r\n role=\"navigation\"\r\n [attr.aria-label]=\"pagerCmp()?.label()\">\r\n @if (pagerCmp()?.showPageSizeSelector()) {\r\n <div class=\"nxe-page-sizes\">\r\n @if (pagerCompact()) {\r\n @if (pageSizes().length) {\r\n <select class=\"nxe-pager-size\" aria-label=\"Page size\" (change)=\"onPageSizeSelect($event)\">\r\n @for (s of pageSizes(); track $index) {\r\n <option [value]=\"s\" [selected]=\"s === effectivePageSize()\">{{ s }}</option>\r\n }\r\n </select>\r\n }\r\n } @else {\r\n @for (s of pageSizes(); track $index; let first = $first) {\r\n <button\r\n type=\"button\"\r\n class=\"nxe-page-size\"\r\n [class.nxe-selection]=\"s === effectivePageSize()\"\r\n [class.nxe-first-child]=\"first\"\r\n [attr.aria-label]=\"'Items per page: ' + s\"\r\n (click)=\"changePageSize(s)\">{{ s }}</button>\r\n }\r\n }\r\n </div>\r\n }\r\n <div class=\"nxe-pages\">\r\n @if (pagerCmp()?.showInfo()) {\r\n <div class=\"nxe-info nxe-pager-info\">{{ pageInfo() }}</div>\r\n }\r\n <div class=\"nxe-page-indexes nxe-pager-pages\">\r\n @if (pagerNavVisible()) {\r\n <button\r\n type=\"button\"\r\n class=\"nxe-navigate-button nxe-prev-button nxe-pager-nav\"\r\n [class.nxe-button-disable]=\"currentPage() === 0\"\r\n [attr.aria-disabled]=\"currentPage() === 0 ? 'true' : null\"\r\n [attr.tabindex]=\"currentPage() === 0 ? -1 : null\"\r\n aria-label=\"Previous page\"\r\n (click)=\"prevPage()\"></button>\r\n }\r\n @for (item of pageItems(); track item.key) {\r\n @if (item.separator) {\r\n <div class=\"nxe-separator\">. . .</div>\r\n } @else {\r\n <button\r\n type=\"button\"\r\n class=\"nxe-page nxe-pager-page\"\r\n [class.nxe-selection]=\"item.page === currentPage()\"\r\n [class.nxe-active]=\"item.page === currentPage()\"\r\n [attr.aria-label]=\"'Page ' + (item.page + 1)\"\r\n [attr.aria-current]=\"item.page === currentPage() ? 'page' : null\"\r\n (click)=\"goToPage(item.page)\">{{ item.page + 1 }}</button>\r\n }\r\n }\r\n @if (pagerNavVisible()) {\r\n <button\r\n type=\"button\"\r\n class=\"nxe-navigate-button nxe-next-button nxe-pager-nav\"\r\n [class.nxe-button-disable]=\"currentPage() >= pageCount() - 1\"\r\n [attr.aria-disabled]=\"currentPage() >= pageCount() - 1 ? 'true' : null\"\r\n [attr.tabindex]=\"currentPage() >= pageCount() - 1 ? -1 : null\"\r\n aria-label=\"Next page\"\r\n (click)=\"nextPage()\"></button>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n</div>\r\n\r\n<!-- Inline cell/row editor (dxo-editing, orbit addition). `mode: 'cell'` commits on blur/Enter;\r\n `mode: 'row'` buffers on input until the command column's Save. -->\r\n<ng-template #cellEditor let-row=\"row\" let-col=\"col\" let-mode=\"mode\">\r\n @if (col.lookup(); as lookup) {\r\n <select\r\n class=\"nxe-texteditor-input nxe-grid-cell-editor\"\r\n [value]=\"editorInputValue(row, col)\"\r\n (click)=\"$event.stopPropagation()\"\r\n (change)=\"\r\n mode === 'cell'\r\n ? commitCellEdit(row, col, $any($event.target).value)\r\n : bufferRowEdit(col, $any($event.target).value)\r\n \">\r\n <option value=\"\"></option>\r\n @for (item of lookup.dataSource; track $index) {\r\n <option [value]=\"item[lookup.valueExpr ?? 'lovCode']\">\r\n {{ item[lookup.displayExpr ?? 'lovName'] }}\r\n </option>\r\n }\r\n </select>\r\n } @else if (colType(col) === 'boolean') {\r\n <!-- dx's checkbox editor, the same box as the resting boolean cell (never the browser's\r\n native checkbox). Cell mode toggles resting cells in place and never gets here; this\r\n is the row being edited, and a click or Space only buffers until Save. It takes focus\r\n as dx's dxCheckBox does (tabIndex 0, Space toggles: check_box.js:125), so Tab reaches\r\n it with the row's other editors. -->\r\n <span\r\n class=\"nxe-grid-checkbox nxe-grid-checkbox-readonly nxe-checkbox nxe-datagrid-checkbox-size nxe-grid-cell-editor-check\"\r\n role=\"checkbox\"\r\n tabindex=\"0\"\r\n [class.nxe-grid-checkbox-left]=\"align(col) === 'left'\"\r\n [class.nxe-grid-checkbox-right]=\"align(col) === 'right'\"\r\n [class.nxe-checked]=\"editorChecked(row, col)\"\r\n [attr.aria-checked]=\"editorChecked(row, col)\"\r\n (click)=\"toggleEditorCheck(row, col, mode, $event)\"\r\n (keydown.space)=\"toggleEditorCheck(row, col, mode, $event)\">\r\n <span class=\"nxe-grid-checkbox-box\"></span>\r\n </span>\r\n } @else {\r\n <input\r\n type=\"text\"\r\n class=\"nxe-texteditor-input nxe-grid-cell-editor\"\r\n [value]=\"editorInputValue(row, col)\"\r\n (click)=\"$event.stopPropagation()\"\r\n (keydown.enter)=\"mode === 'cell' && commitCellEdit(row, col, $any($event.target).value)\"\r\n (keydown.escape)=\"mode === 'cell' && cancelCellEdit()\"\r\n (blur)=\"mode === 'cell' && commitCellEdit(row, col, $any($event.target).value)\"\r\n (input)=\"mode === 'row' && bufferRowEdit(col, $any($event.target).value)\" />\r\n }\r\n</ng-template>\r\n\r\n<!-- A header cell's indicator block (dx .dx-column-indicators). dx creates the sort span first and\r\n the funnel second; the funnel is prepended when the column is right-aligned\r\n (m_header_filter_core.js _renderIndicator), so a right-aligned column reads [funnel][sort] and\r\n every other [sort][funnel]. An unsorted sortable column keeps an empty `nxe-sort-none` span, as\r\n dx does: hidden in the fixed table, measured by the best-fit pass. -->\r\n<ng-template\r\n #headerIndicators\r\n let-col\r\n let-dir=\"dir\"\r\n let-sortSlot=\"sortSlot\"\r\n let-hf=\"hf\"\r\n let-hfFirst=\"hfFirst\"\r\n let-float=\"float\">\r\n <div class=\"nxe-column-indicators\" role=\"presentation\" [style.float]=\"float\">\r\n @for (kind of hfFirst ? ['funnel', 'sort'] : ['sort', 'funnel']; track kind) {\r\n @if (kind === 'funnel') {\r\n @if (hf) {\r\n <span\r\n class=\"nxe-grid-hf-icon\"\r\n [class.nxe-hf-active]=\"hasHeaderFilter(col)\"\r\n (click)=\"openHeaderFilter(col, $event)\"></span>\r\n }\r\n } @else if (sortSlot) {\r\n <span\r\n class=\"nxe-sort\"\r\n [class.nxe-sort-none]=\"!dir\"\r\n [class.nxe-sort-up]=\"dir === 'asc'\"\r\n [class.nxe-sort-down]=\"dir === 'desc'\"></span>\r\n }\r\n }\r\n </div>\r\n</ng-template>\r\n\r\n<!-- The header-filter popup (#hfPanel) moved to nxe-header-filter-panel.component.html —\r\n openHeaderFilter attaches it through openNxeHeaderFilterOverlay (pivot parity Phase 3a). -->\r\n\r\n<!-- Filter-row operation-chooser dropdown (dx filter menu) -->\r\n<ng-template #frOpMenu>\r\n <div class=\"nxe-fr-op-menu nxe-datagrid\">\r\n @for (item of frMenuOps(); track item.op) {\r\n <div\r\n class=\"nxe-menu-item\"\r\n [class.nxe-menu-item-selected]=\"frMenuColumn() && frOp(frMenuColumn()!) === item.op\"\r\n (click)=\"selectFilterOp(item.op)\">\r\n <span class=\"nxe-icon nxe-icon-filter-operation-{{ opIconSlug(item.op) }}\"></span>\r\n <span class=\"nxe-menu-item-text\">{{ item.label }}</span>\r\n </div>\r\n }\r\n <!-- dx draws Reset with the chooser's own magnifier. -->\r\n <div class=\"nxe-menu-item nxe-fr-reset\" (click)=\"resetFilterRow()\">\r\n <span class=\"nxe-icon nxe-icon-filter-operation-default\"></span>\r\n <span class=\"nxe-menu-item-text\">Reset</span>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n","// @nexterajs/ui/grid — public API.\r\nexport * from './lib/grid/nxe-format.util';\r\nexport * from './lib/grid/nxe-grid-drag';\r\nexport * from './lib/grid/nxe-grid.types';\r\nexport * from './lib/grid/nxe-column.component';\r\nexport * from './lib/grid/nxe-selection.component';\r\nexport * from './lib/grid/nxe-header-filter.component';\r\nexport * from './lib/grid/nxe-header-filter.model';\r\nexport * from './lib/grid/nxe-header-filter-panel.component';\r\nexport * from './lib/grid/nxe-header-filter-overlay';\r\nexport * from './lib/grid/nxe-grouping.component';\r\nexport * from './lib/grid/nxe-summary.component';\r\nexport * from './lib/grid/nxe-paging.component';\r\nexport * from './lib/grid/nxe-editing.component';\r\nexport * from './lib/grid/nxe-filter-row.component';\r\nexport * from './lib/grid/nxe-master-detail.component';\r\nexport * from './lib/grid/nxe-scrolling.component';\r\nexport * from './lib/grid/nxe-excel-export.service';\r\nexport * from './lib/grid/nxe-data-grid.component';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"nexterajs-ui-grid.mjs","sources":["../../../projects/nextera-ui/grid/src/lib/grid/nxe-format.util.ts","../../../projects/nextera-ui/grid/src/lib/grid/nxe-grid-dom.ts","../../../projects/nextera-ui/grid/src/lib/grid/nxe-grid-drag.ts","../../../projects/nextera-ui/grid/src/lib/grid/nxe-grid.types.ts","../../../projects/nextera-ui/grid/src/lib/grid/nxe-header-filter.component.ts","../../../projects/nextera-ui/grid/src/lib/grid/nxe-column.component.ts","../../../projects/nextera-ui/grid/src/lib/grid/nxe-selection.component.ts","../../../projects/nextera-ui/grid/src/lib/grid/nxe-header-filter.model.ts","../../../projects/nextera-ui/grid/src/lib/grid/nxe-header-filter-panel.component.ts","../../../projects/nextera-ui/grid/src/lib/grid/nxe-header-filter-panel.component.html","../../../projects/nextera-ui/grid/src/lib/grid/nxe-header-filter-overlay.ts","../../../projects/nextera-ui/grid/src/lib/grid/nxe-grouping.component.ts","../../../projects/nextera-ui/grid/src/lib/grid/nxe-summary.component.ts","../../../projects/nextera-ui/grid/src/lib/grid/nxe-paging.component.ts","../../../projects/nextera-ui/grid/src/lib/grid/nxe-editing.component.ts","../../../projects/nextera-ui/grid/src/lib/grid/nxe-filter-row.component.ts","../../../projects/nextera-ui/grid/src/lib/grid/nxe-master-detail.component.ts","../../../projects/nextera-ui/grid/src/lib/grid/nxe-scrolling.component.ts","../../../projects/nextera-ui/grid/src/lib/grid/nxe-excel-export.service.ts","../../../projects/nextera-ui/grid/src/lib/grid/nxe-remote-data-source.ts","../../../projects/nextera-ui/grid/src/lib/grid/nxe-pager.util.ts","../../../projects/nextera-ui/grid/src/lib/grid/nxe-paginator.component.ts","../../../projects/nextera-ui/grid/src/lib/grid/nxe-paginator.component.html","../../../projects/nextera-ui/grid/src/lib/grid/nxe-grid-resize.ts","../../../projects/nextera-ui/grid/src/lib/grid/nxe-data-grid.component.ts","../../../projects/nextera-ui/grid/src/lib/grid/nxe-data-grid.component.html","../../../projects/nextera-ui/grid/src/public-api.ts","../../../projects/nextera-ui/grid/src/nexterajs-ui-grid.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\r\n// Shared value-formatting helpers for the nxe grid family — the single source of truth for how\r\n// a dx-style column/field `format` renders. Extracted from nxe-data-grid's private\r\n// `defaultFormat()`/`datePattern()` (the grid delegates here unchanged); the pivot resolves its\r\n// data-field formats through the same functions so both widgets can never drift apart.\r\n//\r\n// dx `{ type }` format objects resolve to the library's own LDML masks:\r\n// { type: 'fixedPoint', precision: N } → '#,##0' + N decimals\r\n// { type: 'currency', precision: N } → the same mask — deliberately WITHOUT a currency\r\n// symbol (recorded in DEFAULTS.md)\r\n// { type: 'percent', precision: N } → value × 100 + '%' (Excel's own '%' code multiplies,\r\n// so the exported mask carries a bare '%')\r\n// { type: '<date pattern>' } → the pattern itself (the app's `Format.DATE`)\r\n// { formatter } → the function's own text\r\n\r\nimport { formatDisplay, parseDateValue } from '@nexterajs/ui/intl';\r\nimport {\r\n formatNumber,\r\n NXE_EN_US_SEPARATORS,\r\n NxeNumberSeparators,\r\n parseNumberFormat,\r\n} from '@nexterajs/ui/intl';\r\nimport { NxeColumnDataType, NxeColumnFormat } from './nxe-grid.types';\r\n\r\n/** `precision: 2` → `'.00'`; absent/zero precision → `''` (dx defaults fixedPoint to 0). */\r\nfunction precisionDecimals(precision: number | undefined): string {\r\n return precision && precision > 0 ? '.' + '0'.repeat(precision) : '';\r\n}\r\n\r\n/** Resolve a `format` to a date display pattern — a `{ type }` object's `type` IS the pattern. */\r\nexport function nxeDatePattern(format: NxeColumnFormat | undefined, fallback = 'dd MMM yyyy'): string {\r\n if (!format) {\r\n return fallback;\r\n }\r\n return typeof format === 'string' ? format : format.type ?? fallback;\r\n}\r\n\r\n/**\r\n * Resolve a `format` to the LDML number mask the library's number engine understands: string\r\n * masks pass through; `{ type: 'fixedPoint' | 'currency', precision }` build a grouped mask\r\n * (`currency` deliberately carries NO symbol — DEFAULTS.md). Anything else → `undefined`.\r\n */\r\nexport function nxeNumberMask(format: NxeColumnFormat | undefined): string | undefined {\r\n if (!format) {\r\n return undefined;\r\n }\r\n if (typeof format === 'string') {\r\n return format;\r\n }\r\n if (format.type === 'fixedPoint' || format.type === 'currency') {\r\n return '#,##0' + precisionDecimals(format.precision);\r\n }\r\n return undefined;\r\n}\r\n\r\n/**\r\n * Format a numeric value per a dx-style `format` (string mask, `{ type }` object, or\r\n * `{ formatter }`). No format / an unresolvable one → `String(value)` (the grid's untyped\r\n * rendering).\r\n */\r\nexport function nxeFormatNumberValue(\r\n value: number,\r\n format: NxeColumnFormat | undefined,\r\n separators: NxeNumberSeparators = NXE_EN_US_SEPARATORS,\r\n): string {\r\n if (format && typeof format === 'object') {\r\n if (typeof format.formatter === 'function') {\r\n return String(format.formatter(value));\r\n }\r\n if (format.type === 'percent') {\r\n const mask = '#,##0' + precisionDecimals(format.precision) + '%';\r\n return formatNumber(value * 100, parseNumberFormat(mask), separators);\r\n }\r\n }\r\n const mask = nxeNumberMask(format);\r\n return mask ? formatNumber(value, parseNumberFormat(mask), separators) : String(value);\r\n}\r\n\r\n/**\r\n * Derive the Excel `numFmt` mask for a `format`: string masks go through\r\n * {@link nxeExcelNumberMask} (the same conversion the grid export uses), fixedPoint/currency\r\n * come from {@link nxeNumberMask}, percent appends a bare `%` (Excel multiplies by 100 itself),\r\n * and any other `{ type }` is a date pattern used as-is. `{ formatter }`-only objects →\r\n * `undefined` (callers fall back to exporting the formatted text).\r\n */\r\nexport function nxeExcelNumFmt(format: NxeColumnFormat | undefined): string | undefined {\r\n if (!format) {\r\n return undefined;\r\n }\r\n if (typeof format === 'string') {\r\n return nxeExcelNumberMask(format);\r\n }\r\n if (typeof format.formatter === 'function') {\r\n return undefined;\r\n }\r\n if (format.type === 'percent') {\r\n return '#,##0' + precisionDecimals(format.precision) + '%';\r\n }\r\n return nxeNumberMask(format) ?? format.type ?? undefined;\r\n}\r\n\r\n/** Excel's digit placeholders. */\r\nconst NXE_DIGIT_PLACEHOLDERS = new Set(['0', '#', '?']);\r\n\r\n/**\r\n * Excel `numFmt` for a dx LDML string mask.\r\n *\r\n * The two languages disagree on one character. In Excel an unquoted comma after the last digit\r\n * placeholder SCALES the value by 1/1000, while dx's LDML engine ignores it (see the golden\r\n * transcript in `@nexterajs/ui/intl`). The consumer percent mask `#,##0.00,'%'` therefore\r\n * exported 100 as \"0.10%\". Dropped here, per `;` section: every unquoted comma after the\r\n * section's decimal point, and a comma that follows a digit placeholder with no placeholder\r\n * after it before the section's decimal point or end (`#,##0,'%'`, `#,##0,.00`) — none of them\r\n * ever meant anything to dx. Grouping commas between integer placeholders stay, and\r\n * single-quoted literals become Excel's double-quoted ones.\r\n */\r\nexport function nxeExcelNumberMask(mask: string): string {\r\n const chars = Array.from(mask);\r\n // Whether each character is part of a single-quoted literal (its quotes included).\r\n const quoted: boolean[] = [];\r\n let inQuote = false;\r\n for (const ch of chars) {\r\n if (ch === \"'\") {\r\n inQuote = !inQuote;\r\n quoted.push(true);\r\n } else {\r\n quoted.push(inQuote);\r\n }\r\n }\r\n /** A digit placeholder follows the comma at `i` in its section's integer part: it groups. */\r\n const groups = (i: number): boolean => {\r\n for (let j = i + 1; j < chars.length; j++) {\r\n if (quoted[j]) {\r\n continue;\r\n }\r\n if (chars[j] === '.' || chars[j] === ';') {\r\n return false;\r\n }\r\n if (NXE_DIGIT_PLACEHOLDERS.has(chars[j])) {\r\n return true;\r\n }\r\n }\r\n return false;\r\n };\r\n\r\n let out = '';\r\n let afterPoint = false;\r\n // The last unquoted character that was not a comma, within the current section.\r\n let prev = '';\r\n for (let i = 0; i < chars.length; i++) {\r\n const ch = chars[i];\r\n if (ch === \"'\") {\r\n out += '\"';\r\n continue;\r\n }\r\n if (!quoted[i]) {\r\n if (ch === ';') {\r\n afterPoint = false;\r\n prev = '';\r\n out += ch;\r\n continue;\r\n }\r\n if (ch === '.') {\r\n afterPoint = true;\r\n }\r\n if (ch === ',') {\r\n if (afterPoint || (NXE_DIGIT_PLACEHOLDERS.has(prev) && !groups(i))) {\r\n continue;\r\n }\r\n } else {\r\n prev = ch;\r\n }\r\n }\r\n out += ch;\r\n }\r\n return out;\r\n}\r\n\r\n/**\r\n * dx `getValueDataType` (m_columns_controller_utils.js:230-236): the type a value contributes\r\n * to column type inference. `null`, arrays and functions contribute nothing.\r\n */\r\nexport function nxeValueDataType(v: unknown): NxeColumnDataType | 'object' | undefined {\r\n if (v == null || Array.isArray(v)) {\r\n return undefined;\r\n }\r\n if (v instanceof Date) {\r\n return 'date';\r\n }\r\n const t = typeof v;\r\n return t === 'string' || t === 'number' || t === 'boolean' || t === 'object' ? t : undefined;\r\n}\r\n\r\n/**\r\n * dx's number-column deserializer (m_columns_controller_utils.js:263 `updateSerializers`):\r\n * `parseFloat`, so \"20.5\" is 20.5 and \"1,234\" is 1 exactly as dx shows it. `NaN` when the\r\n * value is not numeric at all, which callers render raw.\r\n */\r\nexport function nxeNumberValue(raw: unknown): number {\r\n return typeof raw === 'number' ? raw : parseFloat(String(raw));\r\n}\r\n\r\n/**\r\n * The data grid's default cell rendering (pure extraction of nxe-data-grid's `defaultFormat`):\r\n * `dataType`/`format` → display text.\r\n *\r\n * dx's format_helper (format_helper.js:23-43) formats by the VALUE, not by the column type: any\r\n * JS number meets any valid `format`, whatever the column declared. So a number in an untyped\r\n * or string column still takes its mask, and a number column honours object formats as well.\r\n */\r\nexport function nxeDefaultFormat(\r\n dataType: NxeColumnDataType | 'object' | undefined,\r\n format: NxeColumnFormat | undefined,\r\n raw: any,\r\n separators: NxeNumberSeparators = NXE_EN_US_SEPARATORS,\r\n locale?: string,\r\n): string {\r\n if (raw == null || raw === '') {\r\n return '';\r\n }\r\n switch (dataType) {\r\n case 'number': {\r\n const num = nxeNumberValue(raw);\r\n return isNaN(num) ? String(raw) : nxeFormatNumberValue(num, format, separators);\r\n }\r\n case 'date': {\r\n const dt = parseDateValue(raw);\r\n return dt ? formatDisplay(dt, nxeDatePattern(format), locale) : String(raw);\r\n }\r\n case 'boolean':\r\n return raw ? '✓' : '';\r\n default:\r\n // No format (or an unresolvable one) leaves the number as String(value), as dx does.\r\n return typeof raw === 'number' ? nxeFormatNumberValue(raw, format, separators) : String(raw);\r\n }\r\n}\r\n","/**\r\n * DOM lookups shared by the grid component and its drag/resize controllers.\r\n *\r\n * Both questions here used to be answered with `querySelector('.nxe-header-row')`, which stopped\r\n * being right once bands could add header rows above the leaves.\r\n */\r\n\r\n/**\r\n * The bottom `.nxe-header-row` of THIS grid.\r\n *\r\n * Used for header-strip geometry — the drop highlight and the drag indicator's vertical extent.\r\n * It must belong to this grid rather than a nested master-detail grid; those live in the tbody,\r\n * so the first `thead` in document order is always the outer grid's own.\r\n *\r\n * It is NOT one cell per column — see {@link nxeHeaderLeafCells}.\r\n */\r\nexport function nxeLeafHeaderRow(host: HTMLElement): HTMLTableRowElement | null {\r\n const thead = host.querySelector<HTMLElement>(\r\n '.nxe-datagrid-content > .nxe-datagrid-table > thead',\r\n );\r\n const rows = thead?.querySelectorAll<HTMLTableRowElement>('.nxe-header-row');\r\n return rows && rows.length ? rows[rows.length - 1] : null;\r\n}\r\n\r\n/**\r\n * The header cell of each visible data column, in visible-column order.\r\n *\r\n * Deliberately not \"the cells of the bottom header row\". A top-level column in a banded grid is\r\n * emitted in the FIRST header row with a rowspan reaching the bottom, so the bottom row holds\r\n * only the leaves that sit under a band: `Name | Shared(Gross, Comm) | Total` puts Name and Total\r\n * in row 0 and just Gross and Comm in row 1. Reading the bottom row loses half the columns, and\r\n * everything that indexes these by visible position — auto-width, resize, reorder, keyboard\r\n * focus — then addresses the wrong column.\r\n *\r\n * `role=\"columnheader\"` plus `aria-colindex` is the discriminator: every leaf header cell carries\r\n * both, a band is a column header without a number, and a command cell (group indent, detail\r\n * expander, select-all, edit) is numbered, as dx numbers it, but is no column header\r\n * (m_column_headers.js:193). The number already accounts for the lead command columns, so sorting\r\n * on it recovers visible order across however many rows the header happens to have.\r\n */\r\nexport function nxeHeaderLeafCells(host: HTMLElement): HTMLTableCellElement[] {\r\n const thead = host.querySelector<HTMLElement>(\r\n '.nxe-datagrid-content > .nxe-datagrid-table > thead',\r\n );\r\n if (!thead) {\r\n return [];\r\n }\r\n return Array.from(\r\n thead.querySelectorAll<HTMLTableCellElement>('.nxe-header-row > [role=\"columnheader\"][aria-colindex]'),\r\n ).sort(\r\n (a, b) => Number(a.getAttribute('aria-colindex')) - Number(b.getAttribute('aria-colindex')),\r\n );\r\n}\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\nimport { NgZone } from '@angular/core';\r\nimport { NxeColumnComponent } from './nxe-column.component';\r\nimport { nxeLeafHeaderRow } from './nxe-grid-dom';\r\n\r\n/**\r\n * Pointer-based drag engines (drag-to-group parity with DevExtreme, baselined against the\r\n * bright deployment 2026-07-27; gesture core shared with the pivot field panel since P3-C2).\r\n *\r\n * Deliberately NOT CDK DragDrop: the drop topologies are \"header → group panel\", \"chip →\r\n * anywhere outside = ungroup/remove\", \"chip ↔ chip = reorder\" — not list-to-list — and the\r\n * ghosts must be dx's exact clones (`.nxe-datagrid-drag-header` for the grid,\r\n * `.nxe-pivotgrid-fields-container.nxe-drag` for the pivot panel). Document-level listeners run\r\n * outside the zone; Angular re-enters only on drop. No `setPointerCapture` (throws for\r\n * synthetic pointerIds under Karma).\r\n *\r\n * dx baseline facts encoded here:\r\n * - grid ghost: `div.nxe-datagrid-drag-header.nxe-datagrid-text-content.nxe-widget.nxe-datagrid-drag-action`\r\n * appended to <body>, caption text only, positioned near the cursor;\r\n * - insertion indicator: `div.nxe-block-separator` placed between panel chips;\r\n * - chip drag highlights the header row with `nxe-datagrid-drop-highlight`;\r\n * - the source cell/chip stays in place, dimmed;\r\n * - header→panel drop APPENDS as the last group level (indicator after the last chip).\r\n */\r\n\r\n/** Movement (px) before a press becomes a drag — below this a release is a normal click. */\r\nconst DRAG_START_DELTA = 5;\r\n/** Ghost offset from the pointer (px), tuned against the bright screenshots. */\r\nconst GHOST_OFFSET = 8;\r\n\r\n/**\r\n * One-shot suppression of the click a completed gesture is about to fire, shared by the drag and\r\n * resize engines. Strictly gesture-scoped: clears once that trailing click has passed (even when\r\n * it lands on an element without a consuming handler) and expires after 500ms, so a later genuine\r\n * click is never eaten.\r\n */\r\nexport class NxeGestureClickSuppression {\r\n private pending = false;\r\n private until = 0;\r\n\r\n arm(): void {\r\n this.pending = true;\r\n this.until = performance.now() + 500;\r\n // Capture runs before the bubble-phase consumers; the macrotask runs after dispatch.\r\n document.addEventListener(\r\n 'click',\r\n () => setTimeout(() => (this.pending = false)),\r\n { capture: true, once: true },\r\n );\r\n }\r\n\r\n consume(): boolean {\r\n const suppress = this.pending && performance.now() < this.until;\r\n this.pending = false;\r\n return suppress;\r\n }\r\n}\r\n\r\n/**\r\n * Owner-side contract of {@link NxeDragGesture}. The gesture core owns the press → threshold →\r\n * drag lifecycle (document listeners outside the zone, ghost mounting/positioning, Escape /\r\n * pointercancel semantics, click suppression, ghost/source/body teardown); the delegate owns the\r\n * payload, the drop-target hit-testing, and any indicators/highlights beyond the ghost itself.\r\n */\r\nexport interface NxeDragGestureDelegate {\r\n /** Build the ghost's element (classes + content). The gesture appends it to <body> and\r\n * keeps it `position: fixed` at pointer + offset. Called once, when the threshold passes. */\r\n createGhost(): HTMLElement;\r\n /** Class(es) that dim the pressed source element for the duration of the drag. */\r\n sourceDragClasses: readonly string[];\r\n /** The 5px threshold just passed — add initial highlights (e.g. the grid's header-row\r\n * drop highlight for chip drags). */\r\n dragStarted?(): void;\r\n /** Pointer tracking while a drag is active — update drop targets / indicators. */\r\n dragMove(x: number, y: number): void;\r\n /** Pointer released after a REAL drag. Runs inside the Angular zone; the ghost, source dim,\r\n * and `clearDropVisuals` teardown have already happened (imperative DOM must be gone\r\n * before any signal write re-runs an @for over the drop zone). */\r\n drop(): void;\r\n /** Remove indicators/highlights the delegate created. Must be idempotent — also runs on\r\n * cancel and destroy. */\r\n clearDropVisuals(): void;\r\n /** Gesture over (drop dispatched, sub-threshold release, cancel, destroy) — drop payload. */\r\n reset?(): void;\r\n}\r\n\r\n/**\r\n * The shared pointer-gesture core (extracted from the grid controller in P3-C2 so the pivot\r\n * field panel reuses it rather than copy-pasting). Behavior is the audited 2026-07-27 gesture:\r\n * press arms, 5px starts, Escape cancels (suppressing the held pointer's release click),\r\n * pointercancel cancels silently, drop arms one-shot click suppression.\r\n */\r\nexport class NxeDragGesture {\r\n private active: {\r\n /** The pointer that started the gesture — other pointers (second touch) are ignored. */\r\n pointerId: number;\r\n startX: number;\r\n startY: number;\r\n source: HTMLElement;\r\n started: boolean;\r\n ghost: HTMLElement | null;\r\n } | null = null;\r\n private readonly suppression = new NxeGestureClickSuppression();\r\n\r\n private readonly onMove = (e: PointerEvent): void => this.pointerMove(e);\r\n private readonly onUp = (e: PointerEvent): void => {\r\n if (this.active && e.pointerId !== this.active.pointerId) {\r\n return;\r\n }\r\n this.pointerUp();\r\n };\r\n private readonly onCancel = (e: PointerEvent): void => {\r\n if (this.active && e.pointerId !== this.active.pointerId) {\r\n return;\r\n }\r\n // pointercancel fires no trailing click — cancel WITHOUT arming click suppression.\r\n this.cancel(false);\r\n };\r\n private readonly onKey = (e: KeyboardEvent): void => {\r\n if (e.key === 'Escape') {\r\n this.cancel(true); // the still-held pointer's release click will follow\r\n }\r\n };\r\n\r\n constructor(\r\n private readonly zone: NgZone,\r\n private readonly delegate: NxeDragGestureDelegate,\r\n ) {}\r\n\r\n /** Arm a gesture on pointerdown. Returns false (payload must NOT be set) when refused. */\r\n begin(event: PointerEvent): boolean {\r\n if (event.button !== 0 || this.active) {\r\n return false;\r\n }\r\n this.active = {\r\n pointerId: event.pointerId,\r\n startX: event.clientX,\r\n startY: event.clientY,\r\n source: event.currentTarget as HTMLElement,\r\n started: false,\r\n ghost: null,\r\n };\r\n this.zone.runOutsideAngular(() => {\r\n document.addEventListener('pointermove', this.onMove);\r\n document.addEventListener('pointerup', this.onUp);\r\n document.addEventListener('pointercancel', this.onCancel);\r\n document.addEventListener('keydown', this.onKey);\r\n });\r\n return true;\r\n }\r\n\r\n /**\r\n * One-shot suppression of the click browsers fire right after a drag's pointerup — call at\r\n * the top of header/chip/funnel click handlers so a drop never doubles as a click action.\r\n */\r\n consumeClick(): boolean {\r\n return this.suppression.consume();\r\n }\r\n\r\n destroy(): void {\r\n if (this.active) {\r\n this.cancel(false);\r\n }\r\n }\r\n\r\n private pointerMove(e: PointerEvent): void {\r\n const a = this.active;\r\n if (!a || e.pointerId !== a.pointerId) {\r\n return;\r\n }\r\n if (!a.started) {\r\n if (Math.hypot(e.clientX - a.startX, e.clientY - a.startY) < DRAG_START_DELTA) {\r\n return;\r\n }\r\n a.started = true;\r\n a.ghost = this.mountGhost(a);\r\n for (const cls of this.delegate.sourceDragClasses) {\r\n a.source.classList.add(cls);\r\n }\r\n document.body.classList.add('nxe-grid-dragging');\r\n this.delegate.dragStarted?.();\r\n }\r\n if (e.cancelable) {\r\n e.preventDefault(); // no text selection / touch scroll mid-drag\r\n }\r\n if (a.ghost) {\r\n a.ghost.style.left = `${e.clientX + GHOST_OFFSET}px`;\r\n a.ghost.style.top = `${e.clientY + GHOST_OFFSET}px`;\r\n }\r\n this.delegate.dragMove(e.clientX, e.clientY);\r\n }\r\n\r\n private mountGhost(a: { startX: number; startY: number }): HTMLElement {\r\n const ghost = this.delegate.createGhost();\r\n ghost.style.position = 'fixed';\r\n ghost.style.left = `${a.startX + GHOST_OFFSET}px`;\r\n ghost.style.top = `${a.startY + GHOST_OFFSET}px`;\r\n ghost.style.pointerEvents = 'none';\r\n ghost.style.zIndex = '10000';\r\n document.body.appendChild(ghost);\r\n return ghost;\r\n }\r\n\r\n private pointerUp(): void {\r\n const a = this.active;\r\n this.detachListeners();\r\n this.active = null;\r\n if (!a) {\r\n return;\r\n }\r\n if (!a.started) {\r\n this.delegate.reset?.();\r\n return; // plain click — let the click event do its job\r\n }\r\n this.suppression.arm();\r\n // Imperative DOM must be gone BEFORE any signal write re-runs a drop zone's @for.\r\n this.teardownVisuals(a);\r\n this.zone.run(() => this.delegate.drop());\r\n this.delegate.reset?.();\r\n }\r\n\r\n private cancel(willClickFollow: boolean): void {\r\n const a = this.active;\r\n this.detachListeners();\r\n this.active = null;\r\n if (!a) {\r\n return;\r\n }\r\n if (a.started) {\r\n if (willClickFollow) {\r\n this.suppression.arm(); // Escape: the held pointer's release click still fires\r\n }\r\n this.teardownVisuals(a);\r\n }\r\n this.delegate.reset?.();\r\n }\r\n\r\n private teardownVisuals(a: { source: HTMLElement; ghost: HTMLElement | null }): void {\r\n a.ghost?.remove();\r\n a.ghost = null;\r\n for (const cls of this.delegate.sourceDragClasses) {\r\n a.source.classList.remove(cls);\r\n }\r\n document.body.classList.remove('nxe-grid-dragging');\r\n this.delegate.clearDropVisuals();\r\n }\r\n\r\n private detachListeners(): void {\r\n document.removeEventListener('pointermove', this.onMove);\r\n document.removeEventListener('pointerup', this.onUp);\r\n document.removeEventListener('pointercancel', this.onCancel);\r\n document.removeEventListener('keydown', this.onKey);\r\n }\r\n}\r\n\r\nexport interface NxeGridDragHooks {\r\n zone: NgZone;\r\n host: () => HTMLElement;\r\n /** Header dropped on the group panel. */\r\n onGroupDrop: (col: NxeColumnComponent) => void;\r\n /** Chip dropped outside the panel. */\r\n onChipRemove: (col: NxeColumnComponent) => void;\r\n /** Chip dropped at another panel position. */\r\n onChipMove: (fromLevel: number, toLevel: number) => void;\r\n /** dx `allowColumnReordering` (default false) — enables the header-row drop zone. */\r\n reorderEnabled: () => boolean;\r\n /** Header dropped between two headers: move visible column `from` to insertion `slot`. */\r\n onColumnMove: (fromVisibleIndex: number, insertionSlot: number) => void;\r\n /** Data-column header cells (command cells excluded), for reorder hit-testing. */\r\n headerDataCells: () => HTMLElement[];\r\n}\r\n\r\ninterface GridDragState {\r\n kind: 'header' | 'chip';\r\n col: NxeColumnComponent;\r\n /** Chip drags: the group level being dragged. Header drags: the visible column index. */\r\n level: number;\r\n separator: HTMLElement | null;\r\n /** Reorder drop indicator (vertical bar between headers). */\r\n colIndicator: HTMLElement | null;\r\n overPanel: boolean;\r\n /** Chip drags: insertion slot among the panel chips while hovering the panel. */\r\n dropIndex: number | null;\r\n /** Header drags with reordering on: insertion slot among the data headers. */\r\n headerSlot: number | null;\r\n}\r\n\r\n/** The data grid's drag controller — payload + drop topology over the shared gesture core. */\r\nexport class NxeGridDragController {\r\n private drag: GridDragState | null = null;\r\n private readonly gesture: NxeDragGesture;\r\n\r\n constructor(private readonly hooks: NxeGridDragHooks) {\r\n this.gesture = new NxeDragGesture(hooks.zone, {\r\n // Exact class list observed on bright's dx ghost + an nxe hook for fallback styling.\r\n createGhost: () => {\r\n const ghost = document.createElement('div');\r\n ghost.className =\r\n 'nxe-datagrid-drag-header nxe-datagrid-text-content nxe-widget nxe-datagrid-drag-action nxe-grid-drag-ghost';\r\n const col = this.drag?.col;\r\n ghost.textContent = col ? col.caption() || col.dataField() : '';\r\n ghost.style.whiteSpace = 'nowrap';\r\n return ghost;\r\n },\r\n sourceDragClasses: ['nxe-drag-source'],\r\n dragStarted: () => {\r\n if (this.drag?.kind === 'chip') {\r\n // dx: while a chip is dragged, the header row is the highlighted return target.\r\n this.headerRow()?.classList.add('nxe-datagrid-drop-highlight');\r\n }\r\n },\r\n dragMove: (x, y) => {\r\n if (this.drag) {\r\n this.updateDropTarget(this.drag, x, y);\r\n }\r\n },\r\n drop: () => this.completeDrop(),\r\n clearDropVisuals: () => {\r\n if (this.drag) {\r\n this.removeSeparator(this.drag);\r\n this.removeColIndicator(this.drag);\r\n }\r\n this.headerRow()?.classList.remove('nxe-datagrid-drop-highlight');\r\n },\r\n reset: () => {\r\n this.drag = null;\r\n },\r\n });\r\n }\r\n\r\n startHeaderDrag(col: NxeColumnComponent, visibleIndex: number, event: PointerEvent): void {\r\n this.begin('header', col, visibleIndex, event);\r\n }\r\n\r\n startChipDrag(col: NxeColumnComponent, level: number, event: PointerEvent): void {\r\n this.begin('chip', col, level, event);\r\n }\r\n\r\n /** See {@link NxeDragGesture.consumeClick}. */\r\n consumeClick(): boolean {\r\n return this.gesture.consumeClick();\r\n }\r\n\r\n destroy(): void {\r\n this.gesture.destroy();\r\n }\r\n\r\n private begin(kind: 'header' | 'chip', col: NxeColumnComponent, level: number, event: PointerEvent): void {\r\n if (!this.gesture.begin(event)) {\r\n return;\r\n }\r\n this.drag = {\r\n kind,\r\n col,\r\n level,\r\n separator: null,\r\n colIndicator: null,\r\n overPanel: false,\r\n dropIndex: null,\r\n headerSlot: null,\r\n };\r\n }\r\n\r\n private updateDropTarget(a: GridDragState, x: number, y: number): void {\r\n const panel = this.panel();\r\n const rect = panel?.getBoundingClientRect();\r\n a.overPanel = !!rect && x >= rect.left && x <= rect.right && y >= rect.top && y <= rect.bottom;\r\n if (!panel || !a.overPanel) {\r\n a.dropIndex = null;\r\n this.removeSeparator(a);\r\n if (a.kind === 'header') {\r\n this.updateHeaderReorderTarget(a, x, y);\r\n }\r\n return;\r\n }\r\n this.removeColIndicator(a);\r\n a.headerSlot = null;\r\n const chips = Array.from(panel.querySelectorAll<HTMLElement>('.nxe-group-panel-item'));\r\n if (a.kind === 'header') {\r\n // dx appends on header→panel drop; the indicator sits after the last chip.\r\n a.dropIndex = chips.length;\r\n this.placeSeparator(a, panel, chips, chips.length);\r\n return;\r\n }\r\n let index = chips.length;\r\n for (let i = 0; i < chips.length; i++) {\r\n const r = chips[i].getBoundingClientRect();\r\n if (x < r.left + r.width / 2) {\r\n index = i;\r\n break;\r\n }\r\n }\r\n a.dropIndex = index;\r\n this.placeSeparator(a, panel, chips, index);\r\n }\r\n\r\n /** Header-row drop zone (only with `allowColumnReordering`): slot between data headers. */\r\n private updateHeaderReorderTarget(a: GridDragState, x: number, y: number): void {\r\n if (!this.hooks.reorderEnabled()) {\r\n a.headerSlot = null;\r\n this.removeColIndicator(a);\r\n return;\r\n }\r\n const rowRect = this.headerRow()?.getBoundingClientRect();\r\n if (!rowRect || x < rowRect.left || x > rowRect.right || y < rowRect.top || y > rowRect.bottom) {\r\n a.headerSlot = null;\r\n this.removeColIndicator(a);\r\n return;\r\n }\r\n const cells = this.hooks.headerDataCells();\r\n if (!cells.length) {\r\n return;\r\n }\r\n let slot = cells.length;\r\n for (let i = 0; i < cells.length; i++) {\r\n const r = cells[i].getBoundingClientRect();\r\n if (x < r.left + r.width / 2) {\r\n slot = i;\r\n break;\r\n }\r\n }\r\n a.headerSlot = slot;\r\n if (!a.colIndicator) {\r\n a.colIndicator = document.createElement('div');\r\n a.colIndicator.className = 'nxe-col-drop-indicator';\r\n document.body.appendChild(a.colIndicator);\r\n }\r\n const edge =\r\n slot < cells.length\r\n ? cells[slot].getBoundingClientRect().left\r\n : cells[cells.length - 1].getBoundingClientRect().right;\r\n a.colIndicator.style.left = `${edge - 1}px`;\r\n a.colIndicator.style.top = `${rowRect.top}px`;\r\n a.colIndicator.style.height = `${rowRect.height}px`;\r\n }\r\n\r\n private removeColIndicator(a: GridDragState): void {\r\n a.colIndicator?.remove();\r\n a.colIndicator = null;\r\n }\r\n\r\n private completeDrop(): void {\r\n const a = this.drag;\r\n if (!a) {\r\n return;\r\n }\r\n if (a.kind === 'header') {\r\n if (a.overPanel) {\r\n this.hooks.onGroupDrop(a.col);\r\n } else if (a.headerSlot != null) {\r\n this.hooks.onColumnMove(a.level, a.headerSlot);\r\n }\r\n return;\r\n }\r\n if (!a.overPanel) {\r\n this.hooks.onChipRemove(a.col);\r\n return;\r\n }\r\n if (a.dropIndex != null) {\r\n const target = a.dropIndex > a.level ? a.dropIndex - 1 : a.dropIndex;\r\n if (target !== a.level) {\r\n this.hooks.onChipMove(a.level, target);\r\n }\r\n }\r\n }\r\n\r\n private placeSeparator(a: GridDragState, panel: HTMLElement, chips: HTMLElement[], index: number): void {\r\n if (!a.separator) {\r\n a.separator = document.createElement('div');\r\n a.separator.className = 'nxe-block-separator';\r\n a.separator.textContent = ' '; // dx renders the separator as an block\r\n }\r\n const reference = chips[index] ?? null;\r\n if (a.separator.parentElement !== panel || a.separator.nextElementSibling !== reference) {\r\n panel.insertBefore(a.separator, reference);\r\n }\r\n }\r\n\r\n private removeSeparator(a: GridDragState): void {\r\n a.separator?.remove();\r\n a.separator = null;\r\n }\r\n\r\n private panel(): HTMLElement | null {\r\n return this.hooks.host().querySelector('.nxe-datagrid-group-panel');\r\n }\r\n\r\n private headerRow(): HTMLElement | null {\r\n return nxeLeafHeaderRow(this.hooks.host());\r\n }\r\n}\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\n// Shared types for the nxe-data-grid family. Row data is `any` to mirror DevExtreme's untyped\r\n// grid (the app stores plain JS records and reads arbitrary fields off `key.data`).\r\n\r\n/** A DevExtreme-style column `format`: a number-mask string, a date format string, or `{ type }`. */\r\nexport interface NxeColumnFormatObject {\r\n type?: string;\r\n precision?: number;\r\n /** dx parity: a custom `formatter` wins over `type` (resolved in nxe-format.util). */\r\n formatter?: (value: any) => string;\r\n}\r\nexport type NxeColumnFormat = string | NxeColumnFormatObject;\r\n\r\n/**\r\n * A column's declared `dataType`. Leaving it unset is not the same as `'string'`: as in dx\r\n * (m_columns_controller.js `updateColumnDataTypes`), an unset type is inferred from the loaded\r\n * values, which is what right-aligns and formats a numeric column nobody typed.\r\n */\r\nexport type NxeColumnDataType = 'string' | 'number' | 'date' | 'boolean';\r\n\r\n/** Column `customizeText` callback — `(info) => string` (used by `formatAccounting`). */\r\nexport type NxeCustomizeText = (info: { value: any; valueText: string }) => string;\r\n\r\n/**\r\n * The `$implicit` context object handed to a cell template, mirroring DevExtreme's cell info.\r\n * Templates read `cell.data.<field>` (live row object), `cell.rowIndex`, and `cell.columnIndex`.\r\n * `value`/`displayValue`/`text`/`key`/`column` are provided for parity (presently unread in cells).\r\n */\r\nexport interface NxeCellInfo<T = any> {\r\n data: T;\r\n rowIndex: number;\r\n columnIndex: number;\r\n value: any;\r\n displayValue: any;\r\n text: string;\r\n key: T;\r\n column: { dataField?: string; caption?: string } | null;\r\n}\r\n\r\n/**\r\n * The `$implicit` context of an `editCellTemplate`, mirroring DevExtreme's edit-cell info.\r\n *\r\n * `data` is the LIVE row object. That is the load-bearing part: the dominant template shape\r\n * assigns straight to it (`ctx.data.amount = $event`) rather than calling `setValue`, exactly as\r\n * it did under dx, and the grid reads display text back off the same object.\r\n *\r\n * `setValue` is provided for dx parity and routes through the grid's own write path — committing\r\n * in `cell` mode, buffering in `row` mode — so a template that uses it participates in Save and\r\n * Cancel. A template that writes `data` directly bypasses the buffer, and therefore Cancel; dx\r\n * behaves the same way, because it hands out the raw row and does not police it.\r\n */\r\nexport interface NxeEditCellInfo<T = any> {\r\n data: T;\r\n key: any;\r\n value: any;\r\n displayValue: any;\r\n text: string;\r\n rowIndex: number;\r\n columnIndex: number;\r\n column: {\r\n dataField?: string;\r\n caption?: string;\r\n dataType?: string;\r\n format?: NxeColumnFormat;\r\n } | null;\r\n /** dx parity: commits in `cell` mode, buffers in `row` mode. */\r\n setValue: (newValue: any) => void;\r\n component: NxeGridInstance<T>;\r\n}\r\n\r\n/** dx `rowType` — which kind of row a prepared cell belongs to. */\r\nexport type NxeRowType = 'header' | 'filter' | 'data' | 'group' | 'groupFooter' | 'totalFooter';\r\n\r\n/** The row half of a prepared event, shared by `onCellPrepared` and `onRowPrepared`. */\r\nexport interface NxeRowInfo<T = any> {\r\n rowType: NxeRowType;\r\n data: T | undefined;\r\n key: any;\r\n rowIndex: number;\r\n /** Group nesting level for a group or group-footer row; absent elsewhere. */\r\n groupIndex?: number;\r\n /** dx handlers written against older builds read this name instead. */\r\n groupLevel?: number;\r\n isExpanded?: boolean;\r\n isSelected?: boolean;\r\n}\r\n\r\n/**\r\n * DevExtreme-shaped `onCellPrepared` payload, emitted once per rendered cell after the DOM is\r\n * written — `cellElement` is the real `<td>`, and handlers are expected to mutate it.\r\n *\r\n * The declarative `mergeColumns` and `rowClass` inputs are the recommended way to do what most\r\n * handlers do. This exists because applications carry handlers that cannot be rewritten.\r\n */\r\nexport interface NxeCellPreparedEvent<T = any> {\r\n data: T | undefined;\r\n key: any;\r\n value: any;\r\n displayValue: any;\r\n text: string;\r\n /** Visible-column index, command columns excluded; -1 for a cell that spans columns. */\r\n columnIndex: number;\r\n /** 0-based data-row index; -1 for header, filter and total-footer rows. */\r\n rowIndex: number;\r\n column: { dataField?: string; caption?: string; dataType?: string; index: number } | null;\r\n row: NxeRowInfo<T> | null;\r\n rowType: NxeRowType;\r\n cellElement: HTMLTableCellElement;\r\n component: NxeGridInstance<T>;\r\n element: HTMLElement;\r\n}\r\n\r\n/** DevExtreme-shaped `onRowPrepared` payload. `rowClass` covers the common case declaratively. */\r\nexport interface NxeRowPreparedEvent<T = any> extends NxeRowInfo<T> {\r\n rowElement: HTMLTableRowElement;\r\n columnCount: number;\r\n component: NxeGridInstance<T>;\r\n element: HTMLElement;\r\n}\r\n\r\n/**\r\n * The `$implicit` context of a `groupCellTemplate`, replacing the `\"Caption: value\"` text in a\r\n * group row's caption cell. `value` is the raw group key; `text` is what the grid would have\r\n * rendered.\r\n */\r\nexport interface NxeGroupCellInfo<T = any> {\r\n data: T[];\r\n key: any;\r\n value: any;\r\n displayValue: any;\r\n text: string;\r\n groupIndex: number;\r\n columnIndex: number;\r\n column: { dataField?: string; caption?: string } | null;\r\n component: NxeGridInstance<T>;\r\n}\r\n\r\n/**\r\n * DevExtreme-shaped `onOptionChanged` payload. Emitted for internal paging\r\n * (`paging.pageIndex`) and for runtime grouping changes (`columns[<i>].groupIndex`, where `<i>`\r\n * is the column's content-children declaration index) — one event per user gesture, carrying\r\n * `previousValue`/`value` exactly as generic-list's persistence handler expects.\r\n */\r\nexport interface NxeGridOptionChangedEvent {\r\n name: string;\r\n fullName: string;\r\n value: any;\r\n previousValue?: any;\r\n}\r\n\r\n/** DevExtreme-shaped `onSelectionChanged` payload (handlers read `selectedRowsData[0]?.<field>`). */\r\nexport interface NxeGridSelectionChangedEvent<T = any> {\r\n selectedRowsData: T[];\r\n selectedRowKeys: T[];\r\n currentSelectedRowKeys: T[];\r\n currentDeselectedRowKeys: T[];\r\n component: NxeGridInstance<T>;\r\n element: HTMLElement | null;\r\n}\r\n\r\n/**\r\n * The `.instance` facade surface — only the methods the codebase actually calls\r\n * (`getSelectedRowsData` ×12 in templates, `refresh` ×13, `columnOption(field,'visible',bool)` ×3).\r\n */\r\nexport interface NxeExportColumn {\r\n caption: string;\r\n dataField: string;\r\n /** The declared type, else the inferred one; `undefined` while nothing could be inferred. */\r\n dataType: NxeColumnDataType | undefined;\r\n format: NxeColumnFormat | undefined;\r\n}\r\n\r\n/** dx TreeList node shape — the slice `exportTreeToExcel` walks (`data` + `children`). */\r\nexport interface NxeTreeListNode<T = any> {\r\n key?: any;\r\n data?: T;\r\n children: NxeTreeListNode<T>[];\r\n level?: number;\r\n hasChildren?: boolean;\r\n}\r\n\r\nexport interface NxeGridInstance<T = any> {\r\n getSelectedRowsData(): T[];\r\n getSelectedRowKeys(): T[];\r\n /** dx `clearSelection()`: deselects every row, including rows the current filter hides. */\r\n clearSelection(): void;\r\n /**\r\n * dx `deselectAll()`: deselects the rows the current filter shows (the current page of a\r\n * server-side grid). A tree list deselects every node.\r\n */\r\n deselectAll(): void;\r\n refresh(): void;\r\n /**\r\n * dx `clearFilter()`: no argument clears the filter row AND header filters (including\r\n * declarative `filterValues` seeds); `'row'`/`'header'` clear one kind. `'search'`,\r\n * `'filterValue'`, `'dataSource'` are accepted no-ops (those filters don't exist here).\r\n */\r\n clearFilter(filterName?: 'row' | 'header' | 'search' | 'filterValue' | 'dataSource'): void;\r\n /** Only the `(field, 'visible', boolean)` setter form is used (export show/hide toggle). */\r\n columnOption(dataField: string, optionName: 'visible', value: boolean): void;\r\n /** Export model: currently-visible columns (honours columnOption visibility toggles). */\r\n getVisibleColumns(): NxeExportColumn[];\r\n /** Export model: the filtered+sorted data rows (all pages). */\r\n getVisibleRows(): T[];\r\n /**\r\n * dx `totalCount()`: data rows after filtering, across all pages. Read as\r\n * `e.component.totalCount()` from a cell-prepared handler to size a merge run.\r\n */\r\n totalCount(): number;\r\n /** dx TreeList parity: virtual root whose `children` are the top-level nodes (empty for flat grids). */\r\n getRootNode(): NxeTreeListNode<T>;\r\n /** DevExtreme parity no-op (layout is CSS-driven); triggers a refresh tick. */\r\n updateDimensions(): void;\r\n /** Collapses a master-detail row / tree-list node by key (orbit addition). */\r\n collapseRow(key: any): void;\r\n /** Expands a tree-list node by key, overriding a manual collapse (orbit addition). */\r\n expandRow(key: any): void;\r\n /**\r\n * Ungroups every grouped column (real dx semantics), emitting one `columns[i].groupIndex`\r\n * removal per level in descending order so generic-list's persistence replay converges.\r\n */\r\n clearGrouping(): void;\r\n /** Expands all groups / tree nodes (orbit addition). */\r\n expandAll(): void;\r\n /** Commits the pending row edit, if any (dx parity; cell edits commit on blur). */\r\n saveEditData(): void;\r\n /** The grid's host element (dx parity: `e.component.element()`). */\r\n element(): HTMLElement;\r\n}\r\n","import { ChangeDetectionStrategy, Component, input, ViewEncapsulation } from '@angular/core';\r\n\r\n/**\r\n * `nxe-header-filter` — drop-in replacement for DevExtreme `dxo-header-filter` (grid child option).\r\n *\r\n * Adds a funnel icon to each filterable column header; clicking it opens a popup of the column's\r\n * distinct values (checkbox list + optional search) to filter the grid. The app uses essentially\r\n * one shape: `[search]=\"{ enabled: true }\" [visible]=\"true\"` (60 files). Legacy `[allowSearch]`\r\n * (1×) folds into `search.enabled`.\r\n */\r\n@Component({\r\n selector: 'nxe-header-filter',\r\n standalone: true,\r\n template: '',\r\n host: { style: 'display: none' },\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class NxeHeaderFilterComponent {\r\n readonly visible = input(true);\r\n readonly search = input<{ enabled?: boolean } | undefined>(undefined);\r\n /** Legacy alias for `search.enabled` (one holdout). */\r\n readonly allowSearch = input<boolean | undefined>(undefined);\r\n /**\r\n * dx `headerFilter.dataSource` — a fixed `{ text, value }` list shown instead of the values\r\n * derived from the rows.\r\n */\r\n readonly dataSource = input<readonly { text?: string; value?: any }[] | undefined>(undefined);\r\n\r\n /** Whether the in-popup search box shows.\r\n *\r\n * Defaults to **true**, matching the legacy DevExtreme deployment: a popup listing every\r\n * distinct value in a column is close to unusable without one. 60 of the app's templates\r\n * already opt in explicitly, so this only changes the handful that never said either way —\r\n * and an explicit `[search]=\"{ enabled: false }\"` still turns it off. */\r\n searchEnabled(): boolean {\r\n return this.search()?.enabled ?? this.allowSearch() ?? true;\r\n }\r\n}\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n contentChild,\r\n contentChildren,\r\n input,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { NxeExpr } from '@nexterajs/ui/core';\r\nimport { NxeHeaderFilterComponent } from './nxe-header-filter.component';\r\nimport { NxeColumnDataType, NxeColumnFormat, NxeCustomizeText } from './nxe-grid.types';\r\n\r\n/**\r\n * `nxe-column` — drop-in replacement for DevExtreme `dxi-column`.\r\n *\r\n * A no-render config element collected by the parent `nxe-data-grid` via `contentChildren`.\r\n * Carries the column's display/format/behaviour config as signals. Works inside `@for`/`@if`\r\n * with full property binding (column sets are computed at render time; `dataField`/`caption`\r\n * are sometimes expressions). There are no command-button columns or `calculate*` options here.\r\n */\r\n@Component({\r\n selector: 'nxe-column',\r\n standalone: true,\r\n template: '',\r\n host: { style: 'display: none' },\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class NxeColumnComponent {\r\n readonly caption = input<string>('');\r\n /** Bound row field (supports dotted paths and bound/ternary expressions). */\r\n readonly dataField = input<string>('');\r\n /**\r\n * Unset = dx: inferred from the loaded data (m_columns_controller.js:914-975), so a numeric\r\n * column nobody typed still right-aligns and honours its `format`. Declaring it wins.\r\n */\r\n readonly dataType = input<NxeColumnDataType | undefined>(undefined);\r\n /** px width — number (`[width]=\"150\"`) or numeric string (`width=\"200\"`). */\r\n readonly width = input<number | string | undefined>(undefined);\r\n readonly minWidth = input<number | string | undefined>(undefined);\r\n readonly alignment = input<'left' | 'center' | 'right' | undefined>(undefined);\r\n /** Number-mask string (`#,##0.00`), date format string, or `{ type: 'dd MMM yyyy' }`. */\r\n readonly format = input<NxeColumnFormat | undefined>(undefined);\r\n /** `(info:{value}) => string` (e.g. `formatAccounting` for parenthesized negatives). */\r\n readonly customizeText = input<NxeCustomizeText | undefined>(undefined);\r\n /** Name of a sibling `<ng-template nxeTemplate=\"...\">` to render the cell. */\r\n readonly cellTemplate = input<string | undefined>(undefined);\r\n /**\r\n * DevExtreme column `lookup` (orbit addition): raw values resolve to display text through\r\n * `dataSource` (`{ lookup: { dataSource, valueExpr: 'lovCode', displayExpr: 'lovName' } }`).\r\n * Inline cell editing renders a `<select>` over the same list.\r\n */\r\n readonly lookup = input<\r\n { dataSource: readonly any[]; valueExpr?: NxeExpr; displayExpr?: NxeExpr } | undefined\r\n >(undefined);\r\n\r\n readonly allowSorting = input(true);\r\n /** dx parity: whether the header can be dragged into the group panel (default true). */\r\n readonly allowGrouping = input(true);\r\n /** dx parity: whether this column shows a resize handle when the grid allows resizing. */\r\n readonly allowResizing = input(true);\r\n readonly allowFiltering = input(true);\r\n readonly allowEditing = input(true);\r\n readonly allowExporting = input(true);\r\n readonly allowSearch = input(true);\r\n readonly allowHeaderFiltering = input(true);\r\n readonly visible = input(true);\r\n\r\n readonly sortOrder = input<'asc' | 'desc' | undefined>(undefined);\r\n readonly sortIndex = input<number | undefined>(undefined);\r\n readonly groupIndex = input<number | undefined>(undefined);\r\n readonly fixed = input(false);\r\n readonly filterValues = input<any[] | undefined>(undefined);\r\n /** Column `type` (only `type=\"date\"` seen — a display hint, NOT a command column). */\r\n readonly type = input<string | undefined>(undefined);\r\n /**\r\n * dx `cssClass` — extra classes on this column's header, filter and data cells. The escape\r\n * hatch for one-off cell styling that does not warrant a `cellTemplate`.\r\n */\r\n readonly cssClass = input<string | undefined>(undefined);\r\n /**\r\n * dx `editCellTemplate` — the sibling `<ng-template nxeTemplate=\"NAME\">` rendered while this\r\n * cell is being edited, in place of the built-in editor. Its context is a\r\n * {@link NxeEditCellInfo}, whose `data` is the live row: a template that assigns\r\n * `ctx.data.field = $event` writes straight through, which is how dx's own edit templates\r\n * were used.\r\n */\r\n readonly editCellTemplate = input<string | undefined>(undefined);\r\n /**\r\n * dx `groupCellTemplate` — replaces the `\"Caption: value\"` text in a group row's caption\r\n * cell when this column is the one grouped by.\r\n */\r\n readonly groupCellTemplate = input<string | undefined>(undefined);\r\n\r\n /**\r\n * Child columns declared inside this one — dx's banded header. Empty for an ordinary column.\r\n *\r\n * `descendants: false` is explicit rather than relied upon: a band's grandchildren belong to\r\n * its children, and flattening them here would collapse the very nesting the band expresses.\r\n */\r\n readonly childColumns = contentChildren(NxeColumnComponent, { descendants: false });\r\n\r\n /**\r\n * A `<nxe-header-filter>` declared inside this column, dx's per-column `headerFilter`\r\n * config. Only its `dataSource` is read here; visibility and search stay grid-level.\r\n */\r\n readonly headerFilterConfig = contentChild(NxeHeaderFilterComponent);\r\n\r\n /** dx `isBand`: a column that groups other columns under a shared header instead of a field. */\r\n readonly isBand = computed(() => this.childColumns().length > 0);\r\n}\r\n","import { ChangeDetectionStrategy, Component, input, ViewEncapsulation } from '@angular/core';\r\n\r\n/**\r\n * `nxe-selection` — drop-in replacement for DevExtreme `dxo-selection` (grid child option).\r\n *\r\n * A no-render config element collected by `nxe-data-grid` via `contentChild`. The app only uses\r\n * `mode` (\"single\" ×17 / \"multiple\" ×14, plain string attrs), `selectAllMode=\"page\"`,\r\n * `showCheckBoxesMode` (\"always\" ×11 shows the checkbox column; \"false\"/\"none\" hide it →\r\n * selection by row click). `recursive` is tree-list-only (ignored here).\r\n */\r\n@Component({\r\n selector: 'nxe-selection',\r\n standalone: true,\r\n template: '',\r\n host: { style: 'display: none' },\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class NxeSelectionComponent {\r\n readonly mode = input<'single' | 'multiple' | 'none'>('single');\r\n readonly selectAllMode = input<'page' | 'allPages'>('page');\r\n /** \"always\" shows the checkbox column; anything else (\"false\"/\"none\"/\"onClick\") hides it. */\r\n readonly showCheckBoxesMode = input<string>('onClick');\r\n readonly recursive = input(false);\r\n /** dx parity: row-body clicks toggle selection even when checkboxes are shown. */\r\n readonly selectByClick = input(false);\r\n}\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\nimport { computed, signal } from '@angular/core';\r\nimport { parseDateValue } from '@nexterajs/ui/intl';\r\n\r\n/**\r\n * Header-filter state model — the draft/apply/search machinery extracted from\r\n * `nxe-data-grid` (pivot parity Phase 3a) so the pivot's field panel can reuse it on pages\r\n * that have no data grid. Pure signals/computeds, no Angular DI, ZERO behavior change:\r\n * every computed/method body is a verbatim move from `nxe-data-grid.component.ts`.\r\n *\r\n * The model is generic over the column type `C` (the grid passes `NxeColumnComponent`; the\r\n * pivot will pass its field descriptor) and reads rows/values through a\r\n * {@link NxeHeaderFilterSource} adapter, so it owns only the frozen semantics:\r\n * `(Blanks)` first, Yes/No boolean buckets, the date Year > Month > Day tree, dx search\r\n * scoping of (Select All), check-on-open, and \"everything checked = no filter\" on apply.\r\n * (Select All)'s indeterminate state ({@link NxeHeaderFilterModel.someChecked}) is derived\r\n * from the same draft and search scope, and changes none of these rules.\r\n */\r\n\r\n/**\r\n * Header-filter key for blank-ish values (`null`/`undefined`/`''`) — dx lists them as one\r\n * `(Blanks)` bucket, FIRST (bright audit). A symbol can never collide with data values.\r\n */\r\nexport const NXE_HF_BLANKS: unique symbol = Symbol('nxe-hf-blanks');\r\n\r\n/** A node of the date-column header-filter tree (dx: Year > Month > Day, bright audit). */\r\nexport interface NxeHfDateNode {\r\n label: string;\r\n key: string;\r\n children: NxeHfDateNode[];\r\n /** The draft-set entries this node covers (day keys, or the blanks sentinel). */\r\n leafKeys: any[];\r\n}\r\n\r\n/**\r\n * Normalizes a raw cell value to its header-filter key: blank-ish → the `(Blanks)` sentinel,\r\n * date columns → a `yyyy-MM-dd` day key (the tree's leaf unit), else the raw value.\r\n */\r\nexport function nxeHfKey(raw: any, isDate: boolean): any {\r\n if (raw == null || raw === '') {\r\n return NXE_HF_BLANKS;\r\n }\r\n if (isDate) {\r\n const dt = parseDateValue(raw);\r\n return dt ? dt.toFormat('yyyy-MM-dd') : String(raw);\r\n }\r\n return raw;\r\n}\r\n\r\n/** How the model reads rows and column values — the host (grid, pivot) supplies these. */\r\nexport interface NxeHeaderFilterSource<C> {\r\n /** The rows the value list is built from. dx does NOT cascade header-filter lists for\r\n client arrays (bright audit V6) — the grid passes its FULL dataSource here. */\r\n rows(): readonly any[];\r\n /** Raw cell value of a row for this column (dotted-path aware on the grid). */\r\n rawValue(column: C, row: any): any;\r\n /** Formatted display text for a row — used for non-blank, non-boolean-bucket items. */\r\n displayText(column: C, row: any): string;\r\n /** Date column → values bucket into the Year > Month > Day tree. */\r\n isDate(column: C): boolean;\r\n /** dx sorts lookup columns by display text, everything else by raw value. */\r\n sortByDisplayText(column: C): boolean;\r\n /** dx boolean buckets label Yes/No (Yes first); `null` = not a boolean bucket. */\r\n boolLabel(column: C, raw: any): 'Yes' | 'No' | null;\r\n /** Raw-value comparator (numbers numeric, dates by instant, else locale strings). */\r\n compare(a: any, b: any): number;\r\n /**\r\n * dx `headerFilter.dataSource` on a column: a fixed `{ text, value }` list replacing the\r\n * values derived from the rows. Returning `null` (the default) keeps the derived list.\r\n *\r\n * A fixed list is used verbatim — declared order, no `(Blanks)` sentinel, and values that\r\n * never occur in the data still listed. That is dx's behaviour and the point of supplying\r\n * one: a boolean column whose rows are all `true` should still offer \"No\".\r\n */\r\n fixedItems?(column: C): { key: any; text: string }[] | null;\r\n}\r\n\r\n/** The words the popup writes itself; each a function so a host can read a signal inside it. */\r\nexport interface NxeHeaderFilterLabels {\r\n blanks(): string;\r\n yes(): string;\r\n no(): string;\r\n /** Month name for a 1-based month number. */\r\n month(month: number): string;\r\n}\r\n\r\nconst NXE_HF_ENGLISH_LABELS: NxeHeaderFilterLabels = {\r\n blanks: () => '(Blanks)',\r\n yes: () => 'Yes',\r\n no: () => 'No',\r\n month: (month) =>\r\n [\r\n 'January', 'February', 'March', 'April', 'May', 'June',\r\n 'July', 'August', 'September', 'October', 'November', 'December',\r\n ][month - 1],\r\n};\r\n\r\nexport class NxeHeaderFilterModel<C = unknown> {\r\n\r\n /** The column whose popup is open (`null` = closed). */\r\n readonly column = signal<C | null>(null);\r\n /** The checked key set being edited in the popup (committed by the host on OK). */\r\n readonly draft = signal<ReadonlySet<any>>(new Set());\r\n readonly search = signal('');\r\n readonly expanded = signal<ReadonlySet<string>>(new Set());\r\n\r\n constructor(\r\n private readonly source: NxeHeaderFilterSource<C>,\r\n private readonly labels: NxeHeaderFilterLabels = NXE_HF_ENGLISH_LABELS,\r\n ) {}\r\n\r\n /** The popup's wording for a boolean bucket. */\r\n private boolText(label: 'Yes' | 'No' | null): string | null {\r\n return label === null ? null : label === 'Yes' ? this.labels.yes() : this.labels.no();\r\n }\r\n\r\n /** This column's header-filter key for a raw value. */\r\n key(column: C, raw: any): any {\r\n return nxeHfKey(raw, this.source.isDate(column));\r\n }\r\n\r\n /** Distinct {key, text} for the open column — `(Blanks)` first, then Yes/No or values ascending. */\r\n readonly distinct = computed<{ key: any; text: string }[]>(() => {\r\n const col = this.column();\r\n if (!col) {\r\n return [];\r\n }\r\n const fixed = this.source.fixedItems?.(col);\r\n if (fixed) {\r\n return fixed;\r\n }\r\n const seen = new Map<any, { key: any; text: string; raw: any }>();\r\n for (const row of this.source.rows()) {\r\n const raw = this.source.rawValue(col, row);\r\n const key = this.key(col, raw);\r\n if (!seen.has(key)) {\r\n seen.set(key, {\r\n key,\r\n raw,\r\n text:\r\n key === NXE_HF_BLANKS\r\n ? this.labels.blanks()\r\n : (this.boolText(this.source.boolLabel(col, raw)) ?? this.source.displayText(col, row)),\r\n });\r\n }\r\n }\r\n // dx sorts lookup columns by display text, everything else by raw value.\r\n const byDisplay = this.source.sortByDisplayText(col);\r\n return [...seen.values()]\r\n .sort((a, b) => {\r\n if (a.key === NXE_HF_BLANKS) {\r\n return -1;\r\n }\r\n if (b.key === NXE_HF_BLANKS) {\r\n return 1;\r\n }\r\n const la = this.source.boolLabel(col, a.raw);\r\n const lb = this.source.boolLabel(col, b.raw);\r\n if (la && lb) {\r\n return la === lb ? 0 : la === 'Yes' ? -1 : 1;\r\n }\r\n return byDisplay ? a.text.localeCompare(b.text) : this.source.compare(a.raw, b.raw);\r\n })\r\n .map(({ key, text }) => ({ key, text }));\r\n });\r\n\r\n readonly distinctFiltered = computed(() => {\r\n const q = this.search().trim().toLowerCase();\r\n return q ? this.distinct().filter((d) => d.text.toLowerCase().includes(q)) : this.distinct();\r\n });\r\n\r\n // --- Date-column header filter: Year > Month > Day tree (dx groupInterval default) ----------\r\n readonly isDate = computed(() => {\r\n const col = this.column();\r\n return !!col && this.source.isDate(col);\r\n });\r\n\r\n readonly dateTree = computed<NxeHfDateNode[]>(() => {\r\n const col = this.column();\r\n if (!col || !this.source.isDate(col)) {\r\n return [];\r\n }\r\n const days = new Set<string>();\r\n const unparseable = new Map<string, any>();\r\n let hasBlanks = false;\r\n for (const row of this.source.rows()) {\r\n const key = this.key(col, this.source.rawValue(col, row));\r\n if (key === NXE_HF_BLANKS) {\r\n hasBlanks = true;\r\n } else if (typeof key === 'string' && /^\\d{4}-\\d{2}-\\d{2}$/.test(key)) {\r\n days.add(key);\r\n } else {\r\n // nxeHfKey's String(raw) fallback for unparseable dates — a flat leaf, not Y>M>D\r\n unparseable.set(String(key), key);\r\n }\r\n }\r\n const out: NxeHfDateNode[] = [];\r\n if (hasBlanks) {\r\n out.push({ label: this.labels.blanks(), key: 'blanks', children: [], leafKeys: [NXE_HF_BLANKS] });\r\n }\r\n const byYear = new Map<string, Map<number, string[]>>();\r\n for (const day of [...days].sort()) {\r\n const year = day.slice(0, 4);\r\n const month = Number(day.slice(5, 7));\r\n if (!byYear.has(year)) {\r\n byYear.set(year, new Map());\r\n }\r\n const months = byYear.get(year)!;\r\n if (!months.has(month)) {\r\n months.set(month, []);\r\n }\r\n months.get(month)!.push(day);\r\n }\r\n for (const [year, months] of byYear) {\r\n const monthNodes: NxeHfDateNode[] = [];\r\n for (const [month, dayKeys] of months) {\r\n monthNodes.push({\r\n label: this.labels.month(month),\r\n key: `m:${year}-${month}`,\r\n children: dayKeys.map((d) => ({\r\n label: String(Number(d.slice(8, 10))),\r\n key: `d:${d}`,\r\n children: [],\r\n leafKeys: [d],\r\n })),\r\n leafKeys: dayKeys,\r\n });\r\n }\r\n out.push({\r\n label: year,\r\n key: `y:${year}`,\r\n children: monthNodes,\r\n leafKeys: monthNodes.flatMap((m) => m.leafKeys),\r\n });\r\n }\r\n for (const [label, key] of [...unparseable].sort((a, b) => a[0].localeCompare(b[0]))) {\r\n out.push({ label, key: `o:${label}`, children: [], leafKeys: [key] });\r\n }\r\n return out;\r\n });\r\n\r\n /**\r\n * Search prunes the tree dx-style: a node stays if its label matches or a descendant does;\r\n * a matched-label node with no matching descendants collapses to a leaf (keeps all its keys).\r\n */\r\n readonly dateTreeFiltered = computed<NxeHfDateNode[]>(() => {\r\n const q = this.search().trim().toLowerCase();\r\n if (!q) {\r\n return this.dateTree();\r\n }\r\n const prune = (nodes: NxeHfDateNode[]): NxeHfDateNode[] =>\r\n nodes\r\n .map((n) => {\r\n const kids = prune(n.children);\r\n if (kids.length) {\r\n return { ...n, children: kids, leafKeys: kids.flatMap((k) => k.leafKeys) };\r\n }\r\n if (n.label.toLowerCase().includes(q)) {\r\n return { ...n, children: [] };\r\n }\r\n return null;\r\n })\r\n .filter((n): n is NxeHfDateNode => !!n);\r\n return prune(this.dateTree());\r\n });\r\n\r\n toggleExpand(key: string): void {\r\n this.expanded.update((set) => {\r\n const next = new Set(set);\r\n next.has(key) ? next.delete(key) : next.add(key);\r\n return next;\r\n });\r\n }\r\n\r\n /** While searching every surviving branch shows expanded (dx auto-expands matches). */\r\n nodeExpanded(key: string): boolean {\r\n return this.search().trim() ? true : this.expanded().has(key);\r\n }\r\n\r\n nodeChecked(n: NxeHfDateNode): boolean {\r\n const draft = this.draft();\r\n return n.leafKeys.length > 0 && n.leafKeys.every((k) => draft.has(k));\r\n }\r\n\r\n nodeIndeterminate(n: NxeHfDateNode): boolean {\r\n const draft = this.draft();\r\n return !this.nodeChecked(n) && n.leafKeys.some((k) => draft.has(k));\r\n }\r\n\r\n toggleNode(n: NxeHfDateNode): void {\r\n const removing = this.nodeChecked(n);\r\n this.draft.update((set) => {\r\n const next = new Set(set);\r\n for (const k of n.leafKeys) {\r\n removing ? next.delete(k) : next.add(k);\r\n }\r\n return next;\r\n });\r\n }\r\n\r\n /** Every selectable key of the open column (tree leaves for dates, list keys otherwise). */\r\n readonly allKeys = computed<any[]>(() =>\r\n this.isDate()\r\n ? this.dateTree().flatMap((n) => n.leafKeys)\r\n : this.distinct().map((d) => d.key),\r\n );\r\n\r\n /** The keys currently shown in the popup — with a search active, only the matches. */\r\n readonly visibleKeys = computed<any[]>(() =>\r\n this.isDate()\r\n ? this.dateTreeFiltered().flatMap((n) => n.leafKeys)\r\n : this.distinctFiltered().map((d) => d.key),\r\n );\r\n\r\n /** (Select All) state/toggle operate on the VISIBLE keys (dx: search scopes Select All). */\r\n readonly allChecked = computed(() => {\r\n const all = this.visibleKeys();\r\n const draft = this.draft();\r\n return all.length > 0 && all.every((k) => draft.has(k));\r\n });\r\n\r\n /**\r\n * (Select All)'s third state: some visible keys checked, but not all. dx shows it as the\r\n * indeterminate square (the select-all dxCheckBox's `value: undefined`). It is never true\r\n * together with {@link allChecked}, so check-on-open, which checks everything when no filter\r\n * is applied, always opens on a fully checked box and never on a half-checked one.\r\n */\r\n readonly someChecked = computed(() => {\r\n if (this.allChecked()) {\r\n return false;\r\n }\r\n const draft = this.draft();\r\n return this.visibleKeys().some((k) => draft.has(k));\r\n });\r\n\r\n /** Whether every key of the whole column is checked — decides \"no filter\" on apply. */\r\n readonly fullChecked = computed(() => {\r\n const all = this.allKeys();\r\n const draft = this.draft();\r\n return all.length > 0 && all.every((k) => draft.has(k));\r\n });\r\n\r\n /**\r\n * Reset the popup state for `column` (check-on-open — FROZEN, see DEFAULTS.md):\r\n * no applied filter → everything checked; else start from the applied set.\r\n */\r\n open(column: C, applied: ReadonlySet<any> | undefined): void {\r\n this.column.set(column);\r\n this.search.set('');\r\n this.expanded.set(new Set());\r\n this.draft.set(applied ? new Set(applied) : new Set(this.allKeys()));\r\n }\r\n\r\n close(): void {\r\n this.column.set(null);\r\n }\r\n\r\n toggleValue(value: any): void {\r\n this.draft.update((set) => {\r\n const next = new Set(set);\r\n next.has(value) ? next.delete(value) : next.add(value);\r\n return next;\r\n });\r\n }\r\n\r\n toggleAll(): void {\r\n const visible = this.visibleKeys();\r\n const removing = this.allChecked();\r\n this.draft.update((set) => {\r\n const next = new Set(set);\r\n for (const k of visible) {\r\n removing ? next.delete(k) : next.add(k);\r\n }\r\n return next;\r\n });\r\n }\r\n\r\n /**\r\n * The set the host stores on OK: everything checked (or nothing to choose from) =\r\n * explicit \"no filter\" (`null` so a declarative seed can't resurrect); else the\r\n * allowed-key set (empty = empty grid).\r\n */\r\n applyResult(): ReadonlySet<any> | null {\r\n const clear = this.fullChecked() || this.allKeys().length === 0;\r\n return clear ? null : new Set(this.draft());\r\n }\r\n}\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\nimport { NgTemplateOutlet } from '@angular/common';\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n ElementRef,\r\n inject,\r\n input,\r\n output,\r\n viewChild,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { NxeMessageService } from '@nexterajs/ui/core';\r\nimport { NxeHeaderFilterModel } from './nxe-header-filter.model';\r\n\r\n/**\r\n * The header-filter popup panel — the `.nxe-hf-*` chunk extracted from `nxe-data-grid`'s\r\n * template (pivot parity Phase 3a) so the pivot can open the same popup on pages with no\r\n * data grid. Same DOM, same FROZEN classes (`.nxe-hf-item`/`.nxe-hf-search`/… — DEFAULTS.md):\r\n * the host element carries `nxe-header-filter-menu nxe-hf-panel`, exactly where the old\r\n * template's root `<div>` sat inside the overlay pane. The dx-parity pass only added to that DOM:\r\n * the `input.nxe-hf-search` now sits in a `.nxe-hf-searchbox` with its magnifier and clear\r\n * button, and rows also carry `.nxe-hf-list-item` / `.nxe-hf-tree-item`.\r\n *\r\n * Renders whatever {@link NxeHeaderFilterModel} it is given — checkbox list or the date\r\n * Year > Month > Day tree — and emits `applied`/`cancelled` for the host to commit/close;\r\n * the panel itself never touches the host's filter state.\r\n */\r\n@Component({\r\n selector: 'nxe-header-filter-panel',\r\n standalone: true,\r\n imports: [NgTemplateOutlet],\r\n templateUrl: './nxe-header-filter-panel.component.html',\r\n styleUrl: './nxe-header-filter-panel.component.scss',\r\n host: { class: 'nxe-header-filter-menu nxe-hf-panel' },\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class NxeHeaderFilterPanelComponent {\r\n /** The library's runtime-switchable messages. */\r\n protected readonly messages = inject(NxeMessageService);\r\n readonly model = input.required<NxeHeaderFilterModel<any>>();\r\n /** Live predicate (re-read every CD, like the grid template did) — a mid-open config\r\n change to `search.enabled` still shows/hides the box. */\r\n readonly searchEnabled = input<() => boolean>(() => true);\r\n /** OK — the host commits the draft and closes. */\r\n readonly applied = output<void>();\r\n /** Cancel — the host closes without committing. */\r\n readonly cancelled = output<void>();\r\n\r\n private readonly searchInput = viewChild<ElementRef<HTMLInputElement>>('searchInput');\r\n\r\n protected showSearch(): boolean {\r\n return this.searchEnabled()();\r\n }\r\n\r\n /** The search box's clear button (dx search mode forces `showClearButton`): empties the\r\n search and keeps the caret in the box, as dx's clear does. */\r\n protected clearSearch(): void {\r\n this.model().search.set('');\r\n this.searchInput()?.nativeElement.focus();\r\n }\r\n}\r\n","@if (showSearch()) {\r\n <!-- dx builds this as a dxTextBox in mode 'search' (the list/tree searchEnabled option), which\r\n forces showClearButton: a magnifier in a 34px slot inside the left border, and a clear\r\n button in a 34px area inside the right border that only exists while there is text to\r\n clear. Both glyphs are drawn here from primitives; the DXIcons font is not used. -->\r\n <div class=\"nxe-hf-searchbox\">\r\n <!-- The magnifier both search boxes share (dx draws them with one rule,\r\n .dx-searchbox .dx-icon-search): a r4.75 ring and a 45deg handle, 1.9px strokes. Keep\r\n it identical to the tree view's (nxe-tree-view.component.html). -->\r\n <svg class=\"nxe-hf-search-icon\" viewBox=\"0 0 34 34\" aria-hidden=\"true\" focusable=\"false\">\r\n <circle cx=\"15\" cy=\"15\" r=\"4.75\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\" />\r\n <path d=\"M18.5 18.5 23.5 23.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.9\" />\r\n </svg>\r\n <input\r\n #searchInput\r\n class=\"nxe-hf-search\"\r\n type=\"text\"\r\n [attr.placeholder]=\"messages.t('common.search')\"\r\n [attr.aria-label]=\"messages.t('common.search')\"\r\n [value]=\"model().search()\"\r\n (input)=\"model().search.set($any($event.target).value)\" />\r\n @if (model().search()) {\r\n <button\r\n class=\"nxe-hf-search-clear\"\r\n type=\"button\"\r\n tabindex=\"-1\"\r\n [attr.aria-label]=\"messages.t('common.clear')\"\r\n (mousedown)=\"$event.preventDefault()\"\r\n (click)=\"clearSearch()\">\r\n <!-- The editors' clear glyph: a 16px disc with a 2px x cut out, two 2px bars\r\n each running corner to corner of the 8px square centred on the disc, drawn as\r\n a plus and turned 45deg. -->\r\n <svg viewBox=\"0 0 18 18\" aria-hidden=\"true\" focusable=\"false\">\r\n <path\r\n fill=\"currentColor\"\r\n fill-rule=\"evenodd\"\r\n transform=\"rotate(45 9 9)\"\r\n d=\"M9 1a8 8 0 1 1 0 16A8 8 0 1 1 9 1ZM8 3.343h2V8h4.657v2H10v4.657H8V10H3.343V8H8Z\" />\r\n </svg>\r\n </button>\r\n }\r\n </div>\r\n}\r\n<div class=\"nxe-hf-list\" [class.nxe-hf-tree]=\"model().isDate()\">\r\n <label class=\"nxe-hf-item nxe-hf-selectall\">\r\n <input\r\n type=\"checkbox\"\r\n [checked]=\"model().allChecked()\"\r\n [indeterminate]=\"model().someChecked()\"\r\n (change)=\"model().toggleAll()\" />\r\n <span>{{ messages.t('common.selectAll') }}</span>\r\n </label>\r\n @if (model().isDate()) {\r\n <!-- dx date header filter: Year > Month > Day checkbox tree -->\r\n <ng-container\r\n [ngTemplateOutlet]=\"hfTreeNodes\"\r\n [ngTemplateOutletContext]=\"{ $implicit: model().dateTreeFiltered() }\" />\r\n } @else {\r\n @for (item of model().distinctFiltered(); track item.key) {\r\n <label class=\"nxe-hf-item nxe-hf-list-item\">\r\n <input\r\n type=\"checkbox\"\r\n [checked]=\"model().draft().has(item.key)\"\r\n (change)=\"model().toggleValue(item.key)\" />\r\n <span>{{ item.text }}</span>\r\n </label>\r\n }\r\n }\r\n</div>\r\n<div class=\"nxe-hf-actions\">\r\n <button type=\"button\" class=\"nxe-hf-btn nxe-hf-ok\" (click)=\"applied.emit()\">{{ messages.t('common.ok') }}</button>\r\n <button type=\"button\" class=\"nxe-hf-btn\" (click)=\"cancelled.emit()\">{{ messages.t('common.cancel') }}</button>\r\n</div>\r\n\r\n<!-- Recursive date-tree nodes for the header-filter popup. Each node's first grid row is dx's\r\n .dx-treeview-item: the toggle (or its stub) and the label share it, the label spanning the\r\n whole row so its hover paints the full row, as dx's does. -->\r\n<ng-template #hfTreeNodes let-nodes>\r\n @for (n of nodes; track n.key) {\r\n <div class=\"nxe-hf-tree-node\">\r\n @if (n.children.length) {\r\n <span\r\n class=\"nxe-hf-tree-toggle\"\r\n [class.nxe-expanded]=\"model().nodeExpanded(n.key)\"\r\n (click)=\"model().toggleExpand(n.key)\"></span>\r\n } @else {\r\n <span class=\"nxe-hf-tree-toggle-stub\"></span>\r\n }\r\n <label class=\"nxe-hf-item nxe-hf-tree-item\">\r\n <input\r\n type=\"checkbox\"\r\n [checked]=\"model().nodeChecked(n)\"\r\n [indeterminate]=\"model().nodeIndeterminate(n)\"\r\n (change)=\"model().toggleNode(n)\" />\r\n <span>{{ n.label }}</span>\r\n </label>\r\n @if (n.children.length && model().nodeExpanded(n.key)) {\r\n <div class=\"nxe-hf-tree-children\">\r\n <ng-container\r\n [ngTemplateOutlet]=\"hfTreeNodes\"\r\n [ngTemplateOutletContext]=\"{ $implicit: n.children }\" />\r\n </div>\r\n }\r\n </div>\r\n }\r\n</ng-template>\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\nimport { Overlay, OverlayRef } from '@angular/cdk/overlay';\r\nimport { ComponentPortal } from '@angular/cdk/portal';\r\nimport { ViewContainerRef } from '@angular/core';\r\nimport { nxePane } from '@nexterajs/ui/styling';\r\nimport { NxeHeaderFilterModel } from './nxe-header-filter.model';\r\nimport { NxeHeaderFilterPanelComponent } from './nxe-header-filter-panel.component';\r\n\r\n/**\r\n * CDK overlay wiring for the header-filter popup — extracted from `nxe-data-grid` (pivot\r\n * parity Phase 3a) so any host (grid header funnel, pivot field panel) opens the identical\r\n * popup: dropped below the origin start-aligned (end-aligned fallback), repositioning on\r\n * scroll, closing on a transparent-backdrop click, pane carrying `nxePane('nxe-hf-pane')`\r\n * (the `.nxe-widget` font contract for body-level panes).\r\n */\r\nexport interface NxeHeaderFilterOverlayOptions {\r\n overlay: Overlay;\r\n /** Anchors the panel in the caller's injector AND change-detection tree — exactly what\r\n the grid's old `TemplatePortal(panel, viewContainerRef)` attachment did. */\r\n viewContainerRef: ViewContainerRef;\r\n /** The clicked funnel/trigger element the panel connects to. */\r\n origin: HTMLElement;\r\n model: NxeHeaderFilterModel<any>;\r\n /** Live predicate for the in-popup search box (re-read every CD). */\r\n searchEnabled: () => boolean;\r\n /** OK — commit the draft and close (the host disposes/detaches the returned ref). */\r\n onApply: () => void;\r\n /** Cancel button or backdrop click — close without committing. */\r\n onClose: () => void;\r\n}\r\n\r\n/** Create + attach the header-filter popup; the caller keeps the ref to detach/dispose. */\r\nexport function openNxeHeaderFilterOverlay(options: NxeHeaderFilterOverlayOptions): OverlayRef {\r\n const overlayRef = options.overlay.create({\r\n positionStrategy: options.overlay\r\n .position()\r\n .flexibleConnectedTo(options.origin)\r\n .withPositions([\r\n { originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top' },\r\n { originX: 'end', originY: 'bottom', overlayX: 'end', overlayY: 'top' },\r\n ]),\r\n scrollStrategy: options.overlay.scrollStrategies.reposition(),\r\n hasBackdrop: true,\r\n backdropClass: 'cdk-overlay-transparent-backdrop',\r\n panelClass: nxePane('nxe-hf-pane'),\r\n });\r\n overlayRef.backdropClick().subscribe(() => options.onClose());\r\n // Escape closes the filter menu (dx). This subscription is also what makes CDK deliver the\r\n // key here at all: OverlayKeyboardDispatcher dispatches to the topmost overlay that HAS a\r\n // keydown observer, so without it Escape fell through to whatever overlay sits underneath —\r\n // on the pivot that is the field chooser, which would close and strand this popup on a\r\n // detached anchor.\r\n overlayRef.keydownEvents().subscribe((event) => {\r\n if (event.key === 'Escape') {\r\n event.stopPropagation();\r\n options.onClose();\r\n }\r\n });\r\n const panelRef = overlayRef.attach(\r\n new ComponentPortal(NxeHeaderFilterPanelComponent, options.viewContainerRef),\r\n );\r\n panelRef.setInput('model', options.model);\r\n panelRef.setInput('searchEnabled', options.searchEnabled);\r\n panelRef.instance.applied.subscribe(() => options.onApply());\r\n panelRef.instance.cancelled.subscribe(() => options.onClose());\r\n return overlayRef;\r\n}\r\n","import { ChangeDetectionStrategy, Component, input, ViewEncapsulation } from '@angular/core';\r\n\r\n/** `dxo-grouping` — only `[autoExpandAll]=\"true\"` is used (24 grids). */\r\n@Component({\r\n selector: 'nxe-grouping',\r\n standalone: true,\r\n template: '',\r\n host: { style: 'display: none' },\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class NxeGroupingComponent {\r\n readonly autoExpandAll = input(true);\r\n}\r\n\r\n/** `dxo-group-panel` — only `[visible]` is used (23 grids). */\r\n@Component({\r\n selector: 'nxe-group-panel',\r\n standalone: true,\r\n template: '',\r\n host: { style: 'display: none' },\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class NxeGroupPanelComponent {\r\n readonly visible = input<boolean | 'auto'>(false);\r\n}\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n contentChildren,\r\n Directive,\r\n input,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { NxeColumnFormat, NxeCustomizeText } from './nxe-grid.types';\r\n\r\n/** Structural shape the grid reads off a total/group summary item. */\r\nexport interface NxeSummaryItemLike {\r\n column(): string;\r\n summaryType(): 'sum' | 'count' | 'min' | 'max' | 'avg' | 'custom';\r\n name(): string | undefined;\r\n displayFormat(): string;\r\n customizeText(): NxeCustomizeText | undefined;\r\n valueFormat(): NxeColumnFormat | undefined;\r\n alignByColumn(): boolean;\r\n showInGroupFooter(): boolean;\r\n showInColumn(): string | undefined;\r\n}\r\n\r\n/** Shared base for total/group summary items. The app only uses `summaryType=\"sum\"`. */\r\n@Directive()\r\nabstract class NxeSummaryItemBase implements NxeSummaryItemLike {\r\n readonly column = input<string>('');\r\n readonly summaryType = input<'sum' | 'count' | 'min' | 'max' | 'avg' | 'custom'>('sum');\r\n /** Identifier passed to `calculateCustomSummary` for `summaryType='custom'` items. */\r\n readonly name = input<string | undefined>(undefined);\r\n /** Positional template; `{0}` is replaced by the customized/formatted value. */\r\n readonly displayFormat = input<string>('{0}');\r\n readonly customizeText = input<NxeCustomizeText | undefined>(undefined);\r\n readonly valueFormat = input<NxeColumnFormat | undefined>(undefined);\r\n readonly alignByColumn = input(false);\r\n /** Render this group aggregate in a footer row under the group instead of the group row. */\r\n readonly showInGroupFooter = input(false);\r\n readonly showInColumn = input<string | undefined>(undefined);\r\n}\r\n\r\n/** `dxi-total-item` — a grand-total footer aggregate. */\r\n@Component({\r\n selector: 'nxe-total-item',\r\n standalone: true,\r\n template: '',\r\n host: { style: 'display: none' },\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class NxeTotalItemComponent extends NxeSummaryItemBase {}\r\n\r\n/** `dxi-group-item` — a per-group footer aggregate. */\r\n@Component({\r\n selector: 'nxe-group-item',\r\n standalone: true,\r\n template: '',\r\n host: { style: 'display: none' },\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class NxeGroupItemComponent extends NxeSummaryItemBase {}\r\n\r\n/** `dxo-summary` — container collecting `nxe-total-item` / `nxe-group-item` children. */\r\n@Component({\r\n selector: 'nxe-summary',\r\n standalone: true,\r\n template: '<ng-content />',\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class NxeSummaryComponent {\r\n /**\r\n * DevExtreme `calculateCustomSummary` (orbit addition): called with the dx protocol —\r\n * `{name, summaryProcess:'start'}`, then `'calculate'` once per row (`options.value` = the\r\n * row object), then `'finalize'`; the handler mutates `options.totalValue`.\r\n */\r\n readonly calculateCustomSummary = input<((options: any) => void) | undefined>(undefined);\r\n readonly totalItems = contentChildren(NxeTotalItemComponent);\r\n readonly groupItems = contentChildren(NxeGroupItemComponent);\r\n}\r\n","import { ChangeDetectionStrategy, Component, input, model, ViewEncapsulation } from '@angular/core';\r\n\r\n/** `dxo-paging` — internal client paging. Presence enables paging; `[pageSize]`/`[pageIndex]` used. */\r\n@Component({\r\n selector: 'nxe-paging',\r\n standalone: true,\r\n template: '',\r\n host: { style: 'display: none' },\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class NxePagingComponent {\r\n readonly pageSize = input<number>(20);\r\n /** Two-way: dx supports `[(pageIndex)]`, and a consumer drives the pager from outside with it. */\r\n readonly pageIndex = model<number>(0);\r\n readonly enabled = input<boolean>(true);\r\n}\r\n\r\n/** `dxo-pager` — the pager UI config. */\r\n@Component({\r\n selector: 'nxe-pager',\r\n standalone: true,\r\n template: '',\r\n host: { style: 'display: none' },\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class NxePagerComponent {\r\n /** `'auto'` shows the pager only when there is more than one page (dx `isVisible`). */\r\n readonly visible = input<boolean | 'auto'>('auto');\r\n /** `'auto'` offers half, the same and double the page size (dx `getPageSizes`). */\r\n readonly allowedPageSizes = input<number[] | 'auto'>('auto');\r\n readonly showPageSizeSelector = input(false);\r\n readonly showNavigationButtons = input(false);\r\n readonly showInfo = input(false);\r\n /**\r\n * `'full'` and `'adaptive'` list the page sizes as buttons; `'compact'` uses a drop-down and\r\n * always shows the navigation buttons, as dx's small mode does.\r\n */\r\n readonly displayMode = input<'adaptive' | 'compact' | 'full'>('adaptive');\r\n /** dx `pager.infoText`: `{0}` the page, `{1}` the page count, `{2}` the item count. */\r\n readonly infoText = input<string | undefined>(undefined);\r\n /** dx `pager.label`: the pager's accessible name. */\r\n readonly label = input<string | undefined>(undefined);\r\n}\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\nimport { ChangeDetectionStrategy, Component, input, model, ViewEncapsulation } from '@angular/core';\r\n\r\n/** A tracked inline change (matches the app's local `Change<T>` shape). */\r\nexport interface NxeGridChange<T = any> {\r\n type: 'insert' | 'update' | 'remove';\r\n key: any;\r\n data: Partial<T>;\r\n}\r\n\r\n/**\r\n * `dxo-editing` — inline editing config. In this app editing is almost always template-driven\r\n * (cell templates host `nxe-*` editors two-way-bound to `key.data.<field>`), so `mode=\"cell\"` +\r\n * `allowUpdating` are effectively decorative there. `mode=\"row\"` with `[(changes)]`/`[(editRowKey)]`\r\n * (autonumber-detail) and native cell editors (job-upsert) drive the grid's native inline editing.\r\n */\r\n@Component({\r\n selector: 'nxe-editing',\r\n standalone: true,\r\n template: '',\r\n host: { style: 'display: none' },\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class NxeEditingComponent {\r\n readonly mode = input<'cell' | 'row' | 'batch'>('cell');\r\n readonly allowUpdating = input(false);\r\n readonly allowAdding = input(false);\r\n readonly allowDeleting = input(false);\r\n /** Two-way tracked changes (autonumber-detail's `Change<T>[]`). */\r\n readonly changes = model<NxeGridChange[]>([]);\r\n /** Two-way key of the row currently in edit mode (row mode). */\r\n readonly editRowKey = model<any>(null);\r\n}\r\n","import { ChangeDetectionStrategy, Component, input, ViewEncapsulation } from '@angular/core';\r\n\r\n/**\r\n * `nxe-filter-row` — drop-in for DevExtreme `dxo-filter-row` (orbit addition; psak expressed\r\n * the same config through the grid's `[filterRow]` object input, which remains supported).\r\n * A no-render config element read by the parent `nxe-data-grid`.\r\n */\r\n@Component({\r\n selector: 'nxe-filter-row',\r\n standalone: true,\r\n template: '',\r\n host: { style: 'display: none' },\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class NxeFilterRowComponent {\r\n readonly visible = input(false);\r\n /** DevExtreme parity (`auto`/`onClick`); the nxe filter row always applies on input. */\r\n readonly applyFilter = input<string | undefined>(undefined);\r\n}\r\n","import { ChangeDetectionStrategy, Component, input, ViewEncapsulation } from '@angular/core';\r\n\r\n/**\r\n * `nxe-master-detail` — drop-in for DevExtreme `dxo-master-detail` (orbit addition).\r\n *\r\n * A no-render config element read by the parent `nxe-data-grid`. When `enabled`, the grid\r\n * prepends a `nxe-command-expand` column; expanding a row renders a\r\n * `<tr class=\"nxe-master-detail-row\">` hosting the named sibling\r\n * `<ng-template nxeTemplate=\"...\">` with `{ data, rowIndex, key }` — instantiated ONLY while\r\n * expanded, preserving the app's lazy nested-grid loading (`onRowExpanding` fires first).\r\n */\r\n@Component({\r\n selector: 'nxe-master-detail',\r\n standalone: true,\r\n template: '',\r\n host: { style: 'display: none' },\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class NxeMasterDetailComponent {\r\n readonly enabled = input(false);\r\n /** Name of the sibling `nxeTemplate` rendered as the detail section (default `detail`). */\r\n readonly template = input<string>('detail');\r\n}\r\n","import { ChangeDetectionStrategy, Component, input, ViewEncapsulation } from '@angular/core';\r\n\r\n/**\r\n * `dxo-scrolling` — accepted for parity.\r\n *\r\n * Grid: the only usage is `rowRenderingMode=\"virtual\"` (ledger-list), which renders only\r\n * visible rows but loads all data; nxe-data-grid renders all rows (datasets are small\r\n * enough), so it stays a no-op config there.\r\n *\r\n * Pivot (LIVE since W4 Lane 3): `NxePivotGridComponent` contentChild's this and\r\n * `mode: 'virtual'` arms ROW WINDOWING — for `rowHeaderLayout: 'tree'` ONLY (the standard\r\n * layout's rowspan-merged parent labels conflict with row slicing; DEFAULTS.md). Render-only:\r\n * fixed 31px row pitch, spacer rows keep the scrollbar honest, and the model/export/chart\r\n * always see every row. The DA page projects `mode=\"virtual\"` but renders the standard\r\n * layout → no-op there, dx-consistent with its pane-based virtual scrolling being a render\r\n * optimization, never a data change.\r\n */\r\n@Component({\r\n selector: 'nxe-scrolling',\r\n standalone: true,\r\n template: '',\r\n host: { style: 'display: none' },\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class NxeScrollingComponent {\r\n readonly mode = input<'standard' | 'virtual' | 'infinite'>('standard');\r\n readonly rowRenderingMode = input<'standard' | 'virtual'>('standard');\r\n}\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\nimport { Workbook } from '@nexterajs/ui/excel';\r\nimport { nxeSaveAs } from '@nexterajs/ui/excel';\r\nimport { parseDateValue } from '@nexterajs/ui/intl';\r\nimport { nxeDatePattern, nxeExcelNumberMask, nxeNumberValue } from './nxe-format.util';\r\nimport { NxeExportColumn, NxeGridInstance } from './nxe-grid.types';\r\n\r\nexport interface NxeExcelExportOptions {\r\n /** File name (`.xlsx` appended if missing). */\r\n fileName: string;\r\n sheetName?: string;\r\n /** Default true — sets the sheet auto-filter over the header range. */\r\n autoFilter?: boolean;\r\n /** Default true — defaults every cell font to 'Calibri Light' (form-report passes false). */\r\n applyFont?: boolean;\r\n}\r\n\r\nfunction getRaw(row: any, field: string): any {\r\n if (!field || row == null) {\r\n return undefined;\r\n }\r\n return field.includes('.') ? field.split('.').reduce((o: any, k) => o?.[k], row) : row[field];\r\n}\r\n\r\n/** A cell's exceljs value + optional number format. */\r\nfunction cellValue(row: any, col: NxeExportColumn): { value: any; numFmt?: string } {\r\n const raw = getRaw(row, col.dataField);\r\n if (raw == null || raw === '') {\r\n return { value: '' };\r\n }\r\n switch (col.dataType) {\r\n case 'number': {\r\n // The same parseFloat deserializer the cell display uses, so a cell exports the number\r\n // it shows. dx exports that raw number too (exceljs/export.js:207-221).\r\n const num = nxeNumberValue(raw);\r\n if (isNaN(num)) {\r\n return { value: String(raw) };\r\n }\r\n // dx number masks ≈ exceljs numFmt, minus the scaling commas Excel reads differently.\r\n const mask = typeof col.format === 'string' ? nxeExcelNumberMask(col.format) : undefined;\r\n return { value: num, numFmt: mask };\r\n }\r\n case 'date': {\r\n const dt = parseDateValue(raw);\r\n if (!dt) {\r\n return { value: String(raw) };\r\n }\r\n // exceljs date codes are lowercase (dd mmm yyyy hh:mm).\r\n return { value: dt.toJSDate(), numFmt: nxeDatePattern(col.format).toLowerCase() };\r\n }\r\n case 'boolean':\r\n return { value: raw ? 'true' : 'false' };\r\n default:\r\n return { value: String(raw) };\r\n }\r\n}\r\n\r\n/**\r\n * Replacement for DevExtreme's `exportDataGrid({component, worksheet, autoFilterEnabled})`.\r\n * Walks an {@link NxeGridInstance}'s currently-visible columns + filtered/sorted rows into an\r\n * exceljs sheet (header row + autofilter + per-column numFmt), defaults the font to 'Calibri\r\n * Light' (preserving the app's `formatExcel`), and saves via `nxeSaveAs` — matching the prior\r\n * `report.helper.exportExcel` pipeline.\r\n */\r\nexport async function exportNxeGridToExcel(\r\n grid: NxeGridInstance,\r\n opts: NxeExcelExportOptions,\r\n): Promise<void> {\r\n const workbook = new Workbook();\r\n const ws = workbook.addWorksheet(opts.sheetName);\r\n const cols = grid.getVisibleColumns();\r\n const rows = grid.getVisibleRows();\r\n\r\n ws.addRow(cols.map((c) => c.caption));\r\n for (const row of rows) {\r\n const cells = cols.map((c) => cellValue(row, c));\r\n const r = ws.addRow(cells.map((c) => c.value));\r\n cells.forEach((c, i) => {\r\n if (c.numFmt) {\r\n r.getCell(i + 1).numFmt = c.numFmt;\r\n }\r\n });\r\n }\r\n if (opts.autoFilter !== false && cols.length > 0) {\r\n ws.autoFilter = { from: { row: 1, column: 1 }, to: { row: 1, column: cols.length } };\r\n }\r\n if (opts.applyFont !== false) {\r\n ws.eachRow((row) =>\r\n row.eachCell((cell) => {\r\n if (!cell.font?.name) {\r\n cell.font = Object.assign(cell.font || {}, { name: 'Calibri Light' });\r\n }\r\n }),\r\n );\r\n }\r\n const buffer = await workbook.xlsx.writeBuffer();\r\n const fileName = opts.fileName.endsWith('.xlsx') ? opts.fileName : `${opts.fileName}.xlsx`;\r\n nxeSaveAs(new Blob([buffer], { type: 'application/octet-stream' }), fileName);\r\n}\r\n\r\n/** Options for {@link exportDataGrid} — mirrors DevExtreme's worksheet-injection call form. */\r\nexport interface NxeExportDataGridOptions {\r\n component: NxeGridInstance;\r\n /**\r\n * Caller-supplied worksheet — exceljs `Worksheet` or the in-house one; typed loosely\r\n * because the two APIs are structural cousins, not the same declared type.\r\n */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n worksheet: any;\r\n autoFilterEnabled?: boolean;\r\n}\r\n\r\n/**\r\n * Drop-in for DevExtreme's `exportDataGrid({component, worksheet, autoFilterEnabled})`\r\n * (orbit addition): writes the grid's visible columns + rows into the CALLER's worksheet —\r\n * the caller keeps ownership of the workbook, post-formatting, and saving\r\n * (`report.helper.exportExcel` pipeline).\r\n */\r\nexport async function exportDataGrid(opts: NxeExportDataGridOptions): Promise<void> {\r\n const ws = opts.worksheet;\r\n const cols = opts.component.getVisibleColumns();\r\n const rows = opts.component.getVisibleRows();\r\n\r\n ws.addRow(cols.map((c) => c.caption));\r\n for (const row of rows) {\r\n const cells = cols.map((c) => cellValue(row, c));\r\n const r = ws.addRow(cells.map((c) => c.value));\r\n cells.forEach((c, i) => {\r\n if (c.numFmt) {\r\n r.getCell(i + 1).numFmt = c.numFmt;\r\n }\r\n });\r\n }\r\n if (opts.autoFilterEnabled && cols.length > 0) {\r\n ws.autoFilter = { from: { row: 1, column: 1 }, to: { row: 1, column: cols.length } };\r\n }\r\n}\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\nimport { signal, type Signal, type WritableSignal } from '@angular/core';\r\nimport { isObservable, type Observable } from 'rxjs';\r\n\r\n/** One sort level: DevExtreme's `{ selector, desc }`. */\r\nexport interface NxeSortDescriptor {\r\n /** The column's `dataField`. */\r\n selector: string;\r\n desc: boolean;\r\n}\r\n\r\n/** Operators a filter-row or header-filter condition can carry (DevExtreme's filter operations). */\r\nexport type NxeFilterOperator =\r\n | '='\r\n | '<>'\r\n | '<'\r\n | '<='\r\n | '>'\r\n | '>='\r\n | 'contains'\r\n | 'notcontains'\r\n | 'startswith'\r\n | 'endswith';\r\n\r\n/**\r\n * A DevExtreme-style filter expression, the shape the grid's filter row and header filter produce\r\n * for a remote source:\r\n *\r\n * - a condition: `['name', 'contains', 'acme']`\r\n * - a negation: `['!', expression]`\r\n * - a group: `[expression, 'and', expression, 'or', expression]`, which may nest\r\n *\r\n * `between` is expanded the way DevExtreme expands it: `[[f, '>=', a], 'and', [f, '<=', b]]`.\r\n * Values are JSON-safe: strings, numbers, booleans and `null`; dates are `'yyyy-MM-dd'` strings.\r\n */\r\nexport type NxeFilterExpression = readonly unknown[];\r\n\r\n/** What the application (or the grid) states: the page, its size, the sort and the filter. */\r\nexport interface NxeRemoteQuery {\r\n /** 0-based page index. */\r\n pageIndex: number;\r\n pageSize: number;\r\n sort: readonly NxeSortDescriptor[];\r\n filter: NxeFilterExpression | null;\r\n}\r\n\r\n/**\r\n * What `load` receives: the query plus the same page as `skip`/`take`, so an adapter can take\r\n * whichever the endpoint speaks (`pageNo = pageIndex + 1`, or `offset = skip`).\r\n */\r\nexport interface NxeLoadOptions extends NxeRemoteQuery {\r\n readonly skip: number;\r\n readonly take: number;\r\n /** Always `true`: the grid needs the total to draw its pager. DevExtreme `CustomStore` parity. */\r\n readonly requireTotalCount: true;\r\n}\r\n\r\nexport interface NxeLoadResult<T = any> {\r\n data: readonly T[];\r\n /** Rows matching the filter across every page. */\r\n totalCount: number;\r\n}\r\n\r\nexport interface NxeLoadContext {\r\n /** Aborted when a newer request supersedes this one, or the source is cancelled or destroyed. */\r\n readonly signal: AbortSignal;\r\n}\r\n\r\n/** The load function: a promise or an observable (an `HttpClient` call passes straight in). */\r\nexport type NxeRemoteLoadFn<T = any> = (\r\n options: NxeLoadOptions,\r\n context: NxeLoadContext,\r\n) => Promise<NxeLoadResult<T> | readonly T[]> | Observable<NxeLoadResult<T> | readonly T[]>;\r\n\r\nexport interface NxeRemoteDataSourceConfig {\r\n /** The row key field. The grid takes its `keyExpr` from here when none is bound. */\r\n key?: string;\r\n /** The query the first load runs with. Anything left out is page 0, 20 rows, no sort, no filter. */\r\n initial?: Partial<NxeRemoteQuery>;\r\n /** Milliseconds a grid waits after the last filter-row keystroke before asking. Default 300. */\r\n filterDebounce?: number;\r\n}\r\n\r\n/** The default page size of a source (and of a remote grid with no `nxe-paging`). */\r\nexport const NXE_REMOTE_DEFAULT_PAGE_SIZE = 20;\r\n\r\n/** Structural equality of two queries; what keeps a re-stated, unchanged query from reloading. */\r\nexport function nxeSameQuery(a: NxeRemoteQuery, b: NxeRemoteQuery): boolean {\r\n return (\r\n a.pageIndex === b.pageIndex &&\r\n a.pageSize === b.pageSize &&\r\n JSON.stringify(a.sort) === JSON.stringify(b.sort) &&\r\n JSON.stringify(a.filter) === JSON.stringify(b.filter)\r\n );\r\n}\r\n\r\n/** Builds the load options for a query. */\r\nexport function nxeLoadOptions(query: NxeRemoteQuery): NxeLoadOptions {\r\n const pageSize = Math.max(1, Math.floor(query.pageSize));\r\n const pageIndex = Math.max(0, Math.floor(query.pageIndex));\r\n return {\r\n pageIndex,\r\n pageSize,\r\n skip: pageIndex * pageSize,\r\n take: pageSize,\r\n sort: query.sort.map((s) => ({ selector: s.selector, desc: s.desc })),\r\n filter: query.filter,\r\n requireTotalCount: true,\r\n };\r\n}\r\n\r\n/**\r\n * One condition of a flattened filter, in the form a REST adapter wants. `in` is an OR of `=` on one\r\n * field (a header-filter selection), with all its values.\r\n */\r\nexport interface NxeFlatFilterCondition {\r\n field: string;\r\n operator: NxeFilterOperator | 'in';\r\n value: unknown;\r\n}\r\n\r\nconst FILTER_OPERATORS: ReadonlySet<string> = new Set([\r\n '=',\r\n '<>',\r\n '<',\r\n '<=',\r\n '>',\r\n '>=',\r\n 'contains',\r\n 'notcontains',\r\n 'startswith',\r\n 'endswith',\r\n]);\r\n\r\nfunction isCondition(expr: unknown): expr is readonly [string, string, unknown] {\r\n return (\r\n Array.isArray(expr) &&\r\n expr.length === 3 &&\r\n typeof expr[0] === 'string' &&\r\n typeof expr[1] === 'string' &&\r\n FILTER_OPERATORS.has(expr[1])\r\n );\r\n}\r\n\r\n/**\r\n * Flattens the AND-chain a grid builds into simple conditions, for endpoints that take a flat\r\n * parameter list (`status=sent,confirmed&supplierId=123`). An OR of `=` on one field becomes one\r\n * `in` condition. `exact` is `false` when part of the expression could not be flattened (a `!`, or\r\n * an OR across fields); those parts are left out of `conditions`, so an adapter that cannot take\r\n * `exact: false` should send the expression as JSON instead.\r\n */\r\nexport function nxeFlattenFilter(filter: NxeFilterExpression | null | undefined): {\r\n conditions: NxeFlatFilterCondition[];\r\n exact: boolean;\r\n} {\r\n const conditions: NxeFlatFilterCondition[] = [];\r\n let exact = true;\r\n const walk = (expr: unknown): void => {\r\n if (isCondition(expr)) {\r\n conditions.push({ field: expr[0], operator: expr[1] as NxeFilterOperator, value: expr[2] });\r\n return;\r\n }\r\n if (Array.isArray(expr) && expr.length >= 3 && expr.length % 2 === 1) {\r\n const connectors = new Set(expr.filter((_, i) => i % 2 === 1));\r\n if (connectors.size === 1 && connectors.has('and')) {\r\n for (let i = 0; i < expr.length; i += 2) {\r\n walk(expr[i]);\r\n }\r\n return;\r\n }\r\n if (connectors.size === 1 && connectors.has('or')) {\r\n const parts = expr.filter((_, i) => i % 2 === 0);\r\n if (parts.every((p) => isCondition(p) && p[1] === '=' && p[0] === (parts[0] as any)[0])) {\r\n conditions.push({\r\n field: (parts[0] as any)[0],\r\n operator: 'in',\r\n value: parts.map((p) => (p as any)[2]),\r\n });\r\n return;\r\n }\r\n }\r\n }\r\n exact = false;\r\n };\r\n if (filter && filter.length) {\r\n walk(filter);\r\n }\r\n return { conditions, exact };\r\n}\r\n\r\nfunction nxeFilterJoin(\r\n connector: 'and' | 'or',\r\n parts: readonly (NxeFilterExpression | null | undefined)[],\r\n): NxeFilterExpression | null {\r\n const present = parts.filter((p): p is NxeFilterExpression => !!p && p.length > 0);\r\n if (present.length === 0) {\r\n return null;\r\n }\r\n if (present.length === 1) {\r\n return present[0];\r\n }\r\n return present.flatMap((p, i) => (i === 0 ? [p] : [connector, p]));\r\n}\r\n\r\n/** Combines expressions with AND; `null` and empty ones are dropped, a single one is returned as is. */\r\nexport function nxeFilterAnd(...parts: readonly (NxeFilterExpression | null | undefined)[]): NxeFilterExpression | null {\r\n return nxeFilterJoin('and', parts);\r\n}\r\n\r\n/** Combines expressions with OR, as {@link nxeFilterAnd} does with AND. */\r\nexport function nxeFilterOr(...parts: readonly (NxeFilterExpression | null | undefined)[]): NxeFilterExpression | null {\r\n return nxeFilterJoin('or', parts);\r\n}\r\n\r\n/**\r\n * A server-backed list for `nxe-data-grid` and `nxe-paginator`. It holds one page at a time:\r\n * the grid (or the app) states a query, the source asks the server for exactly that page, and the\r\n * result lands in signals.\r\n *\r\n * ```ts\r\n * readonly orders = new NxeRemoteDataSource<Order>(\r\n * (o, { signal }) => this.http.get<OrderList>('/api/orders', { params: toParams(o) }).pipe(map(toResult)),\r\n * { key: 'id' },\r\n * );\r\n * ```\r\n *\r\n * A request still in flight is aborted (its `AbortSignal` fires, or its observable is\r\n * unsubscribed) when a newer one starts, and a late response that slips past is ignored, so the\r\n * rows on screen always belong to the latest query.\r\n *\r\n * The source is lazy: nothing loads until {@link setOptions} or {@link reload} is called, which a\r\n * grid bound to it does on its own.\r\n */\r\nexport class NxeRemoteDataSource<T = any> {\r\n /** The row key field, when the source was given one. */\r\n readonly key: string | undefined;\r\n /** Milliseconds a grid waits after the last filter-row keystroke before asking. */\r\n readonly filterDebounce: number;\r\n\r\n private readonly itemsState = signal<readonly T[]>([]);\r\n private readonly totalCountState = signal(0);\r\n private readonly loadingState = signal(false);\r\n private readonly errorState = signal<unknown>(null);\r\n private readonly loadedState = signal(false);\r\n private readonly queryState: WritableSignal<NxeRemoteQuery>;\r\n private readonly optionsState: WritableSignal<NxeLoadOptions>;\r\n\r\n /** The rows of the current page. Kept (not cleared) while the next page loads. */\r\n readonly items: Signal<readonly T[]> = this.itemsState.asReadonly();\r\n /** Rows matching the filter across every page, as the last successful response said. */\r\n readonly totalCount: Signal<number> = this.totalCountState.asReadonly();\r\n /** A request is in flight. */\r\n readonly loading: Signal<boolean> = this.loadingState.asReadonly();\r\n /** The last request's failure, or `null` after a success or while a retry runs. */\r\n readonly error: Signal<unknown> = this.errorState.asReadonly();\r\n /** A response has arrived at least once. */\r\n readonly loaded: Signal<boolean> = this.loadedState.asReadonly();\r\n /** The query and the `skip`/`take` of the page the next (or current) request uses. */\r\n readonly options: Signal<NxeLoadOptions>;\r\n\r\n private started = false;\r\n private seq = 0;\r\n private controller: AbortController | null = null;\r\n private unsubscribe: (() => void) | null = null;\r\n\r\n constructor(\r\n private readonly loadFn: NxeRemoteLoadFn<T>,\r\n config: NxeRemoteDataSourceConfig = {},\r\n ) {\r\n this.key = config.key;\r\n this.filterDebounce = config.filterDebounce ?? 300;\r\n const initial: NxeRemoteQuery = {\r\n pageIndex: config.initial?.pageIndex ?? 0,\r\n pageSize: config.initial?.pageSize ?? NXE_REMOTE_DEFAULT_PAGE_SIZE,\r\n sort: config.initial?.sort ?? [],\r\n filter: config.initial?.filter ?? null,\r\n };\r\n this.queryState = signal(initial);\r\n this.optionsState = signal(nxeLoadOptions(initial));\r\n this.options = this.optionsState.asReadonly();\r\n }\r\n\r\n /**\r\n * States a new query (any of its parts) and loads it. Nothing happens when it is the query\r\n * already stated, so a caller can re-state its inputs freely. The first call starts the source.\r\n */\r\n setOptions(patch: Partial<NxeRemoteQuery>): void {\r\n const current = this.queryState();\r\n const next: NxeRemoteQuery = {\r\n pageIndex: patch.pageIndex ?? current.pageIndex,\r\n pageSize: patch.pageSize ?? current.pageSize,\r\n sort: patch.sort ?? current.sort,\r\n filter: patch.filter === undefined ? current.filter : patch.filter,\r\n };\r\n if (this.started && nxeSameQuery(current, next)) {\r\n return;\r\n }\r\n this.queryState.set(next);\r\n this.optionsState.set(nxeLoadOptions(next));\r\n this.run();\r\n }\r\n\r\n /** Loads the current query again (after an edit, or as a retry). */\r\n reload(): void {\r\n this.run();\r\n }\r\n\r\n /** Aborts the request in flight and ignores its response. */\r\n cancel(): void {\r\n this.seq++;\r\n this.abort();\r\n this.loadingState.set(false);\r\n }\r\n\r\n private abort(): void {\r\n this.controller?.abort();\r\n this.controller = null;\r\n this.unsubscribe?.();\r\n this.unsubscribe = null;\r\n }\r\n\r\n private run(): void {\r\n this.started = true;\r\n this.abort();\r\n const seq = ++this.seq;\r\n const controller = new AbortController();\r\n this.controller = controller;\r\n this.loadingState.set(true);\r\n this.errorState.set(null);\r\n const options = nxeLoadOptions(this.queryState());\r\n let pending: Promise<NxeLoadResult<T> | readonly T[]>;\r\n try {\r\n const result = this.loadFn(options, { signal: controller.signal });\r\n pending = isObservable(result) ? this.fromObservable(result, controller.signal) : Promise.resolve(result);\r\n } catch (error) {\r\n pending = Promise.reject(error);\r\n }\r\n pending.then(\r\n (result) => {\r\n if (seq !== this.seq) {\r\n return; // superseded: a newer query owns the signals now\r\n }\r\n const page: NxeLoadResult<T> = Array.isArray(result)\r\n ? { data: result as readonly T[], totalCount: result.length }\r\n : (result as NxeLoadResult<T>);\r\n const data = page.data ?? [];\r\n this.itemsState.set(data);\r\n this.totalCountState.set(Number.isFinite(page.totalCount) ? page.totalCount : data.length);\r\n this.loadedState.set(true);\r\n this.loadingState.set(false);\r\n },\r\n (error: unknown) => {\r\n if (seq !== this.seq) {\r\n return;\r\n }\r\n this.itemsState.set([]);\r\n this.errorState.set(error ?? new Error('Load failed'));\r\n this.loadingState.set(false);\r\n },\r\n );\r\n }\r\n\r\n /** The last value an observable emits; rejects when it errors or completes empty. */\r\n private fromObservable<R>(source: Observable<R>, abortSignal: AbortSignal): Promise<R> {\r\n return new Promise<R>((resolve, reject) => {\r\n let last: { value: R } | null = null;\r\n const subscription = source.subscribe({\r\n next: (value) => (last = { value }),\r\n error: reject,\r\n complete: () => (last ? resolve(last.value) : reject(new Error('Load completed without a value'))),\r\n });\r\n this.unsubscribe = () => subscription.unsubscribe();\r\n abortSignal.addEventListener('abort', () => subscription.unsubscribe(), { once: true });\r\n });\r\n }\r\n}\r\n\r\n/** A DevExtreme `CustomStore`-shaped source: what `remoteOperations` makes the grid load page by page. */\r\nexport interface NxeStoreLike<T = any> {\r\n load: NxeRemoteLoadFn<T>;\r\n key?: string;\r\n}\r\n\r\n/** True for an object with a `load` function that is not an array or a {@link NxeRemoteDataSource}. */\r\nexport function nxeIsStoreLike(value: unknown): value is NxeStoreLike {\r\n return (\r\n !!value &&\r\n typeof value === 'object' &&\r\n !Array.isArray(value) &&\r\n !(value instanceof NxeRemoteDataSource) &&\r\n typeof (value as { load?: unknown }).load === 'function'\r\n );\r\n}\r\n","/**\r\n * The pager's page list and info text, as DevExtreme 24.2.3's pagination builds them.\r\n *\r\n * Pure functions, so the grid holds the only state (the sliding window, carried between renders\r\n * by a linkedSignal) and the rules can be specced without rendering a grid.\r\n */\r\nimport { formatNumber, parseNumberFormat, type NxeNumberSeparators } from '@nexterajs/ui/intl';\r\n\r\n/** dx `maxPagesCount` (grid_core/pager/m_pager.js): up to this many pages are all listed. */\r\nexport const NXE_PAGER_MAX_PAGES = 10;\r\n/** dx `PAGES_LIMITER` (pagination/pages/large.js): the pages kept around the current one. */\r\nconst WINDOW = 4;\r\n\r\n/** dx's `dxPagination-infoText` message. */\r\nexport const NXE_PAGER_INFO_TEXT = 'Page {0} of {1} ({2} items)';\r\n\r\n/** One entry of the page list: a page button, or dx's `. . .` separator. */\r\nexport interface NxePagerItem {\r\n /** Stable track key: the page index, or `low` / `high` for the separators. */\r\n readonly key: string;\r\n /** 0-based page index; -1 for a separator. */\r\n readonly page: number;\r\n readonly separator: boolean;\r\n}\r\n\r\n/** The page list plus the sliding-window state dx keeps between renders. */\r\nexport interface NxePagerWindow {\r\n /** The four consecutive pages dx shows between the first and the last (empty until a slide). */\r\n readonly window: readonly number[];\r\n /** The pages of `window` a click can land on without the window moving. */\r\n readonly reuse: readonly number[];\r\n readonly items: readonly NxePagerItem[];\r\n}\r\n\r\nconst pageItem = (page: number): NxePagerItem => ({ key: String(page), page, separator: false });\r\nconst separatorItem = (key: 'low' | 'high'): NxePagerItem => ({ key, page: -1, separator: true });\r\n\r\n/**\r\n * The page list for `pageIndex` of `pageCount`, given the previous render's window.\r\n *\r\n * dx `PagesLarge` (pagination/pages/large.js). Ten pages or fewer are all listed. Beyond that the\r\n * list is the first page, a window of four, the last page, and a `. . .` separator wherever pages\r\n * are skipped. The window stays put while the new page is one of its inner pages (so clicking\r\n * through it does not scroll the numbers under the pointer), and otherwise moves so the page\r\n * lands one in from its edge.\r\n */\r\nexport function nxePagerWindow(pageCount: number, pageIndex: number, prev?: NxePagerWindow): NxePagerWindow {\r\n const slide = prev?.window ?? [];\r\n const reuse = prev?.reuse ?? [];\r\n if (pageCount <= NXE_PAGER_MAX_PAGES) {\r\n // dx leaves its window state untouched here, so it resumes if the count grows again.\r\n return { window: slide, reuse, items: Array.from({ length: pageCount }, (_, i) => pageItem(i)) };\r\n }\r\n const last = pageCount - 1;\r\n const reusable = reuse.length > 0 && reuse[reuse.length - 1] < last && reuse.includes(pageIndex);\r\n let next = slide;\r\n let nextReuse = reuse;\r\n if (!reusable) {\r\n let start: number;\r\n if (pageIndex === slide[0]) {\r\n start = pageIndex - 1;\r\n } else if (pageIndex === slide[slide.length - 1]) {\r\n start = pageIndex + 2 - WINDOW;\r\n } else if (pageIndex < WINDOW) {\r\n start = 1;\r\n } else if (pageIndex >= pageCount - WINDOW) {\r\n start = pageCount - WINDOW - 1;\r\n } else {\r\n start = pageIndex - 1;\r\n }\r\n // Only a window left over from a different page count can land outside 1..last-4; dx\r\n // would list pages that do not exist, so keep it inside the list.\r\n start = Math.min(Math.max(start, 1), pageCount - WINDOW - 1);\r\n next = Array.from({ length: WINDOW }, (_, i) => start + i);\r\n }\r\n const start = next[0];\r\n const kind = start === 1 ? 'high' : start + WINDOW === last ? 'low' : 'both';\r\n if (!reusable) {\r\n nextReuse = kind === 'both' ? next.slice(1, -1) : kind === 'high' ? next.slice(0, -1) : next.slice(1);\r\n }\r\n const items: NxePagerItem[] = [pageItem(0)];\r\n if (kind !== 'high') {\r\n items.push(separatorItem('low'));\r\n }\r\n items.push(...next.map(pageItem));\r\n if (kind !== 'low') {\r\n items.push(separatorItem('high'));\r\n }\r\n items.push(pageItem(last));\r\n return { window: next, reuse: nextReuse, items };\r\n}\r\n\r\n/**\r\n * dx's info text: `{0}` is the 1-based page, `{1}` the page count and `{2}` the item count\r\n * (pagination/info.js, formatted by core/utils/string `format`).\r\n */\r\nexport function nxePagerInfoText(\r\n template: string,\r\n pageIndex: number,\r\n pageCount: number | string,\r\n itemCount: number | string,\r\n): string {\r\n const values = [String(pageIndex + 1), String(pageCount), String(itemCount)];\r\n return template.replace(/\\{(\\d+)\\}/g, (match, i: string) => values[Number(i)] ?? match);\r\n}\r\n\r\n/**\r\n * dx `getPageSizes` (grid_core/pager/m_pager.js): an explicit list as given; `'auto'` offers half,\r\n * the same and double the configured page size, and nothing when that size is 1 or less.\r\n */\r\nexport function nxePagerPageSizes(allowed: readonly number[] | 'auto' | undefined, pageSize: number): number[] {\r\n if (Array.isArray(allowed)) {\r\n return [...allowed];\r\n }\r\n return allowed === 'auto' && pageSize > 1 ? [Math.floor(pageSize / 2), pageSize, 2 * pageSize] : [];\r\n}\r\n\r\n/** A page or item count with the locale's group separator (`100,000`, or `100.000` under `id`). */\r\nexport function nxePagerCount(value: number, separators: NxeNumberSeparators): string {\r\n return formatNumber(value, parseNumberFormat('#,##0'), separators);\r\n}\r\n","import {\r\n afterNextRender,\r\n booleanAttribute,\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n ElementRef,\r\n inject,\r\n Injector,\r\n input,\r\n linkedSignal,\r\n model,\r\n numberAttribute,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { NxeMessageService, type NxeMessageKey } from '@nexterajs/ui/core';\r\nimport { NXE_NUMBER_SEPARATORS } from '@nexterajs/ui/intl';\r\nimport { nxePagerCount, nxePagerWindow, type NxePagerWindow } from './nxe-pager.util';\r\n\r\n/**\r\n * A page navigator that stands on its own: page buttons with the grid pager's sliding window,\r\n * previous/next, a page-size selector and the total. Use it beside any list, or bind it to the same\r\n * state a remote grid pages with.\r\n *\r\n * ```html\r\n * <nxe-paginator [(pageIndex)]=\"page\" [(pageSize)]=\"size\" [totalCount]=\"orders.totalCount()\" />\r\n * ```\r\n *\r\n * Text comes from `NxeMessageService`, so it follows the language. The nav is a labelled\r\n * `navigation` landmark; the current page carries `aria-current=\"page\"`. With focus on a page\r\n * button, Left/Right move to the previous/next page and Home/End to the first/last.\r\n */\r\n@Component({\r\n selector: 'nxe-paginator',\r\n templateUrl: './nxe-paginator.component.html',\r\n styleUrl: './nxe-paginator.component.scss',\r\n host: { class: 'nxe-paginator', '(keydown)': 'onKeydown($event)' },\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class NxePaginatorComponent {\r\n private readonly messages = inject(NxeMessageService);\r\n private readonly separators = inject(NXE_NUMBER_SEPARATORS);\r\n private readonly host = inject<ElementRef<HTMLElement>>(ElementRef);\r\n private readonly injector = inject(Injector);\r\n\r\n /** The 0-based current page. Two-way. */\r\n readonly pageIndex = model(0);\r\n /** Rows per page. Two-way; changing it returns to the first page. */\r\n readonly pageSize = model(20);\r\n /** Rows across every page. */\r\n readonly totalCount = input(0, { transform: numberAttribute });\r\n /** The sizes the selector offers. The current size is always offered too. */\r\n readonly pageSizes = input<readonly number[]>([10, 20, 50, 100]);\r\n readonly showPageSizeSelector = input(true, { transform: booleanAttribute });\r\n readonly showInfo = input(true, { transform: booleanAttribute });\r\n /** Greys the controls out and ignores clicks, e.g. while a page loads. */\r\n readonly disabled = input(false, { transform: booleanAttribute });\r\n /** The navigation landmark's accessible name; default is the `grid.pager.navigation` message. */\r\n readonly label = input<string | undefined>(undefined);\r\n\r\n protected t(key: NxeMessageKey, ...args: readonly unknown[]): string {\r\n return this.messages.t(key, ...args);\r\n }\r\n\r\n protected readonly pageCount = computed(() =>\r\n Math.max(1, Math.ceil(Math.max(0, this.totalCount()) / Math.max(1, this.pageSize()))),\r\n );\r\n /** The page shown: `pageIndex` held inside the page count. */\r\n protected readonly currentPage = computed(() => Math.max(0, Math.min(this.pageIndex(), this.pageCount() - 1)));\r\n\r\n private readonly window = linkedSignal<{ count: number; index: number }, NxePagerWindow>({\r\n source: () => ({ count: this.pageCount(), index: this.currentPage() }),\r\n computation: (src, prev) => nxePagerWindow(src.count, src.index, prev?.value),\r\n });\r\n protected readonly items = computed(() => this.window().items);\r\n\r\n protected readonly sizes = computed(() => {\r\n const sizes = new Set(this.pageSizes());\r\n sizes.add(this.pageSize());\r\n return [...sizes].sort((a, b) => a - b);\r\n });\r\n\r\n protected readonly info = computed(() =>\r\n this.t(\r\n 'grid.pager.info',\r\n nxePagerCount(this.currentPage() + 1, this.separators),\r\n nxePagerCount(this.pageCount(), this.separators),\r\n nxePagerCount(this.totalCount(), this.separators),\r\n ),\r\n );\r\n\r\n protected readonly total = computed(() =>\r\n this.t('grid.pager.total', nxePagerCount(this.totalCount(), this.separators)),\r\n );\r\n\r\n protected go(index: number): void {\r\n if (this.disabled()) {\r\n return;\r\n }\r\n const next = Math.max(0, Math.min(index, this.pageCount() - 1));\r\n if (next !== this.pageIndex()) {\r\n this.pageIndex.set(next);\r\n }\r\n }\r\n\r\n protected onSizeChange(event: Event): void {\r\n const size = Number((event.target as HTMLSelectElement).value);\r\n if (size > 0 && size !== this.pageSize()) {\r\n this.pageSize.set(size);\r\n this.pageIndex.set(0);\r\n }\r\n }\r\n\r\n protected onKeydown(event: KeyboardEvent): void {\r\n if (!(event.target as HTMLElement).classList.contains('nxe-paginator-page')) {\r\n return;\r\n }\r\n const last = this.pageCount() - 1;\r\n const current = this.currentPage();\r\n const target =\r\n event.key === 'ArrowLeft'\r\n ? current - 1\r\n : event.key === 'ArrowRight'\r\n ? current + 1\r\n : event.key === 'Home'\r\n ? 0\r\n : event.key === 'End'\r\n ? last\r\n : null;\r\n if (target === null) {\r\n return;\r\n }\r\n event.preventDefault();\r\n this.go(target);\r\n // The page buttons are re-rendered by key, so the old one keeps focus; move it to the new page.\r\n afterNextRender(\r\n () =>\r\n this.host.nativeElement\r\n .querySelector<HTMLElement>('.nxe-paginator-page[aria-current=\"page\"]')\r\n ?.focus(),\r\n { injector: this.injector },\r\n );\r\n }\r\n}\r\n","<nav class=\"nxe-paginator-nav\" [attr.aria-label]=\"label() ?? t('grid.pager.navigation')\" [attr.aria-busy]=\"disabled() ? 'true' : null\">\r\n @if (showPageSizeSelector()) {\r\n <label class=\"nxe-paginator-sizes\">\r\n <span class=\"nxe-paginator-sizes-label\">{{ t('grid.pager.pageSize') }}</span>\r\n <select class=\"nxe-paginator-size\" [disabled]=\"disabled()\" (change)=\"onSizeChange($event)\">\r\n @for (size of sizes(); track size) {\r\n <option [value]=\"size\" [selected]=\"size === pageSize()\">{{ size }}</option>\r\n }\r\n </select>\r\n </label>\r\n }\r\n <span class=\"nxe-paginator-spacer\"></span>\r\n <span class=\"nxe-paginator-info\" role=\"status\">{{ showInfo() ? info() : total() }}</span>\r\n <div class=\"nxe-paginator-pages\">\r\n <button\r\n type=\"button\"\r\n class=\"nxe-paginator-nav-button nxe-paginator-prev\"\r\n [attr.aria-label]=\"t('grid.pager.previous')\"\r\n [attr.aria-disabled]=\"disabled() || currentPage() === 0 ? 'true' : null\"\r\n (click)=\"go(currentPage() - 1)\"></button>\r\n @for (item of items(); track item.key) {\r\n @if (item.separator) {\r\n <span class=\"nxe-paginator-separator\" aria-hidden=\"true\">. . .</span>\r\n } @else {\r\n <button\r\n type=\"button\"\r\n class=\"nxe-paginator-page\"\r\n [class.nxe-paginator-current]=\"item.page === currentPage()\"\r\n [attr.aria-label]=\"t('grid.pager.page', item.page + 1)\"\r\n [attr.aria-current]=\"item.page === currentPage() ? 'page' : null\"\r\n [attr.aria-disabled]=\"disabled() ? 'true' : null\"\r\n (click)=\"go(item.page)\">{{ item.page + 1 }}</button>\r\n }\r\n }\r\n <button\r\n type=\"button\"\r\n class=\"nxe-paginator-nav-button nxe-paginator-next\"\r\n [attr.aria-label]=\"t('grid.pager.next')\"\r\n [attr.aria-disabled]=\"disabled() || currentPage() >= pageCount() - 1 ? 'true' : null\"\r\n (click)=\"go(currentPage() + 1)\"></button>\r\n </div>\r\n</nav>\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\nimport { NgZone } from '@angular/core';\r\nimport { NxeGestureClickSuppression } from './nxe-grid-drag';\r\nimport { nxeHeaderLeafCells } from './nxe-grid-dom';\r\n\r\n/**\r\n * Pointer-based column-resize engine (dx `allowColumnResizing` parity).\r\n *\r\n * `widget` mode resizes only the dragged column — the table width follows; `nextColumn` (dx\r\n * default) trades width with the next visible column at constant table width; both clamp at\r\n * `columnMinWidth`. During the drag we write `<col>`/table widths directly (no change detection\r\n * per pointermove); the grid commits the final widths into its override signal on release —\r\n * freezing the layout exactly like dx does after the first manual resize.\r\n */\r\n\r\nexport interface NxeGridResizeHooks {\r\n zone: NgZone;\r\n host: () => HTMLElement;\r\n mode: () => 'nextColumn' | 'widget';\r\n /** Widget mode only: the trailing column takes what a narrowed table leaves of the rows view. */\r\n fillsGrid: () => boolean;\r\n minWidth: () => number;\r\n /** Drag started — the grid pauses its auto-width engine. */\r\n onStart: () => void;\r\n /** Escape/pointercancel — inline styles were restored, resume auto-width. */\r\n onCancel: () => void;\r\n /** Final widths per affected column; the grid freezes overrides and emits width events. */\r\n onCommit: (changes: { field: string; from: number; to: number }[]) => void;\r\n}\r\n\r\ninterface ActiveResize {\r\n field: string;\r\n nextField: string | null;\r\n /** The pointer that started the gesture — other pointers (second touch) are ignored. */\r\n pointerId: number;\r\n startX: number;\r\n startW: number;\r\n startNextW: number;\r\n colEl: HTMLTableColElement;\r\n nextColEl: HTMLTableColElement | null;\r\n tableEl: HTMLTableElement;\r\n startTableW: number;\r\n prevColStyle: string;\r\n prevNextStyle: string;\r\n prevTableStyle: string;\r\n lastW: number;\r\n lastNextW: number;\r\n /** `fillsGrid`: the trailing column, its width at press and the rows view's width to fill. */\r\n fill: { colEl: HTMLTableColElement; startW: number; prevStyle: string; roomW: number } | null;\r\n}\r\n\r\nexport class NxeGridResizeController {\r\n private active: ActiveResize | null = null;\r\n private readonly suppression = new NxeGestureClickSuppression();\r\n\r\n private readonly onMove = (e: PointerEvent): void => this.pointerMove(e);\r\n private readonly onUp = (e: PointerEvent): void => {\r\n if (this.active && e.pointerId !== this.active.pointerId) {\r\n return;\r\n }\r\n this.pointerUp();\r\n };\r\n private readonly onCancelEv = (e: PointerEvent): void => {\r\n if (this.active && e.pointerId !== this.active.pointerId) {\r\n return;\r\n }\r\n this.cancel();\r\n };\r\n private readonly onKey = (e: KeyboardEvent): void => {\r\n if (e.key === 'Escape') {\r\n this.cancel();\r\n }\r\n };\r\n\r\n constructor(private readonly hooks: NxeGridResizeHooks) {}\r\n\r\n /** `visibleIndex`/`lead` locate the header cell + `<col>`; `nextField` only in nextColumn mode. */\r\n start(\r\n field: string,\r\n nextField: string | null,\r\n visibleIndex: number,\r\n lead: number,\r\n event: PointerEvent,\r\n ): void {\r\n if (event.button !== 0 || this.active) {\r\n return;\r\n }\r\n event.stopPropagation(); // the header td above would otherwise start a group drag\r\n event.preventDefault();\r\n const host = this.hooks.host();\r\n const table = host.querySelector<HTMLTableElement>('.nxe-datagrid-content > .nxe-datagrid-table');\r\n if (!table) {\r\n return;\r\n }\r\n const cols = Array.from(table.querySelectorAll<HTMLTableColElement>(':scope > colgroup > col'));\r\n // The colgroup still counts command columns, so it keeps the lead offset; the header\r\n // cells do not, because they are gathered by column rather than by cell position.\r\n const headerCells = nxeHeaderLeafCells(host);\r\n const colEl = cols[lead + visibleIndex];\r\n const cell = headerCells[visibleIndex];\r\n if (!colEl || !cell) {\r\n return;\r\n }\r\n const nextColEl = nextField != null ? cols[lead + visibleIndex + 1] ?? null : null;\r\n const nextCell = nextField != null ? headerCells[visibleIndex + 1] : null;\r\n const trailingColEl = cols[lead + headerCells.length - 1];\r\n const trailingCell = headerCells[headerCells.length - 1];\r\n const rowsView = table.closest<HTMLElement>('.nxe-datagrid-rowsview');\r\n const fill =\r\n this.hooks.mode() === 'widget' && this.hooks.fillsGrid() && trailingColEl && trailingCell && rowsView\r\n ? {\r\n colEl: trailingColEl,\r\n startW: trailingCell.getBoundingClientRect().width,\r\n prevStyle: trailingColEl.style.width,\r\n roomW: rowsView.clientWidth,\r\n }\r\n : null;\r\n this.active = {\r\n field,\r\n nextField,\r\n pointerId: event.pointerId,\r\n startX: event.clientX,\r\n startW: cell.getBoundingClientRect().width,\r\n startNextW: nextCell ? nextCell.getBoundingClientRect().width : 0,\r\n colEl,\r\n nextColEl,\r\n tableEl: table,\r\n startTableW: table.getBoundingClientRect().width,\r\n prevColStyle: colEl.style.width,\r\n prevNextStyle: nextColEl?.style.width ?? '',\r\n prevTableStyle: table.style.width,\r\n lastW: cell.getBoundingClientRect().width,\r\n lastNextW: nextCell ? nextCell.getBoundingClientRect().width : 0,\r\n fill,\r\n };\r\n this.hooks.onStart();\r\n document.body.classList.add('nxe-grid-resizing');\r\n this.hooks.zone.runOutsideAngular(() => {\r\n document.addEventListener('pointermove', this.onMove);\r\n document.addEventListener('pointerup', this.onUp);\r\n document.addEventListener('pointercancel', this.onCancelEv);\r\n document.addEventListener('keydown', this.onKey);\r\n });\r\n }\r\n\r\n consumeClick(): boolean {\r\n return this.suppression.consume();\r\n }\r\n\r\n destroy(): void {\r\n if (this.active) {\r\n this.cancel();\r\n }\r\n }\r\n\r\n private pointerMove(e: PointerEvent): void {\r\n const a = this.active;\r\n if (!a || e.pointerId !== a.pointerId) {\r\n return;\r\n }\r\n const min = this.hooks.minWidth();\r\n const delta = e.clientX - a.startX;\r\n if (this.hooks.mode() === 'widget' || !a.nextColEl) {\r\n let w = Math.max(min, a.startW + delta);\r\n let tableW = a.startTableW + (w - a.startW);\r\n // fillsGrid: hand what the table comes out short of the rows view to the trailing\r\n // column now, as the commit will, so the release lands where the drag already is.\r\n if (a.fill) {\r\n const slack = Math.max(0, a.fill.roomW - tableW);\r\n if (a.fill.colEl === a.colEl) {\r\n w += slack;\r\n } else {\r\n a.fill.colEl.style.width = `${a.fill.startW + slack}px`;\r\n }\r\n tableW += slack;\r\n }\r\n a.colEl.style.width = `${w}px`;\r\n a.tableEl.style.width = `${tableW}px`;\r\n a.lastW = w;\r\n return;\r\n }\r\n // nextColumn: trade with the neighbor, both clamped, table width constant.\r\n let w = Math.max(min, a.startW + delta);\r\n let next = a.startNextW - (w - a.startW);\r\n if (next < min) {\r\n next = min;\r\n w = a.startW + a.startNextW - min;\r\n }\r\n a.colEl.style.width = `${w}px`;\r\n a.nextColEl.style.width = `${next}px`;\r\n a.lastW = w;\r\n a.lastNextW = next;\r\n }\r\n\r\n private pointerUp(): void {\r\n const a = this.active;\r\n this.teardown();\r\n if (!a) {\r\n return;\r\n }\r\n this.suppression.arm();\r\n // A zero-movement release is a plain click on the handle — no freeze, no no-op event.\r\n if (a.lastW === a.startW && a.lastNextW === a.startNextW) {\r\n this.hooks.zone.run(() => this.hooks.onCancel());\r\n return;\r\n }\r\n const changes: { field: string; from: number; to: number }[] = [\r\n { field: a.field, from: a.startW, to: a.lastW },\r\n ];\r\n if (a.nextField && a.lastNextW !== a.startNextW) {\r\n changes.push({ field: a.nextField, from: a.startNextW, to: a.lastNextW });\r\n }\r\n this.hooks.zone.run(() => {\r\n // The commit measures the cells as the drag left them, so it goes first.\r\n this.hooks.onCommit(changes);\r\n // Then the DOM goes back to what the [style.width] bindings last wrote. Angular only\r\n // rewrites a binding whose value changed, and a second resize often commits the same\r\n // value (the trailing column's width, a table at 100%): the drag's leftovers would stay\r\n // on screen. Restored, the next render lands the committed layout either way.\r\n this.restore(a);\r\n });\r\n }\r\n\r\n private restore(a: ActiveResize): void {\r\n a.colEl.style.width = a.prevColStyle;\r\n if (a.nextColEl) {\r\n a.nextColEl.style.width = a.prevNextStyle;\r\n }\r\n if (a.fill && a.fill.colEl !== a.colEl) {\r\n a.fill.colEl.style.width = a.fill.prevStyle;\r\n }\r\n a.tableEl.style.width = a.prevTableStyle;\r\n }\r\n\r\n private cancel(): void {\r\n const a = this.active;\r\n this.teardown();\r\n if (!a) {\r\n return;\r\n }\r\n this.suppression.arm();\r\n this.restore(a);\r\n this.hooks.zone.run(() => this.hooks.onCancel());\r\n }\r\n\r\n private teardown(): void {\r\n this.active = null;\r\n document.body.classList.remove('nxe-grid-resizing');\r\n document.removeEventListener('pointermove', this.onMove);\r\n document.removeEventListener('pointerup', this.onUp);\r\n document.removeEventListener('pointercancel', this.onCancelEv);\r\n document.removeEventListener('keydown', this.onKey);\r\n }\r\n}\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { Overlay, OverlayRef } from '@angular/cdk/overlay';\nimport { TemplatePortal } from '@angular/cdk/portal';\nimport { NgTemplateOutlet } from '@angular/common';\nimport {\n afterNextRender,\n afterRenderEffect,\n ChangeDetectionStrategy,\n Component,\n computed,\n contentChild,\n contentChildren,\n DestroyRef,\n ElementRef,\n EventEmitter,\n inject,\n input,\n InputSignal,\n linkedSignal,\n model,\n NgZone,\n OnDestroy,\n output,\n Output,\n signal,\n TemplateRef,\n untracked,\n viewChild,\n ViewContainerRef,\n ViewEncapsulation,\n} from '@angular/core';\nimport { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';\nimport { debounce, of, timer } from 'rxjs';\nimport {\n NXE_DEFAULT_OPTIONS,\n NxeMessageService,\n type NxeMessageKey,\n nxeResolveExpr,\n nxeResolveText,\n NxeTemplateDirective,\n} from '@nexterajs/ui/core';\nimport { DateTime, Info } from 'luxon';\nimport { nxeHeaderLeafCells } from './nxe-grid-dom';\nimport { parseDateValue } from '@nexterajs/ui/intl';\nimport { formatNumber, NXE_NUMBER_SEPARATORS, parseNumberFormat } from '@nexterajs/ui/intl';\nimport { NxeColumnComponent } from './nxe-column.component';\nimport { NxeEditingComponent } from './nxe-editing.component';\nimport { nxeDefaultFormat, nxeValueDataType } from './nxe-format.util';\nimport { NxeGridDragController } from './nxe-grid-drag';\nimport { NxeGridResizeController } from './nxe-grid-resize';\nimport { NxeFilterRowComponent } from './nxe-filter-row.component';\nimport { NxeMasterDetailComponent } from './nxe-master-detail.component';\nimport { NxeGroupPanelComponent, NxeGroupingComponent } from './nxe-grouping.component';\nimport { NxeHeaderFilterComponent } from './nxe-header-filter.component';\nimport { openNxeHeaderFilterOverlay } from './nxe-header-filter-overlay';\nimport { NXE_HF_BLANKS, NxeHeaderFilterModel, nxeHfKey } from './nxe-header-filter.model';\nimport { NxePagerComponent, NxePagingComponent } from './nxe-paging.component';\nimport { nxePagerCount, nxePagerInfoText, nxePagerPageSizes, NxePagerWindow, nxePagerWindow } from './nxe-pager.util';\nimport {\n NXE_REMOTE_DEFAULT_PAGE_SIZE,\n nxeFilterAnd,\n nxeFilterOr,\n nxeIsStoreLike,\n type NxeFilterExpression,\n type NxeLoadOptions,\n NxeRemoteDataSource,\n type NxeRemoteQuery,\n nxeSameQuery,\n type NxeSortDescriptor,\n type NxeStoreLike,\n} from './nxe-remote-data-source';\nimport { NxeSelectionComponent } from './nxe-selection.component';\nimport { nxePane } from '@nexterajs/ui/styling';\nimport { NxeSummaryComponent, NxeSummaryItemLike } from './nxe-summary.component';\nimport {\n NxeCellInfo,\n NxeCellPreparedEvent,\n NxeColumnDataType,\n NxeEditCellInfo,\n NxeGroupCellInfo,\n NxeRowInfo,\n NxeRowPreparedEvent,\n NxeRowType,\n NxeGridInstance,\n NxeGridOptionChangedEvent,\n NxeGridSelectionChangedEvent,\n} from './nxe-grid.types';\n\n/** The day after a `yyyy-MM-dd` day key. */\nfunction nxeNextDay(day: string): string {\n return DateTime.fromISO(day).plus({ days: 1 }).toFormat('yyyy-MM-dd');\n}\n\ninterface SortState {\n field: string;\n dir: 'asc' | 'desc';\n}\n\n/**\n * A column's effective type: declared, or inferred from its values. dx's inference can also land\n * on 'object' (m_columns_controller_utils.js getValueDataType), which aligns and formats as text.\n */\ntype NxeColType = NxeColumnDataType | 'object';\n\n/** dx filter-row operations (`selectedFilterOperation`). */\nexport type NxeFilterOp =\n | 'contains'\n | 'notcontains'\n | 'startswith'\n | 'endswith'\n | '='\n | '<>'\n | '<'\n | '<='\n | '>'\n | '>='\n | 'between';\n\n/** One column's filter-row state: chosen operation + the typed editor text(s). */\ninterface FilterRowEntry {\n op: NxeFilterOp;\n text: string;\n /** Second editor of a `between` range. */\n text2?: string;\n /**\n * The user picked `op` from the operation menu. Until then `op` is only the column default and\n * the chooser shows dx's magnifier: dx leaves `selectedFilterOperation` unset and draws\n * `dx-icon-filter-operation-default` (m_filter_row.js), whatever operation the filter applies.\n */\n chosen?: boolean;\n}\n\ninterface TreeNode {\n key: any;\n data: any;\n children: TreeNode[];\n level: number;\n hasChildren: boolean;\n}\n\n/**\n * Recursive tree selection state per node key: `all` when the node's key or an ancestor's is in\n * `keys`, or when every child is `all`; `some` when only part of its subtree is; absent otherwise.\n */\nfunction nxeTreeCheckState(roots: readonly TreeNode[], keys: ReadonlySet<any>): Map<any, 'all' | 'some'> {\n const out = new Map<any, 'all' | 'some'>();\n const walk = (node: TreeNode, forced: boolean): 'all' | 'some' | 'none' => {\n const self = forced || keys.has(node.key);\n let state: 'all' | 'some' | 'none' = self ? 'all' : 'none';\n if (node.children.length) {\n let every = true;\n let any = false;\n for (const child of node.children) {\n const s = walk(child, self);\n every &&= s === 'all';\n any ||= s !== 'none';\n }\n state = every ? 'all' : any ? 'some' : 'none';\n }\n if (state !== 'none') {\n out.set(node.key, state);\n }\n return state;\n };\n roots.forEach((r) => walk(r, false));\n return out;\n}\n\n/** Flattened render rows when grouping or tree hierarchy is active. */\ntype GridRenderRow =\n | {\n kind: 'data';\n row: any;\n rowIndex: number;\n // tree-list only:\n level?: number;\n hasChildren?: boolean;\n expanded?: boolean;\n nodeKey?: any;\n }\n | {\n kind: 'group';\n level: number;\n column: NxeColumnComponent;\n text: string;\n /** Raw group key, before formatting — dx hands this to `groupCellTemplate` as `value`. */\n value: any;\n /** The rows in this group, dx's `data` for a group cell. */\n rows: readonly any[];\n groupKey: string;\n collapsed: boolean;\n /** `alignByColumn` group sums keyed by target dataField (`showInColumn ?? column`). */\n alignedSums: Map<string, string>;\n /** Non-aligned group items appended to the caption — dx `Caption: Key (a, b)`. */\n captionSuffix: string;\n }\n | {\n kind: 'groupFooter';\n level: number;\n /** Per-column formatted sums for items with `showInGroupFooter` (orbit addition). */\n sums: Map<string, string>;\n };\n\n/** One `<td>` in the header, which may span columns (a band) or rows (a leaf above the bottom). */\nexport interface NxeHeaderCell {\n column: NxeColumnComponent;\n colspan: number;\n rowspan: number;\n isBand: boolean;\n /** Index into the visible leaf columns; null for a band, which sorts and resizes nothing. */\n leafIndex: number | null;\n}\n\n/** Classify a rendered `<tr>` for dx's `rowType`, or null for rows dx does not report. */\nfunction nxeRowTypeOf(tr: HTMLTableRowElement): NxeRowType | null {\n const c = tr.classList;\n if (c.contains('nxe-header-row')) {\n return 'header';\n }\n if (c.contains('nxe-datagrid-filter-row')) {\n return 'filter';\n }\n if (c.contains('nxe-data-row')) {\n return 'data';\n }\n if (c.contains('nxe-group-footer-row')) {\n return 'groupFooter';\n }\n if (c.contains('nxe-group-row')) {\n return 'group';\n }\n if (tr.parentElement?.classList.contains('nxe-datagrid-total-footer')) {\n return 'totalFooter';\n }\n return null;\n}\n\n/** Depth-first leaves of a declared column tree: a band contributes its children, not itself. */\nfunction flattenLeafColumns(cols: readonly NxeColumnComponent[]): NxeColumnComponent[] {\n const out: NxeColumnComponent[] = [];\n for (const col of cols) {\n if (col.isBand()) {\n out.push(...flattenLeafColumns(col.childColumns()));\n } else {\n out.push(col);\n }\n }\n return out;\n}\n\n/**\n * A row's side of a collapsed border: the widest top or bottom border across the `<tr>` and its\n * cells, as computed (a `none` border computes to 0). Null, or anything but a row, has none.\n */\nfunction nxeRowEdge(row: Element | null | undefined, side: 'top' | 'bottom'): number {\n if (!(row instanceof HTMLTableRowElement)) {\n return 0;\n }\n const prop = `border-${side}-width`;\n let width = parseFloat(getComputedStyle(row).getPropertyValue(prop)) || 0;\n for (const cell of Array.from(row.cells)) {\n width = Math.max(width, parseFloat(getComputedStyle(cell).getPropertyValue(prop)) || 0);\n }\n return width;\n}\n\n\n/**\n * `nxe-data-grid` — drop-in replacement for DevExtreme `dx-data-grid` (read-only core, slice 9a).\n *\n * Renders a single `<table>` under the library's own class namespace (`nxe-widget nxe-datagrid`,\n * `nxe-row`/`nxe-header-row`/`nxe-data-row`/`nxe-datagrid-headers`/`nxe-datagrid-rowsview`, `td`s).\n * The structure still mirrors dx's, name for name, so the visual contract carries over\n * (4px cell padding, #f8fafc header, #525252 header text, row/hover/alt colours) — but the\n * `dx-` prefix is gone; `provideNxeDxCompat()` re-emits it for stylesheets not yet migrated.\n * Columns are\n * collected from `nxe-column` content children; named `cellTemplate`s resolve to sibling\n * `<ng-template nxeTemplate=\"name\">` blocks rendered with `{ data, rowIndex, columnIndex, ... }`\n * (the live row object, so in-cell `nxe-*` editors can write through `key.data.<field>`).\n *\n * The `.instance` facade exposes only what the app calls: `getSelectedRowsData()` (12 template\n * sites), `refresh()` (13), `columnOption(field,'visible',bool)` (3). Selection UI, header-filter,\n * grouping and summary land in slice 9b.\n */\n@Component({\n selector: 'nxe-data-grid, nxe-tree-list',\n standalone: true,\n imports: [NgTemplateOutlet],\n templateUrl: './nxe-data-grid.component.html',\n styleUrl: './nxe-data-grid.component.scss',\n host: { class: 'nxe-widget nxe-data-grid' },\n changeDetection: ChangeDetectionStrategy.OnPush,\n encapsulation: ViewEncapsulation.None,\n})\nexport class NxeDataGridComponent implements OnDestroy {\n private readonly elementRef = inject(ElementRef<HTMLElement>);\n private readonly overlay = inject(Overlay);\n private readonly viewContainerRef = inject(ViewContainerRef);\n private readonly ngZone = inject(NgZone);\n private readonly destroyRef = inject(DestroyRef);\n private readonly defaults = inject(NXE_DEFAULT_OPTIONS);\n /** Locale separators for every number this grid renders — cells, summaries and group text. */\n private readonly separators = inject(NXE_NUMBER_SEPARATORS);\n private readonly messages = inject(NxeMessageService);\n\n /** One library message for the active language; reading it in a template re-renders on a switch. */\n protected t(key: NxeMessageKey, ...args: readonly unknown[]): string {\n return this.messages.t(key, ...args);\n }\n\n /** Pointer drag engine: drag-to-group, chip drag-out (ungroup), chip/column reorder. */\n protected readonly drag = new NxeGridDragController({\n zone: this.ngZone,\n host: () => this.elementRef.nativeElement,\n onGroupDrop: (col) => this.groupByColumn(col),\n onChipRemove: (col) => this.ungroupColumn(col.dataField()),\n onChipMove: (from, to) => this.moveGroup(from, to),\n reorderEnabled: () => this.allowColumnReordering(),\n onColumnMove: (from, slot) => this.moveColumnByVisible(from, slot),\n headerDataCells: () => nxeHeaderLeafCells(this.elementRef.nativeElement as HTMLElement),\n });\n\n /** Pointer resize engine (dx allowColumnResizing). */\n protected readonly resize = new NxeGridResizeController({\n zone: this.ngZone,\n host: () => this.elementRef.nativeElement,\n mode: () => this.columnResizingMode(),\n fillsGrid: () => this.resizeFillsGrid(),\n minWidth: () => this.columnMinWidth() ?? 50,\n onStart: () => (this.resizeActive = true),\n onCancel: () => (this.resizeActive = false),\n onCommit: (changes) => this.commitColumnResize(changes),\n });\n private resizeActive = false;\n\n /**\n * Columns exactly as declared: top-level leaves and bands, bands still holding their children.\n * Only the header model reads this — everything else wants leaves.\n */\n private readonly declaredColumns = contentChildren(NxeColumnComponent, { descendants: false });\n\n /**\n * The data columns: bands flattened away, depth-first, in declaration order.\n *\n * Keeping `columns()` meaning \"the columns that carry data\" is what stops banded headers\n * being a rewrite. Sorting, grouping, filtering, summaries, resize, export and the whole\n * `<tbody>` are about leaves and continue to work untouched; bands exist only in `<thead>`.\n */\n protected readonly columns = computed<readonly NxeColumnComponent[]>(() =>\n flattenLeafColumns(this.declaredColumns()),\n );\n\n /** True when any declared column is a band, i.e. the header needs more than one row. */\n protected readonly hasBands = computed(() => this.declaredColumns().some((c) => c.isBand()));\n private readonly templates = contentChildren(NxeTemplateDirective);\n protected readonly selection = contentChild(NxeSelectionComponent);\n protected readonly headerFilter = contentChild(NxeHeaderFilterComponent);\n protected readonly grouping = contentChild(NxeGroupingComponent);\n protected readonly groupPanel = contentChild(NxeGroupPanelComponent);\n protected readonly summaryCmp = contentChild(NxeSummaryComponent);\n protected readonly pagingCmp = contentChild(NxePagingComponent);\n protected readonly pagerCmp = contentChild(NxePagerComponent);\n protected readonly editingCmp = contentChild(NxeEditingComponent);\n protected readonly filterRowCmp = contentChild(NxeFilterRowComponent);\n protected readonly masterDetail = contentChild(NxeMasterDetailComponent);\n\n // --- Inputs (mirror dx-data-grid; object-literal inputs accepted as-is for drop-in parity) ---\n /**\n * The rows: a plain array (paged, sorted and filtered here), a {@link NxeRemoteDataSource}\n * (paged, sorted and filtered by the server; the grid holds one page), or, with\n * `remoteOperations` on, a `CustomStore`-shaped `{ load, key? }`.\n */\n readonly dataSource = input<readonly any[] | NxeRemoteDataSource<any> | NxeStoreLike | null | undefined>([]);\n readonly keyExpr = input<string | undefined>(undefined);\n // Presentation options resolve as `binding ?? NXE_DEFAULT_OPTIONS ?? literal`. The raw input\n // is aliased so the element keeps its dx name, and the public member stays the resolved\n // value — every read site, template included, goes through the cascade without knowing.\n //\n // The default has to be `undefined`, not `false`: \"unset\" is a distinct state from \"set to\n // false\", and only the former defers to the token. A `booleanAttribute` transform here would\n // fold one into the other and silently disable the middle rung.\n readonly hoverStateEnabledInput = input<boolean | undefined>(undefined, {\n alias: 'hoverStateEnabled',\n });\n readonly showColumnLinesInput = input<boolean | undefined>(undefined, {\n alias: 'showColumnLines',\n });\n readonly showRowLinesInput = input<boolean | undefined>(undefined, { alias: 'showRowLines' });\n readonly showBordersInput = input<boolean | undefined>(undefined, { alias: 'showBorders' });\n readonly wordWrapEnabledInput = input<boolean | undefined>(undefined, {\n alias: 'wordWrapEnabled',\n });\n readonly columnAutoWidthInput = input<boolean | undefined>(undefined, {\n alias: 'columnAutoWidth',\n });\n readonly rowAlternationEnabledInput = input<boolean | undefined>(undefined, {\n alias: 'rowAlternationEnabled',\n });\n readonly resizeFillsGridInput = input<boolean | undefined>(undefined, { alias: 'resizeFillsGrid' });\n\n /** dx resolves `nxe-tree-list` against the `treeList` slice, not `dataGrid`. */\n private readonly widgetDefaults = computed(\n () => (this.treeMode ? this.defaults.treeList : this.defaults.dataGrid) ?? {},\n );\n\n readonly hoverStateEnabled = computed(\n () => this.hoverStateEnabledInput() ?? this.widgetDefaults().hoverStateEnabled ?? false,\n );\n /**\n * Widget-mode resizing that never leaves a blank strip: the trailing column takes whatever a\n * narrowed layout leaves of the grid's width. Not dx - dx lets the table end short - so off\n * unless bound or set app-wide through `NXE_DEFAULT_OPTIONS`.\n */\n readonly resizeFillsGrid = computed(\n () => this.resizeFillsGridInput() ?? this.widgetDefaults().resizeFillsGrid ?? false,\n );\n // The literals are DevExtreme 24.2.3's generic defaults: showColumnLines true, showRowLines\n // false and wordWrapEnabled false (m_rows_view.js:1180-1182), showBorders false\n // (m_grid_view.js:743). dxTreeList shares them and changes them only for the Material themes\n // (tree_list/m_widget_base.js:39-52), so both hosts use the same literals. The library shipped\n // column lines off and row lines and wrapping on, the reverse of dx, so every grid that bound\n // neither option drew the wrong lines.\n readonly showColumnLines = computed(\n () => this.showColumnLinesInput() ?? this.widgetDefaults().showColumnLines ?? true,\n );\n readonly showRowLines = computed(\n () => this.showRowLinesInput() ?? this.widgetDefaults().showRowLines ?? false,\n );\n readonly showBorders = computed(\n () => this.showBordersInput() ?? this.widgetDefaults().showBorders ?? false,\n );\n readonly wordWrapEnabled = computed(\n () => this.wordWrapEnabledInput() ?? this.widgetDefaults().wordWrapEnabled ?? false,\n );\n readonly columnAutoWidth = computed(\n () => this.columnAutoWidthInput() ?? this.widgetDefaults().columnAutoWidth ?? false,\n );\n readonly rowAlternationEnabled = computed(\n () => this.rowAlternationEnabledInput() ?? this.widgetDefaults().rowAlternationEnabled ?? false,\n );\n /**\n * dx `remoteOperations`. With a `{ load }` store as the `dataSource`, any truthy value makes the\n * grid page, sort and filter on the server (`{ paging, sorting, filtering }` is read as all or\n * nothing). A {@link NxeRemoteDataSource} is remote whatever this says.\n */\n readonly remoteOperations = input<any>(false);\n\n // Controlled state, for binding to URL query params. `undefined` = not controlled: the grid\n // keeps its own state. A remote grid always writes them back, so `[(pageIndex)]` follows the\n // user; a client-side grid writes back only the ones that are bound.\n /** The 0-based page. Two-way. */\n readonly pageIndexModel = model<number | undefined>(undefined, { alias: 'pageIndex' });\n /** Rows per page. Two-way. */\n readonly pageSizeModel = model<number | undefined>(undefined, { alias: 'pageSize' });\n /** The sort, `[{ selector, desc }]`. Two-way; a header click writes its single level here. */\n readonly sortModel = model<readonly NxeSortDescriptor[] | undefined>(undefined, { alias: 'sort' });\n /**\n * A filter the application owns (a filter bar, a status tab), in {@link NxeFilterExpression}\n * form. A remote grid ANDs it with the filter row and header filter and sends the lot to the\n * server. Changing it returns the grid to the first page.\n */\n // The annotation is explicit on purpose: the library compiles without strictNullChecks, which erases\n // `| null | undefined` from an inferred type, so the built .d.ts would otherwise say non-null.\n readonly filter: InputSignal<NxeFilterExpression | null | undefined> = input<NxeFilterExpression | null | undefined>(\n undefined,\n );\n /**\n * The options of every request a remote grid hands its source: page, size, sort and the\n * combined filter. One emission per distinct request, after filter-row typing settles. This is\n * where an application mirrors the grid's state into the URL.\n */\n readonly optionsChange = output<NxeLoadOptions>();\n /**\n * dx `syncLookupFilterValues` — accepted, and deliberately inert. It asks dx to narrow a\n * lookup column's header-filter list to the values still reachable under the other filters.\n * This grid never cascades those lists for client arrays (see `hfBaseRows`), so `false` is\n * already what it does; `true` is the option we do not honour.\n * @nxeInert grid — parity/data-grid.yaml \"syncLookupFilterValues\".\n */\n readonly syncLookupFilterValues = input(true);\n readonly columnMinWidth = input<number | undefined>(undefined);\n /** dx `height` — a bare number means px, anything else passes through. */\n readonly height = input<number | string | undefined>(undefined);\n protected readonly heightStyle = computed(() => {\n const h = this.height();\n if (h === undefined || h === null || h === '') {\n return null;\n }\n return /^-?\\d+(\\.\\d+)?$/.test(String(h)) ? `${h}px` : String(h);\n });\n readonly noDataTextInput = input<string | undefined>(undefined, { alias: 'noDataText' });\n readonly noDataText = computed(\n () => this.noDataTextInput() ?? this.widgetDefaults().noDataText ?? this.messages.t('grid.noData'),\n );\n readonly loadPanel = input<{ enabled?: boolean } | undefined>(undefined);\n readonly paging = input<{ enabled?: boolean; pageSize?: number } | undefined>(undefined);\n readonly filterRow = input<{ visible?: boolean } | undefined>(undefined);\n /** Object-input forms of the config elements (dx accepts both; orbit uses both styles). */\n readonly headerFilterOptions = input<\n { visible?: boolean; search?: { enabled?: boolean } } | undefined\n >(undefined, { alias: 'headerFilter' });\n readonly groupingOptions = input<{ autoExpandAll?: boolean } | undefined>(undefined, {\n alias: 'grouping',\n });\n readonly groupPanelOptions = input<{ visible?: boolean } | undefined>(undefined, {\n alias: 'groupPanel',\n });\n readonly scrolling = input<any>(undefined);\n /**\n * dx `sorting`. Unbound means dx's default mode 'single'. `false` and `null` are accepted as dx\n * reads them - no mode, so headers keep their sort slot but a click never sorts.\n */\n readonly sorting = input<{ mode?: 'single' | 'multiple' | 'none' } | false | null | undefined>(\n undefined,\n );\n readonly allowColumnResizing = input(false);\n /** dx columnResizingMode: 'nextColumn' (default) trades width; 'widget' grows the table. */\n readonly columnResizingMode = input<'nextColumn' | 'widget'>('nextColumn');\n /** dx allowColumnReordering (default false — matches every dx-era template in this app). */\n readonly allowColumnReordering = input(false);\n readonly repaintChangesOnly = input(false);\n readonly showColumnHeaders = input(true);\n\n // --- Tree-list inputs (dx-tree-list) -------------------------------------------------------\n readonly parentIdExpr = input<string | undefined>(undefined);\n readonly dataStructure = input<'plain' | 'tree'>('plain');\n readonly rootValue = input<unknown>(undefined);\n readonly autoExpandAll = input(false);\n readonly expandedRowKeys = model<any[]>([]);\n /** Tree-list multi-select keys (`[(selectedRowKeys)]`); recursive via dxo-selection. */\n readonly selectedRowKeys = model<any[]>([]);\n\n /**\n * Declarative cell merge (orbit addition, replaces the legacy `onCellPrepared` DOM surgery):\n * dataFields merged hierarchically left→right — consecutive rows with equal values render one\n * cell with `rowspan`; a break in an earlier field breaks all later fields.\n */\n readonly mergeColumns = input<readonly string[]>([]);\n\n readonly onSelectionChanged = output<NxeGridSelectionChangedEvent>();\n readonly onRowClick = output<{ data: any; rowIndex: number; component: NxeGridInstance }>();\n /** Fires after the rendered row set changes (dx parity; used for post-render DOM work). */\n readonly onContentReady = output<{ component: NxeGridInstance; element: HTMLElement }>();\n /**\n * dx parity: `{ fullName: 'paging.pageIndex', value }` for internal paging and\n * `{ fullName: 'columns[<i>].groupIndex', previousValue, value }` for runtime grouping\n * changes (one event per gesture — the contract generic-list's persistence handler expects).\n */\n readonly onOptionChanged = output<NxeGridOptionChangedEvent>();\n /** Extra CSS classes for a data row (replaces dx `onRowPrepared` class tweaks). */\n readonly rowClass = input<((row: any) => string) | undefined>(undefined);\n\n /**\n * dx `onCellPrepared` / `onRowPrepared`, fired once per rendered cell and row after the DOM\n * is written, with the real element for handlers that mutate it.\n *\n * Classic EventEmitters, NOT `output()`, for the same reason the pivot uses them: `.observed`\n * gates a per-cell walk, so a grid that binds neither pays nothing. That gate is the whole\n * cost model here — without it every grid would walk every cell on every render.\n *\n * `mergeColumns` and `rowClass` are the supported way to do what most handlers do; these\n * exist because applications carry handlers that cannot be rewritten.\n */\n @Output() readonly onCellPrepared = new EventEmitter<NxeCellPreparedEvent>();\n @Output() readonly onRowPrepared = new EventEmitter<NxeRowPreparedEvent>();\n\n protected rowClassFor(row: any): string {\n return this.rowClass()?.(row) ?? '';\n }\n /** Master-detail expand lifecycle (fires before the detail template instantiates). */\n readonly onRowExpanding = output<{ key: any; component: NxeGridInstance }>();\n readonly onRowExpanded = output<{ key: any; component: NxeGridInstance }>();\n\n /** Set imperatively by `app-data-pagination-wrapper` (a group-count summary). Stored for 9b. */\n summary: any = undefined;\n\n private readonly hoveredIndex = signal<number | null>(null);\n private readonly sort = signal<SortState | null>(null);\n private readonly sortInit = signal(false);\n private readonly visibilityOverride = signal<ReadonlyMap<string, boolean>>(new Map());\n /** Filter-row state per dataField (operation + typed text) — controlled editors read it back. */\n private readonly filterRowState = signal<ReadonlyMap<string, FilterRowEntry>>(new Map());\n /**\n * Header-filter runtime overrides: field → allowed-key set, or `null` for \"user explicitly\n * cleared\" (a declarative `filterValues` seed must NOT resurrect after Select All → OK).\n * Absent field = untouched → the column's `filterValues` input seeds the filter (dx parity).\n */\n private readonly hfOverride = signal<ReadonlyMap<string, ReadonlySet<any> | null>>(new Map());\n private readonly selectedSet = signal<ReadonlySet<any>>(new Set());\n private readonly refreshTick = signal(0);\n\n /**\n * Header-filter popup working state — the draft/search/tree machinery lives in\n * {@link NxeHeaderFilterModel} (extracted for pivot reuse, Phase 3a); the grid supplies\n * its rows/columns through the source adapter and keeps the aliases the specs poke.\n */\n protected readonly hf = new NxeHeaderFilterModel<NxeColumnComponent>({\n rows: () => this.hfBaseRows(),\n fixedItems: (col: NxeColumnComponent) => {\n const items = col.headerFilterConfig()?.dataSource();\n // dx uses a supplied list verbatim: declared order, no (Blanks), and values that do\n // not occur in the data still offered - which is the reason to supply one.\n return items\n ? items.map((i) => ({ key: i.value, text: String(i.text ?? i.value ?? '') }))\n : null;\n },\n rawValue: (col, row) => this.getRaw(row, col.dataField()),\n displayText: (col, row) => this.cellText(col, row),\n isDate: (col) => this.colType(col) === 'date',\n sortByDisplayText: (col) => !!col.lookup(),\n boolLabel: (col, raw) => this.hfBoolLabel(col, raw),\n compare: (a, b) => this.compare(a, b),\n }, {\n blanks: () => this.messages.t('common.blanks'),\n yes: () => this.messages.t('common.yes'),\n no: () => this.messages.t('common.no'),\n month: (month) => Info.months('long', { locale: this.messages.locale() })[month - 1],\n });\n protected readonly hfColumn = this.hf.column;\n protected readonly hfDraft = this.hf.draft;\n private hfOverlayRef?: OverlayRef;\n\n /**\n * The current page.\n *\n * A `linkedSignal` over `nxe-paging`'s own `pageIndex` so the binding is genuinely two-way:\n * a host that sets `[(pageIndex)]` moves the grid, and `goToPage` writes back. Declaring the\n * input without this would satisfy an audit while doing nothing — the option would resolve\n * and be ignored, which is worse than not accepting it.\n */\n protected readonly pageIndex = linkedSignal(() => {\n const remote = this.remote();\n return (\n this.pageIndexModel() ??\n this.pagingCmp()?.pageIndex() ??\n (remote ? untracked(() => remote.options().pageIndex) : 0)\n );\n });\n private readonly userPageSize = linkedSignal<number | null>(() => this.pageSizeModel() ?? null);\n\n /** DevExtreme `.instance` facade — `#gridAll.instance.<method>()`. */\n private readonly facade: NxeGridInstance = {\n getSelectedRowsData: () => this.selectedRowsData(),\n getSelectedRowKeys: () => (this.remote() ? this.selectedRowKeys() : this.rowKeys(this.selectedRowsData())),\n clearSelection: () => this.deselectRows(null),\n deselectAll: () => this.deselectRows(this.treeMode ? null : this.displayRows()),\n refresh: () => {\n this.refreshTick.update((v) => v + 1);\n this.remote()?.reload();\n },\n clearFilter: (filterName?: 'row' | 'header' | 'search' | 'filterValue' | 'dataSource') => {\n if (!filterName || filterName === 'row') {\n this.filterRowState.set(new Map());\n }\n if (!filterName || filterName === 'header') {\n // Explicit nulls so declarative `filterValues` seeds don't resurrect (dx clears\n // column.filterValues even when configured declaratively).\n const cleared = new Map<string, ReadonlySet<any> | null>();\n for (const col of this.columns()) {\n if (col.filterValues()?.length) {\n cleared.set(col.dataField(), null);\n }\n }\n this.hfOverride.set(cleared);\n }\n },\n columnOption: (field, optionName, value) => {\n if (optionName === 'visible') {\n this.setColumnVisible(field, value);\n }\n },\n getVisibleColumns: () =>\n this.visibleColumns().map((c) => {\n const type = this.colType(c);\n return {\n caption: c.caption(),\n dataField: c.dataField(),\n // An inferred 'object' column exports as text, as an untyped one always did.\n dataType: type === 'object' ? 'string' : type,\n format: c.format(),\n };\n }),\n getVisibleRows: () => this.displayRows(),\n totalCount: () => this.remote()?.totalCount() ?? this.displayRows().length,\n getRootNode: () => ({\n key: undefined,\n data: undefined,\n level: -1,\n hasChildren: this.treeRoots().length > 0,\n children: this.treeRoots(),\n }),\n updateDimensions: () => this.refreshTick.update((v) => v + 1),\n clearGrouping: () => this.clearGroupingInternal(),\n expandAll: () => {\n this.groupExpandDefault.set(true);\n this.groupExpandOverride.set(new Map());\n if (this.treeMode) {\n const keyF = this.keyExpr() ?? 'id';\n const all = new Map<any, boolean>();\n for (const r of this.sourceRows()) {\n all.set(r[keyF], true);\n }\n this.expandOverride.set(all);\n }\n },\n saveEditData: () => {\n const editing = this.editingCmp();\n const key = editing?.editRowKey();\n if (editing && key != null) {\n const row = this.sourceRows().find((r) => this.rowKey(r) === key);\n if (row) {\n this.saveRowEdit(row, new Event('save'));\n }\n }\n },\n element: () => this.elementRef.nativeElement,\n expandRow: (key: any) => {\n // Symmetric with collapseRow for the tree list: writes the same override map the\n // expander arrows use, so a programmatic reveal wins over an earlier manual collapse\n // (the [expandedRowKeys] seed alone cannot — overrides take precedence over it).\n if (this.treeMode) {\n this.expandOverride.update((m) => new Map(m).set(key, true));\n }\n },\n collapseRow: (key: any) => {\n // Master-detail collapse by key; tree-list node collapse for tree mode.\n this.expandedDetails.update((set) => {\n const next = new Set(set);\n next.delete(key);\n return next;\n });\n if (this.treeMode) {\n this.expandOverride.update((m) => new Map(m).set(key, false));\n }\n // dx grouped-grid form: collapseRow(['X','Y']) collapses that group path.\n if (!this.treeMode && Array.isArray(key) && this.groupColumns().length) {\n let groupKey = '';\n key.forEach((value, level) => {\n groupKey = `${groupKey}/${level}:${typeof value}:${String(value)}`;\n });\n this.groupExpandOverride.update((m) => new Map(m).set(groupKey, false));\n }\n },\n };\n get instance(): NxeGridInstance {\n return this.facade;\n }\n\n /** Guards against a handler that schedules another render re-entering the walk. */\n private preparedDepth = 0;\n\n constructor() {\n // Server-side data: the request is a computed over exactly the state it is made of, and\n // this stream (explicitly those signals, nothing a callee reads) hands each distinct one to\n // the source, waiting out filter-row typing first.\n toObservable(this.remoteRequest)\n .pipe(\n debounce(() => {\n if (!this.remoteTyping) {\n return of(0);\n }\n this.remoteTyping = false;\n return timer(this.remote()?.filterDebounce ?? 0);\n }),\n takeUntilDestroyed(this.destroyRef),\n )\n .subscribe((request) => request && this.dispatchRemote(request));\n\n // Registered before onContentReady so cells are prepared by the time it fires, as in dx.\n afterRenderEffect(() => {\n this.renderRows();\n this.visibleColumns();\n untracked(() => this.emitPreparedEvents());\n });\n\n // A cellTemplate that draws a check box centres its column, header and cells, the way a\n // boolean column is centred. Only the rendered cells can say what a template draws, so\n // this reads them after render; the DOM walk is untracked, like emitPreparedEvents.\n afterRenderEffect(() => {\n this.renderRows();\n this.visibleColumns();\n untracked(() => this.detectTemplateCheckboxColumns());\n });\n\n // dx onContentReady parity: fire after the rendered row set reaches the DOM.\n afterRenderEffect(() => {\n this.renderRows();\n this.onContentReady.emit({ component: this.facade, element: this.elementRef.nativeElement });\n });\n\n // dx columnAutoWidth parity: measure natural column widths after render, then apply\n // fixed-layout pixel widths distributed like dx (explicit widths kept; free columns share\n // the remaining container width proportionally to their max-content size).\n afterRenderEffect(() => {\n this.renderRows();\n this.visibleColumns();\n this.columnAutoWidth();\n this.wordWrapEnabled();\n this.containerW();\n untracked(() => this.scheduleAutoWidthMeasure());\n });\n afterNextRender(() => {\n const rv = this.elementRef.nativeElement.querySelector('.nxe-datagrid-rowsview');\n if (rv && typeof ResizeObserver !== 'undefined') {\n this.resizeObserver = new ResizeObserver((entries) => {\n const w = Math.round(entries[0]?.contentRect?.width ?? 0);\n if (w > 0 && Math.abs(w - this.containerW()) > 1) {\n this.containerW.set(w);\n }\n });\n this.resizeObserver.observe(rv);\n }\n });\n\n // The free-space row: re-read whenever the rows view (the grid's height) or its table (the\n // rows) changes size. The paged case needs no reading beyond the row height, so a page\n // change that keeps the table's height still resolves through `freeSpace` alone.\n afterNextRender(() => {\n const host = this.elementRef.nativeElement as HTMLElement;\n // This grid's own elements: a nested master-detail grid's come later in the document.\n const rv = host.querySelector<HTMLElement>('.nxe-datagrid-rowsview');\n const table = rv?.querySelector<HTMLTableElement>(\n ':scope > .nxe-datagrid-content > .nxe-datagrid-table',\n );\n if (!rv || !table || typeof ResizeObserver === 'undefined') {\n return;\n }\n const observer = new ResizeObserver(() => this.measureFreeSpace(rv, table));\n observer.observe(rv);\n observer.observe(table);\n this.destroyRef.onDestroy(() => observer.disconnect());\n });\n }\n\n // --- Column auto-width engine (dx columnAutoWidth parity) ----------------------------------\n private readonly autoWidths = signal<{ widths: readonly (string | null)[]; tableWidth: string } | null>(null);\n private readonly containerW = signal(0);\n private resizeObserver: ResizeObserver | null = null;\n private autoWidthPending = false;\n private lastAutoWidthKey = '';\n\n private scheduleAutoWidthMeasure(): void {\n // Frozen after a manual resize (dx stops redistributing), paused while a resize drag\n // writes the colgroup directly.\n if (!this.columnAutoWidth() || this.resizeActive || this.widthOverride().size) {\n if (this.autoWidths() !== null) {\n this.lastAutoWidthKey = '';\n this.autoWidths.set(null);\n }\n return;\n }\n if (this.autoWidthPending) {\n return;\n }\n this.autoWidthPending = true;\n requestAnimationFrame(() => {\n this.autoWidthPending = false;\n this.measureAutoWidths();\n });\n }\n\n private measureAutoWidths(): void {\n const host = this.elementRef.nativeElement as HTMLElement;\n const table = host.querySelector<HTMLTableElement>('.nxe-datagrid-content > .nxe-datagrid-table');\n const rowsview = host.querySelector<HTMLElement>('.nxe-datagrid-rowsview');\n if (!table || !rowsview) {\n return;\n }\n const cols = this.visibleColumns();\n const lead =\n this.groupLevelCount() + (this.masterDetailEnabled() ? 1 : 0) + (this.selectColumnVisible() ? 1 : 0);\n // One cell per visible column, gathered across the header rows: with bands a top-level\n // column sits in the first row and spans down, so no single row holds them all.\n const cells = nxeHeaderLeafCells(host);\n const container = rowsview.clientWidth;\n if (cells.length !== cols.length || container <= 0) {\n return;\n }\n\n // Measurement pass: natural max-content widths (no wrap), reverted before paint.\n const colEls = Array.from(table.querySelectorAll<HTMLTableColElement>(':scope > colgroup > col'))\n .slice(lead, lead + cols.length);\n const prevLayout = table.style.tableLayout;\n const prevWidth = table.style.width;\n const prevColWidths = colEls.map((c) => c.style.width);\n // dx's best-fit pass moves the header tbody into the rows table as `dx-header\n // dx-datagrid-best-fit` (m_grid_view.js:187-206). Its rules unfloat the indicator block and\n // show every `dx-sort-none` placeholder at 14px, so each sortable column measures 17px wider\n // (34px centred, with the hidden mirror) whether sorted or not - and sorting never changes a\n // width. The class goes on our thead, which is that tbody's counterpart.\n const thead = table.querySelector<HTMLElement>(':scope > thead');\n thead?.classList.add('nxe-datagrid-best-fit');\n table.style.tableLayout = 'auto';\n table.style.width = 'max-content';\n colEls.forEach((c) => (c.style.width = ''));\n const measured = cells.map((c) => c.getBoundingClientRect().width);\n thead?.classList.remove('nxe-datagrid-best-fit');\n table.style.tableLayout = prevLayout;\n table.style.width = prevWidth;\n colEls.forEach((c, i) => (c.style.width = prevColWidths[i]));\n\n // dx-style distribution: explicit px widths kept; free columns get the remaining space\n // proportionally to measured max-content (never below columnMinWidth; last col absorbs\n // rounding). Over-constrained -> keep max-content and let the rowsview scroll.\n const explicit = cols.map((c) => {\n const w = this.colWidth(c);\n if (w == null) {\n return null;\n }\n const n = parseFloat(w);\n return Number.isFinite(n) && (w.endsWith('px') || /^\\d+(\\.\\d+)?$/.test(w)) ? n : null;\n });\n const specialSum =\n 30 * this.groupLevelCount() +\n (this.masterDetailEnabled() ? 30 : 0) +\n (this.selectColumnVisible() ? 70 : 0) +\n (this.rowEditCommandVisible() ? 100 : 0);\n const fixedSum = explicit.reduce<number>((s, w) => s + (w ?? 0), 0) + specialSum;\n const freeIdx = explicit.map((w, i) => (w == null ? i : -1)).filter((i) => i >= 0);\n const out: (string | null)[] = explicit.map((w) => (w == null ? null : `${w}px`));\n const minW = this.columnMinWidth() ?? 50;\n let total = fixedSum;\n if (freeIdx.length) {\n const freeSum = freeIdx.reduce((s, i) => s + measured[i], 0) || 1;\n const avail = container - fixedSum;\n if (avail >= freeSum) {\n const scale = avail / freeSum;\n let used = 0;\n freeIdx.forEach((i, k) => {\n const w = k === freeIdx.length - 1\n ? Math.max(minW, avail - used)\n : Math.max(minW, Math.round(measured[i] * scale * 100) / 100);\n used += w;\n out[i] = `${w}px`;\n });\n total += used;\n } else {\n freeIdx.forEach((i) => {\n const w = Math.max(minW, Math.ceil(measured[i]));\n total += w;\n out[i] = `${w}px`;\n });\n }\n }\n const tableWidth = total > container + 1 ? `${Math.ceil(total)}px` : '100%';\n const key = `${out.join('|')}@${tableWidth}@${container}`;\n if (key !== this.lastAutoWidthKey) {\n this.lastAutoWidthKey = key;\n this.autoWidths.set({ widths: out, tableWidth });\n }\n }\n\n /**\n * A column with no frozen/declared width appearing AFTER a manual resize froze the layout\n * (ungrouped chip, re-shown via columnOption): give it dx's default column width instead of\n * letting the pinned table width squeeze it to ~0.\n */\n private frozenColWidth(col: NxeColumnComponent): number {\n const manual = this.widthOverride().get(col.dataField());\n if (manual != null) {\n return manual;\n }\n const declared = parseFloat(this.colWidth(col) ?? '');\n return Number.isFinite(declared) ? declared : 100;\n }\n\n protected effectiveColWidth(col: NxeColumnComponent, idx: number): string | null {\n const aw = this.autoWidths();\n if (aw && this.columnAutoWidth()) {\n return aw.widths[idx] ?? this.colWidth(col);\n }\n const slack = this.frozenSlack();\n if (slack > 0 && idx === this.visibleColumns().length - 1) {\n return `${Math.round(this.frozenColWidth(col) + slack)}px`;\n }\n // A manual resize froze every visible column at a measured width, and that width - not the\n // declared one - is what the column now has. (A declared width used to win here, and only a\n // stale inline style left by the drag kept a resized column at its new width.)\n if (this.widthOverride().has(col.dataField())) {\n return `${this.frozenColWidth(col)}px`;\n }\n const w = this.colWidth(col);\n if (w == null && this.widthOverride().size) {\n return `${this.frozenColWidth(col)}px`;\n }\n return w;\n }\n\n /** What a frozen layout's columns add up to, the command columns included. */\n private frozenTableWidth(): number {\n let total =\n 30 * this.groupLevelCount() +\n (this.masterDetailEnabled() ? 30 : 0) +\n (this.selectColumnVisible() ? 40 : 0) +\n (this.rowEditCommandVisible() ? 100 : 0);\n for (const col of this.visibleColumns()) {\n total += this.frozenColWidth(col);\n }\n return total;\n }\n\n /**\n * With `resizeFillsGrid`, the room a frozen widget-mode layout leaves on the right, which the\n * trailing column takes. 0 when the columns fill or overflow the grid - that table scrolls.\n */\n private readonly frozenSlack = computed(() => {\n if (!this.resizeFillsGrid() || !this.widthOverride().size || this.columnResizingMode() !== 'widget') {\n return 0;\n }\n const container = this.containerW();\n return container > 0 ? Math.max(0, Math.round(container - this.frozenTableWidth())) : 0;\n });\n\n protected tableWidthStyle(): string {\n // After a manual resize the layout is frozen: widget mode sizes the table to the sum of\n // its columns (dx grows/shrinks the table); nextColumn keeps filling the container.\n if (this.widthOverride().size && this.columnResizingMode() === 'widget') {\n // The trailing column already holds the slack, so the columns add up to the grid.\n return this.frozenSlack() > 0 ? '100%' : `${Math.round(this.frozenTableWidth())}px`;\n }\n if (this.widthOverride().size) {\n return '100%';\n }\n const aw = this.autoWidths();\n return aw && this.columnAutoWidth() ? aw.tableWidth : '100%';\n }\n\n // --- Selection (dxo-selection) ---------------------------------------------------------------\n protected readonly selectionEnabled = computed(() => {\n const s = this.selection();\n return !!s && s.mode() !== 'none';\n });\n protected readonly selectionMode = computed(() => this.selection()?.mode() ?? 'single');\n protected readonly showCheckboxes = computed(() => {\n if (!this.selectionEnabled()) {\n return false;\n }\n // Tree-list multiple selection shows checkboxes by default (dx behaviour).\n return (\n this.selection()?.showCheckBoxesMode() === 'always' ||\n (this.treeMode && this.selectionMode() === 'multiple')\n );\n });\n /**\n * The detached checkbox column. A tree list has none: dx draws its row checkbox in the first\n * cell, after the expander, and its select-all in the first column's header.\n */\n protected readonly selectColumnVisible = computed(() => this.showCheckboxes() && !this.treeMode);\n protected readonly treeSelectAll = computed(\n () => this.treeMode && this.showCheckboxes() && this.selectionMode() === 'multiple',\n );\n private readonly recursiveTreeSelection = computed(\n () => this.treeMode && this.selectionMode() === 'multiple' && (this.selection()?.recursive() ?? false),\n );\n /**\n * Each node's recursive selection state as dx draws it: `all` when its key is selected or an\n * ancestor's is, or when every child is; `some` when only some descendants are; absent for none.\n * Keys hold the selection, so the hierarchy - not the key list - decides what a parent shows.\n */\n private readonly treeCheckState = computed<ReadonlyMap<any, 'all' | 'some'>>(() =>\n this.recursiveTreeSelection()\n ? nxeTreeCheckState(this.treeRoots(), new Set(this.selectedRowKeys()))\n : new Map(),\n );\n /** Parent of each tree node, for settling ancestors after a recursive toggle. */\n private readonly treeParents = computed(() => {\n const parents = new Map<any, TreeNode>();\n const walk = (nodes: TreeNode[]): void => {\n for (const n of nodes) {\n n.children.forEach((c) => parents.set(c.key, n));\n walk(n.children);\n }\n };\n walk(this.treeRoots());\n return parents;\n });\n /** Selected rows in dataSource order (stale refs from old data naturally filtered out). */\n protected readonly selectedRowsData = computed<any[]>(() => {\n if (this.remote()) {\n // Keyed, and across pages: the row object is the page's when it is on screen, else the\n // one remembered from when it was selected.\n const page = new Map(this.sourceRows().map((r) => [this.rowKey(r), r]));\n return this.selectedRowKeys().flatMap((key) => {\n const row = page.get(key) ?? this.remoteRowCache.get(key);\n if (row === undefined) {\n return [];\n }\n this.remoteRowCache.set(key, row);\n return [row];\n });\n }\n if (this.treeMode) {\n const keySet = new Set(this.selectedRowKeys());\n return keySet.size === 0\n ? []\n : this.sourceRows().filter((r) => keySet.has(this.rowKey(r)));\n }\n const set = this.selectedSet();\n return set.size === 0 ? [] : this.sourceRows().filter((r) => set.has(r));\n });\n protected readonly allSelected = computed(() => {\n if (this.remote()) {\n const rows = this.displayRows();\n const keys = this.selectedKeySet();\n return rows.length > 0 && rows.every((r) => keys.has(this.rowKey(r)));\n }\n if (this.recursiveTreeSelection()) {\n const roots = this.treeRoots();\n const state = this.treeCheckState();\n return roots.length > 0 && roots.every((n) => state.get(n.key) === 'all');\n }\n if (this.treeMode) {\n const rows = this.sourceRows();\n const keys = this.selectedRowKeys();\n return rows.length > 0 && rows.every((r) => keys.includes(this.rowKey(r)));\n }\n const rows = this.displayRows();\n const set = this.selectedSet();\n return rows.length > 0 && rows.every((r) => set.has(r));\n });\n protected readonly someSelected = computed(() =>\n this.remote()\n ? this.displayRows().some((r) => this.selectedKeySet().has(this.rowKey(r)))\n : this.recursiveTreeSelection()\n ? this.treeCheckState().size > 0\n : this.treeMode\n ? this.selectedRowKeys().length > 0\n : this.displayRows().some((r) => this.selectedSet().has(r)),\n );\n\n /** The key field: the bound `keyExpr`, else the remote source's own `key`. */\n private readonly keyField = computed(() => this.keyExpr() ?? this.remote()?.key);\n\n private rowKey(row: any): any {\n const k = this.keyField();\n return k ? row?.[k] : row;\n }\n\n private treeDescendantKeys(row: any): any[] {\n const start = this.rowKey(row);\n const out: any[] = [];\n const find = (nodes: TreeNode[]): TreeNode | null => {\n for (const n of nodes) {\n if (n.key === start) return n;\n const f = find(n.children);\n if (f) return f;\n }\n return null;\n };\n const node = find(this.treeRoots());\n const collect = (n: TreeNode): void => {\n out.push(n.key);\n n.children.forEach(collect);\n };\n if (node) collect(node);\n return out.length ? out : [start];\n }\n\n private toggleTreeSelection(row: any): void {\n const key = this.rowKey(row);\n // dx parity: single mode REPLACES the selection, and re-clicking the selected row keeps\n // it selected. A toggle here would immediately undo a key the host page just wrote into\n // [(selectedRowKeys)] from its own onRowClick handler — the output fires before this\n // runs, so the toggle would find the key present and delete it, ending every click with\n // an empty selection.\n if (this.selectionMode() !== 'multiple') {\n const previous = this.selectedRowKeys();\n const added = previous.includes(key) ? [] : [key];\n const removed = previous.filter((k) => k !== key);\n this.selectedRowKeys.set([key]);\n this.emitTreeSelectionChanged([key], added, removed);\n return;\n }\n if (this.recursiveTreeSelection()) {\n this.toggleRecursiveTreeSelection(row, key);\n return;\n }\n const keys = new Set(this.selectedRowKeys());\n const selecting = !keys.has(key);\n selecting ? keys.add(key) : keys.delete(key);\n const arr = [...keys];\n this.selectedRowKeys.set(arr);\n this.emitTreeSelectionChanged(arr, selecting ? [key] : [], selecting ? [] : [key]);\n }\n\n /**\n * dx recursive selection. Clicking a node that is not fully checked (unchecked, or a parent\n * showing indeterminate) selects its whole subtree; clicking a checked one clears it. Then its\n * ancestors follow their children, checked once all of them are and cleared as soon as one is\n * not, so deselecting one child leaves its parent indeterminate rather than still ticked.\n *\n * The key list is rewritten as every checked node, which dx's `getSelectedRowKeys('all')`\n * also reports. The event's current keys are what changed on screen.\n */\n private toggleRecursiveTreeSelection(row: any, key: any): void {\n const before = this.treeCheckState();\n const checked = new Set<any>();\n before.forEach((state, k) => state === 'all' && checked.add(k));\n const selecting = before.get(key) !== 'all';\n for (const k of this.treeDescendantKeys(row)) {\n selecting ? checked.add(k) : checked.delete(k);\n }\n const parents = this.treeParents();\n for (let parent = parents.get(key); parent; parent = parents.get(parent.key)) {\n parent.children.every((c) => checked.has(c.key)) ? checked.add(parent.key) : checked.delete(parent.key);\n }\n const previous = this.selectedRowKeys();\n const kept = previous.filter((k) => checked.has(k));\n const keptSet = new Set(kept);\n const next = [...kept, ...[...checked].filter((k) => !keptSet.has(k))];\n const wasChecked = (k: any) => before.get(k) === 'all';\n this.selectedRowKeys.set(next);\n this.emitTreeSelectionChanged(\n next,\n next.filter((k) => !wasChecked(k)),\n [...before.keys()].filter((k) => wasChecked(k) && !checked.has(k)),\n );\n }\n\n /** A recursive tree list's parent with only some descendants selected (dx's indeterminate box). */\n protected isTreeIndeterminate(row: any): boolean {\n return this.treeCheckState().get(this.rowKey(row)) === 'some';\n }\n\n private emitTreeSelectionChanged(allKeys: any[], added: any[], removed: any[]): void {\n const keySet = new Set(allKeys);\n const data = this.sourceRows().filter((r) => keySet.has(this.rowKey(r)));\n this.onSelectionChanged.emit({\n selectedRowsData: data,\n selectedRowKeys: allKeys,\n currentSelectedRowKeys: added,\n currentDeselectedRowKeys: removed,\n component: this.facade,\n element: this.elementRef.nativeElement,\n });\n }\n\n // --- Grouping + summary (dxo-grouping / dxo-group-panel / dxo-summary) ------------------------\n /** `grouping.autoExpandAll` from the child element or object input; dx default is true. */\n private readonly groupAutoExpand = computed(\n () => this.grouping()?.autoExpandAll() ?? this.groupingOptions()?.autoExpandAll ?? true,\n );\n /** The current expand default — `expandAll()` flips it to true; an input change resets it. */\n private readonly groupExpandDefault = linkedSignal<boolean, boolean>({\n source: () => this.groupAutoExpand(),\n computation: (v) => v,\n });\n /**\n * Per-groupKey manual toggles. Reset when the autoExpandAll option flips or the group\n * configuration changes (dx repaints and re-applies the default; drag-created groups inherit it).\n */\n private readonly groupExpandOverride = linkedSignal<string, ReadonlyMap<string, boolean>>({\n source: () => `${this.groupAutoExpand()}|${this.groupedFields().join('\\u0000')}`,\n computation: () => new Map(),\n });\n\n private isGroupExpanded(groupKey: string): boolean {\n return this.groupExpandOverride().get(groupKey) ?? this.groupExpandDefault();\n }\n\n protected readonly groupPanelVisible = computed(\n () => this.groupPanel()?.visible() === true || this.groupPanelOptions()?.visible === true,\n );\n protected readonly isGrouped = computed(() => this.groupColumns().length > 0);\n\n private readonly totalItems = computed(() => this.summaryCmp()?.totalItems() ?? []);\n private readonly groupItems = computed(() => this.summaryCmp()?.groupItems() ?? []);\n\n protected readonly hasTotalFooter = computed(\n () => this.totalItems().length > 0 && this.displayRows().length > 0,\n );\n\n /** Grand-total sums keyed by dataField → formatted text (alignByColumn placement). */\n protected readonly totalSums = computed(() => {\n const map = new Map<string, string>();\n const rows = this.displayRows();\n for (const item of this.totalItems()) {\n map.set(item.column(), this.summaryText(item, rows));\n }\n return map;\n });\n\n // --- Server-side data (NxeRemoteDataSource) -------------------------------------------------\n /** A `{ load }` store handed to `dataSource` with `remoteOperations`, wrapped once per store. */\n private readonly storeWrappers = new WeakMap<object, NxeRemoteDataSource<any>>();\n private wrapped: NxeRemoteDataSource<any> | null = null;\n private readonly remoteWarnings = new Set<string>();\n /** Rows picked on earlier pages, by key, so `selectedRowsData` still has them. */\n private readonly remoteRowCache = new Map<any, any>();\n /** Set by filter-row typing; the next request waits `filterDebounce` before it is sent. */\n private remoteTyping = false;\n /** What the last request was for, to tell a changed filter, sort or size from a changed page. */\n private remoteSignature: { source: NxeRemoteDataSource<any>; key: string } | null = null;\n\n private warnOnce(key: string, message: string): void {\n if (!this.remoteWarnings.has(key)) {\n this.remoteWarnings.add(key);\n console.warn(`[nxe-data-grid] ${message}`);\n }\n }\n\n /**\n * The source the grid pages through, or `null` for a client-side array. An\n * {@link NxeRemoteDataSource} is used as it is; a `{ load }` store becomes one when\n * `remoteOperations` is on.\n */\n protected readonly remote = computed<NxeRemoteDataSource<any> | null>(() => {\n const source = this.dataSource();\n if (this.treeMode) {\n if (source instanceof NxeRemoteDataSource || nxeIsStoreLike(source)) {\n this.warnOnce('tree', 'nxe-tree-list does not support server-side data; the source is ignored.');\n }\n return null;\n }\n if (source instanceof NxeRemoteDataSource) {\n return source;\n }\n if (!nxeIsStoreLike(source)) {\n return null;\n }\n if (!this.remoteOperations()) {\n this.warnOnce(\n 'store',\n 'A { load } dataSource needs [remoteOperations]=\"true\"; without it the grid shows no rows.',\n );\n return null;\n }\n let wrapper = this.storeWrappers.get(source);\n if (!wrapper) {\n wrapper = new NxeRemoteDataSource<any>((options, context) => source.load(options, context), {\n key: source.key,\n });\n this.storeWrappers.set(source, wrapper);\n }\n this.wrapped = wrapper;\n return wrapper;\n });\n\n /** The rows every client-side computed reads: the array, or the remote source's current page. */\n private readonly sourceRows = computed<any[]>(() => {\n const remote = this.remote();\n if (remote) {\n return remote.items() as any[];\n }\n const source = this.dataSource();\n return Array.isArray(source) ? source : [];\n });\n\n private readonly selectedKeySet = computed<ReadonlySet<any>>(() => new Set(this.selectedRowKeys()));\n\n /** The sort a request carries: the controlled `sort`, else the header sort. */\n private readonly remoteSort = computed<NxeSortDescriptor[]>(() => {\n const bound = this.sortModel();\n if (bound !== undefined) {\n return bound.map((s) => ({ selector: s.selector, desc: s.desc }));\n }\n const sort = this.effectiveSort();\n return sort ? [{ selector: sort.field, desc: sort.dir === 'desc' }] : [];\n });\n\n /** The filter a request carries: filter row AND header filters AND the application's `filter`. */\n private readonly remoteFilter = computed<NxeFilterExpression | null>(() => {\n if (!this.remote()) {\n return null;\n }\n return nxeFilterAnd(this.remoteFilterRowExpression(), this.remoteHeaderFilterExpression(), this.filter());\n });\n\n /** The request the remote source should be showing, or `null` for a client-side grid. */\n private readonly remoteRequest = computed<{ source: NxeRemoteDataSource<any>; query: NxeRemoteQuery } | null>(\n () => {\n const source = this.remote();\n if (!source) {\n return null;\n }\n return {\n source,\n query: {\n pageIndex: this.currentPage(),\n pageSize: this.effectivePageSize(),\n sort: this.remoteSort(),\n filter: this.remoteFilter(),\n },\n };\n },\n {\n // The page index is clamped by the source's total, so every response re-derives the\n // request; an unchanged one must not be a new value, or it would reload forever.\n equal: (a, b) => a === b || (!!a && !!b && a.source === b.source && nxeSameQuery(a.query, b.query)),\n },\n );\n\n private dispatchRemote(request: { source: NxeRemoteDataSource<any>; query: NxeRemoteQuery }): void {\n const { source, query } = request;\n const key = JSON.stringify([query.pageSize, query.sort, query.filter]);\n const last = this.remoteSignature;\n this.remoteSignature = { source, key };\n if (last && last.source === source && last.key !== key && query.pageIndex !== 0) {\n // A new filter, sort or page size means a new result set: back to its first page. The\n // move restates the request, which is what loads.\n this.goToPage(0);\n return;\n }\n if (this.groupColumns().length) {\n this.warnOnce(\n 'group',\n 'Grouping is not supported with server-side data: rows are grouped within the current page only.',\n );\n }\n if (this.summaryCmp()) {\n this.warnOnce(\n 'summary',\n 'Summaries are not supported with server-side data: they are computed over the current page only.',\n );\n }\n const before = source.options();\n source.setOptions(query);\n if (source.options() !== before) {\n this.optionsChange.emit(source.options());\n }\n }\n\n // Filter row -> expression. The matcher in `buildFilterRowMatcher` is the client-side reading\n // of the same state; keep the two in step.\n private remoteFilterRowExpression(): NxeFilterExpression | null {\n const byField = this.columnByField();\n const parts: NxeFilterExpression[] = [];\n for (const [field, entry] of this.filterRowState()) {\n const col = byField.get(field);\n const expr = col ? this.filterRowCondition(col, entry) : null;\n if (expr) {\n parts.push(expr);\n }\n }\n return nxeFilterAnd(...parts);\n }\n\n private filterRowCondition(col: NxeColumnComponent, entry: FilterRowEntry): NxeFilterExpression | null {\n const field = col.dataField();\n const kind = this.frEditorKind(col);\n const t1 = entry.text.trim();\n const t2 = (entry.text2 ?? '').trim();\n if (!t1 && !t2) {\n return null;\n }\n if (kind === 'boolean') {\n return [field, '=', t1 === 'true'];\n }\n if (kind === 'lookup') {\n const lookup = col.lookup()!;\n const valueOf = (i: any): unknown => nxeResolveExpr(lookup.valueExpr ?? 'lovCode', i);\n const item = (lookup.dataSource ?? []).find((i: any) => String(valueOf(i) ?? '') === t1);\n return [field, '=', item ? valueOf(item) : t1];\n }\n const between = (lo: unknown, hi: unknown, hiOp: '<=' | '<'): NxeFilterExpression | null =>\n nxeFilterAnd(lo == null ? null : [field, '>=', lo], hi == null ? null : [field, hiOp, hi]);\n if (kind === 'number') {\n const v1 = t1 ? Number(t1.replace(/,/g, '')) : null;\n const v2 = t2 ? Number(t2.replace(/,/g, '')) : null;\n if ((t1 && Number.isNaN(v1)) || (t2 && Number.isNaN(v2))) {\n return null; // nothing applies until the editor holds a valid number\n }\n if (entry.op === 'between') {\n return between(v1, v2, '<=');\n }\n const op = (['<>', '<', '<=', '>', '>='] as const).find((o) => o === entry.op) ?? '=';\n return v1 == null ? null : [field, op, v1];\n }\n if (kind === 'date') {\n const d1 = t1 ? this.dayKey(t1) : null;\n const d2 = t2 ? this.dayKey(t2) : null;\n if ((t1 && !d1) || (t2 && !d2)) {\n return null;\n }\n // A date is a whole day, as in dx: '=' is [day, next day), '<=' ends before the next day.\n const next = (day: string): string => nxeNextDay(day);\n switch (entry.op) {\n case 'between':\n return between(d1, d2 ? next(d2) : null, '<');\n case '<>':\n return d1 ? nxeFilterOr([field, '<', d1], [field, '>=', next(d1)]) : null;\n case '<':\n return d1 ? [field, '<', d1] : null;\n case '<=':\n return d1 ? [field, '<', next(d1)] : null;\n case '>':\n return d1 ? [field, '>=', next(d1)] : null;\n case '>=':\n return d1 ? [field, '>=', d1] : null;\n default:\n return d1 ? between(d1, next(d1), '<') : null;\n }\n }\n // Text: the operation as chosen. Case is the server's business; the client matcher ignores it.\n const textOps = ['notcontains', 'startswith', 'endswith', '=', '<>'] as const;\n return [field, textOps.find((o) => o === entry.op) ?? 'contains', t1];\n }\n\n private remoteHeaderFilterExpression(): NxeFilterExpression | null {\n const byField = this.columnByField();\n const parts: NxeFilterExpression[] = [];\n for (const [field, keys] of this.effectiveHeaderFilters()) {\n const isDate = (byField.get(field) ? this.colType(byField.get(field)!) : undefined) === 'date';\n const values = [...keys].map((key): NxeFilterExpression => {\n if (key === NXE_HF_BLANKS) {\n return [field, '=', null];\n }\n if (isDate && typeof key === 'string') {\n return [[field, '>=', key], 'and', [field, '<', nxeNextDay(key)]];\n }\n return [field, '=', key];\n });\n // An empty selection is an empty grid: a condition nothing satisfies.\n parts.push(\n nxeFilterOr(...values) ?? [[field, '=', null], 'and', [field, '<>', null]],\n );\n }\n return nxeFilterAnd(...parts);\n }\n\n private toggleRemoteSelection(row: any): void {\n const key = this.rowKey(row);\n const previous = this.selectedRowKeys();\n let next: any[];\n let added: any[] = [];\n let removed: any[] = [];\n if (this.selectionMode() !== 'multiple') {\n added = previous.includes(key) ? [] : [key];\n removed = previous.filter((k) => k !== key);\n next = [key];\n } else if (previous.includes(key)) {\n next = previous.filter((k) => k !== key);\n removed = [key];\n } else {\n next = [...previous, key];\n added = [key];\n }\n this.remoteRowCache.set(key, row);\n this.selectedRowKeys.set(next);\n this.emitRemoteSelectionChanged(next, added, removed);\n }\n\n private toggleRemoteSelectAll(): void {\n const pageKeys = this.displayRows().map((r) => this.rowKey(r));\n for (const row of this.displayRows()) {\n this.remoteRowCache.set(this.rowKey(row), row);\n }\n const previous = this.selectedRowKeys();\n if (this.allSelected()) {\n const drop = new Set(pageKeys);\n const next = previous.filter((k) => !drop.has(k));\n this.selectedRowKeys.set(next);\n this.emitRemoteSelectionChanged(next, [], pageKeys);\n } else {\n const have = new Set(previous);\n const added = pageKeys.filter((k) => !have.has(k));\n const next = [...previous, ...added];\n this.selectedRowKeys.set(next);\n this.emitRemoteSelectionChanged(next, added, []);\n }\n }\n\n private emitRemoteSelectionChanged(keys: any[], added: any[], removed: any[]): void {\n this.onSelectionChanged.emit({\n selectedRowsData: this.selectedRowsData(),\n selectedRowKeys: keys,\n currentSelectedRowKeys: added,\n currentDeselectedRowKeys: removed,\n component: this.facade,\n element: this.elementRef.nativeElement,\n });\n }\n\n // --- Internal paging (dxo-paging) -----------------------------------------------------------\n protected readonly pagingEnabled = computed(\n () => !!this.remote() || (!!this.pagingCmp() && this.pagingCmp()!.enabled()),\n );\n protected readonly effectivePageSize = computed(\n () =>\n this.userPageSize() ??\n this.pagingCmp()?.pageSize() ??\n this.remote()?.options().pageSize ??\n NXE_REMOTE_DEFAULT_PAGE_SIZE,\n );\n protected readonly pageCount = computed(() => {\n const remote = this.remote();\n if (remote) {\n return Math.max(1, Math.ceil(remote.totalCount() / this.effectivePageSize()));\n }\n return this.pagingEnabled() ? Math.max(1, Math.ceil(this.displayRows().length / this.effectivePageSize())) : 1;\n });\n /**\n * The page shown: `pageIndex` held inside the page count. A filter can leave the bound index\n * past the last page; dx moves it back (m_data_source_adapter.js:454), and the rows, the\n * pager's selected button, its info text and prev/next all read this one value.\n */\n protected readonly currentPage = computed(() => {\n const remote = this.remote();\n // Until the first response there is no total to hold the index inside.\n if (remote && !remote.loaded()) {\n return Math.max(0, this.pageIndex());\n }\n return Math.max(0, Math.min(this.pageIndex(), this.pageCount() - 1));\n });\n /** The filtered/sorted rows visible on the current page (all rows when paging is off). */\n protected readonly pagedRows = computed<any[]>(() => {\n const rows = this.displayRows();\n if (!this.pagingEnabled() || this.remote()) {\n return rows;\n }\n const ps = this.effectivePageSize();\n const pi = this.currentPage();\n return rows.slice(pi * ps, pi * ps + ps);\n });\n /**\n * dx `PagerView.isVisible` (m_pager.js): `true` always, `'auto'` only while there is more than\n * one page to move between, and never under virtual or infinite scrolling.\n */\n protected readonly pagerVisible = computed(() => {\n const p = this.pagerCmp();\n if (!p) {\n return false;\n }\n const mode = this.scrolling()?.mode;\n return (\n p.visible() === true ||\n (p.visible() === 'auto' &&\n this.pagingEnabled() &&\n this.pageCount() > 1 &&\n mode !== 'virtual' &&\n mode !== 'infinite')\n );\n });\n protected readonly pageSizes = computed<number[]>(() =>\n nxePagerPageSizes(this.pagerCmp()?.allowedPageSizes(), this.pagingCmp()?.pageSize() ?? 20),\n );\n /** dx's small mode: a page-size drop-down, and the navigation buttons whatever the option says. */\n protected readonly pagerCompact = computed(() => this.pagerCmp()?.displayMode() === 'compact');\n /** dx `getRenderPrevButton` (pages/page_index_selector.js): `!isLargeDisplayMode || showNavigationButtons`. */\n protected readonly pagerNavVisible = computed(\n () => this.pagerCompact() || !!this.pagerCmp()?.showNavigationButtons(),\n );\n /**\n * The page buttons and `. . .` separators. A linkedSignal because dx's list keeps a sliding\n * window between renders (pages/large.js): the previous window decides whether the next one\n * moves.\n */\n private readonly pagerWindow = linkedSignal<{ count: number; index: number }, NxePagerWindow>({\n source: () => ({ count: this.pageCount(), index: this.currentPage() }),\n computation: (src, prev) => nxePagerWindow(src.count, src.index, prev?.value),\n });\n protected readonly pageItems = computed(() => this.pagerWindow().items);\n\n // --- Tree-list hierarchy (dx-tree-list) -----------------------------------------------------\n /** True when the host element is `<nxe-tree-list>` (vs `<nxe-data-grid>`). */\n protected readonly treeMode =\n (this.elementRef.nativeElement as HTMLElement).tagName.toLowerCase() === 'nxe-tree-list';\n\n private readonly expandOverride = signal<ReadonlyMap<any, boolean>>(new Map());\n\n /** Tree assembled from the flat dataSource via keyExpr/parentIdExpr/rootValue. */\n private readonly treeRoots = computed<TreeNode[]>(() => {\n if (!this.treeMode) {\n return [];\n }\n const rows = this.sourceRows();\n const keyF = this.keyExpr() ?? 'id';\n const parentF = this.parentIdExpr() ?? 'parentId';\n const root = this.rootValue();\n const byKey = new Map<any, TreeNode>();\n for (const r of rows) {\n byKey.set(r[keyF], { key: r[keyF], data: r, children: [], level: 0, hasChildren: false });\n }\n const roots: TreeNode[] = [];\n for (const r of rows) {\n const node = byKey.get(r[keyF])!;\n const pk = r[parentF];\n const parent = root !== undefined && pk === root ? undefined : byKey.get(pk);\n if (parent && parent !== node) {\n parent.children.push(node);\n parent.hasChildren = true;\n } else {\n roots.push(node);\n }\n }\n const assign = (nodes: TreeNode[], lvl: number): void => {\n for (const n of nodes) {\n n.level = lvl;\n assign(n.children, lvl + 1);\n }\n };\n assign(roots, 0);\n return roots;\n });\n\n private readonly treeExpanded = computed<ReadonlySet<any>>(() => {\n const override = this.expandOverride();\n const expandAll = this.autoExpandAll();\n const seeded = new Set(this.expandedRowKeys());\n const out = new Set<any>();\n const walk = (nodes: TreeNode[]): void => {\n for (const n of nodes) {\n if (n.hasChildren) {\n const def = expandAll || seeded.has(n.key);\n if (override.get(n.key) ?? def) {\n out.add(n.key);\n }\n }\n walk(n.children);\n }\n };\n walk(this.treeRoots());\n return out;\n });\n\n protected toggleTreeNode(key: any, event: Event): void {\n event.stopPropagation();\n const expanded = this.treeExpanded().has(key);\n this.expandOverride.update((m) => new Map(m).set(key, !expanded));\n }\n\n /** Flattened group + data render rows (tree hierarchy, then grouping, then flat). */\n protected readonly renderRows = computed<GridRenderRow[]>(() => {\n if (this.treeMode) {\n this.refreshTick(); // role-tab mutates selectedRowKeys then calls .instance.refresh()\n const expanded = this.treeExpanded();\n const out: GridRenderRow[] = [];\n let idx = 0;\n const walk = (nodes: TreeNode[]): void => {\n for (const n of nodes) {\n out.push({\n kind: 'data',\n row: n.data,\n rowIndex: idx++,\n level: n.level,\n hasChildren: n.hasChildren,\n expanded: expanded.has(n.key),\n nodeKey: n.key,\n });\n if (n.hasChildren && expanded.has(n.key)) {\n walk(n.children);\n }\n }\n };\n walk(this.treeRoots());\n return out;\n }\n const groupCols = this.groupColumns();\n const rows = this.pagedRows();\n if (groupCols.length === 0) {\n return rows.map((row, i) => ({ kind: 'data', row, rowIndex: i }) as GridRenderRow);\n }\n const out: GridRenderRow[] = [];\n const items = this.groupItems();\n let dataIndex = 0;\n\n const walk = (subset: any[], level: number, parentKey: string): void => {\n const col = groupCols[level];\n const field = col.dataField();\n // Contiguous partition by group value — displayRows pre-sorts by the group chain, so\n // first-seen bucket order IS the dx group order.\n const buckets = new Map<any, any[]>();\n for (const r of subset) {\n const v = this.getRaw(r, field);\n if (!buckets.has(v)) {\n buckets.set(v, []);\n }\n buckets.get(v)!.push(r);\n }\n for (const [value, bucket] of buckets) {\n const groupKey = `${parentKey}/${level}:${typeof value}:${String(value)}`;\n const isCollapsed = !this.isGroupExpanded(groupKey);\n // dx three-way split: footer items → group footer row; alignByColumn items →\n // summary cells aligned under their column; the rest → \"(a, b)\" caption suffix.\n const alignedSums = new Map<string, string>();\n const captionParts: string[] = [];\n const footerSums = new Map<string, string>();\n for (const item of items) {\n const text = this.summaryText(item, bucket);\n if (item.showInGroupFooter()) {\n footerSums.set(this.summaryTarget(item), text);\n } else if (item.alignByColumn()) {\n alignedSums.set(this.summaryTarget(item), text);\n } else {\n captionParts.push(text);\n }\n }\n out.push({\n kind: 'group',\n level,\n column: col,\n text: this.cellText(col, bucket[0]),\n value: this.getRaw(bucket[0], col.dataField()),\n rows: bucket,\n groupKey,\n collapsed: isCollapsed,\n alignedSums,\n captionSuffix: captionParts.length ? ` (${captionParts.join(', ')})` : '',\n });\n if (!isCollapsed) {\n if (level + 1 < groupCols.length) {\n walk(bucket, level + 1, groupKey);\n } else {\n for (const r of bucket) {\n out.push({ kind: 'data', row: r, rowIndex: dataIndex++ });\n }\n }\n if (footerSums.size) {\n out.push({ kind: 'groupFooter', level, sums: footerSums });\n }\n }\n }\n };\n walk(rows, 0, '');\n return out;\n });\n\n /**\n * The dataField a group summary renders under: dx `_calculateSummaryCells` (m_summary.js:443)\n * takes `showInColumn` when it names a column, else the item's own `column`.\n *\n * Keying footers on `column()` alone put an item that names only `showInColumn` (broker's\n * `name=\"totalSumInsured\" showInColumn=\"totalSumInsured\" summaryType=\"custom\"`) under its\n * empty `column` - i.e. in whichever column happens to have no dataField.\n */\n private summaryTarget(item: NxeSummaryItemLike): string {\n const target = item.showInColumn();\n return target && this.columnByField().has(target) ? target : item.column();\n }\n\n /** Computes + formats a summary item over a set of rows. */\n private summaryText(item: NxeSummaryItemLike, rows: any[]): string {\n const field = item.column();\n let value: number;\n switch (item.summaryType()) {\n case 'custom':\n value = this.customSummaryValue(item, rows);\n break;\n case 'count':\n value = rows.length;\n break;\n case 'min':\n case 'max':\n case 'avg':\n case 'sum':\n default: {\n const nums = rows\n .map((r) => Number(this.getRaw(r, field)))\n .filter((n) => !isNaN(n));\n if (item.summaryType() === 'min') value = Math.min(...nums);\n else if (item.summaryType() === 'max') value = Math.max(...nums);\n else if (item.summaryType() === 'avg') value = nums.reduce((a, b) => a + b, 0) / (nums.length || 1);\n else value = nums.reduce((a, b) => a + b, 0);\n }\n }\n const fmt = item.valueFormat();\n const valueText =\n typeof fmt === 'string'\n ? formatNumber(value, parseNumberFormat(fmt), this.separators)\n : String(value);\n const ct = item.customizeText();\n const text = ct ? ct({ value, valueText }) : valueText;\n return item.displayFormat().replace('{0}', text);\n }\n\n /**\n * DevExtreme `calculateCustomSummary` protocol replay (orbit addition): `start`, then\n * `calculate` once per row (`options.value` = the row object, matching the app's\n * `generateSummaryFunction` which reads row properties), then `finalize`.\n */\n private customSummaryValue(item: NxeSummaryItemLike, rows: any[]): number {\n const fn = this.summaryCmp()?.calculateCustomSummary();\n if (!fn) {\n return 0;\n }\n const options: any = { name: item.name(), summaryProcess: 'start', totalValue: 0 };\n fn(options);\n options.summaryProcess = 'calculate';\n for (const row of rows) {\n options.value = row;\n fn(options);\n }\n options.summaryProcess = 'finalize';\n delete options.value;\n fn(options);\n return Number(options.totalValue) || 0;\n }\n\n protected toggleGroup(groupKey: string): void {\n const expanded = this.isGroupExpanded(groupKey);\n this.groupExpandOverride.update((m) => new Map(m).set(groupKey, !expanded));\n }\n\n protected goToPage(index: number): void {\n const next = Math.max(0, Math.min(index, this.pageCount() - 1));\n if (next !== this.pageIndex()) {\n this.pageIndex.set(next);\n // Write back so `[(pageIndex)]` reflects a page the grid moved to itself.\n this.pagingCmp()?.pageIndex.set(next);\n if (this.pageIndexModel() !== undefined || this.remote()) {\n this.pageIndexModel.set(next);\n }\n this.onOptionChanged.emit({ name: 'paging', fullName: 'paging.pageIndex', value: next });\n }\n }\n protected prevPage(): void {\n this.goToPage(this.currentPage() - 1);\n }\n protected nextPage(): void {\n this.goToPage(this.currentPage() + 1);\n }\n protected changePageSize(size: number): void {\n this.userPageSize.set(size);\n this.pageIndex.set(0);\n if (this.pageSizeModel() !== undefined || this.remote()) {\n this.pageSizeModel.set(size);\n this.pageIndexModel.set(0);\n }\n }\n protected onPageSizeSelect(event: Event): void {\n this.changePageSize(Number((event.target as HTMLSelectElement).value));\n }\n /** dx's info text, `Page {0} of {1} ({2} items)` unless `infoText` says otherwise (pagination/info.js). */\n protected readonly pageInfo = computed(() =>\n nxePagerInfoText(\n this.pagerCmp()?.infoText() ?? this.messages.t('grid.pager.info'),\n this.currentPage(),\n this.remote() ? nxePagerCount(this.pageCount(), this.separators) : this.pageCount(),\n this.remote() ? nxePagerCount(this.remote()!.totalCount(), this.separators) : this.displayRows().length,\n ),\n );\n\n // --- Runtime group state (drag-to-group backbone) --------------------------------------------\n private static readonly fieldArrayEqual = (a: readonly string[], b: readonly string[]): boolean =>\n a.length === b.length && a.every((v, i) => v === b[i]);\n\n /**\n * Declarative seed: ordered dataFields of columns declaring `groupIndex`. Custom equality so\n * unrelated column-input churn (captions, widths, lookups) can never reset runtime drag state.\n */\n private readonly declaredGroupFields = computed<readonly string[]>(\n () =>\n this.columns()\n .filter((c) => c.groupIndex() != null)\n .sort((a, b) => (a.groupIndex() ?? 0) - (b.groupIndex() ?? 0))\n .map((c) => c.dataField()),\n { equal: NxeDataGridComponent.fieldArrayEqual },\n );\n\n /**\n * THE group state — array order == group level. Runtime gestures (drag-to-group, chip\n * drag-out/reorder, clearGrouping) win until the declarative seed itself changes\n * (generic-list re-seeds `groupIndex` from localStorage through `filterResource`).\n */\n private readonly groupedFields = linkedSignal<readonly string[], readonly string[]>({\n source: () => this.declaredGroupFields(),\n computation: (seed) => seed,\n });\n\n /**\n * Per-grouped-column sort direction (dx: grouping a column sorts it ascending; clicking its\n * group-panel chip cycles asc↔desc). Pruned to the currently grouped fields so a re-grouped\n * column starts fresh at `asc`.\n */\n private readonly groupSortDir = linkedSignal<\n readonly string[],\n ReadonlyMap<string, 'asc' | 'desc'>\n >({\n source: () => this.groupedFields(),\n computation: (fields, previous) => {\n const prev = previous?.value;\n const next = new Map<string, 'asc' | 'desc'>();\n if (prev) {\n for (const field of fields) {\n const dir = prev.get(field);\n if (dir) {\n next.set(field, dir);\n }\n }\n }\n return next;\n },\n });\n\n /** Columns moved into group rows, in group-level order. */\n protected readonly groupColumns = computed(() =>\n this.groupedFields()\n .map((field) => this.columns().find((c) => c.dataField() === field))\n .filter((c): c is NxeColumnComponent => !!c),\n );\n\n /** The active sort direction of a grouped column (chip indicator + group-order comparator). */\n protected groupDir(col: NxeColumnComponent): 'asc' | 'desc' {\n return this.groupSortDir().get(col.dataField()) ?? col.sortOrder() ?? 'asc';\n }\n\n /** Chip click (dx): cycle the grouped column's sort asc↔desc — never back to none. */\n protected sortGroupColumn(col: NxeColumnComponent): void {\n const field = col.dataField();\n if (!this.groupedFields().includes(field)) {\n return;\n }\n const next = this.groupDir(col) === 'asc' ? 'desc' : 'asc';\n this.groupSortDir.update((m) => new Map(m).set(field, next));\n }\n\n /** Gesture: drag a header into the group panel — append as the last group level. */\n protected groupByColumn(col: NxeColumnComponent): void {\n const field = col.dataField();\n // allowGrouping guard here too: with allowColumnReordering on, headers are draggable\n // even when the column refuses grouping — a panel drop must then be a no-op.\n if (!field || !col.allowGrouping() || this.groupedFields().includes(field)) {\n return;\n }\n const level = this.groupedFields().length;\n // dx moves an active user sort on this column onto the group level (chip indicator).\n const current = this.sortInit() ? this.sort() : null;\n this.groupedFields.update((fields) => [...fields, field]);\n if (current?.field === field) {\n this.groupSortDir.update((m) => new Map(m).set(field, current.dir));\n this.setSort(null);\n }\n this.emitGroupIndexChange(this.columns().indexOf(col), null, level);\n }\n\n /** Gesture: drag a chip out of the group panel — remove that group level. */\n protected ungroupColumn(field: string): void {\n const fields = this.groupedFields();\n const level = fields.indexOf(field);\n if (level === -1) {\n return;\n }\n // dx keeps the column sorted when it leaves the group panel: restore its group direction\n // as the header sort — unless another column already carries the active user sort.\n const col = this.columns().find((c) => c.dataField() === field);\n const dir = col ? this.groupDir(col) : 'asc';\n this.groupedFields.set(fields.filter((f) => f !== field));\n if (!this.effectiveSort()) {\n this.setSort({ field, dir });\n }\n this.emitGroupIndexChange(\n this.columns().findIndex((c) => c.dataField() === field),\n level,\n null,\n );\n }\n\n /**\n * Gesture: reorder chips within the group panel — move a group level.\n *\n * Emission contract: generic-list's frozen handler replays each event as a positional SWAP,\n * while a chip drag is a MOVE. The two only coincide for adjacent positions, so a distance-n\n * move emits n adjacent-swap events (each adjacent swap == the corresponding move step) —\n * the replayed array converges to exactly the grid's order.\n */\n protected moveGroup(from: number, to: number): void {\n const fields = this.groupedFields();\n if (from === to || from < 0 || to < 0 || from >= fields.length || to >= fields.length) {\n return;\n }\n const next = [...fields];\n const [moved] = next.splice(from, 1);\n next.splice(to, 0, moved);\n this.groupedFields.set(next);\n const movedColumnIndex = this.columns().findIndex((c) => c.dataField() === moved);\n const step = from < to ? 1 : -1;\n for (let level = from; level !== to; level += step) {\n this.emitGroupIndexChange(movedColumnIndex, level, level + step);\n }\n }\n\n /**\n * Real dx `clearGrouping()`: ungroup everything. Removal events fire in DESCENDING level\n * order so generic-list's `splice(previousValue, 1)` replay converges to `[]`.\n */\n private clearGroupingInternal(): void {\n const fields = this.groupedFields();\n if (!fields.length) {\n return;\n }\n this.groupedFields.set([]);\n for (let level = fields.length - 1; level >= 0; level--) {\n this.emitGroupIndexChange(\n this.columns().findIndex((c) => c.dataField() === fields[level]),\n level,\n null,\n );\n }\n }\n\n private emitGroupIndexChange(\n columnIndex: number,\n previousValue: number | null,\n value: number | null,\n ): void {\n this.onOptionChanged.emit({\n name: 'columns',\n fullName: `columns[${columnIndex}].groupIndex`,\n previousValue,\n value,\n });\n }\n\n // --- Runtime column order (allowColumnReordering) + width (allowColumnResizing) overrides ----\n private readonly declaredFieldOrder = computed<readonly string[]>(\n () => this.columns().map((c) => c.dataField()),\n { equal: NxeDataGridComponent.fieldArrayEqual },\n );\n /** Runtime column order; header drag-reorder wins until the declared column set changes. */\n private readonly fieldOrder = linkedSignal<readonly string[], readonly string[]>({\n source: () => this.declaredFieldOrder(),\n computation: (seed) => seed,\n });\n\n private readonly declaredWidthsKey = computed(() =>\n this.columns()\n .map((c) => `${c.dataField()}:${c.width() ?? ''}`)\n .join('|'),\n );\n /**\n * Manual column widths (px). Populated on the first resize with a snapshot of every rendered\n * width — freezing the layout like dx — and reset when declared widths change.\n */\n private readonly widthOverride = linkedSignal<string, ReadonlyMap<string, number>>({\n source: () => this.declaredWidthsKey(),\n computation: () => new Map(),\n });\n\n /** Visible data columns: `visible`/`columnOption` honoured, grouped columns excluded. */\n protected readonly visibleColumns = computed(() => {\n const grouped = new Set(this.groupColumns());\n const filtered = this.columns().filter((c) => {\n if (grouped.has(c)) {\n return false;\n }\n const override = this.visibilityOverride().get(c.dataField());\n return override ?? c.visible();\n });\n const pos = new Map<string, number>();\n this.fieldOrder().forEach((f, i) => pos.set(f, i));\n return [...filtered].sort(\n (a, b) => (pos.get(a.dataField()) ?? 0) - (pos.get(b.dataField()) ?? 0),\n );\n });\n\n /**\n * How many header rows the band structure needs, counted over the VISIBLE tree.\n *\n * Pruning matters: a band whose every leaf is hidden or grouped away contributes no row, so\n * a grid that loses its last band collapses back to a single header row rather than keeping\n * an empty one.\n */\n protected readonly headerDepth = computed(() => {\n const visible = new Set(this.visibleColumns());\n const depthOf = (cols: readonly NxeColumnComponent[]): number => {\n let d = 0;\n for (const col of cols) {\n if (col.isBand()) {\n const inner = depthOf(col.childColumns());\n if (inner > 0) {\n d = Math.max(d, 1 + inner);\n }\n } else if (visible.has(col)) {\n d = Math.max(d, 1);\n }\n }\n return d;\n };\n return Math.max(1, depthOf(this.declaredColumns()));\n });\n\n /**\n * The header as rows of cells: bands carry `colspan`, leaves above the bottom row carry\n * `rowspan`, which is dx's own banded markup.\n */\n protected readonly headerRows = computed<NxeHeaderCell[][]>(() => {\n const visible = this.visibleColumns();\n const visibleSet = new Set(visible);\n const indexOfLeaf = new Map<NxeColumnComponent, number>();\n visible.forEach((c, i) => indexOfLeaf.set(c, i));\n\n const visibleLeaves = (col: NxeColumnComponent): number =>\n col.isBand()\n ? col.childColumns().reduce((n, c) => n + visibleLeaves(c), 0)\n : visibleSet.has(col)\n ? 1\n : 0;\n\n // Siblings render in visible-leaf order, not declaration order: a drag-reorder rewrites\n // `visibleColumns()` and the header has to follow, or the body reorders under a header\n // that did not. A band takes the position of its leftmost leaf.\n const orderOf = (col: NxeColumnComponent): number => {\n if (!col.isBand()) {\n return indexOfLeaf.get(col) ?? Number.MAX_SAFE_INTEGER;\n }\n return col.childColumns().reduce((min, c) => Math.min(min, orderOf(c)), Number.MAX_SAFE_INTEGER);\n };\n\n const depth = this.headerDepth();\n const rows: NxeHeaderCell[][] = Array.from({ length: depth }, () => []);\n const walk = (cols: readonly NxeColumnComponent[], level: number): void => {\n for (const col of [...cols].sort((a, b) => orderOf(a) - orderOf(b))) {\n const span = visibleLeaves(col);\n if (span === 0) {\n continue;\n }\n if (col.isBand()) {\n rows[level].push({\n column: col,\n colspan: span,\n rowspan: 1,\n isBand: true,\n leafIndex: null,\n });\n walk(col.childColumns(), level + 1);\n } else {\n rows[level].push({\n column: col,\n colspan: 1,\n rowspan: depth - level,\n isBand: false,\n leafIndex: indexOfLeaf.get(col) ?? null,\n });\n }\n }\n };\n walk(this.declaredColumns(), 0);\n return rows;\n });\n\n /** Drag-reorder drop: move visible column `fromVis` to insertion `slot` (dx visibleIndex). */\n protected moveColumnByVisible(fromVis: number, slot: number): void {\n const vis = this.visibleColumns();\n const moved = vis[fromVis]?.dataField();\n if (!moved) {\n return;\n }\n const target = slot > fromVis ? slot - 1 : slot;\n if (target === fromVis) {\n return;\n }\n const without = vis.filter((_, i) => i !== fromVis);\n const anchor = without[target]?.dataField() ?? null;\n const order = this.fieldOrder().filter((f) => f !== moved);\n const idx = anchor ? order.indexOf(anchor) : order.length;\n const next = [...order];\n next.splice(idx, 0, moved);\n this.fieldOrder.set(next);\n this.onOptionChanged.emit({\n name: 'columns',\n fullName: `columns[${this.columns().findIndex((c) => c.dataField() === moved)}].visibleIndex`,\n previousValue: fromVis,\n value: target,\n });\n }\n\n /** True when this header renders a resize handle on its right edge. */\n protected resizeHandleVisible(col: NxeColumnComponent, ci: number): boolean {\n if (!this.allowColumnResizing() || !col.allowResizing()) {\n return false;\n }\n return this.columnResizingMode() === 'widget' || ci < this.visibleColumns().length - 1;\n }\n\n protected startColumnResize(col: NxeColumnComponent, ci: number, event: PointerEvent): void {\n const next =\n this.columnResizingMode() === 'nextColumn' ? this.visibleColumns()[ci + 1] ?? null : null;\n this.resize.start(col.dataField(), next?.dataField() ?? null, ci, this.leadCellCount(), event);\n }\n\n /** A visible column's position, for cells rendered outside the main `@for` index. */\n protected visibleIndexOf(col: NxeColumnComponent): number {\n return this.visibleColumns().indexOf(col);\n }\n\n /** Command columns preceding the data columns — the offset dx's 1-based aria-colindex counts from. */\n protected leadCellCount(): number {\n return (\n this.groupLevelCount() +\n (this.masterDetailEnabled() ? 1 : 0) +\n (this.selectColumnVisible() ? 1 : 0)\n );\n }\n\n // dx numbers every cell of a rows-view row, command cells included (`_setCellAriaAttributes`,\n // m_columns_view.js:681-693): the group indents are 1..n, then the master-detail expander, the\n // selection column, the data columns and the edit column. Apps address cells by it - bright's\n // merge helper lifts `td[aria-colindex=\"1\"]` out of a merged row, which in a grouped grid is\n // the indent cell - so the command cells carry it too.\n /** The master-detail expander's aria-colindex: straight after the group indents. */\n protected readonly expandColIndex = computed(() => this.groupLevelCount() + 1);\n /** The selection column's aria-colindex: after the indents and the expander. */\n protected readonly selectColIndex = computed(\n () => this.groupLevelCount() + (this.masterDetailEnabled() ? 1 : 0) + 1,\n );\n /** The row-edit command column's aria-colindex: after the last data column. */\n protected readonly editColIndex = computed(\n () => this.leadCellCount() + this.visibleColumns().length + 1,\n );\n\n /** Resize commit: freeze all rendered widths (dx post-resize behavior) + emit width events. */\n private commitColumnResize(changes: { field: string; from: number; to: number }[]): void {\n const map = new Map(this.widthOverride());\n const cells = nxeHeaderLeafCells(this.elementRef.nativeElement as HTMLElement);\n this.visibleColumns().forEach((c, i) => {\n const cell = cells[i];\n if (cell) {\n map.set(c.dataField(), Math.round(cell.getBoundingClientRect().width * 100) / 100);\n }\n });\n for (const ch of changes) {\n map.set(ch.field, Math.round(ch.to * 100) / 100);\n }\n this.resizeActive = false;\n this.widthOverride.set(map);\n // dx stops redistributing after a manual resize. The auto-width pass would drop its result\n // on its next run, but nothing that run tracks has changed, so drop it now - left in place,\n // it outranks the frozen widths and the column snaps back to its auto width on release.\n this.autoWidths.set(null);\n this.lastAutoWidthKey = '';\n for (const ch of changes) {\n this.onOptionChanged.emit({\n name: 'columns',\n fullName: `columns[${this.columns().findIndex((c) => c.dataField() === ch.field)}].width`,\n previousValue: ch.from,\n value: ch.to,\n });\n }\n }\n\n protected readonly filterRowVisible = computed(\n () => this.filterRow()?.visible === true || this.filterRowCmp()?.visible() === true,\n );\n\n // --- Master-detail (dxo-master-detail, orbit addition) --------------------------------------\n protected readonly masterDetailEnabled = computed(() => this.masterDetail()?.enabled() === true);\n private readonly expandedDetails = signal<ReadonlySet<any>>(new Set());\n\n protected isDetailExpanded(row: any): boolean {\n return this.expandedDetails().has(this.rowKey(row));\n }\n\n protected toggleDetail(row: any, event: Event): void {\n event.stopPropagation();\n const key = this.rowKey(row);\n const expanding = !this.expandedDetails().has(key);\n if (expanding) {\n this.onRowExpanding.emit({ key, component: this.facade });\n }\n this.expandedDetails.update((set) => {\n const next = new Set(set);\n expanding ? next.add(key) : next.delete(key);\n return next;\n });\n if (expanding) {\n this.onRowExpanded.emit({ key, component: this.facade });\n }\n }\n\n protected detailTemplate() {\n return this.templateFor(this.masterDetail()?.template());\n }\n\n protected detailContext(row: any, rowIndex: number): { $implicit: { data: any; rowIndex: number; key: any } } {\n return { $implicit: { data: row, rowIndex, key: this.rowKey(row) } };\n }\n\n /** Group indent levels (dx renders one 30px command column per group level; grid mode only). */\n protected readonly groupLevelCount = computed(() =>\n this.treeMode ? 0 : this.groupColumns().length,\n );\n\n protected indents(count: number): number[] {\n return Array.from({ length: count }, (_, i) => i);\n }\n\n /** Visible columns from the first alignByColumn target onward — each gets its own summary td. */\n protected groupRowTrailing(item: {\n level: number;\n alignedSums: Map<string, string>;\n }): NxeColumnComponent[] {\n if (!item.alignedSums.size) {\n return [];\n }\n const cols = this.visibleColumns();\n const first = cols.findIndex((c) => item.alignedSums.has(c.dataField()));\n if (first === -1) {\n return [];\n }\n let trailing = cols.slice(first);\n // The caption cell needs at least one column of room — trim leading trailing cells\n // instead of letting the colspan clamp shift the summary alignment.\n const maxTrailing =\n this.allColCount() - item.level - 2 - (this.rowEditCommandVisible() ? 1 : 0);\n if (trailing.length > maxTrailing) {\n trailing = trailing.slice(trailing.length - Math.max(0, maxTrailing));\n }\n return trailing;\n }\n\n /** dx group-cell span: everything after the expand cell not taken by aligned summary cells. */\n protected groupCellColspan(item: { level: number; alignedSums: Map<string, string> }): number {\n const trailing = this.groupRowTrailing(item).length;\n const editTd = trailing > 0 && this.rowEditCommandVisible() ? 1 : 0;\n return Math.max(1, this.allColCount() - item.level - 1 - trailing - editTd);\n }\n\n /** Total column count including command columns (indents/checkbox/expand/edit) for colspans. */\n protected readonly allColCount = computed(\n () =>\n (this.groupLevelCount() +\n this.visibleColumns().length +\n (this.selectColumnVisible() ? 1 : 0) +\n (this.masterDetailEnabled() ? 1 : 0) +\n (this.rowEditCommandVisible() ? 1 : 0)) ||\n 1,\n );\n\n // --- Inline editing (dxo-editing, orbit addition) -------------------------------------------\n protected readonly cellEditingEnabled = computed(() => {\n const e = this.editingCmp();\n return !!e && e.mode() === 'cell' && e.allowUpdating();\n });\n protected readonly rowEditingEnabled = computed(() => {\n const e = this.editingCmp();\n return !!e && e.mode() === 'row' && e.allowUpdating();\n });\n protected readonly rowEditCommandVisible = computed(() => this.rowEditingEnabled());\n\n /** The single cell in edit mode (`cell` mode): row ref + dataField. */\n protected readonly editingCell = signal<{ row: any; field: string } | null>(null);\n /** Buffered values for the row in edit mode (`row` mode), keyed by dataField. */\n protected readonly rowEditBuffer = signal<Record<string, any>>({});\n\n protected isEditingCell(row: any, col: NxeColumnComponent): boolean {\n const c = this.editingCell();\n return !!c && c.row === row && c.field === col.dataField();\n }\n\n protected isRowEditing(row: any): boolean {\n return this.rowEditingEnabled() && this.editingCmp()?.editRowKey() === this.rowKey(row);\n }\n\n protected editableCell(col: NxeColumnComponent): boolean {\n if (col.allowEditing() === false || !col.dataField()) {\n return false;\n }\n // A `cellTemplate` cell renders its own content, so the built-in editor stays out of its\n // way. Naming an `editCellTemplate` is an explicit request to edit it anyway — which is\n // broker's dominant shape, where `customizeText`/`format` render the cell at rest and a\n // projected editor takes over on click.\n return !!col.editCellTemplate() || !col.cellTemplate();\n }\n\n protected onCellClick(row: any, col: NxeColumnComponent, event: Event): void {\n if (!this.cellEditingEnabled() || !this.editableCell(col)) {\n return;\n }\n event.stopPropagation();\n // A boolean cell already shows its editor (dx showEditorAlways); only its checkbox\n // toggles, so a click beside the box does not swap anything in.\n if (this.booleanInPlace(col)) {\n return;\n }\n this.editingCell.set({ row, field: col.dataField() });\n }\n\n /**\n * dx `readOnly: !options.setValue` (m_editing.js:210): a grid checkbox is editable only where\n * dx gives the cell a setValue - cell mode on an editable column (m_editing.js:1832-1847). Row\n * mode's resting rows stay read-only; the row being edited renders the editor instead.\n */\n protected booleanReadOnly(col: NxeColumnComponent): boolean {\n return !(this.cellEditingEnabled() && this.editableCell(col));\n }\n\n /**\n * A boolean cell that is its own editor: cell mode, editable, and no editCellTemplate asking\n * to take over. The resting checkbox toggles in place, as dx's always-shown dxCheckBox does.\n */\n protected booleanInPlace(col: NxeColumnComponent): boolean {\n return this.isBooleanCell(col) && !this.booleanReadOnly(col) && !col.editCellTemplate();\n }\n\n /** A resting boolean checkbox was clicked: toggle it when it is editable, else let it be. */\n protected onBooleanCellClick(row: any, col: NxeColumnComponent, event: Event): void {\n if (!this.booleanInPlace(col)) {\n return;\n }\n event.stopPropagation();\n this.commitCellEdit(row, col, this.getRaw(row, col.dataField()) !== true);\n }\n\n /**\n * The checkbox editor's state: the buffered value in the row being edited, else the row's.\n * Read as the native editor it replaces read it - any value but '' and 'false' is checked.\n */\n protected editorChecked(row: any, col: NxeColumnComponent): boolean {\n const text = this.editorInputValue(row, col);\n return !!text && text !== 'false';\n }\n\n /** A click or Space on the checkbox editor. Space must not scroll the page or reach the grid. */\n protected toggleEditorCheck(row: any, col: NxeColumnComponent, mode: 'cell' | 'row', event: Event): void {\n event.preventDefault();\n event.stopPropagation();\n const next = !this.editorChecked(row, col);\n mode === 'cell' ? this.commitCellEdit(row, col, next) : this.bufferRowEdit(col, next);\n }\n\n /** dx cell-mode semantics: commit to the row on blur/Enter (client-side array write-through). */\n protected commitCellEdit(row: any, col: NxeColumnComponent, rawInput: any): void {\n this.writeCell(row, col, rawInput);\n this.editingCell.set(null);\n this.refreshTick.update((v) => v + 1);\n }\n\n /** Write a cell value through the grid's own path, leaving edit state alone (dx `setValue`). */\n private writeCellValue(row: any, col: NxeColumnComponent, value: any): void {\n this.writeCell(row, col, value);\n this.refreshTick.update((v) => v + 1);\n }\n\n protected cancelCellEdit(): void {\n this.editingCell.set(null);\n }\n\n /**\n * Leave cell-edit state when focus goes somewhere outside the cell.\n *\n * The built-in editor commits on its own blur, but a projected `editCellTemplate` has no such\n * contract, so the cell needs to notice for itself. Nothing is committed here: those templates\n * write through the live row object, so leaving edit state is purely a view change.\n *\n * A projected picker opens its panel in a CDK overlay appended to `<body>`, which means focus\n * legitimately leaves the `<td>` while the edit is still going on — hence the second guard.\n */\n protected onEditCellFocusOut(row: any, col: NxeColumnComponent, event: FocusEvent): void {\n if (!col.editCellTemplate() || !this.isEditingCell(row, col)) {\n return;\n }\n const td = event.currentTarget as HTMLElement | null;\n const next = event.relatedTarget as Node | null;\n if (!td || (next && td.contains(next))) {\n return;\n }\n if (document.querySelector('.cdk-overlay-container')?.hasChildNodes()) {\n return;\n }\n this.editingCell.set(null);\n }\n\n private writeCell(row: any, col: NxeColumnComponent, rawInput: any): void {\n const field = col.dataField();\n let value: any = rawInput;\n if (this.colType(col) === 'number' && typeof rawInput === 'string') {\n const n = Number(rawInput.replace(/,/g, ''));\n value = rawInput.trim() === '' || isNaN(n) ? null : n;\n }\n if (field.includes('.')) {\n const parts = field.split('.');\n const last = parts.pop()!;\n const target = parts.reduce((o: any, k) => (o == null ? o : o[k]), row);\n if (target != null) {\n target[last] = value;\n }\n return;\n }\n row[field] = value;\n }\n\n protected startRowEdit(row: any, event: Event): void {\n event.stopPropagation();\n this.editingCmp()?.editRowKey.set(this.rowKey(row));\n this.rowEditBuffer.set({});\n }\n\n protected bufferRowEdit(col: NxeColumnComponent, rawInput: any): void {\n this.rowEditBuffer.update((b) => ({ ...b, [col.dataField()]: rawInput }));\n }\n\n /** dx row-mode Save: apply the buffer to the row and record an `update` change. */\n protected saveRowEdit(row: any, event: Event): void {\n event.stopPropagation();\n const editing = this.editingCmp();\n if (!editing) {\n return;\n }\n const buffer = this.rowEditBuffer();\n const data: Record<string, any> = {};\n for (const [field, raw] of Object.entries(buffer)) {\n const col = this.columns().find((c) => c.dataField() === field);\n if (col) {\n this.writeCell(row, col, raw);\n data[field] = this.getRaw(row, field);\n }\n }\n if (Object.keys(data).length) {\n editing.changes.update((list) => [\n ...list.filter((c) => !(c.type === 'update' && c.key === this.rowKey(row))),\n { type: 'update', key: this.rowKey(row), data },\n ]);\n }\n editing.editRowKey.set(null);\n this.rowEditBuffer.set({});\n this.refreshTick.update((v) => v + 1);\n }\n\n protected cancelRowEdit(event: Event): void {\n event.stopPropagation();\n this.editingCmp()?.editRowKey.set(null);\n this.rowEditBuffer.set({});\n }\n\n protected editorInputValue(row: any, col: NxeColumnComponent): string {\n if (this.isRowEditing(row)) {\n const buffered = this.rowEditBuffer()[col.dataField()];\n if (buffered !== undefined) {\n return String(buffered);\n }\n }\n const raw = this.getRaw(row, col.dataField());\n return raw == null ? '' : String(raw);\n }\n\n // --- Cell merge (`[mergeColumns]`, orbit addition) ------------------------------------------\n /**\n * Rowspan map over `renderRows`: `\"<renderIndex>:<field>\"` → span (>1 = merged head,\n * 0 = suppressed continuation, absent = normal cell). Hierarchical: a value break in an\n * earlier merge column breaks all later ones; group/detail rows break every run.\n */\n protected readonly mergeSpans = computed<ReadonlyMap<string, number>>(() => {\n const fields = this.mergeColumns();\n const map = new Map<string, number>();\n if (!fields.length) {\n return map;\n }\n const rows = this.renderRows();\n // runStart[f] = renderRows index where the current run for field f began.\n const runStart = new Map<string, number>();\n const runLength = new Map<string, number>();\n const flush = (field: string): void => {\n const start = runStart.get(field);\n const len = runLength.get(field) ?? 0;\n if (start !== undefined && len > 1) {\n map.set(`${start}:${field}`, len);\n for (let i = start + 1; i < start + len; i++) {\n map.set(`${i}:${field}`, 0);\n }\n }\n runStart.delete(field);\n runLength.delete(field);\n };\n let prevRow: any = null;\n rows.forEach((item, idx) => {\n if (item.kind !== 'data') {\n fields.forEach(flush);\n prevRow = null;\n return;\n }\n let broken = false;\n for (const field of fields) {\n const same =\n !broken &&\n prevRow != null &&\n this.getRaw(prevRow, field) === this.getRaw(item.row, field) &&\n this.getRaw(item.row, field) != null &&\n this.getRaw(item.row, field) !== '';\n if (same) {\n runLength.set(field, (runLength.get(field) ?? 1) + 1);\n } else {\n broken = true;\n flush(field);\n runStart.set(field, idx);\n runLength.set(field, 1);\n }\n }\n prevRow = item.row;\n });\n fields.forEach(flush);\n return map;\n });\n\n protected mergeSpan(renderIndex: number, col: NxeColumnComponent): number | null {\n if (!this.mergeColumns().includes(col.dataField())) {\n return null;\n }\n return this.mergeSpans().get(`${renderIndex}:${col.dataField()}`) ?? null;\n }\n\n protected isMergeSuppressed(renderIndex: number, col: NxeColumnComponent): boolean {\n return this.mergeSpan(renderIndex, col) === 0;\n }\n\n private readonly columnByField = computed<ReadonlyMap<string, NxeColumnComponent>>(() => {\n const map = new Map<string, NxeColumnComponent>();\n for (const c of this.columns()) {\n map.set(c.dataField(), c);\n }\n return map;\n });\n\n private readonly filterRowPredicate = computed<((row: any) => boolean) | null>(() => {\n const state = this.filterRowState();\n if (!state.size) {\n return null;\n }\n const byField = this.columnByField();\n const matchers: ((row: any) => boolean)[] = [];\n for (const [field, entry] of state) {\n const col = byField.get(field);\n if (!col) {\n continue;\n }\n const matcher = this.buildFilterRowMatcher(col, entry);\n if (matcher) {\n matchers.push(matcher);\n }\n }\n return matchers.length ? (row) => matchers.every((m) => m(row)) : null;\n });\n\n /** Builds one column's filter-row matcher; null when the entry has no effective value yet. */\n private buildFilterRowMatcher(\n col: NxeColumnComponent,\n entry: FilterRowEntry,\n ): ((row: any) => boolean) | null {\n const kind = this.frEditorKind(col);\n const t1 = entry.text.trim();\n const t2 = (entry.text2 ?? '').trim();\n if (!t1 && !t2) {\n return null;\n }\n if (kind === 'lookup' || kind === 'boolean') {\n // select editors: dx filters by '=' on the raw value; 'false' must NOT match blanks\n return (row) => {\n const raw = this.getRaw(row, col.dataField());\n if (kind === 'boolean') {\n return t1 === 'true' ? raw === true : raw === false;\n }\n return String(raw ?? '') === t1;\n };\n }\n if (kind === 'number') {\n const v1 = t1 ? Number(t1.replace(/,/g, '')) : null;\n const v2 = t2 ? Number(t2.replace(/,/g, '')) : null;\n if ((t1 && Number.isNaN(v1)) || (t2 && Number.isNaN(v2))) {\n return null; // dx applies nothing until the editor holds a valid number\n }\n return (row) => {\n const raw = this.getRaw(row, col.dataField());\n const n = raw == null || raw === '' ? null : Number(raw);\n if (n == null || Number.isNaN(n)) {\n return entry.op === '<>';\n }\n return this.matchScalar(entry.op, n, v1, v2);\n };\n }\n if (kind === 'date') {\n const d1 = t1 ? this.dayKey(t1) : null;\n const d2 = t2 ? this.dayKey(t2) : null;\n if ((t1 && !d1) || (t2 && !d2)) {\n return null;\n }\n return (row) => {\n const raw = this.getRaw(row, col.dataField());\n const day = raw == null || raw === '' ? null : this.dayKey(raw);\n if (!day) {\n return entry.op === '<>';\n }\n // dx expands date '=' to the whole day — day keys compare lexicographically.\n return this.matchScalar(entry.op, day, d1, d2);\n };\n }\n // string operations, case-insensitive over the displayed text\n const q = t1.toLowerCase();\n return (row) => {\n const text = this.cellText(col, row).toLowerCase();\n switch (entry.op) {\n case 'notcontains':\n return !text.includes(q);\n case 'startswith':\n return text.startsWith(q);\n case 'endswith':\n return text.endsWith(q);\n case '=':\n return text === q;\n case '<>':\n return text !== q;\n default:\n return text.includes(q);\n }\n };\n }\n\n private matchScalar<T extends number | string>(\n op: NxeFilterOp,\n value: T,\n v1: T | null,\n v2: T | null,\n ): boolean {\n switch (op) {\n case '<>':\n return value !== v1;\n case '<':\n return v1 != null && value < v1;\n case '<=':\n return v1 != null && value <= v1;\n case '>':\n return v1 != null && value > v1;\n case '>=':\n return v1 != null && value >= v1;\n case 'between':\n return (v1 == null || value >= v1) && (v2 == null || value <= v2);\n default:\n return value === v1;\n }\n }\n\n private dayKey(raw: any): string | null {\n const dt = parseDateValue(raw);\n return dt ? dt.toFormat('yyyy-MM-dd') : null;\n }\n\n /**\n * The applied header filters: runtime overrides win; untouched columns fall back to their\n * declarative `filterValues` seed. Values are normalized through `hfKey`.\n */\n private readonly effectiveHeaderFilters = computed<ReadonlyMap<string, ReadonlySet<any>>>(() => {\n const out = new Map<string, ReadonlySet<any>>();\n const override = this.hfOverride();\n for (const col of this.columns()) {\n const field = col.dataField();\n if (!field || out.has(field)) {\n continue;\n }\n if (override.has(field)) {\n const set = override.get(field);\n if (set) {\n out.set(field, set);\n }\n } else {\n const seed = col.filterValues();\n if (seed?.length) {\n out.set(field, new Set(seed.map((v) => this.hfKey(col, v))));\n }\n }\n }\n return out;\n });\n\n private readonly headerFilterPredicate = computed<((row: any) => boolean) | null>(() => {\n const hf = this.effectiveHeaderFilters();\n if (!hf.size) {\n return null;\n }\n const byField = this.columnByField();\n const entries = [...hf].map(([field, set]) => ({ field, set, col: byField.get(field) }));\n return (row) =>\n entries.every(({ field, set, col }) =>\n set.has(col ? this.hfKey(col, this.getRaw(row, field)) : this.getRaw(row, field)),\n );\n });\n\n /** dataSource → filter-row filters → header filters (sorting happens in `displayRows`). */\n private readonly filteredRows = computed<any[]>(() => {\n this.refreshTick();\n let rows = this.sourceRows();\n if (this.remote()) {\n return rows; // the server has filtered\n }\n const rowFilter = this.filterRowPredicate();\n if (rowFilter) {\n rows = rows.filter(rowFilter);\n }\n const hf = this.headerFilterPredicate();\n if (hf) {\n rows = rows.filter(hf);\n }\n return rows;\n });\n\n /**\n * dx sort semantics: grouped columns lead the sort expression in level order (each by its\n * group direction), then the user/declarative sort applies WITHIN the innermost groups.\n * Ungrouped grids keep the single-column behavior unchanged.\n */\n protected readonly displayRows = computed<any[]>(() => {\n const rows = this.filteredRows();\n const chain: SortState[] = [];\n if (!this.treeMode) {\n for (const col of this.groupColumns()) {\n chain.push({ field: col.dataField(), dir: this.groupDir(col) });\n }\n }\n const user = this.remote() ? null : this.effectiveSort(); // a remote source arrives sorted\n if (user && !chain.some((s) => s.field === user.field)) {\n chain.push(user);\n }\n if (!chain.length) {\n return rows;\n }\n return [...rows].sort((a, b) => {\n for (const s of chain) {\n const r = this.compare(this.getRaw(a, s.field), this.getRaw(b, s.field));\n if (r !== 0) {\n return s.dir === 'asc' ? r : -r;\n }\n }\n return 0;\n });\n });\n\n protected readonly loading = computed(\n () =>\n (this.dataSource() == null || this.remote()?.loading() === true) &&\n this.loadPanel()?.enabled !== false,\n );\n /** A remote request is in flight over rows already on screen: the overlay, not the empty-body spinner. */\n protected readonly remoteBusy = computed(() => !!this.remote() && this.loading() && !this.isEmpty());\n protected readonly remoteFailed = computed(() => this.remote()?.error() != null);\n\n protected retryRemote(): void {\n this.remote()?.reload();\n }\n\n /**\n * dx `isEmpty()` = `!items().length` (m_data_controller.js:1044-1046), toggled as `dx-empty`\n * on the rows view in `_renderCore` (m_rows_view.js:710) whether loading or not.\n *\n * Keyed on `renderRows` - what the `<tbody>` iterates, dx's `items()` - not `displayRows`. The\n * two agree for flat and grouped grids (`pagedRows` clamps the page), but a tree list builds\n * `renderRows` from the unfiltered source while `displayRows` applies the filters, so a tree\n * whose filter matches nothing still renders rows and must not also show an empty body.\n */\n protected readonly isEmpty = computed(() => this.renderRows().length === 0);\n\n // --- Free-space row (dx m_rows_view.js updateFreeSpaceRowHeight, :816-861) --------------------\n /**\n * What the last reading of this grid's own layout found.\n *\n * - `bounded` is dx's `hasHeight`: the rows view is sized by the grid, not by its rows.\n * - `room` is dx's `elementHeightWithoutScrollbar - contentHeight` (m_rows_view.js:840-842): the\n * rows view's inner height less the table as it stands with the free-space row empty and the\n * last row keeping its line. Neither the row's height nor the last-row-border state changes\n * it, so what it decides cannot change the next reading.\n * - `fill` is dx's `resultHeight` (:844-848): the height that leaves the table 1px short of\n * the rows view (`_getHeightCorrection`, 1 in Chrome).\n * - `rowHeight` is dx's `_rowHeight`, the average rendered row. It sizes the gap that a short\n * last page leaves.\n */\n private readonly freeSpaceMeasure = signal(\n { bounded: false, room: 0, fill: 0, rowHeight: 0 },\n {\n equal: (a, b) =>\n a.bounded === b.bounded &&\n Math.abs(a.room - b.room) < 0.01 &&\n Math.abs(a.fill - b.fill) < 0.01 &&\n Math.abs(a.rowHeight - b.rowHeight) < 0.01,\n },\n );\n\n /**\n * dx's three cases, in its order:\n * - no rows: the row shows at 0px, so the last row keeps no border to lose (:857-860);\n * - a bounded grid whose rows leave room: the row fills it, less the 1px dx subtracts in\n * Chrome (`_getHeightCorrection`), and column lines run to the bottom (:837-855);\n * - an unbounded grid on a short page of several: the row holds the missing rows' height, so\n * the grid keeps its height from page to page (:823-835).\n *\n * `visible` drives the last row's border in a bordered grid (`_updateLastRowBorder`, :931-937).\n */\n private readonly freeSpace = computed<{ height: number; visible: boolean }>(() => {\n if (this.isEmpty()) {\n return { height: 0, visible: true };\n }\n const m = this.freeSpaceMeasure();\n if (m.bounded) {\n return m.room > 0\n ? { height: Math.max(0, m.fill), visible: true }\n : { height: 0, visible: false };\n }\n const missing = this.effectivePageSize() - this.pagedRows().length;\n const mode = this.scrolling()?.mode;\n if (\n !this.treeMode &&\n this.pagingEnabled() &&\n missing > 0 &&\n this.pageCount() > 1 &&\n mode !== 'virtual' &&\n mode !== 'infinite'\n ) {\n return { height: missing * m.rowHeight, visible: true };\n }\n return { height: 0, visible: false };\n });\n protected readonly freeSpaceHeight = computed(() => this.freeSpace().height);\n protected readonly freeSpaceVisible = computed(() => this.freeSpace().visible);\n\n /**\n * One reading of the rows view, from the ResizeObserver that watches it and its table.\n *\n * dx hides the free-space row and then measures (m_rows_view.js:837-848). This reading cannot\n * hide it - that would shrink the document and could clamp its scroll position - so it takes\n * the row's part of the table back out arithmetically, from quantities that do not move with\n * what the reading decides:\n *\n * - The row's box comes out whole: the height it was given, or with none, its halves of the\n * collapsed borders above and below it (0.5px under a last row with a 1px frame).\n * - With no free space shown, a bordered grid's last row gives its line to the box\n * (`nxe-last-row-border`, `border-bottom-width:0`), which makes the table a line shorter.\n * That line is put back, at the grid's line width, so the answer is the same either way.\n *\n * Read naively off the table, either one feeds back: the half-line reads as room, which shows\n * the row, which gives the line back, which removes the room - a flip every frame - and a\n * filled row in a rows view that hugs its table reads as its own room, 1px less each time.\n *\n * The second case gets its own rule. A rows view that hugs its table while the row adds height\n * of its own is sized by that row, so it has no room, whatever `height` says: the row lets go\n * at once. (A bounded grid resized to exactly its table height less the 1px lands here too, and\n * fills again on the next reading.)\n *\n * Whether the grid is bounded (dx `hasHeight`): an explicit `height` other than 'auto' always\n * is (m_grid_view.js:597-604, `isHeightSpecified`), even a percentage that resolves to auto,\n * and then has no room while its rows view hugs. Otherwise a rows view that does not hug is\n * bounded by CSS, and one that hugs while the row holds free space is not, so a grid that\n * loses its height lets go of the space. When they coincide with no free space held (an exact\n * fit), the previous answer stands.\n */\n private measureFreeSpace(rowsView: HTMLElement, table: HTMLTableElement): void {\n const tbody = table.tBodies[0];\n const fsRow = tbody?.lastElementChild;\n if (\n !(fsRow instanceof HTMLTableRowElement) ||\n !fsRow.classList.contains('nxe-freespace-row') ||\n this.isEmpty()\n ) {\n return;\n }\n const prev = this.freeSpaceMeasure();\n const last = fsRow.previousElementSibling;\n // The collapsed borders above and below the row: the last row's line, and the total\n // footer's top line when there is one (the table's own edge otherwise, which has none).\n const above = Math.max(nxeRowEdge(last, 'bottom'), nxeRowEdge(fsRow, 'top'));\n const below = Math.max(nxeRowEdge(fsRow, 'bottom'), nxeRowEdge(table.tFoot?.rows[0], 'top'));\n // The last row's line as it is with free space shown. The last-row-border rule strips it\n // to 0 only on a data row; it is drawn at the grid's line width.\n let line = above;\n if (rowsView.classList.contains('nxe-last-row-border') && last?.classList.contains('nxe-data-row')) {\n const token = parseFloat(getComputedStyle(rowsView).getPropertyValue('--nxe-ui-grid-line-width'));\n line = Number.isFinite(token) ? token : 1;\n }\n const fsHeight = fsRow.getBoundingClientRect().height;\n // The row adds height of its own, beyond its halves of the borders around it.\n const holding = fsHeight > (above + below) / 2 + 0.01;\n const tableHeight = table.getBoundingClientRect().height;\n // Everything but the free-space row, the last row keeping its line: dx's `rowsHeight`.\n const rowsHeight = tableHeight - fsHeight - above / 2 + line / 2;\n // And with the row empty: dx's `contentHeight`.\n const contentHeight = rowsHeight + (line + below) / 2;\n // Less borders and a horizontal scrollbar: dx's `elementHeightWithoutScrollbar`.\n const inner =\n rowsView.getBoundingClientRect().height - (rowsView.offsetHeight - rowsView.clientHeight);\n const h = this.heightStyle();\n const hugging = Math.abs(inner - tableHeight) < 0.5;\n const bounded = (h !== null && h !== 'auto') || (hugging ? prev.bounded && !holding : true);\n const rows = tbody.rows.length - 1;\n this.freeSpaceMeasure.set({\n bounded,\n room: hugging && holding ? 0 : inner - contentHeight,\n fill: inner - rowsHeight - 1,\n rowHeight: rows > 0 ? (tbody.getBoundingClientRect().height - fsHeight) / rows : prev.rowHeight,\n });\n }\n\n /**\n * dx `updateColumnDataTypes` (m_columns_controller.js:914-977): a column with no declared\n * `dataType` takes the type of its values, and mixed values make it 'string'.\n *\n * A lookup column is typed by its DISPLAY values - dx's `lookup.dataType`, which is what dx\n * aligns, formats and edits a lookup by (:901) - and a value with no lookup match contributes\n * nothing: dx's `lookup.calculateCellValue` returns `valueMap[value]`, undefined for a missing\n * key, so `getValueDataType` skips it (:946). A not-yet-loaded list must not type the column.\n *\n * Once inferred, a type sticks. dx infers only while `dataType` is unset (:935) and stops once\n * every column is typed (:289), so a later load of mixed values cannot flip a column; the\n * previous value of this linkedSignal carries that. The refresh tick is in the source because\n * rows mutated in place (inline editing, `refresh()`) can type a column that was all blanks.\n *\n * dx samples the loaded page (or the first group's leaves); this scans the client array,\n * which only differs when the types are mixed beyond that sample.\n */\n private readonly inferredTypes = linkedSignal<\n { rows: readonly any[]; cols: readonly NxeColumnComponent[] },\n ReadonlyMap<NxeColumnComponent, { field: string; type: NxeColType }>\n >({\n source: () => {\n this.refreshTick();\n return { rows: this.sourceRows(), cols: this.columns() };\n },\n computation: ({ rows, cols }, previous) => {\n const out = new Map<NxeColumnComponent, { field: string; type: NxeColType }>();\n for (const col of cols) {\n const kept = previous?.value.get(col);\n // A rebound dataField is a different column as far as its values are concerned.\n if (kept && kept.field === col.dataField()) {\n out.set(col, kept);\n }\n }\n if (!rows.length) {\n return out;\n }\n for (const col of cols) {\n const field = col.dataField();\n if (out.has(col) || col.dataType() || !field) {\n continue;\n }\n const display = this.lookupDisplayMap(col);\n let type: NxeColType | undefined;\n for (const row of rows) {\n let value = this.getRaw(row, field);\n if (display) {\n if (!display.has(value)) {\n continue;\n }\n value = display.get(value);\n }\n const valueType = nxeValueDataType(value);\n type = type ?? valueType;\n if (type && valueType && type !== valueType) {\n type = 'string';\n break;\n }\n }\n if (type) {\n out.set(col, { field, type });\n }\n }\n return out;\n },\n });\n\n /** A lookup's value → raw display value, first match winning as in `lookupText`; null without one. */\n private lookupDisplayMap(col: NxeColumnComponent): Map<unknown, unknown> | null {\n const lookup = col.lookup();\n if (!lookup) {\n return null;\n }\n const valueExpr = lookup.valueExpr ?? 'lovCode';\n const displayExpr = lookup.displayExpr ?? 'lovName';\n const map = new Map<unknown, unknown>();\n for (const item of lookup.dataSource ?? []) {\n const key = nxeResolveExpr(valueExpr, item);\n if (!map.has(key)) {\n map.set(key, nxeResolveExpr(displayExpr, item));\n }\n }\n return map;\n }\n\n /**\n * The column's effective type - its declared `dataType`, else the inferred one - which is what\n * dx's `column.dataType` holds after inference. Every type-driven decision reads this, never\n * `col.dataType()` directly, or an undeclared column would behave as text in one place and\n * as a number in the next.\n */\n protected colType(col: NxeColumnComponent): NxeColType | undefined {\n return col.dataType() ?? this.inferredTypes().get(col)?.type;\n }\n\n /** The active sort: an explicit user click, else the first column declaring `sortOrder`. */\n private effectiveSort(): SortState | null {\n const bound = this.sortModel();\n if (bound !== undefined) {\n const first = bound[0];\n return first ? { field: first.selector, dir: first.desc ? 'desc' : 'asc' } : null;\n }\n if (this.sortInit()) {\n return this.sort();\n }\n const sorted = this.columns().find((c) => c.sortOrder());\n if (sorted) {\n return { field: sorted.dataField(), dir: sorted.sortOrder()! };\n }\n const remote = this.remote();\n const initial = remote ? untracked(() => remote.options().sort[0]) : undefined;\n return initial ? { field: initial.selector, dir: initial.desc ? 'desc' : 'asc' } : null;\n }\n\n /** A user sort change: the grid's own state, and the controlled `sort` when it is in play. */\n private setSort(next: SortState | null): void {\n this.sortInit.set(true);\n this.sort.set(next);\n if (this.sortModel() !== undefined || this.remote()) {\n this.sortModel.set(next ? [{ selector: next.field, desc: next.dir === 'desc' }] : []);\n }\n }\n\n // --- Rendering helpers -----------------------------------------------------------------------\n\n /**\n * dx `getAlignmentByDataType` (m_columns_controller_utils.js) over the effective type:\n * number right, boolean centre, everything else left. A lookup aligns by its display text\n * (dx `lookup.dataType`, :901), which is text - so left, even over numeric codes.\n */\n /**\n * Columns whose cellTemplate draws a check box (nxe-check-box, mat-checkbox, a native\n * checkbox input or anything with role=checkbox). align() centres them like a boolean column,\n * header and cells, unless the column asks for center or right. dx centres only by dataType,\n * so a template check box over non-boolean data (or no dataField) would sit at the left there;\n * a check box reads as a boolean whatever feeds it, so here it is centred too.\n *\n * Sticky, as an inferred type is: a column that drew a check box keeps its alignment when a\n * filter or an empty page leaves no row to look at. A column that goes away drops out.\n */\n private readonly templateCheckboxColumns = signal<ReadonlySet<NxeColumnComponent>>(new Set());\n\n private detectTemplateCheckboxColumns(): void {\n const cols = this.visibleColumns();\n const current = this.templateCheckboxColumns();\n let next: Set<NxeColumnComponent> | null = null;\n for (const col of current) {\n if (!cols.includes(col)) {\n (next ??= new Set(current)).delete(col);\n }\n }\n const candidates = cols.filter((c) => !!c.cellTemplate() && !current.has(c));\n if (candidates.length) {\n const host = this.elementRef.nativeElement as HTMLElement;\n // This grid's own table and rows: a nested master-detail grid's come later, and its\n // rows live in a master-detail row, never in one of these data rows' cells' place.\n const table = host.querySelector<HTMLTableElement>('.nxe-datagrid-content > .nxe-datagrid-table');\n // A few rows are enough to know what a template draws, and keep this cheap on long pages.\n const rows = table\n ? Array.from(table.querySelectorAll<HTMLTableRowElement>(':scope > tbody > tr.nxe-data-row')).slice(0, 20)\n : [];\n const lead = this.leadCellCount();\n for (const col of candidates) {\n const index = lead + cols.indexOf(col) + 1;\n const drawsCheckbox = rows.some((tr) =>\n tr.querySelector(\n `:scope > td[aria-colindex=\"${index}\"] :is(nxe-check-box, mat-checkbox, input[type=\"checkbox\"], [role=\"checkbox\"])`,\n ),\n );\n if (drawsCheckbox) {\n (next ??= new Set(current)).add(col);\n }\n }\n }\n if (next) {\n this.templateCheckboxColumns.set(next);\n }\n }\n\n /** Boolean data (declared or inferred) or a cellTemplate seen drawing a check box. */\n private isCheckboxColumn(col: NxeColumnComponent): boolean {\n return (this.colType(col) === 'boolean' && !col.lookup()) || this.templateCheckboxColumns().has(col);\n }\n\n protected align(col: NxeColumnComponent): string {\n const a = col.alignment();\n // A check box column - boolean data, or a cellTemplate that draws a check box - is centred,\n // header and cells, unless it asks for center or right. 'left' counts as the default here:\n // apps bind alignment=\"left\" onto every column that has none of its own (Bright's generic\n // list does), and that must not pin a check box to the left.\n if (a !== 'center' && a !== 'right' && this.isCheckboxColumn(col)) {\n return 'center';\n }\n if (a) {\n return a;\n }\n if (col.lookup()) {\n return 'left';\n }\n switch (this.colType(col)) {\n case 'number':\n return 'right';\n case 'boolean':\n return 'center';\n default:\n return 'left';\n }\n }\n\n /**\n * The filter cell's text-align: dx sets the filter editor's input to the column alignment\n * unless it is centre (m_filter_row.js:390-395).\n */\n protected filterCellAlign(col: NxeColumnComponent): string | null {\n const a = this.align(col);\n return a === 'center' ? null : a;\n }\n\n protected colWidth(col: NxeColumnComponent): string | null {\n const manual = this.widthOverride().get(col.dataField());\n if (manual != null) {\n return `${manual}px`;\n }\n const w = col.width();\n if (w == null) {\n return null;\n }\n return typeof w === 'number' ? `${w}px` : /^\\d+$/.test(w) ? `${w}px` : w;\n }\n\n protected getRaw(row: any, dataField: string): any {\n if (!dataField || row == null) {\n return undefined;\n }\n if (dataField.includes('.')) {\n return dataField.split('.').reduce((o: any, k) => (o == null ? o : o[k]), row);\n }\n return row[dataField];\n }\n\n /**\n * dx `showEditorAlways` (m_columns_controller.js:912): a boolean-typed column - declared or\n * inferred - renders a checkbox, unless it is a lookup or has its own cellTemplate. Decided\n * per column, not per value: a column whose values are mixed infers 'string' and shows text,\n * as in dx.\n */\n protected isBooleanCell(col: NxeColumnComponent): boolean {\n return this.colType(col) === 'boolean' && !col.lookup() && !col.cellTemplate();\n }\n\n /** Resolve the displayed cell text: lookup > customizeText > dataType/format > raw string. */\n protected cellText(col: NxeColumnComponent, row: any): string {\n const raw = this.getRaw(row, col.dataField());\n const valueText = this.lookupText(col, raw) ?? this.defaultFormat(col, raw);\n const ct = col.customizeText();\n return ct ? ct({ value: raw, valueText }) : valueText;\n }\n\n /** Column `lookup` resolution (orbit addition): raw value → display text via the lookup list. */\n private lookupText(col: NxeColumnComponent, raw: any): string | null {\n const lookup = col.lookup();\n if (!lookup || raw == null) {\n return null;\n }\n const valueExpr = lookup.valueExpr ?? 'lovCode';\n const displayExpr = lookup.displayExpr ?? 'lovName';\n const match = (lookup.dataSource ?? []).find(\n (item: any) => nxeResolveExpr(valueExpr, item) === raw,\n );\n return match ? nxeResolveText(displayExpr, match) || String(raw) : String(raw);\n }\n\n private defaultFormat(col: NxeColumnComponent, raw: any): string {\n // The locale is read here so a language switch re-renders date cells (month names).\n return nxeDefaultFormat(this.colType(col), col.format(), raw, this.separators, this.messages.locale());\n }\n\n protected templateFor(name: string | undefined) {\n if (!name) {\n return null;\n }\n return this.templates().find((t) => t.name() === name)?.templateRef ?? null;\n }\n\n protected cellContext(row: any, rowIndex: number, columnIndex: number, col: NxeColumnComponent): {\n $implicit: NxeCellInfo;\n } {\n const value = this.getRaw(row, col.dataField());\n return {\n $implicit: {\n data: row,\n rowIndex,\n columnIndex,\n value,\n displayValue: value,\n text: this.cellText(col, row),\n key: row,\n column: { dataField: col.dataField(), caption: col.caption() },\n },\n };\n }\n\n protected editCellContext(\n row: any,\n rowIndex: number,\n columnIndex: number,\n col: NxeColumnComponent,\n ): { $implicit: NxeEditCellInfo } {\n const value = this.getRaw(row, col.dataField());\n // Captured now rather than read inside setValue: which write path applies is decided by\n // the state the template was rendered in, and `cell` mode clears `editingCell` on commit.\n const cellMode = this.isEditingCell(row, col);\n return {\n $implicit: {\n data: row,\n key: this.rowKey(row),\n value,\n displayValue: value,\n text: this.cellText(col, row),\n rowIndex,\n columnIndex,\n column: {\n dataField: col.dataField(),\n caption: col.caption(),\n dataType: this.colType(col),\n format: col.format(),\n },\n // dx's setValue changes the cell value; it does not end the edit. The editor\n // closes when focus leaves, which `onEditCellFocusOut` handles. Committing here\n // instead would also fight the click that triggered it: clearing the edit state\n // mid-dispatch lets the same event bubble to the cell and reopen it.\n setValue: (newValue: any) =>\n cellMode ? this.writeCellValue(row, col, newValue) : this.bufferRowEdit(col, newValue),\n component: this.facade,\n },\n };\n }\n\n protected groupCellContext(item: {\n column: NxeColumnComponent;\n text: string;\n value: any;\n rows: readonly any[];\n level: number;\n captionSuffix: string;\n }): { $implicit: NxeGroupCellInfo } {\n return {\n $implicit: {\n data: [...item.rows],\n key: item.value,\n value: item.value,\n displayValue: item.text,\n // What the grid would have rendered, suffix included, so a template can decorate\n // the default rather than having to rebuild it.\n text: `${item.column.caption()}: ${item.text}${item.captionSuffix}`,\n groupIndex: item.level,\n columnIndex: this.columns().indexOf(item.column),\n column: { dataField: item.column.dataField(), caption: item.column.caption() },\n component: this.facade,\n },\n };\n }\n\n /**\n * dx `onCellPrepared` / `onRowPrepared`.\n *\n * Emitted from a render hook rather than an effect, because the payload carries the real\n * `<td>`: it cannot exist before the DOM does. `afterRenderEffect` is the sanctioned\n * primitive for that here, and the walk runs inside `untracked()` so a handler that happens\n * to read a signal cannot enrol it in this hook's dependency set — the invisible-dependency\n * failure the `effect()` ban exists to prevent.\n */\n private emitPreparedEvents(): void {\n if (!this.onCellPrepared.observed && !this.onRowPrepared.observed) {\n return;\n }\n // A handler that writes a signal schedules another render, and therefore another\n // emission. dx re-fires on repaint too and the merge helpers are idempotent, but a\n // pathological handler should fail safe rather than hang the tab.\n if (this.preparedDepth > 0) {\n return;\n }\n const host = this.elementRef.nativeElement as HTMLElement;\n const table = host.querySelector<HTMLTableElement>(\n '.nxe-datagrid-content > .nxe-datagrid-table',\n );\n if (!table) {\n return;\n }\n // Own rows only: a nested master-detail grid renders its own rows deeper inside a cell,\n // and section.parentElement === table is what separates them.\n const rows = Array.from(table.querySelectorAll<HTMLTableRowElement>('tr')).filter(\n (tr) => tr.parentElement?.parentElement === table,\n );\n const cols = this.visibleColumns();\n const dataItems = this.renderRows().filter((r) => r.kind === 'data');\n const groupItems = this.renderRows().filter((r) => r.kind === 'group');\n\n this.preparedDepth++;\n try {\n let dataSeen = 0;\n let groupSeen = 0;\n for (const tr of rows) {\n const rowType = nxeRowTypeOf(tr);\n if (!rowType) {\n continue;\n }\n let info: NxeRowInfo;\n if (rowType === 'data') {\n const item = dataItems[dataSeen++] as { row: any; rowIndex: number } | undefined;\n info = {\n rowType,\n data: item?.row,\n key: item ? this.rowKey(item.row) : undefined,\n rowIndex: item?.rowIndex ?? -1,\n isSelected: item ? this.isSelected(item.row) : false,\n };\n } else if (rowType === 'group') {\n const item = groupItems[groupSeen++] as\n | { rows: readonly any[]; value: any; level: number; collapsed: boolean }\n | undefined;\n info = {\n rowType,\n data: item?.rows as any,\n key: item?.value,\n rowIndex: -1,\n // dx handlers read one name or the other depending on vintage; supply both.\n groupIndex: item?.level,\n groupLevel: item?.level,\n isExpanded: item ? !item.collapsed : undefined,\n };\n } else {\n info = { rowType, data: undefined, key: undefined, rowIndex: -1 };\n }\n\n if (this.onRowPrepared.observed) {\n this.onRowPrepared.emit({\n ...info,\n rowElement: tr,\n columnCount: tr.cells.length,\n component: this.facade,\n element: host,\n });\n }\n if (!this.onCellPrepared.observed) {\n continue;\n }\n const lead = this.leadCellCount();\n for (const td of Array.from(tr.cells)) {\n // Read the column off `aria-colindex` rather than counting cells.\n //\n // Counting was wrong in four separate ways, all silent, and every one of them\n // the shape this event exists to serve. A data row's grouping indent cells\n // carry only `nxe-datagrid-group-space`, which no class test here listed, so\n // in a grouped grid every cell reported the column one place to its left per\n // group level and the last column was never reported at all. `mergeColumns`\n // deletes the covered `<td>`s, so a continuation row is short and shifts the\n // other way. A band adds a header row whose cells are not leaves. And the\n // counter restarted per `<tr>`, so a banded header row numbered from zero.\n //\n // `aria-colindex` numbers every data cell, leaf header cell, filter cell and\n // summary cell, and already includes the lead command columns, so it survives\n // all four. Command cells carry it too, as dx's do, but their numbers fall\n // outside the data columns' range (at or below the lead count, or past the last\n // column). Those, the cells without one (a band) and the group caption - dx\n // numbers it as the cell after its toggle, which can be a data column's number\n // - are not columns and are reported with `column: null` and index -1.\n const colAttr = td.classList.contains('nxe-group-cell') ? null : td.getAttribute('aria-colindex');\n const at = colAttr ? Number(colAttr) - 1 - lead : -1;\n const col = at >= 0 ? cols[at] : undefined;\n const columnIndex = col ? at : -1;\n const value =\n col && rowType === 'data' && info.data\n ? this.getRaw(info.data, col.dataField())\n : undefined;\n this.onCellPrepared.emit({\n data: info.data,\n key: info.key,\n value,\n displayValue: value,\n text: td.textContent ?? '',\n columnIndex,\n rowIndex: info.rowIndex,\n column: col\n ? {\n dataField: col.dataField(),\n caption: col.caption(),\n dataType: this.colType(col),\n index: columnIndex,\n }\n : null,\n row: info,\n rowType,\n cellElement: td,\n component: this.facade,\n element: host,\n });\n }\n }\n } finally {\n this.preparedDepth--;\n }\n }\n\n // --- Keyboard navigation (WAI-ARIA grid pattern) ---------------------------------------------\n\n /**\n * The single cell holding the grid's tab stop.\n *\n * A grid is one stop in the tab order, not one per cell — a 200-row table would otherwise be\n * 1,400 tab presses to get past. Row `-1` is the header, so ArrowUp from the first data row\n * reaches the column headers rather than stopping dead.\n */\n protected readonly focusedCell = signal<{ row: number; col: number }>({ row: -1, col: 0 });\n\n /**\n * The rows the keyboard and `aria-rowindex` address: the data rows actually RENDERED.\n *\n * Emphatically not `pagedRows()`. That is the page's data BEFORE grouping and tree collapse\n * take rows out of the DOM, while `renderRows` renumbers densely over what it emits - so with\n * one group collapsed `pagedRows()` counts three rows where two have a cell to focus. Every\n * consumer of the count is then wrong in a different way: `aria-rowcount` claims a row a\n * reader cannot reach, Ctrl+End targets an index with no DOM behind it and movement silently\n * does nothing, and Enter and Space read `pagedRows()[row]` - which is a DIFFERENT row than\n * the one under the cursor, so Space selects something the user is not looking at.\n */\n protected readonly navigableRows = computed<any[]>(() =>\n this.renderRows()\n .filter((r) => r.kind === 'data')\n .map((r) => r.row),\n );\n\n protected isCellTabStop(row: number, col: number): boolean {\n const cell = this.focusedCell();\n return cell.row === row && cell.col === col;\n }\n\n protected focusCell(row: number, col: number): void {\n this.focusedCell.set({ row, col });\n }\n\n /** dx marks the sorted column for assistive tech as well as with the arrow glyph. */\n protected ariaSort(col: NxeColumnComponent): 'ascending' | 'descending' | null {\n if (!col.allowSorting()) {\n return null;\n }\n const dir = this.sortDir(col);\n return dir === 'asc' ? 'ascending' : dir === 'desc' ? 'descending' : null;\n }\n\n /**\n * The DOM cell at a logical position, addressed by `aria-colindex` rather than by offset.\n *\n * Offsets break twice over. A band cell carries `role=\"columnheader\"` too, so counting\n * header cells finds bands as well as leaves; and `mergeColumns` deletes the covered `<td>`s,\n * so a data row can be short. `aria-colindex` is emitted on every cell and already includes\n * the lead command columns, so it names the position exactly rather than by counting.\n *\n * Both lookups stay inside this grid's own table: a master-detail grid renders a whole second\n * grid into a `<td>`, and its rows would otherwise answer to the outer grid's arrow keys.\n */\n private cellAt(row: number, col: number): HTMLElement | null {\n const host = this.elementRef.nativeElement as HTMLElement;\n const colIndex = this.leadCellCount() + col + 1;\n if (row < 0) {\n return nxeHeaderLeafCells(host)[col] ?? null;\n }\n const tbody = host.querySelector<HTMLElement>(\n '.nxe-datagrid-content > .nxe-datagrid-table > tbody',\n );\n return (\n tbody?.querySelector<HTMLElement>(\n `:scope > .nxe-data-row[aria-rowindex=\"${row + 1}\"] > [aria-colindex=\"${colIndex}\"]`,\n ) ?? null\n );\n }\n\n /** Move the tab stop and put real DOM focus on the cell that now holds it. */\n private moveFocus(row: number, col: number): void {\n const maxRow = this.navigableRows().length - 1;\n const maxCol = this.visibleColumns().length - 1;\n const targetRow = Math.max(-1, Math.min(row, maxRow));\n const nextCol = Math.max(0, Math.min(col, maxCol));\n\n // A merged cell's rowspan removes the `<td>`s beneath it, so a position can have no cell\n // of its own. Keep going the way we were headed until one does — landing on the covering\n // cell instead would make ArrowDown into a merged block a dead end.\n const step = targetRow > this.focusedCell().row ? 1 : -1;\n let probe = targetRow;\n let cell = this.cellAt(probe, nextCol);\n while (!cell && probe + step >= -1 && probe + step <= maxRow) {\n probe += step;\n cell = this.cellAt(probe, nextCol);\n }\n if (!cell) {\n return;\n }\n this.focusedCell.set({ row: probe, col: nextCol });\n cell.focus();\n }\n\n /**\n * Arrow-key movement over cells.\n *\n * Deliberately not bound to the rowsview: a projected editor inside a cell needs its own\n * arrow keys, so anything originating inside an editor is left alone.\n */\n protected onGridKeydown(event: KeyboardEvent): void {\n const target = event.target as HTMLElement | null;\n if (\n target &&\n target.closest('input, textarea, select, [contenteditable=\"true\"], .nxe-grid-cell-editor-check')\n ) {\n return;\n }\n const { row, col } = this.focusedCell();\n const rows = this.navigableRows();\n const lastRow = rows.length - 1;\n const lastCol = this.visibleColumns().length - 1;\n\n switch (event.key) {\n case 'ArrowRight':\n event.preventDefault();\n this.moveFocus(row, col + 1);\n break;\n case 'ArrowLeft':\n event.preventDefault();\n this.moveFocus(row, col - 1);\n break;\n case 'ArrowDown':\n event.preventDefault();\n this.moveFocus(row + 1, col);\n break;\n case 'ArrowUp':\n event.preventDefault();\n this.moveFocus(row - 1, col);\n break;\n case 'Home':\n event.preventDefault();\n this.moveFocus(event.ctrlKey ? -1 : row, 0);\n break;\n case 'End':\n event.preventDefault();\n this.moveFocus(event.ctrlKey ? lastRow : row, lastCol);\n break;\n case 'PageDown':\n event.preventDefault();\n this.pagingEnabled() ? this.nextPage() : this.moveFocus(lastRow, col);\n break;\n case 'PageUp':\n event.preventDefault();\n this.pagingEnabled() ? this.prevPage() : this.moveFocus(-1, col);\n break;\n case 'Enter':\n case 'F2': {\n if (row < 0) {\n // On a header, Enter sorts — the same thing a click does.\n event.preventDefault();\n const col0 = this.visibleColumns()[col];\n if (col0) {\n this.onHeaderClick(col0);\n }\n break;\n }\n const rowData = rows[row];\n const column = this.visibleColumns()[col];\n if (rowData && column && this.cellEditingEnabled() && this.editableCell(column)) {\n event.preventDefault();\n if (this.booleanInPlace(column)) {\n // The checkbox is already the editor, and it takes no focus of its own:\n // Enter does what a click on it does.\n this.commitCellEdit(rowData, column, this.getRaw(rowData, column.dataField()) !== true);\n break;\n }\n this.editingCell.set({ row: rowData, field: column.dataField() });\n }\n break;\n }\n case ' ': {\n if (row < 0 || this.selectionMode() === 'none') {\n break;\n }\n event.preventDefault();\n const rowData = rows[row];\n if (rowData) {\n this.toggleRow(rowData);\n }\n break;\n }\n default:\n }\n }\n\n // --- Interaction -----------------------------------------------------------------------------\n\n /** True when this header can start a drag gesture (to the group panel and/or a reorder). */\n protected headerDraggable(col: NxeColumnComponent): boolean {\n if (this.treeMode || !col.dataField()) {\n return false;\n }\n // Reordering is off for banded grids: dragging a leaf out of its band has no meaning in\n // dx, and letting it happen here would tear the band apart. Grouping still works, and a\n // band whose leaves are all grouped away simply disappears.\n return (\n (this.groupPanelVisible() && col.allowGrouping()) ||\n (this.allowColumnReordering() && !this.hasBands())\n );\n }\n\n protected onHeaderPointerDown(col: NxeColumnComponent, ci: number, event: PointerEvent): void {\n if (this.headerDraggable(col)) {\n this.drag.startHeaderDrag(col, ci, event);\n }\n }\n\n protected onChipPointerDown(col: NxeColumnComponent, level: number, event: PointerEvent): void {\n this.drag.startChipDrag(col, level, event);\n }\n\n /**\n * Chip click (dx): toggle the grouped column's sort — unless this click ends a drag. dx sends\n * it through the same changeSortOrder as a header click (m_sorting.js:134), so the same gate.\n */\n protected onChipClick(col: NxeColumnComponent): void {\n if (this.drag.consumeClick() || !this.clickSorts(col)) {\n return;\n }\n this.sortGroupColumn(col);\n }\n\n protected onHeaderClick(col: NxeColumnComponent): void {\n if (this.drag.consumeClick() || this.resize.consumeClick()) {\n return; // this click is the tail of a drag/resize gesture, not a sort request\n }\n if (!this.clickSorts(col)) {\n return;\n }\n const field = col.dataField();\n if (!field) {\n return;\n }\n const current = this.effectiveSort();\n if (!current || current.field !== field) {\n this.setSort({ field, dir: 'asc' });\n } else if (current.dir === 'asc') {\n this.setSort({ field, dir: 'desc' });\n } else {\n this.setSort(null);\n }\n }\n\n protected sortDir(col: NxeColumnComponent): 'asc' | 'desc' | null {\n const s = this.effectiveSort();\n return s && s.field === col.dataField() ? s.dir : null;\n }\n\n /**\n * `sorting.mode` as dx's sorting code reads the option: unbound is dx's default 'single', an\n * object gives its `mode` (default 'single'), and anything else - `[sorting]=\"false\"` or\n * `null` - has no mode at all.\n */\n private sortingMode(): 'single' | 'multiple' | 'none' | undefined {\n const s = this.sorting();\n if (s === undefined) {\n return 'single';\n }\n return s ? (s.mode ?? 'single') : undefined;\n }\n\n /**\n * dx changeSortOrder (m_columns_controller.js:758-766) acts only in mode 'single' or\n * 'multiple', and only on a column that allows sorting. `[sorting]=\"false\"` still renders the\n * sort slot, but a header or chip click never sorts.\n */\n private clickSorts(col: NxeColumnComponent): boolean {\n const mode = this.sortingMode();\n return col.allowSorting() && (mode === 'single' || mode === 'multiple');\n }\n\n /**\n * dx `isSortingAllowed` (m_sorting_mixin.js:37): a sortable column, unless the mode is\n * literally 'none'. A column with no dataField is never sortable (m_columns_controller.js:\n * 1383-1388). Gates the `nxe-datagrid-action` class, and the sort slot of an unsorted column.\n */\n protected sortAllowed(col: NxeColumnComponent): boolean {\n const s = this.sorting();\n return col.allowSorting() && !!col.dataField() && (s ? s.mode : undefined) !== 'none';\n }\n\n /**\n * Whether the header renders dx's sort span: always for the sorted column, and as an empty\n * `nxe-sort-none` placeholder for any other sortable one (m_sorting_mixin.js:38-46). The\n * placeholder is display:none in the fixed table and 14px wide in the best-fit pass.\n */\n protected sortSlot(col: NxeColumnComponent): boolean {\n return this.sortDir(col) !== null || this.sortAllowed(col);\n }\n\n protected onRowEnter(index: number): void {\n if (this.hoverStateEnabled()) {\n this.hoveredIndex.set(index);\n }\n }\n protected onRowLeave(): void {\n this.hoveredIndex.set(null);\n }\n protected isHovered(index: number): boolean {\n return this.hoveredIndex() === index;\n }\n\n protected isSelected(row: any): boolean {\n if (this.remote()) {\n return this.selectedKeySet().has(this.rowKey(row));\n }\n if (this.recursiveTreeSelection()) {\n return this.treeCheckState().get(this.rowKey(row)) === 'all';\n }\n return this.treeMode\n ? this.selectedRowKeys().includes(this.rowKey(row))\n : this.selectedSet().has(row);\n }\n\n /** Row body click: single-select (LOV pickers) or toggle when checkboxes are hidden. */\n protected onDataRowClick(row: any, rowIndex = 0): void {\n this.onRowClick.emit({ data: row, rowIndex, component: this.facade });\n if (!this.selectionEnabled()) {\n return;\n }\n if (\n this.selectionMode() === 'multiple' &&\n this.showCheckboxes() &&\n !this.selection()?.selectByClick()\n ) {\n return; // checkbox-driven; row click is a no-op\n }\n this.toggleRow(row);\n }\n\n protected onCheckboxClick(row: any, event: Event): void {\n event.stopPropagation();\n this.toggleRow(row);\n }\n\n private toggleRow(row: any): void {\n if (this.remote()) {\n this.toggleRemoteSelection(row);\n return;\n }\n if (this.treeMode) {\n this.toggleTreeSelection(row);\n return;\n }\n const set = new Set(this.selectedSet());\n let currentSelected: any[] = [];\n let currentDeselected: any[] = [];\n if (this.selectionMode() === 'single') {\n currentDeselected = [...set].filter((r) => r !== row);\n set.clear();\n set.add(row);\n currentSelected = [row];\n } else if (set.has(row)) {\n set.delete(row);\n currentDeselected = [row];\n } else {\n set.add(row);\n currentSelected = [row];\n }\n this.selectedSet.set(set);\n this.emitSelectionChanged(currentSelected, currentDeselected);\n }\n\n protected toggleSelectAll(event: Event): void {\n event.stopPropagation();\n if (this.remote()) {\n this.toggleRemoteSelectAll();\n return;\n }\n if (this.treeMode) {\n const allKeys = this.sourceRows().map((r) => this.rowKey(r));\n if (this.allSelected()) {\n this.selectedRowKeys.set([]);\n this.emitTreeSelectionChanged([], [], allKeys);\n } else {\n this.selectedRowKeys.set(allKeys);\n this.emitTreeSelectionChanged(allKeys, allKeys, []);\n }\n return;\n }\n const rows = this.displayRows();\n if (this.allSelected()) {\n this.selectedSet.set(new Set());\n this.emitSelectionChanged([], rows);\n } else {\n this.selectedSet.set(new Set(rows));\n this.emitSelectionChanged(rows, []);\n }\n }\n\n /**\n * `clearSelection()` (`scope` null: every selected row) and `deselectAll()` (`scope`: the rows\n * on show). One `onSelectionChanged` with the dropped keys as deselected, none when nothing\n * was selected.\n */\n private deselectRows(scope: readonly any[] | null): void {\n if (this.remote() || this.treeMode) {\n const previous = this.selectedRowKeys();\n const drop = scope ? new Set(scope.map((r) => this.rowKey(r))) : null;\n const removed = drop ? previous.filter((k) => drop.has(k)) : previous;\n if (!removed.length) {\n return;\n }\n const next = drop ? previous.filter((k) => !drop.has(k)) : [];\n this.selectedRowKeys.set(next);\n if (this.remote()) {\n this.emitRemoteSelectionChanged(next, [], removed);\n } else {\n this.emitTreeSelectionChanged(next, [], removed);\n }\n return;\n }\n const previous = this.selectedSet();\n const removed = scope ? scope.filter((r) => previous.has(r)) : [...previous];\n if (!removed.length) {\n return;\n }\n const next = new Set(previous);\n removed.forEach((r) => next.delete(r));\n this.selectedSet.set(next);\n this.emitSelectionChanged([], removed);\n }\n\n private emitSelectionChanged(currentSelected: any[], currentDeselected: any[]): void {\n const data = this.selectedRowsData();\n this.onSelectionChanged.emit({\n selectedRowsData: data,\n selectedRowKeys: this.rowKeys(data),\n currentSelectedRowKeys: this.rowKeys(currentSelected),\n currentDeselectedRowKeys: this.rowKeys(currentDeselected),\n component: this.facade,\n element: this.elementRef.nativeElement,\n });\n }\n\n private rowKeys(rows: any[]): any[] {\n const key = this.keyField();\n return key ? rows.map((r) => r?.[key]) : rows;\n }\n\n // --- Filter row (dxo-filter-row): typed editors + dx operation-chooser menu ------------------\n private static readonly STRING_OPS: { op: NxeFilterOp; label: NxeMessageKey }[] = [\n { op: 'contains', label: 'grid.op.contains' },\n { op: 'notcontains', label: 'grid.op.notContains' },\n { op: 'startswith', label: 'grid.op.startsWith' },\n { op: 'endswith', label: 'grid.op.endsWith' },\n { op: '=', label: 'grid.op.equals' },\n { op: '<>', label: 'grid.op.notEquals' },\n ];\n private static readonly SCALAR_OPS: { op: NxeFilterOp; label: NxeMessageKey }[] = [\n { op: '=', label: 'grid.op.equals' },\n { op: '<>', label: 'grid.op.notEquals' },\n { op: '<', label: 'grid.op.lessThan' },\n { op: '>', label: 'grid.op.greaterThan' },\n { op: '<=', label: 'grid.op.lessThanOrEqual' },\n { op: '>=', label: 'grid.op.greaterThanOrEqual' },\n { op: 'between', label: 'grid.op.between' },\n ];\n private static readonly OP_ICON_SLUGS: Record<NxeFilterOp, string> = {\n contains: 'contains',\n notcontains: 'not-contains',\n startswith: 'starts-with',\n endswith: 'ends-with',\n '=': 'equals',\n '<>': 'not-equals',\n '<': 'less',\n '<=': 'less-equal',\n '>': 'greater',\n '>=': 'greater-equal',\n between: 'between',\n };\n\n protected readonly frMenuColumn = signal<NxeColumnComponent | null>(null);\n private frMenuOverlayRef?: OverlayRef;\n private readonly frMenuPanel = viewChild<TemplateRef<unknown>>('frOpMenu');\n\n /** Which editor a filter cell renders (mirrors dx: select for lookup/boolean, typed inputs). */\n protected frEditorKind(col: NxeColumnComponent): 'lookup' | 'boolean' | 'date' | 'number' | 'text' {\n if (col.lookup()) {\n return 'lookup';\n }\n const type = this.colType(col);\n return type === 'boolean' || type === 'date' || type === 'number' ? type : 'text';\n }\n\n /** dx shows the operation-chooser magnifier only for typed (non-select) editors. */\n protected frHasOpMenu(col: NxeColumnComponent): boolean {\n const kind = this.frEditorKind(col);\n return kind !== 'lookup' && kind !== 'boolean';\n }\n\n private frDefaultOp(col: NxeColumnComponent): NxeFilterOp {\n return this.frEditorKind(col) === 'text' ? 'contains' : '=';\n }\n\n protected frOp(col: NxeColumnComponent): NxeFilterOp {\n return this.filterRowState().get(col.dataField())?.op ?? this.frDefaultOp(col);\n }\n\n protected frText(col: NxeColumnComponent): string {\n return this.filterRowState().get(col.dataField())?.text ?? '';\n }\n\n protected frText2(col: NxeColumnComponent): string {\n return this.filterRowState().get(col.dataField())?.text2 ?? '';\n }\n\n /**\n * The chooser glyph: dx's magnifier ('default') until an operation is picked from the menu,\n * then that operation's own. Only the slug varies - the template emits `nxe-icon-filter-operation-*`\n * and nothing prefixed `dx-`, which the compat mirror would strip for want of an nxe twin.\n */\n protected frOpIconSlug(col: NxeColumnComponent): string {\n const entry = this.filterRowState().get(col.dataField());\n return entry?.chosen ? NxeDataGridComponent.OP_ICON_SLUGS[entry.op] : 'default';\n }\n\n protected opIconSlug(op: NxeFilterOp): string {\n return NxeDataGridComponent.OP_ICON_SLUGS[op];\n }\n\n protected setFilterRowText(col: NxeColumnComponent, text: string, second = false): void {\n this.remoteTyping = true;\n const field = col.dataField();\n const next = new Map(this.filterRowState());\n const prev = next.get(field) ?? { op: this.frDefaultOp(col), text: '' };\n next.set(field, second ? { ...prev, text2: text } : { ...prev, text });\n this.filterRowState.set(next);\n }\n\n protected openFilterOpMenu(col: NxeColumnComponent, event: Event): void {\n event.stopPropagation();\n this.frMenuColumn.set(col);\n this.frMenuOverlayRef?.dispose();\n const origin = event.currentTarget as HTMLElement;\n this.frMenuOverlayRef = this.overlay.create({\n positionStrategy: this.overlay\n .position()\n .flexibleConnectedTo(origin)\n .withPositions([\n { originX: 'start', originY: 'bottom', overlayX: 'start', overlayY: 'top' },\n { originX: 'start', originY: 'top', overlayX: 'start', overlayY: 'bottom' },\n ]),\n scrollStrategy: this.overlay.scrollStrategies.reposition(),\n hasBackdrop: true,\n backdropClass: 'cdk-overlay-transparent-backdrop',\n panelClass: nxePane('nxe-fr-op-pane'),\n });\n this.frMenuOverlayRef.backdropClick().subscribe(() => this.closeFilterOpMenu());\n const panel = this.frMenuPanel();\n if (panel) {\n this.frMenuOverlayRef.attach(new TemplatePortal(panel, this.viewContainerRef));\n }\n }\n\n protected frMenuOps(): { op: NxeFilterOp; label: string }[] {\n const col = this.frMenuColumn();\n if (!col) {\n return [];\n }\n return (\n this.frEditorKind(col) === 'text' ? NxeDataGridComponent.STRING_OPS : NxeDataGridComponent.SCALAR_OPS\n ).map(({ op, label }) => ({ op, label: this.messages.t(label) }));\n }\n\n protected selectFilterOp(op: NxeFilterOp): void {\n const col = this.frMenuColumn();\n if (col) {\n const field = col.dataField();\n const next = new Map(this.filterRowState());\n const prev = next.get(field) ?? { op: this.frDefaultOp(col), text: '' };\n next.set(field, {\n ...prev,\n op,\n chosen: true,\n ...(op !== 'between' ? { text2: undefined } : {}),\n });\n this.filterRowState.set(next);\n }\n this.closeFilterOpMenu();\n }\n\n /** dx Reset menu item: restore the default operation and clear the editor. */\n protected resetFilterRow(): void {\n const col = this.frMenuColumn();\n if (col) {\n const next = new Map(this.filterRowState());\n next.delete(col.dataField());\n this.filterRowState.set(next);\n }\n this.closeFilterOpMenu();\n }\n\n protected closeFilterOpMenu(): void {\n this.frMenuOverlayRef?.detach();\n this.frMenuColumn.set(null);\n }\n\n // --- Header filter (dxo-header-filter) -------------------------------------------------------\n protected readonly headerFilterEnabled = computed(\n () => this.headerFilter()?.visible() === true || this.headerFilterOptions()?.visible === true,\n );\n\n protected hasHeaderFilter(col: NxeColumnComponent): boolean {\n return this.effectiveHeaderFilters().has(col.dataField());\n }\n\n /** Whether this column shows a funnel — the grid has header filtering on AND the column opts in.\n Named because the header cell asks three times (the caption's indicator class, the wrapper's\n existence, the funnel itself) and the group-panel chip asks again. */\n protected headerFilterVisible(col: NxeColumnComponent): boolean {\n return this.headerFilterEnabled() && col.allowHeaderFiltering();\n }\n\n /**\n * Normalizes a raw cell value to its header-filter key: blank-ish → the `(Blanks)` sentinel,\n * date columns → a `yyyy-MM-dd` day key (the tree's leaf unit), else the raw value.\n */\n private hfKey(col: NxeColumnComponent, raw: any): any {\n return nxeHfKey(raw, this.colType(col) === 'date');\n }\n\n /** dx does NOT cascade header-filter lists for client arrays (bright audit V6). */\n private hfBaseRows(): any[] {\n return this.sourceRows();\n }\n\n private hfBoolLabel(col: NxeColumnComponent, raw: any): 'Yes' | 'No' | null {\n if (col.lookup()) {\n return null;\n }\n if (raw === true) {\n return 'Yes';\n }\n if (raw === false || this.colType(col) === 'boolean') {\n return 'No';\n }\n return null;\n }\n\n /** (Select All) checkbox state — spec-pinned alias of the model's computed\n ((Select All) operates on the VISIBLE keys: dx scopes it to the search). */\n protected readonly hfAllChecked = this.hf.allChecked;\n\n /** Default true — see NxeHeaderFilterComponent.searchEnabled. The two branches have to agree,\n since a grid can be configured either by the content child or by the object input. */\n protected hfSearchEnabled(): boolean {\n return (\n this.headerFilter()?.searchEnabled() ??\n this.headerFilterOptions()?.search?.enabled ??\n true\n );\n }\n\n protected openHeaderFilter(col: NxeColumnComponent, event: Event): void {\n event.stopPropagation();\n if (this.drag.consumeClick()) {\n return; // the funnel was merely the landing spot of an aborted drag\n }\n // No applied filter → everything checked; else start from the applied set.\n this.hf.open(col, this.effectiveHeaderFilters().get(col.dataField()));\n\n this.hfOverlayRef?.dispose();\n this.hfOverlayRef = openNxeHeaderFilterOverlay({\n overlay: this.overlay,\n viewContainerRef: this.viewContainerRef,\n origin: event.currentTarget as HTMLElement,\n model: this.hf,\n searchEnabled: () => this.hfSearchEnabled(),\n onApply: () => this.hfApply(),\n onClose: () => this.closeHeaderFilter(),\n });\n }\n\n protected hfApply(): void {\n const col = this.hf.column();\n if (col) {\n const next = new Map(this.hfOverride());\n // Everything checked (or nothing to choose from) = explicit \"no filter\" (`null` so a\n // declarative seed can't resurrect); else the allowed-key set (empty = empty grid).\n next.set(col.dataField(), this.hf.applyResult());\n this.hfOverride.set(next);\n }\n this.closeHeaderFilter();\n }\n\n protected closeHeaderFilter(): void {\n this.hfOverlayRef?.detach();\n this.hf.close();\n }\n\n private setColumnVisible(field: string, visible: boolean): void {\n this.visibilityOverride.update((m) => {\n const next = new Map(m);\n next.set(field, visible);\n return next;\n });\n }\n\n private compare(a: any, b: any): number {\n if (a == null && b == null) return 0;\n if (a == null) return -1;\n if (b == null) return 1;\n if (typeof a === 'number' && typeof b === 'number') return a - b;\n const da = parseDateValue(a);\n const db = parseDateValue(b);\n if (da && db) return da.toMillis() - db.toMillis();\n return String(a).localeCompare(String(b));\n }\n\n ngOnDestroy(): void {\n this.drag.destroy();\n this.resize.destroy();\n this.hfOverlayRef?.dispose();\n this.frMenuOverlayRef?.dispose();\n this.resizeObserver?.disconnect();\n this.wrapped?.cancel();\n }\n}\n","<div\r\n class=\"nxe-widget nxe-datagrid\"\r\n [class.nxe-datagrid-borders]=\"showBorders()\"\r\n [style.height]=\"heightStyle()\">\r\n <div class=\"nxe-gridbase-container\">\r\n @if (groupPanelVisible()) {\r\n <div class=\"nxe-datagrid-header-panel\">\r\n <div class=\"nxe-datagrid-group-panel\">\r\n @if (groupColumns().length === 0) {\r\n <span class=\"nxe-group-panel-message\">{{ t('grid.groupPanel') }}</span>\r\n } @else {\r\n @for (col of groupColumns(); track col.dataField(); let li = $index) {\r\n <!-- dx chip DOM: caption + sort indicator + header-filter button (bright audit) -->\r\n <div\r\n class=\"nxe-group-panel-item nxe-datagrid-action nxe-datagrid-drag-action\"\r\n tabindex=\"0\"\r\n (pointerdown)=\"onChipPointerDown(col, li, $event)\"\r\n (click)=\"onChipClick(col)\">{{ col.caption() }}<div class=\"nxe-column-indicators\" role=\"presentation\"><span\r\n class=\"nxe-sort\"\r\n [class.nxe-sort-up]=\"groupDir(col) === 'asc'\"\r\n [class.nxe-sort-down]=\"groupDir(col) === 'desc'\"></span>@if (headerFilterVisible(col)) {<span\r\n class=\"nxe-grid-hf-icon\"\r\n [class.nxe-hf-active]=\"hasHeaderFilter(col)\"\r\n (pointerdown)=\"$event.stopPropagation()\"\r\n (click)=\"openHeaderFilter(col, $event)\"></span>}</div></div>\r\n }\r\n }\r\n </div>\r\n </div>\r\n }\r\n <!-- dx drops the last row's bottom line in a bordered grid when no free-space row follows\r\n it, so the rows view's own border is the only line there (m_rows_view.js:931-937). -->\r\n <div\r\n class=\"nxe-datagrid-rowsview nxe-datagrid-after-headers\"\r\n [class.nxe-datagrid-nowrap]=\"!wordWrapEnabled()\"\r\n [class.nxe-empty]=\"isEmpty()\"\r\n [class.nxe-remote-busy]=\"remoteBusy()\"\r\n [class.nxe-last-row-border]=\"showBorders() && !freeSpaceVisible()\">\r\n <div class=\"nxe-datagrid-content\">\r\n <!-- role=grid (treegrid when hierarchical) rather than the implicit table role:\r\n this is an interactive widget with a single tab stop and arrow-key movement,\r\n not a static table.\r\n\r\n aria-rowcount counts the PAGE, because aria-rowindex is page-relative and the\r\n two have to agree. Making the index absolute would be more literally correct\r\n for a paged grid, but consuming code addresses cells through it\r\n (`tr[aria-rowindex=N] > td[aria-colindex=M]`), so the index is a contract. -->\r\n <table\r\n class=\"nxe-datagrid-table nxe-datagrid-table-fixed\"\r\n [attr.role]=\"treeMode ? 'treegrid' : 'grid'\"\r\n [attr.aria-rowcount]=\"navigableRows().length\"\r\n [attr.aria-busy]=\"remoteBusy() ? 'true' : null\"\r\n [attr.aria-colcount]=\"visibleColumns().length + leadCellCount() + (rowEditCommandVisible() ? 1 : 0)\"\r\n [style.width]=\"tableWidthStyle()\"\r\n (keydown)=\"onGridKeydown($event)\">\r\n <colgroup>\r\n @for (i of indents(groupLevelCount()); track i) {\r\n <col style=\"width: 30px\" />\r\n }\r\n @if (masterDetailEnabled()) {\r\n <col style=\"width: 30px\" />\r\n }\r\n @if (selectColumnVisible()) {\r\n <col style=\"width: 40px\" />\r\n }\r\n @for (col of visibleColumns(); track $index; let ci = $index) {\r\n <col [style.width]=\"effectiveColWidth(col, ci)\" />\r\n }\r\n @if (rowEditCommandVisible()) {\r\n <col style=\"width: 100px\" />\r\n }\r\n </colgroup>\r\n <thead class=\"nxe-datagrid-headers\">\r\n <!-- Bands add header rows: a band cell spans its visible leaves with\r\n colspan, and a leaf above the bottom row spans down with rowspan.\r\n That is dx's own banded markup, and it keeps the LAST header row\r\n all-leaves - which the auto-width, resize and drag code relies on. -->\r\n @for (hrow of headerRows(); track $index; let hi = $index) {\r\n <tr\r\n class=\"nxe-row nxe-header-row\"\r\n role=\"row\"\r\n [class.nxe-column-lines]=\"showColumnLines()\">\r\n @if (hi === 0) {\r\n <!-- dx numbers the header's command cells like the body's\r\n (m_columns_view.js:681-693); they are not role=columnheader\r\n (m_column_headers.js:193), which keeps them out of the leaf\r\n header list (nxeHeaderLeafCells). -->\r\n @for (i of indents(groupLevelCount()); track i) {\r\n <td\r\n class=\"nxe-command-expand nxe-datagrid-group-space nxe-cell-focus-disabled\"\r\n [attr.aria-colindex]=\"i + 1\"\r\n [attr.rowspan]=\"headerDepth() > 1 ? headerDepth() : null\"></td>\r\n }\r\n @if (masterDetailEnabled()) {\r\n <!-- dx gives every cell of an 'expand' command column the\r\n group-space class (m_columns_view.js:290-293), which drops\r\n the column line between it and the next cell. -->\r\n <td\r\n class=\"nxe-command-expand nxe-datagrid-group-space\"\r\n [attr.aria-colindex]=\"expandColIndex()\"\r\n [attr.rowspan]=\"headerDepth() > 1 ? headerDepth() : null\"></td>\r\n }\r\n @if (selectColumnVisible()) {\r\n <td\r\n class=\"nxe-command-select\"\r\n [attr.aria-colindex]=\"selectColIndex()\"\r\n [attr.rowspan]=\"headerDepth() > 1 ? headerDepth() : null\">\r\n @if (selectionMode() === 'multiple') {\r\n <span\r\n class=\"nxe-select-checkbox nxe-grid-checkbox nxe-checkbox nxe-datagrid-checkbox-size\"\r\n role=\"checkbox\"\r\n [attr.aria-checked]=\"allSelected() ? 'true' : someSelected() ? 'mixed' : 'false'\"\r\n [class.nxe-checked]=\"allSelected()\"\r\n [class.nxe-indeterminate]=\"someSelected() && !allSelected()\"\r\n (click)=\"toggleSelectAll($event)\">\r\n <span class=\"nxe-grid-checkbox-box\"></span>\r\n </span>\r\n }\r\n </td>\r\n }\r\n }\r\n @for (cell of hrow; track $index) {\r\n @if (cell.isBand) {\r\n <!-- dx gives a band the alignment of any column: left unless set\r\n (a band has no dataType to right-align or centre it by). -->\r\n <td\r\n class=\"nxe-band-cell\"\r\n role=\"columnheader\"\r\n [class]=\"cell.column.cssClass()\"\r\n [attr.colspan]=\"cell.colspan > 1 ? cell.colspan : null\"\r\n [style.text-align]=\"align(cell.column)\">\r\n <div class=\"nxe-datagrid-text-content\">{{ cell.column.caption() }}</div>\r\n </td>\r\n } @else {\r\n @let hDir = sortDir(cell.column);\r\n @let hHf = headerFilterVisible(cell.column);\r\n @let hSortSlot = sortSlot(cell.column);\r\n @let hInd = hSortSlot || hHf;\r\n @let hAlign = align(cell.column);\r\n <!-- dx places the indicator block before the caption when column lines are\r\n on or the column is right-aligned (m_column_headers.js createCellContent,\r\n m_column_state_mixin.js _applyColumnState), floated to the cell edge\r\n only with column lines: right, or left for a right-aligned column. -->\r\n @let hLead = hInd && (showColumnLines() || hAlign === 'right');\r\n @let hFloat = showColumnLines() ? (hAlign === 'right' ? 'left' : 'right') : null;\r\n <td\r\n [class]=\"cell.column.cssClass()\"\r\n role=\"columnheader\"\r\n [attr.aria-colindex]=\"leadCellCount() + cell.leafIndex + 1\"\r\n [attr.aria-sort]=\"ariaSort(cell.column)\"\r\n [attr.tabindex]=\"isCellTabStop(-1, cell.leafIndex) ? 0 : -1\"\r\n (focus)=\"focusCell(-1, cell.leafIndex)\"\r\n [attr.rowspan]=\"cell.rowspan > 1 ? cell.rowspan : null\"\r\n [style.text-align]=\"hAlign\"\r\n [class.nxe-cell-focus-disabled]=\"!cell.column.allowSorting()\"\r\n [class.nxe-datagrid-action]=\"sortAllowed(cell.column)\"\r\n [class.nxe-datagrid-drag-action]=\"headerDraggable(cell.column)\"\r\n [class.nxe-tree-select-all]=\"treeSelectAll() && cell.leafIndex === 0\"\r\n (pointerdown)=\"onHeaderPointerDown(cell.column, cell.leafIndex, $event)\"\r\n (click)=\"onHeaderClick(cell.column)\">\r\n @if (treeSelectAll() && cell.leafIndex === 0) {\r\n <!-- dx's tree list puts select-all in the first column's header. -->\r\n <span\r\n class=\"nxe-select-checkbox nxe-grid-checkbox nxe-checkbox nxe-datagrid-checkbox-size\"\r\n role=\"checkbox\"\r\n [attr.aria-label]=\"t('common.selectAll')\"\r\n [attr.aria-checked]=\"allSelected() ? 'true' : someSelected() ? 'mixed' : 'false'\"\r\n [class.nxe-checked]=\"allSelected()\"\r\n [class.nxe-indeterminate]=\"someSelected() && !allSelected()\"\r\n (pointerdown)=\"$event.stopPropagation()\"\r\n (click)=\"toggleSelectAll($event)\">\r\n <span class=\"nxe-grid-checkbox-box\"></span>\r\n </span>\r\n }\r\n @if (hLead) {\r\n <ng-container\r\n [ngTemplateOutlet]=\"headerIndicators\"\r\n [ngTemplateOutletContext]=\"{ $implicit: cell.column, dir: hDir, sortSlot: hSortSlot, hf: hHf, hfFirst: hAlign === 'right', float: hFloat }\" />\r\n }\r\n <!-- dx _alignCaptionByCenter: a centred caption gets an unfloated,\r\n invisible copy of the indicator block on its other side, so the\r\n caption centres on the cell rather than caption + arrow centring\r\n as a group. Spacers only: no sort or funnel classes (specs and\r\n apps pick funnels by index) and no handlers - a click there falls\r\n through to the cell and sorts, as dx's hidden clone lets it. -->\r\n @if (hInd && hAlign === 'center') {\r\n <div\r\n class=\"nxe-column-indicators nxe-visibility-hidden\"\r\n role=\"presentation\"\r\n aria-hidden=\"true\">\r\n @if (hSortSlot) {\r\n <span\r\n class=\"nxe-column-indicator-spacer\"\r\n [class.nxe-column-indicator-spacer-none]=\"!hDir\"></span>\r\n }\r\n @if (hHf) {\r\n <span class=\"nxe-column-indicator-spacer\"></span>\r\n }\r\n </div>\r\n }\r\n <!-- The indicator classes are load-bearing, not decorative: they gate dx's\r\n caption budget (`.dx-header-row .dx-sort-indicator{max-width:calc(100%\r\n - 17px)}` and family) and, with the alignment classes, the 3px gap to\r\n the block. dx sets alignment-left for left and centre columns and\r\n alignment-right for right and centre ones, whenever the cell has an\r\n indicator slot at all - even an unsorted, hidden one. -->\r\n <div\r\n class=\"nxe-datagrid-text-content\"\r\n [class.nxe-text-content-alignment-left]=\"hInd && hAlign !== 'right'\"\r\n [class.nxe-text-content-alignment-right]=\"hInd && hAlign !== 'left'\"\r\n [class.nxe-sort-indicator]=\"hDir !== null\"\r\n [class.nxe-header-filter-indicator]=\"hHf\">\r\n {{ cell.column.caption() }}\r\n </div>\r\n @if (hInd && !hLead) {\r\n <ng-container\r\n [ngTemplateOutlet]=\"headerIndicators\"\r\n [ngTemplateOutletContext]=\"{ $implicit: cell.column, dir: hDir, sortSlot: hSortSlot, hf: hHf, hfFirst: hAlign === 'right', float: null }\" />\r\n }\r\n @if (resizeHandleVisible(cell.column, cell.leafIndex)) {\r\n <span\r\n class=\"nxe-col-resize-handle\"\r\n (pointerdown)=\"startColumnResize(cell.column, cell.leafIndex, $event)\"></span>\r\n }\r\n </td>\r\n }\r\n }\r\n @if (hi === 0 && rowEditCommandVisible()) {\r\n <td\r\n class=\"nxe-command-edit\"\r\n [attr.aria-colindex]=\"editColIndex()\"\r\n [attr.rowspan]=\"headerDepth() > 1 ? headerDepth() : null\"></td>\r\n }\r\n </tr>\r\n }\r\n @if (filterRowVisible()) {\r\n <!-- The headers view toggles column lines on every row it renders, the\r\n filter row included (m_column_headers.js:205-207). -->\r\n <!-- Every filter-row cell is numbered, as the headers view numbers it\r\n (m_columns_view.js:681-693). -->\r\n <tr class=\"nxe-row nxe-datagrid-filter-row\" [class.nxe-column-lines]=\"showColumnLines()\">\r\n @for (i of indents(groupLevelCount()); track i) {\r\n <td class=\"nxe-command-expand nxe-datagrid-group-space\" [attr.aria-colindex]=\"i + 1\"></td>\r\n }\r\n @if (masterDetailEnabled()) {\r\n <td class=\"nxe-command-expand nxe-datagrid-group-space\" [attr.aria-colindex]=\"expandColIndex()\"></td>\r\n }\r\n @if (selectColumnVisible()) {\r\n <td class=\"nxe-command-select\" [attr.aria-colindex]=\"selectColIndex()\"></td>\r\n }\r\n @for (col of visibleColumns(); track $index; let ci = $index) {\r\n <!-- dx filter cell: td.dx-editor-cell > .dx-editor-with-menu >\r\n [.dx-menu op chooser][typed editor] (dx-compat.css contract) -->\r\n <td\r\n class=\"nxe-editor-cell\"\r\n [class]=\"col.cssClass()\"\r\n [attr.aria-colindex]=\"leadCellCount() + ci + 1\">\r\n @if (col.allowFiltering()) {\r\n @switch (frEditorKind(col)) {\r\n @case ('lookup') {\r\n <select\r\n class=\"nxe-texteditor-input nxe-grid-filter-input\"\r\n [value]=\"frText(col)\"\r\n (click)=\"$event.stopPropagation()\"\r\n (change)=\"setFilterRowText(col, $any($event.target).value)\">\r\n <option value=\"\">{{ t('common.all') }}</option>\r\n @for (item of col.lookup()!.dataSource; track $index) {\r\n <option [value]=\"item[col.lookup()!.valueExpr ?? 'lovCode']\">\r\n {{ item[col.lookup()!.displayExpr ?? 'lovName'] }}\r\n </option>\r\n }\r\n </select>\r\n }\r\n @case ('boolean') {\r\n <select\r\n class=\"nxe-texteditor-input nxe-grid-filter-input\"\r\n [value]=\"frText(col)\"\r\n (click)=\"$event.stopPropagation()\"\r\n (change)=\"setFilterRowText(col, $any($event.target).value)\">\r\n <option value=\"\">{{ t('common.all') }}</option>\r\n <option value=\"true\">{{ t('grid.filterRow.true') }}</option>\r\n <option value=\"false\">{{ t('grid.filterRow.false') }}</option>\r\n </select>\r\n }\r\n @default {\r\n <div class=\"nxe-editor-with-menu\">\r\n <div class=\"nxe-menu nxe-menu-base\">\r\n <ul class=\"nxe-menu-horizontal\">\r\n <li>\r\n <div\r\n class=\"nxe-menu-item\"\r\n [attr.title]=\"t('grid.filterRow.operation')\"\r\n (click)=\"openFilterOpMenu(col, $event)\">\r\n <div class=\"nxe-menu-item-content\">\r\n <span\r\n class=\"nxe-icon nxe-icon-filter-operation-{{ frOpIconSlug(col) }}\"></span>\r\n </div>\r\n </div>\r\n </li>\r\n </ul>\r\n </div>\r\n <!-- dx sets the FIRST input's text-align to the column\r\n alignment inline, unless centre (m_filter_row.js:390-395). -->\r\n <input\r\n class=\"nxe-texteditor-input nxe-grid-filter-input\"\r\n [type]=\"frEditorKind(col) === 'date' ? 'date' : 'text'\"\r\n [attr.inputmode]=\"frEditorKind(col) === 'number' ? 'decimal' : null\"\r\n [style.text-align]=\"filterCellAlign(col)\"\r\n [value]=\"frText(col)\"\r\n (input)=\"setFilterRowText(col, $any($event.target).value)\"\r\n (click)=\"$event.stopPropagation()\" />\r\n @if (frOp(col) === 'between') {\r\n <input\r\n class=\"nxe-texteditor-input nxe-grid-filter-input nxe-fr-second\"\r\n [type]=\"frEditorKind(col) === 'date' ? 'date' : 'text'\"\r\n [attr.inputmode]=\"frEditorKind(col) === 'number' ? 'decimal' : null\"\r\n [value]=\"frText2(col)\"\r\n (input)=\"setFilterRowText(col, $any($event.target).value, true)\"\r\n (click)=\"$event.stopPropagation()\" />\r\n }\r\n </div>\r\n }\r\n }\r\n }\r\n </td>\r\n }\r\n @if (rowEditCommandVisible()) {\r\n <td class=\"nxe-command-edit\" [attr.aria-colindex]=\"editColIndex()\"></td>\r\n }\r\n </tr>\r\n }\r\n </thead>\r\n <tbody>\r\n @for (item of renderRows(); track $index; let ri = $index) {\r\n @if (item.kind === 'group') {\r\n <!-- dx group-row anatomy (bright audit): [indent cells][expand chevron\r\n cell][dx-group-cell colspan][alignByColumn summary cells]. dx numbers\r\n every cell of a rows-view row, command cells included\r\n (m_columns_view.js:681-693), and the caption as the cell after the\r\n toggle (m_rows_view.js:626-635, columnIndex groupIndex + 1). That\r\n number can be a data column's, so dx looks group rows up with\r\n `:not(.dx-group-cell)` (m_columns_view.js:942), and onCellPrepared\r\n reports the caption as no column. -->\r\n <tr\r\n class=\"nxe-row nxe-group-row\"\r\n [class.nxe-column-lines]=\"showColumnLines()\"\r\n [attr.aria-roledescription]=\"item.collapsed ? t('grid.collapsedRow') : t('grid.expandedRow')\">\r\n @for (i of indents(item.level); track i) {\r\n <td class=\"nxe-command-expand nxe-datagrid-group-space\" [attr.aria-colindex]=\"i + 1\"></td>\r\n }\r\n <td\r\n class=\"nxe-command-expand nxe-datagrid-group-space nxe-datagrid-expand nxe-selection-disabled\"\r\n [attr.aria-colindex]=\"item.level + 1\"\r\n [attr.aria-label]=\"item.collapsed ? t('grid.expand') : t('grid.collapse')\"\r\n (click)=\"toggleGroup(item.groupKey)\">\r\n <div\r\n [class.nxe-datagrid-group-opened]=\"!item.collapsed\"\r\n [class.nxe-datagrid-group-closed]=\"item.collapsed\"></div>\r\n </td>\r\n <td\r\n class=\"nxe-group-cell\"\r\n [attr.aria-colindex]=\"item.level + 2\"\r\n [attr.colspan]=\"groupCellColspan(item)\">\r\n @if (templateFor(item.column.groupCellTemplate()); as gtpl) {\r\n <ng-container\r\n [ngTemplateOutlet]=\"gtpl\"\r\n [ngTemplateOutletContext]=\"groupCellContext(item)\" />\r\n } @else {\r\n {{ item.column.caption() }}: {{ item.text }}{{ item.captionSuffix }}\r\n }\r\n </td>\r\n @for (col of groupRowTrailing(item); track col.dataField()) {\r\n <td\r\n class=\"nxe-datagrid-summary-item\"\r\n [attr.aria-colindex]=\"leadCellCount() + visibleIndexOf(col) + 1\"\r\n [style.text-align]=\"align(col)\">\r\n {{ item.alignedSums.get(col.dataField()) || '' }}\r\n </td>\r\n }\r\n @if (groupRowTrailing(item).length && rowEditCommandVisible()) {\r\n <td class=\"nxe-command-edit\" [attr.aria-colindex]=\"editColIndex()\"></td>\r\n }\r\n </tr>\r\n } @else if (item.kind === 'groupFooter') {\r\n <!-- dx's group footer: dx-datagrid-group-footer, and column lines like\r\n any row the rows view renders (m_rows_view.js:222-229). Row lines are\r\n data rows' only (:228); the line under a footer is the column-lines\r\n rule's. -->\r\n <tr\r\n class=\"nxe-row nxe-group-footer-row nxe-datagrid-group-footer\"\r\n [class]=\"'nxe-group-footer-level-' + item.level\"\r\n [class.nxe-column-lines]=\"showColumnLines()\">\r\n @for (i of indents(groupLevelCount()); track i) {\r\n <td class=\"nxe-command-expand nxe-datagrid-group-space\" [attr.aria-colindex]=\"i + 1\"></td>\r\n }\r\n @if (masterDetailEnabled()) {\r\n <td class=\"nxe-command-expand nxe-datagrid-group-space\" [attr.aria-colindex]=\"expandColIndex()\"></td>\r\n }\r\n @if (selectColumnVisible()) {\r\n <td class=\"nxe-command-select\" [attr.aria-colindex]=\"selectColIndex()\"></td>\r\n }\r\n @for (col of visibleColumns(); track col.dataField()) {\r\n <td\r\n class=\"nxe-datagrid-summary-item\"\r\n [attr.aria-colindex]=\"leadCellCount() + visibleIndexOf(col) + 1\"\r\n [style.text-align]=\"align(col)\">\r\n {{ item.sums.get(col.dataField()) || '' }}\r\n </td>\r\n }\r\n @if (rowEditCommandVisible()) {\r\n <td class=\"nxe-command-edit\" [attr.aria-colindex]=\"editColIndex()\"></td>\r\n }\r\n </tr>\r\n } @else {\r\n <tr\r\n class=\"nxe-row nxe-data-row\"\r\n role=\"row\"\r\n [class]=\"rowClassFor(item.row)\"\r\n [attr.aria-rowindex]=\"item.rowIndex + 1\"\r\n [attr.aria-selected]=\"selectionMode() === 'none' ? null : isSelected(item.row)\"\r\n [class.nxe-row-lines]=\"showRowLines()\"\r\n [class.nxe-column-lines]=\"showColumnLines()\"\r\n [class.nxe-row-alt]=\"rowAlternationEnabled() && item.rowIndex % 2 === 1\"\r\n [class.nxe-selection]=\"isSelected(item.row)\"\r\n [class.nxe-state-hover]=\"isHovered(item.rowIndex)\"\r\n [class.nxe-edit-row]=\"isRowEditing(item.row)\"\r\n (mouseenter)=\"onRowEnter(item.rowIndex)\"\r\n (mouseleave)=\"onRowLeave()\"\r\n (click)=\"onDataRowClick(item.row, item.rowIndex)\">\r\n @for (i of indents(groupLevelCount()); track i) {\r\n <td class=\"nxe-command-expand nxe-datagrid-group-space\" [attr.aria-colindex]=\"i + 1\"></td>\r\n }\r\n @if (masterDetailEnabled()) {\r\n <!-- dx reuses the group row's toggle for the detail row\r\n (m_master_detail.js:33-43, m_utils.js:462-474), and any click\r\n in the cell toggles (m_grouping.js:523-532 `closest('.dx-datagrid-expand')`).\r\n toggleDetail stops the click there, as dx-selection-disabled does. -->\r\n <td\r\n class=\"nxe-command-expand nxe-datagrid-group-space nxe-datagrid-expand nxe-selection-disabled\"\r\n [attr.aria-colindex]=\"expandColIndex()\"\r\n [attr.aria-label]=\"isDetailExpanded(item.row) ? t('grid.collapse') : t('grid.expand')\"\r\n (click)=\"toggleDetail(item.row, $event)\">\r\n <div\r\n [class.nxe-datagrid-group-opened]=\"isDetailExpanded(item.row)\"\r\n [class.nxe-datagrid-group-closed]=\"!isDetailExpanded(item.row)\"></div>\r\n </td>\r\n }\r\n @if (selectColumnVisible()) {\r\n <td class=\"nxe-command-select\" [attr.aria-colindex]=\"selectColIndex()\">\r\n <span\r\n class=\"nxe-select-checkbox nxe-grid-checkbox nxe-checkbox nxe-datagrid-checkbox-size\"\r\n role=\"checkbox\"\r\n [attr.aria-checked]=\"isSelected(item.row)\"\r\n [class.nxe-checked]=\"isSelected(item.row)\"\r\n (click)=\"onCheckboxClick(item.row, $event)\">\r\n <span class=\"nxe-grid-checkbox-box\"></span>\r\n </span>\r\n </td>\r\n }\r\n @for (col of visibleColumns(); track $index; let ci = $index) {\r\n @if (!isMergeSuppressed(ri, col)) {\r\n <td\r\n [class]=\"col.cssClass()\"\r\n role=\"gridcell\"\r\n [attr.aria-colindex]=\"leadCellCount() + ci + 1\"\r\n [attr.tabindex]=\"isCellTabStop(item.rowIndex, ci) ? 0 : -1\"\r\n (focus)=\"focusCell(item.rowIndex, ci)\"\r\n [attr.aria-roledescription]=\"\r\n editableCell(col) && (cellEditingEnabled() || rowEditingEnabled())\r\n ? t('grid.editableCell')\r\n : null\r\n \"\r\n [style.text-align]=\"align(col)\"\r\n [attr.rowspan]=\"mergeSpan(ri, col)\"\r\n [class.nxe-editor-cell]=\"isEditingCell(item.row, col) || (isRowEditing(item.row) && editableCell(col))\"\r\n (click)=\"onCellClick(item.row, col, $event)\"\r\n (focusout)=\"onEditCellFocusOut(item.row, col, $event)\">\r\n @if (treeMode && ci === 0) {\r\n <!-- dx's tree icons (dx-treelist-icon-container): one 14px slot\r\n per level, then the 14x18 toggle or, on a leaf, one more slot.\r\n Floated as dx floats it in the fixed table, so the text\r\n wraps beside it and starts flush after it. Not named\r\n nxe-treelist-*: the dx mirror would hand it to an app's\r\n newer-dx tree layout (18px slots). -->\r\n <span class=\"nxe-tree-icons\" [class.nxe-tree-icons-select]=\"showCheckboxes()\">\r\n @for (i of indents(item.level || 0); track i) {\r\n <span class=\"nxe-tree-expander-stub\"></span>\r\n }\r\n @if (item.hasChildren) {\r\n <span\r\n class=\"nxe-tree-expander\"\r\n [class.nxe-collapsed]=\"!item.expanded\"\r\n (click)=\"toggleTreeNode(item.nodeKey, $event)\"></span>\r\n } @else {\r\n <span class=\"nxe-tree-expander-stub\"></span>\r\n }\r\n <!-- dx draws a tree list's row checkbox here, in the icon\r\n container after the toggle, not in a command column. -->\r\n @if (showCheckboxes()) {\r\n <span\r\n class=\"nxe-select-checkbox nxe-grid-checkbox nxe-checkbox nxe-datagrid-checkbox-size nxe-tree-checkbox\"\r\n role=\"checkbox\"\r\n [attr.aria-checked]=\"isTreeIndeterminate(item.row) ? 'mixed' : isSelected(item.row)\"\r\n [class.nxe-checked]=\"isSelected(item.row)\"\r\n [class.nxe-indeterminate]=\"isTreeIndeterminate(item.row)\"\r\n (click)=\"onCheckboxClick(item.row, $event)\">\r\n <span class=\"nxe-grid-checkbox-box\"></span>\r\n </span>\r\n }\r\n </span>\r\n }\r\n @if (isEditingCell(item.row, col) || (isRowEditing(item.row) && editableCell(col))) {\r\n @if (templateFor(col.editCellTemplate()); as etpl) {\r\n <ng-container\r\n [ngTemplateOutlet]=\"etpl\"\r\n [ngTemplateOutletContext]=\"editCellContext(item.row, item.rowIndex, ci, col)\" />\r\n } @else if (isEditingCell(item.row, col)) {\r\n <ng-container\r\n [ngTemplateOutlet]=\"cellEditor\"\r\n [ngTemplateOutletContext]=\"{ row: item.row, col: col, mode: 'cell' }\" />\r\n } @else {\r\n <ng-container\r\n [ngTemplateOutlet]=\"cellEditor\"\r\n [ngTemplateOutletContext]=\"{ row: item.row, col: col, mode: 'row' }\" />\r\n }\r\n } @else if (templateFor(col.cellTemplate()); as tpl) {\r\n <ng-container\r\n [ngTemplateOutlet]=\"tpl\"\r\n [ngTemplateOutletContext]=\"cellContext(item.row, item.rowIndex, ci, col)\" />\r\n } @else if (isBooleanCell(col)) {\r\n <!-- dx showEditorAlways: a boolean cell is a dx checkbox, not\r\n \"true\"/\"false\". It is read-only unless the grid edits cells\r\n and the column is editable (m_editing.js:210, 1832-1847);\r\n then one click toggles the value in place. -->\r\n <span\r\n class=\"nxe-grid-checkbox nxe-grid-checkbox-readonly nxe-checkbox nxe-datagrid-checkbox-size\"\r\n role=\"checkbox\"\r\n [class.nxe-grid-checkbox-left]=\"align(col) === 'left'\"\r\n [class.nxe-grid-checkbox-right]=\"align(col) === 'right'\"\r\n [class.nxe-checked]=\"getRaw(item.row, col.dataField()) === true\"\r\n [class.nxe-state-readonly]=\"booleanReadOnly(col)\"\r\n [attr.aria-checked]=\"getRaw(item.row, col.dataField()) === true\"\r\n [attr.aria-readonly]=\"booleanReadOnly(col) ? 'true' : null\"\r\n (click)=\"onBooleanCellClick(item.row, col, $event)\">\r\n <span class=\"nxe-grid-checkbox-box\"></span>\r\n </span>\r\n } @else {\r\n <!-- In an ng-container so the text node carries no padding space:\r\n after the tree icons one would render as a 3px gap. -->\r\n <ng-container>{{ cellText(col, item.row) }}</ng-container>\r\n }\r\n </td>\r\n }\r\n }\r\n @if (rowEditCommandVisible()) {\r\n <td class=\"nxe-command-edit nxe-datagrid-drag-action\" [attr.aria-colindex]=\"editColIndex()\">\r\n @if (isRowEditing(item.row)) {\r\n <a class=\"nxe-link nxe-link-save\" (click)=\"saveRowEdit(item.row, $event)\">{{ t('grid.save') }}</a>\r\n <a class=\"nxe-link nxe-link-cancel\" (click)=\"cancelRowEdit($event)\">{{ t('grid.cancel') }}</a>\r\n } @else {\r\n <a class=\"nxe-link nxe-link-edit\" (click)=\"startRowEdit(item.row, $event)\">{{ t('grid.edit') }}</a>\r\n }\r\n </td>\r\n }\r\n </tr>\r\n @if (masterDetailEnabled() && isDetailExpanded(item.row)) {\r\n <!-- dx's detail row takes row lines as well as column lines, and its one\r\n cell is dx-master-detail-cell (m_master_detail.js:290-294, :325),\r\n rendered as column 0 - so aria-colindex 1. -->\r\n <tr\r\n class=\"nxe-row nxe-master-detail-row\"\r\n [class.nxe-row-lines]=\"showRowLines()\"\r\n [class.nxe-column-lines]=\"showColumnLines()\">\r\n <td class=\"nxe-master-detail-cell nxe-cell-focus-disabled\" aria-colindex=\"1\" [attr.colspan]=\"allColCount()\">\r\n @if (detailTemplate(); as tpl) {\r\n <ng-container\r\n [ngTemplateOutlet]=\"tpl\"\r\n [ngTemplateOutletContext]=\"detailContext(item.row, item.rowIndex)\" />\r\n }\r\n </td>\r\n </tr>\r\n }\r\n }\r\n }\r\n <!-- dx's free-space row (m_rows_view.js:448-466): one cell per column, so the\r\n column lines run on through the space it fills. The row is\r\n role=\"presentation\", as dx's `_createEmptyRow` makes it, so assistive tech\r\n inside role=grid does not meet a row of empty gridcells; its cells take\r\n no role and no aria-colindex: nothing that addresses cells may count them. -->\r\n <tr\r\n role=\"presentation\"\r\n class=\"nxe-row nxe-freespace-row\"\r\n [class.nxe-column-lines]=\"showColumnLines()\"\r\n [style.height.px]=\"freeSpaceHeight() || null\">\r\n @for (i of indents(groupLevelCount()); track i) {\r\n <td class=\"nxe-command-expand nxe-datagrid-group-space\"></td>\r\n }\r\n @if (masterDetailEnabled()) {\r\n <td class=\"nxe-command-expand nxe-datagrid-group-space\"></td>\r\n }\r\n @if (selectColumnVisible()) {\r\n <td class=\"nxe-command-select\"></td>\r\n }\r\n @for (col of visibleColumns(); track $index) {\r\n <td [class]=\"col.cssClass()\"></td>\r\n }\r\n @if (rowEditCommandVisible()) {\r\n <td class=\"nxe-command-edit\"></td>\r\n }\r\n </tr>\r\n </tbody>\r\n @if (hasTotalFooter()) {\r\n <tfoot class=\"nxe-datagrid-total-footer\">\r\n <tr class=\"nxe-row\">\r\n @for (i of indents(groupLevelCount()); track i) {\r\n <td class=\"nxe-command-expand nxe-datagrid-group-space\" [attr.aria-colindex]=\"i + 1\"></td>\r\n }\r\n @if (masterDetailEnabled()) {\r\n <td class=\"nxe-command-expand nxe-datagrid-group-space\" [attr.aria-colindex]=\"expandColIndex()\"></td>\r\n }\r\n @if (selectColumnVisible()) {\r\n <td class=\"nxe-command-select\" [attr.aria-colindex]=\"selectColIndex()\"></td>\r\n }\r\n @for (col of visibleColumns(); track col.dataField()) {\r\n <td\r\n class=\"nxe-datagrid-summary-item\"\r\n [attr.aria-colindex]=\"leadCellCount() + visibleIndexOf(col) + 1\"\r\n [style.text-align]=\"align(col)\">\r\n {{ totalSums().get(col.dataField()) || '' }}\r\n </td>\r\n }\r\n @if (rowEditCommandVisible()) {\r\n <td class=\"nxe-command-edit\" [attr.aria-colindex]=\"editColIndex()\"></td>\r\n }\r\n </tr>\r\n </tfoot>\r\n }\r\n </table>\r\n </div>\r\n\r\n @if (remoteBusy()) {\r\n <!-- Server-side data: a request is in flight over the rows already on screen. -->\r\n <div class=\"nxe-datagrid-loadpanel nxe-datagrid-remote-busy\" role=\"status\" [attr.aria-label]=\"t('grid.remote.loading')\">\r\n <span class=\"nxe-grid-spinner\"></span>\r\n </div>\r\n }\r\n\r\n @if (isEmpty()) {\r\n <!-- dx `.dx-datagrid-rowsview.dx-empty{height:100px}`: our rows view also holds the\r\n <thead>, so the empty body is its own box after the table. dx appends the nodata\r\n span to the rows view outside its scrollable (m_utils.js:206-210) and positions the\r\n load panel `of:` the rows view, header excluded (m_rows_view.js:1023) - both live\r\n in this box. The load panel can: loading() implies a null source, hence no rows.\r\n If the total footer is ever shown for empty data (dx m_summary.js:487-503), this\r\n box has to move between the <tbody> and the <tfoot>. -->\r\n <div class=\"nxe-datagrid-empty-body\">\r\n @if (remoteFailed()) {\r\n <div class=\"nxe-datagrid-remote-error\" role=\"alert\">\r\n <span class=\"nxe-datagrid-remote-error-text\">{{ t('grid.remote.error') }}</span>\r\n <button type=\"button\" class=\"nxe-datagrid-remote-retry\" (click)=\"retryRemote()\">{{ t('grid.remote.retry') }}</button>\r\n </div>\r\n } @else if (!loading()) {\r\n <span class=\"nxe-datagrid-nodata\">{{ noDataText() }}</span>\r\n } @else {\r\n <div class=\"nxe-datagrid-loadpanel\"><span class=\"nxe-grid-spinner\"></span></div>\r\n }\r\n </div>\r\n }\r\n </div>\r\n\r\n @if (pagerVisible()) {\r\n <!-- dx's pager (pagination/content.js) under dx's class names: the page sizes float left;\r\n the pages float right - the info text, then prev, the page buttons and next. dx\r\n renders div[role=button]s; these are real buttons with dx's labels. The prev/next\r\n buttons are empty: the chevron is drawn by CSS. At either end dx only takes the\r\n button out of the tab order (page_index_selector.js), so it keeps focus rather than\r\n dropping it as a disabled button would; a click there is a no-op (goToPage clamps). -->\r\n <div\r\n class=\"nxe-datagrid-pager nxe-pager nxe-grid-pager\"\r\n role=\"navigation\"\r\n [attr.aria-label]=\"pagerCmp()?.label() ?? t('grid.pager.navigation')\">\r\n @if (pagerCmp()?.showPageSizeSelector()) {\r\n <div class=\"nxe-page-sizes\">\r\n @if (pagerCompact()) {\r\n @if (pageSizes().length) {\r\n <select class=\"nxe-pager-size\" [attr.aria-label]=\"t('grid.pager.pageSize')\" (change)=\"onPageSizeSelect($event)\">\r\n @for (s of pageSizes(); track $index) {\r\n <option [value]=\"s\" [selected]=\"s === effectivePageSize()\">{{ s }}</option>\r\n }\r\n </select>\r\n }\r\n } @else {\r\n @for (s of pageSizes(); track $index; let first = $first) {\r\n <button\r\n type=\"button\"\r\n class=\"nxe-page-size\"\r\n [class.nxe-selection]=\"s === effectivePageSize()\"\r\n [class.nxe-first-child]=\"first\"\r\n [attr.aria-label]=\"t('grid.pager.itemsPerPage', s)\"\r\n (click)=\"changePageSize(s)\">{{ s }}</button>\r\n }\r\n }\r\n </div>\r\n }\r\n <div class=\"nxe-pages\">\r\n @if (pagerCmp()?.showInfo()) {\r\n <div class=\"nxe-info nxe-pager-info\">{{ pageInfo() }}</div>\r\n }\r\n <div class=\"nxe-page-indexes nxe-pager-pages\">\r\n @if (pagerNavVisible()) {\r\n <button\r\n type=\"button\"\r\n class=\"nxe-navigate-button nxe-prev-button nxe-pager-nav\"\r\n [class.nxe-button-disable]=\"currentPage() === 0\"\r\n [attr.aria-disabled]=\"currentPage() === 0 ? 'true' : null\"\r\n [attr.tabindex]=\"currentPage() === 0 ? -1 : null\"\r\n [attr.aria-label]=\"t('grid.pager.previous')\"\r\n (click)=\"prevPage()\"></button>\r\n }\r\n @for (item of pageItems(); track item.key) {\r\n @if (item.separator) {\r\n <div class=\"nxe-separator\">. . .</div>\r\n } @else {\r\n <button\r\n type=\"button\"\r\n class=\"nxe-page nxe-pager-page\"\r\n [class.nxe-selection]=\"item.page === currentPage()\"\r\n [class.nxe-active]=\"item.page === currentPage()\"\r\n [attr.aria-label]=\"t('grid.pager.page', item.page + 1)\"\r\n [attr.aria-current]=\"item.page === currentPage() ? 'page' : null\"\r\n (click)=\"goToPage(item.page)\">{{ item.page + 1 }}</button>\r\n }\r\n }\r\n @if (pagerNavVisible()) {\r\n <button\r\n type=\"button\"\r\n class=\"nxe-navigate-button nxe-next-button nxe-pager-nav\"\r\n [class.nxe-button-disable]=\"currentPage() >= pageCount() - 1\"\r\n [attr.aria-disabled]=\"currentPage() >= pageCount() - 1 ? 'true' : null\"\r\n [attr.tabindex]=\"currentPage() >= pageCount() - 1 ? -1 : null\"\r\n [attr.aria-label]=\"t('grid.pager.next')\"\r\n (click)=\"nextPage()\"></button>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n }\r\n </div>\r\n</div>\r\n\r\n<!-- Inline cell/row editor (dxo-editing, orbit addition). `mode: 'cell'` commits on blur/Enter;\r\n `mode: 'row'` buffers on input until the command column's Save. -->\r\n<ng-template #cellEditor let-row=\"row\" let-col=\"col\" let-mode=\"mode\">\r\n @if (col.lookup(); as lookup) {\r\n <select\r\n class=\"nxe-texteditor-input nxe-grid-cell-editor\"\r\n [value]=\"editorInputValue(row, col)\"\r\n (click)=\"$event.stopPropagation()\"\r\n (change)=\"\r\n mode === 'cell'\r\n ? commitCellEdit(row, col, $any($event.target).value)\r\n : bufferRowEdit(col, $any($event.target).value)\r\n \">\r\n <option value=\"\"></option>\r\n @for (item of lookup.dataSource; track $index) {\r\n <option [value]=\"item[lookup.valueExpr ?? 'lovCode']\">\r\n {{ item[lookup.displayExpr ?? 'lovName'] }}\r\n </option>\r\n }\r\n </select>\r\n } @else if (colType(col) === 'boolean') {\r\n <!-- dx's checkbox editor, the same box as the resting boolean cell (never the browser's\r\n native checkbox). Cell mode toggles resting cells in place and never gets here; this\r\n is the row being edited, and a click or Space only buffers until Save. It takes focus\r\n as dx's dxCheckBox does (tabIndex 0, Space toggles: check_box.js:125), so Tab reaches\r\n it with the row's other editors. -->\r\n <span\r\n class=\"nxe-grid-checkbox nxe-grid-checkbox-readonly nxe-checkbox nxe-datagrid-checkbox-size nxe-grid-cell-editor-check\"\r\n role=\"checkbox\"\r\n tabindex=\"0\"\r\n [class.nxe-grid-checkbox-left]=\"align(col) === 'left'\"\r\n [class.nxe-grid-checkbox-right]=\"align(col) === 'right'\"\r\n [class.nxe-checked]=\"editorChecked(row, col)\"\r\n [attr.aria-checked]=\"editorChecked(row, col)\"\r\n (click)=\"toggleEditorCheck(row, col, mode, $event)\"\r\n (keydown.space)=\"toggleEditorCheck(row, col, mode, $event)\">\r\n <span class=\"nxe-grid-checkbox-box\"></span>\r\n </span>\r\n } @else {\r\n <input\r\n type=\"text\"\r\n class=\"nxe-texteditor-input nxe-grid-cell-editor\"\r\n [value]=\"editorInputValue(row, col)\"\r\n (click)=\"$event.stopPropagation()\"\r\n (keydown.enter)=\"mode === 'cell' && commitCellEdit(row, col, $any($event.target).value)\"\r\n (keydown.escape)=\"mode === 'cell' && cancelCellEdit()\"\r\n (blur)=\"mode === 'cell' && commitCellEdit(row, col, $any($event.target).value)\"\r\n (input)=\"mode === 'row' && bufferRowEdit(col, $any($event.target).value)\" />\r\n }\r\n</ng-template>\r\n\r\n<!-- A header cell's indicator block (dx .dx-column-indicators). dx creates the sort span first and\r\n the funnel second; the funnel is prepended when the column is right-aligned\r\n (m_header_filter_core.js _renderIndicator), so a right-aligned column reads [funnel][sort] and\r\n every other [sort][funnel]. An unsorted sortable column keeps an empty `nxe-sort-none` span, as\r\n dx does: hidden in the fixed table, measured by the best-fit pass. -->\r\n<ng-template\r\n #headerIndicators\r\n let-col\r\n let-dir=\"dir\"\r\n let-sortSlot=\"sortSlot\"\r\n let-hf=\"hf\"\r\n let-hfFirst=\"hfFirst\"\r\n let-float=\"float\">\r\n <div class=\"nxe-column-indicators\" role=\"presentation\" [style.float]=\"float\">\r\n @for (kind of hfFirst ? ['funnel', 'sort'] : ['sort', 'funnel']; track kind) {\r\n @if (kind === 'funnel') {\r\n @if (hf) {\r\n <span\r\n class=\"nxe-grid-hf-icon\"\r\n [class.nxe-hf-active]=\"hasHeaderFilter(col)\"\r\n (click)=\"openHeaderFilter(col, $event)\"></span>\r\n }\r\n } @else if (sortSlot) {\r\n <span\r\n class=\"nxe-sort\"\r\n [class.nxe-sort-none]=\"!dir\"\r\n [class.nxe-sort-up]=\"dir === 'asc'\"\r\n [class.nxe-sort-down]=\"dir === 'desc'\"></span>\r\n }\r\n }\r\n </div>\r\n</ng-template>\r\n\r\n<!-- The header-filter popup (#hfPanel) moved to nxe-header-filter-panel.component.html —\r\n openHeaderFilter attaches it through openNxeHeaderFilterOverlay (pivot parity Phase 3a). -->\r\n\r\n<!-- Filter-row operation-chooser dropdown (dx filter menu) -->\r\n<ng-template #frOpMenu>\r\n <div class=\"nxe-fr-op-menu nxe-datagrid\">\r\n @for (item of frMenuOps(); track item.op) {\r\n <div\r\n class=\"nxe-menu-item\"\r\n [class.nxe-menu-item-selected]=\"frMenuColumn() && frOp(frMenuColumn()!) === item.op\"\r\n (click)=\"selectFilterOp(item.op)\">\r\n <span class=\"nxe-icon nxe-icon-filter-operation-{{ opIconSlug(item.op) }}\"></span>\r\n <span class=\"nxe-menu-item-text\">{{ item.label }}</span>\r\n </div>\r\n }\r\n <!-- dx draws Reset with the chooser's own magnifier. -->\r\n <div class=\"nxe-menu-item nxe-fr-reset\" (click)=\"resetFilterRow()\">\r\n <span class=\"nxe-icon nxe-icon-filter-operation-default\"></span>\r\n <span class=\"nxe-menu-item-text\">{{ t('grid.filterRow.reset') }}</span>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n","// @nexterajs/ui/grid — public API.\r\nexport * from './lib/grid/nxe-format.util';\r\nexport * from './lib/grid/nxe-grid-drag';\r\nexport * from './lib/grid/nxe-grid.types';\r\nexport * from './lib/grid/nxe-column.component';\r\nexport * from './lib/grid/nxe-selection.component';\r\nexport * from './lib/grid/nxe-header-filter.component';\r\nexport * from './lib/grid/nxe-header-filter.model';\r\nexport * from './lib/grid/nxe-header-filter-panel.component';\r\nexport * from './lib/grid/nxe-header-filter-overlay';\r\nexport * from './lib/grid/nxe-grouping.component';\r\nexport * from './lib/grid/nxe-summary.component';\r\nexport * from './lib/grid/nxe-paging.component';\r\nexport * from './lib/grid/nxe-editing.component';\r\nexport * from './lib/grid/nxe-filter-row.component';\r\nexport * from './lib/grid/nxe-master-detail.component';\r\nexport * from './lib/grid/nxe-scrolling.component';\r\nexport * from './lib/grid/nxe-excel-export.service';\r\nexport * from './lib/grid/nxe-remote-data-source';\r\nexport * from './lib/grid/nxe-paginator.component';\r\nexport * from './lib/grid/nxe-data-grid.component';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|