@nexterajs/ui 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (50) hide show
  1. package/LICENSE +202 -0
  2. package/NOTICE +16 -0
  3. package/README.md +64 -0
  4. package/fesm2022/nexterajs-ui-animations.mjs +184 -0
  5. package/fesm2022/nexterajs-ui-animations.mjs.map +1 -0
  6. package/fesm2022/nexterajs-ui-core.mjs +326 -0
  7. package/fesm2022/nexterajs-ui-core.mjs.map +1 -0
  8. package/fesm2022/nexterajs-ui-dropdowns.mjs +953 -0
  9. package/fesm2022/nexterajs-ui-dropdowns.mjs.map +1 -0
  10. package/fesm2022/nexterajs-ui-excel.mjs +779 -0
  11. package/fesm2022/nexterajs-ui-excel.mjs.map +1 -0
  12. package/fesm2022/nexterajs-ui-file-uploader.mjs +125 -0
  13. package/fesm2022/nexterajs-ui-file-uploader.mjs.map +1 -0
  14. package/fesm2022/nexterajs-ui-forms.mjs +1113 -0
  15. package/fesm2022/nexterajs-ui-forms.mjs.map +1 -0
  16. package/fesm2022/nexterajs-ui-grid.mjs +4145 -0
  17. package/fesm2022/nexterajs-ui-grid.mjs.map +1 -0
  18. package/fesm2022/nexterajs-ui-intl.mjs +377 -0
  19. package/fesm2022/nexterajs-ui-intl.mjs.map +1 -0
  20. package/fesm2022/nexterajs-ui-pivot.mjs +4739 -0
  21. package/fesm2022/nexterajs-ui-pivot.mjs.map +1 -0
  22. package/fesm2022/nexterajs-ui-styling.mjs +59 -0
  23. package/fesm2022/nexterajs-ui-styling.mjs.map +1 -0
  24. package/fesm2022/nexterajs-ui-tree-view.mjs +202 -0
  25. package/fesm2022/nexterajs-ui-tree-view.mjs.map +1 -0
  26. package/fesm2022/nexterajs-ui-validation.mjs +269 -0
  27. package/fesm2022/nexterajs-ui-validation.mjs.map +1 -0
  28. package/fesm2022/nexterajs-ui.mjs +23 -0
  29. package/fesm2022/nexterajs-ui.mjs.map +1 -0
  30. package/package.json +100 -0
  31. package/styles/_button-directives.scss +39 -0
  32. package/styles/_dropdown.scss +113 -0
  33. package/styles/_editor.scss +146 -0
  34. package/styles/_mixins.scss +2 -0
  35. package/styles/_tokens.scss +77 -0
  36. package/styles/_widget.scss +58 -0
  37. package/styles/index.scss +83 -0
  38. package/types/nexterajs-ui-animations.d.ts +22 -0
  39. package/types/nexterajs-ui-core.d.ts +328 -0
  40. package/types/nexterajs-ui-dropdowns.d.ts +334 -0
  41. package/types/nexterajs-ui-excel.d.ts +159 -0
  42. package/types/nexterajs-ui-file-uploader.d.ts +47 -0
  43. package/types/nexterajs-ui-forms.d.ts +296 -0
  44. package/types/nexterajs-ui-grid.d.ts +1485 -0
  45. package/types/nexterajs-ui-intl.d.ts +125 -0
  46. package/types/nexterajs-ui-pivot.d.ts +1470 -0
  47. package/types/nexterajs-ui-styling.d.ts +40 -0
  48. package/types/nexterajs-ui-tree-view.d.ts +69 -0
  49. package/types/nexterajs-ui-validation.d.ts +102 -0
  50. package/types/nexterajs-ui.d.ts +12 -0
@@ -0,0 +1,1485 @@
1
+ import * as _angular_core from '@angular/core';
2
+ import { NgZone, ViewContainerRef, OnDestroy, EventEmitter, TemplateRef } from '@angular/core';
3
+ import { Overlay, OverlayRef } from '@angular/cdk/overlay';
4
+
5
+ /** A DevExtreme-style column `format`: a number-mask string, a date format string, or `{ type }`. */
6
+ interface NxeColumnFormatObject {
7
+ type?: string;
8
+ precision?: number;
9
+ /** dx parity: a custom `formatter` wins over `type` (resolved in nxe-format.util). */
10
+ formatter?: (value: any) => string;
11
+ }
12
+ type NxeColumnFormat = string | NxeColumnFormatObject;
13
+ /** Column `customizeText` callback — `(info) => string` (used by `formatAccounting`). */
14
+ type NxeCustomizeText = (info: {
15
+ value: any;
16
+ valueText: string;
17
+ }) => string;
18
+ /**
19
+ * The `$implicit` context object handed to a cell template, mirroring DevExtreme's cell info.
20
+ * Templates read `cell.data.<field>` (live row object), `cell.rowIndex`, and `cell.columnIndex`.
21
+ * `value`/`displayValue`/`text`/`key`/`column` are provided for parity (presently unread in cells).
22
+ */
23
+ interface NxeCellInfo<T = any> {
24
+ data: T;
25
+ rowIndex: number;
26
+ columnIndex: number;
27
+ value: any;
28
+ displayValue: any;
29
+ text: string;
30
+ key: T;
31
+ column: {
32
+ dataField?: string;
33
+ caption?: string;
34
+ } | null;
35
+ }
36
+ /**
37
+ * The `$implicit` context of an `editCellTemplate`, mirroring DevExtreme's edit-cell info.
38
+ *
39
+ * `data` is the LIVE row object. That is the load-bearing part: the dominant template shape
40
+ * assigns straight to it (`ctx.data.amount = $event`) rather than calling `setValue`, exactly as
41
+ * it did under dx, and the grid reads display text back off the same object.
42
+ *
43
+ * `setValue` is provided for dx parity and routes through the grid's own write path — committing
44
+ * in `cell` mode, buffering in `row` mode — so a template that uses it participates in Save and
45
+ * Cancel. A template that writes `data` directly bypasses the buffer, and therefore Cancel; dx
46
+ * behaves the same way, because it hands out the raw row and does not police it.
47
+ */
48
+ interface NxeEditCellInfo<T = any> {
49
+ data: T;
50
+ key: any;
51
+ value: any;
52
+ displayValue: any;
53
+ text: string;
54
+ rowIndex: number;
55
+ columnIndex: number;
56
+ column: {
57
+ dataField?: string;
58
+ caption?: string;
59
+ dataType?: string;
60
+ format?: NxeColumnFormat;
61
+ } | null;
62
+ /** dx parity: commits in `cell` mode, buffers in `row` mode. */
63
+ setValue: (newValue: any) => void;
64
+ component: NxeGridInstance<T>;
65
+ }
66
+ /** dx `rowType` — which kind of row a prepared cell belongs to. */
67
+ type NxeRowType = 'header' | 'filter' | 'data' | 'group' | 'groupFooter' | 'totalFooter';
68
+ /** The row half of a prepared event, shared by `onCellPrepared` and `onRowPrepared`. */
69
+ interface NxeRowInfo<T = any> {
70
+ rowType: NxeRowType;
71
+ data: T | undefined;
72
+ key: any;
73
+ rowIndex: number;
74
+ /** Group nesting level for a group or group-footer row; absent elsewhere. */
75
+ groupIndex?: number;
76
+ /** dx handlers written against older builds read this name instead. */
77
+ groupLevel?: number;
78
+ isExpanded?: boolean;
79
+ isSelected?: boolean;
80
+ }
81
+ /**
82
+ * DevExtreme-shaped `onCellPrepared` payload, emitted once per rendered cell after the DOM is
83
+ * written — `cellElement` is the real `<td>`, and handlers are expected to mutate it.
84
+ *
85
+ * The declarative `mergeColumns` and `rowClass` inputs are the recommended way to do what most
86
+ * handlers do. This exists because applications carry handlers that cannot be rewritten.
87
+ */
88
+ interface NxeCellPreparedEvent<T = any> {
89
+ data: T | undefined;
90
+ key: any;
91
+ value: any;
92
+ displayValue: any;
93
+ text: string;
94
+ /** Visible-column index, command columns excluded; -1 for a cell that spans columns. */
95
+ columnIndex: number;
96
+ /** 0-based data-row index; -1 for header, filter and total-footer rows. */
97
+ rowIndex: number;
98
+ column: {
99
+ dataField?: string;
100
+ caption?: string;
101
+ dataType?: string;
102
+ index: number;
103
+ } | null;
104
+ row: NxeRowInfo<T> | null;
105
+ rowType: NxeRowType;
106
+ cellElement: HTMLTableCellElement;
107
+ component: NxeGridInstance<T>;
108
+ element: HTMLElement;
109
+ }
110
+ /** DevExtreme-shaped `onRowPrepared` payload. `rowClass` covers the common case declaratively. */
111
+ interface NxeRowPreparedEvent<T = any> extends NxeRowInfo<T> {
112
+ rowElement: HTMLTableRowElement;
113
+ columnCount: number;
114
+ component: NxeGridInstance<T>;
115
+ element: HTMLElement;
116
+ }
117
+ /**
118
+ * The `$implicit` context of a `groupCellTemplate`, replacing the `"Caption: value"` text in a
119
+ * group row's caption cell. `value` is the raw group key; `text` is what the grid would have
120
+ * rendered.
121
+ */
122
+ interface NxeGroupCellInfo<T = any> {
123
+ data: T[];
124
+ key: any;
125
+ value: any;
126
+ displayValue: any;
127
+ text: string;
128
+ groupIndex: number;
129
+ columnIndex: number;
130
+ column: {
131
+ dataField?: string;
132
+ caption?: string;
133
+ } | null;
134
+ component: NxeGridInstance<T>;
135
+ }
136
+ /**
137
+ * DevExtreme-shaped `onOptionChanged` payload. Emitted for internal paging
138
+ * (`paging.pageIndex`) and for runtime grouping changes (`columns[<i>].groupIndex`, where `<i>`
139
+ * is the column's content-children declaration index) — one event per user gesture, carrying
140
+ * `previousValue`/`value` exactly as generic-list's persistence handler expects.
141
+ */
142
+ interface NxeGridOptionChangedEvent {
143
+ name: string;
144
+ fullName: string;
145
+ value: any;
146
+ previousValue?: any;
147
+ }
148
+ /** DevExtreme-shaped `onSelectionChanged` payload (handlers read `selectedRowsData[0]?.<field>`). */
149
+ interface NxeGridSelectionChangedEvent<T = any> {
150
+ selectedRowsData: T[];
151
+ selectedRowKeys: T[];
152
+ currentSelectedRowKeys: T[];
153
+ currentDeselectedRowKeys: T[];
154
+ component: NxeGridInstance<T>;
155
+ element: HTMLElement | null;
156
+ }
157
+ /**
158
+ * The `.instance` facade surface — only the methods the codebase actually calls
159
+ * (`getSelectedRowsData` ×12 in templates, `refresh` ×13, `columnOption(field,'visible',bool)` ×3).
160
+ */
161
+ interface NxeExportColumn {
162
+ caption: string;
163
+ dataField: string;
164
+ dataType: 'string' | 'number' | 'date' | 'boolean';
165
+ format: NxeColumnFormat | undefined;
166
+ }
167
+ /** dx TreeList node shape — the slice `exportTreeToExcel` walks (`data` + `children`). */
168
+ interface NxeTreeListNode<T = any> {
169
+ key?: any;
170
+ data?: T;
171
+ children: NxeTreeListNode<T>[];
172
+ level?: number;
173
+ hasChildren?: boolean;
174
+ }
175
+ interface NxeGridInstance<T = any> {
176
+ getSelectedRowsData(): T[];
177
+ getSelectedRowKeys(): T[];
178
+ refresh(): void;
179
+ /**
180
+ * dx `clearFilter()`: no argument clears the filter row AND header filters (including
181
+ * declarative `filterValues` seeds); `'row'`/`'header'` clear one kind. `'search'`,
182
+ * `'filterValue'`, `'dataSource'` are accepted no-ops (those filters don't exist here).
183
+ */
184
+ clearFilter(filterName?: 'row' | 'header' | 'search' | 'filterValue' | 'dataSource'): void;
185
+ /** Only the `(field, 'visible', boolean)` setter form is used (export show/hide toggle). */
186
+ columnOption(dataField: string, optionName: 'visible', value: boolean): void;
187
+ /** Export model: currently-visible columns (honours columnOption visibility toggles). */
188
+ getVisibleColumns(): NxeExportColumn[];
189
+ /** Export model: the filtered+sorted data rows (all pages). */
190
+ getVisibleRows(): T[];
191
+ /**
192
+ * dx `totalCount()`: data rows after filtering, across all pages. Read as
193
+ * `e.component.totalCount()` from a cell-prepared handler to size a merge run.
194
+ */
195
+ totalCount(): number;
196
+ /** dx TreeList parity: virtual root whose `children` are the top-level nodes (empty for flat grids). */
197
+ getRootNode(): NxeTreeListNode<T>;
198
+ /** DevExtreme parity no-op (layout is CSS-driven); triggers a refresh tick. */
199
+ updateDimensions(): void;
200
+ /** Collapses a master-detail row / tree-list node by key (orbit addition). */
201
+ collapseRow(key: any): void;
202
+ /** Expands a tree-list node by key, overriding a manual collapse (orbit addition). */
203
+ expandRow(key: any): void;
204
+ /**
205
+ * Ungroups every grouped column (real dx semantics), emitting one `columns[i].groupIndex`
206
+ * removal per level in descending order so generic-list's persistence replay converges.
207
+ */
208
+ clearGrouping(): void;
209
+ /** Expands all groups / tree nodes (orbit addition). */
210
+ expandAll(): void;
211
+ /** Commits the pending row edit, if any (dx parity; cell edits commit on blur). */
212
+ saveEditData(): void;
213
+ /** The grid's host element (dx parity: `e.component.element()`). */
214
+ element(): HTMLElement;
215
+ }
216
+
217
+ /** Resolve a `format` to a date display pattern — a `{ type }` object's `type` IS the pattern. */
218
+ declare function nxeDatePattern(format: NxeColumnFormat | undefined, fallback?: string): string;
219
+ /**
220
+ * Resolve a `format` to the LDML number mask the library's number engine understands: string
221
+ * masks pass through; `{ type: 'fixedPoint' | 'currency', precision }` build a grouped mask
222
+ * (`currency` deliberately carries NO symbol — DEFAULTS.md). Anything else → `undefined`.
223
+ */
224
+ declare function nxeNumberMask(format: NxeColumnFormat | undefined): string | undefined;
225
+ /**
226
+ * Format a numeric value per a dx-style `format` (string mask, `{ type }` object, or
227
+ * `{ formatter }`). No format / an unresolvable one → `String(value)` (the grid's untyped
228
+ * rendering).
229
+ */
230
+ declare function nxeFormatNumberValue(value: number, format: NxeColumnFormat | undefined): string;
231
+ /**
232
+ * Derive the Excel `numFmt` mask for a `format`: string masks pass through, fixedPoint/currency
233
+ * come from {@link nxeNumberMask}, percent appends a bare `%` (Excel multiplies by 100 itself),
234
+ * and any other `{ type }` is a date pattern used as-is. `{ formatter }`-only objects →
235
+ * `undefined` (callers fall back to exporting the formatted text).
236
+ */
237
+ declare function nxeExcelNumFmt(format: NxeColumnFormat | undefined): string | undefined;
238
+ /**
239
+ * The data grid's default cell rendering (pure extraction of nxe-data-grid's `defaultFormat`):
240
+ * `dataType`/`format` → display text. Number cells honour string masks only — exactly the
241
+ * grid's pre-extraction behaviour.
242
+ */
243
+ declare function nxeDefaultFormat(dataType: 'string' | 'number' | 'date' | 'boolean' | undefined, format: NxeColumnFormat | undefined, raw: any): string;
244
+
245
+ /**
246
+ * `nxe-column` — drop-in replacement for DevExtreme `dxi-column`.
247
+ *
248
+ * A no-render config element collected by the parent `nxe-data-grid` via `contentChildren`.
249
+ * Carries the column's display/format/behaviour config as signals. Works inside `@for`/`@if`
250
+ * with full property binding (column sets are computed at render time; `dataField`/`caption`
251
+ * are sometimes expressions). There are no command-button columns or `calculate*` options here.
252
+ */
253
+ declare class NxeColumnComponent {
254
+ readonly caption: _angular_core.InputSignal<string>;
255
+ /** Bound row field (supports dotted paths and bound/ternary expressions). */
256
+ readonly dataField: _angular_core.InputSignal<string>;
257
+ readonly dataType: _angular_core.InputSignal<"string" | "number" | "boolean" | "date">;
258
+ /** px width — number (`[width]="150"`) or numeric string (`width="200"`). */
259
+ readonly width: _angular_core.InputSignal<string | number>;
260
+ readonly minWidth: _angular_core.InputSignal<string | number>;
261
+ readonly alignment: _angular_core.InputSignal<"left" | "center" | "right">;
262
+ /** Number-mask string (`#,##0.00`), date format string, or `{ type: 'dd MMM yyyy' }`. */
263
+ readonly format: _angular_core.InputSignal<NxeColumnFormat>;
264
+ /** `(info:{value}) => string` (e.g. `formatAccounting` for parenthesized negatives). */
265
+ readonly customizeText: _angular_core.InputSignal<NxeCustomizeText>;
266
+ /** Name of a sibling `<ng-template nxeTemplate="...">` to render the cell. */
267
+ readonly cellTemplate: _angular_core.InputSignal<string>;
268
+ /**
269
+ * DevExtreme column `lookup` (orbit addition): raw values resolve to display text through
270
+ * `dataSource` (`{ lookup: { dataSource, valueExpr: 'lovCode', displayExpr: 'lovName' } }`).
271
+ * Inline cell editing renders a `<select>` over the same list.
272
+ */
273
+ readonly lookup: _angular_core.InputSignal<{
274
+ dataSource: readonly any[];
275
+ valueExpr?: string;
276
+ displayExpr?: string;
277
+ }>;
278
+ readonly allowSorting: _angular_core.InputSignal<boolean>;
279
+ /** dx parity: whether the header can be dragged into the group panel (default true). */
280
+ readonly allowGrouping: _angular_core.InputSignal<boolean>;
281
+ /** dx parity: whether this column shows a resize handle when the grid allows resizing. */
282
+ readonly allowResizing: _angular_core.InputSignal<boolean>;
283
+ readonly allowFiltering: _angular_core.InputSignal<boolean>;
284
+ readonly allowEditing: _angular_core.InputSignal<boolean>;
285
+ readonly allowExporting: _angular_core.InputSignal<boolean>;
286
+ readonly allowSearch: _angular_core.InputSignal<boolean>;
287
+ readonly allowHeaderFiltering: _angular_core.InputSignal<boolean>;
288
+ readonly visible: _angular_core.InputSignal<boolean>;
289
+ readonly sortOrder: _angular_core.InputSignal<"asc" | "desc">;
290
+ readonly sortIndex: _angular_core.InputSignal<number>;
291
+ readonly groupIndex: _angular_core.InputSignal<number>;
292
+ readonly fixed: _angular_core.InputSignal<boolean>;
293
+ readonly filterValues: _angular_core.InputSignal<any[]>;
294
+ /** Column `type` (only `type="date"` seen — a display hint, NOT a command column). */
295
+ readonly type: _angular_core.InputSignal<string>;
296
+ /**
297
+ * dx `cssClass` — extra classes on this column's header, filter and data cells. The escape
298
+ * hatch for one-off cell styling that does not warrant a `cellTemplate`.
299
+ */
300
+ readonly cssClass: _angular_core.InputSignal<string>;
301
+ /**
302
+ * dx `editCellTemplate` — the sibling `<ng-template nxeTemplate="NAME">` rendered while this
303
+ * cell is being edited, in place of the built-in editor. Its context is a
304
+ * {@link NxeEditCellInfo}, whose `data` is the live row: a template that assigns
305
+ * `ctx.data.field = $event` writes straight through, which is how dx's own edit templates
306
+ * were used.
307
+ */
308
+ readonly editCellTemplate: _angular_core.InputSignal<string>;
309
+ /**
310
+ * dx `groupCellTemplate` — replaces the `"Caption: value"` text in a group row's caption
311
+ * cell when this column is the one grouped by.
312
+ */
313
+ readonly groupCellTemplate: _angular_core.InputSignal<string>;
314
+ /**
315
+ * Child columns declared inside this one — dx's banded header. Empty for an ordinary column.
316
+ *
317
+ * `descendants: false` is explicit rather than relied upon: a band's grandchildren belong to
318
+ * its children, and flattening them here would collapse the very nesting the band expresses.
319
+ */
320
+ readonly childColumns: _angular_core.Signal<readonly NxeColumnComponent[]>;
321
+ /** dx `isBand`: a column that groups other columns under a shared header instead of a field. */
322
+ readonly isBand: _angular_core.Signal<boolean>;
323
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NxeColumnComponent, never>;
324
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NxeColumnComponent, "nxe-column", never, { "caption": { "alias": "caption"; "required": false; "isSignal": true; }; "dataField": { "alias": "dataField"; "required": false; "isSignal": true; }; "dataType": { "alias": "dataType"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; "minWidth": { "alias": "minWidth"; "required": false; "isSignal": true; }; "alignment": { "alias": "alignment"; "required": false; "isSignal": true; }; "format": { "alias": "format"; "required": false; "isSignal": true; }; "customizeText": { "alias": "customizeText"; "required": false; "isSignal": true; }; "cellTemplate": { "alias": "cellTemplate"; "required": false; "isSignal": true; }; "lookup": { "alias": "lookup"; "required": false; "isSignal": true; }; "allowSorting": { "alias": "allowSorting"; "required": false; "isSignal": true; }; "allowGrouping": { "alias": "allowGrouping"; "required": false; "isSignal": true; }; "allowResizing": { "alias": "allowResizing"; "required": false; "isSignal": true; }; "allowFiltering": { "alias": "allowFiltering"; "required": false; "isSignal": true; }; "allowEditing": { "alias": "allowEditing"; "required": false; "isSignal": true; }; "allowExporting": { "alias": "allowExporting"; "required": false; "isSignal": true; }; "allowSearch": { "alias": "allowSearch"; "required": false; "isSignal": true; }; "allowHeaderFiltering": { "alias": "allowHeaderFiltering"; "required": false; "isSignal": true; }; "visible": { "alias": "visible"; "required": false; "isSignal": true; }; "sortOrder": { "alias": "sortOrder"; "required": false; "isSignal": true; }; "sortIndex": { "alias": "sortIndex"; "required": false; "isSignal": true; }; "groupIndex": { "alias": "groupIndex"; "required": false; "isSignal": true; }; "fixed": { "alias": "fixed"; "required": false; "isSignal": true; }; "filterValues": { "alias": "filterValues"; "required": false; "isSignal": true; }; "type": { "alias": "type"; "required": false; "isSignal": true; }; "cssClass": { "alias": "cssClass"; "required": false; "isSignal": true; }; "editCellTemplate": { "alias": "editCellTemplate"; "required": false; "isSignal": true; }; "groupCellTemplate": { "alias": "groupCellTemplate"; "required": false; "isSignal": true; }; }, {}, ["childColumns"], never, true, never>;
325
+ }
326
+
327
+ /**
328
+ * One-shot suppression of the click a completed gesture is about to fire, shared by the drag and
329
+ * resize engines. Strictly gesture-scoped: clears once that trailing click has passed (even when
330
+ * it lands on an element without a consuming handler) and expires after 500ms, so a later genuine
331
+ * click is never eaten.
332
+ */
333
+ declare class NxeGestureClickSuppression {
334
+ private pending;
335
+ private until;
336
+ arm(): void;
337
+ consume(): boolean;
338
+ }
339
+ /**
340
+ * Owner-side contract of {@link NxeDragGesture}. The gesture core owns the press → threshold →
341
+ * drag lifecycle (document listeners outside the zone, ghost mounting/positioning, Escape /
342
+ * pointercancel semantics, click suppression, ghost/source/body teardown); the delegate owns the
343
+ * payload, the drop-target hit-testing, and any indicators/highlights beyond the ghost itself.
344
+ */
345
+ interface NxeDragGestureDelegate {
346
+ /** Build the ghost's element (classes + content). The gesture appends it to <body> and
347
+ * keeps it `position: fixed` at pointer + offset. Called once, when the threshold passes. */
348
+ createGhost(): HTMLElement;
349
+ /** Class(es) that dim the pressed source element for the duration of the drag. */
350
+ sourceDragClasses: readonly string[];
351
+ /** The 5px threshold just passed — add initial highlights (e.g. the grid's header-row
352
+ * drop highlight for chip drags). */
353
+ dragStarted?(): void;
354
+ /** Pointer tracking while a drag is active — update drop targets / indicators. */
355
+ dragMove(x: number, y: number): void;
356
+ /** Pointer released after a REAL drag. Runs inside the Angular zone; the ghost, source dim,
357
+ * and `clearDropVisuals` teardown have already happened (imperative DOM must be gone
358
+ * before any signal write re-runs an @for over the drop zone). */
359
+ drop(): void;
360
+ /** Remove indicators/highlights the delegate created. Must be idempotent — also runs on
361
+ * cancel and destroy. */
362
+ clearDropVisuals(): void;
363
+ /** Gesture over (drop dispatched, sub-threshold release, cancel, destroy) — drop payload. */
364
+ reset?(): void;
365
+ }
366
+ /**
367
+ * The shared pointer-gesture core (extracted from the grid controller in P3-C2 so the pivot
368
+ * field panel reuses it rather than copy-pasting). Behavior is the audited 2026-07-27 gesture:
369
+ * press arms, 5px starts, Escape cancels (suppressing the held pointer's release click),
370
+ * pointercancel cancels silently, drop arms one-shot click suppression.
371
+ */
372
+ declare class NxeDragGesture {
373
+ private readonly zone;
374
+ private readonly delegate;
375
+ private active;
376
+ private readonly suppression;
377
+ private readonly onMove;
378
+ private readonly onUp;
379
+ private readonly onCancel;
380
+ private readonly onKey;
381
+ constructor(zone: NgZone, delegate: NxeDragGestureDelegate);
382
+ /** Arm a gesture on pointerdown. Returns false (payload must NOT be set) when refused. */
383
+ begin(event: PointerEvent): boolean;
384
+ /**
385
+ * One-shot suppression of the click browsers fire right after a drag's pointerup — call at
386
+ * the top of header/chip/funnel click handlers so a drop never doubles as a click action.
387
+ */
388
+ consumeClick(): boolean;
389
+ destroy(): void;
390
+ private pointerMove;
391
+ private mountGhost;
392
+ private pointerUp;
393
+ private cancel;
394
+ private teardownVisuals;
395
+ private detachListeners;
396
+ }
397
+ interface NxeGridDragHooks {
398
+ zone: NgZone;
399
+ host: () => HTMLElement;
400
+ /** Header dropped on the group panel. */
401
+ onGroupDrop: (col: NxeColumnComponent) => void;
402
+ /** Chip dropped outside the panel. */
403
+ onChipRemove: (col: NxeColumnComponent) => void;
404
+ /** Chip dropped at another panel position. */
405
+ onChipMove: (fromLevel: number, toLevel: number) => void;
406
+ /** dx `allowColumnReordering` (default false) — enables the header-row drop zone. */
407
+ reorderEnabled: () => boolean;
408
+ /** Header dropped between two headers: move visible column `from` to insertion `slot`. */
409
+ onColumnMove: (fromVisibleIndex: number, insertionSlot: number) => void;
410
+ /** Data-column header cells (command cells excluded), for reorder hit-testing. */
411
+ headerDataCells: () => HTMLElement[];
412
+ }
413
+ /** The data grid's drag controller — payload + drop topology over the shared gesture core. */
414
+ declare class NxeGridDragController {
415
+ private readonly hooks;
416
+ private drag;
417
+ private readonly gesture;
418
+ constructor(hooks: NxeGridDragHooks);
419
+ startHeaderDrag(col: NxeColumnComponent, visibleIndex: number, event: PointerEvent): void;
420
+ startChipDrag(col: NxeColumnComponent, level: number, event: PointerEvent): void;
421
+ /** See {@link NxeDragGesture.consumeClick}. */
422
+ consumeClick(): boolean;
423
+ destroy(): void;
424
+ private begin;
425
+ private updateDropTarget;
426
+ /** Header-row drop zone (only with `allowColumnReordering`): slot between data headers. */
427
+ private updateHeaderReorderTarget;
428
+ private removeColIndicator;
429
+ private completeDrop;
430
+ private placeSeparator;
431
+ private removeSeparator;
432
+ private panel;
433
+ private headerRow;
434
+ }
435
+
436
+ /**
437
+ * `nxe-selection` — drop-in replacement for DevExtreme `dxo-selection` (grid child option).
438
+ *
439
+ * A no-render config element collected by `nxe-data-grid` via `contentChild`. The app only uses
440
+ * `mode` ("single" ×17 / "multiple" ×14, plain string attrs), `selectAllMode="page"`,
441
+ * `showCheckBoxesMode` ("always" ×11 shows the checkbox column; "false"/"none" hide it →
442
+ * selection by row click). `recursive` is tree-list-only (ignored here).
443
+ */
444
+ declare class NxeSelectionComponent {
445
+ readonly mode: _angular_core.InputSignal<"none" | "single" | "multiple">;
446
+ readonly selectAllMode: _angular_core.InputSignal<"page" | "allPages">;
447
+ /** "always" shows the checkbox column; anything else ("false"/"none"/"onClick") hides it. */
448
+ readonly showCheckBoxesMode: _angular_core.InputSignal<string>;
449
+ readonly recursive: _angular_core.InputSignal<boolean>;
450
+ /** dx parity: row-body clicks toggle selection even when checkboxes are shown. */
451
+ readonly selectByClick: _angular_core.InputSignal<boolean>;
452
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NxeSelectionComponent, never>;
453
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NxeSelectionComponent, "nxe-selection", never, { "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "selectAllMode": { "alias": "selectAllMode"; "required": false; "isSignal": true; }; "showCheckBoxesMode": { "alias": "showCheckBoxesMode"; "required": false; "isSignal": true; }; "recursive": { "alias": "recursive"; "required": false; "isSignal": true; }; "selectByClick": { "alias": "selectByClick"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
454
+ }
455
+
456
+ /**
457
+ * `nxe-header-filter` — drop-in replacement for DevExtreme `dxo-header-filter` (grid child option).
458
+ *
459
+ * Adds a funnel icon to each filterable column header; clicking it opens a popup of the column's
460
+ * distinct values (checkbox list + optional search) to filter the grid. The app uses essentially
461
+ * one shape: `[search]="{ enabled: true }" [visible]="true"` (60 files). Legacy `[allowSearch]`
462
+ * (1×) folds into `search.enabled`.
463
+ */
464
+ declare class NxeHeaderFilterComponent {
465
+ readonly visible: _angular_core.InputSignal<boolean>;
466
+ readonly search: _angular_core.InputSignal<{
467
+ enabled?: boolean;
468
+ }>;
469
+ /** Legacy alias for `search.enabled` (one holdout). */
470
+ readonly allowSearch: _angular_core.InputSignal<boolean>;
471
+ /** Whether the in-popup search box shows.
472
+ *
473
+ * Defaults to **true**, matching the legacy DevExtreme deployment: a popup listing every
474
+ * distinct value in a column is close to unusable without one. 60 of the app's templates
475
+ * already opt in explicitly, so this only changes the handful that never said either way —
476
+ * and an explicit `[search]="{ enabled: false }"` still turns it off. */
477
+ searchEnabled(): boolean;
478
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NxeHeaderFilterComponent, never>;
479
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NxeHeaderFilterComponent, "nxe-header-filter", never, { "visible": { "alias": "visible"; "required": false; "isSignal": true; }; "search": { "alias": "search"; "required": false; "isSignal": true; }; "allowSearch": { "alias": "allowSearch"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
480
+ }
481
+
482
+ /**
483
+ * Header-filter state model — the draft/apply/search machinery extracted from
484
+ * `nxe-data-grid` (pivot parity Phase 3a) so the pivot's field panel can reuse it on pages
485
+ * that have no data grid. Pure signals/computeds, no Angular DI, ZERO behavior change:
486
+ * every computed/method body is a verbatim move from `nxe-data-grid.component.ts`.
487
+ *
488
+ * The model is generic over the column type `C` (the grid passes `NxeColumnComponent`; the
489
+ * pivot will pass its field descriptor) and reads rows/values through a
490
+ * {@link NxeHeaderFilterSource} adapter, so it owns only the frozen semantics:
491
+ * `(Blanks)` first, Yes/No boolean buckets, the date Year > Month > Day tree, dx search
492
+ * scoping of (Select All), check-on-open, and "everything checked = no filter" on apply.
493
+ */
494
+ /**
495
+ * Header-filter key for blank-ish values (`null`/`undefined`/`''`) — dx lists them as one
496
+ * `(Blanks)` bucket, FIRST (bright audit). A symbol can never collide with data values.
497
+ */
498
+ declare const NXE_HF_BLANKS: unique symbol;
499
+ /** A node of the date-column header-filter tree (dx: Year > Month > Day, bright audit). */
500
+ interface NxeHfDateNode {
501
+ label: string;
502
+ key: string;
503
+ children: NxeHfDateNode[];
504
+ /** The draft-set entries this node covers (day keys, or the blanks sentinel). */
505
+ leafKeys: any[];
506
+ }
507
+ /**
508
+ * Normalizes a raw cell value to its header-filter key: blank-ish → the `(Blanks)` sentinel,
509
+ * date columns → a `yyyy-MM-dd` day key (the tree's leaf unit), else the raw value.
510
+ */
511
+ declare function nxeHfKey(raw: any, isDate: boolean): any;
512
+ /** How the model reads rows and column values — the host (grid, pivot) supplies these. */
513
+ interface NxeHeaderFilterSource<C> {
514
+ /** The rows the value list is built from. dx does NOT cascade header-filter lists for
515
+ client arrays (bright audit V6) — the grid passes its FULL dataSource here. */
516
+ rows(): readonly any[];
517
+ /** Raw cell value of a row for this column (dotted-path aware on the grid). */
518
+ rawValue(column: C, row: any): any;
519
+ /** Formatted display text for a row — used for non-blank, non-boolean-bucket items. */
520
+ displayText(column: C, row: any): string;
521
+ /** Date column → values bucket into the Year > Month > Day tree. */
522
+ isDate(column: C): boolean;
523
+ /** dx sorts lookup columns by display text, everything else by raw value. */
524
+ sortByDisplayText(column: C): boolean;
525
+ /** dx boolean buckets label Yes/No (Yes first); `null` = not a boolean bucket. */
526
+ boolLabel(column: C, raw: any): 'Yes' | 'No' | null;
527
+ /** Raw-value comparator (numbers numeric, dates by instant, else locale strings). */
528
+ compare(a: any, b: any): number;
529
+ }
530
+ declare class NxeHeaderFilterModel<C = unknown> {
531
+ private readonly source;
532
+ private static readonly MONTH_NAMES;
533
+ /** The column whose popup is open (`null` = closed). */
534
+ readonly column: _angular_core.WritableSignal<C>;
535
+ /** The checked key set being edited in the popup (committed by the host on OK). */
536
+ readonly draft: _angular_core.WritableSignal<ReadonlySet<any>>;
537
+ readonly search: _angular_core.WritableSignal<string>;
538
+ readonly expanded: _angular_core.WritableSignal<ReadonlySet<string>>;
539
+ constructor(source: NxeHeaderFilterSource<C>);
540
+ /** This column's header-filter key for a raw value. */
541
+ key(column: C, raw: any): any;
542
+ /** Distinct {key, text} for the open column — `(Blanks)` first, then Yes/No or values ascending. */
543
+ readonly distinct: _angular_core.Signal<{
544
+ key: any;
545
+ text: string;
546
+ }[]>;
547
+ readonly distinctFiltered: _angular_core.Signal<{
548
+ key: any;
549
+ text: string;
550
+ }[]>;
551
+ readonly isDate: _angular_core.Signal<boolean>;
552
+ readonly dateTree: _angular_core.Signal<NxeHfDateNode[]>;
553
+ /**
554
+ * Search prunes the tree dx-style: a node stays if its label matches or a descendant does;
555
+ * a matched-label node with no matching descendants collapses to a leaf (keeps all its keys).
556
+ */
557
+ readonly dateTreeFiltered: _angular_core.Signal<NxeHfDateNode[]>;
558
+ toggleExpand(key: string): void;
559
+ /** While searching every surviving branch shows expanded (dx auto-expands matches). */
560
+ nodeExpanded(key: string): boolean;
561
+ nodeChecked(n: NxeHfDateNode): boolean;
562
+ nodeIndeterminate(n: NxeHfDateNode): boolean;
563
+ toggleNode(n: NxeHfDateNode): void;
564
+ /** Every selectable key of the open column (tree leaves for dates, list keys otherwise). */
565
+ readonly allKeys: _angular_core.Signal<any[]>;
566
+ /** The keys currently shown in the popup — with a search active, only the matches. */
567
+ readonly visibleKeys: _angular_core.Signal<any[]>;
568
+ /** (Select All) state/toggle operate on the VISIBLE keys (dx: search scopes Select All). */
569
+ readonly allChecked: _angular_core.Signal<boolean>;
570
+ /** Whether every key of the whole column is checked — decides "no filter" on apply. */
571
+ readonly fullChecked: _angular_core.Signal<boolean>;
572
+ /**
573
+ * Reset the popup state for `column` (check-on-open — FROZEN, see DEFAULTS.md):
574
+ * no applied filter → everything checked; else start from the applied set.
575
+ */
576
+ open(column: C, applied: ReadonlySet<any> | undefined): void;
577
+ close(): void;
578
+ toggleValue(value: any): void;
579
+ toggleAll(): void;
580
+ /**
581
+ * The set the host stores on OK: everything checked (or nothing to choose from) =
582
+ * explicit "no filter" (`null` so a declarative seed can't resurrect); else the
583
+ * allowed-key set (empty = empty grid).
584
+ */
585
+ applyResult(): ReadonlySet<any> | null;
586
+ }
587
+
588
+ /**
589
+ * The header-filter popup panel — the `.nxe-hf-*` chunk extracted from `nxe-data-grid`'s
590
+ * template (pivot parity Phase 3a) so the pivot can open the same popup on pages with no
591
+ * data grid. Same DOM, same FROZEN classes (`.nxe-hf-item`/`.nxe-hf-search`/… — DEFAULTS.md):
592
+ * the host element carries `dx-header-filter-menu nxe-hf-panel`, exactly where the old
593
+ * template's root `<div>` sat inside the overlay pane.
594
+ *
595
+ * Renders whatever {@link NxeHeaderFilterModel} it is given — checkbox list or the date
596
+ * Year > Month > Day tree — and emits `applied`/`cancelled` for the host to commit/close;
597
+ * the panel itself never touches the host's filter state.
598
+ */
599
+ declare class NxeHeaderFilterPanelComponent {
600
+ readonly model: _angular_core.InputSignal<NxeHeaderFilterModel<any>>;
601
+ /** Live predicate (re-read every CD, like the grid template did) — a mid-open config
602
+ change to `search.enabled` still shows/hides the box. */
603
+ readonly searchEnabled: _angular_core.InputSignal<() => boolean>;
604
+ /** OK — the host commits the draft and closes. */
605
+ readonly applied: _angular_core.OutputEmitterRef<void>;
606
+ /** Cancel — the host closes without committing. */
607
+ readonly cancelled: _angular_core.OutputEmitterRef<void>;
608
+ protected showSearch(): boolean;
609
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NxeHeaderFilterPanelComponent, never>;
610
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NxeHeaderFilterPanelComponent, "nxe-header-filter-panel", never, { "model": { "alias": "model"; "required": true; "isSignal": true; }; "searchEnabled": { "alias": "searchEnabled"; "required": false; "isSignal": true; }; }, { "applied": "applied"; "cancelled": "cancelled"; }, never, never, true, never>;
611
+ }
612
+
613
+ /**
614
+ * CDK overlay wiring for the header-filter popup — extracted from `nxe-data-grid` (pivot
615
+ * parity Phase 3a) so any host (grid header funnel, pivot field panel) opens the identical
616
+ * popup: dropped below the origin start-aligned (end-aligned fallback), repositioning on
617
+ * scroll, closing on a transparent-backdrop click, pane carrying `nxePane('nxe-hf-pane')`
618
+ * (the `.nxe-widget` font contract for body-level panes).
619
+ */
620
+ interface NxeHeaderFilterOverlayOptions {
621
+ overlay: Overlay;
622
+ /** Anchors the panel in the caller's injector AND change-detection tree — exactly what
623
+ the grid's old `TemplatePortal(panel, viewContainerRef)` attachment did. */
624
+ viewContainerRef: ViewContainerRef;
625
+ /** The clicked funnel/trigger element the panel connects to. */
626
+ origin: HTMLElement;
627
+ model: NxeHeaderFilterModel<any>;
628
+ /** Live predicate for the in-popup search box (re-read every CD). */
629
+ searchEnabled: () => boolean;
630
+ /** OK — commit the draft and close (the host disposes/detaches the returned ref). */
631
+ onApply: () => void;
632
+ /** Cancel button or backdrop click — close without committing. */
633
+ onClose: () => void;
634
+ }
635
+ /** Create + attach the header-filter popup; the caller keeps the ref to detach/dispose. */
636
+ declare function openNxeHeaderFilterOverlay(options: NxeHeaderFilterOverlayOptions): OverlayRef;
637
+
638
+ /** `dxo-grouping` — only `[autoExpandAll]="true"` is used (24 grids). */
639
+ declare class NxeGroupingComponent {
640
+ readonly autoExpandAll: _angular_core.InputSignal<boolean>;
641
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NxeGroupingComponent, never>;
642
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NxeGroupingComponent, "nxe-grouping", never, { "autoExpandAll": { "alias": "autoExpandAll"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
643
+ }
644
+ /** `dxo-group-panel` — only `[visible]` is used (23 grids). */
645
+ declare class NxeGroupPanelComponent {
646
+ readonly visible: _angular_core.InputSignal<boolean | "auto">;
647
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NxeGroupPanelComponent, never>;
648
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NxeGroupPanelComponent, "nxe-group-panel", never, { "visible": { "alias": "visible"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
649
+ }
650
+
651
+ /** Structural shape the grid reads off a total/group summary item. */
652
+ interface NxeSummaryItemLike {
653
+ column(): string;
654
+ summaryType(): 'sum' | 'count' | 'min' | 'max' | 'avg' | 'custom';
655
+ name(): string | undefined;
656
+ displayFormat(): string;
657
+ customizeText(): NxeCustomizeText | undefined;
658
+ valueFormat(): NxeColumnFormat | undefined;
659
+ alignByColumn(): boolean;
660
+ showInGroupFooter(): boolean;
661
+ showInColumn(): string | undefined;
662
+ }
663
+ /** Shared base for total/group summary items. The app only uses `summaryType="sum"`. */
664
+ declare abstract class NxeSummaryItemBase implements NxeSummaryItemLike {
665
+ readonly column: _angular_core.InputSignal<string>;
666
+ readonly summaryType: _angular_core.InputSignal<"sum" | "count" | "min" | "max" | "avg" | "custom">;
667
+ /** Identifier passed to `calculateCustomSummary` for `summaryType='custom'` items. */
668
+ readonly name: _angular_core.InputSignal<string>;
669
+ /** Positional template; `{0}` is replaced by the customized/formatted value. */
670
+ readonly displayFormat: _angular_core.InputSignal<string>;
671
+ readonly customizeText: _angular_core.InputSignal<NxeCustomizeText>;
672
+ readonly valueFormat: _angular_core.InputSignal<NxeColumnFormat>;
673
+ readonly alignByColumn: _angular_core.InputSignal<boolean>;
674
+ /** Render this group aggregate in a footer row under the group instead of the group row. */
675
+ readonly showInGroupFooter: _angular_core.InputSignal<boolean>;
676
+ readonly showInColumn: _angular_core.InputSignal<string>;
677
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NxeSummaryItemBase, never>;
678
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<NxeSummaryItemBase, never, never, { "column": { "alias": "column"; "required": false; "isSignal": true; }; "summaryType": { "alias": "summaryType"; "required": false; "isSignal": true; }; "name": { "alias": "name"; "required": false; "isSignal": true; }; "displayFormat": { "alias": "displayFormat"; "required": false; "isSignal": true; }; "customizeText": { "alias": "customizeText"; "required": false; "isSignal": true; }; "valueFormat": { "alias": "valueFormat"; "required": false; "isSignal": true; }; "alignByColumn": { "alias": "alignByColumn"; "required": false; "isSignal": true; }; "showInGroupFooter": { "alias": "showInGroupFooter"; "required": false; "isSignal": true; }; "showInColumn": { "alias": "showInColumn"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
679
+ }
680
+ /** `dxi-total-item` — a grand-total footer aggregate. */
681
+ declare class NxeTotalItemComponent extends NxeSummaryItemBase {
682
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NxeTotalItemComponent, never>;
683
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NxeTotalItemComponent, "nxe-total-item", never, {}, {}, never, never, true, never>;
684
+ }
685
+ /** `dxi-group-item` — a per-group footer aggregate. */
686
+ declare class NxeGroupItemComponent extends NxeSummaryItemBase {
687
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NxeGroupItemComponent, never>;
688
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NxeGroupItemComponent, "nxe-group-item", never, {}, {}, never, never, true, never>;
689
+ }
690
+ /** `dxo-summary` — container collecting `nxe-total-item` / `nxe-group-item` children. */
691
+ declare class NxeSummaryComponent {
692
+ /**
693
+ * DevExtreme `calculateCustomSummary` (orbit addition): called with the dx protocol —
694
+ * `{name, summaryProcess:'start'}`, then `'calculate'` once per row (`options.value` = the
695
+ * row object), then `'finalize'`; the handler mutates `options.totalValue`.
696
+ */
697
+ readonly calculateCustomSummary: _angular_core.InputSignal<(options: any) => void>;
698
+ readonly totalItems: _angular_core.Signal<readonly NxeTotalItemComponent[]>;
699
+ readonly groupItems: _angular_core.Signal<readonly NxeGroupItemComponent[]>;
700
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NxeSummaryComponent, never>;
701
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NxeSummaryComponent, "nxe-summary", never, { "calculateCustomSummary": { "alias": "calculateCustomSummary"; "required": false; "isSignal": true; }; }, {}, ["totalItems", "groupItems"], ["*"], true, never>;
702
+ }
703
+
704
+ /** `dxo-paging` — internal client paging. Presence enables paging; `[pageSize]`/`[pageIndex]` used. */
705
+ declare class NxePagingComponent {
706
+ readonly pageSize: _angular_core.InputSignal<number>;
707
+ readonly pageIndex: _angular_core.InputSignal<number>;
708
+ readonly enabled: _angular_core.InputSignal<boolean>;
709
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NxePagingComponent, never>;
710
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NxePagingComponent, "nxe-paging", never, { "pageSize": { "alias": "pageSize"; "required": false; "isSignal": true; }; "pageIndex": { "alias": "pageIndex"; "required": false; "isSignal": true; }; "enabled": { "alias": "enabled"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
711
+ }
712
+ /** `dxo-pager` — the pager UI config. */
713
+ declare class NxePagerComponent {
714
+ readonly visible: _angular_core.InputSignal<boolean | "auto">;
715
+ readonly allowedPageSizes: _angular_core.InputSignal<number[] | "auto">;
716
+ readonly showPageSizeSelector: _angular_core.InputSignal<boolean>;
717
+ readonly showNavigationButtons: _angular_core.InputSignal<boolean>;
718
+ readonly showInfo: _angular_core.InputSignal<boolean>;
719
+ readonly displayMode: _angular_core.InputSignal<"adaptive" | "compact" | "full">;
720
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NxePagerComponent, never>;
721
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NxePagerComponent, "nxe-pager", never, { "visible": { "alias": "visible"; "required": false; "isSignal": true; }; "allowedPageSizes": { "alias": "allowedPageSizes"; "required": false; "isSignal": true; }; "showPageSizeSelector": { "alias": "showPageSizeSelector"; "required": false; "isSignal": true; }; "showNavigationButtons": { "alias": "showNavigationButtons"; "required": false; "isSignal": true; }; "showInfo": { "alias": "showInfo"; "required": false; "isSignal": true; }; "displayMode": { "alias": "displayMode"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
722
+ }
723
+
724
+ /** A tracked inline change (matches the app's local `Change<T>` shape). */
725
+ interface NxeGridChange<T = any> {
726
+ type: 'insert' | 'update' | 'remove';
727
+ key: any;
728
+ data: Partial<T>;
729
+ }
730
+ /**
731
+ * `dxo-editing` — inline editing config. In this app editing is almost always template-driven
732
+ * (cell templates host `nxe-*` editors two-way-bound to `key.data.<field>`), so `mode="cell"` +
733
+ * `allowUpdating` are effectively decorative there. `mode="row"` with `[(changes)]`/`[(editRowKey)]`
734
+ * (autonumber-detail) and native cell editors (job-upsert) drive the grid's native inline editing.
735
+ */
736
+ declare class NxeEditingComponent {
737
+ readonly mode: _angular_core.InputSignal<"row" | "cell" | "batch">;
738
+ readonly allowUpdating: _angular_core.InputSignal<boolean>;
739
+ readonly allowAdding: _angular_core.InputSignal<boolean>;
740
+ readonly allowDeleting: _angular_core.InputSignal<boolean>;
741
+ /** Two-way tracked changes (autonumber-detail's `Change<T>[]`). */
742
+ readonly changes: _angular_core.ModelSignal<NxeGridChange<any>[]>;
743
+ /** Two-way key of the row currently in edit mode (row mode). */
744
+ readonly editRowKey: _angular_core.ModelSignal<any>;
745
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NxeEditingComponent, never>;
746
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NxeEditingComponent, "nxe-editing", never, { "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "allowUpdating": { "alias": "allowUpdating"; "required": false; "isSignal": true; }; "allowAdding": { "alias": "allowAdding"; "required": false; "isSignal": true; }; "allowDeleting": { "alias": "allowDeleting"; "required": false; "isSignal": true; }; "changes": { "alias": "changes"; "required": false; "isSignal": true; }; "editRowKey": { "alias": "editRowKey"; "required": false; "isSignal": true; }; }, { "changes": "changesChange"; "editRowKey": "editRowKeyChange"; }, never, never, true, never>;
747
+ }
748
+
749
+ /**
750
+ * `nxe-filter-row` — drop-in for DevExtreme `dxo-filter-row` (orbit addition; psak expressed
751
+ * the same config through the grid's `[filterRow]` object input, which remains supported).
752
+ * A no-render config element read by the parent `nxe-data-grid`.
753
+ */
754
+ declare class NxeFilterRowComponent {
755
+ readonly visible: _angular_core.InputSignal<boolean>;
756
+ /** DevExtreme parity (`auto`/`onClick`); the nxe filter row always applies on input. */
757
+ readonly applyFilter: _angular_core.InputSignal<string>;
758
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NxeFilterRowComponent, never>;
759
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NxeFilterRowComponent, "nxe-filter-row", never, { "visible": { "alias": "visible"; "required": false; "isSignal": true; }; "applyFilter": { "alias": "applyFilter"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
760
+ }
761
+
762
+ /**
763
+ * `nxe-master-detail` — drop-in for DevExtreme `dxo-master-detail` (orbit addition).
764
+ *
765
+ * A no-render config element read by the parent `nxe-data-grid`. When `enabled`, the grid
766
+ * prepends a `dx-command-expand` column; expanding a row renders a
767
+ * `<tr class="dx-master-detail-row">` hosting the named sibling
768
+ * `<ng-template nxeTemplate="...">` with `{ data, rowIndex, key }` — instantiated ONLY while
769
+ * expanded, preserving the app's lazy nested-grid loading (`onRowExpanding` fires first).
770
+ */
771
+ declare class NxeMasterDetailComponent {
772
+ readonly enabled: _angular_core.InputSignal<boolean>;
773
+ /** Name of the sibling `nxeTemplate` rendered as the detail section (default `detail`). */
774
+ readonly template: _angular_core.InputSignal<string>;
775
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NxeMasterDetailComponent, never>;
776
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NxeMasterDetailComponent, "nxe-master-detail", never, { "enabled": { "alias": "enabled"; "required": false; "isSignal": true; }; "template": { "alias": "template"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
777
+ }
778
+
779
+ /**
780
+ * `dxo-scrolling` — accepted for parity.
781
+ *
782
+ * Grid: the only usage is `rowRenderingMode="virtual"` (ledger-list), which renders only
783
+ * visible rows but loads all data; nxe-data-grid renders all rows (datasets are small
784
+ * enough), so it stays a no-op config there.
785
+ *
786
+ * Pivot (LIVE since W4 Lane 3): `NxePivotGridComponent` contentChild's this and
787
+ * `mode: 'virtual'` arms ROW WINDOWING — for `rowHeaderLayout: 'tree'` ONLY (the standard
788
+ * layout's rowspan-merged parent labels conflict with row slicing; DEFAULTS.md). Render-only:
789
+ * fixed 31px row pitch, spacer rows keep the scrollbar honest, and the model/export/chart
790
+ * always see every row. The DA page projects `mode="virtual"` but renders the standard
791
+ * layout → no-op there, dx-consistent with its pane-based virtual scrolling being a render
792
+ * optimization, never a data change.
793
+ */
794
+ declare class NxeScrollingComponent {
795
+ readonly mode: _angular_core.InputSignal<"standard" | "virtual" | "infinite">;
796
+ readonly rowRenderingMode: _angular_core.InputSignal<"standard" | "virtual">;
797
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NxeScrollingComponent, never>;
798
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NxeScrollingComponent, "nxe-scrolling", never, { "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "rowRenderingMode": { "alias": "rowRenderingMode"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
799
+ }
800
+
801
+ interface NxeExcelExportOptions {
802
+ /** File name (`.xlsx` appended if missing). */
803
+ fileName: string;
804
+ sheetName?: string;
805
+ /** Default true — sets the sheet auto-filter over the header range. */
806
+ autoFilter?: boolean;
807
+ /** Default true — defaults every cell font to 'Calibri Light' (form-report passes false). */
808
+ applyFont?: boolean;
809
+ }
810
+ /**
811
+ * Replacement for DevExtreme's `exportDataGrid({component, worksheet, autoFilterEnabled})`.
812
+ * Walks an {@link NxeGridInstance}'s currently-visible columns + filtered/sorted rows into an
813
+ * exceljs sheet (header row + autofilter + per-column numFmt), defaults the font to 'Calibri
814
+ * Light' (preserving the app's `formatExcel`), and saves via `nxeSaveAs` — matching the prior
815
+ * `report.helper.exportExcel` pipeline.
816
+ */
817
+ declare function exportNxeGridToExcel(grid: NxeGridInstance, opts: NxeExcelExportOptions): Promise<void>;
818
+ /** Options for {@link exportDataGrid} — mirrors DevExtreme's worksheet-injection call form. */
819
+ interface NxeExportDataGridOptions {
820
+ component: NxeGridInstance;
821
+ /**
822
+ * Caller-supplied worksheet — exceljs `Worksheet` or the in-house one; typed loosely
823
+ * because the two APIs are structural cousins, not the same declared type.
824
+ */
825
+ worksheet: any;
826
+ autoFilterEnabled?: boolean;
827
+ }
828
+ /**
829
+ * Drop-in for DevExtreme's `exportDataGrid({component, worksheet, autoFilterEnabled})`
830
+ * (orbit addition): writes the grid's visible columns + rows into the CALLER's worksheet —
831
+ * the caller keeps ownership of the workbook, post-formatting, and saving
832
+ * (`report.helper.exportExcel` pipeline).
833
+ */
834
+ declare function exportDataGrid(opts: NxeExportDataGridOptions): Promise<void>;
835
+
836
+ /**
837
+ * Pointer-based column-resize engine (dx `allowColumnResizing` parity).
838
+ *
839
+ * `widget` mode resizes only the dragged column — the table width follows; `nextColumn` (dx
840
+ * default) trades width with the next visible column at constant table width; both clamp at
841
+ * `columnMinWidth`. During the drag we write `<col>`/table widths directly (no change detection
842
+ * per pointermove); the grid commits the final widths into its override signal on release —
843
+ * freezing the layout exactly like dx does after the first manual resize.
844
+ */
845
+ interface NxeGridResizeHooks {
846
+ zone: NgZone;
847
+ host: () => HTMLElement;
848
+ mode: () => 'nextColumn' | 'widget';
849
+ minWidth: () => number;
850
+ /** Drag started — the grid pauses its auto-width engine. */
851
+ onStart: () => void;
852
+ /** Escape/pointercancel — inline styles were restored, resume auto-width. */
853
+ onCancel: () => void;
854
+ /** Final widths per affected column; the grid freezes overrides and emits width events. */
855
+ onCommit: (changes: {
856
+ field: string;
857
+ from: number;
858
+ to: number;
859
+ }[]) => void;
860
+ }
861
+ declare class NxeGridResizeController {
862
+ private readonly hooks;
863
+ private active;
864
+ private readonly suppression;
865
+ private readonly onMove;
866
+ private readonly onUp;
867
+ private readonly onCancelEv;
868
+ private readonly onKey;
869
+ constructor(hooks: NxeGridResizeHooks);
870
+ /** `visibleIndex`/`lead` locate the header cell + `<col>`; `nextField` only in nextColumn mode. */
871
+ start(field: string, nextField: string | null, visibleIndex: number, lead: number, event: PointerEvent): void;
872
+ consumeClick(): boolean;
873
+ destroy(): void;
874
+ private pointerMove;
875
+ private pointerUp;
876
+ private cancel;
877
+ private teardown;
878
+ }
879
+
880
+ /** dx filter-row operations (`selectedFilterOperation`). */
881
+ type NxeFilterOp = 'contains' | 'notcontains' | 'startswith' | 'endswith' | '=' | '<>' | '<' | '<=' | '>' | '>=' | 'between';
882
+ /** Flattened render rows when grouping or tree hierarchy is active. */
883
+ type GridRenderRow = {
884
+ kind: 'data';
885
+ row: any;
886
+ rowIndex: number;
887
+ level?: number;
888
+ hasChildren?: boolean;
889
+ expanded?: boolean;
890
+ nodeKey?: any;
891
+ } | {
892
+ kind: 'group';
893
+ level: number;
894
+ column: NxeColumnComponent;
895
+ text: string;
896
+ /** Raw group key, before formatting — dx hands this to `groupCellTemplate` as `value`. */
897
+ value: any;
898
+ /** The rows in this group, dx's `data` for a group cell. */
899
+ rows: readonly any[];
900
+ groupKey: string;
901
+ collapsed: boolean;
902
+ /** `alignByColumn` group sums keyed by target dataField (`showInColumn ?? column`). */
903
+ alignedSums: Map<string, string>;
904
+ /** Non-aligned group items appended to the caption — dx `Caption: Key (a, b)`. */
905
+ captionSuffix: string;
906
+ } | {
907
+ kind: 'groupFooter';
908
+ level: number;
909
+ /** Per-column formatted sums for items with `showInGroupFooter` (orbit addition). */
910
+ sums: Map<string, string>;
911
+ };
912
+ /** One `<td>` in the header, which may span columns (a band) or rows (a leaf above the bottom). */
913
+ interface NxeHeaderCell {
914
+ column: NxeColumnComponent;
915
+ colspan: number;
916
+ rowspan: number;
917
+ isBand: boolean;
918
+ /** Index into the visible leaf columns; null for a band, which sorts and resizes nothing. */
919
+ leafIndex: number | null;
920
+ }
921
+ /**
922
+ * `nxe-data-grid` — drop-in replacement for DevExtreme `dx-data-grid` (read-only core, slice 9a).
923
+ *
924
+ * Renders a single `<table>` emitting the dx DOM-class contract (`dx-widget dx-datagrid`,
925
+ * `dx-row`/`dx-header-row`/`dx-data-row`/`dx-datagrid-headers`/`dx-datagrid-rowsview`, `td`s) so
926
+ * the globally-loaded `dx.light.css` + repo `_grid.scss` overrides style it pixel-for-pixel
927
+ * (4px cell padding, #f8fafc header, #525252 header text, row/hover/alt colours). Columns are
928
+ * collected from `nxe-column` content children; named `cellTemplate`s resolve to sibling
929
+ * `<ng-template nxeTemplate="name">` blocks rendered with `{ data, rowIndex, columnIndex, ... }`
930
+ * (the live row object, so in-cell `nxe-*` editors can write through `key.data.<field>`).
931
+ *
932
+ * The `.instance` facade exposes only what the app calls: `getSelectedRowsData()` (12 template
933
+ * sites), `refresh()` (13), `columnOption(field,'visible',bool)` (3). Selection UI, header-filter,
934
+ * grouping and summary land in slice 9b.
935
+ */
936
+ declare class NxeDataGridComponent implements OnDestroy {
937
+ private readonly elementRef;
938
+ private readonly overlay;
939
+ private readonly viewContainerRef;
940
+ private readonly ngZone;
941
+ private readonly defaults;
942
+ /** Pointer drag engine: drag-to-group, chip drag-out (ungroup), chip/column reorder. */
943
+ protected readonly drag: NxeGridDragController;
944
+ /** Pointer resize engine (dx allowColumnResizing). */
945
+ protected readonly resize: NxeGridResizeController;
946
+ private resizeActive;
947
+ /**
948
+ * Columns exactly as declared: top-level leaves and bands, bands still holding their children.
949
+ * Only the header model reads this — everything else wants leaves.
950
+ */
951
+ private readonly declaredColumns;
952
+ /**
953
+ * The data columns: bands flattened away, depth-first, in declaration order.
954
+ *
955
+ * Keeping `columns()` meaning "the columns that carry data" is what stops banded headers
956
+ * being a rewrite. Sorting, grouping, filtering, summaries, resize, export and the whole
957
+ * `<tbody>` are about leaves and continue to work untouched; bands exist only in `<thead>`.
958
+ */
959
+ protected readonly columns: _angular_core.Signal<readonly NxeColumnComponent[]>;
960
+ /** True when any declared column is a band, i.e. the header needs more than one row. */
961
+ protected readonly hasBands: _angular_core.Signal<boolean>;
962
+ private readonly templates;
963
+ protected readonly selection: _angular_core.Signal<NxeSelectionComponent>;
964
+ protected readonly headerFilter: _angular_core.Signal<NxeHeaderFilterComponent>;
965
+ protected readonly grouping: _angular_core.Signal<NxeGroupingComponent>;
966
+ protected readonly groupPanel: _angular_core.Signal<NxeGroupPanelComponent>;
967
+ protected readonly summaryCmp: _angular_core.Signal<NxeSummaryComponent>;
968
+ protected readonly pagingCmp: _angular_core.Signal<NxePagingComponent>;
969
+ protected readonly pagerCmp: _angular_core.Signal<NxePagerComponent>;
970
+ protected readonly editingCmp: _angular_core.Signal<NxeEditingComponent>;
971
+ protected readonly filterRowCmp: _angular_core.Signal<NxeFilterRowComponent>;
972
+ protected readonly masterDetail: _angular_core.Signal<NxeMasterDetailComponent>;
973
+ readonly dataSource: _angular_core.InputSignal<readonly any[]>;
974
+ readonly keyExpr: _angular_core.InputSignal<string>;
975
+ readonly hoverStateEnabledInput: _angular_core.InputSignal<boolean>;
976
+ readonly showColumnLinesInput: _angular_core.InputSignal<boolean>;
977
+ readonly showRowLinesInput: _angular_core.InputSignal<boolean>;
978
+ readonly showBordersInput: _angular_core.InputSignal<boolean>;
979
+ readonly wordWrapEnabledInput: _angular_core.InputSignal<boolean>;
980
+ readonly columnAutoWidthInput: _angular_core.InputSignal<boolean>;
981
+ readonly rowAlternationEnabledInput: _angular_core.InputSignal<boolean>;
982
+ /** dx resolves `nxe-tree-list` against the `treeList` slice, not `dataGrid`. */
983
+ private readonly widgetDefaults;
984
+ readonly hoverStateEnabled: _angular_core.Signal<boolean>;
985
+ readonly showColumnLines: _angular_core.Signal<boolean>;
986
+ readonly showRowLines: _angular_core.Signal<boolean>;
987
+ readonly showBorders: _angular_core.Signal<boolean>;
988
+ readonly wordWrapEnabled: _angular_core.Signal<boolean>;
989
+ readonly columnAutoWidth: _angular_core.Signal<boolean>;
990
+ readonly rowAlternationEnabled: _angular_core.Signal<boolean>;
991
+ readonly remoteOperations: _angular_core.InputSignal<any>;
992
+ /**
993
+ * dx `syncLookupFilterValues` — accepted, and deliberately inert. It asks dx to narrow a
994
+ * lookup column's header-filter list to the values still reachable under the other filters.
995
+ * This grid never cascades those lists for client arrays (see `hfBaseRows`), so `false` is
996
+ * already what it does; `true` is the option we do not honour.
997
+ * @nxeInert grid — parity/data-grid.yaml "syncLookupFilterValues".
998
+ */
999
+ readonly syncLookupFilterValues: _angular_core.InputSignal<boolean>;
1000
+ readonly columnMinWidth: _angular_core.InputSignal<number>;
1001
+ readonly noDataTextInput: _angular_core.InputSignal<string>;
1002
+ readonly noDataText: _angular_core.Signal<string>;
1003
+ readonly loadPanel: _angular_core.InputSignal<{
1004
+ enabled?: boolean;
1005
+ }>;
1006
+ readonly paging: _angular_core.InputSignal<{
1007
+ enabled?: boolean;
1008
+ pageSize?: number;
1009
+ }>;
1010
+ readonly filterRow: _angular_core.InputSignal<{
1011
+ visible?: boolean;
1012
+ }>;
1013
+ /** Object-input forms of the config elements (dx accepts both; orbit uses both styles). */
1014
+ readonly headerFilterOptions: _angular_core.InputSignal<{
1015
+ visible?: boolean;
1016
+ search?: {
1017
+ enabled?: boolean;
1018
+ };
1019
+ }>;
1020
+ readonly groupingOptions: _angular_core.InputSignal<{
1021
+ autoExpandAll?: boolean;
1022
+ }>;
1023
+ readonly groupPanelOptions: _angular_core.InputSignal<{
1024
+ visible?: boolean;
1025
+ }>;
1026
+ readonly scrolling: _angular_core.InputSignal<any>;
1027
+ readonly sorting: _angular_core.InputSignal<{
1028
+ mode?: "single" | "multiple" | "none";
1029
+ }>;
1030
+ readonly allowColumnResizing: _angular_core.InputSignal<boolean>;
1031
+ /** dx columnResizingMode: 'nextColumn' (default) trades width; 'widget' grows the table. */
1032
+ readonly columnResizingMode: _angular_core.InputSignal<"nextColumn" | "widget">;
1033
+ /** dx allowColumnReordering (default false — matches every dx-era template in this app). */
1034
+ readonly allowColumnReordering: _angular_core.InputSignal<boolean>;
1035
+ readonly repaintChangesOnly: _angular_core.InputSignal<boolean>;
1036
+ readonly showColumnHeaders: _angular_core.InputSignal<boolean>;
1037
+ readonly parentIdExpr: _angular_core.InputSignal<string>;
1038
+ readonly dataStructure: _angular_core.InputSignal<"plain" | "tree">;
1039
+ readonly rootValue: _angular_core.InputSignal<unknown>;
1040
+ readonly autoExpandAll: _angular_core.InputSignal<boolean>;
1041
+ readonly expandedRowKeys: _angular_core.ModelSignal<any[]>;
1042
+ /** Tree-list multi-select keys (`[(selectedRowKeys)]`); recursive via dxo-selection. */
1043
+ readonly selectedRowKeys: _angular_core.ModelSignal<any[]>;
1044
+ /**
1045
+ * Declarative cell merge (orbit addition, replaces the legacy `onCellPrepared` DOM surgery):
1046
+ * dataFields merged hierarchically left→right — consecutive rows with equal values render one
1047
+ * cell with `rowspan`; a break in an earlier field breaks all later fields.
1048
+ */
1049
+ readonly mergeColumns: _angular_core.InputSignal<readonly string[]>;
1050
+ readonly onSelectionChanged: _angular_core.OutputEmitterRef<NxeGridSelectionChangedEvent<any>>;
1051
+ readonly onRowClick: _angular_core.OutputEmitterRef<{
1052
+ data: any;
1053
+ rowIndex: number;
1054
+ component: NxeGridInstance;
1055
+ }>;
1056
+ /** Fires after the rendered row set changes (dx parity; used for post-render DOM work). */
1057
+ readonly onContentReady: _angular_core.OutputEmitterRef<{
1058
+ component: NxeGridInstance;
1059
+ element: HTMLElement;
1060
+ }>;
1061
+ /**
1062
+ * dx parity: `{ fullName: 'paging.pageIndex', value }` for internal paging and
1063
+ * `{ fullName: 'columns[<i>].groupIndex', previousValue, value }` for runtime grouping
1064
+ * changes (one event per gesture — the contract generic-list's persistence handler expects).
1065
+ */
1066
+ readonly onOptionChanged: _angular_core.OutputEmitterRef<NxeGridOptionChangedEvent>;
1067
+ /** Extra CSS classes for a data row (replaces dx `onRowPrepared` class tweaks). */
1068
+ readonly rowClass: _angular_core.InputSignal<(row: any) => string>;
1069
+ /**
1070
+ * dx `onCellPrepared` / `onRowPrepared`, fired once per rendered cell and row after the DOM
1071
+ * is written, with the real element for handlers that mutate it.
1072
+ *
1073
+ * Classic EventEmitters, NOT `output()`, for the same reason the pivot uses them: `.observed`
1074
+ * gates a per-cell walk, so a grid that binds neither pays nothing. That gate is the whole
1075
+ * cost model here — without it every grid would walk every cell on every render.
1076
+ *
1077
+ * `mergeColumns` and `rowClass` are the supported way to do what most handlers do; these
1078
+ * exist because applications carry handlers that cannot be rewritten.
1079
+ */
1080
+ readonly onCellPrepared: EventEmitter<NxeCellPreparedEvent<any>>;
1081
+ readonly onRowPrepared: EventEmitter<NxeRowPreparedEvent<any>>;
1082
+ protected rowClassFor(row: any): string;
1083
+ /** Master-detail expand lifecycle (fires before the detail template instantiates). */
1084
+ readonly onRowExpanding: _angular_core.OutputEmitterRef<{
1085
+ key: any;
1086
+ component: NxeGridInstance;
1087
+ }>;
1088
+ readonly onRowExpanded: _angular_core.OutputEmitterRef<{
1089
+ key: any;
1090
+ component: NxeGridInstance;
1091
+ }>;
1092
+ /** Set imperatively by `app-data-pagination-wrapper` (a group-count summary). Stored for 9b. */
1093
+ summary: any;
1094
+ private readonly hoveredIndex;
1095
+ private readonly sort;
1096
+ private readonly sortInit;
1097
+ private readonly visibilityOverride;
1098
+ /** Filter-row state per dataField (operation + typed text) — controlled editors read it back. */
1099
+ private readonly filterRowState;
1100
+ /**
1101
+ * Header-filter runtime overrides: field → allowed-key set, or `null` for "user explicitly
1102
+ * cleared" (a declarative `filterValues` seed must NOT resurrect after Select All → OK).
1103
+ * Absent field = untouched → the column's `filterValues` input seeds the filter (dx parity).
1104
+ */
1105
+ private readonly hfOverride;
1106
+ private readonly selectedSet;
1107
+ private readonly refreshTick;
1108
+ /**
1109
+ * Header-filter popup working state — the draft/search/tree machinery lives in
1110
+ * {@link NxeHeaderFilterModel} (extracted for pivot reuse, Phase 3a); the grid supplies
1111
+ * its rows/columns through the source adapter and keeps the aliases the specs poke.
1112
+ */
1113
+ protected readonly hf: NxeHeaderFilterModel<NxeColumnComponent>;
1114
+ protected readonly hfColumn: _angular_core.WritableSignal<NxeColumnComponent>;
1115
+ protected readonly hfDraft: _angular_core.WritableSignal<ReadonlySet<any>>;
1116
+ private hfOverlayRef?;
1117
+ protected readonly pageIndex: _angular_core.WritableSignal<number>;
1118
+ private readonly userPageSize;
1119
+ /** DevExtreme `.instance` facade — `#gridAll.instance.<method>()`. */
1120
+ private readonly facade;
1121
+ get instance(): NxeGridInstance;
1122
+ /** Guards against a handler that schedules another render re-entering the walk. */
1123
+ private preparedDepth;
1124
+ constructor();
1125
+ private readonly autoWidths;
1126
+ private readonly containerW;
1127
+ private resizeObserver;
1128
+ private autoWidthPending;
1129
+ private lastAutoWidthKey;
1130
+ private scheduleAutoWidthMeasure;
1131
+ private measureAutoWidths;
1132
+ /**
1133
+ * A column with no frozen/declared width appearing AFTER a manual resize froze the layout
1134
+ * (ungrouped chip, re-shown via columnOption): give it dx's default column width instead of
1135
+ * letting the pinned table width squeeze it to ~0.
1136
+ */
1137
+ private frozenColWidth;
1138
+ protected effectiveColWidth(col: NxeColumnComponent, idx: number): string | null;
1139
+ protected tableWidthStyle(): string;
1140
+ protected readonly selectionEnabled: _angular_core.Signal<boolean>;
1141
+ protected readonly selectionMode: _angular_core.Signal<"none" | "single" | "multiple">;
1142
+ protected readonly showCheckboxes: _angular_core.Signal<boolean>;
1143
+ /** Selected rows in dataSource order (stale refs from old data naturally filtered out). */
1144
+ protected readonly selectedRowsData: _angular_core.Signal<any[]>;
1145
+ protected readonly allSelected: _angular_core.Signal<boolean>;
1146
+ protected readonly someSelected: _angular_core.Signal<boolean>;
1147
+ private rowKey;
1148
+ private treeDescendantKeys;
1149
+ private toggleTreeSelection;
1150
+ private emitTreeSelectionChanged;
1151
+ /** `grouping.autoExpandAll` from the child element or object input; dx default is true. */
1152
+ private readonly groupAutoExpand;
1153
+ /** The current expand default — `expandAll()` flips it to true; an input change resets it. */
1154
+ private readonly groupExpandDefault;
1155
+ /**
1156
+ * Per-groupKey manual toggles. Reset when the autoExpandAll option flips or the group
1157
+ * configuration changes (dx repaints and re-applies the default; drag-created groups inherit it).
1158
+ */
1159
+ private readonly groupExpandOverride;
1160
+ private isGroupExpanded;
1161
+ protected readonly groupPanelVisible: _angular_core.Signal<boolean>;
1162
+ protected readonly isGrouped: _angular_core.Signal<boolean>;
1163
+ private readonly totalItems;
1164
+ private readonly groupItems;
1165
+ protected readonly hasTotalFooter: _angular_core.Signal<boolean>;
1166
+ /** Grand-total sums keyed by dataField → formatted text (alignByColumn placement). */
1167
+ protected readonly totalSums: _angular_core.Signal<Map<string, string>>;
1168
+ protected readonly pagingEnabled: _angular_core.Signal<boolean>;
1169
+ protected readonly effectivePageSize: _angular_core.Signal<number>;
1170
+ protected readonly pageCount: _angular_core.Signal<number>;
1171
+ /** The filtered/sorted rows visible on the current page (all rows when paging is off). */
1172
+ private readonly pagedRows;
1173
+ protected readonly pagerVisible: _angular_core.Signal<boolean>;
1174
+ protected readonly pageSizes: _angular_core.Signal<number[]>;
1175
+ protected readonly pageNumbers: _angular_core.Signal<number[]>;
1176
+ /** True when the host element is `<nxe-tree-list>` (vs `<nxe-data-grid>`). */
1177
+ protected readonly treeMode: boolean;
1178
+ private readonly expandOverride;
1179
+ /** Tree assembled from the flat dataSource via keyExpr/parentIdExpr/rootValue. */
1180
+ private readonly treeRoots;
1181
+ private readonly treeExpanded;
1182
+ protected toggleTreeNode(key: any, event: Event): void;
1183
+ /** Flattened group + data render rows (tree hierarchy, then grouping, then flat). */
1184
+ protected readonly renderRows: _angular_core.Signal<GridRenderRow[]>;
1185
+ /** Computes + formats a summary item over a set of rows. */
1186
+ private summaryText;
1187
+ /**
1188
+ * DevExtreme `calculateCustomSummary` protocol replay (orbit addition): `start`, then
1189
+ * `calculate` once per row (`options.value` = the row object, matching the app's
1190
+ * `generateSummaryFunction` which reads row properties), then `finalize`.
1191
+ */
1192
+ private customSummaryValue;
1193
+ protected toggleGroup(groupKey: string): void;
1194
+ protected goToPage(index: number): void;
1195
+ protected prevPage(): void;
1196
+ protected nextPage(): void;
1197
+ protected changePageSize(size: number): void;
1198
+ protected onPageSizeSelect(event: Event): void;
1199
+ protected readonly pageInfo: _angular_core.Signal<string>;
1200
+ private static readonly fieldArrayEqual;
1201
+ /**
1202
+ * Declarative seed: ordered dataFields of columns declaring `groupIndex`. Custom equality so
1203
+ * unrelated column-input churn (captions, widths, lookups) can never reset runtime drag state.
1204
+ */
1205
+ private readonly declaredGroupFields;
1206
+ /**
1207
+ * THE group state — array order == group level. Runtime gestures (drag-to-group, chip
1208
+ * drag-out/reorder, clearGrouping) win until the declarative seed itself changes
1209
+ * (generic-list re-seeds `groupIndex` from localStorage through `filterResource`).
1210
+ */
1211
+ private readonly groupedFields;
1212
+ /**
1213
+ * Per-grouped-column sort direction (dx: grouping a column sorts it ascending; clicking its
1214
+ * group-panel chip cycles asc↔desc). Pruned to the currently grouped fields so a re-grouped
1215
+ * column starts fresh at `asc`.
1216
+ */
1217
+ private readonly groupSortDir;
1218
+ /** Columns moved into group rows, in group-level order. */
1219
+ protected readonly groupColumns: _angular_core.Signal<NxeColumnComponent[]>;
1220
+ /** The active sort direction of a grouped column (chip indicator + group-order comparator). */
1221
+ protected groupDir(col: NxeColumnComponent): 'asc' | 'desc';
1222
+ /** Chip click (dx): cycle the grouped column's sort asc↔desc — never back to none. */
1223
+ protected sortGroupColumn(col: NxeColumnComponent): void;
1224
+ /** Gesture: drag a header into the group panel — append as the last group level. */
1225
+ protected groupByColumn(col: NxeColumnComponent): void;
1226
+ /** Gesture: drag a chip out of the group panel — remove that group level. */
1227
+ protected ungroupColumn(field: string): void;
1228
+ /**
1229
+ * Gesture: reorder chips within the group panel — move a group level.
1230
+ *
1231
+ * Emission contract: generic-list's frozen handler replays each event as a positional SWAP,
1232
+ * while a chip drag is a MOVE. The two only coincide for adjacent positions, so a distance-n
1233
+ * move emits n adjacent-swap events (each adjacent swap == the corresponding move step) —
1234
+ * the replayed array converges to exactly the grid's order.
1235
+ */
1236
+ protected moveGroup(from: number, to: number): void;
1237
+ /**
1238
+ * Real dx `clearGrouping()`: ungroup everything. Removal events fire in DESCENDING level
1239
+ * order so generic-list's `splice(previousValue, 1)` replay converges to `[]`.
1240
+ */
1241
+ private clearGroupingInternal;
1242
+ private emitGroupIndexChange;
1243
+ private readonly declaredFieldOrder;
1244
+ /** Runtime column order; header drag-reorder wins until the declared column set changes. */
1245
+ private readonly fieldOrder;
1246
+ private readonly declaredWidthsKey;
1247
+ /**
1248
+ * Manual column widths (px). Populated on the first resize with a snapshot of every rendered
1249
+ * width — freezing the layout like dx — and reset when declared widths change.
1250
+ */
1251
+ private readonly widthOverride;
1252
+ /** Visible data columns: `visible`/`columnOption` honoured, grouped columns excluded. */
1253
+ protected readonly visibleColumns: _angular_core.Signal<NxeColumnComponent[]>;
1254
+ /**
1255
+ * How many header rows the band structure needs, counted over the VISIBLE tree.
1256
+ *
1257
+ * Pruning matters: a band whose every leaf is hidden or grouped away contributes no row, so
1258
+ * a grid that loses its last band collapses back to a single header row rather than keeping
1259
+ * an empty one.
1260
+ */
1261
+ protected readonly headerDepth: _angular_core.Signal<number>;
1262
+ /**
1263
+ * The header as rows of cells: bands carry `colspan`, leaves above the bottom row carry
1264
+ * `rowspan`, which is dx's own banded markup.
1265
+ */
1266
+ protected readonly headerRows: _angular_core.Signal<NxeHeaderCell[][]>;
1267
+ /** Drag-reorder drop: move visible column `fromVis` to insertion `slot` (dx visibleIndex). */
1268
+ protected moveColumnByVisible(fromVis: number, slot: number): void;
1269
+ /** True when this header renders a resize handle on its right edge. */
1270
+ protected resizeHandleVisible(col: NxeColumnComponent, ci: number): boolean;
1271
+ protected startColumnResize(col: NxeColumnComponent, ci: number, event: PointerEvent): void;
1272
+ /** Command columns preceding the data columns — the offset dx's 1-based aria-colindex counts from. */
1273
+ protected leadCellCount(): number;
1274
+ /** Resize commit: freeze all rendered widths (dx post-resize behavior) + emit width events. */
1275
+ private commitColumnResize;
1276
+ protected readonly filterRowVisible: _angular_core.Signal<boolean>;
1277
+ protected readonly masterDetailEnabled: _angular_core.Signal<boolean>;
1278
+ private readonly expandedDetails;
1279
+ protected isDetailExpanded(row: any): boolean;
1280
+ protected toggleDetail(row: any, event: Event): void;
1281
+ protected detailTemplate(): TemplateRef<unknown>;
1282
+ protected detailContext(row: any, rowIndex: number): {
1283
+ $implicit: {
1284
+ data: any;
1285
+ rowIndex: number;
1286
+ key: any;
1287
+ };
1288
+ };
1289
+ /** Group indent levels (dx renders one 30px command column per group level; grid mode only). */
1290
+ protected readonly groupLevelCount: _angular_core.Signal<number>;
1291
+ protected indents(count: number): number[];
1292
+ /** Visible columns from the first alignByColumn target onward — each gets its own summary td. */
1293
+ protected groupRowTrailing(item: {
1294
+ level: number;
1295
+ alignedSums: Map<string, string>;
1296
+ }): NxeColumnComponent[];
1297
+ /** dx group-cell span: everything after the expand cell not taken by aligned summary cells. */
1298
+ protected groupCellColspan(item: {
1299
+ level: number;
1300
+ alignedSums: Map<string, string>;
1301
+ }): number;
1302
+ /** Total column count including command columns (indents/checkbox/expand/edit) for colspans. */
1303
+ protected readonly allColCount: _angular_core.Signal<number>;
1304
+ protected readonly cellEditingEnabled: _angular_core.Signal<boolean>;
1305
+ protected readonly rowEditingEnabled: _angular_core.Signal<boolean>;
1306
+ protected readonly rowEditCommandVisible: _angular_core.Signal<boolean>;
1307
+ /** The single cell in edit mode (`cell` mode): row ref + dataField. */
1308
+ protected readonly editingCell: _angular_core.WritableSignal<{
1309
+ row: any;
1310
+ field: string;
1311
+ }>;
1312
+ /** Buffered values for the row in edit mode (`row` mode), keyed by dataField. */
1313
+ protected readonly rowEditBuffer: _angular_core.WritableSignal<Record<string, any>>;
1314
+ protected isEditingCell(row: any, col: NxeColumnComponent): boolean;
1315
+ protected isRowEditing(row: any): boolean;
1316
+ protected editableCell(col: NxeColumnComponent): boolean;
1317
+ protected onCellClick(row: any, col: NxeColumnComponent, event: Event): void;
1318
+ /** dx cell-mode semantics: commit to the row on blur/Enter (client-side array write-through). */
1319
+ protected commitCellEdit(row: any, col: NxeColumnComponent, rawInput: any): void;
1320
+ /** Write a cell value through the grid's own path, leaving edit state alone (dx `setValue`). */
1321
+ private writeCellValue;
1322
+ protected cancelCellEdit(): void;
1323
+ /**
1324
+ * Leave cell-edit state when focus goes somewhere outside the cell.
1325
+ *
1326
+ * The built-in editor commits on its own blur, but a projected `editCellTemplate` has no such
1327
+ * contract, so the cell needs to notice for itself. Nothing is committed here: those templates
1328
+ * write through the live row object, so leaving edit state is purely a view change.
1329
+ *
1330
+ * A projected picker opens its panel in a CDK overlay appended to `<body>`, which means focus
1331
+ * legitimately leaves the `<td>` while the edit is still going on — hence the second guard.
1332
+ */
1333
+ protected onEditCellFocusOut(row: any, col: NxeColumnComponent, event: FocusEvent): void;
1334
+ private writeCell;
1335
+ protected startRowEdit(row: any, event: Event): void;
1336
+ protected bufferRowEdit(col: NxeColumnComponent, rawInput: any): void;
1337
+ /** dx row-mode Save: apply the buffer to the row and record an `update` change. */
1338
+ protected saveRowEdit(row: any, event: Event): void;
1339
+ protected cancelRowEdit(event: Event): void;
1340
+ protected editorInputValue(row: any, col: NxeColumnComponent): string;
1341
+ /**
1342
+ * Rowspan map over `renderRows`: `"<renderIndex>:<field>"` → span (>1 = merged head,
1343
+ * 0 = suppressed continuation, absent = normal cell). Hierarchical: a value break in an
1344
+ * earlier merge column breaks all later ones; group/detail rows break every run.
1345
+ */
1346
+ protected readonly mergeSpans: _angular_core.Signal<ReadonlyMap<string, number>>;
1347
+ protected mergeSpan(renderIndex: number, col: NxeColumnComponent): number | null;
1348
+ protected isMergeSuppressed(renderIndex: number, col: NxeColumnComponent): boolean;
1349
+ private readonly columnByField;
1350
+ private readonly filterRowPredicate;
1351
+ /** Builds one column's filter-row matcher; null when the entry has no effective value yet. */
1352
+ private buildFilterRowMatcher;
1353
+ private matchScalar;
1354
+ private dayKey;
1355
+ /**
1356
+ * The applied header filters: runtime overrides win; untouched columns fall back to their
1357
+ * declarative `filterValues` seed. Values are normalized through `hfKey`.
1358
+ */
1359
+ private readonly effectiveHeaderFilters;
1360
+ private readonly headerFilterPredicate;
1361
+ /** dataSource → filter-row filters → header filters (sorting happens in `displayRows`). */
1362
+ private readonly filteredRows;
1363
+ /**
1364
+ * dx sort semantics: grouped columns lead the sort expression in level order (each by its
1365
+ * group direction), then the user/declarative sort applies WITHIN the innermost groups.
1366
+ * Ungrouped grids keep the single-column behavior unchanged.
1367
+ */
1368
+ protected readonly displayRows: _angular_core.Signal<any[]>;
1369
+ protected readonly loading: _angular_core.Signal<boolean>;
1370
+ /** The active sort: an explicit user click, else the first column declaring `sortOrder`. */
1371
+ private effectiveSort;
1372
+ protected align(col: NxeColumnComponent): string;
1373
+ protected colWidth(col: NxeColumnComponent): string | null;
1374
+ protected getRaw(row: any, dataField: string): any;
1375
+ /** Resolve the displayed cell text: lookup > customizeText > dataType/format > raw string. */
1376
+ /** dx parity: boolean values render as read-only checkboxes (dx dataType inference did this). */
1377
+ protected isBooleanCell(col: NxeColumnComponent, row: any): boolean;
1378
+ protected cellText(col: NxeColumnComponent, row: any): string;
1379
+ /** Column `lookup` resolution (orbit addition): raw value → display text via the lookup list. */
1380
+ private lookupText;
1381
+ private defaultFormat;
1382
+ protected templateFor(name: string | undefined): TemplateRef<unknown>;
1383
+ protected cellContext(row: any, rowIndex: number, columnIndex: number, col: NxeColumnComponent): {
1384
+ $implicit: NxeCellInfo;
1385
+ };
1386
+ protected editCellContext(row: any, rowIndex: number, columnIndex: number, col: NxeColumnComponent): {
1387
+ $implicit: NxeEditCellInfo;
1388
+ };
1389
+ protected groupCellContext(item: {
1390
+ column: NxeColumnComponent;
1391
+ text: string;
1392
+ value: any;
1393
+ rows: readonly any[];
1394
+ level: number;
1395
+ captionSuffix: string;
1396
+ }): {
1397
+ $implicit: NxeGroupCellInfo;
1398
+ };
1399
+ /**
1400
+ * dx `onCellPrepared` / `onRowPrepared`.
1401
+ *
1402
+ * Emitted from a render hook rather than an effect, because the payload carries the real
1403
+ * `<td>`: it cannot exist before the DOM does. `afterRenderEffect` is the sanctioned
1404
+ * primitive for that here, and the walk runs inside `untracked()` so a handler that happens
1405
+ * to read a signal cannot enrol it in this hook's dependency set — the invisible-dependency
1406
+ * failure the `effect()` ban exists to prevent.
1407
+ */
1408
+ private emitPreparedEvents;
1409
+ /** True when this header can start a drag gesture (to the group panel and/or a reorder). */
1410
+ protected headerDraggable(col: NxeColumnComponent): boolean;
1411
+ protected onHeaderPointerDown(col: NxeColumnComponent, ci: number, event: PointerEvent): void;
1412
+ protected onChipPointerDown(col: NxeColumnComponent, level: number, event: PointerEvent): void;
1413
+ /** Chip click (dx): toggle the grouped column's sort — unless this click ends a drag. */
1414
+ protected onChipClick(col: NxeColumnComponent): void;
1415
+ protected onHeaderClick(col: NxeColumnComponent): void;
1416
+ protected sortDir(col: NxeColumnComponent): 'asc' | 'desc' | null;
1417
+ protected onRowEnter(index: number): void;
1418
+ protected onRowLeave(): void;
1419
+ protected isHovered(index: number): boolean;
1420
+ protected isSelected(row: any): boolean;
1421
+ /** Row body click: single-select (LOV pickers) or toggle when checkboxes are hidden. */
1422
+ protected onDataRowClick(row: any, rowIndex?: number): void;
1423
+ protected onCheckboxClick(row: any, event: Event): void;
1424
+ private toggleRow;
1425
+ protected toggleSelectAll(event: Event): void;
1426
+ private emitSelectionChanged;
1427
+ private rowKeys;
1428
+ private static readonly STRING_OPS;
1429
+ private static readonly SCALAR_OPS;
1430
+ private static readonly OP_ICON_SLUGS;
1431
+ protected readonly frMenuColumn: _angular_core.WritableSignal<NxeColumnComponent>;
1432
+ private frMenuOverlayRef?;
1433
+ private readonly frMenuPanel;
1434
+ /** Which editor a filter cell renders (mirrors dx: select for lookup/boolean, typed inputs). */
1435
+ protected frEditorKind(col: NxeColumnComponent): 'lookup' | 'boolean' | 'date' | 'number' | 'text';
1436
+ /** dx shows the operation-chooser magnifier only for typed (non-select) editors. */
1437
+ protected frHasOpMenu(col: NxeColumnComponent): boolean;
1438
+ private frDefaultOp;
1439
+ protected frOp(col: NxeColumnComponent): NxeFilterOp;
1440
+ protected frText(col: NxeColumnComponent): string;
1441
+ protected frText2(col: NxeColumnComponent): string;
1442
+ protected frOpIconClass(col: NxeColumnComponent): string;
1443
+ protected opIconSlug(op: NxeFilterOp): string;
1444
+ protected setFilterRowText(col: NxeColumnComponent, text: string, second?: boolean): void;
1445
+ protected openFilterOpMenu(col: NxeColumnComponent, event: Event): void;
1446
+ protected frMenuOps(): {
1447
+ op: NxeFilterOp;
1448
+ label: string;
1449
+ }[];
1450
+ protected selectFilterOp(op: NxeFilterOp): void;
1451
+ /** dx Reset menu item: restore the default operation and clear the editor. */
1452
+ protected resetFilterRow(): void;
1453
+ protected closeFilterOpMenu(): void;
1454
+ protected readonly headerFilterEnabled: _angular_core.Signal<boolean>;
1455
+ protected hasHeaderFilter(col: NxeColumnComponent): boolean;
1456
+ /** Whether this column shows a funnel — the grid has header filtering on AND the column opts in.
1457
+ Named because the header cell asks three times (the caption's indicator class, the wrapper's
1458
+ existence, the funnel itself) and the group-panel chip asks again. */
1459
+ protected headerFilterVisible(col: NxeColumnComponent): boolean;
1460
+ /**
1461
+ * Normalizes a raw cell value to its header-filter key: blank-ish → the `(Blanks)` sentinel,
1462
+ * date columns → a `yyyy-MM-dd` day key (the tree's leaf unit), else the raw value.
1463
+ */
1464
+ private hfKey;
1465
+ /** dx does NOT cascade header-filter lists for client arrays (bright audit V6). */
1466
+ private hfBaseRows;
1467
+ private hfBoolLabel;
1468
+ /** (Select All) checkbox state — spec-pinned alias of the model's computed
1469
+ ((Select All) operates on the VISIBLE keys: dx scopes it to the search). */
1470
+ protected readonly hfAllChecked: _angular_core.Signal<boolean>;
1471
+ /** Default true — see NxeHeaderFilterComponent.searchEnabled. The two branches have to agree,
1472
+ since a grid can be configured either by the content child or by the object input. */
1473
+ protected hfSearchEnabled(): boolean;
1474
+ protected openHeaderFilter(col: NxeColumnComponent, event: Event): void;
1475
+ protected hfApply(): void;
1476
+ protected closeHeaderFilter(): void;
1477
+ private setColumnVisible;
1478
+ private compare;
1479
+ ngOnDestroy(): void;
1480
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NxeDataGridComponent, never>;
1481
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NxeDataGridComponent, "nxe-data-grid, nxe-tree-list", never, { "dataSource": { "alias": "dataSource"; "required": false; "isSignal": true; }; "keyExpr": { "alias": "keyExpr"; "required": false; "isSignal": true; }; "hoverStateEnabledInput": { "alias": "hoverStateEnabled"; "required": false; "isSignal": true; }; "showColumnLinesInput": { "alias": "showColumnLines"; "required": false; "isSignal": true; }; "showRowLinesInput": { "alias": "showRowLines"; "required": false; "isSignal": true; }; "showBordersInput": { "alias": "showBorders"; "required": false; "isSignal": true; }; "wordWrapEnabledInput": { "alias": "wordWrapEnabled"; "required": false; "isSignal": true; }; "columnAutoWidthInput": { "alias": "columnAutoWidth"; "required": false; "isSignal": true; }; "rowAlternationEnabledInput": { "alias": "rowAlternationEnabled"; "required": false; "isSignal": true; }; "remoteOperations": { "alias": "remoteOperations"; "required": false; "isSignal": true; }; "syncLookupFilterValues": { "alias": "syncLookupFilterValues"; "required": false; "isSignal": true; }; "columnMinWidth": { "alias": "columnMinWidth"; "required": false; "isSignal": true; }; "noDataTextInput": { "alias": "noDataText"; "required": false; "isSignal": true; }; "loadPanel": { "alias": "loadPanel"; "required": false; "isSignal": true; }; "paging": { "alias": "paging"; "required": false; "isSignal": true; }; "filterRow": { "alias": "filterRow"; "required": false; "isSignal": true; }; "headerFilterOptions": { "alias": "headerFilter"; "required": false; "isSignal": true; }; "groupingOptions": { "alias": "grouping"; "required": false; "isSignal": true; }; "groupPanelOptions": { "alias": "groupPanel"; "required": false; "isSignal": true; }; "scrolling": { "alias": "scrolling"; "required": false; "isSignal": true; }; "sorting": { "alias": "sorting"; "required": false; "isSignal": true; }; "allowColumnResizing": { "alias": "allowColumnResizing"; "required": false; "isSignal": true; }; "columnResizingMode": { "alias": "columnResizingMode"; "required": false; "isSignal": true; }; "allowColumnReordering": { "alias": "allowColumnReordering"; "required": false; "isSignal": true; }; "repaintChangesOnly": { "alias": "repaintChangesOnly"; "required": false; "isSignal": true; }; "showColumnHeaders": { "alias": "showColumnHeaders"; "required": false; "isSignal": true; }; "parentIdExpr": { "alias": "parentIdExpr"; "required": false; "isSignal": true; }; "dataStructure": { "alias": "dataStructure"; "required": false; "isSignal": true; }; "rootValue": { "alias": "rootValue"; "required": false; "isSignal": true; }; "autoExpandAll": { "alias": "autoExpandAll"; "required": false; "isSignal": true; }; "expandedRowKeys": { "alias": "expandedRowKeys"; "required": false; "isSignal": true; }; "selectedRowKeys": { "alias": "selectedRowKeys"; "required": false; "isSignal": true; }; "mergeColumns": { "alias": "mergeColumns"; "required": false; "isSignal": true; }; "rowClass": { "alias": "rowClass"; "required": false; "isSignal": true; }; }, { "expandedRowKeys": "expandedRowKeysChange"; "selectedRowKeys": "selectedRowKeysChange"; "onSelectionChanged": "onSelectionChanged"; "onRowClick": "onRowClick"; "onContentReady": "onContentReady"; "onOptionChanged": "onOptionChanged"; "onCellPrepared": "onCellPrepared"; "onRowPrepared": "onRowPrepared"; "onRowExpanding": "onRowExpanding"; "onRowExpanded": "onRowExpanded"; }, ["declaredColumns", "templates", "selection", "headerFilter", "grouping", "groupPanel", "summaryCmp", "pagingCmp", "pagerCmp", "editingCmp", "filterRowCmp", "masterDetail"], never, true, never>;
1482
+ }
1483
+
1484
+ export { NXE_HF_BLANKS, NxeColumnComponent, NxeDataGridComponent, NxeDragGesture, NxeEditingComponent, NxeFilterRowComponent, NxeGestureClickSuppression, NxeGridDragController, NxeGroupItemComponent, NxeGroupPanelComponent, NxeGroupingComponent, NxeHeaderFilterComponent, NxeHeaderFilterModel, NxeHeaderFilterPanelComponent, NxeMasterDetailComponent, NxePagerComponent, NxePagingComponent, NxeScrollingComponent, NxeSelectionComponent, NxeSummaryComponent, NxeTotalItemComponent, exportDataGrid, exportNxeGridToExcel, nxeDatePattern, nxeDefaultFormat, nxeExcelNumFmt, nxeFormatNumberValue, nxeHfKey, nxeNumberMask, openNxeHeaderFilterOverlay };
1485
+ export type { NxeCellInfo, NxeCellPreparedEvent, NxeColumnFormat, NxeColumnFormatObject, NxeCustomizeText, NxeDragGestureDelegate, NxeEditCellInfo, NxeExcelExportOptions, NxeExportColumn, NxeExportDataGridOptions, NxeFilterOp, NxeGridChange, NxeGridDragHooks, NxeGridInstance, NxeGridOptionChangedEvent, NxeGridSelectionChangedEvent, NxeGroupCellInfo, NxeHeaderCell, NxeHeaderFilterOverlayOptions, NxeHeaderFilterSource, NxeHfDateNode, NxeRowInfo, NxeRowPreparedEvent, NxeRowType, NxeSummaryItemLike, NxeTreeListNode };