get conflict column disaply results with line breaks, and force enable searches for...
[civicrm-core.git] / templates / CRM / Contact / Page / DedupeFind.tpl
CommitLineData
6a488035
TO
1{*
2 +--------------------------------------------------------------------+
39de6fd5 3 | CiviCRM version 4.6 |
6a488035 4 +--------------------------------------------------------------------+
e7112fa7 5 | Copyright CiviCRM LLC (c) 2004-2015 |
6a488035
TO
6 +--------------------------------------------------------------------+
7 | This file is a part of CiviCRM. |
8 | |
9 | CiviCRM is free software; you can copy, modify, and distribute it |
10 | under the terms of the GNU Affero General Public License |
11 | Version 3, 19 November 2007 and the CiviCRM Licensing Exception. |
12 | |
13 | CiviCRM is distributed in the hope that it will be useful, but |
14 | WITHOUT ANY WARRANTY; without even the implied warranty of |
15 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
16 | See the GNU Affero General Public License for more details. |
17 | |
18 | You should have received a copy of the GNU Affero General Public |
19 | License and the CiviCRM Licensing Exception along |
20 | with this program; if not, contact CiviCRM LLC |
21 | at info[AT]civicrm[DOT]org. If you have questions about the |
22 | GNU Affero General Public License or the licensing of CiviCRM, |
23 | see the CiviCRM license FAQ at http://civicrm.org/licensing |
24 +--------------------------------------------------------------------+
25*}
26{if $action eq 2 || $action eq 16}
27<div class="form-item">
63ef778e 28 <div class="crm-accordion-wrapper crm-search_filters-accordion">
29 <div class="crm-accordion-header">
30 {ts}Filter Contacts{/ts}</a>
31 </div><!-- /.crm-accordion-header -->
32 <div class="crm-accordion-body">
33 <table class="no-border form-layout-compressed" id="searchOptions" style="width:100%;">
34 <tr>
35 <td class="crm-contact-form-block-contact1">
36 <label for="contact1">{ts}Contact 1{/ts}</label><br />
37 <input type="text" placeholder="Search Contact1" search-column="2" />
38 </td>
39 <td class="crm-contact-form-block-contact2">
40 <label for="contact2">{ts}Contact 2{/ts}</label><br />
41 <input type="text" placeholder="Search Contact2" search-column="5" />
42 </td>
43 <td class="crm-contact-form-block-email1">
44 <label for="email1">{ts}Email 1{/ts}</label><br />
45 <input type="text" placeholder="Search Email1" search-column="3" />
46 </td>
47 <td class="crm-contact-form-block-email2">
48 <label for="email2">{ts}Email 2{/ts}</label><br />
49 <input type="text" placeholder="Search Email2" search-column="6" />
50 </td>
51 </tr>
52 <tr>
53 <td class="crm-contact-form-block-street-address1">
54 <label for="street-adddress1">{ts}Street Address 1{/ts}</label><br />
55 <input type="text" placeholder="Search Street Address1" search-column="7" />
56 </td>
57 <td class="crm-contact-form-block-street-address2">
58 <label for="street-adddress2">{ts}Street Address 2{/ts}</label><br />
59 <input type="text" placeholder="Search Street Address2" search-column="8" />
60 </td>
61 <td class="crm-contact-form-block-postcode1">
62 <label for="postcode1">{ts}Postcode 1{/ts}</label><br />
63 <input type="text" placeholder="Search Postcode1" search-column="9" />
64 </td>
65 <td class="crm-contact-form-block-postcode2">
66 <label for="postcode2">{ts}Postcode 2{/ts}</label><br />
67 <input type="text" placeholder="Search Postcode2" search-column="10" />
68 </td>
69 </tr>
70 </table>
71 </div><!-- /.crm-accordion-body -->
72 </div><!-- /.crm-accordion-wrapper -->
73 <div>
74 Show / Hide columns:
75 <input type='checkbox' id ='steet-address' class='toggle-vis' data-column-main="7" data-column-dupe="8" >
76 <label for="steet-address">{ts}Street Address{/ts}&nbsp;</label>
77 <input type='checkbox' id ='post-code' class='toggle-vis' data-column-main="9" data-column-dupe="10" >
78 <label for="post-code">{ts}Post Code{/ts}&nbsp;</label>
79 <input type='checkbox' id ='conflicts' class='toggle-vis' data-column-main="11" >
80 <label for="conflicts">{ts}Conflicts{/ts}&nbsp; </label>
81 <input type='checkbox' id ='threshold' class='toggle-vis' data-column-main="12" >
82 <label for="threshold">{ts}Threshold{/ts}&nbsp;</label>
83 </div><br/>
84 <span id="dupePairs_length_selection">
85 <input type='checkbox' id ='crm-dedupe-display-selection' name="display-selection">
86 <label for="display-selection">{ts}Within Selections{/ts}&nbsp;</label>
87 </span>
88 <table id="dupePairs" class="nestedActivitySelector form-layout-compressed" cellspacing="0" width="100%">
6a488035 89 <thead>
63ef778e 90 <tr class="columnheader">
91 <th class="crm-dedupe-selection"><input type="checkbox" value="0" name="pnid_all" class="crm-dedupe-select-all"></th>
92 <th class="crm-empty">&nbsp;</th>
93 <th class="crm-contact">{ts}Contact{/ts} 1</th>
94 <th class="crm-empty">&nbsp;</th>
95 <th class="crm-contact-duplicate">{ts}Contact{/ts} 2 ({ts}Duplicate{/ts})</th>
96 <th class="crm-contact">{ts}Email{/ts} 1</th>
97 <th class="crm-contact-duplicate">{ts}Email{/ts} 2 ({ts}Duplicate{/ts})</th>
98 <th class="crm-contact">{ts}Street Address{/ts} 1</th>
99 <th class="crm-contact-duplicate">{ts}Street Address{/ts} 2 ({ts}Duplicate{/ts})</th>
100 <th class="crm-contact">{ts}Postcode{/ts} 1</th>
101 <th class="crm-contact-duplicate">{ts}Postcode{/ts} 2 ({ts}Duplicate{/ts})</th>
102 <th class="crm-contact-conflicts">{ts}Conflicts{/ts}</th>
103 <th class="crm-threshold">{ts}Threshold{/ts}</th>
104 <th class="crm-empty">&nbsp;</th>
105 </tr>
6a488035 106 </thead>
63ef778e 107 <tbody>
108 </tbody>
6a488035 109 </table>
6a488035
TO
110 {if $cid}
111 <table style="width: 45%; float: left; margin: 10px;">
112 <tr class="columnheader"><th colspan="2">{ts 1=$main_contacts[$cid]}Merge %1 with{/ts}</th></tr>
113 {foreach from=$dupe_contacts[$cid] item=dupe_name key=dupe_id}
114 {if $dupe_name}
115 {capture assign=link}<a href="{crmURL p='civicrm/contact/view' q="reset=1&cid=$dupe_id"}">{$dupe_name}</a>{/capture}
116 {capture assign=merge}<a href="{crmURL p='civicrm/contact/merge' q="reset=1&cid=$cid&oid=$dupe_id"}">{ts}merge{/ts}</a>{/capture}
117 <tr class="{cycle values="odd-row,even-row"}">
118 <td>{$link}</td>
119 <td style="text-align: right">{$merge}</td>
aeb97cc1 120 <td style="text-align: right"><a class='crm-notDuplicate' href="#" title={ts}not a duplicate{/ts} onClick="processDupes( {$main.srcID}, {$main.dstID}, 'dupe-nondupe' );return false;">{ts}not a duplicate{/ts}</a></td>
6a488035
TO
121 </tr>
122 {/if}
123 {/foreach}
124 </table>
125 {/if}
126</div>
127
128{if $context eq 'search'}
aeb97cc1 129 {crmButton href=$backURL icon="close"}{ts}Done{/ts}{/crmButton}
63ef778e 130{elseif $context eq 'conflicts'}
fd630ef9 131 {if call_user_func(array('CRM_Core_Permission','check'), 'force merge duplicate contacts')}
132 {if $gid}
133 {capture assign=backURL}{crmURL p="civicrm/contact/dedupemerge" q="reset=1&rgid=`$rgid`&gid=`$gid`&action=map&mode=aggressive" a=1}{/capture}
134 {else}
135 {capture assign=backURL}{crmURL p="civicrm/contact/dedupemerge" q="reset=1&rgid=`$rgid`&action=map&mode=aggressive" a=1}{/capture}
136 {/if}
137 <a href="{$backURL}" title="{ts}Batch Merge Duplicate Contacts{/ts}" onclick="return confirm('{ts escape="js"}This will run the batch merge process on the selected duplicates. The operation will run in force merge mode - all selected duplicates will be merged into main contacts even in case of any conflicts. Click OK to proceed if you are sure you wish to run this operation.{/ts}');" class="button"><span>{ts}Force Merge Selected Duplicates{/ts}</span></a>
63ef778e 138
fd630ef9 139 {if $gid}
140 {capture assign=backURL}{crmURL p="civicrm/contact/dedupemerge" q="reset=1&rgid=`$rgid`&gid=`$gid`&action=map" a=1}{/capture}
141 {else}
142 {capture assign=backURL}{crmURL p="civicrm/contact/dedupemerge" q="reset=1&rgid=`$rgid`&action=map" a=1}{/capture}
143 {/if}
144 <a href="{$backURL}" title="{ts}Batch Merge Duplicate Contacts{/ts}" onclick="return confirm('{ts escape="js"}This will run the batch merge process on the selected duplicates. The operation will run in safe mode - only records with no direct data conflicts will be merged. Click OK to proceed if you are sure you wish to run this operation.{/ts}');" class="button"><span>{ts}Safe Merge Selected Duplicates{/ts}</span></a>
63ef778e 145 {/if}
63ef778e 146
147 {if $gid}
148 {capture assign=backURL}{crmURL p="civicrm/contact/dedupefind" q="reset=1&action=update&rgid=`$rgid`&gid=`$gid`" a=1}{/capture}
149 {else}
150 {capture assign=backURL}{crmURL p="civicrm/contact/dedupefind" q="reset=1&action=update&rgid=`$rgid`" a=1}{/capture}
151 {/if}
152 <a href="{$backURL}" title="{ts}List All Duplicates{/ts}" class="button"><span>{ts}List All Duplicates{/ts}</span></a>
6a488035
TO
153{else}
154 {if $gid}
155 {capture assign=backURL}{crmURL p="civicrm/contact/dedupefind" q="reset=1&rgid=`$rgid`&gid=`$gid`&action=renew" a=1}{/capture}
156 {else}
157 {capture assign=backURL}{crmURL p="civicrm/contact/dedupefind" q="reset=1&rgid=`$rgid`&action=renew" a=1}{/capture}
158 {/if}
fd66df85 159 <a href="{$backURL}" title="{ts}Refresh List of Duplicates{/ts}" onclick="return confirm('{ts escape="js"}This will refresh the duplicates list. Click OK to proceed.{/ts}');" class="button">
aeb97cc1 160 <span><span class="icon ui-icon-refresh"></span> {ts}Refresh Duplicates{/ts}</span>
fd66df85 161 </a>
6a488035
TO
162
163 {if $gid}
63ef778e 164 {capture assign=backURL}{crmURL p="civicrm/contact/dedupemerge" q="reset=1&rgid=`$rgid`&gid=`$gid`&action=map" a=1}{/capture}
6a488035 165 {else}
63ef778e 166 {capture assign=backURL}{crmURL p="civicrm/contact/dedupemerge" q="reset=1&rgid=`$rgid`&action=map" a=1}{/capture}
6a488035 167 {/if}
63ef778e 168 <a href="{$backURL}" title="{ts}Batch Merge Duplicate Contacts{/ts}" onclick="return confirm('{ts escape="js"}This will run the batch merge process on the selected duplicates. The operation will run in safe mode - only records with no direct data conflicts will be merged. Click OK to proceed if you are sure you wish to run this operation.{/ts}');" class="button"><span><div class="icon ui-icon-script"></div>{ts}Batch Merge Selected Duplicates{/ts}</span></a>
169
170 {if $gid}
171 {capture assign=backURL}{crmURL p="civicrm/contact/dedupemerge" q="reset=1&rgid=`$rgid`&gid=`$gid`" a=1}{/capture}
172 {else}
173 {capture assign=backURL}{crmURL p="civicrm/contact/dedupemerge" q="reset=1&rgid=`$rgid`" a=1}{/capture}
174 {/if}
175 <a href="{$backURL}" title="{ts}Batch Merge Duplicate Contacts{/ts}" onclick="return confirm('{ts escape="js"}This will run the batch merge process on the listed duplicates. The operation will run in safe mode - only records with no direct data conflicts will be merged. Click OK to proceed if you are sure you wish to run this operation.{/ts}');" class="button"><span><div class="icon ui-icon-script"></div>{ts}Batch Merge All Duplicates{/ts}</span></a>
6a488035 176
fd630ef9 177 <a href='#' title="{ts}Flip Selected Duplicates{/ts}" class="crm-dedupe-flip-selections button"><span>{ts}Flip Selected Duplicates{/ts}</span></a>
178
6a488035 179 {capture assign=backURL}{crmURL p="civicrm/contact/deduperules" q="reset=1" a=1}{/capture}
fd66df85
CW
180 <a href="{$backURL}" class="button crm-button-type-cancel">
181 <span><div class="icon ui-icon-close"></div> {ts}Done{/ts}</span>
182 </a>
6a488035
TO
183{/if}
184<div style="clear: both;"></div>
185{else}
186{include file="CRM/Contact/Form/DedupeFind.tpl"}
187{/if}
188
189{* process the dupe contacts *}
190{include file='CRM/common/dedupe.tpl'}
191{literal}
192<script type="text/javascript">
63ef778e 193CRM.$(function($) {
194 var sourceUrl = {/literal}'{$sourceUrl}'{literal};
195 var context = {/literal}'{$context}'{literal};
196 $('#dupePairs').DataTable({
197 //"scrollX": true, // doesn't work with hover popup for for icons
198 "lengthMenu": [[10, 25, 50, 100, 1000, 2000, -1], [10, 25, 50, 100, 1000, 2000, "All"]],
da3afd4a 199 "searching" : true,
63ef778e 200 "dom": 'flrtip',
201 "processing": true,
202 "serverSide": true,
203 "ajax": sourceUrl,
204 "columns" : [
205 {data: "is_selected_input"},
206 {data: "src_image"},
207 {data: "src"},
208 {data: "dst_image"},
209 {data: "dst"},
210 {data: "src_email"},
211 {data: "dst_email"},
212 {data: "src_street"},
213 {data: "dst_street"},
214 {data: "src_postcode"},
215 {data: "dst_postcode"},
fd630ef9 216 {
217 data: "conflicts",
218 className: "crm-pair-conflict"
219 },
63ef778e 220 {data: "weight"},
221 {data: "actions"},
222 ],
223 "order": [], // removes default order by for column 1 (checkbox)
224 "columnDefs": [
225 {
226 "targets": [0, 1, 3, 13],
227 "orderable": false
228 },
229 {
230 "targets": [7, 8, 9, 10, 11, 12],
231 "visible": false
232 }
233 ],
234 rowCallback: function (row, data) {
235 // Set the checked state of the checkbox in the table
236 $('input.crm-dedupe-select', row).prop('checked', data.is_selected == 1);
237 if (data.is_selected == 1) {
238 $(row).toggleClass('crm-row-selected');
239 }
240 // for action column at the last, set nowrap
241 $('td:last', row).attr('nowrap','nowrap');
fd630ef9 242 // for conflcts column
243 $('td.crm-pair-conflict', row).attr('nowrap','nowrap');
63ef778e 244 }
245 });
246
247 // redraw datatable if searching within selected records
248 $('#crm-dedupe-display-selection').on('click', function(){
249 reloadUrl = sourceUrl;
250 if($(this).prop('checked')){
251 reloadUrl = sourceUrl+'&selected=1';
252 }
253 $('#dupePairs').DataTable().ajax.url(reloadUrl).draw();
254 });
255
256 $('#dupePairs_length_selection').appendTo('#dupePairs_length');
257
258 // apply selected class on click of a row
fd630ef9 259 $('#dupePairs tbody').on('click', 'tr', function(e) {
63ef778e 260 $(this).toggleClass('crm-row-selected');
261 $('input.crm-dedupe-select', this).prop('checked', $(this).hasClass('crm-row-selected'));
262 var ele = $('input.crm-dedupe-select', this);
263 toggleDedupeSelect(ele, 0);
264 });
fd630ef9 265
266 // when select-all checkbox is checked
63ef778e 267 $('#dupePairs thead tr .crm-dedupe-selection').on('click', function() {
268 var checked = $('.crm-dedupe-select-all').prop('checked');
269 if (checked) {
270 $("#dupePairs tbody tr input[type='checkbox']").prop('checked', true);
271 $("#dupePairs tbody tr").addClass('crm-row-selected');
272 }
273 else{
274 $("#dupePairs tbody tr input[type='checkbox']").prop('checked', false);
275 $("#dupePairs tbody tr").removeClass('crm-row-selected');
276 }
277 var ele = $('#dupePairs tbody tr');
278 toggleDedupeSelect(ele, 1);
279 });
280
281 // inline search boxes placed in tfoot
282 $('#dupePairsColFilters thead th').each( function () {
283 var title = $('#dupePairs thead th').eq($(this).index()).text();
284 if (title.length > 1) {
285 $(this).html( '<input type="text" placeholder="Search '+title+'" />' );
286 }
287 });
288
289 // apply dataTable
290 var table = $('#dupePairs').DataTable();
291
292 // apply the search
293 $('#searchOptions input').on( 'keyup change', function () {
294 table
295 .column($(this).attr('search-column'))
296 .search(this.value)
297 .draw();
298 });
299
300 // show / hide columns
301 $('input.toggle-vis').on('click', function (e) {
302 var column = table.column( $(this).attr('data-column-main') );
303 column.visible( ! column.visible() );
304
fd630ef9 305 // nowrap to conflicts column is applied only during initial rendering
306 // for show / hide clicks we need to set it explicitly
307 $('#dupePairs tbody td.crm-pair-conflict').attr('nowrap', 'nowrap');
308
63ef778e 309 if ($(this).attr('data-column-dupe')) {
310 column = table.column( $(this).attr('data-column-dupe') );
311 column.visible( ! column.visible() );
312 }
313 });
314
fd630ef9 315 // keep the conflicts checkbox checked when context is "conflicts"
63ef778e 316 if(context == 'conflicts') {
317 $('#conflicts').attr('checked', true);
318 var column = table.column( $('#conflicts').attr('data-column-main') );
319 column.visible( ! column.visible() );
320 }
fd630ef9 321
322 // on click of flip link of a row
323 $('#dupePairs tbody').on('click', 'tr .crm-dedupe-flip', function(e) {
324 e.stopPropagation();
325 var $el = $(this);
326 var $elTr = $(this).closest('tr');
327 var postUrl = {/literal}"{crmURL p='civicrm/ajax/flipDupePairs' h=0 q='snippet=4'}"{literal};
328 var request = $.post(postUrl, {pnid : $el.data('pnid')});
329 request.done(function(dt) {
330 var mapper = {2:4, 5:6, 7:8, 9:10}
331 var idx = table.row($elTr).index();
332 $.each(mapper, function(key, val) {
333 var v1 = table.cell(idx, key).data();
334 var v2 = table.cell(idx, val).data();
335 table.cell(idx, key).data(v2);
336 table.cell(idx, val).data(v1);
337 });
338 // keep the checkbox checked if needed
339 $('input.crm-dedupe-select', $elTr).prop('checked', $elTr.hasClass('crm-row-selected'));
340 });
341 });
342
343 $(".crm-dedupe-flip-selections").on('click', function(e) {
344 var ids = [];
345 $('.crm-row-selected').each(function() {
346 var ele = CRM.$('input.crm-dedupe-select', this);
347 ids.push(CRM.$(ele).attr('name').substr(5));
348 });
349 if (ids.length > 0) {
350 var dataUrl = {/literal}"{crmURL p='civicrm/ajax/flipDupePairs' h=0 q='snippet=4'}"{literal};
351 CRM.$.post(dataUrl, {pnid: ids}, function (response) {
352 var mapper = {2:4, 5:6, 7:8, 9:10}
353 $('.crm-row-selected').each(function() {
354 var idx = table.row(this).index();
355 $.each(mapper, function(key, val) {
356 var v1 = table.cell(idx, key).data();
357 var v2 = table.cell(idx, val).data();
358 table.cell(idx, key).data(v2);
359 table.cell(idx, val).data(v1);
360 });
361 // keep the checkbox checked if needed
362 $('input.crm-dedupe-select', this).prop('checked', $(this).hasClass('crm-row-selected'));
363 });
364 }, 'json');
365 }
366 });
63ef778e 367});
368
369function toggleDedupeSelect(element, isMultiple) {
370 if (!isMultiple) {
371 var is_selected = CRM.$(element).prop('checked') ? 1: 0;
372 var id = CRM.$(element).prop('name').substr(5);
373 }
374 else {
375 var id = [];
376 CRM.$(element).each(function() {
377 var sth = CRM.$('input.crm-dedupe-select', this);
378 id.push(CRM.$(sth).prop('name').substr(5));
379 });
380 var is_selected = CRM.$('.crm-dedupe-select-all').prop('checked') ? 1 : 0;
381 }
382
383 var dataUrl = {/literal}"{crmURL p='civicrm/ajax/toggleDedupeSelect' h=0 q='snippet=4'}"{literal};
384 var rgid = {/literal}"{$rgid}"{literal};
385 var gid = {/literal}"{$gid}"{literal};
386
387 rgid = rgid.length > 0 ? rgid : 0;
388 gid = gid.length > 0 ? gid : 0;
389
390 CRM.$.post(dataUrl, {pnid: id, rgid: rgid, gid: gid, is_selected: is_selected}, function (data) {
391 // nothing to do for now
392 }, 'json');
393}
6a488035
TO
394</script>
395{/literal}