Merge "Return PATCHSET_LEVEL comments to emails"
diff --git a/polygerrit-ui/app/elements/change/gr-submit-requirements/gr-submit-requirements.ts b/polygerrit-ui/app/elements/change/gr-submit-requirements/gr-submit-requirements.ts
index 724d803..2175e04 100644
--- a/polygerrit-ui/app/elements/change/gr-submit-requirements/gr-submit-requirements.ts
+++ b/polygerrit-ui/app/elements/change/gr-submit-requirements/gr-submit-requirements.ts
@@ -28,9 +28,11 @@
 import {unique} from '../../../utils/common-util';
 import {
   extractAssociatedLabels,
+  hasVotes,
   iconForStatus,
 } from '../../../utils/label-util';
 import {fontStyles} from '../../../styles/gr-font-styles';
+import {charsOnly} from '../../../utils/string-util';
 
 @customElement('gr-submit-requirements')
 export class GrSubmitRequirements extends LitElement {
@@ -117,7 +119,9 @@
         </thead>
         <tbody>
           ${submit_requirements.map(
-            requirement => html`<tr id="requirement-${requirement.name}">
+            requirement => html`<tr
+              id="requirement-${charsOnly(requirement.name)}"
+            >
               <td>${this.renderStatus(requirement.status)}</td>
               <td class="name">
                 <gr-limited-text
@@ -134,7 +138,7 @@
       ${submit_requirements.map(
         requirement => html`
           <gr-submit-requirement-hovercard
-            for="requirement-${requirement.name}"
+            for="requirement-${charsOnly(requirement.name)}"
             .requirement="${requirement}"
             .change="${this.change}"
             .account="${this.account}"
@@ -159,11 +163,23 @@
 
   renderVotes(requirement: SubmitRequirementResultInfo) {
     const requirementLabels = extractAssociatedLabels(requirement);
-    const labels = this.change?.labels ?? {};
+    const allLabels = this.change?.labels ?? {};
+    const associatedLabels = Object.keys(allLabels).filter(label =>
+      requirementLabels.includes(label)
+    );
 
-    return Object.keys(labels)
-      .filter(label => requirementLabels.includes(label))
-      .map(label => this.renderLabelVote(label, labels));
+    const everyAssociatedLabelsIsWithoutVotes = associatedLabels.every(
+      label => {
+        const labelInfo = allLabels[label];
+        if (!isDetailedLabelInfo(labelInfo)) return true;
+        return !hasVotes(labelInfo);
+      }
+    );
+    if (everyAssociatedLabelsIsWithoutVotes) return html`No votes`;
+
+    return associatedLabels.map(label =>
+      this.renderLabelVote(label, allLabels)
+    );
   }
 
   renderLabelVote(label: string, labels: LabelNameToInfoMap) {
diff --git a/polygerrit-ui/app/utils/label-util.ts b/polygerrit-ui/app/utils/label-util.ts
index 16e6803..066c7cd 100644
--- a/polygerrit-ui/app/utils/label-util.ts
+++ b/polygerrit-ui/app/utils/label-util.ts
@@ -121,6 +121,13 @@
   return label.all?.filter(x => x._account_id === account._account_id)[0];
 }
 
+export function hasVotes(labelInfo: DetailedLabelInfo) {
+  return (labelInfo.all ?? []).some(
+    approval =>
+      getLabelStatus(labelInfo, approval.value) !== LabelStatus.NEUTRAL
+  );
+}
+
 export function labelCompare(labelName1: string, labelName2: string) {
   if (labelName1 === CODE_REVIEW && labelName2 === CODE_REVIEW) return 0;
   if (labelName1 === CODE_REVIEW) return -1;