diff --git a/MyPass/ContentView.swift b/MyPass/ContentView.swift index 8ee1416..9334184 100644 --- a/MyPass/ContentView.swift +++ b/MyPass/ContentView.swift @@ -74,5 +74,8 @@ private struct VaultRootView: View { .onChange(of: filterVM.selectedGroupIds) { _, newValue in vaultVM.selectedGroupIds = newValue } + .onChange(of: filterVM.lastToggledGroupId) { _, newValue in + vaultVM.lastToggledGroupId = newValue + } } } diff --git a/MyPass/ViewModels/GroupFilterViewModel.swift b/MyPass/ViewModels/GroupFilterViewModel.swift index 5271c09..fb5629a 100644 --- a/MyPass/ViewModels/GroupFilterViewModel.swift +++ b/MyPass/ViewModels/GroupFilterViewModel.swift @@ -5,6 +5,10 @@ import MyPassCore @MainActor final class GroupFilterViewModel: ObservableObject { @Published var selectedGroupIds: Set = [] + /// The group id passed to the most recent `toggle(_:)` call that resulted in a non-empty + /// selection, used as a "best effort" default group for new entries. Cleared to `nil` + /// whenever a toggle empties the selection, or by `clear()`. + @Published private(set) var lastToggledGroupId: UUID? private let session: VaultSession @@ -19,9 +23,11 @@ final class GroupFilterViewModel: ObservableObject { func toggle(_ group: MyPassCore.Group) { guard let root = session.database?.root else { return } selectedGroupIds = GroupSelection.toggling(group.id, in: root, current: selectedGroupIds) + lastToggledGroupId = selectedGroupIds.isEmpty ? nil : group.id } func clear() { selectedGroupIds = [] + lastToggledGroupId = nil } } diff --git a/MyPass/ViewModels/VaultViewModel.swift b/MyPass/ViewModels/VaultViewModel.swift index dc6f636..90f12cf 100644 --- a/MyPass/ViewModels/VaultViewModel.swift +++ b/MyPass/ViewModels/VaultViewModel.swift @@ -7,6 +7,7 @@ import MyPassCore final class VaultViewModel: ObservableObject { @Published var searchQuery: String = "" @Published var selectedGroupIds: Set = [] + @Published var lastToggledGroupId: UUID? @Published var errorMessage: String? let session: VaultSession diff --git a/MyPass/Views/EntryListView.swift b/MyPass/Views/EntryListView.swift index eeba487..7e8f8f2 100644 --- a/MyPass/Views/EntryListView.swift +++ b/MyPass/Views/EntryListView.swift @@ -28,7 +28,10 @@ struct EntryListView: View { .searchable(text: $vm.searchQuery, isPresented: $isSearching, prompt: "Search entries…") .toolbar { ToolbarItem(placement: .primaryAction) { - Button { isSearching.toggle() } label: { + Button { + if isSearching { vm.searchQuery = "" } + isSearching.toggle() + } label: { Image(systemName: "magnifyingglass") } } @@ -51,12 +54,10 @@ struct EntryListView: View { } } - /// The sole selected filter group if exactly one is active, otherwise the vault root. + /// The most recently toggled-on filter group, if any filter is still active via it, + /// otherwise the vault root. private var defaultGroupId: UUID { - if vm.selectedGroupIds.count == 1, let only = vm.selectedGroupIds.first { - return only - } - return vm.session.database?.root.id ?? UUID() + vm.lastToggledGroupId ?? vm.session.database?.root.id ?? UUID() } }