Commit 0b257e02 authored by Bill's avatar Bill

Merge branch 'fix0218' into 'v2-220218'

fix: 优化新增商品商品属性多选控件 See merge request linkseeks-design/pro-platform!20
parents 7bd7d662 bd431b04
import React, { useState, useEffect, useRef } from 'react' import React, { useState, useEffect, useRef } from 'react'
import { history, useIntl } from 'umi' import { history, useIntl } from 'umi'
import { Form, Select, Checkbox, Tabs, Input, DatePicker, Row, Col } from 'antd' import { Form, Select, Checkbox, Tabs, Input, DatePicker, Row, Col, Button, Modal, Divider, Space, Typography } from 'antd'
import { inject, observer } from 'mobx-react' import { inject, observer } from 'mobx-react'
import { store } from '@/store' import { store } from '@/store'
import { validatorByte } from '@/utils/regExp' import { validatorByte } from '@/utils/regExp'
import { PlusOutlined } from '@ant-design/icons'
import CircleCheckbox from '../components/circleCheckbox'
import { postProductCustomerSaveOrUpdateCustomerAttributeValue } from '@/services/ProductV2Api'
const layout: any = { const layout: any = {
colon: false, colon: false,
...@@ -29,6 +32,7 @@ const ProductAttributeForm: React.FC<Iprops> = (props) => { ...@@ -29,6 +32,7 @@ const ProductAttributeForm: React.FC<Iprops> = (props) => {
const [isClearFormAndDataInEdit, setIsClearFormAndDataInEdit] = useState<boolean>(false) // 编辑情况下 是否要清空商品属性表单数据和页面全局数据 const [isClearFormAndDataInEdit, setIsClearFormAndDataInEdit] = useState<boolean>(false) // 编辑情况下 是否要清空商品属性表单数据和页面全局数据
const productAttributeFormRef = useRef() const productAttributeFormRef = useRef()
const [attributeForm] = Form.useForm() const [attributeForm] = Form.useForm()
const [addForm] = Form.useForm()
const { ProductStore } = store const { ProductStore } = store
const { const {
attributeLists, attributeLists,
...@@ -38,6 +42,11 @@ const ProductAttributeForm: React.FC<Iprops> = (props) => { ...@@ -38,6 +42,11 @@ const ProductAttributeForm: React.FC<Iprops> = (props) => {
clearProductDetailsUnitPriceAndPicListInEdit, clearProductDetailsUnitPriceAndPicListInEdit,
setIsRecombination setIsRecombination
} = ProductStore } = ProductStore
const [addVisible, setAddVisible] = useState<boolean>(false)
const [loading, setLoading] = useState<boolean>(false)
const currentRow = useRef<any>()
const [dataSource, setDataSource] = useState<any>([...attributesData])
const [newValue, setNewValue] = useState<string>()
useEffect(() => { useEffect(() => {
onRef(productAttributeFormRef) onRef(productAttributeFormRef)
...@@ -143,6 +152,80 @@ const ProductAttributeForm: React.FC<Iprops> = (props) => { ...@@ -143,6 +152,80 @@ const ProductAttributeForm: React.FC<Iprops> = (props) => {
setProductSelectAttribute(_selectAttributeByEdit) setProductSelectAttribute(_selectAttributeByEdit)
} }
const addAtttributeValue = (record) => {
console.log(record)
currentRow.current = record
setAddVisible(true)
addForm.setFieldsValue({'name': record['name'], isEnable: true, id: record['id']})
}
const handleAdd = () => {
setLoading(true)
addForm.submit()
}
const addSubmit = (values) => {
postProductCustomerSaveOrUpdateCustomerAttributeValue({
customerAttribute: { id: values.id, name: values.name, groupName: currentRow.current.groupName },
isEnable: true,
value: values.value
}).then(({code, data}) => {
if(code === 1000) {
const _dataSource = dataSource.map((item) => {
if(item.id === currentRow.current.id) {
// @todo 调用后台新增属性值接口 成功后把返回的id写入属性值 目前随机数生成
item.customerAttributeValueList.push({
...item.customerAttributeValueList[0],
id: parseInt(Math.random()*10000+''),
...values,
})
}
return item
})
console.log(_dataSource)
setDataSource([..._dataSource])
setAddVisible(false)
setLoading(false)
}
})
}
const handleCancel = () => {
setAddVisible(false)
addForm.resetFields()
setLoading(false)
}
const onNameChange = (event) => {
setNewValue(event.target.value);
}
const addItem = (e, record) => {
e.preventDefault();
postProductCustomerSaveOrUpdateCustomerAttributeValue({
customerAttribute: { id: record.id, name: record.name, groupName: record.groupName },
isEnable: true,
value: newValue
}).then(({code, data}) => {
if(code === 1000) {
// @todo 调用后台新增属性值接口 成功后把返回的id写入属性值 目前随机数生成
const _dataSource = dataSource.map((item, index) => {
if(item.id === record.id) {
item.customerAttributeValueList.push({
...item.customerAttributeValueList[0],
id: parseInt(Math.random()*10000+''),
value: newValue,
})
}
return item
})
console.log(_dataSource)
setDataSource([..._dataSource])
setNewValue('')
}
})
};
const renderTabPanchildren = (attrItem: any) => { const renderTabPanchildren = (attrItem: any) => {
let _isPrice = null let _isPrice = null
let _isUpdateAttribute = null let _isUpdateAttribute = null
...@@ -169,18 +252,37 @@ const ProductAttributeForm: React.FC<Iprops> = (props) => { ...@@ -169,18 +252,37 @@ const ProductAttributeForm: React.FC<Iprops> = (props) => {
message: intl.formatMessage({ id: 'commodity.products.addProductsItem.productAttributeForm.message' }) message: intl.formatMessage({ id: 'commodity.products.addProductsItem.productAttributeForm.message' })
}]} }]}
> >
<Select <Row>
disabled={_isDisabled} <Col span={20}>
placeholder={intl.formatMessage({ id: 'commodity.products.addProductsItem.productAttributeForm.placeholder.1' })} <Select
allowClear disabled={_isDisabled}
onChange={(v) => onChange(v, attrItem)} placeholder={intl.formatMessage({ id: 'commodity.products.addProductsItem.productAttributeForm.placeholder.1' })}
> allowClear
{ onChange={(v) => onChange(v, attrItem)}
attrItem?.customerAttributeValueList.length > 0 && attrItem.customerAttributeValueList.map((item: any) => ( dropdownRender={menu => (
<Option key={item.id} value={item.id}>{item.value}</Option> <>
)) {menu}
} <Divider style={{ margin: '8px 0' }} />
</Select> <Space align="center" style={{ padding: '0 8px 4px' }}>
<Input placeholder="请输入属性值" value={newValue} onChange={onNameChange} />
<Typography.Link onClick={(e) => addItem(e, attrItem)} style={{ whiteSpace: 'nowrap' }}>
<PlusOutlined /> 添加属性值
</Typography.Link>
</Space>
</>
)}
>
{
attrItem?.customerAttributeValueList.length > 0 && attrItem.customerAttributeValueList.map((item: any) => (
<Option key={item.id} value={item.id}>{item.value}</Option>
))
}
</Select>
</Col>
{/* <Col span={4}>
<Button type="link" onClick={() => addAtttributeValue(attrItem)}>新增属性值</Button>
</Col> */}
</Row>
</Form.Item> </Form.Item>
} }
{ {
...@@ -208,21 +310,33 @@ const ProductAttributeForm: React.FC<Iprops> = (props) => { ...@@ -208,21 +310,33 @@ const ProductAttributeForm: React.FC<Iprops> = (props) => {
message: intl.formatMessage({ id: 'commodity.products.addProductsItem.productAttributeForm.message' }) message: intl.formatMessage({ id: 'commodity.products.addProductsItem.productAttributeForm.message' })
}]} }]}
> >
<Checkbox.Group <CircleCheckbox
onChange={(v) => onChange(v, attrItem)} onChange={(v) => onChange(v, attrItem)}
disabled={_isDisabled} options={attrItem.customerAttributeValueList}
style={{ width: "100%" }} expandOperation={<Button style={{marginLeft: 8}} type="dashed" icon={<PlusOutlined />} onClick={() => addAtttributeValue(attrItem)}>新增</Button>}
> />
<Row> {/* <Row>
{ <Col span={20}>
attrItem?.customerAttributeValueList.length > 0 && attrItem.customerAttributeValueList.map((item: any, index: string) => ( <Checkbox.Group
<Col span={6} key={item.id}> onChange={(v) => onChange(v, attrItem)}
<Checkbox value={item.id}>{item.value}</Checkbox> disabled={_isDisabled}
</Col> style={{ width: "100%" }}
)) >
} <Row>
</Row> {
</Checkbox.Group> attrItem?.customerAttributeValueList.length > 0 && attrItem.customerAttributeValueList.map((item: any, index: string) => (
<Col span={6} key={item.id}>
<Checkbox value={item.id}>{item.value}</Checkbox>
</Col>
))
}
</Row>
</Checkbox.Group>
</Col>
<Col span={4}>
<Button type="link" onClick={() => addAtttributeValue(attrItem)}>新增属性值</Button>
</Col>
</Row> */}
</Form.Item> </Form.Item>
) )
} }
...@@ -264,7 +378,7 @@ const ProductAttributeForm: React.FC<Iprops> = (props) => { ...@@ -264,7 +378,7 @@ const ProductAttributeForm: React.FC<Iprops> = (props) => {
> >
<Tabs defaultActiveKey="1" tabPosition="left"> <Tabs defaultActiveKey="1" tabPosition="left">
{ {
attributesData?.length > 0 && attributesData.map(attributeItem => dataSource?.length > 0 && dataSource.map(attributeItem =>
!productInfoByEdit?.isUpdateAttribute && (attributeItem?.createTime > productInfoByEdit?.createTime) ? null : <TabPane tab={attributeItem.name} key={attributeItem.id}> !productInfoByEdit?.isUpdateAttribute && (attributeItem?.createTime > productInfoByEdit?.createTime) ? null : <TabPane tab={attributeItem.name} key={attributeItem.id}>
{ {
renderTabPanchildren(attributeItem) renderTabPanchildren(attributeItem)
...@@ -274,7 +388,44 @@ const ProductAttributeForm: React.FC<Iprops> = (props) => { ...@@ -274,7 +388,44 @@ const ProductAttributeForm: React.FC<Iprops> = (props) => {
} }
</Tabs> </Tabs>
</Form> </Form>
{attributesData?.length === 0 && <span style={{ opacity: 0.6 }}>{intl.formatMessage({ id: 'commodity.products.addProductsItem.productAttributeForm.none' })}</span>} {dataSource?.length === 0 && <span style={{ opacity: 0.6 }}>{intl.formatMessage({ id: 'commodity.products.addProductsItem.productAttributeForm.none' })}</span>}
<Modal
title="增加属性值"
visible={addVisible}
onOk={handleAdd}
forceRender={true}
confirmLoading={loading}
onCancel={handleCancel}
>
<Form
{...layout}
form={addForm}
name="add-form"
labelAlign="left"
colon={false}
onFinish={addSubmit}
>
<Form.Item
name='id'
label='属性ID'
style={{display:'none'}}
>
<Input disabled={true} />
</Form.Item>
<Form.Item
name='name'
label='属性名称'
>
<Input disabled={true} />
</Form.Item>
<Form.Item
name='value'
label='属性值名称'
>
<Input placeholder="请输入属性值" />
</Form.Item>
</Form>
</Modal>
</>) </>)
} }
......
.circleCheckbox {
display: flex;
}
.circleCheckboxUl {
list-style: none;
display: flex;
.circleCheckboxUlLi {
// height: 32px;
line-height: 32px;
background: #F5F6F7;
text-align: center;
border-radius: 4px;
margin: 0 8px;
padding: 0px 16px;
cursor: pointer;
span {
font-weight: 400;
font-size: 12px;
color: #5C626A;
text-align: center;
}
}
.active {
background: rgba(0,169,143,0.04);
border: 1px solid #00A98F;
span {
color: #00A98F;
}
}
}
import React, { useState, useEffect, ReactNode } from 'react';
import cx from 'classnames'
import styles from './index.less'
interface PriceInputProps {
value?: number[];
onChange?: (value: number[]) => void;
options: any;
expandOperation?: ReactNode
}
/**
* 新增商品 方形多选表单
* @returns
*/
const CircleCheckbox: React.FC<PriceInputProps> = ({ value = [], options = [], onChange, expandOperation = null }) => {
const [currentValue, setCurrentValue] = useState<number[]>([...value])
useEffect(() => {
onChange?.([...currentValue])
}, [currentValue])
const clickItem = (id) => {
const _value = [...currentValue]
if(_value.includes(id)) {
var index = _value.indexOf(id)
if (index > -1) {
_value.splice(index, 1)
}
setCurrentValue([..._value])
} else {
_value.push(id)
setCurrentValue([..._value])
}
}
return (options.length && <div className={styles.circleCheckbox}>
<ul className={styles.circleCheckboxUl}>
{
options.map((item: any, index: string) => ( <li
key={item.id}
className={currentValue.includes(item.id) ? cx(styles.active, styles.circleCheckboxUlLi) : styles.circleCheckboxUlLi}
onClick={()=>clickItem(item.id)}
>
<span>
{item.value}
</span>
</li>
))
}
{
expandOperation
}
</ul>
</div>
)
}
export default CircleCheckbox
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