summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMark Wales <mark@smallhadroncollider.com>2021-08-12 11:59:38 +0100
committerMark Wales <mark@smallhadroncollider.com>2021-08-12 11:59:38 +0100
commit5e5d7d3454daef4373607e6f02f599fc39045b11 (patch)
tree3f11605f3ee87802825f3e4aac45d629398203d0
parentfb7feee61a4538869b76060651cf5c3bc2fcf3fd (diff)
parent0348134acc3ff3565aa72c6c368660ed5c5ce998 (diff)
Merge branch 'release/1.11.3'1.11.3
-rwxr-xr-x.bin/build1
-rw-r--r--README.md12
-rwxr-xr-xdocs/_config.yml2
-rw-r--r--package.yaml2
-rw-r--r--src/Taskell/Data/Task.hs29
-rw-r--r--src/Taskell/Events/Actions/Modal/Detail.hs30
-rw-r--r--src/Taskell/Events/Actions/Modal/Help.hs22
-rw-r--r--src/Taskell/Events/State/Modal/Detail.hs68
8 files changed, 109 insertions, 57 deletions
diff --git a/.bin/build b/.bin/build
index a7b7fc9..e7c5fe7 100755
--- a/.bin/build
+++ b/.bin/build
@@ -34,6 +34,7 @@ git stash
#----------------------------------------------------------------------------
# check cabal build works
+cabal update
cabal build
if [ $? -ne 0 ]
diff --git a/README.md b/README.md
index cbac827..2c41e5f 100644
--- a/README.md
+++ b/README.md
@@ -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