@page "/admin/areas" @using ScadaLink.Security @using ScadaLink.Commons.Entities.Instances @using ScadaLink.Commons.Entities.Sites @using ScadaLink.Commons.Interfaces.Repositories @attribute [Authorize(Policy = AuthorizationPolicies.RequireDesign)] @inject ISiteRepository SiteRepository @inject ITemplateEngineRepository TemplateEngineRepository @inject NavigationManager NavigationManager

Area Management

@if (_loading) { } else if (_errorMessage != null) {
@_errorMessage
} else { @if (node.Kind == AreaNodeKind.Site) { @node.Label @node.AreaCount } else { @node.Label } @if (node.Kind == AreaNodeKind.Site) { } else { } No sites configured. }
@code { record AreaTreeNode(string Key, string Label, AreaNodeKind Kind, List Children, int SiteId, Area? Area = null, int AreaCount = 0); enum AreaNodeKind { Site, Area } private List _sites = new(); private List _treeRoots = new(); private bool _loading = true; private string? _errorMessage; private ToastNotification _toast = default!; protected override async Task OnInitializedAsync() { await LoadDataAsync(); } private async Task LoadDataAsync() { _loading = true; try { _sites = (await SiteRepository.GetAllSitesAsync()).ToList(); _treeRoots = new(); foreach (var site in _sites) { var areas = (await TemplateEngineRepository.GetAreasBySiteIdAsync(site.Id)).ToList(); var rootAreas = areas.Where(a => a.ParentAreaId == null).OrderBy(a => a.Name); var children = rootAreas.Select(a => BuildAreaNode(a, site.Id)).ToList(); _treeRoots.Add(new AreaTreeNode( Key: $"site-{site.Id}", Label: site.Name, Kind: AreaNodeKind.Site, Children: children, SiteId: site.Id, AreaCount: areas.Count)); } } catch (Exception ex) { _errorMessage = $"Failed to load data: {ex.Message}"; } _loading = false; } private AreaTreeNode BuildAreaNode(Area area, int siteId) { var children = area.Children .OrderBy(c => c.Name) .Select(c => BuildAreaNode(c, siteId)) .ToList(); return new AreaTreeNode( Key: $"area-{area.Id}", Label: area.Name, Kind: AreaNodeKind.Area, Children: children, SiteId: siteId, Area: area); } }