@page "/clusters/{ClusterId}/uns/areas/new" @page "/clusters/{ClusterId}/uns/areas/{UnsAreaId}" @attribute [Microsoft.AspNetCore.Authorization.Authorize] @rendermode RenderMode.InteractiveServer @using Microsoft.AspNetCore.Components.Forms @using Microsoft.EntityFrameworkCore @using System.ComponentModel.DataAnnotations @using ZB.MOM.WW.OtOpcUa.Configuration @using ZB.MOM.WW.OtOpcUa.Configuration.Entities @inject IDbContextFactory DbFactory @inject NavigationManager Nav

@(IsNew ? "New UNS area" : "Edit UNS area") · @ClusterId

Cancel
@if (!_loaded) {

Loading…

} else if (!IsNew && _existing is null) {
Area @UnsAreaId was not found.
} else {
UNS area (level 3)
@if (!string.IsNullOrWhiteSpace(_error)) {
@_error
}
Cancel @if (!IsNew) { }
} @code { [Parameter] public string ClusterId { get; set; } = ""; [Parameter] public string? UnsAreaId { get; set; } private bool IsNew => string.IsNullOrEmpty(UnsAreaId); private FormModel _form = new(); private UnsArea? _existing; private bool _loaded; private bool _busy; private string? _error; protected override async Task OnInitializedAsync() { if (!IsNew) { await using var db = await DbFactory.CreateDbContextAsync(); _existing = await db.UnsAreas.AsNoTracking() .FirstOrDefaultAsync(a => a.ClusterId == ClusterId && a.UnsAreaId == UnsAreaId); if (_existing is not null) { _form = new FormModel { UnsAreaId = _existing.UnsAreaId, Name = _existing.Name, Notes = _existing.Notes, RowVersion = _existing.RowVersion, }; } } _loaded = true; } private async Task SubmitAsync() { _busy = true; _error = null; try { await using var db = await DbFactory.CreateDbContextAsync(); if (IsNew) { if (await db.UnsAreas.AnyAsync(a => a.UnsAreaId == _form.UnsAreaId)) { _error = $"Area '{_form.UnsAreaId}' already exists."; return; } db.UnsAreas.Add(new UnsArea { UnsAreaId = _form.UnsAreaId, ClusterId = ClusterId, Name = _form.Name, Notes = string.IsNullOrWhiteSpace(_form.Notes) ? null : _form.Notes, }); } else { var entity = await db.UnsAreas.FirstOrDefaultAsync( a => a.ClusterId == ClusterId && a.UnsAreaId == UnsAreaId); if (entity is null) { _error = "Row no longer exists."; return; } db.Entry(entity).Property(e => e.RowVersion).OriginalValue = _form.RowVersion; entity.Name = _form.Name; entity.Notes = string.IsNullOrWhiteSpace(_form.Notes) ? null : _form.Notes; } await db.SaveChangesAsync(); Nav.NavigateTo($"/clusters/{ClusterId}/uns"); } catch (DbUpdateConcurrencyException) { _error = "Another user changed this area while you were editing. Reload to see the latest values."; } catch (Exception ex) { _error = ex.Message; } finally { _busy = false; } } private async Task DeleteAsync() { if (IsNew) return; _busy = true; _error = null; try { await using var db = await DbFactory.CreateDbContextAsync(); var entity = await db.UnsAreas.FirstOrDefaultAsync( a => a.ClusterId == ClusterId && a.UnsAreaId == UnsAreaId); if (entity is null) { Nav.NavigateTo($"/clusters/{ClusterId}/uns"); return; } db.Entry(entity).Property(e => e.RowVersion).OriginalValue = _form.RowVersion; db.UnsAreas.Remove(entity); await db.SaveChangesAsync(); Nav.NavigateTo($"/clusters/{ClusterId}/uns"); } catch (DbUpdateConcurrencyException) { _error = "Another user changed this area while you were viewing it."; } catch (Exception ex) { _error = $"Delete failed: {ex.Message}. Likely because lines still reference this area — remove them first."; } finally { _busy = false; } } private sealed class FormModel { [Required, RegularExpression("^[A-Za-z0-9_-]+$")] public string UnsAreaId { get; set; } = ""; [Required] public string Name { get; set; } = ""; public string? Notes { get; set; } public byte[] RowVersion { get; set; } = []; } }