From 3adff7b0317f3bc0fc398ff80c9ee5ae8a99214d Mon Sep 17 00:00:00 2001 From: Galen Charlton Date: Thu, 19 Apr 2018 11:44:42 -0400 Subject: [PATCH] LP#1765444: improve how MARC editor fetches fixed field metadata This patch fixes a problem where the web staff MARC editor would make repeated and redundant calls to two Evergreen methods to fetch data about fixed field positions and values if that metadata was not already cached by local storage or Hatch. In particular, this patch caches and returns the data retrieval promises, ensuring that only one set of FF position and value requests are made. Prior to this patch, each eg-marc-edit-fixed-field directive, of which there are 64, could end up invoking those methods when initializing the editor for a record type that had not been previously seen. To test ------- [1] Clear all FFPosTable_* and FFValueTable_* keys from local storage (or Hatch). [2] Retrieve a bib record in the web staff client. Note that up to 64 calls each are made of open-ils.cat.biblio.fixed_field_values.by_rec_type and open-ils.fielder.cmfpm.atomic. [3] Apply the patch and repeat steps #1 and #2. [4] This time, note that only one call each are made. [5] Verify that the fixed field inputs continue to work as expected. Signed-off-by: Galen Charlton Signed-off-by: Mike Rylander Signed-off-by: Cesar Velez Signed-off-by: Mike Rylander --- .../ui/default/staff/cat/services/tagtable.js | 76 ++++++++++--------- 1 file changed, 41 insertions(+), 35 deletions(-) diff --git a/Open-ILS/web/js/ui/default/staff/cat/services/tagtable.js b/Open-ILS/web/js/ui/default/staff/cat/services/tagtable.js index dcc92beb92..85b2e320aa 100644 --- a/Open-ILS/web/js/ui/default/staff/cat/services/tagtable.js +++ b/Open-ILS/web/js/ui/default/staff/cat/services/tagtable.js @@ -62,58 +62,64 @@ function($q, egCore, egAuth) { }); }; + var _ffpos_promises = {}; service.fetchFFPosTable = function(rtype) { - var deferred = $q.defer(); + if (!(rtype in _ffpos_promises)) { + _ffpos_promises[rtype] = $q.defer(); - var hatch_pos_key = 'FFPosTable_'+rtype; + var hatch_pos_key = 'FFPosTable_'+rtype; - egCore.hatch.getItem(hatch_pos_key).then(function(cached_table) { - if (cached_table) { - service.ff_pos_map[rtype] = cached_table; - deferred.resolve(cached_table); + egCore.hatch.getItem(hatch_pos_key).then(function(cached_table) { + if (cached_table) { + service.ff_pos_map[rtype] = cached_table; + _ffpos_promises[rtype].resolve(cached_table); - } else { + } else { - egCore.net.request( // First, get the list of FFs (minus 006) - 'open-ils.fielder', - 'open-ils.fielder.cmfpm.atomic', - { query : { tag : { '!=' : '006' } } } - ).then(function (data) { - service.ff_pos_map[rtype] = data; - egCore.hatch.setItem(hatch_pos_key, data); - deferred.resolve(data); - }); - } - }); + egCore.net.request( // First, get the list of FFs (minus 006) + 'open-ils.fielder', + 'open-ils.fielder.cmfpm.atomic', + { query : { tag : { '!=' : '006' } } } + ).then(function (data) { + service.ff_pos_map[rtype] = data; + egCore.hatch.setItem(hatch_pos_key, data); + _ffpos_promises[rtype].resolve(data); + }); + } + }); + } - return deferred.promise; + return _ffpos_promises[rtype].promise; }; + var _ffval_promises = {}; service.fetchFFValueTable = function(rtype) { - var deferred = $q.defer(); + if (!(rtype in _ffval_promises)) { + _ffval_promises[rtype] = $q.defer(); - var hatch_value_key = 'FFValueTable_'+rtype; + var hatch_value_key = 'FFValueTable_'+rtype; - egCore.hatch.getItem(hatch_value_key).then(function(cached_table) { - if (cached_table) { - service.ff_value_map[rtype] = cached_table; - deferred.resolve(cached_table); + egCore.hatch.getItem(hatch_value_key).then(function(cached_table) { + if (cached_table) { + service.ff_value_map[rtype] = cached_table; + _ffval_promises[rtype].resolve(cached_table); - } else { + } else { - egCore.net.request( + egCore.net.request( 'open-ils.cat', 'open-ils.cat.biblio.fixed_field_values.by_rec_type', rtype - ).then(function (data) { - service.ff_value_map[rtype] = data; - egCore.hatch.setItem(hatch_value_key, data); - deferred.resolve(data); - }); - } - }); + ).then(function (data) { + service.ff_value_map[rtype] = data; + egCore.hatch.setItem(hatch_value_key, data); + _ffval_promises[rtype].resolve(data); + }); + } + }); + } - return deferred.promise; + return _ffval_promises[rtype].promise; }; service.loadRemoteTagTable = function(fields, tt_key) { -- 2.43.2