@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

Area Management

@if (_loading) { } else if (_errorMessage != null) {
@_errorMessage
} else {
Sites
@if (_sites.Count == 0) {
No sites configured.
} @foreach (var site in _sites) { }
@if (_selectedSiteId == 0) {
Select a site to manage its areas.
} else {
Areas for @(_sites.FirstOrDefault(s => s.Id == _selectedSiteId)?.Name)
@if (_showForm) {
@(_editingArea == null ? "Add New Area" : "Edit Area")
@if (_editingArea == null) {
}
@if (_formError != null) {
@_formError
}
} @area.Name No areas for this site. Add one above. }
}
@code { private List _sites = new(); private List _areas = new(); private int _selectedSiteId; private bool _loading = true; private string? _errorMessage; private bool _showForm; private Area? _editingArea; private string _formName = string.Empty; private int _formParentAreaId; private string? _formError; private ToastNotification _toast = default!; private ConfirmDialog _confirmDialog = default!; protected override async Task OnInitializedAsync() { _loading = true; try { _sites = (await SiteRepository.GetAllSitesAsync()).ToList(); } catch (Exception ex) { _errorMessage = $"Failed to load sites: {ex.Message}"; } _loading = false; } private async Task SelectSite(int siteId) { _selectedSiteId = siteId; _showForm = false; await LoadAreasAsync(); } private async Task LoadAreasAsync() { try { _areas = (await TemplateEngineRepository.GetAreasBySiteIdAsync(_selectedSiteId)).ToList(); } catch (Exception ex) { _errorMessage = $"Failed to load areas: {ex.Message}"; } } private List _rootAreas => _areas.Where(a => a.ParentAreaId == null).OrderBy(a => a.Name).ToList(); private string GetAreaPath(Area area) { var parts = new List(); var current = area; while (current != null) { parts.Insert(0, current.Name); current = current.ParentAreaId.HasValue ? _areas.FirstOrDefault(a => a.Id == current.ParentAreaId.Value) : null; } return string.Join(" / ", parts); } private void ShowAddForm() { _editingArea = null; _formName = string.Empty; _formParentAreaId = 0; _formError = null; _showForm = true; } private void EditArea(Area area) { _editingArea = area; _formName = area.Name; _formError = null; _showForm = true; } private void CancelForm() { _showForm = false; _editingArea = null; _formError = null; } private async Task SaveArea() { _formError = null; if (string.IsNullOrWhiteSpace(_formName)) { _formError = "Name is required."; return; } try { if (_editingArea != null) { _editingArea.Name = _formName.Trim(); await TemplateEngineRepository.UpdateAreaAsync(_editingArea); } else { var area = new Area(_formName.Trim()) { SiteId = _selectedSiteId, ParentAreaId = _formParentAreaId == 0 ? null : _formParentAreaId }; await TemplateEngineRepository.AddAreaAsync(area); } await TemplateEngineRepository.SaveChangesAsync(); _showForm = false; _editingArea = null; _toast.ShowSuccess("Area saved."); await LoadAreasAsync(); } catch (Exception ex) { _formError = $"Save failed: {ex.Message}"; } } private async Task DeleteArea(Area area) { var hasChildren = _areas.Any(a => a.ParentAreaId == area.Id); var message = hasChildren ? $"Area '{area.Name}' has child areas. Delete child areas first." : $"Delete area '{area.Name}'?"; var confirmed = await _confirmDialog.ShowAsync(message, "Delete Area"); if (!confirmed) return; try { await TemplateEngineRepository.DeleteAreaAsync(area.Id); await TemplateEngineRepository.SaveChangesAsync(); _toast.ShowSuccess($"Area '{area.Name}' deleted."); await LoadAreasAsync(); } catch (Exception ex) { _toast.ShowError($"Delete failed: {ex.Message}"); } } }