| 1 | {* |
| 2 | +--------------------------------------------------------------------+ |
| 3 | | CiviCRM version 4.6 | |
| 4 | +--------------------------------------------------------------------+ |
| 5 | | Copyright CiviCRM LLC (c) 2004-2015 | |
| 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"> |
| 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} </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} </label> |
| 79 | <input type='checkbox' id ='conflicts' class='toggle-vis' data-column-main="11" > |
| 80 | <label for="conflicts">{ts}Conflicts{/ts} </label> |
| 81 | <input type='checkbox' id ='threshold' class='toggle-vis' data-column-main="12" > |
| 82 | <label for="threshold">{ts}Threshold{/ts} </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} </label> |
| 87 | </span> |
| 88 | <table id="dupePairs" class="nestedActivitySelector form-layout-compressed" cellspacing="0" width="100%"> |
| 89 | <thead> |
| 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"> </th> |
| 93 | <th class="crm-contact">{ts}Contact{/ts} 1</th> |
| 94 | <th class="crm-empty"> </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"> </th> |
| 105 | </tr> |
| 106 | </thead> |
| 107 | <tbody> |
| 108 | </tbody> |
| 109 | </table> |
| 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> |
| 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> |
| 121 | </tr> |
| 122 | {/if} |
| 123 | {/foreach} |
| 124 | </table> |
| 125 | {/if} |
| 126 | </div> |
| 127 | |
| 128 | {if $context eq 'search'} |
| 129 | {crmButton href=$backURL icon="close"}{ts}Done{/ts}{/crmButton} |
| 130 | {elseif $context eq 'conflicts'} |
| 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> |
| 138 | |
| 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> |
| 145 | {/if} |
| 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> |
| 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} |
| 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"> |
| 160 | <span><span class="icon ui-icon-refresh"></span> {ts}Refresh Duplicates{/ts}</span> |
| 161 | </a> |
| 162 | |
| 163 | {if $gid} |
| 164 | {capture assign=backURL}{crmURL p="civicrm/contact/dedupemerge" q="reset=1&rgid=`$rgid`&gid=`$gid`&action=map" a=1}{/capture} |
| 165 | {else} |
| 166 | {capture assign=backURL}{crmURL p="civicrm/contact/dedupemerge" q="reset=1&rgid=`$rgid`&action=map" a=1}{/capture} |
| 167 | {/if} |
| 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> |
| 176 | |
| 177 | <a href='#' title="{ts}Flip Selected Duplicates{/ts}" class="crm-dedupe-flip-selections button"><span>{ts}Flip Selected Duplicates{/ts}</span></a> |
| 178 | |
| 179 | {capture assign=backURL}{crmURL p="civicrm/contact/deduperules" q="reset=1" a=1}{/capture} |
| 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> |
| 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"> |
| 193 | CRM.$(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"]], |
| 199 | "searching" : true, |
| 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"}, |
| 216 | { |
| 217 | data: "conflicts", |
| 218 | className: "crm-pair-conflict" |
| 219 | }, |
| 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'); |
| 242 | // for conflcts column |
| 243 | $('td.crm-pair-conflict', row).attr('nowrap','nowrap'); |
| 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 |
| 259 | $('#dupePairs tbody').on('click', 'tr', function(e) { |
| 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 | }); |
| 265 | |
| 266 | // when select-all checkbox is checked |
| 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 | |
| 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 | |
| 309 | if ($(this).attr('data-column-dupe')) { |
| 310 | column = table.column( $(this).attr('data-column-dupe') ); |
| 311 | column.visible( ! column.visible() ); |
| 312 | } |
| 313 | }); |
| 314 | |
| 315 | // keep the conflicts checkbox checked when context is "conflicts" |
| 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 | } |
| 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 | }); |
| 367 | }); |
| 368 | |
| 369 | function 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 | } |
| 394 | </script> |
| 395 | {/literal} |