Show warning when editing an old patchset

Google-bug-id: b/240439313
Screenshot: https://imgur.com/a/Xri8Fds
Release-Notes: skip
Change-Id: Ib349673d7c790ea272ca463f020b2bd0805c4434
diff --git a/polygerrit-ui/app/elements/edit/gr-editor-view/gr-editor-view.ts b/polygerrit-ui/app/elements/edit/gr-editor-view/gr-editor-view.ts
index 6062f17..0980ebb 100644
--- a/polygerrit-ui/app/elements/edit/gr-editor-view/gr-editor-view.ts
+++ b/polygerrit-ui/app/elements/edit/gr-editor-view/gr-editor-view.ts
@@ -16,6 +16,7 @@
   Base64FileContent,
   NumericChangeId,
   EDIT,
+  PatchSetNumber,
 } from '../../../types/common';
 import {ParsedChangeInfo} from '../../../types/types';
 import {HttpMethod, NotifyType} from '../../../constants/constants';
@@ -27,11 +28,13 @@
 import {changeIsMerged, changeIsAbandoned} from '../../../utils/change-util';
 import {addShortcut, Modifier} from '../../../utils/dom-util';
 import {sharedStyles} from '../../../styles/shared-styles';
-import {LitElement, PropertyValues, html, css} from 'lit';
+import {LitElement, PropertyValues, html, css, nothing} from 'lit';
 import {customElement, property, state} from 'lit/decorators.js';
 import {subscribe} from '../../lit/subscription-controller';
 import {GenerateUrlEditViewParameters} from '../../../utils/router-util';
 import {GerritView} from '../../../services/router/router-model';
+import {resolve} from '../../../models/dependency';
+import {changeModelToken} from '../../../models/change/change-model';
 
 const RESTORED_MESSAGE = 'Content restored from a previous edit.';
 const SAVING_MESSAGE = 'Saving changes...';
@@ -90,6 +93,8 @@
 
   @state() private lineNum?: number;
 
+  @state() private latestPatchsetNumber?: PatchSetNumber;
+
   private readonly restApiService = getAppContext().restApiService;
 
   private readonly storage = getAppContext().storageService;
@@ -98,6 +103,8 @@
 
   private readonly userModel = getAppContext().userModel;
 
+  private readonly getChangeModel = resolve(this, changeModelToken);
+
   // Tests use this so needs to be non private
   storeTask?: DelayedTask;
 
@@ -116,6 +123,11 @@
         this.editPrefs = editPreferences;
       }
     );
+    subscribe(
+      this,
+      () => this.getChangeModel().latestPatchNum$,
+      x => (this.latestPatchsetNumber = x)
+    );
   }
 
   override connectedCallback() {
@@ -193,6 +205,9 @@
         .rightControls {
           justify-content: flex-end;
         }
+        .warning {
+          color: var(--error-text-color);
+        }
       `,
     ];
   }
@@ -207,6 +222,7 @@
         <header>
           <span class="controlGroup">
             <span>Edit mode</span>
+            ${this.renderEditingOldPatchsetWarning()}
             <span class="separator"></span>
             <gr-editable-label
               labelText="File path"
@@ -243,6 +259,12 @@
     `;
   }
 
+  private renderEditingOldPatchsetWarning() {
+    const patchset = this.params?.patchNum;
+    if (patchset === this.latestPatchsetNumber) return nothing;
+    return html`<span class="warning">&nbsp;(Old Patchset)</span>`;
+  }
+
   private renderEndpoint() {
     return html`
       <div class="textareaWrapper">