@smartbit4all/ng-client 7.2.1 → 7.2.3

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
 
@@ -5309,7 +5309,9 @@ class UiActionService {
5309
5309
  code: uiAction.code,
5310
5310
  path: uiAction.path,
5311
5311
  identifier: uiAction.identifier,
5312
- params: uiAction.params ?? {},
5312
+ // A copy: the executor's model is written into it below, and that model may hold this
5313
+ // very action (the filter editor's `possibleActions`) — a shared instance closes a cycle.
5314
+ params: { ...uiAction.params },
5313
5315
  };
5314
5316
  // submit: validate before sending, the embedded views' forms included. The model itself
5315
5317
  // travels by model sync whatever the flags say; the deprecated `model` flag only keeps
@@ -11621,6 +11623,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "22.0.8", ngImpor
11621
11623
  class SmartformComponent {
11622
11624
  constructor() {
11623
11625
  this.service = inject(SmartFormService);
11626
+ this.changeDetector = inject(ChangeDetectorRef);
11624
11627
  this._destroy$ = new Subject();
11625
11628
  this.originalWidgets = [];
11626
11629
  this.sophisticatedValueChange = new Subject();
@@ -11746,6 +11749,8 @@ class SmartformComponent {
11746
11749
  this.form = this.service.toFormGroup();
11747
11750
  this.syncClientBindings();
11748
11751
  this.service.widgetsChanged();
11752
+ // A form whose widgets were all hidden has no child to mark it for check.
11753
+ this.changeDetector.markForCheck();
11749
11754
  }
11750
11755
  ngOnDestroy() {
11751
11756
  if (this.followsClient) {