mirror of
https://github.com/alchemy-fr/Phraseanet.git
synced 2025-10-10 11:33:17 +00:00
224 lines
7.8 KiB
JavaScript
224 lines
7.8 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",
|
|
"common/multiviews",
|
|
"apps/admin/fields/views/alert",
|
|
"apps/admin/fields/views/modal",
|
|
"apps/admin/fields/views/dcField",
|
|
"apps/admin/fields/errors/error"
|
|
], function($, _, Backbone, i18n, MultiViews, AlertView, ModalView, DcFieldView, Error) {
|
|
// Add multiview methods
|
|
var FieldEditView = Backbone.View.extend(_.extend({}, MultiViews, {
|
|
tagName: "div",
|
|
className: "field-edit",
|
|
initialize: function() {
|
|
this.model.on("change", this._onModelChange, this);
|
|
},
|
|
updateModel: function(model) {
|
|
// unbind event to previous model
|
|
this.model.off("change");
|
|
this.model = model;
|
|
|
|
return this;
|
|
},
|
|
render: function() {
|
|
var self = this;
|
|
var template = _.template($("#edit_template").html(), {
|
|
field: this.model.toJSON(),
|
|
vocabularyTypes: AdminFieldApp.vocabularyCollection.toJSON(),
|
|
modelErrors: AdminFieldApp.errorManager.getModelError(this.model),
|
|
languages: AdminFieldApp.languages
|
|
});
|
|
|
|
this.$el.empty().html(template);
|
|
|
|
this._assignView({
|
|
".dc-fields-subview" : new DcFieldView({
|
|
collection: AdminFieldApp.dcFieldsCollection,
|
|
field: this.model
|
|
})
|
|
});
|
|
|
|
var completer = $("#tag", this.$el).autocomplete({
|
|
minLength: 2,
|
|
source: function(request, response) {
|
|
$.ajax({
|
|
url: "/admin/fields/tags/search",
|
|
dataType: "json",
|
|
data: {
|
|
term: request.term
|
|
},
|
|
success: function(data) {
|
|
response($.map(data, function(item) {
|
|
return {
|
|
label: item.label,
|
|
value: item.value
|
|
};
|
|
}));
|
|
}
|
|
});
|
|
},
|
|
close: function(e) {
|
|
self.tagFieldChangedAction(e);
|
|
}
|
|
});
|
|
|
|
completer
|
|
.val(this.model.get("tag"))
|
|
.autocomplete("widget")
|
|
.addClass("ui-autocomplete-admin-field");
|
|
|
|
this.delegateEvents();
|
|
|
|
return this;
|
|
},
|
|
events: {
|
|
"click": "focusAction",
|
|
"click .delete-field": "deleteAction",
|
|
"blur input#tbranch": "fieldChangedAction",
|
|
"keyup input#tag": "tagFieldChangedAction",
|
|
"blur input.input-label": "labelChangedAction",
|
|
"change input[type=checkbox]": "fieldChangedAction",
|
|
"change select": "selectionChangedAction",
|
|
"click .lng-label a": "_toggleLabels"
|
|
},
|
|
focusAction: function() {
|
|
var index = AdminFieldApp.fieldListView.collection.indexOf(this.model);
|
|
if (index >= 0) {
|
|
AdminFieldApp.fieldListView.itemViews[index].animate();
|
|
}
|
|
|
|
return this;
|
|
},
|
|
selectionChangedAction: function(e) {
|
|
var field = $(e.target);
|
|
var data = {};
|
|
data[field.attr("id")] = $("option:selected", field).val();
|
|
this.model.set(data);
|
|
|
|
return this;
|
|
},
|
|
fieldChangedAction: function(e) {
|
|
var field = $(e.target);
|
|
var fieldId = field.attr("id");
|
|
var data = {};
|
|
data[fieldId] = field.is(":checkbox") ? field.is(":checked") : field.val();
|
|
this.model.set(data);
|
|
|
|
return this;
|
|
},
|
|
labelChangedAction: function(e) {
|
|
var field = $(e.target);
|
|
var fieldId = field.attr("id");
|
|
var data = this.model.get("labels");
|
|
|
|
data[fieldId.split("_").pop()] = field.val();
|
|
|
|
this.model.set(data);
|
|
|
|
return this;
|
|
},
|
|
tagFieldChangedAction: function(e) {
|
|
var fieldTag = $(e.target);
|
|
var fieldTagId = fieldTag.attr("id");
|
|
var fieldTagValue = fieldTag.val();
|
|
|
|
var notValid = "" !== fieldTagValue && false === /[a-z]+:[a-z0-9]+/i.test(fieldTagValue);
|
|
// check for format tag
|
|
if (notValid) {
|
|
fieldTag
|
|
.closest(".control-group")
|
|
.addClass("error")
|
|
.find(".help-block")
|
|
.empty()
|
|
.append(i18n.t("validation_tag_invalid"));
|
|
// add error
|
|
AdminFieldApp.errorManager.addModelFieldError(new Error(
|
|
this.model, fieldTagId, i18n.t("validation_tag_invalid")
|
|
));
|
|
} else if (fieldTag.closest(".control-group").hasClass("error")) {
|
|
// remove error
|
|
AdminFieldApp.errorManager.removeModelFieldError(
|
|
this.model, fieldTagId
|
|
);
|
|
|
|
fieldTag
|
|
.closest(".control-group")
|
|
.removeClass("error")
|
|
.find(".help-block")
|
|
.empty();
|
|
}
|
|
|
|
if (!notValid) {
|
|
this.fieldChangedAction(e);
|
|
}
|
|
},
|
|
deleteAction: function() {
|
|
var self = this;
|
|
var modalView = new ModalView({
|
|
model: this.model,
|
|
message: i18n.t("are_you_sure_delete", {
|
|
postProcess: "sprintf",
|
|
sprintf: [this.model.get("name")]
|
|
})
|
|
});
|
|
|
|
// get collection index of previous and next model
|
|
var previousIndex = AdminFieldApp.fieldListView.collection.previousIndex(this.model);
|
|
var nextIndex = AdminFieldApp.fieldListView.collection.nextIndex(this.model);
|
|
|
|
// get previous index if exists else next index - 1 as item is being deleted
|
|
var index = previousIndex ? previousIndex : (nextIndex ? nextIndex - 1 : -1);
|
|
|
|
modalView.render();
|
|
modalView.on("modal:confirm", function() {
|
|
AdminFieldApp.fieldsToDelete.push(self.model);
|
|
AdminFieldApp.fieldListView.collection.remove(self.model);
|
|
self._selectModelView(index);
|
|
AdminFieldApp.saveView.updateStateButton();
|
|
});
|
|
|
|
return this;
|
|
},
|
|
_onModelChange: function() {
|
|
AdminFieldApp.fieldListView.collection.remove(this.model, {silent: true});
|
|
AdminFieldApp.fieldListView.collection.add(this.model);
|
|
var index = AdminFieldApp.fieldListView.collection.indexOf(this.model);
|
|
|
|
this._selectModelView(index);
|
|
|
|
AdminFieldApp.saveView.updateStateButton();
|
|
},
|
|
// select temView by index in itemList
|
|
_selectModelView: function(index) {
|
|
// select previous or next itemview
|
|
if (index >= 0) {
|
|
AdminFieldApp.fieldListView.itemViews[index].select().animate().click();
|
|
}
|
|
},
|
|
_toggleLabels: function(event) {
|
|
event.preventDefault();
|
|
var curLabel = $(event.target);
|
|
$('.lng-label', this.$el).removeClass("select");
|
|
curLabel.closest(".lng-label").addClass("select");
|
|
$('.input-label', this.$el).hide();
|
|
var href = curLabel.attr('href');
|
|
|
|
$("#" + href.split("#").pop(), this.$el).show();
|
|
}
|
|
}));
|
|
|
|
return FieldEditView;
|
|
});
|