class @FindOrCreateTicketView extends Backbone.View
className: 'find-or-create-ticket'
initialize: ->
@template = HandlebarsTemplates['tickets/find_or_create']
@typeaheadTemplate = HandlebarsTemplates['tickets/typeahead']
@tickets = @options.tickets
@addTicket = @options.addTicket
@createTicket = @options.createTicket
@ticketTracker = @options.ticketTracker
render: ->
@$el.html @template()
typeaheadTemplate = @typeaheadTemplate
view = @
$add_ticket = @$el.find('#find_or_create_ticket').attr('autocomplete', 'off').typeahead
source: @tickets
matcher: (item)->
~item.summary.toLowerCase().indexOf(@query.toLowerCase()) ||
~item.projectTitle.toLowerCase().indexOf(@query.toLowerCase()) ||
~item.number.toString().toLowerCase().indexOf(@query.toLowerCase())
sorter: (items)->
view.suggestions = items
view.$el.toggleClass('no-suggestions', items.length is 0)
items # apply no sorting (return them in order of priority)
highlighter: (ticket)->
query = @query.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, '\\$&')
regex = new RegExp("(#{query})", 'ig')
ticket.summary.replace regex, ($1, match)-> "#{match}"
typeaheadTemplate
summary: ticket.summary.replace regex, ($1, match)-> "#{match}"
number: ticket.number.toString().replace regex, ($1, match)-> "#{match}"
.keyup -> view.$el.toggleClass('has-content', $(@).val().length > 0)
$add_ticket.data('typeahead').render = (tickets)->
items = $(tickets).map (i, item)=>
i = $(@options.item).attr('data-value', item.id)
i.find('a').html(@highlighter(item))
i[0]
items.first().addClass('active')
@$menu.html(items)
@
withFormFeedback = (callback)->
$add_ticket.prop 'disabled', true
callback()
.success ->
$add_ticket.prop('disabled', false).val('').focus()
.error (response)->
$add_ticket.prop('disabled', false).focus()
errors = Errors.fromResponse(response)
if errors.missingCredentials or errors.invalidCredentials
App.promptForCredentialsTo view.ticketTracker
else
errors.renderToAlert()
$add_ticket.data('typeahead').select = ->
@hide()
id = @$menu.find('.active').attr('data-value')
ticket = _.detect view.tickets, (ticket)-> +ticket.id == +id
withFormFeedback -> view.addTicket(ticket)
@$el.find('form').submit (e)=>
e.preventDefault()
$add_ticket.prop 'disabled', true
withFormFeedback => @createTicket($add_ticket.val())
$add_ticket.focus()