212 lines
6.7 KiB
TypeScript
212 lines
6.7 KiB
TypeScript
import { View, ScrollView } from '@tarojs/components'
|
||
import { useCallback, forwardRef, useEffect, useMemo, useRef, useState, memo, useImperativeHandle, } from 'react'
|
||
import Search from '@/components/search'
|
||
import styles from "./index.module.scss"
|
||
import classnames from "classnames";
|
||
import Popup from '@/components/popup'
|
||
import Goods from "@/components/goodsItem"
|
||
import BottomCustomer from "@/components/BottomCustomer"
|
||
import VirtualList from '@tarojs/components/virtual-list'
|
||
import DotLoading from "@/components/dotLoading"
|
||
import Divider from '../divider';
|
||
|
||
interface prosObj {
|
||
showPopup?: false | true,
|
||
closePopup?: () => void,
|
||
goodList?: any[],
|
||
typeList?: any[],
|
||
handCheck?: (any) => void,
|
||
addNums?: (any) => void
|
||
reduceNums?: (any) => void
|
||
// oninputEvent?: (e: string, res: object) => void,
|
||
getSearchData: (any) => void,
|
||
handPlus: (any) => void,
|
||
handSure: () => void,
|
||
obj?: {
|
||
code?: string,
|
||
name?: string,
|
||
|
||
},
|
||
modeFont: Number | string,
|
||
clientName: string,
|
||
clientId: Number,
|
||
hasBottom?: true | false, //默认不占位底部
|
||
onBlur?: (e: string, res: object) => void
|
||
}
|
||
export default memo(forwardRef((props: prosObj, ref) => {
|
||
const {
|
||
showPopup = false,
|
||
closePopup,
|
||
goodList = [],
|
||
typeList = [],
|
||
handCheck,
|
||
addNums,
|
||
reduceNums,
|
||
// oninputEvent,
|
||
getSearchData,
|
||
handPlus,
|
||
obj = {},
|
||
modeFont = 0,
|
||
clientName = '',
|
||
clientId = -1,
|
||
handSure,
|
||
hasBottom = true,
|
||
onBlur
|
||
} = props
|
||
|
||
useImperativeHandle(ref, () => ({
|
||
Object: props,
|
||
typeList: typeList
|
||
}))
|
||
|
||
|
||
|
||
//判断选择的类型
|
||
const showModefont = useMemo(() => {
|
||
const modeObj = typeList.filter(item => {
|
||
return item.checked
|
||
})
|
||
if (modeObj[0].id === 0) {
|
||
return '条'
|
||
} else {
|
||
return '米'
|
||
}
|
||
}, [typeList])
|
||
|
||
//已选的颜色
|
||
const selectTotal = useMemo(() => {
|
||
const totalArr = goodList.filter(item => {
|
||
return item.showInput
|
||
})
|
||
return totalArr.length
|
||
}, [goodList])
|
||
|
||
//选择的条数或者米数
|
||
const selectNums = useMemo(() => {
|
||
let arr: any = []
|
||
goodList.forEach(item => {
|
||
if (item.showInput) {
|
||
arr.push(Number(item.nums))
|
||
}
|
||
})
|
||
let hate = sum(arr)
|
||
return hate
|
||
}, [goodList])
|
||
// onInputEven={(e, item) => oninputEvent?.(e, item)}
|
||
|
||
function sum(arr) {
|
||
var s = 0;
|
||
for (var i = arr.length - 1; i >= 0; i--) {
|
||
s += arr[i];
|
||
}
|
||
return s;
|
||
}
|
||
|
||
|
||
const rows = memo(({ id, index, style, data }: any) => {
|
||
let item = data[index]
|
||
return (
|
||
<>
|
||
<Goods
|
||
onBlur={(e, id) => onBlur?.(e, id)}
|
||
modeFont={(modeFont as number)}
|
||
handPlus={(item) => handPlus?.(item)}
|
||
value={item || {}}
|
||
clickAdd={(item) => addNums?.(item)}
|
||
clickReduce={(item) => { reduceNums?.(item) }}
|
||
goodList={goodList}
|
||
></Goods>
|
||
</>
|
||
)
|
||
})
|
||
|
||
return (
|
||
<Popup showTitle={false} show={showPopup} onClose={() => closePopup?.()}>
|
||
<ScrollView className={styles.scrllStyle} scrollY>
|
||
<View className={styles.shopcartBox}>
|
||
<View className={styles.topTitle}>
|
||
{obj?.code}# {obj?.name}
|
||
</View>
|
||
<View className={styles.selectFont}>
|
||
已选 1 种面料,{selectTotal} 个颜色,共 {selectNums} {showModefont}
|
||
</View>
|
||
<Divider direction='horizontal' customStyles={{ margin: '12px 0' }}></Divider>
|
||
<View className={styles.typeFont}>布料类型</View>
|
||
<View className={styles.flexType}>
|
||
{typeList.map((item, index) => {
|
||
return (
|
||
<View
|
||
onClick={() => {
|
||
handCheck?.(item)
|
||
}}
|
||
key={index}
|
||
className={classnames(item.checked ? styles.activemodeFont : styles.modeFont)}>
|
||
{item.name}
|
||
</View>
|
||
)
|
||
})}
|
||
</View>
|
||
<View style={{position: 'sticky', top: 0, background: 'white',zIndex: '9999'}}>
|
||
<Divider direction='horizontal' customStyles={{ margin: '12px 0' }}></Divider>
|
||
<View className={styles.flexFonts}>
|
||
<View className={styles.kingFont}>颜色分类({goodList?.length})</View>
|
||
<View className={styles.danwei}>
|
||
{modeFont == 0 ? '大货' : modeFont == 1 ? '剪版' : '散剪'}单位:{showModefont}
|
||
</View>
|
||
</View>
|
||
<View className={styles.searchBox}>
|
||
<Search
|
||
cursorSpacing={100}
|
||
placeholder='请输入搜索布料'
|
||
showBtn={false}
|
||
changeOnSearch={getSearchData}
|
||
debounceTime={300}
|
||
adjustPosition={true}
|
||
/>
|
||
</View>
|
||
</View>
|
||
{goodList.length > 0 && (
|
||
<>
|
||
<View className={styles.scrollviewBig}>
|
||
<VirtualList
|
||
className={styles.scrollview}
|
||
height={300} /* 列表的高度 */
|
||
width='100%' /* 列表的宽度 */
|
||
itemData={goodList} /* 渲染列表的数据 */
|
||
itemCount={goodList.length + 0} /* 渲染列表的长度 */
|
||
itemSize={100} /* 列表单项的高度 */
|
||
overscanCount={1}>
|
||
{rows}
|
||
</VirtualList>
|
||
</View>
|
||
|
||
<View className={styles.kongOne}></View>
|
||
</>
|
||
)}
|
||
{goodList.length === 0 && (
|
||
<>
|
||
<View className={styles.loading_more}>
|
||
加载中
|
||
<DotLoading />
|
||
</View>
|
||
</>
|
||
)}
|
||
{!hasBottom && <View style={{ height: '100rpx' }}></View>}
|
||
<View className={classnames(hasBottom === true ? styles.posBox : styles.noBottom)}>
|
||
<BottomCustomer
|
||
clientName={clientName}
|
||
clientId={clientId}
|
||
isDisabled={selectTotal > 0 && clientName !== '' ? false : true}
|
||
handSure={() => {
|
||
handSure()
|
||
}}></BottomCustomer>
|
||
</View>
|
||
</View>
|
||
</ScrollView>
|
||
</Popup>
|
||
)
|
||
|
||
|
||
}))
|
||
|