blob: 4eb33c762050f9b613320b1998124823d64f95ec [file] [log] [blame]
Dave Borowitz8cdc76b2018-03-26 10:04:27 -04001/**
2 * @license
3 * Copyright (C) 2018 The Android Open Source Project
4 *
5 * Licensed under the Apache License, Version 2.0 (the "License");
6 * you may not use this file except in compliance with the License.
7 * You may obtain a copy of the License at
8 *
9 * http://www.apache.org/licenses/LICENSE-2.0
10 *
11 * Unless required by applicable law or agreed to in writing, software
12 * distributed under the License is distributed on an "AS IS" BASIS,
13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 * See the License for the specific language governing permissions and
15 * limitations under the License.
16 */
Ben Rohlfs96caad92020-08-14 21:32:38 +020017import '@polymer/iron-icon/iron-icon';
Milutin Kristofic88b04082020-08-20 17:00:30 +020018import '@polymer/iron-a11y-announcer/iron-a11y-announcer';
Ben Rohlfs96caad92020-08-14 21:32:38 +020019import '../../../styles/shared-styles';
20import '../../shared/gr-button/gr-button';
Ben Rohlfs96caad92020-08-14 21:32:38 +020021import {DiffViewMode} from '../../../constants/constants';
Ben Rohlfs96caad92020-08-14 21:32:38 +020022import {PolymerElement} from '@polymer/polymer/polymer-element';
23import {htmlTemplate} from './gr-diff-mode-selector_html';
24import {customElement, property} from '@polymer/decorators';
Milutin Kristofic88b04082020-08-20 17:00:30 +020025import {IronA11yAnnouncer} from '@polymer/iron-a11y-announcer/iron-a11y-announcer';
Milutin Kristoficbe0b5162020-09-01 11:22:29 +020026import {FixIronA11yAnnouncer} from '../../../types/types';
Ben Rohlfs43935a42020-12-01 19:14:09 +010027import {appContext} from '../../../services/app-context';
Ben Rohlfs62278c82021-03-12 11:35:56 +010028import {fireIronAnnounce} from '../../../utils/event-util';
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +010029
Ben Rohlfs96caad92020-08-14 21:32:38 +020030@customElement('gr-diff-mode-selector')
Ben Rohlfs27c856da2021-03-12 14:09:10 +010031export class GrDiffModeSelector extends PolymerElement {
Ben Rohlfs96caad92020-08-14 21:32:38 +020032 static get template() {
33 return htmlTemplate;
Dmitrii Filippov3fd2b102019-11-15 16:16:46 +010034 }
35
Ben Rohlfs96caad92020-08-14 21:32:38 +020036 @property({type: String, notify: true})
37 mode?: DiffViewMode;
38
39 /**
40 * If set to true, the user's preference will be updated every time a
41 * button is tapped. Don't set to true if there is no user.
42 */
43 @property({type: Boolean})
44 saveOnChange = false;
45
Milutin Kristofic3828cc32021-07-28 14:49:48 +020046 @property({type: Boolean})
47 showTooltipBelow = false;
48
Ben Rohlfs43935a42020-12-01 19:14:09 +010049 private readonly restApiService = appContext.restApiService;
50
Ben Rohlfs5f520da2021-03-10 14:58:43 +010051 /** @override */
52 connectedCallback() {
53 super.connectedCallback();
Chris Poucetcaeea1b2021-08-19 22:12:56 +000054 (
55 IronA11yAnnouncer as unknown as FixIronA11yAnnouncer
56 ).requestAvailability();
Milutin Kristofic88b04082020-08-20 17:00:30 +020057 }
58
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +010059 /**
60 * Set the mode. If save on change is enabled also update the preference.
61 */
Ben Rohlfs96caad92020-08-14 21:32:38 +020062 setMode(newMode: DiffViewMode) {
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +010063 if (this.saveOnChange && this.mode && this.mode !== newMode) {
Ben Rohlfs43935a42020-12-01 19:14:09 +010064 this.restApiService.savePreferences({diff_view: newMode});
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +010065 }
66 this.mode = newMode;
David Ostrovskyf91f9662021-02-22 19:34:37 +010067 let announcement;
Milutin Kristofic88b04082020-08-20 17:00:30 +020068 if (this.isUnifiedSelected(newMode)) {
David Ostrovskyf91f9662021-02-22 19:34:37 +010069 announcement = 'Changed diff view to unified';
Milutin Kristofic88b04082020-08-20 17:00:30 +020070 } else if (this.isSideBySideSelected(newMode)) {
David Ostrovskyf91f9662021-02-22 19:34:37 +010071 announcement = 'Changed diff view to side by side';
Milutin Kristofic88b04082020-08-20 17:00:30 +020072 }
David Ostrovskyf91f9662021-02-22 19:34:37 +010073 if (announcement) {
Ben Rohlfs62278c82021-03-12 11:35:56 +010074 fireIronAnnounce(this, announcement);
Milutin Kristofic88b04082020-08-20 17:00:30 +020075 }
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +010076 }
77
Paladox none178838d2021-08-17 02:52:53 +000078 _computeSideBySideSelected(mode?: DiffViewMode) {
Ben Rohlfs96caad92020-08-14 21:32:38 +020079 return mode === DiffViewMode.SIDE_BY_SIDE ? 'selected' : '';
80 }
81
Paladox none178838d2021-08-17 02:52:53 +000082 _computeUnifiedSelected(mode?: DiffViewMode) {
Ben Rohlfs96caad92020-08-14 21:32:38 +020083 return mode === DiffViewMode.UNIFIED ? 'selected' : '';
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +010084 }
85
Paladox none178838d2021-08-17 02:52:53 +000086 isSideBySideSelected(mode?: DiffViewMode) {
Milutin Kristofic88b04082020-08-20 17:00:30 +020087 return mode === DiffViewMode.SIDE_BY_SIDE;
88 }
89
Paladox none178838d2021-08-17 02:52:53 +000090 isUnifiedSelected(mode?: DiffViewMode) {
Milutin Kristofic88b04082020-08-20 17:00:30 +020091 return mode === DiffViewMode.UNIFIED;
92 }
93
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +010094 _handleSideBySideTap() {
Ben Rohlfs96caad92020-08-14 21:32:38 +020095 this.setMode(DiffViewMode.SIDE_BY_SIDE);
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +010096 }
97
98 _handleUnifiedTap() {
Ben Rohlfs96caad92020-08-14 21:32:38 +020099 this.setMode(DiffViewMode.UNIFIED);
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100100 }
101}
102
Ben Rohlfs96caad92020-08-14 21:32:38 +0200103declare global {
104 interface HTMLElementTagNameMap {
105 'gr-diff-mode-selector': GrDiffModeSelector;
106 }
107}