"use client"; import { API_URL, requestType, ticketPriorities, ticketStatuses, } from "@/core/constant"; import { TicketInterface } from "@/core/types"; import { exportToExcel, handleAxiosError, handleExport } from "@/core/utils"; import { useGetAllDepartments } from "@/services/hooks/department.hook"; import { useGetAllTickets, useGetAllTicketsExport, useRemoveTicket, } from "@/services/hooks/ticket.hook"; import { useGetAllUsers } from "@/services/hooks/users.hook"; import DateFilters from "@/ui/DateFilter"; import DeleteConfirmModal from "@/ui/DeleteConfirmModal"; import TicketDetailModal from "@/ui/TicketDetailModel"; import { Box, Button, MenuItem, Pagination, TextField } from "@mui/material"; import { DatePicker } from "@mui/x-date-pickers/DatePicker"; import { PickerValue } from "@mui/x-date-pickers/internals"; import { useQueryClient } from "@tanstack/react-query"; import Link from "next/link"; import { useRouter } from "next/navigation"; import { useState } from "react"; import { toast } from "react-toastify"; interface ticketFilters { departmentId: string; priority: string; status: string; user: string; requestType: string; startDate: PickerValue | string | null; endDate: PickerValue | string | null; } export default function Page() { const [search, setSearch] = useState(""); const queryClient = useQueryClient(); const [selectedTicket, setSelectedTicket] = useState(null); const [seletectedTicketForDelete, setSelectedTicketForDelete] = useState< string | null >(null); const [open, setOpen] = useState(false); const [openDeleteModal, setOpenDeleteModal] = useState(false); const handleOpen = (ticket: any) => { setSelectedTicket(ticket); setOpen(true); }; const router = useRouter(); const [filters, setFilters] = useState({ departmentId: "", priority: "", status: "", user: "", requestType: "", startDate: null, endDate: null, }); const [page, setPage] = useState(1); const { mutateAsync } = useRemoveTicket(); const { data, isLoading } = useGetAllTickets({ page, ...filters }); const { mutateAsync: getAllTicketExportAsync } = useGetAllTicketsExport(); const { data: users, isLoading: getusersloading } = useGetAllUsers(); const { data: departments, isLoading: departmentsLoading } = useGetAllDepartments(); const handleRemoveTicket = async () => { if (seletectedTicketForDelete) { try { const { message } = await mutateAsync(seletectedTicketForDelete); toast.success(message); await queryClient.invalidateQueries({ queryKey: ["get-all-tickets"] }); } catch (error) { toast.error(handleAxiosError(error)); } } setOpenDeleteModal(false); }; const handleDownload = async (type: "excel" | "spss", filename: string) => { const res = await getAllTicketExportAsync({ ...filters }); const formattedData = res?.data?.data.map((t: any) => ({ "شماره تیکت": t.ticketNumber || t.id, موضوع: t.title, وضعیت: t.status === "open" ? "باز" : "بسته", // ترجمه وضعیت‌ها دپارتمان: t.department?.displayName || "نامشخص", کارشناس: t.assignee?.fullname || "بدون متصدی", "تاریخ ثبت": t.createdAt ? new Date(t.createdAt).toLocaleDateString("fa-IR") : "-", اولویت: t.priority || "عادی", // می‌توانید فیلد جدید اضافه کنید: توضیحات: t.description?.substring(0, 50) + "...", // محدود کردن طول متن })); exportToExcel(type, formattedData, filename); }; return ( <>
setFilters((prev) => ({ ...prev, departmentId: e.target.value })) } > همه {departments?.data.map((dep: any) => ( {dep.displayName} ))} setFilters((prev) => ({ ...prev, priority: e.target.value })) } > همه {ticketPriorities?.map((p: any) => ( {p.displayName} ))} setFilters((prev) => ({ ...prev, status: e.target.value })) } > همه {ticketStatuses?.map((p: any) => ( {p.displayName} ))} setFilters((prev) => ({ ...prev, requestType: e.target.value })) } > همه {requestType?.map((p: any) => ( {p.displayName} ))} setFilters((prev) => ({ ...prev, user: e.target.value })) } > همه {users?.data?.map((p: any) => ( {p.fullname} ))} {/* */} setFilters((prev) => ({ ...prev, startDate: value?.toISOString() ?? null, })) } label="از تاريخ" /> setFilters((prev) => ({ ...prev, endDate: value?.toISOString() ?? null, })) } label="تا تاريخ" />
|
{data?.data?.data.map( (item: TicketInterface, index: number) => { const status = ticketStatuses.find( (p) => p.id === item.status, ); const priority = ticketPriorities.find( (p) => p.id === item.priority, ); const shouldBlinkPriority = item.priority === "critical"; const shouldBlinkStatus = item.status === "open"; return ( ); }, )}
رديف کد كاربر واحد نوع درخواست وضعیت اولويت ارجاع به تاریخ عملیات
{Number(index + 1).toLocaleString("fa-IR")} {item.ticketNumber} {item.createdBy} {item.department.displayName} { requestType.find((p) => p.id === item.requestType) ?.displayName } {status?.displayName || "نامشخص"} {priority?.displayName || "نامشخص"} {item.assignee.fullname} {new Date(item.createdAt).toLocaleDateString( "fa-IR", )}
ویرایش
setPage(p)} variant="outlined" shape="rounded" sx={{ "& .MuiPaginationItem-root": { borderRadius: "28px", borderColor: "#e2e8f0", // slate-200 color: "#475569", // slate-600 "&:hover": { backgroundColor: "#eff6ff", // blue-50 borderColor: "#bfdbfe", // blue-200 }, "&.Mui-selected": { backgroundColor: "#2563eb", // blue-600 color: "#ffffff", borderColor: "#2563eb", "&:hover": { backgroundColor: "#1d4ed8", // blue-700 }, }, }, }} />
setOpen(false)} ticket={selectedTicket} /> setOpenDeleteModal(false)} onConfirm={handleRemoveTicket} /> {/*
کد
#10241
در حال پردازش
مشتری
علی رضایی
مبلغ
1,250,000
ایمیل
ali@example.com
تاریخ
1403/08/12
*/}
); }