123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301 |
- import React, { PureComponent } from 'react';
- import {
- Card,
- Button,
- Form,
- Icon,
- Col,
- Row,
- DatePicker,
- TimePicker,
- Input,
- Select,
- Popover,
- } from 'antd';
- import { connect } from 'dva';
- import FooterToolbar from 'components/FooterToolbar';
- import PageHeaderLayout from '../../layouts/PageHeaderLayout';
- import TableForm from './TableForm';
- import styles from './style.less';
-
- const { Option } = Select;
- const { RangePicker } = DatePicker;
-
- const fieldLabels = {
- name: '仓库名',
- url: '仓库域名',
- owner: '仓库管理员',
- approver: '审批人',
- dateRange: '生效日期',
- type: '仓库类型',
- name2: '任务名',
- url2: '任务描述',
- owner2: '执行人',
- approver2: '责任人',
- dateRange2: '生效日期',
- type2: '任务类型',
- };
-
- const tableData = [
- {
- key: '1',
- workId: '00001',
- name: 'John Brown',
- department: 'New York No. 1 Lake Park',
- },
- {
- key: '2',
- workId: '00002',
- name: 'Jim Green',
- department: 'London No. 1 Lake Park',
- },
- {
- key: '3',
- workId: '00003',
- name: 'Joe Black',
- department: 'Sidney No. 1 Lake Park',
- },
- ];
-
- class AdvancedForm extends PureComponent {
- state = {
- width: '100%',
- };
- componentDidMount() {
- window.addEventListener('resize', this.resizeFooterToolbar);
- }
- componentWillUnmount() {
- window.removeEventListener('resize', this.resizeFooterToolbar);
- }
- resizeFooterToolbar = () => {
- const sider = document.querySelectorAll('.ant-layout-sider')[0];
- const width = `calc(100% - ${sider.style.width})`;
- if (this.state.width !== width) {
- this.setState({ width });
- }
- };
- 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 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 (
- <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 (
- <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="成员管理" bordered={false}>
- {getFieldDecorator('members', {
- initialValue: tableData,
- })(<TableForm />)}
- </Card>
- <FooterToolbar style={{ width: this.state.width }}>
- {getErrorInfo()}
- <Button type="primary" onClick={validate} loading={submitting}>
- 提交
- </Button>
- </FooterToolbar>
- </PageHeaderLayout>
- );
- }
- }
-
- export default connect(({ global, loading }) => ({
- collapsed: global.collapsed,
- submitting: loading.effects['form/submitAdvancedForm'],
- }))(Form.create()(AdvancedForm));
|