diff --git a/apps/desktop/AStar.Dev.OneDrive.Sync.Client.Tests.Unit/Assets/GivenTheSearchLocalisationKeys.cs b/apps/desktop/AStar.Dev.OneDrive.Sync.Client.Tests.Unit/Assets/GivenTheSearchLocalisationKeys.cs index d2e1f9c7..b88951c5 100644 --- a/apps/desktop/AStar.Dev.OneDrive.Sync.Client.Tests.Unit/Assets/GivenTheSearchLocalisationKeys.cs +++ b/apps/desktop/AStar.Dev.OneDrive.Sync.Client.Tests.Unit/Assets/GivenTheSearchLocalisationKeys.cs @@ -58,4 +58,8 @@ public void when_read_then_search_no_results_key_exists() => [Fact] public void when_read_then_search_result_delete_button_key_exists() => RootElement().TryGetProperty("Search.Result.Delete.Button", out _).ShouldBeTrue(); + + [Fact] + public void when_read_then_search_tags_loading_key_exists() => + RootElement().TryGetProperty("Search.Tags.Loading", out _).ShouldBeTrue(); } 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 7c01bf7d..ab0c74e9 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 @@ -502,4 +502,49 @@ public void when_instantiated_then_capped_notice_text_delegates_to_localisation_ sut.CappedNoticeText.ShouldBe("Showing top 500 results. Refine your search to see more."); } + + [Fact] + public void when_instantiated_then_tags_loading_text_delegates_to_localisation_service() + { + loc.GetLocal("Search.Tags.Loading").Returns("Loading categories..."); + var sut = CreateSut(); + + sut.TagsLoadingText.ShouldBe("Loading categories..."); + } + + [Fact] + public async Task when_view_is_activated_then_is_loading_tags_is_false_after_load() + { + repository.GetDistinctTagNamesAsync(TestAccountId, Arg.Any()).Returns([]); + var sut = new SyncedFileSearchViewModel(repository, fileOpenerService, fileTypeClassifier, accountRepository, dispatcher, loc); + sut.SetActiveAccount(TestAccountId); + + await sut.OnViewActivatedAsync(CancellationToken.None); + + sut.IsLoadingTags.ShouldBeFalse(); + } + + [Fact] + public async Task when_view_is_activated_with_no_tags_then_show_no_classifications_hint_is_true() + { + repository.GetDistinctTagNamesAsync(TestAccountId, Arg.Any()).Returns([]); + var sut = new SyncedFileSearchViewModel(repository, fileOpenerService, fileTypeClassifier, accountRepository, dispatcher, loc); + sut.SetActiveAccount(TestAccountId); + + await sut.OnViewActivatedAsync(CancellationToken.None); + + sut.ShowNoClassificationsHint.ShouldBeTrue(); + } + + [Fact] + public async Task when_view_is_activated_with_tags_then_show_no_classifications_hint_is_false() + { + repository.GetDistinctTagNamesAsync(TestAccountId, Arg.Any()).Returns(["Image", "Video"]); + var sut = new SyncedFileSearchViewModel(repository, fileOpenerService, fileTypeClassifier, accountRepository, dispatcher, loc); + sut.SetActiveAccount(TestAccountId); + + await sut.OnViewActivatedAsync(CancellationToken.None); + + sut.ShowNoClassificationsHint.ShouldBeFalse(); + } } diff --git a/apps/desktop/AStar.Dev.OneDrive.Sync.Client/Assets/Localization/en-GB.json b/apps/desktop/AStar.Dev.OneDrive.Sync.Client/Assets/Localization/en-GB.json index 7278b0a0..96465447 100644 --- a/apps/desktop/AStar.Dev.OneDrive.Sync.Client/Assets/Localization/en-GB.json +++ b/apps/desktop/AStar.Dev.OneDrive.Sync.Client/Assets/Localization/en-GB.json @@ -211,6 +211,7 @@ "Search.MinSize.Label": "Min size (bytes)", "Search.MaxSize.Label": "Max size (bytes)", "Search.Tags.Label": "Tags", + "Search.Tags.Loading": "Loading categories...", "Search.Tags.NoClassifications": "No classifications found.", "Search.DuplicatesOnly.Label": "Duplicates only", "Search.Button": "Search", diff --git a/apps/desktop/AStar.Dev.OneDrive.Sync.Client/Assets/Localization/en-US.json b/apps/desktop/AStar.Dev.OneDrive.Sync.Client/Assets/Localization/en-US.json index e37aee61..ded0c957 100644 --- a/apps/desktop/AStar.Dev.OneDrive.Sync.Client/Assets/Localization/en-US.json +++ b/apps/desktop/AStar.Dev.OneDrive.Sync.Client/Assets/Localization/en-US.json @@ -211,6 +211,7 @@ "Search.MinSize.Label": "US-Min size (bytes)", "Search.MaxSize.Label": "US-Max size (bytes)", "Search.Tags.Label": "US-Tags", + "Search.Tags.Loading": "US-Loading categories...", "Search.Tags.NoClassifications": "US-No classifications found.", "Search.DuplicatesOnly.Label": "US-Duplicates only", "Search.Button": "US-Search", diff --git a/apps/desktop/AStar.Dev.OneDrive.Sync.Client/Search/SyncedFileSearchView.axaml b/apps/desktop/AStar.Dev.OneDrive.Sync.Client/Search/SyncedFileSearchView.axaml index 334a2f79..f2338539 100644 --- a/apps/desktop/AStar.Dev.OneDrive.Sync.Client/Search/SyncedFileSearchView.axaml +++ b/apps/desktop/AStar.Dev.OneDrive.Sync.Client/Search/SyncedFileSearchView.axaml @@ -58,11 +58,16 @@ + + IsVisible="{Binding ShowNoClassificationsHint}"/> Results { get; } = []; public ObservableCollection SelectedTags { get; } = []; public ObservableCollection AvailableTags { get; } = []; @@ -76,6 +82,9 @@ public sealed partial class SyncedFileSearchViewModel(ISyncedItemRepository repo /// Localised "Tags" label. public string TagsLabelText => loc.GetLocal("Search.Tags.Label"); + /// Localised message shown while categories are being loaded. + public string TagsLoadingText => loc.GetLocal("Search.Tags.Loading"); + /// Localised message shown when no classifications exist for the active account. public string TagsNoClassificationsText => loc.GetLocal("Search.Tags.NoClassifications"); @@ -125,10 +134,18 @@ public async Task OnViewActivatedAsync(CancellationToken ct) if (activeAccountId is null) return; + IsLoadingTags = true; + ShowNoClassificationsHint = false; + var tags = await repository.GetDistinctTagNamesAsync(activeAccountId.Value, ct).ConfigureAwait(false); if (tags.Count <= cachedTagCount) + { + IsLoadingTags = false; + ShowNoClassificationsHint = AvailableTags.Count == 0; + return; + } cachedTagCount = tags.Count; @@ -137,6 +154,8 @@ public async Task OnViewActivatedAsync(CancellationToken ct) AvailableTags.Clear(); foreach (string tag in tags) AvailableTags.Add(tag); + IsLoadingTags = false; + ShowNoClassificationsHint = tags.Count == 0; }); } diff --git a/apps/desktop/AStar.Dev.OneDrive.Sync.Client/appsettings.json b/apps/desktop/AStar.Dev.OneDrive.Sync.Client/appsettings.json index 5d8843b1..26ea5f5c 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.28.0", + "ApplicationVersion": "0.29.0", "ApplicationName": "AStar Dev OneDrive Sync Client", "CacheTag": 1, "UserPreferencesPath": "astar-dev/astar-dev-onedrive-client",