feat(ui): add A1 dashboard and resumable onboarding

This commit is contained in:
cesnimda
2026-11-03 09:45:57 +01:00
parent 5e8a07d13e
commit c7d26d354c
61 changed files with 1522 additions and 23 deletions
@@ -28,6 +28,18 @@ public sealed class DashboardPreferencesTests
private const string Route = "/api/auth/preferences/dashboard";
private const string Layout = "{\"version\":1,\"revision\":0,\"widgets\":[{\"id\":\"cards\",\"visible\":true,\"size\":\"full\"}]}";
[Fact]
public void Agenda_widget_uses_existing_schema_two_without_weakening_unknown_id_or_overlap_checks()
{
const string json = "{\"version\":2,\"revision\":0,\"widgets\":[{\"id\":\"agenda\",\"visible\":true,\"size\":\"standard\",\"x\":0,\"y\":0,\"w\":8,\"h\":8},{\"id\":\"funnel\",\"visible\":true,\"size\":\"standard\",\"x\":8,\"y\":0,\"w\":4,\"h\":8}]}";
using var valid = JsonDocument.Parse(json);
Assert.NotNull(DashboardLayout.Parse(valid.RootElement));
using var unknown = JsonDocument.Parse(json.Replace("agenda", "unrecognised"));
Assert.Null(DashboardLayout.Parse(unknown.RootElement));
using var overlap = JsonDocument.Parse(json.Replace("\"x\":8", "\"x\":4"));
Assert.Null(DashboardLayout.Parse(overlap.RootElement));
}
[Fact]
public async Task Geometry_roundtrip_preserves_hidden_positions_and_blocks_legacy_downgrade()
{