Files
Phraseanet/www/scripts/apps/admin/fields/views/list.js

154 lines
5.1 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",
"jqueryui",
"underscore",
"backbone",
"i18n",
"common/multiviews",
"apps/admin/fields/views/listRow",
"apps/admin/fields/views/create"
], function($, jqueryui, _, Backbone, i18n, MultiViews, FieldListRowView, CreateView) {
var FieldListView = Backbone.View.extend(_.extend({}, MultiViews, {
events: {
"keyup #live_search": "searchAction",
"update-sort": "updateSortAction"
},
initialize: function() {
var self = this;
// store all single rendered views
this.itemViews = [];
// rerender whenever there is a change on the collection
this.collection.bind("reset", this.render, this);
this.collection.bind("add", this.render, this);
this.collection.bind("remove", this._onRemove, this);
this.collection.bind("remove", this.render, this);
AdminFieldApp.errorManager.on('add-error', function(error) {
var model = error.model;
var itemView = _.find(self.itemViews, function(view) {
return model.get('id') === view.model.get('id');
});
if ('undefined' !== typeof itemView) {
itemView.error(true);
}
});
AdminFieldApp.errorManager.on('remove-error', function(model) {
var itemView = _.find(self.itemViews, function(view) {
return model.get('id') === view.model.get('id');
});
if ('undefined' !== typeof itemView) {
itemView.error(false);
}
});
},
render: function() {
var template = _.template($("#item_list_view_template").html());
this.$el.empty().html(template);
this.$listEl = $("ul#collection-fields", this.$el);
this._renderList(this.collection);
this._assignView({
".create-subview" : new CreateView()
});
AdminFieldApp.resizeListBlock();
return this;
},
// render list by appending single item view, also fill itemViews
_renderList: function(fields) {
var that = this;
this.$listEl.empty();
this.itemViews = [];
fields.each(function(field) {
var fieldErrors = AdminFieldApp.errorManager.getModelError(field);
var singleView = new FieldListRowView({
model: field,
id: "field-" + field.get("id")
}).error(fieldErrors && fieldErrors.count() > 0);
that.$listEl.append(singleView.render().el);
that.itemViews.push(singleView);
});
this.$listEl.sortable({
handle: ".handle",
placeholder: "item-list-placeholder",
start: function(event, ui) {
ui.item.addClass("border-bottom");
},
stop: function(event, ui) {
ui.firstItemPosition = $("li:first", $(this).sortable('widget')).position().top;
ui.item.trigger("drop", ui);
}
});
this.$listEl.disableSelection();
this.$listEl.find("li:last").addClass("last");
return this;
},
searchAction: function(event) {
this._renderList(this.collection.search($("#live_search", this.$el).val()));
return this;
},
_onRemove : function (model) {
var models = [];
this.collection.each(function(m) {
if (m.get("sorter") > model.get("sorter")) {
m.set("sorter", m.get("sorter") - 1);
}
models.push(m);
});
this.collection.reset(models);
},
updateSortAction: function(event, model, ui) {
var newPosition = ui.item.index();
this.collection.remove(model, {silent: true});
this.collection.each(function (model, index) {
var ordinal = index;
if (index >= newPosition) ordinal += 2; else ordinal += 1;
model.set({'sorter': ordinal}, {silent: true});
});
model.set({'sorter': newPosition + 1}, {silent: true});
this.collection.add(model, {at: newPosition});
this.itemViews[0].animate(Math.abs(ui.firstItemPosition));
// update edit view model
AdminFieldApp.fieldEditView.updateModel(this.collection.find(function(el) {
return el.get("id") === AdminFieldApp.fieldEditView.model.get("id");
}));
AdminFieldApp.fieldEditView.render();
AdminFieldApp.saveView.updateStateButton();
return this;
}
}));
return FieldListView;
});