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

[oozie] Enable drag to copy of nodes

Enrico Berti 11 жил өмнө
parent
commit
888448b

+ 12 - 5
apps/oozie/src/oozie/templates/editor/workflow_editor.mako

@@ -224,7 +224,7 @@ ${ commonheader(_("Workflow Editor"), "Oozie", user) | n,unicode }
 
     <div class="container-fluid" data-bind="visible: $root.isEditing() && oozieRows().length > 0">
       <div data-bind="visible: ! enableOozieDropOnBefore(), css: {'drop-target drop-target-disabled': true, 'is-editing': $root.isEditing}"></div>
-      <div data-bind="visible: enableOozieDropOnBefore, css: {'drop-target': true, 'is-editing': $root.isEditing}, droppable: {enabled: $root.isEditing, onDrop: function(){ var _w = $root.addDraggedWidget($data, true); widgetDraggedAdditionalHandler(_w); } }"></div>
+      <div data-bind="visible: enableOozieDropOnBefore, css: {'drop-target': true, 'is-editing': $root.isEditing}, droppable: {enabled: $root.isEditing, onDrop: function(x, y){ var _w = $root.addDraggedWidget($data, true); widgetDraggedAdditionalHandler(_w); } }"></div>
     </div>
     <div data-bind="template: { name: 'internal-row-template', foreach: oozieRows}">
     </div>
@@ -260,7 +260,7 @@ ${ commonheader(_("Workflow Editor"), "Oozie", user) | n,unicode }
       <div class="span12">
         <div data-bind="css: {'row-fluid': true, 'row-container':true, 'is-editing': $root.isEditing},
           sortable: { template: 'widget-template', data: widgets, allowDrop: $root.isEditing() && widgets().length < 1, isEnabled: $root.isEditing() && widgets().length < 1,
-          options: {'handle': '.move-widget', 'opacity': 0.7, 'placeholder': 'row-highlight', 'greedy': true,
+          options: {'opacity': 0.7, 'placeholder': 'row-highlight', 'greedy': true,
               'stop': function(event, ui){},
               'helper': function(event){lastWindowScrollPosition = $(window).scrollTop();  var _par = $('<div>');_par.addClass('card card-widget');var _title = $('<h2>');_title.addClass('card-heading simple');_title.text($(event.toElement).text());_title.appendTo(_par);_par.height(80);_par.width(180);return _par;}},
               dragged: function(widget){widgetDraggedAdditionalHandler(widget)}}">
@@ -287,7 +287,7 @@ ${ commonheader(_("Workflow Editor"), "Oozie", user) | n,unicode }
       <div  data-bind="css: {'span10': true, 'readonly': ! $root.isEditing()}">
         <div data-bind="visible: columns().length == 0, css: {'row-fluid': true, 'row-container':true, 'is-editing': $root.isEditing},
           sortable: { template: 'widget-template', data: widgets, allowDrop: enableOozieDrop, isEnabled: enableOozieDrop,
-          options: {'handle': '.move-widget', 'opacity': 0.7, 'placeholder': 'row-highlight', 'greedy': true,
+          options: {'opacity': 0.7, 'placeholder': 'row-highlight', 'greedy': true,
               'stop': function(event, ui){},
               'helper': function(event){lastWindowScrollPosition = $(window).scrollTop();  var _par = $('<div>');_par.addClass('card card-widget');var _title = $('<h2>');_title.addClass('card-heading simple');_title.text($(event.toElement).text());_title.appendTo(_par);_par.height(80);_par.width(180);return _par;}},
               dragged: function(widget){widgetDraggedAdditionalHandler(widget)}}">
@@ -308,11 +308,13 @@ ${ commonheader(_("Workflow Editor"), "Oozie", user) | n,unicode }
 </script>
 
 <script type="text/html" id="widget-template">
-  <div data-bind="attr: {'id': 'wdg_'+ id(),}, css: klass, draggable: {data: $data, isEnabled: true, options: {'handle': '.move-widget', 'opacity': 0.7, 'refreshPositions': true, 'start': function(event, ui){ $root.currentlyDraggedWidget($data); }, 'stop': function(event, ui){ $root.enableSideDrop($data); }, 'helper': function(event){lastWindowScrollPosition = $(window).scrollTop();  var _par = $('<div>');_par.addClass('card card-widget');var _title = $('<h2>');_title.addClass('card-heading simple');_title.text($(event.toElement).text());_title.appendTo(_par);_par.height(80);_par.width(180);return _par;}}}">
+  <div data-bind="attr: {'id': 'wdg_'+ id(),}, css: klass, draggable: {data: $data, isEnabled: true, options: {'handle': '.move-widget', 'opacity': 0.7, 'refreshPositions': true, 'start': function(event, ui){ $root.setCurrentlyDraggedWidget($data, event.toElement); }, 'stop': function(event, ui){ $root.enableSideDrop($data); }, 'helper': function(event){lastWindowScrollPosition = $(window).scrollTop();  var _par = $('<div>');_par.addClass('card card-widget');var _title = $('<h2>');_title.addClass('card-heading simple');_title.text($(event.toElement).text());_title.appendTo(_par);_par.height(80);_par.width(180);return _par;}}}">
     <h2 class="card-heading simple">
       <span data-bind="visible: $root.isEditing() && oozieMovable()">
         <a href="javascript:void(0)" class="move-widget"><i class="fa fa-arrows"></i></a>
         &nbsp;
+        <a href="javascript:void(0)" class="move-widget clone-widget"><i class="fa fa-copy"></i></a>
+        &nbsp;
       </span>
       <!-- ko if: $root.collection && $root.collection.getFacetById(id()) -->
       <span data-bind="with: $root.collection.getFacetById(id())">
@@ -1179,7 +1181,12 @@ ${ dashboard.import_bindings() }
       showAddActionDemiModal(widget);
     }
     else {
-      viewModel.workflow.moveNode(widget);
+      if (viewModel.currentlyDraggedOp() == "move"){
+        viewModel.workflow.moveNode(widget);
+      }
+      else {
+        viewModel.workflow.newNode(widget, viewModel.workflow.addNode);
+      }
       $(document).trigger("drawArrows");
     }
   }

+ 21 - 12
apps/oozie/static/js/workflow-editor.ko.js

@@ -179,7 +179,7 @@ var Workflow = function (vm, workflow) {
     self.nodes(nodes)
   }
 
-  self.newNode = function(widget) {
+  self.newNode = function(widget, callback) {
     $.ajax({
       type: "POST",
       url: "/oozie/editor/workflow/new_node/",
@@ -191,6 +191,9 @@ var Workflow = function (vm, workflow) {
         if (data.status == 0) {
           viewModel.addActionProperties(data.properties);
           viewModel.addActionWorkflows(data.workflows);
+          if (callback){
+            callback(widget);
+          }
         }
       },
       async: false
@@ -408,16 +411,22 @@ var WorkflowEditorViewModel = function (layout_json, workflow_json, credentials_
 
 
   self.currentlyDraggedWidget = ko.observable(null);
+  self.currentlyDraggedOp = ko.observable("move");
   self.currentlyDraggedWidget.subscribe(function (widget) {
     toggleSideDrop(widget, false);
   });
 
+  self.setCurrentlyDraggedWidget = function (widget, op) {
+    self.currentlyDraggedOp($(op).hasClass("fa-copy") ? "copy" : "move");
+    self.currentlyDraggedWidget(widget);
+  }
+
   self.enableSideDrop = function (widget) {
     toggleSideDrop(widget, true);
   }
 
   function toggleSideDrop(widget, enable) {
-    if (widget != null && widget.id() != "") {
+    if (widget != null && widget.id() != "" && self.currentlyDraggedOp() == "move") {
       var _row = self.getWidgetParentRow(widget.id());
       if (_row) {
         _row.enableOozieDropOnSide(enable);
@@ -483,17 +492,17 @@ var WorkflowEditorViewModel = function (layout_json, workflow_json, credentials_
       }
 
       var _w = new Widget({
-          size: self.currentlyDraggedWidget().size(),
-          id: UUID(),
-          name: self.currentlyDraggedWidget().name(),
-          widgetType: self.currentlyDraggedWidget().widgetType(),
-          properties: self.currentlyDraggedWidget().properties(),
-          offset: self.currentlyDraggedWidget().offset(),
-          loading: true,
-          vm: self
-        });
+        size: self.currentlyDraggedWidget().size(),
+        id: UUID(),
+        name: self.currentlyDraggedWidget().name(),
+        widgetType: self.currentlyDraggedWidget().widgetType(),
+        properties: self.currentlyDraggedWidget().properties(),
+        offset: self.currentlyDraggedWidget().offset(),
+        loading: true,
+        vm: self
+      });
 
-      if (self.currentlyDraggedWidget().id() != ""){
+      if (self.currentlyDraggedWidget().id() != "" && self.currentlyDraggedOp() == "move"){
         self.removeWidgetById(self.currentlyDraggedWidget().id());
         _w = self.currentlyDraggedWidget();
       }