Przeglądaj źródła

HUE-889 [oozie] Smarter file chooser in Workflow editor

jHueFileChooser defaults to workflow workspace if path is invalid or empty
Support for relative paths
Added onError and errorRedirectPath to jHueFileChooser
Added jHueFileChooser to Job XML on edit workflow action
Enrico Berti 13 lat temu
rodzic
commit
8c3abcd

+ 2 - 2
apps/oozie/src/oozie/templates/editor/edit_workflow.mako

@@ -301,8 +301,8 @@ modal-window .modal-content {
       });
       });
     });
     });
 
 
-     ko.applyBindings(window.viewModelparameters, $("#parameters")[0]);
-     ko.applyBindings(window.viewModeljob_properties, $("#job_properties")[0]);
+    ko.applyBindings(window.viewModelparameters, $("#parameters")[0]);
+    ko.applyBindings(window.viewModeljob_properties, $("#job_properties")[0]);
 
 
     $('#jobForm').submit(function() {
     $('#jobForm').submit(function() {
       window.viewModelparameters.pre_submit();
       window.viewModelparameters.pre_submit();

+ 37 - 22
apps/oozie/src/oozie/templates/editor/edit_workflow_action.mako

@@ -90,7 +90,7 @@ ${ layout.menubar(section='workflows') }
                     <span class="span4 required" data-bind="text: type" />
                     <span class="span4 required" data-bind="text: type" />
                   </td>
                   </td>
                   <td>
                   <td>
-                    <input type="text" class="input span4 required" data-bind="fileChooser: $data, value: value, uniqueName: false" />
+                    <input type="text" class="input span4 required pathChooser" data-bind="fileChooser: $data, value: value, uniqueName: false" />
                   </td>
                   </td>
                   <td><a class="btn" href="#" data-bind="click: $root.removePrepare">${ _('Delete') }</a></td>
                   <td><a class="btn" href="#" data-bind="click: $root.removePrepare">${ _('Delete') }</a></td>
                 </tr>
                 </tr>
@@ -128,7 +128,7 @@ ${ layout.menubar(section='workflows') }
                     <span class="span4 required" data-bind="text: type" />
                     <span class="span4 required" data-bind="text: type" />
                   </td>
                   </td>
                   <td>
                   <td>
-                    <input type="text" class="input span4 required" data-bind="fileChooser: $data, value: value, uniqueName: false" />
+                    <input type="text" class="input span4 required pathChooser" data-bind="fileChooser: $data, value: value, uniqueName: false" />
                   </td>
                   </td>
                   <td><a class="btn" href="#" data-bind="click: $root.removeParam">${ _('Delete') }</a></td>
                   <td><a class="btn" href="#" data-bind="click: $root.removeParam">${ _('Delete') }</a></td>
                 </tr>
                 </tr>
@@ -173,7 +173,7 @@ ${ layout.menubar(section='workflows') }
             <tbody data-bind="foreach: properties">
             <tbody data-bind="foreach: properties">
               <tr>
               <tr>
                 <td><input type="text" class="span4 required propKey" data-bind="value: name, uniqueName: false" /></td>
                 <td><input type="text" class="span4 required propKey" data-bind="value: name, uniqueName: false" /></td>
-                <td><input type="text" class="span4 required" data-bind="fileChooser: $data, value: value, uniqueName: false" /></td>
+                <td><input type="text" class="span4 required pathChooser" data-bind="fileChooser: $data, value: value, uniqueName: false" /></td>
                 <td><a class="btn" href="#" data-bind="click: $root.removeProp">${ _('Delete') }</a></td>
                 <td><a class="btn" href="#" data-bind="click: $root.removeProp">${ _('Delete') }</a></td>
               </tr>
               </tr>
             </tbody>
             </tbody>
@@ -199,7 +199,7 @@ ${ layout.menubar(section='workflows') }
               <table class="table-condensed designTable" data-bind="visible: files().length > 0">
               <table class="table-condensed designTable" data-bind="visible: files().length > 0">
                 <tbody data-bind="foreach: files">
                 <tbody data-bind="foreach: files">
                   <tr>
                   <tr>
-                    <td><input type="text" class="span5 required"
+                    <td><input type="text" class="span5 required pathChooser"
                             data-bind="fileChooser: $data, value: name, uniqueName: false" />
                             data-bind="fileChooser: $data, value: name, uniqueName: false" />
                     </td>
                     </td>
                     <td><a class="btn" href="#" data-bind="click: $root.removeFile">${ _('Delete') }</a></td>
                     <td><a class="btn" href="#" data-bind="click: $root.removeFile">${ _('Delete') }</a></td>
@@ -226,7 +226,7 @@ ${ layout.menubar(section='workflows') }
             <tbody data-bind="foreach: archives">
             <tbody data-bind="foreach: archives">
               <tr>
               <tr>
                 <td>
                 <td>
-                  <input type="text" class="span5 required"
+                  <input type="text" class="span5 required pathChooser"
                       data-bind="fileChooser: $data, value: name, uniqueName: false" />
                       data-bind="fileChooser: $data, value: name, uniqueName: false" />
                 </td>
                 </td>
                 <td><a class="btn" href="#" data-bind="click: $root.removeArchive">${ _('Delete') }</a></td>
                 <td><a class="btn" href="#" data-bind="click: $root.removeArchive">${ _('Delete') }</a></td>
@@ -273,16 +273,11 @@ ${ layout.menubar(section='workflows') }
   <div class="modal-footer"></div>
   <div class="modal-footer"></div>
 </div>
 </div>
 
 
-
 <link rel="stylesheet" href="/static/ext/css/jquery-ui-autocomplete-1.8.18.css" type="text/css" media="screen" title="no title" charset="utf-8" />
 <link rel="stylesheet" href="/static/ext/css/jquery-ui-autocomplete-1.8.18.css" type="text/css" media="screen" title="no title" charset="utf-8" />
 <script src="/static/ext/js/knockout-2.1.0.js" type="text/javascript" charset="utf-8"></script>
 <script src="/static/ext/js/knockout-2.1.0.js" type="text/javascript" charset="utf-8"></script>
 <script src="/static/ext/js/jquery/plugins/jquery-ui-autocomplete-1.8.18.min.js" type="text/javascript" charset="utf-8"></script>
 <script src="/static/ext/js/jquery/plugins/jquery-ui-autocomplete-1.8.18.min.js" type="text/javascript" charset="utf-8"></script>
 
 
 <style>
 <style>
-  td.pathChooserKo {
-    min-width: 404px;
-  }
-
   #fileChooserModal {
   #fileChooserModal {
     padding:14px;
     padding:14px;
     height:270px;
     height:270px;
@@ -455,25 +450,45 @@ ${ layout.menubar(section='workflows') }
 
 
     ko.applyBindings(viewModel);
     ko.applyBindings(viewModel);
 
 
-    $(".pathChooser").each(function(){
-      var self = $(this);
-      self.after(getFileBrowseButton(self));
-    });
+    $("input[name='job_xml']").addClass("pathChooser").after(getFileBrowseButton($("input[name='job_xml']")));
 
 
     function getFileBrowseButton(inputElement) {
     function getFileBrowseButton(inputElement) {
       return $("<button>").addClass("btn").addClass("fileChooserBtn").text("..").click(function(e){
       return $("<button>").addClass("btn").addClass("fileChooserBtn").text("..").click(function(e){
         e.preventDefault();
         e.preventDefault();
-        $("#fileChooserModal").jHueFileChooser({
-          onFileChoose: function(filePath) {
+        // check if it's a relative path
+        var pathAddition = "";
+        if ($.trim(inputElement.val()) != ""){
+          $.getJSON("/filebrowser/chooser${ workflow.deployment_dir }" + inputElement.val(), function (data) {
+            pathAddition = "${ workflow.deployment_dir }";
+            callFileChooser();
+          }).error(function(){
+            callFileChooser();
+          });
+        }
+        else {
+          callFileChooser();
+        }
+
+        function callFileChooser() {
+          $("#fileChooserModal").jHueFileChooser({
+            onFileChoose: function(filePath) {
+              if (filePath.indexOf("${ workflow.deployment_dir }") > -1){
+                filePath = filePath.substring("${ workflow.deployment_dir }".length);
+                if (filePath == ""){
+                  filePath = "/";
+                }
+              }
               inputElement.val(filePath);
               inputElement.val(filePath);
               inputElement.change();
               inputElement.change();
               $("#chooseFile").modal("hide");
               $("#chooseFile").modal("hide");
-          },
-          createFolder: false,
-          initialPath: "${ workflow.deployment_dir }"
-        });
-        $("#chooseFile").modal("show");
-      })
+            },
+            createFolder: false,
+            initialPath: $.trim(inputElement.val()) != "" ? pathAddition + inputElement.val() : "${ workflow.deployment_dir }",
+            errorRedirectPath: "${ workflow.deployment_dir }"
+          });
+          $("#chooseFile").modal("show");
+        }
+      });
     }
     }
 
 
     $(".propKey").each(addAutoComplete);
     $(".propKey").each(addAutoComplete);

+ 37 - 13
apps/oozie/src/oozie/templates/utils.inc.mako

@@ -214,22 +214,46 @@
       function getFileBrowseButton(inputElement) {
       function getFileBrowseButton(inputElement) {
         return $("<button>").addClass("btn").addClass("fileChooserBtn").text("..").click(function(e){
         return $("<button>").addClass("btn").addClass("fileChooserBtn").text("..").click(function(e){
           e.preventDefault();
           e.preventDefault();
-          $("#fileChooserModal").jHueFileChooser({
-            % if select_folder:
+          // check if it's a relative path
+          var pathAddition = "";
+          if ($.trim(inputElement.val()) != ""){
+            $.getJSON("/filebrowser/chooser${ workflow.deployment_dir }" + inputElement.val(), function (data) {
+              pathAddition = "${ workflow.deployment_dir }";
+              callFileChooser();
+            }).error(function(){
+              callFileChooser();
+            });
+          }
+          else {
+            callFileChooser();
+          }
+
+          function callFileChooser() {
+            $("#fileChooserModal").jHueFileChooser({
+              % if select_folder:
               selectFolder: true,
               selectFolder: true,
               onFolderChoose: function(filePath) {
               onFolderChoose: function(filePath) {
-            % else:
+              % else:
               onFileChoose: function(filePath) {
               onFileChoose: function(filePath) {
-            % endif
-              inputElement.val(filePath);
-              $("#chooseFile").modal("hide");
-            },
-            createFolder: true,
-            uploadFile: false,
-            initialPath: inputElement.val()
-          });
-          $("#chooseFile").modal("show");
-        })
+              % endif
+                if (filePath.indexOf("${ workflow.deployment_dir }") > -1){
+                  filePath = filePath.substring("${ workflow.deployment_dir }".length);
+                  if (filePath == ""){
+                    filePath = "/";
+                  }
+                }
+                inputElement.val(filePath);
+                inputElement.change();
+                $("#chooseFile").modal("hide");
+              },
+              createFolder: false,
+              uploadFile: false,
+              initialPath: $.trim(inputElement.val()) != "" ? pathAddition + inputElement.val() : "${ workflow.deployment_dir }",
+              errorRedirectPath: "${ workflow.deployment_dir }"
+            });
+            $("#chooseFile").modal("show");
+          }
+        });
       }
       }
     });
     });
   </script>
   </script>

+ 5 - 1
desktop/core/static/js/Source/jHue/jquery.filechooser.js

@@ -9,6 +9,7 @@
         // desktop/templates/common_header.mako
         // desktop/templates/common_header.mako
         defaults = {
         defaults = {
             initialPath:"",
             initialPath:"",
+            errorRedirectPath:"",
             createFolder:true,
             createFolder:true,
             uploadFile:true,
             uploadFile:true,
             selectFolder:false,
             selectFolder:false,
@@ -27,6 +28,8 @@
             onFolderChoose:function () {
             onFolderChoose:function () {
             },
             },
             onFolderChange:function () {
             onFolderChange:function () {
+            },
+            onError:function () {
             }
             }
         };
         };
 
 
@@ -216,7 +219,8 @@
                 }
                 }
             }
             }
         }).error(function(){
         }).error(function(){
-            _parent.navigateTo("/?default_to_home");
+            _parent.options.onError();
+            _parent.navigateTo(_parent.options.errorRedirectPath != "" ? _parent.options.errorRedirectPath : "/?default_to_home");
             if ($.jHueNotify) {
             if ($.jHueNotify) {
                 $.jHueNotify.info(_parent.options.labels.FILE_NOT_FOUND);
                 $.jHueNotify.info(_parent.options.labels.FILE_NOT_FOUND);
             }
             }