@afeefa/vue-app 0.0.136 → 0.0.137

Sign up to get free protection for your applications and to get access to all the features.
@@ -1 +1 @@
1
- 0.0.136
1
+ 0.0.137
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@afeefa/vue-app",
3
- "version": "0.0.136",
3
+ "version": "0.0.137",
4
4
  "description": "",
5
5
  "author": "Afeefa Kollektiv <kollektiv@afeefa.de>",
6
6
  "license": "MIT",
@@ -9,6 +9,7 @@
9
9
  @input="inputChanged"
10
10
  @keyup.esc="clear"
11
11
  @click:clear="clear"
12
+ @blur="sanitizeInternalValue"
12
13
  v-on="listeners"
13
14
  />
14
15
  </template>
@@ -54,12 +55,17 @@ export default class ATextField extends Mixins(ComponentWidthMixin) {
54
55
 
55
56
  @Watch('value')
56
57
  valueChanged () {
58
+ const value = this.textFieldValueToModelValue()
59
+ if (value === this.value) {
60
+ // return if sanitized textfield value === model value
61
+ return
62
+ }
57
63
  this.setInternalValue(this.value)
58
64
  }
59
65
 
60
66
  get listeners () {
61
- // remove input from nested listening
62
- // let clients listend to only THIS component
67
+ // remove @input from nested listening
68
+ // let clients listen to only THIS component
63
69
  const listeners = {...this.$listeners}
64
70
  delete listeners.input
65
71
  return listeners
@@ -76,11 +82,15 @@ export default class ATextField extends Mixins(ComponentWidthMixin) {
76
82
  return attrs
77
83
  }
78
84
 
79
- clear () {
85
+ clear (event) {
80
86
  if (this.clearable) {
87
+ // empty value if value exists
88
+ if (this.internalValue) {
89
+ event.stopPropagation()
90
+ }
81
91
  this.setInternalValue('')
82
- this.$emit('input', this.emptyValue)
83
- this.validate()
92
+ this.$emit('input:internal', '')
93
+ this.$emit('input', this.emptyModelValue)
84
94
  this.$emit('clear')
85
95
  }
86
96
  }
@@ -89,12 +99,11 @@ export default class ATextField extends Mixins(ComponentWidthMixin) {
89
99
  this.$emit('input:internal', this.internalValue)
90
100
 
91
101
  const valid = this.validate()
92
-
93
102
  if (!valid) {
94
103
  return
95
104
  }
96
105
 
97
- const value = this.stringToNumber(this.internalValue)
106
+ const value = this.textFieldValueToModelValue()
98
107
 
99
108
  // NaN means: wrong numerical value AND no validator present
100
109
  // otherwise validator would return validate() -> false
@@ -114,34 +123,11 @@ export default class ATextField extends Mixins(ComponentWidthMixin) {
114
123
  }
115
124
  }
116
125
 
117
- stringToNumber (value) {
118
- if (this.treatAsNumericValue) {
119
- if (!value) {
120
- value = null
121
- } else {
122
- value = this.internalValue.match(/^-?\d*(\.\d+)?$/) ? parseFloat(this.internalValue) : NaN
123
- }
124
- } else {
125
- if (!value) {
126
- value = this.emptyValue
127
- }
128
- }
129
- return value
130
- }
131
-
132
- get type () {
133
- return this.$attrs.type || 'text'
134
- }
135
-
136
- get treatAsNumericValue () {
137
- return this.type === 'number' || this.number
138
- }
139
-
140
126
  validate () {
127
+ const value = this.textFieldValueToModelValue()
141
128
  const rules = this.validationRules
142
129
  let errorMessage = null
143
130
  for (const rule of rules) {
144
- const value = this.stringToNumber(this.internalValue)
145
131
  const result = rule(value)
146
132
  if (result !== true) {
147
133
  errorMessage = result
@@ -159,6 +145,49 @@ export default class ATextField extends Mixins(ComponentWidthMixin) {
159
145
  this.setFocus()
160
146
  }
161
147
 
148
+ sanitizeInternalValue () {
149
+ const sanitizedValue = this.getSanitizedInternalValue()
150
+ this.setInternalValue(sanitizedValue)
151
+ }
152
+
153
+ getSanitizedInternalValue () {
154
+ return this.getSanitizedValue(this.internalValue)
155
+ }
156
+
157
+ getSanitizedValue (value) {
158
+ if (this.validator) {
159
+ const sanitizers = this.validator.getSanitizers()
160
+ for (const sanitizer of sanitizers) {
161
+ value = sanitizer(value)
162
+ }
163
+ }
164
+ return value
165
+ }
166
+
167
+ textFieldValueToModelValue () {
168
+ const sanitizedValue = this.getSanitizedInternalValue()
169
+ return this.stringToNumber(sanitizedValue)
170
+ }
171
+
172
+ stringToNumber (value) {
173
+ const textFieldType = this.$attrs.type || 'text'
174
+ const treatAsNumericValue = textFieldType === 'number' || this.number
175
+
176
+ if (treatAsNumericValue) {
177
+ if (!value) {
178
+ value = null
179
+ } else {
180
+ value = this.internalValue.match(/^-?\d*(\.\d+)?$/) ? parseFloat(this.internalValue) : NaN
181
+ }
182
+ } else {
183
+ if (!value) {
184
+ value = this.emptyModelValue
185
+ }
186
+ }
187
+
188
+ return value
189
+ }
190
+
162
191
  setFocus (force = false) {
163
192
  const focus = this.focus || force // set focus if this.focus or else if forced from outside
164
193
  if (focus) {
@@ -190,9 +219,9 @@ export default class ATextField extends Mixins(ComponentWidthMixin) {
190
219
  return this.validator.getMaxValueLength()
191
220
  }
192
221
 
193
- get emptyValue () {
222
+ get emptyModelValue () {
194
223
  if (this.validator) {
195
- return this.validator.getEmptyValue()
224
+ return this.getSanitizedValue('')
196
225
  }
197
226
  return null
198
227
  }