Hi,

Please find attached patch to fix RM #2487: get_preference() uses a
synchronous AJAX request.

Introduced the client side caching for preferences to get rid of
synchronous AJAX request.


Thanks,
Khushboo
diff --git a/web/pgadmin/browser/templates/browser/js/browser.js b/web/pgadmin/browser/templates/browser/js/browser.js
index e8ea93d..a89c6dd 100644
--- a/web/pgadmin/browser/templates/browser/js/browser.js
+++ b/web/pgadmin/browser/templates/browser/js/browser.js
@@ -325,6 +325,9 @@ define(
       }
       obj.initialized = true;
 
+      // Cache preferences
+      obj.cache_preferences();
+
       // Initialize the Docker
       obj.docker = new wcDocker(
         '#dockerContainer', {
@@ -597,7 +600,7 @@ define(
 
     // This will hold preference data (Works as a cache object)
     // Here node will be a key and it's preference data will be value
-    node_preference_data: {},
+    preferences_cache: {},
 
     // Add menus of module/extension at appropriate menu
     add_menus: function(menus) {
@@ -749,24 +752,42 @@ define(
       }
     },
 
-    get_preference: function (module, preference_name) {
-      var preference = null;
+    // Get preference value from cache
+    get_preference: function(module, preference) {
+      var self = this;
+      // If cache is not yet loaded then keep checking
+      if(_.size(self.preferences_cache) == 0) {
+        var preference_data = setInterval(check_preference, 1000);
+
+        function check_preference() {
+          if(_.size(self.preferences_cache) > 0) {
+            clearInterval(preference_data);
+            return _.findWhere(self.preferences_cache, {'module': module, 'name': preference});
+          }
+        }
+      }
+      else {
+        return _.findWhere(self.preferences_cache, {'module': module, 'name': preference});
+      }
+    },
+
+    // Get and cache the preferences
+    cache_preferences: function () {
+      var self = this;
       $.ajax({
-        async: false,
-        url: url_for(
-          'preferences.get_by_name', {
-            'module': module,
-            'preference': preference_name
-          }),
+        url: url_for('preferences.get_all'),
         success: function(res) {
-          preference = res;
+          self.preferences_cache = res;
         },
         error: function(xhr, status, error) {
-
+          try {
+            var err = $.parseJSON(xhr.responseText);
+            Alertify.alert(gettext('Preferences loading failed.'),
+              err.errormsg
+            );
+          } catch (e) {}
         }
       });
-
-      return preference;
     },
 
     _findTreeChildNode: function(_i, _d, _o) {
diff --git a/web/pgadmin/preferences/__init__.py b/web/pgadmin/preferences/__init__.py
index 52f3f56..a59e26d 100644
--- a/web/pgadmin/preferences/__init__.py
+++ b/web/pgadmin/preferences/__init__.py
@@ -60,7 +60,7 @@ class PreferencesModule(PgAdminModule):
         Returns:
             list: a list of url endpoints exposed to the client.
         """
-        return ['preferences.index', 'preferences.get_by_name']
+        return ['preferences.index', 'preferences.get_by_name', 'preferences.get_all']
 
 
 blueprint = PreferencesModule(MODULE_NAME, __name__)
@@ -142,6 +142,27 @@ def preferences(module=None, preference=None):
     )
 
 
+@blueprint.route("/get_all", methods=["GET"], endpoint='get_all')
+@login_required
+def preferences_s():
+    """Fetch all preferences for caching."""
+    # Load Preferences
+    pref = Preferences.preferences()
+    res = []
+
+    for m in pref:
+        if len(m['categories']):
+            for c in m['categories']:
+                for p in c['preferences']:
+                    p['module'] = m['label']
+                    res.append(p)
+
+    return ajax_response(
+        response=res,
+        status=200
+    )
+
+
 @blueprint.route("/<int:pid>", methods=["PUT"], endpoint="update")
 @login_required
 def save(pid):
diff --git a/web/pgadmin/preferences/templates/preferences/preferences.js b/web/pgadmin/preferences/templates/preferences/preferences.js
index 080bc38..8fc3cd8 100644
--- a/web/pgadmin/preferences/templates/preferences/preferences.js
+++ b/web/pgadmin/preferences/templates/preferences/preferences.js
@@ -389,6 +389,8 @@ define([
 
               if (e.button.text == gettext('OK')){
                 preferences.updateAll();
+                // Refresh preferences cache
+                pgBrowser.cache_preferences();
               }
             },
             build: function() {
diff --git a/web/pgadmin/static/js/check_node_visibility.js b/web/pgadmin/static/js/check_node_visibility.js
index 987a395..e50c2f5 100644
--- a/web/pgadmin/static/js/check_node_visibility.js
+++ b/web/pgadmin/static/js/check_node_visibility.js
@@ -30,21 +30,12 @@ define(['jquery', 'underscore', 'underscore.string'],
         return true;
       }
 
-      // If we have already fetched preference earlier then pick
-      // it from our cache object
-      if (_.has(pgBrowser.node_preference_data, node_type)) {
-        return pgBrowser.node_preference_data[node_type].value
-      }
-
-      var preference = pgBrowser.get_preference(
-        'browser', 'show_node_' + node_type
-      );
+      preference = pgBrowser.get_preference("Browser", 'show_node_'+node_type);
 
-      // Save it for future use, kind of caching
-      if(!_.isUndefined(preference) && !_.isNull(preference)) {
-        pgBrowser.node_preference_data[node_type] = preference;
-        return preference.value;
-      } else {
+      if (preference) {
+        return preference.value
+      }
+      else {
         return true;
       }
     }

Reply via email to