From 51e791868666cc7c5f196416f97605f968f69874 Mon Sep 17 00:00:00 2001
From: Filipa Lacerda <filipa@gitlab.com>
Date: Wed, 9 Nov 2016 17:36:42 +0000
Subject: [PATCH] Manual actions

---
 .../components/environment_actions.js.es6     | 44 +++++++++++++++----
 .../components/environment_item.js.es6        | 21 +++++++--
 .../vue_common_component/commit.js.es6        |  2 +-
 .../projects/environments/index.html.haml     |  2 +
 4 files changed, 56 insertions(+), 13 deletions(-)

diff --git a/app/assets/javascripts/environments/components/environment_actions.js.es6 b/app/assets/javascripts/environments/components/environment_actions.js.es6
index 6b0555360b5..6d49a10eb0e 100644
--- a/app/assets/javascripts/environments/components/environment_actions.js.es6
+++ b/app/assets/javascripts/environments/components/environment_actions.js.es6
@@ -4,28 +4,54 @@
 (() => {
   window.gl = window.gl || {};
   window.gl.environmentsList = window.gl.environmentsList || {};
-  
+
   window.gl.environmentsList.ActionsComponent = Vue.component('actions-component', {
     props: {
       actions: {
         type: Array,
         required: false,
-        default: () => []
+        default: () => [],
+      },
+    },
+
+    /**
+     * Appends the svg icon that were render in the index page.
+     * In order to reuse the svg instead of copy and paste in this template
+     * we need to render it outside this component using =custom_icon partial.
+     *
+     * TODO: Remove this when webpack is merged.
+     *
+     */
+    ready() {
+      const playIcon = document.querySelector('.play-icon-svg.hidden svg');
+
+      const dropdownContainer = this.$el.querySelector('.dropdown-play-icon-container');
+      const actionContainers = this.$el.querySelectorAll('.action-play-icon-container');
+
+      if (playIcon) {
+        dropdownContainer.appendChild(playIcon.cloneNode(true));
+        actionContainers.forEach((element) => {
+          element.appendChild(playIcon.cloneNode(true));
+        });
       }
     },
-    
+
     template: `
       <div class="inline">
         <div class="dropdown">
           <a class="dropdown-new btn btn-default" data-toggle="dropdown">
-            playIcon
+            <span class="dropdown-play-icon-container">
+              <!-- svg goes here -->
+            </span>
             <i class="fa fa-caret-down"></i>
           </a>
-          
+
           <ul class="dropdown-menu dropdown-menu-align-right">
             <li v-for="action in actions">
               <a :href="action.play_url" data-method="post" rel="nofollow">
-                icon play
+              <span class="action-play-icon-container">
+                <!-- svg goes here -->
+              </span>
                 <span>
                   {{action.name}}
                 </span>
@@ -34,6 +60,6 @@
           </ul>
         </div>
       </div>
-    `
-  }); 
-})();
\ No newline at end of file
+    `,
+  });
+})();
diff --git a/app/assets/javascripts/environments/components/environment_item.js.es6 b/app/assets/javascripts/environments/components/environment_item.js.es6
index c51ea8707dd..4476e7689cd 100644
--- a/app/assets/javascripts/environments/components/environment_item.js.es6
+++ b/app/assets/javascripts/environments/components/environment_item.js.es6
@@ -1,4 +1,5 @@
 /*= require vue_common_component/commit
+/*= require ./environment_actions
 /* globals Vue, timeago */
 
 (() => {
@@ -19,7 +20,8 @@
   gl.environmentsList.EnvironmentItem = Vue.component('environment-item', {
 
     components: {
-      'commit-component': window.gl.commitComponent,
+      'commit-component': window.gl.CommitComponent,
+      'actions-component': window.gl.environmentsList.ActionsComponent,
     },
 
     props: {
@@ -135,13 +137,24 @@
         return timeagoInstance.format(this.model.created_at);
       },
 
+      /**
+       * Verifies if the environment has any manual actions to be rendered.
+       *
+       * @returns {Boolean}
+       */
+      hasManualActions() {
+        return this.model.last_deployment &&
+          this.model.last_deployment.manual_actions &&
+          this.model.last_deployment.manual_actions.length > 0;
+      },
+
       /**
        * Returns the manual actions with the name parsed.
        *
        * @returns {Array.<Object>}
        */
       manualActions() {
-        return this.model.manual_actions.map((action) => {
+        return this.model.last_deployment.manual_actions.map((action) => {
           const parsedAction = {
             name: gl.text.humanize(action.name),
             play_url: action.play_url,
@@ -327,7 +340,9 @@
 
         <td class="hidden-xs">
           <div v-if="!isFolder">
-
+            <div v-if="hasManualActions">
+              <actions-component :actions="manualActions"></actions-component>
+            </div>
           </div>
         </td>
       </tr>
diff --git a/app/assets/javascripts/vue_common_component/commit.js.es6 b/app/assets/javascripts/vue_common_component/commit.js.es6
index 44f94dffb5c..25c1c27bee7 100644
--- a/app/assets/javascripts/vue_common_component/commit.js.es6
+++ b/app/assets/javascripts/vue_common_component/commit.js.es6
@@ -3,7 +3,7 @@
 (() => {
   window.gl = window.gl || {};
 
-  window.gl.commitComponent = Vue.component('commit-component', {
+  window.gl.CommitComponent = Vue.component('commit-component', {
 
     props: {
       /**
diff --git a/app/views/projects/environments/index.html.haml b/app/views/projects/environments/index.html.haml
index 532b617b7b8..050c87b8ab0 100644
--- a/app/views/projects/environments/index.html.haml
+++ b/app/views/projects/environments/index.html.haml
@@ -43,6 +43,8 @@
 
     .commit-icon-svg.hidden
       = custom_icon("icon_commit")
+    .play-icon-svg.hidden
+      = custom_icon("icon_play")
 
     .table-holder{ "v-if" => "!loading && state.environments.length" }
       %table.table.ci-table.environments
-- 
GitLab