});
}
});
- dialog: {width: 500, height: 'auto'}
+ }
+ else {
+ selectParams.formatInputTooShort = function() {
+ var txt = $el.data('select-params').formatInputTooShort || $.fn.select2.defaults.formatInputTooShort.call(this);
+ txt += renderEntityRefFilters($el) + renderEntityRefCreateLinks($el);
+ return txt;
+ };
+ selectParams.formatNoMatches = function() {
+ var txt = $el.data('select-params').formatNoMatches || $.fn.select2.defaults.formatNoMatches;
+ txt += renderEntityRefFilters($el) + renderEntityRefCreateLinks($el);
+ return txt;
+ };
+ $el.on('select2-open.crmEntity', function() {
+ var $el = $(this);
+ loadEntityRefFilterOptions($el);
+ $('#select2-drop')
+ .off('.crmEntity')
+ .on('click.crmEntity', 'a.crm-add-entity', function(e) {
+ $el.select2('close');
+ CRM.loadForm($(this).attr('href'), {
++ dialog: {width: 500, height: 220}
+ }).on('crmFormSuccess', function(e, data) {
+ if (data.status === 'success' && data.id) {
+ CRM.status(ts('%1 Created', {1: data.label}));
+ if ($el.select2('container').hasClass('select2-container-multi')) {
+ var selection = $el.select2('data');
+ selection.push(data);
+ $el.select2('data', selection, true);
+ } else {
+ $el.select2('data', data, true);
+ }
+ }
+ });
+ return false;
+ })
+ .on('change.crmEntity', 'select.crm-entityref-filter-value', function() {
+ var filter = $el.data('user-filter') || {};
+ filter.value = $(this).val();
+ $(this).toggleClass('active', !!filter.value);
+ $el.data('user-filter', filter);
+ if (filter.value) {
+ // Once a filter has been chosen, rerender create links and refocus the search box
+ $el.select2('close');
+ $el.select2('open');
+ }
+ })
+ .on('change.crmEntity', 'select.crm-entityref-filter-key', function() {
+ var filter = $el.data('user-filter') || {};
+ filter.key = $(this).val();
+ $(this).toggleClass('active', !!filter.key);
+ $el.data('user-filter', filter);
+ loadEntityRefFilterOptions($el);
+ });
+ });
+ }
+ $el.crmSelect2($.extend(settings, $el.data('select-params'), selectParams));
+ });
+ };
+
+ /**
+ * Combine api-params with user-filter
+ * @param $el
+ * @returns {*}
+ */
+ function getEntityRefApiParams($el) {
+ var
+ params = $.extend({params: {}}, $el.data('api-params') || {}),
+ // Prevent original data from being modified - $.extend and _.clone don't cut it, they pass nested objects by reference!
+ combined = _.cloneDeep(params),
+ filter = $.extend({}, $el.data('user-filter') || {});
+ if (filter.key && filter.value) {
+ // Special case for contact type/sub-type combo
+ if (filter.key === 'contact_type' && (filter.value.indexOf('__') > 0)) {
+ combined.params.contact_type = filter.value.split('__')[0];
+ combined.params.contact_sub_type = filter.value.split('__')[1];
+ } else {
+ // Allow json-encoded api filters e.g. {"BETWEEN":[123,456]}
+ combined.params[filter.key] = filter.value.charAt(0) === '{' ? $.parseJSON(filter.value) : filter.value;
+ }
+ }
+ return combined;
+ }
+
+ function copyAttributes($source, $target, attributes) {
+ _.each(attributes, function(name) {
+ if ($source.attr(name)) {
+ $target.attr(name, $source.attr(name));
+ }
+ });
+ }
+
+ $.fn.crmDatepicker = function(options) {
+ return $(this).each(function() {
+ if ($(this).is('.crm-form-date-wrapper .crm-hidden-date')) {
+ // Already initialized
+ return;
+ }
+ var
+ $dataField = $(this).wrap('<span class="crm-form-date-wrapper" />'),
+ settings = $.extend({}, $dataField.data('datepicker') || {}, options || {}),
+ $dateField = $(),
+ $timeField = $(),
+ $clearLink = $();
+
+ if (settings.allowClear !== undefined ? settings.allowClear : !$dataField.hasClass('required')) {
+ $clearLink = $('<a class="crm-hover-button crm-clear-link" title="'+ ts('Clear') +'"><span class="icon ui-icon-close"></span></a>')
+ .insertAfter($dataField);
+ }
+ if (settings.time !== false) {
+ $timeField = $('<input>').insertAfter($dataField);
+ copyAttributes($dataField, $timeField, ['class', 'disabled']);
+ $timeField
+ .addClass('crm-form-text crm-form-time')
+ .attr('placeholder', $dataField.attr('time-placeholder') === undefined ? ts('Time') : $dataField.attr('time-placeholder'))
+ .change(updateDataField)
+ .timeEntry({
+ spinnerImage: '',
+ show24Hours: settings.time === true || settings.time === undefined ? CRM.config.timeIs24Hr : settings.time == '24'
+ });
+ }
+ if (settings.date !== false) {
+ $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);
+ $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());
+ return true;
+ } catch (e) {
+ return false;
+ }
+ }
+ function updateInputFields(e, context) {
+ var val = $dataField.val(),
+ time = null;
+ if (context !== 'userInput' && context !== 'crmClear') {
+ if ($dateField.length) {
+ $dateField.datepicker('setDate', _.includes(val, '-') ? $.datepicker.parseDate('yy-mm-dd', val) : null);
+ }
+ if ($timeField.length) {
+ if (val.length === 8) {
+ time = val;
+ } else if (val.length === 19) {
+ time = val.split(' ')[1];
+ }
+ $timeField.timeEntry('setTime', time);
+ }
+ }
+ $clearLink.css('visibility', val ? 'visible' : 'hidden');
+ }
+ function updateDataField(e, context) {
+ // The crmClear event wipes all the field values anyway, so no need to respond
+ if (context !== 'crmClear') {
+ var val = '';
+ if ($dateField.val()) {
+ if (isValidDate()) {
+ val = $.datepicker.formatDate('yy-mm-dd', $dateField.datepicker('getDate'));
+ $dateField.removeClass('crm-error');
+ } else {
+ $dateField.addClass('crm-error');
+ }
+ }
+ if ($timeField.val()) {
+ val += (val ? ' ' : '') + $timeField.timeEntry('getTime').toTimeString().substr(0, 8);
+ }
+ $dataField.val(val).trigger('change', ['userInput']);
+ }
+ }
+ $dataField.hide().addClass('crm-hidden-date').on('change', updateInputFields);
+ updateInputFields();
});
};