Commit 9c677677 authored by LeeJiancong's avatar LeeJiancong

对接待提交

parents f87949ab 4a38f03d
...@@ -8,4 +8,5 @@ export interface IProductModule { ...@@ -8,4 +8,5 @@ export interface IProductModule {
setProductSelectAttribute(list: any[]):void; setProductSelectAttribute(list: any[]):void;
setSelectedGoods(lists: any[]):void; setSelectedGoods(lists: any[]):void;
setTableDataSource(datas: any[]):void; setTableDataSource(datas: any[]):void;
clearData(data: any[]):void;
} }
...@@ -27,11 +27,22 @@ const AddProducts: React.FC<{}> = (props) => { ...@@ -27,11 +27,22 @@ const AddProducts: React.FC<{}> = (props) => {
const onSave = () => { const onSave = () => {
console.log('点击保存') console.log('点击保存')
console.log(formRefs, 'formrefs') console.log(formRefs, 'formrefs')
if(formRefs.length > 0){
try{
let data = formRefs.map(async __ => {
return ( await __.current.validateFields())
})
console.log(data)
// let vaild = data.every(__ => Boolean(__))
// return vaild ? data :vaild
}catch(e){
console.log(e,'error')
}
}
} }
const callback = (key: any) => { const callback = (key: any) => {
console.log(key) console.log(key)
console.log(attributeList)
} }
return (<PageHeaderWrapper return (<PageHeaderWrapper
......
import React, { useState, useEffect, useRef } from 'react' import React, { useState, useEffect, useRef } from 'react'
import {history} from 'umi' import {history} from 'umi'
import { Button, Form, Select, Checkbox, Tooltip, Radio, Input, Table, Modal, Row, Col } from 'antd' import { Button, Form, Select, Checkbox, Tooltip, Radio, Input, Table, Modal, Row, Col } from 'antd'
import styles from './index.less'
import { PublicApi } from '@/services/api' import { PublicApi } from '@/services/api'
import { StandardTable } from 'god' import { GetLogisticsSelectListCompanyResponse, GetLogisticsSelectListShipperAddressResponse } from '@/services'
import { ColumnType } from 'antd/lib/table/interface'
import { EyeOutlined, QuestionCircleOutlined, SettingOutlined, PlusOutlined, MinusOutlined } from '@ant-design/icons'
const layout = { const layout = {
labelCol: { labelCol: {
...@@ -27,10 +24,22 @@ const LogisticsForm: React.FC<Iprops> = (props) => { ...@@ -27,10 +24,22 @@ const LogisticsForm: React.FC<Iprops> = (props) => {
const logisticsFormRef = useRef() const logisticsFormRef = useRef()
const [logisticsForm] = Form.useForm() const [logisticsForm] = Form.useForm()
const [logisticsCompanyLists, setLogisticsCompanyLists] = useState<GetLogisticsSelectListCompanyResponse>()
const [logisticsAddressList, setLogisticsAddressList] = useState<GetLogisticsSelectListShipperAddressResponse>()
useEffect(()=>{ useEffect(()=>{
//传入ref给父级 //传入ref给父级
onRef(logisticsFormRef) onRef(logisticsFormRef)
// 获取发货地址 物流公司
PublicApi.getLogisticsSelectListShipperAddress().then(res=>{
setLogisticsAddressList(res.data)
})
PublicApi.getLogisticsSelectListCompany().then(res=>{
setLogisticsCompanyLists(res.data)
})
}, []) }, [])
return (<> return (<>
...@@ -42,7 +51,7 @@ const LogisticsForm: React.FC<Iprops> = (props) => { ...@@ -42,7 +51,7 @@ const LogisticsForm: React.FC<Iprops> = (props) => {
ref={logisticsFormRef} ref={logisticsFormRef}
> >
<Form.Item <Form.Item
name="transportType" name="deliveryType"
label="配送方式" label="配送方式"
rules={[ rules={[
{ {
...@@ -59,7 +68,7 @@ const LogisticsForm: React.FC<Iprops> = (props) => { ...@@ -59,7 +68,7 @@ const LogisticsForm: React.FC<Iprops> = (props) => {
</Radio.Group> </Radio.Group>
</Form.Item> </Form.Item>
<Form.Item <Form.Item
name="chargeType" name="carriageType"
label="运费方式" label="运费方式"
rules={[ rules={[
{ {
...@@ -85,9 +94,9 @@ const LogisticsForm: React.FC<Iprops> = (props) => { ...@@ -85,9 +94,9 @@ const LogisticsForm: React.FC<Iprops> = (props) => {
]} ]}
> >
<Input suffix="KG" placeholder="请输入重量" /> <Input suffix="KG" placeholder="请输入重量" />
<Checkbox>使用运费模板(只有买家承担运费才能选择)</Checkbox> {/* <Checkbox>使用运费模板(只有买家承担运费才能选择)</Checkbox> */}
</Form.Item> </Form.Item>
<Form.Item {/* <Form.Item
name="chargeTemplate" name="chargeTemplate"
label="运费模板" label="运费模板"
> >
...@@ -99,31 +108,31 @@ const LogisticsForm: React.FC<Iprops> = (props) => { ...@@ -99,31 +108,31 @@ const LogisticsForm: React.FC<Iprops> = (props) => {
<Option value="EMS">EMS模板</Option> <Option value="EMS">EMS模板</Option>
<Option value="COM">一般快递模板</Option> <Option value="COM">一般快递模板</Option>
</Select> </Select>
</Form.Item> </Form.Item> */}
<Form.Item <Form.Item
name="address" name="sendAddressId"
label="发货地址" label="发货地址"
> >
<Select <Select
placeholder="请选择发货地址" placeholder="请选择发货地址"
allowClear allowClear
> >
<Option value="1">1</Option> {
<Option value="2">2</Option> logisticsAddressList?.length > 0 && logisticsAddressList.map(_=><Option key={_.id} value={_.id}>{_.fullAddress}</Option>)
<Option value="3">3</Option> }
</Select> </Select>
</Form.Item> </Form.Item>
<Form.Item <Form.Item
name="express" name="companyId"
label="物流公司" label="物流公司"
> >
<Select <Select
placeholder="请选择物流公司" placeholder="请选择物流公司"
allowClear allowClear
> >
<Option value="EMS">EMS</Option> {
<Option value="SF">顺丰</Option> logisticsCompanyLists?.length > 0 && logisticsCompanyLists.map(_=><Option key={_.id} value={_.id}>{_.name}</Option>)
<Option value="CN">菜鸟果果</Option> }
</Select> </Select>
</Form.Item> </Form.Item>
</Form> </Form>
......
...@@ -42,28 +42,28 @@ const OtherForm: React.FC<Iprops> = (props) => { ...@@ -42,28 +42,28 @@ const OtherForm: React.FC<Iprops> = (props) => {
ref={otherFormRef} ref={otherFormRef}
> >
<Form.Item <Form.Item
name="bill" name="isInvoice"
label="提供发票" label="提供发票"
> >
<Radio.Group size="small"> <Radio.Group size="small">
<Radio.Button value="1" style={{ width: 100, textAlign: 'center' }}></Radio.Button> <Radio.Button value={true} style={{ width: 100, textAlign: 'center' }}></Radio.Button>
<Radio.Button value="0" style={{ width: 100, textAlign: 'center' }}></Radio.Button> <Radio.Button value={false} style={{ width: 100, textAlign: 'center' }}></Radio.Button>
</Radio.Group> </Radio.Group>
</Form.Item> </Form.Item>
<Form.Item <Form.Item
name="maitou" name="marks"
label="唛头" label="唛头"
> >
<Input maxLength={25} placeholder="请输入唛头(最长25个字符)" /> <Input maxLength={25} placeholder="请输入唛头(最长25个字符)" />
</Form.Item> </Form.Item>
<Form.Item <Form.Item
name="statement" name="packing"
label="包装清单" label="包装清单"
> >
<TextArea maxLength={120} rows={4} placeholder="最长120个字符" /> <TextArea maxLength={120} rows={4} placeholder="最长120个字符" />
</Form.Item> </Form.Item>
<Form.Item <Form.Item
name="saleService" name="afterService"
label="售后服务" label="售后服务"
> >
<TextArea maxLength={300} rows={4} placeholder="最长300个字符" /> <TextArea maxLength={300} rows={4} placeholder="最长300个字符" />
......
...@@ -2,10 +2,6 @@ import React, { useState, useEffect, useRef, useContext } from 'react' ...@@ -2,10 +2,6 @@ import React, { useState, useEffect, useRef, useContext } from 'react'
import {history} from 'umi' import {history} from 'umi'
import { Button, Form, Select, Checkbox, Tabs, Input } from 'antd' import { Button, Form, Select, Checkbox, Tabs, Input } from 'antd'
import styles from './index.less' import styles from './index.less'
import { PublicApi } from '@/services/api'
import { StandardTable } from 'god'
import { ColumnType } from 'antd/lib/table/interface'
import { EyeOutlined } from '@ant-design/icons'
import { inject, observer } from 'mobx-react' import { inject, observer } from 'mobx-react'
// import { IProductModule } from '@/module/productModule' // import { IProductModule } from '@/module/productModule'
...@@ -36,19 +32,20 @@ const { TabPane } = Tabs ...@@ -36,19 +32,20 @@ const { TabPane } = Tabs
const { Option } = Select const { Option } = Select
const { TextArea } = Input const { TextArea } = Input
let paramsArray = [];
const ProductAttributeForm: React.FC<Iprops> = (props) => { const ProductAttributeForm: React.FC<Iprops> = (props) => {
const { attributesData, onRef } = props const { attributesData, onRef } = props
const productAttributeFormRef = useRef() const productAttributeFormRef = useRef()
const [attributeForm] = Form.useForm() const [attributeForm] = Form.useForm()
const { ProductStore } = store const { ProductStore } = store
const [paramsData, setParamsData] = useState<any>()
useEffect(()=>{ useEffect(()=>{
//传入ref给父级 //传入ref给父级
onRef(productAttributeFormRef) onRef(productAttributeFormRef)
}, []) }, [])
let paramsArray = [];
const onFinish = (values) => { const onFinish = (values) => {
console.log(values) console.log(values)
...@@ -93,8 +90,8 @@ const ProductAttributeForm: React.FC<Iprops> = (props) => { ...@@ -93,8 +90,8 @@ const ProductAttributeForm: React.FC<Iprops> = (props) => {
item[next.customerAttributeId] = next; item[next.customerAttributeId] = next;
return item return item
},{})) },{}))
console.log(resultParams, 'resultParams') // 最终转换数据 console.log(resultParams,'result', paramsArray) // 最终传输数据
ProductStore.setProductSelectAttribute(resultParams) //注入mobx ProductStore.setProductSelectAttribute(resultParams)
} }
const renderTabPanchildren = (attrItem: any) => { const renderTabPanchildren = (attrItem: any) => {
...@@ -136,7 +133,7 @@ const ProductAttributeForm: React.FC<Iprops> = (props) => { ...@@ -136,7 +133,7 @@ const ProductAttributeForm: React.FC<Iprops> = (props) => {
<Checkbox.Group onChange={(v)=>onChange(v, attrItem)}> <Checkbox.Group onChange={(v)=>onChange(v, attrItem)}>
{ {
attrItem?.customerAttributeValueList.length > 0 && attrItem.customerAttributeValueList.map((item: any, index: string) => ( attrItem?.customerAttributeValueList.length > 0 && attrItem.customerAttributeValueList.map((item: any, index: string) => (
<Checkbox key={item.id + index} value={item.id}>{item.value}</Checkbox> <Checkbox key={item.id} value={item.id}>{item.value}</Checkbox>
)) ))
} }
</Checkbox.Group> </Checkbox.Group>
......
import React, { useState, useEffect } from 'react' import React, { useState, useEffect } from 'react'
import {history} from 'umi' import {history} from 'umi'
import { Button, Form, Select, Checkbox, Tooltip, Radio, Input, Table, Modal, Row, Col, Alert } from 'antd' import { Button, Form, Select, Checkbox, Tooltip, Radio, Input, Table, Modal, Row, Col, Alert, Upload } from 'antd'
import styles from '../index.less' import styles from '../index.less'
import { PublicApi } from '@/services/api' import { PublicApi } from '@/services/api'
import { StandardTable } from 'god' import { StandardTable } from 'god'
...@@ -20,30 +20,30 @@ const layoutAdd = { ...@@ -20,30 +20,30 @@ const layoutAdd = {
} }
const _fileList = [ const _fileList = [
{ // {
uid: '-1', // uid: '-1',
name: 'image.png', // name: 'image.png',
status: 'done', // status: 'done',
url: 'https://zos.alipayobjects.com/rmsportal/ODTLcjxAfvqbxHnVXCYX.png', // url: 'https://zos.alipayobjects.com/rmsportal/ODTLcjxAfvqbxHnVXCYX.png',
}, // },
{ // {
uid: '-2', // uid: '-2',
name: 'image.png', // name: 'image.png',
status: 'done', // status: 'done',
url: 'https://zos.alipayobjects.com/rmsportal/ODTLcjxAfvqbxHnVXCYX.png', // url: 'https://zos.alipayobjects.com/rmsportal/ODTLcjxAfvqbxHnVXCYX.png',
}, // },
{ // {
uid: '-3', // uid: '-3',
name: 'image.png', // name: 'image.png',
status: 'done', // status: 'done',
url: 'https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png', // url: 'https://zos.alipayobjects.com/rmsportal/jkjgkEfvpUPVyRjUImniVslZfWPnJuuZ.png',
}, // },
{ // {
uid: '-4', // uid: '-4',
name: 'image.png', // name: 'image.png',
status: 'done', // status: 'done',
url: 'https://zos.alipayobjects.com/rmsportal/ODTLcjxAfvqbxHnVXCYX.png', // url: 'https://zos.alipayobjects.com/rmsportal/ODTLcjxAfvqbxHnVXCYX.png',
}, // },
] ]
const _panes = [ const _panes = [
...@@ -61,13 +61,17 @@ const ProductImageForm: React.FC<Iprops> = (props) => { ...@@ -61,13 +61,17 @@ const ProductImageForm: React.FC<Iprops> = (props) => {
const [visibleAddTabs, setVisibleAddTabs] = useState(false) const [visibleAddTabs, setVisibleAddTabs] = useState(false)
const [visibleMedias, setVisibleMedias] = useState(false) const [visibleMedias, setVisibleMedias] = useState(false)
const [fileList, setFileList] = useState(_fileList) const [fileList, setFileList] = useState<any[]>(_fileList)
const [visibleCrop, setVisibleCrop] = useState(false) const [visibleCrop, setVisibleCrop] = useState(false)
const [imgCropUrl, setImgCropUrl] = useState("") const [imgCropUrl, setImgCropUrl] = useState("")
const [imgCropCurrent, setImgCropCurrent] = useState({}) const [imgCropCurrent, setImgCropCurrent] = useState({})
const [imgCropView, setImgCropView] = useState("") const [imgCropView, setImgCropView] = useState("")
const [previewVisible, setPreviewVisible] = useState(false)
const [previewImage, setPreviewImage] = useState('')
const [previewTitle, setPreviewTitle] = useState('')
useEffect(() => { useEffect(() => {
let newPane = [...panes] let newPane = [...panes]
newPane[0].content = pictureCrads() newPane[0].content = pictureCrads()
...@@ -140,10 +144,38 @@ const ProductImageForm: React.FC<Iprops> = (props) => { ...@@ -140,10 +144,38 @@ const ProductImageForm: React.FC<Iprops> = (props) => {
setPanes(paneArray) setPanes(paneArray)
} }
const uploadButton = (
<div>
<PlusOutlined />
<div className="ant-upload-text">点击上传</div>
</div>
);
const getBase64 = (file) => {
return new Promise((resolve, reject) => {
const reader = new FileReader();
reader.readAsDataURL(file);
reader.onload = () => resolve(reader.result);
reader.onerror = error => reject(error);
});
}
const handlePreview = async file => {
if (!file.url && !file.preview) {
file.preview = await getBase64(file.originFileObj);
}
setPreviewImage(file.url || file.preview)
setPreviewVisible(true)
setPreviewTitle(file.name || file.url.substring(file.url.lastIndexOf('/') + 1))
};
const handleChange = ({ fileList }) => setFileList(fileList);
const pictureCrads = () => ( const pictureCrads = () => (
<> <>
<div className={styles.pictureCardBox}> <div className={styles.pictureCardBox}>
{ {/* {
fileList && fileList.length > 0 && fileList.map((item, index) => fileList && fileList.length > 0 && fileList.map((item, index) =>
<div className={styles.cardBox} key={item.uid}> <div className={styles.cardBox} key={item.uid}>
<div className={styles.contentBox}> <div className={styles.contentBox}>
...@@ -155,10 +187,24 @@ const ProductImageForm: React.FC<Iprops> = (props) => { ...@@ -155,10 +187,24 @@ const ProductImageForm: React.FC<Iprops> = (props) => {
</div> </div>
</div> </div>
) )
} } */}
<div className={styles.cardAddBox} onClick={handleUpload}>
<p><PlusOutlined /><br />点击上传</p> <div className="clearfix">
<Upload
action="/api/file/file/upload"
listType="picture-card"
fileList={fileList}
onPreview={handlePreview}
onChange={handleChange}
data={{fileType: 2}}
>
{fileList.length >= 6 ? null : uploadButton}
</Upload>
</div> </div>
{/* <div className={styles.cardAddBox} onClick={handleUpload}>
<p><PlusOutlined /><br />点击上传</p>
</div> */}
</div> </div>
<Alert <Alert
banner banner
...@@ -169,10 +215,10 @@ const ProductImageForm: React.FC<Iprops> = (props) => { ...@@ -169,10 +215,10 @@ const ProductImageForm: React.FC<Iprops> = (props) => {
closable closable
style={{ backgroundColor: '#F0F8FF', color: '#1B9AEE' }} style={{ backgroundColor: '#F0F8FF', color: '#1B9AEE' }}
/> />
<div> {/* <div>
<i>图片预览(供调试)</i> <i>图片预览(供调试)</i>
{imgCropView ? <img src={imgCropView} alt="预览" /> : <p>暂空</p>} {imgCropView ? <img src={imgCropView} alt="预览" /> : <p>暂空</p>}
</div> </div> */}
</> </>
) )
...@@ -213,6 +259,8 @@ const ProductImageForm: React.FC<Iprops> = (props) => { ...@@ -213,6 +259,8 @@ const ProductImageForm: React.FC<Iprops> = (props) => {
visible={visibleAddTabs} visible={visibleAddTabs}
onOk={handleOkAddTabs} onOk={handleOkAddTabs}
onCancel={handleCancelAddTabs} onCancel={handleCancelAddTabs}
okText="确定"
cancelText="取消"
> >
<Form <Form
{...layoutAdd} {...layoutAdd}
...@@ -240,6 +288,15 @@ const ProductImageForm: React.FC<Iprops> = (props) => { ...@@ -240,6 +288,15 @@ const ProductImageForm: React.FC<Iprops> = (props) => {
clickOkAddMedias={handleOkAddMedias} clickOkAddMedias={handleOkAddMedias}
clickCancelAddMedias={handleCancelAddMedias} clickCancelAddMedias={handleCancelAddMedias}
/> />
<Modal
visible={previewVisible}
title={previewTitle}
footer={null}
onCancel={()=>setPreviewVisible(false)}
>
<img alt="商品图片" style={{ width: '100%' }} src={previewImage} />
</Modal>
</>) </>)
} }
......
...@@ -84,6 +84,7 @@ const SelectGoodsForm: React.FC<Iprops> = (props) => { ...@@ -84,6 +84,7 @@ const SelectGoodsForm: React.FC<Iprops> = (props) => {
const onSelectGoodsChange = (value: any) => { const onSelectGoodsChange = (value: any) => {
setSelectedGoodsRowKeys([]) setSelectedGoodsRowKeys([])
ProductStore.setSelectedGoods([])
setIsSelectGoods(value.target.checked) setIsSelectGoods(value.target.checked)
} }
......
...@@ -29,7 +29,7 @@ ...@@ -29,7 +29,7 @@
//图片画廊 //图片画廊
.picture-card-box{ .picture-card-box{
margin-bottom: 30px; margin-bottom: 30px;
display: flex; // display: flex;
.card-add-box{ .card-add-box{
width: 196px; width: 196px;
height: 196px; height: 196px;
......
...@@ -291,11 +291,7 @@ const memberMaintain: React.FC<[]> = () => { ...@@ -291,11 +291,7 @@ const memberMaintain: React.FC<[]> = () => {
useEffect(() => { useEffect(() => {
if (!isFirst) return; if (!isFirst) return;
let timeRanges = timeRange(searchForm.timeRange); let timeRanges = timeRange(searchForm.timeRange);
if (searchForm.timeRange == 0) {
setIsFirst(false); setIsFirst(false);
} else {
setIsFirst(false);
}
setSearchForm({ setSearchForm({
...searchForm, ...searchForm,
startDate: timeRanges.st, startDate: timeRanges.st,
......
This source diff could not be displayed because it is too large. You can view the blob instead.
...@@ -30,6 +30,11 @@ class ProductStore implements IProductModule { ...@@ -30,6 +30,11 @@ class ProductStore implements IProductModule {
this.tableDataSource = datas; this.tableDataSource = datas;
} }
@action.bound
public clearData(data: any[]) {
this.tableDataSource = data;
}
} }
export default ProductStore export default ProductStore
...@@ -9,68 +9,97 @@ function isObject(obj: any) { ...@@ -9,68 +9,97 @@ function isObject(obj: any) {
} }
export function timeRange(val: number) { export function timeRange(val: number) {
let st = '', et = ''; let st, et;
switch (val) { switch (val) {
case 0: case 0:
st = et = '' st = et = '';
break break;
case 1: case 1:
st = et = moment() st = moment(
moment()
.startOf('days') .startOf('days')
.format('YYYY-MM-DD'); .format('YYYY-MM-DD HH:mm:ss'),
break ).unix();
et = moment(
moment()
.endOf('days')
.format('YYYY-MM-DD HH:mm:ss'),
).unix();
break;
case 2: case 2:
st = moment() st = moment(
.subtract(6, 'days') moment()
.format('YYYY-MM-DD'); .subtract(7, 'days')
et = moment() .format('YYYY-MM-DD') + ' 00:00:00',
.startOf('days') ).unix();
.format('YYYY-MM-DD'); et = moment(
break moment()
.endOf('days')
.format('YYYY-MM-DD HH:mm:ss'),
).unix();
break;
case 3: case 3:
st = moment() st = moment(
.startOf('month') moment()
.format('YYYY-MM-DD'); .subtract(29, 'days')
et = moment() .format('YYYY-MM-DD') + ' 00:00:00',
.startOf('days') ).unix();
.format('YYYY-MM-DD'); et = moment(
break moment()
.endOf('days')
.format('YYYY-MM-DD HH:mm:ss'),
).unix();
break;
case 4: case 4:
st = st = moment(
moment() moment()
.subtract(2, 'month') .subtract(89, 'days')
.format('YYYY-MM') + '-01'; .format('YYYY-MM-DD') + ' 00:00:00',
et = moment() ).unix();
.startOf('days') et = moment(
.format('YYYY-MM-DD'); moment()
break .endOf('days')
.format('YYYY-MM-DD HH:mm:ss'),
).unix();
break;
case 5: case 5:
st = st = moment(
moment() moment()
.subtract(5, 'month') .subtract(179, 'days')
.format('YYYY-MM') + '-01'; .format('YYYY-MM-DD') + ' 00:00:00',
et = moment() ).unix();
.startOf('days') et = moment(
.format('YYYY-MM-DD'); moment()
break .endOf('days')
.format('YYYY-MM-DD HH:mm:ss'),
).unix();
break;
case 6: case 6:
st = moment() st = moment(
.startOf('year') moment()
.format('YYYY-MM-DD'); .subtract(364, 'days')
et = moment() .format('YYYY-MM-DD') + ' 00:00:00',
.startOf('days') ).unix();
.format('YYYY-MM-DD'); et = moment(
break moment()
.endOf('days')
.format('YYYY-MM-DD HH:mm:ss'),
).unix();
break;
case 7: case 7:
st = moment() st = moment(
.years(moment().years() - 1) moment()
.year(moment().year() - 1)
.startOf('year') .startOf('year')
.format('YYYY-MM-DD'); .format('YYYY-MM-DD HH:mm:ss'),
et = moment() ).unix();
.years(moment().years() - 1) et = moment(
moment()
.year(moment().year() - 1)
.endOf('year') .endOf('year')
.format('YYYY-MM-DD'); .format('YYYY-MM-DD HH:mm:ss'),
break ).unix();
break;
} }
return { st, et } return { st, et }
} }
......
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