From 9684b78b9fc607f9839a0c910b6a9710a714585f Mon Sep 17 00:00:00 2001 From: morteza-mortezai Date: Wed, 8 Jul 2026 19:40:44 +0330 Subject: [PATCH] update status --- src/pages/order/List.tsx | 38 +++++++++- .../order/components/OrderListActions.tsx | 76 ++++++++++++++++++- .../order/components/OrderListColumns.tsx | 7 ++ src/pages/order/hooks/useOrderData.ts | 18 +++++ src/pages/order/service/OrderService.ts | 10 +++ 5 files changed, 143 insertions(+), 6 deletions(-) diff --git a/src/pages/order/List.tsx b/src/pages/order/List.tsx index 96c34c5..f66c188 100644 --- a/src/pages/order/List.tsx +++ b/src/pages/order/List.tsx @@ -15,13 +15,17 @@ import DesignerSearch from "../designer/DesignerSearch"; import CategoriesSelect from "../product/components/CategoriesSelect"; import { orderListTabs } from "./constants/orderStatus"; import { getOrderListColumns } from "./components/OrderListColumns"; -import { useDeleteOrder, useGetOrders } from "./hooks/useOrderData"; +import { + useDeleteOrder, + useGetOrders, + useUpdateOrderStatus, +} from "./hooks/useOrderData"; import { ORDER_LIST_FILTER_FIELDS, useOrderListParams, } from "./hooks/useOrderListParams"; import type { OrderListItemType } from "./types/Types"; -import { TabOrderListEnum } from "./enum/OrderEnum"; +import { OrderStatusEnum, TabOrderListEnum } from "./enum/OrderEnum"; const countActiveFilters = (params: { search?: string; @@ -48,6 +52,8 @@ const OrdersList: FC = () => { const { data, refetch, isFetching } = useGetOrders(queryParams); const { mutate: deleteOrder, isPending: isDeleting } = useDeleteOrder(); + const { mutate: updateOrderStatus, isPending: isUpdatingStatus } = + useUpdateOrderStatus(); const activeFilterCount = useMemo(() => countActiveFilters(params), [params]); const hasActiveFilters = activeFilterCount > 0; @@ -66,9 +72,33 @@ const OrdersList: FC = () => { [deleteOrder, refetch], ); + const handleUpdateStatus = useCallback( + (id: string, status: OrderStatusEnum) => { + updateOrderStatus( + { orderId: id, status }, + { + onSuccess: () => { + refetch(); + toast.success("وضعیت سفارش با موفقیت به‌روزرسانی شد"); + }, + onError: (error) => { + toast.error(extractErrorMessage(error)); + }, + }, + ); + }, + [refetch, updateOrderStatus], + ); + const columns = useMemo( - () => getOrderListColumns({ onDelete: handleDelete, isDeleting }), - [handleDelete, isDeleting], + () => + getOrderListColumns({ + onDelete: handleDelete, + onUpdateStatus: handleUpdateStatus, + isDeleting, + isUpdatingStatus, + }), + [handleDelete, handleUpdateStatus, isDeleting, isUpdatingStatus], ); return ( diff --git a/src/pages/order/components/OrderListActions.tsx b/src/pages/order/components/OrderListActions.tsx index bc8c69d..71ba345 100644 --- a/src/pages/order/components/OrderListActions.tsx +++ b/src/pages/order/components/OrderListActions.tsx @@ -1,19 +1,54 @@ -import { type FC } from "react"; +import { type FC, useMemo, useState } from "react"; import { Link } from "react-router-dom"; import { DocumentText, Edit2, Eye, Printer, Receipt21 } from "iconsax-react"; import TrashWithConfrim from "@/components/TrashWithConfrim"; +import DefaulModal from "@/components/DefaulModal"; +import Select from "@/components/Select"; +import Button from "@/components/Button"; import { Paths } from "@/config/Paths"; import { getOrderInvoiceItemRef } from "../utils/orderListUtils"; import type { OrderListItemType } from "../types/Types"; +import { OrderStatusEnum } from "../enum/OrderEnum"; +import { getOrderStatusLabel } from "../constants/orderStatus"; type Props = { item: OrderListItemType; onDelete: (id: string) => void; + onUpdateStatus: (id: string, status: OrderStatusEnum) => void; isDeleting?: boolean; + isUpdatingStatus?: boolean; }; -const OrderListActions: FC = ({ item, onDelete, isDeleting }) => { +const OrderListActions: FC = ({ + item, + onDelete, + onUpdateStatus, + isDeleting, + isUpdatingStatus, +}) => { + const [isStatusModalOpen, setIsStatusModalOpen] = useState(false); + const [selectedStatus, setSelectedStatus] = useState( + item.status as OrderStatusEnum, + ); const invoiceRef = getOrderInvoiceItemRef(item); + const statusOptions = useMemo( + () => + Object.values(OrderStatusEnum).map((status) => ({ + value: status, + label: getOrderStatusLabel(status), + })), + [], + ); + + const handleOpenStatusModal = () => { + setSelectedStatus(item.status as OrderStatusEnum); + setIsStatusModalOpen(true); + }; + + const handleSubmitStatus = () => { + onUpdateStatus(item.id, selectedStatus); + setIsStatusModalOpen(false); + }; return (
@@ -40,11 +75,48 @@ const OrderListActions: FC = ({ item, onDelete, isDeleting }) => { + + onDelete(item.id)} isloading={isDeleting} colorIcon="red" /> + + setIsStatusModalOpen(false)} + title_header="تغییر وضعیت سفارش" + isHeader + > +
+