Allow account hovercard without change data

This restores the ability of plugins like code-owners to render account
chips with working hovercard even when they don't have change data,
which was broken by Change 339421.

https://imgur.com/a/x5ImHhr

Release-Notes: skip
Google-Bug-Id: b/244529582
Change-Id: I08a6e22676ec9162d6754a134e909433c555095e
diff --git a/polygerrit-ui/app/elements/shared/gr-hovercard-account/gr-hovercard-account.ts b/polygerrit-ui/app/elements/shared/gr-hovercard-account/gr-hovercard-account.ts
index 5a64b1d..048a699 100644
--- a/polygerrit-ui/app/elements/shared/gr-hovercard-account/gr-hovercard-account.ts
+++ b/polygerrit-ui/app/elements/shared/gr-hovercard-account/gr-hovercard-account.ts
@@ -157,8 +157,7 @@
   }
 
   private renderContent() {
-    if (!this._isShowing || !this.change) return;
-    const voteableText = computeVoteableText(this.change, this.account);
+    if (!this._isShowing) return;
     return html`
       <div class="top">
         <div class="avatar">
@@ -170,7 +169,16 @@
         </div>
       </div>
       ${this.renderAccountStatusPlugins()} ${this.renderAccountStatus()}
-      ${this.renderLinks()}
+      ${this.renderLinks()} ${this.renderChangeRelatedInfoAndActions()}
+    `;
+  }
+
+  private renderChangeRelatedInfoAndActions() {
+    if (this.change === undefined) {
+      return;
+    }
+    const voteableText = computeVoteableText(this.change, this.account);
+    return html`
       ${voteableText
         ? html`
             <div class="voteable">
diff --git a/polygerrit-ui/app/elements/shared/gr-hovercard-account/gr-hovercard-account_test.ts b/polygerrit-ui/app/elements/shared/gr-hovercard-account/gr-hovercard-account_test.ts
index 20e9675..88c4081 100644
--- a/polygerrit-ui/app/elements/shared/gr-hovercard-account/gr-hovercard-account_test.ts
+++ b/polygerrit-ui/app/elements/shared/gr-hovercard-account/gr-hovercard-account_test.ts
@@ -95,6 +95,45 @@
     );
   });
 
+  test('renders without change data', async () => {
+    const elementWithoutChange = await fixture<GrHovercardAccount>(
+      html`<gr-hovercard-account class="hovered" .account=${ACCOUNT}>
+      </gr-hovercard-account>`
+    );
+    await elementWithoutChange.show({});
+    assert.shadowDom.equal(
+      elementWithoutChange,
+      /* HTML */ `
+        <div id="container" role="tooltip" tabindex="-1">
+          <div class="top">
+            <div class="avatar">
+              <gr-avatar hidden="" imagesize="56"> </gr-avatar>
+            </div>
+            <div class="account">
+              <h3 class="heading-3 name">Kermit The Frog</h3>
+              <div class="email">kermit@gmail.com</div>
+            </div>
+          </div>
+          <gr-endpoint-decorator name="hovercard-status">
+            <gr-endpoint-param name="account"> </gr-endpoint-param>
+          </gr-endpoint-decorator>
+          <div class="status">
+            <span class="title"> About me: </span>
+            <span class="value"> I am a frog </span>
+          </div>
+          <div class="links">
+            <gr-icon class="linkIcon" icon="link"> </gr-icon>
+            <a href=""> Changes </a>
+            ยท
+            <a href=""> Dashboard </a>
+          </div>
+        </div>
+      `
+    );
+    elementWithoutChange.mouseHide(new MouseEvent('click'));
+    await elementWithoutChange.updateComplete;
+  });
+
   test('account name is shown', () => {
     const name = queryAndAssert<HTMLHeadingElement>(element, '.name');
     assert.equal(name.innerText, 'Kermit The Frog');