Skip to content

Commit 533c28f

Browse files
committed
Task rename added. Closes #3
- Moved title of TaskDetail panel to separate component - Refactored indentation, formatting - Updated status bar
1 parent 1508edc commit 533c28f

File tree

7 files changed

+116
-23
lines changed

7 files changed

+116
-23
lines changed

README.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,8 @@ In case writing in a text input (e,g, new project/task, due date), you have to `
9595
| Task Detail | `d` | Set Due date |
9696
| Task Detail | ``/`` | Scroll Up/Down the note editor |
9797
| Task Detail | `e` | Activate note editor for modification |
98+
| Task Detail | `v` | Edit task details in external editor (default `vim`) _Have a Known Bug<sup>4</sup>_ |
99+
| Task Detail | `r` | Rename Task Title |
98100
| Active Note Editor | `Esc` | Deactivate note editor and save content |
99101

100102
**Tips about using shortcuts efficiently:**
@@ -172,6 +174,6 @@ You may :thumbsup: issues if you want to increase priority of a feature.
172174
1. In my Macbook Air, 1.6 GHz Dual-Core Intel Core i5, RAM: 8 GB 1600 MHz DDR3
173175
2. Using [monakai](https://github.com/sickill/vim-monokai) color scheme for markdown syntax
174176
3. Habitica is a free habit and productivity app that treats your real life like a game
175-
177+
4. Known Bug: Mouse events (click) don't work after getting back from Editor.
176178
---
177179
> "This is the Book about which there is no doubt, a guidance for those conscious of Allah" - [Al-Quran](http://quran.com)

app/cli.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ func main() {
4747
taskRepo = repo.NewTaskRepository(db)
4848

4949
titleText := tview.NewTextView().SetText("[lime::b]Geek-life [::-]- Task Manager for geeks!").SetDynamicColors(true)
50-
cloudStatus := tview.NewTextView().SetText("[::d]Version: 0.0.3").SetTextAlign(tview.AlignRight).SetDynamicColors(true)
50+
cloudStatus := tview.NewTextView().SetText("[::d]Version: 0.1.0").SetTextAlign(tview.AlignRight).SetDynamicColors(true)
5151

5252
titleBar := tview.NewFlex().
5353
AddItem(titleText, 0, 2, false).

app/status_bar.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ func makeStatusBar(app *tview.Application) *StatusBar {
3131
tview.NewGrid(). // Content will not be modified, So, no need to declare explicitly
3232
SetColumns(0, 0, 0, 0).
3333
SetRows(0).
34-
AddItem(tview.NewTextView().SetText("Navigate List: ↓/↑"), 0, 0, 1, 1, 0, 0, false).
34+
AddItem(tview.NewTextView().SetText("Navigate List: ↓,↑ / j,k"), 0, 0, 1, 1, 0, 0, false).
3535
AddItem(tview.NewTextView().SetText("New Task/Project: n").SetTextAlign(tview.AlignCenter), 0, 1, 1, 1, 0, 0, false).
3636
AddItem(tview.NewTextView().SetText("Step back: Esc").SetTextAlign(tview.AlignCenter), 0, 2, 1, 1, 0, 0, false).
3737
AddItem(tview.NewTextView().SetText("Quit: Ctrl+C").SetTextAlign(tview.AlignRight), 0, 3, 1, 1, 0, 0, false),

app/task_detail.go

Lines changed: 15 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -23,21 +23,22 @@ const dateLayoutHuman = "02 Jan, Monday"
2323
// TaskDetailPane displays detailed info of a Task
2424
type TaskDetailPane struct {
2525
*tview.Flex
26-
taskName, taskDateDisplay *tview.TextView
27-
editorHint *tview.TextView
28-
taskDate *tview.InputField
29-
taskStatusToggle *tview.Button
30-
taskDetailView *femto.View
31-
colorScheme femto.Colorscheme
32-
taskRepo repository.TaskRepository
33-
task *model.Task
26+
header *TaskDetailHeader
27+
taskDateDisplay *tview.TextView
28+
editorHint *tview.TextView
29+
taskDate *tview.InputField
30+
taskStatusToggle *tview.Button
31+
taskDetailView *femto.View
32+
colorScheme femto.Colorscheme
33+
taskRepo repository.TaskRepository
34+
task *model.Task
3435
}
3536

3637
// NewTaskDetailPane initializes and configures a TaskDetailPane
3738
func NewTaskDetailPane(taskRepo repository.TaskRepository) *TaskDetailPane {
3839
pane := TaskDetailPane{
3940
Flex: tview.NewFlex().SetDirection(tview.FlexRow),
40-
taskName: tview.NewTextView().SetDynamicColors(true),
41+
header: NewTaskDetailHeader(taskRepo),
4142
taskDateDisplay: tview.NewTextView().SetDynamicColors(true),
4243
taskStatusToggle: makeButton("Complete", nil).SetLabelColor(tcell.ColorLightGray),
4344
taskRepo: taskRepo,
@@ -61,8 +62,7 @@ func NewTaskDetailPane(taskRepo repository.TaskRepository) *TaskDetailPane {
6162
SetTextColor(tcell.ColorDimGray), 0, 1, false)
6263

6364
pane.
64-
AddItem(pane.taskName, 2, 1, true).
65-
AddItem(makeHorizontalLine(tcell.RuneS3, tcell.ColorGray), 1, 1, false).
65+
AddItem(pane.header, 4, 1, true).
6666
AddItem(blankCell, 1, 1, false).
6767
AddItem(pane.makeDateRow(), 1, 1, true).
6868
AddItem(blankCell, 1, 1, false).
@@ -130,8 +130,7 @@ func (td *TaskDetailPane) toggleTaskStatus() {
130130
status := !td.task.Completed
131131
if taskRepo.UpdateField(td.task, "Completed", status) == nil {
132132
td.task.Completed = status
133-
td.SetTask(td.task)
134-
taskPane.list.SetItemText(taskPane.list.GetCurrentItem(), makeTaskListingTitle(*td.task), "")
133+
taskPane.ReloadCurrentTask()
135134
}
136135
}
137136

@@ -299,12 +298,11 @@ func (td *TaskDetailPane) handleShortcuts(event *tcell.EventKey) *tcell.EventKey
299298
td.editInExternalEditor()
300299
case 'd':
301300
app.SetFocus(td.taskDate)
302-
case 'h':
303-
app.SetFocus(taskPane)
301+
case 'r':
302+
td.header.ShowRename()
304303
case ' ':
305304
td.toggleTaskStatus()
306305
}
307-
308306
}
309307

310308
return event
@@ -314,7 +312,7 @@ func (td *TaskDetailPane) handleShortcuts(event *tcell.EventKey) *tcell.EventKey
314312
func (td *TaskDetailPane) SetTask(task *model.Task) {
315313
td.task = task
316314

317-
td.taskName.SetText(fmt.Sprintf("[%s::b]# %s", getTaskTitleColor(*td.task), td.task.Title))
315+
td.header.SetTask(task)
318316
td.taskDetailView.Buf = makeBufferFromString(td.task.Details)
319317
td.taskDetailView.SetColorscheme(td.colorScheme)
320318
td.taskDetailView.Start()

app/task_title.go

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
package main
2+
3+
import (
4+
"fmt"
5+
6+
"github.com/gdamore/tcell"
7+
"github.com/rivo/tview"
8+
9+
"github.com/ajaxray/geek-life/model"
10+
"github.com/ajaxray/geek-life/repository"
11+
)
12+
13+
// TaskDetailHeader displays Task title and relevant action in TaskDetail pane
14+
type TaskDetailHeader struct {
15+
*tview.Flex
16+
pages *tview.Pages
17+
taskName *tview.TextView
18+
taskRepo repository.TaskRepository
19+
task *model.Task
20+
renameText *tview.InputField
21+
}
22+
23+
// NewTaskDetailHeader initializes and configures a TaskDetailHeader
24+
func NewTaskDetailHeader(taskRepo repository.TaskRepository) *TaskDetailHeader {
25+
header := TaskDetailHeader{
26+
Flex: tview.NewFlex().SetDirection(tview.FlexRow),
27+
pages: tview.NewPages(),
28+
taskName: tview.NewTextView().SetDynamicColors(true),
29+
taskRepo: taskRepo,
30+
renameText: makeLightTextInput("Task title"),
31+
}
32+
33+
header.pages.AddPage("title", header.taskName, true, true)
34+
header.pages.AddPage("rename", header.renameText, true, false)
35+
header.bindRenameEvent()
36+
37+
buttons := tview.NewFlex().
38+
AddItem(tview.NewTextView().SetTextColor(tcell.ColorDimGray).SetText("r = Rename"), 0, 1, false).
39+
AddItem(blankCell, 0, 1, false).
40+
AddItem(makeButton("rename", func() { header.ShowRename() }), 8, 0, false)
41+
42+
header.
43+
AddItem(header.pages, 1, 1, true).
44+
AddItem(blankCell, 1, 0, true).
45+
AddItem(buttons, 1, 1, false).
46+
AddItem(makeHorizontalLine(tcell.RuneS3, tcell.ColorGray), 1, 1, false)
47+
48+
return &header
49+
}
50+
51+
func (header *TaskDetailHeader) bindRenameEvent() *tview.InputField {
52+
return header.renameText.SetDoneFunc(func(key tcell.Key) {
53+
switch key {
54+
case tcell.KeyEnter:
55+
name := header.renameText.GetText()
56+
if len(name) < 3 {
57+
statusBar.showForSeconds("[red::]Task title should be at least 3 character", 5)
58+
return
59+
}
60+
61+
if err := header.taskRepo.UpdateField(header.task, "Title", name); err != nil {
62+
statusBar.showForSeconds("Could not update Task Title: "+err.Error(), 5)
63+
} else {
64+
header.task.Title = name
65+
statusBar.showForSeconds("[yellow::]Task Title Updated.", 5)
66+
}
67+
68+
header.pages.SwitchToPage("title")
69+
taskPane.ReloadCurrentTask()
70+
case tcell.KeyEsc:
71+
header.pages.SwitchToPage("title")
72+
}
73+
})
74+
}
75+
76+
// SetTask set a task to the header
77+
func (header *TaskDetailHeader) SetTask(task *model.Task) {
78+
header.task = task
79+
header.taskName.SetText(task.Title)
80+
header.taskName.SetText(fmt.Sprintf("[%s::b]# %s", getTaskTitleColor(*task), task.Title))
81+
}
82+
83+
// ShowRename activate edit option of task title
84+
func (header *TaskDetailHeader) ShowRename() {
85+
header.renameText.SetText(header.task.Title)
86+
header.pages.SwitchToPage("rename")
87+
app.SetFocus(header.renameText)
88+
}

app/tasks.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,6 @@ func NewTaskPane(projectRepo repository.ProjectRepository, taskRepo repository.T
6363
case tcell.KeyEsc:
6464
app.SetFocus(pane)
6565
}
66-
6766
})
6867

6968
pane.
@@ -196,6 +195,12 @@ func (pane *TaskPane) ClearCompletedTasks() {
196195
statusBar.showForSeconds(fmt.Sprintf("[yellow]%d tasks cleared!", count), 5)
197196
}
198197

198+
// ReloadCurrentTask Loads the current task - in Task details and listing
199+
func (pane *TaskPane) ReloadCurrentTask() {
200+
pane.list.SetItemText(pane.list.GetCurrentItem(), makeTaskListingTitle(*pane.activeTask), "")
201+
taskDetailPane.SetTask(pane.activeTask)
202+
}
203+
199204
func (pane TaskPane) setHintMessage() {
200205
if len(projectPane.projects) == 0 {
201206
pane.hint.SetText("Welcome to the organized life!\n------------------------------\n Create TaskList/Project at the bottom of Projects pane.\n (Press p,n) \n\nHelp - https://bit.ly/cli-task")

app/util.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,11 +97,11 @@ func makeTaskListingTitle(task model.Task) string {
9797
prefix := ""
9898
if projectPane.GetActiveProject() == nil {
9999
if project, err := projectRepo.GetByID(task.ProjectID); err == nil {
100-
prefix = project.Title + ":"
100+
prefix = project.Title + ": "
101101
}
102102
}
103103

104-
return fmt.Sprintf("[%s] %s %s %s", getTaskTitleColor(task), prefix, checkbox, task.Title)
104+
return fmt.Sprintf("[%s]%s %s%s", getTaskTitleColor(task), checkbox, prefix, task.Title)
105105
}
106106

107107
func findProjectByID(id int64) *model.Project {

0 commit comments

Comments
 (0)