blob: fd30c6a98a8c1979e6add96a7e9901ae5759e355 [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 */
Chris Poucet55cbccb2021-11-16 03:17:06 +010017import {Subscription} from 'rxjs';
Ben Rohlfs96caad92020-08-14 21:32:38 +020018import '@polymer/iron-icon/iron-icon';
Milutin Kristofic88b04082020-08-20 17:00:30 +020019import '@polymer/iron-a11y-announcer/iron-a11y-announcer';
Ben Rohlfs96caad92020-08-14 21:32:38 +020020import '../../../styles/shared-styles';
21import '../../shared/gr-button/gr-button';
Ben Rohlfs96caad92020-08-14 21:32:38 +020022import {DiffViewMode} from '../../../constants/constants';
Ben Rohlfs96caad92020-08-14 21:32:38 +020023import {PolymerElement} from '@polymer/polymer/polymer-element';
24import {htmlTemplate} from './gr-diff-mode-selector_html';
25import {customElement, property} from '@polymer/decorators';
Milutin Kristofic88b04082020-08-20 17:00:30 +020026import {IronA11yAnnouncer} from '@polymer/iron-a11y-announcer/iron-a11y-announcer';
Milutin Kristoficbe0b5162020-09-01 11:22:29 +020027import {FixIronA11yAnnouncer} from '../../../types/types';
Chris Poucetc6e880b2021-11-15 19:57:06 +010028import {getAppContext} from '../../../services/app-context';
Ben Rohlfs62278c82021-03-12 11:35:56 +010029import {fireIronAnnounce} from '../../../utils/event-util';
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +010030
Ben Rohlfs96caad92020-08-14 21:32:38 +020031@customElement('gr-diff-mode-selector')
Ben Rohlfs27c856da2021-03-12 14:09:10 +010032export class GrDiffModeSelector extends PolymerElement {
Ben Rohlfs96caad92020-08-14 21:32:38 +020033 static get template() {
34 return htmlTemplate;
Dmitrii Filippov3fd2b102019-11-15 16:16:46 +010035 }
36
Ben Rohlfs96caad92020-08-14 21:32:38 +020037 @property({type: String, notify: true})
Dhruv Srivastava80d34f42021-10-18 16:45:02 +020038 mode: DiffViewMode = DiffViewMode.SIDE_BY_SIDE;
Ben Rohlfs96caad92020-08-14 21:32:38 +020039
40 /**
41 * If set to true, the user's preference will be updated every time a
42 * button is tapped. Don't set to true if there is no user.
43 */
44 @property({type: Boolean})
45 saveOnChange = false;
46
Milutin Kristofic3828cc32021-07-28 14:49:48 +020047 @property({type: Boolean})
48 showTooltipBelow = false;
49
Chris Poucetb24bd7f2021-11-22 21:07:20 +010050 // Private but accessed by tests.
51 readonly browserModel = getAppContext().browserModel;
52
Chris Poucetefcdb202021-11-22 23:54:26 +010053 private readonly userModel = getAppContext().userModel;
Ben Rohlfs43935a42020-12-01 19:14:09 +010054
Chris Poucet55cbccb2021-11-16 03:17:06 +010055 private subscriptions: Subscription[] = [];
Dhruv Srivastava80d34f42021-10-18 16:45:02 +020056
57 constructor() {
58 super();
59 }
60
Chris Poucet59dad572021-08-20 15:25:36 +000061 override connectedCallback() {
Ben Rohlfs5f520da2021-03-10 14:58:43 +010062 super.connectedCallback();
Chris Poucetcaeea1b2021-08-19 22:12:56 +000063 (
64 IronA11yAnnouncer as unknown as FixIronA11yAnnouncer
65 ).requestAvailability();
Chris Poucet55cbccb2021-11-16 03:17:06 +010066 this.subscriptions.push(
Chris Poucetb24bd7f2021-11-22 21:07:20 +010067 this.browserModel.diffViewMode$.subscribe(
68 diffView => (this.mode = diffView)
69 )
Chris Poucet55cbccb2021-11-16 03:17:06 +010070 );
Dhruv Srivastava80d34f42021-10-18 16:45:02 +020071 }
72
73 override disconnectedCallback() {
Chris Poucet55cbccb2021-11-16 03:17:06 +010074 for (const s of this.subscriptions) {
75 s.unsubscribe();
76 }
77 this.subscriptions = [];
78 super.disconnectedCallback();
Milutin Kristofic88b04082020-08-20 17:00:30 +020079 }
80
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +010081 /**
82 * Set the mode. If save on change is enabled also update the preference.
83 */
Ben Rohlfs96caad92020-08-14 21:32:38 +020084 setMode(newMode: DiffViewMode) {
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +010085 if (this.saveOnChange && this.mode && this.mode !== newMode) {
Chris Poucetefcdb202021-11-22 23:54:26 +010086 this.userModel.updatePreferences({diff_view: newMode});
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +010087 }
88 this.mode = newMode;
David Ostrovskyf91f9662021-02-22 19:34:37 +010089 let announcement;
Milutin Kristofic88b04082020-08-20 17:00:30 +020090 if (this.isUnifiedSelected(newMode)) {
David Ostrovskyf91f9662021-02-22 19:34:37 +010091 announcement = 'Changed diff view to unified';
Milutin Kristofic88b04082020-08-20 17:00:30 +020092 } else if (this.isSideBySideSelected(newMode)) {
David Ostrovskyf91f9662021-02-22 19:34:37 +010093 announcement = 'Changed diff view to side by side';
Milutin Kristofic88b04082020-08-20 17:00:30 +020094 }
David Ostrovskyf91f9662021-02-22 19:34:37 +010095 if (announcement) {
Ben Rohlfs62278c82021-03-12 11:35:56 +010096 fireIronAnnounce(this, announcement);
Milutin Kristofic88b04082020-08-20 17:00:30 +020097 }
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +010098 }
99
Paladox none178838d2021-08-17 02:52:53 +0000100 _computeSideBySideSelected(mode?: DiffViewMode) {
Ben Rohlfs96caad92020-08-14 21:32:38 +0200101 return mode === DiffViewMode.SIDE_BY_SIDE ? 'selected' : '';
102 }
103
Paladox none178838d2021-08-17 02:52:53 +0000104 _computeUnifiedSelected(mode?: DiffViewMode) {
Ben Rohlfs96caad92020-08-14 21:32:38 +0200105 return mode === DiffViewMode.UNIFIED ? 'selected' : '';
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100106 }
107
Paladox none178838d2021-08-17 02:52:53 +0000108 isSideBySideSelected(mode?: DiffViewMode) {
Milutin Kristofic88b04082020-08-20 17:00:30 +0200109 return mode === DiffViewMode.SIDE_BY_SIDE;
110 }
111
Paladox none178838d2021-08-17 02:52:53 +0000112 isUnifiedSelected(mode?: DiffViewMode) {
Milutin Kristofic88b04082020-08-20 17:00:30 +0200113 return mode === DiffViewMode.UNIFIED;
114 }
115
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100116 _handleSideBySideTap() {
Ben Rohlfs96caad92020-08-14 21:32:38 +0200117 this.setMode(DiffViewMode.SIDE_BY_SIDE);
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100118 }
119
120 _handleUnifiedTap() {
Ben Rohlfs96caad92020-08-14 21:32:38 +0200121 this.setMode(DiffViewMode.UNIFIED);
Dmitrii Filippovdaf0ec92020-03-17 11:27:28 +0100122 }
123}
124
Ben Rohlfs96caad92020-08-14 21:32:38 +0200125declare global {
126 interface HTMLElementTagNameMap {
127 'gr-diff-mode-selector': GrDiffModeSelector;
128 }
129}