| 1 | // http://civicrm.org/licensing |
| 2 | (function($, _, undefined) { |
| 3 | "use strict"; |
| 4 | var selected = 0, |
| 5 | form = 'form.crm-search-form', |
| 6 | active = 'a.button, a.action-item:not(.crm-enable-disable), a.crm-popup'; |
| 7 | |
| 8 | function clearTaskMenu() { |
| 9 | $('select#task', form).val('').select2('val', '').prop('disabled', true).select2('disable'); |
| 10 | } |
| 11 | |
| 12 | function enableTaskMenu() { |
| 13 | if (selected || $('[name=radio_ts][value=ts_all]', form).is(':checked')) { |
| 14 | $('select#task', form).prop('disabled', false).select2('enable'); |
| 15 | } |
| 16 | } |
| 17 | |
| 18 | function displayCount() { |
| 19 | $('label[for*=ts_sel] span', form).text(selected); |
| 20 | } |
| 21 | |
| 22 | function countCheckboxes() { |
| 23 | return $('input.select-row:checked', form).length; |
| 24 | } |
| 25 | |
| 26 | function clearSelections(e) { |
| 27 | if (selected) { |
| 28 | var $form = $(this).closest('form'); |
| 29 | $('input.select-row, input.select-rows', $form).prop('checked', false).closest('tr').removeClass('crm-row-selected'); |
| 30 | if (usesAjax()) { |
| 31 | phoneHome(false, $(this)); |
| 32 | } else { |
| 33 | selected = 0; |
| 34 | displayCount(); |
| 35 | } |
| 36 | } |
| 37 | } |
| 38 | |
| 39 | function usesAjax() { |
| 40 | return $(form).hasClass('crm-ajax-selection-form'); |
| 41 | } |
| 42 | |
| 43 | // Use ajax to store selection server-side |
| 44 | function phoneHome(single, $el, event) { |
| 45 | var url = CRM.url('civicrm/ajax/markSelection'); |
| 46 | var params = {qfKey: 'civicrm search ' + $('input[name=qfKey]', form).val()}; |
| 47 | if (!$el.is(':checked') || $el.is('input[name=radio_ts][value=ts_all]')) { |
| 48 | params.action = 'unselect'; |
| 49 | params.state = 'unchecked'; |
| 50 | } |
| 51 | if (single) { |
| 52 | params.name = $el.attr('id'); |
| 53 | } else { |
| 54 | params.variableType = 'multiple'; |
| 55 | // "Reset all" button |
| 56 | if ($el.is('a')) { |
| 57 | event.preventDefault(); |
| 58 | $("input.select-row, input.select-rows", form).prop('checked', false).closest('tr').removeClass('crm-row-selected'); |
| 59 | } |
| 60 | // Master checkbox |
| 61 | else if ($el.hasClass('select-rows')) { |
| 62 | params.name = $('input.select-row').map(function() {return $(this).attr('id')}).get().join('-'); |
| 63 | } |
| 64 | } |
| 65 | $.getJSON(url, params, function(data) { |
| 66 | if (data && data.getCount !== undefined) { |
| 67 | selected = data.getCount; |
| 68 | displayCount(); |
| 69 | enableTaskMenu(); |
| 70 | } |
| 71 | }); |
| 72 | } |
| 73 | |
| 74 | /** |
| 75 | * Refresh the current page |
| 76 | */ |
| 77 | function refresh() { |
| 78 | // Clear cached search results using force=1 argument |
| 79 | var location = $('#crm-main-content-wrapper').crmSnippet().crmSnippet('option', 'url'); |
| 80 | if (!(location.match(/[?&]force=1/))) { |
| 81 | location += '&force=1'; |
| 82 | } |
| 83 | $('#crm-main-content-wrapper').crmSnippet({url: location}).crmSnippet('refresh'); |
| 84 | } |
| 85 | |
| 86 | /** |
| 87 | * When initially loading and reloading (paging) the results |
| 88 | */ |
| 89 | function initForm() { |
| 90 | clearTaskMenu(); |
| 91 | if (usesAjax()) { |
| 92 | selected = parseInt($('label[for*=ts_sel] span', form).text(), 10); |
| 93 | } else { |
| 94 | selected = countCheckboxes(); |
| 95 | displayCount(); |
| 96 | } |
| 97 | enableTaskMenu(); |
| 98 | } |
| 99 | |
| 100 | $(function() { |
| 101 | initForm(); |
| 102 | // Handle user interactions with search results |
| 103 | $('#crm-container') |
| 104 | // When toggling between "all records" and "selected records only" |
| 105 | .on('change', '[name=radio_ts]', function() { |
| 106 | clearTaskMenu(); |
| 107 | enableTaskMenu(); |
| 108 | }) |
| 109 | .on('click', 'input[name=radio_ts][value=ts_all]', clearSelections) |
| 110 | // When making a selection |
| 111 | .on('click', 'input.select-row, input.select-rows, a.crm-selection-reset', function(event) { |
| 112 | var $el = $(this), |
| 113 | $form = $el.closest('form'), |
| 114 | single = $el.is('input.select-row'); |
| 115 | clearTaskMenu(); |
| 116 | $('input[name=radio_ts][value=ts_sel]', $form).prop('checked', true); |
| 117 | if (!usesAjax()) { |
| 118 | if (single) { |
| 119 | selected = countCheckboxes(); |
| 120 | } else { |
| 121 | selected = $el.is(':checked') ? $('input.select-row', $form).length : 0; |
| 122 | } |
| 123 | displayCount(); |
| 124 | enableTaskMenu(); |
| 125 | } else { |
| 126 | phoneHome(single, $el, event); |
| 127 | } |
| 128 | }) |
| 129 | // When selecting a task |
| 130 | .on('change', 'select#task', function() { |
| 131 | var $form = $(this).closest('form'), |
| 132 | $go = $('input.crm-search-go-button', $form); |
| 133 | if (1) { |
| 134 | $go.click(); |
| 135 | } |
| 136 | // The following code can load the task in a popup, however not all tasks function correctly with this |
| 137 | // So it's disabled pending a per-task opt-in mechanism |
| 138 | else { |
| 139 | var data = $form.serialize() + '&' + $go.attr('name') + '=' + $go.attr('value'); |
| 140 | var url = $form.attr('action'); |
| 141 | url += (url.indexOf('?') < 0 ? '?' : '&') + 'snippet=json'; |
| 142 | clearTaskMenu(); |
| 143 | $.post(url, data, function(data) { |
| 144 | CRM.loadForm(data.userContext).on('crmFormSuccess', refresh); |
| 145 | enableTaskMenu(); |
| 146 | }, 'json'); |
| 147 | } |
| 148 | }); |
| 149 | |
| 150 | // Add a specialized version of livepage functionality |
| 151 | $('#crm-main-content-wrapper') |
| 152 | .on('crmLoad', function(e) { |
| 153 | if ($(e.target).is(this)) { |
| 154 | initForm(); |
| 155 | } |
| 156 | }) |
| 157 | // Open action links in a popup |
| 158 | .off('.crmLivePage') |
| 159 | .on('click.crmLivePage', active, CRM.popup) |
| 160 | .on('crmPopupFormSuccess.crmLivePage', active, refresh); |
| 161 | }); |
| 162 | |
| 163 | })(CRM.$, CRM._); |