|
1 | 1 | <template> |
2 | 2 | <div class="material-input__component" :class="computedClasses"> |
3 | | - <input |
4 | | - v-if="type === 'email'" |
5 | | - type="email" |
6 | | - class="material-input" |
7 | | - :name="name" |
8 | | - :id="id" |
9 | | - :placeholder="placeholder" |
10 | | - v-model="valueCopy" |
11 | | - |
12 | | - :readonly="readonly" |
13 | | - :disabled="disabled" |
14 | | - :autocomplete="autocomplete" |
15 | | - |
16 | | - :required="required" |
17 | | - |
18 | | - @focus="handleFocus(true)" |
19 | | - @blur="handleFocus(false)" |
20 | | - @input="handleModelInput" |
21 | | - > |
22 | | - <input |
23 | | - v-if="type === 'url'" |
24 | | - type="url" |
25 | | - class="material-input" |
26 | | - :name="name" |
27 | | - :id="id" |
28 | | - :placeholder="placeholder" |
29 | | - v-model="valueCopy" |
30 | | - |
31 | | - :readonly="readonly" |
32 | | - :disabled="disabled" |
33 | | - :autocomplete="autocomplete" |
34 | | - |
35 | | - :required="required" |
36 | | - |
37 | | - @focus="handleFocus(true)" |
38 | | - @blur="handleFocus(false)" |
39 | | - @input="handleModelInput" |
40 | | - > |
41 | | - <input |
42 | | - v-if="type === 'number'" |
43 | | - type="number" |
44 | | - class="material-input" |
45 | | - :name="name" |
46 | | - :id="id" |
47 | | - :placeholder="placeholder" |
48 | | - v-model="valueCopy" |
49 | | - |
50 | | - :readonly="readonly" |
51 | | - :disabled="disabled" |
52 | | - :autocomplete="autocomplete" |
53 | | - |
54 | | - :max="max" |
55 | | - :min="min" |
56 | | - :minlength="minlength" |
57 | | - :maxlength="maxlength" |
58 | | - :required="required" |
59 | | - |
60 | | - @focus="handleFocus(true)" |
61 | | - @blur="handleFocus(false)" |
62 | | - @input="handleModelInput" |
63 | | - > |
64 | | - <input |
65 | | - v-if="type === 'password'" |
66 | | - type="password" |
67 | | - class="material-input" |
68 | | - :name="name" |
69 | | - :id="id" |
70 | | - :placeholder="placeholder" |
71 | | - v-model="valueCopy" |
72 | | - |
73 | | - :readonly="readonly" |
74 | | - :disabled="disabled" |
75 | | - :autocomplete="autocomplete" |
76 | | - |
77 | | - :max="max" |
78 | | - :min="min" |
79 | | - :required="required" |
80 | | - |
81 | | - @focus="handleFocus(true)" |
82 | | - @blur="handleFocus(false)" |
83 | | - @input="handleModelInput" |
84 | | - > |
85 | | - <input |
86 | | - v-if="type === 'tel'" |
87 | | - type="tel" |
88 | | - class="material-input" |
89 | | - :name="name" |
90 | | - :id="id" |
91 | | - :placeholder="placeholder" |
92 | | - v-model="valueCopy" |
93 | | - |
94 | | - :readonly="readonly" |
95 | | - :disabled="disabled" |
96 | | - :autocomplete="autocomplete" |
97 | | - |
98 | | - :required="required" |
99 | | - |
100 | | - @focus="handleFocus(true)" |
101 | | - @blur="handleFocus(false)" |
102 | | - @input="handleModelInput" |
103 | | - > |
104 | | - <input |
105 | | - v-if="type === 'text'" |
106 | | - type="text" |
107 | | - class="material-input" |
108 | | - :name="name" |
109 | | - :id="id" |
110 | | - :placeholder="placeholder" |
111 | | - v-model="valueCopy" |
112 | | - |
113 | | - :readonly="readonly" |
114 | | - :disabled="disabled" |
115 | | - :autocomplete="autocomplete" |
116 | | - |
117 | | - :minlength="minlength" |
118 | | - :maxlength="maxlength" |
119 | | - :required="required" |
120 | | - |
121 | | - @focus="handleFocus(true)" |
122 | | - @blur="handleFocus(false)" |
123 | | - @input="handleModelInput" |
124 | | - > |
| 3 | + <input v-if="type === 'email'" type="email" class="material-input" :name="name" :id="id" :placeholder="placeholder" v-model="valueCopy" |
| 4 | + :readonly="readonly" :disabled="disabled" :autocomplete="autocomplete" :required="required" @focus="handleFocus(true)" |
| 5 | + @blur="handleFocus(false)" @input="handleModelInput"> |
| 6 | + <input v-if="type === 'url'" type="url" class="material-input" :name="name" :id="id" :placeholder="placeholder" v-model="valueCopy" |
| 7 | + :readonly="readonly" :disabled="disabled" :autocomplete="autocomplete" :required="required" @focus="handleFocus(true)" |
| 8 | + @blur="handleFocus(false)" @input="handleModelInput"> |
| 9 | + <input v-if="type === 'number'" type="number" class="material-input" :name="name" :id="id" :placeholder="placeholder" v-model="valueCopy" |
| 10 | + :readonly="readonly" :disabled="disabled" :autocomplete="autocomplete" :max="max" :min="min" :minlength="minlength" |
| 11 | + :maxlength="maxlength" :required="required" @focus="handleFocus(true)" @blur="handleFocus(false)" @input="handleModelInput"> |
| 12 | + <input v-if="type === 'password'" type="password" class="material-input" :name="name" :id="id" :placeholder="placeholder" |
| 13 | + v-model="valueCopy" :readonly="readonly" :disabled="disabled" :autocomplete="autocomplete" :max="max" :min="min" |
| 14 | + :required="required" @focus="handleFocus(true)" @blur="handleFocus(false)" @input="handleModelInput"> |
| 15 | + <input v-if="type === 'tel'" type="tel" class="material-input" :name="name" :id="id" :placeholder="placeholder" v-model="valueCopy" |
| 16 | + :readonly="readonly" :disabled="disabled" :autocomplete="autocomplete" :required="required" @focus="handleFocus(true)" |
| 17 | + @blur="handleFocus(false)" @input="handleModelInput"> |
| 18 | + <input v-if="type === 'text'" type="text" class="material-input" :name="name" :id="id" :placeholder="placeholder" v-model="valueCopy" |
| 19 | + :readonly="readonly" :disabled="disabled" :autocomplete="autocomplete" :minlength="minlength" :maxlength="maxlength" |
| 20 | + :required="required" @focus="handleFocus(true)" @blur="handleFocus(false)" @input="handleModelInput"> |
125 | 21 |
|
126 | 22 | <span class="material-input-bar"></span> |
127 | 23 |
|
|
137 | 33 | </template> |
138 | 34 |
|
139 | 35 | <script> |
| 36 | + // source:https://github.com/wemake-services/vue-material-input/blob/master/src/components/MaterialInput.vue |
140 | 37 | export default { |
141 | 38 | name: 'material-input', |
142 | 39 | computed: { |
|
148 | 45 | return { |
149 | 46 | 'material--active': this.focus, |
150 | 47 | 'material--disabled': this.disabled, |
151 | | - 'material--has-errors': Boolean( |
152 | | - !this.valid || |
153 | | - (this.errorMessages && this.errorMessages.length)), |
154 | | - 'material--raised': Boolean( |
155 | | - this.focus || |
156 | | - this.valueCopy || // has value |
| 48 | + 'material--has-errors': Boolean(!this.valid || (this.errorMessages && this.errorMessages.length)), |
| 49 | + 'material--raised': Boolean(this.focus || this.valueCopy || // has value |
157 | 50 | (this.placeholder && !this.valueCopy)) // has placeholder |
158 | 51 | } |
159 | 52 | } |
|
166 | 59 | } |
167 | 60 | }, |
168 | 61 | beforeMount() { |
169 | | - // Here we are following the Vue2 convention on custom v-model: |
170 | | - // https://github.com/vuejs/vue/issues/2873#issuecomment-223759341 |
| 62 | + // Here we are following the Vue2 convention on custom v-model: |
| 63 | + // https://github.com/vuejs/vue/issues/2873#issuecomment-223759341 |
171 | 64 | this.copyValue(this.value) |
172 | 65 | }, |
173 | 66 | methods: { |
|
179 | 72 | this.focus = focused |
180 | 73 | }, |
181 | 74 | handleValidation() { |
182 | | - this.valid = this.$el ? this.$el.querySelector( |
183 | | - '.material-input').validity.valid : this.valid |
| 75 | + this.valid = this.$el ? this.$el.querySelector('.material-input').validity.valid : this.valid |
184 | 76 | }, |
185 | 77 | copyValue(value) { |
186 | 78 | this.valueCopy = value |
|
388 | 280 | } |
389 | 281 | // Errors: |
390 | 282 | &.material--has-errors { |
391 | | - // These styles are required |
392 | | - // for custom validation: |
393 | 283 | &.material--active .material-label { |
394 | 284 | color: $color-red; |
395 | 285 | } |
|
0 commit comments