@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,463 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* propertiesDialog — the "Show/Edit Properties" dialog, as a shipped feature.
|
|
3
|
+
*
|
|
4
|
+
* `graphDiagram` has always had the HOOKS for this (`onNodeDoubleClick`,
|
|
5
|
+
* `contextMenuItems`, `NODE_STRUCTURAL_KEYS`) but not the dialog, which lived
|
|
6
|
+
* only in `test/charts.html`. A consumer wanting double-click-to-edit therefore
|
|
7
|
+
* had to copy 400 lines out of a demo page — so nobody did, and diagrams that
|
|
8
|
+
* could have been editable were read-only. This is that dialog, generalized.
|
|
9
|
+
*
|
|
10
|
+
* Two halves, split on testability:
|
|
11
|
+
*
|
|
12
|
+
* - The DECISIONS are pure functions over plain objects — which fields a
|
|
13
|
+
* subject has, which section each belongs to, which control type edits it,
|
|
14
|
+
* how a typed value is read back out of a string, and whether a derived
|
|
15
|
+
* colour/icon may be refreshed silently. No DOM.
|
|
16
|
+
* - The dialog itself is a FormDialog built from those: a thin shell.
|
|
17
|
+
*
|
|
18
|
+
* Nothing here runs at import time, so this module loads under node.
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
import { LabelHelper } from './charting/diagrams/LabelHelper.js';
|
|
22
|
+
import { ArchimateDiagram } from './charting/diagrams/ArchimateDiagram.js';
|
|
23
|
+
import { ArchimateSpecializationSelector } from './charting/ArchimateSpecializationSelector.js';
|
|
24
|
+
import { FormDialog } from './charting/FormDialog.js';
|
|
25
|
+
import { el } from './workspace/dom.js';
|
|
26
|
+
import { TextStyle } from './charting/TextStyle.js';
|
|
27
|
+
import { PropertyListEditor, PROPERTY_TYPES, coercePropertyValue, stringifyPropertyValue } from './charting/PropertyListEditor.js';
|
|
28
|
+
|
|
29
|
+
export { PROPERTY_TYPES, coercePropertyValue, stringifyPropertyValue };
|
|
30
|
+
|
|
31
|
+
/** ArchiMate's own layers plus the engine's catch-all — a closed list. */
|
|
32
|
+
export const LAYER_CHOICES = [
|
|
33
|
+
'strategy', 'business', 'application', 'technology',
|
|
34
|
+
'physical', 'motivation', 'implementation', 'other',
|
|
35
|
+
];
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Which section of the form a node field belongs to.
|
|
39
|
+
*
|
|
40
|
+
* OBJECT is the concept itself — the same whatever diagram draws it. DIAGRAM is
|
|
41
|
+
* this view's own presentation of it. Both live on the one flat node object
|
|
42
|
+
* `graphDiagram` renders (there is no model/view split under the hood); the
|
|
43
|
+
* grouping keeps the distinction visible while editing, which is the whole
|
|
44
|
+
* point of an architecture tool.
|
|
45
|
+
*/
|
|
46
|
+
export const NODE_SECTIONS = {
|
|
47
|
+
object: ['name', 'description', 'type', 'specialization'],
|
|
48
|
+
diagram: ['label', 'layer', 'color', 'strokeColor', 'textColor', 'icon', 'group', 'size', 'useDistinctShape'],
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
/** What a field is called in the dialog, where its key would not read well. */
|
|
52
|
+
export const FIELD_LABELS = {
|
|
53
|
+
color: 'Fill colour', strokeColor: 'Line colour', textColor: 'Text colour',
|
|
54
|
+
useDistinctShape: 'Distinct shape',
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
/** Which control edits which field. Anything unlisted is a plain text box. */
|
|
58
|
+
const FIELD_TYPES = {
|
|
59
|
+
description: 'textarea',
|
|
60
|
+
documentation: 'textarea',
|
|
61
|
+
notes: 'textarea',
|
|
62
|
+
tooltip: 'textarea',
|
|
63
|
+
color: 'color',
|
|
64
|
+
strokeColor: 'color',
|
|
65
|
+
textColor: 'color',
|
|
66
|
+
layer: 'select',
|
|
67
|
+
icon: 'select',
|
|
68
|
+
type: 'select-editable',
|
|
69
|
+
specialization: 'select-editable',
|
|
70
|
+
useDistinctShape: 'checkbox',
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* The rows a dialog should show, in order, already sectioned and typed.
|
|
75
|
+
*
|
|
76
|
+
* @param {object} subject the node or edge being edited
|
|
77
|
+
* @param {'node'|'edge'} kind
|
|
78
|
+
* @param {object} [ctx]
|
|
79
|
+
* @param {string[]} [ctx.typeChoices] suggestions for `type`
|
|
80
|
+
* @param {string[]} [ctx.iconChoices] options for `icon`
|
|
81
|
+
* @param {string[]} [ctx.extraKeys] caller-added fields, from the engine's
|
|
82
|
+
* own "extra data" reckoning — shown under Other/Extra
|
|
83
|
+
* @returns {Array<{key, value, section, type, choices?, readOnly?}>}
|
|
84
|
+
*/
|
|
85
|
+
export function propertyRowsFor(subject = {}, kind = 'node', ctx = {}) {
|
|
86
|
+
const { typeChoices = [], iconChoices = [], relationshipChoices = [], specializationChoices = [], extraKeys = [] } = ctx;
|
|
87
|
+
const rows = [];
|
|
88
|
+
const seen = new Set();
|
|
89
|
+
const push = (key, section, over = {}) => {
|
|
90
|
+
if (seen.has(key)) return;
|
|
91
|
+
seen.add(key);
|
|
92
|
+
rows.push({
|
|
93
|
+
key, section, value: subject[key],
|
|
94
|
+
type: over.type ?? FIELD_TYPES[key] ?? 'text',
|
|
95
|
+
...(over.choices ? { choices: over.choices } : {}),
|
|
96
|
+
...(over.readOnly ? { readOnly: true } : {}),
|
|
97
|
+
});
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
if (kind === 'edge') {
|
|
101
|
+
// The ends are identity, not a property — renaming one would silently
|
|
102
|
+
// re-wire the diagram, which is a different (and destructive) action
|
|
103
|
+
// from editing what the relationship IS.
|
|
104
|
+
push('source', 'edge', { readOnly: true });
|
|
105
|
+
push('target', 'edge', { readOnly: true });
|
|
106
|
+
push('label', 'edge');
|
|
107
|
+
push('kind', 'edge', { type: 'select', choices: relationshipChoices });
|
|
108
|
+
push('weight', 'edge');
|
|
109
|
+
push('color', 'edge');
|
|
110
|
+
push('tooltip', 'edge');
|
|
111
|
+
} else {
|
|
112
|
+
for (const key of NODE_SECTIONS.object) {
|
|
113
|
+
push(key, 'object',
|
|
114
|
+
key === 'type' ? { choices: typeChoices }
|
|
115
|
+
: key === 'specialization' ? { choices: specializationChoices }
|
|
116
|
+
: {});
|
|
117
|
+
}
|
|
118
|
+
for (const key of NODE_SECTIONS.diagram) {
|
|
119
|
+
push(key, 'diagram',
|
|
120
|
+
key === 'layer' ? { choices: LAYER_CHOICES }
|
|
121
|
+
: key === 'icon' ? { choices: iconChoices }
|
|
122
|
+
: {});
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
for (const key of extraKeys) push(key, 'other');
|
|
126
|
+
return rows;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Read an edited string back as the type the field originally held.
|
|
131
|
+
*
|
|
132
|
+
* A field that was a number must not come back as the string "3" — the diagram
|
|
133
|
+
* sizes and scales off it. Invalid JSON in an array field leaves the value
|
|
134
|
+
* alone rather than destroying it.
|
|
135
|
+
*/
|
|
136
|
+
export function coerceFieldValue(raw, { wasArray = false, wasNumber = false, wasBoolean = false, previous } = {}) {
|
|
137
|
+
if (wasArray) {
|
|
138
|
+
try { return JSON.parse(raw); } catch { return previous; }
|
|
139
|
+
}
|
|
140
|
+
if (wasNumber) return raw === '' ? undefined : Number(raw);
|
|
141
|
+
if (wasBoolean) return raw === 'true';
|
|
142
|
+
return raw;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* After a layer/type change, may the derived colour and icon be refreshed
|
|
147
|
+
* WITHOUT asking?
|
|
148
|
+
*
|
|
149
|
+
* Only when they were never customised — still exactly what auto-derivation
|
|
150
|
+
* gave the OLD layer/type, and not something typed in this same edit. There is
|
|
151
|
+
* nothing of the user's to lose in that case. Anything they chose deliberately
|
|
152
|
+
* is theirs, and gets a prompt instead.
|
|
153
|
+
*
|
|
154
|
+
* @returns {{color: boolean, icon: boolean, changed: boolean}}
|
|
155
|
+
*/
|
|
156
|
+
export function derivedRefreshPlan({
|
|
157
|
+
layerChanged = false, typeChanged = false,
|
|
158
|
+
colorWasAuto = false, iconWasAuto = false,
|
|
159
|
+
colorFieldUntouched = true, iconFieldUntouched = true,
|
|
160
|
+
} = {}) {
|
|
161
|
+
const changed = !!(layerChanged || typeChanged);
|
|
162
|
+
return {
|
|
163
|
+
changed,
|
|
164
|
+
color: changed && colorWasAuto && colorFieldUntouched,
|
|
165
|
+
icon: changed && iconWasAuto && iconFieldUntouched,
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/* ── DOM side ────────────────────────────────────────────────────────────── */
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* Show the properties of one node or edge, editable.
|
|
173
|
+
*
|
|
174
|
+
* @param {object} subject the node/edge object the diagram is rendering
|
|
175
|
+
* @param {RenderEngine} engine
|
|
176
|
+
* @param {'node'|'edge'} kind
|
|
177
|
+
* @param {object} [options]
|
|
178
|
+
* @param {Function} [options.onSave] (subject, changedKeys) — persist here.
|
|
179
|
+
* The subject is already updated and the diagram already re-rendered.
|
|
180
|
+
* @param {Document} [options.document]
|
|
181
|
+
*/
|
|
182
|
+
export function showPropertiesDialog(subject, engine, kind = 'node', options = {}) {
|
|
183
|
+
// A context-menu action's exception is otherwise swallowed by the menu's
|
|
184
|
+
// own click listener — nothing visibly happens, with no clue why.
|
|
185
|
+
try {
|
|
186
|
+
return showPropertiesDialogUnsafe(subject, engine, kind, options);
|
|
187
|
+
} catch (err) {
|
|
188
|
+
console.error('showPropertiesDialog failed:', err);
|
|
189
|
+
// eslint-disable-next-line no-alert
|
|
190
|
+
(options.document ?? document).defaultView?.alert?.(`Properties failed: ${err?.message ?? err}`);
|
|
191
|
+
return null;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
const SECTION_LABELS = { object: 'Object', diagram: 'Diagram', other: 'Other', edge: null };
|
|
196
|
+
|
|
197
|
+
function showPropertiesDialogUnsafe(subject, engine, kind, options = {}) {
|
|
198
|
+
const doc = options.document ?? document;
|
|
199
|
+
const RenderEngineClass = engine.constructor;
|
|
200
|
+
const notation = RenderEngineClass.ArchimateNotation;
|
|
201
|
+
const structuralKeys = engine._graphDiagram?.structuralKeys(kind === 'edge' ? 'edge' : 'node')
|
|
202
|
+
?? (kind === 'edge' ? RenderEngineClass.EDGE_STRUCTURAL_KEYS : RenderEngineClass.NODE_STRUCTURAL_KEYS);
|
|
203
|
+
const isNode = kind === 'node';
|
|
204
|
+
// The SAME catalog version the diagram itself was built with, so the
|
|
205
|
+
// dropdown offers exactly what is actually resolvable.
|
|
206
|
+
const version = engine._archimateOptions?.archimateVersion || '4';
|
|
207
|
+
|
|
208
|
+
const typeChoices = isNode && notation
|
|
209
|
+
? [...new Set([
|
|
210
|
+
...notation.elementTypeNames(version),
|
|
211
|
+
...(engine._chartState?.nodes ?? []).map(n => n.type).filter(Boolean),
|
|
212
|
+
])].sort()
|
|
213
|
+
: [];
|
|
214
|
+
const iconChoices = isNode && notation ? notation.iconChoices(subject.type, version) : [];
|
|
215
|
+
const relationshipChoices = !isNode && notation ? notation.relationshipTypeNames() : [];
|
|
216
|
+
const specializationChoices = isNode && notation
|
|
217
|
+
? RenderEngineClass.ArchimateSpecializationRegistry?.list().map(s => s.name).sort() ?? []
|
|
218
|
+
: [];
|
|
219
|
+
const extraKeys = (LabelHelper.nodeExtraDataLines(subject, structuralKeys))
|
|
220
|
+
.map(line => line.slice(0, line.indexOf(':')))
|
|
221
|
+
.filter(Boolean);
|
|
222
|
+
|
|
223
|
+
const rows = propertyRowsFor(subject, kind, { typeChoices, iconChoices, relationshipChoices, specializationChoices, extraKeys });
|
|
224
|
+
|
|
225
|
+
const specSelect = isNode && RenderEngineClass.ArchimateSpecializationRegistry
|
|
226
|
+
? new ArchimateSpecializationSelector(RenderEngineClass.ArchimateSpecializationRegistry, { doc })
|
|
227
|
+
.buildSelect({ value: subject.specialization ?? '', elementType: subject.type || null, onTypeChange: () => {} })
|
|
228
|
+
: null;
|
|
229
|
+
const propertyList = new PropertyListEditor(subject.properties ?? [], doc);
|
|
230
|
+
|
|
231
|
+
const fields = [];
|
|
232
|
+
let sectionShown = null;
|
|
233
|
+
for (const row of rows) {
|
|
234
|
+
if (row.section !== sectionShown) {
|
|
235
|
+
sectionShown = row.section;
|
|
236
|
+
if (SECTION_LABELS[row.section]) fields.push({ type: 'heading', label: SECTION_LABELS[row.section] });
|
|
237
|
+
}
|
|
238
|
+
fields.push(fieldForRow(row, specSelect));
|
|
239
|
+
}
|
|
240
|
+
// How a node's text is set: TextStyle's fields (the graph renderer draws no underline).
|
|
241
|
+
if (isNode) fields.push({ type: 'heading', label: 'Text' }, ...TextStyle.fields(TextStyle.fromNode(subject), { underline: false }));
|
|
242
|
+
// User-defined typed properties — a structured array rather than flat extra
|
|
243
|
+
// data, so it gets its own editable section.
|
|
244
|
+
fields.push({ type: 'heading', label: 'Properties' });
|
|
245
|
+
fields.push({ key: '__properties', label: '', type: 'custom', element: propertyList.element, read: () => propertyList.collect() });
|
|
246
|
+
|
|
247
|
+
// `id` (a GUID in a real app) is deliberately not shown — it has little
|
|
248
|
+
// value to a person; name/label are the human-facing identity.
|
|
249
|
+
const subjectName = kind === 'edge'
|
|
250
|
+
? `${subject.source} → ${subject.target}`
|
|
251
|
+
: (subject.name || subject.label || subject.id);
|
|
252
|
+
const dialog = new FormDialog({
|
|
253
|
+
title: options.title ?? `${isNode ? 'Node' : 'Edge'} properties — ${subjectName}`,
|
|
254
|
+
fields,
|
|
255
|
+
submitLabel: 'Save',
|
|
256
|
+
idPrefix: 'properties-',
|
|
257
|
+
document: doc,
|
|
258
|
+
onApply: (values) => {
|
|
259
|
+
const edited = rows.filter(r => !r.readOnly).map(r => ({
|
|
260
|
+
key: r.key, input: dialog.controls[r.key], previous: r.value,
|
|
261
|
+
wasArray: Array.isArray(r.value),
|
|
262
|
+
wasNumber: typeof r.value === 'number',
|
|
263
|
+
wasBoolean: typeof r.value === 'boolean' || r.type === 'checkbox',
|
|
264
|
+
}));
|
|
265
|
+
applyEdits(subject, engine, kind, edited, notation, version);
|
|
266
|
+
// The Text section, in the node's own names.
|
|
267
|
+
const text = isNode ? TextStyle.toNode(TextStyle.fromValues(values)) : {};
|
|
268
|
+
Object.assign(subject, text);
|
|
269
|
+
const textKeys = Object.keys(text);
|
|
270
|
+
if (values.__properties.length) subject.properties = values.__properties;
|
|
271
|
+
else delete subject.properties;
|
|
272
|
+
engine._rerenderGraph?.();
|
|
273
|
+
options.onSave?.(subject, [...edited.map(e => e.key), ...textKeys, 'properties']);
|
|
274
|
+
},
|
|
275
|
+
}).open();
|
|
276
|
+
|
|
277
|
+
const { layer, type, icon } = dialog.controls;
|
|
278
|
+
if (layer && type && notation) wireLayerTypeCascade(layer, type, icon, notation, version);
|
|
279
|
+
if (type && specSelect) {
|
|
280
|
+
type.addEventListener('change', () => specSelect._onTypeChanged?.(type.value.trim()));
|
|
281
|
+
}
|
|
282
|
+
return { overlay: dialog.overlay, close: () => dialog.close() };
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
/** The FormDialog field for one property row. */
|
|
286
|
+
function fieldForRow({ key, value, type, choices, readOnly }, specSelect) {
|
|
287
|
+
const base = { key, label: FIELD_LABELS[key] ?? key, value, readOnly };
|
|
288
|
+
// Text needs a colour: "No colour" is for fills and lines.
|
|
289
|
+
if (type === 'color') return { ...base, type, allowNone: key !== 'textColor' };
|
|
290
|
+
if (type === 'select-editable' && key === 'specialization' && specSelect) {
|
|
291
|
+
return { ...base, type: 'custom', element: specSelect, read: () => specSelect.value };
|
|
292
|
+
}
|
|
293
|
+
if (type === 'select-editable') return { ...base, type: 'text', suggestions: choices?.length ? choices : undefined };
|
|
294
|
+
if (type === 'select' && choices?.length) return { ...base, type: 'select', choices: choices.map(c => [c, c]), allowEmpty: true };
|
|
295
|
+
if (type === 'select') return { ...base, type: 'text' };
|
|
296
|
+
if (type === 'textarea') return { ...base, type: 'textarea', rows: key === 'description' ? 2 : 4 };
|
|
297
|
+
return { ...base, type };
|
|
298
|
+
}
|
|
299
|
+
|
|
300
|
+
/**
|
|
301
|
+
* The editable list of user-defined typed properties: name, type, value rows
|
|
302
|
+
* with add/remove. `collect()` reads them back, dropping unnamed rows.
|
|
303
|
+
*/
|
|
304
|
+
/**
|
|
305
|
+
* The category/type dependency, reflected both ways.
|
|
306
|
+
*
|
|
307
|
+
* Picking a layer narrows type's suggestions to that layer's official types AND
|
|
308
|
+
* clears type — every official type belongs to exactly one layer, so the old
|
|
309
|
+
* one essentially never still applies. Picking a recognised type snaps layer to
|
|
310
|
+
* match, and refreshes icon's options to that type's own.
|
|
311
|
+
*/
|
|
312
|
+
function wireLayerTypeCascade(layerInput, typeInput, iconInput, notation, version) {
|
|
313
|
+
layerInput.addEventListener('change', () => {
|
|
314
|
+
const list = typeInput.list;
|
|
315
|
+
if (!list) return;
|
|
316
|
+
list.replaceChildren(...notation.typesInLayer(layerInput.value, version).map(t => t.name).sort().map(name => new Option(name)));
|
|
317
|
+
typeInput.value = '';
|
|
318
|
+
delete typeInput.dataset.prevValue;
|
|
319
|
+
typeInput.focus();
|
|
320
|
+
});
|
|
321
|
+
typeInput.addEventListener('change', () => {
|
|
322
|
+
const known = notation.elementType(typeInput.value.trim(), version);
|
|
323
|
+
// A v4 Common Domain type has no fixed layer of its own, so there is
|
|
324
|
+
// nothing to snap to for one of those.
|
|
325
|
+
if (known?.layer) layerInput.value = known.layer.name;
|
|
326
|
+
if (!iconInput) return;
|
|
327
|
+
const current = iconInput.value;
|
|
328
|
+
const choices = notation.iconChoices(typeInput.value.trim(), version);
|
|
329
|
+
iconInput.replaceChildren(...choices.map(choice => new Option(choice, choice, false, choice === current)));
|
|
330
|
+
if (!choices.includes(current)) iconInput.value = choices[0];
|
|
331
|
+
});
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
function applyEdits(subject, engine, kind, fields, notation, version) {
|
|
335
|
+
// Captured BEFORE mutating, so "did layer/type change" and "was the colour
|
|
336
|
+
// still auto-derived from the OLD layer/type" both compare against the
|
|
337
|
+
// pre-edit state.
|
|
338
|
+
const originalLayer = subject.layer;
|
|
339
|
+
const originalType = subject.type;
|
|
340
|
+
const originalSpecialization = subject.specialization;
|
|
341
|
+
const isNode = kind === 'node';
|
|
342
|
+
const colorWasAuto = isNode && subject.color === engine._archimateLayerColor?.(originalLayer);
|
|
343
|
+
const iconWasAuto = isNode && !subject.iconUrl
|
|
344
|
+
&& subject.icon === engine._archimateDefaultIcon?.(subject, originalLayer, undefined, 0, version);
|
|
345
|
+
const colorInput = fields.find(f => f.key === 'color')?.input;
|
|
346
|
+
const iconInput = fields.find(f => f.key === 'icon')?.input;
|
|
347
|
+
// Case-insensitive: a native colour input normalises to lowercase hex,
|
|
348
|
+
// which would otherwise read as a hand-edit even when nothing changed.
|
|
349
|
+
const colorFieldUntouched = !colorInput
|
|
350
|
+
|| colorInput.value.toLowerCase() === String(subject.color ?? '').toLowerCase();
|
|
351
|
+
const iconFieldUntouched = !iconInput || iconInput.value === (subject.icon ?? '');
|
|
352
|
+
|
|
353
|
+
const originalKind = subject.kind;
|
|
354
|
+
for (const f of fields) {
|
|
355
|
+
const raw = f.input.type === 'checkbox' ? String(f.input.checked) : f.input.value;
|
|
356
|
+
subject[f.key] = coerceFieldValue(raw, f);
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
if (!isNode) {
|
|
360
|
+
if (notation && subject.kind !== originalKind) {
|
|
361
|
+
const relationshipStyles = engine._archimateOptions?.relationshipStyles;
|
|
362
|
+
const style = relationshipStyles?.[subject.kind] ?? notation.relationshipType(subject.kind);
|
|
363
|
+
subject.lineStyle = style.lineStyle;
|
|
364
|
+
subject.arrowhead = style.arrowhead || 'none';
|
|
365
|
+
subject.arrowheadStart = style.arrowheadStart;
|
|
366
|
+
}
|
|
367
|
+
return;
|
|
368
|
+
}
|
|
369
|
+
const plan = derivedRefreshPlan({
|
|
370
|
+
layerChanged: subject.layer !== originalLayer,
|
|
371
|
+
typeChanged: subject.type !== originalType,
|
|
372
|
+
colorWasAuto, iconWasAuto, colorFieldUntouched, iconFieldUntouched,
|
|
373
|
+
});
|
|
374
|
+
if (!plan.changed) return;
|
|
375
|
+
|
|
376
|
+
const freshColor = engine._archimateLayerColor?.(subject.layer);
|
|
377
|
+
const freshIcon = subject.iconUrl ? undefined
|
|
378
|
+
: engine._archimateDefaultIcon?.(subject, subject.layer, undefined, 0, version);
|
|
379
|
+
if (plan.color) subject.color = freshColor;
|
|
380
|
+
if (plan.icon) subject.icon = freshIcon;
|
|
381
|
+
if (!plan.color || !plan.icon) {
|
|
382
|
+
const what = [!plan.color && 'colour', !plan.icon && 'icon'].filter(Boolean).join(' and ');
|
|
383
|
+
// eslint-disable-next-line no-alert
|
|
384
|
+
if (globalThis.confirm?.(`Layer/type changed to "${subject.type || subject.layer}". `
|
|
385
|
+
+ `Update this element's customised ${what} to match?`)) {
|
|
386
|
+
if (!plan.color) subject.color = freshColor;
|
|
387
|
+
if (!plan.icon) subject.icon = freshIcon;
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
if (engine._archimateCornerStyle) {
|
|
391
|
+
subject.cornerStyle = engine._archimateCornerStyle(subject, subject.layer, version);
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
// Specialization changed -> apply the specialization's own icon/colour,
|
|
395
|
+
// but ask before overwriting a customised value.
|
|
396
|
+
if (isNode && subject.specialization !== originalSpecialization && engine.constructor.ArchimateSpecializationRegistry) {
|
|
397
|
+
const spec = engine.constructor.ArchimateSpecializationRegistry.resolve(subject.specialization);
|
|
398
|
+
if (spec) {
|
|
399
|
+
const defaultColor = engine._archimateLayerColor?.(subject.layer);
|
|
400
|
+
const defaultIcon = !subject.iconUrl
|
|
401
|
+
? engine._archimateDefaultIcon?.(subject, subject.layer, undefined, 0, version)
|
|
402
|
+
: undefined;
|
|
403
|
+
const colorIsDefault = !subject.color
|
|
404
|
+
|| String(subject.color).toLowerCase() === String(defaultColor ?? '').toLowerCase();
|
|
405
|
+
const iconIsDefault = !subject.icon && !subject.iconUrl;
|
|
406
|
+
|
|
407
|
+
if (spec.color && subject.color !== spec.color) {
|
|
408
|
+
if (colorIsDefault || globalThis.confirm?.(`Reset colour to specialization "${spec.name}" (${spec.color})?`)) {
|
|
409
|
+
subject.color = spec.color;
|
|
410
|
+
}
|
|
411
|
+
}
|
|
412
|
+
if (spec.iconUrl && subject.iconUrl !== spec.iconUrl) {
|
|
413
|
+
if (iconIsDefault || globalThis.confirm?.(`Reset icon image to specialization "${spec.name}"?`)) {
|
|
414
|
+
subject.iconUrl = spec.iconUrl;
|
|
415
|
+
delete subject.icon;
|
|
416
|
+
}
|
|
417
|
+
} else if (spec.icon && subject.icon !== spec.icon && !subject.iconUrl) {
|
|
418
|
+
if (iconIsDefault || globalThis.confirm?.(`Reset icon to specialization "${spec.name}" (${spec.icon})?`)) {
|
|
419
|
+
subject.icon = spec.icon;
|
|
420
|
+
delete subject.iconUrl;
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
/**
|
|
428
|
+
* Settings for the diagram/view itself rather than any one object on it —
|
|
429
|
+
* what double-clicking empty canvas opens.
|
|
430
|
+
*/
|
|
431
|
+
export function showDiagramPropertiesDialog(engine, options = {}) {
|
|
432
|
+
try {
|
|
433
|
+
const chartOptions = engine._chartState?.options;
|
|
434
|
+
if (!chartOptions) return null;
|
|
435
|
+
// Only for an ArchiMate diagram: which of each type's own icon choices
|
|
436
|
+
// is the default. Applied live, and only to nodes that never had their
|
|
437
|
+
// icon customised.
|
|
438
|
+
const archimate = engine._archimateOptions;
|
|
439
|
+
const dialog = new FormDialog({
|
|
440
|
+
title: options.title ?? 'Diagram properties',
|
|
441
|
+
fields: [
|
|
442
|
+
{
|
|
443
|
+
key: 'edgeRouting', label: 'edgeRouting', type: 'select', value: chartOptions.edgeRouting ?? 'straight',
|
|
444
|
+
choices: ['straight', 'curved', 'orthogonal', 'polyline'].map(c => [c, c]),
|
|
445
|
+
},
|
|
446
|
+
...(archimate ? [{ key: 'iconChoiceIndex', label: 'iconChoiceIndex', type: 'number', value: archimate.iconChoiceIndex ?? 0, min: 0 }] : []),
|
|
447
|
+
],
|
|
448
|
+
submitLabel: 'Save',
|
|
449
|
+
idPrefix: 'diagram-properties-',
|
|
450
|
+
document: options.document ?? document,
|
|
451
|
+
onApply: ({ edgeRouting, iconChoiceIndex }) => {
|
|
452
|
+
chartOptions.edgeRouting = edgeRouting;
|
|
453
|
+
engine._rerenderGraph?.();
|
|
454
|
+
if (archimate && Number.isFinite(iconChoiceIndex)) ArchimateDiagram.setIconChoiceIndex(engine, iconChoiceIndex);
|
|
455
|
+
options.onSave?.(chartOptions);
|
|
456
|
+
},
|
|
457
|
+
}).open();
|
|
458
|
+
return { overlay: dialog.overlay, close: () => dialog.close() };
|
|
459
|
+
} catch (err) {
|
|
460
|
+
console.error('showDiagramPropertiesDialog failed:', err);
|
|
461
|
+
return null;
|
|
462
|
+
}
|
|
463
|
+
}
|