function submitOnce(obj, formId, procText) {
// if named button clicked, change text
if (obj.value != null) {
- obj.value = procText + " ...";
+ cj('input[name=' + obj.name + ']').val(procText + " ...");
}
cj(obj).closest('form').attr('data-warn-changes', 'false');
if (document.getElementById) { // disable submit button for newer browsers
- obj.disabled = true;
+ cj('input[name=' + obj.name + ']').attr("disabled", true);
document.getElementById(formId).submit();
return true;
}
// Workaround for https://github.com/ivaynberg/select2/issues/1246
$.ui.dialog.prototype._allowInteraction = function(e) {
- return !!$(e.target).closest('.ui-dialog, .ui-datepicker, .select2-drop, .cke_dialog').length;
+ return !!$(e.target).closest('.ui-dialog, .ui-datepicker, .select2-drop, .cke_dialog, #civicrm-menu').length;
};
// Implements jQuery hook.prop
_.each(options, function(option) {
if (option.children) {
rendered += '<optgroup label="' + esc(option.value) + '">' +
- CRM.utils.renderOptions(option.children, val) +
- '</optgroup>';
+ CRM.utils.renderOptions(option.children, val) +
+ '</optgroup>';
} else {
var selected = ($.inArray('' + option.key, val) > -1) ? 'selected="selected"' : '';
rendered += '<option value="' + esc(option.key) + '"' + selected + '>' + esc(option.value) + '</option>';
}
}
-/**
- * Compare Form Input values against cached initial value.
- *
- * @return {Boolean} true if changes have been made.
- */
+ /**
+ * Compare Form Input values against cached initial value.
+ *
+ * @return {Boolean} true if changes have been made.
+ */
CRM.utils.initialValueChanged = function(el) {
var isDirty = false;
$(':input:visible, .select2-container:visible+:input:hidden', el).not('[type=submit], [type=button], .crm-action-menu, :disabled').each(function () {
});
return isDirty;
};
-
+
/**
* This provides defaults for ui.dialog which either need to be calculated or are different from global defaults
*
}
return settings;
};
-
+
/**
* Wrapper for select2 initialization function; supplies defaults
* @param options object
*/
$.fn.crmSelect2 = function(options) {
+ if (options === 'destroy') {
+ return $(this).each(function() {
+ $(this)
+ .removeClass('crm-ajax-select')
+ .select2('destroy');
+ });
+ }
return $(this).each(function () {
var
$el = $(this),
* @param options object
*/
$.fn.crmEntityRef = function(options) {
+ if (options === 'destroy') {
+ return $(this).each(function() {
+ var entity = $(this).data('api-entity') || '';
+ $(this)
+ .off('.crmEntity')
+ .removeClass('crm-form-entityref crm-' + entity.toLowerCase() + '-ref')
+ .crmSelect2('destroy');
+ });
+ }
options = options || {};
options.select = options.select || {};
return $(this).each(function() {
selectParams = {};
$el.data('api-entity', entity);
$el.data('select-params', $.extend({}, $el.data('select-params') || {}, options.select));
- $el.data('api-params', $.extend({}, $el.data('api-params') || {}, options.api));
+ $el.data('api-params', $.extend(true, {}, $el.data('api-params') || {}, options.api));
$el.data('create-links', options.create || $el.data('create-links'));
$el.addClass('crm-form-entityref crm-' + entity.toLowerCase() + '-ref');
var settings = {
minimumInputLength: 1,
formatResult: CRM.utils.formatSelect2Result,
formatSelection: function(row) {
- return row.label;
+ return (row.prefix !== undefined ? row.prefix + ' ' : '') + row.label + (row.suffix !== undefined ? ' ' + row.suffix : '');
},
escapeMarkup: function (m) {return m;},
initSelection: function($el, callback) {
});
}
+ /**
+ * @see http://wiki.civicrm.org/confluence/display/CRMDOC/crmDatepicker
+ */
$.fn.crmDatepicker = function(options) {
return $(this).each(function() {
if ($(this).is('.crm-form-date-wrapper .crm-hidden-date')) {
$timeField = $(),
$clearLink = $();
- if (settings.allowClear !== undefined ? settings.allowClear : !$dataField.hasClass('required')) {
+ if (settings.allowClear !== undefined ? settings.allowClear : !$dataField.is('.required, [required]')) {
$clearLink = $('<a class="crm-hover-button crm-clear-link" title="'+ ts('Clear') +'"><span class="icon ui-icon-close"></span></a>')
.insertAfter($dataField);
}
$dateField = $('<input>').insertAfter($dataField);
copyAttributes($dataField, $dateField, ['placeholder', 'style', 'class', 'disabled']);
$dateField.addClass('crm-form-text crm-form-date');
- settings.dateFormat = settings.dateFormat || CRM.config.dateInputFormat;
- settings.changeMonth = _.includes('m', settings.dateFormat);
- settings.changeYear = _.includes('y', settings.dateFormat);
+ settings.date = typeof settings.date === 'string' ? settings.date : CRM.config.dateInputFormat;
+ settings.changeMonth = _.includes('m', settings.date);
+ settings.changeYear = _.includes('y', settings.date);
$dateField.datepicker(settings).change(updateDataField);
}
// Rudimentary validation. TODO: Roll into use of jQUery validate and ui.datepicker.validation
function isValidDate() {
try {
- $.datepicker.parseDate(settings.dateFormat, $dateField.val());
+ $.datepicker.parseDate(settings.date, $dateField.val());
return true;
} catch (e) {
return false;
else if (row.icon_class) {
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.label + '</div>';
- markup += '<div class="crm-select2-row-description">';
+ markup += '<div><div class="crm-select2-row-label '+(row.label_class || '')+'">' +
+ (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>';
});
}
var markup = '<div class="crm-entityref-filters">' +
'<select class="crm-entityref-filter-key' + (filter.key ? ' active' : '') + '">' +
- '<option value="">' + ts('Refine search...') + '</option>' +
- CRM.utils.renderOptions(filters, filter.key) +
+ '<option value="">' + ts('Refine search...') + '</option>' +
+ CRM.utils.renderOptions(filters, filter.key) +
'</select> ' +
'<select class="crm-entityref-filter-value' + (filter.key ? ' active"' : '"') + (filter.key ? '' : ' style="display:none;"') + '>' +
- '<option value="">' + ts('- select -') + '</option>';
+ '<option value="">' + ts('- select -') + '</option>';
if (filterSpec && filterSpec.options) {
markup += CRM.utils.renderOptions(filterSpec.options, filter.value);
}
.on('submit', function(e) {
// CRM-14353 - disable changes warn when submitting a form
$('[data-warn-changes]').attr('data-warn-changes', 'false');
- })
- ;
+ });
// CRM-14353 - Warn of unsaved changes for forms which have opted in
window.onbeforeunload = function() {
if (CRM.utils.initialValueChanged($('form[data-warn-changes=true]:visible'))) {
return ts('You have unsaved changes.');
- }
- };
-
- /**
- * Function to make multiselect boxes behave as fields in small screens
- */
- function advmultiselectResize() {
- var amswidth = $("#crm-container form:has(table.advmultiselect)").width();
- if (amswidth < 700) {
- $("form table.advmultiselect td").css('display', 'block');
- }
- else {
- $("form table.advmultiselect td").css('display', 'table-cell');
}
- var contactwidth = $('#crm-container #mainTabContainer').width();
- if (contactwidth < 600) {
- $('#crm-container #mainTabContainer').addClass('narrowpage');
- $('#crm-container #mainTabContainer.narrowpage #contactTopBar td').each(function (index) {
- if (index > 1) {
- if (index % 2 === 0) {
- $(this).parent().after('<tr class="narrowadded"></tr>');
- }
- var item = $(this);
- $(this).parent().next().append(item);
- }
- });
- }
- else {
- $('#crm-container #mainTabContainer.narrowpage').removeClass('narrowpage');
- $('#crm-container #mainTabContainer #contactTopBar tr.narrowadded td').each(function () {
- var nitem = $(this);
- var parent = $(this).parent();
- $(this).parent().prev().append(nitem);
- if (parent.children().size() === 0) {
- parent.remove();
- }
- });
- $('#crm-container #mainTabContainer.narrowpage #contactTopBar tr.added').detach();
- }
- var cformwidth = $('#crm-container #Contact .contact_basic_information-section').width();
-
- if (cformwidth < 720) {
- $('#crm-container .contact_basic_information-section').addClass('narrowform');
- $('#crm-container .contact_basic_information-section table.form-layout-compressed td .helpicon').parent().addClass('hashelpicon');
- if (cformwidth < 480) {
- $('#crm-container .contact_basic_information-section').addClass('xnarrowform');
- }
- else {
- $('#crm-container .contact_basic_information-section.xnarrowform').removeClass('xnarrowform');
- }
- }
- else {
- $('#crm-container .contact_basic_information-section.narrowform').removeClass('narrowform');
- $('#crm-container .contact_basic_information-section.xnarrowform').removeClass('xnarrowform');
- }
- }
-
- advmultiselectResize();
- $(window).resize(advmultiselectResize);
+ };
$.fn.crmtooltip = function () {
$(document)
CRM.confirm({
title: ts('Preview'),
resizable: true,
+ // Prevent overlap with the menubar
+ maxHeight: $(window).height() - 30,
+ position: {my: 'center', at: 'center center+15', of: window},
message: '<div class="crm-custom-image-popup"><img style="max-width: 100%" src="' + $(this).attr('href') + '"></div>',
options: null
});
/**
* Clientside currency formatting
* @param number value
+ * @param [optional] boolean onlyNumber - if true, we return formated amount without currency sign
* @param [optional] string format - currency representation of the number 1234.56
* @return string
*/
var currencyTemplate;
- CRM.formatMoney = function(value, format) {
+ CRM.formatMoney = function(value, onlyNumber, format) {
var decimal, separator, sign, i, j, result;
if (value === 'init' && format) {
currencyTemplate = format;
i = parseInt(value = Math.abs(value).toFixed(2)) + '';
j = ((j = i.length) > 3) ? j % 3 : 0;
result = sign + (j ? i.substr(0, j) + separator : '') + i.substr(j).replace(/(\d{3})(?=\d)/g, "$1" + separator) + (2 ? decimal + Math.abs(value - i).toFixed(2).slice(2) : '');
+ if ( onlyNumber ) {
+ return result;
+ }
return format.replace(/1.*234.*56/, result);
};
CRM.checkPerm = function(perm) {
return CRM.permissions[perm];
};
+
+ // Round while preserving sigfigs
+ CRM.utils.sigfig = function(n, digits) {
+ var len = ("" + n).length;
+ var scale = Math.pow(10.0, len-digits);
+ return Math.round(n / scale) * scale;
+ };
})(jQuery, _);