Milutin Kristofic | c890972 | 2021-08-04 15:21:40 +0200 | [diff] [blame] | 1 | /** |
| 2 | * @license |
| 3 | * Copyright (C) 2021 The Android Open Source Project |
| 4 | * |
| 5 | * Licensed under the Apache License, Version 2.0 (the "License"); |
| 6 | * you may not use this file except in compliance with the License. |
| 7 | * You may obtain a copy of the License at |
| 8 | * |
| 9 | * http://www.apache.org/licenses/LICENSE-2.0 |
| 10 | * |
| 11 | * Unless required by applicable law or agreed to in writing, software |
| 12 | * distributed under the License is distributed on an "AS IS" BASIS, |
| 13 | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| 14 | * See the License for the specific language governing permissions and |
| 15 | * limitations under the License. |
| 16 | */ |
Milutin Kristofic | a837d52 | 2021-10-15 16:08:20 +0200 | [diff] [blame] | 17 | import '../../shared/gr-label-info/gr-label-info'; |
Milutin Kristofic | 0950fd7 | 2021-08-26 17:05:09 +0200 | [diff] [blame] | 18 | import '../gr-submit-requirement-hovercard/gr-submit-requirement-hovercard'; |
Milutin Kristofic | a837d52 | 2021-10-15 16:08:20 +0200 | [diff] [blame] | 19 | import '../gr-trigger-vote-hovercard/gr-trigger-vote-hovercard'; |
Ben Rohlfs | 0ca140a | 2021-09-03 10:43:37 +0200 | [diff] [blame] | 20 | import {LitElement, css, html} from 'lit'; |
Milutin Kristofic | 1641c26 | 2021-09-28 10:46:16 +0200 | [diff] [blame] | 21 | import {customElement, property, state} from 'lit/decorators'; |
Milutin Kristofic | 3424f6e | 2021-08-05 13:02:16 +0200 | [diff] [blame] | 22 | import {ParsedChangeInfo} from '../../../types/types'; |
Milutin Kristofic | 8fc3d8f8 | 2021-08-10 20:25:21 +0200 | [diff] [blame] | 23 | import { |
| 24 | AccountInfo, |
Milutin Kristofic | 0950fd7 | 2021-08-26 17:05:09 +0200 | [diff] [blame] | 25 | isDetailedLabelInfo, |
Milutin Kristofic | eee7476 | 2021-10-11 15:30:33 +0200 | [diff] [blame] | 26 | isQuickLabelInfo, |
Milutin Kristofic | 12b00dc | 2021-10-07 12:42:00 +0200 | [diff] [blame] | 27 | LabelInfo, |
Milutin Kristofic | 0950fd7 | 2021-08-26 17:05:09 +0200 | [diff] [blame] | 28 | LabelNameToInfoMap, |
Milutin Kristofic | 8fc3d8f8 | 2021-08-10 20:25:21 +0200 | [diff] [blame] | 29 | SubmitRequirementResultInfo, |
| 30 | SubmitRequirementStatus, |
| 31 | } from '../../../api/rest-api'; |
Milutin Kristofic | 9f50e76 | 2021-08-27 11:41:41 +0200 | [diff] [blame] | 32 | import { |
| 33 | extractAssociatedLabels, |
Milutin Kristofic | 12b00dc | 2021-10-07 12:42:00 +0200 | [diff] [blame] | 34 | getAllUniqueApprovals, |
Milutin Kristofic | f611a5f | 2021-10-25 16:51:51 +0200 | [diff] [blame] | 35 | getRequirements, |
Milutin Kristofic | 8768a5d | 2021-10-26 11:02:38 +0200 | [diff] [blame] | 36 | getTriggerVotes, |
Milutin Kristofic | 2b366b6 | 2021-10-13 16:44:41 +0200 | [diff] [blame] | 37 | hasNeutralStatus, |
Milutin Kristofic | d55e030 | 2021-09-27 12:19:00 +0200 | [diff] [blame] | 38 | hasVotes, |
Milutin Kristofic | 9f50e76 | 2021-08-27 11:41:41 +0200 | [diff] [blame] | 39 | iconForStatus, |
Milutin Kristofic | bd44580 | 2021-10-20 21:00:21 +0200 | [diff] [blame] | 40 | orderSubmitRequirements, |
Milutin Kristofic | 9f50e76 | 2021-08-27 11:41:41 +0200 | [diff] [blame] | 41 | } from '../../../utils/label-util'; |
Milutin Kristofic | 758711b | 2021-09-16 14:44:10 +0200 | [diff] [blame] | 42 | import {fontStyles} from '../../../styles/gr-font-styles'; |
Milutin Kristofic | 1641c26 | 2021-09-28 10:46:16 +0200 | [diff] [blame] | 43 | import {charsOnly, pluralize} from '../../../utils/string-util'; |
| 44 | import {subscribe} from '../../lit/subscription-controller'; |
| 45 | import { |
| 46 | allRunsLatestPatchsetLatestAttempt$, |
| 47 | CheckRun, |
| 48 | } from '../../../services/checks/checks-model'; |
| 49 | import {getResultsOf, hasResultsOf} from '../../../services/checks/checks-util'; |
| 50 | import {Category} from '../../../api/checks'; |
Ben Rohlfs | ece23f9 | 2021-09-30 14:58:37 +0200 | [diff] [blame] | 51 | import '../../shared/gr-vote-chip/gr-vote-chip'; |
Milutin Kristofic | c890972 | 2021-08-04 15:21:40 +0200 | [diff] [blame] | 52 | |
Milutin Kristofic | 395c546 | 2021-10-25 15:28:15 +0200 | [diff] [blame] | 53 | /** |
| 54 | * @attr {Boolean} suppress-title - hide titles, currently for hovercard view |
| 55 | */ |
Milutin Kristofic | c890972 | 2021-08-04 15:21:40 +0200 | [diff] [blame] | 56 | @customElement('gr-submit-requirements') |
Ben Rohlfs | 0ca140a | 2021-09-03 10:43:37 +0200 | [diff] [blame] | 57 | export class GrSubmitRequirements extends LitElement { |
Milutin Kristofic | 3424f6e | 2021-08-05 13:02:16 +0200 | [diff] [blame] | 58 | @property({type: Object}) |
| 59 | change?: ParsedChangeInfo; |
| 60 | |
Milutin Kristofic | 8fc3d8f8 | 2021-08-10 20:25:21 +0200 | [diff] [blame] | 61 | @property({type: Object}) |
| 62 | account?: AccountInfo; |
| 63 | |
| 64 | @property({type: Boolean}) |
| 65 | mutable?: boolean; |
| 66 | |
Milutin Kristofic | 1641c26 | 2021-09-28 10:46:16 +0200 | [diff] [blame] | 67 | @state() |
| 68 | runs: CheckRun[] = []; |
| 69 | |
Gerrit Code Review | 09637ae | 2021-08-19 14:34:39 +0000 | [diff] [blame] | 70 | static override get styles() { |
Milutin Kristofic | c890972 | 2021-08-04 15:21:40 +0200 | [diff] [blame] | 71 | return [ |
Milutin Kristofic | 758711b | 2021-09-16 14:44:10 +0200 | [diff] [blame] | 72 | fontStyles, |
Milutin Kristofic | c890972 | 2021-08-04 15:21:40 +0200 | [diff] [blame] | 73 | css` |
Milutin Kristofic | 395c546 | 2021-10-25 15:28:15 +0200 | [diff] [blame] | 74 | :host([suppress-title]) .metadata-title { |
Milutin Kristofic | be90017 | 2021-10-25 13:42:58 +0200 | [diff] [blame] | 75 | display: none; |
| 76 | } |
Milutin Kristofic | c890972 | 2021-08-04 15:21:40 +0200 | [diff] [blame] | 77 | .metadata-title { |
Milutin Kristofic | c890972 | 2021-08-04 15:21:40 +0200 | [diff] [blame] | 78 | color: var(--deemphasized-text-color); |
| 79 | padding-left: var(--metadata-horizontal-padding); |
Milutin Kristofic | 758711b | 2021-09-16 14:44:10 +0200 | [diff] [blame] | 80 | margin: 0 0 var(--spacing-s); |
| 81 | border-top: 1px solid var(--border-color); |
| 82 | padding-top: var(--spacing-s); |
Milutin Kristofic | 5852682 | 2021-08-06 12:18:36 +0200 | [diff] [blame] | 83 | } |
| 84 | iron-icon { |
Milutin Kristofic | 758711b | 2021-09-16 14:44:10 +0200 | [diff] [blame] | 85 | width: var(--line-height-normal, 20px); |
| 86 | height: var(--line-height-normal, 20px); |
Milutin Kristofic | 5852682 | 2021-08-06 12:18:36 +0200 | [diff] [blame] | 87 | } |
Milutin Kristofic | 225270a | 2021-10-20 22:39:47 +0200 | [diff] [blame] | 88 | iron-icon.check, |
| 89 | iron-icon.overridden { |
Milutin Kristofic | 5852682 | 2021-08-06 12:18:36 +0200 | [diff] [blame] | 90 | color: var(--success-foreground); |
| 91 | } |
Milutin Kristofic | 9f50e76 | 2021-08-27 11:41:41 +0200 | [diff] [blame] | 92 | iron-icon.close { |
Milutin Kristofic | a7b15bf | 2021-10-19 16:16:54 +0200 | [diff] [blame] | 93 | color: var(--error-foreground); |
Milutin Kristofic | 5852682 | 2021-08-06 12:18:36 +0200 | [diff] [blame] | 94 | } |
Milutin Kristofic | 758711b | 2021-09-16 14:44:10 +0200 | [diff] [blame] | 95 | .requirements, |
Milutin Kristofic | 12b00dc | 2021-10-07 12:42:00 +0200 | [diff] [blame] | 96 | section.trigger-votes { |
Milutin Kristofic | 758711b | 2021-09-16 14:44:10 +0200 | [diff] [blame] | 97 | margin-left: var(--spacing-l); |
| 98 | } |
Milutin Kristofic | 12b00dc | 2021-10-07 12:42:00 +0200 | [diff] [blame] | 99 | .trigger-votes { |
| 100 | padding-top: var(--spacing-s); |
| 101 | display: flex; |
| 102 | flex-wrap: wrap; |
| 103 | gap: var(--spacing-s); |
| 104 | /* Setting max-width as defined in Submit Requirements design, |
| 105 | * to wrap overflowed items to next row. |
| 106 | */ |
| 107 | max-width: 390px; |
| 108 | } |
Milutin Kristofic | 758711b | 2021-09-16 14:44:10 +0200 | [diff] [blame] | 109 | gr-limited-text.name { |
| 110 | font-weight: var(--font-weight-bold); |
| 111 | } |
| 112 | table { |
| 113 | border-collapse: collapse; |
| 114 | border-spacing: 0; |
| 115 | } |
| 116 | td { |
| 117 | padding: var(--spacing-s); |
Milutin Kristofic | be90017 | 2021-10-25 13:42:58 +0200 | [diff] [blame] | 118 | white-space: nowrap; |
Milutin Kristofic | 758711b | 2021-09-16 14:44:10 +0200 | [diff] [blame] | 119 | } |
Milutin Kristofic | 1641c26 | 2021-09-28 10:46:16 +0200 | [diff] [blame] | 120 | .votes-cell { |
| 121 | display: flex; |
| 122 | } |
| 123 | .check-error { |
| 124 | margin-right: var(--spacing-l); |
| 125 | } |
| 126 | .check-error iron-icon { |
| 127 | color: var(--error-foreground); |
| 128 | vertical-align: top; |
| 129 | } |
Milutin Kristofic | 12b00dc | 2021-10-07 12:42:00 +0200 | [diff] [blame] | 130 | gr-vote-chip { |
| 131 | margin-right: var(--spacing-s); |
| 132 | } |
Milutin Kristofic | c890972 | 2021-08-04 15:21:40 +0200 | [diff] [blame] | 133 | `, |
| 134 | ]; |
| 135 | } |
| 136 | |
Milutin Kristofic | 1641c26 | 2021-09-28 10:46:16 +0200 | [diff] [blame] | 137 | constructor() { |
| 138 | super(); |
| 139 | subscribe(this, allRunsLatestPatchsetLatestAttempt$, x => (this.runs = x)); |
| 140 | } |
| 141 | |
Gerrit Code Review | 09637ae | 2021-08-19 14:34:39 +0000 | [diff] [blame] | 142 | override render() { |
Milutin Kristofic | f611a5f | 2021-10-25 16:51:51 +0200 | [diff] [blame] | 143 | const submit_requirements = orderSubmitRequirements( |
| 144 | getRequirements(this.change) |
Milutin Kristofic | 7e65e99 | 2021-10-21 20:55:05 +0200 | [diff] [blame] | 145 | ); |
Milutin Kristofic | 7e65e99 | 2021-10-21 20:55:05 +0200 | [diff] [blame] | 146 | |
Milutin Kristofic | e865e91 | 2021-09-23 17:08:41 +0200 | [diff] [blame] | 147 | return html` <h3 |
Milutin Kristofic | 758711b | 2021-09-16 14:44:10 +0200 | [diff] [blame] | 148 | class="metadata-title heading-3" |
| 149 | id="submit-requirements-caption" |
| 150 | > |
| 151 | Submit Requirements |
Milutin Kristofic | e865e91 | 2021-09-23 17:08:41 +0200 | [diff] [blame] | 152 | </h3> |
Milutin Kristofic | 758711b | 2021-09-16 14:44:10 +0200 | [diff] [blame] | 153 | <table class="requirements" aria-labelledby="submit-requirements-caption"> |
| 154 | <thead hidden> |
| 155 | <tr> |
| 156 | <th>Status</th> |
| 157 | <th>Name</th> |
| 158 | <th>Votes</th> |
| 159 | </tr> |
| 160 | </thead> |
| 161 | <tbody> |
| 162 | ${submit_requirements.map( |
Milutin Kristofic | 5eec84e | 2021-09-27 12:28:10 +0200 | [diff] [blame] | 163 | requirement => html`<tr |
| 164 | id="requirement-${charsOnly(requirement.name)}" |
| 165 | > |
Milutin Kristofic | 758711b | 2021-09-16 14:44:10 +0200 | [diff] [blame] | 166 | <td>${this.renderStatus(requirement.status)}</td> |
| 167 | <td class="name"> |
| 168 | <gr-limited-text |
| 169 | class="name" |
| 170 | limit="25" |
| 171 | .text="${requirement.name}" |
| 172 | ></gr-limited-text> |
| 173 | </td> |
Milutin Kristofic | 1641c26 | 2021-09-28 10:46:16 +0200 | [diff] [blame] | 174 | <td> |
| 175 | <div class="votes-cell"> |
| 176 | ${this.renderVotes(requirement)} |
| 177 | ${this.renderChecks(requirement)} |
| 178 | </div> |
| 179 | </td> |
Milutin Kristofic | 758711b | 2021-09-16 14:44:10 +0200 | [diff] [blame] | 180 | </tr>` |
| 181 | )} |
| 182 | </tbody> |
| 183 | </table> |
Milutin Kristofic | 3424f6e | 2021-08-05 13:02:16 +0200 | [diff] [blame] | 184 | ${submit_requirements.map( |
Milutin Kristofic | 758711b | 2021-09-16 14:44:10 +0200 | [diff] [blame] | 185 | requirement => html` |
Milutin Kristofic | 0950fd7 | 2021-08-26 17:05:09 +0200 | [diff] [blame] | 186 | <gr-submit-requirement-hovercard |
Milutin Kristofic | 5eec84e | 2021-09-27 12:28:10 +0200 | [diff] [blame] | 187 | for="requirement-${charsOnly(requirement.name)}" |
Milutin Kristofic | 9f50e76 | 2021-08-27 11:41:41 +0200 | [diff] [blame] | 188 | .requirement="${requirement}" |
| 189 | .change="${this.change}" |
| 190 | .account="${this.account}" |
Ben Rohlfs | ece23f9 | 2021-09-30 14:58:37 +0200 | [diff] [blame] | 191 | .mutable="${this.mutable ?? false}" |
Milutin Kristofic | 9f50e76 | 2021-08-27 11:41:41 +0200 | [diff] [blame] | 192 | ></gr-submit-requirement-hovercard> |
Milutin Kristofic | 758711b | 2021-09-16 14:44:10 +0200 | [diff] [blame] | 193 | ` |
Milutin Kristofic | 40826c1 | 2021-08-26 13:16:11 +0200 | [diff] [blame] | 194 | )} |
Milutin Kristofic | 8768a5d | 2021-10-26 11:02:38 +0200 | [diff] [blame] | 195 | ${this.renderTriggerVotes()}`; |
Milutin Kristofic | c890972 | 2021-08-04 15:21:40 +0200 | [diff] [blame] | 196 | } |
Milutin Kristofic | 5852682 | 2021-08-06 12:18:36 +0200 | [diff] [blame] | 197 | |
| 198 | renderStatus(status: SubmitRequirementStatus) { |
Milutin Kristofic | 9f50e76 | 2021-08-27 11:41:41 +0200 | [diff] [blame] | 199 | const icon = iconForStatus(status); |
Milutin Kristofic | 5852682 | 2021-08-06 12:18:36 +0200 | [diff] [blame] | 200 | return html`<iron-icon |
Milutin Kristofic | 9f50e76 | 2021-08-27 11:41:41 +0200 | [diff] [blame] | 201 | class="${icon}" |
| 202 | icon="gr-icons:${icon}" |
Milutin Kristofic | 758711b | 2021-09-16 14:44:10 +0200 | [diff] [blame] | 203 | role="img" |
| 204 | aria-label="${status.toLowerCase()}" |
Milutin Kristofic | 5852682 | 2021-08-06 12:18:36 +0200 | [diff] [blame] | 205 | ></iron-icon>`; |
| 206 | } |
Milutin Kristofic | 8fc3d8f8 | 2021-08-10 20:25:21 +0200 | [diff] [blame] | 207 | |
Milutin Kristofic | 0950fd7 | 2021-08-26 17:05:09 +0200 | [diff] [blame] | 208 | renderVotes(requirement: SubmitRequirementResultInfo) { |
| 209 | const requirementLabels = extractAssociatedLabels(requirement); |
Milutin Kristofic | d55e030 | 2021-09-27 12:19:00 +0200 | [diff] [blame] | 210 | const allLabels = this.change?.labels ?? {}; |
| 211 | const associatedLabels = Object.keys(allLabels).filter(label => |
| 212 | requirementLabels.includes(label) |
| 213 | ); |
Milutin Kristofic | 0950fd7 | 2021-08-26 17:05:09 +0200 | [diff] [blame] | 214 | |
Milutin Kristofic | d55e030 | 2021-09-27 12:19:00 +0200 | [diff] [blame] | 215 | const everyAssociatedLabelsIsWithoutVotes = associatedLabels.every( |
Milutin Kristofic | 7e59b68 | 2021-09-27 16:15:01 +0200 | [diff] [blame] | 216 | label => !hasVotes(allLabels[label]) |
Milutin Kristofic | d55e030 | 2021-09-27 12:19:00 +0200 | [diff] [blame] | 217 | ); |
| 218 | if (everyAssociatedLabelsIsWithoutVotes) return html`No votes`; |
| 219 | |
| 220 | return associatedLabels.map(label => |
| 221 | this.renderLabelVote(label, allLabels) |
| 222 | ); |
Milutin Kristofic | 0950fd7 | 2021-08-26 17:05:09 +0200 | [diff] [blame] | 223 | } |
| 224 | |
| 225 | renderLabelVote(label: string, labels: LabelNameToInfoMap) { |
| 226 | const labelInfo = labels[label]; |
Milutin Kristofic | eee7476 | 2021-10-11 15:30:33 +0200 | [diff] [blame] | 227 | if (isDetailedLabelInfo(labelInfo)) { |
Milutin Kristofic | 2b366b6 | 2021-10-13 16:44:41 +0200 | [diff] [blame] | 228 | const uniqueApprovals = getAllUniqueApprovals(labelInfo).filter( |
| 229 | approval => !hasNeutralStatus(labelInfo, approval) |
| 230 | ); |
Milutin Kristofic | eee7476 | 2021-10-11 15:30:33 +0200 | [diff] [blame] | 231 | return uniqueApprovals.map( |
| 232 | approvalInfo => |
| 233 | html`<gr-vote-chip |
| 234 | .vote="${approvalInfo}" |
| 235 | .label="${labelInfo}" |
| 236 | .more="${(labelInfo.all ?? []).filter( |
| 237 | other => other.value === approvalInfo.value |
| 238 | ).length > 1}" |
| 239 | ></gr-vote-chip>` |
| 240 | ); |
| 241 | } else if (isQuickLabelInfo(labelInfo)) { |
| 242 | return [html`<gr-vote-chip .label="${labelInfo}"></gr-vote-chip>`]; |
| 243 | } else { |
| 244 | return html``; |
| 245 | } |
Milutin Kristofic | 0950fd7 | 2021-08-26 17:05:09 +0200 | [diff] [blame] | 246 | } |
| 247 | |
Milutin Kristofic | 1641c26 | 2021-09-28 10:46:16 +0200 | [diff] [blame] | 248 | renderChecks(requirement: SubmitRequirementResultInfo) { |
| 249 | const requirementLabels = extractAssociatedLabels(requirement); |
| 250 | const requirementRuns = this.runs |
| 251 | .filter(run => hasResultsOf(run, Category.ERROR)) |
| 252 | .filter( |
| 253 | run => run.labelName && requirementLabels.includes(run.labelName) |
| 254 | ); |
| 255 | const runsCount = requirementRuns.reduce( |
| 256 | (sum, run) => sum + getResultsOf(run, Category.ERROR).length, |
| 257 | 0 |
| 258 | ); |
| 259 | if (runsCount > 0) { |
| 260 | return html`<span class="check-error" |
| 261 | ><iron-icon icon="gr-icons:error"></iron-icon>${pluralize( |
| 262 | runsCount, |
| 263 | 'error' |
| 264 | )}</span |
| 265 | >`; |
| 266 | } |
| 267 | return; |
| 268 | } |
| 269 | |
Milutin Kristofic | 8768a5d | 2021-10-26 11:02:38 +0200 | [diff] [blame] | 270 | renderTriggerVotes() { |
Milutin Kristofic | 40826c1 | 2021-08-26 13:16:11 +0200 | [diff] [blame] | 271 | const labels = this.change?.labels ?? {}; |
Milutin Kristofic | 8768a5d | 2021-10-26 11:02:38 +0200 | [diff] [blame] | 272 | const triggerVotes = getTriggerVotes(this.change).filter(label => |
| 273 | hasVotes(labels[label]) |
| 274 | ); |
Milutin Kristofic | 40826c1 | 2021-08-26 13:16:11 +0200 | [diff] [blame] | 275 | if (!triggerVotes.length) return; |
Milutin Kristofic | 758711b | 2021-09-16 14:44:10 +0200 | [diff] [blame] | 276 | return html`<h3 class="metadata-title heading-3">Trigger Votes</h3> |
Milutin Kristofic | 12b00dc | 2021-10-07 12:42:00 +0200 | [diff] [blame] | 277 | <section class="trigger-votes"> |
Milutin Kristofic | 758711b | 2021-09-16 14:44:10 +0200 | [diff] [blame] | 278 | ${triggerVotes.map( |
Milutin Kristofic | 12b00dc | 2021-10-07 12:42:00 +0200 | [diff] [blame] | 279 | label => |
| 280 | html`<gr-trigger-vote |
| 281 | .label="${label}" |
Milutin Kristofic | 758711b | 2021-09-16 14:44:10 +0200 | [diff] [blame] | 282 | .labelInfo="${labels[label]}" |
Milutin Kristofic | a837d52 | 2021-10-15 16:08:20 +0200 | [diff] [blame] | 283 | .change="${this.change}" |
| 284 | .account="${this.account}" |
| 285 | .mutable="${this.mutable ?? false}" |
Milutin Kristofic | 12b00dc | 2021-10-07 12:42:00 +0200 | [diff] [blame] | 286 | ></gr-trigger-vote>` |
Milutin Kristofic | 758711b | 2021-09-16 14:44:10 +0200 | [diff] [blame] | 287 | )} |
| 288 | </section>`; |
Milutin Kristofic | 40826c1 | 2021-08-26 13:16:11 +0200 | [diff] [blame] | 289 | } |
Milutin Kristofic | c890972 | 2021-08-04 15:21:40 +0200 | [diff] [blame] | 290 | } |
| 291 | |
Milutin Kristofic | 12b00dc | 2021-10-07 12:42:00 +0200 | [diff] [blame] | 292 | @customElement('gr-trigger-vote') |
| 293 | export class GrTriggerVote extends LitElement { |
| 294 | @property() |
| 295 | label?: string; |
| 296 | |
| 297 | @property({type: Object}) |
| 298 | labelInfo?: LabelInfo; |
| 299 | |
Milutin Kristofic | a837d52 | 2021-10-15 16:08:20 +0200 | [diff] [blame] | 300 | @property({type: Object}) |
| 301 | change?: ParsedChangeInfo; |
| 302 | |
| 303 | @property({type: Object}) |
| 304 | account?: AccountInfo; |
| 305 | |
| 306 | @property({type: Boolean}) |
| 307 | mutable?: boolean; |
| 308 | |
Milutin Kristofic | 12b00dc | 2021-10-07 12:42:00 +0200 | [diff] [blame] | 309 | static override get styles() { |
| 310 | return css` |
| 311 | :host { |
| 312 | display: block; |
| 313 | } |
| 314 | .container { |
| 315 | box-sizing: border-box; |
| 316 | border: 1px solid var(--border-color); |
| 317 | border-radius: calc(var(--border-radius) + 2px); |
| 318 | background-color: var(--background-color-primary); |
| 319 | display: flex; |
| 320 | padding: 0; |
| 321 | padding-left: var(--spacing-s); |
| 322 | padding-right: var(--spacing-xxs); |
| 323 | align-items: center; |
| 324 | } |
| 325 | .label { |
| 326 | padding-right: var(--spacing-s); |
| 327 | font-weight: var(--font-weight-bold); |
| 328 | } |
| 329 | gr-vote-chip { |
| 330 | --gr-vote-chip-width: 14px; |
| 331 | --gr-vote-chip-height: 14px; |
| 332 | margin-right: 0px; |
Milutin Kristofic | a837d52 | 2021-10-15 16:08:20 +0200 | [diff] [blame] | 333 | margin-left: var(--spacing-xs); |
| 334 | } |
| 335 | gr-vote-chip:first-of-type { |
| 336 | margin-left: 0px; |
Milutin Kristofic | 12b00dc | 2021-10-07 12:42:00 +0200 | [diff] [blame] | 337 | } |
| 338 | `; |
| 339 | } |
| 340 | |
| 341 | override render() { |
Milutin Kristofic | eee7476 | 2021-10-11 15:30:33 +0200 | [diff] [blame] | 342 | if (!this.labelInfo) return; |
Milutin Kristofic | 12b00dc | 2021-10-07 12:42:00 +0200 | [diff] [blame] | 343 | return html` |
| 344 | <div class="container"> |
Milutin Kristofic | a837d52 | 2021-10-15 16:08:20 +0200 | [diff] [blame] | 345 | <gr-trigger-vote-hovercard .labelName=${this.label}> |
| 346 | <gr-label-info |
| 347 | slot="label-info" |
| 348 | .change=${this.change} |
| 349 | .account=${this.account} |
| 350 | .mutable=${this.mutable} |
| 351 | .label=${this.label} |
| 352 | .labelInfo=${this.labelInfo} |
| 353 | .showAllReviewers=${false} |
| 354 | ></gr-label-info> |
| 355 | </gr-trigger-vote-hovercard> |
Milutin Kristofic | 12b00dc | 2021-10-07 12:42:00 +0200 | [diff] [blame] | 356 | <span class="label">${this.label}</span> |
Milutin Kristofic | eee7476 | 2021-10-11 15:30:33 +0200 | [diff] [blame] | 357 | ${this.renderVotes()} |
Milutin Kristofic | 12b00dc | 2021-10-07 12:42:00 +0200 | [diff] [blame] | 358 | </div> |
| 359 | `; |
| 360 | } |
Milutin Kristofic | eee7476 | 2021-10-11 15:30:33 +0200 | [diff] [blame] | 361 | |
| 362 | private renderVotes() { |
Milutin Kristofic | 2b366b6 | 2021-10-13 16:44:41 +0200 | [diff] [blame] | 363 | const {labelInfo} = this; |
| 364 | if (!labelInfo) return; |
| 365 | if (isDetailedLabelInfo(labelInfo)) { |
| 366 | const approvals = getAllUniqueApprovals(labelInfo).filter( |
| 367 | approval => !hasNeutralStatus(labelInfo, approval) |
| 368 | ); |
| 369 | return approvals.map( |
Milutin Kristofic | eee7476 | 2021-10-11 15:30:33 +0200 | [diff] [blame] | 370 | approvalInfo => html`<gr-vote-chip |
| 371 | .vote="${approvalInfo}" |
Milutin Kristofic | 2b366b6 | 2021-10-13 16:44:41 +0200 | [diff] [blame] | 372 | .label="${labelInfo}" |
Milutin Kristofic | eee7476 | 2021-10-11 15:30:33 +0200 | [diff] [blame] | 373 | ></gr-vote-chip>` |
| 374 | ); |
Milutin Kristofic | 2b366b6 | 2021-10-13 16:44:41 +0200 | [diff] [blame] | 375 | } else if (isQuickLabelInfo(labelInfo)) { |
Milutin Kristofic | eee7476 | 2021-10-11 15:30:33 +0200 | [diff] [blame] | 376 | return [html`<gr-vote-chip .label="${this.labelInfo}"></gr-vote-chip>`]; |
| 377 | } else { |
| 378 | return html``; |
| 379 | } |
| 380 | } |
Milutin Kristofic | 12b00dc | 2021-10-07 12:42:00 +0200 | [diff] [blame] | 381 | } |
| 382 | |
Milutin Kristofic | c890972 | 2021-08-04 15:21:40 +0200 | [diff] [blame] | 383 | declare global { |
| 384 | interface HTMLElementTagNameMap { |
| 385 | 'gr-submit-requirements': GrSubmitRequirements; |
Milutin Kristofic | 12b00dc | 2021-10-07 12:42:00 +0200 | [diff] [blame] | 386 | 'gr-trigger-vote': GrTriggerVote; |
Milutin Kristofic | c890972 | 2021-08-04 15:21:40 +0200 | [diff] [blame] | 387 | } |
| 388 | } |