PageRenderTime 51ms CodeModel.GetById 14ms RepoModel.GetById 0ms app.codeStats 0ms

/app/scripts/main.coffee

https://github.com/colincarr/pubnub-backbone
CoffeeScript | 200 lines | 146 code | 51 blank | 3 comment | 6 complexity | 4fc9badb3451f6457731fff897b390ac MD5 | raw file
  1. # Start by creating our PubNub instance
  2. uuid = PUBNUB.uuid()
  3. pubnub = PUBNUB.init
  4. subscribe_key: 'sub-c-4c7f1748-ced1-11e2-a5be-02ee2ddab7fe'
  5. publish_key: 'pub-c-6dd9f234-e11e-4345-92c4-f723de52df70'
  6. uuid: uuid
  7. Todo = Backbone.Model.extend
  8. defaults: () ->
  9. {
  10. title: "empty todo..."
  11. order: Todos.nextOrder()
  12. done: false
  13. }
  14. toggle: () ->
  15. @set
  16. done: !@get 'done'
  17. TodoList = Backbone.PubNub.Collection.extend
  18. model: Todo
  19. name: "TodoList" # The name tells us what PubNub channel to use
  20. pubnub: pubnub # Pass in our global PubNub instance
  21. constructor: () ->
  22. Backbone.PubNub.Collection.apply this, arguments
  23. done: () ->
  24. @where { done: true }
  25. remaining: () ->
  26. @without.apply this, @done()
  27. nextOrder: () ->
  28. if not @length then return 1
  29. @last().get('order') + 1
  30. comparator: 'order'
  31. Todos = new TodoList
  32. TodoView = Backbone.View.extend
  33. tagName: 'li'
  34. template: _.template($('#item-template').html())
  35. events:
  36. 'click .toggle': 'toggleDone'
  37. 'dblclick .view': 'edit'
  38. 'click a.destroy': 'clear'
  39. 'keypress .edit': 'updateOnEnter'
  40. 'blur .edit': 'close'
  41. initialize: () ->
  42. @listenTo @model, 'change', @render
  43. @listenTo @model, 'remove', @remove
  44. render: () ->
  45. @$el.html @template @model.toJSON()
  46. @$el.toggleClass 'done', @model.get('done')
  47. @input = @$ '.edit'
  48. this
  49. toggleDone: () ->
  50. @model.toggle()
  51. edit: () ->
  52. @$el.addClass 'editing'
  53. @input.focus()
  54. close: () ->
  55. value = @input.val()
  56. if not value
  57. @clear()
  58. else
  59. @model.set { title: value }
  60. @$el.removeClass 'editing'
  61. updateOnEnter: (event) ->
  62. if event.keyCode is 13 then @close()
  63. clear: () ->
  64. Todos.remove @model
  65. AppView = Backbone.View.extend
  66. el: $ '#todoapp'
  67. statsTemplate: _.template($('#stats-template').html())
  68. events:
  69. 'keypress #new-todo': 'createOnEnter'
  70. 'click #clear-completed': 'clearCompleted'
  71. 'click #toggle-all': 'toggleAllCompleted'
  72. initialize: () ->
  73. @input = @$ '#new-todo'
  74. @allCheckbox = @$('#toggle-all')[0]
  75. @listenTo Todos, 'add', @addOne
  76. @listenTo Todos, 'reset', @addAll
  77. @listenTo Todos, 'all', @render
  78. @footer = @$ 'footer'
  79. @main = $ '#main'
  80. render: () ->
  81. done = Todos.done().length
  82. remaining = Todos.remaining().length
  83. if Todos.length
  84. @main.show()
  85. @footer.show()
  86. @footer.html @statsTemplate { done: done, remaining: remaining }
  87. else
  88. @main.hide()
  89. @footer.hide()
  90. @allCheckbox.checked = !remaining
  91. addOne: (todo) ->
  92. view = new TodoView { model: todo }
  93. @$('#todo-list').append view.render().el
  94. addAll: () ->
  95. Todos.each @addOne, this
  96. createOnEnter: (event) ->
  97. if event.keyCode isnt 13 then return
  98. if not @input.val() then return
  99. Todos.add { title: @input.val() }
  100. @input.val ''
  101. clearCompleted: () ->
  102. _.each Todos.done(), (model) ->
  103. Todos.remove model
  104. false
  105. toggleAllCompleted: () ->
  106. done = @allCheckbox.checked
  107. Todos.each (todo) ->
  108. todo.set { 'done': done }
  109. App = new AppView
  110. MyModel = Backbone.PubNub.Model.extend
  111. name: "MyModel"
  112. pubnub: pubnub
  113. defaults: () ->
  114. {
  115. rand: Math.random()
  116. title: "My Model"
  117. }
  118. mymodel = new MyModel
  119. MyModelView = Backbone.View.extend
  120. el: $ '#mymodel'
  121. template: _.template($('#mymodel-template').html())
  122. events:
  123. 'click #update': 'onUpdateClick'
  124. initialize: () ->
  125. @listenTo mymodel, 'all', @render
  126. @render()
  127. onUpdateClick: (event) ->
  128. mymodel.set
  129. rand: Math.random()
  130. render: () ->
  131. @$el.html @template(mymodel.toJSON())
  132. modelview = new MyModelView
  133. # Initially get the list of todos from the server
  134. pubnub.subscribe
  135. channel: uuid
  136. callback: (message) ->
  137. data = message
  138. Todos.set data
  139. connect: () ->
  140. pubnub.publish
  141. channel: 'getTodos'
  142. message:
  143. uuid: uuid
  144. # Mixpanel Tracking
  145. mixpanel.track_links '#github', 'GitHub repo click',
  146. repository: 'pubnub/backbone'
  147. mixpanel.track_links '#get-started', 'Get started click',
  148. repository: 'pubnub/backbone',
  149. type: 'Call To Action'