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

86 lines
1.9 KiB
Vue
Raw Normal View History

2016-08-01 05:45:40 +00:00
<template>
<textarea
class="md-input"
:disabled="disabled"
@invalid="onInvalid"
@valid="onValid"
@focus="onFocus"
@blur="onBlur"
@input="onInput"></textarea>
</template>
<script>
import autosize from 'autosize';
let validClass = 'md-input-valid';
let invalidClass = 'md-input-invalid';
let disabledClass = 'md-input-disabled';
let focusedClass = 'md-input-focused';
let hasValueClass = 'md-has-value';
let manageDisabledClass = (state, scope) => {
if (state) {
scope.add(disabledClass);
} else {
scope.remove(disabledClass);
}
};
let manageHasValueClass = function(value, scope) {
if (value.length > 0) {
scope.add(hasValueClass);
} else {
scope.remove(hasValueClass);
}
};
export default {
props: {
disabled: Boolean
},
data() {
return {
parentClasses: this.$parent.$el.classList
};
},
watch: {
disabled(disabled) {
manageDisabledClass(disabled, this.parentClasses);
}
},
methods: {
onInvalid() {
this.parentClasses.remove(validClass);
this.parentClasses.add(invalidClass);
},
onValid() {
this.parentClasses.remove(invalidClass);
this.parentClasses.add(validClass);
},
onFocus() {
this.parentClasses.add(focusedClass);
},
onBlur() {
this.parentClasses.remove(focusedClass);
manageHasValueClass(this.$el.value, this.parentClasses);
},
onInput() {
manageHasValueClass(this.$el.value, this.parentClasses);
}
},
ready() {
manageDisabledClass(this.disabled, this.parentClasses);
manageHasValueClass(this.$el.value, this.parentClasses);
if (!this.$el.getAttribute('rows')) {
this.$el.setAttribute('rows', '1');
}
autosize(this.$el);
},
beforeDestroy() {
autosize.destroy(this.$el);
}
};
</script>