tui.go 2.1 KB

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