diff --git a/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVEdgeCreationTests.java b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVEdgeCreationTests.java index 8086700b50..074e26f0ba 100644 --- a/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVEdgeCreationTests.java +++ b/backend/application/syson-application/src/test/java/org/eclipse/syson/application/controllers/diagrams/general/view/GVEdgeCreationTests.java @@ -40,6 +40,7 @@ import org.eclipse.sirius.components.diagrams.Label; import org.eclipse.sirius.components.diagrams.tests.graphql.ConnectorPaletteQueryRunner; import org.eclipse.sirius.components.diagrams.tests.graphql.InvokeSingleClickOnTwoDiagramElementsToolMutationRunner; +import org.eclipse.sirius.components.diagrams.tests.graphql.PaletteQueryRunner; import org.eclipse.sirius.components.diagrams.tests.navigation.DiagramNavigator; import org.eclipse.sirius.components.view.diagram.NodeDescription; import org.eclipse.sirius.components.view.emf.diagram.IDiagramIdProvider; @@ -123,6 +124,9 @@ public class GVEdgeCreationTests extends AbstractIntegrationTests { @Autowired private ConnectorPaletteQueryRunner connectorPaletteQueryRunner; + @Autowired + private PaletteQueryRunner paletteQueryRunner; + private final IDescriptionNameGenerator descriptionNameGenerator = new SDVDescriptionNameGenerator(); private static Stream addAttributeUsageAsNestedOfEdgeSourceParameters() { @@ -173,6 +177,37 @@ public void concernUsageHasCorrectlyLabelledNestedCompositionEdgeTool() { .contains("Become nested Concern"); } + /** + * Checks that edge tools remain available before a connector target has been selected. + */ + @DisplayName("GIVEN a Usage node, WHEN retrieving its palette, THEN target-specific edge tools are available") + @GivenSysONServer({ GeneralViewWithTopNodesTestProjectData.SCRIPT_PATH }) + @Test + public void nodePaletteProvidesTargetSpecificEdgeTools() { + var flux = this.givenSubscriptionToDiagram(GeneralViewWithTopNodesTestProjectData.EDITING_CONTEXT_ID, GeneralViewWithTopNodesTestProjectData.GraphicalIds.DIAGRAM_ID); + + StepVerifier.create(flux) + .consumeNextWith(assertRefreshedDiagramThat(diagram -> { + Map variables = Map.of( + "editingContextId", GeneralViewWithTopNodesTestProjectData.EDITING_CONTEXT_ID, + "representationId", diagram.getId(), + "diagramElementIds", List.of(GeneralViewWithTopNodesTestProjectData.GraphicalIds.PART_USAGE_ID)); + var result = this.paletteQueryRunner.run(variables); + List paletteEntries = JsonPath.read(result.data(), "$.data.viewer.editingContext.representation.description.palette.paletteEntries[*].label"); + assertThat(paletteEntries).contains("Add target as nested Part", "Add target as nested Accept Action"); + + variables = Map.of( + "editingContextId", GeneralViewWithTopNodesTestProjectData.EDITING_CONTEXT_ID, + "representationId", diagram.getId(), + "diagramElementIds", List.of(GeneralViewWithTopNodesTestProjectData.GraphicalIds.PART_DEFINITION_ID)); + result = this.paletteQueryRunner.run(variables); + paletteEntries = JsonPath.read(result.data(), "$.data.viewer.editingContext.representation.description.palette.paletteEntries[*].label"); + assertThat(paletteEntries).contains("Add target as owned Part", NEW_SUBCLASSIFICATION_TOOL_LABEL); + })) + .thenCancel() + .verify(Duration.ofSeconds(10)); + } + @DisplayName("GIVEN a Usage source and a Usage target, WHEN retrieving the connector palette, THEN the nested tools name their target and source respectively") @GivenSysONServer({ GeneralViewWithTopNodesTestProjectData.SCRIPT_PATH }) @Test diff --git a/backend/services/syson-services/.settings/org.eclipse.core.resources.prefs b/backend/services/syson-services/.settings/org.eclipse.core.resources.prefs index 29abf99956..839d647eef 100644 --- a/backend/services/syson-services/.settings/org.eclipse.core.resources.prefs +++ b/backend/services/syson-services/.settings/org.eclipse.core.resources.prefs @@ -2,5 +2,4 @@ eclipse.preferences.version=1 encoding//src/main/java=UTF-8 encoding//src/main/resources=UTF-8 encoding//src/test/java=UTF-8 -encoding//src/test/resources=UTF-8 encoding/=UTF-8 diff --git a/backend/views/syson-diagram-common-view/src/main/java/org/eclipse/syson/diagram/common/view/services/SysONDiagramElementPaletteVariableManagerProvider.java b/backend/views/syson-diagram-common-view/src/main/java/org/eclipse/syson/diagram/common/view/services/SysONDiagramElementPaletteVariableManagerProvider.java new file mode 100644 index 0000000000..98fecec4ee --- /dev/null +++ b/backend/views/syson-diagram-common-view/src/main/java/org/eclipse/syson/diagram/common/view/services/SysONDiagramElementPaletteVariableManagerProvider.java @@ -0,0 +1,65 @@ +/******************************************************************************* + * Copyright (c) 2026 Obeo. + * This program and the accompanying materials + * are made available under the terms of the Eclipse Public License v2.0 + * which accompanies this distribution, and is available at + * https://www.eclipse.org/legal/epl-2.0/ + * + * SPDX-License-Identifier: EPL-2.0 + * + * Contributors: + * Obeo - initial API and implementation + *******************************************************************************/ +package org.eclipse.syson.diagram.common.view.services; + +import java.util.Optional; + +import org.eclipse.sirius.components.collaborative.diagrams.DiagramContext; +import org.eclipse.sirius.components.collaborative.diagrams.variables.DiagramVariables; +import org.eclipse.sirius.components.core.api.IEditingContext; +import org.eclipse.sirius.components.representations.IOperationValidator; +import org.eclipse.sirius.components.representations.VariableManager; +import org.eclipse.sirius.components.view.emf.diagram.tools.DiagramElementPaletteVariableManagerProvider; +import org.springframework.context.annotation.Primary; +import org.springframework.stereotype.Service; + +/** + * Provides the missing edge target variable when evaluating edge tools in an ordinary diagram element palette. + * This service should be deleted when https://github.com/eclipse-sirius/sirius-web/issues/6997 will be fixed. + * + * @author arichard + */ +@Primary +@Service +public class SysONDiagramElementPaletteVariableManagerProvider extends DiagramElementPaletteVariableManagerProvider { + + /** + * Creates the palette variable provider. + * + * @param operationValidator + * validates the variables required by palette operations + */ + public SysONDiagramElementPaletteVariableManagerProvider(IOperationValidator operationValidator) { + super(operationValidator); + } + + /** + * Supplies the source semantic element as an edge target placeholder until a connector target is selected. + * + * @param editingContext + * the editing context + * @param diagramContext + * the diagram context + * @param diagramElement + * the selected diagram element + * @param semanticElement + * its semantic element + * @return the palette variables + */ + @Override + public Optional getVariableManager(IEditingContext editingContext, DiagramContext diagramContext, Object diagramElement, Object semanticElement) { + var variableManager = super.getVariableManager(editingContext, diagramContext, diagramElement, semanticElement); + variableManager.ifPresent(variables -> variables.put(DiagramVariables.EDGE_TARGET.name(), semanticElement)); + return variableManager; + } +}