@page "/admin/data-connections" @using ScadaLink.Security @using ScadaLink.Commons.Entities.Sites @using ScadaLink.Commons.Interfaces.Repositories @attribute [Authorize(Policy = AuthorizationPolicies.RequireAdmin)] @inject ISiteRepository SiteRepository

Data Connections

@if (_loading) { } else if (_errorMessage != null) {
@_errorMessage
} else { @if (_showForm) {
@(_editingConnection == null ? "Add New Connection" : "Edit Connection")
@if (_formError != null) {
@_formError
}
} @* Assignment form *@ @if (_showAssignForm) {
Assign Connection to Site
@if (_assignError != null) {
@_assignError
}
}
@if (_connections.Count == 0) { } @foreach (var conn in _connections) { }
ID Name Protocol Configuration Assigned Sites Actions
No data connections configured.
@conn.Id @conn.Name @conn.Protocol @(conn.Configuration ?? "—") @{ var assignedSites = _connectionSites.GetValueOrDefault(conn.Id); } @if (assignedSites != null && assignedSites.Count > 0) { @foreach (var assignment in assignedSites) { var siteName = _sites.FirstOrDefault(s => s.Id == assignment.SiteId)?.Name ?? $"Site {assignment.SiteId}"; @siteName } } else { None }
}
@code { private List _connections = new(); private List _sites = new(); private Dictionary> _connectionSites = new(); private bool _loading = true; private string? _errorMessage; private bool _showForm; private DataConnection? _editingConnection; private string _formName = string.Empty; private string _formProtocol = string.Empty; private string? _formConfiguration; private string? _formError; private bool _showAssignForm; private int _assignConnectionId; private int _assignSiteId; private string? _assignError; private ToastNotification _toast = default!; private ConfirmDialog _confirmDialog = default!; protected override async Task OnInitializedAsync() { await LoadDataAsync(); } private async Task LoadDataAsync() { _loading = true; _errorMessage = null; try { _sites = (await SiteRepository.GetAllSitesAsync()).ToList(); _connections = (await SiteRepository.GetAllDataConnectionsAsync()).ToList(); // Load site assignments for each connection _connectionSites.Clear(); foreach (var site in _sites) { var siteConns = await SiteRepository.GetDataConnectionsBySiteIdAsync(site.Id); foreach (var conn in siteConns) { if (!_connectionSites.ContainsKey(conn.Id)) _connectionSites[conn.Id] = new List(); var assignment = await SiteRepository.GetSiteDataConnectionAssignmentAsync(site.Id, conn.Id); if (assignment != null) _connectionSites[conn.Id].Add(assignment); } } } catch (Exception ex) { _errorMessage = $"Failed to load data: {ex.Message}"; } _loading = false; } private void ShowAddForm() { _editingConnection = null; _formName = string.Empty; _formProtocol = string.Empty; _formConfiguration = null; _formError = null; _showForm = true; } private void EditConnection(DataConnection conn) { _editingConnection = conn; _formName = conn.Name; _formProtocol = conn.Protocol; _formConfiguration = conn.Configuration; _formError = null; _showForm = true; } private void CancelForm() { _showForm = false; _editingConnection = null; _formError = null; } private async Task SaveConnection() { _formError = null; if (string.IsNullOrWhiteSpace(_formName)) { _formError = "Name is required."; return; } if (string.IsNullOrWhiteSpace(_formProtocol)) { _formError = "Protocol is required."; return; } try { if (_editingConnection != null) { _editingConnection.Name = _formName.Trim(); _editingConnection.Protocol = _formProtocol; _editingConnection.Configuration = _formConfiguration?.Trim(); await SiteRepository.UpdateDataConnectionAsync(_editingConnection); } else { var conn = new DataConnection(_formName.Trim(), _formProtocol) { Configuration = _formConfiguration?.Trim() }; await SiteRepository.AddDataConnectionAsync(conn); } await SiteRepository.SaveChangesAsync(); _showForm = false; _toast.ShowSuccess("Connection saved."); await LoadDataAsync(); } catch (Exception ex) { _formError = $"Save failed: {ex.Message}"; } } private async Task DeleteConnection(DataConnection conn) { var confirmed = await _confirmDialog.ShowAsync( $"Delete data connection '{conn.Name}'?", "Delete Connection"); if (!confirmed) return; try { await SiteRepository.DeleteDataConnectionAsync(conn.Id); await SiteRepository.SaveChangesAsync(); _toast.ShowSuccess($"Connection '{conn.Name}' deleted."); await LoadDataAsync(); } catch (Exception ex) { _toast.ShowError($"Delete failed: {ex.Message}"); } } private void ShowAssignForm() { _assignConnectionId = 0; _assignSiteId = 0; _assignError = null; _showAssignForm = true; } private void CancelAssignForm() { _showAssignForm = false; _assignError = null; } private async Task SaveAssignment() { _assignError = null; if (_assignConnectionId == 0) { _assignError = "Select a connection."; return; } if (_assignSiteId == 0) { _assignError = "Select a site."; return; } try { var assignment = new SiteDataConnectionAssignment { SiteId = _assignSiteId, DataConnectionId = _assignConnectionId }; await SiteRepository.AddSiteDataConnectionAssignmentAsync(assignment); await SiteRepository.SaveChangesAsync(); _showAssignForm = false; _toast.ShowSuccess("Connection assigned to site."); await LoadDataAsync(); } catch (Exception ex) { _assignError = $"Assignment failed: {ex.Message}"; } } private async Task RemoveAssignment(SiteDataConnectionAssignment assignment) { try { await SiteRepository.DeleteSiteDataConnectionAssignmentAsync(assignment.Id); await SiteRepository.SaveChangesAsync(); _toast.ShowSuccess("Assignment removed."); await LoadDataAsync(); } catch (Exception ex) { _toast.ShowError($"Remove failed: {ex.Message}"); } } }