Merge "Fix all remaining lit lint errors"
diff --git a/polygerrit-ui/app/BUILD b/polygerrit-ui/app/BUILD
index 80e208d..c721c7d 100644
--- a/polygerrit-ui/app/BUILD
+++ b/polygerrit-ui/app/BUILD
@@ -280,5 +280,6 @@
         "--strict",
         "--rules.no-property-visibility-mismatch off",
         "--rules.no-incompatible-property-type off",
+        "--rules.no-incompatible-type-binding off",
     ],
 )
diff --git a/polygerrit-ui/app/elements/admin/gr-admin-view/gr-admin-view.ts b/polygerrit-ui/app/elements/admin/gr-admin-view/gr-admin-view.ts
index 762bffc..10ca808 100644
--- a/polygerrit-ui/app/elements/admin/gr-admin-view/gr-admin-view.ts
+++ b/polygerrit-ui/app/elements/admin/gr-admin-view/gr-admin-view.ts
@@ -62,6 +62,7 @@
 import {sharedStyles} from '../../../styles/shared-styles';
 import {LitElement, PropertyValues, css, html} from 'lit';
 import {customElement, property, state} from 'lit/decorators';
+import {ifDefined} from 'lit/directives/if-defined';
 
 const INTERNAL_GROUP_REGEX = /^[\da-f]{40}$/;
 
@@ -252,8 +253,7 @@
         </span>
         <gr-dropdown-list
           id="pageSelect"
-          lowercase
-          value=${this.computeSelectValue()}
+          value=${ifDefined(this.computeSelectValue())}
           .items=${this.subsectionLinks}
           @value-change=${this.handleSubsectionChange}
         >
diff --git a/polygerrit-ui/app/elements/admin/gr-create-change-dialog/gr-create-change-dialog.ts b/polygerrit-ui/app/elements/admin/gr-create-change-dialog/gr-create-change-dialog.ts
index bed1c54..119b905 100644
--- a/polygerrit-ui/app/elements/admin/gr-create-change-dialog/gr-create-change-dialog.ts
+++ b/polygerrit-ui/app/elements/admin/gr-create-change-dialog/gr-create-change-dialog.ts
@@ -142,8 +142,6 @@
           <span class="title">Provide base commit sha1 for change</span>
           <span class="value">
             <iron-input
-              maxlength="40"
-              placeholder="(optional)"
               .bindValue=${this.baseCommit}
               @bind-value-changed=${(e: BindValueChangeEvent) => {
                 this.baseCommit = e.detail.value;
@@ -161,8 +159,6 @@
           <span class="title">Enter topic for new change</span>
           <span class="value">
             <iron-input
-              maxlength="1024"
-              placeholder="(optional)"
               .bindValue=${this.topic}
               @bind-value-changed=${(e: BindValueChangeEvent) => {
                 this.topic = e.detail.value;
diff --git a/polygerrit-ui/app/elements/admin/gr-group-members/gr-group-members.ts b/polygerrit-ui/app/elements/admin/gr-group-members/gr-group-members.ts
index a4a910b..8a0068b 100644
--- a/polygerrit-ui/app/elements/admin/gr-group-members/gr-group-members.ts
+++ b/polygerrit-ui/app/elements/admin/gr-group-members/gr-group-members.ts
@@ -49,6 +49,7 @@
 import {tableStyles} from '../../../styles/gr-table-styles';
 import {LitElement, css, html} from 'lit';
 import {customElement, property, query, state} from 'lit/decorators';
+import {ifDefined} from 'lit/directives/if-defined';
 
 const SUGGESTIONS_LIMIT = 15;
 const SAVING_ERROR_TEXT =
@@ -305,7 +306,7 @@
   private renderIncludedGroupHref(group: GroupInfo) {
     if (group.url) {
       return html`
-        <a href=${this.computeGroupUrl(group.url)} rel="noopener">
+        <a href=${ifDefined(this.computeGroupUrl(group.url))} rel="noopener">
           ${group.name}
         </a>
       `;
diff --git a/polygerrit-ui/app/elements/admin/gr-group/gr-group.ts b/polygerrit-ui/app/elements/admin/gr-group/gr-group.ts
index 0b01d45..8faa5e7 100644
--- a/polygerrit-ui/app/elements/admin/gr-group/gr-group.ts
+++ b/polygerrit-ui/app/elements/admin/gr-group/gr-group.ts
@@ -182,7 +182,7 @@
             @text-changed=${this.handleNameTextChanged}
           ></gr-autocomplete>
         </span>
-        <span class="value" ?disabled=${this.computeGroupDisabled()}>
+        <span class="value">
           <gr-button
             id="inputUpdateNameBtn"
             ?disabled=${!groupNameEdited}
@@ -218,7 +218,7 @@
           >
           </gr-autocomplete>
         </span>
-        <span class="value" ?disabled=${this.computeGroupDisabled()}>
+        <span class="value">
           <gr-button
             id="inputUpdateOwnerBtn"
             ?disabled=${!groupOwnerNameEdited}
@@ -250,7 +250,7 @@
             @text-changed=${this.handleDescriptionTextChanged}
           ></gr-textarea>
         </div>
-        <span class="value" ?disabled=${this.computeGroupDisabled()}>
+        <span class="value">
           <gr-button
             ?disabled=${!groupDescriptionEdited}
             @click=${this.handleSaveDescription}
@@ -302,7 +302,7 @@
             </gr-select>
           </span>
         </section>
-        <span class="value" ?disabled=${this.computeGroupDisabled()}>
+        <span class="value">
           <gr-button
             ?disabled=${!groupOptionsEdited}
             @click=${this.handleSaveOptions}
diff --git a/polygerrit-ui/app/elements/admin/gr-repo-commands/gr-repo-commands.ts b/polygerrit-ui/app/elements/admin/gr-repo-commands/gr-repo-commands.ts
index b86c9b9..990b34d 100644
--- a/polygerrit-ui/app/elements/admin/gr-repo-commands/gr-repo-commands.ts
+++ b/polygerrit-ui/app/elements/admin/gr-repo-commands/gr-repo-commands.ts
@@ -137,7 +137,7 @@
             <gr-endpoint-decorator name="repo-command">
               <gr-endpoint-param name="config" .value=${this.repoConfig}>
               </gr-endpoint-param>
-              <gr-endpoint-param name="repoName" value="${this.repo}">
+              <gr-endpoint-param name="repoName" .value="${this.repo}">
               </gr-endpoint-param>
             </gr-endpoint-decorator>
           </div>
diff --git a/polygerrit-ui/app/elements/admin/gr-repo-detail-list/gr-repo-detail-list.ts b/polygerrit-ui/app/elements/admin/gr-repo-detail-list/gr-repo-detail-list.ts
index 02121f9..6186573 100644
--- a/polygerrit-ui/app/elements/admin/gr-repo-detail-list/gr-repo-detail-list.ts
+++ b/polygerrit-ui/app/elements/admin/gr-repo-detail-list/gr-repo-detail-list.ts
@@ -49,6 +49,7 @@
 import {customElement, query, property, state} from 'lit/decorators';
 import {BindValueChangeEvent} from '../../../types/events';
 import {assertIsDefined} from '../../../utils/common-util';
+import {ifDefined} from 'lit/directives/if-defined';
 
 const PGP_START = '-----BEGIN PGP SIGNATURE-----';
 
@@ -248,7 +249,7 @@
     return html`
       <tr class="table">
         <td class="${this.detailType} name">
-          <a href=${this.computeFirstWebLink(item)}>
+          <a href=${ifDefined(this.computeFirstWebLink(item))}>
             ${this.stripRefs(item.ref, this.detailType)}
           </a>
         </td>
@@ -467,7 +468,7 @@
 
   private computeFirstWebLink(repo: ProjectInfo | BranchInfo | TagInfo) {
     const webLinks = this.computeWeblink(repo);
-    return webLinks.length > 0 ? webLinks[0].url : null;
+    return webLinks.length > 0 ? webLinks[0].url : undefined;
   }
 
   // private but used in test
diff --git a/polygerrit-ui/app/elements/admin/gr-repo/gr-repo.ts b/polygerrit-ui/app/elements/admin/gr-repo/gr-repo.ts
index d21feae..5fc7bc8 100644
--- a/polygerrit-ui/app/elements/admin/gr-repo/gr-repo.ts
+++ b/polygerrit-ui/app/elements/admin/gr-repo/gr-repo.ts
@@ -599,7 +599,6 @@
             id="maxGitObjSizeIronInput"
             .bindValue=${this.repoConfig?.max_object_size_limit
               ?.configured_value}
-            ?disabled=${this.readOnly}
             @bind-value-changed=${this.handleMaxGitObjSizeBindValueChanged}
           >
             <input
diff --git a/polygerrit-ui/app/elements/admin/gr-rule-editor/gr-rule-editor.ts b/polygerrit-ui/app/elements/admin/gr-rule-editor/gr-rule-editor.ts
index 3b180df..4d0f2c4 100644
--- a/polygerrit-ui/app/elements/admin/gr-rule-editor/gr-rule-editor.ts
+++ b/polygerrit-ui/app/elements/admin/gr-rule-editor/gr-rule-editor.ts
@@ -25,6 +25,7 @@
 import {LitElement, PropertyValues, html, css} from 'lit';
 import {customElement, property, state} from 'lit/decorators';
 import {BindValueChangeEvent} from '../../../types/events';
+import {ifDefined} from 'lit/directives/if-defined';
 
 /**
  * Fired when the rule has been modified or removed.
@@ -223,7 +224,10 @@
             </select>
           </gr-select>
           ${this.renderMinAndMaxLabel()} ${this.renderMinAndMaxInput()}
-          <a class="groupPath" href="${this.computeGroupPath(this.groupId)}">
+          <a
+            class="groupPath"
+            href="${ifDefined(this.computeGroupPath(this.groupId))}"
+          >
             ${this.groupName}
           </a>
           <gr-select
diff --git a/polygerrit-ui/app/elements/change-list/gr-change-list-item/gr-change-list-item.ts b/polygerrit-ui/app/elements/change-list/gr-change-list-item/gr-change-list-item.ts
index c161204..12df6aa 100644
--- a/polygerrit-ui/app/elements/change-list/gr-change-list-item/gr-change-list-item.ts
+++ b/polygerrit-ui/app/elements/change-list/gr-change-list-item/gr-change-list-item.ts
@@ -54,6 +54,7 @@
 import {LitElement, css, html} from 'lit';
 import {customElement, property, state} from 'lit/decorators';
 import {submitRequirementsStyles} from '../../../styles/gr-submit-requirements-styles';
+import {ifDefined} from 'lit/directives/if-defined';
 
 enum ChangeSize {
   XS = 10,
@@ -81,7 +82,9 @@
     'gr-change-list-item': GrChangeListItem;
   }
 }
-
+/**
+ * @attr {Boolean} selected - change list item is selected by cursor
+ */
 @customElement('gr-change-list-item')
 export class GrChangeListItem extends LitElement {
   /** The logged-in user's account, or null if no user is logged in. */
@@ -307,7 +310,7 @@
     return html`
       <td class="cell subject">
         <a
-          title="${this.change?.subject}"
+          title="${ifDefined(this.change?.subject)}"
           href="${changeUrl}"
           @click=${() => this.handleChangeClick()}
         >
diff --git a/polygerrit-ui/app/elements/change-list/gr-change-list/gr-change-list.ts b/polygerrit-ui/app/elements/change-list/gr-change-list/gr-change-list.ts
index 92547e5..dfe4720b 100644
--- a/polygerrit-ui/app/elements/change-list/gr-change-list/gr-change-list.ts
+++ b/polygerrit-ui/app/elements/change-list/gr-change-list/gr-change-list.ts
@@ -27,7 +27,6 @@
 } from '../../core/gr-navigation/gr-navigation';
 import {getPluginEndpoints} from '../../shared/gr-js-api-interface/gr-plugin-endpoints';
 import {getPluginLoader} from '../../shared/gr-js-api-interface/gr-plugin-loader';
-import {isOwner} from '../../../utils/change-util';
 import {GrCursorManager} from '../../shared/gr-cursor-manager/gr-cursor-manager';
 import {
   AccountInfo,
@@ -35,7 +34,6 @@
   ServerInfo,
   PreferencesInput,
 } from '../../../types/common';
-import {hasAttention} from '../../../utils/attention-set-util';
 import {fire, fireEvent, fireReload} from '../../../utils/event-util';
 import {ScrollMode} from '../../../constants/constants';
 import {
@@ -55,7 +53,6 @@
 import {ValueChangedEvent} from '../../../types/events';
 
 const NUMBER_FIXED_COLUMNS = 3;
-const CLOSED_STATUS = ['MERGED', 'ABANDONED'];
 const LABEL_PREFIX_INVALID_PROLOG = 'Invalid-Prolog-Rules-Label-Name--';
 const MAX_SHORTCUT_CHARS = 5;
 
@@ -364,11 +361,6 @@
     labelNames: string[]
   ) {
     const ariaLabel = this.computeAriaLabel(change, changeSection.name);
-    const highlight = this.computeItemHighlight(
-      this.account,
-      change,
-      changeSection.name
-    );
     const selected = this.computeItemSelected(
       sectionIndex,
       index,
@@ -385,7 +377,6 @@
       <gr-change-list-item
         .account=${this.account}
         ?selected=${selected}
-        .highlight=${highlight}
         .change=${change}
         .config=${this.config}
         .sectionName=${changeSection.name}
@@ -605,20 +596,6 @@
       : undefined;
   }
 
-  private computeItemHighlight(
-    account?: AccountInfo,
-    change?: ChangeInfo,
-    sectionName?: string
-  ) {
-    if (!change || !account) return false;
-    if (CLOSED_STATUS.indexOf(change.status) !== -1) return false;
-    return (
-      hasAttention(account, change) &&
-      !isOwner(change, account) &&
-      sectionName === YOUR_TURN.name
-    );
-  }
-
   private nextChange() {
     this.isCursorMoving = true;
     this.cursor.next();
diff --git a/polygerrit-ui/app/elements/diff/gr-diff-image-viewer/gr-image-viewer.ts b/polygerrit-ui/app/elements/diff/gr-diff-image-viewer/gr-image-viewer.ts
index 32f5f39..290773b 100644
--- a/polygerrit-ui/app/elements/diff/gr-diff-image-viewer/gr-image-viewer.ts
+++ b/polygerrit-ui/app/elements/diff/gr-diff-image-viewer/gr-image-viewer.ts
@@ -30,6 +30,7 @@
 
 import {css, html, LitElement, PropertyValues} from 'lit';
 import {customElement, property, query, state} from 'lit/decorators';
+import {ifDefined} from 'lit/directives/if-defined';
 import {classMap} from 'lit/directives/class-map';
 import {StyleInfo, styleMap} from 'lit/directives/style-map';
 
@@ -435,7 +436,7 @@
             // layer.
             'pointer-events': this.showHighlight ? 'auto' : 'none',
           })}"
-          src="${this.diffHighlightSrc}"
+          src="${ifDefined(this.diffHighlightSrc)}"
         />
       </div>
     `;
diff --git a/polygerrit-ui/app/elements/diff/gr-patch-range-select/gr-patch-range-select.ts b/polygerrit-ui/app/elements/diff/gr-patch-range-select/gr-patch-range-select.ts
index c4ffad4..eeb636f 100644
--- a/polygerrit-ui/app/elements/diff/gr-patch-range-select/gr-patch-range-select.ts
+++ b/polygerrit-ui/app/elements/diff/gr-patch-range-select/gr-patch-range-select.ts
@@ -53,6 +53,7 @@
 import {subscribe} from '../../lit/subscription-controller';
 import {commentsModelToken} from '../../../models/comments/comments-model';
 import {resolve} from '../../../models/dependency';
+import {ifDefined} from 'lit/directives/if-defined';
 
 // Maximum length for patch set descriptions.
 const PATCH_DESC_MAX_LENGTH = 500;
@@ -205,7 +206,7 @@
     return html`<span class="filesWeblinks">
       ${fileLinks.map(
         weblink => html`
-          <a target="_blank" rel="noopener" href="${weblink.url}">
+          <a target="_blank" rel="noopener" href="${ifDefined(weblink.url)}">
             ${weblink.name}
           </a>
         `
diff --git a/polygerrit-ui/app/elements/shared/gr-label-info/gr-label-info.ts b/polygerrit-ui/app/elements/shared/gr-label-info/gr-label-info.ts
index 70de130..a0b3274 100644
--- a/polygerrit-ui/app/elements/shared/gr-label-info/gr-label-info.ts
+++ b/polygerrit-ui/app/elements/shared/gr-label-info/gr-label-info.ts
@@ -311,7 +311,9 @@
         link
         aria-label="Remove vote"
         @click="${this.onDeleteVote}"
-        data-account-id="${ifDefined(reviewer._account_id)}"
+        data-account-id="${ifDefined(
+          reviewer._account_id as number | undefined
+        )}"
         class="deleteBtn ${this.computeDeleteClass(
           reviewer,
           this.mutable,