Эх сурвалжийг харах

[sentry] Link roles to the browse section in Hive

Added smart external linking too
Added deep linking to column on Metastore
Added subscribeOnce to huePubSub
Enrico Berti 10 жил өмнө
parent
commit
590a8a1f59

+ 15 - 3
apps/metastore/src/metastore/templates/describe_table.mako

@@ -256,17 +256,29 @@ ${ components.menubar() }
 
 
   $(document).ready(function () {
   $(document).ready(function () {
 
 
-    $(".column-selector").on("click", function () {
+    function selectColumn(col) {
       var _t = $("#sample");
       var _t = $("#sample");
-      var _text = $.trim($(this).text().split("(")[0]);
       var _col = _t.find("th").filter(function() {
       var _col = _t.find("th").filter(function() {
-        return $.trim($(this).text()) == _text;
+        return $.trim($(this).text()) == col;
       });
       });
       _t.find(".columnSelected").removeClass("columnSelected");
       _t.find(".columnSelected").removeClass("columnSelected");
       _t.find("tr td:nth-child(" + (_col.index() + 1) + ")").addClass("columnSelected");
       _t.find("tr td:nth-child(" + (_col.index() + 1) + ")").addClass("columnSelected");
       $("a[href='#sample']").click();
       $("a[href='#sample']").click();
+
+    }
+
+    $(".column-selector").on("click", function () {
+      selectColumn($.trim($(this).text().split("(")[0]));
     });
     });
 
 
+    if (window.location.hash != "") {
+      if (window.location.hash.indexOf("col=") > -1) {
+        window.setTimeout(function(){
+          selectColumn(window.location.hash.split("=")[1]);
+        }, 200)
+      }
+    }
+
     % if has_write_access:
     % if has_write_access:
         $.getJSON("${ url('metastore:drop_table', database=database) }", function (data) {
         $.getJSON("${ url('metastore:drop_table', database=database) }", function (data) {
           $("#dropTableMessage").text(data.title);
           $("#dropTableMessage").text(data.title);

+ 52 - 2
apps/security/src/security/static/security/js/hive.ko.js

@@ -98,7 +98,20 @@ var Privilege = function (vm, privilege) {
     },
     },
     owner: self
     owner: self
   });
   });
-  self.privilegeScope = ko.computed(function () {
+
+  self.metastorePath = ko.computed(function(){
+    if (self.columnName().length > 0) {
+      return '/metastore/table/' + self.dbName() + "/" + self.tableName() + "#col=" + self.columnName();
+    } else if (self.tableName().length > 0) {
+      return '/metastore/table/' + self.dbName() + "/" + self.tableName();
+    } else if (self.dbName().length > 0) {
+      return '/metastore/tables/' + self.dbName();
+    } else {
+      return '';
+    }
+  });
+
+  function getPrivilegeScope() {
     if (self.privilegeType() == 'uri') {
     if (self.privilegeType() == 'uri') {
       return 'URI';
       return 'URI';
     } else if (self.columnName().length > 0) {
     } else if (self.columnName().length > 0) {
@@ -110,6 +123,24 @@ var Privilege = function (vm, privilege) {
     } else {
     } else {
       return 'SERVER';
       return 'SERVER';
     }
     }
+  }
+
+  self.privilegeScope = ko.observable(typeof privilege.privilegeScope != "undefined" ? privilege.privilegeScope : getPrivilegeScope());
+
+  self.privilegeType.subscribe(function(newVal){
+    self.privilegeScope(getPrivilegeScope());
+  });
+
+  self.columnName.subscribe(function(newVal){
+    self.privilegeScope(getPrivilegeScope());
+  });
+
+  self.tableName.subscribe(function(newVal){
+    self.privilegeScope(getPrivilegeScope());
+  });
+
+  self.dbName.subscribe(function(newVal){
+    self.privilegeScope(getPrivilegeScope());
   });
   });
 
 
   self.remove = function (privilege) {
   self.remove = function (privilege) {
@@ -345,6 +376,17 @@ var Assist = function (vm, initial) {
     var column = self.path().split(/[.]/)[2];
     var column = self.path().split(/[.]/)[2];
     return column ? column : null;
     return column ? column : null;
   });
   });
+  self.metastorePath = ko.computed(function(){
+    if (self.column()) {
+      return '/metastore/table/' + self.db() + "/" + self.table() + "#col=" + self.column();
+    } else if (self.table()) {
+      return '/metastore/table/' + self.db() + "/" + self.table();
+    } else if (self.db()) {
+      return '/metastore/tables/' + self.db();
+    } else {
+      return '/metastore/databases';
+    }
+  });
   self.privileges = ko.observableArray();
   self.privileges = ko.observableArray();
   self.roles = ko.observableArray();
   self.roles = ko.observableArray();
   self.isDiffMode = ko.observable(false);
   self.isDiffMode = ko.observable(false);
@@ -703,7 +745,7 @@ var Assist = function (vm, initial) {
   self.fetchHivePath = function (optionalPath, loadCallback) {
   self.fetchHivePath = function (optionalPath, loadCallback) {
     var _originalPath = typeof optionalPath != "undefined" ? optionalPath : self.path();
     var _originalPath = typeof optionalPath != "undefined" ? optionalPath : self.path();
 
 
-    if (_originalPath.split(".").length < 3) {
+    if (_originalPath.split(".").length < 4) {
       self.isLoadingTree(true);
       self.isLoadingTree(true);
 
 
       var _path = _originalPath.replace('.', '/');
       var _path = _originalPath.replace('.', '/');
@@ -1256,6 +1298,14 @@ var HiveViewModel = function (initial) {
     }
     }
     return "edit";
     return "edit";
   }
   }
+
+  self.linkToBrowse = function (path) {
+    self.assist.path(path);
+    $(document).trigger("changed.path");
+    self.assist.loadParents();
+    self.updateSectionHash("edit");
+    $(document).trigger("show.mainSection");
+  }
 };
 };
 
 
 function logGA(page) {
 function logGA(page) {

+ 12 - 5
apps/security/src/security/templates/hive.mako

@@ -95,19 +95,22 @@ ${ layout.menubar(section='hive') }
     <!-- ko if: grantOption -->
     <!-- ko if: grantOption -->
       <i class="fa fa-unlock muted" title="${ _('With grant option') }"></i>
       <i class="fa fa-unlock muted" title="${ _('With grant option') }"></i>
     <!-- /ko -->
     <!-- /ko -->
+    <span data-bind="visible: metastorePath() != '' && privilegeType() == 'db'">
+      <a data-bind="attr: { href: metastorePath() }" class="muted" target="_blank" style="margin-left: 4px"><i class="fa fa-external-link"></i></a>
+    </span>
     <br/>
     <br/>
 
 
     server=<span data-bind="text: serverName"></span>
     server=<span data-bind="text: serverName"></span>
 
 
     <!-- ko if: privilegeType() == 'db' -->
     <!-- ko if: privilegeType() == 'db' -->
       <span data-bind="visible: dbName">
       <span data-bind="visible: dbName">
-        <i class="fa fa-long-arrow-right"></i> db=<a data-bind="attr: { href: '/metastore/tables/' + dbName() }" target="_blank"><span data-bind="text: dbName"></span></a>
+        <i class="fa fa-long-arrow-right"></i> db=<a class="pointer" data-bind="click: function(){ $root.linkToBrowse(dbName()) }"><span data-bind="text: dbName"></span></a>
       </span>
       </span>
       <span data-bind="visible: tableName">
       <span data-bind="visible: tableName">
-        <i class="fa fa-long-arrow-right"></i> table=<a data-bind="attr: { href: '/metastore/table/' + dbName() + '/' + tableName() }" target="_blank"><span data-bind="text: tableName"></span></a>
+        <i class="fa fa-long-arrow-right"></i> table=<a class="pointer" data-bind="click: function(){ $root.linkToBrowse(dbName() + '.' + tableName()) }"><span data-bind="text: tableName"></span></a>
       </span>
       </span>
       <span data-bind="visible: columnName">
       <span data-bind="visible: columnName">
-        <i class="fa fa-long-arrow-right"></i> column=<span data-bind="text: columnName"></span>
+        <i class="fa fa-long-arrow-right"></i> column=<a class="pointer" data-bind="click: function(){ $root.linkToBrowse(dbName() + '.' + tableName() + '.' + columnName()) }"><span data-bind="text: columnName"></span></a>
       </span>
       </span>
     <!-- /ko -->
     <!-- /ko -->
 
 
@@ -163,7 +166,7 @@ ${ layout.menubar(section='hive') }
               <div class="path-container">
               <div class="path-container">
                 <div class="input-append span12">
                 <div class="input-append span12">
                   <input id="path" class="path" type="text" autocomplete="off" />
                   <input id="path" class="path" type="text" autocomplete="off" />
-                  <a data-bind="attr: { href: '/metastore/table/' + $root.assist.path().replace('.', '/') }" target="_blank" title="${ _('Open in Metastore Browser') }" class="btn btn-inverse">
+                  <a data-bind="attr: { href: $root.assist.metastorePath() }" target="_blank" title="${ _('Open in Metastore Browser') }" class="btn btn-inverse">
                     <i class="fa fa-external-link"></i>
                     <i class="fa fa-external-link"></i>
                   </a>
                   </a>
                 </div>
                 </div>
@@ -670,7 +673,11 @@ ${ tree.import_templates(itemClick='$root.assist.setPath', iconClick='$root.assi
 
 
       showMainSection(viewModel.getSectionHash());
       showMainSection(viewModel.getSectionHash());
 
 
-      $(document).on("show.role", function(e, role) {
+      $(document).on("show.mainSection", function(){
+        showMainSection(viewModel.getSectionHash());
+      });
+
+      $(document).on("show.role", function(role) {
         if (typeof role != "undefined" && role.name != null){
         if (typeof role != "undefined" && role.name != null){
           $("#bulkActionsModal").modal("hide");
           $("#bulkActionsModal").modal("hide");
           showMainSection("roles");
           showMainSection("roles");

+ 7 - 0
desktop/core/src/desktop/static/desktop/js/hue.utils.js

@@ -189,6 +189,13 @@ var huePubSub = (function () {
         }
         }
       };
       };
     },
     },
+    subscribeOnce: function (topic, listener) {
+      var ephemeral = this.subscribe(topic, function(){
+        listener.apply(arguments);
+        ephemeral.remove();
+      });
+
+    },
     publish: function (topic, info) {
     publish: function (topic, info) {
       if (! hOP.call(topics, topic)) {
       if (! hOP.call(topics, topic)) {
         return;
         return;