@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,7 +1,90 @@
1
1
  import * as _angular_core from '@angular/core';
2
- import { OnDestroy, TemplateRef, InjectionToken, OnInit } from '@angular/core';
3
- import { NxeFormControlBase, NxeExpr } from '@nexterajs/ui/core';
4
- import { Subject } from 'rxjs';
2
+ import { Signal, OnDestroy, TemplateRef, InjectionToken, OnInit } from '@angular/core';
3
+ import { NxeExpr, NxeFormControlBase } from '@nexterajs/ui/core';
4
+ import { ObservableInput, Subject } from 'rxjs';
5
+
6
+ /** Payload of the `(searchChange)` output of the pickers: the text the user has settled on. */
7
+ interface NxeSearchChangedEvent {
8
+ searchValue: string;
9
+ }
10
+ /** What a picker hands to {@link NxePickerStore.load}; the names follow DevExtreme `LoadOptions`. */
11
+ interface NxePickerLoadOptions {
12
+ searchValue: string;
13
+ searchExpr: NxeExpr;
14
+ searchOperation: 'contains';
15
+ skip: number;
16
+ take: number;
17
+ }
18
+ /** Second argument of the store callbacks: `signal` aborts when a newer query replaces this one. */
19
+ interface NxePickerLoadContext {
20
+ signal: AbortSignal;
21
+ }
22
+ /** A page of rows; `totalCount` is optional and, when given, decides whether more pages exist. */
23
+ interface NxePickerLoadResult<T = any> {
24
+ data: readonly T[];
25
+ totalCount?: number;
26
+ }
27
+ /**
28
+ * A lightweight server-backed source for `nxe-select-box` and `nxe-tag-box` (`[dataSource]`).
29
+ * Shaped like a DevExtreme `CustomStore`: `load` receives `{searchValue, skip, take}`, and `byKey`
30
+ * fetches one row so a selected value outside the loaded page keeps its label.
31
+ */
32
+ interface NxePickerStore<T = any> {
33
+ load(options: NxePickerLoadOptions, context: NxePickerLoadContext): ObservableInput<readonly T[] | NxePickerLoadResult<T>>;
34
+ byKey?(key: unknown, context: NxePickerLoadContext): ObservableInput<T | null | undefined>;
35
+ }
36
+ /** True for a store object (anything with a `load` function that is not an array). */
37
+ declare function nxeIsPickerStore(value: unknown): value is NxePickerStore;
38
+ /** Reads the debounce, minimum length and remote settings of a picker; every member is a live signal. */
39
+ interface NxePickerSearchConfig {
40
+ store: Signal<NxePickerStore | null>;
41
+ searchExpr: Signal<NxeExpr>;
42
+ searchTimeout: Signal<number>;
43
+ minSearchLength: Signal<number>;
44
+ showDataBeforeSearch: Signal<boolean>;
45
+ pageSize: Signal<number>;
46
+ /** Called with each debounced search that reaches `minSearchLength` (or is cleared). */
47
+ searchChange: (event: NxeSearchChangedEvent) => void;
48
+ /** Called after a page of rows has landed. */
49
+ loaded?: () => void;
50
+ }
51
+ /**
52
+ * The search plumbing shared by the pickers: debounces typing by `searchTimeout`, emits
53
+ * `searchChange` once the text reaches `minSearchLength` (or is cleared), and, when the
54
+ * `dataSource` is a {@link NxePickerStore}, queries it and keeps only the newest response.
55
+ * Must be created in an injection context. It uses no `effect()`: it reacts only to the explicit
56
+ * {@link typed}, {@link open} and {@link loadMore} calls.
57
+ */
58
+ declare class NxePickerSearch {
59
+ private readonly cfg;
60
+ /** Rows of the store loaded so far (all pages of the current query). */
61
+ readonly items: _angular_core.WritableSignal<readonly unknown[]>;
62
+ readonly loading: _angular_core.WritableSignal<boolean>;
63
+ readonly error: _angular_core.WritableSignal<unknown>;
64
+ readonly hasMore: _angular_core.WritableSignal<boolean>;
65
+ private readonly typedText;
66
+ private loadedFor;
67
+ private seq;
68
+ private controller;
69
+ constructor(cfg: NxePickerSearchConfig);
70
+ get hasStore(): boolean;
71
+ /** True when `text` is long enough to be searched. */
72
+ reachesMinimum(text: string): boolean;
73
+ /** The user typed; the search settles after `searchTimeout`. */
74
+ typed(text: string): void;
75
+ /** The panel opened with `text` in the field: load the first page unless that query is current. */
76
+ open(text: string): void;
77
+ /** Loads the next page of the current query (a scroll-to-bottom handler calls this). */
78
+ loadMore(): void;
79
+ /** Fetches one row by key through `byKey`; `null` when the store cannot or does not know it. */
80
+ lookup(key: unknown): Promise<unknown>;
81
+ private settled;
82
+ /** The text actually sent to the store: below the minimum nothing is searched. */
83
+ private effective;
84
+ private query;
85
+ private cancel;
86
+ private run;
87
+ }
5
88
 
6
89
  /** DevExtreme-shaped selection-changed payload (handlers read `selectedItem`). */
7
90
  interface NxeSelectionChangedEvent {
@@ -26,14 +109,17 @@ declare class NxeSelectBoxComponent extends NxeFormControlBase<unknown> implemen
26
109
  private readonly dropdownTemplate;
27
110
  private readonly inputEl;
28
111
  private readonly templates;
29
- /** The source array (plain JS array of `Lov`-shaped objects, or primitives). */
30
- readonly dataSource: _angular_core.InputSignal<readonly unknown[]>;
112
+ /**
113
+ * The source: a plain array of `Lov`-shaped objects (or primitives), or an {@link NxePickerStore}
114
+ * whose `load({searchValue, skip, take})` the box calls itself (server-side search).
115
+ */
116
+ readonly dataSource: _angular_core.InputSignal<NxePickerStore<any> | readonly unknown[] | null | undefined>;
31
117
  /** Field shown in the box/list (DevExtreme default `lovName`). Empty => the item itself. */
32
118
  readonly displayExprInput: _angular_core.InputSignal<NxeExpr>;
33
- readonly displayExpr: _angular_core.Signal<NxeExpr>;
119
+ readonly displayExpr: _angular_core.Signal<string | ((item: unknown) => unknown)>;
34
120
  /** Field bound as the control value (DevExtreme default `lovCode`). Empty => the whole item. */
35
121
  readonly valueExprInput: _angular_core.InputSignal<NxeExpr>;
36
- readonly valueExpr: _angular_core.Signal<NxeExpr>;
122
+ readonly valueExpr: _angular_core.Signal<string | ((item: unknown) => unknown)>;
37
123
  /** Field matched while searching (DevExtreme default `lovName`). */
38
124
  readonly searchExprInput: _angular_core.InputSignal<NxeExpr>;
39
125
  /**
@@ -42,10 +128,10 @@ declare class NxeSelectBoxComponent extends NxeFormControlBase<unknown> implemen
42
128
  * items do not have, and found nothing - silently, because an empty result looks like no
43
129
  * match. Where displayExpr is the default this resolves to 'lovName' exactly as before.
44
130
  */
45
- readonly searchExpr: _angular_core.Signal<NxeExpr>;
46
- readonly searchEnabledInput: _angular_core.InputSignalWithTransform<boolean, unknown>;
131
+ readonly searchExpr: _angular_core.Signal<string | ((item: unknown) => unknown)>;
132
+ readonly searchEnabledInput: _angular_core.InputSignalWithTransform<boolean | undefined, unknown>;
47
133
  readonly searchEnabled: _angular_core.Signal<boolean>;
48
- readonly showClearButtonInput: _angular_core.InputSignalWithTransform<boolean, unknown>;
134
+ readonly showClearButtonInput: _angular_core.InputSignalWithTransform<boolean | undefined, unknown>;
49
135
  /**
50
136
  * dx defaults `showClearButton` to false (m_text_editor.base.js). The library used to default it
51
137
  * on, which gave every host that never asked for one a clear button dx would not show. An app
@@ -53,21 +139,40 @@ declare class NxeSelectBoxComponent extends NxeFormControlBase<unknown> implemen
53
139
  */
54
140
  readonly showClearButton: _angular_core.Signal<boolean>;
55
141
  /** dx parity: dx-select-box shows its drop-down arrow unless showDropDownButton=false. */
56
- readonly showDropDownButtonInput: _angular_core.InputSignalWithTransform<boolean, unknown>;
142
+ readonly showDropDownButtonInput: _angular_core.InputSignalWithTransform<boolean | undefined, unknown>;
57
143
  readonly showDropDownButton: _angular_core.Signal<boolean>;
58
- readonly placeholderInput: _angular_core.InputSignal<string>;
144
+ readonly placeholderInput: _angular_core.InputSignal<string | undefined>;
59
145
  readonly placeholder: _angular_core.Signal<string>;
60
146
  /** Named template ('displayItem') for dropdown rows; `$implicit` = the item. */
61
- readonly itemTemplate: _angular_core.InputSignal<string>;
147
+ readonly itemTemplate: _angular_core.InputSignal<string | undefined>;
62
148
  /** Named template ('inputField') for the closed field; `$implicit` = the selected item. */
63
- readonly fieldTemplate: _angular_core.InputSignal<string>;
149
+ readonly fieldTemplate: _angular_core.InputSignal<string | undefined>;
150
+ /** dx `searchTimeout`: ms of typing pause before `(searchChange)` fires or a store is queried. */
151
+ readonly searchTimeout: _angular_core.InputSignalWithTransform<number, unknown>;
152
+ /** dx `minSearchLength`: characters needed before a search is emitted, applied or sent. */
153
+ readonly minSearchLength: _angular_core.InputSignalWithTransform<number, unknown>;
154
+ /** dx `showDataBeforeSearch`: list rows while the text is shorter than `minSearchLength`. */
155
+ readonly showDataBeforeSearch: _angular_core.InputSignalWithTransform<boolean, unknown>;
156
+ /** Rows requested per page from a store `dataSource` (`take`); more load on scroll to the end. */
157
+ readonly pageSize: _angular_core.InputSignalWithTransform<number, unknown>;
158
+ /**
159
+ * dx `displayValue`: the text shown for the current value while its row is not among the loaded
160
+ * ones (a store `dataSource` with the selection outside the current page, and no `byKey`).
161
+ */
162
+ readonly displayValue: _angular_core.InputSignal<string | null | undefined>;
64
163
  /** DevExtreme parity, cosmetic. */
65
164
  readonly hoverStateEnabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
66
165
  readonly onSelectionChanged: _angular_core.OutputEmitterRef<NxeSelectionChangedEvent>;
166
+ /**
167
+ * The search text settled: fires `searchTimeout` ms after the last keystroke, once the text has
168
+ * `minSearchLength` characters (or was cleared). Use it to query a server and replace
169
+ * `[dataSource]`, or pass a {@link NxePickerStore} and let the box query for you.
170
+ */
171
+ readonly searchChange: _angular_core.OutputEmitterRef<NxeSearchChangedEvent>;
67
172
  readonly focused: _angular_core.WritableSignal<boolean>;
68
173
  readonly open: _angular_core.WritableSignal<boolean>;
69
174
  /** What the user has typed to filter (null = not actively searching → show display text). */
70
- readonly searchText: _angular_core.WritableSignal<string>;
175
+ readonly searchText: _angular_core.WritableSignal<string | null>;
71
176
  readonly activeIndex: _angular_core.WritableSignal<number>;
72
177
  readonly panelWidth: _angular_core.WritableSignal<number>;
73
178
  /** DevExtreme `.instance` facade — only `focus()` is used (via the customAutofocus directive). */
@@ -75,23 +180,33 @@ declare class NxeSelectBoxComponent extends NxeFormControlBase<unknown> implemen
75
180
  private overlayRef?;
76
181
  private closeSub?;
77
182
  private flipSub?;
183
+ private readonly store;
184
+ private readonly search;
185
+ /** Rows picked or fetched by key from a store, so the label outlives the page that held them. */
186
+ private readonly resolved;
78
187
  private readonly items;
188
+ /** Fetches the row of an externally set value through `byKey` when no loaded row has it. */
189
+ private readonly keyLookup;
190
+ private findRow;
191
+ private remember;
79
192
  protected display(item: unknown): string;
80
193
  private extractValue;
81
- readonly selectedItem: _angular_core.Signal<unknown>;
194
+ readonly selectedItem: _angular_core.Signal<{} | null>;
82
195
  readonly hasValue: _angular_core.Signal<boolean>;
83
196
  /** Display text when the field is not being searched. */
84
197
  protected readonly displayText: _angular_core.Signal<string>;
85
198
  /** Value bound to the input element. */
86
199
  protected readonly inputDisplay: _angular_core.Signal<string>;
87
200
  protected readonly filteredItems: _angular_core.Signal<readonly unknown[]>;
88
- protected readonly itemTemplateRef: _angular_core.Signal<TemplateRef<unknown>>;
89
- protected readonly fieldTemplateRef: _angular_core.Signal<TemplateRef<unknown>>;
201
+ protected readonly itemTemplateRef: _angular_core.Signal<TemplateRef<unknown> | null>;
202
+ protected readonly fieldTemplateRef: _angular_core.Signal<TemplateRef<unknown> | null>;
90
203
  protected isSelected(item: unknown): boolean;
91
204
  /** Imperative focus (DevExtreme `.instance.focus()` via customAutofocus). */
92
205
  focus(): void;
93
206
  protected onFieldMousedown(event: MouseEvent): void;
94
207
  protected onSearchInput(event: Event): void;
208
+ /** Loads the next page of a store `dataSource` when the list is scrolled to its end. */
209
+ protected onPanelScroll(event: Event): void;
95
210
  protected onBlur(): void;
96
211
  protected selectItem(item: unknown, event: Event): void;
97
212
  protected onClear(event: Event): void;
@@ -100,7 +215,7 @@ declare class NxeSelectBoxComponent extends NxeFormControlBase<unknown> implemen
100
215
  private close;
101
216
  ngOnDestroy(): void;
102
217
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<NxeSelectBoxComponent, never>;
103
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<NxeSelectBoxComponent, "nxe-select-box", never, { "dataSource": { "alias": "dataSource"; "required": false; "isSignal": true; }; "displayExprInput": { "alias": "displayExpr"; "required": false; "isSignal": true; }; "valueExprInput": { "alias": "valueExpr"; "required": false; "isSignal": true; }; "searchExprInput": { "alias": "searchExpr"; "required": false; "isSignal": true; }; "searchEnabledInput": { "alias": "searchEnabled"; "required": false; "isSignal": true; }; "showClearButtonInput": { "alias": "showClearButton"; "required": false; "isSignal": true; }; "showDropDownButtonInput": { "alias": "showDropDownButton"; "required": false; "isSignal": true; }; "placeholderInput": { "alias": "placeholder"; "required": false; "isSignal": true; }; "itemTemplate": { "alias": "itemTemplate"; "required": false; "isSignal": true; }; "fieldTemplate": { "alias": "fieldTemplate"; "required": false; "isSignal": true; }; "hoverStateEnabled": { "alias": "hoverStateEnabled"; "required": false; "isSignal": true; }; }, { "onSelectionChanged": "onSelectionChanged"; }, ["templates"], ["*"], true, never>;
218
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NxeSelectBoxComponent, "nxe-select-box", never, { "dataSource": { "alias": "dataSource"; "required": false; "isSignal": true; }; "displayExprInput": { "alias": "displayExpr"; "required": false; "isSignal": true; }; "valueExprInput": { "alias": "valueExpr"; "required": false; "isSignal": true; }; "searchExprInput": { "alias": "searchExpr"; "required": false; "isSignal": true; }; "searchEnabledInput": { "alias": "searchEnabled"; "required": false; "isSignal": true; }; "showClearButtonInput": { "alias": "showClearButton"; "required": false; "isSignal": true; }; "showDropDownButtonInput": { "alias": "showDropDownButton"; "required": false; "isSignal": true; }; "placeholderInput": { "alias": "placeholder"; "required": false; "isSignal": true; }; "itemTemplate": { "alias": "itemTemplate"; "required": false; "isSignal": true; }; "fieldTemplate": { "alias": "fieldTemplate"; "required": false; "isSignal": true; }; "searchTimeout": { "alias": "searchTimeout"; "required": false; "isSignal": true; }; "minSearchLength": { "alias": "minSearchLength"; "required": false; "isSignal": true; }; "showDataBeforeSearch": { "alias": "showDataBeforeSearch"; "required": false; "isSignal": true; }; "pageSize": { "alias": "pageSize"; "required": false; "isSignal": true; }; "displayValue": { "alias": "displayValue"; "required": false; "isSignal": true; }; "hoverStateEnabled": { "alias": "hoverStateEnabled"; "required": false; "isSignal": true; }; }, { "onSelectionChanged": "onSelectionChanged"; "searchChange": "searchChange"; }, ["templates"], ["*"], true, never>;
104
219
  }
105
220
 
106
221
  /**
@@ -117,11 +232,12 @@ declare class NxeTagBoxComponent extends NxeFormControlBase<unknown[]> implement
117
232
  private readonly viewContainerRef;
118
233
  private readonly dropdownTemplate;
119
234
  private readonly inputEl;
120
- readonly dataSource: _angular_core.InputSignal<readonly unknown[]>;
235
+ /** A plain array, or an {@link NxePickerStore} the box queries itself (server-side search). */
236
+ readonly dataSource: _angular_core.InputSignal<NxePickerStore<any> | readonly unknown[] | null | undefined>;
121
237
  readonly displayExprInput: _angular_core.InputSignal<NxeExpr>;
122
- readonly displayExpr: _angular_core.Signal<NxeExpr>;
238
+ readonly displayExpr: _angular_core.Signal<string | ((item: unknown) => unknown)>;
123
239
  readonly valueExprInput: _angular_core.InputSignal<NxeExpr>;
124
- readonly valueExpr: _angular_core.Signal<NxeExpr>;
240
+ readonly valueExpr: _angular_core.Signal<string | ((item: unknown) => unknown)>;
125
241
  readonly searchExprInput: _angular_core.InputSignal<NxeExpr>;
126
242
  /**
127
243
  * dx searches by `displayExpr` when `searchExpr` is not given. Defaulting to the literal
@@ -129,17 +245,17 @@ declare class NxeTagBoxComponent extends NxeFormControlBase<unknown[]> implement
129
245
  * items do not have, and found nothing - silently, because an empty result looks like no
130
246
  * match. Where displayExpr is the default this resolves to 'lovName' exactly as before.
131
247
  */
132
- readonly searchExpr: _angular_core.Signal<NxeExpr>;
133
- readonly searchEnabledInput: _angular_core.InputSignalWithTransform<boolean, unknown>;
248
+ readonly searchExpr: _angular_core.Signal<string | ((item: unknown) => unknown)>;
249
+ readonly searchEnabledInput: _angular_core.InputSignalWithTransform<boolean | undefined, unknown>;
134
250
  readonly searchEnabled: _angular_core.Signal<boolean>;
135
- readonly showClearButtonInput: _angular_core.InputSignalWithTransform<boolean, unknown>;
251
+ readonly showClearButtonInput: _angular_core.InputSignalWithTransform<boolean | undefined, unknown>;
136
252
  /**
137
253
  * dx defaults `showClearButton` to false (m_text_editor.base.js). The library used to default it
138
254
  * on, which gave every host that never asked for one a clear button dx would not show. An app
139
255
  * that wants it everywhere says so once through `NXE_DEFAULT_OPTIONS.tagBox.showClearButton`.
140
256
  */
141
257
  readonly showClearButton: _angular_core.Signal<boolean>;
142
- readonly showSelectionControlsInput: _angular_core.InputSignalWithTransform<boolean, unknown>;
258
+ readonly showSelectionControlsInput: _angular_core.InputSignalWithTransform<boolean | undefined, unknown>;
143
259
  /**
144
260
  * dx `showSelectionControls`. On (the literal, and what every consumer site passes): a checkbox
145
261
  * per row and a tri-state "Select All" row — dx switches its list to `selectionMode: 'all'`
@@ -148,12 +264,22 @@ declare class NxeTagBoxComponent extends NxeFormControlBase<unknown[]> implement
148
264
  */
149
265
  readonly showSelectionControls: _angular_core.Signal<boolean>;
150
266
  /** dx `selectAllText` — the label of the "Select All" row (dx: `dxList-selectAll`). */
151
- readonly selectAllText: _angular_core.InputSignal<string>;
267
+ readonly selectAllText: _angular_core.InputSignal<string | undefined>;
152
268
  /** dx parity: dx-tag-box does NOT show a drop-down arrow unless showDropDownButton is set. */
153
- readonly showDropDownButtonInput: _angular_core.InputSignalWithTransform<boolean, unknown>;
269
+ readonly showDropDownButtonInput: _angular_core.InputSignalWithTransform<boolean | undefined, unknown>;
154
270
  readonly showDropDownButton: _angular_core.Signal<boolean>;
155
- readonly placeholderInput: _angular_core.InputSignal<string>;
271
+ readonly placeholderInput: _angular_core.InputSignal<string | undefined>;
156
272
  readonly placeholder: _angular_core.Signal<string>;
273
+ /** dx `searchTimeout`: ms of typing pause before `(searchChange)` fires or a store is queried. */
274
+ readonly searchTimeout: _angular_core.InputSignalWithTransform<number, unknown>;
275
+ /** dx `minSearchLength`: characters needed before a search is emitted, applied or sent. */
276
+ readonly minSearchLength: _angular_core.InputSignalWithTransform<number, unknown>;
277
+ /** dx `showDataBeforeSearch`: list rows while the text is shorter than `minSearchLength`. */
278
+ readonly showDataBeforeSearch: _angular_core.InputSignalWithTransform<boolean, unknown>;
279
+ /** Rows requested per page from a store `dataSource` (`take`); more load on scroll to the end. */
280
+ readonly pageSize: _angular_core.InputSignalWithTransform<number, unknown>;
281
+ /** The search text settled (after `searchTimeout`, once it has `minSearchLength` characters or was cleared). */
282
+ readonly searchChange: _angular_core.OutputEmitterRef<NxeSearchChangedEvent>;
157
283
  readonly focused: _angular_core.WritableSignal<boolean>;
158
284
  readonly open: _angular_core.WritableSignal<boolean>;
159
285
  readonly searchText: _angular_core.WritableSignal<string>;
@@ -161,7 +287,15 @@ declare class NxeTagBoxComponent extends NxeFormControlBase<unknown[]> implement
161
287
  private overlayRef?;
162
288
  private closeSub?;
163
289
  private flipSub?;
290
+ private readonly store;
291
+ private readonly search;
292
+ /** Rows picked or fetched by key from a store, so a chip keeps its label off the loaded page. */
293
+ private readonly resolved;
164
294
  private readonly items;
295
+ /** Fetches, through `byKey`, the rows of externally set keys that no loaded row has. */
296
+ private readonly keyLookup;
297
+ private findRow;
298
+ private remember;
165
299
  /** The selected keys (always an array). */
166
300
  private readonly selectedKeys;
167
301
  protected display(item: unknown): string;
@@ -176,9 +310,11 @@ declare class NxeTagBoxComponent extends NxeFormControlBase<unknown[]> implement
176
310
  * so a search narrows what it counts: `true` when every listed row is selected, `false` when
177
311
  * none is, and `undefined` (indeterminate) in between.
178
312
  */
179
- protected readonly selectAllState: _angular_core.Signal<boolean>;
313
+ protected readonly selectAllState: _angular_core.Signal<boolean | undefined>;
180
314
  protected onFieldMousedown(event: MouseEvent): void;
181
315
  protected onSearchInput(event: Event): void;
316
+ /** Loads the next page of a store `dataSource` when the list is scrolled to its end. */
317
+ protected onPanelScroll(event: Event): void;
182
318
  protected onBlur(): void;
183
319
  protected toggle(item: unknown, event: Event): void;
184
320
  /**
@@ -193,7 +329,7 @@ declare class NxeTagBoxComponent extends NxeFormControlBase<unknown[]> implement
193
329
  private close;
194
330
  ngOnDestroy(): void;
195
331
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<NxeTagBoxComponent, never>;
196
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<NxeTagBoxComponent, "nxe-tag-box", never, { "dataSource": { "alias": "dataSource"; "required": false; "isSignal": true; }; "displayExprInput": { "alias": "displayExpr"; "required": false; "isSignal": true; }; "valueExprInput": { "alias": "valueExpr"; "required": false; "isSignal": true; }; "searchExprInput": { "alias": "searchExpr"; "required": false; "isSignal": true; }; "searchEnabledInput": { "alias": "searchEnabled"; "required": false; "isSignal": true; }; "showClearButtonInput": { "alias": "showClearButton"; "required": false; "isSignal": true; }; "showSelectionControlsInput": { "alias": "showSelectionControls"; "required": false; "isSignal": true; }; "selectAllText": { "alias": "selectAllText"; "required": false; "isSignal": true; }; "showDropDownButtonInput": { "alias": "showDropDownButton"; "required": false; "isSignal": true; }; "placeholderInput": { "alias": "placeholder"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
332
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NxeTagBoxComponent, "nxe-tag-box", never, { "dataSource": { "alias": "dataSource"; "required": false; "isSignal": true; }; "displayExprInput": { "alias": "displayExpr"; "required": false; "isSignal": true; }; "valueExprInput": { "alias": "valueExpr"; "required": false; "isSignal": true; }; "searchExprInput": { "alias": "searchExpr"; "required": false; "isSignal": true; }; "searchEnabledInput": { "alias": "searchEnabled"; "required": false; "isSignal": true; }; "showClearButtonInput": { "alias": "showClearButton"; "required": false; "isSignal": true; }; "showSelectionControlsInput": { "alias": "showSelectionControls"; "required": false; "isSignal": true; }; "selectAllText": { "alias": "selectAllText"; "required": false; "isSignal": true; }; "showDropDownButtonInput": { "alias": "showDropDownButton"; "required": false; "isSignal": true; }; "placeholderInput": { "alias": "placeholder"; "required": false; "isSignal": true; }; "searchTimeout": { "alias": "searchTimeout"; "required": false; "isSignal": true; }; "minSearchLength": { "alias": "minSearchLength"; "required": false; "isSignal": true; }; "showDataBeforeSearch": { "alias": "showDataBeforeSearch"; "required": false; "isSignal": true; }; "pageSize": { "alias": "pageSize"; "required": false; "isSignal": true; }; }, { "searchChange": "searchChange"; }, never, ["*"], true, never>;
197
333
  }
198
334
 
199
335
  /**
@@ -205,8 +341,8 @@ declare class NxeDropDownOptionsComponent {
205
341
  readonly wrapperAttr: _angular_core.InputSignal<{
206
342
  class?: string;
207
343
  id?: string;
208
- }>;
209
- readonly width: _angular_core.InputSignal<string | number>;
344
+ } | undefined>;
345
+ readonly width: _angular_core.InputSignal<string | number | undefined>;
210
346
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<NxeDropDownOptionsComponent, never>;
211
347
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<NxeDropDownOptionsComponent, "nxe-drop-down-options", never, { "wrapperAttr": { "alias": "wrapperAttr"; "required": false; "isSignal": true; }; "width": { "alias": "width"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
212
348
  }
@@ -227,13 +363,13 @@ declare class NxeDropDownBoxComponent extends NxeFormControlBase<unknown> implem
227
363
  private readonly panelTemplate;
228
364
  private readonly templates;
229
365
  private readonly options;
230
- readonly dataSource: _angular_core.InputSignal<readonly unknown[]>;
366
+ readonly dataSource: _angular_core.InputSignal<readonly unknown[] | null | undefined>;
231
367
  /** Field name shown in the closed box; empty => the raw value string. */
232
368
  readonly displayExprInput: _angular_core.InputSignal<NxeExpr>;
233
- readonly displayExpr: _angular_core.Signal<NxeExpr>;
369
+ readonly displayExpr: _angular_core.Signal<string | ((item: unknown) => unknown)>;
234
370
  readonly valueExprInput: _angular_core.InputSignal<NxeExpr>;
235
- readonly valueExpr: _angular_core.Signal<NxeExpr>;
236
- readonly placeholderInput: _angular_core.InputSignal<string>;
371
+ readonly valueExpr: _angular_core.Signal<string | ((item: unknown) => unknown)>;
372
+ readonly placeholderInput: _angular_core.InputSignal<string | undefined>;
237
373
  readonly placeholder: _angular_core.Signal<string>;
238
374
  /** DevExtreme `[dropDownOptions]` — accepted for parity (popup-class hook). */
239
375
  readonly dropDownOptions: _angular_core.InputSignal<unknown>;
@@ -245,7 +381,7 @@ declare class NxeDropDownBoxComponent extends NxeFormControlBase<unknown> implem
245
381
  * every existing call site picks from a grid where clearing was never offered. Opt in where null
246
382
  * is a value the field can legitimately hold.
247
383
  */
248
- readonly showClearButtonInput: _angular_core.InputSignalWithTransform<boolean, unknown>;
384
+ readonly showClearButtonInput: _angular_core.InputSignalWithTransform<boolean | undefined, unknown>;
249
385
  readonly showClearButton: _angular_core.Signal<boolean>;
250
386
  /**
251
387
  * DevExtreme `[opened]` (orbit addition): programmatic open/close. Reflects the panel state
@@ -262,7 +398,7 @@ declare class NxeDropDownBoxComponent extends NxeFormControlBase<unknown> implem
262
398
  private overlayRef?;
263
399
  private closeSub?;
264
400
  private flipSub?;
265
- protected readonly contentTemplateRef: _angular_core.Signal<TemplateRef<unknown>>;
401
+ protected readonly contentTemplateRef: _angular_core.Signal<TemplateRef<unknown> | null>;
266
402
  /**
267
403
  * DevExtreme sizes the popup to the editor, and every call site that says anything says
268
404
  * `width="100%"` — which means that same thing. So the panel is fixed at the field's width and
@@ -298,24 +434,24 @@ interface NxeListItemClickEvent {
298
434
  declare class NxeListComponent {
299
435
  private readonly menu;
300
436
  private readonly templates;
301
- readonly dataSource: _angular_core.InputSignal<readonly unknown[]>;
437
+ readonly dataSource: _angular_core.InputSignal<readonly unknown[] | null | undefined>;
302
438
  /** Named template ('listItem'/'actionButton') for each row; `$implicit` = the item. */
303
- readonly itemTemplate: _angular_core.InputSignal<string>;
439
+ readonly itemTemplate: _angular_core.InputSignal<string | undefined>;
304
440
  /** DevExtreme `[elementAttr]` — `{ id, class }` applied to the host. */
305
441
  readonly elementAttr: _angular_core.InputSignal<{
306
442
  id?: string;
307
443
  class?: string;
308
- }>;
444
+ } | undefined>;
309
445
  /**
310
446
  * dx `keyExpr` — the field identifying an item. Used for `@for` tracking, so a list whose
311
447
  * items are replaced by equal-but-not-identical objects keeps its DOM instead of rebuilding
312
448
  * every row. Falls back to the index when unset, which is the previous behaviour.
313
449
  */
314
- readonly keyExpr: _angular_core.InputSignal<string>;
450
+ readonly keyExpr: _angular_core.InputSignal<string | undefined>;
315
451
  protected trackItem(item: unknown, index: number): unknown;
316
452
  readonly onItemClick: _angular_core.OutputEmitterRef<NxeListItemClickEvent>;
317
453
  protected readonly items: _angular_core.Signal<readonly unknown[]>;
318
- protected readonly itemTemplateRef: _angular_core.Signal<_angular_core.TemplateRef<unknown>>;
454
+ protected readonly itemTemplateRef: _angular_core.Signal<_angular_core.TemplateRef<unknown> | null>;
319
455
  protected text(item: unknown): string;
320
456
  /** dx parity: dx-list honors `item.disabled` (grayed, non-interactive). */
321
457
  protected isDisabled(item: unknown): boolean;
@@ -324,6 +460,13 @@ declare class NxeListComponent {
324
460
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<NxeListComponent, "nxe-list", never, { "dataSource": { "alias": "dataSource"; "required": false; "isSignal": true; }; "itemTemplate": { "alias": "itemTemplate"; "required": false; "isSignal": true; }; "elementAttr": { "alias": "elementAttr"; "required": false; "isSignal": true; }; "keyExpr": { "alias": "keyExpr"; "required": false; "isSignal": true; }; }, { "onItemClick": "onItemClick"; }, ["templates"], never, true, never>;
325
461
  }
326
462
 
463
+ /** What an `nxe-menu-item` needs from its parent menu: a way to request close. */
464
+ interface NxeMenuCloseTarget {
465
+ closeMenu(): void;
466
+ }
467
+ /** DI token the menu provides so projected `nxe-menu-item`s can close it on click. */
468
+ declare const NXE_MENU: InjectionToken<NxeMenuCloseTarget>;
469
+
327
470
  /** How a typed query is matched against `searchExpr` (dx `searchMode`). */
328
471
  type NxeAutoCompleteSearchMode = 'contains' | 'startswith' | 'equals';
329
472
  /** DevExtreme-shaped selection payload, emitted when a suggestion is picked. */
@@ -348,7 +491,7 @@ declare class NxeAutoCompleteComponent extends NxeFormControlBase<string> implem
348
491
  private readonly viewContainerRef;
349
492
  private readonly dropdownTemplate;
350
493
  private readonly inputEl;
351
- readonly dataSource: _angular_core.InputSignal<readonly unknown[]>;
494
+ readonly dataSource: _angular_core.InputSignal<readonly unknown[] | null | undefined>;
352
495
  /** Field of a picked item that becomes the value (dx default `lovName`). */
353
496
  readonly valueExpr: _angular_core.InputSignal<NxeExpr>;
354
497
  /** Field matched against the query; defaults to {@link valueExpr}, as dx does. */
@@ -360,7 +503,7 @@ declare class NxeAutoCompleteComponent extends NxeFormControlBase<string> implem
360
503
  /** dx caps the suggestion list; beyond this the user is expected to keep typing. */
361
504
  readonly maxItemCount: _angular_core.InputSignal<number>;
362
505
  readonly placeholder: _angular_core.InputSignal<string>;
363
- readonly showClearButton: _angular_core.InputSignalWithTransform<boolean, unknown>;
506
+ readonly showClearButton: _angular_core.InputSignalWithTransform<boolean | undefined, unknown>;
364
507
  readonly onSelectionChanged: _angular_core.OutputEmitterRef<NxeAutoCompleteSelectionChangedEvent>;
365
508
  readonly focused: _angular_core.WritableSignal<boolean>;
366
509
  readonly open: _angular_core.WritableSignal<boolean>;
@@ -448,5 +591,5 @@ declare class NxeOptionComponent {
448
591
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<NxeOptionComponent, "nxe-option", ["nxeOption"], {}, {}, never, ["*"], true, never>;
449
592
  }
450
593
 
451
- export { NXE_AUTOCOMPLETE, NxeAutoCompleteComponent, NxeAutocompleteComponent, NxeAutocompleteTriggerDirective, NxeDropDownBoxComponent, NxeDropDownOptionsComponent, NxeListComponent, NxeOptionComponent, NxeSelectBoxComponent, NxeTagBoxComponent };
452
- export type { NxeAutoCompleteSearchMode, NxeAutoCompleteSelectionChangedEvent, NxeAutocompletePanel, NxeListItemClickEvent, NxeSelectionChangedEvent };
594
+ export { NXE_AUTOCOMPLETE, NXE_MENU, NxeAutoCompleteComponent, NxeAutocompleteComponent, NxeAutocompleteTriggerDirective, NxeDropDownBoxComponent, NxeDropDownOptionsComponent, NxeListComponent, NxeOptionComponent, NxePickerSearch, NxeSelectBoxComponent, NxeTagBoxComponent, nxeIsPickerStore };
595
+ export type { NxeAutoCompleteSearchMode, NxeAutoCompleteSelectionChangedEvent, NxeAutocompletePanel, NxeListItemClickEvent, NxeMenuCloseTarget, NxePickerLoadContext, NxePickerLoadOptions, NxePickerLoadResult, NxePickerSearchConfig, NxePickerStore, NxeSearchChangedEvent, NxeSelectionChangedEvent };