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  }