wuic-framework-lib 1.7.2 → 1.7.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (21) hide show
  1. package/fesm2022/{wuic-framework-lib-chart-list.component-MeAS47VV.mjs → wuic-framework-lib-chart-list.component-B7d2AQ3G.mjs} +2 -2
  2. package/fesm2022/{wuic-framework-lib-code-editor.component-WtZC2MZC.mjs → wuic-framework-lib-code-editor.component-Bx_fV1X1.mjs} +2 -2
  3. package/fesm2022/{wuic-framework-lib-designer.component-Dt7Yz5hn.mjs → wuic-framework-lib-designer.component-CohHkalb.mjs} +2 -2
  4. package/fesm2022/{wuic-framework-lib-first-run-wizard.component-C8nhy5yK.mjs → wuic-framework-lib-first-run-wizard.component-BoP77ip9.mjs} +2 -2
  5. package/fesm2022/{wuic-framework-lib-framework-docs.component-CGsugPCx.mjs → wuic-framework-lib-framework-docs.component-CcyeNUzz.mjs} +8 -8
  6. package/fesm2022/{wuic-framework-lib-pivot-builder.component-S5zqy3vj.mjs → wuic-framework-lib-pivot-builder.component-BUkGGFaw.mjs} +2 -2
  7. package/fesm2022/{wuic-framework-lib-prompt-dialog-fallback-host.component-VY-gtgRW.mjs → wuic-framework-lib-prompt-dialog-fallback-host.component-DPapKCIE.mjs} +2 -2
  8. package/fesm2022/{wuic-framework-lib-report-designer.component-QRxxueU-.mjs → wuic-framework-lib-report-designer.component-A6_tmp6z.mjs} +2 -2
  9. package/fesm2022/{wuic-framework-lib-report-scaffold-dialog.component-OGdglGPw.mjs → wuic-framework-lib-report-scaffold-dialog.component-Dbrx9bSq.mjs} +2 -2
  10. package/fesm2022/{wuic-framework-lib-report-viewer.component-CuXw3e0j.mjs → wuic-framework-lib-report-viewer.component-CYl77DcU.mjs} +2 -2
  11. package/fesm2022/{wuic-framework-lib-scene3d-designer.component-LhC0KzWO.mjs → wuic-framework-lib-scene3d-designer.component-DyVwOmXa.mjs} +3 -3
  12. package/fesm2022/{wuic-framework-lib-scene3d-light-baker-gpu-B5ywsrSp.mjs → wuic-framework-lib-scene3d-light-baker-gpu-DEGIR8lh.mjs} +2 -2
  13. package/fesm2022/{wuic-framework-lib-scene3d-viewer.component-DiDqJO-P.mjs → wuic-framework-lib-scene3d-viewer.component-G_ykpDDF.mjs} +2 -2
  14. package/fesm2022/{wuic-framework-lib-scheduler-list.component-5JbxIBdp.mjs → wuic-framework-lib-scheduler-list.component-C_1YjS3c.mjs} +2 -2
  15. package/fesm2022/{wuic-framework-lib-spreadsheet-list-sf.component-Dxk5d9au.mjs → wuic-framework-lib-spreadsheet-list-sf.component-BKtu4edX.mjs} +2 -2
  16. package/fesm2022/{wuic-framework-lib-timeline-list.component-B1ro-16J.mjs → wuic-framework-lib-timeline-list.component-Dcosb8Zx.mjs} +4 -4
  17. package/fesm2022/{wuic-framework-lib-workflow-designer.component-D32ZMxq2.mjs → wuic-framework-lib-workflow-designer.component-BXnoS_ts.mjs} +2 -2
  18. package/fesm2022/{wuic-framework-lib-wuic-framework-lib-81WUtxz8.mjs → wuic-framework-lib-wuic-framework-lib-54sySY_p.mjs} +39 -24
  19. package/fesm2022/wuic-framework-lib.mjs +1 -1
  20. package/package.json +1 -1
  21. package/types/wuic-framework-lib.d.ts +15 -2
@@ -1,7 +1,7 @@
1
1
  import * as i0 from '@angular/core';
2
2
  import { EventEmitter, ViewChild, Output, Input, Component } from '@angular/core';
3
3
  import { BehaviorSubject } from 'rxjs';
4
- import { W as WtoolboxService, m as WuicClientException, n as WuicErrorCodes, G as GlobalHandler, M as MetadataProviderService, T as TranslationManagerService, U as UserInfoService, A as ArchetypeConfiguratorComponent } from './wuic-framework-lib-wuic-framework-lib-81WUtxz8.mjs';
4
+ import { W as WtoolboxService, m as WuicClientException, n as WuicErrorCodes, G as GlobalHandler, M as MetadataProviderService, T as TranslationManagerService, U as UserInfoService, A as ArchetypeConfiguratorComponent } from './wuic-framework-lib-wuic-framework-lib-54sySY_p.mjs';
5
5
  import * as i4 from 'primeng/chart';
6
6
  import { ChartModule } from 'primeng/chart';
7
7
  import * as i8 from '@ngx-translate/core';
@@ -1389,4 +1389,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
1389
1389
  }] } });
1390
1390
 
1391
1391
  export { ChartListComponent };
1392
- //# sourceMappingURL=wuic-framework-lib-chart-list.component-MeAS47VV.mjs.map
1392
+ //# sourceMappingURL=wuic-framework-lib-chart-list.component-B7d2AQ3G.mjs.map
@@ -6,7 +6,7 @@ import * as i1$1 from '@materia-ui/ngx-monaco-editor';
6
6
  import { MonacoEditorModule } from '@materia-ui/ngx-monaco-editor';
7
7
  import { filter, take } from 'rxjs/operators';
8
8
  import { Emitter } from 'monaco-editor/esm/vs/base/common/event';
9
- import { W as WtoolboxService, M as MetadataProviderService, g as MetadatiColonna, o as MetaInfo, U as UserInfoService, h as DataProviderService } from './wuic-framework-lib-wuic-framework-lib-81WUtxz8.mjs';
9
+ import { W as WtoolboxService, M as MetadataProviderService, g as MetadatiColonna, o as MetaInfo, U as UserInfoService, h as DataProviderService } from './wuic-framework-lib-wuic-framework-lib-54sySY_p.mjs';
10
10
  import { NgTemplateOutlet, NgClass, NgStyle } from '@angular/common';
11
11
  import * as i14 from 'primeng/contextmenu';
12
12
  import { ContextMenuModule } from 'primeng/contextmenu';
@@ -4160,4 +4160,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
4160
4160
  }] } });
4161
4161
 
4162
4162
  export { CodeEditorComponent };
4163
- //# sourceMappingURL=wuic-framework-lib-code-editor.component-WtZC2MZC.mjs.map
4163
+ //# sourceMappingURL=wuic-framework-lib-code-editor.component-Bx_fV1X1.mjs.map
@@ -5,7 +5,7 @@ import { SplitterModule } from 'primeng/splitter';
5
5
  import * as i12 from 'primeng/dragdrop';
6
6
  import { DragDropModule } from 'primeng/dragdrop';
7
7
  import { NgClass, NgStyle, NgTemplateOutlet, AsyncPipe, JsonPipe, NgFor, NgIf, NgComponentOutlet } from '@angular/common';
8
- import { W as WtoolboxService, D as DynamicGenericTemplateComponent, a as DynamicCompilerService, b as DataSourceComponent, c as DataRepeaterComponent, F as FilterBarComponent, L as LazyParametricDialogComponent, P as PagerComponent, M as MetadataProviderService, t as toHsbaModel, d as clampAlpha, e as toPersistedColor, f as ParametricDialogComponent, g as MetadatiColonna, h as DataProviderService, U as UserInfoService, T as TranslationManagerService, i as MetadataEditorService, C as ChatbotHostRegistryService, j as WorkflowRuntimeMetadataService, k as FieldEditorComponent, l as MetadataEditorComponent, A as ArchetypeConfiguratorComponent } from './wuic-framework-lib-wuic-framework-lib-81WUtxz8.mjs';
8
+ import { W as WtoolboxService, D as DynamicGenericTemplateComponent, a as DynamicCompilerService, b as DataSourceComponent, c as DataRepeaterComponent, F as FilterBarComponent, L as LazyParametricDialogComponent, P as PagerComponent, M as MetadataProviderService, t as toHsbaModel, d as clampAlpha, e as toPersistedColor, f as ParametricDialogComponent, g as MetadatiColonna, h as DataProviderService, U as UserInfoService, T as TranslationManagerService, i as MetadataEditorService, C as ChatbotHostRegistryService, j as WorkflowRuntimeMetadataService, k as FieldEditorComponent, l as MetadataEditorComponent, A as ArchetypeConfiguratorComponent } from './wuic-framework-lib-wuic-framework-lib-54sySY_p.mjs';
9
9
  import { fromEvent, BehaviorSubject, merge, filter, Observable, switchMap, take, map, takeUntil, tap, timeInterval, scan, mergeMap, of, delay, repeat, Subject, startWith, pairwise, skipWhile, combineLatest } from 'rxjs';
10
10
  import { takeUntilDestroyed } from '@angular/core/rxjs-interop';
11
11
  import { CdkAccordionModule, CdkAccordion, CdkAccordionItem } from '@angular/cdk/accordion';
@@ -13240,4 +13240,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
13240
13240
  }] } });
13241
13241
 
13242
13242
  export { DesignerComponent };
13243
- //# sourceMappingURL=wuic-framework-lib-designer.component-Dt7Yz5hn.mjs.map
13243
+ //# sourceMappingURL=wuic-framework-lib-designer.component-CohHkalb.mjs.map
@@ -6,7 +6,7 @@ import * as i1$1 from '@angular/forms';
6
6
  import { FormsModule } from '@angular/forms';
7
7
  import * as i1 from '@angular/common/http';
8
8
  import { HttpContext } from '@angular/common/http';
9
- import { G as GlobalHandler, W as WtoolboxService, p as WUIC_SUPPRESS_GLOBAL_ERROR } from './wuic-framework-lib-wuic-framework-lib-81WUtxz8.mjs';
9
+ import { G as GlobalHandler, W as WtoolboxService, p as WUIC_SUPPRESS_GLOBAL_ERROR } from './wuic-framework-lib-wuic-framework-lib-54sySY_p.mjs';
10
10
  import { firstValueFrom } from 'rxjs';
11
11
  import * as i8 from '@ngx-translate/core';
12
12
  import { TranslateModule } from '@ngx-translate/core';
@@ -1627,4 +1627,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
1627
1627
  }] } });
1628
1628
 
1629
1629
  export { WuicFirstRunWizardComponent };
1630
- //# sourceMappingURL=wuic-framework-lib-first-run-wizard.component-C8nhy5yK.mjs.map
1630
+ //# sourceMappingURL=wuic-framework-lib-first-run-wizard.component-BoP77ip9.mjs.map
@@ -16,12 +16,12 @@ import * as i1$3 from 'primeng/image';
16
16
  import { ImageModule } from 'primeng/image';
17
17
  import * as i8$1 from '@ngx-translate/core';
18
18
  import { TranslateService, TranslateModule } from '@ngx-translate/core';
19
- import { v as getThemeOptions, T as TranslationManagerService, U as UserInfoService } from './wuic-framework-lib-wuic-framework-lib-81WUtxz8.mjs';
19
+ import { v as getThemeOptions, T as TranslationManagerService, U as UserInfoService } from './wuic-framework-lib-wuic-framework-lib-54sySY_p.mjs';
20
20
  import * as i1 from '@angular/router';
21
21
 
22
22
  const frameworkDocsContent = {
23
23
  "version": "1.0.0",
24
- "generatedAt": "2026-09-10T12:44:24.401Z",
24
+ "generatedAt": "2026-09-11T12:50:19.123Z",
25
25
  "groups": [
26
26
  {
27
27
  "id": "primi-passi",
@@ -1153,7 +1153,7 @@ const frameworkDocsContent = {
1153
1153
  {
1154
1154
  "id": "overview",
1155
1155
  "title": "Overview",
1156
- "html": "<h1>Panoramica Framework</h1><p>WUIC Framework e&#39; una piattaforma metadata-driven per creare interfacce business in modo rapido e coerente.</p><h2>Cosa include</h2><ul><li>DataSource e DataRepeater per orchestrare dati e rendering.</li><li>Archetypes visuali (list, map, scheduler, chart, carousel).</li><li>Designer runtime per dashboard e template dinamici.</li><li>Workflow designer/runner per processi operativi.</li><li>RAG Chatbot per interrogare la codebase in linguaggio naturale.</li><li>Multi-DBMS: SQL Server, MySQL, PostgreSQL e Oracle tramite provider drop-in (<code>dbms</code>: <code>mssql</code> | <code>mysql</code> | <code>postgresql</code> | <code>oracle</code>).</li></ul><h2>First Steps — Avvio ambiente dev</h2><p>Lo stack WUIC e&#39; composto da piu&#39; servizi. Avviali nell&#39;ordine indicato.</p><h3>Prerequisiti</h3><table><thead><tr><th>Cosa</th><th>Verifica</th><th>Note</th></tr></thead><tbody><tr><td>.NET 10 SDK</td><td><code>dotnet --version</code></td><td>Hosting Bundle per IIS in produzione</td></tr><tr><td>Node.js 22 LTS</td><td><code>node --version</code></td><td>La 22 e&#39; la versione con cui il pacchetto e&#39; testato; con npm 10.9.x installa solo grazie al <code>package-lock.json</code> incluso</td></tr><tr><td>PowerShell 5.1+</td><td><code>$PSVersionTable.PSVersion</code></td><td>La PowerShell preinstallata su Windows basta: <code>rename-project.ps1</code> e gli script <code>llm-workspace/</code> girano anche su 5.1. PowerShell 7 e&#39; consigliata, non richiesta</td></tr><tr><td>SQL Server 2019+</td><td><code>sqlcmd -S localhost\\sqlexpress -E -C -Q &quot;SELECT 1&quot;</code></td><td>Se manca, <strong>il one-liner lo installa da se&#39;</strong> (SQL Server Express, o il motore scelto con <code>-Dbms</code>); su Windows Server no, vedi il riquadro sotto. 2019 basta per i pacchetti senza <code>.bak</code>; il tutorial <code>.bak</code> e&#39; un backup di SQL Server 2022 e richiede <strong>2022 o superiore</strong></td></tr><tr><td>GPU NVIDIA (CUDA 12.x + cuDNN 9)</td><td><code>nvidia-smi</code></td><td>Opzionale: accelera il RAG Chatbot (senza GPU gira su CPU)</td></tr></tbody></table><p>&gt; <strong>Su Windows Server il database va installato prima.</strong> Il one-liner si procura i componenti</p><p>&gt; mancanti tramite <code>winget</code>, che su Windows Server non e&#39; presente: senza un&#39;istanza gia&#39;</p><p>&gt; raggiungibile l&#39;installazione si ferma con `No SQL Server instance reachable and winget is</p><p>&gt; missing`. Installa quindi il motore prima di lanciare la riga - per SQL Server serve la</p><p>&gt; <strong>2019 o superiore</strong> (la Express basta; <strong>2022 o superiore</strong> per il tutorial <code>.bak</code>), e una</p><p>&gt; 2017 non viene accettata. Se l&#39;istanza non e&#39; quella predefinita, passala con</p><p>&gt; <code>-SqlServer &#39;localhost\\NOMEISTANZA&#39;</code>. Vale per tutti i motori, non solo SQL Server.</p><h3>1. Scarica il template di progetto</h3><p>Su Windows fai tutto con una riga di PowerShell: scarica il pacchetto, verifica .NET SDK 10 e Node.js 22</p><p>(installando cio&#39; che manca), esegue <code>dotnet restore</code> e <code>npm install</code>, e installa</p><p>l&#39;estensione WUIC Assistant in VS Code.</p><p>Snippet 1:</p><p>Opzioni utili sulla stessa riga: <code>-Dbms mysql</code> (oppure <code>postgres</code>, <code>oracle</code>) per un motore</p><p>diverso da SQL Server — che l&#39;installer installa e configura da se&#39; — e <code>-WithTutorial</code> per</p><p>scaricare anche il database di esempio.</p><p>Quando ha finito, l&#39;ultima schermata e&#39; gia&#39; l&#39;elenco delle cose da fare:</p><p>Snippet 2:</p><p>La stringa di connessione e&#39; gia&#39; pronta: al primo avvio il wizard non chiede altro. Con</p><p><code>-Dbms mysql</code> o <code>-Dbms postgres</code> la riga cambia di conseguenza e porta dentro di se&#39; utente e</p><p>password, perche&#39; la password del superutente <strong>la genera l&#39;installer</strong>; la stessa password</p><p>viene salvata in <code>wuic-secrets.json</code>, accanto all&#39;installazione, ed e&#39; l&#39;unico posto in cui</p><p>resta scritta.</p><p>Il percorso manuale resta valido e funziona su qualunque sistema:</p><p>Parti dal pacchetto <code>WuicTest-src-*.zip</code> (link nella sezione <strong>Download</strong> del sito).</p><p>Estrailo in una cartella di lavoro, es. <code>C:\\dev\\WuicTest</code> (i file vanno direttamente nella root,</p><p>NON dentro una sottocartella <code>src/</code>). Il pacchetto contiene:</p><ul><li><code>WuicTest.csproj</code> → progetto host con <code>&lt;PackageReference Include=&quot;WuicCore&quot; Version=&quot;...&quot; /&gt;</code></li><li><code>wwwroot/</code> → app Angular con <code>package.json</code> che referenzia <code>wuic-framework-lib</code> da npm registry</li><li><code>appsettings.json</code> preconfigurato in modalita&#39; <code>firstRun = &quot;true&quot;</code> con placeholder <code>__SET_*__</code></li><li><code>appsettings-samples/</code> → 6 template pronti (<code>mssql</code>/<code>mysql</code>, firstRun/post-firstRun, <code>Development</code>)</li></ul><p>&gt; <strong>Non serve clonare il repository del framework</strong>: <code>WuicCore</code> arriva come pacchetto NuGet da</p><p>&gt; <code>nuget.org</code> e <code>wuic-framework-lib</code> come pacchetto npm da npm registry. Il sorgente del framework</p><p>&gt; serve solo se vuoi modificarlo — tipicamente non e&#39; il tuo caso.</p><p>&gt; <strong>npm 10.9.x e i pacchetti precedenti alla 1.7.1</strong>: quei pacchetti non contengono</p><p>&gt; <code>package-lock.json</code>, e senza lock npm 10.9.x (quello che installa Node 22 LTS) si ferma con</p><p>&gt; <code>Cannot read properties of null (reading &#39;edgesOut&#39;)</code> mentre risolve i peer. Scarica il lock</p><p>&gt; pubblicato accanto alla release — <code>https://wuic-framework.com/downloads/locks/&lt;nome-zip&gt;.package-lock.json</code></p><p>&gt; — mettilo in <code>wwwroot/</code> e rilancia <code>npm install</code>. Il one-liner <code>-Src</code> lo fa da solo.</p><h3>2. Database</h3><p>Serve un&#39;istanza del motore raggiungibile. <strong>Con il one-liner non devi fare niente</strong>: la</p><p>installa e la configura lui, e la stringa di connessione da incollare nel wizard e&#39; l&#39;ultima</p><p>cosa che stampa. Nel percorso manuale l&#39;istanza deve essere gia&#39; presente.</p><p>Connessioni in <code>appsettings.json</code>:</p><ul><li><code>MetaDataSQLConnection</code> — DB metadata (menu, tabelle, colonne, board, utenti)</li><li><code>DataSQLConnection</code> — DB dati applicativi</li></ul><p>Se e&#39; la prima installazione (<code>AppSettings.firstRun = &quot;true&quot;</code> nel template),</p><p>il wizard di scaffolding al primo avvio crea lo schema metadata e popola il DB dati.</p><p>Vedi la pagina <em>Scaffolding iniziale</em> per il flusso guidato.</p><h3>3. Backend (.NET)</h3><p>Dalla root della cartella estratta (es. <code>C:\\dev\\WuicTest</code>):</p><p>Snippet 3:</p><p>Il backend espone le API su <code>http://localhost:5000</code>.</p><h3>4. Frontend (Angular)</h3><p>In una seconda shell, dalla sottocartella <code>wwwroot/</code>:</p><p>Snippet 4:</p><p>Il frontend e&#39; disponibile su <code>http://localhost:4200</code>.</p><p>Login di default (post-firstRun): <code>admin</code> / <code>admin</code>.</p><h3>5. RAG Chatbot (opzionale)</h3><p>Il RAG Chatbot (<code>Amministrazione &gt; RAG Chat</code>) gira <strong>dentro il backend .NET</strong>:</p><p>il motore di retrieval (<code>rag-engine/WuicRagEngine.dll</code>, ONNX Runtime</p><p>in-process) viene caricato dal backend quando <code>AppSettings.rag-use-dotnet-engine</code></p><p>e&#39; <code>&quot;true&quot;</code> (default nei pacchetti di release). **Niente Python, niente venv,</p><p>nessun server separato da avviare.**</p><p>Alla <strong>prima</strong> apertura del chatbot (o a fine first-run) il backend scarica da</p><p>solo modelli ONNX (<code>bge-m3</code> + reranker), tokenizer e indice (~4,5 GB) da</p><p><code>rag-engine-models-url</code> (default <code>https://wuic-framework.com/rag-models</code>) in</p><p><code>rag-engine/artifacts/</code>. Serve una connessione internet una sola volta; il</p><p>download gira in background (1-5 min) e a inizio/fine download arriva una</p><p>notifica in-app. Nel frattempo il componente mostra lo stato <strong>RAG offline</strong> e</p><p>il resto dell&#39;applicazione funziona normalmente.</p><p>Chiavi <code>AppSettings</code> rilevanti (tutte con default gia&#39; pronti):</p><ul><li><code>rag-use-dotnet-engine</code> = <code>true</code> — attiva l&#39;engine .NET (<code>false</code> = fallback Python, vedi sotto)</li><li><code>rag-engine-device</code> = <code>auto</code> — <code>auto</code> | <code>cuda</code> | <code>cpu</code>: con GPU NVIDIA (CUDA 12.x + cuDNN 9) ~1 s/query, su CPU ~15-25 s/query</li><li><code>rag-engine-profile</code> = <code>release</code> — <code>release</code> = sorgenti framework solo come firma; <code>internal</code> = indice integrale</li><li><code>rag-engine-models-url</code> — sorgente del download al primo avvio</li><li><code>rag-engine-cuda-path</code> = (vuoto) — cartella delle DLL CUDA/cuDNN se non installate a livello di sistema</li></ul><p>Per la chat con LLM valorizza <code>rag-llm-provider</code> + <code>rag-llm-api-key</code> (Claude</p><p>via Anthropic, oppure un modello locale via Ollama con <code>rag-llm-base-url</code>).</p><p>Senza provider funziona solo la modalita&#39; retrieval (ricerca snippet).</p><p>Dettaglio delle chiavi nella pagina <em>AppSettings</em>.</p><p>&gt; Lo stack storico Python (<code>scripts/rag-setup.ps1</code> + <code>rag_server.py</code> su</p><p>&gt; <code>127.0.0.1:8765</code>) resta utilizzabile solo come fallback con</p><p>&gt; <code>rag-use-dotnet-engine = &quot;false&quot;</code> e non e&#39; incluso nei pacchetti di release.</p><h2>Riepilogo servizi</h2><table><thead><tr><th>Servizio</th><th>Porta</th><th>Obbligatorio</th><th>Comando rapido</th></tr></thead><tbody><tr><td>SQL Server</td><td>1433</td><td>si</td><td>(servizio Windows)</td></tr><tr><td>Backend .NET</td><td>5000</td><td>si</td><td><code>dotnet watch ... run</code></td></tr><tr><td>Frontend Angular</td><td>4200</td><td>si</td><td><code>npm run serve:dev</code></td></tr><tr><td>Engine RAG .NET (ONNX)</td><td>in-process</td><td>no</td><td>caricato dal backend alla prima chat</td></tr></tbody></table><h2>Quick Start — primo componente</h2><p>1. Configura endpoint AsmxProxy.</p><p>2. Definisci route metadata e colonne.</p><p>3. Monta <code>wuic-data-source</code> + <code>wuic-data-repeater</code>.</p><p>Snippet 5:</p>",
1156
+ "html": "<h1>Panoramica Framework</h1><p>WUIC Framework e&#39; una piattaforma metadata-driven per creare interfacce business in modo rapido e coerente.</p><h2>Cosa include</h2><ul><li>DataSource e DataRepeater per orchestrare dati e rendering.</li><li>Archetypes visuali (list, map, scheduler, chart, carousel).</li><li>Designer runtime per dashboard e template dinamici.</li><li>Workflow designer/runner per processi operativi.</li><li>RAG Chatbot per interrogare la codebase in linguaggio naturale.</li><li>Multi-DBMS: SQL Server, MySQL, PostgreSQL e Oracle tramite provider drop-in (<code>dbms</code>: <code>mssql</code> | <code>mysql</code> | <code>postgresql</code> | <code>oracle</code>).</li></ul><h2>First Steps — Avvio ambiente dev</h2><p>Lo stack WUIC e&#39; composto da piu&#39; servizi. Avviali nell&#39;ordine indicato.</p><h3>Prerequisiti</h3><table><thead><tr><th>Cosa</th><th>Verifica</th><th>Note</th></tr></thead><tbody><tr><td>.NET 10 SDK</td><td><code>dotnet --version</code></td><td>Hosting Bundle per IIS in produzione</td></tr><tr><td>Node.js 22 LTS</td><td><code>node --version</code></td><td>La 22 e&#39; la versione con cui il pacchetto e&#39; testato; con npm 10.9.x installa solo grazie al <code>package-lock.json</code> incluso</td></tr><tr><td>PowerShell 5.1+</td><td><code>$PSVersionTable.PSVersion</code></td><td>La PowerShell preinstallata su Windows basta: <code>rename-project.ps1</code> e gli script <code>llm-workspace/</code> girano anche su 5.1. PowerShell 7 e&#39; consigliata, non richiesta</td></tr><tr><td>SQL Server 2019+</td><td><code>sqlcmd -S localhost\\sqlexpress -E -C -Q &quot;SELECT 1&quot;</code></td><td>Se manca, <strong>il one-liner lo installa da se&#39;</strong> (SQL Server Express, o il motore scelto con <code>-Dbms</code>); su Windows Server no, vedi il riquadro sotto. 2019 basta per i pacchetti senza <code>.bak</code>; il tutorial <code>.bak</code> e&#39; un backup di SQL Server 2022 e richiede <strong>2022 o superiore</strong></td></tr><tr><td>Linux (installer <code>install.sh</code>)</td><td><code>lsb_release -ds</code></td><td><strong>Ubuntu 22.04 o 24.04 LTS</strong> (24.04 raccomandata): sono le uniche Ubuntu su cui Microsoft supporta SQL Server, la <strong>26.04 non e&#39; supportata</strong> (<a href=\"https://learn.microsoft.com/en-us/sql/linux/sql-server-linux-setup?view=sql-server-ver17\" target=\"_blank\" rel=\"noopener noreferrer\">Supported platforms</a>). Stessa raccomandazione con MySQL, PostgreSQL e Oracle, perche&#39; l&#39;installer e&#39; provato su quelle</td></tr><tr><td>GPU NVIDIA (CUDA 12.x + cuDNN 9)</td><td><code>nvidia-smi</code></td><td>Opzionale: accelera il RAG Chatbot (senza GPU gira su CPU)</td></tr></tbody></table><p>&gt; <strong>Su Windows Server il database va installato prima.</strong> Il one-liner si procura i componenti</p><p>&gt; mancanti tramite <code>winget</code>, che su Windows Server non e&#39; presente: senza un&#39;istanza gia&#39;</p><p>&gt; raggiungibile l&#39;installazione si ferma con `No SQL Server instance reachable and winget is</p><p>&gt; missing`. Installa quindi il motore prima di lanciare la riga - per SQL Server serve la</p><p>&gt; <strong>2019 o superiore</strong> (la Express basta; <strong>2022 o superiore</strong> per il tutorial <code>.bak</code>), e una</p><p>&gt; 2017 non viene accettata. Se l&#39;istanza non e&#39; quella predefinita, passala con</p><p>&gt; <code>-SqlServer &#39;localhost\\NOMEISTANZA&#39;</code>. Vale per tutti i motori, non solo SQL Server.</p><h3>1. Scarica il template di progetto</h3><p>Su Windows fai tutto con una riga di PowerShell: scarica il pacchetto, verifica .NET SDK 10 e Node.js 22</p><p>(installando cio&#39; che manca), esegue <code>dotnet restore</code> e <code>npm install</code>, e installa</p><p>l&#39;estensione WUIC Assistant in VS Code.</p><p>Snippet 1:</p><p>Opzioni utili sulla stessa riga: <code>-Dbms mysql</code> (oppure <code>postgres</code>, <code>oracle</code>) per un motore</p><p>diverso da SQL Server — che l&#39;installer installa e configura da se&#39; — e <code>-WithTutorial</code> per</p><p>scaricare anche il database di esempio.</p><p>Quando ha finito, l&#39;ultima schermata e&#39; gia&#39; l&#39;elenco delle cose da fare:</p><p>Snippet 2:</p><p>La stringa di connessione e&#39; gia&#39; pronta: al primo avvio il wizard non chiede altro. Con</p><p><code>-Dbms mysql</code> o <code>-Dbms postgres</code> la riga cambia di conseguenza e porta dentro di se&#39; utente e</p><p>password, perche&#39; la password del superutente <strong>la genera l&#39;installer</strong>; la stessa password</p><p>viene salvata in <code>wuic-secrets.json</code>, accanto all&#39;installazione, ed e&#39; l&#39;unico posto in cui</p><p>resta scritta.</p><p>Il percorso manuale resta valido e funziona su qualunque sistema:</p><p>Parti dal pacchetto <code>WuicTest-src-*.zip</code> (link nella sezione <strong>Download</strong> del sito).</p><p>Estrailo in una cartella di lavoro, es. <code>C:\\dev\\WuicTest</code> (i file vanno direttamente nella root,</p><p>NON dentro una sottocartella <code>src/</code>). Il pacchetto contiene:</p><ul><li><code>WuicTest.csproj</code> → progetto host con <code>&lt;PackageReference Include=&quot;WuicCore&quot; Version=&quot;...&quot; /&gt;</code></li><li><code>wwwroot/</code> → app Angular con <code>package.json</code> che referenzia <code>wuic-framework-lib</code> da npm registry</li><li><code>appsettings.json</code> preconfigurato in modalita&#39; <code>firstRun = &quot;true&quot;</code> con placeholder <code>__SET_*__</code></li><li><code>appsettings-samples/</code> → 6 template pronti (<code>mssql</code>/<code>mysql</code>, firstRun/post-firstRun, <code>Development</code>)</li></ul><p>&gt; <strong>Non serve clonare il repository del framework</strong>: <code>WuicCore</code> arriva come pacchetto NuGet da</p><p>&gt; <code>nuget.org</code> e <code>wuic-framework-lib</code> come pacchetto npm da npm registry. Il sorgente del framework</p><p>&gt; serve solo se vuoi modificarlo — tipicamente non e&#39; il tuo caso.</p><p>&gt; <strong>npm 10.9.x e i pacchetti precedenti alla 1.7.1</strong>: quei pacchetti non contengono</p><p>&gt; <code>package-lock.json</code>, e senza lock npm 10.9.x (quello che installa Node 22 LTS) si ferma con</p><p>&gt; <code>Cannot read properties of null (reading &#39;edgesOut&#39;)</code> mentre risolve i peer. Scarica il lock</p><p>&gt; pubblicato accanto alla release — <code>https://wuic-framework.com/downloads/locks/&lt;nome-zip&gt;.package-lock.json</code></p><p>&gt; — mettilo in <code>wwwroot/</code> e rilancia <code>npm install</code>. Il one-liner <code>-Src</code> lo fa da solo.</p><h3>2. Database</h3><p>Serve un&#39;istanza del motore raggiungibile. <strong>Con il one-liner non devi fare niente</strong>: la</p><p>installa e la configura lui, e la stringa di connessione da incollare nel wizard e&#39; l&#39;ultima</p><p>cosa che stampa. Nel percorso manuale l&#39;istanza deve essere gia&#39; presente.</p><p>Connessioni in <code>appsettings.json</code>:</p><ul><li><code>MetaDataSQLConnection</code> — DB metadata (menu, tabelle, colonne, board, utenti)</li><li><code>DataSQLConnection</code> — DB dati applicativi</li></ul><p>Se e&#39; la prima installazione (<code>AppSettings.firstRun = &quot;true&quot;</code> nel template),</p><p>il wizard di scaffolding al primo avvio crea lo schema metadata e popola il DB dati.</p><p>Vedi la pagina <em>Scaffolding iniziale</em> per il flusso guidato.</p><h3>3. Backend (.NET)</h3><p>Dalla root della cartella estratta (es. <code>C:\\dev\\WuicTest</code>):</p><p>Snippet 3:</p><p>Il backend espone le API su <code>http://localhost:5000</code>.</p><h3>4. Frontend (Angular)</h3><p>In una seconda shell, dalla sottocartella <code>wwwroot/</code>:</p><p>Snippet 4:</p><p>Il frontend e&#39; disponibile su <code>http://localhost:4200</code>.</p><p>Login di default (post-firstRun): <code>admin</code> / <code>admin</code>.</p><h3>5. RAG Chatbot (opzionale)</h3><p>Il RAG Chatbot (<code>Amministrazione &gt; RAG Chat</code>) gira <strong>dentro il backend .NET</strong>:</p><p>il motore di retrieval (<code>rag-engine/WuicRagEngine.dll</code>, ONNX Runtime</p><p>in-process) viene caricato dal backend quando <code>AppSettings.rag-use-dotnet-engine</code></p><p>e&#39; <code>&quot;true&quot;</code> (default nei pacchetti di release). **Niente Python, niente venv,</p><p>nessun server separato da avviare.**</p><p>Alla <strong>prima</strong> apertura del chatbot (o a fine first-run) il backend scarica da</p><p>solo modelli ONNX (<code>bge-m3</code> + reranker), tokenizer e indice (~4,5 GB) da</p><p><code>rag-engine-models-url</code> (default <code>https://wuic-framework.com/rag-models</code>) in</p><p><code>rag-engine/artifacts/</code>. Serve una connessione internet una sola volta; il</p><p>download gira in background (1-5 min) e a inizio/fine download arriva una</p><p>notifica in-app. Nel frattempo il componente mostra lo stato <strong>RAG offline</strong> e</p><p>il resto dell&#39;applicazione funziona normalmente.</p><p>Chiavi <code>AppSettings</code> rilevanti (tutte con default gia&#39; pronti):</p><ul><li><code>rag-use-dotnet-engine</code> = <code>true</code> — attiva l&#39;engine .NET (<code>false</code> = fallback Python, vedi sotto)</li><li><code>rag-engine-device</code> = <code>auto</code> — <code>auto</code> | <code>cuda</code> | <code>cpu</code>: con GPU NVIDIA (CUDA 12.x + cuDNN 9) ~1 s/query, su CPU ~15-25 s/query</li><li><code>rag-engine-profile</code> = <code>release</code> — <code>release</code> = sorgenti framework solo come firma; <code>internal</code> = indice integrale</li><li><code>rag-engine-models-url</code> — sorgente del download al primo avvio</li><li><code>rag-engine-cuda-path</code> = (vuoto) — cartella delle DLL CUDA/cuDNN se non installate a livello di sistema</li></ul><p>Per la chat con LLM valorizza <code>rag-llm-provider</code> + <code>rag-llm-api-key</code> (Claude</p><p>via Anthropic, oppure un modello locale via Ollama con <code>rag-llm-base-url</code>).</p><p>Senza provider funziona solo la modalita&#39; retrieval (ricerca snippet).</p><p>Dettaglio delle chiavi nella pagina <em>AppSettings</em>.</p><p>&gt; Lo stack storico Python (<code>scripts/rag-setup.ps1</code> + <code>rag_server.py</code> su</p><p>&gt; <code>127.0.0.1:8765</code>) resta utilizzabile solo come fallback con</p><p>&gt; <code>rag-use-dotnet-engine = &quot;false&quot;</code> e non e&#39; incluso nei pacchetti di release.</p><h2>Riepilogo servizi</h2><table><thead><tr><th>Servizio</th><th>Porta</th><th>Obbligatorio</th><th>Comando rapido</th></tr></thead><tbody><tr><td>SQL Server</td><td>1433</td><td>si</td><td>(servizio Windows)</td></tr><tr><td>Backend .NET</td><td>5000</td><td>si</td><td><code>dotnet watch ... run</code></td></tr><tr><td>Frontend Angular</td><td>4200</td><td>si</td><td><code>npm run serve:dev</code></td></tr><tr><td>Engine RAG .NET (ONNX)</td><td>in-process</td><td>no</td><td>caricato dal backend alla prima chat</td></tr></tbody></table><h2>Quick Start — primo componente</h2><p>1. Configura endpoint AsmxProxy.</p><p>2. Definisci route metadata e colonne.</p><p>3. Monta <code>wuic-data-source</code> + <code>wuic-data-repeater</code>.</p><p>Snippet 5:</p>",
1157
1157
  "codeSamples": [
1158
1158
  {
1159
1159
  "id": "code_1",
@@ -7861,7 +7861,7 @@ const frameworkDocsContent = {
7861
7861
  {
7862
7862
  "id": "overview",
7863
7863
  "title": "Overview",
7864
- "html": "<h1>Framework Overview</h1><p>WUIC Framework is a metadata-driven platform for building business interfaces quickly and consistently.</p><h2>What It Includes</h2><ul><li>DataSource and DataRepeater for orchestrating data and rendering.</li><li>Visual archetypes (list, map, scheduler, chart, carousel).</li><li>Runtime designer for dashboards and dynamic templates.</li><li>Workflow designer/runner for operational processes.</li><li>RAG Chatbot for querying the codebase in natural language.</li><li>Multi-DBMS: SQL Server, MySQL, PostgreSQL and Oracle via drop-in providers (<code>dbms</code>: <code>mssql</code> | <code>mysql</code> | <code>postgresql</code> | <code>oracle</code>).</li></ul><h2>First Steps — Starting the Dev Environment</h2><p>The WUIC stack is composed of several services. Start them in the order below.</p><h3>Prerequisites</h3><table><thead><tr><th>What</th><th>Check</th><th>Notes</th></tr></thead><tbody><tr><td>.NET 10 SDK</td><td><code>dotnet --version</code></td><td>Hosting Bundle for IIS in production</td></tr><tr><td>Node.js 22 LTS</td><td><code>node --version</code></td><td>22 is the version the package is tested with; on npm 10.9.x it installs thanks to the bundled <code>package-lock.json</code></td></tr><tr><td>PowerShell 5.1+</td><td><code>$PSVersionTable.PSVersion</code></td><td>The Windows PowerShell that ships with Windows is enough: <code>rename-project.ps1</code> and the <code>llm-workspace/</code> scripts run on 5.1 too. PowerShell 7 is recommended, not required</td></tr><tr><td>SQL Server 2019+</td><td><code>sqlcmd -S localhost\\sqlexpress -E -C -Q &quot;SELECT 1&quot;</code></td><td>If missing, <strong>the one-liner installs it for you</strong> (SQL Server Express, or the engine chosen with <code>-Dbms</code>); not on Windows Server, see the box below. 2019 is enough for the packages without <code>.bak</code>; the <code>.bak</code> tutorial is a SQL Server 2022 backup and needs <strong>2022 or newer</strong></td></tr><tr><td>NVIDIA GPU (CUDA 12.x + cuDNN 9)</td><td><code>nvidia-smi</code></td><td>Optional: speeds up the RAG Chatbot (runs on CPU without it)</td></tr></tbody></table><p>&gt; <strong>On Windows Server the database must be installed first.</strong> The one-liner pulls missing</p><p>&gt; components through <code>winget</code>, which is not present on Windows Server: without an instance</p><p>&gt; already reachable the installation stops with `No SQL Server instance reachable and winget is</p><p>&gt; missing`. Install the engine before running the line - SQL Server must be <strong>2019 or newer</strong></p><p>&gt; (Express is enough; <strong>2022 or newer</strong> for the <code>.bak</code> tutorial), and a 2017 instance is not</p><p>&gt; accepted. If the instance is not the default one, pass it with</p><p>&gt; <code>-SqlServer &#39;localhost\\INSTANCENAME&#39;</code>. This applies to every engine, not just SQL Server.</p><h3>1. Download the project template</h3><p>On Windows one PowerShell line does all of it: it downloads the package, checks the .NET SDK 10</p><p>and Node.js 22 (installing what is missing), runs <code>dotnet restore</code> and <code>npm install</code>,</p><p>and installs the WUIC Assistant extension in VS Code.</p><p>Snippet 1:</p><p>Useful options on the same line: <code>-Dbms mysql</code> (or <code>postgres</code>, <code>oracle</code>) for an engine other</p><p>than SQL Server — the installer installs and configures it for you — and <code>-WithTutorial</code> to</p><p>download the sample database as well.</p><p>When it is done, the last screen is already your to-do list:</p><p>Snippet 2:</p><p>The connection string is ready to use: at first start the wizard asks for nothing else. With</p><p><code>-Dbms mysql</code> or <code>-Dbms postgres</code> that line changes accordingly and carries user and password</p><p>inside it, because the superuser password is <strong>generated by the installer</strong>; the same password</p><p>is saved in <code>wuic-secrets.json</code>, next to the installation, and that is the only place where it</p><p>stays written.</p><p>The manual path still works, on any operating system:</p><p>Start from the <code>WuicTest-src-*.zip</code> package (link in the <strong>Download</strong> section of the site).</p><p>Extract it to a working folder, e.g. <code>C:\\dev\\WuicTest</code> (files go directly at the root —</p><p>NOT inside a <code>src/</code> subfolder). The package contains:</p><ul><li><code>WuicTest.csproj</code> → host project with <code>&lt;PackageReference Include=&quot;WuicCore&quot; Version=&quot;...&quot; /&gt;</code></li><li><code>wwwroot/</code> → Angular app whose <code>package.json</code> references <code>wuic-framework-lib</code> from the npm registry</li><li><code>appsettings.json</code> preconfigured in <code>firstRun = &quot;true&quot;</code> mode with <code>__SET_*__</code> placeholders</li><li><code>appsettings-samples/</code> → 6 ready templates (<code>mssql</code>/<code>mysql</code>, firstRun/post-firstRun, <code>Development</code>)</li></ul><p>&gt; <strong>No need to clone the framework repository</strong>: <code>WuicCore</code> ships as a NuGet package from</p><p>&gt; <code>nuget.org</code> and <code>wuic-framework-lib</code> as an npm package from the npm registry. The framework</p><p>&gt; source is only needed if you want to modify it — typically not your case.</p><p>&gt; <strong>npm 10.9.x and packages older than 1.7.1</strong>: those packages carry no <code>package-lock.json</code>, and</p><p>&gt; without a lock npm 10.9.x (the version Node 22 LTS installs) stops with</p><p>&gt; <code>Cannot read properties of null (reading &#39;edgesOut&#39;)</code> while resolving peer dependencies.</p><p>&gt; Download the lock published next to the release —</p><p>&gt; <code>https://wuic-framework.com/downloads/locks/&lt;zip-name&gt;.package-lock.json</code> — drop it in <code>wwwroot/</code></p><p>&gt; and run <code>npm install</code> again. The <code>-Src</code> one-liner does it for you.</p><h3>2. Database</h3><p>You need a reachable engine instance. <strong>With the one-liner there is nothing to do</strong>: it</p><p>installs and configures the instance, and the connection string to paste into the wizard is the</p><p>last thing it prints. On the manual path the instance must already exist.</p><p>Connections in <code>appsettings.json</code>:</p><ul><li><code>MetaDataSQLConnection</code> — metadata DB (menu, tables, columns, boards, users)</li><li><code>DataSQLConnection</code> — application data DB</li></ul><p>If this is the first installation (<code>AppSettings.firstRun = &quot;true&quot;</code> in the template),</p><p>the scaffolding wizard on first startup creates the metadata schema and populates the data DB.</p><p>See the <em>Initial Scaffolding</em> page for the guided flow.</p><h3>3. Backend (.NET)</h3><p>From the root of the extracted folder (e.g. <code>C:\\dev\\WuicTest</code>):</p><p>Snippet 3:</p><p>The backend exposes APIs on <code>http://localhost:5000</code>.</p><h3>4. Frontend (Angular)</h3><p>In a second shell, from the <code>wwwroot/</code> subfolder:</p><p>Snippet 4:</p><p>The frontend is available on <code>http://localhost:4200</code>.</p><p>Default login (post-firstRun): <code>admin</code> / <code>admin</code>.</p><h3>5. RAG Chatbot (optional)</h3><p>The RAG Chatbot (<code>Administration &gt; RAG Chat</code>) runs <strong>inside the .NET backend</strong>:</p><p>the retrieval engine (<code>rag-engine/WuicRagEngine.dll</code>, in-process ONNX Runtime)</p><p>is loaded by the backend when <code>AppSettings.rag-use-dotnet-engine</code> is <code>&quot;true&quot;</code></p><p>(the default in release packages). **No Python, no venv, no separate server</p><p>to start.**</p><p>The <strong>first</strong> time the chatbot is opened (or at the end of the first run) the</p><p>backend downloads by itself the ONNX models (<code>bge-m3</code> + reranker), tokenizer</p><p>and index (~4.5 GB) from <code>rag-engine-models-url</code> (default</p><p><code>https://wuic-framework.com/rag-models</code>) into <code>rag-engine/artifacts/</code>. An</p><p>internet connection is needed only once; the download runs in the background</p><p>(1-5 min) and an in-app notification is sent when it starts and when it ends.</p><p>Meanwhile the component shows the <strong>RAG offline</strong> status and the rest of the</p><p>application works normally.</p><p>Relevant <code>AppSettings</code> keys (all with ready defaults):</p><ul><li><code>rag-use-dotnet-engine</code> = <code>true</code> — enables the .NET engine (<code>false</code> = Python fallback, see below)</li><li><code>rag-engine-device</code> = <code>auto</code> — <code>auto</code> | <code>cuda</code> | <code>cpu</code>: with an NVIDIA GPU (CUDA 12.x + cuDNN 9) ~1 s/query, on CPU ~15-25 s/query</li><li><code>rag-engine-profile</code> = <code>release</code> — <code>release</code> = framework sources as signatures only; <code>internal</code> = full index</li><li><code>rag-engine-models-url</code> — download source on first start</li><li><code>rag-engine-cuda-path</code> = (empty) — folder of the CUDA/cuDNN DLLs when they are not installed system-wide</li></ul><p>For LLM chat set <code>rag-llm-provider</code> + <code>rag-llm-api-key</code> (Claude via Anthropic,</p><p>or a local model via Ollama with <code>rag-llm-base-url</code>). Without a provider only</p><p>the retrieval mode (snippet search) works. Key details on the <em>AppSettings</em></p><p>page.</p><p>&gt; The legacy Python stack (<code>scripts/rag-setup.ps1</code> + <code>rag_server.py</code> on</p><p>&gt; <code>127.0.0.1:8765</code>) is only usable as a fallback with</p><p>&gt; <code>rag-use-dotnet-engine = &quot;false&quot;</code> and is not shipped in release packages.</p><h2>Services Summary</h2><table><thead><tr><th>Service</th><th>Port</th><th>Required</th><th>Quick command</th></tr></thead><tbody><tr><td>SQL Server</td><td>1433</td><td>yes</td><td>(Windows service)</td></tr><tr><td>.NET Backend</td><td>5000</td><td>yes</td><td><code>dotnet watch ... run</code></td></tr><tr><td>Angular Frontend</td><td>4200</td><td>yes</td><td><code>npm run serve:dev</code></td></tr><tr><td>.NET RAG engine (ONNX)</td><td>in-process</td><td>no</td><td>loaded by the backend on the first chat</td></tr></tbody></table><h2>Quick Start — First Component</h2><p>1. Configure the AsmxProxy endpoint.</p><p>2. Define route metadata and columns.</p><p>3. Mount <code>wuic-data-source</code> + <code>wuic-data-repeater</code>.</p><p>Snippet 5:</p>",
7864
+ "html": "<h1>Framework Overview</h1><p>WUIC Framework is a metadata-driven platform for building business interfaces quickly and consistently.</p><h2>What It Includes</h2><ul><li>DataSource and DataRepeater for orchestrating data and rendering.</li><li>Visual archetypes (list, map, scheduler, chart, carousel).</li><li>Runtime designer for dashboards and dynamic templates.</li><li>Workflow designer/runner for operational processes.</li><li>RAG Chatbot for querying the codebase in natural language.</li><li>Multi-DBMS: SQL Server, MySQL, PostgreSQL and Oracle via drop-in providers (<code>dbms</code>: <code>mssql</code> | <code>mysql</code> | <code>postgresql</code> | <code>oracle</code>).</li></ul><h2>First Steps — Starting the Dev Environment</h2><p>The WUIC stack is composed of several services. Start them in the order below.</p><h3>Prerequisites</h3><table><thead><tr><th>What</th><th>Check</th><th>Notes</th></tr></thead><tbody><tr><td>.NET 10 SDK</td><td><code>dotnet --version</code></td><td>Hosting Bundle for IIS in production</td></tr><tr><td>Node.js 22 LTS</td><td><code>node --version</code></td><td>22 is the version the package is tested with; on npm 10.9.x it installs thanks to the bundled <code>package-lock.json</code></td></tr><tr><td>PowerShell 5.1+</td><td><code>$PSVersionTable.PSVersion</code></td><td>The Windows PowerShell that ships with Windows is enough: <code>rename-project.ps1</code> and the <code>llm-workspace/</code> scripts run on 5.1 too. PowerShell 7 is recommended, not required</td></tr><tr><td>SQL Server 2019+</td><td><code>sqlcmd -S localhost\\sqlexpress -E -C -Q &quot;SELECT 1&quot;</code></td><td>If missing, <strong>the one-liner installs it for you</strong> (SQL Server Express, or the engine chosen with <code>-Dbms</code>); not on Windows Server, see the box below. 2019 is enough for the packages without <code>.bak</code>; the <code>.bak</code> tutorial is a SQL Server 2022 backup and needs <strong>2022 or newer</strong></td></tr><tr><td>Linux (<code>install.sh</code> installer)</td><td><code>lsb_release -ds</code></td><td><strong>Ubuntu 22.04 or 24.04 LTS</strong> (24.04 recommended): they are the only Ubuntu releases Microsoft supports for SQL Server, and <strong>26.04 is not supported</strong> (<a href=\"https://learn.microsoft.com/en-us/sql/linux/sql-server-linux-setup?view=sql-server-ver17\" target=\"_blank\" rel=\"noopener noreferrer\">Supported platforms</a>). Same recommendation with MySQL, PostgreSQL and Oracle, because the installer is tested on those releases</td></tr><tr><td>NVIDIA GPU (CUDA 12.x + cuDNN 9)</td><td><code>nvidia-smi</code></td><td>Optional: speeds up the RAG Chatbot (runs on CPU without it)</td></tr></tbody></table><p>&gt; <strong>On Windows Server the database must be installed first.</strong> The one-liner pulls missing</p><p>&gt; components through <code>winget</code>, which is not present on Windows Server: without an instance</p><p>&gt; already reachable the installation stops with `No SQL Server instance reachable and winget is</p><p>&gt; missing`. Install the engine before running the line - SQL Server must be <strong>2019 or newer</strong></p><p>&gt; (Express is enough; <strong>2022 or newer</strong> for the <code>.bak</code> tutorial), and a 2017 instance is not</p><p>&gt; accepted. If the instance is not the default one, pass it with</p><p>&gt; <code>-SqlServer &#39;localhost\\INSTANCENAME&#39;</code>. This applies to every engine, not just SQL Server.</p><h3>1. Download the project template</h3><p>On Windows one PowerShell line does all of it: it downloads the package, checks the .NET SDK 10</p><p>and Node.js 22 (installing what is missing), runs <code>dotnet restore</code> and <code>npm install</code>,</p><p>and installs the WUIC Assistant extension in VS Code.</p><p>Snippet 1:</p><p>Useful options on the same line: <code>-Dbms mysql</code> (or <code>postgres</code>, <code>oracle</code>) for an engine other</p><p>than SQL Server — the installer installs and configures it for you — and <code>-WithTutorial</code> to</p><p>download the sample database as well.</p><p>When it is done, the last screen is already your to-do list:</p><p>Snippet 2:</p><p>The connection string is ready to use: at first start the wizard asks for nothing else. With</p><p><code>-Dbms mysql</code> or <code>-Dbms postgres</code> that line changes accordingly and carries user and password</p><p>inside it, because the superuser password is <strong>generated by the installer</strong>; the same password</p><p>is saved in <code>wuic-secrets.json</code>, next to the installation, and that is the only place where it</p><p>stays written.</p><p>The manual path still works, on any operating system:</p><p>Start from the <code>WuicTest-src-*.zip</code> package (link in the <strong>Download</strong> section of the site).</p><p>Extract it to a working folder, e.g. <code>C:\\dev\\WuicTest</code> (files go directly at the root —</p><p>NOT inside a <code>src/</code> subfolder). The package contains:</p><ul><li><code>WuicTest.csproj</code> → host project with <code>&lt;PackageReference Include=&quot;WuicCore&quot; Version=&quot;...&quot; /&gt;</code></li><li><code>wwwroot/</code> → Angular app whose <code>package.json</code> references <code>wuic-framework-lib</code> from the npm registry</li><li><code>appsettings.json</code> preconfigured in <code>firstRun = &quot;true&quot;</code> mode with <code>__SET_*__</code> placeholders</li><li><code>appsettings-samples/</code> → 6 ready templates (<code>mssql</code>/<code>mysql</code>, firstRun/post-firstRun, <code>Development</code>)</li></ul><p>&gt; <strong>No need to clone the framework repository</strong>: <code>WuicCore</code> ships as a NuGet package from</p><p>&gt; <code>nuget.org</code> and <code>wuic-framework-lib</code> as an npm package from the npm registry. The framework</p><p>&gt; source is only needed if you want to modify it — typically not your case.</p><p>&gt; <strong>npm 10.9.x and packages older than 1.7.1</strong>: those packages carry no <code>package-lock.json</code>, and</p><p>&gt; without a lock npm 10.9.x (the version Node 22 LTS installs) stops with</p><p>&gt; <code>Cannot read properties of null (reading &#39;edgesOut&#39;)</code> while resolving peer dependencies.</p><p>&gt; Download the lock published next to the release —</p><p>&gt; <code>https://wuic-framework.com/downloads/locks/&lt;zip-name&gt;.package-lock.json</code> — drop it in <code>wwwroot/</code></p><p>&gt; and run <code>npm install</code> again. The <code>-Src</code> one-liner does it for you.</p><h3>2. Database</h3><p>You need a reachable engine instance. <strong>With the one-liner there is nothing to do</strong>: it</p><p>installs and configures the instance, and the connection string to paste into the wizard is the</p><p>last thing it prints. On the manual path the instance must already exist.</p><p>Connections in <code>appsettings.json</code>:</p><ul><li><code>MetaDataSQLConnection</code> — metadata DB (menu, tables, columns, boards, users)</li><li><code>DataSQLConnection</code> — application data DB</li></ul><p>If this is the first installation (<code>AppSettings.firstRun = &quot;true&quot;</code> in the template),</p><p>the scaffolding wizard on first startup creates the metadata schema and populates the data DB.</p><p>See the <em>Initial Scaffolding</em> page for the guided flow.</p><h3>3. Backend (.NET)</h3><p>From the root of the extracted folder (e.g. <code>C:\\dev\\WuicTest</code>):</p><p>Snippet 3:</p><p>The backend exposes APIs on <code>http://localhost:5000</code>.</p><h3>4. Frontend (Angular)</h3><p>In a second shell, from the <code>wwwroot/</code> subfolder:</p><p>Snippet 4:</p><p>The frontend is available on <code>http://localhost:4200</code>.</p><p>Default login (post-firstRun): <code>admin</code> / <code>admin</code>.</p><h3>5. RAG Chatbot (optional)</h3><p>The RAG Chatbot (<code>Administration &gt; RAG Chat</code>) runs <strong>inside the .NET backend</strong>:</p><p>the retrieval engine (<code>rag-engine/WuicRagEngine.dll</code>, in-process ONNX Runtime)</p><p>is loaded by the backend when <code>AppSettings.rag-use-dotnet-engine</code> is <code>&quot;true&quot;</code></p><p>(the default in release packages). **No Python, no venv, no separate server</p><p>to start.**</p><p>The <strong>first</strong> time the chatbot is opened (or at the end of the first run) the</p><p>backend downloads by itself the ONNX models (<code>bge-m3</code> + reranker), tokenizer</p><p>and index (~4.5 GB) from <code>rag-engine-models-url</code> (default</p><p><code>https://wuic-framework.com/rag-models</code>) into <code>rag-engine/artifacts/</code>. An</p><p>internet connection is needed only once; the download runs in the background</p><p>(1-5 min) and an in-app notification is sent when it starts and when it ends.</p><p>Meanwhile the component shows the <strong>RAG offline</strong> status and the rest of the</p><p>application works normally.</p><p>Relevant <code>AppSettings</code> keys (all with ready defaults):</p><ul><li><code>rag-use-dotnet-engine</code> = <code>true</code> — enables the .NET engine (<code>false</code> = Python fallback, see below)</li><li><code>rag-engine-device</code> = <code>auto</code> — <code>auto</code> | <code>cuda</code> | <code>cpu</code>: with an NVIDIA GPU (CUDA 12.x + cuDNN 9) ~1 s/query, on CPU ~15-25 s/query</li><li><code>rag-engine-profile</code> = <code>release</code> — <code>release</code> = framework sources as signatures only; <code>internal</code> = full index</li><li><code>rag-engine-models-url</code> — download source on first start</li><li><code>rag-engine-cuda-path</code> = (empty) — folder of the CUDA/cuDNN DLLs when they are not installed system-wide</li></ul><p>For LLM chat set <code>rag-llm-provider</code> + <code>rag-llm-api-key</code> (Claude via Anthropic,</p><p>or a local model via Ollama with <code>rag-llm-base-url</code>). Without a provider only</p><p>the retrieval mode (snippet search) works. Key details on the <em>AppSettings</em></p><p>page.</p><p>&gt; The legacy Python stack (<code>scripts/rag-setup.ps1</code> + <code>rag_server.py</code> on</p><p>&gt; <code>127.0.0.1:8765</code>) is only usable as a fallback with</p><p>&gt; <code>rag-use-dotnet-engine = &quot;false&quot;</code> and is not shipped in release packages.</p><h2>Services Summary</h2><table><thead><tr><th>Service</th><th>Port</th><th>Required</th><th>Quick command</th></tr></thead><tbody><tr><td>SQL Server</td><td>1433</td><td>yes</td><td>(Windows service)</td></tr><tr><td>.NET Backend</td><td>5000</td><td>yes</td><td><code>dotnet watch ... run</code></td></tr><tr><td>Angular Frontend</td><td>4200</td><td>yes</td><td><code>npm run serve:dev</code></td></tr><tr><td>.NET RAG engine (ONNX)</td><td>in-process</td><td>no</td><td>loaded by the backend on the first chat</td></tr></tbody></table><h2>Quick Start — First Component</h2><p>1. Configure the AsmxProxy endpoint.</p><p>2. Define route metadata and columns.</p><p>3. Mount <code>wuic-data-source</code> + <code>wuic-data-repeater</code>.</p><p>Snippet 5:</p>",
7865
7865
  "codeSamples": [
7866
7866
  {
7867
7867
  "id": "code_1",
@@ -14569,7 +14569,7 @@ const frameworkDocsContent = {
14569
14569
  {
14570
14570
  "id": "overview",
14571
14571
  "title": "Overview",
14572
- "html": "<h1>Panorama du Framework</h1><p>WUIC Framework est une plateforme pilotee par metadata pour creer des interfaces metier de maniere rapide et coherente.</p><h2>Contenu</h2><ul><li>DataSource et DataRepeater pour orchestrer les donnees et le rendu.</li><li>Archetypes visuels (list, map, scheduler, chart, carousel).</li><li>Designer runtime pour les dashboards et les templates dynamiques.</li><li>Workflow designer/runner pour les processus operationnels.</li><li>RAG Chatbot pour interroger la codebase en langage naturel.</li><li>Multi-SGBD : SQL Server, MySQL, PostgreSQL et Oracle via des providers drop-in (<code>dbms</code> : <code>mssql</code> | <code>mysql</code> | <code>postgresql</code> | <code>oracle</code>).</li></ul><h2>First Steps — Demarrage de l&#39;environnement dev</h2><p>La stack WUIC est composee de plusieurs services. Demarrez-les dans l&#39;ordre indique.</p><h3>Prerequis</h3><table><thead><tr><th>Element</th><th>Verification</th><th>Notes</th></tr></thead><tbody><tr><td>.NET 10 SDK</td><td><code>dotnet --version</code></td><td>Hosting Bundle pour IIS en production</td></tr><tr><td>Node.js 22 LTS</td><td><code>node --version</code></td><td>La 22 est la version avec laquelle le paquet est teste ; avec npm 10.9.x l&#39;installation passe grace au <code>package-lock.json</code> inclus</td></tr><tr><td>PowerShell 5.1+</td><td><code>$PSVersionTable.PSVersion</code></td><td>Le Windows PowerShell livre avec Windows suffit : <code>rename-project.ps1</code> et les scripts <code>llm-workspace/</code> fonctionnent aussi sur 5.1. PowerShell 7 est recommande, pas requis</td></tr><tr><td>SQL Server 2019+</td><td><code>sqlcmd -S localhost\\sqlexpress -E -C -Q &quot;SELECT 1&quot;</code></td><td>S&#39;il manque, <strong>la ligne unique l&#39;installe elle-meme</strong> (SQL Server Express, ou le moteur choisi avec <code>-Dbms</code>) ; pas sur Windows Server, voir l&#39;encadre ci-dessous. 2019 suffit pour les packages sans <code>.bak</code> ; le tutoriel <code>.bak</code> est une sauvegarde SQL Server 2022 et exige <strong>2022 ou plus recent</strong></td></tr><tr><td>GPU NVIDIA (CUDA 12.x + cuDNN 9)</td><td><code>nvidia-smi</code></td><td>Optionnel : accelere le RAG Chatbot (sans GPU il tourne sur CPU)</td></tr></tbody></table><p>&gt; <strong>Sur Windows Server la base de donnees doit etre installee avant.</strong> La ligne unique recupere</p><p>&gt; les composants manquants via <code>winget</code>, absent sur Windows Server : sans une instance deja</p><p>&gt; joignable, l&#39;installation s&#39;arrete avec `No SQL Server instance reachable and winget is</p><p>&gt; missing`. Installe donc le moteur avant de lancer la ligne - SQL Server doit etre **2019 ou</p><p>&gt; superieur<strong> (Express suffit ; </strong>2022 ou superieur** pour le tutoriel <code>.bak</code>), et une 2017</p><p>&gt; n&#39;est pas acceptee. Si l&#39;instance n&#39;est pas celle par defaut, passe-la avec</p><p>&gt; <code>-SqlServer &#39;localhost\\NOMINSTANCE&#39;</code>. Cela vaut pour tous les moteurs, pas seulement SQL Server.</p><h3>1. Telecharger le template de projet</h3><p>Sous Windows, une seule ligne PowerShell fait tout : elle telecharge le paquet, verifie le SDK .NET 10</p><p>et Node.js 22 (en installant ce qui manque), execute <code>dotnet restore</code> et <code>npm install</code>,</p><p>et installe l&#39;extension WUIC Assistant dans VS Code.</p><p>Snippet 1:</p><p>Options utiles sur la meme ligne : <code>-Dbms mysql</code> (ou <code>postgres</code>, <code>oracle</code>) pour un moteur</p><p>autre que SQL Server — l&#39;installeur l&#39;installe et le configure lui-meme — et <code>-WithTutorial</code></p><p>pour telecharger aussi la base de donnees d&#39;exemple.</p><p>Quand c&#39;est termine, le dernier ecran est deja votre liste de taches :</p><p>Snippet 2:</p><p>La chaine de connexion est prete a l&#39;emploi : au premier demarrage le wizard ne demande rien</p><p>d&#39;autre. Avec <code>-Dbms mysql</code> ou <code>-Dbms postgres</code> cette ligne change en consequence et porte en</p><p>elle l&#39;utilisateur et le mot de passe, parce que le mot de passe du superutilisateur est</p><p><strong>genere par l&#39;installeur</strong> ; ce meme mot de passe est enregistre dans <code>wuic-secrets.json</code>, a</p><p>cote de l&#39;installation, et c&#39;est le seul endroit ou il reste ecrit.</p><p>Le chemin manuel reste valable, sur n&#39;importe quel systeme :</p><p>Partez du paquet <code>WuicTest-src-*.zip</code> (lien dans la section <strong>Download</strong> du site).</p><p>Extrayez-le dans un dossier de travail, ex. <code>C:\\dev\\WuicTest</code> (les fichiers vont directement</p><p>a la racine, PAS dans un sous-dossier <code>src/</code>). Le paquet contient :</p><ul><li><code>WuicTest.csproj</code> → projet host avec <code>&lt;PackageReference Include=&quot;WuicCore&quot; Version=&quot;...&quot; /&gt;</code></li><li><code>wwwroot/</code> → app Angular avec <code>package.json</code> qui reference <code>wuic-framework-lib</code> depuis le registre npm</li><li><code>appsettings.json</code> preconfigure en mode <code>firstRun = &quot;true&quot;</code> avec placeholders <code>__SET_*__</code></li><li><code>appsettings-samples/</code> → 6 templates prets (<code>mssql</code>/<code>mysql</code>, firstRun/post-firstRun, <code>Development</code>)</li></ul><p>&gt; <strong>Pas besoin de cloner le repository du framework</strong> : <code>WuicCore</code> arrive comme paquet NuGet</p><p>&gt; depuis <code>nuget.org</code> et <code>wuic-framework-lib</code> comme paquet npm depuis le registre npm. Le source</p><p>&gt; du framework n&#39;est necessaire que si vous voulez le modifier — typiquement pas votre cas.</p><p>&gt; <strong>npm 10.9.x et les paquets anterieurs a la 1.7.1</strong> : ces paquets ne contiennent pas de</p><p>&gt; <code>package-lock.json</code>, et sans lock npm 10.9.x (la version installee par Node 22 LTS) s&#39;arrete avec</p><p>&gt; <code>Cannot read properties of null (reading &#39;edgesOut&#39;)</code> pendant la resolution des peers.</p><p>&gt; Telechargez le lock publie a cote de la release —</p><p>&gt; <code>https://wuic-framework.com/downloads/locks/&lt;nom-du-zip&gt;.package-lock.json</code> — placez-le dans</p><p>&gt; <code>wwwroot/</code> et relancez <code>npm install</code>. La ligne unique <code>-Src</code> le fait pour vous.</p><h3>2. Base de donnees</h3><p>Il faut une instance du moteur joignable. <strong>Avec la ligne unique, rien a faire</strong> : elle</p><p>installe et configure l&#39;instance, et la chaine de connexion a coller dans le wizard est la</p><p>derniere chose qu&#39;elle affiche. Sur le chemin manuel, l&#39;instance doit deja exister.</p><p>Connexions dans <code>appsettings.json</code> :</p><ul><li><code>MetaDataSQLConnection</code> — DB metadata (menu, tables, colonnes, board, utilisateurs)</li><li><code>DataSQLConnection</code> — DB donnees applicatives</li></ul><p>S&#39;il s&#39;agit de la premiere installation (<code>AppSettings.firstRun = &quot;true&quot;</code> dans le template),</p><p>le wizard de scaffolding au premier demarrage cree le schema metadata et peuple le DB donnees.</p><p>Voir la page <em>Scaffolding initial</em> pour le flux guide.</p><h3>3. Backend (.NET)</h3><p>Depuis la racine du dossier extrait (ex. <code>C:\\dev\\WuicTest</code>) :</p><p>Snippet 3:</p><p>Le backend expose les API sur <code>http://localhost:5000</code>.</p><h3>4. Frontend (Angular)</h3><p>Dans un second shell, depuis le sous-dossier <code>wwwroot/</code> :</p><p>Snippet 4:</p><p>Le frontend est disponible sur <code>http://localhost:4200</code>.</p><p>Login par defaut (post-firstRun) : <code>admin</code> / <code>admin</code>.</p><h3>5. RAG Chatbot (optionnel)</h3><p>Le RAG Chatbot (<code>Administration &gt; RAG Chat</code>) tourne <strong>dans le backend .NET</strong> :</p><p>le moteur de retrieval (<code>rag-engine/WuicRagEngine.dll</code>, ONNX Runtime</p><p>in-process) est charge par le backend quand <code>AppSettings.rag-use-dotnet-engine</code></p><p>vaut <code>&quot;true&quot;</code> (valeur par defaut des packages de release). **Pas de Python, pas</p><p>de venv, aucun serveur separe a demarrer.**</p><p>A la <strong>premiere</strong> ouverture du chatbot (ou a la fin du first-run) le backend</p><p>telecharge seul les modeles ONNX (<code>bge-m3</code> + reranker), le tokenizer et</p><p>l&#39;index (~4,5 Go) depuis <code>rag-engine-models-url</code> (par defaut</p><p><code>https://wuic-framework.com/rag-models</code>) dans <code>rag-engine/artifacts/</code>. Une</p><p>connexion internet n&#39;est necessaire qu&#39;une seule fois ; le telechargement</p><p>tourne en arriere-plan (1-5 min) et une notification in-app arrive au debut</p><p>et a la fin. Entre-temps le composant affiche l&#39;etat <strong>RAG offline</strong> et le</p><p>reste de l&#39;application fonctionne normalement.</p><p>Cles <code>AppSettings</code> pertinentes (toutes avec des valeurs par defaut pretes) :</p><ul><li><code>rag-use-dotnet-engine</code> = <code>true</code> — active le moteur .NET (<code>false</code> = fallback Python, voir ci-dessous)</li><li><code>rag-engine-device</code> = <code>auto</code> — <code>auto</code> | <code>cuda</code> | <code>cpu</code> : avec GPU NVIDIA (CUDA 12.x + cuDNN 9) ~1 s/requete, sur CPU ~15-25 s/requete</li><li><code>rag-engine-profile</code> = <code>release</code> — <code>release</code> = sources du framework en signature seulement ; <code>internal</code> = index integral</li><li><code>rag-engine-models-url</code> — source du telechargement au premier demarrage</li><li><code>rag-engine-cuda-path</code> = (vide) — dossier des DLL CUDA/cuDNN si elles ne sont pas installees au niveau systeme</li></ul><p>Pour le chat avec LLM, renseignez <code>rag-llm-provider</code> + <code>rag-llm-api-key</code></p><p>(Claude via Anthropic, ou un modele local via Ollama avec <code>rag-llm-base-url</code>).</p><p>Sans provider, seul le mode retrieval (recherche de snippets) fonctionne.</p><p>Detail des cles sur la page <em>AppSettings</em>.</p><p>&gt; L&#39;ancien stack Python (<code>scripts/rag-setup.ps1</code> + <code>rag_server.py</code> sur</p><p>&gt; <code>127.0.0.1:8765</code>) n&#39;est utilisable qu&#39;en fallback avec</p><p>&gt; <code>rag-use-dotnet-engine = &quot;false&quot;</code> et n&#39;est pas inclus dans les packages de release.</p><h2>Recapitulatif des services</h2><table><thead><tr><th>Service</th><th>Port</th><th>Obligatoire</th><th>Commande rapide</th></tr></thead><tbody><tr><td>SQL Server</td><td>1433</td><td>oui</td><td>(service Windows)</td></tr><tr><td>Backend .NET</td><td>5000</td><td>oui</td><td><code>dotnet watch ... run</code></td></tr><tr><td>Frontend Angular</td><td>4200</td><td>oui</td><td><code>npm run serve:dev</code></td></tr><tr><td>Engine RAG .NET (ONNX)</td><td>in-process</td><td>non</td><td>charge par le backend au premier chat</td></tr></tbody></table><h2>Quick Start — premier composant</h2><p>1. Configurez l&#39;endpoint AsmxProxy.</p><p>2. Definissez la route metadata et les colonnes.</p><p>3. Montez <code>wuic-data-source</code> + <code>wuic-data-repeater</code>.</p><p>Snippet 5:</p>",
14572
+ "html": "<h1>Panorama du Framework</h1><p>WUIC Framework est une plateforme pilotee par metadata pour creer des interfaces metier de maniere rapide et coherente.</p><h2>Contenu</h2><ul><li>DataSource et DataRepeater pour orchestrer les donnees et le rendu.</li><li>Archetypes visuels (list, map, scheduler, chart, carousel).</li><li>Designer runtime pour les dashboards et les templates dynamiques.</li><li>Workflow designer/runner pour les processus operationnels.</li><li>RAG Chatbot pour interroger la codebase en langage naturel.</li><li>Multi-SGBD : SQL Server, MySQL, PostgreSQL et Oracle via des providers drop-in (<code>dbms</code> : <code>mssql</code> | <code>mysql</code> | <code>postgresql</code> | <code>oracle</code>).</li></ul><h2>First Steps — Demarrage de l&#39;environnement dev</h2><p>La stack WUIC est composee de plusieurs services. Demarrez-les dans l&#39;ordre indique.</p><h3>Prerequis</h3><table><thead><tr><th>Element</th><th>Verification</th><th>Notes</th></tr></thead><tbody><tr><td>.NET 10 SDK</td><td><code>dotnet --version</code></td><td>Hosting Bundle pour IIS en production</td></tr><tr><td>Node.js 22 LTS</td><td><code>node --version</code></td><td>La 22 est la version avec laquelle le paquet est teste ; avec npm 10.9.x l&#39;installation passe grace au <code>package-lock.json</code> inclus</td></tr><tr><td>PowerShell 5.1+</td><td><code>$PSVersionTable.PSVersion</code></td><td>Le Windows PowerShell livre avec Windows suffit : <code>rename-project.ps1</code> et les scripts <code>llm-workspace/</code> fonctionnent aussi sur 5.1. PowerShell 7 est recommande, pas requis</td></tr><tr><td>SQL Server 2019+</td><td><code>sqlcmd -S localhost\\sqlexpress -E -C -Q &quot;SELECT 1&quot;</code></td><td>S&#39;il manque, <strong>la ligne unique l&#39;installe elle-meme</strong> (SQL Server Express, ou le moteur choisi avec <code>-Dbms</code>) ; pas sur Windows Server, voir l&#39;encadre ci-dessous. 2019 suffit pour les packages sans <code>.bak</code> ; le tutoriel <code>.bak</code> est une sauvegarde SQL Server 2022 et exige <strong>2022 ou plus recent</strong></td></tr><tr><td>Linux (installeur <code>install.sh</code>)</td><td><code>lsb_release -ds</code></td><td><strong>Ubuntu 22.04 ou 24.04 LTS</strong> (24.04 recommandee) : ce sont les seules versions d&#39;Ubuntu supportees par Microsoft pour SQL Server, la <strong>26.04 n&#39;est pas supportee</strong> (<a href=\"https://learn.microsoft.com/en-us/sql/linux/sql-server-linux-setup?view=sql-server-ver17\" target=\"_blank\" rel=\"noopener noreferrer\">Supported platforms</a>). Meme recommandation avec MySQL, PostgreSQL et Oracle, car l&#39;installeur est teste sur ces versions</td></tr><tr><td>GPU NVIDIA (CUDA 12.x + cuDNN 9)</td><td><code>nvidia-smi</code></td><td>Optionnel : accelere le RAG Chatbot (sans GPU il tourne sur CPU)</td></tr></tbody></table><p>&gt; <strong>Sur Windows Server la base de donnees doit etre installee avant.</strong> La ligne unique recupere</p><p>&gt; les composants manquants via <code>winget</code>, absent sur Windows Server : sans une instance deja</p><p>&gt; joignable, l&#39;installation s&#39;arrete avec `No SQL Server instance reachable and winget is</p><p>&gt; missing`. Installe donc le moteur avant de lancer la ligne - SQL Server doit etre **2019 ou</p><p>&gt; superieur<strong> (Express suffit ; </strong>2022 ou superieur** pour le tutoriel <code>.bak</code>), et une 2017</p><p>&gt; n&#39;est pas acceptee. Si l&#39;instance n&#39;est pas celle par defaut, passe-la avec</p><p>&gt; <code>-SqlServer &#39;localhost\\NOMINSTANCE&#39;</code>. Cela vaut pour tous les moteurs, pas seulement SQL Server.</p><h3>1. Telecharger le template de projet</h3><p>Sous Windows, une seule ligne PowerShell fait tout : elle telecharge le paquet, verifie le SDK .NET 10</p><p>et Node.js 22 (en installant ce qui manque), execute <code>dotnet restore</code> et <code>npm install</code>,</p><p>et installe l&#39;extension WUIC Assistant dans VS Code.</p><p>Snippet 1:</p><p>Options utiles sur la meme ligne : <code>-Dbms mysql</code> (ou <code>postgres</code>, <code>oracle</code>) pour un moteur</p><p>autre que SQL Server — l&#39;installeur l&#39;installe et le configure lui-meme — et <code>-WithTutorial</code></p><p>pour telecharger aussi la base de donnees d&#39;exemple.</p><p>Quand c&#39;est termine, le dernier ecran est deja votre liste de taches :</p><p>Snippet 2:</p><p>La chaine de connexion est prete a l&#39;emploi : au premier demarrage le wizard ne demande rien</p><p>d&#39;autre. Avec <code>-Dbms mysql</code> ou <code>-Dbms postgres</code> cette ligne change en consequence et porte en</p><p>elle l&#39;utilisateur et le mot de passe, parce que le mot de passe du superutilisateur est</p><p><strong>genere par l&#39;installeur</strong> ; ce meme mot de passe est enregistre dans <code>wuic-secrets.json</code>, a</p><p>cote de l&#39;installation, et c&#39;est le seul endroit ou il reste ecrit.</p><p>Le chemin manuel reste valable, sur n&#39;importe quel systeme :</p><p>Partez du paquet <code>WuicTest-src-*.zip</code> (lien dans la section <strong>Download</strong> du site).</p><p>Extrayez-le dans un dossier de travail, ex. <code>C:\\dev\\WuicTest</code> (les fichiers vont directement</p><p>a la racine, PAS dans un sous-dossier <code>src/</code>). Le paquet contient :</p><ul><li><code>WuicTest.csproj</code> → projet host avec <code>&lt;PackageReference Include=&quot;WuicCore&quot; Version=&quot;...&quot; /&gt;</code></li><li><code>wwwroot/</code> → app Angular avec <code>package.json</code> qui reference <code>wuic-framework-lib</code> depuis le registre npm</li><li><code>appsettings.json</code> preconfigure en mode <code>firstRun = &quot;true&quot;</code> avec placeholders <code>__SET_*__</code></li><li><code>appsettings-samples/</code> → 6 templates prets (<code>mssql</code>/<code>mysql</code>, firstRun/post-firstRun, <code>Development</code>)</li></ul><p>&gt; <strong>Pas besoin de cloner le repository du framework</strong> : <code>WuicCore</code> arrive comme paquet NuGet</p><p>&gt; depuis <code>nuget.org</code> et <code>wuic-framework-lib</code> comme paquet npm depuis le registre npm. Le source</p><p>&gt; du framework n&#39;est necessaire que si vous voulez le modifier — typiquement pas votre cas.</p><p>&gt; <strong>npm 10.9.x et les paquets anterieurs a la 1.7.1</strong> : ces paquets ne contiennent pas de</p><p>&gt; <code>package-lock.json</code>, et sans lock npm 10.9.x (la version installee par Node 22 LTS) s&#39;arrete avec</p><p>&gt; <code>Cannot read properties of null (reading &#39;edgesOut&#39;)</code> pendant la resolution des peers.</p><p>&gt; Telechargez le lock publie a cote de la release —</p><p>&gt; <code>https://wuic-framework.com/downloads/locks/&lt;nom-du-zip&gt;.package-lock.json</code> — placez-le dans</p><p>&gt; <code>wwwroot/</code> et relancez <code>npm install</code>. La ligne unique <code>-Src</code> le fait pour vous.</p><h3>2. Base de donnees</h3><p>Il faut une instance du moteur joignable. <strong>Avec la ligne unique, rien a faire</strong> : elle</p><p>installe et configure l&#39;instance, et la chaine de connexion a coller dans le wizard est la</p><p>derniere chose qu&#39;elle affiche. Sur le chemin manuel, l&#39;instance doit deja exister.</p><p>Connexions dans <code>appsettings.json</code> :</p><ul><li><code>MetaDataSQLConnection</code> — DB metadata (menu, tables, colonnes, board, utilisateurs)</li><li><code>DataSQLConnection</code> — DB donnees applicatives</li></ul><p>S&#39;il s&#39;agit de la premiere installation (<code>AppSettings.firstRun = &quot;true&quot;</code> dans le template),</p><p>le wizard de scaffolding au premier demarrage cree le schema metadata et peuple le DB donnees.</p><p>Voir la page <em>Scaffolding initial</em> pour le flux guide.</p><h3>3. Backend (.NET)</h3><p>Depuis la racine du dossier extrait (ex. <code>C:\\dev\\WuicTest</code>) :</p><p>Snippet 3:</p><p>Le backend expose les API sur <code>http://localhost:5000</code>.</p><h3>4. Frontend (Angular)</h3><p>Dans un second shell, depuis le sous-dossier <code>wwwroot/</code> :</p><p>Snippet 4:</p><p>Le frontend est disponible sur <code>http://localhost:4200</code>.</p><p>Login par defaut (post-firstRun) : <code>admin</code> / <code>admin</code>.</p><h3>5. RAG Chatbot (optionnel)</h3><p>Le RAG Chatbot (<code>Administration &gt; RAG Chat</code>) tourne <strong>dans le backend .NET</strong> :</p><p>le moteur de retrieval (<code>rag-engine/WuicRagEngine.dll</code>, ONNX Runtime</p><p>in-process) est charge par le backend quand <code>AppSettings.rag-use-dotnet-engine</code></p><p>vaut <code>&quot;true&quot;</code> (valeur par defaut des packages de release). **Pas de Python, pas</p><p>de venv, aucun serveur separe a demarrer.**</p><p>A la <strong>premiere</strong> ouverture du chatbot (ou a la fin du first-run) le backend</p><p>telecharge seul les modeles ONNX (<code>bge-m3</code> + reranker), le tokenizer et</p><p>l&#39;index (~4,5 Go) depuis <code>rag-engine-models-url</code> (par defaut</p><p><code>https://wuic-framework.com/rag-models</code>) dans <code>rag-engine/artifacts/</code>. Une</p><p>connexion internet n&#39;est necessaire qu&#39;une seule fois ; le telechargement</p><p>tourne en arriere-plan (1-5 min) et une notification in-app arrive au debut</p><p>et a la fin. Entre-temps le composant affiche l&#39;etat <strong>RAG offline</strong> et le</p><p>reste de l&#39;application fonctionne normalement.</p><p>Cles <code>AppSettings</code> pertinentes (toutes avec des valeurs par defaut pretes) :</p><ul><li><code>rag-use-dotnet-engine</code> = <code>true</code> — active le moteur .NET (<code>false</code> = fallback Python, voir ci-dessous)</li><li><code>rag-engine-device</code> = <code>auto</code> — <code>auto</code> | <code>cuda</code> | <code>cpu</code> : avec GPU NVIDIA (CUDA 12.x + cuDNN 9) ~1 s/requete, sur CPU ~15-25 s/requete</li><li><code>rag-engine-profile</code> = <code>release</code> — <code>release</code> = sources du framework en signature seulement ; <code>internal</code> = index integral</li><li><code>rag-engine-models-url</code> — source du telechargement au premier demarrage</li><li><code>rag-engine-cuda-path</code> = (vide) — dossier des DLL CUDA/cuDNN si elles ne sont pas installees au niveau systeme</li></ul><p>Pour le chat avec LLM, renseignez <code>rag-llm-provider</code> + <code>rag-llm-api-key</code></p><p>(Claude via Anthropic, ou un modele local via Ollama avec <code>rag-llm-base-url</code>).</p><p>Sans provider, seul le mode retrieval (recherche de snippets) fonctionne.</p><p>Detail des cles sur la page <em>AppSettings</em>.</p><p>&gt; L&#39;ancien stack Python (<code>scripts/rag-setup.ps1</code> + <code>rag_server.py</code> sur</p><p>&gt; <code>127.0.0.1:8765</code>) n&#39;est utilisable qu&#39;en fallback avec</p><p>&gt; <code>rag-use-dotnet-engine = &quot;false&quot;</code> et n&#39;est pas inclus dans les packages de release.</p><h2>Recapitulatif des services</h2><table><thead><tr><th>Service</th><th>Port</th><th>Obligatoire</th><th>Commande rapide</th></tr></thead><tbody><tr><td>SQL Server</td><td>1433</td><td>oui</td><td>(service Windows)</td></tr><tr><td>Backend .NET</td><td>5000</td><td>oui</td><td><code>dotnet watch ... run</code></td></tr><tr><td>Frontend Angular</td><td>4200</td><td>oui</td><td><code>npm run serve:dev</code></td></tr><tr><td>Engine RAG .NET (ONNX)</td><td>in-process</td><td>non</td><td>charge par le backend au premier chat</td></tr></tbody></table><h2>Quick Start — premier composant</h2><p>1. Configurez l&#39;endpoint AsmxProxy.</p><p>2. Definissez la route metadata et les colonnes.</p><p>3. Montez <code>wuic-data-source</code> + <code>wuic-data-repeater</code>.</p><p>Snippet 5:</p>",
14573
14573
  "codeSamples": [
14574
14574
  {
14575
14575
  "id": "code_1",
@@ -21277,7 +21277,7 @@ const frameworkDocsContent = {
21277
21277
  {
21278
21278
  "id": "overview",
21279
21279
  "title": "Overview",
21280
- "html": "<h1>Panorámica del Framework</h1><p>WUIC Framework es una plataforma metadata-driven para crear interfaces de negocio de forma rápida y coherente.</p><h2>Qué incluye</h2><ul><li>DataSource y DataRepeater para orquestar datos y renderizado.</li><li>Archetypes visuales (list, map, scheduler, chart, carousel).</li><li>Designer runtime para dashboards y templates dinámicos.</li><li>Workflow designer/runner para procesos operativos.</li><li>RAG Chatbot para consultar la codebase en lenguaje natural.</li><li>Multi-SGBD: SQL Server, MySQL, PostgreSQL y Oracle mediante providers drop-in (<code>dbms</code>: <code>mssql</code> | <code>mysql</code> | <code>postgresql</code> | <code>oracle</code>).</li></ul><h2>First Steps — Arranque del entorno dev</h2><p>El stack WUIC está compuesto por varios servicios. Arráncalos en el orden indicado.</p><h3>Prerrequisitos</h3><table><thead><tr><th>Qué</th><th>Verificación</th><th>Notas</th></tr></thead><tbody><tr><td>.NET 10 SDK</td><td><code>dotnet --version</code></td><td>Hosting Bundle para IIS en producción</td></tr><tr><td>Node.js 22 LTS</td><td><code>node --version</code></td><td>La 22 es la version con la que se prueba el paquete; con npm 10.9.x la instalacion funciona gracias al <code>package-lock.json</code> incluido</td></tr><tr><td>PowerShell 5.1+</td><td><code>$PSVersionTable.PSVersion</code></td><td>El Windows PowerShell preinstalado es suficiente: <code>rename-project.ps1</code> y los scripts <code>llm-workspace/</code> tambien funcionan en 5.1. PowerShell 7 es recomendable, no obligatorio</td></tr><tr><td>SQL Server 2019+</td><td><code>sqlcmd -S localhost\\sqlexpress -E -C -Q &quot;SELECT 1&quot;</code></td><td>Si falta, <strong>la línea única lo instala por su cuenta</strong> (SQL Server Express, o el motor elegido con <code>-Dbms</code>); en Windows Server no, ver el recuadro de abajo. 2019 basta para los paquetes sin <code>.bak</code>; el tutorial <code>.bak</code> es una copia de SQL Server 2022 y requiere <strong>2022 o superior</strong></td></tr><tr><td>GPU NVIDIA (CUDA 12.x + cuDNN 9)</td><td><code>nvidia-smi</code></td><td>Opcional: acelera el RAG Chatbot (sin GPU funciona en CPU)</td></tr></tbody></table><p>&gt; <strong>En Windows Server la base de datos debe instalarse antes.</strong> La linea unica obtiene los</p><p>&gt; componentes que faltan mediante <code>winget</code>, que no esta presente en Windows Server: sin una</p><p>&gt; instancia ya accesible la instalacion se detiene con `No SQL Server instance reachable and</p><p>&gt; winget is missing`. Instala el motor antes de ejecutar la linea - SQL Server debe ser **2019 o</p><p>&gt; superior<strong> (Express es suficiente; </strong>2022 o superior** para el tutorial <code>.bak</code>), y una 2017 no</p><p>&gt; se acepta. Si la instancia no es la predeterminada, pasala con</p><p>&gt; <code>-SqlServer &#39;localhost\\NOMBREINSTANCIA&#39;</code>. Vale para todos los motores, no solo SQL Server.</p><h3>1. Descarga el template de proyecto</h3><p>En Windows una sola linea de PowerShell lo hace todo: descarga el paquete, comprueba el SDK de .NET 10</p><p>y Node.js 22 (instalando lo que falte), ejecuta <code>dotnet restore</code> y <code>npm install</code>,</p><p>e instala la extension WUIC Assistant en VS Code.</p><p>Snippet 1:</p><p>Opciones útiles en la misma línea: <code>-Dbms mysql</code> (o <code>postgres</code>, <code>oracle</code>) para un motor</p><p>distinto de SQL Server — el instalador lo instala y lo configura él mismo — y <code>-WithTutorial</code></p><p>para descargar también la base de datos de ejemplo.</p><p>Cuando termina, la última pantalla ya es tu lista de tareas:</p><p>Snippet 2:</p><p>La cadena de conexión ya está lista: en el primer arranque el wizard no pide nada más. Con</p><p><code>-Dbms mysql</code> o <code>-Dbms postgres</code> esa línea cambia en consecuencia y lleva dentro usuario y</p><p>contraseña, porque la contraseña del superusuario <strong>la genera el instalador</strong>; esa misma</p><p>contraseña se guarda en <code>wuic-secrets.json</code>, junto a la instalación, y es el único sitio donde</p><p>queda escrita.</p><p>La via manual sigue siendo valida, en cualquier sistema:</p><p>Parte del paquete <code>WuicTest-src-*.zip</code> (enlace en la sección <strong>Download</strong> del sitio).</p><p>Extráelo en una carpeta de trabajo, p. ej. <code>C:\\dev\\WuicTest</code> (los archivos van directamente</p><p>en la raíz, NO dentro de una subcarpeta <code>src/</code>). El paquete contiene:</p><ul><li><code>WuicTest.csproj</code> → proyecto host con <code>&lt;PackageReference Include=&quot;WuicCore&quot; Version=&quot;...&quot; /&gt;</code></li><li><code>wwwroot/</code> → app Angular cuyo <code>package.json</code> referencia <code>wuic-framework-lib</code> desde el registry npm</li><li><code>appsettings.json</code> preconfigurado en modo <code>firstRun = &quot;true&quot;</code> con placeholders <code>__SET_*__</code></li><li><code>appsettings-samples/</code> → 6 templates listos (<code>mssql</code>/<code>mysql</code>, firstRun/post-firstRun, <code>Development</code>)</li></ul><p>&gt; <strong>No hace falta clonar el repositorio del framework</strong>: <code>WuicCore</code> llega como paquete NuGet</p><p>&gt; desde <code>nuget.org</code> y <code>wuic-framework-lib</code> como paquete npm desde el registry npm. El código</p><p>&gt; fuente del framework solo se necesita si quieres modificarlo — típicamente no es tu caso.</p><p>&gt; <strong>npm 10.9.x y los paquetes anteriores a 1.7.1</strong>: esos paquetes no incluyen <code>package-lock.json</code>, y</p><p>&gt; sin lock npm 10.9.x (la version que instala Node 22 LTS) se detiene con</p><p>&gt; <code>Cannot read properties of null (reading &#39;edgesOut&#39;)</code> al resolver las dependencias peer.</p><p>&gt; Descarga el lock publicado junto a la release —</p><p>&gt; <code>https://wuic-framework.com/downloads/locks/&lt;nombre-del-zip&gt;.package-lock.json</code> — colocalo en</p><p>&gt; <code>wwwroot/</code> y ejecuta <code>npm install</code> otra vez. La linea unica <code>-Src</code> lo hace por ti.</p><h3>2. Database</h3><p>Hace falta una instancia del motor accesible. <strong>Con la línea única no hay nada que hacer</strong>:</p><p>la instala y la configura ella, y la cadena de conexión que hay que pegar en el wizard es lo</p><p>último que imprime. En la vía manual la instancia debe existir ya.</p><p>Conexiones en <code>appsettings.json</code>:</p><ul><li><code>MetaDataSQLConnection</code> — DB metadata (menú, tablas, columnas, boards, usuarios)</li><li><code>DataSQLConnection</code> — DB datos de la aplicación</li></ul><p>Si es la primera instalación (<code>AppSettings.firstRun = &quot;true&quot;</code> en el template),</p><p>el wizard de scaffolding en el primer arranque crea el esquema metadata y puebla el DB datos.</p><p>Ver la página <em>Scaffolding inicial</em> para el flujo guiado.</p><h3>3. Backend (.NET)</h3><p>Desde la raíz de la carpeta extraída (p. ej. <code>C:\\dev\\WuicTest</code>):</p><p>Snippet 3:</p><p>El backend expone las API en <code>http://localhost:5000</code>.</p><h3>4. Frontend (Angular)</h3><p>En una segunda shell, desde la subcarpeta <code>wwwroot/</code>:</p><p>Snippet 4:</p><p>El frontend está disponible en <code>http://localhost:4200</code>.</p><p>Login por defecto (post-firstRun): <code>admin</code> / <code>admin</code>.</p><h3>5. RAG Chatbot (opcional)</h3><p>El RAG Chatbot (<code>Administración &gt; RAG Chat</code>) se ejecuta **dentro del backend</p><p>.NET**: el motor de retrieval (<code>rag-engine/WuicRagEngine.dll</code>, ONNX Runtime</p><p>in-process) lo carga el backend cuando <code>AppSettings.rag-use-dotnet-engine</code> es</p><p><code>&quot;true&quot;</code> (valor por defecto en los paquetes de release). **Sin Python, sin</p><p>venv, ningún servidor separado que arrancar.**</p><p>La <strong>primera</strong> vez que se abre el chatbot (o al final del first-run) el</p><p>backend descarga por sí solo los modelos ONNX (<code>bge-m3</code> + reranker), el</p><p>tokenizer y el índice (~4,5 GB) desde <code>rag-engine-models-url</code> (por defecto</p><p><code>https://wuic-framework.com/rag-models</code>) en <code>rag-engine/artifacts/</code>. Solo hace</p><p>falta conexión a internet una vez; la descarga corre en segundo plano (1-5 min)</p><p>y llega una notificación in-app al inicio y al final. Mientras tanto el</p><p>componente muestra el estado <strong>RAG offline</strong> y el resto de la aplicación</p><p>funciona con normalidad.</p><p>Claves <code>AppSettings</code> relevantes (todas con valores por defecto listos):</p><ul><li><code>rag-use-dotnet-engine</code> = <code>true</code> — activa el motor .NET (<code>false</code> = fallback Python, ver abajo)</li><li><code>rag-engine-device</code> = <code>auto</code> — <code>auto</code> | <code>cuda</code> | <code>cpu</code>: con GPU NVIDIA (CUDA 12.x + cuDNN 9) ~1 s/consulta, en CPU ~15-25 s/consulta</li><li><code>rag-engine-profile</code> = <code>release</code> — <code>release</code> = fuentes del framework solo como firma; <code>internal</code> = índice completo</li><li><code>rag-engine-models-url</code> — origen de la descarga en el primer arranque</li><li><code>rag-engine-cuda-path</code> = (vacío) — carpeta de las DLL CUDA/cuDNN si no están instaladas a nivel de sistema</li></ul><p>Para el chat con LLM configura <code>rag-llm-provider</code> + <code>rag-llm-api-key</code> (Claude</p><p>vía Anthropic, o un modelo local vía Ollama con <code>rag-llm-base-url</code>). Sin</p><p>provider solo funciona la modalidad retrieval (búsqueda de snippets). Detalle</p><p>de las claves en la página <em>AppSettings</em>.</p><p>&gt; El stack histórico Python (<code>scripts/rag-setup.ps1</code> + <code>rag_server.py</code> en</p><p>&gt; <code>127.0.0.1:8765</code>) solo puede usarse como fallback con</p><p>&gt; <code>rag-use-dotnet-engine = &quot;false&quot;</code> y no se incluye en los paquetes de release.</p><h2>Resumen de servicios</h2><table><thead><tr><th>Servicio</th><th>Puerto</th><th>Obligatorio</th><th>Comando rápido</th></tr></thead><tbody><tr><td>SQL Server</td><td>1433</td><td>sí</td><td>(servicio Windows)</td></tr><tr><td>Backend .NET</td><td>5000</td><td>sí</td><td><code>dotnet watch ... run</code></td></tr><tr><td>Frontend Angular</td><td>4200</td><td>sí</td><td><code>npm run serve:dev</code></td></tr><tr><td>Engine RAG .NET (ONNX)</td><td>in-process</td><td>no</td><td>cargado por el backend en el primer chat</td></tr></tbody></table><h2>Quick Start — primer componente</h2><p>1. Configura el endpoint AsmxProxy.</p><p>2. Define route metadata y columnas.</p><p>3. Monta <code>wuic-data-source</code> + <code>wuic-data-repeater</code>.</p><p>Snippet 5:</p>",
21280
+ "html": "<h1>Panorámica del Framework</h1><p>WUIC Framework es una plataforma metadata-driven para crear interfaces de negocio de forma rápida y coherente.</p><h2>Qué incluye</h2><ul><li>DataSource y DataRepeater para orquestar datos y renderizado.</li><li>Archetypes visuales (list, map, scheduler, chart, carousel).</li><li>Designer runtime para dashboards y templates dinámicos.</li><li>Workflow designer/runner para procesos operativos.</li><li>RAG Chatbot para consultar la codebase en lenguaje natural.</li><li>Multi-SGBD: SQL Server, MySQL, PostgreSQL y Oracle mediante providers drop-in (<code>dbms</code>: <code>mssql</code> | <code>mysql</code> | <code>postgresql</code> | <code>oracle</code>).</li></ul><h2>First Steps — Arranque del entorno dev</h2><p>El stack WUIC está compuesto por varios servicios. Arráncalos en el orden indicado.</p><h3>Prerrequisitos</h3><table><thead><tr><th>Qué</th><th>Verificación</th><th>Notas</th></tr></thead><tbody><tr><td>.NET 10 SDK</td><td><code>dotnet --version</code></td><td>Hosting Bundle para IIS en producción</td></tr><tr><td>Node.js 22 LTS</td><td><code>node --version</code></td><td>La 22 es la version con la que se prueba el paquete; con npm 10.9.x la instalacion funciona gracias al <code>package-lock.json</code> incluido</td></tr><tr><td>PowerShell 5.1+</td><td><code>$PSVersionTable.PSVersion</code></td><td>El Windows PowerShell preinstalado es suficiente: <code>rename-project.ps1</code> y los scripts <code>llm-workspace/</code> tambien funcionan en 5.1. PowerShell 7 es recomendable, no obligatorio</td></tr><tr><td>SQL Server 2019+</td><td><code>sqlcmd -S localhost\\sqlexpress -E -C -Q &quot;SELECT 1&quot;</code></td><td>Si falta, <strong>la línea única lo instala por su cuenta</strong> (SQL Server Express, o el motor elegido con <code>-Dbms</code>); en Windows Server no, ver el recuadro de abajo. 2019 basta para los paquetes sin <code>.bak</code>; el tutorial <code>.bak</code> es una copia de SQL Server 2022 y requiere <strong>2022 o superior</strong></td></tr><tr><td>Linux (instalador <code>install.sh</code>)</td><td><code>lsb_release -ds</code></td><td><strong>Ubuntu 22.04 o 24.04 LTS</strong> (24.04 recomendada): son las unicas versiones de Ubuntu que Microsoft soporta para SQL Server, la <strong>26.04 no esta soportada</strong> (<a href=\"https://learn.microsoft.com/en-us/sql/linux/sql-server-linux-setup?view=sql-server-ver17\" target=\"_blank\" rel=\"noopener noreferrer\">Supported platforms</a>). Misma recomendacion con MySQL, PostgreSQL y Oracle, porque el instalador esta probado en esas versiones</td></tr><tr><td>GPU NVIDIA (CUDA 12.x + cuDNN 9)</td><td><code>nvidia-smi</code></td><td>Opcional: acelera el RAG Chatbot (sin GPU funciona en CPU)</td></tr></tbody></table><p>&gt; <strong>En Windows Server la base de datos debe instalarse antes.</strong> La linea unica obtiene los</p><p>&gt; componentes que faltan mediante <code>winget</code>, que no esta presente en Windows Server: sin una</p><p>&gt; instancia ya accesible la instalacion se detiene con `No SQL Server instance reachable and</p><p>&gt; winget is missing`. Instala el motor antes de ejecutar la linea - SQL Server debe ser **2019 o</p><p>&gt; superior<strong> (Express es suficiente; </strong>2022 o superior** para el tutorial <code>.bak</code>), y una 2017 no</p><p>&gt; se acepta. Si la instancia no es la predeterminada, pasala con</p><p>&gt; <code>-SqlServer &#39;localhost\\NOMBREINSTANCIA&#39;</code>. Vale para todos los motores, no solo SQL Server.</p><h3>1. Descarga el template de proyecto</h3><p>En Windows una sola linea de PowerShell lo hace todo: descarga el paquete, comprueba el SDK de .NET 10</p><p>y Node.js 22 (instalando lo que falte), ejecuta <code>dotnet restore</code> y <code>npm install</code>,</p><p>e instala la extension WUIC Assistant en VS Code.</p><p>Snippet 1:</p><p>Opciones útiles en la misma línea: <code>-Dbms mysql</code> (o <code>postgres</code>, <code>oracle</code>) para un motor</p><p>distinto de SQL Server — el instalador lo instala y lo configura él mismo — y <code>-WithTutorial</code></p><p>para descargar también la base de datos de ejemplo.</p><p>Cuando termina, la última pantalla ya es tu lista de tareas:</p><p>Snippet 2:</p><p>La cadena de conexión ya está lista: en el primer arranque el wizard no pide nada más. Con</p><p><code>-Dbms mysql</code> o <code>-Dbms postgres</code> esa línea cambia en consecuencia y lleva dentro usuario y</p><p>contraseña, porque la contraseña del superusuario <strong>la genera el instalador</strong>; esa misma</p><p>contraseña se guarda en <code>wuic-secrets.json</code>, junto a la instalación, y es el único sitio donde</p><p>queda escrita.</p><p>La via manual sigue siendo valida, en cualquier sistema:</p><p>Parte del paquete <code>WuicTest-src-*.zip</code> (enlace en la sección <strong>Download</strong> del sitio).</p><p>Extráelo en una carpeta de trabajo, p. ej. <code>C:\\dev\\WuicTest</code> (los archivos van directamente</p><p>en la raíz, NO dentro de una subcarpeta <code>src/</code>). El paquete contiene:</p><ul><li><code>WuicTest.csproj</code> → proyecto host con <code>&lt;PackageReference Include=&quot;WuicCore&quot; Version=&quot;...&quot; /&gt;</code></li><li><code>wwwroot/</code> → app Angular cuyo <code>package.json</code> referencia <code>wuic-framework-lib</code> desde el registry npm</li><li><code>appsettings.json</code> preconfigurado en modo <code>firstRun = &quot;true&quot;</code> con placeholders <code>__SET_*__</code></li><li><code>appsettings-samples/</code> → 6 templates listos (<code>mssql</code>/<code>mysql</code>, firstRun/post-firstRun, <code>Development</code>)</li></ul><p>&gt; <strong>No hace falta clonar el repositorio del framework</strong>: <code>WuicCore</code> llega como paquete NuGet</p><p>&gt; desde <code>nuget.org</code> y <code>wuic-framework-lib</code> como paquete npm desde el registry npm. El código</p><p>&gt; fuente del framework solo se necesita si quieres modificarlo — típicamente no es tu caso.</p><p>&gt; <strong>npm 10.9.x y los paquetes anteriores a 1.7.1</strong>: esos paquetes no incluyen <code>package-lock.json</code>, y</p><p>&gt; sin lock npm 10.9.x (la version que instala Node 22 LTS) se detiene con</p><p>&gt; <code>Cannot read properties of null (reading &#39;edgesOut&#39;)</code> al resolver las dependencias peer.</p><p>&gt; Descarga el lock publicado junto a la release —</p><p>&gt; <code>https://wuic-framework.com/downloads/locks/&lt;nombre-del-zip&gt;.package-lock.json</code> — colocalo en</p><p>&gt; <code>wwwroot/</code> y ejecuta <code>npm install</code> otra vez. La linea unica <code>-Src</code> lo hace por ti.</p><h3>2. Database</h3><p>Hace falta una instancia del motor accesible. <strong>Con la línea única no hay nada que hacer</strong>:</p><p>la instala y la configura ella, y la cadena de conexión que hay que pegar en el wizard es lo</p><p>último que imprime. En la vía manual la instancia debe existir ya.</p><p>Conexiones en <code>appsettings.json</code>:</p><ul><li><code>MetaDataSQLConnection</code> — DB metadata (menú, tablas, columnas, boards, usuarios)</li><li><code>DataSQLConnection</code> — DB datos de la aplicación</li></ul><p>Si es la primera instalación (<code>AppSettings.firstRun = &quot;true&quot;</code> en el template),</p><p>el wizard de scaffolding en el primer arranque crea el esquema metadata y puebla el DB datos.</p><p>Ver la página <em>Scaffolding inicial</em> para el flujo guiado.</p><h3>3. Backend (.NET)</h3><p>Desde la raíz de la carpeta extraída (p. ej. <code>C:\\dev\\WuicTest</code>):</p><p>Snippet 3:</p><p>El backend expone las API en <code>http://localhost:5000</code>.</p><h3>4. Frontend (Angular)</h3><p>En una segunda shell, desde la subcarpeta <code>wwwroot/</code>:</p><p>Snippet 4:</p><p>El frontend está disponible en <code>http://localhost:4200</code>.</p><p>Login por defecto (post-firstRun): <code>admin</code> / <code>admin</code>.</p><h3>5. RAG Chatbot (opcional)</h3><p>El RAG Chatbot (<code>Administración &gt; RAG Chat</code>) se ejecuta **dentro del backend</p><p>.NET**: el motor de retrieval (<code>rag-engine/WuicRagEngine.dll</code>, ONNX Runtime</p><p>in-process) lo carga el backend cuando <code>AppSettings.rag-use-dotnet-engine</code> es</p><p><code>&quot;true&quot;</code> (valor por defecto en los paquetes de release). **Sin Python, sin</p><p>venv, ningún servidor separado que arrancar.**</p><p>La <strong>primera</strong> vez que se abre el chatbot (o al final del first-run) el</p><p>backend descarga por sí solo los modelos ONNX (<code>bge-m3</code> + reranker), el</p><p>tokenizer y el índice (~4,5 GB) desde <code>rag-engine-models-url</code> (por defecto</p><p><code>https://wuic-framework.com/rag-models</code>) en <code>rag-engine/artifacts/</code>. Solo hace</p><p>falta conexión a internet una vez; la descarga corre en segundo plano (1-5 min)</p><p>y llega una notificación in-app al inicio y al final. Mientras tanto el</p><p>componente muestra el estado <strong>RAG offline</strong> y el resto de la aplicación</p><p>funciona con normalidad.</p><p>Claves <code>AppSettings</code> relevantes (todas con valores por defecto listos):</p><ul><li><code>rag-use-dotnet-engine</code> = <code>true</code> — activa el motor .NET (<code>false</code> = fallback Python, ver abajo)</li><li><code>rag-engine-device</code> = <code>auto</code> — <code>auto</code> | <code>cuda</code> | <code>cpu</code>: con GPU NVIDIA (CUDA 12.x + cuDNN 9) ~1 s/consulta, en CPU ~15-25 s/consulta</li><li><code>rag-engine-profile</code> = <code>release</code> — <code>release</code> = fuentes del framework solo como firma; <code>internal</code> = índice completo</li><li><code>rag-engine-models-url</code> — origen de la descarga en el primer arranque</li><li><code>rag-engine-cuda-path</code> = (vacío) — carpeta de las DLL CUDA/cuDNN si no están instaladas a nivel de sistema</li></ul><p>Para el chat con LLM configura <code>rag-llm-provider</code> + <code>rag-llm-api-key</code> (Claude</p><p>vía Anthropic, o un modelo local vía Ollama con <code>rag-llm-base-url</code>). Sin</p><p>provider solo funciona la modalidad retrieval (búsqueda de snippets). Detalle</p><p>de las claves en la página <em>AppSettings</em>.</p><p>&gt; El stack histórico Python (<code>scripts/rag-setup.ps1</code> + <code>rag_server.py</code> en</p><p>&gt; <code>127.0.0.1:8765</code>) solo puede usarse como fallback con</p><p>&gt; <code>rag-use-dotnet-engine = &quot;false&quot;</code> y no se incluye en los paquetes de release.</p><h2>Resumen de servicios</h2><table><thead><tr><th>Servicio</th><th>Puerto</th><th>Obligatorio</th><th>Comando rápido</th></tr></thead><tbody><tr><td>SQL Server</td><td>1433</td><td>sí</td><td>(servicio Windows)</td></tr><tr><td>Backend .NET</td><td>5000</td><td>sí</td><td><code>dotnet watch ... run</code></td></tr><tr><td>Frontend Angular</td><td>4200</td><td>sí</td><td><code>npm run serve:dev</code></td></tr><tr><td>Engine RAG .NET (ONNX)</td><td>in-process</td><td>no</td><td>cargado por el backend en el primer chat</td></tr></tbody></table><h2>Quick Start — primer componente</h2><p>1. Configura el endpoint AsmxProxy.</p><p>2. Define route metadata y columnas.</p><p>3. Monta <code>wuic-data-source</code> + <code>wuic-data-repeater</code>.</p><p>Snippet 5:</p>",
21281
21281
  "codeSamples": [
21282
21282
  {
21283
21283
  "id": "code_1",
@@ -27985,7 +27985,7 @@ const frameworkDocsContent = {
27985
27985
  {
27986
27986
  "id": "overview",
27987
27987
  "title": "Overview",
27988
- "html": "<h1>Framework-Uebersicht</h1><p>WUIC Framework ist eine metadata-gesteuerte Plattform zum schnellen und konsistenten Erstellen von Business-Oberflaechen.</p><h2>Was ist enthalten</h2><ul><li>DataSource und DataRepeater zur Orchestrierung von Daten und Rendering.</li><li>Visuelle Archetypes (list, map, scheduler, chart, carousel).</li><li>Runtime-Designer fuer Dashboards und dynamische Templates.</li><li>Workflow-Designer/Runner fuer operative Prozesse.</li><li>RAG Chatbot zum Abfragen der Codebasis in natuerlicher Sprache.</li><li>Multi-DBMS: SQL Server, MySQL, PostgreSQL und Oracle ueber Drop-in-Provider (<code>dbms</code>: <code>mssql</code> | <code>mysql</code> | <code>postgresql</code> | <code>oracle</code>).</li></ul><h2>First Steps — Dev-Umgebung starten</h2><p>Der WUIC-Stack besteht aus mehreren Diensten. Starte sie in der angegebenen Reihenfolge.</p><h3>Voraussetzungen</h3><table><thead><tr><th>Was</th><th>Verifikation</th><th>Hinweise</th></tr></thead><tbody><tr><td>.NET 10 SDK</td><td><code>dotnet --version</code></td><td>Hosting Bundle fuer IIS in Produktion</td></tr><tr><td>Node.js 22 LTS</td><td><code>node --version</code></td><td>Mit 22 wird das Paket getestet; unter npm 10.9.x gelingt die Installation dank der mitgelieferten <code>package-lock.json</code></td></tr><tr><td>PowerShell 5.1+</td><td><code>$PSVersionTable.PSVersion</code></td><td>Die vorinstallierte Windows PowerShell genuegt: <code>rename-project.ps1</code> und die <code>llm-workspace/</code>-Skripte laufen auch unter 5.1. PowerShell 7 wird empfohlen, ist nicht erforderlich</td></tr><tr><td>SQL Server 2019+</td><td><code>sqlcmd -S localhost\\sqlexpress -E -C -Q &quot;SELECT 1&quot;</code></td><td>Fehlt er, <strong>installiert ihn der Einzeiler selbst</strong> (SQL Server Express, oder die mit <code>-Dbms</code> gewaehlte Engine); auf Windows Server nicht, siehe Kasten unten. 2019 reicht fuer die Pakete ohne <code>.bak</code>; das <code>.bak</code>-Tutorial ist ein SQL Server 2022-Backup und benoetigt <strong>2022 oder neuer</strong></td></tr><tr><td>NVIDIA-GPU (CUDA 12.x + cuDNN 9)</td><td><code>nvidia-smi</code></td><td>Optional: beschleunigt den RAG Chatbot (ohne GPU laeuft er auf CPU)</td></tr></tbody></table><p>&gt; <strong>Auf Windows Server muss die Datenbank vorher installiert werden.</strong> Der Einzeiler beschafft</p><p>&gt; fehlende Komponenten ueber <code>winget</code>, das auf Windows Server nicht vorhanden ist: ohne eine</p><p>&gt; bereits erreichbare Instanz bricht die Installation mit `No SQL Server instance reachable and</p><p>&gt; winget is missing` ab. Installiere die Engine also vor dem Ausfuehren der Zeile - SQL Server</p><p>&gt; muss <strong>2019 oder neuer</strong> sein (Express genuegt; <strong>2022 oder neuer</strong> fuer das <code>.bak</code>-Tutorial),</p><p>&gt; eine 2017 wird nicht akzeptiert. Ist es nicht die Standardinstanz, uebergib sie mit</p><p>&gt; <code>-SqlServer &#39;localhost\\INSTANZNAME&#39;</code>. Das gilt fuer alle Engines, nicht nur SQL Server.</p><h3>1. Projekt-Template herunterladen</h3><p>Unter Windows erledigt eine PowerShell-Zeile alles: sie laedt das Paket, prueft .NET SDK 10</p><p>und Node.js 22 (und installiert, was fehlt), fuehrt <code>dotnet restore</code> und <code>npm install</code> aus</p><p>und installiert die Erweiterung WUIC Assistant in VS Code.</p><p>Snippet 1:</p><p>Nuetzliche Optionen auf derselben Zeile: <code>-Dbms mysql</code> (oder <code>postgres</code>, <code>oracle</code>) fuer eine</p><p>andere Engine als SQL Server — der Installer installiert und konfiguriert sie selbst — und</p><p><code>-WithTutorial</code>, um auch die Beispieldatenbank herunterzuladen.</p><p>Wenn er fertig ist, ist der letzte Bildschirm bereits die Aufgabenliste:</p><p>Snippet 2:</p><p>Die Verbindungszeichenfolge ist fertig: beim ersten Start fragt der Wizard nach nichts</p><p>weiterem. Mit <code>-Dbms mysql</code> oder <code>-Dbms postgres</code> aendert sich diese Zeile entsprechend und</p><p>traegt Benutzer und Passwort in sich, denn das Superuser-Passwort <strong>erzeugt der Installer</strong>;</p><p>dasselbe Passwort wird in <code>wuic-secrets.json</code> neben der Installation gespeichert, und das ist</p><p>der einzige Ort, an dem es geschrieben bleibt.</p><p>Der manuelle Weg bleibt gueltig, auf jedem System:</p><p>Starten Sie mit dem Paket <code>WuicTest-src-*.zip</code> (Link im <strong>Download</strong>-Bereich der Website).</p><p>Entpacken Sie es in einen Arbeitsordner, z.B. <code>C:\\dev\\WuicTest</code> (die Dateien kommen direkt</p><p>in den Root, NICHT in einen <code>src/</code>-Unterordner). Das Paket enthaelt:</p><ul><li><code>WuicTest.csproj</code> → Host-Projekt mit <code>&lt;PackageReference Include=&quot;WuicCore&quot; Version=&quot;...&quot; /&gt;</code></li><li><code>wwwroot/</code> → Angular-App, deren <code>package.json</code> <code>wuic-framework-lib</code> aus der npm-Registry referenziert</li><li><code>appsettings.json</code> vorkonfiguriert im <code>firstRun = &quot;true&quot;</code>-Modus mit <code>__SET_*__</code>-Platzhaltern</li><li><code>appsettings-samples/</code> → 6 fertige Templates (<code>mssql</code>/<code>mysql</code>, firstRun/post-firstRun, <code>Development</code>)</li></ul><p>&gt; <strong>Kein Klonen des Framework-Repositories noetig</strong>: <code>WuicCore</code> kommt als NuGet-Paket von</p><p>&gt; <code>nuget.org</code> und <code>wuic-framework-lib</code> als npm-Paket aus der npm-Registry. Der Framework-</p><p>&gt; Quellcode wird nur benoetigt, wenn Sie ihn modifizieren wollen — typischerweise nicht Ihr Fall.</p><p>&gt; <strong>npm 10.9.x und Pakete aelter als 1.7.1</strong>: diese Pakete enthalten keine <code>package-lock.json</code>, und</p><p>&gt; ohne Lock bricht npm 10.9.x (die Version, die Node 22 LTS mitbringt) mit</p><p>&gt; <code>Cannot read properties of null (reading &#39;edgesOut&#39;)</code> bei der Peer-Aufloesung ab.</p><p>&gt; Laden Sie den neben der Release veroeffentlichten Lock herunter —</p><p>&gt; <code>https://wuic-framework.com/downloads/locks/&lt;zip-name&gt;.package-lock.json</code> — legen Sie ihn in</p><p>&gt; <code>wwwroot/</code> und starten Sie <code>npm install</code> erneut. Der <code>-Src</code>-Einzeiler erledigt das selbst.</p><h3>2. Datenbank</h3><p>Es braucht eine erreichbare Instanz der Engine. <strong>Mit dem Einzeiler ist nichts zu tun</strong>: er</p><p>installiert und konfiguriert die Instanz, und die Verbindungszeichenfolge zum Einfuegen in den</p><p>Wizard ist das Letzte, was er ausgibt. Auf dem manuellen Weg muss die Instanz bereits</p><p>vorhanden sein.</p><p>Verbindungen in <code>appsettings.json</code>:</p><ul><li><code>MetaDataSQLConnection</code> — Metadata-DB (Menue, Tabellen, Spalten, Board, Benutzer)</li><li><code>DataSQLConnection</code> — Anwendungsdaten-DB</li></ul><p>Bei Erstinstallation (<code>AppSettings.firstRun = &quot;true&quot;</code> im Template) erstellt der Scaffolding-</p><p>Wizard beim ersten Start das Metadata-Schema und befuellt die Daten-DB.</p><p>Siehe Seite <em>Initial Scaffolding</em> fuer den gefuehrten Flow.</p><h3>3. Backend (.NET)</h3><p>Aus dem Root des entpackten Ordners (z.B. <code>C:\\dev\\WuicTest</code>):</p><p>Snippet 3:</p><p>Das Backend stellt die APIs auf <code>http://localhost:5000</code> bereit.</p><h3>4. Frontend (Angular)</h3><p>In einer zweiten Shell, aus dem Unterordner <code>wwwroot/</code>:</p><p>Snippet 4:</p><p>Das Frontend ist auf <code>http://localhost:4200</code> verfuegbar.</p><p>Standard-Login (post-firstRun): <code>admin</code> / <code>admin</code>.</p><h3>5. RAG Chatbot (optional)</h3><p>Der RAG Chatbot (<code>Amministrazione &gt; RAG Chat</code>) laeuft <strong>im .NET-Backend</strong>: die</p><p>Retrieval-Engine (<code>rag-engine/WuicRagEngine.dll</code>, ONNX Runtime in-process) wird</p><p>vom Backend geladen, wenn <code>AppSettings.rag-use-dotnet-engine</code> auf <code>&quot;true&quot;</code></p><p>steht (Default in den Release-Paketen). **Kein Python, keine venv, kein</p><p>separater Server, der gestartet werden muss.**</p><p>Beim <strong>ersten</strong> Oeffnen des Chatbots (oder am Ende des First-Run) laedt das</p><p>Backend selbststaendig die ONNX-Modelle (<code>bge-m3</code> + Reranker), den Tokenizer</p><p>und den Index (~4,5 GB) von <code>rag-engine-models-url</code> (Default</p><p><code>https://wuic-framework.com/rag-models</code>) nach <code>rag-engine/artifacts/</code>. Eine</p><p>Internetverbindung wird nur einmal benoetigt; der Download laeuft im</p><p>Hintergrund (1-5 Min.) und eine In-App-Benachrichtigung erscheint zu Beginn</p><p>und am Ende. Solange zeigt die Komponente den Status <strong>RAG offline</strong>, der Rest</p><p>der Anwendung funktioniert normal.</p><p>Relevante <code>AppSettings</code>-Schluessel (alle mit fertigen Defaults):</p><ul><li><code>rag-use-dotnet-engine</code> = <code>true</code> — aktiviert die .NET-Engine (<code>false</code> = Python-Fallback, siehe unten)</li><li><code>rag-engine-device</code> = <code>auto</code> — <code>auto</code> | <code>cuda</code> | <code>cpu</code>: mit NVIDIA-GPU (CUDA 12.x + cuDNN 9) ~1 s/Abfrage, auf CPU ~15-25 s/Abfrage</li><li><code>rag-engine-profile</code> = <code>release</code> — <code>release</code> = Framework-Quellen nur als Signatur; <code>internal</code> = vollstaendiger Index</li><li><code>rag-engine-models-url</code> — Download-Quelle beim ersten Start</li><li><code>rag-engine-cuda-path</code> = (leer) — Ordner der CUDA/cuDNN-DLLs, falls nicht systemweit installiert</li></ul><p>Fuer den Chat mit LLM <code>rag-llm-provider</code> + <code>rag-llm-api-key</code> setzen (Claude</p><p>via Anthropic oder ein lokales Modell via Ollama mit <code>rag-llm-base-url</code>). Ohne</p><p>Provider funktioniert nur der Retrieval-Modus (Snippet-Suche). Details zu den</p><p>Schluesseln auf der Seite <em>AppSettings</em>.</p><p>&gt; Der historische Python-Stack (<code>scripts/rag-setup.ps1</code> + <code>rag_server.py</code> auf</p><p>&gt; <code>127.0.0.1:8765</code>) ist nur als Fallback mit <code>rag-use-dotnet-engine = &quot;false&quot;</code></p><p>&gt; nutzbar und ist in den Release-Paketen nicht enthalten.</p><h2>Dienste-Zusammenfassung</h2><table><thead><tr><th>Dienst</th><th>Port</th><th>Erforderlich</th><th>Schnellbefehl</th></tr></thead><tbody><tr><td>SQL Server</td><td>1433</td><td>ja</td><td>(Windows-Dienst)</td></tr><tr><td>Backend .NET</td><td>5000</td><td>ja</td><td><code>dotnet watch ... run</code></td></tr><tr><td>Frontend Angular</td><td>4200</td><td>ja</td><td><code>npm run serve:dev</code></td></tr><tr><td>RAG-Engine .NET (ONNX)</td><td>in-process</td><td>nein</td><td>wird vom Backend beim ersten Chat geladen</td></tr></tbody></table><h2>Quick Start — erste Komponente</h2><p>1. AsmxProxy-Endpoint konfigurieren.</p><p>2. Route-Metadata und Spalten definieren.</p><p>3. <code>wuic-data-source</code> + <code>wuic-data-repeater</code> montieren.</p><p>Snippet 5:</p>",
27988
+ "html": "<h1>Framework-Uebersicht</h1><p>WUIC Framework ist eine metadata-gesteuerte Plattform zum schnellen und konsistenten Erstellen von Business-Oberflaechen.</p><h2>Was ist enthalten</h2><ul><li>DataSource und DataRepeater zur Orchestrierung von Daten und Rendering.</li><li>Visuelle Archetypes (list, map, scheduler, chart, carousel).</li><li>Runtime-Designer fuer Dashboards und dynamische Templates.</li><li>Workflow-Designer/Runner fuer operative Prozesse.</li><li>RAG Chatbot zum Abfragen der Codebasis in natuerlicher Sprache.</li><li>Multi-DBMS: SQL Server, MySQL, PostgreSQL und Oracle ueber Drop-in-Provider (<code>dbms</code>: <code>mssql</code> | <code>mysql</code> | <code>postgresql</code> | <code>oracle</code>).</li></ul><h2>First Steps — Dev-Umgebung starten</h2><p>Der WUIC-Stack besteht aus mehreren Diensten. Starte sie in der angegebenen Reihenfolge.</p><h3>Voraussetzungen</h3><table><thead><tr><th>Was</th><th>Verifikation</th><th>Hinweise</th></tr></thead><tbody><tr><td>.NET 10 SDK</td><td><code>dotnet --version</code></td><td>Hosting Bundle fuer IIS in Produktion</td></tr><tr><td>Node.js 22 LTS</td><td><code>node --version</code></td><td>Mit 22 wird das Paket getestet; unter npm 10.9.x gelingt die Installation dank der mitgelieferten <code>package-lock.json</code></td></tr><tr><td>PowerShell 5.1+</td><td><code>$PSVersionTable.PSVersion</code></td><td>Die vorinstallierte Windows PowerShell genuegt: <code>rename-project.ps1</code> und die <code>llm-workspace/</code>-Skripte laufen auch unter 5.1. PowerShell 7 wird empfohlen, ist nicht erforderlich</td></tr><tr><td>SQL Server 2019+</td><td><code>sqlcmd -S localhost\\sqlexpress -E -C -Q &quot;SELECT 1&quot;</code></td><td>Fehlt er, <strong>installiert ihn der Einzeiler selbst</strong> (SQL Server Express, oder die mit <code>-Dbms</code> gewaehlte Engine); auf Windows Server nicht, siehe Kasten unten. 2019 reicht fuer die Pakete ohne <code>.bak</code>; das <code>.bak</code>-Tutorial ist ein SQL Server 2022-Backup und benoetigt <strong>2022 oder neuer</strong></td></tr><tr><td>Linux (Installer <code>install.sh</code>)</td><td><code>lsb_release -ds</code></td><td><strong>Ubuntu 22.04 oder 24.04 LTS</strong> (24.04 empfohlen): nur diese Ubuntu-Versionen werden von Microsoft fuer SQL Server unterstuetzt, die <strong>26.04 wird nicht unterstuetzt</strong> (<a href=\"https://learn.microsoft.com/en-us/sql/linux/sql-server-linux-setup?view=sql-server-ver17\" target=\"_blank\" rel=\"noopener noreferrer\">Supported platforms</a>). Gleiche Empfehlung mit MySQL, PostgreSQL und Oracle, da der Installer auf diesen Versionen getestet ist</td></tr><tr><td>NVIDIA-GPU (CUDA 12.x + cuDNN 9)</td><td><code>nvidia-smi</code></td><td>Optional: beschleunigt den RAG Chatbot (ohne GPU laeuft er auf CPU)</td></tr></tbody></table><p>&gt; <strong>Auf Windows Server muss die Datenbank vorher installiert werden.</strong> Der Einzeiler beschafft</p><p>&gt; fehlende Komponenten ueber <code>winget</code>, das auf Windows Server nicht vorhanden ist: ohne eine</p><p>&gt; bereits erreichbare Instanz bricht die Installation mit `No SQL Server instance reachable and</p><p>&gt; winget is missing` ab. Installiere die Engine also vor dem Ausfuehren der Zeile - SQL Server</p><p>&gt; muss <strong>2019 oder neuer</strong> sein (Express genuegt; <strong>2022 oder neuer</strong> fuer das <code>.bak</code>-Tutorial),</p><p>&gt; eine 2017 wird nicht akzeptiert. Ist es nicht die Standardinstanz, uebergib sie mit</p><p>&gt; <code>-SqlServer &#39;localhost\\INSTANZNAME&#39;</code>. Das gilt fuer alle Engines, nicht nur SQL Server.</p><h3>1. Projekt-Template herunterladen</h3><p>Unter Windows erledigt eine PowerShell-Zeile alles: sie laedt das Paket, prueft .NET SDK 10</p><p>und Node.js 22 (und installiert, was fehlt), fuehrt <code>dotnet restore</code> und <code>npm install</code> aus</p><p>und installiert die Erweiterung WUIC Assistant in VS Code.</p><p>Snippet 1:</p><p>Nuetzliche Optionen auf derselben Zeile: <code>-Dbms mysql</code> (oder <code>postgres</code>, <code>oracle</code>) fuer eine</p><p>andere Engine als SQL Server — der Installer installiert und konfiguriert sie selbst — und</p><p><code>-WithTutorial</code>, um auch die Beispieldatenbank herunterzuladen.</p><p>Wenn er fertig ist, ist der letzte Bildschirm bereits die Aufgabenliste:</p><p>Snippet 2:</p><p>Die Verbindungszeichenfolge ist fertig: beim ersten Start fragt der Wizard nach nichts</p><p>weiterem. Mit <code>-Dbms mysql</code> oder <code>-Dbms postgres</code> aendert sich diese Zeile entsprechend und</p><p>traegt Benutzer und Passwort in sich, denn das Superuser-Passwort <strong>erzeugt der Installer</strong>;</p><p>dasselbe Passwort wird in <code>wuic-secrets.json</code> neben der Installation gespeichert, und das ist</p><p>der einzige Ort, an dem es geschrieben bleibt.</p><p>Der manuelle Weg bleibt gueltig, auf jedem System:</p><p>Starten Sie mit dem Paket <code>WuicTest-src-*.zip</code> (Link im <strong>Download</strong>-Bereich der Website).</p><p>Entpacken Sie es in einen Arbeitsordner, z.B. <code>C:\\dev\\WuicTest</code> (die Dateien kommen direkt</p><p>in den Root, NICHT in einen <code>src/</code>-Unterordner). Das Paket enthaelt:</p><ul><li><code>WuicTest.csproj</code> → Host-Projekt mit <code>&lt;PackageReference Include=&quot;WuicCore&quot; Version=&quot;...&quot; /&gt;</code></li><li><code>wwwroot/</code> → Angular-App, deren <code>package.json</code> <code>wuic-framework-lib</code> aus der npm-Registry referenziert</li><li><code>appsettings.json</code> vorkonfiguriert im <code>firstRun = &quot;true&quot;</code>-Modus mit <code>__SET_*__</code>-Platzhaltern</li><li><code>appsettings-samples/</code> → 6 fertige Templates (<code>mssql</code>/<code>mysql</code>, firstRun/post-firstRun, <code>Development</code>)</li></ul><p>&gt; <strong>Kein Klonen des Framework-Repositories noetig</strong>: <code>WuicCore</code> kommt als NuGet-Paket von</p><p>&gt; <code>nuget.org</code> und <code>wuic-framework-lib</code> als npm-Paket aus der npm-Registry. Der Framework-</p><p>&gt; Quellcode wird nur benoetigt, wenn Sie ihn modifizieren wollen — typischerweise nicht Ihr Fall.</p><p>&gt; <strong>npm 10.9.x und Pakete aelter als 1.7.1</strong>: diese Pakete enthalten keine <code>package-lock.json</code>, und</p><p>&gt; ohne Lock bricht npm 10.9.x (die Version, die Node 22 LTS mitbringt) mit</p><p>&gt; <code>Cannot read properties of null (reading &#39;edgesOut&#39;)</code> bei der Peer-Aufloesung ab.</p><p>&gt; Laden Sie den neben der Release veroeffentlichten Lock herunter —</p><p>&gt; <code>https://wuic-framework.com/downloads/locks/&lt;zip-name&gt;.package-lock.json</code> — legen Sie ihn in</p><p>&gt; <code>wwwroot/</code> und starten Sie <code>npm install</code> erneut. Der <code>-Src</code>-Einzeiler erledigt das selbst.</p><h3>2. Datenbank</h3><p>Es braucht eine erreichbare Instanz der Engine. <strong>Mit dem Einzeiler ist nichts zu tun</strong>: er</p><p>installiert und konfiguriert die Instanz, und die Verbindungszeichenfolge zum Einfuegen in den</p><p>Wizard ist das Letzte, was er ausgibt. Auf dem manuellen Weg muss die Instanz bereits</p><p>vorhanden sein.</p><p>Verbindungen in <code>appsettings.json</code>:</p><ul><li><code>MetaDataSQLConnection</code> — Metadata-DB (Menue, Tabellen, Spalten, Board, Benutzer)</li><li><code>DataSQLConnection</code> — Anwendungsdaten-DB</li></ul><p>Bei Erstinstallation (<code>AppSettings.firstRun = &quot;true&quot;</code> im Template) erstellt der Scaffolding-</p><p>Wizard beim ersten Start das Metadata-Schema und befuellt die Daten-DB.</p><p>Siehe Seite <em>Initial Scaffolding</em> fuer den gefuehrten Flow.</p><h3>3. Backend (.NET)</h3><p>Aus dem Root des entpackten Ordners (z.B. <code>C:\\dev\\WuicTest</code>):</p><p>Snippet 3:</p><p>Das Backend stellt die APIs auf <code>http://localhost:5000</code> bereit.</p><h3>4. Frontend (Angular)</h3><p>In einer zweiten Shell, aus dem Unterordner <code>wwwroot/</code>:</p><p>Snippet 4:</p><p>Das Frontend ist auf <code>http://localhost:4200</code> verfuegbar.</p><p>Standard-Login (post-firstRun): <code>admin</code> / <code>admin</code>.</p><h3>5. RAG Chatbot (optional)</h3><p>Der RAG Chatbot (<code>Amministrazione &gt; RAG Chat</code>) laeuft <strong>im .NET-Backend</strong>: die</p><p>Retrieval-Engine (<code>rag-engine/WuicRagEngine.dll</code>, ONNX Runtime in-process) wird</p><p>vom Backend geladen, wenn <code>AppSettings.rag-use-dotnet-engine</code> auf <code>&quot;true&quot;</code></p><p>steht (Default in den Release-Paketen). **Kein Python, keine venv, kein</p><p>separater Server, der gestartet werden muss.**</p><p>Beim <strong>ersten</strong> Oeffnen des Chatbots (oder am Ende des First-Run) laedt das</p><p>Backend selbststaendig die ONNX-Modelle (<code>bge-m3</code> + Reranker), den Tokenizer</p><p>und den Index (~4,5 GB) von <code>rag-engine-models-url</code> (Default</p><p><code>https://wuic-framework.com/rag-models</code>) nach <code>rag-engine/artifacts/</code>. Eine</p><p>Internetverbindung wird nur einmal benoetigt; der Download laeuft im</p><p>Hintergrund (1-5 Min.) und eine In-App-Benachrichtigung erscheint zu Beginn</p><p>und am Ende. Solange zeigt die Komponente den Status <strong>RAG offline</strong>, der Rest</p><p>der Anwendung funktioniert normal.</p><p>Relevante <code>AppSettings</code>-Schluessel (alle mit fertigen Defaults):</p><ul><li><code>rag-use-dotnet-engine</code> = <code>true</code> — aktiviert die .NET-Engine (<code>false</code> = Python-Fallback, siehe unten)</li><li><code>rag-engine-device</code> = <code>auto</code> — <code>auto</code> | <code>cuda</code> | <code>cpu</code>: mit NVIDIA-GPU (CUDA 12.x + cuDNN 9) ~1 s/Abfrage, auf CPU ~15-25 s/Abfrage</li><li><code>rag-engine-profile</code> = <code>release</code> — <code>release</code> = Framework-Quellen nur als Signatur; <code>internal</code> = vollstaendiger Index</li><li><code>rag-engine-models-url</code> — Download-Quelle beim ersten Start</li><li><code>rag-engine-cuda-path</code> = (leer) — Ordner der CUDA/cuDNN-DLLs, falls nicht systemweit installiert</li></ul><p>Fuer den Chat mit LLM <code>rag-llm-provider</code> + <code>rag-llm-api-key</code> setzen (Claude</p><p>via Anthropic oder ein lokales Modell via Ollama mit <code>rag-llm-base-url</code>). Ohne</p><p>Provider funktioniert nur der Retrieval-Modus (Snippet-Suche). Details zu den</p><p>Schluesseln auf der Seite <em>AppSettings</em>.</p><p>&gt; Der historische Python-Stack (<code>scripts/rag-setup.ps1</code> + <code>rag_server.py</code> auf</p><p>&gt; <code>127.0.0.1:8765</code>) ist nur als Fallback mit <code>rag-use-dotnet-engine = &quot;false&quot;</code></p><p>&gt; nutzbar und ist in den Release-Paketen nicht enthalten.</p><h2>Dienste-Zusammenfassung</h2><table><thead><tr><th>Dienst</th><th>Port</th><th>Erforderlich</th><th>Schnellbefehl</th></tr></thead><tbody><tr><td>SQL Server</td><td>1433</td><td>ja</td><td>(Windows-Dienst)</td></tr><tr><td>Backend .NET</td><td>5000</td><td>ja</td><td><code>dotnet watch ... run</code></td></tr><tr><td>Frontend Angular</td><td>4200</td><td>ja</td><td><code>npm run serve:dev</code></td></tr><tr><td>RAG-Engine .NET (ONNX)</td><td>in-process</td><td>nein</td><td>wird vom Backend beim ersten Chat geladen</td></tr></tbody></table><h2>Quick Start — erste Komponente</h2><p>1. AsmxProxy-Endpoint konfigurieren.</p><p>2. Route-Metadata und Spalten definieren.</p><p>3. <code>wuic-data-source</code> + <code>wuic-data-repeater</code> montieren.</p><p>Snippet 5:</p>",
27989
27989
  "codeSamples": [
27990
27990
  {
27991
27991
  "id": "code_1",
@@ -35168,4 +35168,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
35168
35168
  }] } });
35169
35169
 
35170
35170
  export { FrameworkDocsComponent };
35171
- //# sourceMappingURL=wuic-framework-lib-framework-docs.component-CGsugPCx.mjs.map
35171
+ //# sourceMappingURL=wuic-framework-lib-framework-docs.component-CcyeNUzz.mjs.map
@@ -25,7 +25,7 @@ import { TableModule } from 'primeng/table';
25
25
  import { Tabs, TabList, Tab, TabPanels, TabPanel } from 'primeng/tabs';
26
26
  import * as i1$3 from '@materia-ui/ngx-monaco-editor';
27
27
  import { MonacoEditorModule } from '@materia-ui/ngx-monaco-editor';
28
- import { W as WtoolboxService, U as UserInfoService, T as TranslationManagerService, M as MetadataProviderService, h as DataProviderService, o as MetaInfo, g as MetadatiColonna, q as FilterInfo, G as GlobalHandler, m as WuicClientException, n as WuicErrorCodes, r as LicenseFeatureService, C as ChatbotHostRegistryService, b as DataSourceComponent, F as FilterBarComponent } from './wuic-framework-lib-wuic-framework-lib-81WUtxz8.mjs';
28
+ import { W as WtoolboxService, U as UserInfoService, T as TranslationManagerService, M as MetadataProviderService, h as DataProviderService, o as MetaInfo, g as MetadatiColonna, q as FilterInfo, G as GlobalHandler, m as WuicClientException, n as WuicErrorCodes, r as LicenseFeatureService, C as ChatbotHostRegistryService, b as DataSourceComponent, F as FilterBarComponent } from './wuic-framework-lib-wuic-framework-lib-54sySY_p.mjs';
29
29
  import * as i7 from 'primeng/tooltip';
30
30
  import { TooltipModule } from 'primeng/tooltip';
31
31
  import { ClassicPreset, NodeEditor } from 'rete';
@@ -4950,4 +4950,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
4950
4950
  }] } });
4951
4951
 
4952
4952
  export { PivotBuilderComponent };
4953
- //# sourceMappingURL=wuic-framework-lib-pivot-builder.component-S5zqy3vj.mjs.map
4953
+ //# sourceMappingURL=wuic-framework-lib-pivot-builder.component-BUkGGFaw.mjs.map
@@ -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 { f as ParametricDialogComponent } from './wuic-framework-lib-wuic-framework-lib-81WUtxz8.mjs';
5
+ import { f as ParametricDialogComponent } from './wuic-framework-lib-wuic-framework-lib-54sySY_p.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-VY-gtgRW.mjs.map
99
+ //# sourceMappingURL=wuic-framework-lib-prompt-dialog-fallback-host.component-DPapKCIE.mjs.map
@@ -1,6 +1,6 @@
1
1
  import * as i0 from '@angular/core';
2
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-81WUtxz8.mjs';
3
+ import { W as WtoolboxService, M as MetadataProviderService, C as ChatbotHostRegistryService } from './wuic-framework-lib-wuic-framework-lib-54sySY_p.mjs';
4
4
  import * as i4 from 'stimulsoft-designer-angular';
5
5
  import { StimulsoftDesignerModule, StimulsoftDesignerComponent } from 'stimulsoft-designer-angular';
6
6
  import * as i1 from '@angular/router';
@@ -377,4 +377,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
377
377
  }] } });
378
378
 
379
379
  export { ReportDesignerComponent };
380
- //# sourceMappingURL=wuic-framework-lib-report-designer.component-QRxxueU-.mjs.map
380
+ //# sourceMappingURL=wuic-framework-lib-report-designer.component-A6_tmp6z.mjs.map
@@ -13,7 +13,7 @@ import * as i6 from 'primeng/radiobutton';
13
13
  import { RadioButtonModule } from 'primeng/radiobutton';
14
14
  import * as i5$1 from 'primeng/select';
15
15
  import { SelectModule } from 'primeng/select';
16
- import { W as WtoolboxService } from './wuic-framework-lib-wuic-framework-lib-81WUtxz8.mjs';
16
+ import { W as WtoolboxService } from './wuic-framework-lib-wuic-framework-lib-54sySY_p.mjs';
17
17
  import * as i1 from 'primeng/dynamicdialog';
18
18
  import * as i1$1 from '@angular/common/http';
19
19
 
@@ -428,4 +428,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
428
428
  }], ctorParameters: () => [{ type: i1.DynamicDialogRef }, { type: i1.DynamicDialogConfig }, { type: i1$1.HttpClient }] });
429
429
 
430
430
  export { ReportScaffoldDialogComponent };
431
- //# sourceMappingURL=wuic-framework-lib-report-scaffold-dialog.component-OGdglGPw.mjs.map
431
+ //# sourceMappingURL=wuic-framework-lib-report-scaffold-dialog.component-Dbrx9bSq.mjs.map
@@ -5,7 +5,7 @@ import { NavigationEnd } from '@angular/router';
5
5
  import { CommonModule } from '@angular/common';
6
6
  import * as i3 from 'stimulsoft-viewer-angular';
7
7
  import { StimulsoftViewerModule, StimulsoftViewerComponent } from 'stimulsoft-viewer-angular';
8
- import { W as WtoolboxService } from './wuic-framework-lib-wuic-framework-lib-81WUtxz8.mjs';
8
+ import { W as WtoolboxService } from './wuic-framework-lib-wuic-framework-lib-54sySY_p.mjs';
9
9
  import { e as ensureWuicStimulsoftLicenseRegistered } from './wuic-framework-lib-stimulsoft-license.service-CsNNSFYs.mjs';
10
10
  import { firstValueFrom } from 'rxjs';
11
11
  import * as i1$1 from '@angular/common/http';
@@ -471,4 +471,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
471
471
  }] } });
472
472
 
473
473
  export { ReportViewerComponent };
474
- //# sourceMappingURL=wuic-framework-lib-report-viewer.component-CuXw3e0j.mjs.map
474
+ //# sourceMappingURL=wuic-framework-lib-report-viewer.component-CYl77DcU.mjs.map
@@ -18,7 +18,7 @@ import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js';
18
18
  import { OBJLoader } from 'three/examples/jsm/loaders/OBJLoader.js';
19
19
  import { STLLoader } from 'three/examples/jsm/loaders/STLLoader.js';
20
20
  import { i as isWebGpuSupported, d as defaultMeshRepeaterConfig, a as defaultRepeaterAxisDir, b as defaultCarouselConfig, c as defaultChartConfig, e as defaultSurfaceConfig, f as defaultGaugeConfig, g as defaultGraphConfig, h as defaultMapConfig, j as defaultWarehouseConfig, k as defaultKanbanConfig, l as defaultCalendarConfig, m as defaultStackedConfig, W as WUIC_TRANSIENT_FLAG, n as createScene3dRenderer, o as WUIC_SHADER_EFFECT_KEY, p as makeTextSpriteMesh, q as WUIC_MESH_REPEATER_KEY, r as addRepeaterPlaceholder, s as resolveAssetFormat, t as parseShaderEffect, S as SCENE3D_SHADER_EFFECT_DEFAULT, u as SCENE3D_SHADER_EFFECT_SCHEMA, v as buildEffectNodeMaterial, w as buildEffectShaderMaterial, x as getMeshRepeaterConfig, y as WUIC_REPEATER_CHILD, C as CarouselController, z as normalizeAssetToUnit, A as buildUploadTextureResolver, B as applyRepeaterTextureTo, D as defaultRepeaterTextureApply, E as regenerateRepeater, F as getPhysicsDef, G as createPhysicsWorld, H as WUIC_PHYSICS_KEY, I as WUIC_OBJECT_TYPE_KEY, J as carouselArrowDir, K as WUIC_REPEATER_RECORD, L as runRepeaterCallback, M as closeItemPopup, N as showItemPopup, O as WUIC_BINDING_KEY, P as swapNodeEffectMaterialsForSerialization, Q as serializeScene, R as deserializeScene } from './wuic-framework-lib-scene3d-shader-effect-gBEFKNvi.mjs';
21
- import { W as WtoolboxService, h as DataProviderService, M as MetadataProviderService, C as ChatbotHostRegistryService } from './wuic-framework-lib-wuic-framework-lib-81WUtxz8.mjs';
21
+ import { W as WtoolboxService, h as DataProviderService, M as MetadataProviderService, C as ChatbotHostRegistryService } from './wuic-framework-lib-wuic-framework-lib-54sySY_p.mjs';
22
22
  import * as i1 from '@angular/router';
23
23
  import * as i3 from 'primeng/api';
24
24
 
@@ -2323,7 +2323,7 @@ class Scene3dDesignerComponent {
2323
2323
  // triangle soup): ordini di grandezza piu' veloce del raycaster CPU
2324
2324
  // sulle scene dense. Fallback CPU trasparente su qualsiasi errore.
2325
2325
  try {
2326
- const { bakeVertexLightingGpu } = await import('./wuic-framework-lib-scene3d-light-baker-gpu-B5ywsrSp.mjs');
2326
+ const { bakeVertexLightingGpu } = await import('./wuic-framework-lib-scene3d-light-baker-gpu-DEGIR8lh.mjs');
2327
2327
  result = await bakeVertexLightingGpu(this.renderer, this.contentGroup, lights, bakeOptions);
2328
2328
  engine = 'gpu';
2329
2329
  }
@@ -4810,4 +4810,4 @@ var scene3dDesigner_component = /*#__PURE__*/Object.freeze({
4810
4810
  });
4811
4811
 
4812
4812
  export { WUIC_BAKED_FLAG as W, isBakeableMesh as i, scene3dDesigner_component as s };
4813
- //# sourceMappingURL=wuic-framework-lib-scene3d-designer.component-LhC0KzWO.mjs.map
4813
+ //# sourceMappingURL=wuic-framework-lib-scene3d-designer.component-DyVwOmXa.mjs.map
@@ -1,5 +1,5 @@
1
1
  import * as THREE from 'three';
2
- import { i as isBakeableMesh, W as WUIC_BAKED_FLAG } from './wuic-framework-lib-scene3d-designer.component-LhC0KzWO.mjs';
2
+ import { i as isBakeableMesh, W as WUIC_BAKED_FLAG } from './wuic-framework-lib-scene3d-designer.component-DyVwOmXa.mjs';
3
3
 
4
4
  /**
5
5
  * Lightmap baking su COMPUTE SHADER (WebGPU) — stessa semantica del baker CPU
@@ -300,4 +300,4 @@ function applyBakeResults(ranges, packedColors) {
300
300
  }
301
301
 
302
302
  export { bakeVertexLightingGpu };
303
- //# sourceMappingURL=wuic-framework-lib-scene3d-light-baker-gpu-B5ywsrSp.mjs.map
303
+ //# sourceMappingURL=wuic-framework-lib-scene3d-light-baker-gpu-DEGIR8lh.mjs.map
@@ -2,7 +2,7 @@ import * as i0 from '@angular/core';
2
2
  import { Input, ViewChild, ChangeDetectionStrategy, Component } from '@angular/core';
3
3
  import * as THREE from 'three';
4
4
  import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js';
5
- import { W as WtoolboxService, h as DataProviderService, M as MetadataProviderService } from './wuic-framework-lib-wuic-framework-lib-81WUtxz8.mjs';
5
+ import { W as WtoolboxService, h as DataProviderService, M as MetadataProviderService } from './wuic-framework-lib-wuic-framework-lib-54sySY_p.mjs';
6
6
  import { R as deserializeScene, i as isWebGpuSupported, n as createScene3dRenderer, o as WUIC_SHADER_EFFECT_KEY, t as parseShaderEffect, v as buildEffectNodeMaterial, w as buildEffectShaderMaterial, x as getMeshRepeaterConfig, E as regenerateRepeater, y as WUIC_REPEATER_CHILD, C as CarouselController, b as defaultCarouselConfig, A as buildUploadTextureResolver, p as makeTextSpriteMesh, s as resolveAssetFormat, z as normalizeAssetToUnit, B as applyRepeaterTextureTo, G as createPhysicsWorld, F as getPhysicsDef, O as WUIC_BINDING_KEY, J as carouselArrowDir, K as WUIC_REPEATER_RECORD, M as closeItemPopup, N as showItemPopup, L as runRepeaterCallback } from './wuic-framework-lib-scene3d-shader-effect-gBEFKNvi.mjs';
7
7
  import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js';
8
8
  import { OBJLoader } from 'three/examples/jsm/loaders/OBJLoader.js';
@@ -1127,4 +1127,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
1127
1127
  }] } });
1128
1128
 
1129
1129
  export { Scene3dViewerComponent };
1130
- //# sourceMappingURL=wuic-framework-lib-scene3d-viewer.component-DiDqJO-P.mjs.map
1130
+ //# sourceMappingURL=wuic-framework-lib-scene3d-viewer.component-G_ykpDDF.mjs.map
@@ -12,7 +12,7 @@ import interactionPlugin from '@fullcalendar/interaction';
12
12
  import timeGridPlugin from '@fullcalendar/timegrid';
13
13
  import * as i1 from '@angular/platform-browser';
14
14
  import { Title } from '@angular/platform-browser';
15
- import { W as WtoolboxService, f as ParametricDialogComponent, q as FilterInfo, s as FilterItem, M as MetadataProviderService, D as DynamicGenericTemplateComponent, T as TranslationManagerService } from './wuic-framework-lib-wuic-framework-lib-81WUtxz8.mjs';
15
+ import { W as WtoolboxService, f as ParametricDialogComponent, q as FilterInfo, s as FilterItem, M as MetadataProviderService, D as DynamicGenericTemplateComponent, T as TranslationManagerService } from './wuic-framework-lib-wuic-framework-lib-54sySY_p.mjs';
16
16
  import { BehaviorSubject } from 'rxjs';
17
17
 
18
18
  // https://fullcalendar.io/docs/initialize-globals#premium-bundle -
@@ -756,4 +756,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
756
756
  }] } });
757
757
 
758
758
  export { SchedulerListComponent };
759
- //# sourceMappingURL=wuic-framework-lib-scheduler-list.component-5JbxIBdp.mjs.map
759
+ //# sourceMappingURL=wuic-framework-lib-scheduler-list.component-C_1YjS3c.mjs.map
@@ -7,7 +7,7 @@ import * as i8 from '@ngx-translate/core';
7
7
  import { TranslateModule } from '@ngx-translate/core';
8
8
  import * as i7 from '@syncfusion/ej2-angular-spreadsheet';
9
9
  import { SpreadsheetModule } from '@syncfusion/ej2-angular-spreadsheet';
10
- import { W as WtoolboxService, M as MetadataProviderService, U as UserInfoService, b as DataSourceComponent, I as ImportExportButtonComponent } from './wuic-framework-lib-wuic-framework-lib-81WUtxz8.mjs';
10
+ import { W as WtoolboxService, M as MetadataProviderService, U as UserInfoService, b as DataSourceComponent, I as ImportExportButtonComponent } from './wuic-framework-lib-wuic-framework-lib-54sySY_p.mjs';
11
11
  import { registerLicense } from '@syncfusion/ej2-base';
12
12
  import * as i1 from '@angular/platform-browser';
13
13
  import * as i1$1 from '@angular/router';
@@ -4394,4 +4394,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
4394
4394
  }] } });
4395
4395
 
4396
4396
  export { SpreadsheetListSfComponent };
4397
- //# sourceMappingURL=wuic-framework-lib-spreadsheet-list-sf.component-Dxk5d9au.mjs.map
4397
+ //# sourceMappingURL=wuic-framework-lib-spreadsheet-list-sf.component-BKtu4edX.mjs.map
@@ -6,7 +6,7 @@ import { ButtonModule } from 'primeng/button';
6
6
  import * as i8 from '@ngx-translate/core';
7
7
  import { TranslateModule } from '@ngx-translate/core';
8
8
  import Gantt from 'frappe-gantt';
9
- import { u as TimelineOptions, g as MetadatiColonna, W as WtoolboxService, T as TranslationManagerService } from './wuic-framework-lib-wuic-framework-lib-81WUtxz8.mjs';
9
+ import { u as TimelineOptions, g as MetadatiColonna, W as WtoolboxService, T as TranslationManagerService } from './wuic-framework-lib-wuic-framework-lib-54sySY_p.mjs';
10
10
  import * as i1 from '@angular/router';
11
11
 
12
12
  /**
@@ -424,7 +424,7 @@ class TimelineListComponent {
424
424
  }
425
425
  try {
426
426
  ds.setCurrent(task.record);
427
- const { ParametricDialogComponent } = await import('./wuic-framework-lib-wuic-framework-lib-81WUtxz8.mjs').then(function (n) { return n.c9; });
427
+ const { ParametricDialogComponent } = await import('./wuic-framework-lib-wuic-framework-lib-54sySY_p.mjs').then(function (n) { return n.c9; });
428
428
  const header = `${this.t('timeline.popup.edit', 'Modifica')} ${this.metaInfo?.tableMetadata?.md_display_string || ''}`.trim();
429
429
  const ref = WtoolboxService.dialogService.open(ParametricDialogComponent, {
430
430
  data: {
@@ -477,7 +477,7 @@ class TimelineListComponent {
477
477
  // getModelFromObservable→setCurrent→getObservable e il valore torna null
478
478
  // al salvataggio (il chip resta visibile, ma il payload parte vuoto).
479
479
  const record = ds.addNewRecord(this.buildPredecessorPreset(task));
480
- const { ParametricDialogComponent } = await import('./wuic-framework-lib-wuic-framework-lib-81WUtxz8.mjs').then(function (n) { return n.c9; });
480
+ const { ParametricDialogComponent } = await import('./wuic-framework-lib-wuic-framework-lib-54sySY_p.mjs').then(function (n) { return n.c9; });
481
481
  const header = `${this.t('timeline.popup.add', 'Nuovo')} ${this.metaInfo?.tableMetadata?.md_display_string || ''}`.trim();
482
482
  const ref = WtoolboxService.dialogService.open(ParametricDialogComponent, {
483
483
  data: {
@@ -802,4 +802,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
802
802
  }] } });
803
803
 
804
804
  export { TimelineListComponent };
805
- //# sourceMappingURL=wuic-framework-lib-timeline-list.component-B1ro-16J.mjs.map
805
+ //# sourceMappingURL=wuic-framework-lib-timeline-list.component-Dcosb8Zx.mjs.map
@@ -23,7 +23,7 @@ import { TooltipModule } from 'primeng/tooltip';
23
23
  import * as i8 from '@ngx-translate/core';
24
24
  import { TranslateModule } from '@ngx-translate/core';
25
25
  import { BehaviorSubject } from 'rxjs';
26
- import { W as WtoolboxService, M as MetadataProviderService, f as ParametricDialogComponent, m as WuicClientException, n as WuicErrorCodes, G as GlobalHandler, h as DataProviderService, C as ChatbotHostRegistryService, b as DataSourceComponent, l as MetadataEditorComponent } from './wuic-framework-lib-wuic-framework-lib-81WUtxz8.mjs';
26
+ import { W as WtoolboxService, M as MetadataProviderService, f as ParametricDialogComponent, m as WuicClientException, n as WuicErrorCodes, G as GlobalHandler, h as DataProviderService, C as ChatbotHostRegistryService, b as DataSourceComponent, l as MetadataEditorComponent } from './wuic-framework-lib-wuic-framework-lib-54sySY_p.mjs';
27
27
 
28
28
  class WorkflowDesignerLayoutHelper {
29
29
  /**
@@ -9501,4 +9501,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
9501
9501
  }] } });
9502
9502
 
9503
9503
  export { WorkflowDesignerComponent };
9504
- //# sourceMappingURL=wuic-framework-lib-workflow-designer.component-D32ZMxq2.mjs.map
9504
+ //# sourceMappingURL=wuic-framework-lib-workflow-designer.component-BXnoS_ts.mjs.map
@@ -3340,7 +3340,7 @@ class WtoolboxService {
3340
3340
  const appRef = resolvedInjector.get(ApplicationRef);
3341
3341
  const environmentInjector = resolvedInjector.get(EnvironmentInjector);
3342
3342
  const close$ = new Subject();
3343
- const { PromptDialogFallbackHostComponent } = await import('./wuic-framework-lib-prompt-dialog-fallback-host.component-VY-gtgRW.mjs');
3343
+ const { PromptDialogFallbackHostComponent } = await import('./wuic-framework-lib-prompt-dialog-fallback-host.component-DPapKCIE.mjs');
3344
3344
  const hostRef = createComponent(PromptDialogFallbackHostComponent, { environmentInjector });
3345
3345
  hostRef.instance.datasource = dialogConfig?.data?.datasource;
3346
3346
  hostRef.instance.header = String(dialogConfig?.header || '');
@@ -24194,7 +24194,7 @@ class LazySchedulerListComponent {
24194
24194
  * Inizializza il componente preparando stato, sottoscrizioni e primi caricamenti richiesti.
24195
24195
  */
24196
24196
  async ngOnInit() {
24197
- schedulerListComponentPromise ??= import('./wuic-framework-lib-scheduler-list.component-5JbxIBdp.mjs').then((m) => m.SchedulerListComponent);
24197
+ schedulerListComponentPromise ??= import('./wuic-framework-lib-scheduler-list.component-C_1YjS3c.mjs').then((m) => m.SchedulerListComponent);
24198
24198
  this.loadedComponent = await schedulerListComponentPromise;
24199
24199
  this.cdr.markForCheck();
24200
24200
  }
@@ -24402,7 +24402,7 @@ class LazySpreadsheetListSfComponent {
24402
24402
  this.activatedRoute = activatedRoute;
24403
24403
  }
24404
24404
  async ngOnInit() {
24405
- spreadsheetListSfComponentPromise ??= import('./wuic-framework-lib-spreadsheet-list-sf.component-Dxk5d9au.mjs').then((m) => m.SpreadsheetListSfComponent);
24405
+ spreadsheetListSfComponentPromise ??= import('./wuic-framework-lib-spreadsheet-list-sf.component-BKtu4edX.mjs').then((m) => m.SpreadsheetListSfComponent);
24406
24406
  this.loadedComponent = await spreadsheetListSfComponentPromise;
24407
24407
  // Quando la promise e' gia' risolta dal cache module-scope (secondo mount
24408
24408
  // post-refresh), il microtask che risolve `await` non scatena sempre CD
@@ -24680,7 +24680,7 @@ class LazyChartListComponent {
24680
24680
  * Inizializza il componente preparando stato, sottoscrizioni e primi caricamenti richiesti.
24681
24681
  */
24682
24682
  async ngOnInit() {
24683
- chartListComponentPromise ??= import('./wuic-framework-lib-chart-list.component-MeAS47VV.mjs').then((m) => m.ChartListComponent);
24683
+ chartListComponentPromise ??= import('./wuic-framework-lib-chart-list.component-B7d2AQ3G.mjs').then((m) => m.ChartListComponent);
24684
24684
  this.loadedComponent = await chartListComponentPromise;
24685
24685
  this.cdr.markForCheck();
24686
24686
  }
@@ -25002,7 +25002,7 @@ class LazyTimelineListComponent {
25002
25002
  this.cdr = cdr;
25003
25003
  }
25004
25004
  async ngOnInit() {
25005
- timelineListComponentPromise ??= import('./wuic-framework-lib-timeline-list.component-B1ro-16J.mjs').then((m) => m.TimelineListComponent);
25005
+ timelineListComponentPromise ??= import('./wuic-framework-lib-timeline-list.component-Dcosb8Zx.mjs').then((m) => m.TimelineListComponent);
25006
25006
  this.loadedComponent = await timelineListComponentPromise;
25007
25007
  this.cdr.markForCheck();
25008
25008
  }
@@ -30688,7 +30688,7 @@ class MetadataEditorComponent {
30688
30688
  }
30689
30689
  let result;
30690
30690
  try {
30691
- const { ReportScaffoldDialogComponent } = await import('./wuic-framework-lib-report-scaffold-dialog.component-OGdglGPw.mjs');
30691
+ const { ReportScaffoldDialogComponent } = await import('./wuic-framework-lib-report-scaffold-dialog.component-Dbrx9bSq.mjs');
30692
30692
  WtoolboxService.resolveDialogServiceFromInjector();
30693
30693
  const ref = WtoolboxService.dialogService?.open?.(ReportScaffoldDialogComponent, {
30694
30694
  header: this.t('report.scaffold.dialog_title', 'Create report'),
@@ -41381,6 +41381,21 @@ class MapListComponent {
41381
41381
  const g = globalThis.google;
41382
41382
  return !!(g && g.maps && typeof g.maps.importLibrary === 'function');
41383
41383
  }
41384
+ /**
41385
+ * Il template monta `<google-map>` solo se questo e' vero.
41386
+ *
41387
+ * Serve un GETTER e non `!mapsApiUnavailable`: quel flag viene alzato dentro la
41388
+ * sottoscrizione al datasource, cioe' dopo che il template e' gia' stato valutato almeno
41389
+ * una volta. In quella finestra `<google-map>` di @angular/google-maps si costruiva e
41390
+ * lanciava `ReferenceError: google is not defined` dal suo codice interno; l'eccezione
41391
+ * risaliva al dialog di errore applicativo e bloccava l'intera UI, che e' proprio il guasto
41392
+ * che l'avviso in pagina doveva sostituire. Essendo un getter, la condizione viene rivalutata
41393
+ * a ogni ciclo di change detection: se lo script di Maps arriva piu' tardi, la mappa compare
41394
+ * da sola senza ricaricare.
41395
+ */
41396
+ get mapsApiReady() {
41397
+ return MapListComponent.isMapsApiAvailable();
41398
+ }
41384
41399
  MAP_LIB;
41385
41400
  /**
41386
41401
  * Proprieta di stato del componente per marker lib, usata dalla logica interna e dal template.
@@ -43518,11 +43533,11 @@ class MapListComponent {
43518
43533
  window.removeEventListener('scroll', this.onWindowScroll, true);
43519
43534
  }
43520
43535
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: MapListComponent, deps: [{ token: i1$5.Title }, { token: i0.ChangeDetectorRef }, { token: i1$2.ActivatedRoute }, { token: UserInfoService }, { token: TranslationManagerService }], target: i0.ɵɵFactoryTarget.Component });
43521
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: MapListComponent, isStandalone: true, selector: "wuic-map-list", inputs: { hardcodedRoute: "hardcodedRoute", parentRecord: "parentRecord", parentMetaInfo: "parentMetaInfo", datasource: "datasource", hardcodedDatasource: "hardcodedDatasource", hideToolbar: "hideToolbar" }, outputs: { onMapClick: "onMapClick", onMarkerDragStart: "onMarkerDragStart", onMarkerDragEnd: "onMarkerDragEnd", onMarkerClick: "onMarkerClick", onPolygonClick: "onPolygonClick", onPolygonShapeChangedEvent: "onPolygonShapeChangedEvent", onMapDataBound: "onMapDataBound", onMapBoundsChanged: "onMapBoundsChanged", onMapCenterChanged: "onMapCenterChanged", onMapContextMenu: "onMapContextMenu", onMapDrag: "onMapDrag", onMapDragEnd: "onMapDragEnd", onMapDragStart: "onMapDragStart", onMapMouseMove: "onMapMouseMove", onMapMouseOut: "onMapMouseOut", onMapMouseOver: "onMapMouseOver", onMapResize: "onMapResize", onMapZoomChanged: "onMapZoomChanged" }, viewQueries: [{ propertyName: "map", first: true, predicate: GoogleMap, descendants: true }, { propertyName: "info", first: true, predicate: MapInfoWindow, descendants: true }, { propertyName: "mapHostRef", first: true, predicate: ["mapHostRef"], descendants: true }, { propertyName: "markerElements", predicate: ["markerElem"], descendants: true }], ngImport: i0, template: "<div class=\"map-list-root\" #mapHostRef [style.height.px]=\"mapHostHeightPx\" [style.max-height.px]=\"mapHostHeightPx\">\r\n @if (loading) {\r\n <div class=\"map-loading-overlay\">\r\n <div class=\"map-loading-spinner\" aria-hidden=\"true\"></div>\r\n <div class=\"map-loading-label\">Loading map...</div>\r\n </div>\r\n }\r\n @if (mapsApiUnavailable) {\r\n <div class=\"map-unavailable\" role=\"status\">\r\n <i class=\"pi pi-map\" aria-hidden=\"true\"></i>\r\n <div class=\"map-unavailable__title\">{{ 'map.api_key_missing.title' | translate }}</div>\r\n <div class=\"map-unavailable__text\">{{ 'map.api_key_missing.detail' | translate }}</div>\r\n </div>\r\n }\r\n @if (archetypeOptions && !mapsApiUnavailable) {\r\n <google-map #map height=\"100%\" width=\"100%\" [zoom]=\"zoom\" [center]=\"center\" [options]=\"archetypeOptions\"\r\n (boundsChanged)=\"handleMapBoundsChanged()\" (centerChanged)=\"handleMapCenterChanged()\"\r\n (mapRightclick)=\"handleMapContextMenu($event)\" (mapDrag)=\"handleMapDrag($event)\"\r\n (mapDragend)=\"handleMapDragEnd($event)\" (mapDragstart)=\"handleMapDragStart($event)\"\r\n (mapMousemove)=\"handleMapMouseMove($event)\" (mapMouseout)=\"handleMapMouseOut($event)\"\r\n (mapMouseover)=\"handleMapMouseOver($event)\" (zoomChanged)=\"handleMapZoomChanged()\" (mapClick)=\"hello($event)\">\r\n @for (record of data; track record) {\r\n @if (record.__marker) {\r\n <!-- 2026-05-03: rimosso `(mapClick)=\"openInfo(...)\"` perche'\r\n @angular/google-maps@21.x espone `mapClick` come\r\n `getLazyEmitter('click')` sul AdvancedMarkerElement; Google ha\r\n deprecato l'evento `click` (use `gmp-click` instead). Il binding\r\n viene fatto manualmente in ngAfterViewInit + markerElements.changes\r\n (vedi `wireMarkerGmpClick()` nel .ts). -->\r\n <map-advanced-marker #markerElem=\"mapAdvancedMarker\" [position]=\"record.__marker.position\"\r\n [title]=\"record.__marker.title\" [options]=\"record.__marker.options\" [gmpDraggable]=\"record.__marker.draggable\"\r\n (mapDragstart)=\"mapDragstart(markerElem, record.__marker, $event)\" [content]=\"record.__marker.content\"\r\n (mapDragend)=\"mapDragend(markerElem, record.__marker, $event)\"></map-advanced-marker>\r\n }\r\n }\r\n @for (record of data; track record; let polygonIndex = $index) {\r\n @if (record.__polygon) {\r\n <map-polygon #polygonElem=\"mapPolygon\" [paths]=\"record.__polygon.paths\" [options]=\"record.__polygon.options\"\r\n (polygonClick)=\"openPolygonInfo(record.__polygon, $event)\"\r\n (polygonMouseup)=\"onPolygonShapeChanged(polygonElem, record, polygonIndex)\"\r\n (polygonDragend)=\"onPolygonShapeChanged(polygonElem, record, polygonIndex)\"></map-polygon>\r\n }\r\n }\r\n @for (poly of polylines; track poly.group) {\r\n <map-polyline [path]=\"poly.path\" [options]=\"poly.options\"></map-polyline>\r\n }\r\n @for (dot of polylineDots; track dot) {\r\n <map-circle [center]=\"dot.center\" [radius]=\"dot.options.radius\" [options]=\"dot.options\"\r\n (circleClick)=\"openWaypointInfo(dot, $event)\"></map-circle>\r\n }\r\n <map-info-window #info [options]=\"infoWindowOptions\">\r\n @if (currentMarker) {\r\n <ng-container\r\n *ngComponentOutlet=\"itemTemplate; inputs: { record: currentMarker, rowData: currentMarker, metaInfo: metaInfo, datasource: datasource, getDescription: renderMarkerInfo.bind(this) }\"></ng-container>\r\n }\r\n </map-info-window>\r\n </google-map>\r\n @if (!hideToolbar) {\r\n <div class=\"map-controls\">\r\n <p-button [label]=\"'map.zoom_in' | translate\" (onClick)=\"zoomIn()\"></p-button>\r\n <p-button [label]=\"'map.zoom_out' | translate\" (onClick)=\"zoomOut()\"></p-button>\r\n @if (showMarkerDragButton()) {\r\n <p-button [label]=\"'map.toggle_marker_draggable' | translate\" (onClick)=\"setAllDraggable()\"></p-button>\r\n }\r\n @if (showPolygonEditButton()) {\r\n <p-button [label]=\"polygonEditMode ? 'Save polygons' : 'Edit polygons'\"\r\n [severity]=\"polygonEditMode ? 'success' : 'secondary'\" (onClick)=\"togglePolygonEditing()\"></p-button>\r\n }\r\n @if (isAdmin) {\r\n <p-button [label]=\"'map.configure' | translate\" icon=\"pi pi-cog\" (onClick)=\"openMapConfig()\"></p-button>\r\n }\r\n </div>\r\n }\r\n }\r\n @if (!archetypeOptions && !loading) {\r\n <div class=\"map-empty-placeholder\"></div>\r\n }\r\n</div>\r\n\r\n<wuic-archetype-configurator [visible]=\"showConfigDialog\" (visibleChange)=\"showConfigDialog = $event\"\r\n [archetype]=\"'map'\" [metaInfo]=\"metaInfo\" [value]=\"archetypeOptions\" (applyConfig)=\"applyMapConfig($event)\">\r\n</wuic-archetype-configurator>", styles: [":host{display:flex;flex-direction:column;flex:1 1 auto;height:100%;min-height:0;overflow:hidden}.map-list-root{position:relative;display:flex;flex:1 1 auto;min-height:0;height:100%;overflow:hidden}.map-list-root google-map{display:flex;flex:1 1 auto;height:100%}.map-controls{position:absolute;bottom:30px;left:.5rem;z-index:3;display:flex;gap:.5rem;flex-wrap:wrap}.map-loading-overlay{position:absolute;inset:0;z-index:4;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:.75rem;background:color-mix(in srgb,var(--surface-ground, #f8fafc) 88%,transparent)}.map-loading-spinner{width:2.4rem;height:2.4rem;border-radius:50%;border:3px solid var(--surface-border, #cbd5e1);border-top-color:var(--primary-color, #3b82f6);animation:wuic-map-spin .8s linear infinite}.map-loading-label{font-size:.95rem;color:var(--text-color-secondary, #475569)}.map-empty-placeholder{width:100%;height:100%}@keyframes wuic-map-spin{to{transform:rotate(360deg)}}.map-config-grid{display:grid;grid-template-columns:1fr;gap:.45rem}.map-config-grid input,.map-config-grid select,.map-config-grid textarea{width:100%}.map-config-grid textarea{resize:vertical}:host ::ng-deep .gm-style .gm-style-iw-c{background:var(--surface-card, #ffffff);color:var(--text-color, #1f2937);border:1px solid var(--surface-border, #e5e7eb);box-shadow:0 10px 24px #0003;border-radius:10px;overflow:visible!important}:host ::ng-deep .gm-style .gm-style-iw-d{overflow:visible!important;max-height:none!important;color:inherit}:host ::ng-deep .gm-style .gm-ui-hover-effect{filter:none}:host ::ng-deep .gm-style .map-info{color:inherit}:host ::ng-deep .gm-style .map-info-title{color:inherit;font-weight:600}:host-context(.theme-dark) ::ng-deep .gm-style .gm-style-iw-c{background:var(--surface-card, #111827);color:var(--text-color, #e5e7eb);border-color:var(--surface-border, #374151);box-shadow:0 12px 28px #00000073}:host-context(.theme-dark) ::ng-deep .gm-style .gm-style-iw-tc:after{background:var(--surface-card, #111827)}:host-context(.theme-dark) ::ng-deep .gm-style .gm-ui-hover-effect>span{background-color:var(--text-color, #e5e7eb)!important}:host-context(.theme-dark) ::ng-deep .gm-style .p-tieredmenu,:host-context(.theme-dark) ::ng-deep .gm-style .dropdown-content{background:var(--surface-overlay, #0f172a)!important;color:var(--text-color, #e5e7eb)!important;border-color:var(--surface-border, #334155)!important}.map-unavailable{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:.5rem;height:100%;min-height:220px;padding:1.5rem;text-align:center;color:var(--text-color-secondary, #64748b);background:var(--surface-ground, #f8fafc);border:1px dashed var(--surface-border, #e2e8f0);border-radius:6px}.map-unavailable i{font-size:1.75rem;opacity:.6}.map-unavailable__title{font-weight:600;color:var(--text-color, #1e293b)}.map-unavailable__text{max-width:46ch;line-height:1.45;font-size:.9rem}\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: "directive", type: i5$2.MapCircle, selector: "map-circle", inputs: ["options", "center", "radius"], outputs: ["centerChanged", "circleClick", "circleDblclick", "circleDrag", "circleDragend", "circleDragstart", "circleMousedown", "circleMousemove", "circleMouseout", "circleMouseover", "circleMouseup", "radiusChanged", "circleRightclick", "circleInitialized"], exportAs: ["mapCircle"] }, { kind: "directive", type: i5$2.MapInfoWindow, selector: "map-info-window", inputs: ["options", "position"], outputs: ["closeclick", "contentChanged", "domready", "positionChanged", "zindexChanged", "infoWindowInitialized"], exportAs: ["mapInfoWindow"] }, { kind: "directive", type: i5$2.MapAdvancedMarker, selector: "map-advanced-marker", inputs: ["title", "position", "content", "gmpDraggable", "options", "zIndex"], outputs: ["mapClick", "mapDblclick", "mapMouseout", "mapMouseover", "mapMouseup", "mapRightclick", "mapDrag", "mapDragend", "mapDragstart", "markerInitialized"], exportAs: ["mapAdvancedMarker"] }, { kind: "directive", type: i5$2.MapPolygon, selector: "map-polygon", inputs: ["options", "paths"], outputs: ["polygonClick", "polygonDblclick", "polygonDrag", "polygonDragend", "polygonDragstart", "polygonMousedown", "polygonMousemove", "polygonMouseout", "polygonMouseover", "polygonMouseup", "polygonRightclick", "polygonInitialized"], exportAs: ["mapPolygon"] }, { kind: "directive", type: i5$2.MapPolyline, selector: "map-polyline", inputs: ["options", "path"], outputs: ["polylineClick", "polylineDblclick", "polylineDrag", "polylineDragend", "polylineDragstart", "polylineMousedown", "polylineMousemove", "polylineMouseout", "polylineMouseover", "polylineMouseup", "polylineRightclick", "polylineInitialized"], exportAs: ["mapPolyline"] }, { kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule"], exportAs: ["ngComponentOutlet"] }, { 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: "ngmodule", type: TranslateModule }, { kind: "component", type: ArchetypeConfiguratorComponent, selector: "wuic-archetype-configurator", inputs: ["visible", "archetype", "metaInfo", "value"], outputs: ["visibleChange", "applyConfig"] }, { kind: "pipe", type: i8.TranslatePipe, name: "translate" }] });
43536
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "21.2.9", type: MapListComponent, isStandalone: true, selector: "wuic-map-list", inputs: { hardcodedRoute: "hardcodedRoute", parentRecord: "parentRecord", parentMetaInfo: "parentMetaInfo", datasource: "datasource", hardcodedDatasource: "hardcodedDatasource", hideToolbar: "hideToolbar" }, outputs: { onMapClick: "onMapClick", onMarkerDragStart: "onMarkerDragStart", onMarkerDragEnd: "onMarkerDragEnd", onMarkerClick: "onMarkerClick", onPolygonClick: "onPolygonClick", onPolygonShapeChangedEvent: "onPolygonShapeChangedEvent", onMapDataBound: "onMapDataBound", onMapBoundsChanged: "onMapBoundsChanged", onMapCenterChanged: "onMapCenterChanged", onMapContextMenu: "onMapContextMenu", onMapDrag: "onMapDrag", onMapDragEnd: "onMapDragEnd", onMapDragStart: "onMapDragStart", onMapMouseMove: "onMapMouseMove", onMapMouseOut: "onMapMouseOut", onMapMouseOver: "onMapMouseOver", onMapResize: "onMapResize", onMapZoomChanged: "onMapZoomChanged" }, viewQueries: [{ propertyName: "map", first: true, predicate: GoogleMap, descendants: true }, { propertyName: "info", first: true, predicate: MapInfoWindow, descendants: true }, { propertyName: "mapHostRef", first: true, predicate: ["mapHostRef"], descendants: true }, { propertyName: "markerElements", predicate: ["markerElem"], descendants: true }], ngImport: i0, template: "<div class=\"map-list-root\" #mapHostRef [style.height.px]=\"mapHostHeightPx\" [style.max-height.px]=\"mapHostHeightPx\">\r\n @if (loading) {\r\n <div class=\"map-loading-overlay\">\r\n <div class=\"map-loading-spinner\" aria-hidden=\"true\"></div>\r\n <div class=\"map-loading-label\">Loading map...</div>\r\n </div>\r\n }\r\n @if (mapsApiUnavailable) {\r\n <div class=\"map-unavailable\" role=\"status\">\r\n <i class=\"pi pi-map\" aria-hidden=\"true\"></i>\r\n <div class=\"map-unavailable__title\">{{ 'map.api_key_missing.title' | translate }}</div>\r\n <div class=\"map-unavailable__text\">{{ 'map.api_key_missing.detail' | translate }}</div>\r\n </div>\r\n }\r\n <!-- `mapsApiReady` e non `!mapsApiUnavailable`: quel flag viene alzato solo quando il\r\n datasource emette, mentre questo blocco viene valutato SUBITO. Nel frattempo\r\n <google-map> di @angular/google-maps si inizializzava e lanciava lui\r\n `ReferenceError: google is not defined`, che risaliva al dialog di errore applicativo\r\n e bloccava tutta l'interfaccia \u2014 esattamente il guasto che l'avviso qui sopra doveva\r\n evitare (riprodotto il 12/09, journey linux-server-tutorial modulo 35). `mapsApiReady`\r\n e' un getter: la rilevazione viene rifatta a ogni ciclo di change detection, quindi se\r\n lo script di Maps arriva dopo la mappa compare da sola, senza ricaricare la pagina. -->\r\n @if (archetypeOptions && mapsApiReady) {\r\n <google-map #map height=\"100%\" width=\"100%\" [zoom]=\"zoom\" [center]=\"center\" [options]=\"archetypeOptions\"\r\n (boundsChanged)=\"handleMapBoundsChanged()\" (centerChanged)=\"handleMapCenterChanged()\"\r\n (mapRightclick)=\"handleMapContextMenu($event)\" (mapDrag)=\"handleMapDrag($event)\"\r\n (mapDragend)=\"handleMapDragEnd($event)\" (mapDragstart)=\"handleMapDragStart($event)\"\r\n (mapMousemove)=\"handleMapMouseMove($event)\" (mapMouseout)=\"handleMapMouseOut($event)\"\r\n (mapMouseover)=\"handleMapMouseOver($event)\" (zoomChanged)=\"handleMapZoomChanged()\" (mapClick)=\"hello($event)\">\r\n @for (record of data; track record) {\r\n @if (record.__marker) {\r\n <!-- 2026-05-03: rimosso `(mapClick)=\"openInfo(...)\"` perche'\r\n @angular/google-maps@21.x espone `mapClick` come\r\n `getLazyEmitter('click')` sul AdvancedMarkerElement; Google ha\r\n deprecato l'evento `click` (use `gmp-click` instead). Il binding\r\n viene fatto manualmente in ngAfterViewInit + markerElements.changes\r\n (vedi `wireMarkerGmpClick()` nel .ts). -->\r\n <map-advanced-marker #markerElem=\"mapAdvancedMarker\" [position]=\"record.__marker.position\"\r\n [title]=\"record.__marker.title\" [options]=\"record.__marker.options\" [gmpDraggable]=\"record.__marker.draggable\"\r\n (mapDragstart)=\"mapDragstart(markerElem, record.__marker, $event)\" [content]=\"record.__marker.content\"\r\n (mapDragend)=\"mapDragend(markerElem, record.__marker, $event)\"></map-advanced-marker>\r\n }\r\n }\r\n @for (record of data; track record; let polygonIndex = $index) {\r\n @if (record.__polygon) {\r\n <map-polygon #polygonElem=\"mapPolygon\" [paths]=\"record.__polygon.paths\" [options]=\"record.__polygon.options\"\r\n (polygonClick)=\"openPolygonInfo(record.__polygon, $event)\"\r\n (polygonMouseup)=\"onPolygonShapeChanged(polygonElem, record, polygonIndex)\"\r\n (polygonDragend)=\"onPolygonShapeChanged(polygonElem, record, polygonIndex)\"></map-polygon>\r\n }\r\n }\r\n @for (poly of polylines; track poly.group) {\r\n <map-polyline [path]=\"poly.path\" [options]=\"poly.options\"></map-polyline>\r\n }\r\n @for (dot of polylineDots; track dot) {\r\n <map-circle [center]=\"dot.center\" [radius]=\"dot.options.radius\" [options]=\"dot.options\"\r\n (circleClick)=\"openWaypointInfo(dot, $event)\"></map-circle>\r\n }\r\n <map-info-window #info [options]=\"infoWindowOptions\">\r\n @if (currentMarker) {\r\n <ng-container\r\n *ngComponentOutlet=\"itemTemplate; inputs: { record: currentMarker, rowData: currentMarker, metaInfo: metaInfo, datasource: datasource, getDescription: renderMarkerInfo.bind(this) }\"></ng-container>\r\n }\r\n </map-info-window>\r\n </google-map>\r\n @if (!hideToolbar) {\r\n <div class=\"map-controls\">\r\n <p-button [label]=\"'map.zoom_in' | translate\" (onClick)=\"zoomIn()\"></p-button>\r\n <p-button [label]=\"'map.zoom_out' | translate\" (onClick)=\"zoomOut()\"></p-button>\r\n @if (showMarkerDragButton()) {\r\n <p-button [label]=\"'map.toggle_marker_draggable' | translate\" (onClick)=\"setAllDraggable()\"></p-button>\r\n }\r\n @if (showPolygonEditButton()) {\r\n <p-button [label]=\"polygonEditMode ? 'Save polygons' : 'Edit polygons'\"\r\n [severity]=\"polygonEditMode ? 'success' : 'secondary'\" (onClick)=\"togglePolygonEditing()\"></p-button>\r\n }\r\n @if (isAdmin) {\r\n <p-button [label]=\"'map.configure' | translate\" icon=\"pi pi-cog\" (onClick)=\"openMapConfig()\"></p-button>\r\n }\r\n </div>\r\n }\r\n }\r\n @if (!archetypeOptions && !loading) {\r\n <div class=\"map-empty-placeholder\"></div>\r\n }\r\n</div>\r\n\r\n<wuic-archetype-configurator [visible]=\"showConfigDialog\" (visibleChange)=\"showConfigDialog = $event\"\r\n [archetype]=\"'map'\" [metaInfo]=\"metaInfo\" [value]=\"archetypeOptions\" (applyConfig)=\"applyMapConfig($event)\">\r\n</wuic-archetype-configurator>", styles: [":host{display:flex;flex-direction:column;flex:1 1 auto;height:100%;min-height:0;overflow:hidden}.map-list-root{position:relative;display:flex;flex:1 1 auto;min-height:0;height:100%;overflow:hidden}.map-list-root google-map{display:flex;flex:1 1 auto;height:100%}.map-controls{position:absolute;bottom:30px;left:.5rem;z-index:3;display:flex;gap:.5rem;flex-wrap:wrap}.map-loading-overlay{position:absolute;inset:0;z-index:4;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:.75rem;background:color-mix(in srgb,var(--surface-ground, #f8fafc) 88%,transparent)}.map-loading-spinner{width:2.4rem;height:2.4rem;border-radius:50%;border:3px solid var(--surface-border, #cbd5e1);border-top-color:var(--primary-color, #3b82f6);animation:wuic-map-spin .8s linear infinite}.map-loading-label{font-size:.95rem;color:var(--text-color-secondary, #475569)}.map-empty-placeholder{width:100%;height:100%}@keyframes wuic-map-spin{to{transform:rotate(360deg)}}.map-config-grid{display:grid;grid-template-columns:1fr;gap:.45rem}.map-config-grid input,.map-config-grid select,.map-config-grid textarea{width:100%}.map-config-grid textarea{resize:vertical}:host ::ng-deep .gm-style .gm-style-iw-c{background:var(--surface-card, #ffffff);color:var(--text-color, #1f2937);border:1px solid var(--surface-border, #e5e7eb);box-shadow:0 10px 24px #0003;border-radius:10px;overflow:visible!important}:host ::ng-deep .gm-style .gm-style-iw-d{overflow:visible!important;max-height:none!important;color:inherit}:host ::ng-deep .gm-style .gm-ui-hover-effect{filter:none}:host ::ng-deep .gm-style .map-info{color:inherit}:host ::ng-deep .gm-style .map-info-title{color:inherit;font-weight:600}:host-context(.theme-dark) ::ng-deep .gm-style .gm-style-iw-c{background:var(--surface-card, #111827);color:var(--text-color, #e5e7eb);border-color:var(--surface-border, #374151);box-shadow:0 12px 28px #00000073}:host-context(.theme-dark) ::ng-deep .gm-style .gm-style-iw-tc:after{background:var(--surface-card, #111827)}:host-context(.theme-dark) ::ng-deep .gm-style .gm-ui-hover-effect>span{background-color:var(--text-color, #e5e7eb)!important}:host-context(.theme-dark) ::ng-deep .gm-style .p-tieredmenu,:host-context(.theme-dark) ::ng-deep .gm-style .dropdown-content{background:var(--surface-overlay, #0f172a)!important;color:var(--text-color, #e5e7eb)!important;border-color:var(--surface-border, #334155)!important}.map-unavailable{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:.5rem;height:100%;min-height:220px;padding:1.5rem;text-align:center;color:var(--text-color-secondary, #64748b);background:var(--surface-ground, #f8fafc);border:1px dashed var(--surface-border, #e2e8f0);border-radius:6px}.map-unavailable i{font-size:1.75rem;opacity:.6}.map-unavailable__title{font-weight:600;color:var(--text-color, #1e293b)}.map-unavailable__text{max-width:46ch;line-height:1.45;font-size:.9rem}\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: "directive", type: i5$2.MapCircle, selector: "map-circle", inputs: ["options", "center", "radius"], outputs: ["centerChanged", "circleClick", "circleDblclick", "circleDrag", "circleDragend", "circleDragstart", "circleMousedown", "circleMousemove", "circleMouseout", "circleMouseover", "circleMouseup", "radiusChanged", "circleRightclick", "circleInitialized"], exportAs: ["mapCircle"] }, { kind: "directive", type: i5$2.MapInfoWindow, selector: "map-info-window", inputs: ["options", "position"], outputs: ["closeclick", "contentChanged", "domready", "positionChanged", "zindexChanged", "infoWindowInitialized"], exportAs: ["mapInfoWindow"] }, { kind: "directive", type: i5$2.MapAdvancedMarker, selector: "map-advanced-marker", inputs: ["title", "position", "content", "gmpDraggable", "options", "zIndex"], outputs: ["mapClick", "mapDblclick", "mapMouseout", "mapMouseover", "mapMouseup", "mapRightclick", "mapDrag", "mapDragend", "mapDragstart", "markerInitialized"], exportAs: ["mapAdvancedMarker"] }, { kind: "directive", type: i5$2.MapPolygon, selector: "map-polygon", inputs: ["options", "paths"], outputs: ["polygonClick", "polygonDblclick", "polygonDrag", "polygonDragend", "polygonDragstart", "polygonMousedown", "polygonMousemove", "polygonMouseout", "polygonMouseover", "polygonMouseup", "polygonRightclick", "polygonInitialized"], exportAs: ["mapPolygon"] }, { kind: "directive", type: i5$2.MapPolyline, selector: "map-polyline", inputs: ["options", "path"], outputs: ["polylineClick", "polylineDblclick", "polylineDrag", "polylineDragend", "polylineDragstart", "polylineMousedown", "polylineMousemove", "polylineMouseout", "polylineMouseover", "polylineMouseup", "polylineRightclick", "polylineInitialized"], exportAs: ["mapPolyline"] }, { kind: "directive", type: NgComponentOutlet, selector: "[ngComponentOutlet]", inputs: ["ngComponentOutlet", "ngComponentOutletInputs", "ngComponentOutletInjector", "ngComponentOutletEnvironmentInjector", "ngComponentOutletContent", "ngComponentOutletNgModule"], exportAs: ["ngComponentOutlet"] }, { 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: "ngmodule", type: TranslateModule }, { kind: "component", type: ArchetypeConfiguratorComponent, selector: "wuic-archetype-configurator", inputs: ["visible", "archetype", "metaInfo", "value"], outputs: ["visibleChange", "applyConfig"] }, { kind: "pipe", type: i8.TranslatePipe, name: "translate" }] });
43522
43537
  }
43523
43538
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: MapListComponent, decorators: [{
43524
43539
  type: Component,
43525
- args: [{ selector: 'wuic-map-list', imports: [GoogleMapsModule, NgComponentOutlet, ButtonModule, TranslateModule, ArchetypeConfiguratorComponent], template: "<div class=\"map-list-root\" #mapHostRef [style.height.px]=\"mapHostHeightPx\" [style.max-height.px]=\"mapHostHeightPx\">\r\n @if (loading) {\r\n <div class=\"map-loading-overlay\">\r\n <div class=\"map-loading-spinner\" aria-hidden=\"true\"></div>\r\n <div class=\"map-loading-label\">Loading map...</div>\r\n </div>\r\n }\r\n @if (mapsApiUnavailable) {\r\n <div class=\"map-unavailable\" role=\"status\">\r\n <i class=\"pi pi-map\" aria-hidden=\"true\"></i>\r\n <div class=\"map-unavailable__title\">{{ 'map.api_key_missing.title' | translate }}</div>\r\n <div class=\"map-unavailable__text\">{{ 'map.api_key_missing.detail' | translate }}</div>\r\n </div>\r\n }\r\n @if (archetypeOptions && !mapsApiUnavailable) {\r\n <google-map #map height=\"100%\" width=\"100%\" [zoom]=\"zoom\" [center]=\"center\" [options]=\"archetypeOptions\"\r\n (boundsChanged)=\"handleMapBoundsChanged()\" (centerChanged)=\"handleMapCenterChanged()\"\r\n (mapRightclick)=\"handleMapContextMenu($event)\" (mapDrag)=\"handleMapDrag($event)\"\r\n (mapDragend)=\"handleMapDragEnd($event)\" (mapDragstart)=\"handleMapDragStart($event)\"\r\n (mapMousemove)=\"handleMapMouseMove($event)\" (mapMouseout)=\"handleMapMouseOut($event)\"\r\n (mapMouseover)=\"handleMapMouseOver($event)\" (zoomChanged)=\"handleMapZoomChanged()\" (mapClick)=\"hello($event)\">\r\n @for (record of data; track record) {\r\n @if (record.__marker) {\r\n <!-- 2026-05-03: rimosso `(mapClick)=\"openInfo(...)\"` perche'\r\n @angular/google-maps@21.x espone `mapClick` come\r\n `getLazyEmitter('click')` sul AdvancedMarkerElement; Google ha\r\n deprecato l'evento `click` (use `gmp-click` instead). Il binding\r\n viene fatto manualmente in ngAfterViewInit + markerElements.changes\r\n (vedi `wireMarkerGmpClick()` nel .ts). -->\r\n <map-advanced-marker #markerElem=\"mapAdvancedMarker\" [position]=\"record.__marker.position\"\r\n [title]=\"record.__marker.title\" [options]=\"record.__marker.options\" [gmpDraggable]=\"record.__marker.draggable\"\r\n (mapDragstart)=\"mapDragstart(markerElem, record.__marker, $event)\" [content]=\"record.__marker.content\"\r\n (mapDragend)=\"mapDragend(markerElem, record.__marker, $event)\"></map-advanced-marker>\r\n }\r\n }\r\n @for (record of data; track record; let polygonIndex = $index) {\r\n @if (record.__polygon) {\r\n <map-polygon #polygonElem=\"mapPolygon\" [paths]=\"record.__polygon.paths\" [options]=\"record.__polygon.options\"\r\n (polygonClick)=\"openPolygonInfo(record.__polygon, $event)\"\r\n (polygonMouseup)=\"onPolygonShapeChanged(polygonElem, record, polygonIndex)\"\r\n (polygonDragend)=\"onPolygonShapeChanged(polygonElem, record, polygonIndex)\"></map-polygon>\r\n }\r\n }\r\n @for (poly of polylines; track poly.group) {\r\n <map-polyline [path]=\"poly.path\" [options]=\"poly.options\"></map-polyline>\r\n }\r\n @for (dot of polylineDots; track dot) {\r\n <map-circle [center]=\"dot.center\" [radius]=\"dot.options.radius\" [options]=\"dot.options\"\r\n (circleClick)=\"openWaypointInfo(dot, $event)\"></map-circle>\r\n }\r\n <map-info-window #info [options]=\"infoWindowOptions\">\r\n @if (currentMarker) {\r\n <ng-container\r\n *ngComponentOutlet=\"itemTemplate; inputs: { record: currentMarker, rowData: currentMarker, metaInfo: metaInfo, datasource: datasource, getDescription: renderMarkerInfo.bind(this) }\"></ng-container>\r\n }\r\n </map-info-window>\r\n </google-map>\r\n @if (!hideToolbar) {\r\n <div class=\"map-controls\">\r\n <p-button [label]=\"'map.zoom_in' | translate\" (onClick)=\"zoomIn()\"></p-button>\r\n <p-button [label]=\"'map.zoom_out' | translate\" (onClick)=\"zoomOut()\"></p-button>\r\n @if (showMarkerDragButton()) {\r\n <p-button [label]=\"'map.toggle_marker_draggable' | translate\" (onClick)=\"setAllDraggable()\"></p-button>\r\n }\r\n @if (showPolygonEditButton()) {\r\n <p-button [label]=\"polygonEditMode ? 'Save polygons' : 'Edit polygons'\"\r\n [severity]=\"polygonEditMode ? 'success' : 'secondary'\" (onClick)=\"togglePolygonEditing()\"></p-button>\r\n }\r\n @if (isAdmin) {\r\n <p-button [label]=\"'map.configure' | translate\" icon=\"pi pi-cog\" (onClick)=\"openMapConfig()\"></p-button>\r\n }\r\n </div>\r\n }\r\n }\r\n @if (!archetypeOptions && !loading) {\r\n <div class=\"map-empty-placeholder\"></div>\r\n }\r\n</div>\r\n\r\n<wuic-archetype-configurator [visible]=\"showConfigDialog\" (visibleChange)=\"showConfigDialog = $event\"\r\n [archetype]=\"'map'\" [metaInfo]=\"metaInfo\" [value]=\"archetypeOptions\" (applyConfig)=\"applyMapConfig($event)\">\r\n</wuic-archetype-configurator>", styles: [":host{display:flex;flex-direction:column;flex:1 1 auto;height:100%;min-height:0;overflow:hidden}.map-list-root{position:relative;display:flex;flex:1 1 auto;min-height:0;height:100%;overflow:hidden}.map-list-root google-map{display:flex;flex:1 1 auto;height:100%}.map-controls{position:absolute;bottom:30px;left:.5rem;z-index:3;display:flex;gap:.5rem;flex-wrap:wrap}.map-loading-overlay{position:absolute;inset:0;z-index:4;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:.75rem;background:color-mix(in srgb,var(--surface-ground, #f8fafc) 88%,transparent)}.map-loading-spinner{width:2.4rem;height:2.4rem;border-radius:50%;border:3px solid var(--surface-border, #cbd5e1);border-top-color:var(--primary-color, #3b82f6);animation:wuic-map-spin .8s linear infinite}.map-loading-label{font-size:.95rem;color:var(--text-color-secondary, #475569)}.map-empty-placeholder{width:100%;height:100%}@keyframes wuic-map-spin{to{transform:rotate(360deg)}}.map-config-grid{display:grid;grid-template-columns:1fr;gap:.45rem}.map-config-grid input,.map-config-grid select,.map-config-grid textarea{width:100%}.map-config-grid textarea{resize:vertical}:host ::ng-deep .gm-style .gm-style-iw-c{background:var(--surface-card, #ffffff);color:var(--text-color, #1f2937);border:1px solid var(--surface-border, #e5e7eb);box-shadow:0 10px 24px #0003;border-radius:10px;overflow:visible!important}:host ::ng-deep .gm-style .gm-style-iw-d{overflow:visible!important;max-height:none!important;color:inherit}:host ::ng-deep .gm-style .gm-ui-hover-effect{filter:none}:host ::ng-deep .gm-style .map-info{color:inherit}:host ::ng-deep .gm-style .map-info-title{color:inherit;font-weight:600}:host-context(.theme-dark) ::ng-deep .gm-style .gm-style-iw-c{background:var(--surface-card, #111827);color:var(--text-color, #e5e7eb);border-color:var(--surface-border, #374151);box-shadow:0 12px 28px #00000073}:host-context(.theme-dark) ::ng-deep .gm-style .gm-style-iw-tc:after{background:var(--surface-card, #111827)}:host-context(.theme-dark) ::ng-deep .gm-style .gm-ui-hover-effect>span{background-color:var(--text-color, #e5e7eb)!important}:host-context(.theme-dark) ::ng-deep .gm-style .p-tieredmenu,:host-context(.theme-dark) ::ng-deep .gm-style .dropdown-content{background:var(--surface-overlay, #0f172a)!important;color:var(--text-color, #e5e7eb)!important;border-color:var(--surface-border, #334155)!important}.map-unavailable{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:.5rem;height:100%;min-height:220px;padding:1.5rem;text-align:center;color:var(--text-color-secondary, #64748b);background:var(--surface-ground, #f8fafc);border:1px dashed var(--surface-border, #e2e8f0);border-radius:6px}.map-unavailable i{font-size:1.75rem;opacity:.6}.map-unavailable__title{font-weight:600;color:var(--text-color, #1e293b)}.map-unavailable__text{max-width:46ch;line-height:1.45;font-size:.9rem}\n"] }]
43540
+ args: [{ selector: 'wuic-map-list', imports: [GoogleMapsModule, NgComponentOutlet, ButtonModule, TranslateModule, ArchetypeConfiguratorComponent], template: "<div class=\"map-list-root\" #mapHostRef [style.height.px]=\"mapHostHeightPx\" [style.max-height.px]=\"mapHostHeightPx\">\r\n @if (loading) {\r\n <div class=\"map-loading-overlay\">\r\n <div class=\"map-loading-spinner\" aria-hidden=\"true\"></div>\r\n <div class=\"map-loading-label\">Loading map...</div>\r\n </div>\r\n }\r\n @if (mapsApiUnavailable) {\r\n <div class=\"map-unavailable\" role=\"status\">\r\n <i class=\"pi pi-map\" aria-hidden=\"true\"></i>\r\n <div class=\"map-unavailable__title\">{{ 'map.api_key_missing.title' | translate }}</div>\r\n <div class=\"map-unavailable__text\">{{ 'map.api_key_missing.detail' | translate }}</div>\r\n </div>\r\n }\r\n <!-- `mapsApiReady` e non `!mapsApiUnavailable`: quel flag viene alzato solo quando il\r\n datasource emette, mentre questo blocco viene valutato SUBITO. Nel frattempo\r\n <google-map> di @angular/google-maps si inizializzava e lanciava lui\r\n `ReferenceError: google is not defined`, che risaliva al dialog di errore applicativo\r\n e bloccava tutta l'interfaccia \u2014 esattamente il guasto che l'avviso qui sopra doveva\r\n evitare (riprodotto il 12/09, journey linux-server-tutorial modulo 35). `mapsApiReady`\r\n e' un getter: la rilevazione viene rifatta a ogni ciclo di change detection, quindi se\r\n lo script di Maps arriva dopo la mappa compare da sola, senza ricaricare la pagina. -->\r\n @if (archetypeOptions && mapsApiReady) {\r\n <google-map #map height=\"100%\" width=\"100%\" [zoom]=\"zoom\" [center]=\"center\" [options]=\"archetypeOptions\"\r\n (boundsChanged)=\"handleMapBoundsChanged()\" (centerChanged)=\"handleMapCenterChanged()\"\r\n (mapRightclick)=\"handleMapContextMenu($event)\" (mapDrag)=\"handleMapDrag($event)\"\r\n (mapDragend)=\"handleMapDragEnd($event)\" (mapDragstart)=\"handleMapDragStart($event)\"\r\n (mapMousemove)=\"handleMapMouseMove($event)\" (mapMouseout)=\"handleMapMouseOut($event)\"\r\n (mapMouseover)=\"handleMapMouseOver($event)\" (zoomChanged)=\"handleMapZoomChanged()\" (mapClick)=\"hello($event)\">\r\n @for (record of data; track record) {\r\n @if (record.__marker) {\r\n <!-- 2026-05-03: rimosso `(mapClick)=\"openInfo(...)\"` perche'\r\n @angular/google-maps@21.x espone `mapClick` come\r\n `getLazyEmitter('click')` sul AdvancedMarkerElement; Google ha\r\n deprecato l'evento `click` (use `gmp-click` instead). Il binding\r\n viene fatto manualmente in ngAfterViewInit + markerElements.changes\r\n (vedi `wireMarkerGmpClick()` nel .ts). -->\r\n <map-advanced-marker #markerElem=\"mapAdvancedMarker\" [position]=\"record.__marker.position\"\r\n [title]=\"record.__marker.title\" [options]=\"record.__marker.options\" [gmpDraggable]=\"record.__marker.draggable\"\r\n (mapDragstart)=\"mapDragstart(markerElem, record.__marker, $event)\" [content]=\"record.__marker.content\"\r\n (mapDragend)=\"mapDragend(markerElem, record.__marker, $event)\"></map-advanced-marker>\r\n }\r\n }\r\n @for (record of data; track record; let polygonIndex = $index) {\r\n @if (record.__polygon) {\r\n <map-polygon #polygonElem=\"mapPolygon\" [paths]=\"record.__polygon.paths\" [options]=\"record.__polygon.options\"\r\n (polygonClick)=\"openPolygonInfo(record.__polygon, $event)\"\r\n (polygonMouseup)=\"onPolygonShapeChanged(polygonElem, record, polygonIndex)\"\r\n (polygonDragend)=\"onPolygonShapeChanged(polygonElem, record, polygonIndex)\"></map-polygon>\r\n }\r\n }\r\n @for (poly of polylines; track poly.group) {\r\n <map-polyline [path]=\"poly.path\" [options]=\"poly.options\"></map-polyline>\r\n }\r\n @for (dot of polylineDots; track dot) {\r\n <map-circle [center]=\"dot.center\" [radius]=\"dot.options.radius\" [options]=\"dot.options\"\r\n (circleClick)=\"openWaypointInfo(dot, $event)\"></map-circle>\r\n }\r\n <map-info-window #info [options]=\"infoWindowOptions\">\r\n @if (currentMarker) {\r\n <ng-container\r\n *ngComponentOutlet=\"itemTemplate; inputs: { record: currentMarker, rowData: currentMarker, metaInfo: metaInfo, datasource: datasource, getDescription: renderMarkerInfo.bind(this) }\"></ng-container>\r\n }\r\n </map-info-window>\r\n </google-map>\r\n @if (!hideToolbar) {\r\n <div class=\"map-controls\">\r\n <p-button [label]=\"'map.zoom_in' | translate\" (onClick)=\"zoomIn()\"></p-button>\r\n <p-button [label]=\"'map.zoom_out' | translate\" (onClick)=\"zoomOut()\"></p-button>\r\n @if (showMarkerDragButton()) {\r\n <p-button [label]=\"'map.toggle_marker_draggable' | translate\" (onClick)=\"setAllDraggable()\"></p-button>\r\n }\r\n @if (showPolygonEditButton()) {\r\n <p-button [label]=\"polygonEditMode ? 'Save polygons' : 'Edit polygons'\"\r\n [severity]=\"polygonEditMode ? 'success' : 'secondary'\" (onClick)=\"togglePolygonEditing()\"></p-button>\r\n }\r\n @if (isAdmin) {\r\n <p-button [label]=\"'map.configure' | translate\" icon=\"pi pi-cog\" (onClick)=\"openMapConfig()\"></p-button>\r\n }\r\n </div>\r\n }\r\n }\r\n @if (!archetypeOptions && !loading) {\r\n <div class=\"map-empty-placeholder\"></div>\r\n }\r\n</div>\r\n\r\n<wuic-archetype-configurator [visible]=\"showConfigDialog\" (visibleChange)=\"showConfigDialog = $event\"\r\n [archetype]=\"'map'\" [metaInfo]=\"metaInfo\" [value]=\"archetypeOptions\" (applyConfig)=\"applyMapConfig($event)\">\r\n</wuic-archetype-configurator>", styles: [":host{display:flex;flex-direction:column;flex:1 1 auto;height:100%;min-height:0;overflow:hidden}.map-list-root{position:relative;display:flex;flex:1 1 auto;min-height:0;height:100%;overflow:hidden}.map-list-root google-map{display:flex;flex:1 1 auto;height:100%}.map-controls{position:absolute;bottom:30px;left:.5rem;z-index:3;display:flex;gap:.5rem;flex-wrap:wrap}.map-loading-overlay{position:absolute;inset:0;z-index:4;display:flex;flex-direction:column;align-items:center;justify-content:center;gap:.75rem;background:color-mix(in srgb,var(--surface-ground, #f8fafc) 88%,transparent)}.map-loading-spinner{width:2.4rem;height:2.4rem;border-radius:50%;border:3px solid var(--surface-border, #cbd5e1);border-top-color:var(--primary-color, #3b82f6);animation:wuic-map-spin .8s linear infinite}.map-loading-label{font-size:.95rem;color:var(--text-color-secondary, #475569)}.map-empty-placeholder{width:100%;height:100%}@keyframes wuic-map-spin{to{transform:rotate(360deg)}}.map-config-grid{display:grid;grid-template-columns:1fr;gap:.45rem}.map-config-grid input,.map-config-grid select,.map-config-grid textarea{width:100%}.map-config-grid textarea{resize:vertical}:host ::ng-deep .gm-style .gm-style-iw-c{background:var(--surface-card, #ffffff);color:var(--text-color, #1f2937);border:1px solid var(--surface-border, #e5e7eb);box-shadow:0 10px 24px #0003;border-radius:10px;overflow:visible!important}:host ::ng-deep .gm-style .gm-style-iw-d{overflow:visible!important;max-height:none!important;color:inherit}:host ::ng-deep .gm-style .gm-ui-hover-effect{filter:none}:host ::ng-deep .gm-style .map-info{color:inherit}:host ::ng-deep .gm-style .map-info-title{color:inherit;font-weight:600}:host-context(.theme-dark) ::ng-deep .gm-style .gm-style-iw-c{background:var(--surface-card, #111827);color:var(--text-color, #e5e7eb);border-color:var(--surface-border, #374151);box-shadow:0 12px 28px #00000073}:host-context(.theme-dark) ::ng-deep .gm-style .gm-style-iw-tc:after{background:var(--surface-card, #111827)}:host-context(.theme-dark) ::ng-deep .gm-style .gm-ui-hover-effect>span{background-color:var(--text-color, #e5e7eb)!important}:host-context(.theme-dark) ::ng-deep .gm-style .p-tieredmenu,:host-context(.theme-dark) ::ng-deep .gm-style .dropdown-content{background:var(--surface-overlay, #0f172a)!important;color:var(--text-color, #e5e7eb)!important;border-color:var(--surface-border, #334155)!important}.map-unavailable{display:flex;flex-direction:column;align-items:center;justify-content:center;gap:.5rem;height:100%;min-height:220px;padding:1.5rem;text-align:center;color:var(--text-color-secondary, #64748b);background:var(--surface-ground, #f8fafc);border:1px dashed var(--surface-border, #e2e8f0);border-radius:6px}.map-unavailable i{font-size:1.75rem;opacity:.6}.map-unavailable__title{font-weight:600;color:var(--text-color, #1e293b)}.map-unavailable__text{max-width:46ch;line-height:1.45;font-size:.9rem}\n"] }]
43526
43541
  }], ctorParameters: () => [{ type: i1$5.Title }, { type: i0.ChangeDetectorRef }, { type: i1$2.ActivatedRoute }, { type: UserInfoService }, { type: TranslationManagerService }], propDecorators: { map: [{
43527
43542
  type: ViewChild,
43528
43543
  args: [GoogleMap, { static: false }]
@@ -50040,7 +50055,7 @@ class LazyFirstRunWizardComponent {
50040
50055
  this.cdr = cdr;
50041
50056
  }
50042
50057
  async ngOnInit() {
50043
- firstRunWizardComponentPromise ??= import('./wuic-framework-lib-first-run-wizard.component-C8nhy5yK.mjs').then((m) => m.WuicFirstRunWizardComponent);
50058
+ firstRunWizardComponentPromise ??= import('./wuic-framework-lib-first-run-wizard.component-BoP77ip9.mjs').then((m) => m.WuicFirstRunWizardComponent);
50044
50059
  const componentClass = await firstRunWizardComponentPromise;
50045
50060
  this.componentRef = this.vcr.createComponent(componentClass);
50046
50061
  // Forward output del componente reale al wrapper. Type assertion necessaria
@@ -61741,7 +61756,7 @@ class LazyCodeEditorComponent {
61741
61756
  this.cdr = cdr;
61742
61757
  }
61743
61758
  async ngOnInit() {
61744
- codeEditorComponentPromise ??= import('./wuic-framework-lib-code-editor.component-WtZC2MZC.mjs').then((m) => m.CodeEditorComponent);
61759
+ codeEditorComponentPromise ??= import('./wuic-framework-lib-code-editor.component-Bx_fV1X1.mjs').then((m) => m.CodeEditorComponent);
61745
61760
  this.loadedComponent = await codeEditorComponentPromise;
61746
61761
  this.cdr.markForCheck();
61747
61762
  }
@@ -63920,7 +63935,7 @@ class DesignerRouteComponent {
63920
63935
  * Inizializza il componente preparando stato, sottoscrizioni e primi caricamenti richiesti.
63921
63936
  */
63922
63937
  async ngOnInit() {
63923
- designerComponentPromise ??= import('./wuic-framework-lib-designer.component-Dt7Yz5hn.mjs').then((m) => m.DesignerComponent);
63938
+ designerComponentPromise ??= import('./wuic-framework-lib-designer.component-CohHkalb.mjs').then((m) => m.DesignerComponent);
63924
63939
  this.loadedComponent = await designerComponentPromise;
63925
63940
  }
63926
63941
  /**
@@ -64001,7 +64016,7 @@ class LazyPivotBuilderComponent {
64001
64016
  this.cdr = cdr;
64002
64017
  }
64003
64018
  async ngOnInit() {
64004
- pivotBuilderComponentPromise ??= import('./wuic-framework-lib-pivot-builder.component-S5zqy3vj.mjs').then((m) => m.PivotBuilderComponent);
64019
+ pivotBuilderComponentPromise ??= import('./wuic-framework-lib-pivot-builder.component-BUkGGFaw.mjs').then((m) => m.PivotBuilderComponent);
64005
64020
  this.loadedComponent = await pivotBuilderComponentPromise;
64006
64021
  this.cdr.markForCheck();
64007
64022
  }
@@ -64040,7 +64055,7 @@ class WorkflowDesignerRouteComponent {
64040
64055
  * Inizializza il componente preparando stato, sottoscrizioni e primi caricamenti richiesti.
64041
64056
  */
64042
64057
  async ngOnInit() {
64043
- workflowDesignerComponentPromise ??= import('./wuic-framework-lib-workflow-designer.component-D32ZMxq2.mjs').then((m) => m.WorkflowDesignerComponent);
64058
+ workflowDesignerComponentPromise ??= import('./wuic-framework-lib-workflow-designer.component-BXnoS_ts.mjs').then((m) => m.WorkflowDesignerComponent);
64044
64059
  this.loadedComponent = await workflowDesignerComponentPromise;
64045
64060
  }
64046
64061
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: WorkflowDesignerRouteComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
@@ -64086,7 +64101,7 @@ class Scene3dDesignerRouteComponent {
64086
64101
  /** Componente designer runtime caricato lazy, usato dal template. */
64087
64102
  loadedComponent = null;
64088
64103
  async ngOnInit() {
64089
- scene3dDesignerComponentPromise ??= import('./wuic-framework-lib-scene3d-designer.component-LhC0KzWO.mjs').then(function (n) { return n.s; }).then((m) => m.Scene3dDesignerComponent);
64104
+ scene3dDesignerComponentPromise ??= import('./wuic-framework-lib-scene3d-designer.component-DyVwOmXa.mjs').then(function (n) { return n.s; }).then((m) => m.Scene3dDesignerComponent);
64090
64105
  this.loadedComponent = await scene3dDesignerComponentPromise;
64091
64106
  }
64092
64107
  /** Delega al designer runtime la conferma navigazione con pending changes. */
@@ -64142,7 +64157,7 @@ class Scene3dViewerRouteComponent {
64142
64157
  /** Componente viewer runtime caricato lazy, usato dal template. */
64143
64158
  loadedComponent = null;
64144
64159
  async ngOnInit() {
64145
- scene3dViewerComponentPromise ??= import('./wuic-framework-lib-scene3d-viewer.component-DiDqJO-P.mjs').then((m) => m.Scene3dViewerComponent);
64160
+ scene3dViewerComponentPromise ??= import('./wuic-framework-lib-scene3d-viewer.component-G_ykpDDF.mjs').then((m) => m.Scene3dViewerComponent);
64146
64161
  this.loadedComponent = await scene3dViewerComponentPromise;
64147
64162
  }
64148
64163
  static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "21.2.9", ngImport: i0, type: Scene3dViewerRouteComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
@@ -64203,7 +64218,7 @@ class LazyReportDesignerComponent {
64203
64218
  this.cdr = cdr;
64204
64219
  }
64205
64220
  async ngOnInit() {
64206
- reportDesignerComponentPromise ??= import('./wuic-framework-lib-report-designer.component-QRxxueU-.mjs').then((m) => m.ReportDesignerComponent);
64221
+ reportDesignerComponentPromise ??= import('./wuic-framework-lib-report-designer.component-A6_tmp6z.mjs').then((m) => m.ReportDesignerComponent);
64207
64222
  this.loadedComponent = await reportDesignerComponentPromise;
64208
64223
  this.cdr.markForCheck();
64209
64224
  }
@@ -64258,7 +64273,7 @@ class LazyReportViewerComponent {
64258
64273
  this.cdr = cdr;
64259
64274
  }
64260
64275
  async ngOnInit() {
64261
- reportViewerComponentPromise ??= import('./wuic-framework-lib-report-viewer.component-CuXw3e0j.mjs').then((m) => m.ReportViewerComponent);
64276
+ reportViewerComponentPromise ??= import('./wuic-framework-lib-report-viewer.component-CYl77DcU.mjs').then((m) => m.ReportViewerComponent);
64262
64277
  this.loadedComponent = await reportViewerComponentPromise;
64263
64278
  this.cdr.markForCheck();
64264
64279
  }
@@ -68582,7 +68597,7 @@ const themeBuilderPendingChangesGuard = (component) => {
68582
68597
  const routes = [
68583
68598
  {
68584
68599
  path: 'framework-docs',
68585
- loadComponent: () => import('./wuic-framework-lib-framework-docs.component-CGsugPCx.mjs').then((m) => m.FrameworkDocsComponent),
68600
+ loadComponent: () => import('./wuic-framework-lib-framework-docs.component-CcyeNUzz.mjs').then((m) => m.FrameworkDocsComponent),
68586
68601
  canMatch: [menuRouteAccessCanMatchGuard],
68587
68602
  canActivate: [menuRouteAccessCanActivateGuard],
68588
68603
  data: {
@@ -68591,7 +68606,7 @@ const routes = [
68591
68606
  },
68592
68607
  {
68593
68608
  path: 'framework-docs/:slug',
68594
- loadComponent: () => import('./wuic-framework-lib-framework-docs.component-CGsugPCx.mjs').then((m) => m.FrameworkDocsComponent),
68609
+ loadComponent: () => import('./wuic-framework-lib-framework-docs.component-CcyeNUzz.mjs').then((m) => m.FrameworkDocsComponent),
68595
68610
  canMatch: [menuRouteAccessCanMatchGuard],
68596
68611
  canActivate: [menuRouteAccessCanActivateGuard],
68597
68612
  data: {
@@ -68636,7 +68651,7 @@ const routes = [
68636
68651
  },
68637
68652
  {
68638
68653
  path: ':route/report-designer',
68639
- loadComponent: () => import('./wuic-framework-lib-report-designer.component-QRxxueU-.mjs').then((m) => m.ReportDesignerComponent),
68654
+ loadComponent: () => import('./wuic-framework-lib-report-designer.component-A6_tmp6z.mjs').then((m) => m.ReportDesignerComponent),
68640
68655
  canMatch: [menuRouteAccessCanMatchGuard, featureRouteCanMatchGuard],
68641
68656
  canActivate: [menuRouteAccessCanActivateGuard, featureRouteCanActivateGuard],
68642
68657
  data: {
@@ -68646,7 +68661,7 @@ const routes = [
68646
68661
  },
68647
68662
  {
68648
68663
  path: ':route/report-viewer',
68649
- loadComponent: () => import('./wuic-framework-lib-report-viewer.component-CuXw3e0j.mjs').then((m) => m.ReportViewerComponent),
68664
+ loadComponent: () => import('./wuic-framework-lib-report-viewer.component-CYl77DcU.mjs').then((m) => m.ReportViewerComponent),
68650
68665
  canMatch: [menuRouteAccessCanMatchGuard],
68651
68666
  canActivate: [menuRouteAccessCanActivateGuard],
68652
68667
  data: {
@@ -68666,7 +68681,7 @@ const routes = [
68666
68681
  },
68667
68682
  {
68668
68683
  path: ':route/pivot-builder',
68669
- loadComponent: () => import('./wuic-framework-lib-pivot-builder.component-S5zqy3vj.mjs').then((m) => m.PivotBuilderComponent),
68684
+ loadComponent: () => import('./wuic-framework-lib-pivot-builder.component-BUkGGFaw.mjs').then((m) => m.PivotBuilderComponent),
68670
68685
  canMatch: [menuRouteAccessCanMatchGuard, featureRouteCanMatchGuard],
68671
68686
  canActivate: [menuRouteAccessCanActivateGuard, featureRouteCanActivateGuard],
68672
68687
  data: {
@@ -68676,7 +68691,7 @@ const routes = [
68676
68691
  },
68677
68692
  {
68678
68693
  path: 'pivot-builder',
68679
- loadComponent: () => import('./wuic-framework-lib-pivot-builder.component-S5zqy3vj.mjs').then((m) => m.PivotBuilderComponent),
68694
+ loadComponent: () => import('./wuic-framework-lib-pivot-builder.component-BUkGGFaw.mjs').then((m) => m.PivotBuilderComponent),
68680
68695
  canMatch: [menuRouteAccessCanMatchGuard, featureRouteCanMatchGuard],
68681
68696
  canActivate: [menuRouteAccessCanActivateGuard, featureRouteCanActivateGuard],
68682
68697
  data: {
@@ -70776,4 +70791,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "21.2.9", ngImpor
70776
70791
  */
70777
70792
 
70778
70793
  export { DEFAULT_THEME_VALUE as $, ArchetypeConfiguratorComponent as A, AuthSessionService as B, ChatbotHostRegistryService as C, DynamicGenericTemplateComponent as D, BooleanEditorComponent as E, FilterBarComponent as F, GlobalHandler as G, BoundedRepeaterComponent as H, ImportExportButtonComponent as I, ButtonEditorComponent as J, CUSTOM_THEMES_STORAGE_KEY as K, LazyParametricDialogComponent as L, MetadataProviderService as M, CallbackPipe as N, CallbackPipe2 as O, PagerComponent as P, CarouselListComponent as Q, CodeAreaEditorComponent as R, ColorEditorComponent as S, TranslationManagerService as T, UserInfoService as U, CrashReporterService as V, WtoolboxService as W, CustomAttributesService as X, CustomException as Y, DEFAULT_FONT_STACK as Z, DEFAULT_THEME_STORAGE_KEY as _, DynamicCompilerService as a, UserMenuComponent as a$, DataActionButtonComponent as a0, DataProviderOdataService as a1, DateEditorComponent as a2, DesignerRouteComponent as a3, DictionaryEditorComponent as a4, DynamicRowTemplateComponent as a5, FormatGridViewValuePipe as a6, GetSrcUploadPreviewPipe as a7, HtmlEditorComponent as a8, ImageWrapperComponent as a9, NumberEditorComponent as aA, PALETTE_STOPS as aB, PREVIEW_RESTORE_KEY as aC, PRIMARY_PALETTES as aD, PerformanceInspectorComponent as aE, PointFilterComponent as aF, PropertyArrayEditorComponent as aG, PropertyObjectEditorComponent as aH, RAG_DESTRUCTIVE_KINDS as aI, RouteMetricsDashboardComponent as aJ, Scene3dDesignerRouteComponent as aK, Scene3dViewerRouteComponent as aL, THEME_MODE_STORAGE_KEY as aM, THEME_OPTIONS as aN, THEME_STORAGE_KEY as aO, TextAreaEditorComponent as aP, TextEditorComponent as aQ, ThemeBuilderComponent as aR, ThemeCatalogService as aS, ThemePreviewPanelComponent as aT, ThemeRuntimeService as aU, ThemeSelectorComponent as aV, TreeListComponent as aW, TreeViewSelectorComponent as aX, UploadDialogComponent as aY, UploadEditorComponent as aZ, UserLanguageService as a_, IsSelectedRowPipe as aa, KanbanListComponent as ab, KanbanOptions as ac, KanbanStatusColumnItem as ad, LazyChartListComponent as ae, LazyCodeEditorComponent as af, LazyDataActionButtonComponent as ag, LazyDataSourceComponent as ah, LazyFieldEditorComponent as ai, LazyFirstRunWizardComponent as aj, LazyImageWrapperComponent as ak, LazyKanbanListComponent as al, LazyMetaMenuComponent as am, LazyPivotBuilderComponent as an, LazyReportDesignerComponent as ao, LazyReportViewerComponent as ap, LazySchedulerListComponent as aq, LazySpreadsheetListSfComponent as ar, LazyTimelineListComponent as as, ListGridComponent as at, LookupEditorComponent as au, MapListComponent as av, MetaMenuComponent as aw, MetadatiTabella as ax, NotificationBellComponent as ay, NotificationRealtimeService as az, DataSourceComponent as b, resolveThemePresetForOption as b$, ValidationRule as b0, ValueChangedPayload as b1, VisibleFieldListPipe as b2, WUIC_FONT_CATALOG as b3, WidgetDefinition as b4, WorkflowDesignerRouteComponent as b5, WorkflowRunnerComponent as b6, WuicAziendaSwitcherComponent as b7, WuicErrorDialogComponent as b8, WuicErrorInterceptor as b9, isDestructiveRagAction as bA, isRoutePersistenceEnabled as bB, loadBooleanEditorComponent as bC, loadButtonEditorComponent as bD, loadCodeAreaEditorComponent as bE, loadColorEditorComponent as bF, loadDateEditorComponent as bG, loadDictionaryEditorComponent as bH, loadHtmlEditorComponent as bI, loadLookupEditorComponent as bJ, loadNumberEditorComponent as bK, loadPropertyArrayEditorComponent as bL, loadPropertyObjectEditorComponent as bM, loadTextAreaEditorComponent as bN, loadTextEditorComponent as bO, loadTreeViewSelectorComponent as bP, loadUploadEditorComponent as bQ, menuRouteAccessCanActivateGuard as bR, menuRouteAccessCanMatchGuard as bS, nearestPrimaryName as bT, normalizeHex$1 as bU, oklchToHex as bV, oklchToRgb as bW, resolveBackgroundCss as bX, resolveFontStack as bY, resolveGridStrengths as bZ, resolveThemePreset as b_, WuicFeatureDirective as ba, WuicFrozenColumnDirective as bb, WuicRagChatbotComponent as bc, WuicRagChatbotFabComponent as bd, WuicRagService as be, WuicRowTogglerDirective as bf, _PRIMENG_TABLE_DIRECTIVES_NAMES as bg, authExpiredInterceptor as bh, bestContrastColor as bi, boundedRepeaterPendingChangesGuard as bj, buildCustomPreset as bk, buildThemeValue as bl, computeDataQualitySummary as bm, contrastRatio as bn, createDraftTheme as bo, featureRouteCanActivateGuard as bp, featureRouteCanMatchGuard as bq, generatePrimaryPalette as br, generateSurfacePalette as bs, getQualityInspectorOptions as bt, getThemePrimaryHex as bu, hexToOklch as bv, hexToRgb as bw, hsbaToRgbaString as bx, inferTemplateFieldFromBaseClass as by, isCustomThemeValue as bz, DataRepeaterComponent as c, rgbToHex as c0, rgbToOklch as c1, rgbaToHsbaModel as c2, routeMetricsClient as c3, routes as c4, scene3dDesignerPendingChangesGuard as c5, themeBuilderPendingChangesGuard as c6, wcagLevel as c7, wuicErrorInterceptor as c8, parametricDialog_component as c9, clampAlpha as d, toPersistedColor as e, ParametricDialogComponent as f, MetadatiColonna as g, DataProviderService as h, MetadataEditorService as i, WorkflowRuntimeMetadataService as j, FieldEditorComponent as k, MetadataEditorComponent as l, WuicClientException as m, WuicErrorCodes as n, MetaInfo as o, WUIC_SUPPRESS_GLOBAL_ERROR as p, FilterInfo as q, LicenseFeatureService as r, FilterItem as s, toHsbaModel as t, TimelineOptions as u, getThemeOptions as v, AUTH_REDIRECT_REASON_KEY as w, AppHeaderComponent as x, AppHeaderConfigService as y, AppSettingsEditorComponent as z };
70779
- //# sourceMappingURL=wuic-framework-lib-wuic-framework-lib-81WUtxz8.mjs.map
70794
+ //# sourceMappingURL=wuic-framework-lib-wuic-framework-lib-54sySY_p.mjs.map
@@ -1,2 +1,2 @@
1
- export { w as AUTH_REDIRECT_REASON_KEY, x as AppHeaderComponent, y as AppHeaderConfigService, z as AppSettingsEditorComponent, B as AuthSessionService, E as BooleanEditorComponent, H as BoundedRepeaterComponent, J as ButtonEditorComponent, K as CUSTOM_THEMES_STORAGE_KEY, N as CallbackPipe, O as CallbackPipe2, Q as CarouselListComponent, R as CodeAreaEditorComponent, S as ColorEditorComponent, V as CrashReporterService, X as CustomAttributesService, Y as CustomException, Z as DEFAULT_FONT_STACK, _ as DEFAULT_THEME_STORAGE_KEY, $ as DEFAULT_THEME_VALUE, a0 as DataActionButtonComponent, a1 as DataProviderOdataService, c as DataRepeaterComponent, b as DataSourceComponent, a2 as DateEditorComponent, a3 as DesignerRouteComponent, a4 as DictionaryEditorComponent, a as DynamicCompilerService, a5 as DynamicRowTemplateComponent, k as FieldEditorComponent, F as FilterBarComponent, q as FilterInfo, a6 as FormatGridViewValuePipe, a7 as GetSrcUploadPreviewPipe, G as GlobalHandler, a8 as HtmlEditorComponent, a9 as ImageWrapperComponent, I as ImportExportButtonComponent, aa as IsSelectedRowPipe, ab as KanbanListComponent, ac as KanbanOptions, ad as KanbanStatusColumnItem, ae as LazyChartListComponent, af as LazyCodeEditorComponent, ag as LazyDataActionButtonComponent, ah as LazyDataSourceComponent, ai as LazyFieldEditorComponent, aj as LazyFirstRunWizardComponent, ak as LazyImageWrapperComponent, al as LazyKanbanListComponent, am as LazyMetaMenuComponent, an as LazyPivotBuilderComponent, ao as LazyReportDesignerComponent, ap as LazyReportViewerComponent, aq as LazySchedulerListComponent, ar as LazySpreadsheetListSfComponent, as as LazyTimelineListComponent, r as LicenseFeatureService, at as ListGridComponent, au as LookupEditorComponent, av as MapListComponent, o as MetaInfo, aw as MetaMenuComponent, i as MetadataEditorService, M as MetadataProviderService, g as MetadatiColonna, ax as MetadatiTabella, ay as NotificationBellComponent, az as NotificationRealtimeService, aA as NumberEditorComponent, aB as PALETTE_STOPS, aC as PREVIEW_RESTORE_KEY, aD as PRIMARY_PALETTES, P as PagerComponent, f as ParametricDialogComponent, aE as PerformanceInspectorComponent, aF as PointFilterComponent, aG as PropertyArrayEditorComponent, aH as PropertyObjectEditorComponent, aI as RAG_DESTRUCTIVE_KINDS, aJ as RouteMetricsDashboardComponent, aK as Scene3dDesignerRouteComponent, aL as Scene3dViewerRouteComponent, aM as THEME_MODE_STORAGE_KEY, aN as THEME_OPTIONS, aO as THEME_STORAGE_KEY, aP as TextAreaEditorComponent, aQ as TextEditorComponent, aR as ThemeBuilderComponent, aS as ThemeCatalogService, aT as ThemePreviewPanelComponent, aU as ThemeRuntimeService, aV as ThemeSelectorComponent, u as TimelineOptions, T as TranslationManagerService, aW as TreeListComponent, aX as TreeViewSelectorComponent, aY as UploadDialogComponent, aZ as UploadEditorComponent, U as UserInfoService, a_ as UserLanguageService, a$ as UserMenuComponent, b0 as ValidationRule, b1 as ValueChangedPayload, b2 as VisibleFieldListPipe, b3 as WUIC_FONT_CATALOG, p as WUIC_SUPPRESS_GLOBAL_ERROR, b4 as WidgetDefinition, b5 as WorkflowDesignerRouteComponent, b6 as WorkflowRunnerComponent, j as WorkflowRuntimeMetadataService, W as WtoolboxService, b7 as WuicAziendaSwitcherComponent, b8 as WuicErrorDialogComponent, b9 as WuicErrorInterceptor, ba as WuicFeatureDirective, bb as WuicFrozenColumnDirective, bc as WuicRagChatbotComponent, bd as WuicRagChatbotFabComponent, be as WuicRagService, bf as WuicRowTogglerDirective, bg as _PRIMENG_TABLE_DIRECTIVES_NAMES, bh as authExpiredInterceptor, bi as bestContrastColor, bj as boundedRepeaterPendingChangesGuard, bk as buildCustomPreset, bl as buildThemeValue, d as clampAlpha, bm as computeDataQualitySummary, bn as contrastRatio, bo as createDraftTheme, bp as featureRouteCanActivateGuard, bq as featureRouteCanMatchGuard, br as generatePrimaryPalette, bs as generateSurfacePalette, bt as getQualityInspectorOptions, v as getThemeOptions, bu as getThemePrimaryHex, bv as hexToOklch, bw as hexToRgb, bx as hsbaToRgbaString, by as inferTemplateFieldFromBaseClass, bz as isCustomThemeValue, bA as isDestructiveRagAction, bB as isRoutePersistenceEnabled, bC as loadBooleanEditorComponent, bD as loadButtonEditorComponent, bE as loadCodeAreaEditorComponent, bF as loadColorEditorComponent, bG as loadDateEditorComponent, bH as loadDictionaryEditorComponent, bI as loadHtmlEditorComponent, bJ as loadLookupEditorComponent, bK as loadNumberEditorComponent, bL as loadPropertyArrayEditorComponent, bM as loadPropertyObjectEditorComponent, bN as loadTextAreaEditorComponent, bO as loadTextEditorComponent, bP as loadTreeViewSelectorComponent, bQ as loadUploadEditorComponent, bR as menuRouteAccessCanActivateGuard, bS as menuRouteAccessCanMatchGuard, bT as nearestPrimaryName, bU as normalizeHex, bV as oklchToHex, bW as oklchToRgb, bX as resolveBackgroundCss, bY as resolveFontStack, bZ as resolveGridStrengths, b_ as resolveThemePreset, b$ as resolveThemePresetForOption, c0 as rgbToHex, c1 as rgbToOklch, c2 as rgbaToHsbaModel, c3 as routeMetricsClient, c4 as routes, c5 as scene3dDesignerPendingChangesGuard, c6 as themeBuilderPendingChangesGuard, t as toHsbaModel, e as toPersistedColor, c7 as wcagLevel, c8 as wuicErrorInterceptor } from './wuic-framework-lib-wuic-framework-lib-81WUtxz8.mjs';
1
+ export { w as AUTH_REDIRECT_REASON_KEY, x as AppHeaderComponent, y as AppHeaderConfigService, z as AppSettingsEditorComponent, B as AuthSessionService, E as BooleanEditorComponent, H as BoundedRepeaterComponent, J as ButtonEditorComponent, K as CUSTOM_THEMES_STORAGE_KEY, N as CallbackPipe, O as CallbackPipe2, Q as CarouselListComponent, R as CodeAreaEditorComponent, S as ColorEditorComponent, V as CrashReporterService, X as CustomAttributesService, Y as CustomException, Z as DEFAULT_FONT_STACK, _ as DEFAULT_THEME_STORAGE_KEY, $ as DEFAULT_THEME_VALUE, a0 as DataActionButtonComponent, a1 as DataProviderOdataService, c as DataRepeaterComponent, b as DataSourceComponent, a2 as DateEditorComponent, a3 as DesignerRouteComponent, a4 as DictionaryEditorComponent, a as DynamicCompilerService, a5 as DynamicRowTemplateComponent, k as FieldEditorComponent, F as FilterBarComponent, q as FilterInfo, a6 as FormatGridViewValuePipe, a7 as GetSrcUploadPreviewPipe, G as GlobalHandler, a8 as HtmlEditorComponent, a9 as ImageWrapperComponent, I as ImportExportButtonComponent, aa as IsSelectedRowPipe, ab as KanbanListComponent, ac as KanbanOptions, ad as KanbanStatusColumnItem, ae as LazyChartListComponent, af as LazyCodeEditorComponent, ag as LazyDataActionButtonComponent, ah as LazyDataSourceComponent, ai as LazyFieldEditorComponent, aj as LazyFirstRunWizardComponent, ak as LazyImageWrapperComponent, al as LazyKanbanListComponent, am as LazyMetaMenuComponent, an as LazyPivotBuilderComponent, ao as LazyReportDesignerComponent, ap as LazyReportViewerComponent, aq as LazySchedulerListComponent, ar as LazySpreadsheetListSfComponent, as as LazyTimelineListComponent, r as LicenseFeatureService, at as ListGridComponent, au as LookupEditorComponent, av as MapListComponent, o as MetaInfo, aw as MetaMenuComponent, i as MetadataEditorService, M as MetadataProviderService, g as MetadatiColonna, ax as MetadatiTabella, ay as NotificationBellComponent, az as NotificationRealtimeService, aA as NumberEditorComponent, aB as PALETTE_STOPS, aC as PREVIEW_RESTORE_KEY, aD as PRIMARY_PALETTES, P as PagerComponent, f as ParametricDialogComponent, aE as PerformanceInspectorComponent, aF as PointFilterComponent, aG as PropertyArrayEditorComponent, aH as PropertyObjectEditorComponent, aI as RAG_DESTRUCTIVE_KINDS, aJ as RouteMetricsDashboardComponent, aK as Scene3dDesignerRouteComponent, aL as Scene3dViewerRouteComponent, aM as THEME_MODE_STORAGE_KEY, aN as THEME_OPTIONS, aO as THEME_STORAGE_KEY, aP as TextAreaEditorComponent, aQ as TextEditorComponent, aR as ThemeBuilderComponent, aS as ThemeCatalogService, aT as ThemePreviewPanelComponent, aU as ThemeRuntimeService, aV as ThemeSelectorComponent, u as TimelineOptions, T as TranslationManagerService, aW as TreeListComponent, aX as TreeViewSelectorComponent, aY as UploadDialogComponent, aZ as UploadEditorComponent, U as UserInfoService, a_ as UserLanguageService, a$ as UserMenuComponent, b0 as ValidationRule, b1 as ValueChangedPayload, b2 as VisibleFieldListPipe, b3 as WUIC_FONT_CATALOG, p as WUIC_SUPPRESS_GLOBAL_ERROR, b4 as WidgetDefinition, b5 as WorkflowDesignerRouteComponent, b6 as WorkflowRunnerComponent, j as WorkflowRuntimeMetadataService, W as WtoolboxService, b7 as WuicAziendaSwitcherComponent, b8 as WuicErrorDialogComponent, b9 as WuicErrorInterceptor, ba as WuicFeatureDirective, bb as WuicFrozenColumnDirective, bc as WuicRagChatbotComponent, bd as WuicRagChatbotFabComponent, be as WuicRagService, bf as WuicRowTogglerDirective, bg as _PRIMENG_TABLE_DIRECTIVES_NAMES, bh as authExpiredInterceptor, bi as bestContrastColor, bj as boundedRepeaterPendingChangesGuard, bk as buildCustomPreset, bl as buildThemeValue, d as clampAlpha, bm as computeDataQualitySummary, bn as contrastRatio, bo as createDraftTheme, bp as featureRouteCanActivateGuard, bq as featureRouteCanMatchGuard, br as generatePrimaryPalette, bs as generateSurfacePalette, bt as getQualityInspectorOptions, v as getThemeOptions, bu as getThemePrimaryHex, bv as hexToOklch, bw as hexToRgb, bx as hsbaToRgbaString, by as inferTemplateFieldFromBaseClass, bz as isCustomThemeValue, bA as isDestructiveRagAction, bB as isRoutePersistenceEnabled, bC as loadBooleanEditorComponent, bD as loadButtonEditorComponent, bE as loadCodeAreaEditorComponent, bF as loadColorEditorComponent, bG as loadDateEditorComponent, bH as loadDictionaryEditorComponent, bI as loadHtmlEditorComponent, bJ as loadLookupEditorComponent, bK as loadNumberEditorComponent, bL as loadPropertyArrayEditorComponent, bM as loadPropertyObjectEditorComponent, bN as loadTextAreaEditorComponent, bO as loadTextEditorComponent, bP as loadTreeViewSelectorComponent, bQ as loadUploadEditorComponent, bR as menuRouteAccessCanActivateGuard, bS as menuRouteAccessCanMatchGuard, bT as nearestPrimaryName, bU as normalizeHex, bV as oklchToHex, bW as oklchToRgb, bX as resolveBackgroundCss, bY as resolveFontStack, bZ as resolveGridStrengths, b_ as resolveThemePreset, b$ as resolveThemePresetForOption, c0 as rgbToHex, c1 as rgbToOklch, c2 as rgbaToHsbaModel, c3 as routeMetricsClient, c4 as routes, c5 as scene3dDesignerPendingChangesGuard, c6 as themeBuilderPendingChangesGuard, t as toHsbaModel, e as toPersistedColor, c7 as wcagLevel, c8 as wuicErrorInterceptor } from './wuic-framework-lib-wuic-framework-lib-54sySY_p.mjs';
2
2
  //# sourceMappingURL=wuic-framework-lib.mjs.map
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "wuic-framework-lib",
3
- "version": "1.7.2",
3
+ "version": "1.7.3",
4
4
  "description": "Wuic Angular Framework Library",
5
5
  "author": "Wuic",
6
6
  "license": "MIT",
@@ -3494,7 +3494,7 @@ declare class MetadataProviderService {
3494
3494
  * @param col Metadato colonna da analizzare.
3495
3495
  * @returns Nome tipo TypeScript stimato (`string`, `number`, `boolean`, `Date`, `any`).
3496
3496
  */
3497
- static getTSTypeFromMetaColumn(col: MetadatiColonna): "string" | "number" | "any" | "boolean" | "Date";
3497
+ static getTSTypeFromMetaColumn(col: MetadatiColonna): "number" | "boolean" | "string" | "any" | "Date";
3498
3498
  /**
3499
3499
  * Normalizza e arricchisce i metadata colonna/tabella: ordina campi, inizializza callback dinamiche, parse di bag JSON
3500
3500
  * e garantisce fallback robusti per funzioni custom non compilabili.
@@ -6051,7 +6051,7 @@ declare class RouteMetricsDashboardComponent implements OnInit {
6051
6051
  datasets: any[];
6052
6052
  }>;
6053
6053
  /** Vista attiva: chart o tabella (stessi dati/filtri). */
6054
- readonly activeTab: i0.WritableSignal<"chart" | "table">;
6054
+ readonly activeTab: i0.WritableSignal<"table" | "chart">;
6055
6055
  /** Righe piatte per la tabella: una per (route, bucket) nel range. */
6056
6056
  readonly tableRows: i0.WritableSignal<{
6057
6057
  route: string;
@@ -9032,6 +9032,19 @@ declare class MapListComponent implements OnInit, AfterViewInit, OnDestroy, IBin
9032
9032
  mapsApiUnavailable: boolean;
9033
9033
  /** The Maps script sets `window.google.maps.importLibrary` once it has loaded. */
9034
9034
  static isMapsApiAvailable(): boolean;
9035
+ /**
9036
+ * Il template monta `<google-map>` solo se questo e' vero.
9037
+ *
9038
+ * Serve un GETTER e non `!mapsApiUnavailable`: quel flag viene alzato dentro la
9039
+ * sottoscrizione al datasource, cioe' dopo che il template e' gia' stato valutato almeno
9040
+ * una volta. In quella finestra `<google-map>` di @angular/google-maps si costruiva e
9041
+ * lanciava `ReferenceError: google is not defined` dal suo codice interno; l'eccezione
9042
+ * risaliva al dialog di errore applicativo e bloccava l'intera UI, che e' proprio il guasto
9043
+ * che l'avviso in pagina doveva sostituire. Essendo un getter, la condizione viene rivalutata
9044
+ * a ogni ciclo di change detection: se lo script di Maps arriva piu' tardi, la mappa compare
9045
+ * da sola senza ricaricare.
9046
+ */
9047
+ get mapsApiReady(): boolean;
9035
9048
  MAP_LIB: google.maps.MapsLibrary;
9036
9049
  /**
9037
9050
  * Proprieta di stato del componente per marker lib, usata dalla logica interna e dal template.