@esfaenza/dpe-builder 20.3.15 → 20.3.16

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.
@@ -540,10 +540,10 @@ class HttpDpeBuilderApi extends DpeBuilderApi {
540
540
  deleteDefinition(name) {
541
541
  return this.request('deleteDefinition', () => this.httpDelete(`/definitions/${this.segment(this.requireKey(name, 'deleteDefinition', 'il nome della definizione'))}`));
542
542
  }
543
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.32", ngImport: i0, type: HttpDpeBuilderApi, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
544
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.32", ngImport: i0, type: HttpDpeBuilderApi });
543
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: HttpDpeBuilderApi, deps: null, target: i0.ɵɵFactoryTarget.Injectable });
544
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: HttpDpeBuilderApi });
545
545
  }
546
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.32", ngImport: i0, type: HttpDpeBuilderApi, decorators: [{
546
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: HttpDpeBuilderApi, decorators: [{
547
547
  type: Injectable
548
548
  }] });
549
549
  /**
@@ -2112,10 +2112,10 @@ class DpeDocumentStore {
2112
2112
  this._future.set([]);
2113
2113
  this._definition.set(next);
2114
2114
  }
2115
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.32", ngImport: i0, type: DpeDocumentStore, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
2116
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.32", ngImport: i0, type: DpeDocumentStore });
2115
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: DpeDocumentStore, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
2116
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: DpeDocumentStore });
2117
2117
  }
2118
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.32", ngImport: i0, type: DpeDocumentStore, decorators: [{
2118
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: DpeDocumentStore, decorators: [{
2119
2119
  type: Injectable
2120
2120
  }] });
2121
2121
 
@@ -2301,10 +2301,10 @@ class DpeCatalogStore {
2301
2301
  const message = error instanceof Error ? error.message : 'Errore inatteso dal backend.';
2302
2302
  return new DpeApiError('Transport', message, error);
2303
2303
  }
2304
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.32", ngImport: i0, type: DpeCatalogStore, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
2305
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.32", ngImport: i0, type: DpeCatalogStore });
2304
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: DpeCatalogStore, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
2305
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: DpeCatalogStore });
2306
2306
  }
2307
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.32", ngImport: i0, type: DpeCatalogStore, decorators: [{
2307
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: DpeCatalogStore, decorators: [{
2308
2308
  type: Injectable
2309
2309
  }], ctorParameters: () => [] });
2310
2310
 
@@ -2936,10 +2936,10 @@ class DpeValidationService {
2936
2936
  const message = error instanceof Error ? error.message : 'Errore inatteso dal backend.';
2937
2937
  return new DpeApiError('Transport', message, error);
2938
2938
  }
2939
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.32", ngImport: i0, type: DpeValidationService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
2940
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.32", ngImport: i0, type: DpeValidationService });
2939
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: DpeValidationService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
2940
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: DpeValidationService });
2941
2941
  }
2942
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.32", ngImport: i0, type: DpeValidationService, decorators: [{
2942
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: DpeValidationService, decorators: [{
2943
2943
  type: Injectable
2944
2944
  }], ctorParameters: () => [] });
2945
2945
 
@@ -3262,10 +3262,10 @@ class DpeFormulaCatalogStore {
3262
3262
  }
3263
3263
  this._pending.set(next);
3264
3264
  }
3265
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.32", ngImport: i0, type: DpeFormulaCatalogStore, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
3266
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.32", ngImport: i0, type: DpeFormulaCatalogStore });
3265
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: DpeFormulaCatalogStore, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
3266
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: DpeFormulaCatalogStore });
3267
3267
  }
3268
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.32", ngImport: i0, type: DpeFormulaCatalogStore, decorators: [{
3268
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: DpeFormulaCatalogStore, decorators: [{
3269
3269
  type: Injectable
3270
3270
  }], ctorParameters: () => [] });
3271
3271
 
@@ -3343,10 +3343,10 @@ class DpeLayoutService {
3343
3343
  }
3344
3344
  return positions;
3345
3345
  }
3346
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.32", ngImport: i0, type: DpeLayoutService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
3347
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.32", ngImport: i0, type: DpeLayoutService });
3346
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: DpeLayoutService, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
3347
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: DpeLayoutService });
3348
3348
  }
3349
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.32", ngImport: i0, type: DpeLayoutService, decorators: [{
3349
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: DpeLayoutService, decorators: [{
3350
3350
  type: Injectable
3351
3351
  }] });
3352
3352
 
@@ -3423,10 +3423,10 @@ class DpeMetadataStore {
3423
3423
  next.set(tableName, state);
3424
3424
  this._byName.set(next);
3425
3425
  }
3426
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.32", ngImport: i0, type: DpeMetadataStore, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
3427
- static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.32", ngImport: i0, type: DpeMetadataStore });
3426
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: DpeMetadataStore, deps: [], target: i0.ɵɵFactoryTarget.Injectable });
3427
+ static ɵprov = i0.ɵɵngDeclareInjectable({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: DpeMetadataStore });
3428
3428
  }
3429
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.32", ngImport: i0, type: DpeMetadataStore, decorators: [{
3429
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: DpeMetadataStore, decorators: [{
3430
3430
  type: Injectable
3431
3431
  }] });
3432
3432
 
@@ -3555,8 +3555,8 @@ function dpeIsRectFullyVisible(target, view, margin = 0) {
3555
3555
  class DpeNodeIconComponent {
3556
3556
  collection = input.required(...(ngDevMode ? [{ debugName: "collection" }] : []));
3557
3557
  paths = computed(() => dpeNodeIconPaths(this.collection()), ...(ngDevMode ? [{ debugName: "paths" }] : []));
3558
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.32", ngImport: i0, type: DpeNodeIconComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
3559
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.32", type: DpeNodeIconComponent, isStandalone: true, selector: "dpe-node-icon", inputs: { collection: { classPropertyName: "collection", publicName: "collection", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: `
3558
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: DpeNodeIconComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
3559
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.33", type: DpeNodeIconComponent, isStandalone: true, selector: "dpe-node-icon", inputs: { collection: { classPropertyName: "collection", publicName: "collection", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: `
3560
3560
  <svg
3561
3561
  viewBox="0 0 24 24"
3562
3562
  width="16"
@@ -3575,7 +3575,7 @@ class DpeNodeIconComponent {
3575
3575
  </svg>
3576
3576
  `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
3577
3577
  }
3578
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.32", ngImport: i0, type: DpeNodeIconComponent, decorators: [{
3578
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: DpeNodeIconComponent, decorators: [{
3579
3579
  type: Component,
3580
3580
  args: [{
3581
3581
  selector: 'dpe-node-icon',
@@ -4066,10 +4066,10 @@ class DpeCanvasComponent {
4066
4066
  isSelected(node) {
4067
4067
  return this.store.selectedNodeNameSet().has(node.name);
4068
4068
  }
4069
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.32", ngImport: i0, type: DpeCanvasComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
4070
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.32", type: DpeCanvasComponent, isStandalone: true, selector: "dpe-canvas", inputs: { isEditable: { classPropertyName: "isEditable", publicName: "isEditable", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { nodeOpened: "nodeOpened", nodeDropped: "nodeDropped" }, providers: [provideFFlow(withA11y())], viewQueries: [{ propertyName: "canvas", first: true, predicate: FCanvasComponent, descendants: true, isSignal: true }, { propertyName: "flow", first: true, predicate: FFlowComponent, descendants: true, isSignal: true }], ngImport: i0, template: "<!--\r\n Gerarchia obbligatoria: f-flow > f-canvas > fNode / f-connection. I `@for` stanno\r\n direttamente dentro <f-canvas>: senza wrapper non serve `ngProjectAs`.\r\n-->\r\n<!--\r\n `dpe-flow`: classe nostra sul contenitore della libreria, e serve al **CSS**. Il tema di\r\n @foblex/flow stila la card con `.f-flow .f-node` (due classi): un nostro `.dpe-node` non la\r\n batte, e senza questa classe la card torna larga 120px e col testo centrato. Con `dpe-flow` i\r\n selettori del foglio diventano `dpe-canvas .dpe-flow .dpe-node`, che vince per specificita' e\r\n non per ordine di caricamento.\r\n-->\r\n<f-flow\r\n class=\"dpe-flow\"\r\n fDraggable\r\n (fCreateConnection)=\"onCreateConnection($event)\"\r\n (fReassignConnection)=\"onReassignConnection($event)\"\r\n (fMoveNodes)=\"onMoveNodes($event)\"\r\n (fSelectionChange)=\"onSelectionChange($event)\"\r\n (fDeleteSelected)=\"onDeleteSelected($event)\"\r\n (fCreateNode)=\"onCreateNode($event)\"\r\n (fNodesRendered)=\"onNodesRendered()\"\r\n>\r\n <f-canvas fZoom #canvas (fCanvasChange)=\"onCanvasChange()\">\r\n <f-background>\r\n <f-circle-pattern />\r\n </f-background>\r\n\r\n @for (edge of edges(); track edge.id) {\r\n <!--\r\n La classe porta lo **slot** di destinazione: la primaria e la secondaria di un join\r\n vanno distinte a vista, altrimenti l\u2019unico modo di sapere quale lato e\u2019 quale e\u2019 aprire\r\n l\u2019ispettore. I colori stanno nel CSS globale, non qui: i path SVG sono creati a runtime\r\n e non portano l\u2019attributo di scope.\r\n -->\r\n <f-connection\r\n [fConnectionId]=\"edge.id\"\r\n [fSourceId]=\"edge.sourceId\"\r\n [fTargetId]=\"edge.targetId\"\r\n fBehavior=\"floating\"\r\n fType=\"bezier\"\r\n [class]=\"'dpe-edge dpe-edge--' + edge.slot\"\r\n >\r\n <f-connection-marker-arrow [type]=\"markerEnd\" />\r\n </f-connection>\r\n }\r\n\r\n @for (node of nodes(); track node.id) {\r\n <!--\r\n Nessun `[style.*]` sul nodo: @foblex/flow riscrive l\u2019attributo `style` a ogni\r\n riposizionamento e lo cancellerebbe. La larghezza arriva da `node.widthClass`.\r\n -->\r\n <div\r\n fNode\r\n fDragHandle\r\n [fNodeId]=\"node.id\"\r\n [fNodePosition]=\"node.position\"\r\n [class]=\"\r\n 'dpe-node dpe-node--' + node.collection + ' ' + node.widthClass + ' ' + node.familyClass\r\n \"\r\n [class.dpe-node--selected]=\"isSelected(node)\"\r\n [class.dpe-node--error]=\"node.severity === 'Error'\"\r\n [class.dpe-node--warning]=\"node.severity === 'Warning'\"\r\n [class.dpe-node--not-compilable]=\"node.isNotCompilable\"\r\n [attr.aria-label]=\"node.categoryLabel + ' ' + node.label\"\r\n (dblclick)=\"onNodeDoubleClick(node.name)\"\r\n >\r\n <!--\r\n Le porte di ingresso stanno in fila sul bordo superiore, una per slot. Si renderizzano\r\n **sempre**: un connettore con `display: none` ha geometria 0x0 e l\u2019arco si attacca nel\r\n punto sbagliato. `fConnectorConnectableSide` e\u2019 dichiarato: senza, un arco che risale\r\n entrerebbe di fianco.\r\n -->\r\n @if (node.ports.length > 0) {\r\n <div class=\"dpe-node__ports\" [class.dpe-node__ports--labelled]=\"node.showsPortLabels\">\r\n @for (port of node.ports; track port.id) {\r\n <div class=\"dpe-port\">\r\n <div\r\n fConnector\r\n fConnectorType=\"target\"\r\n [fConnectorId]=\"port.id\"\r\n [fConnectorConnectableSide]=\"sides.TOP\"\r\n fConnectorMultiple=\"false\"\r\n class=\"dpe-connector dpe-connector--in\"\r\n [class.dpe-connector--broken]=\"port.isBroken\"\r\n [title]=\"port.label\"\r\n ></div>\r\n @if (node.showsPortLabels) {\r\n <span class=\"dpe-port__label\" [title]=\"port.label\">{{ port.label }}</span>\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <div class=\"dpe-node__head\">\r\n <!--\r\n La stessa pastiglia della palette: cio\u2019 che si trascina deve assomigliare a cio\u2019 che\r\n compare. La classe di famiglia porta i due token di colore.\r\n -->\r\n <span class=\"dpe-node__icon\">\r\n <dpe-node-icon [collection]=\"node.collection\" />\r\n </span>\r\n <div class=\"dpe-node__text\">\r\n <span class=\"dpe-node__title\" [title]=\"node.label\">{{ node.label }}</span>\r\n <span class=\"dpe-node__sub\">\r\n {{ node.categoryLabel }}\r\n @if (node.subtitle) {\r\n <span class=\"dpe-node__dot\">\u00B7</span>{{ node.subtitle }}\r\n }\r\n </span>\r\n </div>\r\n <!--\r\n `fDragBlocker` sui bottoni dentro un nodo: senza, il pointerdown diventa un\r\n trascinamento e aprire l\u2019ispettore sposta il nodo di qualche pixel.\r\n -->\r\n <button\r\n type=\"button\"\r\n fDragBlocker\r\n class=\"dpe-node__btn\"\r\n [attr.aria-label]=\"'Apri l\u2019ispettore di ' + node.label\"\r\n title=\"Apri l\u2019ispettore\"\r\n (click)=\"onEditClick($event, node.name)\"\r\n >\r\n \u270E\r\n </button>\r\n @if (isEditable() && isSelected(node)) {\r\n <!--\r\n Solo sul nodo selezionato: un comando distruttivo che compare sotto il puntatore\r\n mentre si attraversa il grafo si preme per sbaglio.\r\n -->\r\n <button\r\n type=\"button\"\r\n fDragBlocker\r\n class=\"dpe-node__btn dpe-node__btn--remove\"\r\n [attr.aria-label]=\"'Elimina ' + node.label\"\r\n title=\"Elimina (si annulla con \u21B6)\"\r\n (click)=\"onRemoveClick($event, node.name)\"\r\n >\r\n \u00D7\r\n </button>\r\n }\r\n </div>\r\n\r\n <div class=\"dpe-node__meta\">\r\n <span class=\"dpe-node__name\" [title]=\"'Nome tecnico: ' + node.name\">{{ node.name }}</span>\r\n @if (node.columnCount !== null) {\r\n <span class=\"dpe-badge\" [title]=\"'Colonne in uscita secondo il backend'\">\r\n {{ node.columnCount }} col.\r\n </span>\r\n }\r\n @if (node.isNotCompilable) {\r\n <!--\r\n Stato distinto dall\u2019errore: la definizione va bene, il compilatore non ci arriva\r\n (I10). Colore proprio, testo che non chiede di correggere niente.\r\n -->\r\n <span class=\"dpe-badge dpe-badge--not-compilable\" title=\"Valido, ma non compilabile: e\u2019 un limite nostro\">\r\n non compilabile\r\n </span>\r\n }\r\n @if (node.diagnosticCount > 0) {\r\n <span\r\n class=\"dpe-badge\"\r\n [class.dpe-badge--error]=\"node.severity === 'Error'\"\r\n [class.dpe-badge--warning]=\"node.severity === 'Warning'\"\r\n [class.dpe-badge--info]=\"node.severity === 'Info'\"\r\n [title]=\"node.diagnosticCount + ' rilievi dal backend'\"\r\n >\r\n {{ node.diagnosticCount }}\r\n </span>\r\n }\r\n @for (port of node.ports; track $index) {\r\n @if (port.isBroken) {\r\n <span class=\"dpe-badge dpe-badge--error\" [title]=\"'Riferimento non risolto: ' + port.sourceName\">\r\n \u26A0 {{ port.sourceName }}\r\n </span>\r\n }\r\n }\r\n </div>\r\n\r\n <!--\r\n L\u2019uscita e\u2019 una sola: lo schema prodotto e\u2019 uno. I sink non ne hanno, e la porta non\r\n si disegna affatto \u2014 qui non c\u2019e\u2019 niente da nascondere con `display: none`, il\r\n connettore semplicemente non esiste.\r\n -->\r\n @if (node.hasOutput) {\r\n <div class=\"dpe-node__out\">\r\n <div\r\n fConnector\r\n fConnectorType=\"source\"\r\n [fConnectorId]=\"node.outputPortId\"\r\n [fConnectorConnectableSide]=\"sides.BOTTOM\"\r\n class=\"dpe-connector dpe-connector--out\"\r\n title=\"Uscita\"\r\n ></div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <f-connection-for-create fBehavior=\"floating\" fType=\"bezier\" class=\"dpe-edge dpe-edge--creating\">\r\n <f-connection-marker-arrow [type]=\"markerEnd\" />\r\n </f-connection-for-create>\r\n\r\n <f-selection-area />\r\n </f-canvas>\r\n\r\n <!--\r\n Fuori da <f-canvas> come la minimappa: dentro, la trasformazione del canvas se lo\r\n porterebbe via insieme ai nodi.\r\n -->\r\n <button\r\n type=\"button\"\r\n fDragBlocker\r\n class=\"dpe-viewport-reset\"\r\n [class.dpe-viewport-reset--hidden]=\"!isFitCommandVisible()\"\r\n title=\"Rimetti il grafo interamente in vista\"\r\n (click)=\"resetViewport()\"\r\n >\r\n \u2922 Inquadra\r\n </button>\r\n\r\n <f-minimap [fMinSize]=\"1200\" class=\"dpe-minimap\" />\r\n</f-flow>\r\n", dependencies: [{ kind: "ngmodule", type: FFlowModule }, { kind: "component", type: i1.FFlowComponent, selector: "f-flow", inputs: ["fFlowId", "fCache"], outputs: ["fNodesRendered", "fFullRendered", "fLoaded"] }, { kind: "component", type: i1.FCanvasComponent, selector: "f-canvas", inputs: ["position", "scale", "debounceTime", "fLayers"], outputs: ["fCanvasChange"] }, { kind: "component", type: i1.FBackgroundComponent, selector: "f-background" }, { kind: "component", type: i1.FCirclePatternComponent, selector: "f-circle-pattern", inputs: ["id", "color", "radius"] }, { kind: "directive", type: i1.FZoomDirective, selector: "f-canvas[fZoom]", inputs: ["fZoom", "fWheelTrigger", "fDblClickTrigger", "fZoomMinimum", "fZoomMaximum", "fZoomStep", "fPinchStep", "fZoomDblClickStep"] }, { kind: "component", type: i1.FSelectionArea, selector: "f-selection-area", inputs: ["fTrigger"] }, { kind: "component", type: i1.FConnectionMarkerArrow, selector: "f-connection-marker-arrow", inputs: ["type"] }, { kind: "component", type: i1.FConnectionComponent, selector: "f-connection", inputs: ["fConnectionId", "fSourceId", "fTargetId", "fOutputId", "fInputId", "fRadius", "fOffset", "fBehavior", "fType", "fSelectionDisabled", "fReassignableStart", "fReassignDisabled", "fSourceSide", "fTargetSide", "fInputSide", "fOutputSide"], exportAs: ["fComponent"] }, { kind: "component", type: i1.FConnectionForCreateComponent, selector: "f-connection-for-create", inputs: ["fRadius", "fOffset", "fBehavior", "fType", "fInputSide", "fOutputSide"] }, { kind: "directive", type: i1.FConnectorDirective, selector: "[fConnector]", inputs: ["fConnectorId", "fConnectorType", "fConnectorDisabled", "fConnectorMultiple", "fConnectorCategory", "fConnectorConnectableSide", "fConnectorSelfConnectable", "fCanBeConnectedTo", "fConnectionFromOutlet"], exportAs: ["fConnector"] }, { kind: "component", type: i1.FMinimapComponent, selector: "f-minimap", inputs: ["fMinSize", "fNodeRenderLimit"], exportAs: ["fComponent"] }, { kind: "directive", type: i1.FNodeDirective, selector: "[fNode]", inputs: ["fNodeId", "fNodeParentId", "fNodePosition", "fNodeSize", "fNodeRotate", "fConnectOnNode", "fMinimapClass", "fNodeDraggingDisabled", "fNodeSelectionDisabled", "fIncludePadding", "fAutoExpandOnChildHit", "fAutoSizeToFitChildren"], outputs: ["fNodePositionChange", "fNodeSizeChange", "fNodeRotateChange"], exportAs: ["fComponent"] }, { kind: "directive", type: i1.FDragHandleDirective, selector: "[fDragHandle]" }, { kind: "directive", type: i1.FDragBlockerDirective, selector: "[fDragBlocker]" }, { kind: "directive", type: i1.FDraggableDirective, selector: "f-flow[fDraggable]", inputs: ["fDraggableDisabled", "fDropToGroup", "fMultiSelectTrigger", "fReassignConnectionTrigger", "fCreateConnectionTrigger", "fConnectionWaypointsTrigger", "fMoveControlPointTrigger", "fNodeResizeTrigger", "fNodeRotateTrigger", "fNodeMoveTrigger", "fCanvasMoveTrigger", "fExternalItemTrigger", "fEmitOnNodeIntersect", "vCellSize", "hCellSize", "fCellSizeWhileDragging"], outputs: ["fSelectionChange", "fDeleteSelected", "fNodeIntersectedWithConnections", "fNodeConnectionsIntersection", "fCreateNode", "fMoveNodes", "fReassignConnection", "fCreateConnection", "fConnectionWaypointsChanged", "fDropToGroup", "fDragStarted", "fDragEnded"], exportAs: ["fDraggable"] }, { kind: "component", type: DpeNodeIconComponent, selector: "dpe-node-icon", inputs: ["collection"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
4069
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: DpeCanvasComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
4070
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.33", type: DpeCanvasComponent, isStandalone: true, selector: "dpe-canvas", inputs: { isEditable: { classPropertyName: "isEditable", publicName: "isEditable", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { nodeOpened: "nodeOpened", nodeDropped: "nodeDropped" }, providers: [provideFFlow(withA11y())], viewQueries: [{ propertyName: "canvas", first: true, predicate: FCanvasComponent, descendants: true, isSignal: true }, { propertyName: "flow", first: true, predicate: FFlowComponent, descendants: true, isSignal: true }], ngImport: i0, template: "<!--\r\n Gerarchia obbligatoria: f-flow > f-canvas > fNode / f-connection. I `@for` stanno\r\n direttamente dentro <f-canvas>: senza wrapper non serve `ngProjectAs`.\r\n-->\r\n<!--\r\n `dpe-flow`: classe nostra sul contenitore della libreria, e serve al **CSS**. Il tema di\r\n @foblex/flow stila la card con `.f-flow .f-node` (due classi): un nostro `.dpe-node` non la\r\n batte, e senza questa classe la card torna larga 120px e col testo centrato. Con `dpe-flow` i\r\n selettori del foglio diventano `dpe-canvas .dpe-flow .dpe-node`, che vince per specificita' e\r\n non per ordine di caricamento.\r\n-->\r\n<f-flow\r\n class=\"dpe-flow\"\r\n fDraggable\r\n (fCreateConnection)=\"onCreateConnection($event)\"\r\n (fReassignConnection)=\"onReassignConnection($event)\"\r\n (fMoveNodes)=\"onMoveNodes($event)\"\r\n (fSelectionChange)=\"onSelectionChange($event)\"\r\n (fDeleteSelected)=\"onDeleteSelected($event)\"\r\n (fCreateNode)=\"onCreateNode($event)\"\r\n (fNodesRendered)=\"onNodesRendered()\"\r\n>\r\n <f-canvas fZoom #canvas (fCanvasChange)=\"onCanvasChange()\">\r\n <f-background>\r\n <f-circle-pattern />\r\n </f-background>\r\n\r\n @for (edge of edges(); track edge.id) {\r\n <!--\r\n La classe porta lo **slot** di destinazione: la primaria e la secondaria di un join\r\n vanno distinte a vista, altrimenti l\u2019unico modo di sapere quale lato e\u2019 quale e\u2019 aprire\r\n l\u2019ispettore. I colori stanno nel CSS globale, non qui: i path SVG sono creati a runtime\r\n e non portano l\u2019attributo di scope.\r\n -->\r\n <f-connection\r\n [fConnectionId]=\"edge.id\"\r\n [fSourceId]=\"edge.sourceId\"\r\n [fTargetId]=\"edge.targetId\"\r\n fBehavior=\"floating\"\r\n fType=\"bezier\"\r\n [class]=\"'dpe-edge dpe-edge--' + edge.slot\"\r\n >\r\n <f-connection-marker-arrow [type]=\"markerEnd\" />\r\n </f-connection>\r\n }\r\n\r\n @for (node of nodes(); track node.id) {\r\n <!--\r\n Nessun `[style.*]` sul nodo: @foblex/flow riscrive l\u2019attributo `style` a ogni\r\n riposizionamento e lo cancellerebbe. La larghezza arriva da `node.widthClass`.\r\n -->\r\n <div\r\n fNode\r\n fDragHandle\r\n [fNodeId]=\"node.id\"\r\n [fNodePosition]=\"node.position\"\r\n [class]=\"\r\n 'dpe-node dpe-node--' + node.collection + ' ' + node.widthClass + ' ' + node.familyClass\r\n \"\r\n [class.dpe-node--selected]=\"isSelected(node)\"\r\n [class.dpe-node--error]=\"node.severity === 'Error'\"\r\n [class.dpe-node--warning]=\"node.severity === 'Warning'\"\r\n [class.dpe-node--not-compilable]=\"node.isNotCompilable\"\r\n [attr.aria-label]=\"node.categoryLabel + ' ' + node.label\"\r\n (dblclick)=\"onNodeDoubleClick(node.name)\"\r\n >\r\n <!--\r\n Le porte di ingresso stanno in fila sul bordo superiore, una per slot. Si renderizzano\r\n **sempre**: un connettore con `display: none` ha geometria 0x0 e l\u2019arco si attacca nel\r\n punto sbagliato. `fConnectorConnectableSide` e\u2019 dichiarato: senza, un arco che risale\r\n entrerebbe di fianco.\r\n -->\r\n @if (node.ports.length > 0) {\r\n <div class=\"dpe-node__ports\" [class.dpe-node__ports--labelled]=\"node.showsPortLabels\">\r\n @for (port of node.ports; track port.id) {\r\n <div class=\"dpe-port\">\r\n <div\r\n fConnector\r\n fConnectorType=\"target\"\r\n [fConnectorId]=\"port.id\"\r\n [fConnectorConnectableSide]=\"sides.TOP\"\r\n fConnectorMultiple=\"false\"\r\n class=\"dpe-connector dpe-connector--in\"\r\n [class.dpe-connector--broken]=\"port.isBroken\"\r\n [title]=\"port.label\"\r\n ></div>\r\n @if (node.showsPortLabels) {\r\n <span class=\"dpe-port__label\" [title]=\"port.label\">{{ port.label }}</span>\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <div class=\"dpe-node__head\">\r\n <!--\r\n La stessa pastiglia della palette: cio\u2019 che si trascina deve assomigliare a cio\u2019 che\r\n compare. La classe di famiglia porta i due token di colore.\r\n -->\r\n <span class=\"dpe-node__icon\">\r\n <dpe-node-icon [collection]=\"node.collection\" />\r\n </span>\r\n <div class=\"dpe-node__text\">\r\n <span class=\"dpe-node__title\" [title]=\"node.label\">{{ node.label }}</span>\r\n <span class=\"dpe-node__sub\">\r\n {{ node.categoryLabel }}\r\n @if (node.subtitle) {\r\n <span class=\"dpe-node__dot\">\u00B7</span>{{ node.subtitle }}\r\n }\r\n </span>\r\n </div>\r\n <!--\r\n `fDragBlocker` sui bottoni dentro un nodo: senza, il pointerdown diventa un\r\n trascinamento e aprire l\u2019ispettore sposta il nodo di qualche pixel.\r\n -->\r\n <button\r\n type=\"button\"\r\n fDragBlocker\r\n class=\"dpe-node__btn\"\r\n [attr.aria-label]=\"'Apri l\u2019ispettore di ' + node.label\"\r\n title=\"Apri l\u2019ispettore\"\r\n (click)=\"onEditClick($event, node.name)\"\r\n >\r\n \u270E\r\n </button>\r\n @if (isEditable() && isSelected(node)) {\r\n <!--\r\n Solo sul nodo selezionato: un comando distruttivo che compare sotto il puntatore\r\n mentre si attraversa il grafo si preme per sbaglio.\r\n -->\r\n <button\r\n type=\"button\"\r\n fDragBlocker\r\n class=\"dpe-node__btn dpe-node__btn--remove\"\r\n [attr.aria-label]=\"'Elimina ' + node.label\"\r\n title=\"Elimina (si annulla con \u21B6)\"\r\n (click)=\"onRemoveClick($event, node.name)\"\r\n >\r\n \u00D7\r\n </button>\r\n }\r\n </div>\r\n\r\n <div class=\"dpe-node__meta\">\r\n <span class=\"dpe-node__name\" [title]=\"'Nome tecnico: ' + node.name\">{{ node.name }}</span>\r\n @if (node.columnCount !== null) {\r\n <span class=\"dpe-badge\" [title]=\"'Colonne in uscita secondo il backend'\">\r\n {{ node.columnCount }} col.\r\n </span>\r\n }\r\n @if (node.isNotCompilable) {\r\n <!--\r\n Stato distinto dall\u2019errore: la definizione va bene, il compilatore non ci arriva\r\n (I10). Colore proprio, testo che non chiede di correggere niente.\r\n -->\r\n <span class=\"dpe-badge dpe-badge--not-compilable\" title=\"Valido, ma non compilabile: e\u2019 un limite nostro\">\r\n non compilabile\r\n </span>\r\n }\r\n @if (node.diagnosticCount > 0) {\r\n <span\r\n class=\"dpe-badge\"\r\n [class.dpe-badge--error]=\"node.severity === 'Error'\"\r\n [class.dpe-badge--warning]=\"node.severity === 'Warning'\"\r\n [class.dpe-badge--info]=\"node.severity === 'Info'\"\r\n [title]=\"node.diagnosticCount + ' rilievi dal backend'\"\r\n >\r\n {{ node.diagnosticCount }}\r\n </span>\r\n }\r\n @for (port of node.ports; track $index) {\r\n @if (port.isBroken) {\r\n <span class=\"dpe-badge dpe-badge--error\" [title]=\"'Riferimento non risolto: ' + port.sourceName\">\r\n \u26A0 {{ port.sourceName }}\r\n </span>\r\n }\r\n }\r\n </div>\r\n\r\n <!--\r\n L\u2019uscita e\u2019 una sola: lo schema prodotto e\u2019 uno. I sink non ne hanno, e la porta non\r\n si disegna affatto \u2014 qui non c\u2019e\u2019 niente da nascondere con `display: none`, il\r\n connettore semplicemente non esiste.\r\n -->\r\n @if (node.hasOutput) {\r\n <div class=\"dpe-node__out\">\r\n <div\r\n fConnector\r\n fConnectorType=\"source\"\r\n [fConnectorId]=\"node.outputPortId\"\r\n [fConnectorConnectableSide]=\"sides.BOTTOM\"\r\n class=\"dpe-connector dpe-connector--out\"\r\n title=\"Uscita\"\r\n ></div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <f-connection-for-create fBehavior=\"floating\" fType=\"bezier\" class=\"dpe-edge dpe-edge--creating\">\r\n <f-connection-marker-arrow [type]=\"markerEnd\" />\r\n </f-connection-for-create>\r\n\r\n <f-selection-area />\r\n </f-canvas>\r\n\r\n <!--\r\n Fuori da <f-canvas> come la minimappa: dentro, la trasformazione del canvas se lo\r\n porterebbe via insieme ai nodi.\r\n -->\r\n <button\r\n type=\"button\"\r\n fDragBlocker\r\n class=\"dpe-viewport-reset\"\r\n [class.dpe-viewport-reset--hidden]=\"!isFitCommandVisible()\"\r\n title=\"Rimetti il grafo interamente in vista\"\r\n (click)=\"resetViewport()\"\r\n >\r\n \u2922 Inquadra\r\n </button>\r\n\r\n <f-minimap [fMinSize]=\"1200\" class=\"dpe-minimap\" />\r\n</f-flow>\r\n", dependencies: [{ kind: "ngmodule", type: FFlowModule }, { kind: "component", type: i1.FFlowComponent, selector: "f-flow", inputs: ["fFlowId", "fCache"], outputs: ["fNodesRendered", "fFullRendered", "fLoaded"] }, { kind: "component", type: i1.FCanvasComponent, selector: "f-canvas", inputs: ["position", "scale", "debounceTime", "fLayers"], outputs: ["fCanvasChange"] }, { kind: "component", type: i1.FBackgroundComponent, selector: "f-background" }, { kind: "component", type: i1.FCirclePatternComponent, selector: "f-circle-pattern", inputs: ["id", "color", "radius"] }, { kind: "directive", type: i1.FZoomDirective, selector: "f-canvas[fZoom]", inputs: ["fZoom", "fWheelTrigger", "fDblClickTrigger", "fZoomMinimum", "fZoomMaximum", "fZoomStep", "fPinchStep", "fZoomDblClickStep"] }, { kind: "component", type: i1.FSelectionArea, selector: "f-selection-area", inputs: ["fTrigger"] }, { kind: "component", type: i1.FConnectionMarkerArrow, selector: "f-connection-marker-arrow", inputs: ["type"] }, { kind: "component", type: i1.FConnectionComponent, selector: "f-connection", inputs: ["fConnectionId", "fSourceId", "fTargetId", "fOutputId", "fInputId", "fRadius", "fOffset", "fBehavior", "fType", "fSelectionDisabled", "fReassignableStart", "fReassignDisabled", "fSourceSide", "fTargetSide", "fInputSide", "fOutputSide"], exportAs: ["fComponent"] }, { kind: "component", type: i1.FConnectionForCreateComponent, selector: "f-connection-for-create", inputs: ["fRadius", "fOffset", "fBehavior", "fType", "fInputSide", "fOutputSide"] }, { kind: "directive", type: i1.FConnectorDirective, selector: "[fConnector]", inputs: ["fConnectorId", "fConnectorType", "fConnectorDisabled", "fConnectorMultiple", "fConnectorCategory", "fConnectorConnectableSide", "fConnectorSelfConnectable", "fCanBeConnectedTo", "fConnectionFromOutlet"], exportAs: ["fConnector"] }, { kind: "component", type: i1.FMinimapComponent, selector: "f-minimap", inputs: ["fMinSize", "fNodeRenderLimit"], exportAs: ["fComponent"] }, { kind: "directive", type: i1.FNodeDirective, selector: "[fNode]", inputs: ["fNodeId", "fNodeParentId", "fNodePosition", "fNodeSize", "fNodeRotate", "fConnectOnNode", "fMinimapClass", "fNodeDraggingDisabled", "fNodeSelectionDisabled", "fIncludePadding", "fAutoExpandOnChildHit", "fAutoSizeToFitChildren"], outputs: ["fNodePositionChange", "fNodeSizeChange", "fNodeRotateChange"], exportAs: ["fComponent"] }, { kind: "directive", type: i1.FDragHandleDirective, selector: "[fDragHandle]" }, { kind: "directive", type: i1.FDragBlockerDirective, selector: "[fDragBlocker]" }, { kind: "directive", type: i1.FDraggableDirective, selector: "f-flow[fDraggable]", inputs: ["fDraggableDisabled", "fDropToGroup", "fMultiSelectTrigger", "fReassignConnectionTrigger", "fCreateConnectionTrigger", "fConnectionWaypointsTrigger", "fMoveControlPointTrigger", "fNodeResizeTrigger", "fNodeRotateTrigger", "fNodeMoveTrigger", "fCanvasMoveTrigger", "fExternalItemTrigger", "fEmitOnNodeIntersect", "vCellSize", "hCellSize", "fCellSizeWhileDragging"], outputs: ["fSelectionChange", "fDeleteSelected", "fNodeIntersectedWithConnections", "fNodeConnectionsIntersection", "fCreateNode", "fMoveNodes", "fReassignConnection", "fCreateConnection", "fConnectionWaypointsChanged", "fDropToGroup", "fDragStarted", "fDragEnded"], exportAs: ["fDraggable"] }, { kind: "component", type: DpeNodeIconComponent, selector: "dpe-node-icon", inputs: ["collection"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
4071
4071
  }
4072
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.32", ngImport: i0, type: DpeCanvasComponent, decorators: [{
4072
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: DpeCanvasComponent, decorators: [{
4073
4073
  type: Component,
4074
4074
  args: [{ selector: 'dpe-canvas', standalone: true, imports: [FFlowModule, DpeNodeIconComponent], changeDetection: ChangeDetectionStrategy.OnPush, providers: [provideFFlow(withA11y())], template: "<!--\r\n Gerarchia obbligatoria: f-flow > f-canvas > fNode / f-connection. I `@for` stanno\r\n direttamente dentro <f-canvas>: senza wrapper non serve `ngProjectAs`.\r\n-->\r\n<!--\r\n `dpe-flow`: classe nostra sul contenitore della libreria, e serve al **CSS**. Il tema di\r\n @foblex/flow stila la card con `.f-flow .f-node` (due classi): un nostro `.dpe-node` non la\r\n batte, e senza questa classe la card torna larga 120px e col testo centrato. Con `dpe-flow` i\r\n selettori del foglio diventano `dpe-canvas .dpe-flow .dpe-node`, che vince per specificita' e\r\n non per ordine di caricamento.\r\n-->\r\n<f-flow\r\n class=\"dpe-flow\"\r\n fDraggable\r\n (fCreateConnection)=\"onCreateConnection($event)\"\r\n (fReassignConnection)=\"onReassignConnection($event)\"\r\n (fMoveNodes)=\"onMoveNodes($event)\"\r\n (fSelectionChange)=\"onSelectionChange($event)\"\r\n (fDeleteSelected)=\"onDeleteSelected($event)\"\r\n (fCreateNode)=\"onCreateNode($event)\"\r\n (fNodesRendered)=\"onNodesRendered()\"\r\n>\r\n <f-canvas fZoom #canvas (fCanvasChange)=\"onCanvasChange()\">\r\n <f-background>\r\n <f-circle-pattern />\r\n </f-background>\r\n\r\n @for (edge of edges(); track edge.id) {\r\n <!--\r\n La classe porta lo **slot** di destinazione: la primaria e la secondaria di un join\r\n vanno distinte a vista, altrimenti l\u2019unico modo di sapere quale lato e\u2019 quale e\u2019 aprire\r\n l\u2019ispettore. I colori stanno nel CSS globale, non qui: i path SVG sono creati a runtime\r\n e non portano l\u2019attributo di scope.\r\n -->\r\n <f-connection\r\n [fConnectionId]=\"edge.id\"\r\n [fSourceId]=\"edge.sourceId\"\r\n [fTargetId]=\"edge.targetId\"\r\n fBehavior=\"floating\"\r\n fType=\"bezier\"\r\n [class]=\"'dpe-edge dpe-edge--' + edge.slot\"\r\n >\r\n <f-connection-marker-arrow [type]=\"markerEnd\" />\r\n </f-connection>\r\n }\r\n\r\n @for (node of nodes(); track node.id) {\r\n <!--\r\n Nessun `[style.*]` sul nodo: @foblex/flow riscrive l\u2019attributo `style` a ogni\r\n riposizionamento e lo cancellerebbe. La larghezza arriva da `node.widthClass`.\r\n -->\r\n <div\r\n fNode\r\n fDragHandle\r\n [fNodeId]=\"node.id\"\r\n [fNodePosition]=\"node.position\"\r\n [class]=\"\r\n 'dpe-node dpe-node--' + node.collection + ' ' + node.widthClass + ' ' + node.familyClass\r\n \"\r\n [class.dpe-node--selected]=\"isSelected(node)\"\r\n [class.dpe-node--error]=\"node.severity === 'Error'\"\r\n [class.dpe-node--warning]=\"node.severity === 'Warning'\"\r\n [class.dpe-node--not-compilable]=\"node.isNotCompilable\"\r\n [attr.aria-label]=\"node.categoryLabel + ' ' + node.label\"\r\n (dblclick)=\"onNodeDoubleClick(node.name)\"\r\n >\r\n <!--\r\n Le porte di ingresso stanno in fila sul bordo superiore, una per slot. Si renderizzano\r\n **sempre**: un connettore con `display: none` ha geometria 0x0 e l\u2019arco si attacca nel\r\n punto sbagliato. `fConnectorConnectableSide` e\u2019 dichiarato: senza, un arco che risale\r\n entrerebbe di fianco.\r\n -->\r\n @if (node.ports.length > 0) {\r\n <div class=\"dpe-node__ports\" [class.dpe-node__ports--labelled]=\"node.showsPortLabels\">\r\n @for (port of node.ports; track port.id) {\r\n <div class=\"dpe-port\">\r\n <div\r\n fConnector\r\n fConnectorType=\"target\"\r\n [fConnectorId]=\"port.id\"\r\n [fConnectorConnectableSide]=\"sides.TOP\"\r\n fConnectorMultiple=\"false\"\r\n class=\"dpe-connector dpe-connector--in\"\r\n [class.dpe-connector--broken]=\"port.isBroken\"\r\n [title]=\"port.label\"\r\n ></div>\r\n @if (node.showsPortLabels) {\r\n <span class=\"dpe-port__label\" [title]=\"port.label\">{{ port.label }}</span>\r\n }\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <div class=\"dpe-node__head\">\r\n <!--\r\n La stessa pastiglia della palette: cio\u2019 che si trascina deve assomigliare a cio\u2019 che\r\n compare. La classe di famiglia porta i due token di colore.\r\n -->\r\n <span class=\"dpe-node__icon\">\r\n <dpe-node-icon [collection]=\"node.collection\" />\r\n </span>\r\n <div class=\"dpe-node__text\">\r\n <span class=\"dpe-node__title\" [title]=\"node.label\">{{ node.label }}</span>\r\n <span class=\"dpe-node__sub\">\r\n {{ node.categoryLabel }}\r\n @if (node.subtitle) {\r\n <span class=\"dpe-node__dot\">\u00B7</span>{{ node.subtitle }}\r\n }\r\n </span>\r\n </div>\r\n <!--\r\n `fDragBlocker` sui bottoni dentro un nodo: senza, il pointerdown diventa un\r\n trascinamento e aprire l\u2019ispettore sposta il nodo di qualche pixel.\r\n -->\r\n <button\r\n type=\"button\"\r\n fDragBlocker\r\n class=\"dpe-node__btn\"\r\n [attr.aria-label]=\"'Apri l\u2019ispettore di ' + node.label\"\r\n title=\"Apri l\u2019ispettore\"\r\n (click)=\"onEditClick($event, node.name)\"\r\n >\r\n \u270E\r\n </button>\r\n @if (isEditable() && isSelected(node)) {\r\n <!--\r\n Solo sul nodo selezionato: un comando distruttivo che compare sotto il puntatore\r\n mentre si attraversa il grafo si preme per sbaglio.\r\n -->\r\n <button\r\n type=\"button\"\r\n fDragBlocker\r\n class=\"dpe-node__btn dpe-node__btn--remove\"\r\n [attr.aria-label]=\"'Elimina ' + node.label\"\r\n title=\"Elimina (si annulla con \u21B6)\"\r\n (click)=\"onRemoveClick($event, node.name)\"\r\n >\r\n \u00D7\r\n </button>\r\n }\r\n </div>\r\n\r\n <div class=\"dpe-node__meta\">\r\n <span class=\"dpe-node__name\" [title]=\"'Nome tecnico: ' + node.name\">{{ node.name }}</span>\r\n @if (node.columnCount !== null) {\r\n <span class=\"dpe-badge\" [title]=\"'Colonne in uscita secondo il backend'\">\r\n {{ node.columnCount }} col.\r\n </span>\r\n }\r\n @if (node.isNotCompilable) {\r\n <!--\r\n Stato distinto dall\u2019errore: la definizione va bene, il compilatore non ci arriva\r\n (I10). Colore proprio, testo che non chiede di correggere niente.\r\n -->\r\n <span class=\"dpe-badge dpe-badge--not-compilable\" title=\"Valido, ma non compilabile: e\u2019 un limite nostro\">\r\n non compilabile\r\n </span>\r\n }\r\n @if (node.diagnosticCount > 0) {\r\n <span\r\n class=\"dpe-badge\"\r\n [class.dpe-badge--error]=\"node.severity === 'Error'\"\r\n [class.dpe-badge--warning]=\"node.severity === 'Warning'\"\r\n [class.dpe-badge--info]=\"node.severity === 'Info'\"\r\n [title]=\"node.diagnosticCount + ' rilievi dal backend'\"\r\n >\r\n {{ node.diagnosticCount }}\r\n </span>\r\n }\r\n @for (port of node.ports; track $index) {\r\n @if (port.isBroken) {\r\n <span class=\"dpe-badge dpe-badge--error\" [title]=\"'Riferimento non risolto: ' + port.sourceName\">\r\n \u26A0 {{ port.sourceName }}\r\n </span>\r\n }\r\n }\r\n </div>\r\n\r\n <!--\r\n L\u2019uscita e\u2019 una sola: lo schema prodotto e\u2019 uno. I sink non ne hanno, e la porta non\r\n si disegna affatto \u2014 qui non c\u2019e\u2019 niente da nascondere con `display: none`, il\r\n connettore semplicemente non esiste.\r\n -->\r\n @if (node.hasOutput) {\r\n <div class=\"dpe-node__out\">\r\n <div\r\n fConnector\r\n fConnectorType=\"source\"\r\n [fConnectorId]=\"node.outputPortId\"\r\n [fConnectorConnectableSide]=\"sides.BOTTOM\"\r\n class=\"dpe-connector dpe-connector--out\"\r\n title=\"Uscita\"\r\n ></div>\r\n </div>\r\n }\r\n </div>\r\n }\r\n\r\n <f-connection-for-create fBehavior=\"floating\" fType=\"bezier\" class=\"dpe-edge dpe-edge--creating\">\r\n <f-connection-marker-arrow [type]=\"markerEnd\" />\r\n </f-connection-for-create>\r\n\r\n <f-selection-area />\r\n </f-canvas>\r\n\r\n <!--\r\n Fuori da <f-canvas> come la minimappa: dentro, la trasformazione del canvas se lo\r\n porterebbe via insieme ai nodi.\r\n -->\r\n <button\r\n type=\"button\"\r\n fDragBlocker\r\n class=\"dpe-viewport-reset\"\r\n [class.dpe-viewport-reset--hidden]=\"!isFitCommandVisible()\"\r\n title=\"Rimetti il grafo interamente in vista\"\r\n (click)=\"resetViewport()\"\r\n >\r\n \u2922 Inquadra\r\n </button>\r\n\r\n <f-minimap [fMinSize]=\"1200\" class=\"dpe-minimap\" />\r\n</f-flow>\r\n" }]
4075
4075
  }], ctorParameters: () => [], propDecorators: { isEditable: [{ type: i0.Input, args: [{ isSignal: true, alias: "isEditable", required: false }] }], nodeOpened: [{ type: i0.Output, args: ["nodeOpened"] }], nodeDropped: [{ type: i0.Output, args: ["nodeDropped"] }], canvas: [{ type: i0.ViewChild, args: [i0.forwardRef(() => FCanvasComponent), { isSignal: true }] }], flow: [{ type: i0.ViewChild, args: [i0.forwardRef(() => FFlowComponent), { isSignal: true }] }] } });
@@ -4144,8 +4144,8 @@ class DpeDiagnosticsPanelComponent {
4144
4144
  }
4145
4145
  this.navigate.emit({ nodeName: row.nodeName, field: row.field });
4146
4146
  }
4147
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.32", ngImport: i0, type: DpeDiagnosticsPanelComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
4148
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.32", type: DpeDiagnosticsPanelComponent, isStandalone: true, selector: "dpe-diagnostics-panel", outputs: { navigate: "navigate" }, ngImport: i0, template: `
4147
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: DpeDiagnosticsPanelComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
4148
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.33", type: DpeDiagnosticsPanelComponent, isStandalone: true, selector: "dpe-diagnostics-panel", outputs: { navigate: "navigate" }, ngImport: i0, template: `
4149
4149
  <div class="dpe-diag__head">
4150
4150
  <strong>Diagnostiche</strong>
4151
4151
  <span class="dpe-diag__count">
@@ -4205,7 +4205,7 @@ class DpeDiagnosticsPanelComponent {
4205
4205
  }
4206
4206
  `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
4207
4207
  }
4208
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.32", ngImport: i0, type: DpeDiagnosticsPanelComponent, decorators: [{
4208
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: DpeDiagnosticsPanelComponent, decorators: [{
4209
4209
  type: Component,
4210
4210
  args: [{
4211
4211
  selector: 'dpe-diagnostics-panel',
@@ -4349,8 +4349,8 @@ class DpeNodeFactsComponent {
4349
4349
  fieldOf(diagnostic) {
4350
4350
  return dpeDiagnosticField(diagnostic);
4351
4351
  }
4352
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.32", ngImport: i0, type: DpeNodeFactsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
4353
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.32", type: DpeNodeFactsComponent, isStandalone: true, selector: "dpe-node-facts", inputs: { nodeName: { classPropertyName: "nodeName", publicName: "nodeName", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: `
4352
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: DpeNodeFactsComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
4353
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.33", type: DpeNodeFactsComponent, isStandalone: true, selector: "dpe-node-facts", inputs: { nodeName: { classPropertyName: "nodeName", publicName: "nodeName", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0, template: `
4354
4354
  @if (isNotCompilable()) {
4355
4355
  <!--
4356
4356
  Tono deliberatamente **non** da errore: colore proprio (ne’ rosso ne’ giallo) e le stesse
@@ -4455,7 +4455,7 @@ class DpeNodeFactsComponent {
4455
4455
  }
4456
4456
  `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
4457
4457
  }
4458
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.32", ngImport: i0, type: DpeNodeFactsComponent, decorators: [{
4458
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: DpeNodeFactsComponent, decorators: [{
4459
4459
  type: Component,
4460
4460
  args: [{
4461
4461
  selector: 'dpe-node-facts',
@@ -4592,10 +4592,10 @@ class DpeSelectValueDirective {
4592
4592
  select.value = normalized;
4593
4593
  }
4594
4594
  }
4595
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.32", ngImport: i0, type: DpeSelectValueDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
4596
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.3.32", type: DpeSelectValueDirective, isStandalone: true, selector: "select[dpeValue]", inputs: { dpeValue: { classPropertyName: "dpeValue", publicName: "dpeValue", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0 });
4595
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: DpeSelectValueDirective, deps: [], target: i0.ɵɵFactoryTarget.Directive });
4596
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.3.33", type: DpeSelectValueDirective, isStandalone: true, selector: "select[dpeValue]", inputs: { dpeValue: { classPropertyName: "dpeValue", publicName: "dpeValue", isSignal: true, isRequired: false, transformFunction: null } }, ngImport: i0 });
4597
4597
  }
4598
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.32", ngImport: i0, type: DpeSelectValueDirective, decorators: [{
4598
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: DpeSelectValueDirective, decorators: [{
4599
4599
  type: Directive,
4600
4600
  args: [{
4601
4601
  selector: 'select[dpeValue]',
@@ -4777,10 +4777,10 @@ class DpeNodeInspectorBase {
4777
4777
  checkedOf(event) {
4778
4778
  return event.target.checked;
4779
4779
  }
4780
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.32", ngImport: i0, type: DpeNodeInspectorBase, deps: [], target: i0.ɵɵFactoryTarget.Directive });
4781
- static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.3.32", type: DpeNodeInspectorBase, isStandalone: true, inputs: { nodeName: { classPropertyName: "nodeName", publicName: "nodeName", isSignal: true, isRequired: true, transformFunction: null }, node: { classPropertyName: "node", publicName: "node", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0 });
4780
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: DpeNodeInspectorBase, deps: [], target: i0.ɵɵFactoryTarget.Directive });
4781
+ static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "17.1.0", version: "20.3.33", type: DpeNodeInspectorBase, isStandalone: true, inputs: { nodeName: { classPropertyName: "nodeName", publicName: "nodeName", isSignal: true, isRequired: true, transformFunction: null }, node: { classPropertyName: "node", publicName: "node", isSignal: true, isRequired: true, transformFunction: null } }, ngImport: i0 });
4782
4782
  }
4783
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.32", ngImport: i0, type: DpeNodeInspectorBase, decorators: [{
4783
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: DpeNodeInspectorBase, decorators: [{
4784
4784
  type: Directive
4785
4785
  }], propDecorators: { nodeName: [{ type: i0.Input, args: [{ isSignal: true, alias: "nodeName", required: true }] }], node: [{ type: i0.Input, args: [{ isSignal: true, alias: "node", required: true }] }] } });
4786
4786
 
@@ -4836,8 +4836,8 @@ class DpeAggregateInspectorComponent extends DpeNodeInspectorBase {
4836
4836
  fields: this.fields().map((field, position) => position === index ? { ...field, ...patch } : field),
4837
4837
  });
4838
4838
  }
4839
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.32", ngImport: i0, type: DpeAggregateInspectorComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
4840
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.32", type: DpeAggregateInspectorComponent, isStandalone: true, selector: "dpe-aggregate-inspector", usesInheritance: true, ngImport: i0, template: `
4839
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: DpeAggregateInspectorComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
4840
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.33", type: DpeAggregateInspectorComponent, isStandalone: true, selector: "dpe-aggregate-inspector", usesInheritance: true, ngImport: i0, template: `
4841
4841
  <div class="dpe-form">
4842
4842
  <div class="dpe-field">
4843
4843
  <label class="dpe-field__label" for="agg-group">Raggruppa per</label>
@@ -4934,7 +4934,7 @@ class DpeAggregateInspectorComponent extends DpeNodeInspectorBase {
4934
4934
  </div>
4935
4935
  `, isInline: true, dependencies: [{ kind: "directive", type: DpeSelectValueDirective, selector: "select[dpeValue]", inputs: ["dpeValue"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
4936
4936
  }
4937
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.32", ngImport: i0, type: DpeAggregateInspectorComponent, decorators: [{
4937
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: DpeAggregateInspectorComponent, decorators: [{
4938
4938
  type: Component,
4939
4939
  args: [{
4940
4940
  selector: 'dpe-aggregate-inspector',
@@ -5061,8 +5061,8 @@ class DpeAppendInspectorComponent extends DpeNodeInspectorBase {
5061
5061
  removeSource(index) {
5062
5062
  this.patch({ sources: this.sources().filter((_, position) => position !== index) });
5063
5063
  }
5064
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.32", ngImport: i0, type: DpeAppendInspectorComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
5065
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.32", type: DpeAppendInspectorComponent, isStandalone: true, selector: "dpe-append-inspector", usesInheritance: true, ngImport: i0, template: `
5064
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: DpeAppendInspectorComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
5065
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.33", type: DpeAppendInspectorComponent, isStandalone: true, selector: "dpe-append-inspector", usesInheritance: true, ngImport: i0, template: `
5066
5066
  <div class="dpe-form">
5067
5067
  <label class="dpe-check">
5068
5068
  <input
@@ -5107,7 +5107,7 @@ class DpeAppendInspectorComponent extends DpeNodeInspectorBase {
5107
5107
  </div>
5108
5108
  `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
5109
5109
  }
5110
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.32", ngImport: i0, type: DpeAppendInspectorComponent, decorators: [{
5110
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: DpeAppendInspectorComponent, decorators: [{
5111
5111
  type: Component,
5112
5112
  args: [{
5113
5113
  selector: 'dpe-append-inspector',
@@ -5188,8 +5188,8 @@ class DpeAtomicWritebackInspectorComponent extends DpeNodeInspectorBase {
5188
5188
  relationships: this.relationships().map((relationship, position) => position === index ? { ...relationship, ...patch } : relationship),
5189
5189
  });
5190
5190
  }
5191
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.32", ngImport: i0, type: DpeAtomicWritebackInspectorComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
5192
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.32", type: DpeAtomicWritebackInspectorComponent, isStandalone: true, selector: "dpe-atomic-writeback-inspector", usesInheritance: true, ngImport: i0, template: `
5191
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: DpeAtomicWritebackInspectorComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
5192
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.33", type: DpeAtomicWritebackInspectorComponent, isStandalone: true, selector: "dpe-atomic-writeback-inspector", usesInheritance: true, ngImport: i0, template: `
5193
5193
  <div class="dpe-form">
5194
5194
  <p class="dpe-note">
5195
5195
  La libreria non apre transazioni: questo gruppo <strong>dichiara</strong> che le scritture
@@ -5300,7 +5300,7 @@ class DpeAtomicWritebackInspectorComponent extends DpeNodeInspectorBase {
5300
5300
  </div>
5301
5301
  `, isInline: true, dependencies: [{ kind: "directive", type: DpeSelectValueDirective, selector: "select[dpeValue]", inputs: ["dpeValue"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
5302
5302
  }
5303
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.32", ngImport: i0, type: DpeAtomicWritebackInspectorComponent, decorators: [{
5303
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: DpeAtomicWritebackInspectorComponent, decorators: [{
5304
5304
  type: Component,
5305
5305
  args: [{
5306
5306
  selector: 'dpe-atomic-writeback-inspector',
@@ -5486,8 +5486,8 @@ class DpeColumnTypeEditorComponent {
5486
5486
  text(event) {
5487
5487
  return event.target.value;
5488
5488
  }
5489
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.32", ngImport: i0, type: DpeColumnTypeEditorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
5490
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.32", type: DpeColumnTypeEditorComponent, isStandalone: true, selector: "dpe-column-type-editor", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, controlId: { classPropertyName: "controlId", publicName: "controlId", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { valueChange: "valueChange" }, ngImport: i0, template: `
5489
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: DpeColumnTypeEditorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
5490
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.33", type: DpeColumnTypeEditorComponent, isStandalone: true, selector: "dpe-column-type-editor", inputs: { value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, controlId: { classPropertyName: "controlId", publicName: "controlId", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { valueChange: "valueChange" }, ngImport: i0, template: `
5491
5491
  <div class="dpe-row">
5492
5492
  <div class="dpe-field">
5493
5493
  <label class="dpe-field__label" [attr.for]="controlId() + '-kind'">Tipo</label>
@@ -5555,7 +5555,7 @@ class DpeColumnTypeEditorComponent {
5555
5555
  }
5556
5556
  `, isInline: true, dependencies: [{ kind: "directive", type: DpeSelectValueDirective, selector: "select[dpeValue]", inputs: ["dpeValue"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
5557
5557
  }
5558
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.32", ngImport: i0, type: DpeColumnTypeEditorComponent, decorators: [{
5558
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: DpeColumnTypeEditorComponent, decorators: [{
5559
5559
  type: Component,
5560
5560
  args: [{
5561
5561
  selector: 'dpe-column-type-editor',
@@ -5678,8 +5678,8 @@ class DpeCustomNodeInspectorComponent extends DpeNodeInspectorBase {
5678
5678
  outputFields: this.outputFields().map((field, position) => position === index ? { ...field, ...patch } : field),
5679
5679
  });
5680
5680
  }
5681
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.32", ngImport: i0, type: DpeCustomNodeInspectorComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
5682
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.32", type: DpeCustomNodeInspectorComponent, isStandalone: true, selector: "dpe-custom-node-inspector", usesInheritance: true, ngImport: i0, template: `
5681
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: DpeCustomNodeInspectorComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
5682
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.33", type: DpeCustomNodeInspectorComponent, isStandalone: true, selector: "dpe-custom-node-inspector", usesInheritance: true, ngImport: i0, template: `
5683
5683
  <div class="dpe-form">
5684
5684
  <p class="dpe-note dpe-note--not-compilable">
5685
5685
  Nodo modellato per intero ma <strong>non traducibile in SQL</strong> nella versione 1.
@@ -5799,7 +5799,7 @@ class DpeCustomNodeInspectorComponent extends DpeNodeInspectorBase {
5799
5799
  </div>
5800
5800
  `, isInline: true, dependencies: [{ kind: "component", type: DpeColumnTypeEditorComponent, selector: "dpe-column-type-editor", inputs: ["value", "controlId"], outputs: ["valueChange"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
5801
5801
  }
5802
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.32", ngImport: i0, type: DpeCustomNodeInspectorComponent, decorators: [{
5802
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: DpeCustomNodeInspectorComponent, decorators: [{
5803
5803
  type: Component,
5804
5804
  args: [{
5805
5805
  selector: 'dpe-custom-node-inspector',
@@ -6040,8 +6040,8 @@ class DpeDataSourceInspectorComponent extends DpeNodeInspectorBase {
6040
6040
  removeCsvOptions() {
6041
6041
  this.patch({ csvOptions: undefined });
6042
6042
  }
6043
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.32", ngImport: i0, type: DpeDataSourceInspectorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
6044
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.32", type: DpeDataSourceInspectorComponent, isStandalone: true, selector: "dpe-data-source-inspector", usesInheritance: true, ngImport: i0, template: `
6043
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: DpeDataSourceInspectorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
6044
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.33", type: DpeDataSourceInspectorComponent, isStandalone: true, selector: "dpe-data-source-inspector", usesInheritance: true, ngImport: i0, template: `
6045
6045
  <div class="dpe-form">
6046
6046
  <div class="dpe-field">
6047
6047
  <label class="dpe-field__label" for="ds-kind">Tipo di sorgente</label>
@@ -6243,7 +6243,7 @@ class DpeDataSourceInspectorComponent extends DpeNodeInspectorBase {
6243
6243
  </div>
6244
6244
  `, isInline: true, dependencies: [{ kind: "component", type: DpeColumnTypeEditorComponent, selector: "dpe-column-type-editor", inputs: ["value", "controlId"], outputs: ["valueChange"] }, { kind: "directive", type: DpeSelectValueDirective, selector: "select[dpeValue]", inputs: ["dpeValue"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
6245
6245
  }
6246
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.32", ngImport: i0, type: DpeDataSourceInspectorComponent, decorators: [{
6246
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: DpeDataSourceInspectorComponent, decorators: [{
6247
6247
  type: Component,
6248
6248
  args: [{
6249
6249
  selector: 'dpe-data-source-inspector',
@@ -6536,8 +6536,8 @@ class DpeFilterInspectorComponent extends DpeNodeInspectorBase {
6536
6536
  value: name === '' ? this.criteria()[index]?.value : undefined,
6537
6537
  });
6538
6538
  }
6539
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.32", ngImport: i0, type: DpeFilterInspectorComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
6540
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.32", type: DpeFilterInspectorComponent, isStandalone: true, selector: "dpe-filter-inspector", usesInheritance: true, ngImport: i0, template: `
6539
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: DpeFilterInspectorComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
6540
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.33", type: DpeFilterInspectorComponent, isStandalone: true, selector: "dpe-filter-inspector", usesInheritance: true, ngImport: i0, template: `
6541
6541
  <div class="dpe-form">
6542
6542
  <label class="dpe-check">
6543
6543
  <input
@@ -6704,7 +6704,7 @@ class DpeFilterInspectorComponent extends DpeNodeInspectorBase {
6704
6704
  </div>
6705
6705
  `, isInline: true, dependencies: [{ kind: "directive", type: DpeSelectValueDirective, selector: "select[dpeValue]", inputs: ["dpeValue"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
6706
6706
  }
6707
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.32", ngImport: i0, type: DpeFilterInspectorComponent, decorators: [{
6707
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: DpeFilterInspectorComponent, decorators: [{
6708
6708
  type: Component,
6709
6709
  args: [{
6710
6710
  selector: 'dpe-filter-inspector',
@@ -6956,8 +6956,8 @@ class DpeForecastInspectorComponent extends DpeNodeInspectorBase {
6956
6956
  groupFields: this.groupFields().map((group, position) => position === index ? { ...group, ...patch } : group),
6957
6957
  });
6958
6958
  }
6959
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.32", ngImport: i0, type: DpeForecastInspectorComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
6960
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.32", type: DpeForecastInspectorComponent, isStandalone: true, selector: "dpe-forecast-inspector", usesInheritance: true, ngImport: i0, template: `
6959
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: DpeForecastInspectorComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
6960
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.33", type: DpeForecastInspectorComponent, isStandalone: true, selector: "dpe-forecast-inspector", usesInheritance: true, ngImport: i0, template: `
6961
6961
  <div class="dpe-form">
6962
6962
  <p class="dpe-note dpe-note--not-compilable">
6963
6963
  Nodo modellato per intero ma <strong>non traducibile in SQL</strong> nella versione 1:
@@ -7149,7 +7149,7 @@ class DpeForecastInspectorComponent extends DpeNodeInspectorBase {
7149
7149
  </div>
7150
7150
  `, isInline: true, dependencies: [{ kind: "directive", type: DpeSelectValueDirective, selector: "select[dpeValue]", inputs: ["dpeValue"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
7151
7151
  }
7152
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.32", ngImport: i0, type: DpeForecastInspectorComponent, decorators: [{
7152
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: DpeForecastInspectorComponent, decorators: [{
7153
7153
  type: Component,
7154
7154
  args: [{
7155
7155
  selector: 'dpe-forecast-inspector',
@@ -7388,8 +7388,8 @@ class DpeHierarchyPathInspectorComponent extends DpeNodeInspectorBase {
7388
7388
  aggregateFields: this.fields().map((field, position) => position === index ? { ...field, ...patch } : field),
7389
7389
  });
7390
7390
  }
7391
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.32", ngImport: i0, type: DpeHierarchyPathInspectorComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
7392
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.32", type: DpeHierarchyPathInspectorComponent, isStandalone: true, selector: "dpe-hierarchy-path-inspector", usesInheritance: true, ngImport: i0, template: `
7391
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: DpeHierarchyPathInspectorComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
7392
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.33", type: DpeHierarchyPathInspectorComponent, isStandalone: true, selector: "dpe-hierarchy-path-inspector", usesInheritance: true, ngImport: i0, template: `
7393
7393
  <div class="dpe-form">
7394
7394
  <p class="dpe-note">
7395
7395
  Richiede le CTE ricorsive del dialetto di destinazione: se il dialetto scelto non le
@@ -7541,7 +7541,7 @@ class DpeHierarchyPathInspectorComponent extends DpeNodeInspectorBase {
7541
7541
  </div>
7542
7542
  `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
7543
7543
  }
7544
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.32", ngImport: i0, type: DpeHierarchyPathInspectorComponent, decorators: [{
7544
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: DpeHierarchyPathInspectorComponent, decorators: [{
7545
7545
  type: Component,
7546
7546
  args: [{
7547
7547
  selector: 'dpe-hierarchy-path-inspector',
@@ -7760,8 +7760,8 @@ class DpeJoinInspectorComponent extends DpeNodeInspectorBase {
7760
7760
  fields: this.fields().map((field, position) => position === index ? { ...field, ...patch } : field),
7761
7761
  });
7762
7762
  }
7763
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.32", ngImport: i0, type: DpeJoinInspectorComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
7764
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.32", type: DpeJoinInspectorComponent, isStandalone: true, selector: "dpe-join-inspector", usesInheritance: true, ngImport: i0, template: `
7763
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: DpeJoinInspectorComponent, deps: null, target: i0.ɵɵFactoryTarget.Component });
7764
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.33", type: DpeJoinInspectorComponent, isStandalone: true, selector: "dpe-join-inspector", usesInheritance: true, ngImport: i0, template: `
7765
7765
  <div class="dpe-form">
7766
7766
  <div class="dpe-field">
7767
7767
  <label class="dpe-field__label" for="join-kind">Tipo di join</label>
@@ -7968,7 +7968,7 @@ class DpeJoinInspectorComponent extends DpeNodeInspectorBase {
7968
7968
  </div>
7969
7969
  `, isInline: true, dependencies: [{ kind: "directive", type: DpeSelectValueDirective, selector: "select[dpeValue]", inputs: ["dpeValue"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
7970
7970
  }
7971
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.32", ngImport: i0, type: DpeJoinInspectorComponent, decorators: [{
7971
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: DpeJoinInspectorComponent, decorators: [{
7972
7972
  type: Component,
7973
7973
  args: [{
7974
7974
  selector: 'dpe-join-inspector',
@@ -8418,8 +8418,8 @@ class DpeExpressionEditorComponent {
8418
8418
  text(event) {
8419
8419
  return event.target.value;
8420
8420
  }
8421
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.32", ngImport: i0, type: DpeExpressionEditorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
8422
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.32", type: DpeExpressionEditorComponent, isStandalone: true, selector: "dpe-expression-editor", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, language: { classPropertyName: "language", publicName: "language", isSignal: true, isRequired: false, transformFunction: null }, columns: { classPropertyName: "columns", publicName: "columns", isSignal: true, isRequired: false, transformFunction: null }, issues: { classPropertyName: "issues", publicName: "issues", isSignal: true, isRequired: false, transformFunction: null }, outcome: { classPropertyName: "outcome", publicName: "outcome", isSignal: true, isRequired: false, transformFunction: null }, requiredForm: { classPropertyName: "requiredForm", publicName: "requiredForm", isSignal: true, isRequired: false, transformFunction: null }, formSupport: { classPropertyName: "formSupport", publicName: "formSupport", isSignal: true, isRequired: false, transformFunction: null }, isFormUpdating: { classPropertyName: "isFormUpdating", publicName: "isFormUpdating", isSignal: true, isRequired: false, transformFunction: null }, isCatalogLoading: { classPropertyName: "isCatalogLoading", publicName: "isCatalogLoading", isSignal: true, isRequired: false, transformFunction: null }, controlId: { classPropertyName: "controlId", publicName: "controlId", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { valueChange: "valueChange" }, ngImport: i0, template: `
8421
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: DpeExpressionEditorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
8422
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.33", type: DpeExpressionEditorComponent, isStandalone: true, selector: "dpe-expression-editor", inputs: { label: { classPropertyName: "label", publicName: "label", isSignal: true, isRequired: false, transformFunction: null }, value: { classPropertyName: "value", publicName: "value", isSignal: true, isRequired: false, transformFunction: null }, placeholder: { classPropertyName: "placeholder", publicName: "placeholder", isSignal: true, isRequired: false, transformFunction: null }, language: { classPropertyName: "language", publicName: "language", isSignal: true, isRequired: false, transformFunction: null }, columns: { classPropertyName: "columns", publicName: "columns", isSignal: true, isRequired: false, transformFunction: null }, issues: { classPropertyName: "issues", publicName: "issues", isSignal: true, isRequired: false, transformFunction: null }, outcome: { classPropertyName: "outcome", publicName: "outcome", isSignal: true, isRequired: false, transformFunction: null }, requiredForm: { classPropertyName: "requiredForm", publicName: "requiredForm", isSignal: true, isRequired: false, transformFunction: null }, formSupport: { classPropertyName: "formSupport", publicName: "formSupport", isSignal: true, isRequired: false, transformFunction: null }, isFormUpdating: { classPropertyName: "isFormUpdating", publicName: "isFormUpdating", isSignal: true, isRequired: false, transformFunction: null }, isCatalogLoading: { classPropertyName: "isCatalogLoading", publicName: "isCatalogLoading", isSignal: true, isRequired: false, transformFunction: null }, controlId: { classPropertyName: "controlId", publicName: "controlId", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { valueChange: "valueChange" }, ngImport: i0, template: `
8423
8423
  <div class="dpe-field">
8424
8424
  <!--
8425
8425
  Due pastiglie e non una: il **linguaggio** dice in che lingua si scrive, la **forma** dice
@@ -8543,7 +8543,7 @@ class DpeExpressionEditorComponent {
8543
8543
  </div>
8544
8544
  `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
8545
8545
  }
8546
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.32", ngImport: i0, type: DpeExpressionEditorComponent, decorators: [{
8546
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: DpeExpressionEditorComponent, decorators: [{
8547
8547
  type: Component,
8548
8548
  args: [{
8549
8549
  selector: 'dpe-expression-editor',
@@ -8844,8 +8844,8 @@ class DpeTransformInspectorComponent extends DpeNodeInspectorBase {
8844
8844
  .filter((value) => value.length > 0);
8845
8845
  return values.length > 0 ? values : undefined;
8846
8846
  }
8847
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.32", ngImport: i0, type: DpeTransformInspectorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
8848
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.32", type: DpeTransformInspectorComponent, isStandalone: true, selector: "dpe-transform-inspector", usesInheritance: true, ngImport: i0, template: `
8847
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: DpeTransformInspectorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
8848
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.33", type: DpeTransformInspectorComponent, isStandalone: true, selector: "dpe-transform-inspector", usesInheritance: true, ngImport: i0, template: `
8849
8849
  <div class="dpe-form">
8850
8850
  <div class="dpe-field">
8851
8851
  <label class="dpe-field__label" for="tr-kind">Tipo di trasformazione</label>
@@ -9013,7 +9013,7 @@ class DpeTransformInspectorComponent extends DpeNodeInspectorBase {
9013
9013
  </div>
9014
9014
  `, isInline: true, dependencies: [{ kind: "component", type: DpeColumnTypeEditorComponent, selector: "dpe-column-type-editor", inputs: ["value", "controlId"], outputs: ["valueChange"] }, { kind: "component", type: DpeExpressionEditorComponent, selector: "dpe-expression-editor", inputs: ["label", "value", "placeholder", "language", "columns", "issues", "outcome", "requiredForm", "formSupport", "isFormUpdating", "isCatalogLoading", "controlId"], outputs: ["valueChange"] }, { kind: "directive", type: DpeSelectValueDirective, selector: "select[dpeValue]", inputs: ["dpeValue"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
9015
9015
  }
9016
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.32", ngImport: i0, type: DpeTransformInspectorComponent, decorators: [{
9016
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: DpeTransformInspectorComponent, decorators: [{
9017
9017
  type: Component,
9018
9018
  args: [{
9019
9019
  selector: 'dpe-transform-inspector',
@@ -9393,8 +9393,8 @@ class DpeWritebackInspectorComponent extends DpeNodeInspectorBase {
9393
9393
  sourceFieldName: name === '' ? this.fields()[index]?.sourceFieldName : undefined,
9394
9394
  });
9395
9395
  }
9396
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.32", ngImport: i0, type: DpeWritebackInspectorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
9397
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.32", type: DpeWritebackInspectorComponent, isStandalone: true, selector: "dpe-writeback-inspector", usesInheritance: true, ngImport: i0, template: `
9396
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: DpeWritebackInspectorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
9397
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.33", type: DpeWritebackInspectorComponent, isStandalone: true, selector: "dpe-writeback-inspector", usesInheritance: true, ngImport: i0, template: `
9398
9398
  <div class="dpe-form">
9399
9399
  <div class="dpe-row">
9400
9400
  <div class="dpe-field">
@@ -9793,7 +9793,7 @@ class DpeWritebackInspectorComponent extends DpeNodeInspectorBase {
9793
9793
  </div>
9794
9794
  `, isInline: true, dependencies: [{ kind: "component", type: DpeExpressionEditorComponent, selector: "dpe-expression-editor", inputs: ["label", "value", "placeholder", "language", "columns", "issues", "outcome", "requiredForm", "formSupport", "isFormUpdating", "isCatalogLoading", "controlId"], outputs: ["valueChange"] }, { kind: "directive", type: DpeSelectValueDirective, selector: "select[dpeValue]", inputs: ["dpeValue"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
9795
9795
  }
9796
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.32", ngImport: i0, type: DpeWritebackInspectorComponent, decorators: [{
9796
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: DpeWritebackInspectorComponent, decorators: [{
9797
9797
  type: Component,
9798
9798
  args: [{
9799
9799
  selector: 'dpe-writeback-inspector',
@@ -10291,8 +10291,8 @@ class DpeNodeInspectorComponent {
10291
10291
  asAtomic(node) {
10292
10292
  return node;
10293
10293
  }
10294
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.32", ngImport: i0, type: DpeNodeInspectorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
10295
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.32", type: DpeNodeInspectorComponent, isStandalone: true, selector: "dpe-node-inspector", ngImport: i0, template: `
10294
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: DpeNodeInspectorComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
10295
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.33", type: DpeNodeInspectorComponent, isStandalone: true, selector: "dpe-node-inspector", ngImport: i0, template: `
10296
10296
  @if (located(); as entry) {
10297
10297
  <div class="dpe-form">
10298
10298
  <div class="dpe-field">
@@ -10386,7 +10386,7 @@ class DpeNodeInspectorComponent {
10386
10386
  }
10387
10387
  `, isInline: true, dependencies: [{ kind: "component", type: DpeAggregateInspectorComponent, selector: "dpe-aggregate-inspector" }, { kind: "component", type: DpeAppendInspectorComponent, selector: "dpe-append-inspector" }, { kind: "component", type: DpeAtomicWritebackInspectorComponent, selector: "dpe-atomic-writeback-inspector" }, { kind: "component", type: DpeCustomNodeInspectorComponent, selector: "dpe-custom-node-inspector" }, { kind: "component", type: DpeDataSourceInspectorComponent, selector: "dpe-data-source-inspector" }, { kind: "component", type: DpeFilterInspectorComponent, selector: "dpe-filter-inspector" }, { kind: "component", type: DpeForecastInspectorComponent, selector: "dpe-forecast-inspector" }, { kind: "component", type: DpeHierarchyPathInspectorComponent, selector: "dpe-hierarchy-path-inspector" }, { kind: "component", type: DpeJoinInspectorComponent, selector: "dpe-join-inspector" }, { kind: "component", type: DpeTransformInspectorComponent, selector: "dpe-transform-inspector" }, { kind: "component", type: DpeWritebackInspectorComponent, selector: "dpe-writeback-inspector" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
10388
10388
  }
10389
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.32", ngImport: i0, type: DpeNodeInspectorComponent, decorators: [{
10389
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: DpeNodeInspectorComponent, decorators: [{
10390
10390
  type: Component,
10391
10391
  args: [{
10392
10392
  selector: 'dpe-node-inspector',
@@ -10623,8 +10623,8 @@ class DpeNodeDialogComponent {
10623
10623
  this.store.closeNodeEditor();
10624
10624
  }
10625
10625
  }
10626
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.32", ngImport: i0, type: DpeNodeDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
10627
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.32", type: DpeNodeDialogComponent, isStandalone: true, selector: "dpe-node-dialog", viewQueries: [{ propertyName: "dialogRef", first: true, predicate: ["dlg"], descendants: true, isSignal: true }], ngImport: i0, template: `
10626
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: DpeNodeDialogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
10627
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.33", type: DpeNodeDialogComponent, isStandalone: true, selector: "dpe-node-dialog", viewQueries: [{ propertyName: "dialogRef", first: true, predicate: ["dlg"], descendants: true, isSignal: true }], ngImport: i0, template: `
10628
10628
  <!--
10629
10629
  L’elemento dialog sta **sempre** nel template, e solo il contenuto e’ condizionato: cosi’
10630
10630
  viewChild.required non puo’ fallire e l’effect che apre non deve difendersi da un riferimento
@@ -10712,7 +10712,7 @@ class DpeNodeDialogComponent {
10712
10712
  </dialog>
10713
10713
  `, isInline: true, dependencies: [{ kind: "component", type: DpeNodeFactsComponent, selector: "dpe-node-facts", inputs: ["nodeName"] }, { kind: "component", type: DpeNodeInspectorComponent, selector: "dpe-node-inspector" }, { kind: "component", type: DpeNodeIconComponent, selector: "dpe-node-icon", inputs: ["collection"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
10714
10714
  }
10715
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.32", ngImport: i0, type: DpeNodeDialogComponent, decorators: [{
10715
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: DpeNodeDialogComponent, decorators: [{
10716
10716
  type: Component,
10717
10717
  args: [{
10718
10718
  selector: 'dpe-node-dialog',
@@ -10876,8 +10876,8 @@ class DpeNodePaletteComponent {
10876
10876
  text(event) {
10877
10877
  return event.target.value;
10878
10878
  }
10879
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.32", ngImport: i0, type: DpeNodePaletteComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
10880
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.32", type: DpeNodePaletteComponent, isStandalone: true, selector: "dpe-node-palette", outputs: { nodeRequested: "nodeRequested" }, ngImport: i0, template: `
10879
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: DpeNodePaletteComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
10880
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.33", type: DpeNodePaletteComponent, isStandalone: true, selector: "dpe-node-palette", outputs: { nodeRequested: "nodeRequested" }, ngImport: i0, template: `
10881
10881
  <h3>Nodi</h3>
10882
10882
  <input
10883
10883
  type="search"
@@ -10924,7 +10924,7 @@ class DpeNodePaletteComponent {
10924
10924
  }
10925
10925
  `, isInline: true, dependencies: [{ kind: "ngmodule", type: FFlowModule }, { kind: "directive", type: i1.FExternalItem, selector: "[fExternalItem]", inputs: ["fExternalItemId", "fData", "fDisabled", "fPreview", "fPreviewMatchSize", "fPlaceholder"], outputs: ["fPreviewChange", "fPlaceholderChange"] }, { kind: "component", type: DpeNodeIconComponent, selector: "dpe-node-icon", inputs: ["collection"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
10926
10926
  }
10927
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.32", ngImport: i0, type: DpeNodePaletteComponent, decorators: [{
10927
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: DpeNodePaletteComponent, decorators: [{
10928
10928
  type: Component,
10929
10929
  args: [{
10930
10930
  selector: 'dpe-node-palette',
@@ -11023,8 +11023,8 @@ class DpeSqlPreviewComponent {
11023
11023
  }
11024
11024
  return typeof value === 'object' ? JSON.stringify(value) : String(value);
11025
11025
  }
11026
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.32", ngImport: i0, type: DpeSqlPreviewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
11027
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.32", type: DpeSqlPreviewComponent, isStandalone: true, selector: "dpe-sql-preview", ngImport: i0, template: `
11026
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: DpeSqlPreviewComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
11027
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.33", type: DpeSqlPreviewComponent, isStandalone: true, selector: "dpe-sql-preview", ngImport: i0, template: `
11028
11028
  <div class="dpe-sql__bar">
11029
11029
  <button
11030
11030
  type="button"
@@ -11100,7 +11100,7 @@ class DpeSqlPreviewComponent {
11100
11100
  }
11101
11101
  `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
11102
11102
  }
11103
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.32", ngImport: i0, type: DpeSqlPreviewComponent, decorators: [{
11103
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: DpeSqlPreviewComponent, decorators: [{
11104
11104
  type: Component,
11105
11105
  args: [{
11106
11106
  selector: 'dpe-sql-preview',
@@ -11250,8 +11250,8 @@ class DpeSchemaPanelComponent {
11250
11250
  };
11251
11251
  });
11252
11252
  }, ...(ngDevMode ? [{ debugName: "rows" }] : []));
11253
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.32", ngImport: i0, type: DpeSchemaPanelComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
11254
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.32", type: DpeSchemaPanelComponent, isStandalone: true, selector: "dpe-schema-panel", ngImport: i0, template: `
11253
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: DpeSchemaPanelComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
11254
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.33", type: DpeSchemaPanelComponent, isStandalone: true, selector: "dpe-schema-panel", ngImport: i0, template: `
11255
11255
  @if (!hasResult()) {
11256
11256
  <p class="dpe-schema__empty">In attesa della propagazione dello schema dal backend…</p>
11257
11257
  }
@@ -11317,7 +11317,7 @@ class DpeSchemaPanelComponent {
11317
11317
  }
11318
11318
  `, isInline: true, changeDetection: i0.ChangeDetectionStrategy.OnPush });
11319
11319
  }
11320
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.32", ngImport: i0, type: DpeSchemaPanelComponent, decorators: [{
11320
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: DpeSchemaPanelComponent, decorators: [{
11321
11321
  type: Component,
11322
11322
  args: [{
11323
11323
  selector: 'dpe-schema-panel',
@@ -11612,8 +11612,8 @@ class DpeBuilderComponent {
11612
11612
  markSaved() {
11613
11613
  this.store.markSaved();
11614
11614
  }
11615
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.32", ngImport: i0, type: DpeBuilderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
11616
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.32", type: DpeBuilderComponent, isStandalone: true, selector: "dpe-builder", inputs: { definition: { classPropertyName: "definition", publicName: "definition", isSignal: true, isRequired: true, transformFunction: null }, isEditable: { classPropertyName: "isEditable", publicName: "isEditable", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { definitionChange: "definitionChange" }, host: { listeners: { "keydown": "onKeyDown($event)" } }, providers: [
11615
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: DpeBuilderComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
11616
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.33", type: DpeBuilderComponent, isStandalone: true, selector: "dpe-builder", inputs: { definition: { classPropertyName: "definition", publicName: "definition", isSignal: true, isRequired: true, transformFunction: null }, isEditable: { classPropertyName: "isEditable", publicName: "isEditable", isSignal: true, isRequired: false, transformFunction: null } }, outputs: { definitionChange: "definitionChange" }, host: { listeners: { "keydown": "onKeyDown($event)" } }, providers: [
11617
11617
  DpeDocumentStore,
11618
11618
  DpeLayoutService,
11619
11619
  DpeValidationService,
@@ -11621,7 +11621,7 @@ class DpeBuilderComponent {
11621
11621
  DpeFormulaCatalogStore,
11622
11622
  ], viewQueries: [{ propertyName: "canvas", first: true, predicate: DpeCanvasComponent, descendants: true, isSignal: true }], ngImport: i0, template: "<!--\r\n `.dpe-builder` porta le variabili del tema: e\u2019 la classe radice su cui l\u2019app ospite le\r\n sovrascrive, e `data-dpe-theme=\"dark\"` sul contenitore ridefinisce i soli token.\r\n-->\r\n<div class=\"dpe-builder dpe-shell\">\r\n <header class=\"dpe-shell__bar\">\r\n <div class=\"dpe-shell__title\">\r\n <strong>{{ store.definition().label || store.definition().name || 'Definizione DPE' }}</strong>\r\n <span class=\"dpe-shell__sub\">{{ nodeCount() }} nodi</span>\r\n <!--\r\n Stato **sporco** rispetto all\u2019ultimo salvataggio, non un conteggio di operazioni: serve a\r\n decidere se salvare, e un contatore che sale quando si annulla risponde alla domanda\r\n sbagliata. Annullare fino allo stato di partenza torna qui a \u00ABnessuna modifica\u00BB.\r\n -->\r\n <span\r\n class=\"dpe-shell__dirty\"\r\n [class.dpe-shell__dirty--on]=\"store.isDirty()\"\r\n [title]=\"\r\n store.isDirty()\r\n ? 'Il documento differisce dall\u2019ultimo salvataggio'\r\n : 'Il documento coincide con l\u2019ultimo salvataggio'\r\n \"\r\n >\r\n @if (store.isDirty()) {\r\n \u25CF modificata\r\n } @else {\r\n \u25CB nessuna modifica\r\n }\r\n </span>\r\n </div>\r\n\r\n <!--\r\n Badge in **sola lettura** (ADR 0017): il dialetto e\u2019 dichiarato dall\u2019ambiente, non scelto\r\n qui. Mostra quello della definizione, che e\u2019 quello con cui il backend compilera\u2019 (ADR\r\n 0009). Il titolo dice le due cose che contano \u2014 chi lo decide, e che il dialetto decide con\r\n quali capacita\u2019 si compila. Non dice piu\u2019 che le espressioni sono SQL di quel dialetto: da\r\n quando sono **formule** (ADR 0031) non lo sono, e il linguaggio si nomina accanto al campo.\r\n -->\r\n <span\r\n class=\"dpe-shell__dialect\"\r\n title=\"Il dialetto e\u2019 dichiarato dall\u2019ambiente e non si modifica dall\u2019editor: decide con quali capacita\u2019 il backend compilera\u2019 questa definizione.\"\r\n >\r\n Dialetto \u00B7 <strong>{{ dialectLabels[dialect()] }}</strong>\r\n </span>\r\n\r\n <div class=\"dpe-shell__group\">\r\n <button\r\n type=\"button\"\r\n class=\"dpe-shell__btn\"\r\n [disabled]=\"!store.canUndo()\"\r\n title=\"Annulla (la cronologia e\u2019 una conseguenza dell\u2019immutabilita\u2019 dello stato)\"\r\n (click)=\"store.undo()\"\r\n >\r\n \u21B6 Annulla\r\n </button>\r\n <button\r\n type=\"button\"\r\n class=\"dpe-shell__btn\"\r\n [disabled]=\"!store.canRedo()\"\r\n title=\"Ripeti\"\r\n (click)=\"store.redo()\"\r\n >\r\n \u21B7 Ripeti\r\n </button>\r\n <button type=\"button\" class=\"dpe-shell__btn\" title=\"Riordina il grafo\" (click)=\"runAutoLayout()\">\r\n \u2317 Riordina\r\n </button>\r\n </div>\r\n\r\n <!--\r\n Salvataggio attraverso il contratto (`DpeBuilderApi.save`, opzionale). E\u2019 il comando\r\n **primario**, separato dal gruppo annulla/ripeti/riordina: quelli disfano, questo scrive.\r\n\r\n **Sempre presente, mai nascosto.** Un bottone assente dice \u00ABquesto editor non salva\u00BB; un\r\n bottone disabilitato con il motivo dice \u00ABqui non si salva, ed ecco perche\u2019\u00BB \u2014 ed e\u2019 la\r\n verita\u2019 quando l\u2019host non espone `save()`. La disponibilita\u2019 si sa **prima del clic**\r\n (`core/dpe-capabilities.ts`), non dal primo fallimento.\r\n -->\r\n <div class=\"dpe-shell__group dpe-shell__group--primary\">\r\n <button\r\n type=\"button\"\r\n class=\"dpe-shell__btn dpe-shell__btn--primary\"\r\n [disabled]=\"!canSave()\"\r\n [title]=\"\r\n !validation.isSaveAvailable()\r\n ? 'Salvataggio non disponibile su questo ambiente: l\u2019host non espone save()'\r\n : validation.isSaving()\r\n ? 'Salvataggio in corso'\r\n : !hasKey()\r\n ? 'Il documento non ha un nome: e\u2019 la chiave del catalogo, e va creato da la\u2019 (l\u2019aggiornamento e\u2019 PUT /definitions/{nome})'\r\n : store.isDirty()\r\n ? 'Salva la definizione (Ctrl+S)'\r\n : 'Nessuna modifica da salvare'\r\n \"\r\n (click)=\"validation.save()\"\r\n >\r\n @if (validation.isSaving()) {\r\n \u2913 Salvataggio\u2026\r\n } @else {\r\n \u2913 Salva\r\n }\r\n </button>\r\n @if (validation.justSaved()) {\r\n <!-- Avviso transitorio: il fatto durevole e\u2019 \u00ABnessuna modifica\u00BB nell\u2019indicatore. -->\r\n <span class=\"dpe-shell__toast\" role=\"status\">\u2713 Salvata</span>\r\n }\r\n </div>\r\n\r\n <div class=\"dpe-shell__status\">\r\n @if (validation.isValidating()) {\r\n <span class=\"dpe-shell__pill dpe-shell__pill--busy\">Validazione in corso\u2026</span>\r\n } @else if (validation.error(); as error) {\r\n <!--\r\n Un guasto di trasporto non cancella le diagnostiche precedenti: dire \u00ABva tutto bene\u00BB\r\n quando non lo sappiamo piu\u2019 e\u2019 peggio che mostrare un risultato vecchio dichiarandolo.\r\n -->\r\n <span class=\"dpe-shell__pill dpe-shell__pill--error\" [title]=\"error.message\">\r\n Backend non raggiungibile ({{ error.category }})\r\n </span>\r\n } @else if (store.validateResult()) {\r\n <span\r\n class=\"dpe-shell__pill\"\r\n [class.dpe-shell__pill--error]=\"store.validateResult()!.hasErrors\"\r\n [class.dpe-shell__pill--ok]=\"!store.validateResult()!.hasErrors\"\r\n >\r\n @if (store.validateResult()!.hasErrors) {\r\n Con errori\r\n } @else {\r\n Nessun errore\r\n }\r\n </span>\r\n }\r\n </div>\r\n </header>\r\n\r\n @if (dialectMismatch(); as declared) {\r\n <!--\r\n Disallineamento fra la dichiarazione dell\u2019ambiente e la definizione (ADR 0017). Si nominano\r\n **entrambi** i dialetti e non si offre di correggere: cambiare dialetto cambia le capacita\u2019\r\n con cui si compila e i dialetti che il compilatore di formule copre (ADR 0031 \u00A75), ed e\u2019\r\n dell\u2019host. Non e\u2019 una regola di dominio duplicata \u2014 non giudica la definizione, riporta il\r\n disaccordo fra due fatti che l\u2019ospite ha fornito.\r\n -->\r\n <div class=\"dpe-shell__warn\" role=\"alert\">\r\n <strong>\r\n L\u2019ambiente dichiara {{ dialectLabels[declared] }}, la definizione e\u2019 scritta per\r\n {{ dialectLabels[dialect()] }}.\r\n </strong>\r\n <p>\r\n Il backend compilera\u2019 con il dialetto <strong>della definizione</strong>. Allinearli cambia\r\n le capacita\u2019 con cui si compila, e non si fa da qui.\r\n </p>\r\n </div>\r\n }\r\n\r\n <!--\r\n Il documento ricevuto non e' una definizione. Banner **persistente** e in cima: e' un difetto\r\n dell'integrazione, non dell'utente, e un canvas vuoto da solo non lo dice \u2014 sembra una\r\n definizione senza nodi. Non si nasconde l'editor: cio' che c'e' resta visibile, e il salvataggio\r\n e' disabilitato da se' perche' la chiave manca.\r\n -->\r\n @if (documentProblem(); as problem) {\r\n <div class=\"dpe-shell__warn dpe-shell__warn--error\" role=\"alert\">\r\n <strong>Il documento ricevuto non e\u2019 una definizione: {{ problem }}.</strong>\r\n <p>\r\n L\u2019editor riceve il documento dall\u2019applicazione ospite, e questo non ha la forma di una\r\n <code>DpeDefinition</code>. Le tre cause reali: il backend restituisce l\u2019involucro di lettura\r\n (<code>{{ '{' }} definition, diagnostics {{ '}' }}</code>) invece del documento; l\u2019ospite\r\n passa il <strong>sommario</strong> del catalogo al posto della definizione caricata con\r\n <code>load(nome)</code>; la risposta e\u2019 in PascalCase (<code>Name</code> non e\u2019\r\n <code>name</code>).\r\n </p>\r\n </div>\r\n }\r\n\r\n @if (validation.saveError(); as error) {\r\n <!--\r\n Banner **persistente**: un salvataggio fallito in silenzio e\u2019 peggio di nessun salvataggio,\r\n perche\u2019 l\u2019indicatore \u00ABmodificata\u00BB sparirebbe per un\u2019operazione che non e\u2019 avvenuta. Qui non\r\n sparisce: `markSaved()` viene chiamato solo al successo.\r\n -->\r\n <div class=\"dpe-shell__warn dpe-shell__warn--error\" role=\"alert\">\r\n <strong>Salvataggio non riuscito ({{ error.category }})</strong>\r\n <p>{{ error.message }}</p>\r\n <div class=\"dpe-shell__group\">\r\n <button type=\"button\" class=\"dpe-shell__btn\" (click)=\"validation.dismissSaveError()\">\r\n Ho capito\r\n </button>\r\n </div>\r\n </div>\r\n }\r\n\r\n @if (selectedNames().length > 1) {\r\n <!--\r\n Striscia contestuale della **selezione multipla**. Sta qui, fra i banner di documento e il\r\n corpo, perche' e' un fatto che riguarda l\u2019insieme e non un nodo \u2014 ed e' dove l\u2019occhio guarda\r\n per i fatti dell\u2019insieme. Non mostra i campi di un nodo: mostrarli mentre N sono evidenziati\r\n e' la stessa bugia della doppia evidenziazione, detta piu' piano.\r\n -->\r\n <div class=\"dpe-shell__multi\">\r\n <div class=\"dpe-shell__multi-head\">\r\n <strong>{{ selectedNames().length }} nodi selezionati</strong>\r\n <ul class=\"dpe-multi__names\">\r\n @for (name of selectedNames(); track $index) {\r\n <li class=\"dpe-multi__name\">{{ name }}</li>\r\n }\r\n </ul>\r\n </div>\r\n\r\n <div class=\"dpe-shell__group\">\r\n <button type=\"button\" class=\"dpe-shell__btn\" (click)=\"removeSelectedNodes()\">\r\n Elimina i {{ selectedNames().length }} nodi\r\n </button>\r\n <!--\r\n Il riordino e\u2019 dichiaratamente **dell\u2019intero grafo**: dagre su un sottografo sarebbe una\r\n funzione nuova, e chiamarla \u00ABriordina i selezionati\u00BB mentre riordina tutto sarebbe una\r\n bugia \u2014 la stessa classe di difetto che questa striscia esiste per evitare.\r\n -->\r\n <button type=\"button\" class=\"dpe-shell__btn\" (click)=\"runAutoLayout()\">\r\n Riordina il grafo\r\n </button>\r\n </div>\r\n\r\n <p class=\"dpe-note dpe-note--warning\">\r\n L\u2019eliminazione lascia i riferimenti a valle cos\u00EC come sono: diventano riferimenti rotti, e\r\n il backend li segnala. Si annulla con \u21B6.\r\n </p>\r\n </div>\r\n }\r\n\r\n <div class=\"dpe-shell__body\">\r\n <dpe-node-palette class=\"dpe-shell__palette\" (nodeRequested)=\"onNodeRequested($event)\" />\r\n\r\n <dpe-canvas\r\n class=\"dpe-shell__canvas\"\r\n [isEditable]=\"isEditable()\"\r\n (nodeDropped)=\"onNodeDropped($event)\"\r\n (nodeOpened)=\"onNodeOpened($event)\"\r\n />\r\n </div>\r\n\r\n <!--\r\n **Una sola istanza**, fratello di `.dpe-shell__body`: non dentro il canvas (finirebbe nella\r\n trasformazione CSS di `f-canvas`) e non dentro il corpo (partecipererebbe alla griglia). Non\r\n partecipa al layout: `showModal()` la promuove nel top layer, quindi aprirla non produce\r\n nessun reflow del canvas e non c'e' nessuna inquadratura da rifare.\r\n -->\r\n <dpe-node-dialog />\r\n\r\n <div class=\"dpe-shell__bottom\">\r\n <div class=\"dpe-shell__tabs\" role=\"tablist\" aria-label=\"Pannelli\">\r\n <button\r\n type=\"button\"\r\n role=\"tab\"\r\n class=\"dpe-shell__tab\"\r\n [class.dpe-shell__tab--active]=\"bottomTab() === 'diagnostics'\"\r\n [attr.aria-selected]=\"bottomTab() === 'diagnostics'\"\r\n (click)=\"bottomTab.set('diagnostics')\"\r\n >\r\n Diagnostiche\r\n </button>\r\n <button\r\n type=\"button\"\r\n role=\"tab\"\r\n class=\"dpe-shell__tab\"\r\n [class.dpe-shell__tab--active]=\"bottomTab() === 'schema'\"\r\n [attr.aria-selected]=\"bottomTab() === 'schema'\"\r\n (click)=\"bottomTab.set('schema')\"\r\n >\r\n Schema\r\n </button>\r\n <button\r\n type=\"button\"\r\n role=\"tab\"\r\n class=\"dpe-shell__tab\"\r\n [class.dpe-shell__tab--active]=\"bottomTab() === 'sql'\"\r\n [attr.aria-selected]=\"bottomTab() === 'sql'\"\r\n (click)=\"bottomTab.set('sql')\"\r\n >\r\n SQL generato\r\n </button>\r\n </div>\r\n\r\n @switch (bottomTab()) {\r\n @case ('diagnostics') {\r\n <dpe-diagnostics-panel class=\"dpe-shell__panel\" (navigate)=\"onNavigate($event)\" />\r\n }\r\n @case ('schema') {\r\n <dpe-schema-panel class=\"dpe-shell__panel\" />\r\n }\r\n @case ('sql') {\r\n <dpe-sql-preview class=\"dpe-shell__panel\" />\r\n }\r\n }\r\n </div>\r\n</div>\r\n", dependencies: [{ kind: "component", type: DpeCanvasComponent, selector: "dpe-canvas", inputs: ["isEditable"], outputs: ["nodeOpened", "nodeDropped"] }, { kind: "component", type: DpeDiagnosticsPanelComponent, selector: "dpe-diagnostics-panel", outputs: ["navigate"] }, { kind: "component", type: DpeNodeDialogComponent, selector: "dpe-node-dialog" }, { kind: "component", type: DpeNodePaletteComponent, selector: "dpe-node-palette", outputs: ["nodeRequested"] }, { kind: "component", type: DpeSchemaPanelComponent, selector: "dpe-schema-panel" }, { kind: "component", type: DpeSqlPreviewComponent, selector: "dpe-sql-preview" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
11623
11623
  }
11624
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.32", ngImport: i0, type: DpeBuilderComponent, decorators: [{
11624
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: DpeBuilderComponent, decorators: [{
11625
11625
  type: Component,
11626
11626
  args: [{ selector: 'dpe-builder', standalone: true, imports: [
11627
11627
  DpeCanvasComponent,
@@ -11781,10 +11781,10 @@ class DpeCatalogComponent {
11781
11781
  const parsed = new Date(value);
11782
11782
  return Number.isNaN(parsed.getTime()) ? value : parsed.toLocaleDateString();
11783
11783
  }
11784
- static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.32", ngImport: i0, type: DpeCatalogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
11785
- static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.32", type: DpeCatalogComponent, isStandalone: true, selector: "dpe-catalog", outputs: { open: "open" }, providers: [DpeCatalogStore], viewQueries: [{ propertyName: "duplicateNameField", first: true, predicate: ["duplicateNameField"], descendants: true, isSignal: true }], ngImport: i0, template: "<!--\r\n `.dpe-theme` porta le variabili del tema anche fuori dall\u2019editor: il catalogo e\u2019 un componente\r\n **fratello**, quindi non puo\u2019 contare sulla classe radice di `<dpe-builder>`. La variante scura\r\n resta quella prevista, `data-dpe-theme=\"dark\"` su un contenitore dell\u2019ospite.\r\n-->\r\n<section class=\"dpe-theme dpe-cat\" aria-labelledby=\"dpe-cat-title\">\r\n <header class=\"dpe-cat__bar\">\r\n <h2 class=\"dpe-cat__title\" id=\"dpe-cat-title\">Definizioni DPE</h2>\r\n\r\n <span class=\"dpe-cat__count\">\r\n @if (store.isLoading()) {\r\n caricamento\u2026\r\n } @else if (!store.capabilities.listDefinitions) {\r\n elenco non disponibile\r\n } @else {\r\n {{ visible().length }} di {{ store.summaries().length }}\r\n }\r\n </span>\r\n\r\n <input\r\n class=\"dpe-cat__filter\"\r\n type=\"search\"\r\n placeholder=\"Filtra per nome o etichetta\"\r\n aria-label=\"Filtra le definizioni\"\r\n [value]=\"filter()\"\r\n (input)=\"filter.set($any($event.target).value)\"\r\n />\r\n\r\n <button\r\n type=\"button\"\r\n class=\"dpe-cat__btn\"\r\n [disabled]=\"!store.capabilities.listDefinitions || store.isLoading()\"\r\n [title]=\"\r\n store.capabilities.listDefinitions\r\n ? 'Ricarica l\u2019elenco'\r\n : 'Questo ambiente non implementa listDefinitions.'\r\n \"\r\n (click)=\"refresh()\"\r\n >\r\n \u27F3 Aggiorna\r\n </button>\r\n </header>\r\n\r\n @if (store.error(); as error) {\r\n <!--\r\n Banner persistente: un errore di catalogo che svanisce lascia un elenco vecchio senza dire\r\n che e\u2019 vecchio. La categoria si mostra perche\u2019 distingue \u00ABriprova\u00BB da \u00ABchiedi all\u2019ospite\u00BB.\r\n -->\r\n <p class=\"dpe-cat__error\" role=\"alert\">\r\n <strong>{{ error.category }}</strong> {{ error.message }}\r\n <button type=\"button\" class=\"dpe-cat__dismiss\" aria-label=\"Chiudi\" (click)=\"store.dismissError()\">\r\n \u00D7\r\n </button>\r\n </p>\r\n }\r\n\r\n <ul class=\"dpe-cat__list\">\r\n @for (summary of visible(); track summary.name) {\r\n <li class=\"dpe-cat__item\" [class.dpe-cat__item--busy]=\"store.isMutating()\">\r\n <div class=\"dpe-cat__row\">\r\n <button\r\n type=\"button\"\r\n class=\"dpe-cat__open\"\r\n [title]=\"'Apri ' + summary.label\"\r\n (click)=\"onOpen(summary.name)\"\r\n >\r\n <span class=\"dpe-cat__label\">{{ summary.label }}</span>\r\n <span class=\"dpe-cat__meta\">\r\n <!--\r\n Solo i fatti **presenti**: cio\u2019 che il sommario non porta non si stima. Contare i\r\n nodi lato client vorrebbe dire caricare tutte le definizioni per disegnare un\r\n elenco (ADR 0019).\r\n -->\r\n <code class=\"dpe-cat__name\">{{ summary.name }}</code>\r\n <span class=\"dpe-cat__dot\">&nbsp;\u00B7&nbsp;</span>\r\n {{ dialectLabels[summary.dialect] }}\r\n @if (summary.status) {\r\n <span class=\"dpe-cat__dot\">&nbsp;\u00B7&nbsp;</span>\r\n {{ summary.status === 'Active' ? 'attiva' : 'non attiva' }}\r\n }\r\n @if (summary.runMode) {\r\n <span class=\"dpe-cat__dot\">&nbsp;\u00B7&nbsp;</span>\r\n {{ summary.runMode === 'Batch' ? 'batch' : 'a richiesta' }}\r\n }\r\n @if (summary.isTemplate) {\r\n <span class=\"dpe-cat__dot\">&nbsp;\u00B7&nbsp;</span>\r\n modello\r\n }\r\n @if (summary.nodeCount !== undefined) {\r\n <span class=\"dpe-cat__dot\">&nbsp;\u00B7&nbsp;</span>\r\n {{ summary.nodeCount }} {{ summary.nodeCount === 1 ? 'nodo' : 'nodi' }}\r\n }\r\n @if (summary.updatedAt) {\r\n <span class=\"dpe-cat__dot\">&nbsp;\u00B7&nbsp;</span>\r\n {{ formatDate(summary.updatedAt) }}\r\n @if (summary.updatedBy) {\r\n \u00B7 {{ summary.updatedBy }}\r\n }\r\n }\r\n </span>\r\n @if (summary.description) {\r\n <span class=\"dpe-cat__desc\">{{ summary.description }}</span>\r\n }\r\n </button>\r\n\r\n <!--\r\n `hasErrors` e\u2019 **riportato, non ricalcolato** (ADR 0019): il frontend non valida\r\n niente. Per questo l\u2019etichetta dice \u00ABultima validazione nota\u00BB e non \u00ABinvalida\u00BB: puo\u2019\r\n essere vecchia, e spacciarla per verita\u2019 sarebbe una validazione fatta dal client per\r\n interposta persona. Assente, non compare nulla.\r\n -->\r\n @if (summary.hasErrors !== undefined) {\r\n <span\r\n class=\"dpe-cat__flag\"\r\n [class.dpe-cat__flag--errors]=\"summary.hasErrors\"\r\n [title]=\"\r\n summary.hasErrors\r\n ? 'Ultima validazione nota all\u2019ambiente: con errori. E\u2019 uno stato riportato, non ricalcolato qui.'\r\n : 'Ultima validazione nota all\u2019ambiente: senza errori. E\u2019 uno stato riportato, non ricalcolato qui.'\r\n \"\r\n >\r\n {{ summary.hasErrors ? 'con errori (stato noto)' : 'senza errori (stato noto)' }}\r\n </span>\r\n }\r\n\r\n <div class=\"dpe-cat__actions\">\r\n <button\r\n type=\"button\"\r\n class=\"dpe-cat__btn\"\r\n [disabled]=\"!canDuplicate() || store.isMutating()\"\r\n [title]=\"duplicateReason()\"\r\n (click)=\"startDuplicate(summary)\"\r\n >\r\n Duplica\r\n </button>\r\n\r\n @if (pendingDelete() === summary.name) {\r\n <!-- Conferma in **due passi**: la prima pressione chiede, la seconda cancella. -->\r\n <span class=\"dpe-cat__confirm\">\r\n Eliminare \u00AB{{ summary.name }}\u00BB?\r\n <button\r\n type=\"button\"\r\n class=\"dpe-cat__btn dpe-cat__btn--danger\"\r\n (click)=\"confirmDelete(summary.name)\"\r\n >\r\n Elimina\r\n </button>\r\n <button type=\"button\" class=\"dpe-cat__btn\" (click)=\"cancelDelete()\">Annulla</button>\r\n </span>\r\n } @else {\r\n <button\r\n type=\"button\"\r\n class=\"dpe-cat__btn\"\r\n [disabled]=\"!store.capabilities.deleteDefinition || store.isMutating()\"\r\n [title]=\"\r\n store.capabilities.deleteDefinition\r\n ? 'Elimina (chiede conferma)'\r\n : 'Eliminazione non disponibile: questo ambiente non implementa deleteDefinition.'\r\n \"\r\n (click)=\"askDelete(summary.name)\"\r\n >\r\n Elimina\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n\r\n @if (duplicateSource() === summary.name) {\r\n <!--\r\n Duplicare e\u2019 `load` piu\u2019 `createDefinition`: nessuna primitiva nuova sul contratto.\r\n Il dialetto resta quello della definizione copiata: cambiarlo copiando sarebbe una\r\n migrazione silenziosa delle capacita\u2019 con cui la copia verra\u2019 compilata.\r\n -->\r\n <div class=\"dpe-cat__form dpe-cat__form--inline\">\r\n <label class=\"dpe-cat__field\">\r\n <span>Nome della copia</span>\r\n <input\r\n #duplicateNameField\r\n class=\"dpe-cat__input\"\r\n [value]=\"duplicateName()\"\r\n (input)=\"duplicateName.set($any($event.target).value)\"\r\n />\r\n </label>\r\n <label class=\"dpe-cat__field\">\r\n <span>Etichetta della copia</span>\r\n <input\r\n class=\"dpe-cat__input\"\r\n [value]=\"duplicateLabel()\"\r\n (input)=\"duplicateLabel.set($any($event.target).value)\"\r\n />\r\n </label>\r\n <button\r\n type=\"button\"\r\n class=\"dpe-cat__btn dpe-cat__btn--primary\"\r\n [disabled]=\"!canSubmitDuplicate()\"\r\n (click)=\"confirmDuplicate()\"\r\n >\r\n Duplica\r\n </button>\r\n <button type=\"button\" class=\"dpe-cat__btn\" (click)=\"cancelDuplicate()\">Annulla</button>\r\n </div>\r\n }\r\n </li>\r\n } @empty {\r\n <li class=\"dpe-cat__empty\">\r\n @if (!store.capabilities.listDefinitions) {\r\n Questo ambiente non implementa <code>listDefinitions</code>: l\u2019elenco lo fornisce\r\n l\u2019applicazione ospite.\r\n } @else if (store.isLoading()) {\r\n Caricamento dell\u2019elenco\u2026\r\n } @else if (isFilteredEmpty()) {\r\n Nessuna definizione corrisponde al filtro.\r\n } @else if (store.hasLoaded()) {\r\n Nessuna definizione. Creane una qui sotto.\r\n } @else {\r\n Elenco non disponibile.\r\n }\r\n </li>\r\n }\r\n </ul>\r\n\r\n <footer class=\"dpe-cat__foot\">\r\n <div class=\"dpe-cat__form\">\r\n <label class=\"dpe-cat__field\">\r\n <span>Nome tecnico</span>\r\n <input\r\n class=\"dpe-cat__input\"\r\n placeholder=\"RiepilogoOrdini\"\r\n [value]=\"newName()\"\r\n [disabled]=\"!store.createCommand.isAvailable\"\r\n (input)=\"newName.set($any($event.target).value)\"\r\n />\r\n </label>\r\n <label class=\"dpe-cat__field\">\r\n <!--\r\n Si chiedono **due** campi e non uno: passare il nome anche come etichetta produce per\r\n sempre un catalogo di nomi tecnici, e un default sbagliato non si corregge piu\u2019.\r\n -->\r\n <span>Etichetta</span>\r\n <input\r\n class=\"dpe-cat__input\"\r\n placeholder=\"Riepilogo ordini\"\r\n [value]=\"newLabel()\"\r\n [disabled]=\"!store.createCommand.isAvailable\"\r\n (input)=\"newLabel.set($any($event.target).value)\"\r\n />\r\n </label>\r\n <button\r\n type=\"button\"\r\n class=\"dpe-cat__btn dpe-cat__btn--primary\"\r\n [disabled]=\"!canSubmitNew()\"\r\n [title]=\"\r\n store.createCommand.reason ??\r\n 'Crea la definizione e la apre. Il dialetto viene dall\u2019ambiente, non si sceglie qui.'\r\n \"\r\n (click)=\"createNew()\"\r\n >\r\n + Crea e apri\r\n </button>\r\n </div>\r\n\r\n <p class=\"dpe-cat__hint\">\r\n @if (store.createCommand.isAvailable) {\r\n <!--\r\n Detto **al momento della creazione**, non lasciato scoprire: una definizione nuova non\r\n ha sorgenti ne\u2019 writeback, quindi l\u2019editor la segnalera\u2019 invalida. E\u2019 normale \u2014 il\r\n modello tollera l\u2019incompleto e la validazione lo racconta.\r\n -->\r\n Il dialetto della definizione nuova e\u2019 quello dichiarato dall\u2019ambiente\r\n @if (store.environmentDialect(); as declared) {\r\n (<strong>{{ dialectLabels[declared] }}</strong>)\r\n }\r\n e non si sceglie qui. Una definizione appena creata\r\n e\u2019 <strong>invalida</strong> \u2014 servono almeno una sorgente e un writeback \u2014 ed e\u2019 normale.\r\n } @else {\r\n {{ store.createCommand.reason }}\r\n }\r\n </p>\r\n </footer>\r\n</section>\r\n", changeDetection: i0.ChangeDetectionStrategy.OnPush });
11784
+ static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: DpeCatalogComponent, deps: [], target: i0.ɵɵFactoryTarget.Component });
11785
+ static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "20.3.33", type: DpeCatalogComponent, isStandalone: true, selector: "dpe-catalog", outputs: { open: "open" }, providers: [DpeCatalogStore], viewQueries: [{ propertyName: "duplicateNameField", first: true, predicate: ["duplicateNameField"], descendants: true, isSignal: true }], ngImport: i0, template: "<!--\r\n `.dpe-theme` porta le variabili del tema anche fuori dall\u2019editor: il catalogo e\u2019 un componente\r\n **fratello**, quindi non puo\u2019 contare sulla classe radice di `<dpe-builder>`. La variante scura\r\n resta quella prevista, `data-dpe-theme=\"dark\"` su un contenitore dell\u2019ospite.\r\n-->\r\n<section class=\"dpe-theme dpe-cat\" aria-labelledby=\"dpe-cat-title\">\r\n <header class=\"dpe-cat__bar\">\r\n <h2 class=\"dpe-cat__title\" id=\"dpe-cat-title\">Definizioni DPE</h2>\r\n\r\n <span class=\"dpe-cat__count\">\r\n @if (store.isLoading()) {\r\n caricamento\u2026\r\n } @else if (!store.capabilities.listDefinitions) {\r\n elenco non disponibile\r\n } @else {\r\n {{ visible().length }} di {{ store.summaries().length }}\r\n }\r\n </span>\r\n\r\n <input\r\n class=\"dpe-cat__filter\"\r\n type=\"search\"\r\n placeholder=\"Filtra per nome o etichetta\"\r\n aria-label=\"Filtra le definizioni\"\r\n [value]=\"filter()\"\r\n (input)=\"filter.set($any($event.target).value)\"\r\n />\r\n\r\n <button\r\n type=\"button\"\r\n class=\"dpe-cat__btn\"\r\n [disabled]=\"!store.capabilities.listDefinitions || store.isLoading()\"\r\n [title]=\"\r\n store.capabilities.listDefinitions\r\n ? 'Ricarica l\u2019elenco'\r\n : 'Questo ambiente non implementa listDefinitions.'\r\n \"\r\n (click)=\"refresh()\"\r\n >\r\n \u27F3 Aggiorna\r\n </button>\r\n </header>\r\n\r\n @if (store.error(); as error) {\r\n <!--\r\n Banner persistente: un errore di catalogo che svanisce lascia un elenco vecchio senza dire\r\n che e\u2019 vecchio. La categoria si mostra perche\u2019 distingue \u00ABriprova\u00BB da \u00ABchiedi all\u2019ospite\u00BB.\r\n -->\r\n <p class=\"dpe-cat__error\" role=\"alert\">\r\n <strong>{{ error.category }}</strong> {{ error.message }}\r\n <button type=\"button\" class=\"dpe-cat__dismiss\" aria-label=\"Chiudi\" (click)=\"store.dismissError()\">\r\n \u00D7\r\n </button>\r\n </p>\r\n }\r\n\r\n <ul class=\"dpe-cat__list\">\r\n @for (summary of visible(); track summary.name) {\r\n <li class=\"dpe-cat__item\" [class.dpe-cat__item--busy]=\"store.isMutating()\">\r\n <div class=\"dpe-cat__row\">\r\n <button\r\n type=\"button\"\r\n class=\"dpe-cat__open\"\r\n [title]=\"'Apri ' + summary.label\"\r\n (click)=\"onOpen(summary.name)\"\r\n >\r\n <span class=\"dpe-cat__label\">{{ summary.label }}</span>\r\n <span class=\"dpe-cat__meta\">\r\n <!--\r\n Solo i fatti **presenti**: cio\u2019 che il sommario non porta non si stima. Contare i\r\n nodi lato client vorrebbe dire caricare tutte le definizioni per disegnare un\r\n elenco (ADR 0019).\r\n -->\r\n <code class=\"dpe-cat__name\">{{ summary.name }}</code>\r\n <span class=\"dpe-cat__dot\">&nbsp;\u00B7&nbsp;</span>\r\n {{ dialectLabels[summary.dialect] }}\r\n @if (summary.status) {\r\n <span class=\"dpe-cat__dot\">&nbsp;\u00B7&nbsp;</span>\r\n {{ summary.status === 'Active' ? 'attiva' : 'non attiva' }}\r\n }\r\n @if (summary.runMode) {\r\n <span class=\"dpe-cat__dot\">&nbsp;\u00B7&nbsp;</span>\r\n {{ summary.runMode === 'Batch' ? 'batch' : 'a richiesta' }}\r\n }\r\n @if (summary.isTemplate) {\r\n <span class=\"dpe-cat__dot\">&nbsp;\u00B7&nbsp;</span>\r\n modello\r\n }\r\n @if (summary.nodeCount !== undefined) {\r\n <span class=\"dpe-cat__dot\">&nbsp;\u00B7&nbsp;</span>\r\n {{ summary.nodeCount }} {{ summary.nodeCount === 1 ? 'nodo' : 'nodi' }}\r\n }\r\n @if (summary.updatedAt) {\r\n <span class=\"dpe-cat__dot\">&nbsp;\u00B7&nbsp;</span>\r\n {{ formatDate(summary.updatedAt) }}\r\n @if (summary.updatedBy) {\r\n \u00B7 {{ summary.updatedBy }}\r\n }\r\n }\r\n </span>\r\n @if (summary.description) {\r\n <span class=\"dpe-cat__desc\">{{ summary.description }}</span>\r\n }\r\n </button>\r\n\r\n <!--\r\n `hasErrors` e\u2019 **riportato, non ricalcolato** (ADR 0019): il frontend non valida\r\n niente. Per questo l\u2019etichetta dice \u00ABultima validazione nota\u00BB e non \u00ABinvalida\u00BB: puo\u2019\r\n essere vecchia, e spacciarla per verita\u2019 sarebbe una validazione fatta dal client per\r\n interposta persona. Assente, non compare nulla.\r\n -->\r\n @if (summary.hasErrors !== undefined) {\r\n <span\r\n class=\"dpe-cat__flag\"\r\n [class.dpe-cat__flag--errors]=\"summary.hasErrors\"\r\n [title]=\"\r\n summary.hasErrors\r\n ? 'Ultima validazione nota all\u2019ambiente: con errori. E\u2019 uno stato riportato, non ricalcolato qui.'\r\n : 'Ultima validazione nota all\u2019ambiente: senza errori. E\u2019 uno stato riportato, non ricalcolato qui.'\r\n \"\r\n >\r\n {{ summary.hasErrors ? 'con errori (stato noto)' : 'senza errori (stato noto)' }}\r\n </span>\r\n }\r\n\r\n <div class=\"dpe-cat__actions\">\r\n <button\r\n type=\"button\"\r\n class=\"dpe-cat__btn\"\r\n [disabled]=\"!canDuplicate() || store.isMutating()\"\r\n [title]=\"duplicateReason()\"\r\n (click)=\"startDuplicate(summary)\"\r\n >\r\n Duplica\r\n </button>\r\n\r\n @if (pendingDelete() === summary.name) {\r\n <!-- Conferma in **due passi**: la prima pressione chiede, la seconda cancella. -->\r\n <span class=\"dpe-cat__confirm\">\r\n Eliminare \u00AB{{ summary.name }}\u00BB?\r\n <button\r\n type=\"button\"\r\n class=\"dpe-cat__btn dpe-cat__btn--danger\"\r\n (click)=\"confirmDelete(summary.name)\"\r\n >\r\n Elimina\r\n </button>\r\n <button type=\"button\" class=\"dpe-cat__btn\" (click)=\"cancelDelete()\">Annulla</button>\r\n </span>\r\n } @else {\r\n <button\r\n type=\"button\"\r\n class=\"dpe-cat__btn\"\r\n [disabled]=\"!store.capabilities.deleteDefinition || store.isMutating()\"\r\n [title]=\"\r\n store.capabilities.deleteDefinition\r\n ? 'Elimina (chiede conferma)'\r\n : 'Eliminazione non disponibile: questo ambiente non implementa deleteDefinition.'\r\n \"\r\n (click)=\"askDelete(summary.name)\"\r\n >\r\n Elimina\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n\r\n @if (duplicateSource() === summary.name) {\r\n <!--\r\n Duplicare e\u2019 `load` piu\u2019 `createDefinition`: nessuna primitiva nuova sul contratto.\r\n Il dialetto resta quello della definizione copiata: cambiarlo copiando sarebbe una\r\n migrazione silenziosa delle capacita\u2019 con cui la copia verra\u2019 compilata.\r\n -->\r\n <div class=\"dpe-cat__form dpe-cat__form--inline\">\r\n <label class=\"dpe-cat__field\">\r\n <span>Nome della copia</span>\r\n <input\r\n #duplicateNameField\r\n class=\"dpe-cat__input\"\r\n [value]=\"duplicateName()\"\r\n (input)=\"duplicateName.set($any($event.target).value)\"\r\n />\r\n </label>\r\n <label class=\"dpe-cat__field\">\r\n <span>Etichetta della copia</span>\r\n <input\r\n class=\"dpe-cat__input\"\r\n [value]=\"duplicateLabel()\"\r\n (input)=\"duplicateLabel.set($any($event.target).value)\"\r\n />\r\n </label>\r\n <button\r\n type=\"button\"\r\n class=\"dpe-cat__btn dpe-cat__btn--primary\"\r\n [disabled]=\"!canSubmitDuplicate()\"\r\n (click)=\"confirmDuplicate()\"\r\n >\r\n Duplica\r\n </button>\r\n <button type=\"button\" class=\"dpe-cat__btn\" (click)=\"cancelDuplicate()\">Annulla</button>\r\n </div>\r\n }\r\n </li>\r\n } @empty {\r\n <li class=\"dpe-cat__empty\">\r\n @if (!store.capabilities.listDefinitions) {\r\n Questo ambiente non implementa <code>listDefinitions</code>: l\u2019elenco lo fornisce\r\n l\u2019applicazione ospite.\r\n } @else if (store.isLoading()) {\r\n Caricamento dell\u2019elenco\u2026\r\n } @else if (isFilteredEmpty()) {\r\n Nessuna definizione corrisponde al filtro.\r\n } @else if (store.hasLoaded()) {\r\n Nessuna definizione. Creane una qui sotto.\r\n } @else {\r\n Elenco non disponibile.\r\n }\r\n </li>\r\n }\r\n </ul>\r\n\r\n <footer class=\"dpe-cat__foot\">\r\n <div class=\"dpe-cat__form\">\r\n <label class=\"dpe-cat__field\">\r\n <span>Nome tecnico</span>\r\n <input\r\n class=\"dpe-cat__input\"\r\n placeholder=\"RiepilogoOrdini\"\r\n [value]=\"newName()\"\r\n [disabled]=\"!store.createCommand.isAvailable\"\r\n (input)=\"newName.set($any($event.target).value)\"\r\n />\r\n </label>\r\n <label class=\"dpe-cat__field\">\r\n <!--\r\n Si chiedono **due** campi e non uno: passare il nome anche come etichetta produce per\r\n sempre un catalogo di nomi tecnici, e un default sbagliato non si corregge piu\u2019.\r\n -->\r\n <span>Etichetta</span>\r\n <input\r\n class=\"dpe-cat__input\"\r\n placeholder=\"Riepilogo ordini\"\r\n [value]=\"newLabel()\"\r\n [disabled]=\"!store.createCommand.isAvailable\"\r\n (input)=\"newLabel.set($any($event.target).value)\"\r\n />\r\n </label>\r\n <button\r\n type=\"button\"\r\n class=\"dpe-cat__btn dpe-cat__btn--primary\"\r\n [disabled]=\"!canSubmitNew()\"\r\n [title]=\"\r\n store.createCommand.reason ??\r\n 'Crea la definizione e la apre. Il dialetto viene dall\u2019ambiente, non si sceglie qui.'\r\n \"\r\n (click)=\"createNew()\"\r\n >\r\n + Crea e apri\r\n </button>\r\n </div>\r\n\r\n <p class=\"dpe-cat__hint\">\r\n @if (store.createCommand.isAvailable) {\r\n <!--\r\n Detto **al momento della creazione**, non lasciato scoprire: una definizione nuova non\r\n ha sorgenti ne\u2019 writeback, quindi l\u2019editor la segnalera\u2019 invalida. E\u2019 normale \u2014 il\r\n modello tollera l\u2019incompleto e la validazione lo racconta.\r\n -->\r\n Il dialetto della definizione nuova e\u2019 quello dichiarato dall\u2019ambiente\r\n @if (store.environmentDialect(); as declared) {\r\n (<strong>{{ dialectLabels[declared] }}</strong>)\r\n }\r\n e non si sceglie qui. Una definizione appena creata\r\n e\u2019 <strong>invalida</strong> \u2014 servono almeno una sorgente e un writeback \u2014 ed e\u2019 normale.\r\n } @else {\r\n {{ store.createCommand.reason }}\r\n }\r\n </p>\r\n </footer>\r\n</section>\r\n", changeDetection: i0.ChangeDetectionStrategy.OnPush });
11786
11786
  }
11787
- i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.32", ngImport: i0, type: DpeCatalogComponent, decorators: [{
11787
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "20.3.33", ngImport: i0, type: DpeCatalogComponent, decorators: [{
11788
11788
  type: Component,
11789
11789
  args: [{ selector: 'dpe-catalog', standalone: true, changeDetection: ChangeDetectionStrategy.OnPush, providers: [DpeCatalogStore], template: "<!--\r\n `.dpe-theme` porta le variabili del tema anche fuori dall\u2019editor: il catalogo e\u2019 un componente\r\n **fratello**, quindi non puo\u2019 contare sulla classe radice di `<dpe-builder>`. La variante scura\r\n resta quella prevista, `data-dpe-theme=\"dark\"` su un contenitore dell\u2019ospite.\r\n-->\r\n<section class=\"dpe-theme dpe-cat\" aria-labelledby=\"dpe-cat-title\">\r\n <header class=\"dpe-cat__bar\">\r\n <h2 class=\"dpe-cat__title\" id=\"dpe-cat-title\">Definizioni DPE</h2>\r\n\r\n <span class=\"dpe-cat__count\">\r\n @if (store.isLoading()) {\r\n caricamento\u2026\r\n } @else if (!store.capabilities.listDefinitions) {\r\n elenco non disponibile\r\n } @else {\r\n {{ visible().length }} di {{ store.summaries().length }}\r\n }\r\n </span>\r\n\r\n <input\r\n class=\"dpe-cat__filter\"\r\n type=\"search\"\r\n placeholder=\"Filtra per nome o etichetta\"\r\n aria-label=\"Filtra le definizioni\"\r\n [value]=\"filter()\"\r\n (input)=\"filter.set($any($event.target).value)\"\r\n />\r\n\r\n <button\r\n type=\"button\"\r\n class=\"dpe-cat__btn\"\r\n [disabled]=\"!store.capabilities.listDefinitions || store.isLoading()\"\r\n [title]=\"\r\n store.capabilities.listDefinitions\r\n ? 'Ricarica l\u2019elenco'\r\n : 'Questo ambiente non implementa listDefinitions.'\r\n \"\r\n (click)=\"refresh()\"\r\n >\r\n \u27F3 Aggiorna\r\n </button>\r\n </header>\r\n\r\n @if (store.error(); as error) {\r\n <!--\r\n Banner persistente: un errore di catalogo che svanisce lascia un elenco vecchio senza dire\r\n che e\u2019 vecchio. La categoria si mostra perche\u2019 distingue \u00ABriprova\u00BB da \u00ABchiedi all\u2019ospite\u00BB.\r\n -->\r\n <p class=\"dpe-cat__error\" role=\"alert\">\r\n <strong>{{ error.category }}</strong> {{ error.message }}\r\n <button type=\"button\" class=\"dpe-cat__dismiss\" aria-label=\"Chiudi\" (click)=\"store.dismissError()\">\r\n \u00D7\r\n </button>\r\n </p>\r\n }\r\n\r\n <ul class=\"dpe-cat__list\">\r\n @for (summary of visible(); track summary.name) {\r\n <li class=\"dpe-cat__item\" [class.dpe-cat__item--busy]=\"store.isMutating()\">\r\n <div class=\"dpe-cat__row\">\r\n <button\r\n type=\"button\"\r\n class=\"dpe-cat__open\"\r\n [title]=\"'Apri ' + summary.label\"\r\n (click)=\"onOpen(summary.name)\"\r\n >\r\n <span class=\"dpe-cat__label\">{{ summary.label }}</span>\r\n <span class=\"dpe-cat__meta\">\r\n <!--\r\n Solo i fatti **presenti**: cio\u2019 che il sommario non porta non si stima. Contare i\r\n nodi lato client vorrebbe dire caricare tutte le definizioni per disegnare un\r\n elenco (ADR 0019).\r\n -->\r\n <code class=\"dpe-cat__name\">{{ summary.name }}</code>\r\n <span class=\"dpe-cat__dot\">&nbsp;\u00B7&nbsp;</span>\r\n {{ dialectLabels[summary.dialect] }}\r\n @if (summary.status) {\r\n <span class=\"dpe-cat__dot\">&nbsp;\u00B7&nbsp;</span>\r\n {{ summary.status === 'Active' ? 'attiva' : 'non attiva' }}\r\n }\r\n @if (summary.runMode) {\r\n <span class=\"dpe-cat__dot\">&nbsp;\u00B7&nbsp;</span>\r\n {{ summary.runMode === 'Batch' ? 'batch' : 'a richiesta' }}\r\n }\r\n @if (summary.isTemplate) {\r\n <span class=\"dpe-cat__dot\">&nbsp;\u00B7&nbsp;</span>\r\n modello\r\n }\r\n @if (summary.nodeCount !== undefined) {\r\n <span class=\"dpe-cat__dot\">&nbsp;\u00B7&nbsp;</span>\r\n {{ summary.nodeCount }} {{ summary.nodeCount === 1 ? 'nodo' : 'nodi' }}\r\n }\r\n @if (summary.updatedAt) {\r\n <span class=\"dpe-cat__dot\">&nbsp;\u00B7&nbsp;</span>\r\n {{ formatDate(summary.updatedAt) }}\r\n @if (summary.updatedBy) {\r\n \u00B7 {{ summary.updatedBy }}\r\n }\r\n }\r\n </span>\r\n @if (summary.description) {\r\n <span class=\"dpe-cat__desc\">{{ summary.description }}</span>\r\n }\r\n </button>\r\n\r\n <!--\r\n `hasErrors` e\u2019 **riportato, non ricalcolato** (ADR 0019): il frontend non valida\r\n niente. Per questo l\u2019etichetta dice \u00ABultima validazione nota\u00BB e non \u00ABinvalida\u00BB: puo\u2019\r\n essere vecchia, e spacciarla per verita\u2019 sarebbe una validazione fatta dal client per\r\n interposta persona. Assente, non compare nulla.\r\n -->\r\n @if (summary.hasErrors !== undefined) {\r\n <span\r\n class=\"dpe-cat__flag\"\r\n [class.dpe-cat__flag--errors]=\"summary.hasErrors\"\r\n [title]=\"\r\n summary.hasErrors\r\n ? 'Ultima validazione nota all\u2019ambiente: con errori. E\u2019 uno stato riportato, non ricalcolato qui.'\r\n : 'Ultima validazione nota all\u2019ambiente: senza errori. E\u2019 uno stato riportato, non ricalcolato qui.'\r\n \"\r\n >\r\n {{ summary.hasErrors ? 'con errori (stato noto)' : 'senza errori (stato noto)' }}\r\n </span>\r\n }\r\n\r\n <div class=\"dpe-cat__actions\">\r\n <button\r\n type=\"button\"\r\n class=\"dpe-cat__btn\"\r\n [disabled]=\"!canDuplicate() || store.isMutating()\"\r\n [title]=\"duplicateReason()\"\r\n (click)=\"startDuplicate(summary)\"\r\n >\r\n Duplica\r\n </button>\r\n\r\n @if (pendingDelete() === summary.name) {\r\n <!-- Conferma in **due passi**: la prima pressione chiede, la seconda cancella. -->\r\n <span class=\"dpe-cat__confirm\">\r\n Eliminare \u00AB{{ summary.name }}\u00BB?\r\n <button\r\n type=\"button\"\r\n class=\"dpe-cat__btn dpe-cat__btn--danger\"\r\n (click)=\"confirmDelete(summary.name)\"\r\n >\r\n Elimina\r\n </button>\r\n <button type=\"button\" class=\"dpe-cat__btn\" (click)=\"cancelDelete()\">Annulla</button>\r\n </span>\r\n } @else {\r\n <button\r\n type=\"button\"\r\n class=\"dpe-cat__btn\"\r\n [disabled]=\"!store.capabilities.deleteDefinition || store.isMutating()\"\r\n [title]=\"\r\n store.capabilities.deleteDefinition\r\n ? 'Elimina (chiede conferma)'\r\n : 'Eliminazione non disponibile: questo ambiente non implementa deleteDefinition.'\r\n \"\r\n (click)=\"askDelete(summary.name)\"\r\n >\r\n Elimina\r\n </button>\r\n }\r\n </div>\r\n </div>\r\n\r\n @if (duplicateSource() === summary.name) {\r\n <!--\r\n Duplicare e\u2019 `load` piu\u2019 `createDefinition`: nessuna primitiva nuova sul contratto.\r\n Il dialetto resta quello della definizione copiata: cambiarlo copiando sarebbe una\r\n migrazione silenziosa delle capacita\u2019 con cui la copia verra\u2019 compilata.\r\n -->\r\n <div class=\"dpe-cat__form dpe-cat__form--inline\">\r\n <label class=\"dpe-cat__field\">\r\n <span>Nome della copia</span>\r\n <input\r\n #duplicateNameField\r\n class=\"dpe-cat__input\"\r\n [value]=\"duplicateName()\"\r\n (input)=\"duplicateName.set($any($event.target).value)\"\r\n />\r\n </label>\r\n <label class=\"dpe-cat__field\">\r\n <span>Etichetta della copia</span>\r\n <input\r\n class=\"dpe-cat__input\"\r\n [value]=\"duplicateLabel()\"\r\n (input)=\"duplicateLabel.set($any($event.target).value)\"\r\n />\r\n </label>\r\n <button\r\n type=\"button\"\r\n class=\"dpe-cat__btn dpe-cat__btn--primary\"\r\n [disabled]=\"!canSubmitDuplicate()\"\r\n (click)=\"confirmDuplicate()\"\r\n >\r\n Duplica\r\n </button>\r\n <button type=\"button\" class=\"dpe-cat__btn\" (click)=\"cancelDuplicate()\">Annulla</button>\r\n </div>\r\n }\r\n </li>\r\n } @empty {\r\n <li class=\"dpe-cat__empty\">\r\n @if (!store.capabilities.listDefinitions) {\r\n Questo ambiente non implementa <code>listDefinitions</code>: l\u2019elenco lo fornisce\r\n l\u2019applicazione ospite.\r\n } @else if (store.isLoading()) {\r\n Caricamento dell\u2019elenco\u2026\r\n } @else if (isFilteredEmpty()) {\r\n Nessuna definizione corrisponde al filtro.\r\n } @else if (store.hasLoaded()) {\r\n Nessuna definizione. Creane una qui sotto.\r\n } @else {\r\n Elenco non disponibile.\r\n }\r\n </li>\r\n }\r\n </ul>\r\n\r\n <footer class=\"dpe-cat__foot\">\r\n <div class=\"dpe-cat__form\">\r\n <label class=\"dpe-cat__field\">\r\n <span>Nome tecnico</span>\r\n <input\r\n class=\"dpe-cat__input\"\r\n placeholder=\"RiepilogoOrdini\"\r\n [value]=\"newName()\"\r\n [disabled]=\"!store.createCommand.isAvailable\"\r\n (input)=\"newName.set($any($event.target).value)\"\r\n />\r\n </label>\r\n <label class=\"dpe-cat__field\">\r\n <!--\r\n Si chiedono **due** campi e non uno: passare il nome anche come etichetta produce per\r\n sempre un catalogo di nomi tecnici, e un default sbagliato non si corregge piu\u2019.\r\n -->\r\n <span>Etichetta</span>\r\n <input\r\n class=\"dpe-cat__input\"\r\n placeholder=\"Riepilogo ordini\"\r\n [value]=\"newLabel()\"\r\n [disabled]=\"!store.createCommand.isAvailable\"\r\n (input)=\"newLabel.set($any($event.target).value)\"\r\n />\r\n </label>\r\n <button\r\n type=\"button\"\r\n class=\"dpe-cat__btn dpe-cat__btn--primary\"\r\n [disabled]=\"!canSubmitNew()\"\r\n [title]=\"\r\n store.createCommand.reason ??\r\n 'Crea la definizione e la apre. Il dialetto viene dall\u2019ambiente, non si sceglie qui.'\r\n \"\r\n (click)=\"createNew()\"\r\n >\r\n + Crea e apri\r\n </button>\r\n </div>\r\n\r\n <p class=\"dpe-cat__hint\">\r\n @if (store.createCommand.isAvailable) {\r\n <!--\r\n Detto **al momento della creazione**, non lasciato scoprire: una definizione nuova non\r\n ha sorgenti ne\u2019 writeback, quindi l\u2019editor la segnalera\u2019 invalida. E\u2019 normale \u2014 il\r\n modello tollera l\u2019incompleto e la validazione lo racconta.\r\n -->\r\n Il dialetto della definizione nuova e\u2019 quello dichiarato dall\u2019ambiente\r\n @if (store.environmentDialect(); as declared) {\r\n (<strong>{{ dialectLabels[declared] }}</strong>)\r\n }\r\n e non si sceglie qui. Una definizione appena creata\r\n e\u2019 <strong>invalida</strong> \u2014 servono almeno una sorgente e un writeback \u2014 ed e\u2019 normale.\r\n } @else {\r\n {{ store.createCommand.reason }}\r\n }\r\n </p>\r\n </footer>\r\n</section>\r\n" }]
11790
11790
  }], propDecorators: { open: [{ type: i0.Output, args: ["open"] }], duplicateNameField: [{ type: i0.ViewChild, args: ['duplicateNameField', { isSignal: true }] }] } });
package/package.json CHANGED
@@ -1,10 +1,10 @@
1
1
  {
2
2
  "name": "@esfaenza/dpe-builder",
3
- "version": "20.3.15",
3
+ "version": "20.3.16",
4
4
  "peerDependencies": {
5
5
  "@angular/cdk": "^20.2.14",
6
- "@angular/common": "^20.3.32",
7
- "@angular/core": "^20.3.32",
6
+ "@angular/common": "^20.3.33",
7
+ "@angular/core": "^20.3.33",
8
8
  "@foblex/flow": ">=19.0.0",
9
9
  "dagre": "0.8.5",
10
10
  "rxjs": "7.8.2"