summaryrefslogtreecommitdiffstats
path: root/polygerrit-ui/app/elements/shared/gr-label-info/gr-label-info.js
diff options
context:
space:
mode:
Diffstat (limited to 'polygerrit-ui/app/elements/shared/gr-label-info/gr-label-info.js')
-rw-r--r--polygerrit-ui/app/elements/shared/gr-label-info/gr-label-info.js161
1 files changed, 161 insertions, 0 deletions
diff --git a/polygerrit-ui/app/elements/shared/gr-label-info/gr-label-info.js b/polygerrit-ui/app/elements/shared/gr-label-info/gr-label-info.js
new file mode 100644
index 0000000000..40edc28015
--- /dev/null
+++ b/polygerrit-ui/app/elements/shared/gr-label-info/gr-label-info.js
@@ -0,0 +1,161 @@
+/**
+ * @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() {
+ 'use strict';
+
+ Polymer({
+ is: 'gr-label-info',
+
+ properties: {
+ labelInfo: Object,
+ label: String,
+ /** @type {?} */
+ change: Object,
+ account: Object,
+ mutable: Boolean,
+ },
+
+ /**
+ * @param {!Object} labelInfo
+ * @param {!Object} account
+ * @param {Object} changeLabelsRecord not used, but added as a parameter in
+ * order to trigger computation when a label is removed from the change.
+ */
+ _mapLabelInfo(labelInfo, account, changeLabelsRecord) {
+ const result = [];
+ if (!labelInfo) { return result; }
+ if (!labelInfo.values) {
+ if (labelInfo.rejected || labelInfo.approved) {
+ const ok = labelInfo.approved || !labelInfo.rejected;
+ return [{
+ value: ok ? '👍️' : '👎️',
+ className: ok ? 'positive' : 'negative',
+ account: ok ? labelInfo.approved : labelInfo.rejected,
+ }];
+ }
+ return result;
+ }
+ // Sort votes by positivity.
+ const votes = (labelInfo.all || []).sort((a, b) => a.value - b.value);
+ const values = Object.keys(labelInfo.values);
+ for (const label of votes) {
+ if (label.value && label.value != labelInfo.default_value) {
+ let labelClassName;
+ let labelValPrefix = '';
+ if (label.value > 0) {
+ labelValPrefix = '+';
+ if (parseInt(label.value, 10) ===
+ parseInt(values[values.length - 1], 10)) {
+ labelClassName = 'max';
+ } else {
+ labelClassName = 'positive';
+ }
+ } else if (label.value < 0) {
+ if (parseInt(label.value, 10) === parseInt(values[0], 10)) {
+ labelClassName = 'min';
+ } else {
+ labelClassName = 'negative';
+ }
+ }
+ const formattedLabel = {
+ value: labelValPrefix + label.value,
+ className: labelClassName,
+ account: label,
+ };
+ if (label._account_id === account._account_id) {
+ // Put self-votes at the top.
+ result.unshift(formattedLabel);
+ } else {
+ result.push(formattedLabel);
+ }
+ }
+ }
+ return result;
+ },
+
+ /**
+ * A user is able to delete a vote iff the mutable property is true and the
+ * reviewer that left the vote exists in the list of removable_reviewers
+ * received from the backend.
+ *
+ * @param {!Object} reviewer An object describing the reviewer that left the
+ * vote.
+ * @param {Boolean} mutable
+ * @param {!Object} change
+ */
+ _computeDeleteClass(reviewer, mutable, change) {
+ if (!mutable || !change || !change.removable_reviewers) {
+ return 'hidden';
+ }
+ const removable = change.removable_reviewers;
+ if (removable.find(r => r._account_id === reviewer._account_id)) {
+ return '';
+ }
+ return 'hidden';
+ },
+
+ /**
+ * Closure annotation for Polymer.prototype.splice is off.
+ * For now, supressing annotations.
+ *
+ * @suppress {checkTypes} */
+ _onDeleteVote(e) {
+ e.preventDefault();
+ let target = Polymer.dom(e).rootTarget;
+ while (!target.classList.contains('deleteBtn')) {
+ if (!target.parentElement) { return; }
+ target = target.parentElement;
+ }
+
+ target.disabled = true;
+ const accountID = parseInt(target.getAttribute('data-account-id'), 10);
+ this._xhrPromise =
+ this.$.restAPI.deleteVote(this.change._number, accountID, this.label)
+ .then(response => {
+ target.disabled = false;
+ if (!response.ok) { return; }
+ Gerrit.Nav.navigateToChange(this.change);
+ }).catch(err => {
+ target.disabled = false;
+ return;
+ });
+ },
+
+ _computeValueTooltip(labelInfo, score) {
+ if (!labelInfo || !labelInfo.values || !labelInfo.values[score]) {
+ return '';
+ }
+ return labelInfo.values[score];
+ },
+
+ /**
+ * @param {!Object} labelInfo
+ * @param {Object} changeLabelsRecord not used, but added as a parameter in
+ * order to trigger computation when a label is removed from the change.
+ */
+ _computeShowPlaceholder(labelInfo, changeLabelsRecord) {
+ if (labelInfo.all) {
+ for (const label of labelInfo.all) {
+ if (label.value && label.value != labelInfo.default_value) {
+ return 'hidden';
+ }
+ }
+ }
+ return '';
+ },
+ });
+})();