@peter.prib/renderengine 0.0.0-stage → 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (436) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +203 -2
  3. package/REFERENCE.md +2159 -0
  4. package/dist/renderengine-workspace.umd.js +45944 -0
  5. package/dist/renderengine.umd.js +41262 -0
  6. package/examples/archimate.html +66 -0
  7. package/examples/diagram-editor.html +51 -0
  8. package/package.json +65 -4
  9. package/src/BaseRenderer.js +57 -0
  10. package/src/CanvasRenderer.js +194 -0
  11. package/src/Mat4.js +111 -0
  12. package/src/OrbitCamera.js +57 -0
  13. package/src/RendererFactory.js +50 -0
  14. package/src/SVGRenderer.js +439 -0
  15. package/src/archimate.js +723 -0
  16. package/src/archimateArchiFormat.js +1693 -0
  17. package/src/archimateArchiTypes.js +72 -0
  18. package/src/archimateArchive.js +140 -0
  19. package/src/archimateCSV.js +127 -0
  20. package/src/archimateDrawio.js +182 -0
  21. package/src/archimateExchangeFormat.js +546 -0
  22. package/src/archimateRelationshipTable.js +93 -0
  23. package/src/archimateSpecializations.js +161 -0
  24. package/src/chartCatalog.js +544 -0
  25. package/src/charting/ArchimateDiagramEditor.js +1624 -0
  26. package/src/charting/ArchimateSpecializationSelector.js +134 -0
  27. package/src/charting/Axis.js +68 -0
  28. package/src/charting/CameraSeeder.js +30 -0
  29. package/src/charting/CatalogDialog.js +92 -0
  30. package/src/charting/Chart.js +37 -0
  31. package/src/charting/Chart3D.js +99 -0
  32. package/src/charting/ChartBox.js +80 -0
  33. package/src/charting/ChartData.js +27 -0
  34. package/src/charting/ChartRegistry.js +76 -0
  35. package/src/charting/CheckboxTreeSelector.js +304 -0
  36. package/src/charting/ColorField.js +107 -0
  37. package/src/charting/ColorPalette.js +88 -0
  38. package/src/charting/CommandHistory.js +176 -0
  39. package/src/charting/DataFilter.js +52 -0
  40. package/src/charting/Diagram.js +36 -0
  41. package/src/charting/Diagram3D.js +29 -0
  42. package/src/charting/DiagramClipboard.js +31 -0
  43. package/src/charting/DiagramEditor.js +3330 -0
  44. package/src/charting/DiagramEditorCommand.js +110 -0
  45. package/src/charting/DiagramEditorCommands.js +237 -0
  46. package/src/charting/DiagramEditorEdgeCommands.js +142 -0
  47. package/src/charting/DiagramEditorState.js +98 -0
  48. package/src/charting/DiagramRegistry.js +86 -0
  49. package/src/charting/DiagramTypeRegistry.js +326 -0
  50. package/src/charting/DiagramViewPropertiesDialog.js +46 -0
  51. package/src/charting/Edge.js +113 -0
  52. package/src/charting/ErrorBars.js +37 -0
  53. package/src/charting/FilterSystem.js +285 -0
  54. package/src/charting/FindReplaceDialog.js +139 -0
  55. package/src/charting/FormDialog.js +385 -0
  56. package/src/charting/Gauge.js +52 -0
  57. package/src/charting/Hierarchy.js +175 -0
  58. package/src/charting/HintPanel.js +86 -0
  59. package/src/charting/ImageSelector.js +148 -0
  60. package/src/charting/InteractionManager.js +725 -0
  61. package/src/charting/Legend.js +58 -0
  62. package/src/charting/MenuBar.js +62 -0
  63. package/src/charting/ModelFileFormat.js +115 -0
  64. package/src/charting/OrbitControls.js +77 -0
  65. package/src/charting/Palette.js +119 -0
  66. package/src/charting/PopupMenu.js +117 -0
  67. package/src/charting/PropertiesPanel.js +155 -0
  68. package/src/charting/PropertyListEditor.js +96 -0
  69. package/src/charting/PropertyLog.js +92 -0
  70. package/src/charting/SettingsCascade.js +93 -0
  71. package/src/charting/SettingsDialog.js +53 -0
  72. package/src/charting/SettingsManager.js +179 -0
  73. package/src/charting/SettingsViewPropertiesDialog.js +58 -0
  74. package/src/charting/ShapePaths.js +27 -0
  75. package/src/charting/Statistics.js +134 -0
  76. package/src/charting/TemplateCatalog.js +59 -0
  77. package/src/charting/TemplateLibrary.js +103 -0
  78. package/src/charting/TextStyle.js +168 -0
  79. package/src/charting/ViewFit.js +55 -0
  80. package/src/charting/ViewMenu.js +70 -0
  81. package/src/charting/ViewPropertiesDialog.js +77 -0
  82. package/src/charting/ViewTabStrip.js +81 -0
  83. package/src/charting/archimate/ArchiFileFormat.js +32 -0
  84. package/src/charting/archimate/ArchimateCanvasEditor.js +815 -0
  85. package/src/charting/archimate/ArchimateCsvFileFormat.js +35 -0
  86. package/src/charting/archimate/ArchimateEdge.js +137 -0
  87. package/src/charting/archimate/ArchimateElementTemplate.js +195 -0
  88. package/src/charting/archimate/ArchimatePalette.js +102 -0
  89. package/src/charting/archimate/CsvImportDialog.js +105 -0
  90. package/src/charting/archimate/CustomViewpoints.js +74 -0
  91. package/src/charting/archimate/DerivedEdge.js +29 -0
  92. package/src/charting/archimate/DrawioFileFormat.js +24 -0
  93. package/src/charting/archimate/ElementFilterRule.js +21 -0
  94. package/src/charting/archimate/ExchangeFileFormat.js +28 -0
  95. package/src/charting/archimate/ViewGroupTemplate.js +137 -0
  96. package/src/charting/archimate/ViewLineEdge.js +84 -0
  97. package/src/charting/archimate/ViewpointRule.js +45 -0
  98. package/src/charting/archimate/archimateFileFormats.js +12 -0
  99. package/src/charting/archimate/archimateNames.js +5 -0
  100. package/src/charting/archimate/csvMapping.js +122 -0
  101. package/src/charting/archimate/elementMenuItems.js +32 -0
  102. package/src/charting/archimate/elementProperties.js +146 -0
  103. package/src/charting/archimate/elementTypeChoices.js +7 -0
  104. package/src/charting/archimate/elementTypeGroups.js +19 -0
  105. package/src/charting/archimate/index.js +17 -0
  106. package/src/charting/archimate/specializationCatalogDialog.js +64 -0
  107. package/src/charting/archimate/typeGlyph.js +29 -0
  108. package/src/charting/arrangement/Arrangement.js +112 -0
  109. package/src/charting/arrangement/ArrangementCommand.js +29 -0
  110. package/src/charting/arrangement/BackgroundCommand.js +41 -0
  111. package/src/charting/arrangement/BackgroundGroup.js +18 -0
  112. package/src/charting/arrangement/GroupCommand.js +46 -0
  113. package/src/charting/arrangement/ItemGroup.js +62 -0
  114. package/src/charting/arrangement/LockCommand.js +32 -0
  115. package/src/charting/arrangement/UngroupCommand.js +27 -0
  116. package/src/charting/arrangement/alignment.js +88 -0
  117. package/src/charting/arrangement/arrangeMenuItems.js +25 -0
  118. package/src/charting/arrangement/index.js +11 -0
  119. package/src/charting/arrangement/layouts.js +233 -0
  120. package/src/charting/canvas/ArchiHint.js +78 -0
  121. package/src/charting/canvas/CanvasBoxKind.js +39 -0
  122. package/src/charting/canvas/CanvasPalette.js +49 -0
  123. package/src/charting/canvas/CanvasTemplateLibrary.js +61 -0
  124. package/src/charting/canvas/CanvasTemplateMenu.js +151 -0
  125. package/src/charting/canvas/EditHintCommand.js +28 -0
  126. package/src/charting/canvas/canvasBoxKinds.js +27 -0
  127. package/src/charting/canvas/canvasBoxMenuItems.js +40 -0
  128. package/src/charting/canvas/defaultCanvasTemplates.js +186 -0
  129. package/src/charting/canvas/diagramBoxKinds.js +12 -0
  130. package/src/charting/canvas/hintMenuItems.js +49 -0
  131. package/src/charting/charts/AreaChart.js +71 -0
  132. package/src/charting/charts/BarChart.js +80 -0
  133. package/src/charting/charts/BarChart3D.js +56 -0
  134. package/src/charting/charts/BarChart3DOrbit.js +53 -0
  135. package/src/charting/charts/BarChartBase.js +70 -0
  136. package/src/charting/charts/BarGauge.js +21 -0
  137. package/src/charting/charts/BoxPlotChart.js +41 -0
  138. package/src/charting/charts/BubbleChart.js +99 -0
  139. package/src/charting/charts/BubbleChart3D.js +78 -0
  140. package/src/charting/charts/BulletGauge.js +91 -0
  141. package/src/charting/charts/CalendarHeatmapChart.js +204 -0
  142. package/src/charting/charts/CandlestickChart.js +54 -0
  143. package/src/charting/charts/ChordDiagram.js +130 -0
  144. package/src/charting/charts/DensityChart.js +73 -0
  145. package/src/charting/charts/DialGauge.js +37 -0
  146. package/src/charting/charts/DonutChart.js +15 -0
  147. package/src/charting/charts/FunnelChart.js +47 -0
  148. package/src/charting/charts/GanttChart.js +201 -0
  149. package/src/charting/charts/GaugeChart.js +47 -0
  150. package/src/charting/charts/GeoMapChart.js +146 -0
  151. package/src/charting/charts/GroupedBarChart.js +88 -0
  152. package/src/charting/charts/GroupedDistributionChart.js +70 -0
  153. package/src/charting/charts/HeatmapChart.js +80 -0
  154. package/src/charting/charts/HierarchyChart.js +39 -0
  155. package/src/charting/charts/HistogramChart.js +45 -0
  156. package/src/charting/charts/LagPlotChart.js +41 -0
  157. package/src/charting/charts/LineChart.js +124 -0
  158. package/src/charting/charts/OutlineChart.js +95 -0
  159. package/src/charting/charts/ParallelCoordinatesChart.js +130 -0
  160. package/src/charting/charts/PieChart.js +56 -0
  161. package/src/charting/charts/PipeChart.js +88 -0
  162. package/src/charting/charts/PopulationPyramidChart.js +106 -0
  163. package/src/charting/charts/QQPlotChart.js +64 -0
  164. package/src/charting/charts/RadarChart.js +76 -0
  165. package/src/charting/charts/RadialBarChart.js +96 -0
  166. package/src/charting/charts/SankeyDiagram.js +174 -0
  167. package/src/charting/charts/ScatterChart.js +104 -0
  168. package/src/charting/charts/StackedAreaChart.js +15 -0
  169. package/src/charting/charts/StackedBarChart.js +33 -0
  170. package/src/charting/charts/StackedBarChart3DOrbit.js +58 -0
  171. package/src/charting/charts/StreamGraphChart.js +131 -0
  172. package/src/charting/charts/SunburstChart.js +57 -0
  173. package/src/charting/charts/TreemapChart.js +54 -0
  174. package/src/charting/charts/ViolinChart.js +37 -0
  175. package/src/charting/charts/WaterfallChart.js +66 -0
  176. package/src/charting/charts/WordCloudChart.js +104 -0
  177. package/src/charting/diagramModel/AddViewCommand.js +33 -0
  178. package/src/charting/diagramModel/DiagramModel.js +39 -0
  179. package/src/charting/diagramModel/DiagramModelSearch.js +22 -0
  180. package/src/charting/diagramModel/DiagramView.js +50 -0
  181. package/src/charting/diagramModel/ModelHistory.js +43 -0
  182. package/src/charting/diagramModel/ModelReport.js +153 -0
  183. package/src/charting/diagramModel/ModelSearch.js +223 -0
  184. package/src/charting/diagramModel/RemoveViewCommand.js +25 -0
  185. package/src/charting/diagramModel/RenameViewCommand.js +21 -0
  186. package/src/charting/diagramModel/ReplaceTextCommand.js +25 -0
  187. package/src/charting/diagramModel/ViewSetChecker.js +34 -0
  188. package/src/charting/diagramModel/ViewSetModel.js +243 -0
  189. package/src/charting/diagramModel/index.js +6 -0
  190. package/src/charting/diagramModel/nameTransforms.js +29 -0
  191. package/src/charting/diagrams/ArchimateCommands.js +141 -0
  192. package/src/charting/diagrams/ArchimateDiagram.js +263 -0
  193. package/src/charting/diagrams/ArchimateModel.js +1155 -0
  194. package/src/charting/diagrams/ArchimateModelChecker.js +125 -0
  195. package/src/charting/diagrams/ArchimateModelReport.js +128 -0
  196. package/src/charting/diagrams/ArchimateModelSearch.js +41 -0
  197. package/src/charting/diagrams/ArchimateValidator.js +357 -0
  198. package/src/charting/diagrams/CanvasView.js +112 -0
  199. package/src/charting/diagrams/ContextMenu.js +37 -0
  200. package/src/charting/diagrams/DataModelDiagram.js +86 -0
  201. package/src/charting/diagrams/DataModelRelationshipStrategy.js +38 -0
  202. package/src/charting/diagrams/DerivedRelationships.js +102 -0
  203. package/src/charting/diagrams/EbnfDiagram.js +39 -0
  204. package/src/charting/diagrams/EdgeGeometry.js +553 -0
  205. package/src/charting/diagrams/EditViewItemCommand.js +128 -0
  206. package/src/charting/diagrams/ElementInstance.js +157 -0
  207. package/src/charting/diagrams/GraphDiagram.js +1340 -0
  208. package/src/charting/diagrams/GraphDiagram3D.js +152 -0
  209. package/src/charting/diagrams/GraphMetrics.js +81 -0
  210. package/src/charting/diagrams/GridOverlay.js +137 -0
  211. package/src/charting/diagrams/ImportRowsCommand.js +62 -0
  212. package/src/charting/diagrams/LabelHelper.js +108 -0
  213. package/src/charting/diagrams/MergeElementsCommand.js +101 -0
  214. package/src/charting/diagrams/NestInstanceCommand.js +34 -0
  215. package/src/charting/diagrams/NodeGeometry.js +158 -0
  216. package/src/charting/diagrams/PlaceItemsCommand.js +77 -0
  217. package/src/charting/diagrams/RadialLayout.js +101 -0
  218. package/src/charting/diagrams/RelationshipInstance.js +93 -0
  219. package/src/charting/diagrams/RemoveGroupFromViewCommand.js +28 -0
  220. package/src/charting/diagrams/RemoveLineCommand.js +27 -0
  221. package/src/charting/diagrams/ShowElementCommand.js +43 -0
  222. package/src/charting/diagrams/SvgCoordinate.js +17 -0
  223. package/src/charting/diagrams/SvgZoom.js +127 -0
  224. package/src/charting/diagrams/Tooltip.js +62 -0
  225. package/src/charting/diagrams/ViewConnectionInstance.js +102 -0
  226. package/src/charting/diagrams/ViewObjectInstance.js +56 -0
  227. package/src/charting/diagrams/commands/AddEdgeCommand.js +34 -0
  228. package/src/charting/diagrams/commands/AddNodeCommand.js +28 -0
  229. package/src/charting/diagrams/commands/AddWaypointCommand.js +27 -0
  230. package/src/charting/diagrams/commands/CreateFolderCommand.js +27 -0
  231. package/src/charting/diagrams/commands/DeleteEdgeCommand.js +30 -0
  232. package/src/charting/diagrams/commands/DeleteFolderCommand.js +47 -0
  233. package/src/charting/diagrams/commands/DeleteNodeCommand.js +35 -0
  234. package/src/charting/diagrams/commands/DeleteWaypointCommand.js +24 -0
  235. package/src/charting/diagrams/commands/GraphCommand.js +65 -0
  236. package/src/charting/diagrams/commands/InvertEdgeCommand.js +24 -0
  237. package/src/charting/diagrams/commands/MoveNodeCommand.js +44 -0
  238. package/src/charting/diagrams/commands/MoveWaypointCommand.js +27 -0
  239. package/src/charting/diagrams/commands/RenameEdgeCommand.js +23 -0
  240. package/src/charting/diagrams/commands/RenameFolderCommand.js +31 -0
  241. package/src/charting/diagrams/commands/RenameNodeCommand.js +27 -0
  242. package/src/charting/diagrams/commands/ResizeNodeCommand.js +46 -0
  243. package/src/charting/diagrams/commands/UpdateEdgeSideCommand.js +40 -0
  244. package/src/charting/diagrams/commands/index.js +17 -0
  245. package/src/charting/diagrams/duplicates.js +49 -0
  246. package/src/charting/diagrams/nesting.js +30 -0
  247. package/src/charting/diagrams/roadmap.js +77 -0
  248. package/src/charting/edgeMarkers/ArrowMarker.js +15 -0
  249. package/src/charting/edgeMarkers/CircleMarker.js +13 -0
  250. package/src/charting/edgeMarkers/CrowsFootMarker.js +16 -0
  251. package/src/charting/edgeMarkers/DiamondMarker.js +15 -0
  252. package/src/charting/edgeMarkers/EdgeMarker.js +34 -0
  253. package/src/charting/edgeMarkers/HalfArrowMarker.js +8 -0
  254. package/src/charting/edgeMarkers/HollowDiamondMarker.js +18 -0
  255. package/src/charting/edgeMarkers/HollowTriangleMarker.js +18 -0
  256. package/src/charting/edgeMarkers/OpenArrowMarker.js +17 -0
  257. package/src/charting/edgeMarkers/index.js +27 -0
  258. package/src/charting/edgeStyle/EdgeStyleCascade.js +22 -0
  259. package/src/charting/edgeStyle/EdgeStyleDialog.js +51 -0
  260. package/src/charting/edgeStyle/EdgeStyleSchema.js +43 -0
  261. package/src/charting/edgeStyle/SetStyleCommand.js +12 -0
  262. package/src/charting/edgeStyle/index.js +4 -0
  263. package/src/charting/emphasis/EmphasisRule.js +42 -0
  264. package/src/charting/emphasis/HighlightRule.js +24 -0
  265. package/src/charting/glyphs/ArrowGlyph.js +21 -0
  266. package/src/charting/glyphs/BatteryGlyph.js +18 -0
  267. package/src/charting/glyphs/ChevronGlyph.js +18 -0
  268. package/src/charting/glyphs/CircleGlyph.js +15 -0
  269. package/src/charting/glyphs/CloudGlyph.js +19 -0
  270. package/src/charting/glyphs/ComponentGlyph.js +18 -0
  271. package/src/charting/glyphs/ConstraintGlyph.js +24 -0
  272. package/src/charting/glyphs/ContractBoxGlyph.js +10 -0
  273. package/src/charting/glyphs/CubeGlyph.js +19 -0
  274. package/src/charting/glyphs/CylinderGlyph.js +19 -0
  275. package/src/charting/glyphs/DashedDoubleArrowGlyph.js +11 -0
  276. package/src/charting/glyphs/DeviceGlyph.js +17 -0
  277. package/src/charting/glyphs/DiamondGlyph.js +17 -0
  278. package/src/charting/glyphs/DocumentGlyph.js +17 -0
  279. package/src/charting/glyphs/DoubleArrowGlyph.js +23 -0
  280. package/src/charting/glyphs/DoubleCircleGlyph.js +24 -0
  281. package/src/charting/glyphs/EllipseGlyph.js +18 -0
  282. package/src/charting/glyphs/FactoryGlyph.js +20 -0
  283. package/src/charting/glyphs/FlagGlyph.js +16 -0
  284. package/src/charting/glyphs/GapCircleGlyph.js +17 -0
  285. package/src/charting/glyphs/GearGlyph.js +37 -0
  286. package/src/charting/glyphs/Glyph.js +98 -0
  287. package/src/charting/glyphs/GroupingBoxGlyph.js +13 -0
  288. package/src/charting/glyphs/HalfCircleGlyph.js +22 -0
  289. package/src/charting/glyphs/HexagonGlyph.js +28 -0
  290. package/src/charting/glyphs/IconGlyph.js +22 -0
  291. package/src/charting/glyphs/ImageGlyph.js +16 -0
  292. package/src/charting/glyphs/JunctionGlyph.js +17 -0
  293. package/src/charting/glyphs/LollipopGlyph.js +22 -0
  294. package/src/charting/glyphs/MagnifierGlyph.js +17 -0
  295. package/src/charting/glyphs/NoteGlyph.js +33 -0
  296. package/src/charting/glyphs/ObjectBoxGlyph.js +21 -0
  297. package/src/charting/glyphs/OrJunctionGlyph.js +17 -0
  298. package/src/charting/glyphs/ParallelogramGlyph.js +20 -0
  299. package/src/charting/glyphs/PersonGlyph.js +23 -0
  300. package/src/charting/glyphs/PillGlyph.js +23 -0
  301. package/src/charting/glyphs/PinGlyph.js +18 -0
  302. package/src/charting/glyphs/PrincipleGlyph.js +23 -0
  303. package/src/charting/glyphs/ProductBoxGlyph.js +16 -0
  304. package/src/charting/glyphs/RectGlyph.js +15 -0
  305. package/src/charting/glyphs/RoundedBoxGlyph.js +13 -0
  306. package/src/charting/glyphs/StackGlyph.js +14 -0
  307. package/src/charting/glyphs/StepsGlyph.js +20 -0
  308. package/src/charting/glyphs/StickFigureGlyph.js +32 -0
  309. package/src/charting/glyphs/SystemSoftwareBoxGlyph.js +16 -0
  310. package/src/charting/glyphs/TabbedBoxGlyph.js +37 -0
  311. package/src/charting/glyphs/TargetGlyph.js +23 -0
  312. package/src/charting/glyphs/WavyBoxGlyph.js +17 -0
  313. package/src/charting/glyphs/WheelGlyph.js +28 -0
  314. package/src/charting/glyphs/drawGlyph.js +28 -0
  315. package/src/charting/glyphs/glyphSvg.js +55 -0
  316. package/src/charting/glyphs/index.js +109 -0
  317. package/src/charting/modelTree/AnalysisPanel.js +159 -0
  318. package/src/charting/modelTree/DiagramTabs.js +217 -0
  319. package/src/charting/modelTree/ModelTree.js +164 -0
  320. package/src/charting/modelTree/ModelTreePanel.js +914 -0
  321. package/src/charting/modelTree/TreeBuilder.js +238 -0
  322. package/src/charting/modelTree/TreeModeRegistry.js +51 -0
  323. package/src/charting/modelTree/TreeViewMode.js +110 -0
  324. package/src/charting/modelTree/buildFilterTrees.js +138 -0
  325. package/src/charting/modelTree/modes/FlatTreeMode.js +46 -0
  326. package/src/charting/modelTree/modes/LayerGroupedTreeMode.js +62 -0
  327. package/src/charting/modelTree/modes/TypeGroupedTreeMode.js +60 -0
  328. package/src/charting/modelTree/treeLayers.js +11 -0
  329. package/src/charting/report/reportHtml.js +82 -0
  330. package/src/charting/report/reportViewer.js +118 -0
  331. package/src/charting/shapes/CircleShape.js +19 -0
  332. package/src/charting/shapes/PathShape.js +17 -0
  333. package/src/charting/shapes/RectShape.js +20 -0
  334. package/src/charting/shapes/Shape.js +20 -0
  335. package/src/charting/shapes/ShapeFactory.js +23 -0
  336. package/src/charting/storage/LocalJsonStore.js +43 -0
  337. package/src/charting/templates/ActorTemplate.js +36 -0
  338. package/src/charting/templates/BoxTemplate.js +27 -0
  339. package/src/charting/templates/CircleTemplate.js +18 -0
  340. package/src/charting/templates/ClassTemplate.js +20 -0
  341. package/src/charting/templates/CloudTemplate.js +43 -0
  342. package/src/charting/templates/ComponentTemplate.js +19 -0
  343. package/src/charting/templates/CylinderTemplate.js +30 -0
  344. package/src/charting/templates/DataStoreTemplate.js +16 -0
  345. package/src/charting/templates/DiamondTemplate.js +10 -0
  346. package/src/charting/templates/DocumentTemplate.js +32 -0
  347. package/src/charting/templates/EllipseTemplate.js +15 -0
  348. package/src/charting/templates/FinalStateTemplate.js +12 -0
  349. package/src/charting/templates/GlyphTemplate.js +47 -0
  350. package/src/charting/templates/HexagonTemplate.js +17 -0
  351. package/src/charting/templates/LifelineTemplate.js +20 -0
  352. package/src/charting/templates/ManualInputTemplate.js +12 -0
  353. package/src/charting/templates/NoteTemplate.js +23 -0
  354. package/src/charting/templates/OctagonTemplate.js +7 -0
  355. package/src/charting/templates/PackageTemplate.js +25 -0
  356. package/src/charting/templates/ParallelogramTemplate.js +11 -0
  357. package/src/charting/templates/PentagonTemplate.js +5 -0
  358. package/src/charting/templates/PolygonTemplate.js +18 -0
  359. package/src/charting/templates/PredefinedProcessTemplate.js +13 -0
  360. package/src/charting/templates/RectangleTemplate.js +28 -0
  361. package/src/charting/templates/RegularPolygonTemplate.js +21 -0
  362. package/src/charting/templates/RoundedRectangleTemplate.js +5 -0
  363. package/src/charting/templates/StadiumTemplate.js +8 -0
  364. package/src/charting/templates/StarTemplate.js +17 -0
  365. package/src/charting/templates/SwimlaneTemplate.js +18 -0
  366. package/src/charting/templates/Template.js +208 -0
  367. package/src/charting/templates/TrapezoidTemplate.js +11 -0
  368. package/src/charting/templates/TriangleTemplate.js +12 -0
  369. package/src/charting/templates/index.js +31 -0
  370. package/src/charting/templates/outline.js +59 -0
  371. package/src/charting/templates/svg.js +19 -0
  372. package/src/charting/textToShapes.js +61 -0
  373. package/src/charting/toolbar/ToolbarButton.js +38 -0
  374. package/src/charting/toolbar/ToolbarCheckbox.js +31 -0
  375. package/src/charting/toolbar/ToolbarItem.js +19 -0
  376. package/src/charting/toolbar/ToolbarMenu.js +36 -0
  377. package/src/charting/toolbar/ToolbarSelect.js +38 -0
  378. package/src/charting/toolbar/ToolbarSeparator.js +7 -0
  379. package/src/charting/toolbar/ToolbarText.js +22 -0
  380. package/src/charting/toolbar/index.js +8 -0
  381. package/src/charting/toolbar/pickFile.js +14 -0
  382. package/src/charting/viewDecorations.js +85 -0
  383. package/src/charting/zOrder.js +57 -0
  384. package/src/csvTable.js +61 -0
  385. package/src/datamodel.js +122 -0
  386. package/src/datawindow/BoundedWindow.js +36 -0
  387. package/src/datawindow/FlatDataWindow.js +34 -0
  388. package/src/datawindow/GraphDataWindow.js +40 -0
  389. package/src/datawindow/GroupedSampleDataWindow.js +16 -0
  390. package/src/datawindow/SeriesDataWindow.js +42 -0
  391. package/src/datawindow/index.js +31 -0
  392. package/src/diagramCatalog.js +30 -0
  393. package/src/ebnfDiagram.js +57 -0
  394. package/src/ebnfParser.js +129 -0
  395. package/src/exportImage.js +233 -0
  396. package/src/index.js +2564 -0
  397. package/src/itIcons.js +84 -0
  398. package/src/kernelExpr.js +243 -0
  399. package/src/propertiesDialog.js +463 -0
  400. package/src/railroadDiagram.js +571 -0
  401. package/src/treeModeCatalog.js +16 -0
  402. package/src/workspace/ContextBus.js +79 -0
  403. package/src/workspace/EditorShell.js +67 -0
  404. package/src/workspace/Part.js +163 -0
  405. package/src/workspace/PartFactory.js +49 -0
  406. package/src/workspace/PartRegistry.js +86 -0
  407. package/src/workspace/Workspace.js +321 -0
  408. package/src/workspace/archimateServices.js +33 -0
  409. package/src/workspace/dom.js +120 -0
  410. package/src/workspace/index.js +75 -0
  411. package/src/workspace/layout/GridNode.js +280 -0
  412. package/src/workspace/layout/LayoutNode.js +89 -0
  413. package/src/workspace/layout/PartNode.js +77 -0
  414. package/src/workspace/layout/SplitNode.js +114 -0
  415. package/src/workspace/layout/TabsNode.js +191 -0
  416. package/src/workspace/layout/index.js +24 -0
  417. package/src/workspace/parts/AdapterPart.js +33 -0
  418. package/src/workspace/parts/ArchimateCanvasPart.js +345 -0
  419. package/src/workspace/parts/ArchimateEditorPart.js +79 -0
  420. package/src/workspace/parts/ChartPart.js +115 -0
  421. package/src/workspace/parts/ContentPart.js +34 -0
  422. package/src/workspace/parts/DetailPart.js +46 -0
  423. package/src/workspace/parts/DiagramEditorPart.js +135 -0
  424. package/src/workspace/parts/EditorPart.js +388 -0
  425. package/src/workspace/parts/HtmlPart.js +25 -0
  426. package/src/workspace/parts/ListPart.js +57 -0
  427. package/src/workspace/parts/ModelFile.js +187 -0
  428. package/src/workspace/parts/ModelsPart.js +135 -0
  429. package/src/workspace/styles.js +258 -0
  430. package/src/workspace/themes.js +96 -0
  431. package/src/workspace/workArea.js +413 -0
  432. package/src/workspace/workAreaModel.js +197 -0
  433. package/src/workspace.js +16 -0
  434. package/src/zip/ZipArchive.js +160 -0
  435. package/src/zip/crc32.js +25 -0
  436. package/src/zip/inflate.js +159 -0
@@ -0,0 +1,243 @@
1
+ import { ViewSetChecker } from './ViewSetChecker.js';
2
+ import { ModelReport } from './ModelReport.js';
3
+ import { ModelSearch } from './ModelSearch.js';
4
+ import { ModelHistory } from './ModelHistory.js';
5
+ import { AddViewCommand } from './AddViewCommand.js';
6
+ import { RemoveViewCommand } from './RemoveViewCommand.js';
7
+ import { RenameViewCommand } from './RenameViewCommand.js';
8
+
9
+ /**
10
+ * ViewSetModel — a model edited as several views (diagrams), with one current.
11
+ * Owns what every such model does with its views: create, duplicate, rename,
12
+ * delete, switch, and telling listeners after each change, so a UI only has to
13
+ * re-render on notification. It has one undo history (`history`, a
14
+ * ModelHistory, as Archi has one command stack per model) that every view of
15
+ * it shares: adding, renaming and deleting views are undoable steps on it too.
16
+ *
17
+ * Subclasses make their own kind of view through `_newView(id, title)`; a view
18
+ * has an `id`, a `title`, and `copy(id, title)` for duplication. DiagramModel
19
+ * (the template editor) and ArchimateModel extend it.
20
+ */
21
+ export class ViewSetModel {
22
+ /**
23
+ * @param {Object} [options]
24
+ * @param {string} [options.idPrefix] - Prefix for generated view ids
25
+ * @param {string} [options.viewNoun] - What a view is called in default titles ('Diagram', 'View')
26
+ */
27
+ constructor({ idPrefix = 'view', viewNoun = 'View' } = {}) {
28
+ if (new.target === ViewSetModel) throw new TypeError('ViewSetModel is abstract — subclass it');
29
+ /** @type {Map<string, Object>} in tab order */
30
+ this._views = new Map();
31
+ this.currentViewId = null;
32
+ this.idPrefix = idPrefix;
33
+ this.viewNoun = viewNoun;
34
+ this._nextId = 1;
35
+ this._listeners = [];
36
+ /** Bumped by every change to the set of views (new, duplicated, renamed, deleted). */
37
+ this._structure = 0;
38
+ this._saved = null;
39
+ this._editListeners = [];
40
+ this._watched = new WeakSet();
41
+ }
42
+
43
+ /** The model's one undo history, which every view of it shares (ModelHistory). */
44
+ get history() {
45
+ return (this._history ??= new ModelHistory(this, this.historyOptions ?? {}));
46
+ }
47
+
48
+ /** Make a view one of this model's: its edits go on the model's history. @protected */
49
+ _adopt(view) {
50
+ view.history = this.history;
51
+ return view;
52
+ }
53
+
54
+ // ===== Saved or not =====
55
+
56
+ /** Remember this state as the saved one (after opening or saving a file). */
57
+ markSaved() {
58
+ this._saved = { structure: this._structure, token: this.history.stateToken };
59
+ this._emitEdit();
60
+ }
61
+
62
+ /**
63
+ * Whether anything changed since markSaved: an edit on the model's history
64
+ * (any view's, or to the views themselves) not undone back again.
65
+ */
66
+ isDirty() {
67
+ const saved = this._saved ?? { structure: 0, token: 0 };
68
+ return this._structure !== saved.structure || this.history.stateToken !== saved.token;
69
+ }
70
+
71
+ /** Call `fn(model)` after every edit (any view's history, or the set of views). Returns an unsubscribe function. */
72
+ onEdit(fn) {
73
+ this._editListeners.push(fn);
74
+ this._watchHistories();
75
+ return () => { this._editListeners = this._editListeners.filter(l => l !== fn); };
76
+ }
77
+
78
+ /** Listen to the model's history (and any view's own, for one not adopted). @private */
79
+ _watchHistories() {
80
+ for (const history of [this.history, ...this.views().map(v => v.history)]) {
81
+ if (!history?.onChange || this._watched.has(history)) continue;
82
+ this._watched.add(history);
83
+ history.onChange(() => this._emitEdit());
84
+ }
85
+ }
86
+
87
+ /** @private */
88
+ _emitEdit() {
89
+ for (const fn of this._editListeners) fn(this);
90
+ }
91
+
92
+ /** A new, empty view of this model's kind. @protected */
93
+ _newView(id, title) {
94
+ throw new Error(`${this.constructor.name} must implement _newView()`);
95
+ }
96
+
97
+ /** Subscribe to changes; returns an unsubscribe function. */
98
+ onChange(fn) {
99
+ this._listeners.push(fn);
100
+ return () => { this._listeners = this._listeners.filter(l => l !== fn); };
101
+ }
102
+
103
+ /** All views, in order. */
104
+ views() {
105
+ return [...this._views.values()];
106
+ }
107
+
108
+ get viewCount() {
109
+ return this._views.size;
110
+ }
111
+
112
+ get currentView() {
113
+ return this._views.get(this.currentViewId) ?? null;
114
+ }
115
+
116
+ getView(id) {
117
+ return this._views.get(id) ?? null;
118
+ }
119
+
120
+ /** Title offered for the next new view. */
121
+ nextViewTitle() {
122
+ return `${this.viewNoun} ${this._views.size + 1}`;
123
+ }
124
+
125
+ /** Add an empty view and make it current. */
126
+ createView(title = this.nextViewTitle()) {
127
+ return this._add(this._newView(this._newId(), title));
128
+ }
129
+
130
+ /** Add an independent copy of a view and make it current. */
131
+ duplicateView(id) {
132
+ const original = this._views.get(id);
133
+ if (!original) return null;
134
+ return this._add(original.copy(this._newId(), `${original.title} (copy)`));
135
+ }
136
+
137
+ /** Give a view a new title (not an empty one). One undo step. */
138
+ renameView(id, title) {
139
+ const view = this._views.get(id);
140
+ if (!view || !title || title === view.title) return false;
141
+ this.history.execute(new RenameViewCommand(this, view, title));
142
+ return true;
143
+ }
144
+
145
+ /** A view's title set, as RenameViewCommand and replace do it (not undoable by itself). @protected */
146
+ _retitle(id, title) {
147
+ const view = this._views.get(id);
148
+ if (!view) return;
149
+ view.title = title;
150
+ this._notify();
151
+ }
152
+
153
+ /** The checks this model is held to (ViewSetChecker; a notation's model returns its own). */
154
+ checker() {
155
+ return new ViewSetChecker(this);
156
+ }
157
+
158
+ /** Find and replace over the model's texts (ModelSearch; a notation's model returns its own). */
159
+ search() {
160
+ return new ModelSearch(this);
161
+ }
162
+
163
+ /** The model's report (ModelReport; a notation's model returns its own), for reportHtml. */
164
+ report(options) {
165
+ return new ModelReport(this, options);
166
+ }
167
+
168
+ /** Whether a view may be deleted: the last one stays. */
169
+ canDeleteView(id) {
170
+ return this._views.has(id) && this._views.size > 1;
171
+ }
172
+
173
+ /** Remove a view; the last one cannot be removed. The neighbour becomes current. One undo step. */
174
+ deleteView(id) {
175
+ if (!this.canDeleteView(id)) return false;
176
+ this.history.execute(new RemoveViewCommand(this, this._views.get(id)));
177
+ return true;
178
+ }
179
+
180
+ switchTo(id) {
181
+ if (!this._views.has(id) || id === this.currentViewId) return false;
182
+ this.currentViewId = id;
183
+ this._notify();
184
+ return true;
185
+ }
186
+
187
+ /**
188
+ * Add a view (last), shown unless `current` is false: one undo step on the
189
+ * model's history (AddViewCommand).
190
+ * @protected
191
+ */
192
+ _add(view, { current = true } = {}) {
193
+ this.history.execute(new AddViewCommand(this, this._adopt(view), { current }));
194
+ return view;
195
+ }
196
+
197
+ /**
198
+ * Put a view in the model at `index` (default last), current if asked; as
199
+ * AddViewCommand and RemoveViewCommand's undo do it.
200
+ * @protected
201
+ */
202
+ _insertView(view, { index = this._views.size, current = true } = {}) {
203
+ const entries = [...this._views].filter(([id]) => id !== view.id);
204
+ entries.splice(Math.min(index, entries.length), 0, [view.id, view]);
205
+ this._views = new Map(entries);
206
+ if (current || !this.currentViewId) this.currentViewId = view.id;
207
+ this._notify();
208
+ }
209
+
210
+ /**
211
+ * Take a view out of the model; the one in front becomes `next` (if given
212
+ * and still there) or, when it was this one, its neighbour.
213
+ * @returns {{index: number, current: boolean}} where it was, and whether it was in front
214
+ * @protected
215
+ */
216
+ _removeView(id, { next = null } = {}) {
217
+ const ids = [...this._views.keys()];
218
+ const index = ids.indexOf(id);
219
+ const current = this.currentViewId === id;
220
+ this._views.delete(id);
221
+ if (next && this._views.has(next)) this.currentViewId = next;
222
+ else if (current) this.currentViewId = ids[index + 1] ?? ids[index - 1] ?? null;
223
+ this._notify();
224
+ return { index, current };
225
+ }
226
+
227
+ _newId() {
228
+ let id;
229
+ do { id = `${this.idPrefix}-${this._nextId++}`; } while (this._views.has(id));
230
+ return id;
231
+ }
232
+
233
+ _notify() {
234
+ for (const fn of this._listeners) fn(this);
235
+ this._watchHistories();
236
+ }
237
+
238
+ /** A change to the set of views: the model is no longer as saved. @protected */
239
+ _changedStructure() {
240
+ this._structure++;
241
+ this._emitEdit();
242
+ }
243
+ }
@@ -0,0 +1,6 @@
1
+ export { DiagramModel } from './DiagramModel.js';
2
+ export { DiagramView } from './DiagramView.js';
3
+ export { ViewSetModel } from './ViewSetModel.js';
4
+ export { ModelSearch, SEARCH_FIELDS } from './ModelSearch.js';
5
+ export { DiagramModelSearch } from './DiagramModelSearch.js';
6
+ export { ReplaceTextCommand } from './ReplaceTextCommand.js';
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Ways to rewrite a name (the nameTransform jArchi script): Title Case,
3
+ * Sentence case, splitting camelCase into words and back, squeezing spaces,
4
+ * upper and lower case. Pure; ModelSearch#transformCommand applies one to
5
+ * a model's names.
6
+ */
7
+
8
+ const words = (s) => String(s ?? '').trim().split(/\s+/).filter(Boolean);
9
+ /** Words not capitalised inside a title. */
10
+ const SMALL = new Set(['a', 'an', 'and', 'as', 'at', 'but', 'by', 'for', 'in', 'of', 'on', 'or', 'the', 'to', 'with']);
11
+ const capital = (w) => w.charAt(0).toUpperCase() + w.slice(1);
12
+
13
+ /** The transforms, in menu order: [key, label, (name) => name]. */
14
+ export const NAME_TRANSFORMS = Object.freeze([
15
+ ['title', 'Title Case', (s) => words(s).map((w, i) => (i && SMALL.has(w.toLowerCase()) ? w.toLowerCase() : capital(w.toLowerCase()))).join(' ')],
16
+ ['sentence', 'Sentence case', (s) => { const t = words(s).join(' ').toLowerCase(); return capital(t); }],
17
+ ['split-camel', 'Split camelCase (OrderService → Order Service)', (s) => String(s ?? '').replace(/([a-z0-9])([A-Z])/g, '$1 $2').replace(/([A-Z]+)([A-Z][a-z])/g, '$1 $2').replace(/[_-]+/g, ' ').replace(/\s+/g, ' ').trim()],
18
+ ['camel', 'camelCase (Order Service → orderService)', (s) => words(String(s ?? '').replace(/[_-]+/g, ' ')).map((w, i) => (i ? capital(w.toLowerCase()) : w.toLowerCase())).join('')],
19
+ ['squeeze', 'Remove extra spaces', (s) => words(s).join(' ')],
20
+ ['upper', 'UPPER CASE', (s) => String(s ?? '').trim().toUpperCase()],
21
+ ['lower', 'lower case', (s) => String(s ?? '').trim().toLowerCase()],
22
+ ]);
23
+
24
+ /** A name transformed (`key` one of NAME_TRANSFORMS'). */
25
+ export function transformName(key, name) {
26
+ const fn = NAME_TRANSFORMS.find(([k]) => k === key)?.[2];
27
+ if (!fn) throw new RangeError(`No such name transform: ${key}`);
28
+ return fn(name);
29
+ }
@@ -0,0 +1,141 @@
1
+ import { Command } from '../CommandHistory.js';
2
+
3
+ /**
4
+ * AddToViewCommand — put one element instance on a view, as one undo step.
5
+ * Given a new model `element` too, the element is created with it (and goes
6
+ * with it on undo). The view's element filter is widened to the element if
7
+ * it was not already in it.
8
+ */
9
+ export class AddToViewCommand extends Command {
10
+ /**
11
+ * @param {ArchimateView} view
12
+ * @param {ElementInstance} instance
13
+ * @param {Object} [options]
14
+ * @param {Object} [options.element] - A new model element the instance shows
15
+ */
16
+ constructor(view, instance, { element = null, label = 'Add to View' } = {}) {
17
+ super(label);
18
+ this.view = view;
19
+ this.instance = instance;
20
+ this.element = element;
21
+ this._createdElement = false;
22
+ this._widenedFilter = false;
23
+ }
24
+
25
+ execute() {
26
+ const { view, instance, element } = this;
27
+ this._createdElement = !!element && !view.model.getElement(element.id);
28
+ if (this._createdElement) view.model.addElement(element);
29
+ this._widenedFilter = !!view.elementIds && !instance.shownIn(view);
30
+ // Mutate rather than replace: other holders keep a reference to this array.
31
+ if (this._widenedFilter) view.elementIds.push(instance.elementId);
32
+ view.addElementInstance(instance);
33
+ }
34
+
35
+ undo() {
36
+ const { view, instance } = this;
37
+ view.removeElementInstance(instance.id);
38
+ if (this._widenedFilter) {
39
+ const at = view.elementIds.indexOf(instance.elementId);
40
+ if (at >= 0) view.elementIds.splice(at, 1);
41
+ }
42
+ if (this._createdElement) view.model.removeElement(this.element.id);
43
+ }
44
+ }
45
+
46
+ /**
47
+ * AddRelationshipToViewCommand — show one relationship instance on a view,
48
+ * as one undo step. Given a new model `relationship` too, it is created with
49
+ * it (and goes with it on undo).
50
+ */
51
+ export class AddRelationshipToViewCommand extends Command {
52
+ /**
53
+ * @param {ArchimateView} view
54
+ * @param {RelationshipInstance} instance
55
+ * @param {Object} [options]
56
+ * @param {Object} [options.relationship] - A new model relationship the instance shows
57
+ */
58
+ constructor(view, instance, { relationship = null, label = 'Add Relationship to View' } = {}) {
59
+ super(label);
60
+ this.view = view;
61
+ this.instance = instance;
62
+ this.relationship = relationship;
63
+ this._createdRelationship = false;
64
+ }
65
+
66
+ execute() {
67
+ const { view, relationship } = this;
68
+ this._createdRelationship = !!relationship && !view.model.getRelationship(relationship.id);
69
+ if (this._createdRelationship) view.model.addRelationship(relationship);
70
+ view.addRelationshipInstance(this.instance);
71
+ }
72
+
73
+ undo() {
74
+ this.view.removeRelationshipInstance(this.instance.id);
75
+ if (this._createdRelationship) this.view.model.removeRelationship(this.relationship.id);
76
+ }
77
+ }
78
+
79
+ /**
80
+ * AddRelationshipCommand — a new relationship in the model, drawn on no view
81
+ * (one a nesting expresses, as Archi adds them). Undo removes it.
82
+ */
83
+ export class AddRelationshipCommand extends Command {
84
+ constructor(model, relationship, label = `Add ${relationship.kind ?? 'relationship'}`) {
85
+ super(label);
86
+ this.model = model;
87
+ this.relationship = relationship;
88
+ }
89
+
90
+ execute() {
91
+ this.model.addRelationship(this.relationship);
92
+ }
93
+
94
+ undo() {
95
+ this.model.removeRelationship(this.relationship.id);
96
+ }
97
+ }
98
+
99
+ /**
100
+ * RemoveRelationshipFromViewCommand — take one relationship instance off a
101
+ * view (the model relationship stays). Undo puts the same instance back.
102
+ */
103
+ export class RemoveRelationshipFromViewCommand extends Command {
104
+ constructor(view, instanceId) {
105
+ super('Remove Relationship from View');
106
+ this.view = view;
107
+ this.instanceId = instanceId;
108
+ this.removed = null;
109
+ }
110
+
111
+ execute() {
112
+ this.removed = this.view.getRelationshipInstance(this.instanceId) ?? null;
113
+ if (this.removed) this.view.removeRelationshipInstance(this.instanceId);
114
+ }
115
+
116
+ undo() {
117
+ if (this.removed) this.view.addRelationshipInstance(this.removed);
118
+ }
119
+ }
120
+
121
+ /**
122
+ * DeleteElementCommand — take one element instance off a view (the model
123
+ * element stays). Undo puts the same instance back, id and all.
124
+ */
125
+ export class DeleteElementCommand extends Command {
126
+ constructor(view, instanceId) {
127
+ super('Delete Element');
128
+ this.view = view;
129
+ this.instanceId = instanceId;
130
+ this.removed = null;
131
+ }
132
+
133
+ execute() {
134
+ this.removed = this.view.getElementInstance(this.instanceId) ?? null;
135
+ if (this.removed) this.view.removeElementInstance(this.instanceId);
136
+ }
137
+
138
+ undo() {
139
+ if (this.removed) this.view.addElementInstance(this.removed);
140
+ }
141
+ }
@@ -0,0 +1,263 @@
1
+ import { Diagram } from '../Diagram.js';
2
+ import { ArchimateNotation, ArchimateViewpoints } from '../../archimate.js';
3
+ import { ITIconNotation } from '../../itIcons.js';
4
+ import { ArchimateValidator } from './ArchimateValidator.js';
5
+ import { ArchimateSpecializationRegistry } from '../../archimateSpecializations.js';
6
+
7
+ /**
8
+ * ArchimateDiagram — builds ArchiMate-notation nodes/edges and renders them
9
+ * through the shared GraphDiagram engine.
10
+ */
11
+ export class ArchimateDiagram extends Diagram {
12
+ static diagramType = 'archimate';
13
+
14
+ constructor(renderer, elements, relationships, options = {}, engine = null) {
15
+ super(renderer, { elements, relationships }, options);
16
+ this.engine = engine;
17
+ }
18
+
19
+ render() {
20
+ const { elements, relationships } = this.data;
21
+ const options = this.options;
22
+ const {
23
+ layerColors, relationshipStyles, defaultIcons, iconChoiceIndex = 0, elementWidth = 120, elementHeight = 55,
24
+ archimateVersion = '4', useDistinctShapes = false, iconSet = 'glyph',
25
+ validate = true, invalidRelationships = 'highlight', onValidationWarning, annotations = [], viewpoint = null,
26
+ viewpointMode = 'fade', customViewpoints = [], ...rest
27
+ } = options;
28
+ const nodeOpts = {
29
+ layerColors, defaultIcons, iconChoiceIndex, elementWidth, elementHeight,
30
+ archimateVersion, useDistinctShapes, iconSet,
31
+ };
32
+ const nodes = elements.map(element => ArchimateDiagram.buildNode(element, nodeOpts));
33
+
34
+ // Viewpoint filtering: hide or fade element types that do not belong to
35
+ // the active viewpoint. Annotations are never affected.
36
+ const effectiveViewpoint = viewpoint && viewpoint !== 'All' ? viewpoint : null;
37
+ const allowedTypes = effectiveViewpoint
38
+ ? new Set(ArchimateViewpoints.allowedElementTypes(viewpoint, archimateVersion, customViewpoints))
39
+ : null;
40
+ let visibleNodes = nodes;
41
+ let visibleEdges = relationships;
42
+ if (effectiveViewpoint) {
43
+ const isAllowed = (type) => allowedTypes.has(type);
44
+ const allowedNodeIds = new Set();
45
+ for (const node of nodes) {
46
+ if (isAllowed(node.type)) allowedNodeIds.add(node.id);
47
+ }
48
+ visibleNodes = [];
49
+ for (const node of nodes) {
50
+ const allowed = allowedNodeIds.has(node.id);
51
+ if (allowed) {
52
+ visibleNodes.push(node);
53
+ } else if (viewpointMode === 'fade') {
54
+ node.opacity = 0.2;
55
+ visibleNodes.push(node);
56
+ }
57
+ // viewpointMode === 'hide' drops the node entirely.
58
+ }
59
+ visibleEdges = [];
60
+ for (const rel of relationships) {
61
+ const sourceAllowed = allowedNodeIds.has(rel.source);
62
+ const targetAllowed = allowedNodeIds.has(rel.target);
63
+ if (sourceAllowed && targetAllowed) {
64
+ visibleEdges.push(rel);
65
+ } else if (viewpointMode === 'fade' && (sourceAllowed || targetAllowed)) {
66
+ rel.opacity = 0.2;
67
+ visibleEdges.push(rel);
68
+ }
69
+ // In hide mode, drop edges touching a hidden node.
70
+ }
71
+ }
72
+
73
+ // Annotations are diagram-only sticky-note comments, not part of the
74
+ // ArchiMate model. They are appended as plain graphDiagram nodes so they
75
+ // get drag/resize/delete/properties for free; mutating them in place
76
+ // keeps the caller's annotations array in sync across rerenders.
77
+ for (const annotation of annotations) {
78
+ if (!annotation.id) annotation.id = `note_${Math.random().toString(36).slice(2, 9)}`;
79
+ annotation.shape = 'note';
80
+ annotation.labelPosition = annotation.labelPosition || 'inside';
81
+ annotation.resizable = annotation.resizable !== false;
82
+ visibleNodes.push(annotation);
83
+ }
84
+
85
+ // Validate the model before building edges so warnings can be attached
86
+ // to the edges that GraphDiagram will actually draw.
87
+ // 'off' checks nothing; 'tooltip' warns on hover only; 'highlight' also draws the line red and dashed.
88
+ const warnings = validate && invalidRelationships !== 'off'
89
+ // A plain line on a view (viewConnection) is no ArchiMate relationship: nothing to check.
90
+ ? ArchimateValidator.validateModel(elements, relationships.filter(r => !r.viewConnection), archimateVersion, viewpoint, customViewpoints)
91
+ : [];
92
+ const warningByEdge = new Map();
93
+ for (const w of warnings) {
94
+ if (w.type === 'relationship' && w.relationship) {
95
+ warningByEdge.set(w.relationship, w);
96
+ }
97
+ if (typeof onValidationWarning === 'function') {
98
+ onValidationWarning(w);
99
+ }
100
+ }
101
+
102
+ // Build edges in place on the caller's relationships array so drag-to-
103
+ // create and property-edits persist back into the source array across
104
+ // rerenders (e.g. after switching ArchiMate version or applying a style).
105
+ for (let i = 0; i < visibleEdges.length; i++) {
106
+ ArchimateDiagram.buildEdge(visibleEdges[i], { relationshipStyles, warningByEdge, highlight: invalidRelationships === 'highlight' });
107
+ }
108
+
109
+ // ArchiMate tools draw relationships over elements (a line into a nested element stays visible).
110
+ this.engine.graphDiagram(visibleNodes, visibleEdges, { edgeColor: '#666666', edgesOnTop: true, ...rest });
111
+
112
+ // Expose warnings on the engine so callers can read them back after render.
113
+ if (this.engine) {
114
+ this.engine._archimateWarnings = warnings;
115
+ }
116
+
117
+ // Diagram-wide ArchiMate settings survive a rerender so live icon-choice
118
+ // changes can be applied later (see RenderEngine._archimateSetIconChoiceIndex).
119
+ this.engine._archimateOptions = {
120
+ layerColors, defaultIcons, iconChoiceIndex, relationshipStyles, elementWidth, elementHeight,
121
+ archimateVersion, useDistinctShapes, iconSet, viewpoint,
122
+ viewpointMode, customViewpoints,
123
+ };
124
+ }
125
+
126
+ static elementLayer(element, version) {
127
+ // An explicit `element.layer` always wins, then a known official or IT
128
+ // extension type, then the prefix heuristic for custom names.
129
+ if (element?.layer) return element.layer;
130
+ const itType = typeof element?.type === 'string' ? ITIconNotation.elementType(element.type) : undefined;
131
+ if (itType?.layer?.name) return itType.layer.name;
132
+ return ArchimateNotation.elementLayer(element, version);
133
+ }
134
+
135
+ static layerColor(layer, layerColors, ownColor) {
136
+ return layerColors?.[layer] || ownColor || ArchimateNotation.layer(layer)?.color || ArchimateNotation.layer('other').color;
137
+ }
138
+
139
+ static defaultIcon(element, layer, defaultIcons, iconChoiceIndex = 0, version) {
140
+ if (defaultIcons?.[layer]) return defaultIcons[layer];
141
+ const type = typeof element?.type === 'string'
142
+ ? ArchimateDiagram.resolveElementType(element.type, version)
143
+ : undefined;
144
+ if (type) {
145
+ // IT extension types carry a single icon, not a choice list.
146
+ if (!type.iconChoices) return type.icon;
147
+ const choices = type.iconChoices;
148
+ return choices[iconChoiceIndex] ?? choices[0];
149
+ }
150
+ return ArchimateNotation.layer(layer)?.defaultIcon || ArchimateNotation.layer('other').defaultIcon;
151
+ }
152
+
153
+ static relationshipStyle(kind, relationshipStyles) {
154
+ return relationshipStyles?.[kind] || ArchimateNotation.relationshipType(kind);
155
+ }
156
+
157
+ /** Live diagram-wide setting: which choice in each element type's own
158
+ * `iconChoices` is used as the DEFAULT icon for a node that doesn't carry
159
+ * its own explicit `icon`/`iconUrl`. Changing it re-derives the icon for
160
+ * every node that hasn't been individually customised, leaving any node
161
+ * whose icon was deliberately picked untouched. No-op if this isn't (or
162
+ * is no longer) an ArchiMate diagram. */
163
+ static setIconChoiceIndex(engine, newIndex) {
164
+ const opts = engine?._archimateOptions;
165
+ if (!opts || !engine._chartState?.nodes) return;
166
+ const oldIndex = opts.iconChoiceIndex ?? 0;
167
+ for (const node of engine._chartState.nodes) {
168
+ if (node.iconUrl) continue;
169
+ const layer = ArchimateDiagram.elementLayer(node, opts.archimateVersion);
170
+ const wasAuto = node.icon === ArchimateDiagram.defaultIcon(node, layer, opts.defaultIcons, oldIndex, opts.archimateVersion);
171
+ if (wasAuto) node.icon = ArchimateDiagram.defaultIcon(node, layer, opts.defaultIcons, newIndex, opts.archimateVersion);
172
+ }
173
+ opts.iconChoiceIndex = newIndex;
174
+ engine._graphDiagram?._rerenderGraph();
175
+ }
176
+
177
+ static cornerStyle(element, layer, version) {
178
+ if (element?.cornerStyle) return element.cornerStyle;
179
+ if (layer === 'motivation') return 'chamfered';
180
+ const type = typeof element?.type === 'string'
181
+ ? ArchimateDiagram.resolveElementType(element.type, version)
182
+ : undefined;
183
+ const aspect = element?.aspect || type?.aspect;
184
+ return aspect === 'behavior' ? 'rounded' : 'sharp';
185
+ }
186
+
187
+ /** Resolve an element `type` to either an official ArchiMate type or an
188
+ * IT/infrastructure extension type. Returns the matching descriptor object
189
+ * (which has the same `layer`/`aspect`/`icon`/`notationShape`/`description`
190
+ * shape in both cases) or undefined. */
191
+ static resolveElementType(typeName, archimateVersion = '4') {
192
+ if (typeof typeName !== 'string') return undefined;
193
+ return ArchimateNotation.elementType(typeName, archimateVersion)
194
+ || ITIconNotation.elementType(typeName);
195
+ }
196
+
197
+ static buildNode(element, {
198
+ layerColors, defaultIcons, iconChoiceIndex = 0, elementWidth = 120, elementHeight = 55,
199
+ archimateVersion = '4', useDistinctShapes = false, iconSet = 'glyph',
200
+ } = {}) {
201
+ const resolved = archimateVersion === '4' ? ArchimateNotation.migrateElementToV4(element) : element;
202
+ ArchimateSpecializationRegistry.applyToNode(resolved);
203
+ const layer = ArchimateDiagram.elementLayer(resolved, archimateVersion);
204
+ const type = ArchimateDiagram.resolveElementType(resolved.type, archimateVersion);
205
+ const useDistinctShape = resolved.useDistinctShape ?? useDistinctShapes;
206
+ const notationShape = useDistinctShape ? type?.notationShape : undefined;
207
+ const glyphBadges = (resolved.iconSet ?? iconSet) !== 'emoji';
208
+
209
+ // CRITICAL: Use diagramInstanceId (not elementId) as the node's unique ID
210
+ // This allows multiple instances of the same element to render as separate visual nodes
211
+ const nodeId = resolved.diagramInstanceId || resolved.id;
212
+ // A view-only box (note, image, canvas or sketch box) has no ArchiMate type: no type
213
+ // icon, and a plain white fill unless it sets one (a note keeps its own default).
214
+ const viewBox = resolved.viewObject && resolved.shape !== 'note';
215
+
216
+ return {
217
+ ...resolved,
218
+ id: nodeId, // Override to use diagramInstanceId for uniqueness
219
+ layer,
220
+ shape: resolved.shape || notationShape || 'rect',
221
+ color: resolved.color || (viewBox ? '#ffffff' : ArchimateDiagram.layerColor(layer, layerColors, type?.ownColor)),
222
+ width: resolved.width ?? elementWidth,
223
+ height: resolved.height ?? elementHeight,
224
+ strokeColor: resolved.strokeColor || '#000000',
225
+ strokeWidth: resolved.strokeWidth ?? 1.2,
226
+ // The ArchiMate notation draws a Grouping with a dashed outline.
227
+ ...(type?.name === 'grouping' && { strokeDasharray: resolved.strokeDasharray ?? '6 3' }),
228
+ labelPosition: resolved.labelPosition || (notationShape ? 'below' : 'inside'),
229
+ iconPosition: resolved.iconPosition || 'corner',
230
+ cornerStyle: ArchimateDiagram.cornerStyle(resolved, layer, archimateVersion),
231
+ iconShape: resolved.viewObject ? undefined : resolved.iconShape || ((resolved.icon || resolved.iconUrl) && glyphBadges ? undefined : (notationShape || !glyphBadges ? undefined : type?.notationShape)),
232
+ icon: resolved.viewObject ? resolved.icon : resolved.icon || (resolved.iconUrl || notationShape || (glyphBadges && type?.notationShape)
233
+ ? undefined
234
+ : ArchimateDiagram.defaultIcon(resolved, layer, defaultIcons, iconChoiceIndex, archimateVersion)),
235
+ };
236
+ }
237
+
238
+ static buildEdge(relationship, { relationshipStyles, warningByEdge, highlight = true } = {}) {
239
+ const style = ArchimateDiagram.relationshipStyle(relationship.kind, relationshipStyles);
240
+ // Mutate the caller's original relationship object rather than returning
241
+ // a shallow copy, so edits made via the context-menu Properties dialog
242
+ // persist back into the source array (engine._chartState.relationships).
243
+ relationship.lineStyle = relationship.lineStyle || style.lineStyle;
244
+ relationship.arrowhead = relationship.arrowhead || style.arrowhead || 'none';
245
+ relationship.arrowheadStart = relationship.arrowheadStart || style.arrowheadStart;
246
+
247
+ const warning = warningByEdge?.get(relationship);
248
+ if (warning) {
249
+ relationship._archimateWarning = warning.message;
250
+ if (highlight) {
251
+ relationship.color = relationship.color || '#e74c3c';
252
+ relationship.dasharray = relationship.dasharray || '4 3';
253
+ }
254
+ const existingTooltip = relationship.tooltip || '';
255
+ const warningTooltip = `⚠️ ${warning.message}`;
256
+ relationship.tooltip = existingTooltip
257
+ ? `${existingTooltip}\n${warningTooltip}`
258
+ : warningTooltip;
259
+ }
260
+
261
+ return relationship;
262
+ }
263
+ }