Skip to content

Commit e586245

Browse files
committed
Adding functionality for GroupModel Removal to RemoveControl
1 parent 58bcdb3 commit e586245

File tree

2 files changed

+124
-12
lines changed

2 files changed

+124
-12
lines changed

src/Blazor.Diagrams.Core/Controls/Default/RemoveControl.cs

Lines changed: 31 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -25,23 +25,42 @@ public RemoveControl(IPositionProvider positionProvider)
2525

2626
public override async ValueTask OnPointerDown(Diagram diagram, Model model, PointerEventArgs _)
2727
{
28-
switch (model)
28+
if (await ShouldDeleteModel(diagram, model))
2929
{
30+
DeleteModel(diagram, model);
31+
}
32+
}
3033

34+
private static void DeleteModel(Diagram diagram, Model model)
35+
{
36+
switch (model)
37+
{
38+
case GroupModel group:
39+
diagram.Groups.Delete(group);
40+
return;
3141
case NodeModel node:
32-
if (await diagram.Options.Constraints.ShouldDeleteNode.Invoke(node))
33-
{
34-
diagram.Nodes.Remove(node);
35-
}
36-
break;
42+
diagram.Nodes.Remove(node);
43+
return;
44+
3745
case BaseLinkModel link:
38-
if (await diagram.Options.Constraints.ShouldDeleteLink.Invoke(link))
39-
{
40-
diagram.Links.Remove(link);
41-
}
42-
break;
46+
diagram.Links.Remove(link);
47+
return;
48+
}
49+
}
4350

44-
51+
private static async ValueTask<bool> ShouldDeleteModel(Diagram diagram, Model model)
52+
{
53+
if (model.Locked)
54+
{
55+
return false;
4556
}
57+
58+
return model switch
59+
{
60+
GroupModel group => await diagram.Options.Constraints.ShouldDeleteGroup.Invoke(group),
61+
NodeModel node => await diagram.Options.Constraints.ShouldDeleteNode.Invoke(node),
62+
BaseLinkModel link => await diagram.Options.Constraints.ShouldDeleteLink.Invoke(link),
63+
_ => false,
64+
};
4665
}
4766
}

tests/Blazor.Diagrams.Core.Tests/Controls/RemoveControlTests.cs

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -175,5 +175,98 @@ public async Task OnPointerDown_ShouldDeleteLinkFalse_KeepsLink()
175175
Assert.Contains(link, diagram.Links);
176176
}
177177

178+
[Fact]
179+
public async Task OnPointerDown_NoConstraints_RemovesGroup()
180+
{
181+
// Arrange
182+
RemoveControl removeControl = new(0, 0);
183+
Diagram diagram = new TestDiagram();
184+
185+
var node1 = new NodeModel(new Point(50, 50));
186+
var node2 = new NodeModel(new Point(300, 300));
187+
diagram.Nodes.Add(new[] { node1, node2 });
188+
node1.AddPort(PortAlignment.Right);
189+
node2.AddPort(PortAlignment.Left);
190+
191+
var group = new GroupModel(new[] { node1, node2 });
192+
193+
194+
diagram.Groups.Add(group);
195+
196+
// Act
197+
await removeControl.OnPointerDown(diagram, group, PointerEventArgs);
198+
199+
// Assert
200+
Assert.Empty(diagram.Groups);
201+
Assert.Empty(diagram.Nodes);
202+
}
203+
204+
[Fact]
205+
public async Task OnPointerDown_ShouldDeleteGroupTrue_RemovesGroup()
206+
{
207+
// Arrange
208+
RemoveControl removeControl = new(0, 0);
209+
Diagram diagram = new TestDiagram(
210+
new Options.DiagramOptions
211+
{
212+
Constraints =
213+
{
214+
ShouldDeleteGroup = (node) => ValueTask.FromResult(true)
215+
}
216+
});
217+
218+
var node1 = new NodeModel(new Point(50, 50));
219+
var node2 = new NodeModel(new Point(300, 300));
220+
diagram.Nodes.Add(new[] { node1, node2 });
221+
node1.AddPort(PortAlignment.Right);
222+
node2.AddPort(PortAlignment.Left);
223+
224+
var group = new GroupModel(new[] { node1, node2 });
225+
226+
227+
diagram.Groups.Add(group);
228+
229+
// Act
230+
await removeControl.OnPointerDown(diagram, group, PointerEventArgs);
231+
232+
// Assert
233+
Assert.Empty(diagram.Groups);
234+
Assert.Empty(diagram.Nodes);
235+
}
236+
237+
[Fact]
238+
public async Task OnPointerDown_ShouldDeleteGroupFalse_KeepsGroup()
239+
{
240+
// Arrange
241+
RemoveControl removeControl = new(0, 0);
242+
Diagram diagram = new TestDiagram(
243+
new Options.DiagramOptions
244+
{
245+
Constraints =
246+
{
247+
ShouldDeleteGroup = (node) => ValueTask.FromResult(false)
248+
}
249+
});
250+
251+
var node1 = new NodeModel(new Point(50, 50));
252+
var node2 = new NodeModel(new Point(300, 300));
253+
diagram.Nodes.Add(new[] { node1, node2 });
254+
node1.AddPort(PortAlignment.Right);
255+
node2.AddPort(PortAlignment.Left);
256+
257+
var group = new GroupModel(new[] { node1, node2 });
258+
259+
260+
diagram.Groups.Add(group);
261+
262+
// Act
263+
await removeControl.OnPointerDown(diagram, group, PointerEventArgs);
264+
265+
// Assert
266+
Assert.Contains(group, diagram.Groups);
267+
Assert.Contains(node1, diagram.Nodes);
268+
Assert.Contains(node2, diagram.Nodes);
269+
}
270+
178271
}
179272
}

0 commit comments

Comments
 (0)