@page "/admin/sites/create" @page "/admin/sites/{Id:int}/edit" @using ZB.MOM.WW.ScadaBridge.Security @using ZB.MOM.WW.ScadaBridge.Commons.Entities.Sites @using ZB.MOM.WW.ScadaBridge.Commons.Interfaces.Repositories @using ZB.MOM.WW.ScadaBridge.Communication @attribute [Authorize(Policy = AuthorizationPolicies.RequireAdmin)] @inject ISiteRepository SiteRepository @inject CommunicationService CommunicationService @inject NavigationManager NavigationManager
@(IsEditMode ? "Edit Site" : "Add Site")
@* Bundle D (#23 M7-T12) drill-in: deep-link into the central Audit Log pre-filtered to this site's events. AuditEvent.SourceSiteId stores the SiteIdentifier (string), so we pass that through. *@ @if (IsEditMode && !string.IsNullOrWhiteSpace(_formIdentifier)) { Recent audit activity }
Node A
Node B
@if (_formError != null) {
@_formError
}
@code { [Parameter] public int? Id { get; set; } private bool IsEditMode => Id.HasValue; private Site? _editingSite; private string _formName = string.Empty; private string _formIdentifier = string.Empty; private string? _formDescription; private string? _formNodeAAddress; private string? _formNodeBAddress; private string? _formGrpcNodeAAddress; private string? _formGrpcNodeBAddress; private string? _formError; private ToastNotification _toast = default!; protected override async Task OnInitializedAsync() { if (Id.HasValue) { _editingSite = await SiteRepository.GetSiteByIdAsync(Id.Value); if (_editingSite != null) { _formName = _editingSite.Name; _formIdentifier = _editingSite.SiteIdentifier; _formDescription = _editingSite.Description; _formNodeAAddress = _editingSite.NodeAAddress; _formNodeBAddress = _editingSite.NodeBAddress; _formGrpcNodeAAddress = _editingSite.GrpcNodeAAddress; _formGrpcNodeBAddress = _editingSite.GrpcNodeBAddress; } } } private void GoBack() { NavigationManager.NavigateTo("/admin/sites"); } private async Task SaveSite() { _formError = null; if (string.IsNullOrWhiteSpace(_formName)) { _formError = "Name is required."; return; } try { if (_editingSite != null) { _editingSite.Name = _formName.Trim(); _editingSite.Description = _formDescription?.Trim(); _editingSite.NodeAAddress = _formNodeAAddress?.Trim(); _editingSite.NodeBAddress = _formNodeBAddress?.Trim(); _editingSite.GrpcNodeAAddress = _formGrpcNodeAAddress?.Trim(); _editingSite.GrpcNodeBAddress = _formGrpcNodeBAddress?.Trim(); await SiteRepository.UpdateSiteAsync(_editingSite); } else { if (string.IsNullOrWhiteSpace(_formIdentifier)) { _formError = "Identifier is required."; return; } var site = new Site(_formName.Trim(), _formIdentifier.Trim()) { Description = _formDescription?.Trim(), NodeAAddress = _formNodeAAddress?.Trim(), NodeBAddress = _formNodeBAddress?.Trim(), GrpcNodeAAddress = _formGrpcNodeAAddress?.Trim(), GrpcNodeBAddress = _formGrpcNodeBAddress?.Trim() }; await SiteRepository.AddSiteAsync(site); } await SiteRepository.SaveChangesAsync(); CommunicationService.RefreshSiteAddresses(); NavigationManager.NavigateTo("/admin/sites"); } catch (Exception ex) { _formError = $"Save failed: {ex.Message}"; } } }