Commit 7dd98321 authored by superman's avatar superman

update

parent 55cc492a
This diff is collapsed.
...@@ -23,7 +23,8 @@ ...@@ -23,7 +23,8 @@
"redux": "^3.5.2", "redux": "^3.5.2",
"redux-actions": "0.9.x", "redux-actions": "0.9.x",
"redux-async-connect": "^1.0.0-rc4", "redux-async-connect": "^1.0.0-rc4",
"redux-saga": "^0.10.4" "redux-saga": "^0.10.4",
"src": "^1.1.2"
}, },
"devDependencies": { "devDependencies": {
"atool-test-mocha": "^0.1.4", "atool-test-mocha": "^0.1.4",
...@@ -44,6 +45,9 @@ ...@@ -44,6 +45,9 @@
"pre-commit": "1.x", "pre-commit": "1.x",
"redbox-react": "^1.2.2" "redbox-react": "^1.2.2"
}, },
"theme": {
"primary-color": "#1DA57A"
},
"pre-commit": [ "pre-commit": [
"lint" "lint"
], ],
...@@ -53,4 +57,4 @@ ...@@ -53,4 +57,4 @@
"start": "dora --plugins \"proxy,webpack,webpack-hmr,livereload?enableJs=false&injectHost=127.0.0.1,browser-history?index=/src/entries/index.html\"", "start": "dora --plugins \"proxy,webpack,webpack-hmr,livereload?enableJs=false&injectHost=127.0.0.1,browser-history?index=/src/entries/index.html\"",
"test": "atool-test-mocha ./src/**/__tests__/*-test.js" "test": "atool-test-mocha ./src/**/__tests__/*-test.js"
} }
} }
\ No newline at end of file
...@@ -74,6 +74,6 @@ module.exports = { ...@@ -74,6 +74,6 @@ module.exports = {
}) })
},100); },100);
}, },
// '/api/*': 'http://react.yanky.cn/', '/api/*': 'http://react.yanky.cn/',
'/api/*': 'http://192.168.1.126:8080/' // '/api/*': 'http://192.168.1.126:8080/'
}; };
import React, {Component, PropTypes} from 'react';
import {
Row,
Col,
Form,
Input,
Button,
Checkbox,
Select,
message,
Tabs,
Cascader,
Radio,
Upload,
Icon,
Modal,
DatePicker,
Table
} from 'antd';
@Form.create()
export default class HuikuanInfoForm extends Component {
constructor(props, context) {
super(props, context);
}
static propsType = {
product: PropTypes.object
};
handleSubmit(e){
e.preventDefault();
const data = this.props.form.getFieldsValue();
const {product} = this.props;
data.id = product.id;
console.log('收到表单值:', data);
this.props.dispatch({
type:'UPDATE_PRODUCT_ITEM',
item: data
});
}
render() {
const formItemLayout = {
labelCol: {span: 4},
wrapperCol: {span: 14},
};
const {form:{getFieldProps}, product:{fundRaisedAccount}} = this.props;
return (
<Form horizontal onSubmit={this.handleSubmit.bind(this)}>
<Form.Item label="名称" {...formItemLayout} wrapperCol={{span:6}}>
<Input placeholder="" {...getFieldProps('fundRaisedAccount.name', {initialValue: fundRaisedAccount.name})} />
</Form.Item>
<Form.Item label="银行帐号" {...formItemLayout} wrapperCol={{span:6}}>
<Input placeholder="" {...getFieldProps('fundRaisedAccount.number',{initialValue:fundRaisedAccount.number})} />
</Form.Item>
<Form.Item label="开户行" {...formItemLayout}>
<Input placeholder="" {...getFieldProps('fundRaisedAccount.bank',{initialValue:fundRaisedAccount.bank})} />
</Form.Item>
<Form.Item label="打款须知" {...formItemLayout}>
<Input type="textarea" rows={10} placeholder="" {...getFieldProps('fundRaisedAccount.memo',{initialValue:fundRaisedAccount.memo})} />
</Form.Item>
<Form.Item wrapperCol={{offset: 4, span:10}} style={{marginTop:30}}>
<Button type="primary" htmlType="submit"><Icon type="save"/>保存</Button>
</Form.Item>
</Form>
);
}
}
import React, {Component, PropTypes} from 'react';
import {Router, Route, IndexRoute, Link} from 'react-router';
export default class Layout extends Component {
render() {
const {children, headerClassName, contentClassName, footerClassName, header, footer} = this.props;
const styles = require('./Layout.less');
return (
<section className={styles.layout}>
{header}
<div className={[styles.content, contentClassName].join(' ')}>
{children}
</div>
{footer}
</section>
);
}
}
.layout {
font-size: 14px;
display: flex;
flex-direction: column;
height: 100%;
overflow: hidden;
& > .content {
flex: 1;
overflow: auto;
}
}
import React, {Component, PropTypes} from 'react';
import {
Row,
Col,
Breadcrumb
} from 'antd';
export default class MainHeader extends Component {
static propType = {
breadcrumb: PropTypes.array,
title: PropTypes.node
};
render() {
const {breadcrumb, title} = this.props;
return (
<div className="main-header">
<Row>
<Col span="8">
<Breadcrumb>
{ breadcrumb.map((b, i)=><Breadcrumb.Item key={i}>{b}</Breadcrumb.Item>) }
</Breadcrumb>
</Col>
</Row>
<Row>
<Col span="20">
<h1 className="tac">{title}</h1>
</Col>
</Row>
</div>
);
}
}
.imgPriviewDialog{
:global(.ant-modal-content){
background-color: transparent;
}
}
...@@ -16,26 +16,15 @@ import { ...@@ -16,26 +16,15 @@ import {
Icon, Icon,
Modal, Modal,
DatePicker, DatePicker,
Table Table,
Spin
} from 'antd'; } from 'antd';
import {arrayRemoveIndex, UUID, formItemLayout, smallFormItemLayout, footerFormSubmitLayout} from '../../utils';
import {arrayRemoveIndex, UUID} from '../../utils';
export function CreateBaseElement() {
return {key: UUID()};
}
export function BaseElementTransform(arr) {
return Object.keys(objs).map(key=>({
key: UUID(),
name: key,
mobile: objs[key]
}));
}
@Form.create() @Form.create()
export default class ProductContactForm extends Component { export default class ContactForm extends Component {
constructor(props, context) { constructor(props, context) {
super(props, context); super(props, context);
this.state = { this.state = {
...@@ -98,40 +87,49 @@ export default class ProductContactForm extends Component { ...@@ -98,40 +87,49 @@ export default class ProductContactForm extends Component {
} }
render() { render() {
const {form:{getFieldProps}} = this.props; const {form:{getFieldProps}, loading} = this.props;
return ( return (
<Form horizontal onSubmit={this.handleSubmit.bind(this)}> <Spin spinning={loading}>
<Form.Item> <Form horizontal onSubmit={this.handleSubmit.bind(this)}>
{ <Form.Item>
this.state.staffs.map((item, index)=> {
<div key={item.key} style={{marginBottom:8}}> this.state.staffs.map((item, index)=>
<Input.Group> <div key={item.key} style={{marginBottom:8}}>
<Col span="6"> <Input.Group>
<Input placeholder="姓名" <Col span="6">
{...getFieldProps(index + '.name', { <Input placeholder="姓名"
initialValue: item.name {...getFieldProps(index + '.name', {
})} /> initialValue: item.name
</Col> })} />
<Col span="10"> </Col>
<Input placeholder="电话" <Col span="10">
{...getFieldProps(index + '.mobile', { <Input placeholder="电话"
initialValue: item.mobile {...getFieldProps(index + '.mobile', {
})}/> initialValue: item.mobile
</Col> })}/>
<Col span="4"> </Col>
<Icon type="cross" onClick={this.handleRemove.bind(this, index)}/> <Col span="4">
</Col> <Icon type="cross" title="删除" onClick={this.handleRemove.bind(this, index)}/>
</Input.Group> </Col>
</div> </Input.Group>
) </div>
} )
</Form.Item> }
<Form.Item wrapperCol={{offset: 4, span:10}} style={{marginTop:30}}> </Form.Item>
<Button onClick={this.handleAdd.bind(this)} style={{marginRight:'1em'}}><Icon <Form.Item {...footerFormSubmitLayout} style={{marginTop:30}}>
type="plus"/>添加</Button> <Button onClick={this.handleAdd.bind(this)} style={{marginRight:'1em'}}><Icon
<Button type="primary" htmlType="submit"><Icon type="save"/>保存</Button> type="plus"/>添加</Button>
</Form.Item> <Button type="primary" htmlType="submit" loading={loading}><Icon type="save"/>保存</Button>
</Form> {
!this.props.isCreate &&
<Button onClick={e=>{e.preventDefault(); this.props.history.goBack();}}
style={{marginLeft:'1em'}}>
<Icon type="rollback" />返回
</Button>
}
</Form.Item>
</Form>
</Spin>
); );
} }
} }
...@@ -16,17 +16,25 @@ import { ...@@ -16,17 +16,25 @@ import {
Icon, Icon,
Modal, Modal,
DatePicker, DatePicker,
Table Table,
Spin
} from 'antd'; } from 'antd';
import {
PRODUCT_STATUS,
formatDateTime,
arrayRemoveIndex,
UUID,
formItemLayout,
smallFormItemLayout,
footerFormSubmitLayout
} from '../../utils';
import {PRODUCT_STATUS, formatDateTime} from '../../utils'; const ProductStatus = Object.keys(PRODUCT_STATUS).filter(key=>key != -9);
const ProductStatus = Object.keys(PRODUCT_STATUS);
@Form.create() @Form.create()
export default class ProductDateTimeForm extends Component { export default class DateTimeSatausForm extends Component {
constructor(props, context) { constructor(props, context) {
super(props, context); super(props, context);
...@@ -69,11 +77,8 @@ export default class ProductDateTimeForm extends Component { ...@@ -69,11 +77,8 @@ export default class ProductDateTimeForm extends Component {
} }
render() { render() {
const formItemLayout = {
labelCol: {span: 4}, const {product, loading, form:{getFieldProps}, isCreate} = this.props;
wrapperCol: {span: 14},
};
const {cates, product, form:{getFieldProps}, isCreate} = this.props;
const { const {
fundReservationStartTime, fundReservationStartTime,
fundRaisedEndTime, fundRaisedEndTime,
...@@ -84,58 +89,67 @@ export default class ProductDateTimeForm extends Component { ...@@ -84,58 +89,67 @@ export default class ProductDateTimeForm extends Component {
return ( return (
<Form horizontal onSubmit={this.handleSubmit.bind(this)}> <Spin spinning={loading}>
{ <Form horizontal onSubmit={this.handleSubmit.bind(this)}>
!isCreate && {
<Form.Item label="商品状态" {...formItemLayout} wrapperCol={{span:20}}> !isCreate &&
<Radio.Group {...getFieldProps('status', {initialValue: product.status + ''})}> <Form.Item label="产品状态" {...formItemLayout} wrapperCol={{span:20}}>
{ <Radio.Group {...getFieldProps('status', {initialValue: product.status + ''})}>
ProductStatus.map((status, index)=> {
<Radio.Button key={status} data-value={status} ProductStatus.map((status, index)=>
value={status}>{PRODUCT_STATUS[status]}</Radio.Button> <Radio.Button key={status} data-value={status}
) value={status}>{PRODUCT_STATUS[status]}</Radio.Button>
} )
</Radio.Group> }
</Radio.Group>
</Form.Item>
}
<Form.Item label="预约开始时间" {...formItemLayout}>
<DatePicker showTime format="yyyy-MM-dd HH:mm:ss" placeholder="请选择预约开始时间"
{...getFieldProps('fundReservationStartTime', {
initialValue: fundReservationStartTime ? formatDateTime(fundReservationStartTime) : ''
})}
/>
</Form.Item>
<Form.Item label="募集开始与结束时间" {...formItemLayout}>
<DatePicker.RangePicker showTime format="yyyy-MM-dd HH:mm:ss"
{...getFieldProps('fundRaisedStartTime', {
initialValue: [
fundReservationStartTime ? formatDateTime(fundReservationStartTime) : '',
fundRaisedEndTime ? formatDateTime(fundRaisedEndTime) : ''
]
})}
/>
</Form.Item>
<Form.Item label="汇款结束时间" {...formItemLayout}>
<DatePicker showTime format="yyyy-MM-dd HH:mm:ss" placeholder="请选择汇款结束时间"
{...getFieldProps('remittanceEndTime', {
initialValue: remittanceEndTime ? formatDateTime(remittanceEndTime) : ''
})}
/>
</Form.Item>
<Form.Item label="基金成立与到期时间" {...formItemLayout}>
<DatePicker.RangePicker showTime format="yyyy-MM-dd HH:mm:ss"
{...getFieldProps('fundEstablishedTime', {
initialValue: [
fundEstablishedTime ? formatDateTime(fundEstablishedTime) : '',
fundExpireTime ? formatDateTime(fundExpireTime) : ''
]
})}
/>
</Form.Item>
<Form.Item {...footerFormSubmitLayout} style={{marginTop:30}}>
<Button type="primary" htmlType="submit" loading={loading}><Icon type="save"/>保存</Button>
{
!this.props.isCreate &&
<Button onClick={e=>{e.preventDefault(); this.props.history.goBack();}}
style={{marginLeft:'1em'}}>
<Icon type="rollback" />返回
</Button>
}
</Form.Item> </Form.Item>
} </Form>
<Form.Item label="预约开始时间" {...formItemLayout}> </Spin>
<DatePicker showTime format="yyyy-MM-dd HH:mm:ss" placeholder="请选择预约开始时间"
{...getFieldProps('fundReservationStartTime', {
initialValue: fundReservationStartTime ? formatDateTime(fundReservationStartTime) : ''
})}
/>
</Form.Item>
<Form.Item label="募集开始与结束时间" {...formItemLayout}>
<DatePicker.RangePicker showTime format="yyyy-MM-dd HH:mm:ss"
{...getFieldProps('fundRaisedStartTime', {
initialValue: [
fundReservationStartTime ? formatDateTime(fundReservationStartTime) : '',
fundRaisedEndTime ? formatDateTime(fundRaisedEndTime) : ''
]
})}
/>
</Form.Item>
<Form.Item label="汇款结束时间" {...formItemLayout}>
<DatePicker showTime format="yyyy-MM-dd HH:mm:ss" placeholder="请选择汇款结束时间"
{...getFieldProps('remittanceEndTime', {
initialValue: remittanceEndTime ? formatDateTime(remittanceEndTime) : ''
})}
/>
</Form.Item>
<Form.Item label="基金成立与到期时间" {...formItemLayout}>
<DatePicker.RangePicker showTime format="yyyy-MM-dd HH:mm:ss"
{...getFieldProps('fundEstablishedTime', {
initialValue: [
fundEstablishedTime ? formatDateTime(fundEstablishedTime) : '',
fundExpireTime ? formatDateTime(fundExpireTime) : ''
]
})}
/>
</Form.Item>
<Form.Item wrapperCol={{offset: 4, span:10}} style={{marginTop:30}}>
<Button type="primary" htmlType="submit"><Icon type="save"/>保存</Button>
</Form.Item>
</Form>
); );
} }
} }
...@@ -16,13 +16,21 @@ import { ...@@ -16,13 +16,21 @@ import {
Icon, Icon,
Modal, Modal,
DatePicker, DatePicker,
Table Table,
Spin
} from 'antd'; } from 'antd';
import {UUID} from '../../utils'; import {
arrayRemoveIndex,
UUID,
formItemLayout,
smallFormItemLayout,
footerFormSubmitLayout,
handleUpload
} from '../../utils';
@Form.create() @Form.create()
export default class ProductDocumentsForm extends Component { export default class DocumentsForm extends Component {
constructor(props, context) { constructor(props, context) {
super(props, context); super(props, context);
this.state = { this.state = {
...@@ -41,37 +49,14 @@ export default class ProductDocumentsForm extends Component { ...@@ -41,37 +49,14 @@ export default class ProductDocumentsForm extends Component {
}; };
handleUpload(info) { componentWillMount(){
let fileList = info.fileList;
// 3. 按照服务器返回信息筛选成功上传的文件
fileList = fileList.filter((file) => {
if (file.response) {
return file.response.status === 1;
}
return true;
});
// 2. 读取远程路径并显示链接
fileList = fileList.map((file) => {
if (file.response) {
// 组件会将 file.url 作为链接进行展示
//file.url = file.response.url;
const {result, status, message} = file.response;
if (status === 1 && result && result.length >= 1 && result[0].url) {
file.url = result[0].url;
}
}
return file;
});
this.setState({fileList});
} }
handleSubmit(e){ handleSubmit(e) {
e.preventDefault(); e.preventDefault();
const files = []; const files = [];
this.state.fileList.forEach(file=>{ this.state.fileList.forEach(file=> {
files.push({ files.push({
name: file.name, name: file.name,
file: file.url file: file.url
...@@ -89,29 +74,39 @@ export default class ProductDocumentsForm extends Component { ...@@ -89,29 +74,39 @@ export default class ProductDocumentsForm extends Component {
item: data item: data
}); });
} }
render() { render() {
const {user, product} = this.props; const {user, loading} = this.props;
return ( return (
<Form horizontal onSubmit={this.handleSubmit.bind(this)} style={{maxWidth:'800px', margin:'auto'}}> <Spin spinning={loading}>
<Form.Item> <Form horizontal onSubmit={this.handleSubmit.bind(this)} style={{maxWidth:'800px', margin:'auto'}}>
<Upload.Dragger action="/api/fileUpload/upload" <Form.Item>
multiple={true} <Upload.Dragger action="/api/fileUpload/upload"
headers={{ multiple={true}
authorization: user && user.token, headers={{
}} authorization: user && user.token,
onChange={this.handleUpload.bind(this)} }}
fileList={this.state.fileList}> onChange={info=>this.setState({fileList: handleUpload(info)})}
<p className="ant-upload-drag-icon"> fileList={this.state.fileList}>
<Icon type="inbox"/> <p className="ant-upload-drag-icon">
</p> <Icon type="inbox"/>
<p className="ant-upload-text">点击或将文件拖拽到此区域上传</p> </p>
<p className="ant-upload-hint">支持单个或批量上传,严禁上传公司内部资料及其他违禁文件</p> <p className="ant-upload-text">点击或将文件拖拽到此区域上传</p>
</Upload.Dragger> <p className="ant-upload-hint">支持单个或批量上传,严禁上传公司内部资料及其他违禁文件</p>
</Form.Item> </Upload.Dragger>
<Form.Item style={{marginTop:30, textAlign:'center'}}> </Form.Item>
<Button type="primary" htmlType="submit"><Icon type="save"/>保存</Button> <Form.Item style={{marginTop:30, textAlign:'center'}}>
</Form.Item> <Button type="primary" htmlType="submit" loading={loading}><Icon type="save"/>保存</Button>
</Form> {
!this.props.isCreate &&
<Button onClick={e=>{e.preventDefault(); this.props.history.goBack();}}
style={{marginLeft:'1em'}}>
<Icon type="rollback" />返回
</Button>
}
</Form.Item>
</Form>
</Spin>
); );
} }
} }
...@@ -16,12 +16,12 @@ import { ...@@ -16,12 +16,12 @@ import {
Icon, Icon,
Modal, Modal,
DatePicker, DatePicker,
Table Table,
Spin
} from 'antd'; } from 'antd';
import {arrayRemoveIndex, UUID, formItemLayout, smallFormItemLayout, footerFormSubmitLayout} from '../../utils';
import {arrayRemoveIndex, UUID} from '../../utils';
export function CreateBaseElement() { export function CreateBaseElement() {
return {key: UUID()}; return {key: UUID()};
} }
...@@ -35,7 +35,7 @@ export function BaseElementTransform(objs) { ...@@ -35,7 +35,7 @@ export function BaseElementTransform(objs) {
} }
@Form.create() @Form.create()
export default class HuikuanInfoForm extends Component { export default class ElementForm extends Component {
constructor(props, context) { constructor(props, context) {
super(props, context); super(props, context);
this.state = { this.state = {
...@@ -97,40 +97,56 @@ export default class HuikuanInfoForm extends Component { ...@@ -97,40 +97,56 @@ export default class HuikuanInfoForm extends Component {
} }
render() { render() {
const {form:{getFieldProps}} = this.props; const {form:{getFieldProps}, loading} = this.props;
return ( return (
<Form horizontal onSubmit={this.handleSubmit.bind(this)}> <Spin spinning={loading}>
<Form.Item> <Form horizontal onSubmit={this.handleSubmit.bind(this)}>
<h3>可以设置以下要素,或者自定义其他要素</h3> <Form.Item>
<p>总规模、投资亮点、托管方、结算方式、资金用途、融资方、担保主体、风控措施、还款来源、发行方、认购起点、大小额配比</p> <h3>可以设置以下要素,或者自定义其他要素</h3>
</Form.Item> <p>总规模、投资亮点、托管方、结算方式、资金用途、融资方、担保主体、风控措施、还款来源、发行方、认购起点、大小额配比</p>
<Form.Item> </Form.Item>
{ <Form.Item>
this.state.elements.map((item, index)=> {
<div key={item.key} style={{marginBottom:8}}> this.state.elements.map((item, index)=>
<Input.Group> <div key={item.key} style={{marginBottom:8}}>
<Col span="6"> <Input.Group>
<Input <Col span="6">
placeholder="标题" {...getFieldProps(index + '.title', {initialValue: item.title})} /> <Input placeholder="标题"
</Col> {...getFieldProps(index + '.title', {
<Col span="10"> initialValue: item.title
<Input type="textarea" placeholder="内容" autosize })}
{...getFieldProps(index + '.content', {initialValue: item.content})}/> />
</Col> </Col>
<Col span="4"> <Col span="10">
<Icon type="cross" onClick={this.handleRemoveElement.bind(this, index)}/> <Input type="textarea" placeholder="内容" autosize
</Col> {...getFieldProps(index + '.content', {
</Input.Group> initialValue: item.content
</div> })}
) />
} </Col>
</Form.Item> <Col span="4">
<Form.Item wrapperCol={{offset: 4, span:10}} style={{marginTop:30}}> <Icon type="cross" title="删除"
<Button onClick={this.handleAddElement.bind(this)} style={{marginRight:'1em'}}><Icon onClick={this.handleRemoveElement.bind(this, index)}/>
type="plus"/>添加</Button> </Col>
<Button type="primary" htmlType="submit"><Icon type="save"/>保存</Button> </Input.Group>
</Form.Item> </div>
</Form> )
}
</Form.Item>
<Form.Item {...footerFormSubmitLayout} style={{marginTop:30}}>
<Button onClick={this.handleAddElement.bind(this)} style={{marginRight:'1em'}}><Icon
type="plus"/>添加</Button>
<Button type="primary" htmlType="submit" loading={loading}><Icon type="save"/>保存</Button>
{
!this.props.isCreate &&
<Button onClick={e=>{e.preventDefault(); this.props.history.goBack();}}
style={{marginLeft:'1em'}}>
<Icon type="rollback" />返回
</Button>
}
</Form.Item>
</Form>
</Spin>
); );
} }
} }
import React, {Component, PropTypes} from 'react';
import {
Row,
Col,
Form,
Input,
Button,
Checkbox,
Select,
message,
Tabs,
Cascader,
Radio,
Upload,
Icon,
Modal,
DatePicker,
Table,
Spin
} from 'antd';
import {arrayRemoveIndex, UUID, formItemLayout, smallFormItemLayout, footerFormSubmitLayout} from '../../utils';
@Form.create()
export default class HuikuanInfoForm extends Component {
constructor(props, context) {
super(props, context);
}
static propsType = {
product: PropTypes.object
};
handleSubmit(e) {
e.preventDefault();
const data = this.props.form.getFieldsValue();
const {product} = this.props;
data.id = product.id;
console.log('收到表单值:', data);
this.props.dispatch({
type: 'UPDATE_PRODUCT_ITEM',
item: data
});
}
render() {
const {form:{getFieldProps}, product:{fundRaisedAccount}, loading} = this.props;
return (
<Spin spinning={loading}>
<Form horizontal onSubmit={this.handleSubmit.bind(this)}>
<Form.Item label="名称" help="接收打款帐户名称" {...smallFormItemLayout} >
<Input placeholder="名称"
{...getFieldProps('fundRaisedAccount.name', {
initialValue: fundRaisedAccount.name
})}
/>
</Form.Item>
<Form.Item label="银行帐号" help="接收打款银行帐号" {...smallFormItemLayout}>
<Input placeholder="银行帐号"
{...getFieldProps('fundRaisedAccount.number', {
initialValue: fundRaisedAccount.number
})}
/>
</Form.Item>
<Form.Item label="开户行" help="接收打款银行开户行" {...formItemLayout}>
<Input placeholder="开户行"
{...getFieldProps('fundRaisedAccount.bank', {
initialValue: fundRaisedAccount.bank
})}
/>
</Form.Item>
<Form.Item label="打款须知" help="接收打款的一些必要告知信息" {...formItemLayout}>
<Input type="textarea" rows={10} placeholder=""
{...getFieldProps('fundRaisedAccount.memo', {
initialValue: fundRaisedAccount.memo
})}
/>
</Form.Item>
<Form.Item {...footerFormSubmitLayout} style={{marginTop:30}}>
<Button type="primary" htmlType="submit" loading={loading}><Icon type="save"/>保存</Button>
{
!this.props.isCreate &&
<Button onClick={e=>{e.preventDefault(); this.props.history.goBack();}}
style={{marginLeft:'1em'}}>
<Icon type="rollback" />返回
</Button>
}
</Form.Item>
</Form>
</Spin>
);
}
}
...@@ -16,13 +16,13 @@ import { ...@@ -16,13 +16,13 @@ import {
Icon, Icon,
Modal, Modal,
DatePicker, DatePicker,
Table Table,
Spin
} from 'antd'; } from 'antd';
import {arrayRemoveIndex, formatMoney} from '../../utils'; import {arrayRemoveIndex, UUID, formItemLayout, smallFormItemLayout, footerFormSubmitLayout} from '../../utils';
import {UUID} from '../../utils';
export function YongjingTransform(arr) { export function YongjingTransform(arr) {
return arr.map(item=>({ return arr.map(item=>({
...@@ -76,18 +76,18 @@ export default class ShouyiYongjingForm extends Component { ...@@ -76,18 +76,18 @@ export default class ShouyiYongjingForm extends Component {
this.setState({yongjing: yongjing}); this.setState({yongjing: yongjing});
} }
handleSubmit(e){ handleSubmit(e) {
e.preventDefault(); e.preventDefault();
const formData = this.props.form.getFieldsValue(); const formData = this.props.form.getFieldsValue();
const commissionAlg = []; const commissionAlg = [];
const data = { const data = {
id: this.props.product.id id: this.props.product.id
}; };
Object.keys(formData).forEach(key=>{ Object.keys(formData).forEach(key=> {
if(/^[\d]+$/g.test(key)){ if (/^[\d]+$/g.test(key)) {
commissionAlg.push(formData[key]); commissionAlg.push(formData[key]);
}else{ } else {
data[key] = formData[key]; data[key] = formData[key];
} }
}); });
...@@ -96,75 +96,84 @@ export default class ShouyiYongjingForm extends Component { ...@@ -96,75 +96,84 @@ export default class ShouyiYongjingForm extends Component {
console.log(data); console.log(data);
this.props.dispatch({ this.props.dispatch({
type:'UPDATE_PRODUCT_ITEM', type: 'UPDATE_PRODUCT_ITEM',
item: data item: data
}); });
} }
render() { render() {
const formItemLayout = {
labelCol: {span: 4},
wrapperCol: {span: 14},
};
const {form:{getFieldProps}, product} = this.props; const {form:{getFieldProps}, product, loading} = this.props;
return ( return (
<Form horizontal onSubmit={this.handleSubmit.bind(this)}> <Spin spinning={loading}>
<Form.Item label="佣金结算方式" help="例如: 打款结佣、成立结佣" {...formItemLayout} wrapperCol={{span:6}}> <Form horizontal onSubmit={this.handleSubmit.bind(this)}>
<Input placeholder="佣金结算方式" {...getFieldProps('settlement', { <Form.Item label="佣金结算方式" help="例如: 打款结佣、成立结佣" {...smallFormItemLayout}>
initialValue:product.settlement <Input placeholder="佣金结算方式"
})} /> {...getFieldProps('settlement', {
</Form.Item> initialValue: product.settlement
<Form.Item label="产品的预期收益" {...formItemLayout} wrapperCol={{span:6}}> })}
<Input placeholder="产品的预期收益" {...getFieldProps('productProspectiveReturn', { />
initialValue:product.productProspectiveReturn </Form.Item>
})} /> <Form.Item label="产品的预期收益" help="浮动或百分比" {...smallFormItemLayout}>
</Form.Item> <Input placeholder="产品的预期收益"
<Form.Item label="佣金算法" {...formItemLayout}> {...getFieldProps('productProspectiveReturn', {
<Input.Group> initialValue: product.productProspectiveReturn
<Col span="5" className="tac">最小投资额</Col> })}
<Col span="5" className="tac">最大投资额</Col> />
<Col span="5" className="tac">收益</Col> </Form.Item>
<Col span="5" className="tac">佣金</Col> <Form.Item label="佣金算法" {...formItemLayout}>
</Input.Group> <Input.Group>
{ <Col span="5" className="tac">最小投资额</Col>
this.state.yongjing.map((item, index)=> <Col span="5" className="tac">最大投资额</Col>
<div key={item.key}> <Col span="5" className="tac">收益</Col>
<Input.Group> <Col span="5" className="tac">佣金</Col>
<Col span="5"> </Input.Group>
<Input {...getFieldProps(index + '.min', {initialValue: item.min})} /> {
</Col> this.state.yongjing.map((item, index)=>
<Col span="5"> <div key={item.key}>
<Input {...getFieldProps(index+ '.max', {initialValue: item.max})}/> <Input.Group>
</Col> <Col span="5">
<Col span="5"> <Input {...getFieldProps(index + '.min', {initialValue: item.min})} />
<Input {...getFieldProps(index+'.sy', {initialValue: item.sy})}/> </Col>
</Col> <Col span="5">
<Col span="5"> <Input {...getFieldProps(index + '.max', {initialValue: item.max})}/>
<Input {...getFieldProps(index+'.yj', {initialValue: item.yj})}/> </Col>
</Col> <Col span="5">
<Col span="4"> <Input {...getFieldProps(index + '.sy', {initialValue: item.sy})}/>
<Icon type="cross" onClick={this.handleRemoveYongjin.bind(this, index)}/> </Col>
</Col> <Col span="5">
</Input.Group> <Input {...getFieldProps(index + '.yj', {initialValue: item.yj})}/>
</div> </Col>
) <Col span="4">
} <Icon type="cross" onClick={this.handleRemoveYongjin.bind(this, index)}/>
<Row style={{marginTop:15}}> </Col>
<Col span="20" className="tac"> </Input.Group>
<Button style={{marginRight:'.5em'}} </div>
onClick={this.handleAddYongjing.bind(this)}><Icon )
type="plus"/>添加</Button> }
</Col> <Row style={{marginTop:15}}>
</Row> <Col span="20" className="tac">
</Form.Item>
<Form.Item wrapperCol={{offset: 4, span:10}} style={{marginTop:30}}> </Col>
<Button type="primary" htmlType="submit"><Icon type="save"/>保存</Button> </Row>
</Form.Item> </Form.Item>
</Form> <Form.Item {...footerFormSubmitLayout} style={{marginTop:30}}>
<Button style={{marginRight:'1em'}}
onClick={this.handleAddYongjing.bind(this)}><Icon
type="plus"/>添加</Button>
<Button type="primary" htmlType="submit" loading={loading}><Icon type="save"/>保存</Button>
{
!this.props.isCreate &&
<Button onClick={e=>{e.preventDefault(); this.props.history.goBack();}}
style={{marginLeft:'1em'}}>
<Icon type="rollback" />返回
</Button>
}
</Form.Item>
</Form>
</Spin>
); );
} }
} }
......
...@@ -17,46 +17,59 @@ import { ...@@ -17,46 +17,59 @@ import {
Modal, Modal,
DatePicker, DatePicker,
Table, Table,
Spin
} from 'antd'; } from 'antd';
import Layout from '../../components/Layout/Layout';
import MainHeader from '../../components/MainHeader';
import {formItemLayout, footerFormSubmitLayout} from '../../utils';
@connect(state=>({ @connect(state=>({
loading: state.announcement.loading, loading: state.announcement.loading,
})) }))
@Form.create() @Form.create()
export default class AddItem extends Component{ export default class AddItem extends Component {
constructor(props, content) { constructor(props, content) {
super(props, content); super(props, content);
} }
handleSubmit(e){ handleSubmit(e) {
e.preventDefault(); e.preventDefault();
const data = this.props.form.getFieldsValue(); const data = this.props.form.getFieldsValue();
data.itemId = this.props.location.query.itemId; data.itemId = this.props.location.query.itemId;
console.log(data); console.log(data);
this.props.dispatch({ this.props.dispatch({
type:'CREATE_ANNOUNCEMENT_ITEM', type: 'CREATE_ANNOUNCEMENT_ITEM',
data data
}); });
} }
render = ()=> { render = ()=> {
const {loading, form:{getFieldProps}} = this.props; const {loading, form:{getFieldProps}, location:{query}} = this.props;
const formItemLayout = {
labelCol: {span: 4}, const header = (<MainHeader breadcrumb={['产品管理', '产品详情', '添加公告']}
wrapperCol: {span: 14}, title={(query.title ? query.title + ' - ' : '') + '添加公告'}/>);
}; return (
return( <Layout header={header}>
<Form horizontal onSubmit={this.handleSubmit.bind(this)}> <Spin spinning={loading}>
<Form.Item label="标题" {...formItemLayout}> <Form horizontal onSubmit={this.handleSubmit.bind(this)}>
<Input placeholder="公告标题" {...getFieldProps('title')} /> <Form.Item label="标题" {...formItemLayout}>
</Form.Item> <Input placeholder="公告标题" {...getFieldProps('title')} />
<Form.Item label="内容" {...formItemLayout}> </Form.Item>
<Input placeholder="公告内容" type="textarea" {...getFieldProps('announcement')} /> <Form.Item label="内容" {...formItemLayout}>
</Form.Item> <Input placeholder="公告内容" type="textarea" {...getFieldProps('announcement')} />
<Form.Item wrapperCol={{offset: 4, span:10}} style={{marginTop:30}}> </Form.Item>
<Button type="primary" htmlType="submit" loading={loading}><Icon type="save"/>创建</Button> <Form.Item {...footerFormSubmitLayout} style={{marginTop:30}}>
</Form.Item> <Button type="primary" htmlType="submit" loading={loading}><Icon type="save"/>创建</Button>
</Form> <Button onClick={e=>{e.preventDefault(); this.props.history.goBack();}}
style={{marginLeft:'1em'}}>
<Icon type="rollback"/>返回
</Button>
</Form.Item>
</Form>
</Spin>
</Layout>
); );
} }
} }
...@@ -17,8 +17,14 @@ import { ...@@ -17,8 +17,14 @@ import {
Modal, Modal,
DatePicker, DatePicker,
Table, Table,
Spin
} from 'antd'; } from 'antd';
import Layout from '../../components/Layout/Layout';
import MainHeader from '../../components/MainHeader';
import {formItemLayout, footerFormSubmitLayout} from '../../utils';
@connect(state=>({ @connect(state=>({
loading: state.announcement.loading, loading: state.announcement.loading,
announcement: state.announcement.item, announcement: state.announcement.item,
...@@ -30,10 +36,8 @@ export default class EditItem extends Component { ...@@ -30,10 +36,8 @@ export default class EditItem extends Component {
} }
componentWillMount() { componentDidMount() {
if (!(this.props.announcement && this.props.announcement.id)) { this.fetchItem(this.props.params.id);
this.fetchItem(this.props.params.id);
}
}; };
fetchItem(id) { fetchItem(id) {
...@@ -46,28 +50,50 @@ export default class EditItem extends Component { ...@@ -46,28 +50,50 @@ export default class EditItem extends Component {
handleSubmit(e) { handleSubmit(e) {
e.preventDefault(); e.preventDefault();
const data = this.props.form.getFieldsValue(); const data = this.props.form.getFieldsValue();
data.id = this.props.announcement.id;
console.log(data); console.log(data);
this.props.dispatch({
type: 'UPDATE_ANNOUNCEMENT_ITEM',
data
});
} }
render() { render() {
const {announcement, loading, form:{getFieldProps}} = this.props; const {announcement, loading, form:{getFieldProps}, location:{query}} = this.props;
const formItemLayout = {
labelCol: {span: 4}, const header = (<MainHeader breadcrumb={['产品管理', '产品详情', '修改公告']}
wrapperCol: {span: 14}, title={(query && query.title ? query.title + ' - ' : '') + '修改公告'}/>);
};
return ( return (
<Form horizontal onSubmit={this.handleSubmit.bind(this)}> <Layout header={header}>
<Form.Item label="标题" {...formItemLayout}> <Spin spinning={loading}>
<Input placeholder="公告标题" {...getFieldProps('title', {initialValue: announcement.title})} /> {
</Form.Item> announcement &&
<Form.Item label="内容" {...formItemLayout}> <Form horizontal onSubmit={this.handleSubmit.bind(this)}>
<Input placeholder="公告内容" type="textarea" {...getFieldProps('announcement', {initialValue: announcement.announcement})} /> <Form.Item label="标题" {...formItemLayout}>
</Form.Item> <Input placeholder="公告标题"
<Form.Item wrapperCol={{offset: 4, span:10}} style={{marginTop:30}}> {...getFieldProps('title', {
<Button type="primary" htmlType="submit" loading={loading}><Icon type="save"/>保存</Button> initialValue: announcement.title
</Form.Item> })} />
</Form> </Form.Item>
<Form.Item label="内容" {...formItemLayout}>
<Input placeholder="公告内容" autosize={{ minRows: 5 }} type="textarea"
{...getFieldProps('announcement', {
initialValue: announcement.announcement
})} />
</Form.Item>
<Form.Item {...footerFormSubmitLayout} style={{marginTop:30}}>
<Button type="primary" htmlType="submit" loading={loading}><Icon
type="save"/>修改</Button>
<Button onClick={e=>{e.preventDefault(); this.props.history.goBack();}}
style={{marginLeft:'1em'}}>
<Icon type="rollback"/>返回
</Button>
</Form.Item>
</Form>
}
</Spin>
</Layout>
); );
} }
} }
import React, {Component, PropTypes} from 'react'; import React, {Component, PropTypes} from 'react';
import {connect} from 'react-redux'; import {connect} from 'react-redux';
import {Table, Icon, Button} from 'antd'; import {Table, Icon, Button, Switch, Form} from 'antd';
import {serialize, formatDateTime, productStatusToString} from '../../utils'; import {serialize, formatDateTime, productStatusToString, footerFormSubmitLayout} from '../../utils';
import {Link} from 'react-router'; import {Link} from 'react-router';
import Layout from '../../components/Layout/Layout';
import MainHeader from '../../components/MainHeader';
const columns = [
{
title: 'ID',
dataIndex: 'id',
key: 'id',
width: 60
}, {
title: '标题',
dataIndex: 'title',
key: 'title',
}, {
title: '创建时间',
dataIndex: 'dateCreated',
key: 'dateCreated',
width: 150,
className: 'tac',
render: (dateCreated, record)=>(
<span>
{dateCreated && formatDateTime(dateCreated)}
</span>
)
}, {
title: '状态',
dataIndex: 'status',
key: 'status',
width: 120,
className: 'tac',
render: (status, record)=>(<span data-status={status}>{status?'有效':'无效'}</span>)
}, {
title: '操作',
key: 'operation',
width: 120,
className: 'tac',
render: (text, record)=>(
<span>
<a href={'/product/item?id='+ record.id}></a>
</span>
)
}
];
@connect(state=>({ @connect(state=>({
items: state.announcement.items, items: state.announcement.items,
loading: state.announcement.loading, loading: state.announcement.loading,
...@@ -58,7 +19,7 @@ export default class List extends Component { ...@@ -58,7 +19,7 @@ export default class List extends Component {
} }
componentWillMount() { componentDidMount() {
this.fetchList(this.props.location.query); this.fetchList(this.props.location.query);
}; };
...@@ -74,13 +35,10 @@ export default class List extends Component { ...@@ -74,13 +35,10 @@ export default class List extends Component {
} }
render() { render() {
const {total, items, loading, history:{replace}, location:{pathname, query}} = this.props; const {total, items, loading, history:{replace}, location:{pathname, query}} = this.props;
const pagination = { const pagination = {
total: total, total: total,
pageSize: parseInt(query.s, 10) || 10, pageSize: parseInt(query.s, 10) || 10,
...@@ -101,17 +59,79 @@ export default class List extends Component { ...@@ -101,17 +59,79 @@ export default class List extends Component {
} }
}; };
return <div> const columns = [
<h1>公告列表</h1> {
<Link to={'/announcement/create?itemId='+ query.itemId}><Button><Icon type="plus"/>添加</Button></Link> title: 'ID',
<Table className="ant-table" columns={columns} dataIndex: 'id',
dataSource={Array.isArray(items)?items:[]} key: 'id',
loading={loading} width: 60
pagination={pagination} }, {
scroll={{ y: window.innerHeight-290 }} title: '标题',
onRowClick={this.handleRowClick.bind(this)} dataIndex: 'title',
/> key: 'title',
</div>; }, {
title: '内容',
dataIndex: 'announcement',
key: 'announcement'
}, {
title: '创建时间',
dataIndex: 'dateCreated',
key: 'dateCreated',
width: 150,
className: 'tac',
render: (dateCreated, record)=>(
<span>
{dateCreated && formatDateTime(dateCreated)}
</span>
)
}, {
title: '状态',
dataIndex: 'status',
key: 'status',
width: 120,
className: 'tac',
render: (text, record)=>(
<span onClick={e=>{e.stopPropagation(); e.preventDefault();}}>
<Switch checkedChildren="开" unCheckedChildren="关" defaultChecked={record.status}
onChange={checked=>{
this.props.dispatch({
type:'UPDATE_ANNOUNCEMENT_ITEM',
data:{
id: record.id,
status: checked ? 1: 0
}
})
}}
/>
</span>
)
}
];
const header = (<MainHeader breadcrumb={['产品管理', '产品详情', '公告列表']}
title={(query.title ? query.title + ' - ' : '') + '公告列表'}/>);
return (
<Layout header={header}>
<Form horizontal>
<Table className="ant-table" columns={columns}
dataSource={Array.isArray(items)?items:[]}
loading={loading}
pagination={pagination}
onRowClick={this.handleRowClick.bind(this)}
/>
<Form.Item {...footerFormSubmitLayout} style={{marginTop:30}}>
<Link to={'/announcement/create?itemId='+ query.itemId + '&title='+ query.title}>
<Button size="large"><Icon type="plus"/>添加</Button>
</Link>
<Button onClick={e=>{e.preventDefault(); this.props.history.goBack();}}
style={{marginLeft:'1em'}}>
<Icon type="rollback"/>返回
</Button>
</Form.Item>
</Form>
</Layout>
);
} }
} }
......
import React, { Component, PropTypes } from 'react'; import React, {Component, PropTypes} from 'react';
import { Router, Route, IndexRoute, Link } from 'react-router'; import {Router, Route, IndexRoute, Link} from 'react-router';
import Layout from '../../components/Layout/Layout';
import {Collapse, Menu, Icon} from 'antd';
import { Collapse } from 'antd';
const Panel = Collapse.Panel; const Panel = Collapse.Panel;
const SubMenu = Menu.SubMenu;
const MenuItemGroup = Menu.ItemGroup;
export default class App extends Component { export default class App extends Component {
...@@ -19,37 +19,99 @@ export default class App extends Component { ...@@ -19,37 +19,99 @@ export default class App extends Component {
store: PropTypes.object.isRequired store: PropTypes.object.isRequired
}; };
render(){ render() {
const styles = require('./App.less'); const styles = require('./App.less');
const mainMenu = [
{
title: '产品管理',
items: [
{
to: '/products',
cn: '产品列表',
en: 'Products'
}, {
to: '/products/create',
cn: '添加产品',
en: 'Add Products'
}
]
}, {
title: '订单管理',
items: [
{
to: '/trades',
cn: '订单列表',
en: 'Trades'
}
]
}, {
title: '审核管理',
items: [
{
to: '/remittance/audits',
cn: '报单审核',
en: 'Remittance Audits'
}
]
}
];
const logo = require('./images/logo.png');
return ( return (
<div className={styles.normal}> <div className={styles.normal}>
<div className={styles.head}> <div className={styles.head}>
<h1>枢纽科技</h1> <img className="page-logo" src={'/'+logo} title="枢纽科技" alt="枢纽科技"/>
</div> </div>
<div className={styles.content}> <div className={styles.content}>
<div className={styles.side}> <div className={styles.side}>
<Collapse accordion> <Menu mode="inline" defaultOpenKeys={['sub1']}>
<Panel header="产品管理"> <SubMenu key="sub1" title={<span><Icon type="mail" /><span>业务管理</span></span>}>
<Link to="/products">产品列表</Link><br/> {
<Link to="/products/create">增加产品</Link> mainMenu.map((menu, mi)=>
</Panel> <MenuItemGroup title={menu.title} key={mi}>
<Panel header="订单管理"> {
<Link to="/trades">订单列表</Link><br/> menu.items.map((item, ii)=>
</Panel> <Menu.Item key={[mi,ii].join('-')}>
</Collapse> <MenuItemContent {...item}/>
</Menu.Item>
)
}
</MenuItemGroup>
)
}
</SubMenu>
</Menu>
</div> </div>
<div className={styles.main}> <div className={styles.main}>
{this.props.children} {this.props.children}
</div> </div>
</div> </div>
<div className={styles.foot}> <div className={styles.foot}>
Built with react, react-router, redux, redux-saga, ant-tool, css-modules, antd... 杭州枢纽科技有限公司 荣誉出品 <a href="mailto:bainx@vip.qq.com">问题反馈</a>
</div> </div>
</div> </div>
); );
} }
} }
class MenuItemContent extends Component {
static propType = {
to: PropTypes.string,
cn: PropTypes.string,
en: PropTypes.string,
}
render() {
const {to, cn, en} = this.props;
return (
<Link to={to}>
<span>
<span className="cn">{cn}</span>
<span className="en">{en}</span>
</span>
</Link>
);
}
}
......
...@@ -6,40 +6,144 @@ ...@@ -6,40 +6,144 @@
} }
.head { .head {
background: #364171; background: #fff;
height: 80px; height: 75px;
padding: 8px; padding: 8px;
color: #fff; color: #364171;
border-bottom: 1px solid #ccc; border-bottom: 1px solid #e0e0e0;
:global {
.page-logo {
margin: 20px 0 0 30px;
}
}
} }
.content { .content {
flex: 1; flex: 1;
display: flex; display: flex;
background-color: #e9ecf3;
padding: 20px 30px 0;
} }
.side { .side {
padding: 8px; /**/
width: 20%; width: 250px;
min-width: 200px; //min-width: 250px;
max-width: 250px; //max-width: 300px;
background: #fafafa; background: #fff;
border-right: 1px solid #ccc; border-right: 1px solid #e9e9e9;
margin-right: 0px; margin-right: 0px;
padding: 30px 0 0;
border-radius: 5px 0 0 5px;
:global {
.ant-menu-inline,
.ant-menu-vertical {
border-right: 0;
}
}
} }
.main { .main {
padding: 8px; display: flex;
flex-direction: column;
height: 100%;
padding: 10px 20px;
flex: 1 0 auto; flex: 1 0 auto;
overflow: auto; overflow: hidden;
background: #fff;
border-radius: 0 5px 5px 0;
h1 {
font-size: 24px;
color: #404040;
font-weight: 400;
line-height: 40px;
margin-bottom: 24px;
margin-top: 8px;
font-family: lato, Helvetica Neue, Helvetica, PingFang SC, Hiragino Sans GB, Microsoft YaHei, Arial, sans-serif;
}
h2 {
font-size: 22px;
color: #505050;
font-weight: 400;
line-height: 36px;
}
h3 {
font-size: 18px;
color: #606060;
font-weight: 400;
line-height: 30px;
}
//& > section {
// display: flex;
// flex-direction: column;
// height: 100%;
// overflow: auto;
// & > header {
// h1 {
// line-height: 30px;
// margin: 0;
// }
// :global {
// .ant-breadcrumb {
// & > span {
// line-height: 42px;
// }
// }
// }
// }
// & > * {
// &:nth-child(2){
// flex: 1;
// overflow: auto;
// display: flex;
// flex-direction: column;
// :global{
// .content{
// flex:1;
// }
// }
//
// }
// }
//}
:global {
.tac {
text-align: center !important;
}
.main-header {
border-bottom: 1px solid #eaeaea;
margin-bottom: 20px;
h1 {
margin-bottom: 10px;
}
}
}
} }
.foot { .foot {
background: #fafafa; //background: #fafafa;
border-top: 1px solid #ccc; //border-top: 1px solid #e0e0e0;
padding: 8px; padding: 8px;
font-size: 12px;
text-align: center;
a {
margin-left: .5em;
opacity: .8;
}
} }
:global(.tac){ :global {
text-align: center !important; .img-priview-dialog {
.ant-modal-content {
background-color: transparent;
img {
margin: auto;
display: block;
}
}
}
} }
...@@ -18,16 +18,18 @@ import { ...@@ -18,16 +18,18 @@ import {
DatePicker, DatePicker,
Table, Table,
Spin, Spin,
Breadcrumb
} from 'antd'; } from 'antd';
import HuikuanInfoForm from '../../components/HuikuanInfoForm/HuikuanInfoForm'; import HuikuanInfoForm from '../../components/ProductForm/HuikuanInfoForm';
import ProductBaseInfoForm from '../../components/ProductBaseInfoForm/ProductBaseInfoForm'; import BaseInfoForm from '../../components/ProductForm/BaseInfoForm';
import ShouyiYongjingForm from '../../components/ShouyiYongjingForm/ShouyiYongjingForm'; import ShouyiYongjingForm from '../../components/ProductForm/ShouyiYongjingForm';
import ProductElementForm from '../../components/ProductElementForm/ProductElementForm'; import ElementForm from '../../components/ProductForm/ElementForm';
import ProductDateTimeForm from '../../components/ProductDateTimeForm/ProductDateTimeForm'; import DateTimeStatusForm from '../../components/ProductForm/DateTimeStatusForm';
import ProductDocumentsForm from '../../components/ProductDocumentsForm/ProductDocumentsForm'; import DocumentsForm from '../../components/ProductForm/DocumentsForm';
import ProductContactForm from '../../components/ProductContactForm/ProductContactForm'; import ContactForm from '../../components/ProductForm/ContactForm';
import MainHeader from '../../components/MainHeader';
import Layout from '../../components/Layout/Layout';
class PublishForm extends Component { class PublishForm extends Component {
constructor(props, content) { constructor(props, content) {
...@@ -51,7 +53,7 @@ class PublishForm extends Component { ...@@ -51,7 +53,7 @@ class PublishForm extends Component {
return ( return (
<div style={{textAlign:'center'}}> <div style={{textAlign:'center'}}>
<h1>请确认产品各项信息已经填写完整!</h1> <h1>请确认产品各项信息已经填写完整!</h1>
<Button type="primary" loading={this.props.loading} onClick={this.handlePublish.bind(this)} > <Button type="primary" loading={this.props.loading} onClick={this.handlePublish.bind(this)}>
<Icon type="solution"/>发布 <Icon type="solution"/>发布
</Button> </Button>
</div> </div>
...@@ -85,15 +87,15 @@ export default class AddItem extends Component { ...@@ -85,15 +87,15 @@ export default class AddItem extends Component {
componentWillMount() { componentWillMount() {
const {product, cates} = this.props; const {cates} = this.props;
if (!cates || !cates.length) { if (!cates || !cates.length) {
this.fetchCates(); this.fetchCates();
} }
if (!product || !product.id) {
this.props.dispatch({ this.props.dispatch({
type: 'CREATE_PRODUCT_ITEM' type: 'CREATE_PRODUCT_ITEM'
}); });
}
}; };
fetchCates() { fetchCates() {
...@@ -111,7 +113,7 @@ export default class AddItem extends Component { ...@@ -111,7 +113,7 @@ export default class AddItem extends Component {
const tabs = [{ const tabs = [{
tab: '基本信息', tab: '基本信息',
children: ProductBaseInfoForm children: BaseInfoForm
}, { }, {
tab: '收益佣金', tab: '收益佣金',
children: ShouyiYongjingForm children: ShouyiYongjingForm
...@@ -120,37 +122,37 @@ export default class AddItem extends Component { ...@@ -120,37 +122,37 @@ export default class AddItem extends Component {
children: HuikuanInfoForm children: HuikuanInfoForm
}, { }, {
tab: '基本要素', tab: '基本要素',
children: ProductElementForm children: ElementForm
}, { }, {
tab: '时间', tab: '时间',
children: ProductDateTimeForm children: DateTimeStatusForm
}, { }, {
tab: '相关附件', tab: '相关附件',
children: ProductDocumentsForm children: DocumentsForm
}, { }, {
tab: '服务经理', tab: '服务经理',
children: ProductContactForm children: ContactForm
}, { }, {
tab: '发布', tab: '发布',
children: PublishForm children: PublishForm
}].map((tabPane, index)=> { }].map((tabPane, index)=> {
tabPane.key = 'tabs-pane-' + (index + 1); tabPane.key = 'tabs-pane-' + (index + 1);
tabPane.disabled = index != this.state.step - 1; //tabPane.disabled = index != this.state.step - 1;
return tabPane; return tabPane;
}); });
const header = <MainHeader breadcrumb={['产品管理', '添加产品']} title="添加产品"/>;
return ( return (
<div className={styles.normal}> <Layout header={header}>
<Tabs ref="tabs" className={styles.tabs} tabPosition="left" > <Tabs className={styles.tabs} tabPosition="left">
{ tabs.map(tp=> { tabs.map(tp=>
<Tabs.TabPane tab={tp.tab} key={tp.key} > <Tabs.TabPane tab={tp.tab} key={tp.key}>
{product && <tp.children {...this.props} /> } {product && <tp.children {...this.props} /> }
</Tabs.TabPane> </Tabs.TabPane>
)} )}
</Tabs> </Tabs>
</div> </Layout>
); );
} }
} }
......
...@@ -17,17 +17,19 @@ import { ...@@ -17,17 +17,19 @@ import {
Modal, Modal,
DatePicker, DatePicker,
Table, Table,
Spin Spin,
Breadcrumb
} from 'antd'; } from 'antd';
import HuikuanInfoForm from '../../components/HuikuanInfoForm/HuikuanInfoForm'; import HuikuanInfoForm from '../../components/ProductForm/HuikuanInfoForm';
import ProductBaseInfoForm from '../../components/ProductBaseInfoForm/ProductBaseInfoForm'; import BaseInfoForm from '../../components/ProductForm/BaseInfoForm';
import ShouyiYongjingForm from '../../components/ShouyiYongjingForm/ShouyiYongjingForm'; import ShouyiYongjingForm from '../../components/ProductForm/ShouyiYongjingForm';
import ProductElementForm from '../../components/ProductElementForm/ProductElementForm'; import ElementForm from '../../components/ProductForm/ElementForm';
import ProductDateTimeForm from '../../components/ProductDateTimeForm/ProductDateTimeForm'; import DateTimeStatusForm from '../../components/ProductForm/DateTimeStatusForm';
import ProductDocumentsForm from '../../components/ProductDocumentsForm/ProductDocumentsForm'; import DocumentsForm from '../../components/ProductForm/DocumentsForm';
import ProductContactForm from '../../components/ProductContactForm/ProductContactForm'; import ContactForm from '../../components/ProductForm/ContactForm';
import MainHeader from '../../components/MainHeader';
import Layout from '../../components/Layout/Layout';
@connect(state=>({ @connect(state=>({
cates: state.product.cates, cates: state.product.cates,
...@@ -53,9 +55,7 @@ export default class EditItem extends Component { ...@@ -53,9 +55,7 @@ export default class EditItem extends Component {
if (!this.props.cates.length) { if (!this.props.cates.length) {
this.fetchCates(); this.fetchCates();
} }
if (!(this.props.product && this.props.product.id)) { this.fetchItem(this.props.params.id);
this.fetchItem(this.props.params.id);
}
}; };
fetchCates() { fetchCates() {
...@@ -73,35 +73,52 @@ export default class EditItem extends Component { ...@@ -73,35 +73,52 @@ export default class EditItem extends Component {
render = ()=> { render = ()=> {
const {product} = this.props; const {product} = this.props;
const styles = require('./Product.less');
const tabs = [{
tab: '基本信息',
children: BaseInfoForm
}, {
tab: '收益佣金',
children: ShouyiYongjingForm
}, {
tab: '汇款账号',
children: HuikuanInfoForm
}, {
tab: '基本要素',
children: ElementForm
}, {
tab: '时间状态',
children: DateTimeStatusForm
}, {
tab: '相关附件',
children: DocumentsForm
}, {
tab: '服务经理',
children: ContactForm
}].map((tabPane, index)=> {
tabPane.key = 'tabs-pane-' + (index + 1);
return tabPane;
});
const header = (<MainHeader breadcrumb={['产品管理', '产品详情']}
title={(product && product.itemShortTitle ? product.itemShortTitle + ' - ' : '') + '产品详情'}/>);
return ( return (
<Spin spinning={this.props.loading}> <Layout header={header}>
<Tabs tabPosition="top"> <Tabs className={styles.tabs} tabPosition="left">
<Tabs.TabPane tab="基本信息" key="tab-pane-1"> { tabs.map(tp=>
{ product && <ProductBaseInfoForm {...this.props}/> } <Tabs.TabPane tab={tp.tab} key={tp.key}>
</Tabs.TabPane> {product && <tp.children {...this.props} /> }
<Tabs.TabPane tab="收益与佣金" key="tab-pane-2"> </Tabs.TabPane>
{ product && <ShouyiYongjingForm {...this.props}/> } )}
</Tabs.TabPane>
<Tabs.TabPane tab="汇款账号" key="tab-pane-4">
{ product && <HuikuanInfoForm {...this.props}/> }
</Tabs.TabPane>
<Tabs.TabPane tab="基本要素" key="tab-pane-5">
{ product && <ProductElementForm {...this.props} /> }
</Tabs.TabPane>
<Tabs.TabPane tab="时间状态" key="tab-pane-6">
{ product && <ProductDateTimeForm {...this.props} /> }
</Tabs.TabPane>
<Tabs.TabPane tab="相关附件" key="tab-pane-7">
{ product && <ProductDocumentsForm {...this.props} /> }
</Tabs.TabPane>
<Tabs.TabPane tab="服务经理" key="tab-pane-8">
{ product && <ProductContactForm {...this.props} /> }
</Tabs.TabPane>
</Tabs> </Tabs>
</Spin> </Layout>
); );
} }
} }
import React, {Component, PropTypes} from 'react';
import {connect} from 'react-redux';
import {Link} from 'react-router';
import {
Row,
Col,
Form,
Input,
Button,
Checkbox,
Select,
message,
Tabs,
Cascader,
Radio,
Upload,
Icon,
Modal,
DatePicker,
Table,
Spin
} from 'antd';
@connect(state=>({
item: state.product.item,
loading: state.product.loading
}))
export default class Item extends Component {
componentWillMount() {
this.fetchItem(this.props.params.id);
};
fetchItem(id) {
this.props.dispatch({
type: 'FETCH_PRODUCT_ITEM',
id
});
};
handleGoBack(e) {
e.preventDefault();
this.props.history.goBack();
};
render() {
const tw = 6;
const vw = 18;
const styles = require('../Trade/Item.less');
const {item, loading} = this.props;
return (
<Spin spinning={loading}>
{
item &&
<div className={styles.trade}>
<div className={styles.tradeTable}>
<Row type="flex" justify="space-around" align="middle">
<Col span={tw}>产品标题</Col>
<Col span={vw}>{item.itemTitle}</Col>
</Row>
<Row type="flex" justify="space-around" align="middle">
<Col span={tw}>产品短标题</Col>
<Col span={vw}>{item.itemShortTitle}</Col>
</Row>
<Row type="flex" justify="space-around" align="middle">
<Col span={tw}>产品标题</Col>
<Col span={vw}>{item.itemTitle}</Col>
</Row>
<Row type="flex" justify="space-around" align="middle">
<Col span={tw}>产品标题</Col>
<Col span={vw}>{item.itemTitle}</Col>
</Row>
<Row type="flex" justify="space-around" align="middle">
<Col span={tw}>产品标题</Col>
<Col span={vw}>{item.itemTitle}</Col>
</Row>
</div>
<p>
<Button onClick={this.handleGoBack.bind(this)}>返回</Button>
<Link to={'/products/'+ item.id+'/edit'}><Button>编辑</Button></Link>
<Link to={'/announcement?itemId='+item.id}><Button>公告</Button></Link>
<Link
to={'/trades/create/'+ item.id+'?title='+ item.itemShortTitle}><Button>报单</Button></Link>
</p>
</div>
}
</Spin>
);
}
}
import React, {Component, PropTypes} from 'react'; import React, {Component, PropTypes} from 'react';
import {connect} from 'react-redux'; import {connect} from 'react-redux';
import {Table, Icon} from 'antd'; import {Table, Icon, Breadcrumb, Row, Col, Pagination} from 'antd';
import {serialize, formatDateTime, productStatusToString} from '../../utils'; import {
serialize,
formatDateTime,
productStatusToString,
productEnableCreateTrade
} from '../../utils';
import {Link} from 'react-router'; import {Link} from 'react-router';
import Layout from '../../components/Layout/Layout';
import MainHeader from '../../components/MainHeader';
const columns = [ const columns = [
{ {
...@@ -16,32 +24,32 @@ const columns = [ ...@@ -16,32 +24,32 @@ const columns = [
dataIndex: 'cateId', dataIndex: 'cateId',
key: 'cateId', key: 'cateId',
width: 80, width: 80,
className:'tac', className: 'tac',
render: (cateId, record)=>(<span data-cate-id={cateId}>{record.cateName}</span>) render: (cateId, record)=>(<span data-cate-id={cateId}>{record.cateName}</span>)
}, { }, {
title: '标题', title: '标题',
dataIndex: 'shortTitle', dataIndex: 'shortTitle',
key: 'shortTitle', key: 'shortTitle',
render: (shortTitle, record)=>(<span title={shortTitle}>{(shortTitle + '').substring(0, 20)}</span>) render: (shortTitle, record)=>(<span title={shortTitle}>{(shortTitle + '').substring(0, 15)}</span>)
}, { }, {
title: '募集比率', title: '募集比率',
dataIndex: 'rate', dataIndex: 'rate',
key: 'rate', key: 'rate',
width:120, width: 120,
className:'tac', className: 'tac',
}, { }, {
title: '状态', title: '状态',
dataIndex: 'status', dataIndex: 'status',
key: 'status', key: 'status',
width:120, width: 80,
className:'tac', className: 'tac',
render: (status, record)=>(<span data-status={status}>{productStatusToString(status)}</span>) render: (status, record)=>(<span data-status={status}>{productStatusToString(status)}</span>)
}, { }, {
title: '创建时间', title: '创建时间',
dataIndex: 'dateCreated', dataIndex: 'dateCreated',
key: 'dateCreated', key: 'dateCreated',
width:150, width: 150,
className:'tac', className: 'tac',
render: (dateCreated, record)=>( render: (dateCreated, record)=>(
<span> <span>
{dateCreated && formatDateTime(dateCreated)} {dateCreated && formatDateTime(dateCreated)}
...@@ -50,15 +58,21 @@ const columns = [ ...@@ -50,15 +58,21 @@ const columns = [
}, { }, {
title: '操作', title: '操作',
key: 'operation', key: 'operation',
width:120, width: 120,
className:'tac', className: 'tac',
render: (text, record)=>( render: (text, product)=>(
<span> <span>
<a href={'/product/item?id='+ record.id}>详情</a> <Link to={'/announcement?itemId='+product.id+'&title='+product.shortTitle}
<span className="ant-divider"></span> onClick={e=>e.stopPropagation()}>公告</Link>
<Link to={'/announcement?itemId='+record.id} onClick={e=>e.stopPropagation()}>公告</Link> {
<span className="ant-divider"></span> productEnableCreateTrade(product.status) &&
<Link to={'/trades/add/'+record.id+'?title='+record.shortTitle}>报单</Link> <span>
<span className="ant-divider"></span>
<Link to={'/trades/create?itemId='+product.id+'&title='+product.shortTitle}
onClick={e=>e.stopPropagation()}>报单</Link>
</span>
}
</span> </span>
) )
} }
...@@ -76,7 +90,7 @@ export default class List extends Component { ...@@ -76,7 +90,7 @@ export default class List extends Component {
} }
componentWillMount() { componentDidMount() {
this.fetchList(this.props.location.query); this.fetchList(this.props.location.query);
}; };
...@@ -87,8 +101,8 @@ export default class List extends Component { ...@@ -87,8 +101,8 @@ export default class List extends Component {
}); });
}; };
handleRowClick({id}){ handleRowClick({id}) {
this.props.history.push('/products/'+id+'/edit'); this.props.history.push('/products/' + id);
} }
...@@ -117,16 +131,20 @@ export default class List extends Component { ...@@ -117,16 +131,20 @@ export default class List extends Component {
} }
}; };
return <div> const header = (<MainHeader breadcrumb={['产品管理', '产品列表']}
<h1>产品列表</h1> title="产品列表"/>);
<Table className="ant-table" columns={columns}
dataSource={Array.isArray(items)?items:[]} return (
loading={loading} <Layout header={header}>
pagination={pagination} <Table className="ant-table" columns={columns}
scroll={{ y: window.innerHeight-290 }} dataSource={Array.isArray(items)?items:[]}
onRowClick={this.handleRowClick.bind(this)} loading={loading}
/> pagination={pagination}
</div>; scroll={{ y: window.innerHeight-380 }}
onRowClick={this.handleRowClick.bind(this)}
/>
</Layout>
);
} }
} }
......
.normal {
.tabs {
flex: 1;
display: flex; display: flex;
flex-direction: column;
height: 100%; height: 100%;
.tabs { &:global(.ant-tabs-top) {
flex: 1; flex-direction: column;
display: flex;
:global { :global {
.tablist { .ant-tabs-content {
display: flex;
& > div {
flex: 1;
}
} }
.ant-tabs-content{ }
flex: 1; }
:global {
.tablist {
}
.ant-tabs-content {
flex: 1;
height: 100%;
.ant-tabs-tabpane {
height: 100%;
overflow: auto;
} }
} }
} }
......
import React, {Component, PropTypes} from 'react';
import {connect} from 'react-redux';
import {
Row,
Col,
Form,
Input,
Button,
Checkbox,
Select,
message,
Tabs,
Cascader,
Radio,
Upload,
Icon,
Modal,
DatePicker,
Table,
Spin
} from 'antd';
import Layout from '../../components/Layout/Layout';
import MainHeader from '../../components/MainHeader';
import {formItemLayout, footerFormSubmitLayout} from '../../utils';
@connect(state=>({
loading: state.remittance.loading,
audit: state.remittance.audit,
}))
@Form.create()
export default class EditItem extends Component {
constructor() {
super(...arguments);
}
componentDidMount() {
this.fetchItem(this.props.params.id);
};
fetchItem(id) {
this.props.dispatch({
type: 'FETCH_AUDIT_ITEM',
id
});
};
handleSubmit(e) {
e.preventDefault();
const data = this.props.form.getFieldsValue();
data.id = this.props.audit.id;
console.log(data);
// this.props.dispatch({
// type: 'UPDATE_AUDIT_ITEM',
// data
// });
}
render() {
const {audit, loading, form:{getFieldProps}, location:{query}} = this.props;
const header = (<MainHeader breadcrumb={['审核管理', '报单审核','审核详情']}
title={(audit && audit.title ? audit.title + ' - ' : '') + '审核详情'}/>);
return (
<Layout header={header}>
<Spin spinning={loading}>
{
audit &&
<Form horizontal onSubmit={this.handleSubmit.bind(this)}>
<Form.Item label="产品募集情况" {...formItemLayout}>
<Input placeholder="公告标题"
{...getFieldProps('title', {
initialValue: audit.title
})} />
</Form.Item>
<Form.Item label="内容" {...formItemLayout}>
<Input placeholder="公告内容" autosize={{ minRows: 5 }} type="textarea"
{...getFieldProps('announcement', {
initialValue: audit.announcement
})} />
</Form.Item>
<Form.Item {...footerFormSubmitLayout} style={{marginTop:30}}>
<Button type="primary" htmlType="submit" loading={loading}><Icon
type="save"/>修改</Button>
<Button onClick={e=>{e.preventDefault(); this.props.history.goBack();}}
style={{marginLeft:'1em'}}>
<Icon type="rollback"/>返回
</Button>
</Form.Item>
</Form>
}
</Spin>
</Layout>
);
}
}
import React, {Component, PropTypes} from 'react';
import {connect} from 'react-redux';
import {Table, Icon} from 'antd';
import {Link} from 'react-router';
import {serialize, formatDateTime, tradeStatusToString} from '../../../utils';
import Layout from '../../../components/Layout/Layout';
import MainHeader from '../../../components/MainHeader';
const columns = [
{
title: 'ID',
dataIndex: 'id',
key: 'id',
width: 70
}, {
title: '产品',
dataIndex: 'itemShortTitle',
key: 'itemShortTitle',
render: (shortTitle, record)=>(<span title={shortTitle}>{(shortTitle + '').substring(0, 20)}</span>)
}, {
title: '投资人',
dataIndex: 'buyerName',
key: 'buyerName',
width: 100,
className: 'tac',
}, {
title: '预约额度',
dataIndex: 'reservationAmount',
key: 'reservationAmount',
width: 80,
className: 'tac',
}, {
title: '报单时间',
dataIndex: 'submitReceiptTime',
key: 'submitReceiptTime',
width: 150,
className: 'tac',
render: (submitReceiptTime, record)=>(
<span>
{submitReceiptTime && formatDateTime(submitReceiptTime)}
</span>
)
}, {
title: '状态',
dataIndex: 'status',
key: 'status',
width: 120,
className: 'tac',
render: (status, record)=>(<span data-status={status}>{tradeStatusToString(status)}</span>)
}, {
title: '操作',
key: 'operation',
width: 60,
// fixed:'right',
className: 'tac',
render: (text, record)=>(
<span>
<Link to={'/trades/contract/'+ record.id} onClick={e=>e.stopPropagation()}>审核</Link>
</span>
)
}
];
@connect(state=>({
items: state.remittance.audits,
loading: state.remittance.loading,
total: state.remittance.total,
}))
export default class List extends Component {
constructor(props, context) {
super(props, context);
}
componentDidMount() {
this.fetchList(this.props.location.query);
};
fetchList(query) {
this.props.dispatch({
type: 'FETCH_AUDIT_LIST',
query
});
}
handleRowClick({id}) {
this.props.history.push('/remittance/audits/' + id);
}
render() {
const {total, items, loading, history:{replace}, location:{pathname, query}} = this.props;
const pagination = {
total: total,
pageSize: parseInt(query.s, 10) || 10,
current: parseInt(query.p, 10) || 1,
showSizeChanger: true,
onShowSizeChange: (current, pageSize)=> {
console.log('Current: ', current, '; PageSize: ', pageSize);
query.p = current;
query.s = pageSize;
replace(pathname + '?' + serialize(query));
this.fetchList(query);
},
onChange: (current) => {
console.log('Current: ', current);
query.p = current;
replace(pathname + '?' + serialize(query));
this.fetchList(query);
}
};
const header = (<MainHeader breadcrumb={['审核管理', '报单审核']}
title="审核列表"/>);
return (
<Layout header={header}>
<Table className="ant-table" columns={columns}
dataSource={Array.isArray(items)?items:[]}
loading={loading}
pagination={pagination}
scroll={{ y: window.innerHeight-380 }}
onRowClick={this.handleRowClick.bind(this)}
/>
</Layout>
);
}
}
This diff is collapsed.
import React, {Component, PropTypes} from 'react'; import React, {Component, PropTypes} from 'react';
import {connect} from 'react-redux'; import {connect} from 'react-redux';
import {Form, Input, Button, Checkbox, message, Row, Col} from 'antd'; import {
Row,
Col,
Form,
Input,
Button,
Checkbox,
Select,
message,
Tabs,
Cascader,
Radio,
Upload,
Icon,
Modal,
DatePicker,
Table,
Spin
} from 'antd';
import {
formatDateTime,
formItemLayout,
smallFormItemLayout,
footerFormSubmitLayout,
handleUpload
} from '../../utils';
import Layout from '../../components/Layout/Layout';
import MainHeader from '../../components/MainHeader';
@connect(state=>({ @connect(state=>({
item: state.trade.item item: state.trade.item,
loading: state.trade.loading
})) }))
@Form.create()
export default class Commission extends Component { export default class Commission extends Component {
componentWillMount() { componentWillMount() {
...@@ -16,45 +46,81 @@ export default class Commission extends Component { ...@@ -16,45 +46,81 @@ export default class Commission extends Component {
}); });
}; };
handleGoBack(e) {
e.preventDefault();
this.props.history.goBack();
};
handleCommission(e){ handleSubmit(e) {
e.preventDefault(); e.preventDefault();
alert('二次确认后发放'); alert('ok');
this.props.dispatch({
type: 'SETTLEMENT_TRADE_ITEM',
id: this.props.item.id
})
} }
render() { render() {
const {item} = this.props;
const styles = require('./Item.less'); const {item, loading, form:{getFieldProps}, location:{query}} = this.props;
const tw = 8;
const vw = 16; const header = (<MainHeader breadcrumb={['订单管理', '订单详情', '佣金发放']}
title={(item && item.shortTitle + ' - ' || '') + '佣金发放'}/>);
return ( return (
<div className={styles.trade}> <Layout header={header}>
<h1 className="tac">佣金发放</h1> <Spin spinning={loading}>
<div className={styles.tradeTable}> <Form horizontal onSubmit={this.handleSubmit.bind(this)}>
<Row type="flex" justify="space-around" align="middle"> <Form.Item label="产品" {...smallFormItemLayout}>
<Col span={tw}>产品</Col> <p>{item && item.title}</p>
<Col span={vw}>{item.title}</Col> </Form.Item>
</Row>
<Row type="flex" justify="space-around" align="middle"> <Form.Item label="确认打款金额" {...smallFormItemLayout}>
<Col span={tw}>确认打款金额</Col> <Input placeholder="确认打款金额"
<Col span={vw}>{item.remittanceAmount}</Col> readOnly
</Row> {...getFieldProps('remittanceAmount', {
initialValue: item && item.remittanceAmount
<Row type="flex" justify="space-around" align="middle"> })} />
<Col span={tw}>实际佣金</Col> </Form.Item>
<Col span={vw}>{item.realReturn && item.realReturn.yj}</Col> <Form.Item label="实际佣金" {...smallFormItemLayout}>
</Row> <Input placeholder="实际佣金"
</div> readOnly
<p> {...getFieldProps('realReturn', {
<Button onClick={this.handleGoBack.bind(this)}>返回</Button> initialValue: item && item.realReturn && item.realReturn.yj
<Button onClick={this.handleCommission.bind(this)}>发放</Button> })} />
</p> </Form.Item>
</div> <Form.Item {...footerFormSubmitLayout} style={{marginTop:30}}>
<Button type="primary" htmlType="submit" loading={loading}><Icon type="save"/>发放</Button>
<Button onClick={e=>{e.preventDefault(); this.props.history.goBack();}}
style={{marginLeft:'1em'}}>
<Icon type="rollback"/>返回
</Button>
</Form.Item>
</Form>
</Spin>
</Layout>
); );
} }
} }
// <div className={styles.trade}>
// <div className={styles.tradeTable}>
// <Row type="flex" justify="space-around" align="middle">
// <Col span={tw}>产品</Col>
// <Col span={vw}>{item.title}</Col>
// </Row>
// <Row type="flex" justify="space-around" align="middle">
// <Col span={tw}>确认打款金额</Col>
// <Col span={vw}>{item.remittanceAmount}</Col>
// </Row>
//
// <Row type="flex" justify="space-around" align="middle">
// <Col span={tw}>实际佣金</Col>
// <Col span={vw}>{item.realReturn && item.realReturn.yj}</Col>
// </Row>
// </div>
// <p>
// <Button onClick={this.handleGoBack.bind(this)}>返回</Button>
// {
// (item.status == 11 || item.status == 21) &&
// <Button onClick={this.handleCommission.bind(this)}>发放</Button>
// }
// </p>
// </div>
import React, {Component, PropTypes} from 'react'; import React, {Component, PropTypes} from 'react';
import {connect} from 'react-redux'; import {connect} from 'react-redux';
import {Form, Input, Button, Checkbox, message, Row, Col} from 'antd'; import {
Row,
Col,
Form,
Input,
Button,
Checkbox,
Select,
message,
Tabs,
Cascader,
Radio,
Upload,
Icon,
Modal,
DatePicker,
Table,
Spin
} from 'antd';
import {
formatDateTime,
formItemLayout,
smallFormItemLayout,
footerFormSubmitLayout,
handleUpload
} from '../../utils';
import Layout from '../../components/Layout/Layout';
import MainHeader from '../../components/MainHeader';
@connect(state=>({ @connect(state=>({
item: state.trade.item loading: state.contract.loading,
trade: state.contract.trade,
shipping: state.contract.shipping
})) }))
@Form.create()
export default class Contract extends Component { export default class Contract extends Component {
componentWillMount() { componentDidMount() {
const {dispatch, params:{id}} = this.props; const {dispatch, params:{id}} = this.props;
dispatch({ dispatch({
type: 'FETCH_TRADE_ITEM', type: 'FETCH_CONTRACT_ITEM',
id id
}); });
}; };
handleGoBack(e) {
e.preventDefault();
this.props.history.goBack();
};
handleSubmit(e){ handleSubmit(e) {
e.preventDefault(); e.preventDefault();
alert('实现保存物流订单号的流程'); const data = this.props.form.getFieldsValue();
data.id = this.props.trade.id;
console.log(data);
this.props.dispatch({
type: 'UPDATE_CONTRACT_ITEM',
data
});
} }
render() { render() {
const {item} = this.props;
const styles = require('./Item.less'); const {trade, shipping, loading, form:{getFieldProps}, location:{query}} = this.props;
const tw = 8;
const vw = 16; const header = (<MainHeader breadcrumb={['订单管理', '订单详情', '合同物流']}
title="合同物流详情"/>);
return ( return (
<div className={styles.trade}> <Layout header={header} >
<h1 className="tac">合同物流</h1> <Spin spinning={loading}>
<div className={styles.tradeTable}> <Form horizontal onSubmit={this.handleSubmit.bind(this)}>
<Row type="flex" justify="space-around" align="middle"> <Form.Item label="产品" {...smallFormItemLayout}>
<Col span={tw}>产品</Col> <p>{trade && trade.itemTitle}</p>
<Col span={vw}>{item.title}</Col> </Form.Item>
</Row> <Form.Item label="顺丰运单" {...smallFormItemLayout}>
<Row type="flex" justify="space-around" align="middle"> <Input placeholder="请填写顺丰运单编号"
<Col span={tw}>确认打款金额</Col> {...getFieldProps('expressNO', {
<Col span={vw}>{item.remittanceAmount}</Col> initialValue: shipping && shipping.expressNO
</Row> })} />
<Row type="flex" justify="space-around" align="middle"> </Form.Item>
<Col span={tw}>实际佣金</Col> <Form.Item {...footerFormSubmitLayout} style={{marginTop:30}}>
<Col span={vw}>{item.realReturn && item.realReturn.yj}</Col> <Button type="primary" htmlType="submit" loading={loading}><Icon type="save"/>保存</Button>
</Row> <Button onClick={e=>{e.preventDefault(); this.props.history.goBack();}}
<Row type="flex" justify="space-around" align="middle"> style={{marginLeft:'1em'}}>
<Col span={tw} className="isRequire">顺丰运单</Col> <Icon type="rollback"/>返回
<Col span={vw}><Input placeholder="请填写顺丰运单编号" /></Col> </Button>
</Row> </Form.Item>
</div> </Form>
<p> </Spin>
<Button onClick={this.handleGoBack.bind(this)}>返回</Button> </Layout>
<Button onClick={this.handleSubmit.bind(this)}>保存</Button>
</p>
</div>
); );
} }
} }
This diff is collapsed.
This diff is collapsed.
...@@ -11,7 +11,7 @@ ...@@ -11,7 +11,7 @@
} }
.tradeTable { .tradeTable {
border-top: 1px solid #e9e9e9; //border-top: 1px solid #e9e9e9;
border-bottom: 1px solid #e9e9e9; border-bottom: 1px solid #e9e9e9;
//max-width: 800px; //max-width: 800px;
//margin: auto; //margin: auto;
......
This diff is collapsed.
export Home from './Home/Home';
export NotFound from './NotFound/NotFound';
export Login from './Login/Login';
export App from './App/App';
export ProductList from './Product/List';
export ProductAddItem from './Product/AddItem';
export ProductEditItem from './Product/EditItem';
export TradeList from './Trade/List';
export TradeItem from './Trade/Item';
export Commission from './Trade/Commission';
export Contract from './Trade/Contract';
export TradeAddItem from './Trade/AddItem';
export AnnouncementList from './Announcement/List';
export AnnouncementEditItem from './Announcement/EditItem';
export AnnouncementAddItem from './Announcement/AddItem';
export RemittanceAuditList from './Remittance/Audit/List';
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -16,7 +16,6 @@ export async function fetchItem(id) { ...@@ -16,7 +16,6 @@ export async function fetchItem(id) {
} }
export async function updateItem(item){ export async function updateItem(item){
return xFetch('/api/products/'+ item.id, { return xFetch('/api/products/'+ item.id, {
method:'PUT', method:'PUT',
body: serialize(item) body: serialize(item)
......
This diff is collapsed.
This diff is collapsed.
...@@ -6,6 +6,7 @@ const errorMessages = (res) => `${res.status} ${res.statusText}`; ...@@ -6,6 +6,7 @@ const errorMessages = (res) => `${res.status} ${res.statusText}`;
function check401(res) { function check401(res) {
if (res.status === 401) { if (res.status === 401) {
location.href = '/login'; location.href = '/login';
//console.log('401');
} }
return res; return res;
} }
......
This diff is collapsed.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment