@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.
- package/LICENSE +21 -0
- package/README.md +203 -2
- package/REFERENCE.md +2198 -0
- package/dist/renderengine-workspace.umd.js +46905 -0
- package/dist/renderengine.umd.js +42223 -0
- package/examples/archimate.html +66 -0
- package/examples/diagram-editor.html +51 -0
- package/package.json +65 -4
- package/src/BaseRenderer.js +57 -0
- package/src/CanvasRenderer.js +194 -0
- package/src/Mat4.js +111 -0
- package/src/OrbitCamera.js +57 -0
- package/src/RendererFactory.js +50 -0
- package/src/SVGRenderer.js +439 -0
- package/src/archimate.js +723 -0
- package/src/archimateArchiFormat.js +1693 -0
- package/src/archimateArchiTypes.js +72 -0
- package/src/archimateArchive.js +140 -0
- package/src/archimateCSV.js +127 -0
- package/src/archimateDrawio.js +182 -0
- package/src/archimateExchangeFormat.js +546 -0
- package/src/archimateRelationshipTable.js +93 -0
- package/src/archimateSpecializations.js +161 -0
- package/src/chartCatalog.js +589 -0
- package/src/charting/ArchimateDiagramEditor.js +1624 -0
- package/src/charting/ArchimateSpecializationSelector.js +134 -0
- package/src/charting/Axis.js +68 -0
- package/src/charting/CameraSeeder.js +30 -0
- package/src/charting/CatalogDialog.js +92 -0
- package/src/charting/Chart.js +37 -0
- package/src/charting/Chart3D.js +99 -0
- package/src/charting/ChartBox.js +80 -0
- package/src/charting/ChartData.js +27 -0
- package/src/charting/ChartRegistry.js +76 -0
- package/src/charting/CheckboxTreeSelector.js +304 -0
- package/src/charting/ColorField.js +107 -0
- package/src/charting/ColorPalette.js +88 -0
- package/src/charting/CommandHistory.js +176 -0
- package/src/charting/DataFilter.js +52 -0
- package/src/charting/Diagram.js +36 -0
- package/src/charting/Diagram3D.js +29 -0
- package/src/charting/DiagramClipboard.js +31 -0
- package/src/charting/DiagramEditor.js +3330 -0
- package/src/charting/DiagramEditorCommand.js +110 -0
- package/src/charting/DiagramEditorCommands.js +237 -0
- package/src/charting/DiagramEditorEdgeCommands.js +142 -0
- package/src/charting/DiagramEditorState.js +98 -0
- package/src/charting/DiagramRegistry.js +86 -0
- package/src/charting/DiagramTypeRegistry.js +326 -0
- package/src/charting/DiagramViewPropertiesDialog.js +46 -0
- package/src/charting/Edge.js +113 -0
- package/src/charting/ErrorBars.js +37 -0
- package/src/charting/FilterSystem.js +285 -0
- package/src/charting/FindReplaceDialog.js +139 -0
- package/src/charting/FormDialog.js +385 -0
- package/src/charting/Gauge.js +58 -0
- package/src/charting/Hierarchy.js +175 -0
- package/src/charting/HintPanel.js +86 -0
- package/src/charting/ImageSelector.js +148 -0
- package/src/charting/InteractionManager.js +725 -0
- package/src/charting/Legend.js +58 -0
- package/src/charting/MenuBar.js +62 -0
- package/src/charting/ModelFileFormat.js +115 -0
- package/src/charting/OrbitControls.js +77 -0
- package/src/charting/Palette.js +119 -0
- package/src/charting/PopupMenu.js +117 -0
- package/src/charting/PropertiesPanel.js +155 -0
- package/src/charting/PropertyListEditor.js +96 -0
- package/src/charting/PropertyLog.js +92 -0
- package/src/charting/SettingsCascade.js +93 -0
- package/src/charting/SettingsDialog.js +53 -0
- package/src/charting/SettingsManager.js +179 -0
- package/src/charting/SettingsViewPropertiesDialog.js +58 -0
- package/src/charting/ShapePaths.js +27 -0
- package/src/charting/Statistics.js +134 -0
- package/src/charting/TemplateCatalog.js +59 -0
- package/src/charting/TemplateLibrary.js +103 -0
- package/src/charting/TextStyle.js +168 -0
- package/src/charting/ViewFit.js +55 -0
- package/src/charting/ViewMenu.js +70 -0
- package/src/charting/ViewPropertiesDialog.js +77 -0
- package/src/charting/ViewTabStrip.js +81 -0
- package/src/charting/archimate/ArchiFileFormat.js +32 -0
- package/src/charting/archimate/ArchimateCanvasEditor.js +815 -0
- package/src/charting/archimate/ArchimateCsvFileFormat.js +35 -0
- package/src/charting/archimate/ArchimateEdge.js +137 -0
- package/src/charting/archimate/ArchimateElementTemplate.js +195 -0
- package/src/charting/archimate/ArchimatePalette.js +102 -0
- package/src/charting/archimate/CsvImportDialog.js +105 -0
- package/src/charting/archimate/CustomViewpoints.js +74 -0
- package/src/charting/archimate/DerivedEdge.js +29 -0
- package/src/charting/archimate/DrawioFileFormat.js +24 -0
- package/src/charting/archimate/ElementFilterRule.js +21 -0
- package/src/charting/archimate/ExchangeFileFormat.js +28 -0
- package/src/charting/archimate/ViewGroupTemplate.js +137 -0
- package/src/charting/archimate/ViewLineEdge.js +84 -0
- package/src/charting/archimate/ViewpointRule.js +45 -0
- package/src/charting/archimate/archimateFileFormats.js +12 -0
- package/src/charting/archimate/archimateNames.js +5 -0
- package/src/charting/archimate/csvMapping.js +122 -0
- package/src/charting/archimate/elementMenuItems.js +32 -0
- package/src/charting/archimate/elementProperties.js +146 -0
- package/src/charting/archimate/elementTypeChoices.js +7 -0
- package/src/charting/archimate/elementTypeGroups.js +19 -0
- package/src/charting/archimate/index.js +17 -0
- package/src/charting/archimate/specializationCatalogDialog.js +64 -0
- package/src/charting/archimate/typeGlyph.js +29 -0
- package/src/charting/arrangement/Arrangement.js +112 -0
- package/src/charting/arrangement/ArrangementCommand.js +29 -0
- package/src/charting/arrangement/BackgroundCommand.js +41 -0
- package/src/charting/arrangement/BackgroundGroup.js +18 -0
- package/src/charting/arrangement/GroupCommand.js +46 -0
- package/src/charting/arrangement/ItemGroup.js +62 -0
- package/src/charting/arrangement/LockCommand.js +32 -0
- package/src/charting/arrangement/UngroupCommand.js +27 -0
- package/src/charting/arrangement/alignment.js +88 -0
- package/src/charting/arrangement/arrangeMenuItems.js +25 -0
- package/src/charting/arrangement/index.js +11 -0
- package/src/charting/arrangement/layouts.js +233 -0
- package/src/charting/canvas/ArchiHint.js +78 -0
- package/src/charting/canvas/CanvasBoxKind.js +39 -0
- package/src/charting/canvas/CanvasPalette.js +49 -0
- package/src/charting/canvas/CanvasTemplateLibrary.js +61 -0
- package/src/charting/canvas/CanvasTemplateMenu.js +151 -0
- package/src/charting/canvas/EditHintCommand.js +28 -0
- package/src/charting/canvas/canvasBoxKinds.js +27 -0
- package/src/charting/canvas/canvasBoxMenuItems.js +40 -0
- package/src/charting/canvas/defaultCanvasTemplates.js +186 -0
- package/src/charting/canvas/diagramBoxKinds.js +12 -0
- package/src/charting/canvas/hintMenuItems.js +49 -0
- package/src/charting/charts/ArcGauge.js +55 -0
- package/src/charting/charts/AreaChart.js +71 -0
- package/src/charting/charts/BarChart.js +80 -0
- package/src/charting/charts/BarChart3D.js +56 -0
- package/src/charting/charts/BarChart3DOrbit.js +53 -0
- package/src/charting/charts/BarChartBase.js +70 -0
- package/src/charting/charts/BarGauge.js +42 -0
- package/src/charting/charts/BoxPlotChart.js +41 -0
- package/src/charting/charts/BubbleChart.js +99 -0
- package/src/charting/charts/BubbleChart3D.js +78 -0
- package/src/charting/charts/BulletGauge.js +87 -0
- package/src/charting/charts/CalendarHeatmapChart.js +204 -0
- package/src/charting/charts/CandlestickChart.js +54 -0
- package/src/charting/charts/ChordDiagram.js +130 -0
- package/src/charting/charts/DensityChart.js +73 -0
- package/src/charting/charts/DialGauge.js +65 -0
- package/src/charting/charts/DonutChart.js +15 -0
- package/src/charting/charts/FunnelChart.js +47 -0
- package/src/charting/charts/GanttChart.js +201 -0
- package/src/charting/charts/GaugeChart.js +175 -0
- package/src/charting/charts/GeoMapChart.js +146 -0
- package/src/charting/charts/GroupedBarChart.js +88 -0
- package/src/charting/charts/GroupedDistributionChart.js +70 -0
- package/src/charting/charts/HeatmapChart.js +80 -0
- package/src/charting/charts/HierarchyChart.js +39 -0
- package/src/charting/charts/HistogramChart.js +45 -0
- package/src/charting/charts/KpiTile.js +72 -0
- package/src/charting/charts/LagPlotChart.js +41 -0
- package/src/charting/charts/LineChart.js +124 -0
- package/src/charting/charts/MultiRingGauge.js +54 -0
- package/src/charting/charts/OutlineChart.js +95 -0
- package/src/charting/charts/ParallelCoordinatesChart.js +130 -0
- package/src/charting/charts/PieChart.js +56 -0
- package/src/charting/charts/PipeChart.js +88 -0
- package/src/charting/charts/PopulationPyramidChart.js +106 -0
- package/src/charting/charts/QQPlotChart.js +64 -0
- package/src/charting/charts/RadarChart.js +76 -0
- package/src/charting/charts/RadialBarChart.js +96 -0
- package/src/charting/charts/RingGauge.js +23 -0
- package/src/charting/charts/SankeyDiagram.js +174 -0
- package/src/charting/charts/ScatterChart.js +104 -0
- package/src/charting/charts/StackedAreaChart.js +15 -0
- package/src/charting/charts/StackedBarChart.js +33 -0
- package/src/charting/charts/StackedBarChart3DOrbit.js +58 -0
- package/src/charting/charts/StreamGraphChart.js +131 -0
- package/src/charting/charts/SunburstChart.js +57 -0
- package/src/charting/charts/ThermometerGauge.js +43 -0
- package/src/charting/charts/TreemapChart.js +54 -0
- package/src/charting/charts/ViolinChart.js +37 -0
- package/src/charting/charts/WaterfallChart.js +66 -0
- package/src/charting/charts/WordCloudChart.js +104 -0
- package/src/charting/diagramModel/AddViewCommand.js +33 -0
- package/src/charting/diagramModel/DiagramModel.js +39 -0
- package/src/charting/diagramModel/DiagramModelSearch.js +22 -0
- package/src/charting/diagramModel/DiagramView.js +50 -0
- package/src/charting/diagramModel/ModelHistory.js +43 -0
- package/src/charting/diagramModel/ModelReport.js +153 -0
- package/src/charting/diagramModel/ModelSearch.js +223 -0
- package/src/charting/diagramModel/RemoveViewCommand.js +25 -0
- package/src/charting/diagramModel/RenameViewCommand.js +21 -0
- package/src/charting/diagramModel/ReplaceTextCommand.js +25 -0
- package/src/charting/diagramModel/ViewSetChecker.js +34 -0
- package/src/charting/diagramModel/ViewSetModel.js +243 -0
- package/src/charting/diagramModel/index.js +6 -0
- package/src/charting/diagramModel/nameTransforms.js +29 -0
- package/src/charting/diagrams/ArchimateCommands.js +141 -0
- package/src/charting/diagrams/ArchimateDiagram.js +263 -0
- package/src/charting/diagrams/ArchimateModel.js +1155 -0
- package/src/charting/diagrams/ArchimateModelChecker.js +125 -0
- package/src/charting/diagrams/ArchimateModelReport.js +128 -0
- package/src/charting/diagrams/ArchimateModelSearch.js +41 -0
- package/src/charting/diagrams/ArchimateValidator.js +357 -0
- package/src/charting/diagrams/CanvasView.js +112 -0
- package/src/charting/diagrams/ContextMenu.js +37 -0
- package/src/charting/diagrams/DataModelDiagram.js +86 -0
- package/src/charting/diagrams/DataModelRelationshipStrategy.js +38 -0
- package/src/charting/diagrams/DerivedRelationships.js +102 -0
- package/src/charting/diagrams/EbnfDiagram.js +39 -0
- package/src/charting/diagrams/EdgeGeometry.js +553 -0
- package/src/charting/diagrams/EditViewItemCommand.js +128 -0
- package/src/charting/diagrams/ElementInstance.js +157 -0
- package/src/charting/diagrams/GraphDiagram.js +1340 -0
- package/src/charting/diagrams/GraphDiagram3D.js +152 -0
- package/src/charting/diagrams/GraphMetrics.js +81 -0
- package/src/charting/diagrams/GridOverlay.js +137 -0
- package/src/charting/diagrams/ImportRowsCommand.js +62 -0
- package/src/charting/diagrams/LabelHelper.js +108 -0
- package/src/charting/diagrams/MergeElementsCommand.js +101 -0
- package/src/charting/diagrams/NestInstanceCommand.js +34 -0
- package/src/charting/diagrams/NodeGeometry.js +158 -0
- package/src/charting/diagrams/PlaceItemsCommand.js +77 -0
- package/src/charting/diagrams/RadialLayout.js +101 -0
- package/src/charting/diagrams/RelationshipInstance.js +93 -0
- package/src/charting/diagrams/RemoveGroupFromViewCommand.js +28 -0
- package/src/charting/diagrams/RemoveLineCommand.js +27 -0
- package/src/charting/diagrams/ShowElementCommand.js +43 -0
- package/src/charting/diagrams/SvgCoordinate.js +17 -0
- package/src/charting/diagrams/SvgZoom.js +127 -0
- package/src/charting/diagrams/Tooltip.js +62 -0
- package/src/charting/diagrams/ViewConnectionInstance.js +102 -0
- package/src/charting/diagrams/ViewObjectInstance.js +56 -0
- package/src/charting/diagrams/commands/AddEdgeCommand.js +34 -0
- package/src/charting/diagrams/commands/AddNodeCommand.js +28 -0
- package/src/charting/diagrams/commands/AddWaypointCommand.js +27 -0
- package/src/charting/diagrams/commands/CreateFolderCommand.js +27 -0
- package/src/charting/diagrams/commands/DeleteEdgeCommand.js +30 -0
- package/src/charting/diagrams/commands/DeleteFolderCommand.js +47 -0
- package/src/charting/diagrams/commands/DeleteNodeCommand.js +35 -0
- package/src/charting/diagrams/commands/DeleteWaypointCommand.js +24 -0
- package/src/charting/diagrams/commands/GraphCommand.js +65 -0
- package/src/charting/diagrams/commands/InvertEdgeCommand.js +24 -0
- package/src/charting/diagrams/commands/MoveNodeCommand.js +44 -0
- package/src/charting/diagrams/commands/MoveWaypointCommand.js +27 -0
- package/src/charting/diagrams/commands/RenameEdgeCommand.js +23 -0
- package/src/charting/diagrams/commands/RenameFolderCommand.js +31 -0
- package/src/charting/diagrams/commands/RenameNodeCommand.js +27 -0
- package/src/charting/diagrams/commands/ResizeNodeCommand.js +46 -0
- package/src/charting/diagrams/commands/UpdateEdgeSideCommand.js +40 -0
- package/src/charting/diagrams/commands/index.js +17 -0
- package/src/charting/diagrams/duplicates.js +49 -0
- package/src/charting/diagrams/nesting.js +30 -0
- package/src/charting/diagrams/roadmap.js +77 -0
- package/src/charting/edgeMarkers/ArrowMarker.js +15 -0
- package/src/charting/edgeMarkers/CircleMarker.js +13 -0
- package/src/charting/edgeMarkers/CrowsFootMarker.js +16 -0
- package/src/charting/edgeMarkers/DiamondMarker.js +15 -0
- package/src/charting/edgeMarkers/EdgeMarker.js +34 -0
- package/src/charting/edgeMarkers/HalfArrowMarker.js +8 -0
- package/src/charting/edgeMarkers/HollowDiamondMarker.js +18 -0
- package/src/charting/edgeMarkers/HollowTriangleMarker.js +18 -0
- package/src/charting/edgeMarkers/OpenArrowMarker.js +17 -0
- package/src/charting/edgeMarkers/index.js +27 -0
- package/src/charting/edgeStyle/EdgeStyleCascade.js +22 -0
- package/src/charting/edgeStyle/EdgeStyleDialog.js +51 -0
- package/src/charting/edgeStyle/EdgeStyleSchema.js +43 -0
- package/src/charting/edgeStyle/SetStyleCommand.js +12 -0
- package/src/charting/edgeStyle/index.js +4 -0
- package/src/charting/emphasis/EmphasisRule.js +42 -0
- package/src/charting/emphasis/HighlightRule.js +24 -0
- package/src/charting/gauges/ArcTrack.js +51 -0
- package/src/charting/gauges/GaugeAnimation.js +51 -0
- package/src/charting/gauges/GaugeBands.js +48 -0
- package/src/charting/gauges/GaugeScale.js +87 -0
- package/src/charting/gauges/GaugeTrack.js +44 -0
- package/src/charting/gauges/GaugeValue.js +61 -0
- package/src/charting/gauges/HorizontalTrack.js +14 -0
- package/src/charting/gauges/LinearTrack.js +29 -0
- package/src/charting/gauges/Sparkline.js +42 -0
- package/src/charting/gauges/VerticalTrack.js +17 -0
- package/src/charting/glyphs/ArrowGlyph.js +21 -0
- package/src/charting/glyphs/BatteryGlyph.js +18 -0
- package/src/charting/glyphs/ChevronGlyph.js +18 -0
- package/src/charting/glyphs/CircleGlyph.js +15 -0
- package/src/charting/glyphs/CloudGlyph.js +19 -0
- package/src/charting/glyphs/ComponentGlyph.js +18 -0
- package/src/charting/glyphs/ConstraintGlyph.js +24 -0
- package/src/charting/glyphs/ContractBoxGlyph.js +10 -0
- package/src/charting/glyphs/CubeGlyph.js +19 -0
- package/src/charting/glyphs/CylinderGlyph.js +19 -0
- package/src/charting/glyphs/DashedDoubleArrowGlyph.js +11 -0
- package/src/charting/glyphs/DeviceGlyph.js +17 -0
- package/src/charting/glyphs/DiamondGlyph.js +17 -0
- package/src/charting/glyphs/DocumentGlyph.js +17 -0
- package/src/charting/glyphs/DoubleArrowGlyph.js +23 -0
- package/src/charting/glyphs/DoubleCircleGlyph.js +24 -0
- package/src/charting/glyphs/EllipseGlyph.js +18 -0
- package/src/charting/glyphs/FactoryGlyph.js +20 -0
- package/src/charting/glyphs/FlagGlyph.js +16 -0
- package/src/charting/glyphs/GapCircleGlyph.js +17 -0
- package/src/charting/glyphs/GearGlyph.js +37 -0
- package/src/charting/glyphs/Glyph.js +98 -0
- package/src/charting/glyphs/GroupingBoxGlyph.js +13 -0
- package/src/charting/glyphs/HalfCircleGlyph.js +22 -0
- package/src/charting/glyphs/HexagonGlyph.js +28 -0
- package/src/charting/glyphs/IconGlyph.js +22 -0
- package/src/charting/glyphs/ImageGlyph.js +16 -0
- package/src/charting/glyphs/JunctionGlyph.js +17 -0
- package/src/charting/glyphs/LollipopGlyph.js +22 -0
- package/src/charting/glyphs/MagnifierGlyph.js +17 -0
- package/src/charting/glyphs/NoteGlyph.js +33 -0
- package/src/charting/glyphs/ObjectBoxGlyph.js +21 -0
- package/src/charting/glyphs/OrJunctionGlyph.js +17 -0
- package/src/charting/glyphs/ParallelogramGlyph.js +20 -0
- package/src/charting/glyphs/PersonGlyph.js +23 -0
- package/src/charting/glyphs/PillGlyph.js +23 -0
- package/src/charting/glyphs/PinGlyph.js +18 -0
- package/src/charting/glyphs/PrincipleGlyph.js +23 -0
- package/src/charting/glyphs/ProductBoxGlyph.js +16 -0
- package/src/charting/glyphs/RectGlyph.js +15 -0
- package/src/charting/glyphs/RoundedBoxGlyph.js +13 -0
- package/src/charting/glyphs/StackGlyph.js +14 -0
- package/src/charting/glyphs/StepsGlyph.js +20 -0
- package/src/charting/glyphs/StickFigureGlyph.js +32 -0
- package/src/charting/glyphs/SystemSoftwareBoxGlyph.js +16 -0
- package/src/charting/glyphs/TabbedBoxGlyph.js +37 -0
- package/src/charting/glyphs/TargetGlyph.js +23 -0
- package/src/charting/glyphs/WavyBoxGlyph.js +17 -0
- package/src/charting/glyphs/WheelGlyph.js +28 -0
- package/src/charting/glyphs/drawGlyph.js +28 -0
- package/src/charting/glyphs/glyphSvg.js +55 -0
- package/src/charting/glyphs/index.js +109 -0
- package/src/charting/modelTree/AnalysisPanel.js +159 -0
- package/src/charting/modelTree/DiagramTabs.js +217 -0
- package/src/charting/modelTree/ModelTree.js +164 -0
- package/src/charting/modelTree/ModelTreePanel.js +914 -0
- package/src/charting/modelTree/TreeBuilder.js +238 -0
- package/src/charting/modelTree/TreeModeRegistry.js +51 -0
- package/src/charting/modelTree/TreeViewMode.js +110 -0
- package/src/charting/modelTree/buildFilterTrees.js +138 -0
- package/src/charting/modelTree/modes/FlatTreeMode.js +46 -0
- package/src/charting/modelTree/modes/LayerGroupedTreeMode.js +62 -0
- package/src/charting/modelTree/modes/TypeGroupedTreeMode.js +60 -0
- package/src/charting/modelTree/treeLayers.js +11 -0
- package/src/charting/report/reportHtml.js +82 -0
- package/src/charting/report/reportViewer.js +118 -0
- package/src/charting/shapes/CircleShape.js +19 -0
- package/src/charting/shapes/PathShape.js +17 -0
- package/src/charting/shapes/RectShape.js +20 -0
- package/src/charting/shapes/Shape.js +20 -0
- package/src/charting/shapes/ShapeFactory.js +23 -0
- package/src/charting/storage/LocalJsonStore.js +43 -0
- package/src/charting/templates/ActorTemplate.js +36 -0
- package/src/charting/templates/BoxTemplate.js +27 -0
- package/src/charting/templates/CircleTemplate.js +18 -0
- package/src/charting/templates/ClassTemplate.js +20 -0
- package/src/charting/templates/CloudTemplate.js +43 -0
- package/src/charting/templates/ComponentTemplate.js +19 -0
- package/src/charting/templates/CylinderTemplate.js +30 -0
- package/src/charting/templates/DataStoreTemplate.js +16 -0
- package/src/charting/templates/DiamondTemplate.js +10 -0
- package/src/charting/templates/DocumentTemplate.js +32 -0
- package/src/charting/templates/EllipseTemplate.js +15 -0
- package/src/charting/templates/FinalStateTemplate.js +12 -0
- package/src/charting/templates/GlyphTemplate.js +47 -0
- package/src/charting/templates/HexagonTemplate.js +17 -0
- package/src/charting/templates/LifelineTemplate.js +20 -0
- package/src/charting/templates/ManualInputTemplate.js +12 -0
- package/src/charting/templates/NoteTemplate.js +23 -0
- package/src/charting/templates/OctagonTemplate.js +7 -0
- package/src/charting/templates/PackageTemplate.js +25 -0
- package/src/charting/templates/ParallelogramTemplate.js +11 -0
- package/src/charting/templates/PentagonTemplate.js +5 -0
- package/src/charting/templates/PolygonTemplate.js +18 -0
- package/src/charting/templates/PredefinedProcessTemplate.js +13 -0
- package/src/charting/templates/RectangleTemplate.js +28 -0
- package/src/charting/templates/RegularPolygonTemplate.js +21 -0
- package/src/charting/templates/RoundedRectangleTemplate.js +5 -0
- package/src/charting/templates/StadiumTemplate.js +8 -0
- package/src/charting/templates/StarTemplate.js +17 -0
- package/src/charting/templates/SwimlaneTemplate.js +18 -0
- package/src/charting/templates/Template.js +208 -0
- package/src/charting/templates/TrapezoidTemplate.js +11 -0
- package/src/charting/templates/TriangleTemplate.js +12 -0
- package/src/charting/templates/index.js +31 -0
- package/src/charting/templates/outline.js +59 -0
- package/src/charting/templates/svg.js +19 -0
- package/src/charting/textToShapes.js +61 -0
- package/src/charting/toolbar/ToolbarButton.js +38 -0
- package/src/charting/toolbar/ToolbarCheckbox.js +31 -0
- package/src/charting/toolbar/ToolbarItem.js +19 -0
- package/src/charting/toolbar/ToolbarMenu.js +36 -0
- package/src/charting/toolbar/ToolbarSelect.js +38 -0
- package/src/charting/toolbar/ToolbarSeparator.js +7 -0
- package/src/charting/toolbar/ToolbarText.js +22 -0
- package/src/charting/toolbar/index.js +8 -0
- package/src/charting/toolbar/pickFile.js +14 -0
- package/src/charting/viewDecorations.js +85 -0
- package/src/charting/zOrder.js +57 -0
- package/src/csvTable.js +61 -0
- package/src/datamodel.js +122 -0
- package/src/datawindow/BoundedWindow.js +36 -0
- package/src/datawindow/FlatDataWindow.js +34 -0
- package/src/datawindow/GraphDataWindow.js +40 -0
- package/src/datawindow/GroupedSampleDataWindow.js +16 -0
- package/src/datawindow/SeriesDataWindow.js +42 -0
- package/src/datawindow/index.js +31 -0
- package/src/diagramCatalog.js +30 -0
- package/src/ebnfDiagram.js +57 -0
- package/src/ebnfParser.js +129 -0
- package/src/exportImage.js +233 -0
- package/src/index.js +2636 -0
- package/src/itIcons.js +84 -0
- package/src/kernelExpr.js +243 -0
- package/src/propertiesDialog.js +463 -0
- package/src/railroadDiagram.js +571 -0
- package/src/treeModeCatalog.js +16 -0
- package/src/workspace/ContextBus.js +79 -0
- package/src/workspace/EditorShell.js +67 -0
- package/src/workspace/Part.js +163 -0
- package/src/workspace/PartFactory.js +49 -0
- package/src/workspace/PartRegistry.js +86 -0
- package/src/workspace/Workspace.js +321 -0
- package/src/workspace/archimateServices.js +33 -0
- package/src/workspace/dom.js +120 -0
- package/src/workspace/index.js +75 -0
- package/src/workspace/layout/GridNode.js +280 -0
- package/src/workspace/layout/LayoutNode.js +89 -0
- package/src/workspace/layout/PartNode.js +77 -0
- package/src/workspace/layout/SplitNode.js +114 -0
- package/src/workspace/layout/TabsNode.js +191 -0
- package/src/workspace/layout/index.js +24 -0
- package/src/workspace/parts/AdapterPart.js +33 -0
- package/src/workspace/parts/ArchimateCanvasPart.js +345 -0
- package/src/workspace/parts/ArchimateEditorPart.js +79 -0
- package/src/workspace/parts/ChartPart.js +115 -0
- package/src/workspace/parts/ContentPart.js +34 -0
- package/src/workspace/parts/DetailPart.js +46 -0
- package/src/workspace/parts/DiagramEditorPart.js +135 -0
- package/src/workspace/parts/EditorPart.js +388 -0
- package/src/workspace/parts/HtmlPart.js +25 -0
- package/src/workspace/parts/ListPart.js +57 -0
- package/src/workspace/parts/ModelFile.js +187 -0
- package/src/workspace/parts/ModelsPart.js +135 -0
- package/src/workspace/styles.js +258 -0
- package/src/workspace/themes.js +96 -0
- package/src/workspace/workArea.js +413 -0
- package/src/workspace/workAreaModel.js +197 -0
- package/src/workspace.js +16 -0
- package/src/zip/ZipArchive.js +160 -0
- package/src/zip/crc32.js +25 -0
- 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
|
+
}
|