Ben Rohlfs | c9f9098 | 2020-12-13 22:00:11 +0100 | [diff] [blame] | 1 | /** |
| 2 | * @license |
Ben Rohlfs | b66b68c | 2022-05-27 11:49:22 +0200 | [diff] [blame] | 3 | * Copyright 2020 Google LLC |
| 4 | * SPDX-License-Identifier: Apache-2.0 |
Ben Rohlfs | c9f9098 | 2020-12-13 22:00:11 +0100 | [diff] [blame] | 5 | */ |
Chris Poucet | 1c71386 | 2022-07-25 13:12:24 +0200 | [diff] [blame] | 6 | import '../shared/gr-icon/gr-icon'; |
Frank Borden | 42c1a45 | 2022-08-11 16:27:20 +0200 | [diff] [blame] | 7 | import {classMap} from 'lit/directives/class-map.js'; |
| 8 | import {repeat} from 'lit/directives/repeat.js'; |
| 9 | import {ifDefined} from 'lit/directives/if-defined.js'; |
Ben Rohlfs | ebef2e1 | 2022-09-01 17:22:24 +0200 | [diff] [blame] | 10 | import { |
| 11 | LitElement, |
| 12 | css, |
| 13 | html, |
| 14 | PropertyValues, |
| 15 | TemplateResult, |
| 16 | nothing, |
| 17 | } from 'lit'; |
Frank Borden | 42c1a45 | 2022-08-11 16:27:20 +0200 | [diff] [blame] | 18 | import {customElement, property, query, state} from 'lit/decorators.js'; |
Ben Rohlfs | d70a337 | 2021-05-18 12:52:12 +0200 | [diff] [blame] | 19 | import './gr-checks-action'; |
Ben Rohlfs | ece23f9 | 2021-09-30 14:58:37 +0200 | [diff] [blame] | 20 | import './gr-hovercard-run'; |
Ben Rohlfs | d06c574 | 2021-03-03 14:45:58 +0100 | [diff] [blame] | 21 | import '@polymer/paper-tooltip/paper-tooltip'; |
Ben Rohlfs | 6c97c57 | 2021-03-22 09:53:03 +0100 | [diff] [blame] | 22 | import { |
| 23 | Action, |
| 24 | Category, |
| 25 | Link, |
| 26 | LinkIcon, |
| 27 | RunStatus, |
| 28 | Tag, |
| 29 | } from '../../api/checks'; |
Ben Rohlfs | c9f9098 | 2020-12-13 22:00:11 +0100 | [diff] [blame] | 30 | import {sharedStyles} from '../../styles/shared-styles'; |
Ben Rohlfs | 68b4723 | 2023-06-26 12:53:41 +0200 | [diff] [blame] | 31 | import {CheckRun, RunResult, runResult} from '../../models/checks/checks-model'; |
Ben Rohlfs | 913ab76 | 2021-02-05 12:52:00 +0100 | [diff] [blame] | 32 | import { |
Ben Rohlfs | ebef2e1 | 2022-09-01 17:22:24 +0200 | [diff] [blame] | 33 | ALL_ATTEMPTS, |
| 34 | AttemptChoice, |
| 35 | attemptChoiceLabel, |
| 36 | isAttemptChoice, |
| 37 | LATEST_ATTEMPT, |
| 38 | sortAttemptChoices, |
| 39 | stringToAttemptChoice, |
Ben Rohlfs | 8845349 | 2021-03-03 11:32:40 +0100 | [diff] [blame] | 40 | allResults, |
Ben Rohlfs | d0207e5 | 2022-08-04 22:02:00 +0200 | [diff] [blame] | 41 | createFixAction, |
Ben Rohlfs | 6e62a0c | 2021-06-07 13:13:40 +0200 | [diff] [blame] | 42 | firstPrimaryLink, |
Ben Rohlfs | 4a5ac59 | 2021-05-19 15:11:03 +0200 | [diff] [blame] | 43 | hasCompletedWithoutResults, |
Ben Rohlfs | f457f89 | 2021-06-18 10:57:44 +0200 | [diff] [blame] | 44 | iconFor, |
Ben Rohlfs | a8bb0da | 2021-04-12 08:56:20 +0200 | [diff] [blame] | 45 | iconForLink, |
Ben Rohlfs | d58e07e | 2021-06-24 13:22:24 +0200 | [diff] [blame] | 46 | isCategory, |
Ben Rohlfs | 3bc8128 | 2021-06-02 13:48:17 +0200 | [diff] [blame] | 47 | otherPrimaryLinks, |
Ben Rohlfs | fb8e848 | 2021-06-02 14:39:11 +0200 | [diff] [blame] | 48 | secondaryLinks, |
Ben Rohlfs | 6e62a0c | 2021-06-07 13:13:40 +0200 | [diff] [blame] | 49 | tooltipForLink, |
Ben Rohlfs | a2b6b7a | 2023-05-15 10:12:41 +0200 | [diff] [blame] | 50 | computeIsExpandable, |
Chris Poucet | 776a68f | 2022-01-10 19:17:02 +0100 | [diff] [blame] | 51 | } from '../../models/checks/checks-util'; |
Ben Rohlfs | ebef2e1 | 2022-09-01 17:22:24 +0200 | [diff] [blame] | 52 | import {assertIsDefined, assert, unique} from '../../utils/common-util'; |
Ben Rohlfs | 808d1f0 | 2023-10-30 10:37:04 +0100 | [diff] [blame] | 53 | import {modifierPressed, whenVisible} from '../../utils/dom-util'; |
Ben Rohlfs | 5e5c89e | 2021-02-25 11:09:33 +0100 | [diff] [blame] | 54 | import {durationString} from '../../utils/date-util'; |
Ben Rohlfs | e79d23e | 2021-05-17 15:37:14 +0200 | [diff] [blame] | 55 | import {charsOnly} from '../../utils/string-util'; |
Ben Rohlfs | 54fd41d | 2021-09-22 09:10:50 +0200 | [diff] [blame] | 56 | import {isAttemptSelected, matches} from './gr-checks-util'; |
Chris Poucet | 0f9907c | 2022-06-09 18:15:51 +0200 | [diff] [blame] | 57 | import {ChecksTabState, ValueChangedEvent} from '../../types/events'; |
Dhruv Srivastava | 25e53d8 | 2023-02-28 19:13:19 +0100 | [diff] [blame] | 58 | import { |
| 59 | DropdownLink, |
| 60 | LabelNameToInfoMap, |
Ben Rohlfs | 140fadf | 2024-06-12 12:10:56 +0000 | [diff] [blame] | 61 | PARENT, |
Dhruv Srivastava | 25e53d8 | 2023-02-28 19:13:19 +0100 | [diff] [blame] | 62 | PatchSetNumber, |
| 63 | } from '../../types/common'; |
Ben Rohlfs | c3f6e72 | 2021-05-17 17:13:03 +0200 | [diff] [blame] | 64 | import {spinnerStyles} from '../../styles/gr-spinner-styles'; |
Ben Rohlfs | 7df6867 | 2021-05-21 08:14:38 +0200 | [diff] [blame] | 65 | import { |
| 66 | getLabelStatus, |
| 67 | getRepresentativeValue, |
| 68 | valueString, |
| 69 | } from '../../utils/label-util'; |
Ben Rohlfs | 0ca140a | 2021-09-03 10:43:37 +0200 | [diff] [blame] | 70 | import {subscribe} from '../lit/subscription-controller'; |
Ben Rohlfs | aa60f93 | 2021-09-13 22:06:50 +0200 | [diff] [blame] | 71 | import {fontStyles} from '../../styles/gr-font-styles'; |
Ben Rohlfs | 48330a1 | 2021-12-09 15:12:17 +0100 | [diff] [blame] | 72 | import {fire} from '../../utils/event-util'; |
Chris Poucet | 9221cce | 2022-01-05 16:37:11 +0100 | [diff] [blame] | 73 | import {resolve} from '../../models/dependency'; |
Chris Poucet | 776a68f | 2022-01-10 19:17:02 +0100 | [diff] [blame] | 74 | import {checksModelToken} from '../../models/checks/checks-model'; |
Ben Rohlfs | cced911 | 2021-12-22 16:34:54 +0100 | [diff] [blame] | 75 | import {Interaction} from '../../constants/reporting'; |
| 76 | import {Deduping} from '../../api/reporting'; |
Chris Poucet | bf65b8f | 2022-01-18 21:18:12 +0000 | [diff] [blame] | 77 | import {changeModelToken} from '../../models/change/change-model'; |
| 78 | import {getAppContext} from '../../services/app-context'; |
Frank Borden | 42c1a45 | 2022-08-11 16:27:20 +0200 | [diff] [blame] | 79 | import {when} from 'lit/directives/when.js'; |
Ben Rohlfs | ebef2e1 | 2022-09-01 17:22:24 +0200 | [diff] [blame] | 80 | import {DropdownItem} from '../shared/gr-dropdown-list/gr-dropdown-list'; |
| 81 | import './gr-checks-attempt'; |
Ben Rohlfs | 140fadf | 2024-06-12 12:10:56 +0000 | [diff] [blame] | 82 | import {changeViewModelToken} from '../../models/views/change'; |
Milutin Kristofic | aa1c08b | 2023-09-06 10:34:16 +0200 | [diff] [blame] | 83 | import {formStyles} from '../../styles/form-styles'; |
Ben Rohlfs | 48330a1 | 2021-12-09 15:12:17 +0100 | [diff] [blame] | 84 | |
| 85 | /** |
| 86 | * Firing this event sets the regular expression of the results filter. |
| 87 | */ |
| 88 | export interface ChecksResultsFilterDetail { |
| 89 | filterRegExp?: string; |
| 90 | } |
| 91 | export type ChecksResultsFilterEvent = CustomEvent<ChecksResultsFilterDetail>; |
| 92 | |
| 93 | declare global { |
| 94 | interface HTMLElementEventMap { |
| 95 | 'checks-results-filter': ChecksResultsFilterEvent; |
| 96 | } |
| 97 | } |
Ben Rohlfs | c9f9098 | 2020-12-13 22:00:11 +0100 | [diff] [blame] | 98 | |
Ben Rohlfs | c0c2ea5 | 2021-01-21 09:45:16 +0100 | [diff] [blame] | 99 | @customElement('gr-result-row') |
Ben Rohlfs | ee9cef7 | 2022-06-29 14:53:47 +0200 | [diff] [blame] | 100 | export class GrResultRow extends LitElement { |
Ben Rohlfs | ea7c3d4 | 2021-06-18 12:26:22 +0200 | [diff] [blame] | 101 | @query('td.nameCol div.name') |
| 102 | nameEl?: HTMLElement; |
| 103 | |
Ben Rohlfs | ece23f9 | 2021-09-30 14:58:37 +0200 | [diff] [blame] | 104 | @property({attribute: false}) |
Ben Rohlfs | c0c2ea5 | 2021-01-21 09:45:16 +0100 | [diff] [blame] | 105 | result?: RunResult; |
| 106 | |
Ben Rohlfs | ece23f9 | 2021-09-30 14:58:37 +0200 | [diff] [blame] | 107 | @state() |
Ben Rohlfs | e6c57d0 | 2021-01-25 11:22:39 +0100 | [diff] [blame] | 108 | isExpanded = false; |
| 109 | |
| 110 | @property({type: Boolean, reflect: true}) |
| 111 | isExpandable = false; |
| 112 | |
Ben Rohlfs | ece23f9 | 2021-09-30 14:58:37 +0200 | [diff] [blame] | 113 | @state() |
Ben Rohlfs | 2b38e5f | 2021-02-22 16:43:40 +0100 | [diff] [blame] | 114 | shouldRender = false; |
| 115 | |
Ben Rohlfs | ece23f9 | 2021-09-30 14:58:37 +0200 | [diff] [blame] | 116 | @state() |
Ben Rohlfs | 7df6867 | 2021-05-21 08:14:38 +0200 | [diff] [blame] | 117 | labels?: LabelNameToInfoMap; |
| 118 | |
Ben Rohlfs | 05126b1 | 2022-06-29 16:13:56 +0200 | [diff] [blame] | 119 | @state() |
| 120 | latestPatchNum?: PatchSetNumber; |
| 121 | |
Ben Rohlfs | ebef2e1 | 2022-09-01 17:22:24 +0200 | [diff] [blame] | 122 | @state() |
| 123 | selectedAttempt: AttemptChoice = LATEST_ATTEMPT; |
| 124 | |
Chris Poucet | bf65b8f | 2022-01-18 21:18:12 +0000 | [diff] [blame] | 125 | private getChangeModel = resolve(this, changeModelToken); |
Chris Poucet | 0142248 | 2021-11-30 19:43:28 +0100 | [diff] [blame] | 126 | |
Chris Poucet | 776a68f | 2022-01-10 19:17:02 +0100 | [diff] [blame] | 127 | private getChecksModel = resolve(this, checksModelToken); |
Ben Rohlfs | f1c277b | 2021-09-07 21:12:13 +0200 | [diff] [blame] | 128 | |
Ben Rohlfs | cced911 | 2021-12-22 16:34:54 +0100 | [diff] [blame] | 129 | private readonly reporting = getAppContext().reportingService; |
| 130 | |
Chris Poucet | 5ec77f0 | 2022-05-12 11:25:21 +0200 | [diff] [blame] | 131 | constructor() { |
| 132 | super(); |
| 133 | subscribe( |
| 134 | this, |
| 135 | () => this.getChangeModel().labels$, |
| 136 | x => (this.labels = x) |
| 137 | ); |
Ben Rohlfs | 05126b1 | 2022-06-29 16:13:56 +0200 | [diff] [blame] | 138 | subscribe( |
| 139 | this, |
| 140 | () => this.getChangeModel().latestPatchNum$, |
| 141 | x => (this.latestPatchNum = x) |
| 142 | ); |
Ben Rohlfs | ebef2e1 | 2022-09-01 17:22:24 +0200 | [diff] [blame] | 143 | subscribe( |
| 144 | this, |
| 145 | () => this.getChecksModel().checksSelectedAttemptNumber$, |
| 146 | x => (this.selectedAttempt = x) |
| 147 | ); |
Ben Rohlfs | 7df6867 | 2021-05-21 08:14:38 +0200 | [diff] [blame] | 148 | } |
| 149 | |
Gerrit Code Review | 7903123 | 2021-08-19 14:32:41 +0000 | [diff] [blame] | 150 | static override get styles() { |
Ben Rohlfs | c0c2ea5 | 2021-01-21 09:45:16 +0100 | [diff] [blame] | 151 | return [ |
| 152 | sharedStyles, |
| 153 | css` |
| 154 | :host { |
Ben Rohlfs | e6c57d0 | 2021-01-25 11:22:39 +0100 | [diff] [blame] | 155 | display: contents; |
| 156 | } |
| 157 | :host([isexpandable]) { |
| 158 | cursor: pointer; |
| 159 | } |
Ben Rohlfs | 9c3696f | 2021-03-22 10:26:41 +0100 | [diff] [blame] | 160 | gr-result-expanded { |
| 161 | cursor: default; |
| 162 | } |
Ben Rohlfs | 9ccee7e | 2021-06-02 14:04:44 +0200 | [diff] [blame] | 163 | tr.container { |
Ben Rohlfs | c0c2ea5 | 2021-01-21 09:45:16 +0100 | [diff] [blame] | 164 | border-top: 1px solid var(--border-color); |
| 165 | } |
Ben Rohlfs | ea7c3d4 | 2021-06-18 12:26:22 +0200 | [diff] [blame] | 166 | a.link { |
| 167 | margin-right: var(--spacing-s); |
| 168 | } |
Chris Poucet | 1c71386 | 2022-07-25 13:12:24 +0200 | [diff] [blame] | 169 | gr-icon.link { |
Ben Rohlfs | c0c2ea5 | 2021-01-21 09:45:16 +0100 | [diff] [blame] | 170 | color: var(--link-color); |
Ben Rohlfs | c0c2ea5 | 2021-01-21 09:45:16 +0100 | [diff] [blame] | 171 | } |
Ben Rohlfs | 0720983 | 2021-05-18 15:23:06 +0200 | [diff] [blame] | 172 | td.nameCol div.flex { |
| 173 | display: flex; |
Ben Rohlfs | c0c2ea5 | 2021-01-21 09:45:16 +0100 | [diff] [blame] | 174 | } |
Ben Rohlfs | 0720983 | 2021-05-18 15:23:06 +0200 | [diff] [blame] | 175 | td.nameCol .name { |
Ben Rohlfs | c0c2ea5 | 2021-01-21 09:45:16 +0100 | [diff] [blame] | 176 | overflow: hidden; |
| 177 | text-overflow: ellipsis; |
Ben Rohlfs | 0720983 | 2021-05-18 15:23:06 +0200 | [diff] [blame] | 178 | margin-right: var(--spacing-s); |
Ben Rohlfs | ea7c3d4 | 2021-06-18 12:26:22 +0200 | [diff] [blame] | 179 | outline-offset: var(--spacing-xs); |
Ben Rohlfs | c0c2ea5 | 2021-01-21 09:45:16 +0100 | [diff] [blame] | 180 | } |
Ben Rohlfs | 0720983 | 2021-05-18 15:23:06 +0200 | [diff] [blame] | 181 | td.nameCol .space { |
| 182 | flex-grow: 1; |
Ben Rohlfs | c0c2ea5 | 2021-01-21 09:45:16 +0100 | [diff] [blame] | 183 | } |
Ben Rohlfs | 0720983 | 2021-05-18 15:23:06 +0200 | [diff] [blame] | 184 | td.nameCol gr-checks-action { |
| 185 | display: none; |
| 186 | } |
Ben Rohlfs | ea7c3d4 | 2021-06-18 12:26:22 +0200 | [diff] [blame] | 187 | tr:focus-within td.nameCol gr-checks-action, |
Ben Rohlfs | 0720983 | 2021-05-18 15:23:06 +0200 | [diff] [blame] | 188 | tr:hover td.nameCol gr-checks-action { |
| 189 | display: inline-block; |
| 190 | /* The button should fit into the 20px line-height. The negative |
| 191 | margin provides the extra space needed for the vertical padding. |
| 192 | Alternatively we could have set the vertical padding to 0, but |
| 193 | that would not have been a nice click target. */ |
| 194 | margin: calc(0px - var(--spacing-s)) 0px; |
| 195 | margin-left: var(--spacing-s); |
Ben Rohlfs | c0c2ea5 | 2021-01-21 09:45:16 +0100 | [diff] [blame] | 196 | } |
| 197 | td { |
| 198 | white-space: nowrap; |
| 199 | padding: var(--spacing-s); |
| 200 | } |
Ben Rohlfs | 894dd29 | 2021-06-16 12:10:20 +0200 | [diff] [blame] | 201 | td.expandedCol, |
Ben Rohlfs | daba0e8 | 2021-06-11 08:06:17 +0200 | [diff] [blame] | 202 | td.nameCol { |
Ben Rohlfs | 894dd29 | 2021-06-16 12:10:20 +0200 | [diff] [blame] | 203 | padding-left: var(--spacing-l); |
| 204 | } |
| 205 | td.expandedCol, |
| 206 | td.expanderCol { |
| 207 | padding-right: var(--spacing-l); |
Ben Rohlfs | daba0e8 | 2021-06-11 08:06:17 +0200 | [diff] [blame] | 208 | } |
Ben Rohlfs | c0c2ea5 | 2021-01-21 09:45:16 +0100 | [diff] [blame] | 209 | td .summary-cell { |
| 210 | display: flex; |
Ben Rohlfs | c0c2ea5 | 2021-01-21 09:45:16 +0100 | [diff] [blame] | 211 | } |
| 212 | td .summary-cell .summary { |
Ben Rohlfs | b630ef7 | 2021-02-03 10:09:55 +0100 | [diff] [blame] | 213 | font-weight: var(--font-weight-bold); |
Ben Rohlfs | c0c2ea5 | 2021-01-21 09:45:16 +0100 | [diff] [blame] | 214 | flex-shrink: 1; |
| 215 | overflow: hidden; |
| 216 | text-overflow: ellipsis; |
Ben Rohlfs | 23a466c | 2021-02-17 12:03:53 +0100 | [diff] [blame] | 217 | margin-right: var(--spacing-s); |
Ben Rohlfs | c0c2ea5 | 2021-01-21 09:45:16 +0100 | [diff] [blame] | 218 | } |
| 219 | td .summary-cell .message { |
Ben Rohlfs | c0c2ea5 | 2021-01-21 09:45:16 +0100 | [diff] [blame] | 220 | flex-grow: 1; |
| 221 | /* Looks a bit stupid, but the idea is that .message shrinks first, |
| 222 | and only when that has shrunken to 0, then .summary should also |
| 223 | start shrinking (substantially). */ |
| 224 | flex-shrink: 1000000; |
| 225 | overflow: hidden; |
| 226 | text-overflow: ellipsis; |
| 227 | } |
Ben Rohlfs | 9ccee7e | 2021-06-02 14:04:44 +0200 | [diff] [blame] | 228 | tr.container:hover { |
Ben Rohlfs | a8bb0da | 2021-04-12 08:56:20 +0200 | [diff] [blame] | 229 | background: var(--hover-background-color); |
| 230 | } |
Ben Rohlfs | ea7c3d4 | 2021-06-18 12:26:22 +0200 | [diff] [blame] | 231 | tr.container:focus-within { |
| 232 | background: var(--selection-background-color); |
| 233 | } |
Ben Rohlfs | 9ccee7e | 2021-06-02 14:04:44 +0200 | [diff] [blame] | 234 | tr.container td .summary-cell .links, |
| 235 | tr.container td .summary-cell .actions, |
Ben Rohlfs | ea7c3d4 | 2021-06-18 12:26:22 +0200 | [diff] [blame] | 236 | tr.container.collapsed:focus-within td .summary-cell .links, |
| 237 | tr.container.collapsed:focus-within td .summary-cell .actions, |
Ben Rohlfs | 9ccee7e | 2021-06-02 14:04:44 +0200 | [diff] [blame] | 238 | tr.container.collapsed:hover td .summary-cell .links, |
| 239 | tr.container.collapsed:hover td .summary-cell .actions, |
Ben Rohlfs | a8bb0da | 2021-04-12 08:56:20 +0200 | [diff] [blame] | 240 | :host(.dropdown-open) tr td .summary-cell .links, |
| 241 | :host(.dropdown-open) tr td .summary-cell .actions { |
| 242 | display: inline-block; |
| 243 | margin-left: var(--spacing-s); |
| 244 | } |
Milutin Kristofic | 7ada745 | 2024-03-18 20:04:46 +0100 | [diff] [blame] | 245 | /* actions-shown-on-collapsed are shown only when .actions is hidden |
| 246 | and vice versa. */ |
| 247 | tr.container td .summary-cell .actions-shown-on-collapsed, |
| 248 | tr.container.collapsed:focus-within |
| 249 | td |
| 250 | .summary-cell |
| 251 | .actions-shown-on-collapsed, |
| 252 | tr.container.collapsed:hover |
| 253 | td |
| 254 | .summary-cell |
| 255 | .actions-shown-on-collapsed, |
| 256 | :host(.dropdown-open) tr td .summary-cell .actions-shown-on-collapsed { |
| 257 | display: none; |
| 258 | } |
Ben Rohlfs | 9ccee7e | 2021-06-02 14:04:44 +0200 | [diff] [blame] | 259 | tr.container.collapsed td .summary-cell .message { |
Ben Rohlfs | e31db03 | 2021-05-05 12:55:15 +0200 | [diff] [blame] | 260 | color: var(--deemphasized-text-color); |
| 261 | } |
Ben Rohlfs | 9ccee7e | 2021-06-02 14:04:44 +0200 | [diff] [blame] | 262 | tr.container.collapsed td .summary-cell .links, |
| 263 | tr.container.collapsed td .summary-cell .actions { |
Ben Rohlfs | a8bb0da | 2021-04-12 08:56:20 +0200 | [diff] [blame] | 264 | display: none; |
| 265 | } |
Milutin Kristofic | 7ada745 | 2024-03-18 20:04:46 +0100 | [diff] [blame] | 266 | tr.container.collapsed td .summary-cell .actions-shown-on-collapsed { |
| 267 | display: inline-block; |
| 268 | margin-left: var(--spacing-s); |
| 269 | } |
Ben Rohlfs | 9ccee7e | 2021-06-02 14:04:44 +0200 | [diff] [blame] | 270 | tr.detailsRow.collapsed { |
Ben Rohlfs | a8bb0da | 2021-04-12 08:56:20 +0200 | [diff] [blame] | 271 | display: none; |
| 272 | } |
Ben Rohlfs | c0c2ea5 | 2021-01-21 09:45:16 +0100 | [diff] [blame] | 273 | td .summary-cell .tags .tag { |
Ben Rohlfs | 1bbb096 | 2021-04-15 15:22:40 +0200 | [diff] [blame] | 274 | color: var(--primary-text-color); |
Ben Rohlfs | c0c2ea5 | 2021-01-21 09:45:16 +0100 | [diff] [blame] | 275 | display: inline-block; |
| 276 | border-radius: 20px; |
| 277 | background-color: var(--tag-background); |
| 278 | padding: 0 var(--spacing-m); |
| 279 | margin-left: var(--spacing-s); |
Ben Rohlfs | 48330a1 | 2021-12-09 15:12:17 +0100 | [diff] [blame] | 280 | cursor: pointer; |
Ben Rohlfs | c0c2ea5 | 2021-01-21 09:45:16 +0100 | [diff] [blame] | 281 | } |
Ben Rohlfs | 83db061 | 2021-05-21 09:18:44 +0200 | [diff] [blame] | 282 | td .summary-cell .tag.gray { |
Ben Rohlfs | ceca75d | 2021-03-17 22:46:22 +0100 | [diff] [blame] | 283 | background-color: var(--tag-gray); |
| 284 | } |
Ben Rohlfs | 83db061 | 2021-05-21 09:18:44 +0200 | [diff] [blame] | 285 | td .summary-cell .tag.yellow { |
Ben Rohlfs | ceca75d | 2021-03-17 22:46:22 +0100 | [diff] [blame] | 286 | background-color: var(--tag-yellow); |
| 287 | } |
Ben Rohlfs | 83db061 | 2021-05-21 09:18:44 +0200 | [diff] [blame] | 288 | td .summary-cell .tag.pink { |
Ben Rohlfs | ceca75d | 2021-03-17 22:46:22 +0100 | [diff] [blame] | 289 | background-color: var(--tag-pink); |
| 290 | } |
Ben Rohlfs | 83db061 | 2021-05-21 09:18:44 +0200 | [diff] [blame] | 291 | td .summary-cell .tag.purple { |
Ben Rohlfs | ceca75d | 2021-03-17 22:46:22 +0100 | [diff] [blame] | 292 | background-color: var(--tag-purple); |
| 293 | } |
Ben Rohlfs | 83db061 | 2021-05-21 09:18:44 +0200 | [diff] [blame] | 294 | td .summary-cell .tag.cyan { |
Ben Rohlfs | ceca75d | 2021-03-17 22:46:22 +0100 | [diff] [blame] | 295 | background-color: var(--tag-cyan); |
| 296 | } |
Ben Rohlfs | 83db061 | 2021-05-21 09:18:44 +0200 | [diff] [blame] | 297 | td .summary-cell .tag.brown { |
Ben Rohlfs | ceca75d | 2021-03-17 22:46:22 +0100 | [diff] [blame] | 298 | background-color: var(--tag-brown); |
| 299 | } |
Milutin Kristofic | 7ada745 | 2024-03-18 20:04:46 +0100 | [diff] [blame] | 300 | .actions-shown-on-collapsed gr-checks-action, |
Ben Rohlfs | a8bb0da | 2021-04-12 08:56:20 +0200 | [diff] [blame] | 301 | .actions gr-checks-action, |
| 302 | .actions gr-dropdown { |
| 303 | /* Fitting a 28px button into 20px line-height. */ |
| 304 | margin: -4px 0; |
| 305 | vertical-align: top; |
| 306 | } |
Chris Poucet | 1c71386 | 2022-07-25 13:12:24 +0200 | [diff] [blame] | 307 | #moreActions gr-icon { |
Ben Rohlfs | a8bb0da | 2021-04-12 08:56:20 +0200 | [diff] [blame] | 308 | color: var(--link-color); |
| 309 | } |
| 310 | #moreMessage { |
| 311 | display: none; |
| 312 | } |
Ben Rohlfs | 7df6867 | 2021-05-21 08:14:38 +0200 | [diff] [blame] | 313 | td .summary-cell .label { |
| 314 | margin-left: var(--spacing-s); |
| 315 | border-radius: var(--border-radius); |
| 316 | color: var(--vote-text-color); |
| 317 | display: inline-block; |
| 318 | padding: 0 var(--spacing-s); |
| 319 | text-align: center; |
| 320 | } |
| 321 | td .summary-cell .label.neutral { |
| 322 | background-color: var(--vote-color-neutral); |
| 323 | } |
| 324 | td .summary-cell .label.recommended, |
| 325 | td .summary-cell .label.disliked { |
| 326 | line-height: calc(var(--line-height-normal) - 2px); |
| 327 | color: var(--chip-color); |
| 328 | } |
| 329 | td .summary-cell .label.recommended { |
| 330 | background-color: var(--vote-color-recommended); |
| 331 | border: 1px solid var(--vote-outline-recommended); |
| 332 | } |
| 333 | td .summary-cell .label.disliked { |
| 334 | background-color: var(--vote-color-disliked); |
| 335 | border: 1px solid var(--vote-outline-disliked); |
| 336 | } |
| 337 | td .summary-cell .label.approved { |
| 338 | background-color: var(--vote-color-approved); |
| 339 | } |
| 340 | td .summary-cell .label.rejected { |
| 341 | background-color: var(--vote-color-rejected); |
| 342 | } |
Ben Rohlfs | c0c2ea5 | 2021-01-21 09:45:16 +0100 | [diff] [blame] | 343 | `, |
| 344 | ]; |
| 345 | } |
| 346 | |
Ben Rohlfs | a2b6b7a | 2023-05-15 10:12:41 +0200 | [diff] [blame] | 347 | override willUpdate(changedProperties: PropertyValues) { |
Ben Rohlfs | e6c57d0 | 2021-01-25 11:22:39 +0100 | [diff] [blame] | 348 | if (changedProperties.has('result')) { |
Ben Rohlfs | a2b6b7a | 2023-05-15 10:12:41 +0200 | [diff] [blame] | 349 | this.isExpandable = computeIsExpandable(this.result); |
Ben Rohlfs | e6c57d0 | 2021-01-25 11:22:39 +0100 | [diff] [blame] | 350 | } |
Ben Rohlfs | e6c57d0 | 2021-01-25 11:22:39 +0100 | [diff] [blame] | 351 | } |
| 352 | |
Gerrit Code Review | 7903123 | 2021-08-19 14:32:41 +0000 | [diff] [blame] | 353 | override focus() { |
Ben Rohlfs | ea7c3d4 | 2021-06-18 12:26:22 +0200 | [diff] [blame] | 354 | if (this.nameEl) this.nameEl.focus(); |
| 355 | } |
| 356 | |
Gerrit Code Review | 7903123 | 2021-08-19 14:32:41 +0000 | [diff] [blame] | 357 | override firstUpdated() { |
Ben Rohlfs | 2b38e5f | 2021-02-22 16:43:40 +0100 | [diff] [blame] | 358 | const loading = this.shadowRoot?.querySelector('.container'); |
| 359 | assertIsDefined(loading, '"Loading" element'); |
Chris Poucet | 955e3b8 | 2021-10-11 12:15:16 +0000 | [diff] [blame] | 360 | whenVisible( |
| 361 | loading, |
| 362 | () => { |
| 363 | this.shouldRender = true; |
| 364 | }, |
| 365 | 200 |
| 366 | ); |
Ben Rohlfs | 2b38e5f | 2021-02-22 16:43:40 +0100 | [diff] [blame] | 367 | } |
| 368 | |
Gerrit Code Review | 7903123 | 2021-08-19 14:32:41 +0000 | [diff] [blame] | 369 | override render() { |
Ben Rohlfs | c0c2ea5 | 2021-01-21 09:45:16 +0100 | [diff] [blame] | 370 | if (!this.result) return ''; |
Ben Rohlfs | 2b38e5f | 2021-02-22 16:43:40 +0100 | [diff] [blame] | 371 | if (!this.shouldRender) { |
| 372 | return html` |
| 373 | <tr class="container"> |
Ben Rohlfs | 2b38e5f | 2021-02-22 16:43:40 +0100 | [diff] [blame] | 374 | <td class="nameCol"> |
| 375 | <div><span class="loading">Loading...</span></div> |
| 376 | </td> |
| 377 | <td class="summaryCol"></td> |
| 378 | <td class="expanderCol"></td> |
| 379 | </tr> |
| 380 | `; |
| 381 | } |
Ben Rohlfs | c0c2ea5 | 2021-01-21 09:45:16 +0100 | [diff] [blame] | 382 | return html` |
Ben Rohlfs | 8003bd3 | 2022-04-05 18:24:42 +0200 | [diff] [blame] | 383 | <tr class=${classMap({container: true, collapsed: !this.isExpanded})}> |
| 384 | <td class="nameCol" @click=${this.toggleExpandedClick}> |
Ben Rohlfs | 0720983 | 2021-05-18 15:23:06 +0200 | [diff] [blame] | 385 | <div class="flex"> |
Ben Rohlfs | 8003bd3 | 2022-04-05 18:24:42 +0200 | [diff] [blame] | 386 | <gr-hovercard-run .run=${this.result}></gr-hovercard-run> |
Ben Rohlfs | ea7c3d4 | 2021-06-18 12:26:22 +0200 | [diff] [blame] | 387 | <div |
| 388 | class="name" |
| 389 | role="button" |
| 390 | tabindex="0" |
Ben Rohlfs | 8003bd3 | 2022-04-05 18:24:42 +0200 | [diff] [blame] | 391 | @click=${this.toggleExpandedClick} |
| 392 | @keydown=${this.toggleExpandedPress} |
Ben Rohlfs | ea7c3d4 | 2021-06-18 12:26:22 +0200 | [diff] [blame] | 393 | > |
| 394 | ${this.result.checkName} |
| 395 | </div> |
Ben Rohlfs | ebef2e1 | 2022-09-01 17:22:24 +0200 | [diff] [blame] | 396 | ${this.renderAttempt()} |
Ben Rohlfs | 0720983 | 2021-05-18 15:23:06 +0200 | [diff] [blame] | 397 | <div class="space"></div> |
Ben Rohlfs | b5f6285 | 2021-03-23 11:23:17 +0100 | [diff] [blame] | 398 | </div> |
Ben Rohlfs | e6c57d0 | 2021-01-25 11:22:39 +0100 | [diff] [blame] | 399 | </td> |
| 400 | <td class="summaryCol"> |
| 401 | <div class="summary-cell"> |
Ben Rohlfs | 3bc8128 | 2021-06-02 13:48:17 +0200 | [diff] [blame] | 402 | ${this.renderLink(firstPrimaryLink(this.result))} |
Ben Rohlfs | 23a466c | 2021-02-17 12:03:53 +0100 | [diff] [blame] | 403 | ${this.renderSummary(this.result.summary)} |
Ben Rohlfs | 8003bd3 | 2022-04-05 18:24:42 +0200 | [diff] [blame] | 404 | <div class="message" @click=${this.toggleExpandedClick}> |
Ben Rohlfs | 178f56f | 2021-01-27 14:52:28 +0000 | [diff] [blame] | 405 | ${this.isExpanded ? '' : this.result.message} |
| 406 | </div> |
Ben Rohlfs | 7e8548c | 2021-06-11 10:13:40 +0200 | [diff] [blame] | 407 | ${this.renderLinks()} ${this.renderActions()} |
| 408 | <div class="tags"> |
Ben Rohlfs | e6c57d0 | 2021-01-25 11:22:39 +0100 | [diff] [blame] | 409 | ${(this.result.tags ?? []).map(t => this.renderTag(t))} |
| 410 | </div> |
Ben Rohlfs | 7e8548c | 2021-06-11 10:13:40 +0200 | [diff] [blame] | 411 | ${this.renderLabel()} |
Ben Rohlfs | c0c2ea5 | 2021-01-21 09:45:16 +0100 | [diff] [blame] | 412 | </div> |
Ben Rohlfs | e6c57d0 | 2021-01-25 11:22:39 +0100 | [diff] [blame] | 413 | </td> |
Ben Rohlfs | 8003bd3 | 2022-04-05 18:24:42 +0200 | [diff] [blame] | 414 | <td class="expanderCol" @click=${this.toggleExpandedClick}> |
Ben Rohlfs | e6c57d0 | 2021-01-25 11:22:39 +0100 | [diff] [blame] | 415 | <div |
| 416 | class="show-hide" |
| 417 | role="switch" |
| 418 | tabindex="0" |
Ben Rohlfs | 8003bd3 | 2022-04-05 18:24:42 +0200 | [diff] [blame] | 419 | ?hidden=${!this.isExpandable} |
| 420 | aria-checked=${this.isExpanded ? 'true' : 'false'} |
| 421 | aria-label=${this.isExpanded |
Ben Rohlfs | e6c57d0 | 2021-01-25 11:22:39 +0100 | [diff] [blame] | 422 | ? 'Collapse result row' |
Ben Rohlfs | 8003bd3 | 2022-04-05 18:24:42 +0200 | [diff] [blame] | 423 | : 'Expand result row'} |
| 424 | @keydown=${this.toggleExpandedPress} |
Ben Rohlfs | e6c57d0 | 2021-01-25 11:22:39 +0100 | [diff] [blame] | 425 | > |
Chris Poucet | 1c71386 | 2022-07-25 13:12:24 +0200 | [diff] [blame] | 426 | <gr-icon |
| 427 | icon=${this.isExpanded ? 'expand_less' : 'expand_more'} |
| 428 | ></gr-icon> |
Ben Rohlfs | e6c57d0 | 2021-01-25 11:22:39 +0100 | [diff] [blame] | 429 | </div> |
| 430 | </td> |
| 431 | </tr> |
Ben Rohlfs | 8003bd3 | 2022-04-05 18:24:42 +0200 | [diff] [blame] | 432 | <tr class=${classMap({detailsRow: true, collapsed: !this.isExpanded})}> |
Ben Rohlfs | 894dd29 | 2021-06-16 12:10:20 +0200 | [diff] [blame] | 433 | <td class="expandedCol" colspan="3">${this.renderExpanded()}</td> |
Ben Rohlfs | 9ccee7e | 2021-06-02 14:04:44 +0200 | [diff] [blame] | 434 | </tr> |
Ben Rohlfs | c0c2ea5 | 2021-01-21 09:45:16 +0100 | [diff] [blame] | 435 | `; |
| 436 | } |
| 437 | |
Ben Rohlfs | ebef2e1 | 2022-09-01 17:22:24 +0200 | [diff] [blame] | 438 | private renderAttempt() { |
| 439 | if (this.selectedAttempt !== ALL_ATTEMPTS) return nothing; |
| 440 | return html`<gr-checks-attempt .run=${this.result}></gr-checks-attempt>`; |
| 441 | } |
| 442 | |
Ben Rohlfs | b36b2ba | 2021-04-07 14:36:05 +0200 | [diff] [blame] | 443 | private renderExpanded() { |
| 444 | if (!this.isExpanded) return; |
| 445 | return html`<gr-result-expanded |
Ben Rohlfs | 8003bd3 | 2022-04-05 18:24:42 +0200 | [diff] [blame] | 446 | .result=${this.result} |
Ben Rohlfs | b36b2ba | 2021-04-07 14:36:05 +0200 | [diff] [blame] | 447 | ></gr-result-expanded>`; |
| 448 | } |
| 449 | |
Ben Rohlfs | ea7c3d4 | 2021-06-18 12:26:22 +0200 | [diff] [blame] | 450 | private toggleExpandedClick(e: MouseEvent) { |
| 451 | if (!this.isExpandable) return; |
| 452 | e.preventDefault(); |
| 453 | e.stopPropagation(); |
| 454 | this.toggleExpanded(); |
| 455 | } |
| 456 | |
Ben Rohlfs | 48330a1 | 2021-12-09 15:12:17 +0100 | [diff] [blame] | 457 | private tagClick(e: MouseEvent, tagName: string) { |
| 458 | e.preventDefault(); |
| 459 | e.stopPropagation(); |
Ben Rohlfs | cced911 | 2021-12-22 16:34:54 +0100 | [diff] [blame] | 460 | this.reporting.reportInteraction(Interaction.CHECKS_TAG_CLICKED, { |
| 461 | tagName, |
| 462 | checkName: this.result?.checkName, |
| 463 | }); |
Ben Rohlfs | 48330a1 | 2021-12-09 15:12:17 +0100 | [diff] [blame] | 464 | fire(this, 'checks-results-filter', {filterRegExp: tagName}); |
| 465 | } |
| 466 | |
Ben Rohlfs | ea7c3d4 | 2021-06-18 12:26:22 +0200 | [diff] [blame] | 467 | private toggleExpandedPress(e: KeyboardEvent) { |
| 468 | if (!this.isExpandable) return; |
| 469 | if (modifierPressed(e)) return; |
Frank Borden | 7ff29de | 2022-08-30 19:15:46 +0200 | [diff] [blame] | 470 | if (e.key !== 'Enter' && e.key !== ' ') return; |
Ben Rohlfs | ea7c3d4 | 2021-06-18 12:26:22 +0200 | [diff] [blame] | 471 | e.preventDefault(); |
| 472 | e.stopPropagation(); |
| 473 | this.toggleExpanded(); |
| 474 | } |
| 475 | |
Ben Rohlfs | a8bcf74 | 2024-06-14 08:27:11 +0200 | [diff] [blame^] | 476 | /** Toggles the expanded state, or if `setExpanded` is provided sets it to the desired state. */ |
| 477 | toggleExpanded(setExpanded?: boolean) { |
Ben Rohlfs | e6c57d0 | 2021-01-25 11:22:39 +0100 | [diff] [blame] | 478 | if (!this.isExpandable) return; |
Ben Rohlfs | a8bcf74 | 2024-06-14 08:27:11 +0200 | [diff] [blame^] | 479 | this.isExpanded = |
| 480 | setExpanded === undefined ? !this.isExpanded : setExpanded; |
Ben Rohlfs | cced911 | 2021-12-22 16:34:54 +0100 | [diff] [blame] | 481 | this.reporting.reportInteraction(Interaction.CHECKS_RESULT_ROW_TOGGLE, { |
| 482 | expanded: this.isExpanded, |
| 483 | checkName: this.result?.checkName, |
| 484 | }); |
Ben Rohlfs | e6c57d0 | 2021-01-25 11:22:39 +0100 | [diff] [blame] | 485 | } |
| 486 | |
Ben Rohlfs | 23a466c | 2021-02-17 12:03:53 +0100 | [diff] [blame] | 487 | renderSummary(text?: string) { |
Kamil Musin | 48fa4ed | 2024-02-05 15:16:07 +0100 | [diff] [blame] | 488 | text = text ?? ''; |
Ben Rohlfs | 23a466c | 2021-02-17 12:03:53 +0100 | [diff] [blame] | 489 | return html` |
| 490 | <!-- The is for being able to shrink a tiny amount without |
| 491 | the text itself getting shrunk with an ellipsis. --> |
Ben Rohlfs | ee9cef7 | 2022-06-29 14:53:47 +0200 | [diff] [blame] | 492 | <div class="summary" @click=${this.toggleExpanded} title=${text}> |
| 493 | ${text} |
| 494 | </div> |
Ben Rohlfs | 23a466c | 2021-02-17 12:03:53 +0100 | [diff] [blame] | 495 | `; |
| 496 | } |
| 497 | |
Ben Rohlfs | c0c2ea5 | 2021-01-21 09:45:16 +0100 | [diff] [blame] | 498 | renderLabel() { |
Ben Rohlfs | 7df6867 | 2021-05-21 08:14:38 +0200 | [diff] [blame] | 499 | const category = this.result?.category; |
| 500 | if (category !== Category.ERROR && category !== Category.WARNING) return; |
Ben Rohlfs | c0c2ea5 | 2021-01-21 09:45:16 +0100 | [diff] [blame] | 501 | const label = this.result?.labelName; |
| 502 | if (!label) return; |
Ben Rohlfs | 396a624 | 2021-05-26 13:29:55 +0200 | [diff] [blame] | 503 | if (!this.result?.isLatestAttempt) return; |
Ben Rohlfs | 05126b1 | 2022-06-29 16:13:56 +0200 | [diff] [blame] | 504 | // For check results on older patchsets it is impossible to decide whether |
| 505 | // the current label score is still influenced by them. But typically it |
| 506 | // is really confusing for the user, if we claim that an old (error) result |
| 507 | // influences the current (positive) score. So we prefer to be conservative |
| 508 | // and only display the label chip for checks results on the latest ps. |
| 509 | if (this.result.patchset !== this.latestPatchNum) return; |
Ben Rohlfs | 7df6867 | 2021-05-21 08:14:38 +0200 | [diff] [blame] | 510 | const info = this.labels?.[label]; |
| 511 | const status = getLabelStatus(info).toLowerCase(); |
Ben Rohlfs | e29f190 | 2021-06-23 10:08:00 +0200 | [diff] [blame] | 512 | const value = getRepresentativeValue(info); |
| 513 | // A neutral vote is not interesting for the user to see and is just |
| 514 | // cluttering the UI. |
| 515 | if (value === 0) return; |
| 516 | const valueStr = valueString(value); |
Ben Rohlfs | 0629e83 | 2021-06-11 12:44:12 +0200 | [diff] [blame] | 517 | return html` |
| 518 | <div class="label ${status}"> |
Ben Rohlfs | e29f190 | 2021-06-23 10:08:00 +0200 | [diff] [blame] | 519 | <span>${label} ${valueStr}</span> |
Chris Poucet | 4f74492 | 2024-04-09 15:25:30 +0200 | [diff] [blame] | 520 | <paper-tooltip offset="5" .fitToVisibleBounds=${true}> |
Ben Rohlfs | 0629e83 | 2021-06-11 12:44:12 +0200 | [diff] [blame] | 521 | The check result has (probably) influenced this label vote. |
| 522 | </paper-tooltip> |
| 523 | </div> |
| 524 | `; |
Ben Rohlfs | c0c2ea5 | 2021-01-21 09:45:16 +0100 | [diff] [blame] | 525 | } |
| 526 | |
Ben Rohlfs | a8bb0da | 2021-04-12 08:56:20 +0200 | [diff] [blame] | 527 | renderLinks() { |
Ben Rohlfs | fb8e848 | 2021-06-02 14:39:11 +0200 | [diff] [blame] | 528 | const links = otherPrimaryLinks(this.result) |
| 529 | // Showing the same icons twice without text is super confusing. |
| 530 | .filter( |
| 531 | (link: Link, index: number, array: Link[]) => |
| 532 | array.findIndex(other => link.icon === other.icon) === index |
| 533 | ) |
| 534 | // 4 is enough for the summary row. All are shown in expanded state. |
| 535 | .slice(0, 4); |
Ben Rohlfs | a8bb0da | 2021-04-12 08:56:20 +0200 | [diff] [blame] | 536 | if (links.length === 0) return; |
Ben Rohlfs | fb8e848 | 2021-06-02 14:39:11 +0200 | [diff] [blame] | 537 | return html`<div class="links"> |
| 538 | ${links.map(link => this.renderLink(link))} |
| 539 | </div>`; |
Ben Rohlfs | a8bb0da | 2021-04-12 08:56:20 +0200 | [diff] [blame] | 540 | } |
| 541 | |
Ben Rohlfs | b04d856 | 2021-05-26 13:57:15 +0200 | [diff] [blame] | 542 | renderLink(link?: Link) { |
Ben Rohlfs | fb8e848 | 2021-06-02 14:39:11 +0200 | [diff] [blame] | 543 | // The expanded state renders all links in more detail. Hide in summary. |
| 544 | if (this.isExpanded) return; |
Ben Rohlfs | b04d856 | 2021-05-26 13:57:15 +0200 | [diff] [blame] | 545 | if (!link) return; |
Ben Rohlfs | a8bb0da | 2021-04-12 08:56:20 +0200 | [diff] [blame] | 546 | const tooltipText = link.tooltip ?? tooltipForLink(link.icon); |
Chris Poucet | 5ca5e80 | 2022-07-18 15:26:29 +0200 | [diff] [blame] | 547 | const icon = iconForLink(link.icon); |
Ben Rohlfs | 3630a38 | 2023-06-23 12:53:18 +0200 | [diff] [blame] | 548 | return html`<a |
| 549 | href=${link.url} |
| 550 | class="link" |
| 551 | target="_blank" |
| 552 | rel="noopener noreferrer" |
Chris Poucet | 1c71386 | 2022-07-25 13:12:24 +0200 | [diff] [blame] | 553 | ><gr-icon |
| 554 | icon=${icon.name} |
| 555 | ?filled=${icon.filled} |
Ben Rohlfs | a8bb0da | 2021-04-12 08:56:20 +0200 | [diff] [blame] | 556 | aria-label="external link to details" |
Chris Poucet | 1c71386 | 2022-07-25 13:12:24 +0200 | [diff] [blame] | 557 | class="link" |
Ben Rohlfs | 5faf113d | 2022-08-15 12:22:43 +0200 | [diff] [blame] | 558 | ></gr-icon |
| 559 | ><paper-tooltip offset="5">${tooltipText}</paper-tooltip></a |
Ben Rohlfs | a8bb0da | 2021-04-12 08:56:20 +0200 | [diff] [blame] | 560 | >`; |
| 561 | } |
| 562 | |
| 563 | private renderActions() { |
Ben Rohlfs | d0207e5 | 2022-08-04 22:02:00 +0200 | [diff] [blame] | 564 | const actions = [...(this.result?.actions ?? [])]; |
Ben Rohlfs | b8e3526 | 2022-11-02 12:02:07 +0100 | [diff] [blame] | 565 | const fixAction = createFixAction(this, this.result); |
| 566 | if (fixAction) actions.unshift(fixAction); |
Ben Rohlfs | a8bb0da | 2021-04-12 08:56:20 +0200 | [diff] [blame] | 567 | if (actions.length === 0) return; |
| 568 | const overflowItems = actions.slice(2).map(action => { |
| 569 | return {...action, id: action.name}; |
| 570 | }); |
Ben Rohlfs | d70a337 | 2021-05-18 12:52:12 +0200 | [diff] [blame] | 571 | const disabledItems = overflowItems |
| 572 | .filter(action => action.disabled) |
| 573 | .map(action => action.id); |
Milutin Kristofic | 7ada745 | 2024-03-18 20:04:46 +0100 | [diff] [blame] | 574 | return html` ${when( |
| 575 | fixAction, |
| 576 | () => |
| 577 | html`<div class="actions-shown-on-collapsed"> |
| 578 | ${this.renderAction(fixAction)} |
| 579 | </div> ` |
| 580 | )} |
| 581 | <div class="actions"> |
| 582 | ${this.renderAction(actions[0])} ${this.renderAction(actions[1])} |
| 583 | <gr-dropdown |
| 584 | id="moreActions" |
| 585 | link="" |
| 586 | vertical-offset="32" |
| 587 | horizontal-align="right" |
| 588 | @tap-item=${this.handleAction} |
| 589 | @opened-changed=${(e: ValueChangedEvent<boolean>) => |
| 590 | this.classList.toggle('dropdown-open', e.detail.value)} |
| 591 | ?hidden=${overflowItems.length === 0} |
| 592 | .items=${overflowItems} |
| 593 | .disabledIds=${disabledItems} |
| 594 | > |
| 595 | <gr-icon icon="more_vert" aria-labelledby="moreMessage"></gr-icon> |
| 596 | <span id="moreMessage">More</span> |
| 597 | </gr-dropdown> |
| 598 | </div>`; |
Ben Rohlfs | a8bb0da | 2021-04-12 08:56:20 +0200 | [diff] [blame] | 599 | } |
| 600 | |
| 601 | private handleAction(e: CustomEvent<Action>) { |
Ben Rohlfs | cced911 | 2021-12-22 16:34:54 +0100 | [diff] [blame] | 602 | this.getChecksModel().triggerAction( |
| 603 | e.detail, |
| 604 | this.result, |
| 605 | 'result-row-dropdown' |
| 606 | ); |
Ben Rohlfs | a8bb0da | 2021-04-12 08:56:20 +0200 | [diff] [blame] | 607 | } |
| 608 | |
| 609 | private renderAction(action?: Action) { |
| 610 | if (!action) return; |
Ben Rohlfs | cced911 | 2021-12-22 16:34:54 +0100 | [diff] [blame] | 611 | return html`<gr-checks-action |
| 612 | context="result-row" |
Ben Rohlfs | 8003bd3 | 2022-04-05 18:24:42 +0200 | [diff] [blame] | 613 | .action=${action} |
Ben Rohlfs | cced911 | 2021-12-22 16:34:54 +0100 | [diff] [blame] | 614 | ></gr-checks-action>`; |
Ben Rohlfs | a8bb0da | 2021-04-12 08:56:20 +0200 | [diff] [blame] | 615 | } |
| 616 | |
Ben Rohlfs | c0c2ea5 | 2021-01-21 09:45:16 +0100 | [diff] [blame] | 617 | renderTag(tag: Tag) { |
Ben Rohlfs | 48330a1 | 2021-12-09 15:12:17 +0100 | [diff] [blame] | 618 | return html`<button |
| 619 | class="tag ${tag.color}" |
Ben Rohlfs | 8003bd3 | 2022-04-05 18:24:42 +0200 | [diff] [blame] | 620 | @click=${(e: MouseEvent) => this.tagClick(e, tag.name)} |
Ben Rohlfs | 48330a1 | 2021-12-09 15:12:17 +0100 | [diff] [blame] | 621 | > |
Ben Rohlfs | 0629e83 | 2021-06-11 12:44:12 +0200 | [diff] [blame] | 622 | <span>${tag.name}</span> |
Chris Poucet | 4f74492 | 2024-04-09 15:25:30 +0200 | [diff] [blame] | 623 | <paper-tooltip offset="5" .fitToVisibleBounds=${true}> |
Milutin Kristofic | a16c93f | 2022-01-10 21:28:12 +0100 | [diff] [blame] | 624 | ${tag.tooltip ?? |
| 625 | 'A category tag for this check result. Click to filter.'} |
Ben Rohlfs | 0629e83 | 2021-06-11 12:44:12 +0200 | [diff] [blame] | 626 | </paper-tooltip> |
Milutin Kristofic | a16c93f | 2022-01-10 21:28:12 +0100 | [diff] [blame] | 627 | </button>`; |
Ben Rohlfs | c0c2ea5 | 2021-01-21 09:45:16 +0100 | [diff] [blame] | 628 | } |
| 629 | } |
| 630 | |
Ben Rohlfs | e6c57d0 | 2021-01-25 11:22:39 +0100 | [diff] [blame] | 631 | @customElement('gr-result-expanded') |
Ben Rohlfs | 0ca140a | 2021-09-03 10:43:37 +0200 | [diff] [blame] | 632 | class GrResultExpanded extends LitElement { |
Ben Rohlfs | ece23f9 | 2021-09-30 14:58:37 +0200 | [diff] [blame] | 633 | @property({attribute: false}) |
Ben Rohlfs | e6c57d0 | 2021-01-25 11:22:39 +0100 | [diff] [blame] | 634 | result?: RunResult; |
| 635 | |
Ben Rohlfs | 21b1cb4 | 2021-12-16 13:17:23 +0100 | [diff] [blame] | 636 | @property({type: Boolean}) |
| 637 | hideCodePointers = false; |
| 638 | |
Chris Poucet | bf65b8f | 2022-01-18 21:18:12 +0000 | [diff] [blame] | 639 | private getChangeModel = resolve(this, changeModelToken); |
Ben Rohlfs | 7d262be | 2021-06-02 14:59:03 +0200 | [diff] [blame] | 640 | |
Ben Rohlfs | 140fadf | 2024-06-12 12:10:56 +0000 | [diff] [blame] | 641 | private readonly getViewModel = resolve(this, changeViewModelToken); |
| 642 | |
Gerrit Code Review | 7903123 | 2021-08-19 14:32:41 +0000 | [diff] [blame] | 643 | static override get styles() { |
Ben Rohlfs | e6c57d0 | 2021-01-25 11:22:39 +0100 | [diff] [blame] | 644 | return [ |
| 645 | sharedStyles, |
| 646 | css` |
Ben Rohlfs | fb8e848 | 2021-06-02 14:39:11 +0200 | [diff] [blame] | 647 | .links { |
| 648 | white-space: normal; |
Ben Rohlfs | fb8e848 | 2021-06-02 14:39:11 +0200 | [diff] [blame] | 649 | } |
| 650 | .links a { |
| 651 | display: inline-block; |
| 652 | margin-right: var(--spacing-xl); |
| 653 | } |
Chris Poucet | 1c71386 | 2022-07-25 13:12:24 +0200 | [diff] [blame] | 654 | .links a gr-icon { |
Ben Rohlfs | fb8e848 | 2021-06-02 14:39:11 +0200 | [diff] [blame] | 655 | margin-right: var(--spacing-xs); |
| 656 | } |
Ben Rohlfs | e6c57d0 | 2021-01-25 11:22:39 +0100 | [diff] [blame] | 657 | .message { |
Ben Rohlfs | 894dd29 | 2021-06-16 12:10:20 +0200 | [diff] [blame] | 658 | padding: var(--spacing-m) 0; |
Ben Rohlfs | e6c57d0 | 2021-01-25 11:22:39 +0100 | [diff] [blame] | 659 | } |
| 660 | `, |
| 661 | ]; |
| 662 | } |
| 663 | |
Gerrit Code Review | 7903123 | 2021-08-19 14:32:41 +0000 | [diff] [blame] | 664 | override render() { |
Ben Rohlfs | e6c57d0 | 2021-01-25 11:22:39 +0100 | [diff] [blame] | 665 | if (!this.result) return ''; |
Ben Rohlfs | 178f56f | 2021-01-27 14:52:28 +0000 | [diff] [blame] | 666 | return html` |
Ben Rohlfs | fb8e848 | 2021-06-02 14:39:11 +0200 | [diff] [blame] | 667 | ${this.renderFirstPrimaryLink()} ${this.renderOtherPrimaryLinks()} |
Ben Rohlfs | 7d262be | 2021-06-02 14:59:03 +0200 | [diff] [blame] | 668 | ${this.renderSecondaryLinks()} ${this.renderCodePointers()} |
Ben Rohlfs | c767e66 | 2021-08-05 15:23:32 +0200 | [diff] [blame] | 669 | <gr-endpoint-decorator |
| 670 | name="check-result-expanded" |
Ben Rohlfs | 8003bd3 | 2022-04-05 18:24:42 +0200 | [diff] [blame] | 671 | .targetPlugin=${this.result.pluginName} |
Ben Rohlfs | c767e66 | 2021-08-05 15:23:32 +0200 | [diff] [blame] | 672 | > |
Ben Rohlfs | 8003bd3 | 2022-04-05 18:24:42 +0200 | [diff] [blame] | 673 | <gr-endpoint-param name="run" .value=${this.result}></gr-endpoint-param> |
Ben Rohlfs | a8af867 | 2021-02-19 16:12:28 +0100 | [diff] [blame] | 674 | <gr-endpoint-param |
| 675 | name="result" |
Ben Rohlfs | 8003bd3 | 2022-04-05 18:24:42 +0200 | [diff] [blame] | 676 | .value=${this.result} |
Ben Rohlfs | a8af867 | 2021-02-19 16:12:28 +0100 | [diff] [blame] | 677 | ></gr-endpoint-param> |
Ben Rohlfs | 04b6c1f | 2021-04-15 17:24:23 +0200 | [diff] [blame] | 678 | <gr-formatted-text |
Ben Rohlfs | 04b6c1f | 2021-04-15 17:24:23 +0200 | [diff] [blame] | 679 | class="message" |
Frank Borden | abdd187 | 2022-09-26 12:55:59 +0200 | [diff] [blame] | 680 | .markdown=${true} |
| 681 | .content=${this.result.message ?? ''} |
Ben Rohlfs | 04b6c1f | 2021-04-15 17:24:23 +0200 | [diff] [blame] | 682 | ></gr-formatted-text> |
Ben Rohlfs | a8af867 | 2021-02-19 16:12:28 +0100 | [diff] [blame] | 683 | </gr-endpoint-decorator> |
Ben Rohlfs | 178f56f | 2021-01-27 14:52:28 +0000 | [diff] [blame] | 684 | `; |
Ben Rohlfs | e6c57d0 | 2021-01-25 11:22:39 +0100 | [diff] [blame] | 685 | } |
Ben Rohlfs | fb8e848 | 2021-06-02 14:39:11 +0200 | [diff] [blame] | 686 | |
| 687 | private renderFirstPrimaryLink() { |
| 688 | const link = firstPrimaryLink(this.result); |
| 689 | if (!link) return; |
| 690 | return html`<div class="links">${this.renderLink(link)}</div>`; |
| 691 | } |
| 692 | |
| 693 | private renderOtherPrimaryLinks() { |
| 694 | const links = otherPrimaryLinks(this.result); |
Ben Rohlfs | 7d262be | 2021-06-02 14:59:03 +0200 | [diff] [blame] | 695 | if (links.length === 0) return; |
Ben Rohlfs | fb8e848 | 2021-06-02 14:39:11 +0200 | [diff] [blame] | 696 | return html`<div class="links"> |
| 697 | ${links.map(link => this.renderLink(link))} |
| 698 | </div>`; |
| 699 | } |
| 700 | |
| 701 | private renderSecondaryLinks() { |
| 702 | const links = secondaryLinks(this.result); |
Ben Rohlfs | 7d262be | 2021-06-02 14:59:03 +0200 | [diff] [blame] | 703 | if (links.length === 0) return; |
Ben Rohlfs | fb8e848 | 2021-06-02 14:39:11 +0200 | [diff] [blame] | 704 | return html`<div class="links"> |
| 705 | ${links.map(link => this.renderLink(link))} |
| 706 | </div>`; |
| 707 | } |
| 708 | |
Ben Rohlfs | 7d262be | 2021-06-02 14:59:03 +0200 | [diff] [blame] | 709 | private renderCodePointers() { |
Ben Rohlfs | 21b1cb4 | 2021-12-16 13:17:23 +0100 | [diff] [blame] | 710 | if (this.hideCodePointers) return; |
Ben Rohlfs | 7d262be | 2021-06-02 14:59:03 +0200 | [diff] [blame] | 711 | const pointers = this.result?.codePointers ?? []; |
| 712 | if (pointers.length === 0) return; |
| 713 | const links = pointers.map(pointer => { |
| 714 | let rangeText = ''; |
| 715 | const start = pointer?.range?.start_line; |
| 716 | const end = pointer?.range?.end_line; |
| 717 | if (start) rangeText += `#${start}`; |
| 718 | if (end && start !== end) rangeText += `-${end}`; |
Chris Poucet | bf65b8f | 2022-01-18 21:18:12 +0000 | [diff] [blame] | 719 | const change = this.getChangeModel().getChange(); |
Ben Rohlfs | 7d262be | 2021-06-02 14:59:03 +0200 | [diff] [blame] | 720 | assertIsDefined(change); |
| 721 | const path = pointer.path; |
Ben Rohlfs | 140fadf | 2024-06-12 12:10:56 +0000 | [diff] [blame] | 722 | const patchset = this.result?.patchset as PatchSetNumber; |
Ben Rohlfs | 7d262be | 2021-06-02 14:59:03 +0200 | [diff] [blame] | 723 | const line = pointer?.range?.start_line; |
| 724 | return { |
| 725 | icon: LinkIcon.CODE, |
| 726 | tooltip: `${path}${rangeText}`, |
Ben Rohlfs | 140fadf | 2024-06-12 12:10:56 +0000 | [diff] [blame] | 727 | url: this.getViewModel().diffUrl({ |
| 728 | basePatchNum: PARENT, |
Ben Rohlfs | 731738b | 2022-09-15 15:55:33 +0200 | [diff] [blame] | 729 | patchNum: patchset, |
Ben Rohlfs | 05234f5 | 2023-05-17 09:40:47 +0200 | [diff] [blame] | 730 | checksPatchset: patchset, |
Ben Rohlfs | ecc6799 | 2022-12-16 10:10:16 +0100 | [diff] [blame] | 731 | diffView: {path, lineNum: line}, |
Ben Rohlfs | 731738b | 2022-09-15 15:55:33 +0200 | [diff] [blame] | 732 | }), |
Ben Rohlfs | 7d262be | 2021-06-02 14:59:03 +0200 | [diff] [blame] | 733 | primary: true, |
| 734 | }; |
| 735 | }); |
| 736 | return links.map( |
| 737 | link => html`<div class="links">${this.renderLink(link, false)}</div>` |
| 738 | ); |
| 739 | } |
| 740 | |
| 741 | private renderLink(link?: Link, targetBlank = true) { |
Ben Rohlfs | fb8e848 | 2021-06-02 14:39:11 +0200 | [diff] [blame] | 742 | if (!link) return; |
| 743 | const text = link.tooltip ?? tooltipForLink(link.icon); |
Ben Rohlfs | 7d262be | 2021-06-02 14:59:03 +0200 | [diff] [blame] | 744 | const target = targetBlank ? '_blank' : undefined; |
Chris Poucet | 5ca5e80 | 2022-07-18 15:26:29 +0200 | [diff] [blame] | 745 | const icon = iconForLink(link.icon); |
Ben Rohlfs | 3630a38 | 2023-06-23 12:53:18 +0200 | [diff] [blame] | 746 | return html`<a |
| 747 | href=${link.url} |
| 748 | target=${ifDefined(target)} |
| 749 | rel="noopener noreferrer" |
| 750 | > |
Chris Poucet | 1c71386 | 2022-07-25 13:12:24 +0200 | [diff] [blame] | 751 | <gr-icon icon=${icon.name} class="link" ?filled=${icon.filled}></gr-icon> |
| 752 | <span>${text}</span> |
Ben Rohlfs | fb8e848 | 2021-06-02 14:39:11 +0200 | [diff] [blame] | 753 | </a>`; |
| 754 | } |
Ben Rohlfs | e6c57d0 | 2021-01-25 11:22:39 +0100 | [diff] [blame] | 755 | } |
| 756 | |
Ben Rohlfs | 5929e4b | 2021-05-17 14:53:29 +0200 | [diff] [blame] | 757 | const CATEGORY_TOOLTIPS: Map<Category, string> = new Map(); |
| 758 | CATEGORY_TOOLTIPS.set(Category.ERROR, 'Must be fixed and is blocking submit'); |
| 759 | CATEGORY_TOOLTIPS.set( |
| 760 | Category.WARNING, |
| 761 | 'Should be checked but is not blocking submit' |
| 762 | ); |
| 763 | CATEGORY_TOOLTIPS.set( |
| 764 | Category.INFO, |
| 765 | 'Does not have to be checked, for your information only' |
| 766 | ); |
| 767 | CATEGORY_TOOLTIPS.set( |
| 768 | Category.SUCCESS, |
| 769 | 'Successful runs without results and individual successful results' |
| 770 | ); |
| 771 | |
Ben Rohlfs | c9f9098 | 2020-12-13 22:00:11 +0100 | [diff] [blame] | 772 | @customElement('gr-checks-results') |
Ben Rohlfs | 0ca140a | 2021-09-03 10:43:37 +0200 | [diff] [blame] | 773 | export class GrChecksResults extends LitElement { |
Ben Rohlfs | 2b38e5f | 2021-02-22 16:43:40 +0100 | [diff] [blame] | 774 | @query('#filterInput') |
| 775 | filterInput?: HTMLInputElement; |
| 776 | |
Frank Borden | f19f2b7 | 2021-05-12 11:21:34 +0200 | [diff] [blame] | 777 | @state() |
Ben Rohlfs | 209f141 | 2022-09-30 12:25:46 +0200 | [diff] [blame] | 778 | filterRegExp = ''; |
Ben Rohlfs | 2b38e5f | 2021-02-22 16:43:40 +0100 | [diff] [blame] | 779 | |
Ben Rohlfs | e6a4c47 | 2021-04-22 13:06:09 +0200 | [diff] [blame] | 780 | /** All runs. Shown should only the selected/filtered ones. */ |
Ben Rohlfs | ece23f9 | 2021-09-30 14:58:37 +0200 | [diff] [blame] | 781 | @property({attribute: false}) |
Ben Rohlfs | c9f9098 | 2020-12-13 22:00:11 +0100 | [diff] [blame] | 782 | runs: CheckRun[] = []; |
| 783 | |
Ben Rohlfs | e6a4c47 | 2021-04-22 13:06:09 +0200 | [diff] [blame] | 784 | /** |
| 785 | * Check names of runs that are selected in the runs panel. When this array |
| 786 | * is empty, then no run is selected and all runs should be shown. |
| 787 | */ |
Ben Rohlfs | 6485eb8 | 2022-09-30 11:26:08 +0200 | [diff] [blame] | 788 | @state() |
Ben Rohlfs | 20fe8e8 | 2022-10-14 11:13:10 +0200 | [diff] [blame] | 789 | selectedRuns: Set<string> = new Set(); |
Ben Rohlfs | e6a4c47 | 2021-04-22 13:06:09 +0200 | [diff] [blame] | 790 | |
Ben Rohlfs | ece23f9 | 2021-09-30 14:58:37 +0200 | [diff] [blame] | 791 | @state() |
Ben Rohlfs | 6c97c57 | 2021-03-22 09:53:03 +0100 | [diff] [blame] | 792 | actions: Action[] = []; |
| 793 | |
Ben Rohlfs | ece23f9 | 2021-09-30 14:58:37 +0200 | [diff] [blame] | 794 | @state() |
Ben Rohlfs | 0ae33e3 | 2021-04-23 10:01:00 +0200 | [diff] [blame] | 795 | links: Link[] = []; |
| 796 | |
Ben Rohlfs | ece23f9 | 2021-09-30 14:58:37 +0200 | [diff] [blame] | 797 | @property({attribute: false}) |
Ben Rohlfs | ed7d5db | 2021-03-05 15:12:18 +0100 | [diff] [blame] | 798 | tabState?: ChecksTabState; |
| 799 | |
Ben Rohlfs | ece23f9 | 2021-09-30 14:58:37 +0200 | [diff] [blame] | 800 | @state() |
Ben Rohlfs | 6c97c57 | 2021-03-22 09:53:03 +0100 | [diff] [blame] | 801 | someProvidersAreLoading = false; |
| 802 | |
Ben Rohlfs | ece23f9 | 2021-09-30 14:58:37 +0200 | [diff] [blame] | 803 | @state() |
Ben Rohlfs | 6c97c57 | 2021-03-22 09:53:03 +0100 | [diff] [blame] | 804 | checksPatchsetNumber: PatchSetNumber | undefined = undefined; |
| 805 | |
Ben Rohlfs | ece23f9 | 2021-09-30 14:58:37 +0200 | [diff] [blame] | 806 | @state() |
Ben Rohlfs | 6c97c57 | 2021-03-22 09:53:03 +0100 | [diff] [blame] | 807 | latestPatchsetNumber: PatchSetNumber | undefined = undefined; |
| 808 | |
Ben Rohlfs | ebef2e1 | 2022-09-01 17:22:24 +0200 | [diff] [blame] | 809 | @state() |
| 810 | selectedAttempt: AttemptChoice = LATEST_ATTEMPT; |
Ben Rohlfs | 85a866b | 2021-04-15 11:20:02 +0200 | [diff] [blame] | 811 | |
Ben Rohlfs | fabe749 | 2021-04-23 11:21:16 +0200 | [diff] [blame] | 812 | /** Maintains the state of which result sections should show all results. */ |
Frank Borden | f19f2b7 | 2021-05-12 11:21:34 +0200 | [diff] [blame] | 813 | @state() |
Ben Rohlfs | 6cc7e7b | 2021-05-10 13:54:38 +0200 | [diff] [blame] | 814 | isShowAll: Map<Category, boolean> = new Map(); |
Ben Rohlfs | fabe749 | 2021-04-23 11:21:16 +0200 | [diff] [blame] | 815 | |
Ben Rohlfs | 260cce0 | 2021-03-05 16:57:09 +0100 | [diff] [blame] | 816 | /** |
Ben Rohlfs | 9994928 | 2021-03-03 19:19:21 +0100 | [diff] [blame] | 817 | * This is the current state of whether a section is expanded or not. As long |
| 818 | * as isSectionExpandedByUser is false this will be computed by a default rule |
| 819 | * on every render. |
| 820 | */ |
Ben Rohlfs | 6cc7e7b | 2021-05-10 13:54:38 +0200 | [diff] [blame] | 821 | private isSectionExpanded = new Map<Category, boolean>(); |
Ben Rohlfs | fee542a | 2021-02-24 13:24:54 +0100 | [diff] [blame] | 822 | |
Ben Rohlfs | 9994928 | 2021-03-03 19:19:21 +0100 | [diff] [blame] | 823 | /** |
| 824 | * Keeps track of whether the user intentionally changed the expansion state. |
| 825 | * Once this is true the default rule for showing a section expanded or not |
| 826 | * is not applied anymore. |
| 827 | */ |
Ben Rohlfs | 6cc7e7b | 2021-05-10 13:54:38 +0200 | [diff] [blame] | 828 | private isSectionExpandedByUser = new Map<Category, boolean>(); |
Ben Rohlfs | 9994928 | 2021-03-03 19:19:21 +0100 | [diff] [blame] | 829 | |
Ben Rohlfs | 6485eb8 | 2022-09-30 11:26:08 +0200 | [diff] [blame] | 830 | private readonly getViewModel = resolve(this, changeViewModelToken); |
| 831 | |
Chris Poucet | bf65b8f | 2022-01-18 21:18:12 +0000 | [diff] [blame] | 832 | private readonly getChangeModel = resolve(this, changeModelToken); |
Chris Poucet | 0142248 | 2021-11-30 19:43:28 +0100 | [diff] [blame] | 833 | |
Chris Poucet | 776a68f | 2022-01-10 19:17:02 +0100 | [diff] [blame] | 834 | private readonly getChecksModel = resolve(this, checksModelToken); |
Ben Rohlfs | 6c97c57 | 2021-03-22 09:53:03 +0100 | [diff] [blame] | 835 | |
Ben Rohlfs | cced911 | 2021-12-22 16:34:54 +0100 | [diff] [blame] | 836 | private readonly reporting = getAppContext().reportingService; |
| 837 | |
Chris Poucet | 5ec77f0 | 2022-05-12 11:25:21 +0200 | [diff] [blame] | 838 | constructor() { |
| 839 | super(); |
Ben Rohlfs | 0ca140a | 2021-09-03 10:43:37 +0200 | [diff] [blame] | 840 | subscribe( |
| 841 | this, |
Chris Poucet | 5ec77f0 | 2022-05-12 11:25:21 +0200 | [diff] [blame] | 842 | () => this.getChecksModel().topLevelActionsSelected$, |
Ben Rohlfs | 6e798cf | 2021-11-25 21:53:14 +0100 | [diff] [blame] | 843 | x => (this.actions = x) |
| 844 | ); |
| 845 | subscribe( |
| 846 | this, |
Chris Poucet | 5ec77f0 | 2022-05-12 11:25:21 +0200 | [diff] [blame] | 847 | () => this.getChecksModel().topLevelLinksSelected$, |
Ben Rohlfs | 6e798cf | 2021-11-25 21:53:14 +0100 | [diff] [blame] | 848 | x => (this.links = x) |
| 849 | ); |
| 850 | subscribe( |
| 851 | this, |
Chris Poucet | 5ec77f0 | 2022-05-12 11:25:21 +0200 | [diff] [blame] | 852 | () => this.getChecksModel().checksSelectedPatchsetNumber$, |
Ben Rohlfs | 0ca140a | 2021-09-03 10:43:37 +0200 | [diff] [blame] | 853 | x => (this.checksPatchsetNumber = x) |
| 854 | ); |
Chris Poucet | 0142248 | 2021-11-30 19:43:28 +0100 | [diff] [blame] | 855 | subscribe( |
| 856 | this, |
Ben Rohlfs | ebef2e1 | 2022-09-01 17:22:24 +0200 | [diff] [blame] | 857 | () => this.getChecksModel().checksSelectedAttemptNumber$, |
| 858 | x => (this.selectedAttempt = x) |
| 859 | ); |
| 860 | subscribe( |
| 861 | this, |
Chris Poucet | 5ec77f0 | 2022-05-12 11:25:21 +0200 | [diff] [blame] | 862 | () => this.getChangeModel().latestPatchNum$, |
Chris Poucet | 0142248 | 2021-11-30 19:43:28 +0100 | [diff] [blame] | 863 | x => (this.latestPatchsetNumber = x) |
| 864 | ); |
Ben Rohlfs | 0ca140a | 2021-09-03 10:43:37 +0200 | [diff] [blame] | 865 | subscribe( |
| 866 | this, |
Chris Poucet | 5ec77f0 | 2022-05-12 11:25:21 +0200 | [diff] [blame] | 867 | () => this.getChecksModel().someProvidersAreLoadingSelected$, |
Ben Rohlfs | 0ca140a | 2021-09-03 10:43:37 +0200 | [diff] [blame] | 868 | x => (this.someProvidersAreLoading = x) |
| 869 | ); |
Ben Rohlfs | 6485eb8 | 2022-09-30 11:26:08 +0200 | [diff] [blame] | 870 | subscribe( |
| 871 | this, |
| 872 | () => this.getViewModel().checksRunsSelected$, |
| 873 | x => (this.selectedRuns = x) |
| 874 | ); |
Ben Rohlfs | 209f141 | 2022-09-30 12:25:46 +0200 | [diff] [blame] | 875 | subscribe( |
| 876 | this, |
| 877 | () => this.getViewModel().checksResultsFilter$, |
| 878 | x => (this.filterRegExp = x) |
| 879 | ); |
Ben Rohlfs | 6c97c57 | 2021-03-22 09:53:03 +0100 | [diff] [blame] | 880 | } |
| 881 | |
Gerrit Code Review | 7903123 | 2021-08-19 14:32:41 +0000 | [diff] [blame] | 882 | static override get styles() { |
Ben Rohlfs | c9f9098 | 2020-12-13 22:00:11 +0100 | [diff] [blame] | 883 | return [ |
Milutin Kristofic | aa1c08b | 2023-09-06 10:34:16 +0200 | [diff] [blame] | 884 | formStyles, |
Ben Rohlfs | c9f9098 | 2020-12-13 22:00:11 +0100 | [diff] [blame] | 885 | sharedStyles, |
Ben Rohlfs | c3f6e72 | 2021-05-17 17:13:03 +0200 | [diff] [blame] | 886 | spinnerStyles, |
Ben Rohlfs | aa60f93 | 2021-09-13 22:06:50 +0200 | [diff] [blame] | 887 | fontStyles, |
Ben Rohlfs | c9f9098 | 2020-12-13 22:00:11 +0100 | [diff] [blame] | 888 | css` |
| 889 | :host { |
| 890 | display: block; |
Ben Rohlfs | 6c97c57 | 2021-03-22 09:53:03 +0100 | [diff] [blame] | 891 | background-color: var(--background-color-secondary); |
| 892 | } |
| 893 | .header { |
| 894 | display: block; |
| 895 | background-color: var(--background-color-primary); |
| 896 | padding: var(--spacing-l) var(--spacing-xl) var(--spacing-m) |
| 897 | var(--spacing-xl); |
| 898 | border-bottom: 1px solid var(--border-color); |
| 899 | } |
Ben Rohlfs | b508b40 | 2021-06-04 11:32:14 +0200 | [diff] [blame] | 900 | .header.notLatest { |
| 901 | background-color: var(--emphasis-color); |
| 902 | } |
Ben Rohlfs | 6c97c57 | 2021-03-22 09:53:03 +0100 | [diff] [blame] | 903 | .headerTopRow, |
| 904 | .headerBottomRow { |
| 905 | display: flex; |
| 906 | justify-content: space-between; |
| 907 | align-items: flex-end; |
| 908 | } |
| 909 | .headerTopRow gr-dropdown-list { |
| 910 | border: 1px solid var(--border-color); |
| 911 | border-radius: var(--border-radius); |
| 912 | padding: 0 var(--spacing-m); |
| 913 | } |
Ben Rohlfs | c3f6e72 | 2021-05-17 17:13:03 +0200 | [diff] [blame] | 914 | .headerTopRow h2 { |
| 915 | display: inline-block; |
| 916 | } |
| 917 | .headerTopRow .loading { |
| 918 | display: inline-block; |
| 919 | margin-left: var(--spacing-m); |
| 920 | color: var(--deemphasized-text-color); |
| 921 | } |
| 922 | /* The basics of .loadingSpin are defined in shared styles. */ |
| 923 | .headerTopRow .loadingSpin { |
| 924 | display: inline-block; |
| 925 | margin-left: var(--spacing-s); |
| 926 | width: 18px; |
| 927 | height: 18px; |
| 928 | vertical-align: top; |
| 929 | } |
Ben Rohlfs | 6c97c57 | 2021-03-22 09:53:03 +0100 | [diff] [blame] | 930 | .headerBottomRow { |
| 931 | margin-top: var(--spacing-s); |
| 932 | } |
Ben Rohlfs | b508b40 | 2021-06-04 11:32:14 +0200 | [diff] [blame] | 933 | .headerTopRow .right, |
Ben Rohlfs | 6c97c57 | 2021-03-22 09:53:03 +0100 | [diff] [blame] | 934 | .headerBottomRow .right { |
| 935 | display: flex; |
| 936 | align-items: center; |
| 937 | } |
Ben Rohlfs | b508b40 | 2021-06-04 11:32:14 +0200 | [diff] [blame] | 938 | .headerTopRow .right .goToLatest { |
| 939 | display: none; |
| 940 | } |
| 941 | .notLatest .headerTopRow .right .goToLatest { |
| 942 | display: block; |
| 943 | } |
Ben Rohlfs | ebef2e1 | 2022-09-01 17:22:24 +0200 | [diff] [blame] | 944 | .headerTopRow .right > * { |
| 945 | margin-left: var(--spacing-m); |
| 946 | } |
Ben Rohlfs | b508b40 | 2021-06-04 11:32:14 +0200 | [diff] [blame] | 947 | .headerTopRow .right .goToLatest gr-button { |
Ben Rohlfs | 4037d2f | 2021-10-05 22:31:07 +0200 | [diff] [blame] | 948 | --gr-button-padding: var(--spacing-s) var(--spacing-m); |
Ben Rohlfs | b508b40 | 2021-06-04 11:32:14 +0200 | [diff] [blame] | 949 | } |
Chris Poucet | 1c71386 | 2022-07-25 13:12:24 +0200 | [diff] [blame] | 950 | .headerBottomRow gr-icon { |
Ben Rohlfs | 0ae33e3 | 2021-04-23 10:01:00 +0200 | [diff] [blame] | 951 | color: var(--link-color); |
Ben Rohlfs | 37f0c77 | 2021-05-26 16:25:18 +0200 | [diff] [blame] | 952 | } |
| 953 | .headerBottomRow .space { |
| 954 | display: inline-block; |
| 955 | width: var(--spacing-xl); |
| 956 | height: var(--line-height-normal); |
| 957 | } |
| 958 | .headerBottomRow a { |
Ben Rohlfs | 0ae33e3 | 2021-04-23 10:01:00 +0200 | [diff] [blame] | 959 | margin-right: var(--spacing-l); |
| 960 | } |
Chris Poucet | 1c71386 | 2022-07-25 13:12:24 +0200 | [diff] [blame] | 961 | #moreActions gr-icon { |
Ben Rohlfs | 6c97c57 | 2021-03-22 09:53:03 +0100 | [diff] [blame] | 962 | color: var(--link-color); |
| 963 | } |
| 964 | #moreMessage { |
| 965 | display: none; |
| 966 | } |
| 967 | .body { |
| 968 | display: block; |
| 969 | padding: var(--spacing-s) var(--spacing-xl) var(--spacing-xl) |
| 970 | var(--spacing-xl); |
Ben Rohlfs | c9f9098 | 2020-12-13 22:00:11 +0100 | [diff] [blame] | 971 | } |
Ben Rohlfs | 260cce0 | 2021-03-05 16:57:09 +0100 | [diff] [blame] | 972 | .filterDiv { |
| 973 | display: flex; |
Ben Rohlfs | 2b38e5f | 2021-02-22 16:43:40 +0100 | [diff] [blame] | 974 | margin-top: var(--spacing-s); |
Ben Rohlfs | 260cce0 | 2021-03-05 16:57:09 +0100 | [diff] [blame] | 975 | align-items: center; |
| 976 | } |
| 977 | .filterDiv input#filterInput { |
Ben Rohlfs | 2b38e5f | 2021-02-22 16:43:40 +0100 | [diff] [blame] | 978 | padding: var(--spacing-s) var(--spacing-m); |
| 979 | min-width: 400px; |
| 980 | } |
Ben Rohlfs | 260cce0 | 2021-03-05 16:57:09 +0100 | [diff] [blame] | 981 | .filterDiv .selection { |
| 982 | padding: var(--spacing-s) var(--spacing-m); |
| 983 | } |
Ben Rohlfs | c9f9098 | 2020-12-13 22:00:11 +0100 | [diff] [blame] | 984 | .categoryHeader { |
Ben Rohlfs | 348368a | 2021-02-17 11:42:09 +0100 | [diff] [blame] | 985 | margin-top: var(--spacing-l); |
Ben Rohlfs | c9f9098 | 2020-12-13 22:00:11 +0100 | [diff] [blame] | 986 | margin-left: var(--spacing-l); |
Ben Rohlfs | fee542a | 2021-02-24 13:24:54 +0100 | [diff] [blame] | 987 | cursor: default; |
Ben Rohlfs | c9f9098 | 2020-12-13 22:00:11 +0100 | [diff] [blame] | 988 | } |
Ben Rohlfs | 9994928 | 2021-03-03 19:19:21 +0100 | [diff] [blame] | 989 | .categoryHeader .title { |
| 990 | text-transform: capitalize; |
| 991 | } |
Ben Rohlfs | fee542a | 2021-02-24 13:24:54 +0100 | [diff] [blame] | 992 | .categoryHeader .expandIcon { |
| 993 | width: var(--line-height-h3); |
| 994 | height: var(--line-height-h3); |
| 995 | margin-right: var(--spacing-s); |
| 996 | } |
Ben Rohlfs | 5929e4b | 2021-05-17 14:53:29 +0200 | [diff] [blame] | 997 | .categoryHeader .statusIconWrapper { |
| 998 | display: inline-block; |
| 999 | } |
Ben Rohlfs | fee542a | 2021-02-24 13:24:54 +0100 | [diff] [blame] | 1000 | .categoryHeader .statusIcon { |
Ben Rohlfs | c9f9098 | 2020-12-13 22:00:11 +0100 | [diff] [blame] | 1001 | position: relative; |
Ben Rohlfs | fee542a | 2021-02-24 13:24:54 +0100 | [diff] [blame] | 1002 | top: 2px; |
Ben Rohlfs | c9f9098 | 2020-12-13 22:00:11 +0100 | [diff] [blame] | 1003 | } |
Ben Rohlfs | fee542a | 2021-02-24 13:24:54 +0100 | [diff] [blame] | 1004 | .categoryHeader .statusIcon.error { |
Ben Rohlfs | c0c2ea5 | 2021-01-21 09:45:16 +0100 | [diff] [blame] | 1005 | color: var(--error-foreground); |
Ben Rohlfs | c9f9098 | 2020-12-13 22:00:11 +0100 | [diff] [blame] | 1006 | } |
Ben Rohlfs | fee542a | 2021-02-24 13:24:54 +0100 | [diff] [blame] | 1007 | .categoryHeader .statusIcon.warning { |
Ben Rohlfs | c0c2ea5 | 2021-01-21 09:45:16 +0100 | [diff] [blame] | 1008 | color: var(--warning-foreground); |
Ben Rohlfs | c9f9098 | 2020-12-13 22:00:11 +0100 | [diff] [blame] | 1009 | } |
Ben Rohlfs | fee542a | 2021-02-24 13:24:54 +0100 | [diff] [blame] | 1010 | .categoryHeader .statusIcon.info { |
Ben Rohlfs | c0c2ea5 | 2021-01-21 09:45:16 +0100 | [diff] [blame] | 1011 | color: var(--info-foreground); |
Ben Rohlfs | c9f9098 | 2020-12-13 22:00:11 +0100 | [diff] [blame] | 1012 | } |
Ben Rohlfs | fee542a | 2021-02-24 13:24:54 +0100 | [diff] [blame] | 1013 | .categoryHeader .statusIcon.success { |
Ben Rohlfs | c0c2ea5 | 2021-01-21 09:45:16 +0100 | [diff] [blame] | 1014 | color: var(--success-foreground); |
| 1015 | } |
Chris Poucet | 1c71386 | 2022-07-25 13:12:24 +0200 | [diff] [blame] | 1016 | .categoryHeader.empty gr-icon.statusIcon { |
Ben Rohlfs | b2f9b1b | 2021-12-14 10:10:32 +0100 | [diff] [blame] | 1017 | color: var(--deemphasized-text-color); |
| 1018 | } |
Ben Rohlfs | 260cce0 | 2021-03-05 16:57:09 +0100 | [diff] [blame] | 1019 | .categoryHeader .filtered { |
| 1020 | color: var(--deemphasized-text-color); |
| 1021 | } |
Ben Rohlfs | 9994928 | 2021-03-03 19:19:21 +0100 | [diff] [blame] | 1022 | .collapsed .noResultsMessage, |
Ben Rohlfs | fee542a | 2021-02-24 13:24:54 +0100 | [diff] [blame] | 1023 | .collapsed table { |
| 1024 | display: none; |
| 1025 | } |
| 1026 | .collapsed { |
| 1027 | border-bottom: 1px solid var(--border-color); |
| 1028 | padding-bottom: var(--spacing-m); |
| 1029 | } |
Ben Rohlfs | 9994928 | 2021-03-03 19:19:21 +0100 | [diff] [blame] | 1030 | .noResultsMessage { |
| 1031 | width: 100%; |
Ben Rohlfs | 9994928 | 2021-03-03 19:19:21 +0100 | [diff] [blame] | 1032 | margin-top: var(--spacing-m); |
| 1033 | background-color: var(--background-color-primary); |
| 1034 | box-shadow: var(--elevation-level-1); |
| 1035 | padding: var(--spacing-s) |
| 1036 | calc(20px + var(--spacing-l) + var(--spacing-m) + var(--spacing-s)); |
Ben Rohlfs | 3af24fe | 2021-02-17 12:25:28 +0100 | [diff] [blame] | 1037 | } |
Ben Rohlfs | c0c2ea5 | 2021-01-21 09:45:16 +0100 | [diff] [blame] | 1038 | table.resultsTable { |
| 1039 | width: 100%; |
Ben Rohlfs | 0720983 | 2021-05-18 15:23:06 +0200 | [diff] [blame] | 1040 | table-layout: fixed; |
Ben Rohlfs | c9f9098 | 2020-12-13 22:00:11 +0100 | [diff] [blame] | 1041 | margin-top: var(--spacing-m); |
Ben Rohlfs | c0c2ea5 | 2021-01-21 09:45:16 +0100 | [diff] [blame] | 1042 | background-color: var(--background-color-primary); |
Ben Rohlfs | c9f9098 | 2020-12-13 22:00:11 +0100 | [diff] [blame] | 1043 | box-shadow: var(--elevation-level-1); |
| 1044 | } |
Ben Rohlfs | c0c2ea5 | 2021-01-21 09:45:16 +0100 | [diff] [blame] | 1045 | tr.headerRow th { |
| 1046 | text-align: left; |
Ben Rohlfs | c9f9098 | 2020-12-13 22:00:11 +0100 | [diff] [blame] | 1047 | font-weight: var(--font-weight-bold); |
Ben Rohlfs | c0c2ea5 | 2021-01-21 09:45:16 +0100 | [diff] [blame] | 1048 | padding: var(--spacing-s); |
Ben Rohlfs | c9f9098 | 2020-12-13 22:00:11 +0100 | [diff] [blame] | 1049 | } |
Ben Rohlfs | daba0e8 | 2021-06-11 08:06:17 +0200 | [diff] [blame] | 1050 | tr.headerRow th.nameCol { |
Ben Rohlfs | 894dd29 | 2021-06-16 12:10:20 +0200 | [diff] [blame] | 1051 | padding-left: var(--spacing-l); |
Ben Rohlfs | c1a3675 | 2021-11-15 12:27:57 +0100 | [diff] [blame] | 1052 | width: 200px; |
| 1053 | } |
| 1054 | @media screen and (min-width: 1400px) { |
| 1055 | tr.headerRow th.nameCol.longNames { |
| 1056 | width: 300px; |
| 1057 | } |
Ben Rohlfs | 0720983 | 2021-05-18 15:23:06 +0200 | [diff] [blame] | 1058 | } |
Ben Rohlfs | daba0e8 | 2021-06-11 08:06:17 +0200 | [diff] [blame] | 1059 | tr.headerRow th.summaryCol { |
Ben Rohlfs | 0720983 | 2021-05-18 15:23:06 +0200 | [diff] [blame] | 1060 | width: 99%; |
| 1061 | } |
Ben Rohlfs | daba0e8 | 2021-06-11 08:06:17 +0200 | [diff] [blame] | 1062 | tr.headerRow th.expanderCol { |
Ben Rohlfs | 0720983 | 2021-05-18 15:23:06 +0200 | [diff] [blame] | 1063 | width: 30px; |
Ben Rohlfs | 894dd29 | 2021-06-16 12:10:20 +0200 | [diff] [blame] | 1064 | padding-right: var(--spacing-l); |
Ben Rohlfs | 0720983 | 2021-05-18 15:23:06 +0200 | [diff] [blame] | 1065 | } |
| 1066 | |
Ben Rohlfs | fabe749 | 2021-04-23 11:21:16 +0200 | [diff] [blame] | 1067 | gr-button.showAll { |
| 1068 | margin: var(--spacing-m); |
| 1069 | } |
| 1070 | tr { |
| 1071 | border-top: 1px solid var(--border-color); |
| 1072 | } |
Ben Rohlfs | c9f9098 | 2020-12-13 22:00:11 +0100 | [diff] [blame] | 1073 | `, |
| 1074 | ]; |
| 1075 | } |
| 1076 | |
Gerrit Code Review | 7903123 | 2021-08-19 14:32:41 +0000 | [diff] [blame] | 1077 | protected override updated(changedProperties: PropertyValues) { |
Ben Rohlfs | ed7d5db | 2021-03-05 15:12:18 +0100 | [diff] [blame] | 1078 | super.updated(changedProperties); |
Ben Rohlfs | 209f141 | 2022-09-30 12:25:46 +0200 | [diff] [blame] | 1079 | if (changedProperties.has('filterRegExp') && this.filterInput) { |
| 1080 | this.filterInput.value = this.filterRegExp; |
| 1081 | } |
Ben Rohlfs | ed7d5db | 2021-03-05 15:12:18 +0100 | [diff] [blame] | 1082 | if (changedProperties.has('tabState') && this.tabState) { |
| 1083 | const {statusOrCategory, checkName} = this.tabState; |
Ben Rohlfs | d58e07e | 2021-06-24 13:22:24 +0200 | [diff] [blame] | 1084 | if (isCategory(statusOrCategory)) { |
| 1085 | const expanded = this.isSectionExpanded.get(statusOrCategory); |
| 1086 | if (!expanded) this.toggleExpanded(statusOrCategory); |
| 1087 | } |
| 1088 | if (checkName) { |
| 1089 | this.scrollElIntoView(`gr-result-row.${charsOnly(checkName)}`); |
| 1090 | } else if ( |
Ben Rohlfs | ed7d5db | 2021-03-05 15:12:18 +0100 | [diff] [blame] | 1091 | statusOrCategory && |
| 1092 | statusOrCategory !== RunStatus.RUNNING && |
| 1093 | statusOrCategory !== RunStatus.RUNNABLE |
| 1094 | ) { |
Ben Rohlfs | d58e07e | 2021-06-24 13:22:24 +0200 | [diff] [blame] | 1095 | const cat = statusOrCategory.toString().toLowerCase(); |
Ben Rohlfs | ea7c3d4 | 2021-06-18 12:26:22 +0200 | [diff] [blame] | 1096 | this.scrollElIntoView(`.categoryHeader.${cat} + table gr-result-row`); |
Ben Rohlfs | ed7d5db | 2021-03-05 15:12:18 +0100 | [diff] [blame] | 1097 | } |
| 1098 | } |
| 1099 | } |
| 1100 | |
Ben Rohlfs | 6c97c57 | 2021-03-22 09:53:03 +0100 | [diff] [blame] | 1101 | private scrollElIntoView(selector: string) { |
Ben Rohlfs | ed7d5db | 2021-03-05 15:12:18 +0100 | [diff] [blame] | 1102 | this.updateComplete.then(() => { |
| 1103 | let el = this.shadowRoot?.querySelector(selector); |
Ben Rohlfs | 6e62a0c | 2021-06-07 13:13:40 +0200 | [diff] [blame] | 1104 | // el might be a <gr-result-row> with an empty shadowRoot. Let's wait a |
| 1105 | // moment before trying to find a child element in it. |
| 1106 | setTimeout(() => { |
Ben Rohlfs | ea7c3d4 | 2021-06-18 12:26:22 +0200 | [diff] [blame] | 1107 | if (el) (el as HTMLElement).focus(); |
Ben Rohlfs | a8bcf74 | 2024-06-14 08:27:11 +0200 | [diff] [blame^] | 1108 | // If the target element is a <gr-result-row>, then expand it. |
| 1109 | (el as GrResultRow)?.toggleExpanded(true); |
Ben Rohlfs | 6e62a0c | 2021-06-07 13:13:40 +0200 | [diff] [blame] | 1110 | // <gr-result-row> has display:contents and cannot be scrolled into view |
| 1111 | // itself. Thus we are preferring to scroll the first child into view. |
| 1112 | el = el?.shadowRoot?.firstElementChild ?? el; |
| 1113 | el?.scrollIntoView({block: 'center'}); |
| 1114 | }, 0); |
Ben Rohlfs | ed7d5db | 2021-03-05 15:12:18 +0100 | [diff] [blame] | 1115 | }); |
| 1116 | } |
| 1117 | |
Gerrit Code Review | 7903123 | 2021-08-19 14:32:41 +0000 | [diff] [blame] | 1118 | override render() { |
Ben Rohlfs | ece23f9 | 2021-09-30 14:58:37 +0200 | [diff] [blame] | 1119 | const headerClasses = { |
Ben Rohlfs | b508b40 | 2021-06-04 11:32:14 +0200 | [diff] [blame] | 1120 | header: true, |
| 1121 | notLatest: !!this.checksPatchsetNumber, |
Ben Rohlfs | ece23f9 | 2021-09-30 14:58:37 +0200 | [diff] [blame] | 1122 | }; |
Ben Rohlfs | ebef2e1 | 2022-09-01 17:22:24 +0200 | [diff] [blame] | 1123 | const attemptItems = this.createAttemptDropdownItems(); |
Ben Rohlfs | ece23f9 | 2021-09-30 14:58:37 +0200 | [diff] [blame] | 1124 | return html` |
Ben Rohlfs | 8003bd3 | 2022-04-05 18:24:42 +0200 | [diff] [blame] | 1125 | <div class=${classMap(headerClasses)}> |
Ben Rohlfs | 6c97c57 | 2021-03-22 09:53:03 +0100 | [diff] [blame] | 1126 | <div class="headerTopRow"> |
| 1127 | <div class="left"> |
| 1128 | <h2 class="heading-2">Results</h2> |
Ben Rohlfs | 8003bd3 | 2022-04-05 18:24:42 +0200 | [diff] [blame] | 1129 | <div class="loading" ?hidden=${!this.someProvidersAreLoading}> |
Ben Rohlfs | c3f6e72 | 2021-05-17 17:13:03 +0200 | [diff] [blame] | 1130 | <span>Loading results </span> |
| 1131 | <span class="loadingSpin"></span> |
| 1132 | </div> |
Ben Rohlfs | 6c97c57 | 2021-03-22 09:53:03 +0100 | [diff] [blame] | 1133 | </div> |
| 1134 | <div class="right"> |
Ben Rohlfs | b508b40 | 2021-06-04 11:32:14 +0200 | [diff] [blame] | 1135 | <div class="goToLatest"> |
Ben Rohlfs | 8003bd3 | 2022-04-05 18:24:42 +0200 | [diff] [blame] | 1136 | <gr-button @click=${this.goToLatestPatchset} link |
Ben Rohlfs | b508b40 | 2021-06-04 11:32:14 +0200 | [diff] [blame] | 1137 | >Go to latest patchset</gr-button |
| 1138 | > |
| 1139 | </div> |
Ben Rohlfs | ebef2e1 | 2022-09-01 17:22:24 +0200 | [diff] [blame] | 1140 | ${when( |
| 1141 | attemptItems.length > 0, |
| 1142 | () => html` <gr-dropdown-list |
| 1143 | value=${this.selectedAttempt ?? 0} |
| 1144 | .items=${attemptItems} |
| 1145 | @value-change=${this.onAttemptSelected} |
| 1146 | ></gr-dropdown-list>` |
| 1147 | )} |
Ben Rohlfs | 6c97c57 | 2021-03-22 09:53:03 +0100 | [diff] [blame] | 1148 | <gr-dropdown-list |
Dhruv Srivastava | 3ceffa2 | 2023-10-30 14:00:17 +0100 | [diff] [blame] | 1149 | value=${(this.checksPatchsetNumber || |
| 1150 | this.latestPatchsetNumber) ?? |
Ben Rohlfs | 8003bd3 | 2022-04-05 18:24:42 +0200 | [diff] [blame] | 1151 | 0} |
| 1152 | .items=${this.createPatchsetDropdownItems()} |
| 1153 | @value-change=${this.onPatchsetSelected} |
Ben Rohlfs | 6c97c57 | 2021-03-22 09:53:03 +0100 | [diff] [blame] | 1154 | ></gr-dropdown-list> |
| 1155 | </div> |
| 1156 | </div> |
| 1157 | <div class="headerBottomRow"> |
Frank Borden | 6988bdf | 2021-04-07 14:42:00 +0200 | [diff] [blame] | 1158 | <div class="left">${this.renderFilter()}</div> |
Ben Rohlfs | 1f2017f | 2021-09-07 11:47:09 +0200 | [diff] [blame] | 1159 | <div class="right">${this.renderLinksAndActions()}</div> |
Ben Rohlfs | 6c97c57 | 2021-03-22 09:53:03 +0100 | [diff] [blame] | 1160 | </div> |
| 1161 | </div> |
| 1162 | <div class="body"> |
| 1163 | ${this.renderSection(Category.ERROR)} |
| 1164 | ${this.renderSection(Category.WARNING)} |
Ben Rohlfs | 6cc7e7b | 2021-05-10 13:54:38 +0200 | [diff] [blame] | 1165 | ${this.renderSection(Category.INFO)} |
| 1166 | ${this.renderSection(Category.SUCCESS)} |
Ben Rohlfs | ece23f9 | 2021-09-30 14:58:37 +0200 | [diff] [blame] | 1167 | </div> |
| 1168 | `; |
Ben Rohlfs | c9f9098 | 2020-12-13 22:00:11 +0100 | [diff] [blame] | 1169 | } |
| 1170 | |
Ben Rohlfs | 1f2017f | 2021-09-07 11:47:09 +0200 | [diff] [blame] | 1171 | private renderLinksAndActions() { |
Ben Rohlfs | 37f0c77 | 2021-05-26 16:25:18 +0200 | [diff] [blame] | 1172 | const links = this.links ?? []; |
Ben Rohlfs | 1296484 | 2021-06-04 12:39:00 +0200 | [diff] [blame] | 1173 | const primaryLinks = links |
| 1174 | .filter(a => a.primary) |
| 1175 | // Showing the same icons twice without text is super confusing. |
| 1176 | .filter( |
| 1177 | (link: Link, index: number, array: Link[]) => |
| 1178 | array.findIndex(other => link.icon === other.icon) === index |
| 1179 | ) |
| 1180 | .slice(0, 4); |
Ben Rohlfs | 37f0c77 | 2021-05-26 16:25:18 +0200 | [diff] [blame] | 1181 | const overflowLinks = links.filter(a => !primaryLinks.includes(a)); |
Ben Rohlfs | 1f2017f | 2021-09-07 11:47:09 +0200 | [diff] [blame] | 1182 | const overflowLinkItems = overflowLinks.map(link => { |
Ben Rohlfs | 37f0c77 | 2021-05-26 16:25:18 +0200 | [diff] [blame] | 1183 | return { |
| 1184 | ...link, |
| 1185 | id: link.tooltip, |
| 1186 | name: link.tooltip, |
| 1187 | target: '_blank', |
| 1188 | tooltip: undefined, |
| 1189 | }; |
| 1190 | }); |
Ben Rohlfs | 1f2017f | 2021-09-07 11:47:09 +0200 | [diff] [blame] | 1191 | |
| 1192 | const actions = this.actions ?? []; |
| 1193 | const primaryActions = actions.filter(a => a.primary).slice(0, 2); |
| 1194 | const overflowActions = actions.filter(a => !primaryActions.includes(a)); |
| 1195 | const overflowActionItems = overflowActions.map(action => { |
| 1196 | return {...action, id: action.name}; |
| 1197 | }); |
| 1198 | const disabledActions = overflowActionItems |
| 1199 | .filter(action => action.disabled) |
| 1200 | .map(action => action.id); |
| 1201 | |
Ben Rohlfs | 37f0c77 | 2021-05-26 16:25:18 +0200 | [diff] [blame] | 1202 | return html` |
Ben Rohlfs | 1f2017f | 2021-09-07 11:47:09 +0200 | [diff] [blame] | 1203 | ${primaryLinks.map(this.renderLink)} |
| 1204 | ${primaryLinks.length > 0 && primaryActions.length > 0 |
| 1205 | ? html`<div class="space"></div>` |
| 1206 | : ''} |
| 1207 | ${primaryActions.map(this.renderAction)} |
| 1208 | ${this.renderOverflow( |
| 1209 | [...overflowLinkItems, ...overflowActionItems], |
| 1210 | disabledActions |
| 1211 | )} |
Ben Rohlfs | 37f0c77 | 2021-05-26 16:25:18 +0200 | [diff] [blame] | 1212 | `; |
| 1213 | } |
| 1214 | |
| 1215 | private renderLink(link?: Link) { |
| 1216 | if (!link) return; |
Ben Rohlfs | 0ae33e3 | 2021-04-23 10:01:00 +0200 | [diff] [blame] | 1217 | const tooltipText = link.tooltip ?? tooltipForLink(link.icon); |
Chris Poucet | 5ca5e80 | 2022-07-18 15:26:29 +0200 | [diff] [blame] | 1218 | const icon = iconForLink(link.icon); |
Ben Rohlfs | 3630a38 | 2023-06-23 12:53:18 +0200 | [diff] [blame] | 1219 | return html`<a href=${link.url} target="_blank" rel="noopener noreferrer" |
Chris Poucet | 1c71386 | 2022-07-25 13:12:24 +0200 | [diff] [blame] | 1220 | ><gr-icon |
| 1221 | icon=${icon.name} |
Ben Rohlfs | 8003bd3 | 2022-04-05 18:24:42 +0200 | [diff] [blame] | 1222 | aria-label=${tooltipText} |
Chris Poucet | 1c71386 | 2022-07-25 13:12:24 +0200 | [diff] [blame] | 1223 | class="link" |
| 1224 | ?filled=${icon.filled} |
| 1225 | ></gr-icon> |
| 1226 | <paper-tooltip offset="5">${tooltipText}</paper-tooltip></a |
Ben Rohlfs | 0ae33e3 | 2021-04-23 10:01:00 +0200 | [diff] [blame] | 1227 | >`; |
| 1228 | } |
| 1229 | |
Ben Rohlfs | 1f2017f | 2021-09-07 11:47:09 +0200 | [diff] [blame] | 1230 | private renderOverflow(items: DropdownLink[], disabledIds: string[] = []) { |
| 1231 | if (items.length === 0) return; |
Ben Rohlfs | 6c97c57 | 2021-03-22 09:53:03 +0100 | [diff] [blame] | 1232 | return html` |
Ben Rohlfs | 6c97c57 | 2021-03-22 09:53:03 +0100 | [diff] [blame] | 1233 | <gr-dropdown |
| 1234 | id="moreActions" |
| 1235 | link="" |
| 1236 | vertical-offset="32" |
| 1237 | horizontal-align="right" |
Ben Rohlfs | 8003bd3 | 2022-04-05 18:24:42 +0200 | [diff] [blame] | 1238 | @tap-item=${this.handleAction} |
| 1239 | .items=${items} |
| 1240 | .disabledIds=${disabledIds} |
Ben Rohlfs | 6c97c57 | 2021-03-22 09:53:03 +0100 | [diff] [blame] | 1241 | > |
Chris Poucet | 1c71386 | 2022-07-25 13:12:24 +0200 | [diff] [blame] | 1242 | <gr-icon icon="more_vert" aria-labelledby="moreMessage"></gr-icon> |
Ben Rohlfs | 6c97c57 | 2021-03-22 09:53:03 +0100 | [diff] [blame] | 1243 | <span id="moreMessage">More</span> |
| 1244 | </gr-dropdown> |
| 1245 | `; |
| 1246 | } |
| 1247 | |
| 1248 | private handleAction(e: CustomEvent<Action>) { |
Ben Rohlfs | cced911 | 2021-12-22 16:34:54 +0100 | [diff] [blame] | 1249 | this.getChecksModel().triggerAction( |
| 1250 | e.detail, |
| 1251 | undefined, |
| 1252 | 'results-dropdown' |
| 1253 | ); |
Ben Rohlfs | 6c97c57 | 2021-03-22 09:53:03 +0100 | [diff] [blame] | 1254 | } |
| 1255 | |
Ben Rohlfs | 48330a1 | 2021-12-09 15:12:17 +0100 | [diff] [blame] | 1256 | private handleFilter(e: ChecksResultsFilterEvent) { |
Ben Rohlfs | 48330a1 | 2021-12-09 15:12:17 +0100 | [diff] [blame] | 1257 | const newValue = e.detail.filterRegExp ?? ''; |
Ben Rohlfs | 209f141 | 2022-09-30 12:25:46 +0200 | [diff] [blame] | 1258 | this.getViewModel().updateState({ |
| 1259 | checksResultsFilter: this.filterRegExp === newValue ? '' : newValue, |
| 1260 | }); |
Ben Rohlfs | 48330a1 | 2021-12-09 15:12:17 +0100 | [diff] [blame] | 1261 | } |
| 1262 | |
Ben Rohlfs | 6c97c57 | 2021-03-22 09:53:03 +0100 | [diff] [blame] | 1263 | private renderAction(action?: Action) { |
| 1264 | if (!action) return; |
Ben Rohlfs | cced911 | 2021-12-22 16:34:54 +0100 | [diff] [blame] | 1265 | return html`<gr-checks-action |
| 1266 | context="results" |
Ben Rohlfs | 8003bd3 | 2022-04-05 18:24:42 +0200 | [diff] [blame] | 1267 | .action=${action} |
Ben Rohlfs | cced911 | 2021-12-22 16:34:54 +0100 | [diff] [blame] | 1268 | ></gr-checks-action>`; |
Ben Rohlfs | 6c97c57 | 2021-03-22 09:53:03 +0100 | [diff] [blame] | 1269 | } |
| 1270 | |
Ben Rohlfs | ebef2e1 | 2022-09-01 17:22:24 +0200 | [diff] [blame] | 1271 | private onAttemptSelected(e: CustomEvent<{value: string | undefined}>) { |
| 1272 | const attempt = stringToAttemptChoice(e.detail.value); |
| 1273 | assertIsDefined(attempt, `unexpected attempt choice ${e.detail.value}`); |
| 1274 | this.getChecksModel().updateStateSetAttempt(attempt); |
| 1275 | } |
| 1276 | |
Ben Rohlfs | 6c97c57 | 2021-03-22 09:53:03 +0100 | [diff] [blame] | 1277 | private onPatchsetSelected(e: CustomEvent<{value: string}>) { |
Ben Rohlfs | a1d2c0c | 2022-09-29 17:03:26 +0200 | [diff] [blame] | 1278 | let patchset: number | undefined = Number(e.detail.value); |
| 1279 | assert(Number.isInteger(patchset), `patchset must be integer: ${patchset}`); |
| 1280 | if (patchset === this.latestPatchsetNumber) patchset = undefined; |
| 1281 | this.getChecksModel().updateStateSetPatchset( |
| 1282 | patchset as PatchSetNumber | undefined |
| 1283 | ); |
Ben Rohlfs | 6c97c57 | 2021-03-22 09:53:03 +0100 | [diff] [blame] | 1284 | } |
| 1285 | |
Ben Rohlfs | b508b40 | 2021-06-04 11:32:14 +0200 | [diff] [blame] | 1286 | private goToLatestPatchset() { |
Ben Rohlfs | a1d2c0c | 2022-09-29 17:03:26 +0200 | [diff] [blame] | 1287 | this.getChecksModel().updateStateSetPatchset(undefined); |
Ben Rohlfs | b508b40 | 2021-06-04 11:32:14 +0200 | [diff] [blame] | 1288 | } |
| 1289 | |
Ben Rohlfs | ebef2e1 | 2022-09-01 17:22:24 +0200 | [diff] [blame] | 1290 | private createAttemptDropdownItems() { |
| 1291 | if (this.runs.every(run => run.isSingleAttempt)) return []; |
| 1292 | const attempts: AttemptChoice[] = this.runs |
| 1293 | .map(run => run.attempt ?? 0) |
| 1294 | .filter(isAttemptChoice) |
| 1295 | .filter(unique); |
| 1296 | attempts.push(LATEST_ATTEMPT); |
| 1297 | attempts.push(ALL_ATTEMPTS); |
| 1298 | const items: DropdownItem[] = attempts.sort(sortAttemptChoices).map(a => { |
| 1299 | return { |
| 1300 | value: a, |
| 1301 | text: attemptChoiceLabel(a), |
| 1302 | }; |
| 1303 | }); |
| 1304 | return items; |
| 1305 | } |
| 1306 | |
Ben Rohlfs | 6c97c57 | 2021-03-22 09:53:03 +0100 | [diff] [blame] | 1307 | private createPatchsetDropdownItems() { |
| 1308 | if (!this.latestPatchsetNumber) return []; |
| 1309 | return Array.from(Array(this.latestPatchsetNumber), (_, i) => { |
| 1310 | assertIsDefined(this.latestPatchsetNumber, 'latestPatchsetNumber'); |
| 1311 | const index = this.latestPatchsetNumber - i; |
| 1312 | const postfix = index === this.latestPatchsetNumber ? ' (latest)' : ''; |
| 1313 | return { |
| 1314 | value: `${index}`, |
| 1315 | text: `Patchset ${index}${postfix}`, |
| 1316 | }; |
| 1317 | }); |
| 1318 | } |
| 1319 | |
Ben Rohlfs | e6a4c47 | 2021-04-22 13:06:09 +0200 | [diff] [blame] | 1320 | isRunSelected(run: {checkName: string}) { |
Ben Rohlfs | 20fe8e8 | 2022-10-14 11:13:10 +0200 | [diff] [blame] | 1321 | return this.selectedRuns.size === 0 || this.selectedRuns.has(run.checkName); |
Ben Rohlfs | e6a4c47 | 2021-04-22 13:06:09 +0200 | [diff] [blame] | 1322 | } |
| 1323 | |
| 1324 | renderFilter() { |
| 1325 | const runs = this.runs.filter( |
| 1326 | run => |
Ben Rohlfs | ebef2e1 | 2022-09-01 17:22:24 +0200 | [diff] [blame] | 1327 | this.isRunSelected(run) && isAttemptSelected(this.selectedAttempt, run) |
Ben Rohlfs | e6a4c47 | 2021-04-22 13:06:09 +0200 | [diff] [blame] | 1328 | ); |
Ben Rohlfs | 209f141 | 2022-09-30 12:25:46 +0200 | [diff] [blame] | 1329 | if ( |
Ben Rohlfs | 20fe8e8 | 2022-10-14 11:13:10 +0200 | [diff] [blame] | 1330 | this.selectedRuns.size === 0 && |
Ben Rohlfs | 209f141 | 2022-09-30 12:25:46 +0200 | [diff] [blame] | 1331 | allResults(runs).length <= 3 && |
| 1332 | this.filterRegExp === '' |
| 1333 | ) { |
Ben Rohlfs | 8845349 | 2021-03-03 11:32:40 +0100 | [diff] [blame] | 1334 | return; |
| 1335 | } |
Ben Rohlfs | 2b38e5f | 2021-02-22 16:43:40 +0100 | [diff] [blame] | 1336 | return html` |
Ben Rohlfs | 260cce0 | 2021-03-05 16:57:09 +0100 | [diff] [blame] | 1337 | <div class="filterDiv"> |
| 1338 | <input |
| 1339 | id="filterInput" |
| 1340 | type="text" |
Ben Rohlfs | 48330a1 | 2021-12-09 15:12:17 +0100 | [diff] [blame] | 1341 | placeholder="Filter results by tag or regular expression" |
Ben Rohlfs | 8003bd3 | 2022-04-05 18:24:42 +0200 | [diff] [blame] | 1342 | @input=${this.onFilterInputChange} |
Ben Rohlfs | 260cce0 | 2021-03-05 16:57:09 +0100 | [diff] [blame] | 1343 | /> |
Ben Rohlfs | 260cce0 | 2021-03-05 16:57:09 +0100 | [diff] [blame] | 1344 | </div> |
Ben Rohlfs | 2b38e5f | 2021-02-22 16:43:40 +0100 | [diff] [blame] | 1345 | `; |
| 1346 | } |
| 1347 | |
Ben Rohlfs | 48330a1 | 2021-12-09 15:12:17 +0100 | [diff] [blame] | 1348 | onFilterInputChange() { |
Ben Rohlfs | 2b38e5f | 2021-02-22 16:43:40 +0100 | [diff] [blame] | 1349 | assertIsDefined(this.filterInput, 'filter <input> element'); |
Ben Rohlfs | cced911 | 2021-12-22 16:34:54 +0100 | [diff] [blame] | 1350 | this.reporting.reportInteraction( |
| 1351 | Interaction.CHECKS_RESULT_FILTER_CHANGED, |
| 1352 | {}, |
| 1353 | {deduping: Deduping.EVENT_ONCE_PER_CHANGE} |
| 1354 | ); |
Ben Rohlfs | 209f141 | 2022-09-30 12:25:46 +0200 | [diff] [blame] | 1355 | this.getViewModel().updateState({ |
| 1356 | checksResultsFilter: this.filterInput.value, |
| 1357 | }); |
Ben Rohlfs | 2b38e5f | 2021-02-22 16:43:40 +0100 | [diff] [blame] | 1358 | } |
| 1359 | |
Ben Rohlfs | 6cc7e7b | 2021-05-10 13:54:38 +0200 | [diff] [blame] | 1360 | renderSection(category: Category) { |
Ben Rohlfs | c9f9098 | 2020-12-13 22:00:11 +0100 | [diff] [blame] | 1361 | const catString = category.toString().toLowerCase(); |
Ben Rohlfs | 8519b5d | 2021-06-11 08:29:40 +0200 | [diff] [blame] | 1362 | const isWarningOrError = |
| 1363 | category === Category.WARNING || category === Category.ERROR; |
Ben Rohlfs | 6cc7e7b | 2021-05-10 13:54:38 +0200 | [diff] [blame] | 1364 | const allRuns = this.runs.filter(run => |
Ben Rohlfs | ebef2e1 | 2022-09-01 17:22:24 +0200 | [diff] [blame] | 1365 | isAttemptSelected(this.selectedAttempt, run) |
Ben Rohlfs | e6a4c47 | 2021-04-22 13:06:09 +0200 | [diff] [blame] | 1366 | ); |
Ben Rohlfs | e6a4c47 | 2021-04-22 13:06:09 +0200 | [diff] [blame] | 1367 | const all = allRuns.reduce( |
| 1368 | (results: RunResult[], run) => [ |
| 1369 | ...results, |
Frank Borden | 6988bdf | 2021-04-07 14:42:00 +0200 | [diff] [blame] | 1370 | ...this.computeRunResults(category, run), |
| 1371 | ], |
| 1372 | [] |
| 1373 | ); |
Ben Rohlfs | 20fe8e8 | 2022-10-14 11:13:10 +0200 | [diff] [blame] | 1374 | const isSelectionActive = this.selectedRuns.size > 0; |
Ben Rohlfs | e6a4c47 | 2021-04-22 13:06:09 +0200 | [diff] [blame] | 1375 | const selected = all.filter(result => this.isRunSelected(result)); |
Ben Rohlfs | 209f141 | 2022-09-30 12:25:46 +0200 | [diff] [blame] | 1376 | const re = new RegExp(this.filterRegExp, 'i'); |
| 1377 | const filtered = selected.filter(result => matches(result, re)); |
| 1378 | const isFilterActiveWithResults = |
| 1379 | this.filterRegExp !== '' && filtered.length > 0; |
| 1380 | |
| 1381 | // The logic for deciding whether to expand a section by default is a bit |
| 1382 | // complicated, but we want to collapse empty and info/success sections by |
| 1383 | // default for a clean and focused user experience. However, as soon as the |
| 1384 | // user starts selecting or filtering we must take this into account and |
| 1385 | // prefer to expand the sections. |
Ben Rohlfs | 9994928 | 2021-03-03 19:19:21 +0100 | [diff] [blame] | 1386 | let expanded = this.isSectionExpanded.get(category); |
| 1387 | const expandedByUser = this.isSectionExpandedByUser.get(category) ?? false; |
| 1388 | if (!expandedByUser || expanded === undefined) { |
Ben Rohlfs | 209f141 | 2022-09-30 12:25:46 +0200 | [diff] [blame] | 1389 | // Note that we are using `selected` for `isEmpty` and not `filtered`, |
| 1390 | // because if the filter is what makes a section empty, then we want to |
| 1391 | // show an expanded section, which contains a message about this. |
| 1392 | const isEmpty = selected.length === 0; |
| 1393 | expanded = |
| 1394 | !isEmpty && |
| 1395 | (isWarningOrError || isSelectionActive || isFilterActiveWithResults); |
Ben Rohlfs | 9994928 | 2021-03-03 19:19:21 +0100 | [diff] [blame] | 1396 | this.isSectionExpanded.set(category, expanded); |
| 1397 | } |
Ben Rohlfs | fee542a | 2021-02-24 13:24:54 +0100 | [diff] [blame] | 1398 | const expandedClass = expanded ? 'expanded' : 'collapsed'; |
Ben Rohlfs | 209f141 | 2022-09-30 12:25:46 +0200 | [diff] [blame] | 1399 | |
Ben Rohlfs | fabe749 | 2021-04-23 11:21:16 +0200 | [diff] [blame] | 1400 | const isShowAll = this.isShowAll.get(category) ?? false; |
Ben Rohlfs | fabe749 | 2021-04-23 11:21:16 +0200 | [diff] [blame] | 1401 | const resultCount = filtered.length; |
Ben Rohlfs | b2f9b1b | 2021-12-14 10:10:32 +0100 | [diff] [blame] | 1402 | const empty = resultCount === 0 ? 'empty' : ''; |
Ben Rohlfs | dc76695 | 2021-06-17 14:51:45 +0200 | [diff] [blame] | 1403 | const resultLimit = isShowAll ? 1000 : 20; |
Ben Rohlfs | fabe749 | 2021-04-23 11:21:16 +0200 | [diff] [blame] | 1404 | const showAllButton = this.renderShowAllButton( |
| 1405 | category, |
| 1406 | isShowAll, |
Ben Rohlfs | 8519b5d | 2021-06-11 08:29:40 +0200 | [diff] [blame] | 1407 | resultLimit, |
Ben Rohlfs | fabe749 | 2021-04-23 11:21:16 +0200 | [diff] [blame] | 1408 | resultCount |
| 1409 | ); |
Chris Poucet | 5ca5e80 | 2022-07-18 15:26:29 +0200 | [diff] [blame] | 1410 | const icon = iconFor(category); |
Ben Rohlfs | c9f9098 | 2020-12-13 22:00:11 +0100 | [diff] [blame] | 1411 | return html` |
Ben Rohlfs | 8003bd3 | 2022-04-05 18:24:42 +0200 | [diff] [blame] | 1412 | <div class=${expandedClass}> |
Ben Rohlfs | fee542a | 2021-02-24 13:24:54 +0100 | [diff] [blame] | 1413 | <h3 |
Ben Rohlfs | b2f9b1b | 2021-12-14 10:10:32 +0100 | [diff] [blame] | 1414 | class="categoryHeader ${catString} ${empty} heading-3" |
Ben Rohlfs | 8003bd3 | 2022-04-05 18:24:42 +0200 | [diff] [blame] | 1415 | @click=${() => this.toggleExpanded(category)} |
Ben Rohlfs | fee542a | 2021-02-24 13:24:54 +0100 | [diff] [blame] | 1416 | > |
Chris Poucet | 1c71386 | 2022-07-25 13:12:24 +0200 | [diff] [blame] | 1417 | <gr-icon |
| 1418 | class="expandIcon" |
| 1419 | icon=${expanded ? 'expand_less' : 'expand_more'} |
| 1420 | ></gr-icon> |
Ben Rohlfs | 5929e4b | 2021-05-17 14:53:29 +0200 | [diff] [blame] | 1421 | <div class="statusIconWrapper"> |
Chris Poucet | 1c71386 | 2022-07-25 13:12:24 +0200 | [diff] [blame] | 1422 | <gr-icon |
| 1423 | icon=${icon.name} |
| 1424 | ?filled=${icon.filled} |
| 1425 | class="statusIcon ${catString}" |
| 1426 | ></gr-icon> |
Ben Rohlfs | 5929e4b | 2021-05-17 14:53:29 +0200 | [diff] [blame] | 1427 | <span class="title">${catString}</span> |
Ben Rohlfs | 2b5df09 | 2021-06-15 11:20:27 +0200 | [diff] [blame] | 1428 | <span class="count">${this.renderCount(all, filtered)}</span> |
Ben Rohlfs | 5929e4b | 2021-05-17 14:53:29 +0200 | [diff] [blame] | 1429 | <paper-tooltip offset="5" |
| 1430 | >${CATEGORY_TOOLTIPS.get(category)}</paper-tooltip |
| 1431 | > |
| 1432 | </div> |
Ben Rohlfs | fee542a | 2021-02-24 13:24:54 +0100 | [diff] [blame] | 1433 | </h3> |
Ben Rohlfs | 741fa49 | 2022-07-06 14:36:20 +0200 | [diff] [blame] | 1434 | ${when(expanded, () => |
| 1435 | this.renderResults( |
| 1436 | all, |
| 1437 | selected, |
| 1438 | filtered, |
| 1439 | resultLimit, |
| 1440 | showAllButton |
| 1441 | ) |
Ben Rohlfs | fabe749 | 2021-04-23 11:21:16 +0200 | [diff] [blame] | 1442 | )} |
Ben Rohlfs | fee542a | 2021-02-24 13:24:54 +0100 | [diff] [blame] | 1443 | </div> |
Ben Rohlfs | c9f9098 | 2020-12-13 22:00:11 +0100 | [diff] [blame] | 1444 | `; |
| 1445 | } |
Ben Rohlfs | c0c2ea5 | 2021-01-21 09:45:16 +0100 | [diff] [blame] | 1446 | |
Ben Rohlfs | fabe749 | 2021-04-23 11:21:16 +0200 | [diff] [blame] | 1447 | renderShowAllButton( |
Ben Rohlfs | 6cc7e7b | 2021-05-10 13:54:38 +0200 | [diff] [blame] | 1448 | category: Category, |
Ben Rohlfs | fabe749 | 2021-04-23 11:21:16 +0200 | [diff] [blame] | 1449 | isShowAll: boolean, |
| 1450 | showAllThreshold: number, |
| 1451 | resultCount: number |
| 1452 | ) { |
| 1453 | if (resultCount <= showAllThreshold) return; |
| 1454 | const message = isShowAll ? 'Show Less' : `Show All (${resultCount})`; |
| 1455 | const handler = () => this.toggleShowAll(category); |
| 1456 | return html` |
| 1457 | <tr class="showAllRow"> |
Ben Rohlfs | daba0e8 | 2021-06-11 08:06:17 +0200 | [diff] [blame] | 1458 | <td colspan="3"> |
Ben Rohlfs | 8003bd3 | 2022-04-05 18:24:42 +0200 | [diff] [blame] | 1459 | <gr-button class="showAll" link @click=${handler} |
Ben Rohlfs | fabe749 | 2021-04-23 11:21:16 +0200 | [diff] [blame] | 1460 | >${message}</gr-button |
| 1461 | > |
| 1462 | </td> |
| 1463 | </tr> |
| 1464 | `; |
| 1465 | } |
| 1466 | |
Ben Rohlfs | 6cc7e7b | 2021-05-10 13:54:38 +0200 | [diff] [blame] | 1467 | toggleShowAll(category: Category) { |
Ben Rohlfs | fabe749 | 2021-04-23 11:21:16 +0200 | [diff] [blame] | 1468 | const current = this.isShowAll.get(category) ?? false; |
| 1469 | this.isShowAll.set(category, !current); |
Ben Rohlfs | cced911 | 2021-12-22 16:34:54 +0100 | [diff] [blame] | 1470 | this.reporting.reportInteraction( |
| 1471 | Interaction.CHECKS_RESULT_SECTION_SHOW_ALL, |
| 1472 | { |
| 1473 | category, |
| 1474 | showAll: !current, |
| 1475 | } |
| 1476 | ); |
Ben Rohlfs | fabe749 | 2021-04-23 11:21:16 +0200 | [diff] [blame] | 1477 | this.requestUpdate(); |
| 1478 | } |
| 1479 | |
Ben Rohlfs | e6a4c47 | 2021-04-22 13:06:09 +0200 | [diff] [blame] | 1480 | renderResults( |
| 1481 | all: RunResult[], |
| 1482 | selected: RunResult[], |
Ben Rohlfs | fabe749 | 2021-04-23 11:21:16 +0200 | [diff] [blame] | 1483 | filtered: RunResult[], |
| 1484 | limit: number, |
| 1485 | showAll: TemplateResult | undefined |
Ben Rohlfs | e6a4c47 | 2021-04-22 13:06:09 +0200 | [diff] [blame] | 1486 | ) { |
| 1487 | if (all.length === 0) { |
| 1488 | return html`<div class="noResultsMessage">No results</div>`; |
| 1489 | } |
| 1490 | if (selected.length === 0) { |
Ben Rohlfs | 260cce0 | 2021-03-05 16:57:09 +0100 | [diff] [blame] | 1491 | return html`<div class="noResultsMessage"> |
| 1492 | No results for this filtered view |
| 1493 | </div>`; |
| 1494 | } |
Ben Rohlfs | 9994928 | 2021-03-03 19:19:21 +0100 | [diff] [blame] | 1495 | if (filtered.length === 0) { |
Ben Rohlfs | 260cce0 | 2021-03-05 16:57:09 +0100 | [diff] [blame] | 1496 | return html`<div class="noResultsMessage"> |
| 1497 | No results match the regular expression |
| 1498 | </div>`; |
Ben Rohlfs | 9994928 | 2021-03-03 19:19:21 +0100 | [diff] [blame] | 1499 | } |
Ben Rohlfs | fabe749 | 2021-04-23 11:21:16 +0200 | [diff] [blame] | 1500 | filtered = filtered.slice(0, limit); |
Ben Rohlfs | c1a3675 | 2021-11-15 12:27:57 +0100 | [diff] [blame] | 1501 | // Some hosts/plugins use really long check names. If we have space and the |
| 1502 | // check names are indeed very long, then set a more generous nameCol width. |
| 1503 | const longestNameLength = Math.max(...all.map(r => r.checkName.length)); |
| 1504 | const nameColClasses = {nameCol: true, longNames: longestNameLength > 25}; |
Ben Rohlfs | 9994928 | 2021-03-03 19:19:21 +0100 | [diff] [blame] | 1505 | return html` |
| 1506 | <table class="resultsTable"> |
| 1507 | <thead> |
| 1508 | <tr class="headerRow"> |
Ben Rohlfs | 8003bd3 | 2022-04-05 18:24:42 +0200 | [diff] [blame] | 1509 | <th class=${classMap(nameColClasses)}>Run</th> |
Ben Rohlfs | 9994928 | 2021-03-03 19:19:21 +0100 | [diff] [blame] | 1510 | <th class="summaryCol">Summary</th> |
| 1511 | <th class="expanderCol"></th> |
| 1512 | </tr> |
| 1513 | </thead> |
Ben Rohlfs | 48330a1 | 2021-12-09 15:12:17 +0100 | [diff] [blame] | 1514 | <tbody @checks-results-filter=${this.handleFilter}> |
Ben Rohlfs | a684e01 | 2021-03-22 13:53:57 +0100 | [diff] [blame] | 1515 | ${repeat( |
| 1516 | filtered, |
Frank Borden | 2be1c8d | 2023-11-30 12:25:32 +0100 | [diff] [blame] | 1517 | // @ts-ignore: temporarily unblock typescript 5.3 migration |
Ben Rohlfs | a8bb0da | 2021-04-12 08:56:20 +0200 | [diff] [blame] | 1518 | result => result.internalResultId, |
Chris Poucet | ca77c66 | 2023-02-23 13:52:19 +0100 | [diff] [blame] | 1519 | (result?: RunResult) => html` |
Ben Rohlfs | ed7d5db | 2021-03-05 15:12:18 +0100 | [diff] [blame] | 1520 | <gr-result-row |
Ben Rohlfs | 8003bd3 | 2022-04-05 18:24:42 +0200 | [diff] [blame] | 1521 | class=${charsOnly(result!.checkName)} |
| 1522 | .result=${result} |
Ben Rohlfs | ed7d5db | 2021-03-05 15:12:18 +0100 | [diff] [blame] | 1523 | ></gr-result-row> |
| 1524 | ` |
Ben Rohlfs | 9994928 | 2021-03-03 19:19:21 +0100 | [diff] [blame] | 1525 | )} |
Ben Rohlfs | fabe749 | 2021-04-23 11:21:16 +0200 | [diff] [blame] | 1526 | ${showAll} |
Ben Rohlfs | 9994928 | 2021-03-03 19:19:21 +0100 | [diff] [blame] | 1527 | </tbody> |
| 1528 | </table> |
| 1529 | `; |
| 1530 | } |
| 1531 | |
Ben Rohlfs | 2b5df09 | 2021-06-15 11:20:27 +0200 | [diff] [blame] | 1532 | renderCount(all: RunResult[], filtered: RunResult[]) { |
Ben Rohlfs | 9994928 | 2021-03-03 19:19:21 +0100 | [diff] [blame] | 1533 | if (all.length === filtered.length) { |
| 1534 | return html`(${all.length})`; |
Ben Rohlfs | 9994928 | 2021-03-03 19:19:21 +0100 | [diff] [blame] | 1535 | } |
Ben Rohlfs | e6a4c47 | 2021-04-22 13:06:09 +0200 | [diff] [blame] | 1536 | return html`(${filtered.length} of ${all.length})`; |
Ben Rohlfs | 9994928 | 2021-03-03 19:19:21 +0100 | [diff] [blame] | 1537 | } |
| 1538 | |
Ben Rohlfs | 6cc7e7b | 2021-05-10 13:54:38 +0200 | [diff] [blame] | 1539 | toggleExpanded(category: Category) { |
Ben Rohlfs | 9994928 | 2021-03-03 19:19:21 +0100 | [diff] [blame] | 1540 | const expanded = this.isSectionExpanded.get(category); |
| 1541 | assertIsDefined(expanded, 'expanded must have been set in initial render'); |
Ben Rohlfs | fee542a | 2021-02-24 13:24:54 +0100 | [diff] [blame] | 1542 | this.isSectionExpanded.set(category, !expanded); |
Ben Rohlfs | 9994928 | 2021-03-03 19:19:21 +0100 | [diff] [blame] | 1543 | this.isSectionExpandedByUser.set(category, true); |
Ben Rohlfs | cced911 | 2021-12-22 16:34:54 +0100 | [diff] [blame] | 1544 | this.reporting.reportInteraction(Interaction.CHECKS_RESULT_SECTION_TOGGLE, { |
| 1545 | expanded: !expanded, |
| 1546 | category, |
| 1547 | }); |
Ben Rohlfs | fee542a | 2021-02-24 13:24:54 +0100 | [diff] [blame] | 1548 | this.requestUpdate(); |
| 1549 | } |
| 1550 | |
Ben Rohlfs | 68b4723 | 2023-06-26 12:53:41 +0200 | [diff] [blame] | 1551 | computeRunResults(category: Category, run: CheckRun): RunResult[] { |
Ben Rohlfs | 4a5ac59 | 2021-05-19 15:11:03 +0200 | [diff] [blame] | 1552 | if (category === Category.SUCCESS && hasCompletedWithoutResults(run)) { |
Ben Rohlfs | 6cc7e7b | 2021-05-10 13:54:38 +0200 | [diff] [blame] | 1553 | return [this.computeSuccessfulRunResult(run)]; |
| 1554 | } |
Ben Rohlfs | 9994928 | 2021-03-03 19:19:21 +0100 | [diff] [blame] | 1555 | return ( |
| 1556 | run.results |
| 1557 | ?.filter(result => result.category === category) |
Ben Rohlfs | 68b4723 | 2023-06-26 12:53:41 +0200 | [diff] [blame] | 1558 | .map(result => runResult(run, result)) ?? [] |
Ben Rohlfs | 9994928 | 2021-03-03 19:19:21 +0100 | [diff] [blame] | 1559 | ); |
Ben Rohlfs | c0c2ea5 | 2021-01-21 09:45:16 +0100 | [diff] [blame] | 1560 | } |
| 1561 | |
Ben Rohlfs | 9994928 | 2021-03-03 19:19:21 +0100 | [diff] [blame] | 1562 | computeSuccessfulRunResult(run: CheckRun): RunResult { |
Ben Rohlfs | 68b4723 | 2023-06-26 12:53:41 +0200 | [diff] [blame] | 1563 | const adaptedRun: RunResult = runResult(run, { |
Ben Rohlfs | a8bb0da | 2021-04-12 08:56:20 +0200 | [diff] [blame] | 1564 | internalResultId: run.internalRunId + '-0', |
Ben Rohlfs | 6cc7e7b | 2021-05-10 13:54:38 +0200 | [diff] [blame] | 1565 | category: Category.SUCCESS, |
Ben Rohlfs | 23a466c | 2021-02-17 12:03:53 +0100 | [diff] [blame] | 1566 | summary: run.statusDescription ?? '', |
Ben Rohlfs | 68b4723 | 2023-06-26 12:53:41 +0200 | [diff] [blame] | 1567 | }); |
Ben Rohlfs | 5e5c89e | 2021-02-25 11:09:33 +0100 | [diff] [blame] | 1568 | if (!run.statusDescription) { |
| 1569 | const start = run.scheduledTimestamp ?? run.startedTimestamp; |
| 1570 | const end = run.finishedTimestamp; |
| 1571 | let duration = ''; |
| 1572 | if (start && end) { |
| 1573 | duration = ` in ${durationString(start, end, true)}`; |
| 1574 | } |
| 1575 | adaptedRun.message = `Completed without results${duration}.`; |
| 1576 | } |
| 1577 | if (run.statusLink) { |
| 1578 | adaptedRun.links = [ |
| 1579 | { |
| 1580 | url: run.statusLink, |
| 1581 | primary: true, |
| 1582 | icon: LinkIcon.EXTERNAL, |
| 1583 | }, |
| 1584 | ]; |
| 1585 | } |
Ben Rohlfs | 9994928 | 2021-03-03 19:19:21 +0100 | [diff] [blame] | 1586 | return adaptedRun; |
Ben Rohlfs | c0c2ea5 | 2021-01-21 09:45:16 +0100 | [diff] [blame] | 1587 | } |
Ben Rohlfs | c9f9098 | 2020-12-13 22:00:11 +0100 | [diff] [blame] | 1588 | } |
| 1589 | |
| 1590 | declare global { |
| 1591 | interface HTMLElementTagNameMap { |
Ben Rohlfs | c0c2ea5 | 2021-01-21 09:45:16 +0100 | [diff] [blame] | 1592 | 'gr-result-row': GrResultRow; |
Ben Rohlfs | e6c57d0 | 2021-01-25 11:22:39 +0100 | [diff] [blame] | 1593 | 'gr-result-expanded': GrResultExpanded; |
Ben Rohlfs | c9f9098 | 2020-12-13 22:00:11 +0100 | [diff] [blame] | 1594 | 'gr-checks-results': GrChecksResults; |
Ben Rohlfs | c9f9098 | 2020-12-13 22:00:11 +0100 | [diff] [blame] | 1595 | } |
| 1596 | } |