codecombat/app/views/editor/poll/PollEditView.coffee
Nick Winter e21360127d Polls!
2015-03-08 16:36:17 -07:00

132 lines
4 KiB
CoffeeScript

RootView = require 'views/core/RootView'
template = require 'templates/editor/poll/poll-edit-view'
Poll = require 'models/Poll'
UserPollsRecord = require 'models/UserPollsRecord'
PollModal = require 'views/play/modal/PollModal'
ConfirmModal = require 'views/editor/modal/ConfirmModal'
PatchesView = require 'views/editor/PatchesView'
errors = require 'core/errors'
app = require 'core/application'
module.exports = class PollEditView extends RootView
id: 'editor-poll-edit-view'
template: template
events:
'click #save-button': 'savePoll'
'click #delete-button': 'confirmDeletion'
constructor: (options, @pollID) ->
super options
@loadPoll()
@loadUserPollsRecord()
@pushChangesToPreview = _.throttle(@pushChangesToPreview, 500)
loadPoll: ->
@poll = new Poll _id: @pollID
@poll.saveBackups = true
@supermodel.loadModel @poll, 'poll'
loadUserPollsRecord: ->
url = "/db/user.polls.record/-/user/#{me.id}"
@userPollsRecord = new UserPollsRecord().setURL url
onRecordSync = ->
return if @destroyed
@userPollsRecord.url = -> '/db/user.polls.record/' + @id
@listenToOnce @userPollsRecord, 'sync', onRecordSync
@userPollsRecord = @supermodel.loadModel(@userPollsRecord, 'user_polls_record').model
onRecordSync.call @ if @userPollsRecord.loaded
onLoaded: ->
super()
@buildTreema()
buildTreema: ->
return if @treema? or (not @poll.loaded)
data = $.extend(true, {}, @poll.attributes)
options =
data: data
filePath: "db/poll/#{@poll.get('_id')}"
schema: Poll.schema
readOnly: me.get('anonymous')
callbacks:
change: => @pushChangesToPreview() unless @hush
@treema = @$el.find('#poll-treema').treema(options)
@treema.build()
@treema.childrenTreemas.answers?.open 1
@pushChangesToPreview()
getRenderData: (context={}) ->
context = super(context)
context.poll = @poll
context.authorized = me.isAdmin()
context
afterRender: ->
super()
return unless @supermodel.finished()
@pushChangesToPreview()
@patchesView = @insertSubView(new PatchesView(@poll), @$el.find('.patches-view'))
@patchesView.load()
pushChangesToPreview: =>
return unless @treema
@$el.find('#poll-view').empty()
for key, value of @treema.data
@poll.set key, value
@pollModal?.destroy()
@pollModal = new PollModal supermodel: @supermodel, poll: @poll, userPollsRecord: @userPollsRecord
@pollModal.render()
$('#poll-view').empty().append @pollModal.el
#pollModal.afterInsert() # This blurs the active input; don't do it
@pollModal.$el.removeClass('modal fade').show()
@pollModal.on 'vote-updated', =>
@hush = true
@treema.set '/answers', @pollModal.poll.get('answers')
@hush = false
savePoll: (e) ->
@treema.endExistingEdits()
for key, value of @treema.data
@poll.set(key, value)
res = @poll.save()
res.error (collection, response, options) =>
console.error response
res.success =>
url = "/editor/poll/#{@poll.get('slug') or @poll.id}"
document.location.href = url
confirmDeletion: ->
renderData =
'confirmTitle': 'Are you really sure?'
'confirmBody': 'This will completely delete the poll, potentially breaking a lot of stuff you don\'t want breaking. Are you entirely sure?'
'confirmDecline': 'Not really'
'confirmConfirm': 'Definitely'
confirmModal = new ConfirmModal renderData
confirmModal.on 'confirm', @deletePoll
@openModalView confirmModal
deletePoll: =>
console.debug 'deleting'
$.ajax
type: 'DELETE'
success: ->
noty
timeout: 5000
text: 'Aaaand it\'s gone.'
type: 'success'
layout: 'topCenter'
_.delay ->
app.router.navigate '/editor/poll', trigger: true
, 500
error: (jqXHR, status, error) ->
console.error jqXHR
timeout: 5000
text: "Deleting poll failed with error code #{jqXHR.status}"
type: 'error'
layout: 'topCenter'
url: "/db/poll/#{@poll.id}"