Преглед изворни кода

HUE-5834 [metastore] Show metastore links directly in responsive

This also fixes a couple of minor issues and adds an “Open in Metastore” link to the assist right-click context menu for tables.
Johan Ahlen пре 8 година
родитељ
комит
a0346df

+ 102 - 90
apps/metastore/src/metastore/static/metastore/js/metastore.ko.js

@@ -760,66 +760,6 @@ var MetastoreViewModel = (function () {
 
     loadDatabases();
 
-    var setDatabaseByName = function (databaseName, callback) {
-      if (databaseName === '') {
-        databaseName = self.apiHelper.getFromTotalStorage('editor', 'last.selected.database') ||
-            self.apiHelper.getFromTotalStorage('metastore', 'last.selected.database') || 'default';
-      }
-      if (self.database() && self.database().name == databaseName) {
-        if (callback) {
-          callback();
-        }
-        return;
-      }
-      var foundDatabases = $.grep(self.databases(), function (database) {
-        return database.name === databaseName;
-      });
-      if (foundDatabases.length === 1) {
-        self.setDatabase(foundDatabases[0], callback);
-      } else {
-        foundDatabases = $.grep(self.databases(), function (database) {
-          return database.name === 'default';
-        });
-        if (foundDatabases.length === 1) {
-          self.setDatabase(foundDatabases[0], callback);
-        }
-      }
-    };
-
-    var loadTableDef = function (tableDef, callback) {
-      setDatabaseByName(tableDef.database);
-      if (self.database()) {
-        if (self.database().table() && self.database().table().name == tableDef.name) {
-          return;
-        }
-        var setTableAfterLoad = function () {
-          var foundTables = $.grep(self.database().tables(), function (table) {
-            return table.name === tableDef.name;
-          });
-          if (foundTables.length === 1) {
-            self.database().setTable(foundTables[0], callback);
-          }
-          else {
-            huePubSub.publish('assist.clear.db.cache', {
-              sourceType: 'hive',
-              clearAll: false,
-              databaseName: self.database().name
-            });
-            self.database().load(setTableAfterLoad, self.optimizerEnabled(), self.navigatorEnabled());
-          }
-        };
-
-        if (!self.database().loaded()) {
-          var doOnce = self.database().loaded.subscribe(function () {
-            setTableAfterLoad();
-            doOnce.dispose();
-          });
-        } else {
-          setTableAfterLoad();
-        }
-      }
-    };
-
     huePubSub.subscribe('assist.db.refresh', function (options) {
       if (options.sourceType !== 'hive') {
         return;
@@ -841,7 +781,7 @@ var MetastoreViewModel = (function () {
       }
       loadDatabases(function () {
         if (currentDatabase) {
-          setDatabaseByName(currentDatabase, function () {
+          self.setDatabaseByName(currentDatabase, function () {
             if (self.database() && currentTable) {
               self.database().setTableByName(currentTable);
             }
@@ -863,7 +803,7 @@ var MetastoreViewModel = (function () {
       if (self.database()) {
         self.database().table(null);
       }
-      setDatabaseByName(databaseDef.name, function () {
+      self.setDatabaseByName(databaseDef.name, function () {
         huePubSub.publish('metastore.url.change')
       });
     });
@@ -884,35 +824,11 @@ var MetastoreViewModel = (function () {
       }
     });
 
-    function loadURL() {
-      var path = window.location.pathname.split('/');
-      switch (path[2]) {
-        case 'databases':
-          if (self.database()) {
-            self.database().table(null);
-            self.database(null);
-          }
-          break;
-        case 'tables':
-          if (self.database()) {
-            self.database().table(null);
-          }
-          setDatabaseByName(path[3]);
-          break;
-        case 'table':
-          window.setTimeout(function() {
-            loadTableDef({
-              name: path[4],
-              database: path[3]
-            });
-          }, 200);
-          break;
-      }
-    }
+    self.loadURL();
 
-    loadURL();
-
-    window.onpopstate = loadURL;
+    window.onpopstate = function () {
+      self.loadURL();
+    };
 
     self.databasesBreadcrumb = function () {
       if (self.database()) {
@@ -928,6 +844,102 @@ var MetastoreViewModel = (function () {
     }
   }
 
+  MetastoreViewModel.prototype.loadTableDef = function (tableDef, callback) {
+    var self = this;
+    self.setDatabaseByName(tableDef.database);
+    if (self.database()) {
+      if (self.database().table() && self.database().table().name == tableDef.name) {
+        return;
+      }
+      var setTableAfterLoad = function () {
+        var foundTables = $.grep(self.database().tables(), function (table) {
+          return table.name === tableDef.name;
+        });
+        if (foundTables.length === 1) {
+          self.database().setTable(foundTables[0], callback);
+        }
+        else {
+          huePubSub.publish('assist.clear.db.cache', {
+            sourceType: 'hive',
+            clearAll: false,
+            databaseName: self.database().name
+          });
+          self.database().load(setTableAfterLoad, self.optimizerEnabled(), self.navigatorEnabled());
+        }
+      };
+
+      if (!self.database().loaded()) {
+        var doOnce = self.database().loaded.subscribe(function () {
+          setTableAfterLoad();
+          doOnce.dispose();
+        });
+      } else {
+        setTableAfterLoad();
+      }
+    }
+  };
+
+  MetastoreViewModel.prototype.setDatabaseByName = function (databaseName, callback) {
+    var self = this;
+    if (databaseName === '') {
+      databaseName = self.apiHelper.getFromTotalStorage('editor', 'last.selected.database') ||
+          self.apiHelper.getFromTotalStorage('metastore', 'last.selected.database') || 'default';
+    }
+    if (self.database() && self.database().name == databaseName) {
+      if (callback) {
+        callback();
+      }
+      return;
+    }
+    var foundDatabases = $.grep(self.databases(), function (database) {
+      return database.name === databaseName;
+    });
+    if (foundDatabases.length === 1) {
+      self.setDatabase(foundDatabases[0], callback);
+    } else {
+      foundDatabases = $.grep(self.databases(), function (database) {
+        return database.name === 'default';
+      });
+      if (foundDatabases.length === 1) {
+        self.setDatabase(foundDatabases[0], callback);
+      }
+    }
+  };
+
+  MetastoreViewModel.prototype.loadURL = function () {
+    var self = this;
+
+    var path = (IS_HUE_4 ? window.location.getParameter('path', true) : window.location.pathname).split('/');
+    if (path[0] === '') {
+      path.shift();
+    }
+    if (path[0] === 'metastore') {
+      path.shift();
+    }
+    switch (path[0]) {
+      case 'databases':
+        if (self.database()) {
+          self.database().table(null);
+          self.database(null);
+        }
+        break;
+      case 'tables':
+        if (self.database()) {
+          self.database().table(null);
+        }
+        self.setDatabaseByName(path[1]);
+        break;
+      case 'table':
+        window.setTimeout(function() {
+          self.loadTableDef({
+            name: path[2],
+            database: path[1]
+          });
+        }, 200);
+        break;
+    }
+  };
+
   MetastoreViewModel.prototype.setDatabase = function (metastoreDatabase, callback) {
     var self = this;
     huePubSub.publish('metastore.scroll.to.top');

Разлика између датотеке није приказан због своје велике величине
+ 0 - 0
desktop/core/src/desktop/static/desktop/css/hue.css


+ 15 - 0
desktop/core/src/desktop/static/desktop/js/assist/assistDbEntry.js

@@ -438,6 +438,21 @@ var AssistDbEntry = (function () {
     huePubSub.publish('assist.dblClickDbItem', self);
   };
 
+  AssistDbEntry.prototype.openInMetastore = function () {
+    var self = this;
+
+    // TODO: Enable metastore links for databases
+    var path = [];
+    path.push(self.parent.definition.name);
+    path.push(self.definition.name);
+
+    if (IS_HUE_4) {
+      huePubSub.publish('open.link', '/metastore/table/' + path.join('/'));
+    } else {
+      window.open('/metastore/table/' + path.join('/'), '_blank');
+    }
+  };
+
   AssistDbEntry.prototype.toggleOpen = function () {
     var self = this;
     self.open(!self.open());

+ 1 - 1
desktop/core/src/desktop/static/desktop/less/hue.less

@@ -578,7 +578,7 @@ a:visited {
 .hue-context-menu, .hue-popover-bottom {
   border-radius: @hue-panel-border-radius;
   background-color: @cui-white;
-  .hue-box-shadow-top;
+  .hue-box-shadow-bottom;
 }
 
 .hue-popover {

+ 3 - 0
desktop/core/src/desktop/templates/assist.mako

@@ -78,6 +78,9 @@ from notebook.conf import ENABLE_QUERY_BUILDER
   <script type="text/html" id="sql-context-items">
     <li><a href="javascript:void(0);" data-bind="click: function (data) { showContextPopover(data, { target: $parentContext.$contextSourceElement }, { left: 4, top: 2 }); }"><i class="fa fa-fw fa-info"></i> ${ _('Show details') }</a></li>
     <li><a href="javascript:void(0);" data-bind="click: dblClick"><i class="fa fa-fw fa-paste"></i> ${ _('Insert at cursor') }</a></li>
+    <!-- ko if: definition.isTable || definition.isDatabase -->
+    <li><a href="javascript:void(0);" data-bind="click: openInMetastore"><i class="fa fa-fw fa-table"></i> ${ _('Open in Metastore') }</a></li>
+    <!-- /ko -->
     %if ENABLE_QUERY_BUILDER.get():
     <!-- ko if: definition.isColumn -->
     <li class="divider"></li>

+ 7 - 0
desktop/core/src/desktop/templates/responsive.mako

@@ -489,6 +489,7 @@ ${ hueIcons.symbols() }
 <script src="${ static('desktop/js/ko.charts.js') }"></script>
 <script src="${ static('desktop/ext/js/knockout-sortable.min.js') }"></script>
 <script src="${ static('desktop/ext/js/knockout.validation.min.js') }"></script>
+<script src="${ static('desktop/ext/js/bootstrap-editable.min.js') }"></script>
 <script src="${ static('desktop/js/ko.editable.js') }"></script>
 <script src="${ static('desktop/js/ko.switch-case.js') }"></script>
 <script src="${ static('desktop/js/ko.hue-bindings.js') }"></script>
@@ -671,6 +672,12 @@ ${ assist.assistPanel() }
               }
               self.currentApp('editor')
             }
+          } else if (href.startsWith('/metastore')){
+            self.currentApp('metastore');
+            hueUtils.changeURLParameter('path', href.substring('/metastore'.length + 1));
+            self.getActiveAppViewModel(function (metastoreViewModel) {
+              metastoreViewModel.loadURL();
+            });
           } else if (href.startsWith('/notebook')){
             self.currentApp('notebook');
           } else if (href.startsWith('/pig')){

+ 6 - 1
desktop/core/src/desktop/templates/sql_context_popover.mako

@@ -707,7 +707,12 @@ from metadata.conf import has_navigator
           }));
 
           pubSubs.push(huePubSub.subscribe('sql.context.popover.open.in.metastore', function () {
-            window.open('/metastore/table/' + path.join('/'), '_blank');
+            if (IS_HUE_4) {
+              huePubSub.publish('open.link', '/metastore/table/' + path.join('/'));
+              huePubSub.publish('sql.context.popover.hide');
+            } else {
+              window.open('/metastore/table/' + path.join('/'), '_blank');
+            }
           }));
         });
       }

Неке датотеке нису приказане због велике количине промена