@@ -1,5 +1,4 @@
|
|||||||
import { OrderStatusEnum } from '@/pages/order/enum/OrderEnum'
|
import { OrderStatusEnum } from '@/pages/order/enum/OrderEnum'
|
||||||
import { RequestStatusEnum } from '@/pages/request/enum/RequestEnum'
|
|
||||||
import { ProformaInvoiceStatusEnum } from '@/pages/invoice/enum/InvoiceEnum'
|
import { ProformaInvoiceStatusEnum } from '@/pages/invoice/enum/InvoiceEnum'
|
||||||
import { PaymentStatusEnum } from '@/pages/payment/enum/Enum'
|
import { PaymentStatusEnum } from '@/pages/payment/enum/Enum'
|
||||||
|
|
||||||
@@ -17,10 +16,6 @@ export type StatusConfig = {
|
|||||||
* برای اضافه کردن وضعیت جدید: یک کلید (مقدار enum یا string از API) و مقدار { label, variant } بگذار.
|
* برای اضافه کردن وضعیت جدید: یک کلید (مقدار enum یا string از API) و مقدار { label, variant } بگذار.
|
||||||
*/
|
*/
|
||||||
export const statusRegistry: Record<string, StatusConfig> = {
|
export const statusRegistry: Record<string, StatusConfig> = {
|
||||||
// --- RequestStatusEnum ---
|
|
||||||
[RequestStatusEnum.PENDING]: { label: 'در انتظار تایید', variant: 'warning' },
|
|
||||||
// INVOICED shared with OrderStatusEnum (same value 'invoiced') — see OrderStatusEnum.INVOICED below
|
|
||||||
|
|
||||||
// --- ProformaInvoiceStatusEnum ---
|
// --- ProformaInvoiceStatusEnum ---
|
||||||
[ProformaInvoiceStatusEnum.ALL]: { label: 'همه', variant: 'neutral' },
|
[ProformaInvoiceStatusEnum.ALL]: { label: 'همه', variant: 'neutral' },
|
||||||
[ProformaInvoiceStatusEnum.NOT_CONFIRMED]: { label: 'تایید نشده', variant: 'warning' },
|
[ProformaInvoiceStatusEnum.NOT_CONFIRMED]: { label: 'تایید نشده', variant: 'warning' },
|
||||||
@@ -44,7 +39,7 @@ export const statusRegistry: Record<string, StatusConfig> = {
|
|||||||
[OrderStatusEnum.CANCELED]: { label: 'لغو شده', variant: 'error' },
|
[OrderStatusEnum.CANCELED]: { label: 'لغو شده', variant: 'error' },
|
||||||
|
|
||||||
// --- PaymentStatusEnum ---
|
// --- PaymentStatusEnum ---
|
||||||
// Pending shared with RequestStatusEnum.PENDING and ticket (same value 'pending') — see above and ticket section
|
// Pending shared with ticket (same value 'pending') — see ticket section
|
||||||
[PaymentStatusEnum.Paid]: { label: 'پرداخت شده', variant: 'success' },
|
[PaymentStatusEnum.Paid]: { label: 'پرداخت شده', variant: 'success' },
|
||||||
[PaymentStatusEnum.Failed]: { label: 'ناموفق', variant: 'error' },
|
[PaymentStatusEnum.Failed]: { label: 'ناموفق', variant: 'error' },
|
||||||
[PaymentStatusEnum.Refunded]: { label: 'مسترد شده', variant: 'info' },
|
[PaymentStatusEnum.Refunded]: { label: 'مسترد شده', variant: 'info' },
|
||||||
|
|||||||
@@ -1,7 +1,5 @@
|
|||||||
import Tabs from '@/components/Tabs'
|
|
||||||
import { useState, type FC } from 'react'
|
|
||||||
import { TabMyRequestsEnum } from './enum/RequestEnum'
|
|
||||||
import Filters from '@/components/Filters'
|
import Filters from '@/components/Filters'
|
||||||
|
import { useState, type FC } from 'react'
|
||||||
import Button from '@/components/Button'
|
import Button from '@/components/Button'
|
||||||
import { AddSquare, Eye } from 'iconsax-react'
|
import { AddSquare, Eye } from 'iconsax-react'
|
||||||
import Table from '@/components/Table'
|
import Table from '@/components/Table'
|
||||||
@@ -12,8 +10,7 @@ import { Paths } from '@/config/Paths'
|
|||||||
|
|
||||||
const MyRequests: FC = () => {
|
const MyRequests: FC = () => {
|
||||||
const [page, setPage] = useState<number>(1)
|
const [page, setPage] = useState<number>(1)
|
||||||
const [activeTab, setActiveTab] = useState<TabMyRequestsEnum>(TabMyRequestsEnum.ALL)
|
const { data } = useGetMyRequests(page)
|
||||||
const { data } = useGetMyRequests(page, activeTab)
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<div className='mt-5'>
|
<div className='mt-5'>
|
||||||
@@ -21,18 +18,6 @@ const MyRequests: FC = () => {
|
|||||||
درخواست های من
|
درخواست های من
|
||||||
</h1>
|
</h1>
|
||||||
|
|
||||||
<div className='mt-10'>
|
|
||||||
<Tabs
|
|
||||||
items={[
|
|
||||||
{ label: 'همه', value: TabMyRequestsEnum.ALL },
|
|
||||||
{ label: 'در انتظار تایید', value: TabMyRequestsEnum.PENDING },
|
|
||||||
{ label: 'فاکتور شده', value: TabMyRequestsEnum.INVOICED },
|
|
||||||
]}
|
|
||||||
activeTab={activeTab}
|
|
||||||
onTabChange={(tab) => setActiveTab(tab as TabMyRequestsEnum)}
|
|
||||||
/>
|
|
||||||
</div>
|
|
||||||
|
|
||||||
<div className='mt-16 flex justify-between items-center'>
|
<div className='mt-16 flex justify-between items-center'>
|
||||||
<Filters
|
<Filters
|
||||||
fields={[
|
fields={[
|
||||||
@@ -68,12 +53,16 @@ const MyRequests: FC = () => {
|
|||||||
},
|
},
|
||||||
{
|
{
|
||||||
key: 'items',
|
key: 'items',
|
||||||
title: 'تعداد اقلام',
|
title: 'اقلام',
|
||||||
render: (item) => {
|
render: (item) => (
|
||||||
return (
|
<div className="space-y-1">
|
||||||
<div>{item.items.length}</div>
|
{item.items.map((requestItem) => (
|
||||||
)
|
<div key={requestItem.id}>
|
||||||
}
|
{requestItem.product.title} {requestItem.quantity} عدد
|
||||||
|
</div>
|
||||||
|
))}
|
||||||
|
</div>
|
||||||
|
),
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
key: 'createdAt',
|
key: 'createdAt',
|
||||||
@@ -84,10 +73,6 @@ const MyRequests: FC = () => {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
|
||||||
key: 'status',
|
|
||||||
title: 'وضعیت درخواست',
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
key: 'actions',
|
key: 'actions',
|
||||||
title: '',
|
title: '',
|
||||||
|
|||||||
@@ -1,9 +1,3 @@
|
|||||||
export const enum TabMyRequestsEnum {
|
|
||||||
ALL = "all",
|
|
||||||
PENDING = "pending",
|
|
||||||
INVOICED = "invoiced",
|
|
||||||
}
|
|
||||||
|
|
||||||
export const enum FieldTypeEnum {
|
export const enum FieldTypeEnum {
|
||||||
text = "text",
|
text = "text",
|
||||||
textarea = "textarea",
|
textarea = "textarea",
|
||||||
@@ -13,8 +7,3 @@ export const enum FieldTypeEnum {
|
|||||||
checkbox = "checkbox",
|
checkbox = "checkbox",
|
||||||
date = "date",
|
date = "date",
|
||||||
}
|
}
|
||||||
|
|
||||||
export enum RequestStatusEnum {
|
|
||||||
PENDING = "pending",
|
|
||||||
INVOICED = "invoiced",
|
|
||||||
}
|
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
import { useMutation, useQuery } from "@tanstack/react-query";
|
import { useMutation, useQuery } from "@tanstack/react-query";
|
||||||
import * as api from "../service/RequestService";
|
import * as api from "../service/RequestService";
|
||||||
import type { TabMyRequestsEnum } from "../enum/RequestEnum";
|
|
||||||
import type { AddTicketType } from "../type/Types";
|
import type { AddTicketType } from "../type/Types";
|
||||||
|
|
||||||
export const useGetProducts = () => {
|
export const useGetProducts = () => {
|
||||||
@@ -24,10 +23,10 @@ export const useSubmitRequest = () => {
|
|||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
export const useGetMyRequests = (page: number = 1, statuses: TabMyRequestsEnum) => {
|
export const useGetMyRequests = (page: number = 1) => {
|
||||||
return useQuery({
|
return useQuery({
|
||||||
queryKey: ["my-requests", page, statuses],
|
queryKey: ["my-requests", page],
|
||||||
queryFn: () => api.getMyRequests(page, statuses),
|
queryFn: () => api.getMyRequests(page),
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -8,7 +8,6 @@ import type {
|
|||||||
ProductsResponseType,
|
ProductsResponseType,
|
||||||
TicketsResponseType,
|
TicketsResponseType,
|
||||||
} from "../type/Types";
|
} from "../type/Types";
|
||||||
import { RequestStatusEnum, TabMyRequestsEnum } from "../enum/RequestEnum";
|
|
||||||
|
|
||||||
export const getProducts = async () => {
|
export const getProducts = async () => {
|
||||||
const { data } = await axios.get<ProductsResponseType>(`/public/products`);
|
const { data } = await axios.get<ProductsResponseType>(`/public/products`);
|
||||||
@@ -27,23 +26,9 @@ export const submitRequest = async (params: RequestType[]) => {
|
|||||||
return data;
|
return data;
|
||||||
};
|
};
|
||||||
|
|
||||||
export const getMyRequests = async (
|
export const getMyRequests = async (page: number = 1) => {
|
||||||
page: number = 1,
|
|
||||||
active: TabMyRequestsEnum,
|
|
||||||
) => {
|
|
||||||
const statuses =
|
|
||||||
active === TabMyRequestsEnum.PENDING
|
|
||||||
? [RequestStatusEnum.PENDING]
|
|
||||||
: active === TabMyRequestsEnum.INVOICED
|
|
||||||
? [RequestStatusEnum.INVOICED]
|
|
||||||
: undefined;
|
|
||||||
|
|
||||||
let query = `?page=${page}`;
|
|
||||||
if (statuses) {
|
|
||||||
query += `&statuses=${statuses}`;
|
|
||||||
}
|
|
||||||
const { data } = await axios.get<MyRequestsResponseType>(
|
const { data } = await axios.get<MyRequestsResponseType>(
|
||||||
`/public/request${query}`,
|
`/public/request?page=${page}`,
|
||||||
);
|
);
|
||||||
return data;
|
return data;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -77,7 +77,6 @@ export interface MyRequestType extends RowDataType {
|
|||||||
orderNumber: number;
|
orderNumber: number;
|
||||||
paidAmount: number;
|
paidAmount: number;
|
||||||
paymentMethod: string;
|
paymentMethod: string;
|
||||||
status: string;
|
|
||||||
subTotal: number;
|
subTotal: number;
|
||||||
taxAmount: number;
|
taxAmount: number;
|
||||||
total: number;
|
total: number;
|
||||||
@@ -174,7 +173,6 @@ export type RequestDetailType = {
|
|||||||
deletedAt: string | null;
|
deletedAt: string | null;
|
||||||
user: RequestDetailUserType;
|
user: RequestDetailUserType;
|
||||||
requestNumber: number;
|
requestNumber: number;
|
||||||
status: string;
|
|
||||||
items: RequestDetailItemType[];
|
items: RequestDetailItemType[];
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user