@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,35 @@
1
+ import { ModelFileFormat } from '../ModelFileFormat.js';
2
+ import { ArchimateModel } from '../diagrams/ArchimateModel.js';
3
+ import { exportModelCSV, importModelCSV } from '../../archimateCSV.js';
4
+
5
+ /** Where each table starts in the one file: elements, then relationships. */
6
+ const ELEMENTS_HEADER = '=== elements.csv ===\n';
7
+ const RELATIONSHIPS_HEADER = '=== relationships.csv ===\n';
8
+
9
+ /**
10
+ * The model's elements and relationships as CSV, both tables in one file
11
+ * (exportModelCSV's columns). A CSV holds no views: import gives a model of
12
+ * its elements and relationships with one view of them all, laid out.
13
+ */
14
+ export class ArchimateCsvFileFormat extends ModelFileFormat {
15
+ get label() { return 'CSV'; }
16
+ get accept() { return '.csv'; }
17
+ get fileName() { return 'model.csv'; }
18
+ get featureName() { return 'CSV'; }
19
+
20
+ export(model) {
21
+ const { elementsCSV, relationshipsCSV } = exportModelCSV({ elements: model.elements(), relationships: model.relationships() });
22
+ return { data: `${ELEMENTS_HEADER}${elementsCSV}\n\n${RELATIONSHIPS_HEADER}${relationshipsCSV}`, mimeType: 'text/csv' };
23
+ }
24
+
25
+ import(text) {
26
+ const normal = String(text).replace(/\r\n?/g, '\n');
27
+ const at = normal.indexOf(RELATIONSHIPS_HEADER);
28
+ const elementsCSV = (at < 0 ? normal : normal.slice(0, at)).replace(ELEMENTS_HEADER, '').trim();
29
+ const relationshipsCSV = at < 0 ? '' : normal.slice(at + RELATIONSHIPS_HEADER.length).trim();
30
+ const { elements, relationships } = importModelCSV(elementsCSV, relationshipsCSV);
31
+ const model = new ArchimateModel({ elements, relationships, views: [] });
32
+ if (elements.length) model.generateView(elements.map(e => e.id), { name: 'Imported elements' });
33
+ return model;
34
+ }
35
+ }
@@ -0,0 +1,137 @@
1
+ import { Edge } from '../Edge.js';
2
+ import { EDGE_STYLE_PROPERTIES } from '../edgeStyle/EdgeStyleSchema.js';
3
+ import { ArchimateNotation } from '../../archimate.js';
4
+
5
+ /** Style keys the relationship's kind decides: the notation. */
6
+ const NOTATION_KEYS = ['lineStyle', 'startMarker', 'endMarker'];
7
+
8
+ /**
9
+ * ArchimateEdge — one relationship on an ArchiMate view, as an editor line.
10
+ * Like ArchimateElementTemplate it keeps no copy of its own: the route (bend
11
+ * points, pinned sides) and the line's own style are read from and written to
12
+ * its RelationshipInstance, so the editor's waypoint, side and style commands
13
+ * edit the view and undo there.
14
+ *
15
+ * Its notation — dashes and end markers — comes from the relationship's kind
16
+ * (ArchimateRelationshipType#edgeStyle) and cannot be set on the line; change
17
+ * the kind instead. The other style properties (routing, attach, colour,
18
+ * width) may be set per line, and unset means inherit (EdgeStyleCascade).
19
+ */
20
+ export class ArchimateEdge extends Edge {
21
+ /**
22
+ * @param {RelationshipInstance} instance
23
+ * @param {ArchimateView} view - Resolves the ends when the instance does not pin them
24
+ */
25
+ constructor(instance, view) {
26
+ super(instance.id, undefined, undefined, {});
27
+ this.instance = instance;
28
+ this.view = view;
29
+ }
30
+
31
+ /** Ends, label, route and visibility live on the instance and the model relationship. @protected */
32
+ _initState() {}
33
+
34
+ /** The model relationship this line shows. */
35
+ get relationship() {
36
+ return this.view.model.getRelationship(this.instance.relationshipId);
37
+ }
38
+
39
+ /** The relationship's notation as line style values. */
40
+ get notation() {
41
+ const kind = ArchimateNotation.relationshipType(this.relationship?.kind) ?? ArchimateNotation.relationshipType('association');
42
+ return kind.edgeStyle();
43
+ }
44
+
45
+ // The ends: the instances this pairing joins, or the first of each element.
46
+ get sourceId() {
47
+ return this.instance.sourceInstanceId ?? this.view.elementInstancesFor(this.relationship?.source)[0]?.id;
48
+ }
49
+ set sourceId(_) { this._notHere('its ends; reconnect the relationship in the model'); }
50
+ get targetId() {
51
+ return this.instance.targetInstanceId ?? this.view.elementInstancesFor(this.relationship?.target)[0]?.id;
52
+ }
53
+ set targetId(_) { this._notHere('its ends; reconnect the relationship in the model'); }
54
+
55
+ get label() { return this.relationship?.label ?? this.relationship?.name ?? ''; }
56
+ set label(value) {
57
+ if (this.relationship) this.relationship.label = value || undefined;
58
+ }
59
+
60
+ /** This view's bend points, or the relationship's own when the view has none. */
61
+ get waypoints() {
62
+ return this.instance.waypoints ?? (this.relationship?.waypoints ?? []).map(({ x, y }) => ({ x, y }));
63
+ }
64
+ set waypoints(points) {
65
+ this.instance.waypoints = (points ?? []).map(({ x, y }) => ({ x, y }));
66
+ }
67
+
68
+ /** The view's own copy of the route, made on first edit so an inherited route is not changed in the model. @private */
69
+ _ownWaypoints() {
70
+ if (!this.instance.waypoints) this.instance.waypoints = this.waypoints;
71
+ return this.instance.waypoints;
72
+ }
73
+
74
+ addWaypoint(x, y, index = this.waypoints.length) {
75
+ this._ownWaypoints().splice(index, 0, { x, y });
76
+ }
77
+
78
+ removeWaypoint(index) {
79
+ const points = this._ownWaypoints();
80
+ if (index >= 0 && index < points.length) points.splice(index, 1);
81
+ }
82
+
83
+ moveWaypoint(index, x, y) {
84
+ const points = this._ownWaypoints();
85
+ if (index >= 0 && index < points.length) points[index] = { x, y };
86
+ }
87
+
88
+ clearWaypoints() {
89
+ this.instance.waypoints = [];
90
+ }
91
+
92
+ get sourceSide() { return this.instance.sourceSide ?? 'auto'; }
93
+ set sourceSide(side) { this.instance.sourceSide = side && side !== 'auto' ? side : null; }
94
+ get targetSide() { return this.instance.targetSide ?? 'auto'; }
95
+ set targetSide(side) { this.instance.targetSide = side && side !== 'auto' ? side : null; }
96
+
97
+ get visible() { return this.instance.visible; }
98
+ set visible(value) { this.instance.visible = value !== false; }
99
+
100
+ /** Every style property but the notation, which the relationship's kind decides. */
101
+ get styleProperties() {
102
+ return EDGE_STYLE_PROPERTIES.filter(p => !NOTATION_KEYS.includes(p.key));
103
+ }
104
+
105
+ /** A plain Edge with this line's current route and style (e.g. for a template-editor copy). */
106
+ clone() {
107
+ return new Edge(this.id, this.sourceId, this.targetId, {
108
+ label: this.label, waypoints: this.waypoints, sourceSide: this.sourceSide, targetSide: this.targetSide,
109
+ visible: this.visible, ...this.styleOverrides(),
110
+ });
111
+ }
112
+
113
+ /** @private */
114
+ _notHere(what) {
115
+ throw new TypeError(`An ArchiMate line does not set ${what}`);
116
+ }
117
+ }
118
+
119
+ // Style properties: the notation from the kind (read-only), the rest per line on the instance.
120
+ for (const { key } of EDGE_STYLE_PROPERTIES) {
121
+ Object.defineProperty(ArchimateEdge.prototype, key, NOTATION_KEYS.includes(key)
122
+ ? {
123
+ get() { return this.notation[key]; },
124
+ set() { this._notHere(`${key}: it comes from the relationship's kind`); },
125
+ configurable: true,
126
+ }
127
+ : {
128
+ get() { return this.instance.appearance[key]; },
129
+ set(value) {
130
+ if (value === undefined) delete this.instance.appearance[key];
131
+ else this.instance.appearance = { ...this.instance.appearance, [key]: value };
132
+ },
133
+ configurable: true,
134
+ });
135
+ }
136
+
137
+ ArchimateEdge.NOTATION_KEYS = NOTATION_KEYS;
@@ -0,0 +1,195 @@
1
+ import { TextStyle, TEXT_STYLE_KEYS } from '../TextStyle.js';
2
+ import { GlyphTemplate } from '../templates/GlyphTemplate.js';
3
+ import { Glyph } from '../glyphs/Glyph.js';
4
+ import { glyphFor } from '../glyphs/index.js';
5
+ import { ArchimateDiagram } from '../diagrams/ArchimateDiagram.js';
6
+ import { LabelHelper } from '../diagrams/LabelHelper.js';
7
+
8
+ /** Paint a view can set on one occurrence: template property → appearance key (same names). */
9
+ const APPEARANCE = ['fillColor', 'fillOpacity', 'strokeColor', 'strokeWidth', 'textColor', ...TEXT_STYLE_KEYS];
10
+
11
+ /**
12
+ * ArchimateElementTemplate — one element (or note, or image) on an ArchiMate
13
+ * view, as an editor template. It keeps no copy of its own: position, size,
14
+ * stacking and paint are read from and written to its ElementInstance, and
15
+ * what it looks like comes from the model element through the same
16
+ * enrichment the graph engine uses (ArchimateDiagram.buildNode: layer colour,
17
+ * corner style, notation shape, type badge, label position). So every editor
18
+ * command that moves, resizes, restacks or repaints a template edits the view
19
+ * itself, and its undo does too.
20
+ *
21
+ * The shape is the node's glyph: a box (sharp, rounded or chamfered by
22
+ * aspect) with the type's glyph as a corner badge, or the full notation shape
23
+ * when distinct shapes are on; notes and images draw their own glyph.
24
+ */
25
+ export class ArchimateElementTemplate extends GlyphTemplate {
26
+ /** ArchiMate notation is not rotated. */
27
+ static rotatable = false;
28
+
29
+ /** The format painter copies its appearance (what the view's instance holds). */
30
+ static formatKeys = Object.freeze([...APPEARANCE]);
31
+
32
+ /**
33
+ * @param {ElementInstance} instance - What this template shows, and where
34
+ * @param {ArchimateModel} model
35
+ * @param {Object} [options]
36
+ * @param {Object} [options.nodeOptions] - ArchimateDiagram.buildNode options
37
+ * (archimateVersion, useDistinctShapes, layerColors, elementWidth, ...)
38
+ */
39
+ constructor(instance, model, { nodeOptions = {} } = {}) {
40
+ super(instance.id, undefined, {});
41
+ this.instance = instance;
42
+ this.model = model;
43
+ this.nodeOptions = nodeOptions;
44
+ }
45
+
46
+ /** State lives on the instance and the model element, not here. @protected */
47
+ _initState() {}
48
+
49
+ /** The element as the ArchiMate notation draws it on this view. */
50
+ get node() {
51
+ const projected = this.instance.project(this.model) ?? { id: this.instance.id, name: this.instance.elementId };
52
+ return ArchimateDiagram.buildNode(projected, this.nodeOptions);
53
+ }
54
+
55
+ get name() { return this.instance.getDisplayName(this.model); }
56
+ /** Renaming one occurrence labels it on this view; the element's own name is left alone. */
57
+ set name(value) {
58
+ const own = this.instance.resolve(this.model)?.name;
59
+ this.instance.labelOverride = value && value !== own ? value : null;
60
+ }
61
+
62
+ get x() { return this.instance.x; }
63
+ set x(value) { this.instance.x = value; }
64
+ get y() { return this.instance.y; }
65
+ set y(value) { this.instance.y = value; }
66
+ get zIndex() { return this.instance.zIndex; }
67
+ set zIndex(value) { this.instance.zIndex = value ?? 0; }
68
+ get visible() { return this.instance.visible; }
69
+ set visible(value) { this.instance.visible = value !== false; }
70
+
71
+ get width() { return this.node.width; }
72
+ set width(value) { this._setSize('width', value); }
73
+ get height() { return this.node.height; }
74
+ set height(value) { this._setSize('height', value); }
75
+
76
+ get fillColor() { return this.node.color; }
77
+ set fillColor(value) { this._setAppearance('fillColor', value); }
78
+ get fillOpacity() { return this.instance.appearance.fillOpacity ?? 1; }
79
+ set fillOpacity(value) { this._setAppearance('fillOpacity', value); }
80
+ get strokeColor() { return this.node.strokeColor; }
81
+ set strokeColor(value) { this._setAppearance('strokeColor', value); }
82
+ get strokeWidth() { return this.node.strokeWidth; }
83
+ set strokeWidth(value) { this._setAppearance('strokeWidth', value); }
84
+ get textColor() { return this.instance.appearance.textColor ?? '#222'; }
85
+ set textColor(value) { this._setAppearance('textColor', value); }
86
+ get fontFamily() { return this.instance.appearance.fontFamily; }
87
+ set fontFamily(value) { this._setAppearance('fontFamily', value); }
88
+ get fontSize() { return this.instance.appearance.fontSize; }
89
+ set fontSize(value) { this._setAppearance('fontSize', value); }
90
+ get fontWeight() { return this.instance.appearance.fontWeight; }
91
+ set fontWeight(value) { this._setAppearance('fontWeight', value); }
92
+ get fontStyle() { return this.instance.appearance.fontStyle; }
93
+ set fontStyle(value) { this._setAppearance('fontStyle', value); }
94
+ get textDecoration() { return this.instance.appearance.textDecoration; }
95
+ set textDecoration(value) { this._setAppearance('textDecoration', value); }
96
+ get textAlign() { return this.instance.appearance.textAlign; }
97
+ set textAlign(value) { this._setAppearance('textAlign', value); }
98
+ get textPosition() { return this.instance.appearance.textPosition; }
99
+ set textPosition(value) { this._setAppearance('textPosition', value); }
100
+
101
+ /**
102
+ * What this occurrence sets itself for a property (undefined when it shows
103
+ * the element's own), for commands that must undo to "unset".
104
+ */
105
+ ownProperty(key) {
106
+ if (APPEARANCE.includes(key)) return this.instance.appearance[key];
107
+ if (key === 'width' || key === 'height') return this.instance.size[key];
108
+ if (key === 'name') return this.instance.labelOverride ?? undefined;
109
+ return this[key];
110
+ }
111
+
112
+ /** undefined puts the occurrence back on the element's own value. @private */
113
+ _setSize(key, value) {
114
+ if (value === undefined) delete this.instance.size[key];
115
+ else this.instance.size = { ...this.instance.size, [key]: value };
116
+ }
117
+
118
+ /** @private */
119
+ _setAppearance(key, value) {
120
+ if (!APPEARANCE.includes(key)) throw new TypeError(`Not an appearance property: ${key}`);
121
+ if (value === undefined) delete this.instance.appearance[key];
122
+ else this.instance.appearance = { ...this.instance.appearance, [key]: value };
123
+ }
124
+
125
+ glyph() {
126
+ return glyphFor(this.node.shape);
127
+ }
128
+
129
+ glyphContext() {
130
+ const node = this.node;
131
+ return Glyph.context({
132
+ R: Math.max(node.width, node.height) / 2,
133
+ size: { w: node.width, h: node.height },
134
+ color: node.color,
135
+ cornerStyle: node.cornerStyle,
136
+ strokeColor: node.strokeColor,
137
+ strokeWidth: node.strokeWidth,
138
+ icon: node.icon,
139
+ iconUrl: node.iconUrl,
140
+ ownFill: this.instance.appearance.fillColor ?? null,
141
+ });
142
+ }
143
+
144
+ /**
145
+ * The type badge in the top-right corner: its glyph, or an icon (text or
146
+ * image). As in the graph engine, a notation shape gets no glyph badge
147
+ * (buildNode leaves iconShape unset) but keeps an icon the element sets.
148
+ */
149
+ decorations(ctx) {
150
+ const node = this.node;
151
+ const { w, h } = ctx;
152
+ if (node.iconShape) {
153
+ const badge = Math.max(10, Math.round(Math.min(w, h) * 0.3));
154
+ const inset = badge / 2 + 3;
155
+ const parts = glyphFor(node.iconShape).parts(Glyph.context({
156
+ R: badge / 2, size: { w: badge, h: badge * 0.78 }, color: 'none', strokeColor: node.strokeColor || '#000000', strokeWidth: 1,
157
+ }));
158
+ return [Glyph.group([parts], { transform: `translate(${w / 2 - inset},${-h / 2 + inset})`, 'pointer-events': 'none' })];
159
+ }
160
+ if (node.icon || node.iconUrl) {
161
+ const size = Math.max(12, Math.round(Math.min(w, h) * 0.3));
162
+ const bx = w / 2 - (size / 2 + 2), by = -h / 2 + (size / 2 + 2);
163
+ return [node.iconUrl
164
+ ? Glyph.image(node.iconUrl, bx - size / 2, by - size / 2, size, size, { 'pointer-events': 'none' })
165
+ : Glyph.text(node.icon, bx, by, { fill: node.strokeColor || '#fff', textAnchor: 'middle', verticalAlign: 'middle', fontSize: `${size}px`, 'pointer-events': 'none' })];
166
+ }
167
+ return [];
168
+ }
169
+
170
+ /** The name inside the box (wrapped, top-left) or below a notation shape; images have none. */
171
+ _renderLabel(g, doc) {
172
+ const node = this.node;
173
+ if (node.shape === 'image') return;
174
+ const text = (x, y, content, attrs) => {
175
+ const t = doc.createElementNS('http://www.w3.org/2000/svg', 'text');
176
+ for (const [k, v] of Object.entries({ x, y, 'pointer-events': 'none', 'font-family': 'sans-serif', ...attrs })) t.setAttribute(k, String(v));
177
+ t.textContent = content;
178
+ g.appendChild(t);
179
+ };
180
+ const { width: w, height: h } = node;
181
+ const inside = (node.labelPosition || (node.shape === 'note' ? 'inside' : 'below')) === 'inside';
182
+ if (inside) {
183
+ const font = TextStyle.svgAttributes(this.textStyle, { defaultPixels: 10 });
184
+ const PAD = 6, FONT_SIZE = font['font-size'], LINE_HEIGHT = Math.round(FONT_SIZE * 1.2);
185
+ const lines = LabelHelper.wrapLabelLines(this.name, w - PAD * 2, FONT_SIZE, h - PAD * 2, LINE_HEIGHT);
186
+ // Top left unless the occurrence says otherwise, as in Archi.
187
+ const at = TextStyle.block(this.textStyle, { left: this.x - w / 2, right: this.x + w / 2, top: this.y - h / 2, bottom: this.y + h / 2 },
188
+ lines.length, { pixels: FONT_SIZE, lineHeight: LINE_HEIGHT, pad: PAD });
189
+ lines.forEach((line, i) => text(at.x, at.baseline + i * LINE_HEIGHT, line,
190
+ { ...font, fill: this.textColor, 'font-size': `${FONT_SIZE}px`, 'text-anchor': at.textAnchor }));
191
+ } else {
192
+ text(this.x, this.y + h / 2 + 9, this.name, { fill: '#333', 'font-size': '9px', 'text-anchor': 'middle' });
193
+ }
194
+ }
195
+ }
@@ -0,0 +1,102 @@
1
+ import { el } from '../../workspace/dom.js';
2
+ import { ArchimateViewpoints } from '../../archimate.js';
3
+ import { ARCHIMATE_TYPE_MIME, typeTitle as TITLE } from './archimateNames.js';
4
+ import { elementTypeGroups } from './elementTypeGroups.js';
5
+ import { typeGlyph } from './typeGlyph.js';
6
+
7
+
8
+ /**
9
+ * ArchimatePalette — the ArchiMate element types, grouped by layer in the
10
+ * notation's own order, each a tile showing its notation glyph in its layer
11
+ * colour (its name on hover). Drag a tile onto the canvas (ARCHIMATE_TYPE_MIME carries the type)
12
+ * or click it (`onPick`) to add an element of that type. With a viewpoint,
13
+ * only the types it allows are offered, as in Archi.
14
+ */
15
+ export class ArchimatePalette {
16
+ /**
17
+ * Tiles (one place, for every palette): a picture only, `columns` to a row,
18
+ * its name on hover. A tile is there to say which type to drag, so it is small.
19
+ */
20
+ static TILE = Object.freeze({ icon: 22, columns: 4, padding: '3px 1px', gap: '3px' });
21
+
22
+ /**
23
+ * The groups for a version: each layer that has types, then ArchiMate 4's
24
+ * common behaviour types (no layer of their own).
25
+ * @returns {Array<{key: string, label: string, types: ArchimateElementType[]}>}
26
+ */
27
+ static groups(version = '4') {
28
+ return elementTypeGroups(version);
29
+ }
30
+
31
+ /**
32
+ * @param {Object} [options]
33
+ * @param {string} [options.version] - ArchiMate version ('4' or '3.2')
34
+ * @param {(typeName: string) => void} [options.onPick] - A tile was clicked
35
+ * @param {Document} [options.document]
36
+ * @param {string} [options.viewpoint] - Offer only the types this viewpoint allows ('All' or none: every type)
37
+ * @param {Array<Object>} [options.customViewpoints]
38
+ */
39
+ constructor({ version = '4', onPick = () => {}, document: doc = globalThis.document, viewpoint = null, customViewpoints = [] } = {}) {
40
+ this.version = version;
41
+ this.viewpoint = viewpoint && viewpoint !== 'All' ? viewpoint : null;
42
+ this.customViewpoints = customViewpoints;
43
+ this.onPick = onPick;
44
+ this.doc = doc;
45
+ }
46
+
47
+ /** A small picture of a type: its notation glyph, filled with its colour. */
48
+ preview(type, size = this.constructor.TILE.icon) {
49
+ return typeGlyph(type.name, { size, version: this.version, document: this.doc });
50
+ }
51
+
52
+ /** Render into a container (replacing what it held). */
53
+ render(container) {
54
+ const { TILE } = this.constructor;
55
+ const tile = (type) => ({
56
+ attrs: { draggable: 'true', title: type.description ? `${this.itemTitle(type)}: ${type.description}` : this.itemTitle(type), 'aria-label': this.itemTitle(type), 'data-palette-item': this.itemKey(type), ...(type.name && { 'data-archimate-type': type.name }) },
57
+ style: {
58
+ display: 'flex', alignItems: 'center', justifyContent: 'center', padding: TILE.padding,
59
+ border: '1px solid #ddd', borderRadius: '4px', background: '#fff', cursor: 'grab',
60
+ },
61
+ on: {
62
+ dragstart: (e) => { e.dataTransfer.setData(this.dragType, this.itemKey(type)); e.dataTransfer.effectAllowed = 'copy'; },
63
+ click: () => this.onPick(this.itemKey(type)),
64
+ },
65
+ children: [this.preview(type)],
66
+ });
67
+ const group = ({ key, label, types }) => ({
68
+ tag: 'details', attrs: { open: true, 'data-archimate-layer': key }, style: { marginBottom: '6px' },
69
+ children: [
70
+ { tag: 'summary', text: label, style: { fontWeight: 'bold', fontSize: '12px', cursor: 'pointer', margin: '4px 0' } },
71
+ { style: { display: 'grid', gridTemplateColumns: `repeat(${TILE.columns}, 1fr)`, gap: TILE.gap }, children: types.map(tile) },
72
+ ],
73
+ });
74
+ container.replaceChildren(el({ style: { overflowY: 'auto', height: '100%' }, children: this.paletteGroups().map(group) }, this.doc));
75
+ return container;
76
+ }
77
+
78
+ // What a subclass (CanvasPalette) changes: its groups, and how a tile names, shows and drags its item.
79
+
80
+ /** The groups of tiles: `[{key, label, types}]`, narrowed to the viewpoint's types (empty groups go). */
81
+ paletteGroups() {
82
+ const groups = ArchimatePalette.groups(this.version);
83
+ if (!this.viewpoint) return groups;
84
+ const allowed = new Set(ArchimateViewpoints.allowedElementTypes(this.viewpoint, this.version, this.customViewpoints));
85
+ return groups.map(g => ({ ...g, types: g.types.filter(t => allowed.has(t.name)) })).filter(g => g.types.length);
86
+ }
87
+
88
+ /** The data type a dragged tile carries (the editor's drop handler accepts it). */
89
+ get dragType() {
90
+ return ARCHIMATE_TYPE_MIME;
91
+ }
92
+
93
+ /** What a tile picks or drags: an element type's name. */
94
+ itemKey(type) {
95
+ return type.name;
96
+ }
97
+
98
+ /** A tile's caption. */
99
+ itemTitle(type) {
100
+ return TITLE(type.name);
101
+ }
102
+ }
@@ -0,0 +1,105 @@
1
+ import { FormDialog } from '../FormDialog.js';
2
+ import { ArchimateNotation } from '../../archimate.js';
3
+ import { parseCsvTable } from '../../csvTable.js';
4
+ import { planCsvImport } from './csvMapping.js';
5
+ import { ImportRowsCommand } from '../diagrams/ImportRowsCommand.js';
6
+ import { typeTitle } from './archimateNames.js';
7
+
8
+ const KINDS = ['serving', 'realization', 'assignment', 'composition', 'aggregation', 'access', 'flow', 'triggering', 'influence', 'specialization', 'association'];
9
+
10
+ /**
11
+ * Import CSV with mapping…: a spreadsheet's rows into the open model (they
12
+ * add to it, never replace it), the columns chosen in one dialog (csvMapping.js),
13
+ * the new elements placed on the current view. One undo step on the model's
14
+ * history; rows that could not be read are reported after.
15
+ */
16
+ export class CsvImportDialog {
17
+ /**
18
+ * @param {Object} options
19
+ * @param {ArchimateModel} options.model
20
+ * @param {ArchimateView} [options.view] - Where the new elements are placed
21
+ * @param {string} [options.version]
22
+ * @param {Document} [options.document]
23
+ * @param {(result) => void} [options.onDone] - After the import (redraw)
24
+ */
25
+ constructor({ model, view = null, version = '4', document: doc = globalThis.document, onDone = () => {} }) {
26
+ Object.assign(this, { model, view, version, doc, onDone });
27
+ }
28
+
29
+ /** The column a header is most likely to mean, by a pattern; '' when none. */
30
+ static guess(columns, pattern) {
31
+ return columns.find(c => pattern.test(c)) ?? '';
32
+ }
33
+
34
+ /** The mapping a first look at the columns suggests (Name, Type, ID, Documentation; the rest are properties). */
35
+ static suggest(columns) {
36
+ const name = CsvImportDialog.guess(columns, /^name$/i) || CsvImportDialog.guess(columns, /name/i) || columns[0] || '';
37
+ const type = CsvImportDialog.guess(columns, /^(type|kind|class)$/i);
38
+ const id = CsvImportDialog.guess(columns, /^id$/i);
39
+ const documentation = CsvImportDialog.guess(columns, /^(documentation|description|notes?)$/i);
40
+ const used = new Set([name, type, id, documentation]);
41
+ return { name, type, id, documentation, properties: columns.filter(c => !used.has(c)) };
42
+ }
43
+
44
+ /** The mapping a dialog's values describe. */
45
+ static mapping(values) {
46
+ return {
47
+ name: values.name, type: values.type || null, fixedType: values.fixedType, id: values.id || null,
48
+ documentation: values.documentation || null, properties: values.properties ?? [],
49
+ related: values.related || null, relatedKind: values.relatedKind, relatedDirection: values.relatedDirection,
50
+ };
51
+ }
52
+
53
+ /** Ask how the columns map, then import. */
54
+ open(text) {
55
+ const table = parseCsvTable(text);
56
+ if (!table.columns.length || !table.rows.length) return this.tell('The file has no rows to import.');
57
+ const { columns } = table;
58
+ const s = CsvImportDialog.suggest(columns);
59
+ const none = (label) => [['', label], ...columns.map(c => [c, c])];
60
+ const types = ArchimateNotation.elementTypeNames(this.version).map(t => [t, typeTitle(t)]);
61
+ return new FormDialog({
62
+ title: `Import CSV: ${table.rows.length} rows`,
63
+ description: 'Rows become elements, added to the model. A row whose id, or name and type, is an element already updates it.',
64
+ fields: [
65
+ { key: 'name', label: 'Name', type: 'select', value: s.name, choices: columns.map(c => [c, c]) },
66
+ { key: 'type', label: 'Type', type: 'select', value: s.type, choices: none('(the same for every row)') },
67
+ { key: 'fixedType', label: 'Every row is a', type: 'select', value: 'application-component', choices: types, hint: 'When no column holds the type' },
68
+ { key: 'id', label: 'Id', type: 'select', value: s.id, choices: none('(none: by name and type)') },
69
+ { key: 'documentation', label: 'Documentation', type: 'select', value: s.documentation, choices: none('(none)') },
70
+ { key: 'properties', label: 'Properties', type: 'checklist', value: s.properties, choices: columns.map(c => [c, c]) },
71
+ { type: 'heading', label: 'Relationships' },
72
+ { key: 'related', label: 'Related to', type: 'select', value: '', choices: none('(none)'), hint: 'Names or ids, several split by ";"' },
73
+ { key: 'relatedKind', label: 'As', type: 'select', value: 'serving', choices: KINDS.map(k => [k, typeTitle(k)]) },
74
+ { key: 'relatedDirection', label: 'Direction', type: 'select', value: 'out', choices: [['out', 'From the row to them'], ['in', 'From them to the row']] },
75
+ { key: 'place', label: 'Put new elements on this view', type: 'checkbox', value: !!this.view },
76
+ ],
77
+ submitLabel: 'Import',
78
+ idPrefix: 'csv-import-',
79
+ document: this.doc,
80
+ validate: (values) => {
81
+ const plan = planCsvImport(table, CsvImportDialog.mapping(values), this.model, { version: this.version });
82
+ return plan.creates.length || plan.updates.length || plan.relationships.length ? null
83
+ : `Nothing to import${plan.problems.length ? `: ${plan.problems[0].message} (row ${plan.problems[0].row})` : ''}`;
84
+ },
85
+ onApply: (values) => this.import(table, CsvImportDialog.mapping(values), { place: !!values.place }),
86
+ }).open();
87
+ }
88
+
89
+ /** Carry an import out: one undo step; what could not be read is told. @returns the plan */
90
+ import(table, mapping, { place = true } = {}) {
91
+ const plan = planCsvImport(table, mapping, this.model, { version: this.version });
92
+ this.model.history.execute(new ImportRowsCommand(this.model, plan, { view: place ? this.view : null }));
93
+ if (plan.problems.length) {
94
+ this.tell(`Imported. ${plan.problems.length} row${plan.problems.length === 1 ? '' : 's'} left out:\n${plan.problems.slice(0, 8).map(p => `row ${p.row}: ${p.message}`).join('\n')}`);
95
+ }
96
+ this.onDone(plan);
97
+ return plan;
98
+ }
99
+
100
+ /** @private */
101
+ tell(message) {
102
+ (this.doc?.defaultView?.alert ?? globalThis.alert ?? (() => {}))(message);
103
+ return null;
104
+ }
105
+ }
@@ -0,0 +1,74 @@
1
+ import { ArchimateViewpoints } from '../../archimate.js';
2
+ import { LocalJsonStore } from '../storage/LocalJsonStore.js';
3
+ import { CatalogDialog } from '../CatalogDialog.js';
4
+ import { elementTypeChoices } from './elementTypeChoices.js';
5
+
6
+ /** Where the user's own viewpoints are kept (this browser's localStorage). */
7
+ export const CUSTOM_VIEWPOINTS_STORE = new LocalJsonStore('renderengine.archimate.viewpoints');
8
+
9
+ /**
10
+ * CustomViewpoints — the viewpoints a user defines (a name, a description and
11
+ * the element types they allow), offered after the standard ones wherever a
12
+ * viewpoint is chosen. Kept in `store`; both editors read them from there.
13
+ */
14
+ export class CustomViewpoints {
15
+ /** The saved viewpoints (ArchimateViewpoints.custom objects), in order. */
16
+ static load(store = CUSTOM_VIEWPOINTS_STORE) {
17
+ const saved = store.load([]);
18
+ return (Array.isArray(saved) ? saved : [])
19
+ .filter(v => v && typeof v.name === 'string' && v.name)
20
+ .map(v => ArchimateViewpoints.custom({ name: v.name, description: v.description ?? '', allowedTypes: v.allowedTypes ?? [] }));
21
+ }
22
+
23
+ /** Keep `viewpoints` as the saved list. */
24
+ static save(viewpoints, store = CUSTOM_VIEWPOINTS_STORE) {
25
+ return store.save(viewpoints.map(({ name, description, allowedTypes }) => ({ name, description, allowedTypes })));
26
+ }
27
+
28
+ /**
29
+ * Edit the saved viewpoints: name, description and the element types each
30
+ * allows. A standard viewpoint's name cannot be taken.
31
+ * @param {Object} [options]
32
+ * @param {string} [options.version] - Whose element types to offer
33
+ * @param {LocalJsonStore} [options.store]
34
+ * @param {(viewpoints: Array<Object>) => void} [options.onChange] - After a change, with the new list
35
+ * @param {Document} [options.document]
36
+ * @returns {CatalogDialog}
37
+ */
38
+ static dialog({ version = '4', store = CUSTOM_VIEWPOINTS_STORE, onChange = () => {}, document: doc = globalThis.document } = {}) {
39
+ const list = () => CustomViewpoints.load(store);
40
+ const standard = new Set(ArchimateViewpoints.standard.map(v => v.name));
41
+ const write = (viewpoints) => { CustomViewpoints.save(viewpoints, store); };
42
+ return new CatalogDialog({
43
+ title: 'Viewpoints',
44
+ description: 'Viewpoints of your own, offered after the standard ones: the element types each allows.',
45
+ noun: 'viewpoint',
46
+ items: list,
47
+ label: (vp) => `${vp.name} (${vp.allowedTypes.length} type${vp.allowedTypes.length === 1 ? '' : 's'})`,
48
+ fields: (vp) => [
49
+ { key: 'name', label: 'Name', type: 'text', value: vp?.name ?? '' },
50
+ { key: 'description', label: 'Description', type: 'textarea', rows: 2, value: vp?.description ?? '' },
51
+ { key: 'allowedTypes', label: 'Allows', type: 'checklist', value: vp?.allowedTypes ?? [], choices: elementTypeChoices(version) },
52
+ ],
53
+ validate: (vp, { name, allowedTypes }) => {
54
+ const wanted = String(name ?? '').trim();
55
+ if (!wanted) return 'A viewpoint needs a name.';
56
+ if (standard.has(wanted)) return `"${wanted}" is a standard viewpoint.`;
57
+ if (list().some(v => v.name === wanted && v.name !== vp?.name)) return `There is already a viewpoint called "${wanted}".`;
58
+ if (!allowedTypes?.length) return 'Choose at least one element type.';
59
+ return null;
60
+ },
61
+ save: (vp, { name, description, allowedTypes }) => {
62
+ const entry = ArchimateViewpoints.custom({ name: name.trim(), description: description?.trim() ?? '', allowedTypes });
63
+ const current = list();
64
+ const at = vp ? current.findIndex(v => v.name === vp.name) : -1;
65
+ if (at >= 0) current[at] = entry;
66
+ else current.push(entry);
67
+ write(current);
68
+ },
69
+ remove: (vp) => write(list().filter(v => v.name !== vp.name)),
70
+ onChange: () => onChange(list()),
71
+ document: doc,
72
+ });
73
+ }
74
+ }