diff --git a/README.md b/README.md index 7635bfd..cfa3a0e 100644 --- a/README.md +++ b/README.md @@ -10,5 +10,126 @@ A Makefile has been provided with targets for `make` to just build in the local ## Usage -_swim_ has a decent sized, and growing, number of commands and "hot" keys. They will be detailed in this section, but are also avialable via the manpage. +_swim_ has a number of commands and "hot" keys. They will be detailed in this section, but are also avialable via the manpage. + +The main view of the program is the `swim lane` view. You can add as many lanes as you like. Lanes have titles and contain stories. A story shows up in a lane as the story title on the first row of the card and the assigned users (initials) and the number of story points together on the second row of the card. + +![a screenshot of the swim lane view of the application 'swim'](swim-lane-view.png) + +When viewing a story you will see the story title, when the story was last updated, the user(s) assigned to the story, a description of the story, a checklist in the form of tasks, and a comments section. + +![a screenshot of the story view of the application 'swim'](swim-story-view.png) + +### "Hot" Keys + +These can be pressed at appropriate times to quickly control the board/program. + +#### Lane View + +These keys have the following effect while looking at the main 'swim lane' view: + +- `h` - Move focus one lane to the left +- `j` - Move focus one story down +- `k` - Move focus one story up +- `l` - Move focus one lane to the right +- 'H' - Move focused story one lane to the left +- 'J' - Move focused story one story down in the current lane +- 'K' - Move focused story one story up in the current lane +- 'L' - Move focused story one lane to the right +- `Q` - Quit swim immediately +- `N` - Create a new lane, will query for lane name +- `n` - Create a new story in the focused lane, will query for story name +- `` - View the currently focused story +- `g` - Move focus to the first (top) story in the currently focused lane +- `G` - Move focus to the last (bottom) story in the currently focused lane +- `:` - Enter command mode; all commands work from any view/screen +- `+` - Zoom in; show fewer, but wider, lanes on the screen at one time +- `-` - Zoom out; show more, but narrower, lanes on the screen at one time + +#### Story View + +While looking at a story's detailed view these keys have the following effects to the story being viewed: + +- `h` - Return to 'swim lane' view +- `j` - Scroll down +- `k` - Scroll up +- `g` - Scroll to top +- `G` - Scroll to bottom +- `:` - Enter command mode; all commands work from any view +- `c` - Add a new comment; will query for comment value +- `t` - Add a new task; will query for comment value +- `T` - Set a new title; will query for title value +- `d` - Set a new description; will query for description value +- `D` - Delete a task, will query for task number +- `u` - Toggle assigned user(s); will query for a space separated list of users and will toggle each user's state on/off (if they are already on the card they will be removed, otherwise they will be added) +- `1`, `2`, `3`, `4`, `5`, `6`, `7`, `8`, `9`, `0` - Will toggle the task with the given number (un)complete. `0` represents `10`. This is quicker than having to type `:toggle 2` or the like + + +### Commands + +Command mode can be accessed via the "hot" key `:`. Most of the commands can be abbreviated. For example: `:set story points 2` could also be `:s s p 2` or `:s st points 2`. In most cases any portion of the word will work. + +This tree style listing shows commands and their sub-commands. Anything inside of `{curly braces}` represents an optional value that can be added. These optional values can be as many words as you like and the command that you are issuing will put them together as needed. If an optional value is not passed as a part of the command then the user will be queried for the value and their response will be verified (with a yes/no/cancel prompt). + +- `create` + - `lane` + - `{title}` + - `story` - Will be added to the currently selected lane + - `{title}` + - `task` - Will be added to the currently selected story + - `{value}` + - `coment` + - `{value}` +- `delete` + - `lane` - Always refers to the currently selected lane + - `story` - Always refers to the currently selected story + - `task` - Always refers to the currently selected story + - `{task number}` +- `quit` +- `set` + - `board` + - `title` + - `{value}` + - `lane` - Always refers to the currently selected lane + - `title` + - `{value}` + - `story` - Always refers to the currently selected story + - `title` + - `{value}` + - `description` + - `{value}` + - `points` + - `{value}` + - `user` + - {space separated list of usernames to (un)assign} +- `toggle` - Marks a task as (in)complete. Always refers to the currently selected story + - `{task number}` +- `user` - Always refers to the currently selected story + - `{space separated list of usernames to (un)assign}` + +- `write` + - `{path}` - Will use the current path if nothing is passed +- `wq` - Same as `write`, but quits afterward + - `{path}` - Will use the current path if nothing is passed + +## Files + +swim writes data to files as json data representing program state. This allows swim files to be flexible. In theory an alternate client could be built around the same data models and interoperate pretty easily with swim, allowing end users choice of control application for underlying data. + +## Colors + +Reliably getting a value for what color modes are supported for a given terminal is tricky business. _swim_ does some sniffing and makes a conservative guess for what color mode your terminal will support. Three modes are supported: 4-bit (Simple), 8-Bit (256), and 24-Bit (True). The colors can be found in the file `colors.go` and can be edited and recompiled if desired. They use [ansi escape sequences](https://en.wikipedia.org/wiki/ANSI_escape_code#Colors) and work in a mostly straightforward manner. + +Any of the three color modes can be forced with the runtime flag `-color`. For example: + +- `swim -color simple ./my-file.swim` +- `swim -color 256 ./my-file.swim` +- `swim -color true ./my-file.swim` +- `swim -color none ./my-file.swim` + +That last one, `none`, will never be used automatically, but can be passed with the given flag to turn off color and just use your terminal's foreground/background colors (plus occasional bold and inverse coloring). + +## Sizing and Signals + +_swim_ will automatically resize and redraw when your terminal is resized. It also handled common signals well, allowing for suspend/resume job control to work nicely and for other signals (^c and ^d come to mind) to behave as expected. diff --git a/board.go b/board.go index 9ec9a6b..1743a7b 100644 --- a/board.go +++ b/board.go @@ -98,8 +98,6 @@ func (b *Board) Run() { case 'h', 'j', 'k', 'l', 'H', 'L', 'K', 'J': b.ClearMessage() b.Move(ch) - case 'D': - // Delete current story case ':': b.EnterCommand() case '+': diff --git a/main.go b/main.go index 273f659..58c114a 100644 --- a/main.go +++ b/main.go @@ -223,7 +223,7 @@ func DefaultBoard(cols, rows int) Board { func SetColorFromFlag(f string) int { f = strings.ToUpper(f) switch f { - case "8": + case "SIMPLE": return SimpleColor case "256": return EightBitColor @@ -237,7 +237,7 @@ func SetColorFromFlag(f string) int { } func main() { - colors := flag.String("color", "", "Color mode: 8, 256, True, None" ) + colors := flag.String("color", "", "Color mode: Simple, 256, True, None" ) flag.Parse() args := flag.Args() style.Init(SetColorFromFlag(*colors)) diff --git a/swim-lane-view.png b/swim-lane-view.png new file mode 100644 index 0000000..1ee1771 Binary files /dev/null and b/swim-lane-view.png differ diff --git a/swim-story-view.png b/swim-story-view.png new file mode 100644 index 0000000..715433d Binary files /dev/null and b/swim-story-view.png differ diff --git a/swim.json b/swim.json index a7aa666..824cd05 100644 --- a/swim.json +++ b/swim.json @@ -1 +1 @@ -{"BoardTitle":"Working on swim","Lanes":[{"LaneTitle":"Backlog","Stories":[{"StoryTitle":"Create Man Page","StoryBody":"","StoryUsers":["sloum"],"StoryTag":-1,"StoryTasks":[],"StoryComments":[],"StoryCreated":"2021-03-26T12:54:08.267784673-07:00","StoryUpdated":"2021-03-26T14:04:51.984348517-07:00","StoryPoints":1},{"StoryTitle":"Add Web/Gemini Docs","StoryBody":"","StoryUsers":["sloum"],"StoryTag":-1,"StoryTasks":[],"StoryComments":[],"StoryCreated":"2021-03-26T12:54:20.343386682-07:00","StoryUpdated":"2021-03-26T14:05:02.15458881-07:00","StoryPoints":1},{"StoryTitle":"Write Full Readme","StoryBody":"","StoryUsers":["sloum"],"StoryTag":-1,"StoryTasks":[],"StoryComments":[],"StoryCreated":"2021-03-26T12:53:59.797558294-07:00","StoryUpdated":"2021-03-26T14:04:39.411318131-07:00","StoryPoints":1}],"CurrentStory":2},{"LaneTitle":"Active","Stories":[{"StoryTitle":"Rework file writing","StoryBody":"Fixes an issue with mangled writes to json files","StoryUsers":["sloum"],"StoryTag":-1,"StoryTasks":[{"TaskBody":"Make sure existing permissions carry over and new files get a sane default","TaskComplete":true},{"TaskBody":"Make sure files get truncated on open for write","TaskComplete":true},{"TaskBody":"Make a backup file while writing, the delete it if the file write worked","TaskComplete":false}],"StoryComments":[],"StoryCreated":"2021-03-25T14:32:46.780453566-07:00","StoryUpdated":"2021-03-26T14:05:39.464143008-07:00","StoryPoints":1},{"StoryTitle":"Add 'g' and 'G' handling for lane view","StoryBody":"","StoryUsers":["sloum"],"StoryTag":-1,"StoryTasks":[],"StoryComments":[],"StoryCreated":"2021-03-26T09:22:55.368822582-07:00","StoryUpdated":"2021-03-26T14:05:08.362154894-07:00","StoryPoints":1}],"CurrentStory":1},{"LaneTitle":"Completed","Stories":[{"StoryTitle":"Add quick mode for toggling tasks","StoryBody":"Make this work like Bombadillo's quick link navigation. Pressing '1' would toggle on or off the first task in a tasklist. This only functions on the story view and is not a part of the overall listener as provided by *Board. Make sure '0' functions as \"10\".","StoryUsers":["sloum"],"StoryTag":-1,"StoryTasks":[{"TaskBody":"Add runes to story listener loop","TaskComplete":true},{"TaskBody":"Call update toggle on story when pressed","TaskComplete":true},{"TaskBody":"If 0 is entered, make sure the string \"10\" is sent","TaskComplete":true}],"StoryComments":[],"StoryCreated":"2021-03-25T12:58:09.871463382-07:00","StoryUpdated":"2021-03-25T14:14:15.97075787-07:00","StoryPoints":1},{"StoryTitle":"Add redraw on resume from job control","StoryBody":"Make signals behave in a clean way and provide expected behavior.","StoryUsers":["sloum"],"StoryTag":-1,"StoryTasks":[{"TaskBody":"Copy over signal handler from tally","TaskComplete":true},{"TaskBody":"Update the SIGCONT handler to call board.Draw()","TaskComplete":true},{"TaskBody":"Make sure other signals are handled properly","TaskComplete":true}],"StoryComments":[{"CommentUser":"sloum","CommentBody":"This is mostly done. Do a cursory look at the other signals and then start handling the terminal resize story.","CommentCreated":"2021-03-25T12:49:58.234148077-07:00"}],"StoryCreated":"2021-03-25T09:21:22.815587777-07:00","StoryUpdated":"2021-03-25T15:39:22.781661841-07:00","StoryPoints":1},{"StoryTitle":"Add resize/draw on terminal resize","StoryBody":"When the terminal is resized the main *Board should have its width and height updated","StoryUsers":["sloum"],"StoryTag":-1,"StoryTasks":[{"TaskBody":"Create listener for resize","TaskComplete":true},{"TaskBody":"Update *Board with new dimensions on resize","TaskComplete":true},{"TaskBody":"Redraw screen on resize","TaskComplete":true},{"TaskBody":"Make sure if a story is being viewed that the redraw is a story redraw not a board redraw","TaskComplete":true}],"StoryComments":[{"CommentUser":"sloum","CommentBody":"Some of this code should already be present in Bombadillo. It can be borrowed from there.","CommentCreated":"2021-03-25T09:23:39.245527096-07:00"},{"CommentUser":"sloum","CommentBody":"Individuak stories should automatically reflow their content when they are viewed. With the exception of a currently open story. That could create problems, so maybe always reflow that story.","CommentCreated":"2021-03-25T12:51:42.948281369-07:00"}],"StoryCreated":"2021-03-25T09:21:08.303781384-07:00","StoryUpdated":"2021-03-25T15:01:37.428712763-07:00","StoryPoints":1},{"StoryTitle":"Make zoom adjust the lane offset","StoryBody":"When you zoom in it is possible for the currently selected column to be off the screen. The lane offset should be adjusted to account for this and keep the selected lane on the screen.","StoryUsers":["sloum"],"StoryTag":-1,"StoryTasks":[{"TaskBody":"Update zoom in to adjust offset","TaskComplete":true},{"TaskBody":"Update zoom out to adjust offset","TaskComplete":true},{"TaskBody":"Make sure offset cannot be \u003c 0","TaskComplete":true}],"StoryComments":[],"StoryCreated":"2021-03-25T14:40:01.870503824-07:00","StoryUpdated":"2021-03-25T14:49:18.990485621-07:00","StoryPoints":1},{"StoryTitle":"Add story points to card lane display","StoryBody":"Currently, story cards only display the title. It would be nice to also display points.","StoryUsers":["sloum"],"StoryTag":-1,"StoryTasks":[],"StoryComments":[],"StoryCreated":"2021-03-25T14:52:00.470752912-07:00","StoryUpdated":"2021-03-25T14:53:24.025863477-07:00","StoryPoints":1},{"StoryTitle":"Terminal color detection","StoryBody":"Terminal color avialability is tricky. Set up some kind of best guess scenario, falling back to 8 bit when necessary.","StoryUsers":["sloum"],"StoryTag":-1,"StoryTasks":[{"TaskBody":"Check for $COLORTERM var and set to true if its value is 24bit || truecolor","TaskComplete":true},{"TaskBody":"Check the $TERM var for 256 anywhere in it. If found set to 256","TaskComplete":true},{"TaskBody":"When in doubt fall back to 8bit","TaskComplete":true},{"TaskBody":"Have this auto-set on run","TaskComplete":true},{"TaskBody":"Create a flag to manually override to any of the three values","TaskComplete":true}],"StoryComments":[],"StoryCreated":"2021-03-25T22:46:50.10507806-07:00","StoryUpdated":"2021-03-25T22:49:34.18340222-07:00","StoryPoints":1},{"StoryTitle":"Add -color \"none\" mode","StoryBody":"Add a mode that does not do any color additions. This will result in a 2bit color mode (fg/bg and color on/off for each as set by the terminal).","StoryUsers":["sloum"],"StoryTag":-1,"StoryTasks":[],"StoryComments":[{"CommentUser":"sloum","CommentBody":"This was set up using the flag: -color none || -color off","CommentCreated":"2021-03-26T09:20:51.555905306-07:00"}],"StoryCreated":"2021-03-26T09:18:22.711096199-07:00","StoryUpdated":"2021-03-26T09:25:04.391052303-07:00","StoryPoints":1},{"StoryTitle":"Add 2nd Row to cards w/ pts and users","StoryBody":"Should make the board a bit more readable and useful for working in groups","StoryUsers":["sloum"],"StoryTag":-1,"StoryTasks":[{"TaskBody":"Add second row to cards","TaskComplete":true},{"TaskBody":"Remove story points from first row and add it to second","TaskComplete":true}],"StoryComments":[],"StoryCreated":"2021-03-26T13:38:33.776434147-07:00","StoryUpdated":"2021-03-26T14:06:33.086132452-07:00","StoryPoints":1},{"StoryTitle":"Have selected story remain in view when term resized","StoryBody":"","StoryUsers":["sloum"],"StoryTag":-1,"StoryTasks":[],"StoryComments":[{"CommentUser":"sloum","CommentBody":"This ran into some trouble. I didnt want to spend a lot of time on it so for now I have it resetting the selected story to the first story in the lane on resize. This is not great, but will function for the moment to not cause weird breakages.","CommentCreated":"2021-03-26T14:18:29.872684519-07:00"}],"StoryCreated":"2021-03-26T09:22:00.450326411-07:00","StoryUpdated":"2021-03-26T14:05:22.684602202-07:00","StoryPoints":1},{"StoryTitle":"Fix text clearing when selecting 'n' at a verification prompt","StoryBody":"Currently if you select 'n', intending to rewrite your input, ghosting of the previous messaging is left.","StoryUsers":["sloum"],"StoryTag":-1,"StoryTasks":[],"StoryComments":[],"StoryCreated":"2021-03-26T09:16:42.336417437-07:00","StoryUpdated":"2021-03-26T14:05:34.014292773-07:00","StoryPoints":1}],"CurrentStory":9}],"CurrentLane":1,"Zoom":3,"StoryOpen":false} \ No newline at end of file +{"BoardTitle":"Working on swim","Lanes":[{"LaneTitle":"Backlog","Stories":[{"StoryTitle":"Create Man Page","StoryBody":"","StoryUsers":["sloum"],"StoryTag":-1,"StoryTasks":[],"StoryComments":[],"StoryCreated":"2021-03-26T12:54:08.267784673-07:00","StoryUpdated":"2021-03-26T14:04:51.984348517-07:00","StoryPoints":1},{"StoryTitle":"Add Web/Gemini Docs","StoryBody":"","StoryUsers":["sloum"],"StoryTag":-1,"StoryTasks":[],"StoryComments":[],"StoryCreated":"2021-03-26T12:54:20.343386682-07:00","StoryUpdated":"2021-03-26T14:05:02.15458881-07:00","StoryPoints":1},{"StoryTitle":"Write Full Readme","StoryBody":"","StoryUsers":["sloum"],"StoryTag":-1,"StoryTasks":[],"StoryComments":[],"StoryCreated":"2021-03-26T12:53:59.797558294-07:00","StoryUpdated":"2021-03-26T14:04:39.411318131-07:00","StoryPoints":1}],"CurrentStory":0},{"LaneTitle":"Active","Stories":[{"StoryTitle":"Rework file writing","StoryBody":"Fixes an issue with mangled writes to json files","StoryUsers":["sloum"],"StoryTag":-1,"StoryTasks":[{"TaskBody":"Make sure existing permissions carry over and new files get a sane default","TaskComplete":true},{"TaskBody":"Make sure files get truncated on open for write","TaskComplete":true},{"TaskBody":"Make a backup file while writing, the delete it if the file write worked","TaskComplete":false}],"StoryComments":[],"StoryCreated":"2021-03-25T14:32:46.780453566-07:00","StoryUpdated":"2021-03-26T14:05:39.464143008-07:00","StoryPoints":1}],"CurrentStory":0},{"LaneTitle":"Completed","Stories":[{"StoryTitle":"Add quick mode for toggling tasks","StoryBody":"Make this work like Bombadillo's quick link navigation. Pressing '1' would toggle on or off the first task in a tasklist. This only functions on the story view and is not a part of the overall listener as provided by *Board. Make sure '0' functions as \"10\".","StoryUsers":["sloum"],"StoryTag":-1,"StoryTasks":[{"TaskBody":"Add runes to story listener loop","TaskComplete":true},{"TaskBody":"Call update toggle on story when pressed","TaskComplete":true},{"TaskBody":"If 0 is entered, make sure the string \"10\" is sent","TaskComplete":true}],"StoryComments":[],"StoryCreated":"2021-03-25T12:58:09.871463382-07:00","StoryUpdated":"2021-03-25T14:14:15.97075787-07:00","StoryPoints":1},{"StoryTitle":"Add redraw on resume from job control","StoryBody":"Make signals behave in a clean way and provide expected behavior.","StoryUsers":["sloum"],"StoryTag":-1,"StoryTasks":[{"TaskBody":"Copy over signal handler from tally","TaskComplete":true},{"TaskBody":"Update the SIGCONT handler to call board.Draw()","TaskComplete":true},{"TaskBody":"Make sure other signals are handled properly","TaskComplete":true}],"StoryComments":[{"CommentUser":"sloum","CommentBody":"This is mostly done. Do a cursory look at the other signals and then start handling the terminal resize story.","CommentCreated":"2021-03-25T12:49:58.234148077-07:00"}],"StoryCreated":"2021-03-25T09:21:22.815587777-07:00","StoryUpdated":"2021-03-25T15:39:22.781661841-07:00","StoryPoints":1},{"StoryTitle":"Add resize/draw on terminal resize","StoryBody":"When the terminal is resized the main *Board should have its width and height updated","StoryUsers":["sloum"],"StoryTag":-1,"StoryTasks":[{"TaskBody":"Create listener for resize","TaskComplete":true},{"TaskBody":"Update *Board with new dimensions on resize","TaskComplete":true},{"TaskBody":"Redraw screen on resize","TaskComplete":true},{"TaskBody":"Make sure if a story is being viewed that the redraw is a story redraw not a board redraw","TaskComplete":true}],"StoryComments":[{"CommentUser":"sloum","CommentBody":"Some of this code should already be present in Bombadillo. It can be borrowed from there.","CommentCreated":"2021-03-25T09:23:39.245527096-07:00"},{"CommentUser":"sloum","CommentBody":"Individuak stories should automatically reflow their content when they are viewed. With the exception of a currently open story. That could create problems, so maybe always reflow that story.","CommentCreated":"2021-03-25T12:51:42.948281369-07:00"}],"StoryCreated":"2021-03-25T09:21:08.303781384-07:00","StoryUpdated":"2021-03-25T15:01:37.428712763-07:00","StoryPoints":1},{"StoryTitle":"Make zoom adjust the lane offset","StoryBody":"When you zoom in it is possible for the currently selected column to be off the screen. The lane offset should be adjusted to account for this and keep the selected lane on the screen.","StoryUsers":["sloum"],"StoryTag":-1,"StoryTasks":[{"TaskBody":"Update zoom in to adjust offset","TaskComplete":true},{"TaskBody":"Update zoom out to adjust offset","TaskComplete":true},{"TaskBody":"Make sure offset cannot be \u003c 0","TaskComplete":true}],"StoryComments":[],"StoryCreated":"2021-03-25T14:40:01.870503824-07:00","StoryUpdated":"2021-03-25T14:49:18.990485621-07:00","StoryPoints":1},{"StoryTitle":"Add story points to card lane display","StoryBody":"Currently, story cards only display the title. It would be nice to also display points.","StoryUsers":["sloum"],"StoryTag":-1,"StoryTasks":[],"StoryComments":[],"StoryCreated":"2021-03-25T14:52:00.470752912-07:00","StoryUpdated":"2021-03-25T14:53:24.025863477-07:00","StoryPoints":1},{"StoryTitle":"Terminal color detection","StoryBody":"Terminal color avialability is tricky. Set up some kind of best guess scenario, falling back to 8 bit when necessary.","StoryUsers":["sloum"],"StoryTag":-1,"StoryTasks":[{"TaskBody":"Check for $COLORTERM var and set to true if its value is 24bit || truecolor","TaskComplete":true},{"TaskBody":"Check the $TERM var for 256 anywhere in it. If found set to 256","TaskComplete":true},{"TaskBody":"When in doubt fall back to 8bit","TaskComplete":true},{"TaskBody":"Have this auto-set on run","TaskComplete":true},{"TaskBody":"Create a flag to manually override to any of the three values","TaskComplete":true}],"StoryComments":[],"StoryCreated":"2021-03-25T22:46:50.10507806-07:00","StoryUpdated":"2021-03-25T22:49:34.18340222-07:00","StoryPoints":1},{"StoryTitle":"Add -color \"none\" mode","StoryBody":"Add a mode that does not do any color additions. This will result in a 2bit color mode (fg/bg and color on/off for each as set by the terminal).","StoryUsers":["sloum"],"StoryTag":-1,"StoryTasks":[],"StoryComments":[{"CommentUser":"sloum","CommentBody":"This was set up using the flag: -color none || -color off","CommentCreated":"2021-03-26T09:20:51.555905306-07:00"}],"StoryCreated":"2021-03-26T09:18:22.711096199-07:00","StoryUpdated":"2021-03-26T09:25:04.391052303-07:00","StoryPoints":1},{"StoryTitle":"Add 2nd Row to cards w/ pts and users","StoryBody":"Should make the board a bit more readable and useful for working in groups","StoryUsers":["sloum"],"StoryTag":-1,"StoryTasks":[{"TaskBody":"Add second row to cards","TaskComplete":true},{"TaskBody":"Remove story points from first row and add it to second","TaskComplete":true}],"StoryComments":[],"StoryCreated":"2021-03-26T13:38:33.776434147-07:00","StoryUpdated":"2021-03-26T14:06:33.086132452-07:00","StoryPoints":1},{"StoryTitle":"Have selected story remain in view when term resized","StoryBody":"","StoryUsers":["sloum"],"StoryTag":-1,"StoryTasks":[],"StoryComments":[{"CommentUser":"sloum","CommentBody":"This ran into some trouble. I didnt want to spend a lot of time on it so for now I have it resetting the selected story to the first story in the lane on resize. This is not great, but will function for the moment to not cause weird breakages.","CommentCreated":"2021-03-26T14:18:29.872684519-07:00"}],"StoryCreated":"2021-03-26T09:22:00.450326411-07:00","StoryUpdated":"2021-03-26T14:05:22.684602202-07:00","StoryPoints":1},{"StoryTitle":"Fix text clearing when selecting 'n' at a verification prompt","StoryBody":"Currently if you select 'n', intending to rewrite your input, ghosting of the previous messaging is left.","StoryUsers":["sloum"],"StoryTag":-1,"StoryTasks":[],"StoryComments":[],"StoryCreated":"2021-03-26T09:16:42.336417437-07:00","StoryUpdated":"2021-03-26T14:05:34.014292773-07:00","StoryPoints":1},{"StoryTitle":"Add 'g' and 'G' handling for lane view","StoryBody":"","StoryUsers":["sloum"],"StoryTag":-1,"StoryTasks":[],"StoryComments":[],"StoryCreated":"2021-03-26T09:22:55.368822582-07:00","StoryUpdated":"2021-03-26T14:05:08.362154894-07:00","StoryPoints":1}],"CurrentStory":10}],"CurrentLane":0,"Zoom":3,"StoryOpen":false} \ No newline at end of file