Redirect from change edit if change is merged or abandoned

Also display a notification telling the user why.

Change-Id: I9b8f9cf7da7992274fe05e46be481246543d4c57
(cherry picked from commit 24d5b0d01daa9963e56bb9ee7509213fb8554d97)
diff --git a/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.js b/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.js
index b016128..b8b674b 100644
--- a/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.js
+++ b/polygerrit-ui/app/elements/change/gr-change-view/gr-change-view.js
@@ -1563,7 +1563,27 @@
    * @param {?Object} edit
    */
   _processEdit(change, edit) {
+    if (
+      (change.status === this.ChangeStatus.MERGED ||
+        change.status === this.ChangeStatus.ABANDONED) &&
+      this._editMode
+    ) {
+      /* eslint-disable max-len */
+      const message =
+        'Change edits cannot be created if change is merged or abandoned. Redirected to non edit mode.';
+      this.dispatchEvent(
+          new CustomEvent('show-alert', {
+            detail: {message},
+            bubbles: true,
+            composed: true,
+          })
+      );
+      GerritNav.navigateToChange(change);
+      return;
+    }
+
     if (!edit) { return; }
+
     change.revisions[edit.commit.commit] = {
       _number: this.EDIT_NAME,
       basePatchNum: edit.base_patch_set_number,
diff --git a/polygerrit-ui/app/elements/edit/gr-editor-view/gr-editor-view.js b/polygerrit-ui/app/elements/edit/gr-editor-view/gr-editor-view.js
index b766e7f..6e4d8c6 100644
--- a/polygerrit-ui/app/elements/edit/gr-editor-view/gr-editor-view.js
+++ b/polygerrit-ui/app/elements/edit/gr-editor-view/gr-editor-view.js
@@ -32,6 +32,7 @@
 import {htmlTemplate} from './gr-editor-view_html.js';
 import {PatchSetBehavior} from '../../../behaviors/gr-patch-set-behavior/gr-patch-set-behavior.js';
 import {PathListBehavior} from '../../../behaviors/gr-path-list-behavior/gr-path-list-behavior.js';
+import {RESTClientBehavior} from '../../../behaviors/rest-client-behavior/rest-client-behavior.js';
 import {KeyboardShortcutBehavior} from '../../../behaviors/keyboard-shortcut-behavior/keyboard-shortcut-behavior.js';
 import {GerritNav} from '../../core/gr-navigation/gr-navigation.js';
 
@@ -49,6 +50,7 @@
   KeyboardShortcutBehavior,
   PatchSetBehavior,
   PathListBehavior,
+  RESTClientBehavior,
 ], GestureEventListeners(
     LegacyElementMixin(
         PolymerElement))) {
@@ -77,7 +79,10 @@
         observer: '_paramsChanged',
       },
 
-      _change: Object,
+      _change: {
+        type: Object,
+        observer: '_editChange',
+      },
       _changeEditDetail: Object,
       _changeNum: String,
       _patchNum: String,
@@ -169,6 +174,23 @@
     });
   }
 
+  _editChange(value) {
+    if (!value) return;
+    if (value.status !== this.ChangeStatus.MERGED &&
+      value.status !== this.ChangeStatus.ABANDONED) return;
+    /* eslint-disable max-len */
+    const message =
+      'Change edits cannot be created if change is merged or abandoned. Redirected to non edit mode.';
+    this.dispatchEvent(
+        new CustomEvent('show-alert', {
+          detail: {message},
+          bubbles: true,
+          composed: true,
+        })
+    );
+    GerritNav.navigateToChange(value);
+  }
+
   _handlePathChanged(e) {
     const path = e.detail;
     if (path === this._path) {