refactor(ui): replace manual area tree rendering with TreeView component

This commit is contained in:
Joseph Doherty
2026-03-23 02:38:25 -04:00
parent 4426f3e928
commit 71894f4ba9

View File

@@ -96,31 +96,27 @@
</div> </div>
} }
@if (_areas.Count == 0) <TreeView TItem="Area" Items="@_rootAreas"
{ ChildrenSelector='a => a.Children.OrderBy(c => c.Name).ToList()'
<div class="text-muted">No areas configured for this site.</div> HasChildrenSelector="a => a.Children.Any()"
} KeySelector="a => (object)a.Id"
else StorageKey="areas-tree">
{ <NodeContent Context="area">
<div class="card"> <span>@area.Name</span>
<div class="card-body p-2"> </NodeContent>
@foreach (var node in BuildFlatTree()) <ContextMenu Context="area">
{ <button class="dropdown-item" @onclick="() => EditArea(area)">
<div class="d-flex align-items-center py-1 border-bottom" Edit
style="padding-left: @(node.Depth * 24 + 8)px;"> </button>
<span class="me-2 text-muted small"> <div class="dropdown-divider"></div>
@(node.HasChildren ? "[+]" : " -") <button class="dropdown-item text-danger" @onclick="() => DeleteArea(area)">
</span> Delete
<span class="flex-grow-1">@node.Area.Name</span> </button>
<button class="btn btn-outline-primary btn-sm py-0 px-1 me-1" </ContextMenu>
@onclick="() => EditArea(node.Area)">Edit</button> <EmptyContent>
<button class="btn btn-outline-danger btn-sm py-0 px-1" <span class="text-muted fst-italic">No areas for this site. Add one above.</span>
@onclick="() => DeleteArea(node.Area)">Delete</button> </EmptyContent>
</div> </TreeView>
}
</div>
</div>
}
} }
</div> </div>
</div> </div>
@@ -176,25 +172,7 @@
} }
} }
private record AreaTreeNode(Area Area, int Depth, bool HasChildren); private List<Area> _rootAreas => _areas.Where(a => a.ParentAreaId == null).OrderBy(a => a.Name).ToList();
private List<AreaTreeNode> BuildFlatTree()
{
var result = new List<AreaTreeNode>();
AddChildren(null, 0, result);
return result;
}
private void AddChildren(int? parentId, int depth, List<AreaTreeNode> result)
{
var children = _areas.Where(a => a.ParentAreaId == parentId).OrderBy(a => a.Name);
foreach (var child in children)
{
var hasChildren = _areas.Any(a => a.ParentAreaId == child.Id);
result.Add(new AreaTreeNode(child, depth, hasChildren));
AddChildren(child.Id, depth + 1, result);
}
}
private string GetAreaPath(Area area) private string GetAreaPath(Area area)
{ {