@smartbit4all/ng-client 7.2.0 → 7.2.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/HTML-WIDGET.md CHANGED
@@ -140,6 +140,54 @@ távozását:
140
140
  - A `backwards` kitöltés a belépésnél azért jó, mert a vége után a `:hover` és a többi szabály
141
141
  ismét mozgathatja az elemet (a `both` vagy a `forwards` animációs értéke felülírná őket).
142
142
 
143
+ ## A szerver-fázis
144
+
145
+ A szerver-helyőrző a platform template-dialektusa: `${alias:/útvonal#mező?stratégia}`, mellette a
146
+ `data-sb4-context` (iteráció) és a `data-sb4-if` (feltétel) attribútum. A builder a **nyitásáról**
147
+ ismeri fel — `${alias:/` —, a sima `${name}` neki és a motornak is közömbös szöveg. Literálként
148
+ `${`-nak írd.
149
+
150
+ Három út oldja fel, és **egyik sem fut magától**:
151
+
152
+ | Út | Mikor | Hiba esetén |
153
+ |---|---|---|
154
+ | `resolveTemplate(ctx, …)`, és az eredmény megy a `html(...)`-be | a build előtt | elnyel: logol, és a kulcsot vagy üres stringet ad vissza |
155
+ | `h.template(ctx, KEY)` | a widget felépítésekor, kulcsból (lásd *Stíluslap a template-kulcs mellől*) | dob |
156
+ | `h.resolveLater()` + `resolveHtml(ctx, layout)` | a **felépített layouton** | dob |
157
+
158
+ ```java
159
+ SmartComponentLayoutDefinition layout = layoutBuilder(view)
160
+ .vForm(f -> f.html(h -> h.html(CARD_HTML).resolveLater()))
161
+ .build();
162
+ resolveHtml(objectApi.contextObject().set("contact", contact), layout); // PageApiImpl
163
+ ```
164
+
165
+ - A `resolveHtml` bejárja a layout `FORM` / `CONTAINER` fáját és a widgetek gyerek-widgetjeit, és
166
+ minden HTML widget `html`-jét feloldja **ugyanazzal a ctx-szel**. A `css`, a `root` és a `fields`
167
+ marad. A gridekhez nem nyúl — egy sor-layout maga is layout, arra külön hívható. Page-en kívül:
168
+ `ObjectLayouts.resolveHtml(layout, resolver, objectApi, ctx)`; listára is van változata.
169
+ - **Amiben nincs `${alias:/`, ahhoz hozzá sem ér** — az a html nem megy át a motoron, tehát nem is
170
+ normalizálódik. Ezért bármilyen layoutra ráhívható, és a második futás egy már feloldott
171
+ widgeten nem csinál semmit.
172
+ - **Helyben módosít.** Ha az adat változik, **építsd újra a layoutot, ne oldd fel újra**: a
173
+ view-ban tárolt, egyszer már feloldott layoutban nincs mit feloldani, az új ctx-szel hívott
174
+ második futás némán a régi értékeket hagyja. Aki a feloldatlan eredetit meg akarja tartani,
175
+ másolaton hívja.
176
+ - **Hangosan bukik** (`IllegalStateException`): ha van `${alias:/`, de nincs template-modul a
177
+ hostban; és ha a feloldás **után** is maradt — a motor az ismeretlen aliasú helyőrzőt ugyanis
178
+ szó nélkül benne hagyja. A motor másik két csendes esete megmarad: a hiányzó / `null` mező
179
+ helyére szóköz kerül, a mezőszintű feloldási hiba helyére a „Feldolgozási hiba" szöveg.
180
+
181
+ **A `build()` őre.** Az a `${alias:/`, amit a három út egyike sem oldott fel, régen szó nélkül
182
+ kiment a kliensre, és nyersen megjelent. Most a `HtmlWidgetBuilder.build()` `IllegalStateException`-t
183
+ dob rá, kivéve ha a widget `resolveLater()`-t mondott. Ez a `vf.html(String)`, az
184
+ `ObjectLayoutBuilder.html(...)` és a `GridBuilder.htmlColumn(...)` útjára is igaz.
185
+
186
+ **Üres ctx-szel semmi nem oldódik fel**: a `${…}` literál marad (és a `build()` elbukik rajta), a
187
+ `data-sb4-context` elemek eltűnnek. A grid-szintű sor-layoutnak és az oszlop-sablonnak nincs
188
+ szerver-oldali, soronkénti kontextusa — ott a sorból jövő érték `{{…}}`, a szerveren számolt érték
189
+ pedig a sor egy mezője legyen.
190
+
143
191
  ## A kliens-helyőrzők nyelvtana
144
192
 
145
193
  Logika-mentes Mustache-részhalmaz. Ugyanezt a nyelvtant olvassa a Java-oldali
@@ -253,6 +301,7 @@ escape-pel), a pipe-ok balról jobbra láncolhatók, a kimenetük is escape-en m
253
301
  | Hol | Mi történik |
254
302
  |---|---|
255
303
  | Java-builder (`build()`) | `IllegalArgumentException`: párosítatlan / keresztezett szekció, raw tag, érvénytelen path vagy `root`, a `root` fölé mutató `../`, ismeretlen pipe, rossz pipe-szintaxis, üres `data-sb4-toolbar` / `data-sb4-action` |
304
+ | Java-builder (`build()`), `resolveHtml` | `IllegalStateException`: feloldatlan szerver-helyőrző (`${alias:/`), lásd *A szerver-fázis* |
256
305
  | kliens | nem dob: `console.error`, és a html **feloldatlanul** kerül ki — látható hiba, nem üres kártya |
257
306
 
258
307
  Egyetlen szándékos különbség: az ismeretlen pipe-név a kliensen csak warn (az érték formázatlanul
@@ -264,7 +313,10 @@ Ha a html átmegy a szerver template-motorján (Jsoup), akkor:
264
313
 
265
314
  - **egy gyökérelem kötelező** — a gyökér-szintű szöveg és szekció-tag eldobódik;
266
315
  - táblázatban **explicit `<tbody>`** kell, különben a parser a `{{#rows}}` után szúr egyet;
267
- - a whitespace-re (`:empty`, `white-space: pre`) ne építs, a motor átírja.
316
+ - a whitespace-re (`:empty`, `white-space: pre`, `&nbsp;`) ne építs, a motor átírja;
317
+ - a szerverről behelyettesített **érték ne tartalmazzon `{{`-t**: a motor HTML-escape-eli, de a
318
+ `{{` átmegy rajta, és a kliens helyőrzőnek olvasná (a néző saját adatán oldaná fel);
319
+ - `?stratégia` után is állhat `{{…}}` — a stratégia a `{{`-on nem nyúl át.
268
320
 
269
321
  ## Toolbar-slot
270
322
 
@@ -355,14 +407,30 @@ oszlop fedi a `card.parties.displayName`-et). A mezőlista ellenőriz, nem vála
355
407
  Szerver-származtatott mező (pl. `partyCount`) legyen valódi oszlop.
356
408
 
357
409
  **Kattintás** (csak a layoutból renderelt kártyán; a host-regisztrált kártya maga kezeli a saját
358
- klikkjeit):
410
+ klikkjeit). Két független tengely, ugyanaz a modell, mint a táblán:
359
411
 
360
- - **klikk = kijelölés**, ha a grid `selectionMode`-ja nem `NONE` és a sor `selectable`; a kijelölt
361
- kártya hostja `selected` osztályt és egy minimális, felülírható outline-t kap;
362
- - **dupla klikk = a sor default akciója** (`defaultRowActions`);
363
- - a toolbar-gomb és a trigger megtartja magának a kattintást.
412
+ - **a kijelölést a `selectionMode` adja** (hiányzó = `NONE` = nincs kijelölés);
413
+ - **a default sor-akció gesztusát a `GridViewDescriptor.defaultRowActionTrigger`**
414
+ (`click` | `doubleClick`), Java: `GridBuilder.defaultRowActionTrigger(...)`.
364
415
 
365
- Ha a kártyának „klikk = megnyitás" kell, tegyél a html gyökérelemére triggert.
416
+ | `defaultRowActionTrigger` | klikk | dupla klikk |
417
+ |---|---|---|
418
+ | nincs megadva (kártyán = `click`) | a sor **első** illő default akciója | — |
419
+ | `click` | default akció; több illő akciónál **menü az egérnél** | — |
420
+ | `doubleClick` | kijelölés, ha a grid és a sor jelölhető | default akció; több illőnél menü |
421
+
422
+ - **A klikkes trigger elviszi a klikket a kijelölés elől**: ha a sornak van default akciója és a
423
+ trigger `click` (vagy nincs megadva), a kártya klikkre nem jelölhető ki, akármi a
424
+ `selectionMode`. Kártya-kijelöléshez `doubleClick` trigger kell, vagy default akció nélküli grid.
425
+ - „Illő" default akció: a grid `defaultRowActions` kódjai közül az, amit a sor `actions`-e kínál —
426
+ a menü tehát soronként más lehet. Megadott trigger mellett egy illő akció azonnal elsül.
427
+ - A dupla klikk második klikkje nem számít külön klikknek: nem nyit kétszer, és nem vonja vissza
428
+ az első klikk kijelölését (dupla klikk = kijelöl + megnyit). Amíg a default akció fut, az újabb
429
+ klikk is eldobódik.
430
+ - A kijelölt kártya hostja `selected` osztályt és egy minimális, felülírható outline-t kap. A
431
+ kijelölés toggle, mint a táblán; `selectionType: CHECKBOX` a kártyán nem rajzol checkboxot.
432
+ - A toolbar-gomb és a trigger megtartja magának a kattintást.
433
+ - A tábla gesztusa változatlanul a dupla klikk, a mező értékétől függetlenül.
366
434
 
367
435
  ## Html a tábla cellájában
368
436
 
package/MIGRATION-7.0.md CHANGED
@@ -1864,13 +1864,27 @@ Additive, with **one behaviour change** and one removed field. The reference is
1864
1864
  (`GridViewDescriptor.rowLayouts`, picked per row by `GridRow.rowLayout`) instead of once per
1865
1865
  row. The per-row `layoutDescriptor.GRID_ROW_LAYOUT` still works and wins over them; a
1866
1866
  host-registered `'<GRID_ID>Card'` component still renders the rows that get no layout.
1867
- - **Behaviour change — clicking a card rendered from a layout.** Since #29717 a click on such a
1868
- card fired the row's default action. From 7.2 **a click selects the row** (when the grid's
1869
- `selectionMode` is not `NONE` and the row is selectable) and **a double click fires the default
1870
- row action**, exactly as a `ROW_SELECT` table does. A card that must open on a single click gets
1871
- it back on the server side: put an action trigger on the root element of the card's html, or
1872
- offer the action on a toolbar. Cards rendered by a host-registered component are not affected —
1873
- the grid never handled their clicks.
1867
+ - **Clicking a card rendered from a layout — 7.2.0 changed it, 7.2.1 takes the change back.**
1868
+ 7.2.0 made a click select the row and moved the default row action to the double click. That
1869
+ broke `mod-contact`'s contact list, and a cards grid naming no `selectionMode` lost its click
1870
+ altogether. **From 7.2.1 a card behaves as in 7.1.x again unless the server says otherwise**: a
1871
+ click fires the row's first applicable default action, and nothing is selected by click while
1872
+ the click belongs to the default action. A host that put a root trigger on its cards for 7.2.0
1873
+ can keep it; it is no longer needed.
1874
+ - **`GridViewDescriptor.defaultRowActionTrigger` (7.2.1, `click` | `doubleClick`)** makes the
1875
+ gesture data, so a cards grid is programmed like a table: `selectionMode` decides whether rows
1876
+ are selectable, the trigger decides what fires the default row action. With `doubleClick` a
1877
+ click selects the card and a double click fires the default action, as on a `ROW_SELECT` table.
1878
+ With an explicit trigger several applicable default actions open a menu at the pointer, filtered
1879
+ to what the row offers. Without a value a card keeps the click and a table the double click; the
1880
+ table fires on double click whatever the value is. The second click of a double click is not a
1881
+ click of its own on a card: it neither fires the default action again nor toggles the selection
1882
+ back, and further clicks are dropped while the default action runs. Needs a platform that knows
1883
+ the field; an older client ignores it.
1884
+ - **The double-click menu of a table works again.** A grid row offering several of the grid's
1885
+ `defaultRowActions` opens a menu at the pointer on double click. The position override behind it
1886
+ had been written for an older Material signature and threw on open, so until 7.2.1 such a double
1887
+ click did nothing.
1874
1888
  - **`SmartGrid.layoutComponent` is removed.** The card gets the layout class through the
1875
1889
  `SMART_ROW_LAYOUT_COMPONENT` token that `provideSmartNgClient()` provides, so a cards grid a
1876
1890
  host builds with `addGrid()` renders backend layouts too. Delete the field if a host grid model
@@ -11621,6 +11621,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
11621
11621
  class SmartformComponent {
11622
11622
  constructor() {
11623
11623
  this.service = inject(SmartFormService);
11624
+ this.changeDetector = inject(ChangeDetectorRef);
11624
11625
  this._destroy$ = new Subject();
11625
11626
  this.originalWidgets = [];
11626
11627
  this.sophisticatedValueChange = new Subject();
@@ -11746,6 +11747,8 @@ class SmartformComponent {
11746
11747
  this.form = this.service.toFormGroup();
11747
11748
  this.syncClientBindings();
11748
11749
  this.service.widgetsChanged();
11750
+ // A form whose widgets were all hidden has no child to mark it for check.
11751
+ this.changeDetector.markForCheck();
11749
11752
  }
11750
11753
  ngOnDestroy() {
11751
11754
  if (this.followsClient) {
@@ -12032,14 +12035,8 @@ class MatContextMenuTriggerForDirective extends MatMenuTrigger {
12032
12035
  }
12033
12036
  ngAfterContentInit() {
12034
12037
  // Can't just override a private method due to how the lib is compiled
12035
- this['_setPosition'] = (positionStrategy) => {
12036
- let positions = [];
12037
- super['_setPosition'](positionStrategy, {
12038
- withPositions: (p) => {
12039
- positions = p;
12040
- },
12041
- });
12042
- // positionStrategy?.withPositions(positions);
12038
+ this['_setPosition'] = (menu, positionStrategy) => {
12039
+ super['_setPosition'](menu, positionStrategy);
12043
12040
  if (this.lastMouseEvent) {
12044
12041
  positionStrategy?.setOrigin({
12045
12042
  x: this.lastMouseEvent.clientX,
@@ -18196,6 +18193,26 @@ var GridDataAccessConfigKindEnum;
18196
18193
  })(GridDataAccessConfigKindEnum || (GridDataAccessConfigKindEnum = {}));
18197
18194
  ;
18198
18195
 
18196
+ /**
18197
+ * Grid api
18198
+ * The grid api is resposible for the grid components that shows a list of item.
18199
+ *
18200
+ * The version of the OpenAPI document: 1.0.0
18201
+ * Contact: info@it4all.hu
18202
+ *
18203
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
18204
+ * https://openapi-generator.tech
18205
+ * Do not edit the class manually.
18206
+ */
18207
+ /**
18208
+ * The gesture on a row that fires the default row action. Without a value the kind of the grid decides: a click on a card, a double click on a table row. With an explicit value one applicable default row action fires directly, several open a menu at the pointer. A click trigger takes the click from the selection, so a card selects on click only with the doubleClick trigger or without a default row action. The table fires on double click whatever the value is.
18209
+ */
18210
+ var GridDefaultRowActionTrigger;
18211
+ (function (GridDefaultRowActionTrigger) {
18212
+ GridDefaultRowActionTrigger["CLICK"] = "click";
18213
+ GridDefaultRowActionTrigger["DOUBLE_CLICK"] = "doubleClick";
18214
+ })(GridDefaultRowActionTrigger || (GridDefaultRowActionTrigger = {}));
18215
+
18199
18216
  /**
18200
18217
  * Grid api
18201
18218
  * The grid api is resposible for the grid components that shows a list of item.
@@ -18917,6 +18934,12 @@ class SmartGridComponent {
18917
18934
  };
18918
18935
  //#region Row layouts of a cards grid
18919
18936
  this.warnedRowLayouts = new Set();
18937
+ /** The row whose default row actions the menu of the cards shows. */
18938
+ this.cardMenuRow = signal(undefined, /* @ts-ignore */
18939
+ ...(ngDevMode ? [{ debugName: "cardMenuRow" }] : /* istanbul ignore next */ []));
18940
+ this.cardMenuButtons = signal(new Map(), /* @ts-ignore */
18941
+ ...(ngDevMode ? [{ debugName: "cardMenuButtons" }] : /* istanbul ignore next */ []));
18942
+ this.cardDefaultActionRunning = false;
18920
18943
  registerSmartWidget(this.smartComponent, {
18921
18944
  identifier: () => this.smartGrid?.gridIdentifier,
18922
18945
  reload: () => this.refresh(),
@@ -19138,22 +19161,7 @@ class SmartGridComponent {
19138
19161
  type: SmartTableInterfaceTypeEnum.NORMAL,
19139
19162
  sortable: true,
19140
19163
  defaultActionCodes: this.smartGrid?.gridModel.defaultRowActions,
19141
- defaultActions: this.smartGrid?.gridModel.defaultRowActions?.map((code) => {
19142
- return {
19143
- type: code === '_actionSeparator_'
19144
- ? SmartTableButtonType.SEPARATOR
19145
- : SmartTableButtonType.NORMAL,
19146
- callback: this.execute.bind(this),
19147
- code: code,
19148
- // label: this.buttonTranslator({ code: code }),
19149
- translator: this.buttonTranslator.bind(this),
19150
- // args: [
19151
- // {
19152
- // code: code,
19153
- // },
19154
- // ],
19155
- };
19156
- }),
19164
+ defaultActions: this.defaultActionButtons(),
19157
19165
  };
19158
19166
  if (this.smartGrid?.gridModel.view?.descriptor?.highlightProperty &&
19159
19167
  this.smartGrid?.gridModel.view?.descriptor?.highlightClass) {
@@ -19582,6 +19590,24 @@ class SmartGridComponent {
19582
19590
  nodeId: row.id,
19583
19591
  });
19584
19592
  }
19593
+ defaultActionButtons() {
19594
+ return this.smartGrid?.gridModel.defaultRowActions?.map((code) => {
19595
+ return {
19596
+ type: code === '_actionSeparator_'
19597
+ ? SmartTableButtonType.SEPARATOR
19598
+ : SmartTableButtonType.NORMAL,
19599
+ callback: this.execute.bind(this),
19600
+ code: code,
19601
+ // label: this.buttonTranslator({ code: code }),
19602
+ translator: this.buttonTranslator.bind(this),
19603
+ // args: [
19604
+ // {
19605
+ // code: code,
19606
+ // },
19607
+ // ],
19608
+ };
19609
+ });
19610
+ }
19585
19611
  buttonTranslator(uiAction) {
19586
19612
  let desc = this.uiActionDescriptors.get(uiAction.code);
19587
19613
  if (!desc) {
@@ -19655,28 +19681,86 @@ class SmartGridComponent {
19655
19681
  }
19656
19682
  return fallback;
19657
19683
  }
19658
- /** Whether a click on the card of this row toggles its selection. */
19684
+ /**
19685
+ * The gesture that fires the default row action of a card. A grid that names no trigger keeps
19686
+ * the click, which is what a card did before it could be selected.
19687
+ */
19688
+ get cardActionTrigger() {
19689
+ return (this.smartGrid?.gridModel.view?.descriptor?.defaultRowActionTrigger ??
19690
+ GridDefaultRowActionTrigger.CLICK);
19691
+ }
19692
+ /**
19693
+ * Whether a click on the card of this row toggles its selection. A click that fires the
19694
+ * default row action is taken, so such a card is not selectable by click.
19695
+ */
19659
19696
  isCardSelectable(row) {
19660
19697
  const selectionMode = this.smartGrid?.gridModel.view?.descriptor?.selectionMode;
19661
19698
  return (!!this.rowLayoutOf(row) &&
19662
19699
  !!selectionMode &&
19663
19700
  selectionMode !== GridSelectionMode.NONE &&
19664
- row.selectable !== false);
19701
+ row.selectable !== false &&
19702
+ !(this.cardActionTrigger === GridDefaultRowActionTrigger.CLICK && this.hasCardDefaultAction(row)));
19665
19703
  }
19666
- /** Whether a double click on the card of this row fires its default row action. */
19704
+ /** Whether the trigger gesture on the card of this row fires a default row action. */
19667
19705
  hasCardDefaultAction(row) {
19668
19706
  return !!this.rowLayoutOf(row) && !!this.defaultRowActionOf(row);
19669
19707
  }
19670
- onCardClick(row) {
19671
- if (this.isCardSelectable(row)) {
19708
+ onCardClick(row, event) {
19709
+ if (this.cardActionTrigger === GridDefaultRowActionTrigger.CLICK && this.hasCardDefaultAction(row)) {
19710
+ // The later clicks of a double click: an action that returns between the two would fire again.
19711
+ if (event.detail <= 1) {
19712
+ this.fireCardDefaultAction(row, event);
19713
+ }
19714
+ }
19715
+ else if (this.isCardSelectable(row) && event.detail <= 1) {
19716
+ // The second click of a double click would toggle the selection back.
19672
19717
  this.onSelect(row.id);
19673
19718
  }
19674
19719
  }
19675
- onCardDoubleClick(row) {
19676
- if (this.hasCardDefaultAction(row)) {
19677
- this.onDoubleClick(row);
19720
+ onCardDoubleClick(row, event) {
19721
+ if (this.cardActionTrigger === GridDefaultRowActionTrigger.DOUBLE_CLICK &&
19722
+ this.hasCardDefaultAction(row)) {
19723
+ this.fireCardDefaultAction(row, event);
19678
19724
  }
19679
19725
  }
19726
+ /**
19727
+ * Fires the default row action of a card. With an explicit trigger several applicable default
19728
+ * row actions open a menu at the pointer, as a table row does; without one the first fires.
19729
+ * While the action runs the gesture is dropped, so an impatient second click does not fire it
19730
+ * again.
19731
+ */
19732
+ async fireCardDefaultAction(row, event) {
19733
+ const buttons = this.cardDefaultActionButtonsOf(row);
19734
+ if (this.smartGrid?.gridModel.view?.descriptor?.defaultRowActionTrigger && buttons.size > 1) {
19735
+ this.cardMenuRow.set(row);
19736
+ this.cardMenuButtons.set(buttons);
19737
+ // The menu reads its inputs when it opens, which is now.
19738
+ this.changeDetector.detectChanges();
19739
+ this.cardDefaultActionsMenu?.openDefaultActionsMenu(event);
19740
+ return;
19741
+ }
19742
+ if (this.cardDefaultActionRunning) {
19743
+ return;
19744
+ }
19745
+ this.cardDefaultActionRunning = true;
19746
+ try {
19747
+ await this.execute([], row, this.defaultRowActionOf(row));
19748
+ }
19749
+ finally {
19750
+ this.cardDefaultActionRunning = false;
19751
+ }
19752
+ }
19753
+ /** The default row actions this row offers, in the order the grid lists them. */
19754
+ cardDefaultActionButtonsOf(row) {
19755
+ const buttons = new Map();
19756
+ for (const button of this.defaultActionButtons() ?? []) {
19757
+ const uiAction = row.actions.find((action) => action.code === button.code);
19758
+ if (uiAction) {
19759
+ buttons.set(button, uiAction);
19760
+ }
19761
+ }
19762
+ return buttons;
19763
+ }
19680
19764
  //#endregion
19681
19765
  async onSelect(rowId) {
19682
19766
  this.isBlocked = true;
@@ -19733,11 +19817,11 @@ class SmartGridComponent {
19733
19817
  };
19734
19818
  }
19735
19819
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: SmartGridComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
19736
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: SmartGridComponent, isStandalone: true, selector: "smart-grid", inputs: { smartGrid: { classPropertyName: "smartGrid", publicName: "smartGrid", isSignal: false, isRequired: false, transformFunction: null }, uuid: { classPropertyName: "uuid", publicName: "uuid", isSignal: false, isRequired: false, transformFunction: null }, parentLayoutComponent: { classPropertyName: "parentLayoutComponent", publicName: "parentLayoutComponent", isSignal: true, isRequired: false, transformFunction: null }, dev: { classPropertyName: "dev", publicName: "dev", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.data-testid": "this.testId" } }, providers: [SmartGridService], viewQueries: [{ propertyName: "vcRefTable", first: true, predicate: ["table"], descendants: true, read: ViewContainerRef }, { propertyName: "expandedRowsComps", predicate: ExpandedRowRendererComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: "@if (smartGrid) {\n<div class=\"smartGrid-container\">\n <div class=\"smart-grid-toolbar\">\n <smart-ui-action-toolbar [id]=\"toolbarId\"></smart-ui-action-toolbar>\n @if (smartGrid.showEditColumns) {\n <ui-action-button (actionClick)=\"editColumns()\" [descriptor]=\"showEditColumns\">\n </ui-action-button>\n }\n </div>\n <!-- <div [ngClass]=\"isBlocked ? 'blocked' : ''\"></div> -->\n <div class=\"smartGridContent\">\n <div>\n @if (smartGrid.showResultCount) {\n <div>\n <div class=\"smartGrid-data-number\">\n {{ smartGrid.gridModel.totalRowCount }}\n </div>\n </div>\n }\n </div>\n <div class=\"smart-grid-table-container\">\n <ng-template #table></ng-template>\n </div>\n @if (smartGrid.layoutDef === layoutDef().EXPANDABLE) {\n <div>\n @for (expandableSection of expandableSections; track expandableSection) {\n <smart-expandable-section #gridExpandableSection [data]=\"expandableSection\"></smart-expandable-section>\n }\n </div>\n }\n @if (smartGrid.layoutDef === layoutDef().CARD && smartGrid.dataLayoutDef) {\n <div class=\"cards-container\" [ngStyle]=\"{\n 'grid-template-columns':\n smartGrid.numberOfColumn !== undefined\n ? 'repeat(' + smartGrid.numberOfColumn + ', 1fr)'\n : '',\n }\">\n @for (row of smartGrid.gridModel.page.rows; track row.id) {\n\n <app-smart-grid-card class=\"smartGrid-card-container\" [ngClass]=\"calcClasses(row.style)\"\n [ngStyle]=\"calcStyle(row.style)\"\n [class.clickable-row]=\"isCardSelectable(row) || hasCardDefaultAction(row)\"\n [class.selected]=\"!!row.selected && !!rowLayoutOf(row)\"\n (click)=\"onCardClick(row)\" (dblclick)=\"onCardDoubleClick(row)\" [item]=\"row\"\n [layout]=\"rowLayoutOf(row)\" [smartGrid]=\"smartGrid\"\n [parentLayoutComponent]=\"parentLayoutComponent()\"></app-smart-grid-card>\n }\n </div>\n }\n @if (smartGrid.layoutDef === layoutDef().TREE && treeControl) {\n <div class=\"tree-container\" [ngStyle]=\"{\n 'grid-template-columns':\n smartGrid.numberOfColumn !== undefined\n ? 'repeat(' + smartGrid.numberOfColumn + ', 1fr)'\n : '',\n }\">\n <mat-tree [dataSource]=\"treeDataSource!\" [treeControl]=\"treeControl!\">\n <mat-tree-node *matTreeNodeDef=\"let node\" matTreeNodeToggle matTreeNodePadding matTreeNodePaddingIndent=\"24\">\n <button mat-icon-button disabled class=\"tree-button\"></button>\n <mat-checkbox class=\"checklist-leaf-node\"\n [checked]=\"$safeNavigationMigration(treeChecklistSelection?.isSelected(node))\"\n (change)=\"treeNodeSelectionToggle(node)\">{{ getTreeItem(node) }}</mat-checkbox>\n </mat-tree-node>\n <mat-tree-node *matTreeNodeDef=\"let node; when: hasChild\" matTreeNodePadding matTreeNodePaddingIndent=\"24\">\n <button mat-icon-button matTreeNodeToggle class=\"tree-button\" [attr.aria-label]=\"'Toggle ' + node.item\">\n <mat-icon class=\"mat-icon-rtl-mirror\">\n {{ treeControl!.isExpanded(node) ? 'expand_more' : 'chevron_right' }}\n </mat-icon>\n </button>\n <mat-checkbox [checked]=\"$safeNavigationMigration(treeChecklistSelection?.isSelected(node))\"\n [indeterminate]=\"descendantsPartiallySelected(node)\" (change)=\"treeNodeSelectionToggle(node)\">{{\n getTreeItem(node) }}</mat-checkbox>\n </mat-tree-node>\n </mat-tree>\n </div>\n }\n </div>\n @if (smartGrid.paginator) {\n <div class=\"paginator-row-material\">\n @if (smartGrid.gridModel.refreshEnabled) {\n <button mat-icon-button type=\"button\" matTooltip=\"Friss\u00EDt\u00E9s\" (click)=\"refreshPartialResults()\">\n <mat-icon>refresh</mat-icon>\n </button>\n }\n @if (smartGrid.paginator && !treeControl) {\n <mat-paginator #paginator [length]=\"length\" [pageIndex]=\"pageIndex\" [pageSize]=\"pageSize\"\n [pageSizeOptions]=\"pageSizeOptions\" (page)=\"onChangePage($event)\"></mat-paginator>\n }\n </div>\n }\n</div>\n}", styles: [".smartGrid-container{position:relative;padding:1.5rem;display:flex;flex-direction:column;gap:1rem}.smartGrid-data-number{padding-bottom:1rem}.cards-container{display:grid;gap:1rem;padding:1rem}.smartGrid-container ::ng-deep .mat-form-field-appearance-legacy .mat-form-field-underline{bottom:0}.smartGridContent{width:100%;flex:1;overflow:auto}.blocked{position:absolute;width:calc(100% - 3rem);height:calc(100% - 3rem);z-index:110;background-color:#0003}.smart-grid-table-container{display:flex;flex-direction:column;gap:1rem}.smart-grid-toolbar{display:flex;flex-direction:row;justify-content:flex-end;align-items:center}.smart-grid-toolbar smart-ui-action-toolbar{width:100%}.smart-grid-edit-icon{color:var(--light-gray)}.tree-button{width:24px!important;height:24px!important}.paginator-row-material{display:flex;align-items:center;align-self:flex-end;gap:.25rem}.clickable-row{cursor:pointer}.smartGrid-card-container.selected{outline:2px solid var(--mat-sys-primary, currentColor)}\n"], dependencies: [{ kind: "component", type: UiActionToolbarComponent, selector: "smart-ui-action-toolbar", inputs: ["uiActionModels", "uiActionDescriptorService", "id", "executor", "widgetId", "nodeId", "actionParams", "scrollOnWrap", "toolbarPropertes"] }, { kind: "component", type: UiActionButtonComponent, selector: "ui-action-button", inputs: ["disabled", "descriptor", "code", "identifier", "viewActivated", "addedCssClass", "addBasicClasses", "iconPlaceholder"], outputs: ["actionClick", "actionDoubleClick"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: ExpandableSectionComponent, selector: "smart-expandable-section", inputs: ["data", "index"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: SmartGridCardComponent, selector: "app-smart-grid-card", inputs: ["item", "smartGrid", "parentLayoutComponent", "layout"] }, { kind: "component", type: MatTree, selector: "mat-tree", exportAs: ["matTree"] }, { kind: "directive", type: MatTreeNodeDef, selector: "[matTreeNodeDef]", inputs: ["matTreeNodeDefWhen", "matTreeNode"] }, { kind: "directive", type: MatTreeNode, selector: "mat-tree-node", inputs: ["tabIndex", "disabled"], outputs: ["activation", "expandedChange"], exportAs: ["matTreeNode"] }, { kind: "directive", type: MatTreeNodeToggle, selector: "[matTreeNodeToggle]", inputs: ["matTreeNodeToggleRecursive"] }, { kind: "directive", type: MatTreeNodePadding, selector: "[matTreeNodePadding]", inputs: ["matTreeNodePadding", "matTreeNodePaddingIndent"] }, { kind: "component", type: MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "aria-expanded", "aria-controls", "aria-owns", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "directive", type: MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: MatPaginator, selector: "mat-paginator", inputs: ["color", "pageIndex", "length", "pageSize", "pageSizeOptions", "hidePageSize", "showFirstLastButtons", "selectConfig", "disabled"], outputs: ["page"], exportAs: ["matPaginator"] }] }); }
19820
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "22.0.8", type: SmartGridComponent, isStandalone: true, selector: "smart-grid", inputs: { smartGrid: { classPropertyName: "smartGrid", publicName: "smartGrid", isSignal: false, isRequired: false, transformFunction: null }, uuid: { classPropertyName: "uuid", publicName: "uuid", isSignal: false, isRequired: false, transformFunction: null }, parentLayoutComponent: { classPropertyName: "parentLayoutComponent", publicName: "parentLayoutComponent", isSignal: true, isRequired: false, transformFunction: null }, dev: { classPropertyName: "dev", publicName: "dev", isSignal: true, isRequired: false, transformFunction: null } }, host: { properties: { "attr.data-testid": "this.testId" } }, providers: [SmartGridService], viewQueries: [{ propertyName: "vcRefTable", first: true, predicate: ["table"], descendants: true, read: ViewContainerRef }, { propertyName: "cardDefaultActionsMenu", first: true, predicate: DefaultActionsPopupComponent, descendants: true }, { propertyName: "expandedRowsComps", predicate: ExpandedRowRendererComponent, descendants: true }], usesOnChanges: true, ngImport: i0, template: "@if (smartGrid) {\n<div class=\"smartGrid-container\">\n <div class=\"smart-grid-toolbar\">\n <smart-ui-action-toolbar [id]=\"toolbarId\"></smart-ui-action-toolbar>\n @if (smartGrid.showEditColumns) {\n <ui-action-button (actionClick)=\"editColumns()\" [descriptor]=\"showEditColumns\">\n </ui-action-button>\n }\n </div>\n <!-- <div [ngClass]=\"isBlocked ? 'blocked' : ''\"></div> -->\n <div class=\"smartGridContent\">\n <div>\n @if (smartGrid.showResultCount) {\n <div>\n <div class=\"smartGrid-data-number\">\n {{ smartGrid.gridModel.totalRowCount }}\n </div>\n </div>\n }\n </div>\n <div class=\"smart-grid-table-container\">\n <ng-template #table></ng-template>\n </div>\n @if (smartGrid.layoutDef === layoutDef().EXPANDABLE) {\n <div>\n @for (expandableSection of expandableSections; track expandableSection) {\n <smart-expandable-section #gridExpandableSection [data]=\"expandableSection\"></smart-expandable-section>\n }\n </div>\n }\n @if (smartGrid.layoutDef === layoutDef().CARD && smartGrid.dataLayoutDef) {\n <div class=\"cards-container\" [ngStyle]=\"{\n 'grid-template-columns':\n smartGrid.numberOfColumn !== undefined\n ? 'repeat(' + smartGrid.numberOfColumn + ', 1fr)'\n : '',\n }\">\n @for (row of smartGrid.gridModel.page.rows; track row.id) {\n\n <app-smart-grid-card class=\"smartGrid-card-container\" [ngClass]=\"calcClasses(row.style)\"\n [ngStyle]=\"calcStyle(row.style)\"\n [class.clickable-row]=\"isCardSelectable(row) || hasCardDefaultAction(row)\"\n [class.selected]=\"!!row.selected && !!rowLayoutOf(row)\"\n (click)=\"onCardClick(row, $event)\" (dblclick)=\"onCardDoubleClick(row, $event)\" [item]=\"row\"\n [layout]=\"rowLayoutOf(row)\" [smartGrid]=\"smartGrid\"\n [parentLayoutComponent]=\"parentLayoutComponent()\"></app-smart-grid-card>\n }\n @if (cardMenuRow(); as menuRow) {\n <lib-default-actions-popup [buttons]=\"cardMenuButtons()\" [row]=\"menuRow\"></lib-default-actions-popup>\n }\n </div>\n }\n @if (smartGrid.layoutDef === layoutDef().TREE && treeControl) {\n <div class=\"tree-container\" [ngStyle]=\"{\n 'grid-template-columns':\n smartGrid.numberOfColumn !== undefined\n ? 'repeat(' + smartGrid.numberOfColumn + ', 1fr)'\n : '',\n }\">\n <mat-tree [dataSource]=\"treeDataSource!\" [treeControl]=\"treeControl!\">\n <mat-tree-node *matTreeNodeDef=\"let node\" matTreeNodeToggle matTreeNodePadding matTreeNodePaddingIndent=\"24\">\n <button mat-icon-button disabled class=\"tree-button\"></button>\n <mat-checkbox class=\"checklist-leaf-node\"\n [checked]=\"$safeNavigationMigration(treeChecklistSelection?.isSelected(node))\"\n (change)=\"treeNodeSelectionToggle(node)\">{{ getTreeItem(node) }}</mat-checkbox>\n </mat-tree-node>\n <mat-tree-node *matTreeNodeDef=\"let node; when: hasChild\" matTreeNodePadding matTreeNodePaddingIndent=\"24\">\n <button mat-icon-button matTreeNodeToggle class=\"tree-button\" [attr.aria-label]=\"'Toggle ' + node.item\">\n <mat-icon class=\"mat-icon-rtl-mirror\">\n {{ treeControl!.isExpanded(node) ? 'expand_more' : 'chevron_right' }}\n </mat-icon>\n </button>\n <mat-checkbox [checked]=\"$safeNavigationMigration(treeChecklistSelection?.isSelected(node))\"\n [indeterminate]=\"descendantsPartiallySelected(node)\" (change)=\"treeNodeSelectionToggle(node)\">{{\n getTreeItem(node) }}</mat-checkbox>\n </mat-tree-node>\n </mat-tree>\n </div>\n }\n </div>\n @if (smartGrid.paginator) {\n <div class=\"paginator-row-material\">\n @if (smartGrid.gridModel.refreshEnabled) {\n <button mat-icon-button type=\"button\" matTooltip=\"Friss\u00EDt\u00E9s\" (click)=\"refreshPartialResults()\">\n <mat-icon>refresh</mat-icon>\n </button>\n }\n @if (smartGrid.paginator && !treeControl) {\n <mat-paginator #paginator [length]=\"length\" [pageIndex]=\"pageIndex\" [pageSize]=\"pageSize\"\n [pageSizeOptions]=\"pageSizeOptions\" (page)=\"onChangePage($event)\"></mat-paginator>\n }\n </div>\n }\n</div>\n}", styles: [".smartGrid-container{position:relative;padding:1.5rem;display:flex;flex-direction:column;gap:1rem}.smartGrid-data-number{padding-bottom:1rem}.cards-container{display:grid;gap:1rem;padding:1rem}.smartGrid-container ::ng-deep .mat-form-field-appearance-legacy .mat-form-field-underline{bottom:0}.smartGridContent{width:100%;flex:1;overflow:auto}.blocked{position:absolute;width:calc(100% - 3rem);height:calc(100% - 3rem);z-index:110;background-color:#0003}.smart-grid-table-container{display:flex;flex-direction:column;gap:1rem}.smart-grid-toolbar{display:flex;flex-direction:row;justify-content:flex-end;align-items:center}.smart-grid-toolbar smart-ui-action-toolbar{width:100%}.smart-grid-edit-icon{color:var(--light-gray)}.tree-button{width:24px!important;height:24px!important}.paginator-row-material{display:flex;align-items:center;align-self:flex-end;gap:.25rem}.clickable-row{cursor:pointer}.smartGrid-card-container.selected{outline:2px solid var(--mat-sys-primary, currentColor)}\n"], dependencies: [{ kind: "component", type: UiActionToolbarComponent, selector: "smart-ui-action-toolbar", inputs: ["uiActionModels", "uiActionDescriptorService", "id", "executor", "widgetId", "nodeId", "actionParams", "scrollOnWrap", "toolbarPropertes"] }, { kind: "component", type: UiActionButtonComponent, selector: "ui-action-button", inputs: ["disabled", "descriptor", "code", "identifier", "viewActivated", "addedCssClass", "addBasicClasses", "iconPlaceholder"], outputs: ["actionClick", "actionDoubleClick"] }, { kind: "component", type: MatIcon, selector: "mat-icon", inputs: ["color", "inline", "svgIcon", "fontSet", "fontIcon"], exportAs: ["matIcon"] }, { kind: "component", type: ExpandableSectionComponent, selector: "smart-expandable-section", inputs: ["data", "index"] }, { kind: "directive", type: NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "directive", type: NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "component", type: SmartGridCardComponent, selector: "app-smart-grid-card", inputs: ["item", "smartGrid", "parentLayoutComponent", "layout"] }, { kind: "component", type: DefaultActionsPopupComponent, selector: "lib-default-actions-popup", inputs: ["buttons", "row", "colIdx"] }, { kind: "component", type: MatTree, selector: "mat-tree", exportAs: ["matTree"] }, { kind: "directive", type: MatTreeNodeDef, selector: "[matTreeNodeDef]", inputs: ["matTreeNodeDefWhen", "matTreeNode"] }, { kind: "directive", type: MatTreeNode, selector: "mat-tree-node", inputs: ["tabIndex", "disabled"], outputs: ["activation", "expandedChange"], exportAs: ["matTreeNode"] }, { kind: "directive", type: MatTreeNodeToggle, selector: "[matTreeNodeToggle]", inputs: ["matTreeNodeToggleRecursive"] }, { kind: "directive", type: MatTreeNodePadding, selector: "[matTreeNodePadding]", inputs: ["matTreeNodePadding", "matTreeNodePaddingIndent"] }, { kind: "component", type: MatIconButton, selector: "button[mat-icon-button], a[mat-icon-button], button[matIconButton], a[matIconButton]", exportAs: ["matButton", "matAnchor"] }, { kind: "component", type: MatCheckbox, selector: "mat-checkbox", inputs: ["aria-label", "aria-labelledby", "aria-describedby", "aria-expanded", "aria-controls", "aria-owns", "id", "required", "labelPosition", "name", "value", "disableRipple", "tabIndex", "color", "disabledInteractive", "checked", "disabled", "indeterminate"], outputs: ["change", "indeterminateChange"], exportAs: ["matCheckbox"] }, { kind: "directive", type: MatTooltip, selector: "[matTooltip]", inputs: ["matTooltipPosition", "matTooltipPositionAtOrigin", "matTooltipDisabled", "matTooltipShowDelay", "matTooltipHideDelay", "matTooltipTouchGestures", "matTooltip", "matTooltipClass"], exportAs: ["matTooltip"] }, { kind: "component", type: MatPaginator, selector: "mat-paginator", inputs: ["color", "pageIndex", "length", "pageSize", "pageSizeOptions", "hidePageSize", "showFirstLastButtons", "selectConfig", "disabled"], outputs: ["page"], exportAs: ["matPaginator"] }] }); }
19737
19821
  }
19738
19822
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImport: i0, type: SmartGridComponent, decorators: [{
19739
19823
  type: Component,
19740
- args: [{ selector: 'smart-grid', providers: [SmartGridService], imports: [UiActionToolbarComponent, UiActionButtonComponent, MatMiniFabButton, MatIcon, ExpandableSectionComponent, NgStyle, NgClass, SmartGridCardComponent, MatTree, MatTreeNodeDef, MatTreeNode, MatTreeNodeToggle, MatTreeNodePadding, MatIconButton, MatCheckbox, MatTooltip, MatPaginator], template: "@if (smartGrid) {\n<div class=\"smartGrid-container\">\n <div class=\"smart-grid-toolbar\">\n <smart-ui-action-toolbar [id]=\"toolbarId\"></smart-ui-action-toolbar>\n @if (smartGrid.showEditColumns) {\n <ui-action-button (actionClick)=\"editColumns()\" [descriptor]=\"showEditColumns\">\n </ui-action-button>\n }\n </div>\n <!-- <div [ngClass]=\"isBlocked ? 'blocked' : ''\"></div> -->\n <div class=\"smartGridContent\">\n <div>\n @if (smartGrid.showResultCount) {\n <div>\n <div class=\"smartGrid-data-number\">\n {{ smartGrid.gridModel.totalRowCount }}\n </div>\n </div>\n }\n </div>\n <div class=\"smart-grid-table-container\">\n <ng-template #table></ng-template>\n </div>\n @if (smartGrid.layoutDef === layoutDef().EXPANDABLE) {\n <div>\n @for (expandableSection of expandableSections; track expandableSection) {\n <smart-expandable-section #gridExpandableSection [data]=\"expandableSection\"></smart-expandable-section>\n }\n </div>\n }\n @if (smartGrid.layoutDef === layoutDef().CARD && smartGrid.dataLayoutDef) {\n <div class=\"cards-container\" [ngStyle]=\"{\n 'grid-template-columns':\n smartGrid.numberOfColumn !== undefined\n ? 'repeat(' + smartGrid.numberOfColumn + ', 1fr)'\n : '',\n }\">\n @for (row of smartGrid.gridModel.page.rows; track row.id) {\n\n <app-smart-grid-card class=\"smartGrid-card-container\" [ngClass]=\"calcClasses(row.style)\"\n [ngStyle]=\"calcStyle(row.style)\"\n [class.clickable-row]=\"isCardSelectable(row) || hasCardDefaultAction(row)\"\n [class.selected]=\"!!row.selected && !!rowLayoutOf(row)\"\n (click)=\"onCardClick(row)\" (dblclick)=\"onCardDoubleClick(row)\" [item]=\"row\"\n [layout]=\"rowLayoutOf(row)\" [smartGrid]=\"smartGrid\"\n [parentLayoutComponent]=\"parentLayoutComponent()\"></app-smart-grid-card>\n }\n </div>\n }\n @if (smartGrid.layoutDef === layoutDef().TREE && treeControl) {\n <div class=\"tree-container\" [ngStyle]=\"{\n 'grid-template-columns':\n smartGrid.numberOfColumn !== undefined\n ? 'repeat(' + smartGrid.numberOfColumn + ', 1fr)'\n : '',\n }\">\n <mat-tree [dataSource]=\"treeDataSource!\" [treeControl]=\"treeControl!\">\n <mat-tree-node *matTreeNodeDef=\"let node\" matTreeNodeToggle matTreeNodePadding matTreeNodePaddingIndent=\"24\">\n <button mat-icon-button disabled class=\"tree-button\"></button>\n <mat-checkbox class=\"checklist-leaf-node\"\n [checked]=\"$safeNavigationMigration(treeChecklistSelection?.isSelected(node))\"\n (change)=\"treeNodeSelectionToggle(node)\">{{ getTreeItem(node) }}</mat-checkbox>\n </mat-tree-node>\n <mat-tree-node *matTreeNodeDef=\"let node; when: hasChild\" matTreeNodePadding matTreeNodePaddingIndent=\"24\">\n <button mat-icon-button matTreeNodeToggle class=\"tree-button\" [attr.aria-label]=\"'Toggle ' + node.item\">\n <mat-icon class=\"mat-icon-rtl-mirror\">\n {{ treeControl!.isExpanded(node) ? 'expand_more' : 'chevron_right' }}\n </mat-icon>\n </button>\n <mat-checkbox [checked]=\"$safeNavigationMigration(treeChecklistSelection?.isSelected(node))\"\n [indeterminate]=\"descendantsPartiallySelected(node)\" (change)=\"treeNodeSelectionToggle(node)\">{{\n getTreeItem(node) }}</mat-checkbox>\n </mat-tree-node>\n </mat-tree>\n </div>\n }\n </div>\n @if (smartGrid.paginator) {\n <div class=\"paginator-row-material\">\n @if (smartGrid.gridModel.refreshEnabled) {\n <button mat-icon-button type=\"button\" matTooltip=\"Friss\u00EDt\u00E9s\" (click)=\"refreshPartialResults()\">\n <mat-icon>refresh</mat-icon>\n </button>\n }\n @if (smartGrid.paginator && !treeControl) {\n <mat-paginator #paginator [length]=\"length\" [pageIndex]=\"pageIndex\" [pageSize]=\"pageSize\"\n [pageSizeOptions]=\"pageSizeOptions\" (page)=\"onChangePage($event)\"></mat-paginator>\n }\n </div>\n }\n</div>\n}", styles: [".smartGrid-container{position:relative;padding:1.5rem;display:flex;flex-direction:column;gap:1rem}.smartGrid-data-number{padding-bottom:1rem}.cards-container{display:grid;gap:1rem;padding:1rem}.smartGrid-container ::ng-deep .mat-form-field-appearance-legacy .mat-form-field-underline{bottom:0}.smartGridContent{width:100%;flex:1;overflow:auto}.blocked{position:absolute;width:calc(100% - 3rem);height:calc(100% - 3rem);z-index:110;background-color:#0003}.smart-grid-table-container{display:flex;flex-direction:column;gap:1rem}.smart-grid-toolbar{display:flex;flex-direction:row;justify-content:flex-end;align-items:center}.smart-grid-toolbar smart-ui-action-toolbar{width:100%}.smart-grid-edit-icon{color:var(--light-gray)}.tree-button{width:24px!important;height:24px!important}.paginator-row-material{display:flex;align-items:center;align-self:flex-end;gap:.25rem}.clickable-row{cursor:pointer}.smartGrid-card-container.selected{outline:2px solid var(--mat-sys-primary, currentColor)}\n"] }]
19824
+ args: [{ selector: 'smart-grid', providers: [SmartGridService], imports: [UiActionToolbarComponent, UiActionButtonComponent, MatMiniFabButton, MatIcon, ExpandableSectionComponent, NgStyle, NgClass, SmartGridCardComponent, DefaultActionsPopupComponent, MatTree, MatTreeNodeDef, MatTreeNode, MatTreeNodeToggle, MatTreeNodePadding, MatIconButton, MatCheckbox, MatTooltip, MatPaginator], template: "@if (smartGrid) {\n<div class=\"smartGrid-container\">\n <div class=\"smart-grid-toolbar\">\n <smart-ui-action-toolbar [id]=\"toolbarId\"></smart-ui-action-toolbar>\n @if (smartGrid.showEditColumns) {\n <ui-action-button (actionClick)=\"editColumns()\" [descriptor]=\"showEditColumns\">\n </ui-action-button>\n }\n </div>\n <!-- <div [ngClass]=\"isBlocked ? 'blocked' : ''\"></div> -->\n <div class=\"smartGridContent\">\n <div>\n @if (smartGrid.showResultCount) {\n <div>\n <div class=\"smartGrid-data-number\">\n {{ smartGrid.gridModel.totalRowCount }}\n </div>\n </div>\n }\n </div>\n <div class=\"smart-grid-table-container\">\n <ng-template #table></ng-template>\n </div>\n @if (smartGrid.layoutDef === layoutDef().EXPANDABLE) {\n <div>\n @for (expandableSection of expandableSections; track expandableSection) {\n <smart-expandable-section #gridExpandableSection [data]=\"expandableSection\"></smart-expandable-section>\n }\n </div>\n }\n @if (smartGrid.layoutDef === layoutDef().CARD && smartGrid.dataLayoutDef) {\n <div class=\"cards-container\" [ngStyle]=\"{\n 'grid-template-columns':\n smartGrid.numberOfColumn !== undefined\n ? 'repeat(' + smartGrid.numberOfColumn + ', 1fr)'\n : '',\n }\">\n @for (row of smartGrid.gridModel.page.rows; track row.id) {\n\n <app-smart-grid-card class=\"smartGrid-card-container\" [ngClass]=\"calcClasses(row.style)\"\n [ngStyle]=\"calcStyle(row.style)\"\n [class.clickable-row]=\"isCardSelectable(row) || hasCardDefaultAction(row)\"\n [class.selected]=\"!!row.selected && !!rowLayoutOf(row)\"\n (click)=\"onCardClick(row, $event)\" (dblclick)=\"onCardDoubleClick(row, $event)\" [item]=\"row\"\n [layout]=\"rowLayoutOf(row)\" [smartGrid]=\"smartGrid\"\n [parentLayoutComponent]=\"parentLayoutComponent()\"></app-smart-grid-card>\n }\n @if (cardMenuRow(); as menuRow) {\n <lib-default-actions-popup [buttons]=\"cardMenuButtons()\" [row]=\"menuRow\"></lib-default-actions-popup>\n }\n </div>\n }\n @if (smartGrid.layoutDef === layoutDef().TREE && treeControl) {\n <div class=\"tree-container\" [ngStyle]=\"{\n 'grid-template-columns':\n smartGrid.numberOfColumn !== undefined\n ? 'repeat(' + smartGrid.numberOfColumn + ', 1fr)'\n : '',\n }\">\n <mat-tree [dataSource]=\"treeDataSource!\" [treeControl]=\"treeControl!\">\n <mat-tree-node *matTreeNodeDef=\"let node\" matTreeNodeToggle matTreeNodePadding matTreeNodePaddingIndent=\"24\">\n <button mat-icon-button disabled class=\"tree-button\"></button>\n <mat-checkbox class=\"checklist-leaf-node\"\n [checked]=\"$safeNavigationMigration(treeChecklistSelection?.isSelected(node))\"\n (change)=\"treeNodeSelectionToggle(node)\">{{ getTreeItem(node) }}</mat-checkbox>\n </mat-tree-node>\n <mat-tree-node *matTreeNodeDef=\"let node; when: hasChild\" matTreeNodePadding matTreeNodePaddingIndent=\"24\">\n <button mat-icon-button matTreeNodeToggle class=\"tree-button\" [attr.aria-label]=\"'Toggle ' + node.item\">\n <mat-icon class=\"mat-icon-rtl-mirror\">\n {{ treeControl!.isExpanded(node) ? 'expand_more' : 'chevron_right' }}\n </mat-icon>\n </button>\n <mat-checkbox [checked]=\"$safeNavigationMigration(treeChecklistSelection?.isSelected(node))\"\n [indeterminate]=\"descendantsPartiallySelected(node)\" (change)=\"treeNodeSelectionToggle(node)\">{{\n getTreeItem(node) }}</mat-checkbox>\n </mat-tree-node>\n </mat-tree>\n </div>\n }\n </div>\n @if (smartGrid.paginator) {\n <div class=\"paginator-row-material\">\n @if (smartGrid.gridModel.refreshEnabled) {\n <button mat-icon-button type=\"button\" matTooltip=\"Friss\u00EDt\u00E9s\" (click)=\"refreshPartialResults()\">\n <mat-icon>refresh</mat-icon>\n </button>\n }\n @if (smartGrid.paginator && !treeControl) {\n <mat-paginator #paginator [length]=\"length\" [pageIndex]=\"pageIndex\" [pageSize]=\"pageSize\"\n [pageSizeOptions]=\"pageSizeOptions\" (page)=\"onChangePage($event)\"></mat-paginator>\n }\n </div>\n }\n</div>\n}", styles: [".smartGrid-container{position:relative;padding:1.5rem;display:flex;flex-direction:column;gap:1rem}.smartGrid-data-number{padding-bottom:1rem}.cards-container{display:grid;gap:1rem;padding:1rem}.smartGrid-container ::ng-deep .mat-form-field-appearance-legacy .mat-form-field-underline{bottom:0}.smartGridContent{width:100%;flex:1;overflow:auto}.blocked{position:absolute;width:calc(100% - 3rem);height:calc(100% - 3rem);z-index:110;background-color:#0003}.smart-grid-table-container{display:flex;flex-direction:column;gap:1rem}.smart-grid-toolbar{display:flex;flex-direction:row;justify-content:flex-end;align-items:center}.smart-grid-toolbar smart-ui-action-toolbar{width:100%}.smart-grid-edit-icon{color:var(--light-gray)}.tree-button{width:24px!important;height:24px!important}.paginator-row-material{display:flex;align-items:center;align-self:flex-end;gap:.25rem}.clickable-row{cursor:pointer}.smartGrid-card-container.selected{outline:2px solid var(--mat-sys-primary, currentColor)}\n"] }]
19741
19825
  }], ctorParameters: () => [], propDecorators: { smartGrid: [{
19742
19826
  type: Input
19743
19827
  }], uuid: [{
@@ -19751,6 +19835,9 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
19751
19835
  }], expandedRowsComps: [{
19752
19836
  type: ViewChildren,
19753
19837
  args: [ExpandedRowRendererComponent]
19838
+ }], cardDefaultActionsMenu: [{
19839
+ type: ViewChild,
19840
+ args: [DefaultActionsPopupComponent]
19754
19841
  }] } });
19755
19842
 
19756
19843
  /*
@@ -24754,5 +24841,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
24754
24841
  * Generated bundle index. Do not edit.
24755
24842
  */
24756
24843
 
24757
- export { ACLEntry, APIS$5 as APIS, AclEditingViewComponent, ApiQueueService, BASE_PATH$7 as BASE_PATH, COLLECTION_FORMATS$7 as COLLECTION_FORMATS, CUSTOM_DIAGRAM_OPTIONS, CloseResult, ComponentFactoryService, ComponentType, ComponentWidgetType, Configuration$7 as Configuration, DEFAULT_ROW_LAYOUT, DIALOG_DISABLE_CLOSE, DataChangeKind, DefaultChartOptionsProvider, DefaultUiActionCode_CLOSE, DrawTime, EMPTY_PARAMS, ExpandableSectionButtonIconPosition, ExpandableSectionButtonType, ExpandableSectionComponent, FilterExpressionBoolOperator$1 as FilterExpressionBoolOperator, FilterExpressionBuilderGroupBuilderGroupKindEnum, FilterExpressionBuilderUiModelTypeEnum, FilterExpressionDataType, FilterExpressionFieldWidgetType, FilterExpressionOperation, FilterExpressionOrderByOrderEnum, GenericPageComponent, GeoMapDataLoadingMode, GeoMapDataSourceType, GeoMapItemKind, GeoMapOperationMode, GeoMapSelectionMode, GeoMapTextType, GridColumnContentType, GridDataAccessConfigKindEnum, GridSelectionMode, GridSelectionType, GridUiActionType, GridViewDescriptorKindEnum, HighlightPipe, IS_ASYNC_PARAM_NAME, IconPosition, ImageResourceKindEnum, InvalidSmartlinkComponent, LayoutDirection, LinkTargetEnum, MAP_ENGINE, MapEngine, MenuOpenDirection, MenuTriggerType, MessageOptionType, MessageTextType, MessageType, NAMED_VALIDATOR, NamedValidatorOperationEnum, NamedValidatorService, NoPermissionPageComponent, REUSE_ROUTER_SLOT_COMPONENT, ROOT_CONTAINER_UUID, ROUTER_SLOT_ID, RecordingUploaderPropertiesOpenDirectionEnum, SMART_DATE_FORMATS, SMART_DEFAULT_VIEW_COMPONENTS, SMART_NG_CLIENT_CONFIG, SMART_ROW_LAYOUT_COMPONENT, SearchPageComponent, SelectionDefinitionTypeEnum, SelectionDefinitionValueSetValueTypeEnum, ServerRequestType, SessionAPIS, SessionErrorBehaviour, SessionService, SmartActionHost, SmartActionType, SmartBackendBootstrapService, SmartComponent, SmartComponentApiClient, SmartComponentDetachedDirective, SmartComponentHost, SmartComponentLayoutComponent, SmartDateFnsAdapter, SmartDatePipe, SmartDateTimePipe, SmartDefaultErrorUiService, SmartDiagramComponent, SmartDialog, SmartEmbeddedSlotDirective, SmartExpandableSectionService, SmartFileEditorComponent, SmartFilterComponent, SmartFilterEditorContentComponent, SmartFilterEditorService, SmartFilterExpressionFieldComponent, SmartFilterPosition, SmartFilterType, SmartFilterWidgetComponent, SmartFormInputMode, SmartFormTextFieldButtonIconPosition, SmartFormWidgetDirection, SmartFormWidgetType, SmartFormWidgetWidth, SmartGridButtonType, SmartGridComponent, SmartGridDataLayout, SmartGridService, SmartGridType, SmartIconComponent, SmartIconService, SmartLayoutDef, SmartLinkChannelVariableInPath, SmartLinkMigrationStatusStatusEnum, SmartLinkUuidVariableInPath, SmartMapComponent, SmartMultiFileEditorComponent, SmartNavbarComponent, SmartNavbarService, SmartNavigationService, SmartNgClientFeatureKind, SmartService, SmartSessionService, SmartSessionTimerComponent, SmartTable, SmartTableButtonType, SmartTableHeaderPropertyType, SmartTableInterfaceTypeEnum, SmartTableOptionButtonDirection, SmartTableOrder, SmartTableType, SmartTimePipe, SmartTooltipDirective, SmartTreeComponent, SmartTreeNodeButtonType, SmartUserSettinsIconPosition, SmartValidatorName, SmartViewContextService, SmartViewRedirect, SmartVoiceRecorderComponent, SmartWidgetHintPosition, SmartWidgetHintPositionEnum, SmartdialogService, SmartfileuploaderComponent, SmartformComponent, SmartformLayoutDefinitionService, SmarttreeGenericService, SmarttreeService, SubjectSelectorComponent, ThemeService, ToggleLabelPosition, ToolbarAlignment, ToolbarDirection, TreeArrowPosition, USE_ADVANCED_FILTER, UiActionButtonComponent, UiActionButtonType, UiActionConfirmDialogService, UiActionDescriptorService, UiActionDialogButtonComponent, UiActionDialogType, UiActionFeedbackType, UiActionInputDialogService, UiActionInputType, UiActionService, UiActionToolbarComponent, UiActionTooltipTooltipPositionEnum, UiBadgeComponent, UiBadgeDirective, UploadWidgetType, ValidationResultPageComponent, ValueChangeMode, ViewContextRebuiltError, ViewEventHandlerViewEventTypeEnum, ViewService, ViewState, ViewType, barChart, bubbleChart, createBasicOptions, doughnutChart, horizontalBarChart, horizontalStackedBarChart, injectSmartComponent, multiAxisLineChart, pieChart, polarAreaChart, provideSmartNgClient, radarChart, registerSmartWidget, resolveDateLocale, resolveSlot, resolveSmartNgClientConfig, resolveViewHandler, scatterChart, stackedBarChart, transformDataToBarLikeDataSet, transformDataToBasicDataSets, transformDataToBubble, transformDataToScatter, withSmartDiagram, withSmartMap };
24844
+ export { ACLEntry, APIS$5 as APIS, AclEditingViewComponent, ApiQueueService, BASE_PATH$7 as BASE_PATH, COLLECTION_FORMATS$7 as COLLECTION_FORMATS, CUSTOM_DIAGRAM_OPTIONS, CloseResult, ComponentFactoryService, ComponentType, ComponentWidgetType, Configuration$7 as Configuration, DEFAULT_ROW_LAYOUT, DIALOG_DISABLE_CLOSE, DataChangeKind, DefaultChartOptionsProvider, DefaultUiActionCode_CLOSE, DrawTime, EMPTY_PARAMS, ExpandableSectionButtonIconPosition, ExpandableSectionButtonType, ExpandableSectionComponent, FilterExpressionBoolOperator$1 as FilterExpressionBoolOperator, FilterExpressionBuilderGroupBuilderGroupKindEnum, FilterExpressionBuilderUiModelTypeEnum, FilterExpressionDataType, FilterExpressionFieldWidgetType, FilterExpressionOperation, FilterExpressionOrderByOrderEnum, GenericPageComponent, GeoMapDataLoadingMode, GeoMapDataSourceType, GeoMapItemKind, GeoMapOperationMode, GeoMapSelectionMode, GeoMapTextType, GridColumnContentType, GridDataAccessConfigKindEnum, GridDefaultRowActionTrigger, GridSelectionMode, GridSelectionType, GridUiActionType, GridViewDescriptorKindEnum, HighlightPipe, IS_ASYNC_PARAM_NAME, IconPosition, ImageResourceKindEnum, InvalidSmartlinkComponent, LayoutDirection, LinkTargetEnum, MAP_ENGINE, MapEngine, MenuOpenDirection, MenuTriggerType, MessageOptionType, MessageTextType, MessageType, NAMED_VALIDATOR, NamedValidatorOperationEnum, NamedValidatorService, NoPermissionPageComponent, REUSE_ROUTER_SLOT_COMPONENT, ROOT_CONTAINER_UUID, ROUTER_SLOT_ID, RecordingUploaderPropertiesOpenDirectionEnum, SMART_DATE_FORMATS, SMART_DEFAULT_VIEW_COMPONENTS, SMART_NG_CLIENT_CONFIG, SMART_ROW_LAYOUT_COMPONENT, SearchPageComponent, SelectionDefinitionTypeEnum, SelectionDefinitionValueSetValueTypeEnum, ServerRequestType, SessionAPIS, SessionErrorBehaviour, SessionService, SmartActionHost, SmartActionType, SmartBackendBootstrapService, SmartComponent, SmartComponentApiClient, SmartComponentDetachedDirective, SmartComponentHost, SmartComponentLayoutComponent, SmartDateFnsAdapter, SmartDatePipe, SmartDateTimePipe, SmartDefaultErrorUiService, SmartDiagramComponent, SmartDialog, SmartEmbeddedSlotDirective, SmartExpandableSectionService, SmartFileEditorComponent, SmartFilterComponent, SmartFilterEditorContentComponent, SmartFilterEditorService, SmartFilterExpressionFieldComponent, SmartFilterPosition, SmartFilterType, SmartFilterWidgetComponent, SmartFormInputMode, SmartFormTextFieldButtonIconPosition, SmartFormWidgetDirection, SmartFormWidgetType, SmartFormWidgetWidth, SmartGridButtonType, SmartGridComponent, SmartGridDataLayout, SmartGridService, SmartGridType, SmartIconComponent, SmartIconService, SmartLayoutDef, SmartLinkChannelVariableInPath, SmartLinkMigrationStatusStatusEnum, SmartLinkUuidVariableInPath, SmartMapComponent, SmartMultiFileEditorComponent, SmartNavbarComponent, SmartNavbarService, SmartNavigationService, SmartNgClientFeatureKind, SmartService, SmartSessionService, SmartSessionTimerComponent, SmartTable, SmartTableButtonType, SmartTableHeaderPropertyType, SmartTableInterfaceTypeEnum, SmartTableOptionButtonDirection, SmartTableOrder, SmartTableType, SmartTimePipe, SmartTooltipDirective, SmartTreeComponent, SmartTreeNodeButtonType, SmartUserSettinsIconPosition, SmartValidatorName, SmartViewContextService, SmartViewRedirect, SmartVoiceRecorderComponent, SmartWidgetHintPosition, SmartWidgetHintPositionEnum, SmartdialogService, SmartfileuploaderComponent, SmartformComponent, SmartformLayoutDefinitionService, SmarttreeGenericService, SmarttreeService, SubjectSelectorComponent, ThemeService, ToggleLabelPosition, ToolbarAlignment, ToolbarDirection, TreeArrowPosition, USE_ADVANCED_FILTER, UiActionButtonComponent, UiActionButtonType, UiActionConfirmDialogService, UiActionDescriptorService, UiActionDialogButtonComponent, UiActionDialogType, UiActionFeedbackType, UiActionInputDialogService, UiActionInputType, UiActionService, UiActionToolbarComponent, UiActionTooltipTooltipPositionEnum, UiBadgeComponent, UiBadgeDirective, UploadWidgetType, ValidationResultPageComponent, ValueChangeMode, ViewContextRebuiltError, ViewEventHandlerViewEventTypeEnum, ViewService, ViewState, ViewType, barChart, bubbleChart, createBasicOptions, doughnutChart, horizontalBarChart, horizontalStackedBarChart, injectSmartComponent, multiAxisLineChart, pieChart, polarAreaChart, provideSmartNgClient, radarChart, registerSmartWidget, resolveDateLocale, resolveSlot, resolveSmartNgClientConfig, resolveViewHandler, scatterChart, stackedBarChart, transformDataToBarLikeDataSet, transformDataToBasicDataSets, transformDataToBubble, transformDataToScatter, withSmartDiagram, withSmartMap };
24758
24845
  //# sourceMappingURL=smartbit4all-ng-client.mjs.map