Fix a horrible regression when renewing multiple items at once in Items Out.
authorphasefx <phasefx@dcc99617-32d9-48b4-a31d-7c20da2025e4>
Thu, 20 Aug 2009 08:01:42 +0000 (08:01 +0000)
committerphasefx <phasefx@dcc99617-32d9-48b4-a31d-7c20da2025e4>
Thu, 20 Aug 2009 08:01:42 +0000 (08:01 +0000)
Referencing loop variables in Javascript with closures is dangerous, so one strategy is to do something like this:

funcs = [];
for (var i = 0; i < my_array.length; i++ ) {

/* Bad */
// funcs.push( function(){ do_something( my_array[i] ); } );
/* Better */
funcs.push( function(safe_value){ return function(){ do_something( safe_value ); } }( my_array[i] ) );
}

In our case, our generated function accidentally referenced a value dependent on the loop variable instead of the corresponding argument of the function generator.

So we had multiple async renewal calls that depending on the timing, could try to renew the same item.  To further add insult to injury, this could potentially put the database in an inconsistent
state wtih duplicate circulations.

git-svn-id: svn://svn.open-ils.org/ILS/trunk@13889 dcc99617-32d9-48b4-a31d-7c20da2025e4

Open-ILS/xul/staff_client/server/patron/items.js

index ec4c2bb..ce474f7 100644 (file)
@@ -275,7 +275,7 @@ patron.items.prototype = {
                                        l.setAttribute('value', $("patronStrings").getFormattedString('staff.patron.items.items_renew.renewing',[bc]));
                                        x.appendChild(l);
                                }
-                               var renew = circ.util.renew_via_barcode( barcode, obj.patron_id, 
+                               var renew = circ.util.renew_via_barcode( bc, obj.patron_id, 
                                        function(r) {
                         try {
                             if ( (typeof r[0].ilsevent != 'undefined' && r[0].ilsevent == 0) ) {
@@ -297,7 +297,7 @@ patron.items.prototype = {
                             }
                             obj.refresh(circ_id);
                         } catch(E) {
-                                              obj.error.standard_unexpected_error_alert($("patronStrings").getFormattedString('staff.patron.items.items_renew.err_in_renew_via_barcode',[barcode]), E);
+                                              obj.error.standard_unexpected_error_alert($("patronStrings").getFormattedString('staff.patron.items.items_renew.err_in_renew_via_barcode',[bc]), E);
                         }
                                        } 
                                );