blob: 22721339435ad94d6a3dd364cd3b599d174f8f16 [file] [log] [blame]
Milutin Kristofic4deb19a2021-10-19 12:19:10 +02001/**
2 * @license
3 * Copyright (C) 2015 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 */
17
Milutin Kristoficbe900172021-10-25 13:42:58 +020018import '../../change/gr-submit-requirement-dashboard-hovercard/gr-submit-requirement-dashboard-hovercard';
Milutin Kristoficfacc3c52021-12-08 20:40:38 +010019import '../../shared/gr-change-status/gr-change-status';
Milutin Kristofic52b1f582021-12-06 11:01:22 +010020import {LitElement, css, html, TemplateResult} from 'lit';
Milutin Kristofic4deb19a2021-10-19 12:19:10 +020021import {customElement, property} from 'lit/decorators';
22import {ChangeInfo, SubmitRequirementStatus} from '../../../api/rest-api';
Milutin Kristoficfacc3c52021-12-08 20:40:38 +010023import {changeStatuses} from '../../../utils/change-util';
Milutin Kristoficae44ca42021-12-03 14:29:05 +010024import {getRequirements, iconForStatus} from '../../../utils/label-util';
Milutin Kristoficb2237d62021-12-09 20:29:55 +010025import {submitRequirementsStyles} from '../../../styles/gr-submit-requirements-styles';
Milutin Kristoficc8b94082021-12-10 10:20:31 +010026import {pluralize} from '../../../utils/string-util';
Milutin Kristofic4deb19a2021-10-19 12:19:10 +020027
Milutin Kristofice5c80d82022-01-18 21:22:07 +010028@customElement('gr-change-list-column-requirements-summary')
29export class GrChangeListColumnRequirementsSummary extends LitElement {
Milutin Kristofic4deb19a2021-10-19 12:19:10 +020030 @property({type: Object})
31 change?: ChangeInfo;
32
33 static override get styles() {
34 return [
Milutin Kristoficb2237d62021-12-09 20:29:55 +010035 submitRequirementsStyles,
Milutin Kristofic4deb19a2021-10-19 12:19:10 +020036 css`
37 iron-icon {
38 width: var(--line-height-normal, 20px);
39 height: var(--line-height-normal, 20px);
40 vertical-align: top;
41 }
Milutin Kristofic0d287ef2021-12-08 15:52:51 +010042 iron-icon.block,
43 iron-icon.check-circle-filled {
44 margin-right: var(--spacing-xs);
Milutin Kristofic4deb19a2021-10-19 12:19:10 +020045 }
Milutin Kristofic0d287ef2021-12-08 15:52:51 +010046 iron-icon.commentIcon {
Milutin Kristofic0a33f782021-12-06 13:33:51 +010047 color: var(--deemphasized-text-color);
48 margin-left: var(--spacing-s);
49 }
Milutin Kristofic0d287ef2021-12-08 15:52:51 +010050 span {
51 line-height: var(--line-height-normal);
52 }
53 span.check-circle-filled {
54 color: var(--success-foreground);
55 }
56 .unsatisfied {
57 color: var(--primary-text-color);
58 }
59 .total {
60 margin-left: var(--spacing-xs);
61 color: var(--deemphasized-text-color);
62 }
Milutin Kristoficfacc3c52021-12-08 20:40:38 +010063 :host {
64 align-items: center;
65 display: inline-flex;
66 }
67 .comma {
68 padding-right: var(--spacing-xs);
69 }
70 /* Used to hide the leading separator comma for statuses. */
71 .comma:first-of-type {
72 display: none;
73 }
Milutin Kristofic4deb19a2021-10-19 12:19:10 +020074 `,
75 ];
76 }
77
78 override render() {
Milutin Kristoficfacc3c52021-12-08 20:40:38 +010079 const commentIcon = this.renderCommentIcon();
80 return html`${this.renderChangeStatus()} ${commentIcon}`;
81 }
Milutin Kristofic4deb19a2021-10-19 12:19:10 +020082
Milutin Kristoficfacc3c52021-12-08 20:40:38 +010083 renderChangeStatus() {
84 if (!this.change) return;
85 const statuses = changeStatuses(this.change);
86 if (statuses.length > 0) {
87 return statuses.map(
88 status => html`
89 <div class="comma">,</div>
90 <gr-change-status flat .status=${status}></gr-change-status>
91 `
92 );
93 }
94 return this.renderActiveStatus();
95 }
96
97 renderActiveStatus() {
Milutin Kristoficf611a5f2021-10-25 16:51:51 +020098 const submitRequirements = getRequirements(this.change);
Milutin Kristofic4deb19a2021-10-19 12:19:10 +020099 if (!submitRequirements.length) return html`n/a`;
Milutin Kristoficee2aa9b2021-11-12 15:04:46 +0100100 const numRequirements = submitRequirements.length;
101 const numSatisfied = submitRequirements.filter(
Milutin Kristofic18399632021-11-02 12:24:38 +0100102 req =>
103 req.status === SubmitRequirementStatus.SATISFIED ||
104 req.status === SubmitRequirementStatus.OVERRIDDEN
Milutin Kristofic4deb19a2021-10-19 12:19:10 +0200105 ).length;
106
Milutin Kristoficee2aa9b2021-11-12 15:04:46 +0100107 if (numSatisfied === numRequirements) {
Milutin Kristoficfacc3c52021-12-08 20:40:38 +0100108 return this.renderState(
109 iconForStatus(SubmitRequirementStatus.SATISFIED),
110 'Ready'
111 );
Milutin Kristofic4deb19a2021-10-19 12:19:10 +0200112 }
Milutin Kristoficee2aa9b2021-11-12 15:04:46 +0100113
114 const numUnsatisfied = submitRequirements.filter(
115 req => req.status === SubmitRequirementStatus.UNSATISFIED
116 ).length;
Milutin Kristofic0a33f782021-12-06 13:33:51 +0100117
Milutin Kristoficfacc3c52021-12-08 20:40:38 +0100118 return this.renderState(
Milutin Kristoficae44ca42021-12-03 14:29:05 +0100119 iconForStatus(SubmitRequirementStatus.UNSATISFIED),
Milutin Kristofic52b1f582021-12-06 11:01:22 +0100120 this.renderSummary(numUnsatisfied, numRequirements)
121 );
Milutin Kristofic4deb19a2021-10-19 12:19:10 +0200122 }
123
Milutin Kristofic52b1f582021-12-06 11:01:22 +0100124 renderState(icon: string, aggregation: string | TemplateResult) {
Milutin Kristofic2e7966d2022-02-14 10:21:02 +0100125 return html`<span class="${icon}" role="button" tabindex="0">
126 <gr-submit-requirement-dashboard-hovercard .change=${this.change}>
Milutin Kristoficbe900172021-10-25 13:42:58 +0200127 </gr-submit-requirement-dashboard-hovercard>
128 <iron-icon class="${icon}" icon="gr-icons:${icon}" role="img"></iron-icon
Milutin Kristofic52b1f582021-12-06 11:01:22 +0100129 >${aggregation}</span
130 >`;
131 }
132
133 renderSummary(numUnsatisfied: number, numRequirements: number) {
134 return html`<span
135 ><span class="unsatisfied">${numUnsatisfied}</span
136 ><span class="total">(of ${numRequirements})</span></span
Milutin Kristofic4deb19a2021-10-19 12:19:10 +0200137 >`;
138 }
Milutin Kristofic0a33f782021-12-06 13:33:51 +0100139
140 renderCommentIcon() {
141 if (!this.change?.unresolved_comment_count) return;
142 return html`<iron-icon
143 icon="gr-icons:comment"
144 class="commentIcon"
Milutin Kristoficc8b94082021-12-10 10:20:31 +0100145 .title="${pluralize(
146 this.change?.unresolved_comment_count,
147 'unresolved comment'
148 )}"
Milutin Kristofic0a33f782021-12-06 13:33:51 +0100149 ></iron-icon>`;
150 }
Milutin Kristofic4deb19a2021-10-19 12:19:10 +0200151}
152
153declare global {
154 interface HTMLElementTagNameMap {
Milutin Kristofice5c80d82022-01-18 21:22:07 +0100155 'gr-change-list-column-requirements-summary': GrChangeListColumnRequirementsSummary;
Milutin Kristofic4deb19a2021-10-19 12:19:10 +0200156 }
157}