Bladeren bron

HUE-6475 [assist] Only show the functions panel for Hive, Impala and Pig

This also takes care of the case when the right assist is empty.
Johan Ahlen 8 jaren geleden
bovenliggende
commit
ea6d870147

+ 1 - 0
desktop/core/src/desktop/static/desktop/js/apiHelper.js

@@ -247,6 +247,7 @@ var ApiHelper = (function () {
       }
       self.setInTotalStorage(owner, id, newValue);
     });
+    return observable;
   };
 
   /**

+ 56 - 42
desktop/core/src/desktop/templates/assist.mako

@@ -2037,17 +2037,17 @@ from notebook.conf import get_ordered_interpreters
   <script type="text/html" id="right-assist-panel-template">
     <div style="height: 100%; width: 100%; position: relative;">
       <ul class="right-panel-tabs nav nav-pills">
-        <li data-bind="css: { 'active' : activeTab() === 'assistant' }, visible: assistantAvailable"><a href="javascript: void(0);" data-bind="click: function() { activeTab('assistant'); }">${ _('Assistant') }</a></li>
-        <li data-bind="css: { 'active' : activeTab() === 'functions' }"><a href="javascript: void(0);" data-bind="click: function() { activeTab('functions'); }">${ _('Functions') }</a></li>
-        <li data-bind="css: { 'active' : activeTab() === 'schedules' }, visible: schedulesAvailable"><a href="javascript: void(0);" data-bind="click: function() { activeTab('schedules'); }">${ _('Schedule') }</a></li>
+        <li data-bind="css: { 'active' : activeTab() === 'assistant' }, visible: assistantTabAvailable" style="display:none;"><a href="javascript: void(0);" data-bind="click: function() { lastActiveTab('assistant'); activeTab('assistant'); }">${ _('Assistant') }</a></li>
+        <li data-bind="css: { 'active' : activeTab() === 'functions' }, visible: functionsTabAvailable" style="display:none;"><a href="javascript: void(0);" data-bind="click: function() { lastActiveTab('functions'); activeTab('functions'); }">${ _('Functions') }</a></li>
+        <li data-bind="css: { 'active' : activeTab() === 'schedules' }, visible: schedulesTabAvailable" style="display:none;"><a href="javascript: void(0);" data-bind="click: function() { lastActiveTab('schedules'); activeTab('schedules'); }">${ _('Schedule') }</a></li>
       </ul>
 
       <div class="right-panel-tab-content tab-content">
-        <!-- ko if: activeTab() === 'assistant' -->
+        <!-- ko if: activeTab() === 'assistant' && assistantTabAvailable()-->
         <div data-bind="component: { name: 'assistant-panel' }"></div>
         <!-- /ko -->
 
-        <!-- ko if: activeTab() === 'functions' -->
+        <!-- ko if: activeTab() === 'functions' && functionsTabAvailable -->
         <div data-bind="component: { name: 'functions-panel' }"></div>
         <!-- /ko -->
 
@@ -2060,67 +2060,81 @@ from notebook.conf import get_ordered_interpreters
 
   <script type="text/javascript">
     (function () {
+
+      var ASSISTANT_TAB = 'assistant';
+      var FUNCTIONS_TAB = 'functions';
+      var SCHEDULES_TAB = 'schedules';
+
       function RightAssistPanel(params) {
         var self = this;
         self.disposals = [];
 
         self.activeTab = ko.observable();
-        self.assistantAvailable = ko.observable(false);
 
-        self.schedulesAvailable = ko.observable(false);
+        self.assistantTabAvailable = ko.observable(false);
+        self.functionsTabAvailable = ko.observable(false);
+        self.schedulesTabAvailable = ko.observable(false);
 
         var apiHelper = ApiHelper.getInstance();
-        var lastActiveTab = apiHelper.getFromTotalStorage('assist', 'last.open.right.panel');
+        self.lastActiveTab = apiHelper.withTotalStorage('assist', 'last.open.right.panel', ko.observable(), ASSISTANT_TAB);
+
+        var assistEnabledApp = false;
+
+        var updateTabs = function () {
+          if (!assistEnabledApp) {
+            params.rightAssistAvailable(false);
+            return;
+          }
+          var rightAssistAvailable = true;
+          if (self.lastActiveTab() === FUNCTIONS_TAB && self.functionsTabAvailable()) {
+            self.activeTab(FUNCTIONS_TAB);
+          } else if (self.lastActiveTab() === SCHEDULES_TAB && self.schedulesTabAvailable()) {
+            self.activeTab(SCHEDULES_TAB);
+          } else if (self.assistantTabAvailable()) {
+            self.activeTab(ASSISTANT_TAB);
+          } else if (self.functionsTabAvailable()) {
+            self.activeTab(FUNCTIONS_TAB);
+          } else if (self.schedulesTabAvailable()) {
+            self.activeTab(SCHEDULES_TAB);
+          } else {
+            self.activeTab(null);
+            rightAssistAvailable = false;
+          }
+          params.rightAssistAvailable(rightAssistAvailable);
+        };
 
         if ('${ ENABLE_QUERY_SCHEDULING.get() }' === 'True' && IS_HUE_4) {
           var currentAppSub = huePubSub.subscribe('set.current.app.view.model', function (viewModel) {
-            self.schedulesAvailable(!!viewModel.selectedNotebook);
-            if (lastActiveTab === 'schedules') {
-              self.activeTab(self.schedulesAvailable() ? 'schedules' : (self.assistantAvailable() ? 'assistant' : 'functions'));
-            }
+            // Async
+            self.schedulesTabAvailable(!!viewModel.selectedNotebook);
+            updateTabs();
           });
           self.disposals.push(currentAppSub.remove.bind(currentAppSub));
           huePubSub.publish('get.current.app.view.model');
         } else {
           // Right assist is only available in the Hue 3 editor and notebook.
-          self.schedulesAvailable('${ ENABLE_QUERY_SCHEDULING.get() }' === 'True');
-          if (lastActiveTab === 'schedules') {
-            self.activeTab(self.schedulesAvailable() ? 'schedules' : (self.assistantAvailable() ? 'assistant' : 'functions'));
-          }
+          self.schedulesTabAvailable('${ ENABLE_QUERY_SCHEDULING.get() }' === 'True');
         }
 
-
         var snippetTypeSub = huePubSub.subscribe('active.snippet.type.changed', function (type) {
-          if (type === 'hive' || type === 'impala') {
-            self.assistantAvailable(true);
-            if (lastActiveTab === 'assistant') {
-              self.activeTab('assistant');
-            }
-          } else {
-            if (self.activeTab() === 'assistant') {
-              var newTab = lastActiveTab === 'assistant' ? 'functions' : lastActiveTab;
-              if (self.activeTab() !== newTab) {
-                self.activeTab(newTab);
-              }
-            }
-            self.assistantAvailable(false);
-          }
+          self.functionsTabAvailable(type === 'hive' || type === 'impala' || type === 'pig');
+          self.assistantTabAvailable(type === 'hive' || type === 'impala');
+          updateTabs();
         });
         self.disposals.push(snippetTypeSub.remove.bind(snippetTypeSub));
 
-        if (lastActiveTab === 'assistant' && self.assistantAvailable()) {
-          self.activeTab(lastActiveTab);
-        } else if (lastActiveTab === 'schedules' && self.schedulesAvailable()) {
-          self.activeTab(lastActiveTab);
-        } else if (self.assistantAvailable()) {
-          self.activeTab('assistant');
+        if (IS_HUE_4) {
+          huePubSub.subscribe('set.current.app.name', function (appName) {
+            assistEnabledApp = appName === 'editor' || appName === 'notebook';
+            if (!assistEnabledApp) {
+              params.rightAssistAvailable(false);
+            }
+          });
+          huePubSub.publish('get.current.app.name');
         } else {
-          self.activeTab('functions');
+          assistEnabledApp = true;
         }
-
-        self.activeTab.subscribe(function (newValue) {
-          apiHelper.setInTotalStorage('assist', 'last.open.right.panel', newValue);
-        })
+        updateTabs();
       }
 
       RightAssistPanel.prototype.dispose = function () {

+ 7 - 12
desktop/core/src/desktop/templates/hue.mako

@@ -397,17 +397,17 @@ ${ hueIcons.symbols() }
       onPosition: function() { huePubSub.publish('split.draggable.position') }
     }"><div class="resize-bar" style="right: 0">&nbsp;</div></div>
 
-    <div class="right-panel side-panel-closed" data-bind="css: { 'side-panel-closed': !rightAssistVisible() || !rightAssistAvailable() }, visibleOnHover: { selector: '.hide-right-side-panel' }">
-      <!-- ko if: rightAssistAvailable -->
-      <a href="javascript:void(0);" style="display: none;" title="${_('Show Assist')}" class="pointer side-panel-toggle show-right-side-panel" data-bind="visible: ! rightAssistVisible(), toggle: rightAssistVisible"><i class="fa fa-chevron-left"></i></a>
-      <a href="javascript:void(0);" style="display: none; opacity: 0;" title="${_('Hide Assist')}" class="pointer side-panel-toggle hide-right-side-panel" data-bind="visible: rightAssistVisible(), toggle: rightAssistVisible"><i class="fa fa-chevron-right"></i></a>
+    <div class="right-panel side-panel-closed" data-bind="visible: rightAssistAvailable, css: { 'side-panel-closed': !rightAssistVisible() || !rightAssistAvailable() }, visibleOnHover: { selector: '.hide-right-side-panel' }" style="display:none;">
+      <a href="javascript:void(0);" style="display: none;" title="${_('Show Assist')}" class="pointer side-panel-toggle show-right-side-panel" data-bind="visible: rightAssistAvailable() && !rightAssistVisible(), toggle: rightAssistVisible"><i class="fa fa-chevron-left"></i></a>
+      <a href="javascript:void(0);" style="display: none; opacity: 0;" title="${_('Hide Assist')}" class="pointer side-panel-toggle hide-right-side-panel" data-bind="visible: rightAssistAvailable() && rightAssistVisible(), toggle: rightAssistVisible"><i class="fa fa-chevron-right"></i></a>
 
       <div class="assist" data-bind="component: {
           name: 'right-assist-panel',
-          params: {}
-        }, visible: rightAssistVisible" style="display: none;">
+          params: {
+            rightAssistAvailable: rightAssistAvailable
+          }
+        }, visible: rightAssistAvailable() && rightAssistVisible()" style="display: none;">
       </div>
-      <!-- /ko -->
     </div>
 
     <div class="context-panel" data-bind="css: { 'visible': contextPanelVisible }">
@@ -1044,11 +1044,6 @@ ${ smart_unicode(login_modal(request).content) | n,unicode }
         self.rightAssistAvailable = ko.observable(false);
         self.activeAppViewModel = ko.observable();
 
-        huePubSub.subscribe('set.current.app.name', function (appName) {
-          self.rightAssistAvailable(appName === 'editor' || appName === 'notebook');
-        });
-        huePubSub.publish('get.current.app.name');
-
         self.contextPanelVisible = ko.observable(false);
         self.sessionsAvailable = ko.observable(false);