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 ebb0e34c80..5bc700b145 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 @@ -342,6 +342,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 20e2b8eae2..6fa36a54ca 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 @@ -414,6 +414,72 @@ limitations under the License. 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: {}}); });