import React, { PureComponent } from 'react'; import { routerRedux } from 'dva/router'; import PropTypes from 'prop-types'; import queryString from 'query-string'; import { connect } from 'dva'; import { Upload, Spin, Switch, Popover, Badge, Table, Radio, Card, Form, Input, Icon, Button, Select } from 'antd'; import PageHeaderLayout from '../../../layouts/PageHeaderLayout'; import CourseSelectModal from './course'; import SupportSelectModal from './support'; import PackageSelectModal from './package'; import { Codes, productType } from '../../../utils/config'; import styles from './index.less'; const RadioGroup = Radio.Group; const FormItem = Form.Item; const Option = Select.Option; const { Meta } = Card; const { TextArea } = Input; @Form.create() @connect(state => ({ course: state.course, support: state.support, combo: state.combo, merchant: state.merchant, goodsDetail: state.goodsDetail, })) export default class GoodsAdd extends PureComponent { state = { radioType: Codes.CODE_COURSE, curClickedBtn: null, courseModalVisible: false, supportModalVisible: false, packageModalVisible: false, selectItem: null, }; componentDidMount() { const { dispatch } = this.props; dispatch({ type: 'merchant/query', payload: { pageNo: 1, pageSize: 1000, status: Codes.CODE_NORMAL, domain: Codes.CODE_PJ, } }) } handleRadioOnChange = (e) => { this.setState({ radioType: e.target.value }); } handleModalSearch = (data) => { const { curClickedBtn } = this.state; const { dispatch } = this.props; const newData = { ...data }; if (newData.keyword) { newData[newData.field] = newData.keyword; delete newData.field; delete newData.keyword; } else { delete newData.field; delete newData.keyword; } if (curClickedBtn === Codes.CODE_COURSE) { dispatch({ type: 'course/query', payload: { ...newData, pageNo: 1, pageSize: 10, status: Codes.CODE_NORMAL }, }); } } handleModalOk = (data) => { const { curClickedBtn } = this.state; const { dispatch } = this.props; if (curClickedBtn === Codes.CODE_COURSE) { this.setState({ selectItem: data, courseModalVisible: false, }); } else if(curClickedBtn === Codes.CODE_SUPPORT) { this.setState({ selectItem: data, supportModalVisible: false, }); } else if (curClickedBtn === Codes.CODE_PACKAGE) { this.setState({ selectItem: data, packageModalVisible: false, }); } } handleModalCancel = () => { const { curClickedBtn } = this.state; const { dispatch } = this.props; if (curClickedBtn === Codes.CODE_COURSE) { this.setState({ courseModalVisible: false }); } else if (curClickedBtn === Codes.CODE_SUPPORT) { this.setState({ supportModalVisible: false }); } else if (curClickedBtn === Codes.CODE_PACKAGE) { this.setState({ packageModalVisible: false }); } } handleModalShow = (name) => { const { dispatch } = this.props; if (name === Codes.CODE_COURSE) { this.setState({ curClickedBtn: name, courseModalVisible: true, }, () => { dispatch({ type: 'course/query', payload: { pageNo: 1, pageSize: 10, status: Codes.CODE_NORMAL, } }); }) } else if (name === Codes.CODE_SUPPORT) { this.setState({ curClickedBtn: name, supportModalVisible: true, }, () => { dispatch({ type: 'support/query', payload: { pageNo: 1, pageSize: 10, status: Codes.CODE_NORMAL, } }); }) } else if (name === Codes.CODE_PACKAGE) { this.setState({ curClickedBtn: name, packageModalVisible: true, }, () => { dispatch({ type: 'combo/query', payload: { pageNo: 1, pageSize: 10, status: Codes.CODE_NORMAL, } }); }) } } handleModalTableChange = () => { const { curClickedBtn } = this.state; const { dispatch } = this.props; const newFilters = { ...filters }; if (newFilters.keyword) { newFilters[newFilters.field] = newFilters.keyword; delete newFilters.field; delete newFilters.keyword; } else { delete newFilters.field; delete newFilters.keyword; } const getValue = obj => Object.keys(obj).map(key => obj[key]).join(','); const tableFilters = Object.keys(filterArgs).reduce((obj, key) => { const newObj = { ...obj }; newObj[key] = getValue(filterArgs[key]); return newObj; }, {}); const data = { ...newFilters, ...tableFilters, pageNo: pagination.current, pageSize: pagination.pageSize }; Object.keys(data).map(key => data[key] ? null : delete data[key]); if (curClickedBtn === Codes.CODE_COURSE) { dispatch({ type: 'course/query', payload: { ...data, status: Codes.CODE_NORMAL } }); } else if (curClickedBtn === Codes.CODE_SUPPORT) { dispatch({ type: 'support/query', payload: { ...data, status: Codes.CODE_NORMAL } }); } else if (curClickedBtn === Codes.CODE_PACKAGE) { dispatch({ type: 'combo/query', payload: { ...data, status: Codes.CODE_PACKAGE } }); } } handlePageSubmit = (e) => { e.preventDefault(); const { dispatch, form: { validateFields, getFieldsValue, resetFields, }, goodsDetail: { filters, } } = this.props; const { selectItem, radioType, } = this.state; validateFields(errors => { if (errors) return; const data = { ...getFieldsValue(['merchantId', 'status']), pid: selectItem.pid, }; data.status ? data.status = Codes.CODE_NORMAL : data.status = Codes.CODE_DELETE; dispatch({ type: `goodsDetail/createMerchantProduct`, payload: data, callback: () => { dispatch( routerRedux.push({ pathname: '/goods', search: queryString.stringify(filters), }) ); resetFields(); } }); }); } handlePageCancel = () => { const { dispatch, goodsDetail: { filters } } = this.props; dispatch( routerRedux.push({ pathname: '/goods', search: queryString.stringify(filters), }) ); } renderLabelName = () => { const { radioType } = this.state; switch (radioType) { case Codes.CODE_COURSE: return '选择课程'; break; case Codes.CODE_SUPPORT: return '选择配套'; break; case Codes.CODE_PACKAGE: return '选择课程包'; break; default: break; } } render() { const formItemLayout = { labelCol: { span: 7, }, wrapperCol: { span: 12, }, }; const submitFormLayout = { wrapperCol: { xs: { span: 24, offset: 0 }, sm: { span: 10, offset: 7 }, }, }; const { form: { getFieldDecorator }, item = {}, course, merchant, support, combo } = this.props; const { radioType, selectItem, courseModalVisible, supportModalVisible, packageModalVisible, } = this.state; return ( <PageHeaderLayout> <Card> <Form layout="horizontal" onSubmit={this.handlePageSubmit}> <FormItem label="选择渠道:" {...formItemLayout}> {getFieldDecorator('merchantId', { rules: [{ required: true, type: 'string', message: '此项为必选项!' }], })(<Select placeholder="请选择" style={{ width: '43%' }}>{merchant.list.map(item => <Option value={item.id} key={item.id}>{item.name}</Option>)}</Select>)} </FormItem> <FormItem label="产品类型:" {...formItemLayout}> {getFieldDecorator('type', { rules: [{ required: true, type: 'string', message: '请选择产品类型!' }], initialValue: radioType, })( <RadioGroup onChange={this.handleRadioOnChange}> {Object.keys(productType).map(key => <Radio value={key} key={key}>{productType[key]}</Radio>) } </RadioGroup> )} </FormItem> <FormItem label={this.renderLabelName()} {...formItemLayout}> <Button size="small" type="primary" icon="select" onClick={() => this.handleModalShow(radioType)}>选择</Button> </FormItem> <FormItem {...submitFormLayout}> {selectItem ? <Card title={selectItem.name} hoverable cover={<img alt="暂无封面图片" src={selectItem.coverUrl} />} style={{ width: '50%' }} > </Card> : <Button type="dashed" className={styles.newButton}>未选择</Button> } </FormItem> <FormItem label="上架状态:" {...formItemLayout}> {getFieldDecorator('status', { valuePropsName: 'checked', })(<Switch defaultChecked={false} checkedChildren="出售" unCheckedChildren="下架" />)} </FormItem> <FormItem {...submitFormLayout} style={{ marginTop: 32 }}> <Button onClick={this.handlePageCancel}>取消</Button> <Button type="primary" style={{ marginLeft: 35 }} htmlType="submit">提交</Button> </FormItem> </Form> {/*查询课程的模态选择框*/} <CourseSelectModal rowKeyName="id" modalVisible={courseModalVisible} style={{ top: 30 }} onOk={this.handleModalOk} onCancel={this.handleModalCancel} onSearch={this.handleModalSearch} fsTableDataSource={course.list || []} fsTableLoading={course.listLoading} fsTablePagination={course.pagination} fsTableOnChange={this.handleModalTableChange} /> {/*查询配套的模态选择框*/} <SupportSelectModal rowKeyName="id" modalVisible={supportModalVisible} style={{ top: 30 }} onOk={this.handleModalOk} onCancel={this.handleModalCancel} onSearch={this.handleModalSearch} fsTableDataSource={support.list || []} fsTableLoading={support.listLoading} fsTablePagination={support.pagination} fsTableOnChange={this.handleModalTableChange} /> {/*查询课程包的模态选择框*/} <PackageSelectModal rowKeyName="id" modalVisible={packageModalVisible} style={{ top: 30 }} onOk={this.handleModalOk} onCancel={this.handleModalCancel} onSearch={this.handleModalSearch} fsTableDataSource={combo.list || []} fsTableLoading={combo.listLoading} fsTablePagination={combo.pagination} fsTableOnChange={this.handleModalTableChange} /> </Card> </PageHeaderLayout> ); } }