1
0

index.js 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  1. import React, { Component } from 'react';
  2. import moment from 'moment';
  3. import { Form, Button, Switch, DatePicker, Input, InputNumber, Modal, Alert } from 'antd';
  4. import Select from '../../components/Select';
  5. import Multiple from '../../components/Multiple';
  6. import Radio from '../../components/Radio';
  7. import TreeSelect from '../../components/TreeSelect';
  8. import './index.less';
  9. const { TextArea } = Input;
  10. class FormLayout extends Component {
  11. constructor(props) {
  12. super(props);
  13. this.state = { show: !!props.modal, loading: false, err: '' };
  14. }
  15. onConfirm() {
  16. this.props.form.validateFields((err, fieldsValue) => {
  17. if (err) {
  18. return;
  19. }
  20. if (this.props.onConfirm && this.props.modal) {
  21. this.setState({ loading: true });
  22. this.props
  23. .onConfirm(fieldsValue)
  24. .then(() => {
  25. this.setState({ loading: false });
  26. this.onCancel();
  27. })
  28. .catch(e => {
  29. this.setState({ loading: false, err: e.message });
  30. });
  31. } else {
  32. this.onCancel();
  33. }
  34. });
  35. }
  36. onCancel() {
  37. if (this.props.modal) this.setState({ show: false });
  38. if (this.props.onCancel) this.props.onCancel();
  39. }
  40. getItem(item) {
  41. switch (item.type) {
  42. case 'tree':
  43. return (
  44. <TreeSelect
  45. {...item}
  46. className={item.class}
  47. disabled={!!item.disabled}
  48. placeholder={item.placeholder}
  49. isNode={item.isNode}
  50. treeDefaultExpandAll
  51. treeData={item.tree}
  52. loadData={item.loadData}
  53. initData={item.initData}
  54. ignore={item.ignore}
  55. />
  56. );
  57. case 'radio':
  58. return <Radio {...item} className={item.class} select={item.select} disabled={!!item.disabled} />;
  59. case 'select':
  60. return (
  61. <Select
  62. {...item}
  63. className={item.class}
  64. select={item.select}
  65. placeholder={item.placeholder}
  66. disabled={!!item.disabled}
  67. />
  68. );
  69. case 'multiple':
  70. return (
  71. <Multiple
  72. {...item}
  73. className={item.class}
  74. select={item.select}
  75. placeholder={item.placeholder}
  76. disabled={!!item.disabled}
  77. />
  78. );
  79. case 'render':
  80. return item.render(item, this.props.data, this.props.form);
  81. case 'textarea':
  82. return <TextArea {...item} autosize className={item.class} placeholder={item.placeholder} disabled={!!item.disabled} />;
  83. case 'password':
  84. case 'input':
  85. return (
  86. <Input
  87. {...item}
  88. className={item.class}
  89. placeholder={item.placeholder}
  90. readOnly={!!item.readOnly}
  91. disabled={!!item.disabled}
  92. />
  93. );
  94. case 'number':
  95. return (
  96. <InputNumber
  97. {...item}
  98. className={item.class}
  99. placeholder={item.placeholder}
  100. readOnly={!!item.readOnly}
  101. disabled={!!item.disabled}
  102. />
  103. );
  104. case 'switch':
  105. return <Switch {...item} className={item.class} disabled={!!item.disabled} />;
  106. case 'date':
  107. return <DatePicker {...item} className={item.class} placeholder={item.placeholder} disabled={!!item.disabled} />;
  108. case 'hidden':
  109. return <Input type="hidden" />;
  110. // case 'image':
  111. // case 'logo':
  112. // case 'file':
  113. // return (
  114. // <FileUpload
  115. // {...item}
  116. // onUpload={this.props.onUpload}
  117. // title={item.name}
  118. // onError={err => {
  119. // this.props.form.setFields({ [item.key]: { value: '', errors: [err] } });
  120. // }}
  121. // />
  122. // );
  123. default:
  124. return <div />;
  125. }
  126. }
  127. formatData(data, item) {
  128. switch (item.type) {
  129. case 'date':
  130. return moment(data[item.key]);
  131. default:
  132. return data[item.key];
  133. }
  134. }
  135. getForm() {
  136. const {
  137. modal,
  138. itemList = [],
  139. confirmText = '确定',
  140. cancelText = '取消',
  141. data = {},
  142. layoutCol = { labelCol: { span: 4 }, wrapperCol: { span: 20 } },
  143. } = this.props;
  144. const { getFieldDecorator } = this.props.form;
  145. return (
  146. <Form>
  147. {itemList.map((item, index) => {
  148. if (item.hidden) return '';
  149. const defaultOption = { rules: [] };
  150. const option = item.option ? Object.assign(defaultOption, item.option) : defaultOption;
  151. if (data && data[item.key]) {
  152. option.initialValue = this.formatData(data, item);
  153. }
  154. if (item.required) {
  155. option.rules.push({ required: true, message: item.placeholder });
  156. }
  157. if (item.type === 'hidden') {
  158. return <div>{getFieldDecorator(item.key, option)(this.getItem(item, option))}</div>;
  159. }
  160. return (
  161. <Form.Item {...layoutCol} key={index} label={item.name}>
  162. {getFieldDecorator(item.key, option)(this.getItem(item, option))}
  163. </Form.Item>
  164. );
  165. })}
  166. {!modal && (
  167. <Form.Item wrapperCol={{ offset: 6 }}>
  168. <Button type="primary" onClick={() => this.onConfirm()} style={{ marginRight: 20 }}>
  169. {confirmText}
  170. </Button>
  171. <Button onClick={() => this.onCancel()}>{cancelText}</Button>
  172. </Form.Item>
  173. )}
  174. </Form>
  175. );
  176. }
  177. render() {
  178. const { modal, title, confirmText = '确定', cancelText = '取消' } = this.props;
  179. const { show, loading, err } = this.state;
  180. return modal ? (
  181. <Modal
  182. title={title}
  183. visible={show}
  184. className="form-layout"
  185. okText={confirmText}
  186. cancelText={cancelText}
  187. confirmLoading={loading}
  188. onOk={() => this.onConfirm()}
  189. onCancel={() => this.onCancel()}
  190. >
  191. {err && <Alert type="error" showIcon message={err} closable onClose={() => this.setState({ err: '' })} />}
  192. {this.getForm()}
  193. </Modal>
  194. ) : (<div className="form-layout">{this.getForm()}</div>);
  195. }
  196. }
  197. export default Form.create()(FormLayout);