@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,37 @@
1
+ import { Statistics } from '../Statistics.js';
2
+ import { GroupedDistributionChart } from './GroupedDistributionChart.js';
3
+
4
+ /**
5
+ * ViolinChart — one mirrored Gaussian-KDE silhouette per group in its own
6
+ * x-slot, the same per-group layout math as BoxPlotChart (same top-level
7
+ * data shape too). Unlike BoxPlotChart's single flat `boxColor`, each violin
8
+ * gets its own palette color: a violin's shape is visually larger/more
9
+ * prominent than a thin box glyph, so per-group color materially helps
10
+ * distinguish many holdings at a glance. A thin median tick is drawn for
11
+ * reference — no outlier dots, since showing the full distribution shape
12
+ * including tails IS the point of a violin.
13
+ */
14
+ export class ViolinChart extends GroupedDistributionChart {
15
+ static chartType = 'violin';
16
+
17
+ _renderGlyph(cx, slotWidth, i, d) {
18
+ const color = this._palette.colorAt(i);
19
+ const curve = Statistics.kernelDensityEstimate(d.values, { min: this._domain.vMin, max: this._domain.vMax });
20
+ const maxDensity = Math.max(...curve.map(p => p.density)) || 1;
21
+ const halfWidth = slotWidth * 0.4;
22
+
23
+ // Mirrored silhouette: right edge low-to-high value, then left
24
+ // edge high-to-low, closing into one filled path — the
25
+ // standard violin construction.
26
+ const rightPts = curve.map(p => ({ px: cx + (p.density / maxDensity) * halfWidth, py: this._toY(p.x) }));
27
+ const leftPts = curve.map(p => ({ px: cx - (p.density / maxDensity) * halfWidth, py: this._toY(p.x) }));
28
+ const path = 'M' + rightPts.map(p => `${p.px},${p.py}`).join(' L')
29
+ + ' L' + [...leftPts].reverse().map(p => `${p.px},${p.py}`).join(' L') + ' Z';
30
+ this.renderer.path(path, color, { color: '#333', width: 1 }, {
31
+ tooltip: `${d.label}: n=${d.values.length}`,
32
+ });
33
+
34
+ const median = Statistics.quantile([...d.values].sort((a, b) => a - b), 0.5);
35
+ this.renderer.path(`M${cx - halfWidth},${this._toY(median)} L${cx + halfWidth},${this._toY(median)}`, 'none', { color: '#fff', width: 2 });
36
+ }
37
+ }
@@ -0,0 +1,66 @@
1
+ import { Chart } from '../Chart.js';
2
+ import { ChartBox, ChartLabels } from '../ChartBox.js';
3
+ import { Axis } from '../Axis.js';
4
+
5
+ /**
6
+ * WaterfallChart — running-total bars, each floating from the previous
7
+ * cumulative value to the new one (a "delta" bar), except entries marked
8
+ * `type:'total'` which draw full-height from zero.
9
+ */
10
+ export class WaterfallChart extends Chart {
11
+ static chartType = 'waterfall';
12
+
13
+ _render() {
14
+ const data = this.data;
15
+ const options = this.options;
16
+ const box = ChartBox.fromRenderer(this.renderer);
17
+ const {
18
+ x = box.x, y = box.y, width = box.width, height = box.height,
19
+ upColor = '#26a69a', downColor = '#ef5350', totalColor = '#5470c6',
20
+ title, xAxisLabel, yAxisLabel,
21
+ } = options;
22
+ const plotBox = { x, y, width, height };
23
+
24
+ let running = 0;
25
+ const bands = data.map(d => {
26
+ if (d.type === 'total') {
27
+ const band = { from: 0, to: d.value, isTotal: true };
28
+ running = d.value;
29
+ return band;
30
+ }
31
+ const from = running;
32
+ running += d.value;
33
+ return { from, to: running, isTotal: false };
34
+ });
35
+ const allVals = bands.flatMap(b => [b.from, b.to]);
36
+ const vMax = Math.max(0, ...allVals);
37
+ const vMin = Math.min(0, ...allVals);
38
+ const range = (vMax - vMin) || 1;
39
+ const toY = (v) => y + height - ((v - vMin) / range) * height;
40
+ const barWidth = width / data.length * 0.7;
41
+ const barMargin = width / data.length * 0.3;
42
+ const textAnchor = this.renderer.centerTextAnchor;
43
+
44
+ new ChartLabels({ title, xAxisLabel, yAxisLabel }).draw(this.renderer, plotBox);
45
+ this.renderer.path(`M${x},${toY(0)} L${x + width},${toY(0)}`, 'none', { color: '#ccc', width: 1 });
46
+ this.renderer.path(`M${x},${y} L${x},${y + height}`, 'none', { color: 'black', width: 1 });
47
+
48
+ for (let i = 0; i < bands.length - 1; i++) {
49
+ const barX = x + i * (barWidth + barMargin);
50
+ const nextX = barX + barWidth + barMargin;
51
+ this.renderer.path(`M${barX + barWidth},${toY(bands[i].to)} L${nextX},${toY(bands[i].to)}`, 'none', { color: '#bbb', width: 1 });
52
+ }
53
+
54
+ data.forEach((d, i) => {
55
+ const band = bands[i];
56
+ const barX = x + i * (barWidth + barMargin);
57
+ const top = toY(Math.max(band.from, band.to));
58
+ const bottom = toY(Math.min(band.from, band.to));
59
+ const color = band.isTotal ? totalColor : (band.to >= band.from ? upColor : downColor);
60
+ this.renderer.rect(barX, top, barWidth, Math.max(1, bottom - top), color, null, {
61
+ tooltip: `${d.label}: ${band.isTotal ? band.to : (d.value >= 0 ? '+' : '') + d.value} (total: ${Axis.formatValue(band.to)})`,
62
+ });
63
+ this.renderer.text(d.label, barX + barWidth / 2, y + height + 20, { textAnchor, fontSize: '10px' });
64
+ });
65
+ }
66
+ }
@@ -0,0 +1,104 @@
1
+ import { Chart } from '../Chart.js';
2
+ import { ColorPalette } from '../ColorPalette.js';
3
+
4
+ /**
5
+ * WordCloudChart — words sized by value and laid out with a simple spiral
6
+ * placement that avoids overlaps.
7
+ *
8
+ * Data: Array<{text: string, value: number}>
9
+ * Options:
10
+ * - title
11
+ * - colors: string[] palette
12
+ * - minFontSize, maxFontSize
13
+ * - fontFamily
14
+ * - padding: extra space around each word for collision detection
15
+ */
16
+ export class WordCloudChart extends Chart {
17
+ static chartType = 'wordCloud';
18
+
19
+ static estimateBox(text, fontSize) {
20
+ // Approximate width: each glyph ~0.55em; height ~1.1em.
21
+ const w = text.length * fontSize * 0.55;
22
+ const h = fontSize * 1.1;
23
+ return { w, h };
24
+ }
25
+
26
+ _render() {
27
+ const data = this.data || [];
28
+ const options = this.options || {};
29
+ const w = this.renderer?.width ?? 800;
30
+ const h = this.renderer?.height ?? 400;
31
+
32
+ const {
33
+ x = 40, y = 40,
34
+ width = w - x - 40,
35
+ height = h - y - 60,
36
+ title,
37
+ colors,
38
+ minFontSize = 12,
39
+ maxFontSize = 48,
40
+ fontFamily = 'sans-serif',
41
+ padding = 4,
42
+ } = options;
43
+
44
+ const palette = new ColorPalette(colors);
45
+ const textAnchor = this.renderer.centerTextAnchor;
46
+ const sorted = [...data].filter(d => d.text && d.value > 0).sort((a, b) => b.value - a.value);
47
+ if (sorted.length === 0) return;
48
+
49
+ const maxValue = sorted[0].value;
50
+ const minValue = Math.max(1, sorted[sorted.length - 1].value);
51
+ const valueRange = Math.max(1, maxValue - minValue);
52
+ const scale = (v) => minFontSize + ((v - minValue) / valueRange) * (maxFontSize - minFontSize);
53
+
54
+ const cx = x + width / 2;
55
+ const cy = y + height / 2;
56
+ const placed = [];
57
+
58
+ if (title) {
59
+ this.renderer.text(title, x + width / 2, y - 10, { textAnchor: 'middle', fontSize: '18px', fill: '#333' });
60
+ }
61
+
62
+ sorted.forEach((d, i) => {
63
+ const fontSize = scale(d.value);
64
+ const box = WordCloudChart.estimateBox(d.text, fontSize);
65
+ const pos = this._findPosition(cx, cy, box.w, box.h, placed, padding, width, height);
66
+ if (!pos) return; // Could not place; skip.
67
+ placed.push({ x: pos.x, y: pos.y, w: box.w, h: box.h });
68
+ const color = palette.colorAt(i);
69
+ this.renderer.text(d.text, pos.x, pos.y + fontSize * 0.35, {
70
+ textAnchor, fontSize: `${fontSize}px`, fill: color, fontFamily,
71
+ tooltip: `${d.text}: ${d.value}`,
72
+ });
73
+ });
74
+ }
75
+
76
+ _findPosition(cx, cy, w, h, placed, padding, maxW, maxH) {
77
+ const bounds = { x: cx - maxW / 2, y: cy - maxH / 2, w: maxW, h: maxH };
78
+ // Try center first.
79
+ const candidates = [{ x: cx, y: cy }];
80
+ // Spiral outward.
81
+ const a = 5; // spiral tightness
82
+ for (let t = 0; t < 2000; t += 0.5) {
83
+ const r = a * t;
84
+ const px = cx + r * Math.cos(t);
85
+ const py = cy + r * Math.sin(t);
86
+ candidates.push({ x: px, y: py });
87
+ }
88
+
89
+ for (const p of candidates) {
90
+ const rect = { x: p.x - w / 2 - padding, y: p.y - h / 2 - padding, w: w + padding * 2, h: h + padding * 2 };
91
+ if (rect.x < bounds.x || rect.y < bounds.y || rect.x + rect.w > bounds.x + bounds.w || rect.y + rect.h > bounds.y + bounds.h) {
92
+ continue;
93
+ }
94
+ if (!placed.some(other => this._overlap(rect, other))) {
95
+ return p;
96
+ }
97
+ }
98
+ return null;
99
+ }
100
+
101
+ _overlap(a, b) {
102
+ return a.x < b.x + b.w && a.x + a.w > b.x && a.y < b.y + b.h && a.y + a.h > b.y;
103
+ }
104
+ }
@@ -0,0 +1,33 @@
1
+ import { Command } from '../CommandHistory.js';
2
+
3
+ /**
4
+ * AddViewCommand — a view added to a model (new, duplicated, generated, a
5
+ * canvas or template), last in order and, with `current`, shown. Undo takes
6
+ * it away and shows the view that was in front.
7
+ */
8
+ export class AddViewCommand extends Command {
9
+ /** A view added or removed is no edit on a view: undoing it shows no other. */
10
+ viewId = null;
11
+
12
+ /**
13
+ * @param {ViewSetModel} model
14
+ * @param {Object} view
15
+ * @param {{current?: boolean, label?: string}} [options]
16
+ */
17
+ constructor(model, view, { current = true, label = `Add "${view.title || view.name || view.id}"` } = {}) {
18
+ super(label);
19
+ this.model = model;
20
+ this.view = view;
21
+ this.current = current;
22
+ this._before = null;
23
+ }
24
+
25
+ execute() {
26
+ this._before = this.model.currentViewId;
27
+ this.model._insertView(this.view, { current: this.current });
28
+ }
29
+
30
+ undo() {
31
+ this.model._removeView(this.view.id, { next: this._before });
32
+ }
33
+ }
@@ -0,0 +1,39 @@
1
+ import { DiagramView } from './DiagramView.js';
2
+ import { ViewSetModel } from './ViewSetModel.js';
3
+ import { DiagramModelSearch } from './DiagramModelSearch.js';
4
+
5
+ /**
6
+ * DiagramModel — the template editor's diagrams (views) edited together: the
7
+ * palette category shared by all of them and model-level line style defaults.
8
+ * Creating, duplicating, renaming, deleting and switching views come from
9
+ * ViewSetModel.
10
+ */
11
+ export class DiagramModel extends ViewSetModel {
12
+ /**
13
+ * @param {Object} [options]
14
+ * @param {string} [options.templateType] - Palette category shared by every view
15
+ * @param {Object} [options.edgeStyle] - Model-level line style defaults
16
+ * @param {Object} [options.historyOptions] - CommandHistory options for each view (e.g. onChange)
17
+ * @param {string} [options.name] - What the model is called
18
+ */
19
+ constructor({ templateType = 'generic', edgeStyle = {}, historyOptions = {}, name = '' } = {}) {
20
+ super({ idPrefix: 'view', viewNoun: 'Diagram' });
21
+ this.name = name;
22
+ this.templateType = templateType;
23
+ this.edgeStyle = edgeStyle;
24
+ this.historyOptions = historyOptions;
25
+ }
26
+
27
+ _newView(id, title) {
28
+ return new DiagramView({ id, title, historyOptions: this.historyOptions });
29
+ }
30
+
31
+ /** Find and replace: the views, their shapes' names and lines' labels (DiagramModelSearch). */
32
+ search() {
33
+ return new DiagramModelSearch(this);
34
+ }
35
+
36
+ setTemplateType(templateType) {
37
+ this.templateType = templateType;
38
+ }
39
+ }
@@ -0,0 +1,22 @@
1
+ import { ModelSearch } from './ModelSearch.js';
2
+
3
+ /**
4
+ * DiagramModelSearch — find and replace in the template editor's diagrams: on
5
+ * top of the model and views (ModelSearch), each shape's name and each line's
6
+ * label, which belong to their view.
7
+ */
8
+ export class DiagramModelSearch extends ModelSearch {
9
+ viewItemTargets(view) {
10
+ const shapes = [...(view.templates?.values() ?? [])].map(t => ({
11
+ kind: 'shape', id: t.id, viewId: view.id, owner: t.name || t.id, field: 'name', fieldLabel: 'Name',
12
+ read: () => t.name ?? '',
13
+ write: (text) => { t.name = text; },
14
+ }));
15
+ const lines = [...(view.edges?.values() ?? [])].filter(e => e.label).map(e => ({
16
+ kind: 'line', id: e.id, viewId: view.id, owner: e.label, field: 'name', fieldLabel: 'Label',
17
+ read: () => e.label ?? '',
18
+ write: (text) => { e.label = text; },
19
+ }));
20
+ return [...shapes, ...lines];
21
+ }
22
+ }
@@ -0,0 +1,50 @@
1
+ import { DiagramEditorState } from '../DiagramEditorState.js';
2
+
3
+ /**
4
+ * DiagramView — one diagram (tab) of a DiagramModel: its shapes, lines,
5
+ * diagram-level line style and its own undo history (from DiagramEditorState).
6
+ *
7
+ * A DiagramEditor is bound directly to `templates`/`edges`, so edits land here
8
+ * with nothing to save back, and the history survives the editor being rebuilt.
9
+ */
10
+ export class DiagramView extends DiagramEditorState {
11
+ /**
12
+ * @param {Object} options
13
+ * @param {string} options.id
14
+ * @param {string} options.title
15
+ * @param {Map<string, Template>} [options.templates]
16
+ * @param {Map<string, Edge>} [options.edges]
17
+ * @param {Object} [options.edgeStyle] - Diagram-level line style defaults
18
+ * @param {Object} [options.historyOptions] - Passed to CommandHistory (e.g. onChange)
19
+ * @param {string} [options.documentation]
20
+ */
21
+ constructor({ id, title, templates = new Map(), edges = new Map(), edgeStyle = {}, historyOptions = {}, documentation = undefined, arrangement = null }) {
22
+ super({ historyOptions, arrangement });
23
+ this.historyOptions = historyOptions;
24
+ this.id = id;
25
+ this.title = title;
26
+ this.documentation = documentation;
27
+ this.templates = templates;
28
+ this.edges = edges;
29
+ this.edgeStyle = edgeStyle;
30
+ }
31
+
32
+ /** The shapes are what stack. */
33
+ layerItems() {
34
+ return [...this.templates.values()];
35
+ }
36
+
37
+ /** An independent copy: shapes, lines, style and documentation are copied; history starts empty (same options). */
38
+ copy(id, title, historyOptions = this.historyOptions) {
39
+ return new DiagramView({
40
+ id,
41
+ title,
42
+ templates: new Map([...this.templates].map(([tid, t]) => [tid, new t.constructor(tid, t.name, t.serialize())])),
43
+ edges: new Map([...this.edges].map(([eid, e]) => [eid, e.clone()])),
44
+ edgeStyle: { ...this.edgeStyle },
45
+ documentation: this.documentation,
46
+ historyOptions,
47
+ arrangement: this.arrangement.copy(), // template ids are kept
48
+ });
49
+ }
50
+ }
@@ -0,0 +1,43 @@
1
+ import { CommandHistory } from '../CommandHistory.js';
2
+
3
+ /**
4
+ * ModelHistory — one undo history for a whole model (Archi's command stack
5
+ * per model): every view's edits, and the model's own (views added,
6
+ * renamed, deleted; elements edited from the tree), in the order they were
7
+ * made. Each edit remembers the view in front when it was made (`viewId`),
8
+ * and undoing or redoing it shows that view again, so the change is seen.
9
+ * A command that names no view of its own (a view added or removed) sets
10
+ * `viewId = null`.
11
+ */
12
+ export class ModelHistory extends CommandHistory {
13
+ /**
14
+ * @param {ViewSetModel} model
15
+ * @param {Object} [options] - CommandHistory options
16
+ */
17
+ constructor(model, options = {}) {
18
+ super(options);
19
+ this.model = model;
20
+ }
21
+
22
+ execute(cmd) {
23
+ if (cmd && typeof cmd === 'object' && !('viewId' in cmd)) cmd.viewId = this.model.currentViewId;
24
+ const done = super.execute(cmd);
25
+ if (done !== cmd && done && !('viewId' in done)) done.viewId = cmd.viewId; // merged into the last one
26
+ return done;
27
+ }
28
+
29
+ undo() {
30
+ return this._show(super.undo());
31
+ }
32
+
33
+ redo() {
34
+ return this._show(super.redo());
35
+ }
36
+
37
+ /** Show the view an undone or redone edit was made on (after the change, so it is drawn changed). @private */
38
+ _show(cmd) {
39
+ const id = cmd?.viewId;
40
+ if (id && id !== this.model.currentViewId && this.model.getView(id)) this.model.switchTo(id);
41
+ return cmd;
42
+ }
43
+ }
@@ -0,0 +1,153 @@
1
+ /**
2
+ * ModelReport — what a browsable report of a model holds, as plain JSON
3
+ * (reportHtml writes it out as a page): a page per item (the model, each
4
+ * view, and whatever a notation's model adds: elements, relationships, ...)
5
+ * and the tree the pages are found by.
6
+ *
7
+ * Here, what every view set has: the model's page, and a page per view with
8
+ * its documentation, properties and picture. A notation's model returns a
9
+ * subclass from `model.report()` that adds its own items (`conceptItems()`),
10
+ * tree sections (`conceptSections()`) and what a view's page lists
11
+ * (`viewLists(view)`).
12
+ *
13
+ * An item: `{ key, name, kind, type, color?, documentation?, properties:
14
+ * [{name, value}], facts: [{label, text} | {label, key}], lists: [{title,
15
+ * rows: [{key, note?}]}], picture? }`; a fact or row with a `key` links to
16
+ * that item's page. A picture (from the editor, see DiagramEditor#viewPicture)
17
+ * is `{ svg, viewBox: {x, y, width, height}, areas: [{ref, x, y, width,
18
+ * height}] }`; an area's `ref` (`{kind, id}`) is the item it opens.
19
+ */
20
+ export class ModelReport {
21
+ /**
22
+ * @param {ViewSetModel} model
23
+ * @param {Object} [options]
24
+ * @param {Object<string, Object>} [options.pictures] - Each view's picture, by view id
25
+ * @param {string} [options.title] - Default: the model's name
26
+ */
27
+ constructor(model, { pictures = {}, title = null } = {}) {
28
+ this.model = model;
29
+ this.pictures = pictures;
30
+ this._title = title;
31
+ }
32
+
33
+ /** The report's title: the model's name, or what was asked for. */
34
+ get title() {
35
+ return this._title || this.model.name || this.model.title || 'Model';
36
+ }
37
+
38
+ /** An item's key: unique across kinds, since a view and an element may share an id. */
39
+ key(kind, id) {
40
+ return `${kind}:${id}`;
41
+ }
42
+
43
+ /** The report: `{ title, home, sections, items }` (see the class). */
44
+ data() {
45
+ const items = [this.modelItem(), ...this.viewItems(), ...this.conceptItems()];
46
+ return {
47
+ title: this.title,
48
+ home: items[0].key,
49
+ sections: [...this.conceptSections(), this.viewSection()]
50
+ .map(s => ({ ...s, groups: s.groups.filter(g => g.keys.length) }))
51
+ .filter(s => s.groups.length),
52
+ items: Object.fromEntries(items.map(item => [item.key, item])),
53
+ };
54
+ }
55
+
56
+ /** The model's own page: its documentation, properties and how much it holds. */
57
+ modelItem() {
58
+ const model = this.model;
59
+ return this.item('model', model.id ?? 'model', {
60
+ name: this.title, type: 'Model',
61
+ documentation: model.documentation,
62
+ properties: model.properties,
63
+ facts: this.modelFacts(),
64
+ });
65
+ }
66
+
67
+ /** The model page's counts: its views (a subclass adds its own). */
68
+ modelFacts() {
69
+ return [{ label: 'Views', text: String(this.model.views().length) }];
70
+ }
71
+
72
+ /** A page per view. */
73
+ viewItems() {
74
+ return this.model.views().map(view => this.item('view', view.id, {
75
+ name: view.title || view.name || view.id,
76
+ type: this.viewType(view),
77
+ documentation: view.documentation,
78
+ properties: view.properties,
79
+ facts: this.viewFacts(view),
80
+ lists: this.viewLists(view),
81
+ picture: this.picture(view),
82
+ }));
83
+ }
84
+
85
+ /** What kind of view a view is, as its page says. */
86
+ viewType(view) {
87
+ return 'View';
88
+ }
89
+
90
+ /** A view's picture, with its areas' refs turned into item keys (an area with nothing to open is dropped). */
91
+ picture(view) {
92
+ const picture = this.pictures[view.id];
93
+ if (!picture) return undefined;
94
+ const areas = (picture.areas ?? [])
95
+ .map(({ ref, ...box }) => ({ ...box, key: ref && this.key(ref.kind, ref.id) }))
96
+ .filter(area => area.key);
97
+ return { svg: picture.svg, viewBox: picture.viewBox, areas };
98
+ }
99
+
100
+ /** A view's facts (its viewpoint, ...): none here. */
101
+ viewFacts(view) {
102
+ return [];
103
+ }
104
+
105
+ /** What a view's page lists (its elements, ...): none here. */
106
+ viewLists(view) {
107
+ return [];
108
+ }
109
+
110
+ /** The tree's Views section. */
111
+ viewSection() {
112
+ return { title: 'Views', groups: [{ title: null, keys: this.model.views().map(v => this.key('view', v.id)) }] };
113
+ }
114
+
115
+ /** A notation's own items (elements, relationships): none here. */
116
+ conceptItems() {
117
+ return [];
118
+ }
119
+
120
+ /** A notation's own tree sections, before Views: none here. */
121
+ conceptSections() {
122
+ return [];
123
+ }
124
+
125
+ /**
126
+ * An item from its kind, id and fields: empty lists dropped, properties as
127
+ * `[{name, value}]` whichever way the model keeps them.
128
+ * @protected
129
+ */
130
+ item(kind, id, { name, type, color, documentation, properties, facts = [], lists = [], picture } = {}) {
131
+ const props = ModelReport.properties(properties);
132
+ return {
133
+ key: this.key(kind, id),
134
+ name: name || id, kind, type,
135
+ ...(color && { color }),
136
+ ...(documentation && { documentation: String(documentation) }),
137
+ ...(props.length && { properties: props }),
138
+ ...(facts.length && { facts }),
139
+ ...(lists.some(l => l.rows.length) && { lists: lists.filter(l => l.rows.length) }),
140
+ ...(picture && { picture }),
141
+ };
142
+ }
143
+
144
+ /** Properties as `[{name, value}]`, from `[{name|key, value}]`, `[[name, value]]` or `{name: value}`. */
145
+ static properties(properties) {
146
+ if (!properties) return [];
147
+ const list = Array.isArray(properties) ? properties : Object.entries(properties);
148
+ return list.map(p => (Array.isArray(p)
149
+ ? { name: String(p[0]), value: String(p[1] ?? '') }
150
+ : { name: String(p.name ?? p.key ?? ''), value: String(p.value ?? '') }))
151
+ .filter(p => p.name);
152
+ }
153
+ }