tui.go 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. package issues
  2. import (
  3. "fmt"
  4. "strings"
  5. "github.com/charmbracelet/bubbles/viewport"
  6. tea "github.com/charmbracelet/bubbletea"
  7. "github.com/charmbracelet/lipgloss"
  8. )
  9. // The main bubbletea Model
  10. type Model struct {
  11. Issue Issue
  12. Path string
  13. viewport viewport.Model
  14. }
  15. func (m Model) Init() tea.Cmd { return nil }
  16. // Handles quit logic and viewport scroll and size updates
  17. func (m Model) Update(msg tea.Msg) (tea.Model, tea.Cmd) {
  18. switch msg.(type) {
  19. case tea.KeyMsg:
  20. return m, tea.Quit
  21. }
  22. return m, nil
  23. }
  24. // [lipgloss] style definitions
  25. var (
  26. titleStyle = lipgloss.NewStyle().
  27. Bold(true).
  28. Underline(true)
  29. statusStyle = lipgloss.NewStyle().
  30. Faint(true).
  31. Italic(true)
  32. variadicTitleStyle = lipgloss.NewStyle().
  33. Align(lipgloss.Left).
  34. Italic(true)
  35. variadicDataStyle = lipgloss.NewStyle().
  36. Width(40).
  37. BorderStyle(lipgloss.ASCIIBorder())
  38. borderStyle = lipgloss.NewStyle().
  39. Padding(1, 2).
  40. Margin(1).
  41. BorderStyle(lipgloss.NormalBorder())
  42. )
  43. // Handles all view logic for [issue.Issue]
  44. func (m Model) renderIssue() string {
  45. var output string
  46. // title
  47. output = output + titleStyle.Render(m.Issue.Title)
  48. // status
  49. output = output + fmt.Sprintf("\n%s", statusStyle.Render(m.Issue.Status.Data))
  50. // variadics
  51. var tags string
  52. for _, field := range m.Issue.Tags.Fields {
  53. tags = tags + field.Path + ", "
  54. }
  55. tags = strings.TrimRight(tags, ", ")
  56. var blockedby string
  57. for _, field := range m.Issue.Blockedby.Fields {
  58. blockedby = blockedby + field.Path + ", "
  59. }
  60. blockedby = strings.TrimRight(blockedby, ", ")
  61. if len(m.Issue.Tags.Fields) > 0 {
  62. output = output + variadicTitleStyle.Render("\n\nTags:")
  63. output = output + fmt.Sprintf("\n%s", variadicDataStyle.Render(tags))
  64. }
  65. if len(m.Issue.Blockedby.Fields) > 0 {
  66. output = output + variadicTitleStyle.Render("\n\nBlockedby:")
  67. output = output + fmt.Sprintf("\n%s", variadicDataStyle.Render(blockedby))
  68. }
  69. // description
  70. output = output + titleStyle.Render("\n\nDescription:\n")
  71. output = output + fmt.Sprintf("\n%s", m.Issue.Description.Data)
  72. return borderStyle.Render(output)
  73. }
  74. // Wraps [issue.Model.renderIssue] in a viewport
  75. func (m Model) View() string {
  76. return m.renderIssue()
  77. }