-
Notifications
You must be signed in to change notification settings - Fork 146
/
Copy pathTreeComponent.razor
160 lines (148 loc) · 5.82 KB
/
TreeComponent.razor
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
@namespace Blazor_MAUI_Demos.Shared
@implements IDisposable;
<div class="@classNames" role="tree" tabindex="0">
<ul class="@SampleUtils.TREE_PARENT" role="presentation">
@foreach (var components in this.DataSource)
{
<li class="@SampleUtils.TREE_PARENT_LI" role="treeitem">
@{
var classList = GetClassList(components);
}
<div class="@SampleUtils.TREE_FULL_ROW" @onclick="@(() => OnParentClick(components))"></div>
<div class="@SampleUtils.TREE_TEXT_CONTENT">
<div class="@classList["iconClass"]" @onclick="@(() => OnParentClick(components))"></div>
@{
var treeText = SampleUtils.TREE_TEXT;
if (childSelected != null)
{
if (components.Name == childSelected.Category)
{
treeText = treeText + SampleUtils.SPACE + SampleUtils.ACTIVE_CLASS;
}
}
}
<span class="@treeText">@components.Name</span>
</div>
<ul class="@classList["childClass"]" role="group">
@foreach (var component in components.SourceData)
{
if (!component.IsHide)
{
<li class="@SampleUtils.TREE_PARENT_LI" role="treeitem">
@{
var nodeFullRow = SampleUtils.TREE_FULL_ROW;
if (EqualityComparer<SampleListType>.Default.Equals(component, childSelected))
{
nodeFullRow = SampleUtils.AddClass(nodeFullRow, SampleUtils.TREE_ACTIVE);
}
}
<div class="@nodeFullRow" @onclick="@(async () => await OnChildClick(component))"></div>
<div class="@SampleUtils.TREE_TEXT_CONTENT">
<span class="@SampleUtils.TREE_TEXT">
@TreeTemplate(component)
</span>
</div>
</li>
}
}
</ul>
</li>
}
</ul>
</div>
@code {
private SampleListType childSelected;
private List<SampleListType> collapsedItems = new List<SampleListType>();
private string classNames = SampleUtils.TREE_CLASS + SampleUtils.SPACE + SampleUtils.TREE_HIDE;
/// <summary>
/// Child content of tree component.
/// </summary>
[Parameter]
public RenderFragment ChildContent { get; set; }
/// <summary>
/// Specifies the datasource of the tree component.
/// </summary>
[Parameter]
public IEnumerable<SampleListType> DataSource { get; set; }
/// <summary>
/// Specifies the template of the tree component.
/// </summary>
[Parameter]
public RenderFragment<SampleListType> TreeTemplate { get; set; }
/// <summary>
/// Triggers the event callback on tree node selection.
/// </summary>
[Parameter]
public EventCallback<SampleListType> OnNodeSelect { get; set; }
/// <summary>
/// Show or hide the tree component based on the logic.
/// </summary>
/// <param name="isVisible">Specifies the input to show or hide the component.</param>
public void ShowTree(bool isVisible = true)
{
if (isVisible)
{
classNames = SampleUtils.RemoveClass(classNames, SampleUtils.TREE_HIDE);
}
else
{
classNames = SampleUtils.AddClass(classNames, SampleUtils.TREE_HIDE);
}
StateHasChanged();
}
/// <summary>
/// Select the tree node based on given node data.
/// </summary>
/// <param name="nodeItem">Specifies the node item need to be selected.</param>
public void SelectNode(SampleListType nodeItem)
{
childSelected = nodeItem;
StateHasChanged();
}
// Parent node selection handler.
private void OnParentClick(SampleListType parent)
{
var itemIndex = collapsedItems.IndexOf(parent);
if (itemIndex == -1)
{
collapsedItems.Add(parent);
}
else
{
collapsedItems.RemoveAt(itemIndex);
}
}
// Child node selection handler.
private async Task OnChildClick(SampleListType child)
{
childSelected = child;
if (OnNodeSelect.HasDelegate)
{
await OnNodeSelect.InvokeAsync(child);
}
}
// Returns the list of class for current group.
private Dictionary<string, string> GetClassList(SampleListType components)
{
var classList = new Dictionary<string, string>();
classList["iconClass"] = "sb-icons" + SampleUtils.SPACE + SampleUtils.TREE_EXPAND_ICON;
classList["childClass"] = SampleUtils.TREE_PARENT;
if (collapsedItems.Count > 0)
{
var collapsed = collapsedItems.Where(item => item.Name == components.Name).ToList();
if (collapsed.Count > 0)
{
classList["iconClass"] = SampleUtils.RemoveClass(classList["iconClass"], SampleUtils.TREE_EXPAND_ICON);
classList["iconClass"] = SampleUtils.AddClass(classList["iconClass"], SampleUtils.TREE_COLLAPSE_ICON);
classList["childClass"] = SampleUtils.AddClass(classList["childClass"], SampleUtils.DISPLAY_NONE);
}
}
return classList;
}
public void Dispose()
{
childSelected = null;
collapsedItems = null;
DataSource = null;
}
}