diff options
| author | Ben Sima <ben@bsima.me> | 2025-11-21 00:49:19 -0500 |
|---|---|---|
| committer | Ben Sima <ben@bsima.me> | 2025-11-21 00:49:19 -0500 |
| commit | 62728ac31f4a5a86678bf8830bf76b7ebf05436f (patch) | |
| tree | b06b431b0dbe8e858d339c6b0f9c1fbc86c85cd3 /Omni/Task | |
| parent | 5d8c049eadc14d0e782fededea4ac913a9dbbc78 (diff) | |
feat: implement t-1rcIwc8
Diffstat (limited to 'Omni/Task')
| -rw-r--r-- | Omni/Task/Core.hs | 45 |
1 files changed, 33 insertions, 12 deletions
diff --git a/Omni/Task/Core.hs b/Omni/Task/Core.hs index e4f1086..2ff7302 100644 --- a/Omni/Task/Core.hs +++ b/Omni/Task/Core.hs @@ -518,18 +518,31 @@ instance ToJSON TaskStats instance FromJSON TaskStats -- Get task statistics -getTaskStats :: IO TaskStats -getTaskStats = do - tasks <- loadTasks - ready <- getReadyTasks - let total = length tasks +getTaskStats :: Maybe Text -> IO TaskStats +getTaskStats maybeEpicId = do + allTasks <- loadTasks + + targetTasks <- case maybeEpicId of + Nothing -> pure allTasks + Just epicId -> + case filter (\t -> taskId t == epicId) allTasks of + [] -> panic "Epic not found" + _ -> pure <| getAllDescendants allTasks epicId + + globalReady <- getReadyTasks + let readyIds = map taskId globalReady + -- Filter ready tasks to only include those in our target set + readyCount = length <| filter (\t -> taskId t `elem` readyIds) targetTasks + + tasks = targetTasks + total = length tasks open = length <| filter (\t -> taskStatus t == Open) tasks inProg = length <| filter (\t -> taskStatus t == InProgress) tasks review = length <| filter (\t -> taskStatus t == Review) tasks done = length <| filter (\t -> taskStatus t == Done) tasks epics = length <| filter (\t -> taskType t == Epic) tasks - readyCount = length ready - blockedCount = total - readyCount - done + readyCount' = readyCount + blockedCount = total - readyCount' - done -- Count tasks by priority byPriority = [ (P0, length <| filter (\t -> taskPriority t == P0) tasks), @@ -550,18 +563,26 @@ getTaskStats = do reviewTasks = review, doneTasks = done, totalEpics = epics, - readyTasks = readyCount, + readyTasks = readyCount', blockedTasks = blockedCount, tasksByPriority = byPriority, tasksByNamespace = byNamespace } +-- Helper to get all descendants of a task (recursive) +getAllDescendants :: [Task] -> Text -> [Task] +getAllDescendants allTasks parentId = + let children = filter (\t -> taskParent t == Just parentId) allTasks + in children ++ concatMap (\t -> getAllDescendants allTasks (taskId t)) children + -- Show task statistics (human-readable) -showTaskStats :: IO () -showTaskStats = do - stats <- getTaskStats +showTaskStats :: Maybe Text -> IO () +showTaskStats maybeEpicId = do + stats <- getTaskStats maybeEpicId putText "" - putText "Task Statistics" + case maybeEpicId of + Nothing -> putText "Task Statistics" + Just epicId -> putText <| "Task Statistics for Epic " <> epicId putText "" putText <| "Total tasks: " <> T.pack (show (totalTasks stats)) putText <| " Open: " <> T.pack (show (openTasks stats)) |
