@page "/calendar/event-occurrences/import/settings" @attribute [Authorize(Roles = AuthRoles.Administrator)] @using Core.Models @using WebApp.Authentication @using WebApp.Components.Shared.Components @using System.Text.Json @using MudBlazor @inject IWebHostEnvironment Environment @inject IConfiguration Configuration @inject NavigationManager NavigationManager @inject ISnackbar Snackbar @rendermode InteractiveServer @if (_config != null) { Location Patterns Add prefix patterns to match location names. Use '*' as a wildcard to match any text after the prefix. Examples: "Room *" matches "Room 101", "Room 202"; "Hall *" matches "Hall A", "Main Hall". @for (int i = 0; i < _config.LocationPatterns.Count; i++) { var index = i; Remove } Add Pattern Pattern Examples Pattern Matches Room * Room 101, Room 202, Room A Hall * Hall A, Hall B, Main Hall Conference Room * Conference Room A, Conference Room 1 Building * Building 1, Building A, Building Main @if (_isSaving) { Saving... } else { Save Configuration } Cancel @if (!string.IsNullOrEmpty(_statusMessage)) { @_statusMessage } } else { } @code { private LocationParsingConfiguration? _config; private bool _isSaving; private string? _statusMessage; private Severity _statusSeverity = Severity.Success; protected override void OnInitialized() { // Load from IConfiguration _config = Configuration.GetSection("LocationParsingSettings").Get() ?? LocationParsingConfiguration.Default; // Create a copy to avoid modifying the original _config = new LocationParsingConfiguration { LocationPatterns = new List(_config.LocationPatterns) }; } private string GetAppSettingsPath() { return Path.Combine( Environment.ContentRootPath, "Data", "appsettings.json"); } private void AddPattern() { if (_config == null) return; _config.LocationPatterns.Add("New Pattern *"); } private void RemovePattern(int index) { if (_config == null || index < 0 || index >= _config.LocationPatterns.Count) return; _config.LocationPatterns.RemoveAt(index); } private async Task SaveConfiguration() { if (_config == null) return; _isSaving = true; _statusMessage = null; try { var appSettingsPath = GetAppSettingsPath(); // Ensure Data directory exists var dataDir = Path.GetDirectoryName(appSettingsPath); if (dataDir != null && !Directory.Exists(dataDir)) { Directory.CreateDirectory(dataDir); } // Read existing appsettings or create new Dictionary settings; if (File.Exists(appSettingsPath)) { var existingJson = await File.ReadAllTextAsync(appSettingsPath); settings = JsonSerializer.Deserialize>(existingJson) ?? new Dictionary(); } else { settings = new Dictionary(); } // Update LocationParsingSettings section settings["LocationParsingSettings"] = _config; // Write back to file var options = new JsonSerializerOptions { WriteIndented = true }; var json = JsonSerializer.Serialize(settings, options); await File.WriteAllTextAsync(appSettingsPath, json); _statusMessage = "Configuration saved successfully! Changes will take effect on next parse operation."; _statusSeverity = Severity.Success; Snackbar.Add("Location parsing settings saved successfully", Severity.Success); } catch (Exception ex) { _statusMessage = $"Error saving configuration: {ex.Message}"; _statusSeverity = Severity.Error; Snackbar.Add($"Error saving settings: {ex.Message}", Severity.Error); } finally { _isSaving = false; } } private void Cancel() { NavigationManager.NavigateTo("/calendar/event-occurrences/import"); } }
Room *
Hall *
Conference Room *
Building *