@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.
- package/fesm2022/nexterajs-ui-core.mjs +189 -5
- package/fesm2022/nexterajs-ui-core.mjs.map +1 -1
- package/fesm2022/nexterajs-ui-dropdowns.mjs +314 -50
- package/fesm2022/nexterajs-ui-dropdowns.mjs.map +1 -1
- package/fesm2022/nexterajs-ui-file-uploader.mjs +6 -3
- package/fesm2022/nexterajs-ui-file-uploader.mjs.map +1 -1
- package/fesm2022/nexterajs-ui-forms.mjs +729 -370
- package/fesm2022/nexterajs-ui-forms.mjs.map +1 -1
- package/fesm2022/nexterajs-ui-grid.mjs +1188 -208
- package/fesm2022/nexterajs-ui-grid.mjs.map +1 -1
- package/fesm2022/nexterajs-ui-intl.mjs +15 -5
- package/fesm2022/nexterajs-ui-intl.mjs.map +1 -1
- package/fesm2022/nexterajs-ui-notify.mjs +351 -0
- package/fesm2022/nexterajs-ui-notify.mjs.map +1 -0
- package/fesm2022/nexterajs-ui-pivot.mjs +146 -116
- package/fesm2022/nexterajs-ui-pivot.mjs.map +1 -1
- package/fesm2022/nexterajs-ui-styling.mjs +568 -3
- package/fesm2022/nexterajs-ui-styling.mjs.map +1 -1
- package/fesm2022/nexterajs-ui-tree-view.mjs +147 -18
- package/fesm2022/nexterajs-ui-tree-view.mjs.map +1 -1
- package/fesm2022/nexterajs-ui-validation.mjs +247 -92
- package/fesm2022/nexterajs-ui-validation.mjs.map +1 -1
- package/fesm2022/nexterajs-ui.mjs +1 -0
- package/fesm2022/nexterajs-ui.mjs.map +1 -1
- package/package.json +5 -1
- package/styles/_dropdown.scss +149 -0
- package/styles/_editor.scss +23 -4
- package/styles/_icons.scss +92 -0
- package/styles/_mixins.scss +104 -1
- package/styles/_scrollbar.scss +134 -0
- package/styles/_toast.scss +243 -0
- package/styles/_tokens.scss +48 -0
- package/styles/index.scss +4 -0
- package/types/nexterajs-ui-core.d.ts +142 -22
- package/types/nexterajs-ui-dropdowns.d.ts +145 -27
- package/types/nexterajs-ui-file-uploader.d.ts +4 -1
- package/types/nexterajs-ui-forms.d.ts +103 -19
- package/types/nexterajs-ui-grid.d.ts +445 -57
- package/types/nexterajs-ui-notify.d.ts +147 -0
- package/types/nexterajs-ui-pivot.d.ts +35 -22
- package/types/nexterajs-ui-styling.d.ts +163 -3
- package/types/nexterajs-ui-tree-view.d.ts +50 -1
- package/types/nexterajs-ui-validation.d.ts +94 -15
- 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 `
|
|
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'
|
|
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 `.
|
|
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: `.
|
|
2236
|
+
// subtree: `.nxe-area-field-content` + optional `.nxe-column-indicators`).
|
|
2235
2237
|
//
|
|
2236
|
-
// P3-C4: the header-filter funnel (`span.
|
|
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 `.
|
|
2239
|
-
// container; ltr 'left' alignment appends, so the funnel sits AFTER the arrow).
|
|
2240
|
-
//
|
|
2241
|
-
//
|
|
2242
|
-
//
|
|
2243
|
-
//
|
|
2244
|
-
//
|
|
2245
|
-
//
|
|
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: "
|
|
2263
|
-
|
|
2264
|
-
|
|
2265
|
-
|
|
2266
|
-
|
|
2267
|
-
|
|
2268
|
-
|
|
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:
|
|
2273
|
-
|
|
2274
|
-
|
|
2275
|
-
|
|
2276
|
-
|
|
2277
|
-
|
|
2278
|
-
|
|
2279
|
-
|
|
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: [".
|
|
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
|
-
// `.
|
|
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 `.
|
|
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 `.
|
|
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 `.
|
|
2304
|
-
// `.
|
|
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
|
-
// `
|
|
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 — `.
|
|
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 `.
|
|
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 `.
|
|
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 — `.
|
|
2402
|
-
// rgba(51,122,183,.5) with the drag shadow (
|
|
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
|
|
2435
|
+
'nxe-widget nxe-pivotgrid-fields-container nxe-drag nxe-pivot-drag-ghost';
|
|
2410
2436
|
const chip = document.createElement('div');
|
|
2411
|
-
chip.className = '
|
|
2437
|
+
chip.className = 'nxe-area-field nxe-area-box';
|
|
2412
2438
|
const content = document.createElement('div');
|
|
2413
|
-
content.className = '
|
|
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 `
|
|
2420
|
-
sourceDragClasses: ['
|
|
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('.
|
|
2432
|
-
.forEach((el) => el.classList.remove('
|
|
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('.
|
|
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.
|
|
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('.
|
|
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.
|
|
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('
|
|
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('
|
|
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('.
|
|
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 `.
|
|
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
|
-
'
|
|
2549
|
-
(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=\"
|
|
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=\"
|
|
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
|
-
// `.
|
|
2599
|
-
// (tools/visual-parity/reference/pivot/fixtures/field-chooser.html): layout 0 = two `.
|
|
2600
|
-
// of two `.
|
|
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 `.
|
|
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 `.
|
|
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
|
-
// `.
|
|
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 `.
|
|
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('.
|
|
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 `.
|
|
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
|
|
2829
|
+
'nxe-widget nxe-pivotgrid-fields-container nxe-drag nxe-pivot-drag-ghost';
|
|
2804
2830
|
const chip = document.createElement('div');
|
|
2805
|
-
chip.className = '
|
|
2831
|
+
chip.className = 'nxe-area-field nxe-area-box';
|
|
2806
2832
|
const content = document.createElement('div');
|
|
2807
|
-
content.className = '
|
|
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: ['
|
|
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('.
|
|
2825
|
-
.forEach((el) => el.classList.remove('
|
|
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('.
|
|
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('
|
|
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('.
|
|
2927
|
+
const treeEl = this.host().querySelector('.nxe-all-fields .nxe-area-fields');
|
|
2902
2928
|
if (treeEl && inRect(treeEl)) {
|
|
2903
|
-
treeEl.classList.add('
|
|
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('
|
|
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('.
|
|
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 `.
|
|
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
|
-
'
|
|
2953
|
-
(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> </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> </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> </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> </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> </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> </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> </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> </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
|
-
* `.
|
|
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 `.
|
|
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): `
|
|
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 `.
|
|
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
|
-
* `.
|
|
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 `.
|
|
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 `.
|
|
3240
|
-
* (b) panel visible && (showDataFields || showColumnFields) -> the `.
|
|
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 `.
|
|
3243
|
-
* transparent
|
|
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 `.
|
|
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.
|
|
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.
|
|
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
|
|
4531
|
-
//
|
|
4532
|
-
//
|
|
4533
|
-
// area without touching the panel-less cross-tab chrome.
|
|
4534
|
-
'[class.
|
|
4535
|
-
'[class.
|
|
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: [{
|