Files
Phraseanet/www/scripts/apps/admin/fields/views/save.js
2013-07-12 19:28:13 +02:00

125 lines
4.6 KiB
JavaScript

/*
* This file is part of Phraseanet
*
* (c) 2005-2013 Alchemy
*
* For the full copyright and license information, please view the LICENSE
* file that was distributed with this source code.
*/
define([
"jquery",
"underscore",
"backbone",
"i18n",
"bootstrap",
"apps/admin/fields/views/alert"
], function($, _, Backbone, i18n, bootstrap, AlertView) {
var SaveView = Backbone.View.extend({
initialize: function() {
var self = this;
this.previousAttributes = [];
this.$overlay = null;
AdminFieldApp.errorManager.on("add-error", function(errors) {
self._disableSaveButton(true);
});
AdminFieldApp.errorManager.on("no-error", function() {
self._disableSaveButton(false);
});
},
events: {
"click button.save-all" : "clickSaveAction"
},
clickSaveAction: function(event) {
var self = this;
if (this._isModelDesync()) {
this._loadingState(true);
$.when.apply($, _.map(AdminFieldApp.fieldsToDelete, function(m){
return m.destroy({
success: function(model, response) {
AdminFieldApp.fieldsToDelete = _.filter(AdminFieldApp.fieldsToDelete, function(m){
return model.get("id") !== m.get("id");
});
},
error: function(xhr, textStatus, errorThrown) {
new AlertView({
alert: "error", message: '' !== xhr.responseText ? xhr.responseText : i18n.t("something_wrong")
}).render();
}
});
})).done(
function() {
AdminFieldApp.fieldsCollection.save({
success: function(fields) {
// reset collection with new one
AdminFieldApp.fieldsCollection.reset(fields);
new AlertView({
alert: "success",
message: i18n.t("fields_save"),
delay: 2000
}).render();
},
error: function(xhr, textStatus, errorThrown) {
new AlertView({
alert: "error", message: '' !== xhr.responseText ? xhr.responseText : i18n.t("something_wrong")
}).render();
}
}).done(function() {
self._loadingState(false);
});
}
);
}
return this;
},
render: function () {
var template = _.template($("#save_template").html());
this.$el.html(template);
this.updateStateButton();
return this;
},
updateStateButton: function() {
this._disableSaveButton(!this._isModelDesync());
},
// check whether model has changed or not
_isModelDesync: function () {
return "undefined" !== typeof AdminFieldApp.fieldsCollection.find(function(model) {
return !_.isEmpty(model.previousAttributes());
});
},
// create a transparent overlay on top of the application
_overlay: function(showOrHide) {
if(showOrHide && !this.$overlay) {
this.$overlay = $("<div>").addClass("overlay");
AdminFieldApp.$bottom.append(this.$overlay);
} else if (!showOrHide && this.$overlay) {
this.$overlay.remove();
this.$overlay = null;
}
},
_disableSaveButton: function (active) {
$("button.save-all", this.$el).attr("disabled", active);
},
// put application on loading state (add overlay, add spinner, disable global save button)
_loadingState: function(active) {
if (active) {
$(".save-block", AdminFieldApp.$top).addClass("loading");
$(".block-alert", AdminFieldApp.$top).empty();
} else {
$(".save-block", AdminFieldApp.$top).removeClass("loading");
}
this.updateStateButton();
this._overlay(active);
}
});
return SaveView;
});