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);
}
}