@xiriframework/xiri-ng 0.4.9 → 0.4.11

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.9",
3
+ "version": "0.4.11",
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), 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 oder reloadOn-Abhängigkeiten (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
@@ -57,8 +57,9 @@ snackbar.info(msg, duration?, action?)
57
57
  snackbar.warning(msg, duration?, action?)
58
58
  snackbar.handleResponse(response): boolean // parst response.message + response.messageType
59
59
 
60
- // Backend-Response-Handler (navigation / page-refresh / table-refresh)
61
- responseHandler.handle(result, { onTableRefresh?, onTableUpdate? })
60
+ // Backend-Response-Handler (navigation / page-refresh / table-refresh / panel-refresh)
61
+ responseHandler.handle(result, { onTableRefresh?, onTableUpdate?, onPanelRefresh? })
62
+ // refresh:"panel" lädt die nächstgelegene xiri-card mit url neu (DI-Token XIRI_PANEL_HOST, s. setup.md)
62
63
 
63
64
  // File-Download (tab = Handle aus openTab() → im Tab anzeigen, null → speichern)
64
65
  download.openTab(): Window | null // synchron im Click, sonst blockt der Browser
@@ -152,6 +153,19 @@ Patchbar sind `list`, `name`, `hint`, `class`, `required`, `disabled`, `hide`, `
152
153
  `max`, `params` — jeweils nur mit passendem Typ. `value`, `type`, `id` und `url` bewusst nicht.
153
154
  Details und Grenzen in `references/form-fields.md`.
154
155
 
156
+ **addUrl — neue Option per Dialog anlegen.** `select`, `multiselect`/`treeselect`, `object`/`model`
157
+ und `chips` bekommen mit `addUrl` einen „+“-Button neben dem Feld:
158
+
159
+ ```typescript
160
+ { id: 'tags', type: 'select', multiple: true, name: 'Tags', list: [...], addUrl: 'Tag/AddDialog' }
161
+ ```
162
+
163
+ Klick lädt `xiri-dialog` per GET auf `addUrl` (ein normaler Form-Dialog vom Backend). Antwortet
164
+ dessen POST mit `{ done: true, created: { id, name } }`, hängt das Feld die Option an seine `list`
165
+ und selektiert sie — bei Mehrfachwerten zusätzlich, ohne Duplikat. `id` muss den Typ der
166
+ vorhandenen Options-IDs haben (chips: Zahl). Go: `f.BaseField.SetAddURL(u)` +
167
+ `response.NewReturnDone().WithCreated(id, name)`.
168
+
155
169
  Zugriff auf die reactive Form:
156
170
 
157
171
  ```typescript
@@ -316,6 +330,8 @@ stepperSettings = {
316
330
  <xiri-expansion [settings]="{ panels: [{ title: 'GPS', buttons: {...}, data: [{ type: 'card', cols: 12, data: { flat: true, data: {...} } }] }] }"/> <!-- buttons: Header-Buttons; flat: Card ohne Schatten -->
317
331
  <!-- Tabelle im Panel: options.flat statt Rahmen im Rahmen, kein cols nötig. Panel halbiert dann automatisch seinen Seitenabstand. -->
318
332
  <xiri-expansion [settings]="{ multi: false, unload: true, panels: [{ title: 'Standort Wien', icon: 'place', data: [{ type: 'table', data: { data: rows, fields, options: { flat: true, pagination: false, search: false } } }] }] }"/>
333
+ <!-- Nachladbares Panel: url → POST null → { panel: { title, buttons, data, … } }; refresh:'panel' aus Header-Button/Inhalt lädt nur dieses Panel neu (auch xiri-card mit url). -->
334
+ <xiri-expansion [settings]="{ panels: [{ title: 'lädt …', expanded: true, url: 'Vehicle/7/Panel/Insurance', data: [] }] }"/>
319
335
  <xiri-sidenav [settings]="{ prefix: '/app/', fields: navItems }"/>
320
336
  <xiri-breadcrumb [settings]="breadcrumbItems"/>
321
337
  <xiri-skeleton type="table-row" [lines]="5" [columns]="4"/>
@@ -446,3 +462,5 @@ edit(row: any) {
446
462
  - Nicht `reloadOn` ohne `reloadUrl` (oder umgekehrt) — eine halbe Deklaration wird ignoriert
447
463
  - Nicht `url` **und** `reloadOn` auf demselben treeselect — mit `url` lädt es seinen Baum selbst
448
464
  per GET und ignoriert die gepatchte `list`
465
+ - Keinen eigenen „Neu anlegen“-Button neben ein Select bauen — `addUrl` am Feld, der Dialog-POST
466
+ antwortet mit `created: { id, name }`
@@ -96,7 +96,7 @@ dialog.open(XiriAlertComponent, {
96
96
  @input.required settings: XiriCardSettings;
97
97
 
98
98
  interface XiriCardSettings {
99
- url?: string; // POST mit null → Load
99
+ url?: string; // POST mit null → Load; Antwort {card: …} oder {data: rows}, s. u.
100
100
  reload?: boolean;
101
101
  data?: any;
102
102
  fields?: XiriTableField[]; // Card als Mini-Table
@@ -127,6 +127,21 @@ interface XiriCardSettings {
127
127
  }
128
128
  ```
129
129
 
130
+ **Antwort des `url`-Endpoints** (POST, Body `null`), Modus wird an der rohen Antwort entschieden:
131
+
132
+ - `{ card: { type, header, headerSub, headerIcon, buttonsTop, buttonsBottom, fields, data, components, … } }` —
133
+ komplette Card (so liefert es `Card.DataResponse(ctx)` in xiri-go ab 0.3.10). Header-Felder überlagern
134
+ `settings`; die Inhaltsfelder `fields`, `data`, `dense`, `components`, `showHeader`, `forceMinWidth` kommen
135
+ ausschließlich aus der Antwort. Bei einem Reload bleibt der bisherige Inhalt stehen (kein Skeleton); schlägt der
136
+ Reload fehl, bleiben Titel und Buttons der letzten Antwort, nur der Inhalt zeigt die Fehlermeldung.
137
+ - `{ data: rows }` oder `rows` direkt — nur Inhaltszeilen, Header bleibt aus `settings` (Legacy-Form). Was
138
+ innerhalb von `data` steht, wird nie als Card gedeutet.
139
+
140
+ **Nachladbares Panel (`refresh: "panel"`):** Gibt ein Button oder eine Tabellenaktion in der Card
141
+ `{ done: true, refresh: 'panel' }` zurück, lädt die Card ihre `url` erneut. Die Card ist dafür `XIRI_PANEL_HOST`
142
+ (siehe setup.md → XiriResponseHandlerService). Typischer Einsatz: Detailseiten mit mehreren Panels
143
+ (Versicherung, Leasing, Preise), deren Bearbeiten-Dialog nur das eigene Panel aktualisieren soll.
144
+
130
145
  **Card als Panel-Inhalt (`flat`):** Card ohne `header` mit `flat: true` in `panel.data` legen; Titel und
131
146
  Buttons gehören dann in den Panel-Header (`XiriExpansionPanelSettings.buttons`, siehe xiri-expansion).
132
147
  `cols: 12` auf dem `XiriDynData`-Eintrag nicht vergessen — `xiri-dyncomponent` rendert Cards sonst nur
@@ -625,7 +640,8 @@ interface XiriExpansionPanelSettings {
625
640
  icon?: string;
626
641
  disabled?: boolean; // sperrt nur den Toggle, nicht die Header-Buttons
627
642
  expanded?: boolean;
628
- data: XiriDynData[];
643
+ url?: string; // Nachladbares Panel: POST null → {panel: …}, s. u. Shell hat data: []
644
+ data?: XiriDynData[];
629
645
  lazy?: boolean;
630
646
  unload?: boolean;
631
647
  buttons?: XiriButtonlineSettings; // Aktions-Buttons rechts im Panel-Header (wie section.buttons).
@@ -639,6 +655,17 @@ Enthält ein Panel eine flache Card (`card.flat`) oder eine flache Tabelle (`tab
639
655
  bekommt das Panel die Klasse `flat-content` und halbiert seinen Seitenabstand (24px → 12px) — die
640
656
  flache Komponente bringt Rahmen und Innenabstand selbst mit.
641
657
 
658
+ **Nachladbares Panel (`url` + `refresh: "panel"`):** Jedes `mat-expansion-panel` trägt die Directive
659
+ `xiriExpansionPanel` und ist damit `XIRI_PANEL_HOST` (siehe setup.md). Mit `url` lädt sich das Panel per POST
660
+ (Body `null`); die Antwort `{ panel: { title, description?, icon?, buttons?, data } }` (Go:
661
+ `Panel.DataResponse(ctx)` ab xiri-go 0.3.10) ersetzt Titel, Beschreibung, Icon, Header-Buttons und Inhalt —
662
+ `expanded`, `disabled`, `lazy`, `unload` bleiben aus der Page, ein Reload klappt nichts zu. Gibt ein Header-Button,
663
+ ein Button im Inhalt oder eine Tabellenaktion `{ done: true, refresh: 'panel' }` zurück, lädt genau dieses Panel
664
+ neu. Eine flache Card ohne `url` im Inhalt reicht an das Panel weiter. Lade-, Fehler- und Puffer-Verhalten wie bei
665
+ `xiri-card` (Skeleton nur beim ersten Laden, Inhalt bleibt beim Reload stehen, bei Reload-Fehler bleibt der Header).
666
+ Der Inhalt wird mit `ngTemplateOutletInjector` = Element-Injector des Panels gerendert; ohne das fänden Buttons im
667
+ Inhalt (eingebettete View) das Panel nicht.
668
+
642
669
  **Panel mit Header-Buttons + rahmenloser Card** (statt Card mit `buttonsTop` im Panel, die doppelten
643
670
  Titel und Schatten erzeugt):
644
671
 
@@ -91,6 +91,7 @@ export interface XiriFormField {
91
91
 
92
92
  // --- Select / Model / Treeselect ---
93
93
  multiple?: boolean;
94
+ selectAll?: boolean; // select + multiple: „Alle / Keine“-Toggle über der Optionsliste
94
95
  url?: string; // load options von Backend
95
96
  search?: boolean;
96
97
  serverSideSearch?: boolean;
@@ -111,6 +112,7 @@ export interface XiriFormField {
111
112
  // --- Server-driven content ---
112
113
  reloadOn?: string[]; // Feld-IDs, deren Änderung dieses Feld neu lädt
113
114
  reloadUrl?: string; // Endpoint für den Reload (beides oder keins)
115
+ addUrl?: string; // „+“-Button: Dialog (GET) legt eine neue Option an, POST → {done, created:{id,name}}
114
116
 
115
117
  // --- Weitere ---
116
118
  rows?: number; // textarea
@@ -141,8 +143,8 @@ letzterer geht über das FormControl, das Feld fällt dann also auch aus `formGr
141
143
  | `textarea` | Mat-Textarea | `rows` |
142
144
  | `number` | Mat-Input type=number | `min`, `max`, `textSuffix` |
143
145
  | `bool` | Mat-Checkbox / Slide-Toggle | `placeholder` für Begleittext |
144
- | `select` | Mat-Select mit `list` | `multiple`, `search` |
145
- | `multiselect` | Mat-Select mit `multiple: true` | `list` oder `url` |
146
+ | `select` | Mat-Select mit `list` | `multiple`, `search`, `selectAll` |
147
+ | `multiselect` | Checkbox-Liste (flacher Treeselect) | `list` oder `url`, `min`, `max` |
146
148
  | `model` | Mat-Select mit Backend-Load | `url`, `serverSideSearch` |
147
149
  | `object` | Komplexes Objekt-Select (JSON-Value) | `url`, `list` |
148
150
  | `treeselect` | Tree-Picker | `url`, `tree: true` |
@@ -309,6 +311,46 @@ Fenster gespeicherter Filter verlöre das Feld.
309
311
  Ketten funktionieren: hängt C an B und wird Bs Wert durch einen Patch verworfen, lädt C nach. Das
310
312
  terminiert, weil Pruning nur entfernt.
311
313
 
314
+ ### addUrl — neue Option per Dialog anlegen
315
+
316
+ Für `select` (single und `multiple`), `multiselect`/`treeselect`, `object`/`model` und `chips`.
317
+ Mit `addUrl` rendert die Komponente neben dem Control einen `mat-icon-button` „+“ (`button.add-option`,
318
+ `aria-label="Neu anlegen"`); Control und Button liegen in einem Flex-Wrapper `.add-wrap`, der
319
+ `field.class` und `[hidden]` trägt.
320
+
321
+ ```typescript
322
+ { id: 'tags', type: 'select', multiple: true, name: 'Tags', search: false,
323
+ list: [ { id: 1, name: 'Produktion' } ], addUrl: 'Tag/AddDialog' }
324
+ ```
325
+
326
+ Ablauf:
327
+
328
+ 1. Klick öffnet `XiriDialogComponent` mit `{ type: 'load', url: addUrl }` — also ein GET, das einen
329
+ normalen Form-Dialog liefert (`header`, `type: 'form'`, `url`, `fields`, `buttons`).
330
+ 2. Der Dialog postet das Formular an seine `url`. Antwortet der Server mit
331
+ `{ done: true, created: { id, name } }` (Go: `response.NewReturnDone().WithCreated(id, name)`),
332
+ zeigt der Dialog kurz die Erfolgsanzeige und schließt mit der Antwort. Während dieser Anzeige sind
333
+ Escape, Backdrop und das Kreuz gesperrt, damit das Ergebnis nicht verloren geht.
334
+ 3. Die Komponente hängt `{ id, name }` an `field.list` (falls noch nicht enthalten) und setzt den Wert:
335
+ Einzelwert → `id`; Mehrfachwert (`multiple`, `treeselect`, `chips`) → bestehende Werte plus `id`,
336
+ ohne Duplikat. Das Feld wird wie bei einem `reloadOn`-Patch als Kopie neu gerendert.
337
+
338
+ Verworfen wird das Ergebnis, wenn der Dialog ohne `created` schließt (Abbrechen), das Formular
339
+ inzwischen gewechselt hat (die Control-Identität entscheidet, nicht die Feld-ID), das Control
340
+ deaktiviert ist oder `created` ungültig ist (`id` muss String oder endliche Zahl sein, `name` ein
341
+ String; `0` ist gültig). Der Button ist deaktiviert, solange die Form oder das Control deaktiviert ist.
342
+
343
+ Grenzen:
344
+
345
+ - `id` muss den JSON-Typ der vorhandenen Options-IDs haben; der Vergleich ist strikt. `chips` löst
346
+ Labels nur für numerische IDs auf (Strings sind dort Freitext).
347
+ - Ein `treeselect` mit `url` ignoriert `list` und lädt seinen Baum nach dem Anlegen selbst neu — der
348
+ Server muss die neue Entität dann sofort liefern.
349
+ - Ein späterer `reloadOn`-Patch ersetzt die Liste; liefert der Server die neue Option nicht mit, wird
350
+ der Wert verworfen. Serverseitig validieren `SelectField` und Chips beim Submit gegen ihre
351
+ Optionsliste — die neue Entität muss dort enthalten sein; `ModelField`/`ModelListField` prüfen nur
352
+ Typ und Anzahl.
353
+
312
354
  ### Select-Optionen
313
355
 
314
356
  ```typescript
@@ -339,6 +381,16 @@ Inline (statisch):
339
381
  ]}
340
382
  ```
341
383
 
384
+ Mehrfachauswahl mit „Alle / Keine“-Toggle (`selectAll` — Checkbox von `ngx-mat-select-search` über der Liste; wirkt auf die
385
+ aktuell sichtbaren, also bei aktiver Suche nur die gefilterten Optionen, lässt `disabled`-Optionen unangetastet und wird
386
+ ausgeblendet, wenn kein Treffer wählbar ist. Mit `selectAll` wird immer der Such-Zweig gerendert, auch bei `search: false`.
387
+ Go-Seite: `SelectField.SetMultiple(true).SetSelectAll(true)`):
388
+
389
+ ```typescript
390
+ { id: 'tags', type: 'select', name: 'Tags', multiple: true, selectAll: true, value: [],
391
+ list: [ { id: 1, name: 'Produktion' }, { id: 2, name: 'Logistik' }, { id: 3, name: 'Archiv', disabled: true } ] }
392
+ ```
393
+
342
394
  Hierarchisch (`treeselect` — Optionen über `children` verschachteln; auswählbar sind die Blattknoten, `isGroup` markiert Elternknoten):
343
395
 
344
396
  ```typescript
@@ -65,20 +65,50 @@ Wird von `XiriDataService` intern aufgerufen — du musst `handleResponse` nur s
65
65
 
66
66
  ## XiriResponseHandlerService
67
67
 
68
- Zentrale Logik für Backend-Responses aus `xiri-go` (`ReturnGoto`, `ReturnRefreshPage`, `ReturnRefreshTable`, `ReturnUpdateTableField`).
68
+ Zentrale Logik für Backend-Responses aus `xiri-go` (`ReturnGoto`, `ReturnRefreshPage`, `ReturnRefreshTable`,
69
+ `ReturnRefreshPanel`, Table-Update).
69
70
 
70
71
  ```typescript
71
- handle(result: any, callbacks?: {
72
+ handle(result: unknown, callbacks?: {
72
73
  onTableRefresh?: () => void;
73
- onTableUpdate?: (id: any, field: string, content: any) => void;
74
+ onTableUpdate?: (id: unknown, field: string, content: unknown) => void;
75
+ onPanelRefresh?: () => void;
74
76
  }): void
75
77
  ```
76
78
 
77
- Verhalten je nach `result.refreshType` / `result.gotoUrl`:
78
- - Navigation → `Router.navigateByUrl`
79
- - Page-Refresh → `window.location.reload()`
80
- - Table-Refreshruft `onTableRefresh()` wenn gesetzt
81
- - Table-Updateruft `onTableUpdate(id, field, content)` wenn gesetzt
79
+ Verhalten je nach Response:
80
+ - `goto: url` → `router.navigate([url])`
81
+ - `refresh: "page"` → `router.navigate([router.url])` — braucht `onSameUrlNavigation: 'reload'` (siehe dyncomponent.md)
82
+ - `refresh: "table"` → `onTableRefresh()` wenn gesetzt, sonst wie `refresh: "page"`
83
+ - `refresh: "panel"` → `onPanelRefresh()` wenn gesetzt, sonst nichts (kein Router-Fallback im Handler; `xiri-button` und
84
+ `xiri-table` liefern ohne Panel-Host selbst `{ refresh: "page" }` nach, siehe unten)
85
+ - `update: "table"` → `onTableUpdate(id, field, content)` wenn gesetzt
86
+
87
+ ### Nachladbare Panels: `XIRI_PANEL_HOST`
88
+
89
+ `refresh: "panel"` lädt genau eine `xiri-card` mit `url` neu (Titel, Buttons, Inhalt), die restliche Seite bleibt
90
+ stehen. Die Verdrahtung läuft über DI, nicht über Outputs:
91
+
92
+ ```typescript
93
+ export interface XiriPanelHost { reloadPanel(): void; }
94
+ export const XIRI_PANEL_HOST: InjectionToken<XiriPanelHost>;
95
+ ```
96
+
97
+ - `xiri-card` und jedes `mat-expansion-panel` in `xiri-expansion` (Directive `xiriExpansionPanel`) stellen sich als
98
+ `XIRI_PANEL_HOST` bereit (`providers: [{ provide: XIRI_PANEL_HOST, useExisting: … }]`).
99
+ - `xiri-button` und `xiri-table` injizieren den Token optional und rufen bei `refresh: "panel"` `reloadPanel()` der
100
+ nächstgelegenen Card — egal ob der Button im Card-Header, unten oder in einer verschachtelten Komponente liegt.
101
+ Ohne umschließende Card: `refresh: "page"` (ab 0.4.11; 0.4.10 warnte nur in der Konsole) — braucht wie
102
+ `refresh: "page"` `onSameUrlNavigation: 'reload'`. Nur diese beiden Auslöser kennen `refresh: "panel"`;
103
+ `xiri-links` und der `addUrl`-Dialog der Formularfelder ignorieren es.
104
+ - Eine Card ohne `url` reicht per `skipSelf` an die nächste äußere Card weiter; ohne solche → `refresh: "page"`.
105
+ - Eigene Komponenten, die als Panel gelten sollen, implementieren `XiriPanelHost` und providen den Token genauso;
106
+ `createPanelLoader({ url, key })` aus `services/panel-loader.ts` liefert Laden, Envelope-Auspacken, Puffer und
107
+ Reload-Queue fertig (so nutzen es Card und Expansion-Panel).
108
+ - Rendert die Komponente Inhalt über `ngTemplateOutlet`, muss sie `injector` (ihren Element-Injector) mitgeben —
109
+ eingebettete Views lösen DI sonst über die deklarierende View auf, und Buttons im Inhalt finden den Host nicht.
110
+
111
+ Antwortformat des Card-Endpoints siehe `components.md` → xiri-card. Ab xiri-ng 0.4.10 / xiri-go 0.3.10.
82
112
 
83
113
  ## XiriFormService
84
114
 
@@ -1,8 +1,8 @@
1
1
  import * as _angular_core from '@angular/core';
2
- import { PipeTransform, OnInit, OnDestroy, ChangeDetectorRef, TemplateRef, Type, Signal, WritableSignal, AfterViewInit, ElementRef, EnvironmentProviders } from '@angular/core';
2
+ import { PipeTransform, OnInit, OnDestroy, ChangeDetectorRef, TemplateRef, Type, InjectionToken, Signal, WritableSignal, Injector, AfterViewInit, ElementRef, EnvironmentProviders } from '@angular/core';
3
3
  import { Params } from '@angular/router';
4
4
  import * as _angular_forms from '@angular/forms';
5
- import { ValidatorFn, FormControl, UntypedFormGroup, UntypedFormControl } from '@angular/forms';
5
+ import { ValidatorFn, FormControl, UntypedFormGroup, UntypedFormControl, AbstractControl } from '@angular/forms';
6
6
  import * as rxjs from 'rxjs';
7
7
  import { Observable, Subject } from 'rxjs';
8
8
  import * as _angular_material_paginator from '@angular/material/paginator';
@@ -104,6 +104,7 @@ interface XiriFormField {
104
104
  max?: number;
105
105
  pattern?: string;
106
106
  multiple?: boolean;
107
+ selectAll?: boolean;
107
108
  url?: string;
108
109
  search?: boolean;
109
110
  serverSideSearch?: boolean;
@@ -118,6 +119,7 @@ interface XiriFormField {
118
119
  showWhen?: XiriFormFieldCondition | XiriFormFieldCondition[];
119
120
  reloadOn?: string[];
120
121
  reloadUrl?: string;
122
+ addUrl?: string;
121
123
  control?: FormControl;
122
124
  placeholder?: string;
123
125
  array?: (string | number)[];
@@ -128,6 +130,8 @@ type XiriFormFieldDisplay = 'full' | 'line' | 'small';
128
130
  declare class XiriFormFieldsComponent implements OnInit {
129
131
  private formBuilder;
130
132
  private destroyRef;
133
+ private dialog;
134
+ private destroyed;
131
135
  private elementRef;
132
136
  private readonly localeService;
133
137
  private dataService;
@@ -157,6 +161,8 @@ declare class XiriFormFieldsComponent implements OnInit {
157
161
  private dependentFields;
158
162
  private triggerValues;
159
163
  private fetchPatches;
164
+ protected openAdd(id: string): void;
165
+ private addOption;
160
166
  private applyPatch;
161
167
  private pruneValue;
162
168
  fields: _angular_core.Signal<XiriFormField[] | null>;
@@ -185,6 +191,9 @@ declare class XiriSelectDirective implements OnInit, OnDestroy {
185
191
  private _filterFormControl;
186
192
  /** list of _allValues filtered by search keyword */
187
193
  private _filteredValuesSubject;
194
+ /** what the panel currently shows — the basis for the select-all toggle */
195
+ private _filtered;
196
+ private emit;
188
197
  /** indicate search operation is in progress */
189
198
  searching: boolean;
190
199
  /** Subject that emits when the component has been destroyed. */
@@ -201,6 +210,13 @@ declare class XiriSelectDirective implements OnInit, OnDestroy {
201
210
  ngOnInit(): void;
202
211
  ngOnDestroy(): void;
203
212
  private applyFilter;
213
+ private selectableIds;
214
+ private static ids;
215
+ /** false when nothing is selectable — the checkbox is hidden then, otherwise MatCheckbox would stay checked after a no-op click */
216
+ hasSelectable(): boolean;
217
+ allSelected(value: unknown): boolean;
218
+ someSelected(value: unknown): boolean;
219
+ toggleSelectAll(selectAll: boolean, control: AbstractControl | null): void;
204
220
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<XiriSelectDirective, never>;
205
221
  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>;
206
222
  }
@@ -279,6 +295,7 @@ declare class XiriButtonComponent implements OnDestroy {
279
295
  private dialog;
280
296
  private downloadService;
281
297
  private responseHandler;
298
+ private panelHost;
282
299
  _disabled: _angular_core.Signal<boolean>;
283
300
  _url: _angular_core.Signal<string | undefined>;
284
301
  constructor();
@@ -288,6 +305,7 @@ declare class XiriButtonComponent implements OnDestroy {
288
305
  openMenuDialog(event: MouseEvent, item: Record<string, unknown>): void;
289
306
  private actionApi;
290
307
  private processResult;
308
+ private refreshPanel;
291
309
  private startPolling;
292
310
  private pollTick;
293
311
  private cancelPollTimers;
@@ -462,6 +480,7 @@ declare class XiriTableInlineEditService {
462
480
  searching: _angular_core.WritableSignal<boolean>;
463
481
  displayedOptions: _angular_core.WritableSignal<EditableOption[]>;
464
482
  private editingOriginalValue;
483
+ private editSeq;
465
484
  private editableOptionsSub;
466
485
  private optionCache;
467
486
  private searchSub;
@@ -472,6 +491,7 @@ declare class XiriTableInlineEditService {
472
491
  private onSaved;
473
492
  private onDataUpdate;
474
493
  private onCallReturn;
494
+ private isRowLive;
475
495
  private get editUrl();
476
496
  private get displayedColumns();
477
497
  init(config: {
@@ -481,6 +501,7 @@ declare class XiriTableInlineEditService {
481
501
  onSaved: (row: XiriTableRow, fieldId: string) => void;
482
502
  onDataUpdate: () => void;
483
503
  onCallReturn: (result: unknown) => void;
504
+ isRowLive: (row: XiriTableRow) => boolean;
484
505
  }): void;
485
506
  start(row: XiriTableRow, column: XiriTableField, skipSavingCheck?: boolean): void;
486
507
  /** Sets up the search box + subscription for searchable inline-edit selects. */
@@ -596,6 +617,7 @@ declare class XiriTableComponent implements OnInit, OnDestroy {
596
617
  private numberService;
597
618
  private snackbar;
598
619
  private responseHandler;
620
+ private panelHost;
599
621
  private downloadService;
600
622
  inlineEdit: XiriTableInlineEditService;
601
623
  tree: XiriTableTreeService;
@@ -710,6 +732,7 @@ declare class XiriTableComponent implements OnInit, OnDestroy {
710
732
  private makeApiCall;
711
733
  buttonReturn(event: XiriButtonResult): void;
712
734
  private callReturn;
735
+ private refreshPanel;
713
736
  private getSelectionIDs;
714
737
  startInlineEdit(row: XiriTableRow, column: XiriTableField, skipSavingCheck?: boolean): void;
715
738
  cancelInlineEdit(): void;
@@ -768,7 +791,7 @@ type XiriDialogSize = 'sm' | 'md' | 'lg' | 'xl' | 'full';
768
791
  interface XiriDialogSettings {
769
792
  url?: string;
770
793
  size?: XiriDialogSize | string;
771
- type: "form" | "data" | "question" | "waiting" | "table" | "component";
794
+ type: "form" | "data" | "question" | "waiting" | "table" | "component" | "load";
772
795
  data?: unknown;
773
796
  filter?: Record<string, unknown> | null;
774
797
  }
@@ -939,6 +962,26 @@ declare class XiriQueryComponent implements OnInit {
939
962
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<XiriQueryComponent, "xiri-query", never, { "settings": { "alias": "settings"; "required": true; "isSignal": true; }; "dyncomponent": { "alias": "dyncomponent"; "required": false; "isSignal": true; }; "count": { "alias": "count"; "required": false; "isSignal": true; }; }, { "filterChange": "filterChange"; }, never, never, true, never>;
940
963
  }
941
964
 
965
+ /**
966
+ * Nächstgelegener Panel-Container eines Auslösers: eine xiri-card oder ein mat-expansion-panel (Directive
967
+ * xiriExpansionPanel). Beide stellen sich per Provider bereit; Button und Tabelle injizieren den Token optional
968
+ * und rufen bei refresh:'panel' reloadPanel().
969
+ */
970
+ interface XiriPanelHost {
971
+ reloadPanel(): void;
972
+ }
973
+ declare const XIRI_PANEL_HOST: InjectionToken<XiriPanelHost>;
974
+ declare class XiriResponseHandlerService {
975
+ private router;
976
+ handle(result: unknown, callbacks?: {
977
+ onTableRefresh?: () => void;
978
+ onTableUpdate?: (id: unknown, field: string, content: unknown) => void;
979
+ onPanelRefresh?: () => void;
980
+ }): void;
981
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<XiriResponseHandlerService, never>;
982
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<XiriResponseHandlerService>;
983
+ }
984
+
942
985
  interface XiriCardSettings {
943
986
  url?: string;
944
987
  reload?: boolean;
@@ -960,16 +1003,25 @@ interface XiriCardSettings {
960
1003
  flat?: boolean;
961
1004
  padding?: string;
962
1005
  }
963
- declare class XiriCardComponent {
964
- private dataService;
1006
+ declare class XiriCardComponent implements XiriPanelHost {
1007
+ private responseHandler;
1008
+ private parentPanel;
965
1009
  settings: _angular_core.InputSignal<XiriCardSettings>;
1010
+ private loader;
966
1011
  showHeader: Signal<boolean>;
967
1012
  isCollapsed: _angular_core.WritableSignal<boolean>;
968
- private cardResource;
969
1013
  loading: Signal<boolean>;
970
1014
  errorMsg: Signal<string>;
1015
+ private _raw;
1016
+ /** Zuletzt erfolgreich geladene komplette Card ({card: …}); null bei Zeilen-Antworten. */
1017
+ private loadedCard;
1018
+ /** Inhaltszeilen aus einer Nicht-Card-Antwort: {data: rows} → rows, sonst die Antwort selbst. */
971
1019
  private _loaded;
1020
+ /** settings(), überlagert von einer nachgeladenen kompletten Card. Inhaltsfelder kommen dann nur aus der Antwort. */
1021
+ card: Signal<XiriCardSettings>;
972
1022
  cardData: Signal<unknown>;
1023
+ /** Skeleton nur, solange noch nie etwas geladen wurde (auch nicht gepuffert) und kein statischer Inhalt da ist. */
1024
+ showSkeleton: Signal<boolean>;
973
1025
  hasComponents: Signal<boolean>;
974
1026
  /** Resolves padding setting (token or free CSS value) into a CSS length string. */
975
1027
  componentsPadding: Signal<string>;
@@ -978,6 +1030,8 @@ declare class XiriCardComponent {
978
1030
  /** Klick irgendwo im Header toggelt; Buttons/Links (Collapse, Reload, buttonsTop) behalten ihre eigene Aktion. */
979
1031
  onHeaderClick(event: MouseEvent): void;
980
1032
  reload(): void;
1033
+ /** refresh:'panel' aus Button/Tabelle in dieser Card. Ohne url: äußere Card, sonst Page-Reload. */
1034
+ reloadPanel(): void;
981
1035
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<XiriCardComponent, never>;
982
1036
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<XiriCardComponent, "xiri-card", never, { "settings": { "alias": "settings"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
983
1037
  }
@@ -1339,7 +1393,8 @@ interface XiriExpansionPanelSettings {
1339
1393
  icon?: string;
1340
1394
  disabled?: boolean;
1341
1395
  expanded?: boolean;
1342
- data: XiriDynData[];
1396
+ url?: string;
1397
+ data?: XiriDynData[];
1343
1398
  buttons?: XiriButtonlineSettings;
1344
1399
  lazy?: boolean;
1345
1400
  unload?: boolean;
@@ -1367,6 +1422,37 @@ declare class XiriExpansionComponent {
1367
1422
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<XiriExpansionComponent, "xiri-expansion", never, { "settings": { "alias": "settings"; "required": true; "isSignal": true; }; "filterData": { "alias": "filterData"; "required": false; "isSignal": true; }; "dyncomponent": { "alias": "dyncomponent"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1368
1423
  }
1369
1424
 
1425
+ /**
1426
+ * Macht ein mat-expansion-panel zum Panel-Host für refresh:'panel' und lädt es bei gesetzter url nach.
1427
+ * Sitzt als Directive direkt auf dem Material-Panel, damit der Element-Injector des Panels den Token trägt:
1428
+ * Header-Buttons und (über ngTemplateOutletInjector) der Inhalt finden so genau dieses Panel.
1429
+ */
1430
+ declare class XiriExpansionPanelDirective implements XiriPanelHost {
1431
+ /**
1432
+ * Shell-Settings des Panels aus XiriExpansionSettings.panels. Nicht `required`: der Loader-Effect einer Directive
1433
+ * läuft in der Host-View und kann vor dem ersten Setzen der Inputs feuern (NG0950) – der leere Default hat keine url.
1434
+ */
1435
+ settings: _angular_core.InputSignal<XiriExpansionPanelSettings>;
1436
+ /** Element-Injector des Panels – als ngTemplateOutletInjector für den Inhalt, sonst löst der über die deklarierende View auf. */
1437
+ injector: Injector;
1438
+ private responseHandler;
1439
+ private parentPanel;
1440
+ private loader;
1441
+ loading: _angular_core.Signal<boolean>;
1442
+ errorMsg: _angular_core.Signal<string>;
1443
+ /**
1444
+ * Shell, überlagert von title/description/icon/buttons/data der letzten Antwort.
1445
+ * expanded/disabled/lazy/unload bleiben Shell-Werte – sonst klappte ein Reload ohne `expanded` das Panel zu.
1446
+ */
1447
+ panel: _angular_core.Signal<XiriExpansionPanelSettings>;
1448
+ /** Skeleton nur, solange noch nie etwas geladen wurde (auch nicht gepuffert) und die Shell keinen Inhalt hat. */
1449
+ showSkeleton: _angular_core.Signal<boolean>;
1450
+ /** refresh:'panel' aus Header-Button, Inhalt oder Tabelle in diesem Panel. Ohne url: äußerer Host, sonst Page-Reload. */
1451
+ reloadPanel(): void;
1452
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<XiriExpansionPanelDirective, never>;
1453
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<XiriExpansionPanelDirective, "mat-expansion-panel[xiriExpansionPanel]", ["xiriExpansionPanel"], { "settings": { "alias": "xiriExpansionPanel"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1454
+ }
1455
+
1370
1456
  interface XiriBreadcrumbItem {
1371
1457
  label: string;
1372
1458
  link?: string;
@@ -2660,15 +2746,28 @@ declare class XiriSnackbarService {
2660
2746
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<XiriSnackbarService>;
2661
2747
  }
2662
2748
 
2663
- declare class XiriResponseHandlerService {
2664
- private router;
2665
- handle(result: unknown, callbacks?: {
2666
- onTableRefresh?: () => void;
2667
- onTableUpdate?: (id: unknown, field: string, content: unknown) => void;
2668
- }): void;
2669
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<XiriResponseHandlerService, never>;
2670
- static ɵprov: _angular_core.ɵɵInjectableDeclaration<XiriResponseHandlerService>;
2671
- }
2749
+ /**
2750
+ * Lädt ein Panel (Card, Expansion-Panel) von einer URL und puffert die letzte erfolgreiche Antwort.
2751
+ * Gemeinsame Logik der XIRI_PANEL_HOST-Implementierungen; muss im Injection-Context aufgerufen werden.
2752
+ *
2753
+ * - `raw`: rohe Antwort, nur gelesen, wenn die Resource einen Wert hat (value() wirft im Fehlerzustand).
2754
+ * - `loaded`: das Objekt unter `opts.key` der letzten erfolgreichen Antwort. Bleibt bei Reload-Fehler
2755
+ * stehen, wird bei url-Wechsel und bei einer erfolgreichen Antwort ohne `opts.key` geleert.
2756
+ * - `reloadOrQueue`: lädt neu; läuft der erste Load noch, wird der Reload nachgeholt, sobald er fertig ist.
2757
+ */
2758
+ declare function createPanelLoader<T extends object>(opts: {
2759
+ url: () => string | undefined;
2760
+ key: string;
2761
+ }): {
2762
+ loading: _angular_core.Signal<boolean>;
2763
+ errorMsg: _angular_core.Signal<string>;
2764
+ raw: _angular_core.Signal<unknown>;
2765
+ loaded: _angular_core.WritableSignal<T | null>;
2766
+ /** Manueller Reload (Reload-Button): kein Doppelstart, solange geladen wird. */
2767
+ reload: () => void;
2768
+ /** refresh:'panel': reload() gibt false zurück, solange der erste Load läuft – dann nachholen. */
2769
+ reloadOrQueue: () => void;
2770
+ };
2672
2771
 
2673
2772
  declare class XiriDownloadService {
2674
2773
  /**
@@ -2690,6 +2789,6 @@ declare class XiriDownloadService {
2690
2789
 
2691
2790
  declare function provideXiriServices(config: Partial<XiriDataServiceConfig>): EnvironmentProviders;
2692
2791
 
2693
- export { COLOR_CSS_VAR, DEFAULT_COMPARE, DEFAULT_PREDICATE, FALLBACK_COLORS, SafehtmlPipe, ThemeService, XiriAlertComponent, XiriBarChartComponent, XiriBreadcrumbComponent, XiriBulletChartComponent, XiriButtonComponent, XiriButtonlineComponent, XiriButtonstyleComponent, XiriCalendarComponent, XiriCalloutComponent, XiriCardComponent, XiriCardlinkComponent, XiriColsDirective, XiriDataService, XiriDataServiceConfig, XiriDescriptionListComponent, XiriDialogComponent, XiriDividerComponent, XiriDoneComponent, XiriDownloadService, XiriDynComponentComponent, XiriEchartsHostComponent, XiriEmptyStateComponent, XiriErrorComponent, XiriExpansionComponent, 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, defaultXiriDataServiceConfig, escapeHtml, notifyThemeChanged, provideXiriServices, resolveColor };
2694
- 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, 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 };
2792
+ 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 };
2793
+ 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 };
2695
2794
  //# sourceMappingURL=xiriframework-xiri-ng.d.ts.map