You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by nc...@apache.org on 2017/02/03 14:53:12 UTC

[08/50] [abbrv] ambari git commit: AMBARI-19815 : Recent workflows in Workflow designer. (Venkata Sairam via nitirajrathore)

AMBARI-19815 : Recent workflows in Workflow designer. (Venkata Sairam via nitirajrathore)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/727a3187
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/727a3187
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/727a3187

Branch: refs/heads/branch-dev-patch-upgrade
Commit: 727a31875d4b5a1f4473d1fb3f0292bc5ffb1e2f
Parents: b55ba18
Author: Nitiraj Singh Rathore <ni...@gmail.com>
Authored: Wed Feb 1 18:39:38 2017 +0530
Committer: Nitiraj Singh Rathore <ni...@gmail.com>
Committed: Wed Feb 1 18:39:38 2017 +0530

----------------------------------------------------------------------
 .../ui/app/components/designer-workspace.js     |  48 +++++-
 .../resources/ui/app/components/drafts-wf.js    |  80 +++++++--
 .../ui/app/components/flow-designer.js          |  31 +++-
 .../ui/app/components/recent-projects.js        |  57 +++++++
 .../main/resources/ui/app/components/save-wf.js |   2 +-
 .../ui/app/helpers/format-unicode-date.js       |   3 +-
 .../main/resources/ui/app/models/wfproject.js   |   3 +-
 .../src/main/resources/ui/app/routes/design.js  |  23 ++-
 .../ui/app/routes/design/proj-manager-tab.js    |   7 +-
 .../resources/ui/app/services/current-job.js    |  28 +++
 .../src/main/resources/ui/app/styles/app.less   |  47 ++++-
 .../app/templates/components/bundle-config.hbs  |   2 +-
 .../app/templates/components/coord-config.hbs   |   2 +-
 .../templates/components/designer-workspace.hbs |  39 ++++-
 .../ui/app/templates/components/drafts-wf.hbs   | 170 ++++++++-----------
 .../templates/components/recent-projects.hbs    |  33 ++++
 .../main/resources/ui/app/templates/design.hbs  |   2 +-
 .../app/templates/design/proj-manager-tab.hbs   |   2 +-
 18 files changed, 430 insertions(+), 149 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/727a3187/contrib/views/wfmanager/src/main/resources/ui/app/components/designer-workspace.js
----------------------------------------------------------------------
diff --git a/contrib/views/wfmanager/src/main/resources/ui/app/components/designer-workspace.js b/contrib/views/wfmanager/src/main/resources/ui/app/components/designer-workspace.js
index 5b517af..16fca55 100644
--- a/contrib/views/wfmanager/src/main/resources/ui/app/components/designer-workspace.js
+++ b/contrib/views/wfmanager/src/main/resources/ui/app/components/designer-workspace.js
@@ -24,6 +24,7 @@ export default Ember.Component.extend({
   appPath : null,
   type : 'wf',
   tabId : 0,
+  store:Ember.inject.service(),
   //isProjectManagerEnabled : Constants.isProjectManagerEnabled,
   hasMultitabSupport : true,
   tabCounter : new Map(),
@@ -51,8 +52,14 @@ export default Ember.Component.extend({
         this.get('tabs').forEach((tab)=>{
           this.get('tabCounter').set(tab.type, (this.get('tabCounter').get(tab.type)) + 1);
         }, this);
-        Ember.getOwner(this).lookup('route:design').on('openNewTab', function(path){
-          this.createNewTab('wf', path);
+        Ember.getOwner(this).lookup('route:design').on('openNewTab', function(path, type){
+          if(type === 'COORDINATOR'){
+            this.createNewTab('coord', path);
+          }else if(type === 'BUNDLE'){
+            this.createNewTab('bundle', path);
+          }else{
+            this.createNewTab('wf', path);
+          }
         }.bind(this));
 
       }.bind(this)).catch(function(data){
@@ -92,6 +99,11 @@ export default Ember.Component.extend({
     this.get('tabs').clear();
   }.on('willDestroyElement'),
   createNewTab : function(type, path){
+    var existingTab = this.get('tabs').findBy("filePath", path);
+    if(existingTab && path){
+      this.$('.nav-tabs a[href="#' + existingTab.id + '"]').tab("show");
+      return;
+    }
     var tab = {
       type : type,
       id : this.generateTabId(),
@@ -157,7 +169,39 @@ export default Ember.Component.extend({
   generateTabId(){
     return 'tab-'+ Math.ceil(Math.random() * 100000);
   },
+  recentFilesSorted: Ember.computed.sort("recentFiles", "['updatedAt:desc']"),
+  projList:Ember.computed("recentFilesSorted", function() {
+     return this.get("recentFilesSorted").slice(0, 10);
+  }),
   actions : {
+    deleteWorkflowJob(){
+      this.sendAction("deleteWorkflowJob");
+    },
+    showTopRecentList(){
+      var deferred = Ember.RSVP.defer();
+      this.sendAction('getAllRecentWorks', deferred);
+      deferred.promise.then((data)=>{
+        this.set("recentFiles", data);
+      }).catch((e)=>{
+        console.error(e);
+      })
+    },
+    editWorkflow(path, type){
+      this.sendAction('editWorkflow', path, type);
+    },
+    showProjectManagerList(){
+      var deferred = Ember.RSVP.defer();
+      this.sendAction('getAllRecentWorks', deferred);
+      deferred.promise.then((data)=>{
+        this.set("recentFiles", data);
+        this.set("isProjManagerVisible", true);
+      }).catch((e)=>{
+        console.error(e);
+      })
+    },
+    hideProjectManagerList(){
+      this.set("isProjManagerVisible", false);
+    },
     register(tabInfo, context){
       var tab = this.get('tabs').findBy('id', tabInfo.id);
       Ember.set(tab, 'context', context);

http://git-wip-us.apache.org/repos/asf/ambari/blob/727a3187/contrib/views/wfmanager/src/main/resources/ui/app/components/drafts-wf.js
----------------------------------------------------------------------
diff --git a/contrib/views/wfmanager/src/main/resources/ui/app/components/drafts-wf.js b/contrib/views/wfmanager/src/main/resources/ui/app/components/drafts-wf.js
index 885655a..02483d4 100644
--- a/contrib/views/wfmanager/src/main/resources/ui/app/components/drafts-wf.js
+++ b/contrib/views/wfmanager/src/main/resources/ui/app/components/drafts-wf.js
@@ -19,43 +19,87 @@ import Ember from 'ember';
 const { computed } = Ember;
 
 export default Ember.Component.extend({
+  "search": "",
+  "isBundle": true,
+  "isCoordinator": true,
+  "isWorkflow": true,
+  "filteredModels": Ember.computed("model", "search", "isBundle", "isCoordinator", "isWorkflow", function(){
+	Ember.run.later(()=>{
+      this.$('.actions').hide();
+    }, 10);
+  	var condition = "", condition1 = "", condition2 = "", searchTxt = this.get("search");
+  	if(searchTxt && searchTxt.length){
+  	  condition1 = "(role.get('name') && role.get('name').indexOf(searchTxt)>-1)";
+  	}
+  	if(this.get("isWorkflow")){
+  		if(condition2.length){
+  	  		condition2 = condition2 + " role.get('type') == 'WORKFLOW'";
+  	  	} else {
+  	  		condition2 = condition2 + " role.get('type') == 'WORKFLOW'";
+  	  	}
+  	}
+  	if(this.get("isCoordinator")){
+  		if(condition2.length){
+  			condition2 = condition2 + " || role.get('type') == 'COORDINATOR'";
+  		} else {
+  			condition2 = condition2 + "role.get('type') == 'COORDINATOR'";
+  		}
+  	}
+  	if(this.get("isBundle")){
+  		if(condition2.length) {
+  			condition2 = condition2 + " || role.get('type') == 'BUNDLE'";
+  		} else {
+  			condition2 = condition2 + " role.get('type') == 'BUNDLE'";
+  		}
+  	}
+  	if(condition1.length && condition2.length) {
+    	condition = condition1 + "&&(" + condition2+ ")";
+  	} else if(condition2.length) {
+    	condition = condition2;
+  	}
+	return this.get("model").filter( (role) => {
+	  return eval(condition);
+	});
+  }),
+  modelSorted : Ember.computed.sort("filteredModels", "['updatedAt:desc']"),
   "isDeleteDraftConformation": false,
   "currentDraft": undefined,
   "deleteInProgress": false,
   "deleteMsg": undefined,
+  "currentJobService" : Ember.inject.service('current-job'),
   elementsInserted: function () {
       this.$('.actions').hide();
   }.on("didInsertElement"),
   rendered : function(){
     var self = this;
-    this.$("#configureJob").on('hidden.bs.modal', function () {
+    this.$("#projectsList").on("hidden.bs.modal", function () {
+      this.sendAction("close");
+      history.back();
+    }.bind(this));
+    this.$("#projectDeleteModal").on('hidden.bs.modal', function () {
+      self.set("isDeleteDraftConformation", true);
       self.set("deleteMsg", null);
       self.set("deleteInProgress", false);
     }.bind(this));
+    this.$("#projectsList").modal("show");
+    Ember.$("#loading").css("display", "none");
   }.on('didInsertElement'),
   store: Ember.inject.service(),
   actions: {
-    importActionToEditor ( path ) {
-      this.sendAction('editWorkflow', path);
+    importActionToEditor ( path, type ) {
+      this.$("#projectsList").modal("hide");
+      this.sendAction('editWorkflow', path, type);
     },
-    deleteDraftConformation (job ){
-	    this.set("isDeleteDraftConformation", true);
-	    this.$("#configureJob").modal("show");
+    confirmDelete (job ){
+	    this.set("showingConfirmation", true);
 	    this.set("currentDraft", job);
     },
     deleteDraft () {
-	    this.set("deleteInProgress", true);
-	    var job = this.get("currentDraft"), self= this;
-  		this.get("store").findRecord('wfproject', job.id).then(function(post) {
-  		  post.destroyRecord();
-  		}).then(function () {
-  	      self.set("deleteInProgress", false);
-  	      self.set("deleteMsg", "Draft successfully deleted.");
-            console.log("Deleted successfully");
-  	    }).catch(function (response) {
-  	      self.set("deleteInProgress", false);
-  	      self.set("deleteMsg", "There is some problem while deletion.Please try again.");
-  	    });
+	    this.sendAction("deleteWorkflow", this.get('currentDraft'));
+    },
+    closeProjects () {
+		  $('.modal-backdrop').remove();
+		  this.$("#projectsList").modal("hide");
     },
     showActions (job) {
       this.$('.'+job.get("updatedAt")+'Actions').show();

http://git-wip-us.apache.org/repos/asf/ambari/blob/727a3187/contrib/views/wfmanager/src/main/resources/ui/app/components/flow-designer.js
----------------------------------------------------------------------
diff --git a/contrib/views/wfmanager/src/main/resources/ui/app/components/flow-designer.js b/contrib/views/wfmanager/src/main/resources/ui/app/components/flow-designer.js
index f863656..f897d48 100644
--- a/contrib/views/wfmanager/src/main/resources/ui/app/components/flow-designer.js
+++ b/contrib/views/wfmanager/src/main/resources/ui/app/components/flow-designer.js
@@ -145,6 +145,35 @@ export default Ember.Component.extend(FindNodeMixin, Validations, {
       });
     }
   },
+
+  importWorkflowFromProjManager(path){
+      var self = this;
+      this.set("showingFileBrowser",false);
+      if(path){
+        self.set("isWorkflowImporting", true);
+        this.isDraftExists(path).promise.then(function(data){
+          var draftData = JSON.parse(data);
+          if(draftData.draftExists && draftData.isDraftCurrent) {
+              self.set("workflowFilePath", path);
+              self.getDraftWorkflowData(path).promise.then(function(data){
+                var workflowImporter = WorkflowJsonImporter.create({});
+                var workflow = workflowImporter.importWorkflow(data);
+                self.resetDesigner();
+                self.set("workflow", workflow);
+                self.initAndRenderWorkflow();
+                self.set("isWorkflowImporting", false);
+                self.doValidation();
+              }.bind(this)).catch(function(data){
+              });
+          } else {
+            self.importWorkflow(path);
+          }
+        }.bind(this)).catch(function(e){
+          console.error(e);
+        });
+      }
+  },
+
   observeXmlAppPath : Ember.observer('xmlAppPath', function(){
     if(!this.get('xmlAppPath') || null === this.get('xmlAppPath')){
       return;
@@ -193,7 +222,7 @@ export default Ember.Component.extend(FindNodeMixin, Validations, {
         }
       }
     }
-    this.importWorkflow(relXmlPath);
+    this.importWorkflowFromProjManager(relXmlPath);
   },
   setConentWidth(){
     var offset = 120;

http://git-wip-us.apache.org/repos/asf/ambari/blob/727a3187/contrib/views/wfmanager/src/main/resources/ui/app/components/recent-projects.js
----------------------------------------------------------------------
diff --git a/contrib/views/wfmanager/src/main/resources/ui/app/components/recent-projects.js b/contrib/views/wfmanager/src/main/resources/ui/app/components/recent-projects.js
new file mode 100644
index 0000000..18a57f6
--- /dev/null
+++ b/contrib/views/wfmanager/src/main/resources/ui/app/components/recent-projects.js
@@ -0,0 +1,57 @@
+/*
+*    Licensed to the Apache Software Foundation (ASF) under one or more
+*    contributor license agreements.  See the NOTICE file distributed with
+*    this work for additional information regarding copyright ownership.
+*    The ASF 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.
+*/
+
+import Ember from 'ember';
+
+export default Ember.Component.extend({
+  store: Ember.inject.service(),
+  rendered : function(){
+  	var self = this;
+    this.$("#projectDeleteModal").on('hidden.bs.modal', function () {
+      self.set("isDeleteDraftConformation", true);
+      self.set("deleteMsg", null);
+      self.set("deleteInProgress", false);
+    }.bind(this));
+    this.$("#projectsList").on("hidden.bs.modal", function () {
+      this.sendAction("close");
+    }.bind(this));
+    this.$("#projectsList").modal("show");
+  }.on('didInsertElement'),
+  actions: {
+  	close(){
+  		this.sendAction("close");
+  	},
+  	deleteWorkflow (job) {
+	    this.set("deleteInProgress", true);
+	    var self= this;
+	    var rec = this.get("store").peekRecord('wfproject', job.id);
+	    if(rec){
+	      rec.destroyRecord().then(function () {
+  	      self.set("deleteInProgress", false);
+  	      self.set("deleteMsg", "Workflow successfully deleted.");
+  	    }).catch(function (response) {
+  	      self.set("deleteInProgress", false);
+  	      self.set("deleteMsg", "There is some problem while deletion.Please try again.");
+  	    });
+	    }
+    },
+    editWorkflow ( path, type ) {
+      this.sendAction('editWorkflow', path, type);
+      this.$("#projectsList").modal("hide");
+    },
+  }
+});

http://git-wip-us.apache.org/repos/asf/ambari/blob/727a3187/contrib/views/wfmanager/src/main/resources/ui/app/components/save-wf.js
----------------------------------------------------------------------
diff --git a/contrib/views/wfmanager/src/main/resources/ui/app/components/save-wf.js b/contrib/views/wfmanager/src/main/resources/ui/app/components/save-wf.js
index 80bea99..54d13ff 100644
--- a/contrib/views/wfmanager/src/main/resources/ui/app/components/save-wf.js
+++ b/contrib/views/wfmanager/src/main/resources/ui/app/components/save-wf.js
@@ -142,7 +142,7 @@ export default Ember.Component.extend(Validations, {
         detail=jsonResp.message;
       }
     }else{
-      detail=response; 
+      detail=response;
     }
     return detail;
   },

http://git-wip-us.apache.org/repos/asf/ambari/blob/727a3187/contrib/views/wfmanager/src/main/resources/ui/app/helpers/format-unicode-date.js
----------------------------------------------------------------------
diff --git a/contrib/views/wfmanager/src/main/resources/ui/app/helpers/format-unicode-date.js b/contrib/views/wfmanager/src/main/resources/ui/app/helpers/format-unicode-date.js
index e6dd653..003e777 100644
--- a/contrib/views/wfmanager/src/main/resources/ui/app/helpers/format-unicode-date.js
+++ b/contrib/views/wfmanager/src/main/resources/ui/app/helpers/format-unicode-date.js
@@ -18,7 +18,8 @@
 import Ember from 'ember';
 
 export function formatUnicodeDate(params) {
-  return new Date(parseInt(params[0])).toUTCString();
+    var date = new Date(parseInt(params[0])).toUTCString();
+    return [moment(date).format("MM/DD/YYYY hh:mm A")].join("")
 }
 
 export default Ember.Helper.helper(formatUnicodeDate);

http://git-wip-us.apache.org/repos/asf/ambari/blob/727a3187/contrib/views/wfmanager/src/main/resources/ui/app/models/wfproject.js
----------------------------------------------------------------------
diff --git a/contrib/views/wfmanager/src/main/resources/ui/app/models/wfproject.js b/contrib/views/wfmanager/src/main/resources/ui/app/models/wfproject.js
index e90a613..8afe594 100644
--- a/contrib/views/wfmanager/src/main/resources/ui/app/models/wfproject.js
+++ b/contrib/views/wfmanager/src/main/resources/ui/app/models/wfproject.js
@@ -19,7 +19,8 @@ import DS from 'ember-data';
 
 export default DS.Model.extend({
 	workflowDefinitionPath: DS.attr("string"),
+	name: DS.attr("string"),
 	type: DS.attr("string"),
-	updatedAt: DS.attr("string"),
+	updatedAt: DS.attr("number"),
 	owner:DS.attr("string")
 });

http://git-wip-us.apache.org/repos/asf/ambari/blob/727a3187/contrib/views/wfmanager/src/main/resources/ui/app/routes/design.js
----------------------------------------------------------------------
diff --git a/contrib/views/wfmanager/src/main/resources/ui/app/routes/design.js b/contrib/views/wfmanager/src/main/resources/ui/app/routes/design.js
index b6beef8..93ce758 100644
--- a/contrib/views/wfmanager/src/main/resources/ui/app/routes/design.js
+++ b/contrib/views/wfmanager/src/main/resources/ui/app/routes/design.js
@@ -19,7 +19,7 @@ import Ember from 'ember';
 import SchemaVersions from '../domain/schema-versions';
 
 export default Ember.Route.extend(Ember.Evented, {
-
+  currentDraft: null,
   beforeModel: function(transition){
     this.set("xmlAppPath", transition.queryParams.appPath);
     this.controllerFor('design').set("xmlAppPath", transition.queryParams.appPath);
@@ -71,25 +71,30 @@ export default Ember.Route.extend(Ember.Evented, {
       this.set('failedSchemaVersions', true);
       transition.retry();
     },
-    editWorkflow(path){
-      this.trigger('openNewTab', path);
+    editWorkflow(path, type){
+      this.trigger('openNewTab', path, type);
+    },
+    deleteWorkflow(job){
+      this.set("currentDraft", job);
     },
     showDashboard(){
       this.controller.set('dashboardShown', true);
       this.transitionTo('design.dashboardtab');
     },
-    showProjManager(){
-      //this.controller.set('ProjManagerShown', true);
-      this.transitionTo('design.projManagerTab');
+    getAllRecentWorks(deferred){
+      this.store.findAll("wfproject", { reload: true }).then((data)=>{
+        deferred.resolve(data);
+      }).catch((e)=>{
+        deferred.reject(e);
+      });
     },
     hideDashboard(){
       this.controller.set('dashboardShown', false);
       this.transitionTo('design');
     },
     hideProjManager(){
-      //this.controller.set('ProjManagerShown', false);
+      this.controller.set('dashboardShown', false);
       this.transitionTo('design');
     }
   }
-
-});
+});
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/727a3187/contrib/views/wfmanager/src/main/resources/ui/app/routes/design/proj-manager-tab.js
----------------------------------------------------------------------
diff --git a/contrib/views/wfmanager/src/main/resources/ui/app/routes/design/proj-manager-tab.js b/contrib/views/wfmanager/src/main/resources/ui/app/routes/design/proj-manager-tab.js
index b37ed83..685b49c 100644
--- a/contrib/views/wfmanager/src/main/resources/ui/app/routes/design/proj-manager-tab.js
+++ b/contrib/views/wfmanager/src/main/resources/ui/app/routes/design/proj-manager-tab.js
@@ -19,11 +19,14 @@ import Ember from 'ember';
 
 export default Ember.Route.extend({
   model:function(params) {
-    return this.store.findAll('wfproject');
+	var data = this.store.findAll("wfproject").catch((error) => {
+      console.log(error);
+    });
+    return data;
   },
   actions: {
     routeToDesigner(options){
       this.transitionTo("design", options);
-    }
+  	}
   }
 });

http://git-wip-us.apache.org/repos/asf/ambari/blob/727a3187/contrib/views/wfmanager/src/main/resources/ui/app/services/current-job.js
----------------------------------------------------------------------
diff --git a/contrib/views/wfmanager/src/main/resources/ui/app/services/current-job.js b/contrib/views/wfmanager/src/main/resources/ui/app/services/current-job.js
new file mode 100644
index 0000000..c5792de
--- /dev/null
+++ b/contrib/views/wfmanager/src/main/resources/ui/app/services/current-job.js
@@ -0,0 +1,28 @@
+/*
+*    Licensed to the Apache Software Foundation (ASF) under one or more
+*    contributor license agreements.  See the NOTICE file distributed with
+*    this work for additional information regarding copyright ownership.
+*    The ASF 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.
+*/
+
+import Ember from 'ember';
+
+export default Ember.Service.extend({
+	currentJob: null,
+	setCurrentJob(job){
+      this.set("currentJob", job);
+	},
+	getCurrentJob(){
+      return this.get("currentJob");
+	}
+});

http://git-wip-us.apache.org/repos/asf/ambari/blob/727a3187/contrib/views/wfmanager/src/main/resources/ui/app/styles/app.less
----------------------------------------------------------------------
diff --git a/contrib/views/wfmanager/src/main/resources/ui/app/styles/app.less b/contrib/views/wfmanager/src/main/resources/ui/app/styles/app.less
index 755a6ad..5080560 100644
--- a/contrib/views/wfmanager/src/main/resources/ui/app/styles/app.less
+++ b/contrib/views/wfmanager/src/main/resources/ui/app/styles/app.less
@@ -1587,15 +1587,11 @@ input:invalid {
   width:5%;
 }
 #draftsTable {
-  padding-top: 0.5%;
-  padding-left: 0.5%;
-  padding-right: 0.5%;
   max-height:500px;
-  overflow:scroll;
+  overflow-y:scroll;
 }
 #emptyDrafts {
-  padding-left:40%;
-  padding-top:5%;
+  padding-left:35%;
 }
 .width300 {
   white-space: nowrap;
@@ -1627,11 +1623,17 @@ input:invalid {
   width: 100%;
   min-height: 100px;
 }
+.displayBlock {
+ display : block;
+}
 .no-asset-records {
   text-align: center;
   padding: 3px;
   overflow-y: auto;
 }
+#projectsList .modal-dialog {
+  width:850px;
+}
 .custom-action-xml{
   width: 100%;
   min-height: 175px;
@@ -1640,3 +1642,36 @@ input:invalid {
   width: 650px;
   top: 60px;
 }
+.tab-pane #draftsTable, #projectsList #dashboard, .tab-pane .searchWorkflows {
+  display : none;
+}
+#projectDeleteModal .modal-dialog {
+  width:500px;
+}
+.projects-list {
+  white-space: nowrap;
+  width: 100%;
+  overflow: hidden;
+  text-overflow: ellipsis;
+}
+.proj-menu {
+  width:200px;
+}
+.pl10 {
+  padding-left:10px;
+}
+.fixed-col {
+  width:15%;
+}
+.width100 {
+    white-space: nowrap;
+    width: 100px;
+    overflow: hidden;
+    text-overflow: ellipsis;
+}
+.l-input {
+  height: 30px;
+  width: 60%;
+  margin-bottom: 10px;
+  margin-right: 3px;
+}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/727a3187/contrib/views/wfmanager/src/main/resources/ui/app/templates/components/bundle-config.hbs
----------------------------------------------------------------------
diff --git a/contrib/views/wfmanager/src/main/resources/ui/app/templates/components/bundle-config.hbs b/contrib/views/wfmanager/src/main/resources/ui/app/templates/components/bundle-config.hbs
index 37150f5..749a173 100644
--- a/contrib/views/wfmanager/src/main/resources/ui/app/templates/components/bundle-config.hbs
+++ b/contrib/views/wfmanager/src/main/resources/ui/app/templates/components/bundle-config.hbs
@@ -138,5 +138,5 @@
   {{bundle-version-settings bundle=bundle showVersionSettings="showVersionSettings" }}
 {{/if}}
 {{#if showingSaveWorkflow}}
-  {{save-wf type='wf' close="closeSave" jobFilePath=bundleFilePath openFileBrowser="openFileBrowser" closeFileBrowser="closeFileBrowser" jobConfigs=configForSave}}
+  {{save-wf type='bundle' close="closeSave" jobFilePath=bundleFilePath openFileBrowser="openFileBrowser" closeFileBrowser="closeFileBrowser" jobConfigs=configForSave}}
 {{/if}}

http://git-wip-us.apache.org/repos/asf/ambari/blob/727a3187/contrib/views/wfmanager/src/main/resources/ui/app/templates/components/coord-config.hbs
----------------------------------------------------------------------
diff --git a/contrib/views/wfmanager/src/main/resources/ui/app/templates/components/coord-config.hbs b/contrib/views/wfmanager/src/main/resources/ui/app/templates/components/coord-config.hbs
index 13f3ae7..1c80312 100644
--- a/contrib/views/wfmanager/src/main/resources/ui/app/templates/components/coord-config.hbs
+++ b/contrib/views/wfmanager/src/main/resources/ui/app/templates/components/coord-config.hbs
@@ -381,5 +381,5 @@ okBtnText="Continue" cancelBtnText="Cancel" onOk="resetCoordinator"}}{{/confirma
 </div>
 {{/if}}
 {{#if showingSaveWorkflow}}
-  {{save-wf type='wf' close="closeSave" jobFilePath=coordinatorFilePath openFileBrowser="openFileBrowser" closeFileBrowser="closeFileBrowser" jobConfigs=configForSave}}
+  {{save-wf type='coord' close="closeSave" jobFilePath=coordinatorFilePath openFileBrowser="openFileBrowser" closeFileBrowser="closeFileBrowser" jobConfigs=configForSave}}
 {{/if}}

http://git-wip-us.apache.org/repos/asf/ambari/blob/727a3187/contrib/views/wfmanager/src/main/resources/ui/app/templates/components/designer-workspace.hbs
----------------------------------------------------------------------
diff --git a/contrib/views/wfmanager/src/main/resources/ui/app/templates/components/designer-workspace.hbs b/contrib/views/wfmanager/src/main/resources/ui/app/templates/components/designer-workspace.hbs
index 46a3f63..f7a93e0 100644
--- a/contrib/views/wfmanager/src/main/resources/ui/app/templates/components/designer-workspace.hbs
+++ b/contrib/views/wfmanager/src/main/resources/ui/app/templates/components/designer-workspace.hbs
@@ -26,6 +26,39 @@
         </div>
         <div class="col-sm-8">
           <div class="text-right pull-right paddingtop7">
+              <button {{action 'showDashboard'}} class="backto-dashboard btn btn-default" title="Workflow Dashboard">
+                <i class="fa fa-th marginright5"></i>Dashboard
+              </button>
+            <div class="dropdown create-wf-menu">
+              <button class="btn btn-default dropdown-toggle borderRightRadiusNone" {{action "showTopRecentList"}} type="button" data-toggle="dropdown">Recent
+                <span class="caret"></span></button>
+                <ul class="dropdown-menu proj-menu">
+                 {{#if projList}}
+                  {{#each projList as |proj index|}}
+                    <li>
+                      <a id="wfs_btn" class="pointer projects-list" title={{proj.workflowDefinitionPath}} {{action "editWorkflow" proj.workflowDefinitionPath proj.type}}>
+                      {{#if (eq proj.type "WORKFLOW")}}
+                          <i class="fa fa-sitemap marginright5"></i>{{proj.name}}
+                      {{else if  (eq proj.type "COORDINATOR")}}
+                          <i class="fa fa-history marginright5"></i>{{proj.name}}
+                      {{else}}
+                          <i class="fa fa-cubes marginright5"></i>{{proj.name}}
+                      {{/if}}
+                      </a>
+                    </li>
+                   {{/each}}
+                  <li>
+                      <a {{action "showProjectManagerList"}} title="My Workflows" class="pointer">
+                      More...
+                      </a>
+                  </li>
+                 {{else}}
+                  <li class="pl10">
+                    No recent workflows.
+                  </li>
+                 {{/if}}
+                </ul>
+             </div>
             <div class="dropdown create-wf-menu">
               <button class="btn btn-default dropdown-toggle borderRightRadiusNone" type="button" data-toggle="dropdown">Create
                 <span class="caret"></span></button>
@@ -62,9 +95,6 @@
                   </li>
                 </ul>
               </div>
-              <button {{action 'showDashboard'}} class="backto-dashboard btn btn-default" title="Workflow Dashboard">
-                <i class="fa fa-th marginright5"></i>Dashboard
-              </button>
               <button {{action "showAssetManager" true}} class="btn btn-default" title="Manage Assets">
                   Manage Assets
               </button>
@@ -128,6 +158,9 @@
   {{#if showingAssetManager}}
     {{#asset-manager showAssetManager="showAssetManager"}}{{/asset-manager}}
   {{/if}}
+  {{#if isProjManagerVisible}}
+    {{recent-projects recentFiles=recentFiles routeToDesigner="routeToDesigner" editWorkflow="editWorkflow" deleteWorkflow="deleteWorkflow" close="hideProjectManagerList" deleteWorkflowJob="deleteWorkflowJob" currentDraft=currentDraft}}
+  {{/if}}
   {{#if showingWarning}}
   {{#confirmation-dialog title="Confirm workflow reset"
     confirmationMessage="Any unsaved changes may be lost. Do you want to close this tab ?"

http://git-wip-us.apache.org/repos/asf/ambari/blob/727a3187/contrib/views/wfmanager/src/main/resources/ui/app/templates/components/drafts-wf.hbs
----------------------------------------------------------------------
diff --git a/contrib/views/wfmanager/src/main/resources/ui/app/templates/components/drafts-wf.hbs b/contrib/views/wfmanager/src/main/resources/ui/app/templates/components/drafts-wf.hbs
index 54ea25f..802a8bc 100644
--- a/contrib/views/wfmanager/src/main/resources/ui/app/templates/components/drafts-wf.hbs
+++ b/contrib/views/wfmanager/src/main/resources/ui/app/templates/components/drafts-wf.hbs
@@ -15,107 +15,75 @@
 * See the License for the specific language governing permissions and
 * limitations under the License.
 }}
-
-{{#if model}}
-<div id="draftsTable">
-<table id="search-table" class="table search-table listing table-striped table-hover table-bordered" cellspacing="0" width="100%">
-  <thead>
-    <tr>
-      <!--th>Draft Name</th-->
-      <th>Type</th>
-      <th>Draft Path</th>
-      <th>Created Time</th>
-      <th>Action</th>
-    </tr>
-  </thead>
-  <tbody>
-    {{#if model}}
-    {{#each model as |job idx|}}
-    <tr>
-    <!--td title={{job.workflowDefinitionPath}}> <div class="width300">{{job.workflowDefinitionPath}}</div></td-->
-    <td class="{{job.type}} cyScrollMsg">
-    {{#if (eq job.type "WORKFLOW")}}
-      <i class="fa fa-sitemap marginright5"></i>
-    {{/if}}
-    </td>
-		<td title={{job.workflowDefinitionPath}}>
-     <div class="width300">
-       {{job.workflowDefinitionPath}}
-     </div>
-    </td>
-		<td> {{format-unicode-date job.updatedAt}}</td>
-		<td class=" no-sort" {{action 'hideActions' job on="mouseLeave"}} style="width:200px;">
-		  <div id="actions-div" class="pull-left Actions{{job.updatedAt}}">
-		    <button {{action 'showActions' job on='mouseEnter'}} type="button" class="btn btn-default isOn">
-		      <i class="fa fa-cog" aria-hidden="true"></i>
-		    </button>
-		  </div>
-		  <div class="pull-left {{job.updatedAt}}Actions actions" id="actions">
-		    <div class="wf-buttons btn-group btn-group-sm" role="group" aria-label="buttons">
-		      <button {{action "importActionToEditor" job.workflowDefinitionPath}} type="button" class="btn btn-default">
-		        Edit
-		      </button>
-		      <button {{action 'deleteDraftConformation' job}} type="button" class="btn btn-default">
-		        Delete
-		      </button>
-		    </div>
-		  </div>
-		</td>
-	</tr>
-    {{/each}}
-    {{/if}}
-  </tbody>
-</table>
+<div id="loading" class="displayBlock">
+    {{spin-spinner lines=13 length=20 width=10}}
 </div>
-<div id="draftsNum">Displaying {{model.length}} projects</div>
+<div class="searchWorkflows">
+  {{input type="checkbox" name="isWorkflow" checked=isWorkflow}}Workflow&nbsp;&nbsp;
+  {{input type="checkbox" name="isCoordinator" checked=isCoordinator}}Coordinator&nbsp;&nbsp;
+  {{input type="checkbox" name="isBundle" checked=isBundle}}Bundle&nbsp;&nbsp;
+  {{input type="text" class="l-input" value=search placeholder="Workflow Name"}}
+</div>
+{{#if modelSorted}}
+    <div id="draftsTable">
+        <table id="search-table" class="table search-table listing table-striped table-hover table-bordered"
+               cellspacing="0" width="100%">
+            <thead>
+              <tr>
+                  <!--th>Draft Name</th-->
+                  <th></th>
+                  <th>Name</th>
+                  <th>Path</th>
+                  <th>Updated at</th>
+                  <th>Action</th>
+              </tr>
+            </thead>
+            <tbody>
+            {{#if modelSorted}}
+                {{#each modelSorted as |job idx|}}
+                {{#if true}}
+                    <tr>
+                        <!--td title={{job.workflowDefinitionPath}}> <div class="width300">{{job.workflowDefinitionPath}}</div></td-->
+                        <td class="{{job.type}} cyScrollMsg">
+                          {{#if (eq job.type "WORKFLOW")}}
+                              <i class="fa fa-sitemap marginright5"></i>
+                          {{else if  (eq job.type "COORDINATOR")}}
+                              <i class="fa fa-history marginright5"></i>
+                          {{else}}
+                              <i class="fa fa-cubes marginright5"></i>
+                          {{/if}}
+                        </td>
+                        <td title={{job.name}}>
+                            <div class="width100">
+                              {{job.name}}
+                            </div>
+                        </td>
+                        <td title={{job.workflowDefinitionPath}}>
+                            <div class="width300">
+                                {{job.workflowDefinitionPath}}
+                            </div>
+                        </td>
+                        <td>
+                            <div class="width50">
+                                {{format-unicode-date job.updatedAt}}
+                            </div>
+                        </td>
+                        <td class=" no-sort fixed-col">
+                            <button {{action "importActionToEditor" job.workflowDefinitionPath job.type}} type="button"
+                                                                                                         class="btn btn-default">
+                                        Open
+                                    </button>
+                        </td>
+                    </tr>
+                    {{/if}}
+                {{/each}}
+            {{/if}}
+            </tbody>
+        </table>
+    </div>
+    <div id="draftsNum">Displaying {{modelSorted.length}} workflows</div>
 {{else}}
-  <div id="emptyDrafts">
-    There are no projects currently
-  </div>
-{{/if}}
-{{#if true}}
-<div class="modal fade" id="configureJob" role="dialog">
-  <div class="modal-dialog">
-    <div class="modal-content">
-      <div class="modal-header">
-        <button type="button" class="close" data-dismiss="modal">&times;</button>
-          <h4 class="modal-title">Delete Draft Confirmation</h4>
-      </div>
-      <div class="modal-body">
-         {{#if deleteMsg}}
-        <div class="row form-group">
-          <div class="col-xs-4">
-          </div>
-          <div class="col-xs-8">
-            <div class="input-group">
-              {{deleteMsg}}
-            </div>
-          </div>
-        </div>
-          {{/if}}
-          {{#unless deleteMsg}}
-        <div class="row form-group">
-          <div class="col-xs-4">
-          </div>
-          <div class="col-xs-8">
-            <div class="input-group">
-              <label class="control-label" for="{{type}}-path">Do you want to delete the draft?</label>
-            </div>
-          </div>
-        </div>
-        {{/unless}}
-      </div>
-      <div class="modal-footer">
-        {{#if deleteInProgress}}
-          {{spin-spinner lines=10 length=10 width=5 radius=10 }}
-          <span class="pull-left">Deleting the draft</span>
-        {{/if}}
-        <button type="button" class="btn btn-default" data-dismiss="modal" {{action "closeDraftWindow"}}>Close</button>
-        {{#unless deleteMsg}}
-          <button type="button" class="btn btn-primary" {{action "deleteDraft" }}>Delete</button>
-        {{/unless}}
-      </div>
+    <div id="emptyDrafts">
+        <label class="control-label" for="{{type}}-path">There are no workflows currently</label>
     </div>
-  </div>
-</div>
-{{/if}}
+{{/if}}
\ No newline at end of file

http://git-wip-us.apache.org/repos/asf/ambari/blob/727a3187/contrib/views/wfmanager/src/main/resources/ui/app/templates/components/recent-projects.hbs
----------------------------------------------------------------------
diff --git a/contrib/views/wfmanager/src/main/resources/ui/app/templates/components/recent-projects.hbs b/contrib/views/wfmanager/src/main/resources/ui/app/templates/components/recent-projects.hbs
new file mode 100644
index 0000000..cd8f6af
--- /dev/null
+++ b/contrib/views/wfmanager/src/main/resources/ui/app/templates/components/recent-projects.hbs
@@ -0,0 +1,33 @@
+{{!
+* Licensed to the Apache Software Foundation (ASF) under one
+* or more contributor license agreements.  See the NOTICE file
+* distributed with this work for additional information
+* regarding copyright ownership.  The ASF 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.
+}}
+<div class="modal" id="projectsList" role="dialog">
+  <div class="modal-dialog">
+    <div class="modal-content">
+      <div class="modal-header">
+        <button type="button" class="close" data-dismiss="modal">&times;</button>
+        <h4 class="modal-title">My Workflows</h4>
+      </div>
+      <div class="modal-body">
+         {{drafts-wf model=recentFiles routeToDesigner="routeToDesigner" editWorkflow="editWorkflow" deleteWorkflow="deleteWorkflow"}}
+      </div>
+      <div class="modal-footer">
+        <button type="button" class="btn btn-default" data-dismiss="modal">Close</button>
+      </div>
+    </div>
+  </div>
+</div>

http://git-wip-us.apache.org/repos/asf/ambari/blob/727a3187/contrib/views/wfmanager/src/main/resources/ui/app/templates/design.hbs
----------------------------------------------------------------------
diff --git a/contrib/views/wfmanager/src/main/resources/ui/app/templates/design.hbs b/contrib/views/wfmanager/src/main/resources/ui/app/templates/design.hbs
index 012d9e7..5ca68c9 100644
--- a/contrib/views/wfmanager/src/main/resources/ui/app/templates/design.hbs
+++ b/contrib/views/wfmanager/src/main/resources/ui/app/templates/design.hbs
@@ -15,5 +15,5 @@
 * See the License for the specific language governing permissions and
 * limitations under the License.
 }}
-{{designer-workspace xmlAppPath=xmlAppPath showDashboard="showDashboard" showProjManager="showProjManager"
+{{designer-workspace xmlAppPath=xmlAppPath editWorkflow="editWorkflow" currentDraft=currentDraft showDashboard="showDashboard" showProjManager="showProjManager" getAllRecentWorks="getAllRecentWorks"
   hideDashboard="hideDashboard" hideProjManager="hideProjManager" adminConfig=model.adminConfig}}

http://git-wip-us.apache.org/repos/asf/ambari/blob/727a3187/contrib/views/wfmanager/src/main/resources/ui/app/templates/design/proj-manager-tab.hbs
----------------------------------------------------------------------
diff --git a/contrib/views/wfmanager/src/main/resources/ui/app/templates/design/proj-manager-tab.hbs b/contrib/views/wfmanager/src/main/resources/ui/app/templates/design/proj-manager-tab.hbs
index b897a4c..8ba9523 100644
--- a/contrib/views/wfmanager/src/main/resources/ui/app/templates/design/proj-manager-tab.hbs
+++ b/contrib/views/wfmanager/src/main/resources/ui/app/templates/design/proj-manager-tab.hbs
@@ -16,4 +16,4 @@
 * limitations under the License.
 }}
 
-{{drafts-wf model=model routeToDesigner="routeToDesigner" editWorkflow="editWorkflow"}}
+{{drafts-wf model=model routeToDesigner="routeToDesigner" editWorkflow="editWorkflow" deleteWorkflow="deleteWorkflow"}}