|
|
@@ -1,4 +1,4 @@
|
|
|
-import React from 'react';
|
|
|
+import React, { PureComponent } from 'react';
|
|
|
import { Card, Button, Form, Icon, Col, Row, DatePicker, TimePicker, Input, Select, Popover } from 'antd';
|
|
|
import { connect } from 'dva';
|
|
|
import PageHeaderLayout from '../../layouts/PageHeaderLayout';
|
|
|
@@ -41,228 +41,231 @@ const tableData = [{
|
|
|
department: 'Sidney No. 1 Lake Park',
|
|
|
}];
|
|
|
|
|
|
-function AdvancedForm({ form, dispatch, submitting }) {
|
|
|
- const { getFieldDecorator, validateFieldsAndScroll, getFieldsError } = form;
|
|
|
- const validate = () => {
|
|
|
- validateFieldsAndScroll((error, values) => {
|
|
|
- if (!error) {
|
|
|
- // submit the values
|
|
|
- dispatch({
|
|
|
- type: 'form/submitAdvancedForm',
|
|
|
- payload: values,
|
|
|
- });
|
|
|
- }
|
|
|
- });
|
|
|
- };
|
|
|
- const errors = getFieldsError();
|
|
|
- const getErrorInfo = () => {
|
|
|
- const errorCount = Object.keys(errors).filter(key => errors[key]).length;
|
|
|
- if (!errors || errorCount === 0) {
|
|
|
- return null;
|
|
|
- }
|
|
|
- const scrollToField = (fieldKey) => {
|
|
|
- const labelNode = document.querySelector(`label[for="${fieldKey}"]`);
|
|
|
- if (labelNode) {
|
|
|
- labelNode.scrollIntoView(true);
|
|
|
- }
|
|
|
+class AdvancedForm extends PureComponent {
|
|
|
+ render() {
|
|
|
+ const { form, dispatch, submitting } = this.props;
|
|
|
+ const { getFieldDecorator, validateFieldsAndScroll, getFieldsError } = form;
|
|
|
+ const validate = () => {
|
|
|
+ validateFieldsAndScroll((error, values) => {
|
|
|
+ if (!error) {
|
|
|
+ // submit the values
|
|
|
+ dispatch({
|
|
|
+ type: 'form/submitAdvancedForm',
|
|
|
+ payload: values,
|
|
|
+ });
|
|
|
+ }
|
|
|
+ });
|
|
|
};
|
|
|
- const errorList = Object.keys(errors).map((key) => {
|
|
|
- if (!errors[key]) {
|
|
|
+ const errors = getFieldsError();
|
|
|
+ const getErrorInfo = () => {
|
|
|
+ const errorCount = Object.keys(errors).filter(key => errors[key]).length;
|
|
|
+ if (!errors || errorCount === 0) {
|
|
|
return null;
|
|
|
}
|
|
|
+ const scrollToField = (fieldKey) => {
|
|
|
+ const labelNode = document.querySelector(`label[for="${fieldKey}"]`);
|
|
|
+ if (labelNode) {
|
|
|
+ labelNode.scrollIntoView(true);
|
|
|
+ }
|
|
|
+ };
|
|
|
+ const errorList = Object.keys(errors).map((key) => {
|
|
|
+ if (!errors[key]) {
|
|
|
+ return null;
|
|
|
+ }
|
|
|
+ return (
|
|
|
+ <li key={key} className={styles.errorListItem} onClick={() => scrollToField(key)}>
|
|
|
+ <Icon type="cross-circle-o" className={styles.errorIcon} />
|
|
|
+ <div className={styles.errorMessage}>{errors[key][0]}</div>
|
|
|
+ <div className={styles.errorField}>{fieldLabels[key]}</div>
|
|
|
+ </li>
|
|
|
+ );
|
|
|
+ });
|
|
|
return (
|
|
|
- <li key={key} className={styles.errorListItem} onClick={() => scrollToField(key)}>
|
|
|
- <Icon type="cross-circle-o" className={styles.errorIcon} />
|
|
|
- <div className={styles.errorMessage}>{errors[key][0]}</div>
|
|
|
- <div className={styles.errorField}>{fieldLabels[key]}</div>
|
|
|
- </li>
|
|
|
+ <span className={styles.errorIcon}>
|
|
|
+ <Popover
|
|
|
+ title="表单校验信息"
|
|
|
+ content={errorList}
|
|
|
+ overlayClassName={styles.errorPopover}
|
|
|
+ trigger="click"
|
|
|
+ getPopupContainer={trigger => trigger.parentNode}
|
|
|
+ >
|
|
|
+ <Icon type="exclamation-circle" />
|
|
|
+ </Popover>
|
|
|
+ {errorCount}
|
|
|
+ </span>
|
|
|
);
|
|
|
- });
|
|
|
+ };
|
|
|
return (
|
|
|
- <span className={styles.errorIcon}>
|
|
|
- <Popover
|
|
|
- title="表单校验信息"
|
|
|
- content={errorList}
|
|
|
- overlayClassName={styles.errorPopover}
|
|
|
- trigger="click"
|
|
|
- getPopupContainer={trigger => trigger.parentNode}
|
|
|
- >
|
|
|
- <Icon type="exclamation-circle" />
|
|
|
- </Popover>
|
|
|
- {errorCount}
|
|
|
- </span>
|
|
|
+ <PageHeaderLayout
|
|
|
+ title="高级表单"
|
|
|
+ content="高级表单常见于一次性输入和提交大批量数据的场景。"
|
|
|
+ wrapperClassName={styles.advancedForm}
|
|
|
+ >
|
|
|
+ <Card title="仓库管理" className={styles.card} bordered={false}>
|
|
|
+ <Form layout="vertical" hideRequiredMark>
|
|
|
+ <Row gutter={16}>
|
|
|
+ <Col lg={6} md={12} sm={24}>
|
|
|
+ <Form.Item label={fieldLabels.name}>
|
|
|
+ {getFieldDecorator('name', {
|
|
|
+ rules: [{ required: true, message: '请输入仓库名称' }],
|
|
|
+ })(
|
|
|
+ <Input placeholder="请输入仓库名称" />
|
|
|
+ )}
|
|
|
+ </Form.Item>
|
|
|
+ </Col>
|
|
|
+ <Col xl={{ span: 6, offset: 2 }} lg={{ span: 8 }} md={{ span: 12 }} sm={24}>
|
|
|
+ <Form.Item label={fieldLabels.url}>
|
|
|
+ {getFieldDecorator('url', {
|
|
|
+ rules: [{ required: true, message: '请选择' }],
|
|
|
+ })(
|
|
|
+ <Input
|
|
|
+ style={{ width: '100%' }}
|
|
|
+ addonBefore="http://"
|
|
|
+ addonAfter=".com"
|
|
|
+ placeholder="请输入"
|
|
|
+ />
|
|
|
+ )}
|
|
|
+ </Form.Item>
|
|
|
+ </Col>
|
|
|
+ <Col xl={{ span: 8, offset: 2 }} lg={{ span: 10 }} md={{ span: 24 }} sm={24}>
|
|
|
+ <Form.Item label={fieldLabels.owner}>
|
|
|
+ {getFieldDecorator('owner', {
|
|
|
+ rules: [{ required: true, message: '请选择管理员' }],
|
|
|
+ })(
|
|
|
+ <Select placeholder="请选择管理员">
|
|
|
+ <Option value="xiao">付晓晓</Option>
|
|
|
+ <Option value="mao">周毛毛</Option>
|
|
|
+ </Select>
|
|
|
+ )}
|
|
|
+ </Form.Item>
|
|
|
+ </Col>
|
|
|
+ </Row>
|
|
|
+ <Row gutter={16}>
|
|
|
+ <Col lg={6} md={12} sm={24}>
|
|
|
+ <Form.Item label={fieldLabels.approver}>
|
|
|
+ {getFieldDecorator('approver', {
|
|
|
+ rules: [{ required: true, message: '请选择审批员' }],
|
|
|
+ })(
|
|
|
+ <Select placeholder="请选择审批员">
|
|
|
+ <Option value="xiao">付晓晓</Option>
|
|
|
+ <Option value="mao">周毛毛</Option>
|
|
|
+ </Select>
|
|
|
+ )}
|
|
|
+ </Form.Item>
|
|
|
+ </Col>
|
|
|
+ <Col xl={{ span: 6, offset: 2 }} lg={{ span: 8 }} md={{ span: 12 }} sm={24}>
|
|
|
+ <Form.Item label={fieldLabels.dateRange}>
|
|
|
+ {getFieldDecorator('dateRange', {
|
|
|
+ rules: [{ required: true, message: '请选择生效日期' }],
|
|
|
+ })(
|
|
|
+ <RangePicker placeholder={['开始日期', '结束日期']} style={{ width: '100%' }} />
|
|
|
+ )}
|
|
|
+ </Form.Item>
|
|
|
+ </Col>
|
|
|
+ <Col xl={{ span: 8, offset: 2 }} lg={{ span: 10 }} md={{ span: 24 }} sm={24}>
|
|
|
+ <Form.Item label={fieldLabels.type}>
|
|
|
+ {getFieldDecorator('type', {
|
|
|
+ rules: [{ required: true, message: '请选择仓库类型' }],
|
|
|
+ })(
|
|
|
+ <Select placeholder="请选择仓库类型">
|
|
|
+ <Option value="private">私密</Option>
|
|
|
+ <Option value="public">公开</Option>
|
|
|
+ </Select>
|
|
|
+ )}
|
|
|
+ </Form.Item>
|
|
|
+ </Col>
|
|
|
+ </Row>
|
|
|
+ </Form>
|
|
|
+ </Card>
|
|
|
+ <Card title="任务管理" className={styles.card} bordered={false}>
|
|
|
+ <Form layout="vertical" hideRequiredMark>
|
|
|
+ <Row gutter={16}>
|
|
|
+ <Col lg={6} md={12} sm={24}>
|
|
|
+ <Form.Item label={fieldLabels.name2}>
|
|
|
+ {getFieldDecorator('name2', {
|
|
|
+ rules: [{ required: true, message: '请输入' }],
|
|
|
+ })(
|
|
|
+ <Input placeholder="请输入" />
|
|
|
+ )}
|
|
|
+ </Form.Item>
|
|
|
+ </Col>
|
|
|
+ <Col xl={{ span: 6, offset: 2 }} lg={{ span: 8 }} md={{ span: 12 }} sm={24}>
|
|
|
+ <Form.Item label={fieldLabels.url2}>
|
|
|
+ {getFieldDecorator('url2', {
|
|
|
+ rules: [{ required: true, message: '请选择' }],
|
|
|
+ })(
|
|
|
+ <Input placeholder="请输入" />
|
|
|
+ )}
|
|
|
+ </Form.Item>
|
|
|
+ </Col>
|
|
|
+ <Col xl={{ span: 8, offset: 2 }} lg={{ span: 10 }} md={{ span: 24 }} sm={24}>
|
|
|
+ <Form.Item label={fieldLabels.owner2}>
|
|
|
+ {getFieldDecorator('owner2', {
|
|
|
+ rules: [{ required: true, message: '请选择管理员' }],
|
|
|
+ })(
|
|
|
+ <Select placeholder="请选择管理员">
|
|
|
+ <Option value="xiao">付晓晓</Option>
|
|
|
+ <Option value="mao">周毛毛</Option>
|
|
|
+ </Select>
|
|
|
+ )}
|
|
|
+ </Form.Item>
|
|
|
+ </Col>
|
|
|
+ </Row>
|
|
|
+ <Row gutter={16}>
|
|
|
+ <Col lg={6} md={12} sm={24}>
|
|
|
+ <Form.Item label={fieldLabels.approver2}>
|
|
|
+ {getFieldDecorator('approver2', {
|
|
|
+ rules: [{ required: true, message: '请选择审批员' }],
|
|
|
+ })(
|
|
|
+ <Select placeholder="请选择审批员">
|
|
|
+ <Option value="xiao">付晓晓</Option>
|
|
|
+ <Option value="mao">周毛毛</Option>
|
|
|
+ </Select>
|
|
|
+ )}
|
|
|
+ </Form.Item>
|
|
|
+ </Col>
|
|
|
+ <Col xl={{ span: 6, offset: 2 }} lg={{ span: 8 }} md={{ span: 12 }} sm={24}>
|
|
|
+ <Form.Item label={fieldLabels.dateRange2}>
|
|
|
+ {getFieldDecorator('dateRange2', {
|
|
|
+ rules: [{ required: true, message: '请输入' }],
|
|
|
+ })(
|
|
|
+ <TimePicker
|
|
|
+ placeholder="提醒时间"
|
|
|
+ style={{ width: '100%' }}
|
|
|
+ getPopupContainer={trigger => trigger.parentNode}
|
|
|
+ />
|
|
|
+ )}
|
|
|
+ </Form.Item>
|
|
|
+ </Col>
|
|
|
+ <Col xl={{ span: 8, offset: 2 }} lg={{ span: 10 }} md={{ span: 24 }} sm={24}>
|
|
|
+ <Form.Item label={fieldLabels.type2}>
|
|
|
+ {getFieldDecorator('type2', {
|
|
|
+ rules: [{ required: true, message: '请选择仓库类型' }],
|
|
|
+ })(
|
|
|
+ <Select placeholder="请选择仓库类型">
|
|
|
+ <Option value="private">私密</Option>
|
|
|
+ <Option value="public">公开</Option>
|
|
|
+ </Select>
|
|
|
+ )}
|
|
|
+ </Form.Item>
|
|
|
+ </Col>
|
|
|
+ </Row>
|
|
|
+ </Form>
|
|
|
+ </Card>
|
|
|
+ <Card title="成员管理" className={styles.card} bordered={false}>
|
|
|
+ {getFieldDecorator('members', {
|
|
|
+ initialValue: tableData,
|
|
|
+ })(<TableForm />)}
|
|
|
+ </Card>
|
|
|
+ <FooterToolbar>
|
|
|
+ {getErrorInfo()}
|
|
|
+ <Button type="primary" onClick={validate} loading={submitting}>
|
|
|
+ 提交
|
|
|
+ </Button>
|
|
|
+ </FooterToolbar>
|
|
|
+ </PageHeaderLayout>
|
|
|
);
|
|
|
- };
|
|
|
- return (
|
|
|
- <PageHeaderLayout
|
|
|
- title="高级表单"
|
|
|
- content="高级表单常见于一次性输入和提交大批量数据的场景。"
|
|
|
- wrapperClassName={styles.advancedForm}
|
|
|
- >
|
|
|
- <Card title="仓库管理" className={styles.card} bordered={false}>
|
|
|
- <Form layout="vertical" hideRequiredMark>
|
|
|
- <Row gutter={16}>
|
|
|
- <Col lg={6} md={12} sm={24}>
|
|
|
- <Form.Item label={fieldLabels.name}>
|
|
|
- {getFieldDecorator('name', {
|
|
|
- rules: [{ required: true, message: '请输入仓库名称' }],
|
|
|
- })(
|
|
|
- <Input placeholder="请输入仓库名称" />
|
|
|
- )}
|
|
|
- </Form.Item>
|
|
|
- </Col>
|
|
|
- <Col xl={{ span: 6, offset: 2 }} lg={{ span: 8 }} md={{ span: 12 }} sm={24}>
|
|
|
- <Form.Item label={fieldLabels.url}>
|
|
|
- {getFieldDecorator('url', {
|
|
|
- rules: [{ required: true, message: '请选择' }],
|
|
|
- })(
|
|
|
- <Input
|
|
|
- style={{ width: '100%' }}
|
|
|
- addonBefore="http://"
|
|
|
- addonAfter=".com"
|
|
|
- placeholder="请输入"
|
|
|
- />
|
|
|
- )}
|
|
|
- </Form.Item>
|
|
|
- </Col>
|
|
|
- <Col xl={{ span: 8, offset: 2 }} lg={{ span: 10 }} md={{ span: 24 }} sm={24}>
|
|
|
- <Form.Item label={fieldLabels.owner}>
|
|
|
- {getFieldDecorator('owner', {
|
|
|
- rules: [{ required: true, message: '请选择管理员' }],
|
|
|
- })(
|
|
|
- <Select placeholder="请选择管理员">
|
|
|
- <Option value="xiao">付晓晓</Option>
|
|
|
- <Option value="mao">周毛毛</Option>
|
|
|
- </Select>
|
|
|
- )}
|
|
|
- </Form.Item>
|
|
|
- </Col>
|
|
|
- </Row>
|
|
|
- <Row gutter={16}>
|
|
|
- <Col lg={6} md={12} sm={24}>
|
|
|
- <Form.Item label={fieldLabels.approver}>
|
|
|
- {getFieldDecorator('approver', {
|
|
|
- rules: [{ required: true, message: '请选择审批员' }],
|
|
|
- })(
|
|
|
- <Select placeholder="请选择审批员">
|
|
|
- <Option value="xiao">付晓晓</Option>
|
|
|
- <Option value="mao">周毛毛</Option>
|
|
|
- </Select>
|
|
|
- )}
|
|
|
- </Form.Item>
|
|
|
- </Col>
|
|
|
- <Col xl={{ span: 6, offset: 2 }} lg={{ span: 8 }} md={{ span: 12 }} sm={24}>
|
|
|
- <Form.Item label={fieldLabels.dateRange}>
|
|
|
- {getFieldDecorator('dateRange', {
|
|
|
- rules: [{ required: true, message: '请选择生效日期' }],
|
|
|
- })(
|
|
|
- <RangePicker placeholder={['开始日期', '结束日期']} style={{ width: '100%' }} />
|
|
|
- )}
|
|
|
- </Form.Item>
|
|
|
- </Col>
|
|
|
- <Col xl={{ span: 8, offset: 2 }} lg={{ span: 10 }} md={{ span: 24 }} sm={24}>
|
|
|
- <Form.Item label={fieldLabels.type}>
|
|
|
- {getFieldDecorator('type', {
|
|
|
- rules: [{ required: true, message: '请选择仓库类型' }],
|
|
|
- })(
|
|
|
- <Select placeholder="请选择仓库类型">
|
|
|
- <Option value="private">私密</Option>
|
|
|
- <Option value="public">公开</Option>
|
|
|
- </Select>
|
|
|
- )}
|
|
|
- </Form.Item>
|
|
|
- </Col>
|
|
|
- </Row>
|
|
|
- </Form>
|
|
|
- </Card>
|
|
|
- <Card title="任务管理" className={styles.card} bordered={false}>
|
|
|
- <Form layout="vertical" hideRequiredMark>
|
|
|
- <Row gutter={16}>
|
|
|
- <Col lg={6} md={12} sm={24}>
|
|
|
- <Form.Item label={fieldLabels.name2}>
|
|
|
- {getFieldDecorator('name2', {
|
|
|
- rules: [{ required: true, message: '请输入' }],
|
|
|
- })(
|
|
|
- <Input placeholder="请输入" />
|
|
|
- )}
|
|
|
- </Form.Item>
|
|
|
- </Col>
|
|
|
- <Col xl={{ span: 6, offset: 2 }} lg={{ span: 8 }} md={{ span: 12 }} sm={24}>
|
|
|
- <Form.Item label={fieldLabels.url2}>
|
|
|
- {getFieldDecorator('url2', {
|
|
|
- rules: [{ required: true, message: '请选择' }],
|
|
|
- })(
|
|
|
- <Input placeholder="请输入" />
|
|
|
- )}
|
|
|
- </Form.Item>
|
|
|
- </Col>
|
|
|
- <Col xl={{ span: 8, offset: 2 }} lg={{ span: 10 }} md={{ span: 24 }} sm={24}>
|
|
|
- <Form.Item label={fieldLabels.owner2}>
|
|
|
- {getFieldDecorator('owner2', {
|
|
|
- rules: [{ required: true, message: '请选择管理员' }],
|
|
|
- })(
|
|
|
- <Select placeholder="请选择管理员">
|
|
|
- <Option value="xiao">付晓晓</Option>
|
|
|
- <Option value="mao">周毛毛</Option>
|
|
|
- </Select>
|
|
|
- )}
|
|
|
- </Form.Item>
|
|
|
- </Col>
|
|
|
- </Row>
|
|
|
- <Row gutter={16}>
|
|
|
- <Col lg={6} md={12} sm={24}>
|
|
|
- <Form.Item label={fieldLabels.approver2}>
|
|
|
- {getFieldDecorator('approver2', {
|
|
|
- rules: [{ required: true, message: '请选择审批员' }],
|
|
|
- })(
|
|
|
- <Select placeholder="请选择审批员">
|
|
|
- <Option value="xiao">付晓晓</Option>
|
|
|
- <Option value="mao">周毛毛</Option>
|
|
|
- </Select>
|
|
|
- )}
|
|
|
- </Form.Item>
|
|
|
- </Col>
|
|
|
- <Col xl={{ span: 6, offset: 2 }} lg={{ span: 8 }} md={{ span: 12 }} sm={24}>
|
|
|
- <Form.Item label={fieldLabels.dateRange2}>
|
|
|
- {getFieldDecorator('dateRange2', {
|
|
|
- rules: [{ required: true, message: '请输入' }],
|
|
|
- })(
|
|
|
- <TimePicker
|
|
|
- placeholder="提醒时间"
|
|
|
- style={{ width: '100%' }}
|
|
|
- getPopupContainer={trigger => trigger.parentNode}
|
|
|
- />
|
|
|
- )}
|
|
|
- </Form.Item>
|
|
|
- </Col>
|
|
|
- <Col xl={{ span: 8, offset: 2 }} lg={{ span: 10 }} md={{ span: 24 }} sm={24}>
|
|
|
- <Form.Item label={fieldLabels.type2}>
|
|
|
- {getFieldDecorator('type2', {
|
|
|
- rules: [{ required: true, message: '请选择仓库类型' }],
|
|
|
- })(
|
|
|
- <Select placeholder="请选择仓库类型">
|
|
|
- <Option value="private">私密</Option>
|
|
|
- <Option value="public">公开</Option>
|
|
|
- </Select>
|
|
|
- )}
|
|
|
- </Form.Item>
|
|
|
- </Col>
|
|
|
- </Row>
|
|
|
- </Form>
|
|
|
- </Card>
|
|
|
- <Card title="成员管理" className={styles.card} bordered={false}>
|
|
|
- {getFieldDecorator('members', {
|
|
|
- initialValue: tableData,
|
|
|
- })(<TableForm />)}
|
|
|
- </Card>
|
|
|
- <FooterToolbar>
|
|
|
- {getErrorInfo()}
|
|
|
- <Button type="primary" onClick={validate} loading={submitting}>
|
|
|
- 提交
|
|
|
- </Button>
|
|
|
- </FooterToolbar>
|
|
|
- </PageHeaderLayout>
|
|
|
- );
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
export default connect(state => ({
|