blob: cf5a890950ac8390da04a73e31e93b3ddf1bbf24 [file] [log] [blame]
// Copyright 2022 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
/**
* @fileoverview 'settings-translate-page' is the settings page
* translate settings.
*/
import 'chrome://resources/cr_elements/cr_button/cr_button.m.js';
import 'chrome://resources/cr_elements/cr_icon_button/cr_icon_button.js';
import 'chrome://resources/cr_elements/icons.m.js';
import 'chrome://resources/cr_elements/shared_style_css.m.js';
import 'chrome://resources/polymer/v3_0/iron-flex-layout/iron-flex-layout-classes.js';
import './add_languages_dialog.js';
import './languages.js';
import '../controls/settings_toggle_button.js';
import '../icons.html.js';
import '../settings_shared.css.js';
import {assert} from 'chrome://resources/js/assert_ts.js';
import {focusWithoutInk} from 'chrome://resources/js/cr/ui/focus_without_ink.m.js';
import {DomRepeatEvent, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
import {SettingsToggleButtonElement} from '../controls/settings_toggle_button.js';
import {PrefsMixin} from '../prefs/prefs_mixin.js';
import {LanguageSettingsActionType, LanguageSettingsMetricsProxy, LanguageSettingsMetricsProxyImpl} from './languages_settings_metrics_proxy.js';
import {LanguageHelper, LanguagesModel} from './languages_types.js';
import {getTemplate} from './translate_page.html.js';
const SettingsTranslatePageElementBase = PrefsMixin(PolymerElement);
export class SettingsTranslatePageElement extends
SettingsTranslatePageElementBase {
static get is() {
return 'settings-translate-page';
}
static get template() {
return getTemplate();
}
static get properties() {
return {
/**
* Preferences state.
*/
prefs: {
type: Object,
notify: true,
},
/**
* Read-only reference to the languages model provided by the
* 'settings-languages' instance.
*/
languages: {
type: Object,
notify: true,
},
languageHelper: Object,
showAddAlwaysTranslateDialog_: Boolean,
showAddNeverTranslateDialog_: Boolean,
addLanguagesDialogLanguages_: Array,
};
}
languages?: LanguagesModel;
languageHelper: LanguageHelper;
private showAddAlwaysTranslateDialog_: boolean;
private showAddNeverTranslateDialog_: boolean;
private addLanguagesDialogLanguages_:
chrome.languageSettingsPrivate.Language[]|null;
private languageSettingsMetricsProxy_: LanguageSettingsMetricsProxy =
LanguageSettingsMetricsProxyImpl.getInstance();
/**
* Stamps and opens the Add Languages dialog, registering a listener to
* disable the dialog's dom-if again on close.
*/
private onAddAlwaysTranslateLanguagesClick_(e: Event) {
e.preventDefault();
const translatableLanguages = this.getTranslatableLanguages_();
this.addLanguagesDialogLanguages_ = translatableLanguages.filter(
language => !this.languages!.alwaysTranslate.includes(language));
this.showAddAlwaysTranslateDialog_ = true;
}
private onAlwaysTranslateDialogClose_() {
this.showAddAlwaysTranslateDialog_ = false;
this.addLanguagesDialogLanguages_ = null;
const toFocus = this.shadowRoot!.querySelector('#addAlwaysTranslate');
assert(toFocus);
focusWithoutInk(toFocus);
}
/**
* Helper function fired by the add dialog's on-languages-added event. Adds
* selected languages to the always-translate languages list.
*/
private onAlwaysTranslateLanguagesAdded_(e: CustomEvent<string[]>) {
const languagesToAdd = e.detail;
languagesToAdd.forEach(languageCode => {
this.languageHelper.setLanguageAlwaysTranslateState(languageCode, true);
});
}
/**
* Removes a language from the always translate languages list.
*/
private onRemoveAlwaysTranslateLanguageClick_(
e: DomRepeatEvent<chrome.languageSettingsPrivate.Language>) {
const languageCode = e.model.item.code;
this.languageHelper.setLanguageAlwaysTranslateState(languageCode, false);
}
/**
* Stamps and opens the Add Languages dialog, registering a listener to
* disable the dialog's dom-if again on close.
*/
private onAddNeverTranslateLanguagesClick_(e: Event) {
e.preventDefault();
this.addLanguagesDialogLanguages_ = this.languages!.supported.filter(
language => !this.languages!.neverTranslate.includes(language));
this.showAddNeverTranslateDialog_ = true;
}
private onNeverTranslateDialogClose_() {
this.showAddNeverTranslateDialog_ = false;
this.addLanguagesDialogLanguages_ = null;
const toFocus = this.shadowRoot!.querySelector('#addNeverTranslate');
assert(toFocus);
focusWithoutInk(toFocus);
}
private onNeverTranslateLanguagesAdded_(e: CustomEvent<string[]>) {
const languagesToAdd = e.detail;
languagesToAdd.forEach(languageCode => {
this.languageHelper.disableTranslateLanguage(languageCode);
});
}
/**
* Removes a language from the never translate languages list.
*/
private onRemoveNeverTranslateLanguageClick_(
e: DomRepeatEvent<chrome.languageSettingsPrivate.Language>) {
const languageCode = e.model.item.code;
this.languageHelper.enableTranslateLanguage(languageCode);
}
private onTranslateToggleChange_(e: Event) {
this.languageSettingsMetricsProxy_.recordSettingsMetric(
(e.target as SettingsToggleButtonElement).checked ?
LanguageSettingsActionType.ENABLE_TRANSLATE_GLOBALLY :
LanguageSettingsActionType.DISABLE_TRANSLATE_GLOBALLY);
}
/**
* @return Whether the list is non-null and has items.
*/
private hasSome_(list: any[]): boolean {
return !!(list && list.length);
}
/**
* Gets the list of languages that chrome can translate
*/
private getTranslatableLanguages_():
chrome.languageSettingsPrivate.Language[] {
return this.languages!.supported.filter(language => {
return this.languageHelper.isLanguageTranslatable(language);
});
}
}
declare global {
interface HTMLElementTagNameMap {
'settings-translate-page': SettingsTranslatePageElement;
}
}
customElements.define(
SettingsTranslatePageElement.is, SettingsTranslatePageElement);