From aefdb12561929a9bcc94a7392dd8e0196b541a76 Mon Sep 17 00:00:00 2001 From: Javier Cicchelli Date: Thu, 12 Feb 2026 03:02:28 +0100 Subject: [PATCH] Updated the TaskGroupListView view in the app target to use a list component with single selection instead. --- App/Sources/Views/TaskGroupListView.swift | 66 +++++++++++++++++------ 1 file changed, 49 insertions(+), 17 deletions(-) diff --git a/App/Sources/Views/TaskGroupListView.swift b/App/Sources/Views/TaskGroupListView.swift index da3a86d..f2dd2e7 100644 --- a/App/Sources/Views/TaskGroupListView.swift +++ b/App/Sources/Views/TaskGroupListView.swift @@ -12,12 +12,18 @@ struct TaskGroupListView: View { // MARK: Properties + /// Binding to the currently selected todo task group. + /// + /// When provided, the view will use this binding for navigation split view selection. + @Binding + private var group: TodoGroup? + /// Query to monitor all todo tasks for changes. /// /// This query triggers view updates whenever todo tasks are inserted, updated, or deleted, /// ensuring the task counts displayed in the view remain accurate. @Query - private var tasks: [Todo] + private var todos: [Todo] /// The view model managing the state and logic for this view. /// @@ -26,6 +32,18 @@ struct TaskGroupListView: View { @State private var viewModel = ViewModel() + // MARK: Initializers + + /// Creates a task group list view with a binding to the selected group. + /// + /// This initializer configures the view for use in a navigation split view, + /// where the binding tracks which task group is currently selected in the sidebar. + /// + /// - Parameter group: A binding to the currently selected task group. + init(_ group: Binding) { + self._group = group + } + // MARK: Body /// The content and behavior of the view. @@ -35,24 +53,30 @@ struct TaskGroupListView: View { /// - The group's title /// - The current count of tasks in that group /// - /// Cards are tappable and navigate to a detailed task list for the selected group. + /// Cards are tappable and update the selected group binding for navigation split view. /// Task counts are fetched on-demand from the model context for each render. var body: some View { - ScrollView { - VStack(spacing: 16) { - ForEach(viewModel.groups) { group in - NavigationLink(destination: TaskListView(group: group)) { - Card( - group: group, - count: viewModel.count(tasks, for: group) - ) - } - .buttonStyle(.plain) - } - } - .padding(.horizontal) + List( + viewModel.groups, + selection: $group + ) { group in + Card( + group: group, + count: viewModel.count( + todos, + for: group + ) + ) + .listRowBackground(Color.clear) + .listRowSeparator(.hidden) + .tag(group) } + .listStyle(.plain) .navigationTitle("view.task-group-list.navigation.title") + .sensoryFeedback( + .selection, + trigger: group + ) } } @@ -62,8 +86,12 @@ struct TaskGroupListView: View { "Task group list with empty tasks", traits: .emptyContainer ) { + @Previewable + @State + var group: TodoGroup? + NavigationStack { - TaskGroupListView() + TaskGroupListView($group) } } @@ -71,7 +99,11 @@ struct TaskGroupListView: View { "Task group list with sample tasks", traits: .sampleTasks ) { + @Previewable + @State + var group: TodoGroup? + NavigationStack { - TaskGroupListView() + TaskGroupListView($group) } }