Pārlūkot izejas kodu

HUE-997 [oozie] Notification internationalization in workflow editor.

abec 13 gadi atpakaļ
vecāks
revīzija
9663116c59

+ 47 - 45
apps/oozie/src/oozie/templates/editor/edit_workflow.mako

@@ -182,7 +182,7 @@ ${ layout.menubar(section='workflows') }
           </div>
         </div>
         <div class="form-actions center">
-          <a data-bind="disable: workflow.read_only, visible: !workflow.read_only(), click: function() { save() }" href="javascript:void(0);" class="btn btn-primary">${ _('Save') }</a>
+          <a data-bind="disable: workflow.read_only, visible: !workflow.read_only(), click: function() { save({ success: workflow_save_success, error: workflow_save_error }) }" href="javascript:void(0);" class="btn btn-primary">${ _('Save') }</a>
           <a href="${ url('oozie:list_workflows') }" class="btn">${ _('Back') }</a>
         </div>
       </div>
@@ -235,7 +235,7 @@ ${ layout.menubar(section='workflows') }
         </div>
         <div class="form-actions center">
           % if user_can_edit_job:
-            <button data-bind="disable: workflow.read_only, visible: !workflow.read_only(), click: function() { save() }" class="btn btn-primary">${ _('Save') }</button>
+            <button data-bind="disable: workflow.read_only, visible: !workflow.read_only(), click: function() { save({ success: workflow_save_success, error: workflow_save_error }) }" class="btn btn-primary">${ _('Save') }</button>
           % endif
           <a href="${ url('oozie:list_workflows') }" class="btn">${ _('Back') }</a>
         </div>
@@ -445,43 +445,41 @@ ${ controls.decision_form(link_form, default_link_form, 'decision', True) }
 <script type="text/javascript" src="/oozie/static/js/workflow.js"></script>
 
 <script type="text/javascript">
-// Save workflow function
-$.extend(Workflow.prototype, {
-  save: function( options ) {
-    var self = this;
-
-    var options = options || {};
-
-    var request = $.extend({
-      url: self.url() + '/save',
-      type: 'POST',
-      data: { workflow: self.toJSON() },
-      success: function() {
-        $.jHueNotify.info("${ _('Workflow saved') }");
-        workflow.is_dirty( false );
-      },
-      error: function() {
-        $.jHueNotify.error("${ _('Could not save workflow') }");
-      }
-    }, options);
+/**
+ * Component Initialization
+ * Initialize the workflow, registry, modal, and import objects.
+ */
+ // Custom handlers for saving, loading, error checking, etc.
+function import_load_available_nodes_success(data) {
+  if (data.status == 0) {
+    import_node.initialize(data.data);
+  } else {
+    $.jHueNotify.error("${ _('Received invalid response from server: ') }" + JSON.stringify(data));
+  }
+}
 
-    var success_handler = request['success'];
-    request['success'] = function(data, event) {
-      if ($.isFunction(success_handler)) {
-        success_handler(data, event);
-      }
+function workflow_save_success(data) {
+  $.jHueNotify.info("${ _('Workflow saved') }");
+  workflow.reload(data.data);
+  workflow.is_dirty( false );
+}
 
-      self.reload(data.data);
-    };
+function workflow_save_error(data) {
+  $.jHueNotify.error("${ _('Could not save workflow') }");
+}
 
-    $.ajax(request);
+function workflow_load_success(data) {
+  if (data.status == 0) {
+    workflow.reload(data.data);
+  } else {
+    $.jHueNotify.error("${ _('Received invalid response from server: ') }" + JSON.stringify(data));
   }
-});
+}
+
+function workflow_read_only_handler() {
+  $.jHueNotify.error("${ _('Workflow is in read only mode.') }");
+}
 
-/**
- * Known issues with this way of doing things...
- *  - 2 Layers of models.
- */
 // Fetch all nodes from server.
 var workflow_model = new WorkflowModel({
   id: ${ workflow.id },
@@ -499,15 +497,20 @@ var registry = new Registry();
 var workflow = new Workflow({
   model: workflow_model,
   registry: registry,
-  read_only: ${ str(not user_can_edit_job).lower() }
+  read_only: ${ str(not user_can_edit_job).lower() },
+  read_only_error_handler: workflow_read_only_handler,
 });
-workflow.load();
+var import_node = new ImportNode({workflow: workflow});
+var modal = new Modal($('#node-modal'));
+
+// Load data.
+workflow.load({ success: workflow_load_success });
+import_node.loadAvailableNodes({ success: import_load_available_nodes_success });
+
 
 /**
- * Modal
+ * Modals
  */
-var modal = new Modal($('#node-modal'));
-
 // open a modal window for editing a node
 function edit_node_modal(node, save, cancel) {
   var backup = ko.mapping.toJS(node);
@@ -550,11 +553,13 @@ function edit_node_modal(node, save, cancel) {
   });
 }
 
+// Modal for editing a node
 $('#workflow').on('click', '.edit-node-link', function(e) {
   var node = ko.contextFor(this).$data;
   edit_node_modal(node);
 });
 
+// Modal for creating a new node
 $('#workflow').on('click', '.new-node-link', function(e) {
   var node_type = $(this).attr('data-node-type');
   var NodeModel = nodeModelChooser(node_type);
@@ -585,6 +590,7 @@ $('#workflow').on('click', '.new-node-link', function(e) {
   edit_node_modal(node, try_save, cancel_edit);
 });
 
+// Modal for cloning a node
 $('#workflow').on('click', '.clone-node-btn', function(e) {
   var node = ko.contextFor(this).$data;
   var model_copy = $.extend(true, {}, node.model);
@@ -616,6 +622,7 @@ $('#workflow').on('click', '.clone-node-btn', function(e) {
   edit_node_modal(new_node, try_save, cancel_edit);
 });
 
+// Modal for deleting a node
 $('#workflow').on('click', '.delete-node-btn', function(e) {
   var node = ko.contextFor(this).$data;
   $('#confirmation').find('h3').text('${ _('Confirm Delete') }');
@@ -634,12 +641,7 @@ $('#workflow').on('click', '.delete-node-btn', function(e) {
   $('#confirmation').modal('show');
 });
 
-/**
- * Import node
- */
-var import_node = new ImportNode({workflow: workflow});
-import_node.loadAvailableNodes();
-
+// Modal for importing a node
 $('#workflow').on('click', '.import-jobsub-node-link', function(e) {
   var tempModelView = {
     selected_node: ko.observable(),

+ 42 - 24
apps/oozie/static/js/workflow.js

@@ -554,16 +554,18 @@ var ImportNodeModule = function($) {
       return self.available_nodes;
     },
 
-    loadAvailableNodes: function() {
+    loadAvailableNodes: function(options) {
       var self = this;
 
-      $.getJSON(self.url(), function(data) {
-        if (data.status == 0) {
-          self.initialize(data.data);
-        } else {
-          $.jHueNotify.error("Received invalid response from server: " + JSON.stringify(data));
-        }
-      });
+      var request = $.extend({
+        url: self.url(),
+        dataType: 'json',
+        type: 'GET',
+        success: $.noop,
+        error: $.noop,
+      }, options || {});
+
+      $.ajax(request);
     },
 
     convertNode: function(options, jobsub_id) {
@@ -1781,7 +1783,7 @@ var WorkflowModule = function($, NodeModelChooser, Node, ForkNode, DecisionNode,
       self.rebuild();
     });
     self.el.on('workflow:events:load', function() {
-      self.dragAndDropEvents();
+      self.dragAndDropEvents( options );
     });
     self.el.on('workflow:droppables:load', function() {
       self.droppables();
@@ -1790,7 +1792,7 @@ var WorkflowModule = function($, NodeModelChooser, Node, ForkNode, DecisionNode,
       self.draggables();
     });
 
-    self.dragAndDropEvents();
+    self.dragAndDropEvents( options );
     self.el.trigger('workflow:events:loaded');
 
     module.prototype.initialize.apply(self, arguments);
@@ -1923,18 +1925,32 @@ var WorkflowModule = function($, NodeModelChooser, Node, ForkNode, DecisionNode,
       return JSON.stringify(data);
     },
 
-    save: function( options ) {},
+    save: function( options ) {
+      var self = this;
+
+      var request = $.extend({
+        url: self.url() + '/save',
+        type: 'POST',
+        data: { workflow: self.toJSON() },
+        success: $.noop,
+        error: $.noop,
+      }, options || {});
 
-    load: function() {
+      $.ajax(request);
+    },
+
+    load: function( options ) {
       var self = this;
 
-      $.getJSON(self.url(), function(data) {
-        if (data.status == 0) {
-          self.reload(data.data);
-        } else {
-          $.jHueNotify.error("Received invalid response from server: " + JSON.stringify(data));
-        }
-      });
+      var request = $.extend({
+        url: self.url(),
+        dataType: 'json',
+        type: 'GET',
+        success: $.noop,
+        error: $.noop,
+      }, options || {});
+
+      $.ajax(request);
     },
 
     reload: function(model) {
@@ -2175,14 +2191,16 @@ var WorkflowModule = function($, NodeModelChooser, Node, ForkNode, DecisionNode,
       });
     },
 
-    dragAndDropEvents: function() {
+    dragAndDropEvents: function( options ) {
       var self = this;
 
+      var read_only_error_handler = options.read_only_error_handler;
+
       // Build event delegations.
       // Drop on node link
       self.el.on('drop', '.node-link', function(e, ui) {
         if (self.read_only()) {
-          $.jHueNotify.error("Workflow is in read only mode.");
+          read_only_error_handler();
           return false;
         }
 
@@ -2238,7 +2256,7 @@ var WorkflowModule = function($, NodeModelChooser, Node, ForkNode, DecisionNode,
       // Drop on fork
       self.el.on('drop', '.node-fork', function(e, ui) {
         if (self.read_only()) {
-          $.jHueNotify.error("Workflow is in read only mode.");
+          read_only_error_handler();
           return false;
         }
 
@@ -2261,7 +2279,7 @@ var WorkflowModule = function($, NodeModelChooser, Node, ForkNode, DecisionNode,
       // Drop on decision
       self.el.on('drop', '.node-decision', function(e, ui) {
         if (self.read_only()) {
-          $.jHueNotify.error("Workflow is in read only mode.");
+          read_only_error_handler();
           return false;
         }
 
@@ -2284,7 +2302,7 @@ var WorkflowModule = function($, NodeModelChooser, Node, ForkNode, DecisionNode,
       // Drop on action
       self.el.on('drop', '.node-action', function(e, ui) {
         if (self.read_only()) {
-          $.jHueNotify.error("Workflow is in read only mode.");
+          read_only_error_handler();
           return false;
         }