redirects.coffee 4.0 KB

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