|
|
|
/*
|
|
|
|
* https://github.com/morethanwords/tweb
|
|
|
|
* Copyright (C) 2019-2021 Eduard Kuzmenko
|
|
|
|
* https://github.com/morethanwords/tweb/blob/master/LICENSE
|
|
|
|
*/
|
|
|
|
|
|
|
|
import { cancelEvent } from "../helpers/dom";
|
|
|
|
import InputField, { InputFieldOptions } from "./inputField";
|
|
|
|
|
|
|
|
export default class PasswordInputField extends InputField {
|
|
|
|
public passwordVisible = false;
|
|
|
|
public toggleVisible: HTMLElement;
|
|
|
|
public onVisibilityClickAdditional: () => void;
|
|
|
|
|
|
|
|
constructor(options: InputFieldOptions = {}) {
|
|
|
|
super({
|
|
|
|
plainText: true,
|
|
|
|
...options
|
|
|
|
});
|
|
|
|
|
|
|
|
const input = this.input as HTMLInputElement;
|
|
|
|
input.type = 'password';
|
|
|
|
input.setAttribute('required', '');
|
|
|
|
input.autocomplete = 'off';
|
|
|
|
/* input.readOnly = true;
|
|
|
|
|
|
|
|
input.addEventListener('focus', () => {
|
|
|
|
input.removeAttribute('readonly');
|
|
|
|
}, {once: true}); */
|
|
|
|
|
|
|
|
// * https://stackoverflow.com/a/35949954/6758968
|
|
|
|
const stealthy = document.createElement('input');
|
|
|
|
stealthy.classList.add('stealthy');
|
|
|
|
stealthy.tabIndex = -1;
|
|
|
|
stealthy.type = 'password';
|
|
|
|
input.parentElement.prepend(stealthy);
|
|
|
|
input.parentElement.insertBefore(stealthy.cloneNode(), input.nextSibling);
|
|
|
|
|
|
|
|
const toggleVisible = this.toggleVisible = document.createElement('span');
|
|
|
|
toggleVisible.classList.add('toggle-visible', 'tgico');
|
|
|
|
|
|
|
|
this.container.classList.add('input-field-password');
|
|
|
|
this.container.append(toggleVisible);
|
|
|
|
|
|
|
|
toggleVisible.addEventListener('click', this.onVisibilityClick);
|
|
|
|
toggleVisible.addEventListener('touchend', this.onVisibilityClick);
|
|
|
|
}
|
|
|
|
|
|
|
|
public onVisibilityClick = (e: Event) => {
|
|
|
|
cancelEvent(e);
|
|
|
|
this.passwordVisible = !this.passwordVisible;
|
|
|
|
|
|
|
|
this.toggleVisible.classList.toggle('eye-hidden', this.passwordVisible);
|
|
|
|
(this.input as HTMLInputElement).type = this.passwordVisible ? 'text' : 'password';
|
|
|
|
this.onVisibilityClickAdditional && this.onVisibilityClickAdditional();
|
|
|
|
};
|
|
|
|
}
|