Merge "Improve atom explanations display"
diff --git a/polygerrit-ui/app/elements/change/gr-submit-requirement-hovercard/gr-submit-requirement-hovercard.ts b/polygerrit-ui/app/elements/change/gr-submit-requirement-hovercard/gr-submit-requirement-hovercard.ts
index 9b48947..a39917d 100644
--- a/polygerrit-ui/app/elements/change/gr-submit-requirement-hovercard/gr-submit-requirement-hovercard.ts
+++ b/polygerrit-ui/app/elements/change/gr-submit-requirement-hovercard/gr-submit-requirement-hovercard.ts
@@ -3,10 +3,12 @@
  * Copyright 2021 Google LLC
  * SPDX-License-Identifier: Apache-2.0
  */
+import {css, html, LitElement} from 'lit';
+import {customElement, property} from 'lit/decorators.js';
+import {join} from 'lit/directives/join.js';
 import '../../shared/gr-button/gr-button';
 import '../../shared/gr-icon/gr-icon';
 import '../../shared/gr-label-info/gr-label-info';
-import {customElement, property} from 'lit/decorators.js';
 import {
   AccountInfo,
   ChangeStatus,
@@ -22,7 +24,6 @@
   iconForRequirement,
 } from '../../../utils/label-util';
 import {ParsedChangeInfo} from '../../../types/types';
-import {css, html, LitElement} from 'lit';
 import {HovercardMixin} from '../../../mixins/hovercard-mixin/hovercard-mixin';
 import {fontStyles} from '../../../styles/gr-font-styles';
 import {DraftsAction} from '../../../constants/constants';
@@ -133,6 +134,12 @@
         .expression .passing.atom {
           border-bottom: 2px solid var(--success-foreground);
         }
+        .explanations .failing.atom {
+          border-bottom: 2px solid var(--error-foreground);
+        }
+        .explanations .passing.atom {
+          border-bottom: 2px solid var(--success-foreground);
+        }
         .button gr-icon {
           color: inherit;
         }
@@ -381,10 +388,7 @@
   }
 
   private getTitleFromPart(part: SubmitRequirementExpressionPart) {
-    let title = this.getTitleFromAtomStatus(part.atomStatus!);
-    if (part.atomExplanation) {
-      title += `: ${part.atomExplanation}`;
-    }
+    const title = this.getTitleFromAtomStatus(part.atomStatus!);
     return title;
   }
 
@@ -406,12 +410,36 @@
     expression?: SubmitRequirementExpressionInfo
   ) {
     if (!expression?.expression) return '';
+    const atoms = atomizeExpression(expression);
+    let explanations = html``;
+    if (atoms.some(part => part.atomExplanation)) {
+      explanations = html`
+        <br /><br />
+        Atom explanations:<br />
+        <span class="explanations">
+          ${join(
+            atoms
+              .filter(part => part.atomExplanation)
+              .map(
+                part => html`
+                  <span
+                    class=${this.getClassFromAtomStatus(part.atomStatus!)}
+                    title=${this.getTitleFromPart(part)}
+                    >${part.value}</span
+                  >: <span class="explanation">${part.atomExplanation}</span>
+                `
+              ),
+            html`<br />`
+          )}
+        </span>
+      `;
+    }
     return html`
       <div class="section condition">
         <div class="sectionContent">
           ${name}:<br />
           <span class="expression">
-            ${atomizeExpression(expression).map(part =>
+            ${atoms.map(part =>
               part.isAtom
                 ? html`<span
                     class=${this.getClassFromAtomStatus(part.atomStatus!)}
@@ -421,6 +449,7 @@
                 : part.value
             )}
           </span>
+          ${explanations}
         </div>
       </div>
     `;