PageRenderTime 58ms CodeModel.GetById 27ms RepoModel.GetById 0ms app.codeStats 0ms

/src/coffee/public/ideas.coffee

https://github.com/motionworks/Nova-Platform
CoffeeScript | 287 lines | 232 code | 50 blank | 5 comment | 29 complexity | 0d7c20dfaab24bc2dd6e6db965a99bfb MD5 | raw file
  1. Backbone.View::renderTemplate = (data)->
  2. if not @templateItem?
  3. t = $.tmpl(@template, @model.toJSON())
  4. $(t).appendTo(@el)
  5. @templateItem = $.tmplItem(t)
  6. else
  7. t = @
  8. $.extend(@templateItem.data, data)
  9. $(@el).empty()
  10. $.tmpl(@template, @templateItem.data).appendTo(@el)
  11. Backbone.View::showMessage = (msg) ->
  12. if $('#msg').length < 1
  13. $('#content').prepend('<p id="msg"><span>'+msg+'</span><a href="#" id="msg_close">(X)</a></p>')
  14. $('#msg_close, #msg').live 'click', ->
  15. $('#msg').remove()
  16. else
  17. $('#msg span').text(msg)
  18. timer = setTimeout (->$('#msg').slideUp(300, ->$('#msg').remove())), 7000
  19. # Ideas page function
  20. ideas =
  21. options:
  22. ideasNum: 10
  23. class ideas.Model extends Backbone.Model
  24. defaults:
  25. 'commentsNum' : 0
  26. initialize: ->
  27. @view = new ideas.SingleView({model: @})
  28. @view.render()
  29. addLike: ->
  30. id = @get('id')
  31. console.log(id)
  32. t = @
  33. $.ajax {
  34. url: '/idea/like/' + id
  35. type: 'PUT'
  36. success: (data) ->
  37. console.log(data)
  38. l = t.get('like') + 1
  39. t.set({'like': l})
  40. $(t.view.el).find('.likes-count').addClass('active')
  41. }
  42. change: ->
  43. if @.hasChanged()
  44. @view.update(@changedAttributes())
  45. class ideas.List extends Backbone.Collection
  46. model: ideas.Model
  47. initialize: ->
  48. @update()
  49. update: (opt)->
  50. t = @
  51. attr = {}
  52. if opt is undefined
  53. attr =
  54. num: ideas.options.ideasNum
  55. else attr = opt
  56. $('#get-more-ideas').addClass('loading')
  57. $.getJSON '/idea/list', (data) ->
  58. data
  59. .then (data)->
  60. c = 0
  61. idea = data.idea
  62. num = idea.length
  63. for i in idea
  64. m = new ideas.Model(i)
  65. t.add(m)
  66. c++
  67. if c is num
  68. ideas.list.render(t)
  69. $('#get-more-ideas').removeClass('loading')
  70. return @
  71. class ideas.SingleView extends Backbone.View
  72. tagName: 'article'
  73. events:
  74. 'click .likes-count': 'addLike'
  75. 'click .comments-count': 'goDetails'
  76. 'click .more': 'goDetails'
  77. 'click' : 'toggleDetails'
  78. initialize: ->
  79. @template = $('#ideaTmpl').template()
  80. render: ->
  81. id = 'idea_' + @model.get('id')
  82. t = @
  83. $(@el).attr('id', id)
  84. $(@el).addClass(@model.get('contentType') + ' tagMatch')
  85. tags = @model.get('tags')
  86. if $.isArray(tags)
  87. tagsStr = tags.join(',')
  88. else tagsStr = tags
  89. $(@el).attr('data-tag', tagsStr)
  90. @renderTemplate()
  91. $('#ideas-container').isotope 'insert', $(@el)
  92. if @model.get('isNew')
  93. $(@el).effect('highlight', 2000)
  94. @showMessage('Congratulations! Your idea is successfully shared!')
  95. @checkImgLoaded()
  96. return @
  97. update: (attr)->
  98. @renderTemplate(attr)
  99. $(@el).effect('highlight', 1000)
  100. return @
  101. checkImgLoaded: ->
  102. el = @el
  103. if ($(el).find('img').length > 0)
  104. $(el).addClass('loading')
  105. $(el).find('img').load ->
  106. $(el).closest('article').removeClass('loading')
  107. addLike: (e)->
  108. if @.$('.likes-count').hasClass('active') is false
  109. @model.addLike()
  110. @showMessage('Awesome, you liked this idea!')
  111. # ideas.tagsList.view.updateRecommendedTags($(@el).find('.tags'))
  112. e.preventDefault()
  113. goDetails: (e)->
  114. window.location.href = @.$('.more').attr('href')
  115. toggleDetails: (e) ->
  116. $(@el).toggleClass('detail')
  117. $('#ideas-container').isotope 'reLayout'
  118. class ideas.ListView extends Backbone.View
  119. initialize: ->
  120. @collection = new ideas.List()
  121. @bindElems()
  122. bindElems: ->
  123. t = @
  124. $('#ideas-container').isotope({
  125. layoutMode: 'masonry'
  126. containerClass: 'isotope'
  127. masonry:
  128. columnWidth: 40
  129. getSortData:
  130. id : ($elem)->
  131. return parseInt($elem.attr('id').substr(5))
  132. sortBy: 'id'
  133. sortAscending: false
  134. animationEngine: 'jquery'
  135. })
  136. $('#get-more-ideas').click (e)->
  137. t.collection.update()
  138. e.preventDefault()
  139. $('#submit-idea').click ->
  140. new ideas.FormView()
  141. class ideas.FormView extends Backbone.View
  142. id : 'idea-form'
  143. initialize: ->
  144. @template = $('#ideaFormTmpl').template()
  145. $.tmpl(@template).appendTo(@el)
  146. @render()
  147. render: ->
  148. t = @
  149. $.nmData(@el, {
  150. # callbacks:
  151. # beforeShowCont: -> t.bindTags()
  152. # afterReposition: -> t.setSuggestPos()
  153. })
  154. @.$('#submit').bind 'click', (e)->
  155. t.submitForm()
  156. e.preventDefault()
  157. setSuggestPos : ->
  158. pos = @.$('#form_tags').offset()
  159. @.$('#form_tags-suggest').css(
  160. position: 'fixed'
  161. top: pos.top + 30
  162. left: pos.left + 150
  163. )
  164. bindTags : ->
  165. dict = ideas.tagsList.dictionary
  166. f = @
  167. f.$('#form_tags').bind 'keypress change', ->
  168. val = $(@).val()
  169. list = ''
  170. if val.length >= 3
  171. found = $.grep dict, (n, i) ->
  172. word = n.toLowerCase()
  173. if (word.indexOf(val) != -1)
  174. return n
  175. suggest = found[0...5]
  176. for word in suggest
  177. list += '<li>'+word+'</li>'
  178. f.$('#form_tags-suggest ul').html(list).show()
  179. else
  180. f.$('#form_tags-suggest ul').empty().hide()
  181. @.$('#form_tags-suggest ul li').live 'click', ->
  182. val = $(@).text()
  183. f.$('#form_tags').val('')
  184. f.$('#form_tags-suggest ul').empty().hide()
  185. f.$('#form_tags-added').append('<li><a href="#">'+val+'</a></li>')
  186. $.nmTop().resize(true)
  187. f.setSuggestPos()
  188. submitForm : ->
  189. el = @el
  190. submitUrl = $(el).find('form').attr('action')
  191. title = $(el).find('#form_title')
  192. desc = $(el).find('#form_desc')
  193. url = $(el).find('#form_url')
  194. username = $(el).find('#form_name')
  195. email = $(el).find('#form_email')
  196. tags = $(el).find('#form_tags')
  197. arr = [title, desc, tags, username, email]
  198. json = {}
  199. validate = ->
  200. for field in arr
  201. $(el).find('.msg').remove()
  202. field.removeClass('error')
  203. if field.val() is ''
  204. field.addClass('error')
  205. if $('.error').length > 0
  206. if ($(el).find('.msg').length < 1)
  207. $(el).find('ul:first').before('<p class="msg">Oops, seems like you missed out some fields!</p>')
  208. $.nmTop().resize(true)
  209. return false
  210. else
  211. return true
  212. urlVal = url.val()
  213. if /(png|jpg|bmp|gif)/.test(urlVal) is true then contentType = 'image'
  214. else if /(youtube.com)/.test(urlVal) is true
  215. contentType = 'video'
  216. urlVal = urlVal.match(/http\:\/\/www\.youtube\.com\/watch\?v=([\w-]{11})/)[1]
  217. else if urlVal isnt '' then contentType = 'url'
  218. else contentType = 'text'
  219. json =
  220. 'title' : title.val()
  221. 'desc' : desc.val()
  222. 'url' : urlVal
  223. 'username' : username.val()
  224. 'email' : email.val()
  225. 'tags' : tags.val()
  226. 'like' : 0
  227. 'contentType' : contentType
  228. if validate() is true
  229. $.post submitUrl, json, (data)->
  230. $.nmTop().close();
  231. new ideas.Model(data)
  232. class ideas.Controller extends Backbone.Controller
  233. initialize: ->
  234. ideas.list = new ideas.ListView()
  235. window.location.href = "#"
  236. $ ->
  237. ideas.session = new ideas.Controller()