@nexterajs/ui 0.0.1

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.
Files changed (50) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +16 -0
  3. package/README.md +64 -0
  4. package/fesm2022/nexterajs-ui-animations.mjs +184 -0
  5. package/fesm2022/nexterajs-ui-animations.mjs.map +1 -0
  6. package/fesm2022/nexterajs-ui-core.mjs +326 -0
  7. package/fesm2022/nexterajs-ui-core.mjs.map +1 -0
  8. package/fesm2022/nexterajs-ui-dropdowns.mjs +953 -0
  9. package/fesm2022/nexterajs-ui-dropdowns.mjs.map +1 -0
  10. package/fesm2022/nexterajs-ui-excel.mjs +779 -0
  11. package/fesm2022/nexterajs-ui-excel.mjs.map +1 -0
  12. package/fesm2022/nexterajs-ui-file-uploader.mjs +125 -0
  13. package/fesm2022/nexterajs-ui-file-uploader.mjs.map +1 -0
  14. package/fesm2022/nexterajs-ui-forms.mjs +1113 -0
  15. package/fesm2022/nexterajs-ui-forms.mjs.map +1 -0
  16. package/fesm2022/nexterajs-ui-grid.mjs +4145 -0
  17. package/fesm2022/nexterajs-ui-grid.mjs.map +1 -0
  18. package/fesm2022/nexterajs-ui-intl.mjs +377 -0
  19. package/fesm2022/nexterajs-ui-intl.mjs.map +1 -0
  20. package/fesm2022/nexterajs-ui-pivot.mjs +4739 -0
  21. package/fesm2022/nexterajs-ui-pivot.mjs.map +1 -0
  22. package/fesm2022/nexterajs-ui-styling.mjs +59 -0
  23. package/fesm2022/nexterajs-ui-styling.mjs.map +1 -0
  24. package/fesm2022/nexterajs-ui-tree-view.mjs +202 -0
  25. package/fesm2022/nexterajs-ui-tree-view.mjs.map +1 -0
  26. package/fesm2022/nexterajs-ui-validation.mjs +269 -0
  27. package/fesm2022/nexterajs-ui-validation.mjs.map +1 -0
  28. package/fesm2022/nexterajs-ui.mjs +23 -0
  29. package/fesm2022/nexterajs-ui.mjs.map +1 -0
  30. package/package.json +100 -0
  31. package/styles/_button-directives.scss +39 -0
  32. package/styles/_dropdown.scss +113 -0
  33. package/styles/_editor.scss +146 -0
  34. package/styles/_mixins.scss +2 -0
  35. package/styles/_tokens.scss +77 -0
  36. package/styles/_widget.scss +58 -0
  37. package/styles/index.scss +83 -0
  38. package/types/nexterajs-ui-animations.d.ts +22 -0
  39. package/types/nexterajs-ui-core.d.ts +328 -0
  40. package/types/nexterajs-ui-dropdowns.d.ts +334 -0
  41. package/types/nexterajs-ui-excel.d.ts +159 -0
  42. package/types/nexterajs-ui-file-uploader.d.ts +47 -0
  43. package/types/nexterajs-ui-forms.d.ts +296 -0
  44. package/types/nexterajs-ui-grid.d.ts +1485 -0
  45. package/types/nexterajs-ui-intl.d.ts +125 -0
  46. package/types/nexterajs-ui-pivot.d.ts +1470 -0
  47. package/types/nexterajs-ui-styling.d.ts +40 -0
  48. package/types/nexterajs-ui-tree-view.d.ts +69 -0
  49. package/types/nexterajs-ui-validation.d.ts +102 -0
  50. package/types/nexterajs-ui.d.ts +12 -0
@@ -0,0 +1,1470 @@
1
+ import { NxeColumnFormat, NxeGridInstance, NxeExcelExportOptions, NxeScrollingComponent, NxeHeaderFilterModel } from '@nexterajs/ui/grid';
2
+ import * as _angular_core from '@angular/core';
3
+ import { OnDestroy, TemplateRef, Signal, EventEmitter } from '@angular/core';
4
+
5
+ type NxePivotArea = 'row' | 'column' | 'data' | 'filter';
6
+ type NxePivotSummaryType = 'sum' | 'count' | 'min' | 'max' | 'avg' | 'custom';
7
+ /** dx `summaryDisplayMode` values (P2-C3; transcribed from m_summary_display_modes.js). */
8
+ type NxePivotSummaryDisplayMode = 'absoluteVariation' | 'percentVariation' | 'percentOfColumnTotal' | 'percentOfRowTotal' | 'percentOfColumnGrandTotal' | 'percentOfRowGrandTotal' | 'percentOfGrandTotal';
9
+ /** dx date `groupInterval` names (m_local_store `DATE_INTERVAL_SELECTORS`); numbers = step. */
10
+ type NxePivotGroupInterval = 'year' | 'quarter' | 'month' | 'day' | 'dayOfWeek' | number;
11
+ /**
12
+ * The `e` object a `calculateSummaryValue` callback receives — dx `SummaryCell` (P2-C3,
13
+ * transcribed method-for-method from m_summary_display_modes.js over the engine's visible-tree
14
+ * cell store; the display modes and running totals run on the very same machinery). `parent()`
15
+ * of a top-level cell is the grand total on that axis; `parent()` of the grand total is null.
16
+ * `value()` reads the ORIGINAL aggregate, `value(true)` the post-processed one; a
17
+ * row/column/data field (object, or dataField/caption/name id) reads that field's value at the
18
+ * cell's path instead.
19
+ */
20
+ interface NxePivotSummaryCell {
21
+ parent(direction: 'row' | 'column'): NxePivotSummaryCell | null;
22
+ children(direction: 'row' | 'column'): NxePivotSummaryCell[];
23
+ child(direction: 'row' | 'column', fieldValue: any): NxePivotSummaryCell | null;
24
+ grandTotal(direction?: 'row' | 'column'): NxePivotSummaryCell;
25
+ next(direction: 'row' | 'column', allowCrossGroup?: boolean): NxePivotSummaryCell | null;
26
+ prev(direction: 'row' | 'column', allowCrossGroup?: boolean): NxePivotSummaryCell | null;
27
+ field(area: 'row' | 'column' | 'data'): NxePivotField | null;
28
+ slice(field: NxePivotField | string | number, value: any): NxePivotSummaryCell | null;
29
+ value(fieldOrCalculated?: NxePivotField | string | number | boolean, isCalculatedValue?: boolean): any;
30
+ isPostProcessed(field?: NxePivotField | string | number): boolean;
31
+ }
32
+ /**
33
+ * The options object dx threads through a `calculateCustomSummary` callback (transcribed from
34
+ * DevExtreme 24.2.3 local_store/m_local_store `getAggregator`): ONE object per cell, mutated in
35
+ * place across the whole protocol — `{summaryProcess:'start', totalValue:undefined}` first, then
36
+ * per defined raw value `summaryProcess='calculate'` + `value`, then `summaryProcess='finalize'`
37
+ * with `value` DELETED; the cell renders whatever `totalValue` holds after 'finalize'.
38
+ */
39
+ interface NxePivotCustomSummaryInfo {
40
+ summaryProcess: 'start' | 'calculate' | 'finalize';
41
+ /** The current record's raw value — present only during 'calculate' (deleted for 'finalize'). */
42
+ value?: any;
43
+ /** The accumulator/result — whatever the callback leaves here after 'finalize' is the cell. */
44
+ totalValue?: any;
45
+ }
46
+ /** A DevExtreme PivotGrid field descriptor (the subset the app passes). */
47
+ interface NxePivotField {
48
+ caption?: string;
49
+ dataField?: string;
50
+ dataType?: 'string' | 'number' | 'date' | 'boolean';
51
+ /** Placement; a field with no `area` is defined-but-not-displayed (DevExtreme parity). */
52
+ area?: NxePivotArea;
53
+ areaIndex?: number;
54
+ summaryType?: NxePivotSummaryType;
55
+ /** dx custom-summary protocol — used when `summaryType === 'custom'` (see the info type). */
56
+ calculateCustomSummary?: (options: NxePivotCustomSummaryInfo) => void;
57
+ /** Number-mask string (`#,##0.00`), date format string, or `{ type }`. */
58
+ format?: NxeColumnFormat;
59
+ expanded?: boolean;
60
+ sortOrder?: 'asc' | 'desc';
61
+ /** dx: 'value' (default — raw values), 'displayText' (formatted/customizeText'd labels),
62
+ * 'none' (load order). The local-store default is 'value' (XmlaStore's is 'displayText'). */
63
+ sortBy?: 'value' | 'displayText' | 'none';
64
+ /** Column width in px, applied to the field's area column(s) — row-header column for a row
65
+ * field, every leaf data column for a data field (dx m_data_controller cell width). */
66
+ width?: number;
67
+ /** dx: `false` removes a row/column field from its axis entirely and hides a data field's
68
+ * columns (dx keeps hidden measures aggregating for sortBySummaryField etc. — the nxe
69
+ * engine has no such reader, so it drops them from the model wholesale). */
70
+ visible?: boolean;
71
+ /** dx: read INSTEAD of `dataField` wherever the field's raw value is taken from a record
72
+ * (dimension grouping and measure aggregation both) — m_local_store `prepareFields` only
73
+ * builds a dataField selector when none is given (a selector also disables
74
+ * `groupInterval` bucketing entirely, exactly as dx skips such fields). */
75
+ selector?: (data: any) => any;
76
+ customizeText?: (cellInfo: {
77
+ value: any;
78
+ valueText: string;
79
+ }) => string;
80
+ /** dx m_local_store `prepareFields` bucketing (P2-C3): on a `dataType: 'date'` field the
81
+ * named interval replaces the raw value with `getFullYear()` / quarter 1-4 / month 1-12 /
82
+ * day-of-month / `getDay()` 0-6; on a `dataType: 'number'` field a positive numeric step
83
+ * groups to `Math.floor(value / step) * step` (labelled "start - end"). */
84
+ groupInterval?: NxePivotGroupInterval;
85
+ /** dx `summaryDisplayMode` (P2-C3): post-aggregation display expression over the visible
86
+ * cross-tab. Percent modes default the field's format to dx's `'percent'` (precision 0)
87
+ * when no explicit format exists. */
88
+ summaryDisplayMode?: NxePivotSummaryDisplayMode;
89
+ /** dx `calculateSummaryValue` (P2-C3): per-cell post-aggregation callback; wins over
90
+ * `summaryDisplayMode`. Receives the dx-shaped {@link NxePivotSummaryCell}. */
91
+ calculateSummaryValue?: (e: NxePivotSummaryCell) => any;
92
+ /** dx `runningTotal` (P2-C3): accumulate along a 'row' (across columns) or a 'column'
93
+ * (down rows), resetting at group boundaries unless `allowCrossGroupCalculation`. */
94
+ runningTotal?: 'row' | 'column';
95
+ /** dx `allowCrossGroupCalculation` (P2-C3): running totals / variation modes continue
96
+ * across group boundaries instead of resetting. */
97
+ allowCrossGroupCalculation?: boolean;
98
+ /** dx `filterValues` (P2-C3): engine-side record filter, applied at intake before tree
99
+ * building/aggregation — on row/column fields and on `area: 'filter'` fields alike. With
100
+ * `groupInterval` set, values are compared against the GROUP value (dx filters through
101
+ * the prepared selector). */
102
+ filterValues?: any[];
103
+ /** dx `filterType` (default 'include'): 'exclude' inverts the `filterValues` match. */
104
+ filterType?: 'include' | 'exclude';
105
+ [key: string]: any;
106
+ }
107
+ /**
108
+ * P3-C2 (field panel) — one field's panel-owned override, keyed by the field's index in the
109
+ * caller's `fields` array and merged over that field when the component constructs its engine.
110
+ * The caller's field objects are NEVER mutated (report-output-pivot serializes its own fields
111
+ * array in `onSave`); `area: null` marks a REMOVED field (P3-C3: the chooser's All-Fields
112
+ * tree drop or checkbox uncheck — dx's only removal paths; a drop outside every area snaps
113
+ * back and removes nothing) — the field leaves the layout but stays defined (dx: it remains
114
+ * available in the field chooser).
115
+ */
116
+ interface NxePivotFieldOverride {
117
+ area?: NxePivotArea | null;
118
+ areaIndex?: number;
119
+ sortOrder?: 'asc' | 'desc';
120
+ expanded?: boolean;
121
+ /** P3-C4 (chip header filter): the applied allowed-value list; `null` = the user explicitly
122
+ * cleared the filter (full-check → OK), so a declarative `filterValues` seed on the
123
+ * caller's field can't resurrect — the same null rule the grid's hfOverride uses. */
124
+ filterValues?: any[] | null;
125
+ /** Written alongside `filterValues` on apply (always 'include' — see DEFAULTS.md P3-C4). */
126
+ filterType?: 'include' | 'exclude';
127
+ }
128
+ /** dx `dxPivotGrid.texts` — the subset the pivot renders (missing entries take the dx defaults). */
129
+ interface NxePivotTexts {
130
+ grandTotal?: string;
131
+ /** Subtotal-row caption pattern (`{0}` = the closing value) — stored for future subtotal rows. */
132
+ total?: string;
133
+ noData?: string;
134
+ }
135
+ /** DevExtreme's default `texts`, applied wherever the host passes none. */
136
+ declare const NXE_PIVOT_TEXTS_DEFAULTS: Required<NxePivotTexts>;
137
+ /** The plain `[dataSource]` config object the app binds (also accepted: a `NxePivotDataSource`). */
138
+ interface NxePivotDataSourceOptions {
139
+ /** Optional since P1-C3: with no/empty `fields` and `retrieveFields` not `false` (the dx
140
+ * default), fields are derived from the store's first record — all area-less. */
141
+ fields?: NxePivotField[];
142
+ store?: any[];
143
+ retrieveFields?: boolean;
144
+ dataFieldArea?: 'row' | 'column';
145
+ }
146
+ /**
147
+ * A rendered column leaf = (column-path × data-field). Since P2-C2 the column axis is N-level:
148
+ * `kind` mirrors the row kinds — 'D' a value column (a collapsed parent's inline-aggregate
149
+ * column included), 'T' a "{value} Total" subtotal column closing an expanded parent, 'GT' the
150
+ * grand-total column (`colPath: []`).
151
+ */
152
+ interface NxePivotColumnLeaf {
153
+ colPath: any[];
154
+ dataIndex: number;
155
+ /** 'D' value column, 'T' "{value} Total" column, 'GT' the grand-total column. */
156
+ kind: NxePivotRowKind;
157
+ /** Namespaced expand key of the leaf's column node (opaque, `'c:'`…); `''` when no column
158
+ * node backs the leaf (grand total / no column fields). */
159
+ colKey: string;
160
+ /** Level of the column node the leaf renders under (= `colPath.length - 1`; -1 for 'GT'
161
+ * and for the no-column-field leaves). */
162
+ level: number;
163
+ /** Derived alias — `kind === 'GT'` (kept for the pre-P2-C2 model contract). */
164
+ isGrandTotal: boolean;
165
+ }
166
+ /**
167
+ * One column-header cell spanning `colspan` leaf columns. All header rows are DERIVED from the
168
+ * leaf array by run-length encoding over consecutive leaves' `colPath` prefixes (P2-C2), so a
169
+ * span can never misalign with the leaves beneath it. The optional keys are present ONLY when
170
+ * meaningful (dx emits its attributes the same way): `rowspan` when > 1, `isTotal` on
171
+ * "{value} Total" cells, and the expand trio on chevron cells.
172
+ */
173
+ interface NxePivotHeaderCell {
174
+ text: string;
175
+ colspan: number;
176
+ isGrandTotal: boolean;
177
+ /** Set when > 1: a 'T'/'GT'/collapsed-parent cell filling the remaining value rows (dx
178
+ * `depthSize`, m_data_controller). */
179
+ rowspan?: number;
180
+ /** True on "{value} Total" cells (dx `dx-row-total dx-total`, on both axes). */
181
+ isTotal?: boolean;
182
+ /** True when the cell carries an expand/collapse chevron (dx `dx-expand-icon-container`). */
183
+ expandable?: boolean;
184
+ expanded?: boolean;
185
+ /** The column node's namespaced expand key — present exactly when `expandable`. */
186
+ pathKey?: string;
187
+ }
188
+ /** dx `rowHeaderLayout` — 'standard' renders one row-header column per row field; 'tree' one indented column. */
189
+ type NxePivotRowHeaderLayout = 'standard' | 'tree';
190
+ /** dx `showTotalsPrior` — where total rows/columns render relative to the data they close. */
191
+ type NxePivotTotalsPrior = 'none' | 'rows' | 'columns' | 'both';
192
+ /** Body-row kind: 'D' data row, 'T' "{value} Total" subtotal row, 'GT' the grand-total footer. */
193
+ type NxePivotRowKind = 'D' | 'T' | 'GT';
194
+ /**
195
+ * One row-header cell a body `<tr>` renders (standard layout). An EXPANDED parent's label cell
196
+ * attaches to its first child's row and `rowspan`s the subtree (dx semantics: the parent
197
+ * contributes no value row of its own); a collapsed parent / total label `colspan`s the
198
+ * remaining row-header columns.
199
+ */
200
+ interface NxePivotRowHeaderCell {
201
+ text: string;
202
+ /** 0-based row-header column the cell starts in (= its node's level). */
203
+ col: number;
204
+ rowspan: number;
205
+ colspan: number;
206
+ /** True when the cell carries an expand/collapse chevron (a parent node's label). */
207
+ expandable: boolean;
208
+ expanded: boolean;
209
+ /** True for a "{value} Total" label cell (dx `dx-row-total dx-total`). */
210
+ isTotal: boolean;
211
+ pathKey: string;
212
+ }
213
+ /** A visible body row. `rows` carries kinds 'D'/'T' only — the grand total stays the footer. */
214
+ interface NxePivotBodyRow {
215
+ kind: NxePivotRowKind;
216
+ label: string;
217
+ level: number;
218
+ path: any[];
219
+ pathKey: string;
220
+ hasChildren: boolean;
221
+ expanded: boolean;
222
+ /** Derived alias — `kind === 'GT'` (always false in `rows`; kept for facade parity). */
223
+ isGrandTotal: boolean;
224
+ /** Row-header cells this row renders (standard: 0..n cells; tree: exactly one). */
225
+ headerCells: NxePivotRowHeaderCell[];
226
+ /** `dataFieldArea: 'row'` with ≥2 measures (P2-C3): the measure this row renders — every
227
+ * axis row splits into one row per data field, exactly as dx appends metric children to
228
+ * each row header item (m_data_controller; with ONE measure the level is omitted, same
229
+ * rule as columns). Absent on the default measures-on-columns model. */
230
+ dataIndex?: number;
231
+ /** The measure-caption cell text of a measures-on-rows row (tree layout renders it as the
232
+ * second row-header column; standard layout also carries it inside `headerCells`). */
233
+ measureCaption?: string;
234
+ /** Measures-on-rows tree layout: the dimension label cell's rowspan on the FIRST measure
235
+ * row of each axis row; `0` on continuation rows (no dimension cell at all). Absent on
236
+ * the default model — the renderer treats absent as a plain single-row label. */
237
+ measureRowspan?: number;
238
+ /** Unique per rendered row (pathKey alone repeats once measure rows split); the template
239
+ * tracks `trackKey ?? pathKey`. Absent on the default model. */
240
+ trackKey?: string;
241
+ }
242
+ /**
243
+ * The fully-computed cross-tab the grid renders and the Excel export walks. `cell()` resolves
244
+ * an aggregated value for a (rowPath × leaf) intersection; `text()` formats it for display.
245
+ */
246
+ interface NxePivotModel {
247
+ rowFields: NxePivotField[];
248
+ columnFields: NxePivotField[];
249
+ dataFields: NxePivotField[];
250
+ cornerText: string;
251
+ /** Column-area header rows (excludes the top-left corner). Last row = data-field captions. */
252
+ columnHeaderRows: NxePivotHeaderCell[][];
253
+ leaves: NxePivotColumnLeaf[];
254
+ rows: NxePivotBodyRow[];
255
+ /** Resolved layout (`'tree'` when the caller passes none — the pre-parity model contract). */
256
+ rowHeaderLayout: NxePivotRowHeaderLayout;
257
+ /** Row-header `<th>` columns: standard → one per row field (min 1); tree → 1. */
258
+ rowHeaderColCount: number;
259
+ /** Resolved dx flags, round-tripped so callers/goldens can pin them. `showRowTotals`
260
+ * renders only in standard layout (dx: "applies only if rowHeaderLayout is standard");
261
+ * `showColumnTotals` renders "{value} Total" columns on the N-level column axis (P2-C2). */
262
+ showRowTotals: boolean;
263
+ showColumnTotals: boolean;
264
+ showTotalsPrior: NxePivotTotalsPrior;
265
+ showRowGrandTotals: boolean;
266
+ /** Grand-total footer cells (row grand total), one per leaf — present when enabled and
267
+ * measures live on columns (the default). Null when `grandTotalRows` carries the footer. */
268
+ grandTotalCells: {
269
+ value: number | null;
270
+ text: string;
271
+ }[] | null;
272
+ /** Measures-on-rows footer (P2-C3): one footer row per data field, replacing
273
+ * `grandTotalCells` when `dataFieldArea: 'row'` with ≥2 measures is active. */
274
+ grandTotalRows?: {
275
+ dataIndex: number;
276
+ caption: string;
277
+ cells: {
278
+ value: number | null;
279
+ text: string;
280
+ }[];
281
+ }[] | null;
282
+ /** Resolved `dataFieldArea` ('column' unless overridden — dx m_widget default). */
283
+ dataFieldArea?: 'row' | 'column';
284
+ /** Per-table-column px widths (`field.width`), aligned to `rowHeaderColCount` row-header
285
+ * columns followed by `leaves` — `null` where no width is configured. */
286
+ colWidths: (number | null)[];
287
+ /** W4 Lane 4: per-leaf FORMATTED column labels, one entry per `colPath` level (`[]` for
288
+ * the grand-total and no-column-field leaves) — `bindChart` series naming. */
289
+ colLabels: string[][];
290
+ /** Resolved display strings ({@link NXE_PIVOT_TEXTS_DEFAULTS} merged under any `texts` input). */
291
+ texts: Required<NxePivotTexts>;
292
+ /** Dense value matrix built once per `getModel()`: `matrix[r][l]` = `rows[r]` × `leaves[l]`
293
+ * (subtotal rows/columns included; the grand-total ROW stays `grandTotalCells`).
294
+ * Typed escape (W4 Lane 4): a `summaryType: 'custom'` cell renders whatever the callback
295
+ * left in `totalValue` — a NON-NUMERIC value (dx allows it) rides through these slots at
296
+ * runtime; `text()`/the export pass such values through as text. */
297
+ matrix: (number | null)[][];
298
+ /** `matrix` formatted per each leaf's data field — what the DOM and the export render. */
299
+ textMatrix: string[][];
300
+ cell(rowPath: any[], leaf: NxePivotColumnLeaf): number | null;
301
+ text(rowPath: any[], leaf: NxePivotColumnLeaf): string;
302
+ numFmt(dataIndex: number): string | undefined;
303
+ }
304
+ /**
305
+ * W4 Lane 2 — the dx `PivotGridCell` subset the outputs carry (transcribed from
306
+ * m_data_controller getCellsInfo / getViewHeaderItems, 24.2.3). A DATA cell carries the
307
+ * rowPath/columnPath/dataIndex/value/text/rowType/columnType block; a HEADER cell carries
308
+ * text/type/expanded (+ `path` where the cell owns an expand key — a narrowing recorded in
309
+ * DEFAULTS.md: dx paths every header cell, nxe paths the expandable ones).
310
+ */
311
+ interface NxePivotCellData {
312
+ /** Cell text as rendered. */
313
+ text?: string;
314
+ /** Header cells: the cell's value path along its axis (see the interface note). */
315
+ path?: any[];
316
+ /** Header cells: 'D' value, 'T' "{value} Total", 'GT' grand total (dx `type`). */
317
+ type?: NxePivotRowKind;
318
+ /** Header cells: expand state (present on expandable cells, like dx's `expanded`). */
319
+ expanded?: boolean;
320
+ colspan?: number;
321
+ rowspan?: number;
322
+ /** Data cells: the aggregated value (post display-mode/running-total, as rendered). */
323
+ value?: any;
324
+ /** Data cells: the row's axis path (`[]` on the grand-total row). */
325
+ rowPath?: any[];
326
+ /** Data cells: the column leaf's axis path (`[]` on the grand-total column). */
327
+ columnPath?: any[];
328
+ /** Data cells: the row's kind — 'D' | 'T' | 'GT' (dx `rowType`). */
329
+ rowType?: NxePivotRowKind;
330
+ /** Data cells: the column leaf's kind (dx `columnType`). */
331
+ columnType?: NxePivotRowKind;
332
+ /** Data cells: index of the cell's data field among ALL data fields (dx `dataIndex`). */
333
+ dataIndex?: number;
334
+ dataType?: NxePivotField['dataType'];
335
+ format?: NxeColumnFormat;
336
+ }
337
+ /**
338
+ * dx `onCellClick` / `onCellPrepared` payload (m_widget `_createCellArgs`): the area, the
339
+ * DOM-ish indices, the cell element, the cell data, and the three field lists. `onCellClick`
340
+ * is CANCELABLE: setting `cancel: true` in a handler prevents the expand/collapse a chevron
341
+ * click would perform (dx gates its own toggle on `!args.cancel`).
342
+ */
343
+ interface NxePivotCellEvent {
344
+ area: 'row' | 'column' | 'data';
345
+ /** DOM `tr.rowIndex` on clicks (dx `_createCellArgs`); model-local row on prepared. */
346
+ rowIndex: number;
347
+ /** DOM `cell.cellIndex` on clicks; model-local column on prepared. */
348
+ columnIndex: number;
349
+ cellElement?: HTMLElement | null;
350
+ cell: NxePivotCellData;
351
+ rowFields: NxePivotField[];
352
+ columnFields: NxePivotField[];
353
+ dataFields: NxePivotField[];
354
+ /** The originating DOM event (clicks only). */
355
+ event?: Event;
356
+ /** onCellClick only — set true to cancel the chevron's expand/collapse. */
357
+ cancel?: boolean;
358
+ }
359
+ /** dx `onOptionChanged` payload subset ({name, fullName, value, previousValue}). */
360
+ interface NxePivotOptionChangedEvent {
361
+ name: string;
362
+ fullName: string;
363
+ value: any;
364
+ previousValue: any;
365
+ component?: NxePivotGridInstance;
366
+ }
367
+ /** dx `onContentReady` payload subset. */
368
+ interface NxePivotContentReadyEvent {
369
+ component: NxePivotGridInstance;
370
+ element: HTMLElement;
371
+ }
372
+ /** dx `onExporting` payload (ExportController.exportTo, m_export.js): cancelable, and the
373
+ * handler may rewrite `fileName` (dx default 'PivotGrid'). */
374
+ interface NxePivotExportingEvent {
375
+ fileName: string;
376
+ cancel: boolean;
377
+ component?: NxePivotGridInstance;
378
+ }
379
+ /** The `.instance` facade the chart exposes (target of `bindChart`). */
380
+ interface NxeChartInstance {
381
+ readonly _isNxeChart: true;
382
+ /** Push pivot-derived series data; `bindChart` calls this. */
383
+ render(series: NxeChartSeries): void;
384
+ }
385
+ /** Series payload handed to the chart by `bindChart`. */
386
+ interface NxeChartSeries {
387
+ /** X-axis category labels (the pivot column leaves / row leaves). */
388
+ categories: string[];
389
+ /** One series per data field; `values` aligned to `categories`. */
390
+ series: {
391
+ name: string;
392
+ values: number[];
393
+ }[];
394
+ }
395
+ /**
396
+ * W4 Lane 4 — the dx `bindChart` integration options subset (m_chart_integration.js).
397
+ * The nxe chart renders ONE pane and ONE value axis, and its fixed orientation equals dx's
398
+ * `inverted: true` mapping (rows → categories/arguments, column leaves → series) — the
399
+ * established nxe contract since P1 (DEFAULTS.md). Consequences:
400
+ * - `dataFieldsDisplayMode` ('singleAxis' | 'splitAxes' | 'splitPanes', dx default
401
+ * 'splitAxes'): accepted; no structural effect on a single-pane single-axis chart.
402
+ * - `alternateDataFields` (dx default true): orders multi-measure series — column-major with
403
+ * the measure inner (true) or measure-major (false), dx's data-item interleaving.
404
+ * - `putDataFieldsInto` ('series' default | 'args' | 'both'): with 2+ measures, where the
405
+ * ` | {measure caption}` suffix lands — on the series names, on the category labels
406
+ * (which then split per measure), or both (dx: sparse items; nxe fills mismatches with 0).
407
+ */
408
+ interface NxePivotBindChartOptions {
409
+ dataFieldsDisplayMode?: 'singleAxis' | 'splitAxes' | 'splitPanes';
410
+ alternateDataFields?: boolean;
411
+ putDataFieldsInto?: 'series' | 'args' | 'both';
412
+ [key: string]: any;
413
+ }
414
+ /** The pivot-grid `.instance` facade (DevExtreme parity). */
415
+ interface NxePivotGridInstance {
416
+ getDataSource(): {
417
+ reload(): void;
418
+ };
419
+ bindChart(chart: NxeChartInstance | any, options?: NxePivotBindChartOptions | any): void;
420
+ /** Export hook — the current computed cross-tab model (null until data loads). */
421
+ getExportModel(): NxePivotModel | null;
422
+ /** dx parity: RENDER-ONLY re-render/re-layout (dx Widget.repaint never touches the data
423
+ * source) — re-runs the measurement pass; expand/layout state and aggregates are kept
424
+ * (W4 Lane 1; the pre-W4 facade re-aggregated and wiped chevron state). */
425
+ repaint(): void;
426
+ /**
427
+ * Expand every node on BOTH axes (oracle §e: dx's toolbar expand-all sets `expanded` on
428
+ * every row+column field and reloads) and wipe the per-node chevron overrides. Optional
429
+ * ONLY because pre-P1-C3 spec literals implement this interface without it — the real
430
+ * component always provides both.
431
+ */
432
+ expandAll?(): void;
433
+ /** Collapse-all counterpart of {@link expandAll} (same override-wipe semantics). */
434
+ collapseAll?(): void;
435
+ /**
436
+ * W4 Lane 2 — dx `exportToExcel()` (the built-in export path, m_export.js `exportTo`):
437
+ * fires the cancelable `onExporting` (default fileName 'PivotGrid', the handler may
438
+ * rename), then drives the standard `exportPivotGrid({component})` pipeline into an
439
+ * in-house workbook and saves `<fileName>.xlsx`. Optional for the same reason as
440
+ * {@link expandAll} (pre-existing spec literals implement this interface).
441
+ */
442
+ exportToExcel?(): Promise<void>;
443
+ /**
444
+ * W4 Lane 2 — dx `option(name[, value])` for the DOCUMENTED pivot options that map to
445
+ * component inputs (allowExpandAll, allowFiltering, allowSorting, allowSortingBySummary,
446
+ * dataFieldArea, height, rowHeaderLayout, showBorders, showColumnGrandTotals,
447
+ * showColumnTotals, showRowGrandTotals, showRowTotals, showTotalsPrior, texts,
448
+ * wordWrapEnabled). One-arg = get (also supports 'dataSource', get-only); two-arg = set,
449
+ * recorded as an override that WINS over the input binding and fires `onOptionChanged`.
450
+ * Unsupported names (dataSource set, nested 'a.b' paths, fieldChooser/fieldPanel/
451
+ * stateStoring/scrolling — those live on projected config children) are ignored on set
452
+ * and return undefined on get (DEFAULTS.md).
453
+ */
454
+ option?(name: string, value?: any): any;
455
+ /** W4 Lane 2 — dx `updateDimensions()`: re-runs the render/measurement pass (the band
456
+ * anchor / dimension sync), exactly like `repaint()` minus dx's full re-render. */
457
+ updateDimensions?(): void;
458
+ /** W4 Lane 2 — dx `getFieldChooserPopup()` narrowed to the two members anyone calls:
459
+ * `show()` opens the chooser overlay (a no-op re-show when already open, dx-true),
460
+ * `hide()` disposes it. */
461
+ getFieldChooserPopup?(): {
462
+ show(): void;
463
+ hide(): void;
464
+ };
465
+ }
466
+
467
+ /** Options for {@link exportPivotGrid} — mirrors DevExtreme's `exportPivotGrid({component, worksheet})`. */
468
+ interface NxeExportPivotGridOptions {
469
+ component: NxePivotGridInstance;
470
+ /** exceljs `Worksheet` or the in-house one (structural cousins, loosely typed). */
471
+ worksheet: any;
472
+ /** 1-based {row, column} the cross-tab starts at (default top-left of the sheet). */
473
+ topLeftCell?: {
474
+ row: number;
475
+ column: number;
476
+ };
477
+ }
478
+ /**
479
+ * Replacement for DevExtreme's `exportPivotGrid({component, worksheet})` (from
480
+ * `devextreme/excel_exporter`). Walks the pivot's computed cross-tab model — stacked column
481
+ * headers (colspan AND rowspan merges — N-level column hierarchies, subtotal/grand-total
482
+ * columns, P2-C2), the row headers (standard layout: one column per row field with
483
+ * rowspan/colspan merges + "{value} Total" rows; tree layout: one indented column), the data
484
+ * cells, and the grand-total footer — into the supplied exceljs worksheet, then resolves. The
485
+ * caller keeps the surrounding `formatExcel(workbook)` + `writeBuffer()` + `saveAs()` pipeline
486
+ * unchanged (drop-in import swap).
487
+ */
488
+ declare function exportPivotGrid(opts: NxeExportPivotGridOptions): Promise<void>;
489
+ /** Injectable wrapper for {@link exportNxeGridToExcel} / {@link exportPivotGrid}. */
490
+ declare class NxeExcelExportService {
491
+ exportDataGrid(grid: NxeGridInstance, opts: NxeExcelExportOptions): Promise<void>;
492
+ exportPivotGrid(opts: NxeExportPivotGridOptions): Promise<void>;
493
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NxeExcelExportService, never>;
494
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<NxeExcelExportService>;
495
+ }
496
+
497
+ interface NxePivotModelOptions {
498
+ /** Field-level expansion is seeded from `field.expanded`; these are per-node chevron overrides. */
499
+ expandedOverrides: ReadonlyMap<string, boolean>;
500
+ /**
501
+ * Facade expand-all/collapse-all state: `true`/`false` behaves as if EVERY row+column
502
+ * field's `expanded` were set to it (oracle §e — dx's toolbar buttons set `expanded` on all
503
+ * fields of both axes and reload); `undefined` follows the fields. Per-node
504
+ * `expandedOverrides` still win on top (the caller wipes them when toggling this).
505
+ */
506
+ allExpanded?: boolean;
507
+ showRowGrandTotals: boolean;
508
+ showColumnGrandTotals: boolean;
509
+ /**
510
+ * dx `rowHeaderLayout`. Defaults to 'tree' — the pre-parity model contract (callers that
511
+ * predate the flag keep their flat parent-inline rows); the component always passes its
512
+ * own input, whose default is dx's 'standard'.
513
+ */
514
+ rowHeaderLayout?: NxePivotRowHeaderLayout;
515
+ /** dx `showRowTotals` (default true). Renders only in standard layout, exactly as dx:
516
+ * "applies only if rowHeaderLayout is 'standard'" — tree layout ignores it. */
517
+ showRowTotals?: boolean;
518
+ /** dx `showColumnTotals` (default true): "{value} Total" columns close expanded column
519
+ * parents (active since P2-C2 — the column axis renders all N levels). */
520
+ showColumnTotals?: boolean;
521
+ /** dx `showTotalsPrior` (default 'none'); 'rows'/'both' place each "{value} Total" row
522
+ * BEFORE its children, 'columns'/'both' each "{value} Total" column BEFORE its children. */
523
+ showTotalsPrior?: NxePivotTotalsPrior;
524
+ /** Display strings (dx `texts`); merged over {@link NXE_PIVOT_TEXTS_DEFAULTS}. */
525
+ texts?: NxePivotTexts;
526
+ /** dx widget `dataFieldArea` (default 'column'); 'row' moves the measures onto the row
527
+ * axis as its innermost level when ≥2 exist (P2-C3). Falls back to the data-source
528
+ * options' own `dataFieldArea` when unset here. */
529
+ dataFieldArea?: 'row' | 'column';
530
+ }
531
+ declare class NxePivotDataSource {
532
+ private readonly options;
533
+ private readonly agg;
534
+ /**
535
+ * Records that survived `filterValues` and reached the axis trees — the analogue of dx's
536
+ * loaded row matrix (`data.values`), which `isEmpty()` tests. Deliberately NOT `agg.size`:
537
+ * a record whose measure is null/non-numeric builds axis nodes but no aggregate.
538
+ */
539
+ private loadedCount;
540
+ private rowTree;
541
+ /** Column-axis roots (display order) — all N levels render since P2-C2. */
542
+ private colTree;
543
+ /** The column axis tree (node lookup by pathKey for the header run-length derivation). */
544
+ private colAxis;
545
+ /** The row axis tree (W4 Lane 2: expand-key → value-path lookups for event payloads). */
546
+ private rowAxis;
547
+ /** Store-derived fields when no explicit fields were given (dx `retrieveFields` default). */
548
+ private readonly derivedFields;
549
+ /** The normalized clones (caption defaulted, area lower-cased), aligned 1:1 with
550
+ * `fields()` — the field panel reads chips/sort state here (P3-C2). */
551
+ private readonly normalizedFields;
552
+ readonly rowFields: NxePivotField[];
553
+ readonly columnFields: NxePivotField[];
554
+ /** ALL data-area fields incl. `visible: false` ones (dx `descriptions.values`) — hidden
555
+ * measures aggregate and stay addressable by their dataIndex; only rendering skips them. */
556
+ readonly dataFields: NxePivotField[];
557
+ /** The data fields that actually RENDER (leaves, captions, footers, export, chart). */
558
+ private readonly visibleDataFields;
559
+ /** `area: 'filter'` fields — they exist solely to carry `filterValues` (P2-C3). */
560
+ readonly filterFields: NxePivotField[];
561
+ constructor(options: NxePivotDataSourceOptions);
562
+ /** DevExtreme parity: `getDataSource().reload()` re-aggregates the (possibly mutated) store. */
563
+ reload(): void;
564
+ fields(): NxePivotField[];
565
+ /**
566
+ * P3-C2 (field panel): one panel area's chips — the area's VISIBLE fields in `areaIndex`
567
+ * order, each carrying its index in the `fields()` array (the panel's override key) and its
568
+ * normalized clone (caption defaulted, area lower-cased). `visible: false` fields never
569
+ * chip, matching dx's panel/chooser (m_field_chooser_base `getAreaFields` filters
570
+ * `visible !== false` for EVERY area — data/filter included, unlike the aggregation arrays,
571
+ * which keep hidden data/filter fields working).
572
+ *
573
+ * P3-C4: `includeHidden` mirrors dx m_data_source's module-local `getAreaFields`
574
+ * (`canAddFieldInArea = area === 'data' || field.visible !== false`) — the areaIndex
575
+ * RENUMBERING after a drop runs over the DATA area's hidden fields too (dx
576
+ * `_createDescriptions` → `normalizeIndexes(getAreaFields(fields, areaName), 'areaIndex')`),
577
+ * while hidden row/column/filter fields stay outside the numbering, dx-true.
578
+ */
579
+ areaFields(area: NxePivotArea, includeHidden?: boolean): {
580
+ fieldIndex: number;
581
+ field: NxePivotField;
582
+ }[];
583
+ /**
584
+ * P3-C4 (chip header filter) — dx `getFieldValues(index)` (m_data_source.js:524) scoped to
585
+ * the local store: the field's DISTINCT PREPARED values (the `groupInterval` group value
586
+ * where one is set — dx loads the field as a lone expanded column through prepareFields)
587
+ * with their display labels (`fieldText`: interval labels, date formats, customizeText),
588
+ * sorted ascending by raw value. Built from the UNFILTERED store: dx passes `filters: []`
589
+ * unless `headerFilter.showRelevantValues` is on (default false — the nxe panel always
590
+ * shows the full list, exactly like the grid's non-cascading lists), and the field's own
591
+ * `filterValues` are always ignored (`filterValues: null` on the load field). Dedupe is
592
+ * by `valueOf()` (dates by instant), the dx grouping key.
593
+ */
594
+ getFieldValues(index: number): {
595
+ value: any;
596
+ text: string;
597
+ }[];
598
+ /** The normalized clone of `fields()[index]` (P3-C2 — chip captions/sort state read here). */
599
+ fieldAt(index: number): NxePivotField | undefined;
600
+ /**
601
+ * P3-C2 (field panel): a NEW data source over the SAME store/options with `fields`
602
+ * replacing the field list — how the component applies its fieldOverride merge without
603
+ * ever touching the caller's options (report-output-pivot serializes its own fields
604
+ * array in `onSave`).
605
+ */
606
+ cloneWithFields(fields: NxePivotField[]): NxePivotDataSource;
607
+ /**
608
+ * dx m_local_store `areValuesEqual`, verbatim: `valueOf()` comparison (dates by time), and
609
+ * an ARRAY filter value compares element-wise (dx's `levels` shape — kept for parity even
610
+ * though nxe has no grouped hierarchy fields).
611
+ */
612
+ private static areValuesEqual;
613
+ /**
614
+ * dx m_local_store `createDimensionFilters` + `createFilter` (P2-C3): one predicate per
615
+ * row/column/filter-area field with a non-empty `filterValues`, comparing the PREPARED
616
+ * value (the group value when `groupInterval` is set) against each filter value;
617
+ * `filterType: 'exclude'` inverts. Returns null when nothing filters — the fast path.
618
+ */
619
+ private buildRecordFilter;
620
+ private build;
621
+ /**
622
+ * W4 Lane 2: resolve a namespaced expand key (`'r:'`/`'c:'` + encoded value path) back to
623
+ * its node's raw value path — the `path` a dx header-cell event payload carries. Returns
624
+ * null for an unknown/empty key (e.g. the grand-total pseudo cells, which have no node).
625
+ */
626
+ nodePath(pathKey: string): any[] | null;
627
+ /**
628
+ * W4 Lane 3 — dx `isEmpty()` (m_data_source.js): `!dataFields.length || !data.values.length`.
629
+ * dx's `data.values` is the LOADED row matrix, which exists for every record regardless of
630
+ * whether its measure aggregated to a number, so this counts loaded records rather than
631
+ * aggregates: a store whose only measure is text (or null throughout) still renders its full
632
+ * cross-tab with blank cells in dx — testing `agg.size` instead stamped "No data" over it.
633
+ */
634
+ isEmpty(): boolean;
635
+ /**
636
+ * dx custom-summary protocol (m_local_store `getAggregator`), run per aggregated cell: ONE
637
+ * options object per cell is passed through 'start', then 'calculate' once per defined raw
638
+ * value (`options.value` set), then 'finalize' (`options.value` deleted); the cell's result
639
+ * is whatever the callback left in `totalValue`. dx interleaves the 'calculate' calls of
640
+ * different cells while streaming records; nxe runs each cell's protocol contiguously after
641
+ * the load — the per-cell sequence (dx's documented contract) is identical.
642
+ */
643
+ private runCustomSummaries;
644
+ /**
645
+ * Sort one axis level in place, honouring `sortOrder` + `sortBy` (dx m_data_source_utils
646
+ * `getMemberForSortBy`): default/'value' compares the raw values, 'displayText' compares the
647
+ * formatted labels (format + customizeText already applied), 'none' keeps load order
648
+ * (reversed for desc — dx compares the load index).
649
+ */
650
+ private sortLevel;
651
+ private compareValues;
652
+ private sortTree;
653
+ /** Raw aggregate at (rowPath × colPath × data field) — the pre-display-mode value. */
654
+ private valueAt;
655
+ cell(rowPath: any[], leaf: NxePivotColumnLeaf): number | null;
656
+ text(rowPath: any[], leaf: NxePivotColumnLeaf): string;
657
+ numFmt(dataIndex: number): string | undefined;
658
+ /** Build the renderable/exportable cross-tab model for the given expand state + totals flags. */
659
+ getModel(opts: NxePivotModelOptions): NxePivotModel;
660
+ /**
661
+ * Recursive column-leaf emission over the N-level column tree — the ONE place the visible
662
+ * column order is decided; header rows are derived from its output. dx semantics (oracle §a
663
+ * mirrored to columns + `oracle/hierarchy-*-matrix.json`; dx m_data_controller
664
+ * `getViewHeaderItems`): an EXPANDED parent contributes no value column of its own — its
665
+ * children render, and (with `showColumnTotals`) a "{value} Total" column carrying the
666
+ * parent's aggregates closes the group AFTER the children (dx splices the 'T' item as a
667
+ * sibling at `index + 1`; `showTotalsPrior` 'columns'/'both' splices at `index`, i.e.
668
+ * BEFORE). A COLLAPSED parent is a single 'D' column with inline aggregates. The grand
669
+ * total stays LAST regardless of totalsPrior — the established nxe deviation (DEFAULTS.md:
670
+ * dx would move it first, as it moves the grand-total row on the row axis).
671
+ */
672
+ private buildLeaves;
673
+ /**
674
+ * The header cell above leaf-run position `r` exists iff this returns non-null; leaves with
675
+ * EQUAL ids at row `r` merge into one run-length cell. A 'D' prefix id merges an expanded
676
+ * parent's label over its whole visible subtree (children's 'T' columns included — capture:
677
+ * colSpan 21 spans nested totals); the parent's OWN 'T' leaf and the 'GT' leaves carry
678
+ * distinct ids so they never fold into a value cell.
679
+ */
680
+ private headerIdAt;
681
+ /** Materialize the run-length cell for `span` consecutive leaves starting at `leaf`, row `r`. */
682
+ private headerCellAt;
683
+ /**
684
+ * Header rows DERIVED from the leaf array by run-length encoding — never a second
685
+ * independent walk of the column tree, so span/leaf misalignment is structurally
686
+ * impossible. Value rows = the deepest visible level (dx `depthSize`); the measure-caption
687
+ * row is appended LAST and ONLY when two or more data fields exist (oracle §b: with exactly
688
+ * one measure dx drops the caption row entirely — `oracle/single-measure-matrix.json`).
689
+ */
690
+ private buildColumnHeaders;
691
+ /**
692
+ * `dataFieldArea: 'row'` with ≥2 measures (P2-C3): split every body row into one row per
693
+ * data field — dx appends metric children (caption / `dataIndex` / `isMetric`, type
694
+ * inherited) to EVERY row header item, D, T and GT alike (m_data_controller
695
+ * getViewHeaderItems). The dimension label cells attach to the FIRST measure row with
696
+ * their rowspans multiplied (each underlying axis row now spans M rendered rows); every
697
+ * measure row appends the caption cell as the innermost row-header column.
698
+ */
699
+ private splitRowsByMeasures;
700
+ /**
701
+ * P2-C3: run the dx post-aggregation passes (`summaryDisplayMode` / `calculateSummaryValue`
702
+ * via applyDisplaySummaryMode, then `runningTotal` via applyRunningTotal — the
703
+ * m_data_source._update ordering) over the VISIBLE axis trees of this model build. dx
704
+ * computes these on its loaded data, which only contains children for expanded paths — the
705
+ * visible tree IS dx's loaded tree, so prev/next/children navigation and group-boundary
706
+ * resets see exactly what dx sees. Returns null (the untouched fast path) when no data
707
+ * field opts in or nothing aggregated.
708
+ */
709
+ private buildPostProcessed;
710
+ /** Visible-tree projection of one axis (collapsed nodes stay leaves), dx loaded-data shape. */
711
+ private buildSummaryNodes;
712
+ /** Tree layout (and the pre-parity default): one indented column, parents inline with aggregates. */
713
+ private flattenTreeRows;
714
+ /**
715
+ * Standard layout (dx default): N row-header columns. An EXPANDED parent contributes no
716
+ * value row — its label cell rowspans its children's rows, its own tr carries the first
717
+ * child's values, and (with `showRowTotals`) a full-width "{value} Total" row closes the
718
+ * group AFTER the children (`totalsPrior` moves it before). A COLLAPSED parent is one row:
719
+ * label colspans the remaining header columns, aggregates inline.
720
+ */
721
+ private flattenStandardRows;
722
+ private isExpanded;
723
+ }
724
+
725
+ /**
726
+ * `nxe-state-storing` — accepts DevExtreme `dxo-state-storing` config (orbit addition).
727
+ *
728
+ * LIVE since P3-C4 for `type: 'custom'`: `NxePivotGridComponent` contentChild's this and (a)
729
+ * fires `customSave(state)` after every layout mutation — panel/chooser chip drag, sort
730
+ * toggle, header-filter apply, chooser check/uncheck, facade expandAll/collapseAll — with a
731
+ * dx-shaped state whose `fields` are the serialized effectiveFields (the POST-drag layout,
732
+ * FULL field copies — see buildStorageState), and (b) honors `customLoad` once
733
+ * on init (value or Promise, per dx's `fromPromise` contract). The `localStorage`/
734
+ * `sessionStorage` types and `storageKey` remain accepted-but-inert (DEFAULTS.md, dated
735
+ * P3-C4 rows — including the missing dx `savingTimeout` debounce).
736
+ */
737
+ declare class NxeStateStoringComponent {
738
+ readonly enabled: _angular_core.InputSignal<boolean>;
739
+ readonly type: _angular_core.InputSignal<"custom" | "localStorage" | "sessionStorage">;
740
+ readonly storageKey: _angular_core.InputSignal<string>;
741
+ readonly customSave: _angular_core.InputSignal<(state: any) => void>;
742
+ readonly customLoad: _angular_core.InputSignal<() => any>;
743
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NxeStateStoringComponent, never>;
744
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NxeStateStoringComponent, "nxe-state-storing", never, { "enabled": { "alias": "enabled"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "storageKey": { "alias": "storageKey"; "required": false; "isSignal": true; }; "customSave": { "alias": "customSave"; "required": false; "isSignal": true; }; "customLoad": { "alias": "customLoad"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
745
+ }
746
+ /**
747
+ * `nxe-field-panel` — DevExtreme `dxo-field-panel` config (orbit addition), LIVE since P3-C2:
748
+ * `NxePivotGridComponent` contentChild's it and renders `nxe-pivot-field-panel` above the
749
+ * cross-tab when `visible` is true.
750
+ *
751
+ * Defaults are dx's `fieldPanel` defaults (dxPivotGrid docs, verified 2026-09-02): `visible`
752
+ * FALSE — nothing renders unless the host opts in (the calc tabs project no `nxe-field-panel`
753
+ * at all) — and the five feature flags TRUE. report-output-pivot binds all six from its saved
754
+ * `panelConfig`; an `undefined` bound into a flag is treated as "not false" (= the dx default)
755
+ * by the pivot's template, so a not-yet-loaded config never blanks an area.
756
+ */
757
+ declare class NxeFieldPanelComponent {
758
+ readonly visible: _angular_core.InputSignal<boolean>;
759
+ readonly showDataFields: _angular_core.InputSignal<boolean>;
760
+ readonly showRowFields: _angular_core.InputSignal<boolean>;
761
+ readonly showColumnFields: _angular_core.InputSignal<boolean>;
762
+ readonly showFilterFields: _angular_core.InputSignal<boolean>;
763
+ readonly allowFieldDragging: _angular_core.InputSignal<boolean>;
764
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NxeFieldPanelComponent, never>;
765
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NxeFieldPanelComponent, "nxe-field-panel", never, { "visible": { "alias": "visible"; "required": false; "isSignal": true; }; "showDataFields": { "alias": "showDataFields"; "required": false; "isSignal": true; }; "showRowFields": { "alias": "showRowFields"; "required": false; "isSignal": true; }; "showColumnFields": { "alias": "showColumnFields"; "required": false; "isSignal": true; }; "showFilterFields": { "alias": "showFilterFields"; "required": false; "isSignal": true; }; "allowFieldDragging": { "alias": "allowFieldDragging"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
766
+ }
767
+
768
+ /** One rendered chip. `sortOrder` is the EFFECTIVE order (dx: fields sort asc by default). */
769
+ interface NxePivotPanelChip {
770
+ fieldIndex: number;
771
+ caption: string;
772
+ sortOrder: 'asc' | 'desc';
773
+ sortable: boolean;
774
+ /** P3-C4: the chip renders the `.dx-header-filter` funnel (never on data-area chips). */
775
+ filterable: boolean;
776
+ /** A filter is applied (`filterValues` non-empty) — full-alpha funnel, no `-empty` class. */
777
+ filterActive: boolean;
778
+ }
779
+ /** A funnel click — the pivot opens the shared header-filter panel anchored to the chip. */
780
+ interface NxePivotFilterOpenEvent {
781
+ fieldIndex: number;
782
+ /** The chip element (dx anchors the popup to `e.currentTarget`, the chip itself). */
783
+ origin: HTMLElement;
784
+ }
785
+ /**
786
+ * One chip's model, shared by the panel and the chooser (P3-C4). Per-field flag precedence is
787
+ * dx m_widget `_updateCalculatedOptions`: the widget-level allowSorting/allowFiltering value
788
+ * stamps a field only while the field's own value is undefined — an explicit `false` opts the
789
+ * field out under a permissive widget, an explicit `true` opts it in under a restrictive one.
790
+ * The DATA area never sorts by click (that is allowSortingBySummary's context-menu territory)
791
+ * and never funnels (dx renderField skips both states for `field.area === 'data'`,
792
+ * m_field_chooser_base). `filterActive` mirrors dx `_isHeaderFilterEmpty` inverted.
793
+ */
794
+ declare function buildChip(fieldIndex: number, field: NxePivotField, group: NxePivotArea, widgetAllowSorting: boolean, widgetAllowFiltering: boolean): NxePivotPanelChip;
795
+ interface PanelArea {
796
+ group: NxePivotArea;
797
+ chips: NxePivotPanelChip[];
798
+ emptyText: string;
799
+ }
800
+ /**
801
+ * A chip drop or chooser toggle. `area: null` = REMOVE the field from the layout — emitted
802
+ * only by the chooser (a drop on its All-Fields tree, or a checkbox uncheck). dx m_sortable
803
+ * fires no change at all for a release outside every group's fields box (the chip snaps
804
+ * back), so the PANEL never emits null: an off-panel release is a no-op — corrected in P3-C3
805
+ * (the P3-C2 cut mis-transcribed outside-drop as removal).
806
+ */
807
+ interface NxePivotFieldMoveEvent {
808
+ fieldIndex: number;
809
+ area: NxePivotArea | null;
810
+ areaIndex: number;
811
+ }
812
+ declare class NxePivotFieldPanelComponent implements OnDestroy {
813
+ /** The pivot's CURRENT engine — overrides already merged, so chips track every mutation. */
814
+ readonly engine: _angular_core.InputSignal<NxePivotDataSource>;
815
+ readonly showFilterFields: _angular_core.InputSignal<boolean>;
816
+ readonly showDataFields: _angular_core.InputSignal<boolean>;
817
+ readonly showColumnFields: _angular_core.InputSignal<boolean>;
818
+ readonly showRowFields: _angular_core.InputSignal<boolean>;
819
+ readonly allowFieldDragging: _angular_core.InputSignal<boolean>;
820
+ /** dx widget `allowSorting` (default false): chip click toggles the field's sortOrder.
821
+ * A field's own `allowSorting` overrides it (dx m_widget `_updateCalculatedOptions`
822
+ * stamps the widget flag onto a field only while the field's own value is undefined). */
823
+ readonly allowSorting: _angular_core.InputSignal<boolean>;
824
+ /** dx widget `allowFiltering` (default false, P3-C4): dimension chips render the
825
+ * header-filter funnel. Same per-field precedence as `allowSorting`. */
826
+ readonly allowFiltering: _angular_core.InputSignal<boolean>;
827
+ /** Widget `showBorders`: the panel bands sit INSIDE the border box (dx draws the outer
828
+ * border around the filter/chip bands — `.dx-pivotgrid-border .dx-filter-header` et al). */
829
+ readonly showBorders: _angular_core.InputSignal<boolean>;
830
+ /** P3-C3: the pivot's `.dx-pivotgrid-toolbar` template (field-chooser button) — rendered
831
+ * where dx prepends its toolbar container (m_widget.js `_renderDescriptionArea`). */
832
+ readonly toolbarTemplate: _angular_core.InputSignal<TemplateRef<unknown>>;
833
+ /** Which panel band hosts the toolbar (the pivot resolves dx's placement branches):
834
+ * 'filter' = the filter-header cell; 'column' = the column-header cell (dx's middle
835
+ * branch — showFilterFields off but data/column bands shown; the cell renders for the
836
+ * toolbar even when showColumnFields is off, exactly as dx's always-present
837
+ * $columnHeader does); null = the toolbar lives in the cross-tab corner (or no
838
+ * chooser) — nothing renders here. */
839
+ readonly toolbarArea: _angular_core.InputSignal<"column" | "filter">;
840
+ /** A chip was dropped — the pivot recomputes areaIndexes and writes its override map. */
841
+ readonly fieldMove: _angular_core.OutputEmitterRef<NxePivotFieldMoveEvent>;
842
+ /** A sortable chip was clicked — the pivot flips the field's effective sortOrder. */
843
+ readonly sortToggle: _angular_core.OutputEmitterRef<{
844
+ fieldIndex: number;
845
+ }>;
846
+ /** A chip's funnel was clicked — the pivot opens the header-filter panel (P3-C4). */
847
+ readonly filterOpen: _angular_core.OutputEmitterRef<NxePivotFilterOpenEvent>;
848
+ /** The ROW fields area — NxePivotGridComponent outlets this into its corner cell (dx hosts
849
+ * the row chips inside `.dx-area-description-cell`, never in a band of their own). */
850
+ readonly rowAreaTemplate: _angular_core.Signal<TemplateRef<unknown>>;
851
+ private readonly elementRef;
852
+ private readonly zone;
853
+ protected readonly filterArea: _angular_core.Signal<PanelArea>;
854
+ protected readonly dataArea: _angular_core.Signal<PanelArea>;
855
+ protected readonly columnArea: _angular_core.Signal<PanelArea>;
856
+ protected readonly rowArea: _angular_core.Signal<PanelArea>;
857
+ /** The toolbar renders in the column-header cell (dx's middle placement branch). */
858
+ protected readonly columnToolbar: _angular_core.Signal<boolean>;
859
+ private drag;
860
+ private readonly gesture;
861
+ ngOnDestroy(): void;
862
+ protected onChipPointerDown(chip: NxePivotPanelChip, area: NxePivotArea, event: PointerEvent): void;
863
+ protected onChipClick(chip: NxePivotPanelChip): void;
864
+ protected onChipFilterClick(chip: NxePivotPanelChip, event: MouseEvent): void;
865
+ private buildArea;
866
+ /** Hit-test root: the whole pivot — the row area lives in the cross-tab corner cell. */
867
+ private dragRoot;
868
+ /**
869
+ * Drop zones. For filter/data/column the fields-area element is both hit rect and highlight
870
+ * target; for ROW the enclosing corner cell (`th.dx-area-description-cell`) is — dx's row
871
+ * area IS the corner, so a drop anywhere on it must land in rows, not read as "outside".
872
+ */
873
+ private dropZones;
874
+ private trackPointer;
875
+ /** dx `.dx-position-indicator`: a 2px gray bar between chips, inside the (positioned) area. */
876
+ private placeIndicator;
877
+ private completeDrop;
878
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NxePivotFieldPanelComponent, never>;
879
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NxePivotFieldPanelComponent, "nxe-pivot-field-panel", never, { "engine": { "alias": "engine"; "required": false; "isSignal": true; }; "showFilterFields": { "alias": "showFilterFields"; "required": false; "isSignal": true; }; "showDataFields": { "alias": "showDataFields"; "required": false; "isSignal": true; }; "showColumnFields": { "alias": "showColumnFields"; "required": false; "isSignal": true; }; "showRowFields": { "alias": "showRowFields"; "required": false; "isSignal": true; }; "allowFieldDragging": { "alias": "allowFieldDragging"; "required": false; "isSignal": true; }; "allowSorting": { "alias": "allowSorting"; "required": false; "isSignal": true; }; "allowFiltering": { "alias": "allowFiltering"; "required": false; "isSignal": true; }; "showBorders": { "alias": "showBorders"; "required": false; "isSignal": true; }; "toolbarTemplate": { "alias": "toolbarTemplate"; "required": false; "isSignal": true; }; "toolbarArea": { "alias": "toolbarArea"; "required": false; "isSignal": true; }; }, { "fieldMove": "fieldMove"; "sortToggle": "sortToggle"; "filterOpen": "filterOpen"; }, never, never, true, never>;
880
+ }
881
+
882
+ /** `dxo-field-chooser` — LIVE since P3-C3: with `enabled` the pivot renders the
883
+ * `.dx-pivotgrid-field-chooser-button` toolbar button and opens the chooser popup
884
+ * (nxe-pivot-field-chooser) in a CDK overlay. Defaults are dxPivotGrid's `fieldChooser`
885
+ * defaults (m_widget.js): enabled true, width/height 600, allowSearch false,
886
+ * applyChangesMode 'instantly' (no OK/Cancel — changes hit the pivot live). */
887
+ declare class NxeFieldChooserComponent {
888
+ readonly enabled: _angular_core.InputSignal<boolean>;
889
+ readonly height: _angular_core.InputSignal<number>;
890
+ readonly width: _angular_core.InputSignal<number>;
891
+ readonly allowSearch: _angular_core.InputSignal<boolean>;
892
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NxeFieldChooserComponent, never>;
893
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NxeFieldChooserComponent, "nxe-field-chooser", never, { "enabled": { "alias": "enabled"; "required": false; "isSignal": true; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; "allowSearch": { "alias": "allowSearch"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
894
+ }
895
+ declare class NxePivotGridComponent implements OnDestroy {
896
+ readonly dataSource: _angular_core.InputSignal<NxePivotDataSourceOptions | NxePivotDataSource>;
897
+ /** dx `allowFiltering` (default false) — LIVE since P3-C4: filterable dimension chips
898
+ * (panel AND chooser) render the `.dx-header-filter` funnel and open the shared
899
+ * header-filter panel; per-field `field.allowFiltering` overrides the widget flag
900
+ * (dx m_widget `_updateCalculatedOptions`). */
901
+ readonly allowFiltering: _angular_core.InputSignal<boolean>;
902
+ /** dx `allowSortingBySummary`: accepted + round-tripped, INERT — dx exposes it only
903
+ * through the data-cell/total context menu ("Sort by This Column"), Phase 4 territory
904
+ * (DEFAULTS.md, dated P3-C4 note). */
905
+ readonly allowSortingBySummary: _angular_core.InputSignal<boolean>;
906
+ /** dx: gates the context-menu "Expand All"/"Collapse All" items (default false). Accepted +
907
+ * round-tripped; no context menu exists until Phase 4 (DEFAULTS.md). The facade's
908
+ * `expandAll()`/`collapseAll()` work regardless, exactly as dx's data-source methods do. */
909
+ readonly allowExpandAll: _angular_core.InputSignal<boolean>;
910
+ readonly showBorders: _angular_core.InputSignal<boolean>;
911
+ /** dx default TRUE (m_widget.js defaultOptions): `dx-word-wrap` on the table lets header
912
+ * cells wrap; data cells stay nowrap either way (dx.light's direct td rule). */
913
+ readonly wordWrapEnabled: _angular_core.InputSignal<boolean>;
914
+ readonly rowHeaderLayout: _angular_core.InputSignal<NxePivotRowHeaderLayout>;
915
+ /** dx `height`: number (px) or CSS string, applied to the widget root — the internal
916
+ * scroll container tracks it at 100%. */
917
+ readonly height: _angular_core.InputSignal<string | number>;
918
+ readonly texts: _angular_core.InputSignal<NxePivotTexts>;
919
+ readonly showColumnTotals: _angular_core.InputSignal<boolean>;
920
+ readonly showRowTotals: _angular_core.InputSignal<boolean>;
921
+ readonly showColumnGrandTotals: _angular_core.InputSignal<boolean>;
922
+ readonly showRowGrandTotals: _angular_core.InputSignal<boolean>;
923
+ /** dx `showTotalsPrior` — 'rows'/'both' place each "{value} Total" row before its children. */
924
+ readonly showTotalsPrior: _angular_core.InputSignal<NxePivotTotalsPrior>;
925
+ /** dx `dataFieldArea` (default 'column'): 'row' renders the measures as the innermost ROW
926
+ * level when two or more exist (with one, dx omits the metric level on either axis).
927
+ * Left undefined the engine falls back to the dataSource options' own `dataFieldArea`. */
928
+ readonly dataFieldArea: _angular_core.InputSignal<"row" | "column">;
929
+ /** dx `allowSorting` (default false, P3-C2): field-panel chips toggle their field's
930
+ * sortOrder on click and carry the `.dx-sort` arrow in `.dx-column-indicators`. */
931
+ readonly allowSorting: _angular_core.InputSignal<boolean>;
932
+ /**
933
+ * Facade `option(name, value)` writes land here and WIN over the input bindings — the dx
934
+ * `instance.option(...)` idiom on a component whose declarative config are signal inputs.
935
+ * Every live read site goes through the `*Eff` computeds below, so a set is immediately
936
+ * effective; the input keeps feeding the value while no override exists.
937
+ */
938
+ private readonly optionOverrides;
939
+ private effOf;
940
+ protected readonly allowFilteringEff: Signal<boolean>;
941
+ protected readonly allowSortingEff: Signal<boolean>;
942
+ protected readonly allowSortingBySummaryEff: Signal<boolean>;
943
+ protected readonly allowExpandAllEff: Signal<boolean>;
944
+ protected readonly showBordersEff: Signal<boolean>;
945
+ protected readonly wordWrapEnabledEff: Signal<boolean>;
946
+ protected readonly rowHeaderLayoutEff: Signal<NxePivotRowHeaderLayout>;
947
+ protected readonly heightEff: Signal<string | number>;
948
+ protected readonly textsEff: Signal<NxePivotTexts>;
949
+ protected readonly showColumnTotalsEff: Signal<boolean>;
950
+ protected readonly showRowTotalsEff: Signal<boolean>;
951
+ protected readonly showColumnGrandTotalsEff: Signal<boolean>;
952
+ protected readonly showRowGrandTotalsEff: Signal<boolean>;
953
+ protected readonly showTotalsPriorEff: Signal<NxePivotTotalsPrior>;
954
+ protected readonly dataFieldAreaEff: Signal<"row" | "column">;
955
+ /** The documented option names `option()` gets/sets (DEFAULTS.md lists the exclusions). */
956
+ private readonly effOptions;
957
+ /**
958
+ * dx-shaped outputs (W4 Lane 2) — no consumer binds them today; parity insurance.
959
+ * Classic EventEmitters, NOT `output()`: `.observed` gates the per-cell walks so a pivot
960
+ * with no listeners pays nothing (dx does the same — m_area_item only walks its cells
961
+ * when `onCellPrepared || hasEvent`).
962
+ */
963
+ readonly onCellClick: EventEmitter<NxePivotCellEvent>;
964
+ readonly onCellPrepared: EventEmitter<NxePivotCellEvent>;
965
+ readonly onContentReady: EventEmitter<NxePivotContentReadyEvent>;
966
+ readonly onOptionChanged: EventEmitter<NxePivotOptionChangedEvent>;
967
+ readonly onExporting: EventEmitter<NxePivotExportingEvent>;
968
+ /**
969
+ * dx `onOptionChanged` source: one snapshot of every documented option's EFFECTIVE value
970
+ * (facade overrides included, so `option(name, v)` and an input-binding change emit through
971
+ * the same diff — never twice). `dataSource` rides along, get-only.
972
+ */
973
+ private readonly optionSnapshot;
974
+ protected readonly fieldChooser: Signal<NxeFieldChooserComponent>;
975
+ /** The projected `nxe-field-panel` config (P3-C2) — the panel renders when it is visible. */
976
+ protected readonly fieldPanel: Signal<NxeFieldPanelComponent>;
977
+ /** The projected `nxe-state-storing` config — LIVE since P3-C4 for `type: 'custom'`:
978
+ * every layout mutation fires `customSave(state)` and `customLoad` is honored on init. */
979
+ protected readonly stateStoring: Signal<NxeStateStoringComponent>;
980
+ /** dx `fieldPanel.visible` (default false): gates the panel, the corner's chips-vs-caption
981
+ * switch, and the dx marker classes on the host. */
982
+ protected readonly panelVisible: Signal<boolean>;
983
+ /** The rendered panel component — source of the corner-hosted row-area template. */
984
+ private readonly panelCmp;
985
+ /** The ROW fields area, outletted into the corner cell (dx hosts the row chips inside
986
+ * `.dx-area-description-cell` — oracle §c; the corner shows NO caption text then). */
987
+ protected readonly panelRowAreaTpl: Signal<_angular_core.TemplateRef<unknown>>;
988
+ /** The `.dx-pivotgrid-field-chooser-button` renders only when an `nxe-field-chooser` is
989
+ * projected with `enabled` not false (the DA page passes [enabled]="true"). */
990
+ protected readonly chooserEnabled: Signal<boolean>;
991
+ /** dx toolbar placement (m_widget.js `_renderDescriptionArea`, verbatim branch order):
992
+ * (a) panel visible && showFilterFields -> the `.dx-filter-header` band;
993
+ * (b) panel visible && (showDataFields || showColumnFields) -> the `.dx-column-header`
994
+ * band (dx-compat's dormant column-header button rules go live);
995
+ * (c) else -> the cross-tab corner `.dx-area-description-cell`, where the
996
+ * transparent-until-hover button rules (dx-compat ~1113-1118) apply. */
997
+ protected readonly chooserToolbarHost: Signal<"column" | "filter" | "corner">;
998
+ /** The panel-hosted placements, bound into the panel's `toolbarArea` input. */
999
+ protected readonly panelToolbarArea: Signal<"column" | "filter">;
1000
+ protected readonly chooserInCorner: Signal<boolean>;
1001
+ private chooserOverlayRef;
1002
+ private readonly overlay;
1003
+ private readonly viewContainerRef;
1004
+ private readonly elementRef;
1005
+ /** Bumped by `getDataSource().reload()` to force a re-aggregate. */
1006
+ private readonly reloadTick;
1007
+ /**
1008
+ * W4 Lane 1: bumped by `repaint()` / `updateDimensions()` — RENDER-ONLY. dx `repaint()` is
1009
+ * the plain Widget re-render (m_widget.js inherits it): it re-renders/re-layouts the
1010
+ * existing data-controller state and never touches the data source, so it must NOT
1011
+ * re-aggregate (the pre-W4 facade bumped `reloadTick`, which re-instantiated the engine
1012
+ * and reset the state linkedSignals — wiping the user's expand/layout state on every
1013
+ * sidebar toggle of the DA page). The signals already keep the DOM fresh; the observable
1014
+ * effect of a repaint is re-running the measurement pass below (dx re-layout).
1015
+ */
1016
+ private readonly renderTick;
1017
+ private readonly boundChart;
1018
+ /** W4 Lane 4: the dx `bindChart(chart, integrationOptions)` options — a NEW object per
1019
+ * bindChart call, so re-binding re-renders (dx runs `updateChart` on every bind). */
1020
+ private readonly chartBindOptions;
1021
+ /**
1022
+ * P3-C2: the field panel's mutations (chip drag between/within areas, click-to-sort — and
1023
+ * since P3-C4 the header-filter applies), keyed by the field's index in the caller's
1024
+ * `fields` array and MERGED over those fields when the engine is constructed — the caller's
1025
+ * array/objects are never mutated (report-output-pivot serializes its own fields in
1026
+ * `onSave`). Resets whenever the caller swaps `dataSource` (the DA page replaces the object
1027
+ * on view select), exactly as dx resets the layout when a new state loads. (P3-C4 migrated
1028
+ * that page's `onExpandAll` off its cloneDeep+swap onto the facade
1029
+ * `expandAll()`/`collapseAll()`, so expand-all no longer wipes a dragged layout.)
1030
+ */
1031
+ private readonly fieldOverrides;
1032
+ protected readonly engine: Signal<NxePivotDataSource>;
1033
+ /**
1034
+ * The "layout changed" hook (P3-C2, consumed since P3-C4): the caller's fields with the
1035
+ * panel's overrides merged — a NEW array identity after every mutation (drag move, sort
1036
+ * toggle, filter apply), the caller's own array untouched. `fireStateSave()` serializes
1037
+ * THIS array into the `customSave` state after each mutation, so a consumer's Save
1038
+ * persists the post-drag layout; `getExportModel()`/the Excel export read the same
1039
+ * overridden engine, so exports reflect a move immediately.
1040
+ */
1041
+ readonly effectiveFields: Signal<NxePivotField[]>;
1042
+ /**
1043
+ * Per-node chevron overrides — W4 Lane 1: keyed on the `dataSource` INPUT identity (like
1044
+ * {@link fieldOverrides}), NOT on the engine instance. dx keeps its expand state inside the
1045
+ * data source (`getExpandedPaths` re-feeds `rowExpandedPaths`/`columnExpandedPaths` into
1046
+ * every `_loadCore`, m_data_source.js), so `repaint()` (render-only), `reload()`
1047
+ * (re-aggregate, state kept) and layout mutations (sort/move — dx keeps expandedPaths
1048
+ * across them) all PRESERVE it; only a real dataSource swap (the DA page's `initChart`
1049
+ * builds a new options object per view select) resets. Stale keys after an area move
1050
+ * simply stop matching any node — harmless, dx-alike.
1051
+ */
1052
+ private readonly manualExpanded;
1053
+ protected readonly model: Signal<NxePivotModel>;
1054
+ /** Host height style — dx `height`: numbers are px, strings pass through, unset removes it. */
1055
+ protected readonly hostHeight: Signal<string>;
1056
+ /** The projected `nxe-scrolling` config — `mode: 'virtual'` opts into row windowing. */
1057
+ protected readonly scrolling: Signal<NxeScrollingComponent>;
1058
+ /** Scroll offset of `.nxe-pivotgrid-scroll` (its own scroll handler feeds it). */
1059
+ private readonly scrollTop;
1060
+ /** The scroll container's clientHeight, measured in the render effect (0 = unmeasured). */
1061
+ private readonly viewportHeight;
1062
+ /**
1063
+ * Row windowing arms for `rowHeaderLayout: 'tree'` ONLY: the standard layout's expanded
1064
+ * parents ROWSPAN their whole subtree, so slicing rows would orphan/clip the merged label
1065
+ * cells (the dated DEFAULTS.md row) — dx sidesteps this with separate area panes. The DA
1066
+ * page projects `mode="virtual"` but renders standard → no-op there; the calc tabs' tree
1067
+ * pivots benefit. RENDER-ONLY: the model, export and chart always see every row.
1068
+ */
1069
+ protected readonly virtualActive: Signal<boolean>;
1070
+ /** First windowed row (model index) — snapped back to a measures-on-rows group head. */
1071
+ private readonly winStart;
1072
+ /** One past the last windowed row (model index). */
1073
+ private readonly winEnd;
1074
+ /**
1075
+ * The body rows the template renders: `{row, ri}` pairs where `ri` is the MODEL row index
1076
+ * (matrix addressing must not shift with the window). The full array when windowing is off.
1077
+ */
1078
+ protected readonly viewRows: Signal<{
1079
+ row: NxePivotBodyRow;
1080
+ ri: number;
1081
+ }[]>;
1082
+ /** Spacer heights standing in for the unrendered rows (keep the scrollbar honest). */
1083
+ protected readonly topSpacerH: Signal<number>;
1084
+ protected readonly bottomSpacerH: Signal<number>;
1085
+ /** Total table columns (spacer colspan): row-header cols (+measure col) + leaves. */
1086
+ protected readonly totalColCount: Signal<number>;
1087
+ protected onPivotScroll(event: Event): void;
1088
+ /**
1089
+ * dx `.dx-pivotgrid-nodata` (gridCoreUtils.renderNoDataText): shown when the data source
1090
+ * `isEmpty()` — no VISIBLE data field or nothing aggregated (empty/fully-filtered store);
1091
+ * text `texts.noData` (dx default "No data"). The reloadTick read re-checks after an
1092
+ * in-place instance reload.
1093
+ */
1094
+ protected readonly showNoData: Signal<boolean>;
1095
+ constructor();
1096
+ protected toggle(pathKey: string, expanded: boolean): void;
1097
+ /** W4 Lane 3 (a11y): Enter/Space on a focused expandable header cell toggles it (dx-like
1098
+ * keyboard expansion; preventDefault stops Space from scrolling the container). */
1099
+ protected onExpandKey(event: Event, pathKey: string, expanded: boolean): void;
1100
+ private domIndices;
1101
+ private finishCellArgs;
1102
+ private colHeaderArgs;
1103
+ /** Standard-layout row-header cell (also the split measure-caption cells it renders). */
1104
+ private rowHeaderArgs;
1105
+ /** Tree-layout dimension label cell (synthesized from the row — tree rows carry one cell). */
1106
+ private treeLabelArgs;
1107
+ /** Tree-layout measure-caption cell (measures-on-rows). */
1108
+ private measureCellArgs;
1109
+ private dataCellArgs;
1110
+ /** Grand-total footer data cell (both footer shapes). */
1111
+ private gtDataArgs;
1112
+ private gtHeaderArgs;
1113
+ private cellEl;
1114
+ protected onColHeaderCellClick(event: Event, cell: NxePivotHeaderCell): void;
1115
+ protected onRowHeaderCellClick(event: Event, row: NxePivotBodyRow, hc: NxePivotRowHeaderCell | null): void;
1116
+ protected onMeasureCellClick(event: Event, row: NxePivotBodyRow): void;
1117
+ protected onDataCellClick(event: Event, ri: number, li: number): void;
1118
+ protected onGtHeaderCellClick(event: Event, text: string): void;
1119
+ protected onGtDataCellClick(event: Event, li: number, di: number, value: number | null, text: string): void;
1120
+ /**
1121
+ * Chevron click — dx `_handleCellClick`: fire the cancelable `onCellClick`, then toggle
1122
+ * unless a handler set `cancel: true`. stopPropagation keeps the host cell's own click
1123
+ * handler from emitting a second event for the same gesture.
1124
+ */
1125
+ protected onColExpandClick(event: Event, cell: NxePivotHeaderCell): void;
1126
+ protected onRowExpandClick(event: Event, row: NxePivotBodyRow, hc: NxePivotRowHeaderCell | null): void;
1127
+ /** dx m_area_item `_triggerOnCellPrepared`: one event per rendered cell, DOM in hand. */
1128
+ private emitCellsPrepared;
1129
+ /**
1130
+ * A field-panel chip was dropped, or the chooser toggled/moved a field (P3-C2/P3-C3).
1131
+ * Recompute areaIndexes like dx: remove the field from its current area, insert at the
1132
+ * drop position (`area: null` = REMOVAL — the chooser's All-Fields tree drop or checkbox
1133
+ * uncheck; panel/chooser drops outside every area never emit), then renumber the touched
1134
+ * areas 0..n-1 — all recorded as overrides, never as writes into the caller's field
1135
+ * objects.
1136
+ *
1137
+ * P3-C4 (closes the P3-C2 deferral (d)): the renumbering runs over the lists dx's
1138
+ * `normalizeIndexes` sees (m_data_source `_createDescriptions` over its module-local
1139
+ * `getAreaFields`) — the DATA area's `visible: false` fields are IN the numbering, hidden
1140
+ * row/column/filter fields are not. The emitted `areaIndex` is a VISIBLE slot (the
1141
+ * panel/chooser hit-test only visible chips), so the insertion offsets past the hidden
1142
+ * fields before it, exactly like dx's `invisibleFieldsIndexOffset` (m_field_chooser_base
1143
+ * `renderSortable.onChanged`).
1144
+ */
1145
+ protected onPanelFieldMove(e: NxePivotFieldMoveEvent): void;
1146
+ /**
1147
+ * A sortable chip was clicked (P3-C2). dx toggles the FIELD's sortOrder desc↔asc off the
1148
+ * effective order (fields sort ascending by default, so the first click yields 'desc');
1149
+ * the override feeds the engine's existing per-level sort.
1150
+ */
1151
+ protected onPanelSortToggle(e: {
1152
+ fieldIndex: number;
1153
+ }): void;
1154
+ /** The field whose header-filter popup is open (`null` = closed). */
1155
+ private readonly hfFieldIndex;
1156
+ /**
1157
+ * The shared header-filter model (W2b extraction) over the ENGINE's distinct values: dx
1158
+ * feeds this popup from `dataSource.getFieldValues(index)` (m_field_chooser_base
1159
+ * `subscribeToEvents` — the field loaded as a lone expanded column), so the adapter's
1160
+ * "rows" ARE those `{value, text}` items — post-groupInterval group values with their
1161
+ * display labels, from the UNFILTERED store (dx `showRelevantValues` default false).
1162
+ * Blank-ish values fold into the model's `(Blanks)` bucket, first (dx
1163
+ * `headerFilter.texts.emptyValue` = "(Blanks)"). `isDate` is pinned false: dx's PIVOT list
1164
+ * is flat even for date fields (the Year>Month>Day tree is the grid's own semantics —
1165
+ * DEFAULTS.md, dated P3-C4 note). The model's column token is the FIELD object (a bare
1166
+ * fieldIndex would read falsy for index 0 — the model treats a falsy column as closed).
1167
+ */
1168
+ protected readonly hf: NxeHeaderFilterModel<NxePivotField>;
1169
+ private hfOverlayRef;
1170
+ /** A chip funnel was clicked (panel or chooser) — open the shared header-filter popup. */
1171
+ protected openPivotHeaderFilter(e: NxePivotFilterOpenEvent): void;
1172
+ /**
1173
+ * The field's applied `filterValues` as model keys — blank-ish raws fold into the
1174
+ * `(Blanks)` sentinel; `filterType: 'exclude'` inverts over the field's distinct keys
1175
+ * (dx `processItems` marks each item selected iff included, inverted for exclude).
1176
+ */
1177
+ private appliedKeys;
1178
+ /**
1179
+ * OK — dx's menu apply writes `{filterValues, filterType}` onto the field and reloads
1180
+ * (m_field_chooser_base `apply` → `_applyChanges`); here they land in the fieldOverride
1181
+ * map → the engine refilters at record intake (P2-C3). Full-checked = filter CLEARED (the
1182
+ * model's null rule — `filterValues: null` so a declarative seed can't resurrect). The
1183
+ * stored set is always the INCLUDE set (dx sometimes stores the complement with
1184
+ * `filterType: 'exclude'` — DEFAULTS.md, dated P3-C4 note).
1185
+ */
1186
+ private applyPivotHeaderFilter;
1187
+ private closePivotHeaderFilter;
1188
+ /**
1189
+ * dx StateStoringController: after every data change the pivot's data controller pushes
1190
+ * `dataSource.state()` into the controller and `save()`s (m_data_controller ~854-856) —
1191
+ * for `type: 'custom'` that ends in `customSave(state)` (m_state_storing_core
1192
+ * `_saveState`). Here it fires synchronously per LAYOUT MUTATION (drag, sort toggle,
1193
+ * filter apply, chooser check/uncheck) — no `savingTimeout` debounce (dx default 2000ms)
1194
+ * and no save on plain loads (DEFAULTS.md, dated P3-C4 notes). The
1195
+ * localStorage/sessionStorage types stay inert.
1196
+ */
1197
+ private fireStateSave;
1198
+ /**
1199
+ * The dx-shaped state: `fields` serialized from {@link effectiveFields} (the caller's
1200
+ * fields with every override merged — the POST-mutation layout), plus the state's
1201
+ * expanded-path arrays (always empty here — nxe holds chevron state internally;
1202
+ * DEFAULTS.md).
1203
+ *
1204
+ * Each entry is a FULL shallow copy of the effective field — every own enumerable
1205
+ * property, function members (selector/customizeText/calculateCustomSummary/
1206
+ * calculateSummaryValue) included — which trivially guarantees the dx state keys
1207
+ * (dataField + area/areaIndex/expanded/sortOrder/filterValues/filterType and the
1208
+ * caption/format/summaryType passthrough) wherever the field defines them.
1209
+ *
1210
+ * THE FULL COPY IS LOAD-BEARING (P3-C4 review): report-output-pivot's
1211
+ * `sendStorageRequest` REPLACES its live `pivotGridDataSource.fields` with this very
1212
+ * array, and the engine computed re-reads `opts.fields` on its next rebuild — the next
1213
+ * mutation, or a facade `reload()` (since W4 Lane 1 `repaint()` is render-only and no
1214
+ * longer rebuilds the engine; the replaced fields carry the same values the engine
1215
+ * already renders, so nothing is lost in the interim). A slim
1216
+ * dx-keys-only payload would strip dataType/groupInterval (date bucketing degrades),
1217
+ * `visible: false` (hidden helper measures reappear), width/sortBy/summaryDisplayMode/
1218
+ * name, and the per-field allowSorting/allowFiltering opt-outs out of the LIVE config on
1219
+ * that rebuild. dx never fed its state back into a live widget — only its SAVED JSON was
1220
+ * slim — and the production REPORT_SETTING `otherValue1` payloads carry full field defs
1221
+ * (captions/dataTypes/formats) anyway; `JSON.stringify` drops the function members
1222
+ * harmlessly when the Save dialog serializes later.
1223
+ */
1224
+ private buildStorageState;
1225
+ /**
1226
+ * dx stateStoring `customLoad` contract (m_state_storing_core `_loadState` + `load`): the
1227
+ * return value goes through `fromPromise` — a plain state object OR a Promise of one both
1228
+ * work — and applies only when non-null and not an empty object; a rejected promise
1229
+ * applies nothing.
1230
+ */
1231
+ private runCustomLoad;
1232
+ /**
1233
+ * Apply a loaded state's `fields` over the caller's fields as overrides — dx
1234
+ * `setFieldsState` (m_data_source): state fields match by `name` falling back to
1235
+ * `dataField` (same-id fields pair by order), and each match writes the state properties
1236
+ * onto the field, `undefined` area CLEARING it. Narrowings (DEFAULTS.md): only the
1237
+ * override-expressible properties apply (area/areaIndex/sortOrder/expanded/filterValues/
1238
+ * filterType — not sortBy/summaryType/summaryDisplayMode), and a field ABSENT from the
1239
+ * state keeps its own config where dx would reset its state properties.
1240
+ */
1241
+ private applyLoadedState;
1242
+ /**
1243
+ * P3-C3: open the field chooser popup — dx `_fieldChooserPopup.show()` off the toolbar
1244
+ * button. CDK overlay centered in the viewport (the dx popup's default position), pane
1245
+ * carrying `nxePane('nxe-fieldchooser-pane')` (the widget font contract for body-level
1246
+ * panes). NO backdrop: dx renders this popup with `shading: false` and its
1247
+ * `hideOnOutsideClick` default (false), so the pivot behind stays fully interactive
1248
+ * while the instantly-applying chooser is open and an outside click neither closes nor
1249
+ * blocks — only the title-bar X and Escape (OverlayKeyboardDispatcher routes body
1250
+ * keydowns to the topmost overlay with observers) close it. The chooser gets the LIVE
1251
+ * engine signal, so applyChangesMode-'instantly' mutations flow chooser ->
1252
+ * onPanelFieldMove/onPanelSortToggle -> fieldOverrides -> engine -> every rendered
1253
+ * surface, with the popup still open.
1254
+ */
1255
+ protected toggleFieldChooser(): void;
1256
+ private closeFieldChooser;
1257
+ ngOnDestroy(): void;
1258
+ /**
1259
+ * W4 Lane 4 — series derive from the COLUMN LEAVES (kind 'D' — subtotal 'T' columns and
1260
+ * the grand-total column are presentation, charting them would double-count), one series
1261
+ * per (column path × visible measure), fixing the P2-C2 minor: the old code charted only
1262
+ * the grand-total leaf and, with grand totals OFF, silently fell back to the FIRST leaf
1263
+ * (one arbitrary column mislabeled as the measure's totals). Categories stay the
1264
+ * non-subtotal body rows — the established nxe orientation (== dx `inverted: true`;
1265
+ * DEFAULTS.md). Honors the dx integration options (see {@link NxePivotBindChartOptions}):
1266
+ * `alternateDataFields` (series order), `putDataFieldsInto` ('series'/'args'/'both'),
1267
+ * `dataFieldsDisplayMode` (accepted, structural no-op on the single-pane nxe chart).
1268
+ * Works identically for `dataFieldArea: 'row'` — dx's chart reads the data source, never
1269
+ * the widget layout, so measures-on-rows charts the same series.
1270
+ */
1271
+ private buildSeries;
1272
+ private readonly facade;
1273
+ /**
1274
+ * dx `option(name[, value])` (W4 Lane 2). Get: the EFFECTIVE value (override ?? input);
1275
+ * `'dataSource'` is additionally readable. Set: only the documented names in
1276
+ * {@link effOptions} — the write lands in {@link optionOverrides}, wins over the input
1277
+ * binding, and flows through the option-snapshot diff into `onOptionChanged`. Unsupported
1278
+ * names (dataSource, nested `'a.b'` paths, the projected-config children) are a silent
1279
+ * no-op on set / undefined on get, recorded in DEFAULTS.md.
1280
+ */
1281
+ private optionFacade;
1282
+ /**
1283
+ * dx `exportToExcel()` — the widget's built-in export path (m_export.js `exportTo`): fire
1284
+ * the cancelable `onExporting` with dx's default fileName 'PivotGrid' (a handler may
1285
+ * rename or cancel), then run the SAME `exportPivotGrid({component})` pipeline
1286
+ * report-output-pivot drives from its own toolbar (that page-side path stays untouched
1287
+ * and, like dx's standalone exporter, never fires the widget event).
1288
+ */
1289
+ private runExportToExcel;
1290
+ /** Download seam (specs spy here — nxeSaveAs clicks a synthetic anchor). */
1291
+ protected saveExportedWorkbook(blob: Blob, fileName: string): void;
1292
+ /**
1293
+ * Oracle §e: dx's expand-all/collapse-all set `expanded` on EVERY field of the data source
1294
+ * and reload — and the dx-era report page did the same blanket `field.expanded` mutation,
1295
+ * which is why its Save persisted the expanded state and a reload restored it. Mirrored
1296
+ * here (P3-C4, replacing the earlier private allExpanded model flag) as `expanded`
1297
+ * fieldOverrides on EVERY field — data and filter fields included, exactly like the old
1298
+ * page's loop and dx's own mutation: the caller's objects stay untouched, the state
1299
+ * survives engine rebuilds, and it serializes through {@link effectiveFields} into the
1300
+ * `customSave` payload with no special-casing. The per-node chevron map is wiped
1301
+ * EXPLICITLY below (since W4 Lane 1 it is keyed on the dataSource input and survives
1302
+ * engine rebuilds, so the old implicit reset no longer happens) — dx-identical: individual
1303
+ * toggles then work on top. `fireStateSave()` closes the Save-after-expandAll loop (it
1304
+ * no-ops when no `nxe-state-storing` is projected).
1305
+ */
1306
+ private setAllExpanded;
1307
+ get instance(): NxePivotGridInstance;
1308
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NxePivotGridComponent, never>;
1309
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NxePivotGridComponent, "nxe-pivot-grid", never, { "dataSource": { "alias": "dataSource"; "required": false; "isSignal": true; }; "allowFiltering": { "alias": "allowFiltering"; "required": false; "isSignal": true; }; "allowSortingBySummary": { "alias": "allowSortingBySummary"; "required": false; "isSignal": true; }; "allowExpandAll": { "alias": "allowExpandAll"; "required": false; "isSignal": true; }; "showBorders": { "alias": "showBorders"; "required": false; "isSignal": true; }; "wordWrapEnabled": { "alias": "wordWrapEnabled"; "required": false; "isSignal": true; }; "rowHeaderLayout": { "alias": "rowHeaderLayout"; "required": false; "isSignal": true; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; "texts": { "alias": "texts"; "required": false; "isSignal": true; }; "showColumnTotals": { "alias": "showColumnTotals"; "required": false; "isSignal": true; }; "showRowTotals": { "alias": "showRowTotals"; "required": false; "isSignal": true; }; "showColumnGrandTotals": { "alias": "showColumnGrandTotals"; "required": false; "isSignal": true; }; "showRowGrandTotals": { "alias": "showRowGrandTotals"; "required": false; "isSignal": true; }; "showTotalsPrior": { "alias": "showTotalsPrior"; "required": false; "isSignal": true; }; "dataFieldArea": { "alias": "dataFieldArea"; "required": false; "isSignal": true; }; "allowSorting": { "alias": "allowSorting"; "required": false; "isSignal": true; }; }, { "onCellClick": "onCellClick"; "onCellPrepared": "onCellPrepared"; "onContentReady": "onContentReady"; "onOptionChanged": "onOptionChanged"; "onExporting": "onExporting"; }, ["fieldChooser", "fieldPanel", "stateStoring", "scrolling"], never, true, never>;
1310
+ }
1311
+
1312
+ declare class NxePivotFieldChipComponent {
1313
+ readonly chip: _angular_core.InputSignal<NxePivotPanelChip>;
1314
+ /** Raw pointerdown — the host decides whether a drag gesture may begin. */
1315
+ readonly chipPointerDown: _angular_core.OutputEmitterRef<PointerEvent>;
1316
+ /** Chip click (the host consults its gesture's click suppression before sorting). */
1317
+ readonly chipClick: _angular_core.OutputEmitterRef<void>;
1318
+ /** The funnel was clicked — the host opens the header-filter panel for this field. */
1319
+ readonly chipFilterClick: _angular_core.OutputEmitterRef<MouseEvent>;
1320
+ protected onFunnelClick(event: MouseEvent): void;
1321
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NxePivotFieldChipComponent, never>;
1322
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NxePivotFieldChipComponent, "div[nxePivotFieldChip]", never, { "chip": { "alias": "chip"; "required": true; "isSignal": true; }; }, { "chipPointerDown": "chipPointerDown"; "chipClick": "chipClick"; "chipFilterClick": "chipFilterClick"; }, never, never, true, never>;
1323
+ }
1324
+
1325
+ /** One All-Fields tree row (the fixture's flat leaf list — local fields have no groups). */
1326
+ interface ChooserTreeItem {
1327
+ fieldIndex: number;
1328
+ caption: string;
1329
+ selected: boolean;
1330
+ isMeasure: boolean | undefined;
1331
+ }
1332
+ interface ChooserArea {
1333
+ group: NxePivotArea;
1334
+ caption: string;
1335
+ icon: string;
1336
+ chips: NxePivotPanelChip[];
1337
+ }
1338
+ declare class NxePivotFieldChooserComponent implements OnDestroy {
1339
+ /** The pivot's LIVE engine signal (overrides merged) — instant applies re-read it here. */
1340
+ readonly engine: _angular_core.InputSignal<Signal<NxePivotDataSource>>;
1341
+ /** dx `fieldChooser.width`/`height` — applied to the popup box; dxPivotGrid defaults 600
1342
+ * (m_widget.js `fieldChooser` defaults; the DA page passes height 400). */
1343
+ readonly width: _angular_core.InputSignal<number>;
1344
+ readonly height: _angular_core.InputSignal<number>;
1345
+ /** dx `fieldChooser.allowSearch` (default false — the capture has NO search box). */
1346
+ readonly allowSearch: _angular_core.InputSignal<boolean>;
1347
+ /** Widget `allowSorting`: dimension chips inside the chooser sort on click, same as the
1348
+ * panel's (dx stamps the widget flag onto every field; data chips never sort). */
1349
+ readonly allowSorting: _angular_core.InputSignal<boolean>;
1350
+ /** Widget `allowFiltering` (P3-C4): dimension chips inside the chooser carry the same
1351
+ * header-filter funnel as the panel's (dx renderField is FieldChooserBase machinery —
1352
+ * shared by both surfaces). Same per-field precedence as `allowSorting`. */
1353
+ readonly allowFiltering: _angular_core.InputSignal<boolean>;
1354
+ /** Every chooser mutation (checkbox toggle, drag between areas) — the pivot feeds these
1355
+ * through the SAME `onPanelFieldMove` renumbering the field panel uses. */
1356
+ readonly fieldMove: _angular_core.OutputEmitterRef<NxePivotFieldMoveEvent>;
1357
+ /** A sortable chip inside the chooser was clicked. */
1358
+ readonly sortToggle: _angular_core.OutputEmitterRef<{
1359
+ fieldIndex: number;
1360
+ }>;
1361
+ /** A chip's funnel was clicked — the pivot opens the header-filter panel (P3-C4). */
1362
+ readonly filterOpen: _angular_core.OutputEmitterRef<NxePivotFilterOpenEvent>;
1363
+ /** The title-bar X — the pivot disposes the overlay (Escape/backdrop close there too). */
1364
+ readonly closed: _angular_core.OutputEmitterRef<void>;
1365
+ protected readonly texts: {
1366
+ allFields: string;
1367
+ rowFields: string;
1368
+ columnFields: string;
1369
+ filterFields: string;
1370
+ dataFields: string;
1371
+ title: string;
1372
+ };
1373
+ protected readonly allIcon: string;
1374
+ protected readonly searchText: _angular_core.WritableSignal<string>;
1375
+ private readonly elementRef;
1376
+ private readonly zone;
1377
+ /** Popup box size — dx puts fieldChooser.width/height on `.dx-overlay-content` (600 dflt). */
1378
+ protected readonly boxWidth: Signal<string>;
1379
+ protected readonly boxHeight: Signal<string>;
1380
+ /**
1381
+ * All Fields tree rows: every defined `visible !== false` field (m_field_chooser.js
1382
+ * `_createFieldsDataSource`), checked when it HAS an area (`selected: isDefined(field.area)`),
1383
+ * ordered by dx `compareItems` — plain text comparison here (no groups, no isMeasure).
1384
+ */
1385
+ protected readonly treeItems: Signal<ChooserTreeItem[]>;
1386
+ protected readonly rowArea: Signal<ChooserArea>;
1387
+ protected readonly columnArea: Signal<ChooserArea>;
1388
+ protected readonly filterArea: Signal<ChooserArea>;
1389
+ protected readonly dataArea: Signal<ChooserArea>;
1390
+ protected onCheckboxClick(item: ChooserTreeItem): void;
1391
+ protected onSearchInput(event: Event): void;
1392
+ protected onChipClick(chip: NxePivotPanelChip): void;
1393
+ protected onChipFilterClick(chip: NxePivotPanelChip, event: MouseEvent): void;
1394
+ private drag;
1395
+ private readonly gesture;
1396
+ ngOnDestroy(): void;
1397
+ protected onChipPointerDown(chip: NxePivotPanelChip, area: NxePivotArea, event: PointerEvent): void;
1398
+ private buildArea;
1399
+ private host;
1400
+ /**
1401
+ * dx m_field_chooser_base.js `renderSortable.onDragging` cancel rules: a true measure may
1402
+ * only sit in data; an explicit non-measure never in data; undefined = unrestricted.
1403
+ */
1404
+ private allowedIn;
1405
+ private trackPointer;
1406
+ /** dx `.dx-position-indicator-vertical`: a 2px bar between the stacked chips. */
1407
+ private placeIndicator;
1408
+ private completeDrop;
1409
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NxePivotFieldChooserComponent, never>;
1410
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NxePivotFieldChooserComponent, "nxe-pivot-field-chooser", never, { "engine": { "alias": "engine"; "required": true; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; "allowSearch": { "alias": "allowSearch"; "required": false; "isSignal": true; }; "allowSorting": { "alias": "allowSorting"; "required": false; "isSignal": true; }; "allowFiltering": { "alias": "allowFiltering"; "required": false; "isSignal": true; }; }, { "fieldMove": "fieldMove"; "sortToggle": "sortToggle"; "filterOpen": "filterOpen"; "closed": "closed"; }, never, never, true, never>;
1411
+ }
1412
+
1413
+ /** `dxo-common-series-settings` — the series type (only `bar` is used). */
1414
+ declare class NxeCommonSeriesSettingsComponent {
1415
+ readonly type: _angular_core.InputSignal<"area" | "line" | "bar" | "spline">;
1416
+ readonly argumentField: _angular_core.InputSignal<string>;
1417
+ readonly valueField: _angular_core.InputSignal<string>;
1418
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NxeCommonSeriesSettingsComponent, never>;
1419
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NxeCommonSeriesSettingsComponent, "nxe-common-series-settings", never, { "type": { "alias": "type"; "required": false; "isSignal": true; }; "argumentField": { "alias": "argumentField"; "required": false; "isSignal": true; }; "valueField": { "alias": "valueField"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1420
+ }
1421
+ /** `dxo-size` — fixed chart height. */
1422
+ declare class NxeSizeComponent {
1423
+ readonly width: _angular_core.InputSignal<number>;
1424
+ readonly height: _angular_core.InputSignal<number>;
1425
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NxeSizeComponent, never>;
1426
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NxeSizeComponent, "nxe-size", never, { "width": { "alias": "width"; "required": false; "isSignal": true; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1427
+ }
1428
+ /** `dxo-adaptive-layout` — responsive breakpoint width (the chart fills its container above it). */
1429
+ declare class NxeAdaptiveLayoutComponent {
1430
+ readonly width: _angular_core.InputSignal<number>;
1431
+ readonly height: _angular_core.InputSignal<number>;
1432
+ readonly keepLabels: _angular_core.InputSignal<boolean>;
1433
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NxeAdaptiveLayoutComponent, never>;
1434
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NxeAdaptiveLayoutComponent, "nxe-adaptive-layout", never, { "width": { "alias": "width"; "required": false; "isSignal": true; }; "height": { "alias": "height"; "required": false; "isSignal": true; }; "keepLabels": { "alias": "keepLabels"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1435
+ }
1436
+ interface BarRect {
1437
+ x: number;
1438
+ y: number;
1439
+ w: number;
1440
+ h: number;
1441
+ fill: string;
1442
+ }
1443
+ declare class NxeChartComponent {
1444
+ readonly dataSource: _angular_core.InputSignal<NxeChartSeries>;
1445
+ protected readonly commonSeries: _angular_core.Signal<NxeCommonSeriesSettingsComponent>;
1446
+ protected readonly size: _angular_core.Signal<NxeSizeComponent>;
1447
+ protected readonly adaptiveLayout: _angular_core.Signal<NxeAdaptiveLayoutComponent>;
1448
+ /** Series pushed by `pivotGrid.bindChart(...)`; falls back to the `[dataSource]` input. */
1449
+ private readonly pushed;
1450
+ protected readonly series: _angular_core.Signal<NxeChartSeries>;
1451
+ protected readonly chartHeight: _angular_core.Signal<number>;
1452
+ protected readonly chartWidth: _angular_core.Signal<number>;
1453
+ protected readonly hasData: _angular_core.Signal<boolean>;
1454
+ private readonly PAD;
1455
+ protected readonly bars: _angular_core.Signal<BarRect[]>;
1456
+ protected readonly legend: _angular_core.Signal<{
1457
+ name: string;
1458
+ fill: string;
1459
+ }[]>;
1460
+ protected readonly baselineY: _angular_core.Signal<number>;
1461
+ protected readonly axisLeft: _angular_core.Signal<number>;
1462
+ protected readonly axisRight: _angular_core.Signal<number>;
1463
+ private readonly facade;
1464
+ get instance(): NxeChartInstance;
1465
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NxeChartComponent, never>;
1466
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NxeChartComponent, "nxe-chart", never, { "dataSource": { "alias": "dataSource"; "required": false; "isSignal": true; }; }, {}, ["commonSeries", "size", "adaptiveLayout"], never, true, never>;
1467
+ }
1468
+
1469
+ export { NXE_PIVOT_TEXTS_DEFAULTS, NxeAdaptiveLayoutComponent, NxeChartComponent, NxeCommonSeriesSettingsComponent, NxeExcelExportService, NxeFieldChooserComponent, NxeFieldPanelComponent, NxePivotDataSource, NxePivotFieldChipComponent, NxePivotFieldChooserComponent, NxePivotFieldPanelComponent, NxePivotGridComponent, NxeSizeComponent, NxeStateStoringComponent, buildChip, exportPivotGrid };
1470
+ export type { NxeChartInstance, NxeChartSeries, NxeExportPivotGridOptions, NxePivotArea, NxePivotBindChartOptions, NxePivotBodyRow, NxePivotCellData, NxePivotCellEvent, NxePivotColumnLeaf, NxePivotContentReadyEvent, NxePivotCustomSummaryInfo, NxePivotDataSourceOptions, NxePivotExportingEvent, NxePivotField, NxePivotFieldMoveEvent, NxePivotFieldOverride, NxePivotFilterOpenEvent, NxePivotGridInstance, NxePivotGroupInterval, NxePivotHeaderCell, NxePivotModel, NxePivotModelOptions, NxePivotOptionChangedEvent, NxePivotPanelChip, NxePivotRowHeaderCell, NxePivotRowHeaderLayout, NxePivotRowKind, NxePivotSummaryCell, NxePivotSummaryDisplayMode, NxePivotSummaryType, NxePivotTexts, NxePivotTotalsPrior };