overleaf/services/web/public/coffee/history/VersionListView.coffee
2014-02-12 10:23:40 +00:00

106 lines
2.4 KiB
CoffeeScript

define [
"./util"
"history/VersionDetailView"
"libs/mustache"
"libs/backbone"
], (util, VersionDetailView)->
VersionListView = Backbone.View.extend
template: $("#versionListTemplate").html()
events:
"scroll" : "loadUntilFull"
initialize: ->
@itemViews = []
@atEndOfCollection = false
self = this
@collection.on "add", (model) ->
self.addItem model
@collection.on "reset", (collection) ->
self.addItem model for model in collection.models
@render()
@hideLoading()
render: ->
@$el.html Mustache.to_html @template
@$el.css
overflow: "scroll"
this
addItem: (model) ->
view = new VersionListItemView(model : model)
@itemViews.push view
index = @collection.indexOf(model)
elementAtIndex = @$("#version-list").children()[index]
view.$el.insertBefore(elementAtIndex)
listShorterThanContainer: ->
@$el.height() > @$("#version-list").height()
atEndOfListView: ->
@$el.scrollTop() + @$el.height() >= @$("#version-list").height() - 30
loadUntilFull: (e, callback) ->
if (@listShorterThanContainer() or @atEndOfListView()) and not @atEndOfCollection and not @loading
@showLoading()
@hideEmptyMessage()
@collection.fetchNextBatch
error: =>
@hideLoading()
@atEndOfCollection = true
@showEmptyMessageIfCollectionEmpty()
callback() if callback?
success: =>
@hideLoading()
@loadUntilFull(e, callback)
else
callback() if callback?
showEmptyMessageIfCollectionEmpty: ()->
if @collection.isEmpty()
@$(".empty-message").show()
else
@$(".empty-message").hide()
hideEmptyMessage: () ->
@$(".empty-message").hide()
showLoading: ->
@loading = true
@$(".loading").show()
hideLoading: ->
@loading = false
@$(".loading").hide()
VersionListItemView = Backbone.View.extend
tagName: "li"
events:
"click a": "showVersionDetail"
template : $("#versionListItemTemplate").html()
initialize: ->
@render()
render: ->
@$el.html Mustache.to_html(@template, @modelView())
return this
modelView: ->
modelView = @model.toJSON()
modelView.date = util.formatDate(modelView.date)
return modelView
showVersionDetail: ->
$("#versionListArea .active").removeClass "active"
@$el.addClass "active"
@model.fetch success: (model) ->
view = new VersionDetailView(model: model)
view.render()
return VersionListView