Merge pull request #2842 from totten/master-api-rollback-soft-errors
[civicrm-core.git] / js / crm.searchForm.js
1 // http://civicrm.org/licensing
2 (function($, _, undefined) {
3 "use strict";
4 var selected = 0,
5 form = 'form.crm-search-form';
6
7 function clearTaskMenu() {
8 $('select#task', form).val('').select2('val', '').prop('disabled', true).select2('disable');
9 }
10
11 function enableTaskMenu() {
12 if (selected || $('[name=radio_ts][value=ts_all]', form).is(':checked')) {
13 $('select#task', form).prop('disabled', false).select2('enable');
14 }
15 }
16
17 function displayCount() {
18 $('label[for*=ts_sel] span', form).text(selected);
19 }
20
21 function countCheckboxes() {
22 return $('input.select-row:checked', form).length;
23 }
24
25 function usesAjax() {
26 return $(form).hasClass('crm-ajax-selection-form');
27 }
28
29 // Use ajax to store selection server-side
30 function phoneHome(single, $el, event) {
31 var url = CRM.url('civicrm/ajax/markSelection');
32 var params = {qfKey: 'civicrm search ' + $('input[name=qfKey]', form).val()};
33 if (!$el.is(':checked')) {
34 params.action = 'unselect';
35 params.state = 'unchecked';
36 }
37 if (single) {
38 params.name = $el.attr('id');
39 } else {
40 params.variableType = 'multiple';
41 // "Reset all" button
42 if ($el.is('a')) {
43 event.preventDefault();
44 $("input.select-row, input.select-rows", form).prop('checked', false).closest('tr').removeClass('crm-row-selected');
45 }
46 // Master checkbox
47 else {
48 params.name = $('input.select-row').map(function() {return $(this).attr('id')}).get().join('-');
49 }
50 }
51 $.getJSON(url, params, function(data) {
52 if (data && data.getCount !== undefined) {
53 selected = data.getCount;
54 displayCount();
55 enableTaskMenu();
56 }
57 });
58 }
59
60 // Handle user interactions with search results
61 $('#crm-container')
62 // When initially loading and reloading (paging) the results
63 .on('crmLoad', function(e) {
64 if ($(e.target).is('#crm-container') || $(e.target).is('#crm-main-content-wrapper')) {
65 clearTaskMenu();
66 if (usesAjax()) {
67 selected = parseInt($('label[for*=ts_sel] span', form).text(), 10);
68 } else {
69 selected = countCheckboxes();
70 displayCount();
71 }
72 enableTaskMenu();
73 }
74 })
75 // When toggling between "all records" and "selected records only"
76 .on('change', '[name=radio_ts]', function() {
77 clearTaskMenu();
78 enableTaskMenu();
79 })
80 // When making a selection
81 .on('click', 'input.select-row, input.select-rows, a.crm-selection-reset', function(event) {
82 var $el = $(this),
83 $form = $el.closest('form'),
84 single = $el.is('input.select-row');
85 clearTaskMenu();
86 $('input[name=radio_ts][value=ts_sel]', $form).prop('checked', true);
87 if (!usesAjax()) {
88 if (single) {
89 selected = countCheckboxes();
90 } else {
91 selected = $el.is(':checked') ? $('input.select-row', $form).length : 0;
92 }
93 displayCount();
94 enableTaskMenu();
95 } else {
96 phoneHome(single, $el, event);
97 }
98 })
99 // When selecting a task
100 .on('change', 'select#task', function() {
101 var $form = $(this).closest('form'),
102 $go = $('input.crm-search-go-button', $form);
103 if (1) {
104 $go.click();
105 }
106 // The following code can load the task in a popup, however not all tasks function correctly with this
107 // So it's disabled pending a per-task opt-in mechanism
108 else {
109 var data = $form.serialize() + '&' + $go.attr('name') + '=' + $go.attr('value');
110 var url = $form.attr('action');
111 url += (url.indexOf('?') < 0 ? '?' : '&') + 'snippet=json';
112 clearTaskMenu();
113 $.post(url, data, function(data) {
114 CRM.loadForm(data.userContext).on('crmFormSuccess', function() {
115 CRM.refreshParent($form);
116 });
117 enableTaskMenu();
118 }, 'json');
119 }
120 });
121
122 })(CRM.$, CRM._);