Merge "Checks table: Order checks according to state and then name"
diff --git a/gr-checks/gr-checks-view.html b/gr-checks/gr-checks-view.html
index 49e09c7..67129ee 100644
--- a/gr-checks/gr-checks-view.html
+++ b/gr-checks/gr-checks-view.html
@@ -1,3 +1,4 @@
+<link rel="import" href="gr-checks-status.html">
 <dom-module id="gr-checks-view">
   <template>
     <style>
diff --git a/gr-checks/gr-checks-view.js b/gr-checks/gr-checks-view.js
index 6d54eb2..e709b28 100644
--- a/gr-checks/gr-checks-view.js
+++ b/gr-checks/gr-checks-view.js
@@ -2,6 +2,17 @@
   'use strict';
 
   const Defs = {};
+
+  const Statuses = window.Gerrit.Checks.Statuses;
+  const StatusPriorityOrder = [
+    Statuses.FAILED,
+    Statuses.SCHEDULED,
+    Statuses.RUNNING,
+    Statuses.SUCCESSFUL,
+    Statuses.NOT_STARTED,
+    Statuses.NOT_RELEVANT,
+  ];
+
   /**
    * @typedef {{
    *   _number: number,
@@ -46,6 +57,24 @@
       '_fetchChecks(change, revision, getChecks)',
     ],
 
+
+    _orderChecks(a, b) {
+      if (a.state != b.state) {
+        let indexA = StatusPriorityOrder.indexOf(a.state);
+        let indexB = StatusPriorityOrder.indexOf(b.state);
+        if (indexA != -1 && indexB != -1) {
+          return indexA - indexB;
+        }
+        return indexA == -1 ? 1 : -1;
+      }
+      if (a.state === Statuses.FAILED) {
+        if (a.blocking && b.blocking && a.blocking.length !== b.blocking.length) {
+          return a.blocking.length == 0 ? 1 : -1;
+        }
+      }
+      return a.checker_name.localeCompare(b.checker_name);
+    },
+
     /**
      * @param {!Defs.Change} change
      * @param {!Defs.Revision} revision
@@ -54,6 +83,7 @@
     _fetchChecks(change, revision, getChecks) {
       getChecks(change._number, revision._number).then(checks => {
         if (checks && checks.length) {
+          checks.sort(this._orderChecks);
           this.set('_checks', checks);
           this.set('_status', LoadingStatus.RESULTS);
         } else {