@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.
- package/LICENSE +202 -0
- package/NOTICE +16 -0
- package/README.md +64 -0
- package/fesm2022/nexterajs-ui-animations.mjs +184 -0
- package/fesm2022/nexterajs-ui-animations.mjs.map +1 -0
- package/fesm2022/nexterajs-ui-core.mjs +326 -0
- package/fesm2022/nexterajs-ui-core.mjs.map +1 -0
- package/fesm2022/nexterajs-ui-dropdowns.mjs +953 -0
- package/fesm2022/nexterajs-ui-dropdowns.mjs.map +1 -0
- package/fesm2022/nexterajs-ui-excel.mjs +779 -0
- package/fesm2022/nexterajs-ui-excel.mjs.map +1 -0
- package/fesm2022/nexterajs-ui-file-uploader.mjs +125 -0
- package/fesm2022/nexterajs-ui-file-uploader.mjs.map +1 -0
- package/fesm2022/nexterajs-ui-forms.mjs +1113 -0
- package/fesm2022/nexterajs-ui-forms.mjs.map +1 -0
- package/fesm2022/nexterajs-ui-grid.mjs +4145 -0
- package/fesm2022/nexterajs-ui-grid.mjs.map +1 -0
- package/fesm2022/nexterajs-ui-intl.mjs +377 -0
- package/fesm2022/nexterajs-ui-intl.mjs.map +1 -0
- package/fesm2022/nexterajs-ui-pivot.mjs +4739 -0
- package/fesm2022/nexterajs-ui-pivot.mjs.map +1 -0
- package/fesm2022/nexterajs-ui-styling.mjs +59 -0
- package/fesm2022/nexterajs-ui-styling.mjs.map +1 -0
- package/fesm2022/nexterajs-ui-tree-view.mjs +202 -0
- package/fesm2022/nexterajs-ui-tree-view.mjs.map +1 -0
- package/fesm2022/nexterajs-ui-validation.mjs +269 -0
- package/fesm2022/nexterajs-ui-validation.mjs.map +1 -0
- package/fesm2022/nexterajs-ui.mjs +23 -0
- package/fesm2022/nexterajs-ui.mjs.map +1 -0
- package/package.json +100 -0
- package/styles/_button-directives.scss +39 -0
- package/styles/_dropdown.scss +113 -0
- package/styles/_editor.scss +146 -0
- package/styles/_mixins.scss +2 -0
- package/styles/_tokens.scss +77 -0
- package/styles/_widget.scss +58 -0
- package/styles/index.scss +83 -0
- package/types/nexterajs-ui-animations.d.ts +22 -0
- package/types/nexterajs-ui-core.d.ts +328 -0
- package/types/nexterajs-ui-dropdowns.d.ts +334 -0
- package/types/nexterajs-ui-excel.d.ts +159 -0
- package/types/nexterajs-ui-file-uploader.d.ts +47 -0
- package/types/nexterajs-ui-forms.d.ts +296 -0
- package/types/nexterajs-ui-grid.d.ts +1485 -0
- package/types/nexterajs-ui-intl.d.ts +125 -0
- package/types/nexterajs-ui-pivot.d.ts +1470 -0
- package/types/nexterajs-ui-styling.d.ts +40 -0
- package/types/nexterajs-ui-tree-view.d.ts +69 -0
- package/types/nexterajs-ui-validation.d.ts +102 -0
- 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 };
|