/*
* 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;
}
}
}
}