}
};
+ var scriptsLoaded = {};
+ CRM.loadScript = function(url) {
+ if (!scriptsLoaded[url]) {
+ var script = document.createElement('script');
+ scriptsLoaded[url] = $.Deferred();
+ script.onload = function () {
+ scriptsLoaded[url].resolve();
+ };
+ script.src = url;
+ document.getElementsByTagName("head")[0].appendChild(script);
+ }
+ return scriptsLoaded[url];
+ };
+
/**
* Populate a select list, overwriting the existing options except for the placeholder.
* @param select jquery selector - 1 or more select elements
// Use select2 ajax helper instead of CRM.api3 because it provides more value
ajax: {
url: CRM.url('civicrm/ajax/rest'),
+ quietMillis: 300,
data: function (input, page_num) {
var params = getEntityRefApiParams($el);
params.input = input;
minimumInputLength: 1,
formatResult: CRM.utils.formatSelect2Result,
formatSelection: function(row) {
- return (row.prefix !== undefined ? row.prefix + ' ' : '') + row.label + (row.suffix !== undefined ? ' ' + row.suffix : '');
+ return _.escape((row.prefix !== undefined ? row.prefix + ' ' : '') + row.label + (row.suffix !== undefined ? ' ' + row.suffix : ''));
},
- escapeMarkup: function (m) {return m;},
+ escapeMarkup: _.identity,
initSelection: function($el, callback) {
var
multiple = !!$el.data('select-params').multiple,
$('#select2-drop')
.off('.crmEntity')
.on('click.crmEntity', 'a.crm-add-entity', function(e) {
+ var extra = $el.data('api-params').extra,
+ formUrl = $(this).attr('href') + '&returnExtra=display_name,sort_name' + (extra ? (',' + extra) : '');
$el.select2('close');
- CRM.loadForm($(this).attr('href'), {
+ CRM.loadForm(formUrl, {
dialog: {width: 500, height: 220}
}).on('crmFormSuccess', function(e, data) {
if (data.status === 'success' && data.id) {
- CRM.status(ts('%1 Created', {1: data.label}));
+ data.label = data.extra.sort_name;
+ CRM.status(ts('%1 Created', {1: data.extra.display_name}));
if ($el.select2('container').hasClass('select2-container-multi')) {
var selection = $el.select2('data');
selection.push(data);
type = hasDatepicker ? 'text' : 'number';
if (settings.allowClear !== undefined ? settings.allowClear : !$dataField.is('.required, [required]')) {
- $clearLink = $('<a class="crm-hover-button crm-clear-link" title="'+ ts('Clear') +'"><i class="crm-i fa-times"></i></a>')
+ $clearLink = $('<a class="crm-hover-button crm-clear-link" title="'+ _.escape(ts('Clear')) +'"><i class="crm-i fa-times"></i></a>')
.insertAfter($dataField);
}
if (settings.time !== false) {
var defaults = {
"processing": true,
"serverSide": true,
- "aaSorting": [],
+ "order": [],
"dom": '<"crm-datatable-pager-top"lfp>rt<"crm-datatable-pager-bottom"ip>',
"pageLength": 25,
+ "pagingType": "full_numbers",
"drawCallback": function(settings) {
//Add data attributes to cells
$('thead th', settings.nTable).each( function( index ) {
markup += '<div class="crm-select2-icon"><div class="crm-icon ' + row.icon_class + '-icon"></div></div>';
}
markup += '<div><div class="crm-select2-row-label '+(row.label_class || '')+'">' +
- (row.prefix !== undefined ? row.prefix + ' ' : '') + row.label + (row.suffix !== undefined ? ' ' + row.suffix : '') +
+ _.escape((row.prefix !== undefined ? row.prefix + ' ' : '') + row.label + (row.suffix !== undefined ? ' ' + row.suffix : '')) +
'</div>' +
'<div class="crm-select2-row-description">';
$.each(row.description || [], function(k, text) {
- markup += '<p>' + text + '</p>';
+ markup += '<p>' + _.escape(text) + '</p>';
});
markup += '</div></div></div>';
return markup;
if (icon) {
markup += '<i class="crm-i ' + icon + '"></i> ';
}
- markup += link.label + '</a>';
+ markup += _.escape(link.label) + '</a>';
});
markup += '</div>';
return markup;
}
var markup = '<div class="crm-entityref-filters">' +
'<select class="crm-entityref-filter-key' + (filter.key ? ' active' : '') + '">' +
- '<option value="">' + ts('Refine search...') + '</option>' +
+ '<option value="">' + _.escape(ts('Refine search...')) + '</option>' +
CRM.utils.renderOptions(filters, filter.key) +
'</select>' + entityRefFilterValueMarkup(filter, filterSpec) + '</div>';
return markup;
attrs += ' ' + attr + '="' + val + '"';
});
if (filterSpec.type === 'select') {
- markup = '<select' + attrs + '><option value="">' + ts('- select -') + '</option>';
+ markup = '<select' + attrs + '><option value="">' + _.escape(ts('- select -')) + '</option>';
if (filterSpec.options) {
markup += CRM.utils.renderOptions(filterSpec.options, filter.value);
}
$el.parent().find('.ui-dialog-titlebar .ui-icon-closethick').removeClass('ui-icon-closethick').addClass('fa-times');
// Add resize button
if ($el.parent().hasClass('crm-container') && $el.dialog('option', 'resizable')) {
- $el.parent().find('.ui-dialog-titlebar').append($('<button class="crm-dialog-titlebar-resize ui-dialog-titlebar-close" title="'+ts('Toggle fullscreen')+'" style="right:2em;"/>').button({icons: {primary: 'fa-expand'}, text: false}));
+ $el.parent().find('.ui-dialog-titlebar').append($('<button class="crm-dialog-titlebar-resize ui-dialog-titlebar-close" title="'+ _.escape(ts('Toggle fullscreen'))+'" style="right:2em;"/>').button({icons: {primary: 'fa-expand'}, text: false}));
$('.crm-dialog-titlebar-resize', $el.parent()).click(function(e) {
if ($el.data('origSize')) {
$el.dialog('option', $el.data('origSize'));
CRM.alert(msg || ts('Sorry an error occurred and your information was not saved'), ts('Error'), 'error');
}
}, options || {});
- var $msg = $('<div class="crm-status-box-outer status-start"><div class="crm-status-box-inner"><div class="crm-status-box-msg">' + opts.start + '</div></div></div>')
+ var $msg = $('<div class="crm-status-box-outer status-start"><div class="crm-status-box-inner"><div class="crm-status-box-msg">' + _.escape(opts.start) + '</div></div></div>')
.appendTo('body');
$msg.css('min-width', $msg.width());
function handle(status, data) {
var endMsg = typeof(opts[status]) === 'function' ? opts[status](data) : opts[status];
if (endMsg) {
- $msg.removeClass('status-start').addClass('status-' + status).find('.crm-status-box-msg').html(endMsg);
+ $msg.removeClass('status-start').addClass('status-' + status).find('.crm-status-box-msg').text(endMsg);
window.setTimeout(function() {
$msg.fadeOut('slow', function() {
$msg.remove();