Restyling of the plugins list on a single table

Show installed plugins, upgrades and new plugins in a single table
with the rendering of the actions accordingly (up-to-date, install or
upgrade)

Change-Id: I812c2a436ed67b0d8abd333c4b80c682baace2b0
diff --git a/src/main/resources/static/css/style.css b/src/main/resources/static/css/style.css
index ff0df76..e1d4044 100644
--- a/src/main/resources/static/css/style.css
+++ b/src/main/resources/static/css/style.css
@@ -18,4 +18,17 @@
 
 .main {
   margin-top: 51px;
+}
+
+button.btn-xs {
+  width: 65px;
+}
+
+.label-success {
+  background-color: #888888;
+}
+
+div.top-header {
+  padding-left: 35px;
+  padding-right: 35px;
 }
\ No newline at end of file
diff --git a/src/main/resources/static/index.html b/src/main/resources/static/index.html
index 3868747..7effbee 100644
--- a/src/main/resources/static/index.html
+++ b/src/main/resources/static/index.html
@@ -16,7 +16,7 @@
 
 <body role="document">
   <nav class="navbar navbar-inverse navbar-fixed-top">
-    <div class="container">
+    <div class="container top-header">
       <div class="navbar-header">
         <a class="navbar-brand" href="#">Gerrit Plugin Manager</a>
       </div>
@@ -24,13 +24,14 @@
   </nav>
   <div class="container main" role="main"
     ng-controller="LoadInstalledPlugins as plugins">
-    <div class="col-md-6">
-      <h2>Loaded</h2>
+    <div class="col-md-12">
       <table class="table table-striped">
         <thead>
           <tr>
             <th>Plugin Name</th>
             <th>Version</th>
+            <th>Upgrade / New Version Available</th>
+            <th>Latest Commit</th>
             <th>Actions</th>
           </tr>
         </thead>
@@ -38,38 +39,23 @@
           <tr ng-repeat="(key, prop) in plugins.list">
             <td>{{key}}</td>
             <td>{{prop.version}}</td>
-            <td></td>
-          </tr>
-        </tbody>
-      </table>
-    </div>
-    <div class="col-md-6">
-      <h2>Available</h2>
-      <table class="table table-striped">
-        <thead>
-          <tr>
-            <th>Plugin Name</th>
-            <th>Version</th>
-            <th>SHA1</th>
-            <th>Install</th>
-          </tr>
-        </thead>
-        <tbody>
-          <tr id="{{key}}-{{prop.version}}"
-            ng-repeat="(key, prop) in plugins.available">
-            <td>{{key}}</td>
-            <td>{{prop.version}}</td>
+            <td>{{prop.update_version}}</td>
             <td>{{prop.sha1}}</td>
             <td>
               <h5>
                 <span id="installing-{{key}}"
-                  class="label label-default hidden">Installing</span> <span
+                  class="label label-default hidden">Installing</span>
+                <span
                   id="installed-{{key}}"
-                  class="label label-success hidden">Installed</span> <span
+                  class="label label-success {{ (prop.version != '' && prop.update_version == '') ? '':'hidden' }}">Up to date</span>
+                <span
                   id="failed-{{key}}" class="label label-warning hidden">Failed</span>
                 <button id="{{key}}" type="button"
-                  class="btn btn-xs btn-primary"
+                  class="btn btn-xs btn-primary {{ (prop.version == '' && prop.update_version != undefined) ? '':'hidden' }}"
                   ng-click="install(prop.id,prop.url)">Install</button>
+                <button id="{{key}}" type="button"
+                  class="btn btn-xs btn-primary {{ (prop.version != '' && prop.update_version != '') ? '':'hidden' }}"
+                  ng-click="install(prop.id,prop.url)">Upgrade</button>
               </h5>
             </td>
           </tr>
diff --git a/src/main/resources/static/js/plugin-manager.js b/src/main/resources/static/js/plugin-manager.js
index 5b2a695..f721d42 100644
--- a/src/main/resources/static/js/plugin-manager.js
+++ b/src/main/resources/static/js/plugin-manager.js
@@ -24,7 +24,19 @@
       $scope.refreshInstalled = function() {
         $http.get('/plugins/?all', plugins.httpConfig).then(
             function successCallback(response) {
-              plugins.list = response.data;
+
+              angular.forEach(response.data, function(plugin) {
+                plugins.list[plugin.id] = {
+                    id: plugin.id,
+                    index_url: plugin.index_url,
+                    version: plugin.version,
+                    sha1: '',
+                    url: plugin.url,
+                    update_version: ''
+                }
+              });
+
+              $scope.refreshAvailable();
             }, function errorCallback(response) {
             });
       }
@@ -32,6 +44,26 @@
       $scope.refreshAvailable = function() {
         $http.get('/plugins/plugin-manager/available', plugins.httpConfig)
             .then(function successCallback(response) {
+
+              angular.forEach(response.data, function(plugin) {
+                var currPlugin = plugins.list[plugin.id];
+
+                if(currPlugin === undefined) {
+                  currPlugin = {
+                      id: plugin.id,
+                      index_url: '',
+                      version: ''
+                  }
+                }
+
+                if(plugin.version != currPlugin.version) {
+                  currPlugin.update_version = plugin.version;
+                }
+                currPlugin.sha1 = plugin.sha1;
+                currPlugin.url = plugin.url;
+
+                plugins.list[plugin.id] = currPlugin;
+              });
               plugins.available = response.data;
             }, function errorCallback(response) {
             });
@@ -53,7 +85,6 @@
       }
 
       $scope.refreshInstalled();
-      $scope.refreshAvailable();
     });
 
 app.config(function($httpProvider) {