Create component select + fix filter

This commit is contained in:
hamid zarghami
2025-12-24 10:51:39 +03:30
parent f0d5082723
commit 85a17e42d1
5 changed files with 218 additions and 35 deletions
@@ -1,5 +1,6 @@
import { useMemo } from 'react'
import type { FieldType } from '@/components/Filters'
import { OrderStatus, PaymentStatusEnum } from '../enum/Enum'
export const useOrderFiltersFields = (): FieldType[] => {
return useMemo(() => [
@@ -9,30 +10,33 @@ export const useOrderFiltersFields = (): FieldType[] => {
placeholder: 'جستجو (شماره سفارش یا نام مشتری)',
},
{
type: 'select',
name: 'status',
placeholder: 'وضعیت',
defaultValue: '',
type: 'multiselect',
name: 'statuses',
placeholder: 'وضعیت سفارش',
defaultValue: [],
options: [
{ label: 'همه', value: '' },
{ label: 'در انتظار تایید', value: 'PENDING' },
{ label: 'در حال آماده سازی', value: 'PREPARING' },
{ label: 'آماده تحویل', value: 'READY' },
{ label: 'تحویل داده شده', value: 'DELIVERED' },
{ label: 'لغو شده', value: 'CANCELLED' },
{ label: 'تایید نشده', value: 'REJECTED' },
{ label: 'در انتظار پرداخت', value: OrderStatus.PENDING_PAYMENT },
{ label: 'پرداخت شده', value: OrderStatus.PAID },
{ label: 'در حال آماده سازی', value: OrderStatus.PREPARING },
{ label: 'آماده', value: OrderStatus.READY },
{ label: 'تحویل به پیشخدمت', value: OrderStatus.DELIVERED_TO_WAITER },
{ label: 'تحویل به پذیرش', value: OrderStatus.DELIVERED_TO_RECEPTIONIST },
{ label: 'ارسال شده', value: OrderStatus.SHIPPED },
{ label: 'تکمیل شده', value: OrderStatus.COMPLETED },
{ label: 'لغو شده', value: OrderStatus.CANCELED },
],
},
{
type: 'select',
name: 'deliveryType',
placeholder: 'نوع تحویل',
name: 'paymentStatus',
placeholder: 'وضعیت پرداخت',
defaultValue: '',
options: [
{ label: 'همه', value: '' },
{ label: 'تحویل با پیک', value: 'DELIVERY' },
{ label: 'سرو در رستوران', value: 'DINE_IN' },
{ label: 'تحویل در ماشین', value: 'PICKUP' },
{ label: '--', value: '' },
{ label: 'در انتظار', value: PaymentStatusEnum.Pending },
{ label: 'پرداخت شده', value: PaymentStatusEnum.Paid },
{ label: 'ناموفق', value: PaymentStatusEnum.Failed },
{ label: 'بازگشت شده', value: PaymentStatusEnum.Refunded },
],
},
], [])
+5 -5
View File
@@ -10,7 +10,7 @@ export const useOrderFilters = () => {
const [limit] = useState(DEFAULT_LIMIT);
const apiParams = useMemo(() => {
const params: Record<string, string | number> = {
const params: Record<string, string | number | string[]> = {
page: currentPage,
limit: limit,
};
@@ -19,12 +19,12 @@ export const useOrderFilters = () => {
params.search = filters.search as string;
}
if (filters.status) {
params.status = filters.status as string;
if (filters.statuses && Array.isArray(filters.statuses) && filters.statuses.length > 0) {
params.statuses = filters.statuses as string[];
}
if (filters.deliveryType) {
params.deliveryType = filters.deliveryType as string;
if (filters.paymentStatus) {
params.paymentStatus = filters.paymentStatus as string;
}
return params;
+30 -5
View File
@@ -5,8 +5,8 @@ export interface GetOrdersParams {
page?: number;
limit?: number;
search?: string;
status?: string;
deliveryType?: string;
statuses?: string[];
paymentStatus?: string;
}
export interface ChangeOrderStatusParams {
@@ -20,9 +20,34 @@ export interface RefundPaymentParams {
export const getOrders = async (
params?: GetOrdersParams
): Promise<GetOrdersResponse> => {
const { data } = await axios.get<GetOrdersResponse>("/admin/orders", {
params,
});
const queryParams = new URLSearchParams();
if (params?.page) {
queryParams.append('page', params.page.toString());
}
if (params?.limit) {
queryParams.append('limit', params.limit.toString());
}
if (params?.search) {
queryParams.append('search', params.search);
}
if (params?.statuses && Array.isArray(params.statuses) && params.statuses.length > 0) {
params.statuses.forEach((status) => {
queryParams.append('statuses', status);
});
}
if (params?.paymentStatus) {
queryParams.append('paymentStatus', params.paymentStatus);
}
const queryString = queryParams.toString();
const url = queryString ? `/admin/orders?${queryString}` : '/admin/orders';
const { data } = await axios.get<GetOrdersResponse>(url);
return data;
};