Append change status, if applicable

The needed code got brought over from gr-related-changes-list.js.
Not all code paths are reachable, as we only have shallow ChangeInfo
objects. We leave the code as untouched as possible to allow for
easier updating from gr-related-changes-list.js.

Change-Id: Ia32a4bab4282770acfd4896ce3c16f4457d3e5ea
diff --git a/gr-zuul/gr-zuul.js b/gr-zuul/gr-zuul.js
index fe0c1f6..89e5527 100644
--- a/gr-zuul/gr-zuul.js
+++ b/gr-zuul/gr-zuul.js
@@ -58,6 +58,43 @@
     });
   }
 
+  // copied from gr-related-changes-list.js, which is inaccessible from here.
+  // Resolved uses of `this.ChangeStatus.[...]`, as that's inaccessible from here too.
+  // Removed _isIndirectAncestor check, as the needed data is inaccessible from here.
+  // Not all code paths are reachable, as we only have shallow ChangeInfo objects. We leave the
+  // code here nonetheless, to allow for easier updating from gr-related-changes-list.js.
+  _computeChangeStatusClass(change) {
+    const classes = ['status'];
+    if (change._revision_number != change._current_revision_number) {
+      classes.push('notCurrent');
+    } else if (change.submittable) {
+      classes.push('submittable');
+    } else if (change.status == 'NEW') {
+      classes.push('hidden');
+    }
+    return classes.join(' ');
+  }
+
+  // copied from gr-related-changes-list.js, which is inaccessible from here.
+  // Resolved uses of `this.ChangeStatus.[...]`, as that's inaccessible from here too.
+  // Removed _isIndirectAncestor check, as the needed data is inaccessible from here.
+  // Not all code paths are reachable, as we only have shallow ChangeInfo objects. We leave the
+  // code here nonetheless, to allow for easier updating from gr-related-changes-list.js.
+  _computeChangeStatus(change) {
+    switch (change.status) {
+      case 'MERGED':
+        return 'Merged';
+      case 'ABANDONED':
+        return 'Abandoned';
+    }
+    if (change._revision_number != change._current_revision_number) {
+      return 'Not current';
+    } else if (change.submittable) {
+      return 'Submittable';
+    }
+    return '';
+  }
+
   setHidden(hidden) {
     if (this.hidden != hidden) {
       this.hidden = hidden;
diff --git a/gr-zuul/gr-zuul_html.js b/gr-zuul/gr-zuul_html.js
index e94376f..5e208d4 100644
--- a/gr-zuul/gr-zuul_html.js
+++ b/gr-zuul/gr-zuul_html.js
@@ -63,6 +63,9 @@
       .missingFromThisServer {
         color: #d17171;
       }
+      .hidden {
+        display: none;
+      }
     </style>
     <template is="dom-if" if="[[_crd_loaded]]">
       <template is="dom-if" if="[[_isDependsOnSectionVisible()]]">
@@ -76,6 +79,9 @@
               >
                 [[item.project]]: [[item.branch]]: [[item.subject]]
               </a>
+              <span class$="[[_computeChangeStatusClass(item)]]">
+                ([[_computeChangeStatus(item)]])
+              </span>
               <template is="dom-if" if="[[_crd.cycle]]">
                 <span class="status dependencyCycleDetected">
                   (Dependency cycle detected)
@@ -106,6 +112,9 @@
               >
                 [[item.project]]: [[item.branch]]: [[item.subject]]
               </a>
+              <span class$="[[_computeChangeStatusClass(item)]]">
+                ([[_computeChangeStatus(item)]])
+              </span>
               <template is="dom-if" if="[[_crd.cycle]]">
                 <span class="status dependencyCycleDetected">
                   (Dependency cycle detected)