From d85e0e49ce43502fd4f97a874b48d177e0f51584 Mon Sep 17 00:00:00 2001 From: morteza-mortezai Date: Fri, 17 Jul 2026 18:50:07 +0330 Subject: [PATCH] refcator create order --- src/pages/order/ConvertToOrders.tsx | 508 +++++++++++++++++----------- 1 file changed, 311 insertions(+), 197 deletions(-) diff --git a/src/pages/order/ConvertToOrders.tsx b/src/pages/order/ConvertToOrders.tsx index 0393293..c9ef921 100644 --- a/src/pages/order/ConvertToOrders.tsx +++ b/src/pages/order/ConvertToOrders.tsx @@ -1,13 +1,23 @@ -import { useState, type FC } from 'react' +import { useState, type FC, type ReactNode } from 'react' import { useFormik } from 'formik' import * as Yup from 'yup' import moment from 'moment-jalaali' import { Link, useNavigate, useSearchParams } from 'react-router-dom' +import { + Box1, + Calendar, + DocumentText, + Profile2User, + ReceiptText, + TickSquare, + WalletMoney, +} from 'iconsax-react' import Input from '@/components/Input' import Textarea from '@/components/Textarea' import Select from '@/components/Select' import UploadBox from '@/components/UploadBox' import Button from '@/components/Button' +import BackButton from '@/components/BackButton' import { useMultiUpload } from '@/pages/uploader/hooks/useUploader' import type { ConvertToOrderItemType } from './types/Types' import { useConverToOrder, useGetProducts } from './hooks/useOrderData' @@ -24,6 +34,35 @@ import { Checkbox } from '@/components/ui/checkbox' const formatAmount = (amount: number) => Number(amount).toLocaleString('fa-IR') + ' ریال' +type InfoFieldProps = { + label: string + value: ReactNode + icon?: ReactNode +} + +const InfoField: FC = ({ label, value, icon }) => ( +
+
+ {icon} + {label} +
+
{value}
+
+) + +type SummaryRowProps = { + label: string + value: string + valueClassName?: string +} + +const SummaryRow: FC = ({ label, value, valueClassName }) => ( +
+ {label} + {value} +
+) + const getInitialValues = (invoiceItemId: string | null): ConvertToOrderItemType => ({ invoiceItemId: invoiceItemId ?? '', productId: '', @@ -46,11 +85,10 @@ const getValidationSchema = (invoiceItemId: string | null) => estimatedDays: Yup.number().required('تخمین روز اجباری است.').min(0, 'باید عدد مثبت باشد'), title: Yup.string().required('عنوان اجباری است.'), description: Yup.string(), - designerId: Yup.string().required('این فیلد اجباری است') + designerId: Yup.string().required('این فیلد اجباری است'), }) const ConvertToOrders: FC = () => { - const navigate = useNavigate() const [searchParams] = useSearchParams() const invoiceItemId = searchParams.get('invoiceItemId') @@ -99,7 +137,7 @@ const ConvertToOrders: FC = () => { }, onError: (error) => { toast.error(extractErrorMessage(error)) - } + }, }) }, }) @@ -110,186 +148,150 @@ const ConvertToOrders: FC = () => { : invoiceItem?.invoice?.user?.phone ?? '-' const discounts = invoiceItem ? formatItemDiscountDisplay(invoiceItem) : null + const isSubmitting = multiUpload.isPending || isPending + const backTo = invoiceItem?.invoice?.id + ? Paths.perfomaInvoice.detail + invoiceItem.invoice.id + : Paths.order.list return ( -
-

تبدیل به سفارش

- - {invoiceItemId && ( -
-
اطلاعات آیتم پیش فاکتور
- - {isInvoiceItemLoading ? ( -
- در حال بارگذاری... -
- ) : invoiceItem ? ( -
-
-
پیش فاکتور
- - #{invoiceItem.invoice.invoiceNumber} - -
-
-
مشتری
-
{customerName}
-
-
-
محصول
-
{invoiceItem.product?.title ?? '-'}
-
-
-
تعداد
-
{invoiceItem.quantity ?? '-'}
-
-
-
مبلغ واحد
-
- {invoiceItem.unitPrice != null - ? formatAmount(invoiceItem.unitPrice) - : '-'} -
-
-
-
تخفیف (مبلغ)
-
{discounts?.value ?? '-'}
-
-
-
تخفیف (درصد)
-
{discounts?.percent ?? '-'}
-
-
-
مبلغ کل
-
- {formatAmount(invoiceItem.total ?? 0)} -
-
-
-
تاریخ تایید
-
- {invoiceItem.confirmedAt - ? moment(invoiceItem.confirmedAt).format('jYYYY/jMM/jDD HH:mm') - : '-'} -
-
- {invoiceItem.description && ( -
-
توضیحات
-
- {invoiceItem.description} -
-
- )} -
- ) : ( -
- آیتم پیش فاکتور یافت نشد. -
+
+
+
+ +
+ +

تبدیل به سفارش

+
+ {invoiceItemId && invoiceItem?.product?.title && ( +

+ ایجاد سفارش از آیتم «{invoiceItem.product.title}» +

)}
- )} -
-
formik.handleSubmit()} + isLoading={isSubmitting} > - {!invoiceItemId && ( -
-
- { - formik.setFieldValue('userId', id) - formik.setFieldTouched('userId', true) - }} +
+ + ثبت سفارش +
+ +
+ +
+
+
اطلاعات سفارش
+

+ جزئیات مورد نیاز برای ثبت سفارش را تکمیل کنید. +

+ + + {!invoiceItemId && ( +
+
+ { + formik.setFieldValue('userId', id) + formik.setFieldTouched('userId', true) + }} + /> + {formik.touched.userId && formik.errors.userId ? ( +
+ {formik.errors.userId} +
+ ) : null} +
+ ({ + admins?.data?.map((item) => ({ + label: item.firstName + ' ' + item.lastName, + value: item.id, + })) || [] + } + label="طراح" + placeholder="انتخاب طراح" + {...formik.getFieldProps('designerId')} + error_text={ + formik.touched.designerId && formik.errors.designerId + ? formik.errors.designerId + : '' + } + /> + + { - return { - label: item.firstName + ' ' + item.lastName, - value: item.id +
+ + /> - +
-
- - - -
- -