wuic-framework-lib 1.7.12 → 1.7.14
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/{wuic-framework-lib-chart-list.component-C9rj-6-8.mjs → wuic-framework-lib-chart-list.component-BEps71hL.mjs} +4 -2
- package/fesm2022/{wuic-framework-lib-code-editor.component-CTI_gqvB.mjs → wuic-framework-lib-code-editor.component-c3x1X5O9.mjs} +2 -2
- package/fesm2022/{wuic-framework-lib-designer.component-67PCnDYC.mjs → wuic-framework-lib-designer.component-CXHYNEm5.mjs} +4 -2
- package/fesm2022/{wuic-framework-lib-first-run-wizard.component-Bg41Xfht.mjs → wuic-framework-lib-first-run-wizard.component-Hw4IM3po.mjs} +2 -2
- package/fesm2022/{wuic-framework-lib-framework-docs.component-BLxQmoDZ.mjs → wuic-framework-lib-framework-docs.component-BIULbCaM.mjs} +682 -141
- package/fesm2022/{wuic-framework-lib-pivot-builder.component-Dg-xWzxO.mjs → wuic-framework-lib-pivot-builder.component-DP60RcD5.mjs} +5 -2
- package/fesm2022/{wuic-framework-lib-prompt-dialog-fallback-host.component-BB0AhnsE.mjs → wuic-framework-lib-prompt-dialog-fallback-host.component-DysV00wF.mjs} +2 -2
- package/fesm2022/{wuic-framework-lib-report-designer.component-9_M4MA2p.mjs → wuic-framework-lib-report-designer.component-Cn3pUy16.mjs} +2 -2
- package/fesm2022/{wuic-framework-lib-report-scaffold-dialog.component-BsKSP1Dk.mjs → wuic-framework-lib-report-scaffold-dialog.component-DdRrsp8w.mjs} +2 -2
- package/fesm2022/{wuic-framework-lib-report-viewer.component-C5EAoGOx.mjs → wuic-framework-lib-report-viewer.component-m-ianUWE.mjs} +2 -2
- package/fesm2022/{wuic-framework-lib-scene3d-designer.component-CkoU_J5j.mjs → wuic-framework-lib-scene3d-designer.component-DtFyJ3QF.mjs} +3 -3
- package/fesm2022/{wuic-framework-lib-scene3d-light-baker-gpu-CjTKHG3s.mjs → wuic-framework-lib-scene3d-light-baker-gpu-I1Bidwkn.mjs} +2 -2
- package/fesm2022/{wuic-framework-lib-scene3d-viewer.component-Dt0fvwFX.mjs → wuic-framework-lib-scene3d-viewer.component-B7uh74v4.mjs} +2 -2
- package/fesm2022/{wuic-framework-lib-scheduler-list.component-CEMQJrsN.mjs → wuic-framework-lib-scheduler-list.component-B6lWGWEd.mjs} +24 -16
- package/fesm2022/{wuic-framework-lib-spreadsheet-list-sf.component-Cgmf9tb1.mjs → wuic-framework-lib-spreadsheet-list-sf.component-Bpxi8la8.mjs} +4 -2
- package/fesm2022/{wuic-framework-lib-timeline-list.component-B_bRKY_H.mjs → wuic-framework-lib-timeline-list.component-DsvQ8Wro.mjs} +6 -4
- package/fesm2022/{wuic-framework-lib-workflow-designer.component-DVEL_aHg.mjs → wuic-framework-lib-workflow-designer.component-DCQE7JQz.mjs} +2 -2
- package/fesm2022/{wuic-framework-lib-wuic-framework-lib-Ds_oD2In.mjs → wuic-framework-lib-wuic-framework-lib-BlysiZLp.mjs} +340 -41
- package/fesm2022/wuic-framework-lib.mjs +1 -1
- package/package.json +1 -1
- package/types/wuic-framework-lib.d.ts +99 -3
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as i0 from '@angular/core';
|
|
2
|
-
import { Injectable, ApplicationRef, EnvironmentInjector, createComponent, NgModule, Component, createNgModule, inject, NgZone, ElementRef, Input, EventEmitter, Output, signal, HostBinding, ChangeDetectionStrategy, Pipe, ViewChild, forwardRef, HostListener, Optional, Directive, ViewChildren, computed, ViewContainerRef, ViewEncapsulation } from '@angular/core';
|
|
2
|
+
import { Injectable, ApplicationRef, EnvironmentInjector, createComponent, NgModule, Component, createNgModule, inject, NgZone, ElementRef, Input, EventEmitter, Output, DestroyRef, isDevMode, signal, HostBinding, ChangeDetectionStrategy, Pipe, ViewChild, forwardRef, HostListener, Optional, Directive, ViewChildren, computed, ViewContainerRef, ViewEncapsulation } from '@angular/core';
|
|
3
3
|
import { BehaviorSubject, firstValueFrom, Subject, combineLatest, catchError, EMPTY, throwError, Subscription } from 'rxjs';
|
|
4
4
|
import * as i1$2 from '@angular/router';
|
|
5
5
|
import { Router, NavigationEnd, NavigationStart, RouterModule, RouterLink } from '@angular/router';
|
|
@@ -180,6 +180,8 @@ const WuicErrorCodes = {
|
|
|
180
180
|
AuthCookieMalformed: 'errors.auth.cookie_malformed',
|
|
181
181
|
AuthOperationDisabled: 'errors.auth.operation_disabled',
|
|
182
182
|
AuthLoginFailed: 'errors.auth.login_failed',
|
|
183
|
+
// HTTP 403: richiesta sulle notifiche di un altro utente (NotificationsController).
|
|
184
|
+
AuthNotificationForbidden: 'errors.auth.notification_forbidden',
|
|
183
185
|
MetadataPropsBagMalformed: 'errors.metadata.props_bag.malformed',
|
|
184
186
|
MetadataRouteNotFound: 'errors.metadata.route.not_found',
|
|
185
187
|
MetadataRouteAmbiguousCase: 'errors.metadata.route.ambiguous_case',
|
|
@@ -202,6 +204,8 @@ const WuicErrorCodes = {
|
|
|
202
204
|
// Causa tipica lato client: chiavi con case diverso da `mc_nome_colonna`, che e'
|
|
203
205
|
// case-sensitive (es. `cityID` invece di `CityID`), o PK omessa dal payload.
|
|
204
206
|
CrudMissingKeyPredicate: 'errors.metaservice.crud.missing_key_predicate',
|
|
207
|
+
// Export rifiutato: tutti gli slot export occupati e la coda (maxQueuedExports) piena. HTTP 503.
|
|
208
|
+
ExportQueueFull: 'errors.metaservice.export.queue_full',
|
|
205
209
|
DbSqlException: 'errors.db.sql_exception', // passthrough — dialog dedicato
|
|
206
210
|
DbConnection: 'errors.db.connection',
|
|
207
211
|
DbTimeout: 'errors.db.timeout',
|
|
@@ -3418,7 +3422,7 @@ class WtoolboxService {
|
|
|
3418
3422
|
const appRef = resolvedInjector.get(ApplicationRef);
|
|
3419
3423
|
const environmentInjector = resolvedInjector.get(EnvironmentInjector);
|
|
3420
3424
|
const close$ = new Subject();
|
|
3421
|
-
const { PromptDialogFallbackHostComponent } = await import('./wuic-framework-lib-prompt-dialog-fallback-host.component-
|
|
3425
|
+
const { PromptDialogFallbackHostComponent } = await import('./wuic-framework-lib-prompt-dialog-fallback-host.component-DysV00wF.mjs');
|
|
3422
3426
|
const hostRef = createComponent(PromptDialogFallbackHostComponent, { environmentInjector });
|
|
3423
3427
|
hostRef.instance.datasource = dialogConfig?.data?.datasource;
|
|
3424
3428
|
hostRef.instance.header = String(dialogConfig?.header || '');
|
|
@@ -4743,6 +4747,8 @@ class WtoolboxService {
|
|
|
4743
4747
|
commit_level: "R",
|
|
4744
4748
|
use_column_captions: "C",
|
|
4745
4749
|
use_descriptive_fkey: true,
|
|
4750
|
+
// Colonne lookup di export e import: "key" | "description" | "both" (vince su use_descriptive_fkey).
|
|
4751
|
+
fkey_mode: "description",
|
|
4746
4752
|
separator: ";"
|
|
4747
4753
|
},
|
|
4748
4754
|
notifications: {
|
|
@@ -7697,6 +7703,10 @@ class MetadataProviderService {
|
|
|
7697
7703
|
static metatableColumnAuthRoute;
|
|
7698
7704
|
static metadataVersionInFlight;
|
|
7699
7705
|
static lastMetadataVersionCheckAtMs = 0;
|
|
7706
|
+
// Ultima versione letta dal backend: dentro la finestra di throttle si
|
|
7707
|
+
// restituisce questa (non `null`), cosi' ogni route confronta la propria
|
|
7708
|
+
// cache Dexie con la versione piu' recente nota.
|
|
7709
|
+
static lastKnownMetadataVersion = 0;
|
|
7700
7710
|
static minMetadataVersionIntervalMs = 5000;
|
|
7701
7711
|
static minReportListIntervalMs = 5000;
|
|
7702
7712
|
static reportListInFlightByRoute = new Map();
|
|
@@ -10565,9 +10575,9 @@ ${extraScope} ${suggestCallbackSanitized}
|
|
|
10565
10575
|
}
|
|
10566
10576
|
/**
|
|
10567
10577
|
* Recupera `ProjectMetadataVersion` dal backend solo quando la cache versione e scaduta;
|
|
10568
|
-
* usa `MetaService.getAppSettings
|
|
10578
|
+
* usa `MetaService.getAppSettings`, salva il timestamp in localStorage e la versione in memoria per ridurre chiamate ripetute.
|
|
10569
10579
|
* @param offsetMs Offset fuso client in millisecondi da riportare al backend.
|
|
10570
|
-
* @returns Versione metadata progetto corrente
|
|
10580
|
+
* @returns Versione metadata progetto corrente (dentro la finestra: l'ultima letta dal backend).
|
|
10571
10581
|
*/
|
|
10572
10582
|
async getProjectMetadataVersionIfExpired(offsetMs) {
|
|
10573
10583
|
const effectiveOffsetMs = Math.max(Number(offsetMs) || 0, MetadataProviderService.minMetadataVersionIntervalMs);
|
|
@@ -10578,14 +10588,30 @@ ${extraScope} ${suggestCallbackSanitized}
|
|
|
10578
10588
|
? lastFromStorage
|
|
10579
10589
|
: MetadataProviderService.lastMetadataVersionCheckAtMs;
|
|
10580
10590
|
if (effectiveOffsetMs > 0 && lastCheckAt > 0 && nowMs <= (lastCheckAt + effectiveOffsetMs)) {
|
|
10581
|
-
|
|
10591
|
+
// Dentro la finestra NON si ritorna `null` ("cache valida"): la finestra
|
|
10592
|
+
// vale per TUTTE le route, e al caricamento della pagina la prima route
|
|
10593
|
+
// (il menu) scarica la versione nuova; le route lette subito dopo
|
|
10594
|
+
// ricevevano `null` e servivano la cache Dexie stale senza confrontarla
|
|
10595
|
+
// (verificato 23/09 su cities: stile colonna appena inserito + invalidate
|
|
10596
|
+
// + reload, la list-grid restava con i metadati vecchi). Si restituisce
|
|
10597
|
+
// l'ultima versione letta DA QUESTA PAGINA, se letta dentro la finestra:
|
|
10598
|
+
// il chiamante la confronta con quella in cache.
|
|
10599
|
+
const ownCheckAt = MetadataProviderService.lastMetadataVersionCheckAtMs;
|
|
10600
|
+
const knownVersion = MetadataProviderService.lastKnownMetadataVersion;
|
|
10601
|
+
if (knownVersion > 0 && ownCheckAt > 0 && nowMs <= (ownCheckAt + effectiveOffsetMs)) {
|
|
10602
|
+
return knownVersion;
|
|
10603
|
+
}
|
|
10604
|
+
// Timestamp scritto prima del reload o da un'altra scheda: la versione
|
|
10605
|
+
// non e' nota qui, si interroga il backend invece di fidarsi della cache.
|
|
10582
10606
|
}
|
|
10583
10607
|
if (!MetadataProviderService.metadataVersionInFlight) {
|
|
10584
10608
|
MetadataProviderService.metadataVersionInFlight = this.http.post(this.getMetadataVersionUri, {}).toPromise().then((version) => {
|
|
10585
10609
|
const checkedAt = Date.now();
|
|
10586
10610
|
MetadataProviderService.lastMetadataVersionCheckAtMs = checkedAt;
|
|
10587
10611
|
localStorage.setItem("lastprojectmetaversionretrieve", String(checkedAt));
|
|
10588
|
-
|
|
10612
|
+
const fetchedVersion = Number(version || 0);
|
|
10613
|
+
MetadataProviderService.lastKnownMetadataVersion = fetchedVersion;
|
|
10614
|
+
return fetchedVersion;
|
|
10589
10615
|
}).finally(() => {
|
|
10590
10616
|
MetadataProviderService.metadataVersionInFlight = undefined;
|
|
10591
10617
|
});
|
|
@@ -15265,6 +15291,12 @@ class DataSourceComponent {
|
|
|
15265
15291
|
* Proprieta di stato del componente per last action, usata dalla logica interna e dal template.
|
|
15266
15292
|
*/
|
|
15267
15293
|
lastAction = null;
|
|
15294
|
+
/**
|
|
15295
|
+
* Ultimo valore del parametro di route `:filters` (id del record in edit/detail, o
|
|
15296
|
+
* descriptor `campo||op||valore`) visto dal gestore NavigationEnd: serve a riconoscere
|
|
15297
|
+
* una navigazione che cambia SOLO il record, a parita' di route e action.
|
|
15298
|
+
*/
|
|
15299
|
+
lastRouteFiltersParam = null;
|
|
15268
15300
|
/**
|
|
15269
15301
|
* Contatore richieste in-flight per gestire il busy in modo concorrente-safe.
|
|
15270
15302
|
*/
|
|
@@ -15692,6 +15724,7 @@ class DataSourceComponent {
|
|
|
15692
15724
|
}
|
|
15693
15725
|
catch { /* defensive */ }
|
|
15694
15726
|
this.lastAction = this.aRoute.snapshot.paramMap.get('action');
|
|
15727
|
+
this.lastRouteFiltersParam = this.aRoute.snapshot.paramMap.get('filters');
|
|
15695
15728
|
if (this.routeFromRouting) {
|
|
15696
15729
|
this.routerEventsSubscription?.unsubscribe();
|
|
15697
15730
|
this.routerEventsSubscription = this.router.events.subscribe((val) => {
|
|
@@ -15708,7 +15741,21 @@ class DataSourceComponent {
|
|
|
15708
15741
|
const pageInfoChanged = currentPageInfoQueryRaw !== this.lastPageInfoQueryRaw;
|
|
15709
15742
|
const sortInfoChanged = currentSortInfoQueryRaw !== this.lastSortInfoQueryRaw;
|
|
15710
15743
|
const actionChanged = this.lastAction !== newaction;
|
|
15711
|
-
|
|
15744
|
+
// Anche il solo cambio di `:filters` va ricaricato. Da `cities/edit/1` a
|
|
15745
|
+
// `cities/edit/3` la configurazione di route e' la stessa, quindi Angular riusa
|
|
15746
|
+
// il componente e questo datasource: con il confronto solo su route e action non
|
|
15747
|
+
// partiva nessuna getFlatRecordData, la form di edit/3 mostrava il record 1 e il
|
|
15748
|
+
// salvataggio lo avrebbe sovrascritto. Stesso difetto su `detail/<id>` e su
|
|
15749
|
+
// `list/<campo||op||valore>`. Si passa dal ramo del cambio action (init completo)
|
|
15750
|
+
// e non da un semplice fetchData perche' applyRouteParamFilterFromSnapshot
|
|
15751
|
+
// aggiorna o aggiunge il filtro di route ma non toglie quello precedente: con un
|
|
15752
|
+
// descriptor su un campo diverso resterebbero attivi entrambi.
|
|
15753
|
+
// Nessun doppio caricamento: al primo ingresso (e da list a edit, che cambia
|
|
15754
|
+
// configurazione di route e ricrea il componente) il valore e' gia' allineato in
|
|
15755
|
+
// ngOnInit, e se cambiano insieme action e record il ramo scatta una volta sola.
|
|
15756
|
+
const newFiltersParam = this.aRoute.snapshot.paramMap.get('filters');
|
|
15757
|
+
const filtersParamChanged = this.lastRouteFiltersParam !== newFiltersParam;
|
|
15758
|
+
if (this.route.value && (newroute !== this.route.value || actionChanged || filtersParamChanged)) {
|
|
15712
15759
|
this.init();
|
|
15713
15760
|
this.applyFilterInfoFromQueryString();
|
|
15714
15761
|
this.applyPageInfoFromQueryString();
|
|
@@ -15730,6 +15777,7 @@ class DataSourceComponent {
|
|
|
15730
15777
|
}
|
|
15731
15778
|
}
|
|
15732
15779
|
this.lastAction = newaction;
|
|
15780
|
+
this.lastRouteFiltersParam = newFiltersParam;
|
|
15733
15781
|
}
|
|
15734
15782
|
});
|
|
15735
15783
|
this.applyFilterInfoFromQueryString();
|
|
@@ -17232,11 +17280,18 @@ class DataSourceComponent {
|
|
|
17232
17280
|
// Si emette su fetchInfo$ direttamente e NON tramite publishFetchInfo, perche' quello
|
|
17233
17281
|
// fa scattare anche afterFirstLoad$ — che i consumer aspettano per il primo
|
|
17234
17282
|
// caricamento VERO, non per un payload vuoto.
|
|
17283
|
+
//
|
|
17284
|
+
// `preliminare: true` lo dichiara anche a chi legge solo fetchInfo$: la form di
|
|
17285
|
+
// edit (parametric-dialog) su questo payload crea un record vuoto con
|
|
17286
|
+
// addNewRecord, e senza il marcatore scambiava quel record per quello caricato
|
|
17287
|
+
// (data-record-loaded="true" con i campi ancora vuoti, prima ancora che partisse
|
|
17288
|
+
// getFlatRecordData).
|
|
17235
17289
|
if (!this.resultInfo?.dato?.length) {
|
|
17236
17290
|
this.fetchInfo$.next({
|
|
17237
17291
|
resultInfo: { ...this.resultInfo, dato: [], totalRowCount: 0 },
|
|
17238
17292
|
metaInfo: this.metaInfo,
|
|
17239
|
-
filterDescriptor: this.filterDescriptor
|
|
17293
|
+
filterDescriptor: this.filterDescriptor,
|
|
17294
|
+
preliminare: true
|
|
17240
17295
|
});
|
|
17241
17296
|
}
|
|
17242
17297
|
await this.fetchData();
|
|
@@ -19668,6 +19723,82 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
|
|
|
19668
19723
|
type: Output
|
|
19669
19724
|
}] } });
|
|
19670
19725
|
|
|
19726
|
+
/**
|
|
19727
|
+
* Espone l'istanza del componente sull'elemento DOM ospite come `__wuicCmp`.
|
|
19728
|
+
*
|
|
19729
|
+
* PERCHE'. I test e2e docs-driven devono poter leggere lo stato runtime di un
|
|
19730
|
+
* componente. Lo facevano con `window.ng.getComponent(host)`, che Angular
|
|
19731
|
+
* **rimuove nelle build di produzione** (`enableProdMode` toglie i debug tools):
|
|
19732
|
+
* contro un'installazione vera — cioe' quella che usano i clienti — quei test
|
|
19733
|
+
* non fallivano per un difetto, fallivano perche' lo strumento non c'era.
|
|
19734
|
+
* Misurato il 21/09/2026 sulla campagna docs-driven: **una trentina di prove**
|
|
19735
|
+
* (`timeline-list`, `list-grid`, `chart-list`, `kanban-list`, `scheduler-list`,
|
|
19736
|
+
* `tree-list`, `carousel-list`, `designer`, piu' tutti gli `--host-events`)
|
|
19737
|
+
* chiudevano con "introspezione runtime fallita: window.ng.getComponent not
|
|
19738
|
+
* available (production build?)", su entrambi i motori e su entrambi i sistemi
|
|
19739
|
+
* operativi.
|
|
19740
|
+
*
|
|
19741
|
+
* `__wuicCmp` e' la strada gia' adottata da `pivot-builder`, `report-designer`,
|
|
19742
|
+
* `workflow-designer`, `data-source`, `code-editor` e `app-settings-editor`, e
|
|
19743
|
+
* 11 test la cercano gia' prima di ripiegare su `window.ng`. Questo helper la
|
|
19744
|
+
* rende una riga sola, senza toccare costruttori ne' cicli di vita:
|
|
19745
|
+
*
|
|
19746
|
+
* ```ts
|
|
19747
|
+
* export class ListGridComponent {
|
|
19748
|
+
* private readonly wuicCmpHandle = exposeWuicCmpOnHost(this);
|
|
19749
|
+
* }
|
|
19750
|
+
* ```
|
|
19751
|
+
*
|
|
19752
|
+
* QUANDO SI ATTACCA. Non sempre: esporre l'istanza di un componente la rende
|
|
19753
|
+
* raggiungibile da qualunque script della pagina, e in un'installazione di un
|
|
19754
|
+
* cliente non serve a nessuno. Quindi:
|
|
19755
|
+
*
|
|
19756
|
+
* - in sviluppo (`isDevMode()`): sempre, dove `window.ng` c'e' comunque;
|
|
19757
|
+
* - in produzione: SOLO se la pagina ha dichiarato `globalThis.__wuicE2E = true`
|
|
19758
|
+
* prima dell'avvio dell'applicazione. Lo fa il bootstrap dei test e2e
|
|
19759
|
+
* (`playwright/docs/_shared/e2e-login-utils.mjs`, via `addInitScript`), non
|
|
19760
|
+
* il prodotto.
|
|
19761
|
+
*
|
|
19762
|
+
* Costo quando e' attivo: un assegnamento di proprieta' per istanza piu' una
|
|
19763
|
+
* callback di pulizia. Quando e' spento: un confronto booleano.
|
|
19764
|
+
*/
|
|
19765
|
+
function exposeWuicCmpOnHost(cmp) {
|
|
19766
|
+
try {
|
|
19767
|
+
if (!isWuicIntrospectionEnabled()) {
|
|
19768
|
+
return;
|
|
19769
|
+
}
|
|
19770
|
+
const ref = inject(ElementRef, { optional: true });
|
|
19771
|
+
const el = ref?.nativeElement;
|
|
19772
|
+
if (!el) {
|
|
19773
|
+
return;
|
|
19774
|
+
}
|
|
19775
|
+
el.__wuicCmp = cmp;
|
|
19776
|
+
// Pulizia senza obbligare il componente ad avere (o a modificare) ngOnDestroy.
|
|
19777
|
+
inject(DestroyRef, { optional: true })?.onDestroy(() => {
|
|
19778
|
+
try {
|
|
19779
|
+
delete el.__wuicCmp;
|
|
19780
|
+
}
|
|
19781
|
+
catch { /* elemento gia' smontato */ }
|
|
19782
|
+
});
|
|
19783
|
+
}
|
|
19784
|
+
catch {
|
|
19785
|
+
// Fuori da un contesto di injection, o ambiente senza DOM (unit test, SSR):
|
|
19786
|
+
// l'handle e' un extra, non deve mai rompere il componente.
|
|
19787
|
+
}
|
|
19788
|
+
}
|
|
19789
|
+
/** True quando l'introspezione dei test e' consentita su questa pagina. */
|
|
19790
|
+
function isWuicIntrospectionEnabled() {
|
|
19791
|
+
try {
|
|
19792
|
+
if (isDevMode()) {
|
|
19793
|
+
return true;
|
|
19794
|
+
}
|
|
19795
|
+
return globalThis.__wuicE2E === true;
|
|
19796
|
+
}
|
|
19797
|
+
catch {
|
|
19798
|
+
return false;
|
|
19799
|
+
}
|
|
19800
|
+
}
|
|
19801
|
+
|
|
19671
19802
|
/**
|
|
19672
19803
|
* Metametrics — Dashboard amministrativa delle metriche route
|
|
19673
19804
|
* (menu Amministrazione → route `/route-metrics-dashboard`).
|
|
@@ -19705,6 +19836,9 @@ class RouteMetricsDashboardComponent {
|
|
|
19705
19836
|
metric = 'fetch';
|
|
19706
19837
|
valueKind = 'avg';
|
|
19707
19838
|
scope = 'global';
|
|
19839
|
+
/** Handle di ispezione per i test e2e (attivo solo in dev o con __wuicE2E): in build di
|
|
19840
|
+
* produzione `window.ng` non c'e' e route-metrics-dashboard--filters legge lo stato da qui. */
|
|
19841
|
+
wuicCmpHandle = exposeWuicCmpOnHost(this);
|
|
19708
19842
|
/** Palette serie (ciclica) — colori PrimeNG standard, ok light/dark. */
|
|
19709
19843
|
palette = ['#3b82f6', '#22c55e', '#f97316', '#a855f7', '#ef4444', '#14b8a6', '#eab308', '#64748b'];
|
|
19710
19844
|
/**
|
|
@@ -22001,7 +22135,7 @@ class LazySchedulerListComponent {
|
|
|
22001
22135
|
* Inizializza il componente preparando stato, sottoscrizioni e primi caricamenti richiesti.
|
|
22002
22136
|
*/
|
|
22003
22137
|
async ngOnInit() {
|
|
22004
|
-
schedulerListComponentPromise ??= import('./wuic-framework-lib-scheduler-list.component-
|
|
22138
|
+
schedulerListComponentPromise ??= import('./wuic-framework-lib-scheduler-list.component-B6lWGWEd.mjs').then((m) => m.SchedulerListComponent);
|
|
22005
22139
|
this.loadedComponent = await schedulerListComponentPromise;
|
|
22006
22140
|
this.cdr.markForCheck();
|
|
22007
22141
|
}
|
|
@@ -22209,7 +22343,7 @@ class LazySpreadsheetListSfComponent {
|
|
|
22209
22343
|
this.activatedRoute = activatedRoute;
|
|
22210
22344
|
}
|
|
22211
22345
|
async ngOnInit() {
|
|
22212
|
-
spreadsheetListSfComponentPromise ??= import('./wuic-framework-lib-spreadsheet-list-sf.component-
|
|
22346
|
+
spreadsheetListSfComponentPromise ??= import('./wuic-framework-lib-spreadsheet-list-sf.component-Bpxi8la8.mjs').then((m) => m.SpreadsheetListSfComponent);
|
|
22213
22347
|
this.loadedComponent = await spreadsheetListSfComponentPromise;
|
|
22214
22348
|
// Quando la promise e' gia' risolta dal cache module-scope (secondo mount
|
|
22215
22349
|
// post-refresh), il microtask che risolve `await` non scatena sempre CD
|
|
@@ -22487,7 +22621,7 @@ class LazyChartListComponent {
|
|
|
22487
22621
|
* Inizializza il componente preparando stato, sottoscrizioni e primi caricamenti richiesti.
|
|
22488
22622
|
*/
|
|
22489
22623
|
async ngOnInit() {
|
|
22490
|
-
chartListComponentPromise ??= import('./wuic-framework-lib-chart-list.component-
|
|
22624
|
+
chartListComponentPromise ??= import('./wuic-framework-lib-chart-list.component-BEps71hL.mjs').then((m) => m.ChartListComponent);
|
|
22491
22625
|
this.loadedComponent = await chartListComponentPromise;
|
|
22492
22626
|
this.cdr.markForCheck();
|
|
22493
22627
|
}
|
|
@@ -22809,7 +22943,7 @@ class LazyTimelineListComponent {
|
|
|
22809
22943
|
this.cdr = cdr;
|
|
22810
22944
|
}
|
|
22811
22945
|
async ngOnInit() {
|
|
22812
|
-
timelineListComponentPromise ??= import('./wuic-framework-lib-timeline-list.component-
|
|
22946
|
+
timelineListComponentPromise ??= import('./wuic-framework-lib-timeline-list.component-DsvQ8Wro.mjs').then((m) => m.TimelineListComponent);
|
|
22813
22947
|
this.loadedComponent = await timelineListComponentPromise;
|
|
22814
22948
|
this.cdr.markForCheck();
|
|
22815
22949
|
}
|
|
@@ -24078,7 +24212,7 @@ class MetadataEditorComponent {
|
|
|
24078
24212
|
}
|
|
24079
24213
|
let result;
|
|
24080
24214
|
try {
|
|
24081
|
-
const { ReportScaffoldDialogComponent } = await import('./wuic-framework-lib-report-scaffold-dialog.component-
|
|
24215
|
+
const { ReportScaffoldDialogComponent } = await import('./wuic-framework-lib-report-scaffold-dialog.component-DdRrsp8w.mjs');
|
|
24082
24216
|
WtoolboxService.resolveDialogServiceFromInjector();
|
|
24083
24217
|
const ref = WtoolboxService.dialogService?.open?.(ReportScaffoldDialogComponent, {
|
|
24084
24218
|
header: this.t('report.scaffold.dialog_title', 'Create report'),
|
|
@@ -26719,6 +26853,15 @@ class PointFilterComponent {
|
|
|
26719
26853
|
* Proprieta di stato del componente per map zoom, usata dalla logica interna e dal template.
|
|
26720
26854
|
*/
|
|
26721
26855
|
mapZoom = 6;
|
|
26856
|
+
/**
|
|
26857
|
+
* Il template monta `<google-map>` solo se lo script Maps e' caricato (stesso controllo di
|
|
26858
|
+
* `MapListComponent.isMapsApiAvailable`). E' un getter perche' la condizione va rivalutata a
|
|
26859
|
+
* ogni change detection: se lo script arriva dopo, la mappa compare senza ricaricare.
|
|
26860
|
+
*/
|
|
26861
|
+
get mapsApiReady() {
|
|
26862
|
+
const g = globalThis.google;
|
|
26863
|
+
return !!(g && g.maps && typeof g.maps.importLibrary === 'function');
|
|
26864
|
+
}
|
|
26722
26865
|
/**
|
|
26723
26866
|
* Modalita' di disegno corrente. Sostituisce `google.maps.drawing.DrawingManager`
|
|
26724
26867
|
* deprecato (Maps JavaScript API drawing library, deprecated 2025-08, removed
|
|
@@ -27274,11 +27417,11 @@ class PointFilterComponent {
|
|
|
27274
27417
|
};
|
|
27275
27418
|
}
|
|
27276
27419
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: PointFilterComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
27277
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: PointFilterComponent, isStandalone: true, selector: "wuic-point-filter", inputs: { record: "record", field: "field", metaInfo: "metaInfo", datasource: "datasource" }, viewQueries: [{ propertyName: "map", first: true, predicate: GoogleMap, descendants: true }], ngImport: i0, template: "<div class=\"point-filter-box\">\r\n <div class=\"point-filter-actions\">\r\n <button pButton type=\"button\" icon=\"pi pi-map\" [pTooltip]=\"'map.configure' | translate\" tooltipPosition=\"top\"\r\n class=\"p-button-sm\" (click)=\"openDialog()\"></button>\r\n <button pButton type=\"button\" icon=\"pi pi-times\" [pTooltip]=\"'form_reset' | translate\" tooltipPosition=\"top\"\r\n class=\"p-button-sm p-button-secondary p-button-outlined\" (click)=\"clearFilter()\"></button>\r\n\r\n <span class=\"point-filter-status\">\r\n @if (pendingOperator === 'maparea') {\r\n <i class=\"pi pi-check-circle point-filter-status-icon active\"></i>\r\n <span>{{ 'point_filter.area_ready' | translate }}</span>\r\n } @else if (pendingOperator === 'mapdistance') {\r\n <i class=\"pi pi-check-circle point-filter-status-icon active\"></i>\r\n <span>{{ 'point_filter.circle_ready' | translate }}</span>\r\n } @else {\r\n <i class=\"pi pi-map-marker point-filter-status-icon\"></i>\r\n <span>{{ 'point_filter.none' | translate }}</span>\r\n }\r\n </span>\r\n </div>\r\n</div>\r\n\r\n<p-dialog [header]=\"'point_filter.header' | translate\" [(visible)]=\"dialogVisible\" [modal]=\"true\" [closable]=\"true\" [style]=\"{ width: '920px', maxWidth: '95vw' }\">\r\n <div class=\"point-filter-dialog-actions\">\r\n <button pButton type=\"button\" icon=\"pi pi-pencil\" [label]=\"'point_filter.draw_area' | translate\"\r\n class=\"p-button-sm\" (click)=\"drawArea()\"></button>\r\n <button pButton type=\"button\" icon=\"pi pi-circle\" [label]=\"'point_filter.draw_circle' | translate\"\r\n class=\"p-button-sm\" (click)=\"drawCircle()\"></button>\r\n <button pButton type=\"button\" icon=\"pi pi-trash\" [label]=\"'point_filter.clear_shape' | translate\"\r\n class=\"p-button-sm p-button-secondary p-button-outlined\" (click)=\"clearShapes()\"></button>\r\n </div>\r\n\r\n <google-map [height]=\"'420px'\" [width]=\"'100%'\" [center]=\"mapCenter\" [zoom]=\"mapZoom\"></google-map>\r\n\r\n <ng-template pTemplate=\"footer\">\r\n <button pButton type=\"button\" icon=\"pi pi-times\" [label]=\"'cancel' | translate\"\r\n class=\"p-button-secondary\" (click)=\"closeDialog()\"></button>\r\n <button pButton type=\"button\" icon=\"pi pi-check\" [label]=\"'point_filter.use_filter' | translate\"\r\n (click)=\"applyFilter()\"></button>\r\n </ng-template>\r\n</p-dialog>\r\n", styles: [".point-filter-box{display:flex;flex-direction:column;gap:.25rem}.point-filter-actions{display:flex;align-items:center;gap:.4rem}.point-filter-status{display:inline-flex;align-items:center;gap:.3rem;font-size:.8rem;color:#64748b;margin-left:.25rem}.point-filter-status-icon{font-size:.85rem;color:#94a3b8}.point-filter-status-icon.active{color:#22c55e}.point-filter-dialog-actions{display:flex;gap:.5rem;margin-bottom:.75rem}\n"], dependencies: [{ kind: "ngmodule", type: GoogleMapsModule }, { kind: "component", type: i5$2.GoogleMap, selector: "google-map", inputs: ["height", "width", "mapId", "mapTypeId", "center", "zoom", "options"], outputs: ["mapInitialized", "authFailure", "boundsChanged", "centerChanged", "mapClick", "mapDblclick", "mapDrag", "mapDragend", "mapDragstart", "headingChanged", "idle", "maptypeidChanged", "mapMousemove", "mapMouseout", "mapMouseover", "projectionChanged", "mapRightclick", "tilesloaded", "tiltChanged", "zoomChanged"], exportAs: ["googleMap"] }, { kind: "ngmodule", type: DialogModule }, { kind: "component", type: i2.Dialog, selector: "p-dialog", inputs: ["hostName", "header", "draggable", "resizable", "contentStyle", "contentStyleClass", "modal", "closeOnEscape", "dismissableMask", "rtl", "closable", "breakpoints", "styleClass", "maskStyleClass", "maskStyle", "showHeader", "blockScroll", "autoZIndex", "baseZIndex", "minX", "minY", "focusOnShow", "maximizable", "keepInViewport", "focusTrap", "transitionOptions", "maskMotionOptions", "motionOptions", "closeIcon", "closeAriaLabel", "closeTabindex", "minimizeIcon", "maximizeIcon", "closeButtonProps", "maximizeButtonProps", "visible", "style", "position", "role", "appendTo", "content", "contentTemplate", "footerTemplate", "closeIconTemplate", "maximizeIconTemplate", "minimizeIconTemplate", "headlessTemplate"], outputs: ["onShow", "onHide", "visibleChange", "onResizeInit", "onResizeEnd", "onDragEnd", "onMaximize"] }, { kind: "directive", type: i3.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "directive", type: i4.ButtonDirective, selector: "[pButton]", inputs: ["ptButtonDirective", "pButtonPT", "pButtonUnstyled", "hostName", "text", "plain", "raised", "size", "outlined", "rounded", "iconPos", "loadingIcon", "fluid", "label", "icon", "loading", "buttonProps", "severity"] }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i7.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "showOnEllipsis", "pTooltip", "tooltipDisabled", "tooltipOptions", "appendTo", "ptTooltip", "pTooltipPT", "pTooltipUnstyled"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i8.TranslatePipe, name: "translate" }] });
|
|
27420
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: PointFilterComponent, isStandalone: true, selector: "wuic-point-filter", inputs: { record: "record", field: "field", metaInfo: "metaInfo", datasource: "datasource" }, viewQueries: [{ propertyName: "map", first: true, predicate: GoogleMap, descendants: true }], ngImport: i0, template: "<div class=\"point-filter-box\">\r\n <div class=\"point-filter-actions\">\r\n <button pButton type=\"button\" icon=\"pi pi-map\" [pTooltip]=\"'map.configure' | translate\" tooltipPosition=\"top\"\r\n class=\"p-button-sm\" (click)=\"openDialog()\"></button>\r\n <button pButton type=\"button\" icon=\"pi pi-times\" [pTooltip]=\"'form_reset' | translate\" tooltipPosition=\"top\"\r\n class=\"p-button-sm p-button-secondary p-button-outlined\" (click)=\"clearFilter()\"></button>\r\n\r\n <span class=\"point-filter-status\">\r\n @if (pendingOperator === 'maparea') {\r\n <i class=\"pi pi-check-circle point-filter-status-icon active\"></i>\r\n <span>{{ 'point_filter.area_ready' | translate }}</span>\r\n } @else if (pendingOperator === 'mapdistance') {\r\n <i class=\"pi pi-check-circle point-filter-status-icon active\"></i>\r\n <span>{{ 'point_filter.circle_ready' | translate }}</span>\r\n } @else {\r\n <i class=\"pi pi-map-marker point-filter-status-icon\"></i>\r\n <span>{{ 'point_filter.none' | translate }}</span>\r\n }\r\n </span>\r\n </div>\r\n</div>\r\n\r\n<p-dialog [header]=\"'point_filter.header' | translate\" [(visible)]=\"dialogVisible\" [modal]=\"true\" [closable]=\"true\" [style]=\"{ width: '920px', maxWidth: '95vw' }\">\r\n <div class=\"point-filter-dialog-actions\">\r\n <button pButton type=\"button\" icon=\"pi pi-pencil\" [label]=\"'point_filter.draw_area' | translate\"\r\n class=\"p-button-sm\" (click)=\"drawArea()\"></button>\r\n <button pButton type=\"button\" icon=\"pi pi-circle\" [label]=\"'point_filter.draw_circle' | translate\"\r\n class=\"p-button-sm\" (click)=\"drawCircle()\"></button>\r\n <button pButton type=\"button\" icon=\"pi pi-trash\" [label]=\"'point_filter.clear_shape' | translate\"\r\n class=\"p-button-sm p-button-secondary p-button-outlined\" (click)=\"clearShapes()\"></button>\r\n </div>\r\n\r\n <!-- `mapsApiReady` come in map-list: il contenuto proiettato nel p-dialog viene creato\r\n SUBITO, anche a dialog chiuso, quindi <google-map> girava il suo ngOnInit appena la\r\n filter-bar mostrava il filtro geografico. Senza lo script Maps (chiave API vuota) lanciava\r\n `ReferenceError: google is not defined`, che apriva il dialog di errore applicativo sopra\r\n la filter-bar e bloccava tutta la pagina (cella Windows x postgres, 23/09/2026:\r\n filter-bar--operators, responsive filter-bar-overlay, point-filter--*). -->\r\n @if (mapsApiReady) {\r\n <google-map [height]=\"'420px'\" [width]=\"'100%'\" [center]=\"mapCenter\" [zoom]=\"mapZoom\"></google-map>\r\n } @else {\r\n <div class=\"point-filter-map-unavailable\" role=\"status\">\r\n <i class=\"pi pi-map\" aria-hidden=\"true\"></i>\r\n <div class=\"point-filter-map-unavailable__title\">{{ 'map.api_key_missing.title' | translate }}</div>\r\n <div>{{ 'map.api_key_missing.detail' | translate }}</div>\r\n </div>\r\n }\r\n\r\n <ng-template pTemplate=\"footer\">\r\n <button pButton type=\"button\" icon=\"pi pi-times\" [label]=\"'cancel' | translate\"\r\n class=\"p-button-secondary\" (click)=\"closeDialog()\"></button>\r\n <button pButton type=\"button\" icon=\"pi pi-check\" [label]=\"'point_filter.use_filter' | translate\"\r\n (click)=\"applyFilter()\"></button>\r\n </ng-template>\r\n</p-dialog>\r\n", styles: [".point-filter-box{display:flex;flex-direction:column;gap:.25rem}.point-filter-actions{display:flex;align-items:center;gap:.4rem}.point-filter-status{display:inline-flex;align-items:center;gap:.3rem;font-size:.8rem;color:#64748b;margin-left:.25rem}.point-filter-status-icon{font-size:.85rem;color:#94a3b8}.point-filter-status-icon.active{color:#22c55e}.point-filter-dialog-actions{display:flex;gap:.5rem;margin-bottom:.75rem}.point-filter-map-unavailable{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:.5rem;min-height:220px;padding:1.5rem;text-align:center;color:var(--text-color-secondary, #64748b);border:1px dashed var(--surface-border, #e2e8f0)}.point-filter-map-unavailable__title{font-weight:600}\n"], dependencies: [{ kind: "ngmodule", type: GoogleMapsModule }, { kind: "component", type: i5$2.GoogleMap, selector: "google-map", inputs: ["height", "width", "mapId", "mapTypeId", "center", "zoom", "options"], outputs: ["mapInitialized", "authFailure", "boundsChanged", "centerChanged", "mapClick", "mapDblclick", "mapDrag", "mapDragend", "mapDragstart", "headingChanged", "idle", "maptypeidChanged", "mapMousemove", "mapMouseout", "mapMouseover", "projectionChanged", "mapRightclick", "tilesloaded", "tiltChanged", "zoomChanged"], exportAs: ["googleMap"] }, { kind: "ngmodule", type: DialogModule }, { kind: "component", type: i2.Dialog, selector: "p-dialog", inputs: ["hostName", "header", "draggable", "resizable", "contentStyle", "contentStyleClass", "modal", "closeOnEscape", "dismissableMask", "rtl", "closable", "breakpoints", "styleClass", "maskStyleClass", "maskStyle", "showHeader", "blockScroll", "autoZIndex", "baseZIndex", "minX", "minY", "focusOnShow", "maximizable", "keepInViewport", "focusTrap", "transitionOptions", "maskMotionOptions", "motionOptions", "closeIcon", "closeAriaLabel", "closeTabindex", "minimizeIcon", "maximizeIcon", "closeButtonProps", "maximizeButtonProps", "visible", "style", "position", "role", "appendTo", "content", "contentTemplate", "footerTemplate", "closeIconTemplate", "maximizeIconTemplate", "minimizeIconTemplate", "headlessTemplate"], outputs: ["onShow", "onHide", "visibleChange", "onResizeInit", "onResizeEnd", "onDragEnd", "onMaximize"] }, { kind: "directive", type: i3.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "ngmodule", type: ButtonModule }, { kind: "directive", type: i4.ButtonDirective, selector: "[pButton]", inputs: ["ptButtonDirective", "pButtonPT", "pButtonUnstyled", "hostName", "text", "plain", "raised", "size", "outlined", "rounded", "iconPos", "loadingIcon", "fluid", "label", "icon", "loading", "buttonProps", "severity"] }, { kind: "ngmodule", type: TooltipModule }, { kind: "directive", type: i7.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "showOnEllipsis", "pTooltip", "tooltipDisabled", "tooltipOptions", "appendTo", "ptTooltip", "pTooltipPT", "pTooltipUnstyled"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i8.TranslatePipe, name: "translate" }] });
|
|
27278
27421
|
}
|
|
27279
27422
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: PointFilterComponent, decorators: [{
|
|
27280
27423
|
type: Component,
|
|
27281
|
-
args: [{ selector: 'wuic-point-filter', imports: [GoogleMapsModule, DialogModule, ButtonModule, TooltipModule, TranslateModule], template: "<div class=\"point-filter-box\">\r\n <div class=\"point-filter-actions\">\r\n <button pButton type=\"button\" icon=\"pi pi-map\" [pTooltip]=\"'map.configure' | translate\" tooltipPosition=\"top\"\r\n class=\"p-button-sm\" (click)=\"openDialog()\"></button>\r\n <button pButton type=\"button\" icon=\"pi pi-times\" [pTooltip]=\"'form_reset' | translate\" tooltipPosition=\"top\"\r\n class=\"p-button-sm p-button-secondary p-button-outlined\" (click)=\"clearFilter()\"></button>\r\n\r\n <span class=\"point-filter-status\">\r\n @if (pendingOperator === 'maparea') {\r\n <i class=\"pi pi-check-circle point-filter-status-icon active\"></i>\r\n <span>{{ 'point_filter.area_ready' | translate }}</span>\r\n } @else if (pendingOperator === 'mapdistance') {\r\n <i class=\"pi pi-check-circle point-filter-status-icon active\"></i>\r\n <span>{{ 'point_filter.circle_ready' | translate }}</span>\r\n } @else {\r\n <i class=\"pi pi-map-marker point-filter-status-icon\"></i>\r\n <span>{{ 'point_filter.none' | translate }}</span>\r\n }\r\n </span>\r\n </div>\r\n</div>\r\n\r\n<p-dialog [header]=\"'point_filter.header' | translate\" [(visible)]=\"dialogVisible\" [modal]=\"true\" [closable]=\"true\" [style]=\"{ width: '920px', maxWidth: '95vw' }\">\r\n <div class=\"point-filter-dialog-actions\">\r\n <button pButton type=\"button\" icon=\"pi pi-pencil\" [label]=\"'point_filter.draw_area' | translate\"\r\n class=\"p-button-sm\" (click)=\"drawArea()\"></button>\r\n <button pButton type=\"button\" icon=\"pi pi-circle\" [label]=\"'point_filter.draw_circle' | translate\"\r\n class=\"p-button-sm\" (click)=\"drawCircle()\"></button>\r\n <button pButton type=\"button\" icon=\"pi pi-trash\" [label]=\"'point_filter.clear_shape' | translate\"\r\n class=\"p-button-sm p-button-secondary p-button-outlined\" (click)=\"clearShapes()\"></button>\r\n </div>\r\n\r\n <google-map [height]=\"'420px'\" [width]=\"'100%'\" [center]=\"mapCenter\" [zoom]=\"mapZoom\"></google-map>\r\n\r\n <ng-template pTemplate=\"footer\">\r\n <button pButton type=\"button\" icon=\"pi pi-times\" [label]=\"'cancel' | translate\"\r\n class=\"p-button-secondary\" (click)=\"closeDialog()\"></button>\r\n <button pButton type=\"button\" icon=\"pi pi-check\" [label]=\"'point_filter.use_filter' | translate\"\r\n (click)=\"applyFilter()\"></button>\r\n </ng-template>\r\n</p-dialog>\r\n", styles: [".point-filter-box{display:flex;flex-direction:column;gap:.25rem}.point-filter-actions{display:flex;align-items:center;gap:.4rem}.point-filter-status{display:inline-flex;align-items:center;gap:.3rem;font-size:.8rem;color:#64748b;margin-left:.25rem}.point-filter-status-icon{font-size:.85rem;color:#94a3b8}.point-filter-status-icon.active{color:#22c55e}.point-filter-dialog-actions{display:flex;gap:.5rem;margin-bottom:.75rem}\n"] }]
|
|
27424
|
+
args: [{ selector: 'wuic-point-filter', imports: [GoogleMapsModule, DialogModule, ButtonModule, TooltipModule, TranslateModule], template: "<div class=\"point-filter-box\">\r\n <div class=\"point-filter-actions\">\r\n <button pButton type=\"button\" icon=\"pi pi-map\" [pTooltip]=\"'map.configure' | translate\" tooltipPosition=\"top\"\r\n class=\"p-button-sm\" (click)=\"openDialog()\"></button>\r\n <button pButton type=\"button\" icon=\"pi pi-times\" [pTooltip]=\"'form_reset' | translate\" tooltipPosition=\"top\"\r\n class=\"p-button-sm p-button-secondary p-button-outlined\" (click)=\"clearFilter()\"></button>\r\n\r\n <span class=\"point-filter-status\">\r\n @if (pendingOperator === 'maparea') {\r\n <i class=\"pi pi-check-circle point-filter-status-icon active\"></i>\r\n <span>{{ 'point_filter.area_ready' | translate }}</span>\r\n } @else if (pendingOperator === 'mapdistance') {\r\n <i class=\"pi pi-check-circle point-filter-status-icon active\"></i>\r\n <span>{{ 'point_filter.circle_ready' | translate }}</span>\r\n } @else {\r\n <i class=\"pi pi-map-marker point-filter-status-icon\"></i>\r\n <span>{{ 'point_filter.none' | translate }}</span>\r\n }\r\n </span>\r\n </div>\r\n</div>\r\n\r\n<p-dialog [header]=\"'point_filter.header' | translate\" [(visible)]=\"dialogVisible\" [modal]=\"true\" [closable]=\"true\" [style]=\"{ width: '920px', maxWidth: '95vw' }\">\r\n <div class=\"point-filter-dialog-actions\">\r\n <button pButton type=\"button\" icon=\"pi pi-pencil\" [label]=\"'point_filter.draw_area' | translate\"\r\n class=\"p-button-sm\" (click)=\"drawArea()\"></button>\r\n <button pButton type=\"button\" icon=\"pi pi-circle\" [label]=\"'point_filter.draw_circle' | translate\"\r\n class=\"p-button-sm\" (click)=\"drawCircle()\"></button>\r\n <button pButton type=\"button\" icon=\"pi pi-trash\" [label]=\"'point_filter.clear_shape' | translate\"\r\n class=\"p-button-sm p-button-secondary p-button-outlined\" (click)=\"clearShapes()\"></button>\r\n </div>\r\n\r\n <!-- `mapsApiReady` come in map-list: il contenuto proiettato nel p-dialog viene creato\r\n SUBITO, anche a dialog chiuso, quindi <google-map> girava il suo ngOnInit appena la\r\n filter-bar mostrava il filtro geografico. Senza lo script Maps (chiave API vuota) lanciava\r\n `ReferenceError: google is not defined`, che apriva il dialog di errore applicativo sopra\r\n la filter-bar e bloccava tutta la pagina (cella Windows x postgres, 23/09/2026:\r\n filter-bar--operators, responsive filter-bar-overlay, point-filter--*). -->\r\n @if (mapsApiReady) {\r\n <google-map [height]=\"'420px'\" [width]=\"'100%'\" [center]=\"mapCenter\" [zoom]=\"mapZoom\"></google-map>\r\n } @else {\r\n <div class=\"point-filter-map-unavailable\" role=\"status\">\r\n <i class=\"pi pi-map\" aria-hidden=\"true\"></i>\r\n <div class=\"point-filter-map-unavailable__title\">{{ 'map.api_key_missing.title' | translate }}</div>\r\n <div>{{ 'map.api_key_missing.detail' | translate }}</div>\r\n </div>\r\n }\r\n\r\n <ng-template pTemplate=\"footer\">\r\n <button pButton type=\"button\" icon=\"pi pi-times\" [label]=\"'cancel' | translate\"\r\n class=\"p-button-secondary\" (click)=\"closeDialog()\"></button>\r\n <button pButton type=\"button\" icon=\"pi pi-check\" [label]=\"'point_filter.use_filter' | translate\"\r\n (click)=\"applyFilter()\"></button>\r\n </ng-template>\r\n</p-dialog>\r\n", styles: [".point-filter-box{display:flex;flex-direction:column;gap:.25rem}.point-filter-actions{display:flex;align-items:center;gap:.4rem}.point-filter-status{display:inline-flex;align-items:center;gap:.3rem;font-size:.8rem;color:#64748b;margin-left:.25rem}.point-filter-status-icon{font-size:.85rem;color:#94a3b8}.point-filter-status-icon.active{color:#22c55e}.point-filter-dialog-actions{display:flex;gap:.5rem;margin-bottom:.75rem}.point-filter-map-unavailable{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:.5rem;min-height:220px;padding:1.5rem;text-align:center;color:var(--text-color-secondary, #64748b);border:1px dashed var(--surface-border, #e2e8f0)}.point-filter-map-unavailable__title{font-weight:600}\n"] }]
|
|
27282
27425
|
}], propDecorators: { record: [{
|
|
27283
27426
|
type: Input
|
|
27284
27427
|
}], field: [{
|
|
@@ -27293,6 +27436,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
|
|
|
27293
27436
|
}] } });
|
|
27294
27437
|
|
|
27295
27438
|
class NumberEditorComponent {
|
|
27439
|
+
/** Handle di ispezione per i test e2e (attivo solo in dev o con __wuicE2E). */
|
|
27440
|
+
wuicCmpHandle = exposeWuicCmpOnHost(this);
|
|
27296
27441
|
/**
|
|
27297
27442
|
* Input dal componente padre per record; usata nella configurazione e nel rendering del componente.
|
|
27298
27443
|
*/
|
|
@@ -29626,6 +29771,8 @@ class BoundedRepeaterComponent {
|
|
|
29626
29771
|
userService;
|
|
29627
29772
|
sanitizer;
|
|
29628
29773
|
cdr;
|
|
29774
|
+
/** Handle di ispezione per i test e2e (attivo solo in dev o con __wuicE2E). */
|
|
29775
|
+
wuicCmpHandle = exposeWuicCmpOnHost(this);
|
|
29629
29776
|
/**
|
|
29630
29777
|
* Input dal componente padre per hardcoded route; usata nella configurazione e nel rendering del componente.
|
|
29631
29778
|
*/
|
|
@@ -30178,6 +30325,8 @@ class FieldEditorComponent {
|
|
|
30178
30325
|
userInfo;
|
|
30179
30326
|
metadataEditorSrv;
|
|
30180
30327
|
hostElementRef;
|
|
30328
|
+
/** Handle di ispezione per i test e2e (attivo solo in dev o con __wuicE2E). */
|
|
30329
|
+
wuicCmpHandle = exposeWuicCmpOnHost(this);
|
|
30181
30330
|
static LABEL_FOR_SUPPORTED_WIDGETS = new Set([
|
|
30182
30331
|
'text',
|
|
30183
30332
|
'textarea',
|
|
@@ -31137,6 +31286,8 @@ class ParametricDialogComponent {
|
|
|
31137
31286
|
hostElementRef;
|
|
31138
31287
|
customAttributesService;
|
|
31139
31288
|
dialogService;
|
|
31289
|
+
/** Handle di ispezione per i test e2e (attivo solo in dev o con __wuicE2E). */
|
|
31290
|
+
wuicCmpHandle = exposeWuicCmpOnHost(this);
|
|
31140
31291
|
/**
|
|
31141
31292
|
* Input dal componente padre per datasource; usata nella configurazione e nel rendering del componente.
|
|
31142
31293
|
*/
|
|
@@ -31361,7 +31512,11 @@ class ParametricDialogComponent {
|
|
|
31361
31512
|
const fetchInfo$ = this.datasource.value?.fetchInfo$;
|
|
31362
31513
|
if (fetchInfo$ && typeof fetchInfo$.subscribe === 'function') {
|
|
31363
31514
|
this.fetchInfoSubscription = fetchInfo$.subscribe((info) => {
|
|
31364
|
-
if (info
|
|
31515
|
+
if (!info) {
|
|
31516
|
+
this.segnalaRecordNonCaricato();
|
|
31517
|
+
return;
|
|
31518
|
+
}
|
|
31519
|
+
if (info.metaInfo) {
|
|
31365
31520
|
this.applyDatasourceSnapshot(this.datasource?.value, info.metaInfo);
|
|
31366
31521
|
this.ensureWizardTrackingBound(this.datasource?.value);
|
|
31367
31522
|
this.bootstrapConditionalActions();
|
|
@@ -31380,7 +31535,11 @@ class ParametricDialogComponent {
|
|
|
31380
31535
|
const fetchInfo$ = this.datasource.value?.fetchInfo$;
|
|
31381
31536
|
if (fetchInfo$ && typeof fetchInfo$.subscribe === 'function') {
|
|
31382
31537
|
this.fetchInfoSubscription = fetchInfo$.subscribe((info) => {
|
|
31383
|
-
if (info
|
|
31538
|
+
if (!info) {
|
|
31539
|
+
this.segnalaRecordNonCaricato();
|
|
31540
|
+
return;
|
|
31541
|
+
}
|
|
31542
|
+
if (info.metaInfo) {
|
|
31384
31543
|
this.applyDatasourceSnapshot(this.datasource?.value, info.metaInfo);
|
|
31385
31544
|
this.ensureWizardTrackingBound(this.datasource?.value);
|
|
31386
31545
|
this.bootstrapConditionalActions();
|
|
@@ -31442,6 +31601,62 @@ class ParametricDialogComponent {
|
|
|
31442
31601
|
record: this.record,
|
|
31443
31602
|
pristine: this.pristine
|
|
31444
31603
|
});
|
|
31604
|
+
// `data-record-loaded`: il record non e' solo ASSEGNATO, i valori sono arrivati.
|
|
31605
|
+
//
|
|
31606
|
+
// Serviva distinguerlo. `wuic-field-editor` espone `data-has-record`, che vale
|
|
31607
|
+
// `this.record ? true : false`, cioe' diventa vero appena la form costruisce lo
|
|
31608
|
+
// scheletro — mentre `getFlatRecordData` e' ancora in volo (misurato su VM il
|
|
31609
|
+
// 21/09/2026: 1,3 s per il record, dentro una raffica di 18 `getTableMetadata`
|
|
31610
|
+
// paralleli, il piu' lento 2,8 s). Chi leggeva un campo appoggiandosi a quel
|
|
31611
|
+
// flag trovava stringa vuota e la scambiava per un difetto: otto prove
|
|
31612
|
+
// `field-widget-*` rosse su entrambi i motori.
|
|
31613
|
+
//
|
|
31614
|
+
// Avere un record non basta: questo metodo gira anche prima dei dati, e in quel
|
|
31615
|
+
// caso il record e' quello VUOTO creato qui sopra da `addNewRecord`. Succede
|
|
31616
|
+
// (a) sul payload anticipato del datasource (`preliminare: true`, emesso appena
|
|
31617
|
+
// arrivano i metadati) e (b) quando il dialogo nasce dopo il reset di `init()`,
|
|
31618
|
+
// con `fetchInfo$` ancora a null. Misurato il 23/09/2026 su Linux x MySQL e
|
|
31619
|
+
// Windows x PostgreSQL: il segnale saliva a +0,2 s, PRIMA che partisse la
|
|
31620
|
+
// richiesta `getFlatRecordData`, e il valore arrivava a +1,0/1,6 s. Si alza
|
|
31621
|
+
// quindi solo quando il payload corrente e' una risposta vera: quella del
|
|
31622
|
+
// record in edit, o quella vuota di un inserimento (dove il record di
|
|
31623
|
+
// `addNewRecord` E' il record giusto). Un datasource senza `fetchInfo$` (quello
|
|
31624
|
+
// costruito da `promptDialog`) non ha niente da caricare: il suo record e' gia'
|
|
31625
|
+
// quello definitivo.
|
|
31626
|
+
try {
|
|
31627
|
+
const el = this.hostElementRef?.nativeElement;
|
|
31628
|
+
const cicloDati = ds.fetchInfo$;
|
|
31629
|
+
const payloadCorrente = cicloDati?.value;
|
|
31630
|
+
const datiArrivati = !!this.record
|
|
31631
|
+
&& (!cicloDati || (!!payloadCorrente && payloadCorrente.preliminare !== true));
|
|
31632
|
+
if (el) {
|
|
31633
|
+
el.setAttribute('data-record-loaded', datiArrivati ? 'true' : 'false');
|
|
31634
|
+
}
|
|
31635
|
+
}
|
|
31636
|
+
catch { /* ambiente senza DOM */ }
|
|
31637
|
+
}
|
|
31638
|
+
/**
|
|
31639
|
+
* Abbassa `data-record-loaded` quando il datasource pubblica `null` su `fetchInfo$`.
|
|
31640
|
+
*
|
|
31641
|
+
* Quel `null` lo emette solo `init()` del datasource, cioe' un ricaricamento appena
|
|
31642
|
+
* partito: da `cities/edit/A` a `cities/edit/B` il componente e' riusato e il
|
|
31643
|
+
* gestore NavigationEnd rifa' init + getSchemaAndData. La subscribe ignorava il
|
|
31644
|
+
* payload nullo, e siccome `resultInfo.dato` ha ancora il record A il datasource non
|
|
31645
|
+
* emette nemmeno il payload preliminare: il segnale restava "true" sul record A per
|
|
31646
|
+
* tutta la durata della richiesta di B, e chi lo aspettava leggeva i valori di A
|
|
31647
|
+
* credendoli di B. Qui non si ricalcola niente: con il payload corrente a `null` la
|
|
31648
|
+
* formula di `applyDatasourceSnapshot` darebbe comunque "false", e il segnale si
|
|
31649
|
+
* rialza da li' quando arriva la risposta vera. Il contratto degli altri casi non
|
|
31650
|
+
* cambia: popup (`config.data`, senza subscribe) e promptDialog (senza `fetchInfo$`)
|
|
31651
|
+
* non ricevono mai questo `null`; un inserimento raggiunto navigando riparte da
|
|
31652
|
+
* "false" e si rialza con la sua risposta vuota, come gia' prevedeva la formula; una
|
|
31653
|
+
* form senza record era gia' a "false".
|
|
31654
|
+
*/
|
|
31655
|
+
segnalaRecordNonCaricato() {
|
|
31656
|
+
try {
|
|
31657
|
+
this.hostElementRef?.nativeElement?.setAttribute('data-record-loaded', 'false');
|
|
31658
|
+
}
|
|
31659
|
+
catch { /* ambiente senza DOM */ }
|
|
31445
31660
|
}
|
|
31446
31661
|
/**
|
|
31447
31662
|
* In modalita wizard forza una singola riallocazione del current record sul datasource
|
|
@@ -34272,6 +34487,9 @@ class NotificationRealtimeService {
|
|
|
34272
34487
|
route: String(payload?.route || '').trim() || undefined,
|
|
34273
34488
|
totalRecords: Number.isFinite(Number(payload?.totalRecords))
|
|
34274
34489
|
? Number(payload?.totalRecords)
|
|
34490
|
+
: null,
|
|
34491
|
+
queuePosition: Number(payload?.queuePosition) > 0
|
|
34492
|
+
? Math.floor(Number(payload?.queuePosition))
|
|
34275
34493
|
: null
|
|
34276
34494
|
};
|
|
34277
34495
|
this.progressEvents$.next(event);
|
|
@@ -34472,6 +34690,9 @@ class ImportExportButtonComponent {
|
|
|
34472
34690
|
trslSrv;
|
|
34473
34691
|
userInfo;
|
|
34474
34692
|
cdr;
|
|
34693
|
+
/** Handle di ispezione per i test e2e (attivo solo in dev o con __wuicE2E): in build di
|
|
34694
|
+
* produzione `window.ng` non c'e' e i test leggono lo stato dei dialog import/export da qui. */
|
|
34695
|
+
wuicCmpHandle = exposeWuicCmpOnHost(this);
|
|
34475
34696
|
routeName = '';
|
|
34476
34697
|
tableMetadata = null;
|
|
34477
34698
|
/**
|
|
@@ -34502,7 +34723,7 @@ class ImportExportButtonComponent {
|
|
|
34502
34723
|
import_type: 'I',
|
|
34503
34724
|
commit_level: 'R',
|
|
34504
34725
|
use_column_captions: 'C',
|
|
34505
|
-
|
|
34726
|
+
fkey_mode: 'description',
|
|
34506
34727
|
separator: ';',
|
|
34507
34728
|
allowedExtensions: ['xls', 'xlsx']
|
|
34508
34729
|
};
|
|
@@ -34823,9 +35044,23 @@ class ImportExportButtonComponent {
|
|
|
34823
35044
|
if (this.exportProgressTotalRecords <= 0 && Number.isFinite(totalFromEvent) && totalFromEvent > 0) {
|
|
34824
35045
|
this.exportProgressTotalRecords = Math.floor(totalFromEvent);
|
|
34825
35046
|
}
|
|
35047
|
+
const queuePosition = Number(evt?.queuePosition);
|
|
35048
|
+
if (queuePosition > 0) {
|
|
35049
|
+
this.applyExportQueuePosition(queuePosition);
|
|
35050
|
+
return;
|
|
35051
|
+
}
|
|
34826
35052
|
this.applyExportProgressValue(progress);
|
|
34827
35053
|
});
|
|
34828
35054
|
}
|
|
35055
|
+
/** Il server ha gia' il massimo di export in corso: questo aspetta il suo turno. */
|
|
35056
|
+
applyExportQueuePosition(position) {
|
|
35057
|
+
this.exportProgressValue = 0;
|
|
35058
|
+
this.exportProgressDetail = this.trslSrv.format(this.t('import_export.export_queued_{0}', "In coda: posizione {0}. L'export parte appena si libera un posto."), String(Math.floor(position)));
|
|
35059
|
+
try {
|
|
35060
|
+
this.cdr.detectChanges();
|
|
35061
|
+
}
|
|
35062
|
+
catch { /* host destroyed mid-export */ }
|
|
35063
|
+
}
|
|
34829
35064
|
stopExportProgressPolling() {
|
|
34830
35065
|
this.exportProgressWsSubscription?.unsubscribe();
|
|
34831
35066
|
this.exportProgressWsSubscription = undefined;
|
|
@@ -34891,6 +35126,14 @@ class ImportExportButtonComponent {
|
|
|
34891
35126
|
this.exportProgressDialogVisible = true;
|
|
34892
35127
|
this.startExportProgressPolling(guid);
|
|
34893
35128
|
}
|
|
35129
|
+
/** extraProps.import.fkey_mode, altrimenti il booleano storico use_descriptive_fkey (default descrizione). */
|
|
35130
|
+
resolveFkeyMode(importCfg) {
|
|
35131
|
+
const mode = String(importCfg?.fkey_mode || '').trim().toLowerCase();
|
|
35132
|
+
if (mode === 'key' || mode === 'description' || mode === 'both') {
|
|
35133
|
+
return mode;
|
|
35134
|
+
}
|
|
35135
|
+
return importCfg?.use_descriptive_fkey === false ? 'key' : 'description';
|
|
35136
|
+
}
|
|
34894
35137
|
getImportConfigFromMetadata() {
|
|
34895
35138
|
return (this.tableMetadata?.extraProps)?.import || {};
|
|
34896
35139
|
}
|
|
@@ -34907,7 +35150,7 @@ class ImportExportButtonComponent {
|
|
|
34907
35150
|
import_type: String(importCfg?.import_type || 'I').trim() || 'I',
|
|
34908
35151
|
commit_level: String(importCfg?.commit_level || 'R').trim() || 'R',
|
|
34909
35152
|
use_column_captions: String(importCfg?.use_column_captions || 'C').trim() || 'C',
|
|
34910
|
-
|
|
35153
|
+
fkey_mode: this.resolveFkeyMode(importCfg),
|
|
34911
35154
|
separator: String(importCfg?.separator || ';') || ';',
|
|
34912
35155
|
allowedExtensions: allowedExtensions.length ? allowedExtensions : ['xls', 'xlsx']
|
|
34913
35156
|
};
|
|
@@ -35033,7 +35276,9 @@ class ImportExportButtonComponent {
|
|
|
35033
35276
|
appendOpt('import_type', this.importOptionsForm.import_type || 'I');
|
|
35034
35277
|
appendOpt('commit_level', this.importOptionsForm.commit_level || 'R');
|
|
35035
35278
|
appendOpt('use_column_captions', this.importOptionsForm.use_column_captions || 'C');
|
|
35036
|
-
appendOpt('
|
|
35279
|
+
appendOpt('fkey_mode', this.importOptionsForm.fkey_mode || 'description');
|
|
35280
|
+
// Per i backend che non conoscono fkey_mode: 'both' e 'description' sono descrittivi.
|
|
35281
|
+
appendOpt('use_descriptive_fkey', (this.importOptionsForm.fkey_mode || 'description') !== 'key');
|
|
35037
35282
|
appendOpt('separator', this.importOptionsForm.separator || ';');
|
|
35038
35283
|
appendOpt('route_context_json', JSON.stringify(WtoolboxService.buildCrudRouteContext(routeName, 'import', 'ImportExportButton.importFile')));
|
|
35039
35284
|
const response = await fetch(uploadEndpoint, {
|
|
@@ -35274,11 +35519,11 @@ class ImportExportButtonComponent {
|
|
|
35274
35519
|
this.importProgressWsSubscription = undefined;
|
|
35275
35520
|
}
|
|
35276
35521
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ImportExportButtonComponent, deps: [{ token: i1$2.ActivatedRoute }, { token: DataProviderService }, { token: DataProviderMetaService }, { token: NotificationRealtimeService }, { token: TranslationManagerService }, { token: UserInfoService }, { token: i0.ChangeDetectorRef }], target: i0.ɵɵFactoryTarget.Component });
|
|
35277
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: ImportExportButtonComponent, isStandalone: true, selector: "wuic-import-export-button", inputs: { routeName: "routeName", tableMetadata: "tableMetadata", filterInfoProvider: "filterInfoProvider" }, host: { listeners: { "window:wuic-export-progress-resume": "onExportProgressResumeEvent($event)", "window:wuic-import-progress-resume": "onImportProgressResumeEvent($event)" } }, viewQueries: [{ propertyName: "importFileInputRef", first: true, predicate: ["importFileInput"], descendants: true }], ngImport: i0, template: "@if (hasAnyAction) {\r\n@if (hasBothActions) {\r\n<p-button [label]=\"label\" [icon]=\"icon\" (onClick)=\"toggleMenu($event, importExportMenu)\" />\r\n<p-menu #importExportMenu [popup]=\"true\" [model]=\"popupMenuItems\" appendTo=\"body\"></p-menu>\r\n} @else {\r\n<p-button [label]=\"label\" [icon]=\"icon\" (onClick)=\"onPrimaryClick()\" />\r\n}\r\n@if (canImportXls) {\r\n<input #importFileInput type=\"file\"\r\n accept=\".xls,.xlsx,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\"\r\n style=\"display: none;\" (change)=\"onImportFileSelected($event)\" />\r\n}\r\n}\r\n\r\n<p-dialog [header]=\"'import_export.import_dialog_title' | translate\" [(visible)]=\"importDialogVisible\" [modal]=\"true\" [closable]=\"true\"\r\n [style]=\"{ width: '34rem', maxWidth: '95vw' }\">\r\n <div class=\"wuic-import-dialog\">\r\n <div class=\"wuic-import-grid\">\r\n <label for=\"wuic-import-type\">{{ 'import_export.import_type' | translate }}</label>\r\n <select id=\"wuic-import-type\" class=\"p-inputtext p-component\" [(ngModel)]=\"importOptionsForm.import_type\">\r\n <option value=\"I\">{{ 'import_export.import_type_i' | translate }}</option>\r\n <option value=\"U\">{{ 'import_export.import_type_u' | translate }}</option>\r\n <option value=\"IU\">{{ 'import_export.import_type_iu' | translate }}</option>\r\n </select>\r\n\r\n <label for=\"wuic-import-commit-level\">{{ 'import_export.commit_level' | translate }}</label>\r\n <select id=\"wuic-import-commit-level\" class=\"p-inputtext p-component\" [(ngModel)]=\"importOptionsForm.commit_level\">\r\n <option value=\"R\">{{ 'import_export.commit_level_r' | translate }}</option>\r\n <option value=\"I\">{{ 'import_export.commit_level_i' | translate }}</option>\r\n <option value=\"C\">{{ 'import_export.commit_level_c' | translate }}</option>\r\n <option value=\"T\">{{ 'import_export.commit_level_t' | translate }}</option>\r\n </select>\r\n\r\n <label for=\"wuic-import-use-column-captions\">{{ 'import_export.use_column_captions' | translate }}</label>\r\n <select id=\"wuic-import-use-column-captions\" class=\"p-inputtext p-component\" [(ngModel)]=\"importOptionsForm.use_column_captions\">\r\n <option value=\"N\">{{ 'import_export.use_column_captions_n' | translate }}</option>\r\n <option value=\"C\">{{ 'import_export.use_column_captions_c' | translate }}</option>\r\n </select>\r\n\r\n <label for=\"wuic-import-separator\">{{ 'import_export.separator' | translate }}</label>\r\n <input id=\"wuic-import-separator\" type=\"text\" pInputText [(ngModel)]=\"importOptionsForm.separator\" />\r\n </div>\r\n\r\n <label class=\"wuic-column-layout-check\">\r\n <input type=\"checkbox\" [(ngModel)]=\"importOptionsForm.use_descriptive_fkey\" />\r\n <span>{{ 'import_export.use_descriptive_fkey' | translate }}</span>\r\n </label>\r\n\r\n <div class=\"wuic-import-file-row\">\r\n <p-button icon=\"pi pi-paperclip\" [label]=\"'import_export.select_file' | translate\" [outlined]=\"true\" (onClick)=\"triggerImportFileSelection()\" />\r\n <span>{{ importSelectedFileName || ('import_export.no_file_selected' | translate) }}</span>\r\n </div>\r\n </div>\r\n\r\n <ng-template pTemplate=\"footer\">\r\n <p-button [label]=\"'cancel' | translate\" [outlined]=\"true\" [disabled]=\"importDialogBusy\"\r\n (onClick)=\"importDialogVisible = false\" />\r\n <p-button [label]=\"'import_export.confirm_import' | translate\" [disabled]=\"importDialogBusy || !importSelectedFileName\"\r\n (onClick)=\"confirmImportDialog()\" />\r\n </ng-template>\r\n</p-dialog>\r\n\r\n<p-dialog [header]=\"'import_export.import_progress_title' | translate\" [(visible)]=\"importProgressDialogVisible\" [modal]=\"true\" [closable]=\"false\"\r\n [draggable]=\"false\" [resizable]=\"false\" [style]=\"{ width: '30rem', maxWidth: '95vw' }\"\r\n styleClass=\"wuic-progress-dialog\">\r\n <div class=\"wuic-export-progress-dialog\">\r\n <p-progressbar [value]=\"importProgressValue\"></p-progressbar>\r\n <div class=\"wuic-export-progress-detail\">{{ importProgressDetail }}</div>\r\n </div>\r\n <ng-template pTemplate=\"footer\">\r\n <p-button [label]=\"'import_export.continue_in_background' | translate\" [outlined]=\"true\" [disabled]=\"importControlBusy\"\r\n (onClick)=\"continueImportInBackground()\" />\r\n <p-button [label]=\"'import_export.cancel_import_rollback' | translate\" severity=\"danger\" [outlined]=\"true\" [disabled]=\"importControlBusy\"\r\n (onClick)=\"cancelImportTaskFromDialog()\" />\r\n <p-button [label]=\"'import_export.stop_commit_partial' | translate\" [disabled]=\"importControlBusy\"\r\n (onClick)=\"stopImportAndCommitFromDialog()\" />\r\n </ng-template>\r\n</p-dialog>\r\n\r\n<p-dialog [header]=\"'import_export.export_progress_title' | translate\" [(visible)]=\"exportProgressDialogVisible\" [modal]=\"true\" [closable]=\"false\"\r\n [draggable]=\"false\" [resizable]=\"false\" [style]=\"{ width: '30rem', maxWidth: '95vw' }\"\r\n styleClass=\"wuic-progress-dialog\">\r\n <div class=\"wuic-export-progress-dialog\">\r\n <p-progressbar [value]=\"exportProgressValue\"></p-progressbar>\r\n <div class=\"wuic-export-progress-detail\">{{ exportProgressDetail }}</div>\r\n </div>\r\n <ng-template pTemplate=\"footer\">\r\n <p-button [label]=\"'import_export.continue_in_background' | translate\" [outlined]=\"true\" [disabled]=\"exportControlBusy\"\r\n (onClick)=\"continueExportInBackground()\" />\r\n <p-button [label]=\"'import_export.cancel_task' | translate\" severity=\"danger\" [outlined]=\"true\" [disabled]=\"exportControlBusy\"\r\n (onClick)=\"cancelExportTaskFromDialog()\" />\r\n <p-button [label]=\"'import_export.stop_download_partial' | translate\" [disabled]=\"exportControlBusy\"\r\n (onClick)=\"stopExportAndDownloadPartialFromDialog()\" />\r\n </ng-template>\r\n</p-dialog>\r\n", styles: [".wuic-export-progress-dialog{display:flex;flex-direction:column;gap:.65rem}::ng-deep .wuic-progress-dialog .p-progressbar{--p-progressbar-value-transition: none}::ng-deep .wuic-progress-dialog .p-progressbar .p-progressbar-value,::ng-deep .wuic-progress-dialog .p-progressbar-value,:host ::ng-deep .wuic-export-progress-dialog .p-progressbar .p-progressbar-value,:host ::ng-deep .wuic-export-progress-dialog .p-progressbar-value{transition:none!important;animation:none!important}.wuic-export-progress-detail{font-size:.9rem;font-weight:600;text-align:right}.wuic-import-dialog{display:flex;flex-direction:column;gap:.75rem}.wuic-import-grid{display:grid;grid-template-columns:1fr;gap:.35rem}.wuic-import-file-row{display:flex;align-items:center;gap:.65rem}\n"], dependencies: [{ kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i4.Button, selector: "p-button", inputs: ["hostName", "type", "badge", "disabled", "raised", "rounded", "text", "plain", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "iconPos", "icon", "label", "loading", "loadingIcon", "severity", "buttonProps", "fluid"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "directive", type: i3.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "ngmodule", type: MenuModule }, { kind: "component", type: i7$1.Menu, selector: "p-menu", inputs: ["model", "popup", "style", "styleClass", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "ariaLabel", "ariaLabelledBy", "id", "tabindex", "appendTo", "motionOptions"], outputs: ["onShow", "onHide", "onBlur", "onFocus"] }, { kind: "ngmodule", type: DialogModule }, { kind: "component", type: i2.Dialog, selector: "p-dialog", inputs: ["hostName", "header", "draggable", "resizable", "contentStyle", "contentStyleClass", "modal", "closeOnEscape", "dismissableMask", "rtl", "closable", "breakpoints", "styleClass", "maskStyleClass", "maskStyle", "showHeader", "blockScroll", "autoZIndex", "baseZIndex", "minX", "minY", "focusOnShow", "maximizable", "keepInViewport", "focusTrap", "transitionOptions", "maskMotionOptions", "motionOptions", "closeIcon", "closeAriaLabel", "closeTabindex", "minimizeIcon", "maximizeIcon", "closeButtonProps", "maximizeButtonProps", "visible", "style", "position", "role", "appendTo", "content", "contentTemplate", "footerTemplate", "closeIconTemplate", "maximizeIconTemplate", "minimizeIconTemplate", "headlessTemplate"], outputs: ["onShow", "onHide", "visibleChange", "onResizeInit", "onResizeEnd", "onDragEnd", "onMaximize"] }, { kind: "ngmodule", type: ProgressBarModule }, { kind: "component", type: i6$3.ProgressBar, selector: "p-progressBar, p-progressbar, p-progress-bar", inputs: ["value", "showValue", "styleClass", "valueStyleClass", "unit", "mode", "color"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$3.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1$3.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1$3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$3.CheckboxControlValueAccessor, selector: "input[type=checkbox][formControlName],input[type=checkbox][formControl],input[type=checkbox][ngModel]" }, { kind: "directive", type: i1$3.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1$3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: InputTextModule }, { kind: "directive", type: i3$2.InputText, selector: "[pInputText]", inputs: ["hostName", "ptInputText", "pInputTextPT", "pInputTextUnstyled", "pSize", "variant", "fluid", "invalid"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i8.TranslatePipe, name: "translate" }] });
|
|
35522
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: ImportExportButtonComponent, isStandalone: true, selector: "wuic-import-export-button", inputs: { routeName: "routeName", tableMetadata: "tableMetadata", filterInfoProvider: "filterInfoProvider" }, host: { listeners: { "window:wuic-export-progress-resume": "onExportProgressResumeEvent($event)", "window:wuic-import-progress-resume": "onImportProgressResumeEvent($event)" } }, viewQueries: [{ propertyName: "importFileInputRef", first: true, predicate: ["importFileInput"], descendants: true }], ngImport: i0, template: "@if (hasAnyAction) {\r\n@if (hasBothActions) {\r\n<p-button [label]=\"label\" [icon]=\"icon\" (onClick)=\"toggleMenu($event, importExportMenu)\" />\r\n<p-menu #importExportMenu [popup]=\"true\" [model]=\"popupMenuItems\" appendTo=\"body\"></p-menu>\r\n} @else {\r\n<p-button [label]=\"label\" [icon]=\"icon\" (onClick)=\"onPrimaryClick()\" />\r\n}\r\n@if (canImportXls) {\r\n<input #importFileInput type=\"file\"\r\n accept=\".xls,.xlsx,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\"\r\n style=\"display: none;\" (change)=\"onImportFileSelected($event)\" />\r\n}\r\n}\r\n\r\n<p-dialog [header]=\"'import_export.import_dialog_title' | translate\" [(visible)]=\"importDialogVisible\" [modal]=\"true\" [closable]=\"true\"\r\n [style]=\"{ width: '34rem', maxWidth: '95vw' }\">\r\n <div class=\"wuic-import-dialog\">\r\n <div class=\"wuic-import-grid\">\r\n <label for=\"wuic-import-type\">{{ 'import_export.import_type' | translate }}</label>\r\n <select id=\"wuic-import-type\" class=\"p-inputtext p-component\" [(ngModel)]=\"importOptionsForm.import_type\">\r\n <option value=\"I\">{{ 'import_export.import_type_i' | translate }}</option>\r\n <option value=\"U\">{{ 'import_export.import_type_u' | translate }}</option>\r\n <option value=\"IU\">{{ 'import_export.import_type_iu' | translate }}</option>\r\n </select>\r\n\r\n <label for=\"wuic-import-commit-level\">{{ 'import_export.commit_level' | translate }}</label>\r\n <select id=\"wuic-import-commit-level\" class=\"p-inputtext p-component\" [(ngModel)]=\"importOptionsForm.commit_level\">\r\n <option value=\"R\">{{ 'import_export.commit_level_r' | translate }}</option>\r\n <option value=\"I\">{{ 'import_export.commit_level_i' | translate }}</option>\r\n <option value=\"C\">{{ 'import_export.commit_level_c' | translate }}</option>\r\n <option value=\"T\">{{ 'import_export.commit_level_t' | translate }}</option>\r\n </select>\r\n\r\n <label for=\"wuic-import-use-column-captions\">{{ 'import_export.use_column_captions' | translate }}</label>\r\n <select id=\"wuic-import-use-column-captions\" class=\"p-inputtext p-component\" [(ngModel)]=\"importOptionsForm.use_column_captions\">\r\n <option value=\"N\">{{ 'import_export.use_column_captions_n' | translate }}</option>\r\n <option value=\"C\">{{ 'import_export.use_column_captions_c' | translate }}</option>\r\n </select>\r\n\r\n <label for=\"wuic-import-separator\">{{ 'import_export.separator' | translate }}</label>\r\n <input id=\"wuic-import-separator\" type=\"text\" pInputText [(ngModel)]=\"importOptionsForm.separator\" />\r\n\r\n <label for=\"wuic-import-fkey-mode\">{{ 'import_export.fkey_mode' | translate }}</label>\r\n <select id=\"wuic-import-fkey-mode\" class=\"p-inputtext p-component\" [(ngModel)]=\"importOptionsForm.fkey_mode\">\r\n <option value=\"description\">{{ 'import_export.fkey_mode_description' | translate }}</option>\r\n <option value=\"key\">{{ 'import_export.fkey_mode_key' | translate }}</option>\r\n <option value=\"both\">{{ 'import_export.fkey_mode_both' | translate }}</option>\r\n </select>\r\n </div>\r\n\r\n <div class=\"wuic-import-file-row\">\r\n <p-button icon=\"pi pi-paperclip\" [label]=\"'import_export.select_file' | translate\" [outlined]=\"true\" (onClick)=\"triggerImportFileSelection()\" />\r\n <span>{{ importSelectedFileName || ('import_export.no_file_selected' | translate) }}</span>\r\n </div>\r\n </div>\r\n\r\n <ng-template pTemplate=\"footer\">\r\n <p-button [label]=\"'cancel' | translate\" [outlined]=\"true\" [disabled]=\"importDialogBusy\"\r\n (onClick)=\"importDialogVisible = false\" />\r\n <p-button [label]=\"'import_export.confirm_import' | translate\" [disabled]=\"importDialogBusy || !importSelectedFileName\"\r\n (onClick)=\"confirmImportDialog()\" />\r\n </ng-template>\r\n</p-dialog>\r\n\r\n<p-dialog [header]=\"'import_export.import_progress_title' | translate\" [(visible)]=\"importProgressDialogVisible\" [modal]=\"true\" [closable]=\"false\"\r\n [draggable]=\"false\" [resizable]=\"false\" [style]=\"{ width: '30rem', maxWidth: '95vw' }\"\r\n styleClass=\"wuic-progress-dialog\">\r\n <div class=\"wuic-export-progress-dialog\">\r\n <p-progressbar [value]=\"importProgressValue\"></p-progressbar>\r\n <div class=\"wuic-export-progress-detail\">{{ importProgressDetail }}</div>\r\n </div>\r\n <ng-template pTemplate=\"footer\">\r\n <p-button [label]=\"'import_export.continue_in_background' | translate\" [outlined]=\"true\" [disabled]=\"importControlBusy\"\r\n (onClick)=\"continueImportInBackground()\" />\r\n <p-button [label]=\"'import_export.cancel_import_rollback' | translate\" severity=\"danger\" [outlined]=\"true\" [disabled]=\"importControlBusy\"\r\n (onClick)=\"cancelImportTaskFromDialog()\" />\r\n <p-button [label]=\"'import_export.stop_commit_partial' | translate\" [disabled]=\"importControlBusy\"\r\n (onClick)=\"stopImportAndCommitFromDialog()\" />\r\n </ng-template>\r\n</p-dialog>\r\n\r\n<p-dialog [header]=\"'import_export.export_progress_title' | translate\" [(visible)]=\"exportProgressDialogVisible\" [modal]=\"true\" [closable]=\"false\"\r\n [draggable]=\"false\" [resizable]=\"false\" [style]=\"{ width: '30rem', maxWidth: '95vw' }\"\r\n styleClass=\"wuic-progress-dialog\">\r\n <div class=\"wuic-export-progress-dialog\">\r\n <p-progressbar [value]=\"exportProgressValue\"></p-progressbar>\r\n <div class=\"wuic-export-progress-detail\">{{ exportProgressDetail }}</div>\r\n </div>\r\n <ng-template pTemplate=\"footer\">\r\n <p-button [label]=\"'import_export.continue_in_background' | translate\" [outlined]=\"true\" [disabled]=\"exportControlBusy\"\r\n (onClick)=\"continueExportInBackground()\" />\r\n <p-button [label]=\"'import_export.cancel_task' | translate\" severity=\"danger\" [outlined]=\"true\" [disabled]=\"exportControlBusy\"\r\n (onClick)=\"cancelExportTaskFromDialog()\" />\r\n <p-button [label]=\"'import_export.stop_download_partial' | translate\" [disabled]=\"exportControlBusy\"\r\n (onClick)=\"stopExportAndDownloadPartialFromDialog()\" />\r\n </ng-template>\r\n</p-dialog>\r\n", styles: [".wuic-export-progress-dialog{display:flex;flex-direction:column;gap:.65rem}::ng-deep .wuic-progress-dialog .p-progressbar{--p-progressbar-value-transition: none}::ng-deep .wuic-progress-dialog .p-progressbar .p-progressbar-value,::ng-deep .wuic-progress-dialog .p-progressbar-value,:host ::ng-deep .wuic-export-progress-dialog .p-progressbar .p-progressbar-value,:host ::ng-deep .wuic-export-progress-dialog .p-progressbar-value{transition:none!important;animation:none!important}.wuic-export-progress-detail{font-size:.9rem;font-weight:600;text-align:right}.wuic-import-dialog{display:flex;flex-direction:column;gap:.75rem}.wuic-import-grid{display:grid;grid-template-columns:1fr;gap:.35rem}.wuic-import-file-row{display:flex;align-items:center;gap:.65rem}\n"], dependencies: [{ kind: "ngmodule", type: ButtonModule }, { kind: "component", type: i4.Button, selector: "p-button", inputs: ["hostName", "type", "badge", "disabled", "raised", "rounded", "text", "plain", "outlined", "link", "tabindex", "size", "variant", "style", "styleClass", "badgeClass", "badgeSeverity", "ariaLabel", "autofocus", "iconPos", "icon", "label", "loading", "loadingIcon", "severity", "buttonProps", "fluid"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "directive", type: i3.PrimeTemplate, selector: "[pTemplate]", inputs: ["type", "pTemplate"] }, { kind: "ngmodule", type: MenuModule }, { kind: "component", type: i7$1.Menu, selector: "p-menu", inputs: ["model", "popup", "style", "styleClass", "autoZIndex", "baseZIndex", "showTransitionOptions", "hideTransitionOptions", "ariaLabel", "ariaLabelledBy", "id", "tabindex", "appendTo", "motionOptions"], outputs: ["onShow", "onHide", "onBlur", "onFocus"] }, { kind: "ngmodule", type: DialogModule }, { kind: "component", type: i2.Dialog, selector: "p-dialog", inputs: ["hostName", "header", "draggable", "resizable", "contentStyle", "contentStyleClass", "modal", "closeOnEscape", "dismissableMask", "rtl", "closable", "breakpoints", "styleClass", "maskStyleClass", "maskStyle", "showHeader", "blockScroll", "autoZIndex", "baseZIndex", "minX", "minY", "focusOnShow", "maximizable", "keepInViewport", "focusTrap", "transitionOptions", "maskMotionOptions", "motionOptions", "closeIcon", "closeAriaLabel", "closeTabindex", "minimizeIcon", "maximizeIcon", "closeButtonProps", "maximizeButtonProps", "visible", "style", "position", "role", "appendTo", "content", "contentTemplate", "footerTemplate", "closeIconTemplate", "maximizeIconTemplate", "minimizeIconTemplate", "headlessTemplate"], outputs: ["onShow", "onHide", "visibleChange", "onResizeInit", "onResizeEnd", "onDragEnd", "onMaximize"] }, { kind: "ngmodule", type: ProgressBarModule }, { kind: "component", type: i6$3.ProgressBar, selector: "p-progressBar, p-progressbar, p-progress-bar", inputs: ["value", "showValue", "styleClass", "valueStyleClass", "unit", "mode", "color"] }, { kind: "ngmodule", type: FormsModule }, { kind: "directive", type: i1$3.NgSelectOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1$3.ɵNgSelectMultipleOption, selector: "option", inputs: ["ngValue", "value"] }, { kind: "directive", type: i1$3.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { kind: "directive", type: i1$3.SelectControlValueAccessor, selector: "select:not([multiple])[formControlName],select:not([multiple])[formControl],select:not([multiple])[ngModel]", inputs: ["compareWith"] }, { kind: "directive", type: i1$3.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i1$3.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "ngmodule", type: InputTextModule }, { kind: "directive", type: i3$2.InputText, selector: "[pInputText]", inputs: ["hostName", "ptInputText", "pInputTextPT", "pInputTextUnstyled", "pSize", "variant", "fluid", "invalid"] }, { kind: "ngmodule", type: TranslateModule }, { kind: "pipe", type: i8.TranslatePipe, name: "translate" }] });
|
|
35278
35523
|
}
|
|
35279
35524
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ImportExportButtonComponent, decorators: [{
|
|
35280
35525
|
type: Component,
|
|
35281
|
-
args: [{ selector: 'wuic-import-export-button', imports: [ButtonModule, MenuModule, DialogModule, ProgressBarModule, FormsModule, InputTextModule, TranslateModule], template: "@if (hasAnyAction) {\r\n@if (hasBothActions) {\r\n<p-button [label]=\"label\" [icon]=\"icon\" (onClick)=\"toggleMenu($event, importExportMenu)\" />\r\n<p-menu #importExportMenu [popup]=\"true\" [model]=\"popupMenuItems\" appendTo=\"body\"></p-menu>\r\n} @else {\r\n<p-button [label]=\"label\" [icon]=\"icon\" (onClick)=\"onPrimaryClick()\" />\r\n}\r\n@if (canImportXls) {\r\n<input #importFileInput type=\"file\"\r\n accept=\".xls,.xlsx,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\"\r\n style=\"display: none;\" (change)=\"onImportFileSelected($event)\" />\r\n}\r\n}\r\n\r\n<p-dialog [header]=\"'import_export.import_dialog_title' | translate\" [(visible)]=\"importDialogVisible\" [modal]=\"true\" [closable]=\"true\"\r\n [style]=\"{ width: '34rem', maxWidth: '95vw' }\">\r\n <div class=\"wuic-import-dialog\">\r\n <div class=\"wuic-import-grid\">\r\n <label for=\"wuic-import-type\">{{ 'import_export.import_type' | translate }}</label>\r\n <select id=\"wuic-import-type\" class=\"p-inputtext p-component\" [(ngModel)]=\"importOptionsForm.import_type\">\r\n <option value=\"I\">{{ 'import_export.import_type_i' | translate }}</option>\r\n <option value=\"U\">{{ 'import_export.import_type_u' | translate }}</option>\r\n <option value=\"IU\">{{ 'import_export.import_type_iu' | translate }}</option>\r\n </select>\r\n\r\n <label for=\"wuic-import-commit-level\">{{ 'import_export.commit_level' | translate }}</label>\r\n <select id=\"wuic-import-commit-level\" class=\"p-inputtext p-component\" [(ngModel)]=\"importOptionsForm.commit_level\">\r\n <option value=\"R\">{{ 'import_export.commit_level_r' | translate }}</option>\r\n <option value=\"I\">{{ 'import_export.commit_level_i' | translate }}</option>\r\n <option value=\"C\">{{ 'import_export.commit_level_c' | translate }}</option>\r\n <option value=\"T\">{{ 'import_export.commit_level_t' | translate }}</option>\r\n </select>\r\n\r\n <label for=\"wuic-import-use-column-captions\">{{ 'import_export.use_column_captions' | translate }}</label>\r\n <select id=\"wuic-import-use-column-captions\" class=\"p-inputtext p-component\" [(ngModel)]=\"importOptionsForm.use_column_captions\">\r\n <option value=\"N\">{{ 'import_export.use_column_captions_n' | translate }}</option>\r\n <option value=\"C\">{{ 'import_export.use_column_captions_c' | translate }}</option>\r\n </select>\r\n\r\n <label for=\"wuic-import-separator\">{{ 'import_export.separator' | translate }}</label>\r\n <input id=\"wuic-import-separator\" type=\"text\" pInputText [(ngModel)]=\"importOptionsForm.separator\" />\r\n
|
|
35526
|
+
args: [{ selector: 'wuic-import-export-button', imports: [ButtonModule, MenuModule, DialogModule, ProgressBarModule, FormsModule, InputTextModule, TranslateModule], template: "@if (hasAnyAction) {\r\n@if (hasBothActions) {\r\n<p-button [label]=\"label\" [icon]=\"icon\" (onClick)=\"toggleMenu($event, importExportMenu)\" />\r\n<p-menu #importExportMenu [popup]=\"true\" [model]=\"popupMenuItems\" appendTo=\"body\"></p-menu>\r\n} @else {\r\n<p-button [label]=\"label\" [icon]=\"icon\" (onClick)=\"onPrimaryClick()\" />\r\n}\r\n@if (canImportXls) {\r\n<input #importFileInput type=\"file\"\r\n accept=\".xls,.xlsx,application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet\"\r\n style=\"display: none;\" (change)=\"onImportFileSelected($event)\" />\r\n}\r\n}\r\n\r\n<p-dialog [header]=\"'import_export.import_dialog_title' | translate\" [(visible)]=\"importDialogVisible\" [modal]=\"true\" [closable]=\"true\"\r\n [style]=\"{ width: '34rem', maxWidth: '95vw' }\">\r\n <div class=\"wuic-import-dialog\">\r\n <div class=\"wuic-import-grid\">\r\n <label for=\"wuic-import-type\">{{ 'import_export.import_type' | translate }}</label>\r\n <select id=\"wuic-import-type\" class=\"p-inputtext p-component\" [(ngModel)]=\"importOptionsForm.import_type\">\r\n <option value=\"I\">{{ 'import_export.import_type_i' | translate }}</option>\r\n <option value=\"U\">{{ 'import_export.import_type_u' | translate }}</option>\r\n <option value=\"IU\">{{ 'import_export.import_type_iu' | translate }}</option>\r\n </select>\r\n\r\n <label for=\"wuic-import-commit-level\">{{ 'import_export.commit_level' | translate }}</label>\r\n <select id=\"wuic-import-commit-level\" class=\"p-inputtext p-component\" [(ngModel)]=\"importOptionsForm.commit_level\">\r\n <option value=\"R\">{{ 'import_export.commit_level_r' | translate }}</option>\r\n <option value=\"I\">{{ 'import_export.commit_level_i' | translate }}</option>\r\n <option value=\"C\">{{ 'import_export.commit_level_c' | translate }}</option>\r\n <option value=\"T\">{{ 'import_export.commit_level_t' | translate }}</option>\r\n </select>\r\n\r\n <label for=\"wuic-import-use-column-captions\">{{ 'import_export.use_column_captions' | translate }}</label>\r\n <select id=\"wuic-import-use-column-captions\" class=\"p-inputtext p-component\" [(ngModel)]=\"importOptionsForm.use_column_captions\">\r\n <option value=\"N\">{{ 'import_export.use_column_captions_n' | translate }}</option>\r\n <option value=\"C\">{{ 'import_export.use_column_captions_c' | translate }}</option>\r\n </select>\r\n\r\n <label for=\"wuic-import-separator\">{{ 'import_export.separator' | translate }}</label>\r\n <input id=\"wuic-import-separator\" type=\"text\" pInputText [(ngModel)]=\"importOptionsForm.separator\" />\r\n\r\n <label for=\"wuic-import-fkey-mode\">{{ 'import_export.fkey_mode' | translate }}</label>\r\n <select id=\"wuic-import-fkey-mode\" class=\"p-inputtext p-component\" [(ngModel)]=\"importOptionsForm.fkey_mode\">\r\n <option value=\"description\">{{ 'import_export.fkey_mode_description' | translate }}</option>\r\n <option value=\"key\">{{ 'import_export.fkey_mode_key' | translate }}</option>\r\n <option value=\"both\">{{ 'import_export.fkey_mode_both' | translate }}</option>\r\n </select>\r\n </div>\r\n\r\n <div class=\"wuic-import-file-row\">\r\n <p-button icon=\"pi pi-paperclip\" [label]=\"'import_export.select_file' | translate\" [outlined]=\"true\" (onClick)=\"triggerImportFileSelection()\" />\r\n <span>{{ importSelectedFileName || ('import_export.no_file_selected' | translate) }}</span>\r\n </div>\r\n </div>\r\n\r\n <ng-template pTemplate=\"footer\">\r\n <p-button [label]=\"'cancel' | translate\" [outlined]=\"true\" [disabled]=\"importDialogBusy\"\r\n (onClick)=\"importDialogVisible = false\" />\r\n <p-button [label]=\"'import_export.confirm_import' | translate\" [disabled]=\"importDialogBusy || !importSelectedFileName\"\r\n (onClick)=\"confirmImportDialog()\" />\r\n </ng-template>\r\n</p-dialog>\r\n\r\n<p-dialog [header]=\"'import_export.import_progress_title' | translate\" [(visible)]=\"importProgressDialogVisible\" [modal]=\"true\" [closable]=\"false\"\r\n [draggable]=\"false\" [resizable]=\"false\" [style]=\"{ width: '30rem', maxWidth: '95vw' }\"\r\n styleClass=\"wuic-progress-dialog\">\r\n <div class=\"wuic-export-progress-dialog\">\r\n <p-progressbar [value]=\"importProgressValue\"></p-progressbar>\r\n <div class=\"wuic-export-progress-detail\">{{ importProgressDetail }}</div>\r\n </div>\r\n <ng-template pTemplate=\"footer\">\r\n <p-button [label]=\"'import_export.continue_in_background' | translate\" [outlined]=\"true\" [disabled]=\"importControlBusy\"\r\n (onClick)=\"continueImportInBackground()\" />\r\n <p-button [label]=\"'import_export.cancel_import_rollback' | translate\" severity=\"danger\" [outlined]=\"true\" [disabled]=\"importControlBusy\"\r\n (onClick)=\"cancelImportTaskFromDialog()\" />\r\n <p-button [label]=\"'import_export.stop_commit_partial' | translate\" [disabled]=\"importControlBusy\"\r\n (onClick)=\"stopImportAndCommitFromDialog()\" />\r\n </ng-template>\r\n</p-dialog>\r\n\r\n<p-dialog [header]=\"'import_export.export_progress_title' | translate\" [(visible)]=\"exportProgressDialogVisible\" [modal]=\"true\" [closable]=\"false\"\r\n [draggable]=\"false\" [resizable]=\"false\" [style]=\"{ width: '30rem', maxWidth: '95vw' }\"\r\n styleClass=\"wuic-progress-dialog\">\r\n <div class=\"wuic-export-progress-dialog\">\r\n <p-progressbar [value]=\"exportProgressValue\"></p-progressbar>\r\n <div class=\"wuic-export-progress-detail\">{{ exportProgressDetail }}</div>\r\n </div>\r\n <ng-template pTemplate=\"footer\">\r\n <p-button [label]=\"'import_export.continue_in_background' | translate\" [outlined]=\"true\" [disabled]=\"exportControlBusy\"\r\n (onClick)=\"continueExportInBackground()\" />\r\n <p-button [label]=\"'import_export.cancel_task' | translate\" severity=\"danger\" [outlined]=\"true\" [disabled]=\"exportControlBusy\"\r\n (onClick)=\"cancelExportTaskFromDialog()\" />\r\n <p-button [label]=\"'import_export.stop_download_partial' | translate\" [disabled]=\"exportControlBusy\"\r\n (onClick)=\"stopExportAndDownloadPartialFromDialog()\" />\r\n </ng-template>\r\n</p-dialog>\r\n", styles: [".wuic-export-progress-dialog{display:flex;flex-direction:column;gap:.65rem}::ng-deep .wuic-progress-dialog .p-progressbar{--p-progressbar-value-transition: none}::ng-deep .wuic-progress-dialog .p-progressbar .p-progressbar-value,::ng-deep .wuic-progress-dialog .p-progressbar-value,:host ::ng-deep .wuic-export-progress-dialog .p-progressbar .p-progressbar-value,:host ::ng-deep .wuic-export-progress-dialog .p-progressbar-value{transition:none!important;animation:none!important}.wuic-export-progress-detail{font-size:.9rem;font-weight:600;text-align:right}.wuic-import-dialog{display:flex;flex-direction:column;gap:.75rem}.wuic-import-grid{display:grid;grid-template-columns:1fr;gap:.35rem}.wuic-import-file-row{display:flex;align-items:center;gap:.65rem}\n"] }]
|
|
35282
35527
|
}], ctorParameters: () => [{ type: i1$2.ActivatedRoute }, { type: DataProviderService }, { type: DataProviderMetaService }, { type: NotificationRealtimeService }, { type: TranslationManagerService }, { type: UserInfoService }, { type: i0.ChangeDetectorRef }], propDecorators: { routeName: [{
|
|
35283
35528
|
type: Input
|
|
35284
35529
|
}], tableMetadata: [{
|
|
@@ -35310,6 +35555,8 @@ class ListGridComponent {
|
|
|
35310
35555
|
deviceAwareness;
|
|
35311
35556
|
zone;
|
|
35312
35557
|
customAttributesService;
|
|
35558
|
+
/** Handle di ispezione per i test e2e (attivo solo in dev o con __wuicE2E). */
|
|
35559
|
+
wuicCmpHandle = exposeWuicCmpOnHost(this);
|
|
35313
35560
|
static FORCED_VIRTUALIZATION_PAGE_SIZE_THRESHOLD = 1000;
|
|
35314
35561
|
static FORCED_VIRTUALIZATION_ITEM_SIZE = 44;
|
|
35315
35562
|
static ACTION_BUTTON_VISIBLE_ROWS_OVERSCAN = 4;
|
|
@@ -42271,6 +42518,8 @@ class MapListComponent {
|
|
|
42271
42518
|
route;
|
|
42272
42519
|
userInfo;
|
|
42273
42520
|
trslSrv;
|
|
42521
|
+
/** Handle di ispezione per i test e2e (attivo solo in dev o con __wuicE2E). */
|
|
42522
|
+
wuicCmpHandle = exposeWuicCmpOnHost(this);
|
|
42274
42523
|
/**
|
|
42275
42524
|
* Riferimento a elementi o componenti figli usato dalla logica UI per map.
|
|
42276
42525
|
*/
|
|
@@ -44656,6 +44905,8 @@ class CarouselListComponent {
|
|
|
44656
44905
|
route;
|
|
44657
44906
|
trslSrv;
|
|
44658
44907
|
userInfo;
|
|
44908
|
+
/** Handle di ispezione per i test e2e (attivo solo in dev o con __wuicE2E). */
|
|
44909
|
+
wuicCmpHandle = exposeWuicCmpOnHost(this);
|
|
44659
44910
|
/**
|
|
44660
44911
|
* Input dal componente padre per hardcoded route; usata nella configurazione e nel rendering del componente.
|
|
44661
44912
|
*/
|
|
@@ -45278,6 +45529,8 @@ class TreeListComponent {
|
|
|
45278
45529
|
dataSrv;
|
|
45279
45530
|
cd;
|
|
45280
45531
|
trslSrv;
|
|
45532
|
+
/** Handle di ispezione per i test e2e (attivo solo in dev o con __wuicE2E). */
|
|
45533
|
+
wuicCmpHandle = exposeWuicCmpOnHost(this);
|
|
45281
45534
|
/**
|
|
45282
45535
|
* Input dal componente padre per hardcoded route; usata nella configurazione e nel rendering del componente.
|
|
45283
45536
|
*/
|
|
@@ -48602,6 +48855,8 @@ class MetaMenuComponent {
|
|
|
48602
48855
|
userLanguage;
|
|
48603
48856
|
headerConfig;
|
|
48604
48857
|
themeCatalog;
|
|
48858
|
+
/** Handle di ispezione per i test e2e (attivo solo in dev o con __wuicE2E). */
|
|
48859
|
+
wuicCmpHandle = exposeWuicCmpOnHost(this);
|
|
48605
48860
|
/**
|
|
48606
48861
|
* Collezione dati per items, consumata dal rendering e dalle operazioni del componente.
|
|
48607
48862
|
*/
|
|
@@ -50344,7 +50599,7 @@ class LazyFirstRunWizardComponent {
|
|
|
50344
50599
|
this.cdr = cdr;
|
|
50345
50600
|
}
|
|
50346
50601
|
async ngOnInit() {
|
|
50347
|
-
firstRunWizardComponentPromise ??= import('./wuic-framework-lib-first-run-wizard.component-
|
|
50602
|
+
firstRunWizardComponentPromise ??= import('./wuic-framework-lib-first-run-wizard.component-Hw4IM3po.mjs').then((m) => m.WuicFirstRunWizardComponent);
|
|
50348
50603
|
const componentClass = await firstRunWizardComponentPromise;
|
|
50349
50604
|
this.componentRef = this.vcr.createComponent(componentClass);
|
|
50350
50605
|
// Forward output del componente reale al wrapper. Type assertion necessaria
|
|
@@ -50379,6 +50634,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
|
|
|
50379
50634
|
}] } });
|
|
50380
50635
|
|
|
50381
50636
|
class TextEditorComponent {
|
|
50637
|
+
/** Handle di ispezione per i test e2e (attivo solo in dev o con __wuicE2E). */
|
|
50638
|
+
wuicCmpHandle = exposeWuicCmpOnHost(this);
|
|
50382
50639
|
/**
|
|
50383
50640
|
* Input dal componente padre per record; usata nella configurazione e nel rendering del componente.
|
|
50384
50641
|
*/
|
|
@@ -50501,6 +50758,8 @@ var textEditor_component = /*#__PURE__*/Object.freeze({
|
|
|
50501
50758
|
});
|
|
50502
50759
|
|
|
50503
50760
|
class TextAreaEditorComponent {
|
|
50761
|
+
/** Handle di ispezione per i test e2e (attivo solo in dev o con __wuicE2E). */
|
|
50762
|
+
wuicCmpHandle = exposeWuicCmpOnHost(this);
|
|
50504
50763
|
/**
|
|
50505
50764
|
* Input dal componente padre per record; usata nella configurazione e nel rendering del componente.
|
|
50506
50765
|
*/
|
|
@@ -50608,6 +50867,8 @@ class LookupEditorComponent {
|
|
|
50608
50867
|
trslSrv;
|
|
50609
50868
|
cd;
|
|
50610
50869
|
hostElementRef;
|
|
50870
|
+
/** Handle di ispezione per i test e2e (attivo solo in dev o con __wuicE2E). */
|
|
50871
|
+
wuicCmpHandle = exposeWuicCmpOnHost(this);
|
|
50611
50872
|
static LOOKUP_VIRTUALIZATION_DEFAULT_ITEM_SIZE = 44;
|
|
50612
50873
|
pendingSearchFocusRestore = false;
|
|
50613
50874
|
lookupOverlayVisible = false;
|
|
@@ -51415,6 +51676,8 @@ var lookupEditor_component = /*#__PURE__*/Object.freeze({
|
|
|
51415
51676
|
class DictionaryEditorComponent {
|
|
51416
51677
|
trnSrv;
|
|
51417
51678
|
hostElementRef;
|
|
51679
|
+
/** Handle di ispezione per i test e2e (attivo solo in dev o con __wuicE2E). */
|
|
51680
|
+
wuicCmpHandle = exposeWuicCmpOnHost(this);
|
|
51418
51681
|
/**
|
|
51419
51682
|
* Input dal componente padre per record; usata nella configurazione e nel rendering del componente.
|
|
51420
51683
|
*/
|
|
@@ -51779,6 +52042,8 @@ var dictionaryEditor_component = /*#__PURE__*/Object.freeze({
|
|
|
51779
52042
|
});
|
|
51780
52043
|
|
|
51781
52044
|
class BooleanEditorComponent {
|
|
52045
|
+
/** Handle di ispezione per i test e2e (attivo solo in dev o con __wuicE2E). */
|
|
52046
|
+
wuicCmpHandle = exposeWuicCmpOnHost(this);
|
|
51782
52047
|
/**
|
|
51783
52048
|
* Input dal componente padre per record; usata nella configurazione e nel rendering del componente.
|
|
51784
52049
|
*/
|
|
@@ -51930,6 +52195,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
|
|
|
51930
52195
|
}] });
|
|
51931
52196
|
|
|
51932
52197
|
class DateEditorComponent {
|
|
52198
|
+
/** Handle di ispezione per i test e2e (attivo solo in dev o con __wuicE2E). */
|
|
52199
|
+
wuicCmpHandle = exposeWuicCmpOnHost(this);
|
|
51933
52200
|
/**
|
|
51934
52201
|
* Input dal componente padre per record; usata nella configurazione e nel rendering del componente.
|
|
51935
52202
|
*/
|
|
@@ -52038,6 +52305,8 @@ var dateEditor_component = /*#__PURE__*/Object.freeze({
|
|
|
52038
52305
|
});
|
|
52039
52306
|
|
|
52040
52307
|
class HtmlEditorComponent {
|
|
52308
|
+
/** Handle di ispezione per i test e2e (attivo solo in dev o con __wuicE2E). */
|
|
52309
|
+
wuicCmpHandle = exposeWuicCmpOnHost(this);
|
|
52041
52310
|
/**
|
|
52042
52311
|
* Input dal componente padre per record; usata nella configurazione e nel rendering del componente.
|
|
52043
52312
|
*/
|
|
@@ -61282,6 +61551,8 @@ class UploadEditorComponent {
|
|
|
61282
61551
|
trnsl;
|
|
61283
61552
|
usrSrv;
|
|
61284
61553
|
config;
|
|
61554
|
+
/** Handle di ispezione per i test e2e (attivo solo in dev o con __wuicE2E). */
|
|
61555
|
+
wuicCmpHandle = exposeWuicCmpOnHost(this);
|
|
61285
61556
|
/**
|
|
61286
61557
|
* Input dal componente padre per record; usata nella configurazione e nel rendering del componente.
|
|
61287
61558
|
*/
|
|
@@ -61924,6 +62195,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
|
|
|
61924
62195
|
* CodeEditorComponent + parser SQL/TS in un chunk separato caricato on-demand.
|
|
61925
62196
|
*/
|
|
61926
62197
|
class CodeAreaEditorComponent {
|
|
62198
|
+
/** Handle di ispezione per i test e2e (attivo solo in dev o con __wuicE2E). */
|
|
62199
|
+
wuicCmpHandle = exposeWuicCmpOnHost(this);
|
|
61927
62200
|
/**
|
|
61928
62201
|
* Input dal componente padre per record; usata nella configurazione e nel rendering del componente.
|
|
61929
62202
|
*/
|
|
@@ -62045,7 +62318,7 @@ class LazyCodeEditorComponent {
|
|
|
62045
62318
|
this.cdr = cdr;
|
|
62046
62319
|
}
|
|
62047
62320
|
async ngOnInit() {
|
|
62048
|
-
codeEditorComponentPromise ??= import('./wuic-framework-lib-code-editor.component-
|
|
62321
|
+
codeEditorComponentPromise ??= import('./wuic-framework-lib-code-editor.component-c3x1X5O9.mjs').then((m) => m.CodeEditorComponent);
|
|
62049
62322
|
this.loadedComponent = await codeEditorComponentPromise;
|
|
62050
62323
|
this.cdr.markForCheck();
|
|
62051
62324
|
}
|
|
@@ -62218,6 +62491,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
|
|
|
62218
62491
|
}] } });
|
|
62219
62492
|
|
|
62220
62493
|
class ColorEditorComponent {
|
|
62494
|
+
/** Handle di ispezione per i test e2e (attivo solo in dev o con __wuicE2E). */
|
|
62495
|
+
wuicCmpHandle = exposeWuicCmpOnHost(this);
|
|
62221
62496
|
/**
|
|
62222
62497
|
* Input dal componente padre per record; usata nella configurazione e nel rendering del componente.
|
|
62223
62498
|
*/
|
|
@@ -62568,6 +62843,8 @@ var propertyObjectEditor_component = /*#__PURE__*/Object.freeze({
|
|
|
62568
62843
|
});
|
|
62569
62844
|
|
|
62570
62845
|
class TreeViewSelectorComponent {
|
|
62846
|
+
/** Handle di ispezione per i test e2e (attivo solo in dev o con __wuicE2E). */
|
|
62847
|
+
wuicCmpHandle = exposeWuicCmpOnHost(this);
|
|
62571
62848
|
/**
|
|
62572
62849
|
* Input dal componente padre per record; usata nella configurazione e nel rendering del componente.
|
|
62573
62850
|
*/
|
|
@@ -63817,6 +64094,8 @@ class NotificationBellComponent {
|
|
|
63817
64094
|
router;
|
|
63818
64095
|
trslSrv;
|
|
63819
64096
|
authSession;
|
|
64097
|
+
/** Handle di ispezione per i test e2e (attivo solo in dev o con __wuicE2E). */
|
|
64098
|
+
wuicCmpHandle = exposeWuicCmpOnHost(this);
|
|
63820
64099
|
userId;
|
|
63821
64100
|
// Default sentinel vuoto: se il consumer NON passa l'input, risolviamo via
|
|
63822
64101
|
// TranslationManagerService all'ngOnInit. I fallback italiani restano nel
|
|
@@ -63831,6 +64110,8 @@ class NotificationBellComponent {
|
|
|
63831
64110
|
notifications = [];
|
|
63832
64111
|
isVisible = true;
|
|
63833
64112
|
progressByGuid = {};
|
|
64113
|
+
/** Posizione nella coda export del server per le notifiche di progress in attesa. */
|
|
64114
|
+
queuePositionByGuid = {};
|
|
63834
64115
|
/** Title del bottone "elimina notifica letta" (X), localizzato. */
|
|
63835
64116
|
deleteNotificationTitle = '';
|
|
63836
64117
|
sub = new Subscription();
|
|
@@ -63902,6 +64183,13 @@ class NotificationBellComponent {
|
|
|
63902
64183
|
}
|
|
63903
64184
|
const normalized = Math.max(0, Math.min(100, progress));
|
|
63904
64185
|
this.progressByGuid[guid] = normalized;
|
|
64186
|
+
const queuePosition = Number(evt?.queuePosition);
|
|
64187
|
+
if (queuePosition > 0) {
|
|
64188
|
+
this.queuePositionByGuid[guid] = Math.floor(queuePosition);
|
|
64189
|
+
}
|
|
64190
|
+
else {
|
|
64191
|
+
delete this.queuePositionByGuid[guid];
|
|
64192
|
+
}
|
|
63905
64193
|
}));
|
|
63906
64194
|
// Riaggancio al LOGIN TARDIVO: `connect()` da solo non basta.
|
|
63907
64195
|
// La campanella vive nell'header, quindi si monta anche sulla pagina di
|
|
@@ -64098,6 +64386,15 @@ class NotificationBellComponent {
|
|
|
64098
64386
|
}));
|
|
64099
64387
|
return true;
|
|
64100
64388
|
}
|
|
64389
|
+
/** Testo "In coda: posizione N" per un export che aspetta il suo turno, altrimenti null. */
|
|
64390
|
+
getNotificationQueueText(item) {
|
|
64391
|
+
const guid = this.getNotificationProgressGuid(item);
|
|
64392
|
+
const position = guid ? this.queuePositionByGuid[guid] : undefined;
|
|
64393
|
+
if (!position) {
|
|
64394
|
+
return null;
|
|
64395
|
+
}
|
|
64396
|
+
return this.trslSrv.format(this.safeT('import_export.export_queued_short_{0}', 'In coda: posizione {0}'), String(position));
|
|
64397
|
+
}
|
|
64101
64398
|
getNotificationProgress(item) {
|
|
64102
64399
|
const guid = this.getNotificationProgressGuid(item);
|
|
64103
64400
|
if (!guid) {
|
|
@@ -64158,11 +64455,11 @@ class NotificationBellComponent {
|
|
|
64158
64455
|
}
|
|
64159
64456
|
}
|
|
64160
64457
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: NotificationBellComponent, deps: [{ token: NotificationRealtimeService }, { token: i1$2.Router }, { token: TranslationManagerService }, { token: AuthSessionService }], target: i0.ɵɵFactoryTarget.Component });
|
|
64161
|
-
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: NotificationBellComponent, isStandalone: true, selector: "wuic-notification-bell", inputs: { userId: "userId", title: "title", emptyMessage: "emptyMessage", clearReadLabel: "clearReadLabel", markAllReadLabel: "markAllReadLabel" }, viewQueries: [{ propertyName: "notificationPanel", first: true, predicate: ["notificationPanel"], descendants: true }], ngImport: i0, template: "@if (isVisible) {\r\n <button type=\"button\" class=\"notification-bell-btn\" (click)=\"notificationPanel.toggle($event)\"\r\n [attr.aria-label]=\"title || 'Notifiche'\" [attr.title]=\"title || 'Notifiche'\">\r\n <i class=\"pi pi-bell\"></i>\r\n @if (unreadCount > 0) {\r\n <span class=\"notification-bell-badge\">{{ unreadCount }}</span>\r\n }\r\n </button>\r\n\r\n <p-popover #notificationPanel appendTo=\"body\" [style]=\"{ width: '26rem', maxWidth: '92vw' }\">\r\n <div class=\"notification-panel\">\r\n <div class=\"notification-panel-header-row\">\r\n <div class=\"notification-panel-header\">{{ title }}</div>\r\n @if (notifications.length) {\r\n <div class=\"notification-panel-actions\">\r\n @if (unreadCount > 0) {\r\n <button type=\"button\" class=\"notification-mark-all-btn\" (click)=\"markAllRead()\" [title]=\"markAllReadLabel\">{{ markAllReadLabel }}</button>\r\n }\r\n <button type=\"button\" class=\"notification-clear-read-btn\" (click)=\"clearRead()\">{{ clearReadLabel }}</button>\r\n </div>\r\n }\r\n </div>\r\n\r\n @if (!notifications.length) {\r\n <div class=\"notification-empty\">{{ emptyMessage }}</div>\r\n }\r\n\r\n @for (n of notifications; track n.id) {\r\n <div class=\"notification-item\"\r\n [class.notification-item-unread]=\"!n.isRead\"\r\n [class.notification-item-clickable]=\"isClickable(n)\">\r\n <button type=\"button\" class=\"notification-item-open\" (click)=\"openNotification(n)\">\r\n <div class=\"notification-item-message\">\r\n {{ n.message }}\r\n @if (isClickable(n)) {\r\n <i class=\"pi pi-angle-right notification-item-chevron\" aria-hidden=\"true\"></i>\r\n }\r\n </div>\r\n @if (getNotificationProgress(n) !== null) {\r\n <div class=\"notification-item-progress\">\r\n <p-progressbar [value]=\"getNotificationProgress(n) || 0\"></p-progressbar>\r\n <div class=\"notification-item-progress-text\">{{ (getNotificationProgress(n) || 0).toFixed(2) }}
|
|
64458
|
+
static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: NotificationBellComponent, isStandalone: true, selector: "wuic-notification-bell", inputs: { userId: "userId", title: "title", emptyMessage: "emptyMessage", clearReadLabel: "clearReadLabel", markAllReadLabel: "markAllReadLabel" }, viewQueries: [{ propertyName: "notificationPanel", first: true, predicate: ["notificationPanel"], descendants: true }], ngImport: i0, template: "@if (isVisible) {\r\n <button type=\"button\" class=\"notification-bell-btn\" (click)=\"notificationPanel.toggle($event)\"\r\n [attr.aria-label]=\"title || 'Notifiche'\" [attr.title]=\"title || 'Notifiche'\">\r\n <i class=\"pi pi-bell\"></i>\r\n @if (unreadCount > 0) {\r\n <span class=\"notification-bell-badge\">{{ unreadCount }}</span>\r\n }\r\n </button>\r\n\r\n <p-popover #notificationPanel appendTo=\"body\" [style]=\"{ width: '26rem', maxWidth: '92vw' }\">\r\n <div class=\"notification-panel\">\r\n <div class=\"notification-panel-header-row\">\r\n <div class=\"notification-panel-header\">{{ title }}</div>\r\n @if (notifications.length) {\r\n <div class=\"notification-panel-actions\">\r\n @if (unreadCount > 0) {\r\n <button type=\"button\" class=\"notification-mark-all-btn\" (click)=\"markAllRead()\" [title]=\"markAllReadLabel\">{{ markAllReadLabel }}</button>\r\n }\r\n <button type=\"button\" class=\"notification-clear-read-btn\" (click)=\"clearRead()\">{{ clearReadLabel }}</button>\r\n </div>\r\n }\r\n </div>\r\n\r\n @if (!notifications.length) {\r\n <div class=\"notification-empty\">{{ emptyMessage }}</div>\r\n }\r\n\r\n @for (n of notifications; track n.id) {\r\n <div class=\"notification-item\"\r\n [class.notification-item-unread]=\"!n.isRead\"\r\n [class.notification-item-clickable]=\"isClickable(n)\">\r\n <button type=\"button\" class=\"notification-item-open\" (click)=\"openNotification(n)\">\r\n <div class=\"notification-item-message\">\r\n {{ n.message }}\r\n @if (isClickable(n)) {\r\n <i class=\"pi pi-angle-right notification-item-chevron\" aria-hidden=\"true\"></i>\r\n }\r\n </div>\r\n @if (getNotificationProgress(n) !== null) {\r\n <div class=\"notification-item-progress\">\r\n <p-progressbar [value]=\"getNotificationProgress(n) || 0\"></p-progressbar>\r\n <div class=\"notification-item-progress-text\">{{ getNotificationQueueText(n) || ((getNotificationProgress(n) || 0).toFixed(2) + '%') }}</div>\r\n </div>\r\n }\r\n <div class=\"notification-item-meta\">{{ n.type }} \u00B7 {{ n.createdAt | date:'dd/MM/yyyy HH:mm' }}</div>\r\n </button>\r\n @if (n.isRead) {\r\n <button type=\"button\" class=\"notification-item-delete\" (click)=\"deleteReadNotification($event, n)\" [title]=\"deleteNotificationTitle\">\r\n <i class=\"pi pi-times\"></i>\r\n </button>\r\n }\r\n </div>\r\n }\r\n </div>\r\n </p-popover>\r\n}\r\n", styles: [":host{display:inline-flex}.notification-bell-btn{position:relative;border:0;background:transparent;cursor:pointer;width:2.25rem;height:2.25rem;border-radius:999px;color:inherit}.notification-bell-btn:hover{background:color-mix(in srgb,var(--wuic-accent, #3b82f6) 12%,transparent)}.notification-bell-badge{position:absolute;top:-.2rem;right:-.2rem;min-width:1.1rem;height:1.1rem;padding:0 .2rem;border-radius:999px;background:#ef4444;color:#fff;font-size:.68rem;line-height:1.1rem;text-align:center}.notification-panel{display:flex;flex-direction:column;gap:.35rem}.notification-panel-header-row{display:flex;align-items:center;justify-content:space-between;gap:.5rem}.notification-panel-header{font-weight:700}.notification-panel-actions{display:flex;align-items:center;gap:.5rem}.notification-clear-read-btn,.notification-mark-all-btn{border:0;background:transparent;color:var(--wuic-accent, #3b82f6);cursor:pointer;font-size:.85rem;padding:.2rem .45rem;border-radius:.35rem}.notification-clear-read-btn:hover,.notification-mark-all-btn:hover{background:color-mix(in srgb,var(--wuic-accent, #3b82f6) 12%,transparent)}.notification-mark-all-btn{font-weight:600}.notification-empty{color:var(--wuic-text-muted, #64748b);padding:.5rem 0}.notification-item{display:flex;align-items:flex-start;gap:.4rem;border:1px solid var(--wuic-border, #dbe2ef);border-radius:.5rem;background:var(--wuic-surface, #fff);padding:.4rem}.notification-item:hover{border-color:color-mix(in srgb,var(--wuic-accent, #3b82f6) 40%,var(--wuic-border, #dbe2ef))}.notification-item-unread{border-left:4px solid var(--wuic-accent, #3b82f6)}.notification-item-message{font-size:.95rem;line-height:1.25rem}.notification-item-open{flex:1;border:0;background:transparent;text-align:left;cursor:pointer;padding:.15rem}.notification-item-delete{border:0;background:transparent;color:var(--wuic-text-muted, #64748b);cursor:pointer;width:1.8rem;height:1.8rem;border-radius:999px;margin-top:.05rem}.notification-item-delete:hover{background:#ef44441f;color:#b91c1c}.notification-item-meta{margin-top:.25rem;color:var(--wuic-text-muted, #64748b);font-size:.78rem}.notification-item-progress{margin-top:.35rem}:host ::ng-deep .notification-item-progress .p-progressbar .p-progressbar-value,:host ::ng-deep .notification-item-progress .p-progressbar-value{transition:none!important}.notification-item-progress-text{margin-top:.2rem;text-align:right;color:var(--wuic-text-muted, #64748b);font-size:.74rem;font-weight:600}.notification-item-clickable{background:linear-gradient(to right,color-mix(in srgb,var(--wuic-accent, #3b82f6) 6%,transparent),color-mix(in srgb,var(--wuic-accent, #3b82f6) 2%,transparent));border-color:color-mix(in srgb,var(--wuic-accent, #3b82f6) 35%,transparent)}.notification-item-clickable:hover{background:linear-gradient(to right,color-mix(in srgb,var(--wuic-accent, #3b82f6) 14%,transparent),color-mix(in srgb,var(--wuic-accent, #3b82f6) 6%,transparent));border-color:var(--wuic-accent, #3b82f6);box-shadow:0 1px 3px color-mix(in srgb,var(--wuic-accent, #3b82f6) 15%,transparent)}.notification-item-clickable .notification-item-message{color:var(--wuic-accent, #3b82f6);font-weight:500;display:flex;align-items:center;justify-content:space-between;gap:.5rem}.notification-item-chevron{color:var(--wuic-accent, #3b82f6);font-size:.9rem;flex-shrink:0;opacity:.75;transition:transform .15s ease-out,opacity .15s ease-out}.notification-item-clickable:hover .notification-item-chevron{opacity:1;transform:translate(2px)}.notification-item:not(.notification-item-clickable) .notification-item-open{cursor:default}\n"], dependencies: [{ kind: "ngmodule", type: ButtonModule }, { kind: "ngmodule", type: PopoverModule }, { kind: "component", type: i5$5.Popover, selector: "p-popover", inputs: ["ariaLabel", "ariaLabelledBy", "dismissable", "style", "styleClass", "appendTo", "autoZIndex", "ariaCloseLabel", "baseZIndex", "focusOnShow", "showTransitionOptions", "hideTransitionOptions", "motionOptions"], outputs: ["onShow", "onHide"] }, { kind: "ngmodule", type: ProgressBarModule }, { kind: "component", type: i6$3.ProgressBar, selector: "p-progressBar, p-progressbar, p-progress-bar", inputs: ["value", "showValue", "styleClass", "valueStyleClass", "unit", "mode", "color"] }, { kind: "pipe", type: DatePipe, name: "date" }] });
|
|
64162
64459
|
}
|
|
64163
64460
|
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: NotificationBellComponent, decorators: [{
|
|
64164
64461
|
type: Component,
|
|
64165
|
-
args: [{ selector: 'wuic-notification-bell', imports: [DatePipe, ButtonModule, PopoverModule, ProgressBarModule], template: "@if (isVisible) {\r\n <button type=\"button\" class=\"notification-bell-btn\" (click)=\"notificationPanel.toggle($event)\"\r\n [attr.aria-label]=\"title || 'Notifiche'\" [attr.title]=\"title || 'Notifiche'\">\r\n <i class=\"pi pi-bell\"></i>\r\n @if (unreadCount > 0) {\r\n <span class=\"notification-bell-badge\">{{ unreadCount }}</span>\r\n }\r\n </button>\r\n\r\n <p-popover #notificationPanel appendTo=\"body\" [style]=\"{ width: '26rem', maxWidth: '92vw' }\">\r\n <div class=\"notification-panel\">\r\n <div class=\"notification-panel-header-row\">\r\n <div class=\"notification-panel-header\">{{ title }}</div>\r\n @if (notifications.length) {\r\n <div class=\"notification-panel-actions\">\r\n @if (unreadCount > 0) {\r\n <button type=\"button\" class=\"notification-mark-all-btn\" (click)=\"markAllRead()\" [title]=\"markAllReadLabel\">{{ markAllReadLabel }}</button>\r\n }\r\n <button type=\"button\" class=\"notification-clear-read-btn\" (click)=\"clearRead()\">{{ clearReadLabel }}</button>\r\n </div>\r\n }\r\n </div>\r\n\r\n @if (!notifications.length) {\r\n <div class=\"notification-empty\">{{ emptyMessage }}</div>\r\n }\r\n\r\n @for (n of notifications; track n.id) {\r\n <div class=\"notification-item\"\r\n [class.notification-item-unread]=\"!n.isRead\"\r\n [class.notification-item-clickable]=\"isClickable(n)\">\r\n <button type=\"button\" class=\"notification-item-open\" (click)=\"openNotification(n)\">\r\n <div class=\"notification-item-message\">\r\n {{ n.message }}\r\n @if (isClickable(n)) {\r\n <i class=\"pi pi-angle-right notification-item-chevron\" aria-hidden=\"true\"></i>\r\n }\r\n </div>\r\n @if (getNotificationProgress(n) !== null) {\r\n <div class=\"notification-item-progress\">\r\n <p-progressbar [value]=\"getNotificationProgress(n) || 0\"></p-progressbar>\r\n <div class=\"notification-item-progress-text\">{{ (getNotificationProgress(n) || 0).toFixed(2) }}
|
|
64462
|
+
args: [{ selector: 'wuic-notification-bell', imports: [DatePipe, ButtonModule, PopoverModule, ProgressBarModule], template: "@if (isVisible) {\r\n <button type=\"button\" class=\"notification-bell-btn\" (click)=\"notificationPanel.toggle($event)\"\r\n [attr.aria-label]=\"title || 'Notifiche'\" [attr.title]=\"title || 'Notifiche'\">\r\n <i class=\"pi pi-bell\"></i>\r\n @if (unreadCount > 0) {\r\n <span class=\"notification-bell-badge\">{{ unreadCount }}</span>\r\n }\r\n </button>\r\n\r\n <p-popover #notificationPanel appendTo=\"body\" [style]=\"{ width: '26rem', maxWidth: '92vw' }\">\r\n <div class=\"notification-panel\">\r\n <div class=\"notification-panel-header-row\">\r\n <div class=\"notification-panel-header\">{{ title }}</div>\r\n @if (notifications.length) {\r\n <div class=\"notification-panel-actions\">\r\n @if (unreadCount > 0) {\r\n <button type=\"button\" class=\"notification-mark-all-btn\" (click)=\"markAllRead()\" [title]=\"markAllReadLabel\">{{ markAllReadLabel }}</button>\r\n }\r\n <button type=\"button\" class=\"notification-clear-read-btn\" (click)=\"clearRead()\">{{ clearReadLabel }}</button>\r\n </div>\r\n }\r\n </div>\r\n\r\n @if (!notifications.length) {\r\n <div class=\"notification-empty\">{{ emptyMessage }}</div>\r\n }\r\n\r\n @for (n of notifications; track n.id) {\r\n <div class=\"notification-item\"\r\n [class.notification-item-unread]=\"!n.isRead\"\r\n [class.notification-item-clickable]=\"isClickable(n)\">\r\n <button type=\"button\" class=\"notification-item-open\" (click)=\"openNotification(n)\">\r\n <div class=\"notification-item-message\">\r\n {{ n.message }}\r\n @if (isClickable(n)) {\r\n <i class=\"pi pi-angle-right notification-item-chevron\" aria-hidden=\"true\"></i>\r\n }\r\n </div>\r\n @if (getNotificationProgress(n) !== null) {\r\n <div class=\"notification-item-progress\">\r\n <p-progressbar [value]=\"getNotificationProgress(n) || 0\"></p-progressbar>\r\n <div class=\"notification-item-progress-text\">{{ getNotificationQueueText(n) || ((getNotificationProgress(n) || 0).toFixed(2) + '%') }}</div>\r\n </div>\r\n }\r\n <div class=\"notification-item-meta\">{{ n.type }} \u00B7 {{ n.createdAt | date:'dd/MM/yyyy HH:mm' }}</div>\r\n </button>\r\n @if (n.isRead) {\r\n <button type=\"button\" class=\"notification-item-delete\" (click)=\"deleteReadNotification($event, n)\" [title]=\"deleteNotificationTitle\">\r\n <i class=\"pi pi-times\"></i>\r\n </button>\r\n }\r\n </div>\r\n }\r\n </div>\r\n </p-popover>\r\n}\r\n", styles: [":host{display:inline-flex}.notification-bell-btn{position:relative;border:0;background:transparent;cursor:pointer;width:2.25rem;height:2.25rem;border-radius:999px;color:inherit}.notification-bell-btn:hover{background:color-mix(in srgb,var(--wuic-accent, #3b82f6) 12%,transparent)}.notification-bell-badge{position:absolute;top:-.2rem;right:-.2rem;min-width:1.1rem;height:1.1rem;padding:0 .2rem;border-radius:999px;background:#ef4444;color:#fff;font-size:.68rem;line-height:1.1rem;text-align:center}.notification-panel{display:flex;flex-direction:column;gap:.35rem}.notification-panel-header-row{display:flex;align-items:center;justify-content:space-between;gap:.5rem}.notification-panel-header{font-weight:700}.notification-panel-actions{display:flex;align-items:center;gap:.5rem}.notification-clear-read-btn,.notification-mark-all-btn{border:0;background:transparent;color:var(--wuic-accent, #3b82f6);cursor:pointer;font-size:.85rem;padding:.2rem .45rem;border-radius:.35rem}.notification-clear-read-btn:hover,.notification-mark-all-btn:hover{background:color-mix(in srgb,var(--wuic-accent, #3b82f6) 12%,transparent)}.notification-mark-all-btn{font-weight:600}.notification-empty{color:var(--wuic-text-muted, #64748b);padding:.5rem 0}.notification-item{display:flex;align-items:flex-start;gap:.4rem;border:1px solid var(--wuic-border, #dbe2ef);border-radius:.5rem;background:var(--wuic-surface, #fff);padding:.4rem}.notification-item:hover{border-color:color-mix(in srgb,var(--wuic-accent, #3b82f6) 40%,var(--wuic-border, #dbe2ef))}.notification-item-unread{border-left:4px solid var(--wuic-accent, #3b82f6)}.notification-item-message{font-size:.95rem;line-height:1.25rem}.notification-item-open{flex:1;border:0;background:transparent;text-align:left;cursor:pointer;padding:.15rem}.notification-item-delete{border:0;background:transparent;color:var(--wuic-text-muted, #64748b);cursor:pointer;width:1.8rem;height:1.8rem;border-radius:999px;margin-top:.05rem}.notification-item-delete:hover{background:#ef44441f;color:#b91c1c}.notification-item-meta{margin-top:.25rem;color:var(--wuic-text-muted, #64748b);font-size:.78rem}.notification-item-progress{margin-top:.35rem}:host ::ng-deep .notification-item-progress .p-progressbar .p-progressbar-value,:host ::ng-deep .notification-item-progress .p-progressbar-value{transition:none!important}.notification-item-progress-text{margin-top:.2rem;text-align:right;color:var(--wuic-text-muted, #64748b);font-size:.74rem;font-weight:600}.notification-item-clickable{background:linear-gradient(to right,color-mix(in srgb,var(--wuic-accent, #3b82f6) 6%,transparent),color-mix(in srgb,var(--wuic-accent, #3b82f6) 2%,transparent));border-color:color-mix(in srgb,var(--wuic-accent, #3b82f6) 35%,transparent)}.notification-item-clickable:hover{background:linear-gradient(to right,color-mix(in srgb,var(--wuic-accent, #3b82f6) 14%,transparent),color-mix(in srgb,var(--wuic-accent, #3b82f6) 6%,transparent));border-color:var(--wuic-accent, #3b82f6);box-shadow:0 1px 3px color-mix(in srgb,var(--wuic-accent, #3b82f6) 15%,transparent)}.notification-item-clickable .notification-item-message{color:var(--wuic-accent, #3b82f6);font-weight:500;display:flex;align-items:center;justify-content:space-between;gap:.5rem}.notification-item-chevron{color:var(--wuic-accent, #3b82f6);font-size:.9rem;flex-shrink:0;opacity:.75;transition:transform .15s ease-out,opacity .15s ease-out}.notification-item-clickable:hover .notification-item-chevron{opacity:1;transform:translate(2px)}.notification-item:not(.notification-item-clickable) .notification-item-open{cursor:default}\n"] }]
|
|
64166
64463
|
}], ctorParameters: () => [{ type: NotificationRealtimeService }, { type: i1$2.Router }, { type: TranslationManagerService }, { type: AuthSessionService }], propDecorators: { userId: [{
|
|
64167
64464
|
type: Input
|
|
64168
64465
|
}], title: [{
|
|
@@ -64224,7 +64521,7 @@ class DesignerRouteComponent {
|
|
|
64224
64521
|
* Inizializza il componente preparando stato, sottoscrizioni e primi caricamenti richiesti.
|
|
64225
64522
|
*/
|
|
64226
64523
|
async ngOnInit() {
|
|
64227
|
-
designerComponentPromise ??= import('./wuic-framework-lib-designer.component-
|
|
64524
|
+
designerComponentPromise ??= import('./wuic-framework-lib-designer.component-CXHYNEm5.mjs').then((m) => m.DesignerComponent);
|
|
64228
64525
|
this.loadedComponent = await designerComponentPromise;
|
|
64229
64526
|
}
|
|
64230
64527
|
/**
|
|
@@ -64305,7 +64602,7 @@ class LazyPivotBuilderComponent {
|
|
|
64305
64602
|
this.cdr = cdr;
|
|
64306
64603
|
}
|
|
64307
64604
|
async ngOnInit() {
|
|
64308
|
-
pivotBuilderComponentPromise ??= import('./wuic-framework-lib-pivot-builder.component-
|
|
64605
|
+
pivotBuilderComponentPromise ??= import('./wuic-framework-lib-pivot-builder.component-DP60RcD5.mjs').then((m) => m.PivotBuilderComponent);
|
|
64309
64606
|
this.loadedComponent = await pivotBuilderComponentPromise;
|
|
64310
64607
|
this.cdr.markForCheck();
|
|
64311
64608
|
}
|
|
@@ -64344,7 +64641,7 @@ class WorkflowDesignerRouteComponent {
|
|
|
64344
64641
|
* Inizializza il componente preparando stato, sottoscrizioni e primi caricamenti richiesti.
|
|
64345
64642
|
*/
|
|
64346
64643
|
async ngOnInit() {
|
|
64347
|
-
workflowDesignerComponentPromise ??= import('./wuic-framework-lib-workflow-designer.component-
|
|
64644
|
+
workflowDesignerComponentPromise ??= import('./wuic-framework-lib-workflow-designer.component-DCQE7JQz.mjs').then((m) => m.WorkflowDesignerComponent);
|
|
64348
64645
|
this.loadedComponent = await workflowDesignerComponentPromise;
|
|
64349
64646
|
}
|
|
64350
64647
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: WorkflowDesignerRouteComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
@@ -64390,7 +64687,7 @@ class Scene3dDesignerRouteComponent {
|
|
|
64390
64687
|
/** Componente designer runtime caricato lazy, usato dal template. */
|
|
64391
64688
|
loadedComponent = null;
|
|
64392
64689
|
async ngOnInit() {
|
|
64393
|
-
scene3dDesignerComponentPromise ??= import('./wuic-framework-lib-scene3d-designer.component-
|
|
64690
|
+
scene3dDesignerComponentPromise ??= import('./wuic-framework-lib-scene3d-designer.component-DtFyJ3QF.mjs').then(function (n) { return n.s; }).then((m) => m.Scene3dDesignerComponent);
|
|
64394
64691
|
this.loadedComponent = await scene3dDesignerComponentPromise;
|
|
64395
64692
|
}
|
|
64396
64693
|
/** Delega al designer runtime la conferma navigazione con pending changes. */
|
|
@@ -64446,7 +64743,7 @@ class Scene3dViewerRouteComponent {
|
|
|
64446
64743
|
/** Componente viewer runtime caricato lazy, usato dal template. */
|
|
64447
64744
|
loadedComponent = null;
|
|
64448
64745
|
async ngOnInit() {
|
|
64449
|
-
scene3dViewerComponentPromise ??= import('./wuic-framework-lib-scene3d-viewer.component-
|
|
64746
|
+
scene3dViewerComponentPromise ??= import('./wuic-framework-lib-scene3d-viewer.component-B7uh74v4.mjs').then((m) => m.Scene3dViewerComponent);
|
|
64450
64747
|
this.loadedComponent = await scene3dViewerComponentPromise;
|
|
64451
64748
|
}
|
|
64452
64749
|
static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: Scene3dViewerRouteComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
|
|
@@ -64507,7 +64804,7 @@ class LazyReportDesignerComponent {
|
|
|
64507
64804
|
this.cdr = cdr;
|
|
64508
64805
|
}
|
|
64509
64806
|
async ngOnInit() {
|
|
64510
|
-
reportDesignerComponentPromise ??= import('./wuic-framework-lib-report-designer.component-
|
|
64807
|
+
reportDesignerComponentPromise ??= import('./wuic-framework-lib-report-designer.component-Cn3pUy16.mjs').then((m) => m.ReportDesignerComponent);
|
|
64511
64808
|
this.loadedComponent = await reportDesignerComponentPromise;
|
|
64512
64809
|
this.cdr.markForCheck();
|
|
64513
64810
|
}
|
|
@@ -64562,7 +64859,7 @@ class LazyReportViewerComponent {
|
|
|
64562
64859
|
this.cdr = cdr;
|
|
64563
64860
|
}
|
|
64564
64861
|
async ngOnInit() {
|
|
64565
|
-
reportViewerComponentPromise ??= import('./wuic-framework-lib-report-viewer.component-
|
|
64862
|
+
reportViewerComponentPromise ??= import('./wuic-framework-lib-report-viewer.component-m-ianUWE.mjs').then((m) => m.ReportViewerComponent);
|
|
64566
64863
|
this.loadedComponent = await reportViewerComponentPromise;
|
|
64567
64864
|
this.cdr.markForCheck();
|
|
64568
64865
|
}
|
|
@@ -64592,6 +64889,8 @@ class KanbanListComponent {
|
|
|
64592
64889
|
userInfo;
|
|
64593
64890
|
cdr;
|
|
64594
64891
|
ngZone;
|
|
64892
|
+
/** Handle di ispezione per i test e2e (attivo solo in dev o con __wuicE2E). */
|
|
64893
|
+
wuicCmpHandle = exposeWuicCmpOnHost(this);
|
|
64595
64894
|
hardcodedRoute;
|
|
64596
64895
|
parentRecord;
|
|
64597
64896
|
parentMetaInfo;
|
|
@@ -68886,7 +69185,7 @@ const themeBuilderPendingChangesGuard = (component) => {
|
|
|
68886
69185
|
const routes = [
|
|
68887
69186
|
{
|
|
68888
69187
|
path: 'framework-docs',
|
|
68889
|
-
loadComponent: () => import('./wuic-framework-lib-framework-docs.component-
|
|
69188
|
+
loadComponent: () => import('./wuic-framework-lib-framework-docs.component-BIULbCaM.mjs').then((m) => m.FrameworkDocsComponent),
|
|
68890
69189
|
canMatch: [menuRouteAccessCanMatchGuard],
|
|
68891
69190
|
canActivate: [menuRouteAccessCanActivateGuard],
|
|
68892
69191
|
data: {
|
|
@@ -68895,7 +69194,7 @@ const routes = [
|
|
|
68895
69194
|
},
|
|
68896
69195
|
{
|
|
68897
69196
|
path: 'framework-docs/:slug',
|
|
68898
|
-
loadComponent: () => import('./wuic-framework-lib-framework-docs.component-
|
|
69197
|
+
loadComponent: () => import('./wuic-framework-lib-framework-docs.component-BIULbCaM.mjs').then((m) => m.FrameworkDocsComponent),
|
|
68899
69198
|
canMatch: [menuRouteAccessCanMatchGuard],
|
|
68900
69199
|
canActivate: [menuRouteAccessCanActivateGuard],
|
|
68901
69200
|
data: {
|
|
@@ -68940,7 +69239,7 @@ const routes = [
|
|
|
68940
69239
|
},
|
|
68941
69240
|
{
|
|
68942
69241
|
path: ':route/report-designer',
|
|
68943
|
-
loadComponent: () => import('./wuic-framework-lib-report-designer.component-
|
|
69242
|
+
loadComponent: () => import('./wuic-framework-lib-report-designer.component-Cn3pUy16.mjs').then((m) => m.ReportDesignerComponent),
|
|
68944
69243
|
canMatch: [menuRouteAccessCanMatchGuard, featureRouteCanMatchGuard],
|
|
68945
69244
|
canActivate: [menuRouteAccessCanActivateGuard, featureRouteCanActivateGuard],
|
|
68946
69245
|
data: {
|
|
@@ -68950,7 +69249,7 @@ const routes = [
|
|
|
68950
69249
|
},
|
|
68951
69250
|
{
|
|
68952
69251
|
path: ':route/report-viewer',
|
|
68953
|
-
loadComponent: () => import('./wuic-framework-lib-report-viewer.component-
|
|
69252
|
+
loadComponent: () => import('./wuic-framework-lib-report-viewer.component-m-ianUWE.mjs').then((m) => m.ReportViewerComponent),
|
|
68954
69253
|
canMatch: [menuRouteAccessCanMatchGuard],
|
|
68955
69254
|
canActivate: [menuRouteAccessCanActivateGuard],
|
|
68956
69255
|
data: {
|
|
@@ -68970,7 +69269,7 @@ const routes = [
|
|
|
68970
69269
|
},
|
|
68971
69270
|
{
|
|
68972
69271
|
path: ':route/pivot-builder',
|
|
68973
|
-
loadComponent: () => import('./wuic-framework-lib-pivot-builder.component-
|
|
69272
|
+
loadComponent: () => import('./wuic-framework-lib-pivot-builder.component-DP60RcD5.mjs').then((m) => m.PivotBuilderComponent),
|
|
68974
69273
|
canMatch: [menuRouteAccessCanMatchGuard, featureRouteCanMatchGuard],
|
|
68975
69274
|
canActivate: [menuRouteAccessCanActivateGuard, featureRouteCanActivateGuard],
|
|
68976
69275
|
data: {
|
|
@@ -68980,7 +69279,7 @@ const routes = [
|
|
|
68980
69279
|
},
|
|
68981
69280
|
{
|
|
68982
69281
|
path: 'pivot-builder',
|
|
68983
|
-
loadComponent: () => import('./wuic-framework-lib-pivot-builder.component-
|
|
69282
|
+
loadComponent: () => import('./wuic-framework-lib-pivot-builder.component-DP60RcD5.mjs').then((m) => m.PivotBuilderComponent),
|
|
68984
69283
|
canMatch: [menuRouteAccessCanMatchGuard, featureRouteCanMatchGuard],
|
|
68985
69284
|
canActivate: [menuRouteAccessCanActivateGuard, featureRouteCanActivateGuard],
|
|
68986
69285
|
data: {
|
|
@@ -71079,5 +71378,5 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
|
|
|
71079
71378
|
* Generated bundle index. Do not edit.
|
|
71080
71379
|
*/
|
|
71081
71380
|
|
|
71082
|
-
export {
|
|
71083
|
-
//# sourceMappingURL=wuic-framework-lib-wuic-framework-lib-
|
|
71381
|
+
export { DEFAULT_THEME_STORAGE_KEY as $, ArchetypeConfiguratorComponent as A, AppSettingsEditorComponent as B, ChatbotHostRegistryService as C, DynamicGenericTemplateComponent as D, AuthSessionService as E, FilterBarComponent as F, GlobalHandler as G, BooleanEditorComponent as H, ImportExportButtonComponent as I, BoundedRepeaterComponent as J, ButtonEditorComponent as K, LazyParametricDialogComponent as L, MetadataProviderService as M, CUSTOM_THEMES_STORAGE_KEY as N, CallbackPipe as O, PagerComponent as P, CallbackPipe2 as Q, CarouselListComponent as R, CodeAreaEditorComponent as S, TranslationManagerService as T, UserInfoService as U, ColorEditorComponent as V, WtoolboxService as W, CrashReporterService as X, CustomAttributesService as Y, CustomException as Z, DEFAULT_FONT_STACK as _, DynamicCompilerService as a, UserLanguageService as a$, DEFAULT_THEME_VALUE as a0, DataActionButtonComponent as a1, DataProviderOdataService as a2, DateEditorComponent as a3, DesignerRouteComponent as a4, DictionaryEditorComponent as a5, DynamicRowTemplateComponent as a6, FormatGridViewValuePipe as a7, GetSrcUploadPreviewPipe as a8, HtmlEditorComponent as a9, NotificationRealtimeService as aA, NumberEditorComponent as aB, PALETTE_STOPS as aC, PREVIEW_RESTORE_KEY as aD, PRIMARY_PALETTES as aE, PerformanceInspectorComponent as aF, PointFilterComponent as aG, PropertyArrayEditorComponent as aH, PropertyObjectEditorComponent as aI, RAG_DESTRUCTIVE_KINDS as aJ, RouteMetricsDashboardComponent as aK, Scene3dDesignerRouteComponent as aL, Scene3dViewerRouteComponent as aM, THEME_MODE_STORAGE_KEY as aN, THEME_OPTIONS as aO, THEME_STORAGE_KEY as aP, TextAreaEditorComponent as aQ, TextEditorComponent as aR, ThemeBuilderComponent as aS, ThemeCatalogService as aT, ThemePreviewPanelComponent as aU, ThemeRuntimeService as aV, ThemeSelectorComponent as aW, TreeListComponent as aX, TreeViewSelectorComponent as aY, UploadDialogComponent as aZ, UploadEditorComponent as a_, ImageWrapperComponent as aa, IsSelectedRowPipe as ab, KanbanListComponent as ac, KanbanOptions as ad, KanbanStatusColumnItem as ae, LazyChartListComponent as af, LazyCodeEditorComponent as ag, LazyDataActionButtonComponent as ah, LazyDataSourceComponent as ai, LazyFieldEditorComponent as aj, LazyFirstRunWizardComponent as ak, LazyImageWrapperComponent as al, LazyKanbanListComponent as am, LazyMetaMenuComponent as an, LazyPivotBuilderComponent as ao, LazyReportDesignerComponent as ap, LazyReportViewerComponent as aq, LazySchedulerListComponent as ar, LazySpreadsheetListSfComponent as as, LazyTimelineListComponent as at, ListGridComponent as au, LookupEditorComponent as av, MapListComponent as aw, MetaMenuComponent as ax, MetadatiTabella as ay, NotificationBellComponent as az, DataSourceComponent as b, resolveThemePreset as b$, UserMenuComponent as b0, ValidationRule as b1, ValueChangedPayload as b2, VisibleFieldListPipe as b3, WUIC_FONT_CATALOG as b4, WidgetDefinition as b5, WorkflowDesignerRouteComponent as b6, WorkflowRunnerComponent as b7, WuicAziendaSwitcherComponent as b8, WuicErrorDialogComponent as b9, isCustomThemeValue as bA, isDestructiveRagAction as bB, isRoutePersistenceEnabled as bC, loadBooleanEditorComponent as bD, loadButtonEditorComponent as bE, loadCodeAreaEditorComponent as bF, loadColorEditorComponent as bG, loadDateEditorComponent as bH, loadDictionaryEditorComponent as bI, loadHtmlEditorComponent as bJ, loadLookupEditorComponent as bK, loadNumberEditorComponent as bL, loadPropertyArrayEditorComponent as bM, loadPropertyObjectEditorComponent as bN, loadTextAreaEditorComponent as bO, loadTextEditorComponent as bP, loadTreeViewSelectorComponent as bQ, loadUploadEditorComponent as bR, menuRouteAccessCanActivateGuard as bS, menuRouteAccessCanMatchGuard as bT, nearestPrimaryName as bU, normalizeHex$1 as bV, oklchToHex as bW, oklchToRgb as bX, resolveBackgroundCss as bY, resolveFontStack as bZ, resolveGridStrengths as b_, WuicErrorInterceptor as ba, WuicFeatureDirective as bb, WuicFrozenColumnDirective as bc, WuicRagChatbotComponent as bd, WuicRagChatbotFabComponent as be, WuicRagService as bf, WuicRowTogglerDirective as bg, _PRIMENG_TABLE_DIRECTIVES_NAMES as bh, authExpiredInterceptor as bi, bestContrastColor as bj, boundedRepeaterPendingChangesGuard as bk, buildCustomPreset as bl, buildThemeValue as bm, computeDataQualitySummary as bn, contrastRatio as bo, createDraftTheme as bp, featureRouteCanActivateGuard as bq, featureRouteCanMatchGuard as br, generatePrimaryPalette as bs, generateSurfacePalette as bt, getQualityInspectorOptions as bu, getThemePrimaryHex as bv, hexToOklch as bw, hexToRgb as bx, hsbaToRgbaString as by, inferTemplateFieldFromBaseClass as bz, DataRepeaterComponent as c, resolveThemePresetForOption as c0, rgbToHex as c1, rgbToOklch as c2, rgbaToHsbaModel as c3, routeMetricsClient as c4, routes as c5, scene3dDesignerPendingChangesGuard as c6, themeBuilderPendingChangesGuard as c7, wcagLevel as c8, wuicErrorInterceptor as c9, parametricDialog_component as ca, clampAlpha as d, toPersistedColor as e, exposeWuicCmpOnHost as f, ParametricDialogComponent as g, MetadatiColonna as h, DataProviderService as i, MetadataEditorService as j, WorkflowRuntimeMetadataService as k, FieldEditorComponent as l, MetadataEditorComponent as m, WuicClientException as n, WuicErrorCodes as o, MetaInfo as p, WUIC_SUPPRESS_GLOBAL_ERROR as q, FilterInfo as r, LicenseFeatureService as s, toHsbaModel as t, FilterItem as u, TimelineOptions as v, getThemeOptions as w, AUTH_REDIRECT_REASON_KEY as x, AppHeaderComponent as y, AppHeaderConfigService as z };
|
|
71382
|
+
//# sourceMappingURL=wuic-framework-lib-wuic-framework-lib-BlysiZLp.mjs.map
|