UI: Always show the tasks summary

If there are no tasks, show 'No tasks' as the summary. Also, show
chips for invalid, waiting, duplicate and successful tasks.

Screenshots: https://imgur.com/a/kXgOiUY

Change-Id: I383291e3aae3cb69dc6d863d1c35871c19044d6b
diff --git a/gr-task-plugin/gr-task-chip_html.js b/gr-task-plugin/gr-task-chip_html.js
index af7338f..68e1d0c 100644
--- a/gr-task-plugin/gr-task-chip_html.js
+++ b/gr-task-plugin/gr-task-chip_html.js
@@ -35,6 +35,28 @@
       position: relative;
       top: 2px;
     }
+    .taskSummaryChip.success {
+      border-color: var(--success-foreground);
+      background: var(--success-background);
+    }
+    .taskSummaryChip.success:hover {
+      background: var(--success-background-hover);
+      box-shadow: var(--elevation-level-1);
+    }
+    .taskSummaryChip.success:focus-within {
+      background: var(--success-background-focus);
+    }
+    .taskSummaryChip.waiting {
+      border-color: var(--warning-foreground);
+      background: var(--warning-background);
+    }
+    .taskSummaryChip.waiting:hover {
+      background: var(--warning-background-hover);
+      box-shadow: var(--elevation-level-1);
+    }
+    .taskSummaryChip.waiting:focus-within {
+      background: var(--warning-background-focus);
+    }
     .taskSummaryChip.ready {
       border-color: var(--warning-foreground);
       background: var(--warning-background);
@@ -46,6 +68,30 @@
     .taskSummaryChip.ready:focus-within {
       background: var(--warning-background-focus);
     }
+    .taskSummaryChip.invalid {
+      color: var(--error-foreground);
+      border-color: var(--error-foreground);
+      background: var(--error-background);
+    }
+    .taskSummaryChip.invalid:hover {
+      background: var(--error-background-hover);
+      box-shadow: var(--elevation-level-1);
+    }
+    .taskSummaryChip.invalid:focus-within {
+      background: var(--error-background-focus);
+    }
+    .taskSummaryChip.duplicate {
+      color: var(--error-foreground);
+      border-color: var(--error-foreground);
+      background: var(--error-background);
+    }
+    .taskSummaryChip.duplicate:hover {
+      background: var(--error-background-hover);
+      box-shadow: var(--elevation-level-1);
+    }
+    .taskSummaryChip.duplicate:focus-within {
+      background: var(--error-background-focus);
+    }
     .taskSummaryChip.fail {
       color: var(--error-foreground);
       border-color: var(--error-foreground);
diff --git a/gr-task-plugin/gr-task-plugin.js b/gr-task-plugin/gr-task-plugin.js
index deec593..52b0a9b 100644
--- a/gr-task-plugin/gr-task-plugin.js
+++ b/gr-task-plugin/gr-task-plugin.js
@@ -82,7 +82,26 @@
         notify: true,
         value: 0,
       },
-
+      _invalid_count: {
+        type: Number,
+        notify: true,
+        value: 0,
+      },
+      _waiting_count: {
+        type: Number,
+        notify: true,
+        value: 0,
+      },
+      _duplicate_count: {
+        type: Number,
+        notify: true,
+        value: 0,
+      },
+      _pass_count: {
+        type: Number,
+        notify: true,
+        value: 0,
+      },
       _isPending: {
         type: Boolean,
         value: true,
@@ -127,6 +146,10 @@
               detail: {
                 ready_count: this._ready_count,
                 fail_count: this._fail_count,
+                invalid_count: this._invalid_count,
+                waiting_count: this._waiting_count,
+                duplicate_count: this._duplicate_count,
+                pass_count: this._pass_count,
               },
               composed: true, bubbles: true,
             }));
@@ -200,6 +223,18 @@
       case 'READY':
         this._ready_count++;
         break;
+      case 'INVALID':
+        this._invalid_count++;
+        break;
+      case 'WAITING':
+        this._waiting_count++;
+        break;
+      case 'DUPLICATE':
+        this._duplicate_count++;
+        break;
+      case 'PASS':
+        this._pass_count++;
+        break;
     }
   }
 
diff --git a/gr-task-plugin/gr-task-summary.js b/gr-task-plugin/gr-task-summary.js
index 6e54268..1e23ebe 100644
--- a/gr-task-plugin/gr-task-summary.js
+++ b/gr-task-plugin/gr-task-summary.js
@@ -40,6 +40,30 @@
         notify: true,
         value: 0,
       },
+
+      invalid_count: {
+        type: Number,
+        notify: true,
+        value: 0,
+      },
+
+      waiting_count: {
+        type: Number,
+        notify: true,
+        value: 0,
+      },
+
+      duplicate_count: {
+        type: Number,
+        notify: true,
+        value: 0,
+      },
+
+      pass_count: {
+        type: Number,
+        notify: true,
+        value: 0,
+      },
     };
   }
 
@@ -49,11 +73,17 @@
     document.addEventListener('tasks-loaded', e => {
       this.ready_count = e.detail.ready_count;
       this.fail_count = e.detail.fail_count;
+      this.invalid_count = e.detail.invalid_count;
+      this.waiting_count = e.detail.waiting_count;
+      this.duplicate_count = e.detail.duplicate_count;
+      this.pass_count = e.detail.pass_count;
     });
   }
 
-  _can_show(ready_count, fail_count) {
-    return ready_count || fail_count;
+  _can_show_chips(ready_count, fail_count, invalid_count,
+      waiting_count, duplicate_count, pass_count) {
+    return ready_count || fail_count || invalid_count ||
+      waiting_count || duplicate_count || pass_count;
   }
 }
 
diff --git a/gr-task-plugin/gr-task-summary_html.js b/gr-task-plugin/gr-task-summary_html.js
index 1b47201..2e567c3 100644
--- a/gr-task-plugin/gr-task-summary_html.js
+++ b/gr-task-plugin/gr-task-summary_html.js
@@ -66,13 +66,22 @@
       margin-left: var(--spacing-m);
     }
   </style>
-  <div class="task_summary" hidden$="[[!_can_show(ready_count, fail_count)]]">
+  <div class="task_summary">
     <table>
       <tr>
         <td class="key">Tasks</td>
         <td class="value">
-          <gr-task-chip chip_style="fail" hidden$="[[!fail_count]]">[[fail_count]] blocked</gr-task-chip>
-          <gr-task-chip chip_style="ready" hidden$="[[!ready_count]]">[[ready_count]] needed</gr-task-chip>
+          <template is="dom-if" if="[[_can_show_chips(ready_count, fail_count, invalid_count, waiting_count, duplicate_count, pass_count)]]">
+            <gr-task-chip chip_style="fail" hidden$="[[!fail_count]]">[[fail_count]] blocked</gr-task-chip>
+            <gr-task-chip chip_style="invalid" hidden$="[[!invalid_count]]">[[invalid_count]] invalid</gr-task-chip>
+            <gr-task-chip chip_style="duplicate" hidden$="[[!duplicate_count]]">[[duplicate_count]] duplicate</gr-task-chip>
+            <gr-task-chip chip_style="ready" hidden$="[[!ready_count]]">[[ready_count]] ready</gr-task-chip>
+            <gr-task-chip chip_style="waiting" hidden$="[[!waiting_count]]">[[waiting_count]] waiting</gr-task-chip>
+            <gr-task-chip chip_style="success" hidden$="[[!pass_count]]">[[pass_count]] passed</gr-task-chip>
+          </template>
+          <template is="dom-if" if="[[!_can_show_chips(ready_count, fail_count, invalid_count, waiting_count, duplicate_count, pass_count)]]">
+              <td>No tasks</td>
+          </template>
         </td>
       </tr>
     </table>