@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-pivot.mjs","sources":["../../../projects/nextera-ui/pivot/src/lib/grid/nxe-pivot-excel-export.ts","../../../projects/nextera-ui/pivot/src/lib/grid/nxe-pivot.types.ts","../../../projects/nextera-ui/pivot/src/lib/grid/nxe-pivot-axis.ts","../../../projects/nextera-ui/pivot/src/lib/grid/nxe-pivot-summary.ts","../../../projects/nextera-ui/pivot/src/lib/grid/nxe-pivot-data-source.ts","../../../projects/nextera-ui/pivot/src/lib/grid/nxe-pivot-config.components.ts","../../../projects/nextera-ui/pivot/src/lib/grid/nxe-pivot-field-chip.component.ts","../../../projects/nextera-ui/pivot/src/lib/grid/nxe-pivot-field-panel.component.ts","../../../projects/nextera-ui/pivot/src/lib/grid/nxe-pivot-field-panel.component.html","../../../projects/nextera-ui/pivot/src/lib/grid/nxe-pivot-field-chooser.component.ts","../../../projects/nextera-ui/pivot/src/lib/grid/nxe-pivot-field-chooser.component.html","../../../projects/nextera-ui/pivot/src/lib/grid/nxe-pivot-grid.component.ts","../../../projects/nextera-ui/pivot/src/lib/grid/nxe-pivot-grid.component.html","../../../projects/nextera-ui/pivot/src/lib/grid/nxe-chart.component.ts","../../../projects/nextera-ui/pivot/src/lib/grid/nxe-chart.component.html","../../../projects/nextera-ui/pivot/src/public-api.ts","../../../projects/nextera-ui/pivot/src/nexterajs-ui-pivot.ts"],"sourcesContent":["// Pivot half of the Excel exporter, split out of grid/nxe-excel-export.service.ts so that\r\n// `grid` does not depend on `pivot` (pivot already depends on grid, and ng-packagr rejects\r\n// a cycle between entry points). Behaviour is unchanged; only the file boundary moved.\r\nimport { Injectable } from '@angular/core';\r\nimport type { Worksheet } from '@nexterajs/ui/excel';\r\nimport { exportNxeGridToExcel } from '@nexterajs/ui/grid';\r\nimport type { NxeExcelExportOptions, NxeGridInstance } from '@nexterajs/ui/grid';\r\nimport type { NxePivotGridInstance } from './nxe-pivot.types';\r\n/** Options for {@link exportPivotGrid} — mirrors DevExtreme's `exportPivotGrid({component, worksheet})`. */\r\nexport interface NxeExportPivotGridOptions {\r\n component: NxePivotGridInstance;\r\n /** exceljs `Worksheet` or the in-house one (structural cousins, loosely typed). */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n worksheet: any;\r\n /** 1-based {row, column} the cross-tab starts at (default top-left of the sheet). */\r\n topLeftCell?: { row: number; column: number };\r\n}\r\n\r\nconst HEADER_FILL = {\r\n type: 'pattern' as const,\r\n pattern: 'solid' as const,\r\n fgColor: { argb: 'FFF2F2F2' },\r\n};\r\n\r\n/**\r\n * Replacement for DevExtreme's `exportPivotGrid({component, worksheet})` (from\r\n * `devextreme/excel_exporter`). Walks the pivot's computed cross-tab model — stacked column\r\n * headers (colspan AND rowspan merges — N-level column hierarchies, subtotal/grand-total\r\n * columns, P2-C2), the row headers (standard layout: one column per row field with\r\n * rowspan/colspan merges + \"{value} Total\" rows; tree layout: one indented column), the data\r\n * cells, and the grand-total footer — into the supplied exceljs worksheet, then resolves. The\r\n * caller keeps the surrounding `formatExcel(workbook)` + `writeBuffer()` + `saveAs()` pipeline\r\n * unchanged (drop-in import swap).\r\n */\r\nexport async function exportPivotGrid(opts: NxeExportPivotGridOptions): Promise<void> {\r\n const ws = opts.worksheet;\r\n const model = opts.component.getExportModel();\r\n if (!model) {\r\n return;\r\n }\r\n const r0 = opts.topLeftCell?.row ?? 1;\r\n const c0 = opts.topLeftCell?.column ?? 1;\r\n // W4 Lane 4: dx exports column widths (exceljs export.js `setColumnsWidth`:\r\n // `Math.min(255, Math.floor(px / 7 * 100) / 100)` — 7 = MAX_DIGIT_WIDTH_IN_PIXELS).\r\n // dx measures its rendered areas; a page-less nxe export has no layout to measure, so the\r\n // CONFIGURED `field.width` columns (model.colWidths) export and the rest keep Excel's\r\n // default (DEFAULTS.md).\r\n if (typeof ws.getColumn === 'function') {\r\n model.colWidths.forEach((w, i) => {\r\n if (typeof w === 'number' && isFinite(w)) {\r\n ws.getColumn(c0 + i).width = Math.min(255, Math.floor((w / 7) * 100) / 100);\r\n }\r\n });\r\n }\r\n const headerRowCount = model.columnHeaderRows.length;\r\n const standard = model.rowHeaderLayout === 'standard';\r\n // The model resolves the count for BOTH layouts (tree = 1, +1 when measures live on rows).\r\n const rowHeaderCols = model.rowHeaderColCount;\r\n\r\n const setHeader = (cell: ReturnType<Worksheet['getCell']>, text: string) => {\r\n cell.value = text;\r\n cell.font = { name: 'Calibri Light', bold: true };\r\n cell.fill = HEADER_FILL;\r\n cell.alignment = { horizontal: 'center', vertical: 'middle' };\r\n };\r\n\r\n // Top-left corner — spans the row-header column(s) × all header rows.\r\n const corner = ws.getCell(r0, c0);\r\n setHeader(corner, model.cornerText);\r\n corner.alignment = { horizontal: 'left', vertical: 'middle' };\r\n if (headerRowCount > 1 || rowHeaderCols > 1) {\r\n ws.mergeCells(r0, c0, r0 + headerRowCount - 1, c0 + rowHeaderCols - 1);\r\n }\r\n\r\n // Column headers — each row of {text, colspan, rowspan?} laid out left→right after the\r\n // corner. `covered` tracks columns still occupied by an earlier row's rowspan (a\r\n // \"{value} Total\" / Grand Total / collapsed-parent cell filling the remaining value rows),\r\n // so multi-level column hierarchies land in the right worksheet columns.\r\n const covered = new Map<number, number>(); // worksheet column → covered through header row\r\n model.columnHeaderRows.forEach((hr, hi) => {\r\n let col = c0 + rowHeaderCols;\r\n for (const hcell of hr) {\r\n while ((covered.get(col) ?? 0) > hi) {\r\n col++;\r\n }\r\n const cell = ws.getCell(r0 + hi, col);\r\n setHeader(cell, hcell.text);\r\n const rs = hcell.rowspan ?? 1;\r\n if (hcell.colspan > 1 || rs > 1) {\r\n ws.mergeCells(r0 + hi, col, r0 + hi + rs - 1, col + hcell.colspan - 1);\r\n }\r\n if (rs > 1) {\r\n for (let cc = col; cc < col + hcell.colspan; cc++) {\r\n covered.set(cc, hi + rs);\r\n }\r\n }\r\n col += hcell.colspan;\r\n }\r\n });\r\n\r\n // Body.\r\n let rowNum = r0 + headerRowCount;\r\n const writeValueCells = (\r\n valueFor: (li: number) => number | null,\r\n textFor: (li: number) => string,\r\n dataIndexFor?: (li: number) => number,\r\n ) => {\r\n model.leaves.forEach((leaf, li) => {\r\n // Measures-on-rows: the ROW owns the data index (formats/masks per measure row).\r\n const di = dataIndexFor ? dataIndexFor(li) : leaf.dataIndex;\r\n const cell = ws.getCell(rowNum, c0 + rowHeaderCols + li);\r\n const v = valueFor(li);\r\n if (v != null) {\r\n const mask = model.numFmt(di);\r\n if (typeof v !== 'number') {\r\n // W4 Lane 4: a custom summary's non-numeric totalValue (dx renders it\r\n // as-is) — export its display text, never a number mask over a string.\r\n cell.value = textFor(li);\r\n } else if (mask) {\r\n cell.value = v;\r\n cell.numFmt = mask.replace(/'/g, '\"');\r\n } else if (model.dataFields[di]?.format) {\r\n // A format no Excel mask can express (e.g. `{ formatter }`) → export its text.\r\n cell.value = textFor(li);\r\n } else {\r\n cell.value = v;\r\n }\r\n }\r\n cell.alignment = { horizontal: 'right' };\r\n });\r\n };\r\n\r\n model.rows.forEach((row, ri) => {\r\n if (standard) {\r\n // One worksheet cell per rendered row-header cell, merged over its span — the same\r\n // rowspan/colspan map the DOM renders (parent labels attach to their first child\r\n // row; measures-on-rows caption cells are ordinary headerCells here too).\r\n for (const hc of row.headerCells) {\r\n const labelCell = ws.getCell(rowNum, c0 + hc.col);\r\n labelCell.value = hc.text;\r\n labelCell.font = { name: 'Calibri Light', bold: hc.isTotal };\r\n if (hc.rowspan > 1 || hc.colspan > 1) {\r\n ws.mergeCells(\r\n rowNum,\r\n c0 + hc.col,\r\n rowNum + hc.rowspan - 1,\r\n c0 + hc.col + hc.colspan - 1,\r\n );\r\n }\r\n }\r\n } else {\r\n // Tree layout: the indented label lands only on the FIRST measure row of a split\r\n // node (measureRowspan 0 = continuation row); the measure caption gets its own\r\n // column, exactly as the DOM renders.\r\n if (row.measureRowspan !== 0) {\r\n const labelCell = ws.getCell(rowNum, c0);\r\n labelCell.value = ' '.repeat(Math.max(0, row.level)) + row.label;\r\n labelCell.font = { name: 'Calibri Light', bold: row.level === 0 };\r\n if (row.measureRowspan && row.measureRowspan > 1) {\r\n ws.mergeCells(rowNum, c0, rowNum + row.measureRowspan - 1, c0);\r\n }\r\n }\r\n if (row.measureCaption !== undefined) {\r\n const measureCell = ws.getCell(rowNum, c0 + rowHeaderCols - 1);\r\n measureCell.value = row.measureCaption;\r\n measureCell.font = { name: 'Calibri Light', bold: row.kind === 'T' };\r\n }\r\n }\r\n // Body values come straight from the dense matrix (built once in getModel()).\r\n writeValueCells(\r\n (li) => model.matrix[ri][li],\r\n (li) => model.textMatrix[ri][li],\r\n row.dataIndex !== undefined ? () => row.dataIndex! : undefined,\r\n );\r\n rowNum++;\r\n });\r\n if (model.grandTotalRows) {\r\n // Measures-on-rows footer: one worksheet row per measure; the Grand Total label spans\r\n // the dimension columns × measure rows, captions fill the measure column.\r\n const firstFooterRow = rowNum;\r\n const dimCols = Math.max(1, rowHeaderCols - 1);\r\n for (const g of model.grandTotalRows) {\r\n if (rowNum === firstFooterRow) {\r\n const labelCell = ws.getCell(rowNum, c0);\r\n labelCell.value = model.texts.grandTotal;\r\n labelCell.font = { name: 'Calibri Light', bold: true };\r\n }\r\n const captionCell = ws.getCell(rowNum, c0 + dimCols);\r\n captionCell.value = g.caption;\r\n captionCell.font = { name: 'Calibri Light', bold: true };\r\n writeValueCells(\r\n (li) => g.cells[li].value,\r\n (li) => g.cells[li].text,\r\n () => g.dataIndex,\r\n );\r\n rowNum++;\r\n }\r\n if (rowNum - firstFooterRow > 1 || dimCols > 1) {\r\n ws.mergeCells(firstFooterRow, c0, rowNum - 1, c0 + dimCols - 1);\r\n }\r\n } else if (model.grandTotalCells) {\r\n const labelCell = ws.getCell(rowNum, c0);\r\n labelCell.value = model.texts.grandTotal;\r\n labelCell.font = { name: 'Calibri Light', bold: true };\r\n if (rowHeaderCols > 1) {\r\n ws.mergeCells(rowNum, c0, rowNum, c0 + rowHeaderCols - 1);\r\n }\r\n writeValueCells(\r\n (li) => model.grandTotalCells![li].value,\r\n (li) => model.grandTotalCells![li].text,\r\n );\r\n rowNum++;\r\n }\r\n}\r\n\r\n/** Injectable wrapper for {@link exportNxeGridToExcel} / {@link exportPivotGrid}. */\r\n@Injectable({ providedIn: 'root' })\r\nexport class NxeExcelExportService {\r\n exportDataGrid(grid: NxeGridInstance, opts: NxeExcelExportOptions): Promise<void> {\r\n return exportNxeGridToExcel(grid, opts);\r\n }\r\n\r\n exportPivotGrid(opts: NxeExportPivotGridOptions): Promise<void> {\r\n return exportPivotGrid(opts);\r\n }\r\n}\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\n// Types for the nxe-pivot-grid + nxe-chart subsystem — an in-house 2D cross-tab engine that\r\n// replaces DevExtreme's `nxe-pivot-grid` / `PivotGridDataSource`. Per plan deviation #6 this\r\n// implements the simplified surface the app actually uses: ≤2 row levels, 1 column level,\r\n// data fields nested as the inner column level (`dataFieldArea` defaults to `'column'`), and\r\n// `sum`/`count`/`min`/`max`/`avg` aggregation (the app only uses `sum`).\r\n\r\nimport { NxeColumnFormat } from '@nexterajs/ui/grid';\r\nimport { NxeNumberSeparators } from '@nexterajs/ui/intl';\r\n\r\nexport type NxePivotArea = 'row' | 'column' | 'data' | 'filter';\r\nexport type NxePivotSummaryType = 'sum' | 'count' | 'min' | 'max' | 'avg' | 'custom';\r\n\r\n/** dx `summaryDisplayMode` values (P2-C3; transcribed from m_summary_display_modes.js). */\r\nexport type NxePivotSummaryDisplayMode =\r\n | 'absoluteVariation'\r\n | 'percentVariation'\r\n | 'percentOfColumnTotal'\r\n | 'percentOfRowTotal'\r\n | 'percentOfColumnGrandTotal'\r\n | 'percentOfRowGrandTotal'\r\n | 'percentOfGrandTotal';\r\n\r\n/** dx date `groupInterval` names (m_local_store `DATE_INTERVAL_SELECTORS`); numbers = step. */\r\nexport type NxePivotGroupInterval = 'year' | 'quarter' | 'month' | 'day' | 'dayOfWeek' | number;\r\n\r\n/**\r\n * The `e` object a `calculateSummaryValue` callback receives — dx `SummaryCell` (P2-C3,\r\n * transcribed method-for-method from m_summary_display_modes.js over the engine's visible-tree\r\n * cell store; the display modes and running totals run on the very same machinery). `parent()`\r\n * of a top-level cell is the grand total on that axis; `parent()` of the grand total is null.\r\n * `value()` reads the ORIGINAL aggregate, `value(true)` the post-processed one; a\r\n * row/column/data field (object, or dataField/caption/name id) reads that field's value at the\r\n * cell's path instead.\r\n */\r\nexport interface NxePivotSummaryCell {\r\n parent(direction: 'row' | 'column'): NxePivotSummaryCell | null;\r\n children(direction: 'row' | 'column'): NxePivotSummaryCell[];\r\n child(direction: 'row' | 'column', fieldValue: any): NxePivotSummaryCell | null;\r\n grandTotal(direction?: 'row' | 'column'): NxePivotSummaryCell;\r\n next(direction: 'row' | 'column', allowCrossGroup?: boolean): NxePivotSummaryCell | null;\r\n prev(direction: 'row' | 'column', allowCrossGroup?: boolean): NxePivotSummaryCell | null;\r\n field(area: 'row' | 'column' | 'data'): NxePivotField | null;\r\n slice(field: NxePivotField | string | number, value: any): NxePivotSummaryCell | null;\r\n value(fieldOrCalculated?: NxePivotField | string | number | boolean, isCalculatedValue?: boolean): any;\r\n isPostProcessed(field?: NxePivotField | string | number): boolean;\r\n}\r\n\r\n/**\r\n * The options object dx threads through a `calculateCustomSummary` callback (transcribed from\r\n * DevExtreme 24.2.3 local_store/m_local_store `getAggregator`): ONE object per cell, mutated in\r\n * place across the whole protocol — `{summaryProcess:'start', totalValue:undefined}` first, then\r\n * per defined raw value `summaryProcess='calculate'` + `value`, then `summaryProcess='finalize'`\r\n * with `value` DELETED; the cell renders whatever `totalValue` holds after 'finalize'.\r\n */\r\nexport interface NxePivotCustomSummaryInfo {\r\n summaryProcess: 'start' | 'calculate' | 'finalize';\r\n /** The current record's raw value — present only during 'calculate' (deleted for 'finalize'). */\r\n value?: any;\r\n /** The accumulator/result — whatever the callback leaves here after 'finalize' is the cell. */\r\n totalValue?: any;\r\n}\r\n\r\n/** A DevExtreme PivotGrid field descriptor (the subset the app passes). */\r\nexport interface NxePivotField {\r\n caption?: string;\r\n dataField?: string;\r\n dataType?: 'string' | 'number' | 'date' | 'boolean';\r\n /** Placement; a field with no `area` is defined-but-not-displayed (DevExtreme parity). */\r\n area?: NxePivotArea;\r\n areaIndex?: number;\r\n summaryType?: NxePivotSummaryType;\r\n /** dx custom-summary protocol — used when `summaryType === 'custom'` (see the info type). */\r\n calculateCustomSummary?: (options: NxePivotCustomSummaryInfo) => void;\r\n /** Number-mask string (`#,##0.00`), date format string, or `{ type }`. */\r\n format?: NxeColumnFormat;\r\n expanded?: boolean;\r\n sortOrder?: 'asc' | 'desc';\r\n /** dx: 'value' (default — raw values), 'displayText' (formatted/customizeText'd labels),\r\n * 'none' (load order). The local-store default is 'value' (XmlaStore's is 'displayText'). */\r\n sortBy?: 'value' | 'displayText' | 'none';\r\n /** Column width in px, applied to the field's area column(s) — row-header column for a row\r\n * field, every leaf data column for a data field (dx m_data_controller cell width). */\r\n width?: number;\r\n /** dx: `false` removes a row/column field from its axis entirely and hides a data field's\r\n * columns (dx keeps hidden measures aggregating for sortBySummaryField etc. — the nxe\r\n * engine has no such reader, so it drops them from the model wholesale). */\r\n visible?: boolean;\r\n /** dx: read INSTEAD of `dataField` wherever the field's raw value is taken from a record\r\n * (dimension grouping and measure aggregation both) — m_local_store `prepareFields` only\r\n * builds a dataField selector when none is given (a selector also disables\r\n * `groupInterval` bucketing entirely, exactly as dx skips such fields). */\r\n selector?: (data: any) => any;\r\n customizeText?: (cellInfo: { value: any; valueText: string }) => string;\r\n /** dx m_local_store `prepareFields` bucketing (P2-C3): on a `dataType: 'date'` field the\r\n * named interval replaces the raw value with `getFullYear()` / quarter 1-4 / month 1-12 /\r\n * day-of-month / `getDay()` 0-6; on a `dataType: 'number'` field a positive numeric step\r\n * groups to `Math.floor(value / step) * step` (labelled \"start - end\"). */\r\n groupInterval?: NxePivotGroupInterval;\r\n /** dx `summaryDisplayMode` (P2-C3): post-aggregation display expression over the visible\r\n * cross-tab. Percent modes default the field's format to dx's `'percent'` (precision 0)\r\n * when no explicit format exists. */\r\n summaryDisplayMode?: NxePivotSummaryDisplayMode;\r\n /** dx `calculateSummaryValue` (P2-C3): per-cell post-aggregation callback; wins over\r\n * `summaryDisplayMode`. Receives the dx-shaped {@link NxePivotSummaryCell}. */\r\n calculateSummaryValue?: (e: NxePivotSummaryCell) => any;\r\n /** dx `runningTotal` (P2-C3): accumulate along a 'row' (across columns) or a 'column'\r\n * (down rows), resetting at group boundaries unless `allowCrossGroupCalculation`. */\r\n runningTotal?: 'row' | 'column';\r\n /** dx `allowCrossGroupCalculation` (P2-C3): running totals / variation modes continue\r\n * across group boundaries instead of resetting. */\r\n allowCrossGroupCalculation?: boolean;\r\n /** dx `filterValues` (P2-C3): engine-side record filter, applied at intake before tree\r\n * building/aggregation — on row/column fields and on `area: 'filter'` fields alike. With\r\n * `groupInterval` set, values are compared against the GROUP value (dx filters through\r\n * the prepared selector). */\r\n filterValues?: any[];\r\n /** dx `filterType` (default 'include'): 'exclude' inverts the `filterValues` match. */\r\n filterType?: 'include' | 'exclude';\r\n [key: string]: any;\r\n}\r\n\r\n/**\r\n * P3-C2 (field panel) — one field's panel-owned override, keyed by the field's index in the\r\n * caller's `fields` array and merged over that field when the component constructs its engine.\r\n * The caller's field objects are NEVER mutated (report-output-pivot serializes its own fields\r\n * array in `onSave`); `area: null` marks a REMOVED field (P3-C3: the chooser's All-Fields\r\n * tree drop or checkbox uncheck — dx's only removal paths; a drop outside every area snaps\r\n * back and removes nothing) — the field leaves the layout but stays defined (dx: it remains\r\n * available in the field chooser).\r\n */\r\nexport interface NxePivotFieldOverride {\r\n area?: NxePivotArea | null;\r\n areaIndex?: number;\r\n sortOrder?: 'asc' | 'desc';\r\n expanded?: boolean;\r\n /** P3-C4 (chip header filter): the applied allowed-value list; `null` = the user explicitly\r\n * cleared the filter (full-check → OK), so a declarative `filterValues` seed on the\r\n * caller's field can't resurrect — the same null rule the grid's hfOverride uses. */\r\n filterValues?: any[] | null;\r\n /** Written alongside `filterValues` on apply (always 'include' — see DEFAULTS.md P3-C4). */\r\n filterType?: 'include' | 'exclude';\r\n}\r\n\r\n/** dx `dxPivotGrid.texts` — the subset the pivot renders (missing entries take the dx defaults). */\r\nexport interface NxePivotTexts {\r\n grandTotal?: string;\r\n /** Subtotal-row caption pattern (`{0}` = the closing value) — stored for future subtotal rows. */\r\n total?: string;\r\n noData?: string;\r\n}\r\n\r\n/** DevExtreme's default `texts`, applied wherever the host passes none. */\r\nexport const NXE_PIVOT_TEXTS_DEFAULTS: Required<NxePivotTexts> = {\r\n grandTotal: 'Grand Total',\r\n total: '{0} Total',\r\n noData: 'No data',\r\n};\r\n\r\n/** The plain `[dataSource]` config object the app binds (also accepted: a `NxePivotDataSource`). */\r\nexport interface NxePivotDataSourceOptions {\r\n /** Optional since P1-C3: with no/empty `fields` and `retrieveFields` not `false` (the dx\r\n * default), fields are derived from the store's first record — all area-less. */\r\n fields?: NxePivotField[];\r\n store?: any[];\r\n retrieveFields?: boolean;\r\n dataFieldArea?: 'row' | 'column';\r\n /**\r\n * Locale separators for rendered cell text. Supplied by the pivot component from\r\n * `NXE_NUMBER_SEPARATORS`; omitted means en-US, which is what the engine always did.\r\n */\r\n separators?: NxeNumberSeparators;\r\n}\r\n\r\n/**\r\n * A rendered column leaf = (column-path × data-field). Since P2-C2 the column axis is N-level:\r\n * `kind` mirrors the row kinds — 'D' a value column (a collapsed parent's inline-aggregate\r\n * column included), 'T' a \"{value} Total\" subtotal column closing an expanded parent, 'GT' the\r\n * grand-total column (`colPath: []`).\r\n */\r\nexport interface NxePivotColumnLeaf {\r\n colPath: any[];\r\n dataIndex: number;\r\n /** 'D' value column, 'T' \"{value} Total\" column, 'GT' the grand-total column. */\r\n kind: NxePivotRowKind;\r\n /** Namespaced expand key of the leaf's column node (opaque, `'c:'`…); `''` when no column\r\n * node backs the leaf (grand total / no column fields). */\r\n colKey: string;\r\n /** Level of the column node the leaf renders under (= `colPath.length - 1`; -1 for 'GT'\r\n * and for the no-column-field leaves). */\r\n level: number;\r\n /** Derived alias — `kind === 'GT'` (kept for the pre-P2-C2 model contract). */\r\n isGrandTotal: boolean;\r\n}\r\n\r\n/**\r\n * One column-header cell spanning `colspan` leaf columns. All header rows are DERIVED from the\r\n * leaf array by run-length encoding over consecutive leaves' `colPath` prefixes (P2-C2), so a\r\n * span can never misalign with the leaves beneath it. The optional keys are present ONLY when\r\n * meaningful (dx emits its attributes the same way): `rowspan` when > 1, `isTotal` on\r\n * \"{value} Total\" cells, and the expand trio on chevron cells.\r\n */\r\nexport interface NxePivotHeaderCell {\r\n text: string;\r\n colspan: number;\r\n isGrandTotal: boolean;\r\n /** Set when > 1: a 'T'/'GT'/collapsed-parent cell filling the remaining value rows (dx\r\n * `depthSize`, m_data_controller). */\r\n rowspan?: number;\r\n /** True on \"{value} Total\" cells (dx `dx-row-total nxe-total`, on both axes). */\r\n isTotal?: boolean;\r\n /** True when the cell carries an expand/collapse chevron (dx `dx-expand-icon-container`). */\r\n expandable?: boolean;\r\n expanded?: boolean;\r\n /** The column node's namespaced expand key — present exactly when `expandable`. */\r\n pathKey?: string;\r\n}\r\n\r\n/** dx `rowHeaderLayout` — 'standard' renders one row-header column per row field; 'tree' one indented column. */\r\nexport type NxePivotRowHeaderLayout = 'standard' | 'tree';\r\n\r\n/** dx `showTotalsPrior` — where total rows/columns render relative to the data they close. */\r\nexport type NxePivotTotalsPrior = 'none' | 'rows' | 'columns' | 'both';\r\n\r\n/** Body-row kind: 'D' data row, 'T' \"{value} Total\" subtotal row, 'GT' the grand-total footer. */\r\nexport type NxePivotRowKind = 'D' | 'T' | 'GT';\r\n\r\n/**\r\n * One row-header cell a body `<tr>` renders (standard layout). An EXPANDED parent's label cell\r\n * attaches to its first child's row and `rowspan`s the subtree (dx semantics: the parent\r\n * contributes no value row of its own); a collapsed parent / total label `colspan`s the\r\n * remaining row-header columns.\r\n */\r\nexport interface NxePivotRowHeaderCell {\r\n text: string;\r\n /** 0-based row-header column the cell starts in (= its node's level). */\r\n col: number;\r\n rowspan: number;\r\n colspan: number;\r\n /** True when the cell carries an expand/collapse chevron (a parent node's label). */\r\n expandable: boolean;\r\n expanded: boolean;\r\n /** True for a \"{value} Total\" label cell (dx `dx-row-total nxe-total`). */\r\n isTotal: boolean;\r\n pathKey: string;\r\n}\r\n\r\n/** A visible body row. `rows` carries kinds 'D'/'T' only — the grand total stays the footer. */\r\nexport interface NxePivotBodyRow {\r\n kind: NxePivotRowKind;\r\n label: string;\r\n level: number;\r\n path: any[];\r\n pathKey: string;\r\n hasChildren: boolean;\r\n expanded: boolean;\r\n /** Derived alias — `kind === 'GT'` (always false in `rows`; kept for facade parity). */\r\n isGrandTotal: boolean;\r\n /** Row-header cells this row renders (standard: 0..n cells; tree: exactly one). */\r\n headerCells: NxePivotRowHeaderCell[];\r\n /** `dataFieldArea: 'row'` with ≥2 measures (P2-C3): the measure this row renders — every\r\n * axis row splits into one row per data field, exactly as dx appends metric children to\r\n * each row header item (m_data_controller; with ONE measure the level is omitted, same\r\n * rule as columns). Absent on the default measures-on-columns model. */\r\n dataIndex?: number;\r\n /** The measure-caption cell text of a measures-on-rows row (tree layout renders it as the\r\n * second row-header column; standard layout also carries it inside `headerCells`). */\r\n measureCaption?: string;\r\n /** Measures-on-rows tree layout: the dimension label cell's rowspan on the FIRST measure\r\n * row of each axis row; `0` on continuation rows (no dimension cell at all). Absent on\r\n * the default model — the renderer treats absent as a plain single-row label. */\r\n measureRowspan?: number;\r\n /** Unique per rendered row (pathKey alone repeats once measure rows split); the template\r\n * tracks `trackKey ?? pathKey`. Absent on the default model. */\r\n trackKey?: string;\r\n}\r\n\r\n/**\r\n * The fully-computed cross-tab the grid renders and the Excel export walks. `cell()` resolves\r\n * an aggregated value for a (rowPath × leaf) intersection; `text()` formats it for display.\r\n */\r\nexport interface NxePivotModel {\r\n rowFields: NxePivotField[];\r\n columnFields: NxePivotField[];\r\n dataFields: NxePivotField[];\r\n cornerText: string;\r\n /** Column-area header rows (excludes the top-left corner). Last row = data-field captions. */\r\n columnHeaderRows: NxePivotHeaderCell[][];\r\n leaves: NxePivotColumnLeaf[];\r\n rows: NxePivotBodyRow[];\r\n /** Resolved layout (`'tree'` when the caller passes none — the pre-parity model contract). */\r\n rowHeaderLayout: NxePivotRowHeaderLayout;\r\n /** Row-header `<th>` columns: standard → one per row field (min 1); tree → 1. */\r\n rowHeaderColCount: number;\r\n /** Resolved dx flags, round-tripped so callers/goldens can pin them. `showRowTotals`\r\n * renders only in standard layout (dx: \"applies only if rowHeaderLayout is standard\");\r\n * `showColumnTotals` renders \"{value} Total\" columns on the N-level column axis (P2-C2). */\r\n showRowTotals: boolean;\r\n showColumnTotals: boolean;\r\n showTotalsPrior: NxePivotTotalsPrior;\r\n showRowGrandTotals: boolean;\r\n /** Grand-total footer cells (row grand total), one per leaf — present when enabled and\r\n * measures live on columns (the default). Null when `grandTotalRows` carries the footer. */\r\n grandTotalCells: { value: number | null; text: string }[] | null;\r\n /** Measures-on-rows footer (P2-C3): one footer row per data field, replacing\r\n * `grandTotalCells` when `dataFieldArea: 'row'` with ≥2 measures is active. */\r\n grandTotalRows?:\r\n | { dataIndex: number; caption: string; cells: { value: number | null; text: string }[] }[]\r\n | null;\r\n /** Resolved `dataFieldArea` ('column' unless overridden — dx m_widget default). */\r\n dataFieldArea?: 'row' | 'column';\r\n /** Per-table-column px widths (`field.width`), aligned to `rowHeaderColCount` row-header\r\n * columns followed by `leaves` — `null` where no width is configured. */\r\n colWidths: (number | null)[];\r\n /** W4 Lane 4: per-leaf FORMATTED column labels, one entry per `colPath` level (`[]` for\r\n * the grand-total and no-column-field leaves) — `bindChart` series naming. */\r\n colLabels: string[][];\r\n /** Resolved display strings ({@link NXE_PIVOT_TEXTS_DEFAULTS} merged under any `texts` input). */\r\n texts: Required<NxePivotTexts>;\r\n /** Dense value matrix built once per `getModel()`: `matrix[r][l]` = `rows[r]` × `leaves[l]`\r\n * (subtotal rows/columns included; the grand-total ROW stays `grandTotalCells`).\r\n * Typed escape (W4 Lane 4): a `summaryType: 'custom'` cell renders whatever the callback\r\n * left in `totalValue` — a NON-NUMERIC value (dx allows it) rides through these slots at\r\n * runtime; `text()`/the export pass such values through as text. */\r\n matrix: (number | null)[][];\r\n /** `matrix` formatted per each leaf's data field — what the DOM and the export render. */\r\n textMatrix: string[][];\r\n cell(rowPath: any[], leaf: NxePivotColumnLeaf): number | null;\r\n text(rowPath: any[], leaf: NxePivotColumnLeaf): string;\r\n numFmt(dataIndex: number): string | undefined;\r\n}\r\n\r\n/**\r\n * W4 Lane 2 — the dx `PivotGridCell` subset the outputs carry (transcribed from\r\n * m_data_controller getCellsInfo / getViewHeaderItems, 24.2.3). A DATA cell carries the\r\n * rowPath/columnPath/dataIndex/value/text/rowType/columnType block; a HEADER cell carries\r\n * text/type/expanded (+ `path` where the cell owns an expand key — a narrowing recorded in\r\n * DEFAULTS.md: dx paths every header cell, nxe paths the expandable ones).\r\n */\r\nexport interface NxePivotCellData {\r\n /** Cell text as rendered. */\r\n text?: string;\r\n /** Header cells: the cell's value path along its axis (see the interface note). */\r\n path?: any[];\r\n /** Header cells: 'D' value, 'T' \"{value} Total\", 'GT' grand total (dx `type`). */\r\n type?: NxePivotRowKind;\r\n /** Header cells: expand state (present on expandable cells, like dx's `expanded`). */\r\n expanded?: boolean;\r\n colspan?: number;\r\n rowspan?: number;\r\n /** Data cells: the aggregated value (post display-mode/running-total, as rendered). */\r\n value?: any;\r\n /** Data cells: the row's axis path (`[]` on the grand-total row). */\r\n rowPath?: any[];\r\n /** Data cells: the column leaf's axis path (`[]` on the grand-total column). */\r\n columnPath?: any[];\r\n /** Data cells: the row's kind — 'D' | 'T' | 'GT' (dx `rowType`). */\r\n rowType?: NxePivotRowKind;\r\n /** Data cells: the column leaf's kind (dx `columnType`). */\r\n columnType?: NxePivotRowKind;\r\n /** Data cells: index of the cell's data field among ALL data fields (dx `dataIndex`). */\r\n dataIndex?: number;\r\n dataType?: NxePivotField['dataType'];\r\n format?: NxeColumnFormat;\r\n}\r\n\r\n/**\r\n * dx `onCellClick` / `onCellPrepared` payload (m_widget `_createCellArgs`): the area, the\r\n * DOM-ish indices, the cell element, the cell data, and the three field lists. `onCellClick`\r\n * is CANCELABLE: setting `cancel: true` in a handler prevents the expand/collapse a chevron\r\n * click would perform (dx gates its own toggle on `!args.cancel`).\r\n */\r\nexport interface NxePivotCellEvent {\r\n area: 'row' | 'column' | 'data';\r\n /** DOM `tr.rowIndex` on clicks (dx `_createCellArgs`); model-local row on prepared. */\r\n rowIndex: number;\r\n /** DOM `cell.cellIndex` on clicks; model-local column on prepared. */\r\n columnIndex: number;\r\n cellElement?: HTMLElement | null;\r\n cell: NxePivotCellData;\r\n rowFields: NxePivotField[];\r\n columnFields: NxePivotField[];\r\n dataFields: NxePivotField[];\r\n /** The originating DOM event (clicks only). */\r\n event?: Event;\r\n /** onCellClick only — set true to cancel the chevron's expand/collapse. */\r\n cancel?: boolean;\r\n}\r\n\r\n/** dx `onOptionChanged` payload subset ({name, fullName, value, previousValue}). */\r\nexport interface NxePivotOptionChangedEvent {\r\n name: string;\r\n fullName: string;\r\n value: any;\r\n previousValue: any;\r\n component?: NxePivotGridInstance;\r\n}\r\n\r\n/** dx `onContentReady` payload subset. */\r\nexport interface NxePivotContentReadyEvent {\r\n component: NxePivotGridInstance;\r\n element: HTMLElement;\r\n}\r\n\r\n/** dx `onExporting` payload (ExportController.exportTo, m_export.js): cancelable, and the\r\n * handler may rewrite `fileName` (dx default 'PivotGrid'). */\r\nexport interface NxePivotExportingEvent {\r\n fileName: string;\r\n cancel: boolean;\r\n component?: NxePivotGridInstance;\r\n}\r\n\r\n/** The `.instance` facade the chart exposes (target of `bindChart`). */\r\nexport interface NxeChartInstance {\r\n readonly _isNxeChart: true;\r\n /** Push pivot-derived series data; `bindChart` calls this. */\r\n render(series: NxeChartSeries): void;\r\n}\r\n\r\n/** Series payload handed to the chart by `bindChart`. */\r\nexport interface NxeChartSeries {\r\n /** X-axis category labels (the pivot column leaves / row leaves). */\r\n categories: string[];\r\n /** One series per data field; `values` aligned to `categories`. */\r\n series: { name: string; values: number[] }[];\r\n}\r\n\r\n/**\r\n * W4 Lane 4 — the dx `bindChart` integration options subset (m_chart_integration.js).\r\n * The nxe chart renders ONE pane and ONE value axis, and its fixed orientation equals dx's\r\n * `inverted: true` mapping (rows → categories/arguments, column leaves → series) — the\r\n * established nxe contract since P1 (DEFAULTS.md). Consequences:\r\n * - `dataFieldsDisplayMode` ('singleAxis' | 'splitAxes' | 'splitPanes', dx default\r\n * 'splitAxes'): accepted; no structural effect on a single-pane single-axis chart.\r\n * - `alternateDataFields` (dx default true): orders multi-measure series — column-major with\r\n * the measure inner (true) or measure-major (false), dx's data-item interleaving.\r\n * - `putDataFieldsInto` ('series' default | 'args' | 'both'): with 2+ measures, where the\r\n * ` | {measure caption}` suffix lands — on the series names, on the category labels\r\n * (which then split per measure), or both (dx: sparse items; nxe fills mismatches with 0).\r\n */\r\nexport interface NxePivotBindChartOptions {\r\n dataFieldsDisplayMode?: 'singleAxis' | 'splitAxes' | 'splitPanes';\r\n alternateDataFields?: boolean;\r\n putDataFieldsInto?: 'series' | 'args' | 'both';\r\n [key: string]: any;\r\n}\r\n\r\n/** The pivot-grid `.instance` facade (DevExtreme parity). */\r\nexport interface NxePivotGridInstance {\r\n getDataSource(): { reload(): void };\r\n bindChart(chart: NxeChartInstance | any, options?: NxePivotBindChartOptions | any): void;\r\n /** Export hook — the current computed cross-tab model (null until data loads). */\r\n getExportModel(): NxePivotModel | null;\r\n /** dx parity: RENDER-ONLY re-render/re-layout (dx Widget.repaint never touches the data\r\n * source) — re-runs the measurement pass; expand/layout state and aggregates are kept\r\n * (W4 Lane 1; the pre-W4 facade re-aggregated and wiped chevron state). */\r\n repaint(): void;\r\n /**\r\n * Expand every node on BOTH axes (oracle §e: dx's toolbar expand-all sets `expanded` on\r\n * every row+column field and reloads) and wipe the per-node chevron overrides. Optional\r\n * ONLY because pre-P1-C3 spec literals implement this interface without it — the real\r\n * component always provides both.\r\n */\r\n expandAll?(): void;\r\n /** Collapse-all counterpart of {@link expandAll} (same override-wipe semantics). */\r\n collapseAll?(): void;\r\n /**\r\n * W4 Lane 2 — dx `exportToExcel()` (the built-in export path, m_export.js `exportTo`):\r\n * fires the cancelable `onExporting` (default fileName 'PivotGrid', the handler may\r\n * rename), then drives the standard `exportPivotGrid({component})` pipeline into an\r\n * in-house workbook and saves `<fileName>.xlsx`. Optional for the same reason as\r\n * {@link expandAll} (pre-existing spec literals implement this interface).\r\n */\r\n exportToExcel?(): Promise<void>;\r\n /**\r\n * W4 Lane 2 — dx `option(name[, value])` for the DOCUMENTED pivot options that map to\r\n * component inputs (allowExpandAll, allowFiltering, allowSorting, allowSortingBySummary,\r\n * dataFieldArea, height, rowHeaderLayout, showBorders, showColumnGrandTotals,\r\n * showColumnTotals, showRowGrandTotals, showRowTotals, showTotalsPrior, texts,\r\n * wordWrapEnabled). One-arg = get (also supports 'dataSource', get-only); two-arg = set,\r\n * recorded as an override that WINS over the input binding and fires `onOptionChanged`.\r\n * Unsupported names (dataSource set, nested 'a.b' paths, fieldChooser/fieldPanel/\r\n * stateStoring/scrolling — those live on projected config children) are ignored on set\r\n * and return undefined on get (DEFAULTS.md).\r\n */\r\n option?(name: string, value?: any): any;\r\n /** W4 Lane 2 — dx `updateDimensions()`: re-runs the render/measurement pass (the band\r\n * anchor / dimension sync), exactly like `repaint()` minus dx's full re-render. */\r\n updateDimensions?(): void;\r\n /** W4 Lane 2 — dx `getFieldChooserPopup()` narrowed to the two members anyone calls:\r\n * `show()` opens the chooser overlay (a no-op re-show when already open, dx-true),\r\n * `hide()` disposes it. */\r\n getFieldChooserPopup?(): { show(): void; hide(): void };\r\n}\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\n// nxe-pivot-axis — the shared axis-node abstraction behind NxePivotDataSource (pivot-parity\r\n// P2-C1). Both pivot axes are trees of dimension values and BOTH render all N levels since\r\n// P2-C2; the node shape, the collision-free path-key encoding, the expand-key namespacing, and\r\n// the record-by-record tree construction are axis-agnostic and live here so neither axis needs\r\n// a second implementation.\r\n\r\nimport { NxePivotField } from './nxe-pivot.types';\r\n\r\n/**\r\n * One node of an axis tree (either axis). `pathKey` is the node's namespaced expand key —\r\n * opaque to callers: the component's `toggle()` and `expandedOverrides` round-trip it verbatim.\r\n */\r\nexport interface NxePivotAxisNode {\r\n value: any;\r\n label: string;\r\n path: any[];\r\n pathKey: string;\r\n level: number;\r\n children: NxePivotAxisNode[];\r\n}\r\n\r\n/**\r\n * Path-key encoding. Value segments join on `SEG_SEP` and the row/column/measure sections of an\r\n * aggregation key join on `KEY_SEP`; a non-string segment carries a `<typeof>` + `TYPE_TAG_SEP`\r\n * prefix. All three separators are control characters that cannot occur in real field values, so\r\n * `['A B']` ≠ `['A', 'B']`, number `1` ≠ string `'1'`, `null` ≠ `'null'`, and a deep path can\r\n * never collide with (and attach its children to) an unrelated shallower one. Strings pass\r\n * through untagged (except `''`, which is tagged so `['']` ≠ `[]`), which keeps keys stable;\r\n * a `pathKey` remains an opaque string to callers.\r\n */\r\nconst SEG_SEP = '\\u001f';\r\nconst TYPE_TAG_SEP = '\\u001e';\r\nexport const KEY_SEP = '\\u001d';\r\n\r\n/**\r\n * Expand-key namespace prefixes. A node's `pathKey` is its axis prefix + the encoded value\r\n * path, so a row node can never share an expand key with a column node carrying the same\r\n * values once the column axis becomes expandable (P2-C2). The prefix lives here and ONLY\r\n * here: the data source builds keys through {@link NxePivotAxisTree} and reads overrides\r\n * through {@link readExpandOverride}; the component and every other caller pass keys through\r\n * untouched. NOTE: aggregation keys ({@link pathKeyOf} / {@link prefixKeys}) stay UNPREFIXED —\r\n * the namespace exists only for the expand-state maps.\r\n */\r\nexport const ROW_KEY_PREFIX = 'r:';\r\nexport const COLUMN_KEY_PREFIX = 'c:';\r\n\r\n/** Encode one path segment collision-free (see the separator notes above). */\r\nfunction encodeSegment(value: any): string {\r\n if (typeof value === 'string') {\r\n // '' must not encode to '' — pathKeyOf(['']) would equal pathKeyOf([]) and a blank\r\n // dimension value would then share (and double-count) the grand-total aggregation slot.\r\n return value === '' ? TYPE_TAG_SEP : value;\r\n }\r\n if (value === null) {\r\n return 'null' + TYPE_TAG_SEP;\r\n }\r\n if (value === undefined) {\r\n return 'undefined' + TYPE_TAG_SEP;\r\n }\r\n return typeof value + TYPE_TAG_SEP + String(value);\r\n}\r\n\r\n/** Un-namespaced key of a full path — the building block of the AGGREGATION keys. */\r\nexport function pathKeyOf(path: any[]): string {\r\n return path.map(encodeSegment).join(SEG_SEP);\r\n}\r\n\r\n/** Keys of the inclusive prefixes of a path: `[a,b]` → `['', key([a]), key([a,b])]`, built once. */\r\nexport function prefixKeys(path: any[]): string[] {\r\n const out = [''];\r\n let key = '';\r\n for (let i = 0; i < path.length; i++) {\r\n key = i === 0 ? encodeSegment(path[i]) : key + SEG_SEP + encodeSegment(path[i]);\r\n out.push(key);\r\n }\r\n return out;\r\n}\r\n\r\n/**\r\n * Look up a node's expand override. Keys the component wrote round-trip verbatim (they are\r\n * already namespaced — its `toggle()` passes through whatever `pathKey` the model handed it).\r\n * A key WITHOUT the axis prefix is the pre-namespacing model contract — direct `getModel()`\r\n * callers that built row keys by hand predate the column axis entirely — and is honoured as\r\n * a ROW key (columns were never expandable before the namespace existed).\r\n */\r\nexport function readExpandOverride(\r\n overrides: ReadonlyMap<string, boolean>,\r\n pathKey: string,\r\n): boolean | undefined {\r\n const direct = overrides.get(pathKey);\r\n if (direct !== undefined) {\r\n return direct;\r\n }\r\n if (pathKey.startsWith(ROW_KEY_PREFIX)) {\r\n return overrides.get(pathKey.slice(ROW_KEY_PREFIX.length));\r\n }\r\n return undefined;\r\n}\r\n\r\n/**\r\n * Record-by-record axis-tree construction, extracted from the P1 row-tree build and\r\n * generalized over the axis' field list + a value-reader so BOTH axes share it. One instance\r\n * per axis per build: `insert(rec)` reads the record's dimension tuple through `readValue`,\r\n * creates any missing nodes along the path (labelled through `labelOf`), and returns the raw\r\n * tuple so the caller can feed the aggregation prefixes without re-reading the record.\r\n * Siblings keep first-seen order — sorting is the data source's separate post-load pass.\r\n */\r\nexport class NxePivotAxisTree {\r\n /** Level-0 nodes in first-seen order (the data source sorts them in place afterwards). */\r\n readonly roots: NxePivotAxisNode[] = [];\r\n private readonly index = new Map<string, NxePivotAxisNode>();\r\n\r\n constructor(\r\n private readonly fields: NxePivotField[],\r\n private readonly readValue: (rec: any, field: NxePivotField) => any,\r\n private readonly labelOf: (field: NxePivotField, raw: any) => string,\r\n private readonly keyPrefix: string,\r\n ) {}\r\n\r\n /** Look up a node by its namespaced `pathKey` (`keyPrefix` + encoded value path). */\r\n find(pathKey: string): NxePivotAxisNode | undefined {\r\n return this.index.get(pathKey);\r\n }\r\n\r\n /** Insert one record's dimension tuple; returns the raw values (aligned to the fields). */\r\n insert(rec: any): any[] {\r\n const raw = this.fields.map((f) => this.readValue(rec, f));\r\n let level = 0;\r\n let parentPath: any[] = [];\r\n let parentKey = this.keyPrefix;\r\n let siblings = this.roots;\r\n for (const value of raw) {\r\n const path = [...parentPath, value];\r\n const pathKey =\r\n level === 0\r\n ? parentKey + encodeSegment(value)\r\n : parentKey + SEG_SEP + encodeSegment(value);\r\n let node = this.index.get(pathKey);\r\n if (!node) {\r\n node = {\r\n value,\r\n label: this.labelOf(this.fields[level], value),\r\n path,\r\n pathKey,\r\n level,\r\n children: [],\r\n };\r\n this.index.set(pathKey, node);\r\n siblings.push(node);\r\n }\r\n siblings = node.children;\r\n parentPath = path;\r\n parentKey = pathKey;\r\n level++;\r\n }\r\n return raw;\r\n }\r\n}\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\n// nxe-pivot-summary — the dx post-aggregation machinery: `summaryDisplayMode` (the percent\r\n// modes + absolute/percent variation), `runningTotal`, and the `calculateSummaryValue` cell\r\n// facade. Transcribed from DevExtreme 24.2.3\r\n// __internal/grids/pivot_grid/summary_display_modes/m_summary_display_modes.js (SummaryCell,\r\n// summaryDictionary, getExpression, applyDisplaySummaryMode, applyRunningTotal) — the engine\r\n// builds the same shape dx loads (visible axis trees + per-cell value arrays, index 0 = the\r\n// grand total on BOTH axes) once per getModel() and runs these passes over it; the dense\r\n// matrix then reads the post-processed values.\r\n\r\nimport { NxePivotField, NxePivotSummaryCell } from './nxe-pivot.types';\r\n\r\nconst COLUMN = 'column';\r\nconst ROW = 'row';\r\n\r\n/** One visible axis node (dx loaded-data header item): raw group value + cell index. */\r\nexport interface NxePivotSummaryNode {\r\n value: any;\r\n index: number;\r\n /** Present only for an EXPANDED parent — a collapsed node is a leaf, exactly as dx only\r\n * loads children for expanded paths. */\r\n children?: NxePivotSummaryNode[];\r\n}\r\n\r\n/**\r\n * dx `loadedData`: `values[rowIndex][columnIndex]` is one array with a slot per data field.\r\n * The passes attach `originalCell` (pre-pass clone) and `postProcessedFlags` to each array,\r\n * exactly as dx does — `cell[i]` is the post-processed value, `originalCell[i]` the raw one.\r\n */\r\nexport interface NxePivotSummaryData {\r\n rows: NxePivotSummaryNode[];\r\n columns: NxePivotSummaryNode[];\r\n values: any[][][];\r\n grandTotalRowIndex: number;\r\n grandTotalColumnIndex: number;\r\n}\r\n\r\n/** dx `descriptions` (the subset these passes read). */\r\nexport interface NxePivotSummaryDescriptions {\r\n rows: NxePivotField[];\r\n columns: NxePivotField[];\r\n values: NxePivotField[];\r\n}\r\n\r\nfunction isDefined(value: any): boolean {\r\n return value !== null && value !== undefined;\r\n}\r\n\r\nfunction isObject(value: any): boolean {\r\n return value !== null && typeof value === 'object' && !Array.isArray(value);\r\n}\r\n\r\n/**\r\n * dx m_widget_utils `foreachTree` (sync form, no splice-compensation — these passes never\r\n * mutate the tree): visits every node with `members = [node, ...ancestors]`; children BEFORE\r\n * their parent when `parentAtFirst` is false (the order both passes rely on — a running-total\r\n * cell always finds its `prev` already accumulated).\r\n */\r\nfunction foreachTree(\r\n items: NxePivotSummaryNode[],\r\n callback: (members: NxePivotSummaryNode[]) => void,\r\n parentAtFirst: boolean,\r\n members: NxePivotSummaryNode[] = [],\r\n): void {\r\n for (const item of items) {\r\n members.unshift(item);\r\n if (parentAtFirst) {\r\n callback(members);\r\n }\r\n if (item.children) {\r\n foreachTree(item.children, callback, parentAtFirst, members);\r\n }\r\n if (!parentAtFirst) {\r\n callback(members);\r\n }\r\n members.shift();\r\n }\r\n}\r\n\r\n/** dx m_widget_utils `findField`: match a field id against name/caption/dataField/index. */\r\nfunction findField(fields: NxePivotField[], id: any): number {\r\n if (fields && isDefined(id)) {\r\n for (let i = 0; i < fields.length; i++) {\r\n const field = fields[i];\r\n if (\r\n field['name'] === id ||\r\n field.caption === id ||\r\n field.dataField === id ||\r\n field['index'] === id\r\n ) {\r\n return i;\r\n }\r\n }\r\n }\r\n return -1;\r\n}\r\n\r\ninterface FieldsCache {\r\n fields: Map<any, NxePivotField | undefined>;\r\n positions: Map<NxePivotField, { area: string | undefined; index: number }>;\r\n}\r\n\r\nfunction createCache(): FieldsCache {\r\n return { fields: new Map(), positions: new Map() };\r\n}\r\n\r\n/**\r\n * dx `getFieldPos`: resolve a field id/object to `{area, index-within-its-description-list}`.\r\n * nxe extension: an OBJECT that is not one of the engine's own field copies (the engine clones\r\n * every input field) falls back to id matching on its dataField/caption, so callers can pass\r\n * their original field objects to `value(field)`/`slice(field)` the way dx callers do.\r\n */\r\nfunction getFieldPos(\r\n descriptions: NxePivotSummaryDescriptions,\r\n field: any,\r\n cache: FieldsCache,\r\n): { area: string | undefined; index: number } {\r\n let fieldParams: { area: string | undefined; index: number } = {\r\n area: undefined,\r\n index: -1,\r\n };\r\n if (!isObject(field)) {\r\n if (cache.fields.has(field)) {\r\n field = cache.fields.get(field);\r\n } else {\r\n const allFields = descriptions.columns\r\n .concat(descriptions.rows)\r\n .concat(descriptions.values);\r\n const fieldIndex = findField(allFields, field);\r\n const resolved = allFields[fieldIndex];\r\n cache.fields.set(field, resolved);\r\n field = resolved;\r\n }\r\n }\r\n if (field) {\r\n const cached = cache.positions.get(field);\r\n if (cached) {\r\n return cached;\r\n }\r\n const area = field.area || 'data';\r\n const list: NxePivotField[] =\r\n (descriptions as any)[area === 'data' ? 'values' : `${area}s`] ?? [];\r\n let index = list.indexOf(field);\r\n if (index === -1) {\r\n // Caller-owned object (not the engine's copy) — match it by id instead.\r\n index = findField(list, field.dataField ?? field.caption ?? field['name']);\r\n }\r\n fieldParams = { area, index };\r\n cache.positions.set(field, fieldParams);\r\n }\r\n return fieldParams;\r\n}\r\n\r\nfunction getPathFieldName(dimension: string | undefined): '_rowPath' | '_columnPath' {\r\n return dimension === ROW ? '_rowPath' : '_columnPath';\r\n}\r\n\r\nconst NULL = null;\r\n\r\nconst calculatePercentValue = function (value: any, totalValue: any): number | null {\r\n let result: number | null = value / totalValue;\r\n if (!isDefined(value) || isNaN(result as number)) {\r\n result = NULL;\r\n }\r\n return result;\r\n};\r\n\r\nconst percentOfGrandTotal = function (e: NxeSummaryCell, dimension?: 'row' | 'column') {\r\n return calculatePercentValue(e.value(), e.grandTotal(dimension).value());\r\n};\r\n\r\nconst percentOfParent = function (e: NxeSummaryCell, dimension: 'row' | 'column') {\r\n const parent = e.parent(dimension);\r\n const parentValue = parent ? parent.value() : e.value();\r\n return calculatePercentValue(e.value(), parentValue);\r\n};\r\n\r\nconst createAbsoluteVariationExp = function (allowCrossGroup: boolean | undefined) {\r\n return function (e: NxeSummaryCell) {\r\n const prevCell = e.prev(COLUMN, allowCrossGroup);\r\n const prevValue = prevCell && prevCell.value();\r\n if (isDefined(prevValue) && isDefined(e.value())) {\r\n return e.value() - prevValue;\r\n }\r\n return NULL;\r\n };\r\n};\r\n\r\nconst createPercentVariationExp = function (allowCrossGroup: boolean | undefined) {\r\n const absoluteExp = createAbsoluteVariationExp(allowCrossGroup);\r\n return function (e: NxeSummaryCell) {\r\n const absVar = absoluteExp(e);\r\n const prevCell = e.prev(COLUMN, allowCrossGroup);\r\n const prevValue = prevCell && prevCell.value();\r\n return absVar !== NULL && prevValue ? absVar / prevValue : NULL;\r\n };\r\n};\r\n\r\n/** dx `summaryDictionary` — the five percent display modes. */\r\nexport const summaryDictionary: Record<string, (e: NxeSummaryCell) => any> = {\r\n percentOfColumnTotal: (e) => percentOfParent(e, ROW),\r\n percentOfRowTotal: (e) => percentOfParent(e, COLUMN),\r\n percentOfColumnGrandTotal: (e) => percentOfGrandTotal(e, ROW),\r\n percentOfRowGrandTotal: (e) => percentOfGrandTotal(e, COLUMN),\r\n percentOfGrandTotal: (e) => percentOfGrandTotal(e),\r\n};\r\n\r\nconst getPrevCellCrossGroup = function (\r\n cell: NxeSummaryCell | null | undefined,\r\n direction: 'row' | 'column',\r\n): NxeSummaryCell | null | undefined {\r\n if (!cell || !cell.parent(direction)) {\r\n return undefined;\r\n }\r\n let prevCell = cell.prev(direction);\r\n if (!prevCell) {\r\n prevCell = getPrevCellCrossGroup(cell.parent(direction), direction) as NxeSummaryCell;\r\n }\r\n return prevCell;\r\n};\r\n\r\n/** dx `createRunningTotalExpr`: accumulate along the axis, resetting at group boundaries\r\n * unless `allowCrossGroupCalculation` (which then continues from the previous GROUP's cell). */\r\nconst createRunningTotalExpr = (field: NxePivotField) => {\r\n if (!field.runningTotal) {\r\n return undefined;\r\n }\r\n const direction = field.runningTotal === COLUMN ? ROW : COLUMN;\r\n return (e: NxeSummaryCell) => {\r\n const prevCell = field.allowCrossGroupCalculation\r\n ? getPrevCellCrossGroup(e, direction)\r\n : e.prev(direction, false);\r\n const calculatedValue = e.value(true);\r\n const originalValue = e.value(false);\r\n const prevCalculatedValue = prevCell?.value(true);\r\n switch (true) {\r\n case isDefined(calculatedValue) && isDefined(originalValue) && isDefined(prevCalculatedValue):\r\n return prevCalculatedValue + calculatedValue;\r\n case isDefined(prevCalculatedValue):\r\n return prevCalculatedValue;\r\n default:\r\n return calculatedValue;\r\n }\r\n };\r\n};\r\n\r\n/**\r\n * The `e` object a `calculateSummaryValue` callback receives — dx `SummaryCell`, transcribed\r\n * method-for-method. Paths are `[node, ...ancestors, grandTotalWrapper]` node arrays; the\r\n * wrapper (index 0) IS the grand total on its axis, so `parent()` of a top-level value is the\r\n * grand total cell and `parent()` of the grand total is null — exactly dx's shape.\r\n */\r\nexport class NxeSummaryCell implements NxePivotSummaryCell {\r\n private readonly _columnPath: NxePivotSummaryNode[];\r\n private readonly _rowPath: NxePivotSummaryNode[];\r\n private readonly _fieldIndex: number;\r\n private readonly _fieldsCache: FieldsCache;\r\n private readonly _data: NxePivotSummaryData;\r\n private readonly _descriptions: NxePivotSummaryDescriptions;\r\n private readonly _cell: any[] | undefined;\r\n\r\n constructor(\r\n columnPath: NxePivotSummaryNode[],\r\n rowPath: NxePivotSummaryNode[],\r\n data: NxePivotSummaryData,\r\n descriptions: NxePivotSummaryDescriptions,\r\n fieldIndex: number,\r\n fieldsCache?: FieldsCache,\r\n ) {\r\n this._columnPath = columnPath;\r\n this._rowPath = rowPath;\r\n this._fieldIndex = fieldIndex;\r\n this._fieldsCache = fieldsCache || createCache();\r\n this._data = data;\r\n this._descriptions = descriptions;\r\n const cell =\r\n data.values &&\r\n data.values[rowPath[0].index] &&\r\n data.values[rowPath[0].index][columnPath[0].index];\r\n if (cell) {\r\n (cell as any).originalCell = (cell as any).originalCell || cell.slice();\r\n (cell as any).postProcessedFlags = (cell as any).postProcessedFlags || [];\r\n this._cell = cell;\r\n }\r\n }\r\n\r\n private _getPath(dimension: string | undefined): NxePivotSummaryNode[] {\r\n return this[getPathFieldName(dimension)];\r\n }\r\n\r\n private _getDimension(dimension: string): NxePivotField[] {\r\n return dimension === ROW ? this._descriptions.rows : this._descriptions.columns;\r\n }\r\n\r\n private _createCell(config: {\r\n _columnPath?: NxePivotSummaryNode[];\r\n _rowPath?: NxePivotSummaryNode[];\r\n }): NxeSummaryCell {\r\n return new NxeSummaryCell(\r\n config._columnPath || this._columnPath,\r\n config._rowPath || this._rowPath,\r\n this._data,\r\n this._descriptions,\r\n this._fieldIndex,\r\n );\r\n }\r\n\r\n parent(direction: 'row' | 'column'): NxeSummaryCell | null {\r\n const path = this._getPath(direction).slice();\r\n const config: any = {};\r\n path.shift();\r\n if (path.length) {\r\n config[getPathFieldName(direction)] = path;\r\n return this._createCell(config);\r\n }\r\n return NULL;\r\n }\r\n\r\n children(direction: 'row' | 'column'): NxeSummaryCell[] {\r\n const path = this._getPath(direction).slice();\r\n const item = path[0];\r\n const result: NxeSummaryCell[] = [];\r\n const cellConfig: any = {};\r\n if (item.children) {\r\n for (let i = 0; i < item.children.length; i += 1) {\r\n cellConfig[getPathFieldName(direction)] = [item.children[i]].concat(path.slice());\r\n result.push(this._createCell(cellConfig));\r\n }\r\n }\r\n return result;\r\n }\r\n\r\n grandTotal(direction?: 'row' | 'column'): NxeSummaryCell {\r\n const config: any = {};\r\n const rowPath = this._rowPath;\r\n const columnPath = this._columnPath;\r\n const dimensionPath = this._getPath(direction);\r\n const pathFieldName = getPathFieldName(direction);\r\n if (!direction) {\r\n config._rowPath = [rowPath[rowPath.length - 1]];\r\n config._columnPath = [columnPath[columnPath.length - 1]];\r\n } else {\r\n config[pathFieldName] = [dimensionPath[dimensionPath.length - 1]];\r\n }\r\n return this._createCell(config);\r\n }\r\n\r\n next(direction: 'row' | 'column', allowCrossGroup?: boolean): NxeSummaryCell | null {\r\n const currentPath = this._getPath(direction);\r\n const item = currentPath[0];\r\n let parent = this.parent(direction);\r\n let siblings: NxeSummaryCell[] = [];\r\n if (parent) {\r\n const index = currentPath[1].children!.indexOf(item);\r\n siblings = parent.children(direction);\r\n if (siblings[index + 1]) {\r\n return siblings[index + 1];\r\n }\r\n }\r\n if (allowCrossGroup && parent) {\r\n do {\r\n parent = parent.next(direction, allowCrossGroup);\r\n siblings = parent ? parent.children(direction) : [];\r\n } while (parent && !siblings.length);\r\n return siblings[0] || NULL;\r\n }\r\n return NULL;\r\n }\r\n\r\n prev(direction: 'row' | 'column', allowCrossGroup?: boolean): NxeSummaryCell | null {\r\n const currentPath = this._getPath(direction);\r\n const item = currentPath[0];\r\n let parent = this.parent(direction);\r\n let siblings: NxeSummaryCell[] = [];\r\n if (parent) {\r\n const index = currentPath[1].children!.indexOf(item);\r\n siblings = parent.children(direction);\r\n if (siblings[index - 1]) {\r\n return siblings[index - 1];\r\n }\r\n }\r\n if (allowCrossGroup && parent) {\r\n do {\r\n parent = parent.prev(direction, allowCrossGroup);\r\n siblings = parent ? parent.children(direction) : [];\r\n } while (parent && !siblings.length);\r\n return siblings[siblings.length - 1] || NULL;\r\n }\r\n return NULL;\r\n }\r\n\r\n cell(): any[] | undefined {\r\n return this._cell;\r\n }\r\n\r\n field(area: 'row' | 'column' | 'data'): NxePivotField | null {\r\n if (area === 'data') {\r\n return this._descriptions.values[this._fieldIndex] ?? NULL;\r\n }\r\n const path = this._getPath(area);\r\n const descriptions = this._getDimension(area);\r\n const field = descriptions[path.length - 2];\r\n return field || NULL;\r\n }\r\n\r\n child(direction: 'row' | 'column', fieldValue: any): NxeSummaryCell | null {\r\n let childLevelField: NxePivotField | null | undefined;\r\n const children = this.children(direction);\r\n for (let i = 0; i < children.length; i += 1) {\r\n childLevelField = childLevelField || children[i].field(direction);\r\n if (children[i].value(childLevelField as any) === fieldValue) {\r\n return children[i];\r\n }\r\n }\r\n return NULL;\r\n }\r\n\r\n slice(field: any, value: any): NxeSummaryCell | null {\r\n const config: any = {};\r\n const fieldPos = getFieldPos(this._descriptions, field, this._fieldsCache);\r\n const { area } = fieldPos;\r\n const fieldIndex = fieldPos.index;\r\n let sliceCell: NxeSummaryCell | null = NULL;\r\n if (area === ROW || area === COLUMN) {\r\n const path = this._getPath(area).slice();\r\n if (fieldIndex === -1) {\r\n return sliceCell;\r\n }\r\n const level = path.length - 2 - fieldIndex;\r\n if (path[level]) {\r\n for (let i = level; i >= 0; i -= 1) {\r\n if (path[i + 1]) {\r\n const childItems = path[i + 1].children || [];\r\n const currentValue = i === level ? value : path[i].value;\r\n (path as any)[i] = undefined;\r\n for (let childIndex = 0; childIndex < childItems.length; childIndex += 1) {\r\n if (childItems[childIndex].value === currentValue) {\r\n path[i] = childItems[childIndex];\r\n break;\r\n }\r\n }\r\n }\r\n if (path[i] === undefined) {\r\n return sliceCell;\r\n }\r\n }\r\n config[getPathFieldName(area)] = path;\r\n sliceCell = this._createCell(config);\r\n }\r\n }\r\n return sliceCell;\r\n }\r\n\r\n value(arg1?: any, arg2?: boolean): any {\r\n const cell = this._cell;\r\n let fieldIndex = this._fieldIndex;\r\n const fistArgIsBoolean = arg1 === true || arg1 === false;\r\n const field = !fistArgIsBoolean ? arg1 : NULL;\r\n const needCalculatedValue = (fistArgIsBoolean && arg1) || arg2;\r\n if (isDefined(field)) {\r\n const fieldPos = getFieldPos(this._descriptions, field, this._fieldsCache);\r\n fieldIndex = fieldPos.index;\r\n if (fieldPos.area !== 'data') {\r\n if (fieldIndex === -1) {\r\n return undefined;\r\n }\r\n const path = this._getPath(fieldPos.area);\r\n const level = path.length - 2 - fieldIndex;\r\n return path[level] ? path[level].value : undefined;\r\n }\r\n }\r\n if (cell && (cell as any).originalCell) {\r\n return needCalculatedValue ? cell[fieldIndex] : (cell as any).originalCell[fieldIndex];\r\n }\r\n return NULL;\r\n }\r\n\r\n isPostProcessed(field?: any): boolean {\r\n let fieldIndex = this._fieldIndex;\r\n if (isDefined(field)) {\r\n const fieldPos = getFieldPos(this._descriptions, field, this._fieldsCache);\r\n fieldIndex = fieldPos.index;\r\n if (fieldPos.area !== 'data') {\r\n return false;\r\n }\r\n }\r\n return !!(this._cell && (this._cell as any).postProcessedFlags[fieldIndex]);\r\n }\r\n}\r\n\r\n/**\r\n * dx `getExpression`: `calculateSummaryValue` wins outright; else the `summaryDisplayMode`\r\n * dictionary (+ the two variation modes). A percent mode on a format-less field sets the\r\n * field's format to dx's `'percent'` (here the equivalent `{ type: 'percent' }` object — a\r\n * bare string is an LDML mask to the nxe formatter); dx's default percent precision is 0\r\n * (verified: localization/number.js `_formatNumberCore` coerces undefined precision to 0).\r\n */\r\nexport function getExpression(field: NxePivotField): ((e: NxeSummaryCell) => any) | null {\r\n const { summaryDisplayMode } = field;\r\n const crossGroupCalculation = field.allowCrossGroupCalculation;\r\n let expression: ((e: NxeSummaryCell) => any) | null = NULL;\r\n if (typeof field.calculateSummaryValue === 'function') {\r\n expression = field.calculateSummaryValue;\r\n } else if (summaryDisplayMode) {\r\n if (summaryDisplayMode === 'absoluteVariation') {\r\n expression = createAbsoluteVariationExp(crossGroupCalculation);\r\n } else if (summaryDisplayMode === 'percentVariation') {\r\n expression = createPercentVariationExp(crossGroupCalculation);\r\n } else {\r\n expression = summaryDictionary[summaryDisplayMode] ?? NULL;\r\n }\r\n if (expression && !field.format && summaryDisplayMode.indexOf('percent') !== -1) {\r\n field.format = { type: 'percent' };\r\n }\r\n }\r\n return expression;\r\n}\r\n\r\n/** dx `processDataCell`: restore `originalCell` before a re-run (the running-total pass keeps\r\n * the display-mode results — `allowResetting` flips only after IT ran once). */\r\nfunction processDataCell(\r\n data: NxePivotSummaryData,\r\n rowIndex: number,\r\n columnIndex: number,\r\n isRunningTotalCalculation: boolean,\r\n): void {\r\n const values: any = (data.values[rowIndex][columnIndex] =\r\n data.values[rowIndex][columnIndex] || []);\r\n const { originalCell } = values;\r\n if (!originalCell) {\r\n return;\r\n }\r\n if (values.allowResetting || !isRunningTotalCalculation) {\r\n data.values[rowIndex][columnIndex] = originalCell.slice();\r\n }\r\n (data.values[rowIndex][columnIndex] as any).allowResetting = isRunningTotalCalculation;\r\n}\r\n\r\n/**\r\n * dx `applyDisplaySummaryMode`: evaluate each data field's expression over every visible\r\n * row × column intersection (grand totals included), children before parents, writing the\r\n * result into `cell[i]` (`originalCell` keeps the raw aggregates for `value(false)`).\r\n * The dx `isEmpty` bookkeeping (hideEmptySummaryCells) is dropped — no nxe reader exists.\r\n */\r\nexport function applyDisplaySummaryMode(\r\n descriptions: NxePivotSummaryDescriptions,\r\n data: NxePivotSummaryData,\r\n): void {\r\n const expressions: (((e: NxeSummaryCell) => any) | null)[] = [];\r\n const columnElements: NxePivotSummaryNode[] = [\r\n { value: undefined, index: data.grandTotalColumnIndex, children: data.columns },\r\n ];\r\n const rowElements: NxePivotSummaryNode[] = [\r\n { value: undefined, index: data.grandTotalRowIndex, children: data.rows },\r\n ];\r\n const valueFields = descriptions.values;\r\n const fieldsCache = createCache();\r\n data.values = data.values || [];\r\n foreachTree(\r\n rowElements,\r\n (rowPath) => {\r\n const rowItem = rowPath[0];\r\n data.values[rowItem.index] = data.values[rowItem.index] || [];\r\n foreachTree(\r\n columnElements,\r\n (columnPath) => {\r\n const columnItem = columnPath[0];\r\n processDataCell(data, rowItem.index, columnItem.index, false);\r\n for (let i = 0; i < valueFields.length; i += 1) {\r\n const field = valueFields[i];\r\n const expression = (expressions[i] =\r\n expressions[i] === undefined ? getExpression(field) : expressions[i]);\r\n if (expression) {\r\n const expressionArg = new NxeSummaryCell(\r\n [...columnPath],\r\n [...rowPath],\r\n data,\r\n descriptions,\r\n i,\r\n fieldsCache,\r\n );\r\n const cell = expressionArg.cell()!;\r\n cell[i] = expression(expressionArg);\r\n (cell as any).postProcessedFlags[i] = true;\r\n }\r\n }\r\n },\r\n false,\r\n );\r\n },\r\n false,\r\n );\r\n}\r\n\r\n/** dx `applyRunningTotal` — runs AFTER the display-mode pass (accumulates `value(true)`). */\r\nexport function applyRunningTotal(\r\n descriptions: NxePivotSummaryDescriptions,\r\n data: NxePivotSummaryData,\r\n): void {\r\n const expressions: (((e: NxeSummaryCell) => any) | undefined)[] = [];\r\n const columnElements: NxePivotSummaryNode[] = [\r\n { value: undefined, index: data.grandTotalColumnIndex, children: data.columns },\r\n ];\r\n const rowElements: NxePivotSummaryNode[] = [\r\n { value: undefined, index: data.grandTotalRowIndex, children: data.rows },\r\n ];\r\n const valueFields = descriptions.values;\r\n const fieldsCache = createCache();\r\n data.values = data.values || [];\r\n foreachTree(\r\n rowElements,\r\n (rowPath) => {\r\n const rowItem = rowPath[0];\r\n data.values[rowItem.index] = data.values[rowItem.index] || [];\r\n foreachTree(\r\n columnElements,\r\n (columnPath) => {\r\n const columnItem = columnPath[0];\r\n processDataCell(data, rowItem.index, columnItem.index, true);\r\n for (let i = 0; i < valueFields.length; i += 1) {\r\n const field = valueFields[i];\r\n const expression = (expressions[i] =\r\n expressions[i] === undefined\r\n ? createRunningTotalExpr(field)\r\n : expressions[i]);\r\n if (expression) {\r\n const expressionArg = new NxeSummaryCell(\r\n [...columnPath],\r\n [...rowPath],\r\n data,\r\n descriptions,\r\n i,\r\n fieldsCache,\r\n );\r\n const cell = expressionArg.cell()!;\r\n cell[i] = expression(expressionArg);\r\n (cell as any).postProcessedFlags[i] = true;\r\n }\r\n }\r\n },\r\n false,\r\n );\r\n },\r\n false,\r\n );\r\n}\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\n// NxePivotDataSource — the cross-tab aggregation engine behind nxe-pivot-grid. Drop-in for the\r\n// plain `{ fields, store, retrieveFields }` object the app binds to `[dataSource]` (and for the\r\n// rare `new PivotGridDataSource(...)`). It groups the flat `store` by the row × column field\r\n// tuples and aggregates each `data` field, accumulating into EVERY path prefix so subtotals and\r\n// grand totals are free. `reload()` re-aggregates (called from `onExpandAll`).\r\n\r\nimport { formatDisplay, NxeNumberSeparators, parseDateValue } from '@nexterajs/ui/intl';\r\nimport { nxeDatePattern, nxeExcelNumFmt, nxeFormatNumberValue } from '@nexterajs/ui/grid';\r\nimport {\r\n COLUMN_KEY_PREFIX,\r\n KEY_SEP,\r\n NxePivotAxisNode,\r\n NxePivotAxisTree,\r\n ROW_KEY_PREFIX,\r\n pathKeyOf,\r\n prefixKeys,\r\n readExpandOverride,\r\n} from './nxe-pivot-axis';\r\nimport {\r\n applyDisplaySummaryMode,\r\n applyRunningTotal,\r\n NxePivotSummaryData,\r\n NxePivotSummaryDescriptions,\r\n NxePivotSummaryNode,\r\n} from './nxe-pivot-summary';\r\nimport {\r\n NXE_PIVOT_TEXTS_DEFAULTS,\r\n NxePivotArea,\r\n NxePivotBodyRow,\r\n NxePivotColumnLeaf,\r\n NxePivotCustomSummaryInfo,\r\n NxePivotDataSourceOptions,\r\n NxePivotField,\r\n NxePivotHeaderCell,\r\n NxePivotModel,\r\n NxePivotRowHeaderCell,\r\n NxePivotRowHeaderLayout,\r\n NxePivotTexts,\r\n NxePivotTotalsPrior,\r\n} from './nxe-pivot.types';\r\n\r\n/** A per-cell accumulator (carries enough state for every supported summary type). */\r\ninterface Agg {\r\n sum: number;\r\n count: number;\r\n min: number;\r\n max: number;\r\n has: boolean;\r\n /** Raw values collected for a `summaryType: 'custom'` cell (dx passes raw, uncoerced values\r\n * to 'calculate'). Allocated ONLY for custom-summary fields — the common path stays lean. */\r\n raw?: any[];\r\n /** The custom field this cell aggregates (marks the agg for the post-load finalize pass). */\r\n customField?: NxePivotField;\r\n /** Cached `totalValue` after the start → calculate… → finalize protocol ran for this cell. */\r\n custom?: any;\r\n}\r\n\r\n// The axis-node shape, the collision-free path-key encoding, and the record-by-record tree\r\n// construction moved to nxe-pivot-axis.ts in P2-C1 — shared by both axes.\r\n\r\nfunction getRaw(row: any, field: string | undefined): 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/**\r\n * Read a field's raw value off a record. dx `prepareFields` (m_local_store) only compiles a\r\n * dataField getter when the field carries no `selector` — an explicit selector REPLACES the\r\n * dataField read entirely, for dimensions and measures alike.\r\n */\r\nfunction readField(row: any, field: NxePivotField): any {\r\n if (typeof field.selector === 'function') {\r\n return field.selector(row);\r\n }\r\n return getRaw(row, field.dataField);\r\n}\r\n\r\n/**\r\n * dx m_local_store `DATE_INTERVAL_SELECTORS`, over the library's Luxon-based parse: `year` →\r\n * getFullYear, `quarter` → 1-4, `month` → 1-12, `day` → day of month, `dayOfWeek` → 0-6\r\n * (Sunday 0, JS `getDay()`; Luxon's Monday-1 weekday mapped with `% 7`). A falsy/unparseable\r\n * value passes through untouched (`date && ...`, dx line-for-line).\r\n */\r\nconst DATE_INTERVAL_SELECTORS: Record<string, (raw: any) => any> = {\r\n year: (raw) => raw && (parseDateValue(raw)?.year ?? raw),\r\n quarter: (raw) => raw && (mapDate(raw, (d) => Math.floor((d.month - 1) / 3) + 1) ?? raw),\r\n month: (raw) => raw && (parseDateValue(raw)?.month ?? raw),\r\n day: (raw) => raw && (parseDateValue(raw)?.day ?? raw),\r\n dayOfWeek: (raw) => raw && (mapDate(raw, (d) => d.weekday % 7) ?? raw),\r\n};\r\n\r\nfunction mapDate(raw: any, fn: (d: { month: number; weekday: number }) => number): number | null {\r\n const dt = parseDateValue(raw);\r\n return dt ? fn(dt) : null;\r\n}\r\n\r\n/** Positive numeric `groupInterval` (dx: `isNumeric(gi) && gi > 0 && gi`), else null. */\r\nfunction numericGroupInterval(field: NxePivotField): number | null {\r\n const gi = field.groupInterval;\r\n return typeof gi === 'number' && isFinite(gi) && gi > 0 ? gi : null;\r\n}\r\n\r\n/**\r\n * dx m_local_store `prepareFields`, scoped to `groupInterval` fields (P2-C3): the effective\r\n * per-record value read. A field WITH an explicit `selector` is skipped wholesale (dx: only\r\n * selector-less fields are prepared); a date field with a recognised interval buckets through\r\n * {@link DATE_INTERVAL_SELECTORS}; a number field with a positive step coerces string raws to\r\n * Number and groups to `Math.floor(value / step) * step` (dx's exact formula — NOT\r\n * `value - value % step`, which differs for negatives). Everything else keeps the raw\r\n * dataField read — deserializing interval-less date dimensions (dx's `getDateValue`) is\r\n * deliberately NOT ported: raw values stay the P1 grouping keys (DEFAULTS.md).\r\n */\r\nfunction readGroupedField(row: any, field: NxePivotField): any {\r\n if (typeof field.selector !== 'function') {\r\n if (field.dataType === 'date' && typeof field.groupInterval === 'string') {\r\n const interval = DATE_INTERVAL_SELECTORS[field.groupInterval];\r\n if (interval) {\r\n return interval(getRaw(row, field.dataField));\r\n }\r\n } else if (field.dataType === 'number') {\r\n const step = numericGroupInterval(field);\r\n if (step) {\r\n let value = getRaw(row, field.dataField);\r\n if (typeof value === 'string') {\r\n value = Number(value);\r\n }\r\n return Math.floor(value / step) * step;\r\n }\r\n }\r\n }\r\n return readField(row, field);\r\n}\r\n\r\n/**\r\n * dx m_widget_utils `DATE_INTERVAL_FORMATS` (default en localization): month numbers render\r\n * the wide month name, quarters `'Q' + n` (dx formats `new Date(2000, 3n-1)` with the\r\n * 'quarter' pattern), dayOfWeek the wide day name; `year`/`day` have no entry — the group\r\n * number renders as-is.\r\n */\r\nconst MONTH_NAMES = [\r\n 'January', 'February', 'March', 'April', 'May', 'June',\r\n 'July', 'August', 'September', 'October', 'November', 'December',\r\n];\r\nconst DAY_NAMES = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\r\n\r\nfunction dateIntervalLabel(interval: string, value: any): string | null {\r\n if (typeof value !== 'number') {\r\n return null;\r\n }\r\n if (interval === 'month') {\r\n return MONTH_NAMES[value - 1] ?? String(value);\r\n }\r\n if (interval === 'quarter') {\r\n return `Q${value}`;\r\n }\r\n if (interval === 'dayOfWeek') {\r\n return DAY_NAMES[value] ?? String(value);\r\n }\r\n return null;\r\n}\r\n\r\n/**\r\n * dx `discoverObjectFields`/`parseFields` (m_widget_utils), the `retrieveFields: true` default:\r\n * fields come from the FIRST record's keys (`__`-prefixed keys skipped); `dataType` is detected\r\n * from the first DEFINED value scanning forward through the store. All derived fields are\r\n * area-less — dx surfaces them in the field chooser only, never in an area. Scoped down from dx\r\n * (recorded in DEFAULTS.md): no nested-object recursion into dotted dataFields and no\r\n * year/quarter/month group-field expansion for dates.\r\n */\r\nfunction deriveStoreFields(store: any[]): NxePivotField[] {\r\n const first = store[0];\r\n if (first == null || typeof first !== 'object') {\r\n return [];\r\n }\r\n return Object.keys(first)\r\n .filter((key) => !key.startsWith('__'))\r\n .map((key) => {\r\n let value: any = first[key];\r\n for (let i = 1; value == null && i < store.length; i++) {\r\n value = store[i]?.[key];\r\n }\r\n let dataType: NxePivotField['dataType'];\r\n if (value instanceof Date) {\r\n dataType = 'date';\r\n } else if (typeof value === 'number') {\r\n dataType = 'number';\r\n } else if (typeof value === 'boolean') {\r\n dataType = 'boolean';\r\n } else if (typeof value === 'string') {\r\n dataType = 'string';\r\n }\r\n // dx runs createCaption over retrieved fields too (`_fieldsPrepared`).\r\n return { dataField: key, dataType, caption: defaultCaption({ dataField: key }) };\r\n });\r\n}\r\n\r\n/**\r\n * dx `inflector.titleize` (the pivot's caption inflector — NOT the data grid's acronym-keeping\r\n * `captionize`): split on lower→upper transitions and `\\s _ -`, lower-case each word, then\r\n * capitalize its first letter — so `'LOB'` → `'Lob'`, `'businessLOB'` → `'Business Lob'`,\r\n * `'TotalPremium'` → `'Total Premium'`. Transcribed from DevExtreme 24.2.3\r\n * __internal/core/utils/m_inflector (`_chop` + `titleize`); verified against the live broker\r\n * capture (reference/pivot: corner \"Lob\", chooser chips \"Lob\"/\"Ceding Name\").\r\n */\r\nfunction titleize(name: string): string {\r\n return String(name)\r\n .replace(/([a-z\\d])([A-Z])/g, '$1 $2')\r\n .split(/[\\s_-]+/)\r\n .map((p) => {\r\n const lower = p.toLowerCase();\r\n return lower.charAt(0).toUpperCase() + lower.substr(1);\r\n })\r\n .join(' ');\r\n}\r\n\r\n/**\r\n * dx `createCaption` (pivot_grid/data_source/m_data_source): a field WITHOUT an explicit\r\n * caption renders `titleize(dataField [+ '_' + groupInterval])`, and — when it aggregates with\r\n * a non-'custom' summary type — a `\" (Sum)\"`-style suffix. Explicit captions render as-is\r\n * (the caller never reaches this).\r\n */\r\nfunction defaultCaption(field: NxePivotField): string {\r\n let base = field.dataField ?? '';\r\n if (typeof field.groupInterval === 'string') {\r\n base += `_${field.groupInterval}`;\r\n }\r\n let summary = (field.summaryType ? String(field.summaryType) : '').toLowerCase();\r\n if (summary && summary !== 'custom') {\r\n summary = summary.charAt(0).toUpperCase() + summary.slice(1);\r\n summary = base.length ? ` (${summary})` : summary;\r\n } else {\r\n summary = '';\r\n }\r\n return titleize(base) + summary;\r\n}\r\n\r\n/** Render a row/column field value to its display label (dates formatted, customizeText honoured). */\r\nfunction fieldText(field: NxePivotField, raw: any): string {\r\n if (raw == null || raw === '') {\r\n return '';\r\n }\r\n let text: string;\r\n if (\r\n field.dataType === 'date' &&\r\n typeof field.groupInterval === 'string' &&\r\n typeof field.selector !== 'function'\r\n ) {\r\n // The raw value here is the interval GROUP number (P2-C3). dx setDefaultFieldValueFormatting\r\n // only installs the interval formats when the field has no explicit format.\r\n text = (!field.format && dateIntervalLabel(field.groupInterval, raw)) || String(raw);\r\n } else if (field.dataType === 'date') {\r\n const dt = parseDateValue(raw);\r\n const pattern = nxeDatePattern(field.format, 'dd-MMM-yyyy');\r\n text = dt ? formatDisplay(dt, pattern) : String(raw);\r\n } else {\r\n text = String(raw);\r\n }\r\n if (field.customizeText) {\r\n return field.customizeText({ value: raw, valueText: text });\r\n }\r\n return text;\r\n}\r\n\r\n/** Format an aggregated numeric value per the data field's number format / customizeText. */\r\nfunction dataText(\r\n field: NxePivotField,\r\n value: number | null,\r\n separators?: NxeNumberSeparators,\r\n): string {\r\n if (value == null) {\r\n return '';\r\n }\r\n // W4 Lane 4: a `summaryType: 'custom'` cell holds whatever `totalValue` the callback left\r\n // — dx renders non-numeric values as-is (its formatter no-ops on them), so strings (and\r\n // anything else non-numeric) pass through unformatted; the number mask applies to numbers.\r\n const formatted =\r\n typeof value === 'number'\r\n ? nxeFormatNumberValue(value, field.format, separators)\r\n : String(value);\r\n if (field.customizeText) {\r\n return field.customizeText({ value, valueText: formatted });\r\n }\r\n return formatted;\r\n}\r\n\r\nfunction newAgg(): Agg {\r\n return { sum: 0, count: 0, min: Infinity, max: -Infinity, has: false };\r\n}\r\n\r\nfunction accumulate(agg: Agg, v: number): void {\r\n agg.sum += v;\r\n agg.count += 1;\r\n agg.min = Math.min(agg.min, v);\r\n agg.max = Math.max(agg.max, v);\r\n agg.has = true;\r\n}\r\n\r\nfunction resolveAgg(agg: Agg | undefined, type: NxePivotField['summaryType']): number | null {\r\n if (!agg) {\r\n return null;\r\n }\r\n if (type === 'custom') {\r\n // Whatever the callback left in `totalValue` after 'finalize' (cached at build time).\r\n return agg.custom ?? null;\r\n }\r\n if (!agg.has) {\r\n return null;\r\n }\r\n switch (type) {\r\n case 'sum':\r\n return agg.sum;\r\n case 'min':\r\n return agg.min;\r\n case 'max':\r\n return agg.max;\r\n case 'avg':\r\n return agg.count ? agg.sum / agg.count : null;\r\n case 'count':\r\n default:\r\n // dx `getAggregator` ends `aggregators[field.summaryType] || aggregators.count`\r\n // (m_local_store): an ABSENT or unknown summaryType counts, it does not sum. The\r\n // field panel and chooser both create data fields without one (a drag into the Data\r\n // area carries only area/areaIndex), so defaulting to sum silently reported totals\r\n // where dx reports row counts.\r\n return agg.count;\r\n }\r\n}\r\n\r\nfunction keyOf(rowPath: any[], colPath: any[], dataIndex: number): string {\r\n return pathKeyOf(rowPath) + KEY_SEP + pathKeyOf(colPath) + KEY_SEP + dataIndex;\r\n}\r\n\r\nexport interface NxePivotModelOptions {\r\n /** Field-level expansion is seeded from `field.expanded`; these are per-node chevron overrides. */\r\n expandedOverrides: ReadonlyMap<string, boolean>;\r\n /**\r\n * Facade expand-all/collapse-all state: `true`/`false` behaves as if EVERY row+column\r\n * field's `expanded` were set to it (oracle §e — dx's toolbar buttons set `expanded` on all\r\n * fields of both axes and reload); `undefined` follows the fields. Per-node\r\n * `expandedOverrides` still win on top (the caller wipes them when toggling this).\r\n */\r\n allExpanded?: boolean;\r\n showRowGrandTotals: boolean;\r\n showColumnGrandTotals: boolean;\r\n /**\r\n * dx `rowHeaderLayout`. Defaults to 'tree' — the pre-parity model contract (callers that\r\n * predate the flag keep their flat parent-inline rows); the component always passes its\r\n * own input, whose default is dx's 'standard'.\r\n */\r\n rowHeaderLayout?: NxePivotRowHeaderLayout;\r\n /** dx `showRowTotals` (default true). Renders only in standard layout, exactly as dx:\r\n * \"applies only if rowHeaderLayout is 'standard'\" — tree layout ignores it. */\r\n showRowTotals?: boolean;\r\n /** dx `showColumnTotals` (default true): \"{value} Total\" columns close expanded column\r\n * parents (active since P2-C2 — the column axis renders all N levels). */\r\n showColumnTotals?: boolean;\r\n /** dx `showTotalsPrior` (default 'none'); 'rows'/'both' place each \"{value} Total\" row\r\n * BEFORE its children, 'columns'/'both' each \"{value} Total\" column BEFORE its children. */\r\n showTotalsPrior?: NxePivotTotalsPrior;\r\n /** Display strings (dx `texts`); merged over {@link NXE_PIVOT_TEXTS_DEFAULTS}. */\r\n texts?: NxePivotTexts;\r\n /** dx widget `dataFieldArea` (default 'column'); 'row' moves the measures onto the row\r\n * axis as its innermost level when ≥2 exist (P2-C3). Falls back to the data-source\r\n * options' own `dataFieldArea` when unset here. */\r\n dataFieldArea?: 'row' | 'column';\r\n}\r\n\r\nexport class NxePivotDataSource {\r\n private readonly options: NxePivotDataSourceOptions;\r\n private readonly agg = new Map<string, Agg>();\r\n\r\n /**\r\n * Records that survived `filterValues` and reached the axis trees — the analogue of dx's\r\n * loaded row matrix (`data.values`), which `isEmpty()` tests. Deliberately NOT `agg.size`:\r\n * a record whose measure is null/non-numeric builds axis nodes but no aggregate.\r\n */\r\n private loadedCount = 0;\r\n private rowTree: NxePivotAxisNode[] = [];\r\n /** Column-axis roots (display order) — all N levels render since P2-C2. */\r\n private colTree: NxePivotAxisNode[] = [];\r\n /** The column axis tree (node lookup by pathKey for the header run-length derivation). */\r\n private colAxis: NxePivotAxisTree | null = null;\r\n /** The row axis tree (W4 Lane 2: expand-key → value-path lookups for event payloads). */\r\n private rowAxis: NxePivotAxisTree | null = null;\r\n /** Store-derived fields when no explicit fields were given (dx `retrieveFields` default). */\r\n private readonly derivedFields: NxePivotField[] | null;\r\n /** The normalized clones (caption defaulted, area lower-cased), aligned 1:1 with\r\n * `fields()` — the field panel reads chips/sort state here (P3-C2). */\r\n private readonly normalizedFields: NxePivotField[];\r\n\r\n readonly rowFields: NxePivotField[];\r\n readonly columnFields: NxePivotField[];\r\n /** ALL data-area fields incl. `visible: false` ones (dx `descriptions.values`) — hidden\r\n * measures aggregate and stay addressable by their dataIndex; only rendering skips them. */\r\n readonly dataFields: NxePivotField[];\r\n /** The data fields that actually RENDER (leaves, captions, footers, export, chart). */\r\n private readonly visibleDataFields: NxePivotField[];\r\n /** `area: 'filter'` fields — they exist solely to carry `filterValues` (P2-C3). */\r\n readonly filterFields: NxePivotField[];\r\n\r\n constructor(options: NxePivotDataSourceOptions) {\r\n this.options = options ?? { fields: [] };\r\n // dx default `retrieveFields: true`: with no/empty explicit fields, derive area-less\r\n // fields from the store's first record (available to a future field chooser). Explicit\r\n // fields keep the pre-P1-C3 path byte-identical (dx would additionally MERGE store\r\n // fields alongside them for the chooser — deferred with the chooser itself, Phase 3).\r\n const explicit = this.options.fields ?? [];\r\n this.derivedFields =\r\n explicit.length === 0 && this.options.retrieveFields !== false\r\n ? deriveStoreFields(this.options.store ?? [])\r\n : null;\r\n // Narrow normalisation for persisted report configs: saved JSON can carry `areaIndex`\r\n // as a string ('0') and `area` in stray casing — coerce once where the fields are read.\r\n // A field without an explicit caption gets dx's defaultCaption (humanized dataField;\r\n // aggregating fields suffixed with the summary type, e.g. \"Total Premium (Sum)\").\r\n const fields = (this.derivedFields ?? explicit).map((f) => {\r\n const field: NxePivotField = {\r\n ...f,\r\n caption: f.caption ?? defaultCaption(f),\r\n area:\r\n typeof f.area === 'string'\r\n ? (f.area.toLowerCase() as NxePivotField['area'])\r\n : f.area,\r\n areaIndex: f.areaIndex == null ? f.areaIndex : Number(f.areaIndex),\r\n };\r\n // dx setDefaultFieldValueFormatting (m_widget_utils, via prepareFields — P2-C3):\r\n // a number field with a positive step and no explicit customizeText labels each\r\n // bucket \"start - end\", both ends formatted with the field's own format.\r\n const step = field.dataType === 'number' ? numericGroupInterval(field) : null;\r\n if (step && !field.customizeText && typeof field.selector !== 'function') {\r\n field.customizeText = (ci) => {\r\n const secondText = nxeFormatNumberValue(ci.value + step, field.format, this.options.separators);\r\n const firstText =\r\n typeof ci.value === 'number'\r\n ? nxeFormatNumberValue(ci.value, field.format, this.options.separators)\r\n : ci.valueText;\r\n return firstText && secondText ? `${firstText} - ${secondText}` : '';\r\n };\r\n }\r\n return field;\r\n });\r\n // dx `_createDescriptions` (m_data_source.js:647): `visible: false` excludes a field\r\n // ONLY when its area is neither 'data' nor 'filter'. Hidden ROW/COLUMN fields leave\r\n // their axis entirely; hidden DATA fields STAY in `descriptions.values` — they keep\r\n // aggregating (stable dataIndex among ALL data-area fields, addressable from a\r\n // calculateSummaryValue via `e.value('hidden')` — the dx hidden-helper-measure\r\n // pattern) and only their RENDERING is skipped (m_data_controller `columnIsHidden`);\r\n // hidden FILTER fields keep filtering. (Corrected in P2-C3 — P1-C3 dropped hidden\r\n // measures wholesale.)\r\n this.normalizedFields = fields;\r\n const byArea = (a: string, keepHidden: boolean) =>\r\n fields\r\n .filter((f) => f.area === a && (keepHidden || f.visible !== false))\r\n .sort((x, y) => (x.areaIndex ?? 0) - (y.areaIndex ?? 0));\r\n this.rowFields = byArea('row', false);\r\n this.columnFields = byArea('column', false);\r\n this.dataFields = byArea('data', true);\r\n this.visibleDataFields = this.dataFields.filter((f) => f.visible !== false);\r\n this.filterFields = byArea('filter', true);\r\n this.build();\r\n }\r\n\r\n /** DevExtreme parity: `getDataSource().reload()` re-aggregates the (possibly mutated) store. */\r\n reload(): void {\r\n this.build();\r\n }\r\n\r\n fields(): NxePivotField[] {\r\n return this.derivedFields ?? this.options.fields ?? [];\r\n }\r\n\r\n /**\r\n * P3-C2 (field panel): one panel area's chips — the area's VISIBLE fields in `areaIndex`\r\n * order, each carrying its index in the `fields()` array (the panel's override key) and its\r\n * normalized clone (caption defaulted, area lower-cased). `visible: false` fields never\r\n * chip, matching dx's panel/chooser (m_field_chooser_base `getAreaFields` filters\r\n * `visible !== false` for EVERY area — data/filter included, unlike the aggregation arrays,\r\n * which keep hidden data/filter fields working).\r\n *\r\n * P3-C4: `includeHidden` mirrors dx m_data_source's module-local `getAreaFields`\r\n * (`canAddFieldInArea = area === 'data' || field.visible !== false`) — the areaIndex\r\n * RENUMBERING after a drop runs over the DATA area's hidden fields too (dx\r\n * `_createDescriptions` → `normalizeIndexes(getAreaFields(fields, areaName), 'areaIndex')`),\r\n * while hidden row/column/filter fields stay outside the numbering, dx-true.\r\n */\r\n areaFields(\r\n area: NxePivotArea,\r\n includeHidden = false,\r\n ): { fieldIndex: number; field: NxePivotField }[] {\r\n return this.normalizedFields\r\n .map((field, fieldIndex) => ({ fieldIndex, field }))\r\n .filter(\r\n ({ field }) =>\r\n field.area === area &&\r\n ((includeHidden && area === 'data') || field.visible !== false),\r\n )\r\n .sort((x, y) => (x.field.areaIndex ?? 0) - (y.field.areaIndex ?? 0));\r\n }\r\n\r\n /**\r\n * P3-C4 (chip header filter) — dx `getFieldValues(index)` (m_data_source.js:524) scoped to\r\n * the local store: the field's DISTINCT PREPARED values (the `groupInterval` group value\r\n * where one is set — dx loads the field as a lone expanded column through prepareFields)\r\n * with their display labels (`fieldText`: interval labels, date formats, customizeText),\r\n * sorted ascending by raw value. Built from the UNFILTERED store: dx passes `filters: []`\r\n * unless `headerFilter.showRelevantValues` is on (default false — the nxe panel always\r\n * shows the full list, exactly like the grid's non-cascading lists), and the field's own\r\n * `filterValues` are always ignored (`filterValues: null` on the load field). Dedupe is\r\n * by `valueOf()` (dates by instant), the dx grouping key.\r\n */\r\n getFieldValues(index: number): { value: any; text: string }[] {\r\n const field = this.normalizedFields[index];\r\n if (!field) {\r\n return [];\r\n }\r\n const seen = new Map<any, { value: any; text: string }>();\r\n for (const rec of (this.options.store ?? []) as any[]) {\r\n const raw = readGroupedField(rec, field);\r\n const key = raw != null ? raw.valueOf() : raw;\r\n if (!seen.has(key)) {\r\n seen.set(key, { value: raw, text: fieldText(field, raw) });\r\n }\r\n }\r\n return [...seen.values()].sort((a, b) => {\r\n if (a.value == null) return b.value == null ? 0 : -1;\r\n if (b.value == null) return 1;\r\n if (typeof a.value === 'number' && typeof b.value === 'number') {\r\n return a.value - b.value;\r\n }\r\n return String(a.value).localeCompare(String(b.value));\r\n });\r\n }\r\n\r\n /** The normalized clone of `fields()[index]` (P3-C2 — chip captions/sort state read here). */\r\n fieldAt(index: number): NxePivotField | undefined {\r\n return this.normalizedFields[index];\r\n }\r\n\r\n /**\r\n * P3-C2 (field panel): a NEW data source over the SAME store/options with `fields`\r\n * replacing the field list — how the component applies its fieldOverride merge without\r\n * ever touching the caller's options (report-output-pivot serializes its own fields\r\n * array in `onSave`).\r\n */\r\n cloneWithFields(fields: NxePivotField[]): NxePivotDataSource {\r\n return new NxePivotDataSource({ ...this.options, fields });\r\n }\r\n\r\n /**\r\n * dx m_local_store `areValuesEqual`, verbatim: `valueOf()` comparison (dates by time), and\r\n * an ARRAY filter value compares element-wise (dx's `levels` shape — kept for parity even\r\n * though nxe has no grouped hierarchy fields).\r\n */\r\n private static areValuesEqual(filterValue: any, fieldValue: any): boolean {\r\n let valueOfFilter = filterValue && filterValue.valueOf();\r\n let valueOfField = fieldValue && fieldValue.valueOf();\r\n if (Array.isArray(filterValue)) {\r\n fieldValue = fieldValue || [];\r\n for (let i = 0; i < filterValue.length; i += 1) {\r\n valueOfFilter = filterValue[i] && filterValue[i].valueOf();\r\n valueOfField = fieldValue[i] && fieldValue[i].valueOf();\r\n if (valueOfFilter !== valueOfField) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n return valueOfFilter === valueOfField;\r\n }\r\n\r\n /**\r\n * dx m_local_store `createDimensionFilters` + `createFilter` (P2-C3): one predicate per\r\n * row/column/filter-area field with a non-empty `filterValues`, comparing the PREPARED\r\n * value (the group value when `groupInterval` is set) against each filter value;\r\n * `filterType: 'exclude'` inverts. Returns null when nothing filters — the fast path.\r\n */\r\n private buildRecordFilter(): ((rec: any) => boolean) | null {\r\n const predicates: ((rec: any) => boolean)[] = [];\r\n for (const field of [...this.rowFields, ...this.columnFields, ...this.filterFields]) {\r\n const filterValues = field.filterValues || [];\r\n if (!filterValues.length) {\r\n continue;\r\n }\r\n predicates.push((rec) => {\r\n const value = readGroupedField(rec, field);\r\n let result = false;\r\n for (let i = 0; i < filterValues.length; i += 1) {\r\n if (NxePivotDataSource.areValuesEqual(filterValues[i], value)) {\r\n result = true;\r\n break;\r\n }\r\n }\r\n return field.filterType === 'exclude' ? !result : result;\r\n });\r\n }\r\n if (!predicates.length) {\r\n return null;\r\n }\r\n return (rec) => predicates.every((p) => p(rec));\r\n }\r\n\r\n private build(): void {\r\n this.agg.clear();\r\n this.loadedCount = 0;\r\n const store = (this.options.store ?? []) as any[];\r\n\r\n // Both axes run through the shared tree builder (P2-C1) and both render all N levels\r\n // (P2-C2) — one code path for dedupe, first-seen order, and labels. Dimension values\r\n // read through the groupInterval-aware reader (P2-C3 — identical to the plain read\r\n // for interval-less fields).\r\n const rowAxis = new NxePivotAxisTree(\r\n this.rowFields,\r\n readGroupedField,\r\n fieldText,\r\n ROW_KEY_PREFIX,\r\n );\r\n const colAxis = new NxePivotAxisTree(\r\n this.columnFields,\r\n readGroupedField,\r\n fieldText,\r\n COLUMN_KEY_PREFIX,\r\n );\r\n\r\n // dx applies filterValues at record intake — filtered records reach neither the axis\r\n // trees nor the aggregation (m_local_store `loadCore`: `if (filter(data)) …`).\r\n const recordFilter = this.buildRecordFilter();\r\n\r\n for (const rec of store) {\r\n if (recordFilter && !recordFilter(rec)) {\r\n continue;\r\n }\r\n this.loadedCount++;\r\n const rowRaw = rowAxis.insert(rec);\r\n const colRaw = colAxis.insert(rec);\r\n\r\n const rowPreKeys = prefixKeys(rowRaw);\r\n const colPreKeys = prefixKeys(colRaw);\r\n this.dataFields.forEach((df, di) => {\r\n const rawV = readGroupedField(rec, df);\r\n const isCustom = df.summaryType === 'custom';\r\n // dx's count aggregator steps on any DEFINED value (`step: count => 1 + count`,\r\n // m_utils) — it never coerces — and it is also the default when a field carries\r\n // no summaryType. Counting fields therefore take a different intake gate than\r\n // sum/min/max/avg, or a text column dragged into the Data area counts 0.\r\n const isCounting =\r\n !isCustom && (df.summaryType === undefined || df.summaryType === 'count');\r\n let num = 0;\r\n if (isCounting) {\r\n if (rawV == null || rawV === '') {\r\n return;\r\n }\r\n const coerced = typeof rawV === 'number' ? rawV : Number(rawV);\r\n num = isNaN(coerced) ? 0 : coerced;\r\n } else if (!isCustom) {\r\n num = typeof rawV === 'number' ? rawV : Number(rawV);\r\n if (rawV == null || rawV === '' || isNaN(num)) {\r\n return;\r\n }\r\n }\r\n for (const rk of rowPreKeys) {\r\n for (const ck of colPreKeys) {\r\n const k = rk + KEY_SEP + ck + KEY_SEP + di;\r\n let a = this.agg.get(k);\r\n if (!a) {\r\n a = newAgg();\r\n if (isCustom) {\r\n // dx seeds a custom cell whenever a record touches the\r\n // intersection — even when this record's own value is null.\r\n a.raw = [];\r\n a.customField = df;\r\n }\r\n this.agg.set(k, a);\r\n }\r\n if (isCustom) {\r\n // dx steps only DEFINED values ('calculate' is skipped for\r\n // null/undefined), and passes the value raw — no Number coercion.\r\n if (rawV != null) {\r\n a.raw?.push(rawV);\r\n }\r\n } else {\r\n accumulate(a, num);\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n this.runCustomSummaries();\r\n this.sortTree(rowAxis.roots, 0, this.rowFields);\r\n this.sortTree(colAxis.roots, 0, this.columnFields);\r\n this.rowTree = rowAxis.roots;\r\n this.colTree = colAxis.roots;\r\n this.colAxis = colAxis;\r\n this.rowAxis = rowAxis;\r\n }\r\n\r\n /**\r\n * W4 Lane 2: resolve a namespaced expand key (`'r:'`/`'c:'` + encoded value path) back to\r\n * its node's raw value path — the `path` a dx header-cell event payload carries. Returns\r\n * null for an unknown/empty key (e.g. the grand-total pseudo cells, which have no node).\r\n */\r\n nodePath(pathKey: string): any[] | null {\r\n if (!pathKey) {\r\n return null;\r\n }\r\n const tree = pathKey.startsWith(COLUMN_KEY_PREFIX) ? this.colAxis : this.rowAxis;\r\n return tree?.find(pathKey)?.path ?? null;\r\n }\r\n\r\n /**\r\n * W4 Lane 3 — dx `isEmpty()` (m_data_source.js): `!dataFields.length || !data.values.length`.\r\n * dx's `data.values` is the LOADED row matrix, which exists for every record regardless of\r\n * whether its measure aggregated to a number, so this counts loaded records rather than\r\n * aggregates: a store whose only measure is text (or null throughout) still renders its full\r\n * cross-tab with blank cells in dx — testing `agg.size` instead stamped \"No data\" over it.\r\n */\r\n isEmpty(): boolean {\r\n return this.visibleDataFields.length === 0 || this.loadedCount === 0;\r\n }\r\n\r\n /**\r\n * dx custom-summary protocol (m_local_store `getAggregator`), run per aggregated cell: ONE\r\n * options object per cell is passed through 'start', then 'calculate' once per defined raw\r\n * value (`options.value` set), then 'finalize' (`options.value` deleted); the cell's result\r\n * is whatever the callback left in `totalValue`. dx interleaves the 'calculate' calls of\r\n * different cells while streaming records; nxe runs each cell's protocol contiguously after\r\n * the load — the per-cell sequence (dx's documented contract) is identical.\r\n */\r\n private runCustomSummaries(): void {\r\n for (const a of this.agg.values()) {\r\n const field = a.customField;\r\n if (!field) {\r\n continue;\r\n }\r\n // dx: `field.calculateCustomSummary = field.calculateCustomSummary || noop`.\r\n const callback =\r\n typeof field.calculateCustomSummary === 'function'\r\n ? field.calculateCustomSummary\r\n : (): void => undefined;\r\n const options: NxePivotCustomSummaryInfo = {\r\n summaryProcess: 'start',\r\n totalValue: undefined,\r\n };\r\n callback(options);\r\n for (const value of a.raw ?? []) {\r\n options.summaryProcess = 'calculate';\r\n options.value = value;\r\n callback(options);\r\n }\r\n options.summaryProcess = 'finalize';\r\n delete options.value;\r\n callback(options);\r\n a.custom = options.totalValue;\r\n // W4 Lane 4: the raw-value buffer exists only to drive this protocol — release it\r\n // after 'finalize' (a large store would otherwise retain every raw value of every\r\n // custom cell for the engine's lifetime; dx streams and never buffers them).\r\n a.raw = undefined;\r\n a.customField = undefined;\r\n }\r\n }\r\n\r\n /**\r\n * Sort one axis level in place, honouring `sortOrder` + `sortBy` (dx m_data_source_utils\r\n * `getMemberForSortBy`): default/'value' compares the raw values, 'displayText' compares the\r\n * formatted labels (format + customizeText already applied), 'none' keeps load order\r\n * (reversed for desc — dx compares the load index).\r\n */\r\n private sortLevel(\r\n entries: { value: any; label: string }[],\r\n field: NxePivotField | undefined,\r\n ): void {\r\n if (field?.sortBy === 'none') {\r\n if (field?.sortOrder === 'desc') {\r\n entries.reverse();\r\n }\r\n return;\r\n }\r\n entries.sort((a, b) => this.compareValues(a, b, field));\r\n }\r\n\r\n private compareValues(\r\n x: { value: any; label: string },\r\n y: { value: any; label: string },\r\n field: NxePivotField | undefined,\r\n ): number {\r\n const dir = field?.sortOrder === 'desc' ? -1 : 1;\r\n if (field?.sortBy === 'displayText') {\r\n // Labels are always strings ('' for null raws) — dx sorts the header item's `text`.\r\n return x.label.localeCompare(y.label) * dir;\r\n }\r\n const a = x.value;\r\n const b = y.value;\r\n if (a == null) return b == null ? 0 : -dir;\r\n if (b == null) return dir;\r\n if (typeof a === 'number' && typeof b === 'number') {\r\n return (a - b) * dir;\r\n }\r\n return String(a).localeCompare(String(b)) * dir;\r\n }\r\n\r\n private sortTree(nodes: NxePivotAxisNode[], level: number, fields: NxePivotField[]): void {\r\n this.sortLevel(nodes, fields[level]);\r\n for (const n of nodes) {\r\n if (n.children.length) {\r\n this.sortTree(n.children, level + 1, fields);\r\n }\r\n }\r\n }\r\n\r\n /** Raw aggregate at (rowPath × colPath × data field) — the pre-display-mode value. */\r\n private valueAt(rowPath: any[], colPath: any[], dataIndex: number): number | null {\r\n const a = this.agg.get(keyOf(rowPath, colPath, dataIndex));\r\n // No `?? 'sum'` — an absent summaryType must reach resolveAgg so dx's count default wins.\r\n return resolveAgg(a, this.dataFields[dataIndex]?.summaryType);\r\n }\r\n\r\n cell(rowPath: any[], leaf: NxePivotColumnLeaf): number | null {\r\n return this.valueAt(rowPath, leaf.colPath, leaf.dataIndex);\r\n }\r\n\r\n text(rowPath: any[], leaf: NxePivotColumnLeaf): string {\r\n return dataText(this.dataFields[leaf.dataIndex], this.cell(rowPath, leaf), this.options.separators);\r\n }\r\n\r\n numFmt(dataIndex: number): string | undefined {\r\n return nxeExcelNumFmt(this.dataFields[dataIndex]?.format);\r\n }\r\n\r\n /** Build the renderable/exportable cross-tab model for the given expand state + totals flags. */\r\n getModel(opts: NxePivotModelOptions): NxePivotModel {\r\n const texts = { ...NXE_PIVOT_TEXTS_DEFAULTS, ...opts.texts };\r\n const rowHeaderLayout = opts.rowHeaderLayout ?? 'tree';\r\n const showRowTotals = opts.showRowTotals ?? true;\r\n const showColumnTotals = opts.showColumnTotals ?? true;\r\n const showTotalsPrior = opts.showTotalsPrior ?? 'none';\r\n const totalsPriorCols = showTotalsPrior === 'columns' || showTotalsPrior === 'both';\r\n // dx `dataFieldArea` is a widget option (m_widget default 'column'); the data-source\r\n // options object may also carry it (the pre-parity nxe surface) as the fallback.\r\n const dataFieldArea = opts.dataFieldArea ?? this.options.dataFieldArea ?? 'column';\r\n // With exactly ONE measure dx omits the metric level on EITHER axis (the\r\n // `cellDescriptionsCount > 1` gate in m_data_controller getViewHeaderItems), so\r\n // measures move onto the row axis only when two or more exist.\r\n const measuresOnRows = dataFieldArea === 'row' && this.dataFields.length > 1;\r\n const leaves = this.buildLeaves(\r\n opts.showColumnGrandTotals,\r\n showColumnTotals,\r\n totalsPriorCols,\r\n opts.expandedOverrides,\r\n opts.allExpanded,\r\n measuresOnRows,\r\n );\r\n const columnHeaderRows = this.buildColumnHeaders(\r\n leaves,\r\n texts,\r\n showColumnTotals,\r\n totalsPriorCols,\r\n measuresOnRows,\r\n );\r\n let rows =\r\n rowHeaderLayout === 'standard'\r\n ? this.flattenStandardRows(\r\n opts.expandedOverrides,\r\n opts.allExpanded,\r\n showRowTotals,\r\n showTotalsPrior === 'rows' || showTotalsPrior === 'both',\r\n texts,\r\n )\r\n : this.flattenTreeRows(opts.expandedOverrides, opts.allExpanded);\r\n if (measuresOnRows) {\r\n // dx appends metric children to every row header item (D, T, and GT alike) —\r\n // each axis row splits into one row per data field (m_data_controller).\r\n rows = this.splitRowsByMeasures(rows, rowHeaderLayout);\r\n }\r\n\r\n // P2-C3 post-aggregation passes (dx m_data_source._update ordering: display modes,\r\n // then running totals over the display-mode results). Null — the zero-cost path —\r\n // whenever no data field opts in.\r\n const post = this.buildPostProcessed(opts.expandedOverrides, opts.allExpanded);\r\n const resolveValue = (rowPath: any[], colPath: any[], di: number): number | null => {\r\n if (post) {\r\n const ri = post.rowIndexByKey.get(pathKeyOf(rowPath));\r\n const ci = post.colIndexByKey.get(pathKeyOf(colPath));\r\n if (ri !== undefined && ci !== undefined) {\r\n const cellArr = post.data.values[ri]?.[ci];\r\n if (cellArr) {\r\n const v = cellArr[di];\r\n return v === undefined ? null : v;\r\n }\r\n }\r\n }\r\n return this.valueAt(rowPath, colPath, di);\r\n };\r\n\r\n const grandTotalCells =\r\n !measuresOnRows && opts.showRowGrandTotals && this.visibleDataFields.length > 0\r\n ? leaves.map((leaf) => {\r\n const value = resolveValue([], leaf.colPath, leaf.dataIndex);\r\n return { value, text: dataText(this.dataFields[leaf.dataIndex], value, this.options.separators) };\r\n })\r\n : null;\r\n // Measures-on-rows: the grand-total footer splits into one row per VISIBLE measure,\r\n // exactly as the body rows do (dx gives the GT header item metric children too).\r\n const grandTotalRows =\r\n measuresOnRows && opts.showRowGrandTotals && this.visibleDataFields.length > 0\r\n ? this.visibleDataFields.map((df) => {\r\n const di = this.dataFields.indexOf(df);\r\n return {\r\n dataIndex: di,\r\n caption: df.caption ?? df.dataField ?? '',\r\n cells: leaves.map((leaf) => {\r\n const value = resolveValue([], leaf.colPath, di);\r\n return { value, text: dataText(df, value, this.options.separators) };\r\n }),\r\n };\r\n })\r\n : null;\r\n\r\n // Measures-on-rows adds the metric column AFTER the dimension columns (dx places the\r\n // metric items one depth past `depthSize`).\r\n const dimHeaderCols = rowHeaderLayout === 'standard' ? Math.max(1, this.rowFields.length) : 1;\r\n const rowHeaderColCount = dimHeaderCols + (measuresOnRows ? 1 : 0);\r\n // `field.width` → the field's table column(s): row fields size their row-header column\r\n // (dx m_data_controller sets item.width off the axis field), data fields size every leaf\r\n // column they occupy (dx: `if (dataField.width) row[columnIndex].width = ...`); the\r\n // measure column and measures-on-rows leaf columns (shared by all measures) get none.\r\n const colWidths: (number | null)[] = [\r\n ...Array.from({ length: dimHeaderCols }, (_, i) => this.rowFields[i]?.width ?? null),\r\n ...(measuresOnRows ? [null] : []),\r\n ...leaves.map((leaf) =>\r\n measuresOnRows ? null : this.dataFields[leaf.dataIndex]?.width ?? null,\r\n ),\r\n ];\r\n\r\n // Dense value matrix, built ONCE per model: every visible row × every leaf resolved\r\n // eagerly (subtotal rows and total columns included), then formatted alongside. The\r\n // renderer and the export read the matrices; `cell()`/`text()` become matrix reads for\r\n // any (visible row path × model leaf) pair and fall back to the aggregation map for\r\n // everything else (grand-total path `[]`, hidden paths, leaves from an older model).\r\n // With measures on rows the ROW carries the data index; otherwise the leaf does.\r\n const matrix: (number | null)[][] = rows.map((row) =>\r\n leaves.map((leaf) =>\r\n resolveValue(row.path, leaf.colPath, row.dataIndex ?? leaf.dataIndex),\r\n ),\r\n );\r\n const textMatrix: string[][] = matrix.map((mr, ri) =>\r\n mr.map((v, li) =>\r\n dataText(this.dataFields[rows[ri].dataIndex ?? leaves[li].dataIndex], v, this.options.separators),\r\n ),\r\n );\r\n const rowIndexByPath = new Map<string, number>();\r\n rows.forEach((row, ri) => {\r\n const key = pathKeyOf(row.path);\r\n if (!rowIndexByPath.has(key)) {\r\n rowIndexByPath.set(key, ri);\r\n }\r\n });\r\n const leafIndex = new Map<NxePivotColumnLeaf, number>();\r\n leaves.forEach((leaf, li) => leafIndex.set(leaf, li));\r\n\r\n // W4 Lane 4 (bindChart series naming): each leaf's formatted labels along its colPath.\r\n const colLabels: string[][] = leaves.map((leaf) =>\r\n leaf.colPath.map(\r\n (_, i) =>\r\n this.colAxis?.find(\r\n COLUMN_KEY_PREFIX + pathKeyOf(leaf.colPath.slice(0, i + 1)),\r\n )?.label ?? '',\r\n ),\r\n );\r\n\r\n const ds = this;\r\n return {\r\n rowFields: this.rowFields,\r\n columnFields: this.columnFields,\r\n dataFields: this.dataFields,\r\n cornerText: this.rowFields.map((f) => f.caption ?? f.dataField ?? '').join(' / '),\r\n columnHeaderRows,\r\n leaves,\r\n rows,\r\n rowHeaderLayout,\r\n rowHeaderColCount,\r\n showRowTotals,\r\n showColumnTotals,\r\n showTotalsPrior,\r\n showRowGrandTotals: !!grandTotalCells || !!grandTotalRows,\r\n grandTotalCells,\r\n grandTotalRows,\r\n dataFieldArea,\r\n colWidths,\r\n colLabels,\r\n texts,\r\n matrix,\r\n textMatrix,\r\n // Matrix hits are a SNAPSHOT of this build; the out-of-matrix fallback reads the\r\n // LIVE engine — after an in-place `reload()` (instance inputs, W4 Lane 1) a\r\n // RETAINED model's fallback sees the fresh aggregates while its matrix stays\r\n // frozen, exactly like dx cells reading live loaded data (DEFAULTS.md, W4).\r\n cell: (rp, leaf) => {\r\n const ri = rowIndexByPath.get(pathKeyOf(rp));\r\n const li = leafIndex.get(leaf);\r\n return ri !== undefined && li !== undefined ? matrix[ri][li] : ds.cell(rp, leaf);\r\n },\r\n text: (rp, leaf) => {\r\n const ri = rowIndexByPath.get(pathKeyOf(rp));\r\n const li = leafIndex.get(leaf);\r\n return ri !== undefined && li !== undefined\r\n ? textMatrix[ri][li]\r\n : ds.text(rp, leaf);\r\n },\r\n numFmt: (di) => ds.numFmt(di),\r\n };\r\n }\r\n\r\n /**\r\n * Recursive column-leaf emission over the N-level column tree — the ONE place the visible\r\n * column order is decided; header rows are derived from its output. dx semantics (oracle §a\r\n * mirrored to columns + `oracle/hierarchy-*-matrix.json`; dx m_data_controller\r\n * `getViewHeaderItems`): an EXPANDED parent contributes no value column of its own — its\r\n * children render, and (with `showColumnTotals`) a \"{value} Total\" column carrying the\r\n * parent's aggregates closes the group AFTER the children (dx splices the 'T' item as a\r\n * sibling at `index + 1`; `showTotalsPrior` 'columns'/'both' splices at `index`, i.e.\r\n * BEFORE). A COLLAPSED parent is a single 'D' column with inline aggregates. The grand\r\n * total stays LAST regardless of totalsPrior — the established nxe deviation (DEFAULTS.md:\r\n * dx would move it first, as it moves the grand-total row on the row axis).\r\n */\r\n private buildLeaves(\r\n showColumnGrandTotals: boolean,\r\n showColumnTotals: boolean,\r\n totalsPrior: boolean,\r\n overrides: ReadonlyMap<string, boolean>,\r\n allExpanded: boolean | undefined,\r\n measuresOnRows = false,\r\n ): NxePivotColumnLeaf[] {\r\n const leaves: NxePivotColumnLeaf[] = [];\r\n const push = (kind: 'D' | 'T' | 'GT', colPath: any[], colKey: string, level: number) => {\r\n if (measuresOnRows) {\r\n // Measures live on the row axis (P2-C3): ONE leaf per column path; its\r\n // dataIndex is meaningless (dx getCellsInfo reads the ROW's dataIndex).\r\n leaves.push({ colPath, dataIndex: 0, kind, colKey, level, isGrandTotal: kind === 'GT' });\r\n return;\r\n }\r\n this.dataFields.forEach((df, di) => {\r\n if (df.visible === false) {\r\n return; // dx m_data_controller `columnIsHidden` — hidden measures render no columns\r\n }\r\n leaves.push({\r\n colPath,\r\n dataIndex: di,\r\n kind,\r\n colKey,\r\n level,\r\n isGrandTotal: kind === 'GT',\r\n });\r\n });\r\n };\r\n if (this.columnFields.length === 0) {\r\n if (measuresOnRows) {\r\n // No column dimension AND measures on rows: the single remaining column IS\r\n // the grand total (dx renders the pushed GT item; a blank 'D' column when\r\n // grand totals are off).\r\n push(showColumnGrandTotals ? 'GT' : 'D', [], '', -1);\r\n return leaves;\r\n }\r\n // No column dimension: the data fields are themselves the columns.\r\n push('D', [], '', -1);\r\n return leaves;\r\n }\r\n const visit = (node: NxePivotAxisNode): void => {\r\n const open =\r\n node.children.length > 0 &&\r\n this.isExpanded(node, overrides, allExpanded, this.columnFields);\r\n if (!open) {\r\n push('D', node.path, node.pathKey, node.level);\r\n return;\r\n }\r\n if (totalsPrior && showColumnTotals) {\r\n push('T', node.path, node.pathKey, node.level);\r\n }\r\n for (const child of node.children) {\r\n visit(child);\r\n }\r\n if (!totalsPrior && showColumnTotals) {\r\n push('T', node.path, node.pathKey, node.level);\r\n }\r\n };\r\n for (const root of this.colTree) {\r\n visit(root);\r\n }\r\n if (showColumnGrandTotals && this.dataFields.length > 0) {\r\n push('GT', [], '', -1);\r\n }\r\n return leaves;\r\n }\r\n\r\n /**\r\n * The header cell above leaf-run position `r` exists iff this returns non-null; leaves with\r\n * EQUAL ids at row `r` merge into one run-length cell. A 'D' prefix id merges an expanded\r\n * parent's label over its whole visible subtree (children's 'T' columns included — capture:\r\n * colSpan 21 spans nested totals); the parent's OWN 'T' leaf and the 'GT' leaves carry\r\n * distinct ids so they never fold into a value cell.\r\n */\r\n private headerIdAt(leaf: NxePivotColumnLeaf, r: number): string | null {\r\n if (leaf.kind === 'GT') {\r\n return r === 0 ? 'GT' : null;\r\n }\r\n const nodeRow = leaf.colPath.length - 1;\r\n if (r > nodeRow) {\r\n return null;\r\n }\r\n if (leaf.kind === 'T' && r === nodeRow) {\r\n return 'T:' + pathKeyOf(leaf.colPath);\r\n }\r\n return 'D:' + pathKeyOf(leaf.colPath.slice(0, r + 1));\r\n }\r\n\r\n /** Materialize the run-length cell for `span` consecutive leaves starting at `leaf`, row `r`. */\r\n private headerCellAt(\r\n leaf: NxePivotColumnLeaf,\r\n r: number,\r\n span: number,\r\n depth: number,\r\n texts: Required<NxePivotTexts>,\r\n showColumnTotals: boolean,\r\n totalsPrior: boolean,\r\n ): NxePivotHeaderCell {\r\n if (leaf.kind === 'GT') {\r\n const cell: NxePivotHeaderCell = {\r\n text: texts.grandTotal,\r\n colspan: span,\r\n isGrandTotal: true,\r\n };\r\n if (depth > 1) {\r\n cell.rowspan = depth; // dx depthSize: fills every value row\r\n }\r\n return cell;\r\n }\r\n const nodeRow = leaf.colPath.length - 1;\r\n const node = this.colAxis?.find(\r\n COLUMN_KEY_PREFIX + pathKeyOf(leaf.colPath.slice(0, r + 1)),\r\n );\r\n const label = node?.label ?? '';\r\n if (leaf.kind === 'T' && r === nodeRow) {\r\n // dx blank-parent rule: '' + '{0} Total' renders as just 'Total'.\r\n const cell: NxePivotHeaderCell = {\r\n text: texts.total.replace('{0}', label).trim(),\r\n colspan: span,\r\n isGrandTotal: false,\r\n isTotal: true,\r\n };\r\n if (depth - r > 1) {\r\n cell.rowspan = depth - r; // capture: rowSpan 3 at level 0 / 2 at level 1\r\n }\r\n if (totalsPrior && node) {\r\n // dx quirk (m_data_controller): with showTotalsPrior the spliced 'T' item gets\r\n // `expanded: true` and the 'D' item's flag is nulled — the chevron moves to the\r\n // \"{value} Total\" cell.\r\n cell.expandable = true;\r\n cell.expanded = true;\r\n cell.pathKey = node.pathKey;\r\n }\r\n return cell;\r\n }\r\n const cell: NxePivotHeaderCell = { text: label, colspan: span, isGrandTotal: false };\r\n if (leaf.kind === 'D' && r === nodeRow) {\r\n // The leaf's own node row: a collapsed parent (chevron) or a deepest-level value.\r\n if (depth - r > 1) {\r\n cell.rowspan = depth - r;\r\n }\r\n if (node && node.children.length > 0) {\r\n cell.expandable = true;\r\n cell.expanded = false;\r\n cell.pathKey = node.pathKey;\r\n }\r\n } else if (node && !(totalsPrior && showColumnTotals)) {\r\n // An expanded parent's group label (the chevron sits here unless totalsPrior moved\r\n // it to the 'T' cell — see above).\r\n cell.expandable = true;\r\n cell.expanded = true;\r\n cell.pathKey = node.pathKey;\r\n }\r\n return cell;\r\n }\r\n\r\n /**\r\n * Header rows DERIVED from the leaf array by run-length encoding — never a second\r\n * independent walk of the column tree, so span/leaf misalignment is structurally\r\n * impossible. Value rows = the deepest visible level (dx `depthSize`); the measure-caption\r\n * row is appended LAST and ONLY when two or more data fields exist (oracle §b: with exactly\r\n * one measure dx drops the caption row entirely — `oracle/single-measure-matrix.json`).\r\n */\r\n private buildColumnHeaders(\r\n leaves: NxePivotColumnLeaf[],\r\n texts: Required<NxePivotTexts>,\r\n showColumnTotals: boolean,\r\n totalsPrior: boolean,\r\n measuresOnRows = false,\r\n ): NxePivotHeaderCell[][] {\r\n const dataCaption = (di: number) =>\r\n this.dataFields[di]?.caption ?? this.dataFields[di]?.dataField ?? '';\r\n\r\n if (this.columnFields.length === 0) {\r\n if (measuresOnRows) {\r\n // Measures on rows leave a single column: the grand total (or a blank 'D'\r\n // column when grand totals are off) — see buildLeaves.\r\n const isGT = leaves[0]?.kind === 'GT';\r\n return [[{ text: isGT ? texts.grandTotal : '', colspan: 1, isGrandTotal: isGT }]];\r\n }\r\n // Single header row: one cell per VISIBLE data field (measures ARE the columns —\r\n // the caption-omission rule applies only under column values). Leaf-driven so a\r\n // hidden measure's caption can never surface.\r\n return [\r\n leaves.map((leaf) => ({\r\n text: dataCaption(leaf.dataIndex),\r\n colspan: 1,\r\n isGrandTotal: false,\r\n })),\r\n ];\r\n }\r\n\r\n let depth = 1;\r\n for (const leaf of leaves) {\r\n depth = Math.max(depth, leaf.colPath.length);\r\n }\r\n const rows: NxePivotHeaderCell[][] = [];\r\n for (let r = 0; r < depth; r++) {\r\n const row: NxePivotHeaderCell[] = [];\r\n let i = 0;\r\n while (i < leaves.length) {\r\n const id = this.headerIdAt(leaves[i], r);\r\n if (id === null) {\r\n i++;\r\n continue;\r\n }\r\n let j = i + 1;\r\n while (j < leaves.length && this.headerIdAt(leaves[j], r) === id) {\r\n j++;\r\n }\r\n row.push(\r\n this.headerCellAt(leaves[i], r, j - i, depth, texts, showColumnTotals, totalsPrior),\r\n );\r\n i = j;\r\n }\r\n rows.push(row);\r\n }\r\n // The gate counts ALL data fields incl. hidden ones (dx `cellDescriptionsCount > 1`,\r\n // m_data_controller): 2 measures with 1 hidden still render the caption row — showing\r\n // only the visible caption, because the cells map over the (visible-only) leaves.\r\n if (this.dataFields.length > 1 && !measuresOnRows) {\r\n rows.push(\r\n leaves.map((leaf) => {\r\n const cell: NxePivotHeaderCell = {\r\n text: dataCaption(leaf.dataIndex),\r\n colspan: 1,\r\n isGrandTotal: leaf.kind === 'GT',\r\n };\r\n if (leaf.kind === 'T') {\r\n cell.isTotal = true; // dx: metric cells inherit their leaf's type\r\n }\r\n return cell;\r\n }),\r\n );\r\n }\r\n return rows;\r\n }\r\n\r\n /**\r\n * `dataFieldArea: 'row'` with ≥2 measures (P2-C3): split every body row into one row per\r\n * data field — dx appends metric children (caption / `dataIndex` / `isMetric`, type\r\n * inherited) to EVERY row header item, D, T and GT alike (m_data_controller\r\n * getViewHeaderItems). The dimension label cells attach to the FIRST measure row with\r\n * their rowspans multiplied (each underlying axis row now spans M rendered rows); every\r\n * measure row appends the caption cell as the innermost row-header column.\r\n */\r\n private splitRowsByMeasures(\r\n rows: NxePivotBodyRow[],\r\n layout: NxePivotRowHeaderLayout,\r\n ): NxePivotBodyRow[] {\r\n // Only VISIBLE measures render rows (dx skips hidden metric children); each keeps its\r\n // ORIGINAL dataIndex among ALL data fields so cell addressing stays stable.\r\n const measures = this.dataFields\r\n .map((df, di) => ({ df, di }))\r\n .filter(({ df }) => df.visible !== false);\r\n if (measures.length === 0) {\r\n return rows;\r\n }\r\n const measureCol = layout === 'standard' ? Math.max(1, this.rowFields.length) : 1;\r\n const out: NxePivotBodyRow[] = [];\r\n for (const row of rows) {\r\n measures.forEach(({ df, di }, mi) => {\r\n const caption = df.caption ?? df.dataField ?? '';\r\n const measureCell: NxePivotRowHeaderCell = {\r\n text: caption,\r\n col: measureCol,\r\n rowspan: 1,\r\n colspan: 1,\r\n expandable: false,\r\n expanded: false,\r\n isTotal: row.kind === 'T',\r\n pathKey: row.pathKey,\r\n };\r\n out.push({\r\n ...row,\r\n dataIndex: di,\r\n measureCaption: caption,\r\n measureRowspan: mi === 0 ? measures.length : 0,\r\n trackKey: row.pathKey + KEY_SEP + row.kind + KEY_SEP + di,\r\n headerCells:\r\n mi === 0\r\n ? [\r\n ...row.headerCells.map((hc) => ({\r\n ...hc,\r\n rowspan: hc.rowspan * measures.length,\r\n })),\r\n measureCell,\r\n ]\r\n : [measureCell],\r\n });\r\n });\r\n }\r\n return out;\r\n }\r\n\r\n /**\r\n * P2-C3: run the dx post-aggregation passes (`summaryDisplayMode` / `calculateSummaryValue`\r\n * via applyDisplaySummaryMode, then `runningTotal` via applyRunningTotal — the\r\n * m_data_source._update ordering) over the VISIBLE axis trees of this model build. dx\r\n * computes these on its loaded data, which only contains children for expanded paths — the\r\n * visible tree IS dx's loaded tree, so prev/next/children navigation and group-boundary\r\n * resets see exactly what dx sees. Returns null (the untouched fast path) when no data\r\n * field opts in or nothing aggregated.\r\n */\r\n private buildPostProcessed(\r\n overrides: ReadonlyMap<string, boolean>,\r\n allExpanded: boolean | undefined,\r\n ): {\r\n data: NxePivotSummaryData;\r\n rowIndexByKey: Map<string, number>;\r\n colIndexByKey: Map<string, number>;\r\n } | null {\r\n const expressionsUsed = this.dataFields.some(\r\n (f) => !!f.summaryDisplayMode || typeof f.calculateSummaryValue === 'function',\r\n );\r\n const runningTotalUsed = this.dataFields.some((f) => !!f.runningTotal);\r\n // dx: `!that.isEmpty() && …` — an empty load (no aggregated values) skips both passes.\r\n if ((!expressionsUsed && !runningTotalUsed) || this.agg.size === 0) {\r\n return null;\r\n }\r\n // Index 0 is the grand total on both axes (dx grandTotalRowIndex/grandTotalColumnIndex).\r\n const rowIndexByKey = new Map<string, number>([['', 0]]);\r\n const colIndexByKey = new Map<string, number>([['', 0]]);\r\n const rowPaths: any[][] = [[]];\r\n const colPaths: any[][] = [[]];\r\n const rows = this.buildSummaryNodes(\r\n this.rowTree,\r\n this.rowFields,\r\n overrides,\r\n allExpanded,\r\n rowIndexByKey,\r\n rowPaths,\r\n );\r\n const columns = this.buildSummaryNodes(\r\n this.colTree,\r\n this.columnFields,\r\n overrides,\r\n allExpanded,\r\n colIndexByKey,\r\n colPaths,\r\n );\r\n const values: any[][][] = [];\r\n for (let r = 0; r < rowPaths.length; r++) {\r\n values[r] = [];\r\n for (let c = 0; c < colPaths.length; c++) {\r\n values[r][c] = this.dataFields.map((_, di) =>\r\n this.valueAt(rowPaths[r], colPaths[c], di),\r\n );\r\n }\r\n }\r\n const data: NxePivotSummaryData = {\r\n rows,\r\n columns,\r\n values,\r\n grandTotalRowIndex: 0,\r\n grandTotalColumnIndex: 0,\r\n };\r\n const descriptions: NxePivotSummaryDescriptions = {\r\n rows: this.rowFields,\r\n columns: this.columnFields,\r\n values: this.dataFields,\r\n };\r\n if (expressionsUsed) {\r\n applyDisplaySummaryMode(descriptions, data);\r\n }\r\n if (runningTotalUsed) {\r\n applyRunningTotal(descriptions, data);\r\n }\r\n return { data, rowIndexByKey, colIndexByKey };\r\n }\r\n\r\n /** Visible-tree projection of one axis (collapsed nodes stay leaves), dx loaded-data shape. */\r\n private buildSummaryNodes(\r\n nodes: NxePivotAxisNode[],\r\n fields: NxePivotField[],\r\n overrides: ReadonlyMap<string, boolean>,\r\n allExpanded: boolean | undefined,\r\n indexByKey: Map<string, number>,\r\n paths: any[][],\r\n ): NxePivotSummaryNode[] {\r\n return nodes.map((n) => {\r\n const index = paths.length;\r\n indexByKey.set(pathKeyOf(n.path), index);\r\n paths.push(n.path);\r\n const node: NxePivotSummaryNode = { value: n.value, index };\r\n if (n.children.length > 0 && this.isExpanded(n, overrides, allExpanded, fields)) {\r\n node.children = this.buildSummaryNodes(\r\n n.children,\r\n fields,\r\n overrides,\r\n allExpanded,\r\n indexByKey,\r\n paths,\r\n );\r\n }\r\n return node;\r\n });\r\n }\r\n\r\n /** Tree layout (and the pre-parity default): one indented column, parents inline with aggregates. */\r\n private flattenTreeRows(\r\n overrides: ReadonlyMap<string, boolean>,\r\n allExpanded: boolean | undefined,\r\n ): NxePivotBodyRow[] {\r\n const out: NxePivotBodyRow[] = [];\r\n const lastLevel = this.rowFields.length - 1;\r\n const visit = (nodes: NxePivotAxisNode[]) => {\r\n for (const n of nodes) {\r\n const hasChildren = n.children.length > 0;\r\n const expanded = this.isExpanded(n, overrides, allExpanded, this.rowFields);\r\n out.push({\r\n kind: 'D',\r\n label: n.label,\r\n level: n.level,\r\n path: n.path,\r\n pathKey: n.pathKey,\r\n hasChildren,\r\n expanded,\r\n isGrandTotal: false,\r\n headerCells: [\r\n {\r\n text: n.label,\r\n col: 0,\r\n rowspan: 1,\r\n colspan: 1,\r\n expandable: hasChildren,\r\n expanded,\r\n isTotal: false,\r\n pathKey: n.pathKey,\r\n },\r\n ],\r\n });\r\n if (hasChildren && expanded && n.level < lastLevel) {\r\n visit(n.children);\r\n }\r\n }\r\n };\r\n visit(this.rowTree);\r\n return out;\r\n }\r\n\r\n /**\r\n * Standard layout (dx default): N row-header columns. An EXPANDED parent contributes no\r\n * value row — its label cell rowspans its children's rows, its own tr carries the first\r\n * child's values, and (with `showRowTotals`) a full-width \"{value} Total\" row closes the\r\n * group AFTER the children (`totalsPrior` moves it before). A COLLAPSED parent is one row:\r\n * label colspans the remaining header columns, aggregates inline.\r\n */\r\n private flattenStandardRows(\r\n overrides: ReadonlyMap<string, boolean>,\r\n allExpanded: boolean | undefined,\r\n showRowTotals: boolean,\r\n totalsPrior: boolean,\r\n texts: Required<NxePivotTexts>,\r\n ): NxePivotBodyRow[] {\r\n const out: NxePivotBodyRow[] = [];\r\n const colCount = Math.max(1, this.rowFields.length);\r\n const visit = (node: NxePivotAxisNode): void => {\r\n const open =\r\n node.children.length > 0 &&\r\n this.isExpanded(node, overrides, allExpanded, this.rowFields);\r\n if (!open) {\r\n out.push({\r\n kind: 'D',\r\n label: node.label,\r\n level: node.level,\r\n path: node.path,\r\n pathKey: node.pathKey,\r\n hasChildren: node.children.length > 0,\r\n expanded: false,\r\n isGrandTotal: false,\r\n headerCells: [\r\n {\r\n text: node.label,\r\n col: node.level,\r\n rowspan: 1,\r\n colspan: colCount - node.level,\r\n expandable: node.children.length > 0,\r\n expanded: false,\r\n isTotal: false,\r\n pathKey: node.pathKey,\r\n },\r\n ],\r\n });\r\n return;\r\n }\r\n // dx blank-parent rule: '' + '{0} Total' renders as just 'Total'.\r\n const totalLabel = texts.total.replace('{0}', node.label).trim();\r\n const totalRow: NxePivotBodyRow | null = showRowTotals\r\n ? {\r\n kind: 'T',\r\n label: totalLabel,\r\n level: node.level,\r\n path: node.path,\r\n pathKey: node.pathKey,\r\n hasChildren: false,\r\n expanded: false,\r\n isGrandTotal: false,\r\n headerCells: [\r\n {\r\n text: totalLabel,\r\n col: node.level,\r\n rowspan: 1,\r\n colspan: colCount - node.level,\r\n expandable: false,\r\n expanded: false,\r\n isTotal: true,\r\n pathKey: node.pathKey,\r\n },\r\n ],\r\n }\r\n : null;\r\n if (totalsPrior && totalRow) {\r\n out.push(totalRow);\r\n }\r\n const firstChildIdx = out.length;\r\n for (const child of node.children) {\r\n visit(child);\r\n }\r\n // The parent's label cell attaches to its first child's tr and spans the subtree.\r\n out[firstChildIdx].headerCells.unshift({\r\n text: node.label,\r\n col: node.level,\r\n rowspan: out.length - firstChildIdx,\r\n colspan: 1,\r\n expandable: true,\r\n expanded: true,\r\n isTotal: false,\r\n pathKey: node.pathKey,\r\n });\r\n if (!totalsPrior && totalRow) {\r\n out.push(totalRow);\r\n }\r\n };\r\n for (const root of this.rowTree) {\r\n visit(root);\r\n }\r\n return out;\r\n }\r\n\r\n private isExpanded(\r\n node: NxePivotAxisNode,\r\n overrides: ReadonlyMap<string, boolean>,\r\n allExpanded: boolean | undefined,\r\n fields: NxePivotField[],\r\n ): boolean {\r\n // Namespaced lookup (nxe-pivot-axis owns the prefixes): the component round-trips the\r\n // node's own pathKey; legacy un-namespaced keys from direct getModel() callers are\r\n // honoured as row keys. `fields` is the node's own axis (row OR column since P2-C2) —\r\n // `fields[level].expanded` seeds the default exactly like dx.\r\n const override = readExpandOverride(overrides, node.pathKey);\r\n if (override !== undefined) {\r\n return override;\r\n }\r\n if (allExpanded !== undefined) {\r\n // Facade expand-all/collapse-all — behaves as `expanded` set on every field (§e).\r\n return allExpanded;\r\n }\r\n return fields[node.level]?.expanded === true;\r\n }\r\n}\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\nimport { ChangeDetectionStrategy, Component, input, ViewEncapsulation } from '@angular/core';\r\n\r\n/**\r\n * `nxe-state-storing` — accepts DevExtreme `dxo-state-storing` config (orbit addition).\r\n *\r\n * LIVE since P3-C4 for `type: 'custom'`: `NxePivotGridComponent` contentChild's this and (a)\r\n * fires `customSave(state)` after every layout mutation — panel/chooser chip drag, sort\r\n * toggle, header-filter apply, chooser check/uncheck, facade expandAll/collapseAll — with a\r\n * dx-shaped state whose `fields` are the serialized effectiveFields (the POST-drag layout,\r\n * FULL field copies — see buildStorageState), and (b) honors `customLoad` once\r\n * on init (value or Promise, per dx's `fromPromise` contract). The `localStorage`/\r\n * `sessionStorage` types and `storageKey` remain accepted-but-inert (DEFAULTS.md, dated\r\n * P3-C4 rows — including the missing dx `savingTimeout` debounce).\r\n */\r\n@Component({\r\n selector: 'nxe-state-storing',\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 NxeStateStoringComponent {\r\n readonly enabled = input(false);\r\n readonly type = input<'localStorage' | 'sessionStorage' | 'custom'>('localStorage');\r\n readonly storageKey = input<string | undefined>(undefined);\r\n readonly customSave = input<((state: any) => void) | undefined>(undefined);\r\n readonly customLoad = input<(() => any) | undefined>(undefined);\r\n}\r\n\r\n/**\r\n * `nxe-field-panel` — DevExtreme `dxo-field-panel` config (orbit addition), LIVE since P3-C2:\r\n * `NxePivotGridComponent` contentChild's it and renders `nxe-pivot-field-panel` above the\r\n * cross-tab when `visible` is true.\r\n *\r\n * Defaults are dx's `fieldPanel` defaults (dxPivotGrid docs, verified 2026-09-02): `visible`\r\n * FALSE — nothing renders unless the host opts in (the calc tabs project no `nxe-field-panel`\r\n * at all) — and the five feature flags TRUE. report-output-pivot binds all six from its saved\r\n * `panelConfig`; an `undefined` bound into a flag is treated as \"not false\" (= the dx default)\r\n * by the pivot's template, so a not-yet-loaded config never blanks an area.\r\n */\r\n@Component({\r\n selector: 'nxe-field-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 NxeFieldPanelComponent {\r\n readonly visible = input(false);\r\n readonly showDataFields = input(true);\r\n readonly showRowFields = input(true);\r\n readonly showColumnFields = input(true);\r\n readonly showFilterFields = input(true);\r\n readonly allowFieldDragging = input(true);\r\n}\r\n","// nxe-pivot-field-chip — the SHARED dx field chip (P3-C3). One rendering for every place a\r\n// field chip appears: the field panel's area bands / corner row area (P3-C2, table cells) and\r\n// the field chooser popup's four group areas (P3-C3, stacked divs). Attribute selector so the\r\n// HOST element stays the caller's own `<div>` carrying dx's exact `.nxe-area-field.nxe-area-box`\r\n// classes (fixtures/fields-panel.html and fixtures/field-chooser.html agree on the chip\r\n// subtree: `.nxe-area-field-content` + optional `.nxe-column-indicators`).\r\n//\r\n// P3-C4: the header-filter funnel (`span.nxe-header-filter`) renders beside the sort arrow —\r\n// dx FieldChooserBase.renderField applies the sort state first, then the headerFilter state,\r\n// appending both into ONE `.nxe-column-indicators` container (m_column_state_mixin reuses the\r\n// container; ltr 'left' alignment appends, so the funnel sits AFTER the arrow). A funnel click\r\n// must NOT sort: dx's chip click handler branches on `$(e.target).hasClass('nxe-header-filter')`\r\n// (m_field_chooser_base subscribeToEvents), so the funnel handler stops propagation before the\r\n// host's own (click) fires.\r\n//\r\n// WHERE the indicator block goes follows dx's showColumnLines rule\r\n// (m_column_state_mixin `_applyColumnState`): renderField(field, showColumnLines) PREPENDS the\r\n// block and floats it right (inline `float: right`, as dx sets it) when showColumnLines is on —\r\n// the field chooser (`renderField(field, true)`, m_field_chooser.js:465) and the panel's ROW area\r\n// (`renderField(field, \"row\" === field.area)`, m_fields_area.js:120). Everywhere else (panel\r\n// column / filter / data chips) it is APPENDED after the caption, inline, unfloated. The caller\r\n// says which through `floatIndicators`.\r\n//\r\n// The arrow and funnel are the library's own drawings (clip-path polygons written from round\r\n// pixel metrics — the DXIcons font is not used) in dx's 14px glyph box: `.dx-sort` #959595,\r\n// `.dx-header-filter` #757575 with the `-empty` state at 50% alpha\r\n// (`.dx-pivotgrid-fields-container .dx-header-filter-empty{color:rgba(117,117,117,.5)}`). An\r\n// app that shrinks `.nxe-column-indicators` (bright's `scale: .7`) shrinks them as it did dx's.\r\n\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n input,\r\n output,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { NgTemplateOutlet } from '@angular/common';\r\nimport type { NxePivotPanelChip } from './nxe-pivot-field-panel.component';\r\n\r\n@Component({\r\n // eslint-disable-next-line @angular-eslint/component-selector\r\n selector: 'div[nxePivotFieldChip]',\r\n standalone: true,\r\n template: `@if (floatIndicators()) {<ng-container *ngTemplateOutlet=\"indicators\" />}<div class=\"nxe-area-field-content\">{{ chip().caption }}</div>@if (!floatIndicators()) {<ng-container *ngTemplateOutlet=\"indicators\" />}\r\n <ng-template #indicators>@if (chip().sortable || chip().filterable) {<div\r\n class=\"nxe-column-indicators\"\r\n role=\"presentation\"\r\n [style.float]=\"floatIndicators() ? 'right' : null\">@if (chip().sortable) {<span\r\n class=\"nxe-sort\"\r\n [class.nxe-sort-up]=\"chip().sortOrder === 'asc'\"\r\n [class.nxe-sort-down]=\"chip().sortOrder === 'desc'\"></span>}@if (chip().filterable) {<span\r\n class=\"nxe-header-filter\"\r\n [class.nxe-header-filter-empty]=\"!chip().filterActive\"\r\n (click)=\"onFunnelClick($event)\"></span>}</div>}</ng-template>`,\r\n imports: [NgTemplateOutlet],\r\n // Global (ViewEncapsulation.None), shipped WITH the chip so every surface that renders a chip\r\n // gets its chrome without the app's dx-compat.css. Keyed on the classes the templates emit:\r\n // `.nxe-pivotgrid-fields-container` (armed on the pivot host while the panel renders, carried\r\n // by the chooser popup's own root and by the drag ghost) and `.nxe-pivotgrid` (the pivot host\r\n // only — dx's panel-only rules). Values are dx.light's, rule for rule.\r\n //\r\n // The indicator selectors run one class deeper (`.nxe-column-indicators .nxe-sort`, 0,3,x)\r\n // than an app's dx-prefixed redraws of the same glyphs (bright dx-compat.css:1456-1459\r\n // `.dx-pivotgrid-fields-container .dx-sort{vertical-align:middle}` and its `::after`\r\n // triangles, :1376-1377 `::before{content:none}`, all 0,2,x), so with the dx class mirror\r\n // on, the library's arrow still draws and theirs is switched off — no doubled glyphs.\r\n styles: `\r\n .nxe-pivotgrid-fields-container .nxe-area-fields {\r\n position: relative;\r\n }\r\n .nxe-pivotgrid-fields-container .nxe-area-field {\r\n cursor: pointer;\r\n }\r\n /* dx.light .dx-pivotgrid-fields-container .dx-area-field.dx-area-box */\r\n .nxe-pivotgrid-fields-container .nxe-area-field.nxe-area-box {\r\n box-sizing: border-box;\r\n margin-bottom: 4px;\r\n padding: 7px 10px;\r\n border: 1px solid var(--nxe-ui-border, #ddd);\r\n background-color: var(--nxe-ui-surface, #fff);\r\n }\r\n .nxe-pivotgrid .nxe-area-field.nxe-area-box {\r\n margin-bottom: 0;\r\n }\r\n .nxe-pivotgrid-fields-container .nxe-area-field-content {\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n vertical-align: bottom;\r\n }\r\n .nxe-pivotgrid .nxe-area-field-content,\r\n .nxe-pivotgrid .nxe-column-indicators {\r\n display: inline-block;\r\n }\r\n .nxe-pivotgrid .nxe-area-field,\r\n .nxe-pivotgrid .nxe-area-field-content {\r\n white-space: nowrap;\r\n }\r\n\r\n /* The indicator block: dx .dx-pivotgrid-fields-container .dx-column-indicators\r\n {vertical-align:bottom;margin-left:6px;line-height:19px}. */\r\n .nxe-pivotgrid-fields-container .nxe-column-indicators {\r\n margin-left: 6px;\r\n line-height: 19px;\r\n vertical-align: bottom;\r\n white-space: nowrap;\r\n }\r\n\r\n /* Both glyph boxes are dx's 14px em box. dx sets them in DXIcons at 14px/1 on the text\r\n baseline, and that font's em box reaches 0.875px below the baseline; an empty\r\n inline-block sits ON the baseline, hence the -0.875px. */\r\n .nxe-pivotgrid-fields-container .nxe-column-indicators .nxe-sort,\r\n .nxe-pivotgrid-fields-container .nxe-column-indicators .nxe-header-filter {\r\n display: inline-block;\r\n position: relative;\r\n box-sizing: border-box;\r\n width: 14px;\r\n height: 14px;\r\n vertical-align: -0.875px;\r\n }\r\n .nxe-pivotgrid-fields-container .nxe-column-indicators .nxe-sort::before,\r\n .nxe-pivotgrid-fields-container .nxe-column-indicators .nxe-header-filter::before {\r\n content: '';\r\n position: absolute;\r\n inset: 0;\r\n box-sizing: border-box;\r\n background-color: currentColor;\r\n }\r\n .nxe-pivotgrid-fields-container .nxe-column-indicators .nxe-sort::after,\r\n .nxe-pivotgrid-fields-container .nxe-column-indicators .nxe-header-filter::after {\r\n content: none;\r\n }\r\n\r\n /* Sort arrow (dx .dx-pivotgrid-fields-container .dx-sort{color:#959595}, \\\\f051/\\\\f052):\r\n a 1px shaft the full 14px tall at x 6-7 under a 5 x 3 head centred on x 6.5. */\r\n .nxe-pivotgrid-fields-container .nxe-column-indicators .nxe-sort {\r\n color: #959595;\r\n }\r\n .nxe-pivotgrid-fields-container .nxe-column-indicators .nxe-sort-up::before {\r\n clip-path: polygon(6.5px 0, 9px 3px, 7px 3px, 7px 14px, 6px 14px, 6px 3px, 4px 3px);\r\n }\r\n .nxe-pivotgrid-fields-container .nxe-column-indicators .nxe-sort-down::before {\r\n clip-path: polygon(6px 0, 7px 0, 7px 11px, 9px 11px, 6.5px 14px, 4px 11px, 6px 11px);\r\n }\r\n\r\n /* Funnel (dx .dx-header-filter{color:#757575}, \\\\f050): the grid header funnel's\r\n polygon (nxe-data-grid .nxe-grid-hf-icon) in the same 14px box — a 3px brim across the\r\n full width, 45deg shoulders falling 5px to a 4px stem (x 5-9) that runs to the bottom. */\r\n .nxe-pivotgrid-fields-container .nxe-column-indicators .nxe-header-filter {\r\n color: #757575;\r\n cursor: pointer;\r\n }\r\n .nxe-pivotgrid-fields-container .nxe-column-indicators .nxe-header-filter-empty {\r\n color: rgba(117, 117, 117, 0.5);\r\n }\r\n .nxe-pivotgrid-fields-container .nxe-column-indicators .nxe-header-filter::before {\r\n clip-path: polygon(0 0, 14px 0, 14px 3px, 9px 8px, 9px 14px, 5px 14px, 5px 8px, 0 3px);\r\n }\r\n\r\n /* Forced colours (Windows high contrast) replace every background-color with Canvas, the\r\n colour behind the glyph, so the arrow and funnel would vanish. As the shared\r\n nxe-forced-colors-mark mixin does (styles/_mixins.scss), the marks opt out of the\r\n forcing and paint in CanvasText. */\r\n @media (forced-colors: active) {\r\n .nxe-pivotgrid-fields-container .nxe-column-indicators .nxe-sort::before,\r\n .nxe-pivotgrid-fields-container .nxe-column-indicators .nxe-header-filter::before {\r\n forced-color-adjust: none;\r\n background-color: CanvasText;\r\n }\r\n }\r\n\r\n /* Drag chrome (dx.light): the ghost is a .nxe-pivotgrid-fields-container.nxe-drag clone\r\n of the chip, the source chip dims, and a 2px gray bar marks the drop slot (the drag\r\n engines size and place it inline). */\r\n .nxe-pivotgrid-fields-container.nxe-drag {\r\n opacity: 0.8;\r\n }\r\n .nxe-pivotgrid-fields-container.nxe-drag .nxe-area-field.nxe-area-box {\r\n border: 1px solid rgba(51, 122, 183, 0.5);\r\n box-shadow: 0 0 1px rgba(0, 0, 0, 0.1), 0 1px 3px rgba(0, 0, 0, 0.2);\r\n }\r\n .nxe-pivotgrid-fields-container.nxe-drag .nxe-area-field-content {\r\n display: inline-block;\r\n }\r\n .nxe-pivotgrid-fields-container.nxe-drag .nxe-column-indicators {\r\n display: inline-block;\r\n float: none;\r\n }\r\n .nxe-pivotgrid-fields-container .nxe-drag-source {\r\n opacity: 0.5;\r\n }\r\n .nxe-pivotgrid-fields-container .nxe-position-indicator {\r\n background-color: gray;\r\n }\r\n .nxe-pivotgrid-fields-container .nxe-position-indicator.nxe-position-indicator-vertical {\r\n height: 2px;\r\n margin-top: -4px;\r\n margin-left: -1px;\r\n }\r\n .nxe-pivotgrid-fields-container .nxe-position-indicator.nxe-position-indicator-vertical.nxe-position-indicator-last {\r\n margin-top: -3px;\r\n }\r\n .nxe-pivotgrid-fields-container .nxe-position-indicator.nxe-position-indicator-horizontal {\r\n width: 2px;\r\n margin-left: -3px;\r\n }\r\n .nxe-pivotgrid-fields-container .nxe-position-indicator.nxe-position-indicator-horizontal.nxe-position-indicator-last {\r\n margin-left: 3px;\r\n }\r\n `,\r\n host: {\r\n class: 'nxe-area-field nxe-area-box',\r\n '(pointerdown)': 'chipPointerDown.emit($event)',\r\n '(click)': 'chipClick.emit()',\r\n },\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class NxePivotFieldChipComponent {\r\n readonly chip = input.required<NxePivotPanelChip>();\r\n /** dx showColumnLines for this chip's surface: true in the field chooser and the panel's\r\n * ROW area — the indicators come FIRST and float right; false (panel column / filter /\r\n * data areas) — they follow the caption inline. */\r\n readonly floatIndicators = input(false);\r\n /** Raw pointerdown — the host decides whether a drag gesture may begin. */\r\n readonly chipPointerDown = output<PointerEvent>();\r\n /** Chip click (the host consults its gesture's click suppression before sorting). */\r\n readonly chipClick = output<void>();\r\n /** The funnel was clicked — the host opens the header-filter panel for this field. */\r\n readonly chipFilterClick = output<MouseEvent>();\r\n\r\n protected onFunnelClick(event: MouseEvent): void {\r\n // dx branches sort-vs-filter on the click target (m_field_chooser_base) — the funnel\r\n // click must never reach the host's sort handler.\r\n event.stopPropagation();\r\n this.chipFilterClick.emit(event);\r\n }\r\n}\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\n// nxe-pivot-field-panel — the dx field panel (dxo-field-panel), P3-C2. Renders the\r\n// `.nxe-pivotgrid-fields-area` blocks harvested from the live broker reference\r\n// (tools/visual-parity/reference/pivot/fixtures/fields-panel.html, ORACLE.md §c): filter strip\r\n// on top, then data + column header cells side by side. The ROW area is NOT a band of this\r\n// panel: dx hosts it inside the cross-tab's corner `.nxe-area-description-cell`\r\n// (views/0/initial-full-page.png — the 'Lob' chip sits in the corner, no caption text), so it\r\n// is exposed as `rowAreaTemplate` and NxePivotGridComponent outlets it into its corner cell.\r\n// Chips are `.nxe-area-field.nxe-area-box > .nxe-area-field-content`; an empty area shows dx's\r\n// exact localization string (\"Drop Filter Fields Here\" etc. — dx fieldPanel.texts defaults).\r\n//\r\n// The panel is DUMB about field state: it reads chips off the pivot's engine (which already has\r\n// the component's fieldOverrides merged in) and emits `fieldMove` / `sortToggle`; the pivot\r\n// component owns the override map and never mutates the caller's fields (nxe-pivot.types\r\n// NxePivotFieldOverride).\r\n//\r\n// Dragging reuses the shared NxeDragGesture core extracted from the grid controller (same 5px\r\n// threshold / Escape / click-suppression semantics the group-drag audit pinned); the ghost is\r\n// dx's `.nxe-pivotgrid-fields-container.nxe-drag` chip clone, the insertion mark dx's\r\n// `.nxe-position-indicator` 2px bar. Drop zones are hit-tested from the PIVOT root (the row area\r\n// lives in the cross-tab corner): the whole corner cell is the row drop target and carries the\r\n// `nxe-drag-target` highlight; the other areas highlight their fields-area element.\r\n\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n ElementRef,\r\n inject,\r\n input,\r\n NgZone,\r\n OnDestroy,\r\n output,\r\n TemplateRef,\r\n viewChild,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { NgTemplateOutlet } from '@angular/common';\r\nimport { NxeDragGesture } from '@nexterajs/ui/grid';\r\nimport { NxePivotFieldChipComponent } from './nxe-pivot-field-chip.component';\r\nimport { NxePivotDataSource } from './nxe-pivot-data-source';\r\nimport { NxePivotArea, NxePivotField } from './nxe-pivot.types';\r\n\r\n/** dx `fieldPanel.texts` defaults (dxPivotGrid docs; the filter string matches the fixture). */\r\nconst EMPTY_AREA_TEXTS: Record<NxePivotArea, string> = {\r\n filter: 'Drop Filter Fields Here',\r\n data: 'Drop Data Fields Here',\r\n column: 'Drop Column Fields Here',\r\n row: 'Drop Row Fields Here',\r\n};\r\n\r\n/** One rendered chip. `sortOrder` is the EFFECTIVE order (dx: fields sort asc by default). */\r\nexport interface NxePivotPanelChip {\r\n fieldIndex: number;\r\n caption: string;\r\n sortOrder: 'asc' | 'desc';\r\n sortable: boolean;\r\n /** P3-C4: the chip renders the `.nxe-header-filter` funnel (never on data-area chips). */\r\n filterable: boolean;\r\n /** A filter is applied (`filterValues` non-empty) — full-alpha funnel, no `-empty` class. */\r\n filterActive: boolean;\r\n}\r\n\r\n/** A funnel click — the pivot opens the shared header-filter panel anchored to the chip. */\r\nexport interface NxePivotFilterOpenEvent {\r\n fieldIndex: number;\r\n /** The chip element (dx anchors the popup to `e.currentTarget`, the chip itself). */\r\n origin: HTMLElement;\r\n}\r\n\r\n/**\r\n * One chip's model, shared by the panel and the chooser (P3-C4). Per-field flag precedence is\r\n * dx m_widget `_updateCalculatedOptions`: the widget-level allowSorting/allowFiltering value\r\n * stamps a field only while the field's own value is undefined — an explicit `false` opts the\r\n * field out under a permissive widget, an explicit `true` opts it in under a restrictive one.\r\n * The DATA area never sorts by click (that is allowSortingBySummary's context-menu territory)\r\n * and never funnels (dx renderField skips both states for `field.area === 'data'`,\r\n * m_field_chooser_base). `filterActive` mirrors dx `_isHeaderFilterEmpty` inverted.\r\n */\r\nexport function buildChip(\r\n fieldIndex: number,\r\n field: NxePivotField,\r\n group: NxePivotArea,\r\n widgetAllowSorting: boolean,\r\n widgetAllowFiltering: boolean,\r\n): NxePivotPanelChip {\r\n return {\r\n fieldIndex,\r\n caption: field.caption ?? field.dataField ?? '',\r\n // dx: pivot fields sort ascending unless explicitly 'desc' — the chip arrow shows\r\n // the EFFECTIVE order, so an unsorted field carries the up arrow (dx field panel).\r\n sortOrder: field.sortOrder === 'desc' ? 'desc' : 'asc',\r\n sortable: (field.allowSorting ?? widgetAllowSorting) === true && group !== 'data',\r\n filterable: (field.allowFiltering ?? widgetAllowFiltering) === true && group !== 'data',\r\n filterActive: (field.filterValues?.length ?? 0) > 0,\r\n };\r\n}\r\n\r\ninterface PanelArea {\r\n group: NxePivotArea;\r\n chips: NxePivotPanelChip[];\r\n emptyText: string;\r\n}\r\n\r\n/**\r\n * A chip drop or chooser toggle. `area: null` = REMOVE the field from the layout — emitted\r\n * only by the chooser (a drop on its All-Fields tree, or a checkbox uncheck). dx m_sortable\r\n * fires no change at all for a release outside every group's fields box (the chip snaps\r\n * back), so the PANEL never emits null: an off-panel release is a no-op — corrected in P3-C3\r\n * (the P3-C2 cut mis-transcribed outside-drop as removal).\r\n */\r\nexport interface NxePivotFieldMoveEvent {\r\n fieldIndex: number;\r\n area: NxePivotArea | null;\r\n areaIndex: number;\r\n}\r\n\r\n@Component({\r\n selector: 'nxe-pivot-field-panel',\r\n standalone: true,\r\n imports: [NgTemplateOutlet, NxePivotFieldChipComponent],\r\n templateUrl: './nxe-pivot-field-panel.component.html',\r\n styleUrl: './nxe-pivot-field-panel.component.scss',\r\n // The dx marker classes (`nxe-pivotgrid nxe-pivotgrid-fields-container`) live on the PIVOT\r\n // host while the panel is visible (dx puts them on the widget root) so the compat chip\r\n // chrome reaches both these bands AND the corner-hosted row area.\r\n host: { class: 'nxe-pivot-field-panel' },\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class NxePivotFieldPanelComponent implements OnDestroy {\r\n /** The pivot's CURRENT engine — overrides already merged, so chips track every mutation. */\r\n readonly engine = input<NxePivotDataSource | null>(null);\r\n // The five dx fieldPanel flags (the pivot passes them pre-coerced: `undefined` → dx default).\r\n readonly showFilterFields = input(true);\r\n readonly showDataFields = input(true);\r\n readonly showColumnFields = input(true);\r\n readonly showRowFields = input(true);\r\n readonly allowFieldDragging = input(true);\r\n /** dx widget `allowSorting` (default false): chip click toggles the field's sortOrder.\r\n * A field's own `allowSorting` overrides it (dx m_widget `_updateCalculatedOptions`\r\n * stamps the widget flag onto a field only while the field's own value is undefined). */\r\n readonly allowSorting = input(false);\r\n /** dx widget `allowFiltering` (default false, P3-C4): dimension chips render the\r\n * header-filter funnel. Same per-field precedence as `allowSorting`. */\r\n readonly allowFiltering = input(false);\r\n /** Widget `showBorders`: the panel bands sit INSIDE the border box (dx draws the outer\r\n * border around the filter/chip bands — `.nxe-pivotgrid-border .nxe-filter-header` et al). */\r\n readonly showBorders = input(false);\r\n /** P3-C3: the pivot's `.nxe-pivotgrid-toolbar` template (field-chooser button) — rendered\r\n * where dx prepends its toolbar container (m_widget.js `_renderDescriptionArea`). */\r\n readonly toolbarTemplate = input<TemplateRef<unknown> | null>(null);\r\n /** Which panel band hosts the toolbar (the pivot resolves dx's placement branches):\r\n * 'filter' = the filter-header cell; 'column' = the column-header cell (dx's middle\r\n * branch — showFilterFields off but data/column bands shown; the cell renders for the\r\n * toolbar even when showColumnFields is off, exactly as dx's always-present\r\n * $columnHeader does); null = the toolbar lives in the cross-tab corner (or no\r\n * chooser) — nothing renders here. */\r\n readonly toolbarArea = input<'filter' | 'column' | null>(null);\r\n\r\n /** A chip was dropped — the pivot recomputes areaIndexes and writes its override map. */\r\n readonly fieldMove = output<NxePivotFieldMoveEvent>();\r\n /** A sortable chip was clicked — the pivot flips the field's effective sortOrder. */\r\n readonly sortToggle = output<{ fieldIndex: number }>();\r\n /** A chip's funnel was clicked — the pivot opens the header-filter panel (P3-C4). */\r\n readonly filterOpen = output<NxePivotFilterOpenEvent>();\r\n\r\n /** The ROW fields area — NxePivotGridComponent outlets this into its corner cell (dx hosts\r\n * the row chips inside `.nxe-area-description-cell`, never in a band of their own). */\r\n readonly rowAreaTemplate = viewChild<TemplateRef<unknown>>('rowAreaTpl');\r\n\r\n private readonly elementRef = inject(ElementRef<HTMLElement>);\r\n private readonly zone = inject(NgZone);\r\n\r\n protected readonly filterArea = computed(() => this.buildArea('filter'));\r\n protected readonly dataArea = computed(() => this.buildArea('data'));\r\n protected readonly columnArea = computed(() => this.buildArea('column'));\r\n protected readonly rowArea = computed(() => this.buildArea('row'));\r\n\r\n /** The toolbar renders in the column-header cell (dx's middle placement branch). */\r\n protected readonly columnToolbar = computed(\r\n () => this.toolbarArea() === 'column' && this.toolbarTemplate() !== null,\r\n );\r\n\r\n // --- Dragging -----------------------------------------------------------------------------\r\n private drag: {\r\n chip: NxePivotPanelChip;\r\n fromArea: NxePivotArea;\r\n targetArea: NxePivotArea | null;\r\n slot: number | null;\r\n targetEl: HTMLElement | null;\r\n indicator: HTMLElement | null;\r\n } | null = null;\r\n\r\n private readonly gesture = new NxeDragGesture(this.zone, {\r\n // dx ghost: the fields-container drag clone — `.nxe-drag` opacity .8, chip re-bordered\r\n // rgba(51,122,183,.5) with the drag shadow (nxe-pivot-field-chip's styles). `nxe-widget`\r\n // carries the 12.24px widget font stack across the <body> boundary, exactly as the\r\n // library's overlay panes do (styling/_widget.scss) — without it the ghost renders in\r\n // the page's body font.\r\n createGhost: () => {\r\n const ghost = document.createElement('div');\r\n ghost.className =\r\n 'nxe-widget nxe-pivotgrid-fields-container nxe-drag nxe-pivot-drag-ghost';\r\n const chip = document.createElement('div');\r\n chip.className = 'nxe-area-field nxe-area-box';\r\n const content = document.createElement('div');\r\n content.className = 'nxe-area-field-content';\r\n content.textContent = this.drag?.chip.caption ?? '';\r\n chip.appendChild(content);\r\n ghost.appendChild(chip);\r\n return ghost;\r\n },\r\n // dx dims the source chip with `nxe-drag-source` (opacity .5 via the container scope).\r\n sourceDragClasses: ['nxe-drag-source'],\r\n dragMove: (x, y) => this.trackPointer(x, y),\r\n drop: () => this.completeDrop(),\r\n clearDropVisuals: () => {\r\n const d = this.drag;\r\n d?.indicator?.remove();\r\n if (d) {\r\n d.indicator = null;\r\n d.targetEl = null;\r\n }\r\n this.dragRoot()\r\n .querySelectorAll('.nxe-drag-target')\r\n .forEach((el) => el.classList.remove('nxe-drag-target'));\r\n },\r\n reset: () => {\r\n this.drag = null;\r\n },\r\n });\r\n\r\n ngOnDestroy(): void {\r\n this.gesture.destroy();\r\n }\r\n\r\n protected onChipPointerDown(chip: NxePivotPanelChip, area: NxePivotArea, event: PointerEvent): void {\r\n if (!this.allowFieldDragging()) {\r\n return; // dx: allowFieldDragging false leaves the chips inert\r\n }\r\n if (!this.gesture.begin(event)) {\r\n return;\r\n }\r\n this.drag = {\r\n chip,\r\n fromArea: area,\r\n targetArea: null,\r\n slot: null,\r\n targetEl: null,\r\n indicator: null,\r\n };\r\n }\r\n\r\n protected onChipClick(chip: NxePivotPanelChip): void {\r\n if (this.gesture.consumeClick()) {\r\n return; // the click browsers fire right after a drop must not also sort\r\n }\r\n if (!chip.sortable) {\r\n return;\r\n }\r\n this.sortToggle.emit({ fieldIndex: chip.fieldIndex });\r\n }\r\n\r\n protected onChipFilterClick(chip: NxePivotPanelChip, event: MouseEvent): void {\r\n if (this.gesture.consumeClick()) {\r\n return; // a drag released over the funnel must not also open the popup\r\n }\r\n const origin =\r\n (event.target as HTMLElement | null)?.closest<HTMLElement>('.nxe-area-field') ??\r\n (event.target as HTMLElement);\r\n this.filterOpen.emit({ fieldIndex: chip.fieldIndex, origin });\r\n }\r\n\r\n private buildArea(group: NxePivotArea): PanelArea {\r\n const engine = this.engine();\r\n const chips = (engine ? engine.areaFields(group) : []).map(({ fieldIndex, field }) =>\r\n buildChip(fieldIndex, field, group, this.allowSorting(), this.allowFiltering()),\r\n );\r\n return { group, chips, emptyText: EMPTY_AREA_TEXTS[group] };\r\n }\r\n\r\n /** Hit-test root: the whole pivot — the row area lives in the cross-tab corner cell. */\r\n private dragRoot(): HTMLElement {\r\n const host = this.elementRef.nativeElement as HTMLElement;\r\n return (host.closest('nxe-pivot-grid') as HTMLElement | null) ?? host;\r\n }\r\n\r\n /**\r\n * Drop zones. For filter/data/column the fields-area element is both hit rect and highlight\r\n * target; for ROW the enclosing corner cell (`th.nxe-area-description-cell`) is — dx's row\r\n * area IS the corner, so a drop anywhere on it must land in rows, not read as \"outside\".\r\n */\r\n private dropZones(): { group: NxePivotArea; hitEl: HTMLElement; areaEl: HTMLElement }[] {\r\n return Array.from(\r\n this.dragRoot().querySelectorAll<HTMLElement>('.nxe-pivotgrid-fields-area[group]'),\r\n ).map((areaEl) => {\r\n const group = areaEl.getAttribute('group') as NxePivotArea;\r\n const corner =\r\n group === 'row'\r\n ? (areaEl.closest('th.nxe-area-description-cell') as HTMLElement | null)\r\n : null;\r\n return { group, hitEl: corner ?? areaEl, areaEl };\r\n });\r\n }\r\n\r\n private trackPointer(x: number, y: number): void {\r\n const d = this.drag;\r\n if (!d) {\r\n return;\r\n }\r\n const hit =\r\n this.dropZones().find(({ hitEl }) => {\r\n const r = hitEl.getBoundingClientRect();\r\n return x >= r.left && x <= r.right && y >= r.top && y <= r.bottom;\r\n }) ?? null;\r\n if (d.targetEl && d.targetEl !== hit?.hitEl) {\r\n d.targetEl.classList.remove('nxe-drag-target');\r\n }\r\n if (!hit) {\r\n // Outside every area: no drop target — releasing here is a snap-back NO-OP\r\n // (dx m_sortable's end handler fires onChanged only inside a target group).\r\n d.targetArea = null;\r\n d.slot = null;\r\n d.targetEl = null;\r\n d.indicator?.remove();\r\n d.indicator = null;\r\n return;\r\n }\r\n hit.hitEl.classList.add('nxe-drag-target');\r\n d.targetEl = hit.hitEl;\r\n d.targetArea = hit.group;\r\n const chips = Array.from(\r\n hit.areaEl.querySelectorAll<HTMLElement>('.nxe-area-field.nxe-area-box'),\r\n );\r\n let slot = 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 slot = i;\r\n break;\r\n }\r\n }\r\n d.slot = slot;\r\n this.placeIndicator(d, hit.areaEl, chips, slot);\r\n }\r\n\r\n /** dx `.nxe-position-indicator`: a 2px gray bar between chips, inside the (positioned) area. */\r\n private placeIndicator(\r\n d: NonNullable<typeof this.drag>,\r\n areaEl: HTMLElement,\r\n chips: HTMLElement[],\r\n slot: number,\r\n ): void {\r\n if (!chips.length) {\r\n // Empty area: the dx-drag-target state marks the whole area; no bar to place.\r\n d.indicator?.remove();\r\n d.indicator = null;\r\n return;\r\n }\r\n if (!d.indicator) {\r\n d.indicator = document.createElement('div');\r\n }\r\n const last = slot >= chips.length;\r\n d.indicator.className =\r\n 'nxe-position-indicator nxe-position-indicator-horizontal' +\r\n (last ? ' nxe-position-indicator-last' : '');\r\n const areaRect = areaEl.getBoundingClientRect();\r\n const ref = last ? chips[chips.length - 1] : chips[slot];\r\n const refRect = ref.getBoundingClientRect();\r\n d.indicator.style.position = 'absolute';\r\n d.indicator.style.left = `${(last ? refRect.right : refRect.left) - areaRect.left}px`;\r\n d.indicator.style.top = `${refRect.top - areaRect.top}px`;\r\n d.indicator.style.height = `${refRect.height}px`;\r\n if (d.indicator.parentElement !== areaEl) {\r\n areaEl.appendChild(d.indicator);\r\n }\r\n }\r\n\r\n private completeDrop(): void {\r\n const d = this.drag;\r\n if (!d) {\r\n return;\r\n }\r\n if (d.targetArea === null) {\r\n // Released outside every area — dx m_sortable never fires onChanged without a\r\n // target group, so the chip snaps back and NOTHING is emitted (removal exists\r\n // only in the chooser: its All-Fields tree drop / checkbox uncheck).\r\n return;\r\n }\r\n let slot = d.slot ?? 0;\r\n if (d.targetArea === d.fromArea) {\r\n const pos =\r\n this.engine()\r\n ?.areaFields(d.fromArea)\r\n .findIndex(({ fieldIndex }) => fieldIndex === d.chip.fieldIndex) ?? -1;\r\n if (pos >= 0 && slot > pos) {\r\n slot -= 1; // removing the chip first shifts the insertion slot left\r\n }\r\n if (slot === pos) {\r\n return; // dropped back onto its own position — no-op\r\n }\r\n }\r\n this.fieldMove.emit({ fieldIndex: d.chip.fieldIndex, area: d.targetArea, areaIndex: slot });\r\n }\r\n}\r\n","<!-- Area subtree mirrors fixtures/fields-panel.html verbatim: .dx-pivotgrid-fields-area >\r\n table.dx-area-field-container > colgroup + thead.dx-pivotgrid-fields-area-head > tr > td\r\n chips (.dx-area-field.dx-area-box > .dx-area-field-content) / .dx-empty-area-text.\r\n The row area carries dx's inline width:100% (fixture line for group=\"row\"). -->\r\n<ng-template #areaTpl let-area=\"area\">\r\n <div\r\n class=\"nxe-pivotgrid-fields-area nxe-area-fields\"\r\n [class.nxe-pivotgrid-drag-action]=\"allowFieldDragging()\"\r\n [style.width]=\"area.group === 'row' ? '100%' : null\"\r\n [attr.group]=\"area.group\">\r\n <table class=\"nxe-area-field-container\">\r\n <colgroup></colgroup>\r\n <thead class=\"nxe-pivotgrid-fields-area-head\">\r\n <tr>\r\n @if (area.chips.length === 0) {\r\n <td><div class=\"nxe-empty-area-text\">{{ area.emptyText }}</div></td>\r\n } @else {\r\n @for (chip of area.chips; track chip.fieldIndex) {\r\n <!-- Chip subtree lives in the SHARED NxePivotFieldChipComponent (P3-C3) — the\r\n chooser renders the identical chips; the host div here keeps the fixture's\r\n exact .dx-area-field.dx-area-box classes. dx renders panel chips with\r\n showColumnLines = (area is row) (m_fields_area.js:120): only the ROW chips\r\n float their indicators right; the other bands append them inline. -->\r\n <td>\r\n <div\r\n nxePivotFieldChip\r\n [chip]=\"chip\"\r\n [floatIndicators]=\"area.group === 'row'\"\r\n (chipPointerDown)=\"onChipPointerDown(chip, area.group, $event)\"\r\n (chipClick)=\"onChipClick(chip)\"\r\n (chipFilterClick)=\"onChipFilterClick(chip, $event)\"></div>\r\n </td>\r\n }\r\n }\r\n </tr>\r\n </thead>\r\n </table>\r\n </div>\r\n</ng-template>\r\n\r\n<!-- The ROW fields area is NOT a band here: dx hosts it inside the cross-tab's corner\r\n `.dx-area-description-cell` (oracle §c \"hosts the ROW field chips\", initial-full-page.png)\r\n — NxePivotGridComponent outlets this template into its corner cell. -->\r\n<ng-template #rowAreaTpl>\r\n @if (showRowFields()) {\r\n <ng-container *ngTemplateOutlet=\"areaTpl; context: { area: rowArea() }\" />\r\n }\r\n</ng-template>\r\n\r\n<!-- dx main-table area cells (ORACLE.md §d): filter header strip, then data + column header\r\n cells. With showBorders the bands sit INSIDE the widget border (dx .dx-pivotgrid-border\r\n draws top/left/right on these band cells). -->\r\n@if (showFilterFields() || showDataFields() || showColumnFields()) {\r\n <table class=\"nxe-pivot-field-panel-table\" [class.nxe-panel-bordered]=\"showBorders()\">\r\n <tbody>\r\n @if (showFilterFields()) {\r\n <tr>\r\n <td class=\"nxe-filter-header\" colspan=\"2\">\r\n <!-- P3-C3: the pivot's `.dx-pivotgrid-toolbar` (field-chooser button) — dx PREPENDS\r\n the toolbar to this cell and floats it right (oracle §c; m_widget.js\r\n `$toolbarContainer.prependTo($targetContainer)` + dx.light float:right). -->\r\n @if (toolbarArea() === 'filter' && toolbarTemplate(); as tb) {\r\n <ng-container *ngTemplateOutlet=\"tb\" />\r\n }\r\n <ng-container *ngTemplateOutlet=\"areaTpl; context: { area: filterArea() }\" />\r\n </td>\r\n </tr>\r\n }\r\n @if (showDataFields() || showColumnFields()) {\r\n <tr>\r\n @if (showDataFields()) {\r\n <td class=\"nxe-data-header\" [attr.colspan]=\"showColumnFields() || columnToolbar() ? null : 2\">\r\n <ng-container *ngTemplateOutlet=\"areaTpl; context: { area: dataArea() }\" />\r\n </td>\r\n }\r\n @if (showColumnFields() || columnToolbar()) {\r\n <!-- dx's middle toolbar branch (m_widget.js): with the filter band off, the\r\n toolbar prepends into the always-present $columnHeader cell — rendered here\r\n even when showColumnFields is off (the cell then holds only the toolbar). -->\r\n <td class=\"nxe-column-header\" [attr.colspan]=\"showDataFields() ? null : 2\">\r\n @if (columnToolbar() && toolbarTemplate(); as tb) {\r\n <ng-container *ngTemplateOutlet=\"tb\" />\r\n }\r\n @if (showColumnFields()) {\r\n <ng-container *ngTemplateOutlet=\"areaTpl; context: { area: columnArea() }\" />\r\n }\r\n </td>\r\n }\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n}\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\n// nxe-pivot-field-chooser — the dx field chooser popup (dxo-field-chooser), P3-C3. Renders the\r\n// popup CONTENT the pivot opens in a CDK overlay: dx popup title bar (\"Field Chooser\" + close X,\r\n// dxPivotGrid fieldChooser defaults, m_widget.js `_renderFieldChooser`) over the exact\r\n// `.nxe-pivotgridfieldchooser` DOM harvested from the live broker\r\n// (tools/visual-parity/reference/pivot/fixtures/field-chooser.html): layout 0 = two `.nxe-row`s\r\n// of two `.nxe-col`s — [All Fields tree | Row+Column areas] over [Filter | Data]\r\n// (m_field_chooser.js `_renderLayout0`). Chips reuse the panel's shared\r\n// NxePivotFieldChipComponent; the All Fields tree mirrors the fixture's dx-treeview markup\r\n// (flat leaves — the app's local fields have no dimension/displayFolder groups).\r\n//\r\n// applyChangesMode 'instantly' (the dx default — ORACLE.md §c: NO OK/Cancel toolbar): every\r\n// mutation emits immediately and the pivot writes the same fieldOverride map the field panel\r\n// writes, so the cross-tab, panel chips, chooser chips and tree checkmarks all update live.\r\n//\r\n// Area-assignment rules transcribed from DevExtreme 24.2.3 sources (curl'd from unpkg,\r\n// cjs/__internal/grids/pivot_grid/field_chooser/):\r\n// - CHECK a tree item (m_field_chooser.js `onItemSelectionChanged`):\r\n// `area = field.isMeasure ? \"data\" : \"column\"` with `areaIndex: undefined`, which\r\n// normalizeIndexes (core/utils/m_array.js) resolves to the END of the target area.\r\n// Local-store fields never carry `isMeasure`, so a string dimension AND a re-checked\r\n// measure both land in the COLUMN area — the ORACLE.md surprise #1, pinned in the spec.\r\n// - UNCHECK: `_applyChanges(fields, {area: undefined})` — the area is CLEARED; the field\r\n// leaves the layout but stays defined (and re-checkable). Mapped to the pivot's\r\n// `area: null` override, exactly like a chip dragged off the panel.\r\n// - DRAG between chooser areas (m_field_chooser_base.js `renderSortable.onDragging`):\r\n// `isMeasure === true` may ONLY drop in data; `isMeasure === false` may drop anywhere BUT\r\n// data; undefined = unrestricted. A drop on a forbidden area is dx `e.cancel` — a NO-OP\r\n// (never a remove). Chooser dragging is ALWAYS enabled: the pivot forwards no\r\n// allowFieldDragging to the popup chooser (m_widget.js `fieldChooserComponentOptions`),\r\n// so FieldChooserBase's own default (true) applies regardless of fieldPanel settings.\r\n// - DROP targets (sortable/m_sortable.js `getTargetGroup` + the drag-end handler's\r\n// `if ($targetGroup)` guard): onChanged fires ONLY when the release lands inside a\r\n// group's `.nxe-area-fields` box. The All-Fields TREE box is a group WITHOUT a `group`\r\n// attr, so a drop there resolves `targetGroup` undefined -> `_applyChanges({area:\r\n// undefined})` = the one drag-remove path (with the dx-drag-target hover highlight,\r\n// like any group). A release anywhere else — title bar, captions, paddings, outside\r\n// the popup — fires nothing: the chip snaps back.\r\n// - Tree order (m_field_chooser.js `compareItems`): with no groups/hierarchies and no\r\n// `isMeasure`, plain `>`/`<` text comparison on the caption (m_widget_utils\r\n// `getCompareFunction`) — the fixture's alphabetical list.\r\n//\r\n// Geometry (oracle/chooser-probe.json vs config height 400): dx applies fieldChooser\r\n// width/height to the popup's `.nxe-overlay-content` BOX — 600x400 with 1px borders. Inside:\r\n// the 49px title bar (6px padding x2 + 36px toolbar row + 1px rule) and the remaining 349px\r\n// `.nxe-popup-content.nxe-pivotgridfieldchooser` (20px padding -> dx stamps inline height:309px;\r\n// here flexbox yields the same box). 598x349 measured = 600x400 minus borders minus title.\r\n//\r\n// Known deviations (DEFAULTS.md, P3-C3 rows): no popup drag/resize; no cross-widget drag\r\n// between the open chooser and the panel behind it (dx sortables share a group per data\r\n// source — here a release over the panel behind is \"outside\" and snaps back); tree leaves\r\n// add via checkbox only. dx-true (NOT deviations): no backdrop — an outside click neither\r\n// closes nor blocks, the pivot behind stays interactive (dx shading:false +\r\n// hideOnOutsideClick:false); close via title-bar X or Escape only.\r\n\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n ElementRef,\r\n inject,\r\n input,\r\n NgZone,\r\n OnDestroy,\r\n output,\r\n signal,\r\n Signal,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { NgTemplateOutlet } from '@angular/common';\r\nimport { NxeDragGesture } from '@nexterajs/ui/grid';\r\nimport { NxePivotDataSource } from './nxe-pivot-data-source';\r\nimport { NxePivotFieldChipComponent } from './nxe-pivot-field-chip.component';\r\nimport {\r\n buildChip,\r\n NxePivotFieldMoveEvent,\r\n NxePivotFilterOpenEvent,\r\n NxePivotPanelChip,\r\n} from './nxe-pivot-field-panel.component';\r\nimport { NxePivotArea, NxePivotField } from './nxe-pivot.types';\r\n\r\n/** dx fieldChooser texts defaults (m_field_chooser.js `_getDefaultOptions` messages). */\r\nconst CHOOSER_TEXTS = {\r\n allFields: 'All Fields',\r\n rowFields: 'Row Fields',\r\n columnFields: 'Column Fields',\r\n filterFields: 'Filter Fields',\r\n dataFields: 'Data Fields',\r\n title: 'Field Chooser',\r\n};\r\n\r\n/** dx `_renderArea` icon names per area (m_field_chooser const.ICONS). */\r\nconst AREA_ICONS: Record<'all' | NxePivotArea, string> = {\r\n all: 'smalliconslayout',\r\n row: 'rowfield',\r\n column: 'columnfield',\r\n filter: 'filter',\r\n data: 'formula',\r\n};\r\n\r\n/** One All-Fields tree row (the fixture's flat leaf list — local fields have no groups). */\r\ninterface ChooserTreeItem {\r\n fieldIndex: number;\r\n caption: string;\r\n selected: boolean;\r\n isMeasure: boolean | undefined;\r\n}\r\n\r\ninterface ChooserArea {\r\n group: NxePivotArea;\r\n caption: string;\r\n icon: string;\r\n chips: NxePivotPanelChip[];\r\n}\r\n\r\n@Component({\r\n selector: 'nxe-pivot-field-chooser',\r\n standalone: true,\r\n imports: [NgTemplateOutlet, NxePivotFieldChipComponent],\r\n templateUrl: './nxe-pivot-field-chooser.component.html',\r\n styleUrl: './nxe-pivot-field-chooser.component.scss',\r\n // The host plays dx's `.nxe-fieldchooser-popup` popup-root role inside the CDK pane; the\r\n // `.nxe-overlay-content` box + title + content live in the template.\r\n host: { class: 'nxe-widget nxe-pivot-field-chooser-popup nxe-fieldchooser-popup' },\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class NxePivotFieldChooserComponent implements OnDestroy {\r\n /** The pivot's LIVE engine signal (overrides merged) — instant applies re-read it here. */\r\n readonly engine = input.required<Signal<NxePivotDataSource | null>>();\r\n /** dx `fieldChooser.width`/`height` — applied to the popup box; dxPivotGrid defaults 600\r\n * (m_widget.js `fieldChooser` defaults; the DA page passes height 400). */\r\n readonly width = input<number | undefined>(undefined);\r\n readonly height = input<number | undefined>(undefined);\r\n /** dx `fieldChooser.allowSearch` (default false — the capture has NO search box). */\r\n readonly allowSearch = input(false);\r\n /** Widget `allowSorting`: dimension chips inside the chooser sort on click, same as the\r\n * panel's (dx stamps the widget flag onto every field; data chips never sort). */\r\n readonly allowSorting = input(false);\r\n /** Widget `allowFiltering` (P3-C4): dimension chips inside the chooser carry the same\r\n * header-filter funnel as the panel's (dx renderField is FieldChooserBase machinery —\r\n * shared by both surfaces). Same per-field precedence as `allowSorting`. */\r\n readonly allowFiltering = input(false);\r\n\r\n /** Every chooser mutation (checkbox toggle, drag between areas) — the pivot feeds these\r\n * through the SAME `onPanelFieldMove` renumbering the field panel uses. */\r\n readonly fieldMove = output<NxePivotFieldMoveEvent>();\r\n /** A sortable chip inside the chooser was clicked. */\r\n readonly sortToggle = output<{ fieldIndex: number }>();\r\n /** A chip's funnel was clicked — the pivot opens the header-filter panel (P3-C4). */\r\n readonly filterOpen = output<NxePivotFilterOpenEvent>();\r\n /** The title-bar X — the pivot disposes the overlay (Escape/backdrop close there too). */\r\n readonly closed = output<void>();\r\n\r\n protected readonly texts = CHOOSER_TEXTS;\r\n protected readonly allIcon = AREA_ICONS.all;\r\n protected readonly searchText = signal('');\r\n\r\n private readonly elementRef = inject(ElementRef<HTMLElement>);\r\n private readonly zone = inject(NgZone);\r\n\r\n /** Popup box size — dx puts fieldChooser.width/height on `.nxe-overlay-content` (600 dflt). */\r\n protected readonly boxWidth = computed(() => `${this.width() ?? 600}px`);\r\n protected readonly boxHeight = computed(() => `${this.height() ?? 600}px`);\r\n\r\n /**\r\n * All Fields tree rows: every defined `visible !== false` field (m_field_chooser.js\r\n * `_createFieldsDataSource`), checked when it HAS an area (`selected: isDefined(field.area)`),\r\n * ordered by dx `compareItems` — plain text comparison here (no groups, no isMeasure).\r\n */\r\n protected readonly treeItems = computed<ChooserTreeItem[]>(() => {\r\n const engine = this.engine()();\r\n if (!engine) {\r\n return [];\r\n }\r\n const query = this.searchText().trim().toLowerCase();\r\n return engine\r\n .fields()\r\n .map((_, fieldIndex) => ({ fieldIndex, field: engine.fieldAt(fieldIndex)! }))\r\n .filter(({ field }) => field.visible !== false)\r\n .map(({ fieldIndex, field }) => ({\r\n fieldIndex,\r\n caption: field.caption ?? field.dataField ?? '',\r\n selected: field.area != null,\r\n isMeasure: field.isMeasure as boolean | undefined,\r\n }))\r\n .filter((item) => !query || item.caption.toLowerCase().includes(query))\r\n .sort((a, b) => {\r\n // compareOrder[0] (measure buckets) — 0 for the app's isMeasure-less fields.\r\n const measure = -(a.isMeasure === true ? 1 : 0) + (b.isMeasure === true ? 1 : 0);\r\n if (measure) {\r\n return measure;\r\n }\r\n // getCompareFunction(item => item.text): plain >/< comparison, no locale.\r\n return a.caption > b.caption ? 1 : a.caption < b.caption ? -1 : 0;\r\n });\r\n });\r\n\r\n protected readonly rowArea = computed(() => this.buildArea('row'));\r\n protected readonly columnArea = computed(() => this.buildArea('column'));\r\n protected readonly filterArea = computed(() => this.buildArea('filter'));\r\n protected readonly dataArea = computed(() => this.buildArea('data'));\r\n\r\n // --- Checkbox rules (transcribed — see header) ---------------------------------------------\r\n\r\n protected onCheckboxClick(item: ChooserTreeItem): void {\r\n const engine = this.engine()();\r\n if (!engine) {\r\n return;\r\n }\r\n if (item.selected) {\r\n // dx UNCHECK: `{area: undefined}` — the field leaves the layout, stays defined.\r\n this.fieldMove.emit({ fieldIndex: item.fieldIndex, area: null, areaIndex: 0 });\r\n return;\r\n }\r\n // dx CHECK: `area = field.isMeasure ? \"data\" : \"column\"` (m_field_chooser.js) with\r\n // areaIndex undefined -> normalizeIndexes appends at the END of the target area.\r\n const area: NxePivotArea = item.isMeasure === true ? 'data' : 'column';\r\n this.fieldMove.emit({\r\n fieldIndex: item.fieldIndex,\r\n area,\r\n areaIndex: engine.areaFields(area).length,\r\n });\r\n }\r\n\r\n protected onSearchInput(event: Event): void {\r\n this.searchText.set((event.target as HTMLInputElement).value);\r\n }\r\n\r\n // --- Chip clicks (sort) --------------------------------------------------------------------\r\n\r\n protected onChipClick(chip: NxePivotPanelChip): void {\r\n if (this.gesture.consumeClick()) {\r\n return;\r\n }\r\n if (!chip.sortable) {\r\n return;\r\n }\r\n this.sortToggle.emit({ fieldIndex: chip.fieldIndex });\r\n }\r\n\r\n protected onChipFilterClick(chip: NxePivotPanelChip, event: MouseEvent): void {\r\n if (this.gesture.consumeClick()) {\r\n return; // a drag released over the funnel must not also open the popup\r\n }\r\n const origin =\r\n (event.target as HTMLElement | null)?.closest<HTMLElement>('.nxe-area-field') ??\r\n (event.target as HTMLElement);\r\n this.filterOpen.emit({ fieldIndex: chip.fieldIndex, origin });\r\n }\r\n\r\n // --- Dragging between chooser areas --------------------------------------------------------\r\n // Chips stack VERTICALLY here (unlike the panel's horizontal bands): slots hit-test on the\r\n // Y midpoint and the insertion mark is dx's `.nxe-position-indicator-vertical` 2px bar.\r\n // Drop targets are dx m_sortable's groups — the four `[group]` fields boxes AND the\r\n // All-Fields tree box (a group WITHOUT a `group` attr, so a drop there resolves to\r\n // `area: undefined` = REMOVE, with the same dx-drag-target hover highlight). A release\r\n // anywhere else (title bar, captions, paddings, outside the popup) fires NO change at\r\n // all — dx's end handler runs onChanged only inside a target group, so the chip snaps\r\n // back (corrected in review: the first cut treated outside as removal).\r\n\r\n private drag: {\r\n chip: NxePivotPanelChip;\r\n fromArea: NxePivotArea;\r\n field: NxePivotField | undefined;\r\n targetArea: NxePivotArea | null;\r\n /** Hovering the All-Fields tree box — dx's remove zone (targetGroup without `group`). */\r\n overTree: boolean;\r\n /** True while hovering an area the dx isMeasure rules forbid (drop = no-op there). */\r\n invalid: boolean;\r\n slot: number | null;\r\n targetEl: HTMLElement | null;\r\n indicator: HTMLElement | null;\r\n } | null = null;\r\n\r\n private readonly gesture = new NxeDragGesture(this.zone, {\r\n createGhost: () => {\r\n const ghost = document.createElement('div');\r\n ghost.className =\r\n 'nxe-widget nxe-pivotgrid-fields-container nxe-drag nxe-pivot-drag-ghost';\r\n const chip = document.createElement('div');\r\n chip.className = 'nxe-area-field nxe-area-box';\r\n const content = document.createElement('div');\r\n content.className = 'nxe-area-field-content';\r\n content.textContent = this.drag?.chip.caption ?? '';\r\n chip.appendChild(content);\r\n ghost.appendChild(chip);\r\n return ghost;\r\n },\r\n sourceDragClasses: ['nxe-drag-source'],\r\n dragMove: (x, y) => this.trackPointer(x, y),\r\n drop: () => this.completeDrop(),\r\n clearDropVisuals: () => {\r\n const d = this.drag;\r\n d?.indicator?.remove();\r\n if (d) {\r\n d.indicator = null;\r\n d.targetEl = null;\r\n }\r\n this.host()\r\n .querySelectorAll('.nxe-drag-target')\r\n .forEach((el) => el.classList.remove('nxe-drag-target'));\r\n },\r\n reset: () => {\r\n this.drag = null;\r\n },\r\n });\r\n\r\n ngOnDestroy(): void {\r\n this.gesture.destroy();\r\n }\r\n\r\n protected onChipPointerDown(chip: NxePivotPanelChip, area: NxePivotArea, event: PointerEvent): void {\r\n // Chooser dragging is ALWAYS enabled (dx: the popup chooser keeps FieldChooserBase's\r\n // allowFieldDragging default true — the pivot forwards no flag).\r\n if (!this.gesture.begin(event)) {\r\n return;\r\n }\r\n this.drag = {\r\n chip,\r\n fromArea: area,\r\n field: this.engine()()?.fieldAt(chip.fieldIndex),\r\n targetArea: null,\r\n overTree: false,\r\n invalid: false,\r\n slot: null,\r\n targetEl: null,\r\n indicator: null,\r\n };\r\n }\r\n\r\n private buildArea(group: NxePivotArea): ChooserArea {\r\n const engine = this.engine()();\r\n const chips = (engine ? engine.areaFields(group) : []).map(({ fieldIndex, field }) =>\r\n buildChip(fieldIndex, field, group, this.allowSorting(), this.allowFiltering()),\r\n );\r\n return {\r\n group,\r\n caption: CHOOSER_TEXTS[`${group}Fields`],\r\n icon: AREA_ICONS[group],\r\n chips,\r\n };\r\n }\r\n\r\n private host(): HTMLElement {\r\n return this.elementRef.nativeElement as HTMLElement;\r\n }\r\n\r\n /**\r\n * dx m_field_chooser_base.js `renderSortable.onDragging` cancel rules: a true measure may\r\n * only sit in data; an explicit non-measure never in data; undefined = unrestricted.\r\n */\r\n private allowedIn(field: NxePivotField | undefined, area: NxePivotArea): boolean {\r\n if (field?.isMeasure === true) {\r\n return area === 'data';\r\n }\r\n if (field?.isMeasure === false) {\r\n return area !== 'data';\r\n }\r\n return true;\r\n }\r\n\r\n private trackPointer(x: number, y: number): void {\r\n const d = this.drag;\r\n if (!d) {\r\n return;\r\n }\r\n const inRect = (el: HTMLElement): boolean => {\r\n const r = el.getBoundingClientRect();\r\n return x >= r.left && x <= r.right && y >= r.top && y <= r.bottom;\r\n };\r\n const zones = Array.from(\r\n this.host().querySelectorAll<HTMLElement>('.nxe-area-fields[group]'),\r\n );\r\n const hitEl = zones.find(inRect) ?? null;\r\n if (d.targetEl && d.targetEl !== hitEl) {\r\n d.targetEl.classList.remove('nxe-drag-target');\r\n d.targetEl = null;\r\n }\r\n if (!hitEl) {\r\n d.targetArea = null;\r\n d.invalid = false;\r\n d.slot = null;\r\n d.indicator?.remove();\r\n d.indicator = null;\r\n // The All-Fields tree box is dx's REMOVE zone (a sortable group without a\r\n // `group` attr) and gets the same hover highlight as any target group.\r\n const treeEl = this.host().querySelector<HTMLElement>('.nxe-all-fields .nxe-area-fields');\r\n if (treeEl && inRect(treeEl)) {\r\n treeEl.classList.add('nxe-drag-target');\r\n d.targetEl = treeEl;\r\n d.overTree = true;\r\n return;\r\n }\r\n // Anywhere else: no target group — the release will be a snap-back NO-OP.\r\n d.overTree = false;\r\n return;\r\n }\r\n d.overTree = false;\r\n const group = hitEl.getAttribute('group') as NxePivotArea;\r\n if (!this.allowedIn(d.field, group)) {\r\n // dx `e.cancel = true`: no highlight, no indicator, and the drop is a NO-OP.\r\n d.targetArea = null;\r\n d.invalid = true;\r\n d.slot = null;\r\n d.targetEl = null;\r\n d.indicator?.remove();\r\n d.indicator = null;\r\n return;\r\n }\r\n hitEl.classList.add('nxe-drag-target');\r\n d.targetEl = hitEl;\r\n d.targetArea = group;\r\n d.invalid = false;\r\n const chips = Array.from(\r\n hitEl.querySelectorAll<HTMLElement>('.nxe-area-field.nxe-area-box'),\r\n );\r\n let slot = chips.length;\r\n for (let i = 0; i < chips.length; i++) {\r\n const r = chips[i].getBoundingClientRect();\r\n if (y < r.top + r.height / 2) {\r\n slot = i;\r\n break;\r\n }\r\n }\r\n d.slot = slot;\r\n this.placeIndicator(d, hitEl, chips, slot);\r\n }\r\n\r\n /** dx `.nxe-position-indicator-vertical`: a 2px bar between the stacked chips. */\r\n private placeIndicator(\r\n d: NonNullable<typeof this.drag>,\r\n areaEl: HTMLElement,\r\n chips: HTMLElement[],\r\n slot: number,\r\n ): void {\r\n if (!chips.length) {\r\n d.indicator?.remove();\r\n d.indicator = null;\r\n return;\r\n }\r\n if (!d.indicator) {\r\n d.indicator = document.createElement('div');\r\n }\r\n const last = slot >= chips.length;\r\n d.indicator.className =\r\n 'nxe-position-indicator nxe-position-indicator-vertical' +\r\n (last ? ' nxe-position-indicator-last' : '');\r\n const areaRect = areaEl.getBoundingClientRect();\r\n const ref = last ? chips[chips.length - 1] : chips[slot];\r\n const refRect = ref.getBoundingClientRect();\r\n d.indicator.style.position = 'absolute';\r\n d.indicator.style.left = `${refRect.left - areaRect.left}px`;\r\n d.indicator.style.top = `${(last ? refRect.bottom : refRect.top) - areaRect.top}px`;\r\n d.indicator.style.width = `${refRect.width}px`;\r\n if (d.indicator.parentElement !== areaEl) {\r\n areaEl.appendChild(d.indicator);\r\n }\r\n }\r\n\r\n private completeDrop(): void {\r\n const d = this.drag;\r\n if (!d) {\r\n return;\r\n }\r\n if (d.invalid) {\r\n return; // dx cancel: released over a forbidden area — nothing happens\r\n }\r\n if (d.overTree) {\r\n // Dropped on the All-Fields tree — dx's only drag-remove path: the targetGroup\r\n // has no `group` attr, so _applyChanges clears the area (same as unchecking).\r\n this.fieldMove.emit({ fieldIndex: d.chip.fieldIndex, area: null, areaIndex: 0 });\r\n return;\r\n }\r\n if (d.targetArea === null) {\r\n // Released outside every group (title bar, captions, outside the popup): dx's\r\n // end handler fires no onChanged — the chip snaps back, nothing changes.\r\n return;\r\n }\r\n let slot = d.slot ?? 0;\r\n if (d.targetArea === d.fromArea) {\r\n const pos =\r\n this.engine()()\r\n ?.areaFields(d.fromArea)\r\n .findIndex(({ fieldIndex }) => fieldIndex === d.chip.fieldIndex) ?? -1;\r\n if (pos >= 0 && slot > pos) {\r\n slot -= 1;\r\n }\r\n if (slot === pos) {\r\n return;\r\n }\r\n }\r\n this.fieldMove.emit({ fieldIndex: d.chip.fieldIndex, area: d.targetArea, areaIndex: slot });\r\n }\r\n}\r\n","<!-- dx popup box: fieldChooser width/height land on `.dx-overlay-content` (m_widget.js popup\r\n options; 600x400 -> 598x349 content once the 1px borders + 49px title bar are taken out —\r\n oracle/chooser-probe.json reconciliation in the component header). Title bar per the\r\n full-page capture: \"Field Chooser\" left, X right, 1px rule beneath, popup centered. -->\r\n<div\r\n class=\"nxe-overlay-content nxe-popup-normal\"\r\n [style.width]=\"boxWidth()\"\r\n [style.height]=\"boxHeight()\">\r\n <div class=\"nxe-popup-title nxe-has-close-button\">\r\n <span class=\"nxe-toolbar-label\">{{ texts.title }}</span>\r\n <span\r\n class=\"nxe-closebutton\"\r\n role=\"button\"\r\n tabindex=\"0\"\r\n aria-label=\"Close\"\r\n (click)=\"closed.emit()\"\r\n (keydown.enter)=\"closed.emit()\"></span>\r\n </div>\r\n\r\n <!-- fixtures/field-chooser.html verbatim from here down: the chooser root carries\r\n dx-popup-content + dx-pivotgridfieldchooser + dx-pivotgrid-fields-container (the class\r\n that arms the shared chip chrome, nxe-pivot-field-chip), then layout 0's two rows. -->\r\n <div class=\"nxe-popup-content nxe-widget nxe-pivotgridfieldchooser nxe-pivotgrid-fields-container\">\r\n <div class=\"nxe-pivotgridfieldchooser-container nxe-layout-0\">\r\n <div class=\"nxe-row\">\r\n <div class=\"nxe-col\">\r\n <!-- All Fields: dx-treeview of EVERY defined field, checkbox = has an area. -->\r\n <div class=\"nxe-area nxe-all-fields\">\r\n <div class=\"nxe-area-fields-header\">\r\n <span class=\"nxe-area-icon nxe-icon-{{ allIcon }}\"></span><span> </span><span class=\"nxe-area-caption\">{{ texts.allFields }}</span>\r\n </div>\r\n <div\r\n class=\"nxe-area-fields nxe-pivotgrid-drag-action nxe-treeview-border-visible nxe-widget nxe-collection nxe-treeview\"\r\n tabindex=\"0\"\r\n role=\"tree\">\r\n @if (allowSearch()) {\r\n <!-- dx allowSearch: the treeview search editor (dx margin:5px, in the scss);\r\n default FALSE — the broker capture has no search box (oracle §c). -->\r\n <div class=\"nxe-treeview-search nxe-texteditor nxe-searchbox\">\r\n <input\r\n class=\"nxe-texteditor-input\"\r\n type=\"text\"\r\n placeholder=\"Search\"\r\n [value]=\"searchText()\"\r\n (input)=\"onSearchInput($event)\" />\r\n </div>\r\n }\r\n <div class=\"nxe-scrollable nxe-scrollable-vertical\">\r\n <div class=\"nxe-scrollable-wrapper\">\r\n <div class=\"nxe-scrollable-container\">\r\n <div class=\"nxe-scrollable-content\">\r\n <ul class=\"nxe-treeview-node-container\" role=\"group\">\r\n @for (item of treeItems(); track item.fieldIndex) {\r\n <li\r\n class=\"nxe-treeview-node nxe-treeview-item-with-checkbox nxe-treeview-root-node nxe-treeview-node-is-leaf\"\r\n [class.nxe-state-selected]=\"item.selected\"\r\n [attr.data-item-id]=\"$index + 1\"\r\n role=\"treeitem\"\r\n [attr.aria-label]=\"item.caption\"\r\n aria-level=\"1\"\r\n [attr.aria-selected]=\"item.selected\">\r\n <div class=\"nxe-item nxe-treeview-item\">\r\n <div class=\"nxe-item-content nxe-treeview-item-content\">\r\n <div class=\"nxe-area-field\" tree-view-item=\"true\"><span>{{ item.caption }}</span></div>\r\n </div>\r\n <div\r\n class=\"nxe-widget nxe-checkbox\"\r\n [class.nxe-checkbox-checked]=\"item.selected\"\r\n role=\"checkbox\"\r\n tabindex=\"0\"\r\n [attr.aria-checked]=\"item.selected\"\r\n aria-label=\"Check state\"\r\n (click)=\"onCheckboxClick(item)\"\r\n (keydown.space)=\"onCheckboxClick(item)\">\r\n <input type=\"hidden\" [value]=\"item.selected\" />\r\n <div class=\"nxe-checkbox-container\"><span class=\"nxe-checkbox-icon\"></span></div>\r\n </div>\r\n <div class=\"nxe-treeview-expander-icon-stub\"></div>\r\n </div>\r\n </li>\r\n }\r\n </ul>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"nxe-col\">\r\n <ng-container *ngTemplateOutlet=\"areaTpl; context: { area: rowArea() }\" />\r\n <ng-container *ngTemplateOutlet=\"areaTpl; context: { area: columnArea() }\" />\r\n </div>\r\n </div>\r\n <div class=\"nxe-row\">\r\n <div class=\"nxe-col\">\r\n <ng-container *ngTemplateOutlet=\"areaTpl; context: { area: filterArea() }\" />\r\n </div>\r\n <div class=\"nxe-col\">\r\n <ng-container *ngTemplateOutlet=\"areaTpl; context: { area: dataArea() }\" />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!-- One group area (dx `_renderArea`): header (icon + caption), then the bordered fields box\r\n with the stacked chips. An EMPTY area shows nothing — the chooser has no\r\n \"Drop … Fields Here\" strings (fixture: the filter area's field container is empty). -->\r\n<ng-template #areaTpl let-area=\"area\">\r\n <div class=\"nxe-area\">\r\n <div class=\"nxe-area-fields-header\">\r\n <span class=\"nxe-area-icon nxe-icon-{{ area.icon }}\"></span><span> </span><span class=\"nxe-area-caption\">{{ area.caption }}</span>\r\n </div>\r\n <div\r\n class=\"nxe-area-fields nxe-pivotgrid-drag-action nxe-scrollable nxe-scrollable-vertical\"\r\n [attr.group]=\"area.group\"\r\n allow-scrolling=\"true\">\r\n <div class=\"nxe-scrollable-wrapper\">\r\n <div class=\"nxe-scrollable-container\" tabindex=\"0\">\r\n <div class=\"nxe-scrollable-content\">\r\n <div class=\"nxe-area-field-container\">\r\n @for (chip of area.chips; track chip.fieldIndex) {\r\n <!-- dx renderField(field, true) (m_field_chooser.js:465): showColumnLines on,\r\n so the indicators float right ahead of the caption. -->\r\n <div\r\n nxePivotFieldChip\r\n [chip]=\"chip\"\r\n [floatIndicators]=\"true\"\r\n (chipPointerDown)=\"onChipPointerDown(chip, area.group, $event)\"\r\n (chipClick)=\"onChipClick(chip)\"\r\n (chipFilterClick)=\"onChipFilterClick(chip, $event)\"></div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\n// nxe-pivot-grid — drop-in for DevExtreme `dx-pivot-grid`. Renders the 2D cross-tab produced by\r\n// NxePivotDataSource in either dx row-header layout: 'standard' (default — one column per row\r\n// field, expanded parents rowspan their children and close with a \"{value} Total\" row) or 'tree'\r\n// (single indented column, parents inline). Stacked column headers (column values × data-field\r\n// captions) + right-aligned data cells + optional totals/grand totals, with dx cell classes\r\n// emitted alongside the frozen nxe- classes. Exposes the `.instance` facade the app calls:\r\n// `getDataSource().reload()`, `bindChart()`, and an export hook.\r\n\r\nimport {\r\n afterRenderEffect,\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n contentChild,\r\n ElementRef,\r\n EventEmitter,\r\n inject,\r\n input,\r\n linkedSignal,\r\n OnDestroy,\r\n Output,\r\n Signal,\r\n signal,\r\n viewChild,\r\n ViewContainerRef,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { NgTemplateOutlet } from '@angular/common';\r\nimport { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';\r\nimport { Overlay, OverlayRef } from '@angular/cdk/overlay';\r\nimport { ComponentPortal } from '@angular/cdk/portal';\r\nimport { combineLatest, filter, pairwise, take } from 'rxjs';\r\nimport { NXE_NUMBER_SEPARATORS } from '@nexterajs/ui/intl';\r\nimport { nxePane } from '@nexterajs/ui/styling';\r\nimport { Workbook } from '@nexterajs/ui/excel';\r\nimport { nxeSaveAs } from '@nexterajs/ui/excel';\r\nimport { exportPivotGrid } from './nxe-pivot-excel-export';\r\nimport { NxeScrollingComponent } from '@nexterajs/ui/grid';\r\nimport { NxePivotDataSource } from './nxe-pivot-data-source';\r\nimport { NxeFieldPanelComponent, NxeStateStoringComponent } from './nxe-pivot-config.components';\r\nimport { NxePivotFieldChooserComponent } from './nxe-pivot-field-chooser.component';\r\nimport {\r\n NxePivotFieldMoveEvent,\r\n NxePivotFieldPanelComponent,\r\n NxePivotFilterOpenEvent,\r\n} from './nxe-pivot-field-panel.component';\r\nimport { NXE_HF_BLANKS, NxeHeaderFilterModel } from '@nexterajs/ui/grid';\r\nimport { openNxeHeaderFilterOverlay } from '@nexterajs/ui/grid';\r\nimport {\r\n NxeChartInstance,\r\n NxeChartSeries,\r\n NxePivotArea,\r\n NxePivotBodyRow,\r\n NxePivotCellEvent,\r\n NxePivotColumnLeaf,\r\n NxePivotContentReadyEvent,\r\n NxePivotDataSourceOptions,\r\n NxePivotExportingEvent,\r\n NxePivotField,\r\n NxePivotFieldOverride,\r\n NxePivotGridInstance,\r\n NxePivotHeaderCell,\r\n NxePivotModel,\r\n NxePivotOptionChangedEvent,\r\n NxePivotRowHeaderCell,\r\n NxePivotRowHeaderLayout,\r\n NxePivotTexts,\r\n NxePivotTotalsPrior,\r\n} from './nxe-pivot.types';\r\n\r\n/**\r\n * P3-C2: apply the panel's overrides over the caller's fields — NEW objects for overridden\r\n * fields, the caller's objects reused (and never written) everywhere else. `area: null` clears\r\n * the area (P3-C3: a chooser tree-drop or uncheck removed the field — it stays\r\n * defined-but-not-displayed).\r\n */\r\n/**\r\n * W4 Lane 3 (virtual row windowing): the pivot's fixed row pitch — 7px top/bottom padding +\r\n * ~17px line box ≈ dx.light's 31px row (the P1-C2 chrome note). Simple fixed-height windowing,\r\n * like dx's virtual scrolling assumes uniform row heights for its content placeholders.\r\n */\r\nconst PIVOT_VIRTUAL_ROW_HEIGHT = 31;\r\n/** Rows rendered beyond each window edge (keeps fast scrolls painted). */\r\nconst PIVOT_VIRTUAL_OVERSCAN = 5;\r\n\r\nfunction mergeFieldOverrides(\r\n fields: NxePivotField[],\r\n overrides: ReadonlyMap<number, NxePivotFieldOverride>,\r\n): NxePivotField[] {\r\n return fields.map((f, i) => {\r\n const o = overrides.get(i);\r\n if (!o) {\r\n return f;\r\n }\r\n const merged: NxePivotField = { ...f };\r\n if (o.area !== undefined) {\r\n merged.area = o.area ?? undefined;\r\n }\r\n if (o.areaIndex !== undefined) {\r\n merged.areaIndex = o.areaIndex;\r\n }\r\n if (o.sortOrder !== undefined) {\r\n merged.sortOrder = o.sortOrder;\r\n }\r\n if (o.expanded !== undefined) {\r\n merged.expanded = o.expanded;\r\n }\r\n // P3-C4 (header filter): `filterValues: null` = the user cleared the filter (full-check\r\n // → OK) — the caller's declarative seed must NOT resurrect, so the merged field drops it.\r\n if (o.filterValues !== undefined) {\r\n merged.filterValues = o.filterValues ?? undefined;\r\n }\r\n if (o.filterType !== undefined) {\r\n merged.filterType = o.filterType;\r\n }\r\n return merged;\r\n });\r\n}\r\n\r\n/** `dxo-field-chooser` — LIVE since P3-C3: with `enabled` the pivot renders the\r\n * `.nxe-pivotgrid-field-chooser-button` toolbar button and opens the chooser popup\r\n * (nxe-pivot-field-chooser) in a CDK overlay. Defaults are dxPivotGrid's `fieldChooser`\r\n * defaults (m_widget.js): enabled true, width/height 600, allowSearch false,\r\n * applyChangesMode 'instantly' (no OK/Cancel — changes hit the pivot live). */\r\n@Component({\r\n selector: 'nxe-field-chooser',\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 NxeFieldChooserComponent {\r\n readonly enabled = input(true);\r\n readonly height = input<number | undefined>(undefined);\r\n readonly width = input<number | undefined>(undefined);\r\n readonly allowSearch = input(false);\r\n}\r\n\r\n@Component({\r\n selector: 'nxe-pivot-grid',\r\n standalone: true,\r\n imports: [NxePivotFieldPanelComponent, NgTemplateOutlet],\r\n templateUrl: './nxe-pivot-grid.component.html',\r\n styleUrl: './nxe-pivot-grid.component.scss',\r\n host: {\r\n class: 'nxe-widget nxe-pivot-grid',\r\n '[style.height]': 'hostHeight()',\r\n // dx puts these marker classes on the widget root; here they arm while the field\r\n // panel renders — or while the corner hosts the field-chooser toolbar — so the chip\r\n // and area-head chrome (the library's own, nxe-pivot-field-chip + this component's\r\n // scss; an app's dx-prefixed copies under the class mirror) reach the panel bands AND\r\n // the corner-hosted row area without touching the panel-less cross-tab chrome.\r\n '[class.nxe-pivotgrid]': 'panelVisible() || chooserInCorner()',\r\n '[class.nxe-pivotgrid-fields-container]': 'panelVisible() || chooserInCorner()',\r\n },\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class NxePivotGridComponent implements OnDestroy {\r\n // --- Inputs (mirror dx-pivot-grid) ---------------------------------------------------------\r\n readonly dataSource = input<NxePivotDataSourceOptions | NxePivotDataSource | null | undefined>(\r\n null,\r\n );\r\n /** dx `allowFiltering` (default false) — LIVE since P3-C4: filterable dimension chips\r\n * (panel AND chooser) render the `.nxe-header-filter` funnel and open the shared\r\n * header-filter panel; per-field `field.allowFiltering` overrides the widget flag\r\n * (dx m_widget `_updateCalculatedOptions`). */\r\n readonly allowFiltering = input(false);\r\n /** dx `allowSortingBySummary`: accepted + round-tripped, INERT — dx exposes it only\r\n * through the data-cell/total context menu (\"Sort by This Column\"), Phase 4 territory\r\n * (DEFAULTS.md, dated P3-C4 note). */\r\n readonly allowSortingBySummary = input(false);\r\n /** dx: gates the context-menu \"Expand All\"/\"Collapse All\" items (default false). Accepted +\r\n * round-tripped; no context menu exists until Phase 4 (DEFAULTS.md). The facade's\r\n * `expandAll()`/`collapseAll()` work regardless, exactly as dx's data-source methods do. */\r\n readonly allowExpandAll = input(false);\r\n readonly showBorders = input(false);\r\n /** dx default TRUE (m_widget.js defaultOptions): `nxe-word-wrap` on the table lets header\r\n * cells wrap; data cells stay nowrap either way (dx.light's direct td rule). */\r\n readonly wordWrapEnabled = input(true);\r\n readonly rowHeaderLayout = input<NxePivotRowHeaderLayout>('standard');\r\n /** dx `height`: number (px) or CSS string, applied to the widget root — the internal\r\n * scroll container tracks it at 100%. */\r\n readonly height = input<number | string | undefined>(undefined);\r\n readonly texts = input<NxePivotTexts | undefined>(undefined);\r\n // DevExtreme defaults all four totals to true (no global override exists in app.component.ts).\r\n readonly showColumnTotals = input(true);\r\n readonly showRowTotals = input(true);\r\n readonly showColumnGrandTotals = input(true);\r\n readonly showRowGrandTotals = input(true);\r\n /** dx `showTotalsPrior` — 'rows'/'both' place each \"{value} Total\" row before its children. */\r\n readonly showTotalsPrior = input<NxePivotTotalsPrior>('none');\r\n /** dx `dataFieldArea` (default 'column'): 'row' renders the measures as the innermost ROW\r\n * level when two or more exist (with one, dx omits the metric level on either axis).\r\n * Left undefined the engine falls back to the dataSource options' own `dataFieldArea`. */\r\n readonly dataFieldArea = input<'row' | 'column' | undefined>(undefined);\r\n /** dx `allowSorting` (default false, P3-C2): field-panel chips toggle their field's\r\n * sortOrder on click and carry the `.nxe-sort` arrow in `.nxe-column-indicators`. */\r\n readonly allowSorting = input(false);\r\n\r\n // --- W4 Lane 2: facade `option(name, value)` overrides + dx-shaped outputs ------------------\r\n\r\n /**\r\n * Facade `option(name, value)` writes land here and WIN over the input bindings — the dx\r\n * `instance.option(...)` idiom on a component whose declarative config are signal inputs.\r\n * Every live read site goes through the `*Eff` computeds below, so a set is immediately\r\n * effective; the input keeps feeding the value while no override exists.\r\n */\r\n private readonly optionOverrides = signal<ReadonlyMap<string, unknown>>(new Map());\r\n\r\n private effOf<T>(name: string, base: () => T): Signal<T> {\r\n return computed(() => {\r\n const o = this.optionOverrides();\r\n return o.has(name) ? (o.get(name) as T) : base();\r\n });\r\n }\r\n\r\n protected readonly allowFilteringEff = this.effOf('allowFiltering', this.allowFiltering);\r\n protected readonly allowSortingEff = this.effOf('allowSorting', this.allowSorting);\r\n protected readonly allowSortingBySummaryEff = this.effOf(\r\n 'allowSortingBySummary',\r\n this.allowSortingBySummary,\r\n );\r\n protected readonly allowExpandAllEff = this.effOf('allowExpandAll', this.allowExpandAll);\r\n protected readonly showBordersEff = this.effOf('showBorders', this.showBorders);\r\n protected readonly wordWrapEnabledEff = this.effOf('wordWrapEnabled', this.wordWrapEnabled);\r\n protected readonly rowHeaderLayoutEff = this.effOf('rowHeaderLayout', this.rowHeaderLayout);\r\n protected readonly heightEff = this.effOf('height', this.height);\r\n protected readonly textsEff = this.effOf('texts', this.texts);\r\n protected readonly showColumnTotalsEff = this.effOf('showColumnTotals', this.showColumnTotals);\r\n protected readonly showRowTotalsEff = this.effOf('showRowTotals', this.showRowTotals);\r\n protected readonly showColumnGrandTotalsEff = this.effOf(\r\n 'showColumnGrandTotals',\r\n this.showColumnGrandTotals,\r\n );\r\n protected readonly showRowGrandTotalsEff = this.effOf(\r\n 'showRowGrandTotals',\r\n this.showRowGrandTotals,\r\n );\r\n protected readonly showTotalsPriorEff = this.effOf('showTotalsPrior', this.showTotalsPrior);\r\n protected readonly dataFieldAreaEff = this.effOf('dataFieldArea', this.dataFieldArea);\r\n\r\n /** The documented option names `option()` gets/sets (DEFAULTS.md lists the exclusions). */\r\n private readonly effOptions: Record<string, Signal<unknown>> = {\r\n allowExpandAll: this.allowExpandAllEff,\r\n allowFiltering: this.allowFilteringEff,\r\n allowSorting: this.allowSortingEff,\r\n allowSortingBySummary: this.allowSortingBySummaryEff,\r\n dataFieldArea: this.dataFieldAreaEff,\r\n height: this.heightEff,\r\n rowHeaderLayout: this.rowHeaderLayoutEff,\r\n showBorders: this.showBordersEff,\r\n showColumnGrandTotals: this.showColumnGrandTotalsEff,\r\n showColumnTotals: this.showColumnTotalsEff,\r\n showRowGrandTotals: this.showRowGrandTotalsEff,\r\n showRowTotals: this.showRowTotalsEff,\r\n showTotalsPrior: this.showTotalsPriorEff,\r\n texts: this.textsEff,\r\n wordWrapEnabled: this.wordWrapEnabledEff,\r\n };\r\n\r\n /**\r\n * dx-shaped outputs (W4 Lane 2) — no consumer binds them today; parity insurance.\r\n * Classic EventEmitters, NOT `output()`: `.observed` gates the per-cell walks so a pivot\r\n * with no listeners pays nothing (dx does the same — m_area_item only walks its cells\r\n * when `onCellPrepared || hasEvent`).\r\n */\r\n @Output() readonly onCellClick = new EventEmitter<NxePivotCellEvent>();\r\n @Output() readonly onCellPrepared = new EventEmitter<NxePivotCellEvent>();\r\n @Output() readonly onContentReady = new EventEmitter<NxePivotContentReadyEvent>();\r\n @Output() readonly onOptionChanged = new EventEmitter<NxePivotOptionChangedEvent>();\r\n @Output() readonly onExporting = new EventEmitter<NxePivotExportingEvent>();\r\n\r\n /**\r\n * dx `onOptionChanged` source: one snapshot of every documented option's EFFECTIVE value\r\n * (facade overrides included, so `option(name, v)` and an input-binding change emit through\r\n * the same diff — never twice). `dataSource` rides along, get-only.\r\n */\r\n private readonly optionSnapshot = computed<Record<string, unknown>>(() => {\r\n const out: Record<string, unknown> = { dataSource: this.dataSource() };\r\n for (const [name, sig] of Object.entries(this.effOptions)) {\r\n out[name] = sig();\r\n }\r\n return out;\r\n });\r\n\r\n protected readonly fieldChooser = contentChild(NxeFieldChooserComponent);\r\n /** The projected `nxe-field-panel` config (P3-C2) — the panel renders when it is visible. */\r\n protected readonly fieldPanel = contentChild(NxeFieldPanelComponent);\r\n /** The projected `nxe-state-storing` config — LIVE since P3-C4 for `type: 'custom'`:\r\n * every layout mutation fires `customSave(state)` and `customLoad` is honored on init. */\r\n protected readonly stateStoring = contentChild(NxeStateStoringComponent);\r\n /** dx `fieldPanel.visible` (default false): gates the panel, the corner's chips-vs-caption\r\n * switch, and the dx marker classes on the host. */\r\n protected readonly panelVisible = computed(() => this.fieldPanel()?.visible() === true);\r\n /** The rendered panel component — source of the corner-hosted row-area template. */\r\n private readonly panelCmp = viewChild(NxePivotFieldPanelComponent);\r\n /** The ROW fields area, outletted into the corner cell (dx hosts the row chips inside\r\n * `.nxe-area-description-cell` — oracle §c; the corner shows NO caption text then). */\r\n protected readonly panelRowAreaTpl = computed(() => this.panelCmp()?.rowAreaTemplate() ?? null);\r\n\r\n // --- Field chooser (P3-C3) -----------------------------------------------------------------\r\n\r\n /** The `.nxe-pivotgrid-field-chooser-button` renders only when an `nxe-field-chooser` is\r\n * projected with `enabled` not false (the DA page passes [enabled]=\"true\"). */\r\n protected readonly chooserEnabled = computed(\r\n () => this.fieldChooser() != null && this.fieldChooser()!.enabled() !== false,\r\n );\r\n /** dx toolbar placement (m_widget.js `_renderDescriptionArea`, verbatim branch order):\r\n * (a) panel visible && showFilterFields -> the `.nxe-filter-header` band;\r\n * (b) panel visible && (showDataFields || showColumnFields) -> the `.nxe-column-header`\r\n * band (dx-compat's dormant column-header button rules go live);\r\n * (c) else -> the cross-tab corner `.nxe-area-description-cell`, where the button is\r\n * transparent until hover and the corner drops its caption (the library's own rules,\r\n * nxe-pivot-grid.component.scss — dx.light's description-cell toolbar rules). */\r\n protected readonly chooserToolbarHost = computed<'filter' | 'column' | 'corner' | null>(() => {\r\n if (!this.chooserEnabled()) {\r\n return null;\r\n }\r\n const fp = this.fieldPanel();\r\n if (this.panelVisible()) {\r\n if (fp?.showFilterFields() !== false) {\r\n return 'filter';\r\n }\r\n if (fp?.showDataFields() !== false || fp?.showColumnFields() !== false) {\r\n return 'column';\r\n }\r\n }\r\n return 'corner';\r\n });\r\n /** The panel-hosted placements, bound into the panel's `toolbarArea` input. */\r\n protected readonly panelToolbarArea = computed<'filter' | 'column' | null>(() => {\r\n const host = this.chooserToolbarHost();\r\n return host === 'filter' || host === 'column' ? host : null;\r\n });\r\n protected readonly chooserInCorner = computed(() => this.chooserToolbarHost() === 'corner');\r\n\r\n private chooserOverlayRef: OverlayRef | null = null;\r\n private readonly overlay = inject(Overlay);\r\n private readonly viewContainerRef = inject(ViewContainerRef);\r\n\r\n private readonly elementRef = inject(ElementRef<HTMLElement>);\r\n /** Locale separators for every number the pivot renders; threaded into the data source. */\r\n private readonly separators = inject(NXE_NUMBER_SEPARATORS);\r\n\r\n /** Bumped by `getDataSource().reload()` to force a re-aggregate. */\r\n private readonly reloadTick = signal(0);\r\n /**\r\n * W4 Lane 1: bumped by `repaint()` / `updateDimensions()` — RENDER-ONLY. dx `repaint()` is\r\n * the plain Widget re-render (m_widget.js inherits it): it re-renders/re-layouts the\r\n * existing data-controller state and never touches the data source, so it must NOT\r\n * re-aggregate (the pre-W4 facade bumped `reloadTick`, which re-instantiated the engine\r\n * and reset the state linkedSignals — wiping the user's expand/layout state on every\r\n * sidebar toggle of the DA page). The signals already keep the DOM fresh; the observable\r\n * effect of a repaint is re-running the measurement pass below (dx re-layout).\r\n */\r\n private readonly renderTick = signal(0);\r\n private readonly boundChart = signal<NxeChartInstance | null>(null);\r\n /** W4 Lane 4: the dx `bindChart(chart, integrationOptions)` options — a NEW object per\r\n * bindChart call, so re-binding re-renders (dx runs `updateChart` on every bind). */\r\n private readonly chartBindOptions = signal<Record<string, unknown>>({});\r\n\r\n /**\r\n * P3-C2: the field panel's mutations (chip drag between/within areas, click-to-sort — and\r\n * since P3-C4 the header-filter applies), keyed by the field's index in the caller's\r\n * `fields` array and MERGED over those fields when the engine is constructed — the caller's\r\n * array/objects are never mutated (report-output-pivot serializes its own fields in\r\n * `onSave`). Resets whenever the caller swaps `dataSource` (the DA page replaces the object\r\n * on view select), exactly as dx resets the layout when a new state loads. (P3-C4 migrated\r\n * that page's `onExpandAll` off its cloneDeep+swap onto the facade\r\n * `expandAll()`/`collapseAll()`, so expand-all no longer wipes a dragged layout.)\r\n */\r\n private readonly fieldOverrides = linkedSignal<\r\n NxePivotDataSourceOptions | NxePivotDataSource | null | undefined,\r\n ReadonlyMap<number, NxePivotFieldOverride>\r\n >({\r\n source: () => this.dataSource(),\r\n computation: () => new Map<number, NxePivotFieldOverride>(),\r\n });\r\n\r\n protected readonly engine = computed<NxePivotDataSource | null>(() => {\r\n this.reloadTick();\r\n const ds = this.dataSource();\r\n if (!ds) {\r\n return null;\r\n }\r\n const overrides = this.fieldOverrides();\r\n if (ds instanceof NxePivotDataSource) {\r\n return overrides.size\r\n ? ds.cloneWithFields(mergeFieldOverrides(ds.fields(), overrides))\r\n : ds;\r\n }\r\n const opts = ds as NxePivotDataSourceOptions;\r\n const explicit = opts.fields ?? [];\r\n if (overrides.size && explicit.length) {\r\n return new NxePivotDataSource({\r\n ...opts,\r\n separators: this.separators,\r\n fields: mergeFieldOverrides(explicit, overrides),\r\n });\r\n }\r\n // No explicit fields → store-derived fields are all AREA-LESS: no chips exist, so the\r\n // panel can never have produced overrides for this data source.\r\n return new NxePivotDataSource({ ...opts, separators: this.separators });\r\n });\r\n\r\n /**\r\n * The \"layout changed\" hook (P3-C2, consumed since P3-C4): the caller's fields with the\r\n * panel's overrides merged — a NEW array identity after every mutation (drag move, sort\r\n * toggle, filter apply), the caller's own array untouched. `fireStateSave()` serializes\r\n * THIS array into the `customSave` state after each mutation, so a consumer's Save\r\n * persists the post-drag layout; `getExportModel()`/the Excel export read the same\r\n * overridden engine, so exports reflect a move immediately.\r\n */\r\n readonly effectiveFields = computed<NxePivotField[]>(() => this.engine()?.fields() ?? []);\r\n\r\n /**\r\n * Per-node chevron overrides — W4 Lane 1: keyed on the `dataSource` INPUT identity (like\r\n * {@link fieldOverrides}), NOT on the engine instance. dx keeps its expand state inside the\r\n * data source (`getExpandedPaths` re-feeds `rowExpandedPaths`/`columnExpandedPaths` into\r\n * every `_loadCore`, m_data_source.js), so `repaint()` (render-only), `reload()`\r\n * (re-aggregate, state kept) and layout mutations (sort/move — dx keeps expandedPaths\r\n * across them) all PRESERVE it; only a real dataSource swap (the DA page's `initChart`\r\n * builds a new options object per view select) resets. Stale keys after an area move\r\n * simply stop matching any node — harmless, dx-alike.\r\n */\r\n private readonly manualExpanded = linkedSignal<\r\n NxePivotDataSourceOptions | NxePivotDataSource | null | undefined,\r\n Map<string, boolean>\r\n >({\r\n source: () => this.dataSource(),\r\n computation: () => new Map<string, boolean>(),\r\n });\r\n\r\n protected readonly model = computed<NxePivotModel | null>(() => {\r\n // W4 Lane 1: read the tick directly — a facade `reload()` on a NxePivotDataSource\r\n // INSTANCE input re-aggregates IN PLACE (`ds.reload()`), so the engine computed can\r\n // return the identical reference and this computed must still rebuild the model.\r\n this.reloadTick();\r\n const e = this.engine();\r\n if (!e) {\r\n return null;\r\n }\r\n return e.getModel({\r\n expandedOverrides: this.manualExpanded(),\r\n showRowGrandTotals: this.showRowGrandTotalsEff(),\r\n showColumnGrandTotals: this.showColumnGrandTotalsEff(),\r\n rowHeaderLayout: this.rowHeaderLayoutEff(),\r\n showRowTotals: this.showRowTotalsEff(),\r\n showColumnTotals: this.showColumnTotalsEff(),\r\n showTotalsPrior: this.showTotalsPriorEff(),\r\n texts: this.textsEff(),\r\n dataFieldArea: this.dataFieldAreaEff(),\r\n });\r\n });\r\n\r\n /** Host height style — dx `height`: numbers are px, strings pass through, unset removes it. */\r\n protected readonly hostHeight = computed<string | null>(() => {\r\n const h = this.heightEff();\r\n if (h == null || h === '') {\r\n return null;\r\n }\r\n return typeof h === 'number' ? `${h}px` : h;\r\n });\r\n\r\n // --- W4 Lane 3: virtual row windowing (tree-scoped) + empty state --------------------------\r\n\r\n /** The projected `nxe-scrolling` config — `mode: 'virtual'` opts into row windowing. */\r\n protected readonly scrolling = contentChild(NxeScrollingComponent);\r\n /** Scroll offset of `.nxe-pivotgrid-scroll` (its own scroll handler feeds it). */\r\n private readonly scrollTop = signal(0);\r\n /** The scroll container's clientHeight, measured in the render effect (0 = unmeasured). */\r\n private readonly viewportHeight = signal(0);\r\n\r\n /**\r\n * Row windowing arms for `rowHeaderLayout: 'tree'` ONLY: the standard layout's expanded\r\n * parents ROWSPAN their whole subtree, so slicing rows would orphan/clip the merged label\r\n * cells (the dated DEFAULTS.md row) — dx sidesteps this with separate area panes. The DA\r\n * page projects `mode=\"virtual\"` but renders standard → no-op there; the calc tabs' tree\r\n * pivots benefit. RENDER-ONLY: the model, export and chart always see every row.\r\n */\r\n protected readonly virtualActive = computed(\r\n () =>\r\n this.scrolling()?.mode() === 'virtual' &&\r\n this.model()?.rowHeaderLayout === 'tree' &&\r\n this.viewportHeight() > 0,\r\n );\r\n\r\n /** First windowed row (model index) — snapped back to a measures-on-rows group head. */\r\n private readonly winStart = computed(() => {\r\n const m = this.model();\r\n if (!m || !this.virtualActive()) {\r\n return 0;\r\n }\r\n let start = Math.max(\r\n 0,\r\n Math.floor(this.scrollTop() / PIVOT_VIRTUAL_ROW_HEIGHT) - PIVOT_VIRTUAL_OVERSCAN,\r\n );\r\n // A continuation row (measureRowspan 0) has no dimension cell of its own — its label\r\n // lives on the group head's rowspan. Never start the window inside a group.\r\n while (start > 0 && m.rows[start]?.measureRowspan === 0) {\r\n start--;\r\n }\r\n return start;\r\n });\r\n\r\n /** One past the last windowed row (model index). */\r\n private readonly winEnd = computed(() => {\r\n const m = this.model();\r\n if (!m) {\r\n return 0;\r\n }\r\n if (!this.virtualActive()) {\r\n return m.rows.length;\r\n }\r\n const visible = Math.ceil(this.viewportHeight() / PIVOT_VIRTUAL_ROW_HEIGHT);\r\n let end = Math.min(\r\n m.rows.length,\r\n Math.floor(this.scrollTop() / PIVOT_VIRTUAL_ROW_HEIGHT) +\r\n visible +\r\n PIVOT_VIRTUAL_OVERSCAN,\r\n );\r\n // Mirror of `winStart`'s backward snap: a group head carries its continuation rows on a\r\n // rowspan, and HTML only clamps a rowspan at the row-GROUP boundary — never at the end of\r\n // the rows we happen to render. Ending mid-group would spill that `th` into the spacer and\r\n // grand-total rows below, shifting their cells one column right (a phantom column wider\r\n // than the colgroup). Extend past the whole group instead.\r\n while (end < m.rows.length && m.rows[end]?.measureRowspan === 0) {\r\n end++;\r\n }\r\n return end;\r\n });\r\n\r\n /**\r\n * The body rows the template renders: `{row, ri}` pairs where `ri` is the MODEL row index\r\n * (matrix addressing must not shift with the window). The full array when windowing is off.\r\n */\r\n protected readonly viewRows = computed<{ row: NxePivotBodyRow; ri: number }[]>(() => {\r\n const m = this.model();\r\n if (!m) {\r\n return [];\r\n }\r\n const start = this.winStart();\r\n const end = this.winEnd();\r\n if (start === 0 && end >= m.rows.length) {\r\n return m.rows.map((row, ri) => ({ row, ri }));\r\n }\r\n return m.rows.slice(start, end).map((row, i) => ({ row, ri: start + i }));\r\n });\r\n\r\n /** Spacer heights standing in for the unrendered rows (keep the scrollbar honest). */\r\n protected readonly topSpacerH = computed(() => this.winStart() * PIVOT_VIRTUAL_ROW_HEIGHT);\r\n protected readonly bottomSpacerH = computed(() => {\r\n const m = this.model();\r\n return m ? (m.rows.length - this.winEnd()) * PIVOT_VIRTUAL_ROW_HEIGHT : 0;\r\n });\r\n /** Total table columns (spacer colspan): row-header cols (+measure col) + leaves. */\r\n protected readonly totalColCount = computed(() => this.model()?.colWidths.length ?? 1);\r\n\r\n protected onPivotScroll(event: Event): void {\r\n this.scrollTop.set((event.target as HTMLElement).scrollTop);\r\n }\r\n\r\n /**\r\n * dx `.nxe-pivotgrid-nodata` (gridCoreUtils.renderNoDataText): shown when the data source\r\n * `isEmpty()` — no VISIBLE data field or nothing aggregated (empty/fully-filtered store);\r\n * text `texts.noData` (dx default \"No data\"). The reloadTick read re-checks after an\r\n * in-place instance reload.\r\n */\r\n protected readonly showNoData = computed(() => {\r\n this.reloadTick();\r\n return this.engine()?.isEmpty() === true;\r\n });\r\n\r\n constructor() {\r\n // Keep any bound chart in sync with the current cross-tab (dormant for empty pivots).\r\n // toObservable, NOT effect(): the dependency set is exactly the three signals named\r\n // here — an effect() would silently also depend on every signal chart.render reads.\r\n // chartBindOptions gets a new identity per bindChart call, so re-binding re-renders\r\n // with the fresh options (dx `updateChart` on every bind + on every 'changed').\r\n combineLatest([\r\n toObservable(this.boundChart),\r\n toObservable(this.model),\r\n toObservable(this.chartBindOptions),\r\n ])\r\n .pipe(takeUntilDestroyed())\r\n .subscribe(([chart, m]) => {\r\n if (chart && m) {\r\n chart.render(this.buildSeries(m));\r\n }\r\n });\r\n\r\n // P3-C2 (4c): dx sizes the data-header band to the row-header pane, so the data/column\r\n // boundary lines up with the corner's right edge (reference full-page geometry) instead\r\n // of hugging the data chips. The corner itself needs no measuring: since the Phase-3\r\n // visual-gate fix its hosted row chips participate in table layout (see the\r\n // corner-fields scss), so the corner is already content-sized when this reads it.\r\n // afterRenderEffect, NOT effect(): DOM measuring must run after render, and the tracked\r\n // set is exactly the signals read below (a panel mutation rebuilds the model; a flag\r\n // change re-runs the reads — allowSorting/allowFiltering change the chips' arrow/funnel\r\n // widths and with them the corner; `renderTick` re-runs the measurement on `repaint()`/\r\n // `updateDimensions()` — the DA page repaints on sidebar toggles, which is when the\r\n // corner width shifts — WITHOUT re-aggregating, W4 Lane 1).\r\n afterRenderEffect(() => {\r\n this.model();\r\n this.renderTick();\r\n this.allowSortingEff();\r\n this.allowFilteringEff();\r\n const fp = this.fieldPanel();\r\n fp?.visible();\r\n fp?.showDataFields();\r\n fp?.showColumnFields();\r\n fp?.showFilterFields();\r\n fp?.showRowFields();\r\n this.heightEff();\r\n const host = this.elementRef.nativeElement as HTMLElement;\r\n // W4 Lane 3: measure the scroll viewport for the virtual row window (re-measured\r\n // per model change / repaint / updateDimensions — dx re-layouts on the same).\r\n const scrollEl = host.querySelector<HTMLElement>('.nxe-pivotgrid-scroll');\r\n this.viewportHeight.set(scrollEl?.clientHeight ?? 0);\r\n const dataTd = host.querySelector<HTMLElement>(\r\n '.nxe-pivot-field-panel-table td.nxe-data-header',\r\n );\r\n if (!dataTd) {\r\n return;\r\n }\r\n const corner = host.querySelector<HTMLElement>(\r\n '.nxe-pivotgrid-table th.nxe-area-description-cell',\r\n );\r\n dataTd.style.width = corner\r\n ? `${corner.getBoundingClientRect().width}px`\r\n : '';\r\n });\r\n\r\n // P3-C4: dx stateStoring `customLoad` on init — the pivot data controller's `load()`\r\n // runs the state load ONCE (StateStoringController.isLoaded) before the first data\r\n // load and applies a non-null, non-empty state over the fields (m_data_controller\r\n // ~644-651 + m_state_storing_core `_loadState`/`load`). combineLatest + take(1), NOT\r\n // effect(): fire exactly once, when both the projected config and a live engine exist\r\n // (the DA page sets `dataSource` async — writing overrides before the engine exists\r\n // would be wiped by the linkedSignal reset). A later dataSource swap does NOT re-run\r\n // the load, matching dx's once-per-controller `isLoaded` flag.\r\n combineLatest([toObservable(this.stateStoring), toObservable(this.engine)])\r\n .pipe(\r\n filter(([ss, engine]) => !!ss && !!engine),\r\n take(1),\r\n takeUntilDestroyed(),\r\n )\r\n .subscribe(([ss]) => this.runCustomLoad(ss!));\r\n\r\n // W4 Lane 2: dx `onOptionChanged` — one pairwise diff over the effective-option\r\n // snapshot, so an input-binding change and a facade `option(name, v)` set emit through\r\n // the SAME path (never twice). toObservable + pairwise, NOT effect(): the dependency\r\n // set is exactly the snapshot computed; pairwise skips the initial emission (dx fires\r\n // no option events for the construction-time config).\r\n toObservable(this.optionSnapshot)\r\n .pipe(pairwise(), takeUntilDestroyed())\r\n .subscribe(([prev, curr]) => {\r\n if (!this.onOptionChanged.observed) {\r\n return;\r\n }\r\n for (const name of Object.keys(curr)) {\r\n if (!Object.is(prev[name], curr[name])) {\r\n this.onOptionChanged.emit({\r\n name,\r\n fullName: name,\r\n value: curr[name],\r\n previousValue: prev[name],\r\n component: this.instance,\r\n });\r\n }\r\n }\r\n });\r\n\r\n // W4 Lane 2: dx fires `onCellPrepared` for every rendered cell after each content\r\n // render (m_area_item `_triggerOnCellPrepared`) and `onContentReady` when the render\r\n // completes. afterRenderEffect, NOT effect(): the walk reads the rendered DOM, and the\r\n // tracked set is exactly model + renderTick (a repaint()/updateDimensions() re-renders\r\n // in dx, so both events re-fire on it here too). `.observed` gates the per-cell walk —\r\n // a pivot with no listeners pays nothing.\r\n afterRenderEffect(() => {\r\n const m = this.model();\r\n this.renderTick();\r\n const host = this.elementRef.nativeElement as HTMLElement;\r\n if (m && this.onCellPrepared.observed) {\r\n this.emitCellsPrepared(m, host);\r\n }\r\n if (this.onContentReady.observed) {\r\n this.onContentReady.emit({ component: this.instance, element: host });\r\n }\r\n });\r\n }\r\n\r\n protected toggle(pathKey: string, expanded: boolean): void {\r\n const next = new Map(this.manualExpanded());\r\n next.set(pathKey, !expanded);\r\n this.manualExpanded.set(next);\r\n }\r\n\r\n /** W4 Lane 3 (a11y): Enter/Space on a focused expandable header cell toggles it (dx-like\r\n * keyboard expansion; preventDefault stops Space from scrolling the container). */\r\n protected onExpandKey(event: Event, pathKey: string, expanded: boolean): void {\r\n event.preventDefault();\r\n this.toggle(pathKey, expanded);\r\n }\r\n\r\n // --- dx-shaped cell events (W4 Lane 2) -----------------------------------------------------\r\n //\r\n // Payloads per dx m_widget `_createEventArgs`/`_createCellArgs` + m_data_controller's cell\r\n // info shapes. Divergences (DEFAULTS.md): rowIndex/columnIndex are the single nxe table's\r\n // DOM `tr.rowIndex`/`cell.cellIndex` (dx keeps three area tables with area-local indices);\r\n // header cells carry `path` only where an expand key exists; plain clicks on expandable\r\n // cells do NOT toggle (nxe keeps chevron-only toggling — dx toggles on any cell click,\r\n // gated on `!args.cancel`, which the chevron path honors here).\r\n\r\n private domIndices(cellElement: HTMLElement | null): { rowIndex: number; columnIndex: number } {\r\n const cell = cellElement as HTMLTableCellElement | null;\r\n return {\r\n rowIndex: (cell?.parentElement as HTMLTableRowElement | null)?.rowIndex ?? -1,\r\n columnIndex: cell?.cellIndex ?? -1,\r\n };\r\n }\r\n\r\n private finishCellArgs(\r\n m: NxePivotModel,\r\n area: 'row' | 'column' | 'data',\r\n cell: NxePivotCellEvent['cell'],\r\n cellElement: HTMLElement | null,\r\n event?: Event,\r\n ): NxePivotCellEvent {\r\n return {\r\n area,\r\n ...this.domIndices(cellElement),\r\n cellElement,\r\n cell,\r\n rowFields: m.rowFields,\r\n columnFields: m.columnFields,\r\n dataFields: m.dataFields,\r\n event,\r\n cancel: false,\r\n };\r\n }\r\n\r\n private colHeaderArgs(\r\n m: NxePivotModel,\r\n cell: NxePivotHeaderCell,\r\n cellElement: HTMLElement | null,\r\n event?: Event,\r\n ): NxePivotCellEvent {\r\n const data: NxePivotCellEvent['cell'] = {\r\n text: cell.text,\r\n type: cell.isGrandTotal ? 'GT' : cell.isTotal ? 'T' : 'D',\r\n colspan: cell.colspan,\r\n };\r\n if (cell.rowspan) {\r\n data.rowspan = cell.rowspan;\r\n }\r\n if (cell.expandable) {\r\n data.expanded = cell.expanded === true;\r\n }\r\n const path = cell.pathKey ? this.engine()?.nodePath(cell.pathKey) : null;\r\n if (path) {\r\n data.path = path;\r\n }\r\n return this.finishCellArgs(m, 'column', data, cellElement, event);\r\n }\r\n\r\n /** Standard-layout row-header cell (also the split measure-caption cells it renders). */\r\n private rowHeaderArgs(\r\n m: NxePivotModel,\r\n row: NxePivotBodyRow,\r\n hc: NxePivotRowHeaderCell,\r\n cellElement: HTMLElement | null,\r\n event?: Event,\r\n ): NxePivotCellEvent {\r\n const data: NxePivotCellEvent['cell'] = {\r\n text: hc.text,\r\n type: hc.isTotal ? 'T' : 'D',\r\n colspan: hc.colspan,\r\n rowspan: hc.rowspan,\r\n };\r\n if (hc.expandable) {\r\n data.expanded = hc.expanded;\r\n }\r\n const path = hc.pathKey ? this.engine()?.nodePath(hc.pathKey) : null;\r\n if (path) {\r\n data.path = path;\r\n }\r\n if (row.dataIndex !== undefined) {\r\n data.dataIndex = row.dataIndex;\r\n }\r\n return this.finishCellArgs(m, 'row', data, cellElement, event);\r\n }\r\n\r\n /** Tree-layout dimension label cell (synthesized from the row — tree rows carry one cell). */\r\n private treeLabelArgs(\r\n m: NxePivotModel,\r\n row: NxePivotBodyRow,\r\n cellElement: HTMLElement | null,\r\n event?: Event,\r\n ): NxePivotCellEvent {\r\n const data: NxePivotCellEvent['cell'] = {\r\n text: row.label,\r\n type: row.kind,\r\n path: row.path,\r\n };\r\n if (row.hasChildren) {\r\n data.expanded = row.expanded;\r\n }\r\n if (row.dataIndex !== undefined) {\r\n data.dataIndex = row.dataIndex;\r\n }\r\n return this.finishCellArgs(m, 'row', data, cellElement, event);\r\n }\r\n\r\n /** Tree-layout measure-caption cell (measures-on-rows). */\r\n private measureCellArgs(\r\n m: NxePivotModel,\r\n row: NxePivotBodyRow,\r\n cellElement: HTMLElement | null,\r\n event?: Event,\r\n ): NxePivotCellEvent {\r\n const data: NxePivotCellEvent['cell'] = {\r\n text: row.measureCaption,\r\n type: row.kind,\r\n path: row.path,\r\n dataIndex: row.dataIndex,\r\n };\r\n return this.finishCellArgs(m, 'row', data, cellElement, event);\r\n }\r\n\r\n private dataCellArgs(\r\n m: NxePivotModel,\r\n ri: number,\r\n li: number,\r\n cellElement: HTMLElement | null,\r\n event?: Event,\r\n ): NxePivotCellEvent {\r\n const row = m.rows[ri];\r\n const leaf = m.leaves[li];\r\n const di = row.dataIndex ?? leaf.dataIndex;\r\n const df = m.dataFields[di];\r\n const data: NxePivotCellEvent['cell'] = {\r\n text: m.textMatrix[ri][li],\r\n value: m.matrix[ri][li],\r\n rowPath: row.path,\r\n columnPath: leaf.colPath,\r\n rowType: row.kind,\r\n columnType: leaf.kind,\r\n dataIndex: di,\r\n dataType: df?.dataType,\r\n format: df?.format,\r\n };\r\n return this.finishCellArgs(m, 'data', data, cellElement, event);\r\n }\r\n\r\n /** Grand-total footer data cell (both footer shapes). */\r\n private gtDataArgs(\r\n m: NxePivotModel,\r\n li: number,\r\n di: number,\r\n value: number | null,\r\n text: string,\r\n cellElement: HTMLElement | null,\r\n event?: Event,\r\n ): NxePivotCellEvent {\r\n const leaf = m.leaves[li];\r\n const df = m.dataFields[di];\r\n const data: NxePivotCellEvent['cell'] = {\r\n text,\r\n value,\r\n rowPath: [],\r\n columnPath: leaf?.colPath ?? [],\r\n rowType: 'GT',\r\n columnType: leaf?.kind ?? 'GT',\r\n dataIndex: di,\r\n dataType: df?.dataType,\r\n format: df?.format,\r\n };\r\n return this.finishCellArgs(m, 'data', data, cellElement, event);\r\n }\r\n\r\n private gtHeaderArgs(\r\n m: NxePivotModel,\r\n text: string,\r\n cellElement: HTMLElement | null,\r\n event?: Event,\r\n ): NxePivotCellEvent {\r\n return this.finishCellArgs(\r\n m,\r\n 'row',\r\n { text, type: 'GT', path: [] },\r\n cellElement,\r\n event,\r\n );\r\n }\r\n\r\n private cellEl(event: Event): HTMLElement | null {\r\n return (event.currentTarget as HTMLElement | null)?.closest('th,td') ?? null;\r\n }\r\n\r\n // --- click handlers (template) — `.observed` gates the arg building --------------------\r\n\r\n protected onColHeaderCellClick(event: Event, cell: NxePivotHeaderCell): void {\r\n const m = this.model();\r\n if (m && this.onCellClick.observed) {\r\n this.onCellClick.emit(this.colHeaderArgs(m, cell, this.cellEl(event), event));\r\n }\r\n }\r\n\r\n protected onRowHeaderCellClick(\r\n event: Event,\r\n row: NxePivotBodyRow,\r\n hc: NxePivotRowHeaderCell | null,\r\n ): void {\r\n const m = this.model();\r\n if (m && this.onCellClick.observed) {\r\n const args = hc\r\n ? this.rowHeaderArgs(m, row, hc, this.cellEl(event), event)\r\n : this.treeLabelArgs(m, row, this.cellEl(event), event);\r\n this.onCellClick.emit(args);\r\n }\r\n }\r\n\r\n protected onMeasureCellClick(event: Event, row: NxePivotBodyRow): void {\r\n const m = this.model();\r\n if (m && this.onCellClick.observed) {\r\n this.onCellClick.emit(this.measureCellArgs(m, row, this.cellEl(event), event));\r\n }\r\n }\r\n\r\n protected onDataCellClick(event: Event, ri: number, li: number): void {\r\n const m = this.model();\r\n if (m && this.onCellClick.observed) {\r\n this.onCellClick.emit(this.dataCellArgs(m, ri, li, this.cellEl(event), event));\r\n }\r\n }\r\n\r\n protected onGtHeaderCellClick(event: Event, text: string): void {\r\n const m = this.model();\r\n if (m && this.onCellClick.observed) {\r\n this.onCellClick.emit(this.gtHeaderArgs(m, text, this.cellEl(event), event));\r\n }\r\n }\r\n\r\n protected onGtDataCellClick(\r\n event: Event,\r\n li: number,\r\n di: number,\r\n value: number | null,\r\n text: string,\r\n ): void {\r\n const m = this.model();\r\n if (m && this.onCellClick.observed) {\r\n this.onCellClick.emit(this.gtDataArgs(m, li, di, value, text, this.cellEl(event), event));\r\n }\r\n }\r\n\r\n /**\r\n * Chevron click — dx `_handleCellClick`: fire the cancelable `onCellClick`, then toggle\r\n * unless a handler set `cancel: true`. stopPropagation keeps the host cell's own click\r\n * handler from emitting a second event for the same gesture.\r\n */\r\n protected onColExpandClick(event: Event, cell: NxePivotHeaderCell): void {\r\n event.stopPropagation();\r\n const m = this.model();\r\n if (m && this.onCellClick.observed) {\r\n const args = this.colHeaderArgs(m, cell, this.cellEl(event), event);\r\n this.onCellClick.emit(args);\r\n if (args.cancel) {\r\n return;\r\n }\r\n }\r\n this.toggle(cell.pathKey ?? '', cell.expanded === true);\r\n }\r\n\r\n protected onRowExpandClick(\r\n event: Event,\r\n row: NxePivotBodyRow,\r\n hc: NxePivotRowHeaderCell | null,\r\n ): void {\r\n event.stopPropagation();\r\n const m = this.model();\r\n if (m && this.onCellClick.observed) {\r\n const args = hc\r\n ? this.rowHeaderArgs(m, row, hc, this.cellEl(event), event)\r\n : this.treeLabelArgs(m, row, this.cellEl(event), event);\r\n this.onCellClick.emit(args);\r\n if (args.cancel) {\r\n return;\r\n }\r\n }\r\n this.toggle(hc ? hc.pathKey : row.pathKey, hc ? hc.expanded : row.expanded);\r\n }\r\n\r\n /** dx m_area_item `_triggerOnCellPrepared`: one event per rendered cell, DOM in hand. */\r\n private emitCellsPrepared(m: NxePivotModel, host: HTMLElement): void {\r\n const table = host.querySelector('.nxe-pivotgrid-table');\r\n if (!table) {\r\n return;\r\n }\r\n const headTrs = Array.from(table.querySelectorAll(':scope > thead > tr'));\r\n m.columnHeaderRows.forEach((hr, hi) => {\r\n const ths = headTrs[hi] ? (Array.from(headTrs[hi].children) as HTMLElement[]) : [];\r\n const offset = hi === 0 ? 1 : 0; // row 0 leads with the corner cell\r\n hr.forEach((cell, ci) =>\r\n this.onCellPrepared.emit(this.colHeaderArgs(m, cell, ths[ci + offset] ?? null)),\r\n );\r\n });\r\n const bodyTrs = Array.from(\r\n table.querySelectorAll(':scope > tbody > tr:not(.nxe-pivot-vspacer)'),\r\n ) as HTMLElement[];\r\n // W4 Lane 3: walk the RENDERED window (dx fires cellPrepared for rendered cells only).\r\n const view = this.viewRows();\r\n view.forEach(({ row, ri }, trPos) => {\r\n const tr = bodyTrs[trPos];\r\n if (!tr) {\r\n return;\r\n }\r\n const ths = Array.from(tr.querySelectorAll(':scope > th')) as HTMLElement[];\r\n if (m.rowHeaderLayout === 'tree') {\r\n let thIdx = 0;\r\n if (row.measureRowspan !== 0) {\r\n this.onCellPrepared.emit(this.treeLabelArgs(m, row, ths[thIdx++] ?? null));\r\n }\r\n if (row.measureCaption !== undefined) {\r\n this.onCellPrepared.emit(this.measureCellArgs(m, row, ths[thIdx] ?? null));\r\n }\r\n } else {\r\n row.headerCells.forEach((hc, k) =>\r\n this.onCellPrepared.emit(this.rowHeaderArgs(m, row, hc, ths[k] ?? null)),\r\n );\r\n }\r\n const tds = Array.from(tr.querySelectorAll(':scope > td')) as HTMLElement[];\r\n m.leaves.forEach((leaf, li) =>\r\n this.onCellPrepared.emit(this.dataCellArgs(m, ri, li, tds[li] ?? null)),\r\n );\r\n });\r\n // Grand-total footer (either shape) — always rendered after the windowed rows.\r\n let trIdx = view.length;\r\n if (m.grandTotalRows) {\r\n m.grandTotalRows.forEach((g, gi) => {\r\n const tr = bodyTrs[trIdx++];\r\n if (!tr) {\r\n return;\r\n }\r\n const ths = Array.from(tr.querySelectorAll(':scope > th')) as HTMLElement[];\r\n let thIdx = 0;\r\n if (gi === 0) {\r\n this.onCellPrepared.emit(this.gtHeaderArgs(m, m.texts.grandTotal, ths[thIdx++] ?? null));\r\n }\r\n this.onCellPrepared.emit(\r\n this.finishCellArgs(\r\n m,\r\n 'row',\r\n { text: g.caption, type: 'GT', path: [], dataIndex: g.dataIndex },\r\n ths[thIdx] ?? null,\r\n ),\r\n );\r\n const tds = Array.from(tr.querySelectorAll(':scope > td')) as HTMLElement[];\r\n g.cells.forEach((gc, li) =>\r\n this.onCellPrepared.emit(\r\n this.gtDataArgs(m, li, g.dataIndex, gc.value, gc.text, tds[li] ?? null),\r\n ),\r\n );\r\n });\r\n } else if (m.grandTotalCells) {\r\n const tr = bodyTrs[trIdx];\r\n if (tr) {\r\n const th = tr.querySelector(':scope > th') as HTMLElement | null;\r\n this.onCellPrepared.emit(this.gtHeaderArgs(m, m.texts.grandTotal, th));\r\n const tds = Array.from(tr.querySelectorAll(':scope > td')) as HTMLElement[];\r\n m.grandTotalCells.forEach((gc, li) =>\r\n this.onCellPrepared.emit(\r\n this.gtDataArgs(\r\n m,\r\n li,\r\n m.leaves[li]?.dataIndex ?? 0,\r\n gc.value,\r\n gc.text,\r\n tds[li] ?? null,\r\n ),\r\n ),\r\n );\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * A field-panel chip was dropped, or the chooser toggled/moved a field (P3-C2/P3-C3).\r\n * Recompute areaIndexes like dx: remove the field from its current area, insert at the\r\n * drop position (`area: null` = REMOVAL — the chooser's All-Fields tree drop or checkbox\r\n * uncheck; panel/chooser drops outside every area never emit), then renumber the touched\r\n * areas 0..n-1 — all recorded as overrides, never as writes into the caller's field\r\n * objects.\r\n *\r\n * P3-C4 (closes the P3-C2 deferral (d)): the renumbering runs over the lists dx's\r\n * `normalizeIndexes` sees (m_data_source `_createDescriptions` over its module-local\r\n * `getAreaFields`) — the DATA area's `visible: false` fields are IN the numbering, hidden\r\n * row/column/filter fields are not. The emitted `areaIndex` is a VISIBLE slot (the\r\n * panel/chooser hit-test only visible chips), so the insertion offsets past the hidden\r\n * fields before it, exactly like dx's `invisibleFieldsIndexOffset` (m_field_chooser_base\r\n * `renderSortable.onChanged`).\r\n */\r\n protected onPanelFieldMove(e: NxePivotFieldMoveEvent): void {\r\n const engine = this.engine();\r\n if (!engine) {\r\n return;\r\n }\r\n const areas: NxePivotArea[] = ['filter', 'data', 'column', 'row'];\r\n const lists = new Map<NxePivotArea, number[]>(\r\n areas.map((a) => [a, engine.areaFields(a, true).map(({ fieldIndex }) => fieldIndex)]),\r\n );\r\n const touched = new Set<NxePivotArea>();\r\n let removedFrom: NxePivotArea | null = null;\r\n for (const a of areas) {\r\n const list = lists.get(a)!;\r\n const pos = list.indexOf(e.fieldIndex);\r\n if (pos >= 0) {\r\n list.splice(pos, 1);\r\n removedFrom = a;\r\n touched.add(a);\r\n break;\r\n }\r\n }\r\n const next = new Map(this.fieldOverrides());\r\n if (e.area) {\r\n const target = lists.get(e.area)!;\r\n // Visible slot → full-list position: insert right after the visible field that\r\n // precedes the slot (slot 0 → the very front, ahead of any leading hidden field).\r\n const visible = target.filter((i) => engine.fieldAt(i)?.visible !== false);\r\n const slot = Math.max(0, Math.min(e.areaIndex, visible.length));\r\n const before = slot > 0 ? visible[slot - 1] : undefined;\r\n const insertAt = before === undefined ? 0 : target.indexOf(before) + 1;\r\n target.splice(insertAt, 0, e.fieldIndex);\r\n touched.add(e.area);\r\n } else {\r\n if (removedFrom === null) {\r\n return; // not placed anywhere — nothing to remove\r\n }\r\n next.set(e.fieldIndex, { ...next.get(e.fieldIndex), area: null });\r\n }\r\n for (const a of touched) {\r\n lists.get(a)!.forEach((fieldIndex, areaIndex) =>\r\n next.set(fieldIndex, { ...next.get(fieldIndex), area: a, areaIndex }),\r\n );\r\n }\r\n this.fieldOverrides.set(next);\r\n this.fireStateSave();\r\n }\r\n\r\n /**\r\n * A sortable chip was clicked (P3-C2). dx toggles the FIELD's sortOrder desc↔asc off the\r\n * effective order (fields sort ascending by default, so the first click yields 'desc');\r\n * the override feeds the engine's existing per-level sort.\r\n */\r\n protected onPanelSortToggle(e: { fieldIndex: number }): void {\r\n const field = this.engine()?.fieldAt(e.fieldIndex);\r\n if (!field) {\r\n return;\r\n }\r\n const next = new Map(this.fieldOverrides());\r\n next.set(e.fieldIndex, {\r\n ...next.get(e.fieldIndex),\r\n sortOrder: field.sortOrder === 'desc' ? 'asc' : 'desc',\r\n });\r\n this.fieldOverrides.set(next);\r\n this.fireStateSave();\r\n }\r\n\r\n // --- Chip header filter (P3-C4) ------------------------------------------------------------\r\n\r\n /** The field whose header-filter popup is open (`null` = closed). */\r\n private readonly hfFieldIndex = signal<number | null>(null);\r\n\r\n /**\r\n * The shared header-filter model (W2b extraction) over the ENGINE's distinct values: dx\r\n * feeds this popup from `dataSource.getFieldValues(index)` (m_field_chooser_base\r\n * `subscribeToEvents` — the field loaded as a lone expanded column), so the adapter's\r\n * \"rows\" ARE those `{value, text}` items — post-groupInterval group values with their\r\n * display labels, from the UNFILTERED store (dx `showRelevantValues` default false).\r\n * Blank-ish values fold into the model's `(Blanks)` bucket, first (dx\r\n * `headerFilter.texts.emptyValue` = \"(Blanks)\"). `isDate` is pinned false: dx's PIVOT list\r\n * is flat even for date fields (the Year>Month>Day tree is the grid's own semantics —\r\n * DEFAULTS.md, dated P3-C4 note). The model's column token is the FIELD object (a bare\r\n * fieldIndex would read falsy for index 0 — the model treats a falsy column as closed).\r\n */\r\n protected readonly hf = new NxeHeaderFilterModel<NxePivotField>({\r\n rows: () => {\r\n const fieldIndex = this.hfFieldIndex();\r\n const engine = this.engine();\r\n return fieldIndex == null || !engine ? [] : engine.getFieldValues(fieldIndex);\r\n },\r\n rawValue: (_field, item) => item.value,\r\n displayText: (_field, item) => item.text,\r\n isDate: () => false,\r\n sortByDisplayText: () => false,\r\n boolLabel: () => null,\r\n compare: (a, b) => {\r\n if (a == null) {\r\n return b == null ? 0 : -1;\r\n }\r\n if (b == null) {\r\n return 1;\r\n }\r\n if (typeof a === 'number' && typeof b === 'number') {\r\n return a - b;\r\n }\r\n return String(a).localeCompare(String(b));\r\n },\r\n });\r\n private hfOverlayRef: OverlayRef | null = null;\r\n\r\n /** A chip funnel was clicked (panel or chooser) — open the shared header-filter popup. */\r\n protected openPivotHeaderFilter(e: NxePivotFilterOpenEvent): void {\r\n const engine = this.engine();\r\n const field = engine?.fieldAt(e.fieldIndex);\r\n if (!engine || !field) {\r\n return;\r\n }\r\n this.hfFieldIndex.set(e.fieldIndex);\r\n // Check-on-open (the model's frozen rule): no applied filter → everything checked.\r\n this.hf.open(field, this.appliedKeys(engine, e.fieldIndex, field));\r\n this.hfOverlayRef?.dispose();\r\n this.hfOverlayRef = openNxeHeaderFilterOverlay({\r\n overlay: this.overlay,\r\n viewContainerRef: this.viewContainerRef,\r\n origin: e.origin,\r\n model: this.hf,\r\n // Grid semantics kept (orbit's grid default): dx's pivot headerFilter.search\r\n // defaults to enabled FALSE — conscious divergence, DEFAULTS.md dated P3-C4 note.\r\n searchEnabled: () => true,\r\n onApply: () => this.applyPivotHeaderFilter(),\r\n onClose: () => this.closePivotHeaderFilter(),\r\n });\r\n }\r\n\r\n /**\r\n * The field's applied `filterValues` as model keys — blank-ish raws fold into the\r\n * `(Blanks)` sentinel; `filterType: 'exclude'` inverts over the field's distinct keys\r\n * (dx `processItems` marks each item selected iff included, inverted for exclude).\r\n */\r\n private appliedKeys(\r\n engine: NxePivotDataSource,\r\n fieldIndex: number,\r\n field: NxePivotField,\r\n ): ReadonlySet<any> | undefined {\r\n const filterValues = field.filterValues;\r\n if (!filterValues?.length) {\r\n return undefined;\r\n }\r\n const included = new Set<any>(\r\n filterValues.map((v) => (v == null || v === '' ? NXE_HF_BLANKS : v)),\r\n );\r\n if (field.filterType !== 'exclude') {\r\n return included;\r\n }\r\n const all = new Set<any>(\r\n engine\r\n .getFieldValues(fieldIndex)\r\n .map(({ value }) => (value == null || value === '' ? NXE_HF_BLANKS : value)),\r\n );\r\n for (const key of included) {\r\n all.delete(key);\r\n }\r\n return all;\r\n }\r\n\r\n /**\r\n * OK — dx's menu apply writes `{filterValues, filterType}` onto the field and reloads\r\n * (m_field_chooser_base `apply` → `_applyChanges`); here they land in the fieldOverride\r\n * map → the engine refilters at record intake (P2-C3). Full-checked = filter CLEARED (the\r\n * model's null rule — `filterValues: null` so a declarative seed can't resurrect). The\r\n * stored set is always the INCLUDE set (dx sometimes stores the complement with\r\n * `filterType: 'exclude'` — DEFAULTS.md, dated P3-C4 note).\r\n */\r\n private applyPivotHeaderFilter(): void {\r\n const fieldIndex = this.hfFieldIndex();\r\n if (fieldIndex != null) {\r\n const result = this.hf.applyResult();\r\n const next = new Map(this.fieldOverrides());\r\n if (result === null) {\r\n next.set(fieldIndex, { ...next.get(fieldIndex), filterValues: null });\r\n } else {\r\n const values: any[] = [];\r\n for (const key of result) {\r\n if (key === NXE_HF_BLANKS) {\r\n // The blanks bucket folds null/undefined/'' — emit all three raw\r\n // shapes so the engine's dx-verbatim areValuesEqual matches each.\r\n values.push(null, undefined, '');\r\n } else {\r\n values.push(key);\r\n }\r\n }\r\n next.set(fieldIndex, {\r\n ...next.get(fieldIndex),\r\n filterValues: values,\r\n filterType: 'include',\r\n });\r\n }\r\n this.fieldOverrides.set(next);\r\n this.fireStateSave();\r\n }\r\n this.closePivotHeaderFilter();\r\n }\r\n\r\n private closePivotHeaderFilter(): void {\r\n this.hfOverlayRef?.dispose();\r\n this.hfOverlayRef = null;\r\n this.hf.close();\r\n this.hfFieldIndex.set(null);\r\n }\r\n\r\n // --- State storing (nxe-state-storing, P3-C4) ----------------------------------------------\r\n\r\n /**\r\n * dx StateStoringController: after every data change the pivot's data controller pushes\r\n * `dataSource.state()` into the controller and `save()`s (m_data_controller ~854-856) —\r\n * for `type: 'custom'` that ends in `customSave(state)` (m_state_storing_core\r\n * `_saveState`). Here it fires synchronously per LAYOUT MUTATION (drag, sort toggle,\r\n * filter apply, chooser check/uncheck) — no `savingTimeout` debounce (dx default 2000ms)\r\n * and no save on plain loads (DEFAULTS.md, dated P3-C4 notes). The\r\n * localStorage/sessionStorage types stay inert.\r\n */\r\n private fireStateSave(): void {\r\n const ss = this.stateStoring();\r\n if (!ss || ss.enabled() !== true || ss.type() !== 'custom') {\r\n return;\r\n }\r\n const save = ss.customSave();\r\n if (typeof save !== 'function') {\r\n return;\r\n }\r\n save(this.buildStorageState());\r\n }\r\n\r\n /**\r\n * The dx-shaped state: `fields` serialized from {@link effectiveFields} (the caller's\r\n * fields with every override merged — the POST-mutation layout), plus the state's\r\n * expanded-path arrays (always empty here — nxe holds chevron state internally;\r\n * DEFAULTS.md).\r\n *\r\n * Each entry is a FULL shallow copy of the effective field — every own enumerable\r\n * property, function members (selector/customizeText/calculateCustomSummary/\r\n * calculateSummaryValue) included — which trivially guarantees the dx state keys\r\n * (dataField + area/areaIndex/expanded/sortOrder/filterValues/filterType and the\r\n * caption/format/summaryType passthrough) wherever the field defines them.\r\n *\r\n * THE FULL COPY IS LOAD-BEARING (P3-C4 review): report-output-pivot's\r\n * `sendStorageRequest` REPLACES its live `pivotGridDataSource.fields` with this very\r\n * array, and the engine computed re-reads `opts.fields` on its next rebuild — the next\r\n * mutation, or a facade `reload()` (since W4 Lane 1 `repaint()` is render-only and no\r\n * longer rebuilds the engine; the replaced fields carry the same values the engine\r\n * already renders, so nothing is lost in the interim). A slim\r\n * dx-keys-only payload would strip dataType/groupInterval (date bucketing degrades),\r\n * `visible: false` (hidden helper measures reappear), width/sortBy/summaryDisplayMode/\r\n * name, and the per-field allowSorting/allowFiltering opt-outs out of the LIVE config on\r\n * that rebuild. dx never fed its state back into a live widget — only its SAVED JSON was\r\n * slim — and the production REPORT_SETTING `otherValue1` payloads carry full field defs\r\n * (captions/dataTypes/formats) anyway; `JSON.stringify` drops the function members\r\n * harmlessly when the Save dialog serializes later.\r\n */\r\n private buildStorageState(): { fields: any[]; rowExpandedPaths: any[]; columnExpandedPaths: any[] } {\r\n const fields = this.effectiveFields().map((f) => ({ ...f }));\r\n return { fields, rowExpandedPaths: [], columnExpandedPaths: [] };\r\n }\r\n\r\n /**\r\n * dx stateStoring `customLoad` contract (m_state_storing_core `_loadState` + `load`): the\r\n * return value goes through `fromPromise` — a plain state object OR a Promise of one both\r\n * work — and applies only when non-null and not an empty object; a rejected promise\r\n * applies nothing.\r\n */\r\n private runCustomLoad(ss: NxeStateStoringComponent): void {\r\n if (ss.enabled() !== true || ss.type() !== 'custom') {\r\n return;\r\n }\r\n const load = ss.customLoad();\r\n if (typeof load !== 'function') {\r\n return;\r\n }\r\n Promise.resolve()\r\n .then(() => load())\r\n .then((state) => this.applyLoadedState(state))\r\n .catch(() => undefined);\r\n }\r\n\r\n /**\r\n * Apply a loaded state's `fields` over the caller's fields as overrides — dx\r\n * `setFieldsState` (m_data_source): state fields match by `name` falling back to\r\n * `dataField` (same-id fields pair by order), and each match writes the state properties\r\n * onto the field, `undefined` area CLEARING it. Narrowings (DEFAULTS.md): only the\r\n * override-expressible properties apply (area/areaIndex/sortOrder/expanded/filterValues/\r\n * filterType — not sortBy/summaryType/summaryDisplayMode), and a field ABSENT from the\r\n * state keeps its own config where dx would reset its state properties.\r\n */\r\n private applyLoadedState(state: any): void {\r\n if (state == null || typeof state !== 'object' || Object.keys(state).length === 0) {\r\n return; // dx: `null !== state && !isEmptyObject(state)` gates the apply\r\n }\r\n const engine = this.engine();\r\n if (!engine) {\r\n return;\r\n }\r\n const stateFields: any[] = Array.isArray(state.fields) ? state.fields : [];\r\n const used = new Set<number>();\r\n const next = new Map(this.fieldOverrides());\r\n engine.fields().forEach((field, fieldIndex) => {\r\n const id = (field as any).name ?? `${field.dataField}`;\r\n const si = stateFields.findIndex(\r\n (sf, i) => !used.has(i) && (sf?.name ?? `${sf?.dataField}`) === id,\r\n );\r\n if (si < 0) {\r\n return;\r\n }\r\n used.add(si);\r\n const sf = stateFields[si];\r\n const o: NxePivotFieldOverride = { ...next.get(fieldIndex) };\r\n o.area = (sf.area ?? null) as NxePivotFieldOverride['area'];\r\n if (sf.areaIndex !== undefined) {\r\n o.areaIndex = Number(sf.areaIndex);\r\n }\r\n if (sf.sortOrder !== undefined) {\r\n o.sortOrder = sf.sortOrder;\r\n }\r\n if (sf.expanded !== undefined) {\r\n o.expanded = sf.expanded;\r\n }\r\n if (sf.filterValues !== undefined) {\r\n o.filterValues = sf.filterValues;\r\n }\r\n if (sf.filterType !== undefined) {\r\n o.filterType = sf.filterType;\r\n }\r\n next.set(fieldIndex, o);\r\n });\r\n this.fieldOverrides.set(next);\r\n }\r\n\r\n /**\r\n * P3-C3: open the field chooser popup — dx `_fieldChooserPopup.show()` off the toolbar\r\n * button. CDK overlay centered in the viewport (the dx popup's default position), pane\r\n * carrying `nxePane('nxe-fieldchooser-pane')` (the widget font contract for body-level\r\n * panes). NO backdrop: dx renders this popup with `shading: false` and its\r\n * `hideOnOutsideClick` default (false), so the pivot behind stays fully interactive\r\n * while the instantly-applying chooser is open and an outside click neither closes nor\r\n * blocks — only the title-bar X and Escape (OverlayKeyboardDispatcher routes body\r\n * keydowns to the topmost overlay with observers) close it. The chooser gets the LIVE\r\n * engine signal, so applyChangesMode-'instantly' mutations flow chooser ->\r\n * onPanelFieldMove/onPanelSortToggle -> fieldOverrides -> engine -> every rendered\r\n * surface, with the popup still open.\r\n */\r\n protected toggleFieldChooser(): void {\r\n if (this.chooserOverlayRef) {\r\n return; // dx: the button re-shows the already-open popup — a no-op here\r\n }\r\n const overlayRef = this.overlay.create({\r\n positionStrategy: this.overlay.position().global().centerHorizontally().centerVertically(),\r\n scrollStrategy: this.overlay.scrollStrategies.noop(),\r\n hasBackdrop: false, // dx: shading false + hideOnOutsideClick false\r\n panelClass: nxePane('nxe-fieldchooser-pane'),\r\n });\r\n this.chooserOverlayRef = overlayRef;\r\n overlayRef.keydownEvents().subscribe((event) => {\r\n if (event.key === 'Escape') {\r\n this.closeFieldChooser();\r\n }\r\n });\r\n const chooserRef = overlayRef.attach(\r\n new ComponentPortal(NxePivotFieldChooserComponent, this.viewContainerRef),\r\n );\r\n chooserRef.setInput('engine', this.engine);\r\n chooserRef.setInput('width', this.fieldChooser()?.width());\r\n chooserRef.setInput('height', this.fieldChooser()?.height());\r\n chooserRef.setInput('allowSearch', this.fieldChooser()?.allowSearch() === true);\r\n chooserRef.setInput('allowSorting', this.allowSortingEff());\r\n chooserRef.setInput('allowFiltering', this.allowFilteringEff());\r\n chooserRef.instance.fieldMove.subscribe((e) => this.onPanelFieldMove(e));\r\n chooserRef.instance.sortToggle.subscribe((e) => this.onPanelSortToggle(e));\r\n chooserRef.instance.filterOpen.subscribe((e) => this.openPivotHeaderFilter(e));\r\n chooserRef.instance.closed.subscribe(() => this.closeFieldChooser());\r\n }\r\n\r\n private closeFieldChooser(): void {\r\n // A chip funnel inside the chooser anchors its filter popup to a chip in THIS overlay —\r\n // leaving it attached would strand it on a detached origin (CDK then repositions it off\r\n // a 0x0 rect) while its OK still applied a filter.\r\n this.closePivotHeaderFilter();\r\n this.chooserOverlayRef?.dispose();\r\n this.chooserOverlayRef = null;\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.closeFieldChooser();\r\n this.hfOverlayRef?.dispose();\r\n this.hfOverlayRef = null;\r\n }\r\n\r\n /**\r\n * W4 Lane 4 — series derive from the COLUMN LEAVES (kind 'D' — subtotal 'T' columns and\r\n * the grand-total column are presentation, charting them would double-count), one series\r\n * per (column path × visible measure), fixing the P2-C2 minor: the old code charted only\r\n * the grand-total leaf and, with grand totals OFF, silently fell back to the FIRST leaf\r\n * (one arbitrary column mislabeled as the measure's totals). Categories stay the\r\n * non-subtotal body rows — the established nxe orientation (== dx `inverted: true`;\r\n * DEFAULTS.md). Honors the dx integration options (see {@link NxePivotBindChartOptions}):\r\n * `alternateDataFields` (series order), `putDataFieldsInto` ('series'/'args'/'both'),\r\n * `dataFieldsDisplayMode` (accepted, structural no-op on the single-pane nxe chart).\r\n * Works identically for `dataFieldArea: 'row'` — dx's chart reads the data source, never\r\n * the widget layout, so measures-on-rows charts the same series.\r\n */\r\n private buildSeries(m: NxePivotModel): NxeChartSeries {\r\n const o = this.chartBindOptions();\r\n const alternate = o['alternateDataFields'] !== false; // dx default true\r\n const putInto =\r\n o['putDataFieldsInto'] === 'args' || o['putDataFieldsInto'] === 'both'\r\n ? (o['putDataFieldsInto'] as 'args' | 'both')\r\n : 'series';\r\n\r\n // `dataFields` is dx's descriptions.values — hidden measures aggregate there but never\r\n // chart (P2-C3); each visible one keeps its ORIGINAL dataIndex for cell addressing.\r\n const measures = m.dataFields\r\n .map((df, di) => ({ df, di }))\r\n .filter(({ df }) => df.visible !== false);\r\n const caption = (mm: { df: NxePivotField }) => mm.df.caption ?? mm.df.dataField ?? '';\r\n const multiMeasure = measures.length > 1;\r\n const measureInArgs = multiMeasure && (putInto === 'args' || putInto === 'both');\r\n const measureInSeries = multiMeasure && putInto !== 'args';\r\n\r\n // Measures-on-rows splits every body row per measure — categories come from the first\r\n // visible measure's variants; the split lookup addresses the others.\r\n const split = m.dataFieldArea === 'row' && m.dataFields.length > 1;\r\n const firstDi = measures[0]?.di ?? 0;\r\n const baseRows = m.rows\r\n .map((row, ri) => ({ row, ri }))\r\n .filter(({ row }) => row.kind !== 'T' && (!split || row.dataIndex === firstDi));\r\n let splitRi: Map<string, number> | null = null;\r\n if (split) {\r\n splitRi = new Map();\r\n m.rows.forEach((row, ri) => {\r\n if (row.dataIndex !== undefined) {\r\n splitRi!.set(`${row.pathKey}\u0000${row.dataIndex}`, ri);\r\n }\r\n });\r\n }\r\n\r\n // Distinct 'D' column groups in leaf order (non-split: one group spans the per-measure\r\n // leaves of a colPath; split: one leaf per colPath IS the group).\r\n interface ColGroup {\r\n name: string;\r\n li0: number;\r\n leafByDi: Map<number, number>;\r\n }\r\n const groups: ColGroup[] = [];\r\n const groupByKey = new Map<string, ColGroup>();\r\n const collect = (kinds: NxePivotColumnLeaf['kind'][], nameOf: (li: number) => string) => {\r\n m.leaves.forEach((leaf, li) => {\r\n if (!kinds.includes(leaf.kind)) {\r\n return;\r\n }\r\n const key = leaf.colKey || '#root';\r\n let g = groupByKey.get(key);\r\n if (!g) {\r\n g = { name: nameOf(li), li0: li, leafByDi: new Map() };\r\n groupByKey.set(key, g);\r\n groups.push(g);\r\n }\r\n g.leafByDi.set(leaf.dataIndex, li);\r\n });\r\n };\r\n collect(['D'], (li) => m.colLabels[li].join(' - '));\r\n if (groups.length === 0) {\r\n // A pivot with no column fields has only the root column, which the engine emits as\r\n // the GRAND-TOTAL leaf once `showColumnGrandTotals` is on (dx's default) — see\r\n // buildLeaves' `columnFields.length === 0 && measuresOnRows` branch. dx charts that\r\n // column rather than dropping it (m_chart_integration maps an empty column path onto\r\n // `grandTotalText`), so without this pass such a pivot binds a chart with categories\r\n // and no series at all.\r\n collect(['GT'], () => m.texts.grandTotal);\r\n }\r\n\r\n const valueFor = (\r\n g: ColGroup,\r\n entry: { row: NxePivotBodyRow; ri: number },\r\n di: number,\r\n ): number => {\r\n if (split) {\r\n const ri = splitRi!.get(`${entry.row.pathKey}\u0000${di}`);\r\n return (ri !== undefined ? m.matrix[ri][g.li0] : null) ?? 0;\r\n }\r\n const li = g.leafByDi.get(di);\r\n return (li !== undefined ? m.matrix[entry.ri][li] : null) ?? 0;\r\n };\r\n\r\n // Categories — with putDataFieldsInto 'args'/'both' each base row splits per measure,\r\n // carrying dx's ` | {caption}` suffix; `alternateDataFields` orders the interleave.\r\n const categories: string[] = [];\r\n const catKeys: { entry: { row: NxePivotBodyRow; ri: number }; di: number }[] = [];\r\n if (measureInArgs) {\r\n const emitCat = (entry: (typeof baseRows)[number], mm: (typeof measures)[number]) => {\r\n categories.push(`${entry.row.label} | ${caption(mm)}`);\r\n catKeys.push({ entry, di: mm.di });\r\n };\r\n if (alternate) {\r\n for (const entry of baseRows) {\r\n for (const mm of measures) {\r\n emitCat(entry, mm);\r\n }\r\n }\r\n } else {\r\n for (const mm of measures) {\r\n for (const entry of baseRows) {\r\n emitCat(entry, mm);\r\n }\r\n }\r\n }\r\n } else {\r\n for (const entry of baseRows) {\r\n categories.push(entry.row.label);\r\n catKeys.push({ entry, di: -1 });\r\n }\r\n }\r\n\r\n const series: { name: string; values: number[] }[] = [];\r\n if (measureInSeries) {\r\n const emitSeries = (g: ColGroup, mm: (typeof measures)[number]) =>\r\n series.push({\r\n name: g.name ? `${g.name} | ${caption(mm)}` : caption(mm),\r\n values: catKeys.map((k) => {\r\n // 'both': a series carries one measure — mismatched categories fill 0\r\n // (dx emits sparse data items there).\r\n if (k.di >= 0 && k.di !== mm.di) {\r\n return 0;\r\n }\r\n return valueFor(g, k.entry, mm.di);\r\n }),\r\n });\r\n if (alternate) {\r\n for (const g of groups) {\r\n for (const mm of measures) {\r\n emitSeries(g, mm);\r\n }\r\n }\r\n } else {\r\n for (const mm of measures) {\r\n for (const g of groups) {\r\n emitSeries(g, mm);\r\n }\r\n }\r\n }\r\n } else {\r\n // One series per column group: single-measure models name a label-less root group\r\n // after the measure; 'args' mode names it dx's grand-total text.\r\n for (const g of groups) {\r\n series.push({\r\n name:\r\n g.name ||\r\n (measureInArgs ? m.texts.grandTotal : caption(measures[0] ?? { df: {} })),\r\n values: catKeys.map((k) =>\r\n valueFor(g, k.entry, k.di >= 0 ? k.di : firstDi),\r\n ),\r\n });\r\n }\r\n }\r\n return { categories, series };\r\n }\r\n\r\n // --- DevExtreme `.instance` facade ---------------------------------------------------------\r\n private readonly facade: NxePivotGridInstance = {\r\n getDataSource: () => ({\r\n /**\r\n * dx `reload()` (m_data_source.js): `load({reload: true})` re-fetches/re-aggregates\r\n * the store but PRESERVES field state and the expanded paths (`getExpandedPaths`\r\n * re-feeds `rowExpandedPaths`/`columnExpandedPaths` into `_loadCore`). Here: an\r\n * INSTANCE input re-builds in place; a plain options object re-instantiates the\r\n * engine on the tick (re-reading `opts.fields` — the DA page's\r\n * `sendStorageRequest` replaces fields INSIDE the same object, so the rebuild is\r\n * where fresh fields land); the user-state linkedSignals (chevrons, overrides)\r\n * are keyed on the INPUT identity and survive (W4 Lane 1).\r\n */\r\n reload: () => {\r\n const ds = this.dataSource();\r\n if (ds instanceof NxePivotDataSource) {\r\n ds.reload();\r\n }\r\n this.reloadTick.update((v) => v + 1);\r\n },\r\n }),\r\n bindChart: (chart, options) => {\r\n if (chart && chart._isNxeChart) {\r\n // W4 Lane 4: honor the dx integration options (see NxePivotBindChartOptions).\r\n this.chartBindOptions.set({ ...(options ?? {}) });\r\n this.boundChart.set(chart as NxeChartInstance);\r\n }\r\n },\r\n getExportModel: () => this.model(),\r\n // dx repaint() = Widget re-render: render/layout only, NO re-aggregation (W4 Lane 1).\r\n repaint: () => this.renderTick.update((v) => v + 1),\r\n expandAll: () => this.setAllExpanded(true),\r\n collapseAll: () => this.setAllExpanded(false),\r\n // --- W4 Lane 2: facade completion ------------------------------------------------------\r\n exportToExcel: () => this.runExportToExcel(),\r\n option: (name: string, ...rest: unknown[]) => this.optionFacade(name, rest),\r\n // dx updateDimensions(): re-run the layout/measurement pass (band anchor sync).\r\n updateDimensions: () => this.renderTick.update((v) => v + 1),\r\n // dx getFieldChooserPopup(), narrowed to {show, hide} against the chooser overlay.\r\n getFieldChooserPopup: () => ({\r\n show: () => this.toggleFieldChooser(),\r\n hide: () => this.closeFieldChooser(),\r\n }),\r\n };\r\n\r\n /**\r\n * dx `option(name[, value])` (W4 Lane 2). Get: the EFFECTIVE value (override ?? input);\r\n * `'dataSource'` is additionally readable. Set: only the documented names in\r\n * {@link effOptions} — the write lands in {@link optionOverrides}, wins over the input\r\n * binding, and flows through the option-snapshot diff into `onOptionChanged`. Unsupported\r\n * names (dataSource, nested `'a.b'` paths, the projected-config children) are a silent\r\n * no-op on set / undefined on get, recorded in DEFAULTS.md.\r\n */\r\n private optionFacade(name: string, rest: unknown[]): unknown {\r\n if (rest.length === 0) {\r\n if (name === 'dataSource') {\r\n return this.dataSource();\r\n }\r\n return name in this.effOptions ? this.effOptions[name]() : undefined;\r\n }\r\n if (!(name in this.effOptions)) {\r\n return undefined;\r\n }\r\n const next = new Map(this.optionOverrides());\r\n next.set(name, rest[0]);\r\n this.optionOverrides.set(next);\r\n return undefined;\r\n }\r\n\r\n /**\r\n * dx `exportToExcel()` — the widget's built-in export path (m_export.js `exportTo`): fire\r\n * the cancelable `onExporting` with dx's default fileName 'PivotGrid' (a handler may\r\n * rename or cancel), then run the SAME `exportPivotGrid({component})` pipeline\r\n * report-output-pivot drives from its own toolbar (that page-side path stays untouched\r\n * and, like dx's standalone exporter, never fires the widget event).\r\n */\r\n private runExportToExcel(): Promise<void> {\r\n const args: NxePivotExportingEvent = {\r\n fileName: 'PivotGrid',\r\n cancel: false,\r\n component: this.instance,\r\n };\r\n this.onExporting.emit(args);\r\n if (args.cancel) {\r\n return Promise.resolve();\r\n }\r\n const workbook = new Workbook();\r\n const worksheet = workbook.addWorksheet(args.fileName);\r\n return exportPivotGrid({ component: this.instance, worksheet }).then(() =>\r\n workbook.xlsx.writeBuffer().then((buffer) =>\r\n this.saveExportedWorkbook(\r\n new Blob([buffer], { type: 'application/octet-stream' }),\r\n `${args.fileName}.xlsx`,\r\n ),\r\n ),\r\n );\r\n }\r\n\r\n /** Download seam (specs spy here — nxeSaveAs clicks a synthetic anchor). */\r\n protected saveExportedWorkbook(blob: Blob, fileName: string): void {\r\n nxeSaveAs(blob, fileName);\r\n }\r\n\r\n /**\r\n * Oracle §e: dx's expand-all/collapse-all set `expanded` on EVERY field of the data source\r\n * and reload — and the dx-era report page did the same blanket `field.expanded` mutation,\r\n * which is why its Save persisted the expanded state and a reload restored it. Mirrored\r\n * here (P3-C4, replacing the earlier private allExpanded model flag) as `expanded`\r\n * fieldOverrides on EVERY field — data and filter fields included, exactly like the old\r\n * page's loop and dx's own mutation: the caller's objects stay untouched, the state\r\n * survives engine rebuilds, and it serializes through {@link effectiveFields} into the\r\n * `customSave` payload with no special-casing. The per-node chevron map is wiped\r\n * EXPLICITLY below (since W4 Lane 1 it is keyed on the dataSource input and survives\r\n * engine rebuilds, so the old implicit reset no longer happens) — dx-identical: individual\r\n * toggles then work on top. `fireStateSave()` closes the Save-after-expandAll loop (it\r\n * no-ops when no `nxe-state-storing` is projected).\r\n */\r\n private setAllExpanded(expanded: boolean): void {\r\n this.manualExpanded.set(new Map());\r\n const count = this.engine()?.fields().length ?? 0;\r\n if (count === 0) {\r\n return; // no fields (or store-derived, area-less ones) — nothing to expand\r\n }\r\n const next = new Map(this.fieldOverrides());\r\n for (let i = 0; i < count; i++) {\r\n next.set(i, { ...next.get(i), expanded });\r\n }\r\n this.fieldOverrides.set(next);\r\n this.fireStateSave();\r\n }\r\n\r\n get instance(): NxePivotGridInstance {\r\n return this.facade;\r\n }\r\n}\r\n","<!-- P3-C3: the dx `.dx-pivotgrid-toolbar` with the field-chooser button (m_widget.js\r\n `_renderDescriptionArea` + dx.light float:right chrome). Placement per dx's branch order:\r\n the panel's filter-header band when it shows, else the panel's column-header band when\r\n the data/column band row shows, else the cross-tab corner cell, where the button stays\r\n transparent until hover. Renders only when the projected nxe-field-chooser config is\r\n enabled. The button chrome is the library's own (nxe-pivot-grid.component.scss). -->\r\n<ng-template #chooserToolbarTpl>\r\n <div class=\"nxe-pivotgrid-toolbar\">\r\n <div\r\n class=\"nxe-pivotgrid-field-chooser-button nxe-pivot-field-chooser-button nxe-widget nxe-button nxe-button-mode-contained nxe-button-normal nxe-button-has-icon\"\r\n role=\"button\"\r\n tabindex=\"0\"\r\n title=\"Show Field Chooser\"\r\n aria-label=\"Show Field Chooser\"\r\n (click)=\"toggleFieldChooser()\"\r\n (keydown.enter)=\"toggleFieldChooser()\">\r\n <!-- dx's 18px `.dx-icon-columnchooser` glyph, redrawn from rectangles (the DXIcons font is\r\n not used): a window with a 2px frame (12 x 12) behind a solid 8 x 11 list panel with\r\n three 4 x 1 slots, unioned into one even-odd path so the slots stay open where the\r\n panel covers the frame. The span keeps the class the specs query but not `nxe-icon`,\r\n whose mask layer would hide an inline SVG. -->\r\n <div class=\"nxe-button-content\"><span class=\"nxe-icon-columnchooser nxe-pivot-chooser-icon\" aria-hidden=\"true\"><svg viewBox=\"0 0 18 18\" width=\"18\" height=\"18\" focusable=\"false\"><path fill=\"currentColor\" fill-rule=\"evenodd\" d=\"M1 2h12v4h4v11H9v-3H1zM3 4v8h6V6h2V4zM11 8v1h4V8zM11 11v1h4v-1zM11 14v1h4v-1z\" /></svg></span></div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n@if (model(); as m) {\r\n <!-- P3-C2: the dx field panel (dxo-field-panel). dx default visible=false — nothing renders\r\n unless the projected nxe-field-panel opts in (the calc tabs project none). `undefined`\r\n bound into a flag (report-output-pivot binds panelConfig()?.…) falls back to the dx\r\n default: hidden for `visible`, shown for the five area/drag flags. The ROW area is not\r\n in this block — the panel exposes it as a template and the corner cell below hosts it\r\n (dx: the corner .dx-area-description-cell holds the row chips). -->\r\n @if (fieldPanel(); as fp) {\r\n @if (fp.visible()) {\r\n <nxe-pivot-field-panel\r\n [engine]=\"engine()\"\r\n [showFilterFields]=\"fp.showFilterFields() !== false\"\r\n [showDataFields]=\"fp.showDataFields() !== false\"\r\n [showColumnFields]=\"fp.showColumnFields() !== false\"\r\n [showRowFields]=\"fp.showRowFields() !== false\"\r\n [allowFieldDragging]=\"fp.allowFieldDragging() !== false\"\r\n [allowSorting]=\"allowSortingEff()\"\r\n [allowFiltering]=\"allowFilteringEff()\"\r\n [showBorders]=\"showBordersEff()\"\r\n [toolbarTemplate]=\"chooserToolbarTpl\"\r\n [toolbarArea]=\"panelToolbarArea()\"\r\n (fieldMove)=\"onPanelFieldMove($event)\"\r\n (sortToggle)=\"onPanelSortToggle($event)\"\r\n (filterOpen)=\"openPivotHeaderFilter($event)\" />\r\n }\r\n }\r\n <div class=\"nxe-pivotgrid-scroll\" (scroll)=\"onPivotScroll($event)\">\r\n <table\r\n class=\"nxe-pivotgrid-table\"\r\n role=\"grid\"\r\n [class.nxe-pivotgrid-bordered]=\"showBordersEff()\"\r\n [class.nxe-word-wrap]=\"wordWrapEnabledEff()\"\r\n [class.nxe-pivot-layout-tree]=\"m.rowHeaderLayout === 'tree'\">\r\n <colgroup>\r\n @for (w of m.colWidths; track $index) {\r\n <col [style.width.px]=\"w\" />\r\n }\r\n </colgroup>\r\n <thead>\r\n @for (hr of m.columnHeaderRows; track $index; let first = $first) {\r\n <tr role=\"row\">\r\n @if (first) {\r\n <!-- Corner: with the field panel VISIBLE dx hosts the ROW-field chips here and\r\n renders NO caption text (oracle §c \"hosts the ROW field chips\";\r\n views/0/initial-full-page.png). The caption is the panel-hidden rendering\r\n only (accepted deviation — dx shows an empty corner then). When the\r\n field-chooser toolbar lives here the corner is dx's exactly: the button at\r\n its top-left (0 cell padding + the button's 1px margin) and no caption,\r\n which the button would otherwise sit on top of. -->\r\n <th\r\n class=\"nxe-pivot-corner nxe-area-description-cell\"\r\n role=\"columnheader\"\r\n [class.nxe-pivot-corner-fields]=\"panelVisible()\"\r\n [class.nxe-pivot-corner-toolbar]=\"chooserInCorner()\"\r\n [attr.rowspan]=\"m.columnHeaderRows.length\"\r\n [attr.colspan]=\"m.rowHeaderColCount > 1 ? m.rowHeaderColCount : null\">@if (chooserInCorner()) {<ng-container *ngTemplateOutlet=\"chooserToolbarTpl\" />}@if (panelVisible()) {<ng-container *ngTemplateOutlet=\"panelRowAreaTpl()\" />} @else if (!chooserInCorner()) {{{ m.cornerText }}}</th>\r\n }\r\n @for (cell of hr; track $index) {\r\n <th\r\n class=\"nxe-pivot-col-header\"\r\n role=\"columnheader\"\r\n [class.nxe-pivot-grandtotal]=\"cell.isGrandTotal\"\r\n [class.nxe-pivot-total]=\"cell.isTotal\"\r\n [class.nxe-row-total]=\"cell.isGrandTotal || cell.isTotal\"\r\n [class.nxe-grandtotal]=\"cell.isGrandTotal\"\r\n [class.nxe-total]=\"cell.isTotal\"\r\n [class.nxe-pivotgrid-expanded]=\"cell.expandable && cell.expanded\"\r\n [class.nxe-pivotgrid-collapsed]=\"cell.expandable && !cell.expanded\"\r\n [attr.colspan]=\"cell.colspan\"\r\n [attr.rowspan]=\"cell.rowspan && cell.rowspan > 1 ? cell.rowspan : null\"\r\n [attr.tabindex]=\"cell.expandable ? 0 : null\"\r\n [attr.aria-expanded]=\"cell.expandable ? cell.expanded === true : null\"\r\n (click)=\"onColHeaderCellClick($event, cell)\"\r\n (keydown.enter)=\"cell.expandable && onExpandKey($event, cell.pathKey ?? '', cell.expanded === true)\"\r\n (keydown.space)=\"cell.expandable && onExpandKey($event, cell.pathKey ?? '', cell.expanded === true)\">\r\n @if (cell.expandable) {\r\n <span\r\n class=\"nxe-pivot-expand nxe-expand-icon-container\"\r\n [class.nxe-pivot-expanded]=\"cell.expanded\"\r\n (click)=\"onColExpandClick($event, cell)\"><span class=\"nxe-expand\" aria-hidden=\"true\"></span></span>\r\n }<span class=\"nxe-pivot-col-label\">{{ cell.text }}</span></th>\r\n }\r\n </tr>\r\n }\r\n </thead>\r\n <tbody>\r\n <!-- W4 Lane 3: `viewRows()` is the rendered row window ({row, ri} with ri = MODEL row\r\n index — matrix addressing must not shift). All rows unless nxe-scrolling\r\n mode=\"virtual\" arms tree-scoped windowing; the spacer rows stand in for the\r\n unrendered rows so the scrollbar geometry stays true. -->\r\n @if (topSpacerH() > 0) {\r\n <tr class=\"nxe-pivot-vspacer\" aria-hidden=\"true\"><td [attr.colspan]=\"totalColCount()\" [style.height.px]=\"topSpacerH()\"></td></tr>\r\n }\r\n @for (entry of viewRows(); track entry.row.trackKey ?? entry.row.pathKey) {\r\n @let row = entry.row;\r\n @let ri = entry.ri;\r\n <tr class=\"nxe-pivot-row\" role=\"row\" [class.nxe-pivot-total-row]=\"row.kind === 'T'\">\r\n @if (m.rowHeaderLayout === 'tree') {\r\n @if (row.measureRowspan !== 0) {\r\n <th\r\n class=\"nxe-pivot-row-header\"\r\n role=\"rowheader\"\r\n [attr.rowspan]=\"row.measureRowspan && row.measureRowspan > 1 ? row.measureRowspan : null\"\r\n [style.padding-left.px]=\"10 + row.level * 16\"\r\n [attr.tabindex]=\"row.hasChildren ? 0 : null\"\r\n [attr.aria-expanded]=\"row.hasChildren ? row.expanded : null\"\r\n (click)=\"onRowHeaderCellClick($event, row, null)\"\r\n (keydown.enter)=\"row.hasChildren && onExpandKey($event, row.pathKey, row.expanded)\"\r\n (keydown.space)=\"row.hasChildren && onExpandKey($event, row.pathKey, row.expanded)\">\r\n @if (row.hasChildren) {\r\n <span\r\n class=\"nxe-pivot-expand nxe-expand-icon-container\"\r\n [class.nxe-pivot-expanded]=\"row.expanded\"\r\n (click)=\"onRowExpandClick($event, row, null)\"><span class=\"nxe-expand\" aria-hidden=\"true\"></span></span>\r\n }\r\n <span class=\"nxe-pivot-row-label\">{{ row.label }}</span>\r\n </th>\r\n }\r\n @if (row.measureCaption !== undefined) {\r\n <th\r\n class=\"nxe-pivot-row-header nxe-pivot-measure-header\"\r\n role=\"rowheader\"\r\n [class.nxe-pivot-total]=\"row.kind === 'T'\"\r\n [class.nxe-row-total]=\"row.kind === 'T'\"\r\n [class.nxe-total]=\"row.kind === 'T'\"\r\n (click)=\"onMeasureCellClick($event, row)\">{{ row.measureCaption }}</th>\r\n }\r\n } @else {\r\n @for (hc of row.headerCells; track $index) {\r\n <th\r\n class=\"nxe-pivot-row-header\"\r\n role=\"rowheader\"\r\n [class.nxe-pivot-total]=\"hc.isTotal\"\r\n [class.nxe-row-total]=\"hc.isTotal\"\r\n [class.nxe-total]=\"hc.isTotal\"\r\n [class.nxe-pivotgrid-expanded]=\"hc.expandable && hc.expanded\"\r\n [class.nxe-pivotgrid-collapsed]=\"hc.expandable && !hc.expanded\"\r\n [attr.rowspan]=\"hc.rowspan > 1 ? hc.rowspan : null\"\r\n [attr.colspan]=\"hc.colspan > 1 ? hc.colspan : null\"\r\n [attr.tabindex]=\"hc.expandable ? 0 : null\"\r\n [attr.aria-expanded]=\"hc.expandable ? hc.expanded : null\"\r\n (click)=\"onRowHeaderCellClick($event, row, hc)\"\r\n (keydown.enter)=\"hc.expandable && onExpandKey($event, hc.pathKey, hc.expanded)\"\r\n (keydown.space)=\"hc.expandable && onExpandKey($event, hc.pathKey, hc.expanded)\">\r\n @if (hc.expandable) {\r\n <span\r\n class=\"nxe-pivot-expand nxe-expand-icon-container\"\r\n [class.nxe-pivot-expanded]=\"hc.expanded\"\r\n (click)=\"onRowExpandClick($event, row, hc)\"><span class=\"nxe-expand\" aria-hidden=\"true\"></span></span>\r\n }\r\n @if (hc.isTotal) {\r\n {{ hc.text }}\r\n } @else {\r\n <span class=\"nxe-pivot-row-label\">{{ hc.text }}</span>\r\n }\r\n </th>\r\n }\r\n }\r\n @for (leaf of m.leaves; track $index; let li = $index) {\r\n <td\r\n class=\"nxe-pivot-data\"\r\n role=\"gridcell\"\r\n [class.nxe-pivot-total]=\"row.kind === 'T' || leaf.kind === 'T'\"\r\n [class.nxe-total]=\"row.kind === 'T' || leaf.kind === 'T'\"\r\n [class.nxe-row-total]=\"row.kind === 'T'\"\r\n [class.nxe-pivot-grandtotal]=\"leaf.isGrandTotal\"\r\n [class.nxe-grandtotal]=\"leaf.isGrandTotal\"\r\n (click)=\"onDataCellClick($event, ri, li)\">{{ m.textMatrix[ri][li] }}</td>\r\n }\r\n </tr>\r\n }\r\n @if (bottomSpacerH() > 0) {\r\n <tr class=\"nxe-pivot-vspacer\" aria-hidden=\"true\"><td [attr.colspan]=\"totalColCount()\" [style.height.px]=\"bottomSpacerH()\"></td></tr>\r\n }\r\n @if (m.grandTotalRows; as gtr) {\r\n @for (g of gtr; track g.dataIndex; let first = $first) {\r\n <tr class=\"nxe-pivot-row nxe-pivot-grandtotal-row\" role=\"row\">\r\n @if (first) {\r\n <th\r\n class=\"nxe-pivot-row-header nxe-pivot-grandtotal nxe-row-total nxe-grandtotal\"\r\n role=\"rowheader\"\r\n [attr.rowspan]=\"gtr.length > 1 ? gtr.length : null\"\r\n [attr.colspan]=\"m.rowHeaderColCount - 1 > 1 ? m.rowHeaderColCount - 1 : null\"\r\n (click)=\"onGtHeaderCellClick($event, m.texts.grandTotal)\">{{ m.texts.grandTotal }}</th>\r\n }\r\n <th\r\n class=\"nxe-pivot-row-header nxe-pivot-measure-header nxe-pivot-grandtotal nxe-row-total nxe-grandtotal\"\r\n role=\"rowheader\"\r\n (click)=\"onGtHeaderCellClick($event, g.caption)\">{{ g.caption }}</th>\r\n @for (gc of g.cells; track $index; let li = $index) {\r\n <td\r\n class=\"nxe-pivot-data nxe-pivot-grandtotal nxe-grandtotal nxe-row-total\"\r\n role=\"gridcell\"\r\n [class.nxe-total]=\"m.leaves[li].kind === 'T'\"\r\n (click)=\"onGtDataCellClick($event, li, g.dataIndex, gc.value, gc.text)\">{{ gc.text }}</td>\r\n }\r\n </tr>\r\n }\r\n } @else if (m.grandTotalCells; as gt) {\r\n <tr class=\"nxe-pivot-row nxe-pivot-grandtotal-row\" role=\"row\">\r\n <th\r\n class=\"nxe-pivot-row-header nxe-pivot-grandtotal nxe-row-total nxe-grandtotal\"\r\n role=\"rowheader\"\r\n [attr.colspan]=\"m.rowHeaderColCount > 1 ? m.rowHeaderColCount : null\"\r\n (click)=\"onGtHeaderCellClick($event, m.texts.grandTotal)\">{{ m.texts.grandTotal }}</th>\r\n @for (gc of gt; track $index; let li = $index) {\r\n <td\r\n class=\"nxe-pivot-data nxe-pivot-grandtotal nxe-grandtotal nxe-row-total\"\r\n role=\"gridcell\"\r\n [class.nxe-total]=\"m.leaves[li].kind === 'T'\"\r\n (click)=\"onGtDataCellClick($event, li, m.leaves[li].dataIndex, gc.value, gc.text)\">{{ gc.text }}</td>\r\n }\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n <!-- dx `.dx-pivotgrid-nodata` (gridCoreUtils.renderNoDataText): a <span>, shown when the\r\n data source isEmpty(), centered over the widget by the dx.light absolute rule. -->\r\n @if (showNoData()) {\r\n <span class=\"nxe-pivotgrid-nodata\">{{ m.texts.noData }}</span>\r\n }\r\n </div>\r\n} @else {\r\n <div class=\"nxe-pivotgrid-empty\"></div>\r\n}\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\n// nxe-chart — drop-in for DevExtreme `dx-chart` (the only usage is a `type=\"bar\"` chart fed by\r\n// `pivotGrid.bindChart(chart.instance, …)`). Renders a lightweight grouped SVG bar chart from the\r\n// series the pivot pushes via the `.instance.render()` facade. The two chart pages (analytics,\r\n// form-report) are currently dormant (their pivot data is commented out) so this renders empty in\r\n// practice, but the implementation is real so it works if that data is ever re-enabled.\r\n\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n contentChild,\r\n input,\r\n signal,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { NxeChartInstance, NxeChartSeries } from './nxe-pivot.types';\r\n\r\n/** `dxo-common-series-settings` — the series type (only `bar` is used). */\r\n@Component({\r\n selector: 'nxe-common-series-settings',\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 NxeCommonSeriesSettingsComponent {\r\n readonly type = input<'bar' | 'line' | 'spline' | 'area'>('bar');\r\n readonly argumentField = input<string | undefined>(undefined);\r\n readonly valueField = input<string | undefined>(undefined);\r\n}\r\n\r\n/** `dxo-size` — fixed chart height. */\r\n@Component({\r\n selector: 'nxe-size',\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 NxeSizeComponent {\r\n readonly width = input<number | undefined>(undefined);\r\n readonly height = input<number | undefined>(undefined);\r\n}\r\n\r\n/** `dxo-adaptive-layout` — responsive breakpoint width (the chart fills its container above it). */\r\n@Component({\r\n selector: 'nxe-adaptive-layout',\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 NxeAdaptiveLayoutComponent {\r\n readonly width = input<number | undefined>(undefined);\r\n readonly height = input<number | undefined>(undefined);\r\n readonly keepLabels = input(true);\r\n}\r\n\r\ninterface BarRect {\r\n x: number;\r\n y: number;\r\n w: number;\r\n h: number;\r\n fill: string;\r\n}\r\n\r\n/** DevExtreme's default (\"Material\") series palette — first 10 colours. */\r\nconst PALETTE = [\r\n '#1db2f5',\r\n '#fc5c5c',\r\n '#97c95c',\r\n '#ffc208',\r\n '#9b59b6',\r\n '#1c98e6',\r\n '#ff8f00',\r\n '#26a69a',\r\n '#ec407a',\r\n '#7e57c2',\r\n];\r\n\r\n@Component({\r\n selector: 'nxe-chart',\r\n standalone: true,\r\n templateUrl: './nxe-chart.component.html',\r\n styleUrl: './nxe-chart.component.scss',\r\n host: { class: 'nxe-widget nxe-chart' },\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class NxeChartComponent {\r\n readonly dataSource = input<NxeChartSeries | null | undefined>(null);\r\n\r\n protected readonly commonSeries = contentChild(NxeCommonSeriesSettingsComponent);\r\n protected readonly size = contentChild(NxeSizeComponent);\r\n protected readonly adaptiveLayout = contentChild(NxeAdaptiveLayoutComponent);\r\n\r\n /** Series pushed by `pivotGrid.bindChart(...)`; falls back to the `[dataSource]` input. */\r\n private readonly pushed = signal<NxeChartSeries | null>(null);\r\n\r\n protected readonly series = computed<NxeChartSeries | null>(\r\n () => this.pushed() ?? this.dataSource() ?? null,\r\n );\r\n\r\n protected readonly chartHeight = computed(() => this.size()?.height() ?? 200);\r\n protected readonly chartWidth = computed(() => {\r\n const s = this.series();\r\n const min = this.adaptiveLayout()?.width() ?? 450;\r\n const cats = s?.categories.length ?? 0;\r\n return Math.max(min, cats * 56 + 60);\r\n });\r\n\r\n protected readonly hasData = computed(() => {\r\n const s = this.series();\r\n return !!s && s.categories.length > 0 && s.series.some((ss) => ss.values.length > 0);\r\n });\r\n\r\n private readonly PAD = { left: 44, right: 12, top: 12, bottom: 28 };\r\n\r\n protected readonly bars = computed<BarRect[]>(() => {\r\n const s = this.series();\r\n if (!s || !this.hasData()) {\r\n return [];\r\n }\r\n const w = this.chartWidth();\r\n const h = this.chartHeight();\r\n const plotW = w - this.PAD.left - this.PAD.right;\r\n const plotH = h - this.PAD.top - this.PAD.bottom;\r\n const cats = s.categories.length;\r\n const seriesCount = Math.max(1, s.series.length);\r\n\r\n let max = 0;\r\n for (const ss of s.series) {\r\n for (const v of ss.values) {\r\n if (v > max) max = v;\r\n }\r\n }\r\n if (max <= 0) {\r\n max = 1;\r\n }\r\n\r\n const groupW = plotW / cats;\r\n const innerPad = groupW * 0.15;\r\n const barW = (groupW - innerPad * 2) / seriesCount;\r\n\r\n const out: BarRect[] = [];\r\n for (let c = 0; c < cats; c++) {\r\n for (let si = 0; si < s.series.length; si++) {\r\n const val = s.series[si].values[c] ?? 0;\r\n const bh = Math.max(0, (val / max) * plotH);\r\n out.push({\r\n x: this.PAD.left + c * groupW + innerPad + si * barW,\r\n y: this.PAD.top + (plotH - bh),\r\n w: Math.max(1, barW - 1),\r\n h: bh,\r\n fill: PALETTE[si % PALETTE.length],\r\n });\r\n }\r\n }\r\n return out;\r\n });\r\n\r\n protected readonly legend = computed(() => {\r\n const s = this.series();\r\n if (!s) {\r\n return [];\r\n }\r\n return s.series.map((ss, i) => ({ name: ss.name, fill: PALETTE[i % PALETTE.length] }));\r\n });\r\n\r\n protected readonly baselineY = computed(() => this.chartHeight() - this.PAD.bottom);\r\n protected readonly axisLeft = computed(() => this.PAD.left);\r\n protected readonly axisRight = computed(() => this.chartWidth() - this.PAD.right);\r\n\r\n // --- DevExtreme `.instance` facade (target of `pivotGrid.bindChart`) -----------------------\r\n private readonly facade: NxeChartInstance = {\r\n _isNxeChart: true,\r\n render: (s: NxeChartSeries) => this.pushed.set(s),\r\n };\r\n\r\n get instance(): NxeChartInstance {\r\n return this.facade;\r\n }\r\n}\r\n","<div class=\"nxe-chart-host\" [style.height.px]=\"chartHeight()\">\r\n @if (hasData()) {\r\n <div class=\"nxe-chart-plot\">\r\n <svg\r\n [attr.width]=\"chartWidth()\"\r\n [attr.height]=\"chartHeight()\"\r\n [attr.viewBox]=\"'0 0 ' + chartWidth() + ' ' + chartHeight()\"\r\n class=\"nxe-chart-svg\">\r\n <!-- baseline -->\r\n <line\r\n [attr.x1]=\"axisLeft()\"\r\n [attr.x2]=\"axisRight()\"\r\n [attr.y1]=\"baselineY()\"\r\n [attr.y2]=\"baselineY()\"\r\n class=\"nxe-chart-axis\" />\r\n @for (b of bars(); track $index) {\r\n <rect [attr.x]=\"b.x\" [attr.y]=\"b.y\" [attr.width]=\"b.w\" [attr.height]=\"b.h\" [attr.fill]=\"b.fill\" />\r\n }\r\n </svg>\r\n </div>\r\n <div class=\"nxe-chart-legend\">\r\n @for (item of legend(); track $index) {\r\n <span class=\"nxe-chart-legend-item\">\r\n <span class=\"nxe-chart-legend-swatch\" [style.background]=\"item.fill\"></span>\r\n {{ item.name }}\r\n </span>\r\n }\r\n </div>\r\n } @else {\r\n <div class=\"nxe-chart-empty\"></div>\r\n }\r\n</div>\r\n","// @nexterajs/ui/pivot — public API.\r\nexport * from './lib/grid/nxe-pivot-excel-export';\r\nexport * from './lib/grid/nxe-pivot.types';\r\nexport * from './lib/grid/nxe-pivot-data-source';\r\nexport * from './lib/grid/nxe-pivot-grid.component';\r\nexport * from './lib/grid/nxe-pivot-field-panel.component';\r\nexport * from './lib/grid/nxe-pivot-field-chip.component';\r\nexport * from './lib/grid/nxe-pivot-field-chooser.component';\r\nexport * from './lib/grid/nxe-pivot-config.components';\r\nexport * from './lib/grid/nxe-chart.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-pivot.mjs","sources":["../../../projects/nextera-ui/pivot/src/lib/grid/nxe-pivot-excel-export.ts","../../../projects/nextera-ui/pivot/src/lib/grid/nxe-pivot.types.ts","../../../projects/nextera-ui/pivot/src/lib/grid/nxe-pivot-axis.ts","../../../projects/nextera-ui/pivot/src/lib/grid/nxe-pivot-summary.ts","../../../projects/nextera-ui/pivot/src/lib/grid/nxe-pivot-data-source.ts","../../../projects/nextera-ui/pivot/src/lib/grid/nxe-pivot-config.components.ts","../../../projects/nextera-ui/pivot/src/lib/grid/nxe-pivot-field-chip.component.ts","../../../projects/nextera-ui/pivot/src/lib/grid/nxe-pivot-field-panel.component.ts","../../../projects/nextera-ui/pivot/src/lib/grid/nxe-pivot-field-panel.component.html","../../../projects/nextera-ui/pivot/src/lib/grid/nxe-pivot-field-chooser.component.ts","../../../projects/nextera-ui/pivot/src/lib/grid/nxe-pivot-field-chooser.component.html","../../../projects/nextera-ui/pivot/src/lib/grid/nxe-pivot-grid.component.ts","../../../projects/nextera-ui/pivot/src/lib/grid/nxe-pivot-grid.component.html","../../../projects/nextera-ui/pivot/src/lib/grid/nxe-chart.component.ts","../../../projects/nextera-ui/pivot/src/lib/grid/nxe-chart.component.html","../../../projects/nextera-ui/pivot/src/public-api.ts","../../../projects/nextera-ui/pivot/src/nexterajs-ui-pivot.ts"],"sourcesContent":["// Pivot half of the Excel exporter, split out of grid/nxe-excel-export.service.ts so that\r\n// `grid` does not depend on `pivot` (pivot already depends on grid, and ng-packagr rejects\r\n// a cycle between entry points). Behaviour is unchanged; only the file boundary moved.\r\nimport { Injectable } from '@angular/core';\r\nimport type { Worksheet } from '@nexterajs/ui/excel';\r\nimport { exportNxeGridToExcel } from '@nexterajs/ui/grid';\r\nimport type { NxeExcelExportOptions, NxeGridInstance } from '@nexterajs/ui/grid';\r\nimport type { NxePivotGridInstance } from './nxe-pivot.types';\r\n/** Options for {@link exportPivotGrid} — mirrors DevExtreme's `exportPivotGrid({component, worksheet})`. */\r\nexport interface NxeExportPivotGridOptions {\r\n component: NxePivotGridInstance;\r\n /** exceljs `Worksheet` or the in-house one (structural cousins, loosely typed). */\r\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\r\n worksheet: any;\r\n /** 1-based {row, column} the cross-tab starts at (default top-left of the sheet). */\r\n topLeftCell?: { row: number; column: number };\r\n}\r\n\r\nconst HEADER_FILL = {\r\n type: 'pattern' as const,\r\n pattern: 'solid' as const,\r\n fgColor: { argb: 'FFF2F2F2' },\r\n};\r\n\r\n/**\r\n * Replacement for DevExtreme's `exportPivotGrid({component, worksheet})` (from\r\n * `devextreme/excel_exporter`). Walks the pivot's computed cross-tab model — stacked column\r\n * headers (colspan AND rowspan merges — N-level column hierarchies, subtotal/grand-total\r\n * columns, P2-C2), the row headers (standard layout: one column per row field with\r\n * rowspan/colspan merges + \"{value} Total\" rows; tree layout: one indented column), the data\r\n * cells, and the grand-total footer — into the supplied exceljs worksheet, then resolves. The\r\n * caller keeps the surrounding `formatExcel(workbook)` + `writeBuffer()` + `saveAs()` pipeline\r\n * unchanged (drop-in import swap).\r\n */\r\nexport async function exportPivotGrid(opts: NxeExportPivotGridOptions): Promise<void> {\r\n const ws = opts.worksheet;\r\n const model = opts.component.getExportModel();\r\n if (!model) {\r\n return;\r\n }\r\n const r0 = opts.topLeftCell?.row ?? 1;\r\n const c0 = opts.topLeftCell?.column ?? 1;\r\n // W4 Lane 4: dx exports column widths (exceljs export.js `setColumnsWidth`:\r\n // `Math.min(255, Math.floor(px / 7 * 100) / 100)` — 7 = MAX_DIGIT_WIDTH_IN_PIXELS).\r\n // dx measures its rendered areas; a page-less nxe export has no layout to measure, so the\r\n // CONFIGURED `field.width` columns (model.colWidths) export and the rest keep Excel's\r\n // default (DEFAULTS.md).\r\n if (typeof ws.getColumn === 'function') {\r\n model.colWidths.forEach((w, i) => {\r\n if (typeof w === 'number' && isFinite(w)) {\r\n ws.getColumn(c0 + i).width = Math.min(255, Math.floor((w / 7) * 100) / 100);\r\n }\r\n });\r\n }\r\n const headerRowCount = model.columnHeaderRows.length;\r\n const standard = model.rowHeaderLayout === 'standard';\r\n // The model resolves the count for BOTH layouts (tree = 1, +1 when measures live on rows).\r\n const rowHeaderCols = model.rowHeaderColCount;\r\n\r\n const setHeader = (cell: ReturnType<Worksheet['getCell']>, text: string) => {\r\n cell.value = text;\r\n cell.font = { name: 'Calibri Light', bold: true };\r\n cell.fill = HEADER_FILL;\r\n cell.alignment = { horizontal: 'center', vertical: 'middle' };\r\n };\r\n\r\n // Top-left corner — spans the row-header column(s) × all header rows.\r\n const corner = ws.getCell(r0, c0);\r\n setHeader(corner, model.cornerText);\r\n corner.alignment = { horizontal: 'left', vertical: 'middle' };\r\n if (headerRowCount > 1 || rowHeaderCols > 1) {\r\n ws.mergeCells(r0, c0, r0 + headerRowCount - 1, c0 + rowHeaderCols - 1);\r\n }\r\n\r\n // Column headers — each row of {text, colspan, rowspan?} laid out left→right after the\r\n // corner. `covered` tracks columns still occupied by an earlier row's rowspan (a\r\n // \"{value} Total\" / Grand Total / collapsed-parent cell filling the remaining value rows),\r\n // so multi-level column hierarchies land in the right worksheet columns.\r\n const covered = new Map<number, number>(); // worksheet column → covered through header row\r\n model.columnHeaderRows.forEach((hr, hi) => {\r\n let col = c0 + rowHeaderCols;\r\n for (const hcell of hr) {\r\n while ((covered.get(col) ?? 0) > hi) {\r\n col++;\r\n }\r\n const cell = ws.getCell(r0 + hi, col);\r\n setHeader(cell, hcell.text);\r\n const rs = hcell.rowspan ?? 1;\r\n if (hcell.colspan > 1 || rs > 1) {\r\n ws.mergeCells(r0 + hi, col, r0 + hi + rs - 1, col + hcell.colspan - 1);\r\n }\r\n if (rs > 1) {\r\n for (let cc = col; cc < col + hcell.colspan; cc++) {\r\n covered.set(cc, hi + rs);\r\n }\r\n }\r\n col += hcell.colspan;\r\n }\r\n });\r\n\r\n // Body.\r\n let rowNum = r0 + headerRowCount;\r\n const writeValueCells = (\r\n valueFor: (li: number) => number | null,\r\n textFor: (li: number) => string,\r\n dataIndexFor?: (li: number) => number,\r\n ) => {\r\n model.leaves.forEach((leaf, li) => {\r\n // Measures-on-rows: the ROW owns the data index (formats/masks per measure row).\r\n const di = dataIndexFor ? dataIndexFor(li) : leaf.dataIndex;\r\n const cell = ws.getCell(rowNum, c0 + rowHeaderCols + li);\r\n const v = valueFor(li);\r\n if (v != null) {\r\n const mask = model.numFmt(di);\r\n if (typeof v !== 'number') {\r\n // W4 Lane 4: a custom summary's non-numeric totalValue (dx renders it\r\n // as-is) — export its display text, never a number mask over a string.\r\n cell.value = textFor(li);\r\n } else if (mask) {\r\n cell.value = v;\r\n cell.numFmt = mask.replace(/'/g, '\"');\r\n } else if (model.dataFields[di]?.format) {\r\n // A format no Excel mask can express (e.g. `{ formatter }`) → export its text.\r\n cell.value = textFor(li);\r\n } else {\r\n cell.value = v;\r\n }\r\n }\r\n cell.alignment = { horizontal: 'right' };\r\n });\r\n };\r\n\r\n model.rows.forEach((row, ri) => {\r\n if (standard) {\r\n // One worksheet cell per rendered row-header cell, merged over its span — the same\r\n // rowspan/colspan map the DOM renders (parent labels attach to their first child\r\n // row; measures-on-rows caption cells are ordinary headerCells here too).\r\n for (const hc of row.headerCells) {\r\n const labelCell = ws.getCell(rowNum, c0 + hc.col);\r\n labelCell.value = hc.text;\r\n labelCell.font = { name: 'Calibri Light', bold: hc.isTotal };\r\n if (hc.rowspan > 1 || hc.colspan > 1) {\r\n ws.mergeCells(\r\n rowNum,\r\n c0 + hc.col,\r\n rowNum + hc.rowspan - 1,\r\n c0 + hc.col + hc.colspan - 1,\r\n );\r\n }\r\n }\r\n } else {\r\n // Tree layout: the indented label lands only on the FIRST measure row of a split\r\n // node (measureRowspan 0 = continuation row); the measure caption gets its own\r\n // column, exactly as the DOM renders.\r\n if (row.measureRowspan !== 0) {\r\n const labelCell = ws.getCell(rowNum, c0);\r\n labelCell.value = ' '.repeat(Math.max(0, row.level)) + row.label;\r\n labelCell.font = { name: 'Calibri Light', bold: row.level === 0 };\r\n if (row.measureRowspan && row.measureRowspan > 1) {\r\n ws.mergeCells(rowNum, c0, rowNum + row.measureRowspan - 1, c0);\r\n }\r\n }\r\n if (row.measureCaption !== undefined) {\r\n const measureCell = ws.getCell(rowNum, c0 + rowHeaderCols - 1);\r\n measureCell.value = row.measureCaption;\r\n measureCell.font = { name: 'Calibri Light', bold: row.kind === 'T' };\r\n }\r\n }\r\n // Body values come straight from the dense matrix (built once in getModel()).\r\n writeValueCells(\r\n (li) => model.matrix[ri][li],\r\n (li) => model.textMatrix[ri][li],\r\n row.dataIndex !== undefined ? () => row.dataIndex! : undefined,\r\n );\r\n rowNum++;\r\n });\r\n if (model.grandTotalRows) {\r\n // Measures-on-rows footer: one worksheet row per measure; the Grand Total label spans\r\n // the dimension columns × measure rows, captions fill the measure column.\r\n const firstFooterRow = rowNum;\r\n const dimCols = Math.max(1, rowHeaderCols - 1);\r\n for (const g of model.grandTotalRows) {\r\n if (rowNum === firstFooterRow) {\r\n const labelCell = ws.getCell(rowNum, c0);\r\n labelCell.value = model.texts.grandTotal;\r\n labelCell.font = { name: 'Calibri Light', bold: true };\r\n }\r\n const captionCell = ws.getCell(rowNum, c0 + dimCols);\r\n captionCell.value = g.caption;\r\n captionCell.font = { name: 'Calibri Light', bold: true };\r\n writeValueCells(\r\n (li) => g.cells[li].value,\r\n (li) => g.cells[li].text,\r\n () => g.dataIndex,\r\n );\r\n rowNum++;\r\n }\r\n if (rowNum - firstFooterRow > 1 || dimCols > 1) {\r\n ws.mergeCells(firstFooterRow, c0, rowNum - 1, c0 + dimCols - 1);\r\n }\r\n } else if (model.grandTotalCells) {\r\n const labelCell = ws.getCell(rowNum, c0);\r\n labelCell.value = model.texts.grandTotal;\r\n labelCell.font = { name: 'Calibri Light', bold: true };\r\n if (rowHeaderCols > 1) {\r\n ws.mergeCells(rowNum, c0, rowNum, c0 + rowHeaderCols - 1);\r\n }\r\n writeValueCells(\r\n (li) => model.grandTotalCells![li].value,\r\n (li) => model.grandTotalCells![li].text,\r\n );\r\n rowNum++;\r\n }\r\n}\r\n\r\n/** Injectable wrapper for {@link exportNxeGridToExcel} / {@link exportPivotGrid}. */\r\n@Injectable({ providedIn: 'root' })\r\nexport class NxeExcelExportService {\r\n exportDataGrid(grid: NxeGridInstance, opts: NxeExcelExportOptions): Promise<void> {\r\n return exportNxeGridToExcel(grid, opts);\r\n }\r\n\r\n exportPivotGrid(opts: NxeExportPivotGridOptions): Promise<void> {\r\n return exportPivotGrid(opts);\r\n }\r\n}\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\n// Types for the nxe-pivot-grid + nxe-chart subsystem — an in-house 2D cross-tab engine that\r\n// replaces DevExtreme's `nxe-pivot-grid` / `PivotGridDataSource`. Per plan deviation #6 this\r\n// implements the simplified surface the app actually uses: ≤2 row levels, 1 column level,\r\n// data fields nested as the inner column level (`dataFieldArea` defaults to `'column'`), and\r\n// `sum`/`count`/`min`/`max`/`avg` aggregation (the app only uses `sum`).\r\n\r\nimport { NxeColumnFormat } from '@nexterajs/ui/grid';\r\nimport { NxeNumberSeparators } from '@nexterajs/ui/intl';\r\n\r\nexport type NxePivotArea = 'row' | 'column' | 'data' | 'filter';\r\nexport type NxePivotSummaryType = 'sum' | 'count' | 'min' | 'max' | 'avg' | 'custom';\r\n\r\n/** dx `summaryDisplayMode` values (P2-C3; transcribed from m_summary_display_modes.js). */\r\nexport type NxePivotSummaryDisplayMode =\r\n | 'absoluteVariation'\r\n | 'percentVariation'\r\n | 'percentOfColumnTotal'\r\n | 'percentOfRowTotal'\r\n | 'percentOfColumnGrandTotal'\r\n | 'percentOfRowGrandTotal'\r\n | 'percentOfGrandTotal';\r\n\r\n/** dx date `groupInterval` names (m_local_store `DATE_INTERVAL_SELECTORS`); numbers = step. */\r\nexport type NxePivotGroupInterval = 'year' | 'quarter' | 'month' | 'day' | 'dayOfWeek' | number;\r\n\r\n/**\r\n * The `e` object a `calculateSummaryValue` callback receives — dx `SummaryCell` (P2-C3,\r\n * transcribed method-for-method from m_summary_display_modes.js over the engine's visible-tree\r\n * cell store; the display modes and running totals run on the very same machinery). `parent()`\r\n * of a top-level cell is the grand total on that axis; `parent()` of the grand total is null.\r\n * `value()` reads the ORIGINAL aggregate, `value(true)` the post-processed one; a\r\n * row/column/data field (object, or dataField/caption/name id) reads that field's value at the\r\n * cell's path instead.\r\n */\r\nexport interface NxePivotSummaryCell {\r\n parent(direction: 'row' | 'column'): NxePivotSummaryCell | null;\r\n children(direction: 'row' | 'column'): NxePivotSummaryCell[];\r\n child(direction: 'row' | 'column', fieldValue: any): NxePivotSummaryCell | null;\r\n grandTotal(direction?: 'row' | 'column'): NxePivotSummaryCell;\r\n next(direction: 'row' | 'column', allowCrossGroup?: boolean): NxePivotSummaryCell | null;\r\n prev(direction: 'row' | 'column', allowCrossGroup?: boolean): NxePivotSummaryCell | null;\r\n field(area: 'row' | 'column' | 'data'): NxePivotField | null;\r\n slice(field: NxePivotField | string | number, value: any): NxePivotSummaryCell | null;\r\n value(fieldOrCalculated?: NxePivotField | string | number | boolean, isCalculatedValue?: boolean): any;\r\n isPostProcessed(field?: NxePivotField | string | number): boolean;\r\n}\r\n\r\n/**\r\n * The options object dx threads through a `calculateCustomSummary` callback (transcribed from\r\n * DevExtreme 24.2.3 local_store/m_local_store `getAggregator`): ONE object per cell, mutated in\r\n * place across the whole protocol — `{summaryProcess:'start', totalValue:undefined}` first, then\r\n * per defined raw value `summaryProcess='calculate'` + `value`, then `summaryProcess='finalize'`\r\n * with `value` DELETED; the cell renders whatever `totalValue` holds after 'finalize'.\r\n */\r\nexport interface NxePivotCustomSummaryInfo {\r\n summaryProcess: 'start' | 'calculate' | 'finalize';\r\n /** The current record's raw value — present only during 'calculate' (deleted for 'finalize'). */\r\n value?: any;\r\n /** The accumulator/result — whatever the callback leaves here after 'finalize' is the cell. */\r\n totalValue?: any;\r\n}\r\n\r\n/** A DevExtreme PivotGrid field descriptor (the subset the app passes). */\r\nexport interface NxePivotField {\r\n caption?: string;\r\n dataField?: string;\r\n dataType?: 'string' | 'number' | 'date' | 'boolean';\r\n /** Placement; a field with no `area` is defined-but-not-displayed (DevExtreme parity). */\r\n area?: NxePivotArea;\r\n areaIndex?: number;\r\n summaryType?: NxePivotSummaryType;\r\n /** dx custom-summary protocol — used when `summaryType === 'custom'` (see the info type). */\r\n calculateCustomSummary?: (options: NxePivotCustomSummaryInfo) => void;\r\n /** Number-mask string (`#,##0.00`), date format string, or `{ type }`. */\r\n format?: NxeColumnFormat;\r\n expanded?: boolean;\r\n sortOrder?: 'asc' | 'desc';\r\n /** dx: 'value' (default — raw values), 'displayText' (formatted/customizeText'd labels),\r\n * 'none' (load order). The local-store default is 'value' (XmlaStore's is 'displayText'). */\r\n sortBy?: 'value' | 'displayText' | 'none';\r\n /** Column width in px, applied to the field's area column(s) — row-header column for a row\r\n * field, every leaf data column for a data field (dx m_data_controller cell width). */\r\n width?: number;\r\n /** dx: `false` removes a row/column field from its axis entirely and hides a data field's\r\n * columns (dx keeps hidden measures aggregating for sortBySummaryField etc. — the nxe\r\n * engine has no such reader, so it drops them from the model wholesale). */\r\n visible?: boolean;\r\n /** dx: read INSTEAD of `dataField` wherever the field's raw value is taken from a record\r\n * (dimension grouping and measure aggregation both) — m_local_store `prepareFields` only\r\n * builds a dataField selector when none is given (a selector also disables\r\n * `groupInterval` bucketing entirely, exactly as dx skips such fields). */\r\n selector?: (data: any) => any;\r\n customizeText?: (cellInfo: { value: any; valueText: string }) => string;\r\n /** dx m_local_store `prepareFields` bucketing (P2-C3): on a `dataType: 'date'` field the\r\n * named interval replaces the raw value with `getFullYear()` / quarter 1-4 / month 1-12 /\r\n * day-of-month / `getDay()` 0-6; on a `dataType: 'number'` field a positive numeric step\r\n * groups to `Math.floor(value / step) * step` (labelled \"start - end\"). */\r\n groupInterval?: NxePivotGroupInterval;\r\n /** dx `summaryDisplayMode` (P2-C3): post-aggregation display expression over the visible\r\n * cross-tab. Percent modes default the field's format to dx's `'percent'` (precision 0)\r\n * when no explicit format exists. */\r\n summaryDisplayMode?: NxePivotSummaryDisplayMode;\r\n /** dx `calculateSummaryValue` (P2-C3): per-cell post-aggregation callback; wins over\r\n * `summaryDisplayMode`. Receives the dx-shaped {@link NxePivotSummaryCell}. */\r\n calculateSummaryValue?: (e: NxePivotSummaryCell) => any;\r\n /** dx `runningTotal` (P2-C3): accumulate along a 'row' (across columns) or a 'column'\r\n * (down rows), resetting at group boundaries unless `allowCrossGroupCalculation`. */\r\n runningTotal?: 'row' | 'column';\r\n /** dx `allowCrossGroupCalculation` (P2-C3): running totals / variation modes continue\r\n * across group boundaries instead of resetting. */\r\n allowCrossGroupCalculation?: boolean;\r\n /** dx `filterValues` (P2-C3): engine-side record filter, applied at intake before tree\r\n * building/aggregation — on row/column fields and on `area: 'filter'` fields alike. With\r\n * `groupInterval` set, values are compared against the GROUP value (dx filters through\r\n * the prepared selector). */\r\n filterValues?: any[];\r\n /** dx `filterType` (default 'include'): 'exclude' inverts the `filterValues` match. */\r\n filterType?: 'include' | 'exclude';\r\n [key: string]: any;\r\n}\r\n\r\n/**\r\n * P3-C2 (field panel) — one field's panel-owned override, keyed by the field's index in the\r\n * caller's `fields` array and merged over that field when the component constructs its engine.\r\n * The caller's field objects are NEVER mutated (report-output-pivot serializes its own fields\r\n * array in `onSave`); `area: null` marks a REMOVED field (P3-C3: the chooser's All-Fields\r\n * tree drop or checkbox uncheck — dx's only removal paths; a drop outside every area snaps\r\n * back and removes nothing) — the field leaves the layout but stays defined (dx: it remains\r\n * available in the field chooser).\r\n */\r\nexport interface NxePivotFieldOverride {\r\n area?: NxePivotArea | null;\r\n areaIndex?: number;\r\n sortOrder?: 'asc' | 'desc';\r\n expanded?: boolean;\r\n /** P3-C4 (chip header filter): the applied allowed-value list; `null` = the user explicitly\r\n * cleared the filter (full-check → OK), so a declarative `filterValues` seed on the\r\n * caller's field can't resurrect — the same null rule the grid's hfOverride uses. */\r\n filterValues?: any[] | null;\r\n /** Written alongside `filterValues` on apply (always 'include' — see DEFAULTS.md P3-C4). */\r\n filterType?: 'include' | 'exclude';\r\n}\r\n\r\n/** dx `dxPivotGrid.texts` — the subset the pivot renders (missing entries take the dx defaults). */\r\nexport interface NxePivotTexts {\r\n grandTotal?: string;\r\n /** Subtotal-row caption pattern (`{0}` = the closing value) — stored for future subtotal rows. */\r\n total?: string;\r\n noData?: string;\r\n}\r\n\r\n/** DevExtreme's default `texts`, applied wherever the host passes none. */\r\nexport const NXE_PIVOT_TEXTS_DEFAULTS: Required<NxePivotTexts> = {\r\n grandTotal: 'Grand Total',\r\n total: '{0} Total',\r\n noData: 'No data',\r\n};\r\n\r\n/** The plain `[dataSource]` config object the app binds (also accepted: a `NxePivotDataSource`). */\r\nexport interface NxePivotDataSourceOptions {\r\n /** Optional since P1-C3: with no/empty `fields` and `retrieveFields` not `false` (the dx\r\n * default), fields are derived from the store's first record — all area-less. */\r\n fields?: NxePivotField[];\r\n store?: any[];\r\n retrieveFields?: boolean;\r\n dataFieldArea?: 'row' | 'column';\r\n /**\r\n * Locale separators for rendered cell text. Supplied by the pivot component from\r\n * `NXE_NUMBER_SEPARATORS`; omitted means en-US, which is what the engine always did.\r\n */\r\n separators?: NxeNumberSeparators;\r\n}\r\n\r\n/**\r\n * A rendered column leaf = (column-path × data-field). Since P2-C2 the column axis is N-level:\r\n * `kind` mirrors the row kinds — 'D' a value column (a collapsed parent's inline-aggregate\r\n * column included), 'T' a \"{value} Total\" subtotal column closing an expanded parent, 'GT' the\r\n * grand-total column (`colPath: []`).\r\n */\r\nexport interface NxePivotColumnLeaf {\r\n colPath: any[];\r\n dataIndex: number;\r\n /** 'D' value column, 'T' \"{value} Total\" column, 'GT' the grand-total column. */\r\n kind: NxePivotRowKind;\r\n /** Namespaced expand key of the leaf's column node (opaque, `'c:'`…); `''` when no column\r\n * node backs the leaf (grand total / no column fields). */\r\n colKey: string;\r\n /** Level of the column node the leaf renders under (= `colPath.length - 1`; -1 for 'GT'\r\n * and for the no-column-field leaves). */\r\n level: number;\r\n /** Derived alias — `kind === 'GT'` (kept for the pre-P2-C2 model contract). */\r\n isGrandTotal: boolean;\r\n}\r\n\r\n/**\r\n * One column-header cell spanning `colspan` leaf columns. All header rows are DERIVED from the\r\n * leaf array by run-length encoding over consecutive leaves' `colPath` prefixes (P2-C2), so a\r\n * span can never misalign with the leaves beneath it. The optional keys are present ONLY when\r\n * meaningful (dx emits its attributes the same way): `rowspan` when > 1, `isTotal` on\r\n * \"{value} Total\" cells, and the expand trio on chevron cells.\r\n */\r\nexport interface NxePivotHeaderCell {\r\n text: string;\r\n colspan: number;\r\n isGrandTotal: boolean;\r\n /** Set when > 1: a 'T'/'GT'/collapsed-parent cell filling the remaining value rows (dx\r\n * `depthSize`, m_data_controller). */\r\n rowspan?: number;\r\n /** True on \"{value} Total\" cells (dx `dx-row-total nxe-total`, on both axes). */\r\n isTotal?: boolean;\r\n /** True when the cell carries an expand/collapse chevron (dx `dx-expand-icon-container`). */\r\n expandable?: boolean;\r\n expanded?: boolean;\r\n /** The column node's namespaced expand key — present exactly when `expandable`. */\r\n pathKey?: string;\r\n}\r\n\r\n/** dx `rowHeaderLayout` — 'standard' renders one row-header column per row field; 'tree' one indented column. */\r\nexport type NxePivotRowHeaderLayout = 'standard' | 'tree';\r\n\r\n/** dx `showTotalsPrior` — where total rows/columns render relative to the data they close. */\r\nexport type NxePivotTotalsPrior = 'none' | 'rows' | 'columns' | 'both';\r\n\r\n/** Body-row kind: 'D' data row, 'T' \"{value} Total\" subtotal row, 'GT' the grand-total footer. */\r\nexport type NxePivotRowKind = 'D' | 'T' | 'GT';\r\n\r\n/**\r\n * One row-header cell a body `<tr>` renders (standard layout). An EXPANDED parent's label cell\r\n * attaches to its first child's row and `rowspan`s the subtree (dx semantics: the parent\r\n * contributes no value row of its own); a collapsed parent / total label `colspan`s the\r\n * remaining row-header columns.\r\n */\r\nexport interface NxePivotRowHeaderCell {\r\n text: string;\r\n /** 0-based row-header column the cell starts in (= its node's level). */\r\n col: number;\r\n rowspan: number;\r\n colspan: number;\r\n /** True when the cell carries an expand/collapse chevron (a parent node's label). */\r\n expandable: boolean;\r\n expanded: boolean;\r\n /** True for a \"{value} Total\" label cell (dx `dx-row-total nxe-total`). */\r\n isTotal: boolean;\r\n pathKey: string;\r\n}\r\n\r\n/** A visible body row. `rows` carries kinds 'D'/'T' only — the grand total stays the footer. */\r\nexport interface NxePivotBodyRow {\r\n kind: NxePivotRowKind;\r\n label: string;\r\n level: number;\r\n path: any[];\r\n pathKey: string;\r\n hasChildren: boolean;\r\n expanded: boolean;\r\n /** Derived alias — `kind === 'GT'` (always false in `rows`; kept for facade parity). */\r\n isGrandTotal: boolean;\r\n /** Row-header cells this row renders (standard: 0..n cells; tree: exactly one). */\r\n headerCells: NxePivotRowHeaderCell[];\r\n /** `dataFieldArea: 'row'` with ≥2 measures (P2-C3): the measure this row renders — every\r\n * axis row splits into one row per data field, exactly as dx appends metric children to\r\n * each row header item (m_data_controller; with ONE measure the level is omitted, same\r\n * rule as columns). Absent on the default measures-on-columns model. */\r\n dataIndex?: number;\r\n /** The measure-caption cell text of a measures-on-rows row (tree layout renders it as the\r\n * second row-header column; standard layout also carries it inside `headerCells`). */\r\n measureCaption?: string;\r\n /** Measures-on-rows tree layout: the dimension label cell's rowspan on the FIRST measure\r\n * row of each axis row; `0` on continuation rows (no dimension cell at all). Absent on\r\n * the default model — the renderer treats absent as a plain single-row label. */\r\n measureRowspan?: number;\r\n /** Unique per rendered row (pathKey alone repeats once measure rows split); the template\r\n * tracks `trackKey ?? pathKey`. Absent on the default model. */\r\n trackKey?: string;\r\n}\r\n\r\n/**\r\n * The fully-computed cross-tab the grid renders and the Excel export walks. `cell()` resolves\r\n * an aggregated value for a (rowPath × leaf) intersection; `text()` formats it for display.\r\n */\r\nexport interface NxePivotModel {\r\n rowFields: NxePivotField[];\r\n columnFields: NxePivotField[];\r\n dataFields: NxePivotField[];\r\n cornerText: string;\r\n /** Column-area header rows (excludes the top-left corner). Last row = data-field captions. */\r\n columnHeaderRows: NxePivotHeaderCell[][];\r\n leaves: NxePivotColumnLeaf[];\r\n rows: NxePivotBodyRow[];\r\n /** Resolved layout (`'tree'` when the caller passes none — the pre-parity model contract). */\r\n rowHeaderLayout: NxePivotRowHeaderLayout;\r\n /** Row-header `<th>` columns: standard → one per row field (min 1); tree → 1. */\r\n rowHeaderColCount: number;\r\n /** Resolved dx flags, round-tripped so callers/goldens can pin them. `showRowTotals`\r\n * renders only in standard layout (dx: \"applies only if rowHeaderLayout is standard\");\r\n * `showColumnTotals` renders \"{value} Total\" columns on the N-level column axis (P2-C2). */\r\n showRowTotals: boolean;\r\n showColumnTotals: boolean;\r\n showTotalsPrior: NxePivotTotalsPrior;\r\n showRowGrandTotals: boolean;\r\n /** Grand-total footer cells (row grand total), one per leaf — present when enabled and\r\n * measures live on columns (the default). Null when `grandTotalRows` carries the footer. */\r\n grandTotalCells: { value: number | null; text: string }[] | null;\r\n /** Measures-on-rows footer (P2-C3): one footer row per data field, replacing\r\n * `grandTotalCells` when `dataFieldArea: 'row'` with ≥2 measures is active. */\r\n grandTotalRows?:\r\n | { dataIndex: number; caption: string; cells: { value: number | null; text: string }[] }[]\r\n | null;\r\n /** Resolved `dataFieldArea` ('column' unless overridden — dx m_widget default). */\r\n dataFieldArea?: 'row' | 'column';\r\n /** Per-table-column px widths (`field.width`), aligned to `rowHeaderColCount` row-header\r\n * columns followed by `leaves` — `null` where no width is configured. */\r\n colWidths: (number | null)[];\r\n /** W4 Lane 4: per-leaf FORMATTED column labels, one entry per `colPath` level (`[]` for\r\n * the grand-total and no-column-field leaves) — `bindChart` series naming. */\r\n colLabels: string[][];\r\n /** Resolved display strings ({@link NXE_PIVOT_TEXTS_DEFAULTS} merged under any `texts` input). */\r\n texts: Required<NxePivotTexts>;\r\n /** Dense value matrix built once per `getModel()`: `matrix[r][l]` = `rows[r]` × `leaves[l]`\r\n * (subtotal rows/columns included; the grand-total ROW stays `grandTotalCells`).\r\n * Typed escape (W4 Lane 4): a `summaryType: 'custom'` cell renders whatever the callback\r\n * left in `totalValue` — a NON-NUMERIC value (dx allows it) rides through these slots at\r\n * runtime; `text()`/the export pass such values through as text. */\r\n matrix: (number | null)[][];\r\n /** `matrix` formatted per each leaf's data field — what the DOM and the export render. */\r\n textMatrix: string[][];\r\n cell(rowPath: any[], leaf: NxePivotColumnLeaf): number | null;\r\n text(rowPath: any[], leaf: NxePivotColumnLeaf): string;\r\n numFmt(dataIndex: number): string | undefined;\r\n}\r\n\r\n/**\r\n * W4 Lane 2 — the dx `PivotGridCell` subset the outputs carry (transcribed from\r\n * m_data_controller getCellsInfo / getViewHeaderItems, 24.2.3). A DATA cell carries the\r\n * rowPath/columnPath/dataIndex/value/text/rowType/columnType block; a HEADER cell carries\r\n * text/type/expanded (+ `path` where the cell owns an expand key — a narrowing recorded in\r\n * DEFAULTS.md: dx paths every header cell, nxe paths the expandable ones).\r\n */\r\nexport interface NxePivotCellData {\r\n /** Cell text as rendered. */\r\n text?: string;\r\n /** Header cells: the cell's value path along its axis (see the interface note). */\r\n path?: any[];\r\n /** Header cells: 'D' value, 'T' \"{value} Total\", 'GT' grand total (dx `type`). */\r\n type?: NxePivotRowKind;\r\n /** Header cells: expand state (present on expandable cells, like dx's `expanded`). */\r\n expanded?: boolean;\r\n colspan?: number;\r\n rowspan?: number;\r\n /** Data cells: the aggregated value (post display-mode/running-total, as rendered). */\r\n value?: any;\r\n /** Data cells: the row's axis path (`[]` on the grand-total row). */\r\n rowPath?: any[];\r\n /** Data cells: the column leaf's axis path (`[]` on the grand-total column). */\r\n columnPath?: any[];\r\n /** Data cells: the row's kind — 'D' | 'T' | 'GT' (dx `rowType`). */\r\n rowType?: NxePivotRowKind;\r\n /** Data cells: the column leaf's kind (dx `columnType`). */\r\n columnType?: NxePivotRowKind;\r\n /** Data cells: index of the cell's data field among ALL data fields (dx `dataIndex`). */\r\n dataIndex?: number;\r\n dataType?: NxePivotField['dataType'];\r\n format?: NxeColumnFormat;\r\n}\r\n\r\n/**\r\n * dx `onCellClick` / `onCellPrepared` payload (m_widget `_createCellArgs`): the area, the\r\n * DOM-ish indices, the cell element, the cell data, and the three field lists. `onCellClick`\r\n * is CANCELABLE: setting `cancel: true` in a handler prevents the expand/collapse a chevron\r\n * click would perform (dx gates its own toggle on `!args.cancel`).\r\n */\r\nexport interface NxePivotCellEvent {\r\n area: 'row' | 'column' | 'data';\r\n /** DOM `tr.rowIndex` on clicks (dx `_createCellArgs`); model-local row on prepared. */\r\n rowIndex: number;\r\n /** DOM `cell.cellIndex` on clicks; model-local column on prepared. */\r\n columnIndex: number;\r\n cellElement?: HTMLElement | null;\r\n cell: NxePivotCellData;\r\n rowFields: NxePivotField[];\r\n columnFields: NxePivotField[];\r\n dataFields: NxePivotField[];\r\n /** The originating DOM event (clicks only). */\r\n event?: Event;\r\n /** onCellClick only — set true to cancel the chevron's expand/collapse. */\r\n cancel?: boolean;\r\n}\r\n\r\n/** dx `onOptionChanged` payload subset ({name, fullName, value, previousValue}). */\r\nexport interface NxePivotOptionChangedEvent {\r\n name: string;\r\n fullName: string;\r\n value: any;\r\n previousValue: any;\r\n component?: NxePivotGridInstance;\r\n}\r\n\r\n/** dx `onContentReady` payload subset. */\r\nexport interface NxePivotContentReadyEvent {\r\n component: NxePivotGridInstance;\r\n element: HTMLElement;\r\n}\r\n\r\n/** dx `onExporting` payload (ExportController.exportTo, m_export.js): cancelable, and the\r\n * handler may rewrite `fileName` (dx default 'PivotGrid'). */\r\nexport interface NxePivotExportingEvent {\r\n fileName: string;\r\n cancel: boolean;\r\n component?: NxePivotGridInstance;\r\n}\r\n\r\n/** The `.instance` facade the chart exposes (target of `bindChart`). */\r\nexport interface NxeChartInstance {\r\n readonly _isNxeChart: true;\r\n /** Push pivot-derived series data; `bindChart` calls this. */\r\n render(series: NxeChartSeries): void;\r\n}\r\n\r\n/** Series payload handed to the chart by `bindChart`. */\r\nexport interface NxeChartSeries {\r\n /** X-axis category labels (the pivot column leaves / row leaves). */\r\n categories: string[];\r\n /** One series per data field; `values` aligned to `categories`. */\r\n series: { name: string; values: number[] }[];\r\n}\r\n\r\n/**\r\n * W4 Lane 4 — the dx `bindChart` integration options subset (m_chart_integration.js).\r\n * The nxe chart renders ONE pane and ONE value axis, and its fixed orientation equals dx's\r\n * `inverted: true` mapping (rows → categories/arguments, column leaves → series) — the\r\n * established nxe contract since P1 (DEFAULTS.md). Consequences:\r\n * - `dataFieldsDisplayMode` ('singleAxis' | 'splitAxes' | 'splitPanes', dx default\r\n * 'splitAxes'): accepted; no structural effect on a single-pane single-axis chart.\r\n * - `alternateDataFields` (dx default true): orders multi-measure series — column-major with\r\n * the measure inner (true) or measure-major (false), dx's data-item interleaving.\r\n * - `putDataFieldsInto` ('series' default | 'args' | 'both'): with 2+ measures, where the\r\n * ` | {measure caption}` suffix lands — on the series names, on the category labels\r\n * (which then split per measure), or both (dx: sparse items; nxe fills mismatches with 0).\r\n */\r\nexport interface NxePivotBindChartOptions {\r\n dataFieldsDisplayMode?: 'singleAxis' | 'splitAxes' | 'splitPanes';\r\n alternateDataFields?: boolean;\r\n putDataFieldsInto?: 'series' | 'args' | 'both';\r\n [key: string]: any;\r\n}\r\n\r\n/** The pivot-grid `.instance` facade (DevExtreme parity). */\r\nexport interface NxePivotGridInstance {\r\n getDataSource(): { reload(): void };\r\n bindChart(chart: NxeChartInstance | any, options?: NxePivotBindChartOptions | any): void;\r\n /** Export hook — the current computed cross-tab model (null until data loads). */\r\n getExportModel(): NxePivotModel | null;\r\n /** dx parity: RENDER-ONLY re-render/re-layout (dx Widget.repaint never touches the data\r\n * source) — re-runs the measurement pass; expand/layout state and aggregates are kept\r\n * (W4 Lane 1; the pre-W4 facade re-aggregated and wiped chevron state). */\r\n repaint(): void;\r\n /**\r\n * Expand every node on BOTH axes (oracle §e: dx's toolbar expand-all sets `expanded` on\r\n * every row+column field and reloads) and wipe the per-node chevron overrides. Optional\r\n * ONLY because pre-P1-C3 spec literals implement this interface without it — the real\r\n * component always provides both.\r\n */\r\n expandAll?(): void;\r\n /** Collapse-all counterpart of {@link expandAll} (same override-wipe semantics). */\r\n collapseAll?(): void;\r\n /**\r\n * W4 Lane 2 — dx `exportToExcel()` (the built-in export path, m_export.js `exportTo`):\r\n * fires the cancelable `onExporting` (default fileName 'PivotGrid', the handler may\r\n * rename), then drives the standard `exportPivotGrid({component})` pipeline into an\r\n * in-house workbook and saves `<fileName>.xlsx`. Optional for the same reason as\r\n * {@link expandAll} (pre-existing spec literals implement this interface).\r\n */\r\n exportToExcel?(): Promise<void>;\r\n /**\r\n * W4 Lane 2 — dx `option(name[, value])` for the DOCUMENTED pivot options that map to\r\n * component inputs (allowExpandAll, allowFiltering, allowSorting, allowSortingBySummary,\r\n * dataFieldArea, height, rowHeaderLayout, showBorders, showColumnGrandTotals,\r\n * showColumnTotals, showRowGrandTotals, showRowTotals, showTotalsPrior, texts,\r\n * wordWrapEnabled). One-arg = get (also supports 'dataSource', get-only); two-arg = set,\r\n * recorded as an override that WINS over the input binding and fires `onOptionChanged`.\r\n * Unsupported names (dataSource set, nested 'a.b' paths, fieldChooser/fieldPanel/\r\n * stateStoring/scrolling — those live on projected config children) are ignored on set\r\n * and return undefined on get (DEFAULTS.md).\r\n */\r\n option?(name: string, value?: any): any;\r\n /** W4 Lane 2 — dx `updateDimensions()`: re-runs the render/measurement pass (the band\r\n * anchor / dimension sync), exactly like `repaint()` minus dx's full re-render. */\r\n updateDimensions?(): void;\r\n /** W4 Lane 2 — dx `getFieldChooserPopup()` narrowed to the two members anyone calls:\r\n * `show()` opens the chooser overlay (a no-op re-show when already open, dx-true),\r\n * `hide()` disposes it. */\r\n getFieldChooserPopup?(): { show(): void; hide(): void };\r\n}\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\n// nxe-pivot-axis — the shared axis-node abstraction behind NxePivotDataSource (pivot-parity\r\n// P2-C1). Both pivot axes are trees of dimension values and BOTH render all N levels since\r\n// P2-C2; the node shape, the collision-free path-key encoding, the expand-key namespacing, and\r\n// the record-by-record tree construction are axis-agnostic and live here so neither axis needs\r\n// a second implementation.\r\n\r\nimport { NxePivotField } from './nxe-pivot.types';\r\n\r\n/**\r\n * One node of an axis tree (either axis). `pathKey` is the node's namespaced expand key —\r\n * opaque to callers: the component's `toggle()` and `expandedOverrides` round-trip it verbatim.\r\n */\r\nexport interface NxePivotAxisNode {\r\n value: any;\r\n label: string;\r\n path: any[];\r\n pathKey: string;\r\n level: number;\r\n children: NxePivotAxisNode[];\r\n}\r\n\r\n/**\r\n * Path-key encoding. Value segments join on `SEG_SEP` and the row/column/measure sections of an\r\n * aggregation key join on `KEY_SEP`; a non-string segment carries a `<typeof>` + `TYPE_TAG_SEP`\r\n * prefix. All three separators are control characters that cannot occur in real field values, so\r\n * `['A B']` ≠ `['A', 'B']`, number `1` ≠ string `'1'`, `null` ≠ `'null'`, and a deep path can\r\n * never collide with (and attach its children to) an unrelated shallower one. Strings pass\r\n * through untagged (except `''`, which is tagged so `['']` ≠ `[]`), which keeps keys stable;\r\n * a `pathKey` remains an opaque string to callers.\r\n */\r\nconst SEG_SEP = '\\u001f';\r\nconst TYPE_TAG_SEP = '\\u001e';\r\nexport const KEY_SEP = '\\u001d';\r\n\r\n/**\r\n * Expand-key namespace prefixes. A node's `pathKey` is its axis prefix + the encoded value\r\n * path, so a row node can never share an expand key with a column node carrying the same\r\n * values once the column axis becomes expandable (P2-C2). The prefix lives here and ONLY\r\n * here: the data source builds keys through {@link NxePivotAxisTree} and reads overrides\r\n * through {@link readExpandOverride}; the component and every other caller pass keys through\r\n * untouched. NOTE: aggregation keys ({@link pathKeyOf} / {@link prefixKeys}) stay UNPREFIXED —\r\n * the namespace exists only for the expand-state maps.\r\n */\r\nexport const ROW_KEY_PREFIX = 'r:';\r\nexport const COLUMN_KEY_PREFIX = 'c:';\r\n\r\n/** Encode one path segment collision-free (see the separator notes above). */\r\nfunction encodeSegment(value: any): string {\r\n if (typeof value === 'string') {\r\n // '' must not encode to '' — pathKeyOf(['']) would equal pathKeyOf([]) and a blank\r\n // dimension value would then share (and double-count) the grand-total aggregation slot.\r\n return value === '' ? TYPE_TAG_SEP : value;\r\n }\r\n if (value === null) {\r\n return 'null' + TYPE_TAG_SEP;\r\n }\r\n if (value === undefined) {\r\n return 'undefined' + TYPE_TAG_SEP;\r\n }\r\n return typeof value + TYPE_TAG_SEP + String(value);\r\n}\r\n\r\n/** Un-namespaced key of a full path — the building block of the AGGREGATION keys. */\r\nexport function pathKeyOf(path: any[]): string {\r\n return path.map(encodeSegment).join(SEG_SEP);\r\n}\r\n\r\n/** Keys of the inclusive prefixes of a path: `[a,b]` → `['', key([a]), key([a,b])]`, built once. */\r\nexport function prefixKeys(path: any[]): string[] {\r\n const out = [''];\r\n let key = '';\r\n for (let i = 0; i < path.length; i++) {\r\n key = i === 0 ? encodeSegment(path[i]) : key + SEG_SEP + encodeSegment(path[i]);\r\n out.push(key);\r\n }\r\n return out;\r\n}\r\n\r\n/**\r\n * Look up a node's expand override. Keys the component wrote round-trip verbatim (they are\r\n * already namespaced — its `toggle()` passes through whatever `pathKey` the model handed it).\r\n * A key WITHOUT the axis prefix is the pre-namespacing model contract — direct `getModel()`\r\n * callers that built row keys by hand predate the column axis entirely — and is honoured as\r\n * a ROW key (columns were never expandable before the namespace existed).\r\n */\r\nexport function readExpandOverride(\r\n overrides: ReadonlyMap<string, boolean>,\r\n pathKey: string,\r\n): boolean | undefined {\r\n const direct = overrides.get(pathKey);\r\n if (direct !== undefined) {\r\n return direct;\r\n }\r\n if (pathKey.startsWith(ROW_KEY_PREFIX)) {\r\n return overrides.get(pathKey.slice(ROW_KEY_PREFIX.length));\r\n }\r\n return undefined;\r\n}\r\n\r\n/**\r\n * Record-by-record axis-tree construction, extracted from the P1 row-tree build and\r\n * generalized over the axis' field list + a value-reader so BOTH axes share it. One instance\r\n * per axis per build: `insert(rec)` reads the record's dimension tuple through `readValue`,\r\n * creates any missing nodes along the path (labelled through `labelOf`), and returns the raw\r\n * tuple so the caller can feed the aggregation prefixes without re-reading the record.\r\n * Siblings keep first-seen order — sorting is the data source's separate post-load pass.\r\n */\r\nexport class NxePivotAxisTree {\r\n /** Level-0 nodes in first-seen order (the data source sorts them in place afterwards). */\r\n readonly roots: NxePivotAxisNode[] = [];\r\n private readonly index = new Map<string, NxePivotAxisNode>();\r\n\r\n constructor(\r\n private readonly fields: NxePivotField[],\r\n private readonly readValue: (rec: any, field: NxePivotField) => any,\r\n private readonly labelOf: (field: NxePivotField, raw: any) => string,\r\n private readonly keyPrefix: string,\r\n ) {}\r\n\r\n /** Look up a node by its namespaced `pathKey` (`keyPrefix` + encoded value path). */\r\n find(pathKey: string): NxePivotAxisNode | undefined {\r\n return this.index.get(pathKey);\r\n }\r\n\r\n /** Insert one record's dimension tuple; returns the raw values (aligned to the fields). */\r\n insert(rec: any): any[] {\r\n const raw = this.fields.map((f) => this.readValue(rec, f));\r\n let level = 0;\r\n let parentPath: any[] = [];\r\n let parentKey = this.keyPrefix;\r\n let siblings = this.roots;\r\n for (const value of raw) {\r\n const path = [...parentPath, value];\r\n const pathKey =\r\n level === 0\r\n ? parentKey + encodeSegment(value)\r\n : parentKey + SEG_SEP + encodeSegment(value);\r\n let node = this.index.get(pathKey);\r\n if (!node) {\r\n node = {\r\n value,\r\n label: this.labelOf(this.fields[level], value),\r\n path,\r\n pathKey,\r\n level,\r\n children: [],\r\n };\r\n this.index.set(pathKey, node);\r\n siblings.push(node);\r\n }\r\n siblings = node.children;\r\n parentPath = path;\r\n parentKey = pathKey;\r\n level++;\r\n }\r\n return raw;\r\n }\r\n}\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\n// nxe-pivot-summary — the dx post-aggregation machinery: `summaryDisplayMode` (the percent\n// modes + absolute/percent variation), `runningTotal`, and the `calculateSummaryValue` cell\n// facade. Transcribed from DevExtreme 24.2.3\n// __internal/grids/pivot_grid/summary_display_modes/m_summary_display_modes.js (SummaryCell,\n// summaryDictionary, getExpression, applyDisplaySummaryMode, applyRunningTotal) — the engine\n// builds the same shape dx loads (visible axis trees + per-cell value arrays, index 0 = the\n// grand total on BOTH axes) once per getModel() and runs these passes over it; the dense\n// matrix then reads the post-processed values.\n\nimport { NxePivotField, NxePivotSummaryCell } from './nxe-pivot.types';\n\nconst COLUMN = 'column';\nconst ROW = 'row';\n\n/** One visible axis node (dx loaded-data header item): raw group value + cell index. */\nexport interface NxePivotSummaryNode {\n value: any;\n index: number;\n /** Present only for an EXPANDED parent — a collapsed node is a leaf, exactly as dx only\n * loads children for expanded paths. */\n children?: NxePivotSummaryNode[];\n}\n\n/**\n * dx `loadedData`: `values[rowIndex][columnIndex]` is one array with a slot per data field.\n * The passes attach `originalCell` (pre-pass clone) and `postProcessedFlags` to each array,\n * exactly as dx does — `cell[i]` is the post-processed value, `originalCell[i]` the raw one.\n */\nexport interface NxePivotSummaryData {\n rows: NxePivotSummaryNode[];\n columns: NxePivotSummaryNode[];\n values: any[][][];\n grandTotalRowIndex: number;\n grandTotalColumnIndex: number;\n}\n\n/** dx `descriptions` (the subset these passes read). */\nexport interface NxePivotSummaryDescriptions {\n rows: NxePivotField[];\n columns: NxePivotField[];\n values: NxePivotField[];\n}\n\nfunction isDefined(value: any): boolean {\n return value !== null && value !== undefined;\n}\n\nfunction isObject(value: any): boolean {\n return value !== null && typeof value === 'object' && !Array.isArray(value);\n}\n\n/**\n * dx m_widget_utils `foreachTree` (sync form, no splice-compensation — these passes never\n * mutate the tree): visits every node with `members = [node, ...ancestors]`; children BEFORE\n * their parent when `parentAtFirst` is false (the order both passes rely on — a running-total\n * cell always finds its `prev` already accumulated).\n */\nfunction foreachTree(\n items: NxePivotSummaryNode[],\n callback: (members: NxePivotSummaryNode[]) => void,\n parentAtFirst: boolean,\n members: NxePivotSummaryNode[] = [],\n): void {\n for (const item of items) {\n members.unshift(item);\n if (parentAtFirst) {\n callback(members);\n }\n if (item.children) {\n foreachTree(item.children, callback, parentAtFirst, members);\n }\n if (!parentAtFirst) {\n callback(members);\n }\n members.shift();\n }\n}\n\n/** dx m_widget_utils `findField`: match a field id against name/caption/dataField/index. */\nfunction findField(fields: NxePivotField[], id: any): number {\n if (fields && isDefined(id)) {\n for (let i = 0; i < fields.length; i++) {\n const field = fields[i];\n if (\n field['name'] === id ||\n field.caption === id ||\n field.dataField === id ||\n field['index'] === id\n ) {\n return i;\n }\n }\n }\n return -1;\n}\n\ninterface FieldsCache {\n fields: Map<any, NxePivotField | undefined>;\n positions: Map<NxePivotField, { area: string | undefined; index: number }>;\n}\n\nfunction createCache(): FieldsCache {\n return { fields: new Map(), positions: new Map() };\n}\n\n/**\n * dx `getFieldPos`: resolve a field id/object to `{area, index-within-its-description-list}`.\n * nxe extension: an OBJECT that is not one of the engine's own field copies (the engine clones\n * every input field) falls back to id matching on its dataField/caption, so callers can pass\n * their original field objects to `value(field)`/`slice(field)` the way dx callers do.\n */\nfunction getFieldPos(\n descriptions: NxePivotSummaryDescriptions,\n field: any,\n cache: FieldsCache,\n): { area: string | undefined; index: number } {\n let fieldParams: { area: string | undefined; index: number } = {\n area: undefined,\n index: -1,\n };\n if (!isObject(field)) {\n if (cache.fields.has(field)) {\n field = cache.fields.get(field);\n } else {\n const allFields = descriptions.columns\n .concat(descriptions.rows)\n .concat(descriptions.values);\n const fieldIndex = findField(allFields, field);\n const resolved = allFields[fieldIndex];\n cache.fields.set(field, resolved);\n field = resolved;\n }\n }\n if (field) {\n const cached = cache.positions.get(field);\n if (cached) {\n return cached;\n }\n const area = field.area || 'data';\n const list: NxePivotField[] =\n (descriptions as any)[area === 'data' ? 'values' : `${area}s`] ?? [];\n let index = list.indexOf(field);\n if (index === -1) {\n // Caller-owned object (not the engine's copy) — match it by id instead.\n index = findField(list, field.dataField ?? field.caption ?? field['name']);\n }\n fieldParams = { area, index };\n cache.positions.set(field, fieldParams);\n }\n return fieldParams;\n}\n\nfunction getPathFieldName(dimension: string | undefined): '_rowPath' | '_columnPath' {\n return dimension === ROW ? '_rowPath' : '_columnPath';\n}\n\nconst NULL = null;\n\nconst calculatePercentValue = function (value: any, totalValue: any): number | null {\n let result: number | null = value / totalValue;\n if (!isDefined(value) || isNaN(result as number)) {\n result = NULL;\n }\n return result;\n};\n\nconst percentOfGrandTotal = function (e: NxeSummaryCell, dimension?: 'row' | 'column') {\n return calculatePercentValue(e.value(), e.grandTotal(dimension).value());\n};\n\nconst percentOfParent = function (e: NxeSummaryCell, dimension: 'row' | 'column') {\n const parent = e.parent(dimension);\n const parentValue = parent ? parent.value() : e.value();\n return calculatePercentValue(e.value(), parentValue);\n};\n\nconst createAbsoluteVariationExp = function (allowCrossGroup: boolean | undefined) {\n return function (e: NxeSummaryCell) {\n const prevCell = e.prev(COLUMN, allowCrossGroup);\n const prevValue = prevCell && prevCell.value();\n if (isDefined(prevValue) && isDefined(e.value())) {\n return e.value() - prevValue;\n }\n return NULL;\n };\n};\n\nconst createPercentVariationExp = function (allowCrossGroup: boolean | undefined) {\n const absoluteExp = createAbsoluteVariationExp(allowCrossGroup);\n return function (e: NxeSummaryCell) {\n const absVar = absoluteExp(e);\n const prevCell = e.prev(COLUMN, allowCrossGroup);\n const prevValue = prevCell && prevCell.value();\n return absVar !== NULL && prevValue ? absVar / prevValue : NULL;\n };\n};\n\n/** dx `summaryDictionary` — the five percent display modes. */\nexport const summaryDictionary: Record<string, (e: NxeSummaryCell) => any> = {\n percentOfColumnTotal: (e) => percentOfParent(e, ROW),\n percentOfRowTotal: (e) => percentOfParent(e, COLUMN),\n percentOfColumnGrandTotal: (e) => percentOfGrandTotal(e, ROW),\n percentOfRowGrandTotal: (e) => percentOfGrandTotal(e, COLUMN),\n percentOfGrandTotal: (e) => percentOfGrandTotal(e),\n};\n\nconst getPrevCellCrossGroup = function (\n cell: NxeSummaryCell | null | undefined,\n direction: 'row' | 'column',\n): NxeSummaryCell | null | undefined {\n if (!cell || !cell.parent(direction)) {\n return undefined;\n }\n let prevCell = cell.prev(direction);\n if (!prevCell) {\n prevCell = getPrevCellCrossGroup(cell.parent(direction), direction) as NxeSummaryCell;\n }\n return prevCell;\n};\n\n/** dx `createRunningTotalExpr`: accumulate along the axis, resetting at group boundaries\n * unless `allowCrossGroupCalculation` (which then continues from the previous GROUP's cell). */\nconst createRunningTotalExpr = (field: NxePivotField) => {\n if (!field.runningTotal) {\n return undefined;\n }\n const direction = field.runningTotal === COLUMN ? ROW : COLUMN;\n return (e: NxeSummaryCell) => {\n const prevCell = field.allowCrossGroupCalculation\n ? getPrevCellCrossGroup(e, direction)\n : e.prev(direction, false);\n const calculatedValue = e.value(true);\n const originalValue = e.value(false);\n const prevCalculatedValue = prevCell?.value(true);\n switch (true) {\n case isDefined(calculatedValue) && isDefined(originalValue) && isDefined(prevCalculatedValue):\n return prevCalculatedValue + calculatedValue;\n case isDefined(prevCalculatedValue):\n return prevCalculatedValue;\n default:\n return calculatedValue;\n }\n };\n};\n\n/**\n * The `e` object a `calculateSummaryValue` callback receives — dx `SummaryCell`, transcribed\n * method-for-method. Paths are `[node, ...ancestors, grandTotalWrapper]` node arrays; the\n * wrapper (index 0) IS the grand total on its axis, so `parent()` of a top-level value is the\n * grand total cell and `parent()` of the grand total is null — exactly dx's shape.\n */\nexport class NxeSummaryCell implements NxePivotSummaryCell {\n private readonly _columnPath: NxePivotSummaryNode[];\n private readonly _rowPath: NxePivotSummaryNode[];\n private readonly _fieldIndex: number;\n private readonly _fieldsCache: FieldsCache;\n private readonly _data: NxePivotSummaryData;\n private readonly _descriptions: NxePivotSummaryDescriptions;\n private readonly _cell: any[] | undefined;\n\n constructor(\n columnPath: NxePivotSummaryNode[],\n rowPath: NxePivotSummaryNode[],\n data: NxePivotSummaryData,\n descriptions: NxePivotSummaryDescriptions,\n fieldIndex: number,\n fieldsCache?: FieldsCache,\n ) {\n this._columnPath = columnPath;\n this._rowPath = rowPath;\n this._fieldIndex = fieldIndex;\n this._fieldsCache = fieldsCache || createCache();\n this._data = data;\n this._descriptions = descriptions;\n const cell =\n data.values &&\n data.values[rowPath[0].index] &&\n data.values[rowPath[0].index][columnPath[0].index];\n if (cell) {\n (cell as any).originalCell = (cell as any).originalCell || cell.slice();\n (cell as any).postProcessedFlags = (cell as any).postProcessedFlags || [];\n this._cell = cell;\n }\n }\n\n private _getPath(dimension: string | undefined): NxePivotSummaryNode[] {\n return this[getPathFieldName(dimension)];\n }\n\n private _getDimension(dimension: string): NxePivotField[] {\n return dimension === ROW ? this._descriptions.rows : this._descriptions.columns;\n }\n\n private _createCell(config: {\n _columnPath?: NxePivotSummaryNode[];\n _rowPath?: NxePivotSummaryNode[];\n }): NxeSummaryCell {\n return new NxeSummaryCell(\n config._columnPath || this._columnPath,\n config._rowPath || this._rowPath,\n this._data,\n this._descriptions,\n this._fieldIndex,\n );\n }\n\n parent(direction: 'row' | 'column'): NxeSummaryCell | null {\n const path = this._getPath(direction).slice();\n const config: any = {};\n path.shift();\n if (path.length) {\n config[getPathFieldName(direction)] = path;\n return this._createCell(config);\n }\n return NULL;\n }\n\n children(direction: 'row' | 'column'): NxeSummaryCell[] {\n const path = this._getPath(direction).slice();\n const item = path[0];\n const result: NxeSummaryCell[] = [];\n const cellConfig: any = {};\n if (item.children) {\n for (let i = 0; i < item.children.length; i += 1) {\n cellConfig[getPathFieldName(direction)] = [item.children[i]].concat(path.slice());\n result.push(this._createCell(cellConfig));\n }\n }\n return result;\n }\n\n grandTotal(direction?: 'row' | 'column'): NxeSummaryCell {\n const config: any = {};\n const rowPath = this._rowPath;\n const columnPath = this._columnPath;\n const dimensionPath = this._getPath(direction);\n const pathFieldName = getPathFieldName(direction);\n if (!direction) {\n config._rowPath = [rowPath[rowPath.length - 1]];\n config._columnPath = [columnPath[columnPath.length - 1]];\n } else {\n config[pathFieldName] = [dimensionPath[dimensionPath.length - 1]];\n }\n return this._createCell(config);\n }\n\n next(direction: 'row' | 'column', allowCrossGroup?: boolean): NxeSummaryCell | null {\n const currentPath = this._getPath(direction);\n const item = currentPath[0];\n let parent = this.parent(direction);\n let siblings: NxeSummaryCell[] = [];\n if (parent) {\n const index = currentPath[1].children!.indexOf(item);\n siblings = parent.children(direction);\n if (siblings[index + 1]) {\n return siblings[index + 1];\n }\n }\n if (allowCrossGroup && parent) {\n do {\n parent = parent.next(direction, allowCrossGroup);\n siblings = parent ? parent.children(direction) : [];\n } while (parent && !siblings.length);\n return siblings[0] || NULL;\n }\n return NULL;\n }\n\n prev(direction: 'row' | 'column', allowCrossGroup?: boolean): NxeSummaryCell | null {\n const currentPath = this._getPath(direction);\n const item = currentPath[0];\n let parent = this.parent(direction);\n let siblings: NxeSummaryCell[] = [];\n if (parent) {\n const index = currentPath[1].children!.indexOf(item);\n siblings = parent.children(direction);\n if (siblings[index - 1]) {\n return siblings[index - 1];\n }\n }\n if (allowCrossGroup && parent) {\n do {\n parent = parent.prev(direction, allowCrossGroup);\n siblings = parent ? parent.children(direction) : [];\n } while (parent && !siblings.length);\n return siblings[siblings.length - 1] || NULL;\n }\n return NULL;\n }\n\n cell(): any[] | undefined {\n return this._cell;\n }\n\n field(area: 'row' | 'column' | 'data'): NxePivotField | null {\n if (area === 'data') {\n return this._descriptions.values[this._fieldIndex] ?? NULL;\n }\n const path = this._getPath(area);\n const descriptions = this._getDimension(area);\n const field = descriptions[path.length - 2];\n return field || NULL;\n }\n\n child(direction: 'row' | 'column', fieldValue: any): NxeSummaryCell | null {\n let childLevelField: NxePivotField | null | undefined;\n const children = this.children(direction);\n for (let i = 0; i < children.length; i += 1) {\n childLevelField = childLevelField || children[i].field(direction);\n if (children[i].value(childLevelField as any) === fieldValue) {\n return children[i];\n }\n }\n return NULL;\n }\n\n slice(field: any, value: any): NxeSummaryCell | null {\n const config: any = {};\n const fieldPos = getFieldPos(this._descriptions, field, this._fieldsCache);\n const { area } = fieldPos;\n const fieldIndex = fieldPos.index;\n let sliceCell: NxeSummaryCell | null = NULL;\n if (area === ROW || area === COLUMN) {\n const path = this._getPath(area).slice();\n if (fieldIndex === -1) {\n return sliceCell;\n }\n const level = path.length - 2 - fieldIndex;\n if (path[level]) {\n for (let i = level; i >= 0; i -= 1) {\n if (path[i + 1]) {\n const childItems = path[i + 1].children || [];\n const currentValue = i === level ? value : path[i].value;\n (path as any)[i] = undefined;\n for (let childIndex = 0; childIndex < childItems.length; childIndex += 1) {\n if (childItems[childIndex].value === currentValue) {\n path[i] = childItems[childIndex];\n break;\n }\n }\n }\n if (path[i] === undefined) {\n return sliceCell;\n }\n }\n config[getPathFieldName(area)] = path;\n sliceCell = this._createCell(config);\n }\n }\n return sliceCell;\n }\n\n value(arg1?: any, arg2?: boolean): any {\n const cell = this._cell;\n let fieldIndex = this._fieldIndex;\n const fistArgIsBoolean = arg1 === true || arg1 === false;\n const field = !fistArgIsBoolean ? arg1 : NULL;\n const needCalculatedValue = (fistArgIsBoolean && arg1) || arg2;\n if (isDefined(field)) {\n const fieldPos = getFieldPos(this._descriptions, field, this._fieldsCache);\n fieldIndex = fieldPos.index;\n if (fieldPos.area !== 'data') {\n if (fieldIndex === -1) {\n return undefined;\n }\n const path = this._getPath(fieldPos.area);\n const level = path.length - 2 - fieldIndex;\n return path[level] ? path[level].value : undefined;\n }\n }\n if (cell && (cell as any).originalCell) {\n return needCalculatedValue ? cell[fieldIndex] : (cell as any).originalCell[fieldIndex];\n }\n return NULL;\n }\n\n isPostProcessed(field?: any): boolean {\n let fieldIndex = this._fieldIndex;\n if (isDefined(field)) {\n const fieldPos = getFieldPos(this._descriptions, field, this._fieldsCache);\n fieldIndex = fieldPos.index;\n if (fieldPos.area !== 'data') {\n return false;\n }\n }\n return !!(this._cell && (this._cell as any).postProcessedFlags[fieldIndex]);\n }\n}\n\n/**\n * dx `getExpression`: `calculateSummaryValue` wins outright; else the `summaryDisplayMode`\n * dictionary (+ the two variation modes). A percent mode on a format-less field sets the\n * field's format to dx's `'percent'` (here the equivalent `{ type: 'percent' }` object — a\n * bare string is an LDML mask to the nxe formatter); dx's default percent precision is 0\n * (verified: localization/number.js `_formatNumberCore` coerces undefined precision to 0).\n */\nexport function getExpression(field: NxePivotField): ((e: NxeSummaryCell) => any) | null {\n const { summaryDisplayMode } = field;\n const crossGroupCalculation = field.allowCrossGroupCalculation;\n let expression: ((e: NxeSummaryCell) => any) | null = NULL;\n if (typeof field.calculateSummaryValue === 'function') {\n expression = field.calculateSummaryValue;\n } else if (summaryDisplayMode) {\n if (summaryDisplayMode === 'absoluteVariation') {\n expression = createAbsoluteVariationExp(crossGroupCalculation);\n } else if (summaryDisplayMode === 'percentVariation') {\n expression = createPercentVariationExp(crossGroupCalculation);\n } else {\n expression = (summaryDictionary as Partial<typeof summaryDictionary>)[summaryDisplayMode] ?? NULL;\n }\n if (expression && !field.format && summaryDisplayMode.indexOf('percent') !== -1) {\n field.format = { type: 'percent' };\n }\n }\n return expression;\n}\n\n/** dx `processDataCell`: restore `originalCell` before a re-run (the running-total pass keeps\n * the display-mode results — `allowResetting` flips only after IT ran once). */\nfunction processDataCell(\n data: NxePivotSummaryData,\n rowIndex: number,\n columnIndex: number,\n isRunningTotalCalculation: boolean,\n): void {\n const values: any = (data.values[rowIndex][columnIndex] =\n data.values[rowIndex][columnIndex] || []);\n const { originalCell } = values;\n if (!originalCell) {\n return;\n }\n if (values.allowResetting || !isRunningTotalCalculation) {\n data.values[rowIndex][columnIndex] = originalCell.slice();\n }\n (data.values[rowIndex][columnIndex] as any).allowResetting = isRunningTotalCalculation;\n}\n\n/**\n * dx `applyDisplaySummaryMode`: evaluate each data field's expression over every visible\n * row × column intersection (grand totals included), children before parents, writing the\n * result into `cell[i]` (`originalCell` keeps the raw aggregates for `value(false)`).\n * The dx `isEmpty` bookkeeping (hideEmptySummaryCells) is dropped — no nxe reader exists.\n */\nexport function applyDisplaySummaryMode(\n descriptions: NxePivotSummaryDescriptions,\n data: NxePivotSummaryData,\n): void {\n const expressions: (((e: NxeSummaryCell) => any) | null)[] = [];\n const columnElements: NxePivotSummaryNode[] = [\n { value: undefined, index: data.grandTotalColumnIndex, children: data.columns },\n ];\n const rowElements: NxePivotSummaryNode[] = [\n { value: undefined, index: data.grandTotalRowIndex, children: data.rows },\n ];\n const valueFields = descriptions.values;\n const fieldsCache = createCache();\n data.values = data.values || [];\n foreachTree(\n rowElements,\n (rowPath) => {\n const rowItem = rowPath[0];\n data.values[rowItem.index] = data.values[rowItem.index] || [];\n foreachTree(\n columnElements,\n (columnPath) => {\n const columnItem = columnPath[0];\n processDataCell(data, rowItem.index, columnItem.index, false);\n for (let i = 0; i < valueFields.length; i += 1) {\n const field = valueFields[i];\n const expression = (expressions[i] =\n expressions[i] === undefined ? getExpression(field) : expressions[i]);\n if (expression) {\n const expressionArg = new NxeSummaryCell(\n [...columnPath],\n [...rowPath],\n data,\n descriptions,\n i,\n fieldsCache,\n );\n const cell = expressionArg.cell()!;\n cell[i] = expression(expressionArg);\n (cell as any).postProcessedFlags[i] = true;\n }\n }\n },\n false,\n );\n },\n false,\n );\n}\n\n/** dx `applyRunningTotal` — runs AFTER the display-mode pass (accumulates `value(true)`). */\nexport function applyRunningTotal(\n descriptions: NxePivotSummaryDescriptions,\n data: NxePivotSummaryData,\n): void {\n const expressions: (((e: NxeSummaryCell) => any) | undefined)[] = [];\n const columnElements: NxePivotSummaryNode[] = [\n { value: undefined, index: data.grandTotalColumnIndex, children: data.columns },\n ];\n const rowElements: NxePivotSummaryNode[] = [\n { value: undefined, index: data.grandTotalRowIndex, children: data.rows },\n ];\n const valueFields = descriptions.values;\n const fieldsCache = createCache();\n data.values = data.values || [];\n foreachTree(\n rowElements,\n (rowPath) => {\n const rowItem = rowPath[0];\n data.values[rowItem.index] = data.values[rowItem.index] || [];\n foreachTree(\n columnElements,\n (columnPath) => {\n const columnItem = columnPath[0];\n processDataCell(data, rowItem.index, columnItem.index, true);\n for (let i = 0; i < valueFields.length; i += 1) {\n const field = valueFields[i];\n const expression = (expressions[i] =\n expressions[i] === undefined\n ? createRunningTotalExpr(field)\n : expressions[i]);\n if (expression) {\n const expressionArg = new NxeSummaryCell(\n [...columnPath],\n [...rowPath],\n data,\n descriptions,\n i,\n fieldsCache,\n );\n const cell = expressionArg.cell()!;\n cell[i] = expression(expressionArg);\n (cell as any).postProcessedFlags[i] = true;\n }\n }\n },\n false,\n );\n },\n false,\n );\n}\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\n// NxePivotDataSource — the cross-tab aggregation engine behind nxe-pivot-grid. Drop-in for the\r\n// plain `{ fields, store, retrieveFields }` object the app binds to `[dataSource]` (and for the\r\n// rare `new PivotGridDataSource(...)`). It groups the flat `store` by the row × column field\r\n// tuples and aggregates each `data` field, accumulating into EVERY path prefix so subtotals and\r\n// grand totals are free. `reload()` re-aggregates (called from `onExpandAll`).\r\n\r\nimport { formatDisplay, NxeNumberSeparators, parseDateValue } from '@nexterajs/ui/intl';\r\nimport { nxeDatePattern, nxeExcelNumFmt, nxeFormatNumberValue } from '@nexterajs/ui/grid';\r\nimport {\r\n COLUMN_KEY_PREFIX,\r\n KEY_SEP,\r\n NxePivotAxisNode,\r\n NxePivotAxisTree,\r\n ROW_KEY_PREFIX,\r\n pathKeyOf,\r\n prefixKeys,\r\n readExpandOverride,\r\n} from './nxe-pivot-axis';\r\nimport {\r\n applyDisplaySummaryMode,\r\n applyRunningTotal,\r\n NxePivotSummaryData,\r\n NxePivotSummaryDescriptions,\r\n NxePivotSummaryNode,\r\n} from './nxe-pivot-summary';\r\nimport {\r\n NXE_PIVOT_TEXTS_DEFAULTS,\r\n NxePivotArea,\r\n NxePivotBodyRow,\r\n NxePivotColumnLeaf,\r\n NxePivotCustomSummaryInfo,\r\n NxePivotDataSourceOptions,\r\n NxePivotField,\r\n NxePivotHeaderCell,\r\n NxePivotModel,\r\n NxePivotRowHeaderCell,\r\n NxePivotRowHeaderLayout,\r\n NxePivotTexts,\r\n NxePivotTotalsPrior,\r\n} from './nxe-pivot.types';\r\n\r\n/** A per-cell accumulator (carries enough state for every supported summary type). */\r\ninterface Agg {\r\n sum: number;\r\n count: number;\r\n min: number;\r\n max: number;\r\n has: boolean;\r\n /** Raw values collected for a `summaryType: 'custom'` cell (dx passes raw, uncoerced values\r\n * to 'calculate'). Allocated ONLY for custom-summary fields — the common path stays lean. */\r\n raw?: any[];\r\n /** The custom field this cell aggregates (marks the agg for the post-load finalize pass). */\r\n customField?: NxePivotField;\r\n /** Cached `totalValue` after the start → calculate… → finalize protocol ran for this cell. */\r\n custom?: any;\r\n}\r\n\r\n// The axis-node shape, the collision-free path-key encoding, and the record-by-record tree\r\n// construction moved to nxe-pivot-axis.ts in P2-C1 — shared by both axes.\r\n\r\nfunction getRaw(row: any, field: string | undefined): 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/**\r\n * Read a field's raw value off a record. dx `prepareFields` (m_local_store) only compiles a\r\n * dataField getter when the field carries no `selector` — an explicit selector REPLACES the\r\n * dataField read entirely, for dimensions and measures alike.\r\n */\r\nfunction readField(row: any, field: NxePivotField): any {\r\n if (typeof field.selector === 'function') {\r\n return field.selector(row);\r\n }\r\n return getRaw(row, field.dataField);\r\n}\r\n\r\n/**\r\n * dx m_local_store `DATE_INTERVAL_SELECTORS`, over the library's Luxon-based parse: `year` →\r\n * getFullYear, `quarter` → 1-4, `month` → 1-12, `day` → day of month, `dayOfWeek` → 0-6\r\n * (Sunday 0, JS `getDay()`; Luxon's Monday-1 weekday mapped with `% 7`). A falsy/unparseable\r\n * value passes through untouched (`date && ...`, dx line-for-line).\r\n */\r\nconst DATE_INTERVAL_SELECTORS: Record<string, (raw: any) => any> = {\r\n year: (raw) => raw && (parseDateValue(raw)?.year ?? raw),\r\n quarter: (raw) => raw && (mapDate(raw, (d) => Math.floor((d.month - 1) / 3) + 1) ?? raw),\r\n month: (raw) => raw && (parseDateValue(raw)?.month ?? raw),\r\n day: (raw) => raw && (parseDateValue(raw)?.day ?? raw),\r\n dayOfWeek: (raw) => raw && (mapDate(raw, (d) => d.weekday % 7) ?? raw),\r\n};\r\n\r\nfunction mapDate(raw: any, fn: (d: { month: number; weekday: number }) => number): number | null {\r\n const dt = parseDateValue(raw);\r\n return dt ? fn(dt) : null;\r\n}\r\n\r\n/** Positive numeric `groupInterval` (dx: `isNumeric(gi) && gi > 0 && gi`), else null. */\r\nfunction numericGroupInterval(field: NxePivotField): number | null {\r\n const gi = field.groupInterval;\r\n return typeof gi === 'number' && isFinite(gi) && gi > 0 ? gi : null;\r\n}\r\n\r\n/**\r\n * dx m_local_store `prepareFields`, scoped to `groupInterval` fields (P2-C3): the effective\r\n * per-record value read. A field WITH an explicit `selector` is skipped wholesale (dx: only\r\n * selector-less fields are prepared); a date field with a recognised interval buckets through\r\n * {@link DATE_INTERVAL_SELECTORS}; a number field with a positive step coerces string raws to\r\n * Number and groups to `Math.floor(value / step) * step` (dx's exact formula — NOT\r\n * `value - value % step`, which differs for negatives). Everything else keeps the raw\r\n * dataField read — deserializing interval-less date dimensions (dx's `getDateValue`) is\r\n * deliberately NOT ported: raw values stay the P1 grouping keys (DEFAULTS.md).\r\n */\r\nfunction readGroupedField(row: any, field: NxePivotField): any {\r\n if (typeof field.selector !== 'function') {\r\n if (field.dataType === 'date' && typeof field.groupInterval === 'string') {\r\n const interval = DATE_INTERVAL_SELECTORS[field.groupInterval];\r\n if (interval) {\r\n return interval(getRaw(row, field.dataField));\r\n }\r\n } else if (field.dataType === 'number') {\r\n const step = numericGroupInterval(field);\r\n if (step) {\r\n let value = getRaw(row, field.dataField);\r\n if (typeof value === 'string') {\r\n value = Number(value);\r\n }\r\n return Math.floor(value / step) * step;\r\n }\r\n }\r\n }\r\n return readField(row, field);\r\n}\r\n\r\n/**\r\n * dx m_widget_utils `DATE_INTERVAL_FORMATS` (default en localization): month numbers render\r\n * the wide month name, quarters `'Q' + n` (dx formats `new Date(2000, 3n-1)` with the\r\n * 'quarter' pattern), dayOfWeek the wide day name; `year`/`day` have no entry — the group\r\n * number renders as-is.\r\n */\r\nconst MONTH_NAMES = [\r\n 'January', 'February', 'March', 'April', 'May', 'June',\r\n 'July', 'August', 'September', 'October', 'November', 'December',\r\n];\r\nconst DAY_NAMES = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'];\r\n\r\nfunction dateIntervalLabel(interval: string, value: any): string | null {\r\n if (typeof value !== 'number') {\r\n return null;\r\n }\r\n if (interval === 'month') {\r\n return MONTH_NAMES[value - 1] ?? String(value);\r\n }\r\n if (interval === 'quarter') {\r\n return `Q${value}`;\r\n }\r\n if (interval === 'dayOfWeek') {\r\n return DAY_NAMES[value] ?? String(value);\r\n }\r\n return null;\r\n}\r\n\r\n/**\r\n * dx `discoverObjectFields`/`parseFields` (m_widget_utils), the `retrieveFields: true` default:\r\n * fields come from the FIRST record's keys (`__`-prefixed keys skipped); `dataType` is detected\r\n * from the first DEFINED value scanning forward through the store. All derived fields are\r\n * area-less — dx surfaces them in the field chooser only, never in an area. Scoped down from dx\r\n * (recorded in DEFAULTS.md): no nested-object recursion into dotted dataFields and no\r\n * year/quarter/month group-field expansion for dates.\r\n */\r\nfunction deriveStoreFields(store: any[]): NxePivotField[] {\r\n const first = store[0];\r\n if (first == null || typeof first !== 'object') {\r\n return [];\r\n }\r\n return Object.keys(first)\r\n .filter((key) => !key.startsWith('__'))\r\n .map((key) => {\r\n let value: any = first[key];\r\n for (let i = 1; value == null && i < store.length; i++) {\r\n value = store[i]?.[key];\r\n }\r\n let dataType: NxePivotField['dataType'];\r\n if (value instanceof Date) {\r\n dataType = 'date';\r\n } else if (typeof value === 'number') {\r\n dataType = 'number';\r\n } else if (typeof value === 'boolean') {\r\n dataType = 'boolean';\r\n } else if (typeof value === 'string') {\r\n dataType = 'string';\r\n }\r\n // dx runs createCaption over retrieved fields too (`_fieldsPrepared`).\r\n return { dataField: key, dataType, caption: defaultCaption({ dataField: key }) };\r\n });\r\n}\r\n\r\n/**\r\n * dx `inflector.titleize` (the pivot's caption inflector — NOT the data grid's acronym-keeping\r\n * `captionize`): split on lower→upper transitions and `\\s _ -`, lower-case each word, then\r\n * capitalize its first letter — so `'LOB'` → `'Lob'`, `'businessLOB'` → `'Business Lob'`,\r\n * `'TotalPremium'` → `'Total Premium'`. Transcribed from DevExtreme 24.2.3\r\n * __internal/core/utils/m_inflector (`_chop` + `titleize`); verified against the live broker\r\n * capture (reference/pivot: corner \"Lob\", chooser chips \"Lob\"/\"Ceding Name\").\r\n */\r\nfunction titleize(name: string): string {\r\n return String(name)\r\n .replace(/([a-z\\d])([A-Z])/g, '$1 $2')\r\n .split(/[\\s_-]+/)\r\n .map((p) => {\r\n const lower = p.toLowerCase();\r\n return lower.charAt(0).toUpperCase() + lower.substr(1);\r\n })\r\n .join(' ');\r\n}\r\n\r\n/**\r\n * dx `createCaption` (pivot_grid/data_source/m_data_source): a field WITHOUT an explicit\r\n * caption renders `titleize(dataField [+ '_' + groupInterval])`, and — when it aggregates with\r\n * a non-'custom' summary type — a `\" (Sum)\"`-style suffix. Explicit captions render as-is\r\n * (the caller never reaches this).\r\n */\r\nfunction defaultCaption(field: NxePivotField): string {\r\n let base = field.dataField ?? '';\r\n if (typeof field.groupInterval === 'string') {\r\n base += `_${field.groupInterval}`;\r\n }\r\n let summary = (field.summaryType ? String(field.summaryType) : '').toLowerCase();\r\n if (summary && summary !== 'custom') {\r\n summary = summary.charAt(0).toUpperCase() + summary.slice(1);\r\n summary = base.length ? ` (${summary})` : summary;\r\n } else {\r\n summary = '';\r\n }\r\n return titleize(base) + summary;\r\n}\r\n\r\n/** Render a row/column field value to its display label (dates formatted, customizeText honoured). */\r\nfunction fieldText(field: NxePivotField, raw: any): string {\r\n if (raw == null || raw === '') {\r\n return '';\r\n }\r\n let text: string;\r\n if (\r\n field.dataType === 'date' &&\r\n typeof field.groupInterval === 'string' &&\r\n typeof field.selector !== 'function'\r\n ) {\r\n // The raw value here is the interval GROUP number (P2-C3). dx setDefaultFieldValueFormatting\r\n // only installs the interval formats when the field has no explicit format.\r\n text = (!field.format && dateIntervalLabel(field.groupInterval, raw)) || String(raw);\r\n } else if (field.dataType === 'date') {\r\n const dt = parseDateValue(raw);\r\n const pattern = nxeDatePattern(field.format, 'dd-MMM-yyyy');\r\n text = dt ? formatDisplay(dt, pattern) : String(raw);\r\n } else {\r\n text = String(raw);\r\n }\r\n if (field.customizeText) {\r\n return field.customizeText({ value: raw, valueText: text });\r\n }\r\n return text;\r\n}\r\n\r\n/** Format an aggregated numeric value per the data field's number format / customizeText. */\r\nfunction dataText(\r\n field: NxePivotField,\r\n value: number | null,\r\n separators?: NxeNumberSeparators,\r\n): string {\r\n if (value == null) {\r\n return '';\r\n }\r\n // W4 Lane 4: a `summaryType: 'custom'` cell holds whatever `totalValue` the callback left\r\n // — dx renders non-numeric values as-is (its formatter no-ops on them), so strings (and\r\n // anything else non-numeric) pass through unformatted; the number mask applies to numbers.\r\n const formatted =\r\n typeof value === 'number'\r\n ? nxeFormatNumberValue(value, field.format, separators)\r\n : String(value);\r\n if (field.customizeText) {\r\n return field.customizeText({ value, valueText: formatted });\r\n }\r\n return formatted;\r\n}\r\n\r\nfunction newAgg(): Agg {\r\n return { sum: 0, count: 0, min: Infinity, max: -Infinity, has: false };\r\n}\r\n\r\nfunction accumulate(agg: Agg, v: number): void {\r\n agg.sum += v;\r\n agg.count += 1;\r\n agg.min = Math.min(agg.min, v);\r\n agg.max = Math.max(agg.max, v);\r\n agg.has = true;\r\n}\r\n\r\nfunction resolveAgg(agg: Agg | undefined, type: NxePivotField['summaryType']): number | null {\r\n if (!agg) {\r\n return null;\r\n }\r\n if (type === 'custom') {\r\n // Whatever the callback left in `totalValue` after 'finalize' (cached at build time).\r\n return agg.custom ?? null;\r\n }\r\n if (!agg.has) {\r\n return null;\r\n }\r\n switch (type) {\r\n case 'sum':\r\n return agg.sum;\r\n case 'min':\r\n return agg.min;\r\n case 'max':\r\n return agg.max;\r\n case 'avg':\r\n return agg.count ? agg.sum / agg.count : null;\r\n case 'count':\r\n default:\r\n // dx `getAggregator` ends `aggregators[field.summaryType] || aggregators.count`\r\n // (m_local_store): an ABSENT or unknown summaryType counts, it does not sum. The\r\n // field panel and chooser both create data fields without one (a drag into the Data\r\n // area carries only area/areaIndex), so defaulting to sum silently reported totals\r\n // where dx reports row counts.\r\n return agg.count;\r\n }\r\n}\r\n\r\nfunction keyOf(rowPath: any[], colPath: any[], dataIndex: number): string {\r\n return pathKeyOf(rowPath) + KEY_SEP + pathKeyOf(colPath) + KEY_SEP + dataIndex;\r\n}\r\n\r\nexport interface NxePivotModelOptions {\r\n /** Field-level expansion is seeded from `field.expanded`; these are per-node chevron overrides. */\r\n expandedOverrides: ReadonlyMap<string, boolean>;\r\n /**\r\n * Facade expand-all/collapse-all state: `true`/`false` behaves as if EVERY row+column\r\n * field's `expanded` were set to it (oracle §e — dx's toolbar buttons set `expanded` on all\r\n * fields of both axes and reload); `undefined` follows the fields. Per-node\r\n * `expandedOverrides` still win on top (the caller wipes them when toggling this).\r\n */\r\n allExpanded?: boolean;\r\n showRowGrandTotals: boolean;\r\n showColumnGrandTotals: boolean;\r\n /**\r\n * dx `rowHeaderLayout`. Defaults to 'tree' — the pre-parity model contract (callers that\r\n * predate the flag keep their flat parent-inline rows); the component always passes its\r\n * own input, whose default is dx's 'standard'.\r\n */\r\n rowHeaderLayout?: NxePivotRowHeaderLayout;\r\n /** dx `showRowTotals` (default true). Renders only in standard layout, exactly as dx:\r\n * \"applies only if rowHeaderLayout is 'standard'\" — tree layout ignores it. */\r\n showRowTotals?: boolean;\r\n /** dx `showColumnTotals` (default true): \"{value} Total\" columns close expanded column\r\n * parents (active since P2-C2 — the column axis renders all N levels). */\r\n showColumnTotals?: boolean;\r\n /** dx `showTotalsPrior` (default 'none'); 'rows'/'both' place each \"{value} Total\" row\r\n * BEFORE its children, 'columns'/'both' each \"{value} Total\" column BEFORE its children. */\r\n showTotalsPrior?: NxePivotTotalsPrior;\r\n /** Display strings (dx `texts`); merged over {@link NXE_PIVOT_TEXTS_DEFAULTS}. */\r\n texts?: NxePivotTexts;\r\n /** dx widget `dataFieldArea` (default 'column'); 'row' moves the measures onto the row\r\n * axis as its innermost level when ≥2 exist (P2-C3). Falls back to the data-source\r\n * options' own `dataFieldArea` when unset here. */\r\n dataFieldArea?: 'row' | 'column';\r\n}\r\n\r\nexport class NxePivotDataSource {\r\n private readonly options: NxePivotDataSourceOptions;\r\n private readonly agg = new Map<string, Agg>();\r\n\r\n /**\r\n * Records that survived `filterValues` and reached the axis trees — the analogue of dx's\r\n * loaded row matrix (`data.values`), which `isEmpty()` tests. Deliberately NOT `agg.size`:\r\n * a record whose measure is null/non-numeric builds axis nodes but no aggregate.\r\n */\r\n private loadedCount = 0;\r\n private rowTree: NxePivotAxisNode[] = [];\r\n /** Column-axis roots (display order) — all N levels render since P2-C2. */\r\n private colTree: NxePivotAxisNode[] = [];\r\n /** The column axis tree (node lookup by pathKey for the header run-length derivation). */\r\n private colAxis: NxePivotAxisTree | null = null;\r\n /** The row axis tree (W4 Lane 2: expand-key → value-path lookups for event payloads). */\r\n private rowAxis: NxePivotAxisTree | null = null;\r\n /** Store-derived fields when no explicit fields were given (dx `retrieveFields` default). */\r\n private readonly derivedFields: NxePivotField[] | null;\r\n /** The normalized clones (caption defaulted, area lower-cased), aligned 1:1 with\r\n * `fields()` — the field panel reads chips/sort state here (P3-C2). */\r\n private readonly normalizedFields: NxePivotField[];\r\n\r\n readonly rowFields: NxePivotField[];\r\n readonly columnFields: NxePivotField[];\r\n /** ALL data-area fields incl. `visible: false` ones (dx `descriptions.values`) — hidden\r\n * measures aggregate and stay addressable by their dataIndex; only rendering skips them. */\r\n readonly dataFields: NxePivotField[];\r\n /** The data fields that actually RENDER (leaves, captions, footers, export, chart). */\r\n private readonly visibleDataFields: NxePivotField[];\r\n /** `area: 'filter'` fields — they exist solely to carry `filterValues` (P2-C3). */\r\n readonly filterFields: NxePivotField[];\r\n\r\n constructor(options: NxePivotDataSourceOptions) {\r\n this.options = options ?? { fields: [] };\r\n // dx default `retrieveFields: true`: with no/empty explicit fields, derive area-less\r\n // fields from the store's first record (available to a future field chooser). Explicit\r\n // fields keep the pre-P1-C3 path byte-identical (dx would additionally MERGE store\r\n // fields alongside them for the chooser — deferred with the chooser itself, Phase 3).\r\n const explicit = this.options.fields ?? [];\r\n this.derivedFields =\r\n explicit.length === 0 && this.options.retrieveFields !== false\r\n ? deriveStoreFields(this.options.store ?? [])\r\n : null;\r\n // Narrow normalisation for persisted report configs: saved JSON can carry `areaIndex`\r\n // as a string ('0') and `area` in stray casing — coerce once where the fields are read.\r\n // A field without an explicit caption gets dx's defaultCaption (humanized dataField;\r\n // aggregating fields suffixed with the summary type, e.g. \"Total Premium (Sum)\").\r\n const fields = (this.derivedFields ?? explicit).map((f) => {\r\n const field: NxePivotField = {\r\n ...f,\r\n caption: f.caption ?? defaultCaption(f),\r\n area:\r\n typeof f.area === 'string'\r\n ? (f.area.toLowerCase() as NxePivotField['area'])\r\n : f.area,\r\n areaIndex: f.areaIndex == null ? f.areaIndex : Number(f.areaIndex),\r\n };\r\n // dx setDefaultFieldValueFormatting (m_widget_utils, via prepareFields — P2-C3):\r\n // a number field with a positive step and no explicit customizeText labels each\r\n // bucket \"start - end\", both ends formatted with the field's own format.\r\n const step = field.dataType === 'number' ? numericGroupInterval(field) : null;\r\n if (step && !field.customizeText && typeof field.selector !== 'function') {\r\n field.customizeText = (ci) => {\r\n const secondText = nxeFormatNumberValue(ci.value + step, field.format, this.options.separators);\r\n const firstText =\r\n typeof ci.value === 'number'\r\n ? nxeFormatNumberValue(ci.value, field.format, this.options.separators)\r\n : ci.valueText;\r\n return firstText && secondText ? `${firstText} - ${secondText}` : '';\r\n };\r\n }\r\n return field;\r\n });\r\n // dx `_createDescriptions` (m_data_source.js:647): `visible: false` excludes a field\r\n // ONLY when its area is neither 'data' nor 'filter'. Hidden ROW/COLUMN fields leave\r\n // their axis entirely; hidden DATA fields STAY in `descriptions.values` — they keep\r\n // aggregating (stable dataIndex among ALL data-area fields, addressable from a\r\n // calculateSummaryValue via `e.value('hidden')` — the dx hidden-helper-measure\r\n // pattern) and only their RENDERING is skipped (m_data_controller `columnIsHidden`);\r\n // hidden FILTER fields keep filtering. (Corrected in P2-C3 — P1-C3 dropped hidden\r\n // measures wholesale.)\r\n this.normalizedFields = fields;\r\n const byArea = (a: string, keepHidden: boolean) =>\r\n fields\r\n .filter((f) => f.area === a && (keepHidden || f.visible !== false))\r\n .sort((x, y) => (x.areaIndex ?? 0) - (y.areaIndex ?? 0));\r\n this.rowFields = byArea('row', false);\r\n this.columnFields = byArea('column', false);\r\n this.dataFields = byArea('data', true);\r\n this.visibleDataFields = this.dataFields.filter((f) => f.visible !== false);\r\n this.filterFields = byArea('filter', true);\r\n this.build();\r\n }\r\n\r\n /** DevExtreme parity: `getDataSource().reload()` re-aggregates the (possibly mutated) store. */\r\n reload(): void {\r\n this.build();\r\n }\r\n\r\n fields(): NxePivotField[] {\r\n return this.derivedFields ?? this.options.fields ?? [];\r\n }\r\n\r\n /**\r\n * P3-C2 (field panel): one panel area's chips — the area's VISIBLE fields in `areaIndex`\r\n * order, each carrying its index in the `fields()` array (the panel's override key) and its\r\n * normalized clone (caption defaulted, area lower-cased). `visible: false` fields never\r\n * chip, matching dx's panel/chooser (m_field_chooser_base `getAreaFields` filters\r\n * `visible !== false` for EVERY area — data/filter included, unlike the aggregation arrays,\r\n * which keep hidden data/filter fields working).\r\n *\r\n * P3-C4: `includeHidden` mirrors dx m_data_source's module-local `getAreaFields`\r\n * (`canAddFieldInArea = area === 'data' || field.visible !== false`) — the areaIndex\r\n * RENUMBERING after a drop runs over the DATA area's hidden fields too (dx\r\n * `_createDescriptions` → `normalizeIndexes(getAreaFields(fields, areaName), 'areaIndex')`),\r\n * while hidden row/column/filter fields stay outside the numbering, dx-true.\r\n */\r\n areaFields(\r\n area: NxePivotArea,\r\n includeHidden = false,\r\n ): { fieldIndex: number; field: NxePivotField }[] {\r\n return this.normalizedFields\r\n .map((field, fieldIndex) => ({ fieldIndex, field }))\r\n .filter(\r\n ({ field }) =>\r\n field.area === area &&\r\n ((includeHidden && area === 'data') || field.visible !== false),\r\n )\r\n .sort((x, y) => (x.field.areaIndex ?? 0) - (y.field.areaIndex ?? 0));\r\n }\r\n\r\n /**\r\n * P3-C4 (chip header filter) — dx `getFieldValues(index)` (m_data_source.js:524) scoped to\r\n * the local store: the field's DISTINCT PREPARED values (the `groupInterval` group value\r\n * where one is set — dx loads the field as a lone expanded column through prepareFields)\r\n * with their display labels (`fieldText`: interval labels, date formats, customizeText),\r\n * sorted ascending by raw value. Built from the UNFILTERED store: dx passes `filters: []`\r\n * unless `headerFilter.showRelevantValues` is on (default false — the nxe panel always\r\n * shows the full list, exactly like the grid's non-cascading lists), and the field's own\r\n * `filterValues` are always ignored (`filterValues: null` on the load field). Dedupe is\r\n * by `valueOf()` (dates by instant), the dx grouping key.\r\n */\r\n getFieldValues(index: number): { value: any; text: string }[] {\r\n const field = this.normalizedFields[index];\r\n if (!field) {\r\n return [];\r\n }\r\n const seen = new Map<any, { value: any; text: string }>();\r\n for (const rec of (this.options.store ?? []) as any[]) {\r\n const raw = readGroupedField(rec, field);\r\n const key = raw != null ? raw.valueOf() : raw;\r\n if (!seen.has(key)) {\r\n seen.set(key, { value: raw, text: fieldText(field, raw) });\r\n }\r\n }\r\n return [...seen.values()].sort((a, b) => {\r\n if (a.value == null) return b.value == null ? 0 : -1;\r\n if (b.value == null) return 1;\r\n if (typeof a.value === 'number' && typeof b.value === 'number') {\r\n return a.value - b.value;\r\n }\r\n return String(a.value).localeCompare(String(b.value));\r\n });\r\n }\r\n\r\n /** The normalized clone of `fields()[index]` (P3-C2 — chip captions/sort state read here). */\r\n fieldAt(index: number): NxePivotField | undefined {\r\n return this.normalizedFields[index];\r\n }\r\n\r\n /**\r\n * P3-C2 (field panel): a NEW data source over the SAME store/options with `fields`\r\n * replacing the field list — how the component applies its fieldOverride merge without\r\n * ever touching the caller's options (report-output-pivot serializes its own fields\r\n * array in `onSave`).\r\n */\r\n cloneWithFields(fields: NxePivotField[]): NxePivotDataSource {\r\n return new NxePivotDataSource({ ...this.options, fields });\r\n }\r\n\r\n /**\r\n * dx m_local_store `areValuesEqual`, verbatim: `valueOf()` comparison (dates by time), and\r\n * an ARRAY filter value compares element-wise (dx's `levels` shape — kept for parity even\r\n * though nxe has no grouped hierarchy fields).\r\n */\r\n private static areValuesEqual(filterValue: any, fieldValue: any): boolean {\r\n let valueOfFilter = filterValue && filterValue.valueOf();\r\n let valueOfField = fieldValue && fieldValue.valueOf();\r\n if (Array.isArray(filterValue)) {\r\n fieldValue = fieldValue || [];\r\n for (let i = 0; i < filterValue.length; i += 1) {\r\n valueOfFilter = filterValue[i] && filterValue[i].valueOf();\r\n valueOfField = fieldValue[i] && fieldValue[i].valueOf();\r\n if (valueOfFilter !== valueOfField) {\r\n return false;\r\n }\r\n }\r\n return true;\r\n }\r\n return valueOfFilter === valueOfField;\r\n }\r\n\r\n /**\r\n * dx m_local_store `createDimensionFilters` + `createFilter` (P2-C3): one predicate per\r\n * row/column/filter-area field with a non-empty `filterValues`, comparing the PREPARED\r\n * value (the group value when `groupInterval` is set) against each filter value;\r\n * `filterType: 'exclude'` inverts. Returns null when nothing filters — the fast path.\r\n */\r\n private buildRecordFilter(): ((rec: any) => boolean) | null {\r\n const predicates: ((rec: any) => boolean)[] = [];\r\n for (const field of [...this.rowFields, ...this.columnFields, ...this.filterFields]) {\r\n const filterValues = field.filterValues || [];\r\n if (!filterValues.length) {\r\n continue;\r\n }\r\n predicates.push((rec) => {\r\n const value = readGroupedField(rec, field);\r\n let result = false;\r\n for (let i = 0; i < filterValues.length; i += 1) {\r\n if (NxePivotDataSource.areValuesEqual(filterValues[i], value)) {\r\n result = true;\r\n break;\r\n }\r\n }\r\n return field.filterType === 'exclude' ? !result : result;\r\n });\r\n }\r\n if (!predicates.length) {\r\n return null;\r\n }\r\n return (rec) => predicates.every((p) => p(rec));\r\n }\r\n\r\n private build(): void {\r\n this.agg.clear();\r\n this.loadedCount = 0;\r\n const store = (this.options.store ?? []) as any[];\r\n\r\n // Both axes run through the shared tree builder (P2-C1) and both render all N levels\r\n // (P2-C2) — one code path for dedupe, first-seen order, and labels. Dimension values\r\n // read through the groupInterval-aware reader (P2-C3 — identical to the plain read\r\n // for interval-less fields).\r\n const rowAxis = new NxePivotAxisTree(\r\n this.rowFields,\r\n readGroupedField,\r\n fieldText,\r\n ROW_KEY_PREFIX,\r\n );\r\n const colAxis = new NxePivotAxisTree(\r\n this.columnFields,\r\n readGroupedField,\r\n fieldText,\r\n COLUMN_KEY_PREFIX,\r\n );\r\n\r\n // dx applies filterValues at record intake — filtered records reach neither the axis\r\n // trees nor the aggregation (m_local_store `loadCore`: `if (filter(data)) …`).\r\n const recordFilter = this.buildRecordFilter();\r\n\r\n for (const rec of store) {\r\n if (recordFilter && !recordFilter(rec)) {\r\n continue;\r\n }\r\n this.loadedCount++;\r\n const rowRaw = rowAxis.insert(rec);\r\n const colRaw = colAxis.insert(rec);\r\n\r\n const rowPreKeys = prefixKeys(rowRaw);\r\n const colPreKeys = prefixKeys(colRaw);\r\n this.dataFields.forEach((df, di) => {\r\n const rawV = readGroupedField(rec, df);\r\n const isCustom = df.summaryType === 'custom';\r\n // dx's count aggregator steps on any DEFINED value (`step: count => 1 + count`,\r\n // m_utils) — it never coerces — and it is also the default when a field carries\r\n // no summaryType. Counting fields therefore take a different intake gate than\r\n // sum/min/max/avg, or a text column dragged into the Data area counts 0.\r\n const isCounting =\r\n !isCustom && (df.summaryType === undefined || df.summaryType === 'count');\r\n let num = 0;\r\n if (isCounting) {\r\n if (rawV == null || rawV === '') {\r\n return;\r\n }\r\n const coerced = typeof rawV === 'number' ? rawV : Number(rawV);\r\n num = isNaN(coerced) ? 0 : coerced;\r\n } else if (!isCustom) {\r\n num = typeof rawV === 'number' ? rawV : Number(rawV);\r\n if (rawV == null || rawV === '' || isNaN(num)) {\r\n return;\r\n }\r\n }\r\n for (const rk of rowPreKeys) {\r\n for (const ck of colPreKeys) {\r\n const k = rk + KEY_SEP + ck + KEY_SEP + di;\r\n let a = this.agg.get(k);\r\n if (!a) {\r\n a = newAgg();\r\n if (isCustom) {\r\n // dx seeds a custom cell whenever a record touches the\r\n // intersection — even when this record's own value is null.\r\n a.raw = [];\r\n a.customField = df;\r\n }\r\n this.agg.set(k, a);\r\n }\r\n if (isCustom) {\r\n // dx steps only DEFINED values ('calculate' is skipped for\r\n // null/undefined), and passes the value raw — no Number coercion.\r\n if (rawV != null) {\r\n a.raw?.push(rawV);\r\n }\r\n } else {\r\n accumulate(a, num);\r\n }\r\n }\r\n }\r\n });\r\n }\r\n\r\n this.runCustomSummaries();\r\n this.sortTree(rowAxis.roots, 0, this.rowFields);\r\n this.sortTree(colAxis.roots, 0, this.columnFields);\r\n this.rowTree = rowAxis.roots;\r\n this.colTree = colAxis.roots;\r\n this.colAxis = colAxis;\r\n this.rowAxis = rowAxis;\r\n }\r\n\r\n /**\r\n * W4 Lane 2: resolve a namespaced expand key (`'r:'`/`'c:'` + encoded value path) back to\r\n * its node's raw value path — the `path` a dx header-cell event payload carries. Returns\r\n * null for an unknown/empty key (e.g. the grand-total pseudo cells, which have no node).\r\n */\r\n nodePath(pathKey: string): any[] | null {\r\n if (!pathKey) {\r\n return null;\r\n }\r\n const tree = pathKey.startsWith(COLUMN_KEY_PREFIX) ? this.colAxis : this.rowAxis;\r\n return tree?.find(pathKey)?.path ?? null;\r\n }\r\n\r\n /**\r\n * W4 Lane 3 — dx `isEmpty()` (m_data_source.js): `!dataFields.length || !data.values.length`.\r\n * dx's `data.values` is the LOADED row matrix, which exists for every record regardless of\r\n * whether its measure aggregated to a number, so this counts loaded records rather than\r\n * aggregates: a store whose only measure is text (or null throughout) still renders its full\r\n * cross-tab with blank cells in dx — testing `agg.size` instead stamped \"No data\" over it.\r\n */\r\n isEmpty(): boolean {\r\n return this.visibleDataFields.length === 0 || this.loadedCount === 0;\r\n }\r\n\r\n /**\r\n * dx custom-summary protocol (m_local_store `getAggregator`), run per aggregated cell: ONE\r\n * options object per cell is passed through 'start', then 'calculate' once per defined raw\r\n * value (`options.value` set), then 'finalize' (`options.value` deleted); the cell's result\r\n * is whatever the callback left in `totalValue`. dx interleaves the 'calculate' calls of\r\n * different cells while streaming records; nxe runs each cell's protocol contiguously after\r\n * the load — the per-cell sequence (dx's documented contract) is identical.\r\n */\r\n private runCustomSummaries(): void {\r\n for (const a of this.agg.values()) {\r\n const field = a.customField;\r\n if (!field) {\r\n continue;\r\n }\r\n // dx: `field.calculateCustomSummary = field.calculateCustomSummary || noop`.\r\n const callback =\r\n typeof field.calculateCustomSummary === 'function'\r\n ? field.calculateCustomSummary\r\n : (): void => undefined;\r\n const options: NxePivotCustomSummaryInfo = {\r\n summaryProcess: 'start',\r\n totalValue: undefined,\r\n };\r\n callback(options);\r\n for (const value of a.raw ?? []) {\r\n options.summaryProcess = 'calculate';\r\n options.value = value;\r\n callback(options);\r\n }\r\n options.summaryProcess = 'finalize';\r\n delete options.value;\r\n callback(options);\r\n a.custom = options.totalValue;\r\n // W4 Lane 4: the raw-value buffer exists only to drive this protocol — release it\r\n // after 'finalize' (a large store would otherwise retain every raw value of every\r\n // custom cell for the engine's lifetime; dx streams and never buffers them).\r\n a.raw = undefined;\r\n a.customField = undefined;\r\n }\r\n }\r\n\r\n /**\r\n * Sort one axis level in place, honouring `sortOrder` + `sortBy` (dx m_data_source_utils\r\n * `getMemberForSortBy`): default/'value' compares the raw values, 'displayText' compares the\r\n * formatted labels (format + customizeText already applied), 'none' keeps load order\r\n * (reversed for desc — dx compares the load index).\r\n */\r\n private sortLevel(\r\n entries: { value: any; label: string }[],\r\n field: NxePivotField | undefined,\r\n ): void {\r\n if (field?.sortBy === 'none') {\r\n if (field?.sortOrder === 'desc') {\r\n entries.reverse();\r\n }\r\n return;\r\n }\r\n entries.sort((a, b) => this.compareValues(a, b, field));\r\n }\r\n\r\n private compareValues(\r\n x: { value: any; label: string },\r\n y: { value: any; label: string },\r\n field: NxePivotField | undefined,\r\n ): number {\r\n const dir = field?.sortOrder === 'desc' ? -1 : 1;\r\n if (field?.sortBy === 'displayText') {\r\n // Labels are always strings ('' for null raws) — dx sorts the header item's `text`.\r\n return x.label.localeCompare(y.label) * dir;\r\n }\r\n const a = x.value;\r\n const b = y.value;\r\n if (a == null) return b == null ? 0 : -dir;\r\n if (b == null) return dir;\r\n if (typeof a === 'number' && typeof b === 'number') {\r\n return (a - b) * dir;\r\n }\r\n return String(a).localeCompare(String(b)) * dir;\r\n }\r\n\r\n private sortTree(nodes: NxePivotAxisNode[], level: number, fields: NxePivotField[]): void {\r\n this.sortLevel(nodes, fields[level]);\r\n for (const n of nodes) {\r\n if (n.children.length) {\r\n this.sortTree(n.children, level + 1, fields);\r\n }\r\n }\r\n }\r\n\r\n /** Raw aggregate at (rowPath × colPath × data field) — the pre-display-mode value. */\r\n private valueAt(rowPath: any[], colPath: any[], dataIndex: number): number | null {\r\n const a = this.agg.get(keyOf(rowPath, colPath, dataIndex));\r\n // No `?? 'sum'` — an absent summaryType must reach resolveAgg so dx's count default wins.\r\n return resolveAgg(a, this.dataFields[dataIndex]?.summaryType);\r\n }\r\n\r\n cell(rowPath: any[], leaf: NxePivotColumnLeaf): number | null {\r\n return this.valueAt(rowPath, leaf.colPath, leaf.dataIndex);\r\n }\r\n\r\n text(rowPath: any[], leaf: NxePivotColumnLeaf): string {\r\n return dataText(this.dataFields[leaf.dataIndex], this.cell(rowPath, leaf), this.options.separators);\r\n }\r\n\r\n numFmt(dataIndex: number): string | undefined {\r\n return nxeExcelNumFmt(this.dataFields[dataIndex]?.format);\r\n }\r\n\r\n /** Build the renderable/exportable cross-tab model for the given expand state + totals flags. */\r\n getModel(opts: NxePivotModelOptions): NxePivotModel {\r\n const texts = { ...NXE_PIVOT_TEXTS_DEFAULTS, ...opts.texts };\r\n const rowHeaderLayout = opts.rowHeaderLayout ?? 'tree';\r\n const showRowTotals = opts.showRowTotals ?? true;\r\n const showColumnTotals = opts.showColumnTotals ?? true;\r\n const showTotalsPrior = opts.showTotalsPrior ?? 'none';\r\n const totalsPriorCols = showTotalsPrior === 'columns' || showTotalsPrior === 'both';\r\n // dx `dataFieldArea` is a widget option (m_widget default 'column'); the data-source\r\n // options object may also carry it (the pre-parity nxe surface) as the fallback.\r\n const dataFieldArea = opts.dataFieldArea ?? this.options.dataFieldArea ?? 'column';\r\n // With exactly ONE measure dx omits the metric level on EITHER axis (the\r\n // `cellDescriptionsCount > 1` gate in m_data_controller getViewHeaderItems), so\r\n // measures move onto the row axis only when two or more exist.\r\n const measuresOnRows = dataFieldArea === 'row' && this.dataFields.length > 1;\r\n const leaves = this.buildLeaves(\r\n opts.showColumnGrandTotals,\r\n showColumnTotals,\r\n totalsPriorCols,\r\n opts.expandedOverrides,\r\n opts.allExpanded,\r\n measuresOnRows,\r\n );\r\n const columnHeaderRows = this.buildColumnHeaders(\r\n leaves,\r\n texts,\r\n showColumnTotals,\r\n totalsPriorCols,\r\n measuresOnRows,\r\n );\r\n let rows =\r\n rowHeaderLayout === 'standard'\r\n ? this.flattenStandardRows(\r\n opts.expandedOverrides,\r\n opts.allExpanded,\r\n showRowTotals,\r\n showTotalsPrior === 'rows' || showTotalsPrior === 'both',\r\n texts,\r\n )\r\n : this.flattenTreeRows(opts.expandedOverrides, opts.allExpanded);\r\n if (measuresOnRows) {\r\n // dx appends metric children to every row header item (D, T, and GT alike) —\r\n // each axis row splits into one row per data field (m_data_controller).\r\n rows = this.splitRowsByMeasures(rows, rowHeaderLayout);\r\n }\r\n\r\n // P2-C3 post-aggregation passes (dx m_data_source._update ordering: display modes,\r\n // then running totals over the display-mode results). Null — the zero-cost path —\r\n // whenever no data field opts in.\r\n const post = this.buildPostProcessed(opts.expandedOverrides, opts.allExpanded);\r\n const resolveValue = (rowPath: any[], colPath: any[], di: number): number | null => {\r\n if (post) {\r\n const ri = post.rowIndexByKey.get(pathKeyOf(rowPath));\r\n const ci = post.colIndexByKey.get(pathKeyOf(colPath));\r\n if (ri !== undefined && ci !== undefined) {\r\n const cellArr = post.data.values[ri]?.[ci];\r\n if (cellArr) {\r\n const v = cellArr[di];\r\n return v === undefined ? null : v;\r\n }\r\n }\r\n }\r\n return this.valueAt(rowPath, colPath, di);\r\n };\r\n\r\n const grandTotalCells =\r\n !measuresOnRows && opts.showRowGrandTotals && this.visibleDataFields.length > 0\r\n ? leaves.map((leaf) => {\r\n const value = resolveValue([], leaf.colPath, leaf.dataIndex);\r\n return { value, text: dataText(this.dataFields[leaf.dataIndex], value, this.options.separators) };\r\n })\r\n : null;\r\n // Measures-on-rows: the grand-total footer splits into one row per VISIBLE measure,\r\n // exactly as the body rows do (dx gives the GT header item metric children too).\r\n const grandTotalRows =\r\n measuresOnRows && opts.showRowGrandTotals && this.visibleDataFields.length > 0\r\n ? this.visibleDataFields.map((df) => {\r\n const di = this.dataFields.indexOf(df);\r\n return {\r\n dataIndex: di,\r\n caption: df.caption ?? df.dataField ?? '',\r\n cells: leaves.map((leaf) => {\r\n const value = resolveValue([], leaf.colPath, di);\r\n return { value, text: dataText(df, value, this.options.separators) };\r\n }),\r\n };\r\n })\r\n : null;\r\n\r\n // Measures-on-rows adds the metric column AFTER the dimension columns (dx places the\r\n // metric items one depth past `depthSize`).\r\n const dimHeaderCols = rowHeaderLayout === 'standard' ? Math.max(1, this.rowFields.length) : 1;\r\n const rowHeaderColCount = dimHeaderCols + (measuresOnRows ? 1 : 0);\r\n // `field.width` → the field's table column(s): row fields size their row-header column\r\n // (dx m_data_controller sets item.width off the axis field), data fields size every leaf\r\n // column they occupy (dx: `if (dataField.width) row[columnIndex].width = ...`); the\r\n // measure column and measures-on-rows leaf columns (shared by all measures) get none.\r\n const colWidths: (number | null)[] = [\r\n ...Array.from({ length: dimHeaderCols }, (_, i) => this.rowFields[i]?.width ?? null),\r\n ...(measuresOnRows ? [null] : []),\r\n ...leaves.map((leaf) =>\r\n measuresOnRows ? null : this.dataFields[leaf.dataIndex]?.width ?? null,\r\n ),\r\n ];\r\n\r\n // Dense value matrix, built ONCE per model: every visible row × every leaf resolved\r\n // eagerly (subtotal rows and total columns included), then formatted alongside. The\r\n // renderer and the export read the matrices; `cell()`/`text()` become matrix reads for\r\n // any (visible row path × model leaf) pair and fall back to the aggregation map for\r\n // everything else (grand-total path `[]`, hidden paths, leaves from an older model).\r\n // With measures on rows the ROW carries the data index; otherwise the leaf does.\r\n const matrix: (number | null)[][] = rows.map((row) =>\r\n leaves.map((leaf) =>\r\n resolveValue(row.path, leaf.colPath, row.dataIndex ?? leaf.dataIndex),\r\n ),\r\n );\r\n const textMatrix: string[][] = matrix.map((mr, ri) =>\r\n mr.map((v, li) =>\r\n dataText(this.dataFields[rows[ri].dataIndex ?? leaves[li].dataIndex], v, this.options.separators),\r\n ),\r\n );\r\n const rowIndexByPath = new Map<string, number>();\r\n rows.forEach((row, ri) => {\r\n const key = pathKeyOf(row.path);\r\n if (!rowIndexByPath.has(key)) {\r\n rowIndexByPath.set(key, ri);\r\n }\r\n });\r\n const leafIndex = new Map<NxePivotColumnLeaf, number>();\r\n leaves.forEach((leaf, li) => leafIndex.set(leaf, li));\r\n\r\n // W4 Lane 4 (bindChart series naming): each leaf's formatted labels along its colPath.\r\n const colLabels: string[][] = leaves.map((leaf) =>\r\n leaf.colPath.map(\r\n (_, i) =>\r\n this.colAxis?.find(\r\n COLUMN_KEY_PREFIX + pathKeyOf(leaf.colPath.slice(0, i + 1)),\r\n )?.label ?? '',\r\n ),\r\n );\r\n\r\n const ds = this;\r\n return {\r\n rowFields: this.rowFields,\r\n columnFields: this.columnFields,\r\n dataFields: this.dataFields,\r\n cornerText: this.rowFields.map((f) => f.caption ?? f.dataField ?? '').join(' / '),\r\n columnHeaderRows,\r\n leaves,\r\n rows,\r\n rowHeaderLayout,\r\n rowHeaderColCount,\r\n showRowTotals,\r\n showColumnTotals,\r\n showTotalsPrior,\r\n showRowGrandTotals: !!grandTotalCells || !!grandTotalRows,\r\n grandTotalCells,\r\n grandTotalRows,\r\n dataFieldArea,\r\n colWidths,\r\n colLabels,\r\n texts,\r\n matrix,\r\n textMatrix,\r\n // Matrix hits are a SNAPSHOT of this build; the out-of-matrix fallback reads the\r\n // LIVE engine — after an in-place `reload()` (instance inputs, W4 Lane 1) a\r\n // RETAINED model's fallback sees the fresh aggregates while its matrix stays\r\n // frozen, exactly like dx cells reading live loaded data (DEFAULTS.md, W4).\r\n cell: (rp, leaf) => {\r\n const ri = rowIndexByPath.get(pathKeyOf(rp));\r\n const li = leafIndex.get(leaf);\r\n return ri !== undefined && li !== undefined ? matrix[ri][li] : ds.cell(rp, leaf);\r\n },\r\n text: (rp, leaf) => {\r\n const ri = rowIndexByPath.get(pathKeyOf(rp));\r\n const li = leafIndex.get(leaf);\r\n return ri !== undefined && li !== undefined\r\n ? textMatrix[ri][li]\r\n : ds.text(rp, leaf);\r\n },\r\n numFmt: (di) => ds.numFmt(di),\r\n };\r\n }\r\n\r\n /**\r\n * Recursive column-leaf emission over the N-level column tree — the ONE place the visible\r\n * column order is decided; header rows are derived from its output. dx semantics (oracle §a\r\n * mirrored to columns + `oracle/hierarchy-*-matrix.json`; dx m_data_controller\r\n * `getViewHeaderItems`): an EXPANDED parent contributes no value column of its own — its\r\n * children render, and (with `showColumnTotals`) a \"{value} Total\" column carrying the\r\n * parent's aggregates closes the group AFTER the children (dx splices the 'T' item as a\r\n * sibling at `index + 1`; `showTotalsPrior` 'columns'/'both' splices at `index`, i.e.\r\n * BEFORE). A COLLAPSED parent is a single 'D' column with inline aggregates. The grand\r\n * total stays LAST regardless of totalsPrior — the established nxe deviation (DEFAULTS.md:\r\n * dx would move it first, as it moves the grand-total row on the row axis).\r\n */\r\n private buildLeaves(\r\n showColumnGrandTotals: boolean,\r\n showColumnTotals: boolean,\r\n totalsPrior: boolean,\r\n overrides: ReadonlyMap<string, boolean>,\r\n allExpanded: boolean | undefined,\r\n measuresOnRows = false,\r\n ): NxePivotColumnLeaf[] {\r\n const leaves: NxePivotColumnLeaf[] = [];\r\n const push = (kind: 'D' | 'T' | 'GT', colPath: any[], colKey: string, level: number) => {\r\n if (measuresOnRows) {\r\n // Measures live on the row axis (P2-C3): ONE leaf per column path; its\r\n // dataIndex is meaningless (dx getCellsInfo reads the ROW's dataIndex).\r\n leaves.push({ colPath, dataIndex: 0, kind, colKey, level, isGrandTotal: kind === 'GT' });\r\n return;\r\n }\r\n this.dataFields.forEach((df, di) => {\r\n if (df.visible === false) {\r\n return; // dx m_data_controller `columnIsHidden` — hidden measures render no columns\r\n }\r\n leaves.push({\r\n colPath,\r\n dataIndex: di,\r\n kind,\r\n colKey,\r\n level,\r\n isGrandTotal: kind === 'GT',\r\n });\r\n });\r\n };\r\n if (this.columnFields.length === 0) {\r\n if (measuresOnRows) {\r\n // No column dimension AND measures on rows: the single remaining column IS\r\n // the grand total (dx renders the pushed GT item; a blank 'D' column when\r\n // grand totals are off).\r\n push(showColumnGrandTotals ? 'GT' : 'D', [], '', -1);\r\n return leaves;\r\n }\r\n // No column dimension: the data fields are themselves the columns.\r\n push('D', [], '', -1);\r\n return leaves;\r\n }\r\n const visit = (node: NxePivotAxisNode): void => {\r\n const open =\r\n node.children.length > 0 &&\r\n this.isExpanded(node, overrides, allExpanded, this.columnFields);\r\n if (!open) {\r\n push('D', node.path, node.pathKey, node.level);\r\n return;\r\n }\r\n if (totalsPrior && showColumnTotals) {\r\n push('T', node.path, node.pathKey, node.level);\r\n }\r\n for (const child of node.children) {\r\n visit(child);\r\n }\r\n if (!totalsPrior && showColumnTotals) {\r\n push('T', node.path, node.pathKey, node.level);\r\n }\r\n };\r\n for (const root of this.colTree) {\r\n visit(root);\r\n }\r\n if (showColumnGrandTotals && this.dataFields.length > 0) {\r\n push('GT', [], '', -1);\r\n }\r\n return leaves;\r\n }\r\n\r\n /**\r\n * The header cell above leaf-run position `r` exists iff this returns non-null; leaves with\r\n * EQUAL ids at row `r` merge into one run-length cell. A 'D' prefix id merges an expanded\r\n * parent's label over its whole visible subtree (children's 'T' columns included — capture:\r\n * colSpan 21 spans nested totals); the parent's OWN 'T' leaf and the 'GT' leaves carry\r\n * distinct ids so they never fold into a value cell.\r\n */\r\n private headerIdAt(leaf: NxePivotColumnLeaf, r: number): string | null {\r\n if (leaf.kind === 'GT') {\r\n return r === 0 ? 'GT' : null;\r\n }\r\n const nodeRow = leaf.colPath.length - 1;\r\n if (r > nodeRow) {\r\n return null;\r\n }\r\n if (leaf.kind === 'T' && r === nodeRow) {\r\n return 'T:' + pathKeyOf(leaf.colPath);\r\n }\r\n return 'D:' + pathKeyOf(leaf.colPath.slice(0, r + 1));\r\n }\r\n\r\n /** Materialize the run-length cell for `span` consecutive leaves starting at `leaf`, row `r`. */\r\n private headerCellAt(\r\n leaf: NxePivotColumnLeaf,\r\n r: number,\r\n span: number,\r\n depth: number,\r\n texts: Required<NxePivotTexts>,\r\n showColumnTotals: boolean,\r\n totalsPrior: boolean,\r\n ): NxePivotHeaderCell {\r\n if (leaf.kind === 'GT') {\r\n const cell: NxePivotHeaderCell = {\r\n text: texts.grandTotal,\r\n colspan: span,\r\n isGrandTotal: true,\r\n };\r\n if (depth > 1) {\r\n cell.rowspan = depth; // dx depthSize: fills every value row\r\n }\r\n return cell;\r\n }\r\n const nodeRow = leaf.colPath.length - 1;\r\n const node = this.colAxis?.find(\r\n COLUMN_KEY_PREFIX + pathKeyOf(leaf.colPath.slice(0, r + 1)),\r\n );\r\n const label = node?.label ?? '';\r\n if (leaf.kind === 'T' && r === nodeRow) {\r\n // dx blank-parent rule: '' + '{0} Total' renders as just 'Total'.\r\n const cell: NxePivotHeaderCell = {\r\n text: texts.total.replace('{0}', label).trim(),\r\n colspan: span,\r\n isGrandTotal: false,\r\n isTotal: true,\r\n };\r\n if (depth - r > 1) {\r\n cell.rowspan = depth - r; // capture: rowSpan 3 at level 0 / 2 at level 1\r\n }\r\n if (totalsPrior && node) {\r\n // dx quirk (m_data_controller): with showTotalsPrior the spliced 'T' item gets\r\n // `expanded: true` and the 'D' item's flag is nulled — the chevron moves to the\r\n // \"{value} Total\" cell.\r\n cell.expandable = true;\r\n cell.expanded = true;\r\n cell.pathKey = node.pathKey;\r\n }\r\n return cell;\r\n }\r\n const cell: NxePivotHeaderCell = { text: label, colspan: span, isGrandTotal: false };\r\n if (leaf.kind === 'D' && r === nodeRow) {\r\n // The leaf's own node row: a collapsed parent (chevron) or a deepest-level value.\r\n if (depth - r > 1) {\r\n cell.rowspan = depth - r;\r\n }\r\n if (node && node.children.length > 0) {\r\n cell.expandable = true;\r\n cell.expanded = false;\r\n cell.pathKey = node.pathKey;\r\n }\r\n } else if (node && !(totalsPrior && showColumnTotals)) {\r\n // An expanded parent's group label (the chevron sits here unless totalsPrior moved\r\n // it to the 'T' cell — see above).\r\n cell.expandable = true;\r\n cell.expanded = true;\r\n cell.pathKey = node.pathKey;\r\n }\r\n return cell;\r\n }\r\n\r\n /**\r\n * Header rows DERIVED from the leaf array by run-length encoding — never a second\r\n * independent walk of the column tree, so span/leaf misalignment is structurally\r\n * impossible. Value rows = the deepest visible level (dx `depthSize`); the measure-caption\r\n * row is appended LAST and ONLY when two or more data fields exist (oracle §b: with exactly\r\n * one measure dx drops the caption row entirely — `oracle/single-measure-matrix.json`).\r\n */\r\n private buildColumnHeaders(\r\n leaves: NxePivotColumnLeaf[],\r\n texts: Required<NxePivotTexts>,\r\n showColumnTotals: boolean,\r\n totalsPrior: boolean,\r\n measuresOnRows = false,\r\n ): NxePivotHeaderCell[][] {\r\n const dataCaption = (di: number) =>\r\n this.dataFields[di]?.caption ?? this.dataFields[di]?.dataField ?? '';\r\n\r\n if (this.columnFields.length === 0) {\r\n if (measuresOnRows) {\r\n // Measures on rows leave a single column: the grand total (or a blank 'D'\r\n // column when grand totals are off) — see buildLeaves.\r\n const isGT = leaves[0]?.kind === 'GT';\r\n return [[{ text: isGT ? texts.grandTotal : '', colspan: 1, isGrandTotal: isGT }]];\r\n }\r\n // Single header row: one cell per VISIBLE data field (measures ARE the columns —\r\n // the caption-omission rule applies only under column values). Leaf-driven so a\r\n // hidden measure's caption can never surface.\r\n return [\r\n leaves.map((leaf) => ({\r\n text: dataCaption(leaf.dataIndex),\r\n colspan: 1,\r\n isGrandTotal: false,\r\n })),\r\n ];\r\n }\r\n\r\n let depth = 1;\r\n for (const leaf of leaves) {\r\n depth = Math.max(depth, leaf.colPath.length);\r\n }\r\n const rows: NxePivotHeaderCell[][] = [];\r\n for (let r = 0; r < depth; r++) {\r\n const row: NxePivotHeaderCell[] = [];\r\n let i = 0;\r\n while (i < leaves.length) {\r\n const id = this.headerIdAt(leaves[i], r);\r\n if (id === null) {\r\n i++;\r\n continue;\r\n }\r\n let j = i + 1;\r\n while (j < leaves.length && this.headerIdAt(leaves[j], r) === id) {\r\n j++;\r\n }\r\n row.push(\r\n this.headerCellAt(leaves[i], r, j - i, depth, texts, showColumnTotals, totalsPrior),\r\n );\r\n i = j;\r\n }\r\n rows.push(row);\r\n }\r\n // The gate counts ALL data fields incl. hidden ones (dx `cellDescriptionsCount > 1`,\r\n // m_data_controller): 2 measures with 1 hidden still render the caption row — showing\r\n // only the visible caption, because the cells map over the (visible-only) leaves.\r\n if (this.dataFields.length > 1 && !measuresOnRows) {\r\n rows.push(\r\n leaves.map((leaf) => {\r\n const cell: NxePivotHeaderCell = {\r\n text: dataCaption(leaf.dataIndex),\r\n colspan: 1,\r\n isGrandTotal: leaf.kind === 'GT',\r\n };\r\n if (leaf.kind === 'T') {\r\n cell.isTotal = true; // dx: metric cells inherit their leaf's type\r\n }\r\n return cell;\r\n }),\r\n );\r\n }\r\n return rows;\r\n }\r\n\r\n /**\r\n * `dataFieldArea: 'row'` with ≥2 measures (P2-C3): split every body row into one row per\r\n * data field — dx appends metric children (caption / `dataIndex` / `isMetric`, type\r\n * inherited) to EVERY row header item, D, T and GT alike (m_data_controller\r\n * getViewHeaderItems). The dimension label cells attach to the FIRST measure row with\r\n * their rowspans multiplied (each underlying axis row now spans M rendered rows); every\r\n * measure row appends the caption cell as the innermost row-header column.\r\n */\r\n private splitRowsByMeasures(\r\n rows: NxePivotBodyRow[],\r\n layout: NxePivotRowHeaderLayout,\r\n ): NxePivotBodyRow[] {\r\n // Only VISIBLE measures render rows (dx skips hidden metric children); each keeps its\r\n // ORIGINAL dataIndex among ALL data fields so cell addressing stays stable.\r\n const measures = this.dataFields\r\n .map((df, di) => ({ df, di }))\r\n .filter(({ df }) => df.visible !== false);\r\n if (measures.length === 0) {\r\n return rows;\r\n }\r\n const measureCol = layout === 'standard' ? Math.max(1, this.rowFields.length) : 1;\r\n const out: NxePivotBodyRow[] = [];\r\n for (const row of rows) {\r\n measures.forEach(({ df, di }, mi) => {\r\n const caption = df.caption ?? df.dataField ?? '';\r\n const measureCell: NxePivotRowHeaderCell = {\r\n text: caption,\r\n col: measureCol,\r\n rowspan: 1,\r\n colspan: 1,\r\n expandable: false,\r\n expanded: false,\r\n isTotal: row.kind === 'T',\r\n pathKey: row.pathKey,\r\n };\r\n out.push({\r\n ...row,\r\n dataIndex: di,\r\n measureCaption: caption,\r\n measureRowspan: mi === 0 ? measures.length : 0,\r\n trackKey: row.pathKey + KEY_SEP + row.kind + KEY_SEP + di,\r\n headerCells:\r\n mi === 0\r\n ? [\r\n ...row.headerCells.map((hc) => ({\r\n ...hc,\r\n rowspan: hc.rowspan * measures.length,\r\n })),\r\n measureCell,\r\n ]\r\n : [measureCell],\r\n });\r\n });\r\n }\r\n return out;\r\n }\r\n\r\n /**\r\n * P2-C3: run the dx post-aggregation passes (`summaryDisplayMode` / `calculateSummaryValue`\r\n * via applyDisplaySummaryMode, then `runningTotal` via applyRunningTotal — the\r\n * m_data_source._update ordering) over the VISIBLE axis trees of this model build. dx\r\n * computes these on its loaded data, which only contains children for expanded paths — the\r\n * visible tree IS dx's loaded tree, so prev/next/children navigation and group-boundary\r\n * resets see exactly what dx sees. Returns null (the untouched fast path) when no data\r\n * field opts in or nothing aggregated.\r\n */\r\n private buildPostProcessed(\r\n overrides: ReadonlyMap<string, boolean>,\r\n allExpanded: boolean | undefined,\r\n ): {\r\n data: NxePivotSummaryData;\r\n rowIndexByKey: Map<string, number>;\r\n colIndexByKey: Map<string, number>;\r\n } | null {\r\n const expressionsUsed = this.dataFields.some(\r\n (f) => !!f.summaryDisplayMode || typeof f.calculateSummaryValue === 'function',\r\n );\r\n const runningTotalUsed = this.dataFields.some((f) => !!f.runningTotal);\r\n // dx: `!that.isEmpty() && …` — an empty load (no aggregated values) skips both passes.\r\n if ((!expressionsUsed && !runningTotalUsed) || this.agg.size === 0) {\r\n return null;\r\n }\r\n // Index 0 is the grand total on both axes (dx grandTotalRowIndex/grandTotalColumnIndex).\r\n const rowIndexByKey = new Map<string, number>([['', 0]]);\r\n const colIndexByKey = new Map<string, number>([['', 0]]);\r\n const rowPaths: any[][] = [[]];\r\n const colPaths: any[][] = [[]];\r\n const rows = this.buildSummaryNodes(\r\n this.rowTree,\r\n this.rowFields,\r\n overrides,\r\n allExpanded,\r\n rowIndexByKey,\r\n rowPaths,\r\n );\r\n const columns = this.buildSummaryNodes(\r\n this.colTree,\r\n this.columnFields,\r\n overrides,\r\n allExpanded,\r\n colIndexByKey,\r\n colPaths,\r\n );\r\n const values: any[][][] = [];\r\n for (let r = 0; r < rowPaths.length; r++) {\r\n values[r] = [];\r\n for (let c = 0; c < colPaths.length; c++) {\r\n values[r][c] = this.dataFields.map((_, di) =>\r\n this.valueAt(rowPaths[r], colPaths[c], di),\r\n );\r\n }\r\n }\r\n const data: NxePivotSummaryData = {\r\n rows,\r\n columns,\r\n values,\r\n grandTotalRowIndex: 0,\r\n grandTotalColumnIndex: 0,\r\n };\r\n const descriptions: NxePivotSummaryDescriptions = {\r\n rows: this.rowFields,\r\n columns: this.columnFields,\r\n values: this.dataFields,\r\n };\r\n if (expressionsUsed) {\r\n applyDisplaySummaryMode(descriptions, data);\r\n }\r\n if (runningTotalUsed) {\r\n applyRunningTotal(descriptions, data);\r\n }\r\n return { data, rowIndexByKey, colIndexByKey };\r\n }\r\n\r\n /** Visible-tree projection of one axis (collapsed nodes stay leaves), dx loaded-data shape. */\r\n private buildSummaryNodes(\r\n nodes: NxePivotAxisNode[],\r\n fields: NxePivotField[],\r\n overrides: ReadonlyMap<string, boolean>,\r\n allExpanded: boolean | undefined,\r\n indexByKey: Map<string, number>,\r\n paths: any[][],\r\n ): NxePivotSummaryNode[] {\r\n return nodes.map((n) => {\r\n const index = paths.length;\r\n indexByKey.set(pathKeyOf(n.path), index);\r\n paths.push(n.path);\r\n const node: NxePivotSummaryNode = { value: n.value, index };\r\n if (n.children.length > 0 && this.isExpanded(n, overrides, allExpanded, fields)) {\r\n node.children = this.buildSummaryNodes(\r\n n.children,\r\n fields,\r\n overrides,\r\n allExpanded,\r\n indexByKey,\r\n paths,\r\n );\r\n }\r\n return node;\r\n });\r\n }\r\n\r\n /** Tree layout (and the pre-parity default): one indented column, parents inline with aggregates. */\r\n private flattenTreeRows(\r\n overrides: ReadonlyMap<string, boolean>,\r\n allExpanded: boolean | undefined,\r\n ): NxePivotBodyRow[] {\r\n const out: NxePivotBodyRow[] = [];\r\n const lastLevel = this.rowFields.length - 1;\r\n const visit = (nodes: NxePivotAxisNode[]) => {\r\n for (const n of nodes) {\r\n const hasChildren = n.children.length > 0;\r\n const expanded = this.isExpanded(n, overrides, allExpanded, this.rowFields);\r\n out.push({\r\n kind: 'D',\r\n label: n.label,\r\n level: n.level,\r\n path: n.path,\r\n pathKey: n.pathKey,\r\n hasChildren,\r\n expanded,\r\n isGrandTotal: false,\r\n headerCells: [\r\n {\r\n text: n.label,\r\n col: 0,\r\n rowspan: 1,\r\n colspan: 1,\r\n expandable: hasChildren,\r\n expanded,\r\n isTotal: false,\r\n pathKey: n.pathKey,\r\n },\r\n ],\r\n });\r\n if (hasChildren && expanded && n.level < lastLevel) {\r\n visit(n.children);\r\n }\r\n }\r\n };\r\n visit(this.rowTree);\r\n return out;\r\n }\r\n\r\n /**\r\n * Standard layout (dx default): N row-header columns. An EXPANDED parent contributes no\r\n * value row — its label cell rowspans its children's rows, its own tr carries the first\r\n * child's values, and (with `showRowTotals`) a full-width \"{value} Total\" row closes the\r\n * group AFTER the children (`totalsPrior` moves it before). A COLLAPSED parent is one row:\r\n * label colspans the remaining header columns, aggregates inline.\r\n */\r\n private flattenStandardRows(\r\n overrides: ReadonlyMap<string, boolean>,\r\n allExpanded: boolean | undefined,\r\n showRowTotals: boolean,\r\n totalsPrior: boolean,\r\n texts: Required<NxePivotTexts>,\r\n ): NxePivotBodyRow[] {\r\n const out: NxePivotBodyRow[] = [];\r\n const colCount = Math.max(1, this.rowFields.length);\r\n const visit = (node: NxePivotAxisNode): void => {\r\n const open =\r\n node.children.length > 0 &&\r\n this.isExpanded(node, overrides, allExpanded, this.rowFields);\r\n if (!open) {\r\n out.push({\r\n kind: 'D',\r\n label: node.label,\r\n level: node.level,\r\n path: node.path,\r\n pathKey: node.pathKey,\r\n hasChildren: node.children.length > 0,\r\n expanded: false,\r\n isGrandTotal: false,\r\n headerCells: [\r\n {\r\n text: node.label,\r\n col: node.level,\r\n rowspan: 1,\r\n colspan: colCount - node.level,\r\n expandable: node.children.length > 0,\r\n expanded: false,\r\n isTotal: false,\r\n pathKey: node.pathKey,\r\n },\r\n ],\r\n });\r\n return;\r\n }\r\n // dx blank-parent rule: '' + '{0} Total' renders as just 'Total'.\r\n const totalLabel = texts.total.replace('{0}', node.label).trim();\r\n const totalRow: NxePivotBodyRow | null = showRowTotals\r\n ? {\r\n kind: 'T',\r\n label: totalLabel,\r\n level: node.level,\r\n path: node.path,\r\n pathKey: node.pathKey,\r\n hasChildren: false,\r\n expanded: false,\r\n isGrandTotal: false,\r\n headerCells: [\r\n {\r\n text: totalLabel,\r\n col: node.level,\r\n rowspan: 1,\r\n colspan: colCount - node.level,\r\n expandable: false,\r\n expanded: false,\r\n isTotal: true,\r\n pathKey: node.pathKey,\r\n },\r\n ],\r\n }\r\n : null;\r\n if (totalsPrior && totalRow) {\r\n out.push(totalRow);\r\n }\r\n const firstChildIdx = out.length;\r\n for (const child of node.children) {\r\n visit(child);\r\n }\r\n // The parent's label cell attaches to its first child's tr and spans the subtree.\r\n out[firstChildIdx].headerCells.unshift({\r\n text: node.label,\r\n col: node.level,\r\n rowspan: out.length - firstChildIdx,\r\n colspan: 1,\r\n expandable: true,\r\n expanded: true,\r\n isTotal: false,\r\n pathKey: node.pathKey,\r\n });\r\n if (!totalsPrior && totalRow) {\r\n out.push(totalRow);\r\n }\r\n };\r\n for (const root of this.rowTree) {\r\n visit(root);\r\n }\r\n return out;\r\n }\r\n\r\n private isExpanded(\r\n node: NxePivotAxisNode,\r\n overrides: ReadonlyMap<string, boolean>,\r\n allExpanded: boolean | undefined,\r\n fields: NxePivotField[],\r\n ): boolean {\r\n // Namespaced lookup (nxe-pivot-axis owns the prefixes): the component round-trips the\r\n // node's own pathKey; legacy un-namespaced keys from direct getModel() callers are\r\n // honoured as row keys. `fields` is the node's own axis (row OR column since P2-C2) —\r\n // `fields[level].expanded` seeds the default exactly like dx.\r\n const override = readExpandOverride(overrides, node.pathKey);\r\n if (override !== undefined) {\r\n return override;\r\n }\r\n if (allExpanded !== undefined) {\r\n // Facade expand-all/collapse-all — behaves as `expanded` set on every field (§e).\r\n return allExpanded;\r\n }\r\n return fields[node.level]?.expanded === true;\r\n }\r\n}\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\nimport { ChangeDetectionStrategy, Component, input, ViewEncapsulation } from '@angular/core';\r\n\r\n/**\r\n * `nxe-state-storing` — accepts DevExtreme `dxo-state-storing` config (orbit addition).\r\n *\r\n * LIVE since P3-C4 for `type: 'custom'`: `NxePivotGridComponent` contentChild's this and (a)\r\n * fires `customSave(state)` after every layout mutation — panel/chooser chip drag, sort\r\n * toggle, header-filter apply, chooser check/uncheck, facade expandAll/collapseAll — with a\r\n * dx-shaped state whose `fields` are the serialized effectiveFields (the POST-drag layout,\r\n * FULL field copies — see buildStorageState), and (b) honors `customLoad` once\r\n * on init (value or Promise, per dx's `fromPromise` contract). The `localStorage`/\r\n * `sessionStorage` types and `storageKey` remain accepted-but-inert (DEFAULTS.md, dated\r\n * P3-C4 rows — including the missing dx `savingTimeout` debounce).\r\n */\r\n@Component({\r\n selector: 'nxe-state-storing',\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 NxeStateStoringComponent {\r\n readonly enabled = input(false);\r\n readonly type = input<'localStorage' | 'sessionStorage' | 'custom'>('localStorage');\r\n readonly storageKey = input<string | undefined>(undefined);\r\n readonly customSave = input<((state: any) => void) | undefined>(undefined);\r\n readonly customLoad = input<(() => any) | undefined>(undefined);\r\n}\r\n\r\n/**\r\n * `nxe-field-panel` — DevExtreme `dxo-field-panel` config (orbit addition), LIVE since P3-C2:\r\n * `NxePivotGridComponent` contentChild's it and renders `nxe-pivot-field-panel` above the\r\n * cross-tab when `visible` is true.\r\n *\r\n * Defaults are dx's `fieldPanel` defaults (dxPivotGrid docs, verified 2026-09-02): `visible`\r\n * FALSE — nothing renders unless the host opts in (the calc tabs project no `nxe-field-panel`\r\n * at all) — and the five feature flags TRUE. report-output-pivot binds all six from its saved\r\n * `panelConfig`; an `undefined` bound into a flag is treated as \"not false\" (= the dx default)\r\n * by the pivot's template, so a not-yet-loaded config never blanks an area.\r\n */\r\n@Component({\r\n selector: 'nxe-field-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 NxeFieldPanelComponent {\r\n readonly visible = input(false);\r\n readonly showDataFields = input(true);\r\n readonly showRowFields = input(true);\r\n readonly showColumnFields = input(true);\r\n readonly showFilterFields = input(true);\r\n readonly allowFieldDragging = input(true);\r\n}\r\n","// nxe-pivot-field-chip — the SHARED dx field chip (P3-C3). One rendering for every place a\r\n// field chip appears: the field panel's area bands / corner row area (P3-C2, table cells) and\r\n// the field chooser popup's four group areas (P3-C3, stacked divs). Attribute selector so the\r\n// HOST element stays the caller's own `<div>` carrying dx's exact `.nxe-area-field.nxe-area-box`\r\n// classes (fixtures/fields-panel.html and fixtures/field-chooser.html agree on the chip\r\n// subtree: `.nxe-area-field-content` + optional `.nxe-column-indicators`).\r\n//\r\n// P3-C4: the header-filter funnel (`span.nxe-header-filter`) renders beside the sort arrow —\r\n// dx FieldChooserBase.renderField applies the sort state first, then the headerFilter state,\r\n// appending both into ONE `.nxe-column-indicators` container (m_column_state_mixin reuses the\r\n// container; ltr 'left' alignment appends, so the funnel sits AFTER the arrow). A funnel click\r\n// must NOT sort: dx's chip click handler branches on `$(e.target).hasClass('nxe-header-filter')`\r\n// (m_field_chooser_base subscribeToEvents), so the funnel handler stops propagation before the\r\n// host's own (click) fires.\r\n//\r\n// WHERE the indicator block goes follows dx's showColumnLines rule\r\n// (m_column_state_mixin `_applyColumnState`): renderField(field, showColumnLines) PREPENDS the\r\n// block and floats it right (inline `float: right`, as dx sets it) when showColumnLines is on —\r\n// the field chooser (`renderField(field, true)`, m_field_chooser.js:465) and the panel's ROW area\r\n// (`renderField(field, \"row\" === field.area)`, m_fields_area.js:120). Everywhere else (panel\r\n// column / filter / data chips) it is APPENDED after the caption, inline, unfloated. The caller\r\n// says which through `floatIndicators`.\r\n//\r\n// The arrow and funnel are the library's own drawings (clip-path polygons written from round\r\n// pixel metrics — the DXIcons font is not used) in dx's 14px glyph box: `.dx-sort` #959595,\r\n// `.dx-header-filter` #757575 with the `-empty` state at 50% alpha\r\n// (`.dx-pivotgrid-fields-container .dx-header-filter-empty{color:rgba(117,117,117,.5)}`). An\r\n// app that shrinks `.nxe-column-indicators` (bright's `scale: .7`) shrinks them as it did dx's.\r\n\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n input,\r\n output,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { NgTemplateOutlet } from '@angular/common';\r\nimport type { NxePivotPanelChip } from './nxe-pivot-field-panel.component';\r\n\r\n@Component({\r\n // eslint-disable-next-line @angular-eslint/component-selector\r\n selector: 'div[nxePivotFieldChip]',\r\n standalone: true,\r\n template: `@if (floatIndicators()) {<ng-container *ngTemplateOutlet=\"indicators\" />}<div class=\"nxe-area-field-content\">{{ chip().caption }}</div>@if (!floatIndicators()) {<ng-container *ngTemplateOutlet=\"indicators\" />}\r\n <ng-template #indicators>@if (chip().sortable || chip().filterable) {<div\r\n class=\"nxe-column-indicators\"\r\n role=\"presentation\"\r\n [style.float]=\"floatIndicators() ? 'right' : null\">@if (chip().sortable) {<span\r\n class=\"nxe-sort\"\r\n [class.nxe-sort-up]=\"chip().sortOrder === 'asc'\"\r\n [class.nxe-sort-down]=\"chip().sortOrder === 'desc'\"></span>}@if (chip().filterable) {<span\r\n class=\"nxe-header-filter\"\r\n [class.nxe-header-filter-empty]=\"!chip().filterActive\"\r\n (click)=\"onFunnelClick($event)\"></span>}</div>}</ng-template>`,\r\n imports: [NgTemplateOutlet],\r\n // Global (ViewEncapsulation.None), shipped WITH the chip so every surface that renders a chip\r\n // gets its chrome without the app's dx-compat.css. Keyed on the classes the templates emit:\r\n // `.nxe-pivotgrid-fields-container` (armed on the pivot host while the panel renders, carried\r\n // by the chooser popup's own root and by the drag ghost) and `.nxe-pivotgrid` (the pivot host\r\n // only — dx's panel-only rules). Values are dx.light's, rule for rule.\r\n //\r\n // The indicator selectors run one class deeper (`.nxe-column-indicators .nxe-sort`, 0,3,x)\r\n // than an app's dx-prefixed redraws of the same glyphs (bright dx-compat.css:1456-1459\r\n // `.dx-pivotgrid-fields-container .dx-sort{vertical-align:middle}` and its `::after`\r\n // triangles, :1376-1377 `::before{content:none}`, all 0,2,x), so with the dx class mirror\r\n // on, the library's arrow still draws and theirs is switched off — no doubled glyphs.\r\n styles: `\r\n .nxe-pivotgrid-fields-container .nxe-area-fields {\r\n position: relative;\r\n }\r\n .nxe-pivotgrid-fields-container .nxe-area-field {\r\n cursor: pointer;\r\n }\r\n /* dx.light .dx-pivotgrid-fields-container .dx-area-field.dx-area-box */\r\n .nxe-pivotgrid-fields-container .nxe-area-field.nxe-area-box {\r\n box-sizing: border-box;\r\n margin-bottom: 4px;\r\n padding: 7px 10px;\r\n border: 1px solid var(--nxe-ui-border, #ddd);\r\n background-color: var(--nxe-ui-surface, #fff);\r\n }\r\n .nxe-pivotgrid .nxe-area-field.nxe-area-box {\r\n margin-bottom: 0;\r\n }\r\n .nxe-pivotgrid-fields-container .nxe-area-field-content {\r\n overflow: hidden;\r\n text-overflow: ellipsis;\r\n vertical-align: bottom;\r\n }\r\n .nxe-pivotgrid .nxe-area-field-content,\r\n .nxe-pivotgrid .nxe-column-indicators {\r\n display: inline-block;\r\n }\r\n .nxe-pivotgrid .nxe-area-field,\r\n .nxe-pivotgrid .nxe-area-field-content {\r\n white-space: nowrap;\r\n }\r\n\r\n /* The indicator block: dx .dx-pivotgrid-fields-container .dx-column-indicators\r\n {vertical-align:bottom;margin-left:6px;line-height:19px}. */\r\n .nxe-pivotgrid-fields-container .nxe-column-indicators {\r\n margin-left: 6px;\r\n line-height: 19px;\r\n vertical-align: bottom;\r\n white-space: nowrap;\r\n }\r\n\r\n /* Both glyph boxes are dx's 14px em box. dx sets them in DXIcons at 14px/1 on the text\r\n baseline, and that font's em box reaches 0.875px below the baseline; an empty\r\n inline-block sits ON the baseline, hence the -0.875px. */\r\n .nxe-pivotgrid-fields-container .nxe-column-indicators .nxe-sort,\r\n .nxe-pivotgrid-fields-container .nxe-column-indicators .nxe-header-filter {\r\n display: inline-block;\r\n position: relative;\r\n box-sizing: border-box;\r\n width: 14px;\r\n height: 14px;\r\n vertical-align: -0.875px;\r\n }\r\n .nxe-pivotgrid-fields-container .nxe-column-indicators .nxe-sort::before,\r\n .nxe-pivotgrid-fields-container .nxe-column-indicators .nxe-header-filter::before {\r\n content: '';\r\n position: absolute;\r\n inset: 0;\r\n box-sizing: border-box;\r\n background-color: currentColor;\r\n }\r\n .nxe-pivotgrid-fields-container .nxe-column-indicators .nxe-sort::after,\r\n .nxe-pivotgrid-fields-container .nxe-column-indicators .nxe-header-filter::after {\r\n content: none;\r\n }\r\n\r\n /* Sort arrow (dx .dx-pivotgrid-fields-container .dx-sort{color:#959595}, \\\\f051/\\\\f052):\r\n a 1px shaft the full 14px tall at x 6-7 under a 5 x 3 head centred on x 6.5. */\r\n .nxe-pivotgrid-fields-container .nxe-column-indicators .nxe-sort {\r\n color: #959595;\r\n }\r\n .nxe-pivotgrid-fields-container .nxe-column-indicators .nxe-sort-up::before {\r\n clip-path: polygon(6.5px 0, 9px 3px, 7px 3px, 7px 14px, 6px 14px, 6px 3px, 4px 3px);\r\n }\r\n .nxe-pivotgrid-fields-container .nxe-column-indicators .nxe-sort-down::before {\r\n clip-path: polygon(6px 0, 7px 0, 7px 11px, 9px 11px, 6.5px 14px, 4px 11px, 6px 11px);\r\n }\r\n\r\n /* Funnel (dx .dx-header-filter{color:#757575}, \\\\f050): the grid header funnel's\r\n polygon (nxe-data-grid .nxe-grid-hf-icon) in the same 14px box — a 3px brim across the\r\n full width, 45deg shoulders falling 5px to a 4px stem (x 5-9) that runs to the bottom. */\r\n .nxe-pivotgrid-fields-container .nxe-column-indicators .nxe-header-filter {\r\n color: #757575;\r\n cursor: pointer;\r\n }\r\n .nxe-pivotgrid-fields-container .nxe-column-indicators .nxe-header-filter-empty {\r\n color: rgba(117, 117, 117, 0.5);\r\n }\r\n .nxe-pivotgrid-fields-container .nxe-column-indicators .nxe-header-filter::before {\r\n clip-path: polygon(0 0, 14px 0, 14px 3px, 9px 8px, 9px 14px, 5px 14px, 5px 8px, 0 3px);\r\n }\r\n\r\n /* Forced colours (Windows high contrast) replace every background-color with Canvas, the\r\n colour behind the glyph, so the arrow and funnel would vanish. As the shared\r\n nxe-forced-colors-mark mixin does (styles/_mixins.scss), the marks opt out of the\r\n forcing and paint in CanvasText. */\r\n @media (forced-colors: active) {\r\n .nxe-pivotgrid-fields-container .nxe-column-indicators .nxe-sort::before,\r\n .nxe-pivotgrid-fields-container .nxe-column-indicators .nxe-header-filter::before {\r\n forced-color-adjust: none;\r\n background-color: CanvasText;\r\n }\r\n }\r\n\r\n /* Drag chrome (dx.light): the ghost is a .nxe-pivotgrid-fields-container.nxe-drag clone\r\n of the chip, the source chip dims, and a 2px gray bar marks the drop slot (the drag\r\n engines size and place it inline). */\r\n .nxe-pivotgrid-fields-container.nxe-drag {\r\n opacity: 0.8;\r\n }\r\n .nxe-pivotgrid-fields-container.nxe-drag .nxe-area-field.nxe-area-box {\r\n border: 1px solid rgba(51, 122, 183, 0.5);\r\n box-shadow: 0 0 1px rgba(0, 0, 0, 0.1), 0 1px 3px rgba(0, 0, 0, 0.2);\r\n }\r\n .nxe-pivotgrid-fields-container.nxe-drag .nxe-area-field-content {\r\n display: inline-block;\r\n }\r\n .nxe-pivotgrid-fields-container.nxe-drag .nxe-column-indicators {\r\n display: inline-block;\r\n float: none;\r\n }\r\n .nxe-pivotgrid-fields-container .nxe-drag-source {\r\n opacity: 0.5;\r\n }\r\n .nxe-pivotgrid-fields-container .nxe-position-indicator {\r\n background-color: gray;\r\n }\r\n .nxe-pivotgrid-fields-container .nxe-position-indicator.nxe-position-indicator-vertical {\r\n height: 2px;\r\n margin-top: -4px;\r\n margin-left: -1px;\r\n }\r\n .nxe-pivotgrid-fields-container .nxe-position-indicator.nxe-position-indicator-vertical.nxe-position-indicator-last {\r\n margin-top: -3px;\r\n }\r\n .nxe-pivotgrid-fields-container .nxe-position-indicator.nxe-position-indicator-horizontal {\r\n width: 2px;\r\n margin-left: -3px;\r\n }\r\n .nxe-pivotgrid-fields-container .nxe-position-indicator.nxe-position-indicator-horizontal.nxe-position-indicator-last {\r\n margin-left: 3px;\r\n }\r\n `,\r\n host: {\r\n class: 'nxe-area-field nxe-area-box',\r\n '(pointerdown)': 'chipPointerDown.emit($event)',\r\n '(click)': 'chipClick.emit()',\r\n },\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class NxePivotFieldChipComponent {\r\n readonly chip = input.required<NxePivotPanelChip>();\r\n /** dx showColumnLines for this chip's surface: true in the field chooser and the panel's\r\n * ROW area — the indicators come FIRST and float right; false (panel column / filter /\r\n * data areas) — they follow the caption inline. */\r\n readonly floatIndicators = input(false);\r\n /** Raw pointerdown — the host decides whether a drag gesture may begin. */\r\n readonly chipPointerDown = output<PointerEvent>();\r\n /** Chip click (the host consults its gesture's click suppression before sorting). */\r\n readonly chipClick = output<void>();\r\n /** The funnel was clicked — the host opens the header-filter panel for this field. */\r\n readonly chipFilterClick = output<MouseEvent>();\r\n\r\n protected onFunnelClick(event: MouseEvent): void {\r\n // dx branches sort-vs-filter on the click target (m_field_chooser_base) — the funnel\r\n // click must never reach the host's sort handler.\r\n event.stopPropagation();\r\n this.chipFilterClick.emit(event);\r\n }\r\n}\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\n// nxe-pivot-field-panel — the dx field panel (dxo-field-panel), P3-C2. Renders the\r\n// `.nxe-pivotgrid-fields-area` blocks harvested from the live broker reference\r\n// (tools/visual-parity/reference/pivot/fixtures/fields-panel.html, ORACLE.md §c): filter strip\r\n// on top, then data + column header cells side by side. The ROW area is NOT a band of this\r\n// panel: dx hosts it inside the cross-tab's corner `.nxe-area-description-cell`\r\n// (views/0/initial-full-page.png — the 'Lob' chip sits in the corner, no caption text), so it\r\n// is exposed as `rowAreaTemplate` and NxePivotGridComponent outlets it into its corner cell.\r\n// Chips are `.nxe-area-field.nxe-area-box > .nxe-area-field-content`; an empty area shows dx's\r\n// exact localization string (\"Drop Filter Fields Here\" etc. — dx fieldPanel.texts defaults).\r\n//\r\n// The panel is DUMB about field state: it reads chips off the pivot's engine (which already has\r\n// the component's fieldOverrides merged in) and emits `fieldMove` / `sortToggle`; the pivot\r\n// component owns the override map and never mutates the caller's fields (nxe-pivot.types\r\n// NxePivotFieldOverride).\r\n//\r\n// Dragging reuses the shared NxeDragGesture core extracted from the grid controller (same 5px\r\n// threshold / Escape / click-suppression semantics the group-drag audit pinned); the ghost is\r\n// dx's `.nxe-pivotgrid-fields-container.nxe-drag` chip clone, the insertion mark dx's\r\n// `.nxe-position-indicator` 2px bar. Drop zones are hit-tested from the PIVOT root (the row area\r\n// lives in the cross-tab corner): the whole corner cell is the row drop target and carries the\r\n// `nxe-drag-target` highlight; the other areas highlight their fields-area element.\r\n\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n ElementRef,\r\n inject,\r\n input,\r\n NgZone,\r\n OnDestroy,\r\n output,\r\n TemplateRef,\r\n viewChild,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { NgTemplateOutlet } from '@angular/common';\r\nimport { NxeMessageService, type NxeMessageKey } from '@nexterajs/ui/core';\r\nimport { NxeDragGesture } from '@nexterajs/ui/grid';\r\nimport { NxePivotFieldChipComponent } from './nxe-pivot-field-chip.component';\r\nimport { NxePivotDataSource } from './nxe-pivot-data-source';\r\nimport { NxePivotArea, NxePivotField } from './nxe-pivot.types';\r\n\r\n/** dx `fieldPanel.texts` (dxPivotGrid docs; the English filter string matches the fixture), as message keys. */\r\nconst EMPTY_AREA_TEXT_KEYS = {\r\n filter: 'pivot.panel.dropFilter',\r\n data: 'pivot.panel.dropData',\r\n column: 'pivot.panel.dropColumn',\r\n row: 'pivot.panel.dropRow',\r\n} as const satisfies Record<NxePivotArea, NxeMessageKey>;\r\n\r\n/** One rendered chip. `sortOrder` is the EFFECTIVE order (dx: fields sort asc by default). */\r\nexport interface NxePivotPanelChip {\r\n fieldIndex: number;\r\n caption: string;\r\n sortOrder: 'asc' | 'desc';\r\n sortable: boolean;\r\n /** P3-C4: the chip renders the `.nxe-header-filter` funnel (never on data-area chips). */\r\n filterable: boolean;\r\n /** A filter is applied (`filterValues` non-empty) — full-alpha funnel, no `-empty` class. */\r\n filterActive: boolean;\r\n}\r\n\r\n/** A funnel click — the pivot opens the shared header-filter panel anchored to the chip. */\r\nexport interface NxePivotFilterOpenEvent {\r\n fieldIndex: number;\r\n /** The chip element (dx anchors the popup to `e.currentTarget`, the chip itself). */\r\n origin: HTMLElement;\r\n}\r\n\r\n/**\r\n * One chip's model, shared by the panel and the chooser (P3-C4). Per-field flag precedence is\r\n * dx m_widget `_updateCalculatedOptions`: the widget-level allowSorting/allowFiltering value\r\n * stamps a field only while the field's own value is undefined — an explicit `false` opts the\r\n * field out under a permissive widget, an explicit `true` opts it in under a restrictive one.\r\n * The DATA area never sorts by click (that is allowSortingBySummary's context-menu territory)\r\n * and never funnels (dx renderField skips both states for `field.area === 'data'`,\r\n * m_field_chooser_base). `filterActive` mirrors dx `_isHeaderFilterEmpty` inverted.\r\n */\r\nexport function buildChip(\r\n fieldIndex: number,\r\n field: NxePivotField,\r\n group: NxePivotArea,\r\n widgetAllowSorting: boolean,\r\n widgetAllowFiltering: boolean,\r\n): NxePivotPanelChip {\r\n return {\r\n fieldIndex,\r\n caption: field.caption ?? field.dataField ?? '',\r\n // dx: pivot fields sort ascending unless explicitly 'desc' — the chip arrow shows\r\n // the EFFECTIVE order, so an unsorted field carries the up arrow (dx field panel).\r\n sortOrder: field.sortOrder === 'desc' ? 'desc' : 'asc',\r\n sortable: (field.allowSorting ?? widgetAllowSorting) === true && group !== 'data',\r\n filterable: (field.allowFiltering ?? widgetAllowFiltering) === true && group !== 'data',\r\n filterActive: (field.filterValues?.length ?? 0) > 0,\r\n };\r\n}\r\n\r\ninterface PanelArea {\r\n group: NxePivotArea;\r\n chips: NxePivotPanelChip[];\r\n emptyText: string;\r\n}\r\n\r\n/**\r\n * A chip drop or chooser toggle. `area: null` = REMOVE the field from the layout — emitted\r\n * only by the chooser (a drop on its All-Fields tree, or a checkbox uncheck). dx m_sortable\r\n * fires no change at all for a release outside every group's fields box (the chip snaps\r\n * back), so the PANEL never emits null: an off-panel release is a no-op — corrected in P3-C3\r\n * (the P3-C2 cut mis-transcribed outside-drop as removal).\r\n */\r\nexport interface NxePivotFieldMoveEvent {\r\n fieldIndex: number;\r\n area: NxePivotArea | null;\r\n areaIndex: number;\r\n}\r\n\r\n@Component({\r\n selector: 'nxe-pivot-field-panel',\r\n standalone: true,\r\n imports: [NgTemplateOutlet, NxePivotFieldChipComponent],\r\n templateUrl: './nxe-pivot-field-panel.component.html',\r\n styleUrl: './nxe-pivot-field-panel.component.scss',\r\n // The dx marker classes (`nxe-pivotgrid nxe-pivotgrid-fields-container`) live on the PIVOT\r\n // host while the panel is visible (dx puts them on the widget root) so the compat chip\r\n // chrome reaches both these bands AND the corner-hosted row area.\r\n host: { class: 'nxe-pivot-field-panel' },\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class NxePivotFieldPanelComponent implements OnDestroy {\r\n /** The pivot's CURRENT engine — overrides already merged, so chips track every mutation. */\r\n readonly engine = input<NxePivotDataSource | null>(null);\r\n // The five dx fieldPanel flags (the pivot passes them pre-coerced: `undefined` → dx default).\r\n readonly showFilterFields = input(true);\r\n readonly showDataFields = input(true);\r\n readonly showColumnFields = input(true);\r\n readonly showRowFields = input(true);\r\n readonly allowFieldDragging = input(true);\r\n /** dx widget `allowSorting` (default false): chip click toggles the field's sortOrder.\r\n * A field's own `allowSorting` overrides it (dx m_widget `_updateCalculatedOptions`\r\n * stamps the widget flag onto a field only while the field's own value is undefined). */\r\n readonly allowSorting = input(false);\r\n /** dx widget `allowFiltering` (default false, P3-C4): dimension chips render the\r\n * header-filter funnel. Same per-field precedence as `allowSorting`. */\r\n readonly allowFiltering = input(false);\r\n /** Widget `showBorders`: the panel bands sit INSIDE the border box (dx draws the outer\r\n * border around the filter/chip bands — `.nxe-pivotgrid-border .nxe-filter-header` et al). */\r\n readonly showBorders = input(false);\r\n /** P3-C3: the pivot's `.nxe-pivotgrid-toolbar` template (field-chooser button) — rendered\r\n * where dx prepends its toolbar container (m_widget.js `_renderDescriptionArea`). */\r\n readonly toolbarTemplate = input<TemplateRef<unknown> | null>(null);\r\n /** Which panel band hosts the toolbar (the pivot resolves dx's placement branches):\r\n * 'filter' = the filter-header cell; 'column' = the column-header cell (dx's middle\r\n * branch — showFilterFields off but data/column bands shown; the cell renders for the\r\n * toolbar even when showColumnFields is off, exactly as dx's always-present\r\n * $columnHeader does); null = the toolbar lives in the cross-tab corner (or no\r\n * chooser) — nothing renders here. */\r\n readonly toolbarArea = input<'filter' | 'column' | null>(null);\r\n\r\n /** A chip was dropped — the pivot recomputes areaIndexes and writes its override map. */\r\n readonly fieldMove = output<NxePivotFieldMoveEvent>();\r\n /** A sortable chip was clicked — the pivot flips the field's effective sortOrder. */\r\n readonly sortToggle = output<{ fieldIndex: number }>();\r\n /** A chip's funnel was clicked — the pivot opens the header-filter panel (P3-C4). */\r\n readonly filterOpen = output<NxePivotFilterOpenEvent>();\r\n\r\n /** The ROW fields area — NxePivotGridComponent outlets this into its corner cell (dx hosts\r\n * the row chips inside `.nxe-area-description-cell`, never in a band of their own). */\r\n readonly rowAreaTemplate = viewChild<TemplateRef<unknown>>('rowAreaTpl');\r\n\r\n private readonly elementRef = inject(ElementRef<HTMLElement>);\r\n private readonly messages = inject(NxeMessageService);\r\n private readonly zone = inject(NgZone);\r\n\r\n protected readonly filterArea = computed(() => this.buildArea('filter'));\r\n protected readonly dataArea = computed(() => this.buildArea('data'));\r\n protected readonly columnArea = computed(() => this.buildArea('column'));\r\n protected readonly rowArea = computed(() => this.buildArea('row'));\r\n\r\n /** The toolbar renders in the column-header cell (dx's middle placement branch). */\r\n protected readonly columnToolbar = computed(\r\n () => this.toolbarArea() === 'column' && this.toolbarTemplate() !== null,\r\n );\r\n\r\n // --- Dragging -----------------------------------------------------------------------------\r\n private drag: {\r\n chip: NxePivotPanelChip;\r\n fromArea: NxePivotArea;\r\n targetArea: NxePivotArea | null;\r\n slot: number | null;\r\n targetEl: HTMLElement | null;\r\n indicator: HTMLElement | null;\r\n } | null = null;\r\n\r\n private readonly gesture = new NxeDragGesture(this.zone, {\r\n // dx ghost: the fields-container drag clone — `.nxe-drag` opacity .8, chip re-bordered\r\n // rgba(51,122,183,.5) with the drag shadow (nxe-pivot-field-chip's styles). `nxe-widget`\r\n // carries the 12.24px widget font stack across the <body> boundary, exactly as the\r\n // library's overlay panes do (styling/_widget.scss) — without it the ghost renders in\r\n // the page's body font.\r\n createGhost: () => {\r\n const ghost = document.createElement('div');\r\n ghost.className =\r\n 'nxe-widget nxe-pivotgrid-fields-container nxe-drag nxe-pivot-drag-ghost';\r\n const chip = document.createElement('div');\r\n chip.className = 'nxe-area-field nxe-area-box';\r\n const content = document.createElement('div');\r\n content.className = 'nxe-area-field-content';\r\n content.textContent = this.drag?.chip.caption ?? '';\r\n chip.appendChild(content);\r\n ghost.appendChild(chip);\r\n return ghost;\r\n },\r\n // dx dims the source chip with `nxe-drag-source` (opacity .5 via the container scope).\r\n sourceDragClasses: ['nxe-drag-source'],\r\n dragMove: (x, y) => this.trackPointer(x, y),\r\n drop: () => this.completeDrop(),\r\n clearDropVisuals: () => {\r\n const d = this.drag;\r\n d?.indicator?.remove();\r\n if (d) {\r\n d.indicator = null;\r\n d.targetEl = null;\r\n }\r\n this.dragRoot()\r\n .querySelectorAll('.nxe-drag-target')\r\n .forEach((el) => el.classList.remove('nxe-drag-target'));\r\n },\r\n reset: () => {\r\n this.drag = null;\r\n },\r\n });\r\n\r\n ngOnDestroy(): void {\r\n this.gesture.destroy();\r\n }\r\n\r\n protected onChipPointerDown(chip: NxePivotPanelChip, area: NxePivotArea, event: PointerEvent): void {\r\n if (!this.allowFieldDragging()) {\r\n return; // dx: allowFieldDragging false leaves the chips inert\r\n }\r\n if (!this.gesture.begin(event)) {\r\n return;\r\n }\r\n this.drag = {\r\n chip,\r\n fromArea: area,\r\n targetArea: null,\r\n slot: null,\r\n targetEl: null,\r\n indicator: null,\r\n };\r\n }\r\n\r\n protected onChipClick(chip: NxePivotPanelChip): void {\r\n if (this.gesture.consumeClick()) {\r\n return; // the click browsers fire right after a drop must not also sort\r\n }\r\n if (!chip.sortable) {\r\n return;\r\n }\r\n this.sortToggle.emit({ fieldIndex: chip.fieldIndex });\r\n }\r\n\r\n protected onChipFilterClick(chip: NxePivotPanelChip, event: MouseEvent): void {\r\n if (this.gesture.consumeClick()) {\r\n return; // a drag released over the funnel must not also open the popup\r\n }\r\n const origin =\r\n (event.target as HTMLElement | null)?.closest<HTMLElement>('.nxe-area-field') ??\r\n (event.target as HTMLElement);\r\n this.filterOpen.emit({ fieldIndex: chip.fieldIndex, origin });\r\n }\r\n\r\n private buildArea(group: NxePivotArea): PanelArea {\r\n const engine = this.engine();\r\n const chips = (engine ? engine.areaFields(group) : []).map(({ fieldIndex, field }) =>\r\n buildChip(fieldIndex, field, group, this.allowSorting(), this.allowFiltering()),\r\n );\r\n return { group, chips, emptyText: this.messages.t(EMPTY_AREA_TEXT_KEYS[group]) };\r\n }\r\n\r\n /** Hit-test root: the whole pivot — the row area lives in the cross-tab corner cell. */\r\n private dragRoot(): HTMLElement {\r\n const host = this.elementRef.nativeElement as HTMLElement;\r\n return (host.closest('nxe-pivot-grid') as HTMLElement | null) ?? host;\r\n }\r\n\r\n /**\r\n * Drop zones. For filter/data/column the fields-area element is both hit rect and highlight\r\n * target; for ROW the enclosing corner cell (`th.nxe-area-description-cell`) is — dx's row\r\n * area IS the corner, so a drop anywhere on it must land in rows, not read as \"outside\".\r\n */\r\n private dropZones(): { group: NxePivotArea; hitEl: HTMLElement; areaEl: HTMLElement }[] {\r\n return Array.from(\r\n this.dragRoot().querySelectorAll<HTMLElement>('.nxe-pivotgrid-fields-area[group]'),\r\n ).map((areaEl) => {\r\n const group = areaEl.getAttribute('group') as NxePivotArea;\r\n const corner =\r\n group === 'row'\r\n ? (areaEl.closest('th.nxe-area-description-cell') as HTMLElement | null)\r\n : null;\r\n return { group, hitEl: corner ?? areaEl, areaEl };\r\n });\r\n }\r\n\r\n private trackPointer(x: number, y: number): void {\r\n const d = this.drag;\r\n if (!d) {\r\n return;\r\n }\r\n const hit =\r\n this.dropZones().find(({ hitEl }) => {\r\n const r = hitEl.getBoundingClientRect();\r\n return x >= r.left && x <= r.right && y >= r.top && y <= r.bottom;\r\n }) ?? null;\r\n if (d.targetEl && d.targetEl !== hit?.hitEl) {\r\n d.targetEl.classList.remove('nxe-drag-target');\r\n }\r\n if (!hit) {\r\n // Outside every area: no drop target — releasing here is a snap-back NO-OP\r\n // (dx m_sortable's end handler fires onChanged only inside a target group).\r\n d.targetArea = null;\r\n d.slot = null;\r\n d.targetEl = null;\r\n d.indicator?.remove();\r\n d.indicator = null;\r\n return;\r\n }\r\n hit.hitEl.classList.add('nxe-drag-target');\r\n d.targetEl = hit.hitEl;\r\n d.targetArea = hit.group;\r\n const chips = Array.from(\r\n hit.areaEl.querySelectorAll<HTMLElement>('.nxe-area-field.nxe-area-box'),\r\n );\r\n let slot = 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 slot = i;\r\n break;\r\n }\r\n }\r\n d.slot = slot;\r\n this.placeIndicator(d, hit.areaEl, chips, slot);\r\n }\r\n\r\n /** dx `.nxe-position-indicator`: a 2px gray bar between chips, inside the (positioned) area. */\r\n private placeIndicator(\r\n d: NonNullable<typeof this.drag>,\r\n areaEl: HTMLElement,\r\n chips: HTMLElement[],\r\n slot: number,\r\n ): void {\r\n if (!chips.length) {\r\n // Empty area: the dx-drag-target state marks the whole area; no bar to place.\r\n d.indicator?.remove();\r\n d.indicator = null;\r\n return;\r\n }\r\n if (!d.indicator) {\r\n d.indicator = document.createElement('div');\r\n }\r\n const last = slot >= chips.length;\r\n d.indicator.className =\r\n 'nxe-position-indicator nxe-position-indicator-horizontal' +\r\n (last ? ' nxe-position-indicator-last' : '');\r\n const areaRect = areaEl.getBoundingClientRect();\r\n const ref = last ? chips[chips.length - 1] : chips[slot];\r\n const refRect = ref.getBoundingClientRect();\r\n d.indicator.style.position = 'absolute';\r\n d.indicator.style.left = `${(last ? refRect.right : refRect.left) - areaRect.left}px`;\r\n d.indicator.style.top = `${refRect.top - areaRect.top}px`;\r\n d.indicator.style.height = `${refRect.height}px`;\r\n if (d.indicator.parentElement !== areaEl) {\r\n areaEl.appendChild(d.indicator);\r\n }\r\n }\r\n\r\n private completeDrop(): void {\r\n const d = this.drag;\r\n if (!d) {\r\n return;\r\n }\r\n if (d.targetArea === null) {\r\n // Released outside every area — dx m_sortable never fires onChanged without a\r\n // target group, so the chip snaps back and NOTHING is emitted (removal exists\r\n // only in the chooser: its All-Fields tree drop / checkbox uncheck).\r\n return;\r\n }\r\n let slot = d.slot ?? 0;\r\n if (d.targetArea === d.fromArea) {\r\n const pos =\r\n this.engine()\r\n ?.areaFields(d.fromArea)\r\n .findIndex(({ fieldIndex }) => fieldIndex === d.chip.fieldIndex) ?? -1;\r\n if (pos >= 0 && slot > pos) {\r\n slot -= 1; // removing the chip first shifts the insertion slot left\r\n }\r\n if (slot === pos) {\r\n return; // dropped back onto its own position — no-op\r\n }\r\n }\r\n this.fieldMove.emit({ fieldIndex: d.chip.fieldIndex, area: d.targetArea, areaIndex: slot });\r\n }\r\n}\r\n","<!-- Area subtree mirrors fixtures/fields-panel.html verbatim: .dx-pivotgrid-fields-area >\r\n table.dx-area-field-container > colgroup + thead.dx-pivotgrid-fields-area-head > tr > td\r\n chips (.dx-area-field.dx-area-box > .dx-area-field-content) / .dx-empty-area-text.\r\n The row area carries dx's inline width:100% (fixture line for group=\"row\"). -->\r\n<ng-template #areaTpl let-area=\"area\">\r\n <div\r\n class=\"nxe-pivotgrid-fields-area nxe-area-fields\"\r\n [class.nxe-pivotgrid-drag-action]=\"allowFieldDragging()\"\r\n [style.width]=\"area.group === 'row' ? '100%' : null\"\r\n [attr.group]=\"area.group\">\r\n <table class=\"nxe-area-field-container\">\r\n <colgroup></colgroup>\r\n <thead class=\"nxe-pivotgrid-fields-area-head\">\r\n <tr>\r\n @if (area.chips.length === 0) {\r\n <td><div class=\"nxe-empty-area-text\">{{ area.emptyText }}</div></td>\r\n } @else {\r\n @for (chip of area.chips; track chip.fieldIndex) {\r\n <!-- Chip subtree lives in the SHARED NxePivotFieldChipComponent (P3-C3) — the\r\n chooser renders the identical chips; the host div here keeps the fixture's\r\n exact .dx-area-field.dx-area-box classes. dx renders panel chips with\r\n showColumnLines = (area is row) (m_fields_area.js:120): only the ROW chips\r\n float their indicators right; the other bands append them inline. -->\r\n <td>\r\n <div\r\n nxePivotFieldChip\r\n [chip]=\"chip\"\r\n [floatIndicators]=\"area.group === 'row'\"\r\n (chipPointerDown)=\"onChipPointerDown(chip, area.group, $event)\"\r\n (chipClick)=\"onChipClick(chip)\"\r\n (chipFilterClick)=\"onChipFilterClick(chip, $event)\"></div>\r\n </td>\r\n }\r\n }\r\n </tr>\r\n </thead>\r\n </table>\r\n </div>\r\n</ng-template>\r\n\r\n<!-- The ROW fields area is NOT a band here: dx hosts it inside the cross-tab's corner\r\n `.dx-area-description-cell` (oracle §c \"hosts the ROW field chips\", initial-full-page.png)\r\n — NxePivotGridComponent outlets this template into its corner cell. -->\r\n<ng-template #rowAreaTpl>\r\n @if (showRowFields()) {\r\n <ng-container *ngTemplateOutlet=\"areaTpl; context: { area: rowArea() }\" />\r\n }\r\n</ng-template>\r\n\r\n<!-- dx main-table area cells (ORACLE.md §d): filter header strip, then data + column header\r\n cells. With showBorders the bands sit INSIDE the widget border (dx .dx-pivotgrid-border\r\n draws top/left/right on these band cells). -->\r\n@if (showFilterFields() || showDataFields() || showColumnFields()) {\r\n <table class=\"nxe-pivot-field-panel-table\" [class.nxe-panel-bordered]=\"showBorders()\">\r\n <tbody>\r\n @if (showFilterFields()) {\r\n <tr>\r\n <td class=\"nxe-filter-header\" colspan=\"2\">\r\n <!-- P3-C3: the pivot's `.dx-pivotgrid-toolbar` (field-chooser button) — dx PREPENDS\r\n the toolbar to this cell and floats it right (oracle §c; m_widget.js\r\n `$toolbarContainer.prependTo($targetContainer)` + dx.light float:right). -->\r\n @if (toolbarArea() === 'filter' && toolbarTemplate(); as tb) {\r\n <ng-container *ngTemplateOutlet=\"tb\" />\r\n }\r\n <ng-container *ngTemplateOutlet=\"areaTpl; context: { area: filterArea() }\" />\r\n </td>\r\n </tr>\r\n }\r\n @if (showDataFields() || showColumnFields()) {\r\n <tr>\r\n @if (showDataFields()) {\r\n <td class=\"nxe-data-header\" [attr.colspan]=\"showColumnFields() || columnToolbar() ? null : 2\">\r\n <ng-container *ngTemplateOutlet=\"areaTpl; context: { area: dataArea() }\" />\r\n </td>\r\n }\r\n @if (showColumnFields() || columnToolbar()) {\r\n <!-- dx's middle toolbar branch (m_widget.js): with the filter band off, the\r\n toolbar prepends into the always-present $columnHeader cell — rendered here\r\n even when showColumnFields is off (the cell then holds only the toolbar). -->\r\n <td class=\"nxe-column-header\" [attr.colspan]=\"showDataFields() ? null : 2\">\r\n @if (columnToolbar() && toolbarTemplate(); as tb) {\r\n <ng-container *ngTemplateOutlet=\"tb\" />\r\n }\r\n @if (showColumnFields()) {\r\n <ng-container *ngTemplateOutlet=\"areaTpl; context: { area: columnArea() }\" />\r\n }\r\n </td>\r\n }\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n}\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\n// nxe-pivot-field-chooser — the dx field chooser popup (dxo-field-chooser), P3-C3. Renders the\r\n// popup CONTENT the pivot opens in a CDK overlay: dx popup title bar (\"Field Chooser\" + close X,\r\n// dxPivotGrid fieldChooser defaults, m_widget.js `_renderFieldChooser`) over the exact\r\n// `.nxe-pivotgridfieldchooser` DOM harvested from the live broker\r\n// (tools/visual-parity/reference/pivot/fixtures/field-chooser.html): layout 0 = two `.nxe-row`s\r\n// of two `.nxe-col`s — [All Fields tree | Row+Column areas] over [Filter | Data]\r\n// (m_field_chooser.js `_renderLayout0`). Chips reuse the panel's shared\r\n// NxePivotFieldChipComponent; the All Fields tree mirrors the fixture's dx-treeview markup\r\n// (flat leaves — the app's local fields have no dimension/displayFolder groups).\r\n//\r\n// applyChangesMode 'instantly' (the dx default — ORACLE.md §c: NO OK/Cancel toolbar): every\r\n// mutation emits immediately and the pivot writes the same fieldOverride map the field panel\r\n// writes, so the cross-tab, panel chips, chooser chips and tree checkmarks all update live.\r\n//\r\n// Area-assignment rules transcribed from DevExtreme 24.2.3 sources (curl'd from unpkg,\r\n// cjs/__internal/grids/pivot_grid/field_chooser/):\r\n// - CHECK a tree item (m_field_chooser.js `onItemSelectionChanged`):\r\n// `area = field.isMeasure ? \"data\" : \"column\"` with `areaIndex: undefined`, which\r\n// normalizeIndexes (core/utils/m_array.js) resolves to the END of the target area.\r\n// Local-store fields never carry `isMeasure`, so a string dimension AND a re-checked\r\n// measure both land in the COLUMN area — the ORACLE.md surprise #1, pinned in the spec.\r\n// - UNCHECK: `_applyChanges(fields, {area: undefined})` — the area is CLEARED; the field\r\n// leaves the layout but stays defined (and re-checkable). Mapped to the pivot's\r\n// `area: null` override, exactly like a chip dragged off the panel.\r\n// - DRAG between chooser areas (m_field_chooser_base.js `renderSortable.onDragging`):\r\n// `isMeasure === true` may ONLY drop in data; `isMeasure === false` may drop anywhere BUT\r\n// data; undefined = unrestricted. A drop on a forbidden area is dx `e.cancel` — a NO-OP\r\n// (never a remove). Chooser dragging is ALWAYS enabled: the pivot forwards no\r\n// allowFieldDragging to the popup chooser (m_widget.js `fieldChooserComponentOptions`),\r\n// so FieldChooserBase's own default (true) applies regardless of fieldPanel settings.\r\n// - DROP targets (sortable/m_sortable.js `getTargetGroup` + the drag-end handler's\r\n// `if ($targetGroup)` guard): onChanged fires ONLY when the release lands inside a\r\n// group's `.nxe-area-fields` box. The All-Fields TREE box is a group WITHOUT a `group`\r\n// attr, so a drop there resolves `targetGroup` undefined -> `_applyChanges({area:\r\n// undefined})` = the one drag-remove path (with the dx-drag-target hover highlight,\r\n// like any group). A release anywhere else — title bar, captions, paddings, outside\r\n// the popup — fires nothing: the chip snaps back.\r\n// - Tree order (m_field_chooser.js `compareItems`): with no groups/hierarchies and no\r\n// `isMeasure`, plain `>`/`<` text comparison on the caption (m_widget_utils\r\n// `getCompareFunction`) — the fixture's alphabetical list.\r\n//\r\n// Geometry (oracle/chooser-probe.json vs config height 400): dx applies fieldChooser\r\n// width/height to the popup's `.nxe-overlay-content` BOX — 600x400 with 1px borders. Inside:\r\n// the 49px title bar (6px padding x2 + 36px toolbar row + 1px rule) and the remaining 349px\r\n// `.nxe-popup-content.nxe-pivotgridfieldchooser` (20px padding -> dx stamps inline height:309px;\r\n// here flexbox yields the same box). 598x349 measured = 600x400 minus borders minus title.\r\n//\r\n// Known deviations (DEFAULTS.md, P3-C3 rows): no popup drag/resize; no cross-widget drag\r\n// between the open chooser and the panel behind it (dx sortables share a group per data\r\n// source — here a release over the panel behind is \"outside\" and snaps back); tree leaves\r\n// add via checkbox only. dx-true (NOT deviations): no backdrop — an outside click neither\r\n// closes nor blocks, the pivot behind stays interactive (dx shading:false +\r\n// hideOnOutsideClick:false); close via title-bar X or Escape only.\r\n\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n ElementRef,\r\n inject,\r\n input,\r\n NgZone,\r\n OnDestroy,\r\n output,\r\n signal,\r\n Signal,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { NgTemplateOutlet } from '@angular/common';\r\nimport { NxeMessageService } from '@nexterajs/ui/core';\r\nimport { NxeDragGesture } from '@nexterajs/ui/grid';\r\nimport { NxePivotDataSource } from './nxe-pivot-data-source';\r\nimport { NxePivotFieldChipComponent } from './nxe-pivot-field-chip.component';\r\nimport {\r\n buildChip,\r\n NxePivotFieldMoveEvent,\r\n NxePivotFilterOpenEvent,\r\n NxePivotPanelChip,\r\n} from './nxe-pivot-field-panel.component';\r\nimport { NxePivotArea, NxePivotField } from './nxe-pivot.types';\r\n\r\n/** dx fieldChooser texts (m_field_chooser.js `_getDefaultOptions` messages), as library message keys. */\r\nconst CHOOSER_TEXT_KEYS = {\r\n allFields: 'pivot.chooser.allFields',\r\n rowFields: 'pivot.chooser.rowFields',\r\n columnFields: 'pivot.chooser.columnFields',\r\n filterFields: 'pivot.chooser.filterFields',\r\n dataFields: 'pivot.chooser.dataFields',\r\n title: 'pivot.chooser.title',\r\n} as const;\r\n\r\n/** dx `_renderArea` icon names per area (m_field_chooser const.ICONS). */\r\nconst AREA_ICONS: Record<'all' | NxePivotArea, string> = {\r\n all: 'smalliconslayout',\r\n row: 'rowfield',\r\n column: 'columnfield',\r\n filter: 'filter',\r\n data: 'formula',\r\n};\r\n\r\n/** One All-Fields tree row (the fixture's flat leaf list — local fields have no groups). */\r\ninterface ChooserTreeItem {\r\n fieldIndex: number;\r\n caption: string;\r\n selected: boolean;\r\n isMeasure: boolean | undefined;\r\n}\r\n\r\ninterface ChooserArea {\r\n group: NxePivotArea;\r\n caption: string;\r\n icon: string;\r\n chips: NxePivotPanelChip[];\r\n}\r\n\r\n@Component({\r\n selector: 'nxe-pivot-field-chooser',\r\n standalone: true,\r\n imports: [NgTemplateOutlet, NxePivotFieldChipComponent],\r\n templateUrl: './nxe-pivot-field-chooser.component.html',\r\n styleUrl: './nxe-pivot-field-chooser.component.scss',\r\n // The host plays dx's `.nxe-fieldchooser-popup` popup-root role inside the CDK pane; the\r\n // `.nxe-overlay-content` box + title + content live in the template.\r\n host: { class: 'nxe-widget nxe-pivot-field-chooser-popup nxe-fieldchooser-popup' },\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class NxePivotFieldChooserComponent implements OnDestroy {\r\n /** The pivot's LIVE engine signal (overrides merged) — instant applies re-read it here. */\r\n readonly engine = input.required<Signal<NxePivotDataSource | null>>();\r\n /** dx `fieldChooser.width`/`height` — applied to the popup box; dxPivotGrid defaults 600\r\n * (m_widget.js `fieldChooser` defaults; the DA page passes height 400). */\r\n readonly width = input<number | undefined>(undefined);\r\n readonly height = input<number | undefined>(undefined);\r\n /** dx `fieldChooser.allowSearch` (default false — the capture has NO search box). */\r\n readonly allowSearch = input(false);\r\n /** Widget `allowSorting`: dimension chips inside the chooser sort on click, same as the\r\n * panel's (dx stamps the widget flag onto every field; data chips never sort). */\r\n readonly allowSorting = input(false);\r\n /** Widget `allowFiltering` (P3-C4): dimension chips inside the chooser carry the same\r\n * header-filter funnel as the panel's (dx renderField is FieldChooserBase machinery —\r\n * shared by both surfaces). Same per-field precedence as `allowSorting`. */\r\n readonly allowFiltering = input(false);\r\n\r\n /** Every chooser mutation (checkbox toggle, drag between areas) — the pivot feeds these\r\n * through the SAME `onPanelFieldMove` renumbering the field panel uses. */\r\n readonly fieldMove = output<NxePivotFieldMoveEvent>();\r\n /** A sortable chip inside the chooser was clicked. */\r\n readonly sortToggle = output<{ fieldIndex: number }>();\r\n /** A chip's funnel was clicked — the pivot opens the header-filter panel (P3-C4). */\r\n readonly filterOpen = output<NxePivotFilterOpenEvent>();\r\n /** The title-bar X — the pivot disposes the overlay (Escape/backdrop close there too). */\r\n readonly closed = output<void>();\r\n\r\n protected readonly messages = inject(NxeMessageService);\r\n /** The chooser's captions in the active language; read in the template, so a switch re-renders. */\r\n protected get texts(): Record<keyof typeof CHOOSER_TEXT_KEYS, string> {\r\n const out = {} as Record<keyof typeof CHOOSER_TEXT_KEYS, string>;\r\n for (const [name, key] of Object.entries(CHOOSER_TEXT_KEYS)) {\r\n out[name as keyof typeof CHOOSER_TEXT_KEYS] = this.messages.t(key);\r\n }\r\n return out;\r\n }\r\n protected readonly allIcon = AREA_ICONS.all;\r\n protected readonly searchText = signal('');\r\n\r\n private readonly elementRef = inject(ElementRef<HTMLElement>);\r\n private readonly zone = inject(NgZone);\r\n\r\n /** Popup box size — dx puts fieldChooser.width/height on `.nxe-overlay-content` (600 dflt). */\r\n protected readonly boxWidth = computed(() => `${this.width() ?? 600}px`);\r\n protected readonly boxHeight = computed(() => `${this.height() ?? 600}px`);\r\n\r\n /**\r\n * All Fields tree rows: every defined `visible !== false` field (m_field_chooser.js\r\n * `_createFieldsDataSource`), checked when it HAS an area (`selected: isDefined(field.area)`),\r\n * ordered by dx `compareItems` — plain text comparison here (no groups, no isMeasure).\r\n */\r\n protected readonly treeItems = computed<ChooserTreeItem[]>(() => {\r\n const engine = this.engine()();\r\n if (!engine) {\r\n return [];\r\n }\r\n const query = this.searchText().trim().toLowerCase();\r\n return engine\r\n .fields()\r\n .map((_, fieldIndex) => ({ fieldIndex, field: engine.fieldAt(fieldIndex)! }))\r\n .filter(({ field }) => field.visible !== false)\r\n .map(({ fieldIndex, field }) => ({\r\n fieldIndex,\r\n caption: field.caption ?? field.dataField ?? '',\r\n selected: field.area != null,\r\n isMeasure: field.isMeasure as boolean | undefined,\r\n }))\r\n .filter((item) => !query || item.caption.toLowerCase().includes(query))\r\n .sort((a, b) => {\r\n // compareOrder[0] (measure buckets) — 0 for the app's isMeasure-less fields.\r\n const measure = -(a.isMeasure === true ? 1 : 0) + (b.isMeasure === true ? 1 : 0);\r\n if (measure) {\r\n return measure;\r\n }\r\n // getCompareFunction(item => item.text): plain >/< comparison, no locale.\r\n return a.caption > b.caption ? 1 : a.caption < b.caption ? -1 : 0;\r\n });\r\n });\r\n\r\n protected readonly rowArea = computed(() => this.buildArea('row'));\r\n protected readonly columnArea = computed(() => this.buildArea('column'));\r\n protected readonly filterArea = computed(() => this.buildArea('filter'));\r\n protected readonly dataArea = computed(() => this.buildArea('data'));\r\n\r\n // --- Checkbox rules (transcribed — see header) ---------------------------------------------\r\n\r\n protected onCheckboxClick(item: ChooserTreeItem): void {\r\n const engine = this.engine()();\r\n if (!engine) {\r\n return;\r\n }\r\n if (item.selected) {\r\n // dx UNCHECK: `{area: undefined}` — the field leaves the layout, stays defined.\r\n this.fieldMove.emit({ fieldIndex: item.fieldIndex, area: null, areaIndex: 0 });\r\n return;\r\n }\r\n // dx CHECK: `area = field.isMeasure ? \"data\" : \"column\"` (m_field_chooser.js) with\r\n // areaIndex undefined -> normalizeIndexes appends at the END of the target area.\r\n const area: NxePivotArea = item.isMeasure === true ? 'data' : 'column';\r\n this.fieldMove.emit({\r\n fieldIndex: item.fieldIndex,\r\n area,\r\n areaIndex: engine.areaFields(area).length,\r\n });\r\n }\r\n\r\n protected onSearchInput(event: Event): void {\r\n this.searchText.set((event.target as HTMLInputElement).value);\r\n }\r\n\r\n // --- Chip clicks (sort) --------------------------------------------------------------------\r\n\r\n protected onChipClick(chip: NxePivotPanelChip): void {\r\n if (this.gesture.consumeClick()) {\r\n return;\r\n }\r\n if (!chip.sortable) {\r\n return;\r\n }\r\n this.sortToggle.emit({ fieldIndex: chip.fieldIndex });\r\n }\r\n\r\n protected onChipFilterClick(chip: NxePivotPanelChip, event: MouseEvent): void {\r\n if (this.gesture.consumeClick()) {\r\n return; // a drag released over the funnel must not also open the popup\r\n }\r\n const origin =\r\n (event.target as HTMLElement | null)?.closest<HTMLElement>('.nxe-area-field') ??\r\n (event.target as HTMLElement);\r\n this.filterOpen.emit({ fieldIndex: chip.fieldIndex, origin });\r\n }\r\n\r\n // --- Dragging between chooser areas --------------------------------------------------------\r\n // Chips stack VERTICALLY here (unlike the panel's horizontal bands): slots hit-test on the\r\n // Y midpoint and the insertion mark is dx's `.nxe-position-indicator-vertical` 2px bar.\r\n // Drop targets are dx m_sortable's groups — the four `[group]` fields boxes AND the\r\n // All-Fields tree box (a group WITHOUT a `group` attr, so a drop there resolves to\r\n // `area: undefined` = REMOVE, with the same dx-drag-target hover highlight). A release\r\n // anywhere else (title bar, captions, paddings, outside the popup) fires NO change at\r\n // all — dx's end handler runs onChanged only inside a target group, so the chip snaps\r\n // back (corrected in review: the first cut treated outside as removal).\r\n\r\n private drag: {\r\n chip: NxePivotPanelChip;\r\n fromArea: NxePivotArea;\r\n field: NxePivotField | undefined;\r\n targetArea: NxePivotArea | null;\r\n /** Hovering the All-Fields tree box — dx's remove zone (targetGroup without `group`). */\r\n overTree: boolean;\r\n /** True while hovering an area the dx isMeasure rules forbid (drop = no-op there). */\r\n invalid: boolean;\r\n slot: number | null;\r\n targetEl: HTMLElement | null;\r\n indicator: HTMLElement | null;\r\n } | null = null;\r\n\r\n private readonly gesture = new NxeDragGesture(this.zone, {\r\n createGhost: () => {\r\n const ghost = document.createElement('div');\r\n ghost.className =\r\n 'nxe-widget nxe-pivotgrid-fields-container nxe-drag nxe-pivot-drag-ghost';\r\n const chip = document.createElement('div');\r\n chip.className = 'nxe-area-field nxe-area-box';\r\n const content = document.createElement('div');\r\n content.className = 'nxe-area-field-content';\r\n content.textContent = this.drag?.chip.caption ?? '';\r\n chip.appendChild(content);\r\n ghost.appendChild(chip);\r\n return ghost;\r\n },\r\n sourceDragClasses: ['nxe-drag-source'],\r\n dragMove: (x, y) => this.trackPointer(x, y),\r\n drop: () => this.completeDrop(),\r\n clearDropVisuals: () => {\r\n const d = this.drag;\r\n d?.indicator?.remove();\r\n if (d) {\r\n d.indicator = null;\r\n d.targetEl = null;\r\n }\r\n this.host()\r\n .querySelectorAll('.nxe-drag-target')\r\n .forEach((el) => el.classList.remove('nxe-drag-target'));\r\n },\r\n reset: () => {\r\n this.drag = null;\r\n },\r\n });\r\n\r\n ngOnDestroy(): void {\r\n this.gesture.destroy();\r\n }\r\n\r\n protected onChipPointerDown(chip: NxePivotPanelChip, area: NxePivotArea, event: PointerEvent): void {\r\n // Chooser dragging is ALWAYS enabled (dx: the popup chooser keeps FieldChooserBase's\r\n // allowFieldDragging default true — the pivot forwards no flag).\r\n if (!this.gesture.begin(event)) {\r\n return;\r\n }\r\n this.drag = {\r\n chip,\r\n fromArea: area,\r\n field: this.engine()()?.fieldAt(chip.fieldIndex),\r\n targetArea: null,\r\n overTree: false,\r\n invalid: false,\r\n slot: null,\r\n targetEl: null,\r\n indicator: null,\r\n };\r\n }\r\n\r\n private buildArea(group: NxePivotArea): ChooserArea {\r\n const engine = this.engine()();\r\n const chips = (engine ? engine.areaFields(group) : []).map(({ fieldIndex, field }) =>\r\n buildChip(fieldIndex, field, group, this.allowSorting(), this.allowFiltering()),\r\n );\r\n return {\r\n group,\r\n caption: this.messages.t(CHOOSER_TEXT_KEYS[`${group}Fields`]),\r\n icon: AREA_ICONS[group],\r\n chips,\r\n };\r\n }\r\n\r\n private host(): HTMLElement {\r\n return this.elementRef.nativeElement as HTMLElement;\r\n }\r\n\r\n /**\r\n * dx m_field_chooser_base.js `renderSortable.onDragging` cancel rules: a true measure may\r\n * only sit in data; an explicit non-measure never in data; undefined = unrestricted.\r\n */\r\n private allowedIn(field: NxePivotField | undefined, area: NxePivotArea): boolean {\r\n if (field?.isMeasure === true) {\r\n return area === 'data';\r\n }\r\n if (field?.isMeasure === false) {\r\n return area !== 'data';\r\n }\r\n return true;\r\n }\r\n\r\n private trackPointer(x: number, y: number): void {\r\n const d = this.drag;\r\n if (!d) {\r\n return;\r\n }\r\n const inRect = (el: HTMLElement): boolean => {\r\n const r = el.getBoundingClientRect();\r\n return x >= r.left && x <= r.right && y >= r.top && y <= r.bottom;\r\n };\r\n const zones = Array.from(\r\n this.host().querySelectorAll<HTMLElement>('.nxe-area-fields[group]'),\r\n );\r\n const hitEl = zones.find(inRect) ?? null;\r\n if (d.targetEl && d.targetEl !== hitEl) {\r\n d.targetEl.classList.remove('nxe-drag-target');\r\n d.targetEl = null;\r\n }\r\n if (!hitEl) {\r\n d.targetArea = null;\r\n d.invalid = false;\r\n d.slot = null;\r\n d.indicator?.remove();\r\n d.indicator = null;\r\n // The All-Fields tree box is dx's REMOVE zone (a sortable group without a\r\n // `group` attr) and gets the same hover highlight as any target group.\r\n const treeEl = this.host().querySelector<HTMLElement>('.nxe-all-fields .nxe-area-fields');\r\n if (treeEl && inRect(treeEl)) {\r\n treeEl.classList.add('nxe-drag-target');\r\n d.targetEl = treeEl;\r\n d.overTree = true;\r\n return;\r\n }\r\n // Anywhere else: no target group — the release will be a snap-back NO-OP.\r\n d.overTree = false;\r\n return;\r\n }\r\n d.overTree = false;\r\n const group = hitEl.getAttribute('group') as NxePivotArea;\r\n if (!this.allowedIn(d.field, group)) {\r\n // dx `e.cancel = true`: no highlight, no indicator, and the drop is a NO-OP.\r\n d.targetArea = null;\r\n d.invalid = true;\r\n d.slot = null;\r\n d.targetEl = null;\r\n d.indicator?.remove();\r\n d.indicator = null;\r\n return;\r\n }\r\n hitEl.classList.add('nxe-drag-target');\r\n d.targetEl = hitEl;\r\n d.targetArea = group;\r\n d.invalid = false;\r\n const chips = Array.from(\r\n hitEl.querySelectorAll<HTMLElement>('.nxe-area-field.nxe-area-box'),\r\n );\r\n let slot = chips.length;\r\n for (let i = 0; i < chips.length; i++) {\r\n const r = chips[i].getBoundingClientRect();\r\n if (y < r.top + r.height / 2) {\r\n slot = i;\r\n break;\r\n }\r\n }\r\n d.slot = slot;\r\n this.placeIndicator(d, hitEl, chips, slot);\r\n }\r\n\r\n /** dx `.nxe-position-indicator-vertical`: a 2px bar between the stacked chips. */\r\n private placeIndicator(\r\n d: NonNullable<typeof this.drag>,\r\n areaEl: HTMLElement,\r\n chips: HTMLElement[],\r\n slot: number,\r\n ): void {\r\n if (!chips.length) {\r\n d.indicator?.remove();\r\n d.indicator = null;\r\n return;\r\n }\r\n if (!d.indicator) {\r\n d.indicator = document.createElement('div');\r\n }\r\n const last = slot >= chips.length;\r\n d.indicator.className =\r\n 'nxe-position-indicator nxe-position-indicator-vertical' +\r\n (last ? ' nxe-position-indicator-last' : '');\r\n const areaRect = areaEl.getBoundingClientRect();\r\n const ref = last ? chips[chips.length - 1] : chips[slot];\r\n const refRect = ref.getBoundingClientRect();\r\n d.indicator.style.position = 'absolute';\r\n d.indicator.style.left = `${refRect.left - areaRect.left}px`;\r\n d.indicator.style.top = `${(last ? refRect.bottom : refRect.top) - areaRect.top}px`;\r\n d.indicator.style.width = `${refRect.width}px`;\r\n if (d.indicator.parentElement !== areaEl) {\r\n areaEl.appendChild(d.indicator);\r\n }\r\n }\r\n\r\n private completeDrop(): void {\r\n const d = this.drag;\r\n if (!d) {\r\n return;\r\n }\r\n if (d.invalid) {\r\n return; // dx cancel: released over a forbidden area — nothing happens\r\n }\r\n if (d.overTree) {\r\n // Dropped on the All-Fields tree — dx's only drag-remove path: the targetGroup\r\n // has no `group` attr, so _applyChanges clears the area (same as unchecking).\r\n this.fieldMove.emit({ fieldIndex: d.chip.fieldIndex, area: null, areaIndex: 0 });\r\n return;\r\n }\r\n if (d.targetArea === null) {\r\n // Released outside every group (title bar, captions, outside the popup): dx's\r\n // end handler fires no onChanged — the chip snaps back, nothing changes.\r\n return;\r\n }\r\n let slot = d.slot ?? 0;\r\n if (d.targetArea === d.fromArea) {\r\n const pos =\r\n this.engine()()\r\n ?.areaFields(d.fromArea)\r\n .findIndex(({ fieldIndex }) => fieldIndex === d.chip.fieldIndex) ?? -1;\r\n if (pos >= 0 && slot > pos) {\r\n slot -= 1;\r\n }\r\n if (slot === pos) {\r\n return;\r\n }\r\n }\r\n this.fieldMove.emit({ fieldIndex: d.chip.fieldIndex, area: d.targetArea, areaIndex: slot });\r\n }\r\n}\r\n","<!-- dx popup box: fieldChooser width/height land on `.dx-overlay-content` (m_widget.js popup\r\n options; 600x400 -> 598x349 content once the 1px borders + 49px title bar are taken out —\r\n oracle/chooser-probe.json reconciliation in the component header). Title bar per the\r\n full-page capture: \"Field Chooser\" left, X right, 1px rule beneath, popup centered. -->\r\n<div\r\n class=\"nxe-overlay-content nxe-popup-normal\"\r\n [style.width]=\"boxWidth()\"\r\n [style.height]=\"boxHeight()\">\r\n <div class=\"nxe-popup-title nxe-has-close-button\">\r\n <span class=\"nxe-toolbar-label\">{{ texts.title }}</span>\r\n <span\r\n class=\"nxe-closebutton\"\r\n role=\"button\"\r\n tabindex=\"0\"\r\n [attr.aria-label]=\"messages.t('common.close')\"\r\n (click)=\"closed.emit()\"\r\n (keydown.enter)=\"closed.emit()\"></span>\r\n </div>\r\n\r\n <!-- fixtures/field-chooser.html verbatim from here down: the chooser root carries\r\n dx-popup-content + dx-pivotgridfieldchooser + dx-pivotgrid-fields-container (the class\r\n that arms the shared chip chrome, nxe-pivot-field-chip), then layout 0's two rows. -->\r\n <div class=\"nxe-popup-content nxe-widget nxe-pivotgridfieldchooser nxe-pivotgrid-fields-container\">\r\n <div class=\"nxe-pivotgridfieldchooser-container nxe-layout-0\">\r\n <div class=\"nxe-row\">\r\n <div class=\"nxe-col\">\r\n <!-- All Fields: dx-treeview of EVERY defined field, checkbox = has an area. -->\r\n <div class=\"nxe-area nxe-all-fields\">\r\n <div class=\"nxe-area-fields-header\">\r\n <span class=\"nxe-area-icon nxe-icon-{{ allIcon }}\"></span><span> </span><span class=\"nxe-area-caption\">{{ texts.allFields }}</span>\r\n </div>\r\n <div\r\n class=\"nxe-area-fields nxe-pivotgrid-drag-action nxe-treeview-border-visible nxe-widget nxe-collection nxe-treeview\"\r\n tabindex=\"0\"\r\n role=\"tree\">\r\n @if (allowSearch()) {\r\n <!-- dx allowSearch: the treeview search editor (dx margin:5px, in the scss);\r\n default FALSE — the broker capture has no search box (oracle §c). -->\r\n <div class=\"nxe-treeview-search nxe-texteditor nxe-searchbox\">\r\n <input\r\n class=\"nxe-texteditor-input\"\r\n type=\"text\"\r\n [attr.placeholder]=\"messages.t('common.search')\"\r\n [value]=\"searchText()\"\r\n (input)=\"onSearchInput($event)\" />\r\n </div>\r\n }\r\n <div class=\"nxe-scrollable nxe-scrollable-vertical\">\r\n <div class=\"nxe-scrollable-wrapper\">\r\n <div class=\"nxe-scrollable-container\">\r\n <div class=\"nxe-scrollable-content\">\r\n <ul class=\"nxe-treeview-node-container\" role=\"group\">\r\n @for (item of treeItems(); track item.fieldIndex) {\r\n <li\r\n class=\"nxe-treeview-node nxe-treeview-item-with-checkbox nxe-treeview-root-node nxe-treeview-node-is-leaf\"\r\n [class.nxe-state-selected]=\"item.selected\"\r\n [attr.data-item-id]=\"$index + 1\"\r\n role=\"treeitem\"\r\n [attr.aria-label]=\"item.caption\"\r\n aria-level=\"1\"\r\n [attr.aria-selected]=\"item.selected\">\r\n <div class=\"nxe-item nxe-treeview-item\">\r\n <div class=\"nxe-item-content nxe-treeview-item-content\">\r\n <div class=\"nxe-area-field\" tree-view-item=\"true\"><span>{{ item.caption }}</span></div>\r\n </div>\r\n <div\r\n class=\"nxe-widget nxe-checkbox\"\r\n [class.nxe-checkbox-checked]=\"item.selected\"\r\n role=\"checkbox\"\r\n tabindex=\"0\"\r\n [attr.aria-checked]=\"item.selected\"\r\n [attr.aria-label]=\"messages.t('pivot.chooser.checkState')\"\r\n (click)=\"onCheckboxClick(item)\"\r\n (keydown.space)=\"onCheckboxClick(item)\">\r\n <input type=\"hidden\" [value]=\"item.selected\" />\r\n <div class=\"nxe-checkbox-container\"><span class=\"nxe-checkbox-icon\"></span></div>\r\n </div>\r\n <div class=\"nxe-treeview-expander-icon-stub\"></div>\r\n </div>\r\n </li>\r\n }\r\n </ul>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"nxe-col\">\r\n <ng-container *ngTemplateOutlet=\"areaTpl; context: { area: rowArea() }\" />\r\n <ng-container *ngTemplateOutlet=\"areaTpl; context: { area: columnArea() }\" />\r\n </div>\r\n </div>\r\n <div class=\"nxe-row\">\r\n <div class=\"nxe-col\">\r\n <ng-container *ngTemplateOutlet=\"areaTpl; context: { area: filterArea() }\" />\r\n </div>\r\n <div class=\"nxe-col\">\r\n <ng-container *ngTemplateOutlet=\"areaTpl; context: { area: dataArea() }\" />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!-- One group area (dx `_renderArea`): header (icon + caption), then the bordered fields box\r\n with the stacked chips. An EMPTY area shows nothing — the chooser has no\r\n \"Drop … Fields Here\" strings (fixture: the filter area's field container is empty). -->\r\n<ng-template #areaTpl let-area=\"area\">\r\n <div class=\"nxe-area\">\r\n <div class=\"nxe-area-fields-header\">\r\n <span class=\"nxe-area-icon nxe-icon-{{ area.icon }}\"></span><span> </span><span class=\"nxe-area-caption\">{{ area.caption }}</span>\r\n </div>\r\n <div\r\n class=\"nxe-area-fields nxe-pivotgrid-drag-action nxe-scrollable nxe-scrollable-vertical\"\r\n [attr.group]=\"area.group\"\r\n allow-scrolling=\"true\">\r\n <div class=\"nxe-scrollable-wrapper\">\r\n <div class=\"nxe-scrollable-container\" tabindex=\"0\">\r\n <div class=\"nxe-scrollable-content\">\r\n <div class=\"nxe-area-field-container\">\r\n @for (chip of area.chips; track chip.fieldIndex) {\r\n <!-- dx renderField(field, true) (m_field_chooser.js:465): showColumnLines on,\r\n so the indicators float right ahead of the caption. -->\r\n <div\r\n nxePivotFieldChip\r\n [chip]=\"chip\"\r\n [floatIndicators]=\"true\"\r\n (chipPointerDown)=\"onChipPointerDown(chip, area.group, $event)\"\r\n (chipClick)=\"onChipClick(chip)\"\r\n (chipFilterClick)=\"onChipFilterClick(chip, $event)\"></div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\n// nxe-pivot-grid — drop-in for DevExtreme `dx-pivot-grid`. Renders the 2D cross-tab produced by\r\n// NxePivotDataSource in either dx row-header layout: 'standard' (default — one column per row\r\n// field, expanded parents rowspan their children and close with a \"{value} Total\" row) or 'tree'\r\n// (single indented column, parents inline). Stacked column headers (column values × data-field\r\n// captions) + right-aligned data cells + optional totals/grand totals, with dx cell classes\r\n// emitted alongside the frozen nxe- classes. Exposes the `.instance` facade the app calls:\r\n// `getDataSource().reload()`, `bindChart()`, and an export hook.\r\n\r\nimport {\r\n afterRenderEffect,\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n contentChild,\r\n ElementRef,\r\n EventEmitter,\r\n inject,\r\n input,\r\n linkedSignal,\r\n OnDestroy,\r\n Output,\r\n Signal,\r\n signal,\r\n viewChild,\r\n ViewContainerRef,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { NgTemplateOutlet } from '@angular/common';\r\nimport { takeUntilDestroyed, toObservable } from '@angular/core/rxjs-interop';\r\nimport { Overlay, OverlayRef } from '@angular/cdk/overlay';\r\nimport { ComponentPortal } from '@angular/cdk/portal';\r\nimport { combineLatest, filter, pairwise, take } from 'rxjs';\r\nimport { NxeMessageService } from '@nexterajs/ui/core';\r\nimport { Info } from 'luxon';\r\nimport { NXE_NUMBER_SEPARATORS } from '@nexterajs/ui/intl';\r\nimport { nxePane } from '@nexterajs/ui/styling';\r\nimport { Workbook } from '@nexterajs/ui/excel';\r\nimport { nxeSaveAs } from '@nexterajs/ui/excel';\r\nimport { exportPivotGrid } from './nxe-pivot-excel-export';\r\nimport { NxeScrollingComponent } from '@nexterajs/ui/grid';\r\nimport { NxePivotDataSource } from './nxe-pivot-data-source';\r\nimport { NxeFieldPanelComponent, NxeStateStoringComponent } from './nxe-pivot-config.components';\r\nimport { NxePivotFieldChooserComponent } from './nxe-pivot-field-chooser.component';\r\nimport {\r\n NxePivotFieldMoveEvent,\r\n NxePivotFieldPanelComponent,\r\n NxePivotFilterOpenEvent,\r\n} from './nxe-pivot-field-panel.component';\r\nimport { NXE_HF_BLANKS, NxeHeaderFilterModel } from '@nexterajs/ui/grid';\r\nimport { openNxeHeaderFilterOverlay } from '@nexterajs/ui/grid';\r\nimport {\r\n NxeChartInstance,\r\n NxeChartSeries,\r\n NxePivotArea,\r\n NxePivotBodyRow,\r\n NxePivotCellEvent,\r\n NxePivotColumnLeaf,\r\n NxePivotContentReadyEvent,\r\n NxePivotDataSourceOptions,\r\n NxePivotExportingEvent,\r\n NxePivotField,\r\n NxePivotFieldOverride,\r\n NxePivotGridInstance,\r\n NxePivotHeaderCell,\r\n NxePivotModel,\r\n NxePivotOptionChangedEvent,\r\n NxePivotRowHeaderCell,\r\n NxePivotRowHeaderLayout,\r\n NxePivotTexts,\r\n NxePivotTotalsPrior,\r\n} from './nxe-pivot.types';\r\n\r\n/**\r\n * P3-C2: apply the panel's overrides over the caller's fields — NEW objects for overridden\r\n * fields, the caller's objects reused (and never written) everywhere else. `area: null` clears\r\n * the area (P3-C3: a chooser tree-drop or uncheck removed the field — it stays\r\n * defined-but-not-displayed).\r\n */\r\n/**\r\n * W4 Lane 3 (virtual row windowing): the pivot's fixed row pitch — 7px top/bottom padding +\r\n * ~17px line box ≈ dx.light's 31px row (the P1-C2 chrome note). Simple fixed-height windowing,\r\n * like dx's virtual scrolling assumes uniform row heights for its content placeholders.\r\n */\r\nconst PIVOT_VIRTUAL_ROW_HEIGHT = 31;\r\n/** Rows rendered beyond each window edge (keeps fast scrolls painted). */\r\nconst PIVOT_VIRTUAL_OVERSCAN = 5;\r\n\r\nfunction mergeFieldOverrides(\r\n fields: NxePivotField[],\r\n overrides: ReadonlyMap<number, NxePivotFieldOverride>,\r\n): NxePivotField[] {\r\n return fields.map((f, i) => {\r\n const o = overrides.get(i);\r\n if (!o) {\r\n return f;\r\n }\r\n const merged: NxePivotField = { ...f };\r\n if (o.area !== undefined) {\r\n merged.area = o.area ?? undefined;\r\n }\r\n if (o.areaIndex !== undefined) {\r\n merged.areaIndex = o.areaIndex;\r\n }\r\n if (o.sortOrder !== undefined) {\r\n merged.sortOrder = o.sortOrder;\r\n }\r\n if (o.expanded !== undefined) {\r\n merged.expanded = o.expanded;\r\n }\r\n // P3-C4 (header filter): `filterValues: null` = the user cleared the filter (full-check\r\n // → OK) — the caller's declarative seed must NOT resurrect, so the merged field drops it.\r\n if (o.filterValues !== undefined) {\r\n merged.filterValues = o.filterValues ?? undefined;\r\n }\r\n if (o.filterType !== undefined) {\r\n merged.filterType = o.filterType;\r\n }\r\n return merged;\r\n });\r\n}\r\n\r\n/** `dxo-field-chooser` — LIVE since P3-C3: with `enabled` the pivot renders the\r\n * `.nxe-pivotgrid-field-chooser-button` toolbar button and opens the chooser popup\r\n * (nxe-pivot-field-chooser) in a CDK overlay. Defaults are dxPivotGrid's `fieldChooser`\r\n * defaults (m_widget.js): enabled true, width/height 600, allowSearch false,\r\n * applyChangesMode 'instantly' (no OK/Cancel — changes hit the pivot live). */\r\n@Component({\r\n selector: 'nxe-field-chooser',\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 NxeFieldChooserComponent {\r\n readonly enabled = input(true);\r\n readonly height = input<number | undefined>(undefined);\r\n readonly width = input<number | undefined>(undefined);\r\n readonly allowSearch = input(false);\r\n}\r\n\r\n@Component({\r\n selector: 'nxe-pivot-grid',\r\n standalone: true,\r\n imports: [NxePivotFieldPanelComponent, NgTemplateOutlet],\r\n templateUrl: './nxe-pivot-grid.component.html',\r\n styleUrl: './nxe-pivot-grid.component.scss',\r\n host: {\r\n class: 'nxe-widget nxe-pivot-grid',\r\n '[style.height]': 'hostHeight()',\r\n // dx puts these marker classes on the widget root; here they arm while the field\r\n // panel renders — or while the corner hosts the field-chooser toolbar — so the chip\r\n // and area-head chrome (the library's own, nxe-pivot-field-chip + this component's\r\n // scss; an app's dx-prefixed copies under the class mirror) reach the panel bands AND\r\n // the corner-hosted row area without touching the panel-less cross-tab chrome.\r\n '[class.nxe-pivotgrid]': 'panelVisible() || chooserInCorner()',\r\n '[class.nxe-pivotgrid-fields-container]': 'panelVisible() || chooserInCorner()',\r\n },\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class NxePivotGridComponent implements OnDestroy {\r\n // --- Inputs (mirror dx-pivot-grid) ---------------------------------------------------------\r\n readonly dataSource = input<NxePivotDataSourceOptions | NxePivotDataSource | null | undefined>(\r\n null,\r\n );\r\n /** dx `allowFiltering` (default false) — LIVE since P3-C4: filterable dimension chips\r\n * (panel AND chooser) render the `.nxe-header-filter` funnel and open the shared\r\n * header-filter panel; per-field `field.allowFiltering` overrides the widget flag\r\n * (dx m_widget `_updateCalculatedOptions`). */\r\n readonly allowFiltering = input(false);\r\n /** dx `allowSortingBySummary`: accepted + round-tripped, INERT — dx exposes it only\r\n * through the data-cell/total context menu (\"Sort by This Column\"), Phase 4 territory\r\n * (DEFAULTS.md, dated P3-C4 note). */\r\n readonly allowSortingBySummary = input(false);\r\n /** dx: gates the context-menu \"Expand All\"/\"Collapse All\" items (default false). Accepted +\r\n * round-tripped; no context menu exists until Phase 4 (DEFAULTS.md). The facade's\r\n * `expandAll()`/`collapseAll()` work regardless, exactly as dx's data-source methods do. */\r\n readonly allowExpandAll = input(false);\r\n readonly showBorders = input(false);\r\n /** dx default TRUE (m_widget.js defaultOptions): `nxe-word-wrap` on the table lets header\r\n * cells wrap; data cells stay nowrap either way (dx.light's direct td rule). */\r\n readonly wordWrapEnabled = input(true);\r\n readonly rowHeaderLayout = input<NxePivotRowHeaderLayout>('standard');\r\n /** dx `height`: number (px) or CSS string, applied to the widget root — the internal\r\n * scroll container tracks it at 100%. */\r\n readonly height = input<number | string | undefined>(undefined);\r\n readonly texts = input<NxePivotTexts | undefined>(undefined);\r\n // DevExtreme defaults all four totals to true (no global override exists in app.component.ts).\r\n readonly showColumnTotals = input(true);\r\n readonly showRowTotals = input(true);\r\n readonly showColumnGrandTotals = input(true);\r\n readonly showRowGrandTotals = input(true);\r\n /** dx `showTotalsPrior` — 'rows'/'both' place each \"{value} Total\" row before its children. */\r\n readonly showTotalsPrior = input<NxePivotTotalsPrior>('none');\r\n /** dx `dataFieldArea` (default 'column'): 'row' renders the measures as the innermost ROW\r\n * level when two or more exist (with one, dx omits the metric level on either axis).\r\n * Left undefined the engine falls back to the dataSource options' own `dataFieldArea`. */\r\n readonly dataFieldArea = input<'row' | 'column' | undefined>(undefined);\r\n /** dx `allowSorting` (default false, P3-C2): field-panel chips toggle their field's\r\n * sortOrder on click and carry the `.nxe-sort` arrow in `.nxe-column-indicators`. */\r\n readonly allowSorting = input(false);\r\n\r\n // --- W4 Lane 2: facade `option(name, value)` overrides + dx-shaped outputs ------------------\r\n\r\n /**\r\n * Facade `option(name, value)` writes land here and WIN over the input bindings — the dx\r\n * `instance.option(...)` idiom on a component whose declarative config are signal inputs.\r\n * Every live read site goes through the `*Eff` computeds below, so a set is immediately\r\n * effective; the input keeps feeding the value while no override exists.\r\n */\r\n private readonly optionOverrides = signal<ReadonlyMap<string, unknown>>(new Map());\r\n\r\n private effOf<T>(name: string, base: () => T): Signal<T> {\r\n return computed(() => {\r\n const o = this.optionOverrides();\r\n return o.has(name) ? (o.get(name) as T) : base();\r\n });\r\n }\r\n\r\n protected readonly allowFilteringEff = this.effOf('allowFiltering', this.allowFiltering);\r\n protected readonly allowSortingEff = this.effOf('allowSorting', this.allowSorting);\r\n protected readonly allowSortingBySummaryEff = this.effOf(\r\n 'allowSortingBySummary',\r\n this.allowSortingBySummary,\r\n );\r\n protected readonly allowExpandAllEff = this.effOf('allowExpandAll', this.allowExpandAll);\r\n protected readonly showBordersEff = this.effOf('showBorders', this.showBorders);\r\n protected readonly wordWrapEnabledEff = this.effOf('wordWrapEnabled', this.wordWrapEnabled);\r\n protected readonly rowHeaderLayoutEff = this.effOf('rowHeaderLayout', this.rowHeaderLayout);\r\n protected readonly heightEff = this.effOf('height', this.height);\r\n protected readonly textsEff = this.effOf('texts', this.texts);\r\n protected readonly showColumnTotalsEff = this.effOf('showColumnTotals', this.showColumnTotals);\r\n protected readonly showRowTotalsEff = this.effOf('showRowTotals', this.showRowTotals);\r\n protected readonly showColumnGrandTotalsEff = this.effOf(\r\n 'showColumnGrandTotals',\r\n this.showColumnGrandTotals,\r\n );\r\n protected readonly showRowGrandTotalsEff = this.effOf(\r\n 'showRowGrandTotals',\r\n this.showRowGrandTotals,\r\n );\r\n protected readonly showTotalsPriorEff = this.effOf('showTotalsPrior', this.showTotalsPrior);\r\n protected readonly dataFieldAreaEff = this.effOf('dataFieldArea', this.dataFieldArea);\r\n\r\n /** The documented option names `option()` gets/sets (DEFAULTS.md lists the exclusions). */\r\n private readonly effOptions: Record<string, Signal<unknown>> = {\r\n allowExpandAll: this.allowExpandAllEff,\r\n allowFiltering: this.allowFilteringEff,\r\n allowSorting: this.allowSortingEff,\r\n allowSortingBySummary: this.allowSortingBySummaryEff,\r\n dataFieldArea: this.dataFieldAreaEff,\r\n height: this.heightEff,\r\n rowHeaderLayout: this.rowHeaderLayoutEff,\r\n showBorders: this.showBordersEff,\r\n showColumnGrandTotals: this.showColumnGrandTotalsEff,\r\n showColumnTotals: this.showColumnTotalsEff,\r\n showRowGrandTotals: this.showRowGrandTotalsEff,\r\n showRowTotals: this.showRowTotalsEff,\r\n showTotalsPrior: this.showTotalsPriorEff,\r\n texts: this.textsEff,\r\n wordWrapEnabled: this.wordWrapEnabledEff,\r\n };\r\n\r\n /**\r\n * dx-shaped outputs (W4 Lane 2) — no consumer binds them today; parity insurance.\r\n * Classic EventEmitters, NOT `output()`: `.observed` gates the per-cell walks so a pivot\r\n * with no listeners pays nothing (dx does the same — m_area_item only walks its cells\r\n * when `onCellPrepared || hasEvent`).\r\n */\r\n @Output() readonly onCellClick = new EventEmitter<NxePivotCellEvent>();\r\n @Output() readonly onCellPrepared = new EventEmitter<NxePivotCellEvent>();\r\n @Output() readonly onContentReady = new EventEmitter<NxePivotContentReadyEvent>();\r\n @Output() readonly onOptionChanged = new EventEmitter<NxePivotOptionChangedEvent>();\r\n @Output() readonly onExporting = new EventEmitter<NxePivotExportingEvent>();\r\n\r\n /**\r\n * dx `onOptionChanged` source: one snapshot of every documented option's EFFECTIVE value\r\n * (facade overrides included, so `option(name, v)` and an input-binding change emit through\r\n * the same diff — never twice). `dataSource` rides along, get-only.\r\n */\r\n private readonly optionSnapshot = computed<Record<string, unknown>>(() => {\r\n const out: Record<string, unknown> = { dataSource: this.dataSource() };\r\n for (const [name, sig] of Object.entries(this.effOptions)) {\r\n out[name] = sig();\r\n }\r\n return out;\r\n });\r\n\r\n protected readonly fieldChooser = contentChild(NxeFieldChooserComponent);\r\n /** The projected `nxe-field-panel` config (P3-C2) — the panel renders when it is visible. */\r\n protected readonly fieldPanel = contentChild(NxeFieldPanelComponent);\r\n /** The projected `nxe-state-storing` config — LIVE since P3-C4 for `type: 'custom'`:\r\n * every layout mutation fires `customSave(state)` and `customLoad` is honored on init. */\r\n protected readonly stateStoring = contentChild(NxeStateStoringComponent);\r\n /** dx `fieldPanel.visible` (default false): gates the panel, the corner's chips-vs-caption\r\n * switch, and the dx marker classes on the host. */\r\n protected readonly panelVisible = computed(() => this.fieldPanel()?.visible() === true);\r\n /** The rendered panel component — source of the corner-hosted row-area template. */\r\n private readonly panelCmp = viewChild(NxePivotFieldPanelComponent);\r\n /** The ROW fields area, outletted into the corner cell (dx hosts the row chips inside\r\n * `.nxe-area-description-cell` — oracle §c; the corner shows NO caption text then). */\r\n protected readonly panelRowAreaTpl = computed(() => this.panelCmp()?.rowAreaTemplate() ?? null);\r\n\r\n // --- Field chooser (P3-C3) -----------------------------------------------------------------\r\n\r\n /** The `.nxe-pivotgrid-field-chooser-button` renders only when an `nxe-field-chooser` is\r\n * projected with `enabled` not false (the DA page passes [enabled]=\"true\"). */\r\n protected readonly chooserEnabled = computed(\r\n () => this.fieldChooser() != null && this.fieldChooser()!.enabled() !== false,\r\n );\r\n /** dx toolbar placement (m_widget.js `_renderDescriptionArea`, verbatim branch order):\r\n * (a) panel visible && showFilterFields -> the `.nxe-filter-header` band;\r\n * (b) panel visible && (showDataFields || showColumnFields) -> the `.nxe-column-header`\r\n * band (dx-compat's dormant column-header button rules go live);\r\n * (c) else -> the cross-tab corner `.nxe-area-description-cell`, where the button is\r\n * transparent until hover and the corner drops its caption (the library's own rules,\r\n * nxe-pivot-grid.component.scss — dx.light's description-cell toolbar rules). */\r\n protected readonly chooserToolbarHost = computed<'filter' | 'column' | 'corner' | null>(() => {\r\n if (!this.chooserEnabled()) {\r\n return null;\r\n }\r\n const fp = this.fieldPanel();\r\n if (this.panelVisible()) {\r\n if (fp?.showFilterFields() !== false) {\r\n return 'filter';\r\n }\r\n if (fp?.showDataFields() !== false || fp?.showColumnFields() !== false) {\r\n return 'column';\r\n }\r\n }\r\n return 'corner';\r\n });\r\n /** The panel-hosted placements, bound into the panel's `toolbarArea` input. */\r\n protected readonly panelToolbarArea = computed<'filter' | 'column' | null>(() => {\r\n const host = this.chooserToolbarHost();\r\n return host === 'filter' || host === 'column' ? host : null;\r\n });\r\n protected readonly chooserInCorner = computed(() => this.chooserToolbarHost() === 'corner');\r\n\r\n private chooserOverlayRef: OverlayRef | null = null;\r\n private readonly overlay = inject(Overlay);\r\n private readonly viewContainerRef = inject(ViewContainerRef);\r\n\r\n private readonly elementRef = inject(ElementRef<HTMLElement>);\r\n /** Locale separators for every number the pivot renders; threaded into the data source. */\r\n private readonly separators = inject(NXE_NUMBER_SEPARATORS);\r\n /** The library's runtime-switchable messages. */\r\n protected readonly messages = inject(NxeMessageService);\r\n\r\n /** Bumped by `getDataSource().reload()` to force a re-aggregate. */\r\n private readonly reloadTick = signal(0);\r\n /**\r\n * W4 Lane 1: bumped by `repaint()` / `updateDimensions()` — RENDER-ONLY. dx `repaint()` is\r\n * the plain Widget re-render (m_widget.js inherits it): it re-renders/re-layouts the\r\n * existing data-controller state and never touches the data source, so it must NOT\r\n * re-aggregate (the pre-W4 facade bumped `reloadTick`, which re-instantiated the engine\r\n * and reset the state linkedSignals — wiping the user's expand/layout state on every\r\n * sidebar toggle of the DA page). The signals already keep the DOM fresh; the observable\r\n * effect of a repaint is re-running the measurement pass below (dx re-layout).\r\n */\r\n private readonly renderTick = signal(0);\r\n private readonly boundChart = signal<NxeChartInstance | null>(null);\r\n /** W4 Lane 4: the dx `bindChart(chart, integrationOptions)` options — a NEW object per\r\n * bindChart call, so re-binding re-renders (dx runs `updateChart` on every bind). */\r\n private readonly chartBindOptions = signal<Record<string, unknown>>({});\r\n\r\n /**\r\n * P3-C2: the field panel's mutations (chip drag between/within areas, click-to-sort — and\r\n * since P3-C4 the header-filter applies), keyed by the field's index in the caller's\r\n * `fields` array and MERGED over those fields when the engine is constructed — the caller's\r\n * array/objects are never mutated (report-output-pivot serializes its own fields in\r\n * `onSave`). Resets whenever the caller swaps `dataSource` (the DA page replaces the object\r\n * on view select), exactly as dx resets the layout when a new state loads. (P3-C4 migrated\r\n * that page's `onExpandAll` off its cloneDeep+swap onto the facade\r\n * `expandAll()`/`collapseAll()`, so expand-all no longer wipes a dragged layout.)\r\n */\r\n private readonly fieldOverrides = linkedSignal<\r\n NxePivotDataSourceOptions | NxePivotDataSource | null | undefined,\r\n ReadonlyMap<number, NxePivotFieldOverride>\r\n >({\r\n source: () => this.dataSource(),\r\n computation: () => new Map<number, NxePivotFieldOverride>(),\r\n });\r\n\r\n protected readonly engine = computed<NxePivotDataSource | null>(() => {\r\n this.reloadTick();\r\n const ds = this.dataSource();\r\n if (!ds) {\r\n return null;\r\n }\r\n const overrides = this.fieldOverrides();\r\n if (ds instanceof NxePivotDataSource) {\r\n return overrides.size\r\n ? ds.cloneWithFields(mergeFieldOverrides(ds.fields(), overrides))\r\n : ds;\r\n }\r\n const opts = ds as NxePivotDataSourceOptions;\r\n const explicit = opts.fields ?? [];\r\n if (overrides.size && explicit.length) {\r\n return new NxePivotDataSource({\r\n ...opts,\r\n separators: this.separators,\r\n fields: mergeFieldOverrides(explicit, overrides),\r\n });\r\n }\r\n // No explicit fields → store-derived fields are all AREA-LESS: no chips exist, so the\r\n // panel can never have produced overrides for this data source.\r\n return new NxePivotDataSource({ ...opts, separators: this.separators });\r\n });\r\n\r\n /**\r\n * The \"layout changed\" hook (P3-C2, consumed since P3-C4): the caller's fields with the\r\n * panel's overrides merged — a NEW array identity after every mutation (drag move, sort\r\n * toggle, filter apply), the caller's own array untouched. `fireStateSave()` serializes\r\n * THIS array into the `customSave` state after each mutation, so a consumer's Save\r\n * persists the post-drag layout; `getExportModel()`/the Excel export read the same\r\n * overridden engine, so exports reflect a move immediately.\r\n */\r\n readonly effectiveFields = computed<NxePivotField[]>(() => this.engine()?.fields() ?? []);\r\n\r\n /**\r\n * Per-node chevron overrides — W4 Lane 1: keyed on the `dataSource` INPUT identity (like\r\n * {@link fieldOverrides}), NOT on the engine instance. dx keeps its expand state inside the\r\n * data source (`getExpandedPaths` re-feeds `rowExpandedPaths`/`columnExpandedPaths` into\r\n * every `_loadCore`, m_data_source.js), so `repaint()` (render-only), `reload()`\r\n * (re-aggregate, state kept) and layout mutations (sort/move — dx keeps expandedPaths\r\n * across them) all PRESERVE it; only a real dataSource swap (the DA page's `initChart`\r\n * builds a new options object per view select) resets. Stale keys after an area move\r\n * simply stop matching any node — harmless, dx-alike.\r\n */\r\n private readonly manualExpanded = linkedSignal<\r\n NxePivotDataSourceOptions | NxePivotDataSource | null | undefined,\r\n Map<string, boolean>\r\n >({\r\n source: () => this.dataSource(),\r\n computation: () => new Map<string, boolean>(),\r\n });\r\n\r\n protected readonly model = computed<NxePivotModel | null>(() => {\r\n // W4 Lane 1: read the tick directly — a facade `reload()` on a NxePivotDataSource\r\n // INSTANCE input re-aggregates IN PLACE (`ds.reload()`), so the engine computed can\r\n // return the identical reference and this computed must still rebuild the model.\r\n this.reloadTick();\r\n const e = this.engine();\r\n if (!e) {\r\n return null;\r\n }\r\n return e.getModel({\r\n expandedOverrides: this.manualExpanded(),\r\n showRowGrandTotals: this.showRowGrandTotalsEff(),\r\n showColumnGrandTotals: this.showColumnGrandTotalsEff(),\r\n rowHeaderLayout: this.rowHeaderLayoutEff(),\r\n showRowTotals: this.showRowTotalsEff(),\r\n showColumnTotals: this.showColumnTotalsEff(),\r\n showTotalsPrior: this.showTotalsPriorEff(),\r\n // The bundle's wording under whatever the host passed, so a language switch rebuilds\r\n // the model (and with it Grand Total / Total / No data) without touching the engine.\r\n texts: {\r\n grandTotal: this.messages.t('pivot.grandTotal'),\r\n total: this.messages.t('pivot.total'),\r\n noData: this.messages.t('pivot.noData'),\r\n ...this.textsEff(),\r\n },\r\n dataFieldArea: this.dataFieldAreaEff(),\r\n });\r\n });\r\n\r\n /** Host height style — dx `height`: numbers are px, strings pass through, unset removes it. */\r\n protected readonly hostHeight = computed<string | null>(() => {\r\n const h = this.heightEff();\r\n if (h == null || h === '') {\r\n return null;\r\n }\r\n return typeof h === 'number' ? `${h}px` : h;\r\n });\r\n\r\n // --- W4 Lane 3: virtual row windowing (tree-scoped) + empty state --------------------------\r\n\r\n /** The projected `nxe-scrolling` config — `mode: 'virtual'` opts into row windowing. */\r\n protected readonly scrolling = contentChild(NxeScrollingComponent);\r\n /** Scroll offset of `.nxe-pivotgrid-scroll` (its own scroll handler feeds it). */\r\n private readonly scrollTop = signal(0);\r\n /** The scroll container's clientHeight, measured in the render effect (0 = unmeasured). */\r\n private readonly viewportHeight = signal(0);\r\n\r\n /**\r\n * Row windowing arms for `rowHeaderLayout: 'tree'` ONLY: the standard layout's expanded\r\n * parents ROWSPAN their whole subtree, so slicing rows would orphan/clip the merged label\r\n * cells (the dated DEFAULTS.md row) — dx sidesteps this with separate area panes. The DA\r\n * page projects `mode=\"virtual\"` but renders standard → no-op there; the calc tabs' tree\r\n * pivots benefit. RENDER-ONLY: the model, export and chart always see every row.\r\n */\r\n protected readonly virtualActive = computed(\r\n () =>\r\n this.scrolling()?.mode() === 'virtual' &&\r\n this.model()?.rowHeaderLayout === 'tree' &&\r\n this.viewportHeight() > 0,\r\n );\r\n\r\n /** First windowed row (model index) — snapped back to a measures-on-rows group head. */\r\n private readonly winStart = computed(() => {\r\n const m = this.model();\r\n if (!m || !this.virtualActive()) {\r\n return 0;\r\n }\r\n let start = Math.max(\r\n 0,\r\n Math.floor(this.scrollTop() / PIVOT_VIRTUAL_ROW_HEIGHT) - PIVOT_VIRTUAL_OVERSCAN,\r\n );\r\n // A continuation row (measureRowspan 0) has no dimension cell of its own — its label\r\n // lives on the group head's rowspan. Never start the window inside a group.\r\n while (start > 0 && m.rows[start]?.measureRowspan === 0) {\r\n start--;\r\n }\r\n return start;\r\n });\r\n\r\n /** One past the last windowed row (model index). */\r\n private readonly winEnd = computed(() => {\r\n const m = this.model();\r\n if (!m) {\r\n return 0;\r\n }\r\n if (!this.virtualActive()) {\r\n return m.rows.length;\r\n }\r\n const visible = Math.ceil(this.viewportHeight() / PIVOT_VIRTUAL_ROW_HEIGHT);\r\n let end = Math.min(\r\n m.rows.length,\r\n Math.floor(this.scrollTop() / PIVOT_VIRTUAL_ROW_HEIGHT) +\r\n visible +\r\n PIVOT_VIRTUAL_OVERSCAN,\r\n );\r\n // Mirror of `winStart`'s backward snap: a group head carries its continuation rows on a\r\n // rowspan, and HTML only clamps a rowspan at the row-GROUP boundary — never at the end of\r\n // the rows we happen to render. Ending mid-group would spill that `th` into the spacer and\r\n // grand-total rows below, shifting their cells one column right (a phantom column wider\r\n // than the colgroup). Extend past the whole group instead.\r\n while (end < m.rows.length && m.rows[end]?.measureRowspan === 0) {\r\n end++;\r\n }\r\n return end;\r\n });\r\n\r\n /**\r\n * The body rows the template renders: `{row, ri}` pairs where `ri` is the MODEL row index\r\n * (matrix addressing must not shift with the window). The full array when windowing is off.\r\n */\r\n protected readonly viewRows = computed<{ row: NxePivotBodyRow; ri: number }[]>(() => {\r\n const m = this.model();\r\n if (!m) {\r\n return [];\r\n }\r\n const start = this.winStart();\r\n const end = this.winEnd();\r\n if (start === 0 && end >= m.rows.length) {\r\n return m.rows.map((row, ri) => ({ row, ri }));\r\n }\r\n return m.rows.slice(start, end).map((row, i) => ({ row, ri: start + i }));\r\n });\r\n\r\n /** Spacer heights standing in for the unrendered rows (keep the scrollbar honest). */\r\n protected readonly topSpacerH = computed(() => this.winStart() * PIVOT_VIRTUAL_ROW_HEIGHT);\r\n protected readonly bottomSpacerH = computed(() => {\r\n const m = this.model();\r\n return m ? (m.rows.length - this.winEnd()) * PIVOT_VIRTUAL_ROW_HEIGHT : 0;\r\n });\r\n /** Total table columns (spacer colspan): row-header cols (+measure col) + leaves. */\r\n protected readonly totalColCount = computed(() => this.model()?.colWidths.length ?? 1);\r\n\r\n protected onPivotScroll(event: Event): void {\r\n this.scrollTop.set((event.target as HTMLElement).scrollTop);\r\n }\r\n\r\n /**\r\n * dx `.nxe-pivotgrid-nodata` (gridCoreUtils.renderNoDataText): shown when the data source\r\n * `isEmpty()` — no VISIBLE data field or nothing aggregated (empty/fully-filtered store);\r\n * text `texts.noData` (dx default \"No data\"). The reloadTick read re-checks after an\r\n * in-place instance reload.\r\n */\r\n protected readonly showNoData = computed(() => {\r\n this.reloadTick();\r\n return this.engine()?.isEmpty() === true;\r\n });\r\n\r\n constructor() {\r\n // Keep any bound chart in sync with the current cross-tab (dormant for empty pivots).\r\n // toObservable, NOT effect(): the dependency set is exactly the three signals named\r\n // here — an effect() would silently also depend on every signal chart.render reads.\r\n // chartBindOptions gets a new identity per bindChart call, so re-binding re-renders\r\n // with the fresh options (dx `updateChart` on every bind + on every 'changed').\r\n combineLatest([\r\n toObservable(this.boundChart),\r\n toObservable(this.model),\r\n toObservable(this.chartBindOptions),\r\n ])\r\n .pipe(takeUntilDestroyed())\r\n .subscribe(([chart, m]) => {\r\n if (chart && m) {\r\n chart.render(this.buildSeries(m));\r\n }\r\n });\r\n\r\n // P3-C2 (4c): dx sizes the data-header band to the row-header pane, so the data/column\r\n // boundary lines up with the corner's right edge (reference full-page geometry) instead\r\n // of hugging the data chips. The corner itself needs no measuring: since the Phase-3\r\n // visual-gate fix its hosted row chips participate in table layout (see the\r\n // corner-fields scss), so the corner is already content-sized when this reads it.\r\n // afterRenderEffect, NOT effect(): DOM measuring must run after render, and the tracked\r\n // set is exactly the signals read below (a panel mutation rebuilds the model; a flag\r\n // change re-runs the reads — allowSorting/allowFiltering change the chips' arrow/funnel\r\n // widths and with them the corner; `renderTick` re-runs the measurement on `repaint()`/\r\n // `updateDimensions()` — the DA page repaints on sidebar toggles, which is when the\r\n // corner width shifts — WITHOUT re-aggregating, W4 Lane 1).\r\n afterRenderEffect(() => {\r\n this.model();\r\n this.renderTick();\r\n this.allowSortingEff();\r\n this.allowFilteringEff();\r\n const fp = this.fieldPanel();\r\n fp?.visible();\r\n fp?.showDataFields();\r\n fp?.showColumnFields();\r\n fp?.showFilterFields();\r\n fp?.showRowFields();\r\n this.heightEff();\r\n const host = this.elementRef.nativeElement as HTMLElement;\r\n // W4 Lane 3: measure the scroll viewport for the virtual row window (re-measured\r\n // per model change / repaint / updateDimensions — dx re-layouts on the same).\r\n const scrollEl = host.querySelector<HTMLElement>('.nxe-pivotgrid-scroll');\r\n this.viewportHeight.set(scrollEl?.clientHeight ?? 0);\r\n const dataTd = host.querySelector<HTMLElement>(\r\n '.nxe-pivot-field-panel-table td.nxe-data-header',\r\n );\r\n if (!dataTd) {\r\n return;\r\n }\r\n const corner = host.querySelector<HTMLElement>(\r\n '.nxe-pivotgrid-table th.nxe-area-description-cell',\r\n );\r\n dataTd.style.width = corner\r\n ? `${corner.getBoundingClientRect().width}px`\r\n : '';\r\n });\r\n\r\n // P3-C4: dx stateStoring `customLoad` on init — the pivot data controller's `load()`\r\n // runs the state load ONCE (StateStoringController.isLoaded) before the first data\r\n // load and applies a non-null, non-empty state over the fields (m_data_controller\r\n // ~644-651 + m_state_storing_core `_loadState`/`load`). combineLatest + take(1), NOT\r\n // effect(): fire exactly once, when both the projected config and a live engine exist\r\n // (the DA page sets `dataSource` async — writing overrides before the engine exists\r\n // would be wiped by the linkedSignal reset). A later dataSource swap does NOT re-run\r\n // the load, matching dx's once-per-controller `isLoaded` flag.\r\n combineLatest([toObservable(this.stateStoring), toObservable(this.engine)])\r\n .pipe(\r\n filter(([ss, engine]) => !!ss && !!engine),\r\n take(1),\r\n takeUntilDestroyed(),\r\n )\r\n .subscribe(([ss]) => this.runCustomLoad(ss!));\r\n\r\n // W4 Lane 2: dx `onOptionChanged` — one pairwise diff over the effective-option\r\n // snapshot, so an input-binding change and a facade `option(name, v)` set emit through\r\n // the SAME path (never twice). toObservable + pairwise, NOT effect(): the dependency\r\n // set is exactly the snapshot computed; pairwise skips the initial emission (dx fires\r\n // no option events for the construction-time config).\r\n toObservable(this.optionSnapshot)\r\n .pipe(pairwise(), takeUntilDestroyed())\r\n .subscribe(([prev, curr]) => {\r\n if (!this.onOptionChanged.observed) {\r\n return;\r\n }\r\n for (const name of Object.keys(curr)) {\r\n if (!Object.is(prev[name], curr[name])) {\r\n this.onOptionChanged.emit({\r\n name,\r\n fullName: name,\r\n value: curr[name],\r\n previousValue: prev[name],\r\n component: this.instance,\r\n });\r\n }\r\n }\r\n });\r\n\r\n // W4 Lane 2: dx fires `onCellPrepared` for every rendered cell after each content\r\n // render (m_area_item `_triggerOnCellPrepared`) and `onContentReady` when the render\r\n // completes. afterRenderEffect, NOT effect(): the walk reads the rendered DOM, and the\r\n // tracked set is exactly model + renderTick (a repaint()/updateDimensions() re-renders\r\n // in dx, so both events re-fire on it here too). `.observed` gates the per-cell walk —\r\n // a pivot with no listeners pays nothing.\r\n afterRenderEffect(() => {\r\n const m = this.model();\r\n this.renderTick();\r\n const host = this.elementRef.nativeElement as HTMLElement;\r\n if (m && this.onCellPrepared.observed) {\r\n this.emitCellsPrepared(m, host);\r\n }\r\n if (this.onContentReady.observed) {\r\n this.onContentReady.emit({ component: this.instance, element: host });\r\n }\r\n });\r\n }\r\n\r\n protected toggle(pathKey: string, expanded: boolean): void {\r\n const next = new Map(this.manualExpanded());\r\n next.set(pathKey, !expanded);\r\n this.manualExpanded.set(next);\r\n }\r\n\r\n /** W4 Lane 3 (a11y): Enter/Space on a focused expandable header cell toggles it (dx-like\r\n * keyboard expansion; preventDefault stops Space from scrolling the container). */\r\n protected onExpandKey(event: Event, pathKey: string, expanded: boolean): void {\r\n event.preventDefault();\r\n this.toggle(pathKey, expanded);\r\n }\r\n\r\n // --- dx-shaped cell events (W4 Lane 2) -----------------------------------------------------\r\n //\r\n // Payloads per dx m_widget `_createEventArgs`/`_createCellArgs` + m_data_controller's cell\r\n // info shapes. Divergences (DEFAULTS.md): rowIndex/columnIndex are the single nxe table's\r\n // DOM `tr.rowIndex`/`cell.cellIndex` (dx keeps three area tables with area-local indices);\r\n // header cells carry `path` only where an expand key exists; plain clicks on expandable\r\n // cells do NOT toggle (nxe keeps chevron-only toggling — dx toggles on any cell click,\r\n // gated on `!args.cancel`, which the chevron path honors here).\r\n\r\n private domIndices(cellElement: HTMLElement | null): { rowIndex: number; columnIndex: number } {\r\n const cell = cellElement as HTMLTableCellElement | null;\r\n return {\r\n rowIndex: (cell?.parentElement as HTMLTableRowElement | null)?.rowIndex ?? -1,\r\n columnIndex: cell?.cellIndex ?? -1,\r\n };\r\n }\r\n\r\n private finishCellArgs(\r\n m: NxePivotModel,\r\n area: 'row' | 'column' | 'data',\r\n cell: NxePivotCellEvent['cell'],\r\n cellElement: HTMLElement | null,\r\n event?: Event,\r\n ): NxePivotCellEvent {\r\n return {\r\n area,\r\n ...this.domIndices(cellElement),\r\n cellElement,\r\n cell,\r\n rowFields: m.rowFields,\r\n columnFields: m.columnFields,\r\n dataFields: m.dataFields,\r\n event,\r\n cancel: false,\r\n };\r\n }\r\n\r\n private colHeaderArgs(\r\n m: NxePivotModel,\r\n cell: NxePivotHeaderCell,\r\n cellElement: HTMLElement | null,\r\n event?: Event,\r\n ): NxePivotCellEvent {\r\n const data: NxePivotCellEvent['cell'] = {\r\n text: cell.text,\r\n type: cell.isGrandTotal ? 'GT' : cell.isTotal ? 'T' : 'D',\r\n colspan: cell.colspan,\r\n };\r\n if (cell.rowspan) {\r\n data.rowspan = cell.rowspan;\r\n }\r\n if (cell.expandable) {\r\n data.expanded = cell.expanded === true;\r\n }\r\n const path = cell.pathKey ? this.engine()?.nodePath(cell.pathKey) : null;\r\n if (path) {\r\n data.path = path;\r\n }\r\n return this.finishCellArgs(m, 'column', data, cellElement, event);\r\n }\r\n\r\n /** Standard-layout row-header cell (also the split measure-caption cells it renders). */\r\n private rowHeaderArgs(\r\n m: NxePivotModel,\r\n row: NxePivotBodyRow,\r\n hc: NxePivotRowHeaderCell,\r\n cellElement: HTMLElement | null,\r\n event?: Event,\r\n ): NxePivotCellEvent {\r\n const data: NxePivotCellEvent['cell'] = {\r\n text: hc.text,\r\n type: hc.isTotal ? 'T' : 'D',\r\n colspan: hc.colspan,\r\n rowspan: hc.rowspan,\r\n };\r\n if (hc.expandable) {\r\n data.expanded = hc.expanded;\r\n }\r\n const path = hc.pathKey ? this.engine()?.nodePath(hc.pathKey) : null;\r\n if (path) {\r\n data.path = path;\r\n }\r\n if (row.dataIndex !== undefined) {\r\n data.dataIndex = row.dataIndex;\r\n }\r\n return this.finishCellArgs(m, 'row', data, cellElement, event);\r\n }\r\n\r\n /** Tree-layout dimension label cell (synthesized from the row — tree rows carry one cell). */\r\n private treeLabelArgs(\r\n m: NxePivotModel,\r\n row: NxePivotBodyRow,\r\n cellElement: HTMLElement | null,\r\n event?: Event,\r\n ): NxePivotCellEvent {\r\n const data: NxePivotCellEvent['cell'] = {\r\n text: row.label,\r\n type: row.kind,\r\n path: row.path,\r\n };\r\n if (row.hasChildren) {\r\n data.expanded = row.expanded;\r\n }\r\n if (row.dataIndex !== undefined) {\r\n data.dataIndex = row.dataIndex;\r\n }\r\n return this.finishCellArgs(m, 'row', data, cellElement, event);\r\n }\r\n\r\n /** Tree-layout measure-caption cell (measures-on-rows). */\r\n private measureCellArgs(\r\n m: NxePivotModel,\r\n row: NxePivotBodyRow,\r\n cellElement: HTMLElement | null,\r\n event?: Event,\r\n ): NxePivotCellEvent {\r\n const data: NxePivotCellEvent['cell'] = {\r\n text: row.measureCaption,\r\n type: row.kind,\r\n path: row.path,\r\n dataIndex: row.dataIndex,\r\n };\r\n return this.finishCellArgs(m, 'row', data, cellElement, event);\r\n }\r\n\r\n private dataCellArgs(\r\n m: NxePivotModel,\r\n ri: number,\r\n li: number,\r\n cellElement: HTMLElement | null,\r\n event?: Event,\r\n ): NxePivotCellEvent {\r\n const row = m.rows[ri];\r\n const leaf = m.leaves[li];\r\n const di = row.dataIndex ?? leaf.dataIndex;\r\n const df = m.dataFields[di];\r\n const data: NxePivotCellEvent['cell'] = {\r\n text: m.textMatrix[ri][li],\r\n value: m.matrix[ri][li],\r\n rowPath: row.path,\r\n columnPath: leaf.colPath,\r\n rowType: row.kind,\r\n columnType: leaf.kind,\r\n dataIndex: di,\r\n dataType: df?.dataType,\r\n format: df?.format,\r\n };\r\n return this.finishCellArgs(m, 'data', data, cellElement, event);\r\n }\r\n\r\n /** Grand-total footer data cell (both footer shapes). */\r\n private gtDataArgs(\r\n m: NxePivotModel,\r\n li: number,\r\n di: number,\r\n value: number | null,\r\n text: string,\r\n cellElement: HTMLElement | null,\r\n event?: Event,\r\n ): NxePivotCellEvent {\r\n const leaf = m.leaves[li];\r\n const df = m.dataFields[di];\r\n const data: NxePivotCellEvent['cell'] = {\r\n text,\r\n value,\r\n rowPath: [],\r\n columnPath: leaf?.colPath ?? [],\r\n rowType: 'GT',\r\n columnType: leaf?.kind ?? 'GT',\r\n dataIndex: di,\r\n dataType: df?.dataType,\r\n format: df?.format,\r\n };\r\n return this.finishCellArgs(m, 'data', data, cellElement, event);\r\n }\r\n\r\n private gtHeaderArgs(\r\n m: NxePivotModel,\r\n text: string,\r\n cellElement: HTMLElement | null,\r\n event?: Event,\r\n ): NxePivotCellEvent {\r\n return this.finishCellArgs(\r\n m,\r\n 'row',\r\n { text, type: 'GT', path: [] },\r\n cellElement,\r\n event,\r\n );\r\n }\r\n\r\n private cellEl(event: Event): HTMLElement | null {\r\n return (event.currentTarget as HTMLElement | null)?.closest('th,td') ?? null;\r\n }\r\n\r\n // --- click handlers (template) — `.observed` gates the arg building --------------------\r\n\r\n protected onColHeaderCellClick(event: Event, cell: NxePivotHeaderCell): void {\r\n const m = this.model();\r\n if (m && this.onCellClick.observed) {\r\n this.onCellClick.emit(this.colHeaderArgs(m, cell, this.cellEl(event), event));\r\n }\r\n }\r\n\r\n protected onRowHeaderCellClick(\r\n event: Event,\r\n row: NxePivotBodyRow,\r\n hc: NxePivotRowHeaderCell | null,\r\n ): void {\r\n const m = this.model();\r\n if (m && this.onCellClick.observed) {\r\n const args = hc\r\n ? this.rowHeaderArgs(m, row, hc, this.cellEl(event), event)\r\n : this.treeLabelArgs(m, row, this.cellEl(event), event);\r\n this.onCellClick.emit(args);\r\n }\r\n }\r\n\r\n protected onMeasureCellClick(event: Event, row: NxePivotBodyRow): void {\r\n const m = this.model();\r\n if (m && this.onCellClick.observed) {\r\n this.onCellClick.emit(this.measureCellArgs(m, row, this.cellEl(event), event));\r\n }\r\n }\r\n\r\n protected onDataCellClick(event: Event, ri: number, li: number): void {\r\n const m = this.model();\r\n if (m && this.onCellClick.observed) {\r\n this.onCellClick.emit(this.dataCellArgs(m, ri, li, this.cellEl(event), event));\r\n }\r\n }\r\n\r\n protected onGtHeaderCellClick(event: Event, text: string): void {\r\n const m = this.model();\r\n if (m && this.onCellClick.observed) {\r\n this.onCellClick.emit(this.gtHeaderArgs(m, text, this.cellEl(event), event));\r\n }\r\n }\r\n\r\n protected onGtDataCellClick(\r\n event: Event,\r\n li: number,\r\n di: number,\r\n value: number | null,\r\n text: string,\r\n ): void {\r\n const m = this.model();\r\n if (m && this.onCellClick.observed) {\r\n this.onCellClick.emit(this.gtDataArgs(m, li, di, value, text, this.cellEl(event), event));\r\n }\r\n }\r\n\r\n /**\r\n * Chevron click — dx `_handleCellClick`: fire the cancelable `onCellClick`, then toggle\r\n * unless a handler set `cancel: true`. stopPropagation keeps the host cell's own click\r\n * handler from emitting a second event for the same gesture.\r\n */\r\n protected onColExpandClick(event: Event, cell: NxePivotHeaderCell): void {\r\n event.stopPropagation();\r\n const m = this.model();\r\n if (m && this.onCellClick.observed) {\r\n const args = this.colHeaderArgs(m, cell, this.cellEl(event), event);\r\n this.onCellClick.emit(args);\r\n if (args.cancel) {\r\n return;\r\n }\r\n }\r\n this.toggle(cell.pathKey ?? '', cell.expanded === true);\r\n }\r\n\r\n protected onRowExpandClick(\r\n event: Event,\r\n row: NxePivotBodyRow,\r\n hc: NxePivotRowHeaderCell | null,\r\n ): void {\r\n event.stopPropagation();\r\n const m = this.model();\r\n if (m && this.onCellClick.observed) {\r\n const args = hc\r\n ? this.rowHeaderArgs(m, row, hc, this.cellEl(event), event)\r\n : this.treeLabelArgs(m, row, this.cellEl(event), event);\r\n this.onCellClick.emit(args);\r\n if (args.cancel) {\r\n return;\r\n }\r\n }\r\n this.toggle(hc ? hc.pathKey : row.pathKey, hc ? hc.expanded : row.expanded);\r\n }\r\n\r\n /** dx m_area_item `_triggerOnCellPrepared`: one event per rendered cell, DOM in hand. */\r\n private emitCellsPrepared(m: NxePivotModel, host: HTMLElement): void {\r\n const table = host.querySelector('.nxe-pivotgrid-table');\r\n if (!table) {\r\n return;\r\n }\r\n const headTrs = Array.from(table.querySelectorAll(':scope > thead > tr'));\r\n m.columnHeaderRows.forEach((hr, hi) => {\r\n const ths = headTrs[hi] ? (Array.from(headTrs[hi].children) as HTMLElement[]) : [];\r\n const offset = hi === 0 ? 1 : 0; // row 0 leads with the corner cell\r\n hr.forEach((cell, ci) =>\r\n this.onCellPrepared.emit(this.colHeaderArgs(m, cell, ths[ci + offset] ?? null)),\r\n );\r\n });\r\n const bodyTrs = Array.from(\r\n table.querySelectorAll(':scope > tbody > tr:not(.nxe-pivot-vspacer)'),\r\n ) as HTMLElement[];\r\n // W4 Lane 3: walk the RENDERED window (dx fires cellPrepared for rendered cells only).\r\n const view = this.viewRows();\r\n view.forEach(({ row, ri }, trPos) => {\r\n const tr = bodyTrs[trPos];\r\n if (!tr) {\r\n return;\r\n }\r\n const ths = Array.from(tr.querySelectorAll(':scope > th')) as HTMLElement[];\r\n if (m.rowHeaderLayout === 'tree') {\r\n let thIdx = 0;\r\n if (row.measureRowspan !== 0) {\r\n this.onCellPrepared.emit(this.treeLabelArgs(m, row, ths[thIdx++] ?? null));\r\n }\r\n if (row.measureCaption !== undefined) {\r\n this.onCellPrepared.emit(this.measureCellArgs(m, row, ths[thIdx] ?? null));\r\n }\r\n } else {\r\n row.headerCells.forEach((hc, k) =>\r\n this.onCellPrepared.emit(this.rowHeaderArgs(m, row, hc, ths[k] ?? null)),\r\n );\r\n }\r\n const tds = Array.from(tr.querySelectorAll(':scope > td')) as HTMLElement[];\r\n m.leaves.forEach((leaf, li) =>\r\n this.onCellPrepared.emit(this.dataCellArgs(m, ri, li, tds[li] ?? null)),\r\n );\r\n });\r\n // Grand-total footer (either shape) — always rendered after the windowed rows.\r\n let trIdx = view.length;\r\n if (m.grandTotalRows) {\r\n m.grandTotalRows.forEach((g, gi) => {\r\n const tr = bodyTrs[trIdx++];\r\n if (!tr) {\r\n return;\r\n }\r\n const ths = Array.from(tr.querySelectorAll(':scope > th')) as HTMLElement[];\r\n let thIdx = 0;\r\n if (gi === 0) {\r\n this.onCellPrepared.emit(this.gtHeaderArgs(m, m.texts.grandTotal, ths[thIdx++] ?? null));\r\n }\r\n this.onCellPrepared.emit(\r\n this.finishCellArgs(\r\n m,\r\n 'row',\r\n { text: g.caption, type: 'GT', path: [], dataIndex: g.dataIndex },\r\n ths[thIdx] ?? null,\r\n ),\r\n );\r\n const tds = Array.from(tr.querySelectorAll(':scope > td')) as HTMLElement[];\r\n g.cells.forEach((gc, li) =>\r\n this.onCellPrepared.emit(\r\n this.gtDataArgs(m, li, g.dataIndex, gc.value, gc.text, tds[li] ?? null),\r\n ),\r\n );\r\n });\r\n } else if (m.grandTotalCells) {\r\n const tr = bodyTrs[trIdx];\r\n if (tr) {\r\n const th = tr.querySelector(':scope > th') as HTMLElement | null;\r\n this.onCellPrepared.emit(this.gtHeaderArgs(m, m.texts.grandTotal, th));\r\n const tds = Array.from(tr.querySelectorAll(':scope > td')) as HTMLElement[];\r\n m.grandTotalCells.forEach((gc, li) =>\r\n this.onCellPrepared.emit(\r\n this.gtDataArgs(\r\n m,\r\n li,\r\n m.leaves[li]?.dataIndex ?? 0,\r\n gc.value,\r\n gc.text,\r\n tds[li] ?? null,\r\n ),\r\n ),\r\n );\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * A field-panel chip was dropped, or the chooser toggled/moved a field (P3-C2/P3-C3).\r\n * Recompute areaIndexes like dx: remove the field from its current area, insert at the\r\n * drop position (`area: null` = REMOVAL — the chooser's All-Fields tree drop or checkbox\r\n * uncheck; panel/chooser drops outside every area never emit), then renumber the touched\r\n * areas 0..n-1 — all recorded as overrides, never as writes into the caller's field\r\n * objects.\r\n *\r\n * P3-C4 (closes the P3-C2 deferral (d)): the renumbering runs over the lists dx's\r\n * `normalizeIndexes` sees (m_data_source `_createDescriptions` over its module-local\r\n * `getAreaFields`) — the DATA area's `visible: false` fields are IN the numbering, hidden\r\n * row/column/filter fields are not. The emitted `areaIndex` is a VISIBLE slot (the\r\n * panel/chooser hit-test only visible chips), so the insertion offsets past the hidden\r\n * fields before it, exactly like dx's `invisibleFieldsIndexOffset` (m_field_chooser_base\r\n * `renderSortable.onChanged`).\r\n */\r\n protected onPanelFieldMove(e: NxePivotFieldMoveEvent): void {\r\n const engine = this.engine();\r\n if (!engine) {\r\n return;\r\n }\r\n const areas: NxePivotArea[] = ['filter', 'data', 'column', 'row'];\r\n const lists = new Map<NxePivotArea, number[]>(\r\n areas.map((a) => [a, engine.areaFields(a, true).map(({ fieldIndex }) => fieldIndex)]),\r\n );\r\n const touched = new Set<NxePivotArea>();\r\n let removedFrom: NxePivotArea | null = null;\r\n for (const a of areas) {\r\n const list = lists.get(a)!;\r\n const pos = list.indexOf(e.fieldIndex);\r\n if (pos >= 0) {\r\n list.splice(pos, 1);\r\n removedFrom = a;\r\n touched.add(a);\r\n break;\r\n }\r\n }\r\n const next = new Map(this.fieldOverrides());\r\n if (e.area) {\r\n const target = lists.get(e.area)!;\r\n // Visible slot → full-list position: insert right after the visible field that\r\n // precedes the slot (slot 0 → the very front, ahead of any leading hidden field).\r\n const visible = target.filter((i) => engine.fieldAt(i)?.visible !== false);\r\n const slot = Math.max(0, Math.min(e.areaIndex, visible.length));\r\n const before = slot > 0 ? visible[slot - 1] : undefined;\r\n const insertAt = before === undefined ? 0 : target.indexOf(before) + 1;\r\n target.splice(insertAt, 0, e.fieldIndex);\r\n touched.add(e.area);\r\n } else {\r\n if (removedFrom === null) {\r\n return; // not placed anywhere — nothing to remove\r\n }\r\n next.set(e.fieldIndex, { ...next.get(e.fieldIndex), area: null });\r\n }\r\n for (const a of touched) {\r\n lists.get(a)!.forEach((fieldIndex, areaIndex) =>\r\n next.set(fieldIndex, { ...next.get(fieldIndex), area: a, areaIndex }),\r\n );\r\n }\r\n this.fieldOverrides.set(next);\r\n this.fireStateSave();\r\n }\r\n\r\n /**\r\n * A sortable chip was clicked (P3-C2). dx toggles the FIELD's sortOrder desc↔asc off the\r\n * effective order (fields sort ascending by default, so the first click yields 'desc');\r\n * the override feeds the engine's existing per-level sort.\r\n */\r\n protected onPanelSortToggle(e: { fieldIndex: number }): void {\r\n const field = this.engine()?.fieldAt(e.fieldIndex);\r\n if (!field) {\r\n return;\r\n }\r\n const next = new Map(this.fieldOverrides());\r\n next.set(e.fieldIndex, {\r\n ...next.get(e.fieldIndex),\r\n sortOrder: field.sortOrder === 'desc' ? 'asc' : 'desc',\r\n });\r\n this.fieldOverrides.set(next);\r\n this.fireStateSave();\r\n }\r\n\r\n // --- Chip header filter (P3-C4) ------------------------------------------------------------\r\n\r\n /** The field whose header-filter popup is open (`null` = closed). */\r\n private readonly hfFieldIndex = signal<number | null>(null);\r\n\r\n /**\r\n * The shared header-filter model (W2b extraction) over the ENGINE's distinct values: dx\r\n * feeds this popup from `dataSource.getFieldValues(index)` (m_field_chooser_base\r\n * `subscribeToEvents` — the field loaded as a lone expanded column), so the adapter's\r\n * \"rows\" ARE those `{value, text}` items — post-groupInterval group values with their\r\n * display labels, from the UNFILTERED store (dx `showRelevantValues` default false).\r\n * Blank-ish values fold into the model's `(Blanks)` bucket, first (dx\r\n * `headerFilter.texts.emptyValue` = \"(Blanks)\"). `isDate` is pinned false: dx's PIVOT list\r\n * is flat even for date fields (the Year>Month>Day tree is the grid's own semantics —\r\n * DEFAULTS.md, dated P3-C4 note). The model's column token is the FIELD object (a bare\r\n * fieldIndex would read falsy for index 0 — the model treats a falsy column as closed).\r\n */\r\n protected readonly hf = new NxeHeaderFilterModel<NxePivotField>({\r\n rows: () => {\r\n const fieldIndex = this.hfFieldIndex();\r\n const engine = this.engine();\r\n return fieldIndex == null || !engine ? [] : engine.getFieldValues(fieldIndex);\r\n },\r\n rawValue: (_field, item) => item.value,\r\n displayText: (_field, item) => item.text,\r\n isDate: () => false,\r\n sortByDisplayText: () => false,\r\n boolLabel: () => null,\r\n compare: (a, b) => {\r\n if (a == null) {\r\n return b == null ? 0 : -1;\r\n }\r\n if (b == null) {\r\n return 1;\r\n }\r\n if (typeof a === 'number' && typeof b === 'number') {\r\n return a - b;\r\n }\r\n return String(a).localeCompare(String(b));\r\n },\r\n }, {\r\n blanks: () => this.messages.t('common.blanks'),\r\n yes: () => this.messages.t('common.yes'),\r\n no: () => this.messages.t('common.no'),\r\n month: (month) => Info.months('long', { locale: this.messages.locale() })[month - 1],\r\n });\r\n private hfOverlayRef: OverlayRef | null = null;\r\n\r\n /** A chip funnel was clicked (panel or chooser) — open the shared header-filter popup. */\r\n protected openPivotHeaderFilter(e: NxePivotFilterOpenEvent): void {\r\n const engine = this.engine();\r\n const field = engine?.fieldAt(e.fieldIndex);\r\n if (!engine || !field) {\r\n return;\r\n }\r\n this.hfFieldIndex.set(e.fieldIndex);\r\n // Check-on-open (the model's frozen rule): no applied filter → everything checked.\r\n this.hf.open(field, this.appliedKeys(engine, e.fieldIndex, field));\r\n this.hfOverlayRef?.dispose();\r\n this.hfOverlayRef = openNxeHeaderFilterOverlay({\r\n overlay: this.overlay,\r\n viewContainerRef: this.viewContainerRef,\r\n origin: e.origin,\r\n model: this.hf,\r\n // Grid semantics kept (orbit's grid default): dx's pivot headerFilter.search\r\n // defaults to enabled FALSE — conscious divergence, DEFAULTS.md dated P3-C4 note.\r\n searchEnabled: () => true,\r\n onApply: () => this.applyPivotHeaderFilter(),\r\n onClose: () => this.closePivotHeaderFilter(),\r\n });\r\n }\r\n\r\n /**\r\n * The field's applied `filterValues` as model keys — blank-ish raws fold into the\r\n * `(Blanks)` sentinel; `filterType: 'exclude'` inverts over the field's distinct keys\r\n * (dx `processItems` marks each item selected iff included, inverted for exclude).\r\n */\r\n private appliedKeys(\r\n engine: NxePivotDataSource,\r\n fieldIndex: number,\r\n field: NxePivotField,\r\n ): ReadonlySet<any> | undefined {\r\n const filterValues = field.filterValues;\r\n if (!filterValues?.length) {\r\n return undefined;\r\n }\r\n const included = new Set<any>(\r\n filterValues.map((v) => (v == null || v === '' ? NXE_HF_BLANKS : v)),\r\n );\r\n if (field.filterType !== 'exclude') {\r\n return included;\r\n }\r\n const all = new Set<any>(\r\n engine\r\n .getFieldValues(fieldIndex)\r\n .map(({ value }) => (value == null || value === '' ? NXE_HF_BLANKS : value)),\r\n );\r\n for (const key of included) {\r\n all.delete(key);\r\n }\r\n return all;\r\n }\r\n\r\n /**\r\n * OK — dx's menu apply writes `{filterValues, filterType}` onto the field and reloads\r\n * (m_field_chooser_base `apply` → `_applyChanges`); here they land in the fieldOverride\r\n * map → the engine refilters at record intake (P2-C3). Full-checked = filter CLEARED (the\r\n * model's null rule — `filterValues: null` so a declarative seed can't resurrect). The\r\n * stored set is always the INCLUDE set (dx sometimes stores the complement with\r\n * `filterType: 'exclude'` — DEFAULTS.md, dated P3-C4 note).\r\n */\r\n private applyPivotHeaderFilter(): void {\r\n const fieldIndex = this.hfFieldIndex();\r\n if (fieldIndex != null) {\r\n const result = this.hf.applyResult();\r\n const next = new Map(this.fieldOverrides());\r\n if (result === null) {\r\n next.set(fieldIndex, { ...next.get(fieldIndex), filterValues: null });\r\n } else {\r\n const values: any[] = [];\r\n for (const key of result) {\r\n if (key === NXE_HF_BLANKS) {\r\n // The blanks bucket folds null/undefined/'' — emit all three raw\r\n // shapes so the engine's dx-verbatim areValuesEqual matches each.\r\n values.push(null, undefined, '');\r\n } else {\r\n values.push(key);\r\n }\r\n }\r\n next.set(fieldIndex, {\r\n ...next.get(fieldIndex),\r\n filterValues: values,\r\n filterType: 'include',\r\n });\r\n }\r\n this.fieldOverrides.set(next);\r\n this.fireStateSave();\r\n }\r\n this.closePivotHeaderFilter();\r\n }\r\n\r\n private closePivotHeaderFilter(): void {\r\n this.hfOverlayRef?.dispose();\r\n this.hfOverlayRef = null;\r\n this.hf.close();\r\n this.hfFieldIndex.set(null);\r\n }\r\n\r\n // --- State storing (nxe-state-storing, P3-C4) ----------------------------------------------\r\n\r\n /**\r\n * dx StateStoringController: after every data change the pivot's data controller pushes\r\n * `dataSource.state()` into the controller and `save()`s (m_data_controller ~854-856) —\r\n * for `type: 'custom'` that ends in `customSave(state)` (m_state_storing_core\r\n * `_saveState`). Here it fires synchronously per LAYOUT MUTATION (drag, sort toggle,\r\n * filter apply, chooser check/uncheck) — no `savingTimeout` debounce (dx default 2000ms)\r\n * and no save on plain loads (DEFAULTS.md, dated P3-C4 notes). The\r\n * localStorage/sessionStorage types stay inert.\r\n */\r\n private fireStateSave(): void {\r\n const ss = this.stateStoring();\r\n if (!ss || ss.enabled() !== true || ss.type() !== 'custom') {\r\n return;\r\n }\r\n const save = ss.customSave();\r\n if (typeof save !== 'function') {\r\n return;\r\n }\r\n save(this.buildStorageState());\r\n }\r\n\r\n /**\r\n * The dx-shaped state: `fields` serialized from {@link effectiveFields} (the caller's\r\n * fields with every override merged — the POST-mutation layout), plus the state's\r\n * expanded-path arrays (always empty here — nxe holds chevron state internally;\r\n * DEFAULTS.md).\r\n *\r\n * Each entry is a FULL shallow copy of the effective field — every own enumerable\r\n * property, function members (selector/customizeText/calculateCustomSummary/\r\n * calculateSummaryValue) included — which trivially guarantees the dx state keys\r\n * (dataField + area/areaIndex/expanded/sortOrder/filterValues/filterType and the\r\n * caption/format/summaryType passthrough) wherever the field defines them.\r\n *\r\n * THE FULL COPY IS LOAD-BEARING (P3-C4 review): report-output-pivot's\r\n * `sendStorageRequest` REPLACES its live `pivotGridDataSource.fields` with this very\r\n * array, and the engine computed re-reads `opts.fields` on its next rebuild — the next\r\n * mutation, or a facade `reload()` (since W4 Lane 1 `repaint()` is render-only and no\r\n * longer rebuilds the engine; the replaced fields carry the same values the engine\r\n * already renders, so nothing is lost in the interim). A slim\r\n * dx-keys-only payload would strip dataType/groupInterval (date bucketing degrades),\r\n * `visible: false` (hidden helper measures reappear), width/sortBy/summaryDisplayMode/\r\n * name, and the per-field allowSorting/allowFiltering opt-outs out of the LIVE config on\r\n * that rebuild. dx never fed its state back into a live widget — only its SAVED JSON was\r\n * slim — and the production REPORT_SETTING `otherValue1` payloads carry full field defs\r\n * (captions/dataTypes/formats) anyway; `JSON.stringify` drops the function members\r\n * harmlessly when the Save dialog serializes later.\r\n */\r\n private buildStorageState(): { fields: any[]; rowExpandedPaths: any[]; columnExpandedPaths: any[] } {\r\n const fields = this.effectiveFields().map((f) => ({ ...f }));\r\n return { fields, rowExpandedPaths: [], columnExpandedPaths: [] };\r\n }\r\n\r\n /**\r\n * dx stateStoring `customLoad` contract (m_state_storing_core `_loadState` + `load`): the\r\n * return value goes through `fromPromise` — a plain state object OR a Promise of one both\r\n * work — and applies only when non-null and not an empty object; a rejected promise\r\n * applies nothing.\r\n */\r\n private runCustomLoad(ss: NxeStateStoringComponent): void {\r\n if (ss.enabled() !== true || ss.type() !== 'custom') {\r\n return;\r\n }\r\n const load = ss.customLoad();\r\n if (typeof load !== 'function') {\r\n return;\r\n }\r\n Promise.resolve()\r\n .then(() => load())\r\n .then((state) => this.applyLoadedState(state))\r\n .catch(() => undefined);\r\n }\r\n\r\n /**\r\n * Apply a loaded state's `fields` over the caller's fields as overrides — dx\r\n * `setFieldsState` (m_data_source): state fields match by `name` falling back to\r\n * `dataField` (same-id fields pair by order), and each match writes the state properties\r\n * onto the field, `undefined` area CLEARING it. Narrowings (DEFAULTS.md): only the\r\n * override-expressible properties apply (area/areaIndex/sortOrder/expanded/filterValues/\r\n * filterType — not sortBy/summaryType/summaryDisplayMode), and a field ABSENT from the\r\n * state keeps its own config where dx would reset its state properties.\r\n */\r\n private applyLoadedState(state: any): void {\r\n if (state == null || typeof state !== 'object' || Object.keys(state).length === 0) {\r\n return; // dx: `null !== state && !isEmptyObject(state)` gates the apply\r\n }\r\n const engine = this.engine();\r\n if (!engine) {\r\n return;\r\n }\r\n const stateFields: any[] = Array.isArray(state.fields) ? state.fields : [];\r\n const used = new Set<number>();\r\n const next = new Map(this.fieldOverrides());\r\n engine.fields().forEach((field, fieldIndex) => {\r\n const id = (field as any).name ?? `${field.dataField}`;\r\n const si = stateFields.findIndex(\r\n (sf, i) => !used.has(i) && (sf?.name ?? `${sf?.dataField}`) === id,\r\n );\r\n if (si < 0) {\r\n return;\r\n }\r\n used.add(si);\r\n const sf = stateFields[si];\r\n const o: NxePivotFieldOverride = { ...next.get(fieldIndex) };\r\n o.area = (sf.area ?? null) as NxePivotFieldOverride['area'];\r\n if (sf.areaIndex !== undefined) {\r\n o.areaIndex = Number(sf.areaIndex);\r\n }\r\n if (sf.sortOrder !== undefined) {\r\n o.sortOrder = sf.sortOrder;\r\n }\r\n if (sf.expanded !== undefined) {\r\n o.expanded = sf.expanded;\r\n }\r\n if (sf.filterValues !== undefined) {\r\n o.filterValues = sf.filterValues;\r\n }\r\n if (sf.filterType !== undefined) {\r\n o.filterType = sf.filterType;\r\n }\r\n next.set(fieldIndex, o);\r\n });\r\n this.fieldOverrides.set(next);\r\n }\r\n\r\n /**\r\n * P3-C3: open the field chooser popup — dx `_fieldChooserPopup.show()` off the toolbar\r\n * button. CDK overlay centered in the viewport (the dx popup's default position), pane\r\n * carrying `nxePane('nxe-fieldchooser-pane')` (the widget font contract for body-level\r\n * panes). NO backdrop: dx renders this popup with `shading: false` and its\r\n * `hideOnOutsideClick` default (false), so the pivot behind stays fully interactive\r\n * while the instantly-applying chooser is open and an outside click neither closes nor\r\n * blocks — only the title-bar X and Escape (OverlayKeyboardDispatcher routes body\r\n * keydowns to the topmost overlay with observers) close it. The chooser gets the LIVE\r\n * engine signal, so applyChangesMode-'instantly' mutations flow chooser ->\r\n * onPanelFieldMove/onPanelSortToggle -> fieldOverrides -> engine -> every rendered\r\n * surface, with the popup still open.\r\n */\r\n protected toggleFieldChooser(): void {\r\n if (this.chooserOverlayRef) {\r\n return; // dx: the button re-shows the already-open popup — a no-op here\r\n }\r\n const overlayRef = this.overlay.create({\r\n positionStrategy: this.overlay.position().global().centerHorizontally().centerVertically(),\r\n scrollStrategy: this.overlay.scrollStrategies.noop(),\r\n hasBackdrop: false, // dx: shading false + hideOnOutsideClick false\r\n panelClass: nxePane('nxe-fieldchooser-pane'),\r\n });\r\n this.chooserOverlayRef = overlayRef;\r\n overlayRef.keydownEvents().subscribe((event) => {\r\n if (event.key === 'Escape') {\r\n this.closeFieldChooser();\r\n }\r\n });\r\n const chooserRef = overlayRef.attach(\r\n new ComponentPortal(NxePivotFieldChooserComponent, this.viewContainerRef),\r\n );\r\n chooserRef.setInput('engine', this.engine);\r\n chooserRef.setInput('width', this.fieldChooser()?.width());\r\n chooserRef.setInput('height', this.fieldChooser()?.height());\r\n chooserRef.setInput('allowSearch', this.fieldChooser()?.allowSearch() === true);\r\n chooserRef.setInput('allowSorting', this.allowSortingEff());\r\n chooserRef.setInput('allowFiltering', this.allowFilteringEff());\r\n chooserRef.instance.fieldMove.subscribe((e) => this.onPanelFieldMove(e));\r\n chooserRef.instance.sortToggle.subscribe((e) => this.onPanelSortToggle(e));\r\n chooserRef.instance.filterOpen.subscribe((e) => this.openPivotHeaderFilter(e));\r\n chooserRef.instance.closed.subscribe(() => this.closeFieldChooser());\r\n }\r\n\r\n private closeFieldChooser(): void {\r\n // A chip funnel inside the chooser anchors its filter popup to a chip in THIS overlay —\r\n // leaving it attached would strand it on a detached origin (CDK then repositions it off\r\n // a 0x0 rect) while its OK still applied a filter.\r\n this.closePivotHeaderFilter();\r\n this.chooserOverlayRef?.dispose();\r\n this.chooserOverlayRef = null;\r\n }\r\n\r\n ngOnDestroy(): void {\r\n this.closeFieldChooser();\r\n this.hfOverlayRef?.dispose();\r\n this.hfOverlayRef = null;\r\n }\r\n\r\n /**\r\n * W4 Lane 4 — series derive from the COLUMN LEAVES (kind 'D' — subtotal 'T' columns and\r\n * the grand-total column are presentation, charting them would double-count), one series\r\n * per (column path × visible measure), fixing the P2-C2 minor: the old code charted only\r\n * the grand-total leaf and, with grand totals OFF, silently fell back to the FIRST leaf\r\n * (one arbitrary column mislabeled as the measure's totals). Categories stay the\r\n * non-subtotal body rows — the established nxe orientation (== dx `inverted: true`;\r\n * DEFAULTS.md). Honors the dx integration options (see {@link NxePivotBindChartOptions}):\r\n * `alternateDataFields` (series order), `putDataFieldsInto` ('series'/'args'/'both'),\r\n * `dataFieldsDisplayMode` (accepted, structural no-op on the single-pane nxe chart).\r\n * Works identically for `dataFieldArea: 'row'` — dx's chart reads the data source, never\r\n * the widget layout, so measures-on-rows charts the same series.\r\n */\r\n private buildSeries(m: NxePivotModel): NxeChartSeries {\r\n const o = this.chartBindOptions();\r\n const alternate = o['alternateDataFields'] !== false; // dx default true\r\n const putInto =\r\n o['putDataFieldsInto'] === 'args' || o['putDataFieldsInto'] === 'both'\r\n ? (o['putDataFieldsInto'] as 'args' | 'both')\r\n : 'series';\r\n\r\n // `dataFields` is dx's descriptions.values — hidden measures aggregate there but never\r\n // chart (P2-C3); each visible one keeps its ORIGINAL dataIndex for cell addressing.\r\n const measures = m.dataFields\r\n .map((df, di) => ({ df, di }))\r\n .filter(({ df }) => df.visible !== false);\r\n const caption = (mm: { df: NxePivotField }) => mm.df.caption ?? mm.df.dataField ?? '';\r\n const multiMeasure = measures.length > 1;\r\n const measureInArgs = multiMeasure && (putInto === 'args' || putInto === 'both');\r\n const measureInSeries = multiMeasure && putInto !== 'args';\r\n\r\n // Measures-on-rows splits every body row per measure — categories come from the first\r\n // visible measure's variants; the split lookup addresses the others.\r\n const split = m.dataFieldArea === 'row' && m.dataFields.length > 1;\r\n const firstDi = measures[0]?.di ?? 0;\r\n const baseRows = m.rows\r\n .map((row, ri) => ({ row, ri }))\r\n .filter(({ row }) => row.kind !== 'T' && (!split || row.dataIndex === firstDi));\r\n let splitRi: Map<string, number> | null = null;\r\n if (split) {\r\n splitRi = new Map();\r\n m.rows.forEach((row, ri) => {\r\n if (row.dataIndex !== undefined) {\r\n splitRi!.set(`${row.pathKey}\u0000${row.dataIndex}`, ri);\r\n }\r\n });\r\n }\r\n\r\n // Distinct 'D' column groups in leaf order (non-split: one group spans the per-measure\r\n // leaves of a colPath; split: one leaf per colPath IS the group).\r\n interface ColGroup {\r\n name: string;\r\n li0: number;\r\n leafByDi: Map<number, number>;\r\n }\r\n const groups: ColGroup[] = [];\r\n const groupByKey = new Map<string, ColGroup>();\r\n const collect = (kinds: NxePivotColumnLeaf['kind'][], nameOf: (li: number) => string) => {\r\n m.leaves.forEach((leaf, li) => {\r\n if (!kinds.includes(leaf.kind)) {\r\n return;\r\n }\r\n const key = leaf.colKey || '#root';\r\n let g = groupByKey.get(key);\r\n if (!g) {\r\n g = { name: nameOf(li), li0: li, leafByDi: new Map() };\r\n groupByKey.set(key, g);\r\n groups.push(g);\r\n }\r\n g.leafByDi.set(leaf.dataIndex, li);\r\n });\r\n };\r\n collect(['D'], (li) => m.colLabels[li].join(' - '));\r\n if (groups.length === 0) {\r\n // A pivot with no column fields has only the root column, which the engine emits as\r\n // the GRAND-TOTAL leaf once `showColumnGrandTotals` is on (dx's default) — see\r\n // buildLeaves' `columnFields.length === 0 && measuresOnRows` branch. dx charts that\r\n // column rather than dropping it (m_chart_integration maps an empty column path onto\r\n // `grandTotalText`), so without this pass such a pivot binds a chart with categories\r\n // and no series at all.\r\n collect(['GT'], () => m.texts.grandTotal);\r\n }\r\n\r\n const valueFor = (\r\n g: ColGroup,\r\n entry: { row: NxePivotBodyRow; ri: number },\r\n di: number,\r\n ): number => {\r\n if (split) {\r\n const ri = splitRi!.get(`${entry.row.pathKey}\u0000${di}`);\r\n return (ri !== undefined ? m.matrix[ri][g.li0] : null) ?? 0;\r\n }\r\n const li = g.leafByDi.get(di);\r\n return (li !== undefined ? m.matrix[entry.ri][li] : null) ?? 0;\r\n };\r\n\r\n // Categories — with putDataFieldsInto 'args'/'both' each base row splits per measure,\r\n // carrying dx's ` | {caption}` suffix; `alternateDataFields` orders the interleave.\r\n const categories: string[] = [];\r\n const catKeys: { entry: { row: NxePivotBodyRow; ri: number }; di: number }[] = [];\r\n if (measureInArgs) {\r\n const emitCat = (entry: (typeof baseRows)[number], mm: (typeof measures)[number]) => {\r\n categories.push(`${entry.row.label} | ${caption(mm)}`);\r\n catKeys.push({ entry, di: mm.di });\r\n };\r\n if (alternate) {\r\n for (const entry of baseRows) {\r\n for (const mm of measures) {\r\n emitCat(entry, mm);\r\n }\r\n }\r\n } else {\r\n for (const mm of measures) {\r\n for (const entry of baseRows) {\r\n emitCat(entry, mm);\r\n }\r\n }\r\n }\r\n } else {\r\n for (const entry of baseRows) {\r\n categories.push(entry.row.label);\r\n catKeys.push({ entry, di: -1 });\r\n }\r\n }\r\n\r\n const series: { name: string; values: number[] }[] = [];\r\n if (measureInSeries) {\r\n const emitSeries = (g: ColGroup, mm: (typeof measures)[number]) =>\r\n series.push({\r\n name: g.name ? `${g.name} | ${caption(mm)}` : caption(mm),\r\n values: catKeys.map((k) => {\r\n // 'both': a series carries one measure — mismatched categories fill 0\r\n // (dx emits sparse data items there).\r\n if (k.di >= 0 && k.di !== mm.di) {\r\n return 0;\r\n }\r\n return valueFor(g, k.entry, mm.di);\r\n }),\r\n });\r\n if (alternate) {\r\n for (const g of groups) {\r\n for (const mm of measures) {\r\n emitSeries(g, mm);\r\n }\r\n }\r\n } else {\r\n for (const mm of measures) {\r\n for (const g of groups) {\r\n emitSeries(g, mm);\r\n }\r\n }\r\n }\r\n } else {\r\n // One series per column group: single-measure models name a label-less root group\r\n // after the measure; 'args' mode names it dx's grand-total text.\r\n for (const g of groups) {\r\n series.push({\r\n name:\r\n g.name ||\r\n (measureInArgs ? m.texts.grandTotal : caption(measures[0] ?? { df: {} })),\r\n values: catKeys.map((k) =>\r\n valueFor(g, k.entry, k.di >= 0 ? k.di : firstDi),\r\n ),\r\n });\r\n }\r\n }\r\n return { categories, series };\r\n }\r\n\r\n // --- DevExtreme `.instance` facade ---------------------------------------------------------\r\n private readonly facade: NxePivotGridInstance = {\r\n getDataSource: () => ({\r\n /**\r\n * dx `reload()` (m_data_source.js): `load({reload: true})` re-fetches/re-aggregates\r\n * the store but PRESERVES field state and the expanded paths (`getExpandedPaths`\r\n * re-feeds `rowExpandedPaths`/`columnExpandedPaths` into `_loadCore`). Here: an\r\n * INSTANCE input re-builds in place; a plain options object re-instantiates the\r\n * engine on the tick (re-reading `opts.fields` — the DA page's\r\n * `sendStorageRequest` replaces fields INSIDE the same object, so the rebuild is\r\n * where fresh fields land); the user-state linkedSignals (chevrons, overrides)\r\n * are keyed on the INPUT identity and survive (W4 Lane 1).\r\n */\r\n reload: () => {\r\n const ds = this.dataSource();\r\n if (ds instanceof NxePivotDataSource) {\r\n ds.reload();\r\n }\r\n this.reloadTick.update((v) => v + 1);\r\n },\r\n }),\r\n bindChart: (chart, options) => {\r\n if (chart && chart._isNxeChart) {\r\n // W4 Lane 4: honor the dx integration options (see NxePivotBindChartOptions).\r\n this.chartBindOptions.set({ ...(options ?? {}) });\r\n this.boundChart.set(chart as NxeChartInstance);\r\n }\r\n },\r\n getExportModel: () => this.model(),\r\n // dx repaint() = Widget re-render: render/layout only, NO re-aggregation (W4 Lane 1).\r\n repaint: () => this.renderTick.update((v) => v + 1),\r\n expandAll: () => this.setAllExpanded(true),\r\n collapseAll: () => this.setAllExpanded(false),\r\n // --- W4 Lane 2: facade completion ------------------------------------------------------\r\n exportToExcel: () => this.runExportToExcel(),\r\n option: (name: string, ...rest: unknown[]) => this.optionFacade(name, rest),\r\n // dx updateDimensions(): re-run the layout/measurement pass (band anchor sync).\r\n updateDimensions: () => this.renderTick.update((v) => v + 1),\r\n // dx getFieldChooserPopup(), narrowed to {show, hide} against the chooser overlay.\r\n getFieldChooserPopup: () => ({\r\n show: () => this.toggleFieldChooser(),\r\n hide: () => this.closeFieldChooser(),\r\n }),\r\n };\r\n\r\n /**\r\n * dx `option(name[, value])` (W4 Lane 2). Get: the EFFECTIVE value (override ?? input);\r\n * `'dataSource'` is additionally readable. Set: only the documented names in\r\n * {@link effOptions} — the write lands in {@link optionOverrides}, wins over the input\r\n * binding, and flows through the option-snapshot diff into `onOptionChanged`. Unsupported\r\n * names (dataSource, nested `'a.b'` paths, the projected-config children) are a silent\r\n * no-op on set / undefined on get, recorded in DEFAULTS.md.\r\n */\r\n private optionFacade(name: string, rest: unknown[]): unknown {\r\n if (rest.length === 0) {\r\n if (name === 'dataSource') {\r\n return this.dataSource();\r\n }\r\n return name in this.effOptions ? this.effOptions[name]() : undefined;\r\n }\r\n if (!(name in this.effOptions)) {\r\n return undefined;\r\n }\r\n const next = new Map(this.optionOverrides());\r\n next.set(name, rest[0]);\r\n this.optionOverrides.set(next);\r\n return undefined;\r\n }\r\n\r\n /**\r\n * dx `exportToExcel()` — the widget's built-in export path (m_export.js `exportTo`): fire\r\n * the cancelable `onExporting` with dx's default fileName 'PivotGrid' (a handler may\r\n * rename or cancel), then run the SAME `exportPivotGrid({component})` pipeline\r\n * report-output-pivot drives from its own toolbar (that page-side path stays untouched\r\n * and, like dx's standalone exporter, never fires the widget event).\r\n */\r\n private runExportToExcel(): Promise<void> {\r\n const args: NxePivotExportingEvent = {\r\n fileName: 'PivotGrid',\r\n cancel: false,\r\n component: this.instance,\r\n };\r\n this.onExporting.emit(args);\r\n if (args.cancel) {\r\n return Promise.resolve();\r\n }\r\n const workbook = new Workbook();\r\n const worksheet = workbook.addWorksheet(args.fileName);\r\n return exportPivotGrid({ component: this.instance, worksheet }).then(() =>\r\n workbook.xlsx.writeBuffer().then((buffer) =>\r\n this.saveExportedWorkbook(\r\n new Blob([buffer], { type: 'application/octet-stream' }),\r\n `${args.fileName}.xlsx`,\r\n ),\r\n ),\r\n );\r\n }\r\n\r\n /** Download seam (specs spy here — nxeSaveAs clicks a synthetic anchor). */\r\n protected saveExportedWorkbook(blob: Blob, fileName: string): void {\r\n nxeSaveAs(blob, fileName);\r\n }\r\n\r\n /**\r\n * Oracle §e: dx's expand-all/collapse-all set `expanded` on EVERY field of the data source\r\n * and reload — and the dx-era report page did the same blanket `field.expanded` mutation,\r\n * which is why its Save persisted the expanded state and a reload restored it. Mirrored\r\n * here (P3-C4, replacing the earlier private allExpanded model flag) as `expanded`\r\n * fieldOverrides on EVERY field — data and filter fields included, exactly like the old\r\n * page's loop and dx's own mutation: the caller's objects stay untouched, the state\r\n * survives engine rebuilds, and it serializes through {@link effectiveFields} into the\r\n * `customSave` payload with no special-casing. The per-node chevron map is wiped\r\n * EXPLICITLY below (since W4 Lane 1 it is keyed on the dataSource input and survives\r\n * engine rebuilds, so the old implicit reset no longer happens) — dx-identical: individual\r\n * toggles then work on top. `fireStateSave()` closes the Save-after-expandAll loop (it\r\n * no-ops when no `nxe-state-storing` is projected).\r\n */\r\n private setAllExpanded(expanded: boolean): void {\r\n this.manualExpanded.set(new Map());\r\n const count = this.engine()?.fields().length ?? 0;\r\n if (count === 0) {\r\n return; // no fields (or store-derived, area-less ones) — nothing to expand\r\n }\r\n const next = new Map(this.fieldOverrides());\r\n for (let i = 0; i < count; i++) {\r\n next.set(i, { ...next.get(i), expanded });\r\n }\r\n this.fieldOverrides.set(next);\r\n this.fireStateSave();\r\n }\r\n\r\n get instance(): NxePivotGridInstance {\r\n return this.facade;\r\n }\r\n}\r\n","<!-- P3-C3: the dx `.dx-pivotgrid-toolbar` with the field-chooser button (m_widget.js\r\n `_renderDescriptionArea` + dx.light float:right chrome). Placement per dx's branch order:\r\n the panel's filter-header band when it shows, else the panel's column-header band when\r\n the data/column band row shows, else the cross-tab corner cell, where the button stays\r\n transparent until hover. Renders only when the projected nxe-field-chooser config is\r\n enabled. The button chrome is the library's own (nxe-pivot-grid.component.scss). -->\r\n<ng-template #chooserToolbarTpl>\r\n <div class=\"nxe-pivotgrid-toolbar\">\r\n <div\r\n class=\"nxe-pivotgrid-field-chooser-button nxe-pivot-field-chooser-button nxe-widget nxe-button nxe-button-mode-contained nxe-button-normal nxe-button-has-icon\"\r\n role=\"button\"\r\n tabindex=\"0\"\r\n [attr.title]=\"messages.t('pivot.showFieldChooser')\"\r\n [attr.aria-label]=\"messages.t('pivot.showFieldChooser')\"\r\n (click)=\"toggleFieldChooser()\"\r\n (keydown.enter)=\"toggleFieldChooser()\">\r\n <!-- dx's 18px `.dx-icon-columnchooser` glyph, redrawn from rectangles (the DXIcons font is\r\n not used): a window with a 2px frame (12 x 12) behind a solid 8 x 11 list panel with\r\n three 4 x 1 slots, unioned into one even-odd path so the slots stay open where the\r\n panel covers the frame. The span keeps the class the specs query but not `nxe-icon`,\r\n whose mask layer would hide an inline SVG. -->\r\n <div class=\"nxe-button-content\"><span class=\"nxe-icon-columnchooser nxe-pivot-chooser-icon\" aria-hidden=\"true\"><svg viewBox=\"0 0 18 18\" width=\"18\" height=\"18\" focusable=\"false\"><path fill=\"currentColor\" fill-rule=\"evenodd\" d=\"M1 2h12v4h4v11H9v-3H1zM3 4v8h6V6h2V4zM11 8v1h4V8zM11 11v1h4v-1zM11 14v1h4v-1z\" /></svg></span></div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n@if (model(); as m) {\r\n <!-- P3-C2: the dx field panel (dxo-field-panel). dx default visible=false — nothing renders\r\n unless the projected nxe-field-panel opts in (the calc tabs project none). `undefined`\r\n bound into a flag (report-output-pivot binds panelConfig()?.…) falls back to the dx\r\n default: hidden for `visible`, shown for the five area/drag flags. The ROW area is not\r\n in this block — the panel exposes it as a template and the corner cell below hosts it\r\n (dx: the corner .dx-area-description-cell holds the row chips). -->\r\n @if (fieldPanel(); as fp) {\r\n @if (fp.visible()) {\r\n <nxe-pivot-field-panel\r\n [engine]=\"engine()\"\r\n [showFilterFields]=\"fp.showFilterFields() !== false\"\r\n [showDataFields]=\"fp.showDataFields() !== false\"\r\n [showColumnFields]=\"fp.showColumnFields() !== false\"\r\n [showRowFields]=\"fp.showRowFields() !== false\"\r\n [allowFieldDragging]=\"fp.allowFieldDragging() !== false\"\r\n [allowSorting]=\"allowSortingEff()\"\r\n [allowFiltering]=\"allowFilteringEff()\"\r\n [showBorders]=\"showBordersEff()\"\r\n [toolbarTemplate]=\"chooserToolbarTpl\"\r\n [toolbarArea]=\"panelToolbarArea()\"\r\n (fieldMove)=\"onPanelFieldMove($event)\"\r\n (sortToggle)=\"onPanelSortToggle($event)\"\r\n (filterOpen)=\"openPivotHeaderFilter($event)\" />\r\n }\r\n }\r\n <div class=\"nxe-pivotgrid-scroll\" (scroll)=\"onPivotScroll($event)\">\r\n <table\r\n class=\"nxe-pivotgrid-table\"\r\n role=\"grid\"\r\n [class.nxe-pivotgrid-bordered]=\"showBordersEff()\"\r\n [class.nxe-word-wrap]=\"wordWrapEnabledEff()\"\r\n [class.nxe-pivot-layout-tree]=\"m.rowHeaderLayout === 'tree'\">\r\n <colgroup>\r\n @for (w of m.colWidths; track $index) {\r\n <col [style.width.px]=\"w\" />\r\n }\r\n </colgroup>\r\n <thead>\r\n @for (hr of m.columnHeaderRows; track $index; let first = $first) {\r\n <tr role=\"row\">\r\n @if (first) {\r\n <!-- Corner: with the field panel VISIBLE dx hosts the ROW-field chips here and\r\n renders NO caption text (oracle §c \"hosts the ROW field chips\";\r\n views/0/initial-full-page.png). The caption is the panel-hidden rendering\r\n only (accepted deviation — dx shows an empty corner then). When the\r\n field-chooser toolbar lives here the corner is dx's exactly: the button at\r\n its top-left (0 cell padding + the button's 1px margin) and no caption,\r\n which the button would otherwise sit on top of. -->\r\n <th\r\n class=\"nxe-pivot-corner nxe-area-description-cell\"\r\n role=\"columnheader\"\r\n [class.nxe-pivot-corner-fields]=\"panelVisible()\"\r\n [class.nxe-pivot-corner-toolbar]=\"chooserInCorner()\"\r\n [attr.rowspan]=\"m.columnHeaderRows.length\"\r\n [attr.colspan]=\"m.rowHeaderColCount > 1 ? m.rowHeaderColCount : null\">@if (chooserInCorner()) {<ng-container *ngTemplateOutlet=\"chooserToolbarTpl\" />}@if (panelVisible()) {<ng-container *ngTemplateOutlet=\"panelRowAreaTpl()\" />} @else if (!chooserInCorner()) {{{ m.cornerText }}}</th>\r\n }\r\n @for (cell of hr; track $index) {\r\n <th\r\n class=\"nxe-pivot-col-header\"\r\n role=\"columnheader\"\r\n [class.nxe-pivot-grandtotal]=\"cell.isGrandTotal\"\r\n [class.nxe-pivot-total]=\"cell.isTotal\"\r\n [class.nxe-row-total]=\"cell.isGrandTotal || cell.isTotal\"\r\n [class.nxe-grandtotal]=\"cell.isGrandTotal\"\r\n [class.nxe-total]=\"cell.isTotal\"\r\n [class.nxe-pivotgrid-expanded]=\"cell.expandable && cell.expanded\"\r\n [class.nxe-pivotgrid-collapsed]=\"cell.expandable && !cell.expanded\"\r\n [attr.colspan]=\"cell.colspan\"\r\n [attr.rowspan]=\"cell.rowspan && cell.rowspan > 1 ? cell.rowspan : null\"\r\n [attr.tabindex]=\"cell.expandable ? 0 : null\"\r\n [attr.aria-expanded]=\"cell.expandable ? cell.expanded === true : null\"\r\n (click)=\"onColHeaderCellClick($event, cell)\"\r\n (keydown.enter)=\"cell.expandable && onExpandKey($event, cell.pathKey ?? '', cell.expanded === true)\"\r\n (keydown.space)=\"cell.expandable && onExpandKey($event, cell.pathKey ?? '', cell.expanded === true)\">\r\n @if (cell.expandable) {\r\n <span\r\n class=\"nxe-pivot-expand nxe-expand-icon-container\"\r\n [class.nxe-pivot-expanded]=\"cell.expanded\"\r\n (click)=\"onColExpandClick($event, cell)\"><span class=\"nxe-expand\" aria-hidden=\"true\"></span></span>\r\n }<span class=\"nxe-pivot-col-label\">{{ cell.text }}</span></th>\r\n }\r\n </tr>\r\n }\r\n </thead>\r\n <tbody>\r\n <!-- W4 Lane 3: `viewRows()` is the rendered row window ({row, ri} with ri = MODEL row\r\n index — matrix addressing must not shift). All rows unless nxe-scrolling\r\n mode=\"virtual\" arms tree-scoped windowing; the spacer rows stand in for the\r\n unrendered rows so the scrollbar geometry stays true. -->\r\n @if (topSpacerH() > 0) {\r\n <tr class=\"nxe-pivot-vspacer\" aria-hidden=\"true\"><td [attr.colspan]=\"totalColCount()\" [style.height.px]=\"topSpacerH()\"></td></tr>\r\n }\r\n @for (entry of viewRows(); track entry.row.trackKey ?? entry.row.pathKey) {\r\n @let row = entry.row;\r\n @let ri = entry.ri;\r\n <tr class=\"nxe-pivot-row\" role=\"row\" [class.nxe-pivot-total-row]=\"row.kind === 'T'\">\r\n @if (m.rowHeaderLayout === 'tree') {\r\n @if (row.measureRowspan !== 0) {\r\n <th\r\n class=\"nxe-pivot-row-header\"\r\n role=\"rowheader\"\r\n [attr.rowspan]=\"row.measureRowspan && row.measureRowspan > 1 ? row.measureRowspan : null\"\r\n [style.padding-left.px]=\"10 + row.level * 16\"\r\n [attr.tabindex]=\"row.hasChildren ? 0 : null\"\r\n [attr.aria-expanded]=\"row.hasChildren ? row.expanded : null\"\r\n (click)=\"onRowHeaderCellClick($event, row, null)\"\r\n (keydown.enter)=\"row.hasChildren && onExpandKey($event, row.pathKey, row.expanded)\"\r\n (keydown.space)=\"row.hasChildren && onExpandKey($event, row.pathKey, row.expanded)\">\r\n @if (row.hasChildren) {\r\n <span\r\n class=\"nxe-pivot-expand nxe-expand-icon-container\"\r\n [class.nxe-pivot-expanded]=\"row.expanded\"\r\n (click)=\"onRowExpandClick($event, row, null)\"><span class=\"nxe-expand\" aria-hidden=\"true\"></span></span>\r\n }\r\n <span class=\"nxe-pivot-row-label\">{{ row.label }}</span>\r\n </th>\r\n }\r\n @if (row.measureCaption !== undefined) {\r\n <th\r\n class=\"nxe-pivot-row-header nxe-pivot-measure-header\"\r\n role=\"rowheader\"\r\n [class.nxe-pivot-total]=\"row.kind === 'T'\"\r\n [class.nxe-row-total]=\"row.kind === 'T'\"\r\n [class.nxe-total]=\"row.kind === 'T'\"\r\n (click)=\"onMeasureCellClick($event, row)\">{{ row.measureCaption }}</th>\r\n }\r\n } @else {\r\n @for (hc of row.headerCells; track $index) {\r\n <th\r\n class=\"nxe-pivot-row-header\"\r\n role=\"rowheader\"\r\n [class.nxe-pivot-total]=\"hc.isTotal\"\r\n [class.nxe-row-total]=\"hc.isTotal\"\r\n [class.nxe-total]=\"hc.isTotal\"\r\n [class.nxe-pivotgrid-expanded]=\"hc.expandable && hc.expanded\"\r\n [class.nxe-pivotgrid-collapsed]=\"hc.expandable && !hc.expanded\"\r\n [attr.rowspan]=\"hc.rowspan > 1 ? hc.rowspan : null\"\r\n [attr.colspan]=\"hc.colspan > 1 ? hc.colspan : null\"\r\n [attr.tabindex]=\"hc.expandable ? 0 : null\"\r\n [attr.aria-expanded]=\"hc.expandable ? hc.expanded : null\"\r\n (click)=\"onRowHeaderCellClick($event, row, hc)\"\r\n (keydown.enter)=\"hc.expandable && onExpandKey($event, hc.pathKey, hc.expanded)\"\r\n (keydown.space)=\"hc.expandable && onExpandKey($event, hc.pathKey, hc.expanded)\">\r\n @if (hc.expandable) {\r\n <span\r\n class=\"nxe-pivot-expand nxe-expand-icon-container\"\r\n [class.nxe-pivot-expanded]=\"hc.expanded\"\r\n (click)=\"onRowExpandClick($event, row, hc)\"><span class=\"nxe-expand\" aria-hidden=\"true\"></span></span>\r\n }\r\n @if (hc.isTotal) {\r\n {{ hc.text }}\r\n } @else {\r\n <span class=\"nxe-pivot-row-label\">{{ hc.text }}</span>\r\n }\r\n </th>\r\n }\r\n }\r\n @for (leaf of m.leaves; track $index; let li = $index) {\r\n <td\r\n class=\"nxe-pivot-data\"\r\n role=\"gridcell\"\r\n [class.nxe-pivot-total]=\"row.kind === 'T' || leaf.kind === 'T'\"\r\n [class.nxe-total]=\"row.kind === 'T' || leaf.kind === 'T'\"\r\n [class.nxe-row-total]=\"row.kind === 'T'\"\r\n [class.nxe-pivot-grandtotal]=\"leaf.isGrandTotal\"\r\n [class.nxe-grandtotal]=\"leaf.isGrandTotal\"\r\n (click)=\"onDataCellClick($event, ri, li)\">{{ m.textMatrix[ri][li] }}</td>\r\n }\r\n </tr>\r\n }\r\n @if (bottomSpacerH() > 0) {\r\n <tr class=\"nxe-pivot-vspacer\" aria-hidden=\"true\"><td [attr.colspan]=\"totalColCount()\" [style.height.px]=\"bottomSpacerH()\"></td></tr>\r\n }\r\n @if (m.grandTotalRows; as gtr) {\r\n @for (g of gtr; track g.dataIndex; let first = $first) {\r\n <tr class=\"nxe-pivot-row nxe-pivot-grandtotal-row\" role=\"row\">\r\n @if (first) {\r\n <th\r\n class=\"nxe-pivot-row-header nxe-pivot-grandtotal nxe-row-total nxe-grandtotal\"\r\n role=\"rowheader\"\r\n [attr.rowspan]=\"gtr.length > 1 ? gtr.length : null\"\r\n [attr.colspan]=\"m.rowHeaderColCount - 1 > 1 ? m.rowHeaderColCount - 1 : null\"\r\n (click)=\"onGtHeaderCellClick($event, m.texts.grandTotal)\">{{ m.texts.grandTotal }}</th>\r\n }\r\n <th\r\n class=\"nxe-pivot-row-header nxe-pivot-measure-header nxe-pivot-grandtotal nxe-row-total nxe-grandtotal\"\r\n role=\"rowheader\"\r\n (click)=\"onGtHeaderCellClick($event, g.caption)\">{{ g.caption }}</th>\r\n @for (gc of g.cells; track $index; let li = $index) {\r\n <td\r\n class=\"nxe-pivot-data nxe-pivot-grandtotal nxe-grandtotal nxe-row-total\"\r\n role=\"gridcell\"\r\n [class.nxe-total]=\"m.leaves[li].kind === 'T'\"\r\n (click)=\"onGtDataCellClick($event, li, g.dataIndex, gc.value, gc.text)\">{{ gc.text }}</td>\r\n }\r\n </tr>\r\n }\r\n } @else if (m.grandTotalCells; as gt) {\r\n <tr class=\"nxe-pivot-row nxe-pivot-grandtotal-row\" role=\"row\">\r\n <th\r\n class=\"nxe-pivot-row-header nxe-pivot-grandtotal nxe-row-total nxe-grandtotal\"\r\n role=\"rowheader\"\r\n [attr.colspan]=\"m.rowHeaderColCount > 1 ? m.rowHeaderColCount : null\"\r\n (click)=\"onGtHeaderCellClick($event, m.texts.grandTotal)\">{{ m.texts.grandTotal }}</th>\r\n @for (gc of gt; track $index; let li = $index) {\r\n <td\r\n class=\"nxe-pivot-data nxe-pivot-grandtotal nxe-grandtotal nxe-row-total\"\r\n role=\"gridcell\"\r\n [class.nxe-total]=\"m.leaves[li].kind === 'T'\"\r\n (click)=\"onGtDataCellClick($event, li, m.leaves[li].dataIndex, gc.value, gc.text)\">{{ gc.text }}</td>\r\n }\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n <!-- dx `.dx-pivotgrid-nodata` (gridCoreUtils.renderNoDataText): a <span>, shown when the\r\n data source isEmpty(), centered over the widget by the dx.light absolute rule. -->\r\n @if (showNoData()) {\r\n <span class=\"nxe-pivotgrid-nodata\">{{ m.texts.noData }}</span>\r\n }\r\n </div>\r\n} @else {\r\n <div class=\"nxe-pivotgrid-empty\"></div>\r\n}\r\n","/* eslint-disable @typescript-eslint/no-explicit-any */\r\n// nxe-chart — drop-in for DevExtreme `dx-chart` (the only usage is a `type=\"bar\"` chart fed by\r\n// `pivotGrid.bindChart(chart.instance, …)`). Renders a lightweight grouped SVG bar chart from the\r\n// series the pivot pushes via the `.instance.render()` facade. The two chart pages (analytics,\r\n// form-report) are currently dormant (their pivot data is commented out) so this renders empty in\r\n// practice, but the implementation is real so it works if that data is ever re-enabled.\r\n\r\nimport {\r\n ChangeDetectionStrategy,\r\n Component,\r\n computed,\r\n contentChild,\r\n input,\r\n signal,\r\n ViewEncapsulation,\r\n} from '@angular/core';\r\nimport { NxeChartInstance, NxeChartSeries } from './nxe-pivot.types';\r\n\r\n/** `dxo-common-series-settings` — the series type (only `bar` is used). */\r\n@Component({\r\n selector: 'nxe-common-series-settings',\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 NxeCommonSeriesSettingsComponent {\r\n readonly type = input<'bar' | 'line' | 'spline' | 'area'>('bar');\r\n readonly argumentField = input<string | undefined>(undefined);\r\n readonly valueField = input<string | undefined>(undefined);\r\n}\r\n\r\n/** `dxo-size` — fixed chart height. */\r\n@Component({\r\n selector: 'nxe-size',\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 NxeSizeComponent {\r\n readonly width = input<number | undefined>(undefined);\r\n readonly height = input<number | undefined>(undefined);\r\n}\r\n\r\n/** `dxo-adaptive-layout` — responsive breakpoint width (the chart fills its container above it). */\r\n@Component({\r\n selector: 'nxe-adaptive-layout',\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 NxeAdaptiveLayoutComponent {\r\n readonly width = input<number | undefined>(undefined);\r\n readonly height = input<number | undefined>(undefined);\r\n readonly keepLabels = input(true);\r\n}\r\n\r\ninterface BarRect {\r\n x: number;\r\n y: number;\r\n w: number;\r\n h: number;\r\n fill: string;\r\n}\r\n\r\n/** DevExtreme's default (\"Material\") series palette — first 10 colours. */\r\nconst PALETTE = [\r\n '#1db2f5',\r\n '#fc5c5c',\r\n '#97c95c',\r\n '#ffc208',\r\n '#9b59b6',\r\n '#1c98e6',\r\n '#ff8f00',\r\n '#26a69a',\r\n '#ec407a',\r\n '#7e57c2',\r\n];\r\n\r\n@Component({\r\n selector: 'nxe-chart',\r\n standalone: true,\r\n templateUrl: './nxe-chart.component.html',\r\n styleUrl: './nxe-chart.component.scss',\r\n host: { class: 'nxe-widget nxe-chart' },\r\n changeDetection: ChangeDetectionStrategy.OnPush,\r\n encapsulation: ViewEncapsulation.None,\r\n})\r\nexport class NxeChartComponent {\r\n readonly dataSource = input<NxeChartSeries | null | undefined>(null);\r\n\r\n protected readonly commonSeries = contentChild(NxeCommonSeriesSettingsComponent);\r\n protected readonly size = contentChild(NxeSizeComponent);\r\n protected readonly adaptiveLayout = contentChild(NxeAdaptiveLayoutComponent);\r\n\r\n /** Series pushed by `pivotGrid.bindChart(...)`; falls back to the `[dataSource]` input. */\r\n private readonly pushed = signal<NxeChartSeries | null>(null);\r\n\r\n protected readonly series = computed<NxeChartSeries | null>(\r\n () => this.pushed() ?? this.dataSource() ?? null,\r\n );\r\n\r\n protected readonly chartHeight = computed(() => this.size()?.height() ?? 200);\r\n protected readonly chartWidth = computed(() => {\r\n const s = this.series();\r\n const min = this.adaptiveLayout()?.width() ?? 450;\r\n const cats = s?.categories.length ?? 0;\r\n return Math.max(min, cats * 56 + 60);\r\n });\r\n\r\n protected readonly hasData = computed(() => {\r\n const s = this.series();\r\n return !!s && s.categories.length > 0 && s.series.some((ss) => ss.values.length > 0);\r\n });\r\n\r\n private readonly PAD = { left: 44, right: 12, top: 12, bottom: 28 };\r\n\r\n protected readonly bars = computed<BarRect[]>(() => {\r\n const s = this.series();\r\n if (!s || !this.hasData()) {\r\n return [];\r\n }\r\n const w = this.chartWidth();\r\n const h = this.chartHeight();\r\n const plotW = w - this.PAD.left - this.PAD.right;\r\n const plotH = h - this.PAD.top - this.PAD.bottom;\r\n const cats = s.categories.length;\r\n const seriesCount = Math.max(1, s.series.length);\r\n\r\n let max = 0;\r\n for (const ss of s.series) {\r\n for (const v of ss.values) {\r\n if (v > max) max = v;\r\n }\r\n }\r\n if (max <= 0) {\r\n max = 1;\r\n }\r\n\r\n const groupW = plotW / cats;\r\n const innerPad = groupW * 0.15;\r\n const barW = (groupW - innerPad * 2) / seriesCount;\r\n\r\n const out: BarRect[] = [];\r\n for (let c = 0; c < cats; c++) {\r\n for (let si = 0; si < s.series.length; si++) {\r\n const val = s.series[si].values[c] ?? 0;\r\n const bh = Math.max(0, (val / max) * plotH);\r\n out.push({\r\n x: this.PAD.left + c * groupW + innerPad + si * barW,\r\n y: this.PAD.top + (plotH - bh),\r\n w: Math.max(1, barW - 1),\r\n h: bh,\r\n fill: PALETTE[si % PALETTE.length],\r\n });\r\n }\r\n }\r\n return out;\r\n });\r\n\r\n protected readonly legend = computed(() => {\r\n const s = this.series();\r\n if (!s) {\r\n return [];\r\n }\r\n return s.series.map((ss, i) => ({ name: ss.name, fill: PALETTE[i % PALETTE.length] }));\r\n });\r\n\r\n protected readonly baselineY = computed(() => this.chartHeight() - this.PAD.bottom);\r\n protected readonly axisLeft = computed(() => this.PAD.left);\r\n protected readonly axisRight = computed(() => this.chartWidth() - this.PAD.right);\r\n\r\n // --- DevExtreme `.instance` facade (target of `pivotGrid.bindChart`) -----------------------\r\n private readonly facade: NxeChartInstance = {\r\n _isNxeChart: true,\r\n render: (s: NxeChartSeries) => this.pushed.set(s),\r\n };\r\n\r\n get instance(): NxeChartInstance {\r\n return this.facade;\r\n }\r\n}\r\n","<div class=\"nxe-chart-host\" [style.height.px]=\"chartHeight()\">\r\n @if (hasData()) {\r\n <div class=\"nxe-chart-plot\">\r\n <svg\r\n [attr.width]=\"chartWidth()\"\r\n [attr.height]=\"chartHeight()\"\r\n [attr.viewBox]=\"'0 0 ' + chartWidth() + ' ' + chartHeight()\"\r\n class=\"nxe-chart-svg\">\r\n <!-- baseline -->\r\n <line\r\n [attr.x1]=\"axisLeft()\"\r\n [attr.x2]=\"axisRight()\"\r\n [attr.y1]=\"baselineY()\"\r\n [attr.y2]=\"baselineY()\"\r\n class=\"nxe-chart-axis\" />\r\n @for (b of bars(); track $index) {\r\n <rect [attr.x]=\"b.x\" [attr.y]=\"b.y\" [attr.width]=\"b.w\" [attr.height]=\"b.h\" [attr.fill]=\"b.fill\" />\r\n }\r\n </svg>\r\n </div>\r\n <div class=\"nxe-chart-legend\">\r\n @for (item of legend(); track $index) {\r\n <span class=\"nxe-chart-legend-item\">\r\n <span class=\"nxe-chart-legend-swatch\" [style.background]=\"item.fill\"></span>\r\n {{ item.name }}\r\n </span>\r\n }\r\n </div>\r\n } @else {\r\n <div class=\"nxe-chart-empty\"></div>\r\n }\r\n</div>\r\n","// @nexterajs/ui/pivot — public API.\r\nexport * from './lib/grid/nxe-pivot-excel-export';\r\nexport * from './lib/grid/nxe-pivot.types';\r\nexport * from './lib/grid/nxe-pivot-data-source';\r\nexport * from './lib/grid/nxe-pivot-grid.component';\r\nexport * from './lib/grid/nxe-pivot-field-panel.component';\r\nexport * from './lib/grid/nxe-pivot-field-chip.component';\r\nexport * from './lib/grid/nxe-pivot-field-chooser.component';\r\nexport * from './lib/grid/nxe-pivot-config.components';\r\nexport * from './lib/grid/nxe-chart.component';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|