diff options
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.js | 161 |
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 ''; + }, + }); +})(); |