166 lines
4.6 KiB
Go
166 lines
4.6 KiB
Go
package widgets
|
|
|
|
import (
|
|
"ArinDash/apis/kaneo"
|
|
"ArinDash/util"
|
|
"context"
|
|
"fmt"
|
|
"sort"
|
|
"strings"
|
|
"time"
|
|
|
|
"github.com/mum4k/termdash/cell"
|
|
"github.com/mum4k/termdash/terminal/terminalapi"
|
|
"github.com/mum4k/termdash/widgetapi"
|
|
"github.com/mum4k/termdash/widgets/text"
|
|
)
|
|
|
|
type BoardOptions struct {
|
|
}
|
|
|
|
func Board() BoardOptions {
|
|
widgetOptions["BoardOptions"] = createBoard
|
|
return BoardOptions{}
|
|
}
|
|
|
|
func createBoard(ctx context.Context, _ terminalapi.Terminal, _ interface{}) widgetapi.Widget {
|
|
widget := util.PanicOnErrorWithResult(NewBoardText())
|
|
go util.Periodic(ctx, 1*time.Minute, func() error {
|
|
widget.Reset()
|
|
widget.board = kaneo.FetchBoard()
|
|
if widget.board.Status != "ok" {
|
|
if err := widget.Write("Error:"+widget.board.Status, text.WriteCellOpts(cell.FgColor(cell.ColorRed))); err != nil {
|
|
return nil
|
|
}
|
|
}
|
|
|
|
sort.Slice(widget.board.Columns, func(i, j int) bool {
|
|
return widget.board.Columns[i].Position < widget.board.Columns[j].Position
|
|
})
|
|
|
|
colWidth := 66 / len(widget.board.Columns)
|
|
|
|
if err := widget.Write("┌"+strings.Repeat(strings.Repeat("─", colWidth)+"┬", len(widget.board.Columns)-1)+strings.Repeat("─", colWidth)+"┐\n", text.WriteCellOpts(cell.FgColor(cell.ColorWhite))); err != nil {
|
|
return err
|
|
}
|
|
|
|
if err := widget.Write("│", text.WriteCellOpts(cell.FgColor(cell.ColorWhite))); err != nil {
|
|
return nil
|
|
}
|
|
for i, column := range widget.board.Columns {
|
|
if i != 0 {
|
|
if err := widget.Write("│", text.WriteCellOpts(cell.FgColor(cell.ColorWhite))); err != nil {
|
|
return nil
|
|
}
|
|
}
|
|
name := column.Name
|
|
if len(name) > colWidth {
|
|
name = name[0:colWidth-2] + ".."
|
|
}
|
|
if len(name) < colWidth {
|
|
name = name + strings.Repeat(" ", colWidth-len(name))
|
|
}
|
|
|
|
if err := widget.Write(name, text.WriteCellOpts(cell.FgColor(cell.ColorWhite))); err != nil {
|
|
return nil
|
|
}
|
|
}
|
|
if err := widget.Write("│\n", text.WriteCellOpts(cell.FgColor(cell.ColorWhite))); err != nil {
|
|
return nil
|
|
}
|
|
|
|
if err := writeMiddle(widget, colWidth, widget.board.Columns); err != nil {
|
|
return err
|
|
}
|
|
|
|
for i := range 10 {
|
|
if i != 0 {
|
|
if err := writeMiddle(widget, colWidth, widget.board.Columns); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
if err := widget.Write("│", text.WriteCellOpts(cell.FgColor(cell.ColorWhite))); err != nil {
|
|
return nil
|
|
}
|
|
for j, column := range widget.board.Columns {
|
|
sort.Slice(column.Tasks, func(i, j int) bool {
|
|
return column.Tasks[i].Position < column.Tasks[j].Position
|
|
})
|
|
|
|
if j != 0 {
|
|
if err := widget.Write("│", text.WriteCellOpts(cell.FgColor(cell.ColorWhite))); err != nil {
|
|
return nil
|
|
}
|
|
}
|
|
if len(column.Tasks) > i {
|
|
title := column.Tasks[i].Title
|
|
if len(title) > colWidth {
|
|
title = title[0:colWidth-2] + ".."
|
|
}
|
|
if len(title) < colWidth {
|
|
title = title + strings.Repeat(" ", colWidth-len(title))
|
|
}
|
|
|
|
color := cell.ColorGreen
|
|
durr := int(column.Tasks[i].DueDate.Sub(time.Now()).Hours() / 24)
|
|
if durr < 14 && !column.IsFinal {
|
|
color = cell.ColorRed
|
|
d := fmt.Sprintf("%02dd", durr)
|
|
title = title[0:colWidth-3] + d
|
|
}
|
|
if durr < 28 && !column.IsFinal {
|
|
color = cell.ColorYellow
|
|
d := fmt.Sprintf("%02dd", durr)
|
|
title = title[0:colWidth-3] + d
|
|
}
|
|
|
|
if err := widget.Write(title, text.WriteCellOpts(cell.FgColor(color))); err != nil {
|
|
return nil
|
|
}
|
|
} else {
|
|
if err := widget.Write(strings.Repeat(" ", colWidth), text.WriteCellOpts(cell.FgColor(cell.ColorWhite))); err != nil {
|
|
return nil
|
|
}
|
|
}
|
|
}
|
|
if err := widget.Write("│\n", text.WriteCellOpts(cell.FgColor(cell.ColorWhite))); err != nil {
|
|
return nil
|
|
}
|
|
}
|
|
|
|
if err := writeBottom(widget, colWidth, widget.board.Columns); err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
})
|
|
return widget
|
|
}
|
|
|
|
func writeMiddle(widget *BoardText, colWidth int, columns []kaneo.Column) error {
|
|
if err := widget.Write("├"+strings.Repeat(strings.Repeat("─", colWidth)+"┼", len(columns)-1)+strings.Repeat("─", colWidth)+"┤\n", text.WriteCellOpts(cell.FgColor(cell.ColorWhite))); err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func writeBottom(widget *BoardText, colWidth int, columns []kaneo.Column) error {
|
|
if err := widget.Write("└"+strings.Repeat(strings.Repeat("─", colWidth)+"┴", len(columns)-1)+strings.Repeat("─", colWidth)+"┘\n", text.WriteCellOpts(cell.FgColor(cell.ColorWhite))); err != nil {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
type BoardText struct {
|
|
*text.Text
|
|
Selected int
|
|
board kaneo.Board
|
|
}
|
|
|
|
func NewBoardText(opts ...text.Option) (*BoardText, error) {
|
|
t, err := text.New(opts...)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &BoardText{Text: t}, nil
|
|
}
|