From d92c222625b5b56e1c4b514984437f7e48012ee6 Mon Sep 17 00:00:00 2001
From: Tira Odhner <pair+aodhner@pivotal.io>
Date: Mon, 20 Mar 2017 16:59:56 -0400
Subject: [PATCH 1/3] Extract acitree event handling so it can be tested

---
 .../browser/templates/browser/js/browser.js        | 100 +------------------
 web/pgadmin/static/js/handle_acitree_events.js     | 106 +++++++++++++++++++++
 2 files changed, 111 insertions(+), 95 deletions(-)
 create mode 100644 web/pgadmin/static/js/handle_acitree_events.js

diff --git a/web/pgadmin/browser/templates/browser/js/browser.js b/web/pgadmin/browser/templates/browser/js/browser.js
index d2e5dd7c..9d22da93 100644
--- a/web/pgadmin/browser/templates/browser/js/browser.js
+++ b/web/pgadmin/browser/templates/browser/js/browser.js
@@ -1,6 +1,8 @@
 define('pgadmin.browser',
         ['require', 'jquery', 'underscore', 'underscore.string', 'bootstrap',
-        'pgadmin', 'alertify', 'codemirror', 'codemirror/mode/sql/sql', 'wcdocker',
+        'pgadmin', 'alertify', 'codemirror',
+        'sources/handle_acitree_events',
+        'codemirror/mode/sql/sql', 'wcdocker',
         'jquery.contextmenu', 'jquery.aciplugin', 'jquery.acitree',
         'pgadmin.alertifyjs', 'pgadmin.browser.messages',
         'pgadmin.browser.menu', 'pgadmin.browser.panel',
@@ -8,7 +10,7 @@ define('pgadmin.browser',
         'pgadmin.browser.node', 'pgadmin.browser.collection'
 
        ],
-function(require, $, _, S, Bootstrap, pgAdmin, Alertify, CodeMirror) {
+function(require, $, _, S, Bootstrap, pgAdmin, Alertify, CodeMirror, handleAciTreeEvents) {
 
   // Some scripts do export their object in the window only.
   // Generally the one, which do no have AMD support.
@@ -411,99 +413,7 @@ function(require, $, _, S, Bootstrap, pgAdmin, Alertify, CodeMirror) {
       });
 
       // Treeview event handler
-      $('#tree').on('acitree', function(event, api, item, eventName, options) {
-        var d = item ? obj.tree.itemData(item) : null;
-
-        switch (eventName) {
-          // When a node is added in the browser tree, we need to
-          // load the registered scripts
-          case "added":
-            if (d) {
-              /* Loading all the scripts registered to be loaded on this node */
-              if (obj.scripts && obj.scripts[d._type]) {
-                var scripts = _.extend({}, obj.scripts[d._type]);
-
-                /*
-                 * We can remove it from the Browser.scripts object as
-                 * these're about to be loaded.
-                 *
-                 * This will make sure that we check for the script to be
-                 * loaded only once.
-                 *
-                 */
-                delete obj.scripts[d._type];
-
-                setTimeout(function() {
-                  _.each(scripts, function(s) {
-                    if (!s.loaded) {
-                      require([s.name], function(m) {
-                        s.loaded = true;
-                        // Call the initializer (if present)
-                        if (m && m.init && typeof m.init == 'function') {
-                          try {
-                            m.init();
-                            obj.Events.trigger(
-                              'pgadmin:module:' + s.name + ':initialized', m, obj
-                            );
-                          } catch (err) {
-                            console.log("Error running module init script for '" + s.path + "'");
-                            console.log(err);
-
-                            obj.report_error(
-                              '{{ _('Error Initializing script - ') }}' + s.path, err);
-                          }
-                        }
-                      }, function() {
-                        console.log("Error loading script - " + s.path);
-                        console.log(arguments);
-                        obj.report_error(
-                          '{{ _('Error loading script - ') }}' + s.path);
-                      }).bind(s);
-                    }
-                  });
-                }, 1);
-              }
-            }
-            break;
-        }
-
-        var node;
-
-        if (d && obj.Nodes[d._type]) {
-          node = obj.Nodes[d._type];
-
-          /* If the node specific callback returns false, we will also return
-           * false for further processing.
-           */
-          if (_.isObject(node.callbacks) &&
-              eventName in node.callbacks &&
-              typeof node.callbacks[eventName] == 'function' &&
-              !node.callbacks[eventName].apply(
-                  node, [item, d, obj, options, eventName])) {
-            return false;
-          }
-          /* Raise tree events for the nodes */
-          try {
-            node.trigger(
-                'browser-node.' + eventName, node, item, d
-                );
-          } catch (e) {
-            console.log(e);
-          }
-        }
-
-        try {
-          obj.Events.trigger(
-              'pgadmin-browser:tree', eventName, item, d
-              );
-          obj.Events.trigger(
-              'pgadmin-browser:tree:' + eventName, item, d, node
-              );
-        } catch (e) {
-          console.log(e);
-        }
-        return true;
-      });
+      $('#tree').on('acitree', handleAciTreeEvents.bind(this));
 
       // There are some scripts which needed to be loaded immediately,
       // but - not all. We will will need to generate all the menus only
diff --git a/web/pgadmin/static/js/handle_acitree_events.js b/web/pgadmin/static/js/handle_acitree_events.js
new file mode 100644
index 00000000..99f9b0fe
--- /dev/null
+++ b/web/pgadmin/static/js/handle_acitree_events.js
@@ -0,0 +1,106 @@
+/*************************************************************************
+ *
+ * pgAdmin 4 - PostgreSQL Tools
+ *
+ * Copyright (C) 2013 - 2017, The pgAdmin Development Team
+ * This software is released under the PostgreSQL Licence
+ *
+ **************************************************************************/
+
+define(['sources/translate'], function (translate) {
+    return function (event, api, item, eventName, options) {
+      var obj = this;
+      var d = item ? obj.tree.itemData(item) : null;
+
+      switch (eventName) {
+        // When a node is added in the browser tree, we need to
+        // load the registered scripts
+        case "added":
+          if (d) {
+            /* Loading all the scripts registered to be loaded on this node */
+            if (obj.scripts && obj.scripts[d._type]) {
+              var scripts = _.extend({}, obj.scripts[d._type]);
+
+              /*
+               * We can remove it from the Browser.scripts object as
+               * these're about to be loaded.
+               *
+               * This will make sure that we check for the script to be
+               * loaded only once.
+               *
+               */
+              delete obj.scripts[d._type];
+
+              setTimeout(function () {
+                _.each(scripts, function (s) {
+                  if (!s.loaded) {
+                    require([s.name], function (m) {
+                      s.loaded = true;
+                      // Call the initializer (if present)
+                      if (m && m.init && typeof m.init == 'function') {
+                        try {
+                          m.init();
+                          obj.Events.trigger(
+                            'pgadmin:module:' + s.name + ':initialized', m, obj
+                          );
+                        } catch (err) {
+                          console.log("Error running module init script for '" + s.path + "'");
+                          console.log(err);
+
+                          obj.report_error(
+                            translate('Error Initializing script - %{path}s', {path: s.path}), err);
+                        }
+                      }
+                    }, function () {
+                      console.log("Error loading script - " + s.path);
+                      console.log(arguments);
+                      obj.report_error(
+                        translate('Error loading script - %{path}s', {path: s.path}));
+                    }).bind(s);
+                  }
+                });
+              }, 1);
+            }
+          }
+          break;
+
+      }
+
+      var node;
+
+      if (d && obj.Nodes[d._type]) {
+        node = obj.Nodes[d._type];
+
+        /* If the node specific callback returns false, we will also return
+         * false for further processing.
+         */
+        if (_.isObject(node.callbacks) &&
+          eventName in node.callbacks &&
+          typeof node.callbacks[eventName] == 'function' && !node.callbacks[eventName].apply(
+            node, [item, d, obj, options, eventName])) {
+          return false;
+        }
+        /* Raise tree events for the nodes */
+        try {
+          node.trigger(
+            'browser-node.' + eventName, node, item, d
+          );
+        } catch (e) {
+          console.log(e);
+        }
+      }
+
+      try {
+        obj.Events.trigger(
+          'pgadmin-browser:tree', eventName, item, d
+        );
+        obj.Events.trigger(
+          'pgadmin-browser:tree:' + eventName, item, d, node
+        );
+      } catch (e) {
+        console.log(e);
+      }
+      return true;
+    }
+  }
+);
\ No newline at end of file
-- 
2.12.0

