Skip to content

Commit 8ac3922

Browse files
committed
[3647] Add support for diagram style with background customization
Bug: #3647 Signed-off-by: Florian ROUËNÉ <florian.rouene@obeosoft.com>
1 parent 523f186 commit 8ac3922

File tree

106 files changed

+2572
-219
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

106 files changed

+2572
-219
lines changed

CHANGELOG.adoc

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434

3535
=== New Features
3636

37-
37+
- https://github.com/eclipse-sirius/sirius-web/issues/3647[#3647] [diagram] Add support for diagram style with background customization
3838

3939

4040
=== Improvements

integration-tests-playwright/playwright/e2e/diagrams/diagram.spec.ts

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,3 +66,59 @@ test.describe('diagram', () => {
6666
await expect(page.locator('.react-flow__minimap')).toBeAttached();
6767
});
6868
});
69+
70+
test.describe('diagram', () => {
71+
let projectId;
72+
test.beforeEach(async ({ page, request }) => {
73+
const project = await new PlaywrightProject(request).createProject('diagram-list', 'papaya-empty');
74+
projectId = project.projectId;
75+
76+
await page.goto(`/projects/${projectId}/edit`);
77+
const playwrightExplorer = new PlaywrightExplorer(page);
78+
await playwrightExplorer.uploadDocument('diagramPapayaClassNode.xml');
79+
await playwrightExplorer.expand('diagramPapayaClassNode.xml');
80+
await playwrightExplorer.expand('Project');
81+
await playwrightExplorer.expand('Component');
82+
83+
await playwrightExplorer.createRepresentation('Component', 'Class Diagram', 'diagram');
84+
});
85+
86+
test.afterEach(async ({ request }) => {
87+
await new PlaywrightProject(request).deleteProject(projectId);
88+
});
89+
90+
test('when a diagram has a conditional style, then the style is changed after triggering the condition', async ({
91+
page,
92+
}) => {
93+
await expect(page.getByTestId('rf__wrapper')).toBeAttached();
94+
const playwrightExplorer = new PlaywrightExplorer(page);
95+
await playwrightExplorer.expand('Package');
96+
await page.waitForFunction(
97+
() => {
98+
const div = document.querySelector('[data-testid="rf__background"]');
99+
if (!div) {
100+
return false;
101+
}
102+
103+
const background = window.getComputedStyle(div).getPropertyValue('background');
104+
return background.includes('Drag and drop elements to get started');
105+
},
106+
{ timeout: 2000 }
107+
);
108+
109+
await (await playwrightExplorer.getTreeItemLabel('NewClass')).dragTo(page.getByTestId('rf__wrapper'));
110+
111+
await page.waitForFunction(
112+
() => {
113+
const div = document.querySelector('[data-testid="rf__background"]');
114+
if (!div) {
115+
return false;
116+
}
117+
118+
const background = window.getComputedStyle(div).getPropertyValue('background');
119+
return background.startsWith('rgb(255, 255, 255) none repeat scroll 0% 0% ');
120+
},
121+
{ timeout: 2000 }
122+
);
123+
});
124+
});

packages/diagrams/backend/sirius-components-collaborative-diagrams/src/main/resources/schema/diagram.graphqls

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,9 +34,14 @@ type Diagram implements Representation {
3434
targetObjectId: ID!
3535
nodes: [Node!]!
3636
edges: [Edge!]!
37+
style: DiagramStyle!
3738
layoutData: DiagramLayoutData!
3839
}
3940

41+
type DiagramStyle {
42+
background: String!
43+
}
44+
4045
type DiagramLayoutData {
4146
nodeLayoutData: [NodeLayoutData!]!
4247
edgeLayoutData: [EdgeLayoutData!]!

packages/diagrams/backend/sirius-components-collaborative-diagrams/src/test/java/org/eclipse/sirius/components/collaborative/diagrams/DiagramEventProcessorTests.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131
import org.eclipse.sirius.components.core.api.IPayload;
3232
import org.eclipse.sirius.components.core.api.IRepresentationDescriptionSearchService;
3333
import org.eclipse.sirius.components.diagrams.Diagram;
34+
import org.eclipse.sirius.components.diagrams.DiagramStyle;
3435
import org.eclipse.sirius.components.diagrams.InsideLabel;
3536
import org.eclipse.sirius.components.diagrams.Node;
3637
import org.junit.jupiter.api.Test;
@@ -55,6 +56,7 @@ public class DiagramEventProcessorTests {
5556
.targetObjectId("targetObjectId")
5657
.nodes(List.of(INITIAL_TEST_NODE))
5758
.edges(List.of())
59+
.style(DiagramStyle.newDiagramStyle().build())
5860
.build();
5961

6062
private final IDiagramCreationService diagramCreationService = new MockDiagramCreationService(INITIAL_TEST_DIAGRAM);

packages/diagrams/backend/sirius-components-collaborative-diagrams/src/test/java/org/eclipse/sirius/components/collaborative/diagrams/handlers/CreateDiagramEventHandlerTests.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*******************************************************************************
2-
* Copyright (c) 2019, 2025 Obeo.
2+
* Copyright (c) 2019, 2026 Obeo.
33
* This program and the accompanying materials
44
* are made available under the terms of the Eclipse Public License v2.0
55
* which accompanies this distribution, and is available at
@@ -33,6 +33,7 @@
3333
import org.eclipse.sirius.components.core.api.IPayload;
3434
import org.eclipse.sirius.components.core.api.IRepresentationDescriptionSearchService;
3535
import org.eclipse.sirius.components.diagrams.Diagram;
36+
import org.eclipse.sirius.components.diagrams.DiagramStyle;
3637
import org.eclipse.sirius.components.diagrams.description.DiagramDescription;
3738
import org.eclipse.sirius.components.representations.Failure;
3839
import org.eclipse.sirius.components.representations.IRepresentationDescription;
@@ -64,6 +65,7 @@ public Optional<IRepresentationDescription> findById(IEditingContext editingCont
6465
.targetObjectIdProvider(variableManager -> "targetObjectId")
6566
.dropHandler(variableManager -> new Failure(""))
6667
.iconURLsProvider(variableManager -> List.of())
68+
.styleProvider(variableManager -> DiagramStyle.newDiagramStyle().build())
6769
.build();
6870

6971
return Optional.of(diagramDescription);

packages/diagrams/backend/sirius-components-collaborative-diagrams/src/test/java/org/eclipse/sirius/components/collaborative/diagrams/handlers/GetConnectorToolsEventHandlerTests.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*******************************************************************************
2-
* Copyright (c) 2022, 2025 Obeo.
2+
* Copyright (c) 2022, 2026 Obeo.
33
* This program and the accompanying materials
44
* are made available under the terms of the Eclipse Public License v2.0
55
* which accompanies this distribution, and is available at
@@ -35,6 +35,7 @@
3535
import org.eclipse.sirius.components.core.api.IRepresentationDescriptionSearchService;
3636
import org.eclipse.sirius.components.diagrams.CollapsingState;
3737
import org.eclipse.sirius.components.diagrams.Diagram;
38+
import org.eclipse.sirius.components.diagrams.DiagramStyle;
3839
import org.eclipse.sirius.components.diagrams.HeaderSeparatorDisplayMode;
3940
import org.eclipse.sirius.components.diagrams.InsideLabel;
4041
import org.eclipse.sirius.components.diagrams.InsideLabelLocation;
@@ -143,6 +144,7 @@ public void testGetConnectorTools() {
143144
.edgeDescriptions(new ArrayList<>())
144145
.dropHandler(variableManager -> new Failure(""))
145146
.iconURLsProvider(variableManager -> List.of())
147+
.styleProvider(variableManager -> DiagramStyle.newDiagramStyle().build())
146148
.build();
147149

148150
Node sourceNode = this.getNode(SOURCE_NODE_ID, SOURCE_NODE_TARGET_ID);
@@ -208,6 +210,7 @@ private Diagram getDiagram(String id, List<Node> nodes) {
208210
.targetObjectId("diagramTargetObjectId")
209211
.nodes(nodes)
210212
.edges(List.of())
213+
.style(DiagramStyle.newDiagramStyle().build())
211214
.build();
212215
}
213216
}

packages/diagrams/backend/sirius-components-collaborative-diagrams/src/test/java/org/eclipse/sirius/components/collaborative/diagrams/handlers/GetNodeDescriptionsEventHandlerTests.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*******************************************************************************
2-
* Copyright (c) 2024, 2025 Obeo.
2+
* Copyright (c) 2024, 2026 Obeo.
33
* This program and the accompanying materials
44
* are made available under the terms of the Eclipse Public License v2.0
55
* which accompanies this distribution, and is available at
@@ -29,6 +29,7 @@
2929
import org.eclipse.sirius.components.core.api.IPayload;
3030
import org.eclipse.sirius.components.core.api.IRepresentationDescriptionSearchService;
3131
import org.eclipse.sirius.components.diagrams.Diagram;
32+
import org.eclipse.sirius.components.diagrams.DiagramStyle;
3233
import org.eclipse.sirius.components.diagrams.description.NodeDescription;
3334
import org.eclipse.sirius.components.diagrams.layoutdata.DiagramLayoutData;
3435
import org.eclipse.sirius.components.representations.IRepresentationDescription;
@@ -81,6 +82,7 @@ public Optional<IRepresentationDescription> findById(IEditingContext editingCont
8182
}
8283
return desc;
8384
}
85+
8486
@Override
8587
public Map<String, IRepresentationDescription> findAll(IEditingContext editingContext) {
8688
var descriptions = new HashMap<String, IRepresentationDescription>();
@@ -106,6 +108,7 @@ public Map<String, IRepresentationDescription> findAll(IEditingContext editingCo
106108
.layoutData(new DiagramLayoutData(Map.of(), Map.of(), Map.of()))
107109
.nodes(List.of())
108110
.targetObjectId("")
111+
.style(DiagramStyle.newDiagramStyle().build())
109112
.build();
110113

111114
handler.handle(payloadSink, changeDescriptionSink, editingContext, new DiagramContext(diagram), input);

packages/diagrams/backend/sirius-components-collaborative-diagrams/src/test/java/org/eclipse/sirius/components/collaborative/diagrams/handlers/TestDiagramBuilder.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*******************************************************************************
2-
* Copyright (c) 2019, 2025 Obeo.
2+
* Copyright (c) 2019, 2026 Obeo.
33
* This program and the accompanying materials
44
* are made available under the terms of the Eclipse Public License v2.0
55
* which accompanies this distribution, and is available at
@@ -19,6 +19,7 @@
1919
import org.eclipse.sirius.components.diagrams.ArrowStyle;
2020
import org.eclipse.sirius.components.diagrams.CollapsingState;
2121
import org.eclipse.sirius.components.diagrams.Diagram;
22+
import org.eclipse.sirius.components.diagrams.DiagramStyle;
2223
import org.eclipse.sirius.components.diagrams.Edge;
2324
import org.eclipse.sirius.components.diagrams.EdgeStyle;
2425
import org.eclipse.sirius.components.diagrams.EdgeType;
@@ -54,6 +55,7 @@ public Diagram getDiagram(String id) {
5455
.targetObjectId("diagramTargetObjectId")
5556
.nodes(List.of())
5657
.edges(List.of())
58+
.style(DiagramStyle.newDiagramStyle().build())
5759
.build();
5860
}
5961

packages/diagrams/backend/sirius-components-collaborative-diagrams/src/test/java/org/eclipse/sirius/components/collaborative/diagrams/handlers/TestDiagramDescriptionBuilder.java

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*******************************************************************************
2-
* Copyright (c) 2019, 2025 Obeo.
2+
* Copyright (c) 2019, 2026 Obeo.
33
* This program and the accompanying materials
44
* are made available under the terms of the Eclipse Public License v2.0
55
* which accompanies this distribution, and is available at
@@ -18,6 +18,7 @@
1818
import java.util.function.Function;
1919

2020
import org.eclipse.sirius.components.diagrams.ArrowStyle;
21+
import org.eclipse.sirius.components.diagrams.DiagramStyle;
2122
import org.eclipse.sirius.components.diagrams.EdgeStyle;
2223
import org.eclipse.sirius.components.diagrams.EdgeType;
2324
import org.eclipse.sirius.components.diagrams.FreeFormLayoutStrategy;
@@ -56,6 +57,7 @@ public DiagramDescription getDiagramDescription(String diagramDescriptionId, Lis
5657
.edgeDescriptions(edgeDescriptions)
5758
.dropHandler(variableManager -> new Failure(""))
5859
.iconURLsProvider(variableManager -> List.of())
60+
.styleProvider(variableManager -> DiagramStyle.newDiagramStyle().build())
5961
.build();
6062
}
6163

@@ -64,14 +66,14 @@ public EdgeDescription getEdgeDescription(String edgeDescriptionId, NodeDescript
6466
Function<VariableManager, List<Element>> targetProvider = variableManager -> List.of();
6567

6668
Function<VariableManager, EdgeStyle> edgeStyleProvider = variableManager ->
67-
EdgeStyle.newEdgeStyle()
68-
.size(2)
69-
.lineStyle(LineStyle.Dash_Dot)
70-
.sourceArrow(ArrowStyle.InputArrowWithDiamond)
71-
.targetArrow(ArrowStyle.None)
72-
.color("rgb(1, 2, 3)")
73-
.edgeType(EdgeType.Manhattan)
74-
.build();
69+
EdgeStyle.newEdgeStyle()
70+
.size(2)
71+
.lineStyle(LineStyle.Dash_Dot)
72+
.sourceArrow(ArrowStyle.InputArrowWithDiamond)
73+
.targetArrow(ArrowStyle.None)
74+
.color("rgb(1, 2, 3)")
75+
.edgeType(EdgeType.Manhattan)
76+
.build();
7577

7678
Function<VariableManager, String> idProvider = variableManager -> variableManager.get(VariableManager.SELF, String.class).orElse(null);
7779

packages/diagrams/backend/sirius-components-diagrams/src/main/java/org/eclipse/sirius/components/diagrams/Diagram.java

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*******************************************************************************
2-
* Copyright (c) 2019, 2024 Obeo.
2+
* Copyright (c) 2019, 2026 Obeo.
33
* This program and the accompanying materials
44
* are made available under the terms of the Eclipse Public License v2.0
55
* which accompanies this distribution, and is available at
@@ -28,6 +28,7 @@
2828
*/
2929
@Immutable
3030
public final class Diagram implements IRepresentation {
31+
3132
public static final String KIND = IRepresentation.KIND_PREFIX + "?type=Diagram";
3233

3334
private String id;
@@ -44,6 +45,8 @@ public final class Diagram implements IRepresentation {
4445

4546
private DiagramLayoutData layoutData;
4647

48+
private DiagramStyle style;
49+
4750
private Diagram() {
4851
// Prevent instantiation
4952
}
@@ -80,6 +83,10 @@ public DiagramLayoutData getLayoutData() {
8083
return this.layoutData;
8184
}
8285

86+
public DiagramStyle getStyle() {
87+
return this.style;
88+
}
89+
8390
public static Builder newDiagram(String id) {
8491
return new Builder(id);
8592
}
@@ -101,9 +108,10 @@ public String toString() {
101108
*/
102109
@SuppressWarnings("checkstyle:HiddenField")
103110
public static final class Builder {
104-
private String id;
105111

106-
private String kind = KIND;
112+
private final String id;
113+
114+
private final String kind = KIND;
107115

108116
private String targetObjectId;
109117

@@ -113,6 +121,8 @@ public static final class Builder {
113121

114122
private List<Edge> edges;
115123

124+
private DiagramStyle style;
125+
116126
private DiagramLayoutData layoutData = new DiagramLayoutData(Map.of(), Map.of(), Map.of());
117127

118128
private Builder(String id) {
@@ -125,6 +135,7 @@ private Builder(Diagram diagram) {
125135
this.descriptionId = diagram.getDescriptionId();
126136
this.nodes = diagram.getNodes();
127137
this.edges = diagram.getEdges();
138+
this.style = diagram.getStyle();
128139
this.layoutData = diagram.getLayoutData();
129140
}
130141

@@ -148,6 +159,11 @@ public Builder edges(List<Edge> edges) {
148159
return this;
149160
}
150161

162+
public Builder style(DiagramStyle style) {
163+
this.style = Objects.requireNonNull(style);
164+
return this;
165+
}
166+
151167
public Builder layoutData(DiagramLayoutData layoutData) {
152168
this.layoutData = Objects.requireNonNull(layoutData);
153169
return this;
@@ -161,6 +177,7 @@ public Diagram build() {
161177
diagram.descriptionId = Objects.requireNonNull(this.descriptionId);
162178
diagram.nodes = Objects.requireNonNull(this.nodes);
163179
diagram.edges = Objects.requireNonNull(this.edges);
180+
diagram.style = Objects.requireNonNull(this.style);
164181
diagram.layoutData = Objects.requireNonNull(this.layoutData);
165182
return diagram;
166183
}

0 commit comments

Comments
 (0)