@peter.prib/renderengine 0.0.0-stage → 0.2.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 (451) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +203 -2
  3. package/REFERENCE.md +2198 -0
  4. package/dist/renderengine-workspace.umd.js +46905 -0
  5. package/dist/renderengine.umd.js +42223 -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 +589 -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 +58 -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/ArcGauge.js +55 -0
  132. package/src/charting/charts/AreaChart.js +71 -0
  133. package/src/charting/charts/BarChart.js +80 -0
  134. package/src/charting/charts/BarChart3D.js +56 -0
  135. package/src/charting/charts/BarChart3DOrbit.js +53 -0
  136. package/src/charting/charts/BarChartBase.js +70 -0
  137. package/src/charting/charts/BarGauge.js +42 -0
  138. package/src/charting/charts/BoxPlotChart.js +41 -0
  139. package/src/charting/charts/BubbleChart.js +99 -0
  140. package/src/charting/charts/BubbleChart3D.js +78 -0
  141. package/src/charting/charts/BulletGauge.js +87 -0
  142. package/src/charting/charts/CalendarHeatmapChart.js +204 -0
  143. package/src/charting/charts/CandlestickChart.js +54 -0
  144. package/src/charting/charts/ChordDiagram.js +130 -0
  145. package/src/charting/charts/DensityChart.js +73 -0
  146. package/src/charting/charts/DialGauge.js +65 -0
  147. package/src/charting/charts/DonutChart.js +15 -0
  148. package/src/charting/charts/FunnelChart.js +47 -0
  149. package/src/charting/charts/GanttChart.js +201 -0
  150. package/src/charting/charts/GaugeChart.js +175 -0
  151. package/src/charting/charts/GeoMapChart.js +146 -0
  152. package/src/charting/charts/GroupedBarChart.js +88 -0
  153. package/src/charting/charts/GroupedDistributionChart.js +70 -0
  154. package/src/charting/charts/HeatmapChart.js +80 -0
  155. package/src/charting/charts/HierarchyChart.js +39 -0
  156. package/src/charting/charts/HistogramChart.js +45 -0
  157. package/src/charting/charts/KpiTile.js +72 -0
  158. package/src/charting/charts/LagPlotChart.js +41 -0
  159. package/src/charting/charts/LineChart.js +124 -0
  160. package/src/charting/charts/MultiRingGauge.js +54 -0
  161. package/src/charting/charts/OutlineChart.js +95 -0
  162. package/src/charting/charts/ParallelCoordinatesChart.js +130 -0
  163. package/src/charting/charts/PieChart.js +56 -0
  164. package/src/charting/charts/PipeChart.js +88 -0
  165. package/src/charting/charts/PopulationPyramidChart.js +106 -0
  166. package/src/charting/charts/QQPlotChart.js +64 -0
  167. package/src/charting/charts/RadarChart.js +76 -0
  168. package/src/charting/charts/RadialBarChart.js +96 -0
  169. package/src/charting/charts/RingGauge.js +23 -0
  170. package/src/charting/charts/SankeyDiagram.js +174 -0
  171. package/src/charting/charts/ScatterChart.js +104 -0
  172. package/src/charting/charts/StackedAreaChart.js +15 -0
  173. package/src/charting/charts/StackedBarChart.js +33 -0
  174. package/src/charting/charts/StackedBarChart3DOrbit.js +58 -0
  175. package/src/charting/charts/StreamGraphChart.js +131 -0
  176. package/src/charting/charts/SunburstChart.js +57 -0
  177. package/src/charting/charts/ThermometerGauge.js +43 -0
  178. package/src/charting/charts/TreemapChart.js +54 -0
  179. package/src/charting/charts/ViolinChart.js +37 -0
  180. package/src/charting/charts/WaterfallChart.js +66 -0
  181. package/src/charting/charts/WordCloudChart.js +104 -0
  182. package/src/charting/diagramModel/AddViewCommand.js +33 -0
  183. package/src/charting/diagramModel/DiagramModel.js +39 -0
  184. package/src/charting/diagramModel/DiagramModelSearch.js +22 -0
  185. package/src/charting/diagramModel/DiagramView.js +50 -0
  186. package/src/charting/diagramModel/ModelHistory.js +43 -0
  187. package/src/charting/diagramModel/ModelReport.js +153 -0
  188. package/src/charting/diagramModel/ModelSearch.js +223 -0
  189. package/src/charting/diagramModel/RemoveViewCommand.js +25 -0
  190. package/src/charting/diagramModel/RenameViewCommand.js +21 -0
  191. package/src/charting/diagramModel/ReplaceTextCommand.js +25 -0
  192. package/src/charting/diagramModel/ViewSetChecker.js +34 -0
  193. package/src/charting/diagramModel/ViewSetModel.js +243 -0
  194. package/src/charting/diagramModel/index.js +6 -0
  195. package/src/charting/diagramModel/nameTransforms.js +29 -0
  196. package/src/charting/diagrams/ArchimateCommands.js +141 -0
  197. package/src/charting/diagrams/ArchimateDiagram.js +263 -0
  198. package/src/charting/diagrams/ArchimateModel.js +1155 -0
  199. package/src/charting/diagrams/ArchimateModelChecker.js +125 -0
  200. package/src/charting/diagrams/ArchimateModelReport.js +128 -0
  201. package/src/charting/diagrams/ArchimateModelSearch.js +41 -0
  202. package/src/charting/diagrams/ArchimateValidator.js +357 -0
  203. package/src/charting/diagrams/CanvasView.js +112 -0
  204. package/src/charting/diagrams/ContextMenu.js +37 -0
  205. package/src/charting/diagrams/DataModelDiagram.js +86 -0
  206. package/src/charting/diagrams/DataModelRelationshipStrategy.js +38 -0
  207. package/src/charting/diagrams/DerivedRelationships.js +102 -0
  208. package/src/charting/diagrams/EbnfDiagram.js +39 -0
  209. package/src/charting/diagrams/EdgeGeometry.js +553 -0
  210. package/src/charting/diagrams/EditViewItemCommand.js +128 -0
  211. package/src/charting/diagrams/ElementInstance.js +157 -0
  212. package/src/charting/diagrams/GraphDiagram.js +1340 -0
  213. package/src/charting/diagrams/GraphDiagram3D.js +152 -0
  214. package/src/charting/diagrams/GraphMetrics.js +81 -0
  215. package/src/charting/diagrams/GridOverlay.js +137 -0
  216. package/src/charting/diagrams/ImportRowsCommand.js +62 -0
  217. package/src/charting/diagrams/LabelHelper.js +108 -0
  218. package/src/charting/diagrams/MergeElementsCommand.js +101 -0
  219. package/src/charting/diagrams/NestInstanceCommand.js +34 -0
  220. package/src/charting/diagrams/NodeGeometry.js +158 -0
  221. package/src/charting/diagrams/PlaceItemsCommand.js +77 -0
  222. package/src/charting/diagrams/RadialLayout.js +101 -0
  223. package/src/charting/diagrams/RelationshipInstance.js +93 -0
  224. package/src/charting/diagrams/RemoveGroupFromViewCommand.js +28 -0
  225. package/src/charting/diagrams/RemoveLineCommand.js +27 -0
  226. package/src/charting/diagrams/ShowElementCommand.js +43 -0
  227. package/src/charting/diagrams/SvgCoordinate.js +17 -0
  228. package/src/charting/diagrams/SvgZoom.js +127 -0
  229. package/src/charting/diagrams/Tooltip.js +62 -0
  230. package/src/charting/diagrams/ViewConnectionInstance.js +102 -0
  231. package/src/charting/diagrams/ViewObjectInstance.js +56 -0
  232. package/src/charting/diagrams/commands/AddEdgeCommand.js +34 -0
  233. package/src/charting/diagrams/commands/AddNodeCommand.js +28 -0
  234. package/src/charting/diagrams/commands/AddWaypointCommand.js +27 -0
  235. package/src/charting/diagrams/commands/CreateFolderCommand.js +27 -0
  236. package/src/charting/diagrams/commands/DeleteEdgeCommand.js +30 -0
  237. package/src/charting/diagrams/commands/DeleteFolderCommand.js +47 -0
  238. package/src/charting/diagrams/commands/DeleteNodeCommand.js +35 -0
  239. package/src/charting/diagrams/commands/DeleteWaypointCommand.js +24 -0
  240. package/src/charting/diagrams/commands/GraphCommand.js +65 -0
  241. package/src/charting/diagrams/commands/InvertEdgeCommand.js +24 -0
  242. package/src/charting/diagrams/commands/MoveNodeCommand.js +44 -0
  243. package/src/charting/diagrams/commands/MoveWaypointCommand.js +27 -0
  244. package/src/charting/diagrams/commands/RenameEdgeCommand.js +23 -0
  245. package/src/charting/diagrams/commands/RenameFolderCommand.js +31 -0
  246. package/src/charting/diagrams/commands/RenameNodeCommand.js +27 -0
  247. package/src/charting/diagrams/commands/ResizeNodeCommand.js +46 -0
  248. package/src/charting/diagrams/commands/UpdateEdgeSideCommand.js +40 -0
  249. package/src/charting/diagrams/commands/index.js +17 -0
  250. package/src/charting/diagrams/duplicates.js +49 -0
  251. package/src/charting/diagrams/nesting.js +30 -0
  252. package/src/charting/diagrams/roadmap.js +77 -0
  253. package/src/charting/edgeMarkers/ArrowMarker.js +15 -0
  254. package/src/charting/edgeMarkers/CircleMarker.js +13 -0
  255. package/src/charting/edgeMarkers/CrowsFootMarker.js +16 -0
  256. package/src/charting/edgeMarkers/DiamondMarker.js +15 -0
  257. package/src/charting/edgeMarkers/EdgeMarker.js +34 -0
  258. package/src/charting/edgeMarkers/HalfArrowMarker.js +8 -0
  259. package/src/charting/edgeMarkers/HollowDiamondMarker.js +18 -0
  260. package/src/charting/edgeMarkers/HollowTriangleMarker.js +18 -0
  261. package/src/charting/edgeMarkers/OpenArrowMarker.js +17 -0
  262. package/src/charting/edgeMarkers/index.js +27 -0
  263. package/src/charting/edgeStyle/EdgeStyleCascade.js +22 -0
  264. package/src/charting/edgeStyle/EdgeStyleDialog.js +51 -0
  265. package/src/charting/edgeStyle/EdgeStyleSchema.js +43 -0
  266. package/src/charting/edgeStyle/SetStyleCommand.js +12 -0
  267. package/src/charting/edgeStyle/index.js +4 -0
  268. package/src/charting/emphasis/EmphasisRule.js +42 -0
  269. package/src/charting/emphasis/HighlightRule.js +24 -0
  270. package/src/charting/gauges/ArcTrack.js +51 -0
  271. package/src/charting/gauges/GaugeAnimation.js +51 -0
  272. package/src/charting/gauges/GaugeBands.js +48 -0
  273. package/src/charting/gauges/GaugeScale.js +87 -0
  274. package/src/charting/gauges/GaugeTrack.js +44 -0
  275. package/src/charting/gauges/GaugeValue.js +61 -0
  276. package/src/charting/gauges/HorizontalTrack.js +14 -0
  277. package/src/charting/gauges/LinearTrack.js +29 -0
  278. package/src/charting/gauges/Sparkline.js +42 -0
  279. package/src/charting/gauges/VerticalTrack.js +17 -0
  280. package/src/charting/glyphs/ArrowGlyph.js +21 -0
  281. package/src/charting/glyphs/BatteryGlyph.js +18 -0
  282. package/src/charting/glyphs/ChevronGlyph.js +18 -0
  283. package/src/charting/glyphs/CircleGlyph.js +15 -0
  284. package/src/charting/glyphs/CloudGlyph.js +19 -0
  285. package/src/charting/glyphs/ComponentGlyph.js +18 -0
  286. package/src/charting/glyphs/ConstraintGlyph.js +24 -0
  287. package/src/charting/glyphs/ContractBoxGlyph.js +10 -0
  288. package/src/charting/glyphs/CubeGlyph.js +19 -0
  289. package/src/charting/glyphs/CylinderGlyph.js +19 -0
  290. package/src/charting/glyphs/DashedDoubleArrowGlyph.js +11 -0
  291. package/src/charting/glyphs/DeviceGlyph.js +17 -0
  292. package/src/charting/glyphs/DiamondGlyph.js +17 -0
  293. package/src/charting/glyphs/DocumentGlyph.js +17 -0
  294. package/src/charting/glyphs/DoubleArrowGlyph.js +23 -0
  295. package/src/charting/glyphs/DoubleCircleGlyph.js +24 -0
  296. package/src/charting/glyphs/EllipseGlyph.js +18 -0
  297. package/src/charting/glyphs/FactoryGlyph.js +20 -0
  298. package/src/charting/glyphs/FlagGlyph.js +16 -0
  299. package/src/charting/glyphs/GapCircleGlyph.js +17 -0
  300. package/src/charting/glyphs/GearGlyph.js +37 -0
  301. package/src/charting/glyphs/Glyph.js +98 -0
  302. package/src/charting/glyphs/GroupingBoxGlyph.js +13 -0
  303. package/src/charting/glyphs/HalfCircleGlyph.js +22 -0
  304. package/src/charting/glyphs/HexagonGlyph.js +28 -0
  305. package/src/charting/glyphs/IconGlyph.js +22 -0
  306. package/src/charting/glyphs/ImageGlyph.js +16 -0
  307. package/src/charting/glyphs/JunctionGlyph.js +17 -0
  308. package/src/charting/glyphs/LollipopGlyph.js +22 -0
  309. package/src/charting/glyphs/MagnifierGlyph.js +17 -0
  310. package/src/charting/glyphs/NoteGlyph.js +33 -0
  311. package/src/charting/glyphs/ObjectBoxGlyph.js +21 -0
  312. package/src/charting/glyphs/OrJunctionGlyph.js +17 -0
  313. package/src/charting/glyphs/ParallelogramGlyph.js +20 -0
  314. package/src/charting/glyphs/PersonGlyph.js +23 -0
  315. package/src/charting/glyphs/PillGlyph.js +23 -0
  316. package/src/charting/glyphs/PinGlyph.js +18 -0
  317. package/src/charting/glyphs/PrincipleGlyph.js +23 -0
  318. package/src/charting/glyphs/ProductBoxGlyph.js +16 -0
  319. package/src/charting/glyphs/RectGlyph.js +15 -0
  320. package/src/charting/glyphs/RoundedBoxGlyph.js +13 -0
  321. package/src/charting/glyphs/StackGlyph.js +14 -0
  322. package/src/charting/glyphs/StepsGlyph.js +20 -0
  323. package/src/charting/glyphs/StickFigureGlyph.js +32 -0
  324. package/src/charting/glyphs/SystemSoftwareBoxGlyph.js +16 -0
  325. package/src/charting/glyphs/TabbedBoxGlyph.js +37 -0
  326. package/src/charting/glyphs/TargetGlyph.js +23 -0
  327. package/src/charting/glyphs/WavyBoxGlyph.js +17 -0
  328. package/src/charting/glyphs/WheelGlyph.js +28 -0
  329. package/src/charting/glyphs/drawGlyph.js +28 -0
  330. package/src/charting/glyphs/glyphSvg.js +55 -0
  331. package/src/charting/glyphs/index.js +109 -0
  332. package/src/charting/modelTree/AnalysisPanel.js +159 -0
  333. package/src/charting/modelTree/DiagramTabs.js +217 -0
  334. package/src/charting/modelTree/ModelTree.js +164 -0
  335. package/src/charting/modelTree/ModelTreePanel.js +914 -0
  336. package/src/charting/modelTree/TreeBuilder.js +238 -0
  337. package/src/charting/modelTree/TreeModeRegistry.js +51 -0
  338. package/src/charting/modelTree/TreeViewMode.js +110 -0
  339. package/src/charting/modelTree/buildFilterTrees.js +138 -0
  340. package/src/charting/modelTree/modes/FlatTreeMode.js +46 -0
  341. package/src/charting/modelTree/modes/LayerGroupedTreeMode.js +62 -0
  342. package/src/charting/modelTree/modes/TypeGroupedTreeMode.js +60 -0
  343. package/src/charting/modelTree/treeLayers.js +11 -0
  344. package/src/charting/report/reportHtml.js +82 -0
  345. package/src/charting/report/reportViewer.js +118 -0
  346. package/src/charting/shapes/CircleShape.js +19 -0
  347. package/src/charting/shapes/PathShape.js +17 -0
  348. package/src/charting/shapes/RectShape.js +20 -0
  349. package/src/charting/shapes/Shape.js +20 -0
  350. package/src/charting/shapes/ShapeFactory.js +23 -0
  351. package/src/charting/storage/LocalJsonStore.js +43 -0
  352. package/src/charting/templates/ActorTemplate.js +36 -0
  353. package/src/charting/templates/BoxTemplate.js +27 -0
  354. package/src/charting/templates/CircleTemplate.js +18 -0
  355. package/src/charting/templates/ClassTemplate.js +20 -0
  356. package/src/charting/templates/CloudTemplate.js +43 -0
  357. package/src/charting/templates/ComponentTemplate.js +19 -0
  358. package/src/charting/templates/CylinderTemplate.js +30 -0
  359. package/src/charting/templates/DataStoreTemplate.js +16 -0
  360. package/src/charting/templates/DiamondTemplate.js +10 -0
  361. package/src/charting/templates/DocumentTemplate.js +32 -0
  362. package/src/charting/templates/EllipseTemplate.js +15 -0
  363. package/src/charting/templates/FinalStateTemplate.js +12 -0
  364. package/src/charting/templates/GlyphTemplate.js +47 -0
  365. package/src/charting/templates/HexagonTemplate.js +17 -0
  366. package/src/charting/templates/LifelineTemplate.js +20 -0
  367. package/src/charting/templates/ManualInputTemplate.js +12 -0
  368. package/src/charting/templates/NoteTemplate.js +23 -0
  369. package/src/charting/templates/OctagonTemplate.js +7 -0
  370. package/src/charting/templates/PackageTemplate.js +25 -0
  371. package/src/charting/templates/ParallelogramTemplate.js +11 -0
  372. package/src/charting/templates/PentagonTemplate.js +5 -0
  373. package/src/charting/templates/PolygonTemplate.js +18 -0
  374. package/src/charting/templates/PredefinedProcessTemplate.js +13 -0
  375. package/src/charting/templates/RectangleTemplate.js +28 -0
  376. package/src/charting/templates/RegularPolygonTemplate.js +21 -0
  377. package/src/charting/templates/RoundedRectangleTemplate.js +5 -0
  378. package/src/charting/templates/StadiumTemplate.js +8 -0
  379. package/src/charting/templates/StarTemplate.js +17 -0
  380. package/src/charting/templates/SwimlaneTemplate.js +18 -0
  381. package/src/charting/templates/Template.js +208 -0
  382. package/src/charting/templates/TrapezoidTemplate.js +11 -0
  383. package/src/charting/templates/TriangleTemplate.js +12 -0
  384. package/src/charting/templates/index.js +31 -0
  385. package/src/charting/templates/outline.js +59 -0
  386. package/src/charting/templates/svg.js +19 -0
  387. package/src/charting/textToShapes.js +61 -0
  388. package/src/charting/toolbar/ToolbarButton.js +38 -0
  389. package/src/charting/toolbar/ToolbarCheckbox.js +31 -0
  390. package/src/charting/toolbar/ToolbarItem.js +19 -0
  391. package/src/charting/toolbar/ToolbarMenu.js +36 -0
  392. package/src/charting/toolbar/ToolbarSelect.js +38 -0
  393. package/src/charting/toolbar/ToolbarSeparator.js +7 -0
  394. package/src/charting/toolbar/ToolbarText.js +22 -0
  395. package/src/charting/toolbar/index.js +8 -0
  396. package/src/charting/toolbar/pickFile.js +14 -0
  397. package/src/charting/viewDecorations.js +85 -0
  398. package/src/charting/zOrder.js +57 -0
  399. package/src/csvTable.js +61 -0
  400. package/src/datamodel.js +122 -0
  401. package/src/datawindow/BoundedWindow.js +36 -0
  402. package/src/datawindow/FlatDataWindow.js +34 -0
  403. package/src/datawindow/GraphDataWindow.js +40 -0
  404. package/src/datawindow/GroupedSampleDataWindow.js +16 -0
  405. package/src/datawindow/SeriesDataWindow.js +42 -0
  406. package/src/datawindow/index.js +31 -0
  407. package/src/diagramCatalog.js +30 -0
  408. package/src/ebnfDiagram.js +57 -0
  409. package/src/ebnfParser.js +129 -0
  410. package/src/exportImage.js +233 -0
  411. package/src/index.js +2636 -0
  412. package/src/itIcons.js +84 -0
  413. package/src/kernelExpr.js +243 -0
  414. package/src/propertiesDialog.js +463 -0
  415. package/src/railroadDiagram.js +571 -0
  416. package/src/treeModeCatalog.js +16 -0
  417. package/src/workspace/ContextBus.js +79 -0
  418. package/src/workspace/EditorShell.js +67 -0
  419. package/src/workspace/Part.js +163 -0
  420. package/src/workspace/PartFactory.js +49 -0
  421. package/src/workspace/PartRegistry.js +86 -0
  422. package/src/workspace/Workspace.js +321 -0
  423. package/src/workspace/archimateServices.js +33 -0
  424. package/src/workspace/dom.js +120 -0
  425. package/src/workspace/index.js +75 -0
  426. package/src/workspace/layout/GridNode.js +280 -0
  427. package/src/workspace/layout/LayoutNode.js +89 -0
  428. package/src/workspace/layout/PartNode.js +77 -0
  429. package/src/workspace/layout/SplitNode.js +114 -0
  430. package/src/workspace/layout/TabsNode.js +191 -0
  431. package/src/workspace/layout/index.js +24 -0
  432. package/src/workspace/parts/AdapterPart.js +33 -0
  433. package/src/workspace/parts/ArchimateCanvasPart.js +345 -0
  434. package/src/workspace/parts/ArchimateEditorPart.js +79 -0
  435. package/src/workspace/parts/ChartPart.js +115 -0
  436. package/src/workspace/parts/ContentPart.js +34 -0
  437. package/src/workspace/parts/DetailPart.js +46 -0
  438. package/src/workspace/parts/DiagramEditorPart.js +135 -0
  439. package/src/workspace/parts/EditorPart.js +388 -0
  440. package/src/workspace/parts/HtmlPart.js +25 -0
  441. package/src/workspace/parts/ListPart.js +57 -0
  442. package/src/workspace/parts/ModelFile.js +187 -0
  443. package/src/workspace/parts/ModelsPart.js +135 -0
  444. package/src/workspace/styles.js +258 -0
  445. package/src/workspace/themes.js +96 -0
  446. package/src/workspace/workArea.js +413 -0
  447. package/src/workspace/workAreaModel.js +197 -0
  448. package/src/workspace.js +16 -0
  449. package/src/zip/ZipArchive.js +160 -0
  450. package/src/zip/crc32.js +25 -0
  451. package/src/zip/inflate.js +159 -0
@@ -0,0 +1,345 @@
1
+ import { render } from '../dom.js';
2
+ import { EditorShell } from '../EditorShell.js';
3
+ import { EditorPart } from './EditorPart.js';
4
+ import { ArchimateModel } from '../../charting/diagrams/ArchimateModel.js';
5
+ import { ArchimateCanvasEditor, ArchimatePalette, typeTitle } from '../../charting/archimate/index.js';
6
+ import { ArchimateNotation } from '../../archimate.js';
7
+ import { MenuBar } from '../../charting/MenuBar.js';
8
+ import { ToolbarText } from '../../charting/toolbar/index.js';
9
+ import { ViewTabStrip } from '../../charting/ViewTabStrip.js';
10
+ import { FormDialog } from '../../charting/FormDialog.js';
11
+ import { CsvImportDialog } from '../../charting/archimate/CsvImportDialog.js';
12
+ import { pickFile } from '../../charting/toolbar/pickFile.js';
13
+ import { SettingsManager } from '../../charting/SettingsManager.js';
14
+ import { SettingsViewPropertiesDialog } from '../../charting/SettingsViewPropertiesDialog.js';
15
+ import { CanvasTemplateLibrary } from '../../charting/canvas/CanvasTemplateLibrary.js';
16
+ import { CanvasTemplateMenu } from '../../charting/canvas/CanvasTemplateMenu.js';
17
+ import { CanvasPalette } from '../../charting/canvas/CanvasPalette.js';
18
+ import { ARCHIMATE_FILE_FORMATS } from '../../charting/archimate/archimateFileFormats.js';
19
+ import { ModelTree } from '../../charting/modelTree/ModelTree.js';
20
+ import { buildModelTreePanel } from '../../charting/modelTree/ModelTreePanel.js';
21
+ import { buildAnalysisPanel } from '../../charting/modelTree/AnalysisPanel.js';
22
+ import { ArchimateSpecializationRegistry } from '../../archimateSpecializations.js';
23
+ import { HintPanel } from '../../charting/HintPanel.js';
24
+ import { elementMenuItems } from '../../charting/archimate/elementMenuItems.js';
25
+ import { editElementProperties } from '../../charting/archimate/elementProperties.js';
26
+ import { CustomViewpoints } from '../../charting/archimate/CustomViewpoints.js';
27
+
28
+ const SVG_NS = 'http://www.w3.org/2000/svg';
29
+
30
+ /**
31
+ * ArchimateCanvasPart — the ArchiMate modeller on the diagram editor's own
32
+ * canvas (phase 4 testbed): the model tree on the left, one tab per view and
33
+ * an ArchimateCanvasEditor over the current view, and a palette of element
34
+ * types grouped by layer on the right. Drop or click a palette type to add an
35
+ * element, or drag one from the tree to show it (with its relationships to
36
+ * what is shown); drag between two elements to add a relationship (its kind
37
+ * picked from those the rules allow); every edit is a step on that view's own
38
+ * undo history. The File menu exports and imports CSV, .archimate and the
39
+ * Exchange Format.
40
+ *
41
+ * Spec (JSON): `elements`, `relationships`, `views`, `name` (as ArchimateModel
42
+ * takes them), `archimateVersion` ('4' or '3.2'), `distinctShapes` (draw each
43
+ * element in its notation shape rather than a box), `viewpoint` (a viewpoint name) and
44
+ * `viewpointMode` ('fade' or 'hide': elements outside it), `analysis` (true adds the
45
+ * analysis of the selected element, under the palette).
46
+ */
47
+ export class ArchimateCanvasPart extends EditorPart {
48
+ static type = 'archimate-canvas';
49
+ static viewNoun = 'view';
50
+
51
+ constructor(spec = {}) {
52
+ super(spec);
53
+ this.version = spec.archimateVersion ?? '4';
54
+ this.distinctShapes = !!spec.distinctShapes;
55
+ this.viewpoint = spec.viewpoint ?? 'All';
56
+ this.viewpointMode = spec.viewpointMode ?? 'fade';
57
+ this.showDerived = !!spec.showDerived;
58
+ this.settings = new SettingsManager();
59
+ // A settings change (Model settings…, a view's properties) redraws the canvas.
60
+ this._unsubscribeSettings = this.settings.onSettingsChange(() => { if (this.mounted) this.editor?.render(); });
61
+ // The user's specializations (or the defaults), as the main editor offers them; one already loaded is kept.
62
+ if (!ArchimateSpecializationRegistry.list().length) ArchimateSpecializationRegistry.loadFrom();
63
+ this._follow(this.model);
64
+ }
65
+
66
+ /**
67
+ * Re-render on every change to `model`'s views (the editor is rebuilt with the canvas on each
68
+ * render), and redraw the tree after every edit (an element renamed, an undo).
69
+ * @private
70
+ */
71
+ _follow(model) {
72
+ this._unsubscribe?.();
73
+ this._unsubscribeTree?.();
74
+ this._unsubscribe = model.onChange(() => { if (this.mounted) this.render(); });
75
+ this._unsubscribeTree = model.onEdit?.(() => this._treePanel?.refresh?.()) ?? null;
76
+ }
77
+
78
+ fileFormats() {
79
+ return ARCHIMATE_FILE_FORMATS;
80
+ }
81
+
82
+ /** A new file is an Archi file (.archimate). */
83
+ saveFormat() {
84
+ return ARCHIMATE_FILE_FORMATS.find(f => f.featureName === 'Archimate');
85
+ }
86
+
87
+ /** The file label in the toolbar (and a ModelsPart's tab) follows the saved state. */
88
+ onFileState() {
89
+ super.onFileState();
90
+ this.menuBar?.refresh?.();
91
+ }
92
+
93
+ /** New view…, then New canvas… and New canvas from template. */
94
+ newItems() {
95
+ return [...super.newItems(), ...this.templateMenu.newCanvasItems()];
96
+ }
97
+
98
+ /** File > Templates: the open canvas saved as a model template or into the library. */
99
+ ownFileItems() {
100
+ const saveAs = this.model.currentView ? this.templateMenu.saveAsTemplateItems(this.model.currentViewId) : [];
101
+ return EditorPart.menuGroup('Templates', saveAs);
102
+ }
103
+
104
+ /** File > Import: an Archi canvas template, and a spreadsheet's rows (CSV with mapping). */
105
+ ownImportItems() {
106
+ const importTemplate = this.templateMenu.importItem();
107
+ return [{ separator: true }, ...(importTemplate ? [{ ...importTemplate, label: 'Archi template…' }] : []), { label: 'CSV with mapping…', action: () => this.importCsvMapped() }];
108
+ }
109
+
110
+ /** Import CSV with mapping…: a spreadsheet's rows into this model (CsvImportDialog), the new elements on the open view. */
111
+ async importCsvMapped() {
112
+ const file = await pickFile('.csv,.txt,.tsv', this.document);
113
+ if (!file) return null;
114
+ return new CsvImportDialog({ model: this.model, view: this.model.currentView, version: this.version, document: this.document, onDone: () => this.render() }).open(await file.text());
115
+ }
116
+
117
+ /** An imported model: follow it, with a fresh tree, and give it a view if it has none. */
118
+ modelReplaced(model) {
119
+ if (!model.views().length) model.createView();
120
+ this._follow(model);
121
+ }
122
+
123
+ /** The model tree over the current model (kept across renders, so its mode and selection stay). */
124
+ get modelTree() {
125
+ if (this.tree?.model !== this.model) {
126
+ this.tree = new ModelTree(this.model, { mode: 'byLayer' });
127
+ // A view chosen in the tree opens it; an element chosen there is selected on the canvas.
128
+ this.tree.onSelectionChange((data) => {
129
+ if (data.kind === 'view' && data.view.id !== this.model.currentViewId) this.model.switchTo(data.view.id);
130
+ if (data.kind === 'element') { this.selectElement(data.id); this._showAnalysis?.(data.id); }
131
+ });
132
+ }
133
+ return this.tree;
134
+ }
135
+
136
+ createModel(spec) {
137
+ return new ArchimateModel({
138
+ name: spec.name ?? '',
139
+ elements: spec.elements ?? [],
140
+ relationships: spec.relationships ?? [],
141
+ views: spec.views?.length ? spec.views : [{ id: 'view-1', name: 'View 1', elementIds: [] }],
142
+ });
143
+ }
144
+
145
+ /** A view's properties: name, documentation and its settings (routing, grid, background, ...). */
146
+ showViewProperties(view) {
147
+ return new SettingsViewPropertiesDialog({ model: this.model, view, settingsManager: this.settings, document: this.document }).open();
148
+ }
149
+
150
+ /**
151
+ * Ask which relationship a new connection is, among the kinds the rules
152
+ * allow between the two elements. Resolves to the kind, or null if cancelled.
153
+ */
154
+ chooseKind(kinds, from, to, { reason = 'connect' } = {}) {
155
+ const nesting = reason === 'nesting';
156
+ return new Promise((resolve) => {
157
+ new FormDialog({
158
+ title: nesting ? `${to.name} nested in ${from.name}` : `New relationship: ${from.name} → ${to.name}`,
159
+ description: nesting
160
+ ? `Add the relationship the nesting stands for (${typeTitle(from.type ?? '?')} → ${typeTitle(to.type ?? '?')}), in the model; the nesting shows it, so no line is drawn.`
161
+ : `${typeTitle(from.type ?? '?')} → ${typeTitle(to.type ?? '?')}: ${kinds.length} allowed kind${kinds.length === 1 ? '' : 's'}`,
162
+ fields: [{
163
+ key: 'kind', label: 'Kind', type: 'select', value: kinds[0],
164
+ choices: kinds.map(k => [k, ArchimateNotation.relationshipType(k)?.description ? `${typeTitle(k)}: ${ArchimateNotation.relationshipType(k).description}` : typeTitle(k)]),
165
+ }],
166
+ submitLabel: 'Add',
167
+ ...(nesting && { cancelLabel: 'No relationship' }),
168
+ idPrefix: 'archimate-kind-',
169
+ document: this.document,
170
+ onApply: ({ kind }) => resolve(kind),
171
+ onClose: (applied) => { if (!applied) resolve(null); },
172
+ }).open();
173
+ });
174
+ }
175
+
176
+ render() {
177
+ const model = this.model;
178
+ const view = model.currentView;
179
+ const doc = this.document;
180
+ const canvasId = `archimate-canvas-${this.id}`;
181
+
182
+ const canvas = doc.createElementNS(SVG_NS, 'svg');
183
+ canvas.id = canvasId;
184
+ canvas.setAttribute('viewBox', '0 0 1000 700');
185
+ canvas.style.cssText = 'flex: 1; width: 100%; height: 100%; display: block; background: transparent; box-sizing: border-box;';
186
+ const elements = doc.createElementNS(SVG_NS, 'g');
187
+ elements.id = 'elements';
188
+ canvas.appendChild(elements);
189
+
190
+ const tabs = new ViewTabStrip({
191
+ document: doc,
192
+ onSelect: (id) => model.switchTo(id),
193
+ menuItems: (id) => this.viewMenu.items(id),
194
+ }).render(model.views(), model.currentViewId);
195
+
196
+ const { toolbar, side, main, aside } = new EditorShell({ document: doc, sideWidth: '260px', aside: true, asideWidth: this.spec.analysis ? '260px' : '210px' }).mount(this.container);
197
+ Object.assign(aside.style, { padding: '6px', fontSize: '12px' });
198
+ // With `analysis`, the palette shares the right with the analysis of the selected element.
199
+ let paletteHost = aside, analysisHost = null;
200
+ if (this.spec.analysis) {
201
+ Object.assign(aside.style, { display: 'flex', flexDirection: 'column', overflow: 'hidden' });
202
+ paletteHost = aside.appendChild(doc.createElement('div'));
203
+ Object.assign(paletteHost.style, { flex: '1 1 55%', overflowY: 'auto', minHeight: '0' });
204
+ analysisHost = aside.appendChild(doc.createElement('div'));
205
+ analysisHost.setAttribute('data-analysis', '');
206
+ Object.assign(analysisHost.style, { flex: '1 1 45%', overflowY: 'auto', minHeight: '0', borderTop: '1px solid #ddd' });
207
+ }
208
+ side.appendChild(this._treePanel = buildModelTreePanel(doc, {
209
+ modelTree: this.modelTree,
210
+ treeDivId: `archimate-canvas-tree-${this.id}`,
211
+ viewMenu: this.viewMenu,
212
+ templateMenu: this.templateMenu,
213
+ elementMenu: (element) => this.elementMenu(element),
214
+ search: true,
215
+ version: this.version,
216
+ }));
217
+ main.style.flexDirection = 'column';
218
+ render(main, [tabs, { style: { flex: '1', display: 'flex', flexDirection: 'column', minHeight: '0' }, children: [canvas] }], doc);
219
+
220
+ const customViewpoints = CustomViewpoints.load();
221
+ const previous = this.editor;
222
+ previous?.dispose();
223
+ this.editor = new ArchimateCanvasEditor({
224
+ diagramContainerId: canvasId,
225
+ view,
226
+ model,
227
+ nodeOptions: { archimateVersion: this.version, useDistinctShapes: this.distinctShapes, viewpoint: this.viewpoint, viewpointMode: this.viewpointMode, showDerived: this.showDerived },
228
+ chooseKind: (kinds, from, to, options) => this.chooseKind(kinds, from, to, options),
229
+ // The view's settings: background, title, watermark, how invalid relationships show.
230
+ viewSettings: () => this.settings.getEffectiveSettings(this.model.currentView, 'default'),
231
+ settingsManager: this.settings,
232
+ // The user's own viewpoints, after the standard ones.
233
+ customViewpoints,
234
+ // Canvas templates: placed on a canvas, saved from its shapes (the browser's library).
235
+ templateMenu: this.templateMenu,
236
+ // Version and distinct shapes (⚙ Settings) change the palette too.
237
+ onNodeOptionsChange: ({ archimateVersion, useDistinctShapes, viewpoint, viewpointMode, showDerived }) => {
238
+ this.showDerived = !!showDerived;
239
+ this.version = archimateVersion;
240
+ this.distinctShapes = !!useDistinctShapes;
241
+ this.viewpoint = viewpoint;
242
+ this.viewpointMode = viewpointMode;
243
+ this.render();
244
+ },
245
+ });
246
+ if (previous) {
247
+ this.editor.showGrid = previous.showGrid;
248
+ this.editor.gridSize = previous.gridSize;
249
+ }
250
+
251
+ // A canvas's palette is Archi's canvas palette; another view's, ArchiMate's element types.
252
+ const isCanvas = view.constructor.kind === 'canvas';
253
+ const Palette = isCanvas ? CanvasPalette : ArchimatePalette;
254
+ new Palette({
255
+ version: this.version,
256
+ viewpoint: this.viewpoint,
257
+ customViewpoints,
258
+ document: doc,
259
+ // A click adds the type (or box) in the middle of the visible canvas.
260
+ onPick: (key) => {
261
+ const r = canvas.getBoundingClientRect();
262
+ const at = this.editor._clientToDiagram(r.left + r.width / 2, r.top + r.height / 2) ?? { x: 400, y: 300 };
263
+ if (isCanvas) this.editor.addCanvasBox(key, at);
264
+ else this.editor.addElement(key, at);
265
+ },
266
+ }).render(paletteHost);
267
+
268
+ // The tree follows the canvas's selection; a canvas shows its hint, or the selected box's.
269
+ const hints = (this.hintPanel ??= new HintPanel({ document: doc }));
270
+ const showHint = (templateId) => hints.mount(canvas.parentElement).show(view.constructor.kind === 'canvas' ? (templateId ? view.hintFor(templateId) : view.hint) : null);
271
+ const showAnalysis = this._showAnalysis = (elementId) => {
272
+ if (!analysisHost) return;
273
+ analysisHost.replaceChildren(buildAnalysisPanel(doc, {
274
+ model, elementId: elementId && model.getElement(elementId) ? elementId : null,
275
+ onSelectItem: (info) => this.modelTree.select(info.id, info.kind),
276
+ }));
277
+ };
278
+ this.editor.onSelectionChange(({ templateId }) => {
279
+ const elementId = templateId && this.editor.templates.get(templateId)?.instance?.elementId;
280
+ if (elementId && this.modelTree.getSelectedId() !== elementId && this.model.getElement(elementId)) this.modelTree.select(elementId, 'element');
281
+ showHint(templateId);
282
+ showAnalysis(elementId);
283
+ });
284
+ showHint(null);
285
+ showAnalysis(this.modelTree.getSelectedKind() === 'element' ? this.modelTree.getSelectedId() : null);
286
+ // The tree's filters dim what they leave out on the canvas too.
287
+ this._unsubscribeFilter?.();
288
+ const dim = () => this.editor?.setElementFilter(this.modelTree.matchingElementIds());
289
+ this._unsubscribeFilter = this.modelTree.onFilterChange(dim);
290
+ if (this.modelTree.filtering) dim();
291
+
292
+ this.menuBar?.dispose();
293
+ this.menuBar = new MenuBar({
294
+ container: toolbar,
295
+ editor: this.editor,
296
+ items: [this.fileMenu(), this.editMenu(), ...this.editor.menuBarItems(), new ToolbarText(() => this.fileLabel, { marginLeft: 'auto', color: '#555', fontSize: '12px' })],
297
+ }).render();
298
+ this.editor.render();
299
+ }
300
+
301
+ /**
302
+ * A model element's menu in the tree (elementMenuItems): its properties,
303
+ * the views it is on, adding it to this one, a view generated for it.
304
+ */
305
+ elementMenu(element) {
306
+ const model = this.model;
307
+ return elementMenuItems(element, {
308
+ model, view: model.currentView,
309
+ editProperties: (el) => editElementProperties(el, {
310
+ history: model.currentView?.history, version: this.version, document: this.document,
311
+ onSaved: () => this.render(),
312
+ }),
313
+ showIn: (view, instanceId) => {
314
+ if (view.id !== model.currentViewId) model.switchTo(view.id); // the part redraws for the new view
315
+ this.editor?.selectTemplate(instanceId);
316
+ },
317
+ addToView: (el) => this.editor?.showElement(el.id, this.editor.visibleCentre()),
318
+ });
319
+ }
320
+
321
+ /** Select the first box of a model element on the current view (nothing if it is not shown). */
322
+ selectElement(elementId) {
323
+ const editor = this.editor;
324
+ if (!editor) return;
325
+ const box = [...editor.templates.values()].find(t => t.instance?.elementId === elementId);
326
+ if (box && editor.selectedTemplateId !== box.id) editor.selectTemplate(box.id);
327
+ }
328
+
329
+ /** Canvas templates over the current model: placed on a canvas, saved from its shapes (the browser's library). */
330
+ get templateMenu() {
331
+ if (this._templateMenu?.model !== this.model) {
332
+ this._templateMenu = new CanvasTemplateMenu(this.model, { library: (this.templateLibrary ??= new CanvasTemplateLibrary()), document: () => this.document });
333
+ }
334
+ return this._templateMenu;
335
+ }
336
+
337
+ dispose() {
338
+ this.menuBar?.dispose();
339
+ this._unsubscribeSettings?.();
340
+ this._unsubscribeFilter?.();
341
+ this._unsubscribe();
342
+ this._unsubscribeTree?.();
343
+ super.dispose();
344
+ }
345
+ }
@@ -0,0 +1,79 @@
1
+ import { el } from '../dom.js';
2
+ import { EditorPart } from './EditorPart.js';
3
+ import { ArchimateModel } from '../../charting/diagrams/ArchimateModel.js';
4
+ import { ArchimateDiagramEditor } from '../../charting/ArchimateDiagramEditor.js';
5
+ import { ARCHIMATE_SERVICES } from '../archimateServices.js';
6
+
7
+ /** Toolbar features on by default; a spec's `features` overrides any of them. */
8
+ const DEFAULT_FEATURES = Object.freeze({
9
+ search: true, version: true, viewpoint: true, distinctShapes: true, showDerived: true,
10
+ exportCSV: true, importCSV: true, exportArchimate: true, importArchimate: true, exportExchange: true, importExchange: true,
11
+ });
12
+
13
+ /**
14
+ * ArchimateEditorPart — the ArchiMate modeller as a workbench part: toolbar,
15
+ * model tree, one tab per open view and the canvas, filling its pane.
16
+ *
17
+ * Spec (JSON): `elements`, `relationships`, `views` (as ArchimateModel takes
18
+ * them), `features` (toolbar controls, see DEFAULT_FEATURES), `analysis`
19
+ * (true adds the analysis panel on the right).
20
+ *
21
+ * The part builds the ArchimateModel and hands it to ArchimateDiagramEditor,
22
+ * which works in the part's own container (its regions get ids unique to the
23
+ * part). Views — new, duplicate, rename, delete — come from EditorPart's
24
+ * ViewMenu, which the editor's tabs, tree and File menu all use. Like
25
+ * ChartPart it needs the engine, so register it explicitly.
26
+ */
27
+ export class ArchimateEditorPart extends EditorPart {
28
+ static type = 'archimate-editor';
29
+ static viewNoun = 'view';
30
+
31
+ createModel(spec) {
32
+ return new ArchimateModel({
33
+ name: spec.name ?? '',
34
+ elements: spec.elements ?? [],
35
+ relationships: spec.relationships ?? [],
36
+ views: spec.views ?? [],
37
+ });
38
+ }
39
+
40
+ /** The editor's model once it exists: an import replaces it. */
41
+ get model() {
42
+ return this.editor?.model ?? this._model;
43
+ }
44
+
45
+ /** The editor's view menu (over its current model), so the part and editor offer one menu. */
46
+ get viewMenu() {
47
+ return this.editor?.viewMenu ?? super.viewMenu;
48
+ }
49
+
50
+ /** Element ids for the editor's regions, unique to this part. */
51
+ regionIds() {
52
+ const prefix = `archimate-${this.id ?? 'editor'}`;
53
+ return {
54
+ app: `${prefix}-app`, toolbar: `${prefix}-toolbar`, tree: `${prefix}-tree`,
55
+ diagram: `${prefix}-diagram`, analysis: this.spec.analysis ? `${prefix}-analysis` : undefined,
56
+ };
57
+ }
58
+
59
+ render() {
60
+ // Built once: the editor keeps itself up to date from the model from then on.
61
+ if (this.editor) return;
62
+ const ids = this.regionIds();
63
+ Object.assign(this.container.style, { height: '100%', display: 'flex', flexDirection: 'column' });
64
+ this.container.appendChild(el({ attrs: { id: ids.app }, style: { flex: '1 1 auto', minHeight: '0' } }, this.document));
65
+ this.editor = new ArchimateDiagramEditor({
66
+ model: this.model,
67
+ document: this.document,
68
+ fullPage: false,
69
+ appContainerId: ids.app,
70
+ toolbarContainerId: ids.toolbar,
71
+ treeContainerId: ids.tree,
72
+ diagramContainerId: ids.diagram,
73
+ analysisContainerId: ids.analysis,
74
+ features: { ...DEFAULT_FEATURES, ...(this.spec.features ?? {}) },
75
+ workspace: ARCHIMATE_SERVICES,
76
+ });
77
+ this.editor.render();
78
+ }
79
+ }
@@ -0,0 +1,115 @@
1
+ import { Part } from '../Part.js';
2
+ import { el } from '../dom.js';
3
+ import { RenderEngine } from '../../index.js';
4
+
5
+ /**
6
+ * ChartPart — hosts one RenderEngine chart in a pane.
7
+ *
8
+ * Two things drive the shape of this class:
9
+ *
10
+ * 1. **RenderEngine is per-container.** Its constructor reads
11
+ * `container.clientWidth/clientHeight` and builds a renderer sized to them,
12
+ * so each pane owns its own engine — there is no shared instance to pass in
13
+ * via `ctx`. A pane that has just been created has zero size until layout
14
+ * runs, so construction is deferred to the first non-zero measurement.
15
+ * 2. **Panes resize.** GridNode panes are drag-resizable and SplitNode panes
16
+ * are splitter-resizable, so a chart must re-render at the new size. The
17
+ * renderer is sized at construction, so a resize means rebuilding the
18
+ * engine; that is debounced to a frame to avoid thrashing mid-drag.
19
+ *
20
+ * `spec.channel`, if set, feeds the chart from the ContextBus: whatever arrives
21
+ * replaces `options.data` and re-renders. That is the mashup wiring — the chart
22
+ * never knows which part produced the data.
23
+ */
24
+ export class ChartPart extends Part {
25
+ static type = 'chart';
26
+ static subscribes = [];
27
+
28
+ constructor(spec = {}) {
29
+ super(spec);
30
+ this.chartType = spec.chartType ?? 'bar';
31
+ this.chartOptions = { ...(spec.options ?? {}) };
32
+ if (spec.data !== undefined) this.chartOptions.data = spec.data;
33
+ this.rendererType = spec.rendererType ?? 'svg';
34
+ this.channel = spec.channel ?? null;
35
+ this.engine = null;
36
+ this._rafId = null;
37
+ this._lastSize = '';
38
+ // refreshChart() resolves its container via document.getElementById(id)
39
+ // and silently no-ops when it finds nothing, so the host element needs a
40
+ // real DOM id. Namespaced rather than using the bare part id, which
41
+ // would collide with whatever ids the consumer's own page already uses.
42
+ this.chartId = `ws-chart-${this.id}`;
43
+ }
44
+
45
+ render() {
46
+ this.canvasHost = this.container.appendChild(el({
47
+ cls: 'ws-chart',
48
+ attrs: { id: this.chartId },
49
+ }));
50
+
51
+ if (this.channel) {
52
+ this.subscribe(this.channel, data => {
53
+ if (data == null) return;
54
+ this.chartOptions.data = data;
55
+ this._draw();
56
+ });
57
+ }
58
+
59
+ const ro = new ResizeObserver(() => this._scheduleDraw());
60
+ ro.observe(this.canvasHost);
61
+ this.onDispose(() => ro.disconnect());
62
+ this.onDispose(() => { if (this._rafId) cancelAnimationFrame(this._rafId); });
63
+
64
+ // Draw straight away when the host is already sized, instead of waiting
65
+ // for ResizeObserver's initial delivery. That delivery only lands on the
66
+ // next rendering-lifecycle tick — a visibly blank pane for a frame — and
67
+ // in an environment that isn't painting it never lands at all, leaving
68
+ // the chart permanently empty. ResizeObserver then only has to handle
69
+ // what it is actually for: later resizes.
70
+ this._drawIfSized();
71
+ }
72
+
73
+ _drawIfSized() {
74
+ const { clientWidth: w, clientHeight: h } = this.canvasHost;
75
+ if (w <= 0 || h <= 0) return false;
76
+ this._lastSize = `${w}x${h}`;
77
+ this._draw();
78
+ return true;
79
+ }
80
+
81
+ _scheduleDraw() {
82
+ const { clientWidth: w, clientHeight: h } = this.canvasHost;
83
+ if (w <= 0 || h <= 0) return;
84
+ const size = `${w}x${h}`;
85
+ if (size === this._lastSize) return;
86
+ this._lastSize = size;
87
+ if (this._rafId) cancelAnimationFrame(this._rafId);
88
+ this._rafId = requestAnimationFrame(() => { this._rafId = null; this._draw(); });
89
+ }
90
+
91
+ _draw() {
92
+ const { clientWidth: w, clientHeight: h } = this.canvasHost;
93
+ if (w <= 0 || h <= 0) return;
94
+ // The renderer is sized at construction, so a resize means a new engine.
95
+ this.canvasHost.textContent = '';
96
+ this.engine = new RenderEngine(this.canvasHost, { rendererType: this.rendererType });
97
+ this.engine.register(this.chartId, this.chartType, this.chartOptions);
98
+ this.engine.refreshChart(this.chartId);
99
+ }
100
+
101
+ /** Append a point to a bounded window — see REFERENCE.md's streaming section. */
102
+ addDataPoint(pointOrFactory, opts) {
103
+ this.engine?.addDataPoint(this.chartId, pointOrFactory, opts);
104
+ }
105
+
106
+ serialize() {
107
+ return {
108
+ ...super.serialize(),
109
+ chartType: this.chartType,
110
+ rendererType: this.rendererType,
111
+ ...(this.channel ? { channel: this.channel } : {}),
112
+ options: { ...this.chartOptions },
113
+ };
114
+ }
115
+ }
@@ -0,0 +1,34 @@
1
+ import { Part } from '../Part.js';
2
+ import { render } from '../dom.js';
3
+
4
+ /**
5
+ * ContentPart — static content declared as a JSON element tree.
6
+ *
7
+ * The default way to put fixed content in a pane, and the shape the shell's
8
+ * guardrail points at: structure stays data rather than an HTML string, so it
9
+ * can be stored, serialized and composed like any other part spec, and its text
10
+ * cannot inject markup. `HtmlPart` is the escape hatch for genuinely external
11
+ * or server-supplied HTML.
12
+ *
13
+ * { id: 'about', type: 'content', title: 'About', content: [
14
+ * { tag: 'h3', text: 'Try these' },
15
+ * { tag: 'ul', children: [
16
+ * { tag: 'li', text: 'Pick a region' },
17
+ * ]},
18
+ * ]}
19
+ *
20
+ * `content` is one spec or an array of them — see `dom.js`'s `el()` for the
21
+ * full spec shape.
22
+ */
23
+ export class ContentPart extends Part {
24
+ static type = 'content';
25
+
26
+ render() {
27
+ render(this.container, this.spec.content ?? []);
28
+ }
29
+
30
+ /** Content is plain JSON, so it round-trips through serialization as-is. */
31
+ serialize() {
32
+ return { ...super.serialize(), content: this.spec.content ?? [] };
33
+ }
34
+ }
@@ -0,0 +1,46 @@
1
+ import { Part } from '../Part.js';
2
+ import { el, render } from '../dom.js';
3
+
4
+ /**
5
+ * DetailPart — renders whatever arrives on a channel as a property table.
6
+ *
7
+ * The canonical *consumer*, and the part that demonstrates why ContextBus
8
+ * retains values: put one of these behind an inactive tab, select something in
9
+ * a ListPart, then reveal the tab — it mounts already populated, because
10
+ * `subscribe()` replays the retained value at mount time.
11
+ */
12
+ export class DetailPart extends Part {
13
+ static type = 'detail';
14
+ static subscribes = ['selection:item'];
15
+
16
+ constructor(spec = {}) {
17
+ super(spec);
18
+ this.channel = spec.channel ?? 'selection:item';
19
+ this.empty = spec.empty ?? 'Nothing selected.';
20
+ }
21
+
22
+ render() {
23
+ this.body = this.container.appendChild(el({ cls: 'ws-detail' }));
24
+ this._draw(undefined);
25
+ // subscribe() registers the unsubscribe on the disposer list for us.
26
+ this.subscribe(this.channel, value => this._draw(value));
27
+ }
28
+
29
+ _draw(value) {
30
+ render(this.body, this._spec(value));
31
+ }
32
+
33
+ /** Value → element spec. Pure data in, pure data out; el() does the DOM. */
34
+ _spec(value) {
35
+ if (value == null) return { tag: 'p', cls: 'ws-muted', text: this.empty };
36
+ if (typeof value !== 'object') return { tag: 'span', text: String(value) };
37
+ return {
38
+ tag: 'dl',
39
+ cls: 'ws-proplist',
40
+ children: Object.entries(value).flatMap(([k, v]) => [
41
+ { tag: 'dt', text: k },
42
+ { tag: 'dd', text: typeof v === 'object' ? JSON.stringify(v) : String(v) },
43
+ ]),
44
+ };
45
+ }
46
+ }