@nexterajs/ui 0.0.1 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (63) hide show
  1. package/README.md +279 -34
  2. package/fesm2022/nexterajs-ui-charts.mjs +1096 -0
  3. package/fesm2022/nexterajs-ui-charts.mjs.map +1 -0
  4. package/fesm2022/nexterajs-ui-core.mjs +835 -11
  5. package/fesm2022/nexterajs-ui-core.mjs.map +1 -1
  6. package/fesm2022/nexterajs-ui-display.mjs +1142 -0
  7. package/fesm2022/nexterajs-ui-display.mjs.map +1 -0
  8. package/fesm2022/nexterajs-ui-dropdowns.mjs +621 -69
  9. package/fesm2022/nexterajs-ui-dropdowns.mjs.map +1 -1
  10. package/fesm2022/nexterajs-ui-file-uploader.mjs +576 -11
  11. package/fesm2022/nexterajs-ui-file-uploader.mjs.map +1 -1
  12. package/fesm2022/nexterajs-ui-forms.mjs +2702 -452
  13. package/fesm2022/nexterajs-ui-forms.mjs.map +1 -1
  14. package/fesm2022/nexterajs-ui-grid.mjs +2350 -336
  15. package/fesm2022/nexterajs-ui-grid.mjs.map +1 -1
  16. package/fesm2022/nexterajs-ui-intl.mjs +117 -15
  17. package/fesm2022/nexterajs-ui-intl.mjs.map +1 -1
  18. package/fesm2022/nexterajs-ui-navigation.mjs +1054 -0
  19. package/fesm2022/nexterajs-ui-navigation.mjs.map +1 -0
  20. package/fesm2022/nexterajs-ui-notify.mjs +353 -0
  21. package/fesm2022/nexterajs-ui-notify.mjs.map +1 -0
  22. package/fesm2022/nexterajs-ui-overlay.mjs +1671 -0
  23. package/fesm2022/nexterajs-ui-overlay.mjs.map +1 -0
  24. package/fesm2022/nexterajs-ui-pivot.mjs +191 -136
  25. package/fesm2022/nexterajs-ui-pivot.mjs.map +1 -1
  26. package/fesm2022/nexterajs-ui-shell.mjs +542 -0
  27. package/fesm2022/nexterajs-ui-shell.mjs.map +1 -0
  28. package/fesm2022/nexterajs-ui-styling.mjs +568 -3
  29. package/fesm2022/nexterajs-ui-styling.mjs.map +1 -1
  30. package/fesm2022/nexterajs-ui-tree-view.mjs +150 -18
  31. package/fesm2022/nexterajs-ui-tree-view.mjs.map +1 -1
  32. package/fesm2022/nexterajs-ui-validation.mjs +283 -97
  33. package/fesm2022/nexterajs-ui-validation.mjs.map +1 -1
  34. package/fesm2022/nexterajs-ui.mjs +6 -0
  35. package/fesm2022/nexterajs-ui.mjs.map +1 -1
  36. package/package.json +37 -2
  37. package/styles/_dropdown.scss +150 -1
  38. package/styles/_editor.scss +75 -21
  39. package/styles/_icons.scss +92 -0
  40. package/styles/_mixins.scss +104 -1
  41. package/styles/_scrollbar.scss +134 -0
  42. package/styles/_status.scss +21 -0
  43. package/styles/_toast.scss +243 -0
  44. package/styles/_tokens.scss +467 -2
  45. package/styles/_widget.scss +14 -3
  46. package/styles/index.scss +10 -4
  47. package/types/nexterajs-ui-charts.d.ts +446 -0
  48. package/types/nexterajs-ui-core.d.ts +515 -30
  49. package/types/nexterajs-ui-display.d.ts +720 -0
  50. package/types/nexterajs-ui-dropdowns.d.ts +318 -57
  51. package/types/nexterajs-ui-file-uploader.d.ts +240 -8
  52. package/types/nexterajs-ui-forms.d.ts +772 -43
  53. package/types/nexterajs-ui-grid.d.ts +878 -135
  54. package/types/nexterajs-ui-intl.d.ts +39 -4
  55. package/types/nexterajs-ui-navigation.d.ts +531 -0
  56. package/types/nexterajs-ui-notify.d.ts +149 -0
  57. package/types/nexterajs-ui-overlay.d.ts +703 -0
  58. package/types/nexterajs-ui-pivot.d.ts +91 -70
  59. package/types/nexterajs-ui-shell.d.ts +294 -0
  60. package/types/nexterajs-ui-styling.d.ts +163 -3
  61. package/types/nexterajs-ui-tree-view.d.ts +56 -4
  62. package/types/nexterajs-ui-validation.d.ts +110 -22
  63. package/types/nexterajs-ui.d.ts +6 -0
@@ -1,12 +1,14 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { Injectable, input, ViewEncapsulation, ChangeDetectionStrategy, Component, output, viewChild, inject, ElementRef, NgZone, computed, signal, EventEmitter, contentChild, ViewContainerRef, linkedSignal, afterRenderEffect, Output } from '@angular/core';
3
3
  import { exportNxeGridToExcel, nxeDatePattern, nxeFormatNumberValue, nxeExcelNumFmt, NxeDragGesture, NxeScrollingComponent, NxeHeaderFilterModel, openNxeHeaderFilterOverlay, NXE_HF_BLANKS } from '@nexterajs/ui/grid';
4
- import { parseDateValue, formatDisplay } from '@nexterajs/ui/intl';
4
+ import { parseDateValue, formatDisplay, NXE_NUMBER_SEPARATORS } from '@nexterajs/ui/intl';
5
5
  import { NgTemplateOutlet } from '@angular/common';
6
6
  import { toObservable, takeUntilDestroyed } from '@angular/core/rxjs-interop';
7
7
  import { Overlay } from '@angular/cdk/overlay';
8
8
  import { ComponentPortal } from '@angular/cdk/portal';
9
9
  import { combineLatest, filter, take, pairwise } from 'rxjs';
10
+ import { NxeMessageService } from '@nexterajs/ui/core';
11
+ import { Info } from 'luxon';
10
12
  import { nxePane } from '@nexterajs/ui/styling';
11
13
  import { Workbook, nxeSaveAs } from '@nexterajs/ui/excel';
12
14
 
@@ -206,7 +208,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImpor
206
208
 
207
209
  /* eslint-disable @typescript-eslint/no-explicit-any */
208
210
  // Types for the nxe-pivot-grid + nxe-chart subsystem — an in-house 2D cross-tab engine that
209
- // replaces DevExtreme's `dx-pivot-grid` / `PivotGridDataSource`. Per plan deviation #6 this
211
+ // replaces DevExtreme's `nxe-pivot-grid` / `PivotGridDataSource`. Per plan deviation #6 this
210
212
  // implements the simplified surface the app actually uses: ≤2 row levels, 1 column level,
211
213
  // data fields nested as the inner column level (`dataFieldArea` defaults to `'column'`), and
212
214
  // `sum`/`count`/`min`/`max`/`avg` aggregation (the app only uses `sum`).
@@ -1065,14 +1067,16 @@ function fieldText(field, raw) {
1065
1067
  return text;
1066
1068
  }
1067
1069
  /** Format an aggregated numeric value per the data field's number format / customizeText. */
1068
- function dataText(field, value) {
1070
+ function dataText(field, value, separators) {
1069
1071
  if (value == null) {
1070
1072
  return '';
1071
1073
  }
1072
1074
  // W4 Lane 4: a `summaryType: 'custom'` cell holds whatever `totalValue` the callback left
1073
1075
  // — dx renders non-numeric values as-is (its formatter no-ops on them), so strings (and
1074
1076
  // anything else non-numeric) pass through unformatted; the number mask applies to numbers.
1075
- const formatted = typeof value === 'number' ? nxeFormatNumberValue(value, field.format) : String(value);
1077
+ const formatted = typeof value === 'number'
1078
+ ? nxeFormatNumberValue(value, field.format, separators)
1079
+ : String(value);
1076
1080
  if (field.customizeText) {
1077
1081
  return field.customizeText({ value, valueText: formatted });
1078
1082
  }
@@ -1181,9 +1185,9 @@ class NxePivotDataSource {
1181
1185
  const step = field.dataType === 'number' ? numericGroupInterval(field) : null;
1182
1186
  if (step && !field.customizeText && typeof field.selector !== 'function') {
1183
1187
  field.customizeText = (ci) => {
1184
- const secondText = nxeFormatNumberValue(ci.value + step, field.format);
1188
+ const secondText = nxeFormatNumberValue(ci.value + step, field.format, this.options.separators);
1185
1189
  const firstText = typeof ci.value === 'number'
1186
- ? nxeFormatNumberValue(ci.value, field.format)
1190
+ ? nxeFormatNumberValue(ci.value, field.format, this.options.separators)
1187
1191
  : ci.valueText;
1188
1192
  return firstText && secondText ? `${firstText} - ${secondText}` : '';
1189
1193
  };
@@ -1527,7 +1531,7 @@ class NxePivotDataSource {
1527
1531
  return this.valueAt(rowPath, leaf.colPath, leaf.dataIndex);
1528
1532
  }
1529
1533
  text(rowPath, leaf) {
1530
- return dataText(this.dataFields[leaf.dataIndex], this.cell(rowPath, leaf));
1534
+ return dataText(this.dataFields[leaf.dataIndex], this.cell(rowPath, leaf), this.options.separators);
1531
1535
  }
1532
1536
  numFmt(dataIndex) {
1533
1537
  return nxeExcelNumFmt(this.dataFields[dataIndex]?.format);
@@ -1578,7 +1582,7 @@ class NxePivotDataSource {
1578
1582
  const grandTotalCells = !measuresOnRows && opts.showRowGrandTotals && this.visibleDataFields.length > 0
1579
1583
  ? leaves.map((leaf) => {
1580
1584
  const value = resolveValue([], leaf.colPath, leaf.dataIndex);
1581
- return { value, text: dataText(this.dataFields[leaf.dataIndex], value) };
1585
+ return { value, text: dataText(this.dataFields[leaf.dataIndex], value, this.options.separators) };
1582
1586
  })
1583
1587
  : null;
1584
1588
  // Measures-on-rows: the grand-total footer splits into one row per VISIBLE measure,
@@ -1591,7 +1595,7 @@ class NxePivotDataSource {
1591
1595
  caption: df.caption ?? df.dataField ?? '',
1592
1596
  cells: leaves.map((leaf) => {
1593
1597
  const value = resolveValue([], leaf.colPath, di);
1594
- return { value, text: dataText(df, value) };
1598
+ return { value, text: dataText(df, value, this.options.separators) };
1595
1599
  }),
1596
1600
  };
1597
1601
  })
@@ -1616,7 +1620,7 @@ class NxePivotDataSource {
1616
1620
  // everything else (grand-total path `[]`, hidden paths, leaves from an older model).
1617
1621
  // With measures on rows the ROW carries the data index; otherwise the leaf does.
1618
1622
  const matrix = rows.map((row) => leaves.map((leaf) => resolveValue(row.path, leaf.colPath, row.dataIndex ?? leaf.dataIndex)));
1619
- const textMatrix = matrix.map((mr, ri) => mr.map((v, li) => dataText(this.dataFields[rows[ri].dataIndex ?? leaves[li].dataIndex], v)));
1623
+ const textMatrix = matrix.map((mr, ri) => mr.map((v, li) => dataText(this.dataFields[rows[ri].dataIndex ?? leaves[li].dataIndex], v, this.options.separators)));
1620
1624
  const rowIndexByPath = new Map();
1621
1625
  rows.forEach((row, ri) => {
1622
1626
  const key = pathKeyOf(row.path);
@@ -2229,23 +2233,39 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImpor
2229
2233
  // nxe-pivot-field-chip — the SHARED dx field chip (P3-C3). One rendering for every place a
2230
2234
  // field chip appears: the field panel's area bands / corner row area (P3-C2, table cells) and
2231
2235
  // the field chooser popup's four group areas (P3-C3, stacked divs). Attribute selector so the
2232
- // HOST element stays the caller's own `<div>` carrying dx's exact `.dx-area-field.dx-area-box`
2236
+ // HOST element stays the caller's own `<div>` carrying dx's exact `.nxe-area-field.nxe-area-box`
2233
2237
  // classes (fixtures/fields-panel.html and fixtures/field-chooser.html agree on the chip
2234
- // subtree: `.dx-area-field-content` + optional `.dx-column-indicators`).
2238
+ // subtree: `.nxe-area-field-content` + optional `.nxe-column-indicators`).
2235
2239
  //
2236
- // P3-C4: the header-filter funnel (`span.dx-header-filter`) renders beside the sort arrow —
2240
+ // P3-C4: the header-filter funnel (`span.nxe-header-filter`) renders beside the sort arrow —
2237
2241
  // dx FieldChooserBase.renderField applies the sort state first, then the headerFilter state,
2238
- // appending both into ONE `.dx-column-indicators` container (m_column_state_mixin reuses the
2239
- // container; ltr 'left' alignment appends, so the funnel sits AFTER the arrow). The funnel is
2240
- // clip-path-drawn (the grid's exact `.nxe-grid-hf-icon` pattern — DXIcons stays neutralised)
2241
- // in #757575: 50% alpha while no filter is applied (`.dx-header-filter-empty`,
2242
- // m_header_filter_core `_isHeaderFilterEmpty`: no/empty filterValues), full alpha when one is
2243
- // (oracle §c funnel colors). A funnel click must NOT sort: dx's chip click handler branches on
2244
- // `$(e.target).hasClass('dx-header-filter')` (m_field_chooser_base subscribeToEvents), so the
2245
- // funnel handler stops propagation before the host's own (click) fires.
2242
+ // appending both into ONE `.nxe-column-indicators` container (m_column_state_mixin reuses the
2243
+ // container; ltr 'left' alignment appends, so the funnel sits AFTER the arrow). A funnel click
2244
+ // must NOT sort: dx's chip click handler branches on `$(e.target).hasClass('nxe-header-filter')`
2245
+ // (m_field_chooser_base subscribeToEvents), so the funnel handler stops propagation before the
2246
+ // host's own (click) fires.
2247
+ //
2248
+ // WHERE the indicator block goes follows dx's showColumnLines rule
2249
+ // (m_column_state_mixin `_applyColumnState`): renderField(field, showColumnLines) PREPENDS the
2250
+ // block and floats it right (inline `float: right`, as dx sets it) when showColumnLines is on —
2251
+ // the field chooser (`renderField(field, true)`, m_field_chooser.js:465) and the panel's ROW area
2252
+ // (`renderField(field, "row" === field.area)`, m_fields_area.js:120). Everywhere else (panel
2253
+ // column / filter / data chips) it is APPENDED after the caption, inline, unfloated. The caller
2254
+ // says which through `floatIndicators`.
2255
+ //
2256
+ // The arrow and funnel are the library's own drawings (clip-path polygons written from round
2257
+ // pixel metrics — the DXIcons font is not used) in dx's 14px glyph box: `.dx-sort` #959595,
2258
+ // `.dx-header-filter` #757575 with the `-empty` state at 50% alpha
2259
+ // (`.dx-pivotgrid-fields-container .dx-header-filter-empty{color:rgba(117,117,117,.5)}`). An
2260
+ // app that shrinks `.nxe-column-indicators` (bright's `scale: .7`) shrinks them as it did dx's.
2246
2261
  class NxePivotFieldChipComponent {
2247
2262
  chip = input.required(/* @ts-ignore */
2248
2263
  ...(ngDevMode ? [{ debugName: "chip" }] : /* istanbul ignore next */ []));
2264
+ /** dx showColumnLines for this chip's surface: true in the field chooser and the panel's
2265
+ * ROW area — the indicators come FIRST and float right; false (panel column / filter /
2266
+ * data areas) — they follow the caption inline. */
2267
+ floatIndicators = input(false, /* @ts-ignore */
2268
+ ...(ngDevMode ? [{ debugName: "floatIndicators" }] : /* istanbul ignore next */ []));
2249
2269
  /** Raw pointerdown — the host decides whether a drag gesture may begin. */
2250
2270
  chipPointerDown = output();
2251
2271
  /** Chip click (the host consults its gesture's click suppression before sorting). */
@@ -2259,38 +2279,46 @@ class NxePivotFieldChipComponent {
2259
2279
  this.chipFilterClick.emit(event);
2260
2280
  }
2261
2281
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: NxePivotFieldChipComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2262
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.5", type: NxePivotFieldChipComponent, isStandalone: true, selector: "div[nxePivotFieldChip]", inputs: { chip: { classPropertyName: "chip", publicName: "chip", isSignal: true, isRequired: true, transformFunction: null } }, outputs: { chipPointerDown: "chipPointerDown", chipClick: "chipClick", chipFilterClick: "chipFilterClick" }, host: { listeners: { "pointerdown": "chipPointerDown.emit($event)", "click": "chipClick.emit()" }, classAttribute: "dx-area-field dx-area-box" }, ngImport: i0, template: `<div class="dx-area-field-content">{{ chip().caption }}</div>@if (chip().sortable || chip().filterable) {<div class="dx-column-indicators">@if (chip().sortable) {<span
2263
- class="dx-sort"
2264
- [class.dx-sort-up]="chip().sortOrder === 'asc'"
2265
- [class.dx-sort-down]="chip().sortOrder === 'desc'"></span>}@if (chip().filterable) {<span
2266
- class="dx-header-filter"
2267
- [class.dx-header-filter-empty]="!chip().filterActive"
2268
- (click)="onFunnelClick($event)"></span>}</div>}`, isInline: true, styles: [".dx-pivotgrid-fields-container .dx-header-filter{display:inline-block;position:relative;width:14px;height:14px;vertical-align:middle;cursor:pointer}.dx-pivotgrid-fields-container .dx-header-filter:before{content:\"\";position:absolute;inset:0;background-color:#757575;clip-path:polygon(0 0,100% 0,58% 50%,58% 100%,42% 85%,42% 50%)}.dx-pivotgrid-fields-container .dx-header-filter:after{content:\"\";position:absolute;inset:0;margin:-7px}.dx-pivotgrid-fields-container .dx-header-filter.dx-header-filter-empty{opacity:.5}.dx-pivotgrid-fields-container .dx-header-filter.dx-header-filter-empty:hover{opacity:.75}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
2282
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.5", type: NxePivotFieldChipComponent, isStandalone: true, selector: "div[nxePivotFieldChip]", inputs: { chip: { classPropertyName: "chip", publicName: "chip", isSignal: true, isRequired: true, transformFunction: null }, floatIndicators: { classPropertyName: "floatIndicators", publicName: "floatIndicators", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { chipPointerDown: "chipPointerDown", chipClick: "chipClick", chipFilterClick: "chipFilterClick" }, host: { listeners: { "pointerdown": "chipPointerDown.emit($event)", "click": "chipClick.emit()" }, classAttribute: "nxe-area-field nxe-area-box" }, ngImport: i0, template: `@if (floatIndicators()) {<ng-container *ngTemplateOutlet="indicators" />}<div class="nxe-area-field-content">{{ chip().caption }}</div>@if (!floatIndicators()) {<ng-container *ngTemplateOutlet="indicators" />}
2283
+ <ng-template #indicators>@if (chip().sortable || chip().filterable) {<div
2284
+ class="nxe-column-indicators"
2285
+ role="presentation"
2286
+ [style.float]="floatIndicators() ? 'right' : null">@if (chip().sortable) {<span
2287
+ class="nxe-sort"
2288
+ [class.nxe-sort-up]="chip().sortOrder === 'asc'"
2289
+ [class.nxe-sort-down]="chip().sortOrder === 'desc'"></span>}@if (chip().filterable) {<span
2290
+ class="nxe-header-filter"
2291
+ [class.nxe-header-filter-empty]="!chip().filterActive"
2292
+ (click)="onFunnelClick($event)"></span>}</div>}</ng-template>`, isInline: true, styles: [".nxe-pivotgrid-fields-container .nxe-area-fields{position:relative}.nxe-pivotgrid-fields-container .nxe-area-field{cursor:pointer}.nxe-pivotgrid-fields-container .nxe-area-field.nxe-area-box{box-sizing:border-box;margin-bottom:4px;padding:7px 10px;border:1px solid var(--nxe-ui-border, #ddd);background-color:var(--nxe-ui-surface, #fff)}.nxe-pivotgrid .nxe-area-field.nxe-area-box{margin-bottom:0}.nxe-pivotgrid-fields-container .nxe-area-field-content{overflow:hidden;text-overflow:ellipsis;vertical-align:bottom}.nxe-pivotgrid .nxe-area-field-content,.nxe-pivotgrid .nxe-column-indicators{display:inline-block}.nxe-pivotgrid .nxe-area-field,.nxe-pivotgrid .nxe-area-field-content{white-space:nowrap}.nxe-pivotgrid-fields-container .nxe-column-indicators{margin-left:6px;line-height:19px;vertical-align:bottom;white-space:nowrap}.nxe-pivotgrid-fields-container .nxe-column-indicators .nxe-sort,.nxe-pivotgrid-fields-container .nxe-column-indicators .nxe-header-filter{display:inline-block;position:relative;box-sizing:border-box;width:14px;height:14px;vertical-align:-.875px}.nxe-pivotgrid-fields-container .nxe-column-indicators .nxe-sort:before,.nxe-pivotgrid-fields-container .nxe-column-indicators .nxe-header-filter:before{content:\"\";position:absolute;inset:0;box-sizing:border-box;background-color:currentColor}.nxe-pivotgrid-fields-container .nxe-column-indicators .nxe-sort:after,.nxe-pivotgrid-fields-container .nxe-column-indicators .nxe-header-filter:after{content:none}.nxe-pivotgrid-fields-container .nxe-column-indicators .nxe-sort{color:#959595}.nxe-pivotgrid-fields-container .nxe-column-indicators .nxe-sort-up:before{clip-path:polygon(6.5px 0,9px 3px,7px 3px,7px 14px,6px 14px,6px 3px,4px 3px)}.nxe-pivotgrid-fields-container .nxe-column-indicators .nxe-sort-down:before{clip-path:polygon(6px 0,7px 0,7px 11px,9px 11px,6.5px 14px,4px 11px,6px 11px)}.nxe-pivotgrid-fields-container .nxe-column-indicators .nxe-header-filter{color:#757575;cursor:pointer}.nxe-pivotgrid-fields-container .nxe-column-indicators .nxe-header-filter-empty{color:#75757580}.nxe-pivotgrid-fields-container .nxe-column-indicators .nxe-header-filter:before{clip-path:polygon(0 0,14px 0,14px 3px,9px 8px,9px 14px,5px 14px,5px 8px,0 3px)}@media(forced-colors:active){.nxe-pivotgrid-fields-container .nxe-column-indicators .nxe-sort:before,.nxe-pivotgrid-fields-container .nxe-column-indicators .nxe-header-filter:before{forced-color-adjust:none;background-color:CanvasText}}.nxe-pivotgrid-fields-container.nxe-drag{opacity:.8}.nxe-pivotgrid-fields-container.nxe-drag .nxe-area-field.nxe-area-box{border:1px solid rgba(51,122,183,.5);box-shadow:0 0 1px #0000001a,0 1px 3px #0003}.nxe-pivotgrid-fields-container.nxe-drag .nxe-area-field-content{display:inline-block}.nxe-pivotgrid-fields-container.nxe-drag .nxe-column-indicators{display:inline-block;float:none}.nxe-pivotgrid-fields-container .nxe-drag-source{opacity:.5}.nxe-pivotgrid-fields-container .nxe-position-indicator{background-color:gray}.nxe-pivotgrid-fields-container .nxe-position-indicator.nxe-position-indicator-vertical{height:2px;margin-top:-4px;margin-left:-1px}.nxe-pivotgrid-fields-container .nxe-position-indicator.nxe-position-indicator-vertical.nxe-position-indicator-last{margin-top:-3px}.nxe-pivotgrid-fields-container .nxe-position-indicator.nxe-position-indicator-horizontal{width:2px;margin-left:-3px}.nxe-pivotgrid-fields-container .nxe-position-indicator.nxe-position-indicator-horizontal.nxe-position-indicator-last{margin-left:3px}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
2269
2293
  }
2270
2294
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: NxePivotFieldChipComponent, decorators: [{
2271
2295
  type: Component,
2272
- args: [{ selector: 'div[nxePivotFieldChip]', standalone: true, template: `<div class="dx-area-field-content">{{ chip().caption }}</div>@if (chip().sortable || chip().filterable) {<div class="dx-column-indicators">@if (chip().sortable) {<span
2273
- class="dx-sort"
2274
- [class.dx-sort-up]="chip().sortOrder === 'asc'"
2275
- [class.dx-sort-down]="chip().sortOrder === 'desc'"></span>}@if (chip().filterable) {<span
2276
- class="dx-header-filter"
2277
- [class.dx-header-filter-empty]="!chip().filterActive"
2278
- (click)="onFunnelClick($event)"></span>}</div>}`, host: {
2279
- class: 'dx-area-field dx-area-box',
2296
+ args: [{ selector: 'div[nxePivotFieldChip]', standalone: true, template: `@if (floatIndicators()) {<ng-container *ngTemplateOutlet="indicators" />}<div class="nxe-area-field-content">{{ chip().caption }}</div>@if (!floatIndicators()) {<ng-container *ngTemplateOutlet="indicators" />}
2297
+ <ng-template #indicators>@if (chip().sortable || chip().filterable) {<div
2298
+ class="nxe-column-indicators"
2299
+ role="presentation"
2300
+ [style.float]="floatIndicators() ? 'right' : null">@if (chip().sortable) {<span
2301
+ class="nxe-sort"
2302
+ [class.nxe-sort-up]="chip().sortOrder === 'asc'"
2303
+ [class.nxe-sort-down]="chip().sortOrder === 'desc'"></span>}@if (chip().filterable) {<span
2304
+ class="nxe-header-filter"
2305
+ [class.nxe-header-filter-empty]="!chip().filterActive"
2306
+ (click)="onFunnelClick($event)"></span>}</div>}</ng-template>`, imports: [NgTemplateOutlet], host: {
2307
+ class: 'nxe-area-field nxe-area-box',
2280
2308
  '(pointerdown)': 'chipPointerDown.emit($event)',
2281
2309
  '(click)': 'chipClick.emit()',
2282
- }, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, styles: [".dx-pivotgrid-fields-container .dx-header-filter{display:inline-block;position:relative;width:14px;height:14px;vertical-align:middle;cursor:pointer}.dx-pivotgrid-fields-container .dx-header-filter:before{content:\"\";position:absolute;inset:0;background-color:#757575;clip-path:polygon(0 0,100% 0,58% 50%,58% 100%,42% 85%,42% 50%)}.dx-pivotgrid-fields-container .dx-header-filter:after{content:\"\";position:absolute;inset:0;margin:-7px}.dx-pivotgrid-fields-container .dx-header-filter.dx-header-filter-empty{opacity:.5}.dx-pivotgrid-fields-container .dx-header-filter.dx-header-filter-empty:hover{opacity:.75}\n"] }]
2283
- }], propDecorators: { chip: [{ type: i0.Input, args: [{ isSignal: true, alias: "chip", required: true }] }], chipPointerDown: [{ type: i0.Output, args: ["chipPointerDown"] }], chipClick: [{ type: i0.Output, args: ["chipClick"] }], chipFilterClick: [{ type: i0.Output, args: ["chipFilterClick"] }] } });
2310
+ }, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, styles: [".nxe-pivotgrid-fields-container .nxe-area-fields{position:relative}.nxe-pivotgrid-fields-container .nxe-area-field{cursor:pointer}.nxe-pivotgrid-fields-container .nxe-area-field.nxe-area-box{box-sizing:border-box;margin-bottom:4px;padding:7px 10px;border:1px solid var(--nxe-ui-border, #ddd);background-color:var(--nxe-ui-surface, #fff)}.nxe-pivotgrid .nxe-area-field.nxe-area-box{margin-bottom:0}.nxe-pivotgrid-fields-container .nxe-area-field-content{overflow:hidden;text-overflow:ellipsis;vertical-align:bottom}.nxe-pivotgrid .nxe-area-field-content,.nxe-pivotgrid .nxe-column-indicators{display:inline-block}.nxe-pivotgrid .nxe-area-field,.nxe-pivotgrid .nxe-area-field-content{white-space:nowrap}.nxe-pivotgrid-fields-container .nxe-column-indicators{margin-left:6px;line-height:19px;vertical-align:bottom;white-space:nowrap}.nxe-pivotgrid-fields-container .nxe-column-indicators .nxe-sort,.nxe-pivotgrid-fields-container .nxe-column-indicators .nxe-header-filter{display:inline-block;position:relative;box-sizing:border-box;width:14px;height:14px;vertical-align:-.875px}.nxe-pivotgrid-fields-container .nxe-column-indicators .nxe-sort:before,.nxe-pivotgrid-fields-container .nxe-column-indicators .nxe-header-filter:before{content:\"\";position:absolute;inset:0;box-sizing:border-box;background-color:currentColor}.nxe-pivotgrid-fields-container .nxe-column-indicators .nxe-sort:after,.nxe-pivotgrid-fields-container .nxe-column-indicators .nxe-header-filter:after{content:none}.nxe-pivotgrid-fields-container .nxe-column-indicators .nxe-sort{color:#959595}.nxe-pivotgrid-fields-container .nxe-column-indicators .nxe-sort-up:before{clip-path:polygon(6.5px 0,9px 3px,7px 3px,7px 14px,6px 14px,6px 3px,4px 3px)}.nxe-pivotgrid-fields-container .nxe-column-indicators .nxe-sort-down:before{clip-path:polygon(6px 0,7px 0,7px 11px,9px 11px,6.5px 14px,4px 11px,6px 11px)}.nxe-pivotgrid-fields-container .nxe-column-indicators .nxe-header-filter{color:#757575;cursor:pointer}.nxe-pivotgrid-fields-container .nxe-column-indicators .nxe-header-filter-empty{color:#75757580}.nxe-pivotgrid-fields-container .nxe-column-indicators .nxe-header-filter:before{clip-path:polygon(0 0,14px 0,14px 3px,9px 8px,9px 14px,5px 14px,5px 8px,0 3px)}@media(forced-colors:active){.nxe-pivotgrid-fields-container .nxe-column-indicators .nxe-sort:before,.nxe-pivotgrid-fields-container .nxe-column-indicators .nxe-header-filter:before{forced-color-adjust:none;background-color:CanvasText}}.nxe-pivotgrid-fields-container.nxe-drag{opacity:.8}.nxe-pivotgrid-fields-container.nxe-drag .nxe-area-field.nxe-area-box{border:1px solid rgba(51,122,183,.5);box-shadow:0 0 1px #0000001a,0 1px 3px #0003}.nxe-pivotgrid-fields-container.nxe-drag .nxe-area-field-content{display:inline-block}.nxe-pivotgrid-fields-container.nxe-drag .nxe-column-indicators{display:inline-block;float:none}.nxe-pivotgrid-fields-container .nxe-drag-source{opacity:.5}.nxe-pivotgrid-fields-container .nxe-position-indicator{background-color:gray}.nxe-pivotgrid-fields-container .nxe-position-indicator.nxe-position-indicator-vertical{height:2px;margin-top:-4px;margin-left:-1px}.nxe-pivotgrid-fields-container .nxe-position-indicator.nxe-position-indicator-vertical.nxe-position-indicator-last{margin-top:-3px}.nxe-pivotgrid-fields-container .nxe-position-indicator.nxe-position-indicator-horizontal{width:2px;margin-left:-3px}.nxe-pivotgrid-fields-container .nxe-position-indicator.nxe-position-indicator-horizontal.nxe-position-indicator-last{margin-left:3px}\n"] }]
2311
+ }], propDecorators: { chip: [{ type: i0.Input, args: [{ isSignal: true, alias: "chip", required: true }] }], floatIndicators: [{ type: i0.Input, args: [{ isSignal: true, alias: "floatIndicators", required: false }] }], chipPointerDown: [{ type: i0.Output, args: ["chipPointerDown"] }], chipClick: [{ type: i0.Output, args: ["chipClick"] }], chipFilterClick: [{ type: i0.Output, args: ["chipFilterClick"] }] } });
2284
2312
 
2285
2313
  /* eslint-disable @typescript-eslint/no-explicit-any */
2286
2314
  // nxe-pivot-field-panel — the dx field panel (dxo-field-panel), P3-C2. Renders the
2287
- // `.dx-pivotgrid-fields-area` blocks harvested from the live broker reference
2315
+ // `.nxe-pivotgrid-fields-area` blocks harvested from the live broker reference
2288
2316
  // (tools/visual-parity/reference/pivot/fixtures/fields-panel.html, ORACLE.md §c): filter strip
2289
2317
  // on top, then data + column header cells side by side. The ROW area is NOT a band of this
2290
- // panel: dx hosts it inside the cross-tab's corner `.dx-area-description-cell`
2318
+ // panel: dx hosts it inside the cross-tab's corner `.nxe-area-description-cell`
2291
2319
  // (views/0/initial-full-page.png — the 'Lob' chip sits in the corner, no caption text), so it
2292
2320
  // is exposed as `rowAreaTemplate` and NxePivotGridComponent outlets it into its corner cell.
2293
- // Chips are `.dx-area-field.dx-area-box > .dx-area-field-content`; an empty area shows dx's
2321
+ // Chips are `.nxe-area-field.nxe-area-box > .nxe-area-field-content`; an empty area shows dx's
2294
2322
  // exact localization string ("Drop Filter Fields Here" etc. — dx fieldPanel.texts defaults).
2295
2323
  //
2296
2324
  // The panel is DUMB about field state: it reads chips off the pivot's engine (which already has
@@ -2300,16 +2328,16 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImpor
2300
2328
  //
2301
2329
  // Dragging reuses the shared NxeDragGesture core extracted from the grid controller (same 5px
2302
2330
  // threshold / Escape / click-suppression semantics the group-drag audit pinned); the ghost is
2303
- // dx's `.dx-pivotgrid-fields-container.dx-drag` chip clone, the insertion mark dx's
2304
- // `.dx-position-indicator` 2px bar. Drop zones are hit-tested from the PIVOT root (the row area
2331
+ // dx's `.nxe-pivotgrid-fields-container.nxe-drag` chip clone, the insertion mark dx's
2332
+ // `.nxe-position-indicator` 2px bar. Drop zones are hit-tested from the PIVOT root (the row area
2305
2333
  // lives in the cross-tab corner): the whole corner cell is the row drop target and carries the
2306
- // `dx-drag-target` highlight; the other areas highlight their fields-area element.
2307
- /** dx `fieldPanel.texts` defaults (dxPivotGrid docs; the filter string matches the fixture). */
2308
- const EMPTY_AREA_TEXTS = {
2309
- filter: 'Drop Filter Fields Here',
2310
- data: 'Drop Data Fields Here',
2311
- column: 'Drop Column Fields Here',
2312
- row: 'Drop Row Fields Here',
2334
+ // `nxe-drag-target` highlight; the other areas highlight their fields-area element.
2335
+ /** dx `fieldPanel.texts` (dxPivotGrid docs; the English filter string matches the fixture), as message keys. */
2336
+ const EMPTY_AREA_TEXT_KEYS = {
2337
+ filter: 'pivot.panel.dropFilter',
2338
+ data: 'pivot.panel.dropData',
2339
+ column: 'pivot.panel.dropColumn',
2340
+ row: 'pivot.panel.dropRow',
2313
2341
  };
2314
2342
  /**
2315
2343
  * One chip's model, shared by the panel and the chooser (P3-C4). Per-field flag precedence is
@@ -2357,10 +2385,10 @@ class NxePivotFieldPanelComponent {
2357
2385
  allowFiltering = input(false, /* @ts-ignore */
2358
2386
  ...(ngDevMode ? [{ debugName: "allowFiltering" }] : /* istanbul ignore next */ []));
2359
2387
  /** Widget `showBorders`: the panel bands sit INSIDE the border box (dx draws the outer
2360
- * border around the filter/chip bands — `.dx-pivotgrid-border .dx-filter-header` et al). */
2388
+ * border around the filter/chip bands — `.nxe-pivotgrid-border .nxe-filter-header` et al). */
2361
2389
  showBorders = input(false, /* @ts-ignore */
2362
2390
  ...(ngDevMode ? [{ debugName: "showBorders" }] : /* istanbul ignore next */ []));
2363
- /** P3-C3: the pivot's `.dx-pivotgrid-toolbar` template (field-chooser button) — rendered
2391
+ /** P3-C3: the pivot's `.nxe-pivotgrid-toolbar` template (field-chooser button) — rendered
2364
2392
  * where dx prepends its toolbar container (m_widget.js `_renderDescriptionArea`). */
2365
2393
  toolbarTemplate = input(null, /* @ts-ignore */
2366
2394
  ...(ngDevMode ? [{ debugName: "toolbarTemplate" }] : /* istanbul ignore next */ []));
@@ -2379,10 +2407,11 @@ class NxePivotFieldPanelComponent {
2379
2407
  /** A chip's funnel was clicked — the pivot opens the header-filter panel (P3-C4). */
2380
2408
  filterOpen = output();
2381
2409
  /** The ROW fields area — NxePivotGridComponent outlets this into its corner cell (dx hosts
2382
- * the row chips inside `.dx-area-description-cell`, never in a band of their own). */
2410
+ * the row chips inside `.nxe-area-description-cell`, never in a band of their own). */
2383
2411
  rowAreaTemplate = viewChild('rowAreaTpl', /* @ts-ignore */
2384
2412
  ...(ngDevMode ? [{ debugName: "rowAreaTemplate" }] : /* istanbul ignore next */ []));
2385
2413
  elementRef = inject((ElementRef));
2414
+ messages = inject(NxeMessageService);
2386
2415
  zone = inject(NgZone);
2387
2416
  filterArea = computed(() => this.buildArea('filter'), /* @ts-ignore */
2388
2417
  ...(ngDevMode ? [{ debugName: "filterArea" }] : /* istanbul ignore next */ []));
@@ -2398,26 +2427,26 @@ class NxePivotFieldPanelComponent {
2398
2427
  // --- Dragging -----------------------------------------------------------------------------
2399
2428
  drag = null;
2400
2429
  gesture = new NxeDragGesture(this.zone, {
2401
- // dx ghost: the fields-container drag clone — `.dx-drag` opacity .8, chip re-bordered
2402
- // rgba(51,122,183,.5) with the drag shadow (dx-compat chip-chrome block). `nxe-widget`
2430
+ // dx ghost: the fields-container drag clone — `.nxe-drag` opacity .8, chip re-bordered
2431
+ // rgba(51,122,183,.5) with the drag shadow (nxe-pivot-field-chip's styles). `nxe-widget`
2403
2432
  // carries the 12.24px widget font stack across the <body> boundary, exactly as the
2404
2433
  // library's overlay panes do (styling/_widget.scss) — without it the ghost renders in
2405
2434
  // the page's body font.
2406
2435
  createGhost: () => {
2407
2436
  const ghost = document.createElement('div');
2408
2437
  ghost.className =
2409
- 'nxe-widget dx-pivotgrid-fields-container dx-drag nxe-pivot-drag-ghost';
2438
+ 'nxe-widget nxe-pivotgrid-fields-container nxe-drag nxe-pivot-drag-ghost';
2410
2439
  const chip = document.createElement('div');
2411
- chip.className = 'dx-area-field dx-area-box';
2440
+ chip.className = 'nxe-area-field nxe-area-box';
2412
2441
  const content = document.createElement('div');
2413
- content.className = 'dx-area-field-content';
2442
+ content.className = 'nxe-area-field-content';
2414
2443
  content.textContent = this.drag?.chip.caption ?? '';
2415
2444
  chip.appendChild(content);
2416
2445
  ghost.appendChild(chip);
2417
2446
  return ghost;
2418
2447
  },
2419
- // dx dims the source chip with `dx-drag-source` (opacity .5 via the container scope).
2420
- sourceDragClasses: ['dx-drag-source'],
2448
+ // dx dims the source chip with `nxe-drag-source` (opacity .5 via the container scope).
2449
+ sourceDragClasses: ['nxe-drag-source'],
2421
2450
  dragMove: (x, y) => this.trackPointer(x, y),
2422
2451
  drop: () => this.completeDrop(),
2423
2452
  clearDropVisuals: () => {
@@ -2428,8 +2457,8 @@ class NxePivotFieldPanelComponent {
2428
2457
  d.targetEl = null;
2429
2458
  }
2430
2459
  this.dragRoot()
2431
- .querySelectorAll('.dx-drag-target')
2432
- .forEach((el) => el.classList.remove('dx-drag-target'));
2460
+ .querySelectorAll('.nxe-drag-target')
2461
+ .forEach((el) => el.classList.remove('nxe-drag-target'));
2433
2462
  },
2434
2463
  reset: () => {
2435
2464
  this.drag = null;
@@ -2467,14 +2496,14 @@ class NxePivotFieldPanelComponent {
2467
2496
  if (this.gesture.consumeClick()) {
2468
2497
  return; // a drag released over the funnel must not also open the popup
2469
2498
  }
2470
- const origin = event.target?.closest('.dx-area-field') ??
2499
+ const origin = event.target?.closest('.nxe-area-field') ??
2471
2500
  event.target;
2472
2501
  this.filterOpen.emit({ fieldIndex: chip.fieldIndex, origin });
2473
2502
  }
2474
2503
  buildArea(group) {
2475
2504
  const engine = this.engine();
2476
2505
  const chips = (engine ? engine.areaFields(group) : []).map(({ fieldIndex, field }) => buildChip(fieldIndex, field, group, this.allowSorting(), this.allowFiltering()));
2477
- return { group, chips, emptyText: EMPTY_AREA_TEXTS[group] };
2506
+ return { group, chips, emptyText: this.messages.t(EMPTY_AREA_TEXT_KEYS[group]) };
2478
2507
  }
2479
2508
  /** Hit-test root: the whole pivot — the row area lives in the cross-tab corner cell. */
2480
2509
  dragRoot() {
@@ -2483,14 +2512,14 @@ class NxePivotFieldPanelComponent {
2483
2512
  }
2484
2513
  /**
2485
2514
  * Drop zones. For filter/data/column the fields-area element is both hit rect and highlight
2486
- * target; for ROW the enclosing corner cell (`th.dx-area-description-cell`) is — dx's row
2515
+ * target; for ROW the enclosing corner cell (`th.nxe-area-description-cell`) is — dx's row
2487
2516
  * area IS the corner, so a drop anywhere on it must land in rows, not read as "outside".
2488
2517
  */
2489
2518
  dropZones() {
2490
- return Array.from(this.dragRoot().querySelectorAll('.dx-pivotgrid-fields-area[group]')).map((areaEl) => {
2519
+ return Array.from(this.dragRoot().querySelectorAll('.nxe-pivotgrid-fields-area[group]')).map((areaEl) => {
2491
2520
  const group = areaEl.getAttribute('group');
2492
2521
  const corner = group === 'row'
2493
- ? areaEl.closest('th.dx-area-description-cell')
2522
+ ? areaEl.closest('th.nxe-area-description-cell')
2494
2523
  : null;
2495
2524
  return { group, hitEl: corner ?? areaEl, areaEl };
2496
2525
  });
@@ -2505,7 +2534,7 @@ class NxePivotFieldPanelComponent {
2505
2534
  return x >= r.left && x <= r.right && y >= r.top && y <= r.bottom;
2506
2535
  }) ?? null;
2507
2536
  if (d.targetEl && d.targetEl !== hit?.hitEl) {
2508
- d.targetEl.classList.remove('dx-drag-target');
2537
+ d.targetEl.classList.remove('nxe-drag-target');
2509
2538
  }
2510
2539
  if (!hit) {
2511
2540
  // Outside every area: no drop target — releasing here is a snap-back NO-OP
@@ -2517,10 +2546,10 @@ class NxePivotFieldPanelComponent {
2517
2546
  d.indicator = null;
2518
2547
  return;
2519
2548
  }
2520
- hit.hitEl.classList.add('dx-drag-target');
2549
+ hit.hitEl.classList.add('nxe-drag-target');
2521
2550
  d.targetEl = hit.hitEl;
2522
2551
  d.targetArea = hit.group;
2523
- const chips = Array.from(hit.areaEl.querySelectorAll('.dx-area-field.dx-area-box'));
2552
+ const chips = Array.from(hit.areaEl.querySelectorAll('.nxe-area-field.nxe-area-box'));
2524
2553
  let slot = chips.length;
2525
2554
  for (let i = 0; i < chips.length; i++) {
2526
2555
  const r = chips[i].getBoundingClientRect();
@@ -2532,7 +2561,7 @@ class NxePivotFieldPanelComponent {
2532
2561
  d.slot = slot;
2533
2562
  this.placeIndicator(d, hit.areaEl, chips, slot);
2534
2563
  }
2535
- /** dx `.dx-position-indicator`: a 2px gray bar between chips, inside the (positioned) area. */
2564
+ /** dx `.nxe-position-indicator`: a 2px gray bar between chips, inside the (positioned) area. */
2536
2565
  placeIndicator(d, areaEl, chips, slot) {
2537
2566
  if (!chips.length) {
2538
2567
  // Empty area: the dx-drag-target state marks the whole area; no bar to place.
@@ -2545,8 +2574,8 @@ class NxePivotFieldPanelComponent {
2545
2574
  }
2546
2575
  const last = slot >= chips.length;
2547
2576
  d.indicator.className =
2548
- 'dx-position-indicator dx-position-indicator-horizontal' +
2549
- (last ? ' dx-position-indicator-last' : '');
2577
+ 'nxe-position-indicator nxe-position-indicator-horizontal' +
2578
+ (last ? ' nxe-position-indicator-last' : '');
2550
2579
  const areaRect = areaEl.getBoundingClientRect();
2551
2580
  const ref = last ? chips[chips.length - 1] : chips[slot];
2552
2581
  const refRect = ref.getBoundingClientRect();
@@ -2584,20 +2613,20 @@ class NxePivotFieldPanelComponent {
2584
2613
  this.fieldMove.emit({ fieldIndex: d.chip.fieldIndex, area: d.targetArea, areaIndex: slot });
2585
2614
  }
2586
2615
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: NxePivotFieldPanelComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2587
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.5", type: NxePivotFieldPanelComponent, isStandalone: true, selector: "nxe-pivot-field-panel", inputs: { engine: { classPropertyName: "engine", publicName: "engine", isSignal: true, isRequired: false, transformFunction: null }, showFilterFields: { classPropertyName: "showFilterFields", publicName: "showFilterFields", isSignal: true, isRequired: false, transformFunction: null }, showDataFields: { classPropertyName: "showDataFields", publicName: "showDataFields", isSignal: true, isRequired: false, transformFunction: null }, showColumnFields: { classPropertyName: "showColumnFields", publicName: "showColumnFields", isSignal: true, isRequired: false, transformFunction: null }, showRowFields: { classPropertyName: "showRowFields", publicName: "showRowFields", isSignal: true, isRequired: false, transformFunction: null }, allowFieldDragging: { classPropertyName: "allowFieldDragging", publicName: "allowFieldDragging", isSignal: true, isRequired: false, transformFunction: null }, allowSorting: { classPropertyName: "allowSorting", publicName: "allowSorting", isSignal: true, isRequired: false, transformFunction: null }, allowFiltering: { classPropertyName: "allowFiltering", publicName: "allowFiltering", isSignal: true, isRequired: false, transformFunction: null }, showBorders: { classPropertyName: "showBorders", publicName: "showBorders", isSignal: true, isRequired: false, transformFunction: null }, toolbarTemplate: { classPropertyName: "toolbarTemplate", publicName: "toolbarTemplate", isSignal: true, isRequired: false, transformFunction: null }, toolbarArea: { classPropertyName: "toolbarArea", publicName: "toolbarArea", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { fieldMove: "fieldMove", sortToggle: "sortToggle", filterOpen: "filterOpen" }, host: { classAttribute: "nxe-pivot-field-panel" }, viewQueries: [{ propertyName: "rowAreaTemplate", first: true, predicate: ["rowAreaTpl"], descendants: true, isSignal: true }], ngImport: i0, template: "<!-- Area subtree mirrors fixtures/fields-panel.html verbatim: .dx-pivotgrid-fields-area >\r\n table.dx-area-field-container > colgroup + thead.dx-pivotgrid-fields-area-head > tr > td\r\n chips (.dx-area-field.dx-area-box > .dx-area-field-content) / .dx-empty-area-text.\r\n The row area carries dx's inline width:100% (fixture line for group=\"row\"). -->\r\n<ng-template #areaTpl let-area=\"area\">\r\n <div\r\n class=\"dx-pivotgrid-fields-area dx-area-fields\"\r\n [class.dx-pivotgrid-drag-action]=\"allowFieldDragging()\"\r\n [style.width]=\"area.group === 'row' ? '100%' : null\"\r\n [attr.group]=\"area.group\">\r\n <table class=\"dx-area-field-container\">\r\n <colgroup></colgroup>\r\n <thead class=\"dx-pivotgrid-fields-area-head\">\r\n <tr>\r\n @if (area.chips.length === 0) {\r\n <td><div class=\"dx-empty-area-text\">{{ area.emptyText }}</div></td>\r\n } @else {\r\n @for (chip of area.chips; track chip.fieldIndex) {\r\n <!-- Chip subtree lives in the SHARED NxePivotFieldChipComponent (P3-C3) \u2014 the\r\n chooser renders the identical chips; the host div here keeps the fixture's\r\n exact .dx-area-field.dx-area-box classes. -->\r\n <td>\r\n <div\r\n nxePivotFieldChip\r\n [chip]=\"chip\"\r\n (chipPointerDown)=\"onChipPointerDown(chip, area.group, $event)\"\r\n (chipClick)=\"onChipClick(chip)\"\r\n (chipFilterClick)=\"onChipFilterClick(chip, $event)\"></div>\r\n </td>\r\n }\r\n }\r\n </tr>\r\n </thead>\r\n </table>\r\n </div>\r\n</ng-template>\r\n\r\n<!-- The ROW fields area is NOT a band here: dx hosts it inside the cross-tab's corner\r\n `.dx-area-description-cell` (oracle \u00A7c \"hosts the ROW field chips\", initial-full-page.png)\r\n \u2014 NxePivotGridComponent outlets this template into its corner cell. -->\r\n<ng-template #rowAreaTpl>\r\n @if (showRowFields()) {\r\n <ng-container *ngTemplateOutlet=\"areaTpl; context: { area: rowArea() }\" />\r\n }\r\n</ng-template>\r\n\r\n<!-- dx main-table area cells (ORACLE.md \u00A7d): filter header strip, then data + column header\r\n cells. With showBorders the bands sit INSIDE the widget border (dx .dx-pivotgrid-border\r\n draws top/left/right on these band cells). -->\r\n@if (showFilterFields() || showDataFields() || showColumnFields()) {\r\n <table class=\"nxe-pivot-field-panel-table\" [class.nxe-panel-bordered]=\"showBorders()\">\r\n <tbody>\r\n @if (showFilterFields()) {\r\n <tr>\r\n <td class=\"dx-filter-header\" colspan=\"2\">\r\n <!-- P3-C3: the pivot's `.dx-pivotgrid-toolbar` (field-chooser button) \u2014 dx PREPENDS\r\n the toolbar to this cell and floats it right (oracle \u00A7c; m_widget.js\r\n `$toolbarContainer.prependTo($targetContainer)` + dx.light float:right). -->\r\n @if (toolbarArea() === 'filter' && toolbarTemplate(); as tb) {\r\n <ng-container *ngTemplateOutlet=\"tb\" />\r\n }\r\n <ng-container *ngTemplateOutlet=\"areaTpl; context: { area: filterArea() }\" />\r\n </td>\r\n </tr>\r\n }\r\n @if (showDataFields() || showColumnFields()) {\r\n <tr>\r\n @if (showDataFields()) {\r\n <td class=\"dx-data-header\" [attr.colspan]=\"showColumnFields() || columnToolbar() ? null : 2\">\r\n <ng-container *ngTemplateOutlet=\"areaTpl; context: { area: dataArea() }\" />\r\n </td>\r\n }\r\n @if (showColumnFields() || columnToolbar()) {\r\n <!-- dx's middle toolbar branch (m_widget.js): with the filter band off, the\r\n toolbar prepends into the always-present $columnHeader cell \u2014 rendered here\r\n even when showColumnFields is off (the cell then holds only the toolbar). -->\r\n <td class=\"dx-column-header\" [attr.colspan]=\"showDataFields() ? null : 2\">\r\n @if (columnToolbar() && toolbarTemplate(); as tb) {\r\n <ng-container *ngTemplateOutlet=\"tb\" />\r\n }\r\n @if (showColumnFields()) {\r\n <ng-container *ngTemplateOutlet=\"areaTpl; context: { area: columnArea() }\" />\r\n }\r\n </td>\r\n }\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n}\r\n", styles: ["nxe-pivot-field-panel{display:block;color:#333}nxe-pivot-field-panel .nxe-pivot-field-panel-table{width:100%;border-collapse:collapse;background:#fff}nxe-pivot-field-panel .nxe-pivot-field-panel-table>tbody>tr>td{padding:0;vertical-align:top;border-bottom:1px solid #ddd}nxe-pivot-field-panel .nxe-pivot-field-panel-table>tbody>tr:last-child>td{border-bottom:none}nxe-pivot-field-panel .nxe-pivot-field-panel-table.nxe-panel-bordered{border-top:1px solid #ddd;border-left:1px solid #ddd;border-right:1px solid #ddd}nxe-pivot-field-panel .nxe-pivot-field-panel-table>tbody>tr>td.dx-data-header,nxe-pivot-field-panel .nxe-pivot-field-panel-table>tbody>tr>td.dx-column-header{background-color:#ddd3}nxe-pivot-field-panel .nxe-pivot-field-panel-table>tbody>tr>td.dx-data-header{border-right:1px solid #ddd}nxe-pivot-field-panel .dx-area-field-container{border-collapse:collapse}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: NxePivotFieldChipComponent, selector: "div[nxePivotFieldChip]", inputs: ["chip"], outputs: ["chipPointerDown", "chipClick", "chipFilterClick"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
2616
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.5", type: NxePivotFieldPanelComponent, isStandalone: true, selector: "nxe-pivot-field-panel", inputs: { engine: { classPropertyName: "engine", publicName: "engine", isSignal: true, isRequired: false, transformFunction: null }, showFilterFields: { classPropertyName: "showFilterFields", publicName: "showFilterFields", isSignal: true, isRequired: false, transformFunction: null }, showDataFields: { classPropertyName: "showDataFields", publicName: "showDataFields", isSignal: true, isRequired: false, transformFunction: null }, showColumnFields: { classPropertyName: "showColumnFields", publicName: "showColumnFields", isSignal: true, isRequired: false, transformFunction: null }, showRowFields: { classPropertyName: "showRowFields", publicName: "showRowFields", isSignal: true, isRequired: false, transformFunction: null }, allowFieldDragging: { classPropertyName: "allowFieldDragging", publicName: "allowFieldDragging", isSignal: true, isRequired: false, transformFunction: null }, allowSorting: { classPropertyName: "allowSorting", publicName: "allowSorting", isSignal: true, isRequired: false, transformFunction: null }, allowFiltering: { classPropertyName: "allowFiltering", publicName: "allowFiltering", isSignal: true, isRequired: false, transformFunction: null }, showBorders: { classPropertyName: "showBorders", publicName: "showBorders", isSignal: true, isRequired: false, transformFunction: null }, toolbarTemplate: { classPropertyName: "toolbarTemplate", publicName: "toolbarTemplate", isSignal: true, isRequired: false, transformFunction: null }, toolbarArea: { classPropertyName: "toolbarArea", publicName: "toolbarArea", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { fieldMove: "fieldMove", sortToggle: "sortToggle", filterOpen: "filterOpen" }, host: { classAttribute: "nxe-pivot-field-panel" }, viewQueries: [{ propertyName: "rowAreaTemplate", first: true, predicate: ["rowAreaTpl"], descendants: true, isSignal: true }], ngImport: i0, template: "<!-- Area subtree mirrors fixtures/fields-panel.html verbatim: .dx-pivotgrid-fields-area >\r\n table.dx-area-field-container > colgroup + thead.dx-pivotgrid-fields-area-head > tr > td\r\n chips (.dx-area-field.dx-area-box > .dx-area-field-content) / .dx-empty-area-text.\r\n The row area carries dx's inline width:100% (fixture line for group=\"row\"). -->\r\n<ng-template #areaTpl let-area=\"area\">\r\n <div\r\n class=\"nxe-pivotgrid-fields-area nxe-area-fields\"\r\n [class.nxe-pivotgrid-drag-action]=\"allowFieldDragging()\"\r\n [style.width]=\"area.group === 'row' ? '100%' : null\"\r\n [attr.group]=\"area.group\">\r\n <table class=\"nxe-area-field-container\">\r\n <colgroup></colgroup>\r\n <thead class=\"nxe-pivotgrid-fields-area-head\">\r\n <tr>\r\n @if (area.chips.length === 0) {\r\n <td><div class=\"nxe-empty-area-text\">{{ area.emptyText }}</div></td>\r\n } @else {\r\n @for (chip of area.chips; track chip.fieldIndex) {\r\n <!-- Chip subtree lives in the SHARED NxePivotFieldChipComponent (P3-C3) \u2014 the\r\n chooser renders the identical chips; the host div here keeps the fixture's\r\n exact .dx-area-field.dx-area-box classes. dx renders panel chips with\r\n showColumnLines = (area is row) (m_fields_area.js:120): only the ROW chips\r\n float their indicators right; the other bands append them inline. -->\r\n <td>\r\n <div\r\n nxePivotFieldChip\r\n [chip]=\"chip\"\r\n [floatIndicators]=\"area.group === 'row'\"\r\n (chipPointerDown)=\"onChipPointerDown(chip, area.group, $event)\"\r\n (chipClick)=\"onChipClick(chip)\"\r\n (chipFilterClick)=\"onChipFilterClick(chip, $event)\"></div>\r\n </td>\r\n }\r\n }\r\n </tr>\r\n </thead>\r\n </table>\r\n </div>\r\n</ng-template>\r\n\r\n<!-- The ROW fields area is NOT a band here: dx hosts it inside the cross-tab's corner\r\n `.dx-area-description-cell` (oracle \u00A7c \"hosts the ROW field chips\", initial-full-page.png)\r\n \u2014 NxePivotGridComponent outlets this template into its corner cell. -->\r\n<ng-template #rowAreaTpl>\r\n @if (showRowFields()) {\r\n <ng-container *ngTemplateOutlet=\"areaTpl; context: { area: rowArea() }\" />\r\n }\r\n</ng-template>\r\n\r\n<!-- dx main-table area cells (ORACLE.md \u00A7d): filter header strip, then data + column header\r\n cells. With showBorders the bands sit INSIDE the widget border (dx .dx-pivotgrid-border\r\n draws top/left/right on these band cells). -->\r\n@if (showFilterFields() || showDataFields() || showColumnFields()) {\r\n <table class=\"nxe-pivot-field-panel-table\" [class.nxe-panel-bordered]=\"showBorders()\">\r\n <tbody>\r\n @if (showFilterFields()) {\r\n <tr>\r\n <td class=\"nxe-filter-header\" colspan=\"2\">\r\n <!-- P3-C3: the pivot's `.dx-pivotgrid-toolbar` (field-chooser button) \u2014 dx PREPENDS\r\n the toolbar to this cell and floats it right (oracle \u00A7c; m_widget.js\r\n `$toolbarContainer.prependTo($targetContainer)` + dx.light float:right). -->\r\n @if (toolbarArea() === 'filter' && toolbarTemplate(); as tb) {\r\n <ng-container *ngTemplateOutlet=\"tb\" />\r\n }\r\n <ng-container *ngTemplateOutlet=\"areaTpl; context: { area: filterArea() }\" />\r\n </td>\r\n </tr>\r\n }\r\n @if (showDataFields() || showColumnFields()) {\r\n <tr>\r\n @if (showDataFields()) {\r\n <td class=\"nxe-data-header\" [attr.colspan]=\"showColumnFields() || columnToolbar() ? null : 2\">\r\n <ng-container *ngTemplateOutlet=\"areaTpl; context: { area: dataArea() }\" />\r\n </td>\r\n }\r\n @if (showColumnFields() || columnToolbar()) {\r\n <!-- dx's middle toolbar branch (m_widget.js): with the filter band off, the\r\n toolbar prepends into the always-present $columnHeader cell \u2014 rendered here\r\n even when showColumnFields is off (the cell then holds only the toolbar). -->\r\n <td class=\"nxe-column-header\" [attr.colspan]=\"showDataFields() ? null : 2\">\r\n @if (columnToolbar() && toolbarTemplate(); as tb) {\r\n <ng-container *ngTemplateOutlet=\"tb\" />\r\n }\r\n @if (showColumnFields()) {\r\n <ng-container *ngTemplateOutlet=\"areaTpl; context: { area: columnArea() }\" />\r\n }\r\n </td>\r\n }\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n}\r\n", styles: ["nxe-pivot-field-panel{display:block;color:var(--nxe-ui-text, #333)}nxe-pivot-field-panel .nxe-pivot-field-panel-table{width:100%;border-collapse:collapse;background:var(--nxe-ui-surface, #fff)}nxe-pivot-field-panel .nxe-pivot-field-panel-table>tbody>tr>td{padding:0;vertical-align:top;border-bottom:1px solid var(--nxe-ui-border, #ddd)}nxe-pivot-field-panel .nxe-pivot-field-panel-table>tbody>tr:last-child>td{border-bottom:none}nxe-pivot-field-panel .nxe-pivot-field-panel-table.nxe-panel-bordered{border-top:1px solid var(--nxe-ui-border, #ddd);border-left:1px solid var(--nxe-ui-border, #ddd);border-right:1px solid var(--nxe-ui-border, #ddd)}nxe-pivot-field-panel .nxe-pivot-field-panel-table>tbody>tr>td.nxe-data-header,nxe-pivot-field-panel .nxe-pivot-field-panel-table>tbody>tr>td.nxe-column-header{background-color:var(--nxe-ui-border-faded, rgba(221, 221, 221, .2))}nxe-pivot-field-panel .nxe-pivot-field-panel-table>tbody>tr>td.nxe-data-header{border-right:1px solid var(--nxe-ui-border, #ddd)}nxe-pivot-field-panel .nxe-area-field-container{border-collapse:collapse}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: NxePivotFieldChipComponent, selector: "div[nxePivotFieldChip]", inputs: ["chip", "floatIndicators"], outputs: ["chipPointerDown", "chipClick", "chipFilterClick"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
2588
2617
  }
2589
2618
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: NxePivotFieldPanelComponent, decorators: [{
2590
2619
  type: Component,
2591
- args: [{ selector: 'nxe-pivot-field-panel', standalone: true, imports: [NgTemplateOutlet, NxePivotFieldChipComponent], host: { class: 'nxe-pivot-field-panel' }, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "<!-- Area subtree mirrors fixtures/fields-panel.html verbatim: .dx-pivotgrid-fields-area >\r\n table.dx-area-field-container > colgroup + thead.dx-pivotgrid-fields-area-head > tr > td\r\n chips (.dx-area-field.dx-area-box > .dx-area-field-content) / .dx-empty-area-text.\r\n The row area carries dx's inline width:100% (fixture line for group=\"row\"). -->\r\n<ng-template #areaTpl let-area=\"area\">\r\n <div\r\n class=\"dx-pivotgrid-fields-area dx-area-fields\"\r\n [class.dx-pivotgrid-drag-action]=\"allowFieldDragging()\"\r\n [style.width]=\"area.group === 'row' ? '100%' : null\"\r\n [attr.group]=\"area.group\">\r\n <table class=\"dx-area-field-container\">\r\n <colgroup></colgroup>\r\n <thead class=\"dx-pivotgrid-fields-area-head\">\r\n <tr>\r\n @if (area.chips.length === 0) {\r\n <td><div class=\"dx-empty-area-text\">{{ area.emptyText }}</div></td>\r\n } @else {\r\n @for (chip of area.chips; track chip.fieldIndex) {\r\n <!-- Chip subtree lives in the SHARED NxePivotFieldChipComponent (P3-C3) \u2014 the\r\n chooser renders the identical chips; the host div here keeps the fixture's\r\n exact .dx-area-field.dx-area-box classes. -->\r\n <td>\r\n <div\r\n nxePivotFieldChip\r\n [chip]=\"chip\"\r\n (chipPointerDown)=\"onChipPointerDown(chip, area.group, $event)\"\r\n (chipClick)=\"onChipClick(chip)\"\r\n (chipFilterClick)=\"onChipFilterClick(chip, $event)\"></div>\r\n </td>\r\n }\r\n }\r\n </tr>\r\n </thead>\r\n </table>\r\n </div>\r\n</ng-template>\r\n\r\n<!-- The ROW fields area is NOT a band here: dx hosts it inside the cross-tab's corner\r\n `.dx-area-description-cell` (oracle \u00A7c \"hosts the ROW field chips\", initial-full-page.png)\r\n \u2014 NxePivotGridComponent outlets this template into its corner cell. -->\r\n<ng-template #rowAreaTpl>\r\n @if (showRowFields()) {\r\n <ng-container *ngTemplateOutlet=\"areaTpl; context: { area: rowArea() }\" />\r\n }\r\n</ng-template>\r\n\r\n<!-- dx main-table area cells (ORACLE.md \u00A7d): filter header strip, then data + column header\r\n cells. With showBorders the bands sit INSIDE the widget border (dx .dx-pivotgrid-border\r\n draws top/left/right on these band cells). -->\r\n@if (showFilterFields() || showDataFields() || showColumnFields()) {\r\n <table class=\"nxe-pivot-field-panel-table\" [class.nxe-panel-bordered]=\"showBorders()\">\r\n <tbody>\r\n @if (showFilterFields()) {\r\n <tr>\r\n <td class=\"dx-filter-header\" colspan=\"2\">\r\n <!-- P3-C3: the pivot's `.dx-pivotgrid-toolbar` (field-chooser button) \u2014 dx PREPENDS\r\n the toolbar to this cell and floats it right (oracle \u00A7c; m_widget.js\r\n `$toolbarContainer.prependTo($targetContainer)` + dx.light float:right). -->\r\n @if (toolbarArea() === 'filter' && toolbarTemplate(); as tb) {\r\n <ng-container *ngTemplateOutlet=\"tb\" />\r\n }\r\n <ng-container *ngTemplateOutlet=\"areaTpl; context: { area: filterArea() }\" />\r\n </td>\r\n </tr>\r\n }\r\n @if (showDataFields() || showColumnFields()) {\r\n <tr>\r\n @if (showDataFields()) {\r\n <td class=\"dx-data-header\" [attr.colspan]=\"showColumnFields() || columnToolbar() ? null : 2\">\r\n <ng-container *ngTemplateOutlet=\"areaTpl; context: { area: dataArea() }\" />\r\n </td>\r\n }\r\n @if (showColumnFields() || columnToolbar()) {\r\n <!-- dx's middle toolbar branch (m_widget.js): with the filter band off, the\r\n toolbar prepends into the always-present $columnHeader cell \u2014 rendered here\r\n even when showColumnFields is off (the cell then holds only the toolbar). -->\r\n <td class=\"dx-column-header\" [attr.colspan]=\"showDataFields() ? null : 2\">\r\n @if (columnToolbar() && toolbarTemplate(); as tb) {\r\n <ng-container *ngTemplateOutlet=\"tb\" />\r\n }\r\n @if (showColumnFields()) {\r\n <ng-container *ngTemplateOutlet=\"areaTpl; context: { area: columnArea() }\" />\r\n }\r\n </td>\r\n }\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n}\r\n", styles: ["nxe-pivot-field-panel{display:block;color:#333}nxe-pivot-field-panel .nxe-pivot-field-panel-table{width:100%;border-collapse:collapse;background:#fff}nxe-pivot-field-panel .nxe-pivot-field-panel-table>tbody>tr>td{padding:0;vertical-align:top;border-bottom:1px solid #ddd}nxe-pivot-field-panel .nxe-pivot-field-panel-table>tbody>tr:last-child>td{border-bottom:none}nxe-pivot-field-panel .nxe-pivot-field-panel-table.nxe-panel-bordered{border-top:1px solid #ddd;border-left:1px solid #ddd;border-right:1px solid #ddd}nxe-pivot-field-panel .nxe-pivot-field-panel-table>tbody>tr>td.dx-data-header,nxe-pivot-field-panel .nxe-pivot-field-panel-table>tbody>tr>td.dx-column-header{background-color:#ddd3}nxe-pivot-field-panel .nxe-pivot-field-panel-table>tbody>tr>td.dx-data-header{border-right:1px solid #ddd}nxe-pivot-field-panel .dx-area-field-container{border-collapse:collapse}\n"] }]
2620
+ args: [{ selector: 'nxe-pivot-field-panel', standalone: true, imports: [NgTemplateOutlet, NxePivotFieldChipComponent], host: { class: 'nxe-pivot-field-panel' }, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "<!-- Area subtree mirrors fixtures/fields-panel.html verbatim: .dx-pivotgrid-fields-area >\r\n table.dx-area-field-container > colgroup + thead.dx-pivotgrid-fields-area-head > tr > td\r\n chips (.dx-area-field.dx-area-box > .dx-area-field-content) / .dx-empty-area-text.\r\n The row area carries dx's inline width:100% (fixture line for group=\"row\"). -->\r\n<ng-template #areaTpl let-area=\"area\">\r\n <div\r\n class=\"nxe-pivotgrid-fields-area nxe-area-fields\"\r\n [class.nxe-pivotgrid-drag-action]=\"allowFieldDragging()\"\r\n [style.width]=\"area.group === 'row' ? '100%' : null\"\r\n [attr.group]=\"area.group\">\r\n <table class=\"nxe-area-field-container\">\r\n <colgroup></colgroup>\r\n <thead class=\"nxe-pivotgrid-fields-area-head\">\r\n <tr>\r\n @if (area.chips.length === 0) {\r\n <td><div class=\"nxe-empty-area-text\">{{ area.emptyText }}</div></td>\r\n } @else {\r\n @for (chip of area.chips; track chip.fieldIndex) {\r\n <!-- Chip subtree lives in the SHARED NxePivotFieldChipComponent (P3-C3) \u2014 the\r\n chooser renders the identical chips; the host div here keeps the fixture's\r\n exact .dx-area-field.dx-area-box classes. dx renders panel chips with\r\n showColumnLines = (area is row) (m_fields_area.js:120): only the ROW chips\r\n float their indicators right; the other bands append them inline. -->\r\n <td>\r\n <div\r\n nxePivotFieldChip\r\n [chip]=\"chip\"\r\n [floatIndicators]=\"area.group === 'row'\"\r\n (chipPointerDown)=\"onChipPointerDown(chip, area.group, $event)\"\r\n (chipClick)=\"onChipClick(chip)\"\r\n (chipFilterClick)=\"onChipFilterClick(chip, $event)\"></div>\r\n </td>\r\n }\r\n }\r\n </tr>\r\n </thead>\r\n </table>\r\n </div>\r\n</ng-template>\r\n\r\n<!-- The ROW fields area is NOT a band here: dx hosts it inside the cross-tab's corner\r\n `.dx-area-description-cell` (oracle \u00A7c \"hosts the ROW field chips\", initial-full-page.png)\r\n \u2014 NxePivotGridComponent outlets this template into its corner cell. -->\r\n<ng-template #rowAreaTpl>\r\n @if (showRowFields()) {\r\n <ng-container *ngTemplateOutlet=\"areaTpl; context: { area: rowArea() }\" />\r\n }\r\n</ng-template>\r\n\r\n<!-- dx main-table area cells (ORACLE.md \u00A7d): filter header strip, then data + column header\r\n cells. With showBorders the bands sit INSIDE the widget border (dx .dx-pivotgrid-border\r\n draws top/left/right on these band cells). -->\r\n@if (showFilterFields() || showDataFields() || showColumnFields()) {\r\n <table class=\"nxe-pivot-field-panel-table\" [class.nxe-panel-bordered]=\"showBorders()\">\r\n <tbody>\r\n @if (showFilterFields()) {\r\n <tr>\r\n <td class=\"nxe-filter-header\" colspan=\"2\">\r\n <!-- P3-C3: the pivot's `.dx-pivotgrid-toolbar` (field-chooser button) \u2014 dx PREPENDS\r\n the toolbar to this cell and floats it right (oracle \u00A7c; m_widget.js\r\n `$toolbarContainer.prependTo($targetContainer)` + dx.light float:right). -->\r\n @if (toolbarArea() === 'filter' && toolbarTemplate(); as tb) {\r\n <ng-container *ngTemplateOutlet=\"tb\" />\r\n }\r\n <ng-container *ngTemplateOutlet=\"areaTpl; context: { area: filterArea() }\" />\r\n </td>\r\n </tr>\r\n }\r\n @if (showDataFields() || showColumnFields()) {\r\n <tr>\r\n @if (showDataFields()) {\r\n <td class=\"nxe-data-header\" [attr.colspan]=\"showColumnFields() || columnToolbar() ? null : 2\">\r\n <ng-container *ngTemplateOutlet=\"areaTpl; context: { area: dataArea() }\" />\r\n </td>\r\n }\r\n @if (showColumnFields() || columnToolbar()) {\r\n <!-- dx's middle toolbar branch (m_widget.js): with the filter band off, the\r\n toolbar prepends into the always-present $columnHeader cell \u2014 rendered here\r\n even when showColumnFields is off (the cell then holds only the toolbar). -->\r\n <td class=\"nxe-column-header\" [attr.colspan]=\"showDataFields() ? null : 2\">\r\n @if (columnToolbar() && toolbarTemplate(); as tb) {\r\n <ng-container *ngTemplateOutlet=\"tb\" />\r\n }\r\n @if (showColumnFields()) {\r\n <ng-container *ngTemplateOutlet=\"areaTpl; context: { area: columnArea() }\" />\r\n }\r\n </td>\r\n }\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n}\r\n", styles: ["nxe-pivot-field-panel{display:block;color:var(--nxe-ui-text, #333)}nxe-pivot-field-panel .nxe-pivot-field-panel-table{width:100%;border-collapse:collapse;background:var(--nxe-ui-surface, #fff)}nxe-pivot-field-panel .nxe-pivot-field-panel-table>tbody>tr>td{padding:0;vertical-align:top;border-bottom:1px solid var(--nxe-ui-border, #ddd)}nxe-pivot-field-panel .nxe-pivot-field-panel-table>tbody>tr:last-child>td{border-bottom:none}nxe-pivot-field-panel .nxe-pivot-field-panel-table.nxe-panel-bordered{border-top:1px solid var(--nxe-ui-border, #ddd);border-left:1px solid var(--nxe-ui-border, #ddd);border-right:1px solid var(--nxe-ui-border, #ddd)}nxe-pivot-field-panel .nxe-pivot-field-panel-table>tbody>tr>td.nxe-data-header,nxe-pivot-field-panel .nxe-pivot-field-panel-table>tbody>tr>td.nxe-column-header{background-color:var(--nxe-ui-border-faded, rgba(221, 221, 221, .2))}nxe-pivot-field-panel .nxe-pivot-field-panel-table>tbody>tr>td.nxe-data-header{border-right:1px solid var(--nxe-ui-border, #ddd)}nxe-pivot-field-panel .nxe-area-field-container{border-collapse:collapse}\n"] }]
2592
2621
  }], propDecorators: { engine: [{ type: i0.Input, args: [{ isSignal: true, alias: "engine", required: false }] }], showFilterFields: [{ type: i0.Input, args: [{ isSignal: true, alias: "showFilterFields", required: false }] }], showDataFields: [{ type: i0.Input, args: [{ isSignal: true, alias: "showDataFields", required: false }] }], showColumnFields: [{ type: i0.Input, args: [{ isSignal: true, alias: "showColumnFields", required: false }] }], showRowFields: [{ type: i0.Input, args: [{ isSignal: true, alias: "showRowFields", required: false }] }], allowFieldDragging: [{ type: i0.Input, args: [{ isSignal: true, alias: "allowFieldDragging", required: false }] }], allowSorting: [{ type: i0.Input, args: [{ isSignal: true, alias: "allowSorting", required: false }] }], allowFiltering: [{ type: i0.Input, args: [{ isSignal: true, alias: "allowFiltering", required: false }] }], showBorders: [{ type: i0.Input, args: [{ isSignal: true, alias: "showBorders", required: false }] }], toolbarTemplate: [{ type: i0.Input, args: [{ isSignal: true, alias: "toolbarTemplate", required: false }] }], toolbarArea: [{ type: i0.Input, args: [{ isSignal: true, alias: "toolbarArea", required: false }] }], fieldMove: [{ type: i0.Output, args: ["fieldMove"] }], sortToggle: [{ type: i0.Output, args: ["sortToggle"] }], filterOpen: [{ type: i0.Output, args: ["filterOpen"] }], rowAreaTemplate: [{ type: i0.ViewChild, args: ['rowAreaTpl', { isSignal: true }] }] } });
2593
2622
 
2594
2623
  /* eslint-disable @typescript-eslint/no-explicit-any */
2595
2624
  // nxe-pivot-field-chooser — the dx field chooser popup (dxo-field-chooser), P3-C3. Renders the
2596
2625
  // popup CONTENT the pivot opens in a CDK overlay: dx popup title bar ("Field Chooser" + close X,
2597
2626
  // dxPivotGrid fieldChooser defaults, m_widget.js `_renderFieldChooser`) over the exact
2598
- // `.dx-pivotgridfieldchooser` DOM harvested from the live broker
2599
- // (tools/visual-parity/reference/pivot/fixtures/field-chooser.html): layout 0 = two `.dx-row`s
2600
- // of two `.dx-col`s — [All Fields tree | Row+Column areas] over [Filter | Data]
2627
+ // `.nxe-pivotgridfieldchooser` DOM harvested from the live broker
2628
+ // (tools/visual-parity/reference/pivot/fixtures/field-chooser.html): layout 0 = two `.nxe-row`s
2629
+ // of two `.nxe-col`s — [All Fields tree | Row+Column areas] over [Filter | Data]
2601
2630
  // (m_field_chooser.js `_renderLayout0`). Chips reuse the panel's shared
2602
2631
  // NxePivotFieldChipComponent; the All Fields tree mirrors the fixture's dx-treeview markup
2603
2632
  // (flat leaves — the app's local fields have no dimension/displayFolder groups).
@@ -2624,7 +2653,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImpor
2624
2653
  // so FieldChooserBase's own default (true) applies regardless of fieldPanel settings.
2625
2654
  // - DROP targets (sortable/m_sortable.js `getTargetGroup` + the drag-end handler's
2626
2655
  // `if ($targetGroup)` guard): onChanged fires ONLY when the release lands inside a
2627
- // group's `.dx-area-fields` box. The All-Fields TREE box is a group WITHOUT a `group`
2656
+ // group's `.nxe-area-fields` box. The All-Fields TREE box is a group WITHOUT a `group`
2628
2657
  // attr, so a drop there resolves `targetGroup` undefined -> `_applyChanges({area:
2629
2658
  // undefined})` = the one drag-remove path (with the dx-drag-target hover highlight,
2630
2659
  // like any group). A release anywhere else — title bar, captions, paddings, outside
@@ -2634,9 +2663,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImpor
2634
2663
  // `getCompareFunction`) — the fixture's alphabetical list.
2635
2664
  //
2636
2665
  // Geometry (oracle/chooser-probe.json vs config height 400): dx applies fieldChooser
2637
- // width/height to the popup's `.dx-overlay-content` BOX — 600x400 with 1px borders. Inside:
2666
+ // width/height to the popup's `.nxe-overlay-content` BOX — 600x400 with 1px borders. Inside:
2638
2667
  // the 49px title bar (6px padding x2 + 36px toolbar row + 1px rule) and the remaining 349px
2639
- // `.dx-popup-content.dx-pivotgridfieldchooser` (20px padding -> dx stamps inline height:309px;
2668
+ // `.nxe-popup-content.nxe-pivotgridfieldchooser` (20px padding -> dx stamps inline height:309px;
2640
2669
  // here flexbox yields the same box). 598x349 measured = 600x400 minus borders minus title.
2641
2670
  //
2642
2671
  // Known deviations (DEFAULTS.md, P3-C3 rows): no popup drag/resize; no cross-widget drag
@@ -2645,14 +2674,14 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImpor
2645
2674
  // add via checkbox only. dx-true (NOT deviations): no backdrop — an outside click neither
2646
2675
  // closes nor blocks, the pivot behind stays interactive (dx shading:false +
2647
2676
  // hideOnOutsideClick:false); close via title-bar X or Escape only.
2648
- /** dx fieldChooser texts defaults (m_field_chooser.js `_getDefaultOptions` messages). */
2649
- const CHOOSER_TEXTS = {
2650
- allFields: 'All Fields',
2651
- rowFields: 'Row Fields',
2652
- columnFields: 'Column Fields',
2653
- filterFields: 'Filter Fields',
2654
- dataFields: 'Data Fields',
2655
- title: 'Field Chooser',
2677
+ /** dx fieldChooser texts (m_field_chooser.js `_getDefaultOptions` messages), as library message keys. */
2678
+ const CHOOSER_TEXT_KEYS = {
2679
+ allFields: 'pivot.chooser.allFields',
2680
+ rowFields: 'pivot.chooser.rowFields',
2681
+ columnFields: 'pivot.chooser.columnFields',
2682
+ filterFields: 'pivot.chooser.filterFields',
2683
+ dataFields: 'pivot.chooser.dataFields',
2684
+ title: 'pivot.chooser.title',
2656
2685
  };
2657
2686
  /** dx `_renderArea` icon names per area (m_field_chooser const.ICONS). */
2658
2687
  const AREA_ICONS = {
@@ -2693,13 +2722,21 @@ class NxePivotFieldChooserComponent {
2693
2722
  filterOpen = output();
2694
2723
  /** The title-bar X — the pivot disposes the overlay (Escape/backdrop close there too). */
2695
2724
  closed = output();
2696
- texts = CHOOSER_TEXTS;
2725
+ messages = inject(NxeMessageService);
2726
+ /** The chooser's captions in the active language; read in the template, so a switch re-renders. */
2727
+ get texts() {
2728
+ const out = {};
2729
+ for (const [name, key] of Object.entries(CHOOSER_TEXT_KEYS)) {
2730
+ out[name] = this.messages.t(key);
2731
+ }
2732
+ return out;
2733
+ }
2697
2734
  allIcon = AREA_ICONS.all;
2698
2735
  searchText = signal('', /* @ts-ignore */
2699
2736
  ...(ngDevMode ? [{ debugName: "searchText" }] : /* istanbul ignore next */ []));
2700
2737
  elementRef = inject((ElementRef));
2701
2738
  zone = inject(NgZone);
2702
- /** Popup box size — dx puts fieldChooser.width/height on `.dx-overlay-content` (600 dflt). */
2739
+ /** Popup box size — dx puts fieldChooser.width/height on `.nxe-overlay-content` (600 dflt). */
2703
2740
  boxWidth = computed(() => `${this.width() ?? 600}px`, /* @ts-ignore */
2704
2741
  ...(ngDevMode ? [{ debugName: "boxWidth" }] : /* istanbul ignore next */ []));
2705
2742
  boxHeight = computed(() => `${this.height() ?? 600}px`, /* @ts-ignore */
@@ -2782,13 +2819,13 @@ class NxePivotFieldChooserComponent {
2782
2819
  if (this.gesture.consumeClick()) {
2783
2820
  return; // a drag released over the funnel must not also open the popup
2784
2821
  }
2785
- const origin = event.target?.closest('.dx-area-field') ??
2822
+ const origin = event.target?.closest('.nxe-area-field') ??
2786
2823
  event.target;
2787
2824
  this.filterOpen.emit({ fieldIndex: chip.fieldIndex, origin });
2788
2825
  }
2789
2826
  // --- Dragging between chooser areas --------------------------------------------------------
2790
2827
  // Chips stack VERTICALLY here (unlike the panel's horizontal bands): slots hit-test on the
2791
- // Y midpoint and the insertion mark is dx's `.dx-position-indicator-vertical` 2px bar.
2828
+ // Y midpoint and the insertion mark is dx's `.nxe-position-indicator-vertical` 2px bar.
2792
2829
  // Drop targets are dx m_sortable's groups — the four `[group]` fields boxes AND the
2793
2830
  // All-Fields tree box (a group WITHOUT a `group` attr, so a drop there resolves to
2794
2831
  // `area: undefined` = REMOVE, with the same dx-drag-target hover highlight). A release
@@ -2800,17 +2837,17 @@ class NxePivotFieldChooserComponent {
2800
2837
  createGhost: () => {
2801
2838
  const ghost = document.createElement('div');
2802
2839
  ghost.className =
2803
- 'nxe-widget dx-pivotgrid-fields-container dx-drag nxe-pivot-drag-ghost';
2840
+ 'nxe-widget nxe-pivotgrid-fields-container nxe-drag nxe-pivot-drag-ghost';
2804
2841
  const chip = document.createElement('div');
2805
- chip.className = 'dx-area-field dx-area-box';
2842
+ chip.className = 'nxe-area-field nxe-area-box';
2806
2843
  const content = document.createElement('div');
2807
- content.className = 'dx-area-field-content';
2844
+ content.className = 'nxe-area-field-content';
2808
2845
  content.textContent = this.drag?.chip.caption ?? '';
2809
2846
  chip.appendChild(content);
2810
2847
  ghost.appendChild(chip);
2811
2848
  return ghost;
2812
2849
  },
2813
- sourceDragClasses: ['dx-drag-source'],
2850
+ sourceDragClasses: ['nxe-drag-source'],
2814
2851
  dragMove: (x, y) => this.trackPointer(x, y),
2815
2852
  drop: () => this.completeDrop(),
2816
2853
  clearDropVisuals: () => {
@@ -2821,8 +2858,8 @@ class NxePivotFieldChooserComponent {
2821
2858
  d.targetEl = null;
2822
2859
  }
2823
2860
  this.host()
2824
- .querySelectorAll('.dx-drag-target')
2825
- .forEach((el) => el.classList.remove('dx-drag-target'));
2861
+ .querySelectorAll('.nxe-drag-target')
2862
+ .forEach((el) => el.classList.remove('nxe-drag-target'));
2826
2863
  },
2827
2864
  reset: () => {
2828
2865
  this.drag = null;
@@ -2854,7 +2891,7 @@ class NxePivotFieldChooserComponent {
2854
2891
  const chips = (engine ? engine.areaFields(group) : []).map(({ fieldIndex, field }) => buildChip(fieldIndex, field, group, this.allowSorting(), this.allowFiltering()));
2855
2892
  return {
2856
2893
  group,
2857
- caption: CHOOSER_TEXTS[`${group}Fields`],
2894
+ caption: this.messages.t(CHOOSER_TEXT_KEYS[`${group}Fields`]),
2858
2895
  icon: AREA_ICONS[group],
2859
2896
  chips,
2860
2897
  };
@@ -2884,10 +2921,10 @@ class NxePivotFieldChooserComponent {
2884
2921
  const r = el.getBoundingClientRect();
2885
2922
  return x >= r.left && x <= r.right && y >= r.top && y <= r.bottom;
2886
2923
  };
2887
- const zones = Array.from(this.host().querySelectorAll('.dx-area-fields[group]'));
2924
+ const zones = Array.from(this.host().querySelectorAll('.nxe-area-fields[group]'));
2888
2925
  const hitEl = zones.find(inRect) ?? null;
2889
2926
  if (d.targetEl && d.targetEl !== hitEl) {
2890
- d.targetEl.classList.remove('dx-drag-target');
2927
+ d.targetEl.classList.remove('nxe-drag-target');
2891
2928
  d.targetEl = null;
2892
2929
  }
2893
2930
  if (!hitEl) {
@@ -2898,9 +2935,9 @@ class NxePivotFieldChooserComponent {
2898
2935
  d.indicator = null;
2899
2936
  // The All-Fields tree box is dx's REMOVE zone (a sortable group without a
2900
2937
  // `group` attr) and gets the same hover highlight as any target group.
2901
- const treeEl = this.host().querySelector('.dx-all-fields .dx-area-fields');
2938
+ const treeEl = this.host().querySelector('.nxe-all-fields .nxe-area-fields');
2902
2939
  if (treeEl && inRect(treeEl)) {
2903
- treeEl.classList.add('dx-drag-target');
2940
+ treeEl.classList.add('nxe-drag-target');
2904
2941
  d.targetEl = treeEl;
2905
2942
  d.overTree = true;
2906
2943
  return;
@@ -2921,11 +2958,11 @@ class NxePivotFieldChooserComponent {
2921
2958
  d.indicator = null;
2922
2959
  return;
2923
2960
  }
2924
- hitEl.classList.add('dx-drag-target');
2961
+ hitEl.classList.add('nxe-drag-target');
2925
2962
  d.targetEl = hitEl;
2926
2963
  d.targetArea = group;
2927
2964
  d.invalid = false;
2928
- const chips = Array.from(hitEl.querySelectorAll('.dx-area-field.dx-area-box'));
2965
+ const chips = Array.from(hitEl.querySelectorAll('.nxe-area-field.nxe-area-box'));
2929
2966
  let slot = chips.length;
2930
2967
  for (let i = 0; i < chips.length; i++) {
2931
2968
  const r = chips[i].getBoundingClientRect();
@@ -2937,7 +2974,7 @@ class NxePivotFieldChooserComponent {
2937
2974
  d.slot = slot;
2938
2975
  this.placeIndicator(d, hitEl, chips, slot);
2939
2976
  }
2940
- /** dx `.dx-position-indicator-vertical`: a 2px bar between the stacked chips. */
2977
+ /** dx `.nxe-position-indicator-vertical`: a 2px bar between the stacked chips. */
2941
2978
  placeIndicator(d, areaEl, chips, slot) {
2942
2979
  if (!chips.length) {
2943
2980
  d.indicator?.remove();
@@ -2949,8 +2986,8 @@ class NxePivotFieldChooserComponent {
2949
2986
  }
2950
2987
  const last = slot >= chips.length;
2951
2988
  d.indicator.className =
2952
- 'dx-position-indicator dx-position-indicator-vertical' +
2953
- (last ? ' dx-position-indicator-last' : '');
2989
+ 'nxe-position-indicator nxe-position-indicator-vertical' +
2990
+ (last ? ' nxe-position-indicator-last' : '');
2954
2991
  const areaRect = areaEl.getBoundingClientRect();
2955
2992
  const ref = last ? chips[chips.length - 1] : chips[slot];
2956
2993
  const refRect = ref.getBoundingClientRect();
@@ -2996,11 +3033,11 @@ class NxePivotFieldChooserComponent {
2996
3033
  this.fieldMove.emit({ fieldIndex: d.chip.fieldIndex, area: d.targetArea, areaIndex: slot });
2997
3034
  }
2998
3035
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: NxePivotFieldChooserComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
2999
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.5", type: NxePivotFieldChooserComponent, isStandalone: true, selector: "nxe-pivot-field-chooser", inputs: { engine: { classPropertyName: "engine", publicName: "engine", isSignal: true, isRequired: true, transformFunction: null }, width: { classPropertyName: "width", publicName: "width", isSignal: true, isRequired: false, transformFunction: null }, height: { classPropertyName: "height", publicName: "height", isSignal: true, isRequired: false, transformFunction: null }, allowSearch: { classPropertyName: "allowSearch", publicName: "allowSearch", isSignal: true, isRequired: false, transformFunction: null }, allowSorting: { classPropertyName: "allowSorting", publicName: "allowSorting", isSignal: true, isRequired: false, transformFunction: null }, allowFiltering: { classPropertyName: "allowFiltering", publicName: "allowFiltering", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { fieldMove: "fieldMove", sortToggle: "sortToggle", filterOpen: "filterOpen", closed: "closed" }, host: { classAttribute: "nxe-widget nxe-pivot-field-chooser-popup dx-fieldchooser-popup" }, ngImport: i0, template: "<!-- dx popup box: fieldChooser width/height land on `.dx-overlay-content` (m_widget.js popup\r\n options; 600x400 -> 598x349 content once the 1px borders + 49px title bar are taken out \u2014\r\n oracle/chooser-probe.json reconciliation in the component header). Title bar per the\r\n full-page capture: \"Field Chooser\" left, X right, 1px rule beneath, popup centered. -->\r\n<div\r\n class=\"dx-overlay-content dx-popup-normal\"\r\n [style.width]=\"boxWidth()\"\r\n [style.height]=\"boxHeight()\">\r\n <div class=\"dx-popup-title dx-has-close-button\">\r\n <span class=\"dx-toolbar-label\">{{ texts.title }}</span>\r\n <span\r\n class=\"dx-closebutton\"\r\n role=\"button\"\r\n tabindex=\"0\"\r\n aria-label=\"Close\"\r\n (click)=\"closed.emit()\"\r\n (keydown.enter)=\"closed.emit()\"></span>\r\n </div>\r\n\r\n <!-- fixtures/field-chooser.html verbatim from here down: the chooser root carries\r\n dx-popup-content + dx-pivotgridfieldchooser + dx-pivotgrid-fields-container (the class\r\n that arms the shared chip chrome in dx-compat.css), then layout 0's two rows. -->\r\n <div class=\"dx-popup-content dx-widget dx-pivotgridfieldchooser dx-pivotgrid-fields-container\">\r\n <div class=\"dx-pivotgridfieldchooser-container dx-layout-0\">\r\n <div class=\"dx-row\">\r\n <div class=\"dx-col\">\r\n <!-- All Fields: dx-treeview of EVERY defined field, checkbox = has an area. -->\r\n <div class=\"dx-area dx-all-fields\">\r\n <div class=\"dx-area-fields-header\">\r\n <span class=\"dx-area-icon dx-icon-{{ allIcon }}\"></span><span>&nbsp;</span><span class=\"dx-area-caption\">{{ texts.allFields }}</span>\r\n </div>\r\n <div\r\n class=\"dx-area-fields dx-pivotgrid-drag-action dx-treeview-border-visible dx-widget dx-collection dx-treeview\"\r\n tabindex=\"0\"\r\n role=\"tree\">\r\n @if (allowSearch()) {\r\n <!-- dx allowSearch: the treeview search editor (dx-compat gives it margin:5px);\r\n default FALSE \u2014 the broker capture has no search box (oracle \u00A7c). -->\r\n <div class=\"dx-treeview-search dx-texteditor dx-searchbox\">\r\n <input\r\n class=\"dx-texteditor-input\"\r\n type=\"text\"\r\n placeholder=\"Search\"\r\n [value]=\"searchText()\"\r\n (input)=\"onSearchInput($event)\" />\r\n </div>\r\n }\r\n <div class=\"dx-scrollable dx-scrollable-vertical\">\r\n <div class=\"dx-scrollable-wrapper\">\r\n <div class=\"dx-scrollable-container\">\r\n <div class=\"dx-scrollable-content\">\r\n <ul class=\"dx-treeview-node-container\" role=\"group\">\r\n @for (item of treeItems(); track item.fieldIndex) {\r\n <li\r\n class=\"dx-treeview-node dx-treeview-item-with-checkbox dx-treeview-root-node dx-treeview-node-is-leaf\"\r\n [class.dx-state-selected]=\"item.selected\"\r\n [attr.data-item-id]=\"$index + 1\"\r\n role=\"treeitem\"\r\n [attr.aria-label]=\"item.caption\"\r\n aria-level=\"1\"\r\n [attr.aria-selected]=\"item.selected\">\r\n <div class=\"dx-item dx-treeview-item\">\r\n <div class=\"dx-item-content dx-treeview-item-content\">\r\n <div class=\"dx-area-field\" tree-view-item=\"true\"><span>{{ item.caption }}</span></div>\r\n </div>\r\n <div\r\n class=\"dx-widget dx-checkbox\"\r\n [class.dx-checkbox-checked]=\"item.selected\"\r\n role=\"checkbox\"\r\n tabindex=\"0\"\r\n [attr.aria-checked]=\"item.selected\"\r\n aria-label=\"Check state\"\r\n (click)=\"onCheckboxClick(item)\"\r\n (keydown.space)=\"onCheckboxClick(item)\">\r\n <input type=\"hidden\" [value]=\"item.selected\" />\r\n <div class=\"dx-checkbox-container\"><span class=\"dx-checkbox-icon\"></span></div>\r\n </div>\r\n <div class=\"dx-treeview-expander-icon-stub\"></div>\r\n </div>\r\n </li>\r\n }\r\n </ul>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"dx-col\">\r\n <ng-container *ngTemplateOutlet=\"areaTpl; context: { area: rowArea() }\" />\r\n <ng-container *ngTemplateOutlet=\"areaTpl; context: { area: columnArea() }\" />\r\n </div>\r\n </div>\r\n <div class=\"dx-row\">\r\n <div class=\"dx-col\">\r\n <ng-container *ngTemplateOutlet=\"areaTpl; context: { area: filterArea() }\" />\r\n </div>\r\n <div class=\"dx-col\">\r\n <ng-container *ngTemplateOutlet=\"areaTpl; context: { area: dataArea() }\" />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!-- One group area (dx `_renderArea`): header (icon + caption), then the bordered fields box\r\n with the stacked chips. An EMPTY area shows nothing \u2014 the chooser has no\r\n \"Drop \u2026 Fields Here\" strings (fixture: the filter area's field container is empty). -->\r\n<ng-template #areaTpl let-area=\"area\">\r\n <div class=\"dx-area\">\r\n <div class=\"dx-area-fields-header\">\r\n <span class=\"dx-area-icon dx-icon-{{ area.icon }}\"></span><span>&nbsp;</span><span class=\"dx-area-caption\">{{ area.caption }}</span>\r\n </div>\r\n <div\r\n class=\"dx-area-fields dx-pivotgrid-drag-action dx-scrollable dx-scrollable-vertical\"\r\n [attr.group]=\"area.group\"\r\n allow-scrolling=\"true\">\r\n <div class=\"dx-scrollable-wrapper\">\r\n <div class=\"dx-scrollable-container\" tabindex=\"0\">\r\n <div class=\"dx-scrollable-content\">\r\n <div class=\"dx-area-field-container\">\r\n @for (chip of area.chips; track chip.fieldIndex) {\r\n <div\r\n nxePivotFieldChip\r\n [chip]=\"chip\"\r\n (chipPointerDown)=\"onChipPointerDown(chip, area.group, $event)\"\r\n (chipClick)=\"onChipClick(chip)\"\r\n (chipFilterClick)=\"onChipFilterClick(chip, $event)\"></div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n", styles: ["@charset \"UTF-8\";nxe-pivot-field-chooser{display:block}nxe-pivot-field-chooser>.dx-overlay-content{display:flex;flex-direction:column;box-sizing:border-box;min-width:400px;min-height:250px;max-width:95vw;max-height:95vh;background:#fff;border:1px solid #ddd;border-radius:6px;box-shadow:0 6px 12px #0000002d;color:#333;overflow:hidden}nxe-pivot-field-chooser .dx-popup-title{flex:0 0 auto;display:flex;align-items:center;padding:6px 20px;border-bottom:1px solid #ddd}nxe-pivot-field-chooser .dx-popup-title .dx-toolbar-label{flex:1 1 auto;font-size:20px;line-height:36px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}nxe-pivot-field-chooser .dx-popup-title .dx-closebutton{position:relative;flex:0 0 auto;width:14px;height:14px;margin:9px 0 9px 9px;cursor:pointer;color:#999}nxe-pivot-field-chooser .dx-popup-title .dx-closebutton:before,nxe-pivot-field-chooser .dx-popup-title .dx-closebutton:after{content:\"\";position:absolute;left:50%;top:50%;width:15px;height:1.5px;background:currentColor}nxe-pivot-field-chooser .dx-popup-title .dx-closebutton:before{transform:translate(-50%,-50%) rotate(45deg)}nxe-pivot-field-chooser .dx-popup-title .dx-closebutton:after{transform:translate(-50%,-50%) rotate(-45deg)}nxe-pivot-field-chooser .dx-popup-title .dx-closebutton:hover{color:#333}nxe-pivot-field-chooser .dx-popup-content.dx-pivotgridfieldchooser{flex:1 1 auto;min-height:0;box-sizing:border-box;padding:20px}nxe-pivot-field-chooser .dx-scrollable-container{flex:1 1 auto;min-height:0;overflow-y:auto;overflow-x:hidden;outline:0}nxe-pivot-field-chooser .dx-scrollable-wrapper{display:flex;flex-direction:column;flex:1 1 auto;min-height:0}nxe-pivot-field-chooser .dx-treeview-search{flex:0 0 auto}nxe-pivot-field-chooser .dx-treeview-search .dx-texteditor-input{box-sizing:border-box;width:100%;padding:7px 9px;border:1px solid #ddd;border-radius:4px;background:#fff;color:#333;font:inherit;outline:0}nxe-pivot-field-chooser .dx-treeview-search .dx-texteditor-input:focus{border-color:#337ab7}nxe-pivot-field-chooser .dx-area-icon{position:relative;color:#333}nxe-pivot-field-chooser .dx-area-icon:before{content:\"\";position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);box-sizing:border-box}nxe-pivot-field-chooser .dx-icon-smalliconslayout:before{width:3px;height:3px;left:3px;top:3px;transform:none;background:currentColor;box-shadow:5px 0 0 currentColor,10px 0 0 currentColor,0 5px 0 currentColor,5px 5px 0 currentColor,10px 5px 0 currentColor,0 10px 0 currentColor,5px 10px 0 currentColor,10px 10px 0 currentColor}nxe-pivot-field-chooser .dx-icon-rowfield:before{width:14px;height:12px;border:1px solid currentColor;background:linear-gradient(90deg,currentColor 0 4px,transparent 4px)}nxe-pivot-field-chooser .dx-icon-columnfield:before{width:14px;height:12px;border:1px solid currentColor;background:linear-gradient(180deg,currentColor 0 4px,transparent 4px)}nxe-pivot-field-chooser .dx-icon-filter:before{width:12px;height:12px;background:currentColor;clip-path:polygon(0 0,100% 0,62% 46%,62% 100%,38% 100%,38% 46%)}nxe-pivot-field-chooser .dx-icon-formula:before{content:\"\\3a3\";font-size:14px;line-height:1;font-weight:400}nxe-pivot-field-chooser .dx-checkbox-checked .dx-checkbox-icon:after{content:\"\";position:absolute;left:7px;top:3px;width:6px;height:11px;box-sizing:border-box;border:solid #337ab7;border-width:0 2px 2px 0;transform:rotate(45deg)}.nxe-fieldchooser-pane{pointer-events:auto}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: NxePivotFieldChipComponent, selector: "div[nxePivotFieldChip]", inputs: ["chip"], outputs: ["chipPointerDown", "chipClick", "chipFilterClick"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
3036
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.5", type: NxePivotFieldChooserComponent, isStandalone: true, selector: "nxe-pivot-field-chooser", inputs: { engine: { classPropertyName: "engine", publicName: "engine", isSignal: true, isRequired: true, transformFunction: null }, width: { classPropertyName: "width", publicName: "width", isSignal: true, isRequired: false, transformFunction: null }, height: { classPropertyName: "height", publicName: "height", isSignal: true, isRequired: false, transformFunction: null }, allowSearch: { classPropertyName: "allowSearch", publicName: "allowSearch", isSignal: true, isRequired: false, transformFunction: null }, allowSorting: { classPropertyName: "allowSorting", publicName: "allowSorting", isSignal: true, isRequired: false, transformFunction: null }, allowFiltering: { classPropertyName: "allowFiltering", publicName: "allowFiltering", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { fieldMove: "fieldMove", sortToggle: "sortToggle", filterOpen: "filterOpen", closed: "closed" }, host: { classAttribute: "nxe-widget nxe-pivot-field-chooser-popup nxe-fieldchooser-popup" }, ngImport: i0, template: "<!-- dx popup box: fieldChooser width/height land on `.dx-overlay-content` (m_widget.js popup\r\n options; 600x400 -> 598x349 content once the 1px borders + 49px title bar are taken out \u2014\r\n oracle/chooser-probe.json reconciliation in the component header). Title bar per the\r\n full-page capture: \"Field Chooser\" left, X right, 1px rule beneath, popup centered. -->\r\n<div\r\n class=\"nxe-overlay-content nxe-popup-normal\"\r\n [style.width]=\"boxWidth()\"\r\n [style.height]=\"boxHeight()\">\r\n <div class=\"nxe-popup-title nxe-has-close-button\">\r\n <span class=\"nxe-toolbar-label\">{{ texts.title }}</span>\r\n <span\r\n class=\"nxe-closebutton\"\r\n role=\"button\"\r\n tabindex=\"0\"\r\n [attr.aria-label]=\"messages.t('common.close')\"\r\n (click)=\"closed.emit()\"\r\n (keydown.enter)=\"closed.emit()\"></span>\r\n </div>\r\n\r\n <!-- fixtures/field-chooser.html verbatim from here down: the chooser root carries\r\n dx-popup-content + dx-pivotgridfieldchooser + dx-pivotgrid-fields-container (the class\r\n that arms the shared chip chrome, nxe-pivot-field-chip), then layout 0's two rows. -->\r\n <div class=\"nxe-popup-content nxe-widget nxe-pivotgridfieldchooser nxe-pivotgrid-fields-container\">\r\n <div class=\"nxe-pivotgridfieldchooser-container nxe-layout-0\">\r\n <div class=\"nxe-row\">\r\n <div class=\"nxe-col\">\r\n <!-- All Fields: dx-treeview of EVERY defined field, checkbox = has an area. -->\r\n <div class=\"nxe-area nxe-all-fields\">\r\n <div class=\"nxe-area-fields-header\">\r\n <span class=\"nxe-area-icon nxe-icon-{{ allIcon }}\"></span><span>&nbsp;</span><span class=\"nxe-area-caption\">{{ texts.allFields }}</span>\r\n </div>\r\n <div\r\n class=\"nxe-area-fields nxe-pivotgrid-drag-action nxe-treeview-border-visible nxe-widget nxe-collection nxe-treeview\"\r\n tabindex=\"0\"\r\n role=\"tree\">\r\n @if (allowSearch()) {\r\n <!-- dx allowSearch: the treeview search editor (dx margin:5px, in the scss);\r\n default FALSE \u2014 the broker capture has no search box (oracle \u00A7c). -->\r\n <div class=\"nxe-treeview-search nxe-texteditor nxe-searchbox\">\r\n <input\r\n class=\"nxe-texteditor-input\"\r\n type=\"text\"\r\n [attr.placeholder]=\"messages.t('common.search')\"\r\n [value]=\"searchText()\"\r\n (input)=\"onSearchInput($event)\" />\r\n </div>\r\n }\r\n <div class=\"nxe-scrollable nxe-scrollable-vertical\">\r\n <div class=\"nxe-scrollable-wrapper\">\r\n <div class=\"nxe-scrollable-container\">\r\n <div class=\"nxe-scrollable-content\">\r\n <ul class=\"nxe-treeview-node-container\" role=\"group\">\r\n @for (item of treeItems(); track item.fieldIndex) {\r\n <li\r\n class=\"nxe-treeview-node nxe-treeview-item-with-checkbox nxe-treeview-root-node nxe-treeview-node-is-leaf\"\r\n [class.nxe-state-selected]=\"item.selected\"\r\n [attr.data-item-id]=\"$index + 1\"\r\n role=\"treeitem\"\r\n [attr.aria-label]=\"item.caption\"\r\n aria-level=\"1\"\r\n [attr.aria-selected]=\"item.selected\">\r\n <div class=\"nxe-item nxe-treeview-item\">\r\n <div class=\"nxe-item-content nxe-treeview-item-content\">\r\n <div class=\"nxe-area-field\" tree-view-item=\"true\"><span>{{ item.caption }}</span></div>\r\n </div>\r\n <div\r\n class=\"nxe-widget nxe-checkbox\"\r\n [class.nxe-checkbox-checked]=\"item.selected\"\r\n role=\"checkbox\"\r\n tabindex=\"0\"\r\n [attr.aria-checked]=\"item.selected\"\r\n [attr.aria-label]=\"messages.t('pivot.chooser.checkState')\"\r\n (click)=\"onCheckboxClick(item)\"\r\n (keydown.space)=\"onCheckboxClick(item)\">\r\n <input type=\"hidden\" [value]=\"item.selected\" />\r\n <div class=\"nxe-checkbox-container\"><span class=\"nxe-checkbox-icon\"></span></div>\r\n </div>\r\n <div class=\"nxe-treeview-expander-icon-stub\"></div>\r\n </div>\r\n </li>\r\n }\r\n </ul>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"nxe-col\">\r\n <ng-container *ngTemplateOutlet=\"areaTpl; context: { area: rowArea() }\" />\r\n <ng-container *ngTemplateOutlet=\"areaTpl; context: { area: columnArea() }\" />\r\n </div>\r\n </div>\r\n <div class=\"nxe-row\">\r\n <div class=\"nxe-col\">\r\n <ng-container *ngTemplateOutlet=\"areaTpl; context: { area: filterArea() }\" />\r\n </div>\r\n <div class=\"nxe-col\">\r\n <ng-container *ngTemplateOutlet=\"areaTpl; context: { area: dataArea() }\" />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!-- One group area (dx `_renderArea`): header (icon + caption), then the bordered fields box\r\n with the stacked chips. An EMPTY area shows nothing \u2014 the chooser has no\r\n \"Drop \u2026 Fields Here\" strings (fixture: the filter area's field container is empty). -->\r\n<ng-template #areaTpl let-area=\"area\">\r\n <div class=\"nxe-area\">\r\n <div class=\"nxe-area-fields-header\">\r\n <span class=\"nxe-area-icon nxe-icon-{{ area.icon }}\"></span><span>&nbsp;</span><span class=\"nxe-area-caption\">{{ area.caption }}</span>\r\n </div>\r\n <div\r\n class=\"nxe-area-fields nxe-pivotgrid-drag-action nxe-scrollable nxe-scrollable-vertical\"\r\n [attr.group]=\"area.group\"\r\n allow-scrolling=\"true\">\r\n <div class=\"nxe-scrollable-wrapper\">\r\n <div class=\"nxe-scrollable-container\" tabindex=\"0\">\r\n <div class=\"nxe-scrollable-content\">\r\n <div class=\"nxe-area-field-container\">\r\n @for (chip of area.chips; track chip.fieldIndex) {\r\n <!-- dx renderField(field, true) (m_field_chooser.js:465): showColumnLines on,\r\n so the indicators float right ahead of the caption. -->\r\n <div\r\n nxePivotFieldChip\r\n [chip]=\"chip\"\r\n [floatIndicators]=\"true\"\r\n (chipPointerDown)=\"onChipPointerDown(chip, area.group, $event)\"\r\n (chipClick)=\"onChipClick(chip)\"\r\n (chipFilterClick)=\"onChipFilterClick(chip, $event)\"></div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n", styles: ["nxe-pivot-field-chooser{display:block}nxe-pivot-field-chooser>.nxe-overlay-content{display:flex;flex-direction:column;box-sizing:border-box;min-width:max(250px,var(--nxe-ui-fieldchooser-min-width, 0px));min-height:250px;max-width:95vw;max-height:95vh;background:var(--nxe-ui-surface, #fff);border:1px solid var(--nxe-ui-border, #ddd);border-radius:6px;box-shadow:var(--nxe-ui-popup-shadow, 0 6px 12px rgba(0, 0, 0, .176));color:var(--nxe-ui-text, #333);overflow:hidden}nxe-pivot-field-chooser .nxe-popup-title{flex:0 0 auto;display:flex;align-items:center;padding:6px 20px;border-bottom:1px solid var(--nxe-ui-border, #ddd)}nxe-pivot-field-chooser .nxe-popup-title .nxe-toolbar-label{flex:1 1 auto;font-size:20px;line-height:36px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}nxe-pivot-field-chooser .nxe-popup-title .nxe-closebutton{position:relative;inset-inline-start:10px;flex:0 0 auto;box-sizing:border-box;width:36px;height:36px;margin:0;margin-inline-start:30px;border:1px solid transparent;border-radius:var(--nxe-ui-radius, 4px);background-color:transparent;color:var(--nxe-ui-text, #333);cursor:pointer;outline:0}nxe-pivot-field-chooser .nxe-popup-title .nxe-closebutton:before,nxe-pivot-field-chooser .nxe-popup-title .nxe-closebutton:after{content:\"\";position:absolute;left:50%;top:50%;box-sizing:border-box;width:17px;height:2px;margin:-1px 0 0 -8.5px;background-color:currentColor}@media(forced-colors:active){nxe-pivot-field-chooser .nxe-popup-title .nxe-closebutton:before,nxe-pivot-field-chooser .nxe-popup-title .nxe-closebutton:after{forced-color-adjust:none;background-color:CanvasText}}nxe-pivot-field-chooser .nxe-popup-title .nxe-closebutton:before{transform:rotate(45deg)}nxe-pivot-field-chooser .nxe-popup-title .nxe-closebutton:after{transform:rotate(-45deg)}nxe-pivot-field-chooser .nxe-popup-title .nxe-closebutton:hover{background-color:var(--nxe-ui-hover-bg, rgba(0, 0, 0, .04))}nxe-pivot-field-chooser .nxe-popup-title .nxe-closebutton:focus-visible{background-color:var(--nxe-ui-focus-bg, rgba(0, 0, 0, .08))}nxe-pivot-field-chooser .nxe-popup-title .nxe-closebutton:active{background-color:var(--nxe-ui-active-bg, rgba(0, 0, 0, .24))}nxe-pivot-field-chooser .nxe-popup-content.nxe-pivotgridfieldchooser{flex:1 1 auto;min-height:0;box-sizing:border-box;padding:20px}nxe-pivot-field-chooser .nxe-pivotgridfieldchooser{position:relative;background-color:var(--nxe-ui-surface, #fff)}nxe-pivot-field-chooser .nxe-pivotgridfieldchooser .nxe-pivotgridfieldchooser-container{display:flex;overflow:hidden;height:100%}nxe-pivot-field-chooser .nxe-pivotgridfieldchooser .nxe-pivotgridfieldchooser-container.nxe-layout-0{flex-direction:column}nxe-pivot-field-chooser .nxe-pivotgridfieldchooser .nxe-pivotgridfieldchooser-container .nxe-row:first-child{flex-grow:2}nxe-pivot-field-chooser .nxe-pivotgridfieldchooser .nxe-pivotgridfieldchooser-container .nxe-row:nth-child(2){flex-grow:1}nxe-pivot-field-chooser .nxe-pivotgridfieldchooser .nxe-row{display:flex;flex-direction:row;height:0;min-height:0}nxe-pivot-field-chooser .nxe-pivotgridfieldchooser .nxe-col{display:flex;flex-direction:column;width:50%;min-height:0}nxe-pivot-field-chooser .nxe-pivotgridfieldchooser .nxe-area{display:flex;flex-direction:column;flex-grow:1;min-height:0;padding:5px}nxe-pivot-field-chooser .nxe-pivotgridfieldchooser .nxe-area-fields{overflow:hidden}nxe-pivot-field-chooser .nxe-pivotgridfieldchooser .nxe-area .nxe-area-fields{display:flex;flex-direction:column;height:0;margin-top:3px;border:1px solid var(--nxe-ui-border, #ddd)}nxe-pivot-field-chooser .nxe-pivotgridfieldchooser .nxe-area-fields[group]{display:flex;padding:5px;background-color:var(--nxe-ui-border-faded, rgba(221, 221, 221, .2))}nxe-pivot-field-chooser .nxe-pivotgridfieldchooser .nxe-area-fields.nxe-drag-target{border-color:var(--nxe-ui-accent, #337ab7)}nxe-pivot-field-chooser .nxe-pivotgridfieldchooser .nxe-area>.nxe-scrollable,nxe-pivot-field-chooser .nxe-pivotgridfieldchooser .nxe-area>.nxe-scrollable>.nxe-scrollable-wrapper,nxe-pivot-field-chooser .nxe-pivotgridfieldchooser .nxe-area>.nxe-treeview,nxe-pivot-field-chooser .nxe-pivotgridfieldchooser .nxe-area>.nxe-treeview>.nxe-scrollable,nxe-pivot-field-chooser .nxe-pivotgridfieldchooser .nxe-area>.nxe-treeview>.nxe-scrollable>.nxe-scrollable-wrapper{display:flex;flex-direction:column;flex-grow:1;height:0;min-height:0}nxe-pivot-field-chooser .nxe-pivotgridfieldchooser .nxe-area-fields-header .nxe-area-caption{align-self:center}nxe-pivot-field-chooser .nxe-pivotgridfieldchooser .nxe-area .nxe-area-caption{vertical-align:middle}nxe-pivot-field-chooser .nxe-scrollable-container{flex:1 1 auto;min-height:0;overflow-y:auto;overflow-x:hidden;outline:0}nxe-pivot-field-chooser .nxe-scrollable-wrapper{display:flex;flex-direction:column;flex:1 1 auto;min-height:0}nxe-pivot-field-chooser .nxe-treeview-search{flex:0 0 auto;margin:5px}nxe-pivot-field-chooser .nxe-treeview-search .nxe-texteditor-input{box-sizing:border-box;width:100%;padding:7px 9px;border:1px solid var(--nxe-ui-border, #ddd);border-radius:4px;background:var(--nxe-ui-surface, #fff);color:var(--nxe-ui-text, #333);font:inherit;outline:0}nxe-pivot-field-chooser .nxe-treeview-search .nxe-texteditor-input:focus{border-color:var(--nxe-ui-accent, #337ab7)}nxe-pivot-field-chooser .nxe-treeview :focus{outline:0}nxe-pivot-field-chooser .nxe-treeview-node-container{display:block;margin:0;padding:0;overflow:hidden;list-style-position:inside}nxe-pivot-field-chooser .nxe-treeview-border-visible .nxe-scrollable-content>.nxe-treeview-node-container{padding:1px 1px 1px 7px}nxe-pivot-field-chooser .nxe-treeview-node{list-style-type:none;padding-inline-start:15px;-webkit-user-select:none;user-select:none}nxe-pivot-field-chooser .nxe-treeview-node.nxe-treeview-root-node{padding-inline-start:0}nxe-pivot-field-chooser .nxe-treeview-node .nxe-checkbox{order:1;margin:0}nxe-pivot-field-chooser .nxe-treeview-item{display:flex;align-items:center;gap:8px;margin:0;padding:5px 10px;color:var(--nxe-ui-text, #333);cursor:pointer}nxe-pivot-field-chooser .nxe-treeview-item:hover{background-color:var(--nxe-ui-hover-bg, rgba(0, 0, 0, .04))}nxe-pivot-field-chooser .nxe-treeview-item .nxe-treeview-item-content{flex:1 1 auto;order:2}nxe-pivot-field-chooser .nxe-treeview-expander-icon-stub{display:flex;flex-shrink:0;width:22px;height:22px}nxe-pivot-field-chooser .nxe-checkbox{display:inline-block;line-height:0;cursor:pointer;-webkit-user-select:none;user-select:none}nxe-pivot-field-chooser .nxe-checkbox .nxe-checkbox-container{display:flex;align-items:center;justify-content:center;width:22px;height:22px;overflow:hidden}nxe-pivot-field-chooser .nxe-checkbox .nxe-checkbox-icon{display:block;position:relative;flex-shrink:0;box-sizing:border-box;width:22px;height:22px;border:1px solid var(--nxe-ui-border, #ddd);border-radius:2px;background-color:var(--nxe-ui-surface, #fff)}nxe-pivot-field-chooser .nxe-checkbox:hover .nxe-checkbox-icon{border-color:var(--nxe-ui-accent-strong, #265a87)}nxe-pivot-field-chooser .nxe-checkbox:focus-visible .nxe-checkbox-icon{border-color:var(--nxe-ui-accent, #337ab7)}nxe-pivot-field-chooser .nxe-checkbox-checked .nxe-checkbox-icon{color:var(--nxe-ui-accent, #337ab7)}nxe-pivot-field-chooser .nxe-checkbox-checked .nxe-checkbox-icon:after{content:\"\";position:absolute;left:50%;top:50%;box-sizing:border-box;width:7.5px;height:13.25px;margin:-8.1px 0 0 -3.75px;border:solid currentColor;border-width:0 2px 2px 0;transform:rotate(45deg)}nxe-pivot-field-chooser .nxe-area-icon{display:inline-block;position:relative;box-sizing:border-box;width:18px;height:18px;vertical-align:middle;color:var(--nxe-ui-text, #333)}nxe-pivot-field-chooser .nxe-area-icon:before,nxe-pivot-field-chooser .nxe-area-icon:after{content:none;position:absolute;box-sizing:border-box}@media(forced-colors:active){nxe-pivot-field-chooser .nxe-area-icon:before,nxe-pivot-field-chooser .nxe-area-icon:after{forced-color-adjust:none;color:CanvasText}}nxe-pivot-field-chooser .nxe-icon-smalliconslayout:before{content:\"\";left:2px;top:2px;width:4px;height:4px;background-color:currentColor;box-shadow:5px 0 currentColor,10px 0 currentColor,0 5px currentColor,5px 5px currentColor,10px 5px currentColor,0 10px currentColor,5px 10px currentColor,10px 10px currentColor}nxe-pivot-field-chooser .nxe-icon-rowfield:before{content:\"\";left:2px;top:2px;width:4px;height:4px;background-color:currentColor;box-shadow:5px 0 currentColor,10px 0 currentColor,0 10px currentColor,5px 10px currentColor,10px 10px currentColor}nxe-pivot-field-chooser .nxe-icon-rowfield:after{content:\"\";left:2px;top:7px;width:14px;height:4px;border:1px solid currentColor}nxe-pivot-field-chooser .nxe-icon-columnfield:before{content:\"\";left:2px;top:2px;width:4px;height:4px;background-color:currentColor;box-shadow:0 5px currentColor,0 10px currentColor,10px 0 currentColor,10px 5px currentColor,10px 10px currentColor}nxe-pivot-field-chooser .nxe-icon-columnfield:after{content:\"\";left:7px;top:2px;width:4px;height:14px;border:1px solid currentColor}nxe-pivot-field-chooser .nxe-icon-filter:before{content:\"\";inset:0;background-color:currentColor;clip-path:polygon(0 0,18px 0,18px 4px,11.5px 10.5px,11.5px 18px,6.5px 18px,6.5px 10.5px,0 4px)}nxe-pivot-field-chooser .nxe-icon-formula:before{content:\"\";left:4px;top:2px;width:10px;height:14px;background-color:currentColor;clip-path:polygon(0 0,10px 0,10px 2px,3.3px 2px,6.4px 7px,3.3px 12px,10px 12px,10px 14px,0 14px,0 13.53px,4.05px 7px,0 .47px)}.nxe-fieldchooser-pane{pointer-events:auto}\n"], dependencies: [{ kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: NxePivotFieldChipComponent, selector: "div[nxePivotFieldChip]", inputs: ["chip", "floatIndicators"], outputs: ["chipPointerDown", "chipClick", "chipFilterClick"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
3000
3037
  }
3001
3038
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: NxePivotFieldChooserComponent, decorators: [{
3002
3039
  type: Component,
3003
- args: [{ selector: 'nxe-pivot-field-chooser', standalone: true, imports: [NgTemplateOutlet, NxePivotFieldChipComponent], host: { class: 'nxe-widget nxe-pivot-field-chooser-popup dx-fieldchooser-popup' }, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "<!-- dx popup box: fieldChooser width/height land on `.dx-overlay-content` (m_widget.js popup\r\n options; 600x400 -> 598x349 content once the 1px borders + 49px title bar are taken out \u2014\r\n oracle/chooser-probe.json reconciliation in the component header). Title bar per the\r\n full-page capture: \"Field Chooser\" left, X right, 1px rule beneath, popup centered. -->\r\n<div\r\n class=\"dx-overlay-content dx-popup-normal\"\r\n [style.width]=\"boxWidth()\"\r\n [style.height]=\"boxHeight()\">\r\n <div class=\"dx-popup-title dx-has-close-button\">\r\n <span class=\"dx-toolbar-label\">{{ texts.title }}</span>\r\n <span\r\n class=\"dx-closebutton\"\r\n role=\"button\"\r\n tabindex=\"0\"\r\n aria-label=\"Close\"\r\n (click)=\"closed.emit()\"\r\n (keydown.enter)=\"closed.emit()\"></span>\r\n </div>\r\n\r\n <!-- fixtures/field-chooser.html verbatim from here down: the chooser root carries\r\n dx-popup-content + dx-pivotgridfieldchooser + dx-pivotgrid-fields-container (the class\r\n that arms the shared chip chrome in dx-compat.css), then layout 0's two rows. -->\r\n <div class=\"dx-popup-content dx-widget dx-pivotgridfieldchooser dx-pivotgrid-fields-container\">\r\n <div class=\"dx-pivotgridfieldchooser-container dx-layout-0\">\r\n <div class=\"dx-row\">\r\n <div class=\"dx-col\">\r\n <!-- All Fields: dx-treeview of EVERY defined field, checkbox = has an area. -->\r\n <div class=\"dx-area dx-all-fields\">\r\n <div class=\"dx-area-fields-header\">\r\n <span class=\"dx-area-icon dx-icon-{{ allIcon }}\"></span><span>&nbsp;</span><span class=\"dx-area-caption\">{{ texts.allFields }}</span>\r\n </div>\r\n <div\r\n class=\"dx-area-fields dx-pivotgrid-drag-action dx-treeview-border-visible dx-widget dx-collection dx-treeview\"\r\n tabindex=\"0\"\r\n role=\"tree\">\r\n @if (allowSearch()) {\r\n <!-- dx allowSearch: the treeview search editor (dx-compat gives it margin:5px);\r\n default FALSE \u2014 the broker capture has no search box (oracle \u00A7c). -->\r\n <div class=\"dx-treeview-search dx-texteditor dx-searchbox\">\r\n <input\r\n class=\"dx-texteditor-input\"\r\n type=\"text\"\r\n placeholder=\"Search\"\r\n [value]=\"searchText()\"\r\n (input)=\"onSearchInput($event)\" />\r\n </div>\r\n }\r\n <div class=\"dx-scrollable dx-scrollable-vertical\">\r\n <div class=\"dx-scrollable-wrapper\">\r\n <div class=\"dx-scrollable-container\">\r\n <div class=\"dx-scrollable-content\">\r\n <ul class=\"dx-treeview-node-container\" role=\"group\">\r\n @for (item of treeItems(); track item.fieldIndex) {\r\n <li\r\n class=\"dx-treeview-node dx-treeview-item-with-checkbox dx-treeview-root-node dx-treeview-node-is-leaf\"\r\n [class.dx-state-selected]=\"item.selected\"\r\n [attr.data-item-id]=\"$index + 1\"\r\n role=\"treeitem\"\r\n [attr.aria-label]=\"item.caption\"\r\n aria-level=\"1\"\r\n [attr.aria-selected]=\"item.selected\">\r\n <div class=\"dx-item dx-treeview-item\">\r\n <div class=\"dx-item-content dx-treeview-item-content\">\r\n <div class=\"dx-area-field\" tree-view-item=\"true\"><span>{{ item.caption }}</span></div>\r\n </div>\r\n <div\r\n class=\"dx-widget dx-checkbox\"\r\n [class.dx-checkbox-checked]=\"item.selected\"\r\n role=\"checkbox\"\r\n tabindex=\"0\"\r\n [attr.aria-checked]=\"item.selected\"\r\n aria-label=\"Check state\"\r\n (click)=\"onCheckboxClick(item)\"\r\n (keydown.space)=\"onCheckboxClick(item)\">\r\n <input type=\"hidden\" [value]=\"item.selected\" />\r\n <div class=\"dx-checkbox-container\"><span class=\"dx-checkbox-icon\"></span></div>\r\n </div>\r\n <div class=\"dx-treeview-expander-icon-stub\"></div>\r\n </div>\r\n </li>\r\n }\r\n </ul>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"dx-col\">\r\n <ng-container *ngTemplateOutlet=\"areaTpl; context: { area: rowArea() }\" />\r\n <ng-container *ngTemplateOutlet=\"areaTpl; context: { area: columnArea() }\" />\r\n </div>\r\n </div>\r\n <div class=\"dx-row\">\r\n <div class=\"dx-col\">\r\n <ng-container *ngTemplateOutlet=\"areaTpl; context: { area: filterArea() }\" />\r\n </div>\r\n <div class=\"dx-col\">\r\n <ng-container *ngTemplateOutlet=\"areaTpl; context: { area: dataArea() }\" />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!-- One group area (dx `_renderArea`): header (icon + caption), then the bordered fields box\r\n with the stacked chips. An EMPTY area shows nothing \u2014 the chooser has no\r\n \"Drop \u2026 Fields Here\" strings (fixture: the filter area's field container is empty). -->\r\n<ng-template #areaTpl let-area=\"area\">\r\n <div class=\"dx-area\">\r\n <div class=\"dx-area-fields-header\">\r\n <span class=\"dx-area-icon dx-icon-{{ area.icon }}\"></span><span>&nbsp;</span><span class=\"dx-area-caption\">{{ area.caption }}</span>\r\n </div>\r\n <div\r\n class=\"dx-area-fields dx-pivotgrid-drag-action dx-scrollable dx-scrollable-vertical\"\r\n [attr.group]=\"area.group\"\r\n allow-scrolling=\"true\">\r\n <div class=\"dx-scrollable-wrapper\">\r\n <div class=\"dx-scrollable-container\" tabindex=\"0\">\r\n <div class=\"dx-scrollable-content\">\r\n <div class=\"dx-area-field-container\">\r\n @for (chip of area.chips; track chip.fieldIndex) {\r\n <div\r\n nxePivotFieldChip\r\n [chip]=\"chip\"\r\n (chipPointerDown)=\"onChipPointerDown(chip, area.group, $event)\"\r\n (chipClick)=\"onChipClick(chip)\"\r\n (chipFilterClick)=\"onChipFilterClick(chip, $event)\"></div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n", styles: ["@charset \"UTF-8\";nxe-pivot-field-chooser{display:block}nxe-pivot-field-chooser>.dx-overlay-content{display:flex;flex-direction:column;box-sizing:border-box;min-width:400px;min-height:250px;max-width:95vw;max-height:95vh;background:#fff;border:1px solid #ddd;border-radius:6px;box-shadow:0 6px 12px #0000002d;color:#333;overflow:hidden}nxe-pivot-field-chooser .dx-popup-title{flex:0 0 auto;display:flex;align-items:center;padding:6px 20px;border-bottom:1px solid #ddd}nxe-pivot-field-chooser .dx-popup-title .dx-toolbar-label{flex:1 1 auto;font-size:20px;line-height:36px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}nxe-pivot-field-chooser .dx-popup-title .dx-closebutton{position:relative;flex:0 0 auto;width:14px;height:14px;margin:9px 0 9px 9px;cursor:pointer;color:#999}nxe-pivot-field-chooser .dx-popup-title .dx-closebutton:before,nxe-pivot-field-chooser .dx-popup-title .dx-closebutton:after{content:\"\";position:absolute;left:50%;top:50%;width:15px;height:1.5px;background:currentColor}nxe-pivot-field-chooser .dx-popup-title .dx-closebutton:before{transform:translate(-50%,-50%) rotate(45deg)}nxe-pivot-field-chooser .dx-popup-title .dx-closebutton:after{transform:translate(-50%,-50%) rotate(-45deg)}nxe-pivot-field-chooser .dx-popup-title .dx-closebutton:hover{color:#333}nxe-pivot-field-chooser .dx-popup-content.dx-pivotgridfieldchooser{flex:1 1 auto;min-height:0;box-sizing:border-box;padding:20px}nxe-pivot-field-chooser .dx-scrollable-container{flex:1 1 auto;min-height:0;overflow-y:auto;overflow-x:hidden;outline:0}nxe-pivot-field-chooser .dx-scrollable-wrapper{display:flex;flex-direction:column;flex:1 1 auto;min-height:0}nxe-pivot-field-chooser .dx-treeview-search{flex:0 0 auto}nxe-pivot-field-chooser .dx-treeview-search .dx-texteditor-input{box-sizing:border-box;width:100%;padding:7px 9px;border:1px solid #ddd;border-radius:4px;background:#fff;color:#333;font:inherit;outline:0}nxe-pivot-field-chooser .dx-treeview-search .dx-texteditor-input:focus{border-color:#337ab7}nxe-pivot-field-chooser .dx-area-icon{position:relative;color:#333}nxe-pivot-field-chooser .dx-area-icon:before{content:\"\";position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);box-sizing:border-box}nxe-pivot-field-chooser .dx-icon-smalliconslayout:before{width:3px;height:3px;left:3px;top:3px;transform:none;background:currentColor;box-shadow:5px 0 0 currentColor,10px 0 0 currentColor,0 5px 0 currentColor,5px 5px 0 currentColor,10px 5px 0 currentColor,0 10px 0 currentColor,5px 10px 0 currentColor,10px 10px 0 currentColor}nxe-pivot-field-chooser .dx-icon-rowfield:before{width:14px;height:12px;border:1px solid currentColor;background:linear-gradient(90deg,currentColor 0 4px,transparent 4px)}nxe-pivot-field-chooser .dx-icon-columnfield:before{width:14px;height:12px;border:1px solid currentColor;background:linear-gradient(180deg,currentColor 0 4px,transparent 4px)}nxe-pivot-field-chooser .dx-icon-filter:before{width:12px;height:12px;background:currentColor;clip-path:polygon(0 0,100% 0,62% 46%,62% 100%,38% 100%,38% 46%)}nxe-pivot-field-chooser .dx-icon-formula:before{content:\"\\3a3\";font-size:14px;line-height:1;font-weight:400}nxe-pivot-field-chooser .dx-checkbox-checked .dx-checkbox-icon:after{content:\"\";position:absolute;left:7px;top:3px;width:6px;height:11px;box-sizing:border-box;border:solid #337ab7;border-width:0 2px 2px 0;transform:rotate(45deg)}.nxe-fieldchooser-pane{pointer-events:auto}\n"] }]
3040
+ args: [{ selector: 'nxe-pivot-field-chooser', standalone: true, imports: [NgTemplateOutlet, NxePivotFieldChipComponent], host: { class: 'nxe-widget nxe-pivot-field-chooser-popup nxe-fieldchooser-popup' }, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "<!-- dx popup box: fieldChooser width/height land on `.dx-overlay-content` (m_widget.js popup\r\n options; 600x400 -> 598x349 content once the 1px borders + 49px title bar are taken out \u2014\r\n oracle/chooser-probe.json reconciliation in the component header). Title bar per the\r\n full-page capture: \"Field Chooser\" left, X right, 1px rule beneath, popup centered. -->\r\n<div\r\n class=\"nxe-overlay-content nxe-popup-normal\"\r\n [style.width]=\"boxWidth()\"\r\n [style.height]=\"boxHeight()\">\r\n <div class=\"nxe-popup-title nxe-has-close-button\">\r\n <span class=\"nxe-toolbar-label\">{{ texts.title }}</span>\r\n <span\r\n class=\"nxe-closebutton\"\r\n role=\"button\"\r\n tabindex=\"0\"\r\n [attr.aria-label]=\"messages.t('common.close')\"\r\n (click)=\"closed.emit()\"\r\n (keydown.enter)=\"closed.emit()\"></span>\r\n </div>\r\n\r\n <!-- fixtures/field-chooser.html verbatim from here down: the chooser root carries\r\n dx-popup-content + dx-pivotgridfieldchooser + dx-pivotgrid-fields-container (the class\r\n that arms the shared chip chrome, nxe-pivot-field-chip), then layout 0's two rows. -->\r\n <div class=\"nxe-popup-content nxe-widget nxe-pivotgridfieldchooser nxe-pivotgrid-fields-container\">\r\n <div class=\"nxe-pivotgridfieldchooser-container nxe-layout-0\">\r\n <div class=\"nxe-row\">\r\n <div class=\"nxe-col\">\r\n <!-- All Fields: dx-treeview of EVERY defined field, checkbox = has an area. -->\r\n <div class=\"nxe-area nxe-all-fields\">\r\n <div class=\"nxe-area-fields-header\">\r\n <span class=\"nxe-area-icon nxe-icon-{{ allIcon }}\"></span><span>&nbsp;</span><span class=\"nxe-area-caption\">{{ texts.allFields }}</span>\r\n </div>\r\n <div\r\n class=\"nxe-area-fields nxe-pivotgrid-drag-action nxe-treeview-border-visible nxe-widget nxe-collection nxe-treeview\"\r\n tabindex=\"0\"\r\n role=\"tree\">\r\n @if (allowSearch()) {\r\n <!-- dx allowSearch: the treeview search editor (dx margin:5px, in the scss);\r\n default FALSE \u2014 the broker capture has no search box (oracle \u00A7c). -->\r\n <div class=\"nxe-treeview-search nxe-texteditor nxe-searchbox\">\r\n <input\r\n class=\"nxe-texteditor-input\"\r\n type=\"text\"\r\n [attr.placeholder]=\"messages.t('common.search')\"\r\n [value]=\"searchText()\"\r\n (input)=\"onSearchInput($event)\" />\r\n </div>\r\n }\r\n <div class=\"nxe-scrollable nxe-scrollable-vertical\">\r\n <div class=\"nxe-scrollable-wrapper\">\r\n <div class=\"nxe-scrollable-container\">\r\n <div class=\"nxe-scrollable-content\">\r\n <ul class=\"nxe-treeview-node-container\" role=\"group\">\r\n @for (item of treeItems(); track item.fieldIndex) {\r\n <li\r\n class=\"nxe-treeview-node nxe-treeview-item-with-checkbox nxe-treeview-root-node nxe-treeview-node-is-leaf\"\r\n [class.nxe-state-selected]=\"item.selected\"\r\n [attr.data-item-id]=\"$index + 1\"\r\n role=\"treeitem\"\r\n [attr.aria-label]=\"item.caption\"\r\n aria-level=\"1\"\r\n [attr.aria-selected]=\"item.selected\">\r\n <div class=\"nxe-item nxe-treeview-item\">\r\n <div class=\"nxe-item-content nxe-treeview-item-content\">\r\n <div class=\"nxe-area-field\" tree-view-item=\"true\"><span>{{ item.caption }}</span></div>\r\n </div>\r\n <div\r\n class=\"nxe-widget nxe-checkbox\"\r\n [class.nxe-checkbox-checked]=\"item.selected\"\r\n role=\"checkbox\"\r\n tabindex=\"0\"\r\n [attr.aria-checked]=\"item.selected\"\r\n [attr.aria-label]=\"messages.t('pivot.chooser.checkState')\"\r\n (click)=\"onCheckboxClick(item)\"\r\n (keydown.space)=\"onCheckboxClick(item)\">\r\n <input type=\"hidden\" [value]=\"item.selected\" />\r\n <div class=\"nxe-checkbox-container\"><span class=\"nxe-checkbox-icon\"></span></div>\r\n </div>\r\n <div class=\"nxe-treeview-expander-icon-stub\"></div>\r\n </div>\r\n </li>\r\n }\r\n </ul>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"nxe-col\">\r\n <ng-container *ngTemplateOutlet=\"areaTpl; context: { area: rowArea() }\" />\r\n <ng-container *ngTemplateOutlet=\"areaTpl; context: { area: columnArea() }\" />\r\n </div>\r\n </div>\r\n <div class=\"nxe-row\">\r\n <div class=\"nxe-col\">\r\n <ng-container *ngTemplateOutlet=\"areaTpl; context: { area: filterArea() }\" />\r\n </div>\r\n <div class=\"nxe-col\">\r\n <ng-container *ngTemplateOutlet=\"areaTpl; context: { area: dataArea() }\" />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!-- One group area (dx `_renderArea`): header (icon + caption), then the bordered fields box\r\n with the stacked chips. An EMPTY area shows nothing \u2014 the chooser has no\r\n \"Drop \u2026 Fields Here\" strings (fixture: the filter area's field container is empty). -->\r\n<ng-template #areaTpl let-area=\"area\">\r\n <div class=\"nxe-area\">\r\n <div class=\"nxe-area-fields-header\">\r\n <span class=\"nxe-area-icon nxe-icon-{{ area.icon }}\"></span><span>&nbsp;</span><span class=\"nxe-area-caption\">{{ area.caption }}</span>\r\n </div>\r\n <div\r\n class=\"nxe-area-fields nxe-pivotgrid-drag-action nxe-scrollable nxe-scrollable-vertical\"\r\n [attr.group]=\"area.group\"\r\n allow-scrolling=\"true\">\r\n <div class=\"nxe-scrollable-wrapper\">\r\n <div class=\"nxe-scrollable-container\" tabindex=\"0\">\r\n <div class=\"nxe-scrollable-content\">\r\n <div class=\"nxe-area-field-container\">\r\n @for (chip of area.chips; track chip.fieldIndex) {\r\n <!-- dx renderField(field, true) (m_field_chooser.js:465): showColumnLines on,\r\n so the indicators float right ahead of the caption. -->\r\n <div\r\n nxePivotFieldChip\r\n [chip]=\"chip\"\r\n [floatIndicators]=\"true\"\r\n (chipPointerDown)=\"onChipPointerDown(chip, area.group, $event)\"\r\n (chipClick)=\"onChipClick(chip)\"\r\n (chipFilterClick)=\"onChipFilterClick(chip, $event)\"></div>\r\n }\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n", styles: ["nxe-pivot-field-chooser{display:block}nxe-pivot-field-chooser>.nxe-overlay-content{display:flex;flex-direction:column;box-sizing:border-box;min-width:max(250px,var(--nxe-ui-fieldchooser-min-width, 0px));min-height:250px;max-width:95vw;max-height:95vh;background:var(--nxe-ui-surface, #fff);border:1px solid var(--nxe-ui-border, #ddd);border-radius:6px;box-shadow:var(--nxe-ui-popup-shadow, 0 6px 12px rgba(0, 0, 0, .176));color:var(--nxe-ui-text, #333);overflow:hidden}nxe-pivot-field-chooser .nxe-popup-title{flex:0 0 auto;display:flex;align-items:center;padding:6px 20px;border-bottom:1px solid var(--nxe-ui-border, #ddd)}nxe-pivot-field-chooser .nxe-popup-title .nxe-toolbar-label{flex:1 1 auto;font-size:20px;line-height:36px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}nxe-pivot-field-chooser .nxe-popup-title .nxe-closebutton{position:relative;inset-inline-start:10px;flex:0 0 auto;box-sizing:border-box;width:36px;height:36px;margin:0;margin-inline-start:30px;border:1px solid transparent;border-radius:var(--nxe-ui-radius, 4px);background-color:transparent;color:var(--nxe-ui-text, #333);cursor:pointer;outline:0}nxe-pivot-field-chooser .nxe-popup-title .nxe-closebutton:before,nxe-pivot-field-chooser .nxe-popup-title .nxe-closebutton:after{content:\"\";position:absolute;left:50%;top:50%;box-sizing:border-box;width:17px;height:2px;margin:-1px 0 0 -8.5px;background-color:currentColor}@media(forced-colors:active){nxe-pivot-field-chooser .nxe-popup-title .nxe-closebutton:before,nxe-pivot-field-chooser .nxe-popup-title .nxe-closebutton:after{forced-color-adjust:none;background-color:CanvasText}}nxe-pivot-field-chooser .nxe-popup-title .nxe-closebutton:before{transform:rotate(45deg)}nxe-pivot-field-chooser .nxe-popup-title .nxe-closebutton:after{transform:rotate(-45deg)}nxe-pivot-field-chooser .nxe-popup-title .nxe-closebutton:hover{background-color:var(--nxe-ui-hover-bg, rgba(0, 0, 0, .04))}nxe-pivot-field-chooser .nxe-popup-title .nxe-closebutton:focus-visible{background-color:var(--nxe-ui-focus-bg, rgba(0, 0, 0, .08))}nxe-pivot-field-chooser .nxe-popup-title .nxe-closebutton:active{background-color:var(--nxe-ui-active-bg, rgba(0, 0, 0, .24))}nxe-pivot-field-chooser .nxe-popup-content.nxe-pivotgridfieldchooser{flex:1 1 auto;min-height:0;box-sizing:border-box;padding:20px}nxe-pivot-field-chooser .nxe-pivotgridfieldchooser{position:relative;background-color:var(--nxe-ui-surface, #fff)}nxe-pivot-field-chooser .nxe-pivotgridfieldchooser .nxe-pivotgridfieldchooser-container{display:flex;overflow:hidden;height:100%}nxe-pivot-field-chooser .nxe-pivotgridfieldchooser .nxe-pivotgridfieldchooser-container.nxe-layout-0{flex-direction:column}nxe-pivot-field-chooser .nxe-pivotgridfieldchooser .nxe-pivotgridfieldchooser-container .nxe-row:first-child{flex-grow:2}nxe-pivot-field-chooser .nxe-pivotgridfieldchooser .nxe-pivotgridfieldchooser-container .nxe-row:nth-child(2){flex-grow:1}nxe-pivot-field-chooser .nxe-pivotgridfieldchooser .nxe-row{display:flex;flex-direction:row;height:0;min-height:0}nxe-pivot-field-chooser .nxe-pivotgridfieldchooser .nxe-col{display:flex;flex-direction:column;width:50%;min-height:0}nxe-pivot-field-chooser .nxe-pivotgridfieldchooser .nxe-area{display:flex;flex-direction:column;flex-grow:1;min-height:0;padding:5px}nxe-pivot-field-chooser .nxe-pivotgridfieldchooser .nxe-area-fields{overflow:hidden}nxe-pivot-field-chooser .nxe-pivotgridfieldchooser .nxe-area .nxe-area-fields{display:flex;flex-direction:column;height:0;margin-top:3px;border:1px solid var(--nxe-ui-border, #ddd)}nxe-pivot-field-chooser .nxe-pivotgridfieldchooser .nxe-area-fields[group]{display:flex;padding:5px;background-color:var(--nxe-ui-border-faded, rgba(221, 221, 221, .2))}nxe-pivot-field-chooser .nxe-pivotgridfieldchooser .nxe-area-fields.nxe-drag-target{border-color:var(--nxe-ui-accent, #337ab7)}nxe-pivot-field-chooser .nxe-pivotgridfieldchooser .nxe-area>.nxe-scrollable,nxe-pivot-field-chooser .nxe-pivotgridfieldchooser .nxe-area>.nxe-scrollable>.nxe-scrollable-wrapper,nxe-pivot-field-chooser .nxe-pivotgridfieldchooser .nxe-area>.nxe-treeview,nxe-pivot-field-chooser .nxe-pivotgridfieldchooser .nxe-area>.nxe-treeview>.nxe-scrollable,nxe-pivot-field-chooser .nxe-pivotgridfieldchooser .nxe-area>.nxe-treeview>.nxe-scrollable>.nxe-scrollable-wrapper{display:flex;flex-direction:column;flex-grow:1;height:0;min-height:0}nxe-pivot-field-chooser .nxe-pivotgridfieldchooser .nxe-area-fields-header .nxe-area-caption{align-self:center}nxe-pivot-field-chooser .nxe-pivotgridfieldchooser .nxe-area .nxe-area-caption{vertical-align:middle}nxe-pivot-field-chooser .nxe-scrollable-container{flex:1 1 auto;min-height:0;overflow-y:auto;overflow-x:hidden;outline:0}nxe-pivot-field-chooser .nxe-scrollable-wrapper{display:flex;flex-direction:column;flex:1 1 auto;min-height:0}nxe-pivot-field-chooser .nxe-treeview-search{flex:0 0 auto;margin:5px}nxe-pivot-field-chooser .nxe-treeview-search .nxe-texteditor-input{box-sizing:border-box;width:100%;padding:7px 9px;border:1px solid var(--nxe-ui-border, #ddd);border-radius:4px;background:var(--nxe-ui-surface, #fff);color:var(--nxe-ui-text, #333);font:inherit;outline:0}nxe-pivot-field-chooser .nxe-treeview-search .nxe-texteditor-input:focus{border-color:var(--nxe-ui-accent, #337ab7)}nxe-pivot-field-chooser .nxe-treeview :focus{outline:0}nxe-pivot-field-chooser .nxe-treeview-node-container{display:block;margin:0;padding:0;overflow:hidden;list-style-position:inside}nxe-pivot-field-chooser .nxe-treeview-border-visible .nxe-scrollable-content>.nxe-treeview-node-container{padding:1px 1px 1px 7px}nxe-pivot-field-chooser .nxe-treeview-node{list-style-type:none;padding-inline-start:15px;-webkit-user-select:none;user-select:none}nxe-pivot-field-chooser .nxe-treeview-node.nxe-treeview-root-node{padding-inline-start:0}nxe-pivot-field-chooser .nxe-treeview-node .nxe-checkbox{order:1;margin:0}nxe-pivot-field-chooser .nxe-treeview-item{display:flex;align-items:center;gap:8px;margin:0;padding:5px 10px;color:var(--nxe-ui-text, #333);cursor:pointer}nxe-pivot-field-chooser .nxe-treeview-item:hover{background-color:var(--nxe-ui-hover-bg, rgba(0, 0, 0, .04))}nxe-pivot-field-chooser .nxe-treeview-item .nxe-treeview-item-content{flex:1 1 auto;order:2}nxe-pivot-field-chooser .nxe-treeview-expander-icon-stub{display:flex;flex-shrink:0;width:22px;height:22px}nxe-pivot-field-chooser .nxe-checkbox{display:inline-block;line-height:0;cursor:pointer;-webkit-user-select:none;user-select:none}nxe-pivot-field-chooser .nxe-checkbox .nxe-checkbox-container{display:flex;align-items:center;justify-content:center;width:22px;height:22px;overflow:hidden}nxe-pivot-field-chooser .nxe-checkbox .nxe-checkbox-icon{display:block;position:relative;flex-shrink:0;box-sizing:border-box;width:22px;height:22px;border:1px solid var(--nxe-ui-border, #ddd);border-radius:2px;background-color:var(--nxe-ui-surface, #fff)}nxe-pivot-field-chooser .nxe-checkbox:hover .nxe-checkbox-icon{border-color:var(--nxe-ui-accent-strong, #265a87)}nxe-pivot-field-chooser .nxe-checkbox:focus-visible .nxe-checkbox-icon{border-color:var(--nxe-ui-accent, #337ab7)}nxe-pivot-field-chooser .nxe-checkbox-checked .nxe-checkbox-icon{color:var(--nxe-ui-accent, #337ab7)}nxe-pivot-field-chooser .nxe-checkbox-checked .nxe-checkbox-icon:after{content:\"\";position:absolute;left:50%;top:50%;box-sizing:border-box;width:7.5px;height:13.25px;margin:-8.1px 0 0 -3.75px;border:solid currentColor;border-width:0 2px 2px 0;transform:rotate(45deg)}nxe-pivot-field-chooser .nxe-area-icon{display:inline-block;position:relative;box-sizing:border-box;width:18px;height:18px;vertical-align:middle;color:var(--nxe-ui-text, #333)}nxe-pivot-field-chooser .nxe-area-icon:before,nxe-pivot-field-chooser .nxe-area-icon:after{content:none;position:absolute;box-sizing:border-box}@media(forced-colors:active){nxe-pivot-field-chooser .nxe-area-icon:before,nxe-pivot-field-chooser .nxe-area-icon:after{forced-color-adjust:none;color:CanvasText}}nxe-pivot-field-chooser .nxe-icon-smalliconslayout:before{content:\"\";left:2px;top:2px;width:4px;height:4px;background-color:currentColor;box-shadow:5px 0 currentColor,10px 0 currentColor,0 5px currentColor,5px 5px currentColor,10px 5px currentColor,0 10px currentColor,5px 10px currentColor,10px 10px currentColor}nxe-pivot-field-chooser .nxe-icon-rowfield:before{content:\"\";left:2px;top:2px;width:4px;height:4px;background-color:currentColor;box-shadow:5px 0 currentColor,10px 0 currentColor,0 10px currentColor,5px 10px currentColor,10px 10px currentColor}nxe-pivot-field-chooser .nxe-icon-rowfield:after{content:\"\";left:2px;top:7px;width:14px;height:4px;border:1px solid currentColor}nxe-pivot-field-chooser .nxe-icon-columnfield:before{content:\"\";left:2px;top:2px;width:4px;height:4px;background-color:currentColor;box-shadow:0 5px currentColor,0 10px currentColor,10px 0 currentColor,10px 5px currentColor,10px 10px currentColor}nxe-pivot-field-chooser .nxe-icon-columnfield:after{content:\"\";left:7px;top:2px;width:4px;height:14px;border:1px solid currentColor}nxe-pivot-field-chooser .nxe-icon-filter:before{content:\"\";inset:0;background-color:currentColor;clip-path:polygon(0 0,18px 0,18px 4px,11.5px 10.5px,11.5px 18px,6.5px 18px,6.5px 10.5px,0 4px)}nxe-pivot-field-chooser .nxe-icon-formula:before{content:\"\";left:4px;top:2px;width:10px;height:14px;background-color:currentColor;clip-path:polygon(0 0,10px 0,10px 2px,3.3px 2px,6.4px 7px,3.3px 12px,10px 12px,10px 14px,0 14px,0 13.53px,4.05px 7px,0 .47px)}.nxe-fieldchooser-pane{pointer-events:auto}\n"] }]
3004
3041
  }], propDecorators: { engine: [{ type: i0.Input, args: [{ isSignal: true, alias: "engine", required: true }] }], width: [{ type: i0.Input, args: [{ isSignal: true, alias: "width", required: false }] }], height: [{ type: i0.Input, args: [{ isSignal: true, alias: "height", required: false }] }], allowSearch: [{ type: i0.Input, args: [{ isSignal: true, alias: "allowSearch", required: false }] }], allowSorting: [{ type: i0.Input, args: [{ isSignal: true, alias: "allowSorting", required: false }] }], allowFiltering: [{ type: i0.Input, args: [{ isSignal: true, alias: "allowFiltering", required: false }] }], fieldMove: [{ type: i0.Output, args: ["fieldMove"] }], sortToggle: [{ type: i0.Output, args: ["sortToggle"] }], filterOpen: [{ type: i0.Output, args: ["filterOpen"] }], closed: [{ type: i0.Output, args: ["closed"] }] } });
3005
3042
 
3006
3043
  /* eslint-disable @typescript-eslint/no-explicit-any */
@@ -3056,7 +3093,7 @@ function mergeFieldOverrides(fields, overrides) {
3056
3093
  });
3057
3094
  }
3058
3095
  /** `dxo-field-chooser` — LIVE since P3-C3: with `enabled` the pivot renders the
3059
- * `.dx-pivotgrid-field-chooser-button` toolbar button and opens the chooser popup
3096
+ * `.nxe-pivotgrid-field-chooser-button` toolbar button and opens the chooser popup
3060
3097
  * (nxe-pivot-field-chooser) in a CDK overlay. Defaults are dxPivotGrid's `fieldChooser`
3061
3098
  * defaults (m_widget.js): enabled true, width/height 600, allowSearch false,
3062
3099
  * applyChangesMode 'instantly' (no OK/Cancel — changes hit the pivot live). */
@@ -3088,7 +3125,7 @@ class NxePivotGridComponent {
3088
3125
  dataSource = input(null, /* @ts-ignore */
3089
3126
  ...(ngDevMode ? [{ debugName: "dataSource" }] : /* istanbul ignore next */ []));
3090
3127
  /** dx `allowFiltering` (default false) — LIVE since P3-C4: filterable dimension chips
3091
- * (panel AND chooser) render the `.dx-header-filter` funnel and open the shared
3128
+ * (panel AND chooser) render the `.nxe-header-filter` funnel and open the shared
3092
3129
  * header-filter panel; per-field `field.allowFiltering` overrides the widget flag
3093
3130
  * (dx m_widget `_updateCalculatedOptions`). */
3094
3131
  allowFiltering = input(false, /* @ts-ignore */
@@ -3105,7 +3142,7 @@ class NxePivotGridComponent {
3105
3142
  ...(ngDevMode ? [{ debugName: "allowExpandAll" }] : /* istanbul ignore next */ []));
3106
3143
  showBorders = input(false, /* @ts-ignore */
3107
3144
  ...(ngDevMode ? [{ debugName: "showBorders" }] : /* istanbul ignore next */ []));
3108
- /** dx default TRUE (m_widget.js defaultOptions): `dx-word-wrap` on the table lets header
3145
+ /** dx default TRUE (m_widget.js defaultOptions): `nxe-word-wrap` on the table lets header
3109
3146
  * cells wrap; data cells stay nowrap either way (dx.light's direct td rule). */
3110
3147
  wordWrapEnabled = input(true, /* @ts-ignore */
3111
3148
  ...(ngDevMode ? [{ debugName: "wordWrapEnabled" }] : /* istanbul ignore next */ []));
@@ -3135,7 +3172,7 @@ class NxePivotGridComponent {
3135
3172
  dataFieldArea = input(undefined, /* @ts-ignore */
3136
3173
  ...(ngDevMode ? [{ debugName: "dataFieldArea" }] : /* istanbul ignore next */ []));
3137
3174
  /** dx `allowSorting` (default false, P3-C2): field-panel chips toggle their field's
3138
- * sortOrder on click and carry the `.dx-sort` arrow in `.dx-column-indicators`. */
3175
+ * sortOrder on click and carry the `.nxe-sort` arrow in `.nxe-column-indicators`. */
3139
3176
  allowSorting = input(false, /* @ts-ignore */
3140
3177
  ...(ngDevMode ? [{ debugName: "allowSorting" }] : /* istanbul ignore next */ []));
3141
3178
  // --- W4 Lane 2: facade `option(name, value)` overrides + dx-shaped outputs ------------------
@@ -3227,20 +3264,21 @@ class NxePivotGridComponent {
3227
3264
  panelCmp = viewChild(NxePivotFieldPanelComponent, /* @ts-ignore */
3228
3265
  ...(ngDevMode ? [{ debugName: "panelCmp" }] : /* istanbul ignore next */ []));
3229
3266
  /** The ROW fields area, outletted into the corner cell (dx hosts the row chips inside
3230
- * `.dx-area-description-cell` — oracle §c; the corner shows NO caption text then). */
3267
+ * `.nxe-area-description-cell` — oracle §c; the corner shows NO caption text then). */
3231
3268
  panelRowAreaTpl = computed(() => this.panelCmp()?.rowAreaTemplate() ?? null, /* @ts-ignore */
3232
3269
  ...(ngDevMode ? [{ debugName: "panelRowAreaTpl" }] : /* istanbul ignore next */ []));
3233
3270
  // --- Field chooser (P3-C3) -----------------------------------------------------------------
3234
- /** The `.dx-pivotgrid-field-chooser-button` renders only when an `nxe-field-chooser` is
3271
+ /** The `.nxe-pivotgrid-field-chooser-button` renders only when an `nxe-field-chooser` is
3235
3272
  * projected with `enabled` not false (the DA page passes [enabled]="true"). */
3236
3273
  chooserEnabled = computed(() => this.fieldChooser() != null && this.fieldChooser().enabled() !== false, /* @ts-ignore */
3237
3274
  ...(ngDevMode ? [{ debugName: "chooserEnabled" }] : /* istanbul ignore next */ []));
3238
3275
  /** dx toolbar placement (m_widget.js `_renderDescriptionArea`, verbatim branch order):
3239
- * (a) panel visible && showFilterFields -> the `.dx-filter-header` band;
3240
- * (b) panel visible && (showDataFields || showColumnFields) -> the `.dx-column-header`
3276
+ * (a) panel visible && showFilterFields -> the `.nxe-filter-header` band;
3277
+ * (b) panel visible && (showDataFields || showColumnFields) -> the `.nxe-column-header`
3241
3278
  * band (dx-compat's dormant column-header button rules go live);
3242
- * (c) else -> the cross-tab corner `.dx-area-description-cell`, where the
3243
- * transparent-until-hover button rules (dx-compat ~1113-1118) apply. */
3279
+ * (c) else -> the cross-tab corner `.nxe-area-description-cell`, where the button is
3280
+ * transparent until hover and the corner drops its caption (the library's own rules,
3281
+ * nxe-pivot-grid.component.scss — dx.light's description-cell toolbar rules). */
3244
3282
  chooserToolbarHost = computed(() => {
3245
3283
  if (!this.chooserEnabled()) {
3246
3284
  return null;
@@ -3269,6 +3307,10 @@ class NxePivotGridComponent {
3269
3307
  overlay = inject(Overlay);
3270
3308
  viewContainerRef = inject(ViewContainerRef);
3271
3309
  elementRef = inject((ElementRef));
3310
+ /** Locale separators for every number the pivot renders; threaded into the data source. */
3311
+ separators = inject(NXE_NUMBER_SEPARATORS);
3312
+ /** The library's runtime-switchable messages. */
3313
+ messages = inject(NxeMessageService);
3272
3314
  /** Bumped by `getDataSource().reload()` to force a re-aggregate. */
3273
3315
  reloadTick = signal(0, /* @ts-ignore */
3274
3316
  ...(ngDevMode ? [{ debugName: "reloadTick" }] : /* istanbul ignore next */ []));
@@ -3318,12 +3360,13 @@ class NxePivotGridComponent {
3318
3360
  if (overrides.size && explicit.length) {
3319
3361
  return new NxePivotDataSource({
3320
3362
  ...opts,
3363
+ separators: this.separators,
3321
3364
  fields: mergeFieldOverrides(explicit, overrides),
3322
3365
  });
3323
3366
  }
3324
3367
  // No explicit fields → store-derived fields are all AREA-LESS: no chips exist, so the
3325
3368
  // panel can never have produced overrides for this data source.
3326
- return new NxePivotDataSource(opts);
3369
+ return new NxePivotDataSource({ ...opts, separators: this.separators });
3327
3370
  }, /* @ts-ignore */
3328
3371
  ...(ngDevMode ? [{ debugName: "engine" }] : /* istanbul ignore next */ []));
3329
3372
  /**
@@ -3365,7 +3408,14 @@ class NxePivotGridComponent {
3365
3408
  showRowTotals: this.showRowTotalsEff(),
3366
3409
  showColumnTotals: this.showColumnTotalsEff(),
3367
3410
  showTotalsPrior: this.showTotalsPriorEff(),
3368
- texts: this.textsEff(),
3411
+ // The bundle's wording under whatever the host passed, so a language switch rebuilds
3412
+ // the model (and with it Grand Total / Total / No data) without touching the engine.
3413
+ texts: {
3414
+ grandTotal: this.messages.t('pivot.grandTotal'),
3415
+ total: this.messages.t('pivot.total'),
3416
+ noData: this.messages.t('pivot.noData'),
3417
+ ...this.textsEff(),
3418
+ },
3369
3419
  dataFieldArea: this.dataFieldAreaEff(),
3370
3420
  });
3371
3421
  }, /* @ts-ignore */
@@ -3471,7 +3521,7 @@ class NxePivotGridComponent {
3471
3521
  this.scrollTop.set(event.target.scrollTop);
3472
3522
  }
3473
3523
  /**
3474
- * dx `.dx-pivotgrid-nodata` (gridCoreUtils.renderNoDataText): shown when the data source
3524
+ * dx `.nxe-pivotgrid-nodata` (gridCoreUtils.renderNoDataText): shown when the data source
3475
3525
  * `isEmpty()` — no VISIBLE data field or nothing aggregated (empty/fully-filtered store);
3476
3526
  * text `texts.noData` (dx default "No data"). The reloadTick read re-checks after an
3477
3527
  * in-place instance reload.
@@ -3526,11 +3576,11 @@ class NxePivotGridComponent {
3526
3576
  // per model change / repaint / updateDimensions — dx re-layouts on the same).
3527
3577
  const scrollEl = host.querySelector('.nxe-pivotgrid-scroll');
3528
3578
  this.viewportHeight.set(scrollEl?.clientHeight ?? 0);
3529
- const dataTd = host.querySelector('.nxe-pivot-field-panel-table td.dx-data-header');
3579
+ const dataTd = host.querySelector('.nxe-pivot-field-panel-table td.nxe-data-header');
3530
3580
  if (!dataTd) {
3531
3581
  return;
3532
3582
  }
3533
- const corner = host.querySelector('.nxe-pivotgrid-table th.dx-area-description-cell');
3583
+ const corner = host.querySelector('.nxe-pivotgrid-table th.nxe-area-description-cell');
3534
3584
  dataTd.style.width = corner
3535
3585
  ? `${corner.getBoundingClientRect().width}px`
3536
3586
  : '';
@@ -3981,6 +4031,11 @@ class NxePivotGridComponent {
3981
4031
  }
3982
4032
  return String(a).localeCompare(String(b));
3983
4033
  },
4034
+ }, {
4035
+ blanks: () => this.messages.t('common.blanks'),
4036
+ yes: () => this.messages.t('common.yes'),
4037
+ no: () => this.messages.t('common.no'),
4038
+ month: (month) => Info.months('long', { locale: this.messages.locale() })[month - 1],
3984
4039
  });
3985
4040
  hfOverlayRef = null;
3986
4041
  /** A chip funnel was clicked (panel or chooser) — open the shared header-filter popup. */
@@ -4519,7 +4574,7 @@ class NxePivotGridComponent {
4519
4574
  return this.facade;
4520
4575
  }
4521
4576
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: NxePivotGridComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
4522
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.5", type: NxePivotGridComponent, isStandalone: true, selector: "nxe-pivot-grid", inputs: { dataSource: { classPropertyName: "dataSource", publicName: "dataSource", isSignal: true, isRequired: false, transformFunction: null }, allowFiltering: { classPropertyName: "allowFiltering", publicName: "allowFiltering", isSignal: true, isRequired: false, transformFunction: null }, allowSortingBySummary: { classPropertyName: "allowSortingBySummary", publicName: "allowSortingBySummary", isSignal: true, isRequired: false, transformFunction: null }, allowExpandAll: { classPropertyName: "allowExpandAll", publicName: "allowExpandAll", isSignal: true, isRequired: false, transformFunction: null }, showBorders: { classPropertyName: "showBorders", publicName: "showBorders", isSignal: true, isRequired: false, transformFunction: null }, wordWrapEnabled: { classPropertyName: "wordWrapEnabled", publicName: "wordWrapEnabled", isSignal: true, isRequired: false, transformFunction: null }, rowHeaderLayout: { classPropertyName: "rowHeaderLayout", publicName: "rowHeaderLayout", isSignal: true, isRequired: false, transformFunction: null }, height: { classPropertyName: "height", publicName: "height", isSignal: true, isRequired: false, transformFunction: null }, texts: { classPropertyName: "texts", publicName: "texts", isSignal: true, isRequired: false, transformFunction: null }, showColumnTotals: { classPropertyName: "showColumnTotals", publicName: "showColumnTotals", isSignal: true, isRequired: false, transformFunction: null }, showRowTotals: { classPropertyName: "showRowTotals", publicName: "showRowTotals", isSignal: true, isRequired: false, transformFunction: null }, showColumnGrandTotals: { classPropertyName: "showColumnGrandTotals", publicName: "showColumnGrandTotals", isSignal: true, isRequired: false, transformFunction: null }, showRowGrandTotals: { classPropertyName: "showRowGrandTotals", publicName: "showRowGrandTotals", isSignal: true, isRequired: false, transformFunction: null }, showTotalsPrior: { classPropertyName: "showTotalsPrior", publicName: "showTotalsPrior", isSignal: true, isRequired: false, transformFunction: null }, dataFieldArea: { classPropertyName: "dataFieldArea", publicName: "dataFieldArea", isSignal: true, isRequired: false, transformFunction: null }, allowSorting: { classPropertyName: "allowSorting", publicName: "allowSorting", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { onCellClick: "onCellClick", onCellPrepared: "onCellPrepared", onContentReady: "onContentReady", onOptionChanged: "onOptionChanged", onExporting: "onExporting" }, host: { properties: { "style.height": "hostHeight()", "class.dx-pivotgrid": "panelVisible() || chooserInCorner()", "class.dx-pivotgrid-fields-container": "panelVisible() || chooserInCorner()" }, classAttribute: "nxe-widget nxe-pivot-grid" }, queries: [{ propertyName: "fieldChooser", first: true, predicate: NxeFieldChooserComponent, descendants: true, isSignal: true }, { propertyName: "fieldPanel", first: true, predicate: NxeFieldPanelComponent, descendants: true, isSignal: true }, { propertyName: "stateStoring", first: true, predicate: NxeStateStoringComponent, descendants: true, isSignal: true }, { propertyName: "scrolling", first: true, predicate: NxeScrollingComponent, descendants: true, isSignal: true }], viewQueries: [{ propertyName: "panelCmp", first: true, predicate: NxePivotFieldPanelComponent, descendants: true, isSignal: true }], ngImport: i0, template: "<!-- P3-C3: the dx `.dx-pivotgrid-toolbar` with the field-chooser button (m_widget.js\r\n `_renderDescriptionArea` + dx.light float:right chrome). Placement per dx's branch order:\r\n the panel's filter-header band when it shows, else the panel's column-header band when\r\n the data/column band row shows, else the cross-tab corner cell, where the dormant\r\n dx-compat rules (~1113-1118) keep it transparent until hover. Renders only when the\r\n projected nxe-field-chooser config is enabled. -->\r\n<ng-template #chooserToolbarTpl>\r\n <div class=\"dx-pivotgrid-toolbar\">\r\n <div\r\n class=\"dx-pivotgrid-field-chooser-button nxe-pivot-field-chooser-button dx-widget dx-button dx-button-mode-contained dx-button-normal dx-button-has-icon\"\r\n role=\"button\"\r\n tabindex=\"0\"\r\n title=\"Show Field Chooser\"\r\n aria-label=\"Show Field Chooser\"\r\n (click)=\"toggleFieldChooser()\"\r\n (keydown.enter)=\"toggleFieldChooser()\">\r\n <div class=\"dx-button-content\"><i class=\"dx-icon dx-icon-columnchooser\"></i></div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n@if (model(); as m) {\r\n <!-- P3-C2: the dx field panel (dxo-field-panel). dx default visible=false \u2014 nothing renders\r\n unless the projected nxe-field-panel opts in (the calc tabs project none). `undefined`\r\n bound into a flag (report-output-pivot binds panelConfig()?.\u2026) falls back to the dx\r\n default: hidden for `visible`, shown for the five area/drag flags. The ROW area is not\r\n in this block \u2014 the panel exposes it as a template and the corner cell below hosts it\r\n (dx: the corner .dx-area-description-cell holds the row chips). -->\r\n @if (fieldPanel(); as fp) {\r\n @if (fp.visible()) {\r\n <nxe-pivot-field-panel\r\n [engine]=\"engine()\"\r\n [showFilterFields]=\"fp.showFilterFields() !== false\"\r\n [showDataFields]=\"fp.showDataFields() !== false\"\r\n [showColumnFields]=\"fp.showColumnFields() !== false\"\r\n [showRowFields]=\"fp.showRowFields() !== false\"\r\n [allowFieldDragging]=\"fp.allowFieldDragging() !== false\"\r\n [allowSorting]=\"allowSortingEff()\"\r\n [allowFiltering]=\"allowFilteringEff()\"\r\n [showBorders]=\"showBordersEff()\"\r\n [toolbarTemplate]=\"chooserToolbarTpl\"\r\n [toolbarArea]=\"panelToolbarArea()\"\r\n (fieldMove)=\"onPanelFieldMove($event)\"\r\n (sortToggle)=\"onPanelSortToggle($event)\"\r\n (filterOpen)=\"openPivotHeaderFilter($event)\" />\r\n }\r\n }\r\n <div class=\"nxe-pivotgrid-scroll\" (scroll)=\"onPivotScroll($event)\">\r\n <table\r\n class=\"nxe-pivotgrid-table\"\r\n role=\"grid\"\r\n [class.nxe-pivotgrid-bordered]=\"showBordersEff()\"\r\n [class.dx-word-wrap]=\"wordWrapEnabledEff()\"\r\n [class.nxe-pivot-layout-tree]=\"m.rowHeaderLayout === 'tree'\">\r\n <colgroup>\r\n @for (w of m.colWidths; track $index) {\r\n <col [style.width.px]=\"w\" />\r\n }\r\n </colgroup>\r\n <thead>\r\n @for (hr of m.columnHeaderRows; track $index; let first = $first) {\r\n <tr role=\"row\">\r\n @if (first) {\r\n <!-- Corner: with the field panel VISIBLE dx hosts the ROW-field chips here and\r\n renders NO caption text (oracle \u00A7c \"hosts the ROW field chips\";\r\n views/0/initial-full-page.png). The caption is the panel-hidden rendering\r\n only (accepted deviation \u2014 dx shows an empty corner then). -->\r\n <th\r\n class=\"nxe-pivot-corner dx-area-description-cell\"\r\n role=\"columnheader\"\r\n [class.nxe-pivot-corner-fields]=\"panelVisible()\"\r\n [attr.rowspan]=\"m.columnHeaderRows.length\"\r\n [attr.colspan]=\"m.rowHeaderColCount > 1 ? m.rowHeaderColCount : null\">@if (chooserInCorner()) {<ng-container *ngTemplateOutlet=\"chooserToolbarTpl\" />}@if (panelVisible()) {<ng-container *ngTemplateOutlet=\"panelRowAreaTpl()\" />} @else {{{ m.cornerText }}}</th>\r\n }\r\n @for (cell of hr; track $index) {\r\n <th\r\n class=\"nxe-pivot-col-header\"\r\n role=\"columnheader\"\r\n [class.nxe-pivot-grandtotal]=\"cell.isGrandTotal\"\r\n [class.nxe-pivot-total]=\"cell.isTotal\"\r\n [class.dx-row-total]=\"cell.isGrandTotal || cell.isTotal\"\r\n [class.dx-grandtotal]=\"cell.isGrandTotal\"\r\n [class.dx-total]=\"cell.isTotal\"\r\n [class.dx-pivotgrid-expanded]=\"cell.expandable && cell.expanded\"\r\n [class.dx-pivotgrid-collapsed]=\"cell.expandable && !cell.expanded\"\r\n [attr.colspan]=\"cell.colspan\"\r\n [attr.rowspan]=\"cell.rowspan && cell.rowspan > 1 ? cell.rowspan : null\"\r\n [attr.tabindex]=\"cell.expandable ? 0 : null\"\r\n [attr.aria-expanded]=\"cell.expandable ? cell.expanded === true : null\"\r\n (click)=\"onColHeaderCellClick($event, cell)\"\r\n (keydown.enter)=\"cell.expandable && onExpandKey($event, cell.pathKey ?? '', cell.expanded === true)\"\r\n (keydown.space)=\"cell.expandable && onExpandKey($event, cell.pathKey ?? '', cell.expanded === true)\">\r\n @if (cell.expandable) {\r\n <span\r\n class=\"nxe-pivot-expand dx-expand-icon-container\"\r\n [class.nxe-pivot-expanded]=\"cell.expanded\"\r\n (click)=\"onColExpandClick($event, cell)\"><span class=\"dx-expand\">{{ cell.expanded ? '\u2212' : '+' }}</span></span>\r\n }<span class=\"nxe-pivot-col-label\">{{ cell.text }}</span></th>\r\n }\r\n </tr>\r\n }\r\n </thead>\r\n <tbody>\r\n <!-- W4 Lane 3: `viewRows()` is the rendered row window ({row, ri} with ri = MODEL row\r\n index \u2014 matrix addressing must not shift). All rows unless nxe-scrolling\r\n mode=\"virtual\" arms tree-scoped windowing; the spacer rows stand in for the\r\n unrendered rows so the scrollbar geometry stays true. -->\r\n @if (topSpacerH() > 0) {\r\n <tr class=\"nxe-pivot-vspacer\" aria-hidden=\"true\"><td [attr.colspan]=\"totalColCount()\" [style.height.px]=\"topSpacerH()\"></td></tr>\r\n }\r\n @for (entry of viewRows(); track entry.row.trackKey ?? entry.row.pathKey) {\r\n @let row = entry.row;\r\n @let ri = entry.ri;\r\n <tr class=\"nxe-pivot-row\" role=\"row\" [class.nxe-pivot-total-row]=\"row.kind === 'T'\">\r\n @if (m.rowHeaderLayout === 'tree') {\r\n @if (row.measureRowspan !== 0) {\r\n <th\r\n class=\"nxe-pivot-row-header\"\r\n role=\"rowheader\"\r\n [attr.rowspan]=\"row.measureRowspan && row.measureRowspan > 1 ? row.measureRowspan : null\"\r\n [style.padding-left.px]=\"10 + row.level * 16\"\r\n [attr.tabindex]=\"row.hasChildren ? 0 : null\"\r\n [attr.aria-expanded]=\"row.hasChildren ? row.expanded : null\"\r\n (click)=\"onRowHeaderCellClick($event, row, null)\"\r\n (keydown.enter)=\"row.hasChildren && onExpandKey($event, row.pathKey, row.expanded)\"\r\n (keydown.space)=\"row.hasChildren && onExpandKey($event, row.pathKey, row.expanded)\">\r\n @if (row.hasChildren) {\r\n <span\r\n class=\"nxe-pivot-expand dx-expand-icon-container\"\r\n [class.nxe-pivot-expanded]=\"row.expanded\"\r\n (click)=\"onRowExpandClick($event, row, null)\"><span class=\"dx-expand\">{{ row.expanded ? '\u2212' : '+' }}</span></span>\r\n }\r\n <span class=\"nxe-pivot-row-label\">{{ row.label }}</span>\r\n </th>\r\n }\r\n @if (row.measureCaption !== undefined) {\r\n <th\r\n class=\"nxe-pivot-row-header nxe-pivot-measure-header\"\r\n role=\"rowheader\"\r\n [class.nxe-pivot-total]=\"row.kind === 'T'\"\r\n [class.dx-row-total]=\"row.kind === 'T'\"\r\n [class.dx-total]=\"row.kind === 'T'\"\r\n (click)=\"onMeasureCellClick($event, row)\">{{ row.measureCaption }}</th>\r\n }\r\n } @else {\r\n @for (hc of row.headerCells; track $index) {\r\n <th\r\n class=\"nxe-pivot-row-header\"\r\n role=\"rowheader\"\r\n [class.nxe-pivot-total]=\"hc.isTotal\"\r\n [class.dx-row-total]=\"hc.isTotal\"\r\n [class.dx-total]=\"hc.isTotal\"\r\n [class.dx-pivotgrid-expanded]=\"hc.expandable && hc.expanded\"\r\n [class.dx-pivotgrid-collapsed]=\"hc.expandable && !hc.expanded\"\r\n [attr.rowspan]=\"hc.rowspan > 1 ? hc.rowspan : null\"\r\n [attr.colspan]=\"hc.colspan > 1 ? hc.colspan : null\"\r\n [attr.tabindex]=\"hc.expandable ? 0 : null\"\r\n [attr.aria-expanded]=\"hc.expandable ? hc.expanded : null\"\r\n (click)=\"onRowHeaderCellClick($event, row, hc)\"\r\n (keydown.enter)=\"hc.expandable && onExpandKey($event, hc.pathKey, hc.expanded)\"\r\n (keydown.space)=\"hc.expandable && onExpandKey($event, hc.pathKey, hc.expanded)\">\r\n @if (hc.expandable) {\r\n <span\r\n class=\"nxe-pivot-expand dx-expand-icon-container\"\r\n [class.nxe-pivot-expanded]=\"hc.expanded\"\r\n (click)=\"onRowExpandClick($event, row, hc)\"><span class=\"dx-expand\">{{ hc.expanded ? '\u2212' : '+' }}</span></span>\r\n }\r\n @if (hc.isTotal) {\r\n {{ hc.text }}\r\n } @else {\r\n <span class=\"nxe-pivot-row-label\">{{ hc.text }}</span>\r\n }\r\n </th>\r\n }\r\n }\r\n @for (leaf of m.leaves; track $index; let li = $index) {\r\n <td\r\n class=\"nxe-pivot-data\"\r\n role=\"gridcell\"\r\n [class.nxe-pivot-total]=\"row.kind === 'T' || leaf.kind === 'T'\"\r\n [class.dx-total]=\"row.kind === 'T' || leaf.kind === 'T'\"\r\n [class.dx-row-total]=\"row.kind === 'T'\"\r\n [class.nxe-pivot-grandtotal]=\"leaf.isGrandTotal\"\r\n [class.dx-grandtotal]=\"leaf.isGrandTotal\"\r\n (click)=\"onDataCellClick($event, ri, li)\">{{ m.textMatrix[ri][li] }}</td>\r\n }\r\n </tr>\r\n }\r\n @if (bottomSpacerH() > 0) {\r\n <tr class=\"nxe-pivot-vspacer\" aria-hidden=\"true\"><td [attr.colspan]=\"totalColCount()\" [style.height.px]=\"bottomSpacerH()\"></td></tr>\r\n }\r\n @if (m.grandTotalRows; as gtr) {\r\n @for (g of gtr; track g.dataIndex; let first = $first) {\r\n <tr class=\"nxe-pivot-row nxe-pivot-grandtotal-row\" role=\"row\">\r\n @if (first) {\r\n <th\r\n class=\"nxe-pivot-row-header nxe-pivot-grandtotal dx-row-total dx-grandtotal\"\r\n role=\"rowheader\"\r\n [attr.rowspan]=\"gtr.length > 1 ? gtr.length : null\"\r\n [attr.colspan]=\"m.rowHeaderColCount - 1 > 1 ? m.rowHeaderColCount - 1 : null\"\r\n (click)=\"onGtHeaderCellClick($event, m.texts.grandTotal)\">{{ m.texts.grandTotal }}</th>\r\n }\r\n <th\r\n class=\"nxe-pivot-row-header nxe-pivot-measure-header nxe-pivot-grandtotal dx-row-total dx-grandtotal\"\r\n role=\"rowheader\"\r\n (click)=\"onGtHeaderCellClick($event, g.caption)\">{{ g.caption }}</th>\r\n @for (gc of g.cells; track $index; let li = $index) {\r\n <td\r\n class=\"nxe-pivot-data nxe-pivot-grandtotal dx-grandtotal dx-row-total\"\r\n role=\"gridcell\"\r\n [class.dx-total]=\"m.leaves[li].kind === 'T'\"\r\n (click)=\"onGtDataCellClick($event, li, g.dataIndex, gc.value, gc.text)\">{{ gc.text }}</td>\r\n }\r\n </tr>\r\n }\r\n } @else if (m.grandTotalCells; as gt) {\r\n <tr class=\"nxe-pivot-row nxe-pivot-grandtotal-row\" role=\"row\">\r\n <th\r\n class=\"nxe-pivot-row-header nxe-pivot-grandtotal dx-row-total dx-grandtotal\"\r\n role=\"rowheader\"\r\n [attr.colspan]=\"m.rowHeaderColCount > 1 ? m.rowHeaderColCount : null\"\r\n (click)=\"onGtHeaderCellClick($event, m.texts.grandTotal)\">{{ m.texts.grandTotal }}</th>\r\n @for (gc of gt; track $index; let li = $index) {\r\n <td\r\n class=\"nxe-pivot-data nxe-pivot-grandtotal dx-grandtotal dx-row-total\"\r\n role=\"gridcell\"\r\n [class.dx-total]=\"m.leaves[li].kind === 'T'\"\r\n (click)=\"onGtDataCellClick($event, li, m.leaves[li].dataIndex, gc.value, gc.text)\">{{ gc.text }}</td>\r\n }\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n <!-- dx `.dx-pivotgrid-nodata` (gridCoreUtils.renderNoDataText): a <span>, shown when the\r\n data source isEmpty(), centered over the widget by the dx.light absolute rule. -->\r\n @if (showNoData()) {\r\n <span class=\"dx-pivotgrid-nodata\">{{ m.texts.noData }}</span>\r\n }\r\n </div>\r\n} @else {\r\n <div class=\"nxe-pivotgrid-empty\"></div>\r\n}\r\n", styles: ["nxe-pivot-grid{display:block;position:relative;color:#333}nxe-pivot-grid .nxe-pivotgrid-scroll{overflow:auto;width:100%;height:100%}nxe-pivot-grid .nxe-pivotgrid-table{border-collapse:collapse;table-layout:auto;background:#fff}nxe-pivot-grid .nxe-pivotgrid-table th,nxe-pivot-grid .nxe-pivotgrid-table td{border:1px solid #ddd;padding:7px 10px;white-space:nowrap;vertical-align:top;font-weight:400}nxe-pivot-grid .nxe-pivot-corner{background-color:#ddd3;color:#333;text-align:left}nxe-pivot-grid .nxe-pivot-corner.nxe-pivot-corner-fields{padding:0;vertical-align:bottom}nxe-pivot-grid .nxe-pivot-corner.nxe-pivot-corner-fields .dx-pivotgrid-fields-area{position:relative}nxe-pivot-grid .nxe-pivot-col-header{color:#959595;text-align:center}nxe-pivot-grid .nxe-pivot-row-header{color:#959595;text-align:left}nxe-pivot-grid .dx-word-wrap .nxe-pivot-col-header,nxe-pivot-grid .dx-word-wrap .nxe-pivot-row-header{white-space:normal}nxe-pivot-grid .dx-word-wrap .dx-pivotgrid-expanded,nxe-pivot-grid .dx-word-wrap .dx-pivotgrid-collapsed{white-space:nowrap}nxe-pivot-grid .dx-word-wrap .dx-pivotgrid-expanded .nxe-pivot-row-label,nxe-pivot-grid .dx-word-wrap .dx-pivotgrid-expanded .nxe-pivot-col-label,nxe-pivot-grid .dx-word-wrap .dx-pivotgrid-collapsed .nxe-pivot-row-label,nxe-pivot-grid .dx-word-wrap .dx-pivotgrid-collapsed .nxe-pivot-col-label{white-space:normal;display:inline-flex}nxe-pivot-grid .nxe-pivot-layout-tree .nxe-pivot-corner{position:sticky;left:0;z-index:2;background-color:#f8f8f8}nxe-pivot-grid .nxe-pivot-layout-tree .nxe-pivot-row-header{position:sticky;left:0;z-index:1;background-color:#fff}nxe-pivot-grid .nxe-pivot-expand{display:inline-block;width:14px;height:14px;line-height:12px;text-align:center;margin-right:6px;border:1px solid #b3b3b3;border-radius:2px;font-size:11px;cursor:pointer;-webkit-user-select:none;user-select:none;color:#959595;background:#fff}nxe-pivot-grid .nxe-pivot-expand:hover{border-color:#5c94c5;color:#5c94c5}nxe-pivot-grid .nxe-pivot-data{text-align:right;color:#333}nxe-pivot-grid .nxe-pivot-total{background-color:#ddd3}nxe-pivot-grid .nxe-pivot-grandtotal{background-color:#f5f5f5!important}nxe-pivot-grid .nxe-pivotgrid-bordered{border:1px solid #ddd}nxe-pivot-grid .nxe-pivotgrid-empty{min-height:1px}nxe-pivot-grid .nxe-pivot-vspacer td{padding:0;border-left:0;border-right:0}nxe-pivot-grid .nxe-pivotgrid-table th[tabindex]:focus-visible{outline:1px dotted rgb(149,149,149);outline-offset:-2px}nxe-pivot-grid .dx-pivotgrid-nodata{position:absolute;top:50%;left:50%;width:100%;text-align:center;transform:translate(-50%,-50%)}.grid-fit-h>nxe-pivot-grid{position:absolute;height:100%;width:100%}\n"], dependencies: [{ kind: "component", type: NxePivotFieldPanelComponent, selector: "nxe-pivot-field-panel", inputs: ["engine", "showFilterFields", "showDataFields", "showColumnFields", "showRowFields", "allowFieldDragging", "allowSorting", "allowFiltering", "showBorders", "toolbarTemplate", "toolbarArea"], outputs: ["fieldMove", "sortToggle", "filterOpen"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
4577
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.5", type: NxePivotGridComponent, isStandalone: true, selector: "nxe-pivot-grid", inputs: { dataSource: { classPropertyName: "dataSource", publicName: "dataSource", isSignal: true, isRequired: false, transformFunction: null }, allowFiltering: { classPropertyName: "allowFiltering", publicName: "allowFiltering", isSignal: true, isRequired: false, transformFunction: null }, allowSortingBySummary: { classPropertyName: "allowSortingBySummary", publicName: "allowSortingBySummary", isSignal: true, isRequired: false, transformFunction: null }, allowExpandAll: { classPropertyName: "allowExpandAll", publicName: "allowExpandAll", isSignal: true, isRequired: false, transformFunction: null }, showBorders: { classPropertyName: "showBorders", publicName: "showBorders", isSignal: true, isRequired: false, transformFunction: null }, wordWrapEnabled: { classPropertyName: "wordWrapEnabled", publicName: "wordWrapEnabled", isSignal: true, isRequired: false, transformFunction: null }, rowHeaderLayout: { classPropertyName: "rowHeaderLayout", publicName: "rowHeaderLayout", isSignal: true, isRequired: false, transformFunction: null }, height: { classPropertyName: "height", publicName: "height", isSignal: true, isRequired: false, transformFunction: null }, texts: { classPropertyName: "texts", publicName: "texts", isSignal: true, isRequired: false, transformFunction: null }, showColumnTotals: { classPropertyName: "showColumnTotals", publicName: "showColumnTotals", isSignal: true, isRequired: false, transformFunction: null }, showRowTotals: { classPropertyName: "showRowTotals", publicName: "showRowTotals", isSignal: true, isRequired: false, transformFunction: null }, showColumnGrandTotals: { classPropertyName: "showColumnGrandTotals", publicName: "showColumnGrandTotals", isSignal: true, isRequired: false, transformFunction: null }, showRowGrandTotals: { classPropertyName: "showRowGrandTotals", publicName: "showRowGrandTotals", isSignal: true, isRequired: false, transformFunction: null }, showTotalsPrior: { classPropertyName: "showTotalsPrior", publicName: "showTotalsPrior", isSignal: true, isRequired: false, transformFunction: null }, dataFieldArea: { classPropertyName: "dataFieldArea", publicName: "dataFieldArea", isSignal: true, isRequired: false, transformFunction: null }, allowSorting: { classPropertyName: "allowSorting", publicName: "allowSorting", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { onCellClick: "onCellClick", onCellPrepared: "onCellPrepared", onContentReady: "onContentReady", onOptionChanged: "onOptionChanged", onExporting: "onExporting" }, host: { properties: { "style.height": "hostHeight()", "class.nxe-pivotgrid": "panelVisible() || chooserInCorner()", "class.nxe-pivotgrid-fields-container": "panelVisible() || chooserInCorner()" }, classAttribute: "nxe-widget nxe-pivot-grid" }, queries: [{ propertyName: "fieldChooser", first: true, predicate: NxeFieldChooserComponent, descendants: true, isSignal: true }, { propertyName: "fieldPanel", first: true, predicate: NxeFieldPanelComponent, descendants: true, isSignal: true }, { propertyName: "stateStoring", first: true, predicate: NxeStateStoringComponent, descendants: true, isSignal: true }, { propertyName: "scrolling", first: true, predicate: NxeScrollingComponent, descendants: true, isSignal: true }], viewQueries: [{ propertyName: "panelCmp", first: true, predicate: NxePivotFieldPanelComponent, descendants: true, isSignal: true }], ngImport: i0, template: "<!-- P3-C3: the dx `.dx-pivotgrid-toolbar` with the field-chooser button (m_widget.js\r\n `_renderDescriptionArea` + dx.light float:right chrome). Placement per dx's branch order:\r\n the panel's filter-header band when it shows, else the panel's column-header band when\r\n the data/column band row shows, else the cross-tab corner cell, where the button stays\r\n transparent until hover. Renders only when the projected nxe-field-chooser config is\r\n enabled. The button chrome is the library's own (nxe-pivot-grid.component.scss). -->\r\n<ng-template #chooserToolbarTpl>\r\n <div class=\"nxe-pivotgrid-toolbar\">\r\n <div\r\n class=\"nxe-pivotgrid-field-chooser-button nxe-pivot-field-chooser-button nxe-widget nxe-button nxe-button-mode-contained nxe-button-normal nxe-button-has-icon\"\r\n role=\"button\"\r\n tabindex=\"0\"\r\n [attr.title]=\"messages.t('pivot.showFieldChooser')\"\r\n [attr.aria-label]=\"messages.t('pivot.showFieldChooser')\"\r\n (click)=\"toggleFieldChooser()\"\r\n (keydown.enter)=\"toggleFieldChooser()\">\r\n <!-- dx's 18px `.dx-icon-columnchooser` glyph, redrawn from rectangles (the DXIcons font is\r\n not used): a window with a 2px frame (12 x 12) behind a solid 8 x 11 list panel with\r\n three 4 x 1 slots, unioned into one even-odd path so the slots stay open where the\r\n panel covers the frame. The span keeps the class the specs query but not `nxe-icon`,\r\n whose mask layer would hide an inline SVG. -->\r\n <div class=\"nxe-button-content\"><span class=\"nxe-icon-columnchooser nxe-pivot-chooser-icon\" aria-hidden=\"true\"><svg viewBox=\"0 0 18 18\" width=\"18\" height=\"18\" focusable=\"false\"><path fill=\"currentColor\" fill-rule=\"evenodd\" d=\"M1 2h12v4h4v11H9v-3H1zM3 4v8h6V6h2V4zM11 8v1h4V8zM11 11v1h4v-1zM11 14v1h4v-1z\" /></svg></span></div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n@if (model(); as m) {\r\n <!-- P3-C2: the dx field panel (dxo-field-panel). dx default visible=false \u2014 nothing renders\r\n unless the projected nxe-field-panel opts in (the calc tabs project none). `undefined`\r\n bound into a flag (report-output-pivot binds panelConfig()?.\u2026) falls back to the dx\r\n default: hidden for `visible`, shown for the five area/drag flags. The ROW area is not\r\n in this block \u2014 the panel exposes it as a template and the corner cell below hosts it\r\n (dx: the corner .dx-area-description-cell holds the row chips). -->\r\n @if (fieldPanel(); as fp) {\r\n @if (fp.visible()) {\r\n <nxe-pivot-field-panel\r\n [engine]=\"engine()\"\r\n [showFilterFields]=\"fp.showFilterFields() !== false\"\r\n [showDataFields]=\"fp.showDataFields() !== false\"\r\n [showColumnFields]=\"fp.showColumnFields() !== false\"\r\n [showRowFields]=\"fp.showRowFields() !== false\"\r\n [allowFieldDragging]=\"fp.allowFieldDragging() !== false\"\r\n [allowSorting]=\"allowSortingEff()\"\r\n [allowFiltering]=\"allowFilteringEff()\"\r\n [showBorders]=\"showBordersEff()\"\r\n [toolbarTemplate]=\"chooserToolbarTpl\"\r\n [toolbarArea]=\"panelToolbarArea()\"\r\n (fieldMove)=\"onPanelFieldMove($event)\"\r\n (sortToggle)=\"onPanelSortToggle($event)\"\r\n (filterOpen)=\"openPivotHeaderFilter($event)\" />\r\n }\r\n }\r\n <div class=\"nxe-pivotgrid-scroll\" (scroll)=\"onPivotScroll($event)\">\r\n <table\r\n class=\"nxe-pivotgrid-table\"\r\n role=\"grid\"\r\n [class.nxe-pivotgrid-bordered]=\"showBordersEff()\"\r\n [class.nxe-word-wrap]=\"wordWrapEnabledEff()\"\r\n [class.nxe-pivot-layout-tree]=\"m.rowHeaderLayout === 'tree'\">\r\n <colgroup>\r\n @for (w of m.colWidths; track $index) {\r\n <col [style.width.px]=\"w\" />\r\n }\r\n </colgroup>\r\n <thead>\r\n @for (hr of m.columnHeaderRows; track $index; let first = $first) {\r\n <tr role=\"row\">\r\n @if (first) {\r\n <!-- Corner: with the field panel VISIBLE dx hosts the ROW-field chips here and\r\n renders NO caption text (oracle \u00A7c \"hosts the ROW field chips\";\r\n views/0/initial-full-page.png). The caption is the panel-hidden rendering\r\n only (accepted deviation \u2014 dx shows an empty corner then). When the\r\n field-chooser toolbar lives here the corner is dx's exactly: the button at\r\n its top-left (0 cell padding + the button's 1px margin) and no caption,\r\n which the button would otherwise sit on top of. -->\r\n <th\r\n class=\"nxe-pivot-corner nxe-area-description-cell\"\r\n role=\"columnheader\"\r\n [class.nxe-pivot-corner-fields]=\"panelVisible()\"\r\n [class.nxe-pivot-corner-toolbar]=\"chooserInCorner()\"\r\n [attr.rowspan]=\"m.columnHeaderRows.length\"\r\n [attr.colspan]=\"m.rowHeaderColCount > 1 ? m.rowHeaderColCount : null\">@if (chooserInCorner()) {<ng-container *ngTemplateOutlet=\"chooserToolbarTpl\" />}@if (panelVisible()) {<ng-container *ngTemplateOutlet=\"panelRowAreaTpl()\" />} @else if (!chooserInCorner()) {{{ m.cornerText }}}</th>\r\n }\r\n @for (cell of hr; track $index) {\r\n <th\r\n class=\"nxe-pivot-col-header\"\r\n role=\"columnheader\"\r\n [class.nxe-pivot-grandtotal]=\"cell.isGrandTotal\"\r\n [class.nxe-pivot-total]=\"cell.isTotal\"\r\n [class.nxe-row-total]=\"cell.isGrandTotal || cell.isTotal\"\r\n [class.nxe-grandtotal]=\"cell.isGrandTotal\"\r\n [class.nxe-total]=\"cell.isTotal\"\r\n [class.nxe-pivotgrid-expanded]=\"cell.expandable && cell.expanded\"\r\n [class.nxe-pivotgrid-collapsed]=\"cell.expandable && !cell.expanded\"\r\n [attr.colspan]=\"cell.colspan\"\r\n [attr.rowspan]=\"cell.rowspan && cell.rowspan > 1 ? cell.rowspan : null\"\r\n [attr.tabindex]=\"cell.expandable ? 0 : null\"\r\n [attr.aria-expanded]=\"cell.expandable ? cell.expanded === true : null\"\r\n (click)=\"onColHeaderCellClick($event, cell)\"\r\n (keydown.enter)=\"cell.expandable && onExpandKey($event, cell.pathKey ?? '', cell.expanded === true)\"\r\n (keydown.space)=\"cell.expandable && onExpandKey($event, cell.pathKey ?? '', cell.expanded === true)\">\r\n @if (cell.expandable) {\r\n <span\r\n class=\"nxe-pivot-expand nxe-expand-icon-container\"\r\n [class.nxe-pivot-expanded]=\"cell.expanded\"\r\n (click)=\"onColExpandClick($event, cell)\"><span class=\"nxe-expand\" aria-hidden=\"true\"></span></span>\r\n }<span class=\"nxe-pivot-col-label\">{{ cell.text }}</span></th>\r\n }\r\n </tr>\r\n }\r\n </thead>\r\n <tbody>\r\n <!-- W4 Lane 3: `viewRows()` is the rendered row window ({row, ri} with ri = MODEL row\r\n index \u2014 matrix addressing must not shift). All rows unless nxe-scrolling\r\n mode=\"virtual\" arms tree-scoped windowing; the spacer rows stand in for the\r\n unrendered rows so the scrollbar geometry stays true. -->\r\n @if (topSpacerH() > 0) {\r\n <tr class=\"nxe-pivot-vspacer\" aria-hidden=\"true\"><td [attr.colspan]=\"totalColCount()\" [style.height.px]=\"topSpacerH()\"></td></tr>\r\n }\r\n @for (entry of viewRows(); track entry.row.trackKey ?? entry.row.pathKey) {\r\n @let row = entry.row;\r\n @let ri = entry.ri;\r\n <tr class=\"nxe-pivot-row\" role=\"row\" [class.nxe-pivot-total-row]=\"row.kind === 'T'\">\r\n @if (m.rowHeaderLayout === 'tree') {\r\n @if (row.measureRowspan !== 0) {\r\n <th\r\n class=\"nxe-pivot-row-header\"\r\n role=\"rowheader\"\r\n [attr.rowspan]=\"row.measureRowspan && row.measureRowspan > 1 ? row.measureRowspan : null\"\r\n [style.padding-left.px]=\"10 + row.level * 16\"\r\n [attr.tabindex]=\"row.hasChildren ? 0 : null\"\r\n [attr.aria-expanded]=\"row.hasChildren ? row.expanded : null\"\r\n (click)=\"onRowHeaderCellClick($event, row, null)\"\r\n (keydown.enter)=\"row.hasChildren && onExpandKey($event, row.pathKey, row.expanded)\"\r\n (keydown.space)=\"row.hasChildren && onExpandKey($event, row.pathKey, row.expanded)\">\r\n @if (row.hasChildren) {\r\n <span\r\n class=\"nxe-pivot-expand nxe-expand-icon-container\"\r\n [class.nxe-pivot-expanded]=\"row.expanded\"\r\n (click)=\"onRowExpandClick($event, row, null)\"><span class=\"nxe-expand\" aria-hidden=\"true\"></span></span>\r\n }\r\n <span class=\"nxe-pivot-row-label\">{{ row.label }}</span>\r\n </th>\r\n }\r\n @if (row.measureCaption !== undefined) {\r\n <th\r\n class=\"nxe-pivot-row-header nxe-pivot-measure-header\"\r\n role=\"rowheader\"\r\n [class.nxe-pivot-total]=\"row.kind === 'T'\"\r\n [class.nxe-row-total]=\"row.kind === 'T'\"\r\n [class.nxe-total]=\"row.kind === 'T'\"\r\n (click)=\"onMeasureCellClick($event, row)\">{{ row.measureCaption }}</th>\r\n }\r\n } @else {\r\n @for (hc of row.headerCells; track $index) {\r\n <th\r\n class=\"nxe-pivot-row-header\"\r\n role=\"rowheader\"\r\n [class.nxe-pivot-total]=\"hc.isTotal\"\r\n [class.nxe-row-total]=\"hc.isTotal\"\r\n [class.nxe-total]=\"hc.isTotal\"\r\n [class.nxe-pivotgrid-expanded]=\"hc.expandable && hc.expanded\"\r\n [class.nxe-pivotgrid-collapsed]=\"hc.expandable && !hc.expanded\"\r\n [attr.rowspan]=\"hc.rowspan > 1 ? hc.rowspan : null\"\r\n [attr.colspan]=\"hc.colspan > 1 ? hc.colspan : null\"\r\n [attr.tabindex]=\"hc.expandable ? 0 : null\"\r\n [attr.aria-expanded]=\"hc.expandable ? hc.expanded : null\"\r\n (click)=\"onRowHeaderCellClick($event, row, hc)\"\r\n (keydown.enter)=\"hc.expandable && onExpandKey($event, hc.pathKey, hc.expanded)\"\r\n (keydown.space)=\"hc.expandable && onExpandKey($event, hc.pathKey, hc.expanded)\">\r\n @if (hc.expandable) {\r\n <span\r\n class=\"nxe-pivot-expand nxe-expand-icon-container\"\r\n [class.nxe-pivot-expanded]=\"hc.expanded\"\r\n (click)=\"onRowExpandClick($event, row, hc)\"><span class=\"nxe-expand\" aria-hidden=\"true\"></span></span>\r\n }\r\n @if (hc.isTotal) {\r\n {{ hc.text }}\r\n } @else {\r\n <span class=\"nxe-pivot-row-label\">{{ hc.text }}</span>\r\n }\r\n </th>\r\n }\r\n }\r\n @for (leaf of m.leaves; track $index; let li = $index) {\r\n <td\r\n class=\"nxe-pivot-data\"\r\n role=\"gridcell\"\r\n [class.nxe-pivot-total]=\"row.kind === 'T' || leaf.kind === 'T'\"\r\n [class.nxe-total]=\"row.kind === 'T' || leaf.kind === 'T'\"\r\n [class.nxe-row-total]=\"row.kind === 'T'\"\r\n [class.nxe-pivot-grandtotal]=\"leaf.isGrandTotal\"\r\n [class.nxe-grandtotal]=\"leaf.isGrandTotal\"\r\n (click)=\"onDataCellClick($event, ri, li)\">{{ m.textMatrix[ri][li] }}</td>\r\n }\r\n </tr>\r\n }\r\n @if (bottomSpacerH() > 0) {\r\n <tr class=\"nxe-pivot-vspacer\" aria-hidden=\"true\"><td [attr.colspan]=\"totalColCount()\" [style.height.px]=\"bottomSpacerH()\"></td></tr>\r\n }\r\n @if (m.grandTotalRows; as gtr) {\r\n @for (g of gtr; track g.dataIndex; let first = $first) {\r\n <tr class=\"nxe-pivot-row nxe-pivot-grandtotal-row\" role=\"row\">\r\n @if (first) {\r\n <th\r\n class=\"nxe-pivot-row-header nxe-pivot-grandtotal nxe-row-total nxe-grandtotal\"\r\n role=\"rowheader\"\r\n [attr.rowspan]=\"gtr.length > 1 ? gtr.length : null\"\r\n [attr.colspan]=\"m.rowHeaderColCount - 1 > 1 ? m.rowHeaderColCount - 1 : null\"\r\n (click)=\"onGtHeaderCellClick($event, m.texts.grandTotal)\">{{ m.texts.grandTotal }}</th>\r\n }\r\n <th\r\n class=\"nxe-pivot-row-header nxe-pivot-measure-header nxe-pivot-grandtotal nxe-row-total nxe-grandtotal\"\r\n role=\"rowheader\"\r\n (click)=\"onGtHeaderCellClick($event, g.caption)\">{{ g.caption }}</th>\r\n @for (gc of g.cells; track $index; let li = $index) {\r\n <td\r\n class=\"nxe-pivot-data nxe-pivot-grandtotal nxe-grandtotal nxe-row-total\"\r\n role=\"gridcell\"\r\n [class.nxe-total]=\"m.leaves[li].kind === 'T'\"\r\n (click)=\"onGtDataCellClick($event, li, g.dataIndex, gc.value, gc.text)\">{{ gc.text }}</td>\r\n }\r\n </tr>\r\n }\r\n } @else if (m.grandTotalCells; as gt) {\r\n <tr class=\"nxe-pivot-row nxe-pivot-grandtotal-row\" role=\"row\">\r\n <th\r\n class=\"nxe-pivot-row-header nxe-pivot-grandtotal nxe-row-total nxe-grandtotal\"\r\n role=\"rowheader\"\r\n [attr.colspan]=\"m.rowHeaderColCount > 1 ? m.rowHeaderColCount : null\"\r\n (click)=\"onGtHeaderCellClick($event, m.texts.grandTotal)\">{{ m.texts.grandTotal }}</th>\r\n @for (gc of gt; track $index; let li = $index) {\r\n <td\r\n class=\"nxe-pivot-data nxe-pivot-grandtotal nxe-grandtotal nxe-row-total\"\r\n role=\"gridcell\"\r\n [class.nxe-total]=\"m.leaves[li].kind === 'T'\"\r\n (click)=\"onGtDataCellClick($event, li, m.leaves[li].dataIndex, gc.value, gc.text)\">{{ gc.text }}</td>\r\n }\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n <!-- dx `.dx-pivotgrid-nodata` (gridCoreUtils.renderNoDataText): a <span>, shown when the\r\n data source isEmpty(), centered over the widget by the dx.light absolute rule. -->\r\n @if (showNoData()) {\r\n <span class=\"nxe-pivotgrid-nodata\">{{ m.texts.noData }}</span>\r\n }\r\n </div>\r\n} @else {\r\n <div class=\"nxe-pivotgrid-empty\"></div>\r\n}\r\n", styles: ["nxe-pivot-grid{display:block;position:relative;color:#333}nxe-pivot-grid .nxe-pivotgrid-scroll{overflow:auto;width:100%;height:100%}nxe-pivot-grid .nxe-pivotgrid-table{border-collapse:collapse;table-layout:auto;background:#fff}nxe-pivot-grid .nxe-pivotgrid-table th,nxe-pivot-grid .nxe-pivotgrid-table td{border:1px solid #ddd;padding:7px 10px;white-space:nowrap;vertical-align:top;font-weight:400}nxe-pivot-grid .nxe-pivot-corner{background-color:#ddd3;color:#333;text-align:left}nxe-pivot-grid .nxe-pivot-corner.nxe-pivot-corner-fields{padding:0;vertical-align:bottom}nxe-pivot-grid .nxe-pivot-corner.nxe-pivot-corner-fields .nxe-pivotgrid-fields-area{position:relative}nxe-pivot-grid.nxe-pivotgrid .nxe-pivotgrid-fields-area-head td{position:relative;border:none;padding:10px 2px}nxe-pivot-grid.nxe-pivotgrid .nxe-pivotgrid-fields-area-head tr>td:first-child{padding-left:10px}nxe-pivot-grid.nxe-pivotgrid .nxe-pivotgrid-fields-area-head tr>td:last-child{padding-right:10px}nxe-pivot-grid.nxe-pivotgrid .nxe-column-header .nxe-pivotgrid-fields-area-head tr>td:first-child{padding-left:0}nxe-pivot-grid.nxe-pivotgrid .nxe-filter-header .nxe-area-field-container{border-spacing:8px 8px;border-collapse:separate}nxe-pivot-grid.nxe-pivotgrid .nxe-filter-header .nxe-pivotgrid-fields-area-head td{padding:2px}nxe-pivot-grid.nxe-pivotgrid .nxe-filter-header .nxe-pivotgrid-fields-area-head tr>td:first-child{padding-left:2px}nxe-pivot-grid.nxe-pivotgrid .nxe-pivotgrid-fields-area-head .nxe-empty-area-text{padding:7px 0;border:1px solid transparent;color:#525252;white-space:nowrap}nxe-pivot-grid.nxe-pivotgrid .nxe-column-header .nxe-pivotgrid-fields-area,nxe-pivot-grid.nxe-pivotgrid .nxe-filter-header .nxe-pivotgrid-fields-area{overflow:hidden}nxe-pivot-grid .nxe-pivot-corner.nxe-pivot-corner-toolbar{padding:0}nxe-pivot-grid .nxe-pivot-corner.nxe-pivot-corner-toolbar:not(.nxe-pivot-corner-fields){vertical-align:top}nxe-pivot-grid .nxe-pivot-col-header{color:#959595;text-align:center}nxe-pivot-grid .nxe-pivot-col-header.nxe-pivotgrid-expanded,nxe-pivot-grid .nxe-pivot-col-header.nxe-pivotgrid-collapsed{text-align:left}nxe-pivot-grid .nxe-pivotgrid-expanded,nxe-pivot-grid .nxe-pivotgrid-collapsed{cursor:pointer}nxe-pivot-grid .nxe-pivot-row-header{color:#959595;text-align:left}nxe-pivot-grid .nxe-word-wrap .nxe-pivot-col-header,nxe-pivot-grid .nxe-word-wrap .nxe-pivot-row-header{white-space:normal}nxe-pivot-grid .nxe-word-wrap .nxe-pivotgrid-expanded,nxe-pivot-grid .nxe-word-wrap .nxe-pivotgrid-collapsed{white-space:nowrap}nxe-pivot-grid .nxe-word-wrap .nxe-pivotgrid-expanded .nxe-pivot-row-label,nxe-pivot-grid .nxe-word-wrap .nxe-pivotgrid-expanded .nxe-pivot-col-label,nxe-pivot-grid .nxe-word-wrap .nxe-pivotgrid-collapsed .nxe-pivot-row-label,nxe-pivot-grid .nxe-word-wrap .nxe-pivotgrid-collapsed .nxe-pivot-col-label{white-space:normal;display:inline-flex}nxe-pivot-grid .nxe-pivot-layout-tree .nxe-pivot-corner{position:sticky;left:0;z-index:2;background-color:#f8f8f8}nxe-pivot-grid .nxe-pivot-layout-tree .nxe-pivot-row-header{position:sticky;left:0;z-index:1;background-color:#fff}nxe-pivot-grid .nxe-pivot-expand{position:relative;display:inline-block;box-sizing:border-box;width:14px;height:14px;margin:0;margin-inline:-5px 0;padding:0;border:0;background:none;vertical-align:top;cursor:pointer;-webkit-user-select:none;user-select:none;color:#959595}nxe-pivot-grid .nxe-pivot-expand .nxe-expand{display:inline-block;vertical-align:top}nxe-pivot-grid .nxe-pivot-expand .nxe-expand:before{content:\"\";position:absolute;left:50%;top:50%;box-sizing:content-box;width:0;height:0;margin:-4px 0 0 -2px;border-style:solid;border-width:4px 0 4px 4px;border-color:transparent transparent transparent currentColor}nxe-pivot-grid .nxe-pivot-expand.nxe-pivot-expanded .nxe-expand:before{margin:-2px 0 0 -4px;border-width:4px 4px 0;border-color:currentColor transparent transparent}nxe-pivot-grid .nxe-pivotgrid-field-chooser-button{display:inline-flex;box-sizing:border-box;max-width:100%;overflow:hidden;margin:0;border:1px solid var(--nxe-ui-border, #ddd);border-radius:var(--nxe-ui-radius, 4px);background-color:var(--nxe-ui-surface, #fff);color:var(--nxe-ui-text, #333);text-align:center;vertical-align:middle;cursor:pointer;-webkit-user-select:none;user-select:none;outline:0}nxe-pivot-grid .nxe-pivotgrid-field-chooser-button .nxe-button-content{display:flex;flex:1 1 auto;align-items:center;justify-content:center;box-sizing:border-box;height:100%;padding:5px;line-height:var(--nxe-ui-line-height, 1.35715)}nxe-pivot-grid .nxe-pivotgrid-field-chooser-button:hover{background-color:#f5f5f5}nxe-pivot-grid .nxe-pivotgrid-field-chooser-button:focus-visible{background-color:#ebebeb}nxe-pivot-grid .nxe-pivotgrid-field-chooser-button:active{background-color:#c2c2c2}nxe-pivot-grid .nxe-pivotgrid-toolbar .nxe-icon-columnchooser{display:flex;flex:0 0 auto;width:18px;height:18px}nxe-pivot-grid .nxe-pivotgrid-toolbar .nxe-icon-columnchooser>svg{display:block;width:18px;height:18px}nxe-pivot-grid .nxe-pivotgrid-toolbar .nxe-icon-columnchooser:before,nxe-pivot-grid .nxe-pivotgrid-toolbar .nxe-icon-columnchooser:after{content:none}nxe-pivot-grid .nxe-filter-header .nxe-pivotgrid-toolbar,nxe-pivot-grid .nxe-column-header .nxe-pivotgrid-toolbar{display:inline-block;float:right;margin-right:10px}nxe-pivot-grid .nxe-filter-header .nxe-pivotgrid-toolbar .nxe-pivotgrid-field-chooser-button,nxe-pivot-grid .nxe-column-header .nxe-pivotgrid-toolbar .nxe-pivotgrid-field-chooser-button{margin-top:12px;margin-right:4px}nxe-pivot-grid .nxe-area-description-cell .nxe-pivotgrid-toolbar{display:block;float:none;margin:0}nxe-pivot-grid .nxe-area-description-cell .nxe-pivotgrid-toolbar .nxe-pivotgrid-field-chooser-button{margin:1px}nxe-pivot-grid .nxe-area-description-cell .nxe-pivotgrid-toolbar .nxe-pivotgrid-field-chooser-button:not(:hover):not(:active){border-color:transparent;background-color:transparent;box-shadow:none}nxe-pivot-grid .nxe-pivot-data{text-align:right;color:#333}nxe-pivot-grid .nxe-pivot-total{background-color:#ddd3}nxe-pivot-grid .nxe-pivot-grandtotal{background-color:#f5f5f5!important}nxe-pivot-grid .nxe-pivotgrid-bordered{border:1px solid #ddd}nxe-pivot-grid .nxe-pivotgrid-empty{min-height:1px}nxe-pivot-grid .nxe-pivot-vspacer td{padding:0;border-left:0;border-right:0}nxe-pivot-grid .nxe-pivotgrid-table th[tabindex]:focus-visible{outline:1px dotted rgb(149,149,149);outline-offset:-2px}nxe-pivot-grid .nxe-pivotgrid-nodata{position:absolute;top:50%;left:50%;width:100%;text-align:center;transform:translate(-50%,-50%)}.grid-fit-h>nxe-pivot-grid{position:absolute;height:100%;width:100%}\n"], dependencies: [{ kind: "component", type: NxePivotFieldPanelComponent, selector: "nxe-pivot-field-panel", inputs: ["engine", "showFilterFields", "showDataFields", "showColumnFields", "showRowFields", "allowFieldDragging", "allowSorting", "allowFiltering", "showBorders", "toolbarTemplate", "toolbarArea"], outputs: ["fieldMove", "sortToggle", "filterOpen"] }, { kind: "directive", type: NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
4523
4578
  }
4524
4579
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: NxePivotGridComponent, decorators: [{
4525
4580
  type: Component,
@@ -4527,13 +4582,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImpor
4527
4582
  class: 'nxe-widget nxe-pivot-grid',
4528
4583
  '[style.height]': 'hostHeight()',
4529
4584
  // dx puts these marker classes on the widget root; here they arm while the field
4530
- // panel renders — or while the corner hosts the field-chooser toolbar (P3-C3: the
4531
- // dormant description-cell button rules in dx-compat ~1113-1118 key on them) — so the
4532
- // dormant dx-compat chip-chrome rules reach the panel bands AND the corner-hosted row
4533
- // area without touching the panel-less cross-tab chrome.
4534
- '[class.dx-pivotgrid]': 'panelVisible() || chooserInCorner()',
4535
- '[class.dx-pivotgrid-fields-container]': 'panelVisible() || chooserInCorner()',
4536
- }, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "<!-- P3-C3: the dx `.dx-pivotgrid-toolbar` with the field-chooser button (m_widget.js\r\n `_renderDescriptionArea` + dx.light float:right chrome). Placement per dx's branch order:\r\n the panel's filter-header band when it shows, else the panel's column-header band when\r\n the data/column band row shows, else the cross-tab corner cell, where the dormant\r\n dx-compat rules (~1113-1118) keep it transparent until hover. Renders only when the\r\n projected nxe-field-chooser config is enabled. -->\r\n<ng-template #chooserToolbarTpl>\r\n <div class=\"dx-pivotgrid-toolbar\">\r\n <div\r\n class=\"dx-pivotgrid-field-chooser-button nxe-pivot-field-chooser-button dx-widget dx-button dx-button-mode-contained dx-button-normal dx-button-has-icon\"\r\n role=\"button\"\r\n tabindex=\"0\"\r\n title=\"Show Field Chooser\"\r\n aria-label=\"Show Field Chooser\"\r\n (click)=\"toggleFieldChooser()\"\r\n (keydown.enter)=\"toggleFieldChooser()\">\r\n <div class=\"dx-button-content\"><i class=\"dx-icon dx-icon-columnchooser\"></i></div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n@if (model(); as m) {\r\n <!-- P3-C2: the dx field panel (dxo-field-panel). dx default visible=false \u2014 nothing renders\r\n unless the projected nxe-field-panel opts in (the calc tabs project none). `undefined`\r\n bound into a flag (report-output-pivot binds panelConfig()?.\u2026) falls back to the dx\r\n default: hidden for `visible`, shown for the five area/drag flags. The ROW area is not\r\n in this block \u2014 the panel exposes it as a template and the corner cell below hosts it\r\n (dx: the corner .dx-area-description-cell holds the row chips). -->\r\n @if (fieldPanel(); as fp) {\r\n @if (fp.visible()) {\r\n <nxe-pivot-field-panel\r\n [engine]=\"engine()\"\r\n [showFilterFields]=\"fp.showFilterFields() !== false\"\r\n [showDataFields]=\"fp.showDataFields() !== false\"\r\n [showColumnFields]=\"fp.showColumnFields() !== false\"\r\n [showRowFields]=\"fp.showRowFields() !== false\"\r\n [allowFieldDragging]=\"fp.allowFieldDragging() !== false\"\r\n [allowSorting]=\"allowSortingEff()\"\r\n [allowFiltering]=\"allowFilteringEff()\"\r\n [showBorders]=\"showBordersEff()\"\r\n [toolbarTemplate]=\"chooserToolbarTpl\"\r\n [toolbarArea]=\"panelToolbarArea()\"\r\n (fieldMove)=\"onPanelFieldMove($event)\"\r\n (sortToggle)=\"onPanelSortToggle($event)\"\r\n (filterOpen)=\"openPivotHeaderFilter($event)\" />\r\n }\r\n }\r\n <div class=\"nxe-pivotgrid-scroll\" (scroll)=\"onPivotScroll($event)\">\r\n <table\r\n class=\"nxe-pivotgrid-table\"\r\n role=\"grid\"\r\n [class.nxe-pivotgrid-bordered]=\"showBordersEff()\"\r\n [class.dx-word-wrap]=\"wordWrapEnabledEff()\"\r\n [class.nxe-pivot-layout-tree]=\"m.rowHeaderLayout === 'tree'\">\r\n <colgroup>\r\n @for (w of m.colWidths; track $index) {\r\n <col [style.width.px]=\"w\" />\r\n }\r\n </colgroup>\r\n <thead>\r\n @for (hr of m.columnHeaderRows; track $index; let first = $first) {\r\n <tr role=\"row\">\r\n @if (first) {\r\n <!-- Corner: with the field panel VISIBLE dx hosts the ROW-field chips here and\r\n renders NO caption text (oracle \u00A7c \"hosts the ROW field chips\";\r\n views/0/initial-full-page.png). The caption is the panel-hidden rendering\r\n only (accepted deviation \u2014 dx shows an empty corner then). -->\r\n <th\r\n class=\"nxe-pivot-corner dx-area-description-cell\"\r\n role=\"columnheader\"\r\n [class.nxe-pivot-corner-fields]=\"panelVisible()\"\r\n [attr.rowspan]=\"m.columnHeaderRows.length\"\r\n [attr.colspan]=\"m.rowHeaderColCount > 1 ? m.rowHeaderColCount : null\">@if (chooserInCorner()) {<ng-container *ngTemplateOutlet=\"chooserToolbarTpl\" />}@if (panelVisible()) {<ng-container *ngTemplateOutlet=\"panelRowAreaTpl()\" />} @else {{{ m.cornerText }}}</th>\r\n }\r\n @for (cell of hr; track $index) {\r\n <th\r\n class=\"nxe-pivot-col-header\"\r\n role=\"columnheader\"\r\n [class.nxe-pivot-grandtotal]=\"cell.isGrandTotal\"\r\n [class.nxe-pivot-total]=\"cell.isTotal\"\r\n [class.dx-row-total]=\"cell.isGrandTotal || cell.isTotal\"\r\n [class.dx-grandtotal]=\"cell.isGrandTotal\"\r\n [class.dx-total]=\"cell.isTotal\"\r\n [class.dx-pivotgrid-expanded]=\"cell.expandable && cell.expanded\"\r\n [class.dx-pivotgrid-collapsed]=\"cell.expandable && !cell.expanded\"\r\n [attr.colspan]=\"cell.colspan\"\r\n [attr.rowspan]=\"cell.rowspan && cell.rowspan > 1 ? cell.rowspan : null\"\r\n [attr.tabindex]=\"cell.expandable ? 0 : null\"\r\n [attr.aria-expanded]=\"cell.expandable ? cell.expanded === true : null\"\r\n (click)=\"onColHeaderCellClick($event, cell)\"\r\n (keydown.enter)=\"cell.expandable && onExpandKey($event, cell.pathKey ?? '', cell.expanded === true)\"\r\n (keydown.space)=\"cell.expandable && onExpandKey($event, cell.pathKey ?? '', cell.expanded === true)\">\r\n @if (cell.expandable) {\r\n <span\r\n class=\"nxe-pivot-expand dx-expand-icon-container\"\r\n [class.nxe-pivot-expanded]=\"cell.expanded\"\r\n (click)=\"onColExpandClick($event, cell)\"><span class=\"dx-expand\">{{ cell.expanded ? '\u2212' : '+' }}</span></span>\r\n }<span class=\"nxe-pivot-col-label\">{{ cell.text }}</span></th>\r\n }\r\n </tr>\r\n }\r\n </thead>\r\n <tbody>\r\n <!-- W4 Lane 3: `viewRows()` is the rendered row window ({row, ri} with ri = MODEL row\r\n index \u2014 matrix addressing must not shift). All rows unless nxe-scrolling\r\n mode=\"virtual\" arms tree-scoped windowing; the spacer rows stand in for the\r\n unrendered rows so the scrollbar geometry stays true. -->\r\n @if (topSpacerH() > 0) {\r\n <tr class=\"nxe-pivot-vspacer\" aria-hidden=\"true\"><td [attr.colspan]=\"totalColCount()\" [style.height.px]=\"topSpacerH()\"></td></tr>\r\n }\r\n @for (entry of viewRows(); track entry.row.trackKey ?? entry.row.pathKey) {\r\n @let row = entry.row;\r\n @let ri = entry.ri;\r\n <tr class=\"nxe-pivot-row\" role=\"row\" [class.nxe-pivot-total-row]=\"row.kind === 'T'\">\r\n @if (m.rowHeaderLayout === 'tree') {\r\n @if (row.measureRowspan !== 0) {\r\n <th\r\n class=\"nxe-pivot-row-header\"\r\n role=\"rowheader\"\r\n [attr.rowspan]=\"row.measureRowspan && row.measureRowspan > 1 ? row.measureRowspan : null\"\r\n [style.padding-left.px]=\"10 + row.level * 16\"\r\n [attr.tabindex]=\"row.hasChildren ? 0 : null\"\r\n [attr.aria-expanded]=\"row.hasChildren ? row.expanded : null\"\r\n (click)=\"onRowHeaderCellClick($event, row, null)\"\r\n (keydown.enter)=\"row.hasChildren && onExpandKey($event, row.pathKey, row.expanded)\"\r\n (keydown.space)=\"row.hasChildren && onExpandKey($event, row.pathKey, row.expanded)\">\r\n @if (row.hasChildren) {\r\n <span\r\n class=\"nxe-pivot-expand dx-expand-icon-container\"\r\n [class.nxe-pivot-expanded]=\"row.expanded\"\r\n (click)=\"onRowExpandClick($event, row, null)\"><span class=\"dx-expand\">{{ row.expanded ? '\u2212' : '+' }}</span></span>\r\n }\r\n <span class=\"nxe-pivot-row-label\">{{ row.label }}</span>\r\n </th>\r\n }\r\n @if (row.measureCaption !== undefined) {\r\n <th\r\n class=\"nxe-pivot-row-header nxe-pivot-measure-header\"\r\n role=\"rowheader\"\r\n [class.nxe-pivot-total]=\"row.kind === 'T'\"\r\n [class.dx-row-total]=\"row.kind === 'T'\"\r\n [class.dx-total]=\"row.kind === 'T'\"\r\n (click)=\"onMeasureCellClick($event, row)\">{{ row.measureCaption }}</th>\r\n }\r\n } @else {\r\n @for (hc of row.headerCells; track $index) {\r\n <th\r\n class=\"nxe-pivot-row-header\"\r\n role=\"rowheader\"\r\n [class.nxe-pivot-total]=\"hc.isTotal\"\r\n [class.dx-row-total]=\"hc.isTotal\"\r\n [class.dx-total]=\"hc.isTotal\"\r\n [class.dx-pivotgrid-expanded]=\"hc.expandable && hc.expanded\"\r\n [class.dx-pivotgrid-collapsed]=\"hc.expandable && !hc.expanded\"\r\n [attr.rowspan]=\"hc.rowspan > 1 ? hc.rowspan : null\"\r\n [attr.colspan]=\"hc.colspan > 1 ? hc.colspan : null\"\r\n [attr.tabindex]=\"hc.expandable ? 0 : null\"\r\n [attr.aria-expanded]=\"hc.expandable ? hc.expanded : null\"\r\n (click)=\"onRowHeaderCellClick($event, row, hc)\"\r\n (keydown.enter)=\"hc.expandable && onExpandKey($event, hc.pathKey, hc.expanded)\"\r\n (keydown.space)=\"hc.expandable && onExpandKey($event, hc.pathKey, hc.expanded)\">\r\n @if (hc.expandable) {\r\n <span\r\n class=\"nxe-pivot-expand dx-expand-icon-container\"\r\n [class.nxe-pivot-expanded]=\"hc.expanded\"\r\n (click)=\"onRowExpandClick($event, row, hc)\"><span class=\"dx-expand\">{{ hc.expanded ? '\u2212' : '+' }}</span></span>\r\n }\r\n @if (hc.isTotal) {\r\n {{ hc.text }}\r\n } @else {\r\n <span class=\"nxe-pivot-row-label\">{{ hc.text }}</span>\r\n }\r\n </th>\r\n }\r\n }\r\n @for (leaf of m.leaves; track $index; let li = $index) {\r\n <td\r\n class=\"nxe-pivot-data\"\r\n role=\"gridcell\"\r\n [class.nxe-pivot-total]=\"row.kind === 'T' || leaf.kind === 'T'\"\r\n [class.dx-total]=\"row.kind === 'T' || leaf.kind === 'T'\"\r\n [class.dx-row-total]=\"row.kind === 'T'\"\r\n [class.nxe-pivot-grandtotal]=\"leaf.isGrandTotal\"\r\n [class.dx-grandtotal]=\"leaf.isGrandTotal\"\r\n (click)=\"onDataCellClick($event, ri, li)\">{{ m.textMatrix[ri][li] }}</td>\r\n }\r\n </tr>\r\n }\r\n @if (bottomSpacerH() > 0) {\r\n <tr class=\"nxe-pivot-vspacer\" aria-hidden=\"true\"><td [attr.colspan]=\"totalColCount()\" [style.height.px]=\"bottomSpacerH()\"></td></tr>\r\n }\r\n @if (m.grandTotalRows; as gtr) {\r\n @for (g of gtr; track g.dataIndex; let first = $first) {\r\n <tr class=\"nxe-pivot-row nxe-pivot-grandtotal-row\" role=\"row\">\r\n @if (first) {\r\n <th\r\n class=\"nxe-pivot-row-header nxe-pivot-grandtotal dx-row-total dx-grandtotal\"\r\n role=\"rowheader\"\r\n [attr.rowspan]=\"gtr.length > 1 ? gtr.length : null\"\r\n [attr.colspan]=\"m.rowHeaderColCount - 1 > 1 ? m.rowHeaderColCount - 1 : null\"\r\n (click)=\"onGtHeaderCellClick($event, m.texts.grandTotal)\">{{ m.texts.grandTotal }}</th>\r\n }\r\n <th\r\n class=\"nxe-pivot-row-header nxe-pivot-measure-header nxe-pivot-grandtotal dx-row-total dx-grandtotal\"\r\n role=\"rowheader\"\r\n (click)=\"onGtHeaderCellClick($event, g.caption)\">{{ g.caption }}</th>\r\n @for (gc of g.cells; track $index; let li = $index) {\r\n <td\r\n class=\"nxe-pivot-data nxe-pivot-grandtotal dx-grandtotal dx-row-total\"\r\n role=\"gridcell\"\r\n [class.dx-total]=\"m.leaves[li].kind === 'T'\"\r\n (click)=\"onGtDataCellClick($event, li, g.dataIndex, gc.value, gc.text)\">{{ gc.text }}</td>\r\n }\r\n </tr>\r\n }\r\n } @else if (m.grandTotalCells; as gt) {\r\n <tr class=\"nxe-pivot-row nxe-pivot-grandtotal-row\" role=\"row\">\r\n <th\r\n class=\"nxe-pivot-row-header nxe-pivot-grandtotal dx-row-total dx-grandtotal\"\r\n role=\"rowheader\"\r\n [attr.colspan]=\"m.rowHeaderColCount > 1 ? m.rowHeaderColCount : null\"\r\n (click)=\"onGtHeaderCellClick($event, m.texts.grandTotal)\">{{ m.texts.grandTotal }}</th>\r\n @for (gc of gt; track $index; let li = $index) {\r\n <td\r\n class=\"nxe-pivot-data nxe-pivot-grandtotal dx-grandtotal dx-row-total\"\r\n role=\"gridcell\"\r\n [class.dx-total]=\"m.leaves[li].kind === 'T'\"\r\n (click)=\"onGtDataCellClick($event, li, m.leaves[li].dataIndex, gc.value, gc.text)\">{{ gc.text }}</td>\r\n }\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n <!-- dx `.dx-pivotgrid-nodata` (gridCoreUtils.renderNoDataText): a <span>, shown when the\r\n data source isEmpty(), centered over the widget by the dx.light absolute rule. -->\r\n @if (showNoData()) {\r\n <span class=\"dx-pivotgrid-nodata\">{{ m.texts.noData }}</span>\r\n }\r\n </div>\r\n} @else {\r\n <div class=\"nxe-pivotgrid-empty\"></div>\r\n}\r\n", styles: ["nxe-pivot-grid{display:block;position:relative;color:#333}nxe-pivot-grid .nxe-pivotgrid-scroll{overflow:auto;width:100%;height:100%}nxe-pivot-grid .nxe-pivotgrid-table{border-collapse:collapse;table-layout:auto;background:#fff}nxe-pivot-grid .nxe-pivotgrid-table th,nxe-pivot-grid .nxe-pivotgrid-table td{border:1px solid #ddd;padding:7px 10px;white-space:nowrap;vertical-align:top;font-weight:400}nxe-pivot-grid .nxe-pivot-corner{background-color:#ddd3;color:#333;text-align:left}nxe-pivot-grid .nxe-pivot-corner.nxe-pivot-corner-fields{padding:0;vertical-align:bottom}nxe-pivot-grid .nxe-pivot-corner.nxe-pivot-corner-fields .dx-pivotgrid-fields-area{position:relative}nxe-pivot-grid .nxe-pivot-col-header{color:#959595;text-align:center}nxe-pivot-grid .nxe-pivot-row-header{color:#959595;text-align:left}nxe-pivot-grid .dx-word-wrap .nxe-pivot-col-header,nxe-pivot-grid .dx-word-wrap .nxe-pivot-row-header{white-space:normal}nxe-pivot-grid .dx-word-wrap .dx-pivotgrid-expanded,nxe-pivot-grid .dx-word-wrap .dx-pivotgrid-collapsed{white-space:nowrap}nxe-pivot-grid .dx-word-wrap .dx-pivotgrid-expanded .nxe-pivot-row-label,nxe-pivot-grid .dx-word-wrap .dx-pivotgrid-expanded .nxe-pivot-col-label,nxe-pivot-grid .dx-word-wrap .dx-pivotgrid-collapsed .nxe-pivot-row-label,nxe-pivot-grid .dx-word-wrap .dx-pivotgrid-collapsed .nxe-pivot-col-label{white-space:normal;display:inline-flex}nxe-pivot-grid .nxe-pivot-layout-tree .nxe-pivot-corner{position:sticky;left:0;z-index:2;background-color:#f8f8f8}nxe-pivot-grid .nxe-pivot-layout-tree .nxe-pivot-row-header{position:sticky;left:0;z-index:1;background-color:#fff}nxe-pivot-grid .nxe-pivot-expand{display:inline-block;width:14px;height:14px;line-height:12px;text-align:center;margin-right:6px;border:1px solid #b3b3b3;border-radius:2px;font-size:11px;cursor:pointer;-webkit-user-select:none;user-select:none;color:#959595;background:#fff}nxe-pivot-grid .nxe-pivot-expand:hover{border-color:#5c94c5;color:#5c94c5}nxe-pivot-grid .nxe-pivot-data{text-align:right;color:#333}nxe-pivot-grid .nxe-pivot-total{background-color:#ddd3}nxe-pivot-grid .nxe-pivot-grandtotal{background-color:#f5f5f5!important}nxe-pivot-grid .nxe-pivotgrid-bordered{border:1px solid #ddd}nxe-pivot-grid .nxe-pivotgrid-empty{min-height:1px}nxe-pivot-grid .nxe-pivot-vspacer td{padding:0;border-left:0;border-right:0}nxe-pivot-grid .nxe-pivotgrid-table th[tabindex]:focus-visible{outline:1px dotted rgb(149,149,149);outline-offset:-2px}nxe-pivot-grid .dx-pivotgrid-nodata{position:absolute;top:50%;left:50%;width:100%;text-align:center;transform:translate(-50%,-50%)}.grid-fit-h>nxe-pivot-grid{position:absolute;height:100%;width:100%}\n"] }]
4585
+ // panel renders — or while the corner hosts the field-chooser toolbar — so the chip
4586
+ // and area-head chrome (the library's own, nxe-pivot-field-chip + this component's
4587
+ // scss; an app's dx-prefixed copies under the class mirror) reach the panel bands AND
4588
+ // the corner-hosted row area without touching the panel-less cross-tab chrome.
4589
+ '[class.nxe-pivotgrid]': 'panelVisible() || chooserInCorner()',
4590
+ '[class.nxe-pivotgrid-fields-container]': 'panelVisible() || chooserInCorner()',
4591
+ }, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "<!-- P3-C3: the dx `.dx-pivotgrid-toolbar` with the field-chooser button (m_widget.js\r\n `_renderDescriptionArea` + dx.light float:right chrome). Placement per dx's branch order:\r\n the panel's filter-header band when it shows, else the panel's column-header band when\r\n the data/column band row shows, else the cross-tab corner cell, where the button stays\r\n transparent until hover. Renders only when the projected nxe-field-chooser config is\r\n enabled. The button chrome is the library's own (nxe-pivot-grid.component.scss). -->\r\n<ng-template #chooserToolbarTpl>\r\n <div class=\"nxe-pivotgrid-toolbar\">\r\n <div\r\n class=\"nxe-pivotgrid-field-chooser-button nxe-pivot-field-chooser-button nxe-widget nxe-button nxe-button-mode-contained nxe-button-normal nxe-button-has-icon\"\r\n role=\"button\"\r\n tabindex=\"0\"\r\n [attr.title]=\"messages.t('pivot.showFieldChooser')\"\r\n [attr.aria-label]=\"messages.t('pivot.showFieldChooser')\"\r\n (click)=\"toggleFieldChooser()\"\r\n (keydown.enter)=\"toggleFieldChooser()\">\r\n <!-- dx's 18px `.dx-icon-columnchooser` glyph, redrawn from rectangles (the DXIcons font is\r\n not used): a window with a 2px frame (12 x 12) behind a solid 8 x 11 list panel with\r\n three 4 x 1 slots, unioned into one even-odd path so the slots stay open where the\r\n panel covers the frame. The span keeps the class the specs query but not `nxe-icon`,\r\n whose mask layer would hide an inline SVG. -->\r\n <div class=\"nxe-button-content\"><span class=\"nxe-icon-columnchooser nxe-pivot-chooser-icon\" aria-hidden=\"true\"><svg viewBox=\"0 0 18 18\" width=\"18\" height=\"18\" focusable=\"false\"><path fill=\"currentColor\" fill-rule=\"evenodd\" d=\"M1 2h12v4h4v11H9v-3H1zM3 4v8h6V6h2V4zM11 8v1h4V8zM11 11v1h4v-1zM11 14v1h4v-1z\" /></svg></span></div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n@if (model(); as m) {\r\n <!-- P3-C2: the dx field panel (dxo-field-panel). dx default visible=false \u2014 nothing renders\r\n unless the projected nxe-field-panel opts in (the calc tabs project none). `undefined`\r\n bound into a flag (report-output-pivot binds panelConfig()?.\u2026) falls back to the dx\r\n default: hidden for `visible`, shown for the five area/drag flags. The ROW area is not\r\n in this block \u2014 the panel exposes it as a template and the corner cell below hosts it\r\n (dx: the corner .dx-area-description-cell holds the row chips). -->\r\n @if (fieldPanel(); as fp) {\r\n @if (fp.visible()) {\r\n <nxe-pivot-field-panel\r\n [engine]=\"engine()\"\r\n [showFilterFields]=\"fp.showFilterFields() !== false\"\r\n [showDataFields]=\"fp.showDataFields() !== false\"\r\n [showColumnFields]=\"fp.showColumnFields() !== false\"\r\n [showRowFields]=\"fp.showRowFields() !== false\"\r\n [allowFieldDragging]=\"fp.allowFieldDragging() !== false\"\r\n [allowSorting]=\"allowSortingEff()\"\r\n [allowFiltering]=\"allowFilteringEff()\"\r\n [showBorders]=\"showBordersEff()\"\r\n [toolbarTemplate]=\"chooserToolbarTpl\"\r\n [toolbarArea]=\"panelToolbarArea()\"\r\n (fieldMove)=\"onPanelFieldMove($event)\"\r\n (sortToggle)=\"onPanelSortToggle($event)\"\r\n (filterOpen)=\"openPivotHeaderFilter($event)\" />\r\n }\r\n }\r\n <div class=\"nxe-pivotgrid-scroll\" (scroll)=\"onPivotScroll($event)\">\r\n <table\r\n class=\"nxe-pivotgrid-table\"\r\n role=\"grid\"\r\n [class.nxe-pivotgrid-bordered]=\"showBordersEff()\"\r\n [class.nxe-word-wrap]=\"wordWrapEnabledEff()\"\r\n [class.nxe-pivot-layout-tree]=\"m.rowHeaderLayout === 'tree'\">\r\n <colgroup>\r\n @for (w of m.colWidths; track $index) {\r\n <col [style.width.px]=\"w\" />\r\n }\r\n </colgroup>\r\n <thead>\r\n @for (hr of m.columnHeaderRows; track $index; let first = $first) {\r\n <tr role=\"row\">\r\n @if (first) {\r\n <!-- Corner: with the field panel VISIBLE dx hosts the ROW-field chips here and\r\n renders NO caption text (oracle \u00A7c \"hosts the ROW field chips\";\r\n views/0/initial-full-page.png). The caption is the panel-hidden rendering\r\n only (accepted deviation \u2014 dx shows an empty corner then). When the\r\n field-chooser toolbar lives here the corner is dx's exactly: the button at\r\n its top-left (0 cell padding + the button's 1px margin) and no caption,\r\n which the button would otherwise sit on top of. -->\r\n <th\r\n class=\"nxe-pivot-corner nxe-area-description-cell\"\r\n role=\"columnheader\"\r\n [class.nxe-pivot-corner-fields]=\"panelVisible()\"\r\n [class.nxe-pivot-corner-toolbar]=\"chooserInCorner()\"\r\n [attr.rowspan]=\"m.columnHeaderRows.length\"\r\n [attr.colspan]=\"m.rowHeaderColCount > 1 ? m.rowHeaderColCount : null\">@if (chooserInCorner()) {<ng-container *ngTemplateOutlet=\"chooserToolbarTpl\" />}@if (panelVisible()) {<ng-container *ngTemplateOutlet=\"panelRowAreaTpl()\" />} @else if (!chooserInCorner()) {{{ m.cornerText }}}</th>\r\n }\r\n @for (cell of hr; track $index) {\r\n <th\r\n class=\"nxe-pivot-col-header\"\r\n role=\"columnheader\"\r\n [class.nxe-pivot-grandtotal]=\"cell.isGrandTotal\"\r\n [class.nxe-pivot-total]=\"cell.isTotal\"\r\n [class.nxe-row-total]=\"cell.isGrandTotal || cell.isTotal\"\r\n [class.nxe-grandtotal]=\"cell.isGrandTotal\"\r\n [class.nxe-total]=\"cell.isTotal\"\r\n [class.nxe-pivotgrid-expanded]=\"cell.expandable && cell.expanded\"\r\n [class.nxe-pivotgrid-collapsed]=\"cell.expandable && !cell.expanded\"\r\n [attr.colspan]=\"cell.colspan\"\r\n [attr.rowspan]=\"cell.rowspan && cell.rowspan > 1 ? cell.rowspan : null\"\r\n [attr.tabindex]=\"cell.expandable ? 0 : null\"\r\n [attr.aria-expanded]=\"cell.expandable ? cell.expanded === true : null\"\r\n (click)=\"onColHeaderCellClick($event, cell)\"\r\n (keydown.enter)=\"cell.expandable && onExpandKey($event, cell.pathKey ?? '', cell.expanded === true)\"\r\n (keydown.space)=\"cell.expandable && onExpandKey($event, cell.pathKey ?? '', cell.expanded === true)\">\r\n @if (cell.expandable) {\r\n <span\r\n class=\"nxe-pivot-expand nxe-expand-icon-container\"\r\n [class.nxe-pivot-expanded]=\"cell.expanded\"\r\n (click)=\"onColExpandClick($event, cell)\"><span class=\"nxe-expand\" aria-hidden=\"true\"></span></span>\r\n }<span class=\"nxe-pivot-col-label\">{{ cell.text }}</span></th>\r\n }\r\n </tr>\r\n }\r\n </thead>\r\n <tbody>\r\n <!-- W4 Lane 3: `viewRows()` is the rendered row window ({row, ri} with ri = MODEL row\r\n index \u2014 matrix addressing must not shift). All rows unless nxe-scrolling\r\n mode=\"virtual\" arms tree-scoped windowing; the spacer rows stand in for the\r\n unrendered rows so the scrollbar geometry stays true. -->\r\n @if (topSpacerH() > 0) {\r\n <tr class=\"nxe-pivot-vspacer\" aria-hidden=\"true\"><td [attr.colspan]=\"totalColCount()\" [style.height.px]=\"topSpacerH()\"></td></tr>\r\n }\r\n @for (entry of viewRows(); track entry.row.trackKey ?? entry.row.pathKey) {\r\n @let row = entry.row;\r\n @let ri = entry.ri;\r\n <tr class=\"nxe-pivot-row\" role=\"row\" [class.nxe-pivot-total-row]=\"row.kind === 'T'\">\r\n @if (m.rowHeaderLayout === 'tree') {\r\n @if (row.measureRowspan !== 0) {\r\n <th\r\n class=\"nxe-pivot-row-header\"\r\n role=\"rowheader\"\r\n [attr.rowspan]=\"row.measureRowspan && row.measureRowspan > 1 ? row.measureRowspan : null\"\r\n [style.padding-left.px]=\"10 + row.level * 16\"\r\n [attr.tabindex]=\"row.hasChildren ? 0 : null\"\r\n [attr.aria-expanded]=\"row.hasChildren ? row.expanded : null\"\r\n (click)=\"onRowHeaderCellClick($event, row, null)\"\r\n (keydown.enter)=\"row.hasChildren && onExpandKey($event, row.pathKey, row.expanded)\"\r\n (keydown.space)=\"row.hasChildren && onExpandKey($event, row.pathKey, row.expanded)\">\r\n @if (row.hasChildren) {\r\n <span\r\n class=\"nxe-pivot-expand nxe-expand-icon-container\"\r\n [class.nxe-pivot-expanded]=\"row.expanded\"\r\n (click)=\"onRowExpandClick($event, row, null)\"><span class=\"nxe-expand\" aria-hidden=\"true\"></span></span>\r\n }\r\n <span class=\"nxe-pivot-row-label\">{{ row.label }}</span>\r\n </th>\r\n }\r\n @if (row.measureCaption !== undefined) {\r\n <th\r\n class=\"nxe-pivot-row-header nxe-pivot-measure-header\"\r\n role=\"rowheader\"\r\n [class.nxe-pivot-total]=\"row.kind === 'T'\"\r\n [class.nxe-row-total]=\"row.kind === 'T'\"\r\n [class.nxe-total]=\"row.kind === 'T'\"\r\n (click)=\"onMeasureCellClick($event, row)\">{{ row.measureCaption }}</th>\r\n }\r\n } @else {\r\n @for (hc of row.headerCells; track $index) {\r\n <th\r\n class=\"nxe-pivot-row-header\"\r\n role=\"rowheader\"\r\n [class.nxe-pivot-total]=\"hc.isTotal\"\r\n [class.nxe-row-total]=\"hc.isTotal\"\r\n [class.nxe-total]=\"hc.isTotal\"\r\n [class.nxe-pivotgrid-expanded]=\"hc.expandable && hc.expanded\"\r\n [class.nxe-pivotgrid-collapsed]=\"hc.expandable && !hc.expanded\"\r\n [attr.rowspan]=\"hc.rowspan > 1 ? hc.rowspan : null\"\r\n [attr.colspan]=\"hc.colspan > 1 ? hc.colspan : null\"\r\n [attr.tabindex]=\"hc.expandable ? 0 : null\"\r\n [attr.aria-expanded]=\"hc.expandable ? hc.expanded : null\"\r\n (click)=\"onRowHeaderCellClick($event, row, hc)\"\r\n (keydown.enter)=\"hc.expandable && onExpandKey($event, hc.pathKey, hc.expanded)\"\r\n (keydown.space)=\"hc.expandable && onExpandKey($event, hc.pathKey, hc.expanded)\">\r\n @if (hc.expandable) {\r\n <span\r\n class=\"nxe-pivot-expand nxe-expand-icon-container\"\r\n [class.nxe-pivot-expanded]=\"hc.expanded\"\r\n (click)=\"onRowExpandClick($event, row, hc)\"><span class=\"nxe-expand\" aria-hidden=\"true\"></span></span>\r\n }\r\n @if (hc.isTotal) {\r\n {{ hc.text }}\r\n } @else {\r\n <span class=\"nxe-pivot-row-label\">{{ hc.text }}</span>\r\n }\r\n </th>\r\n }\r\n }\r\n @for (leaf of m.leaves; track $index; let li = $index) {\r\n <td\r\n class=\"nxe-pivot-data\"\r\n role=\"gridcell\"\r\n [class.nxe-pivot-total]=\"row.kind === 'T' || leaf.kind === 'T'\"\r\n [class.nxe-total]=\"row.kind === 'T' || leaf.kind === 'T'\"\r\n [class.nxe-row-total]=\"row.kind === 'T'\"\r\n [class.nxe-pivot-grandtotal]=\"leaf.isGrandTotal\"\r\n [class.nxe-grandtotal]=\"leaf.isGrandTotal\"\r\n (click)=\"onDataCellClick($event, ri, li)\">{{ m.textMatrix[ri][li] }}</td>\r\n }\r\n </tr>\r\n }\r\n @if (bottomSpacerH() > 0) {\r\n <tr class=\"nxe-pivot-vspacer\" aria-hidden=\"true\"><td [attr.colspan]=\"totalColCount()\" [style.height.px]=\"bottomSpacerH()\"></td></tr>\r\n }\r\n @if (m.grandTotalRows; as gtr) {\r\n @for (g of gtr; track g.dataIndex; let first = $first) {\r\n <tr class=\"nxe-pivot-row nxe-pivot-grandtotal-row\" role=\"row\">\r\n @if (first) {\r\n <th\r\n class=\"nxe-pivot-row-header nxe-pivot-grandtotal nxe-row-total nxe-grandtotal\"\r\n role=\"rowheader\"\r\n [attr.rowspan]=\"gtr.length > 1 ? gtr.length : null\"\r\n [attr.colspan]=\"m.rowHeaderColCount - 1 > 1 ? m.rowHeaderColCount - 1 : null\"\r\n (click)=\"onGtHeaderCellClick($event, m.texts.grandTotal)\">{{ m.texts.grandTotal }}</th>\r\n }\r\n <th\r\n class=\"nxe-pivot-row-header nxe-pivot-measure-header nxe-pivot-grandtotal nxe-row-total nxe-grandtotal\"\r\n role=\"rowheader\"\r\n (click)=\"onGtHeaderCellClick($event, g.caption)\">{{ g.caption }}</th>\r\n @for (gc of g.cells; track $index; let li = $index) {\r\n <td\r\n class=\"nxe-pivot-data nxe-pivot-grandtotal nxe-grandtotal nxe-row-total\"\r\n role=\"gridcell\"\r\n [class.nxe-total]=\"m.leaves[li].kind === 'T'\"\r\n (click)=\"onGtDataCellClick($event, li, g.dataIndex, gc.value, gc.text)\">{{ gc.text }}</td>\r\n }\r\n </tr>\r\n }\r\n } @else if (m.grandTotalCells; as gt) {\r\n <tr class=\"nxe-pivot-row nxe-pivot-grandtotal-row\" role=\"row\">\r\n <th\r\n class=\"nxe-pivot-row-header nxe-pivot-grandtotal nxe-row-total nxe-grandtotal\"\r\n role=\"rowheader\"\r\n [attr.colspan]=\"m.rowHeaderColCount > 1 ? m.rowHeaderColCount : null\"\r\n (click)=\"onGtHeaderCellClick($event, m.texts.grandTotal)\">{{ m.texts.grandTotal }}</th>\r\n @for (gc of gt; track $index; let li = $index) {\r\n <td\r\n class=\"nxe-pivot-data nxe-pivot-grandtotal nxe-grandtotal nxe-row-total\"\r\n role=\"gridcell\"\r\n [class.nxe-total]=\"m.leaves[li].kind === 'T'\"\r\n (click)=\"onGtDataCellClick($event, li, m.leaves[li].dataIndex, gc.value, gc.text)\">{{ gc.text }}</td>\r\n }\r\n </tr>\r\n }\r\n </tbody>\r\n </table>\r\n <!-- dx `.dx-pivotgrid-nodata` (gridCoreUtils.renderNoDataText): a <span>, shown when the\r\n data source isEmpty(), centered over the widget by the dx.light absolute rule. -->\r\n @if (showNoData()) {\r\n <span class=\"nxe-pivotgrid-nodata\">{{ m.texts.noData }}</span>\r\n }\r\n </div>\r\n} @else {\r\n <div class=\"nxe-pivotgrid-empty\"></div>\r\n}\r\n", styles: ["nxe-pivot-grid{display:block;position:relative;color:#333}nxe-pivot-grid .nxe-pivotgrid-scroll{overflow:auto;width:100%;height:100%}nxe-pivot-grid .nxe-pivotgrid-table{border-collapse:collapse;table-layout:auto;background:#fff}nxe-pivot-grid .nxe-pivotgrid-table th,nxe-pivot-grid .nxe-pivotgrid-table td{border:1px solid #ddd;padding:7px 10px;white-space:nowrap;vertical-align:top;font-weight:400}nxe-pivot-grid .nxe-pivot-corner{background-color:#ddd3;color:#333;text-align:left}nxe-pivot-grid .nxe-pivot-corner.nxe-pivot-corner-fields{padding:0;vertical-align:bottom}nxe-pivot-grid .nxe-pivot-corner.nxe-pivot-corner-fields .nxe-pivotgrid-fields-area{position:relative}nxe-pivot-grid.nxe-pivotgrid .nxe-pivotgrid-fields-area-head td{position:relative;border:none;padding:10px 2px}nxe-pivot-grid.nxe-pivotgrid .nxe-pivotgrid-fields-area-head tr>td:first-child{padding-left:10px}nxe-pivot-grid.nxe-pivotgrid .nxe-pivotgrid-fields-area-head tr>td:last-child{padding-right:10px}nxe-pivot-grid.nxe-pivotgrid .nxe-column-header .nxe-pivotgrid-fields-area-head tr>td:first-child{padding-left:0}nxe-pivot-grid.nxe-pivotgrid .nxe-filter-header .nxe-area-field-container{border-spacing:8px 8px;border-collapse:separate}nxe-pivot-grid.nxe-pivotgrid .nxe-filter-header .nxe-pivotgrid-fields-area-head td{padding:2px}nxe-pivot-grid.nxe-pivotgrid .nxe-filter-header .nxe-pivotgrid-fields-area-head tr>td:first-child{padding-left:2px}nxe-pivot-grid.nxe-pivotgrid .nxe-pivotgrid-fields-area-head .nxe-empty-area-text{padding:7px 0;border:1px solid transparent;color:#525252;white-space:nowrap}nxe-pivot-grid.nxe-pivotgrid .nxe-column-header .nxe-pivotgrid-fields-area,nxe-pivot-grid.nxe-pivotgrid .nxe-filter-header .nxe-pivotgrid-fields-area{overflow:hidden}nxe-pivot-grid .nxe-pivot-corner.nxe-pivot-corner-toolbar{padding:0}nxe-pivot-grid .nxe-pivot-corner.nxe-pivot-corner-toolbar:not(.nxe-pivot-corner-fields){vertical-align:top}nxe-pivot-grid .nxe-pivot-col-header{color:#959595;text-align:center}nxe-pivot-grid .nxe-pivot-col-header.nxe-pivotgrid-expanded,nxe-pivot-grid .nxe-pivot-col-header.nxe-pivotgrid-collapsed{text-align:left}nxe-pivot-grid .nxe-pivotgrid-expanded,nxe-pivot-grid .nxe-pivotgrid-collapsed{cursor:pointer}nxe-pivot-grid .nxe-pivot-row-header{color:#959595;text-align:left}nxe-pivot-grid .nxe-word-wrap .nxe-pivot-col-header,nxe-pivot-grid .nxe-word-wrap .nxe-pivot-row-header{white-space:normal}nxe-pivot-grid .nxe-word-wrap .nxe-pivotgrid-expanded,nxe-pivot-grid .nxe-word-wrap .nxe-pivotgrid-collapsed{white-space:nowrap}nxe-pivot-grid .nxe-word-wrap .nxe-pivotgrid-expanded .nxe-pivot-row-label,nxe-pivot-grid .nxe-word-wrap .nxe-pivotgrid-expanded .nxe-pivot-col-label,nxe-pivot-grid .nxe-word-wrap .nxe-pivotgrid-collapsed .nxe-pivot-row-label,nxe-pivot-grid .nxe-word-wrap .nxe-pivotgrid-collapsed .nxe-pivot-col-label{white-space:normal;display:inline-flex}nxe-pivot-grid .nxe-pivot-layout-tree .nxe-pivot-corner{position:sticky;left:0;z-index:2;background-color:#f8f8f8}nxe-pivot-grid .nxe-pivot-layout-tree .nxe-pivot-row-header{position:sticky;left:0;z-index:1;background-color:#fff}nxe-pivot-grid .nxe-pivot-expand{position:relative;display:inline-block;box-sizing:border-box;width:14px;height:14px;margin:0;margin-inline:-5px 0;padding:0;border:0;background:none;vertical-align:top;cursor:pointer;-webkit-user-select:none;user-select:none;color:#959595}nxe-pivot-grid .nxe-pivot-expand .nxe-expand{display:inline-block;vertical-align:top}nxe-pivot-grid .nxe-pivot-expand .nxe-expand:before{content:\"\";position:absolute;left:50%;top:50%;box-sizing:content-box;width:0;height:0;margin:-4px 0 0 -2px;border-style:solid;border-width:4px 0 4px 4px;border-color:transparent transparent transparent currentColor}nxe-pivot-grid .nxe-pivot-expand.nxe-pivot-expanded .nxe-expand:before{margin:-2px 0 0 -4px;border-width:4px 4px 0;border-color:currentColor transparent transparent}nxe-pivot-grid .nxe-pivotgrid-field-chooser-button{display:inline-flex;box-sizing:border-box;max-width:100%;overflow:hidden;margin:0;border:1px solid var(--nxe-ui-border, #ddd);border-radius:var(--nxe-ui-radius, 4px);background-color:var(--nxe-ui-surface, #fff);color:var(--nxe-ui-text, #333);text-align:center;vertical-align:middle;cursor:pointer;-webkit-user-select:none;user-select:none;outline:0}nxe-pivot-grid .nxe-pivotgrid-field-chooser-button .nxe-button-content{display:flex;flex:1 1 auto;align-items:center;justify-content:center;box-sizing:border-box;height:100%;padding:5px;line-height:var(--nxe-ui-line-height, 1.35715)}nxe-pivot-grid .nxe-pivotgrid-field-chooser-button:hover{background-color:#f5f5f5}nxe-pivot-grid .nxe-pivotgrid-field-chooser-button:focus-visible{background-color:#ebebeb}nxe-pivot-grid .nxe-pivotgrid-field-chooser-button:active{background-color:#c2c2c2}nxe-pivot-grid .nxe-pivotgrid-toolbar .nxe-icon-columnchooser{display:flex;flex:0 0 auto;width:18px;height:18px}nxe-pivot-grid .nxe-pivotgrid-toolbar .nxe-icon-columnchooser>svg{display:block;width:18px;height:18px}nxe-pivot-grid .nxe-pivotgrid-toolbar .nxe-icon-columnchooser:before,nxe-pivot-grid .nxe-pivotgrid-toolbar .nxe-icon-columnchooser:after{content:none}nxe-pivot-grid .nxe-filter-header .nxe-pivotgrid-toolbar,nxe-pivot-grid .nxe-column-header .nxe-pivotgrid-toolbar{display:inline-block;float:right;margin-right:10px}nxe-pivot-grid .nxe-filter-header .nxe-pivotgrid-toolbar .nxe-pivotgrid-field-chooser-button,nxe-pivot-grid .nxe-column-header .nxe-pivotgrid-toolbar .nxe-pivotgrid-field-chooser-button{margin-top:12px;margin-right:4px}nxe-pivot-grid .nxe-area-description-cell .nxe-pivotgrid-toolbar{display:block;float:none;margin:0}nxe-pivot-grid .nxe-area-description-cell .nxe-pivotgrid-toolbar .nxe-pivotgrid-field-chooser-button{margin:1px}nxe-pivot-grid .nxe-area-description-cell .nxe-pivotgrid-toolbar .nxe-pivotgrid-field-chooser-button:not(:hover):not(:active){border-color:transparent;background-color:transparent;box-shadow:none}nxe-pivot-grid .nxe-pivot-data{text-align:right;color:#333}nxe-pivot-grid .nxe-pivot-total{background-color:#ddd3}nxe-pivot-grid .nxe-pivot-grandtotal{background-color:#f5f5f5!important}nxe-pivot-grid .nxe-pivotgrid-bordered{border:1px solid #ddd}nxe-pivot-grid .nxe-pivotgrid-empty{min-height:1px}nxe-pivot-grid .nxe-pivot-vspacer td{padding:0;border-left:0;border-right:0}nxe-pivot-grid .nxe-pivotgrid-table th[tabindex]:focus-visible{outline:1px dotted rgb(149,149,149);outline-offset:-2px}nxe-pivot-grid .nxe-pivotgrid-nodata{position:absolute;top:50%;left:50%;width:100%;text-align:center;transform:translate(-50%,-50%)}.grid-fit-h>nxe-pivot-grid{position:absolute;height:100%;width:100%}\n"] }]
4537
4592
  }], ctorParameters: () => [], propDecorators: { dataSource: [{ type: i0.Input, args: [{ isSignal: true, alias: "dataSource", required: false }] }], allowFiltering: [{ type: i0.Input, args: [{ isSignal: true, alias: "allowFiltering", required: false }] }], allowSortingBySummary: [{ type: i0.Input, args: [{ isSignal: true, alias: "allowSortingBySummary", required: false }] }], allowExpandAll: [{ type: i0.Input, args: [{ isSignal: true, alias: "allowExpandAll", required: false }] }], showBorders: [{ type: i0.Input, args: [{ isSignal: true, alias: "showBorders", required: false }] }], wordWrapEnabled: [{ type: i0.Input, args: [{ isSignal: true, alias: "wordWrapEnabled", required: false }] }], rowHeaderLayout: [{ type: i0.Input, args: [{ isSignal: true, alias: "rowHeaderLayout", required: false }] }], height: [{ type: i0.Input, args: [{ isSignal: true, alias: "height", required: false }] }], texts: [{ type: i0.Input, args: [{ isSignal: true, alias: "texts", required: false }] }], showColumnTotals: [{ type: i0.Input, args: [{ isSignal: true, alias: "showColumnTotals", required: false }] }], showRowTotals: [{ type: i0.Input, args: [{ isSignal: true, alias: "showRowTotals", required: false }] }], showColumnGrandTotals: [{ type: i0.Input, args: [{ isSignal: true, alias: "showColumnGrandTotals", required: false }] }], showRowGrandTotals: [{ type: i0.Input, args: [{ isSignal: true, alias: "showRowGrandTotals", required: false }] }], showTotalsPrior: [{ type: i0.Input, args: [{ isSignal: true, alias: "showTotalsPrior", required: false }] }], dataFieldArea: [{ type: i0.Input, args: [{ isSignal: true, alias: "dataFieldArea", required: false }] }], allowSorting: [{ type: i0.Input, args: [{ isSignal: true, alias: "allowSorting", required: false }] }], onCellClick: [{
4538
4593
  type: Output
4539
4594
  }], onCellPrepared: [{
@@ -4722,11 +4777,11 @@ class NxeChartComponent {
4722
4777
  return this.facade;
4723
4778
  }
4724
4779
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: NxeChartComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
4725
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.5", type: NxeChartComponent, isStandalone: true, selector: "nxe-chart", inputs: { dataSource: { classPropertyName: "dataSource", publicName: "dataSource", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "nxe-widget nxe-chart" }, queries: [{ propertyName: "commonSeries", first: true, predicate: NxeCommonSeriesSettingsComponent, descendants: true, isSignal: true }, { propertyName: "size", first: true, predicate: NxeSizeComponent, descendants: true, isSignal: true }, { propertyName: "adaptiveLayout", first: true, predicate: NxeAdaptiveLayoutComponent, descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"nxe-chart-host\" [style.height.px]=\"chartHeight()\">\r\n @if (hasData()) {\r\n <div class=\"nxe-chart-plot\">\r\n <svg\r\n [attr.width]=\"chartWidth()\"\r\n [attr.height]=\"chartHeight()\"\r\n [attr.viewBox]=\"'0 0 ' + chartWidth() + ' ' + chartHeight()\"\r\n class=\"nxe-chart-svg\">\r\n <!-- baseline -->\r\n <line\r\n [attr.x1]=\"axisLeft()\"\r\n [attr.x2]=\"axisRight()\"\r\n [attr.y1]=\"baselineY()\"\r\n [attr.y2]=\"baselineY()\"\r\n class=\"nxe-chart-axis\" />\r\n @for (b of bars(); track $index) {\r\n <rect [attr.x]=\"b.x\" [attr.y]=\"b.y\" [attr.width]=\"b.w\" [attr.height]=\"b.h\" [attr.fill]=\"b.fill\" />\r\n }\r\n </svg>\r\n </div>\r\n <div class=\"nxe-chart-legend\">\r\n @for (item of legend(); track $index) {\r\n <span class=\"nxe-chart-legend-item\">\r\n <span class=\"nxe-chart-legend-swatch\" [style.background]=\"item.fill\"></span>\r\n {{ item.name }}\r\n </span>\r\n }\r\n </div>\r\n } @else {\r\n <div class=\"nxe-chart-empty\"></div>\r\n }\r\n</div>\r\n", styles: ["nxe-chart{display:block;width:100%}nxe-chart .nxe-chart-host{display:flex;flex-direction:column;width:100%;overflow-x:auto}nxe-chart .nxe-chart-plot{flex:1 1 auto;min-height:0}nxe-chart .nxe-chart-svg{display:block}nxe-chart .nxe-chart-axis{stroke:#d3d3d3;stroke-width:1}nxe-chart .nxe-chart-legend{display:flex;flex-wrap:wrap;gap:4px 16px;padding:6px 8px 0;font-size:12px;color:#333}nxe-chart .nxe-chart-legend-item{display:inline-flex;align-items:center}nxe-chart .nxe-chart-legend-swatch{display:inline-block;width:10px;height:10px;border-radius:2px;margin-right:6px}nxe-chart .nxe-chart-empty{flex:1 1 auto}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
4780
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.1.5", type: NxeChartComponent, isStandalone: true, selector: "nxe-chart", inputs: { dataSource: { classPropertyName: "dataSource", publicName: "dataSource", isSignal: true, isRequired: false, transformFunction: null } }, host: { classAttribute: "nxe-widget nxe-chart" }, queries: [{ propertyName: "commonSeries", first: true, predicate: NxeCommonSeriesSettingsComponent, descendants: true, isSignal: true }, { propertyName: "size", first: true, predicate: NxeSizeComponent, descendants: true, isSignal: true }, { propertyName: "adaptiveLayout", first: true, predicate: NxeAdaptiveLayoutComponent, descendants: true, isSignal: true }], ngImport: i0, template: "<div class=\"nxe-chart-host\" [style.height.px]=\"chartHeight()\">\r\n @if (hasData()) {\r\n <div class=\"nxe-chart-plot\">\r\n <svg\r\n [attr.width]=\"chartWidth()\"\r\n [attr.height]=\"chartHeight()\"\r\n [attr.viewBox]=\"'0 0 ' + chartWidth() + ' ' + chartHeight()\"\r\n class=\"nxe-chart-svg\">\r\n <!-- baseline -->\r\n <line\r\n [attr.x1]=\"axisLeft()\"\r\n [attr.x2]=\"axisRight()\"\r\n [attr.y1]=\"baselineY()\"\r\n [attr.y2]=\"baselineY()\"\r\n class=\"nxe-chart-axis\" />\r\n @for (b of bars(); track $index) {\r\n <rect [attr.x]=\"b.x\" [attr.y]=\"b.y\" [attr.width]=\"b.w\" [attr.height]=\"b.h\" [attr.fill]=\"b.fill\" />\r\n }\r\n </svg>\r\n </div>\r\n <div class=\"nxe-chart-legend\">\r\n @for (item of legend(); track $index) {\r\n <span class=\"nxe-chart-legend-item\">\r\n <span class=\"nxe-chart-legend-swatch\" [style.background]=\"item.fill\"></span>\r\n {{ item.name }}\r\n </span>\r\n }\r\n </div>\r\n } @else {\r\n <div class=\"nxe-chart-empty\"></div>\r\n }\r\n</div>\r\n", styles: ["nxe-chart{display:block;width:100%}nxe-chart .nxe-chart-host{display:flex;flex-direction:column;width:100%;overflow-x:auto}nxe-chart .nxe-chart-plot{flex:1 1 auto;min-height:0}nxe-chart .nxe-chart-svg{display:block}nxe-chart .nxe-chart-axis{stroke:var(--nxe-ui-neutral-240, #d3d3d3);stroke-width:1}nxe-chart .nxe-chart-legend{display:flex;flex-wrap:wrap;gap:4px 16px;padding:6px 8px 0;font-size:12px;color:var(--nxe-ui-text, #333)}nxe-chart .nxe-chart-legend-item{display:inline-flex;align-items:center}nxe-chart .nxe-chart-legend-swatch{display:inline-block;width:10px;height:10px;border-radius:2px;margin-right:6px}nxe-chart .nxe-chart-empty{flex:1 1 auto}\n"], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None });
4726
4781
  }
4727
4782
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: NxeChartComponent, decorators: [{
4728
4783
  type: Component,
4729
- args: [{ selector: 'nxe-chart', standalone: true, host: { class: 'nxe-widget nxe-chart' }, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "<div class=\"nxe-chart-host\" [style.height.px]=\"chartHeight()\">\r\n @if (hasData()) {\r\n <div class=\"nxe-chart-plot\">\r\n <svg\r\n [attr.width]=\"chartWidth()\"\r\n [attr.height]=\"chartHeight()\"\r\n [attr.viewBox]=\"'0 0 ' + chartWidth() + ' ' + chartHeight()\"\r\n class=\"nxe-chart-svg\">\r\n <!-- baseline -->\r\n <line\r\n [attr.x1]=\"axisLeft()\"\r\n [attr.x2]=\"axisRight()\"\r\n [attr.y1]=\"baselineY()\"\r\n [attr.y2]=\"baselineY()\"\r\n class=\"nxe-chart-axis\" />\r\n @for (b of bars(); track $index) {\r\n <rect [attr.x]=\"b.x\" [attr.y]=\"b.y\" [attr.width]=\"b.w\" [attr.height]=\"b.h\" [attr.fill]=\"b.fill\" />\r\n }\r\n </svg>\r\n </div>\r\n <div class=\"nxe-chart-legend\">\r\n @for (item of legend(); track $index) {\r\n <span class=\"nxe-chart-legend-item\">\r\n <span class=\"nxe-chart-legend-swatch\" [style.background]=\"item.fill\"></span>\r\n {{ item.name }}\r\n </span>\r\n }\r\n </div>\r\n } @else {\r\n <div class=\"nxe-chart-empty\"></div>\r\n }\r\n</div>\r\n", styles: ["nxe-chart{display:block;width:100%}nxe-chart .nxe-chart-host{display:flex;flex-direction:column;width:100%;overflow-x:auto}nxe-chart .nxe-chart-plot{flex:1 1 auto;min-height:0}nxe-chart .nxe-chart-svg{display:block}nxe-chart .nxe-chart-axis{stroke:#d3d3d3;stroke-width:1}nxe-chart .nxe-chart-legend{display:flex;flex-wrap:wrap;gap:4px 16px;padding:6px 8px 0;font-size:12px;color:#333}nxe-chart .nxe-chart-legend-item{display:inline-flex;align-items:center}nxe-chart .nxe-chart-legend-swatch{display:inline-block;width:10px;height:10px;border-radius:2px;margin-right:6px}nxe-chart .nxe-chart-empty{flex:1 1 auto}\n"] }]
4784
+ args: [{ selector: 'nxe-chart', standalone: true, host: { class: 'nxe-widget nxe-chart' }, changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, template: "<div class=\"nxe-chart-host\" [style.height.px]=\"chartHeight()\">\r\n @if (hasData()) {\r\n <div class=\"nxe-chart-plot\">\r\n <svg\r\n [attr.width]=\"chartWidth()\"\r\n [attr.height]=\"chartHeight()\"\r\n [attr.viewBox]=\"'0 0 ' + chartWidth() + ' ' + chartHeight()\"\r\n class=\"nxe-chart-svg\">\r\n <!-- baseline -->\r\n <line\r\n [attr.x1]=\"axisLeft()\"\r\n [attr.x2]=\"axisRight()\"\r\n [attr.y1]=\"baselineY()\"\r\n [attr.y2]=\"baselineY()\"\r\n class=\"nxe-chart-axis\" />\r\n @for (b of bars(); track $index) {\r\n <rect [attr.x]=\"b.x\" [attr.y]=\"b.y\" [attr.width]=\"b.w\" [attr.height]=\"b.h\" [attr.fill]=\"b.fill\" />\r\n }\r\n </svg>\r\n </div>\r\n <div class=\"nxe-chart-legend\">\r\n @for (item of legend(); track $index) {\r\n <span class=\"nxe-chart-legend-item\">\r\n <span class=\"nxe-chart-legend-swatch\" [style.background]=\"item.fill\"></span>\r\n {{ item.name }}\r\n </span>\r\n }\r\n </div>\r\n } @else {\r\n <div class=\"nxe-chart-empty\"></div>\r\n }\r\n</div>\r\n", styles: ["nxe-chart{display:block;width:100%}nxe-chart .nxe-chart-host{display:flex;flex-direction:column;width:100%;overflow-x:auto}nxe-chart .nxe-chart-plot{flex:1 1 auto;min-height:0}nxe-chart .nxe-chart-svg{display:block}nxe-chart .nxe-chart-axis{stroke:var(--nxe-ui-neutral-240, #d3d3d3);stroke-width:1}nxe-chart .nxe-chart-legend{display:flex;flex-wrap:wrap;gap:4px 16px;padding:6px 8px 0;font-size:12px;color:var(--nxe-ui-text, #333)}nxe-chart .nxe-chart-legend-item{display:inline-flex;align-items:center}nxe-chart .nxe-chart-legend-swatch{display:inline-block;width:10px;height:10px;border-radius:2px;margin-right:6px}nxe-chart .nxe-chart-empty{flex:1 1 auto}\n"] }]
4730
4785
  }], propDecorators: { dataSource: [{ type: i0.Input, args: [{ isSignal: true, alias: "dataSource", required: false }] }], commonSeries: [{ type: i0.ContentChild, args: [i0.forwardRef(() => NxeCommonSeriesSettingsComponent), { isSignal: true }] }], size: [{ type: i0.ContentChild, args: [i0.forwardRef(() => NxeSizeComponent), { isSignal: true }] }], adaptiveLayout: [{ type: i0.ContentChild, args: [i0.forwardRef(() => NxeAdaptiveLayoutComponent), { isSignal: true }] }] } });
4731
4786
 
4732
4787
  // @nexterajs/ui/pivot — public API.