UNPKG

chowa

Version:

UI component library based on React

163 lines (162 loc) 5.71 kB
/** * @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. */ "use strict"; 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;