diff options
Diffstat (limited to 'public/assets/javascripts/ui/editor/EditorSettings.js')
| -rw-r--r-- | public/assets/javascripts/ui/editor/EditorSettings.js | 124 |
1 files changed, 124 insertions, 0 deletions
diff --git a/public/assets/javascripts/ui/editor/EditorSettings.js b/public/assets/javascripts/ui/editor/EditorSettings.js new file mode 100644 index 0000000..ad578d2 --- /dev/null +++ b/public/assets/javascripts/ui/editor/EditorSettings.js @@ -0,0 +1,124 @@ + +var EditorSettings = FormView.extend({ + el: "#editorSettings", + + createAction: "/api/projects/new", + updateAction: "/api/projects/edit", + destroyAction: "/api/projects/destroy", + + events: { + "keydown [name=name]": 'enterSubmit', + "click [data-role='save-project']": 'save', + "click [data-role='clone-project']": 'clone', + "click [data-role='clear-project']": 'clear', + "click [data-role='destroy-project']": 'destroy', + }, + + initialize: function(opt){ + this.parent = opt.parent + this.__super__.initialize.call(this) + + this.$id = this.$("[name=_id]") + this.$csrf = this.$("[name=_csrf]") + this.$name = this.$("[name=name]") + this.$privacy = this.$("[name=privacy]") + }, + + load: function(data){ + this.$id.val(data._id) + this.$name.val(data.name) + + data.rooms && Rooms.deserialize(data.rooms) + data.startPosition && scene.camera.move(data.startPosition) + data.privacy && this.$privacy.find("[value=" + data.privacy + "]").prop('checked', "checked") + + this.action = data.isNew ? this.createAction : this.updateAction + }, + + clone: function(){ + var names = this.$name.val().split(" ") + if ( ! isNaN(Number( names[names.length-1] )) ) { + names[names.length-1] = Number( names[names.length-1] ) + 1 + } + else { + names.push("2") + } + + this.$id.val('new') + this.$name.val( names.join(" ") ) + this.action = this.createAction + + window.history.pushState(null, document.title, "/builder/new") + }, + + clear: function(){ + Rooms.removeAll() + }, + + destroy: function(){ + var msg = "Are you sure you want to delete the project " + sanitize(this.$name.val()) + "?" + ConfirmModal.confirm(msg, $.proxy(function(){ + $.ajax({ + url: this.destroyAction, + type: "delete", + data: { _id: this.$id.val(), _csrf: this.$csrf.val() }, + success: function(data){ + window.location.href = "/project" + } + }) + }, this)) + }, + + toggle: function(){ + this.$el.toggleClass("active") + }, + + enterSubmit: function (e) { + e.stopPropagation() + var base = this + if (e.keyCode == 13) { + setTimeout(function(){ base.save(e) }, 100) + } + }, + + validate: function(){ + var errors = [] + var name = this.$name.val() + if (! name || ! name.length) { + errors.push("Please name your project.") + } + return errors + }, + + showErrors: function(errors){ + var $errors = $("<span>") + errors.forEach(function(err){ + var $row = $("<div>") + $row.html(err) + $errors.append( $row ) + }) + ErrorModal.alert($errors) + }, + + serialize: function(){ + map.draw.render() + var fd = new FormData() + fd.append( "_csrf", this.$csrf.val() ) + fd.append( "_id", this.$id.val() ) + fd.append( "name", this.$name.val() ) + fd.append( "privacy", this.$privacy.filter(":checked").val() == "private" ) + fd.append( "rooms", JSON.stringify( Rooms.serialize() ) ) + fd.append( "startPosition", JSON.stringify( app.position(scene.camera) ) ) + fd.append( "thumbnail", dataUriToBlob(map.canvas.toDataURL()) ) + return fd + }, + + success: function(data){ + this.$id.val(data._id) + this.$name.val(data.name) + this.action = this.updateAction + + window.history.pushState(null, document.title, "/project/" + data.slug) + }, + +}) |
