@peter.prib/renderengine 0.0.0-stage → 0.1.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 +2159 -0
- package/dist/renderengine-workspace.umd.js +45944 -0
- package/dist/renderengine.umd.js +41262 -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 +544 -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 +52 -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/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 +21 -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 +91 -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 +37 -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 +47 -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/LagPlotChart.js +41 -0
- package/src/charting/charts/LineChart.js +124 -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/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/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/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 +2564 -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,43 @@
|
|
|
1
|
+
import { CommandHistory } from '../CommandHistory.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* ModelHistory — one undo history for a whole model (Archi's command stack
|
|
5
|
+
* per model): every view's edits, and the model's own (views added,
|
|
6
|
+
* renamed, deleted; elements edited from the tree), in the order they were
|
|
7
|
+
* made. Each edit remembers the view in front when it was made (`viewId`),
|
|
8
|
+
* and undoing or redoing it shows that view again, so the change is seen.
|
|
9
|
+
* A command that names no view of its own (a view added or removed) sets
|
|
10
|
+
* `viewId = null`.
|
|
11
|
+
*/
|
|
12
|
+
export class ModelHistory extends CommandHistory {
|
|
13
|
+
/**
|
|
14
|
+
* @param {ViewSetModel} model
|
|
15
|
+
* @param {Object} [options] - CommandHistory options
|
|
16
|
+
*/
|
|
17
|
+
constructor(model, options = {}) {
|
|
18
|
+
super(options);
|
|
19
|
+
this.model = model;
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
execute(cmd) {
|
|
23
|
+
if (cmd && typeof cmd === 'object' && !('viewId' in cmd)) cmd.viewId = this.model.currentViewId;
|
|
24
|
+
const done = super.execute(cmd);
|
|
25
|
+
if (done !== cmd && done && !('viewId' in done)) done.viewId = cmd.viewId; // merged into the last one
|
|
26
|
+
return done;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
undo() {
|
|
30
|
+
return this._show(super.undo());
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
redo() {
|
|
34
|
+
return this._show(super.redo());
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/** Show the view an undone or redone edit was made on (after the change, so it is drawn changed). @private */
|
|
38
|
+
_show(cmd) {
|
|
39
|
+
const id = cmd?.viewId;
|
|
40
|
+
if (id && id !== this.model.currentViewId && this.model.getView(id)) this.model.switchTo(id);
|
|
41
|
+
return cmd;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
@@ -0,0 +1,153 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ModelReport — what a browsable report of a model holds, as plain JSON
|
|
3
|
+
* (reportHtml writes it out as a page): a page per item (the model, each
|
|
4
|
+
* view, and whatever a notation's model adds: elements, relationships, ...)
|
|
5
|
+
* and the tree the pages are found by.
|
|
6
|
+
*
|
|
7
|
+
* Here, what every view set has: the model's page, and a page per view with
|
|
8
|
+
* its documentation, properties and picture. A notation's model returns a
|
|
9
|
+
* subclass from `model.report()` that adds its own items (`conceptItems()`),
|
|
10
|
+
* tree sections (`conceptSections()`) and what a view's page lists
|
|
11
|
+
* (`viewLists(view)`).
|
|
12
|
+
*
|
|
13
|
+
* An item: `{ key, name, kind, type, color?, documentation?, properties:
|
|
14
|
+
* [{name, value}], facts: [{label, text} | {label, key}], lists: [{title,
|
|
15
|
+
* rows: [{key, note?}]}], picture? }`; a fact or row with a `key` links to
|
|
16
|
+
* that item's page. A picture (from the editor, see DiagramEditor#viewPicture)
|
|
17
|
+
* is `{ svg, viewBox: {x, y, width, height}, areas: [{ref, x, y, width,
|
|
18
|
+
* height}] }`; an area's `ref` (`{kind, id}`) is the item it opens.
|
|
19
|
+
*/
|
|
20
|
+
export class ModelReport {
|
|
21
|
+
/**
|
|
22
|
+
* @param {ViewSetModel} model
|
|
23
|
+
* @param {Object} [options]
|
|
24
|
+
* @param {Object<string, Object>} [options.pictures] - Each view's picture, by view id
|
|
25
|
+
* @param {string} [options.title] - Default: the model's name
|
|
26
|
+
*/
|
|
27
|
+
constructor(model, { pictures = {}, title = null } = {}) {
|
|
28
|
+
this.model = model;
|
|
29
|
+
this.pictures = pictures;
|
|
30
|
+
this._title = title;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/** The report's title: the model's name, or what was asked for. */
|
|
34
|
+
get title() {
|
|
35
|
+
return this._title || this.model.name || this.model.title || 'Model';
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/** An item's key: unique across kinds, since a view and an element may share an id. */
|
|
39
|
+
key(kind, id) {
|
|
40
|
+
return `${kind}:${id}`;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/** The report: `{ title, home, sections, items }` (see the class). */
|
|
44
|
+
data() {
|
|
45
|
+
const items = [this.modelItem(), ...this.viewItems(), ...this.conceptItems()];
|
|
46
|
+
return {
|
|
47
|
+
title: this.title,
|
|
48
|
+
home: items[0].key,
|
|
49
|
+
sections: [...this.conceptSections(), this.viewSection()]
|
|
50
|
+
.map(s => ({ ...s, groups: s.groups.filter(g => g.keys.length) }))
|
|
51
|
+
.filter(s => s.groups.length),
|
|
52
|
+
items: Object.fromEntries(items.map(item => [item.key, item])),
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/** The model's own page: its documentation, properties and how much it holds. */
|
|
57
|
+
modelItem() {
|
|
58
|
+
const model = this.model;
|
|
59
|
+
return this.item('model', model.id ?? 'model', {
|
|
60
|
+
name: this.title, type: 'Model',
|
|
61
|
+
documentation: model.documentation,
|
|
62
|
+
properties: model.properties,
|
|
63
|
+
facts: this.modelFacts(),
|
|
64
|
+
});
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/** The model page's counts: its views (a subclass adds its own). */
|
|
68
|
+
modelFacts() {
|
|
69
|
+
return [{ label: 'Views', text: String(this.model.views().length) }];
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/** A page per view. */
|
|
73
|
+
viewItems() {
|
|
74
|
+
return this.model.views().map(view => this.item('view', view.id, {
|
|
75
|
+
name: view.title || view.name || view.id,
|
|
76
|
+
type: this.viewType(view),
|
|
77
|
+
documentation: view.documentation,
|
|
78
|
+
properties: view.properties,
|
|
79
|
+
facts: this.viewFacts(view),
|
|
80
|
+
lists: this.viewLists(view),
|
|
81
|
+
picture: this.picture(view),
|
|
82
|
+
}));
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/** What kind of view a view is, as its page says. */
|
|
86
|
+
viewType(view) {
|
|
87
|
+
return 'View';
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/** A view's picture, with its areas' refs turned into item keys (an area with nothing to open is dropped). */
|
|
91
|
+
picture(view) {
|
|
92
|
+
const picture = this.pictures[view.id];
|
|
93
|
+
if (!picture) return undefined;
|
|
94
|
+
const areas = (picture.areas ?? [])
|
|
95
|
+
.map(({ ref, ...box }) => ({ ...box, key: ref && this.key(ref.kind, ref.id) }))
|
|
96
|
+
.filter(area => area.key);
|
|
97
|
+
return { svg: picture.svg, viewBox: picture.viewBox, areas };
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
/** A view's facts (its viewpoint, ...): none here. */
|
|
101
|
+
viewFacts(view) {
|
|
102
|
+
return [];
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
/** What a view's page lists (its elements, ...): none here. */
|
|
106
|
+
viewLists(view) {
|
|
107
|
+
return [];
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
/** The tree's Views section. */
|
|
111
|
+
viewSection() {
|
|
112
|
+
return { title: 'Views', groups: [{ title: null, keys: this.model.views().map(v => this.key('view', v.id)) }] };
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/** A notation's own items (elements, relationships): none here. */
|
|
116
|
+
conceptItems() {
|
|
117
|
+
return [];
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/** A notation's own tree sections, before Views: none here. */
|
|
121
|
+
conceptSections() {
|
|
122
|
+
return [];
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* An item from its kind, id and fields: empty lists dropped, properties as
|
|
127
|
+
* `[{name, value}]` whichever way the model keeps them.
|
|
128
|
+
* @protected
|
|
129
|
+
*/
|
|
130
|
+
item(kind, id, { name, type, color, documentation, properties, facts = [], lists = [], picture } = {}) {
|
|
131
|
+
const props = ModelReport.properties(properties);
|
|
132
|
+
return {
|
|
133
|
+
key: this.key(kind, id),
|
|
134
|
+
name: name || id, kind, type,
|
|
135
|
+
...(color && { color }),
|
|
136
|
+
...(documentation && { documentation: String(documentation) }),
|
|
137
|
+
...(props.length && { properties: props }),
|
|
138
|
+
...(facts.length && { facts }),
|
|
139
|
+
...(lists.some(l => l.rows.length) && { lists: lists.filter(l => l.rows.length) }),
|
|
140
|
+
...(picture && { picture }),
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/** Properties as `[{name, value}]`, from `[{name|key, value}]`, `[[name, value]]` or `{name: value}`. */
|
|
145
|
+
static properties(properties) {
|
|
146
|
+
if (!properties) return [];
|
|
147
|
+
const list = Array.isArray(properties) ? properties : Object.entries(properties);
|
|
148
|
+
return list.map(p => (Array.isArray(p)
|
|
149
|
+
? { name: String(p[0]), value: String(p[1] ?? '') }
|
|
150
|
+
: { name: String(p.name ?? p.key ?? ''), value: String(p.value ?? '') }))
|
|
151
|
+
.filter(p => p.name);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
@@ -0,0 +1,223 @@
|
|
|
1
|
+
import { ReplaceTextCommand } from './ReplaceTextCommand.js';
|
|
2
|
+
import { Command } from '../CommandHistory.js';
|
|
3
|
+
import { transformName, NAME_TRANSFORMS } from './nameTransforms.js';
|
|
4
|
+
|
|
5
|
+
/** What can be looked in, in the order a dialog offers them: [field, label]. */
|
|
6
|
+
export const SEARCH_FIELDS = Object.freeze([['name', 'Names'], ['documentation', 'Documentation'], ['property', 'Property values']]);
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* ModelSearch — find and replace over a model's texts (Archi's Find/Replace):
|
|
10
|
+
* every name, documentation and property value, each a target
|
|
11
|
+
* `{ kind, id, viewId?, owner, field, fieldLabel, required?, read(), write(text) }`
|
|
12
|
+
* (`owner` names what it belongs to; `required` text can't be emptied).
|
|
13
|
+
*
|
|
14
|
+
* Here, what every view set has: the model's own name, documentation and
|
|
15
|
+
* properties, and each view's title, documentation and properties. A
|
|
16
|
+
* notation's model returns a subclass from `model.search()` that adds what its
|
|
17
|
+
* views hold (`viewItemTargets(view)`: shapes, notes) and its own concepts
|
|
18
|
+
* (`conceptTargets()`: elements, relationships). DOM-free.
|
|
19
|
+
*
|
|
20
|
+
* Options, for find and replace alike: `{ matchCase, wholeWord, regex, fields }`,
|
|
21
|
+
* `fields` among SEARCH_FIELDS' keys (default all).
|
|
22
|
+
*/
|
|
23
|
+
export class ModelSearch {
|
|
24
|
+
/** @param {ViewSetModel} model */
|
|
25
|
+
constructor(model) {
|
|
26
|
+
this.model = model;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/** Every text in the model, in order: the model's, then each view's and what it holds, then the concepts'. */
|
|
30
|
+
targets() {
|
|
31
|
+
return [
|
|
32
|
+
...this.modelTargets(),
|
|
33
|
+
...this.model.views().flatMap(view => [...this.viewTargets(view), ...this.viewItemTargets(view)]),
|
|
34
|
+
...this.conceptTargets(),
|
|
35
|
+
];
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/** The model's own name (when it has one), documentation and properties. */
|
|
39
|
+
modelTargets() {
|
|
40
|
+
const model = this.model;
|
|
41
|
+
const owner = { kind: 'model', id: model.id ?? 'model', owner: model.name || 'Model' };
|
|
42
|
+
return [
|
|
43
|
+
...(typeof model.name === 'string' ? [this.text(owner, 'name', model, 'name')] : []),
|
|
44
|
+
this.text(owner, 'documentation', model, 'documentation'),
|
|
45
|
+
...this.propertyTargets(owner, model.properties),
|
|
46
|
+
];
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/** A view's title (retitled through the model, so tabs follow; never emptied), documentation and properties. */
|
|
50
|
+
viewTargets(view) {
|
|
51
|
+
const owner = { kind: 'view', id: view.id, viewId: view.id, owner: view.title || view.name || view.id };
|
|
52
|
+
return [
|
|
53
|
+
{
|
|
54
|
+
...owner, field: 'name', fieldLabel: 'Name', required: true,
|
|
55
|
+
read: () => view.title ?? '',
|
|
56
|
+
write: (text) => { this.model._retitle(view.id, text); },
|
|
57
|
+
},
|
|
58
|
+
this.text(owner, 'documentation', view, 'documentation'),
|
|
59
|
+
...this.propertyTargets(owner, view.properties),
|
|
60
|
+
];
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
/** What a view holds that has its own text: none here. */
|
|
64
|
+
viewItemTargets(view) {
|
|
65
|
+
return [];
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/** A notation's own concepts' texts: none here. */
|
|
69
|
+
conceptTargets() {
|
|
70
|
+
return [];
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* The texts that match, each `{ ...target, target, text, count }` (`text`
|
|
75
|
+
* as it is now, `count` how many times it matches).
|
|
76
|
+
* @throws {SyntaxError} for an invalid regular expression
|
|
77
|
+
*/
|
|
78
|
+
find(text, options = {}) {
|
|
79
|
+
const pattern = ModelSearch.pattern(text, options);
|
|
80
|
+
if (!pattern) return [];
|
|
81
|
+
const fields = new Set(options.fields ?? SEARCH_FIELDS.map(([f]) => f));
|
|
82
|
+
return this.targets()
|
|
83
|
+
.filter(t => fields.has(t.field))
|
|
84
|
+
.map(target => {
|
|
85
|
+
const current = String(target.read() ?? '');
|
|
86
|
+
const count = current.match(pattern)?.length ?? 0;
|
|
87
|
+
const { read, write, ...about } = target;
|
|
88
|
+
return { ...about, target, text: current, count };
|
|
89
|
+
})
|
|
90
|
+
.filter(m => m.count);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Replace every match (or those of `matches`, from find) as one
|
|
95
|
+
* ReplaceTextCommand, not yet executed; null when nothing would change.
|
|
96
|
+
* With `regex`, `$1` and the like in `replacement` refer to its groups.
|
|
97
|
+
*/
|
|
98
|
+
replaceCommand(text, replacement, options = {}, matches = this.find(text, options)) {
|
|
99
|
+
const pattern = ModelSearch.pattern(text, options);
|
|
100
|
+
if (!pattern) return null;
|
|
101
|
+
const changes = matches
|
|
102
|
+
.map(({ target }) => {
|
|
103
|
+
const before = String(target.read() ?? '');
|
|
104
|
+
const after = options.regex ? before.replace(pattern, replacement) : before.replace(pattern, () => replacement);
|
|
105
|
+
return { target, before, after };
|
|
106
|
+
})
|
|
107
|
+
.filter(c => c.after !== c.before && !(c.target.required && !c.after.trim()));
|
|
108
|
+
return changes.length ? new ReplaceTextCommand(changes, `Replace "${text}" (${changes.length})`) : null;
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Rewrite names (nameTransforms.js: Title Case, split camelCase, ...): every
|
|
113
|
+
* name, or those containing `text` (with find's options), as one
|
|
114
|
+
* ReplaceTextCommand, not yet executed; null when nothing changes. A view
|
|
115
|
+
* is never left without a name.
|
|
116
|
+
* @param {string} transform - One of NAME_TRANSFORMS' keys
|
|
117
|
+
*/
|
|
118
|
+
transformCommand(transform, text = '', options = {}) {
|
|
119
|
+
const targets = text
|
|
120
|
+
? this.find(text, { ...options, fields: ['name'] }).map(m => m.target)
|
|
121
|
+
: this.targets().filter(t => t.field === 'name');
|
|
122
|
+
const changes = targets
|
|
123
|
+
.map(target => { const before = String(target.read() ?? ''); return { target, before, after: transformName(transform, before) }; })
|
|
124
|
+
.filter(c => c.after !== c.before && !(c.target.required && !c.after.trim()));
|
|
125
|
+
const label = NAME_TRANSFORMS.find(([k]) => k === transform)?.[1].split(' (')[0] ?? transform;
|
|
126
|
+
return changes.length ? new ReplaceTextCommand(changes, `${label} (${changes.length})`) : null;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* What holds properties (`[{name|key, value}]` lists): the model and its
|
|
131
|
+
* views here; a notation's search adds its concepts.
|
|
132
|
+
* @returns {Array<{owner: string, properties: Array}>}
|
|
133
|
+
*/
|
|
134
|
+
propertyHolders() {
|
|
135
|
+
return [{ owner: 'model', object: this.model }, ...this.model.views().map(v => ({ owner: `view ${v.id}`, object: v }))];
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/** Every property name in use, sorted. */
|
|
139
|
+
propertyNames() {
|
|
140
|
+
const names = new Set();
|
|
141
|
+
for (const { object } of this.propertyHolders()) for (const p of Array.isArray(object.properties) ? object.properties : []) if (p.name ?? p.key) names.add(p.name ?? p.key);
|
|
142
|
+
return [...names].sort((a, b) => a.localeCompare(b));
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
/**
|
|
146
|
+
* Rename a property everywhere it is (Rename property…): one command, not
|
|
147
|
+
* yet executed; null when nothing has it. Where something has both names,
|
|
148
|
+
* the old one's value goes to the new one only where the new one is empty.
|
|
149
|
+
*/
|
|
150
|
+
renamePropertyCommand(from, to) {
|
|
151
|
+
const holders = this.propertyHolders().filter(({ object }) => Array.isArray(object.properties) && object.properties.some(p => (p.name ?? p.key) === from));
|
|
152
|
+
if (!from || !to || from === to || !holders.length) return null;
|
|
153
|
+
return new PropertyRenameCommand(holders.map(h => h.object), from, to);
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/**
|
|
157
|
+
* An object's own text field as a target; an emptied text is unset.
|
|
158
|
+
* @protected
|
|
159
|
+
*/
|
|
160
|
+
text(owner, field, object, key = field) {
|
|
161
|
+
return {
|
|
162
|
+
...owner, field, fieldLabel: field === 'name' ? 'Name' : 'Documentation',
|
|
163
|
+
read: () => object[key] ?? '',
|
|
164
|
+
write: (text) => { object[key] = text === '' && field !== 'name' ? undefined : text; },
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
/**
|
|
169
|
+
* Each property whose value is text, as a target (`[{name|key, value, type?}]`;
|
|
170
|
+
* a number or true/false is left out).
|
|
171
|
+
* @protected
|
|
172
|
+
*/
|
|
173
|
+
propertyTargets(owner, properties) {
|
|
174
|
+
if (!Array.isArray(properties)) return [];
|
|
175
|
+
return properties
|
|
176
|
+
.filter(p => p.value == null || typeof p.value === 'string')
|
|
177
|
+
.map(p => ({
|
|
178
|
+
...owner, field: 'property', fieldLabel: `Property "${p.name ?? p.key}"`,
|
|
179
|
+
read: () => p.value ?? '',
|
|
180
|
+
write: (text) => { p.value = text; },
|
|
181
|
+
}));
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/**
|
|
185
|
+
* The pattern for `text` (global): literal unless `regex`, whole words with
|
|
186
|
+
* `wholeWord`, any case unless `matchCase`. Null for empty text.
|
|
187
|
+
* @throws {SyntaxError} for an invalid regular expression
|
|
188
|
+
*/
|
|
189
|
+
static pattern(text, { matchCase = false, wholeWord = false, regex = false } = {}) {
|
|
190
|
+
if (!text) return null;
|
|
191
|
+
const source = regex ? text : text.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
192
|
+
return new RegExp(wholeWord ? `\\b(?:${source})\\b` : source, matchCase ? 'g' : 'gi');
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
/** Rename a property on some objects (their property lists), one undo step: as ModelSearch#renamePropertyCommand says. */
|
|
197
|
+
class PropertyRenameCommand extends Command {
|
|
198
|
+
constructor(objects, from, to) {
|
|
199
|
+
super(`Rename property "${from}" to "${to}"`);
|
|
200
|
+
Object.assign(this, { objects, from, to, _before: null });
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
execute() {
|
|
204
|
+
const nameOf = (p) => p.name ?? p.key;
|
|
205
|
+
this._before = this.objects.map(o => [o, o.properties]);
|
|
206
|
+
for (const object of this.objects) {
|
|
207
|
+
const list = object.properties.map(p => ({ ...p }));
|
|
208
|
+
const old = list.find(p => nameOf(p) === this.from);
|
|
209
|
+
const existing = list.find(p => nameOf(p) === this.to);
|
|
210
|
+
if (existing) {
|
|
211
|
+
if ((existing.value ?? '') === '') existing.value = old.value;
|
|
212
|
+
object.properties = list.filter(p => p !== old);
|
|
213
|
+
} else {
|
|
214
|
+
if ('name' in old) old.name = this.to; else old.key = this.to;
|
|
215
|
+
object.properties = list;
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
undo() {
|
|
221
|
+
for (const [object, properties] of this._before) object.properties = properties;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { Command } from '../CommandHistory.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* RemoveViewCommand — a view deleted from a model; its neighbour comes to
|
|
5
|
+
* the front when it was. Undo puts the same view back where it was, shown
|
|
6
|
+
* again if it was in front.
|
|
7
|
+
*/
|
|
8
|
+
export class RemoveViewCommand extends Command {
|
|
9
|
+
viewId = null;
|
|
10
|
+
|
|
11
|
+
constructor(model, view, label = `Delete "${view.title || view.name || view.id}"`) {
|
|
12
|
+
super(label);
|
|
13
|
+
this.model = model;
|
|
14
|
+
this.view = view;
|
|
15
|
+
this._was = null;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
execute() {
|
|
19
|
+
this._was = this.model._removeView(this.view.id);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
undo() {
|
|
23
|
+
this.model._insertView(this.view, this._was);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { Command } from '../CommandHistory.js';
|
|
2
|
+
|
|
3
|
+
/** RenameViewCommand — a view's title changed; undo gives it back its old one. */
|
|
4
|
+
export class RenameViewCommand extends Command {
|
|
5
|
+
constructor(model, view, title, label = `Rename "${view.title}"`) {
|
|
6
|
+
super(label);
|
|
7
|
+
this.model = model;
|
|
8
|
+
this.view = view;
|
|
9
|
+
this.title = title;
|
|
10
|
+
this.before = view.title;
|
|
11
|
+
this.viewId = view.id;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
execute() {
|
|
15
|
+
this.model._retitle(this.view.id, this.title);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
undo() {
|
|
19
|
+
this.model._retitle(this.view.id, this.before);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { Command } from '../CommandHistory.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* ReplaceTextCommand — texts replaced across a model (ModelSearch#replaceCommand)
|
|
5
|
+
* as one undo step: each change is `{ target, before, after }`, a target being
|
|
6
|
+
* one of ModelSearch's texts (its `write(text)` puts it in place).
|
|
7
|
+
*/
|
|
8
|
+
export class ReplaceTextCommand extends Command {
|
|
9
|
+
/**
|
|
10
|
+
* @param {Array<{target: Object, before: string, after: string}>} changes
|
|
11
|
+
* @param {string} [label]
|
|
12
|
+
*/
|
|
13
|
+
constructor(changes, label = 'Replace') {
|
|
14
|
+
super(label);
|
|
15
|
+
this.changes = changes.slice();
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
execute() {
|
|
19
|
+
for (const { target, after } of this.changes) target.write(after);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
undo() {
|
|
23
|
+
for (let i = this.changes.length - 1; i >= 0; i--) this.changes[i].target.write(this.changes[i].before);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ViewSetChecker — checks over any ViewSetModel (a template editor's
|
|
3
|
+
* DiagramModel, an ArchimateModel): what is wrong or worth a look across its
|
|
4
|
+
* views. A notation adds its own checks in a subclass (ArchimateModelChecker).
|
|
5
|
+
* DOM-free and advisory.
|
|
6
|
+
*
|
|
7
|
+
* Each finding: `{ code, severity: 'warning'|'info', message, kind, ids }`;
|
|
8
|
+
* `kind` says what the ids name ('view' here; a subclass adds its own).
|
|
9
|
+
* Each check is a method listed by `checks()`, so a subclass can add, drop or
|
|
10
|
+
* reorder them.
|
|
11
|
+
*/
|
|
12
|
+
export class ViewSetChecker {
|
|
13
|
+
/** @param {ViewSetModel} model */
|
|
14
|
+
constructor(model) {
|
|
15
|
+
this.model = model;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/** The checks to run, in the order their findings are listed. */
|
|
19
|
+
checks() {
|
|
20
|
+
return [this.emptyViews];
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
/** Every finding. @returns {Array<Object>} */
|
|
24
|
+
run() {
|
|
25
|
+
return this.checks().flatMap(check => check.call(this));
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/** Views with nothing on them (a template is left out: an empty one is still a start). */
|
|
29
|
+
emptyViews() {
|
|
30
|
+
return this.model.views()
|
|
31
|
+
.filter(v => !v.template && v.isEmpty())
|
|
32
|
+
.map(v => ({ code: 'empty-view', severity: 'info', kind: 'view', ids: [v.id], message: `View "${v.title || v.name || v.id}" is empty` }));
|
|
33
|
+
}
|
|
34
|
+
}
|