| 1 | // http://civicrm.org/licensing |
| 2 | (function($, _, undefined) { |
| 3 | "use strict"; |
| 4 | var selected = 0, |
| 5 | form = 'form.crm-search-form', |
| 6 | active = '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 | /* jshint validthis: true */ |
| 28 | if (selected) { |
| 29 | var $form = $(this).closest('form'); |
| 30 | $('input.select-row, input.select-rows', $form).prop('checked', false).closest('tr').removeClass('crm-row-selected'); |
| 31 | if (usesAjax()) { |
| 32 | phoneHome(false, $(this)); |
| 33 | } else { |
| 34 | selected = 0; |
| 35 | displayCount(); |
| 36 | } |
| 37 | } |
| 38 | } |
| 39 | |
| 40 | function usesAjax() { |
| 41 | return $(form).hasClass('crm-ajax-selection-form'); |
| 42 | } |
| 43 | |
| 44 | // Use ajax to store selection server-side |
| 45 | function phoneHome(single, $el, event) { |
| 46 | var url = CRM.url('civicrm/ajax/markSelection'); |
| 47 | var params = {qfKey: 'civicrm search ' + $('input[name=qfKey]', form).val()}; |
| 48 | if (!$el.is(':checked') || $el.is('input[name=radio_ts][value=ts_all]')) { |
| 49 | params.action = 'unselect'; |
| 50 | params.state = 'unchecked'; |
| 51 | } |
| 52 | if (single) { |
| 53 | params.name = $el.attr('id'); |
| 54 | } else { |
| 55 | params.variableType = 'multiple'; |
| 56 | // "Reset all" button |
| 57 | if ($el.is('a')) { |
| 58 | event.preventDefault(); |
| 59 | $("input.select-row, input.select-rows", form).prop('checked', false).closest('tr').removeClass('crm-row-selected'); |
| 60 | } |
| 61 | // Master checkbox |
| 62 | else if ($el.hasClass('select-rows')) { |
| 63 | params.name = $('input.select-row').map(function() {return $(this).attr('id');}).get().join('-'); |
| 64 | } |
| 65 | } |
| 66 | $.post(url, params, function(data) { |
| 67 | if (data && data.getCount !== undefined) { |
| 68 | selected = data.getCount; |
| 69 | displayCount(); |
| 70 | enableTaskMenu(); |
| 71 | } |
| 72 | }, 'json'); |
| 73 | } |
| 74 | |
| 75 | /** |
| 76 | * Refresh the current page |
| 77 | */ |
| 78 | function refresh() { |
| 79 | // Clear cached search results using force=1 argument |
| 80 | var location = $('#crm-main-content-wrapper').crmSnippet().crmSnippet('option', 'url'); |
| 81 | if (!(location.match(/[?&]force=1/))) { |
| 82 | location += '&force=1'; |
| 83 | } |
| 84 | $('#crm-main-content-wrapper').crmSnippet({url: location}).crmSnippet('refresh'); |
| 85 | } |
| 86 | |
| 87 | /** |
| 88 | * When initially loading and reloading (paging) the results |
| 89 | */ |
| 90 | function initForm() { |
| 91 | clearTaskMenu(); |
| 92 | if (usesAjax()) { |
| 93 | selected = parseInt($('label[for*=ts_sel] span', form).text(), 10); |
| 94 | } else { |
| 95 | selected = countCheckboxes(); |
| 96 | displayCount(); |
| 97 | } |
| 98 | enableTaskMenu(); |
| 99 | } |
| 100 | |
| 101 | $(function() { |
| 102 | initForm(); |
| 103 | |
| 104 | // Focus first search field |
| 105 | $('.crm-form-text:input:visible:first', 'form.crm-search-form').focus(); |
| 106 | |
| 107 | // Handle user interactions with search results |
| 108 | $('#crm-container') |
| 109 | // When toggling between "all records" and "selected records only" |
| 110 | .on('change', '[name=radio_ts]', function() { |
| 111 | clearTaskMenu(); |
| 112 | enableTaskMenu(); |
| 113 | }) |
| 114 | .on('click', 'input[name=radio_ts][value=ts_all]', clearSelections) |
| 115 | // When making a selection |
| 116 | .on('click', 'input.select-row, input.select-rows, a.crm-selection-reset', function(event) { |
| 117 | var $el = $(this), |
| 118 | $form = $el.closest('form'), |
| 119 | single = $el.is('input.select-row'); |
| 120 | clearTaskMenu(); |
| 121 | $('input[name=radio_ts][value=ts_sel]', $form).prop('checked', true); |
| 122 | if (!usesAjax()) { |
| 123 | if (single) { |
| 124 | selected = countCheckboxes(); |
| 125 | } else { |
| 126 | selected = $el.is(':checked') ? $('input.select-row', $form).length : 0; |
| 127 | } |
| 128 | displayCount(); |
| 129 | enableTaskMenu(); |
| 130 | } else { |
| 131 | phoneHome(single, $el, event); |
| 132 | } |
| 133 | }) |
| 134 | // When selecting a task |
| 135 | .on('change', 'select#task', function(e) { |
| 136 | var $form = $(this).closest('form'), |
| 137 | $go = $('button.crm-search-go-button', $form); |
| 138 | var $selectedOption = $(this).find(':selected'); |
| 139 | if (!$selectedOption.val()) { |
| 140 | // do not blank refresh the empty option. |
| 141 | return; |
| 142 | } |
| 143 | if ($selectedOption.data('is_confirm')) { |
| 144 | var confirmed = false; |
| 145 | var refresh_fields = $selectedOption.data('confirm_refresh_fields'); |
| 146 | var $message = '<tr>' + (($selectedOption.data('confirm_message') !== undefined) ? $selectedOption.data('confirm_message') : '') + '</tr>'; |
| 147 | if (refresh_fields === undefined) { |
| 148 | refresh_fields = {}; |
| 149 | } |
| 150 | $.each(refresh_fields, function (refreshIndex, refreshValue) { |
| 151 | var $refresh_field = $(refreshValue.selector); |
| 152 | var prependText = (refreshValue.prepend !== undefined) ? refreshValue.prepend : ''; |
| 153 | var existingInput = $refresh_field.find('input').val(); |
| 154 | $message = $message + '<tr>' + $refresh_field.html().replace(existingInput, prependText + existingInput) + '</tr>'; |
| 155 | }); |
| 156 | |
| 157 | CRM.confirm({ |
| 158 | title: $selectedOption.data('confirm_title') ? $selectedOption.data('confirm_title') : ts('Confirm action'), |
| 159 | message: '<table class="form-layout">' + $message + '</table>' |
| 160 | }) |
| 161 | .on('crmConfirm:yes', function() { |
| 162 | confirmed = true; |
| 163 | $.each(refresh_fields, function (refreshIndex, refreshValue) { |
| 164 | $('#' + refreshIndex).val($('.crm-confirm #' + refreshIndex).val()); |
| 165 | }); |
| 166 | $go.click(); |
| 167 | }) |
| 168 | .on('crmConfirm:no', function() { |
| 169 | $('#task').val('').change(); |
| 170 | return; |
| 171 | }); |
| 172 | } |
| 173 | else if (!$(this).find(':selected').data('supports_modal')) { |
| 174 | $go.click(); |
| 175 | $('#task').val('').select2('val', ''); |
| 176 | } |
| 177 | // The following code can load the task in a popup, however not all tasks function correctly with this |
| 178 | // So it's a per-task opt-in mechanism. |
| 179 | else { |
| 180 | var data = $form.serialize() + '&' + $go.attr('name') + '=' + $go.attr('value'); |
| 181 | var url = $form.attr('action'); |
| 182 | url += (url.indexOf('?') < 0 ? '?' : '&') + 'snippet=json'; |
| 183 | clearTaskMenu(); |
| 184 | $.post(url, data, function(data) { |
| 185 | CRM.loadForm(data.userContext).on('crmFormSuccess', refresh); |
| 186 | enableTaskMenu(); |
| 187 | }, 'json'); |
| 188 | } |
| 189 | }); |
| 190 | |
| 191 | // Add a specialized version of livepage functionality |
| 192 | $('#crm-main-content-wrapper') |
| 193 | .on('crmLoad', function(e) { |
| 194 | if ($(e.target).is(this)) { |
| 195 | initForm(); |
| 196 | } |
| 197 | }) |
| 198 | // Open action links in a popup |
| 199 | .off('.crmLivePage') |
| 200 | .on('click.crmLivePage', active, CRM.popup) |
| 201 | .on('crmPopupFormSuccess.crmLivePage', active, refresh); |
| 202 | }); |
| 203 | |
| 204 | })(CRM.$, CRM._); |