Remove deleted rules for the new added section

Bug: Issue 11339
Change-Id: Ief0944afe03c55a3ee48b7ed23a3997c569b3354
diff --git a/polygerrit-ui/app/elements/admin/gr-repo-access/gr-repo-access.js b/polygerrit-ui/app/elements/admin/gr-repo-access/gr-repo-access.js
index 61362a8..5459749 100644
--- a/polygerrit-ui/app/elements/admin/gr-repo-access/gr-repo-access.js
+++ b/polygerrit-ui/app/elements/admin/gr-repo-access/gr-repo-access.js
@@ -344,6 +344,12 @@
           } else if (obj[k].added) {
             this._updateAddRemoveObj(addRemoveObj,
                 path.concat(ref), 'add', obj[k]);
+            /**
+             * As add / delete both can happen in the new section,
+             * so here to make sure it will remove the deleted ones.
+             * @see Issue 11339
+             */
+            this._recursivelyRemoveDeleted(addRemoveObj.add[k]);
             continue;
           }
           this._recursivelyUpdateAddRemoveObj(obj[k], addRemoveObj,
diff --git a/polygerrit-ui/app/elements/admin/gr-repo-access/gr-repo-access_test.html b/polygerrit-ui/app/elements/admin/gr-repo-access/gr-repo-access_test.html
index abd11d6..8b1de6e 100644
--- a/polygerrit-ui/app/elements/admin/gr-repo-access/gr-repo-access_test.html
+++ b/polygerrit-ui/app/elements/admin/gr-repo-access/gr-repo-access_test.html
@@ -416,6 +416,72 @@
         assert.deepEqual(obj, expectedResult);
       });
 
+      test('_recursivelyUpdateAddRemoveObj on new added section', () => {
+        const obj = {
+          'refs/for/*': {
+            permissions: {
+              'label-Code-Review': {
+                rules: {
+                  e798fed07afbc9173a587f876ef8760c78d240c1: {
+                    min: -2,
+                    max: 2,
+                    action: 'ALLOW',
+                    added: true,
+                  },
+                },
+                added: true,
+                label: 'Code-Review',
+              },
+              'labelAs-Code-Review': {
+                rules: {
+                  'ldap:gerritcodereview-eng': {
+                    min: -2,
+                    max: 2,
+                    action: 'ALLOW',
+                    added: true,
+                    deleted: true,
+                  },
+                },
+                added: true,
+                label: 'Code-Review',
+              },
+            },
+            added: true,
+          },
+        };
+
+        const expectedResult = {
+          add: {
+            'refs/for/*': {
+              permissions: {
+                'label-Code-Review': {
+                  rules: {
+                    e798fed07afbc9173a587f876ef8760c78d240c1: {
+                      min: -2,
+                      max: 2,
+                      action: 'ALLOW',
+                      added: true,
+                    },
+                  },
+                  added: true,
+                  label: 'Code-Review',
+                },
+                'labelAs-Code-Review': {
+                  rules: {},
+                  added: true,
+                  label: 'Code-Review',
+                },
+              },
+              added: true,
+            },
+          },
+          remove: {},
+        };
+        const updateObj = {add: {}, remove: {}};
+        element._recursivelyUpdateAddRemoveObj(obj, updateObj);
+        assert.deepEqual(updateObj, expectedResult);
+      });
+
       test('_handleSaveForReview with no changes', () => {
         assert.deepEqual(element._computeAddAndRemove(), {add: {}, remove: {}});
       });