瀏覽代碼

HUE-2962 [editor] Add action to save default settings for the user in the sessions modal

Johan Ahlen 9 年之前
父節點
當前提交
4efe5cb

+ 4 - 0
desktop/core/src/desktop/static/desktop/css/hue3.css

@@ -2241,6 +2241,10 @@ div.navigator .pull-right .nav {
   color: #aaa;
 }
 
+.inactive-action:hover {
+  text-decoration: none;
+}
+
 .inactive-action.disabled {
   color: #eee !important;
   cursor: default !important;

+ 50 - 27
desktop/core/src/desktop/static/desktop/js/assist/assistHelper.js

@@ -31,6 +31,7 @@
   var HDFS_API_PREFIX = "/filebrowser/view=";
   var HDFS_PARAMETERS = "?pagesize=100&format=json";
   var IMPALA_INVALIDATE_API = '/impala/api/invalidate';
+  var CONFIG_SAVE_API = '/desktop/api/configurations/save/';
 
   /**
    * @param {Object} i18n
@@ -179,6 +180,26 @@
     };
   };
 
+  /**
+   * @param {string} url
+   * @param {Object} data
+   * @param {Object} options
+   * @param {function} [options.successCallback]
+   * @param {function} [options.errorCallback]
+   * @param {boolean} [options.silenceErrors]
+   */
+  AssistHelper.prototype.simplePost = function (url, data, options) {
+    var self = this;
+    $.post(CONFIG_SAVE_API, data, function (data) {
+      if (self.successResponseIsError(data)) {
+        self.assistErrorCallback(options)(data);
+      } else if (typeof options.successCallback !== 'undefined') {
+        options.successCallback(data);
+      }
+    })
+    .fail(self.assistErrorCallback(options));
+  };
+
   /**
    * @param {Object} options
    * @param {Function} options.successCallback
@@ -237,6 +258,29 @@
     return queueForFunction[id];
   };
 
+  /**
+   * @param {Object} options
+   * @param {Function} [options.successCallback]
+   * @param {Function} [options.errorCallback]
+   * @param {boolean} [options.silenceErrors]
+   *
+   * @param {string} options.app
+   * @param {Object} options.properties
+   * @param {boolean} [options.isDefault]
+   * @param {Number} [options.groupId]
+   * @param {Number} [options.userId]
+   */
+  AssistHelper.prototype.saveConfiguration = function (options) {
+    var self = this;
+    self.simplePost(CONFIG_SAVE_API, {
+      app: options.app,
+      properties: ko.mapping.toJSON(options.properties),
+      is_default: options.isDefault,
+      group_id: options.groupId,
+      user_id: options.userId
+    }, options);
+  };
+
   /**
    * @param {Object} options
    * @param {Function} options.successCallback
@@ -349,17 +393,10 @@
    */
   AssistHelper.prototype.createDocumentsFolder = function (options) {
     var self = this;
-    $.post("/desktop/api2/doc/mkdir", {
+    self.simplePost("/desktop/api2/doc/mkdir", {
       parent_uuid: ko.mapping.toJSON(options.parentUuid),
       name: ko.mapping.toJSON(options.name)
-    }, function (data) {
-      if (! self.successResponseIsError(data)) {
-        options.successCallback(data);
-      } else {
-        self.assistErrorCallback(options)(data);
-      }
-    })
-    .fail(self.assistErrorCallback(options));
+    }, options);
   };
 
   /**
@@ -410,17 +447,10 @@
    */
   AssistHelper.prototype.moveDocument = function (options) {
     var self = this;
-    $.post("/desktop/api2/doc/move", {
+    self.simplePost("/desktop/api2/doc/move", {
       source_doc_uuid: ko.mapping.toJSON(options.sourceId),
       destination_doc_uuid: ko.mapping.toJSON(options.destinationId)
-    }, function (data) {
-      if (! self.successResponseIsError(data)) {
-        options.successCallback(data);
-      } else {
-        self.assistErrorCallback(options)(data);
-      }
-    })
-    .fail(self.assistErrorCallback(options));
+    }, options);
   };
 
   /**
@@ -434,17 +464,10 @@
    */
   AssistHelper.prototype.deleteDocument = function (options) {
     var self = this;
-    $.post("/desktop/api2/doc/delete", {
+    self.simplePost("/desktop/api2/doc/delete", {
       uuid: ko.mapping.toJSON(options.uuid),
       skip_trash: ko.mapping.toJSON(options.skipTrash || false)
-    }, function (data) {
-      if (! self.successResponseIsError(data)) {
-        options.successCallback(data);
-      } else {
-        self.assistErrorCallback(options)(data);
-      }
-    })
-    .fail(self.assistErrorCallback(options));
+    }, options);
   };
 
   /**

+ 8 - 0
desktop/libs/notebook/src/notebook/static/notebook/css/notebook.css

@@ -994,3 +994,11 @@ h4.header {
 .tooltip {
   z-index: 3000 !important;
 }
+
+.session-actions {
+  display: inline-block;
+  font-size: 13px;
+  margin-top: -3px;
+  margin-left: 15px;
+  vertical-align: text-top;
+}

+ 10 - 0
desktop/libs/notebook/src/notebook/static/notebook/js/notebook.ko.js

@@ -1248,6 +1248,15 @@
       }
     };
 
+    self.saveDefaultUserProperties = function (session) {
+      var assistHelper = AssistHelper.getInstance();
+      assistHelper.saveConfiguration({
+        app: session.type(),
+        properties: session.properties,
+        userId: vm.userId
+      });
+    };
+
     self.closeAndRemoveSession = function (session) {
       self.closeSession(session, false, function() {
         self.sessions.remove(session);
@@ -1396,6 +1405,7 @@
     var self = this;
     self.i18n = i18n;
     self.user = options.user;
+    self.userId = options.userId;
     self.selectedNotebook = ko.observable();
     self.combinedContent = ko.observable();
     self.isPlayerMode = ko.observable(false);

+ 20 - 20
desktop/libs/notebook/src/notebook/templates/editor_components.mako

@@ -1799,20 +1799,25 @@ ${ hueIcons.symbols() }
             <p>${ _('There are currently no active sessions.') }</p>
             <!-- /ko -->
             <!-- ko foreach: sessions -->
-              <h4 data-bind="text: $root.getSnippetName(type())" style="clear:left;"></h4>
-              <!-- ko if: type()== 'impala' && typeof properties != 'undefined' -->
-
-              <ul class="nav nav-list" style="border: none; padding: 0;">
-                <li class="nav-header">${ _('address')}</li>
-              </ul>
-              <div style="margin: 2px" data-bind="with: ko.utils.arrayFirst(properties(), function(item) { return item.key() == 'http_addr' });">
-                <a data-bind="attr: {'href': window.location.protocol + '//' + $data.value().replace(/^(https?):\/\//, '')}" target="_blank">
-                  <span data-bind="text: $data.value().replace(/^(https?):\/\//, '')"></span>
-                  <i class="fa fa-external-link"></i>
-                </a>
-              </div>
-              <!-- /ko -->
-              <div style="display:block; width:100%;">
+            <h4 data-bind="text: $root.getSnippetName(type())" style="clear:left; display: inline-block"></h4>
+            <div class="session-actions">
+              <a class="inactive-action pointer" title="${ _('Recreate session') }" rel="tooltip" data-bind="click: function() { $root.selectedNotebook().restartSession($data) }"><i class="fa fa-refresh" data-bind="css: { 'fa-spin': restarting }"></i> ${ _('Recreate') }</a>
+              <a class="inactive-action pointer margin-left-10" title="${ _('Close session') }" rel="tooltip" data-bind="click: function() { $root.selectedNotebook().closeAndRemoveSession($data) }"><i class="fa fa-times"></i> ${ _('Close') }</a>
+              <a class="inactive-action pointer margin-left-10" title="${ _('Save session settings as default') }" rel="tooltip" data-bind="click: function() { $root.selectedNotebook().saveDefaultUserProperties($data) }"><i class="fa fa-save"></i> ${ _('Set as default settings') }</a>
+            </div>
+            <!-- ko if: type()== 'impala' && typeof properties != 'undefined' -->
+
+            <ul class="nav nav-list" style="border: none; padding: 0;">
+              <li class="nav-header">${ _('address')}</li>
+            </ul>
+            <div style="margin: 2px" data-bind="with: ko.utils.arrayFirst(properties(), function(item) { return item.key() == 'http_addr' });">
+              <a data-bind="attr: {'href': window.location.protocol + '//' + $data.value().replace(/^(https?):\/\//, '')}" target="_blank">
+                <span data-bind="text: $data.value().replace(/^(https?):\/\//, '')"></span>
+                <i class="fa fa-external-link"></i>
+              </a>
+            </div>
+            <!-- /ko -->
+            <div style="width:100%;">
                 <!-- ko foreach: properties -->
                   <!-- ko template: {
                     name: 'property',
@@ -1840,12 +1845,6 @@ ${ hueIcons.symbols() }
                   <i class="fa fa-plus"></i>
                 </a>
                 <!-- /ko -->
-                <a style="float: right;" class="btn pointer" title="${ _('Recreate session') }" rel="tooltip" data-bind="click: function() { $root.selectedNotebook().restartSession($data) }">
-                  <i class="fa fa-refresh" data-bind="css: { 'fa-spin': restarting }"></i> ${ _('Recreate Session') }
-                </a>
-                <a style="margin-right: 5px; float: right;" class="btn pointer" title="${ _('Close session') }" rel="tooltip" data-bind="click: function() { $root.selectedNotebook().closeAndRemoveSession($data) }">
-                  <i class="fa fa-times"></i> ${ _('Close Session') }
-                </a>
               </div>
               <!-- /ko -->
             <!-- /ko -->
@@ -2464,6 +2463,7 @@ ${ hueIcons.symbols() }
 
     var VIEW_MODEL_OPTIONS = $.extend(${ options_json | n,unicode }, {
       user: '${ user.username }',
+      userId: ${ user.id },
       assistAvailable: true,
       snippetViewSettings: {
         default: {