chowa
Version:
UI component library based on React
163 lines (162 loc) • 5.71 kB
JavaScript
/**
* @license chowa v1.1.3
*
* Copyright (c) Chowa Techonlogies Co.,Ltd.(http://www.chowa.cn).
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*/
;
Object.defineProperty(exports, "__esModule", { value: true });
const React = require("react");
const form_validator_1 = require("./form-validator");
function createForm() {
class FormValidation extends React.PureComponent {
constructor(props) {
super(props);
this.state = {
fields: {}
};
[
'removeField',
'appendField',
'updateField',
'verify',
'getValues',
'getFieldValue',
'createValidator',
'resetFields',
'resetValidator'
].forEach((fn) => {
this[fn] = this[fn].bind(this);
});
}
removeField(name) {
const { fields } = this.state;
delete fields[name];
this.setState({
fields
});
}
appendField(name, params) {
const { fields } = this.state;
if (name in fields) {
throw new Error(`Form '${name}' already exists in fields`);
}
this.setState({
fields: Object.assign(fields, {
[name]: params
})
});
}
updateField(name, params) {
const { fields } = this.state;
this.setState({
fields: Object.assign(fields, {
[name]: Object.assign(fields[name], params)
})
});
}
verify(cb) {
const { fields } = this.state;
let error = false;
Object.keys(fields).forEach((name) => {
const status = fields[name].verifyFiled();
if (status) {
error = true;
}
});
if (typeof cb === 'function') {
cb(error, this.getValues());
}
}
getValues() {
const { fields } = this.state;
const values = {};
Object.keys(fields).forEach((name) => {
values[name] = fields[name].value;
});
return values;
}
getFieldValue(name) {
const { fields } = this.state;
if (!(name in fields)) {
throw new Error(`Form '${name}' does not exist fields`);
}
return fields[name].value;
}
resetFields(name, value) {
const { fields } = this.state;
if (name) {
value = value ? value : undefined;
this.setState({
fields: Object.assign(fields, {
[name]: Object.assign(fields[name], { value })
})
}, () => {
fields[name].resetFiled(value);
});
}
else {
const newFields = {};
Object.keys(fields).forEach((fieldName) => {
newFields[fieldName] = Object.assign(Object.assign({}, fields[fieldName]), { value: fields[fieldName].resetFiled(), error: false });
});
this.setState({
fields: newFields
});
}
}
resetValidator(name) {
const { fields } = this.state;
if (name) {
this.setState({
fields: Object.assign(fields, {
[name]: Object.assign(fields[name], { error: false })
})
}, () => {
fields[name].resetValidator();
});
}
else {
const newFields = {};
Object.keys(fields).forEach((fieldName) => {
newFields[fieldName] = Object.assign(Object.assign({}, fields[fieldName]), { value: fields[fieldName].resetValidator(), error: false });
});
this.setState({
fields: newFields
});
}
}
createValidator({ children, name, rules }) {
const validatorProps = {
name,
rules,
appendField: this.appendField,
removeField: this.removeField,
updateField: this.updateField
};
return (React.createElement(form_validator_1.default, Object.assign({}, validatorProps), children));
}
render() {
const { component, forwardedRef } = this.props;
const formProps = {
Validator: this.createValidator,
verify: this.verify,
getValues: this.getValues,
getFieldValue: this.getFieldValue,
resetFields: this.resetFields,
resetValidator: this.resetValidator
};
return React.createElement(component, Object.assign({ ref: forwardedRef, form: formProps }, this.props));
}
}
return (component) => {
function validatorWrapper(props, ref) {
return React.createElement(FormValidation, Object.assign({}, props, { component: component, forwardedRef: ref }));
}
validatorWrapper.displayName = component.name || component.displayName;
return React.forwardRef(validatorWrapper);
};
}
exports.default = createForm;