f1d0cdf1e452029533cdc58cbfab1b0afad1fd05
1 // http://civicrm.org/licensing
6 * Handle user input - field or operator selection.
8 * Decide whether to display select drop down, regular text or date
9 * field for the given field and row.
11 function handleUserInputField() {
12 var row
= $(this).closest('tr');
13 var field
= $('select[id^=mapper][id$="_1"]', row
).val();
14 var op
= $('select[id^=operator]', row
).val();
16 // These Ops don't get any input field.
17 var noFieldOps
= ['', 'IS EMPTY', 'IS NOT EMPTY', 'IS NULL', 'IS NOT NULL'];
19 if ($.inArray(op
, noFieldOps
) > -1) {
20 // Hide the fields and return.
21 $('.crm-search-value', row
).hide().find('input, select').val('');
24 $('.crm-search-value', row
).show();
26 if (!CRM
.searchBuilder
.fieldOptions
[field
]) {
30 buildSelect(row
, field
, op
);
33 if ($.inArray(field
, CRM
.searchBuilder
.dateFields
) < 0) {
42 * Add select list if appropriate for this operation
43 * @param row: jQuery object
44 * @param field: string
46 function buildSelect(row
, field
, op
) {
48 // Operators that will get a single drop down list of choices.
49 var dropDownSingleOps
= ['=', '!='];
50 // Multiple select drop down list.
51 var dropDownMultipleOps
= ['IN', 'NOT IN'];
53 if ($.inArray(op
, dropDownMultipleOps
) > -1) {
54 multiSelect
= 'multiple="multiple"';
56 else if ($.inArray(op
, dropDownSingleOps
) < 0) {
57 // If this op is neither supported by single or multiple selects, then we should not render a select list.
62 $('.crm-search-value select', row
).remove();
63 $('input[id^=value]', row
)
65 .after('<select class="form-select required" ' + multiSelect
+ '><option value="">' + ts('Loading') + '...</option></select>');
67 fetchOptions(row
, field
);
71 * Retrieve option list for given row
72 * @param row: jQuery object
73 * @param field: string
75 function fetchOptions(row
, field
) {
76 if (CRM
.searchBuilder
.fieldOptions
[field
] === 'yesno') {
77 CRM
.searchBuilder
.fieldOptions
[field
] = {1: ts('Yes'), 0: ts('No')};
79 if (typeof(CRM
.searchBuilder
.fieldOptions
[field
]) == 'string') {
80 CRM
.api(CRM
.searchBuilder
.fieldOptions
[field
], 'getoptions', {field
: field
}, {
81 success: function(result
, settings
) {
82 var field
= settings
.field
;
84 CRM
.searchBuilder
.fieldOptions
[field
] = result
.values
;
85 buildOptions(settings
.row
, field
);
88 removeSelect(settings
.row
);
91 error: function(result
, settings
) {
92 removeSelect(settings
.row
);
99 buildOptions(row
, field
);
104 * Populate option list for given row
105 * @param row: jQuery object
106 * @param field: string
108 function buildOptions(row
, field
) {
109 var select
= $('.crm-search-value select', row
);
110 var value
= $('input[id^=value]', row
).val();
111 if (value
.length
&& value
.charAt(0) == '(' && value
.charAt(value
.length
- 1) == ')') {
112 value
= value
.slice(1, -1);
114 var options
= value
.split(',');
115 if (select
.attr('multiple') == 'multiple') {
116 select
.find('option').remove();
119 select
.find('option').text(ts('- select -'));
120 if (options
.length
> 1) {
121 options
= [options
[0]];
124 $.each(CRM
.searchBuilder
.fieldOptions
[field
], function(value
, label
) {
125 var selected
= ($.inArray(value
, options
) > -1) ? 'selected="selected"' : '';
126 select
.append('<option value="' + value
+ '"' + selected
+ '>' + label
+ '</option>');
132 * Remove select options and restore input to a plain textfield
133 * @param row: jQuery object
135 function removeSelect(row
) {
136 $('.crm-search-value input', row
).show();
137 $('.crm-search-value select', row
).remove();
141 * Add a datepicker if appropriate for this operation
142 * @param row: jQuery object
144 function buildDate(row
, op
) {
145 var input
= $('.crm-search-value input', row
);
146 // These are operations that should not get a datepicker
147 var datePickerOp
= ($.inArray(op
, ['IN', 'NOT IN', 'LIKE', 'RLIKE']) < 0);
151 else if (!input
.hasClass('hasDatepicker')) {
152 input
.addClass('dateplugin').datepicker({
153 dateFormat
: 'yymmdd',
156 yearRange
: '-100:+20'
163 * @param row: jQuery object
165 function removeDate(row
) {
166 var input
= $('.crm-search-value input', row
);
167 if (input
.hasClass('hasDatepicker')) {
168 input
.removeClass('dateplugin').val('').datepicker('destroy');
172 // Initialize display: Hide empty blocks & fields
173 var newBlock
= CRM
.searchBuilder
&& CRM
.searchBuilder
.newBlock
|| 0;
174 $('.crm-search-block', '#Builder').each(function(blockNo
) {
176 var empty
= blockNo
+ 1 > newBlock
;
177 var skippedRow
= false;
178 $('tr:not(.crm-search-builder-add-row)', block
).each(function(rowNo
) {
180 if ($('select:first', row
).val() === '') {
181 if (!skippedRow
&& (rowNo
== 0 || blockNo
+ 1 == newBlock
)) {
198 // Reset and hide row
199 .on('click', '.crm-reset-builder-row', function() {
200 var row
= $(this).closest('tr');
201 $('input, select', row
).val('').change();
203 // Hide entire block if this is the only visible row
204 if (row
.siblings(':visible').length
< 2) {
205 row
.closest('.crm-search-block').hide();
209 // Add new field - if there's a hidden one, show it
210 // Otherwise allow form to submit and fetch more from the server
211 .on('click', 'input[name^=addMore]', function() {
212 var table
= $(this).closest('table');
213 if ($('tr:hidden', table
).length
) {
214 $('tr:hidden', table
).first().show();
218 // Add new block - if there's a hidden one, show it
219 // Otherwise allow form to submit and fetch more from the server
220 .on('click', '#addBlock', function() {
221 if ($('.crm-search-block:hidden', '#Builder').length
) {
222 var block
= $('.crm-search-block:hidden', '#Builder').first();
224 $('tr:first-child, tr.crm-search-builder-add-row', block
).show();
228 // Handle field and operator selection
229 .on('change', 'select[id^=mapper][id$="_1"], select[id^=operator]', handleUserInputField
)
230 // Handle option selection - update hidden value field
231 .on('change', '.crm-search-value select', function() {
232 var value
= $(this).val() || '';
233 if ($(this).attr('multiple') == 'multiple' && value
.length
) {
234 value
= '(' + value
.join(',') + ')';
236 $(this).siblings('input').val(value
);
241 $('select[id^=mapper][id$="_1"]', '#Builder').each(handleUserInputField
);