[Rt-commit] rt branch, 4.4/all-recipients-call-ajax-once, created. rt-4.4.4-291-g9b34a0f8e1

? sunnavy sunnavy at bestpractical.com
Tue Mar 23 13:46:13 EDT 2021


The branch, 4.4/all-recipients-call-ajax-once has been created
        at  9b34a0f8e1f476606d43dce8775ca40fd40fe268 (commit)

- Log -----------------------------------------------------------------
commit 06224a80eb8894bb4ad9885b8b5a4ee4cd2711ad
Author: sunnavy <sunnavy at bestpractical.com>
Date:   Tue Sep 18 00:28:56 2018 +0800

    Trigger UpdateCc/UpdateBcc input change only once when clicking "All recipients"
    
    Clicking "All recipients" checks/unchecks all the suggested Cc/Bcc
    address checkboxes, and each address checkbox change would trigger the
    UpdateCc/UpdateBcc input change accordingly.
    
    It's not just unnecessary to trigger UpdateCc/UpdateBcc input change
    multiple times for a single click, but also harmful: each change will
    fire an ajax call to update page sections "Recipients" and "Scrips and
    Recipients", so if there are multiple ajax calls happening at nearly the
    same time, as ajax responses could easily come back in different order,
    this could make data in sections "Recipients" and "Scrips and
    Recipients" out of date.

diff --git a/share/html/Ticket/Elements/UpdateCc b/share/html/Ticket/Elements/UpdateCc
index 5b11913c17..3f8b76059e 100644
--- a/share/html/Ticket/Elements/UpdateCc
+++ b/share/html/Ticket/Elements/UpdateCc
@@ -59,7 +59,7 @@
         <div class="OneTimeCcs hidden">
 %   }
 <i class="label">(<&|/l&>check to add</&>)</i>
-<input type="checkbox" class="checkbox" id="AllSuggestedCc" name="AllSuggestedCc" value="1" onclick="setCheckbox(this, /^UpdateCc-/, null, true)">
+<input type="checkbox" class="checkbox" id="AllSuggestedCc" name="AllSuggestedCc" value="1" onclick="setCheckbox(this, /^UpdateCc-/); checkboxesToInput('UpdateCc', 'input[name^=UpdateCc-]:checkbox');">
 <label for="AllSuggestedCc"><% loc('All recipients') %></label>
 %}
 %foreach my $addr ( @one_time_Ccs ) {
@@ -71,6 +71,7 @@
     type="checkbox"
 % my $clean_addr = $txn_addresses{$addr}->format;
     onClick="checkboxToInput('UpdateCc', <% "UpdateCc-$addr" |n,j%>, <%$clean_addr|n,j%> );"
+    data-address="<% $clean_addr %>"
     <% $ARGS{'UpdateCc-'.$addr} ? 'checked="checked"' : ''%> >
       <label for="UpdateCc-<%$addr%>"><& /Elements/ShowUser, Address => $txn_addresses{$addr}&></label>
 </span>
@@ -88,7 +89,7 @@
         <div class="OneTimeCcs hidden">
 %   }
 <i class="label">(<&|/l&>check to add</&>)</i>
-<input type="checkbox" class="checkbox" id="AllSuggestedBcc" name="AllSuggestedBcc" value="1" onclick="setCheckbox(this, /^UpdateBcc-/, null, true)">
+<input type="checkbox" class="checkbox" id="AllSuggestedBcc" name="AllSuggestedBcc" value="1" onclick="setCheckbox(this, /^UpdateBcc-/); checkboxesToInput('UpdateBcc', 'input[name^=UpdateBcc-]:checkbox');">
 <label for="AllSuggestedBcc"><% loc('All recipients') %></label>
 %}
 %foreach my $addr ( @one_time_Ccs ) {
@@ -100,6 +101,7 @@
     type="checkbox"
 % my $clean_addr = $txn_addresses{$addr}->format;
     onClick="checkboxToInput('UpdateBcc', <% "UpdateBcc-$addr" |n,j%>, <%$clean_addr|n,j%> );"
+    data-address="<% $clean_addr %>"
     <% $ARGS{'UpdateBcc-'.$addr} ? 'checked="checked"' : ''%> >
       <label for="UpdateBcc-<%$addr%>"><& /Elements/ShowUser, Address => $txn_addresses{$addr}&></label>
 </span>
diff --git a/share/static/js/util.js b/share/static/js/util.js
index d791e1284d..ada5162b1f 100644
--- a/share/static/js/util.js
+++ b/share/static/js/util.js
@@ -216,6 +216,31 @@ function checkboxToInput(target,checkbox,val){
     tar.change();
 }
 
+function checkboxesToInput(target,checkboxes) {
+    var tar = jQuery('#' + escapeCssSelector(target));
+
+    var emails = jQuery.grep(tar.val().split(/,\s*/), function(email) {
+        return email.match(/\S/) ? true : false;
+    });
+
+    jQuery(checkboxes).each(function(index, checkbox) {
+        var val = jQuery(checkbox).attr('data-address');
+        if(jQuery(checkbox).prop('checked')){
+            if ( emails.indexOf(val) == -1 ) {
+                emails.unshift(val);
+            }
+        }
+        else{
+            emails = jQuery.grep(emails, function(email) {
+                return email != val;
+            });
+        }
+    });
+
+    jQuery('#UpdateIgnoreAddressCheckboxes').val(true);
+    tar.val(emails.join(', ')).change();
+}
+
 // ahah for back compatibility as plugins may still use it
 function ahah( url, id ) {
     jQuery('#'+id).load(url);

commit 9b34a0f8e1f476606d43dce8775ca40fd40fe268
Author: sunnavy <sunnavy at bestpractical.com>
Date:   Tue Mar 23 08:02:41 2021 +0800

    Sync one-time checkboxes to text inputs in a consistent way
    
    The approach checkboxesToInput uses takes care of duplicates and empty
    values, it's good to use it for single checkboxToInput too.

diff --git a/share/static/js/util.js b/share/static/js/util.js
index ada5162b1f..a037a03c71 100644
--- a/share/static/js/util.js
+++ b/share/static/js/util.js
@@ -200,20 +200,23 @@ function checkAllObjects()
 function checkboxToInput(target,checkbox,val){    
     var tar = jQuery('#' + escapeCssSelector(target));
     var box = jQuery('#' + escapeCssSelector(checkbox));
+
+    var emails = jQuery.grep(tar.val().split(/,\s*/), function(email) {
+        return email.match(/\S/) ? true : false;
+    });
+
     if(box.prop('checked')){
-        if (tar.val()==''){
-            tar.val(val);
-        }
-        else{
-            tar.val( val+', '+ tar.val() );        
+        if ( emails.indexOf(val) == -1 ) {
+            emails.unshift(val);
         }
     }
     else{
-        tar.val(tar.val().replace(val+', ',''));
-        tar.val(tar.val().replace(val,''));
+        emails = jQuery.grep(emails, function(email) {
+            return email != val;
+        });
     }
     jQuery('#UpdateIgnoreAddressCheckboxes').val(true);
-    tar.change();
+    tar.val(emails.join(', ')).change();
 }
 
 function checkboxesToInput(target,checkboxes) {

-----------------------------------------------------------------------


More information about the rt-commit mailing list