// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import './shimless_rma_shared.css.js';
import './icons.html.js';
import 'chrome://resources/ash/common/cr_elements/cr_button/cr_button.js';
import 'chrome://resources/ash/common/cr_elements/icons.html.js';
import 'chrome://resources/polymer/v3_0/iron-icon/iron-icon.js';
import 'chrome://resources/polymer/v3_0/paper-tooltip/paper-tooltip.js';
import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
import {getTemplate} from './calibration_component_chip.html.js';
import {CLICK_CALIBRATION_COMPONENT_BUTTON, ClickCalibrationComponentEvent} from './events.js';
import {modifyTabbableElement} from './shimless_rma_util.js';
declare global {
interface HTMLElementEventMap {
[CLICK_CALIBRATION_COMPONENT_BUTTON]: ClickCalibrationComponentEvent;
}
}
/**
* @fileoverview
* 'calibration-component-chip' represents a single component chip that reports
* status of last calibration attempt and can be marked to skip.
*/
export class CalibrationComponentChipElement extends PolymerElement {
static get is() {
return 'calibration-component-chip' as const;
}
static get template() {
return getTemplate();
}
static get properties() {
return {
checked: {
notify: true,
reflectToAttribute: true,
type: Boolean,
value: false,
},
failed: {type: Boolean, value: false},
componentName: {type: String, value: ''},
disabled: {
type: Boolean,
value: false,
},
isFirstClickableComponent: {
type: Boolean,
value: false,
observer: CalibrationComponentChipElement.prototype
.onIsFirstClickableComponentChanged,
},
uniqueId: {
reflectToAttribute: true,
type: Number,
value: '',
},
};
}
checked: boolean;
failed: boolean;
componentName: string;
disabled: boolean;
isFirstClickableComponent: boolean;
uniqueId: number;
protected onComponentButtonClicked() {
this.checked = !this.checked;
// Notify the page that the component chip was clicked, so that the page can
// put the focus on it.
this.dispatchEvent(new CustomEvent<number>('click-calibration-component-button', {
bubbles: true,
composed: true,
detail: this.uniqueId,
}));
}
override click() {
this.onComponentButtonClicked();
}
/**
* Show the checked icon for disabled calibration components because if it's
* disabled, that means it alerady passed calibration.
*/
protected shouldShowCheckIcon(): boolean {
return this.checked || this.disabled;
}
private onIsFirstClickableComponentChanged() {
// Tab should go to the first non-disabled component in the list,
// not individual component.
modifyTabbableElement(
this.shadowRoot!.querySelector<HTMLElement>('#componentButton')!,
this.isFirstClickableComponent);
}
protected isAriaPressed(): string {
return this.checked.toString();
}
}
declare global {
interface HTMLElementTagNameMap {
[CalibrationComponentChipElement.is]: CalibrationComponentChipElement;
}
}
customElements.define(
CalibrationComponentChipElement.is, CalibrationComponentChipElement);