diff options
author | Mark Wales <mark@smallhadroncollider.com> | 2021-08-12 11:59:38 +0100 |
---|---|---|
committer | Mark Wales <mark@smallhadroncollider.com> | 2021-08-12 11:59:38 +0100 |
commit | 5e5d7d3454daef4373607e6f02f599fc39045b11 (patch) | |
tree | 3f11605f3ee87802825f3e4aac45d629398203d0 | |
parent | fb7feee61a4538869b76060651cf5c3bc2fcf3fd (diff) | |
parent | 0348134acc3ff3565aa72c6c368660ed5c5ce998 (diff) |
Merge branch 'release/1.11.3'1.11.3
-rwxr-xr-x | .bin/build | 1 | ||||
-rw-r--r-- | README.md | 12 | ||||
-rwxr-xr-x | docs/_config.yml | 2 | ||||
-rw-r--r-- | package.yaml | 2 | ||||
-rw-r--r-- | src/Taskell/Data/Task.hs | 29 | ||||
-rw-r--r-- | src/Taskell/Events/Actions/Modal/Detail.hs | 30 | ||||
-rw-r--r-- | src/Taskell/Events/Actions/Modal/Help.hs | 22 | ||||
-rw-r--r-- | src/Taskell/Events/State/Modal/Detail.hs | 68 |
8 files changed, 109 insertions, 57 deletions
@@ -34,6 +34,7 @@ git stash #---------------------------------------------------------------------------- # check cabal build works +cabal update cabal build if [ $? -ne 0 ] @@ -33,6 +33,9 @@ Follow [@taskellcli](https://twitter.com/taskellcli) on Twitter for updates - [Due Dates](#due-dates) - [Theming](#theming) - [Roadmap](#roadmap) +- [Contributing](#contributing) + - [Core Contributors](#core-contributors) +- [Acknowledgements](#acknowledgements) ## Installation @@ -342,12 +345,19 @@ The available colours are: `black`, `red`, `green`, `yellow`, `blue`, `magenta`, See [roadmap.md](https://github.com/smallhadroncollider/taskell/blob/develop/roadmap.md) for planned features -### Contributing +--- + +## Contributing Please check the [roadmap.md](https://github.com/smallhadroncollider/taskell/blob/develop/roadmap.md) before adding any bugs/feature requests to Issues. Anyone is welcome to contribute to the project, but please read through [CONTRIBUTING.md](https://github.com/smallhadroncollider/taskell/blob/master/CONTRIBUTING.md) and make sure that you agree with the [Code of Conduct](https://github.com/smallhadroncollider/taskell/blob/master/CODE_OF_CONDUCT.md) before getting involved. +### Core Contributors + +- Mark Wales ([@smallhadroncollider](https://github.com/smallhadroncollider)) +- Ali Ahmed ([@AliNisarAhmed](https://github.com/AliNisarAhmed)) + --- ## Acknowledgements diff --git a/docs/_config.yml b/docs/_config.yml index 0617140..b6e11b6 100755 --- a/docs/_config.yml +++ b/docs/_config.yml @@ -3,7 +3,7 @@ title: taskell tagline: Command-line Kanban board/task management baseurl: "" locale: "en" -version: 1.11.2 +version: 1.11.3 destination: _site/public exclude: [deployment, Capfile, log, Gemfile, Gemfile.lock] diff --git a/package.yaml b/package.yaml index b0b839a..9502d8e 100644 --- a/package.yaml +++ b/package.yaml @@ -1,5 +1,5 @@ name: taskell -version: '1.11.2' +version: '1.11.3' category: Command Line Tools author: Mark Wales maintainer: mark@smallhadroncollider.com diff --git a/src/Taskell/Data/Task.hs b/src/Taskell/Data/Task.hs index 41c1dc6..d60b6dd 100644 --- a/src/Taskell/Data/Task.hs +++ b/src/Taskell/Data/Task.hs @@ -4,20 +4,22 @@ module Taskell.Data.Task where import ClassyPrelude -import Control.Lens (ix, makeLenses, (%~), (&), (.~), (?~), (^.), (^?)) +import Control.Lens ((%~), (&), (.~), (?~), (^.), (^?), ix, makeLenses) -import Data.Sequence as S (adjust', deleteAt, (|>)) -import Data.Text (strip) -import Data.Time.Zones (TZ) -import Taskell.Data.Date (Due (..), inputToTime) +import Data.Sequence as S ((|>), adjust', deleteAt, insertAt) +import Data.Text (strip) +import Data.Time.Zones (TZ) +import Taskell.Data.Date (Due(..), inputToTime) import qualified Taskell.Data.Subtask as ST (Subtask, Update, complete, duplicate, name) -data Task = Task - { _name :: Text - , _description :: Maybe Text - , _subtasks :: Seq ST.Subtask - , _due :: Maybe Due - } deriving (Show, Eq) +data Task = + Task + { _name :: Text + , _description :: Maybe Text + , _subtasks :: Seq ST.Subtask + , _due :: Maybe Due + } + deriving (Show, Eq) type Update = Task -> Task @@ -43,7 +45,7 @@ setDescription text = maybeAppend :: Text -> Maybe Text -> Maybe Text maybeAppend text (Just current) = Just (concat [current, "\n", text]) -maybeAppend text Nothing = Just text +maybeAppend text Nothing = Just text appendDescription :: Text -> Update appendDescription text = @@ -63,6 +65,9 @@ clearDue task = task & due .~ Nothing getSubtask :: Int -> Task -> Maybe ST.Subtask getSubtask idx = (^? subtasks . ix idx) +addSubtaskAtIndex :: Int -> ST.Subtask -> Update +addSubtaskAtIndex idx subtask = subtasks %~ S.insertAt idx subtask + addSubtask :: ST.Subtask -> Update addSubtask subtask = subtasks %~ (|> subtask) diff --git a/src/Taskell/Events/Actions/Modal/Detail.hs b/src/Taskell/Events/Actions/Modal/Detail.hs index 73dda59..7b9775d 100644 --- a/src/Taskell/Events/Actions/Modal/Detail.hs +++ b/src/Taskell/Events/Actions/Modal/Detail.hs @@ -7,14 +7,14 @@ module Taskell.Events.Actions.Modal.Detail import ClassyPrelude -import Graphics.Vty.Input.Events -import Taskell.Events.Actions.Types as A (ActionType (..)) -import Taskell.Events.State (clearDate, normalMode, quit, store, undo, write) -import Taskell.Events.State.Modal.Detail as Detail -import Taskell.Events.State.Types -import Taskell.Events.State.Types.Mode (DetailItem (..), DetailMode (..)) -import Taskell.IO.Keyboard.Types (Actions) -import qualified Taskell.UI.Draw.Field as F (event) +import Graphics.Vty.Input.Events +import Taskell.Events.Actions.Types as A (ActionType(..)) +import Taskell.Events.State (clearDate, normalMode, quit, store, undo, write) +import Taskell.Events.State.Modal.Detail as Detail +import Taskell.Events.State.Types +import Taskell.Events.State.Types.Mode (DetailItem(..), DetailMode(..)) +import Taskell.IO.Keyboard.Types (Actions) +import qualified Taskell.UI.Draw.Field as F (event) events :: Actions events @@ -27,6 +27,8 @@ events , (A.MoveUp, (write =<<) . (up =<<) . store) , (A.MoveDown, (write =<<) . (down =<<) . store) , (A.New, (Detail.insertMode =<<) . (Detail.lastSubtask =<<) . (Detail.newItem =<<) . store) + , (A.NewAbove, Detail.newAbove) + , (A.NewBelow, Detail.newBelow) , (A.Edit, (Detail.insertMode =<<) . store) , (A.Complete, (write =<<) . (setComplete =<<) . store) , (A.Delete, (write =<<) . (Detail.remove =<<) . store) @@ -37,28 +39,26 @@ events normal :: Event -> Stateful normal (EvKey KEsc _) = normalMode -normal _ = pure +normal _ = pure insert :: Event -> Stateful insert (EvKey KEsc _) s = do item <- getCurrentItem s case item of DetailDescription -> (write =<<) $ finishDescription s - DetailDate -> showDetail s - (DetailItem _) -> (write =<<) . (showDetail =<<) $ finishSubtask s + DetailDate -> showDetail s + (DetailItem _) -> (write =<<) . (showDetail =<<) $ finishSubtask s insert (EvKey KEnter _) s = do item <- getCurrentItem s case item of DetailDescription -> (write =<<) $ finishDescription s DetailDate -> (write =<<) $ finishDue s - (DetailItem _) -> - (Detail.lastSubtask =<<) . (Detail.newItem =<<) . (store =<<) . (write =<<) $ - finishSubtask s + (DetailItem _) -> (Detail.newBelow =<<) . (write =<<) $ finishSubtask s insert e s = updateField (F.event e) s event :: Event -> Stateful event e s = do m <- getCurrentMode s case m of - DetailNormal -> normal e s + DetailNormal -> normal e s (DetailInsert _) -> insert e s diff --git a/src/Taskell/Events/Actions/Modal/Help.hs b/src/Taskell/Events/Actions/Modal/Help.hs index b77bca5..40b7365 100644 --- a/src/Taskell/Events/Actions/Modal/Help.hs +++ b/src/Taskell/Events/Actions/Modal/Help.hs @@ -1,14 +1,12 @@ {-# LANGUAGE OverloadedLists #-} module Taskell.Events.Actions.Modal.Help - ( event, - events, - ) -where + ( event + , events + ) where -import ClassyPrelude import Graphics.Vty.Input.Events -import Taskell.Events.Actions.Types as A (ActionType (..)) +import Taskell.Events.Actions.Types as A (ActionType(..)) import Taskell.Events.State import Taskell.Events.State.Modal.Help (moveHelpMenuDown, moveHelpMenuUp) import Taskell.Events.State.Types (Stateful) @@ -16,12 +14,12 @@ import Taskell.IO.Keyboard.Types (Actions) events :: Actions events = - [ (A.Quit, quit), - (A.MoveUp, moveHelpMenuUp), - (A.Next, moveHelpMenuUp), - (A.MoveDown, moveHelpMenuDown), - (A.Previous, moveHelpMenuDown) - ] + [ (A.Quit, quit) + , (A.MoveUp, moveHelpMenuUp) + , (A.Next, moveHelpMenuUp) + , (A.MoveDown, moveHelpMenuDown) + , (A.Previous, moveHelpMenuDown) + ] event :: Event -> Stateful event _ = normalMode diff --git a/src/Taskell/Events/State/Modal/Detail.hs b/src/Taskell/Events/State/Modal/Detail.hs index 36f832d..393c3c0 100644 --- a/src/Taskell/Events/State/Modal/Detail.hs +++ b/src/Taskell/Events/State/Modal/Detail.hs @@ -6,6 +6,7 @@ module Taskell.Events.State.Modal.Detail , showDetail , getCurrentItem , getCurrentMode + , getCurrentSubtask , getField , setComplete , remove @@ -13,28 +14,57 @@ module Taskell.Events.State.Modal.Detail , editDescription , editDue , newItem + , newItemAtIndex , nextSubtask , previousSubtask , lastSubtask + , subTaskAtIndex , up , down + , newAbove + , newBelow ) where import ClassyPrelude import Control.Lens ((&), (.~), (^.)) -import Taskell.Data.Date (timeToDisplay) -import qualified Taskell.Data.Seq as S -import qualified Taskell.Data.Subtask as ST (blank, name, toggle) -import Taskell.Data.Task (Task, addSubtask, countSubtasks, description, due, - getSubtask, removeSubtask, setDescription, setDue, - subtasks, updateSubtask) -import Taskell.Events.State (getCurrentTask, setCurrentTask) -import Taskell.Events.State.Types (State, Stateful, mode, time, timeZone) -import Taskell.Events.State.Types.Mode (DetailItem (..), DetailMode (..), - ModalType (Detail), Mode (Modal)) -import Taskell.UI.Draw.Field (Field, blankField, getText, textToField) +import Taskell.Data.Date (timeToDisplay) +import qualified Taskell.Data.Seq as S +import qualified Taskell.Data.Subtask as ST (blank, name, toggle) +import Taskell.Data.Task + ( Task + , addSubtask + , addSubtaskAtIndex + , countSubtasks + , description + , due + , getSubtask + , removeSubtask + , setDescription + , setDue + , subtasks + , updateSubtask + ) +import Taskell.Events.State (getCurrentTask, setCurrentTask, store) +import Taskell.Events.State.Types (State, Stateful, mode, time, timeZone) +import Taskell.Events.State.Types.Mode + ( DetailItem(..) + , DetailMode(..) + , ModalType(Detail) + , Mode(Modal) + ) +import Taskell.UI.Draw.Field (Field, blankField, getText, textToField) + +newAbove :: Stateful +newAbove state = do + idx <- getCurrentSubtask state + store state >>= newItemAtIndex idx >>= subTaskAtIndex idx >>= insertMode + +newBelow :: Stateful +newBelow state = do + idx <- (+ 1) <$> getCurrentSubtask state + store state >>= newItemAtIndex idx >>= subTaskAtIndex idx >>= insertMode updateField :: (Field -> Field) -> Stateful updateField fieldEvent s = @@ -78,25 +108,25 @@ getCurrentSubtask :: State -> Maybe Int getCurrentSubtask state = case state ^. mode of Modal (Detail (DetailItem i) _) -> Just i - _ -> Nothing + _ -> Nothing getCurrentItem :: State -> Maybe DetailItem getCurrentItem state = case state ^. mode of Modal (Detail item _) -> Just item - _ -> Nothing + _ -> Nothing getCurrentMode :: State -> Maybe DetailMode getCurrentMode state = case state ^. mode of Modal (Detail _ m) -> Just m - _ -> Nothing + _ -> Nothing getField :: State -> Maybe Field getField state = case state ^. mode of Modal (Detail _ (DetailInsert f)) -> Just f - _ -> Nothing + _ -> Nothing setComplete :: Stateful setComplete state = do @@ -139,6 +169,11 @@ newItem state = do task <- addSubtask ST.blank <$> getCurrentTask state setCurrentTask task state +newItemAtIndex :: Int -> Stateful +newItemAtIndex idx state = do + task <- addSubtaskAtIndex idx ST.blank <$> getCurrentTask state + setCurrentTask task state + -- list navigation changeSubtask :: Int -> Stateful changeSubtask inc state = do @@ -151,6 +186,9 @@ nextSubtask = changeSubtask 1 previousSubtask :: Stateful previousSubtask = changeSubtask (-1) +subTaskAtIndex :: Int -> Stateful +subTaskAtIndex idx state = setIndex state idx + lastSubtask :: Stateful lastSubtask state = lastIndex state >>= setIndex state |