|
|
|
@ -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 => ({ |
|
|
|
|