github.com/wtfutil/wtf@v0.43.0/modules/jenkins/widget.go (about) 1 package jenkins 2 3 import ( 4 "fmt" 5 "net/url" 6 7 "github.com/rivo/tview" 8 "github.com/wtfutil/wtf/utils" 9 "github.com/wtfutil/wtf/view" 10 ) 11 12 type Widget struct { 13 view.ScrollableWidget 14 15 settings *Settings 16 view *View 17 err error 18 } 19 20 func NewWidget(tviewApp *tview.Application, redrawChan chan bool, pages *tview.Pages, settings *Settings) *Widget { 21 widget := Widget{ 22 ScrollableWidget: view.NewScrollableWidget(tviewApp, redrawChan, pages, settings.Common), 23 24 settings: settings, 25 } 26 27 widget.SetRenderFunction(widget.Render) 28 widget.initializeKeyboardControls() 29 30 return &widget 31 } 32 33 /* -------------------- Exported Functions -------------------- */ 34 35 func (widget *Widget) Refresh() { 36 if widget.Disabled() { 37 return 38 } 39 40 view, err := widget.Create( 41 widget.settings.url, 42 widget.settings.user, 43 widget.settings.apiKey, 44 ) 45 widget.view = view 46 47 if err != nil { 48 widget.err = err 49 widget.SetItemCount(0) 50 } else { 51 widget.SetItemCount(len(widget.view.Jobs)) 52 } 53 54 widget.Render() 55 } 56 57 /* -------------------- Unexported Functions -------------------- */ 58 59 func (widget *Widget) Render() { 60 widget.Redraw(widget.content) 61 } 62 63 func (widget *Widget) content() (string, string, bool) { 64 title := fmt.Sprintf("%s: [red]%s", widget.CommonSettings().Title, widget.view.Name) 65 if widget.err != nil { 66 return title, widget.err.Error(), true 67 } 68 if widget.view == nil || len(widget.view.Jobs) == 0 { 69 return title, "No content to display", false 70 } 71 72 var str string 73 jobs := widget.view.Jobs 74 for idx, job := range jobs { 75 jobName, _ := url.QueryUnescape(job.Name) 76 77 row := fmt.Sprintf( 78 `[%s] [%s]%-6s[white]`, 79 widget.RowColor(idx), 80 widget.jobColor(job), 81 jobName, 82 ) 83 84 str += utils.HighlightableHelper(widget.View, row, idx, len(job.Name)) 85 } 86 87 return title, str, false 88 } 89 90 func (widget *Widget) jobColor(job Job) string { 91 switch job.Color { 92 case "blue": 93 // Override color if successBallColor boolean param provided in config 94 return widget.settings.successBallColor 95 case "red": 96 return "red" 97 default: 98 return "white" 99 } 100 } 101 102 func (widget *Widget) openJob() { 103 sel := widget.GetSelected() 104 if sel >= 0 && widget.view != nil && sel < len(widget.view.Jobs) { 105 job := &widget.view.Jobs[sel] 106 utils.OpenFile(job.Url) 107 } 108 }