2018-04-24 13:54:45 +02:00
|
|
|
import { calcWidthOfInput } from '../lib/utils';
|
2017-08-21 17:59:56 +02:00
|
|
|
|
2017-08-17 14:50:14 +02:00
|
|
|
export default class Input {
|
2017-10-10 13:56:36 +02:00
|
|
|
constructor(instance, element, classNames) {
|
2017-10-12 10:35:58 +02:00
|
|
|
this.parentInstance = instance;
|
2017-08-17 14:50:14 +02:00
|
|
|
this.element = element;
|
2017-10-10 13:56:36 +02:00
|
|
|
this.classNames = classNames;
|
2017-08-27 14:49:35 +02:00
|
|
|
this.isFocussed = this.element === document.activeElement;
|
2017-08-29 13:56:54 +02:00
|
|
|
this.isDisabled = false;
|
2017-08-23 14:23:37 +02:00
|
|
|
|
|
|
|
// Bind event listeners
|
|
|
|
this.onPaste = this.onPaste.bind(this);
|
|
|
|
this.onInput = this.onInput.bind(this);
|
2017-08-27 14:49:35 +02:00
|
|
|
this.onFocus = this.onFocus.bind(this);
|
|
|
|
this.onBlur = this.onBlur.bind(this);
|
2017-08-23 14:23:37 +02:00
|
|
|
}
|
|
|
|
|
2018-04-24 13:54:45 +02:00
|
|
|
set placeholder(placeholder) {
|
|
|
|
this.element.placeholder = placeholder;
|
|
|
|
}
|
|
|
|
|
|
|
|
set value(value) {
|
|
|
|
this.element.value = value;
|
|
|
|
}
|
|
|
|
|
|
|
|
get value() {
|
|
|
|
return this.element.value;
|
2017-10-18 14:05:07 +02:00
|
|
|
}
|
|
|
|
|
2017-08-23 14:23:37 +02:00
|
|
|
addEventListeners() {
|
|
|
|
this.element.addEventListener('input', this.onInput);
|
|
|
|
this.element.addEventListener('paste', this.onPaste);
|
2017-08-27 14:49:35 +02:00
|
|
|
this.element.addEventListener('focus', this.onFocus);
|
|
|
|
this.element.addEventListener('blur', this.onBlur);
|
2017-08-23 14:23:37 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
removeEventListeners() {
|
|
|
|
this.element.removeEventListener('input', this.onInput);
|
|
|
|
this.element.removeEventListener('paste', this.onPaste);
|
2017-08-27 14:49:35 +02:00
|
|
|
this.element.removeEventListener('focus', this.onFocus);
|
|
|
|
this.element.removeEventListener('blur', this.onBlur);
|
2017-08-23 14:23:37 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Input event
|
|
|
|
* @return
|
|
|
|
* @private
|
|
|
|
*/
|
|
|
|
onInput() {
|
2017-10-12 10:35:58 +02:00
|
|
|
if (!this.parentInstance.isSelectOneElement) {
|
2017-08-23 14:23:37 +02:00
|
|
|
this.setWidth();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Paste event
|
|
|
|
* @param {Object} e Event
|
|
|
|
* @return
|
|
|
|
* @private
|
|
|
|
*/
|
|
|
|
onPaste(e) {
|
|
|
|
// Disable pasting into the input if option has been set
|
2017-10-12 10:35:58 +02:00
|
|
|
if (e.target === this.element && !this.parentInstance.config.paste) {
|
2017-08-23 14:23:37 +02:00
|
|
|
e.preventDefault();
|
|
|
|
}
|
2017-08-17 14:50:14 +02:00
|
|
|
}
|
2017-08-21 09:53:19 +02:00
|
|
|
|
2017-08-29 13:56:54 +02:00
|
|
|
/**
|
|
|
|
* Set focussed state
|
|
|
|
*/
|
2017-08-27 14:49:35 +02:00
|
|
|
onFocus() {
|
|
|
|
this.isFocussed = true;
|
|
|
|
}
|
|
|
|
|
2017-08-29 13:56:54 +02:00
|
|
|
/**
|
|
|
|
* Remove focussed state
|
|
|
|
*/
|
2017-08-27 14:49:35 +02:00
|
|
|
onBlur() {
|
|
|
|
this.isFocussed = false;
|
|
|
|
}
|
|
|
|
|
2017-08-23 14:32:07 +02:00
|
|
|
enable() {
|
|
|
|
this.element.removeAttribute('disabled');
|
2017-08-29 13:56:54 +02:00
|
|
|
this.isDisabled = false;
|
2017-08-23 14:32:07 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
disable() {
|
|
|
|
this.element.setAttribute('disabled', '');
|
2017-08-29 13:56:54 +02:00
|
|
|
this.isDisabled = true;
|
2017-08-23 14:32:07 +02:00
|
|
|
}
|
|
|
|
|
2017-08-27 14:49:35 +02:00
|
|
|
focus() {
|
|
|
|
if (!this.isFocussed) {
|
|
|
|
this.element.focus();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-12-10 17:41:39 +01:00
|
|
|
blur() {
|
|
|
|
if (this.isFocussed) {
|
|
|
|
this.element.blur();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2017-08-21 09:53:19 +02:00
|
|
|
/**
|
|
|
|
* Set value of input to blank
|
|
|
|
* @return {Object} Class instance
|
|
|
|
* @public
|
|
|
|
*/
|
|
|
|
clear(setWidth = true) {
|
|
|
|
if (this.element.value) {
|
|
|
|
this.element.value = '';
|
|
|
|
}
|
|
|
|
|
|
|
|
if (setWidth) {
|
2017-08-21 17:59:56 +02:00
|
|
|
this.setWidth();
|
2017-08-21 09:53:19 +02:00
|
|
|
}
|
|
|
|
|
2017-10-12 10:35:58 +02:00
|
|
|
return this.parentInstance;
|
2017-08-21 09:53:19 +02:00
|
|
|
}
|
2017-08-21 17:59:56 +02:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Set the correct input width based on placeholder
|
|
|
|
* value or input value
|
|
|
|
* @return
|
|
|
|
*/
|
2017-08-27 14:49:35 +02:00
|
|
|
setWidth(enforceWidth) {
|
2017-10-12 10:35:58 +02:00
|
|
|
if (this.parentInstance.placeholder) {
|
2017-08-21 17:59:56 +02:00
|
|
|
// If there is a placeholder, we only want to set the width of the input when it is a greater
|
|
|
|
// length than 75% of the placeholder. This stops the input jumping around.
|
|
|
|
if (
|
2017-08-27 14:49:35 +02:00
|
|
|
(this.element.value &&
|
2017-10-12 10:35:58 +02:00
|
|
|
this.element.value.length >= (this.parentInstance.placeholder.length / 1.25)) ||
|
2017-08-27 14:49:35 +02:00
|
|
|
enforceWidth
|
2017-08-21 17:59:56 +02:00
|
|
|
) {
|
2018-04-24 13:54:45 +02:00
|
|
|
this.element.style.width = this.calcWidth();
|
2017-08-21 17:59:56 +02:00
|
|
|
}
|
|
|
|
} else {
|
|
|
|
// If there is no placeholder, resize input to contents
|
2018-04-24 13:54:45 +02:00
|
|
|
this.element.style.width = this.calcWidth();
|
2017-08-21 17:59:56 +02:00
|
|
|
}
|
|
|
|
}
|
2017-08-23 14:32:07 +02:00
|
|
|
|
2018-04-24 13:54:45 +02:00
|
|
|
calcWidth() {
|
|
|
|
return calcWidthOfInput(this.element);
|
2017-08-27 14:49:35 +02:00
|
|
|
}
|
|
|
|
|
2017-10-12 10:35:58 +02:00
|
|
|
setActiveDescendant(activeDescendantID) {
|
|
|
|
this.element.setAttribute('aria-activedescendant', activeDescendantID);
|
2017-08-27 14:49:35 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
removeActiveDescendant() {
|
|
|
|
this.element.removeAttribute('aria-activedescendant');
|
|
|
|
}
|
2017-08-17 14:50:14 +02:00
|
|
|
}
|