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'; |
Dmitrii Filippov | 8814de1 | 2020-10-10 16:31:21 +0200 | [diff] [blame] | 10 | import { |
| 11 | AccountDetailInfo, |
| 12 | AccountId, |
Dmitrii Filippov | 8814de1 | 2020-10-10 16:31:21 +0200 | [diff] [blame] | 13 | ChangeInfo, |
| 14 | EmailAddress, |
Dmitrii Filippov | 8814de1 | 2020-10-10 16:31:21 +0200 | [diff] [blame] | 15 | PreferencesInput, |
Paladox none | 5554d95 | 2021-08-11 03:56:51 +0000 | [diff] [blame] | 16 | RepoName, |
Dmitrii Filippov | 8814de1 | 2020-10-10 16:31:21 +0200 | [diff] [blame] | 17 | } from '../../../types/common'; |
Dmitrii Filippov | 8814de1 | 2020-10-10 16:31:21 +0200 | [diff] [blame] | 18 | import {ChangeStarToggleStarDetail} from '../../shared/gr-change-star/gr-change-star'; |
Ben Rohlfs | 5a1bd47 | 2022-09-09 13:27:22 +0200 | [diff] [blame] | 19 | import {fireAlert, fireEvent, fireTitleChange} from '../../../utils/event-util'; |
Chris Poucet | c6e880b | 2021-11-15 19:57:06 +0100 | [diff] [blame] | 20 | import {getAppContext} from '../../../services/app-context'; |
Paladox none | 142add0 | 2021-12-21 21:06:09 +0000 | [diff] [blame] | 21 | import {sharedStyles} from '../../../styles/shared-styles'; |
Ben Rohlfs | 42d29da | 2022-09-19 12:42:40 +0200 | [diff] [blame] | 22 | import {LitElement, PropertyValues, html, css, nothing} from 'lit'; |
| 23 | import {customElement, state, query} from 'lit/decorators.js'; |
Ben Rohlfs | 42d29da | 2022-09-19 12:42:40 +0200 | [diff] [blame] | 24 | import { |
| 25 | createSearchUrl, |
| 26 | searchViewModelToken, |
Ben Rohlfs | 42d29da | 2022-09-19 12:42:40 +0200 | [diff] [blame] | 27 | } from '../../../models/views/search'; |
| 28 | import {resolve} from '../../../models/dependency'; |
| 29 | import {subscribe} from '../../lit/subscription-controller'; |
Logan Hanks | 29693ac | 2017-07-12 10:11:21 -0700 | [diff] [blame] | 30 | |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 31 | const LIMIT_OPERATOR_PATTERN = /\blimit:(\d+)/i; |
| 32 | |
Dmitrii Filippov | 8814de1 | 2020-10-10 16:31:21 +0200 | [diff] [blame] | 33 | @customElement('gr-change-list-view') |
Paladox none | 142add0 | 2021-12-21 21:06:09 +0000 | [diff] [blame] | 34 | export class GrChangeListView extends LitElement { |
Dmitrii Filippov | 3fd2b10 | 2019-11-15 16:16:46 +0100 | [diff] [blame] | 35 | /** |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 36 | * Fired when the title of the page should change. |
| 37 | * |
| 38 | * @event title-change |
Tao Zhou | 9a07681 | 2019-12-17 09:59:28 +0100 | [diff] [blame] | 39 | */ |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 40 | |
Paladox none | 142add0 | 2021-12-21 21:06:09 +0000 | [diff] [blame] | 41 | @query('#prevArrow') protected prevArrow?: HTMLAnchorElement; |
Andrew Bonventre | 78792e8 | 2016-03-04 17:48:22 -0500 | [diff] [blame] | 42 | |
Paladox none | 142add0 | 2021-12-21 21:06:09 +0000 | [diff] [blame] | 43 | @query('#nextArrow') protected nextArrow?: HTMLAnchorElement; |
| 44 | |
Ben Rohlfs | 42d29da | 2022-09-19 12:42:40 +0200 | [diff] [blame] | 45 | // private but used in test |
| 46 | @state() account?: AccountDetailInfo; |
| 47 | |
| 48 | // private but used in test |
| 49 | @state() loggedIn = false; |
| 50 | |
| 51 | // private but used in test |
| 52 | @state() preferences?: PreferencesInput; |
Andrew Bonventre | 78792e8 | 2016-03-04 17:48:22 -0500 | [diff] [blame] | 53 | |
Paladox none | 142add0 | 2021-12-21 21:06:09 +0000 | [diff] [blame] | 54 | // private but used in test |
| 55 | @state() changesPerPage?: number; |
Kasper Nilsson | 8e6a64d | 2018-04-04 15:33:19 -0700 | [diff] [blame] | 56 | |
Paladox none | 142add0 | 2021-12-21 21:06:09 +0000 | [diff] [blame] | 57 | // private but used in test |
| 58 | @state() query = ''; |
Urs Wolfer | 54a5a46 | 2016-03-09 21:04:22 +0100 | [diff] [blame] | 59 | |
Paladox none | 142add0 | 2021-12-21 21:06:09 +0000 | [diff] [blame] | 60 | // private but used in test |
Ben Rohlfs | 7aeecaa | 2022-10-11 15:26:45 +0000 | [diff] [blame^] | 61 | @state() offset = 0; |
Andrew Bonventre | 78792e8 | 2016-03-04 17:48:22 -0500 | [diff] [blame] | 62 | |
Paladox none | 142add0 | 2021-12-21 21:06:09 +0000 | [diff] [blame] | 63 | // private but used in test |
Ben Rohlfs | 7aeecaa | 2022-10-11 15:26:45 +0000 | [diff] [blame^] | 64 | @state() changes: ChangeInfo[] = []; |
Andrew Bonventre | 78792e8 | 2016-03-04 17:48:22 -0500 | [diff] [blame] | 65 | |
Paladox none | 142add0 | 2021-12-21 21:06:09 +0000 | [diff] [blame] | 66 | // private but used in test |
| 67 | @state() loading = true; |
Andrew Bonventre | 78792e8 | 2016-03-04 17:48:22 -0500 | [diff] [blame] | 68 | |
Paladox none | 142add0 | 2021-12-21 21:06:09 +0000 | [diff] [blame] | 69 | // private but used in test |
Ben Rohlfs | 7aeecaa | 2022-10-11 15:26:45 +0000 | [diff] [blame^] | 70 | @state() userId?: AccountId | EmailAddress; |
Wyatt Allen | 5c3a3cd | 2017-08-30 13:43:37 -0700 | [diff] [blame] | 71 | |
Paladox none | 142add0 | 2021-12-21 21:06:09 +0000 | [diff] [blame] | 72 | // private but used in test |
Ben Rohlfs | 7aeecaa | 2022-10-11 15:26:45 +0000 | [diff] [blame^] | 73 | @state() repo?: RepoName; |
Dhruv | 7c72da5 | 2022-06-09 11:43:15 +0200 | [diff] [blame] | 74 | |
Chris Poucet | c6e880b | 2021-11-15 19:57:06 +0100 | [diff] [blame] | 75 | private readonly restApiService = getAppContext().restApiService; |
Ben Rohlfs | 43935a4 | 2020-12-01 19:14:09 +0100 | [diff] [blame] | 76 | |
Chris Poucet | c6e880b | 2021-11-15 19:57:06 +0100 | [diff] [blame] | 77 | private reporting = getAppContext().reportingService; |
Dhruv Srivastava | 5841dd8 | 2021-05-17 11:03:19 +0200 | [diff] [blame] | 78 | |
Ben Rohlfs | 42d29da | 2022-09-19 12:42:40 +0200 | [diff] [blame] | 79 | private userModel = getAppContext().userModel; |
| 80 | |
| 81 | private readonly getViewModel = resolve(this, searchViewModelToken); |
| 82 | |
Ben Rohlfs | f7f1e8e | 2021-03-12 14:36:40 +0100 | [diff] [blame] | 83 | constructor() { |
| 84 | super(); |
Paladox none | 142add0 | 2021-12-21 21:06:09 +0000 | [diff] [blame] | 85 | this.addEventListener('next-page', () => this.handleNextPage()); |
| 86 | this.addEventListener('previous-page', () => this.handlePreviousPage()); |
Ben Rohlfs | 7aeecaa | 2022-10-11 15:26:45 +0000 | [diff] [blame^] | 87 | |
Ben Rohlfs | 42d29da | 2022-09-19 12:42:40 +0200 | [diff] [blame] | 88 | subscribe( |
| 89 | this, |
Ben Rohlfs | 7aeecaa | 2022-10-11 15:26:45 +0000 | [diff] [blame^] | 90 | () => this.getViewModel().query$, |
| 91 | x => (this.query = x) |
| 92 | ); |
| 93 | subscribe( |
| 94 | this, |
| 95 | () => this.getViewModel().offsetNumber$, |
| 96 | x => (this.offset = x) |
| 97 | ); |
| 98 | subscribe( |
| 99 | this, |
| 100 | () => this.getViewModel().loading$, |
| 101 | x => (this.loading = x) |
| 102 | ); |
| 103 | subscribe( |
| 104 | this, |
| 105 | () => this.getViewModel().changes$, |
| 106 | x => (this.changes = x) |
| 107 | ); |
| 108 | subscribe( |
| 109 | this, |
| 110 | () => this.getViewModel().userId$, |
| 111 | x => (this.userId = x) |
| 112 | ); |
| 113 | subscribe( |
| 114 | this, |
| 115 | () => this.getViewModel().repo$, |
| 116 | x => (this.repo = x) |
Ben Rohlfs | 42d29da | 2022-09-19 12:42:40 +0200 | [diff] [blame] | 117 | ); |
| 118 | subscribe( |
| 119 | this, |
| 120 | () => this.userModel.account$, |
| 121 | x => (this.account = x) |
| 122 | ); |
| 123 | subscribe( |
| 124 | this, |
| 125 | () => this.userModel.loggedIn$, |
| 126 | x => (this.loggedIn = x) |
| 127 | ); |
| 128 | subscribe( |
| 129 | this, |
Ben Rohlfs | 7aeecaa | 2022-10-11 15:26:45 +0000 | [diff] [blame^] | 130 | () => this.userModel.preferenceChangesPerPage$, |
| 131 | x => (this.changesPerPage = x) |
Ben Rohlfs | c8a096d | 2022-09-23 10:41:45 +0200 | [diff] [blame] | 132 | ); |
Ben Rohlfs | 7aeecaa | 2022-10-11 15:26:45 +0000 | [diff] [blame^] | 133 | subscribe( |
| 134 | this, |
| 135 | () => this.userModel.preferences$, |
| 136 | x => (this.preferences = x) |
| 137 | ); |
Ben Rohlfs | 27e9569 | 2022-09-28 12:57:47 +0000 | [diff] [blame] | 138 | } |
| 139 | |
Paladox none | 142add0 | 2021-12-21 21:06:09 +0000 | [diff] [blame] | 140 | static override get styles() { |
| 141 | return [ |
| 142 | sharedStyles, |
| 143 | css` |
| 144 | :host { |
| 145 | display: block; |
| 146 | } |
| 147 | .loading { |
| 148 | color: var(--deemphasized-text-color); |
| 149 | padding: var(--spacing-l); |
| 150 | } |
| 151 | gr-change-list { |
| 152 | width: 100%; |
| 153 | } |
| 154 | gr-user-header, |
| 155 | gr-repo-header { |
| 156 | border-bottom: 1px solid var(--border-color); |
| 157 | } |
| 158 | nav { |
| 159 | align-items: center; |
| 160 | display: flex; |
| 161 | height: 3rem; |
| 162 | justify-content: flex-end; |
| 163 | margin-right: 20px; |
Paladox none | 142add0 | 2021-12-21 21:06:09 +0000 | [diff] [blame] | 164 | color: var(--deemphasized-text-color); |
| 165 | } |
Chris Poucet | b7e9bb1 | 2022-07-22 14:11:03 +0200 | [diff] [blame] | 166 | gr-icon { |
Chris Poucet | cf51254 | 2022-07-12 09:03:42 +0200 | [diff] [blame] | 167 | font-size: 1.85rem; |
Paladox none | 142add0 | 2021-12-21 21:06:09 +0000 | [diff] [blame] | 168 | margin-left: 16px; |
Paladox none | 142add0 | 2021-12-21 21:06:09 +0000 | [diff] [blame] | 169 | } |
| 170 | .hide { |
| 171 | display: none; |
| 172 | } |
| 173 | @media only screen and (max-width: 50em) { |
| 174 | .loading, |
| 175 | .error { |
| 176 | padding: 0 var(--spacing-l); |
| 177 | } |
| 178 | } |
| 179 | `, |
| 180 | ]; |
| 181 | } |
| 182 | |
| 183 | override render() { |
Dhruv Srivastava | 45166a1 | 2022-03-02 15:30:35 +0100 | [diff] [blame] | 184 | // In case of an internal reload we want the ChangeList section components |
| 185 | // to remain in the DOM so that the Bulk Actions Model associated with them |
| 186 | // is not recreated after the reload resulting in user selections being lost |
Paladox none | 142add0 | 2021-12-21 21:06:09 +0000 | [diff] [blame] | 187 | return html` |
Dhruv Srivastava | 45166a1 | 2022-03-02 15:30:35 +0100 | [diff] [blame] | 188 | <div class="loading" ?hidden=${!this.loading}>Loading...</div> |
| 189 | <div ?hidden=${this.loading}> |
Ben Rohlfs | 42d29da | 2022-09-19 12:42:40 +0200 | [diff] [blame] | 190 | ${this.renderRepoHeader()} ${this.renderUserHeader()} |
Paladox none | 142add0 | 2021-12-21 21:06:09 +0000 | [diff] [blame] | 191 | <gr-change-list |
| 192 | .account=${this.account} |
| 193 | .changes=${this.changes} |
| 194 | .preferences=${this.preferences} |
Ben Rohlfs | 42d29da | 2022-09-19 12:42:40 +0200 | [diff] [blame] | 195 | .showStar=${this.loggedIn} |
Paladox none | 142add0 | 2021-12-21 21:06:09 +0000 | [diff] [blame] | 196 | @toggle-star=${(e: CustomEvent<ChangeStarToggleStarDetail>) => { |
| 197 | this.handleToggleStar(e); |
| 198 | }} |
Chris Poucet | 12100f1 | 2022-07-06 15:11:27 +0200 | [diff] [blame] | 199 | .usp=${'search'} |
Paladox none | 142add0 | 2021-12-21 21:06:09 +0000 | [diff] [blame] | 200 | ></gr-change-list> |
| 201 | ${this.renderChangeListViewNav()} |
| 202 | </div> |
| 203 | `; |
| 204 | } |
| 205 | |
| 206 | private renderRepoHeader() { |
Ben Rohlfs | 42d29da | 2022-09-19 12:42:40 +0200 | [diff] [blame] | 207 | if (!this.repo) return nothing; |
Paladox none | 142add0 | 2021-12-21 21:06:09 +0000 | [diff] [blame] | 208 | |
| 209 | return html` <gr-repo-header .repo=${this.repo}></gr-repo-header> `; |
| 210 | } |
| 211 | |
Ben Rohlfs | 42d29da | 2022-09-19 12:42:40 +0200 | [diff] [blame] | 212 | private renderUserHeader() { |
| 213 | if (!this.userId) return nothing; |
Paladox none | 142add0 | 2021-12-21 21:06:09 +0000 | [diff] [blame] | 214 | |
| 215 | return html` |
| 216 | <gr-user-header |
| 217 | .userId=${this.userId} |
| 218 | showDashboardLink |
Ben Rohlfs | 42d29da | 2022-09-19 12:42:40 +0200 | [diff] [blame] | 219 | .loggedIn=${this.loggedIn} |
Paladox none | 142add0 | 2021-12-21 21:06:09 +0000 | [diff] [blame] | 220 | ></gr-user-header> |
| 221 | `; |
| 222 | } |
| 223 | |
| 224 | private renderChangeListViewNav() { |
Ben Rohlfs | 42d29da | 2022-09-19 12:42:40 +0200 | [diff] [blame] | 225 | if (this.loading || !this.changes || !this.changes.length) return nothing; |
Paladox none | 142add0 | 2021-12-21 21:06:09 +0000 | [diff] [blame] | 226 | |
| 227 | return html` |
| 228 | <nav> |
| 229 | Page ${this.computePage()} ${this.renderPrevArrow()} |
| 230 | ${this.renderNextArrow()} |
| 231 | </nav> |
| 232 | `; |
| 233 | } |
| 234 | |
| 235 | private renderPrevArrow() { |
Ben Rohlfs | 42d29da | 2022-09-19 12:42:40 +0200 | [diff] [blame] | 236 | if (this.offset === 0) return nothing; |
Paladox none | 142add0 | 2021-12-21 21:06:09 +0000 | [diff] [blame] | 237 | |
| 238 | return html` |
Ben Rohlfs | 8003bd3 | 2022-04-05 18:24:42 +0200 | [diff] [blame] | 239 | <a id="prevArrow" href=${this.computeNavLink(-1)}> |
Chris Poucet | b7e9bb1 | 2022-07-22 14:11:03 +0200 | [diff] [blame] | 240 | <gr-icon icon="chevron_left" aria-label="Older"></gr-icon> |
Paladox none | 142add0 | 2021-12-21 21:06:09 +0000 | [diff] [blame] | 241 | </a> |
| 242 | `; |
| 243 | } |
| 244 | |
| 245 | private renderNextArrow() { |
Ben Rohlfs | 42d29da | 2022-09-19 12:42:40 +0200 | [diff] [blame] | 246 | const changesCount = this.changes?.length ?? 0; |
| 247 | if (changesCount === 0) return nothing; |
| 248 | if (!this.changes?.[changesCount - 1]._more_changes) return nothing; |
Paladox none | 142add0 | 2021-12-21 21:06:09 +0000 | [diff] [blame] | 249 | |
| 250 | return html` |
Ben Rohlfs | 8003bd3 | 2022-04-05 18:24:42 +0200 | [diff] [blame] | 251 | <a id="nextArrow" href=${this.computeNavLink(1)}> |
Chris Poucet | b7e9bb1 | 2022-07-22 14:11:03 +0200 | [diff] [blame] | 252 | <gr-icon icon="chevron_right" aria-label="Newer"></gr-icon> |
Paladox none | 142add0 | 2021-12-21 21:06:09 +0000 | [diff] [blame] | 253 | </a> |
| 254 | `; |
| 255 | } |
| 256 | |
Ben Rohlfs | 7aeecaa | 2022-10-11 15:26:45 +0000 | [diff] [blame^] | 257 | override updated(changedProperties: PropertyValues) { |
| 258 | if (changedProperties.has('query')) { |
| 259 | fireTitleChange(this, this.query); |
Paladox none | 142add0 | 2021-12-21 21:06:09 +0000 | [diff] [blame] | 260 | } |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 261 | } |
| 262 | |
Paladox none | 142add0 | 2021-12-21 21:06:09 +0000 | [diff] [blame] | 263 | // private but used in test |
| 264 | limitFor(query: string, defaultLimit?: number) { |
| 265 | if (defaultLimit === undefined) return 0; |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 266 | const match = query.match(LIMIT_OPERATOR_PATTERN); |
| 267 | if (!match) { |
| 268 | return defaultLimit; |
Dmitrii Filippov | 3fd2b10 | 2019-11-15 16:16:46 +0100 | [diff] [blame] | 269 | } |
Dhruv Srivastava | b8edee9 | 2020-10-19 10:20:07 +0200 | [diff] [blame] | 270 | return Number(match[1]); |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 271 | } |
Kasper Nilsson | 9724092 | 2018-02-08 14:57:27 -0800 | [diff] [blame] | 272 | |
Paladox none | 142add0 | 2021-12-21 21:06:09 +0000 | [diff] [blame] | 273 | // private but used in test |
| 274 | computeNavLink(direction: number) { |
| 275 | const offset = this.offset ?? 0; |
| 276 | const limit = this.limitFor(this.query, this.changesPerPage); |
Dmitrii Filippov | 8814de1 | 2020-10-10 16:31:21 +0200 | [diff] [blame] | 277 | const newOffset = Math.max(0, offset + limit * direction); |
Ben Rohlfs | 39aa057 | 2022-09-14 22:57:17 +0200 | [diff] [blame] | 278 | return createSearchUrl({query: this.query, offset: newOffset}); |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 279 | } |
| 280 | |
Paladox none | 142add0 | 2021-12-21 21:06:09 +0000 | [diff] [blame] | 281 | // private but used in test |
| 282 | handleNextPage() { |
| 283 | if (!this.nextArrow || !this.changesPerPage) return; |
| 284 | page.show(this.computeNavLink(1)); |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 285 | } |
| 286 | |
Paladox none | 142add0 | 2021-12-21 21:06:09 +0000 | [diff] [blame] | 287 | // private but used in test |
| 288 | handlePreviousPage() { |
| 289 | if (!this.prevArrow || !this.changesPerPage) return; |
| 290 | page.show(this.computeNavLink(-1)); |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 291 | } |
| 292 | |
Paladox none | 142add0 | 2021-12-21 21:06:09 +0000 | [diff] [blame] | 293 | // private but used in test |
| 294 | computePage() { |
| 295 | if (this.offset === undefined || this.changesPerPage === undefined) return; |
| 296 | return this.offset / this.changesPerPage + 1; |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 297 | } |
| 298 | |
Ben Rohlfs | 5a1bd47 | 2022-09-09 13:27:22 +0200 | [diff] [blame] | 299 | private async handleToggleStar(e: CustomEvent<ChangeStarToggleStarDetail>) { |
Dhruv Srivastava | 5841dd8 | 2021-05-17 11:03:19 +0200 | [diff] [blame] | 300 | if (e.detail.starred) { |
| 301 | this.reporting.reportInteraction('change-starred-from-change-list'); |
| 302 | } |
Ben Rohlfs | 5a1bd47 | 2022-09-09 13:27:22 +0200 | [diff] [blame] | 303 | const msg = e.detail.starred |
| 304 | ? 'Starring change...' |
| 305 | : 'Unstarring change...'; |
| 306 | fireAlert(this, msg); |
| 307 | await this.restApiService.saveChangeStarred( |
Ben Rohlfs | 43935a4 | 2020-12-01 19:14:09 +0100 | [diff] [blame] | 308 | e.detail.change._number, |
| 309 | e.detail.starred |
| 310 | ); |
Ben Rohlfs | 5a1bd47 | 2022-09-09 13:27:22 +0200 | [diff] [blame] | 311 | fireEvent(this, 'hide-alert'); |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 312 | } |
Dmitrii Filippov | daf0ec9 | 2020-03-17 11:27:28 +0100 | [diff] [blame] | 313 | } |
| 314 | |
Dmitrii Filippov | 8814de1 | 2020-10-10 16:31:21 +0200 | [diff] [blame] | 315 | declare global { |
| 316 | interface HTMLElementTagNameMap { |
| 317 | 'gr-change-list-view': GrChangeListView; |
| 318 | } |
| 319 | } |