From 388d388676e58a302d87a5fb120bfc3ea894a6ec Mon Sep 17 00:00:00 2001 From: "deb.monish" Date: Sat, 26 May 2018 19:51:51 +0530 Subject: [PATCH] dev/core#142 Add chain select to state and counties in Search Builder --- templates/CRM/Contact/Form/Search/Builder.js | 47 ++++++++++++++++++-- 1 file changed, 44 insertions(+), 3 deletions(-) diff --git a/templates/CRM/Contact/Form/Search/Builder.js b/templates/CRM/Contact/Form/Search/Builder.js index b20b3def93..20809d43b9 100644 --- a/templates/CRM/Contact/Form/Search/Builder.js +++ b/templates/CRM/Contact/Form/Search/Builder.js @@ -43,7 +43,7 @@ removeSelect(row); } else { - buildSelect(row, field, op); + buildSelect(row, field, op, false); } if ((field in CRM.searchBuilder.fieldTypes) === true && @@ -74,8 +74,9 @@ * Add select list if appropriate for this operation * @param row: jQuery object * @param field: string + * @param skip_fetch: boolean */ - function buildSelect(row, field, op) { + function buildSelect(row, field, op, skip_fetch) { var multiSelect = ''; // Operators that will get a single drop down list of choices. var dropDownSingleOps = ['=', '!=']; @@ -96,7 +97,13 @@ .hide() .after(''); - fetchOptions(row, field); + // Avoid reloading state/county options IF already built, identified by skip_fetch + if (skip_fetch) { + buildOptions(row, field); + } + else { + fetchOptions(row, field); + } } /** @@ -205,6 +212,33 @@ } } + /** + * Load and build select options for state IF country is chosen OR county options if state is chosen + * @param mapper: string + * @param value: integer + * @param location_type: integer + */ + function chainSelect(mapper, value, location_type) { + var apiParams = { + sequential: 1, + field: (mapper == 'country_id') ? 'state_province' : 'county', + }; + apiParams[mapper] = value; + var fieldName = apiParams.field; + CRM.api3('address', 'getoptions', apiParams, { + success: function(result) { + CRM.searchBuilder.fieldOptions[fieldName] = result.count ? result.values : []; + $('select[id^=mapper][id$="_1"]').each(function() { + var row = $(this).closest('tr'); + var op = $('select[id^=operator]', row).val(); + if ($(this).val() === fieldName && location_type === $('select[id^=mapper][id$="_2"]', row).val()) { + buildSelect(row, fieldName, op, true); + } + }); + } + }); + } + // Initialize display: Hide empty blocks & fields var newBlock = CRM.searchBuilder && CRM.searchBuilder.newBlock || 0; function initialize() { @@ -273,6 +307,13 @@ value = value.join(','); } $(this).siblings('input').val(value); + if (value !== '') { + var mapper = $('#' + $(this).siblings('input').attr('id').replace('value_', 'mapper_') + '_1').val(); + var location_type = $('#' + $(this).siblings('input').attr('id').replace('value_', 'mapper_') + '_2').val(); + if ($.inArray(mapper, ['state_province', 'country']) > -1) { + chainSelect(mapper + '_id', value, location_type); + } + } }) .on('crmLoad', function() { initialize(); -- 2.25.1