Dave Borowitz | 8cdc76b | 2018-03-26 10:04:27 -0400 | [diff] [blame] | 1 | /** |
| 2 | * @license |
Ben Rohlfs | 94fcbbc | 2022-05-27 10:45:03 +0200 | [diff] [blame] | 3 | * Copyright 2015 Google LLC |
| 4 | * SPDX-License-Identifier: Apache-2.0 |
Dave Borowitz | 8cdc76b | 2018-03-26 10:04:27 -0400 | [diff] [blame] | 5 | */ |
Dmitrii Filippov | 8814de1 | 2020-10-10 16:31:21 +0200 | [diff] [blame] | 6 | import '../gr-change-list/gr-change-list'; |
| 7 | import '../gr-repo-header/gr-repo-header'; |
| 8 | import '../gr-user-header/gr-user-header'; |
Dmitrii Filippov | 8814de1 | 2020-10-10 16:31:21 +0200 | [diff] [blame] | 9 | import {page} from '../../../utils/page-wrapper-utils'; |
Ben Rohlfs | ebe4acc | 2020-12-11 21:16:10 +0100 | [diff] [blame] | 10 | import {GerritNav} from '../../core/gr-navigation/gr-navigation'; |
Dmitrii Filippov | 8814de1 | 2020-10-10 16:31:21 +0200 | [diff] [blame] | 11 | import {AppElementParams} from '../../gr-app-types'; |
| 12 | import { |
| 13 | AccountDetailInfo, |
| 14 | AccountId, |
Dmitrii Filippov | 8814de1 | 2020-10-10 16:31:21 +0200 | [diff] [blame] | 15 | ChangeInfo, |
| 16 | EmailAddress, |
Dmitrii Filippov | 8814de1 | 2020-10-10 16:31:21 +0200 | [diff] [blame] | 17 | PreferencesInput, |
Paladox none | 5554d95 | 2021-08-11 03:56:51 +0000 | [diff] [blame] | 18 | RepoName, |
Dmitrii Filippov | 8814de1 | 2020-10-10 16:31:21 +0200 | [diff] [blame] | 19 | } from '../../../types/common'; |
Dmitrii Filippov | 8814de1 | 2020-10-10 16:31:21 +0200 | [diff] [blame] | 20 | import {ChangeStarToggleStarDetail} from '../../shared/gr-change-star/gr-change-star'; |
Ben Rohlfs | 5a1bd47 | 2022-09-09 13:27:22 +0200 | [diff] [blame] | 21 | import {fireAlert, fireEvent, fireTitleChange} from '../../../utils/event-util'; |
Chris Poucet | c6e880b | 2021-11-15 19:57:06 +0100 | [diff] [blame] | 22 | import {getAppContext} from '../../../services/app-context'; |
Ben Rohlfs | ebe4acc | 2020-12-11 21:16:10 +0100 | [diff] [blame] | 23 | import {GerritView} from '../../../services/router/router-model'; |
Paladox none | 142add0 | 2021-12-21 21:06:09 +0000 | [diff] [blame] | 24 | import {sharedStyles} from '../../../styles/shared-styles'; |
| 25 | import {LitElement, PropertyValues, html, css} from 'lit'; |
Frank Borden | 42c1a45 | 2022-08-11 16:27:20 +0200 | [diff] [blame] | 26 | import {customElement, property, state, query} from 'lit/decorators.js'; |
Dhruv | 7c72da5 | 2022-06-09 11:43:15 +0200 | [diff] [blame] | 27 | import {ValueChangedEvent} from '../../../types/events'; |
Ben Rohlfs | 39aa057 | 2022-09-14 22:57:17 +0200 | [diff] [blame^] | 28 | import {createSearchUrl} from '../../../models/views/search'; |
Kasper Nilsson | a81a8a3 | 2017-03-13 14:46:44 -0700 | [diff] [blame] | 29 | |
Ben Rohlfs | 7b71b11 | 2021-02-12 10:36:08 +0100 | [diff] [blame] | 30 | const LOOKUP_QUERY_PATTERNS: RegExp[] = [ |
| 31 | /^\s*i?[0-9a-f]{7,40}\s*$/i, // CHANGE_ID |
| 32 | /^\s*[1-9][0-9]*\s*$/g, // CHANGE_NUM |
| 33 | /[0-9a-f]{40}/, // COMMIT |
| 34 | ]; |
Dhruv Srivastava | 6f8c9e3 | 2020-08-26 12:01:49 +0000 | [diff] [blame] | 35 | |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 36 | const USER_QUERY_PATTERN = /^owner:\s?("[^"]+"|[^ ]+)$/; |
Becky Siegel | 2078930 | 2018-01-05 14:18:05 -0800 | [diff] [blame] | 37 | |
Chris Poucet | caeea1b | 2021-08-19 22:12:56 +0000 | [diff] [blame] | 38 | const REPO_QUERY_PATTERN = |
| 39 | /^project:\s?("[^"]+"|[^ ]+)(\sstatus\s?:(open|"open"))?$/; |
Logan Hanks | 29693ac | 2017-07-12 10:11:21 -0700 | [diff] [blame] | 40 | |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 41 | const LIMIT_OPERATOR_PATTERN = /\blimit:(\d+)/i; |
| 42 | |
Dmitrii Filippov | 8814de1 | 2020-10-10 16:31:21 +0200 | [diff] [blame] | 43 | @customElement('gr-change-list-view') |
Paladox none | 142add0 | 2021-12-21 21:06:09 +0000 | [diff] [blame] | 44 | export class GrChangeListView extends LitElement { |
Dmitrii Filippov | 3fd2b10 | 2019-11-15 16:16:46 +0100 | [diff] [blame] | 45 | /** |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 46 | * Fired when the title of the page should change. |
| 47 | * |
| 48 | * @event title-change |
Tao Zhou | 9a07681 | 2019-12-17 09:59:28 +0100 | [diff] [blame] | 49 | */ |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 50 | |
Paladox none | 142add0 | 2021-12-21 21:06:09 +0000 | [diff] [blame] | 51 | @query('#prevArrow') protected prevArrow?: HTMLAnchorElement; |
Andrew Bonventre | 78792e8 | 2016-03-04 17:48:22 -0500 | [diff] [blame] | 52 | |
Paladox none | 142add0 | 2021-12-21 21:06:09 +0000 | [diff] [blame] | 53 | @query('#nextArrow') protected nextArrow?: HTMLAnchorElement; |
| 54 | |
| 55 | @property({type: Object}) |
| 56 | params?: AppElementParams; |
Andrew Bonventre | 78792e8 | 2016-03-04 17:48:22 -0500 | [diff] [blame] | 57 | |
Dmitrii Filippov | 8814de1 | 2020-10-10 16:31:21 +0200 | [diff] [blame] | 58 | @property({type: Object}) |
| 59 | account: AccountDetailInfo | null = null; |
Wyatt Allen | fc0c84f | 2018-03-02 10:52:46 -0800 | [diff] [blame] | 60 | |
Paladox none | 142add0 | 2021-12-21 21:06:09 +0000 | [diff] [blame] | 61 | @property({type: Object}) |
Dmitrii Filippov | 8814de1 | 2020-10-10 16:31:21 +0200 | [diff] [blame] | 62 | preferences?: PreferencesInput; |
Andrew Bonventre | 78792e8 | 2016-03-04 17:48:22 -0500 | [diff] [blame] | 63 | |
Paladox none | 142add0 | 2021-12-21 21:06:09 +0000 | [diff] [blame] | 64 | // private but used in test |
| 65 | @state() changesPerPage?: number; |
Kasper Nilsson | 8e6a64d | 2018-04-04 15:33:19 -0700 | [diff] [blame] | 66 | |
Paladox none | 142add0 | 2021-12-21 21:06:09 +0000 | [diff] [blame] | 67 | // private but used in test |
| 68 | @state() query = ''; |
Urs Wolfer | 54a5a46 | 2016-03-09 21:04:22 +0100 | [diff] [blame] | 69 | |
Paladox none | 142add0 | 2021-12-21 21:06:09 +0000 | [diff] [blame] | 70 | // private but used in test |
| 71 | @state() offset?: number; |
Andrew Bonventre | 78792e8 | 2016-03-04 17:48:22 -0500 | [diff] [blame] | 72 | |
Paladox none | 142add0 | 2021-12-21 21:06:09 +0000 | [diff] [blame] | 73 | // private but used in test |
| 74 | @state() changes?: ChangeInfo[]; |
Andrew Bonventre | 78792e8 | 2016-03-04 17:48:22 -0500 | [diff] [blame] | 75 | |
Paladox none | 142add0 | 2021-12-21 21:06:09 +0000 | [diff] [blame] | 76 | // private but used in test |
| 77 | @state() loading = true; |
Andrew Bonventre | 78792e8 | 2016-03-04 17:48:22 -0500 | [diff] [blame] | 78 | |
Paladox none | 142add0 | 2021-12-21 21:06:09 +0000 | [diff] [blame] | 79 | // private but used in test |
| 80 | @state() userId: AccountId | EmailAddress | null = null; |
Wyatt Allen | 5c3a3cd | 2017-08-30 13:43:37 -0700 | [diff] [blame] | 81 | |
Paladox none | 142add0 | 2021-12-21 21:06:09 +0000 | [diff] [blame] | 82 | // private but used in test |
| 83 | @state() repo: RepoName | null = null; |
Becky Siegel | 2078930 | 2018-01-05 14:18:05 -0800 | [diff] [blame] | 84 | |
Dhruv | 7c72da5 | 2022-06-09 11:43:15 +0200 | [diff] [blame] | 85 | @state() selectedIndex = 0; |
| 86 | |
Chris Poucet | c6e880b | 2021-11-15 19:57:06 +0100 | [diff] [blame] | 87 | private readonly restApiService = getAppContext().restApiService; |
Ben Rohlfs | 43935a4 | 2020-12-01 19:14:09 +0100 | [diff] [blame] | 88 | |
Chris Poucet | c6e880b | 2021-11-15 19:57:06 +0100 | [diff] [blame] | 89 | private reporting = getAppContext().reportingService; |
Dhruv Srivastava | 5841dd8 | 2021-05-17 11:03:19 +0200 | [diff] [blame] | 90 | |
Ben Rohlfs | f7f1e8e | 2021-03-12 14:36:40 +0100 | [diff] [blame] | 91 | constructor() { |
| 92 | super(); |
Paladox none | 142add0 | 2021-12-21 21:06:09 +0000 | [diff] [blame] | 93 | this.addEventListener('next-page', () => this.handleNextPage()); |
| 94 | this.addEventListener('previous-page', () => this.handlePreviousPage()); |
Dhruv Srivastava | 36ff29d | 2021-09-22 18:31:02 +0200 | [diff] [blame] | 95 | this.addEventListener('reload', () => this.reload()); |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 96 | } |
| 97 | |
Chris Poucet | 59dad57 | 2021-08-20 15:25:36 +0000 | [diff] [blame] | 98 | override connectedCallback() { |
Ben Rohlfs | 5f520da | 2021-03-10 14:58:43 +0100 | [diff] [blame] | 99 | super.connectedCallback(); |
Paladox none | 142add0 | 2021-12-21 21:06:09 +0000 | [diff] [blame] | 100 | this.loadPreferences(); |
Ben Rohlfs | 85666c8 | 2022-03-21 10:03:17 +0100 | [diff] [blame] | 101 | } |
| 102 | |
| 103 | override disconnectedCallback() { |
Ben Rohlfs | 85666c8 | 2022-03-21 10:03:17 +0100 | [diff] [blame] | 104 | super.disconnectedCallback(); |
Paladox none | 142add0 | 2021-12-21 21:06:09 +0000 | [diff] [blame] | 105 | } |
| 106 | |
| 107 | static override get styles() { |
| 108 | return [ |
| 109 | sharedStyles, |
| 110 | css` |
| 111 | :host { |
| 112 | display: block; |
| 113 | } |
| 114 | .loading { |
| 115 | color: var(--deemphasized-text-color); |
| 116 | padding: var(--spacing-l); |
| 117 | } |
| 118 | gr-change-list { |
| 119 | width: 100%; |
| 120 | } |
| 121 | gr-user-header, |
| 122 | gr-repo-header { |
| 123 | border-bottom: 1px solid var(--border-color); |
| 124 | } |
| 125 | nav { |
| 126 | align-items: center; |
| 127 | display: flex; |
| 128 | height: 3rem; |
| 129 | justify-content: flex-end; |
| 130 | margin-right: 20px; |
Paladox none | 142add0 | 2021-12-21 21:06:09 +0000 | [diff] [blame] | 131 | color: var(--deemphasized-text-color); |
| 132 | } |
Chris Poucet | b7e9bb1 | 2022-07-22 14:11:03 +0200 | [diff] [blame] | 133 | gr-icon { |
Chris Poucet | cf51254 | 2022-07-12 09:03:42 +0200 | [diff] [blame] | 134 | font-size: 1.85rem; |
Paladox none | 142add0 | 2021-12-21 21:06:09 +0000 | [diff] [blame] | 135 | margin-left: 16px; |
Paladox none | 142add0 | 2021-12-21 21:06:09 +0000 | [diff] [blame] | 136 | } |
| 137 | .hide { |
| 138 | display: none; |
| 139 | } |
| 140 | @media only screen and (max-width: 50em) { |
| 141 | .loading, |
| 142 | .error { |
| 143 | padding: 0 var(--spacing-l); |
| 144 | } |
| 145 | } |
| 146 | `, |
| 147 | ]; |
| 148 | } |
| 149 | |
| 150 | override render() { |
Paladox none | 142add0 | 2021-12-21 21:06:09 +0000 | [diff] [blame] | 151 | const loggedIn = !!(this.account && Object.keys(this.account).length > 0); |
Dhruv Srivastava | 45166a1 | 2022-03-02 15:30:35 +0100 | [diff] [blame] | 152 | // In case of an internal reload we want the ChangeList section components |
| 153 | // to remain in the DOM so that the Bulk Actions Model associated with them |
| 154 | // is not recreated after the reload resulting in user selections being lost |
Paladox none | 142add0 | 2021-12-21 21:06:09 +0000 | [diff] [blame] | 155 | return html` |
Dhruv Srivastava | 45166a1 | 2022-03-02 15:30:35 +0100 | [diff] [blame] | 156 | <div class="loading" ?hidden=${!this.loading}>Loading...</div> |
| 157 | <div ?hidden=${this.loading}> |
Paladox none | 142add0 | 2021-12-21 21:06:09 +0000 | [diff] [blame] | 158 | ${this.renderRepoHeader()} ${this.renderUserHeader(loggedIn)} |
| 159 | <gr-change-list |
| 160 | .account=${this.account} |
| 161 | .changes=${this.changes} |
| 162 | .preferences=${this.preferences} |
Paladox none | 142add0 | 2021-12-21 21:06:09 +0000 | [diff] [blame] | 163 | .showStar=${loggedIn} |
Dhruv | 7c72da5 | 2022-06-09 11:43:15 +0200 | [diff] [blame] | 164 | .selectedIndex=${this.selectedIndex} |
| 165 | @selected-index-changed=${(e: ValueChangedEvent<number>) => { |
| 166 | this.selectedIndex = e.detail.value; |
| 167 | }} |
Paladox none | 142add0 | 2021-12-21 21:06:09 +0000 | [diff] [blame] | 168 | @toggle-star=${(e: CustomEvent<ChangeStarToggleStarDetail>) => { |
| 169 | this.handleToggleStar(e); |
| 170 | }} |
Chris Poucet | 12100f1 | 2022-07-06 15:11:27 +0200 | [diff] [blame] | 171 | .usp=${'search'} |
Paladox none | 142add0 | 2021-12-21 21:06:09 +0000 | [diff] [blame] | 172 | ></gr-change-list> |
| 173 | ${this.renderChangeListViewNav()} |
| 174 | </div> |
| 175 | `; |
| 176 | } |
| 177 | |
| 178 | private renderRepoHeader() { |
| 179 | if (!this.repo) return; |
| 180 | |
| 181 | return html` <gr-repo-header .repo=${this.repo}></gr-repo-header> `; |
| 182 | } |
| 183 | |
| 184 | private renderUserHeader(loggedIn: boolean) { |
| 185 | if (!this.userId) return; |
| 186 | |
| 187 | return html` |
| 188 | <gr-user-header |
| 189 | .userId=${this.userId} |
| 190 | showDashboardLink |
| 191 | .loggedIn=${loggedIn} |
| 192 | ></gr-user-header> |
| 193 | `; |
| 194 | } |
| 195 | |
| 196 | private renderChangeListViewNav() { |
| 197 | if (this.loading || !this.changes || !this.changes.length) return; |
| 198 | |
| 199 | return html` |
| 200 | <nav> |
| 201 | Page ${this.computePage()} ${this.renderPrevArrow()} |
| 202 | ${this.renderNextArrow()} |
| 203 | </nav> |
| 204 | `; |
| 205 | } |
| 206 | |
| 207 | private renderPrevArrow() { |
| 208 | if (this.offset === 0) return; |
| 209 | |
| 210 | return html` |
Ben Rohlfs | 8003bd3 | 2022-04-05 18:24:42 +0200 | [diff] [blame] | 211 | <a id="prevArrow" href=${this.computeNavLink(-1)}> |
Chris Poucet | b7e9bb1 | 2022-07-22 14:11:03 +0200 | [diff] [blame] | 212 | <gr-icon icon="chevron_left" aria-label="Older"></gr-icon> |
Paladox none | 142add0 | 2021-12-21 21:06:09 +0000 | [diff] [blame] | 213 | </a> |
| 214 | `; |
| 215 | } |
| 216 | |
| 217 | private renderNextArrow() { |
| 218 | if ( |
| 219 | !( |
| 220 | this.changes?.length && |
| 221 | this.changes[this.changes.length - 1]._more_changes |
| 222 | ) |
| 223 | ) |
| 224 | return; |
| 225 | |
| 226 | return html` |
Ben Rohlfs | 8003bd3 | 2022-04-05 18:24:42 +0200 | [diff] [blame] | 227 | <a id="nextArrow" href=${this.computeNavLink(1)}> |
Chris Poucet | b7e9bb1 | 2022-07-22 14:11:03 +0200 | [diff] [blame] | 228 | <gr-icon icon="chevron_right" aria-label="Newer"></gr-icon> |
Paladox none | 142add0 | 2021-12-21 21:06:09 +0000 | [diff] [blame] | 229 | </a> |
| 230 | `; |
| 231 | } |
| 232 | |
| 233 | override willUpdate(changedProperties: PropertyValues) { |
| 234 | if (changedProperties.has('params')) { |
| 235 | this.paramsChanged(); |
| 236 | } |
| 237 | |
| 238 | if (changedProperties.has('changes')) { |
| 239 | this.changesChanged(); |
| 240 | } |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 241 | } |
| 242 | |
Dhruv Srivastava | 36ff29d | 2021-09-22 18:31:02 +0200 | [diff] [blame] | 243 | reload() { |
Paladox none | 142add0 | 2021-12-21 21:06:09 +0000 | [diff] [blame] | 244 | if (this.loading) return; |
| 245 | this.loading = true; |
| 246 | this.getChanges().then(changes => { |
| 247 | this.changes = changes || []; |
| 248 | this.loading = false; |
Dhruv Srivastava | 36ff29d | 2021-09-22 18:31:02 +0200 | [diff] [blame] | 249 | }); |
| 250 | } |
| 251 | |
Paladox none | 142add0 | 2021-12-21 21:06:09 +0000 | [diff] [blame] | 252 | private paramsChanged() { |
| 253 | const value = this.params; |
| 254 | if (!value || value.view !== GerritView.SEARCH) return; |
Dhruv | 1347c2d | 2022-06-07 13:05:46 +0200 | [diff] [blame] | 255 | const offset = isNaN(Number(value.offset)) ? 0 : Number(value.offset); |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 256 | |
Ben Rohlfs | a58c596 | 2022-09-12 22:26:14 +0200 | [diff] [blame] | 257 | if (this.query !== (value.query ?? '')) { |
Dhruv | 7c72da5 | 2022-06-09 11:43:15 +0200 | [diff] [blame] | 258 | this.selectedIndex = 0; |
| 259 | } |
| 260 | |
Paladox none | 142add0 | 2021-12-21 21:06:09 +0000 | [diff] [blame] | 261 | this.loading = true; |
Ben Rohlfs | a58c596 | 2022-09-12 22:26:14 +0200 | [diff] [blame] | 262 | this.query = value.query ?? ''; |
Dhruv | 1347c2d | 2022-06-07 13:05:46 +0200 | [diff] [blame] | 263 | this.offset = offset; |
Andrew Bonventre | 78792e8 | 2016-03-04 17:48:22 -0500 | [diff] [blame] | 264 | |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 265 | // NOTE: This method may be called before attachment. Fire title-change |
| 266 | // in an async so that attachment to the DOM can take place first. |
Paladox none | 142add0 | 2021-12-21 21:06:09 +0000 | [diff] [blame] | 267 | setTimeout(() => fireTitleChange(this, this.query)); |
Dmitrii Filippov | 8814de1 | 2020-10-10 16:31:21 +0200 | [diff] [blame] | 268 | |
Ben Rohlfs | 43935a4 | 2020-12-01 19:14:09 +0100 | [diff] [blame] | 269 | this.restApiService |
Dmitrii Filippov | 8814de1 | 2020-10-10 16:31:21 +0200 | [diff] [blame] | 270 | .getPreferences() |
| 271 | .then(prefs => { |
| 272 | if (!prefs) { |
| 273 | throw new Error('getPreferences returned undefined'); |
| 274 | } |
Paladox none | 142add0 | 2021-12-21 21:06:09 +0000 | [diff] [blame] | 275 | this.changesPerPage = prefs.changes_per_page; |
| 276 | return this.getChanges(); |
Dmitrii Filippov | 8814de1 | 2020-10-10 16:31:21 +0200 | [diff] [blame] | 277 | }) |
| 278 | .then(changes => { |
| 279 | changes = changes || []; |
Paladox none | 142add0 | 2021-12-21 21:06:09 +0000 | [diff] [blame] | 280 | if (this.query && changes.length === 1) { |
Ben Rohlfs | 7b71b11 | 2021-02-12 10:36:08 +0100 | [diff] [blame] | 281 | for (const queryPattern of LOOKUP_QUERY_PATTERNS) { |
Paladox none | 142add0 | 2021-12-21 21:06:09 +0000 | [diff] [blame] | 282 | if (this.query.match(queryPattern)) { |
Dmitrii Filippov | 8814de1 | 2020-10-10 16:31:21 +0200 | [diff] [blame] | 283 | // "Back"/"Forward" buttons work correctly only with |
| 284 | // opt_redirect options |
Dhruv Srivastava | 0633ae1 | 2021-11-11 15:16:47 +0100 | [diff] [blame] | 285 | GerritNav.navigateToChange(changes[0], { |
| 286 | redirect: true, |
| 287 | }); |
Dmitrii Filippov | 8814de1 | 2020-10-10 16:31:21 +0200 | [diff] [blame] | 288 | return; |
Dhruv Srivastava | 6f8c9e3 | 2020-08-26 12:01:49 +0000 | [diff] [blame] | 289 | } |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 290 | } |
Dmitrii Filippov | 8814de1 | 2020-10-10 16:31:21 +0200 | [diff] [blame] | 291 | } |
Paladox none | 142add0 | 2021-12-21 21:06:09 +0000 | [diff] [blame] | 292 | this.changes = changes; |
| 293 | this.loading = false; |
Dmitrii Filippov | 8814de1 | 2020-10-10 16:31:21 +0200 | [diff] [blame] | 294 | }); |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 295 | } |
Andrew Bonventre | 78792e8 | 2016-03-04 17:48:22 -0500 | [diff] [blame] | 296 | |
Paladox none | 142add0 | 2021-12-21 21:06:09 +0000 | [diff] [blame] | 297 | private loadPreferences() { |
Ben Rohlfs | 43935a4 | 2020-12-01 19:14:09 +0100 | [diff] [blame] | 298 | return this.restApiService.getLoggedIn().then(loggedIn => { |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 299 | if (loggedIn) { |
Ben Rohlfs | 43935a4 | 2020-12-01 19:14:09 +0100 | [diff] [blame] | 300 | this.restApiService.getPreferences().then(preferences => { |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 301 | this.preferences = preferences; |
| 302 | }); |
| 303 | } else { |
| 304 | this.preferences = {}; |
Logan Hanks | 29693ac | 2017-07-12 10:11:21 -0700 | [diff] [blame] | 305 | } |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 306 | }); |
| 307 | } |
Logan Hanks | 29693ac | 2017-07-12 10:11:21 -0700 | [diff] [blame] | 308 | |
Paladox none | 142add0 | 2021-12-21 21:06:09 +0000 | [diff] [blame] | 309 | // private but used in test |
| 310 | getChanges() { |
Ben Rohlfs | 43935a4 | 2020-12-01 19:14:09 +0100 | [diff] [blame] | 311 | return this.restApiService.getChanges( |
Paladox none | 142add0 | 2021-12-21 21:06:09 +0000 | [diff] [blame] | 312 | this.changesPerPage, |
| 313 | this.query, |
| 314 | this.offset |
Dmitrii Filippov | 8814de1 | 2020-10-10 16:31:21 +0200 | [diff] [blame] | 315 | ); |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 316 | } |
Andrew Bonventre | 78792e8 | 2016-03-04 17:48:22 -0500 | [diff] [blame] | 317 | |
Paladox none | 142add0 | 2021-12-21 21:06:09 +0000 | [diff] [blame] | 318 | // private but used in test |
| 319 | limitFor(query: string, defaultLimit?: number) { |
| 320 | if (defaultLimit === undefined) return 0; |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 321 | const match = query.match(LIMIT_OPERATOR_PATTERN); |
| 322 | if (!match) { |
| 323 | return defaultLimit; |
Dmitrii Filippov | 3fd2b10 | 2019-11-15 16:16:46 +0100 | [diff] [blame] | 324 | } |
Dhruv Srivastava | b8edee9 | 2020-10-19 10:20:07 +0200 | [diff] [blame] | 325 | return Number(match[1]); |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 326 | } |
Kasper Nilsson | 9724092 | 2018-02-08 14:57:27 -0800 | [diff] [blame] | 327 | |
Paladox none | 142add0 | 2021-12-21 21:06:09 +0000 | [diff] [blame] | 328 | // private but used in test |
| 329 | computeNavLink(direction: number) { |
| 330 | const offset = this.offset ?? 0; |
| 331 | const limit = this.limitFor(this.query, this.changesPerPage); |
Dmitrii Filippov | 8814de1 | 2020-10-10 16:31:21 +0200 | [diff] [blame] | 332 | const newOffset = Math.max(0, offset + limit * direction); |
Ben Rohlfs | 39aa057 | 2022-09-14 22:57:17 +0200 | [diff] [blame^] | 333 | return createSearchUrl({query: this.query, offset: newOffset}); |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 334 | } |
| 335 | |
Paladox none | 142add0 | 2021-12-21 21:06:09 +0000 | [diff] [blame] | 336 | // private but used in test |
| 337 | handleNextPage() { |
| 338 | if (!this.nextArrow || !this.changesPerPage) return; |
| 339 | page.show(this.computeNavLink(1)); |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 340 | } |
| 341 | |
Paladox none | 142add0 | 2021-12-21 21:06:09 +0000 | [diff] [blame] | 342 | // private but used in test |
| 343 | handlePreviousPage() { |
| 344 | if (!this.prevArrow || !this.changesPerPage) return; |
| 345 | page.show(this.computeNavLink(-1)); |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 346 | } |
| 347 | |
Paladox none | 142add0 | 2021-12-21 21:06:09 +0000 | [diff] [blame] | 348 | private changesChanged() { |
| 349 | this.userId = null; |
| 350 | this.repo = null; |
| 351 | const changes = this.changes; |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 352 | if (!changes || !changes.length) { |
| 353 | return; |
Dmitrii Filippov | 3fd2b10 | 2019-11-15 16:16:46 +0100 | [diff] [blame] | 354 | } |
Paladox none | 142add0 | 2021-12-21 21:06:09 +0000 | [diff] [blame] | 355 | if (USER_QUERY_PATTERN.test(this.query)) { |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 356 | const owner = changes[0].owner; |
| 357 | const userId = owner._account_id ? owner._account_id : owner.email; |
| 358 | if (userId) { |
Paladox none | 142add0 | 2021-12-21 21:06:09 +0000 | [diff] [blame] | 359 | this.userId = userId; |
Wyatt Allen | 5c3a3cd | 2017-08-30 13:43:37 -0700 | [diff] [blame] | 360 | return; |
| 361 | } |
Dmitrii Filippov | 3fd2b10 | 2019-11-15 16:16:46 +0100 | [diff] [blame] | 362 | } |
Paladox none | 142add0 | 2021-12-21 21:06:09 +0000 | [diff] [blame] | 363 | if (REPO_QUERY_PATTERN.test(this.query)) { |
| 364 | this.repo = changes[0].project; |
Dmitrii Filippov | 3fd2b10 | 2019-11-15 16:16:46 +0100 | [diff] [blame] | 365 | } |
| 366 | } |
| 367 | |
Paladox none | 142add0 | 2021-12-21 21:06:09 +0000 | [diff] [blame] | 368 | // private but used in test |
| 369 | computePage() { |
| 370 | if (this.offset === undefined || this.changesPerPage === undefined) return; |
| 371 | return this.offset / this.changesPerPage + 1; |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 372 | } |
| 373 | |
Ben Rohlfs | 5a1bd47 | 2022-09-09 13:27:22 +0200 | [diff] [blame] | 374 | private async handleToggleStar(e: CustomEvent<ChangeStarToggleStarDetail>) { |
Dhruv Srivastava | 5841dd8 | 2021-05-17 11:03:19 +0200 | [diff] [blame] | 375 | if (e.detail.starred) { |
| 376 | this.reporting.reportInteraction('change-starred-from-change-list'); |
| 377 | } |
Ben Rohlfs | 5a1bd47 | 2022-09-09 13:27:22 +0200 | [diff] [blame] | 378 | const msg = e.detail.starred |
| 379 | ? 'Starring change...' |
| 380 | : 'Unstarring change...'; |
| 381 | fireAlert(this, msg); |
| 382 | await this.restApiService.saveChangeStarred( |
Ben Rohlfs | 43935a4 | 2020-12-01 19:14:09 +0100 | [diff] [blame] | 383 | e.detail.change._number, |
| 384 | e.detail.starred |
| 385 | ); |
Ben Rohlfs | 5a1bd47 | 2022-09-09 13:27:22 +0200 | [diff] [blame] | 386 | fireEvent(this, 'hide-alert'); |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 387 | } |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 388 | } |
| 389 | |
Dmitrii Filippov | 8814de1 | 2020-10-10 16:31:21 +0200 | [diff] [blame] | 390 | declare global { |
| 391 | interface HTMLElementTagNameMap { |
| 392 | 'gr-change-list-view': GrChangeListView; |
| 393 | } |
| 394 | } |