@xiriframework/xiri-ng 0.4.8 → 0.4.10

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.8",
3
+ "version": "0.4.10",
4
4
  "description": "Angular UI component library for the Xiri Framework",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
@@ -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
@@ -204,6 +205,8 @@ tableSettings = {
204
205
 
205
206
  Öffentliche Methoden: `reload()`, `searchDo(text)`, `startInlineEdit(row, column)`, `cancelInlineEdit()`, `saveInlineEdit(row, column)`, `selection` (SelectionModel), `isAllSelected()`, `masterToggle()`.
206
207
 
208
+ **Header-Leiste:** Der graue Streifen über der Kopfzeile trägt `title`, `buttons`, Suche, Reload-Button, Tree-Aktionen und die „Stand HH:mm"-Anzeige — ohne all das wird er nicht gerendert. `search` ist default **true**, für eine nackte Tabelle also `search: false` setzen. Rahmenlos im Panel/in einer Card: `options.flat: true` (Details: `references/table.md`).
209
+
207
210
  **Auto-Refresh:** Liefert die Daten-Response ein `poll` (ms), lädt sich die Tabelle selbsttätig neu + zeigt Header-Indikator mit Countdown; ohne `poll` stoppt es (Backend-gesteuert, `tbl.SetPoll`). Details: `references/table.md`.
208
211
 
209
212
  ## xiri-raw-table — minimale Tabelle
@@ -312,6 +315,10 @@ stepperSettings = {
312
315
  <xiri-divider [settings]="{ text: 'Weitere Optionen', spacing: 'normal' }"/>
313
316
  <xiri-tabs [settings]="{ tabs: [{ label: 'Liste', noPadding: true, data: [...] }], lazy: true }"/> <!-- noPadding: randloser Tab-Body (Tabellen) -->
314
317
  <xiri-expansion [settings]="{ panels: [{ title: 'GPS', buttons: {...}, data: [{ type: 'card', cols: 12, data: { flat: true, data: {...} } }] }] }"/> <!-- buttons: Header-Buttons; flat: Card ohne Schatten -->
318
+ <!-- Tabelle im Panel: options.flat statt Rahmen im Rahmen, kein cols nötig. Panel halbiert dann automatisch seinen Seitenabstand. -->
319
+ <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 } } }] }] }"/>
320
+ <!-- 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). -->
321
+ <xiri-expansion [settings]="{ panels: [{ title: 'lädt …', expanded: true, url: 'Vehicle/7/Panel/Insurance', data: [] }] }"/>
315
322
  <xiri-sidenav [settings]="{ prefix: '/app/', fields: navItems }"/>
316
323
  <xiri-breadcrumb [settings]="breadcrumbItems"/>
317
324
  <xiri-skeleton type="table-row" [lines]="5" [columns]="4"/>
@@ -83,6 +83,20 @@
83
83
  {"name": "no_invented_api", "type": "code_check", "description": "Kein erfundenes Feld wie headerButtons, actions, shadow: false oder compact auf der Card"}
84
84
  ],
85
85
  "files": []
86
+ },
87
+ {
88
+ "id": 6,
89
+ "prompt": "Baue mit xiri-ng ein Accordion, das pro Standort ein Panel zeigt (Titel = Standortname, Icon 'place', Beschreibung = Anzahl Geräte). Panel-Inhalt ist eine Tabelle mit Name, IMEI und Status — ohne Pagination, ohne Suche, kompakte Zeilen. Es soll nur ein Standort gleichzeitig offen sein, die Tabelle beim Schließen aus dem DOM verschwinden, und die Tabelle soll keinen eigenen Rahmen im Panel haben.",
90
+ "expected_output": "XiriExpansionSettings with multi: false and unload: true; one panel per location with title/icon/description and data: [{ type: 'table', data: { data: rows, fields, options: { flat: true, density: 'compact', pagination: false, search: false } } }]. No cols on the table entry, no card wrapped around it.",
91
+ "assertions": [
92
+ {"name": "uses_options_flat", "type": "contains_pattern", "description": "Die Tabelle setzt options.flat: true — kein Schatten/Hintergrund/Radius im Panel"},
93
+ {"name": "search_off", "type": "code_check", "description": "options.search: false ist explizit gesetzt, weil search default true ist (sonst bleibt die Header-Leiste sichtbar)"},
94
+ {"name": "multi_false_and_unload", "type": "code_check", "description": "multi: false (genau ein Panel offen) und unload: true (Inhalt bei Close aus dem DOM)"},
95
+ {"name": "table_directly_in_panel_data", "type": "code_check", "description": "Der Tabellen-XiriDynData-Eintrag liegt direkt in panel.data — nicht in eine Card gewrappt"},
96
+ {"name": "no_cols_on_table", "type": "code_check", "description": "Kein cols: 12 an der Tabelle — xiri-dyncomponent gibt Tabellen schon per Default xcol (volle Breite)"},
97
+ {"name": "no_invented_api", "type": "code_check", "description": "Kein erfundenes Feld wie elevation: 0, noCard, shadow: false oder noPadding auf der Tabelle — nur options.flat"}
98
+ ],
99
+ "files": []
86
100
  }
87
101
  ]
88
102
  }
@@ -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).
@@ -635,6 +651,21 @@ interface XiriExpansionPanelSettings {
635
651
  }
636
652
  ```
637
653
 
654
+ Enthält ein Panel eine flache Card (`card.flat`) oder eine flache Tabelle (`table.options.flat`),
655
+ bekommt das Panel die Klasse `flat-content` und halbiert seinen Seitenabstand (24px → 12px) — die
656
+ flache Komponente bringt Rahmen und Innenabstand selbst mit.
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
+
638
669
  **Panel mit Header-Buttons + rahmenloser Card** (statt Card mit `buttonsTop` im Panel, die doppelten
639
670
  Titel und Schatten erzeugt):
640
671
 
@@ -652,6 +683,28 @@ const gps: XiriExpansionSettings = {
652
683
  };
653
684
  ```
654
685
 
686
+ **Tabelle als Panel-Inhalt** (`options.flat`, ein Panel pro Gruppe). `cols` braucht es hier nicht,
687
+ Tabellen sind im Dyncomponent ohnehin volle Breite; `search: false` hält auch die Header-Leiste der
688
+ Tabelle weg (siehe `table.md`):
689
+
690
+ ```ts
691
+ const groups: XiriExpansionSettings = {
692
+ multi: false, displayMode: 'flat', unload: true, // ein Panel offen, Tabelle bei Close aus dem DOM
693
+ panels: [
694
+ { title: 'Standort Wien', icon: 'place', description: '3 Geräte', expanded: true, data: [ table(wien) ] },
695
+ { title: 'Standort Graz', icon: 'place', description: '2 Geräte', data: [ table(graz) ] },
696
+ ],
697
+ };
698
+
699
+ function table( rows: XiriTableRow[] ): XiriDynData {
700
+ return { type: 'table', data: {
701
+ data: rows,
702
+ fields: [ { id: 'name', name: 'Gerät' }, { id: 'imei', name: 'IMEI' } ],
703
+ options: { flat: true, density: 'compact', pagination: false, search: false, sort: true },
704
+ } as XiriTableSettings };
705
+ }
706
+ ```
707
+
655
708
  ## Skeleton & Empty-State
656
709
 
657
710
  ### xiri-skeleton
@@ -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;
@@ -141,8 +142,8 @@ letzterer geht über das FormControl, das Feld fällt dann also auch aus `formGr
141
142
  | `textarea` | Mat-Textarea | `rows` |
142
143
  | `number` | Mat-Input type=number | `min`, `max`, `textSuffix` |
143
144
  | `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` |
145
+ | `select` | Mat-Select mit `list` | `multiple`, `search`, `selectAll` |
146
+ | `multiselect` | Checkbox-Liste (flacher Treeselect) | `list` oder `url`, `min`, `max` |
146
147
  | `model` | Mat-Select mit Backend-Load | `url`, `serverSideSearch` |
147
148
  | `object` | Komplexes Objekt-Select (JSON-Value) | `url`, `list` |
148
149
  | `treeselect` | Tree-Picker | `url`, `tree: true` |
@@ -339,6 +340,16 @@ Inline (statisch):
339
340
  ]}
340
341
  ```
341
342
 
343
+ Mehrfachauswahl mit „Alle / Keine“-Toggle (`selectAll` — Checkbox von `ngx-mat-select-search` über der Liste; wirkt auf die
344
+ aktuell sichtbaren, also bei aktiver Suche nur die gefilterten Optionen, lässt `disabled`-Optionen unangetastet und wird
345
+ ausgeblendet, wenn kein Treffer wählbar ist. Mit `selectAll` wird immer der Such-Zweig gerendert, auch bei `search: false`.
346
+ Go-Seite: `SelectField.SetMultiple(true).SetSelectAll(true)`):
347
+
348
+ ```typescript
349
+ { id: 'tags', type: 'select', name: 'Tags', multiple: true, selectAll: true, value: [],
350
+ list: [ { id: 1, name: 'Produktion' }, { id: 2, name: 'Logistik' }, { id: 3, name: 'Archiv', disabled: true } ] }
351
+ ```
352
+
342
353
  Hierarchisch (`treeselect` — Optionen über `children` verschachteln; auswählbar sind die Blattknoten, `isGroup` markiert Elternknoten):
343
354
 
344
355
  ```typescript
@@ -65,20 +65,47 @@ 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-Refresh → ruft `onTableRefresh()` wenn gesetzt
81
- - Table-Update → ruft `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)
84
+ - `update: "table"` → `onTableUpdate(id, field, content)` wenn gesetzt
85
+
86
+ ### Nachladbare Panels: `XIRI_PANEL_HOST`
87
+
88
+ `refresh: "panel"` lädt genau eine `xiri-card` mit `url` neu (Titel, Buttons, Inhalt), die restliche Seite bleibt
89
+ stehen. Die Verdrahtung läuft über DI, nicht über Outputs:
90
+
91
+ ```typescript
92
+ export interface XiriPanelHost { reloadPanel(): void; }
93
+ export const XIRI_PANEL_HOST: InjectionToken<XiriPanelHost>;
94
+ ```
95
+
96
+ - `xiri-card` und jedes `mat-expansion-panel` in `xiri-expansion` (Directive `xiriExpansionPanel`) stellen sich als
97
+ `XIRI_PANEL_HOST` bereit (`providers: [{ provide: XIRI_PANEL_HOST, useExisting: … }]`).
98
+ - `xiri-button` und `xiri-table` injizieren den Token optional und rufen bei `refresh: "panel"` `reloadPanel()` der
99
+ nächstgelegenen Card — egal ob der Button im Card-Header, unten oder in einer verschachtelten Komponente liegt.
100
+ Ohne umschließende Card: `console.warn`.
101
+ - Eine Card ohne `url` reicht per `skipSelf` an die nächste äußere Card weiter; ohne solche → `refresh: "page"`.
102
+ - Eigene Komponenten, die als Panel gelten sollen, implementieren `XiriPanelHost` und providen den Token genauso;
103
+ `createPanelLoader({ url, key })` aus `services/panel-loader.ts` liefert Laden, Envelope-Auspacken, Puffer und
104
+ Reload-Queue fertig (so nutzen es Card und Expansion-Panel).
105
+ - Rendert die Komponente Inhalt über `ngTemplateOutlet`, muss sie `injector` (ihren Element-Injector) mitgeben —
106
+ eingebettete Views lösen DI sonst über die deklarierende View auf, und Buttons im Inhalt finden den Host nicht.
107
+
108
+ Antwortformat des Card-Endpoints siehe `components.md` → xiri-card. Ab xiri-ng 0.4.10 / xiri-go 0.3.10.
82
109
 
83
110
  ## XiriFormService
84
111
 
@@ -117,12 +117,55 @@ export interface XiriTableOptions {
117
117
 
118
118
  borders?: boolean;
119
119
  bordersHeader?: boolean;
120
+ flat?: boolean = false; // rahmenlos — s. u. „Rahmenlose Tabelle"
120
121
  footer?: boolean; // Footer-Row mit count/sum/static
121
122
 
122
123
  serverSide?: boolean; // Paging/Sort/Search serverseitig
123
124
  }
124
125
  ```
125
126
 
127
+ ### Rahmenlose Tabelle (`flat`) — Tabelle als Panel- oder Card-Inhalt
128
+
129
+ Die Tabelle rendert sich in eine eigene `mat-card` mit `mat-elevation-z3` und `margin-bottom:
130
+ var(--xiri-spacing-xl)`. Liegt sie in einem Expansion-Panel oder als Sub-Component in einer Card, ist
131
+ das ein Rahmen im Rahmen. `options.flat: true` lässt Schatten, Hintergrund, Radius und das Margin weg.
132
+ Pendant zu `XiriCardSettings.flat`; Go-Seite `TableBuilder.SetFlat(true)` ab `xiri-go >= 0.3.9`.
133
+
134
+ Ein Expansion-Panel, das eine flache Card oder eine flache Tabelle enthält, bekommt zusätzlich die
135
+ Klasse `flat-content` und halbiert seinen Seitenabstand (24px → 12px) — das passiert automatisch, dafür
136
+ ist nichts zu setzen.
137
+
138
+ ```ts
139
+ const devices: XiriDynData = {
140
+ type: 'table',
141
+ data: {
142
+ data: rows,
143
+ fields: [ { id: 'name', name: 'Gerät' }, { id: 'imei', name: 'IMEI' } ],
144
+ // search ist default true — für eine nackte Tabelle explizit abschalten
145
+ options: { flat: true, density: 'compact', pagination: false, search: false, sort: true },
146
+ } as XiriTableSettings,
147
+ };
148
+
149
+ const acc: XiriExpansionSettings = {
150
+ multi: false, unload: true,
151
+ panels: [ { title: 'Standort Wien', icon: 'place', description: '3 Geräte', data: [ devices ] } ],
152
+ };
153
+ ```
154
+
155
+ Anders als bei einer Card braucht die Tabelle **kein** `cols: 12` — `xiri-dyncomponent` gibt Tabellen
156
+ schon per Default `xcol` (volle Breite), Cards dagegen `xcol xcol-md-6 xcol-xl-4`.
157
+
158
+ ### Die Header-Leiste erscheint nur mit Inhalt
159
+
160
+ Der graue Streifen über der Kopfzeile (51px, `--surface-container`, Trennlinie) trägt `title`,
161
+ `buttons`, die Suche, den Reload-Button, die Tree-Aktionen (alle aus-/einklappen) und die
162
+ „Stand HH:mm"-Anzeige. Ist nichts davon da, wird er gar nicht gerendert.
163
+
164
+ Praktisch heißt das: eine Tabelle mit Inline-`data` und `search: false` hat keine Header-Leiste (vorher
165
+ stand dort ein leerer grauer Balken). Eine Tabelle mit `url` hat nach der ersten Antwort immer eine,
166
+ weil `lastUpdated` dann gesetzt ist. `reload: true` bringt bei Inline-`data` nichts — `loadData()`
167
+ setzt es dort hart auf `false`, weil es nichts nachzuladen gibt.
168
+
126
169
  ### Row-IDs — nicht konvertieren
127
170
 
128
171
  Row-IDs (`row.id`, und im Tree-Modus `idField`/`parentIdField`) sind **`string | number`** und
@@ -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;
@@ -185,6 +186,9 @@ declare class XiriSelectDirective implements OnInit, OnDestroy {
185
186
  private _filterFormControl;
186
187
  /** list of _allValues filtered by search keyword */
187
188
  private _filteredValuesSubject;
189
+ /** what the panel currently shows — the basis for the select-all toggle */
190
+ private _filtered;
191
+ private emit;
188
192
  /** indicate search operation is in progress */
189
193
  searching: boolean;
190
194
  /** Subject that emits when the component has been destroyed. */
@@ -201,6 +205,13 @@ declare class XiriSelectDirective implements OnInit, OnDestroy {
201
205
  ngOnInit(): void;
202
206
  ngOnDestroy(): void;
203
207
  private applyFilter;
208
+ private selectableIds;
209
+ private static ids;
210
+ /** false when nothing is selectable — the checkbox is hidden then, otherwise MatCheckbox would stay checked after a no-op click */
211
+ hasSelectable(): boolean;
212
+ allSelected(value: unknown): boolean;
213
+ someSelected(value: unknown): boolean;
214
+ toggleSelectAll(selectAll: boolean, control: AbstractControl | null): void;
204
215
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<XiriSelectDirective, never>;
205
216
  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
217
  }
@@ -279,6 +290,7 @@ declare class XiriButtonComponent implements OnDestroy {
279
290
  private dialog;
280
291
  private downloadService;
281
292
  private responseHandler;
293
+ private panelHost;
282
294
  _disabled: _angular_core.Signal<boolean>;
283
295
  _url: _angular_core.Signal<string | undefined>;
284
296
  constructor();
@@ -288,6 +300,7 @@ declare class XiriButtonComponent implements OnDestroy {
288
300
  openMenuDialog(event: MouseEvent, item: Record<string, unknown>): void;
289
301
  private actionApi;
290
302
  private processResult;
303
+ private refreshPanel;
291
304
  private startPolling;
292
305
  private pollTick;
293
306
  private cancelPollTimers;
@@ -462,6 +475,7 @@ declare class XiriTableInlineEditService {
462
475
  searching: _angular_core.WritableSignal<boolean>;
463
476
  displayedOptions: _angular_core.WritableSignal<EditableOption[]>;
464
477
  private editingOriginalValue;
478
+ private editSeq;
465
479
  private editableOptionsSub;
466
480
  private optionCache;
467
481
  private searchSub;
@@ -472,6 +486,7 @@ declare class XiriTableInlineEditService {
472
486
  private onSaved;
473
487
  private onDataUpdate;
474
488
  private onCallReturn;
489
+ private isRowLive;
475
490
  private get editUrl();
476
491
  private get displayedColumns();
477
492
  init(config: {
@@ -481,6 +496,7 @@ declare class XiriTableInlineEditService {
481
496
  onSaved: (row: XiriTableRow, fieldId: string) => void;
482
497
  onDataUpdate: () => void;
483
498
  onCallReturn: (result: unknown) => void;
499
+ isRowLive: (row: XiriTableRow) => boolean;
484
500
  }): void;
485
501
  start(row: XiriTableRow, column: XiriTableField, skipSavingCheck?: boolean): void;
486
502
  /** Sets up the search box + subscription for searchable inline-edit selects. */
@@ -572,6 +588,7 @@ interface XiriTableOptions {
572
588
  saveInputUrl?: string;
573
589
  borders?: boolean;
574
590
  bordersHeader?: boolean;
591
+ flat?: boolean;
575
592
  footer?: boolean;
576
593
  serverSide?: boolean;
577
594
  scrollHeight?: string;
@@ -595,6 +612,7 @@ declare class XiriTableComponent implements OnInit, OnDestroy {
595
612
  private numberService;
596
613
  private snackbar;
597
614
  private responseHandler;
615
+ private panelHost;
598
616
  private downloadService;
599
617
  inlineEdit: XiriTableInlineEditService;
600
618
  tree: XiriTableTreeService;
@@ -670,6 +688,7 @@ declare class XiriTableComponent implements OnInit, OnDestroy {
670
688
  private clearAutoRefresh;
671
689
  searchDo($event: string): void;
672
690
  get treeEnabled(): boolean;
691
+ get hasHeader(): boolean;
673
692
  get treeColumnId(): string;
674
693
  get treeShowCounts(): boolean;
675
694
  get treeHasAddSub(): boolean;
@@ -708,6 +727,7 @@ declare class XiriTableComponent implements OnInit, OnDestroy {
708
727
  private makeApiCall;
709
728
  buttonReturn(event: XiriButtonResult): void;
710
729
  private callReturn;
730
+ private refreshPanel;
711
731
  private getSelectionIDs;
712
732
  startInlineEdit(row: XiriTableRow, column: XiriTableField, skipSavingCheck?: boolean): void;
713
733
  cancelInlineEdit(): void;
@@ -937,6 +957,26 @@ declare class XiriQueryComponent implements OnInit {
937
957
  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>;
938
958
  }
939
959
 
960
+ /**
961
+ * Nächstgelegener Panel-Container eines Auslösers: eine xiri-card oder ein mat-expansion-panel (Directive
962
+ * xiriExpansionPanel). Beide stellen sich per Provider bereit; Button und Tabelle injizieren den Token optional
963
+ * und rufen bei refresh:'panel' reloadPanel().
964
+ */
965
+ interface XiriPanelHost {
966
+ reloadPanel(): void;
967
+ }
968
+ declare const XIRI_PANEL_HOST: InjectionToken<XiriPanelHost>;
969
+ declare class XiriResponseHandlerService {
970
+ private router;
971
+ handle(result: unknown, callbacks?: {
972
+ onTableRefresh?: () => void;
973
+ onTableUpdate?: (id: unknown, field: string, content: unknown) => void;
974
+ onPanelRefresh?: () => void;
975
+ }): void;
976
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<XiriResponseHandlerService, never>;
977
+ static ɵprov: _angular_core.ɵɵInjectableDeclaration<XiriResponseHandlerService>;
978
+ }
979
+
940
980
  interface XiriCardSettings {
941
981
  url?: string;
942
982
  reload?: boolean;
@@ -958,16 +998,25 @@ interface XiriCardSettings {
958
998
  flat?: boolean;
959
999
  padding?: string;
960
1000
  }
961
- declare class XiriCardComponent {
962
- private dataService;
1001
+ declare class XiriCardComponent implements XiriPanelHost {
1002
+ private responseHandler;
1003
+ private parentPanel;
963
1004
  settings: _angular_core.InputSignal<XiriCardSettings>;
1005
+ private loader;
964
1006
  showHeader: Signal<boolean>;
965
1007
  isCollapsed: _angular_core.WritableSignal<boolean>;
966
- private cardResource;
967
1008
  loading: Signal<boolean>;
968
1009
  errorMsg: Signal<string>;
1010
+ private _raw;
1011
+ /** Zuletzt erfolgreich geladene komplette Card ({card: …}); null bei Zeilen-Antworten. */
1012
+ private loadedCard;
1013
+ /** Inhaltszeilen aus einer Nicht-Card-Antwort: {data: rows} → rows, sonst die Antwort selbst. */
969
1014
  private _loaded;
1015
+ /** settings(), überlagert von einer nachgeladenen kompletten Card. Inhaltsfelder kommen dann nur aus der Antwort. */
1016
+ card: Signal<XiriCardSettings>;
970
1017
  cardData: Signal<unknown>;
1018
+ /** Skeleton nur, solange noch nie etwas geladen wurde (auch nicht gepuffert) und kein statischer Inhalt da ist. */
1019
+ showSkeleton: Signal<boolean>;
971
1020
  hasComponents: Signal<boolean>;
972
1021
  /** Resolves padding setting (token or free CSS value) into a CSS length string. */
973
1022
  componentsPadding: Signal<string>;
@@ -976,6 +1025,8 @@ declare class XiriCardComponent {
976
1025
  /** Klick irgendwo im Header toggelt; Buttons/Links (Collapse, Reload, buttonsTop) behalten ihre eigene Aktion. */
977
1026
  onHeaderClick(event: MouseEvent): void;
978
1027
  reload(): void;
1028
+ /** refresh:'panel' aus Button/Tabelle in dieser Card. Ohne url: äußere Card, sonst Page-Reload. */
1029
+ reloadPanel(): void;
979
1030
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<XiriCardComponent, never>;
980
1031
  static ɵcmp: _angular_core.ɵɵComponentDeclaration<XiriCardComponent, "xiri-card", never, { "settings": { "alias": "settings"; "required": true; "isSignal": true; }; }, {}, never, never, true, never>;
981
1032
  }
@@ -1337,7 +1388,8 @@ interface XiriExpansionPanelSettings {
1337
1388
  icon?: string;
1338
1389
  disabled?: boolean;
1339
1390
  expanded?: boolean;
1340
- data: XiriDynData[];
1391
+ url?: string;
1392
+ data?: XiriDynData[];
1341
1393
  buttons?: XiriButtonlineSettings;
1342
1394
  lazy?: boolean;
1343
1395
  unload?: boolean;
@@ -1359,11 +1411,43 @@ declare class XiriExpansionComponent {
1359
1411
  visitedPanels: _angular_core.WritableSignal<Set<number>>;
1360
1412
  onPanelOpened(index: number): void;
1361
1413
  onPanelClosed(index: number): void;
1414
+ hasFlatContent(panel: XiriExpansionPanelSettings): boolean;
1362
1415
  shouldRenderContent(index: number, panel: XiriExpansionPanelSettings): boolean;
1363
1416
  static ɵfac: _angular_core.ɵɵFactoryDeclaration<XiriExpansionComponent, never>;
1364
1417
  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>;
1365
1418
  }
1366
1419
 
1420
+ /**
1421
+ * Macht ein mat-expansion-panel zum Panel-Host für refresh:'panel' und lädt es bei gesetzter url nach.
1422
+ * Sitzt als Directive direkt auf dem Material-Panel, damit der Element-Injector des Panels den Token trägt:
1423
+ * Header-Buttons und (über ngTemplateOutletInjector) der Inhalt finden so genau dieses Panel.
1424
+ */
1425
+ declare class XiriExpansionPanelDirective implements XiriPanelHost {
1426
+ /**
1427
+ * Shell-Settings des Panels aus XiriExpansionSettings.panels. Nicht `required`: der Loader-Effect einer Directive
1428
+ * läuft in der Host-View und kann vor dem ersten Setzen der Inputs feuern (NG0950) – der leere Default hat keine url.
1429
+ */
1430
+ settings: _angular_core.InputSignal<XiriExpansionPanelSettings>;
1431
+ /** Element-Injector des Panels – als ngTemplateOutletInjector für den Inhalt, sonst löst der über die deklarierende View auf. */
1432
+ injector: Injector;
1433
+ private responseHandler;
1434
+ private parentPanel;
1435
+ private loader;
1436
+ loading: _angular_core.Signal<boolean>;
1437
+ errorMsg: _angular_core.Signal<string>;
1438
+ /**
1439
+ * Shell, überlagert von title/description/icon/buttons/data der letzten Antwort.
1440
+ * expanded/disabled/lazy/unload bleiben Shell-Werte – sonst klappte ein Reload ohne `expanded` das Panel zu.
1441
+ */
1442
+ panel: _angular_core.Signal<XiriExpansionPanelSettings>;
1443
+ /** Skeleton nur, solange noch nie etwas geladen wurde (auch nicht gepuffert) und die Shell keinen Inhalt hat. */
1444
+ showSkeleton: _angular_core.Signal<boolean>;
1445
+ /** refresh:'panel' aus Header-Button, Inhalt oder Tabelle in diesem Panel. Ohne url: äußerer Host, sonst Page-Reload. */
1446
+ reloadPanel(): void;
1447
+ static ɵfac: _angular_core.ɵɵFactoryDeclaration<XiriExpansionPanelDirective, never>;
1448
+ static ɵdir: _angular_core.ɵɵDirectiveDeclaration<XiriExpansionPanelDirective, "mat-expansion-panel[xiriExpansionPanel]", ["xiriExpansionPanel"], { "settings": { "alias": "xiriExpansionPanel"; "required": false; "isSignal": true; }; }, {}, never, never, true, never>;
1449
+ }
1450
+
1367
1451
  interface XiriBreadcrumbItem {
1368
1452
  label: string;
1369
1453
  link?: string;
@@ -2657,15 +2741,28 @@ declare class XiriSnackbarService {
2657
2741
  static ɵprov: _angular_core.ɵɵInjectableDeclaration<XiriSnackbarService>;
2658
2742
  }
2659
2743
 
2660
- declare class XiriResponseHandlerService {
2661
- private router;
2662
- handle(result: unknown, callbacks?: {
2663
- onTableRefresh?: () => void;
2664
- onTableUpdate?: (id: unknown, field: string, content: unknown) => void;
2665
- }): void;
2666
- static ɵfac: _angular_core.ɵɵFactoryDeclaration<XiriResponseHandlerService, never>;
2667
- static ɵprov: _angular_core.ɵɵInjectableDeclaration<XiriResponseHandlerService>;
2668
- }
2744
+ /**
2745
+ * Lädt ein Panel (Card, Expansion-Panel) von einer URL und puffert die letzte erfolgreiche Antwort.
2746
+ * Gemeinsame Logik der XIRI_PANEL_HOST-Implementierungen; muss im Injection-Context aufgerufen werden.
2747
+ *
2748
+ * - `raw`: rohe Antwort, nur gelesen, wenn die Resource einen Wert hat (value() wirft im Fehlerzustand).
2749
+ * - `loaded`: das Objekt unter `opts.key` der letzten erfolgreichen Antwort. Bleibt bei Reload-Fehler
2750
+ * stehen, wird bei url-Wechsel und bei einer erfolgreichen Antwort ohne `opts.key` geleert.
2751
+ * - `reloadOrQueue`: lädt neu; läuft der erste Load noch, wird der Reload nachgeholt, sobald er fertig ist.
2752
+ */
2753
+ declare function createPanelLoader<T extends object>(opts: {
2754
+ url: () => string | undefined;
2755
+ key: string;
2756
+ }): {
2757
+ loading: _angular_core.Signal<boolean>;
2758
+ errorMsg: _angular_core.Signal<string>;
2759
+ raw: _angular_core.Signal<unknown>;
2760
+ loaded: _angular_core.WritableSignal<T | null>;
2761
+ /** Manueller Reload (Reload-Button): kein Doppelstart, solange geladen wird. */
2762
+ reload: () => void;
2763
+ /** refresh:'panel': reload() gibt false zurück, solange der erste Load läuft – dann nachholen. */
2764
+ reloadOrQueue: () => void;
2765
+ };
2669
2766
 
2670
2767
  declare class XiriDownloadService {
2671
2768
  /**
@@ -2687,6 +2784,6 @@ declare class XiriDownloadService {
2687
2784
 
2688
2785
  declare function provideXiriServices(config: Partial<XiriDataServiceConfig>): EnvironmentProviders;
2689
2786
 
2690
- 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 };
2691
- 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 };
2787
+ 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 };
2788
+ 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 };
2692
2789
  //# sourceMappingURL=xiriframework-xiri-ng.d.ts.map