@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/fesm2022/xiriframework-xiri-ng.mjs +312 -50
- package/fesm2022/xiriframework-xiri-ng.mjs.map +1 -1
- package/package.json +1 -1
- package/skills/xiri-ng-expert/SKILL.md +9 -2
- package/skills/xiri-ng-expert/evals/evals.json +14 -0
- package/skills/xiri-ng-expert/references/components.md +55 -2
- package/skills/xiri-ng-expert/references/form-fields.md +13 -2
- package/skills/xiri-ng-expert/references/setup.md +35 -8
- package/skills/xiri-ng-expert/references/table.md +43 -0
- package/types/xiriframework-xiri-ng.d.ts +114 -17
- package/types/xiriframework-xiri-ng.d.ts.map +1 -1
package/package.json
CHANGED
|
@@ -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:
|
|
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` |
|
|
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`,
|
|
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:
|
|
72
|
+
handle(result: unknown, callbacks?: {
|
|
72
73
|
onTableRefresh?: () => void;
|
|
73
|
-
onTableUpdate?: (id:
|
|
74
|
+
onTableUpdate?: (id: unknown, field: string, content: unknown) => void;
|
|
75
|
+
onPanelRefresh?: () => void;
|
|
74
76
|
}): void
|
|
75
77
|
```
|
|
76
78
|
|
|
77
|
-
Verhalten je nach
|
|
78
|
-
-
|
|
79
|
-
-
|
|
80
|
-
-
|
|
81
|
-
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
2661
|
-
|
|
2662
|
-
|
|
2663
|
-
|
|
2664
|
-
|
|
2665
|
-
|
|
2666
|
-
|
|
2667
|
-
|
|
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
|