/* * Copyright (C) 2022 Huawei Device Co., Ltd. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ import {BaseElement, element} from "../BaseElement.js"; @element('lit-switch') export default class LitSwitch extends BaseElement { private switch: HTMLInputElement | null | undefined private isfocus: boolean | undefined static get observedAttributes() { return ['disabled', 'checked'] } get disabled() { return this.getAttribute("disabled") !== null; } set disabled(value) { if (value === null || value === false) { this.removeAttribute("disabled"); } else { this.setAttribute("disabled", ""); } } get checked() { return this.getAttribute("checked") !== null; } set checked(value) { if (value === null || value === false) { this.removeAttribute("checked"); } else { this.setAttribute("checked", ""); } } get name() { return this.getAttribute("name"); } initElements(): void { } initHtml(): string { return ` `; } connectedCallback() { this.switch = this.shadowRoot?.getElementById("switch") as HTMLInputElement; this.disabled = this.disabled; this.checked = this.checked; this.switch!.onchange = (ev) => { this.checked = this.switch!.checked; this.dispatchEvent(new CustomEvent("change", {detail: {checked: this.checked}})); } this.switch.onkeydown = (ev) => { switch (ev.keyCode) { case 13://enter this.checked = !this.checked; this.dispatchEvent(new CustomEvent("change", {detail: {checked: this.checked}})); break; default: break; } } this.switch.onfocus = (ev) => { ev.stopPropagation(); if (!this.isfocus) { this.dispatchEvent(new CustomEvent("focus", {detail: {value: this.switch!.value}})) } } this.switch.onblur = ev => { ev.stopPropagation(); if (getComputedStyle(this.switch!).zIndex == '2') { this.isfocus = true; } else { this.isfocus = false; this.dispatchEvent(new CustomEvent("blur", {detail: {value: this.switch!.value}})); } } } attributeChangedCallback(name: string, oldValue: string, newValue: string) { if (name === "disabled" && this.switch) { if (newValue !== null) { this.switch.setAttribute("disabled", ""); } else { this.switch.removeAttribute("disabled"); } } if (name === "checked" && this.switch) { if (newValue !== null) { this.switch.checked = true; } else { this.switch.checked = false; } } } }