@nexterajs/ui 0.0.1 → 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (44) hide show
  1. package/fesm2022/nexterajs-ui-core.mjs +189 -5
  2. package/fesm2022/nexterajs-ui-core.mjs.map +1 -1
  3. package/fesm2022/nexterajs-ui-dropdowns.mjs +314 -50
  4. package/fesm2022/nexterajs-ui-dropdowns.mjs.map +1 -1
  5. package/fesm2022/nexterajs-ui-file-uploader.mjs +6 -3
  6. package/fesm2022/nexterajs-ui-file-uploader.mjs.map +1 -1
  7. package/fesm2022/nexterajs-ui-forms.mjs +729 -370
  8. package/fesm2022/nexterajs-ui-forms.mjs.map +1 -1
  9. package/fesm2022/nexterajs-ui-grid.mjs +1188 -208
  10. package/fesm2022/nexterajs-ui-grid.mjs.map +1 -1
  11. package/fesm2022/nexterajs-ui-intl.mjs +15 -5
  12. package/fesm2022/nexterajs-ui-intl.mjs.map +1 -1
  13. package/fesm2022/nexterajs-ui-notify.mjs +351 -0
  14. package/fesm2022/nexterajs-ui-notify.mjs.map +1 -0
  15. package/fesm2022/nexterajs-ui-pivot.mjs +146 -116
  16. package/fesm2022/nexterajs-ui-pivot.mjs.map +1 -1
  17. package/fesm2022/nexterajs-ui-styling.mjs +568 -3
  18. package/fesm2022/nexterajs-ui-styling.mjs.map +1 -1
  19. package/fesm2022/nexterajs-ui-tree-view.mjs +147 -18
  20. package/fesm2022/nexterajs-ui-tree-view.mjs.map +1 -1
  21. package/fesm2022/nexterajs-ui-validation.mjs +247 -92
  22. package/fesm2022/nexterajs-ui-validation.mjs.map +1 -1
  23. package/fesm2022/nexterajs-ui.mjs +1 -0
  24. package/fesm2022/nexterajs-ui.mjs.map +1 -1
  25. package/package.json +5 -1
  26. package/styles/_dropdown.scss +149 -0
  27. package/styles/_editor.scss +23 -4
  28. package/styles/_icons.scss +92 -0
  29. package/styles/_mixins.scss +104 -1
  30. package/styles/_scrollbar.scss +134 -0
  31. package/styles/_toast.scss +243 -0
  32. package/styles/_tokens.scss +48 -0
  33. package/styles/index.scss +4 -0
  34. package/types/nexterajs-ui-core.d.ts +142 -22
  35. package/types/nexterajs-ui-dropdowns.d.ts +145 -27
  36. package/types/nexterajs-ui-file-uploader.d.ts +4 -1
  37. package/types/nexterajs-ui-forms.d.ts +103 -19
  38. package/types/nexterajs-ui-grid.d.ts +445 -57
  39. package/types/nexterajs-ui-notify.d.ts +147 -0
  40. package/types/nexterajs-ui-pivot.d.ts +35 -22
  41. package/types/nexterajs-ui-styling.d.ts +163 -3
  42. package/types/nexterajs-ui-tree-view.d.ts +50 -1
  43. package/types/nexterajs-ui-validation.d.ts +94 -15
  44. package/types/nexterajs-ui.d.ts +1 -0
@@ -1,6 +1,6 @@
1
1
  import * as _angular_core from '@angular/core';
2
2
  import { OnDestroy, TemplateRef, InjectionToken, OnInit } from '@angular/core';
3
- import { NxeFormControlBase } from '@nexterajs/ui/core';
3
+ import { NxeFormControlBase, NxeExpr } from '@nexterajs/ui/core';
4
4
  import { Subject } from 'rxjs';
5
5
 
6
6
  /** DevExtreme-shaped selection-changed payload (handlers read `selectedItem`). */
@@ -14,10 +14,11 @@ interface NxeSelectionChangedEvent {
14
14
  *
15
15
  * A signal-CVA single-select dropdown over a plain array (`[dataSource]`). It bakes in the app's
16
16
  * global `dxSelectBox.defaultOptions` (`displayExpr='lovName'`, `valueExpr='lovCode'`,
17
- * `searchEnabled`, `showClearButton`), so the bound control value is the `valueExpr` field
18
- * (a string code) and the field shows the `displayExpr` field. Dropdown is a CDK overlay with
19
- * an in-field search filter. Emits `(valueChange)` (the code) and `(onSelectionChanged)`
20
- * (`{selectedItem}`). Hosts a projected `nxe-validator` via {@link NXE_VALIDATION_TARGET}.
17
+ * `searchEnabled`), so the bound control value is the `valueExpr` field (a string code) and the
18
+ * field shows the `displayExpr` field. The clear button follows dx and is off unless asked for.
19
+ * Dropdown is a CDK overlay with an in-field search filter. Emits `(valueChange)` (the code) and
20
+ * `(onSelectionChanged)` (`{selectedItem}`). Hosts a projected `nxe-validator` via
21
+ * {@link NXE_VALIDATION_TARGET}.
21
22
  */
22
23
  declare class NxeSelectBoxComponent extends NxeFormControlBase<unknown> implements OnDestroy {
23
24
  private readonly overlay;
@@ -28,17 +29,28 @@ declare class NxeSelectBoxComponent extends NxeFormControlBase<unknown> implemen
28
29
  /** The source array (plain JS array of `Lov`-shaped objects, or primitives). */
29
30
  readonly dataSource: _angular_core.InputSignal<readonly unknown[]>;
30
31
  /** Field shown in the box/list (DevExtreme default `lovName`). Empty => the item itself. */
31
- readonly displayExprInput: _angular_core.InputSignal<string>;
32
- readonly displayExpr: _angular_core.Signal<string>;
32
+ readonly displayExprInput: _angular_core.InputSignal<NxeExpr>;
33
+ readonly displayExpr: _angular_core.Signal<NxeExpr>;
33
34
  /** Field bound as the control value (DevExtreme default `lovCode`). Empty => the whole item. */
34
- readonly valueExprInput: _angular_core.InputSignal<string>;
35
- readonly valueExpr: _angular_core.Signal<string>;
35
+ readonly valueExprInput: _angular_core.InputSignal<NxeExpr>;
36
+ readonly valueExpr: _angular_core.Signal<NxeExpr>;
36
37
  /** Field matched while searching (DevExtreme default `lovName`). */
37
- readonly searchExprInput: _angular_core.InputSignal<string>;
38
- readonly searchExpr: _angular_core.Signal<string>;
38
+ readonly searchExprInput: _angular_core.InputSignal<NxeExpr>;
39
+ /**
40
+ * dx searches by `displayExpr` when `searchExpr` is not given. Defaulting to the literal
41
+ * 'lovName' instead meant that any picker with a custom displayExpr searched a field its
42
+ * items do not have, and found nothing - silently, because an empty result looks like no
43
+ * match. Where displayExpr is the default this resolves to 'lovName' exactly as before.
44
+ */
45
+ readonly searchExpr: _angular_core.Signal<NxeExpr>;
39
46
  readonly searchEnabledInput: _angular_core.InputSignalWithTransform<boolean, unknown>;
40
47
  readonly searchEnabled: _angular_core.Signal<boolean>;
41
48
  readonly showClearButtonInput: _angular_core.InputSignalWithTransform<boolean, unknown>;
49
+ /**
50
+ * dx defaults `showClearButton` to false (m_text_editor.base.js). The library used to default it
51
+ * on, which gave every host that never asked for one a clear button dx would not show. An app
52
+ * that wants it everywhere says so once through `NXE_DEFAULT_OPTIONS.selectBox.showClearButton`.
53
+ */
42
54
  readonly showClearButton: _angular_core.Signal<boolean>;
43
55
  /** dx parity: dx-select-box shows its drop-down arrow unless showDropDownButton=false. */
44
56
  readonly showDropDownButtonInput: _angular_core.InputSignalWithTransform<boolean, unknown>;
@@ -95,8 +107,10 @@ declare class NxeSelectBoxComponent extends NxeFormControlBase<unknown> implemen
95
107
  * `nxe-tag-box` — drop-in replacement for DevExtreme `dx-tag-box` (multi-select sibling of
96
108
  * `nxe-select-box`). The bound value is an **array of `valueExpr` keys** (`lovCode` strings).
97
109
  * Bakes in the app's global `dxTagBox.defaultOptions` (display/search `lovName`, value `lovCode`,
98
- * search + clear + selection-controls on). Selected items render as removable chips; the dropdown
99
- * shows a checkbox per row. Provides {@link NXE_VALIDATION_TARGET} for a projected `nxe-validator`.
110
+ * search + selection-controls on); the clear button follows dx and is off unless asked for.
111
+ * Selected items render as removable chips; with selection controls the dropdown shows a checkbox
112
+ * per row under a tri-state "Select All". Provides {@link NXE_VALIDATION_TARGET} for a projected
113
+ * `nxe-validator`.
100
114
  */
101
115
  declare class NxeTagBoxComponent extends NxeFormControlBase<unknown[]> implements OnDestroy {
102
116
  private readonly overlay;
@@ -104,16 +118,37 @@ declare class NxeTagBoxComponent extends NxeFormControlBase<unknown[]> implement
104
118
  private readonly dropdownTemplate;
105
119
  private readonly inputEl;
106
120
  readonly dataSource: _angular_core.InputSignal<readonly unknown[]>;
107
- readonly displayExprInput: _angular_core.InputSignal<string>;
108
- readonly displayExpr: _angular_core.Signal<string>;
109
- readonly valueExprInput: _angular_core.InputSignal<string>;
110
- readonly valueExpr: _angular_core.Signal<string>;
111
- readonly searchExprInput: _angular_core.InputSignal<string>;
112
- readonly searchExpr: _angular_core.Signal<string>;
121
+ readonly displayExprInput: _angular_core.InputSignal<NxeExpr>;
122
+ readonly displayExpr: _angular_core.Signal<NxeExpr>;
123
+ readonly valueExprInput: _angular_core.InputSignal<NxeExpr>;
124
+ readonly valueExpr: _angular_core.Signal<NxeExpr>;
125
+ readonly searchExprInput: _angular_core.InputSignal<NxeExpr>;
126
+ /**
127
+ * dx searches by `displayExpr` when `searchExpr` is not given. Defaulting to the literal
128
+ * 'lovName' instead meant that any picker with a custom displayExpr searched a field its
129
+ * items do not have, and found nothing - silently, because an empty result looks like no
130
+ * match. Where displayExpr is the default this resolves to 'lovName' exactly as before.
131
+ */
132
+ readonly searchExpr: _angular_core.Signal<NxeExpr>;
113
133
  readonly searchEnabledInput: _angular_core.InputSignalWithTransform<boolean, unknown>;
114
134
  readonly searchEnabled: _angular_core.Signal<boolean>;
115
135
  readonly showClearButtonInput: _angular_core.InputSignalWithTransform<boolean, unknown>;
136
+ /**
137
+ * dx defaults `showClearButton` to false (m_text_editor.base.js). The library used to default it
138
+ * on, which gave every host that never asked for one a clear button dx would not show. An app
139
+ * that wants it everywhere says so once through `NXE_DEFAULT_OPTIONS.tagBox.showClearButton`.
140
+ */
116
141
  readonly showClearButton: _angular_core.Signal<boolean>;
142
+ readonly showSelectionControlsInput: _angular_core.InputSignalWithTransform<boolean, unknown>;
143
+ /**
144
+ * dx `showSelectionControls`. On (the literal, and what every consumer site passes): a checkbox
145
+ * per row and a tri-state "Select All" row — dx switches its list to `selectionMode: 'all'`
146
+ * (m_tag_box.js `_listConfig`). Off: plain rows whose fill marks the selection
147
+ * (`selectionMode: 'multiple'`).
148
+ */
149
+ readonly showSelectionControls: _angular_core.Signal<boolean>;
150
+ /** dx `selectAllText` — the label of the "Select All" row (dx: `dxList-selectAll`). */
151
+ readonly selectAllText: _angular_core.InputSignal<string>;
117
152
  /** dx parity: dx-tag-box does NOT show a drop-down arrow unless showDropDownButton is set. */
118
153
  readonly showDropDownButtonInput: _angular_core.InputSignalWithTransform<boolean, unknown>;
119
154
  readonly showDropDownButton: _angular_core.Signal<boolean>;
@@ -136,10 +171,21 @@ declare class NxeTagBoxComponent extends NxeFormControlBase<unknown[]> implement
136
171
  protected readonly hasValue: _angular_core.Signal<boolean>;
137
172
  protected readonly filteredItems: _angular_core.Signal<readonly unknown[]>;
138
173
  protected isSelected(item: unknown): boolean;
174
+ /**
175
+ * The "Select All" checkbox value over the rows currently listed — dx `selectAllMode: 'page'`,
176
+ * so a search narrows what it counts: `true` when every listed row is selected, `false` when
177
+ * none is, and `undefined` (indeterminate) in between.
178
+ */
179
+ protected readonly selectAllState: _angular_core.Signal<boolean>;
139
180
  protected onFieldMousedown(event: MouseEvent): void;
140
181
  protected onSearchInput(event: Event): void;
141
182
  protected onBlur(): void;
142
183
  protected toggle(item: unknown, event: Event): void;
184
+ /**
185
+ * dx `_selectAllHandler`: anything short of all-selected selects every listed row (keeping
186
+ * selections the search hides); all-selected deselects the listed rows only.
187
+ */
188
+ protected toggleAll(event: Event): void;
143
189
  protected removeTag(item: unknown, event: Event): void;
144
190
  protected onClear(event: Event): void;
145
191
  protected onKeydown(event: KeyboardEvent): void;
@@ -147,7 +193,7 @@ declare class NxeTagBoxComponent extends NxeFormControlBase<unknown[]> implement
147
193
  private close;
148
194
  ngOnDestroy(): void;
149
195
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<NxeTagBoxComponent, never>;
150
- 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; }; "showDropDownButtonInput": { "alias": "showDropDownButton"; "required": false; "isSignal": true; }; "placeholderInput": { "alias": "placeholder"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, 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>;
151
197
  }
152
198
 
153
199
  /**
@@ -183,10 +229,10 @@ declare class NxeDropDownBoxComponent extends NxeFormControlBase<unknown> implem
183
229
  private readonly options;
184
230
  readonly dataSource: _angular_core.InputSignal<readonly unknown[]>;
185
231
  /** Field name shown in the closed box; empty => the raw value string. */
186
- readonly displayExprInput: _angular_core.InputSignal<string>;
187
- readonly displayExpr: _angular_core.Signal<string>;
188
- readonly valueExprInput: _angular_core.InputSignal<string>;
189
- readonly valueExpr: _angular_core.Signal<string>;
232
+ readonly displayExprInput: _angular_core.InputSignal<NxeExpr>;
233
+ readonly displayExpr: _angular_core.Signal<NxeExpr>;
234
+ readonly valueExprInput: _angular_core.InputSignal<NxeExpr>;
235
+ readonly valueExpr: _angular_core.Signal<NxeExpr>;
190
236
  readonly placeholderInput: _angular_core.InputSignal<string>;
191
237
  readonly placeholder: _angular_core.Signal<string>;
192
238
  /** DevExtreme `[dropDownOptions]` — accepted for parity (popup-class hook). */
@@ -260,6 +306,13 @@ declare class NxeListComponent {
260
306
  id?: string;
261
307
  class?: string;
262
308
  }>;
309
+ /**
310
+ * dx `keyExpr` — the field identifying an item. Used for `@for` tracking, so a list whose
311
+ * items are replaced by equal-but-not-identical objects keeps its DOM instead of rebuilding
312
+ * every row. Falls back to the index when unset, which is the previous behaviour.
313
+ */
314
+ readonly keyExpr: _angular_core.InputSignal<string>;
315
+ protected trackItem(item: unknown, index: number): unknown;
263
316
  readonly onItemClick: _angular_core.OutputEmitterRef<NxeListItemClickEvent>;
264
317
  protected readonly items: _angular_core.Signal<readonly unknown[]>;
265
318
  protected readonly itemTemplateRef: _angular_core.Signal<_angular_core.TemplateRef<unknown>>;
@@ -268,7 +321,72 @@ declare class NxeListComponent {
268
321
  protected isDisabled(item: unknown): boolean;
269
322
  protected select(item: unknown): void;
270
323
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<NxeListComponent, never>;
271
- 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; }; }, { "onItemClick": "onItemClick"; }, ["templates"], never, true, never>;
324
+ 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
+ }
326
+
327
+ /** How a typed query is matched against `searchExpr` (dx `searchMode`). */
328
+ type NxeAutoCompleteSearchMode = 'contains' | 'startswith' | 'equals';
329
+ /** DevExtreme-shaped selection payload, emitted when a suggestion is picked. */
330
+ interface NxeAutoCompleteSelectionChangedEvent {
331
+ selectedItem: unknown;
332
+ value: string | null;
333
+ }
334
+ /**
335
+ * `nxe-auto-complete` — drop-in replacement for DevExtreme `dx-autocomplete`.
336
+ *
337
+ * The distinction from `nxe-select-box` is the value contract, and it is the whole reason this
338
+ * is a separate component: here the control value is the TEXT the user typed. A suggestion is a
339
+ * shortcut for typing, not a constraint on what may be entered, so free text survives and
340
+ * `valueExpr` only says which field of a picked item becomes that text.
341
+ *
342
+ * Deliberately not merged into the existing Material-shaped `nxe-autocomplete`: that one takes
343
+ * projected `nxe-option` children rather than a `[dataSource]`, so the two have incompatible
344
+ * content models and merging them would make every future change to one a risk to the other.
345
+ */
346
+ declare class NxeAutoCompleteComponent extends NxeFormControlBase<string> implements OnDestroy {
347
+ private readonly overlay;
348
+ private readonly viewContainerRef;
349
+ private readonly dropdownTemplate;
350
+ private readonly inputEl;
351
+ readonly dataSource: _angular_core.InputSignal<readonly unknown[]>;
352
+ /** Field of a picked item that becomes the value (dx default `lovName`). */
353
+ readonly valueExpr: _angular_core.InputSignal<NxeExpr>;
354
+ /** Field matched against the query; defaults to {@link valueExpr}, as dx does. */
355
+ readonly searchExprInput: _angular_core.InputSignal<NxeExpr>;
356
+ readonly searchExpr: _angular_core.Signal<NxeExpr>;
357
+ readonly searchMode: _angular_core.InputSignal<NxeAutoCompleteSearchMode>;
358
+ /** Characters required before suggestions appear. dx defaults to 1; 0 shows all on focus. */
359
+ readonly minSearchLength: _angular_core.InputSignal<number>;
360
+ /** dx caps the suggestion list; beyond this the user is expected to keep typing. */
361
+ readonly maxItemCount: _angular_core.InputSignal<number>;
362
+ readonly placeholder: _angular_core.InputSignal<string>;
363
+ readonly showClearButton: _angular_core.InputSignalWithTransform<boolean, unknown>;
364
+ readonly onSelectionChanged: _angular_core.OutputEmitterRef<NxeAutoCompleteSelectionChangedEvent>;
365
+ readonly focused: _angular_core.WritableSignal<boolean>;
366
+ readonly open: _angular_core.WritableSignal<boolean>;
367
+ readonly activeIndex: _angular_core.WritableSignal<number>;
368
+ readonly panelWidth: _angular_core.WritableSignal<number>;
369
+ /** dx `.instance` facade — `focus()` is what the autofocus directive calls. */
370
+ get instance(): this;
371
+ private overlayRef?;
372
+ private closeSub?;
373
+ private flipSub?;
374
+ protected readonly text: _angular_core.Signal<string>;
375
+ protected itemText(item: unknown): string;
376
+ private searchText;
377
+ protected readonly suggestions: _angular_core.Signal<unknown[]>;
378
+ protected onFieldInput(event: Event): void;
379
+ protected onFocus(): void;
380
+ protected onBlur(): void;
381
+ protected pick(item: unknown, event: Event): void;
382
+ protected onKeydown(event: KeyboardEvent): void;
383
+ protected onClear(event: Event): void;
384
+ focus(): void;
385
+ private openPanel;
386
+ private closePanel;
387
+ ngOnDestroy(): void;
388
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<NxeAutoCompleteComponent, never>;
389
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NxeAutoCompleteComponent, "nxe-auto-complete", never, { "dataSource": { "alias": "dataSource"; "required": false; "isSignal": true; }; "valueExpr": { "alias": "valueExpr"; "required": false; "isSignal": true; }; "searchExprInput": { "alias": "searchExpr"; "required": false; "isSignal": true; }; "searchMode": { "alias": "searchMode"; "required": false; "isSignal": true; }; "minSearchLength": { "alias": "minSearchLength"; "required": false; "isSignal": true; }; "maxItemCount": { "alias": "maxItemCount"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "showClearButton": { "alias": "showClearButton"; "required": false; "isSignal": true; }; }, { "onSelectionChanged": "onSelectionChanged"; }, never, ["*"], true, never>;
272
390
  }
273
391
 
274
392
  /** What an `nxe-option` needs from its parent autocomplete: a way to request close on select. */
@@ -330,5 +448,5 @@ declare class NxeOptionComponent {
330
448
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<NxeOptionComponent, "nxe-option", ["nxeOption"], {}, {}, never, ["*"], true, never>;
331
449
  }
332
450
 
333
- export { NXE_AUTOCOMPLETE, NxeAutocompleteComponent, NxeAutocompleteTriggerDirective, NxeDropDownBoxComponent, NxeDropDownOptionsComponent, NxeListComponent, NxeOptionComponent, NxeSelectBoxComponent, NxeTagBoxComponent };
334
- export type { NxeAutocompletePanel, NxeListItemClickEvent, NxeSelectionChangedEvent };
451
+ export { NXE_AUTOCOMPLETE, NxeAutoCompleteComponent, NxeAutocompleteComponent, NxeAutocompleteTriggerDirective, NxeDropDownBoxComponent, NxeDropDownOptionsComponent, NxeListComponent, NxeOptionComponent, NxeSelectBoxComponent, NxeTagBoxComponent };
452
+ export type { NxeAutoCompleteSearchMode, NxeAutoCompleteSelectionChangedEvent, NxeAutocompletePanel, NxeListItemClickEvent, NxeSelectionChangedEvent };
@@ -13,11 +13,14 @@ import { NxeValidationTarget } from '@nexterajs/ui/core';
13
13
  * `required` rule works — invalid while no file is chosen.
14
14
  */
15
15
  declare class NxeFileUploaderComponent implements NxeValidationTarget {
16
+ /** Shows the per-file cancel button — except in `useForm` mode, where dx never renders one
17
+ * (m_file_uploader.js `_getCancelButton` returns null for useForm before it reads this). */
16
18
  readonly allowCanceling: _angular_core.InputSignal<boolean>;
17
19
  readonly accept: _angular_core.InputSignal<string>;
18
20
  readonly labelText: _angular_core.InputSignal<string>;
19
21
  readonly selectButtonText: _angular_core.InputSignal<string>;
20
- /** Accepted for parity; only `useForm` is used (no server upload by the widget). */
22
+ /** Accepted for parity; only `useForm` is used (no server upload by the widget). It also
23
+ * gates the cancel button, which dx omits in `useForm` mode. */
21
24
  readonly uploadMode: _angular_core.InputSignal<"instantly" | "useButtons" | "useForm">;
22
25
  readonly multiple: _angular_core.InputSignal<boolean>;
23
26
  readonly name: _angular_core.InputSignal<string>;
@@ -1,5 +1,5 @@
1
1
  import * as _angular_core from '@angular/core';
2
- import { OnDestroy } from '@angular/core';
2
+ import { OnChanges, SimpleChanges, OnDestroy } from '@angular/core';
3
3
  import { NxeValidationResult, NxeFormControlBase } from '@nexterajs/ui/core';
4
4
  import { DateTime } from 'luxon';
5
5
  import { NxeCalendarZoom, NxePeriodCell } from '@nexterajs/ui/intl';
@@ -30,21 +30,22 @@ interface NxeButtonClickEvent {
30
30
  /**
31
31
  * `nxe-button` — drop-in replacement for DevExtreme `dx-button`.
32
32
  *
33
- * The host element IS the button (mirrors DevExtreme's `dx-button` DOM: the host carries the
34
- * styling classes and contains a single `.dx-button-content` child). This keeps every existing
35
- * `.nxe-btn*` / `.dx-button-content` global rule matching verbatim, and — critically — keeps the
36
- * shared `buttonLoading` directive working, which swaps `.dx-button-content` innerHTML for a
37
- * spinner (`getElementsByClassName('dx-button-content')[0]`).
33
+ * The host element IS the button (mirrors DevExtreme's `nxe-button` DOM: the host carries the
34
+ * styling classes and contains a single `.nxe-button-content` child). This keeps every existing
35
+ * `.nxe-btn*` / `.nxe-button-content` global rule matching verbatim, and — critically — keeps the
36
+ * shared `buttonLoading` directive working, which swaps `.nxe-button-content` innerHTML for a
37
+ * spinner (`getElementsByClassName('nxe-button-content')[0]`).
38
38
  *
39
39
  * Content is projected (`<nxe-icon> + <span>`, the dominant pattern). The legacy `text`/`type`
40
- * inputs render a `.dx-button-text` label for the ~25 attribute-styled buttons.
40
+ * inputs render a `.nxe-button-text` label for the ~25 attribute-styled buttons.
41
41
  *
42
42
  * `onClick` emits {@link NxeButtonClickEvent}; native `(click)` also fires (27 sites bind it).
43
43
  */
44
44
  declare class NxeButtonComponent {
45
45
  private readonly registry;
46
+ private readonly groupScope;
46
47
  private readonly elementRef;
47
- /** Legacy `text` label (rendered as `.dx-button-text` when set, no projected content). */
48
+ /** Legacy `text` label (rendered as `.nxe-button-text` when set, no projected content). */
48
49
  readonly text: _angular_core.InputSignal<string>;
49
50
  /** Style intent (`default`=blue, `success`=green, `danger`=red, `normal`=white). */
50
51
  readonly type: _angular_core.InputSignal<NxeButtonType>;
@@ -55,8 +56,8 @@ declare class NxeButtonComponent {
55
56
  /** DevExtreme parity input; only ever `false` in this codebase (suppresses tab focus). */
56
57
  readonly focusStateEnabled: _angular_core.InputSignalWithTransform<boolean, unknown>;
57
58
  /**
58
- * dx `icon` — renders `<i class="dx-icon dx-icon-NAME">` as the first child of
59
- * `.dx-button-content`, before any projected content. Projection is the dominant pattern
59
+ * dx `icon` — renders `<i class="nxe-icon nxe-icon-NAME">` as the first child of
60
+ * `.nxe-button-content`, before any projected content. Projection is the dominant pattern
60
61
  * here (a `mat-icon` plus a `span`), so the two must coexist rather than compete.
61
62
  */
62
63
  readonly icon: _angular_core.InputSignal<string>;
@@ -83,6 +84,10 @@ type NxeTextBoxMode = 'text' | 'password' | 'email' | 'tel' | 'search';
83
84
  * `[(ngModel)]`, one-way `[value]`, and `[readOnly]`. Like DevExtreme's default
84
85
  * (`valueChangeEvent='change'`), the value commits on **blur** — not on every keystroke.
85
86
  *
87
+ * `showClearButton` (dx default `false`) adds dx's clear area after the input while the field
88
+ * holds text and is neither read-only nor disabled; it sets the value to `''`, dx's own empty
89
+ * value for a text box, and focuses the input.
90
+ *
86
91
  * It provides {@link NXE_VALIDATION_TARGET} so a projected `nxe-validator` can read its value
87
92
  * and push back the invalid message, which renders as the red `.nxe-invalid-message` bubble.
88
93
  */
@@ -93,11 +98,30 @@ declare class NxeTextBoxComponent extends NxeFormControlBase<string> {
93
98
  /** DevExtreme parity input; cosmetic, unused in behaviour. */
94
99
  readonly hoverStateEnabledInput: _angular_core.InputSignalWithTransform<boolean, unknown>;
95
100
  readonly hoverStateEnabled: _angular_core.Signal<boolean>;
101
+ /** dx `showClearButton` — off by default, as in dx; `NXE_DEFAULT_OPTIONS.textBox` can turn it on app-wide. */
102
+ readonly showClearButtonInput: _angular_core.InputSignalWithTransform<boolean, unknown>;
103
+ readonly showClearButton: _angular_core.Signal<boolean>;
96
104
  readonly focused: _angular_core.WritableSignal<boolean>;
97
105
  readonly displayValue: _angular_core.Signal<string>;
106
+ private readonly fieldRef;
107
+ /**
108
+ * The text in the field right now, typed or not. dx shows the clear button by the field's
109
+ * emptiness (`.dx-texteditor-empty`), which follows every keystroke, not the committed value.
110
+ */
111
+ private readonly fieldText;
112
+ protected readonly clearButtonVisible: _angular_core.Signal<boolean>;
113
+ /** dx `valueChangeEvent: 'input'` — the search-as-you-type case. */
114
+ protected onTypedInput(event: Event): void;
115
+ /**
116
+ * dx `_clearValueHandler`: value back to `''`, then focus on the input. The field is emptied by
117
+ * hand as well — typed-but-uncommitted text over an already-empty value would otherwise survive,
118
+ * because the `[value]` binding has not changed.
119
+ */
120
+ protected onClear(event: Event): void;
121
+ protected onTypedKeyup(event: Event): void;
98
122
  protected onBlur(event: Event): void;
99
123
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<NxeTextBoxComponent, never>;
100
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<NxeTextBoxComponent, "nxe-text-box", never, { "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "placeholderInput": { "alias": "placeholder"; "required": false; "isSignal": true; }; "hoverStateEnabledInput": { "alias": "hoverStateEnabled"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
124
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NxeTextBoxComponent, "nxe-text-box", never, { "mode": { "alias": "mode"; "required": false; "isSignal": true; }; "placeholderInput": { "alias": "placeholder"; "required": false; "isSignal": true; }; "hoverStateEnabledInput": { "alias": "hoverStateEnabled"; "required": false; "isSignal": true; }; "showClearButtonInput": { "alias": "showClearButton"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
101
125
  }
102
126
 
103
127
  /**
@@ -115,6 +139,9 @@ declare class NxeTextAreaComponent extends NxeFormControlBase<string> {
115
139
  readonly height: _angular_core.Signal<string | number>;
116
140
  readonly focused: _angular_core.WritableSignal<boolean>;
117
141
  readonly displayValue: _angular_core.Signal<string>;
142
+ /** dx `valueChangeEvent: 'input'` — the search-as-you-type case. */
143
+ protected onTypedInput(event: Event): void;
144
+ protected onTypedKeyup(event: Event): void;
118
145
  protected onBlur(event: Event): void;
119
146
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<NxeTextAreaComponent, never>;
120
147
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<NxeTextAreaComponent, "nxe-text-area", never, { "placeholderInput": { "alias": "placeholder"; "required": false; "isSignal": true; }; "heightInput": { "alias": "height"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
@@ -123,15 +150,33 @@ declare class NxeTextAreaComponent extends NxeFormControlBase<string> {
123
150
  /**
124
151
  * `nxe-check-box` — drop-in replacement for DevExtreme `dx-check-box`.
125
152
  *
126
- * A boolean signal-CVA editor (extends {@link NxeFormControlBase}) — no tri-state, matching all
127
- * usage. Supports `formControlName`/`[(ngModel)]`/`[(value)]`/`[value]`, `[readOnly]`,
128
- * `[disabled]`, an inline `text` label, `(onValueChanged)` (`{value}`) and `(valueChange)` (raw
129
- * boolean). Provides {@link NXE_VALIDATION_TARGET} for a projected `nxe-validator` (a `required`
153
+ * A signal-CVA editor (extends {@link NxeFormControlBase}) over `true` / `false` / `null`. As in
154
+ * dx, a `null` value is the indeterminate state: the box shows a 12px square and reports
155
+ * `aria-checked="mixed"`. That is what a `new FormControl()` (or a `reset()`) looks like, and what
156
+ * `[value]="null"` looks like; an unbound box starts unchecked, like dx's default `false`. A click
157
+ * or Space always lands on `true` or `false` — there is no `enableThreeStateBehavior` cycling back
158
+ * to `null`.
159
+ *
160
+ * Supports `formControlName`/`[(ngModel)]`/`[(value)]`/`[value]`, `[readOnly]`, `[disabled]`, an
161
+ * inline `text` label, `(onValueChanged)` (`{value}`) and `(valueChange)` (raw value). A read-only
162
+ * box stays focusable (tabindex 0) and still shows hover and focus, as in dx; it just never
163
+ * toggles. Provides {@link NXE_VALIDATION_TARGET} for a projected `nxe-validator` (a `required`
130
164
  * rule is invalid while unchecked, matching DevExtreme's RequiredRule treating `false` as empty).
131
165
  */
132
- declare class NxeCheckBoxComponent extends NxeFormControlBase<boolean> {
166
+ declare class NxeCheckBoxComponent extends NxeFormControlBase<boolean> implements OnChanges {
133
167
  /** Inline label rendered next to the box. */
134
168
  readonly text: _angular_core.InputSignal<string>;
169
+ /**
170
+ * Whether a value has been handed in at all — by the forms API or a `[value]` binding.
171
+ *
172
+ * The base class starts `value` at `null`, which is also the indeterminate value, so `null`
173
+ * alone cannot tell "given null" from "given nothing". dx can: its unset value is `false`.
174
+ */
175
+ private readonly valueProvided;
176
+ /** dx `.dx-checkbox-indeterminate`: the value was given, and it is `null`. */
177
+ readonly indeterminate: _angular_core.Signal<boolean>;
178
+ writeValue(value: boolean | null): void;
179
+ ngOnChanges(changes: SimpleChanges): void;
135
180
  protected toggle(event: Event): void;
136
181
  protected onSpace(event: Event): void;
137
182
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<NxeCheckBoxComponent, never>;
@@ -148,6 +193,10 @@ declare class NxeCheckBoxComponent extends NxeFormControlBase<boolean> {
148
193
  *
149
194
  * Supports `formControlName`/`[(ngModel)]`/`[(value)]`/`[value]`, `[readOnly]`, `[min]`/`[max]`,
150
195
  * `format` (string LDML pattern), `(valueChange)` (numeric), and a projected `nxe-validator`.
196
+ *
197
+ * `showClearButton` (dx default `false`) adds dx's clear area after the input while the field
198
+ * holds text and is neither read-only nor disabled; it sets the value to `null`, as dx's
199
+ * `clear()` does for a number box, and focuses the input.
151
200
  */
152
201
  declare class NxeNumberBoxComponent extends NxeFormControlBase<number> {
153
202
  /** LDML format pattern (e.g. `#,##0.00`); empty = raw number. */
@@ -155,14 +204,27 @@ declare class NxeNumberBoxComponent extends NxeFormControlBase<number> {
155
204
  readonly format: _angular_core.Signal<string>;
156
205
  readonly min: _angular_core.InputSignalWithTransform<number, unknown>;
157
206
  readonly max: _angular_core.InputSignalWithTransform<number, unknown>;
207
+ /** dx `showClearButton` — off by default, as in dx; `NXE_DEFAULT_OPTIONS.numberBox` can turn it on app-wide. */
208
+ readonly showClearButtonInput: _angular_core.InputSignalWithTransform<boolean, unknown>;
209
+ readonly showClearButton: _angular_core.Signal<boolean>;
158
210
  readonly focused: _angular_core.WritableSignal<boolean>;
159
211
  private readonly parsedFormat;
212
+ private readonly fieldRef;
160
213
  /** Locale characters, configured once by the application. Defaults to en-US. */
161
214
  private readonly separators;
162
215
  readonly displayValue: _angular_core.Signal<string>;
216
+ /** The text in the field right now; dx shows the clear button by the field's emptiness. */
217
+ private readonly fieldText;
218
+ protected readonly clearButtonVisible: _angular_core.Signal<boolean>;
219
+ protected onFieldInput(event: Event): void;
220
+ /**
221
+ * dx `_clearValueHandler`: value to `null`, then focus on the input. The field is emptied by hand
222
+ * too, for typed-but-uncommitted text over a value that was already `null`.
223
+ */
224
+ protected onClear(event: Event): void;
163
225
  protected onBlur(event: Event): void;
164
226
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<NxeNumberBoxComponent, never>;
165
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<NxeNumberBoxComponent, "nxe-number-box", never, { "formatInput": { "alias": "format"; "required": false; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
227
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NxeNumberBoxComponent, "nxe-number-box", never, { "formatInput": { "alias": "format"; "required": false; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "showClearButtonInput": { "alias": "showClearButton"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
166
228
  }
167
229
 
168
230
  /** DevExtreme date-box `type`. */
@@ -175,6 +237,15 @@ type NxeDateBoxType = 'date' | 'datetime' | 'time';
175
237
  * typeable (parsed on blur per `displayFormat`) and opens a CDK-overlay calendar from the icon
176
238
  * button. Built on Luxon. Default `displayFormat` is `dd-MMM-yyyy`. Hosts a projected
177
239
  * `nxe-validator` via {@link NXE_VALIDATION_TARGET}.
240
+ *
241
+ * `showClearButton` (dx default `false`) adds dx's clear area between the input and the calendar
242
+ * button while the field holds text and is neither read-only nor disabled; it sets the value to
243
+ * `null` and focuses the input.
244
+ *
245
+ * The button and calendar glyphs are drawn in an 18-unit viewBox (1 unit = 1px) to the ink measured
246
+ * off dx's `event` (`date`), `eventall` (`datetime`) and `clock` (`time`) glyphs and its chevrons,
247
+ * each laid out from those metrics in rects, stroked rects and circles, and straight-edged polygons;
248
+ * the templates state each construction.
178
249
  */
179
250
  declare class NxeDateBoxComponent extends NxeFormControlBase<string> implements OnDestroy {
180
251
  private readonly overlay;
@@ -187,6 +258,9 @@ declare class NxeDateBoxComponent extends NxeFormControlBase<string> implements
187
258
  /** DevExtreme `[min]`/`[max]` bounds: calendar days outside are disabled, typed values clamp. */
188
259
  readonly min: _angular_core.InputSignal<string | Date>;
189
260
  readonly max: _angular_core.InputSignal<string | Date>;
261
+ /** dx `showClearButton` — off by default, as in dx; `NXE_DEFAULT_OPTIONS.dateBox` can turn it on app-wide. */
262
+ readonly showClearButtonInput: _angular_core.InputSignalWithTransform<boolean, unknown>;
263
+ readonly showClearButton: _angular_core.Signal<boolean>;
190
264
  readonly focused: _angular_core.WritableSignal<boolean>;
191
265
  readonly opened: _angular_core.WritableSignal<boolean>;
192
266
  readonly viewMonth: _angular_core.WritableSignal<DateTime<boolean>>;
@@ -199,6 +273,9 @@ declare class NxeDateBoxComponent extends NxeFormControlBase<string> implements
199
273
  readonly effectivePlaceholder: _angular_core.Signal<string>;
200
274
  private readonly selected;
201
275
  readonly displayValue: _angular_core.Signal<string>;
276
+ /** The text in the field right now; dx shows the clear button by the field's emptiness. */
277
+ private readonly fieldText;
278
+ protected readonly clearButtonVisible: _angular_core.Signal<boolean>;
202
279
  readonly weeks: _angular_core.Signal<DateTime<boolean>[][]>;
203
280
  /** Two-digit hour/minute for the popup's time strip; blank when nothing is selected. */
204
281
  readonly hourText: _angular_core.Signal<string>;
@@ -231,6 +308,13 @@ declare class NxeDateBoxComponent extends NxeFormControlBase<string> implements
231
308
  disabled: boolean;
232
309
  }): void;
233
310
  protected onButtonMousedown(event: Event): void;
311
+ protected onFieldInput(event: Event): void;
312
+ /**
313
+ * dx `_clearValueHandler`: value to `null` (dx's `clear()` for a date box), then focus on the
314
+ * input. `syncField` repaints the field, so typed-but-uncommitted text over a value that was
315
+ * already `null` goes too.
316
+ */
317
+ protected onClear(event: Event): void;
234
318
  protected onFocus(event: Event): void;
235
319
  /**
236
320
  * Commit what the user TYPED — and nothing when they typed nothing.
@@ -269,13 +353,13 @@ declare class NxeDateBoxComponent extends NxeFormControlBase<string> implements
269
353
  protected close(): void;
270
354
  ngOnDestroy(): void;
271
355
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<NxeDateBoxComponent, never>;
272
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<NxeDateBoxComponent, "nxe-date-box", never, { "type": { "alias": "type"; "required": false; "isSignal": true; }; "displayFormat": { "alias": "displayFormat"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
356
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<NxeDateBoxComponent, "nxe-date-box", never, { "type": { "alias": "type"; "required": false; "isSignal": true; }; "displayFormat": { "alias": "displayFormat"; "required": false; "isSignal": true; }; "placeholder": { "alias": "placeholder"; "required": false; "isSignal": true; }; "min": { "alias": "min"; "required": false; "isSignal": true; }; "max": { "alias": "max"; "required": false; "isSignal": true; }; "showClearButtonInput": { "alias": "showClearButton"; "required": false; "isSignal": true; }; }, {}, never, ["*"], true, never>;
273
357
  }
274
358
 
275
359
  /**
276
360
  * `nxe-scroll-view` — drop-in replacement for DevExtreme `dx-scroll-view`.
277
361
  *
278
- * In this app `dx-scroll-view` is used purely as a dumb scroll container: no `@ViewChild`, no
362
+ * In this app `nxe-scroll-view` is used purely as a dumb scroll container: no `@ViewChild`, no
279
363
  * `.instance` methods, no events (see survey). Every live tag is the same literal triple
280
364
  * `[scrollByContent]="true" [scrollByThumb]="true" [showScrollbar]="'onScroll'"`. So this is a
281
365
  * styled `overflow:auto` wrapper that projects its content inside a `.nxe-scrollview-content`