From ba0b18c61a50b9a8ad7e30720768f7441f8db62b Mon Sep 17 00:00:00 2001 From: Jason Barden Date: Tue, 23 Jun 2026 07:46:29 +0100 Subject: [PATCH] fix(search): clear SelectedTags when AvailableTags is rebuilt When SetActiveAccount was called or OnViewActivatedAsync rebuilt the tag list due to new tags, all CheckBox controls were destroyed and recreated (starting unchecked), but SelectedTags was never cleared. Stale tags survived the rebuild and silently filtered subsequent searches even though no checkbox appeared checked. Fixes #683 Co-Authored-By: Claude Sonnet 4.6 --- .../Search/GivenASyncedFileSearchViewModel.cs | 44 +++++++++++++++++++ .../Search/SyncedFileSearchViewModel.cs | 7 ++- .../appsettings.json | 2 +- 3 files changed, 51 insertions(+), 2 deletions(-) diff --git a/apps/desktop/AStar.Dev.OneDrive.Sync.Client.Tests.Unit/Search/GivenASyncedFileSearchViewModel.cs b/apps/desktop/AStar.Dev.OneDrive.Sync.Client.Tests.Unit/Search/GivenASyncedFileSearchViewModel.cs index ab0c74e9..3774b066 100644 --- a/apps/desktop/AStar.Dev.OneDrive.Sync.Client.Tests.Unit/Search/GivenASyncedFileSearchViewModel.cs +++ b/apps/desktop/AStar.Dev.OneDrive.Sync.Client.Tests.Unit/Search/GivenASyncedFileSearchViewModel.cs @@ -547,4 +547,48 @@ public async Task when_view_is_activated_with_tags_then_show_no_classifications_ sut.ShowNoClassificationsHint.ShouldBeFalse(); } + + [Fact] + public async Task when_account_changes_then_selected_tags_are_cleared() + { + repository.GetDistinctTagNamesAsync(TestAccountId, Arg.Any()).Returns(["Image"]); + var sut = CreateSut(); + await sut.OnViewActivatedAsync(CancellationToken.None); + sut.ToggleTagCommand.Execute("Image"); + + sut.SetActiveAccount(new AccountId("acc-2")); + + sut.SelectedTags.ShouldBeEmpty(); + } + + [Fact] + public async Task when_view_is_activated_again_with_more_tags_then_selected_tags_are_cleared() + { + repository.GetDistinctTagNamesAsync(TestAccountId, Arg.Any()) + .Returns(["Image"], ["Image", "Video"]); + var sut = CreateSut(); + await sut.OnViewActivatedAsync(CancellationToken.None); + sut.ToggleTagCommand.Execute("Image"); + + await sut.OnViewActivatedAsync(CancellationToken.None); + + sut.SelectedTags.ShouldBeEmpty(); + } + + [Fact] + public async Task when_view_is_activated_again_with_more_tags_then_search_does_not_apply_stale_selected_tags() + { + SyncedItemSearchCriteria? captured = null; + repository.SearchAsync(Arg.Do(c => captured = c), Arg.Any()).Returns([]); + repository.GetDistinctTagNamesAsync(TestAccountId, Arg.Any()) + .Returns(["Image"], ["Image", "Video"]); + var sut = CreateSut(); + await sut.OnViewActivatedAsync(CancellationToken.None); + sut.ToggleTagCommand.Execute("Image"); + await sut.OnViewActivatedAsync(CancellationToken.None); + + await sut.SearchCommand.ExecuteAsync(null); + + captured!.Tags.ShouldBeEmpty(); + } } diff --git a/apps/desktop/AStar.Dev.OneDrive.Sync.Client/Search/SyncedFileSearchViewModel.cs b/apps/desktop/AStar.Dev.OneDrive.Sync.Client/Search/SyncedFileSearchViewModel.cs index edb68dbe..2d79fd42 100644 --- a/apps/desktop/AStar.Dev.OneDrive.Sync.Client/Search/SyncedFileSearchViewModel.cs +++ b/apps/desktop/AStar.Dev.OneDrive.Sync.Client/Search/SyncedFileSearchViewModel.cs @@ -121,7 +121,11 @@ public void SetActiveAccount(AccountId accountId) { activeAccountId = accountId; cachedTagCount = 0; - dispatcher.Post(AvailableTags.Clear); + dispatcher.Post(() => + { + AvailableTags.Clear(); + SelectedTags.Clear(); + }); } /// @@ -152,6 +156,7 @@ public async Task OnViewActivatedAsync(CancellationToken ct) dispatcher.Post(() => { AvailableTags.Clear(); + SelectedTags.Clear(); foreach (string tag in tags) AvailableTags.Add(tag); IsLoadingTags = false; diff --git a/apps/desktop/AStar.Dev.OneDrive.Sync.Client/appsettings.json b/apps/desktop/AStar.Dev.OneDrive.Sync.Client/appsettings.json index 26ea5f5c..683ae90a 100644 --- a/apps/desktop/AStar.Dev.OneDrive.Sync.Client/appsettings.json +++ b/apps/desktop/AStar.Dev.OneDrive.Sync.Client/appsettings.json @@ -7,7 +7,7 @@ "AuthorityForMicrosoftAccountsOnly": "https://login.microsoftonline.com/consumers" }, "AStarDevOneDriveClient": { - "ApplicationVersion": "0.29.0", + "ApplicationVersion": "0.29.1", "ApplicationName": "AStar Dev OneDrive Sync Client", "CacheTag": 1, "UserPreferencesPath": "astar-dev/astar-dev-onedrive-client",