@nexterajs/ui 0.0.1 → 0.0.2

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 (44) hide show
  1. package/fesm2022/nexterajs-ui-core.mjs +189 -5
  2. package/fesm2022/nexterajs-ui-core.mjs.map +1 -1
  3. package/fesm2022/nexterajs-ui-dropdowns.mjs +314 -50
  4. package/fesm2022/nexterajs-ui-dropdowns.mjs.map +1 -1
  5. package/fesm2022/nexterajs-ui-file-uploader.mjs +6 -3
  6. package/fesm2022/nexterajs-ui-file-uploader.mjs.map +1 -1
  7. package/fesm2022/nexterajs-ui-forms.mjs +729 -370
  8. package/fesm2022/nexterajs-ui-forms.mjs.map +1 -1
  9. package/fesm2022/nexterajs-ui-grid.mjs +1188 -208
  10. package/fesm2022/nexterajs-ui-grid.mjs.map +1 -1
  11. package/fesm2022/nexterajs-ui-intl.mjs +15 -5
  12. package/fesm2022/nexterajs-ui-intl.mjs.map +1 -1
  13. package/fesm2022/nexterajs-ui-notify.mjs +351 -0
  14. package/fesm2022/nexterajs-ui-notify.mjs.map +1 -0
  15. package/fesm2022/nexterajs-ui-pivot.mjs +146 -116
  16. package/fesm2022/nexterajs-ui-pivot.mjs.map +1 -1
  17. package/fesm2022/nexterajs-ui-styling.mjs +568 -3
  18. package/fesm2022/nexterajs-ui-styling.mjs.map +1 -1
  19. package/fesm2022/nexterajs-ui-tree-view.mjs +147 -18
  20. package/fesm2022/nexterajs-ui-tree-view.mjs.map +1 -1
  21. package/fesm2022/nexterajs-ui-validation.mjs +247 -92
  22. package/fesm2022/nexterajs-ui-validation.mjs.map +1 -1
  23. package/fesm2022/nexterajs-ui.mjs +1 -0
  24. package/fesm2022/nexterajs-ui.mjs.map +1 -1
  25. package/package.json +5 -1
  26. package/styles/_dropdown.scss +149 -0
  27. package/styles/_editor.scss +23 -4
  28. package/styles/_icons.scss +92 -0
  29. package/styles/_mixins.scss +104 -1
  30. package/styles/_scrollbar.scss +134 -0
  31. package/styles/_toast.scss +243 -0
  32. package/styles/_tokens.scss +48 -0
  33. package/styles/index.scss +4 -0
  34. package/types/nexterajs-ui-core.d.ts +142 -22
  35. package/types/nexterajs-ui-dropdowns.d.ts +145 -27
  36. package/types/nexterajs-ui-file-uploader.d.ts +4 -1
  37. package/types/nexterajs-ui-forms.d.ts +103 -19
  38. package/types/nexterajs-ui-grid.d.ts +445 -57
  39. package/types/nexterajs-ui-notify.d.ts +147 -0
  40. package/types/nexterajs-ui-pivot.d.ts +35 -22
  41. package/types/nexterajs-ui-styling.d.ts +163 -3
  42. package/types/nexterajs-ui-tree-view.d.ts +50 -1
  43. package/types/nexterajs-ui-validation.d.ts +94 -15
  44. package/types/nexterajs-ui.d.ts +1 -0
@@ -1,7 +1,7 @@
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';
@@ -206,7 +206,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImpor
206
206
 
207
207
  /* eslint-disable @typescript-eslint/no-explicit-any */
208
208
  // 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
209
+ // replaces DevExtreme's `nxe-pivot-grid` / `PivotGridDataSource`. Per plan deviation #6 this
210
210
  // implements the simplified surface the app actually uses: ≤2 row levels, 1 column level,
211
211
  // data fields nested as the inner column level (`dataFieldArea` defaults to `'column'`), and
212
212
  // `sum`/`count`/`min`/`max`/`avg` aggregation (the app only uses `sum`).
@@ -1065,14 +1065,16 @@ function fieldText(field, raw) {
1065
1065
  return text;
1066
1066
  }
1067
1067
  /** Format an aggregated numeric value per the data field's number format / customizeText. */
1068
- function dataText(field, value) {
1068
+ function dataText(field, value, separators) {
1069
1069
  if (value == null) {
1070
1070
  return '';
1071
1071
  }
1072
1072
  // W4 Lane 4: a `summaryType: 'custom'` cell holds whatever `totalValue` the callback left
1073
1073
  // — dx renders non-numeric values as-is (its formatter no-ops on them), so strings (and
1074
1074
  // 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);
1075
+ const formatted = typeof value === 'number'
1076
+ ? nxeFormatNumberValue(value, field.format, separators)
1077
+ : String(value);
1076
1078
  if (field.customizeText) {
1077
1079
  return field.customizeText({ value, valueText: formatted });
1078
1080
  }
@@ -1181,9 +1183,9 @@ class NxePivotDataSource {
1181
1183
  const step = field.dataType === 'number' ? numericGroupInterval(field) : null;
1182
1184
  if (step && !field.customizeText && typeof field.selector !== 'function') {
1183
1185
  field.customizeText = (ci) => {
1184
- const secondText = nxeFormatNumberValue(ci.value + step, field.format);
1186
+ const secondText = nxeFormatNumberValue(ci.value + step, field.format, this.options.separators);
1185
1187
  const firstText = typeof ci.value === 'number'
1186
- ? nxeFormatNumberValue(ci.value, field.format)
1188
+ ? nxeFormatNumberValue(ci.value, field.format, this.options.separators)
1187
1189
  : ci.valueText;
1188
1190
  return firstText && secondText ? `${firstText} - ${secondText}` : '';
1189
1191
  };
@@ -1527,7 +1529,7 @@ class NxePivotDataSource {
1527
1529
  return this.valueAt(rowPath, leaf.colPath, leaf.dataIndex);
1528
1530
  }
1529
1531
  text(rowPath, leaf) {
1530
- return dataText(this.dataFields[leaf.dataIndex], this.cell(rowPath, leaf));
1532
+ return dataText(this.dataFields[leaf.dataIndex], this.cell(rowPath, leaf), this.options.separators);
1531
1533
  }
1532
1534
  numFmt(dataIndex) {
1533
1535
  return nxeExcelNumFmt(this.dataFields[dataIndex]?.format);
@@ -1578,7 +1580,7 @@ class NxePivotDataSource {
1578
1580
  const grandTotalCells = !measuresOnRows && opts.showRowGrandTotals && this.visibleDataFields.length > 0
1579
1581
  ? leaves.map((leaf) => {
1580
1582
  const value = resolveValue([], leaf.colPath, leaf.dataIndex);
1581
- return { value, text: dataText(this.dataFields[leaf.dataIndex], value) };
1583
+ return { value, text: dataText(this.dataFields[leaf.dataIndex], value, this.options.separators) };
1582
1584
  })
1583
1585
  : null;
1584
1586
  // Measures-on-rows: the grand-total footer splits into one row per VISIBLE measure,
@@ -1591,7 +1593,7 @@ class NxePivotDataSource {
1591
1593
  caption: df.caption ?? df.dataField ?? '',
1592
1594
  cells: leaves.map((leaf) => {
1593
1595
  const value = resolveValue([], leaf.colPath, di);
1594
- return { value, text: dataText(df, value) };
1596
+ return { value, text: dataText(df, value, this.options.separators) };
1595
1597
  }),
1596
1598
  };
1597
1599
  })
@@ -1616,7 +1618,7 @@ class NxePivotDataSource {
1616
1618
  // everything else (grand-total path `[]`, hidden paths, leaves from an older model).
1617
1619
  // With measures on rows the ROW carries the data index; otherwise the leaf does.
1618
1620
  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)));
1621
+ const textMatrix = matrix.map((mr, ri) => mr.map((v, li) => dataText(this.dataFields[rows[ri].dataIndex ?? leaves[li].dataIndex], v, this.options.separators)));
1620
1622
  const rowIndexByPath = new Map();
1621
1623
  rows.forEach((row, ri) => {
1622
1624
  const key = pathKeyOf(row.path);
@@ -2229,23 +2231,39 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImpor
2229
2231
  // nxe-pivot-field-chip — the SHARED dx field chip (P3-C3). One rendering for every place a
2230
2232
  // field chip appears: the field panel's area bands / corner row area (P3-C2, table cells) and
2231
2233
  // 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`
2234
+ // HOST element stays the caller's own `<div>` carrying dx's exact `.nxe-area-field.nxe-area-box`
2233
2235
  // classes (fixtures/fields-panel.html and fixtures/field-chooser.html agree on the chip
2234
- // subtree: `.dx-area-field-content` + optional `.dx-column-indicators`).
2236
+ // subtree: `.nxe-area-field-content` + optional `.nxe-column-indicators`).
2235
2237
  //
2236
- // P3-C4: the header-filter funnel (`span.dx-header-filter`) renders beside the sort arrow —
2238
+ // P3-C4: the header-filter funnel (`span.nxe-header-filter`) renders beside the sort arrow —
2237
2239
  // 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.
2240
+ // appending both into ONE `.nxe-column-indicators` container (m_column_state_mixin reuses the
2241
+ // container; ltr 'left' alignment appends, so the funnel sits AFTER the arrow). A funnel click
2242
+ // must NOT sort: dx's chip click handler branches on `$(e.target).hasClass('nxe-header-filter')`
2243
+ // (m_field_chooser_base subscribeToEvents), so the funnel handler stops propagation before the
2244
+ // host's own (click) fires.
2245
+ //
2246
+ // WHERE the indicator block goes follows dx's showColumnLines rule
2247
+ // (m_column_state_mixin `_applyColumnState`): renderField(field, showColumnLines) PREPENDS the
2248
+ // block and floats it right (inline `float: right`, as dx sets it) when showColumnLines is on —
2249
+ // the field chooser (`renderField(field, true)`, m_field_chooser.js:465) and the panel's ROW area
2250
+ // (`renderField(field, "row" === field.area)`, m_fields_area.js:120). Everywhere else (panel
2251
+ // column / filter / data chips) it is APPENDED after the caption, inline, unfloated. The caller
2252
+ // says which through `floatIndicators`.
2253
+ //
2254
+ // The arrow and funnel are the library's own drawings (clip-path polygons written from round
2255
+ // pixel metrics — the DXIcons font is not used) in dx's 14px glyph box: `.dx-sort` #959595,
2256
+ // `.dx-header-filter` #757575 with the `-empty` state at 50% alpha
2257
+ // (`.dx-pivotgrid-fields-container .dx-header-filter-empty{color:rgba(117,117,117,.5)}`). An
2258
+ // app that shrinks `.nxe-column-indicators` (bright's `scale: .7`) shrinks them as it did dx's.
2246
2259
  class NxePivotFieldChipComponent {
2247
2260
  chip = input.required(/* @ts-ignore */
2248
2261
  ...(ngDevMode ? [{ debugName: "chip" }] : /* istanbul ignore next */ []));
2262
+ /** dx showColumnLines for this chip's surface: true in the field chooser and the panel's
2263
+ * ROW area — the indicators come FIRST and float right; false (panel column / filter /
2264
+ * data areas) — they follow the caption inline. */
2265
+ floatIndicators = input(false, /* @ts-ignore */
2266
+ ...(ngDevMode ? [{ debugName: "floatIndicators" }] : /* istanbul ignore next */ []));
2249
2267
  /** Raw pointerdown — the host decides whether a drag gesture may begin. */
2250
2268
  chipPointerDown = output();
2251
2269
  /** Chip click (the host consults its gesture's click suppression before sorting). */
@@ -2259,38 +2277,46 @@ class NxePivotFieldChipComponent {
2259
2277
  this.chipFilterClick.emit(event);
2260
2278
  }
2261
2279
  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 });
2280
+ 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" />}
2281
+ <ng-template #indicators>@if (chip().sortable || chip().filterable) {<div
2282
+ class="nxe-column-indicators"
2283
+ role="presentation"
2284
+ [style.float]="floatIndicators() ? 'right' : null">@if (chip().sortable) {<span
2285
+ class="nxe-sort"
2286
+ [class.nxe-sort-up]="chip().sortOrder === 'asc'"
2287
+ [class.nxe-sort-down]="chip().sortOrder === 'desc'"></span>}@if (chip().filterable) {<span
2288
+ class="nxe-header-filter"
2289
+ [class.nxe-header-filter-empty]="!chip().filterActive"
2290
+ (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
2291
  }
2270
2292
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: NxePivotFieldChipComponent, decorators: [{
2271
2293
  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',
2294
+ 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" />}
2295
+ <ng-template #indicators>@if (chip().sortable || chip().filterable) {<div
2296
+ class="nxe-column-indicators"
2297
+ role="presentation"
2298
+ [style.float]="floatIndicators() ? 'right' : null">@if (chip().sortable) {<span
2299
+ class="nxe-sort"
2300
+ [class.nxe-sort-up]="chip().sortOrder === 'asc'"
2301
+ [class.nxe-sort-down]="chip().sortOrder === 'desc'"></span>}@if (chip().filterable) {<span
2302
+ class="nxe-header-filter"
2303
+ [class.nxe-header-filter-empty]="!chip().filterActive"
2304
+ (click)="onFunnelClick($event)"></span>}</div>}</ng-template>`, imports: [NgTemplateOutlet], host: {
2305
+ class: 'nxe-area-field nxe-area-box',
2280
2306
  '(pointerdown)': 'chipPointerDown.emit($event)',
2281
2307
  '(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"] }] } });
2308
+ }, 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"] }]
2309
+ }], 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
2310
 
2285
2311
  /* eslint-disable @typescript-eslint/no-explicit-any */
2286
2312
  // 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
2313
+ // `.nxe-pivotgrid-fields-area` blocks harvested from the live broker reference
2288
2314
  // (tools/visual-parity/reference/pivot/fixtures/fields-panel.html, ORACLE.md §c): filter strip
2289
2315
  // 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`
2316
+ // panel: dx hosts it inside the cross-tab's corner `.nxe-area-description-cell`
2291
2317
  // (views/0/initial-full-page.png — the 'Lob' chip sits in the corner, no caption text), so it
2292
2318
  // 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
2319
+ // Chips are `.nxe-area-field.nxe-area-box > .nxe-area-field-content`; an empty area shows dx's
2294
2320
  // exact localization string ("Drop Filter Fields Here" etc. — dx fieldPanel.texts defaults).
2295
2321
  //
2296
2322
  // The panel is DUMB about field state: it reads chips off the pivot's engine (which already has
@@ -2300,10 +2326,10 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImpor
2300
2326
  //
2301
2327
  // Dragging reuses the shared NxeDragGesture core extracted from the grid controller (same 5px
2302
2328
  // 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
2329
+ // dx's `.nxe-pivotgrid-fields-container.nxe-drag` chip clone, the insertion mark dx's
2330
+ // `.nxe-position-indicator` 2px bar. Drop zones are hit-tested from the PIVOT root (the row area
2305
2331
  // 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.
2332
+ // `nxe-drag-target` highlight; the other areas highlight their fields-area element.
2307
2333
  /** dx `fieldPanel.texts` defaults (dxPivotGrid docs; the filter string matches the fixture). */
2308
2334
  const EMPTY_AREA_TEXTS = {
2309
2335
  filter: 'Drop Filter Fields Here',
@@ -2357,10 +2383,10 @@ class NxePivotFieldPanelComponent {
2357
2383
  allowFiltering = input(false, /* @ts-ignore */
2358
2384
  ...(ngDevMode ? [{ debugName: "allowFiltering" }] : /* istanbul ignore next */ []));
2359
2385
  /** 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). */
2386
+ * border around the filter/chip bands — `.nxe-pivotgrid-border .nxe-filter-header` et al). */
2361
2387
  showBorders = input(false, /* @ts-ignore */
2362
2388
  ...(ngDevMode ? [{ debugName: "showBorders" }] : /* istanbul ignore next */ []));
2363
- /** P3-C3: the pivot's `.dx-pivotgrid-toolbar` template (field-chooser button) — rendered
2389
+ /** P3-C3: the pivot's `.nxe-pivotgrid-toolbar` template (field-chooser button) — rendered
2364
2390
  * where dx prepends its toolbar container (m_widget.js `_renderDescriptionArea`). */
2365
2391
  toolbarTemplate = input(null, /* @ts-ignore */
2366
2392
  ...(ngDevMode ? [{ debugName: "toolbarTemplate" }] : /* istanbul ignore next */ []));
@@ -2379,7 +2405,7 @@ class NxePivotFieldPanelComponent {
2379
2405
  /** A chip's funnel was clicked — the pivot opens the header-filter panel (P3-C4). */
2380
2406
  filterOpen = output();
2381
2407
  /** 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). */
2408
+ * the row chips inside `.nxe-area-description-cell`, never in a band of their own). */
2383
2409
  rowAreaTemplate = viewChild('rowAreaTpl', /* @ts-ignore */
2384
2410
  ...(ngDevMode ? [{ debugName: "rowAreaTemplate" }] : /* istanbul ignore next */ []));
2385
2411
  elementRef = inject((ElementRef));
@@ -2398,26 +2424,26 @@ class NxePivotFieldPanelComponent {
2398
2424
  // --- Dragging -----------------------------------------------------------------------------
2399
2425
  drag = null;
2400
2426
  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`
2427
+ // dx ghost: the fields-container drag clone — `.nxe-drag` opacity .8, chip re-bordered
2428
+ // rgba(51,122,183,.5) with the drag shadow (nxe-pivot-field-chip's styles). `nxe-widget`
2403
2429
  // carries the 12.24px widget font stack across the <body> boundary, exactly as the
2404
2430
  // library's overlay panes do (styling/_widget.scss) — without it the ghost renders in
2405
2431
  // the page's body font.
2406
2432
  createGhost: () => {
2407
2433
  const ghost = document.createElement('div');
2408
2434
  ghost.className =
2409
- 'nxe-widget dx-pivotgrid-fields-container dx-drag nxe-pivot-drag-ghost';
2435
+ 'nxe-widget nxe-pivotgrid-fields-container nxe-drag nxe-pivot-drag-ghost';
2410
2436
  const chip = document.createElement('div');
2411
- chip.className = 'dx-area-field dx-area-box';
2437
+ chip.className = 'nxe-area-field nxe-area-box';
2412
2438
  const content = document.createElement('div');
2413
- content.className = 'dx-area-field-content';
2439
+ content.className = 'nxe-area-field-content';
2414
2440
  content.textContent = this.drag?.chip.caption ?? '';
2415
2441
  chip.appendChild(content);
2416
2442
  ghost.appendChild(chip);
2417
2443
  return ghost;
2418
2444
  },
2419
- // dx dims the source chip with `dx-drag-source` (opacity .5 via the container scope).
2420
- sourceDragClasses: ['dx-drag-source'],
2445
+ // dx dims the source chip with `nxe-drag-source` (opacity .5 via the container scope).
2446
+ sourceDragClasses: ['nxe-drag-source'],
2421
2447
  dragMove: (x, y) => this.trackPointer(x, y),
2422
2448
  drop: () => this.completeDrop(),
2423
2449
  clearDropVisuals: () => {
@@ -2428,8 +2454,8 @@ class NxePivotFieldPanelComponent {
2428
2454
  d.targetEl = null;
2429
2455
  }
2430
2456
  this.dragRoot()
2431
- .querySelectorAll('.dx-drag-target')
2432
- .forEach((el) => el.classList.remove('dx-drag-target'));
2457
+ .querySelectorAll('.nxe-drag-target')
2458
+ .forEach((el) => el.classList.remove('nxe-drag-target'));
2433
2459
  },
2434
2460
  reset: () => {
2435
2461
  this.drag = null;
@@ -2467,7 +2493,7 @@ class NxePivotFieldPanelComponent {
2467
2493
  if (this.gesture.consumeClick()) {
2468
2494
  return; // a drag released over the funnel must not also open the popup
2469
2495
  }
2470
- const origin = event.target?.closest('.dx-area-field') ??
2496
+ const origin = event.target?.closest('.nxe-area-field') ??
2471
2497
  event.target;
2472
2498
  this.filterOpen.emit({ fieldIndex: chip.fieldIndex, origin });
2473
2499
  }
@@ -2483,14 +2509,14 @@ class NxePivotFieldPanelComponent {
2483
2509
  }
2484
2510
  /**
2485
2511
  * 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
2512
+ * target; for ROW the enclosing corner cell (`th.nxe-area-description-cell`) is — dx's row
2487
2513
  * area IS the corner, so a drop anywhere on it must land in rows, not read as "outside".
2488
2514
  */
2489
2515
  dropZones() {
2490
- return Array.from(this.dragRoot().querySelectorAll('.dx-pivotgrid-fields-area[group]')).map((areaEl) => {
2516
+ return Array.from(this.dragRoot().querySelectorAll('.nxe-pivotgrid-fields-area[group]')).map((areaEl) => {
2491
2517
  const group = areaEl.getAttribute('group');
2492
2518
  const corner = group === 'row'
2493
- ? areaEl.closest('th.dx-area-description-cell')
2519
+ ? areaEl.closest('th.nxe-area-description-cell')
2494
2520
  : null;
2495
2521
  return { group, hitEl: corner ?? areaEl, areaEl };
2496
2522
  });
@@ -2505,7 +2531,7 @@ class NxePivotFieldPanelComponent {
2505
2531
  return x >= r.left && x <= r.right && y >= r.top && y <= r.bottom;
2506
2532
  }) ?? null;
2507
2533
  if (d.targetEl && d.targetEl !== hit?.hitEl) {
2508
- d.targetEl.classList.remove('dx-drag-target');
2534
+ d.targetEl.classList.remove('nxe-drag-target');
2509
2535
  }
2510
2536
  if (!hit) {
2511
2537
  // Outside every area: no drop target — releasing here is a snap-back NO-OP
@@ -2517,10 +2543,10 @@ class NxePivotFieldPanelComponent {
2517
2543
  d.indicator = null;
2518
2544
  return;
2519
2545
  }
2520
- hit.hitEl.classList.add('dx-drag-target');
2546
+ hit.hitEl.classList.add('nxe-drag-target');
2521
2547
  d.targetEl = hit.hitEl;
2522
2548
  d.targetArea = hit.group;
2523
- const chips = Array.from(hit.areaEl.querySelectorAll('.dx-area-field.dx-area-box'));
2549
+ const chips = Array.from(hit.areaEl.querySelectorAll('.nxe-area-field.nxe-area-box'));
2524
2550
  let slot = chips.length;
2525
2551
  for (let i = 0; i < chips.length; i++) {
2526
2552
  const r = chips[i].getBoundingClientRect();
@@ -2532,7 +2558,7 @@ class NxePivotFieldPanelComponent {
2532
2558
  d.slot = slot;
2533
2559
  this.placeIndicator(d, hit.areaEl, chips, slot);
2534
2560
  }
2535
- /** dx `.dx-position-indicator`: a 2px gray bar between chips, inside the (positioned) area. */
2561
+ /** dx `.nxe-position-indicator`: a 2px gray bar between chips, inside the (positioned) area. */
2536
2562
  placeIndicator(d, areaEl, chips, slot) {
2537
2563
  if (!chips.length) {
2538
2564
  // Empty area: the dx-drag-target state marks the whole area; no bar to place.
@@ -2545,8 +2571,8 @@ class NxePivotFieldPanelComponent {
2545
2571
  }
2546
2572
  const last = slot >= chips.length;
2547
2573
  d.indicator.className =
2548
- 'dx-position-indicator dx-position-indicator-horizontal' +
2549
- (last ? ' dx-position-indicator-last' : '');
2574
+ 'nxe-position-indicator nxe-position-indicator-horizontal' +
2575
+ (last ? ' nxe-position-indicator-last' : '');
2550
2576
  const areaRect = areaEl.getBoundingClientRect();
2551
2577
  const ref = last ? chips[chips.length - 1] : chips[slot];
2552
2578
  const refRect = ref.getBoundingClientRect();
@@ -2584,20 +2610,20 @@ class NxePivotFieldPanelComponent {
2584
2610
  this.fieldMove.emit({ fieldIndex: d.chip.fieldIndex, area: d.targetArea, areaIndex: slot });
2585
2611
  }
2586
2612
  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 });
2613
+ 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:#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.nxe-data-header,nxe-pivot-field-panel .nxe-pivot-field-panel-table>tbody>tr>td.nxe-column-header{background-color:#ddd3}nxe-pivot-field-panel .nxe-pivot-field-panel-table>tbody>tr>td.nxe-data-header{border-right:1px solid #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
2614
  }
2589
2615
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: NxePivotFieldPanelComponent, decorators: [{
2590
2616
  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"] }]
2617
+ 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:#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.nxe-data-header,nxe-pivot-field-panel .nxe-pivot-field-panel-table>tbody>tr>td.nxe-column-header{background-color:#ddd3}nxe-pivot-field-panel .nxe-pivot-field-panel-table>tbody>tr>td.nxe-data-header{border-right:1px solid #ddd}nxe-pivot-field-panel .nxe-area-field-container{border-collapse:collapse}\n"] }]
2592
2618
  }], 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
2619
 
2594
2620
  /* eslint-disable @typescript-eslint/no-explicit-any */
2595
2621
  // nxe-pivot-field-chooser — the dx field chooser popup (dxo-field-chooser), P3-C3. Renders the
2596
2622
  // popup CONTENT the pivot opens in a CDK overlay: dx popup title bar ("Field Chooser" + close X,
2597
2623
  // 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]
2624
+ // `.nxe-pivotgridfieldchooser` DOM harvested from the live broker
2625
+ // (tools/visual-parity/reference/pivot/fixtures/field-chooser.html): layout 0 = two `.nxe-row`s
2626
+ // of two `.nxe-col`s — [All Fields tree | Row+Column areas] over [Filter | Data]
2601
2627
  // (m_field_chooser.js `_renderLayout0`). Chips reuse the panel's shared
2602
2628
  // NxePivotFieldChipComponent; the All Fields tree mirrors the fixture's dx-treeview markup
2603
2629
  // (flat leaves — the app's local fields have no dimension/displayFolder groups).
@@ -2624,7 +2650,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImpor
2624
2650
  // so FieldChooserBase's own default (true) applies regardless of fieldPanel settings.
2625
2651
  // - DROP targets (sortable/m_sortable.js `getTargetGroup` + the drag-end handler's
2626
2652
  // `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`
2653
+ // group's `.nxe-area-fields` box. The All-Fields TREE box is a group WITHOUT a `group`
2628
2654
  // attr, so a drop there resolves `targetGroup` undefined -> `_applyChanges({area:
2629
2655
  // undefined})` = the one drag-remove path (with the dx-drag-target hover highlight,
2630
2656
  // like any group). A release anywhere else — title bar, captions, paddings, outside
@@ -2634,9 +2660,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImpor
2634
2660
  // `getCompareFunction`) — the fixture's alphabetical list.
2635
2661
  //
2636
2662
  // 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:
2663
+ // width/height to the popup's `.nxe-overlay-content` BOX — 600x400 with 1px borders. Inside:
2638
2664
  // 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;
2665
+ // `.nxe-popup-content.nxe-pivotgridfieldchooser` (20px padding -> dx stamps inline height:309px;
2640
2666
  // here flexbox yields the same box). 598x349 measured = 600x400 minus borders minus title.
2641
2667
  //
2642
2668
  // Known deviations (DEFAULTS.md, P3-C3 rows): no popup drag/resize; no cross-widget drag
@@ -2699,7 +2725,7 @@ class NxePivotFieldChooserComponent {
2699
2725
  ...(ngDevMode ? [{ debugName: "searchText" }] : /* istanbul ignore next */ []));
2700
2726
  elementRef = inject((ElementRef));
2701
2727
  zone = inject(NgZone);
2702
- /** Popup box size — dx puts fieldChooser.width/height on `.dx-overlay-content` (600 dflt). */
2728
+ /** Popup box size — dx puts fieldChooser.width/height on `.nxe-overlay-content` (600 dflt). */
2703
2729
  boxWidth = computed(() => `${this.width() ?? 600}px`, /* @ts-ignore */
2704
2730
  ...(ngDevMode ? [{ debugName: "boxWidth" }] : /* istanbul ignore next */ []));
2705
2731
  boxHeight = computed(() => `${this.height() ?? 600}px`, /* @ts-ignore */
@@ -2782,13 +2808,13 @@ class NxePivotFieldChooserComponent {
2782
2808
  if (this.gesture.consumeClick()) {
2783
2809
  return; // a drag released over the funnel must not also open the popup
2784
2810
  }
2785
- const origin = event.target?.closest('.dx-area-field') ??
2811
+ const origin = event.target?.closest('.nxe-area-field') ??
2786
2812
  event.target;
2787
2813
  this.filterOpen.emit({ fieldIndex: chip.fieldIndex, origin });
2788
2814
  }
2789
2815
  // --- Dragging between chooser areas --------------------------------------------------------
2790
2816
  // 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.
2817
+ // Y midpoint and the insertion mark is dx's `.nxe-position-indicator-vertical` 2px bar.
2792
2818
  // Drop targets are dx m_sortable's groups — the four `[group]` fields boxes AND the
2793
2819
  // All-Fields tree box (a group WITHOUT a `group` attr, so a drop there resolves to
2794
2820
  // `area: undefined` = REMOVE, with the same dx-drag-target hover highlight). A release
@@ -2800,17 +2826,17 @@ class NxePivotFieldChooserComponent {
2800
2826
  createGhost: () => {
2801
2827
  const ghost = document.createElement('div');
2802
2828
  ghost.className =
2803
- 'nxe-widget dx-pivotgrid-fields-container dx-drag nxe-pivot-drag-ghost';
2829
+ 'nxe-widget nxe-pivotgrid-fields-container nxe-drag nxe-pivot-drag-ghost';
2804
2830
  const chip = document.createElement('div');
2805
- chip.className = 'dx-area-field dx-area-box';
2831
+ chip.className = 'nxe-area-field nxe-area-box';
2806
2832
  const content = document.createElement('div');
2807
- content.className = 'dx-area-field-content';
2833
+ content.className = 'nxe-area-field-content';
2808
2834
  content.textContent = this.drag?.chip.caption ?? '';
2809
2835
  chip.appendChild(content);
2810
2836
  ghost.appendChild(chip);
2811
2837
  return ghost;
2812
2838
  },
2813
- sourceDragClasses: ['dx-drag-source'],
2839
+ sourceDragClasses: ['nxe-drag-source'],
2814
2840
  dragMove: (x, y) => this.trackPointer(x, y),
2815
2841
  drop: () => this.completeDrop(),
2816
2842
  clearDropVisuals: () => {
@@ -2821,8 +2847,8 @@ class NxePivotFieldChooserComponent {
2821
2847
  d.targetEl = null;
2822
2848
  }
2823
2849
  this.host()
2824
- .querySelectorAll('.dx-drag-target')
2825
- .forEach((el) => el.classList.remove('dx-drag-target'));
2850
+ .querySelectorAll('.nxe-drag-target')
2851
+ .forEach((el) => el.classList.remove('nxe-drag-target'));
2826
2852
  },
2827
2853
  reset: () => {
2828
2854
  this.drag = null;
@@ -2884,10 +2910,10 @@ class NxePivotFieldChooserComponent {
2884
2910
  const r = el.getBoundingClientRect();
2885
2911
  return x >= r.left && x <= r.right && y >= r.top && y <= r.bottom;
2886
2912
  };
2887
- const zones = Array.from(this.host().querySelectorAll('.dx-area-fields[group]'));
2913
+ const zones = Array.from(this.host().querySelectorAll('.nxe-area-fields[group]'));
2888
2914
  const hitEl = zones.find(inRect) ?? null;
2889
2915
  if (d.targetEl && d.targetEl !== hitEl) {
2890
- d.targetEl.classList.remove('dx-drag-target');
2916
+ d.targetEl.classList.remove('nxe-drag-target');
2891
2917
  d.targetEl = null;
2892
2918
  }
2893
2919
  if (!hitEl) {
@@ -2898,9 +2924,9 @@ class NxePivotFieldChooserComponent {
2898
2924
  d.indicator = null;
2899
2925
  // The All-Fields tree box is dx's REMOVE zone (a sortable group without a
2900
2926
  // `group` attr) and gets the same hover highlight as any target group.
2901
- const treeEl = this.host().querySelector('.dx-all-fields .dx-area-fields');
2927
+ const treeEl = this.host().querySelector('.nxe-all-fields .nxe-area-fields');
2902
2928
  if (treeEl && inRect(treeEl)) {
2903
- treeEl.classList.add('dx-drag-target');
2929
+ treeEl.classList.add('nxe-drag-target');
2904
2930
  d.targetEl = treeEl;
2905
2931
  d.overTree = true;
2906
2932
  return;
@@ -2921,11 +2947,11 @@ class NxePivotFieldChooserComponent {
2921
2947
  d.indicator = null;
2922
2948
  return;
2923
2949
  }
2924
- hitEl.classList.add('dx-drag-target');
2950
+ hitEl.classList.add('nxe-drag-target');
2925
2951
  d.targetEl = hitEl;
2926
2952
  d.targetArea = group;
2927
2953
  d.invalid = false;
2928
- const chips = Array.from(hitEl.querySelectorAll('.dx-area-field.dx-area-box'));
2954
+ const chips = Array.from(hitEl.querySelectorAll('.nxe-area-field.nxe-area-box'));
2929
2955
  let slot = chips.length;
2930
2956
  for (let i = 0; i < chips.length; i++) {
2931
2957
  const r = chips[i].getBoundingClientRect();
@@ -2937,7 +2963,7 @@ class NxePivotFieldChooserComponent {
2937
2963
  d.slot = slot;
2938
2964
  this.placeIndicator(d, hitEl, chips, slot);
2939
2965
  }
2940
- /** dx `.dx-position-indicator-vertical`: a 2px bar between the stacked chips. */
2966
+ /** dx `.nxe-position-indicator-vertical`: a 2px bar between the stacked chips. */
2941
2967
  placeIndicator(d, areaEl, chips, slot) {
2942
2968
  if (!chips.length) {
2943
2969
  d.indicator?.remove();
@@ -2949,8 +2975,8 @@ class NxePivotFieldChooserComponent {
2949
2975
  }
2950
2976
  const last = slot >= chips.length;
2951
2977
  d.indicator.className =
2952
- 'dx-position-indicator dx-position-indicator-vertical' +
2953
- (last ? ' dx-position-indicator-last' : '');
2978
+ 'nxe-position-indicator nxe-position-indicator-vertical' +
2979
+ (last ? ' nxe-position-indicator-last' : '');
2954
2980
  const areaRect = areaEl.getBoundingClientRect();
2955
2981
  const ref = last ? chips[chips.length - 1] : chips[slot];
2956
2982
  const refRect = ref.getBoundingClientRect();
@@ -2996,11 +3022,11 @@ class NxePivotFieldChooserComponent {
2996
3022
  this.fieldMove.emit({ fieldIndex: d.chip.fieldIndex, area: d.targetArea, areaIndex: slot });
2997
3023
  }
2998
3024
  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 });
3025
+ 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 aria-label=\"Close\"\r\n (click)=\"closed.emit()\"\r\n (keydown.enter)=\"closed.emit()\"></span>\r\n </div>\r\n\r\n <!-- fixtures/field-chooser.html verbatim from here down: the chooser root carries\r\n dx-popup-content + dx-pivotgridfieldchooser + dx-pivotgrid-fields-container (the class\r\n that arms the shared chip chrome, nxe-pivot-field-chip), then layout 0's two rows. -->\r\n <div class=\"nxe-popup-content nxe-widget nxe-pivotgridfieldchooser nxe-pivotgrid-fields-container\">\r\n <div class=\"nxe-pivotgridfieldchooser-container nxe-layout-0\">\r\n <div class=\"nxe-row\">\r\n <div class=\"nxe-col\">\r\n <!-- All Fields: dx-treeview of EVERY defined field, checkbox = has an area. -->\r\n <div class=\"nxe-area nxe-all-fields\">\r\n <div class=\"nxe-area-fields-header\">\r\n <span class=\"nxe-area-icon nxe-icon-{{ allIcon }}\"></span><span>&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 placeholder=\"Search\"\r\n [value]=\"searchText()\"\r\n (input)=\"onSearchInput($event)\" />\r\n </div>\r\n }\r\n <div class=\"nxe-scrollable nxe-scrollable-vertical\">\r\n <div class=\"nxe-scrollable-wrapper\">\r\n <div class=\"nxe-scrollable-container\">\r\n <div class=\"nxe-scrollable-content\">\r\n <ul class=\"nxe-treeview-node-container\" role=\"group\">\r\n @for (item of treeItems(); track item.fieldIndex) {\r\n <li\r\n class=\"nxe-treeview-node nxe-treeview-item-with-checkbox nxe-treeview-root-node nxe-treeview-node-is-leaf\"\r\n [class.nxe-state-selected]=\"item.selected\"\r\n [attr.data-item-id]=\"$index + 1\"\r\n role=\"treeitem\"\r\n [attr.aria-label]=\"item.caption\"\r\n aria-level=\"1\"\r\n [attr.aria-selected]=\"item.selected\">\r\n <div class=\"nxe-item nxe-treeview-item\">\r\n <div class=\"nxe-item-content nxe-treeview-item-content\">\r\n <div class=\"nxe-area-field\" tree-view-item=\"true\"><span>{{ item.caption }}</span></div>\r\n </div>\r\n <div\r\n class=\"nxe-widget nxe-checkbox\"\r\n [class.nxe-checkbox-checked]=\"item.selected\"\r\n role=\"checkbox\"\r\n tabindex=\"0\"\r\n [attr.aria-checked]=\"item.selected\"\r\n aria-label=\"Check state\"\r\n (click)=\"onCheckboxClick(item)\"\r\n (keydown.space)=\"onCheckboxClick(item)\">\r\n <input type=\"hidden\" [value]=\"item.selected\" />\r\n <div class=\"nxe-checkbox-container\"><span class=\"nxe-checkbox-icon\"></span></div>\r\n </div>\r\n <div class=\"nxe-treeview-expander-icon-stub\"></div>\r\n </div>\r\n </li>\r\n }\r\n </ul>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"nxe-col\">\r\n <ng-container *ngTemplateOutlet=\"areaTpl; context: { area: rowArea() }\" />\r\n <ng-container *ngTemplateOutlet=\"areaTpl; context: { area: columnArea() }\" />\r\n </div>\r\n </div>\r\n <div class=\"nxe-row\">\r\n <div class=\"nxe-col\">\r\n <ng-container *ngTemplateOutlet=\"areaTpl; context: { area: filterArea() }\" />\r\n </div>\r\n <div class=\"nxe-col\">\r\n <ng-container *ngTemplateOutlet=\"areaTpl; context: { area: dataArea() }\" />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!-- One group area (dx `_renderArea`): header (icon + caption), then the bordered fields box\r\n with the stacked chips. An EMPTY area shows nothing \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:#fff;border:1px solid #ddd;border-radius:6px;box-shadow:0 6px 12px #0000002d;color:#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 #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:#0000000a}nxe-pivot-field-chooser .nxe-popup-title .nxe-closebutton:focus-visible{background-color:#00000014}nxe-pivot-field-chooser .nxe-popup-title .nxe-closebutton:active{background-color:#0000003d}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:#ddd3}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 #ddd;border-radius:4px;background:#fff;color:#333;font:inherit;outline:0}nxe-pivot-field-chooser .nxe-treeview-search .nxe-texteditor-input:focus{border-color:#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:#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
3026
  }
3001
3027
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: NxePivotFieldChooserComponent, decorators: [{
3002
3028
  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"] }]
3029
+ 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 aria-label=\"Close\"\r\n (click)=\"closed.emit()\"\r\n (keydown.enter)=\"closed.emit()\"></span>\r\n </div>\r\n\r\n <!-- fixtures/field-chooser.html verbatim from here down: the chooser root carries\r\n dx-popup-content + dx-pivotgridfieldchooser + dx-pivotgrid-fields-container (the class\r\n that arms the shared chip chrome, nxe-pivot-field-chip), then layout 0's two rows. -->\r\n <div class=\"nxe-popup-content nxe-widget nxe-pivotgridfieldchooser nxe-pivotgrid-fields-container\">\r\n <div class=\"nxe-pivotgridfieldchooser-container nxe-layout-0\">\r\n <div class=\"nxe-row\">\r\n <div class=\"nxe-col\">\r\n <!-- All Fields: dx-treeview of EVERY defined field, checkbox = has an area. -->\r\n <div class=\"nxe-area nxe-all-fields\">\r\n <div class=\"nxe-area-fields-header\">\r\n <span class=\"nxe-area-icon nxe-icon-{{ allIcon }}\"></span><span>&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 placeholder=\"Search\"\r\n [value]=\"searchText()\"\r\n (input)=\"onSearchInput($event)\" />\r\n </div>\r\n }\r\n <div class=\"nxe-scrollable nxe-scrollable-vertical\">\r\n <div class=\"nxe-scrollable-wrapper\">\r\n <div class=\"nxe-scrollable-container\">\r\n <div class=\"nxe-scrollable-content\">\r\n <ul class=\"nxe-treeview-node-container\" role=\"group\">\r\n @for (item of treeItems(); track item.fieldIndex) {\r\n <li\r\n class=\"nxe-treeview-node nxe-treeview-item-with-checkbox nxe-treeview-root-node nxe-treeview-node-is-leaf\"\r\n [class.nxe-state-selected]=\"item.selected\"\r\n [attr.data-item-id]=\"$index + 1\"\r\n role=\"treeitem\"\r\n [attr.aria-label]=\"item.caption\"\r\n aria-level=\"1\"\r\n [attr.aria-selected]=\"item.selected\">\r\n <div class=\"nxe-item nxe-treeview-item\">\r\n <div class=\"nxe-item-content nxe-treeview-item-content\">\r\n <div class=\"nxe-area-field\" tree-view-item=\"true\"><span>{{ item.caption }}</span></div>\r\n </div>\r\n <div\r\n class=\"nxe-widget nxe-checkbox\"\r\n [class.nxe-checkbox-checked]=\"item.selected\"\r\n role=\"checkbox\"\r\n tabindex=\"0\"\r\n [attr.aria-checked]=\"item.selected\"\r\n aria-label=\"Check state\"\r\n (click)=\"onCheckboxClick(item)\"\r\n (keydown.space)=\"onCheckboxClick(item)\">\r\n <input type=\"hidden\" [value]=\"item.selected\" />\r\n <div class=\"nxe-checkbox-container\"><span class=\"nxe-checkbox-icon\"></span></div>\r\n </div>\r\n <div class=\"nxe-treeview-expander-icon-stub\"></div>\r\n </div>\r\n </li>\r\n }\r\n </ul>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n <div class=\"nxe-col\">\r\n <ng-container *ngTemplateOutlet=\"areaTpl; context: { area: rowArea() }\" />\r\n <ng-container *ngTemplateOutlet=\"areaTpl; context: { area: columnArea() }\" />\r\n </div>\r\n </div>\r\n <div class=\"nxe-row\">\r\n <div class=\"nxe-col\">\r\n <ng-container *ngTemplateOutlet=\"areaTpl; context: { area: filterArea() }\" />\r\n </div>\r\n <div class=\"nxe-col\">\r\n <ng-container *ngTemplateOutlet=\"areaTpl; context: { area: dataArea() }\" />\r\n </div>\r\n </div>\r\n </div>\r\n </div>\r\n</div>\r\n\r\n<!-- One group area (dx `_renderArea`): header (icon + caption), then the bordered fields box\r\n with the stacked chips. An EMPTY area shows nothing \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:#fff;border:1px solid #ddd;border-radius:6px;box-shadow:0 6px 12px #0000002d;color:#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 #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:#0000000a}nxe-pivot-field-chooser .nxe-popup-title .nxe-closebutton:focus-visible{background-color:#00000014}nxe-pivot-field-chooser .nxe-popup-title .nxe-closebutton:active{background-color:#0000003d}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:#ddd3}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 #ddd;border-radius:4px;background:#fff;color:#333;font:inherit;outline:0}nxe-pivot-field-chooser .nxe-treeview-search .nxe-texteditor-input:focus{border-color:#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:#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
3030
  }], 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
3031
 
3006
3032
  /* eslint-disable @typescript-eslint/no-explicit-any */
@@ -3056,7 +3082,7 @@ function mergeFieldOverrides(fields, overrides) {
3056
3082
  });
3057
3083
  }
3058
3084
  /** `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
3085
+ * `.nxe-pivotgrid-field-chooser-button` toolbar button and opens the chooser popup
3060
3086
  * (nxe-pivot-field-chooser) in a CDK overlay. Defaults are dxPivotGrid's `fieldChooser`
3061
3087
  * defaults (m_widget.js): enabled true, width/height 600, allowSearch false,
3062
3088
  * applyChangesMode 'instantly' (no OK/Cancel — changes hit the pivot live). */
@@ -3088,7 +3114,7 @@ class NxePivotGridComponent {
3088
3114
  dataSource = input(null, /* @ts-ignore */
3089
3115
  ...(ngDevMode ? [{ debugName: "dataSource" }] : /* istanbul ignore next */ []));
3090
3116
  /** 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
3117
+ * (panel AND chooser) render the `.nxe-header-filter` funnel and open the shared
3092
3118
  * header-filter panel; per-field `field.allowFiltering` overrides the widget flag
3093
3119
  * (dx m_widget `_updateCalculatedOptions`). */
3094
3120
  allowFiltering = input(false, /* @ts-ignore */
@@ -3105,7 +3131,7 @@ class NxePivotGridComponent {
3105
3131
  ...(ngDevMode ? [{ debugName: "allowExpandAll" }] : /* istanbul ignore next */ []));
3106
3132
  showBorders = input(false, /* @ts-ignore */
3107
3133
  ...(ngDevMode ? [{ debugName: "showBorders" }] : /* istanbul ignore next */ []));
3108
- /** dx default TRUE (m_widget.js defaultOptions): `dx-word-wrap` on the table lets header
3134
+ /** dx default TRUE (m_widget.js defaultOptions): `nxe-word-wrap` on the table lets header
3109
3135
  * cells wrap; data cells stay nowrap either way (dx.light's direct td rule). */
3110
3136
  wordWrapEnabled = input(true, /* @ts-ignore */
3111
3137
  ...(ngDevMode ? [{ debugName: "wordWrapEnabled" }] : /* istanbul ignore next */ []));
@@ -3135,7 +3161,7 @@ class NxePivotGridComponent {
3135
3161
  dataFieldArea = input(undefined, /* @ts-ignore */
3136
3162
  ...(ngDevMode ? [{ debugName: "dataFieldArea" }] : /* istanbul ignore next */ []));
3137
3163
  /** 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`. */
3164
+ * sortOrder on click and carry the `.nxe-sort` arrow in `.nxe-column-indicators`. */
3139
3165
  allowSorting = input(false, /* @ts-ignore */
3140
3166
  ...(ngDevMode ? [{ debugName: "allowSorting" }] : /* istanbul ignore next */ []));
3141
3167
  // --- W4 Lane 2: facade `option(name, value)` overrides + dx-shaped outputs ------------------
@@ -3227,20 +3253,21 @@ class NxePivotGridComponent {
3227
3253
  panelCmp = viewChild(NxePivotFieldPanelComponent, /* @ts-ignore */
3228
3254
  ...(ngDevMode ? [{ debugName: "panelCmp" }] : /* istanbul ignore next */ []));
3229
3255
  /** 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). */
3256
+ * `.nxe-area-description-cell` — oracle §c; the corner shows NO caption text then). */
3231
3257
  panelRowAreaTpl = computed(() => this.panelCmp()?.rowAreaTemplate() ?? null, /* @ts-ignore */
3232
3258
  ...(ngDevMode ? [{ debugName: "panelRowAreaTpl" }] : /* istanbul ignore next */ []));
3233
3259
  // --- Field chooser (P3-C3) -----------------------------------------------------------------
3234
- /** The `.dx-pivotgrid-field-chooser-button` renders only when an `nxe-field-chooser` is
3260
+ /** The `.nxe-pivotgrid-field-chooser-button` renders only when an `nxe-field-chooser` is
3235
3261
  * projected with `enabled` not false (the DA page passes [enabled]="true"). */
3236
3262
  chooserEnabled = computed(() => this.fieldChooser() != null && this.fieldChooser().enabled() !== false, /* @ts-ignore */
3237
3263
  ...(ngDevMode ? [{ debugName: "chooserEnabled" }] : /* istanbul ignore next */ []));
3238
3264
  /** 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`
3265
+ * (a) panel visible && showFilterFields -> the `.nxe-filter-header` band;
3266
+ * (b) panel visible && (showDataFields || showColumnFields) -> the `.nxe-column-header`
3241
3267
  * 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. */
3268
+ * (c) else -> the cross-tab corner `.nxe-area-description-cell`, where the button is
3269
+ * transparent until hover and the corner drops its caption (the library's own rules,
3270
+ * nxe-pivot-grid.component.scss — dx.light's description-cell toolbar rules). */
3244
3271
  chooserToolbarHost = computed(() => {
3245
3272
  if (!this.chooserEnabled()) {
3246
3273
  return null;
@@ -3269,6 +3296,8 @@ class NxePivotGridComponent {
3269
3296
  overlay = inject(Overlay);
3270
3297
  viewContainerRef = inject(ViewContainerRef);
3271
3298
  elementRef = inject((ElementRef));
3299
+ /** Locale separators for every number the pivot renders; threaded into the data source. */
3300
+ separators = inject(NXE_NUMBER_SEPARATORS);
3272
3301
  /** Bumped by `getDataSource().reload()` to force a re-aggregate. */
3273
3302
  reloadTick = signal(0, /* @ts-ignore */
3274
3303
  ...(ngDevMode ? [{ debugName: "reloadTick" }] : /* istanbul ignore next */ []));
@@ -3318,12 +3347,13 @@ class NxePivotGridComponent {
3318
3347
  if (overrides.size && explicit.length) {
3319
3348
  return new NxePivotDataSource({
3320
3349
  ...opts,
3350
+ separators: this.separators,
3321
3351
  fields: mergeFieldOverrides(explicit, overrides),
3322
3352
  });
3323
3353
  }
3324
3354
  // No explicit fields → store-derived fields are all AREA-LESS: no chips exist, so the
3325
3355
  // panel can never have produced overrides for this data source.
3326
- return new NxePivotDataSource(opts);
3356
+ return new NxePivotDataSource({ ...opts, separators: this.separators });
3327
3357
  }, /* @ts-ignore */
3328
3358
  ...(ngDevMode ? [{ debugName: "engine" }] : /* istanbul ignore next */ []));
3329
3359
  /**
@@ -3471,7 +3501,7 @@ class NxePivotGridComponent {
3471
3501
  this.scrollTop.set(event.target.scrollTop);
3472
3502
  }
3473
3503
  /**
3474
- * dx `.dx-pivotgrid-nodata` (gridCoreUtils.renderNoDataText): shown when the data source
3504
+ * dx `.nxe-pivotgrid-nodata` (gridCoreUtils.renderNoDataText): shown when the data source
3475
3505
  * `isEmpty()` — no VISIBLE data field or nothing aggregated (empty/fully-filtered store);
3476
3506
  * text `texts.noData` (dx default "No data"). The reloadTick read re-checks after an
3477
3507
  * in-place instance reload.
@@ -3526,11 +3556,11 @@ class NxePivotGridComponent {
3526
3556
  // per model change / repaint / updateDimensions — dx re-layouts on the same).
3527
3557
  const scrollEl = host.querySelector('.nxe-pivotgrid-scroll');
3528
3558
  this.viewportHeight.set(scrollEl?.clientHeight ?? 0);
3529
- const dataTd = host.querySelector('.nxe-pivot-field-panel-table td.dx-data-header');
3559
+ const dataTd = host.querySelector('.nxe-pivot-field-panel-table td.nxe-data-header');
3530
3560
  if (!dataTd) {
3531
3561
  return;
3532
3562
  }
3533
- const corner = host.querySelector('.nxe-pivotgrid-table th.dx-area-description-cell');
3563
+ const corner = host.querySelector('.nxe-pivotgrid-table th.nxe-area-description-cell');
3534
3564
  dataTd.style.width = corner
3535
3565
  ? `${corner.getBoundingClientRect().width}px`
3536
3566
  : '';
@@ -4519,7 +4549,7 @@ class NxePivotGridComponent {
4519
4549
  return this.facade;
4520
4550
  }
4521
4551
  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 });
4552
+ 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 title=\"Show Field Chooser\"\r\n aria-label=\"Show Field Chooser\"\r\n (click)=\"toggleFieldChooser()\"\r\n (keydown.enter)=\"toggleFieldChooser()\">\r\n <!-- dx's 18px `.dx-icon-columnchooser` glyph, redrawn from rectangles (the DXIcons font is\r\n not used): a window with a 2px frame (12 x 12) behind a solid 8 x 11 list panel with\r\n three 4 x 1 slots, unioned into one even-odd path so the slots stay open where the\r\n panel covers the frame. The span keeps the class the specs query but not `nxe-icon`,\r\n whose mask layer would hide an inline SVG. -->\r\n <div class=\"nxe-button-content\"><span class=\"nxe-icon-columnchooser nxe-pivot-chooser-icon\" aria-hidden=\"true\"><svg viewBox=\"0 0 18 18\" width=\"18\" height=\"18\" focusable=\"false\"><path fill=\"currentColor\" fill-rule=\"evenodd\" d=\"M1 2h12v4h4v11H9v-3H1zM3 4v8h6V6h2V4zM11 8v1h4V8zM11 11v1h4v-1zM11 14v1h4v-1z\" /></svg></span></div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n@if (model(); as m) {\r\n <!-- P3-C2: the dx field panel (dxo-field-panel). dx default visible=false \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
4553
  }
4524
4554
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImport: i0, type: NxePivotGridComponent, decorators: [{
4525
4555
  type: Component,
@@ -4527,13 +4557,13 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.1.5", ngImpor
4527
4557
  class: 'nxe-widget nxe-pivot-grid',
4528
4558
  '[style.height]': 'hostHeight()',
4529
4559
  // 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"] }]
4560
+ // panel renders — or while the corner hosts the field-chooser toolbar — so the chip
4561
+ // and area-head chrome (the library's own, nxe-pivot-field-chip + this component's
4562
+ // scss; an app's dx-prefixed copies under the class mirror) reach the panel bands AND
4563
+ // the corner-hosted row area without touching the panel-less cross-tab chrome.
4564
+ '[class.nxe-pivotgrid]': 'panelVisible() || chooserInCorner()',
4565
+ '[class.nxe-pivotgrid-fields-container]': 'panelVisible() || chooserInCorner()',
4566
+ }, 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 title=\"Show Field Chooser\"\r\n aria-label=\"Show Field Chooser\"\r\n (click)=\"toggleFieldChooser()\"\r\n (keydown.enter)=\"toggleFieldChooser()\">\r\n <!-- dx's 18px `.dx-icon-columnchooser` glyph, redrawn from rectangles (the DXIcons font is\r\n not used): a window with a 2px frame (12 x 12) behind a solid 8 x 11 list panel with\r\n three 4 x 1 slots, unioned into one even-odd path so the slots stay open where the\r\n panel covers the frame. The span keeps the class the specs query but not `nxe-icon`,\r\n whose mask layer would hide an inline SVG. -->\r\n <div class=\"nxe-button-content\"><span class=\"nxe-icon-columnchooser nxe-pivot-chooser-icon\" aria-hidden=\"true\"><svg viewBox=\"0 0 18 18\" width=\"18\" height=\"18\" focusable=\"false\"><path fill=\"currentColor\" fill-rule=\"evenodd\" d=\"M1 2h12v4h4v11H9v-3H1zM3 4v8h6V6h2V4zM11 8v1h4V8zM11 11v1h4v-1zM11 14v1h4v-1z\" /></svg></span></div>\r\n </div>\r\n </div>\r\n</ng-template>\r\n\r\n@if (model(); as m) {\r\n <!-- P3-C2: the dx field panel (dxo-field-panel). dx default visible=false \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
4567
  }], 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
4568
  type: Output
4539
4569
  }], onCellPrepared: [{