[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