package widgets import ( "ArinDash/apis/kaneo" "ArinDash/util" "context" "fmt" "math" "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)) } fgColor := cell.ColorGreen bgColor := cell.ColorBlack durr := int(column.Tasks[i].DueDate.Sub(time.Now()).Hours() / 24) if durr < 0 { durr = math.MaxInt } if durr < 14 && !column.IsFinal { fgColor = cell.ColorBlack bgColor = cell.ColorRed d := fmt.Sprintf("%02dd", durr) title = title[0:colWidth-3] + d } if durr < 28 && !column.IsFinal { bgColor = cell.ColorYellow fgColor = cell.ColorBlack d := fmt.Sprintf("%02dd", durr) title = title[0:colWidth-3] + d } if column.IsFinal { bgColor = cell.ColorBlack fgColor = cell.ColorGray } if err := widget.Write(title, text.WriteCellOpts(cell.FgColor(fgColor), cell.BgColor(bgColor), cell.Bold())); 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 }