salix/client/core/src/textfield/textfield.js

78 lines
2.3 KiB
JavaScript
Raw Normal View History

import {module} from '../module';
2017-09-12 09:44:56 +00:00
// import * as resolveFactory from '../lib/resolveDefaultComponents';
// import * as normalizerFactory from '../lib/inputAttrsNormalizer';
import './style.scss';
2017-09-12 09:44:56 +00:00
// import './textfield.mdl';
2017-09-12 09:44:56 +00:00
export default class TextfieldController {
constructor($element, $scope, $attrs) {
2017-09-12 09:44:56 +00:00
this.$scope = $scope;
this.$attrs = $attrs;
let input = this.input = this.$element.querySelector('input');
input.addEventListener('input',
() => this.checkValue());
input.addEventListener('focus',
() => this.checkValue());
input.addEventListener('blur',
() => this.showClear(false));
2017-09-12 09:44:56 +00:00
let clearButton = this.$element.querySelector('button');
clearButton.addEventListener('click',
() => this.onClearClick());
clearButton.addEventListener('mousedown',
event => event.preventDefault());
2017-09-12 09:44:56 +00:00
let div = this.$element.firstChild;
componentHandler.upgradeElement(div);
2017-09-12 09:44:56 +00:00
Object.assign(this, $attrs);
}
2017-09-12 09:44:56 +00:00
$onInit() {
let mdlTextField = this.$element.firstChild.MaterialTextfield;
2017-05-05 10:54:47 +00:00
mdlTextField.updateClasses_();
2017-09-12 09:44:56 +00:00
this.$scope.$watch(this.$attrs.model,
() => mdlTextField.updateClasses_());
2017-09-12 09:44:56 +00:00
let $input = angular.$element(this.input);
$input.controller('ng-model').$parsers.push(value => value === '' ? null : value);
}
onClearClick() {
this.input.value = null;
this.checkValue();
let event = this.document.createEvent('HTMLEvents');
event.initEvent('change', false, true);
this.input.dispatchEvent(event);
}
checkValue() {
this.showClear(this.input.value);
}
showClear(show) {
2017-05-26 11:14:47 +00:00
show = show && document.activeElement === this.input;
2017-09-12 09:44:56 +00:00
let clearButton = this.$element.querySelector('button');
clearButton.style.visibility = show ? 'visible' : 'hidden';
}
2017-05-18 15:35:07 +00:00
/**
* Selects the textfield.
*/
select() {
this.input.select();
}
/**
* Puts the focus on the textfield.
*/
focus() {
this.input.focus();
}
}
2017-09-12 09:44:56 +00:00
TextfieldController.$inject = ['$element', '$scope', '$attrs'];
2017-09-12 09:44:56 +00:00
module.component('vnTextfield', {
template: require('./textfield.html'),
controller: TextfieldController
});