github.com/wtfutil/wtf@v0.43.0/modules/zendesk/widget.go (about) 1 package zendesk 2 3 import ( 4 "fmt" 5 6 "github.com/rivo/tview" 7 "github.com/wtfutil/wtf/utils" 8 "github.com/wtfutil/wtf/view" 9 ) 10 11 // A Widget represents a Zendesk widget 12 type Widget struct { 13 view.ScrollableWidget 14 15 result *TicketArray 16 settings *Settings 17 err error 18 } 19 20 // NewWidget creates a new instance of a widget 21 func NewWidget(tviewApp *tview.Application, redrawChan chan bool, pages *tview.Pages, settings *Settings) *Widget { 22 widget := Widget{ 23 ScrollableWidget: view.NewScrollableWidget(tviewApp, redrawChan, pages, settings.Common), 24 25 settings: settings, 26 } 27 28 widget.SetRenderFunction(widget.Render) 29 30 widget.initializeKeyboardControls() 31 32 return &widget 33 } 34 35 /* -------------------- Exported Functions -------------------- */ 36 37 func (widget *Widget) Refresh() { 38 ticketArray, err := widget.newTickets() 39 ticketArray.Count = len(ticketArray.Tickets) 40 widget.err = err 41 widget.result = ticketArray 42 widget.Render() 43 } 44 45 /* -------------------- Unexported Functions -------------------- */ 46 47 func (widget *Widget) Render() { 48 widget.Redraw(widget.content) 49 } 50 51 func (widget *Widget) content() (string, string, bool) { 52 title := fmt.Sprintf("%s (%d)", widget.CommonSettings().Title, widget.result.Count) 53 if widget.err != nil { 54 return title, widget.err.Error(), true 55 } 56 57 items := widget.result.Tickets 58 if len(items) == 0 { 59 return title, "No unassigned tickets in queue - woop!!", false 60 } 61 62 str := "" 63 for idx, data := range items { 64 str += widget.format(data, idx) 65 } 66 67 return title, str, false 68 } 69 70 func (widget *Widget) format(ticket Ticket, idx int) string { 71 textColor := widget.settings.Colors.Background 72 if idx == widget.GetSelected() { 73 textColor = widget.settings.Colors.BorderTheme.Focused 74 } 75 76 requesterName := widget.parseRequester(ticket) 77 str := fmt.Sprintf(" [%s:]%d - %s\n %s\n\n", textColor, ticket.Id, requesterName, ticket.Subject) 78 return str 79 } 80 81 // this is a nasty means of extracting the actual name of the requester from the Via interface of the Ticket. 82 // very very open to improvements on this 83 func (widget *Widget) parseRequester(ticket Ticket) interface{} { 84 viaMap := ticket.Via 85 via := viaMap.(map[string]interface{}) 86 source := via["source"] 87 fromMap, _ := source.(map[string]interface{}) 88 from := fromMap["from"] 89 fromValMap := from.(map[string]interface{}) 90 fromName := fromValMap["name"] 91 return fromName 92 } 93 94 func (widget *Widget) openTicket() { 95 sel := widget.GetSelected() 96 if sel >= 0 && widget.result != nil && sel < len(widget.result.Tickets) { 97 issue := &widget.result.Tickets[sel] 98 ticketURL := fmt.Sprintf("https://%s.zendesk.com/agent/tickets/%d", widget.settings.subdomain, issue.Id) 99 utils.OpenFile(ticketURL) 100 } 101 }