collections.coffee 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. Spine = require('spine/core')
  2. # $ = Spine.$
  3. templates = require('duality/templates')
  4. utils = require('lib/utils')
  5. FileUploadUI = require('controllers/ui/file-upload')
  6. Collection = require('models/collection')
  7. Sponsor = require('models/sponsor')
  8. Site = require('models/site')
  9. class CollectionForm extends Spine.Controller
  10. className: 'collection form panel'
  11. elements:
  12. '.item-title': 'itemTitle'
  13. '.error-message': 'errorMessage'
  14. 'form': 'form'
  15. 'select[name=site]': 'formSite'
  16. 'select[name=sponsor_id]': 'formSponsorId'
  17. 'input[name=sponsor_propagate]': 'formSponsorPropagate'
  18. 'input[name=name]': 'formName'
  19. 'input[name=pinned]': 'formPinned'
  20. 'input[name=hidden]': 'formHidden'
  21. 'textarea[name=intro]': 'formIntro'
  22. '.upload-ui': 'fileUploadContainer'
  23. '.save-button': 'saveButton'
  24. '.cancel-button': 'cancelButton'
  25. events:
  26. 'submit form': 'preventSubmit'
  27. 'change *[name]': 'markAsDirty'
  28. 'keyup *[name]': 'markAsDirty'
  29. 'click .save-button': 'save'
  30. 'click .cancel-button': 'cancel'
  31. 'click .delete-button': 'destroy'
  32. 'change select[name=site]': 'siteChange'
  33. 'blur input[name=slug]': 'updateSlug'
  34. constructor: ->
  35. super
  36. @active @render
  37. render: (params) ->
  38. @dirtyForm = false
  39. @editing = params.id?
  40. if @editing
  41. @copying = params.id.split('-')[0] is 'copy'
  42. if @copying
  43. @title = 'Copy Collection'
  44. @item = Collection.find(params.id.split('-')[1]).dup()
  45. # Important to indicate that we are creating a new record
  46. @editing = false
  47. else
  48. @item = Collection.find(params.id)
  49. @title = @item.name
  50. # Fetch missing data if need be
  51. if not @item.intro?
  52. @item.ajax().reload {},
  53. success: =>
  54. @formIntro.val(@item.intro)
  55. else
  56. @title = 'New Collection'
  57. @item = {}
  58. @item._attachments ?= {}
  59. @item.sites = Site.all().sort(Site.alphaSort)
  60. @item.sponsors = Sponsor.all().sort(Sponsor.alphaSort)
  61. @html templates.render('collection-form.html', {}, @item)
  62. @itemTitle.html @title
  63. # Set few initial form values
  64. if @editing or @copying
  65. @formSite.val(@item.site)
  66. @formSponsorId.val(@item.sponsor_id)
  67. @formSponsorPropagate.prop('checked', @item.sponsor_propagate)
  68. @formPinned.prop('checked', @item.pinned)
  69. @formHidden.prop('checked', @item.hidden)
  70. else
  71. @formSite.val(@stack.stack.filterBox.siteId)
  72. @siteChange()
  73. # Files upload area
  74. @fileUploadUI = new FileUploadUI
  75. docId: @item.id
  76. selectedFile: @item.photo
  77. attachments: @item._attachments
  78. changeCallback: @markAsDirty
  79. @fileUploadContainer.html @fileUploadUI.el
  80. return @
  81. siteChange: ->
  82. $siteSelected = @formSite.parents('.field').find('.site-selected')
  83. site = Site.exists(@formSite.val())
  84. if site
  85. $siteSelected.html "<div class=\"site-name theme-#{site.theme}\">#{site.name_html}</div>"
  86. else
  87. $siteSelected.html ""
  88. updateSlug: (e) =>
  89. slug = $(e.currentTarget)
  90. unless slug.val()
  91. slug.val utils.cleanSlug(@formName.val())
  92. save: (e) ->
  93. e.preventDefault()
  94. if not navigator.onLine
  95. alert "Can not save. You are OFFLINE."
  96. return
  97. if @editing
  98. @item.fromForm(@form)
  99. else
  100. @item = new Collection().fromForm(@form)
  101. @item._attachments = @fileUploadUI.attachments
  102. # Take care of some boolean checkboxes
  103. @item.sponsor_propagate = @formSponsorPropagate.is(':checked')
  104. @item.pinned = @formPinned.is(':checked')
  105. @item.hidden = @formHidden.is(':checked')
  106. # Save the item and make sure it validates
  107. if @item.save()
  108. @back()
  109. else
  110. msg = @item.validate()
  111. @showError msg
  112. return @
  113. showError: (msg) ->
  114. @errorMessage.html(msg).show()
  115. @el.scrollTop(0)
  116. destroy: (e) ->
  117. e.preventDefault()
  118. if @item and confirm "Are you sure you want to delete this item?"
  119. @item.destroy()
  120. @back()
  121. markAsDirty: =>
  122. @dirtyForm = true
  123. @saveButton.addClass('glow')
  124. cancel: (e) ->
  125. e.preventDefault()
  126. if @dirtyForm
  127. if confirm "You may have some unsaved changes.\nAre you sure you want to proceed?"
  128. @back()
  129. else
  130. @back()
  131. back: ->
  132. @navigate('/collections/list')
  133. preventSubmit: (e) ->
  134. e.preventDefault()
  135. return false
  136. deactivate: ->
  137. @el.scrollTop(0)
  138. super
  139. class CollectionList extends Spine.Controller
  140. className: 'collection list panel fixed-header'
  141. events:
  142. 'click h1 .count': 'reload'
  143. constructor: ->
  144. super
  145. # @active @render
  146. Collection.bind 'change refresh', @render
  147. Spine.bind 'filterbox:change', @filter
  148. render: =>
  149. sortFunc = if @filterObj?.sortBy then Collection[@filterObj.sortBy] else Collection.dateSort
  150. context =
  151. collections: Collection.filter(@filterObj).sort(sortFunc)
  152. @html templates.render('collections.html', {}, context)
  153. filter: (@filterObj) =>
  154. @render()
  155. @el.scrollTop(0)
  156. reload: ->
  157. Collection.fetch()
  158. class Collections extends Spine.Stack
  159. className: 'collections panel'
  160. controllers:
  161. list: CollectionList
  162. form: CollectionForm
  163. default: 'list'
  164. routes:
  165. '/collections/list': 'list'
  166. '/collection/new': 'form'
  167. '/collection/:id': 'form'
  168. constructor: ->
  169. super
  170. for k, v of @controllers
  171. @[k].active => @active()
  172. module.exports = Collections