Merge pull request #18158 from mattwire/createProfileContact
[civicrm-core.git] / templates / CRM / Financial / Form / Search.tpl
CommitLineData
6a488035
TO
1{*
2 +--------------------------------------------------------------------+
1188c7a8 3 | Copyright CiviCRM LLC. All rights reserved. |
6a488035 4 | |
1188c7a8
TO
5 | This work is published under the GNU AGPLv3 license with some |
6 | permitted exceptions and without any warranty. For full license |
7 | and copyright information, see https://civicrm.org/licensing |
6a488035
TO
8 +--------------------------------------------------------------------+
9*}
10
11{* Financial search component. *}
16d7b9f4
SL
12{if !isset($batchStatus)}
13 {assign var="batchStatus" value="open"}
14{/if}
6a488035 15<div id="enableDisableStatusMsg" class="crm-container" style="display:none"></div>
f850beb4 16<div class="action-link">
13a3d214 17 <a accesskey="N" href="{crmURL p='civicrm/financial/batch' q="reset=1&action=add&context=$batchStatus"}" id="newBatch" class="button"><span><i class="crm-i fa-plus-circle" aria-hidden="true"></i> {ts}New Accounting Batch{/ts}</span></a>
6a488035
TO
18</div>
19<div class="crm-form-block crm-search-form-block">
20 <div class="crm-accordion-wrapper crm-activity_search-accordion">
21 <div class="crm-accordion-header">
22 {ts}Filter Results{/ts}
23 </div>
24 <div class="crm-accordion-body">
25 <div id="financial-search-form" class="crm-block crm-form-block">
26 <table class="form-layout-compressed">
16d7b9f4 27 {if !empty($elements)}
6a488035
TO
28 {* Loop through all defined search criteria fields (defined in the buildForm() function). *}
29 {foreach from=$elements item=element}
30 <tr class="crm-financial-search-form-block-{$element}">
31 <td class="label">{$form.$element.label}</td>
32 <td>{$form.$element.html}</td>
33 </tr>
34 {/foreach}
16d7b9f4 35 {/if}
6a488035
TO
36 </table>
37 </div>
38 </div>
39 </div>
40</div>
16d7b9f4 41{if !empty($form.batch_update)}<div class="form-layout-compressed">{$form.batch_update.html}&nbsp;{$form.submit.html}</div><br/>{/if}
24e7a504 42<table id="crm-batch-selector-{$batchStatus}" class="row-highlight">
6a488035
TO
43 <thead>
44 <tr>
16d7b9f4 45 <th class="crm-batch-checkbox">{if !empty($form.toggleSelect.html)}{$form.toggleSelect.html}{/if}</th>
6a488035 46 <th class="crm-batch-name">{ts}Batch Name{/ts}</th>
536f0e02 47 <th class="crm-batch-payment_instrument">{ts}Payment Method{/ts}</th>
6a488035
TO
48 <th class="crm-batch-item_count">{ts}Item Count{/ts}</th>
49 <th class="crm-batch-total">{ts}Total Amount{/ts}</th>
50 <th class="crm-batch-status">{ts}Status{/ts}</th>
51 <th class="crm-batch-created_by">{ts}Created By{/ts}</th>
52 <th></th>
53 </tr>
54 </thead>
55</table>
56{include file="CRM/Form/validate.tpl"}
57{literal}
58<script type="text/javascript">
3cc60a06 59CRM.$(function($) {
6a488035
TO
60 var batchSelector;
61 buildBatchSelector();
6f9cd76f 62 $("#batch_update").prop('disabled', false);
6a488035 63
f8db8a66
CW
64 $('#financial-search-form :input')
65 .change(function() {
66 if (!$(this).hasClass('crm-inline-error')) {
67 batchSelector.fnDraw();
68 }
69 })
70 .keypress(function(event) {
71 if (event.which == 13) {
72 event.preventDefault();
73 $(this).change();
74 return false;
75 }
76 });
6a488035
TO
77
78 var checkedRows = [];
79 function buildBatchSelector() {
80 var ZeroRecordText = {/literal}'<div class="status messages">{ts escape="js"}No Accounting Batches match your search criteria.{/ts}</div>'{literal};
81 var sourceUrl = {/literal}'{crmURL p="civicrm/ajax/batchlist" h=0 q="snippet=4&context=financialBatch"}'{literal};
82
24e7a504 83 batchSelector = $('#crm-batch-selector-{/literal}{$batchStatus}{literal}').dataTable({
6a488035
TO
84 "bFilter" : false,
85 "bAutoWidth" : false,
86 "aaSorting" : [],
87 "aoColumns" : [
88 {sClass:'crm-batch-checkbox', bSortable:false},
89 {sClass:'crm-batch-name'},
90 {sClass:'crm-batch-payment_instrument'},
6209e779
PN
91 {sClass:'crm-batch-item_count right', bSortable:false},
92 {sClass:'crm-batch-total right', bSortable:false},
6a488035
TO
93 {sClass:'crm-batch-status'},
94 {sClass:'crm-batch-created_by'},
95 {sClass:'crm-batch-links', bSortable:false},
96 ],
97 "bProcessing": true,
98 "asStripClasses" : ["odd-row", "even-row"],
99 "sPaginationType": "full_numbers",
100 "sDom" : '<"crm-datatable-pager-top"lfp>rt<"crm-datatable-pager-bottom"ip>',
101 "bServerSide": true,
102 "bJQueryUI": true,
103 "sAjaxSource": sourceUrl,
104 "iDisplayLength": 25,
105 "oLanguage": {
106 "sZeroRecords": ZeroRecordText,
107 "sProcessing": {/literal}"{ts escape='js'}Processing...{/ts}"{literal},
108 "sLengthMenu": {/literal}"{ts escape='js'}Show _MENU_ entries{/ts}"{literal},
109 "sInfo": {/literal}"{ts escape='js'}Showing _START_ to _END_ of _TOTAL_ entries{/ts}"{literal},
110 "sInfoEmpty": {/literal}"{ts escape='js'}Showing 0 to 0 of 0 entries{/ts}"{literal},
111 "sInfoFiltered": {/literal}"{ts escape='js'}(filtered from _MAX_ total entries) {/ts}"{literal},
112 "sSearch": {/literal}"{ts escape='js'}Search:{/ts}"{literal},
113 "oPaginate": {
114 "sFirst": {/literal}"{ts escape='js'}First{/ts}"{literal},
115 "sPrevious": {/literal}"{ts escape='js'}Previous{/ts}"{literal},
116 "sNext": {/literal}"{ts escape='js'}Next{/ts}"{literal},
117 "sLast": {/literal}"{ts escape='js'}Last{/ts}"{literal}
118 }
119 },
120 "fnServerParams": function (aoData) {
121 $('#financial-search-form :input').each(function() {
122 if ($(this).val()) {
123 aoData.push(
124 {name:$(this).attr('id'), value: $(this).val()}
125 );
126 }
127 });
128 checkedRows = [];
24e7a504 129 $("#crm-batch-selector-{/literal}{$batchStatus}{literal} input.select-row:checked").each(function() {
6a488035
TO
130 checkedRows.push('#' + $(this).attr('id'));
131 });
132 },
133 "fnRowCallback": function(nRow, aData, iDisplayIndex, iDisplayIndexFull) {
134 var box = $(aData[0]);
135 var id = box.attr('id').replace('check_', '');
136 $(nRow).addClass('crm-entity').attr('data-entity', 'batch').attr('data-id', id).attr('data-status_id', box.attr('data-status_id'));
137 $('td:eq(1)', nRow).wrapInner('<div class="crm-editable crmf-title" />');
138 return nRow;
139 },
140 "fnDrawCallback": function(oSettings) {
30b7642c 141 $(this).trigger('crmLoad');
6a488035
TO
142 $("#toggleSelect").prop('checked', false);
143 if (checkedRows.length) {
144 $(checkedRows.join(',')).prop('checked', true).change();
145 }
146 }
147 });
148 }
149
150 function editRecords(records, op) {
151 records = validateOp(records, op);
152 if (records.length) {
153 $("#enableDisableStatusMsg").dialog({
154 title: {/literal}'{ts escape="js"}Confirm Changes{/ts}'{literal},
155 modal: true,
6a488035
TO
156 open:function() {
157 switch (op) {{/literal}
158 case 'reopen':
159 var msg = '<h3>{ts escape="js"}Are you sure you want to re-open:{/ts}</h3>';
160 break;
161 case 'delete':
162 var msg = '<h3>{ts escape="js"}Are you sure you want to delete:{/ts}</h3>';
163 break;
164 case 'close':
165 var msg = '<h3>{ts escape="js"}Are you sure you want to close:{/ts}</h3>';
166 break;
167 case 'export':
168 var msg = '<h3>{ts escape="js"}Export:{/ts}</h3>\
169 <div>\
170 <label>{ts escape="js"}Format:{/ts}</label>\
171 <select class="export-format">\
172 <option value="IIF">IIF</option>\
173 <option value="CSV">CSV</option>\
174 </select>\
175 </div>';
176 break;
177 {literal}}
178 msg += listRecords(records, op == 'close' || op == 'export');
179 $('#enableDisableStatusMsg').show().html(msg);
180 },
181 buttons: {
182 {/literal}"{ts escape='js'}Cancel{/ts}"{literal}: function() {
183 $(this).dialog("close");
184 },
185 {/literal}"{ts escape='js'}OK{/ts}{literal}": function() {
186 saveRecords(records, op);
187 $(this).dialog("close");
188 }
189 }
190 });
191 }
192 }
193
194 function listRecords(records, compareValues) {
195 var txt = '<ul>',
196 mismatch = false;
197 for (var i in records) {
198 var $tr = $('tr[data-id=' + records[i] + ']');
199 txt += '<li>' + $('.crmf-title', $tr).text();
200 if (compareValues) {
201 $('.actual-value.crm-error', $tr).each(function() {
202 mismatch = true;
203 var $th = $tr.closest('table').find('th').eq($(this).closest('td').index());
204 var $expected = $(this).siblings('.expected-value');
205 var label = $th.text();
206 var actual = $(this).text();
207 var expected = $expected.text();
208 txt += {/literal}'<div class="messages crm-error"><strong>' +
209 label + ' {ts escape="js"}mismatch.{/ts}</strong><br />{ts escape="js"}Expected{/ts}: ' + expected + '<br />{ts escape="js"}Current Total{/ts}: ' + actual + '</div>'{literal};
210 });
211 }
212 txt += '</li>';
213 }
214 txt += '</ul>';
215 if (mismatch) {
216 txt += {/literal}'<div class="messages status">{ts escape="js"}Click OK to override and update expected values.{/ts}</div>'{literal}
217 }
218 return txt;
219 }
220
221 function saveRecords(records, op) {
6a488035
TO
222 var postUrl = CRM.url('civicrm/ajax/rest', 'className=CRM_Financial_Page_AJAX&fnName=assignRemove');
223 //post request and get response
224 $.post(postUrl, {records: records, recordBAO: 'CRM_Batch_BAO_Batch', op: op, key: {/literal}"{crmKey name='civicrm/ajax/ar'}"{literal}},
225 function(response) {
226 //this is custom status set when record update success.
227 if (response.status == 'record-updated-success') {
5de2e536
PN
228 //Redirect CRM-18169
229 window.location.href = CRM.url('civicrm/financial/financialbatches', 'reset=1&batchStatus=' + response.status_id);
6a488035 230 CRM.alert(listRecords(records), op == 'delete' ? {/literal}'{ts escape="js"}Deleted{/ts}' : '{ts escape="js"}Updated{/ts}'{literal}, 'success');
6a488035
TO
231 }
232 else {
233 CRM.alert({/literal}'{ts escape="js"}An error occurred while processing your request.{/ts}', $("#batch_update option[value=" + op + "]").text() + ' {ts escape="js"}Error{/ts}'{literal}, 'error');
234 }
235 },
d9ef1fd1 236 'json').fail(serverError);
6a488035
TO
237 }
238
6a488035
TO
239 function validateOp(records, op) {
240 switch (op) {
241 case 'reopen':
242 var notAllowed = [1, 5];
243 break;
244 case 'close':
245 var notAllowed = [2, 5];
246 break;
247 case 'export':
248 var notAllowed = [5];
249 break;
250 default:
251 return records;
252 }
253 var len = records.length;
254 var invalid = {};
255 var i = 0;
256 while (i < len) {
257 var status = $('tr[data-id='+records[i]+']').data('status_id');
258 if ($.inArray(status, notAllowed) >= 0) {
259 $('#check_' + records[i] + ':checked').prop('checked', false).change();
260 invalid[status] = invalid[status] || [];
261 invalid[status].push(records[i]);
262 records.splice(i, 1);
263 --len;
264 }
265 else {
266 i++;
267 }
268 }
269 for (status in invalid) {
270 i = invalid[status];
271 var msg = (i.length == 1 ? {/literal}'{ts escape="js"}This record already has the status{/ts}' : '{ts escape="js"}The following records already have the status{/ts}'{literal}) + ' ' + $('tr[data-id='+i[0]+'] .crm-batch-status').text() + ':' + listRecords(i);
272 CRM.alert(msg, {/literal}'{ts escape="js"}Cannot{/ts} '{literal} + $("#batch_update option[value=" + op + "]").text());
273 }
274 return records;
275 }
276
277 function serverError() {
278 CRM.alert({/literal}'{ts escape="js"}No response from the server. Check your internet connection and try reloading the page.{/ts}', '{ts escape="js"}Network Error{/ts}'{literal}, 'error');
279 }
280
281 $('#Go').click(function() {
282 var op = $("#batch_update").val();
283 if (op == "") {
284 CRM.alert({/literal}'{ts escape="js"}Please select an action from the menu.{/ts}', '{ts escape="js"}No Action Selected{/ts}'{literal});
285 }
286 else if (!$("input.select-row:checked").length) {
287 CRM.alert({/literal}'{ts escape="js"}Please select one or more batches for this action.{/ts}', '{ts escape="js"}No Batches Selected{/ts}'{literal});
288 }
289 else {
290 records = [];
291 $("input.select-row:checked").each(function() {
292 records.push($(this).attr('id').replace('check_', ''));
293 });
10c5467b
JG
294 if (op == 'export') {
295 // No need for the modal pop-up, just proceed to the next screen.
296 window.location = CRM.url("civicrm/financial/batch/export", {reset: 1, id: records[0], status: 1});
297 return false;
298 }
6a488035
TO
299 editRecords(records, op);
300 }
301 return false;
302 });
303
304 $('#crm-container').on('click', 'a.action-item[href="#"]', function(event) {
305 event.stopImmediatePropagation();
306 editRecords([$(this).closest('tr').attr('data-id')], $(this).attr('rel'));
307 return false;
308 });
309
310});
311
312</script>
313{/literal}