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
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:
struct-patterns:
- 'forge.dananglin.me.uk/code/dananglin/pelican.Status'

View file

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

View file

@ -24,10 +24,10 @@ const (
)
const (
mainPage string = "main"
quitPage string = "quit"
cardModalPage string = "card modal"
deleteCardModalPage string = "delete card modal"
mainPage string = "main"
quitPage string = "quit"
addPage string = "add"
deleteCardPage string = "delete card"
)
type UI struct {
@ -40,7 +40,7 @@ type UI struct {
board board.Board
mode boardMode
quitModal *tview.Modal
cardModal *cardModal
addModal *modalInput
deleteCardModal *tview.Modal
statusSelection statusSelection
}
@ -57,7 +57,7 @@ func NewUI(path string) (UI, error) {
pages: tview.NewPages(),
flex: tview.NewFlex(),
quitModal: tview.NewModal(),
cardModal: newCardModal(),
addModal: newModalInput(),
focusedColumn: 0,
columns: nil,
board: kanban,
@ -95,11 +95,8 @@ func (u *UI) init() error {
u.shiftColumnFocus(next)
case letter == 'c':
if u.mode == normal {
u.cardModal.mode = create
u.cardModal.updateInputFields("", "")
u.cardModal.frame.SetTitle(" Create Card ")
u.pages.ShowPage(cardModalPage)
u.SetFocus(u.cardModal)
u.pages.ShowPage(addPage)
u.SetFocus(u.addModal)
}
case letter == 'm':
if u.mode == normal {
@ -108,20 +105,9 @@ func (u *UI) init() error {
u.statusSelection.currentStatusID = u.columns[u.focusedColumn].statusID
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:
if u.mode == normal {
u.pages.ShowPage(deleteCardModalPage)
u.pages.ShowPage(deleteCardPage)
u.SetFocus(u.deleteCardModal)
}
case key == tcell.KeyCtrlQ:
@ -153,11 +139,11 @@ func (u *UI) init() error {
u.initQuitModal()
u.pages.AddPage(quitPage, u.quitModal, false, false)
u.initCardModal()
u.pages.AddPage(cardModalPage, u.cardModal, false, false)
u.initAddInputModal()
u.pages.AddPage(addPage, u.addModal, false, false)
u.initDeleteCardModal()
u.pages.AddPage(deleteCardModalPage, u.deleteCardModal, false, false)
u.pages.AddPage(deleteCardPage, u.deleteCardModal, false, false)
u.SetRoot(u.pages, true)
@ -168,25 +154,18 @@ func (u *UI) init() error {
return nil
}
// initCardModal initialises the card modal.
func (u *UI) initCardModal() {
doneFunc := func(title, description string, success bool, mode cardModalMode) {
// initAddInputModal initialises the add input modal.
func (u *UI) initAddInputModal() {
doneFunc := func(text, description string, success bool) {
if success {
switch mode {
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.newCard(text, description)
}
u.pages.HidePage(cardModalPage)
u.pages.HidePage(addPage)
u.setColumnFocus()
}
u.cardModal.setDoneFunc(doneFunc)
u.addModal.SetDoneFunc(doneFunc)
}
// initDeleteCardModal initialises the modal for deleting cards.
@ -197,7 +176,7 @@ func (u *UI) initDeleteCardModal() {
_ = u.refresh(true)
}
u.pages.HidePage(deleteCardModalPage)
u.pages.HidePage(deleteCardPage)
u.setColumnFocus()
}
@ -206,6 +185,20 @@ func (u *UI) initDeleteCardModal() {
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.
func (u *UI) initQuitModal() {
doneFunc := func(_ int, buttonLabel string) {
@ -224,10 +217,10 @@ func (u *UI) initQuitModal() {
}
// 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{
NewTitle: title,
NewDescription: description,
NewTitle: title,
NewDescription: content,
}
if _, err := u.board.CreateCard(args); err != nil {
@ -239,40 +232,6 @@ func (u *UI) newCard(title, description string) error {
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 {
u.flex.Clear()
@ -358,7 +317,6 @@ func (u *UI) shutdown() {
u.Stop()
}
// boardMode returns the current board mode.
func (u *UI) boardMode() boardMode {
return u.mode
}