blocks.coffee 4.6 KB

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