import SwiftData import SwiftUI /// A view that displays filtered todo tasks for a specific task group. /// /// This view provides the presentation layer for displaying and managing tasks within a specific group category. /// It follows the MVVM pattern, delegating business logic to a view model and data fetching to a separate content view. struct TaskListView: View { // MARK: Properties /// The view model managing the state and business logic for this view. /// /// This view model holds the group configuration and completion filter state. @State private var viewModel: ViewModel // MARK: Initialization /// Creates a new task list view for a specific group. /// /// - Parameter group: The todo group category to display tasks for. init(group: TodoGroup) { _viewModel = .init(initialValue: ViewModel(group: group)) } // MARK: Body /// The content and behavior of the view. /// /// Displays the task list content with navigation title and toolbar controls. /// The toolbar includes a completion filter toggle for groups that support it. var body: some View { Content( group: viewModel.group, showCompleted: viewModel.showCompleted ) .navigationTitle(viewModel.navigationTitle) .toolbar { if viewModel.canShowCompleted { Menu { Button.init( viewModel.buttonCompleted.title, systemImage: viewModel.buttonCompleted.icon ) { viewModel.toggleCompletedVisibility() } } label: { Label( "view.task-list.label.actions", systemImage: "ellipsis" ) } } } } } // MARK: - Previews #Preview( "Task list with empty tasks", traits: .emptyContainer ) { NavigationStack { TaskListView(group: .today) } } #Preview( "Task list - today", traits: .sampleTasks ) { NavigationStack { TaskListView(group: .today) } } #Preview( "Task list - upcoming", traits: .sampleTasks ) { NavigationStack { TaskListView(group: .upcoming) } } #Preview( "Task list - overdue", traits: .sampleTasks ) { NavigationStack { TaskListView(group: .overdue) } } #Preview( "Task list - completed", traits: .sampleTasks ) { NavigationStack { TaskListView(group: .completed) } }