Add re run support for checks in the table

Change-Id: Id3b574ff4d8c67dbe7a7ecb331ffba74bc1b27c3
diff --git a/gr-checks/gr-checks-item.html b/gr-checks/gr-checks-item.html
index 602cffb..374f76b 100644
--- a/gr-checks/gr-checks-item.html
+++ b/gr-checks/gr-checks-item.html
@@ -38,20 +38,21 @@
     <td>[[_startTime]]</td>
     <td>[[_duration]]</td>
     <td>
-        <a href$="[[check.url]]" target="_blank" class="log">
-          <gr-button link no-uppercase disabled="[[!check.url]]">
-            View log
-          </gr-button>
-        </a>
-<!--      disabling re-run button until the API for rerun is ready-->
-<!--        <gr-button-->
-<!--          link-->
-<!--          no-uppercase-->
-<!--          on-tap="handleClick">-->
-<!--          Re-run-->
-<!--        </gr-button>-->
-      </td>
-      <td>[[check.checker_description]]</td>
+      <a href$="[[check.url]]" target="_blank" class="log">
+        <gr-button link no-uppercase disabled="[[!check.url]]">
+          View log
+        </gr-button>
+      </a>
+    </td>
+    <td>
+      <gr-button
+        link
+        no-uppercase
+        on-tap="_handleReRunClicked">
+        Re-run
+      </gr-button>
+    </td>
+    <td>[[check.checker_description]]</td>
   </template>
   <script src="gr-checks-item.js"></script>
 </dom-module>
diff --git a/gr-checks/gr-checks-item.js b/gr-checks/gr-checks-item.js
index 2c0d98b..0f04f56 100644
--- a/gr-checks/gr-checks-item.js
+++ b/gr-checks/gr-checks-item.js
@@ -29,7 +29,6 @@
       /** @type {Defs.Check} */
       check: Object,
       /** @type {function(string): !Promise<!Object>} */
-      retryCheck: Function,
       _startTime: {
         type: String,
         computed: '_computeStartTime(check)',
@@ -49,6 +48,13 @@
     },
 
     /**
+     * Fired when the retry check button is pressed.
+     *
+     * @event retry-check
+     */
+
+
+    /**
      * @param {!Defs.Check} check
      * @return {string}
      */
@@ -87,9 +93,9 @@
     _computeRequiredForMerge(check) {
       return (check.blocking && check.blocking.length === 0) ? "Optional" : "Required";
     },
-    handleClick(event) {
-      event.preventDefault();
-      this.retryCheck(this.check.checker_uuid);
+    _handleReRunClicked(event) {
+      this.fire('retry-check',{uuid: this.check.checker_uuid},
+        {bubbles: false});
     },
   });
 
diff --git a/gr-checks/gr-checks-view.html b/gr-checks/gr-checks-view.html
index ee22cbb..40b6390 100644
--- a/gr-checks/gr-checks-view.html
+++ b/gr-checks/gr-checks-view.html
@@ -136,26 +136,27 @@
             <th class="topHeader">Started</th>
             <th class="topHeader">Duration</th>
             <th class="topHeader"><!-- actions --></th>
+            <th class="topHeader"><!-- re-run --></th>
             <th class="topHeader">Description</th>
           </tr>
         </thead>
         <tbody>
           <template is="dom-repeat" items="[[_checks]]" as="check">
             <tr>
-              <gr-checks-item on-toggle-check-message="_toggleCheckMessage"
-                check="[[check]]" retry-check="[[retryCheck]]">
+              <gr-checks-item on-retry-check="_handleRetryCheck" on-toggle-check-message="_toggleCheckMessage"
+                check="[[check]]">
               </gr-checks-item>
             </tr>
             <template is="dom-if" if="[[check.showCheckMessage]]">
               <tr>
-                <td colspan="9" class="check-message-heading">
+                <td colspan="10" class="check-message-heading">
                   <span class="message-heading">
                     Message
                   </span>
                 </td>
               </tr>
               <tr>
-                <td colspan="9" class="check-message">
+                <td colspan="10" class="check-message">
                   <span class="message"> [[check.message]] </span>
                 </td>
               </tr>
diff --git a/gr-checks/gr-checks-view.js b/gr-checks/gr-checks-view.js
index c312163..3aa88b8 100644
--- a/gr-checks/gr-checks-view.js
+++ b/gr-checks/gr-checks-view.js
@@ -47,7 +47,6 @@
       /** @type {function(string): !Promise<Boolean>} */
       isConfigured: Function,
       /** @type {function(string, string): !Promise<!Object>} */
-      retryCheck: Function,
       pluginRestApi: Object,
       _checks: Object,
       _status: {
@@ -119,6 +118,22 @@
       return a.checker_name.localeCompare(b.checker_name);
     },
 
+    _handleRetryCheck(e) {
+      const uuid = e.detail.uuid;
+      const retryCheck = (change, revision, uuid) => {
+        return this.pluginRestApi.post(
+          '/changes/' + change + '/revisions/' + revision + '/checks/' + uuid + '/rerun'
+        )
+      }
+      retryCheck(this.change._number, this.revision._number, uuid).then(
+        res => {
+          this._fetchChecks(this.change, this.revision, this.getChecks);
+        }, e => {
+          console.error(e);
+        }
+      )
+    },
+
     /**
      * @param {!Defs.Change} change
      * @param {!Defs.Revision} revision
diff --git a/gr-checks/gr-checks.html b/gr-checks/gr-checks.html
index 2108121..ceed087 100644
--- a/gr-checks/gr-checks.html
+++ b/gr-checks/gr-checks.html
@@ -39,8 +39,6 @@
         'gr-checks-view').onAttached(
         view => {
           view['isConfigured'] = (repository) => Promise.resolve(true);
-          // TODO(brohlfs): Implement retry.
-          view['retryCheck'] = (buildId) => undefined;
           view['getChecks'] = getChecks;
         });
       });