module Data.TTask.Pretty.Contents ( ppActive , ppStory , ppStoryI , ppStoryList , ppSprint , ppSprintList , ppProjectPbl , ppProjectSprintList , ppProjectSprint , ppProjectSprintDetail , ppSprintHeaderDetail , ppProjectStory , ppProjectTask , ppStatusRecord ) where import Control.Applicative import Control.Lens import Data.TTask.Types import Data.List ppActive :: String -> Project -> String ppActive pid pj = let activeSprints :: Project -> [Sprint] activeSprints = filter ((^.isRunning) . _sprintStatus) . _projectSprints in concat [ ppProjectHeader pid pj , if activeSprints pj /= [] then "\n\nActive sprint(s) :\n" else "\nRunning sprint is nothing" , intercalate "\n" . map ppSprintDetail $ activeSprints pj , if _projectBacklog pj /= [] then "\n\nProduct backlog :\n" else "" , ppProjectPbl pj ] ---- ppTask :: Task -> String ppTask t = formatRecord "TASK" (t^.taskId) (t^.taskPoint) (t^.taskStatus) (t^.taskDescription) ppStoryHeader :: UserStory -> String ppStoryHeader s = formatRecord "STORY" (s^.storyId) (s^.point) (s^.storyStatus) (s^.storyDescription) ppStory :: UserStory -> String ppStory story = ppStoryI 1 story ppStoryI :: Int -> UserStory -> String ppStoryI r story = formatFamily r story ppStoryHeader _storyTasks ppTask ppStoryList :: [UserStory] -> String ppStoryList = intercalate "\n" . map ppStoryHeader ppSprintHeader :: Sprint -> String ppSprintHeader s = formatRecord "SPRINT" (s^.sprintId) (s^.point) (s^.sprintStatus) (s^.sprintDescription) ppSprint :: Sprint -> String ppSprint sprint = formatFamily 1 sprint ppSprintHeader _sprintStorys ppStoryHeader ppSprintList :: [Sprint] -> String ppSprintList = intercalate "\n" . map ppSprintHeader ppProjectHeader :: String -> Project -> String ppProjectHeader pid pj = formatRecordShowedId "PROJECT" pid (pj^.point) (pj^.projectStatus) (pj^.projectName) ---- ppSprintDetail :: Sprint -> String ppSprintDetail s = formatFamily 1 s ppSprintHeaderDetail _sprintStorys $ \s -> ppStoryI 2 s ppSprintHeaderDetail :: Sprint -> String ppSprintHeaderDetail s = ppSprintHeader s ++ "\n" ++ ppStatus (_sprintStatus s) ---- ppProjectPbl :: Project -> String ppProjectPbl = ppStoryList . _projectBacklog ppProjectSprintList :: Project -> String ppProjectSprintList = ppSprintList . _projectSprints ppProjectSprint :: Id -> Project -> Maybe String ppProjectSprint i pj = ppSprint <$> pj^?sprint i ppProjectSprintDetail :: Id -> Project -> Maybe String ppProjectSprintDetail i pj = ppSprintDetail <$> pj^?sprint i ppProjectStory :: Id -> Project -> Maybe String ppProjectStory i pj = ppStory <$> pj^?story i ppProjectTask :: Id -> Project -> Maybe String ppProjectTask i pj = ppTask <$> pj^?task i ---- formatRecord :: String -> Id -> Point -> TStatus -> String -> String formatRecord htype i point st description = formatRecordShowedId htype (show i) point st description formatRecordShowedId :: String -> String -> Point -> TStatus -> String -> String formatRecordShowedId htype i point st description = concat [ htype ++ " - " , i , " : " , show $ point , "pt [ " , ppStatusRecord $ st^.getLastStatus , " ] " , description ] formatFamily :: Eq b => Int -> a -> (a -> String) -> (a -> [b]) -> (b -> String) -> String formatFamily r x f g h = concat [ f x , if g x /= [] then "\n" else "" , intercalate "\n" . map (indent . h) $ g x ] where indent = ((concat $ replicate r "  ")++) ---- ppStatusRecord :: TStatusRecord -> String ppStatusRecord (StatusWait _) = "Wait" ppStatusRecord (StatusRunning _) = "Running" ppStatusRecord (StatusFinished _) = "Finished" ppStatusRecord (StatusNotAchieved _) = "Not Achieved" ppStatusRecord (StatusReject _) = "Reject" ppStatus :: TStatus -> String ppStatus s = intercalate "\n" . map pps . reverse $ s^.statusToList where pps :: TStatusRecord -> String pps r = let st = take 15 $ ppStatusRecord r ++ concat (replicate 16 " ") in "To " ++ st ++ " at " ++ show (r^.getStatusTime)