Compare commits

..

No commits in common. "a632c576552f25945a60336e12cf1d3eb45d5d32" and "f956b7da59a6a217f6d9314d07ac787ce5152649" have entirely different histories.

3 changed files with 58 additions and 109 deletions

View file

@ -13,16 +13,6 @@ output:
sort-results: true sort-results: true
linters-settings: linters-settings:
depguard:
rules:
main:
files:
- $all
allow:
- $gostd
- codeflow.dananglin.me.uk/apollo/pelican
- github.com/gdamore/tcell/v2
- github.com/rivo/tview
exhaustivestruct: exhaustivestruct:
struct-patterns: struct-patterns:
- 'forge.dananglin.me.uk/code/dananglin/pelican.Status' - 'forge.dananglin.me.uk/code/dananglin/pelican.Status'

View file

@ -5,23 +5,15 @@ import (
"github.com/rivo/tview" "github.com/rivo/tview"
) )
type cardModalMode int type modalInput struct {
const (
create cardModalMode = iota
edit
)
type cardModal struct {
*tview.Form *tview.Form
frame *tview.Frame frame *tview.Frame
title string title string
description string description string
done func(string, string, bool, cardModalMode) done func(string, string, bool)
mode cardModalMode
} }
func newCardModal() *cardModal { func newModalInput() *modalInput {
var ( var (
background = tcell.ColorBlack.TrueColor() background = tcell.ColorBlack.TrueColor()
buttonBackground = tcell.ColorBlueViolet.TrueColor() buttonBackground = tcell.ColorBlueViolet.TrueColor()
@ -32,13 +24,12 @@ func newCardModal() *cardModal {
form = tview.NewForm() form = tview.NewForm()
) )
modal := cardModal{ modal := modalInput{
Form: form, Form: form,
frame: tview.NewFrame(form), frame: tview.NewFrame(form),
title: "", title: "",
description: "", description: "",
done: nil, done: nil,
mode: create,
} }
// Stylise the buttons // Stylise the buttons
@ -60,39 +51,49 @@ func newCardModal() *cardModal {
SetBackgroundColor(background). SetBackgroundColor(background).
SetBorderPadding(1, 1, 1, 1) SetBorderPadding(1, 1, 1, 1)
modal.AddButton("Save", func() { modal.AddButton("Create card", func() {
if modal.done != nil { if modal.done != nil {
modal.done(modal.title, modal.description, true, modal.mode) modal.done(modal.title, modal.description, true)
} }
modal.reset()
}) })
modal.AddButton("Cancel", func() { modal.AddButton("Cancel", func() {
if modal.done != nil { if modal.done != nil {
modal.done(modal.title, modal.description, false, modal.mode) modal.done(modal.title, modal.description, false)
} }
modal.reset()
}) })
modal.addInputFields()
modal.frame.SetTitle(" New Card ")
return &modal return &modal
} }
func (m *cardModal) updateInputFields(title, description string) { func (m *modalInput) reset() {
m.Clear(false) m.Clear(false)
m.AddInputField("Title", title, 60, nil, func(text string) { m.addInputFields()
}
func (m *modalInput) addInputFields() {
m.AddInputField("Title", "", 60, nil, func(text string) {
m.title = text m.title = text
}) })
m.AddTextArea("Description", description, 60, 10, 0, func(text string) { m.AddTextArea("Description", "", 60, 10, 0, func(text string) {
m.description = text m.description = text
}) })
} }
func (m *cardModal) setDoneFunc(handler func(string, string, bool, cardModalMode)) *cardModal { func (m *modalInput) SetDoneFunc(handler func(string, string, bool)) *modalInput {
m.done = handler m.done = handler
return m return m
} }
func (m *cardModal) Draw(screen tcell.Screen) { func (m *modalInput) Draw(screen tcell.Screen) {
buttonsWidth := 20 buttonsWidth := 20
screenWidth, screenHeight := screen.Size() screenWidth, screenHeight := screen.Size()
width := screenWidth / 3 width := screenWidth / 3

View file

@ -26,8 +26,8 @@ const (
const ( const (
mainPage string = "main" mainPage string = "main"
quitPage string = "quit" quitPage string = "quit"
cardModalPage string = "card modal" addPage string = "add"
deleteCardModalPage string = "delete card modal" deleteCardPage string = "delete card"
) )
type UI struct { type UI struct {
@ -40,7 +40,7 @@ type UI struct {
board board.Board board board.Board
mode boardMode mode boardMode
quitModal *tview.Modal quitModal *tview.Modal
cardModal *cardModal addModal *modalInput
deleteCardModal *tview.Modal deleteCardModal *tview.Modal
statusSelection statusSelection statusSelection statusSelection
} }
@ -57,7 +57,7 @@ func NewUI(path string) (UI, error) {
pages: tview.NewPages(), pages: tview.NewPages(),
flex: tview.NewFlex(), flex: tview.NewFlex(),
quitModal: tview.NewModal(), quitModal: tview.NewModal(),
cardModal: newCardModal(), addModal: newModalInput(),
focusedColumn: 0, focusedColumn: 0,
columns: nil, columns: nil,
board: kanban, board: kanban,
@ -95,11 +95,8 @@ func (u *UI) init() error {
u.shiftColumnFocus(next) u.shiftColumnFocus(next)
case letter == 'c': case letter == 'c':
if u.mode == normal { if u.mode == normal {
u.cardModal.mode = create u.pages.ShowPage(addPage)
u.cardModal.updateInputFields("", "") u.SetFocus(u.addModal)
u.cardModal.frame.SetTitle(" Create Card ")
u.pages.ShowPage(cardModalPage)
u.SetFocus(u.cardModal)
} }
case letter == 'm': case letter == 'm':
if u.mode == normal { if u.mode == normal {
@ -108,20 +105,9 @@ func (u *UI) init() error {
u.statusSelection.currentStatusID = u.columns[u.focusedColumn].statusID u.statusSelection.currentStatusID = u.columns[u.focusedColumn].statusID
u.mode = selection u.mode = selection
} }
case letter == 'e':
if u.mode == normal {
u.cardModal.mode = edit
focusedCard := u.columns[u.focusedColumn].focusedCard
cardID := u.columns[u.focusedColumn].cards[focusedCard].id
card, _ := u.board.Card(cardID)
u.cardModal.updateInputFields(card.Title, card.Description)
u.cardModal.frame.SetTitle(" Edit Card ")
u.pages.ShowPage(cardModalPage)
u.SetFocus(u.cardModal)
}
case key == tcell.KeyCtrlD: case key == tcell.KeyCtrlD:
if u.mode == normal { if u.mode == normal {
u.pages.ShowPage(deleteCardModalPage) u.pages.ShowPage(deleteCardPage)
u.SetFocus(u.deleteCardModal) u.SetFocus(u.deleteCardModal)
} }
case key == tcell.KeyCtrlQ: case key == tcell.KeyCtrlQ:
@ -153,11 +139,11 @@ func (u *UI) init() error {
u.initQuitModal() u.initQuitModal()
u.pages.AddPage(quitPage, u.quitModal, false, false) u.pages.AddPage(quitPage, u.quitModal, false, false)
u.initCardModal() u.initAddInputModal()
u.pages.AddPage(cardModalPage, u.cardModal, false, false) u.pages.AddPage(addPage, u.addModal, false, false)
u.initDeleteCardModal() u.initDeleteCardModal()
u.pages.AddPage(deleteCardModalPage, u.deleteCardModal, false, false) u.pages.AddPage(deleteCardPage, u.deleteCardModal, false, false)
u.SetRoot(u.pages, true) u.SetRoot(u.pages, true)
@ -168,25 +154,18 @@ func (u *UI) init() error {
return nil return nil
} }
// initCardModal initialises the card modal. // initAddInputModal initialises the add input modal.
func (u *UI) initCardModal() { func (u *UI) initAddInputModal() {
doneFunc := func(title, description string, success bool, mode cardModalMode) { doneFunc := func(text, description string, success bool) {
if success { if success {
switch mode { _ = u.newCard(text, description)
case create:
_ = u.newCard(title, description)
case edit:
focusedCard := u.columns[u.focusedColumn].focusedCard
cardID := u.columns[u.focusedColumn].cards[focusedCard].id
_ = u.editCard(cardID, title, description)
}
} }
u.pages.HidePage(cardModalPage) u.pages.HidePage(addPage)
u.setColumnFocus() u.setColumnFocus()
} }
u.cardModal.setDoneFunc(doneFunc) u.addModal.SetDoneFunc(doneFunc)
} }
// initDeleteCardModal initialises the modal for deleting cards. // initDeleteCardModal initialises the modal for deleting cards.
@ -197,7 +176,7 @@ func (u *UI) initDeleteCardModal() {
_ = u.refresh(true) _ = u.refresh(true)
} }
u.pages.HidePage(deleteCardModalPage) u.pages.HidePage(deleteCardPage)
u.setColumnFocus() u.setColumnFocus()
} }
@ -206,6 +185,20 @@ func (u *UI) initDeleteCardModal() {
SetDoneFunc(doneFunc) SetDoneFunc(doneFunc)
} }
// deleteCard deletes a card from the board.
func (u *UI) deleteCard() {
statusID := u.columns[u.focusedColumn].statusID
focusedCard := u.columns[u.focusedColumn].focusedCard
cardID := u.columns[u.focusedColumn].cards[focusedCard].id
args := board.DeleteCardArgs{
CardID: cardID,
StatusID: statusID,
}
_ = u.board.DeleteCard(args)
}
// initQuitModal initialises the quit modal. // initQuitModal initialises the quit modal.
func (u *UI) initQuitModal() { func (u *UI) initQuitModal() {
doneFunc := func(_ int, buttonLabel string) { doneFunc := func(_ int, buttonLabel string) {
@ -224,10 +217,10 @@ func (u *UI) initQuitModal() {
} }
// newCard creates and saves a new card to the database. // newCard creates and saves a new card to the database.
func (u *UI) newCard(title, description string) error { func (u *UI) newCard(title, content string) error {
args := board.CardArgs{ args := board.CardArgs{
NewTitle: title, NewTitle: title,
NewDescription: description, NewDescription: content,
} }
if _, err := u.board.CreateCard(args); err != nil { if _, err := u.board.CreateCard(args); err != nil {
@ -239,40 +232,6 @@ func (u *UI) newCard(title, description string) error {
return nil return nil
} }
// editCard saves and edited card to the database.
func (u *UI) editCard(cardID int, title, description string) error {
args := board.UpdateCardArgs{
CardID: cardID,
CardArgs: board.CardArgs{
NewTitle: title,
NewDescription: description,
},
}
if err := u.board.UpdateCard(args); err != nil {
return fmt.Errorf("unable to edit card with ID: %d; %w", cardID, err)
}
_ = u.refresh(true)
return nil
}
// deleteCard deletes a card from the board.
func (u *UI) deleteCard() {
statusID := u.columns[u.focusedColumn].statusID
focusedCard := u.columns[u.focusedColumn].focusedCard
cardID := u.columns[u.focusedColumn].cards[focusedCard].id
args := board.DeleteCardArgs{
CardID: cardID,
StatusID: statusID,
}
_ = u.board.DeleteCard(args)
}
// initColumns initialises the columns of the Kanban board.
func (u *UI) initColumns() error { func (u *UI) initColumns() error {
u.flex.Clear() u.flex.Clear()
@ -358,7 +317,6 @@ func (u *UI) shutdown() {
u.Stop() u.Stop()
} }
// boardMode returns the current board mode.
func (u *UI) boardMode() boardMode { func (u *UI) boardMode() boardMode {
return u.mode return u.mode
} }