fix year in headers
[civicrm-core.git] / templates / CRM / Contact / Form / Merge.tpl
CommitLineData
6a488035
TO
1{*
2 +--------------------------------------------------------------------+
2c4c49ca 3 | CiviCRM version 4.7 |
6a488035 4 +--------------------------------------------------------------------+
2a73d3b0 5 | Copyright CiviCRM LLC (c) 2004-2017 |
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<div class="crm-block crm-form-block crm-contact-merge-form-block">
3bb59daf
AH
27 <div class="help">
28 {ts}Click <strong>Merge</strong> to move data from the Duplicate Contact on the left into the Main Contact. In addition to the contact data (address, phone, email...), you may choose to move all or some of the related activity records (groups, contributions, memberships, etc.).{/ts} {help id="intro"}
29 </div>
ffd39a49 30
ffd39a49
J
31 <div class="message status">
32 <div class="icon inform-icon"></div>
3bb59daf 33 <strong>{ts}WARNING: The duplicate contact record WILL BE DELETED after the merge is complete.{/ts}</strong>
ffd39a49 34 </div>
ffd39a49 35
3bb59daf
AH
36 {if $user}
37 <div class="message status">
38 <div class="icon inform-icon"></div>
39 <strong>{ts 1=$config->userFramework}WARNING: There are %1 user accounts associated with both the original and duplicate contacts. Ensure that the %1 user you want to retain is on the right - if necessary use the 'Flip between original and duplicate contacts.' option at top to swap the positions of the two records before doing the merge.
40 The user record associated with the duplicate contact will not be deleted, but will be unlinked from the associated contact record (which will be deleted).
41 You will need to manually delete that user (click on the link to open the %1 user account in new screen). You may need to give thought to how you handle any content or contents associated with that user.{/ts}</strong>
42 </div>
43 {/if}
44
45 <div class="crm-submit-buttons">
46 {include file="CRM/common/formButtons.tpl" location="top"}
47 </div>
6a488035 48
3bb59daf
AH
49 <div class="action-link">
50 {if $prev}<a href="{$prev}" class="crm-hover-button action-item"><i class="crm-i fa-chevron-left"></i> {ts}Previous{/ts}</a>{/if}
51 {if $next}<a href="{$next}" class="crm-hover-button action-item">{ts}Next{/ts} <i class="crm-i fa-chevron-right"></i></a>{/if}
52 <a href="{$flip}" class="action-item crm-hover-button">
53 <i class="crm-i fa-random"></i>
54 {ts}Flip between original and duplicate contacts.{/ts}
55 </a>
56 </div>
6a488035 57
3bb59daf 58 <div class="action-link">
4e052b22 59 <a href="#" class="action-item crm-hover-button crm-notDuplicate" title={ts}Mark this pair as not a duplicate.{/ts} onClick="processDupes( {$main_cid}, {$other_cid}, 'dupe-nondupe', 'merge-contact', '{$browseUrl}' );return false;">
3bb59daf
AH
60 <i class="crm-i fa-times-circle"></i>
61 {ts}Mark this pair as not a duplicate.{/ts}
62 </a>
63 </div>
6a488035 64
3bb59daf
AH
65 <div class="action-link">
66 <a href="javascript:void(0);" class="action-item crm-hover-button toggle_equal_rows">
67 <i class="crm-i fa-eye-slash"></i>
68 {ts}Show/hide rows with the same data on each contact record.{/ts}
69 </a>
70 </div>
08ef1f91 71
3bb59daf
AH
72 <table class="row-highlight">
73 <tr class="columnheader">
74 <th>&nbsp;</th>
75 <th><a href="{crmURL p='civicrm/contact/view' q="reset=1&cid=$other_cid"}">{$other_name}</a> ({ts}duplicate{/ts})</th>
76 <th>{ts}Mark All{/ts}<br />=={$form.toggleSelect.html} ==&gt;</th>
77 <th><a href="{crmURL p='civicrm/contact/view' q="reset=1&cid=$main_cid"}">{$main_name}</a></th>
78 <th width="300">Add/overwrite?</th>
79 </tr>
eb61dc07 80
3bb59daf 81 {crmAPI var='other_result' entity='Contact' action='get' return="modified_date" id=$other_cid}
3b8dfec6 82
3bb59daf 83 {crmAPI var='main_result' entity='Contact' action='get' return="modified_date" id=$main_cid}
eb61dc07 84
3bb59daf
AH
85 <tr>
86 <td>Last modified</td>
87 <td>{$other_result.values.0.modified_date|crmDate} {if $other_result.values.0.modified_date gt $main_result.values.0.modified_date} (Most recent) {/if}</td>
88 <td></td>
89 <td>{$main_result.values.0.modified_date|crmDate} {if $main_result.values.0.modified_date gt $other_result.values.0.modified_date} (Most recent) {/if}</td>
90 <td></td>
91 </tr>
eb61dc07 92
3bb59daf 93 {foreach from=$rows item=row key=field}
6a488035 94
3bb59daf
AH
95 {if !isset($row.main) && !isset($row.other)}
96 <tr style="background-color: #fff !important; border-bottom:1px solid #ccc !important;" class="no-data">
eb61dc07 97 <td>
3bb59daf 98 <strong>{$row.title}</strong>
eb61dc07 99 </td>
3bb59daf
AH
100 {else}
101 {if $row.main eq $row.other}
102 <tr class="merge-row-equal crm-row-ok {cycle values="odd-row,even-row"}">
103 {else}
104 <tr class="crm-row-error {cycle values="odd-row,even-row"}">
105 {/if}
eb61dc07 106 <td>
3bb59daf 107 {$row.title}
eb61dc07 108 </td>
3bb59daf 109 {/if}
53e45f60 110
3bb59daf
AH
111 {assign var=position value=$field|strrpos:'_'}
112 {assign var=blockId value=$field|substr:$position+1}
113 {assign var=blockName value=$field|substr:14:$position-14}
eb61dc07
J
114
115 <td>
041d6d6b
J
116 {* @TODO check if this is ever an array or a fileName? *}
117 {* This is on one long line for address formatting *}
118 {if $row.title|substr:0:7 == "Address"}<span style="white-space: pre">{else}<span>{/if}{if !is_array($row.other)}{$row.other}{elseif $row.other.fileName}{$row.other.fileName}{else}{', '|implode:$row.other}{/if}</span>
eb61dc07
J
119 </td>
120
3bb59daf
AH
121 <td style='white-space: nowrap'>
122 {if $form.$field}=={$form.$field.html|crmAddClass:"select-row"}==&gt;{/if}
123 </td>
124
125 {* For location blocks *}
126 {if $row.title|substr:0:5 == "Email" OR
127 $row.title|substr:0:7 == "Address" OR
128 $row.title|substr:0:2 == "IM" OR
129 $row.title|substr:0:7 == "Website" OR
130 $row.title|substr:0:5 == "Phone"}
131
132 <td>
041d6d6b
J
133 {* @TODO check if this is ever an array or a fileName? *}
134 {* This is on one long line for address formatting *}
135 {if $row.title|substr:0:7 == "Address"}<span style="white-space: pre" id="main_{$blockName}_{$blockId}">{else}<span id="main_{$blockName}_{$blockId}">{/if}{if !is_array($row.main)}{$row.main}{elseif $row.main.fileName}{$row.main.fileName}{else}{', '|implode:$row.main}{/if}</span>
3bb59daf
AH
136 </td>
137
138 <td>
139 {* Display location for fields with locations *}
140 {if $blockName eq 'email' || $blockName eq 'phone' || $blockName eq 'address' || $blockName eq 'im' }
972947a7 141 {$form.location_blocks.$blockName.$blockId.locTypeId.html}&nbsp;
3bb59daf
AH
142 {/if}
143
144 {* Display other_type_id for websites, ims and phones *}
145 {if $blockName eq 'website' || $blockName eq 'im' || $blockName eq 'phone' }
972947a7 146 {$form.location_blocks.$blockName.$blockId.typeTypeId.html}&nbsp;
3bb59daf
AH
147 {/if}
148
149 {* Display the overwrite/add/add new label *}
abd0b852
J
150 <span id="main_{$blockName}_{$blockId}_overwrite" class="location_block_controls">
151
152 <span class="location_primary">
153 {if $row.main && $row.main_is_primary == "1"}Primary{/if}
154 </span>
155
156 <span class="location_block_controls_options">
157 <span class="location_operation_description">
158 {if $row.main}({ts}overwrite{/ts}){else}({ts}add{/ts}){/if}
159 </span>
160 <span style="display: block" class="location_operation_checkbox">
161 {if $row.main && ($blockName eq 'email' || $blockName eq 'phone')}
162 {$form.location_blocks.$blockName.$blockId.operation.html}
041d6d6b 163 {/if}
041d6d6b 164 </span>
abd0b852
J
165 <span style="display: block" class="location_set_other_primary">
166 {if $blockName neq 'website' && (($row.main && $row.main_is_primary != "1") || !$row.main)}
167 {$form.location_blocks.$blockName.$blockId.set_other_primary.html}
168 {/if}
169 </span>
170 </span>
3bb59daf 171 </span>
041d6d6b 172
3bb59daf
AH
173 </td>
174
175 {* For non-location blocks *}
176 {else}
177
178 <td>
3b8dfec6 179 <span>
3bb59daf
AH
180 {if !is_array($row.main)}
181 {$row.main}
182 {elseif $row.main.fileName}
183 {$row.main.fileName}
184 {else}
185 {', '|implode:$row.main}
eb61dc07 186 {/if}
08ef1f91 187 </span>
3bb59daf
AH
188 </td>
189
190 <td>
191 {if isset($row.main) || isset($row.other)}
192 <span>
193 {if $row.main == $row.other}
194 <span class="action_label">({ts}match{/ts})</span><br />
195 {elseif $row.main}
196 <span class="action_label">({ts}overwrite{/ts})</span><br />
197 {else}
198 <span class="action_label">({ts}add{/ts})</span>
199 {/if}
200 </span>
201 {/if}
202 </td>
eb61dc07 203
3bb59daf 204 {/if}
08ef1f91 205
3bb59daf
AH
206 </tr>
207 {/foreach}
6a488035 208
3bb59daf
AH
209 {foreach from=$rel_tables item=params key=paramName}
210 {if $paramName eq 'move_rel_table_users'}
211 <tr class="{cycle values="even-row,odd-row"}">
212 <td><strong>{ts}Move related...{/ts}</strong></td><td>{if $otherUfId}<a target="_blank" href="{$params.other_url}">{$otherUfName}</a></td><td style='white-space: nowrap'>=={$form.$paramName.html|crmAddClass:"select-row"}==&gt;{else}<td style='white-space: nowrap'></td>{/if}</td><td>{if $mainUfId}<a target="_blank" href="{$params.main_url}">{$mainUfName}</a>{/if}</td>
213 <td>({ts}migrate{/ts})</td>
214 </tr>
215 {else}
6a488035 216 <tr class="{cycle values="even-row,odd-row"}">
3bb59daf
AH
217 <td><strong>{ts}Move related...{/ts}</strong></td><td><a href="{$params.other_url}">{$params.title}</a></td><td style='white-space: nowrap'>=={$form.$paramName.html|crmAddClass:"select-row"}==&gt;</td><td><a href="{$params.main_url}">{$params.title}</a>{if $form.operation.$paramName.add.html}&nbsp;{$form.operation.$paramName.add.html}{/if}</td>
218 <td>({ts}migrate{/ts})</td>
219 </tr>
220 {/if}
221 {/foreach}
222 </table>
223 <div class='form-item'>
224 <!--<p>{$form.moveBelongings.html} {$form.moveBelongings.label}</p>-->
225 <!--<p>{$form.deleteOther.html} {$form.deleteOther.label}</p>-->
226 </div>
6a488035 227
3bb59daf
AH
228 <div class="crm-submit-buttons">
229 {include file="CRM/common/formButtons.tpl" location="bottom"}
230 </div>
6a488035
TO
231</div>
232
233{literal}
234<script type="text/javascript">
235
bf43eaac
J
236 var locationBlockInfo = {/literal}{$locationBlockInfo}{literal};
237 var allBlock = {/literal}{$mainLocBlock}{literal};
238
149ae679 239 /**
abd0b852
J
240 * Triggered when a 'location' or 'type' destination is changed, and when
241 * the operation or 'set primary' checkboxes are changed.
242 *
149ae679
J
243 * Check to see if the 'main' contact record has a corresponding location
244 * block when the destination of a field is changed. Allow existing location
245 * fields to be overwritten with data from the 'other' contact.
246 *
abd0b852 247 * @param blockName string
149ae679 248 * The name of the entity.
149ae679 249 * @param blockId int
ca792455
J
250 * The block ID being affected.
251 * @param event object
252 * The event that triggered the update.
149ae679 253 */
ca792455 254 function updateMainLocationBlock(blockName, blockId, event) {
06f557c5
J
255
256 // Get type of select list that's been changed (location or type)
abd0b852
J
257 var locTypeId = CRM.$('select#location_blocks_' + blockName + '_' + blockId + '_locTypeId').val();
258 var typeTypeId = CRM.$('select#location_blocks_' + blockName + '_' + blockId + '_typeTypeId').val();
06f557c5 259
34917198 260 // @todo Fix this 'special handling' for websites (no location id)
abd0b852
J
261 if (!locTypeId) {
262 locTypeId = 0;
263 }
34917198 264
bf43eaac 265 // Look for a matching block on the main contact
34917198
J
266 var mainBlockId = 0;
267 var mainBlockDisplay = '';
abd0b852
J
268 var mainBlock = findBlock(blockName, locTypeId, typeTypeId);
269 if (mainBlock != false) {
bf43eaac
J
270 mainBlockDisplay = mainBlock['display'];
271 mainBlockId = mainBlock['id'];
abd0b852
J
272 }
273
274 // Update main location display and id
275 CRM.$("input[name='location_blocks[" + blockName + "][" + blockId + "][mainContactBlockId]']").val(mainBlockId);
276 CRM.$("#main_" + blockName + "_" + blockId).html(mainBlockDisplay);
34917198 277
abd0b852 278 // Update controls area
041d6d6b 279
abd0b852
J
280 // Get the parent block once for speed
281 var this_controls = CRM.$("#main_" + blockName + "_" + blockId + "_overwrite");
282
283 // Update primary label
284 if (mainBlock != false && mainBlock['is_primary'] == '1') {
285 this_controls.find(".location_primary").text('Primary');
286 }
287 else {
288 this_controls.find(".location_primary").text('');
289 }
290
291 // Update operation description
292 var operation_description = "{/literal}{ts}add{/ts}{literal}";
293 var add_new_check_length = this_controls.find(".location_operation_checkbox input:checked").length;
294 if (mainBlock != false) {
295 if (add_new_check_length > 0) {
296 operation_description = "{/literal}{ts}add new{/ts}{literal}";
041d6d6b 297 }
abd0b852
J
298 else {
299 operation_description = "{/literal}{ts}overwrite{/ts}{literal}";
300 }
301 }
302 this_controls.find(".location_operation_description").text("(" + operation_description + ")");
303
304 // Skip if the 'add new' or 'set primary' checkboxes were clicked
305 if (event.target.id.match(/(operation|set_other_primary)/) === null) {
306 // Display 'Add new' checkbox if there is a main block, and this is an
307 // email or phone type.
308 if (mainBlock != false && (blockName == 'email' || blockName == 'phone')) {
309 var op_id = 'location_blocks[' + blockName + '][' + blockId + '][operation]';
310 this_controls.find(".location_operation_checkbox").html(
311 '<input id="' + op_id + '" name="' + op_id + '" type="checkbox" value="1" class="crm-form-checkbox"><label for="' + op_id + '">{/literal}{ts}Add new{/ts}{literal}</label>'
312 );
313 }
314 else {
315 this_controls.find(".location_operation_checkbox").html('');
316 }
317 }
041d6d6b 318
abd0b852
J
319 // Skip if 'set primary' was clicked
320 if (event.target.id.match(/(set_other_primary)/) === null) {
321 // Display 'Set primary' checkbox if applicable
322 if (blockName != 'website' && (mainBlock == false || mainBlock['is_primary'] != "1" || add_new_check_length > 0)) {
323 var prim_id = 'location_blocks[' + blockName + '][' + blockId + '][set_other_primary]';
324 this_controls.find(".location_set_other_primary").html(
325 '<input id="' + prim_id + '" name="' + prim_id + '" type="checkbox" value="1" class="crm-form-checkbox"><label for="' + prim_id + '">{/literal}{ts}Set as primary{/ts}{literal}</label>'
326 );
327 }
328 else {
329 this_controls.find(".location_set_other_primary").html('');
06f557c5 330 }
06f557c5 331 }
204ad1b2 332
06f557c5
J
333 }
334
149ae679
J
335 /**
336 * Look for a matching 'main' contact location block by entity, location and
337 * type
338 *
149ae679
J
339 * @param entName string
340 * The entity name to lookup.
341 * @param locationID int
342 * The location ID to lookup.
343 * @param typeID int
344 * The type ID to lookup.
345 *
346 * @returns boolean|object
347 * Returns false if no match, otherwise an object with the location ID and
348 * display value.
349 */
edf8e092 350 function findBlock(entName, locationID, typeID) {
bf43eaac
J
351 var entityArray = allBlock[entName];
352 var result = false;
353 for (var i = 0; i < entityArray.length; i++) {
354 // Match based on location and type ID, depending on the entity info
355 if (locationBlockInfo[entName]['hasLocation'] == false || locationID == entityArray[i]['location_type_id']) {
356 if (locationBlockInfo[entName]['hasType'] == false || typeID == entityArray[i][locationBlockInfo[entName]['hasType']]) {
357 result = {
358 display: entityArray[i][locationBlockInfo[entName]['displayField']],
041d6d6b
J
359 id: entityArray[i]['id'],
360 is_primary: entityArray[i]['is_primary']
bf43eaac
J
361 };
362 break;
363 }
364 }
365 }
366 return result;
367 }
368
e0aa05fb
J
369 /**
370 * Called when a 'set primary' checkbox is clicked in order to disable any
371 * other 'set primary' checkboxes for blocks of the same entity. So don't let
372 * users try to set two different phone numbers as primary on the form.
ca792455
J
373 *
374 * @param event object
375 * The event that triggered the update
e0aa05fb 376 */
ca792455 377 function updateSetPrimaries(event) {
e0aa05fb
J
378 var nameSplit = event.target.name.split('[');
379 var blockName = nameSplit[1].slice(0, -1);
380 var controls = CRM.$('span.location_block_controls[id^="main_' + blockName + '"]');
381
382 // Enable everything
383 controls.find('input[id$="[set_other_primary]"]:not(:checked)').removeAttr("disabled");
384
385 // If one is checked, disable the others
386 if (controls.find('input[id$="[set_other_primary]"]:checked').length > 0) {
387 controls.find('input[id$="[set_other_primary]"]:not(:checked)').attr("disabled", "disabled");
388 }
389 }
390
ae8f569f 391 CRM.$(function($) {
53e45f60 392
ae8f569f 393 $('table td input.form-checkbox').each(function() {
204ad1b2
J
394 var ele = null;
395 var element = $(this).attr('id').split('_',3);
396
397 switch ( element['1'] ) {
398 case 'addressee':
399 ele = '#' + element['0'] + '_' + element['1'];
400 break;
401
402 case 'email':
403 case 'postal':
404 ele = '#' + element['0'] + '_' + element['1'] + '_' + element['2'];
405 break;
406 }
eb61dc07 407
204ad1b2 408 if( ele ) {
eb61dc07
J
409 $(this).on('click', function() {
410 var val = $(this).prop('checked');
411 $('input' + ele + ', input' + ele + '_custom').prop('checked', val);
412 });
204ad1b2 413 }
6a488035 414 });
53e45f60 415
eb61dc07
J
416 // Show/hide matching data rows
417 $('.toggle_equal_rows').click(function() {
13919cf8 418 $('tr.merge-row-equal').toggle();
6a488035 419 });
53e45f60 420
edf8e092 421 // Call mergeBlock whenever a location type is changed
ca792455 422 $('body').on('change', 'select[id$="locTypeId"],select[id$="typeTypeId"],input[id$="[operation]"],input[id$="[set_other_primary]"]', function(event){
e0aa05fb 423
edf8e092 424 // All the information we need is held in the id, separated by underscores
abd0b852 425 var nameSplit = this.name.split('[');
e0aa05fb 426
edf8e092 427 // Lookup the main value, if any are available
abd0b852 428 if (allBlock[nameSplit[1].slice(0, -1)] != undefined) {
ca792455 429 updateMainLocationBlock(nameSplit[1].slice(0, -1), nameSplit[2].slice(0, -1), event);
edf8e092 430 }
e0aa05fb
J
431
432 // Update all 'set primary' checkboxes
ca792455 433 updateSetPrimaries(event);
e0aa05fb 434
edf8e092
J
435 });
436
ae8f569f 437 });
6a488035
TO
438
439</script>
440{/literal}
441
442{* process the dupe contacts *}
443{include file="CRM/common/dedupe.tpl"}