sites.coffee 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  1. Spine = require('spine/core')
  2. # $ = Spine.$
  3. templates = require('duality/templates')
  4. settings = require('settings/root')
  5. Site = require('models/site')
  6. class SiteForm extends Spine.Controller
  7. className: 'site form panel'
  8. elements:
  9. '.item-title': 'itemTitle'
  10. '.error-message': 'errorMessage'
  11. 'form': 'form'
  12. 'input[name=_id]': 'formSiteId'
  13. 'select[name=theme]': 'formTheme'
  14. 'input[name=default_ad_enabled]': 'formDefaultAdEnabled'
  15. '.social-links-list': 'socialLinksList'
  16. '.save-button': 'saveButton'
  17. '.cancel-button': 'cancelButton'
  18. events:
  19. 'submit form': 'preventSubmit'
  20. 'change *[name]': 'markAsDirty'
  21. 'keyup *[name]': 'markAsDirty'
  22. 'click .save-button': 'save'
  23. 'click .cancel-button': 'cancel'
  24. 'click .delete-button': 'destroy'
  25. 'click .add-social-link': 'addSocialLink'
  26. constructor: ->
  27. super
  28. @active @render
  29. render: (params) ->
  30. @dirtyForm = false
  31. @editing = params.id?
  32. if @editing
  33. @copying = params.id.split('-')[0] is 'copy'
  34. if @copying
  35. @title = 'Copy Site'
  36. @item = Site.find(params.id.split('-')[1]).dup()
  37. # Important to indicate that we are creating a new record
  38. @editing = false
  39. else
  40. @item = Site.find(params.id)
  41. @title = @item.name
  42. else
  43. @title = 'New Site'
  44. @item = {}
  45. @item.themes = settings.app.themes
  46. @html templates.render('site-form.html', {}, @item)
  47. @itemTitle.html @title
  48. # Set few initial form values
  49. if @editing or @copying
  50. @formTheme.val(@item.theme)
  51. @formSiteId.prop('readonly', true)
  52. @formDefaultAdEnabled.prop('checked', @item.default_ad_enabled)
  53. else
  54. @addSocialLink()
  55. return @
  56. addSocialLink: (e) ->
  57. e?.preventDefault()
  58. @socialLinksList.append templates.render('partials/link-form.html', {}, {})
  59. save: (e) ->
  60. e.preventDefault()
  61. if not navigator.onLine
  62. alert "Can not save. You are OFFLINE."
  63. return
  64. if @editing
  65. @item.fromForm(@form)
  66. else
  67. @item = new Site().fromForm(@form)
  68. # Construct the social links list object
  69. links = []
  70. @socialLinksList.find('.link-form').each ->
  71. label = $.trim $(@).find('input[name=link_label]').val()
  72. url = $.trim $(@).find('input[name=link_url]').val()
  73. code = $.trim $(@).find('input[name=link_code]').val()
  74. if label and url
  75. links.push label: label, url: url, code: code
  76. @item.social_links = links
  77. # Take care of some boolean checkboxes
  78. @item.default_ad_enabled = @formDefaultAdEnabled.is(':checked')
  79. # Save the item and make sure it validates
  80. if @item.save()
  81. @back()
  82. else
  83. msg = @item.validate()
  84. @showError msg
  85. return @
  86. showError: (msg) ->
  87. @errorMessage.html(msg).show()
  88. @el.scrollTop(0)
  89. destroy: (e) ->
  90. e.preventDefault()
  91. if @item and confirm "Are you sure you want to delete this item?"
  92. @item.destroy()
  93. @back()
  94. markAsDirty: =>
  95. @dirtyForm = true
  96. @saveButton.addClass('glow')
  97. cancel: (e) ->
  98. e.preventDefault()
  99. if @dirtyForm
  100. if confirm "You may have some unsaved changes.\nAre you sure you want to proceed?"
  101. @back()
  102. else
  103. @back()
  104. back: ->
  105. @navigate('/sites/list')
  106. preventSubmit: (e) ->
  107. e.preventDefault()
  108. return false
  109. deactivate: ->
  110. @el.scrollTop(0)
  111. super
  112. class SiteList extends Spine.Controller
  113. className: 'site list panel fixed-header'
  114. events:
  115. 'click h1 .count': 'reload'
  116. constructor: ->
  117. super
  118. # @active @render
  119. Site.bind 'change refresh', @render
  120. Spine.bind 'filterbox:change', @filter
  121. render: =>
  122. context =
  123. sites: Site.filter(@filterObj).sort(Site.alphaSort)
  124. @html templates.render('sites.html', {}, context)
  125. filter: (@filterObj) =>
  126. @render()
  127. @el.scrollTop(0)
  128. reload: ->
  129. Site.fetch()
  130. class Sites extends Spine.Stack
  131. className: 'sites panel'
  132. controllers:
  133. list: SiteList
  134. form: SiteForm
  135. default: 'list'
  136. routes:
  137. '/sites/list': 'list'
  138. '/site/new': 'form'
  139. '/site/:id': 'form'
  140. constructor: ->
  141. super
  142. for k, v of @controllers
  143. @[k].active => @active()
  144. module.exports = Sites