Skip to content

Commit 9a43a7a

Browse files
authored
Merge pull request vue-generators#314 from hansi90/file_upload_error
File upload error fixed.
2 parents dfe823c + 9bfbb4e commit 9a43a7a

File tree

6 files changed

+164
-39
lines changed

6 files changed

+164
-39
lines changed

.eslintrc.js

+2-1
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,8 @@ module.exports = {
2121
"rules": {
2222
"indent": [
2323
"warn",
24-
"tab"
24+
"tab",
25+
{ SwitchCase: 1 }
2526
],
2627
"quotes": [
2728
"warn",

examples/post-form/main.js

+11-3
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ var vm = new Vue({
77
},
88

99
methods: {
10-
prettyJSON: function(json) {
10+
prettyJSON: function (json) {
1111
if (json) {
1212
json = JSON.stringify(json, undefined, 4);
1313
json = json.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
@@ -74,7 +74,7 @@ var vm = new Vue({
7474
required: true,
7575
hint: "Minimum 6 characters",
7676
validator: VueFormGenerator.validators.string
77-
},
77+
},
7878
{
7979
type: "input",
8080
inputType: "email",
@@ -83,7 +83,7 @@ var vm = new Vue({
8383
inputName: "email",
8484
placeholder: "User's e-mail address",
8585
validator: VueFormGenerator.validators.email
86-
},
86+
},
8787
{
8888
type: "select",
8989
label: "Skills",
@@ -100,6 +100,14 @@ var vm = new Vue({
100100
"VueJS"
101101
],
102102
validator: VueFormGenerator.validators.string
103+
}, {
104+
type: "upload",
105+
label: "Photo",
106+
model: "photo",
107+
inputName: "photo",
108+
onChanged(model, schema, event) {
109+
console.log(model, schema, event);
110+
}
103111
},
104112
{
105113
type: "checkbox",

src/fields/core/fieldInput.vue

+28-29
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
:type="schema.inputType",
66
:value="value",
77
@input="value = $event.target.value",
8-
@change="onChange",
8+
@change="schema.onChange || null",
99
:disabled="disabled",
1010
:accept="schema.accept",
1111
:alt="schema.alt",
@@ -37,22 +37,17 @@
3737
</template>
3838

3939
<script>
40-
import abstractField from "../abstractField";
41-
import fecha from "fecha";
40+
import abstractField from "../abstractField";
41+
import fecha from "fecha";
4242
43-
export default {
44-
mixins: [ abstractField ],
45-
methods: {
46-
onChange(event){
47-
if (this.schema.inputType === "file") {
48-
this.value = event.target.files;
49-
}
50-
},
51-
52-
formatValueToField(value) {
53-
if (value != null) {
54-
let dt;
55-
switch(this.schema.inputType){
43+
export default {
44+
mixins: [abstractField],
45+
methods: {
46+
47+
formatValueToField(value) {
48+
if (value != null) {
49+
let dt;
50+
switch (this.schema.inputType) {
5651
case "date":
5752
dt = this.schema.format ? fecha.parse(value, this.schema.format) : new Date(value);
5853
return fecha.format(dt, "YYYY-MM-DD");
@@ -62,16 +57,16 @@
6257
case "datetime-local":
6358
dt = this.schema.format ? fecha.parse(value, this.schema.format) : new Date(value);
6459
return fecha.format(dt, "YYYY-MM-DDTHH:mm:ss");
65-
}
6660
}
67-
68-
return value;
69-
},
61+
}
7062
71-
formatValueToModel(value) {
72-
if (value != null) {
73-
let m;
74-
switch (this.schema.inputType){
63+
return value;
64+
},
65+
66+
formatValueToModel(value) {
67+
if (value != null) {
68+
let m;
69+
switch (this.schema.inputType) {
7570
case "date":
7671
m = fecha.parse(value, "YYYY-MM-DD");
7772
if (m !== false) {
@@ -100,16 +95,20 @@
10095
}
10196
break;
10297
case "number":
103-
return Number(value);
98+
return Number(value);
10499
case "range":
105100
return Number(value);
106-
}
107101
}
108-
109-
return value;
110102
}
103+
104+
return value;
111105
}
112-
};
106+
},
107+
108+
created () {
109+
console.warn("The 'file' type in input field is deprecated. Use 'file' field instead.");
110+
}
111+
};
113112
114113
</script>
115114

src/fields/core/fieldUpload.vue

+43
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
<template lang="pug">
2+
.wrapper
3+
input.form-control(
4+
id="getFieldID(schema)",
5+
type="file",
6+
:name="schema.inputName",
7+
@change="onChange",
8+
:accept="schema.accept",
9+
:multiple="schema.multiple",
10+
:placeholder="schema.placeholder",
11+
:readonly="schema.readonly",
12+
:required="schema.required",
13+
:disabled="disabled",)
14+
</template>
15+
16+
<script>
17+
import abstractField from "../abstractField";
18+
import { isFunction } from "lodash";
19+
20+
export default {
21+
mixins: [abstractField],
22+
methods: {
23+
onChange(){
24+
if(isFunction(this.schema.onChanged)){
25+
// Schema has defined onChange method.
26+
this.schema.onChanged.call(this, this.model, this.schema, event, this);
27+
}
28+
}
29+
}
30+
};
31+
32+
</script>
33+
34+
<style lang="sass">
35+
.vue-form-generator .field-input {
36+
.wrapper {
37+
width: 100%;
38+
}
39+
.helper {
40+
margin: auto 0.5em;
41+
}
42+
}
43+
</style>

src/formGenerator.vue

+6-6
Original file line numberDiff line numberDiff line change
@@ -211,12 +211,12 @@ div.vue-form-generator(v-if='schema != null')
211211
}
212212
213213
switch (relevantType) {
214-
case "button":
215-
case "submit":
216-
case "reset":
217-
return false;
218-
default:
219-
return true;
214+
case "button":
215+
case "submit":
216+
case "reset":
217+
return false;
218+
default:
219+
return true;
220220
}
221221
},
222222
+74
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
import { expect } from "chai";
2+
import { createVueField, checkAttribute } from "../util";
3+
4+
import Vue from "vue";
5+
import fieldUpload from "src/fields/core/fieldUpload.vue";
6+
7+
Vue.component("fieldUpload", fieldUpload);
8+
9+
let el, vm, field;
10+
11+
function createField(test, schema = {}, model = null, disabled = false, options) {
12+
[el, vm, field] = createVueField(test, "fieldUpload", schema, model, disabled, options);
13+
}
14+
15+
describe("fieldUpload.vue", function () {
16+
17+
describe("check template", () => {
18+
let schema = {
19+
type: "upload",
20+
label: "Upload",
21+
inputName: "testupload",
22+
placeholder: "Field placeholder",
23+
readonly: false,
24+
required: false,
25+
disabled: false,
26+
multiple: true,
27+
accept: "image/*"
28+
};
29+
let model = {};
30+
let attributes = ["disabled", "placeholder", "readonly"];
31+
let input;
32+
33+
before(() => {
34+
createField(this, schema, model, false);
35+
input = el.getElementsByTagName("input")[0];
36+
field.schema.inputType = "file";
37+
});
38+
39+
it("should contain an input text element", () => {
40+
expect(field).to.be.exist;
41+
expect(field.$el).to.be.exist;
42+
43+
expect(input).to.be.defined;
44+
expect(input.type).to.be.equal("file");
45+
expect(input.classList.contains("form-control")).to.be.true;
46+
});
47+
48+
describe("check optional attribute", () => {
49+
attributes.forEach(function (name) {
50+
it("should set " + name, function (done) {
51+
checkAttribute(name, vm, input, field, schema, done);
52+
});
53+
});
54+
55+
it("should set name", () => {
56+
expect(input.name).to.be.equal("testupload");
57+
});
58+
59+
it("should set required", () => {
60+
expect(input.required).to.be.false;
61+
});
62+
63+
it("should set multiple", () => {
64+
expect(input.multiple).to.be.exist;
65+
});
66+
67+
it("should set accept", () => {
68+
expect(input.accept).to.be.equal("image/*");
69+
});
70+
71+
});
72+
73+
});
74+
});

0 commit comments

Comments
 (0)