@@ -58,7 +58,7 @@ const MyRequests: FC = () => {
|
|||||||
<div className="space-y-1">
|
<div className="space-y-1">
|
||||||
{item.items.map((requestItem) => (
|
{item.items.map((requestItem) => (
|
||||||
<div key={requestItem.id}>
|
<div key={requestItem.id}>
|
||||||
{requestItem.product.title} {requestItem.quantity} عدد
|
{requestItem.product.title}
|
||||||
</div>
|
</div>
|
||||||
))}
|
))}
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -49,10 +49,6 @@ const RequestDetail: FC = () => {
|
|||||||
<div className="text-xs text-desc">عنوان:</div>
|
<div className="text-xs text-desc">عنوان:</div>
|
||||||
<div className="text-sm font-medium text-black">{item.product.title}</div>
|
<div className="text-sm font-medium text-black">{item.product.title}</div>
|
||||||
</div>
|
</div>
|
||||||
<div className='flex items-center gap-2'>
|
|
||||||
<div className="text-xs text-desc">تعداد:</div>
|
|
||||||
<div className="text-sm font-medium text-black">{item.quantity}</div>
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,5 @@
|
|||||||
import { useEffect, useMemo, useState, type ChangeEvent, type FC } from 'react'
|
import { useEffect, useMemo, useState, type ChangeEvent, type FC } from 'react'
|
||||||
import Button from '@/components/Button'
|
import Button from '@/components/Button'
|
||||||
import Input from '@/components/Input'
|
|
||||||
import Select from '@/components/Select'
|
|
||||||
import UploadBox from '@/components/UploadBox'
|
import UploadBox from '@/components/UploadBox'
|
||||||
import VoiceRecorder from '@/components/VoiceRecorder'
|
import VoiceRecorder from '@/components/VoiceRecorder'
|
||||||
import { COLORS } from '@/constants/colors'
|
import { COLORS } from '@/constants/colors'
|
||||||
@@ -19,7 +17,6 @@ import { clx } from '@/helpers/utils'
|
|||||||
const emptyValues: RequestType = {
|
const emptyValues: RequestType = {
|
||||||
productId: undefined,
|
productId: undefined,
|
||||||
attachments: [],
|
attachments: [],
|
||||||
quantity: undefined,
|
|
||||||
description: '',
|
description: '',
|
||||||
attributes: [],
|
attributes: [],
|
||||||
}
|
}
|
||||||
@@ -37,7 +34,6 @@ const Request: FC<Props> = ({ editIndex, initialItem, onSaved, onCancelEdit }) =
|
|||||||
const { data } = useGetProducts()
|
const { data } = useGetProducts()
|
||||||
const { setItems, items } = useRequestStore()
|
const { setItems, items } = useRequestStore()
|
||||||
const [productSelected, setProductSelected] = useState<ProductType>()
|
const [productSelected, setProductSelected] = useState<ProductType>()
|
||||||
const [quantitySelect, setQuantitySelect] = useState<string>('')
|
|
||||||
const [voiceFile, setVoiceFile] = useState<File>()
|
const [voiceFile, setVoiceFile] = useState<File>()
|
||||||
const [files, setFiles] = useState<File[]>([])
|
const [files, setFiles] = useState<File[]>([])
|
||||||
const singleUpload = useSingleUpload()
|
const singleUpload = useSingleUpload()
|
||||||
@@ -48,7 +44,6 @@ const Request: FC<Props> = ({ editIndex, initialItem, onSaved, onCancelEdit }) =
|
|||||||
enableReinitialize: true,
|
enableReinitialize: true,
|
||||||
validationSchema: Yup.object({
|
validationSchema: Yup.object({
|
||||||
productId: Yup.string().required('این فیلد اجباری می باشد'),
|
productId: Yup.string().required('این فیلد اجباری می باشد'),
|
||||||
quantity: Yup.number().required('این فیلد اجباری می باشد'),
|
|
||||||
}),
|
}),
|
||||||
onSubmit: async (values) => {
|
onSubmit: async (values) => {
|
||||||
const attachments: AttachmentsType[] = [...(values.attachments ?? [])]
|
const attachments: AttachmentsType[] = [...(values.attachments ?? [])]
|
||||||
@@ -97,11 +92,7 @@ const Request: FC<Props> = ({ editIndex, initialItem, onSaved, onCancelEdit }) =
|
|||||||
const resolvedProduct = useMemo(() => {
|
const resolvedProduct = useMemo(() => {
|
||||||
if (productSelected) return productSelected
|
if (productSelected) return productSelected
|
||||||
if (!activeProductId || !data?.data) return undefined
|
if (!activeProductId || !data?.data) return undefined
|
||||||
const product = data.data.find((p) => p.id === activeProductId)
|
return data.data.find((p) => p.id === activeProductId)
|
||||||
if (!product) return undefined
|
|
||||||
const quantities = [...product.quantities]
|
|
||||||
if (quantities[0] !== 0) quantities.unshift(0)
|
|
||||||
return { ...product, quantities }
|
|
||||||
}, [productSelected, activeProductId, data])
|
}, [productSelected, activeProductId, data])
|
||||||
|
|
||||||
const { data: attributes } = useGetAttributes(resolvedProduct?.id)
|
const { data: attributes } = useGetAttributes(resolvedProduct?.id)
|
||||||
@@ -112,17 +103,7 @@ const Request: FC<Props> = ({ editIndex, initialItem, onSaved, onCancelEdit }) =
|
|||||||
const product = data.data.find((p) => p.id === initialItem.productId)
|
const product = data.data.find((p) => p.id === initialItem.productId)
|
||||||
if (!product) return
|
if (!product) return
|
||||||
|
|
||||||
const quantities = [...product.quantities]
|
setProductSelected(product)
|
||||||
if (quantities[0] !== 0) quantities.unshift(0)
|
|
||||||
|
|
||||||
setProductSelected({ ...product, quantities })
|
|
||||||
|
|
||||||
const qty = initialItem.quantity
|
|
||||||
if (qty !== undefined && quantities.includes(qty)) {
|
|
||||||
setQuantitySelect(String(qty))
|
|
||||||
} else {
|
|
||||||
setQuantitySelect('0')
|
|
||||||
}
|
|
||||||
}, [initialItem, data])
|
}, [initialItem, data])
|
||||||
|
|
||||||
const handleProductChange = (e: ChangeEvent<HTMLSelectElement>) => {
|
const handleProductChange = (e: ChangeEvent<HTMLSelectElement>) => {
|
||||||
@@ -130,12 +111,9 @@ const Request: FC<Props> = ({ editIndex, initialItem, onSaved, onCancelEdit }) =
|
|||||||
const product = data?.data?.find((o) => o.id === productId)
|
const product = data?.data?.find((o) => o.id === productId)
|
||||||
|
|
||||||
if (product) {
|
if (product) {
|
||||||
const quantities = [...product.quantities]
|
setProductSelected(product)
|
||||||
if (quantities[0] !== 0) quantities.unshift(0)
|
|
||||||
setProductSelected({ ...product, quantities })
|
|
||||||
formik.setFieldValue('productId', productId)
|
formik.setFieldValue('productId', productId)
|
||||||
formik.setFieldValue('attributes', [])
|
formik.setFieldValue('attributes', [])
|
||||||
setQuantitySelect('')
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -179,46 +157,6 @@ const Request: FC<Props> = ({ editIndex, initialItem, onSaved, onCancelEdit }) =
|
|||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div className='mt-6 rowTwoInput'>
|
|
||||||
<Select
|
|
||||||
items={
|
|
||||||
resolvedProduct?.quantities?.map((item) => ({
|
|
||||||
label: item === 0 ? 'انتخاب دلخواه' : String(item),
|
|
||||||
value: String(item),
|
|
||||||
})) ?? []
|
|
||||||
}
|
|
||||||
label='تعداد'
|
|
||||||
placeholder='انتخاب'
|
|
||||||
value={quantitySelect}
|
|
||||||
onChange={(e) => {
|
|
||||||
const value = e.target.value
|
|
||||||
setQuantitySelect(value)
|
|
||||||
if (value !== '0') {
|
|
||||||
formik.setFieldValue('quantity', Number(value))
|
|
||||||
}
|
|
||||||
}}
|
|
||||||
onBlur={formik.handleBlur}
|
|
||||||
name='quantity'
|
|
||||||
error_text={
|
|
||||||
formik.touched.quantity && formik.errors.quantity
|
|
||||||
? formik.errors.quantity
|
|
||||||
: ''
|
|
||||||
}
|
|
||||||
/>
|
|
||||||
|
|
||||||
<Input
|
|
||||||
label='تعداد دلخواه'
|
|
||||||
readOnly={quantitySelect !== '0'}
|
|
||||||
{...formik.getFieldProps('quantity')}
|
|
||||||
type='number'
|
|
||||||
error_text={
|
|
||||||
formik.touched.quantity && formik.errors.quantity
|
|
||||||
? formik.errors.quantity
|
|
||||||
: ''
|
|
||||||
}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className='mt-6'>
|
<div className='mt-6'>
|
||||||
<VoiceRecorder
|
<VoiceRecorder
|
||||||
value={formik.values.description ?? ''}
|
value={formik.values.description ?? ''}
|
||||||
|
|||||||
@@ -58,14 +58,11 @@ const RequestItemsList: FC<Props> = ({
|
|||||||
<div className='text-sm font-medium truncate'>
|
<div className='text-sm font-medium truncate'>
|
||||||
{getProductTitle(item.productId)}
|
{getProductTitle(item.productId)}
|
||||||
</div>
|
</div>
|
||||||
<div className='text-description text-xs mt-1'>
|
|
||||||
تعداد: {item.quantity}
|
|
||||||
{item.attachments.length > 0 && (
|
{item.attachments.length > 0 && (
|
||||||
<span className='mr-2'>
|
<div className='text-description text-xs mt-1'>
|
||||||
· {item.attachments.length} پیوست
|
{item.attachments.length} پیوست
|
||||||
</span>
|
|
||||||
)}
|
|
||||||
</div>
|
</div>
|
||||||
|
)}
|
||||||
<div className='flex gap-2 mt-3'>
|
<div className='flex gap-2 mt-3'>
|
||||||
<button
|
<button
|
||||||
type='button'
|
type='button'
|
||||||
|
|||||||
@@ -19,7 +19,6 @@ export type AttachmentsType = {
|
|||||||
|
|
||||||
export type RequestType = {
|
export type RequestType = {
|
||||||
productId?: string;
|
productId?: string;
|
||||||
quantity?: number;
|
|
||||||
attributes: {
|
attributes: {
|
||||||
fieldId: string;
|
fieldId: string;
|
||||||
value: string | number;
|
value: string | number;
|
||||||
@@ -89,7 +88,6 @@ export interface MyRequestType extends RowDataType {
|
|||||||
}[];
|
}[];
|
||||||
description: string;
|
description: string;
|
||||||
product: ProductType;
|
product: ProductType;
|
||||||
quantity: number;
|
|
||||||
subTotal: number;
|
subTotal: number;
|
||||||
total: number;
|
total: number;
|
||||||
unitPrice: number;
|
unitPrice: number;
|
||||||
@@ -161,7 +159,6 @@ export type RequestDetailItemType = {
|
|||||||
product: RequestDetailProductType;
|
product: RequestDetailProductType;
|
||||||
attributes: RequestDetailItemAttributeType[];
|
attributes: RequestDetailItemAttributeType[];
|
||||||
request: string;
|
request: string;
|
||||||
quantity: number;
|
|
||||||
description: string;
|
description: string;
|
||||||
attachments: AttachmentsType[];
|
attachments: AttachmentsType[];
|
||||||
};
|
};
|
||||||
|
|||||||
Reference in New Issue
Block a user