wuic-framework-lib 1.3.2 → 1.7.0

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.
Files changed (27) hide show
  1. package/fesm2022/{wuic-framework-lib-chart-list.component-DAP-TPJR.mjs → wuic-framework-lib-chart-list.component-Bl424n7x.mjs} +49 -37
  2. package/fesm2022/{wuic-framework-lib-code-editor.component-CLMDvOWs.mjs → wuic-framework-lib-code-editor.component-N6HMl2mf.mjs} +441 -277
  3. package/fesm2022/{wuic-framework-lib-designer.component-DA7abiLW.mjs → wuic-framework-lib-designer.component-Bd2fwl6H.mjs} +1948 -641
  4. package/fesm2022/{wuic-framework-lib-first-run-wizard.component-BLrUrfZ9.mjs → wuic-framework-lib-first-run-wizard.component-NN6cWVHL.mjs} +18 -20
  5. package/fesm2022/{wuic-framework-lib-framework-docs.component-DphKhTef.mjs → wuic-framework-lib-framework-docs.component-B867JAYe.mjs} +4205 -380
  6. package/fesm2022/{wuic-framework-lib-pivot-builder.component-BqUUwrJM.mjs → wuic-framework-lib-pivot-builder.component-DWukH0L-.mjs} +578 -66
  7. package/fesm2022/{wuic-framework-lib-prompt-dialog-fallback-host.component-DZrhwMH5.mjs → wuic-framework-lib-prompt-dialog-fallback-host.component-DWO1Rcgv.mjs} +2 -2
  8. package/fesm2022/wuic-framework-lib-report-designer.component-QcrU81m6.mjs +380 -0
  9. package/fesm2022/wuic-framework-lib-report-scaffold-dialog.component-U-zdOoRV.mjs +431 -0
  10. package/fesm2022/{wuic-framework-lib-report-viewer.component-CIN2fY0P.mjs → wuic-framework-lib-report-viewer.component-B4LhA3SL.mjs} +8 -13
  11. package/fesm2022/wuic-framework-lib-scene3d-designer.component-DjOfzKLo.mjs +4813 -0
  12. package/fesm2022/wuic-framework-lib-scene3d-light-baker-gpu-C96T9uIW.mjs +303 -0
  13. package/fesm2022/wuic-framework-lib-scene3d-shader-effect-DjHyCAFK.mjs +2807 -0
  14. package/fesm2022/wuic-framework-lib-scene3d-viewer.component-Dboz1fjl.mjs +1130 -0
  15. package/fesm2022/{wuic-framework-lib-scheduler-list.component-CdcI1Uor.mjs → wuic-framework-lib-scheduler-list.component--wY21R3o.mjs} +169 -53
  16. package/fesm2022/{wuic-framework-lib-spreadsheet-list-sf.component-j1HTRI_P.mjs → wuic-framework-lib-spreadsheet-list-sf.component-Ek30J8v-.mjs} +147 -106
  17. package/fesm2022/{wuic-framework-lib-stimulsoft-license.service-BIyxB4pO.mjs → wuic-framework-lib-stimulsoft-license.service-CsNNSFYs.mjs} +3 -3
  18. package/fesm2022/wuic-framework-lib-timeline-list.component-aqCH4P0G.mjs +805 -0
  19. package/fesm2022/wuic-framework-lib-workflow-designer.component-DMM8BeXm.mjs +9504 -0
  20. package/fesm2022/{wuic-framework-lib-wuic-framework-lib-BRujEwpR.mjs → wuic-framework-lib-wuic-framework-lib-dfLTqam5.mjs} +14713 -8403
  21. package/fesm2022/wuic-framework-lib.mjs +1 -1
  22. package/package.json +5 -2
  23. package/styles/_wuic-tokens.scss +82 -0
  24. package/styles/styles.scss +160 -0
  25. package/types/wuic-framework-lib.d.ts +5971 -3666
  26. package/fesm2022/wuic-framework-lib-report-designer.component-D_qbefud.mjs +0 -194
  27. package/fesm2022/wuic-framework-lib-workflow-designer.component-SE_7ZogW.mjs +0 -5114
@@ -2,7 +2,7 @@ import * as i0 from '@angular/core';
2
2
  import { EventEmitter, Output, Input, Component } from '@angular/core';
3
3
  import * as i2 from 'primeng/dialog';
4
4
  import { DialogModule } from 'primeng/dialog';
5
- import { d as ParametricDialogComponent } from './wuic-framework-lib-wuic-framework-lib-BRujEwpR.mjs';
5
+ import { f as ParametricDialogComponent } from './wuic-framework-lib-wuic-framework-lib-dfLTqam5.mjs';
6
6
 
7
7
  class PromptDialogFallbackHostComponent {
8
8
  datasource;
@@ -96,4 +96,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
96
96
  }] } });
97
97
 
98
98
  export { PromptDialogFallbackHostComponent };
99
- //# sourceMappingURL=wuic-framework-lib-prompt-dialog-fallback-host.component-DZrhwMH5.mjs.map
99
+ //# sourceMappingURL=wuic-framework-lib-prompt-dialog-fallback-host.component-DWO1Rcgv.mjs.map
@@ -0,0 +1,380 @@
1
+ import * as i0 from '@angular/core';
2
+ import { ViewChild, Component } from '@angular/core';
3
+ import { W as WtoolboxService, M as MetadataProviderService, C as ChatbotHostRegistryService } from './wuic-framework-lib-wuic-framework-lib-dfLTqam5.mjs';
4
+ import * as i4 from 'stimulsoft-designer-angular';
5
+ import { StimulsoftDesignerModule, StimulsoftDesignerComponent } from 'stimulsoft-designer-angular';
6
+ import * as i1 from '@angular/router';
7
+ import { NavigationEnd } from '@angular/router';
8
+ import { e as ensureWuicStimulsoftLicenseRegistered } from './wuic-framework-lib-stimulsoft-license.service-CsNNSFYs.mjs';
9
+
10
+ /** Kind delle proposte gestite da questa pagina. */
11
+ const REPORT_INJECT_KIND = 'report_inject';
12
+ /** Template supportati dallo scaffolder di report del framework. */
13
+ const REPORT_TEMPLATES = ['bands', 'crosstab', 'crossgroup'];
14
+ /** Aggregazioni supportate dallo scaffolder. */
15
+ const REPORT_AGGREGATIONS = ['Sum', 'Avg', 'Count', 'Min', 'Max'];
16
+ class ReportDesignerComponent {
17
+ router;
18
+ aRoute;
19
+ metaSrv;
20
+ chatbotHostRegistry;
21
+ hostElementRef;
22
+ /**
23
+ * Vedi commento equivalente in `report-viewer.component.ts`: registra la
24
+ * Stimulsoft license al primo mount del designer (lazy-load del chunk
25
+ * `stimulsoft-reports-js` che pesa ~5.4 MB / 12.7 MB raw).
26
+ */
27
+ ngOnInit() {
28
+ void ensureWuicStimulsoftLicenseRegistered();
29
+ this.chatbotHostRegistry.register(REPORT_INJECT_KIND, this.onChatbotProposedReportAction.bind(this));
30
+ this.chatbotHostRegistry.registerStateProvider(REPORT_INJECT_KIND, this.buildReportStateDump.bind(this));
31
+ // Precarica le colonne per il dump: il provider e' sincrono, quindi il
32
+ // primo turno di chat userebbe una cache vuota.
33
+ void this.primeReportDumpCache();
34
+ try {
35
+ const el = this.hostElementRef?.nativeElement;
36
+ if (el)
37
+ el.__wuicCmp = this;
38
+ }
39
+ catch { /* ambiente senza DOM */ }
40
+ }
41
+ /**
42
+ * Riferimento a elementi o componenti figli usato dalla logica UI per designer.
43
+ */
44
+ designer;
45
+ /**
46
+ * Proprieta di stato del componente per request url, usata dalla logica interna e dal template.
47
+ */
48
+ requestUrl;
49
+ /**
50
+ * Proprieta di stato del componente per base request url, usata dalla logica interna e dal template.
51
+ */
52
+ baseRequestUrl;
53
+ /**
54
+ * Proprieta di stato del componente per route, usata dalla logica interna e dal template.
55
+ */
56
+ route;
57
+ /**
58
+ * Valore corrente selezionato per current report, usato dai flussi interattivi del componente.
59
+ */
60
+ currentReport;
61
+ /**
62
+ * Proprieta di stato del componente per router events subscription, usata dalla logica interna e dal template.
63
+ */
64
+ routerEventsSubscription;
65
+ /**
66
+ * Proprieta di stato del componente per designer bootstrap interval, usata dalla logica interna e dal template.
67
+ */
68
+ designerBootstrapInterval;
69
+ reportCacheInvalidationTimer;
70
+ /**
71
+ * function Object() { [native code] }
72
+ * @param router Informazioni di routing usate per comporre o risolvere la navigazione.
73
+ * @param aRoute Informazioni di routing usate per comporre o risolvere la navigazione.
74
+ */
75
+ constructor(router, aRoute, metaSrv, chatbotHostRegistry, hostElementRef) {
76
+ this.router = router;
77
+ this.aRoute = aRoute;
78
+ this.metaSrv = metaSrv;
79
+ this.chatbotHostRegistry = chatbotHostRegistry;
80
+ this.hostElementRef = hostElementRef;
81
+ this.baseRequestUrl = WtoolboxService.appSettings.api_url + 'ReportDesigner';
82
+ this.requestUrl = WtoolboxService.appSettings.api_url + 'ReportDesigner';
83
+ this.syncRequestUrl();
84
+ this.routerEventsSubscription = this.router.events.subscribe((val) => {
85
+ if (val instanceof NavigationEnd) {
86
+ this.syncRequestUrl();
87
+ }
88
+ });
89
+ }
90
+ /**
91
+ * Esegue operazioni di persistenza/sincronizzazione in `syncRequestUrl` allineando lo stato con parametri route/query.
92
+ */
93
+ syncRequestUrl() {
94
+ this.route = this.aRoute.snapshot.paramMap.get('route');
95
+ const reportName = this.aRoute.snapshot.queryParamMap.get('reportName');
96
+ this.currentReport = reportName || '';
97
+ this.requestUrl = this.baseRequestUrl + '?route=' + this.route
98
+ + (reportName ? '&reportName=' + encodeURIComponent(reportName) : '');
99
+ }
100
+ /**
101
+ * Gestisce la logica di `fix` con il flusso specifico definito dalla sua implementazione.
102
+ */
103
+ fix() {
104
+ let designer;
105
+ debugger;
106
+ }
107
+ /**
108
+ * Completa inizializzazione dopo il rendering della view e collega riferimenti UI.
109
+ *
110
+ * NOTE: <stimulsoft-designer-angular> is now wrapped in @defer (on immediate)
111
+ * in the template — so the @ViewChild reference (`this.designer`) may not be
112
+ * resolved yet when ngAfterViewInit first fires. The bootstrap interval below
113
+ * already polls for readiness, but we guard the initial access too.
114
+ */
115
+ ngAfterViewInit() {
116
+ let self = this;
117
+ this.designerBootstrapInterval = setInterval(() => {
118
+ if (!this.designer) {
119
+ return; // @defer block hasn't rendered yet
120
+ }
121
+ if (this.designer.designerEl?.nativeElement && this.designer.designerEl.nativeElement.style.height !== "100%") {
122
+ this.designer.designerEl.nativeElement.style.height = "100%";
123
+ }
124
+ if (this.designer.designer) {
125
+ if (this.designer.designerEl.nativeElement.getElementsByClassName("stiChildWorkPanel stiWorkPanelScrollContainer").length > 0) {
126
+ if (this.designer.designerEl.nativeElement.getElementsByClassName("stiChildWorkPanel stiWorkPanelScrollContainer")[0].getElementsByTagName("table").length > 0) {
127
+ if (this.designerBootstrapInterval) {
128
+ clearInterval(this.designerBootstrapInterval);
129
+ this.designerBootstrapInterval = undefined;
130
+ }
131
+ let tr = this.designer.designerEl.nativeElement.getElementsByClassName("stiChildWorkPanel stiWorkPanelScrollContainer")[0].getElementsByTagName("table")[0].getElementsByTagName("tr")[0];
132
+ let saveBtn = tr.children[0];
133
+ saveBtn.addEventListener("click", () => {
134
+ if (this.reportCacheInvalidationTimer) {
135
+ clearTimeout(this.reportCacheInvalidationTimer);
136
+ }
137
+ // Delay breve per lasciare al designer il tempo di completare la save lato backend.
138
+ this.reportCacheInvalidationTimer = setTimeout(() => {
139
+ this.metaSrv.invalidateReportListCache(this.route);
140
+ }, 400);
141
+ });
142
+ let cloned = saveBtn.cloneNode(true);
143
+ cloned.id = "saveAsBtn";
144
+ saveBtn.parentElement.prepend(cloned);
145
+ (cloned).getElementsByTagName("table")[0].getElementsByTagName("tr")[2].getElementsByTagName("td")[0].innerText = "Save As";
146
+ setTimeout(() => {
147
+ cloned.className = "stiDesignerStandartBigButton stiDesignerStandartBigButton_Mouse stiDesignerStandartBigButtonDefault";
148
+ }, 200);
149
+ cloned.onclick = () => {
150
+ debugger;
151
+ //ask name -> save copy of current
152
+ //change requestUrl and reload
153
+ };
154
+ let td = document.createElement("td");
155
+ td.className = "stiDesignerClearAllStyles";
156
+ let div = document.createElement("div");
157
+ div.className = "stiDesignerGroupBlock";
158
+ let div2 = document.createElement("div");
159
+ div2.className = "stiDesignerGroupBlockContainer";
160
+ let formElement = document.createElement("select");
161
+ formElement.className = "stiDesignerTextBox stiDesignerTextBoxDefault";
162
+ let optionElement = document.createElement("option");
163
+ optionElement.value = "foo";
164
+ optionElement.text = "foo";
165
+ optionElement.selected = true;
166
+ formElement.appendChild(optionElement);
167
+ optionElement = document.createElement("option");
168
+ optionElement.value = "foo2";
169
+ optionElement.text = "foo2";
170
+ optionElement.selected = false;
171
+ formElement.appendChild(optionElement);
172
+ formElement.id = "bar";
173
+ td.appendChild(div);
174
+ div.appendChild(div2);
175
+ div2.appendChild(formElement);
176
+ formElement.onchange = () => {
177
+ debugger;
178
+ //set current report
179
+ self.currentReport = formElement.value;
180
+ //change requestUrl and reload
181
+ this.requestUrl = this.baseRequestUrl + '?route=' + this.route + '&reportName=' + self.currentReport;
182
+ };
183
+ tr.prepend(td);
184
+ }
185
+ }
186
+ }
187
+ }, 500);
188
+ }
189
+ /**
190
+ * Rilascia risorse e sottoscrizioni per evitare leak e stati pendenti.
191
+ */
192
+ ngOnDestroy() {
193
+ try {
194
+ this.chatbotHostRegistry.unregister(REPORT_INJECT_KIND);
195
+ this.chatbotHostRegistry.unregisterStateProvider(REPORT_INJECT_KIND);
196
+ }
197
+ catch { /* best-effort */ }
198
+ try {
199
+ const el = this.hostElementRef?.nativeElement;
200
+ if (el)
201
+ delete el.__wuicCmp;
202
+ }
203
+ catch { /* ambiente senza DOM */ }
204
+ this.routerEventsSubscription?.unsubscribe();
205
+ if (this.designerBootstrapInterval) {
206
+ clearInterval(this.designerBootstrapInterval);
207
+ this.designerBootstrapInterval = undefined;
208
+ }
209
+ if (this.reportCacheInvalidationTimer) {
210
+ clearTimeout(this.reportCacheInvalidationTimer);
211
+ this.reportCacheInvalidationTimer = undefined;
212
+ }
213
+ }
214
+ // ==========================================================================
215
+ // Assistente contestuale (kind `report_inject`)
216
+ //
217
+ // Lo state del report vive nell'oggetto Stimulsoft, non in questo componente:
218
+ // non c'e' nulla di nostro da mutare. Si riusa quindi lo scaffolder server
219
+ // (`MetadataProviderService.scaffoldReport` -> `ReportScaffolder`), che e' lo
220
+ // stesso usato dal dialog "crea report" del metadata-editor.
221
+ //
222
+ // NB: a differenza degli altri kind *_inject, l'apply scrive subito un file
223
+ // sul server. Il report aperto NON viene toccato: il nome e' sempre nuovo e
224
+ // timestampato.
225
+ // ==========================================================================
226
+ /** Colonne della route, per il dump sincrono e per validare le proposte. */
227
+ reportDumpColumns = [];
228
+ reportDumpReports = [];
229
+ /** Popola la cache usata dal dump (provider sincrono). Best-effort. */
230
+ async primeReportDumpCache() {
231
+ const route = this.route;
232
+ if (!route)
233
+ return;
234
+ try {
235
+ const cols = await this.metaSrv.getMetadati(route);
236
+ this.reportDumpColumns = (cols ?? []).map((c) => {
237
+ const dbType = String(c?.mc_db_column_type ?? '').toLowerCase();
238
+ return {
239
+ name: String(c?.mc_nome_colonna ?? ''),
240
+ type: String(c?.mc_ui_column_type ?? dbType),
241
+ numeric: /int|decimal|numeric|float|real|money|double|number/.test(dbType),
242
+ };
243
+ }).filter((c) => !!c.name);
244
+ }
245
+ catch { /* dump degradato, non bloccante */ }
246
+ try {
247
+ const list = await this.metaSrv.getReportList(route);
248
+ this.reportDumpReports = (list ?? []).map((r) => String(r?.name ?? '')).filter(Boolean);
249
+ }
250
+ catch { /* idem */ }
251
+ }
252
+ /**
253
+ * Genera un report dalla descrizione dell'utente. Pubblico: i test e2e
254
+ * deterministici lo invocano via `__wuicCmp`.
255
+ */
256
+ async onChatbotProposedReportAction(action) {
257
+ try {
258
+ const a = action;
259
+ const actionType = String(a?.action_type ?? 'scaffold').trim();
260
+ if (actionType !== 'scaffold') {
261
+ return { ok: false, message: `operazione '${actionType}' non supportata (solo 'scaffold')` };
262
+ }
263
+ if (!this.route)
264
+ return { ok: false, message: 'route del report designer non risolta' };
265
+ const template = String(a?.template ?? '').trim().toLowerCase();
266
+ if (!REPORT_TEMPLATES.includes(template)) {
267
+ return { ok: false, message: `template '${template}' non valido (${REPORT_TEMPLATES.join('|')})` };
268
+ }
269
+ const config = a?.config ?? {};
270
+ const invalid = this.validateReportConfig(template, config);
271
+ if (invalid)
272
+ return { ok: false, message: invalid };
273
+ // Nome sempre nuovo: mai sovrascrivere il report aperto.
274
+ // NB: il backend rifiuta con `invalid_config` un nome che non termina in
275
+ // `.mrt` o che contiene separatori di path (guardia anti-traversal in
276
+ // MetaService.scaffoldReport): l'estensione va aggiunta qui.
277
+ const stamp = WtoolboxService.getTimestamp();
278
+ const base = String(a?.report_name ?? '').trim()
279
+ .replace(/\.mrt$/i, '')
280
+ .replace(/[^A-Za-z0-9_\-]/g, '_') || 'Report';
281
+ const reportName = `${base}_${stamp}.mrt`;
282
+ const res = await this.metaSrv.scaffoldReport(this.route, reportName, template, config);
283
+ if (!res?.ok) {
284
+ const code = res?.errorCode ?? 'scaffold_failed';
285
+ const hint = code === 'admin_required'
286
+ ? ' (la generazione dei report richiede privilegi amministrativi)' : '';
287
+ return { ok: false, message: `generazione non riuscita: ${code}${hint}` };
288
+ }
289
+ const created = res.reportName || reportName;
290
+ this.reportDumpReports = [created, ...this.reportDumpReports];
291
+ // Apre il report appena creato nel designer.
292
+ await this.router.navigateByUrl(`/${this.route}/report-designer?reportName=${encodeURIComponent(created)}`);
293
+ return { ok: true, message: `report '${created}' generato e aperto. Il report precedente non e' stato modificato.` };
294
+ }
295
+ catch (e) {
296
+ return { ok: false, message: `errore nella generazione: ${e?.message ?? e}` };
297
+ }
298
+ }
299
+ /**
300
+ * Valida la configurazione contro il template e contro le colonne REALI della
301
+ * route: una colonna inesistente produrrebbe un report vuoto senza errore.
302
+ * Ritorna `null` se la configurazione e' valida.
303
+ */
304
+ validateReportConfig(template, config) {
305
+ const known = new Set(this.reportDumpColumns.map((c) => c.name));
306
+ const checkCols = (cols, where) => {
307
+ for (const c of cols ?? []) {
308
+ const name = String(c ?? '');
309
+ if (known.size > 0 && !known.has(name)) {
310
+ return `colonna '${name}' (${where}) inesistente su '${this.route}'. Disponibili: ${[...known].slice(0, 12).join(', ')}`;
311
+ }
312
+ }
313
+ return null;
314
+ };
315
+ if (template === 'bands') {
316
+ const b = config?.bands;
317
+ if (!b?.columns?.length)
318
+ return 'template bands: config.bands.columns e\' obbligatorio';
319
+ return checkCols(b.columns, 'bands.columns');
320
+ }
321
+ if (template === 'crosstab') {
322
+ const c = config?.crosstab;
323
+ if (!c?.rows?.length || !c?.column || !c?.value) {
324
+ return 'template crosstab: config.crosstab richiede rows[], column e value';
325
+ }
326
+ if (!REPORT_AGGREGATIONS.includes(String(c.aggregation ?? 'Sum'))) {
327
+ return `aggregazione '${c.aggregation}' non valida (${REPORT_AGGREGATIONS.join('|')})`;
328
+ }
329
+ return checkCols([...c.rows, c.column, c.value], 'crosstab');
330
+ }
331
+ // crossgroup
332
+ const g = config?.crossGroup;
333
+ if (!g?.groupBy)
334
+ return 'template crossgroup: config.crossGroup.groupBy e\' obbligatorio';
335
+ // Il backend rifiuta con invalid_config anche detailColumns vuoto: meglio
336
+ // dirlo qui che dopo un round-trip.
337
+ if (!g?.detailColumns?.length)
338
+ return 'template crossgroup: config.crossGroup.detailColumns non puo\' essere vuoto';
339
+ for (const t of g.totals ?? []) {
340
+ if (!REPORT_AGGREGATIONS.includes(String(t?.aggregation ?? 'Sum'))) {
341
+ return `aggregazione '${t?.aggregation}' non valida (${REPORT_AGGREGATIONS.join('|')})`;
342
+ }
343
+ }
344
+ return checkCols([g.groupBy, ...(g.detailColumns ?? []), ...(g.totals ?? []).map((t) => t?.column)], 'crossGroup');
345
+ }
346
+ /** Snapshot per il contesto del modello. `null` se la route non e' risolta. */
347
+ buildReportStateDump() {
348
+ if (!this.route)
349
+ return null;
350
+ const lines = [];
351
+ lines.push(`REPORT DESIGNER: route=${this.route}, report corrente="${this.currentReport || '(nuovo)'}"`);
352
+ if (this.reportDumpColumns.length > 0) {
353
+ const all = this.reportDumpColumns.slice(0, 30).map((c) => `${c.name}(${c.type})`).join(', ');
354
+ lines.push(`COLONNE DISPONIBILI (${this.reportDumpColumns.length}): ${all}`);
355
+ const nums = this.reportDumpColumns.filter((c) => c.numeric).map((c) => c.name);
356
+ lines.push(`COLONNE NUMERICHE (per value/totals): ${nums.join(', ') || '(nessuna)'}`);
357
+ }
358
+ else {
359
+ lines.push('COLONNE DISPONIBILI: <caricamento in corso>');
360
+ }
361
+ if (this.reportDumpReports.length > 0) {
362
+ lines.push(`REPORT ESISTENTI (${this.reportDumpReports.length}): ${this.reportDumpReports.slice(0, 10).join(', ')}`);
363
+ }
364
+ lines.push(`TEMPLATE: ${REPORT_TEMPLATES.join(' | ')} — AGGREGAZIONI: ${REPORT_AGGREGATIONS.join(', ')}`);
365
+ lines.push('L\'apply genera un file di report NUOVO lato server (nome timestampato): il report aperto non viene sovrascritto.');
366
+ return lines.join('\n');
367
+ }
368
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ReportDesignerComponent, deps: [{ token: i1.Router }, { token: i1.ActivatedRoute }, { token: MetadataProviderService }, { token: ChatbotHostRegistryService }, { token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component });
369
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: ReportDesignerComponent, isStandalone: true, selector: "wuic-report-designer", viewQueries: [{ propertyName: "designer", first: true, predicate: StimulsoftDesignerComponent, descendants: true }], ngImport: i0, template: "@defer (on immediate) {\r\n <stimulsoft-designer-angular #designer [requestUrl]=\"requestUrl\" [width]=\"'100%'\"\r\n [height]=\"'100%'\"></stimulsoft-designer-angular>\r\n} @placeholder {\r\n <div class=\"stimulsoft-loading-placeholder\">\r\n <i class=\"pi pi-spin pi-spinner\"></i>\r\n <span>Caricamento Report Designer\u2026</span>\r\n <small>Il SDK Stimulsoft \u00E8 in download (~16 MB). Operazione una tantum.</small>\r\n </div>\r\n} @loading (minimum 300ms) {\r\n <div class=\"stimulsoft-loading-placeholder\">\r\n <i class=\"pi pi-spin pi-spinner\"></i>\r\n <span>Inizializzazione editor\u2026</span>\r\n </div>\r\n} @error {\r\n <div class=\"stimulsoft-error-placeholder\">\r\n <i class=\"pi pi-exclamation-triangle\"></i>\r\n <span>Errore nel caricamento del Report Designer. Verifica connessione e ricarica la pagina.</span>\r\n </div>\r\n}", styles: [":host{display:flex;width:100%;height:100%;min-height:0;flex:1 1 auto}:host ::ng-deep stimulsoft-designer-angular{display:block;width:100%;height:100%;min-height:0;flex:1 1 auto}:host ::ng-deep .stiDesignerMainPanel,:host ::ng-deep .stiDesignerMainPanel *{box-sizing:border-box}:host ::ng-deep .stiDesignerMainPanel{height:100%!important;min-height:0!important}.stimulsoft-loading-placeholder,.stimulsoft-error-placeholder{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;width:100%;height:100%;min-height:400px;color:#64748b;font-size:1rem;background:#f8fafc;border:1px dashed #cbd5e1;border-radius:8px}.stimulsoft-loading-placeholder .pi-spinner{font-size:2rem;color:#6366f1}.stimulsoft-loading-placeholder small{font-size:.8rem;color:#94a3b8;max-width:400px;text-align:center}.stimulsoft-error-placeholder{color:#b91c1c;background:#fef2f2;border-color:#fecaca}.stimulsoft-error-placeholder .pi-exclamation-triangle{font-size:2rem}\n"], dependencies: [{ kind: "ngmodule", type: StimulsoftDesignerModule }], deferBlockDependencies: [() => [i4.StimulsoftDesignerComponent]] });
370
+ }
371
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: ReportDesignerComponent, decorators: [{
372
+ type: Component,
373
+ args: [{ selector: 'wuic-report-designer', imports: [StimulsoftDesignerModule], template: "@defer (on immediate) {\r\n <stimulsoft-designer-angular #designer [requestUrl]=\"requestUrl\" [width]=\"'100%'\"\r\n [height]=\"'100%'\"></stimulsoft-designer-angular>\r\n} @placeholder {\r\n <div class=\"stimulsoft-loading-placeholder\">\r\n <i class=\"pi pi-spin pi-spinner\"></i>\r\n <span>Caricamento Report Designer\u2026</span>\r\n <small>Il SDK Stimulsoft \u00E8 in download (~16 MB). Operazione una tantum.</small>\r\n </div>\r\n} @loading (minimum 300ms) {\r\n <div class=\"stimulsoft-loading-placeholder\">\r\n <i class=\"pi pi-spin pi-spinner\"></i>\r\n <span>Inizializzazione editor\u2026</span>\r\n </div>\r\n} @error {\r\n <div class=\"stimulsoft-error-placeholder\">\r\n <i class=\"pi pi-exclamation-triangle\"></i>\r\n <span>Errore nel caricamento del Report Designer. Verifica connessione e ricarica la pagina.</span>\r\n </div>\r\n}", styles: [":host{display:flex;width:100%;height:100%;min-height:0;flex:1 1 auto}:host ::ng-deep stimulsoft-designer-angular{display:block;width:100%;height:100%;min-height:0;flex:1 1 auto}:host ::ng-deep .stiDesignerMainPanel,:host ::ng-deep .stiDesignerMainPanel *{box-sizing:border-box}:host ::ng-deep .stiDesignerMainPanel{height:100%!important;min-height:0!important}.stimulsoft-loading-placeholder,.stimulsoft-error-placeholder{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:12px;width:100%;height:100%;min-height:400px;color:#64748b;font-size:1rem;background:#f8fafc;border:1px dashed #cbd5e1;border-radius:8px}.stimulsoft-loading-placeholder .pi-spinner{font-size:2rem;color:#6366f1}.stimulsoft-loading-placeholder small{font-size:.8rem;color:#94a3b8;max-width:400px;text-align:center}.stimulsoft-error-placeholder{color:#b91c1c;background:#fef2f2;border-color:#fecaca}.stimulsoft-error-placeholder .pi-exclamation-triangle{font-size:2rem}\n"] }]
374
+ }], ctorParameters: () => [{ type: i1.Router }, { type: i1.ActivatedRoute }, { type: MetadataProviderService }, { type: ChatbotHostRegistryService }, { type: i0.ElementRef }], propDecorators: { designer: [{
375
+ type: ViewChild,
376
+ args: [StimulsoftDesignerComponent]
377
+ }] } });
378
+
379
+ export { ReportDesignerComponent };
380
+ //# sourceMappingURL=wuic-framework-lib-report-designer.component-QcrU81m6.mjs.map