lp1261835 stop colliding bill UI refreshes
authorJason Etheridge <jason@esilibrary.com>
Wed, 2 Nov 2016 18:28:08 +0000 (14:28 -0400)
committerKathy Lussier <klussier@masslnc.org>
Tue, 14 Mar 2017 14:37:28 +0000 (10:37 -0400)
for want of promises in Angular :)

population of the bill list in this implementation is asynchronous, but the rest
of the refresh action is not, and it's sadly being invoked multiple times. There
are different ways to fix this, but using a semaphore seems to work.

Signed-off-by: Jason Etheridge <jason@esilibrary.com>
Signed-off-by: Dawn Dale <ddale@georgialibraries.org>
Signed-off-by: Kathy Lussier <klussier@masslnc.org>
Open-ILS/xul/staff_client/server/patron/bill2.js

index 8e7764b..91c0ad0 100644 (file)
@@ -20,6 +20,8 @@ function my_init() {
 
         g.funcs = []; g.bill_map = {}; g.row_map = {}; g.check_map = {};
 
+        g.safe_for_refresh = false;
+
         g.patron_id = xul_param('patron_id');
 
         $('circulating_hint').hidden = true;
@@ -63,6 +65,8 @@ function my_init() {
             );
         }
 
+        g.funcs.push( function() { g.safe_for_refresh = true; } );
+
     } catch(E) {
         var err_msg = $("commonStrings").getFormattedString('common.exception', ['patron/bill2.xul', E]);
         try { g.error.sdump('D_ERROR',err_msg); } catch(E) { dump(err_msg); }
@@ -522,11 +526,12 @@ function retrieve_mbts_for_list() {
     } else {
    
         g.mbts_ids.reverse();
+        g.safe_for_refresh = false;
         for (var i = 0; i < g.mbts_ids.length; i++) {
             dump('i = ' + i + ' g.mbts_ids[i] = ' + g.mbts_ids[i] + '\n');
             g.funcs.push( gen_list_append_func(g.mbts_ids[i]) );
         }
+        g.funcs.push( function() { g.safe_for_refresh = true; } );
     }
 }
 
@@ -1107,14 +1112,16 @@ function pay(payment_blob) {
 
 function refresh(params) {
     try {
-        if (params && params.clear_voided_summary) {
-            g.data.voided_billings = []; g.data.stash('voided_billings');
+        if (g.safe_for_refresh) {
+            if (params && params.clear_voided_summary) {
+                g.data.voided_billings = []; g.data.stash('voided_billings');
+            }
+            refresh_patron();
+            g.bill_list.clear();
+            retrieve_mbts_for_list();
+            tally_voided();
+            distribute_payment();
         }
-        refresh_patron();
-        g.bill_list.clear();
-        retrieve_mbts_for_list();
-        tally_voided();
-        distribute_payment(); 
     } catch(E) {
         alert('Error in bill2.js, refresh(): ' + E);
     }