Added the "canShowCompleted" computed property to the TodoGroup enumeration in the app target.

This commit is contained in:
2026-02-10 17:21:59 +01:00
parent 2a3323b8e6
commit cacbcad8c9
2 changed files with 51 additions and 1 deletions
+32 -1
View File
@@ -5,6 +5,16 @@ import SwiftUI
/// ///
/// This enumeration provides a semantic grouping mechanism for organizing and filtering todo tasks throughout the application. /// This enumeration provides a semantic grouping mechanism for organizing and filtering todo tasks throughout the application.
/// Each case represents a distinct category that helps users manage their tasks based on temporal relevance and completion state. /// Each case represents a distinct category that helps users manage their tasks based on temporal relevance and completion state.
///
/// ## Features
/// - Provides localized titles and icons for each group
/// - Supports filtering of completed tasks within temporal groups
/// - Enables color-coded visual categorization
///
/// ## Groups
/// Groups are categorized into two types:
/// - **Temporal groups** (`.today`, `.upcoming`, `.overdue`): Time-based categorization that can optionally include completed tasks
/// - **Status group** (`.completed`): Contains all completed tasks regardless of due date
enum TodoGroup { enum TodoGroup {
/// Tasks that have been marked as done, regardless of due date. /// Tasks that have been marked as done, regardless of due date.
case completed case completed
@@ -20,6 +30,17 @@ enum TodoGroup {
extension TodoGroup { extension TodoGroup {
/// Indicates whether this group supports toggling the visibility of completed tasks.
///
/// This property determines if a show/hide completed tasks action should be available for the group.
///
/// - Returns: `true` for temporal groups (`.today`, `.upcoming`, `.overdue`) that can optionally
/// show or hide completed tasks. Returns `false` for the `.completed` group since it exclusively
/// displays completed tasks.
var canShowCompleted: Bool {
self != .completed
}
/// The color associated with the task group. /// The color associated with the task group.
var color: Color { var color: Color {
switch self { switch self {
@@ -40,7 +61,7 @@ extension TodoGroup {
} }
} }
/// The display title for the task group. /// The localized display title for the task group.
var title: LocalizedStringKey { var title: LocalizedStringKey {
switch self { switch self {
case .completed: "enumeration.todo-group.title.completed" case .completed: "enumeration.todo-group.title.completed"
@@ -57,6 +78,13 @@ extension TodoGroup {
extension TodoGroup: CaseIterable { extension TodoGroup: CaseIterable {
/// All todo group cases in their display order.
///
/// The cases are ordered by priority and temporal relevance:
/// 1. `.today` - Most immediate tasks
/// 2. `.upcoming` - Future tasks
/// 3. `.overdue` - Past due tasks requiring attention
/// 4. `.completed` - Finished tasks
static var allCases: [TodoGroup] { [.today, .upcoming, .overdue, .completed] } static var allCases: [TodoGroup] { [.today, .upcoming, .overdue, .completed] }
} }
@@ -65,6 +93,9 @@ extension TodoGroup: CaseIterable {
extension TodoGroup: Identifiable { extension TodoGroup: Identifiable {
/// The unique identifier for the group.
///
/// Uses the case itself as the identifier, enabling use in SwiftUI's `ForEach` and other collection views.
var id: Self { self } var id: Self { self }
} }
@@ -9,6 +9,25 @@ struct TodoGroupTests {
// MARK: Computed tests // MARK: Computed tests
@Test(
"canShowCompleted returns correct values",
arguments: zip(
TodoGroup.allCases,
[true, true, true, false]
)
)
func canShowCompleted(
for group: TodoGroup,
expects expectation: Bool
) {
// GIVEN
// WHEN
let canShowCompleted = group.canShowCompleted
// THEN
#expect(canShowCompleted == expectation)
}
@Test( @Test(
"group color match expected values", "group color match expected values",
arguments: zip( arguments: zip(