Skip to content

Commit 49311ac

Browse files
authored
Merge pull request #69 from zHaytam/develop
Version 1.5.1
2 parents ab54d55 + 8469fc5 commit 49311ac

File tree

15 files changed

+262
-22
lines changed

15 files changed

+262
-22
lines changed

CHANGELOG.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,17 @@ All notable changes to this project will be documented in this file.
44
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
55
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
66

7+
## Diagrams [1.5.1] - 2021-01-09
8+
9+
## Added
10+
11+
- `AddGroup`: add an instance of a group to the diagram.
12+
- Custom group documentation/demo.
13+
14+
## Fixed
15+
16+
- Clicking the canvas in the Events demo throws an exception.
17+
718
## Diagrams [1.5.0] - 2021-01-05
819

920
## Added

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ You can get started very easily & quickly using:
5656
</CascadingValue>
5757
```
5858

59-
![](https://i.imgur.com/k4UThmh.png)
59+
![](https://i.imgur.com/WZYL2PW.png)
6060

6161

6262
### Sample project

samples/SharedDemo/Customization.razor

Lines changed: 117 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,117 @@ private NodeModel NewNode(double x, double y)
277277
</p>
278278
</div>
279279
</section>
280+
<section id="custom-groups" class="doc-section">
281+
<h2 class="section-title">Custom groups</h2>
282+
<p>
283+
Creating custom groups is almost the same as creating custom nodes, except for some specifics.
284+
</p>
285+
<div id="create-group-model" class="section-block">
286+
<h3 class="block-title">Creating a model</h3>
287+
<p>
288+
First, we'll create a new model for our group.
289+
</p>
290+
<pre><code class="language-csharp line-numbers">public class CustomGroupModel : GroupModel
291+
{
292+
public CustomGroupModel(DiagramManager diagramManager, NodeModel[] children, string title, byte padding = 30)
293+
: base(diagramManager, children, padding)
294+
{
295+
Title = title;
296+
}
297+
298+
public string Title { get; }
299+
}</code></pre>
300+
<p>
301+
You can add whatever properties you might need. You can also change the value of the padding, which is used when calculating the position/size of the group.
302+
</p>
303+
</div>
304+
<div id="create-group-component" class="section-block">
305+
<h3 class="block-title">Creating a component</h3>
306+
<p>
307+
Second, we'll create a component <code>CustomGroupWidget</code> that handles our new type of links.
308+
</p>
309+
<pre><code class="language-markup line-numbers">&lt;GroupContainer Group=&quot;Group&quot; Class=&quot;custom&quot;&gt;
310+
&lt;span class=&quot;title&quot;&gt;@@Group.Title&lt;/span&gt;
311+
&lt;GroupLinks&gt;&lt;/GroupLinks&gt;
312+
&lt;GroupNodes&gt;&lt;/GroupNodes&gt;
313+
314+
@@foreach (var port in Group.Ports)
315+
{
316+
&lt;PortRenderer Port=&quot;port&quot; Class=&quot;group-port&quot;&gt;&lt;/PortRenderer&gt;
317+
}
318+
&lt;/GroupContainer&gt;
319+
320+
@@code {
321+
[Parameter] public CustomGroupModel Group { get; set; }
322+
}</code></pre>
323+
<ul>
324+
<li>It is mandatory to wrap everything in a <code>GroupContainer</code> component so that everything works properly, such as the group's position, moving it, etc..</li>
325+
<li>
326+
It is mandatory to add both <code>GroupLinks</code> and <code>GroupNodes</code> as direct children of the container.
327+
This will render the appropriate layers and populate/configure them properly.
328+
</li>
329+
<li>As with custom nodes, you are in charge of rendering the ports.</li>
330+
</ul>
331+
332+
For any custom content, you can add it wherever you want, as long as it's inside the container like our title <code>span</code>.<br />
333+
As with everything else, the component can be styled using CSS. Here is the styling of the custom group in the demos:
334+
<pre><code class="language-css line-numbers">.group.custom {
335+
outline: 2px solid black;
336+
background-color: #6fbb6e;
337+
}
338+
339+
.group.custom > span.title {
340+
padding: 20px;
341+
position: absolute;
342+
left: 50%;
343+
transform: translate(-50%, -50%);
344+
background: #eee;
345+
border: 2px solid black;
346+
border-radius: 50%;
347+
background-color: #6fbb6e;
348+
font-weight: bold;
349+
text-transform: uppercase;
350+
}</code></pre>
351+
</div>
352+
<div id="register-custom-group" class="section-block">
353+
<h3 class="block-title">Registering the custom group</h3>
354+
<p>
355+
Lastly, we'll register the custom link and its component in the <code>DiagramManager</code>:
356+
</p>
357+
<pre><code class="language-csharp line-numbers">protected override void OnInitialized()
358+
{
359+
base.OnInitialized();
360+
361+
_diagramManager.RegisterModelComponent&lt;CustomGroupModel, CustomGroupWidget&gt;();
362+
363+
var node1 = NewNode(50, 50);
364+
var node2 = NewNode(300, 300);
365+
var node3 = NewNode(500, 100);
366+
367+
_diagramManager.AddNode(node1);
368+
// You can create your own group directly and add it
369+
// You don't have to add its children to the diagram
370+
_diagramManager.AddGroup(new CustomGroupModel(_diagramManager, new[] { node2, node3 }, &quot;Group 1&quot;));
371+
372+
_diagramManager.AddLink(node1.GetPort(PortAlignment.Right), node2.GetPort(PortAlignment.Left));
373+
_diagramManager.AddLink(node2.GetPort(PortAlignment.Right), node3.GetPort(PortAlignment.Bottom));
374+
}
375+
376+
private NodeModel NewNode(double x, double y)
377+
{
378+
var node = new NodeModel(new Point(x, y));
379+
node.AddPort(PortAlignment.Bottom);
380+
node.AddPort(PortAlignment.Top);
381+
node.AddPort(PortAlignment.Left);
382+
node.AddPort(PortAlignment.Right);
383+
return node;
384+
}</code></pre>
385+
</div>
386+
<p>
387+
Here's how it would look like:
388+
</p>
389+
<img src="_content/SharedDemo/img/CustomGroupDisplay.png" alt="Custom Group Display" />
390+
</section>
280391
</div>
281392
</div>
282393

@@ -301,6 +412,12 @@ private NodeModel NewNode(double x, double y)
301412
<a class="nav-link scrollto" href="#create-link-component">Creating a component</a>
302413
<a class="nav-link scrollto" href="#register-custom-link">Registering the custom link</a>
303414
</nav>
415+
<a class="nav-link scrollto" href="#custom-groups">Custom groups</a>
416+
<nav class="doc-sub-menu nav flex-column">
417+
<a class="nav-link scrollto" href="#create-group-model">Creating a model</a>
418+
<a class="nav-link scrollto" href="#create-group-component">Creating a component</a>
419+
<a class="nav-link scrollto" href="#register-custom-group">Registering the custom group</a>
420+
</nav>
304421
</nav>
305422
</div>
306423
</div>
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
using Blazor.Diagrams.Core;
2+
using Blazor.Diagrams.Core.Models;
3+
4+
namespace SharedDemo.Demos.CustomGroup
5+
{
6+
public class CustomGroupModel : GroupModel
7+
{
8+
public CustomGroupModel(DiagramManager diagramManager, NodeModel[] children, string title, byte padding = 30)
9+
: base(diagramManager, children, padding)
10+
{
11+
Title = title;
12+
}
13+
14+
public string Title { get; }
15+
}
16+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<GroupContainer Group="Group" Class="custom">
2+
<span class="title">@Group.Title</span>
3+
<GroupLinks></GroupLinks>
4+
<GroupNodes></GroupNodes>
5+
</GroupContainer>
6+
7+
@code {
8+
[Parameter] public CustomGroupModel Group { get; set; }
9+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
@page "/demos/custom-group"
2+
@layout DemoLayout
3+
@inject LayoutData LayoutData
4+
5+
<CascadingValue Name="DiagramManager" Value="_diagramManager">
6+
<DiagramCanvas></DiagramCanvas>
7+
</CascadingValue>
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
using Blazor.Diagrams.Core;
2+
using Blazor.Diagrams.Core.Models;
3+
using Blazor.Diagrams.Core.Models.Core;
4+
5+
namespace SharedDemo.Demos.CustomGroup
6+
{
7+
partial class Demo
8+
{
9+
private readonly DiagramManager _diagramManager = new DiagramManager();
10+
11+
protected override void OnInitialized()
12+
{
13+
base.OnInitialized();
14+
15+
LayoutData.Title = "Custom group";
16+
LayoutData.Info = "Creating your own custom groups is very easy!";
17+
LayoutData.DataChanged();
18+
19+
_diagramManager.RegisterModelComponent<CustomGroupModel, CustomGroupWidget>();
20+
21+
var node1 = NewNode(50, 50);
22+
var node2 = NewNode(300, 300);
23+
var node3 = NewNode(500, 100);
24+
25+
_diagramManager.AddNode(node1);
26+
_diagramManager.AddGroup(new CustomGroupModel(_diagramManager, new[] { node2, node3 }, "Group 1"));
27+
28+
_diagramManager.AddLink(node1.GetPort(PortAlignment.Right), node2.GetPort(PortAlignment.Left));
29+
_diagramManager.AddLink(node2.GetPort(PortAlignment.Right), node3.GetPort(PortAlignment.Bottom));
30+
}
31+
32+
private NodeModel NewNode(double x, double y)
33+
{
34+
var node = new NodeModel(new Point(x, y));
35+
node.AddPort(PortAlignment.Bottom);
36+
node.AddPort(PortAlignment.Top);
37+
node.AddPort(PortAlignment.Left);
38+
node.AddPort(PortAlignment.Right);
39+
return node;
40+
}
41+
}
42+
}

samples/SharedDemo/Demos/Events.razor.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,11 +53,11 @@ private void RegisterEvents()
5353

5454
diagramManager.LinkRemoved += (l) => events.Add($"LinkRemoved, LinkId={l.Id}");
5555

56-
diagramManager.MouseUp += (m, e) => {
57-
events.Add($"NodeMoved, NodeId={m.Id}");
56+
diagramManager.MouseUp += (m, e) =>
57+
{
58+
events.Add($"MouseUp, ModelId={m?.Id}");
5859
StateHasChanged();
5960
};
60-
6161
}
6262

6363
private NodeModel NewNode(double x, double y)

samples/SharedDemo/Layouts/DemoLayout.razor

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
<a href="demos/custom-node" class="list-group-item list-group-item-action bg-light">Custom node</a>
4646
<a href="demos/custom-link" class="list-group-item list-group-item-action bg-light">Custom link</a>
4747
<a href="demos/custom-port" class="list-group-item list-group-item-action bg-light">Custom port</a>
48+
<a href="demos/custom-group" class="list-group-item list-group-item-action bg-light">Custom group</a>
4849

4950
<div class="list-group-item bg-primary text-light">Algorithms</div>
5051
<a href="demos/reconnect-links" class="list-group-item list-group-item-action bg-light">Reconnect links</a>

samples/SharedDemo/_Imports.razor

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,5 @@
66
@using Microsoft.AspNetCore.Components.Forms
77
@using Microsoft.AspNetCore.Components.Routing
88
@using Blazor.Diagrams.Core.Extensions;
9-
@using Blazor.Diagrams.Components.Renderers;
9+
@using Blazor.Diagrams.Components.Renderers;
10+
@using Blazor.Diagrams.Components.Groups;

0 commit comments

Comments
 (0)