package main import ( "fmt" "github.com/asdine/storm/v3" "github.com/gdamore/tcell" "github.com/rivo/tview" "github.com/ajaxray/geek-life/model" "github.com/ajaxray/geek-life/repository" ) type TaskPane struct { *tview.Flex list *tview.List tasks []model.Task activeTask *model.Task newTask *tview.InputField projectRepo repository.ProjectRepository taskRepo repository.TaskRepository } func NewTaskPane(projectRepo repository.ProjectRepository, taskRepo repository.TaskRepository) *TaskPane { pane := TaskPane{ Flex: tview.NewFlex().SetDirection(tview.FlexRow), list: tview.NewList().ShowSecondaryText(false), newTask: makeLightTextInput("+[New Task]"), projectRepo: projectRepo, taskRepo: taskRepo, } pane.list.SetDoneFunc(func() { app.SetFocus(projectPane) }) pane.newTask.SetDoneFunc(func(key tcell.Key) { switch key { case tcell.KeyEnter: name := pane.newTask.GetText() if len(name) < 3 { statusBar.showForSeconds("[red::]Task title should be at least 3 character", 5) return } task, err := taskRepo.Create(*projectPane.activeProject, name, "", "", 0) if err != nil { statusBar.showForSeconds("[red::]Could not create Task:"+err.Error(), 5) } pane.tasks = append(pane.tasks, task) pane.addTaskToList(len(pane.tasks) - 1) pane.newTask.SetText("") case tcell.KeyEsc: app.SetFocus(pane) } }) pane. AddItem(pane.list, 0, 1, true). AddItem(pane.newTask, 1, 0, false) pane.SetBorder(true).SetTitle("[::u]T[::-]asks") return &pane } func (pane *TaskPane) ClearList() { pane.list.Clear() pane.tasks = nil } func (pane *TaskPane) SetList(tasks []model.Task) { pane.ClearList() pane.tasks = tasks for i := range pane.tasks { pane.addTaskToList(i) } } func (pane *TaskPane) addTaskToList(i int) *tview.List { return pane.list.AddItem(makeTaskListingTitle(pane.tasks[i]), "", 0, func(taskidx int) func() { return func() { taskPane.ActivateTask(taskidx) } }(i)) } func (pane *TaskPane) handleShortcuts(event *tcell.EventKey) *tcell.EventKey { switch event.Rune() { case 'n': app.SetFocus(pane.newTask) } return event } func (pane *TaskPane) LoadProjectTasks(project model.Project) { var tasks []model.Task var err error if tasks, err = taskRepo.GetAllByProject(project); err != nil && err != storm.ErrNotFound { statusBar.showForSeconds("[red::]Error: "+err.Error(), 5) } else { pane.SetList(tasks) } } func (pane *TaskPane) ActivateTask(idx int) { removeThirdCol() pane.activeTask = &pane.tasks[idx] taskDetailPane.SetTask(pane.activeTask) contents.AddItem(taskDetailPane, 0, 3, false) } func (pane *TaskPane) ClearCompletedTasks() { count := 0 for i, task := range pane.tasks { if task.Completed && pane.taskRepo.Delete(&pane.tasks[i]) == nil { pane.list.RemoveItem(i) count++ } } statusBar.showForSeconds(fmt.Sprintf("[yellow]%d tasks cleared!", count), 5) }