engine/public/javascripts/admin/custom_fields/category.js

160 lines
4.5 KiB
JavaScript

// edit category collection
$(document).ready(function() {
$('button.edit-categories-link').click(function() {
var link = $(this);
$.fancybox({
titleShow: false,
href: link.attr('data-url'),
padding: 0,
onComplete: function() { SetupCustomFieldCategoryEditor(link.prev()); },
onCleanup: function() { }
})
});
});
var SetupCustomFieldCategoryEditor = function(target) {
var wrapper = $('#edit-custom-field-category');
var form = wrapper.find('form.formtastic');
var submitButton = wrapper.find('.popup-actions button');
var list = wrapper.find('ol');
var template = $('#category-tmpl').html();
var baseInputName = $('#category-tmpl').attr('data-base-input-name');
var data = categories;
var index = 0;
var refreshPosition = function() {
$.each(list.find('li.added:visible input[data-field=position]'), function(index) { $(this).val(index); });
}
var updateTargetCallback = function(data) {
if (data.error == null) {
list = data.category_items.sort(function(a, b) { return (a.position - b.position); });
var options = '';
var selectedValue = target.val();
for (var i = 0; i < list.length; i++)
options += '<option value="' + list[i].id + '" >' + list[i].name + '</option>';
target.html(options);
target.val(selectedValue);
$.fancybox.close();
} else
$.growl("error", data.error);
}
var updateTarget = function(event) {
$.ajax({
type: 'PUT',
dataType: 'json',
data: form.serialize(),
url: form.attr('action'),
success: updateTargetCallback
});
event.preventDefault();
event.stopPropagation();
}
var registerTemplateEvents = function(domField) {
var nameDom = domField.find('input[data-field=name]');
// bind the "Add field" button
domField.find('button').bind('click', function(e) {
var newItem = $.extend({}, data.template);
newItem.name = nameDom.val().trim();
if (newItem.name == '') return false;
addItem(newItem, { refreshPosition: true });
// reset template values
nameDom.val('').focus();
e.preventDefault(); e.stopPropagation();
});
nameDom.keypress(function(e) {
if (e.which == 13) {
domField.find('button').trigger('click');
e.preventDefault();
}
});
}
var registerItemEvents = function(category, domField) {
// remove
domField.find('a.remove').click(function(e) {
if (confirm($(this).attr('data-confirm'))) {
if (category.new_record)
domField.remove();
else
domField.hide().find('input[data-field=_destroy]').val(1);
refreshPosition();
$.fancybox.resize();
}
e.preventDefault(); e.stopPropagation();
});
}
var addItem = function(category, options) {
options = $.extend({
'is_template': false,
'refreshPosition': false
}, options);
category = $.extend({
behaviour_flag: function() { return options.is_template ? 'template' : 'added' },
new_record_flag: function() { return this.new_record == true && options.is_template == false ? 'new' : '' },
errors_flag: function() { return this.errors && this.errors.length > 0 ? 'error' : '' },
base_name: function() { return options.is_template ? '' : baseInputName + "[" + index + "]"; },
base_dom_id: function() { return options.is_template ? 'category_template' : 'category_' + index; },
if_existing_record: function() { return this.new_record == false }
}, category);
var html = Mustache.to_html(template, category);
if (options.is_template) {
domField = list.append(html).find('.template');
registerTemplateEvents(domField);
}
else {
domField = list.find('> .template').before(html).prev('li');
registerItemEvents(category, domField);
list.sortable('refresh');
if (options.refreshPosition) refreshPosition();
index++;
}
$.fancybox.resize();
}
/* ___ SETUP ___ */
var setup = function() {
// sortable list
list.sortable({
handle: 'span.handle',
items: 'li:not(.template)',
axis: 'y',
update: refreshPosition
});
// add the template field used to insert the new ones
addItem(data.template, { is_template: true });
// add the existing fields (if present)
for (var i = 0; i < data.collection.length; i++)
addItem(data.collection[i]);
submitButton.click(updateTarget);
}
setup(); // <- let's the show begin
};