@nexterajs/ui 0.0.2 → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. package/README.md +279 -34
  2. package/fesm2022/nexterajs-ui-charts.mjs +1096 -0
  3. package/fesm2022/nexterajs-ui-charts.mjs.map +1 -0
  4. package/fesm2022/nexterajs-ui-core.mjs +652 -12
  5. package/fesm2022/nexterajs-ui-core.mjs.map +1 -1
  6. package/fesm2022/nexterajs-ui-display.mjs +1142 -0
  7. package/fesm2022/nexterajs-ui-display.mjs.map +1 -0
  8. package/fesm2022/nexterajs-ui-dropdowns.mjs +321 -33
  9. package/fesm2022/nexterajs-ui-dropdowns.mjs.map +1 -1
  10. package/fesm2022/nexterajs-ui-file-uploader.mjs +572 -10
  11. package/fesm2022/nexterajs-ui-file-uploader.mjs.map +1 -1
  12. package/fesm2022/nexterajs-ui-forms.mjs +2027 -136
  13. package/fesm2022/nexterajs-ui-forms.mjs.map +1 -1
  14. package/fesm2022/nexterajs-ui-grid.mjs +1222 -188
  15. package/fesm2022/nexterajs-ui-grid.mjs.map +1 -1
  16. package/fesm2022/nexterajs-ui-intl.mjs +103 -11
  17. package/fesm2022/nexterajs-ui-intl.mjs.map +1 -1
  18. package/fesm2022/nexterajs-ui-navigation.mjs +1054 -0
  19. package/fesm2022/nexterajs-ui-navigation.mjs.map +1 -0
  20. package/fesm2022/nexterajs-ui-notify.mjs +46 -44
  21. package/fesm2022/nexterajs-ui-notify.mjs.map +1 -1
  22. package/fesm2022/nexterajs-ui-overlay.mjs +1671 -0
  23. package/fesm2022/nexterajs-ui-overlay.mjs.map +1 -0
  24. package/fesm2022/nexterajs-ui-pivot.mjs +51 -26
  25. package/fesm2022/nexterajs-ui-pivot.mjs.map +1 -1
  26. package/fesm2022/nexterajs-ui-shell.mjs +542 -0
  27. package/fesm2022/nexterajs-ui-shell.mjs.map +1 -0
  28. package/fesm2022/nexterajs-ui-tree-view.mjs +5 -2
  29. package/fesm2022/nexterajs-ui-tree-view.mjs.map +1 -1
  30. package/fesm2022/nexterajs-ui-validation.mjs +42 -11
  31. package/fesm2022/nexterajs-ui-validation.mjs.map +1 -1
  32. package/fesm2022/nexterajs-ui.mjs +5 -0
  33. package/fesm2022/nexterajs-ui.mjs.map +1 -1
  34. package/package.json +33 -2
  35. package/styles/_dropdown.scss +5 -5
  36. package/styles/_editor.scss +52 -17
  37. package/styles/_mixins.scss +1 -1
  38. package/styles/_scrollbar.scss +5 -5
  39. package/styles/_status.scss +21 -0
  40. package/styles/_toast.scss +14 -14
  41. package/styles/_tokens.scss +420 -3
  42. package/styles/_widget.scss +14 -3
  43. package/styles/index.scss +6 -4
  44. package/types/nexterajs-ui-charts.d.ts +446 -0
  45. package/types/nexterajs-ui-core.d.ts +387 -22
  46. package/types/nexterajs-ui-display.d.ts +720 -0
  47. package/types/nexterajs-ui-dropdowns.d.ts +191 -48
  48. package/types/nexterajs-ui-file-uploader.d.ts +236 -7
  49. package/types/nexterajs-ui-forms.d.ts +675 -30
  50. package/types/nexterajs-ui-grid.d.ts +448 -93
  51. package/types/nexterajs-ui-intl.d.ts +39 -4
  52. package/types/nexterajs-ui-navigation.d.ts +531 -0
  53. package/types/nexterajs-ui-notify.d.ts +4 -2
  54. package/types/nexterajs-ui-overlay.d.ts +703 -0
  55. package/types/nexterajs-ui-pivot.d.ts +56 -48
  56. package/types/nexterajs-ui-shell.d.ts +294 -0
  57. package/types/nexterajs-ui-tree-view.d.ts +6 -3
  58. package/types/nexterajs-ui-validation.d.ts +20 -11
  59. package/types/nexterajs-ui.d.ts +5 -0
@@ -1,8 +1,9 @@
1
1
  import { NxeNumberSeparators } from '@nexterajs/ui/intl';
2
2
  import * as _angular_core from '@angular/core';
3
- import { NgZone, ViewContainerRef, OnDestroy, EventEmitter, TemplateRef } from '@angular/core';
4
- import { NxeExpr } from '@nexterajs/ui/core';
3
+ import { NgZone, ViewContainerRef, Signal, OnDestroy, InputSignal, EventEmitter, TemplateRef } from '@angular/core';
4
+ import { NxeExpr, NxeMessageService, NxeMessageKey } from '@nexterajs/ui/core';
5
5
  import { Overlay, OverlayRef } from '@angular/cdk/overlay';
6
+ import { Observable } from 'rxjs';
6
7
 
7
8
  /** A DevExtreme-style column `format`: a number-mask string, a date format string, or `{ type }`. */
8
9
  interface NxeColumnFormatObject {
@@ -184,6 +185,13 @@ interface NxeTreeListNode<T = any> {
184
185
  interface NxeGridInstance<T = any> {
185
186
  getSelectedRowsData(): T[];
186
187
  getSelectedRowKeys(): T[];
188
+ /** dx `clearSelection()`: deselects every row, including rows the current filter hides. */
189
+ clearSelection(): void;
190
+ /**
191
+ * dx `deselectAll()`: deselects the rows the current filter shows (the current page of a
192
+ * server-side grid). A tree list deselects every node.
193
+ */
194
+ deselectAll(): void;
187
195
  refresh(): void;
188
196
  /**
189
197
  * dx `clearFilter()`: no argument clears the filter row AND header filters (including
@@ -277,7 +285,7 @@ declare function nxeNumberValue(raw: unknown): number;
277
285
  * JS number meets any valid `format`, whatever the column declared. So a number in an untyped
278
286
  * or string column still takes its mask, and a number column honours object formats as well.
279
287
  */
280
- declare function nxeDefaultFormat(dataType: NxeColumnDataType | 'object' | undefined, format: NxeColumnFormat | undefined, raw: any, separators?: NxeNumberSeparators): string;
288
+ declare function nxeDefaultFormat(dataType: NxeColumnDataType | 'object' | undefined, format: NxeColumnFormat | undefined, raw: any, separators?: NxeNumberSeparators, locale?: string): string;
281
289
 
282
290
  /**
283
291
  * `nxe-header-filter` — drop-in replacement for DevExtreme `dxo-header-filter` (grid child option).
@@ -291,9 +299,9 @@ declare class NxeHeaderFilterComponent {
291
299
  readonly visible: _angular_core.InputSignal<boolean>;
292
300
  readonly search: _angular_core.InputSignal<{
293
301
  enabled?: boolean;
294
- }>;
302
+ } | undefined>;
295
303
  /** Legacy alias for `search.enabled` (one holdout). */
296
- readonly allowSearch: _angular_core.InputSignal<boolean>;
304
+ readonly allowSearch: _angular_core.InputSignal<boolean | undefined>;
297
305
  /**
298
306
  * dx `headerFilter.dataSource` — a fixed `{ text, value }` list shown instead of the values
299
307
  * derived from the rows.
@@ -301,7 +309,7 @@ declare class NxeHeaderFilterComponent {
301
309
  readonly dataSource: _angular_core.InputSignal<readonly {
302
310
  text?: string;
303
311
  value?: any;
304
- }[]>;
312
+ }[] | undefined>;
305
313
  /** Whether the in-popup search box shows.
306
314
  *
307
315
  * Defaults to **true**, matching the legacy DevExtreme deployment: a popup listing every
@@ -329,17 +337,17 @@ declare class NxeColumnComponent {
329
337
  * Unset = dx: inferred from the loaded data (m_columns_controller.js:914-975), so a numeric
330
338
  * column nobody typed still right-aligns and honours its `format`. Declaring it wins.
331
339
  */
332
- readonly dataType: _angular_core.InputSignal<NxeColumnDataType>;
340
+ readonly dataType: _angular_core.InputSignal<NxeColumnDataType | undefined>;
333
341
  /** px width — number (`[width]="150"`) or numeric string (`width="200"`). */
334
- readonly width: _angular_core.InputSignal<string | number>;
335
- readonly minWidth: _angular_core.InputSignal<string | number>;
336
- readonly alignment: _angular_core.InputSignal<"left" | "center" | "right">;
342
+ readonly width: _angular_core.InputSignal<string | number | undefined>;
343
+ readonly minWidth: _angular_core.InputSignal<string | number | undefined>;
344
+ readonly alignment: _angular_core.InputSignal<"left" | "center" | "right" | undefined>;
337
345
  /** Number-mask string (`#,##0.00`), date format string, or `{ type: 'dd MMM yyyy' }`. */
338
- readonly format: _angular_core.InputSignal<NxeColumnFormat>;
346
+ readonly format: _angular_core.InputSignal<NxeColumnFormat | undefined>;
339
347
  /** `(info:{value}) => string` (e.g. `formatAccounting` for parenthesized negatives). */
340
- readonly customizeText: _angular_core.InputSignal<NxeCustomizeText>;
348
+ readonly customizeText: _angular_core.InputSignal<NxeCustomizeText | undefined>;
341
349
  /** Name of a sibling `<ng-template nxeTemplate="...">` to render the cell. */
342
- readonly cellTemplate: _angular_core.InputSignal<string>;
350
+ readonly cellTemplate: _angular_core.InputSignal<string | undefined>;
343
351
  /**
344
352
  * DevExtreme column `lookup` (orbit addition): raw values resolve to display text through
345
353
  * `dataSource` (`{ lookup: { dataSource, valueExpr: 'lovCode', displayExpr: 'lovName' } }`).
@@ -349,7 +357,7 @@ declare class NxeColumnComponent {
349
357
  dataSource: readonly any[];
350
358
  valueExpr?: NxeExpr;
351
359
  displayExpr?: NxeExpr;
352
- }>;
360
+ } | undefined>;
353
361
  readonly allowSorting: _angular_core.InputSignal<boolean>;
354
362
  /** dx parity: whether the header can be dragged into the group panel (default true). */
355
363
  readonly allowGrouping: _angular_core.InputSignal<boolean>;
@@ -361,18 +369,18 @@ declare class NxeColumnComponent {
361
369
  readonly allowSearch: _angular_core.InputSignal<boolean>;
362
370
  readonly allowHeaderFiltering: _angular_core.InputSignal<boolean>;
363
371
  readonly visible: _angular_core.InputSignal<boolean>;
364
- readonly sortOrder: _angular_core.InputSignal<"asc" | "desc">;
365
- readonly sortIndex: _angular_core.InputSignal<number>;
366
- readonly groupIndex: _angular_core.InputSignal<number>;
372
+ readonly sortOrder: _angular_core.InputSignal<"asc" | "desc" | undefined>;
373
+ readonly sortIndex: _angular_core.InputSignal<number | undefined>;
374
+ readonly groupIndex: _angular_core.InputSignal<number | undefined>;
367
375
  readonly fixed: _angular_core.InputSignal<boolean>;
368
- readonly filterValues: _angular_core.InputSignal<any[]>;
376
+ readonly filterValues: _angular_core.InputSignal<any[] | undefined>;
369
377
  /** Column `type` (only `type="date"` seen — a display hint, NOT a command column). */
370
- readonly type: _angular_core.InputSignal<string>;
378
+ readonly type: _angular_core.InputSignal<string | undefined>;
371
379
  /**
372
380
  * dx `cssClass` — extra classes on this column's header, filter and data cells. The escape
373
381
  * hatch for one-off cell styling that does not warrant a `cellTemplate`.
374
382
  */
375
- readonly cssClass: _angular_core.InputSignal<string>;
383
+ readonly cssClass: _angular_core.InputSignal<string | undefined>;
376
384
  /**
377
385
  * dx `editCellTemplate` — the sibling `<ng-template nxeTemplate="NAME">` rendered while this
378
386
  * cell is being edited, in place of the built-in editor. Its context is a
@@ -380,12 +388,12 @@ declare class NxeColumnComponent {
380
388
  * `ctx.data.field = $event` writes straight through, which is how dx's own edit templates
381
389
  * were used.
382
390
  */
383
- readonly editCellTemplate: _angular_core.InputSignal<string>;
391
+ readonly editCellTemplate: _angular_core.InputSignal<string | undefined>;
384
392
  /**
385
393
  * dx `groupCellTemplate` — replaces the `"Caption: value"` text in a group row's caption
386
394
  * cell when this column is the one grouped by.
387
395
  */
388
- readonly groupCellTemplate: _angular_core.InputSignal<string>;
396
+ readonly groupCellTemplate: _angular_core.InputSignal<string | undefined>;
389
397
  /**
390
398
  * Child columns declared inside this one — dx's banded header. Empty for an ordinary column.
391
399
  *
@@ -397,7 +405,7 @@ declare class NxeColumnComponent {
397
405
  * A `<nxe-header-filter>` declared inside this column, dx's per-column `headerFilter`
398
406
  * config. Only its `dataSource` is read here; visibility and search stay grid-level.
399
407
  */
400
- readonly headerFilterConfig: _angular_core.Signal<NxeHeaderFilterComponent>;
408
+ readonly headerFilterConfig: _angular_core.Signal<NxeHeaderFilterComponent | undefined>;
401
409
  /** dx `isBand`: a column that groups other columns under a shared header instead of a field. */
402
410
  readonly isBand: _angular_core.Signal<boolean>;
403
411
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<NxeColumnComponent, never>;
@@ -595,16 +603,26 @@ interface NxeHeaderFilterSource<C> {
595
603
  text: string;
596
604
  }[] | null;
597
605
  }
606
+ /** The words the popup writes itself; each a function so a host can read a signal inside it. */
607
+ interface NxeHeaderFilterLabels {
608
+ blanks(): string;
609
+ yes(): string;
610
+ no(): string;
611
+ /** Month name for a 1-based month number. */
612
+ month(month: number): string;
613
+ }
598
614
  declare class NxeHeaderFilterModel<C = unknown> {
599
615
  private readonly source;
600
- private static readonly MONTH_NAMES;
616
+ private readonly labels;
601
617
  /** The column whose popup is open (`null` = closed). */
602
- readonly column: _angular_core.WritableSignal<C>;
618
+ readonly column: _angular_core.WritableSignal<C | null>;
603
619
  /** The checked key set being edited in the popup (committed by the host on OK). */
604
620
  readonly draft: _angular_core.WritableSignal<ReadonlySet<any>>;
605
621
  readonly search: _angular_core.WritableSignal<string>;
606
622
  readonly expanded: _angular_core.WritableSignal<ReadonlySet<string>>;
607
- constructor(source: NxeHeaderFilterSource<C>);
623
+ constructor(source: NxeHeaderFilterSource<C>, labels?: NxeHeaderFilterLabels);
624
+ /** The popup's wording for a boolean bucket. */
625
+ private boolText;
608
626
  /** This column's header-filter key for a raw value. */
609
627
  key(column: C, raw: any): any;
610
628
  /** Distinct {key, text} for the open column — `(Blanks)` first, then Yes/No or values ascending. */
@@ -674,6 +692,8 @@ declare class NxeHeaderFilterModel<C = unknown> {
674
692
  * the panel itself never touches the host's filter state.
675
693
  */
676
694
  declare class NxeHeaderFilterPanelComponent {
695
+ /** The library's runtime-switchable messages. */
696
+ protected readonly messages: NxeMessageService;
677
697
  readonly model: _angular_core.InputSignal<NxeHeaderFilterModel<any>>;
678
698
  /** Live predicate (re-read every CD, like the grid template did) — a mid-open config
679
699
  change to `search.enabled` still shows/hides the box. */
@@ -746,15 +766,15 @@ declare abstract class NxeSummaryItemBase implements NxeSummaryItemLike {
746
766
  readonly column: _angular_core.InputSignal<string>;
747
767
  readonly summaryType: _angular_core.InputSignal<"sum" | "count" | "min" | "max" | "avg" | "custom">;
748
768
  /** Identifier passed to `calculateCustomSummary` for `summaryType='custom'` items. */
749
- readonly name: _angular_core.InputSignal<string>;
769
+ readonly name: _angular_core.InputSignal<string | undefined>;
750
770
  /** Positional template; `{0}` is replaced by the customized/formatted value. */
751
771
  readonly displayFormat: _angular_core.InputSignal<string>;
752
- readonly customizeText: _angular_core.InputSignal<NxeCustomizeText>;
753
- readonly valueFormat: _angular_core.InputSignal<NxeColumnFormat>;
772
+ readonly customizeText: _angular_core.InputSignal<NxeCustomizeText | undefined>;
773
+ readonly valueFormat: _angular_core.InputSignal<NxeColumnFormat | undefined>;
754
774
  readonly alignByColumn: _angular_core.InputSignal<boolean>;
755
775
  /** Render this group aggregate in a footer row under the group instead of the group row. */
756
776
  readonly showInGroupFooter: _angular_core.InputSignal<boolean>;
757
- readonly showInColumn: _angular_core.InputSignal<string>;
777
+ readonly showInColumn: _angular_core.InputSignal<string | undefined>;
758
778
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<NxeSummaryItemBase, never>;
759
779
  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>;
760
780
  }
@@ -775,7 +795,7 @@ declare class NxeSummaryComponent {
775
795
  * `{name, summaryProcess:'start'}`, then `'calculate'` once per row (`options.value` = the
776
796
  * row object), then `'finalize'`; the handler mutates `options.totalValue`.
777
797
  */
778
- readonly calculateCustomSummary: _angular_core.InputSignal<(options: any) => void>;
798
+ readonly calculateCustomSummary: _angular_core.InputSignal<((options: any) => void) | undefined>;
779
799
  readonly totalItems: _angular_core.Signal<readonly NxeTotalItemComponent[]>;
780
800
  readonly groupItems: _angular_core.Signal<readonly NxeGroupItemComponent[]>;
781
801
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<NxeSummaryComponent, never>;
@@ -806,9 +826,9 @@ declare class NxePagerComponent {
806
826
  */
807
827
  readonly displayMode: _angular_core.InputSignal<"adaptive" | "compact" | "full">;
808
828
  /** dx `pager.infoText`: `{0}` the page, `{1}` the page count, `{2}` the item count. */
809
- readonly infoText: _angular_core.InputSignal<string>;
829
+ readonly infoText: _angular_core.InputSignal<string | undefined>;
810
830
  /** dx `pager.label`: the pager's accessible name. */
811
- readonly label: _angular_core.InputSignal<string>;
831
+ readonly label: _angular_core.InputSignal<string | undefined>;
812
832
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<NxePagerComponent, never>;
813
833
  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; }; "infoText": { "alias": "infoText"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
814
834
  }
@@ -846,7 +866,7 @@ declare class NxeEditingComponent {
846
866
  declare class NxeFilterRowComponent {
847
867
  readonly visible: _angular_core.InputSignal<boolean>;
848
868
  /** DevExtreme parity (`auto`/`onClick`); the nxe filter row always applies on input. */
849
- readonly applyFilter: _angular_core.InputSignal<string>;
869
+ readonly applyFilter: _angular_core.InputSignal<string | undefined>;
850
870
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<NxeFilterRowComponent, never>;
851
871
  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>;
852
872
  }
@@ -925,6 +945,171 @@ interface NxeExportDataGridOptions {
925
945
  */
926
946
  declare function exportDataGrid(opts: NxeExportDataGridOptions): Promise<void>;
927
947
 
948
+ /** One sort level: DevExtreme's `{ selector, desc }`. */
949
+ interface NxeSortDescriptor {
950
+ /** The column's `dataField`. */
951
+ selector: string;
952
+ desc: boolean;
953
+ }
954
+ /** Operators a filter-row or header-filter condition can carry (DevExtreme's filter operations). */
955
+ type NxeFilterOperator = '=' | '<>' | '<' | '<=' | '>' | '>=' | 'contains' | 'notcontains' | 'startswith' | 'endswith';
956
+ /**
957
+ * A DevExtreme-style filter expression, the shape the grid's filter row and header filter produce
958
+ * for a remote source:
959
+ *
960
+ * - a condition: `['name', 'contains', 'acme']`
961
+ * - a negation: `['!', expression]`
962
+ * - a group: `[expression, 'and', expression, 'or', expression]`, which may nest
963
+ *
964
+ * `between` is expanded the way DevExtreme expands it: `[[f, '>=', a], 'and', [f, '<=', b]]`.
965
+ * Values are JSON-safe: strings, numbers, booleans and `null`; dates are `'yyyy-MM-dd'` strings.
966
+ */
967
+ type NxeFilterExpression = readonly unknown[];
968
+ /** What the application (or the grid) states: the page, its size, the sort and the filter. */
969
+ interface NxeRemoteQuery {
970
+ /** 0-based page index. */
971
+ pageIndex: number;
972
+ pageSize: number;
973
+ sort: readonly NxeSortDescriptor[];
974
+ filter: NxeFilterExpression | null;
975
+ }
976
+ /**
977
+ * What `load` receives: the query plus the same page as `skip`/`take`, so an adapter can take
978
+ * whichever the endpoint speaks (`pageNo = pageIndex + 1`, or `offset = skip`).
979
+ */
980
+ interface NxeLoadOptions extends NxeRemoteQuery {
981
+ readonly skip: number;
982
+ readonly take: number;
983
+ /** Always `true`: the grid needs the total to draw its pager. DevExtreme `CustomStore` parity. */
984
+ readonly requireTotalCount: true;
985
+ }
986
+ interface NxeLoadResult<T = any> {
987
+ data: readonly T[];
988
+ /** Rows matching the filter across every page. */
989
+ totalCount: number;
990
+ }
991
+ interface NxeLoadContext {
992
+ /** Aborted when a newer request supersedes this one, or the source is cancelled or destroyed. */
993
+ readonly signal: AbortSignal;
994
+ }
995
+ /** The load function: a promise or an observable (an `HttpClient` call passes straight in). */
996
+ type NxeRemoteLoadFn<T = any> = (options: NxeLoadOptions, context: NxeLoadContext) => Promise<NxeLoadResult<T> | readonly T[]> | Observable<NxeLoadResult<T> | readonly T[]>;
997
+ interface NxeRemoteDataSourceConfig {
998
+ /** The row key field. The grid takes its `keyExpr` from here when none is bound. */
999
+ key?: string;
1000
+ /** The query the first load runs with. Anything left out is page 0, 20 rows, no sort, no filter. */
1001
+ initial?: Partial<NxeRemoteQuery>;
1002
+ /** Milliseconds a grid waits after the last filter-row keystroke before asking. Default 300. */
1003
+ filterDebounce?: number;
1004
+ }
1005
+ /** The default page size of a source (and of a remote grid with no `nxe-paging`). */
1006
+ declare const NXE_REMOTE_DEFAULT_PAGE_SIZE = 20;
1007
+ /** Structural equality of two queries; what keeps a re-stated, unchanged query from reloading. */
1008
+ declare function nxeSameQuery(a: NxeRemoteQuery, b: NxeRemoteQuery): boolean;
1009
+ /** Builds the load options for a query. */
1010
+ declare function nxeLoadOptions(query: NxeRemoteQuery): NxeLoadOptions;
1011
+ /**
1012
+ * One condition of a flattened filter, in the form a REST adapter wants. `in` is an OR of `=` on one
1013
+ * field (a header-filter selection), with all its values.
1014
+ */
1015
+ interface NxeFlatFilterCondition {
1016
+ field: string;
1017
+ operator: NxeFilterOperator | 'in';
1018
+ value: unknown;
1019
+ }
1020
+ /**
1021
+ * Flattens the AND-chain a grid builds into simple conditions, for endpoints that take a flat
1022
+ * parameter list (`status=sent,confirmed&supplierId=123`). An OR of `=` on one field becomes one
1023
+ * `in` condition. `exact` is `false` when part of the expression could not be flattened (a `!`, or
1024
+ * an OR across fields); those parts are left out of `conditions`, so an adapter that cannot take
1025
+ * `exact: false` should send the expression as JSON instead.
1026
+ */
1027
+ declare function nxeFlattenFilter(filter: NxeFilterExpression | null | undefined): {
1028
+ conditions: NxeFlatFilterCondition[];
1029
+ exact: boolean;
1030
+ };
1031
+ /** Combines expressions with AND; `null` and empty ones are dropped, a single one is returned as is. */
1032
+ declare function nxeFilterAnd(...parts: readonly (NxeFilterExpression | null | undefined)[]): NxeFilterExpression | null;
1033
+ /** Combines expressions with OR, as {@link nxeFilterAnd} does with AND. */
1034
+ declare function nxeFilterOr(...parts: readonly (NxeFilterExpression | null | undefined)[]): NxeFilterExpression | null;
1035
+ /**
1036
+ * A server-backed list for `nxe-data-grid` and `nxe-paginator`. It holds one page at a time:
1037
+ * the grid (or the app) states a query, the source asks the server for exactly that page, and the
1038
+ * result lands in signals.
1039
+ *
1040
+ * ```ts
1041
+ * readonly orders = new NxeRemoteDataSource<Order>(
1042
+ * (o, { signal }) => this.http.get<OrderList>('/api/orders', { params: toParams(o) }).pipe(map(toResult)),
1043
+ * { key: 'id' },
1044
+ * );
1045
+ * ```
1046
+ *
1047
+ * A request still in flight is aborted (its `AbortSignal` fires, or its observable is
1048
+ * unsubscribed) when a newer one starts, and a late response that slips past is ignored, so the
1049
+ * rows on screen always belong to the latest query.
1050
+ *
1051
+ * The source is lazy: nothing loads until {@link setOptions} or {@link reload} is called, which a
1052
+ * grid bound to it does on its own.
1053
+ */
1054
+ declare class NxeRemoteDataSource<T = any> {
1055
+ private readonly loadFn;
1056
+ /** The row key field, when the source was given one. */
1057
+ readonly key: string | undefined;
1058
+ /** Milliseconds a grid waits after the last filter-row keystroke before asking. */
1059
+ readonly filterDebounce: number;
1060
+ private readonly itemsState;
1061
+ private readonly totalCountState;
1062
+ private readonly loadingState;
1063
+ private readonly errorState;
1064
+ private readonly loadedState;
1065
+ private readonly queryState;
1066
+ private readonly optionsState;
1067
+ /** The rows of the current page. Kept (not cleared) while the next page loads. */
1068
+ readonly items: Signal<readonly T[]>;
1069
+ /** Rows matching the filter across every page, as the last successful response said. */
1070
+ readonly totalCount: Signal<number>;
1071
+ /** A request is in flight. */
1072
+ readonly loading: Signal<boolean>;
1073
+ /** The last request's failure, or `null` after a success or while a retry runs. */
1074
+ readonly error: Signal<unknown>;
1075
+ /** A response has arrived at least once. */
1076
+ readonly loaded: Signal<boolean>;
1077
+ /** The query and the `skip`/`take` of the page the next (or current) request uses. */
1078
+ readonly options: Signal<NxeLoadOptions>;
1079
+ private started;
1080
+ private seq;
1081
+ private controller;
1082
+ private unsubscribe;
1083
+ constructor(loadFn: NxeRemoteLoadFn<T>, config?: NxeRemoteDataSourceConfig);
1084
+ /**
1085
+ * States a new query (any of its parts) and loads it. Nothing happens when it is the query
1086
+ * already stated, so a caller can re-state its inputs freely. The first call starts the source.
1087
+ */
1088
+ setOptions(patch: Partial<NxeRemoteQuery>): void;
1089
+ /** Loads the current query again (after an edit, or as a retry). */
1090
+ reload(): void;
1091
+ /** Aborts the request in flight and ignores its response. */
1092
+ cancel(): void;
1093
+ private abort;
1094
+ private run;
1095
+ /** The last value an observable emits; rejects when it errors or completes empty. */
1096
+ private fromObservable;
1097
+ }
1098
+ /** A DevExtreme `CustomStore`-shaped source: what `remoteOperations` makes the grid load page by page. */
1099
+ interface NxeStoreLike<T = any> {
1100
+ load: NxeRemoteLoadFn<T>;
1101
+ key?: string;
1102
+ }
1103
+ /** True for an object with a `load` function that is not an array or a {@link NxeRemoteDataSource}. */
1104
+ declare function nxeIsStoreLike(value: unknown): value is NxeStoreLike;
1105
+
1106
+ /**
1107
+ * The pager's page list and info text, as DevExtreme 24.2.3's pagination builds them.
1108
+ *
1109
+ * Pure functions, so the grid holds the only state (the sliding window, carried between renders
1110
+ * by a linkedSignal) and the rules can be specced without rendering a grid.
1111
+ */
1112
+
928
1113
  /** One entry of the page list: a page button, or dx's `. . .` separator. */
929
1114
  interface NxePagerItem {
930
1115
  /** Stable track key: the page index, or `low` / `high` for the separators. */
@@ -934,6 +1119,54 @@ interface NxePagerItem {
934
1119
  readonly separator: boolean;
935
1120
  }
936
1121
 
1122
+ /**
1123
+ * A page navigator that stands on its own: page buttons with the grid pager's sliding window,
1124
+ * previous/next, a page-size selector and the total. Use it beside any list, or bind it to the same
1125
+ * state a remote grid pages with.
1126
+ *
1127
+ * ```html
1128
+ * <nxe-paginator [(pageIndex)]="page" [(pageSize)]="size" [totalCount]="orders.totalCount()" />
1129
+ * ```
1130
+ *
1131
+ * Text comes from `NxeMessageService`, so it follows the language. The nav is a labelled
1132
+ * `navigation` landmark; the current page carries `aria-current="page"`. With focus on a page
1133
+ * button, Left/Right move to the previous/next page and Home/End to the first/last.
1134
+ */
1135
+ declare class NxePaginatorComponent {
1136
+ private readonly messages;
1137
+ private readonly separators;
1138
+ private readonly host;
1139
+ private readonly injector;
1140
+ /** The 0-based current page. Two-way. */
1141
+ readonly pageIndex: _angular_core.ModelSignal<number>;
1142
+ /** Rows per page. Two-way; changing it returns to the first page. */
1143
+ readonly pageSize: _angular_core.ModelSignal<number>;
1144
+ /** Rows across every page. */
1145
+ readonly totalCount: _angular_core.InputSignalWithTransform<number, unknown>;
1146
+ /** The sizes the selector offers. The current size is always offered too. */
1147
+ readonly pageSizes: _angular_core.InputSignal<readonly number[]>;
1148
+ readonly showPageSizeSelector: _angular_core.InputSignalWithTransform<boolean, unknown>;
1149
+ readonly showInfo: _angular_core.InputSignalWithTransform<boolean, unknown>;
1150
+ /** Greys the controls out and ignores clicks, e.g. while a page loads. */
1151
+ readonly disabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
1152
+ /** The navigation landmark's accessible name; default is the `grid.pager.navigation` message. */
1153
+ readonly label: _angular_core.InputSignal<string | undefined>;
1154
+ protected t(key: NxeMessageKey, ...args: readonly unknown[]): string;
1155
+ protected readonly pageCount: _angular_core.Signal<number>;
1156
+ /** The page shown: `pageIndex` held inside the page count. */
1157
+ protected readonly currentPage: _angular_core.Signal<number>;
1158
+ private readonly window;
1159
+ protected readonly items: _angular_core.Signal<readonly NxePagerItem[]>;
1160
+ protected readonly sizes: _angular_core.Signal<number[]>;
1161
+ protected readonly info: _angular_core.Signal<string>;
1162
+ protected readonly total: _angular_core.Signal<string>;
1163
+ protected go(index: number): void;
1164
+ protected onSizeChange(event: Event): void;
1165
+ protected onKeydown(event: KeyboardEvent): void;
1166
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NxePaginatorComponent, never>;
1167
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NxePaginatorComponent, "nxe-paginator", never, { "pageIndex": { "alias": "pageIndex"; "required": false; "isSignal": true; }; "pageSize": { "alias": "pageSize"; "required": false; "isSignal": true; }; "totalCount": { "alias": "totalCount"; "required": false; "isSignal": true; }; "pageSizes": { "alias": "pageSizes"; "required": false; "isSignal": true; }; "showPageSizeSelector": { "alias": "showPageSizeSelector"; "required": false; "isSignal": true; }; "showInfo": { "alias": "showInfo"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "label": { "alias": "label"; "required": false; "isSignal": true; }; }, { "pageIndex": "pageIndexChange"; "pageSize": "pageSizeChange"; }, never, never, true, never>;
1168
+ }
1169
+
937
1170
  /**
938
1171
  * Pointer-based column-resize engine (dx `allowColumnResizing` parity).
939
1172
  *
@@ -947,6 +1180,8 @@ interface NxeGridResizeHooks {
947
1180
  zone: NgZone;
948
1181
  host: () => HTMLElement;
949
1182
  mode: () => 'nextColumn' | 'widget';
1183
+ /** Widget mode only: the trailing column takes what a narrowed table leaves of the rows view. */
1184
+ fillsGrid: () => boolean;
950
1185
  minWidth: () => number;
951
1186
  /** Drag started — the grid pauses its auto-width engine. */
952
1187
  onStart: () => void;
@@ -974,6 +1209,7 @@ declare class NxeGridResizeController {
974
1209
  destroy(): void;
975
1210
  private pointerMove;
976
1211
  private pointerUp;
1212
+ private restore;
977
1213
  private cancel;
978
1214
  private teardown;
979
1215
  }
@@ -1050,6 +1286,9 @@ declare class NxeDataGridComponent implements OnDestroy {
1050
1286
  private readonly defaults;
1051
1287
  /** Locale separators for every number this grid renders — cells, summaries and group text. */
1052
1288
  private readonly separators;
1289
+ private readonly messages;
1290
+ /** One library message for the active language; reading it in a template re-renders on a switch. */
1291
+ protected t(key: NxeMessageKey, ...args: readonly unknown[]): string;
1053
1292
  /** Pointer drag engine: drag-to-group, chip drag-out (ungroup), chip/column reorder. */
1054
1293
  protected readonly drag: NxeGridDragController;
1055
1294
  /** Pointer resize engine (dx allowColumnResizing). */
@@ -1071,35 +1310,70 @@ declare class NxeDataGridComponent implements OnDestroy {
1071
1310
  /** True when any declared column is a band, i.e. the header needs more than one row. */
1072
1311
  protected readonly hasBands: _angular_core.Signal<boolean>;
1073
1312
  private readonly templates;
1074
- protected readonly selection: _angular_core.Signal<NxeSelectionComponent>;
1075
- protected readonly headerFilter: _angular_core.Signal<NxeHeaderFilterComponent>;
1076
- protected readonly grouping: _angular_core.Signal<NxeGroupingComponent>;
1077
- protected readonly groupPanel: _angular_core.Signal<NxeGroupPanelComponent>;
1078
- protected readonly summaryCmp: _angular_core.Signal<NxeSummaryComponent>;
1079
- protected readonly pagingCmp: _angular_core.Signal<NxePagingComponent>;
1080
- protected readonly pagerCmp: _angular_core.Signal<NxePagerComponent>;
1081
- protected readonly editingCmp: _angular_core.Signal<NxeEditingComponent>;
1082
- protected readonly filterRowCmp: _angular_core.Signal<NxeFilterRowComponent>;
1083
- protected readonly masterDetail: _angular_core.Signal<NxeMasterDetailComponent>;
1084
- readonly dataSource: _angular_core.InputSignal<readonly any[]>;
1085
- readonly keyExpr: _angular_core.InputSignal<string>;
1086
- readonly hoverStateEnabledInput: _angular_core.InputSignal<boolean>;
1087
- readonly showColumnLinesInput: _angular_core.InputSignal<boolean>;
1088
- readonly showRowLinesInput: _angular_core.InputSignal<boolean>;
1089
- readonly showBordersInput: _angular_core.InputSignal<boolean>;
1090
- readonly wordWrapEnabledInput: _angular_core.InputSignal<boolean>;
1091
- readonly columnAutoWidthInput: _angular_core.InputSignal<boolean>;
1092
- readonly rowAlternationEnabledInput: _angular_core.InputSignal<boolean>;
1313
+ protected readonly selection: _angular_core.Signal<NxeSelectionComponent | undefined>;
1314
+ protected readonly headerFilter: _angular_core.Signal<NxeHeaderFilterComponent | undefined>;
1315
+ protected readonly grouping: _angular_core.Signal<NxeGroupingComponent | undefined>;
1316
+ protected readonly groupPanel: _angular_core.Signal<NxeGroupPanelComponent | undefined>;
1317
+ protected readonly summaryCmp: _angular_core.Signal<NxeSummaryComponent | undefined>;
1318
+ protected readonly pagingCmp: _angular_core.Signal<NxePagingComponent | undefined>;
1319
+ protected readonly pagerCmp: _angular_core.Signal<NxePagerComponent | undefined>;
1320
+ protected readonly editingCmp: _angular_core.Signal<NxeEditingComponent | undefined>;
1321
+ protected readonly filterRowCmp: _angular_core.Signal<NxeFilterRowComponent | undefined>;
1322
+ protected readonly masterDetail: _angular_core.Signal<NxeMasterDetailComponent | undefined>;
1323
+ /**
1324
+ * The rows: a plain array (paged, sorted and filtered here), a {@link NxeRemoteDataSource}
1325
+ * (paged, sorted and filtered by the server; the grid holds one page), or, with
1326
+ * `remoteOperations` on, a `CustomStore`-shaped `{ load, key? }`.
1327
+ */
1328
+ readonly dataSource: InputSignal<readonly any[] | NxeStoreLike<any> | NxeRemoteDataSource<any> | null | undefined>;
1329
+ readonly keyExpr: InputSignal<string | undefined>;
1330
+ readonly hoverStateEnabledInput: InputSignal<boolean | undefined>;
1331
+ readonly showColumnLinesInput: InputSignal<boolean | undefined>;
1332
+ readonly showRowLinesInput: InputSignal<boolean | undefined>;
1333
+ readonly showBordersInput: InputSignal<boolean | undefined>;
1334
+ readonly wordWrapEnabledInput: InputSignal<boolean | undefined>;
1335
+ readonly columnAutoWidthInput: InputSignal<boolean | undefined>;
1336
+ readonly rowAlternationEnabledInput: InputSignal<boolean | undefined>;
1337
+ readonly resizeFillsGridInput: InputSignal<boolean | undefined>;
1093
1338
  /** dx resolves `nxe-tree-list` against the `treeList` slice, not `dataGrid`. */
1094
1339
  private readonly widgetDefaults;
1095
1340
  readonly hoverStateEnabled: _angular_core.Signal<boolean>;
1341
+ /**
1342
+ * Widget-mode resizing that never leaves a blank strip: the trailing column takes whatever a
1343
+ * narrowed layout leaves of the grid's width. Not dx - dx lets the table end short - so off
1344
+ * unless bound or set app-wide through `NXE_DEFAULT_OPTIONS`.
1345
+ */
1346
+ readonly resizeFillsGrid: _angular_core.Signal<boolean>;
1096
1347
  readonly showColumnLines: _angular_core.Signal<boolean>;
1097
1348
  readonly showRowLines: _angular_core.Signal<boolean>;
1098
1349
  readonly showBorders: _angular_core.Signal<boolean>;
1099
1350
  readonly wordWrapEnabled: _angular_core.Signal<boolean>;
1100
1351
  readonly columnAutoWidth: _angular_core.Signal<boolean>;
1101
1352
  readonly rowAlternationEnabled: _angular_core.Signal<boolean>;
1102
- readonly remoteOperations: _angular_core.InputSignal<any>;
1353
+ /**
1354
+ * dx `remoteOperations`. With a `{ load }` store as the `dataSource`, any truthy value makes the
1355
+ * grid page, sort and filter on the server (`{ paging, sorting, filtering }` is read as all or
1356
+ * nothing). A {@link NxeRemoteDataSource} is remote whatever this says.
1357
+ */
1358
+ readonly remoteOperations: InputSignal<any>;
1359
+ /** The 0-based page. Two-way. */
1360
+ readonly pageIndexModel: _angular_core.ModelSignal<number | undefined>;
1361
+ /** Rows per page. Two-way. */
1362
+ readonly pageSizeModel: _angular_core.ModelSignal<number | undefined>;
1363
+ /** The sort, `[{ selector, desc }]`. Two-way; a header click writes its single level here. */
1364
+ readonly sortModel: _angular_core.ModelSignal<readonly NxeSortDescriptor[] | undefined>;
1365
+ /**
1366
+ * A filter the application owns (a filter bar, a status tab), in {@link NxeFilterExpression}
1367
+ * form. A remote grid ANDs it with the filter row and header filter and sends the lot to the
1368
+ * server. Changing it returns the grid to the first page.
1369
+ */
1370
+ readonly filter: InputSignal<NxeFilterExpression | null | undefined>;
1371
+ /**
1372
+ * The options of every request a remote grid hands its source: page, size, sort and the
1373
+ * combined filter. One emission per distinct request, after filter-row typing settles. This is
1374
+ * where an application mirrors the grid's state into the URL.
1375
+ */
1376
+ readonly optionsChange: _angular_core.OutputEmitterRef<NxeLoadOptions>;
1103
1377
  /**
1104
1378
  * dx `syncLookupFilterValues` — accepted, and deliberately inert. It asks dx to narrow a
1105
1379
  * lookup column's header-filter list to the values still reachable under the other filters.
@@ -1107,55 +1381,55 @@ declare class NxeDataGridComponent implements OnDestroy {
1107
1381
  * already what it does; `true` is the option we do not honour.
1108
1382
  * @nxeInert grid — parity/data-grid.yaml "syncLookupFilterValues".
1109
1383
  */
1110
- readonly syncLookupFilterValues: _angular_core.InputSignal<boolean>;
1111
- readonly columnMinWidth: _angular_core.InputSignal<number>;
1384
+ readonly syncLookupFilterValues: InputSignal<boolean>;
1385
+ readonly columnMinWidth: InputSignal<number | undefined>;
1112
1386
  /** dx `height` — a bare number means px, anything else passes through. */
1113
- readonly height: _angular_core.InputSignal<string | number>;
1114
- protected readonly heightStyle: _angular_core.Signal<string>;
1115
- readonly noDataTextInput: _angular_core.InputSignal<string>;
1387
+ readonly height: InputSignal<string | number | undefined>;
1388
+ protected readonly heightStyle: _angular_core.Signal<string | null>;
1389
+ readonly noDataTextInput: InputSignal<string | undefined>;
1116
1390
  readonly noDataText: _angular_core.Signal<string>;
1117
- readonly loadPanel: _angular_core.InputSignal<{
1391
+ readonly loadPanel: InputSignal<{
1118
1392
  enabled?: boolean;
1119
- }>;
1120
- readonly paging: _angular_core.InputSignal<{
1393
+ } | undefined>;
1394
+ readonly paging: InputSignal<{
1121
1395
  enabled?: boolean;
1122
1396
  pageSize?: number;
1123
- }>;
1124
- readonly filterRow: _angular_core.InputSignal<{
1397
+ } | undefined>;
1398
+ readonly filterRow: InputSignal<{
1125
1399
  visible?: boolean;
1126
- }>;
1400
+ } | undefined>;
1127
1401
  /** Object-input forms of the config elements (dx accepts both; orbit uses both styles). */
1128
- readonly headerFilterOptions: _angular_core.InputSignal<{
1402
+ readonly headerFilterOptions: InputSignal<{
1129
1403
  visible?: boolean;
1130
1404
  search?: {
1131
1405
  enabled?: boolean;
1132
1406
  };
1133
- }>;
1134
- readonly groupingOptions: _angular_core.InputSignal<{
1407
+ } | undefined>;
1408
+ readonly groupingOptions: InputSignal<{
1135
1409
  autoExpandAll?: boolean;
1136
- }>;
1137
- readonly groupPanelOptions: _angular_core.InputSignal<{
1410
+ } | undefined>;
1411
+ readonly groupPanelOptions: InputSignal<{
1138
1412
  visible?: boolean;
1139
- }>;
1140
- readonly scrolling: _angular_core.InputSignal<any>;
1413
+ } | undefined>;
1414
+ readonly scrolling: InputSignal<any>;
1141
1415
  /**
1142
1416
  * dx `sorting`. Unbound means dx's default mode 'single'. `false` and `null` are accepted as dx
1143
1417
  * reads them - no mode, so headers keep their sort slot but a click never sorts.
1144
1418
  */
1145
- readonly sorting: _angular_core.InputSignal<false | {
1419
+ readonly sorting: InputSignal<false | {
1146
1420
  mode?: "single" | "multiple" | "none";
1147
- }>;
1148
- readonly allowColumnResizing: _angular_core.InputSignal<boolean>;
1421
+ } | null | undefined>;
1422
+ readonly allowColumnResizing: InputSignal<boolean>;
1149
1423
  /** dx columnResizingMode: 'nextColumn' (default) trades width; 'widget' grows the table. */
1150
- readonly columnResizingMode: _angular_core.InputSignal<"nextColumn" | "widget">;
1424
+ readonly columnResizingMode: InputSignal<"nextColumn" | "widget">;
1151
1425
  /** dx allowColumnReordering (default false — matches every dx-era template in this app). */
1152
- readonly allowColumnReordering: _angular_core.InputSignal<boolean>;
1153
- readonly repaintChangesOnly: _angular_core.InputSignal<boolean>;
1154
- readonly showColumnHeaders: _angular_core.InputSignal<boolean>;
1155
- readonly parentIdExpr: _angular_core.InputSignal<string>;
1156
- readonly dataStructure: _angular_core.InputSignal<"plain" | "tree">;
1157
- readonly rootValue: _angular_core.InputSignal<unknown>;
1158
- readonly autoExpandAll: _angular_core.InputSignal<boolean>;
1426
+ readonly allowColumnReordering: InputSignal<boolean>;
1427
+ readonly repaintChangesOnly: InputSignal<boolean>;
1428
+ readonly showColumnHeaders: InputSignal<boolean>;
1429
+ readonly parentIdExpr: InputSignal<string | undefined>;
1430
+ readonly dataStructure: InputSignal<"plain" | "tree">;
1431
+ readonly rootValue: InputSignal<unknown>;
1432
+ readonly autoExpandAll: InputSignal<boolean>;
1159
1433
  readonly expandedRowKeys: _angular_core.ModelSignal<any[]>;
1160
1434
  /** Tree-list multi-select keys (`[(selectedRowKeys)]`); recursive via dxo-selection. */
1161
1435
  readonly selectedRowKeys: _angular_core.ModelSignal<any[]>;
@@ -1164,7 +1438,7 @@ declare class NxeDataGridComponent implements OnDestroy {
1164
1438
  * dataFields merged hierarchically left→right — consecutive rows with equal values render one
1165
1439
  * cell with `rowspan`; a break in an earlier field breaks all later fields.
1166
1440
  */
1167
- readonly mergeColumns: _angular_core.InputSignal<readonly string[]>;
1441
+ readonly mergeColumns: InputSignal<readonly string[]>;
1168
1442
  readonly onSelectionChanged: _angular_core.OutputEmitterRef<NxeGridSelectionChangedEvent<any>>;
1169
1443
  readonly onRowClick: _angular_core.OutputEmitterRef<{
1170
1444
  data: any;
@@ -1183,7 +1457,7 @@ declare class NxeDataGridComponent implements OnDestroy {
1183
1457
  */
1184
1458
  readonly onOptionChanged: _angular_core.OutputEmitterRef<NxeGridOptionChangedEvent>;
1185
1459
  /** Extra CSS classes for a data row (replaces dx `onRowPrepared` class tweaks). */
1186
- readonly rowClass: _angular_core.InputSignal<(row: any) => string>;
1460
+ readonly rowClass: InputSignal<((row: any) => string) | undefined>;
1187
1461
  /**
1188
1462
  * dx `onCellPrepared` / `onRowPrepared`, fired once per rendered cell and row after the DOM
1189
1463
  * is written, with the real element for handlers that mutate it.
@@ -1229,7 +1503,7 @@ declare class NxeDataGridComponent implements OnDestroy {
1229
1503
  * its rows/columns through the source adapter and keeps the aliases the specs poke.
1230
1504
  */
1231
1505
  protected readonly hf: NxeHeaderFilterModel<NxeColumnComponent>;
1232
- protected readonly hfColumn: _angular_core.WritableSignal<NxeColumnComponent>;
1506
+ protected readonly hfColumn: _angular_core.WritableSignal<NxeColumnComponent | null>;
1233
1507
  protected readonly hfDraft: _angular_core.WritableSignal<ReadonlySet<any>>;
1234
1508
  private hfOverlayRef?;
1235
1509
  /**
@@ -1262,17 +1536,53 @@ declare class NxeDataGridComponent implements OnDestroy {
1262
1536
  */
1263
1537
  private frozenColWidth;
1264
1538
  protected effectiveColWidth(col: NxeColumnComponent, idx: number): string | null;
1539
+ /** What a frozen layout's columns add up to, the command columns included. */
1540
+ private frozenTableWidth;
1541
+ /**
1542
+ * With `resizeFillsGrid`, the room a frozen widget-mode layout leaves on the right, which the
1543
+ * trailing column takes. 0 when the columns fill or overflow the grid - that table scrolls.
1544
+ */
1545
+ private readonly frozenSlack;
1265
1546
  protected tableWidthStyle(): string;
1266
1547
  protected readonly selectionEnabled: _angular_core.Signal<boolean>;
1267
1548
  protected readonly selectionMode: _angular_core.Signal<"none" | "single" | "multiple">;
1268
1549
  protected readonly showCheckboxes: _angular_core.Signal<boolean>;
1550
+ /**
1551
+ * The detached checkbox column. A tree list has none: dx draws its row checkbox in the first
1552
+ * cell, after the expander, and its select-all in the first column's header.
1553
+ */
1554
+ protected readonly selectColumnVisible: _angular_core.Signal<boolean>;
1555
+ protected readonly treeSelectAll: _angular_core.Signal<boolean>;
1556
+ private readonly recursiveTreeSelection;
1557
+ /**
1558
+ * Each node's recursive selection state as dx draws it: `all` when its key is selected or an
1559
+ * ancestor's is, or when every child is; `some` when only some descendants are; absent for none.
1560
+ * Keys hold the selection, so the hierarchy - not the key list - decides what a parent shows.
1561
+ */
1562
+ private readonly treeCheckState;
1563
+ /** Parent of each tree node, for settling ancestors after a recursive toggle. */
1564
+ private readonly treeParents;
1269
1565
  /** Selected rows in dataSource order (stale refs from old data naturally filtered out). */
1270
1566
  protected readonly selectedRowsData: _angular_core.Signal<any[]>;
1271
1567
  protected readonly allSelected: _angular_core.Signal<boolean>;
1272
1568
  protected readonly someSelected: _angular_core.Signal<boolean>;
1569
+ /** The key field: the bound `keyExpr`, else the remote source's own `key`. */
1570
+ private readonly keyField;
1273
1571
  private rowKey;
1274
1572
  private treeDescendantKeys;
1275
1573
  private toggleTreeSelection;
1574
+ /**
1575
+ * dx recursive selection. Clicking a node that is not fully checked (unchecked, or a parent
1576
+ * showing indeterminate) selects its whole subtree; clicking a checked one clears it. Then its
1577
+ * ancestors follow their children, checked once all of them are and cleared as soon as one is
1578
+ * not, so deselecting one child leaves its parent indeterminate rather than still ticked.
1579
+ *
1580
+ * The key list is rewritten as every checked node, which dx's `getSelectedRowKeys('all')`
1581
+ * also reports. The event's current keys are what changed on screen.
1582
+ */
1583
+ private toggleRecursiveTreeSelection;
1584
+ /** A recursive tree list's parent with only some descendants selected (dx's indeterminate box). */
1585
+ protected isTreeIndeterminate(row: any): boolean;
1276
1586
  private emitTreeSelectionChanged;
1277
1587
  /** `grouping.autoExpandAll` from the child element or object input; dx default is true. */
1278
1588
  private readonly groupAutoExpand;
@@ -1291,6 +1601,39 @@ declare class NxeDataGridComponent implements OnDestroy {
1291
1601
  protected readonly hasTotalFooter: _angular_core.Signal<boolean>;
1292
1602
  /** Grand-total sums keyed by dataField → formatted text (alignByColumn placement). */
1293
1603
  protected readonly totalSums: _angular_core.Signal<Map<string, string>>;
1604
+ /** A `{ load }` store handed to `dataSource` with `remoteOperations`, wrapped once per store. */
1605
+ private readonly storeWrappers;
1606
+ private wrapped;
1607
+ private readonly remoteWarnings;
1608
+ /** Rows picked on earlier pages, by key, so `selectedRowsData` still has them. */
1609
+ private readonly remoteRowCache;
1610
+ /** Set by filter-row typing; the next request waits `filterDebounce` before it is sent. */
1611
+ private remoteTyping;
1612
+ /** What the last request was for, to tell a changed filter, sort or size from a changed page. */
1613
+ private remoteSignature;
1614
+ private warnOnce;
1615
+ /**
1616
+ * The source the grid pages through, or `null` for a client-side array. An
1617
+ * {@link NxeRemoteDataSource} is used as it is; a `{ load }` store becomes one when
1618
+ * `remoteOperations` is on.
1619
+ */
1620
+ protected readonly remote: _angular_core.Signal<NxeRemoteDataSource<any> | null>;
1621
+ /** The rows every client-side computed reads: the array, or the remote source's current page. */
1622
+ private readonly sourceRows;
1623
+ private readonly selectedKeySet;
1624
+ /** The sort a request carries: the controlled `sort`, else the header sort. */
1625
+ private readonly remoteSort;
1626
+ /** The filter a request carries: filter row AND header filters AND the application's `filter`. */
1627
+ private readonly remoteFilter;
1628
+ /** The request the remote source should be showing, or `null` for a client-side grid. */
1629
+ private readonly remoteRequest;
1630
+ private dispatchRemote;
1631
+ private remoteFilterRowExpression;
1632
+ private filterRowCondition;
1633
+ private remoteHeaderFilterExpression;
1634
+ private toggleRemoteSelection;
1635
+ private toggleRemoteSelectAll;
1636
+ private emitRemoteSelectionChanged;
1294
1637
  protected readonly pagingEnabled: _angular_core.Signal<boolean>;
1295
1638
  protected readonly effectivePageSize: _angular_core.Signal<number>;
1296
1639
  protected readonly pageCount: _angular_core.Signal<number>;
@@ -1442,7 +1785,7 @@ declare class NxeDataGridComponent implements OnDestroy {
1442
1785
  private readonly expandedDetails;
1443
1786
  protected isDetailExpanded(row: any): boolean;
1444
1787
  protected toggleDetail(row: any, event: Event): void;
1445
- protected detailTemplate(): TemplateRef<unknown>;
1788
+ protected detailTemplate(): TemplateRef<unknown> | null;
1446
1789
  protected detailContext(row: any, rowIndex: number): {
1447
1790
  $implicit: {
1448
1791
  data: any;
@@ -1472,7 +1815,7 @@ declare class NxeDataGridComponent implements OnDestroy {
1472
1815
  protected readonly editingCell: _angular_core.WritableSignal<{
1473
1816
  row: any;
1474
1817
  field: string;
1475
- }>;
1818
+ } | null>;
1476
1819
  /** Buffered values for the row in edit mode (`row` mode), keyed by dataField. */
1477
1820
  protected readonly rowEditBuffer: _angular_core.WritableSignal<Record<string, any>>;
1478
1821
  protected isEditingCell(row: any, col: NxeColumnComponent): boolean;
@@ -1551,6 +1894,10 @@ declare class NxeDataGridComponent implements OnDestroy {
1551
1894
  */
1552
1895
  protected readonly displayRows: _angular_core.Signal<any[]>;
1553
1896
  protected readonly loading: _angular_core.Signal<boolean>;
1897
+ /** A remote request is in flight over rows already on screen: the overlay, not the empty-body spinner. */
1898
+ protected readonly remoteBusy: _angular_core.Signal<boolean>;
1899
+ protected readonly remoteFailed: _angular_core.Signal<boolean>;
1900
+ protected retryRemote(): void;
1554
1901
  /**
1555
1902
  * dx `isEmpty()` = `!items().length` (m_data_controller.js:1044-1046), toggled as `dx-empty`
1556
1903
  * on the rows view in `_renderCore` (m_rows_view.js:710) whether loading or not.
@@ -1648,6 +1995,8 @@ declare class NxeDataGridComponent implements OnDestroy {
1648
1995
  protected colType(col: NxeColumnComponent): NxeColType | undefined;
1649
1996
  /** The active sort: an explicit user click, else the first column declaring `sortOrder`. */
1650
1997
  private effectiveSort;
1998
+ /** A user sort change: the grid's own state, and the controlled `sort` when it is in play. */
1999
+ private setSort;
1651
2000
  /**
1652
2001
  * dx `getAlignmentByDataType` (m_columns_controller_utils.js) over the effective type:
1653
2002
  * number right, boolean centre, everything else left. A lookup aligns by its display text
@@ -1687,7 +2036,7 @@ declare class NxeDataGridComponent implements OnDestroy {
1687
2036
  /** Column `lookup` resolution (orbit addition): raw value → display text via the lookup list. */
1688
2037
  private lookupText;
1689
2038
  private defaultFormat;
1690
- protected templateFor(name: string | undefined): TemplateRef<unknown>;
2039
+ protected templateFor(name: string | undefined): TemplateRef<unknown> | null;
1691
2040
  protected cellContext(row: any, rowIndex: number, columnIndex: number, col: NxeColumnComponent): {
1692
2041
  $implicit: NxeCellInfo;
1693
2042
  };
@@ -1806,12 +2155,18 @@ declare class NxeDataGridComponent implements OnDestroy {
1806
2155
  protected onCheckboxClick(row: any, event: Event): void;
1807
2156
  private toggleRow;
1808
2157
  protected toggleSelectAll(event: Event): void;
2158
+ /**
2159
+ * `clearSelection()` (`scope` null: every selected row) and `deselectAll()` (`scope`: the rows
2160
+ * on show). One `onSelectionChanged` with the dropped keys as deselected, none when nothing
2161
+ * was selected.
2162
+ */
2163
+ private deselectRows;
1809
2164
  private emitSelectionChanged;
1810
2165
  private rowKeys;
1811
2166
  private static readonly STRING_OPS;
1812
2167
  private static readonly SCALAR_OPS;
1813
2168
  private static readonly OP_ICON_SLUGS;
1814
- protected readonly frMenuColumn: _angular_core.WritableSignal<NxeColumnComponent>;
2169
+ protected readonly frMenuColumn: _angular_core.WritableSignal<NxeColumnComponent | null>;
1815
2170
  private frMenuOverlayRef?;
1816
2171
  private readonly frMenuPanel;
1817
2172
  /** Which editor a filter cell renders (mirrors dx: select for lookup/boolean, typed inputs). */
@@ -1866,8 +2221,8 @@ declare class NxeDataGridComponent implements OnDestroy {
1866
2221
  private compare;
1867
2222
  ngOnDestroy(): void;
1868
2223
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<NxeDataGridComponent, never>;
1869
- 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; }; "height": { "alias": "height"; "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>;
2224
+ 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; }; "resizeFillsGridInput": { "alias": "resizeFillsGrid"; "required": false; "isSignal": true; }; "remoteOperations": { "alias": "remoteOperations"; "required": false; "isSignal": true; }; "pageIndexModel": { "alias": "pageIndex"; "required": false; "isSignal": true; }; "pageSizeModel": { "alias": "pageSize"; "required": false; "isSignal": true; }; "sortModel": { "alias": "sort"; "required": false; "isSignal": true; }; "filter": { "alias": "filter"; "required": false; "isSignal": true; }; "syncLookupFilterValues": { "alias": "syncLookupFilterValues"; "required": false; "isSignal": true; }; "columnMinWidth": { "alias": "columnMinWidth"; "required": false; "isSignal": true; }; "height": { "alias": "height"; "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; }; }, { "pageIndexModel": "pageIndexChange"; "pageSizeModel": "pageSizeChange"; "sortModel": "sortChange"; "optionsChange": "optionsChange"; "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>;
1870
2225
  }
1871
2226
 
1872
- 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, nxeExcelNumberMask, nxeFormatNumberValue, nxeHfKey, nxeNumberMask, nxeNumberValue, nxeValueDataType, openNxeHeaderFilterOverlay };
1873
- export type { NxeCellInfo, NxeCellPreparedEvent, NxeColumnDataType, NxeColumnFormat, NxeColumnFormatObject, NxeCustomizeText, NxeDragGestureDelegate, NxeEditCellInfo, NxeExcelExportOptions, NxeExportColumn, NxeExportDataGridOptions, NxeFilterOp, NxeGridChange, NxeGridDragHooks, NxeGridInstance, NxeGridOptionChangedEvent, NxeGridSelectionChangedEvent, NxeGroupCellInfo, NxeHeaderCell, NxeHeaderFilterOverlayOptions, NxeHeaderFilterSource, NxeHfDateNode, NxeRowInfo, NxeRowPreparedEvent, NxeRowType, NxeSummaryItemLike, NxeTreeListNode };
2227
+ export { NXE_HF_BLANKS, NXE_REMOTE_DEFAULT_PAGE_SIZE, NxeColumnComponent, NxeDataGridComponent, NxeDragGesture, NxeEditingComponent, NxeFilterRowComponent, NxeGestureClickSuppression, NxeGridDragController, NxeGroupItemComponent, NxeGroupPanelComponent, NxeGroupingComponent, NxeHeaderFilterComponent, NxeHeaderFilterModel, NxeHeaderFilterPanelComponent, NxeMasterDetailComponent, NxePagerComponent, NxePaginatorComponent, NxePagingComponent, NxeRemoteDataSource, NxeScrollingComponent, NxeSelectionComponent, NxeSummaryComponent, NxeTotalItemComponent, exportDataGrid, exportNxeGridToExcel, nxeDatePattern, nxeDefaultFormat, nxeExcelNumFmt, nxeExcelNumberMask, nxeFilterAnd, nxeFilterOr, nxeFlattenFilter, nxeFormatNumberValue, nxeHfKey, nxeIsStoreLike, nxeLoadOptions, nxeNumberMask, nxeNumberValue, nxeSameQuery, nxeValueDataType, openNxeHeaderFilterOverlay };
2228
+ export type { NxeCellInfo, NxeCellPreparedEvent, NxeColumnDataType, NxeColumnFormat, NxeColumnFormatObject, NxeCustomizeText, NxeDragGestureDelegate, NxeEditCellInfo, NxeExcelExportOptions, NxeExportColumn, NxeExportDataGridOptions, NxeFilterExpression, NxeFilterOp, NxeFilterOperator, NxeFlatFilterCondition, NxeGridChange, NxeGridDragHooks, NxeGridInstance, NxeGridOptionChangedEvent, NxeGridSelectionChangedEvent, NxeGroupCellInfo, NxeHeaderCell, NxeHeaderFilterLabels, NxeHeaderFilterOverlayOptions, NxeHeaderFilterSource, NxeHfDateNode, NxeLoadContext, NxeLoadOptions, NxeLoadResult, NxeRemoteDataSourceConfig, NxeRemoteLoadFn, NxeRemoteQuery, NxeRowInfo, NxeRowPreparedEvent, NxeRowType, NxeSortDescriptor, NxeStoreLike, NxeSummaryItemLike, NxeTreeListNode };