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

HUE-3782 [editor] The shared permissions do not show up when sharing from list of query page

Johan Ahlen пре 9 година
родитељ
комит
4d3ab8a

+ 1 - 1
apps/oozie/src/oozie/static/oozie/js/workflow-editor.ko.js

@@ -1165,7 +1165,7 @@ var WorkflowEditorViewModel = function (layout_json, workflow_json, credentials_
             window.location.replace(data.url);
           }
           if (self.workflow.id() == null) {
-            shareViewModel.setDocId(data.doc1_id);
+            shareViewModel.setDocUuid(data.uuid);
           }
           self.workflow.id(data.id);
           $(document).trigger("info", data.message);

+ 2 - 2
apps/oozie/src/oozie/templates/editor2/bundle_editor.mako

@@ -217,7 +217,7 @@ ${ commonshare() | n,unicode }
 <script src="${ static('desktop/js/hue.utils.js') }"></script>
 <script src="${ static('desktop/js/ko.editable.js') }" type="text/javascript" charset="utf-8"></script>
 <script src="${ static('desktop/ext/chosen/chosen.jquery.min.js') }" type="text/javascript" charset="utf-8"></script>
-<script src="${ static('desktop/js/share.vm.js') }"></script>
+<script src="${ static('desktop/js/share2.vm.js') }"></script>
 
 ${ dashboard.import_bindings() }
 
@@ -234,7 +234,7 @@ ${ dashboard.import_bindings() }
   viewModel.bundle.tracker().markCurrentStateAsClean();
 
   var shareViewModel = initSharing("#documentShareModal");
-  shareViewModel.setDocId(${ doc1_id });
+  shareViewModel.setDocUuid('${ doc_uuid }');
 
   var tempCoordinator = null;
   function showChooseCoordinator(coord) {

+ 2 - 2
apps/oozie/src/oozie/templates/editor2/coordinator_editor.mako

@@ -526,7 +526,7 @@ ${ commonshare() | n,unicode }
 <script src="${ static('desktop/js/hue.utils.js') }"></script>
 <script src="${ static('desktop/js/ko.editable.js') }" type="text/javascript" charset="utf-8"></script>
 <script src="${ static('desktop/ext/chosen/chosen.jquery.min.js') }" type="text/javascript" charset="utf-8"></script>
-<script src="${ static('desktop/js/share.vm.js') }"></script>
+<script src="${ static('desktop/js/share2.vm.js') }"></script>
 
 ${ dashboard.import_bindings() }
 
@@ -631,7 +631,7 @@ ${ dashboard.import_bindings() }
 
 
   var shareViewModel = initSharing("#documentShareModal");
-  shareViewModel.setDocId(${ doc1_id });
+  shareViewModel.setDocUuid('${ doc_uuid }');
 
   function showChooseWorkflow() {
     $("#chooseWorkflowDemiModal").modal("show");

+ 3 - 3
apps/oozie/src/oozie/templates/editor2/list_editor_bundles.mako

@@ -143,7 +143,7 @@ ${ commonimportexport(request) | n,unicode }
 <script src="${ static('desktop/ext/js/knockout.min.js') }" type="text/javascript" charset="utf-8"></script>
 <script src="${ static('desktop/ext/js/knockout-mapping.min.js') }" type="text/javascript" charset="utf-8"></script>
 <script src="${ static('desktop/js/ko.hue-bindings.js') }" type="text/javascript" charset="utf-8"></script>
-<script src="${ static('desktop/js/share.vm.js') }"></script>
+<script src="${ static('desktop/js/share2.vm.js') }"></script>
 <script src="${ static('oozie/js/editor2-utils.js') }" type="text/javascript" charset="utf-8"></script>
 
 
@@ -227,7 +227,7 @@ ${ commonimportexport(request) | n,unicode }
     };
 
     self.prepareShareModal = function() {
-     shareViewModel.setDocId(self.selectedJobs()[0].doc1_id());
+     shareViewModel.setDocUuid(self.selectedJobs()[0].uuid());
       openShareModal();
     };
   }
@@ -240,7 +240,7 @@ ${ commonimportexport(request) | n,unicode }
     ko.applyBindings(viewModel, $("#editor")[0]);
 
     shareViewModel = initSharing("#documentShareModal");
-    shareViewModel.setDocId(-1);
+    shareViewModel.setDocUuid('');
 
     var oTable = $("#workflowTable").dataTable({
       "sPaginationType":"bootstrap",

+ 3 - 3
apps/oozie/src/oozie/templates/editor2/list_editor_coordinators.mako

@@ -143,7 +143,7 @@ ${ commonimportexport(request) | n,unicode }
 <script src="${ static('desktop/ext/js/knockout.min.js') }" type="text/javascript" charset="utf-8"></script>
 <script src="${ static('desktop/ext/js/knockout-mapping.min.js') }" type="text/javascript" charset="utf-8"></script>
 <script src="${ static('desktop/js/ko.hue-bindings.js') }" type="text/javascript" charset="utf-8"></script>
-<script src="${ static('desktop/js/share.vm.js') }"></script>
+<script src="${ static('desktop/js/share2.vm.js') }"></script>
 <script src="${ static('oozie/js/editor2-utils.js') }" type="text/javascript" charset="utf-8"></script>
 
 
@@ -225,7 +225,7 @@ ${ commonimportexport(request) | n,unicode }
     };
 
     self.prepareShareModal = function() {
-     shareViewModel.setDocId(self.selectedJobs()[0].doc1_id());
+     shareViewModel.setDocUuid(self.selectedJobs()[0].uuid());
       openShareModal();
     };
   }
@@ -238,7 +238,7 @@ ${ commonimportexport(request) | n,unicode }
     ko.applyBindings(viewModel, $("#editor")[0]);
 
     shareViewModel = initSharing("#documentShareModal");
-    shareViewModel.setDocId(-1);
+    shareViewModel.setDocUuid('');
 
     var oTable = $("#workflowTable").dataTable({
       "sPaginationType":"bootstrap",

+ 3 - 3
apps/oozie/src/oozie/templates/editor2/list_editor_workflows.mako

@@ -144,7 +144,7 @@ ${ commonimportexport(request) | n,unicode }
 <script src="${ static('desktop/ext/js/knockout.min.js') }" type="text/javascript" charset="utf-8"></script>
 <script src="${ static('desktop/ext/js/knockout-mapping.min.js') }" type="text/javascript" charset="utf-8"></script>
 <script src="${ static('desktop/js/ko.hue-bindings.js') }" type="text/javascript" charset="utf-8"></script>
-<script src="${ static('desktop/js/share.vm.js') }"></script>
+<script src="${ static('desktop/js/share2.vm.js') }"></script>
 <script src="${ static('oozie/js/editor2-utils.js') }" type="text/javascript" charset="utf-8"></script>
 
 
@@ -227,7 +227,7 @@ ${ commonimportexport(request) | n,unicode }
     };
 
     self.prepareShareModal = function() {
-      shareViewModel.setDocId(self.selectedJobs()[0].doc1_id());
+      shareViewModel.setDocUuid(self.selectedJobs()[0].uuid());
       openShareModal();
     };
   }
@@ -240,7 +240,7 @@ ${ commonimportexport(request) | n,unicode }
     ko.applyBindings(viewModel, $("#editor")[0]);
 
     shareViewModel = initSharing("#documentShareModal");
-    shareViewModel.setDocId(-1);
+    shareViewModel.setDocUuid('');
 
     var oTable = $("#workflowTable").dataTable({
       "sPaginationType":"bootstrap",

+ 2 - 2
apps/oozie/src/oozie/templates/editor2/workflow_editor.mako

@@ -444,7 +444,7 @@ ${ commonshare() | n,unicode }
 <script src="${ static('desktop/js/ko.editable.js') }" type="text/javascript" charset="utf-8"></script>
 <script src="${ static('desktop/ext/chosen/chosen.jquery.min.js') }" type="text/javascript" charset="utf-8"></script>
 <script src="${ static('desktop/ext/js/select2.full.min.js') }" type="text/javascript" charset="utf-8"></script>
-<script src="${ static('desktop/js/share.vm.js') }"></script>
+<script src="${ static('desktop/js/share2.vm.js') }"></script>
 <script src="${ static('desktop/js/jquery.hdfsautocomplete.js') }" type="text/javascript" charset="utf-8"></script>
 
 ${ dashboard.import_bindings() }
@@ -471,7 +471,7 @@ ${ dashboard.import_bindings() }
   ko.applyBindings(viewModel, $("#editor")[0]);
 
   var shareViewModel = initSharing("#documentShareModal");
-  shareViewModel.setDocId(${ doc1_id });
+  shareViewModel.setDocUuid('${ doc_uuid }');
 
   viewModel.init();
   viewModel.workflow.tracker().markCurrentStateAsClean();

+ 1 - 1
apps/oozie/src/oozie/views/dashboard.py

@@ -398,7 +398,7 @@ def list_oozie_workflow(request, job_id):
     'workflow_json': json.dumps(workflow_data['workflow'], cls=JSONEncoderForHTML) if workflow_data else '',
     'credentials_json': json.dumps(credentials.credentials.keys(), cls=JSONEncoderForHTML) if credentials else '',
     'workflow_properties_json': json.dumps(WORKFLOW_NODE_PROPERTIES, cls=JSONEncoderForHTML),
-    'doc1_id': doc.doc.get().id if doc else -1,
+    'doc_uuid': doc.uuid if doc else '',
     'subworkflows_json': json.dumps(_get_workflows(request.user), cls=JSONEncoderForHTML),
     'can_edit_json': json.dumps(doc is None or doc.doc.get().is_editable(request.user))
   })

+ 4 - 4
apps/oozie/src/oozie/views/editor2.py

@@ -113,7 +113,7 @@ def _edit_workflow(request, doc, workflow):
       'workflow_json': json.dumps(workflow_data['workflow'], cls=JSONEncoderForHTML),
       'credentials_json': json.dumps(credentials.credentials.keys(), cls=JSONEncoderForHTML),
       'workflow_properties_json': json.dumps(WORKFLOW_NODE_PROPERTIES, cls=JSONEncoderForHTML),
-      'doc1_id': doc.doc.get().id if doc else -1,
+      'doc_uuid': doc.uuid if doc else '',
       'subworkflows_json': json.dumps(_get_workflows(request.user), cls=JSONEncoderForHTML),
       'can_edit_json': json.dumps(doc is None or doc.doc.get().is_editable(request.user)),
       'history_json': json.dumps([{
@@ -245,7 +245,7 @@ def save_workflow(request):
 
   response['status'] = 0
   response['id'] = workflow_doc.id
-  response['doc1_id'] = workflow_doc1.id
+  response['doc_uuid'] = workflow_doc.uuid
   response['message'] = _('Page saved !')
 
   return JsonResponse(response)
@@ -514,7 +514,7 @@ def edit_coordinator(request):
       'coordinator_json': coordinator.to_json_for_html(),
       'credentials_json': json.dumps(credentials.credentials.keys(), cls=JSONEncoderForHTML),
       'workflows_json': json.dumps(workflows, cls=JSONEncoderForHTML),
-      'doc1_id': doc.doc.get().id if doc else -1,
+      'doc_uuid': doc.uuid if doc else '',
       'can_edit_json': json.dumps(doc is None or doc.doc.get().is_editable(request.user))
   })
 
@@ -712,7 +712,7 @@ def edit_bundle(request):
   return render('editor2/bundle_editor.mako', request, {
       'bundle_json': bundle.to_json_for_html(),
       'coordinators_json': json.dumps(coordinators, cls=JSONEncoderForHTML),
-      'doc1_id': doc.doc.get().id if doc else -1,
+      'doc_uuid': doc.uuid if doc else '',
       'can_edit_json': json.dumps(doc is None or doc.doc.get().is_editable(request.user))
   })
 

+ 1 - 1
apps/search/src/search/static/search/js/collections.ko.js

@@ -35,7 +35,7 @@ var Collection = function (coll) {
   self.absoluteUrl = ko.observable(coll.absoluteUrl);
   self.owner = ko.observable(coll.owner);
   self.isOwner = ko.observable(coll.isOwner);
-  self.doc1_id = ko.observable(coll.doc1_id);
+  self.uuid = ko.observable(coll.uuid);
 
   self.selected = ko.observable(false);
   self.hovered = ko.observable(false);

+ 3 - 3
apps/search/src/search/templates/admin_collections.mako

@@ -159,7 +159,7 @@ ${ commonimportexport(request) | n,unicode }
 <script src="${ static('desktop/ext/js/knockout.min.js') }" type="text/javascript" charset="utf-8"></script>
 <script src="${ static('desktop/ext/js/knockout-mapping.min.js') }" type="text/javascript" charset="utf-8"></script>
 <script src="${ static('search/js/collections.ko.js') }" type="text/javascript" charset="utf-8"></script>
-<script src="${ static('desktop/js/share.vm.js') }"></script>
+<script src="${ static('desktop/js/share2.vm.js') }"></script>
 
 
 <script>
@@ -175,7 +175,7 @@ ${ commonimportexport(request) | n,unicode }
   ko.applyBindings(viewModel, $("#editor")[0]);
 
   shareViewModel = initSharing("#documentShareModal");
-  shareViewModel.setDocId(-1);
+  shareViewModel.setDocUuid('');
 
   $(document).ready(function () {
     viewModel.updateCollections();
@@ -227,7 +227,7 @@ ${ commonimportexport(request) | n,unicode }
     };
 
     prepareShareModal = function() {
-      shareViewModel.setDocId(viewModel.selectedCollections()[0].doc1_id());
+      shareViewModel.setDocUuid(viewModel.selectedCollections()[0].uuid());
       openShareModal();
     };
   });

+ 277 - 0
desktop/core/src/desktop/static/desktop/js/share2.vm.js

@@ -0,0 +1,277 @@
+// Licensed to Cloudera, Inc. under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  Cloudera, Inc. licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//     http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+
+var shareViewModel;
+
+function ShareViewModel(updateDocF) {
+  var self = this;
+
+  self.hasInitBeenCalled = false;
+  self.hasSetupBeenCalled = false;
+
+  self.selectedPerm = ko.observable('read');
+  self.selectedPermLabel = ko.computed(function() {
+    if (self.selectedPerm() == 'write') {
+      return 'Modify';
+    } else {
+      return 'Read';
+    }
+  });
+
+  self.selectedDoc = ko.observable(ko.mapping.fromJS({
+    perms: {
+      read: {
+        users: [],
+        groups: []
+      },
+      write: {
+        users: [],
+        groups: []
+      }
+    }
+  }))
+
+  self.updateDoc = updateDocF
+
+  self.docUuid;
+
+  self.setDocUuid = function(docUuid) {
+    if (docUuid === '') { return false; }
+    self.docUuid = docUuid;
+    $.get('/desktop/api2/doc', { uuid : docUuid }, function (data) {
+      shareViewModel.selectedDoc(data.document)
+    }).fail(function (response) {
+      $(document).trigger("error", "There was an error processing your action: " + response.responseText);
+    });
+  }
+}
+
+
+function openShareModal() {
+  $("#documentShareModal").modal("show");
+  setupSharing(function(){
+    $("#documentShareAddBtn").removeClass("disabled");
+    $("#documentShareCaret").removeClass("disabled");
+    $("#documentShareTypeahead").removeAttr("disabled");
+    $(".notpretty").each(function(){
+      $(this).text(prettifyUsername($(this).attr("data-id")));
+    });
+  });
+}
+
+function isShared() {
+  if (!shareViewModel) { return false; }
+  read = shareViewModel.selectedDoc().perms.read;
+  return read.users.length + read.groups.length > 0
+}
+
+function prettifyUsername(userId) {
+  var _user = null;
+  if (self.hasSetupBeenCalled) {
+    for (var i = 0; i < JSON_USERS_GROUPS.users.length; i++) {
+      if (JSON_USERS_GROUPS.users[i].id == userId) {
+        _user = JSON_USERS_GROUPS.users[i];
+      }
+    }
+    if (_user != null) {
+      return (_user.first_name != "" ? _user.first_name + " " : "") + (_user.last_name != "" ? _user.last_name + " " : "") + ((_user.first_name != "" || _user.last_name != "") ? "(" : "") + _user.username + ((_user.first_name != "" || _user.last_name != "") ? ")" : "");
+    }
+  }
+  return "";
+}
+
+function initSharing(id, updateFunc) {
+  if(! updateFunc) {
+    updateFunc = function () {}
+  }
+  shareViewModel = new ShareViewModel(updateFunc);
+  ko.applyBindings(shareViewModel, $(id)[0]);
+  shareViewModel.hasInitBeenCalled = true;
+  return shareViewModel;
+}
+
+function setupSharing(id, updateFunc) {
+  if (shareViewModel == null || !shareViewModel.hasInitBeenCalled) {
+    shareViewModel = initSharing(id, updateFunc);
+  }
+
+  if (! self.hasSetupBeenCalled){
+    $.getJSON('/desktop/api/users/autocomplete', function (data) {
+      self.hasSetupBeenCalled = true;
+      JSON_USERS_GROUPS = data;
+      dropdown = [];
+      usermap = {};
+      groupmap = {};
+
+      $.each(JSON_USERS_GROUPS.users, function (i, user) {
+        var _display = prettifyUsername(user.id);
+        usermap[_display] = user;
+        dropdown.push(_display);
+      });
+
+      $.each(JSON_USERS_GROUPS.groups, function (i, group) {
+        groupmap[group.name] = group;
+        dropdown.push(group.name);
+      });
+
+      $("#documentShareTypeahead").typeahead({
+        source: function (query, process) {
+          process(dropdown);
+        },
+        matcher: function (item) {
+          if (item.toLowerCase().indexOf(this.query.trim().toLowerCase()) != -1) {
+            return true;
+          }
+        },
+        sorter: function (items) {
+          return items.sort();
+        },
+        highlighter: function (item) {
+          var _icon = "fa";
+          if (usermap[item]) {
+            _icon += " fa-user";
+          }
+          else {
+            _icon += " fa-users";
+          }
+          var regex = new RegExp('(' + this.query + ')', 'gi');
+          return "<i class='" + _icon + "'></i> " + item.replace(regex, "<strong>$1</strong>");
+        },
+        updater: function (item) {
+          selectedUserOrGroup = usermap[item] ? usermap[item] : groupmap[item];
+          return item;
+        }
+      });
+
+      $("#documentShareTypeahead").on("keyup", function (e) {
+        var _code = (e.keyCode ? e.keyCode : e.which);
+        if (_code == 13) {
+          handleTypeaheadSelection();
+        }
+      });
+
+      if (typeof id == "function"){
+        id();
+      }
+    }).fail(function (response) {
+      $(document).trigger("error", "There was an error processing your action: " + response.responseText);
+    });
+
+    $("#documentShareAddBtn").on("click", function () {
+      if (! $(this).hasClass("disabled")){
+        handleTypeaheadSelection();  
+      }
+    });
+  }
+  else {
+    if (typeof id == "function"){
+      id();
+    }
+  }
+
+  return shareViewModel;
+}
+
+function updateSharePerm(perms, user) {
+  $(perms).each(function (cnt, item) {
+    if (item.id == user.id) {
+      perms.splice(cnt, 1);
+    }
+  });
+  shareViewModel.selectedDoc.valueHasMutated();
+  shareDocFinal();
+}
+
+function removeUserReadShare(user) {
+  updateSharePerm(shareViewModel.selectedDoc().perms.read.users, user);
+}
+
+function removeUserWriteShare(user) {
+  updateSharePerm(shareViewModel.selectedDoc().perms.write.users, user);
+}
+
+function removeGroupReadShare(group) {
+  updateSharePerm(shareViewModel.selectedDoc().perms.read.groups, group);
+}
+
+function removeGroupWriteShare(group) {
+  updateSharePerm(shareViewModel.selectedDoc().perms.write.groups, group);
+}
+
+function changeDocumentSharePerm(perm) {
+  shareViewModel.selectedPerm(perm);
+}
+
+function handleTypeaheadSelection() {
+  if (selectedUserOrGroup != null) {
+    if (selectedUserOrGroup.hasOwnProperty("username")) {
+      shareViewModel.selectedDoc().perms[shareViewModel.selectedPerm()].users.push(selectedUserOrGroup);
+    }
+    else {
+      shareViewModel.selectedDoc().perms[shareViewModel.selectedPerm()].groups.push(selectedUserOrGroup);
+    }
+    shareViewModel.selectedDoc.valueHasMutated();
+    shareDocFinal();
+  }
+  selectedUserOrGroup = null;
+  $("#documentShareTypeahead").val("");
+}
+
+function shareDocFinal() {
+  var _postPerms = {
+    read: {
+      user_ids: [],
+      group_ids: []
+    },
+    write: {
+      user_ids: [],
+      group_ids: []
+    }
+  }
+
+  $(shareViewModel.selectedDoc().perms.read.users).each(function (cnt, item) {
+    _postPerms.read.user_ids.push(item.id);
+  });
+
+  $(shareViewModel.selectedDoc().perms.read.groups).each(function (cnt, item) {
+    _postPerms.read.group_ids.push(item.id);
+  });
+
+  $(shareViewModel.selectedDoc().perms.write.users).each(function (cnt, item) {
+    _postPerms.write.user_ids.push(item.id);
+  });
+
+  $(shareViewModel.selectedDoc().perms.write.groups).each(function (cnt, item) {
+    _postPerms.write.group_ids.push(item.id);
+  });
+
+  $.post("/desktop/api2/doc/share", {
+    uuid: JSON.stringify(shareViewModel.docUuid),
+    data: JSON.stringify(_postPerms)
+  }, function (response) {
+    if (response != null) {
+      if (response.status != 0) {
+        $(document).trigger("error", "There was an error processing your action: " + response.message);
+      }
+      else {
+        shareViewModel.updateDoc(response.doc);
+      }
+    }
+  }).fail(function (response) {
+    $(document).trigger("error", "There was an error processing your action: " + response.responseText);
+  });
+}

+ 3 - 3
desktop/libs/notebook/src/notebook/templates/notebooks.mako

@@ -178,7 +178,7 @@ ${ commonshare() | n,unicode }
 <script src="${ static('desktop/ext/js/knockout.min.js') }" type="text/javascript" charset="utf-8"></script>
 <script src="${ static('desktop/ext/js/knockout-mapping.min.js') }" type="text/javascript" charset="utf-8"></script>
 <script src="${ static('desktop/js/ko.hue-bindings.js') }" type="text/javascript" charset="utf-8"></script>
-<script src="${ static('desktop/js/share.vm.js') }"></script>
+<script src="${ static('desktop/js/share2.vm.js') }"></script>
 
 <script type="text/javascript" charset="utf-8">
   var Editor = function () {
@@ -238,7 +238,7 @@ ${ commonshare() | n,unicode }
     };
 
     self.prepareShareModal = function() {
-      shareViewModel.setDocId(self.selectedJobs()[0].doc1_id());
+      shareViewModel.setDocUuid(self.selectedJobs()[0].uuid());
       openShareModal();
     };
   }
@@ -251,7 +251,7 @@ ${ commonshare() | n,unicode }
     ko.applyBindings(viewModel, $("#editor")[0]);
 
     shareViewModel = initSharing("#documentShareModal");
-    shareViewModel.setDocId(-1);
+    shareViewModel.setDocUuid('');
 
     $(document).on("showSubmitPopup", function(event, data){
       $('#submit-notebook-modal').html(data);