Skip to content

Commit 3db4213

Browse files
Adds support for ie11
* Fixes IE11 support, still requires polyfills * Adds build files * Fixes issue in ie11 related to function.name
1 parent 6b86cd6 commit 3db4213

File tree

7 files changed

+47
-29
lines changed

7 files changed

+47
-29
lines changed

dist/formulate.esm.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/formulate.min.js

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

dist/formulate.umd.js

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/FormulateInput.vue

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -282,41 +282,40 @@ export default {
282282
performValidation () {
283283
const rules = parseRules(this.validation, this.$formulate.rules(this.parsedValidationRules))
284284
this.pendingValidation = Promise.all(
285-
rules.map(([rule, args]) => {
285+
rules.map(([rule, args, ruleName]) => {
286286
var res = rule({
287287
value: this.context.model,
288288
getFormValues: this.getFormValues.bind(this),
289289
name: this.context.name
290290
}, ...args)
291291
res = (res instanceof Promise) ? res : Promise.resolve(res)
292-
return res.then(res => res ? false : this.getValidationMessage(rule, args))
292+
return res.then(res => res ? false : this.getMessage(ruleName, args))
293293
})
294294
)
295295
.then(result => result.filter(result => result))
296296
.then(errorMessages => { this.validationErrors = errorMessages })
297297
return this.pendingValidation
298298
},
299-
getValidationMessage (rule, args) {
300-
return this.getValidationFunction(rule)({
299+
getMessage (ruleName, args) {
300+
return this.getMessageFunc(ruleName)({
301301
args,
302302
name: this.mergedValidationName,
303303
value: this.context.model,
304304
vm: this,
305305
formValues: this.getFormValues()
306306
})
307307
},
308-
getValidationFunction (rule) {
309-
let ruleName = rule.name.substr(0, 1) === '_' ? rule.name.substr(1) : rule.name
308+
getMessageFunc (ruleName) {
310309
ruleName = snakeToCamel(ruleName)
311-
if (this.messages && typeof this.messages === 'object' && typeof this.messages[ruleName] !== 'undefined') {
310+
if (this.messages && typeof this.messages[ruleName] !== 'undefined') {
312311
switch (typeof this.messages[ruleName]) {
313312
case 'function':
314313
return this.messages[ruleName]
315314
case 'string':
316315
return () => this.messages[ruleName]
317316
}
318317
}
319-
return (context) => this.$formulate.validationMessage(rule.name, context, this)
318+
return (context) => this.$formulate.validationMessage(ruleName, context, this)
320319
},
321320
hasValidationErrors () {
322321
return new Promise(resolve => {

src/inputs/FormulateInputBox.vue

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,23 @@
33
:class="`formulate-input-element formulate-input-element--${context.type}`"
44
:data-type="context.type"
55
>
6+
<!--
7+
This explicit break out of types is due to a Vue bug that causes IE11 to
8+
not when using v-model + dynamic :type + :value (thanks @Christoph-Wagner)
9+
https://github.com/vuejs/vue/issues/8379
10+
-->
611
<input
12+
v-if="type === 'radio'"
713
v-model="context.model"
8-
:type="type"
14+
type="radio"
15+
:value="context.value"
16+
v-bind="attributes"
17+
@blur="context.blurHandler"
18+
>
19+
<input
20+
v-else
21+
v-model="context.model"
22+
type="checkbox"
923
:value="context.value"
1024
v-bind="attributes"
1125
@blur="context.blurHandler"

src/libs/utils.js

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -106,19 +106,19 @@ function parseRule (rule, rules) {
106106
}
107107
if (Array.isArray(rule) && rule.length) {
108108
rule = rule.map(r => r) // light clone
109-
rule[0] = snakeToCamel(rule[0])
110-
if (typeof rule[0] === 'string' && rules.hasOwnProperty(rule[0])) {
111-
return [rules[rule.shift()], rule]
109+
const ruleName = snakeToCamel(rule.shift())
110+
if (typeof ruleName === 'string' && rules.hasOwnProperty(ruleName)) {
111+
return [rules[ruleName], rule, ruleName]
112112
}
113-
if (typeof rule[0] === 'function') {
114-
return [rule.shift(), rule]
113+
if (typeof ruleName === 'function') {
114+
return [ruleName, rule, ruleName]
115115
}
116116
}
117117
if (typeof rule === 'string') {
118118
const segments = rule.split(':')
119-
const functionName = snakeToCamel(segments.shift())
120-
if (rules.hasOwnProperty(functionName)) {
121-
return [rules[functionName], segments.length ? segments.join(':').split(',') : []]
119+
const ruleName = snakeToCamel(segments.shift())
120+
if (rules.hasOwnProperty(ruleName)) {
121+
return [rules[ruleName], segments.length ? segments.join(':').split(',') : [], ruleName]
122122
} else {
123123
throw new Error(`Unknown validation rule ${rule}`)
124124
}

test/unit/utils.test.js

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import FileUpload from '@/FileUpload';
55
describe('parseRules', () => {
66
it('parses single string rules, returning empty arguments array', () => {
77
expect(parseRules('required', rules)).toEqual([
8-
[rules.required, []]
8+
[rules.required, [], 'required']
99
])
1010
})
1111

@@ -17,29 +17,29 @@ describe('parseRules', () => {
1717

1818
it('parses arguments for a rule', () => {
1919
expect(parseRules('in:foo,bar', rules)).toEqual([
20-
[rules.in, ['foo', 'bar']]
20+
[rules.in, ['foo', 'bar'], 'in']
2121
])
2222
})
2323

2424
it('parses multiple string rules and arguments', () => {
2525
expect(parseRules('required|in:foo,bar', rules)).toEqual([
26-
[rules.required, []],
27-
[rules.in, ['foo', 'bar']]
26+
[rules.required, [], 'required'],
27+
[rules.in, ['foo', 'bar'], 'in']
2828
])
2929
})
3030

3131
it('parses multiple array rules and arguments', () => {
3232
expect(parseRules(['required', 'in:foo,bar'], rules)).toEqual([
33-
[rules.required, []],
34-
[rules.in, ['foo', 'bar']]
33+
[rules.required, [], 'required'],
34+
[rules.in, ['foo', 'bar'], 'in']
3535
])
3636
})
3737

3838
it('parses array rules with expression arguments', () => {
3939
expect(parseRules([
4040
['matches', /^abc/, '1234']
4141
], rules)).toEqual([
42-
[rules.matches, [/^abc/, '1234']]
42+
[rules.matches, [/^abc/, '1234'], 'matches']
4343
])
4444
})
4545
})
@@ -142,6 +142,11 @@ describe('snakeToCamel', () => {
142142
it('has no effect hyphenated words', () => {
143143
expect(snakeToCamel('not-a-good-name')).toBe('not-a-good-name')
144144
})
145+
146+
it('returns the same function if passed', () => {
147+
const fn = () => {}
148+
expect(snakeToCamel(fn)).toBe(fn)
149+
})
145150
})
146151

147152

0 commit comments

Comments
 (0)