@@ -379,6 +379,7 @@ limitations under the License.
+
diff --git a/polygerrit-ui/app/elements/change/gr-change-metadata/gr-change-metadata.js b/polygerrit-ui/app/elements/change/gr-change-metadata/gr-change-metadata.js
index 8947e0e54a..0d23a16e3a 100644
--- a/polygerrit-ui/app/elements/change/gr-change-metadata/gr-change-metadata.js
+++ b/polygerrit-ui/app/elements/change/gr-change-metadata/gr-change-metadata.js
@@ -42,6 +42,10 @@
properties: {
/** @type {?} */
change: Object,
+ labels: {
+ type: Object,
+ notify: true,
+ },
/** @type {?} */
revision: Object,
commitInfo: Object,
@@ -98,9 +102,14 @@
observers: [
'_changeChanged(change)',
+ '_labelsChanged(change.labels)',
'_assigneeChanged(_assignee.*)',
],
+ _labelsChanged(labels) {
+ this.labels = Object.assign({}, labels) || null;
+ },
+
_changeChanged(change) {
this._assignee = change.assignee ? [change.assignee] : [];
},
@@ -243,17 +252,22 @@
},
_computeTopicReadOnly(mutable, change) {
- return !mutable || !change.actions.topic || !change.actions.topic.enabled;
+ return !mutable ||
+ !change.actions ||
+ !change.actions.topic ||
+ !change.actions.topic.enabled;
},
_computeHashtagReadOnly(mutable, change) {
return !mutable ||
+ !change.actions ||
!change.actions.hashtags ||
!change.actions.hashtags.enabled;
},
_computeAssigneeReadOnly(mutable, change) {
return !mutable ||
+ !change.actions ||
!change.actions.assignee ||
!change.actions.assignee.enabled;
},
@@ -283,7 +297,9 @@
* change-metadata section is modifiable by the current user.
*/
_computeCanDeleteVote(reviewer, mutable) {
- if (!mutable) { return false; }
+ if (!mutable || !this.change || !this.change.removable_reviewers) {
+ return false;
+ }
for (let i = 0; i < this.change.removable_reviewers.length; i++) {
if (this.change.removable_reviewers[i]._account_id ===
reviewer._account_id) {
@@ -313,6 +329,7 @@
if (!response.ok) { return response; }
const label = this.change.labels[labelName];
const labels = label.all || [];
+ let wasChanged = false;
for (let i = 0; i < labels.length; i++) {
if (labels[i]._account_id === accountID) {
for (const key in label) {
@@ -320,13 +337,18 @@
label[key]._account_id === accountID) {
// Remove special label field, keeping change label values
// in sync with the backend.
- this.set(['change.labels', labelName, key], null);
+ this.change.labels[labelName][key] = null;
+ wasChanged = true;
}
}
- this.splice(['change.labels', labelName, 'all'], i, 1);
+ this.change.labels[labelName].all.splice(i, 1);
+ wasChanged = true;
break;
}
}
+ if (wasChanged) {
+ this.notifyPath('change.labels');
+ }
}).catch(err => {
target.disabled = false;
return;
diff --git a/polygerrit-ui/app/elements/change/gr-change-metadata/gr-change-metadata_test.html b/polygerrit-ui/app/elements/change/gr-change-metadata/gr-change-metadata_test.html
index 68b838fa15..6a04fd7f5a 100644
--- a/polygerrit-ui/app/elements/change/gr-change-metadata/gr-change-metadata_test.html
+++ b/polygerrit-ui/app/elements/change/gr-change-metadata/gr-change-metadata_test.html
@@ -523,36 +523,26 @@ limitations under the License.
assert.isFalse(button.hasAttribute('hidden'));
});
- test('deletes votes', done => {
- const deleteStub = sandbox.stub(element.$.restAPI, 'deleteVote')
- .returns(Promise.resolve({ok: true}));
+ test('deletes votes', () => {
+ const deleteResponse = Promise.resolve({ok: true});
+ const deleteStub = sandbox.stub(
+ element.$.restAPI, 'deleteVote').returns(deleteResponse);
- element.change.removable_reviewers = [
- {
- _account_id: 1,
- name: 'bojack',
- },
- ];
+ element.change.removable_reviewers = [{
+ _account_id: 1,
+ name: 'bojack',
+ }];
element.change.labels.test.recommended = {_account_id: 1};
element.mutable = true;
- flushAsynchronousOperations();
const chip = element.$$('gr-account-chip');
const button = chip.$$('gr-button');
-
- const spliceStub = sandbox.stub(element, 'splice', (path, index,
- length) => {
- assert.isFalse(chip.disabled);
- assert.deepEqual(path, ['change.labels', 'test', 'all']);
- assert.equal(index, 0);
- assert.equal(length, 1);
- assert.notOk(element.change.labels.test.recommended);
- assert.isTrue(deleteStub.calledWithExactly(42, 1, 'test'));
- spliceStub.restore();
- done();
- });
-
MockInteractions.tap(button);
assert.isTrue(chip.disabled);
+ return deleteResponse.then(() => {
+ assert.isFalse(chip.disabled);
+ assert.notOk(element.change.labels.test.recommended);
+ assert.isTrue(deleteStub.calledWithExactly(42, 1, 'test'));
+ });
});
test('changing topic', () => {
diff --git a/polygerrit-ui/app/elements/plugins/gr-change-metadata-api/gr-change-metadata-api.html b/polygerrit-ui/app/elements/plugins/gr-change-metadata-api/gr-change-metadata-api.html
new file mode 100644
index 0000000000..eddb52b9e0
--- /dev/null
+++ b/polygerrit-ui/app/elements/plugins/gr-change-metadata-api/gr-change-metadata-api.html
@@ -0,0 +1,22 @@
+
+
+
+
+
+
+
diff --git a/polygerrit-ui/app/elements/plugins/gr-change-metadata-api/gr-change-metadata-api.js b/polygerrit-ui/app/elements/plugins/gr-change-metadata-api/gr-change-metadata-api.js
new file mode 100644
index 0000000000..b550f73b62
--- /dev/null
+++ b/polygerrit-ui/app/elements/plugins/gr-change-metadata-api/gr-change-metadata-api.js
@@ -0,0 +1,39 @@
+/**
+ * @license
+ * Copyright (C) 2018 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+(function(window) {
+ 'use strict';
+
+ function GrChangeMetadataApi(plugin) {
+ this._hook = null;
+ this.plugin = plugin;
+ }
+
+ GrChangeMetadataApi.prototype._createHook = function() {
+ this._hook = this.plugin.hook('change-metadata-item');
+ };
+
+ GrChangeMetadataApi.prototype.onLabelsChanged = function(callback) {
+ if (!this._hook) {
+ this._createHook();
+ }
+ this._hook.onAttached(element =>
+ this.plugin.attributeHelper(element).bind('labels', callback));
+ return this;
+ };
+
+ window.GrChangeMetadataApi = GrChangeMetadataApi;
+})(window);
diff --git a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-js-api-interface.html b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-js-api-interface.html
index 3819e8ad48..d8a662ec37 100644
--- a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-js-api-interface.html
+++ b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-js-api-interface.html
@@ -20,6 +20,7 @@ limitations under the License.
+
diff --git a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-public-js-api.js b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-public-js-api.js
index fbcf21af24..e966bebf67 100644
--- a/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-public-js-api.js
+++ b/polygerrit-ui/app/elements/shared/gr-js-api-interface/gr-public-js-api.js
@@ -223,6 +223,10 @@
return new GrRepoApi(this);
};
+ Plugin.prototype.changeMetadata = function() {
+ return new GrChangeMetadataApi(this);
+ };
+
Plugin.prototype.admin = function() {
return new GrAdminApi(this);
};