mirror of
https://github.com/codeninjasllc/codecombat.git
synced 2024-11-24 16:17:57 -05:00
97 lines
3 KiB
CoffeeScript
97 lines
3 KiB
CoffeeScript
RootView = require 'views/core/RootView'
|
|
NewModelModal = require 'views/editor/modal/NewModelModal'
|
|
template = require 'templates/common/search-view'
|
|
app = require 'core/application'
|
|
|
|
class SearchCollection extends Backbone.Collection
|
|
initialize: (modelURL, @model, @term, @projection) ->
|
|
@url = "#{modelURL}?project="
|
|
if @projection?.length
|
|
@url += 'created,permissions'
|
|
@url += ',' + projected for projected in @projection
|
|
else @url += 'true'
|
|
@url += "&term=#{@term}" if @term
|
|
|
|
comparator: (a, b) ->
|
|
score = 0
|
|
score -= 9001900190019001 if a.getOwner() is me.id
|
|
score += 9001900190019001 if b.getOwner() is me.id
|
|
score -= new Date(a.get 'created')
|
|
score -= -(new Date(b.get 'created'))
|
|
if score < 0 then -1 else (if score > 0 then 1 else 0)
|
|
|
|
module.exports = class SearchView extends RootView
|
|
template: template
|
|
className: 'search-view'
|
|
|
|
# to overwrite in subclasses
|
|
modelLabel: '' # 'Article'
|
|
model: null # Article
|
|
modelURL: null # '/db/article'
|
|
tableTemplate: null # require 'templates/editor/article/table'
|
|
projected: null # ['name', 'description', 'version'] or null for default
|
|
canMakeNew: true
|
|
|
|
events:
|
|
'change input#search': 'runSearch'
|
|
'keydown input#search': 'runSearch'
|
|
'click #new-model-button': 'newModel'
|
|
'hidden.bs.modal #new-model-modal': 'onModalHidden'
|
|
|
|
constructor: (options) ->
|
|
@runSearch = _.debounce(@runSearch, 500)
|
|
super options
|
|
|
|
afterRender: ->
|
|
super()
|
|
hash = document.location.hash[1..]
|
|
searchInput = @$el.find('#search')
|
|
searchInput.val(hash) if hash?
|
|
delete @collection?.term
|
|
searchInput.trigger('change')
|
|
searchInput.focus()
|
|
|
|
runSearch: =>
|
|
return if @destroyed
|
|
term = @$el.find('input#search').val()
|
|
return if @sameSearch(term)
|
|
@removeOldSearch()
|
|
|
|
@collection = new SearchCollection(@modelURL, @model, term, @projection)
|
|
@collection.term = term # needed?
|
|
@listenTo(@collection, 'sync', @onSearchChange)
|
|
@showLoading(@$el.find('.results'))
|
|
|
|
@updateHash(term)
|
|
@collection.fetch()
|
|
|
|
updateHash: (term) ->
|
|
newPath = document.location.pathname + (if term then '#' + term else '')
|
|
currentPath = document.location.pathname + document.location.hash
|
|
app.router.navigate(newPath) if newPath isnt currentPath
|
|
|
|
sameSearch: (term) ->
|
|
return false unless @collection
|
|
return term is @collection.term
|
|
|
|
onSearchChange: ->
|
|
@hideLoading()
|
|
@collection.sort()
|
|
documents = @collection.models
|
|
table = $(@tableTemplate(documents: documents, me: me, page: @page, moment: moment))
|
|
@$el.find('table').replaceWith(table)
|
|
@$el.find('table').i18n()
|
|
|
|
removeOldSearch: ->
|
|
return unless @collection?
|
|
@collection.off()
|
|
@collection = null
|
|
|
|
onNewModelSaved: (@model) ->
|
|
base = document.location.pathname[1..] + '/'
|
|
app.router.navigate(base + (@model.get('slug') or @model.id), {trigger: true})
|
|
|
|
newModel: (e) ->
|
|
modal = new NewModelModal model: @model, modelLabel: @modelLabel
|
|
modal.once 'model-created', @onNewModelSaved
|
|
@openModalView modal
|