@esfaenza/es-diagrams 19.2.10 → 19.2.11
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.
|
@@ -626,9 +626,15 @@ class EsDiagramService {
|
|
|
626
626
|
if (!this.modulesCache[moduleId]) {
|
|
627
627
|
this.log("I", this.loc("Module not available. Loading it now") + ": " + moduleId, false);
|
|
628
628
|
switch (moduleId) {
|
|
629
|
-
case "cytoscape-cxtmenu": return import('cytoscape-cxtmenu').then((module) =>
|
|
630
|
-
|
|
631
|
-
|
|
629
|
+
case "cytoscape-cxtmenu": return import('cytoscape-cxtmenu').then((module) => {
|
|
630
|
+
this.modulesCache[moduleId] = module.default;
|
|
631
|
+
}).catch(err => this.handleError(moduleId, err));
|
|
632
|
+
case "cytoscape-expand-collapse": return import('cytoscape-expand-collapse').then((module) => {
|
|
633
|
+
this.modulesCache[moduleId] = module.default;
|
|
634
|
+
}).catch(err => this.handleError(moduleId, err));
|
|
635
|
+
case "cytoscape-html-node": return import('@esfaenza/cytoscape-html-node').then((module) => {
|
|
636
|
+
this.modulesCache[moduleId] = module.register;
|
|
637
|
+
}).catch(err => this.handleError(moduleId, err));
|
|
632
638
|
case "cytoscape-dagre":
|
|
633
639
|
await import('dagre').catch(err => this.handleError("dagre", err));
|
|
634
640
|
return import('cytoscape-dagre').then((module) => this.modulesCache[moduleId] = module.default).catch(err => this.handleError(moduleId, err));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"esfaenza-es-diagrams.mjs","sources":["../../../projects/es-diagrams/src/lib/models/component/contextmenu/ContextMenuCommand.ts","../../../projects/es-diagrams/src/lib/models/component/contextmenu/ContextMenuOptions.ts","../../../projects/es-diagrams/src/lib/models/component/grouping/ExpandCollapseOptions.ts","../../../projects/es-diagrams/src/lib/models/component/nodes/NodeHTMLTemplate.ts","../../../projects/es-diagrams/src/lib/models/component/nodes/NodeTemplate.ts","../../../projects/es-diagrams/src/lib/models/component/nodes/ZoomLevelBasedTemplate.ts","../../../projects/es-diagrams/src/lib/models/layouts/base/BaseLayoutOptionsImpl.ts","../../../projects/es-diagrams/src/lib/models/layouts/base/AnimateLayoutOptionsImpl.ts","../../../projects/es-diagrams/src/lib/models/layouts/base/ShapedLayoutOptionsImpl.ts","../../../projects/es-diagrams/src/lib/models/layouts/BreadthFirstLayoutOptionsImpl.ts","../../../projects/es-diagrams/src/lib/models/layouts/CircleLayoutOptionsImpl.ts","../../../projects/es-diagrams/src/lib/models/layouts/ConcentricLayoutOptionsImpl.ts","../../../projects/es-diagrams/src/lib/models/layouts/CoseLayoutOptionsImpl.ts","../../../projects/es-diagrams/src/lib/models/layouts/DagreLayoutOptionsImpl.ts","../../../projects/es-diagrams/src/lib/models/layouts/GridLayoutOptionsImpl.ts","../../../projects/es-diagrams/src/lib/models/layouts/NullLayoutOptionsImpl.ts","../../../projects/es-diagrams/src/lib/models/layouts/PresetLayoutOptionsImpl.ts","../../../projects/es-diagrams/src/lib/models/layouts/RandomLayoutOptionsImpl.ts","../../../projects/es-diagrams/src/lib/models/EsDiagramModuleConfig.ts","../../../projects/es-diagrams/src/lib/extensions/ResizeSensor.ts","../../../projects/es-diagrams/src/lib/tokens.ts","../../../projects/es-diagrams/src/lib/services/es-diagram.service.ts","../../../projects/es-diagrams/src/lib/services/es-diagram.dispatcher.ts","../../../projects/es-diagrams/src/lib/extensions/ReactiveExtensions.ts","../../../projects/es-diagrams/src/lib/components/es-diagram.component.ts","../../../projects/es-diagrams/src/lib/components/es-diagram.component.html","../../../projects/es-diagrams/src/lib/esdiagram.module.ts","../../../projects/es-diagrams/src/public-api.ts","../../../projects/es-diagrams/src/esfaenza-es-diagrams.ts"],"sourcesContent":["/**\r\n * Definizione di un comando del Context menù\r\n */\r\nexport class ContextMenuCommand {\r\n\r\n /**\r\n * Background delo spicchio\r\n */\r\n fillColor?: string;\r\n\r\n /**\r\n * Contenuto del comando, html o testo\r\n */\r\n content: string;\r\n\r\n /**\r\n * Dizionario di stili da applicare all'html in cui viene wrappato il **content**\r\n */\r\n contentStyle?: { [key: string]: string; };\r\n\r\n /**\r\n * Funzione da eseguire quando questo comando viene cliccato\r\n */\r\n select: (ele) => void;\r\n\r\n /**\r\n * Indica se il comando è abilitato o no\r\n */\r\n enabled?: boolean;\r\n}","import { ContextMenuCommand } from \"./ContextMenuCommand\";\r\n\r\n/**\r\n * Opzioni che gestiscono il context menu. Quando una di queste opzioni non viene assegnata viene mantenuto il default, assicurarsi quindi di modificare solo\r\n * le proprietà che si vogliono effettivamente cambiare rispetto ai default\r\n */\r\nexport class ContextMenuOptions {\r\n\r\n /**\r\n * Raggio esterno del Menù, aggiunto alla dimensione renderizzata del nodo\r\n */\r\n public menuRadius?: (ele) => number;\r\n\r\n /**\r\n * Selettore di tutti gli elementi a cui verrà applicato il context menu. Di default sono tutti i nodi\r\n */\r\n public selector?: string;\r\n\r\n /**\r\n * Lista di comandi da mostrare nel menù\r\n */\r\n public commands?: ContextMenuCommand[];\r\n\r\n /**\r\n * Colore di background del menu\r\n */\r\n public fillColor?: string;\r\n\r\n /**\r\n * Colore di background del menù quando c'è il mouse in selezione sopra\r\n */\r\n public activeFillColor?: string;\r\n\r\n /**\r\n * Dimensione aggiuntiva per l'operazione selezionata in modo da evidenziarla dalle altre\r\n */\r\n public activePadding?: number;\r\n\r\n /**\r\n * Dimensione in pixel dell'indicatore sul comando attuale\r\n */\r\n public indicatorSize?: number;\r\n\r\n /**\r\n * Distanza in pixel da un comando e l'altro\r\n */\r\n public separatorWidth?: number;\r\n\r\n /**\r\n * Dimensione extra fra l'elemento e il centro del menù\r\n */\r\n public spotlightPadding?: number;\r\n\r\n /**\r\n * Raggio minimo del centro del menù\r\n */\r\n public minSpotlightRadius?: number;\r\n\r\n /**\r\n * Raggio massimo del centro del menù\r\n */\r\n public maxSpotlightRadius?: number;\r\n\r\n /**\r\n * Eventi per il quale il menù deve aprirsi\r\n */\r\n public openMenuEvents?: 'cxttapstart' | 'taphold';\r\n\r\n /**\r\n * Colore del testo del menù\r\n */\r\n public itemColor?: string;\r\n\r\n /**\r\n * Colore dell'ombreggiatura del testo del menù\r\n */\r\n public itemTextShadowColor?: string;\r\n\r\n /**\r\n * zIndex del div in cui viene renderizzato il menù\r\n */\r\n public zIndex?: number;\r\n\r\n /**\r\n * Indica se mostrare il menù alla posizione del mouse\r\n */\r\n public atMouse?: boolean;\r\n\r\n /**\r\n * Indica se adattarsi alla dimensione del nodo. Se impostato le proprietà **minSpotlightRadius** e **maxSpotlightRadius** vengono ignorate\r\n */\r\n public adaptativeNodeSpotlightRadius?: boolean\r\n\r\n /**\r\n * Se settato a number indica dopo quanti pixel fuori dal menu il click viene annullato, altrimenti va settato a **false**\r\n */\r\n public outsideMenuCancel?: boolean | number\r\n}\r\n\r\n\r\n","\r\n/**\r\n * Opzioni native per l'estensione expand-collapse di cytoscape\r\n */\r\nexport class ExpandCollapseOptions {\r\n /** @ignore */ layoutBy?: any; // to rearrange after expand/collapse. It's just layout options or whole layout function. Choose your side!\r\n /** @ignore */ fisheye?: boolean; // whether to perform fisheye view after expand/collapse you can specify a function too\r\n /** @ignore */ animate?: boolean; // whether to animate on drawing changes you can specify a function too\r\n /** @ignore */ animationDuration?: number; // when animate is true, the duration in milliseconds of the animation\r\n /** @ignore */ ready?: () => void; // callback when expand/collapse initialized\r\n /** @ignore */ undoable?: boolean; // and if undoRedoExtension exists,\r\n\r\n /** @ignore */ cueEnabled?: boolean; // Whether cues are enabled\r\n /** @ignore */ expandCollapseCuePosition?: string | ((node) => string); // default cue position is top left you can specify a function per node too\r\n /** @ignore */ expandCollapseCueSize?: number; // size of expand-collapse cue\r\n /** @ignore */ expandCollapseCueLineSize?: number; // size of lines used for drawing plus-minus icons\r\n /** @ignore */ expandCueImage?: string; // image of expand icon if undefined draw regular expand cue\r\n /** @ignore */ collapseCueImage?: string; // image of collapse icon if undefined draw regular collapse cue\r\n /** @ignore */ expandCollapseCueSensitivity?: number; // sensitivity of expand-collapse cues\r\n /** @ignore */ edgeTypeInfo?: string | Function; // the name of the field that has the edge type, retrieved from edge.data(), can be a function, if reading the field returns undefined the collapsed edge type will be \"unknown\"\r\n /** @ignore */ groupEdgesOfSameTypeOnCollapse?: boolean; // if true, the edges to be collapsed will be grouped according to their types, and the created collapsed edges will have same type as their group. if false the collapased edge will have \"unknown\" type.\r\n /** @ignore */ allowNestedEdgeCollapse?: boolean; // when you want to collapse a compound edge (edge which contains other edges) and normal edge, should it collapse without expanding the compound first\r\n /** @ignore */ zIndex?: number; // z-index value of the canvas in which cue ımages are drawn\r\n}\r\n","import { ZoomLevelBasedTemplate } from \"./ZoomLevelBasedTemplate\";\r\n\r\n/**\r\n * Classe che indica per una data query quali template applicare\r\n */\r\nexport class NodeHTMLTemplate {\r\n\r\n /**\r\n * Query Cytoscape. Esempio **\"[type = 'node']\"** per prendere tutti i nodi la cui proprietà **type** all'interno dell'oggetto **data** è uguale a **node**\r\n */\r\n query: string;\r\n\r\n /**\r\n * Lista dei template da applicare in base al livello di zoom del diagramma\r\n */\r\n template: ZoomLevelBasedTemplate[];\r\n}\r\n","/**\r\n * Classe che rappresenta un template HTML applicabile ad un nodo\r\n */\r\nexport class NodeTemplate {\r\n\r\n /**\r\n * Template del nodo. È possibile prendere direttamente i valori del nodo utilizzando la convenzione **#{data.nodeproperty}**\r\n */\r\n html: string;\r\n\r\n /**\r\n * Classe da applicare al template\r\n */\r\n cssClass?: string;\r\n}\r\n","import { NodeTemplate } from \"./NodeTemplate\";\r\n\r\n/**\r\n * Classe che rappresenta il template HTML di un nodo da utilizzare per un certo livello di zoom\r\n */\r\nexport class ZoomLevelBasedTemplate {\r\n\r\n /**\r\n * Livello di zoom da minimo a massimo per cui viene utilizzato questo template\r\n */\r\n zoomRange: [number, number];\r\n\r\n /**\r\n * Template da utilizzare\r\n */\r\n template: NodeTemplate;\r\n}\r\n","/**\r\n * Opzioni di layout di base che si collegano al **ready** e allo **stop** eventualmente per aggiungere del log addizionale\r\n */\r\nexport class BaseLayoutOptionsImpl {\r\n\r\n /**\r\n * Per ora ignoro lato documentale dato che sono placholder\r\n * @ignore\r\n */\r\n ready(e: cytoscape.LayoutEventObject) {\r\n\r\n }\r\n\r\n /**\r\n * Per ora ignoro lato documentale dato che sono placholder\r\n * @ignore\r\n */\r\n stop(e: cytoscape.LayoutEventObject) {\r\n\r\n }\r\n}","import { AnimatedLayoutOptions } from 'cytoscape';\r\nimport { BaseLayoutOptionsImpl } from './BaseLayoutOptionsImpl';\r\n\r\n/**\r\n * Classe base con le opzioni di layout valide per tutti i layout animati\r\n */\r\nexport class AnimateLayoutOptionsImpl extends BaseLayoutOptionsImpl implements AnimatedLayoutOptions {\r\n\r\n /** @ignore */\r\n constructor() { super(); }\r\n\r\n /**\r\n * Livello di zoom da impostare (si consiglia fit = **false** se viene impostato)\r\n */\r\n zoom: number = null;\r\n\r\n /**\r\n * Livello di pan da impostare (si consiglia fit = **false** se viene impostato)\r\n */\r\n pan: number = null;\r\n\r\n /**\r\n * Indica se animare il cambio di posizione dei nodi\r\n */\r\n animate = false;\r\n\r\n /**\r\n * Con **animate** a true indica la durata dell'animazione\r\n */\r\n animationDuration = 500;\r\n\r\n /**\r\n * Abilita o no l'easing dell'animazione, può essere una stringa come ad esempio \"ease-in-out-cubic\" o altre funzioni scritte allo stesso modo prese da https://easings.net/\r\n */\r\n animationEasing = undefined;\r\n\r\n /**\r\n * Funzione che indica se un nodo dev'essere animato o no. \r\n * Tutti i nodi sono animati di default.\r\n * Tutti i nodi che non vengono animati verranno posizionati appena inizia l'animazione\r\n * \r\n * @param {any} node Nodo per cui decidere se abilitare l'animazione o no\r\n * @param {number} i Indice del nodo corrente\r\n * \r\n * @returns {boolean} **true** se il nodo dev'essere animato, **false** altrimenti\r\n */\r\n animateFilter = (node, i: number) => true;\r\n}","import { BoundingBox12, BoundingBoxWH, SortingFunction } from 'cytoscape';\r\nimport { AnimateLayoutOptionsImpl } from './AnimateLayoutOptionsImpl';\r\n\r\n/**\r\n * Classe base per gli algoritmi \"Shaped\"\r\n */\r\nexport class ShapedLayoutOptionsImpl extends AnimateLayoutOptionsImpl {\r\n\r\n /** @ignore */\r\n constructor() { super(); }\r\n\r\n /**\r\n * Indica se adattare al contenitore\r\n */\r\n fit = true;\r\n\r\n /**\r\n * Padding rispetto al contenitore\r\n */\r\n padding = 30;\r\n\r\n /**\r\n * Specifica le dimensioni esatte al cui interno effettuare il layouting, specificato come **{ x1, y1, x2, y2 }** o **{ x1, y1, w, h }**\r\n */\r\n boundingBox?: BoundingBox12 | BoundingBoxWH | undefined = null;\r\n\r\n /**\r\n * Fa in modo che i nodi non si accavallino, ma se il contenitore non ha abbastanza spazio potrebbero andare in overflow\r\n */\r\n avoidOverlap = true;\r\n\r\n /**\r\n * Include o esclude le dimensioni delle label dei nodi nel calcolo delle posizioni\r\n */\r\n nodeDimensionsIncludeLabels = false;\r\n\r\n /**\r\n * Moltiplicatore delle dimensioni per espandere/restringere le dimensioni globali del diagramma\r\n */\r\n spacingFactor = 1;\r\n\r\n /**\r\n * Funzione di ordinamento per ordinare i nodi\r\n */\r\n sort?: SortingFunction = null;\r\n\r\n /**\r\n * Funzione per la trasformazione delle posizioni dei nodi\r\n * \r\n * @param {any} node Nodo\r\n * @param {any} position Posizione iniziale\r\n * \r\n * @returns {any} Posizione finale\r\n */\r\n transform = (node, position) => position;\r\n}\r\n","import { ShapedLayoutOptionsImpl } from './base/ShapedLayoutOptionsImpl';\r\n\r\n/**\r\n * Default per l'implementazione dell'algoritmo Breadth First\r\n */\r\nexport class BreadthFirstLayoutOptionsImpl extends ShapedLayoutOptionsImpl {\r\n\r\n /** @ignore */\r\n constructor() { super(); }\r\n\r\n /**\r\n * Nome dell'algoritmo di layouting\r\n */\r\n name = 'breadthfirst';\r\n\r\n /**\r\n * Indica se l'albero è diretto in basso. Se false i collegamenti fra i nodi possono andare in qualsiasi direzione\r\n */\r\n directed = false;\r\n\r\n /**\r\n * Se **true** i livelli vengono ordinati in cerchi concentrici, se **false** vengono oridnati dall'alto al basso \r\n */\r\n circle = false;\r\n\r\n /**\r\n * Radici degli alberi\r\n */\r\n roots?: string;\r\n\r\n /**\r\n * Numero massimo di tentativi di posizionamento dei nodi in maniera massimale (senza backtracking)\r\n */\r\n maximalAdjustments: number;\r\n\r\n /**\r\n * Indica che i nodi verranno shiftati in base al proprio livello in modo da evitare collegamenti inversi (solo per i DAG)\r\n */\r\n maximal = false;\r\n\r\n /**\r\n * Indica se creare una griglia in cui ordinare i nodi del DAG (Solo quando la proprietà **circle** è a **false**)\r\n */\r\n grid = false;\r\n\r\n /**\r\n * Indica se escludere le label dei nodi quando vengono calcolati i limiti del layout\r\n */\r\n nodeDimensionsIncludeLabels = false;\r\n}\r\n","import { ShapedLayoutOptionsImpl } from './base/ShapedLayoutOptionsImpl';\r\n\r\n/**\r\n * Default per l'implementazione dell'algoritmo Circle\r\n */\r\nexport class CircleLayoutOptionsImpl extends ShapedLayoutOptionsImpl {\r\n\r\n /** @ignore */\r\n constructor() { super(); }\r\n\r\n /**\r\n * Nome dell'algoritmo di layouting\r\n */\r\n name = 'circle';\r\n\r\n /**\r\n * Raggio del cercho\r\n */\r\n radius: number;\r\n\r\n /**\r\n * Angolo da cui i nodi partono, in radianti (Default: **3 / 2 * Math.PI**)\r\n */\r\n startAngle = 3 / 2 * Math.PI;\r\n\r\n /**\r\n * Numero di radianti fra il primo e l'ultimo nodo. Di default viene utilizzata l'intera circonferenza\r\n */\r\n sweep: number = null;\r\n\r\n /**\r\n * Indica se andare in senso orario (**true**) o antiorario (**false**)\r\n */\r\n clockwise = true; // whether the layout should go clockwise (true) or counterclockwise/anticlockwise (false)\r\n}\r\n","import { BoundingBox12, BoundingBoxWH } from \"cytoscape\";\r\n\r\n/**\r\n * Default per l'implementazione dell'algoritmo Concentric\r\n */\r\nexport class ConcentricLayoutOptionsImpl {\r\n\r\n /**\r\n * Nome dell'algoritmo di layouting\r\n */\r\n name: string = 'concentric';\r\n\r\n /**\r\n * Numero di radianti fra il primo e l'ultimo nodo. Di default viene utilizzata l'intera circonferenza\r\n */\r\n sweep?: number;\r\n\r\n /**\r\n * Indica se andare in senso orario (**true**) o antiorario (**false**)\r\n */\r\n clockwise?: boolean;\r\n\r\n /**\r\n * Angolo da cui i nodi partono, in radianti (Default: **3 / 2 * Math.PI**)\r\n */\r\n startAngle = 3 / 2 * Math.PI;\r\n\r\n /**\r\n * Indica se adattare al contenitore\r\n */\r\n fit: boolean;\r\n\r\n /**\r\n * Include o esclude le dimensioni delle label dei nodi nel calcolo delle posizioni\r\n */\r\n nodeDimensionsIncludeLabels = true;\r\n\r\n /**\r\n * Indica se i livelli devono essere o non essere equidistanti, potrebbe causare overflow dal contenitore\r\n */\r\n equidistant = false;\r\n\r\n /**\r\n * Distanza minima dall'esterno dei nodi, utilizzato per aggiustare il raggio\r\n */\r\n minNodeSpacingnumber = 10;\r\n\r\n /**\r\n * Specifica le dimensioni esatte al cui interno effettuare il layouting, specificato come **{ x1, y1, x2, y2 }** o **{ x1, y1, w, h }**\r\n */\r\n boundingBox: BoundingBox12 | BoundingBoxWH | undefined = null;\r\n\r\n /**\r\n * Altezza dell'area di layout (sovrascrive quella del contenitore)\r\n */\r\n height: number = null;\r\n\r\n /**\r\n * Larghezza dell'area di layout (sovrascrive quella del contenitore)\r\n */\r\n width: number = null;\r\n\r\n /**\r\n * Moltiplicatore delle dimensioni per espandere/restringere le dimensioni globali del diagramma\r\n */\r\n spacingFactor = 1;\r\n\r\n /**\r\n * Funzione di cui si può fare override per assegnare un valore ad ogni nodo. I nodi con valore più alto saranno piazzati verso il centro\r\n * \r\n * @param {any} node Nodo\r\n * \r\n * @returns {number} Valore su cui ordinare i nodi verso il centro\r\n */\r\n concentric(node: { degree(): number; }): number {\r\n return node.degree();\r\n }\r\n\r\n /**\r\n * Funzione di cui si può fare override per calcolare la variazione dei valori concentrici per ogni livello\r\n * \r\n * @param {any} nodes Gruppo di nodi del livello\r\n * \r\n * @returns {number} Variazione dei valori concentrici\r\n */\r\n levelWidth(nodes: { maxDegree(): number; }): number {\r\n return nodes.maxDegree() / 4;\r\n }\r\n}\r\n","import { ShapedLayoutOptionsImpl } from './base/ShapedLayoutOptionsImpl';\r\n\r\n/**\r\n * Default per l'implementazione dell'algoritmo Cose\r\n */\r\nexport class CoseLayoutOptionsImpl extends ShapedLayoutOptionsImpl {\r\n\r\n /** @ignore */\r\n constructor() { super(); }\r\n\r\n /**\r\n * Nome dell'algoritmo di layouting\r\n */\r\n name = 'cose';\r\n\r\n /**\r\n * Se **animate** è **true**, l'animazione parte solo dopo questo numero di millisecondi (Evita flickering su animazioni veloci)\r\n */\r\n animationThreshold = 250;\r\n\r\n /**\r\n * Numero di iterazioni fra aggiornamenti consecutivi della posizione a schermo\r\n */\r\n refresh = 20;\r\n\r\n /**\r\n * Se **true** la posizione iniziale dei nodi è casuale, se **false** utilizza la posizione originale\r\n */\r\n randomize = false;\r\n\r\n /**\r\n * Spazio extra fra i componenti di un grafo non-compound\r\n */\r\n componentSpacing = 40;\r\n\r\n /**\r\n * Moltiplicatore della repulsione fra nodi in caso di overlap\r\n */\r\n nodeOverlap = 4;\r\n\r\n /**\r\n * Moltiplicatore di nesting per il calcolo della lunghezza ideale dei collegamenti nested\r\n */\r\n nestingFactor = 1.2;\r\n\r\n /**\r\n * Costante di gravità\r\n */\r\n gravity = 1;\r\n\r\n /**\r\n * Numero massimo di iterazioni da eseguire\r\n */\r\n numIter = 1000;\r\n\r\n /**\r\n * Temperatura iniziale (massima distanza fra i nodi)\r\n */\r\n initialTemp = 1000;\r\n\r\n /**\r\n * Fattore di raffreddamento. Ad ogni iterazione verrà sottratto ad **initialTemp**\r\n */\r\n coolingFactor = 0.99;\r\n\r\n /**\r\n * Soglia minima di temperatura. Una volta raggiunta il layout si considera terminato\r\n */\r\n minTemp = 1.0;\r\n\r\n /**\r\n * Moltiplicatore della repulsione fra nodi in caso di assenza di overlap. Funzione overrideabile per ogni node\r\n * \r\n * @param {any} node Nodo\r\n * \r\n * @returns {number} Moltiplicazione di repulsione\r\n */\r\n nodeRepulsion = (node) => 2048;\r\n\r\n /**\r\n * Lunghezza ideale dei collegamenti non nested. Funzione overrideabile per ogni collegamento\r\n * \r\n * @param {any} edge Collegamento\r\n * \r\n * @returns {number} Lunghezza ideale\r\n */\r\n idealEdgeLength = (edge) => 32;\r\n\r\n /**\r\n * Divisore per calcolare le forze applicate ad un collegamento. Funzione overrideabile per ogni collegamento\r\n * \r\n * @param {any} edge Collegamento\r\n * \r\n * @returns {number} Indice di elasticità\r\n */\r\n edgeElasticity = (edge) => 32;\r\n}\r\n","import { ShapedLayoutOptionsImpl } from './base/ShapedLayoutOptionsImpl';\r\n\r\n/**\r\n * Default per l'implementazione dell'algoritmo Dagre\r\n */\r\nexport class DagreLayoutOptionsImpl extends ShapedLayoutOptionsImpl {\r\n\r\n /** @ignore */\r\n constructor() { super(); }\r\n\r\n /**\r\n * Nome dell'algoritmo di layouting\r\n */\r\n name = 'dagre';\r\n\r\n /**\r\n * Distanza fra nodi adiacenti dello stesso rango\r\n */\r\n nodeSep: number = null;\r\n\r\n /**\r\n * Distanza fra collegamenti adiacenti nello stesso rango\r\n */\r\n edgeSep: number = null;\r\n\r\n /**\r\n * Distanza fra ogni rango\r\n */\r\n rankSep: number = null;\r\n\r\n // TB for top to bottom flow, 'LR' for left to right\r\n /**\r\n * Direzione di disegno: LR = Sinistra a Destra, TB = Sopra a Sotto\r\n */\r\n rankDir: 'LR' | 'TB' = 'TB';\r\n\r\n /**\r\n * Algoritmo che si occupa di assegnare un rango ad ogni nodo\r\n */\r\n ranker: 'network-simplex' | 'tight-tree' | 'longest-path' = null;\r\n\r\n /**\r\n * Numero di ranghi fra la sorgente e la destinazione di un collegamento\r\n * \r\n * @param {any} edge Collegamento di cui calcolare la differenza di rango\r\n * \r\n * @returns {number} Differenza di rango\r\n */\r\n minLen = (edge) => 1;\r\n\r\n /**\r\n * Peso del collegamento, più è alto più generalmente risulterà corto\r\n * \r\n * @param {any} edge Collegamento di cui calcolare il peso\r\n * \r\n * @returns {number} Peso\r\n */\r\n edgeWeight = (edge) => 1;\r\n}\r\n","import { NodeSingular } from 'cytoscape';\r\nimport { ShapedLayoutOptionsImpl } from './base/ShapedLayoutOptionsImpl';\r\n\r\n/**\r\n * Default per l'implementazione dell'algoritmo Grid\r\n */\r\nexport class GridLayoutOptionsImpl extends ShapedLayoutOptionsImpl {\r\n\r\n /** @ignore */\r\n constructor() { super(); }\r\n\r\n /**\r\n * Nome dell'algoritmo di layouting\r\n */\r\n name = 'grid';\r\n\r\n /**\r\n * Spazio extra attorno ai nodi quando **avoidOverlap** è **true**\r\n */\r\n avoidOverlapPadding = 10;\r\n\r\n /**\r\n * Se **true** cerca di utilizzare il minor spazio possibile, se **false** usa tutto lo spazio che ha a disposizione\r\n */\r\n condense = false;\r\n\r\n /**\r\n * Forzatura del numero di righe della griglia\r\n */\r\n rows?: number | undefined = null;\r\n\r\n /**\r\n * Forzatura del numero di colonne della griglia\r\n */\r\n cols?: number | undefined = null;\r\n\r\n /**\r\n * Dato un nodo restituisce un indice di riga e di colonna della griglia in cui metterlo\r\n * \r\n * @param {NodeSingular} node Nodo\r\n * @returns {{ row: number, col: number }} Oggetto che identifica una posizione della griglia\r\n */\r\n position: (node: NodeSingular) => { row: number; col: number; } = null;\r\n}\r\n","import { BaseLayoutOptionsImpl } from './base/BaseLayoutOptionsImpl';\r\n\r\n/**\r\n * Pseudo implementazione di un algoritmo vuoto che non fa nulla\r\n */\r\nexport class NullLayoutOptionsImpl extends BaseLayoutOptionsImpl {\r\n\r\n /** @ignore */\r\n constructor() { super(); }\r\n\r\n /**\r\n * Nome dell'algoritmo di layouting\r\n */\r\n name = 'null';\r\n}","import { AnimateLayoutOptionsImpl } from './base/AnimateLayoutOptionsImpl';\r\n\r\n/**\r\n * Default per l'implementazione dell'algoritmo Preset (Posiziona i nodi in base alla loro proprietà **position**)\r\n */\r\nexport class PresetLayoutOptionsImpl extends AnimateLayoutOptionsImpl {\r\n\r\n /** @ignore */\r\n constructor() { super(); }\r\n\r\n /**\r\n * Nome dell'algoritmo di layouting\r\n */\r\n name = 'preset';\r\n\r\n /**\r\n * Indica se adattare al contenitore\r\n */\r\n fit?: boolean;\r\n\r\n /**\r\n * Padding rispetto al contenitore\r\n */\r\n padding?: number;\r\n\r\n /**\r\n * Mappatura da un nodo ad una posizione\r\n * \r\n * @param {any} node Nodo\r\n * \r\n * @returns {any} Posizione iniziale\r\n */\r\n positions: (node) => any;\r\n\r\n /**\r\n * Funzione per la trasformazione delle posizioni dei nodi\r\n * \r\n * @param {any} node Nodo\r\n * @param {any} position Posizione iniziale\r\n * \r\n * @returns {any} Posizione finale\r\n */\r\n transform = (node, position) => position;\r\n}\r\n","import { AnimateLayoutOptionsImpl } from './base/AnimateLayoutOptionsImpl';\r\n\r\n/**\r\n * Default per l'implementazione dell'algoritmo Random\r\n */\r\nexport class RandomLayoutOptionsImpl extends AnimateLayoutOptionsImpl {\r\n\r\n /** @ignore */\r\n constructor() { super(); }\r\n\r\n /**\r\n * Nome dell'algoritmo di layouting\r\n */\r\n name = 'random';\r\n\r\n /**\r\n * Indica se adattare al contenitore\r\n */\r\n fit = true;\r\n\r\n /**\r\n * Padding rispetto al contenitore\r\n */\r\n padding = 20;\r\n\r\n /**\r\n * Specifica le dimensioni esatte al cui interno effettuare il layouting, specificato come **{ x1, y1, x2, y2 }** o **{ x1, y1, w, h }**\r\n */\r\n boundingBox: cytoscape.BoundingBox12 | cytoscape.BoundingBoxWH | undefined = null;\r\n\r\n /**\r\n * Funzione per la trasformazione delle posizioni dei nodi\r\n * \r\n * @param {any} node Nodo\r\n * @param {any} position Posizione iniziale\r\n * \r\n * @returns {any} Posizione finale\r\n */\r\n transform = (node, position) => position;\r\n}\r\n","/**\r\n * Classe di configurazione per il Modulo\r\n */\r\nexport class EsDiagramModuleConfig{\r\n\r\n /**\r\n * Attiva o disattiva la modalità di debug per scrivere i messaggi a console\r\n */\r\n debugMode?: boolean;\r\n}","// Grabbata felicemente da amcharts, rimuovendo helper interni, cose strane e instupidendola un po':\r\n// https://github.com/amcharts/amcharts4/blob/7fbb61e90363a2373e6130800dee06b8a62f3aab/src/.internal/core/utils/ResizeSensor.ts\r\n\r\n/**\r\n * Oggetto nativo **ResizeObserver**\r\n */\r\ndeclare const ResizeObserver: any;\r\n\r\n/**\r\n * Classe di utilità che tiene d'occhio i cambiamenti di dimensione di un elemento. Un **ResizeSensor** può controllare al massimo un elemento\r\n */\r\nexport class ResizeSensor {\r\n\r\n /**\r\n * Riferimento all'observer nativo\r\n */\r\n private observer: any = null;\r\n\r\n /**\r\n * Indica se questo oggetto è stato distrutto o no\r\n */\r\n public Disposed: boolean = false;\r\n\r\n /**\r\n * Elemento da controllare e callback da chiamare quando le dimensioni dell'elemento cambiano\r\n */\r\n private target: { targetEl: Element, callback: () => void } = null;\r\n\r\n /**\r\n * Costruttore\r\n * \r\n * @param {HTMLElement} element Elemento HTML da controllare\r\n * @param {Function} callback Callback da chiamare quando le dimensioni di **element** cambiano\r\n */\r\n constructor(element: HTMLElement, callback: () => void) {\r\n this.makeSensor();\r\n this.addTarget(element, callback);\r\n }\r\n\r\n /**\r\n * Distruttore\r\n */\r\n public dispose() {\r\n if (!this.Disposed) {\r\n this.Disposed = true;\r\n this.removeTarget();\r\n }\r\n }\r\n\r\n /**\r\n * Creazione del sensore che sarà collegato all'elemento da osservare dal metodo **addTarget**\r\n */\r\n private makeSensor() {\r\n if (typeof ResizeObserver == \"undefined\")\r\n throw \"Resize Observer non è definito. Si prega di utilizzare un browser vero\";\r\n\r\n this.observer = new ResizeObserver((entries: Array<any>) => {\r\n for (let i = 0; i < entries.length; ++i) {\r\n if (this.target && this.target.targetEl === entries[i].target)\r\n this.target.callback();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Dice al sensore di osservare l'elemento **targetEl**, richiamando **callback** qualora le dimensioni cambino\r\n * \r\n * @param {HTMLElement} targetEl Elemento HTML da controllare\r\n * @param {Function} callback Callback da chiamare quando le dimensioni di **element** cambiano\r\n */\r\n public addTarget(targetEl: HTMLElement, callback: () => void) {\r\n this.observer.observe(targetEl, { box: \"content-box\" });\r\n this.target = { targetEl, callback };\r\n }\r\n\r\n /**\r\n * Rimuove l'elemento HTML attuale dall'osservazione del **ResizeObserver**\r\n */\r\n public removeTarget() {\r\n if (!this.target)\r\n return;\r\n\r\n this.observer.unobserve(this.target.targetEl);\r\n this.target = null;\r\n }\r\n}","import { InjectionToken } from \"@angular/core\";\r\n\r\n /**\r\n * Token che indica se attivare la modalità di debug (messaggi a console)\r\n */\r\n export const DIA_DEBUG_MODE: InjectionToken<boolean> = new InjectionToken<boolean>('DIA_DEBUG_MODE');","import { Inject, Injectable, Optional } from \"@angular/core\";\r\n\r\nimport { DIA_DEBUG_MODE } from \"../tokens\";\r\n\r\n// Questo modulo esporta sia un namespace che si chiama \"cytoscape\" sia la funzione \"cytoscape\" (costruttore)\r\n// Con questi 2 salti si riescono a non avere problemi di typings: https://github.com/jvandemo/generator-angular2-library/issues/221#issuecomment-355945207\r\nimport * as cy_ from 'cytoscape';\r\n/** @ignore */ const cytoscape = cy_;\r\n\r\n/**\r\n * Loader dei moduli di Cytoscape. Utilizza una cache per tenerseli in memoria a livello di applicazione \r\n * in modo da non dover ricaricare nulla dopo avere usato un modulo almeno una volta\r\n */\r\n@Injectable()\r\nexport class EsDiagramService {\r\n\r\n /**\r\n * Cache dei moduli caricati\r\n */\r\n private modulesCache: { [index: string]: cytoscape.Ext } = {};\r\n\r\n /**\r\n * Costruttore\r\n * \r\n * @ignore\r\n */\r\n constructor(@Optional() @Inject(DIA_DEBUG_MODE) private DIA_DEBUG_MODE: string) { }\r\n\r\n /**\r\n * Permette di importare, se serve un dato tema o localizzazione\r\n * \r\n * @param {'cytoscape-expand-collapse' | 'cytoscape-cxtmenu' | 'cytoscape-html-node' | 'cytoscape-dagre'} moduleId Nome del modulo di Cytoscape da importare (dev'essere il nome della cartella in node_modules)\r\n * \r\n * @returns {Promise<void | cytoscape.Ext>} Funzione di estensione per Cytoscape presa dal modulo richiesto\r\n */\r\n public async importIfNeeded(moduleId: 'cytoscape-expand-collapse' | 'cytoscape-cxtmenu' | 'cytoscape-html-node' | 'cytoscape-dagre'): Promise<void | cytoscape.Ext> {\r\n\r\n // Ognuno esporta il modulo un po' come cazzo gli pare quindi ocio. \r\n // Notare che tutti i \"moudle\" dopo lo then sono castati ad <any> e che l'oggetto recuperato ogni tanto è \"default\", altre volte è il \"register\", altre è l'\"ext\", eccetera...\r\n if (!this.modulesCache[moduleId]) {\r\n this.log(\"I\", this.loc(\"Module not available. Loading it now\") + \": \" + moduleId, false);\r\n switch (moduleId) {\r\n case \"cytoscape-cxtmenu\": return import(\"cytoscape-cxtmenu\").then((module: any) => this.modulesCache[moduleId] = module.default).catch(err => this.handleError(moduleId, err));\r\n case \"cytoscape-expand-collapse\": return import(\"cytoscape-expand-collapse\").then((module: any) => this.modulesCache[moduleId] = module.default).catch(err => this.handleError(moduleId, err));\r\n case \"cytoscape-html-node\": return import(\"@esfaenza/cytoscape-html-node\").then((module: any) => this.modulesCache[moduleId] = module.register).catch(err => this.handleError(moduleId, err));\r\n case \"cytoscape-dagre\":\r\n await import(\"dagre\").catch(err => this.handleError(\"dagre\", err));\r\n return import(\"cytoscape-dagre\").then((module: any) => this.modulesCache[moduleId] = module.default).catch(err => this.handleError(moduleId, err));\r\n }\r\n }\r\n else {\r\n // I moduli non devono mai essere ricaricati nel globale, quindi invece che restituire la copia della cache restituisco vuoto\r\n this.log(\"I\", this.loc(\"Module already loaded\") + \": \" + moduleId, false);\r\n return new Promise((resolve) => { resolve(null) });\r\n }\r\n }\r\n\r\n /**\r\n * Gestione degli errori di caricamento dei moduli qualora qualcuno utilizzasse un modulo non installato\r\n * \r\n * @param {string} moduleId Nome del modulo che si è cercato di caricare\r\n * @param {any} err Errore restituito dalla promise di caricamento\r\n */\r\n private handleError(moduleId: string, err: any) {\r\n this.log(\"E\", this.loc(\"Module cannot be loaded\") + \": \" + moduleId + \" - \" + err, false);\r\n }\r\n\r\n /**\r\n * Scrittore di log a console. Attivo solo quando la libreria è in modalità di Debug\r\n * \r\n * @param {'E' | 'I' | 'W'} severity Tipo di messaggio (Errore, Info, Warning)\r\n * @param {string} text Testo da tradurre\r\n * @param {boolean} requiresTranslation Indica se **text** è una frase già tradotta o se è da tradurre\r\n */\r\n public log(severity: 'E' | 'I' | 'W', text: string, requiresTranslation: boolean = true) {\r\n\r\n if (!this.DIA_DEBUG_MODE)\r\n return;\r\n\r\n var message = \"@esfaenza/diagrams: \" + (requiresTranslation ? this.loc(text) : text);\r\n switch (severity) {\r\n case 'E': console.error(message);\r\n break;\r\n case 'I': console.info(message);\r\n break;\r\n case 'W': console.warn(message);\r\n break;\r\n }\r\n }\r\n\r\n /**\r\n * Metodo di localizzazione dei messaggi\r\n * \r\n * @param {string} text Messaggio da tradurre\r\n * \r\n * @returns {string} Messaggio tradotto\r\n */\r\n public loc(text: string): string {\r\n //return Loc[text][this.DIA_LOCALE];\r\n return text;\r\n }\r\n}","import { Injectable, Inject } from '@angular/core';\r\n\r\nimport { DIA_DEBUG_MODE } from '../tokens';\r\n\r\n/**\r\n * Classe che si occupa del dispatch delle operazioni di rendering degli oggetti utilizzando una coda \r\n */\r\n@Injectable()\r\nexport class EsDiagramDispatcher {\r\n\r\n /**\r\n * Coda di inizializzazioni ancora da eseguire. Quando questa è vuota significa che nessuno sta creando oggetti\r\n */\r\n private Initializations: { name: string, function: any }[] = [];\r\n\r\n /**\r\n * Lista degli oggetti inizializzati e attivi in un dato momento (viene registrata la proprietà **name**). Non è possibile registrare due grafici con lo stesso identificativo\r\n */\r\n private Initialized: string[] = [];\r\n\r\n /**\r\n * @ignore\r\n */\r\n constructor(@Inject(DIA_DEBUG_MODE) private logs: boolean) { }\r\n\r\n /**\r\n * Registra un oggetto da visualizzare insieme alla propria funzione di creazione. Quest'ultima sarà differita fino a che tutti gli oggetti\r\n * precedentemente registati non hanno finito la fase di inizializzazione\r\n * \r\n * @param {string} name Identificativo dell'oggetto da registrare\r\n * @param {Function} creationFunction Funzione che fisicamente dovrà occuparsi della creazione dell'oggetto\r\n */\r\n public register(name: string, creationFunction: Function) {\r\n if (this.Initialized.indexOf(name) != -1)\r\n throw \"Attempting to register a duplicate object '\" + name + \"'. Make sure the 'name' properties of your diagram are univoque\";\r\n\r\n this.log(\"DISPATCHER: Registering diagram creation function execution for \" + name);\r\n this.Initializations.push({ name: name, function: creationFunction });\r\n if (this.Initializations.length == 1) {\r\n this.log(\"DISPATCHER: Initial drain started\");\r\n this.drainInitQueues();\r\n }\r\n }\r\n\r\n /**\r\n * Deregistra un oggetto presente. Chiamata generalmente al dispose dell'oggetto in questione quando non dev'essere più mostrato nella pagina corrente\r\n * \r\n * @param {string} name Identificativo dell'oggetto da deregistrare\r\n */\r\n public deregister(name: string) {\r\n let index = this.Initialized.indexOf(name);\r\n if (index == -1)\r\n {\r\n //Questo succede quando si cerca di distruggere l'oggetto mentre sta venendo graficato\r\n this.log(\"DISPATCHER: Registration missing for object \" + name + \" it was probably destroyed during load\");\r\n return;\r\n }\r\n\r\n this.log(\"DISPATCHER: Object deregistered \" + name);\r\n this.Initialized.splice(index, 1)\r\n }\r\n\r\n /**\r\n * Metodo che esegue in maniera sequenziale le funzioni di inizializzazione degli oggetti finché presenti \r\n * in modo che nessun oggetto possa essere inizializzato contemporaneamente ad un altro\r\n */\r\n private drainInitQueues() {\r\n let toExecute = this.Initializations[0];\r\n this.log(\"DISPATCHER: Executing initialization function for object \" + toExecute.name);\r\n\r\n toExecute.function().then(() => {\r\n this.log(\"DISPATCHER: initialization for object \" + toExecute.name + \" is done\");\r\n this.Initialized.push(toExecute.name);\r\n this.Initializations.splice(0, 1);\r\n if (this.Initializations.length >= 1) {\r\n this.log(\"DISPATCHER: Found queued initializations. Continuing\");\r\n this.drainInitQueues();\r\n }\r\n else\r\n this.log(\"DISPATCHER: queue is over, nothing more to do\");\r\n });\r\n }\r\n\r\n /**\r\n * @ignore\r\n */\r\n private log(text: string) {\r\n if (this.logs)\r\n console.log(\"@esfaenza/es-diagrams: \" + text);\r\n }\r\n}","import { Injectable } from \"@angular/core\";\r\n\r\n/**\r\n * Classe che fornisce metodi reattivi di estensione. Per ora implementato solo uno pseudo-throttle\r\n */\r\n@Injectable({ providedIn: \"root\" })\r\nexport class ReactiveExtensions {\r\n\r\n /**\r\n * Cache di tutti i timer in esecuzione\r\n */\r\n private executionTimers: { [index: string]: any } = {};\r\n\r\n /**\r\n * Esecuzione deleyata di una funzione. Se viene richiamata nuovamente prima di venire eseguita dopo il delay, il delay viene resettato\r\n * \r\n * @param {string} id Id per aiutare il servizio a distinguere funzioni con nome uguale chiamate da componenti diversi\r\n * @param {Function} func Funzione da chiamare al termine del throttle\r\n * @param {number} throttleTime Tempo di throttling in millisecondi\r\n */\r\n public throttle(id: string, func: Function, throttleTime: number = 0) {\r\n let key = func.name + \"_\" + id;\r\n\r\n //Se ho la funzione che vuole eseguire ripulisco quel timeout\r\n if (this.executionTimers[key])\r\n clearTimeout(this.executionTimers[key]);\r\n\r\n //Ricreo il timeout per eseguire quella funzione dopo throttleTime millisecondi\r\n var executionTimer = setTimeout(() => { func(); this.executionTimers[key] = null; }, throttleTime);\r\n this.executionTimers[key] = executionTimer;\r\n }\r\n}","import { Component, ElementRef, EventEmitter, Input, OnChanges, Optional, Output, SimpleChanges, ViewChild } from '@angular/core'\r\n\r\nimport { ContextMenuOptions } from '../models/component/contextmenu/ContextMenuOptions';\r\nimport { ExpandCollapseOptions } from '../models/component/grouping/ExpandCollapseOptions';\r\nimport { NodeHTMLTemplate } from '../models/component/nodes/NodeHTMLTemplate';\r\n\r\nimport { BreadthFirstLayoutOptionsImpl } from '../models/layouts/BreadthFirstLayoutOptionsImpl';\r\nimport { CircleLayoutOptionsImpl } from '../models/layouts/CircleLayoutOptionsImpl';\r\nimport { ConcentricLayoutOptionsImpl } from '../models/layouts/ConcentricLayoutOptionsImpl';\r\nimport { CoseLayoutOptionsImpl } from '../models/layouts/CoseLayoutOptionsImpl';\r\nimport { DagreLayoutOptionsImpl } from '../models/layouts/DagreLayoutOptionsImpl';\r\nimport { GridLayoutOptionsImpl } from '../models/layouts/GridLayoutOptionsImpl';\r\nimport { NullLayoutOptionsImpl } from '../models/layouts/NullLayoutOptionsImpl';\r\nimport { PresetLayoutOptionsImpl } from '../models/layouts/PresetLayoutOptionsImpl';\r\nimport { RandomLayoutOptionsImpl } from '../models/layouts/RandomLayoutOptionsImpl';\r\n\r\nimport { EsDiagramService } from '../services/es-diagram.service';\r\nimport { EsDiagramDispatcher } from '../services/es-diagram.dispatcher';\r\nimport { ResizeSensor } from \"../extensions/ResizeSensor\";\r\n\r\nimport { ReactiveExtensions } from '../extensions/ReactiveExtensions';\r\n\r\nimport * as cy_ from 'cytoscape';\r\n/** @ignore */const cytoscape = (<any>cy_).default? (<any>cy_).default: cy_;\r\n\r\n/**\r\n * Componente che si occupa di graficare un diagramma e di gestirne il ciclo di vita\r\n */\r\n@Component({\n selector: 'es-diagram',\n templateUrl: './es-diagram.component.html',\n styleUrls: ['./es-diagram.component.scss'],\n standalone: false\n})\r\nexport class EsDiagramComponent implements OnChanges {\r\n\r\n /**\r\n * Riferimento all'oggetto HTML su cui creare il diagramma\r\n */\r\n @ViewChild('graph') cyGraph: ElementRef;\r\n\r\n /**\r\n * Nome del diagramma, fondamentale assegnarlo per permettere alla libreria di schedularne la creazione\r\n */\r\n @Input() name: string = \"\";\r\n\r\n /**\r\n * Indica se utilizzare il menù contestuale a ruota attorno ad ogni nodo\r\n */\r\n @Input() UseContextMenu: boolean = false;\r\n\r\n /**\r\n * Indica le opzioni del menù contestuale qualora **UseContextMenu** fosse **true**.\r\n * \r\n * Ogni elemento di questo array è un selettore con il menu da mostrare per quella casistica\r\n */\r\n @Input() ContextMenuOptions: ContextMenuOptions[];\r\n\r\n /**\r\n * Dice al componente se il diagramma deve utilizzare il sistema di estensione per l'expand e collapse dei gruppi\r\n */\r\n @Input() UseExpandCollapse: boolean = false;\r\n\r\n /**\r\n * Opzioni native dell'estensione expand-collapse, vengono ovviamente utilizzate solo se **UseExpandCollapse** è **true**\r\n */\r\n @Input() ExpandCollapseOptions: ExpandCollapseOptions;\r\n\r\n /**\r\n * Blocco completo delle opzioni, alternativo all'assegnazione di **Elements**, **NodeStyles**, **EdgeStyles**, e **Layout**.\r\n * \r\n * Qualora entrambe venissero specificate verrà effettuata un'unione fra queste opzioni e quelle specificate, dando priorità alle specificate\r\n */\r\n @Input() NativeOptions: cytoscape.CytoscapeOptions = {};\r\n\r\n /**\r\n * Definizione degli elementi da mostrare nel diagramma\r\n */\r\n @Input() Elements: cytoscape.ElementDefinition[];\r\n\r\n /**\r\n * Definizione degli stili dei nodi\r\n */\r\n @Input() NodeStyles: cytoscape.Css.Node;\r\n\r\n /**\r\n * Definizione degli stili dei collegamenti fra i nodi\r\n */\r\n @Input() EdgeStyles: cytoscape.Css.Edge;\r\n\r\n /**\r\n * In un diagramma in sola lettura tutte le interazioni utente sono annullate\r\n */\r\n @Input() Readonly: boolean;\r\n\r\n /**\r\n * Aggiorna automaticamente le dimensioni del diagramma quando cambiano le dimensioni della finestra\r\n */\r\n @Input() AutoupdateSize: boolean = true;\r\n\r\n /**\r\n * Indica di mantenere la posizione dei nodi qualora venissero cambiati dall'Input **Elements**.\r\n * \r\n * Se l'ID di un nodo è uguale all'ID di un nodo presente in precedenza, il nuovo nodo ne erediterà la posizione\r\n */\r\n @Input() PreserveElementsPosition: boolean = true;\r\n\r\n /**\r\n * Qualora venisse modificato l'Input **Elements**, piuttosto che mettere semplicemente il nuovo Elemento in base al Layout precedente, applica anche un'animazione \r\n * \r\n * Funziona solamente se il **Layout** corrente del diagramma supporta le animazioni\r\n */\r\n @Input() AnimateLayoutChanges: boolean = true;\r\n\r\n /**\r\n * Attiva una modalità di selezione \"smart\"... o perlomeno \"smarter\" del default di Cytoscape.\r\n * \r\n * - Il click di un elemento non selezionato lo seleziona\r\n * - Il click di un elemento selezionato lo deseleziona\r\n * - Lo stato di selezione viene persistito sull'oggetto originale invece di rimanere in un internal\r\n * - All'assegnazione di oggetti selezionati, questi vengono marcati correttamente con l'overlay di selezione\r\n * \r\n * N.B: la chiamata all'evento **onNodeClick** avviene **DOPO** la gestione della selezione\r\n */\r\n @Input() SmartSelection: boolean = false;\r\n\r\n /**\r\n * Indica di selezionare un elemento per volta qualora **SmartSelection** fosse attivo\r\n */\r\n @Input() SingleSelection: boolean = false;\r\n\r\n /**\r\n * CSS per la graficazione della selezione dei nodi. Quando un nodo verrà selezionato avrà sopra di se un overlay che 'sborda' di **overlay-padding** pixel,\r\n * di colore **overlay-color** e con un opacità **overlay-opacity**\r\n * \r\n * Assegnando \"{}\" a questo input, la Smart selection viene gestita ma la gestione grafica è affidata all'utente,\r\n * ad esempio usando dei **NodeHTMLTemplates** che definiscano selettori su nodi \":selected\"\r\n * \r\n * @default {'overlay-color':'blue','overlay-opacity':0.5,'overlay-padding':7}\r\n */\r\n @Input() SmartSelectionStyles: { 'overlay-color': string, 'overlay-opacity': number, 'overlay-padding': number } = null\r\n\r\n /**\r\n * Periodo di throttle da quando viene effettuato un resize a quando ricalcolare le dimensioni del diagramma.\r\n * \r\n * Può essere tenuto a 0 (redraw istantaneo) finché non ci sono problemi di prestazioni con eventualmente tanti resize a poca distanza l'uno dall'altro.\r\n */\r\n @Input() ResizeThrottleTime: number = 0;\r\n\r\n /**\r\n * Layout di ordinamento dei nodi\r\n */\r\n @Input() Layout: BreadthFirstLayoutOptionsImpl | CircleLayoutOptionsImpl | ConcentricLayoutOptionsImpl |\r\n CoseLayoutOptionsImpl | DagreLayoutOptionsImpl | GridLayoutOptionsImpl | NullLayoutOptionsImpl | PresetLayoutOptionsImpl |\r\n RandomLayoutOptionsImpl;\r\n\r\n /**\r\n * Template HTML da applicare ai nodi per dargli stili particolari, diversi dalle shape di default\r\n */\r\n @Input() NodeHTMLTemplates: NodeHTMLTemplate[];\r\n\r\n /**\r\n * Fornisce il global della libreria (namespace **cytoscape**) e si aspetta che dopo operazioni di importazione \r\n * lasciate all'utente vengano aggiunti tutti i moduli desiderati. \r\n * \r\n * È **fondamentale** che il primo parametro (il nome del modulo) sia uguale a ciò di cui viene fatto il require in modo che la libreria\r\n * possa controllare che il modulo importato non sia già stato importato in precedenza\r\n * \r\n * ## Esempio:\r\n * \r\n * ```typescript\r\n * (global) => {\r\n * return import(\"cytoscape-extension-library\").then(module => global.use(\"cytoscape-extension-library\", module.default));\r\n * \r\n * ...\r\n * }\r\n * ```\r\n */\r\n @Input() ExtensionModulesImporter: (global: { use: (moduleName: string, module: void | cytoscape.Ext) => void }) => Promise<any> = null;\r\n\r\n /**\r\n * Fornisce l'istanza attuale di Cytoscape da cui è possibile prendere le librerie di estensione caricate in **ExtensionModulesImporter**\r\n * e configurarle in base ai comportamenti specifici\r\n * \r\n * ## Esempio:\r\n * \r\n * ```typescript\r\n * (cytoscapeCore) => {\r\n * // Fare questo lavoro per ogni estensione caricata\r\n * let extensionConfiguration = { ... };\r\n * let extensionInstance = cytoscapeCore.extensionLibrary(extensionConfiguration);\r\n * extensionInstance.doSomethingSpecificToThisExtension();\r\n * \r\n * ...\r\n * }\r\n * ```\r\n */\r\n @Input() ExtensionModulesApplyer: (cytoscapeCore: cytoscape.Core) => void = null;\r\n\r\n /**\r\n * Evento lanciato al click di un nodo, contiene l'oggetto **data** del nodo in questione\r\n */\r\n @Output() onNodeClick: EventEmitter<{ data: any }> = new EventEmitter<{ data: any }>();\r\n\r\n /**\r\n * Evento lanciato alla selezione o deselezione di un nodo, contiene l'oggetto **data** del nodo in questione e informazioni sul suo stato di selezione\r\n */\r\n @Output() onNodeSelection: EventEmitter<{ data: any, selected: boolean }> = new EventEmitter<{ data: any, selected: boolean }>();\r\n\r\n /**\r\n * Evento lanciato al termine del Layouting. Se si vuole eseguire codice dopo che il Layout è fatto e completamente graficato, questo è il punto\r\n */\r\n @Output() onLayoutDone: EventEmitter<void> = new EventEmitter<void>();\r\n\r\n /**\r\n * Evento lanciato al termine del caricamento del diagramma\r\n */\r\n @Output() onLoaded: EventEmitter<void> = new EventEmitter<void>();\r\n\r\n /**\r\n * Variabile su cui salvarsi se i nodi hanno una gerarchia a gruppi o no. Serve per poi caricare l'estensione expand-collapse qualora fosse richiesta\r\n */\r\n private NodesHierarchy: boolean;\r\n\r\n /**\r\n * Indica se il rendering del diagramma è terminato\r\n */\r\n private Rendered: boolean = false;\r\n\r\n /**\r\n * Istanza del diagramma attualmente in uso\r\n */\r\n public cy: cytoscape.Core\r\n\r\n /**\r\n * Api dell'estensione expand-collapse per permettere di effettuare operazioni dall'esterno del diagramma. Vengono valorizzate se **UseExpandCollapse** è **true**\r\n */\r\n public ExpandCollapseApi: any = null;\r\n\r\n /**\r\n * Api dell'estensione html-node per permettere di effettuare operazioni dall'esterno del diagramma. Vengono valorizzate se sono impostati dei **NodeHTMLTemplates**\r\n */\r\n private HtmlNodeApi: any = null;\r\n\r\n /**\r\n * Osservatore delle modifiche al contenitore del diagramma\r\n */\r\n private resizeObserver: ResizeSensor;\r\n\r\n /**\r\n * Riferimento all'ultimo layout utilizzato. Viene riapplicato qualora venisse cambiato l'Input **Elements**.\r\n * \r\n * Non utilizzo il makeLayouts perché altrimenti rischierei di creare un layout riferito a X elementi, ne aggiungo 1, riapplico il Layout \r\n * ma mi viene riapplicato a X elementi invece che X + 1\r\n */\r\n private LastLayout: cytoscape.LayoutOptions;\r\n\r\n /**\r\n * Costruttore\r\n * \r\n * @ignore\r\n */\r\n constructor(@Optional() private service: EsDiagramService, @Optional() private dispatcher: EsDiagramDispatcher, private exts: ReactiveExtensions) { }\r\n\r\n /**\r\n * @ignore \r\n * \r\n * Angular Pipeline\r\n */\r\n public ngAfterViewInit() {\r\n if (!this.service || !this.dispatcher)\r\n throw \"Il modulo @esfaenza/diagrams non è stato importato con il forRoot();\";\r\n\r\n this.dispatchLoadChart();\r\n }\r\n\r\n /**\r\n * All'onDestroy ripulisco la memoria dal diagramma\r\n */\r\n public ngOnDestroy() {\r\n if (this.resizeObserver) {\r\n this.resizeObserver.dispose();\r\n this.resizeObserver = null;\r\n }\r\n\r\n if (this.cy) {\r\n this.service.log(\"I\", \"Diagram\" + \" \" + this.name + \": Unloading destroyed diagram\", false);\r\n this.cy.destroy();\r\n this.dispatcher.deregister(this.name);\r\n }\r\n else\r\n this.service.log(\"I\", \"Chart \" + this.name + \": Unloading uncreated chart component. It probably was a duplicated\", false);\r\n }\r\n\r\n /**\r\n * Registra il diagramma attuale nel Dispatcher in modo che venga caricato appena possibile\r\n */\r\n private dispatchLoadChart(): void {\r\n this.dispatcher.register(this.name, () => { return this.render(); });\r\n }\r\n\r\n /**\r\n * @ignore \r\n * \r\n * Angular Pipeline: Gestione ri-graficazione del diagramma, se possibile\r\n */\r\n public ngOnChanges(changes: SimpleChanges): any {\r\n let toCheck = [\"Templates\", \"UseContextMenu\", \"ContextMenuOptions\", \"UseExpandCollapse\", \"ExpandCollapseOptions\", \"NodeStyles\", \"EdgeStyles\", \"NativeOptions\"];\r\n\r\n if (this.Rendered && toCheck.some(t => changes[t]))\r\n this.service.log(\"W\", \"Redraw based on dynamic Input change is supported only for 'Elements' and 'Layout' inputs, please destroy the component and recreate it with the new settings\");\r\n\r\n let elementChanges = changes[\"Elements\"];\r\n let layoutChanges = changes[\"Layout\"];\r\n if (elementChanges && !elementChanges.firstChange) {\r\n this.service.log(\"I\", \"Elements have been changed after diagram initialization\");\r\n\r\n // Cambiamento agli Elementi: ripulisco gli elementi vecchi, prendo i nuovi, li sistemo e li riassegno. \r\n // Se il nuovo Input Elements è roba strana mi limito a ripulire il diagramma\r\n // Se cytoscape aveva già degli elementi precedentemente ne prendo le posizioni in modo da ridisegnarli partendo dallo stesso punto (carino per le animazioni)\r\n let elements = elementChanges?.currentValue;\r\n let previous_elements = this.PreserveElementsPosition ? <any>this.cy.nodes() : null;\r\n\r\n this.cy.elements().remove();\r\n if (elements && elements.length && elements.length > 0) {\r\n this.reviewCytoscapeElements(elements, previous_elements);\r\n this.cy.add(elements);\r\n\r\n if (this.SmartSelection)\r\n this.setupElementsSelectionIfNeeded();\r\n\r\n // Se solo gli elementi cambiano, riapplico il Layout precedente\r\n if (!layoutChanges && this.LastLayout) {\r\n\r\n // Se devo animare le modifche al layout forzo il parametro relativo\r\n if (this.AnimateLayoutChanges)\r\n (<any>this.LastLayout).animate = true;\r\n\r\n this.cy.layout(this.LastLayout).run();\r\n }\r\n }\r\n }\r\n\r\n // Se il layout cambia lo applico e me lo salvo come layout precedente per il futuro\r\n if (layoutChanges && !layoutChanges.firstChange) {\r\n this.service.log(\"I\", \"Layout have been changed after diagram initialization\");\r\n this.LastLayout = JSON.parse(JSON.stringify(layoutChanges.currentValue));\r\n this.cy.layout(this.LastLayout).run()\r\n }\r\n }\r\n\r\n /**\r\n * Effettua il rendering del diagramma\r\n */\r\n private async render() {\r\n\r\n // Tiro fuori le opzioni con cui generare il diagramma\r\n let cyOptions = this.getCompletedOptions();\r\n this.NodesHierarchy = cyOptions.elements && (<cy_.ElementDefinition[]>cyOptions.elements).some(t => t.data.parent);\r\n\r\n // Carico eventuali classi di estensione che servono\r\n await this.performModulesLoading();\r\n\r\n // Genero il diagramma\r\n this.cy = cytoscape(cyOptions);\r\n\r\n // Collego gli eventi al componente\r\n this.bindCytoscapeEvents();\r\n\r\n // Utilizzo le classi di estensione caricate precedentemente per fare il resto delle mie operazioni\r\n this.performOperationsWithLoadedModules();\r\n\r\n // Imposto la variabile Rendered a true in modo che se da adesso vengono fatte modifiche che dovrebbero causare un redraw posso accorgermene\r\n // e mandare a cagare lo stronzo di turno\r\n this.Rendered = true;\r\n\r\n // Se devo aggiornare in automatico in base alla dimensione del contenitore collego il ResizeObserver\r\n if (this.AutoupdateSize)\r\n this.listenOnChanges();\r\n\r\n if (this.SmartSelection) {\r\n this.setupSelectionStyles();\r\n this.setupElementsSelectionIfNeeded();\r\n }\r\n\r\n this.onLoaded.emit();\r\n }\r\n\r\n /**\r\n * Prende tutti gli elementi appena assegnati, e se qualcuno era selezionato la situazione viene persistita su cytoscape\r\n */\r\n private setupElementsSelectionIfNeeded() {\r\n for (let i = 0; i < this.Elements.length; i++) {\r\n let eldata = <any>this.Elements[i].data;\r\n if (eldata.__selected) {\r\n let el = this.cy.$id(eldata.id);\r\n el.select();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Carica gli stili per mostrare carina la selezione dei nodi\r\n */\r\n private setupSelectionStyles(){\r\n let cssItem = this.SmartSelectionStyles || {\r\n 'overlay-color': 'blue',\r\n 'overlay-opacity': 0.5,\r\n 'overlay-padding': 7\r\n };\r\n\r\n // Backdoor per poter assegnare \"{}\" a SmartSelectionStyles in modo di utilizzare la smart selection ma senza che nessuno stile venga applicato\r\n // ad esempio qualora si volesse utilizzare l'htmlnode per gestire la grafica degli elementi selezionati\r\n if(cssItem['overlay-color'] && cssItem['overlay-opacity'] && cssItem['overlay-padding'])\r\n (<any>this.cy.style()).selector('node:selected').css(cssItem);\r\n }\r\n\r\n /**\r\n * Registra l'ascolto al contenitore del grafico e in caso di modifiche alla dimensione, al massimo una volta ogni 500 millisecondi, lo ridisegna\r\n */\r\n private listenOnChanges() {\r\n this.resizeObserver = new ResizeSensor(this.cyGraph.nativeElement, () => {\r\n this.exts.throttle(this.name, this.onContainerSizeChanged.bind(this), this.ResizeThrottleTime);\r\n });\r\n }\r\n\r\n /**\r\n * Funzione che si occupa di gestire il repaint del diagramma\r\n */\r\n private onContainerSizeChanged() {\r\n this.service.log(\"I\", \"Diagram container size has changed, redrawing\");\r\n this.cy.resize();\r\n this.cy.fit();\r\n }\r\n\r\n /**\r\n * Collega tutti gli eventi che mi possono servire e li espone in output\r\n */\r\n private bindCytoscapeEvents() {\r\n this.cy.bind('click', 'node', (event) => {\r\n let targetData = event.target.data()\r\n if (this.SmartSelection) {\r\n\r\n // In caso di selezione singola ripulisco tutti gli elementi precedentemente selezionati\r\n if (this.SingleSelection) {\r\n let selected = this.cy.elements('node:selected');\r\n selected.forEach(el => {\r\n el.selectify();\r\n el.unselect();\r\n el.unselectify();\r\n el.data(\"__selected\", false);\r\n });\r\n }\r\n \r\n let id = targetData.id\r\n let el = this.cy.$id(id);\r\n let selected = el.selected();\r\n\r\n el.selectify();\r\n if (selected)\r\n el.unselect();\r\n else\r\n el.select();\r\n el.unselectify();\r\n\r\n // Questo va anche nella lista degli elementi originali (this.Elements) dato che cytoscape li prende per riferimento (bbbbbravo cyto-chan)\r\n el.data(\"__selected\", !selected);\r\n }\r\n\r\n this.onNodeClick.emit({ data: targetData });\r\n });\r\n\r\n this.cy.bind('select', 'node', (event) => {\r\n let targetData = event.target.data()\r\n\r\n this.onNodeSelection.emit({ data: targetData, selected: true });\r\n });\r\n\r\n this.cy.bind('layoutstop', (event) => {\r\n this.onLayoutDone.emit();\r\n });\r\n\r\n this.cy.bind('unselect', 'node', (event) => {\r\n let targetData = event.target.data()\r\n\r\n this.onNodeSelection.emit({ data: targetData, selected: false });\r\n });\r\n\r\n // Altri eventi...\r\n }\r\n\r\n /**\r\n * Metodo che serve per caricare tutte le estensioni della libreria in base a ciò che viene utilizzato\r\n */\r\n private async performModulesLoading() {\r\n if (this.Layout.name == 'dagre')\r\n await this.loadInternal(\"cytoscape-dagre\");\r\n\r\n if (this.NodeHTMLTemplates && this.NodeHTMLTemplates.length > 0)\r\n await this.loadInternal(\"cytoscape-html-node\");\r\n\r\n if (this.UseContextMenu)\r\n await this.loadInternal(\"cytoscape-cxtmenu\");\r\n\r\n if (this.NodesHierarchy && this.UseExpandCollapse)\r\n await this.loadInternal(\"cytoscape-expand-collapse\");\r\n\r\n if (this.ExtensionModulesImporter) {\r\n // Wrappo il namespace in modo che possa dire la mia sul fatto che l'utente aggiunga un modulo o meno :D\r\n var wrappedCytoscape = {\r\n use: (moduleName: string, module: cytoscape.Ext) => {\r\n if (!module)\r\n this.service.log(\"E\", this.service.loc(\"Received an undefined module. Make sure you are correctly loading it\") + \": \" + moduleName, false);\r\n\r\n if ([\"cytoscape-dagre\", \"cytoscape-html-node\", \"cytoscape-cxtmenu\", \"cytoscape-expand-collapse\"].includes(moduleName))\r\n this.service.log(\"W\", this.service.loc(\"Module\") + \" \" + moduleName + \" \" + this.service.loc(\"is loaded and managed directly by this library. You don't need to import it or use it directly, just be sure to set the relative options\"), false);\r\n else\r\n cytoscape.use(module);\r\n }\r\n }\r\n\r\n await this.ExtensionModulesImporter(wrappedCytoscape);\r\n }\r\n }\r\n\r\n /**\r\n * Metodo che serve per caricare tutte le estensioni della libreria in base a ciò che viene utilizzato con le opzioni definite dagli Input\r\n */\r\n private performOperationsWithLoadedModules() {\r\n\r\n let anyCy = (<any>this.cy);\r\n\r\n // Utilizzo del layout, lo salvo per poterlo riutilizzare in futuro\r\n if (this.Layout) {\r\n this.LastLayout = JSON.parse(JSON.stringify(this.Layout));\r\n this.cy.layout(this.LastLayout).run()\r\n }\r\n\r\n // Utilizzo dell'HTML node\r\n if (this.NodeHTMLTemplates && this.NodeHTMLTemplates.length > 0) {\r\n this.HtmlNodeApi = anyCy.htmlnode();\r\n this.HtmlNodeApi.createHtmlNode(cytoscape, this.cy, this.NodeHTMLTemplates);\r\n }\r\n\r\n // Utilizzo del Context Menu\r\n if (this.UseContextMenu)\r\n this.ContextMenuOptions.forEach(o => { anyCy.cxtmenu(o); });\r\n\r\n // Utilizzo dell'expand collapse solo quando c'è una gerarchia di nodi\r\n if (this.NodesHierarchy && this.UseExpandCollapse)\r\n this.ExpandCollapseApi = anyCy.expandCollapse(this.ExpandCollapseOptions);\r\n\r\n // Utilizzo di estensioni extra, implementazione affidata al programmatore\r\n if (this.ExtensionModulesApplyer)\r\n this.ExtensionModulesApplyer(this.cy);\r\n }\r\n\r\n public updateCardData() {\r\n if (!this.HtmlNodeApi) {\r\n this.service.log(\"E\", \"Cannot update NodeHTMLTemplates as they don't seem to be used\");\r\n return;\r\n }\r\n this.HtmlNodeApi.update();\r\n }\r\n\r\n /**\r\n * Metodo interno per il caricamento dei moduli di estensione\r\n * \r\n * @param {'cytoscape-expand-collapse' | 'cytoscape-cxtmenu' | 'cytoscape-html-node' | 'cytoscape-dagre'} moduleId Modulo da caricare\r\n */\r\n private async loadInternal(moduleId: 'cytoscape-expand-collapse' | 'cytoscape-cxtmenu' | 'cytoscape-html-node' | 'cytoscape-dagre') {\r\n let toLoad = await this.service.importIfNeeded(moduleId);\r\n if (toLoad) cytoscape.use(toLoad);\r\n }\r\n\r\n /**\r\n * Metodo che basandosi sulle opzioni native eventualmente assegnate le completa con gli Input addizionali\r\n * \r\n * @returns {cy_.CytoscapeOptions} Opzioni finali unite da Input ed opzioni native\r\n */\r\n private getCompletedOptions(): cy_.CytoscapeOptions {\r\n var opts: cy_.CytoscapeOptions = this.NativeOptions || {};\r\n opts.container = this.cyGraph.nativeElement;\r\n opts.style = opts.style || [];\r\n\r\n // Per tutte le cose per cui gli Input hanno priorità sovrascrivo gli originali delle opzioni\r\n\r\n if (this.NodeStyles || this.EdgeStyles) {\r\n opts.style = [];\r\n if (this.NodeStyles) opts.style.push({ selector: 'node', css: this.NodeStyles });\r\n if (this.EdgeStyles) opts.style.push({ selector: 'edge', css: this.EdgeStyles });\r\n }\r\n\r\n if (this.Elements)\r\n opts.elements = this.Elements;\r\n\r\n this.reviewCytoscapeElements(<cytoscape.ElementDefinition[]>opts.elements);\r\n\r\n if (this.Layout)\r\n opts.layout = this.Layout;\r\n\r\n if (this.Readonly) {\r\n // Questo coso fa effetti strani....\r\n //opts.autolock = true;\r\n\r\n opts.autoungrabify = true;\r\n opts.autounselectify = false;\r\n opts.boxSelectionEnabled = true;\r\n opts.userZoomingEnabled = false;\r\n opts.userPanningEnabled = false;\r\n }\r\n\r\n return opts;\r\n }\r\n\r\n /**\r\n * Aggiustamenti degli elementi di Cytoscape. \r\n * \r\n * I nodi non vengono toccati.\r\n * \r\n * Per ogni edge viene controllato se è specificata una sorgente ed una destinazione, in caso contrario si cerca di dedurli dall'ID\r\n * \r\n * @param {cytoscape.ElementDefinition[]} elements Elementi da sistemare\r\n */\r\n private reviewCytoscapeElements(elements: cytoscape.ElementDefinition[], prevPositions?: any) {\r\n let hasPreviousPositions = prevPositions && prevPositions.length > 0;\r\n let positionCache: { [index: string]: cytoscape.Position } = {};\r\n\r\n if (hasPreviousPositions) {\r\n for (let i = 0; i < prevPositions.length; i++) {\r\n let item = prevPositions[i];\r\n if (!positionCache[item.data().id])\r\n positionCache[item.data().id] = item.position();\r\n }\r\n }\r\n\r\n for (let i = 0; i < elements.length; i++) {\r\n let el = elements[i];\r\n if (el.group == \"edges\" && (!el.data.source && !el.data.target)) {\r\n if (!el.data.id.includes(\"-\"))\r\n this.service.log(\"E\", \"If you don't specify a source and a target for an edge you have to write its id in the format {source}-{target}\");\r\n else {\r\n var sourceTarget = el.data.id.split('-');\r\n el.data.source = sourceTarget[0].trim();\r\n el.data.target = sourceTarget[1].trim();\r\n }\r\n }\r\n\r\n if (hasPreviousPositions && el.group == \"nodes\")\r\n el.position = positionCache[el.data.id]\r\n }\r\n }\r\n}","<div #graph class=\"graph-wrapper {{name}}\"></div>","import { ModuleWithProviders, NgModule } from '@angular/core'\nimport { EsDiagramComponent } from './components/es-diagram.component'\n\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms'\nimport { CommonModule } from '@angular/common'\nimport { EsDiagramService } from './services/es-diagram.service';\nimport { EsDiagramDispatcher } from './services/es-diagram.dispatcher';\nimport { EsDiagramModuleConfig } from './models/EsDiagramModuleConfig';\n\nimport { DIA_DEBUG_MODE } from './tokens';\n\n@NgModule({\n declarations: [ EsDiagramComponent ],\n imports: [ CommonModule, FormsModule, ReactiveFormsModule, CommonModule ],\n exports: [ EsDiagramComponent ]\n})\nexport class EsDiagramModule {\n static forRoot(config?: EsDiagramModuleConfig): ModuleWithProviders<EsDiagramModule> {\n return {\n ngModule: EsDiagramModule,\n providers: [\n EsDiagramService,\n EsDiagramDispatcher,\n { provide: DIA_DEBUG_MODE, useValue: config?.debugMode || false },\n ]\n };\n }\n}","/*\n * Public API Surface of cytoscape-angular\n */\n\nexport * from './lib/models/component/contextmenu/ContextMenuCommand';\nexport * from './lib/models/component/contextmenu/ContextMenuOptions';\nexport * from './lib/models/component/grouping/ExpandCollapseOptions';\nexport * from './lib/models/component/nodes/NodeHTMLTemplate';\nexport * from './lib/models/component/nodes/NodeTemplate';\nexport * from './lib/models/component/nodes/ZoomLevelBasedTemplate';\nexport * from './lib/models/layouts/base/BaseLayoutOptionsImpl';\nexport * from './lib/models/layouts/BreadthFirstLayoutOptionsImpl';\nexport * from './lib/models/layouts/CircleLayoutOptionsImpl';\nexport * from './lib/models/layouts/ConcentricLayoutOptionsImpl';\nexport * from './lib/models/layouts/CoseLayoutOptionsImpl';\nexport * from './lib/models/layouts/DagreLayoutOptionsImpl';\nexport * from './lib/models/layouts/GridLayoutOptionsImpl';\nexport * from './lib/models/layouts/NullLayoutOptionsImpl';\nexport * from './lib/models/layouts/PresetLayoutOptionsImpl';\nexport * from './lib/models/layouts/RandomLayoutOptionsImpl';\nexport * from './lib/models/layouts/base/ShapedLayoutOptionsImpl';\n\nexport * from './lib/models/EsDiagramModuleConfig';\nexport * from './lib/components/es-diagram.component';\n\nexport * from './lib/esdiagram.module';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["cytoscape","i1.EsDiagramService","i2.EsDiagramDispatcher","i3.ReactiveExtensions"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"esfaenza-es-diagrams.mjs","sources":["../../../projects/es-diagrams/src/lib/models/component/contextmenu/ContextMenuCommand.ts","../../../projects/es-diagrams/src/lib/models/component/contextmenu/ContextMenuOptions.ts","../../../projects/es-diagrams/src/lib/models/component/grouping/ExpandCollapseOptions.ts","../../../projects/es-diagrams/src/lib/models/component/nodes/NodeHTMLTemplate.ts","../../../projects/es-diagrams/src/lib/models/component/nodes/NodeTemplate.ts","../../../projects/es-diagrams/src/lib/models/component/nodes/ZoomLevelBasedTemplate.ts","../../../projects/es-diagrams/src/lib/models/layouts/base/BaseLayoutOptionsImpl.ts","../../../projects/es-diagrams/src/lib/models/layouts/base/AnimateLayoutOptionsImpl.ts","../../../projects/es-diagrams/src/lib/models/layouts/base/ShapedLayoutOptionsImpl.ts","../../../projects/es-diagrams/src/lib/models/layouts/BreadthFirstLayoutOptionsImpl.ts","../../../projects/es-diagrams/src/lib/models/layouts/CircleLayoutOptionsImpl.ts","../../../projects/es-diagrams/src/lib/models/layouts/ConcentricLayoutOptionsImpl.ts","../../../projects/es-diagrams/src/lib/models/layouts/CoseLayoutOptionsImpl.ts","../../../projects/es-diagrams/src/lib/models/layouts/DagreLayoutOptionsImpl.ts","../../../projects/es-diagrams/src/lib/models/layouts/GridLayoutOptionsImpl.ts","../../../projects/es-diagrams/src/lib/models/layouts/NullLayoutOptionsImpl.ts","../../../projects/es-diagrams/src/lib/models/layouts/PresetLayoutOptionsImpl.ts","../../../projects/es-diagrams/src/lib/models/layouts/RandomLayoutOptionsImpl.ts","../../../projects/es-diagrams/src/lib/models/EsDiagramModuleConfig.ts","../../../projects/es-diagrams/src/lib/extensions/ResizeSensor.ts","../../../projects/es-diagrams/src/lib/tokens.ts","../../../projects/es-diagrams/src/lib/services/es-diagram.service.ts","../../../projects/es-diagrams/src/lib/services/es-diagram.dispatcher.ts","../../../projects/es-diagrams/src/lib/extensions/ReactiveExtensions.ts","../../../projects/es-diagrams/src/lib/components/es-diagram.component.ts","../../../projects/es-diagrams/src/lib/components/es-diagram.component.html","../../../projects/es-diagrams/src/lib/esdiagram.module.ts","../../../projects/es-diagrams/src/public-api.ts","../../../projects/es-diagrams/src/esfaenza-es-diagrams.ts"],"sourcesContent":["/**\r\n * Definizione di un comando del Context menù\r\n */\r\nexport class ContextMenuCommand {\r\n\r\n /**\r\n * Background delo spicchio\r\n */\r\n fillColor?: string;\r\n\r\n /**\r\n * Contenuto del comando, html o testo\r\n */\r\n content: string;\r\n\r\n /**\r\n * Dizionario di stili da applicare all'html in cui viene wrappato il **content**\r\n */\r\n contentStyle?: { [key: string]: string; };\r\n\r\n /**\r\n * Funzione da eseguire quando questo comando viene cliccato\r\n */\r\n select: (ele) => void;\r\n\r\n /**\r\n * Indica se il comando è abilitato o no\r\n */\r\n enabled?: boolean;\r\n}","import { ContextMenuCommand } from \"./ContextMenuCommand\";\r\n\r\n/**\r\n * Opzioni che gestiscono il context menu. Quando una di queste opzioni non viene assegnata viene mantenuto il default, assicurarsi quindi di modificare solo\r\n * le proprietà che si vogliono effettivamente cambiare rispetto ai default\r\n */\r\nexport class ContextMenuOptions {\r\n\r\n /**\r\n * Raggio esterno del Menù, aggiunto alla dimensione renderizzata del nodo\r\n */\r\n public menuRadius?: (ele) => number;\r\n\r\n /**\r\n * Selettore di tutti gli elementi a cui verrà applicato il context menu. Di default sono tutti i nodi\r\n */\r\n public selector?: string;\r\n\r\n /**\r\n * Lista di comandi da mostrare nel menù\r\n */\r\n public commands?: ContextMenuCommand[];\r\n\r\n /**\r\n * Colore di background del menu\r\n */\r\n public fillColor?: string;\r\n\r\n /**\r\n * Colore di background del menù quando c'è il mouse in selezione sopra\r\n */\r\n public activeFillColor?: string;\r\n\r\n /**\r\n * Dimensione aggiuntiva per l'operazione selezionata in modo da evidenziarla dalle altre\r\n */\r\n public activePadding?: number;\r\n\r\n /**\r\n * Dimensione in pixel dell'indicatore sul comando attuale\r\n */\r\n public indicatorSize?: number;\r\n\r\n /**\r\n * Distanza in pixel da un comando e l'altro\r\n */\r\n public separatorWidth?: number;\r\n\r\n /**\r\n * Dimensione extra fra l'elemento e il centro del menù\r\n */\r\n public spotlightPadding?: number;\r\n\r\n /**\r\n * Raggio minimo del centro del menù\r\n */\r\n public minSpotlightRadius?: number;\r\n\r\n /**\r\n * Raggio massimo del centro del menù\r\n */\r\n public maxSpotlightRadius?: number;\r\n\r\n /**\r\n * Eventi per il quale il menù deve aprirsi\r\n */\r\n public openMenuEvents?: 'cxttapstart' | 'taphold';\r\n\r\n /**\r\n * Colore del testo del menù\r\n */\r\n public itemColor?: string;\r\n\r\n /**\r\n * Colore dell'ombreggiatura del testo del menù\r\n */\r\n public itemTextShadowColor?: string;\r\n\r\n /**\r\n * zIndex del div in cui viene renderizzato il menù\r\n */\r\n public zIndex?: number;\r\n\r\n /**\r\n * Indica se mostrare il menù alla posizione del mouse\r\n */\r\n public atMouse?: boolean;\r\n\r\n /**\r\n * Indica se adattarsi alla dimensione del nodo. Se impostato le proprietà **minSpotlightRadius** e **maxSpotlightRadius** vengono ignorate\r\n */\r\n public adaptativeNodeSpotlightRadius?: boolean\r\n\r\n /**\r\n * Se settato a number indica dopo quanti pixel fuori dal menu il click viene annullato, altrimenti va settato a **false**\r\n */\r\n public outsideMenuCancel?: boolean | number\r\n}\r\n\r\n\r\n","\r\n/**\r\n * Opzioni native per l'estensione expand-collapse di cytoscape\r\n */\r\nexport class ExpandCollapseOptions {\r\n /** @ignore */ layoutBy?: any; // to rearrange after expand/collapse. It's just layout options or whole layout function. Choose your side!\r\n /** @ignore */ fisheye?: boolean; // whether to perform fisheye view after expand/collapse you can specify a function too\r\n /** @ignore */ animate?: boolean; // whether to animate on drawing changes you can specify a function too\r\n /** @ignore */ animationDuration?: number; // when animate is true, the duration in milliseconds of the animation\r\n /** @ignore */ ready?: () => void; // callback when expand/collapse initialized\r\n /** @ignore */ undoable?: boolean; // and if undoRedoExtension exists,\r\n\r\n /** @ignore */ cueEnabled?: boolean; // Whether cues are enabled\r\n /** @ignore */ expandCollapseCuePosition?: string | ((node) => string); // default cue position is top left you can specify a function per node too\r\n /** @ignore */ expandCollapseCueSize?: number; // size of expand-collapse cue\r\n /** @ignore */ expandCollapseCueLineSize?: number; // size of lines used for drawing plus-minus icons\r\n /** @ignore */ expandCueImage?: string; // image of expand icon if undefined draw regular expand cue\r\n /** @ignore */ collapseCueImage?: string; // image of collapse icon if undefined draw regular collapse cue\r\n /** @ignore */ expandCollapseCueSensitivity?: number; // sensitivity of expand-collapse cues\r\n /** @ignore */ edgeTypeInfo?: string | Function; // the name of the field that has the edge type, retrieved from edge.data(), can be a function, if reading the field returns undefined the collapsed edge type will be \"unknown\"\r\n /** @ignore */ groupEdgesOfSameTypeOnCollapse?: boolean; // if true, the edges to be collapsed will be grouped according to their types, and the created collapsed edges will have same type as their group. if false the collapased edge will have \"unknown\" type.\r\n /** @ignore */ allowNestedEdgeCollapse?: boolean; // when you want to collapse a compound edge (edge which contains other edges) and normal edge, should it collapse without expanding the compound first\r\n /** @ignore */ zIndex?: number; // z-index value of the canvas in which cue ımages are drawn\r\n}\r\n","import { ZoomLevelBasedTemplate } from \"./ZoomLevelBasedTemplate\";\r\n\r\n/**\r\n * Classe che indica per una data query quali template applicare\r\n */\r\nexport class NodeHTMLTemplate {\r\n\r\n /**\r\n * Query Cytoscape. Esempio **\"[type = 'node']\"** per prendere tutti i nodi la cui proprietà **type** all'interno dell'oggetto **data** è uguale a **node**\r\n */\r\n query: string;\r\n\r\n /**\r\n * Lista dei template da applicare in base al livello di zoom del diagramma\r\n */\r\n template: ZoomLevelBasedTemplate[];\r\n}\r\n","/**\r\n * Classe che rappresenta un template HTML applicabile ad un nodo\r\n */\r\nexport class NodeTemplate {\r\n\r\n /**\r\n * Template del nodo. È possibile prendere direttamente i valori del nodo utilizzando la convenzione **#{data.nodeproperty}**\r\n */\r\n html: string;\r\n\r\n /**\r\n * Classe da applicare al template\r\n */\r\n cssClass?: string;\r\n}\r\n","import { NodeTemplate } from \"./NodeTemplate\";\r\n\r\n/**\r\n * Classe che rappresenta il template HTML di un nodo da utilizzare per un certo livello di zoom\r\n */\r\nexport class ZoomLevelBasedTemplate {\r\n\r\n /**\r\n * Livello di zoom da minimo a massimo per cui viene utilizzato questo template\r\n */\r\n zoomRange: [number, number];\r\n\r\n /**\r\n * Template da utilizzare\r\n */\r\n template: NodeTemplate;\r\n}\r\n","/**\r\n * Opzioni di layout di base che si collegano al **ready** e allo **stop** eventualmente per aggiungere del log addizionale\r\n */\r\nexport class BaseLayoutOptionsImpl {\r\n\r\n /**\r\n * Per ora ignoro lato documentale dato che sono placholder\r\n * @ignore\r\n */\r\n ready(e: cytoscape.LayoutEventObject) {\r\n\r\n }\r\n\r\n /**\r\n * Per ora ignoro lato documentale dato che sono placholder\r\n * @ignore\r\n */\r\n stop(e: cytoscape.LayoutEventObject) {\r\n\r\n }\r\n}","import { AnimatedLayoutOptions } from 'cytoscape';\r\nimport { BaseLayoutOptionsImpl } from './BaseLayoutOptionsImpl';\r\n\r\n/**\r\n * Classe base con le opzioni di layout valide per tutti i layout animati\r\n */\r\nexport class AnimateLayoutOptionsImpl extends BaseLayoutOptionsImpl implements AnimatedLayoutOptions {\r\n\r\n /** @ignore */\r\n constructor() { super(); }\r\n\r\n /**\r\n * Livello di zoom da impostare (si consiglia fit = **false** se viene impostato)\r\n */\r\n zoom: number = null;\r\n\r\n /**\r\n * Livello di pan da impostare (si consiglia fit = **false** se viene impostato)\r\n */\r\n pan: number = null;\r\n\r\n /**\r\n * Indica se animare il cambio di posizione dei nodi\r\n */\r\n animate = false;\r\n\r\n /**\r\n * Con **animate** a true indica la durata dell'animazione\r\n */\r\n animationDuration = 500;\r\n\r\n /**\r\n * Abilita o no l'easing dell'animazione, può essere una stringa come ad esempio \"ease-in-out-cubic\" o altre funzioni scritte allo stesso modo prese da https://easings.net/\r\n */\r\n animationEasing = undefined;\r\n\r\n /**\r\n * Funzione che indica se un nodo dev'essere animato o no. \r\n * Tutti i nodi sono animati di default.\r\n * Tutti i nodi che non vengono animati verranno posizionati appena inizia l'animazione\r\n * \r\n * @param {any} node Nodo per cui decidere se abilitare l'animazione o no\r\n * @param {number} i Indice del nodo corrente\r\n * \r\n * @returns {boolean} **true** se il nodo dev'essere animato, **false** altrimenti\r\n */\r\n animateFilter = (node, i: number) => true;\r\n}","import { BoundingBox12, BoundingBoxWH, SortingFunction } from 'cytoscape';\r\nimport { AnimateLayoutOptionsImpl } from './AnimateLayoutOptionsImpl';\r\n\r\n/**\r\n * Classe base per gli algoritmi \"Shaped\"\r\n */\r\nexport class ShapedLayoutOptionsImpl extends AnimateLayoutOptionsImpl {\r\n\r\n /** @ignore */\r\n constructor() { super(); }\r\n\r\n /**\r\n * Indica se adattare al contenitore\r\n */\r\n fit = true;\r\n\r\n /**\r\n * Padding rispetto al contenitore\r\n */\r\n padding = 30;\r\n\r\n /**\r\n * Specifica le dimensioni esatte al cui interno effettuare il layouting, specificato come **{ x1, y1, x2, y2 }** o **{ x1, y1, w, h }**\r\n */\r\n boundingBox?: BoundingBox12 | BoundingBoxWH | undefined = null;\r\n\r\n /**\r\n * Fa in modo che i nodi non si accavallino, ma se il contenitore non ha abbastanza spazio potrebbero andare in overflow\r\n */\r\n avoidOverlap = true;\r\n\r\n /**\r\n * Include o esclude le dimensioni delle label dei nodi nel calcolo delle posizioni\r\n */\r\n nodeDimensionsIncludeLabels = false;\r\n\r\n /**\r\n * Moltiplicatore delle dimensioni per espandere/restringere le dimensioni globali del diagramma\r\n */\r\n spacingFactor = 1;\r\n\r\n /**\r\n * Funzione di ordinamento per ordinare i nodi\r\n */\r\n sort?: SortingFunction = null;\r\n\r\n /**\r\n * Funzione per la trasformazione delle posizioni dei nodi\r\n * \r\n * @param {any} node Nodo\r\n * @param {any} position Posizione iniziale\r\n * \r\n * @returns {any} Posizione finale\r\n */\r\n transform = (node, position) => position;\r\n}\r\n","import { ShapedLayoutOptionsImpl } from './base/ShapedLayoutOptionsImpl';\r\n\r\n/**\r\n * Default per l'implementazione dell'algoritmo Breadth First\r\n */\r\nexport class BreadthFirstLayoutOptionsImpl extends ShapedLayoutOptionsImpl {\r\n\r\n /** @ignore */\r\n constructor() { super(); }\r\n\r\n /**\r\n * Nome dell'algoritmo di layouting\r\n */\r\n name = 'breadthfirst';\r\n\r\n /**\r\n * Indica se l'albero è diretto in basso. Se false i collegamenti fra i nodi possono andare in qualsiasi direzione\r\n */\r\n directed = false;\r\n\r\n /**\r\n * Se **true** i livelli vengono ordinati in cerchi concentrici, se **false** vengono oridnati dall'alto al basso \r\n */\r\n circle = false;\r\n\r\n /**\r\n * Radici degli alberi\r\n */\r\n roots?: string;\r\n\r\n /**\r\n * Numero massimo di tentativi di posizionamento dei nodi in maniera massimale (senza backtracking)\r\n */\r\n maximalAdjustments: number;\r\n\r\n /**\r\n * Indica che i nodi verranno shiftati in base al proprio livello in modo da evitare collegamenti inversi (solo per i DAG)\r\n */\r\n maximal = false;\r\n\r\n /**\r\n * Indica se creare una griglia in cui ordinare i nodi del DAG (Solo quando la proprietà **circle** è a **false**)\r\n */\r\n grid = false;\r\n\r\n /**\r\n * Indica se escludere le label dei nodi quando vengono calcolati i limiti del layout\r\n */\r\n nodeDimensionsIncludeLabels = false;\r\n}\r\n","import { ShapedLayoutOptionsImpl } from './base/ShapedLayoutOptionsImpl';\r\n\r\n/**\r\n * Default per l'implementazione dell'algoritmo Circle\r\n */\r\nexport class CircleLayoutOptionsImpl extends ShapedLayoutOptionsImpl {\r\n\r\n /** @ignore */\r\n constructor() { super(); }\r\n\r\n /**\r\n * Nome dell'algoritmo di layouting\r\n */\r\n name = 'circle';\r\n\r\n /**\r\n * Raggio del cercho\r\n */\r\n radius: number;\r\n\r\n /**\r\n * Angolo da cui i nodi partono, in radianti (Default: **3 / 2 * Math.PI**)\r\n */\r\n startAngle = 3 / 2 * Math.PI;\r\n\r\n /**\r\n * Numero di radianti fra il primo e l'ultimo nodo. Di default viene utilizzata l'intera circonferenza\r\n */\r\n sweep: number = null;\r\n\r\n /**\r\n * Indica se andare in senso orario (**true**) o antiorario (**false**)\r\n */\r\n clockwise = true; // whether the layout should go clockwise (true) or counterclockwise/anticlockwise (false)\r\n}\r\n","import { BoundingBox12, BoundingBoxWH } from \"cytoscape\";\r\n\r\n/**\r\n * Default per l'implementazione dell'algoritmo Concentric\r\n */\r\nexport class ConcentricLayoutOptionsImpl {\r\n\r\n /**\r\n * Nome dell'algoritmo di layouting\r\n */\r\n name: string = 'concentric';\r\n\r\n /**\r\n * Numero di radianti fra il primo e l'ultimo nodo. Di default viene utilizzata l'intera circonferenza\r\n */\r\n sweep?: number;\r\n\r\n /**\r\n * Indica se andare in senso orario (**true**) o antiorario (**false**)\r\n */\r\n clockwise?: boolean;\r\n\r\n /**\r\n * Angolo da cui i nodi partono, in radianti (Default: **3 / 2 * Math.PI**)\r\n */\r\n startAngle = 3 / 2 * Math.PI;\r\n\r\n /**\r\n * Indica se adattare al contenitore\r\n */\r\n fit: boolean;\r\n\r\n /**\r\n * Include o esclude le dimensioni delle label dei nodi nel calcolo delle posizioni\r\n */\r\n nodeDimensionsIncludeLabels = true;\r\n\r\n /**\r\n * Indica se i livelli devono essere o non essere equidistanti, potrebbe causare overflow dal contenitore\r\n */\r\n equidistant = false;\r\n\r\n /**\r\n * Distanza minima dall'esterno dei nodi, utilizzato per aggiustare il raggio\r\n */\r\n minNodeSpacingnumber = 10;\r\n\r\n /**\r\n * Specifica le dimensioni esatte al cui interno effettuare il layouting, specificato come **{ x1, y1, x2, y2 }** o **{ x1, y1, w, h }**\r\n */\r\n boundingBox: BoundingBox12 | BoundingBoxWH | undefined = null;\r\n\r\n /**\r\n * Altezza dell'area di layout (sovrascrive quella del contenitore)\r\n */\r\n height: number = null;\r\n\r\n /**\r\n * Larghezza dell'area di layout (sovrascrive quella del contenitore)\r\n */\r\n width: number = null;\r\n\r\n /**\r\n * Moltiplicatore delle dimensioni per espandere/restringere le dimensioni globali del diagramma\r\n */\r\n spacingFactor = 1;\r\n\r\n /**\r\n * Funzione di cui si può fare override per assegnare un valore ad ogni nodo. I nodi con valore più alto saranno piazzati verso il centro\r\n * \r\n * @param {any} node Nodo\r\n * \r\n * @returns {number} Valore su cui ordinare i nodi verso il centro\r\n */\r\n concentric(node: { degree(): number; }): number {\r\n return node.degree();\r\n }\r\n\r\n /**\r\n * Funzione di cui si può fare override per calcolare la variazione dei valori concentrici per ogni livello\r\n * \r\n * @param {any} nodes Gruppo di nodi del livello\r\n * \r\n * @returns {number} Variazione dei valori concentrici\r\n */\r\n levelWidth(nodes: { maxDegree(): number; }): number {\r\n return nodes.maxDegree() / 4;\r\n }\r\n}\r\n","import { ShapedLayoutOptionsImpl } from './base/ShapedLayoutOptionsImpl';\r\n\r\n/**\r\n * Default per l'implementazione dell'algoritmo Cose\r\n */\r\nexport class CoseLayoutOptionsImpl extends ShapedLayoutOptionsImpl {\r\n\r\n /** @ignore */\r\n constructor() { super(); }\r\n\r\n /**\r\n * Nome dell'algoritmo di layouting\r\n */\r\n name = 'cose';\r\n\r\n /**\r\n * Se **animate** è **true**, l'animazione parte solo dopo questo numero di millisecondi (Evita flickering su animazioni veloci)\r\n */\r\n animationThreshold = 250;\r\n\r\n /**\r\n * Numero di iterazioni fra aggiornamenti consecutivi della posizione a schermo\r\n */\r\n refresh = 20;\r\n\r\n /**\r\n * Se **true** la posizione iniziale dei nodi è casuale, se **false** utilizza la posizione originale\r\n */\r\n randomize = false;\r\n\r\n /**\r\n * Spazio extra fra i componenti di un grafo non-compound\r\n */\r\n componentSpacing = 40;\r\n\r\n /**\r\n * Moltiplicatore della repulsione fra nodi in caso di overlap\r\n */\r\n nodeOverlap = 4;\r\n\r\n /**\r\n * Moltiplicatore di nesting per il calcolo della lunghezza ideale dei collegamenti nested\r\n */\r\n nestingFactor = 1.2;\r\n\r\n /**\r\n * Costante di gravità\r\n */\r\n gravity = 1;\r\n\r\n /**\r\n * Numero massimo di iterazioni da eseguire\r\n */\r\n numIter = 1000;\r\n\r\n /**\r\n * Temperatura iniziale (massima distanza fra i nodi)\r\n */\r\n initialTemp = 1000;\r\n\r\n /**\r\n * Fattore di raffreddamento. Ad ogni iterazione verrà sottratto ad **initialTemp**\r\n */\r\n coolingFactor = 0.99;\r\n\r\n /**\r\n * Soglia minima di temperatura. Una volta raggiunta il layout si considera terminato\r\n */\r\n minTemp = 1.0;\r\n\r\n /**\r\n * Moltiplicatore della repulsione fra nodi in caso di assenza di overlap. Funzione overrideabile per ogni node\r\n * \r\n * @param {any} node Nodo\r\n * \r\n * @returns {number} Moltiplicazione di repulsione\r\n */\r\n nodeRepulsion = (node) => 2048;\r\n\r\n /**\r\n * Lunghezza ideale dei collegamenti non nested. Funzione overrideabile per ogni collegamento\r\n * \r\n * @param {any} edge Collegamento\r\n * \r\n * @returns {number} Lunghezza ideale\r\n */\r\n idealEdgeLength = (edge) => 32;\r\n\r\n /**\r\n * Divisore per calcolare le forze applicate ad un collegamento. Funzione overrideabile per ogni collegamento\r\n * \r\n * @param {any} edge Collegamento\r\n * \r\n * @returns {number} Indice di elasticità\r\n */\r\n edgeElasticity = (edge) => 32;\r\n}\r\n","import { ShapedLayoutOptionsImpl } from './base/ShapedLayoutOptionsImpl';\r\n\r\n/**\r\n * Default per l'implementazione dell'algoritmo Dagre\r\n */\r\nexport class DagreLayoutOptionsImpl extends ShapedLayoutOptionsImpl {\r\n\r\n /** @ignore */\r\n constructor() { super(); }\r\n\r\n /**\r\n * Nome dell'algoritmo di layouting\r\n */\r\n name = 'dagre';\r\n\r\n /**\r\n * Distanza fra nodi adiacenti dello stesso rango\r\n */\r\n nodeSep: number = null;\r\n\r\n /**\r\n * Distanza fra collegamenti adiacenti nello stesso rango\r\n */\r\n edgeSep: number = null;\r\n\r\n /**\r\n * Distanza fra ogni rango\r\n */\r\n rankSep: number = null;\r\n\r\n // TB for top to bottom flow, 'LR' for left to right\r\n /**\r\n * Direzione di disegno: LR = Sinistra a Destra, TB = Sopra a Sotto\r\n */\r\n rankDir: 'LR' | 'TB' = 'TB';\r\n\r\n /**\r\n * Algoritmo che si occupa di assegnare un rango ad ogni nodo\r\n */\r\n ranker: 'network-simplex' | 'tight-tree' | 'longest-path' = null;\r\n\r\n /**\r\n * Numero di ranghi fra la sorgente e la destinazione di un collegamento\r\n * \r\n * @param {any} edge Collegamento di cui calcolare la differenza di rango\r\n * \r\n * @returns {number} Differenza di rango\r\n */\r\n minLen = (edge) => 1;\r\n\r\n /**\r\n * Peso del collegamento, più è alto più generalmente risulterà corto\r\n * \r\n * @param {any} edge Collegamento di cui calcolare il peso\r\n * \r\n * @returns {number} Peso\r\n */\r\n edgeWeight = (edge) => 1;\r\n}\r\n","import { NodeSingular } from 'cytoscape';\r\nimport { ShapedLayoutOptionsImpl } from './base/ShapedLayoutOptionsImpl';\r\n\r\n/**\r\n * Default per l'implementazione dell'algoritmo Grid\r\n */\r\nexport class GridLayoutOptionsImpl extends ShapedLayoutOptionsImpl {\r\n\r\n /** @ignore */\r\n constructor() { super(); }\r\n\r\n /**\r\n * Nome dell'algoritmo di layouting\r\n */\r\n name = 'grid';\r\n\r\n /**\r\n * Spazio extra attorno ai nodi quando **avoidOverlap** è **true**\r\n */\r\n avoidOverlapPadding = 10;\r\n\r\n /**\r\n * Se **true** cerca di utilizzare il minor spazio possibile, se **false** usa tutto lo spazio che ha a disposizione\r\n */\r\n condense = false;\r\n\r\n /**\r\n * Forzatura del numero di righe della griglia\r\n */\r\n rows?: number | undefined = null;\r\n\r\n /**\r\n * Forzatura del numero di colonne della griglia\r\n */\r\n cols?: number | undefined = null;\r\n\r\n /**\r\n * Dato un nodo restituisce un indice di riga e di colonna della griglia in cui metterlo\r\n * \r\n * @param {NodeSingular} node Nodo\r\n * @returns {{ row: number, col: number }} Oggetto che identifica una posizione della griglia\r\n */\r\n position: (node: NodeSingular) => { row: number; col: number; } = null;\r\n}\r\n","import { BaseLayoutOptionsImpl } from './base/BaseLayoutOptionsImpl';\r\n\r\n/**\r\n * Pseudo implementazione di un algoritmo vuoto che non fa nulla\r\n */\r\nexport class NullLayoutOptionsImpl extends BaseLayoutOptionsImpl {\r\n\r\n /** @ignore */\r\n constructor() { super(); }\r\n\r\n /**\r\n * Nome dell'algoritmo di layouting\r\n */\r\n name = 'null';\r\n}","import { AnimateLayoutOptionsImpl } from './base/AnimateLayoutOptionsImpl';\r\n\r\n/**\r\n * Default per l'implementazione dell'algoritmo Preset (Posiziona i nodi in base alla loro proprietà **position**)\r\n */\r\nexport class PresetLayoutOptionsImpl extends AnimateLayoutOptionsImpl {\r\n\r\n /** @ignore */\r\n constructor() { super(); }\r\n\r\n /**\r\n * Nome dell'algoritmo di layouting\r\n */\r\n name = 'preset';\r\n\r\n /**\r\n * Indica se adattare al contenitore\r\n */\r\n fit?: boolean;\r\n\r\n /**\r\n * Padding rispetto al contenitore\r\n */\r\n padding?: number;\r\n\r\n /**\r\n * Mappatura da un nodo ad una posizione\r\n * \r\n * @param {any} node Nodo\r\n * \r\n * @returns {any} Posizione iniziale\r\n */\r\n positions: (node) => any;\r\n\r\n /**\r\n * Funzione per la trasformazione delle posizioni dei nodi\r\n * \r\n * @param {any} node Nodo\r\n * @param {any} position Posizione iniziale\r\n * \r\n * @returns {any} Posizione finale\r\n */\r\n transform = (node, position) => position;\r\n}\r\n","import { AnimateLayoutOptionsImpl } from './base/AnimateLayoutOptionsImpl';\r\n\r\n/**\r\n * Default per l'implementazione dell'algoritmo Random\r\n */\r\nexport class RandomLayoutOptionsImpl extends AnimateLayoutOptionsImpl {\r\n\r\n /** @ignore */\r\n constructor() { super(); }\r\n\r\n /**\r\n * Nome dell'algoritmo di layouting\r\n */\r\n name = 'random';\r\n\r\n /**\r\n * Indica se adattare al contenitore\r\n */\r\n fit = true;\r\n\r\n /**\r\n * Padding rispetto al contenitore\r\n */\r\n padding = 20;\r\n\r\n /**\r\n * Specifica le dimensioni esatte al cui interno effettuare il layouting, specificato come **{ x1, y1, x2, y2 }** o **{ x1, y1, w, h }**\r\n */\r\n boundingBox: cytoscape.BoundingBox12 | cytoscape.BoundingBoxWH | undefined = null;\r\n\r\n /**\r\n * Funzione per la trasformazione delle posizioni dei nodi\r\n * \r\n * @param {any} node Nodo\r\n * @param {any} position Posizione iniziale\r\n * \r\n * @returns {any} Posizione finale\r\n */\r\n transform = (node, position) => position;\r\n}\r\n","/**\r\n * Classe di configurazione per il Modulo\r\n */\r\nexport class EsDiagramModuleConfig{\r\n\r\n /**\r\n * Attiva o disattiva la modalità di debug per scrivere i messaggi a console\r\n */\r\n debugMode?: boolean;\r\n}","// Grabbata felicemente da amcharts, rimuovendo helper interni, cose strane e instupidendola un po':\r\n// https://github.com/amcharts/amcharts4/blob/7fbb61e90363a2373e6130800dee06b8a62f3aab/src/.internal/core/utils/ResizeSensor.ts\r\n\r\n/**\r\n * Oggetto nativo **ResizeObserver**\r\n */\r\ndeclare const ResizeObserver: any;\r\n\r\n/**\r\n * Classe di utilità che tiene d'occhio i cambiamenti di dimensione di un elemento. Un **ResizeSensor** può controllare al massimo un elemento\r\n */\r\nexport class ResizeSensor {\r\n\r\n /**\r\n * Riferimento all'observer nativo\r\n */\r\n private observer: any = null;\r\n\r\n /**\r\n * Indica se questo oggetto è stato distrutto o no\r\n */\r\n public Disposed: boolean = false;\r\n\r\n /**\r\n * Elemento da controllare e callback da chiamare quando le dimensioni dell'elemento cambiano\r\n */\r\n private target: { targetEl: Element, callback: () => void } = null;\r\n\r\n /**\r\n * Costruttore\r\n * \r\n * @param {HTMLElement} element Elemento HTML da controllare\r\n * @param {Function} callback Callback da chiamare quando le dimensioni di **element** cambiano\r\n */\r\n constructor(element: HTMLElement, callback: () => void) {\r\n this.makeSensor();\r\n this.addTarget(element, callback);\r\n }\r\n\r\n /**\r\n * Distruttore\r\n */\r\n public dispose() {\r\n if (!this.Disposed) {\r\n this.Disposed = true;\r\n this.removeTarget();\r\n }\r\n }\r\n\r\n /**\r\n * Creazione del sensore che sarà collegato all'elemento da osservare dal metodo **addTarget**\r\n */\r\n private makeSensor() {\r\n if (typeof ResizeObserver == \"undefined\")\r\n throw \"Resize Observer non è definito. Si prega di utilizzare un browser vero\";\r\n\r\n this.observer = new ResizeObserver((entries: Array<any>) => {\r\n for (let i = 0; i < entries.length; ++i) {\r\n if (this.target && this.target.targetEl === entries[i].target)\r\n this.target.callback();\r\n }\r\n });\r\n }\r\n\r\n /**\r\n * Dice al sensore di osservare l'elemento **targetEl**, richiamando **callback** qualora le dimensioni cambino\r\n * \r\n * @param {HTMLElement} targetEl Elemento HTML da controllare\r\n * @param {Function} callback Callback da chiamare quando le dimensioni di **element** cambiano\r\n */\r\n public addTarget(targetEl: HTMLElement, callback: () => void) {\r\n this.observer.observe(targetEl, { box: \"content-box\" });\r\n this.target = { targetEl, callback };\r\n }\r\n\r\n /**\r\n * Rimuove l'elemento HTML attuale dall'osservazione del **ResizeObserver**\r\n */\r\n public removeTarget() {\r\n if (!this.target)\r\n return;\r\n\r\n this.observer.unobserve(this.target.targetEl);\r\n this.target = null;\r\n }\r\n}","import { InjectionToken } from \"@angular/core\";\r\n\r\n /**\r\n * Token che indica se attivare la modalità di debug (messaggi a console)\r\n */\r\n export const DIA_DEBUG_MODE: InjectionToken<boolean> = new InjectionToken<boolean>('DIA_DEBUG_MODE');","import { Inject, Injectable, Optional } from \"@angular/core\";\r\n\r\nimport { DIA_DEBUG_MODE } from \"../tokens\";\r\n\r\n// Questo modulo esporta sia un namespace che si chiama \"cytoscape\" sia la funzione \"cytoscape\" (costruttore)\r\n// Con questi 2 salti si riescono a non avere problemi di typings: https://github.com/jvandemo/generator-angular2-library/issues/221#issuecomment-355945207\r\nimport * as cy_ from 'cytoscape';\r\n/** @ignore */ const cytoscape = cy_;\r\n\r\n/**\r\n * Loader dei moduli di Cytoscape. Utilizza una cache per tenerseli in memoria a livello di applicazione \r\n * in modo da non dover ricaricare nulla dopo avere usato un modulo almeno una volta\r\n */\r\n@Injectable()\r\nexport class EsDiagramService {\r\n\r\n /**\r\n * Cache dei moduli caricati\r\n */\r\n private modulesCache: { [index: string]: cytoscape.Ext } = {};\r\n\r\n /**\r\n * Costruttore\r\n * \r\n * @ignore\r\n */\r\n constructor(@Optional() @Inject(DIA_DEBUG_MODE) private DIA_DEBUG_MODE: string) { }\r\n\r\n /**\r\n * Permette di importare, se serve un dato tema o localizzazione\r\n * \r\n * @param {'cytoscape-expand-collapse' | 'cytoscape-cxtmenu' | 'cytoscape-html-node' | 'cytoscape-dagre'} moduleId Nome del modulo di Cytoscape da importare (dev'essere il nome della cartella in node_modules)\r\n * \r\n * @returns {Promise<void | cytoscape.Ext>} Funzione di estensione per Cytoscape presa dal modulo richiesto\r\n */\r\n public async importIfNeeded(moduleId: 'cytoscape-expand-collapse' | 'cytoscape-cxtmenu' | 'cytoscape-html-node' | 'cytoscape-dagre'): Promise<void | cytoscape.Ext> {\r\n\r\n // Ognuno esporta il modulo un po' come cazzo gli pare quindi ocio. \r\n // Notare che tutti i \"moudle\" dopo lo then sono castati ad <any> e che l'oggetto recuperato ogni tanto è \"default\", altre volte è il \"register\", altre è l'\"ext\", eccetera...\r\n if (!this.modulesCache[moduleId]) {\r\n this.log(\"I\", this.loc(\"Module not available. Loading it now\") + \": \" + moduleId, false);\r\n switch (moduleId) {\r\n case \"cytoscape-cxtmenu\": return import(\"cytoscape-cxtmenu\").then((module: any) => {\r\n this.modulesCache[moduleId] = module.default\r\n }).catch(err => this.handleError(moduleId, err));\r\n case \"cytoscape-expand-collapse\": return import(\"cytoscape-expand-collapse\").then((module: any) => {\r\n this.modulesCache[moduleId] = module.default\r\n }).catch(err => this.handleError(moduleId, err));\r\n case \"cytoscape-html-node\": return import(\"@esfaenza/cytoscape-html-node\").then((module: any) => {\r\n this.modulesCache[moduleId] = module.register\r\n }).catch(err => this.handleError(moduleId, err));\r\n case \"cytoscape-dagre\":\r\n await import(\"dagre\").catch(err => this.handleError(\"dagre\", err));\r\n return import(\"cytoscape-dagre\").then((module: any) => this.modulesCache[moduleId] = module.default).catch(err => this.handleError(moduleId, err));\r\n }\r\n }\r\n else {\r\n // I moduli non devono mai essere ricaricati nel globale, quindi invece che restituire la copia della cache restituisco vuoto\r\n this.log(\"I\", this.loc(\"Module already loaded\") + \": \" + moduleId, false);\r\n return new Promise((resolve) => { resolve(null) });\r\n }\r\n }\r\n\r\n /**\r\n * Gestione degli errori di caricamento dei moduli qualora qualcuno utilizzasse un modulo non installato\r\n * \r\n * @param {string} moduleId Nome del modulo che si è cercato di caricare\r\n * @param {any} err Errore restituito dalla promise di caricamento\r\n */\r\n private handleError(moduleId: string, err: any) {\r\n this.log(\"E\", this.loc(\"Module cannot be loaded\") + \": \" + moduleId + \" - \" + err, false);\r\n }\r\n\r\n /**\r\n * Scrittore di log a console. Attivo solo quando la libreria è in modalità di Debug\r\n * \r\n * @param {'E' | 'I' | 'W'} severity Tipo di messaggio (Errore, Info, Warning)\r\n * @param {string} text Testo da tradurre\r\n * @param {boolean} requiresTranslation Indica se **text** è una frase già tradotta o se è da tradurre\r\n */\r\n public log(severity: 'E' | 'I' | 'W', text: string, requiresTranslation: boolean = true) {\r\n\r\n if (!this.DIA_DEBUG_MODE)\r\n return;\r\n\r\n var message = \"@esfaenza/diagrams: \" + (requiresTranslation ? this.loc(text) : text);\r\n switch (severity) {\r\n case 'E': console.error(message);\r\n break;\r\n case 'I': console.info(message);\r\n break;\r\n case 'W': console.warn(message);\r\n break;\r\n }\r\n }\r\n\r\n /**\r\n * Metodo di localizzazione dei messaggi\r\n * \r\n * @param {string} text Messaggio da tradurre\r\n * \r\n * @returns {string} Messaggio tradotto\r\n */\r\n public loc(text: string): string {\r\n //return Loc[text][this.DIA_LOCALE];\r\n return text;\r\n }\r\n}","import { Injectable, Inject } from '@angular/core';\r\n\r\nimport { DIA_DEBUG_MODE } from '../tokens';\r\n\r\n/**\r\n * Classe che si occupa del dispatch delle operazioni di rendering degli oggetti utilizzando una coda \r\n */\r\n@Injectable()\r\nexport class EsDiagramDispatcher {\r\n\r\n /**\r\n * Coda di inizializzazioni ancora da eseguire. Quando questa è vuota significa che nessuno sta creando oggetti\r\n */\r\n private Initializations: { name: string, function: any }[] = [];\r\n\r\n /**\r\n * Lista degli oggetti inizializzati e attivi in un dato momento (viene registrata la proprietà **name**). Non è possibile registrare due grafici con lo stesso identificativo\r\n */\r\n private Initialized: string[] = [];\r\n\r\n /**\r\n * @ignore\r\n */\r\n constructor(@Inject(DIA_DEBUG_MODE) private logs: boolean) { }\r\n\r\n /**\r\n * Registra un oggetto da visualizzare insieme alla propria funzione di creazione. Quest'ultima sarà differita fino a che tutti gli oggetti\r\n * precedentemente registati non hanno finito la fase di inizializzazione\r\n * \r\n * @param {string} name Identificativo dell'oggetto da registrare\r\n * @param {Function} creationFunction Funzione che fisicamente dovrà occuparsi della creazione dell'oggetto\r\n */\r\n public register(name: string, creationFunction: Function) {\r\n if (this.Initialized.indexOf(name) != -1)\r\n throw \"Attempting to register a duplicate object '\" + name + \"'. Make sure the 'name' properties of your diagram are univoque\";\r\n\r\n this.log(\"DISPATCHER: Registering diagram creation function execution for \" + name);\r\n this.Initializations.push({ name: name, function: creationFunction });\r\n if (this.Initializations.length == 1) {\r\n this.log(\"DISPATCHER: Initial drain started\");\r\n this.drainInitQueues();\r\n }\r\n }\r\n\r\n /**\r\n * Deregistra un oggetto presente. Chiamata generalmente al dispose dell'oggetto in questione quando non dev'essere più mostrato nella pagina corrente\r\n * \r\n * @param {string} name Identificativo dell'oggetto da deregistrare\r\n */\r\n public deregister(name: string) {\r\n let index = this.Initialized.indexOf(name);\r\n if (index == -1)\r\n {\r\n //Questo succede quando si cerca di distruggere l'oggetto mentre sta venendo graficato\r\n this.log(\"DISPATCHER: Registration missing for object \" + name + \" it was probably destroyed during load\");\r\n return;\r\n }\r\n\r\n this.log(\"DISPATCHER: Object deregistered \" + name);\r\n this.Initialized.splice(index, 1)\r\n }\r\n\r\n /**\r\n * Metodo che esegue in maniera sequenziale le funzioni di inizializzazione degli oggetti finché presenti \r\n * in modo che nessun oggetto possa essere inizializzato contemporaneamente ad un altro\r\n */\r\n private drainInitQueues() {\r\n let toExecute = this.Initializations[0];\r\n this.log(\"DISPATCHER: Executing initialization function for object \" + toExecute.name);\r\n\r\n toExecute.function().then(() => {\r\n this.log(\"DISPATCHER: initialization for object \" + toExecute.name + \" is done\");\r\n this.Initialized.push(toExecute.name);\r\n this.Initializations.splice(0, 1);\r\n if (this.Initializations.length >= 1) {\r\n this.log(\"DISPATCHER: Found queued initializations. Continuing\");\r\n this.drainInitQueues();\r\n }\r\n else\r\n this.log(\"DISPATCHER: queue is over, nothing more to do\");\r\n });\r\n }\r\n\r\n /**\r\n * @ignore\r\n */\r\n private log(text: string) {\r\n if (this.logs)\r\n console.log(\"@esfaenza/es-diagrams: \" + text);\r\n }\r\n}","import { Injectable } from \"@angular/core\";\r\n\r\n/**\r\n * Classe che fornisce metodi reattivi di estensione. Per ora implementato solo uno pseudo-throttle\r\n */\r\n@Injectable({ providedIn: \"root\" })\r\nexport class ReactiveExtensions {\r\n\r\n /**\r\n * Cache di tutti i timer in esecuzione\r\n */\r\n private executionTimers: { [index: string]: any } = {};\r\n\r\n /**\r\n * Esecuzione deleyata di una funzione. Se viene richiamata nuovamente prima di venire eseguita dopo il delay, il delay viene resettato\r\n * \r\n * @param {string} id Id per aiutare il servizio a distinguere funzioni con nome uguale chiamate da componenti diversi\r\n * @param {Function} func Funzione da chiamare al termine del throttle\r\n * @param {number} throttleTime Tempo di throttling in millisecondi\r\n */\r\n public throttle(id: string, func: Function, throttleTime: number = 0) {\r\n let key = func.name + \"_\" + id;\r\n\r\n //Se ho la funzione che vuole eseguire ripulisco quel timeout\r\n if (this.executionTimers[key])\r\n clearTimeout(this.executionTimers[key]);\r\n\r\n //Ricreo il timeout per eseguire quella funzione dopo throttleTime millisecondi\r\n var executionTimer = setTimeout(() => { func(); this.executionTimers[key] = null; }, throttleTime);\r\n this.executionTimers[key] = executionTimer;\r\n }\r\n}","import { Component, ElementRef, EventEmitter, Input, OnChanges, Optional, Output, SimpleChanges, ViewChild } from '@angular/core'\r\n\r\nimport { ContextMenuOptions } from '../models/component/contextmenu/ContextMenuOptions';\r\nimport { ExpandCollapseOptions } from '../models/component/grouping/ExpandCollapseOptions';\r\nimport { NodeHTMLTemplate } from '../models/component/nodes/NodeHTMLTemplate';\r\n\r\nimport { BreadthFirstLayoutOptionsImpl } from '../models/layouts/BreadthFirstLayoutOptionsImpl';\r\nimport { CircleLayoutOptionsImpl } from '../models/layouts/CircleLayoutOptionsImpl';\r\nimport { ConcentricLayoutOptionsImpl } from '../models/layouts/ConcentricLayoutOptionsImpl';\r\nimport { CoseLayoutOptionsImpl } from '../models/layouts/CoseLayoutOptionsImpl';\r\nimport { DagreLayoutOptionsImpl } from '../models/layouts/DagreLayoutOptionsImpl';\r\nimport { GridLayoutOptionsImpl } from '../models/layouts/GridLayoutOptionsImpl';\r\nimport { NullLayoutOptionsImpl } from '../models/layouts/NullLayoutOptionsImpl';\r\nimport { PresetLayoutOptionsImpl } from '../models/layouts/PresetLayoutOptionsImpl';\r\nimport { RandomLayoutOptionsImpl } from '../models/layouts/RandomLayoutOptionsImpl';\r\n\r\nimport { EsDiagramService } from '../services/es-diagram.service';\r\nimport { EsDiagramDispatcher } from '../services/es-diagram.dispatcher';\r\nimport { ResizeSensor } from \"../extensions/ResizeSensor\";\r\n\r\nimport { ReactiveExtensions } from '../extensions/ReactiveExtensions';\r\n\r\nimport * as cy_ from 'cytoscape';\r\n/** @ignore */const cytoscape = (<any>cy_).default? (<any>cy_).default: cy_;\r\n\r\n/**\r\n * Componente che si occupa di graficare un diagramma e di gestirne il ciclo di vita\r\n */\r\n@Component({\r\n selector: 'es-diagram',\r\n templateUrl: './es-diagram.component.html',\r\n styleUrls: ['./es-diagram.component.scss'],\r\n standalone: false\r\n})\r\nexport class EsDiagramComponent implements OnChanges {\r\n\r\n /**\r\n * Riferimento all'oggetto HTML su cui creare il diagramma\r\n */\r\n @ViewChild('graph') cyGraph: ElementRef;\r\n\r\n /**\r\n * Nome del diagramma, fondamentale assegnarlo per permettere alla libreria di schedularne la creazione\r\n */\r\n @Input() name: string = \"\";\r\n\r\n /**\r\n * Indica se utilizzare il menù contestuale a ruota attorno ad ogni nodo\r\n */\r\n @Input() UseContextMenu: boolean = false;\r\n\r\n /**\r\n * Indica le opzioni del menù contestuale qualora **UseContextMenu** fosse **true**.\r\n * \r\n * Ogni elemento di questo array è un selettore con il menu da mostrare per quella casistica\r\n */\r\n @Input() ContextMenuOptions: ContextMenuOptions[];\r\n\r\n /**\r\n * Dice al componente se il diagramma deve utilizzare il sistema di estensione per l'expand e collapse dei gruppi\r\n */\r\n @Input() UseExpandCollapse: boolean = false;\r\n\r\n /**\r\n * Opzioni native dell'estensione expand-collapse, vengono ovviamente utilizzate solo se **UseExpandCollapse** è **true**\r\n */\r\n @Input() ExpandCollapseOptions: ExpandCollapseOptions;\r\n\r\n /**\r\n * Blocco completo delle opzioni, alternativo all'assegnazione di **Elements**, **NodeStyles**, **EdgeStyles**, e **Layout**.\r\n * \r\n * Qualora entrambe venissero specificate verrà effettuata un'unione fra queste opzioni e quelle specificate, dando priorità alle specificate\r\n */\r\n @Input() NativeOptions: cytoscape.CytoscapeOptions = {};\r\n\r\n /**\r\n * Definizione degli elementi da mostrare nel diagramma\r\n */\r\n @Input() Elements: cytoscape.ElementDefinition[];\r\n\r\n /**\r\n * Definizione degli stili dei nodi\r\n */\r\n @Input() NodeStyles: cytoscape.Css.Node;\r\n\r\n /**\r\n * Definizione degli stili dei collegamenti fra i nodi\r\n */\r\n @Input() EdgeStyles: cytoscape.Css.Edge;\r\n\r\n /**\r\n * In un diagramma in sola lettura tutte le interazioni utente sono annullate\r\n */\r\n @Input() Readonly: boolean;\r\n\r\n /**\r\n * Aggiorna automaticamente le dimensioni del diagramma quando cambiano le dimensioni della finestra\r\n */\r\n @Input() AutoupdateSize: boolean = true;\r\n\r\n /**\r\n * Indica di mantenere la posizione dei nodi qualora venissero cambiati dall'Input **Elements**.\r\n * \r\n * Se l'ID di un nodo è uguale all'ID di un nodo presente in precedenza, il nuovo nodo ne erediterà la posizione\r\n */\r\n @Input() PreserveElementsPosition: boolean = true;\r\n\r\n /**\r\n * Qualora venisse modificato l'Input **Elements**, piuttosto che mettere semplicemente il nuovo Elemento in base al Layout precedente, applica anche un'animazione \r\n * \r\n * Funziona solamente se il **Layout** corrente del diagramma supporta le animazioni\r\n */\r\n @Input() AnimateLayoutChanges: boolean = true;\r\n\r\n /**\r\n * Attiva una modalità di selezione \"smart\"... o perlomeno \"smarter\" del default di Cytoscape.\r\n * \r\n * - Il click di un elemento non selezionato lo seleziona\r\n * - Il click di un elemento selezionato lo deseleziona\r\n * - Lo stato di selezione viene persistito sull'oggetto originale invece di rimanere in un internal\r\n * - All'assegnazione di oggetti selezionati, questi vengono marcati correttamente con l'overlay di selezione\r\n * \r\n * N.B: la chiamata all'evento **onNodeClick** avviene **DOPO** la gestione della selezione\r\n */\r\n @Input() SmartSelection: boolean = false;\r\n\r\n /**\r\n * Indica di selezionare un elemento per volta qualora **SmartSelection** fosse attivo\r\n */\r\n @Input() SingleSelection: boolean = false;\r\n\r\n /**\r\n * CSS per la graficazione della selezione dei nodi. Quando un nodo verrà selezionato avrà sopra di se un overlay che 'sborda' di **overlay-padding** pixel,\r\n * di colore **overlay-color** e con un opacità **overlay-opacity**\r\n * \r\n * Assegnando \"{}\" a questo input, la Smart selection viene gestita ma la gestione grafica è affidata all'utente,\r\n * ad esempio usando dei **NodeHTMLTemplates** che definiscano selettori su nodi \":selected\"\r\n * \r\n * @default {'overlay-color':'blue','overlay-opacity':0.5,'overlay-padding':7}\r\n */\r\n @Input() SmartSelectionStyles: { 'overlay-color': string, 'overlay-opacity': number, 'overlay-padding': number } = null\r\n\r\n /**\r\n * Periodo di throttle da quando viene effettuato un resize a quando ricalcolare le dimensioni del diagramma.\r\n * \r\n * Può essere tenuto a 0 (redraw istantaneo) finché non ci sono problemi di prestazioni con eventualmente tanti resize a poca distanza l'uno dall'altro.\r\n */\r\n @Input() ResizeThrottleTime: number = 0;\r\n\r\n /**\r\n * Layout di ordinamento dei nodi\r\n */\r\n @Input() Layout: BreadthFirstLayoutOptionsImpl | CircleLayoutOptionsImpl | ConcentricLayoutOptionsImpl |\r\n CoseLayoutOptionsImpl | DagreLayoutOptionsImpl | GridLayoutOptionsImpl | NullLayoutOptionsImpl | PresetLayoutOptionsImpl |\r\n RandomLayoutOptionsImpl;\r\n\r\n /**\r\n * Template HTML da applicare ai nodi per dargli stili particolari, diversi dalle shape di default\r\n */\r\n @Input() NodeHTMLTemplates: NodeHTMLTemplate[];\r\n\r\n /**\r\n * Fornisce il global della libreria (namespace **cytoscape**) e si aspetta che dopo operazioni di importazione \r\n * lasciate all'utente vengano aggiunti tutti i moduli desiderati. \r\n * \r\n * È **fondamentale** che il primo parametro (il nome del modulo) sia uguale a ciò di cui viene fatto il require in modo che la libreria\r\n * possa controllare che il modulo importato non sia già stato importato in precedenza\r\n * \r\n * ## Esempio:\r\n * \r\n * ```typescript\r\n * (global) => {\r\n * return import(\"cytoscape-extension-library\").then(module => global.use(\"cytoscape-extension-library\", module.default));\r\n * \r\n * ...\r\n * }\r\n * ```\r\n */\r\n @Input() ExtensionModulesImporter: (global: { use: (moduleName: string, module: void | cytoscape.Ext) => void }) => Promise<any> = null;\r\n\r\n /**\r\n * Fornisce l'istanza attuale di Cytoscape da cui è possibile prendere le librerie di estensione caricate in **ExtensionModulesImporter**\r\n * e configurarle in base ai comportamenti specifici\r\n * \r\n * ## Esempio:\r\n * \r\n * ```typescript\r\n * (cytoscapeCore) => {\r\n * // Fare questo lavoro per ogni estensione caricata\r\n * let extensionConfiguration = { ... };\r\n * let extensionInstance = cytoscapeCore.extensionLibrary(extensionConfiguration);\r\n * extensionInstance.doSomethingSpecificToThisExtension();\r\n * \r\n * ...\r\n * }\r\n * ```\r\n */\r\n @Input() ExtensionModulesApplyer: (cytoscapeCore: cytoscape.Core) => void = null;\r\n\r\n /**\r\n * Evento lanciato al click di un nodo, contiene l'oggetto **data** del nodo in questione\r\n */\r\n @Output() onNodeClick: EventEmitter<{ data: any }> = new EventEmitter<{ data: any }>();\r\n\r\n /**\r\n * Evento lanciato alla selezione o deselezione di un nodo, contiene l'oggetto **data** del nodo in questione e informazioni sul suo stato di selezione\r\n */\r\n @Output() onNodeSelection: EventEmitter<{ data: any, selected: boolean }> = new EventEmitter<{ data: any, selected: boolean }>();\r\n\r\n /**\r\n * Evento lanciato al termine del Layouting. Se si vuole eseguire codice dopo che il Layout è fatto e completamente graficato, questo è il punto\r\n */\r\n @Output() onLayoutDone: EventEmitter<void> = new EventEmitter<void>();\r\n\r\n /**\r\n * Evento lanciato al termine del caricamento del diagramma\r\n */\r\n @Output() onLoaded: EventEmitter<void> = new EventEmitter<void>();\r\n\r\n /**\r\n * Variabile su cui salvarsi se i nodi hanno una gerarchia a gruppi o no. Serve per poi caricare l'estensione expand-collapse qualora fosse richiesta\r\n */\r\n private NodesHierarchy: boolean;\r\n\r\n /**\r\n * Indica se il rendering del diagramma è terminato\r\n */\r\n private Rendered: boolean = false;\r\n\r\n /**\r\n * Istanza del diagramma attualmente in uso\r\n */\r\n public cy: cytoscape.Core\r\n\r\n /**\r\n * Api dell'estensione expand-collapse per permettere di effettuare operazioni dall'esterno del diagramma. Vengono valorizzate se **UseExpandCollapse** è **true**\r\n */\r\n public ExpandCollapseApi: any = null;\r\n\r\n /**\r\n * Api dell'estensione html-node per permettere di effettuare operazioni dall'esterno del diagramma. Vengono valorizzate se sono impostati dei **NodeHTMLTemplates**\r\n */\r\n private HtmlNodeApi: any = null;\r\n\r\n /**\r\n * Osservatore delle modifiche al contenitore del diagramma\r\n */\r\n private resizeObserver: ResizeSensor;\r\n\r\n /**\r\n * Riferimento all'ultimo layout utilizzato. Viene riapplicato qualora venisse cambiato l'Input **Elements**.\r\n * \r\n * Non utilizzo il makeLayouts perché altrimenti rischierei di creare un layout riferito a X elementi, ne aggiungo 1, riapplico il Layout \r\n * ma mi viene riapplicato a X elementi invece che X + 1\r\n */\r\n private LastLayout: cytoscape.LayoutOptions;\r\n\r\n /**\r\n * Costruttore\r\n * \r\n * @ignore\r\n */\r\n constructor(@Optional() private service: EsDiagramService, @Optional() private dispatcher: EsDiagramDispatcher, private exts: ReactiveExtensions) { }\r\n\r\n /**\r\n * @ignore \r\n * \r\n * Angular Pipeline\r\n */\r\n public ngAfterViewInit() {\r\n if (!this.service || !this.dispatcher)\r\n throw \"Il modulo @esfaenza/diagrams non è stato importato con il forRoot();\";\r\n\r\n this.dispatchLoadChart();\r\n }\r\n\r\n /**\r\n * All'onDestroy ripulisco la memoria dal diagramma\r\n */\r\n public ngOnDestroy() {\r\n if (this.resizeObserver) {\r\n this.resizeObserver.dispose();\r\n this.resizeObserver = null;\r\n }\r\n\r\n if (this.cy) {\r\n this.service.log(\"I\", \"Diagram\" + \" \" + this.name + \": Unloading destroyed diagram\", false);\r\n this.cy.destroy();\r\n this.dispatcher.deregister(this.name);\r\n }\r\n else\r\n this.service.log(\"I\", \"Chart \" + this.name + \": Unloading uncreated chart component. It probably was a duplicated\", false);\r\n }\r\n\r\n /**\r\n * Registra il diagramma attuale nel Dispatcher in modo che venga caricato appena possibile\r\n */\r\n private dispatchLoadChart(): void {\r\n this.dispatcher.register(this.name, () => { return this.render(); });\r\n }\r\n\r\n /**\r\n * @ignore \r\n * \r\n * Angular Pipeline: Gestione ri-graficazione del diagramma, se possibile\r\n */\r\n public ngOnChanges(changes: SimpleChanges): any {\r\n let toCheck = [\"Templates\", \"UseContextMenu\", \"ContextMenuOptions\", \"UseExpandCollapse\", \"ExpandCollapseOptions\", \"NodeStyles\", \"EdgeStyles\", \"NativeOptions\"];\r\n\r\n if (this.Rendered && toCheck.some(t => changes[t]))\r\n this.service.log(\"W\", \"Redraw based on dynamic Input change is supported only for 'Elements' and 'Layout' inputs, please destroy the component and recreate it with the new settings\");\r\n\r\n let elementChanges = changes[\"Elements\"];\r\n let layoutChanges = changes[\"Layout\"];\r\n if (elementChanges && !elementChanges.firstChange) {\r\n this.service.log(\"I\", \"Elements have been changed after diagram initialization\");\r\n\r\n // Cambiamento agli Elementi: ripulisco gli elementi vecchi, prendo i nuovi, li sistemo e li riassegno. \r\n // Se il nuovo Input Elements è roba strana mi limito a ripulire il diagramma\r\n // Se cytoscape aveva già degli elementi precedentemente ne prendo le posizioni in modo da ridisegnarli partendo dallo stesso punto (carino per le animazioni)\r\n let elements = elementChanges?.currentValue;\r\n let previous_elements = this.PreserveElementsPosition ? <any>this.cy.nodes() : null;\r\n\r\n this.cy.elements().remove();\r\n if (elements && elements.length && elements.length > 0) {\r\n this.reviewCytoscapeElements(elements, previous_elements);\r\n this.cy.add(elements);\r\n\r\n if (this.SmartSelection)\r\n this.setupElementsSelectionIfNeeded();\r\n\r\n // Se solo gli elementi cambiano, riapplico il Layout precedente\r\n if (!layoutChanges && this.LastLayout) {\r\n\r\n // Se devo animare le modifche al layout forzo il parametro relativo\r\n if (this.AnimateLayoutChanges)\r\n (<any>this.LastLayout).animate = true;\r\n\r\n this.cy.layout(this.LastLayout).run();\r\n }\r\n }\r\n }\r\n\r\n // Se il layout cambia lo applico e me lo salvo come layout precedente per il futuro\r\n if (layoutChanges && !layoutChanges.firstChange) {\r\n this.service.log(\"I\", \"Layout have been changed after diagram initialization\");\r\n this.LastLayout = JSON.parse(JSON.stringify(layoutChanges.currentValue));\r\n this.cy.layout(this.LastLayout).run()\r\n }\r\n }\r\n\r\n /**\r\n * Effettua il rendering del diagramma\r\n */\r\n private async render() {\r\n\r\n // Tiro fuori le opzioni con cui generare il diagramma\r\n let cyOptions = this.getCompletedOptions();\r\n this.NodesHierarchy = cyOptions.elements && (<cy_.ElementDefinition[]>cyOptions.elements).some(t => t.data.parent);\r\n\r\n // Carico eventuali classi di estensione che servono\r\n await this.performModulesLoading();\r\n\r\n // Genero il diagramma\r\n this.cy = cytoscape(cyOptions);\r\n\r\n // Collego gli eventi al componente\r\n this.bindCytoscapeEvents();\r\n\r\n // Utilizzo le classi di estensione caricate precedentemente per fare il resto delle mie operazioni\r\n this.performOperationsWithLoadedModules();\r\n\r\n // Imposto la variabile Rendered a true in modo che se da adesso vengono fatte modifiche che dovrebbero causare un redraw posso accorgermene\r\n // e mandare a cagare lo stronzo di turno\r\n this.Rendered = true;\r\n\r\n // Se devo aggiornare in automatico in base alla dimensione del contenitore collego il ResizeObserver\r\n if (this.AutoupdateSize)\r\n this.listenOnChanges();\r\n\r\n if (this.SmartSelection) {\r\n this.setupSelectionStyles();\r\n this.setupElementsSelectionIfNeeded();\r\n }\r\n\r\n this.onLoaded.emit();\r\n }\r\n\r\n /**\r\n * Prende tutti gli elementi appena assegnati, e se qualcuno era selezionato la situazione viene persistita su cytoscape\r\n */\r\n private setupElementsSelectionIfNeeded() {\r\n for (let i = 0; i < this.Elements.length; i++) {\r\n let eldata = <any>this.Elements[i].data;\r\n if (eldata.__selected) {\r\n let el = this.cy.$id(eldata.id);\r\n el.select();\r\n }\r\n }\r\n }\r\n\r\n /**\r\n * Carica gli stili per mostrare carina la selezione dei nodi\r\n */\r\n private setupSelectionStyles(){\r\n let cssItem = this.SmartSelectionStyles || {\r\n 'overlay-color': 'blue',\r\n 'overlay-opacity': 0.5,\r\n 'overlay-padding': 7\r\n };\r\n\r\n // Backdoor per poter assegnare \"{}\" a SmartSelectionStyles in modo di utilizzare la smart selection ma senza che nessuno stile venga applicato\r\n // ad esempio qualora si volesse utilizzare l'htmlnode per gestire la grafica degli elementi selezionati\r\n if(cssItem['overlay-color'] && cssItem['overlay-opacity'] && cssItem['overlay-padding'])\r\n (<any>this.cy.style()).selector('node:selected').css(cssItem);\r\n }\r\n\r\n /**\r\n * Registra l'ascolto al contenitore del grafico e in caso di modifiche alla dimensione, al massimo una volta ogni 500 millisecondi, lo ridisegna\r\n */\r\n private listenOnChanges() {\r\n this.resizeObserver = new ResizeSensor(this.cyGraph.nativeElement, () => {\r\n this.exts.throttle(this.name, this.onContainerSizeChanged.bind(this), this.ResizeThrottleTime);\r\n });\r\n }\r\n\r\n /**\r\n * Funzione che si occupa di gestire il repaint del diagramma\r\n */\r\n private onContainerSizeChanged() {\r\n this.service.log(\"I\", \"Diagram container size has changed, redrawing\");\r\n this.cy.resize();\r\n this.cy.fit();\r\n }\r\n\r\n /**\r\n * Collega tutti gli eventi che mi possono servire e li espone in output\r\n */\r\n private bindCytoscapeEvents() {\r\n this.cy.bind('click', 'node', (event) => {\r\n let targetData = event.target.data()\r\n if (this.SmartSelection) {\r\n\r\n // In caso di selezione singola ripulisco tutti gli elementi precedentemente selezionati\r\n if (this.SingleSelection) {\r\n let selected = this.cy.elements('node:selected');\r\n selected.forEach(el => {\r\n el.selectify();\r\n el.unselect();\r\n el.unselectify();\r\n el.data(\"__selected\", false);\r\n });\r\n }\r\n \r\n let id = targetData.id\r\n let el = this.cy.$id(id);\r\n let selected = el.selected();\r\n\r\n el.selectify();\r\n if (selected)\r\n el.unselect();\r\n else\r\n el.select();\r\n el.unselectify();\r\n\r\n // Questo va anche nella lista degli elementi originali (this.Elements) dato che cytoscape li prende per riferimento (bbbbbravo cyto-chan)\r\n el.data(\"__selected\", !selected);\r\n }\r\n\r\n this.onNodeClick.emit({ data: targetData });\r\n });\r\n\r\n this.cy.bind('select', 'node', (event) => {\r\n let targetData = event.target.data()\r\n\r\n this.onNodeSelection.emit({ data: targetData, selected: true });\r\n });\r\n\r\n this.cy.bind('layoutstop', (event) => {\r\n this.onLayoutDone.emit();\r\n });\r\n\r\n this.cy.bind('unselect', 'node', (event) => {\r\n let targetData = event.target.data()\r\n\r\n this.onNodeSelection.emit({ data: targetData, selected: false });\r\n });\r\n\r\n // Altri eventi...\r\n }\r\n\r\n /**\r\n * Metodo che serve per caricare tutte le estensioni della libreria in base a ciò che viene utilizzato\r\n */\r\n private async performModulesLoading() {\r\n if (this.Layout.name == 'dagre')\r\n await this.loadInternal(\"cytoscape-dagre\");\r\n\r\n if (this.NodeHTMLTemplates && this.NodeHTMLTemplates.length > 0)\r\n await this.loadInternal(\"cytoscape-html-node\");\r\n\r\n if (this.UseContextMenu)\r\n await this.loadInternal(\"cytoscape-cxtmenu\");\r\n\r\n if (this.NodesHierarchy && this.UseExpandCollapse)\r\n await this.loadInternal(\"cytoscape-expand-collapse\");\r\n\r\n if (this.ExtensionModulesImporter) {\r\n // Wrappo il namespace in modo che possa dire la mia sul fatto che l'utente aggiunga un modulo o meno :D\r\n var wrappedCytoscape = {\r\n use: (moduleName: string, module: cytoscape.Ext) => {\r\n if (!module)\r\n this.service.log(\"E\", this.service.loc(\"Received an undefined module. Make sure you are correctly loading it\") + \": \" + moduleName, false);\r\n\r\n if ([\"cytoscape-dagre\", \"cytoscape-html-node\", \"cytoscape-cxtmenu\", \"cytoscape-expand-collapse\"].includes(moduleName))\r\n this.service.log(\"W\", this.service.loc(\"Module\") + \" \" + moduleName + \" \" + this.service.loc(\"is loaded and managed directly by this library. You don't need to import it or use it directly, just be sure to set the relative options\"), false);\r\n else\r\n cytoscape.use(module);\r\n }\r\n }\r\n\r\n await this.ExtensionModulesImporter(wrappedCytoscape);\r\n }\r\n }\r\n\r\n /**\r\n * Metodo che serve per caricare tutte le estensioni della libreria in base a ciò che viene utilizzato con le opzioni definite dagli Input\r\n */\r\n private performOperationsWithLoadedModules() {\r\n\r\n let anyCy = (<any>this.cy);\r\n\r\n // Utilizzo del layout, lo salvo per poterlo riutilizzare in futuro\r\n if (this.Layout) {\r\n this.LastLayout = JSON.parse(JSON.stringify(this.Layout));\r\n this.cy.layout(this.LastLayout).run()\r\n }\r\n\r\n // Utilizzo dell'HTML node\r\n if (this.NodeHTMLTemplates && this.NodeHTMLTemplates.length > 0) {\r\n this.HtmlNodeApi = anyCy.htmlnode();\r\n this.HtmlNodeApi.createHtmlNode(cytoscape, this.cy, this.NodeHTMLTemplates);\r\n }\r\n\r\n // Utilizzo del Context Menu\r\n if (this.UseContextMenu)\r\n this.ContextMenuOptions.forEach(o => { anyCy.cxtmenu(o); });\r\n\r\n // Utilizzo dell'expand collapse solo quando c'è una gerarchia di nodi\r\n if (this.NodesHierarchy && this.UseExpandCollapse)\r\n this.ExpandCollapseApi = anyCy.expandCollapse(this.ExpandCollapseOptions);\r\n\r\n // Utilizzo di estensioni extra, implementazione affidata al programmatore\r\n if (this.ExtensionModulesApplyer)\r\n this.ExtensionModulesApplyer(this.cy);\r\n }\r\n\r\n public updateCardData() {\r\n if (!this.HtmlNodeApi) {\r\n this.service.log(\"E\", \"Cannot update NodeHTMLTemplates as they don't seem to be used\");\r\n return;\r\n }\r\n this.HtmlNodeApi.update();\r\n }\r\n\r\n /**\r\n * Metodo interno per il caricamento dei moduli di estensione\r\n * \r\n * @param {'cytoscape-expand-collapse' | 'cytoscape-cxtmenu' | 'cytoscape-html-node' | 'cytoscape-dagre'} moduleId Modulo da caricare\r\n */\r\n private async loadInternal(moduleId: 'cytoscape-expand-collapse' | 'cytoscape-cxtmenu' | 'cytoscape-html-node' | 'cytoscape-dagre') {\r\n let toLoad = await this.service.importIfNeeded(moduleId);\r\n if (toLoad) cytoscape.use(toLoad);\r\n }\r\n\r\n /**\r\n * Metodo che basandosi sulle opzioni native eventualmente assegnate le completa con gli Input addizionali\r\n * \r\n * @returns {cy_.CytoscapeOptions} Opzioni finali unite da Input ed opzioni native\r\n */\r\n private getCompletedOptions(): cy_.CytoscapeOptions {\r\n var opts: cy_.CytoscapeOptions = this.NativeOptions || {};\r\n opts.container = this.cyGraph.nativeElement;\r\n opts.style = opts.style || [];\r\n\r\n // Per tutte le cose per cui gli Input hanno priorità sovrascrivo gli originali delle opzioni\r\n\r\n if (this.NodeStyles || this.EdgeStyles) {\r\n opts.style = [];\r\n if (this.NodeStyles) opts.style.push({ selector: 'node', css: this.NodeStyles });\r\n if (this.EdgeStyles) opts.style.push({ selector: 'edge', css: this.EdgeStyles });\r\n }\r\n\r\n if (this.Elements)\r\n opts.elements = this.Elements;\r\n\r\n this.reviewCytoscapeElements(<cytoscape.ElementDefinition[]>opts.elements);\r\n\r\n if (this.Layout)\r\n opts.layout = this.Layout;\r\n\r\n if (this.Readonly) {\r\n // Questo coso fa effetti strani....\r\n //opts.autolock = true;\r\n\r\n opts.autoungrabify = true;\r\n opts.autounselectify = false;\r\n opts.boxSelectionEnabled = true;\r\n opts.userZoomingEnabled = false;\r\n opts.userPanningEnabled = false;\r\n }\r\n\r\n return opts;\r\n }\r\n\r\n /**\r\n * Aggiustamenti degli elementi di Cytoscape. \r\n * \r\n * I nodi non vengono toccati.\r\n * \r\n * Per ogni edge viene controllato se è specificata una sorgente ed una destinazione, in caso contrario si cerca di dedurli dall'ID\r\n * \r\n * @param {cytoscape.ElementDefinition[]} elements Elementi da sistemare\r\n */\r\n private reviewCytoscapeElements(elements: cytoscape.ElementDefinition[], prevPositions?: any) {\r\n let hasPreviousPositions = prevPositions && prevPositions.length > 0;\r\n let positionCache: { [index: string]: cytoscape.Position } = {};\r\n\r\n if (hasPreviousPositions) {\r\n for (let i = 0; i < prevPositions.length; i++) {\r\n let item = prevPositions[i];\r\n if (!positionCache[item.data().id])\r\n positionCache[item.data().id] = item.position();\r\n }\r\n }\r\n\r\n for (let i = 0; i < elements.length; i++) {\r\n let el = elements[i];\r\n if (el.group == \"edges\" && (!el.data.source && !el.data.target)) {\r\n if (!el.data.id.includes(\"-\"))\r\n this.service.log(\"E\", \"If you don't specify a source and a target for an edge you have to write its id in the format {source}-{target}\");\r\n else {\r\n var sourceTarget = el.data.id.split('-');\r\n el.data.source = sourceTarget[0].trim();\r\n el.data.target = sourceTarget[1].trim();\r\n }\r\n }\r\n\r\n if (hasPreviousPositions && el.group == \"nodes\")\r\n el.position = positionCache[el.data.id]\r\n }\r\n }\r\n}","<div #graph class=\"graph-wrapper {{name}}\"></div>","import { ModuleWithProviders, NgModule } from '@angular/core'\r\nimport { EsDiagramComponent } from './components/es-diagram.component'\r\n\r\nimport { FormsModule, ReactiveFormsModule } from '@angular/forms'\r\nimport { CommonModule } from '@angular/common'\r\nimport { EsDiagramService } from './services/es-diagram.service';\r\nimport { EsDiagramDispatcher } from './services/es-diagram.dispatcher';\r\nimport { EsDiagramModuleConfig } from './models/EsDiagramModuleConfig';\r\n\r\nimport { DIA_DEBUG_MODE } from './tokens';\r\n\r\n@NgModule({\r\n declarations: [ EsDiagramComponent ],\r\n imports: [ CommonModule, FormsModule, ReactiveFormsModule, CommonModule ],\r\n exports: [ EsDiagramComponent ]\r\n})\r\nexport class EsDiagramModule {\r\n static forRoot(config?: EsDiagramModuleConfig): ModuleWithProviders<EsDiagramModule> {\r\n return {\r\n ngModule: EsDiagramModule,\r\n providers: [\r\n EsDiagramService,\r\n EsDiagramDispatcher,\r\n { provide: DIA_DEBUG_MODE, useValue: config?.debugMode || false },\r\n ]\r\n };\r\n }\r\n}","/*\r\n * Public API Surface of cytoscape-angular\r\n */\r\n\r\nexport * from './lib/models/component/contextmenu/ContextMenuCommand';\r\nexport * from './lib/models/component/contextmenu/ContextMenuOptions';\r\nexport * from './lib/models/component/grouping/ExpandCollapseOptions';\r\nexport * from './lib/models/component/nodes/NodeHTMLTemplate';\r\nexport * from './lib/models/component/nodes/NodeTemplate';\r\nexport * from './lib/models/component/nodes/ZoomLevelBasedTemplate';\r\nexport * from './lib/models/layouts/base/BaseLayoutOptionsImpl';\r\nexport * from './lib/models/layouts/BreadthFirstLayoutOptionsImpl';\r\nexport * from './lib/models/layouts/CircleLayoutOptionsImpl';\r\nexport * from './lib/models/layouts/ConcentricLayoutOptionsImpl';\r\nexport * from './lib/models/layouts/CoseLayoutOptionsImpl';\r\nexport * from './lib/models/layouts/DagreLayoutOptionsImpl';\r\nexport * from './lib/models/layouts/GridLayoutOptionsImpl';\r\nexport * from './lib/models/layouts/NullLayoutOptionsImpl';\r\nexport * from './lib/models/layouts/PresetLayoutOptionsImpl';\r\nexport * from './lib/models/layouts/RandomLayoutOptionsImpl';\r\nexport * from './lib/models/layouts/base/ShapedLayoutOptionsImpl';\r\n\r\nexport * from './lib/models/EsDiagramModuleConfig';\r\nexport * from './lib/components/es-diagram.component';\r\n\r\nexport * from './lib/esdiagram.module';\r\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["cytoscape","i1.EsDiagramService","i2.EsDiagramDispatcher","i3.ReactiveExtensions"],"mappings":"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"}
|