@xiriframework/xiri-ng 0.4.13 → 0.4.15

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xiriframework/xiri-ng",
3
- "version": "0.4.13",
3
+ "version": "0.4.15",
4
4
  "description": "Angular UI component library for the Xiri Framework",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: xiri-ng-expert
3
- description: Experte für die xiri-ng Angular-Library. Verwende diesen Skill IMMER wenn Angular-Code geschrieben wird der @xiriframework/xiri-ng importiert, oder wenn der User nach xiri-Komponenten (xiri-dyncomponent, xiri-form-fields, xiri-table, xiri-card usw.), XiriDataService, XiriSnackbarService, provideXiriServices, Form-Feldern mit showWhen-Bedingungen oder reloadOn-Abhängigkeiten (Optionen vom Server nachladen), addUrl („+“-Button legt neue Option per Dialog an), oder Server-Side-Tables fragt.
3
+ description: Experte für die xiri-ng Angular-Library. Verwende diesen Skill IMMER wenn Angular-Code geschrieben wird der @xiriframework/xiri-ng importiert, oder wenn der User nach xiri-Komponenten (xiri-dyncomponent, xiri-form-fields, xiri-table, xiri-card usw.), XiriDataService, XiriSnackbarService, provideXiriServices, Form-Feldern mit showWhen-Bedingungen, reloadOn-Abhängigkeiten oder Textfeld-Vorschlägen (Autocomplete mit Freitext: list/url/searchWith) (Optionen vom Server nachladen), addUrl („+“-Button legt neue Option per Dialog an), oder Server-Side-Tables fragt.
4
4
  ---
5
5
 
6
6
  # xiri-ng Expert
@@ -133,6 +133,7 @@ Verfügbare `type`-Werte: `text`, `email`, `password`, `textarea`, `number`, `bo
133
133
  `display` = `'full' | 'line' | 'small'` — Layout-Modus.
134
134
 
135
135
  **showWhen-Operators:** `equals`, `notEquals`, `contains`, `greaterThan`, `lessThan`, `in`, `notEmpty`.
136
+ Versteckte Felder sind disabled: kein Wert im Submit, keine Validierung (ab 0.4.14; Details `references/form-fields.md`).
136
137
 
137
138
  **reloadOn — Inhalt vom Server nachladen.** Während `showWhen` ein Feld nur ein- und ausblendet,
138
139
  lädt `reloadOn` seinen Inhalt neu, sobald sich ein anderes Feld ändert:
@@ -146,13 +147,30 @@ Beides ist Pflicht. Die Komponente postet **nur die Trigger-Werte** (`{departmen
146
147
  entprellt, ein Request pro URL, `switchMap`) und erwartet
147
148
  `{ "fields": { "team": { "list": [...], "required": true } } }`. Ein Reload läuft zusätzlich immer
148
149
  einmal direkt nach dem Aufbau der Controls. Werte, die die neue `list` noch anbietet, bleiben
149
- erhalten (rekursiv über `children`), der Rest wird verworfen — außer bei `chips` und Selects mit
150
- `url`, deren Liste nur ein Vorschlag bzw. der statische Sockel ist.
150
+ erhalten (rekursiv über `children`), der Rest wird verworfen — außer bei `chips`, `text` (Liste sind
151
+ nur Vorschläge) und Selects mit `url`, deren Liste der statische Sockel ist.
151
152
 
152
153
  Patchbar sind `list`, `name`, `hint`, `class`, `required`, `disabled`, `hide`, `search`, `min`,
153
- `max`, `params` — jeweils nur mit passendem Typ. `value`, `type`, `id` und `url` bewusst nicht.
154
+ `max`, `params` — jeweils nur mit passendem Typ. `value`, `type`, `id`, `url` und `searchWith` bewusst nicht.
154
155
  Details und Grenzen in `references/form-fields.md`.
155
156
 
157
+ **Vorschläge am Textfeld (mat-autocomplete, Freitext bleibt).** Ein `text`-Feld mit `list` und/oder
158
+ `url` zeigt beim Tippen ein Vorschlags-Panel; eingetippt werden darf trotzdem alles:
159
+
160
+ ```typescript
161
+ { id: 'city', type: 'text', name: 'Stadt',
162
+ list: [ { id: 'Wien', name: 'Wien' }, { id: 'Graz', name: 'Graz' } ], // lokal gefiltert
163
+ url: 'City/Suggest', searchWith: [ 'country' ] } // beim Tippen nachladen
164
+ ```
165
+
166
+ `list` wird lokal gefiltert (`id === name`), `url` wird 200 ms entprellt per
167
+ `POST { search: 'gr', country: 3 }` gefragt — `searchWith` nennt Feld-IDs derselben Form, deren
168
+ aktueller Wert mitgeht (nur enabled Felder) — und erwartet `[{ id, name }]`; eingesetzt wird `name`,
169
+ Servertreffer hängen hinter den lokalen. Enter/Blur übernehmen nie automatisch, ein `reloadOn`-Patch
170
+ der `list` löscht den Text nicht. Kommen die Vorschläge erst per Reload, initial `list: []` setzen,
171
+ sonst rendert die Komponente ein normales Textfeld und tauscht das Input beim Patch aus. Go:
172
+ `field.NewTextField(...).SetSuggestions(...)` / `.SetSuggestionsURL(u, ids...)` + `builder.BindSuggest`.
173
+
156
174
  **addUrl — neue Option per Dialog anlegen.** `select`, `multiselect`/`treeselect`, `object`/`model`
157
175
  und `chips` bekommen mit `addUrl` einen „+“-Button neben dem Feld:
158
176
 
@@ -189,6 +207,9 @@ submit() {
189
207
 
190
208
  Lädt Felder + Buttons vom Backend, submit → POST → response-handler navigiert/refresht.
191
209
 
210
+ Fehler: ein 400 mit `{error, fields?: {id: message}}` (xiri-go `response.NewErrorResponseFromError`) zeigt jede
211
+ Feldmeldung als `mat-error` am Feld, der Banner bleibt leer; ohne `fields` erscheint `error` als Banner (`xiri-error`).
212
+
192
213
  ## xiri-table — volle Datentabelle
193
214
 
194
215
  ```html
@@ -462,5 +483,8 @@ edit(row: any) {
462
483
  - Nicht `reloadOn` ohne `reloadUrl` (oder umgekehrt) — eine halbe Deklaration wird ignoriert
463
484
  - Nicht `url` **und** `reloadOn` auf demselben treeselect — mit `url` lädt es seinen Baum selbst
464
485
  per GET und ignoriert die gepatchte `list`
486
+ - Kein `select` oder `chips`, wenn der Wert frei getippt werden darf und die Liste nur hilft —
487
+ `type: 'text'` mit `list` und/oder `url` (+ `searchWith`). Ein normales Textfeld ohne beides bleibt
488
+ ohne Autocomplete-Trigger; Vorschläge, die erst per `reloadOn` kommen, brauchen initial `list: []`
465
489
  - Keinen eigenen „Neu anlegen“-Button neben ein Select bauen — `addUrl` am Feld, der Dialog-POST
466
490
  antwortet mit `created: { id, name }`
@@ -20,6 +20,11 @@ interface XiriFormSettings {
20
20
 
21
21
  Outputs: keine.
22
22
 
23
+ Fehlerantworten (HTTP 400/403/404/0) landen als `XiriFormServiceError { error: string; fields?: Record<string, string> }`
24
+ im Formular: `fields` (xiri-go `response.NewErrorResponseFromError`, Feld-ID → Meldung) gehen als `serverErrors` an
25
+ `xiri-form-fields` und erscheinen als `mat-error` am Feld, der Fehler-Banner bleibt dann leer. Ohne `fields` steht `error`
26
+ im Banner (`xiri-error`). Signals: `fieldErrors()`, `error()`.
27
+
23
28
  ### xiri-dialog (via MatDialog)
24
29
 
25
30
  ```typescript
@@ -31,19 +31,19 @@ export interface XiriDynData {
31
31
  mode?: string; // Nur für 'barchart': 'simple' | 'stacked' | 'heatmap'
32
32
  }
33
33
 
34
- export type XiriDynDataType =
35
- | 'card' | 'buttonline' | 'table' | 'cardlink' | 'links'
36
- | 'form' | 'query' | 'stepper' | 'header' | 'list'
37
- | 'spacer' | 'container'
38
- | 'infopoint' | 'multiprogress' | 'imagetext'
39
- | 'tabs' | 'expansion' | 'infotext' | 'html'
40
- | 'stat' | 'empty-state' | 'timeline'
41
- | 'page-header' | 'section' | 'divider'
42
- | 'stat-grid' | 'toolbar' | 'description-list'
43
- | 'barchart' | 'linechart' | 'piechart' | 'gaugechart'
44
- | 'heatmap' | 'calendar' | 'tree' | 'sankey' | 'gantt';
34
+ // Einzige Quelle aller type-Werte; die Union wird daraus abgeleitet.
35
+ export const XIRI_COMPONENT_TYPES = ['card', 'buttonline', 'table', 'cardlink', /* … */ 'status', 'callout'] as const;
36
+ export type XiriDynDataType = typeof XIRI_COMPONENT_TYPES[number];
37
+
38
+ // Maschinenlesbarer Katalog (Name, Kategorie, Demo-Route, goBuilder, Keywords) je Typ.
39
+ export const COMPONENT_CATALOG: readonly XiriCatalogEntry[];
45
40
  ```
46
41
 
42
+ `XIRI_COMPONENT_TYPES`, `COMPONENT_CATALOG` und `XiriCatalogEntry` sind exportiert. Der Katalog ist
43
+ maschinenlesbar: Agenten und Tools können ihn importieren, um zu erfahren, welche `type`-Werte der
44
+ Renderer kennt und welche davon xiri-go ausgibt (`goBuilder`; Gegenstück `core.ComponentTypes()`).
45
+ `catalog-parity.spec.ts` prüft Renderer-`@case`, Vertrag und Katalog gegeneinander.
46
+
47
47
  ## Mapping type → Komponente
48
48
 
49
49
  | `type` | Rendered Component | `data` = Settings-Interface |
@@ -15,8 +15,14 @@ Renderer für `XiriFormField[]`. Baut intern eine `UntypedFormGroup` mit Reactiv
15
15
  @input display: XiriFormFieldDisplay = 'full' // 'full' | 'line' | 'small'
16
16
  @input disabled: boolean = false
17
17
  @input check: Observable<void> = null // Trigger für Revalidierung
18
+ @input serverErrors: Record<string, string> | null = null // Validierungsfehler pro Feld-ID vom Server
18
19
  ```
19
20
 
21
+ `serverErrors` trägt die `fields` einer 400-Antwort (xiri-go `response.NewErrorResponseFromError`,
22
+ `{id: message}`). Jede Meldung erscheint als `mat-error` am Feld und verschwindet bei der nächsten
23
+ Eingabe; unbekannte IDs werden ignoriert. `xiri-form` setzt den Input automatisch aus
24
+ `XiriFormServiceError.fields` und lässt den Fehler-Banner dann leer.
25
+
20
26
  ### Outputs
21
27
 
22
28
  ```typescript
@@ -80,7 +86,7 @@ export interface XiriFormField {
80
86
  // --- State ---
81
87
  hide?: boolean;
82
88
  required?: boolean;
83
- disabled?: boolean; // greift beim Aufbau nur bei den zusammengesetzten Feldtypen, s.u.
89
+ disabled?: boolean; // Control beim Aufbau disabled, Feld fällt aus formGroup.value (s.u.)
84
90
  collapsible?: boolean; // header
85
91
  collapsed?: boolean; // header initial
86
92
 
@@ -109,6 +115,10 @@ export interface XiriFormField {
109
115
  // --- Conditional Display ---
110
116
  showWhen?: XiriFormFieldCondition | XiriFormFieldCondition[];
111
117
 
118
+ // --- Text: Vorschläge (mat-autocomplete, Freitext bleibt) ---
119
+ // list (id === name) lokal gefiltert; url beim Tippen: POST {search, <searchWith-Felder>} -> [{id, name}]
120
+ searchWith?: string[]; // Feld-IDs derselben Form, deren aktueller (enabled) Wert mitgeht
121
+
112
122
  // --- Server-driven content ---
113
123
  reloadOn?: string[]; // Feld-IDs, deren Änderung dieses Feld neu lädt
114
124
  reloadUrl?: string; // Endpoint für den Reload (beides oder keins)
@@ -122,22 +132,25 @@ export interface XiriFormField {
122
132
  }
123
133
  ```
124
134
 
125
- **`disabled` beim Aufbau.** Das Feld deaktiviert beim Formularaufbau **nicht** das äußere
126
- FormControl — `createControl()` legt es immer `enabled` an. Ausgewertet wird es nur von den
127
- zusammengesetzten Feldtypen (`date`, `daterange`, `datetimerange`, `yearmonth`, `treeselect`,
128
- `volume`, `file`), die es in ihrem eigenen `field`-Setter lesen. Bei `text`, `number`, `textarea`,
129
- `select`, `multiselect` und `bool` bleibt es beim Aufbau wirkungslos, weil das Template
130
- `field.disabled` nicht auswertet.
135
+ **`disabled` (ab 0.4.14).** Ein Feld mit `disabled: true` bekommt beim Aufbau ein **disabled FormControl** —
136
+ bei allen Feldtypen, auch `text`, `select`, `bool`, `timelimit`. Es fällt damit aus `formGroup.value`
137
+ (kein Wert im Submit-Body) und aus der Validierung; xiri-go bindet für den Key ohnehin nie den
138
+ Request-Wert, sondern den Default. `formGroup.get(id).disable()` von außen, das `disabled`-Input der
139
+ ganzen `xiri-form-fields` und ein `disabled` aus einem `reloadOn`-Patch verhalten sich gleich. Wer einen
140
+ Server-Wert nur anzeigen will, nimmt ein `info`-Feld.
131
141
 
132
- Was zuverlässig wirkt: `formGroup.get(id).disable()` von außen (seit 0.4.4 auf allen Feldtypen),
133
- der `disabled`-Input der ganzen `xiri-form-fields`, und ein `disabled` aus einem `reloadOn`-Patch —
134
- letzterer geht über das FormControl, das Feld fällt dann also auch aus `formGroup.value`.
142
+ Eine bewusste Ausnahme vom „kein Wert“: **Reload-Trigger** gehen über `getRawValue()`, ein disabled
143
+ Trigger-Feld steuert also weiterhin abhängige Listen. Eine FormGroup, deren Controls **alle** disabled sind
144
+ (nur gesperrte Felder, oder gesperrte plus per `showWhen` versteckte), ist bei Angular `DISABLED` statt `VALID`
145
+ (`valid === false`, `invalid === false`) und liefert alle Werte als Rohwert; `xiri-form`, `xiri-dialog`,
146
+ `xiri-query` und `xiri-stepper` normalisieren das über `formState()` zu gültig mit Payload `{}` — ein
147
+ Anzeige-Formular bleibt absendbar, und versteckte Werte gehen nie zum Server (der `showWhen` nicht kennt).
135
148
 
136
149
  ### Feld-Typen
137
150
 
138
151
  | `type` | Rendered als | Wichtige Properties |
139
152
  | --------------- | ------------------------------------------------- | ---------------------------------- |
140
- | `text` | Mat-Input | `subtype` (email/url), `pattern` |
153
+ | `text` | Mat-Input, mit `list`/`url` plus mat-autocomplete | `subtype` (email/url), `pattern`, `list`, `url`, `searchWith` (Vorschläge) |
141
154
  | `email` | Mat-Input type=email | |
142
155
  | `password` | Mat-Input type=password | `pwdhide` |
143
156
  | `textarea` | Mat-Textarea | `rows` |
@@ -232,6 +245,44 @@ Array = **UND**-Verknüpfung:
232
245
  ]}
233
246
  ```
234
247
 
248
+ **Laufzeitverhalten (ab 0.4.14):** Ein per `showWhen` verstecktes Feld wird im FormGroup **disabled**.
249
+ Es fehlt damit in `formGroup.value` und im Submit-Body, und seine Validatoren zählen nicht — ein
250
+ verstecktes Pflichtfeld blockiert den Submit nicht. Wird es wieder sichtbar, wird es enabled und
251
+ behält seinen letzten Wert; ein vom Backend gesetztes `disabled: true` oder das globale
252
+ `disabled`-Input bleiben dabei bestehen. Felder in **eingeklappten Sections** gelten nicht als
253
+ versteckt und bleiben enabled. Bedingungen lesen `control.value` direkt, ein disabled Trigger-Feld
254
+ funktioniert also weiterhin als Trigger. Server-seitig bindet xiri-go für den fehlenden Key den
255
+ Konstruktor-Default.
256
+
257
+ ### Vorschläge am Textfeld — `list`, `url`, `searchWith`
258
+
259
+ Ein `text`-Feld mit `list` und/oder `url` bekommt ein `mat-autocomplete`-Panel (`XiriSuggestDirective`,
260
+ exportiert). Der Wert bleibt ein freier String — die Directive schreibt nie ins Control, eine Auswahl
261
+ setzt `name` ein.
262
+
263
+ ```typescript
264
+ { id: 'city', type: 'text', name: 'Stadt',
265
+ list: [ { id: 'Wien', name: 'Wien' }, { id: 'Graz', name: 'Graz' } ],
266
+ url: 'City/Suggest', searchWith: [ 'country' ] }
267
+ ```
268
+
269
+ - `list` wird lokal case-insensitiv nach `name` gefiltert und ist per `reloadOn` patchbar; der Patch
270
+ erreicht das offene Panel sofort und löscht den getippten Text nicht.
271
+ - `url`: 200 ms nach der letzten Eingabe `POST url { ...kontext, search }`; eine neue Eingabe bricht
272
+ Timer und laufenden Request ab, alte Antworten landen nie. Leere Eingabe fragt nicht an. Antwort
273
+ `[{ id, name }]`, Elemente ohne String-`name` werden verworfen, Treffer hängen hinter den lokalen,
274
+ Duplikate (nach `name`) fallen weg. Fokus allein löst keine Suche aus.
275
+ - `searchWith`: Feld-IDs derselben Form (flache Schlüssel); mitgeschickt wird der Wert zur Request-Zeit,
276
+ nur von enabled Controls. `search` ist reserviert. Nicht patchbar (wie `url`).
277
+ - Ohne `list`/`url` bleibt das Textfeld unverändert (DefaultValueAccessor, kein Autocomplete-Trigger).
278
+ Deshalb: kommen die Vorschläge erst per `reloadOn`, initial `list: []` liefern — sonst wechselt beim
279
+ Patch der Template-Zweig und das fokussierte Input wird ersetzt.
280
+ - Enter/Blur übernehmen nie automatisch einen Vorschlag (`requireSelection`, `autoActiveFirstOption`,
281
+ `autoSelectActiveOption` sind explizit `false`, unabhängig von `MAT_AUTOCOMPLETE_DEFAULT_OPTIONS`).
282
+ Ist das Control disabled, sind die Optionen disabled.
283
+ - Go: `field.NewTextField(...).SetSuggestions("Wien", "Graz")`, `.SetSuggestionsURL(u, "country")`,
284
+ Handler `builder.BindSuggest(c, country)` (siehe xiri-go-expert).
285
+
235
286
  ### reloadOn — Inhalt vom Server nachladen
236
287
 
237
288
  `showWhen` blendet ein Feld ein und aus. `reloadOn` lädt seinen **Inhalt** neu, sobald sich ein
@@ -270,7 +321,7 @@ Nach einem `list`-Patch behält das Feld alle Werte, die die neue Liste noch anb
270
321
  (rekursiv über `children`), und verwirft die übrigen. Ein `value` im Patch wird ignoriert — der
271
322
  Wert gehört dem Client.
272
323
 
273
- Nicht geprunt wird, wo die Liste nicht autoritativ ist: bei `chips` (nur Vorschläge) und bei
324
+ Nicht geprunt wird, wo die Liste nicht autoritativ ist: bei `chips` und `text` (nur Vorschläge) und bei
274
325
  Selects mit `url` (dort ist `list` nur der statische Sockel der Server-Suche).
275
326
 
276
327
  **Patchbare Properties**
@@ -201,6 +201,8 @@ export interface XiriTableField {
201
201
 
202
202
  buttons?: XiriButton[]; // Action-Buttons in der Zelle
203
203
  icons?: { icon: string; color?: string; hint?: string }[];
204
+ // format 'icon': row[id] wählt das Icon; row[id + 'Hint'] (xiri-go
205
+ // WithRowHint) überschreibt ab 0.4.14 den Icon-hint als Tooltip pro Zeile
204
206
 
205
207
  display?: string; // CSS-Klasse auf <td>
206
208
  header?: string; // Custom Header-Text (falls ≠ name)
@@ -385,6 +387,7 @@ tableSettings: XiriTableSettings = {
385
387
  { icon: 'check_circle', color: 'success', hint: 'Aktiv' },
386
388
  { icon: 'cancel', color: 'warn', hint: 'Inaktiv' },
387
389
  ]},
390
+ // Row mit { status: 0, statusHint: 'Aktiv seit 08:12' } zeigt den Row-Hint statt 'Aktiv'
388
391
  { id: 'count', name: 'Anzahl', format: 'number',
389
392
  webformat: 'integer', align: 'right', footer: 'sum' },
390
393
  { id: 'note', name: 'Notiz', editable: true, inputType: 'text' },
@@ -108,6 +108,7 @@ interface XiriFormField {
108
108
  url?: string;
109
109
  search?: boolean;
110
110
  serverSideSearch?: boolean;
111
+ searchWith?: string[];
111
112
  params?: Record<string, unknown>;
112
113
  rows?: number;
113
114
  accept?: string;
@@ -141,6 +142,7 @@ declare class XiriFormFieldsComponent implements OnInit {
141
142
  disabled: _angular_core.InputSignal<boolean>;
142
143
  formChange: _angular_core.OutputEmitterRef<UntypedFormGroup>;
143
144
  check: _angular_core.InputSignal<Observable<void> | null>;
145
+ serverErrors: _angular_core.InputSignal<Record<string, string> | null>;
144
146
  formGroup: UntypedFormGroup;
145
147
  private lastValue;
146
148
  private _fields;
@@ -163,6 +165,7 @@ declare class XiriFormFieldsComponent implements OnInit {
163
165
  private fetchPatches;
164
166
  protected openAdd(id: string): void;
165
167
  private addOption;
168
+ private applyServerError;
166
169
  private applyPatch;
167
170
  private pruneValue;
168
171
  fields: _angular_core.Signal<XiriFormField[] | null>;
@@ -170,12 +173,14 @@ declare class XiriFormFieldsComponent implements OnInit {
170
173
  private bindValidations;
171
174
  private validateAllFormFields;
172
175
  isFieldVisible(field: XiriFormField): boolean;
176
+ private matchesShowWhen;
177
+ private syncConditionalControls;
173
178
  toggleSection(header: XiriFormField): void;
174
179
  isSectionCollapsed(headerId: string): boolean;
175
180
  private isInCollapsedSection;
176
181
  private evaluateCondition;
177
182
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<XiriFormFieldsComponent, never>;
178
- static ɵcmp: _angular_core.ɵɵComponentDeclaration<XiriFormFieldsComponent, "xiri-form-fields", never, { "form": { "alias": "form"; "required": false; "isSignal": true; }; "display": { "alias": "display"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "check": { "alias": "check"; "required": false; "isSignal": true; }; }, { "formChange": "formChange"; }, never, never, true, never>;
183
+ static ɵcmp: _angular_core.ɵɵComponentDeclaration<XiriFormFieldsComponent, "xiri-form-fields", never, { "form": { "alias": "form"; "required": false; "isSignal": true; }; "display": { "alias": "display"; "required": false; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "check": { "alias": "check"; "required": false; "isSignal": true; }; "serverErrors": { "alias": "serverErrors"; "required": false; "isSignal": true; }; }, { "formChange": "formChange"; }, never, never, true, never>;
179
184
  }
180
185
 
181
186
  type XiriSelectPredicate = (filter: string, element: XiriFormFieldSelectOption) => boolean;
@@ -221,6 +226,37 @@ declare class XiriSelectDirective implements OnInit, OnDestroy {
221
226
  static ɵdir: _angular_core.ɵɵDirectiveDeclaration<XiriSelectDirective, "[xiriSelect]", ["xiriSelect"], { "predicate": { "alias": "predicate"; "required": false; "isSignal": true; }; "compare": { "alias": "compare"; "required": false; "isSignal": true; }; "serverSideSearch": { "alias": "serverSideSearch"; "required": false; "isSignal": true; }; "serverUrl": { "alias": "serverUrl"; "required": false; "isSignal": true; }; "serverParams": { "alias": "serverParams"; "required": false; "isSignal": true; }; "values": { "alias": "values"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
222
227
  }
223
228
 
229
+ /**
230
+ * Vorschläge für ein Textfeld (mat-autocomplete): `field.list` wird lokal gefiltert, bei `field.url`
231
+ * wird beim Tippen nachgeladen (POST {search, <searchWith-Felder>} -> [{id, name}]). Freie Eingabe
232
+ * bleibt immer erlaubt - die Directive schreibt nie ins Control, sie liefert nur `options()`.
233
+ *
234
+ * Bewusst über DOM-Events statt control.valueChanges: form-fields tauscht Controls bei Formular-
235
+ * ersetzung aus, die Directive überlebt dank `track field.id` - ein gegriffenes Control wäre alt.
236
+ */
237
+ declare class XiriSuggestDirective {
238
+ field: _angular_core.InputSignal<XiriFormField>;
239
+ private search;
240
+ private remote;
241
+ /** Jeder next() startet die Remote-Kette neu und bricht die vorige ab. */
242
+ private typed$;
243
+ private dataService;
244
+ /** Das formGroup von form-fields; optional, damit die Directive auch an einem nackten Input läuft. */
245
+ private formGroupDir;
246
+ /** Was das Panel zeigt: lokale Treffer, dann Servertreffer, nach name dedupliziert. */
247
+ options: _angular_core.Signal<XiriFormFieldSelectOption[]>;
248
+ constructor();
249
+ onInput(event: Event): void;
250
+ /** Fokus richtet den lokalen Filter am sichtbaren Wert aus und verwirft bei geändertem Wert alte
251
+ * Servertreffer - ohne Request: form-fields fokussiert auch programmatisch. */
252
+ onFocus(event: Event): void;
253
+ private reset;
254
+ /** Aktuelle Werte der searchWith-Felder (flache Schlüssel, nur enabled), zur Request-Zeit gelesen. */
255
+ private contextValues;
256
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<XiriSuggestDirective, never>;
257
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<XiriSuggestDirective, "input[xiriSuggest]", ["xiriSuggest"], { "field": { "alias": "xiriSuggest"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
258
+ }
259
+
224
260
  interface XiriButton {
225
261
  text: string;
226
262
  type: string;
@@ -353,6 +389,8 @@ interface XiriTableField {
353
389
  editableOptionsUrl?: string;
354
390
  editableOptionsSearch?: boolean;
355
391
  editableSearchUrl?: string;
392
+ /** Go builder: cells of this column are { d: display, v: raw value } objects (see table/cell.ts); the value names the kind of v. */
393
+ cellObject?: 'string' | 'number';
356
394
  }
357
395
 
358
396
  /** A single table row: a map of column id → cell value (value shapes vary by column format). */
@@ -373,6 +411,8 @@ declare class XiriRawTableComponent {
373
411
  dataSource: MatTableDataSource<XiriRawTableRow, _angular_material_paginator.MatPaginator>;
374
412
  tableClass: _angular_core.WritableSignal<string>;
375
413
  constructor();
414
+ cellText(row: XiriRawTableRow, column: XiriTableField): unknown;
415
+ cellLines(row: XiriRawTableRow, column: XiriTableField): unknown[];
376
416
  private loadFields;
377
417
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<XiriRawTableComponent, never>;
378
418
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<XiriRawTableComponent, "xiri-raw-table", never, { "settings": { "alias": "settings"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
@@ -412,6 +452,8 @@ interface XiriTreeMeta {
412
452
  childCount: number;
413
453
  dimmed?: boolean;
414
454
  }
455
+ /** Resolves the value a tree column sorts its siblings by (see sortValue in cell.ts). */
456
+ type XiriTreeSortKey = (row: XiriTableRow) => string | number;
415
457
  declare class XiriTableTreeService {
416
458
  private localStorage;
417
459
  private config;
@@ -428,8 +470,8 @@ declare class XiriTableTreeService {
428
470
  get hasAddSub(): boolean;
429
471
  /** Initialises the service from the table's tree settings. treeColumn falls back to firstColumnId. */
430
472
  init(config: XiriTableTreeSettings, firstColumnId: string): void;
431
- /** Builds the tree from flat rows and initialises the expand-state. */
432
- build(rows: XiriTableRow[]): void;
473
+ /** Builds the tree from flat rows and initialises the expand-state. keyOf defaults to the raw tree-column value. */
474
+ build(rows: XiriTableRow[], keyOf?: XiriTreeSortKey): void;
433
475
  /** Returns the visible rows: search projection when searching, otherwise the expand-state flatten. */
434
476
  visibleRows(matches?: (row: XiriTableRow) => boolean): XiriTableRow[];
435
477
  /**
@@ -480,6 +522,9 @@ declare class XiriTableInlineEditService {
480
522
  searching: _angular_core.WritableSignal<boolean>;
481
523
  displayedOptions: _angular_core.WritableSignal<EditableOption[]>;
482
524
  private editingOriginalValue;
525
+ private editDraft;
526
+ private editStart;
527
+ private hasUrl;
483
528
  private editSeq;
484
529
  private editableOptionsSub;
485
530
  private optionCache;
@@ -502,8 +547,14 @@ declare class XiriTableInlineEditService {
502
547
  onDataUpdate: () => void;
503
548
  onCallReturn: (result: unknown) => void;
504
549
  isRowLive: (row: XiriTableRow) => boolean;
550
+ hasUrl: () => boolean;
505
551
  }): void;
506
552
  start(row: XiriTableRow, column: XiriTableField, skipSavingCheck?: boolean): void;
553
+ /** Value the inline editor shows: the draft of a cellObject cell while editing, else v, else the cell. */
554
+ editValue(row: XiriTableRow, column: XiriTableField): XiriTableCellValue;
555
+ setEditValue(row: XiriTableRow, column: XiriTableField, value: XiriTableCellValue): void;
556
+ /** compareWith for mat-select: option values are strings, v of a duration cell is a number. */
557
+ compareEditValue(a: unknown, b: unknown): boolean;
507
558
  /** Sets up the search box + subscription for searchable inline-edit selects. */
508
559
  private initSearch;
509
560
  /** Runs the search: server-side POST when editableSearchUrl is set, otherwise local label filter. */
@@ -540,7 +591,12 @@ declare class XiriButtonlineComponent {
540
591
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<XiriButtonlineComponent, "xiri-buttonline", never, { "settings": { "alias": "settings"; "required": true; "isSignal": true; }; "disabled": { "alias": "disabled"; "required": false; "isSignal": true; }; "filterData": { "alias": "filterData"; "required": false; "isSignal": true; }; }, { "result": "result"; }, never, never, true, never>;
541
592
  }
542
593
 
543
- type XiriDynDataType = 'card' | 'buttonline' | 'table' | 'cardlink' | 'links' | 'form' | 'query' | 'stepper' | 'header' | 'list' | 'spacer' | 'container' | 'infopoint' | 'multiprogress' | 'progress' | 'imagetext' | 'tabs' | 'expansion' | 'infotext' | 'html' | 'stat' | 'empty-state' | 'timeline' | 'page-header' | 'section' | 'divider' | 'stat-grid' | 'multi-stat' | 'toolbar' | 'description-list' | 'barchart' | 'linechart' | 'piechart' | 'gaugechart' | 'bulletchart' | 'heatmap' | 'calendar' | 'tree' | 'sankey' | 'gantt' | 'status' | 'callout';
594
+ /**
595
+ * Vertrag über alle "type"-Werte, die xiri-dyncomponent rendert. Einzige Quelle für die Union
596
+ * XiriDynDataType und den COMPONENT_CATALOG; xiri-go führt dieselbe Liste als core.ComponentTypes().
597
+ */
598
+ declare const XIRI_COMPONENT_TYPES: readonly ["card", "buttonline", "table", "cardlink", "links", "form", "query", "stepper", "header", "list", "spacer", "container", "infopoint", "multiprogress", "progress", "imagetext", "tabs", "expansion", "infotext", "html", "stat", "empty-state", "timeline", "page-header", "section", "divider", "stat-grid", "multi-stat", "toolbar", "description-list", "barchart", "linechart", "piechart", "gaugechart", "bulletchart", "heatmap", "calendar", "tree", "sankey", "gantt", "status", "callout"];
599
+ type XiriDynDataType = typeof XIRI_COMPONENT_TYPES[number];
544
600
  interface XiriDynData {
545
601
  id?: number;
546
602
  type: XiriDynDataType | (string & {});
@@ -733,11 +789,15 @@ declare class XiriTableComponent implements OnInit, OnDestroy {
733
789
  private makeApiCall;
734
790
  buttonReturn(event: XiriButtonResult): void;
735
791
  private callReturn;
792
+ private onTableUpdate;
736
793
  private refreshPanel;
737
794
  private getSelectionIDs;
738
795
  startInlineEdit(row: XiriTableRow, column: XiriTableField, skipSavingCheck?: boolean): void;
739
796
  cancelInlineEdit(): void;
740
797
  saveInlineEdit(row: XiriTableRow, column: XiriTableField): void;
798
+ editValue(row: XiriTableRow, column: XiriTableField): XiriTableCellValue;
799
+ setEditValue(row: XiriTableRow, column: XiriTableField, value: XiriTableCellValue): void;
800
+ compareEditValue: (a: unknown, b: unknown) => boolean;
741
801
  isEditing(row: XiriTableRow, fieldId: string): boolean;
742
802
  isSaving(row: XiriTableRow, fieldId: string): boolean;
743
803
  onInlineEditKeydown(event: KeyboardEvent, row: XiriTableRow, column: XiriTableField): void;
@@ -751,6 +811,10 @@ declare class XiriTableComponent implements OnInit, OnDestroy {
751
811
  pasteInput($event: ClipboardEvent, row: XiriTableRow, column: XiriTableField): false | null;
752
812
  saveInputData(): void;
753
813
  private getSortingDataAccessor;
814
+ /** Display part of a cell (see cell.ts); used by every cell template. */
815
+ cellText(row: XiriTableRow, column: XiriTableField): XiriTableCellValue;
816
+ /** Display lines of a text2/textn cell. */
817
+ cellLines(row: XiriTableRow, column: XiriTableField): XiriTableCellValue[];
754
818
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<XiriTableComponent, never>;
755
819
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<XiriTableComponent, "xiri-table", never, { "dyncomponent": { "alias": "dyncomponent"; "required": false; "isSignal": true; }; "settings": { "alias": "settings"; "required": true; "isSignal": true; }; "filterData": { "alias": "filterData"; "required": false; "isSignal": true; }; }, { "clickedRow": "clickedRow"; }, never, never, true, never>;
756
820
  }
@@ -772,6 +836,7 @@ declare class XiriFormComponent implements OnInit {
772
836
  loadingButton: _angular_core.WritableSignal<XiriButton | null>;
773
837
  done: _angular_core.WritableSignal<boolean>;
774
838
  error: _angular_core.WritableSignal<string>;
839
+ fieldErrors: _angular_core.WritableSignal<Record<string, string> | null>;
775
840
  private url;
776
841
  buttons: XiriButton[];
777
842
  private extra;
@@ -788,6 +853,12 @@ declare class XiriFormComponent implements OnInit {
788
853
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<XiriFormComponent, "xiri-form", never, { "settings": { "alias": "settings"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
789
854
  }
790
855
 
856
+ interface XiriFormChangeLike {
857
+ valid: boolean;
858
+ disabled?: boolean;
859
+ value: Record<string, unknown> | null;
860
+ }
861
+
791
862
  type XiriDialogSize = 'sm' | 'md' | 'lg' | 'xl' | 'full';
792
863
  interface XiriDialogSettings {
793
864
  url?: string;
@@ -849,10 +920,7 @@ declare class XiriDialogComponent implements OnDestroy {
849
920
  download(data: unknown, tab?: Window | null): void;
850
921
  clickButton(button: XiriButton): void;
851
922
  private startSend;
852
- formChanged(event: {
853
- valid: boolean;
854
- value: Record<string, unknown> | null;
855
- }): void;
923
+ formChanged(event: XiriFormChangeLike): void;
856
924
  ngOnDestroy(): void;
857
925
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<XiriDialogComponent, never>;
858
926
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<XiriDialogComponent, "xiri-dialog", never, {}, {}, never, never, true, never>;
@@ -911,6 +979,7 @@ interface XiriQueryResultCount {
911
979
  }
912
980
  interface XiriQueryFormChangeEvent {
913
981
  valid: boolean;
982
+ disabled?: boolean;
914
983
  value: Record<string, unknown> | null;
915
984
  pristine?: boolean;
916
985
  }
@@ -1057,6 +1126,18 @@ declare class XiriDynComponentComponent {
1057
1126
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<XiriDynComponentComponent, "xiri-dyncomponent", never, { "data": { "alias": "data"; "required": true; "isSignal": true; }; "filterData": { "alias": "filterData"; "required": false; "isSignal": true; }; "dyncomponent": { "alias": "dyncomponent"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1058
1127
  }
1059
1128
 
1129
+ interface XiriCatalogEntry {
1130
+ readonly type: XiriDynDataType;
1131
+ readonly name: string;
1132
+ readonly category: string;
1133
+ readonly angular: boolean;
1134
+ readonly dyncomponent: boolean;
1135
+ readonly goBuilder: boolean;
1136
+ readonly route: string;
1137
+ readonly keywords: readonly string[];
1138
+ }
1139
+ declare const COMPONENT_CATALOG: readonly XiriCatalogEntry[];
1140
+
1060
1141
  interface XiriCardlinkSettings {
1061
1142
  link: string;
1062
1143
  icon?: string;
@@ -1129,6 +1210,7 @@ interface XiriStepperStep {
1129
1210
  }
1130
1211
  interface XiriStepperFormChangeEvent {
1131
1212
  valid: boolean;
1213
+ disabled?: boolean;
1132
1214
  value: Record<string, unknown> | null;
1133
1215
  pristine?: boolean;
1134
1216
  }
@@ -2606,6 +2688,7 @@ interface XiriFormServiceData {
2606
2688
  }
2607
2689
  interface XiriFormServiceError {
2608
2690
  error: string;
2691
+ fields?: Record<string, string>;
2609
2692
  }
2610
2693
  declare class XiriFormService {
2611
2694
  private dataService;
@@ -2790,6 +2873,6 @@ declare class XiriDownloadService {
2790
2873
 
2791
2874
  declare function provideXiriServices(config: Partial<XiriDataServiceConfig>): EnvironmentProviders;
2792
2875
 
2793
- export { COLOR_CSS_VAR, DEFAULT_COMPARE, DEFAULT_PREDICATE, FALLBACK_COLORS, SafehtmlPipe, ThemeService, XIRI_PANEL_HOST, XiriAlertComponent, XiriBarChartComponent, XiriBreadcrumbComponent, XiriBulletChartComponent, XiriButtonComponent, XiriButtonlineComponent, XiriButtonstyleComponent, XiriCalendarComponent, XiriCalloutComponent, XiriCardComponent, XiriCardlinkComponent, XiriColsDirective, XiriDataService, XiriDataServiceConfig, XiriDescriptionListComponent, XiriDialogComponent, XiriDividerComponent, XiriDoneComponent, XiriDownloadService, XiriDynComponentComponent, XiriEchartsHostComponent, XiriEmptyStateComponent, XiriErrorComponent, XiriExpansionComponent, XiriExpansionPanelDirective, XiriFormComponent, XiriFormFieldsComponent, XiriFormService, XiriGanttComponent, XiriGaugeChartComponent, XiriHeaderComponent, XiriHeatmapComponent, XiriImagetextComponent, XiriInfopointComponent, XiriLineChartComponent, XiriLinksComponent, XiriListComponent, XiriLocalStorageService, XiriLocaleService, XiriMultiStatComponent, XiriMultiprogressComponent, XiriPageHeaderComponent, XiriPieChartComponent, XiriProgressComponent, XiriQueryComponent, XiriRawTableComponent, XiriResponseHandlerService, XiriSankeyComponent, XiriSearchComponent, XiriSectionComponent, XiriSelectDirective, XiriSessionStorageService, XiriSidenavComponent, XiriSidepanelComponent, XiriSidepanelRef, XiriSidepanelService, XiriSkeletonComponent, XiriSnackbarService, XiriStatComponent, XiriStatGridComponent, XiriStatusComponent, XiriStepperComponent, XiriTableComponent, XiriTabsComponent, XiriTimelineComponent, XiriToolbarComponent, XiriTreeComponent, XiriUrlPipe, colsToClasses, createPanelLoader, defaultXiriDataServiceConfig, escapeHtml, notifyThemeChanged, provideXiriServices, resolveColor };
2794
- export type { ThemeMode, XiriAlertConfig, XiriBarChartBar, XiriBarChartMode, XiriBarChartPoint, XiriBarChartSegment, XiriBarChartSettings, XiriBreadcrumbItem, XiriBulletChartSettings, XiriButton, XiriButtonResponse, XiriButtonResult, XiriButtonlineSettings, XiriCalendarCell, XiriCalendarSettings, XiriCalloutSettings, XiriCalloutTone, XiriCardSettings, XiriCardlinkSettings, XiriColor, XiriCols, XiriDescriptionListItem, XiriDescriptionListSettings, XiriDialogResponse, XiriDialogSettings, XiriDialogSize, XiriDividerSettings, XiriDynData, XiriDynDataType, XiriEchartsCallbackParams, XiriEchartsClick, XiriEchartsRenderItemApi, XiriEchartsTooltipParams, XiriEmptyStateSettings, XiriExpansionPanelSettings, XiriExpansionSettings, XiriExtendedColor, XiriFormField, XiriFormFieldCondition, XiriFormFieldConditionOperator, XiriFormFieldDisplay, XiriFormFieldSelectOption, XiriFormServiceData, XiriFormServiceError, XiriFormServiceReturn, XiriFormSettings, XiriFormValidator, XiriGanttSettings, XiriGanttTask, XiriGaugeChartSettings, XiriHeaderSettings, XiriHeatmapCell, XiriHeatmapSettings, XiriImagetextSettings, XiriInfopointSettings, XiriLanguage, XiriLanguageDefinition, XiriLineChartLine, XiriLineChartSettings, XiriLinksSettings, XiriListItem, XiriListSection, XiriListSettings, XiriMultiStatSettings, XiriMultiprogressItem, XiriMultiprogressSettings, XiriNavigationField, XiriPageHeaderSettings, XiriPanelHost, XiriPieChartSettings, XiriPieChartSlice, XiriProgressSettings, XiriQueryActiveFilter, XiriQueryFormChangeEvent, XiriQueryResultCount, XiriQuerySettings, XiriRawTableRow, XiriRawTableSettings, XiriSankeyLink, XiriSankeyNode, XiriSankeySettings, XiriSectionSettings, XiriSelectCompare, XiriSelectPredicate, XiriSidebarSettings, XiriSidepanelConfig, XiriSkeletonType, XiriSnackbarType, XiriStatGridSettings, XiriStatSettings, XiriStatTrend, XiriStatusSettings, XiriStatusTone, XiriStatusVariant, XiriStepperFormChangeEvent, XiriStepperResponse, XiriStepperSettings, XiriStepperStep, XiriTabSettings, XiriTableCellValue, XiriTableEmptyState, XiriTableField, XiriTableOptions, XiriTableResponse, XiriTableRow, XiriTableSettings, XiriTableTreeSettings, XiriTabsSettings, XiriTagChip, XiriThemeColor, XiriTimelineItem, XiriTimelineSettings, XiriToolbarSearchConfig, XiriToolbarSettings, XiriTreeNode, XiriTreeSettings, XiriUrl, XiriValidationMessages };
2876
+ export { COLOR_CSS_VAR, COMPONENT_CATALOG, DEFAULT_COMPARE, DEFAULT_PREDICATE, FALLBACK_COLORS, SafehtmlPipe, ThemeService, XIRI_COMPONENT_TYPES, XIRI_PANEL_HOST, XiriAlertComponent, XiriBarChartComponent, XiriBreadcrumbComponent, XiriBulletChartComponent, XiriButtonComponent, XiriButtonlineComponent, XiriButtonstyleComponent, XiriCalendarComponent, XiriCalloutComponent, XiriCardComponent, XiriCardlinkComponent, XiriColsDirective, XiriDataService, XiriDataServiceConfig, XiriDescriptionListComponent, XiriDialogComponent, XiriDividerComponent, XiriDoneComponent, XiriDownloadService, XiriDynComponentComponent, XiriEchartsHostComponent, XiriEmptyStateComponent, XiriErrorComponent, XiriExpansionComponent, XiriExpansionPanelDirective, XiriFormComponent, XiriFormFieldsComponent, XiriFormService, XiriGanttComponent, XiriGaugeChartComponent, XiriHeaderComponent, XiriHeatmapComponent, XiriImagetextComponent, XiriInfopointComponent, XiriLineChartComponent, XiriLinksComponent, XiriListComponent, XiriLocalStorageService, XiriLocaleService, XiriMultiStatComponent, XiriMultiprogressComponent, XiriPageHeaderComponent, XiriPieChartComponent, XiriProgressComponent, XiriQueryComponent, XiriRawTableComponent, XiriResponseHandlerService, XiriSankeyComponent, XiriSearchComponent, XiriSectionComponent, XiriSelectDirective, XiriSessionStorageService, XiriSidenavComponent, XiriSidepanelComponent, XiriSidepanelRef, XiriSidepanelService, XiriSkeletonComponent, XiriSnackbarService, XiriStatComponent, XiriStatGridComponent, XiriStatusComponent, XiriStepperComponent, XiriSuggestDirective, XiriTableComponent, XiriTabsComponent, XiriTimelineComponent, XiriToolbarComponent, XiriTreeComponent, XiriUrlPipe, colsToClasses, createPanelLoader, defaultXiriDataServiceConfig, escapeHtml, notifyThemeChanged, provideXiriServices, resolveColor };
2877
+ export type { ThemeMode, XiriAlertConfig, XiriBarChartBar, XiriBarChartMode, XiriBarChartPoint, XiriBarChartSegment, XiriBarChartSettings, XiriBreadcrumbItem, XiriBulletChartSettings, XiriButton, XiriButtonResponse, XiriButtonResult, XiriButtonlineSettings, XiriCalendarCell, XiriCalendarSettings, XiriCalloutSettings, XiriCalloutTone, XiriCardSettings, XiriCardlinkSettings, XiriCatalogEntry, XiriColor, XiriCols, XiriDescriptionListItem, XiriDescriptionListSettings, XiriDialogResponse, XiriDialogSettings, XiriDialogSize, XiriDividerSettings, XiriDynData, XiriDynDataType, XiriEchartsCallbackParams, XiriEchartsClick, XiriEchartsRenderItemApi, XiriEchartsTooltipParams, XiriEmptyStateSettings, XiriExpansionPanelSettings, XiriExpansionSettings, XiriExtendedColor, XiriFormField, XiriFormFieldCondition, XiriFormFieldConditionOperator, XiriFormFieldDisplay, XiriFormFieldSelectOption, XiriFormServiceData, XiriFormServiceError, XiriFormServiceReturn, XiriFormSettings, XiriFormValidator, XiriGanttSettings, XiriGanttTask, XiriGaugeChartSettings, XiriHeaderSettings, XiriHeatmapCell, XiriHeatmapSettings, XiriImagetextSettings, XiriInfopointSettings, XiriLanguage, XiriLanguageDefinition, XiriLineChartLine, XiriLineChartSettings, XiriLinksSettings, XiriListItem, XiriListSection, XiriListSettings, XiriMultiStatSettings, XiriMultiprogressItem, XiriMultiprogressSettings, XiriNavigationField, XiriPageHeaderSettings, XiriPanelHost, XiriPieChartSettings, XiriPieChartSlice, XiriProgressSettings, XiriQueryActiveFilter, XiriQueryFormChangeEvent, XiriQueryResultCount, XiriQuerySettings, XiriRawTableRow, XiriRawTableSettings, XiriSankeyLink, XiriSankeyNode, XiriSankeySettings, XiriSectionSettings, XiriSelectCompare, XiriSelectPredicate, XiriSidebarSettings, XiriSidepanelConfig, XiriSkeletonType, XiriSnackbarType, XiriStatGridSettings, XiriStatSettings, XiriStatTrend, XiriStatusSettings, XiriStatusTone, XiriStatusVariant, XiriStepperFormChangeEvent, XiriStepperResponse, XiriStepperSettings, XiriStepperStep, XiriTabSettings, XiriTableCellValue, XiriTableEmptyState, XiriTableField, XiriTableOptions, XiriTableResponse, XiriTableRow, XiriTableSettings, XiriTableTreeSettings, XiriTabsSettings, XiriTagChip, XiriThemeColor, XiriTimelineItem, XiriTimelineSettings, XiriToolbarSearchConfig, XiriToolbarSettings, XiriTreeNode, XiriTreeSettings, XiriUrl, XiriValidationMessages };
2795
2878
  //# sourceMappingURL=xiriframework-xiri-ng.d.ts.map