2014-07-23 10:02:45 -04:00
|
|
|
SaveVersionModal = require 'views/modal/SaveVersionModal'
|
2014-01-03 13:32:13 -05:00
|
|
|
template = require 'templates/editor/level/save'
|
|
|
|
forms = require 'lib/forms'
|
|
|
|
LevelComponent = require 'models/LevelComponent'
|
|
|
|
LevelSystem = require 'models/LevelSystem'
|
2014-07-23 10:02:45 -04:00
|
|
|
DeltaView = require 'views/editor/DeltaView'
|
|
|
|
PatchModal = require 'views/editor/PatchModal'
|
2014-01-03 13:32:13 -05:00
|
|
|
|
2014-07-23 10:02:45 -04:00
|
|
|
module.exports = class SaveLevelModal extends SaveVersionModal
|
2014-01-03 13:32:13 -05:00
|
|
|
template: template
|
|
|
|
instant: false
|
|
|
|
modalWidthPercent: 60
|
2014-04-10 14:13:33 -04:00
|
|
|
plain: true
|
2014-01-03 13:32:13 -05:00
|
|
|
|
|
|
|
events:
|
|
|
|
'click #save-version-button': 'commitLevel'
|
|
|
|
'submit form': 'commitLevel'
|
|
|
|
|
|
|
|
constructor: (options) ->
|
|
|
|
super options
|
|
|
|
@level = options.level
|
2014-02-16 18:30:00 -05:00
|
|
|
|
2014-02-11 17:58:45 -05:00
|
|
|
getRenderData: (context={}) ->
|
2014-01-03 13:32:13 -05:00
|
|
|
context = super(context)
|
|
|
|
context.level = @level
|
2014-02-06 13:30:49 -05:00
|
|
|
context.levelNeedsSave = @level.hasLocalChanges()
|
2014-01-03 13:32:13 -05:00
|
|
|
context.modifiedComponents = _.filter @supermodel.getModels(LevelComponent), @shouldSaveEntity
|
|
|
|
context.modifiedSystems = _.filter @supermodel.getModels(LevelSystem), @shouldSaveEntity
|
2014-04-10 16:09:44 -04:00
|
|
|
context.hasChanges = (context.levelNeedsSave or context.modifiedComponents.length or context.modifiedSystems.length)
|
2014-04-09 22:07:44 -04:00
|
|
|
@lastContext = context
|
2014-01-03 13:32:13 -05:00
|
|
|
context
|
2014-04-13 17:48:36 -04:00
|
|
|
|
2014-04-09 22:07:44 -04:00
|
|
|
afterRender: ->
|
2014-04-16 13:42:32 -04:00
|
|
|
super(false)
|
2014-04-09 22:07:44 -04:00
|
|
|
changeEls = @$el.find('.changes-stub')
|
|
|
|
models = if @lastContext.levelNeedsSave then [@level] else []
|
|
|
|
models = models.concat @lastContext.modifiedComponents
|
|
|
|
models = models.concat @lastContext.modifiedSystems
|
2014-05-08 17:56:02 -04:00
|
|
|
models = (m for m in models when m.hasWriteAccess())
|
2014-04-09 22:07:44 -04:00
|
|
|
for changeEl, i in changeEls
|
|
|
|
model = models[i]
|
2014-04-13 17:48:36 -04:00
|
|
|
try
|
2014-07-15 13:01:52 -04:00
|
|
|
deltaView = new DeltaView({model: model, skipPaths: PatchModal.DOC_SKIP_PATHS})
|
2014-04-13 17:48:36 -04:00
|
|
|
@insertSubView(deltaView, $(changeEl))
|
|
|
|
catch e
|
2014-06-30 22:16:26 -04:00
|
|
|
console.error 'Couldn\'t create delta view:', e
|
2014-01-03 13:32:13 -05:00
|
|
|
|
|
|
|
shouldSaveEntity: (m) ->
|
2014-05-08 17:56:02 -04:00
|
|
|
return false unless m.hasWriteAccess()
|
2014-01-03 13:32:13 -05:00
|
|
|
return true if m.hasLocalChanges()
|
|
|
|
return true if (m.get('version').major is 0 and m.get('version').minor is 0) or not m.isPublished() and not m.collection
|
|
|
|
# Sometimes we have two versions: one in a search collection and one with a URL. We only save changes to the latter.
|
|
|
|
false
|
|
|
|
|
|
|
|
commitLevel: ->
|
|
|
|
modelsToSave = []
|
2014-05-30 20:24:53 -04:00
|
|
|
formsToSave = []
|
2014-01-03 13:32:13 -05:00
|
|
|
for form in @$el.find('form')
|
|
|
|
# Level form is first, then LevelComponents' forms, then LevelSystems' forms
|
|
|
|
fields = {}
|
|
|
|
for field in $(form).serializeArray()
|
2014-06-30 22:16:26 -04:00
|
|
|
fields[field.name] = if field.value is 'on' then true else field.value
|
2014-01-03 13:32:13 -05:00
|
|
|
isLevelForm = $(form).attr('id') is 'save-level-form'
|
|
|
|
if isLevelForm
|
|
|
|
model = @level
|
|
|
|
else
|
|
|
|
[kind, klass] = if $(form).hasClass 'component-form' then ['component', LevelComponent] else ['system', LevelSystem]
|
|
|
|
model = @supermodel.getModelByOriginalAndMajorVersion klass, fields["#{kind}-original"], parseInt(fields["#{kind}-parent-major-version"], 10)
|
2014-06-30 22:16:26 -04:00
|
|
|
console.log 'Couldn\'t find model for', kind, fields, 'from', @supermodel.models unless model
|
2014-01-03 13:32:13 -05:00
|
|
|
newModel = if fields.major then model.cloneNewMajorVersion() else model.cloneNewMinorVersion()
|
|
|
|
newModel.set 'commitMessage', fields['commit-message']
|
|
|
|
modelsToSave.push newModel
|
|
|
|
if isLevelForm
|
|
|
|
@level = newModel
|
|
|
|
if fields['publish'] and not @level.isPublished()
|
|
|
|
@level.publish()
|
|
|
|
else if @level.isPublished() and not newModel.isPublished()
|
|
|
|
newModel.publish() # Publish any LevelComponents that weren't published yet
|
2014-05-30 20:24:53 -04:00
|
|
|
formsToSave.push form
|
2014-06-23 21:25:58 -04:00
|
|
|
|
2014-05-30 20:24:53 -04:00
|
|
|
for model in modelsToSave
|
|
|
|
if errors = model.getValidationErrors()
|
|
|
|
messages = ("\t #{error.dataPath}: #{error.message}" for error in errors)
|
|
|
|
messages = messages.join('<br />')
|
|
|
|
@$el.find('#errors-wrapper .errors').html(messages)
|
|
|
|
@$el.find('#errors-wrapper').removeClass('hide')
|
|
|
|
return
|
2014-01-03 13:32:13 -05:00
|
|
|
|
2014-05-30 20:24:53 -04:00
|
|
|
@showLoading()
|
|
|
|
tuples = _.zip(modelsToSave, formsToSave)
|
|
|
|
for [newModel, form] in tuples
|
2014-01-03 13:32:13 -05:00
|
|
|
res = newModel.save()
|
|
|
|
do (newModel, form) =>
|
|
|
|
res.error =>
|
|
|
|
@hideLoading()
|
2014-06-30 22:16:26 -04:00
|
|
|
console.log 'Got errors:', JSON.parse(res.responseText)
|
2014-01-03 13:32:13 -05:00
|
|
|
forms.applyErrorsToForm($(form), JSON.parse(res.responseText))
|
|
|
|
res.success =>
|
|
|
|
modelsToSave = _.without modelsToSave, newModel
|
2014-06-23 21:25:58 -04:00
|
|
|
oldModel = _.find @supermodel.models, (m) -> m.get('original') is newModel.get('original')
|
|
|
|
oldModel.clearBackup() # Otherwise looking at old versions is confusing.
|
2014-01-03 13:32:13 -05:00
|
|
|
unless modelsToSave.length
|
|
|
|
url = "/editor/level/#{@level.get('slug') or @level.id}"
|
|
|
|
document.location.href = url
|
2014-02-16 18:30:00 -05:00
|
|
|
@hide() # This will destroy everything, so do it last
|