vue-material/src/components/mdInputContainer/mdInputContainer.vue

125 lines
3.2 KiB
Vue
Raw Normal View History

2016-07-26 22:55:29 +00:00
<template>
2016-07-27 04:55:32 +00:00
<div class="md-input-container" :class="classes">
2016-07-26 22:55:29 +00:00
<slot></slot>
2016-07-27 22:17:22 +00:00
<md-button class="md-icon-button md-toggle-password" @click="togglePasswordType" v-if="mdHasPassword">
<md-icon>{{ showPassword ? 'visibility_off' : 'visibility' }}</md-icon>
</md-button>
2016-07-26 22:55:29 +00:00
</div>
</template>
<style lang="scss" src="./mdInputContainer.scss"></style>
<script>
2016-07-28 03:10:33 +00:00
import autosize from 'autosize';
2016-07-26 22:55:29 +00:00
let focusedClass = 'md-input-focused';
2016-07-27 04:55:32 +00:00
let inlineClass = 'md-input-inline';
let disabledClass = 'md-input-disabled';
2016-07-26 22:55:29 +00:00
let hasValueClass = 'md-has-value';
2016-07-27 22:17:22 +00:00
let hasPasswordClass = 'md-has-password';
2016-07-26 22:55:29 +00:00
let focusBindFunction;
let blurBindFunction;
2016-07-27 04:55:32 +00:00
let inputBindFunction;
2016-07-26 22:55:29 +00:00
let manageHasValueClass = function(element, parent) {
if (element.value.length > 0) {
parent.classList.add(hasValueClass);
} else {
parent.classList.remove(hasValueClass);
}
};
2016-07-27 04:55:32 +00:00
let manageDisabled = function(disabled, element) {
if (disabled) {
element.setAttribute('disabled', 'true');
} else {
element.removeAttribute('disabled');
}
};
2016-07-26 22:55:29 +00:00
export default {
2016-07-27 04:55:32 +00:00
props: {
mdInline: Boolean,
2016-07-27 22:17:22 +00:00
mdDisabled: Boolean,
mdHasPassword: Boolean
2016-07-27 04:55:32 +00:00
},
computed: {
classes() {
let cssClasses = [];
this.mdInline && cssClasses.push(inlineClass);
this.mdDisabled && cssClasses.push(disabledClass);
2016-07-27 22:17:22 +00:00
this.mdHasPassword && cssClasses.push(hasPasswordClass);
2016-07-27 04:55:32 +00:00
return cssClasses.join(' ');
}
},
watch: {
mdDisabled(disabled) {
manageDisabled(disabled, this.input);
}
},
2016-07-26 22:55:29 +00:00
data() {
return {
2016-07-27 22:17:22 +00:00
input: false,
inputType: false,
showPassword: false
2016-07-26 22:55:29 +00:00
};
},
2016-07-27 22:17:22 +00:00
methods: {
togglePasswordType() {
if (this.input.tagName.toLowerCase() === 'input') {
let type = this.input.type;
if (type === 'password') {
this.input.type = 'text';
this.showPassword = true;
} else {
this.input.type = 'password';
this.showPassword = false;
}
}
}
},
2016-07-26 22:55:29 +00:00
ready() {
let container = this.$el;
2016-07-27 22:17:22 +00:00
this.input = container.querySelector('input') || container.querySelector('textarea');
this.inputType = this.input.type;
2016-07-26 22:55:29 +00:00
focusBindFunction = function() {
container.classList.add(focusedClass);
};
blurBindFunction = function() {
container.classList.remove(focusedClass);
manageHasValueClass(this, container);
};
2016-07-27 04:55:32 +00:00
inputBindFunction = function() {
manageHasValueClass(this, container);
};
2016-07-26 22:55:29 +00:00
this.input.addEventListener('focus', focusBindFunction);
this.input.addEventListener('blur', blurBindFunction);
2016-07-27 04:55:32 +00:00
this.input.addEventListener('input', inputBindFunction);
2016-07-26 22:55:29 +00:00
manageHasValueClass(this.input, container);
2016-07-27 04:55:32 +00:00
manageDisabled(this.mdDisabled, this.input);
2016-07-28 03:10:33 +00:00
if (this.input.tagName.toLowerCase() === 'textarea') {
this.input.setAttribute('rows', '1');
autosize(this.input);
}
},
beforeDestroy() {
this.input.removeEventListener('focus', focusBindFunction);
this.input.removeEventListener('blur', blurBindFunction);
this.input.removeEventListener('input', inputBindFunction);
2016-07-26 22:55:29 +00:00
}
};
</script>