feat(anomalies): filter the feed by detector kind

Adds a detector-kind chip row to the anomaly feed (SuspensionFlip / SteamMove /
SuspensionFreeze / OverroundCompression), multi-select like the sport filter — so
with four detectors live you can slice the feed to a single signal type. The kind
set lives on AnomalyFilter and filters in-memory alongside severity/sport, persisted
via AnomalyBrowsingState like the other filters.

- AnomalyFilter.Kinds + AnomalyBrowsingService in-memory Where clause; feed chip
  row + ToggleKind/KindLabel; en/ru resx (Anomaly.Filter.Kind).
- 2 tests: kind-filtered subset + no-filter returns all kinds.
This commit is contained in:
2026-05-29 11:38:06 +03:00
parent 6e12dd73c3
commit 34cc72fd2d
6 changed files with 122 additions and 1 deletions
@@ -24,7 +24,8 @@ public sealed record AnomalyFilter(
AnomalySeverity? MinSeverity = null,
IReadOnlyCollection<int>? SportCodes = null,
DateTimeOffset? From = null,
DateTimeOffset? To = null);
DateTimeOffset? To = null,
IReadOnlyCollection<AnomalyKind>? Kinds = null);
/// <summary>
/// Compact anomaly row used by the feed page. Designed to render without any