jQuery(document).ready(function() {
jQuery('html').removeClass('no-js');
if (window.SONATA_CONFIG.CONFIRM_EXIT) {
jQuery('.sonata-ba-form form').confirmExit();
}
Admin.add_pretty_errors(document);
Admin.add_filters(document);
Admin.set_object_field_value(document);
Admin.setup_collection_buttons(document);
Admin.setup_per_page_switcher(document);
Admin.setup_form_tabs_for_errors(document);
Admin.setup_inline_form_errors(document);
});
var Admin = {
/**
* render log message
* @param mixed
*/
log: function() {
var msg = '[Sonata.Admin] ' + Array.prototype.join.call(arguments,', ');
if (window.console && window.console.log) {
window.console.log(msg);
} else if (window.opera && window.opera.postError) {
window.opera.postError(msg);
}
},
/**
* display related errors messages
*
* @param subject
*/
add_pretty_errors: function(subject) {
jQuery('div.sonata-ba-field-error', subject).each(function(index, element) {
var input = jQuery('input, textarea, select', element);
var message = jQuery('div.sonata-ba-field-error-messages', element).html();
jQuery('div.sonata-ba-field-error-messages', element).html('');
if (!message) {
message = '';
}
if (message.length == 0) {
return;
}
var target;
/* Hack to handle qTip on select */
if(jQuery(input).is('select')) {
input.wrap('');
target = input.parent();
}
else {
target = input;
}
target.popover({
content: message,
trigger:'focus',
html: true,
placement: 'right',
template: '
'
});
});
},
stopEvent: function(event) {
// https://github.com/sonata-project/SonataAdminBundle/issues/151
//if it is a standard browser use preventDefault otherwise it is IE then return false
if(event.preventDefault) {
event.preventDefault();
} else {
event.returnValue = false;
}
//if it is a standard browser get target otherwise it is IE then adapt syntax and get target
if (typeof event.target != 'undefined') {
targetElement = event.target;
} else {
targetElement = event.srcElement;
}
return targetElement;
},
add_filters: function(subject) {
jQuery('div.filter_container .sonata-filter-option', subject).hide();
jQuery('fieldset.filter_legend', subject).click(function(event) {
jQuery('div.filter_container .sonata-filter-option', jQuery(event.target).parent()).toggle();
});
},
/**
* Change object field value
* @param subject
*/
set_object_field_value: function(subject) {
this.log(jQuery('a.sonata-ba-edit-inline', subject));
jQuery('a.sonata-ba-edit-inline', subject).click(function(event) {
Admin.stopEvent(event);
var subject = jQuery(this);
jQuery.ajax({
url: subject.attr('href'),
type: 'POST',
success: function(json) {
if(json.status === "OK") {
var elm = jQuery(subject).parent();
elm.children().remove();
// fix issue with html comment ...
elm.html(jQuery(json.content.replace(//g, "")).html());
elm.effect("highlight", {'color' : '#57A957'}, 2000);
Admin.set_object_field_value(elm);
} else {
jQuery(subject).parent().effect("highlight", {'color' : '#C43C35'}, 2000);
}
}
});
});
},
setup_collection_buttons: function(subject) {
jQuery(subject).on('click', '.sonata-collection-add', function(event) {
Admin.stopEvent(event);
var container = jQuery(this).closest('[data-prototype]');
var proto = container.attr('data-prototype');
var protoName = container.attr('data-prototype-name') || '__name__';
// Set field id
var idRegexp = new RegExp(container.attr('id')+'_'+protoName,'g');
proto = proto.replace(idRegexp, container.attr('id')+'_'+(container.children().length - 1));
// Set field name
var parts = container.attr('id').split('_');
var nameRegexp = new RegExp(parts[parts.length-1]+'\\]\\['+protoName,'g');
proto = proto.replace(nameRegexp, parts[parts.length-1]+']['+(container.children().length - 1));
jQuery(proto).insertBefore(jQuery(this).parent());
jQuery(this).trigger('sonata-collection-item-added');
});
jQuery(subject).on('click', '.sonata-collection-delete', function(event) {
Admin.stopEvent(event);
jQuery(this).closest('.sonata-collection-row').remove();
jQuery(this).trigger('sonata-collection-item-deleted');
});
},
setup_per_page_switcher: function(subject) {
jQuery('select.per-page').change(function(event) {
jQuery('input[type=submit]').hide();
window.top.location.href=this.options[this.selectedIndex].value;
});
},
setup_form_tabs_for_errors: function(subject) {
// Switch to first tab with server side validation errors on page load
jQuery('form', subject).each(function() {
Admin.show_form_first_tab_with_errors(jQuery(this), '.sonata-ba-field-error');
});
// Switch to first tab with HTML5 errors on form submit
jQuery(subject)
.on('click', 'form [type="submit"]', function() {
Admin.show_form_first_tab_with_errors(jQuery(this).closest('form'), ':invalid');
})
.on('keypress', 'form [type="text"]', function(e) {
if (13 === e.which) {
Admin.show_form_first_tab_with_errors(jQuery(this), ':invalid');
}
})
;
},
show_form_first_tab_with_errors: function(form, errorSelector) {
var tabs = form.find('.nav-tabs a'),
firstTabWithErrors;
tabs.each(function() {
var id = jQuery(this).attr('href'),
tab = jQuery(this),
icon = tab.find('.has-errors');
if (jQuery(id).find(errorSelector).length > 0) {
// Only show first tab with errors
if (!firstTabWithErrors) {
tab.tab('show');
firstTabWithErrors = tab;
}
icon.removeClass('hide');
} else {
icon.addClass('hide');
}
});
},
setup_inline_form_errors: function(subject) {
var deleteCheckboxSelector = '.sonata-ba-field-inline-table [id$="_delete"][type="checkbox"]';
jQuery(deleteCheckboxSelector, subject).each(function() {
Admin.switch_inline_form_errors(jQuery(this));
});
$(subject).on('change', deleteCheckboxSelector, function() {
Admin.switch_inline_form_errors(jQuery(this));
});
},
/**
* Disable inline form errors when the row is marked for deletion
*/
switch_inline_form_errors: function(deleteCheckbox) {
var row = deleteCheckbox.closest('.sonata-ba-field-inline-table'),
errors = row.find('.sonata-ba-field-error-messages')
;
if (deleteCheckbox.is(':checked')) {
row
.find('[required]')
.removeAttr('required')
.attr('data-required', 'required')
;
errors.hide();
} else {
row
.find('[data-required]')
.attr('required', 'required')
;
errors.show();
}
}
};