Refactor client settings fields, fix logs overwrite, improve settings modal

- Replace FieldBounds with generic ClientSettingsField<T> abstraction
- Add IClientSettingsField, ClientSettingsMinMaxField, ClientSettingsBoolField
- Put abstractions in Models/Client/Abstractions namespace
- Fields hold values; CoerceValue for clamping on set
- ClientSettingsService hydrates fields on load; ToDto for save
- Settings modal binds directly to field values, collapsible only for All context
- Add LogsPreView with ShouldRender freeze to prevent Blazor overwriting JS-owned logs DOM
- Add left margin to static group heading in single-section mode
This commit is contained in:
2026-02-11 08:28:44 +10:00
parent 5ac2006b80
commit cefc488712
18 changed files with 258 additions and 129 deletions
@@ -47,14 +47,23 @@ public sealed class ClientSettingsService : IClientSettingsService, IAsyncDispos
var module = await GetModuleAsync();
if (module == null) return new ClientSettings();
var json = await module.InvokeAsync<string?>("getItem");
if (string.IsNullOrWhiteSpace(json)) return new ClientSettings();
if (string.IsNullOrWhiteSpace(json))
{
var defaults = new ClientSettings();
ClientSettingsFields.HydrateFrom(defaults);
return defaults;
}
try
{
return JsonSerializer.Deserialize<ClientSettings>(json, JsonOptions) ?? new ClientSettings();
var settings = JsonSerializer.Deserialize<ClientSettings>(json, JsonOptions) ?? new ClientSettings();
ClientSettingsFields.HydrateFrom(settings);
return settings;
}
catch
{
return new ClientSettings();
var defaults = new ClientSettings();
ClientSettingsFields.HydrateFrom(defaults);
return defaults;
}
}