namespace DnsmasqWebUI.Models.Client; /// /// Which subset of client settings to show in the settings modal. /// public enum SettingsModalContext { /// Show all settings with optional search. All, /// Show only service status polling interval. ServicePolling, /// Show only recent logs polling interval. LogsPolling, /// Show only DHCP leases refresh interval. LeasesPolling } /// /// Central definition of settings modal sections: keys, display names, field labels, and searchable text. /// public static class SettingsModalSections { public const string ServiceStatus = "ServiceStatus"; public const string Logs = "Logs"; public const string Leases = "Leases"; /// Section metadata: display name (header), field label (for input), and searchable text for filtering. public sealed record SectionMeta(string DisplayName, string FieldLabel, string SearchableText); public static readonly IReadOnlyDictionary All = new Dictionary(StringComparer.OrdinalIgnoreCase) { [ServiceStatus] = new("Service status", "Polling interval (seconds)", "service status polling interval seconds"), [Logs] = new("Recent logs", "Polling interval (seconds)", "recent logs polling interval seconds"), [Leases] = new("DHCP leases", "Refresh interval (seconds)", "dhcp leases refresh interval seconds"), }; /// Maps a focused context (single-section view) to its section key. Returns null for All. public static string? GetSectionKeyForContext(SettingsModalContext context) => context switch { SettingsModalContext.ServicePolling => ServiceStatus, SettingsModalContext.LogsPolling => Logs, SettingsModalContext.LeasesPolling => Leases, _ => null }; public static bool MatchesSearch(string key, string searchTerm) { if (string.IsNullOrWhiteSpace(searchTerm)) return true; if (!All.TryGetValue(key, out var meta)) return false; return meta.SearchableText.Contains(searchTerm.Trim(), StringComparison.OrdinalIgnoreCase); } }