"use strict";
|
|
exports.__esModule = true;
|
exports.default = void 0;
|
|
var _utils = require("../utils");
|
|
var _vnodes = require("../utils/vnodes");
|
|
var _createNamespace = (0, _utils.createNamespace)('form'),
|
createComponent = _createNamespace[0],
|
bem = _createNamespace[1];
|
|
var _default = createComponent({
|
props: {
|
colon: Boolean,
|
disabled: Boolean,
|
readonly: Boolean,
|
labelWidth: [Number, String],
|
labelAlign: String,
|
inputAlign: String,
|
scrollToError: Boolean,
|
validateFirst: Boolean,
|
errorMessageAlign: String,
|
submitOnEnter: {
|
type: Boolean,
|
default: true
|
},
|
validateTrigger: {
|
type: String,
|
default: 'onBlur'
|
},
|
showError: {
|
type: Boolean,
|
default: true
|
},
|
showErrorMessage: {
|
type: Boolean,
|
default: true
|
}
|
},
|
provide: function provide() {
|
return {
|
vanForm: this
|
};
|
},
|
data: function data() {
|
return {
|
fields: []
|
};
|
},
|
methods: {
|
getFieldsByNames: function getFieldsByNames(names) {
|
if (names) {
|
return this.fields.filter(function (field) {
|
return names.indexOf(field.name) !== -1;
|
});
|
}
|
|
return this.fields;
|
},
|
validateSeq: function validateSeq(names) {
|
var _this = this;
|
|
return new Promise(function (resolve, reject) {
|
var errors = [];
|
|
var fields = _this.getFieldsByNames(names);
|
|
fields.reduce(function (promise, field) {
|
return promise.then(function () {
|
if (!errors.length) {
|
return field.validate().then(function (error) {
|
if (error) {
|
errors.push(error);
|
}
|
});
|
}
|
});
|
}, Promise.resolve()).then(function () {
|
if (errors.length) {
|
reject(errors);
|
} else {
|
resolve();
|
}
|
});
|
});
|
},
|
validateFields: function validateFields(names) {
|
var _this2 = this;
|
|
return new Promise(function (resolve, reject) {
|
var fields = _this2.getFieldsByNames(names);
|
|
Promise.all(fields.map(function (item) {
|
return item.validate();
|
})).then(function (errors) {
|
errors = errors.filter(function (item) {
|
return item;
|
});
|
|
if (errors.length) {
|
reject(errors);
|
} else {
|
resolve();
|
}
|
});
|
});
|
},
|
// @exposed-api
|
validate: function validate(name) {
|
if (name && !Array.isArray(name)) {
|
return this.validateField(name);
|
}
|
|
return this.validateFirst ? this.validateSeq(name) : this.validateFields(name);
|
},
|
validateField: function validateField(name) {
|
var matched = this.fields.filter(function (item) {
|
return item.name === name;
|
});
|
|
if (matched.length) {
|
return new Promise(function (resolve, reject) {
|
matched[0].validate().then(function (error) {
|
if (error) {
|
reject(error);
|
} else {
|
resolve();
|
}
|
});
|
});
|
}
|
|
return Promise.reject();
|
},
|
// @exposed-api
|
resetValidation: function resetValidation(name) {
|
if (name && !Array.isArray(name)) {
|
name = [name];
|
}
|
|
var fields = this.getFieldsByNames(name);
|
fields.forEach(function (item) {
|
item.resetValidation();
|
});
|
},
|
// @exposed-api
|
scrollToField: function scrollToField(name, options) {
|
this.fields.some(function (item) {
|
if (item.name === name) {
|
item.$el.scrollIntoView(options);
|
return true;
|
}
|
|
return false;
|
});
|
},
|
addField: function addField(field) {
|
this.fields.push(field);
|
(0, _vnodes.sortChildren)(this.fields, this);
|
},
|
removeField: function removeField(field) {
|
this.fields = this.fields.filter(function (item) {
|
return item !== field;
|
});
|
},
|
getValues: function getValues() {
|
return this.fields.reduce(function (form, field) {
|
form[field.name] = field.formValue;
|
return form;
|
}, {});
|
},
|
onSubmit: function onSubmit(event) {
|
event.preventDefault();
|
this.submit();
|
},
|
// @exposed-api
|
submit: function submit() {
|
var _this3 = this;
|
|
var values = this.getValues();
|
this.validate().then(function () {
|
_this3.$emit('submit', values);
|
}).catch(function (errors) {
|
_this3.$emit('failed', {
|
values: values,
|
errors: errors
|
});
|
|
if (_this3.scrollToError) {
|
_this3.scrollToField(errors[0].name);
|
}
|
});
|
}
|
},
|
render: function render() {
|
var h = arguments[0];
|
return h("form", {
|
"class": bem(),
|
"on": {
|
"submit": this.onSubmit
|
}
|
}, [this.slots()]);
|
}
|
});
|
|
exports.default = _default;
|