diff --git a/api/js/etemplate/et2_widget_selectbox.ts b/api/js/etemplate/et2_widget_selectbox.ts index d64f5df037..d3e2b923c3 100644 --- a/api/js/etemplate/et2_widget_selectbox.ts +++ b/api/js/etemplate/et2_widget_selectbox.ts @@ -1469,29 +1469,11 @@ export class et2_selectbox extends et2_inputWidget // normalize options by removing trailing commas options_string = options_string.replace(/,+$/, ''); - var cache_id = widget._type+'_'+options_string; - var cache_owner = ( - // Todo: @new-js-loader et2_selectbox is no longer instanciated globaly --> caching needs to be fixed - et2_selectbox - /*egw.window.et2_selectbox ? - egw.window.et2_selectbox : - egw(window).window.et2_selectbox*/ - ).type_cache; - var cache = cache_owner[cache_id]; + const cache_id = widget._type+'_'+options_string; + const cache_owner = egw.getCache('et2_selectbox'); + let cache = cache_owner[cache_id]; - // Options for a selectbox in a nextmatch must be returned now, as the - // widget we have is not enough to set the options later. - var in_nextmatch = false; - if(typeof cache === 'undefined' || typeof cache.length === 'undefined') - { - var parent = widget._parent; - while(parent && !in_nextmatch) - { - in_nextmatch = parent && parent._type && parent._type === 'nextmatch'; - parent = parent._parent; - } - } - if (typeof cache == 'undefined' || in_nextmatch) + if (typeof cache === 'undefined') { // Fetch with json instead of jsonq because there may be more than // one widget listening for the response by the time it gets back, @@ -1499,7 +1481,7 @@ export class et2_selectbox extends et2_inputWidget const req = egw.json( 'EGroupware\\Api\\Etemplate\\Widget\\Select::ajax_get_options', [widget._type,options_string,attrs.value] - ).sendRequest(); // was !in_nextmatch to send synchronous request + ).sendRequest(); if(typeof cache === 'undefined') { cache_owner[cache_id] = req; @@ -1511,17 +1493,15 @@ export class et2_selectbox extends et2_inputWidget // pending, wait for it cache.then((response) => { cache = cache_owner[cache_id] = response.response[0].data||undefined; - // Set select_options in attributes in case we get a resonse before + // Set select_options in attributes in case we get a response before // the widget is finished loading (otherwise it will re-set to {}) attrs.select_options = cache; - egw.window.setTimeout(() => { - // Avoid errors if widget is destroyed before the timeout - if (widget && typeof widget.id !== 'undefined') - { - widget.set_select_options(et2_selectbox.find_select_options(widget,{}, widget.options)); - } - }, 1); + // Avoid errors if widget is destroyed before the timeout + if (widget && typeof widget.id !== 'undefined') + { + widget.set_select_options(et2_selectbox.find_select_options(widget,{}, widget.options)); + } }); return []; } diff --git a/api/js/jsapi/egw_utils.js b/api/js/jsapi/egw_utils.js index d83b3ec0d3..b00a0cf51d 100644 --- a/api/js/jsapi/egw_utils.js +++ b/api/js/jsapi/egw_utils.js @@ -145,9 +145,27 @@ egw.extend('utils', egw.MODULE_GLOBAL, function() var uid_counter = 0; + /** + * Global cache shared between all EGroupware windows + * @type {{}} + */ + const cache = {}; + // Create the utils object which contains references to all functions // covered by it. var utils = { + /** + * Get a cache object shared between all EGroupware windows + * + * @param {string} _name unique name for the cache-object + * @return {*} + */ + getCache: function(_name) + { + if (typeof cache[_name] === 'undefined') cache[_name] = {}; + + return cache[_name]; + }, ajaxUrl: function(_menuaction) { if(_menuaction.indexOf('menuaction=') >= 0)