diff --git a/app/(panel)/dashboard/page.tsx b/app/(panel)/dashboard/page.tsx new file mode 100644 index 0000000..d758baf --- /dev/null +++ b/app/(panel)/dashboard/page.tsx @@ -0,0 +1,10 @@ +import { API_URL } from "@/core/constant"; + +export default async function Page() { + + + return ( + <> + + ); +} diff --git a/app/(panel)/departments/page.tsx b/app/(panel)/departments/page.tsx new file mode 100644 index 0000000..7072957 --- /dev/null +++ b/app/(panel)/departments/page.tsx @@ -0,0 +1,9 @@ +import React from 'react' + +export default function Page() { + return ( +
+ +
+ ) +} diff --git a/app/(panel)/layout.tsx b/app/(panel)/layout.tsx new file mode 100644 index 0000000..ad74db0 --- /dev/null +++ b/app/(panel)/layout.tsx @@ -0,0 +1,21 @@ +"use client" +import "react-toastify/dist/ReactToastify.css"; +import Sidebar from "@/ui/layout/Sidebar"; +import { LocalizationProvider } from '@mui/x-date-pickers/LocalizationProvider'; +import { AdapterDateFnsJalali } from '@mui/x-date-pickers/AdapterDateFnsJalali'; +export default function RootLayout({ + children, +}: Readonly<{ + children: React.ReactNode; +}>) { + return ( +
+
+ +
+ +
{children}
+
+
+ ); +} diff --git a/app/(panel)/reports/page.tsx b/app/(panel)/reports/page.tsx new file mode 100644 index 0000000..b6ea2a7 --- /dev/null +++ b/app/(panel)/reports/page.tsx @@ -0,0 +1,621 @@ +"use client"; +import { requestType, ticketStatuses } from "@/core/constant"; +import { + exportToExcel, + formatDurationPersian, + handleAxiosError, +} from "@/core/utils"; +import { + useMutateAgentEfficiency, + useMutateAgentPerformance, + useMutateAgingReport, + useMutateAvgResolutionTime, + useMutateClosureRate, + useMutateCriticalTickets, + useMutateDepartmentLoad, + useMutateDepartmentReport, + useMutateKpiReport, + useMutatePredictionReport, + useMutateSlaBreach, + useMutateStatsReport, +} from "@/services/hooks/report.hook"; +import { DownloadOutlined } from "@mui/icons-material"; +import { + Box, + Button, + Card, + CardContent, + Stack, + Typography, +} from "@mui/material"; +import { UseMutateAsyncFunction } from "@tanstack/react-query"; +import { toast } from "react-toastify"; + +export default function Page() { + // ۱. آمار کلی تیکت‌ها + const { mutateAsync: totalStatsAsync } = useMutateStatsReport(); + + // ۲. گزارش عملکرد دپارتمان‌ها + const { mutateAsync: deptReportAsync } = useMutateDepartmentReport(); + + // ۳. گزارش عملکرد کارشناسان + const { mutateAsync: agentPerfAsync } = useMutateAgentPerformance(); + + // ۴. میانگین زمان پاسخ‌گویی + const { mutateAsync: avgResTimeAsync } = useMutateAvgResolutionTime(); + + // ۵. تیکت‌های بحرانی + const { mutateAsync: criticalTicketsAsync } = useMutateCriticalTickets(); + + // ۶. روند ثبت تیکت‌ها (نیاز به params دارد) + // const { mutateAsync: ticketsTrend, isLoading: trendLoading } = useMutateTicketsTrend(dateParams); + + // ۷. نرخ بستن تیکت‌ها + const { mutateAsync: closureRateAsync } = useMutateClosureRate(); + + // ۸. تیکت‌های خارج از SLA + const { mutateAsync: slaBreachAsync } = useMutateSlaBreach(); + + // ۹. گزارش قدمت تیکت‌ها + const { mutateAsync: agingReportAsync } = useMutateAgingReport(); + + // ۱۰. بهره‌وری کارشناسان + const { mutateAsync: agentEfficiencyAsync } = useMutateAgentEfficiency(); + + // ۱۱. بار کاری دپارتمان‌ها + const { mutateAsync: deptLoadAsync } = useMutateDepartmentLoad(); + + // ۱۲. شاخص‌های کلیدی عملکرد (KPI) + const { mutateAsync: kpiReportAsync } = useMutateKpiReport(); + + // ۱۳. پیش‌بینی وضعیت تیکت‌ها + const { mutateAsync: predictionReportAsync } = useMutatePredictionReport(); + + const handleGetStatsReport = async () => { + try { + const { data } = await totalStatsAsync(); + + const formattedData = [data]?.map((t: any) => ({ + "كل تيكت ها": t.total, + "تيكت هاي باز": t.open, + "تيكت هاي در حال بررسي": t.inProgress, + "تيكت هاي حل شده": t.resolved, + "تيكت هاي بسته شده": t.closed, + })); + exportToExcel("excel", formattedData, "گزارش كلي تيكت ها"); + } catch (error) { + console.log(error); + toast.error(handleAxiosError(error)); + } + }; + + const handleDepReport = async () => { + try { + const { data } = await deptReportAsync(); + + const formattedData = data?.map((t: any) => ({ + "بخش / واحد": t.department?.displayName, + "كل تيكت ها": t.totalTickets, + "تيكت هاي باز": t.openTickets, + "تيكت هاي حل شده": t.resolvedTickets, + })); + exportToExcel("excel", formattedData, "گزارش تيكت ها به تفكيك واحد"); + } catch (error) { + console.log(error); + toast.error(handleAxiosError(error)); + } + }; + + const handleAgentPerformanceReport = async () => { + try { + const { data } = await agentPerfAsync(); + + const formattedData = data?.map((t: any) => ({ + "كارشناس مربوطه": t.assignee?.fullname, + "كل تيكت ها": t.totalAssigned, + "تيكت هاي باز": t.open, + "تيكت هاي حل شده": t.resolved, + })); + exportToExcel("excel", formattedData, "گزارش تيكت ها به تفكيك كارشناسان"); + } catch (error) { + console.log(error); + toast.error(handleAxiosError(error)); + } + }; + + const handleAvgPerformanceReport = async () => { + try { + const { data } = await avgResTimeAsync(); + + const formattedData = [data]?.map((t: any) => ({ + "نرخ زمان پاسخگويي": formatDurationPersian(t.avgResolutionSeconds), + "نرخ دقيق بر حسب ثانيه": t.avgResolutionSeconds, + })); + exportToExcel("excel", formattedData, "گزارش نرخ پاسخگويي "); + } catch (error) { + console.log(error); + toast.error(handleAxiosError(error)); + } + }; + + const handleCriticalTicketsReport = async () => { + try { + const { data } = await criticalTicketsAsync(); + + const formattedData = data?.map((t: any) => ({ + "شماره تيكت": t.ticketNumber, + "واحد / بخش": t.department?.displayName, + "تلفن داخلي": t.internalPhone, + كاربر: t.createdBy, + "محل وقوع مشكل": t.location, + "نوع درخواست": requestType.find((p) => p.id === t.requestType) + ?.displayName, + + "كارشناس مربوطه": t.assignee?.fullname, + "دستگاه مربوطه": t.relatedSystem, + وضعيت: ticketStatuses.find((p) => p.id === t.status)?.displayName, + توضيحات: t.description, + + "اقدامات كارشناس": t.helpdeskAction, + "يادداشت ها": t.finalNotes, + "تاريخ ثبت": new Date(t.createdAt).toLocaleDateString("fa-IR"), + })); + exportToExcel("excel", formattedData, "گزارش تيكت هاي بحراني"); + } catch (error) { + console.log(error); + toast.error(handleAxiosError(error)); + } + }; + return ( +
+ + + + + آمار کلی تیکت‌ها{" "} + + + + + {/* */} + + + + + + + گزارش عملکرد دپارتمان‌ها + + + + + {/* */} + + + + + + + گزارش عملکرد کارشناسان + + + + + {/* */} + + + + + + + میانگین زمان پاسخ‌گویی + + + + + {/* */} + + + + + + + تیکت‌های بحرانی + + + + + {/* */} + + + + + + + روند ثبت تیکت‌ها{" "} + + + + + {/* */} + + + + + + + نرخ بستن تیکت‌ها + + + + + {/* */} + + + + + + + تیکت‌های خارج از SLA + + + + + {/* */} + + + + + + + گزارش قدمت تیکت‌ها + + + + + {/* */} + + + + + + + + بهره‌وری کارشناسان + + + + + {/* */} + + + + + + + بار کاری دپارتمان‌ها{" "} + + + + + {/* */} + + + + + + + شاخص‌های کلیدی عملکرد (KPI){" "} + + + + + {/* */} + + + + + + + پیش‌بینی وضعیت تیکت‌ها{" "} + + + + + {/* */} + + + + +
+ ); +} diff --git a/app/(panel)/tickets/create/page.tsx b/app/(panel)/tickets/create/page.tsx new file mode 100644 index 0000000..75fa473 --- /dev/null +++ b/app/(panel)/tickets/create/page.tsx @@ -0,0 +1,60 @@ +import { API_URL } from "@/core/constant"; +import TicketForm from "@/ui/form/TicketForm"; +import { cookies } from "next/headers"; + +async function getDepartmentsData() { + const cookieStore = await cookies(); + const tokenCookie = cookieStore.get("userToken"); // گرفتن کوکی از درخواست کاربر + + const res = await fetch(`${API_URL}/department/all`, { + cache: "no-cache", + credentials: "include", + headers: { + "Content-Type": "application/json", + Cookie: `${tokenCookie?.name}=${tokenCookie?.value}`, + }, + }); + + if (!res.ok) { + throw new Error("خطا در واكشي ديتاي واحد ها"); + } + + const data = await res.json(); + + return data; +} + +async function getUsersData() { + const cookieStore = await cookies(); + const tokenCookie = cookieStore.get("userToken"); // گرفتن کوکی از درخواست کاربر + const res = await fetch(`${API_URL}/user/all`, { + cache: "no-cache", + credentials: "include", + headers: { + "Content-Type": "application/json", + Cookie: `${tokenCookie?.name}=${tokenCookie?.value}`, + }, + }); + + if (!res.ok) { + throw new Error("خطا در واكشي ديتاي واحد ها"); + } + + const data = await res.json(); + + return data; +} + +export default async function Page() { + const getdepartmentsdata = await getDepartmentsData(); + const getusersdata = await getUsersData(); + + const departments = getdepartmentsdata?.data; + const users = getusersdata?.data; + + return ( + <> + + + ); +} diff --git a/app/(panel)/tickets/page.tsx b/app/(panel)/tickets/page.tsx new file mode 100644 index 0000000..d2e9a8a --- /dev/null +++ b/app/(panel)/tickets/page.tsx @@ -0,0 +1,480 @@ +"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
+
+
+ +
+ + + +
+
+
*/} +
+
+
+ + ); +} diff --git a/app/(panel)/tickets/update/[id]/page.tsx b/app/(panel)/tickets/update/[id]/page.tsx new file mode 100644 index 0000000..0dc52bf --- /dev/null +++ b/app/(panel)/tickets/update/[id]/page.tsx @@ -0,0 +1,23 @@ +import { API_URL } from "@/core/constant"; +interface PageProps { + params: Promise<{ id: string }>; +} + +async function getTicket(id: string) { + const res = await fetch(`${API_URL}/ticket/get/${id}`, { + cache: "no-store", // برای اینکه همیشه دیتای تازه از سرور بگیرد + }); + if (!res.ok) { + throw new Error("Error"); + } + + const data = await res.json(); + return data; +} + +export default async function Page({ params }: PageProps) { + const { id } = await params; + const getdata = await getTicket(id); + console.log(getdata) + return
; +} diff --git a/app/(panel)/users/page.tsx b/app/(panel)/users/page.tsx new file mode 100644 index 0000000..df3a989 --- /dev/null +++ b/app/(panel)/users/page.tsx @@ -0,0 +1,5 @@ +import React from "react"; + +export default function Page() { + return
; +} diff --git a/app/error.tsx b/app/error.tsx new file mode 100644 index 0000000..a8bc7c2 --- /dev/null +++ b/app/error.tsx @@ -0,0 +1,31 @@ +"use client"; // الزامی برای صفحات خطا + +import { useEffect } from "react"; + +export default function Error({ + error, + reset, +}: { + error: Error; + reset: () => void; +}) { + useEffect(() => { + console.error(error); // لاگ کردن خطا برای بررسی + }, [error]); + + return ( +
+

اوپس!

+

مشکلی در سرور رخ داده است

+

+ در حال حاضر امکان پردازش درخواست شما وجود ندارد. لطفاً دوباره تلاش کنید. +

+ +
+ ); +} diff --git a/app/globals.css b/app/globals.css index a2dc41e..823632c 100644 --- a/app/globals.css +++ b/app/globals.css @@ -5,22 +5,23 @@ --foreground: #171717; } -@theme inline { +/* @theme inline { --color-background: var(--background); --color-foreground: var(--foreground); --font-sans: var(--font-geist-sans); --font-mono: var(--font-geist-mono); -} +} */ -@media (prefers-color-scheme: dark) { +/* @media (prefers-color-scheme: dark) { :root { --background: #0a0a0a; --foreground: #ededed; } -} +} */ body { - background: var(--background); + background:linear-gradient(135deg,#1e3c72 0%, #2a5298 40%, #4facfe 100%); color: var(--foreground); - font-family: Arial, Helvetica, sans-serif; + font-family: var(--font-vazir); + scroll-behavior: smooth; } diff --git a/app/layout.tsx b/app/layout.tsx index 976eb90..655eb75 100644 --- a/app/layout.tsx +++ b/app/layout.tsx @@ -1,21 +1,15 @@ -import type { Metadata } from "next"; -import { Geist, Geist_Mono } from "next/font/google"; +"use client"; + import "./globals.css"; - -const geistSans = Geist({ - variable: "--font-geist-sans", - subsets: ["latin"], -}); - -const geistMono = Geist_Mono({ - variable: "--font-geist-mono", - subsets: ["latin"], -}); - -export const metadata: Metadata = { - title: "Create Next App", - description: "Generated by create next app", -}; +import { CacheProvider } from "@emotion/react"; +import { ThemeProvider } from "@mui/material/styles"; +import rtlCache from "./theme/rtlCache"; +import theme from "./theme/theme"; +import { CssBaseline } from "@mui/material"; +import { FontVazir } from "@/config/font.config"; +import { ToastContainer } from "react-toastify"; +import "react-toastify/dist/ReactToastify.css"; +import ReactQueryProvider from "@/ui/ReactQueryProvider"; export default function RootLayout({ children, @@ -24,10 +18,29 @@ export default function RootLayout({ }>) { return ( - {children} + + + + + +
+
{children}
+
+ +
+
+
+ ); } diff --git a/app/not-found.tsx b/app/not-found.tsx new file mode 100644 index 0000000..acaa17d --- /dev/null +++ b/app/not-found.tsx @@ -0,0 +1,17 @@ +import Link from 'next/link'; + +export default function NotFound() { + return ( +
+

404

+

صفحه مورد نظر پیدا نشد

+

متأسفیم، صفحه‌ای که به دنبال آن هستید وجود ندارد.

+ + بازگشت به داشبورد + +
+ ); +} diff --git a/app/page.tsx b/app/page.tsx index 3f36f7c..ac1f81d 100644 --- a/app/page.tsx +++ b/app/page.tsx @@ -1,65 +1,9 @@ -import Image from "next/image"; +import LoginForm from "@/ui/form/LoginForm"; export default function Home() { return ( -
-
- Next.js logo -
-

- To get started, edit the page.tsx file. -

-

- Looking for a starting point or more instructions? Head over to{" "} - - Templates - {" "} - or the{" "} - - Learning - {" "} - center. -

-
-
- - Vercel logomark - Deploy Now - - - Documentation - -
-
+
+
); } diff --git a/app/theme/rtlCache.ts b/app/theme/rtlCache.ts new file mode 100644 index 0000000..28bc9bc --- /dev/null +++ b/app/theme/rtlCache.ts @@ -0,0 +1,10 @@ +import createCache from "@emotion/cache"; +import { prefixer } from "stylis"; +import rtlPlugin from "stylis-plugin-rtl"; + +const rtlCache = createCache({ + key: "muirtl", + stylisPlugins: [prefixer, rtlPlugin], +}); + +export default rtlCache; diff --git a/app/theme/theme.ts b/app/theme/theme.ts new file mode 100644 index 0000000..c1b5e77 --- /dev/null +++ b/app/theme/theme.ts @@ -0,0 +1,10 @@ +import { createTheme } from "@mui/material/styles"; + +const theme = createTheme({ + direction: "rtl", + typography: { + fontFamily: "var(--font-vazir)", + }, +}); + +export default theme; diff --git a/config/font.config.ts b/config/font.config.ts new file mode 100644 index 0000000..6a1a29f --- /dev/null +++ b/config/font.config.ts @@ -0,0 +1,48 @@ +import localFont from "next/font/local"; + +export const FontVazir = localFont({ + src: [ + { + path: "../fonts/vazir/Vazirmatn-Thin.woff2", + weight: "100", + style: "normal", + }, + { + path: "../fonts/vazir/Vazirmatn-ExtraLight.woff2", + weight: "200", + style: "normal", + }, + { + path: "../fonts/vazir/Vazirmatn-Light.woff2", + weight: "300", + style: "normal", + }, + { + path: "../fonts/vazir/Vazirmatn-Regular.woff2", + weight: "400", + style: "normal", + }, + { + path: "../fonts/vazir/Vazirmatn-Medium.woff2", + weight: "500", + style: "normal", + }, + { + path: "../fonts/vazir/Vazirmatn-SemiBold.woff2", + weight: "600", + style: "normal", + }, + { + path: "../fonts/vazir/Vazirmatn-Bold.woff2", + weight: "700", + style: "normal", + }, + { + path: "../fonts/vazir/Vazirmatn-ExtraBold.woff2", + weight: "800", + style: "normal", + }, + ], + variable: "--font-vazir", // اگر خواستی متغیر CSS بسازی برای Tailwind یا CSS مدول + display: "swap", // بهترین گزینه برای نمایش فونت +}); diff --git a/core/constant/index.ts b/core/constant/index.ts new file mode 100644 index 0000000..b1219ce --- /dev/null +++ b/core/constant/index.ts @@ -0,0 +1,109 @@ +export const API_URL = "http://localhost:8000/api/v1"; +export const requestType = [ + { + id: "1", + name: "software", + displayName: "نرم افزار", + }, + { + id: "2", + name: "hardware", + displayName: "سخت افزار", + }, + { + id: "3", + name: "his", + displayName: "HIS", + }, + { + id: "4", + name: "general", + displayName: "عمومي", + }, +]; +export const ticketStatuses = [ + { + id: "open", + displayName: "باز", + bgClass: "bg-blue-50 text-blue-700 ring-blue-200", + dotClass: "bg-blue-600", + }, + { + id: "in-progress", + displayName: "در حال بررسی", + bgClass: "bg-amber-50 text-amber-700 ring-amber-200", + dotClass: "bg-amber-600", + }, + { + id: "resolved", + displayName: "حل شده", + bgClass: "bg-emerald-50 text-emerald-700 ring-emerald-200", + dotClass: "bg-emerald-600", + }, + { + id: "closed", + displayName: "بسته شده", + bgClass: "bg-slate-100 text-slate-700 ring-slate-300", + dotClass: "bg-slate-500", + }, +]; + +export const ticketPriorities = [ + { + id: "low", + displayName: "پایین", + bgClass: "bg-slate-50 text-slate-700 ring-slate-200", + dotClass: "bg-slate-500", + }, + { + id: "medium", + displayName: "متوسط", + bgClass: "bg-sky-50 text-sky-700 ring-sky-200", + dotClass: "bg-sky-600", + }, + { + id: "high", + displayName: "بالا", + bgClass: "bg-orange-50 text-orange-700 ring-orange-200", + dotClass: "bg-orange-600", + }, + { + id: "critical", + displayName: "بحرانی", + bgClass: "bg-rose-50 text-rose-700 ring-rose-200", + dotClass: "bg-rose-600", + }, +]; + +export const hospitalSoftwares = [ + { + id: "1", + name: "rahkaran", + displayName: "راهكاران", + }, + { + id: "2", + name: "timex", + displayName: "تايمكس", + }, + { + id: "3", + name: "automation", + displayName: "اتوماسيون", + }, + { + id: "4", + name: "pacs", + displayName: "پكس", + }, + { + id: "5", + name: "kasra", + displayName: "كسري", + }, + { + id: "6", + name: "ican", + displayName: "ican", + }, +]; diff --git a/core/types/index.ts b/core/types/index.ts new file mode 100644 index 0000000..4c3edd9 --- /dev/null +++ b/core/types/index.ts @@ -0,0 +1,37 @@ +// اینترفیس برای اطلاعات اساسی اشیاء وابسته +interface Assignee { + fullname: string; +} + +interface Department { + displayName: string; +} + +// اینترفیس اصلی تیکت +export interface TicketInterface { + id: string; + ticketNumber: string; + description: string; + priority: "low" | "medium" | "high" | "critical"; // اگر مقادیر مشخصی داری + status: "open" | "pending" | "resolved" | "closed"; + requestType: string; + relatedSystem: string; + location: string; + internalPhone: string; + helpdeskAction: string; + finalNotes: string; + + // فیلدهای کلیدی (FK) + departmentId: string; + assignedTo: string; + createdBy: string; + + // فیلدهای شامل شده (Include) + assignee: Assignee; + department: Department; + + // تاریخ‌ها + resolvedAt: Date | null; + createdAt: Date; + updatedAt: Date; +} diff --git a/core/utils/index.ts b/core/utils/index.ts new file mode 100644 index 0000000..f21e079 --- /dev/null +++ b/core/utils/index.ts @@ -0,0 +1,91 @@ +import axios from "axios"; +import * as XLSX from "xlsx"; +import { saveAs } from "file-saver"; +export function handleAxiosError(error: unknown) { + if (axios.isAxiosError(error)) { + // اینجا می‌دونیم که خطا از axios است + return error.response?.data?.error?.message; + } else { + return "Unexpected error"; + } +} + +export const handleExport = (data: any, type: any) => { + // ۱. تبدیل دیتا به یک Worksheet + const worksheet = XLSX.utils.json_to_sheet(data); + + // ۲. ایجاد یک Workbook جدید + const workbook = XLSX.utils.book_new(); + XLSX.utils.book_append_sheet(workbook, worksheet, "Data"); + + if (type === "excel") { + // خروجی اکسل + const excelBuffer = XLSX.write(workbook, { + bookType: "xlsx", + type: "array", + }); + const blob = new Blob([excelBuffer], { + type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + }); + saveAs(blob, "data.xlsx"); + } else if (type === "spss") { + // برای SPSS، بهترین فرمت CSV است که در SPSS به خوبی باز می‌شود + const csvData = XLSX.utils.sheet_to_csv(worksheet); + const blob = new Blob([csvData], { type: "text/csv;charset=utf-8;" }); + saveAs(blob, "data.csv"); // فایل CSV در SPSS به راحتی Import می‌شود + } +}; + +export const exportToExcel = ( + type: "spss" | "excel", + formattedData: any, + filename: string = "Report", +) => { + // تبدیل داده‌ها به فرمت قابل فهم برای XLSX + + let dataToProcess = Array.isArray(formattedData) + ? formattedData + : [formattedData]; + const worksheet = XLSX.utils.json_to_sheet(formattedData); + + const workbook = XLSX.utils.book_new(); + XLSX.utils.book_append_sheet(workbook, worksheet, filename); + + if (type === "excel") { + // خروجی اکسل + const excelBuffer = XLSX.write(workbook, { + bookType: "xlsx", + type: "array", + }); + const blob = new Blob([excelBuffer], { + type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + }); + saveAs(blob, `${filename}.xlsx`); + } else if (type === "spss") { + // برای SPSS، بهترین فرمت CSV است که در SPSS به خوبی باز می‌شود + const csvData = XLSX.utils.sheet_to_csv(worksheet); + const blob = new Blob([csvData], { type: "text/csv;charset=utf-8;" }); + saveAs(blob, `${filename}.csv`); // فایل CSV در SPSS به راحتی Import می‌شود + } +}; +export function formatDurationPersian(seconds:string) { + const sec = Math.abs(parseFloat(seconds)); + + if (sec < 1) return "بلافاصله"; // برای مقادیر بسیار ناچیز + if (sec < 60) return `${Math.floor(sec)} ثانیه`; + + const minutes = Math.floor(sec / 60); + const remainingSeconds = Math.floor(sec % 60); + + if (minutes < 60) { + return `${minutes} دقیقه و ${remainingSeconds} ثانیه`; + } + + const hours = Math.floor(minutes / 60); + const remainingMinutes = minutes % 60; + return `${hours} ساعت و ${remainingMinutes} دقیقه`; +} + +// مثال برای مقدار شما: +console.log(formatDurationPersian("-0.00100000000000000000")); +// خروجی: "بلافاصله" (یا ۰ ثانیه) diff --git a/fonts/sogand/SOGAND.ttf b/fonts/sogand/SOGAND.ttf new file mode 100644 index 0000000..fdee227 Binary files /dev/null and b/fonts/sogand/SOGAND.ttf differ diff --git a/fonts/vazir/Vazirmatn-Black.woff2 b/fonts/vazir/Vazirmatn-Black.woff2 new file mode 100644 index 0000000..f08cace Binary files /dev/null and b/fonts/vazir/Vazirmatn-Black.woff2 differ diff --git a/fonts/vazir/Vazirmatn-Bold.woff2 b/fonts/vazir/Vazirmatn-Bold.woff2 new file mode 100644 index 0000000..65b427f Binary files /dev/null and b/fonts/vazir/Vazirmatn-Bold.woff2 differ diff --git a/fonts/vazir/Vazirmatn-ExtraBold.woff2 b/fonts/vazir/Vazirmatn-ExtraBold.woff2 new file mode 100644 index 0000000..c074e70 Binary files /dev/null and b/fonts/vazir/Vazirmatn-ExtraBold.woff2 differ diff --git a/fonts/vazir/Vazirmatn-ExtraLight.woff2 b/fonts/vazir/Vazirmatn-ExtraLight.woff2 new file mode 100644 index 0000000..997dea0 Binary files /dev/null and b/fonts/vazir/Vazirmatn-ExtraLight.woff2 differ diff --git a/fonts/vazir/Vazirmatn-Light.woff2 b/fonts/vazir/Vazirmatn-Light.woff2 new file mode 100644 index 0000000..d154722 Binary files /dev/null and b/fonts/vazir/Vazirmatn-Light.woff2 differ diff --git a/fonts/vazir/Vazirmatn-Medium.woff2 b/fonts/vazir/Vazirmatn-Medium.woff2 new file mode 100644 index 0000000..495af75 Binary files /dev/null and b/fonts/vazir/Vazirmatn-Medium.woff2 differ diff --git a/fonts/vazir/Vazirmatn-Regular.woff2 b/fonts/vazir/Vazirmatn-Regular.woff2 new file mode 100644 index 0000000..c9824c8 Binary files /dev/null and b/fonts/vazir/Vazirmatn-Regular.woff2 differ diff --git a/fonts/vazir/Vazirmatn-SemiBold.woff2 b/fonts/vazir/Vazirmatn-SemiBold.woff2 new file mode 100644 index 0000000..5301641 Binary files /dev/null and b/fonts/vazir/Vazirmatn-SemiBold.woff2 differ diff --git a/fonts/vazir/Vazirmatn-Thin.woff2 b/fonts/vazir/Vazirmatn-Thin.woff2 new file mode 100644 index 0000000..b7df278 Binary files /dev/null and b/fonts/vazir/Vazirmatn-Thin.woff2 differ diff --git a/middleware.ts b/middleware.ts new file mode 100644 index 0000000..c48b5ac --- /dev/null +++ b/middleware.ts @@ -0,0 +1,54 @@ +// middleware.ts +import { NextResponse } from "next/server"; +import type { NextRequest } from "next/server"; + +// کلید کوکی که توکن در آن ذخیره می‌شود +const AUTH_COOKIE_KEY = "userToken"; // <<< این را با نام واقعی کوکی خودتان جایگزین کنید + +export function middleware(request: NextRequest) { + const token = request.cookies.get(AUTH_COOKIE_KEY)?.value; + const { pathname } = request.nextUrl; + + // مسیرهای عمومی که نیاز به احراز هویت ندارند (مثلا برای لاگین و ثبت نام) + const publicPaths = ["/"]; + + // اگر کاربر توکن دارد + if (token) { + // اگر در مسیر لاگین است، به داشبورد هدایت کن + if (pathname === "/") { + const url = request.nextUrl.clone(); + url.pathname = "/tickets/create"; + return NextResponse.redirect(url); + } + // در غیر این صورت، اجازه دسترسی به مسیر فعلی را بده + return NextResponse.next(); + } else { + // اگر کاربر توکن ندارد + // اگر در مسیرهای عمومی است، اجازه دسترسی بده + if (publicPaths.includes(pathname)) { + return NextResponse.next(); + } + // اگر در مسیرهای خصوصی است (مثل داشبورد)، به صفحه لاگین هدایت کن + if (pathname.startsWith("/tickets/create")) { + const url = request.nextUrl.clone(); + url.pathname = "/"; + return NextResponse.redirect(url); + } + // برای سایر مسیرهای خصوصی ناشناس + return NextResponse.next(); // یا هدایت به صفحه لاگین + } +} + +// تنظیمات middleware: کدام مسیرها را پوشش دهد +export const config = { + matcher: [ + /* + * Match all request paths except for the ones starting with: + * - api (API routes) + * - _next/static (static files) + * - _next/image (image optimization files) + * - favicon.ico (favicon file) + */ + "/((?!api|_next/static|_next/image|favicon.ico).*)", + ], +}; diff --git a/package-lock.json b/package-lock.json index 4984db5..d1b07e9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -8,15 +8,33 @@ "name": "frontend", "version": "0.1.0", "dependencies": { + "@emotion/react": "^11.14.0", + "@emotion/styled": "^11.14.1", + "@mui/icons-material": "^9.0.1", + "@mui/material": "^9.0.1", + "@mui/material-nextjs": "^9.0.1", + "@mui/x-date-pickers": "^9.3.0", + "@tanstack/react-query": "^5.100.11", + "axios": "^1.16.1", + "date-fns": "^4.3.0", + "date-fns-jalali": "^4.0.0-0", + "file-saver": "^2.0.5", "next": "16.2.6", "react": "19.2.4", - "react-dom": "19.2.4" + "react-dom": "19.2.4", + "react-paginate": "^8.3.0", + "react-toastify": "^11.1.0", + "stylis": "^4.4.0", + "stylis-plugin-rtl": "^2.1.1", + "xlsx": "^0.18.5" }, "devDependencies": { "@tailwindcss/postcss": "^4", + "@types/file-saver": "^2.0.7", "@types/node": "^20", "@types/react": "^19", "@types/react-dom": "^19", + "@types/stylis": "^4.2.7", "eslint": "^9", "eslint-config-next": "16.2.6", "tailwindcss": "^4", @@ -40,7 +58,6 @@ "version": "7.29.0", "resolved": "https://package-mirror.liara.ir/repository/npm/@babel/code-frame/-/code-frame-7.29.0.tgz", "integrity": "sha512-9NhCeYjq9+3uxgdtp20LSiJXJvN0FeCtNGpJxuMFZ1Kv3cWUNb6DOhJwUvcVCzKGR66cw4njwM6hrJLqgOwbcw==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-validator-identifier": "^7.28.5", @@ -96,7 +113,6 @@ "version": "7.29.1", "resolved": "https://package-mirror.liara.ir/repository/npm/@babel/generator/-/generator-7.29.1.tgz", "integrity": "sha512-qsaF+9Qcm2Qv8SRIMMscAvG4O3lJ0F1GuMo5HR/Bp02LopNgnZBC/EkbevHFeGs4ls/oPz9v+Bsmzbkbe+0dUw==", - "dev": true, "license": "MIT", "dependencies": { "@babel/parser": "^7.29.0", @@ -130,7 +146,6 @@ "version": "7.28.0", "resolved": "https://package-mirror.liara.ir/repository/npm/@babel/helper-globals/-/helper-globals-7.28.0.tgz", "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", - "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" @@ -140,7 +155,6 @@ "version": "7.28.6", "resolved": "https://package-mirror.liara.ir/repository/npm/@babel/helper-module-imports/-/helper-module-imports-7.28.6.tgz", "integrity": "sha512-l5XkZK7r7wa9LucGw9LwZyyCUscb4x37JWTPz7swwFE/0FMQAGpiWUZn8u9DzkSBWEcK25jmvubfpw2dnAMdbw==", - "dev": true, "license": "MIT", "dependencies": { "@babel/traverse": "^7.28.6", @@ -172,7 +186,6 @@ "version": "7.27.1", "resolved": "https://package-mirror.liara.ir/repository/npm/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", - "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" @@ -182,7 +195,6 @@ "version": "7.28.5", "resolved": "https://package-mirror.liara.ir/repository/npm/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", - "dev": true, "license": "MIT", "engines": { "node": ">=6.9.0" @@ -216,7 +228,6 @@ "version": "7.29.3", "resolved": "https://package-mirror.liara.ir/repository/npm/@babel/parser/-/parser-7.29.3.tgz", "integrity": "sha512-b3ctpQwp+PROvU/cttc4OYl4MzfJUWy6FZg+PMXfzmt/+39iHVF0sDfqay8TQM3JA2EUOyKcFZt75jWriQijsA==", - "dev": true, "license": "MIT", "dependencies": { "@babel/types": "^7.29.0" @@ -228,11 +239,19 @@ "node": ">=6.0.0" } }, + "node_modules/@babel/runtime": { + "version": "7.29.2", + "resolved": "https://package-mirror.liara.ir/repository/npm/@babel/runtime/-/runtime-7.29.2.tgz", + "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, "node_modules/@babel/template": { "version": "7.28.6", "resolved": "https://package-mirror.liara.ir/repository/npm/@babel/template/-/template-7.28.6.tgz", "integrity": "sha512-YA6Ma2KsCdGb+WC6UpBVFJGXL58MDA6oyONbjyF/+5sBgxY/dwkhLogbMT2GXXyU84/IhRw/2D1Os1B/giz+BQ==", - "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.28.6", @@ -247,7 +266,6 @@ "version": "7.29.0", "resolved": "https://package-mirror.liara.ir/repository/npm/@babel/traverse/-/traverse-7.29.0.tgz", "integrity": "sha512-4HPiQr0X7+waHfyXPZpWPfWL/J7dcN1mx9gL6WdQVMbPnF3+ZhSMs8tCxN7oHddJE9fhNE7+lxdnlyemKfJRuA==", - "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.29.0", @@ -266,7 +284,6 @@ "version": "7.29.0", "resolved": "https://package-mirror.liara.ir/repository/npm/@babel/types/-/types-7.29.0.tgz", "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", - "dev": true, "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.27.1", @@ -309,6 +326,170 @@ "tslib": "^2.4.0" } }, + "node_modules/@emotion/babel-plugin": { + "version": "11.13.5", + "resolved": "https://package-mirror.liara.ir/repository/npm/@emotion/babel-plugin/-/babel-plugin-11.13.5.tgz", + "integrity": "sha512-pxHCpT2ex+0q+HH91/zsdHkw/lXd468DIN2zvfvLtPKLLMo6gQj7oLObq8PhkrxOZb/gGCq03S3Z7PDhS8pduQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/serialize": "^1.3.3", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/babel-plugin/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://package-mirror.liara.ir/repository/npm/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "license": "MIT" + }, + "node_modules/@emotion/babel-plugin/node_modules/stylis": { + "version": "4.2.0", + "resolved": "https://package-mirror.liara.ir/repository/npm/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==", + "license": "MIT" + }, + "node_modules/@emotion/cache": { + "version": "11.14.0", + "resolved": "https://package-mirror.liara.ir/repository/npm/@emotion/cache/-/cache-11.14.0.tgz", + "integrity": "sha512-L/B1lc/TViYk4DcpGxtAVbx0ZyiKM5ktoIyafGkH6zg/tj+mA+NE//aPYKG0k8kCHSHVJrpLpcAlOBEXQ3SavA==", + "license": "MIT", + "dependencies": { + "@emotion/memoize": "^0.9.0", + "@emotion/sheet": "^1.4.0", + "@emotion/utils": "^1.4.2", + "@emotion/weak-memoize": "^0.4.0", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/cache/node_modules/stylis": { + "version": "4.2.0", + "resolved": "https://package-mirror.liara.ir/repository/npm/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==", + "license": "MIT" + }, + "node_modules/@emotion/hash": { + "version": "0.9.2", + "resolved": "https://package-mirror.liara.ir/repository/npm/@emotion/hash/-/hash-0.9.2.tgz", + "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==", + "license": "MIT" + }, + "node_modules/@emotion/is-prop-valid": { + "version": "1.4.0", + "resolved": "https://package-mirror.liara.ir/repository/npm/@emotion/is-prop-valid/-/is-prop-valid-1.4.0.tgz", + "integrity": "sha512-QgD4fyscGcbbKwJmqNvUMSE02OsHUa+lAWKdEUIJKgqe5IwRSKd7+KhibEWdaKwgjLj0DRSHA9biAIqGBk05lw==", + "license": "MIT", + "dependencies": { + "@emotion/memoize": "^0.9.0" + } + }, + "node_modules/@emotion/memoize": { + "version": "0.9.0", + "resolved": "https://package-mirror.liara.ir/repository/npm/@emotion/memoize/-/memoize-0.9.0.tgz", + "integrity": "sha512-30FAj7/EoJ5mwVPOWhAyCX+FPfMDrVecJAM+Iw9NRoSl4BBAQeqj4cApHHUXOVvIPgLVDsCFoz/hGD+5QQD1GQ==", + "license": "MIT" + }, + "node_modules/@emotion/react": { + "version": "11.14.0", + "resolved": "https://package-mirror.liara.ir/repository/npm/@emotion/react/-/react-11.14.0.tgz", + "integrity": "sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.13.5", + "@emotion/cache": "^11.14.0", + "@emotion/serialize": "^1.3.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", + "@emotion/utils": "^1.4.2", + "@emotion/weak-memoize": "^0.4.0", + "hoist-non-react-statics": "^3.3.1" + }, + "peerDependencies": { + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/serialize": { + "version": "1.3.3", + "resolved": "https://package-mirror.liara.ir/repository/npm/@emotion/serialize/-/serialize-1.3.3.tgz", + "integrity": "sha512-EISGqt7sSNWHGI76hC7x1CksiXPahbxEOrC5RjmFRJTqLyEK9/9hZvBbiYn70dw4wuwMKiEMCUlR6ZXTSWQqxA==", + "license": "MIT", + "dependencies": { + "@emotion/hash": "^0.9.2", + "@emotion/memoize": "^0.9.0", + "@emotion/unitless": "^0.10.0", + "@emotion/utils": "^1.4.2", + "csstype": "^3.0.2" + } + }, + "node_modules/@emotion/sheet": { + "version": "1.4.0", + "resolved": "https://package-mirror.liara.ir/repository/npm/@emotion/sheet/-/sheet-1.4.0.tgz", + "integrity": "sha512-fTBW9/8r2w3dXWYM4HCB1Rdp8NLibOw2+XELH5m5+AkWiL/KqYX6dc0kKYlaYyKjrQ6ds33MCdMPEwgs2z1rqg==", + "license": "MIT" + }, + "node_modules/@emotion/styled": { + "version": "11.14.1", + "resolved": "https://package-mirror.liara.ir/repository/npm/@emotion/styled/-/styled-11.14.1.tgz", + "integrity": "sha512-qEEJt42DuToa3gurlH4Qqc1kVpNq8wO8cJtDzU46TjlzWjDlsVyevtYCRijVq3SrHsROS+gVQ8Fnea108GnKzw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.13.5", + "@emotion/is-prop-valid": "^1.3.0", + "@emotion/serialize": "^1.3.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.2.0", + "@emotion/utils": "^1.4.2" + }, + "peerDependencies": { + "@emotion/react": "^11.0.0-rc.0", + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/unitless": { + "version": "0.10.0", + "resolved": "https://package-mirror.liara.ir/repository/npm/@emotion/unitless/-/unitless-0.10.0.tgz", + "integrity": "sha512-dFoMUuQA20zvtVTuxZww6OHoJYgrzfKM1t52mVySDJnMSEa08ruEvdYQbhvyu6soU+NeLVd3yKfTfT0NeV6qGg==", + "license": "MIT" + }, + "node_modules/@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.2.0", + "resolved": "https://package-mirror.liara.ir/repository/npm/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.2.0.tgz", + "integrity": "sha512-yJMtVdH59sxi/aVJBpk9FQq+OR8ll5GT8oWd57UpeaKEVGab41JWaCFA7FRLoMLloOZF/c/wsPoe+bfGmRKgDg==", + "license": "MIT", + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@emotion/utils": { + "version": "1.4.2", + "resolved": "https://package-mirror.liara.ir/repository/npm/@emotion/utils/-/utils-1.4.2.tgz", + "integrity": "sha512-3vLclRofFziIa3J2wDh9jjbkUz9qk5Vi3IZ/FSTKViB0k+ef0fPV7dYrUIugbgupYDx7v9ud/SjrtEP8Y4xLoA==", + "license": "MIT" + }, + "node_modules/@emotion/weak-memoize": { + "version": "0.4.0", + "resolved": "https://package-mirror.liara.ir/repository/npm/@emotion/weak-memoize/-/weak-memoize-0.4.0.tgz", + "integrity": "sha512-snKqtPW01tN0ui7yu9rGv69aJXr/a/Ywvl11sUjNtEcRc+ng/mQriFL0wLXMef74iHa/EkftbDzU9F8iFbH+zg==", + "license": "MIT" + }, "node_modules/@eslint-community/eslint-utils": { "version": "4.9.1", "resolved": "https://package-mirror.liara.ir/repository/npm/@eslint-community/eslint-utils/-/eslint-utils-4.9.1.tgz", @@ -989,7 +1170,6 @@ "version": "0.3.13", "resolved": "https://package-mirror.liara.ir/repository/npm/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "dev": true, "license": "MIT", "dependencies": { "@jridgewell/sourcemap-codec": "^1.5.0", @@ -1011,7 +1191,6 @@ "version": "3.1.2", "resolved": "https://package-mirror.liara.ir/repository/npm/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "dev": true, "license": "MIT", "engines": { "node": ">=6.0.0" @@ -1021,20 +1200,422 @@ "version": "1.5.5", "resolved": "https://package-mirror.liara.ir/repository/npm/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "dev": true, "license": "MIT" }, "node_modules/@jridgewell/trace-mapping": { "version": "0.3.31", "resolved": "https://package-mirror.liara.ir/repository/npm/@jridgewell/trace-mapping/-/trace-mapping-0.3.31.tgz", "integrity": "sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==", - "dev": true, "license": "MIT", "dependencies": { "@jridgewell/resolve-uri": "^3.1.0", "@jridgewell/sourcemap-codec": "^1.4.14" } }, + "node_modules/@mui/core-downloads-tracker": { + "version": "9.0.1", + "resolved": "https://package-mirror.liara.ir/repository/npm/@mui/core-downloads-tracker/-/core-downloads-tracker-9.0.1.tgz", + "integrity": "sha512-GzamIIhZ1bH77dq7eKaeyRgJdkypsxin4jBFq2EMs4lBWRR0LFO1CSVMsoebn/VvjcNrnrOrjy48MkrkQUK2iw==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + } + }, + "node_modules/@mui/icons-material": { + "version": "9.0.1", + "resolved": "https://package-mirror.liara.ir/repository/npm/@mui/icons-material/-/icons-material-9.0.1.tgz", + "integrity": "sha512-5PRpQjVLTNLyV/2J9J53Yz4R0tVbodG0BQDN2zQI1QBG1OPYM25ar+4N20eyFOfJT6zKglLzsnU70+zdVLaTkw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.29.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@mui/material": "^9.0.1", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/material": { + "version": "9.0.1", + "resolved": "https://package-mirror.liara.ir/repository/npm/@mui/material/-/material-9.0.1.tgz", + "integrity": "sha512-voyCpeUxcSWLN7KPZuq0pGCIt726T9K6kiVM3XUcywZDAlZSarLHaUxJVQpospbjjOzN53hwyjo8s6KoWl6utw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.29.2", + "@mui/core-downloads-tracker": "^9.0.1", + "@mui/system": "^9.0.1", + "@mui/types": "^9.0.0", + "@mui/utils": "^9.0.1", + "@popperjs/core": "^2.11.8", + "@types/react-transition-group": "^4.4.12", + "clsx": "^2.1.1", + "csstype": "^3.2.3", + "prop-types": "^15.8.1", + "react-is": "^19.2.4", + "react-transition-group": "^4.4.5" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@mui/material-pigment-css": "^9.0.1", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@mui/material-pigment-css": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/material-nextjs": { + "version": "9.0.1", + "resolved": "https://package-mirror.liara.ir/repository/npm/@mui/material-nextjs/-/material-nextjs-9.0.1.tgz", + "integrity": "sha512-kUPGNMOam7bZs4wgjfAEJb/hpNlWTiHcS9+1XVRsEF7I0ImvmVxvb1DMDj3hG3cfq0PggXBSwihzVJe5iFFzwg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.29.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/cache": "^11.11.0", + "@emotion/react": "^11.11.4", + "@emotion/server": "^11.11.0", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "next": "^13.0.0 || ^14.0.0 || ^15.0.0 || ^16.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/cache": { + "optional": true + }, + "@emotion/server": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/material/node_modules/react-is": { + "version": "19.2.6", + "resolved": "https://package-mirror.liara.ir/repository/npm/react-is/-/react-is-19.2.6.tgz", + "integrity": "sha512-XjBR15BhXuylgWGuslhDKqlSayuqvqBX91BP8pauG8kd1zY8kotkNWbXksTCNRarse4kuGbe2kIY05ARtwNIvw==", + "license": "MIT" + }, + "node_modules/@mui/private-theming": { + "version": "9.0.1", + "resolved": "https://package-mirror.liara.ir/repository/npm/@mui/private-theming/-/private-theming-9.0.1.tgz", + "integrity": "sha512-pSIGq4Yw749KHEwlkYZWVERgHgwJELP6ODtBNUfV8V4oIb5H+h7IQDFXuk/b2oQccODK1enJAtiEzlgLZmq+8g==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.29.2", + "@mui/utils": "^9.0.1", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/styled-engine": { + "version": "9.0.0", + "resolved": "https://package-mirror.liara.ir/repository/npm/@mui/styled-engine/-/styled-engine-9.0.0.tgz", + "integrity": "sha512-9RLGdX4Jg0aQPRuvqh/OLzYSPlgd5zyEw5/1HIRfdavSiOd03WtUaGZH9/w1RoTYuRKwpgy0hpIFaMHIqPVIWg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.29.2", + "@emotion/cache": "^11.14.0", + "@emotion/serialize": "^1.3.3", + "@emotion/sheet": "^1.4.0", + "csstype": "^3.2.3", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.4.1", + "@emotion/styled": "^11.3.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + } + } + }, + "node_modules/@mui/system": { + "version": "9.0.1", + "resolved": "https://package-mirror.liara.ir/repository/npm/@mui/system/-/system-9.0.1.tgz", + "integrity": "sha512-WvlioaLxk6ewUIOfh0StxUvOPDS1mCfzaulcudsL1brZNXuh0N9FMk7RpH7ImJKjEz412SEy/V/yvqmtxbqxCQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.29.2", + "@mui/private-theming": "^9.0.1", + "@mui/styled-engine": "^9.0.0", + "@mui/types": "^9.0.0", + "@mui/utils": "^9.0.1", + "clsx": "^2.1.1", + "csstype": "^3.2.3", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.5.0", + "@emotion/styled": "^11.3.0", + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/types": { + "version": "9.0.0", + "resolved": "https://package-mirror.liara.ir/repository/npm/@mui/types/-/types-9.0.0.tgz", + "integrity": "sha512-i1cuFCAWN44b3AJWO7mh7tuh1sqbQSeVr/94oG0TX5uXivac8XalgE4/6fQZcmGZigzbQ35IXxj/4jLpRIBYZg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.29.2" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/utils": { + "version": "9.0.1", + "resolved": "https://package-mirror.liara.ir/repository/npm/@mui/utils/-/utils-9.0.1.tgz", + "integrity": "sha512-f3UO3jNN1pYg5zxqXC81Bvv8hx5ACcYc0387382ZI7M5ono1heIwHYLrKsz85myguWdeVKPRZGmDdynWUBjK2g==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.29.2", + "@mui/types": "^9.0.0", + "@types/prop-types": "^15.7.15", + "clsx": "^2.1.1", + "prop-types": "^15.8.1", + "react-is": "^19.2.4" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/utils/node_modules/react-is": { + "version": "19.2.6", + "resolved": "https://package-mirror.liara.ir/repository/npm/react-is/-/react-is-19.2.6.tgz", + "integrity": "sha512-XjBR15BhXuylgWGuslhDKqlSayuqvqBX91BP8pauG8kd1zY8kotkNWbXksTCNRarse4kuGbe2kIY05ARtwNIvw==", + "license": "MIT" + }, + "node_modules/@mui/x-date-pickers": { + "version": "9.3.0", + "resolved": "https://package-mirror.liara.ir/repository/npm/@mui/x-date-pickers/-/x-date-pickers-9.3.0.tgz", + "integrity": "sha512-Kg9mEZA+nHKi55DsbzVVMUhURQU6MQXtAEKjgyMqyaq1PMZ8Nr72KszqGhZZNmVkyM91wcq/icYgRVzYa65Gow==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.29.2", + "@mui/utils": "9.0.1", + "@mui/x-internals": "^9.1.0", + "@types/react-transition-group": "^4.4.12", + "clsx": "^2.1.1", + "prop-types": "^15.8.1", + "react-transition-group": "^4.4.5" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.9.0", + "@emotion/styled": "^11.8.1", + "@mui/material": "^7.3.0 || ^9.0.0", + "@mui/system": "^7.3.0 || ^9.0.0", + "date-fns": "^2.25.0 || ^3.2.0 || ^4.0.0", + "date-fns-jalali": "^2.13.0-0 || ^3.2.0-0 || ^4.0.0-0", + "dayjs": "^1.10.7", + "luxon": "^3.0.2", + "moment": "^2.29.4", + "moment-hijri": "^2.1.2 || ^3.0.0", + "moment-jalaali": "^0.7.4 || ^0.8.0 || ^0.9.0 || ^0.10.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + }, + "date-fns": { + "optional": true + }, + "date-fns-jalali": { + "optional": true + }, + "dayjs": { + "optional": true + }, + "luxon": { + "optional": true + }, + "moment": { + "optional": true + }, + "moment-hijri": { + "optional": true + }, + "moment-jalaali": { + "optional": true + } + } + }, + "node_modules/@mui/x-internals": { + "version": "9.1.0", + "resolved": "https://package-mirror.liara.ir/repository/npm/@mui/x-internals/-/x-internals-9.1.0.tgz", + "integrity": "sha512-fVezTa1lU+Hb3y9UMI8D/iWXADhs0I8PaZqoh2LOUXjGEUJmKqwsRD19ZXInZsH2yu+YS0dqYMPDvzjYTTyo+Q==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.29.2", + "@mui/utils": "9.0.0", + "reselect": "^5.1.1", + "use-sync-external-store": "^1.6.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/@mui/x-internals/node_modules/@mui/utils": { + "version": "9.0.0", + "resolved": "https://package-mirror.liara.ir/repository/npm/@mui/utils/-/utils-9.0.0.tgz", + "integrity": "sha512-bQcqyg/gjULUqTuyUjSAFr6LQGLvtkNtDbJerAtoUn9kGZ0hg5QJiN1PLHMLbeFpe3te1831uq7GFl2ITokGdg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.29.2", + "@mui/types": "^9.0.0", + "@types/prop-types": "^15.7.15", + "clsx": "^2.1.1", + "prop-types": "^15.8.1", + "react-is": "^19.2.4" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/x-internals/node_modules/react-is": { + "version": "19.2.6", + "resolved": "https://package-mirror.liara.ir/repository/npm/react-is/-/react-is-19.2.6.tgz", + "integrity": "sha512-XjBR15BhXuylgWGuslhDKqlSayuqvqBX91BP8pauG8kd1zY8kotkNWbXksTCNRarse4kuGbe2kIY05ARtwNIvw==", + "license": "MIT" + }, "node_modules/@napi-rs/wasm-runtime": { "version": "0.2.12", "resolved": "https://package-mirror.liara.ir/repository/npm/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", @@ -1240,6 +1821,16 @@ "node": ">=12.4.0" } }, + "node_modules/@popperjs/core": { + "version": "2.11.8", + "resolved": "https://package-mirror.liara.ir/repository/npm/@popperjs/core/-/core-2.11.8.tgz", + "integrity": "sha512-P1st0aksCrn9sGZhp8GMYwBnQsbvAWsZAX44oXNNvLHGqAOcoVxmjZiohstwQ7SqKnbR47akdNi+uleWD8+g6A==", + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/popperjs" + } + }, "node_modules/@rtsao/scc": { "version": "1.1.0", "resolved": "https://package-mirror.liara.ir/repository/npm/@rtsao/scc/-/scc-1.1.0.tgz", @@ -1527,6 +2118,32 @@ "tailwindcss": "4.3.0" } }, + "node_modules/@tanstack/query-core": { + "version": "5.100.11", + "resolved": "https://package-mirror.liara.ir/repository/npm/@tanstack/query-core/-/query-core-5.100.11.tgz", + "integrity": "sha512-lmE0994apShXPj8CUxgx4ch5yUJhE9k/+tVwihBvPOyerACWdBocfFg24t8+0RhtlTd7tEgchDkhlCxNssvDxw==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, + "node_modules/@tanstack/react-query": { + "version": "5.100.11", + "resolved": "https://package-mirror.liara.ir/repository/npm/@tanstack/react-query/-/react-query-5.100.11.tgz", + "integrity": "sha512-J0f9s5x3LE1450nNNfYx+e/n0DMa0uOBdFJUy5r0RvmsXd4nB/n0rbHtHI1vYXhikNFan+wf51p6Tmp4c8ucrg==", + "license": "MIT", + "dependencies": { + "@tanstack/query-core": "5.100.11" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": "^18 || ^19" + } + }, "node_modules/@tybys/wasm-util": { "version": "0.10.2", "resolved": "https://package-mirror.liara.ir/repository/npm/@tybys/wasm-util/-/wasm-util-0.10.2.tgz", @@ -1545,6 +2162,13 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/file-saver": { + "version": "2.0.7", + "resolved": "https://package-mirror.liara.ir/repository/npm/@types/file-saver/-/file-saver-2.0.7.tgz", + "integrity": "sha512-dNKVfHd/jk0SkR/exKGj2ggkB45MAkzvWCaqLUUgkyjITkGNzH8H+yUwr+BLJUBjZOe9w8X3wgmXhZDRg1ED6A==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://package-mirror.liara.ir/repository/npm/@types/json-schema/-/json-schema-7.0.15.tgz", @@ -1569,11 +2193,22 @@ "undici-types": "~6.21.0" } }, + "node_modules/@types/parse-json": { + "version": "4.0.2", + "resolved": "https://package-mirror.liara.ir/repository/npm/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", + "license": "MIT" + }, + "node_modules/@types/prop-types": { + "version": "15.7.15", + "resolved": "https://package-mirror.liara.ir/repository/npm/@types/prop-types/-/prop-types-15.7.15.tgz", + "integrity": "sha512-F6bEyamV9jKGAFBEmlQnesRPGOQqS2+Uwi0Em15xenOxHaf2hv6L8YCVn3rPdPJOiJfPiCnLIRyvwVaqMY3MIw==", + "license": "MIT" + }, "node_modules/@types/react": { "version": "19.2.14", "resolved": "https://package-mirror.liara.ir/repository/npm/@types/react/-/react-19.2.14.tgz", "integrity": "sha512-ilcTH/UniCkMdtexkoCN0bI7pMcJDvmQFPvuPvmEaYA/NSfFTAgdUSLAoVjaRJm7+6PvcM+q1zYOwS4wTYMF9w==", - "dev": true, "license": "MIT", "dependencies": { "csstype": "^3.2.2" @@ -1589,6 +2224,22 @@ "@types/react": "^19.2.0" } }, + "node_modules/@types/react-transition-group": { + "version": "4.4.12", + "resolved": "https://package-mirror.liara.ir/repository/npm/@types/react-transition-group/-/react-transition-group-4.4.12.tgz", + "integrity": "sha512-8TV6R3h2j7a91c+1DXdJi3Syo69zzIZbz7Lg5tORM5LEJG7X/E6a1V3drRyBRZq7/utz7A+c4OgYLiLcYGHG6w==", + "license": "MIT", + "peerDependencies": { + "@types/react": "*" + } + }, + "node_modules/@types/stylis": { + "version": "4.2.7", + "resolved": "https://package-mirror.liara.ir/repository/npm/@types/stylis/-/stylis-4.2.7.tgz", + "integrity": "sha512-VgDNokpBoKF+wrdvhAAfS55OMQpL6QRglwTwNC3kIgBrzZxA4WsFj+2eLfEA/uMUDzBcEhYmjSbwQakn/i3ajA==", + "dev": true, + "license": "MIT" + }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "8.59.3", "resolved": "https://package-mirror.liara.ir/repository/npm/@typescript-eslint/eslint-plugin/-/eslint-plugin-8.59.3.tgz", @@ -2176,6 +2827,27 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, + "node_modules/adler-32": { + "version": "1.3.1", + "resolved": "https://package-mirror.liara.ir/repository/npm/adler-32/-/adler-32-1.3.1.tgz", + "integrity": "sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://package-mirror.liara.ir/repository/npm/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "license": "MIT", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, "node_modules/ajv": { "version": "6.15.0", "resolved": "https://package-mirror.liara.ir/repository/npm/ajv/-/ajv-6.15.0.tgz", @@ -2403,6 +3075,12 @@ "node": ">= 0.4" } }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://package-mirror.liara.ir/repository/npm/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, "node_modules/available-typed-arrays": { "version": "1.0.7", "resolved": "https://package-mirror.liara.ir/repository/npm/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", @@ -2429,6 +3107,18 @@ "node": ">=4" } }, + "node_modules/axios": { + "version": "1.16.1", + "resolved": "https://package-mirror.liara.ir/repository/npm/axios/-/axios-1.16.1.tgz", + "integrity": "sha512-caYkukvroVPO8KrzuJEb50Hm07KwfBZPEC3VeFHTsqWHvKTsy54hjJz9BS/cdaypROE2rH6xvm9mHX4fgWkr3A==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.16.0", + "form-data": "^4.0.5", + "https-proxy-agent": "^5.0.1", + "proxy-from-env": "^2.1.0" + } + }, "node_modules/axobject-query": { "version": "4.1.0", "resolved": "https://package-mirror.liara.ir/repository/npm/axobject-query/-/axobject-query-4.1.0.tgz", @@ -2439,6 +3129,42 @@ "node": ">= 0.4" } }, + "node_modules/babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://package-mirror.liara.ir/repository/npm/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, + "node_modules/babel-plugin-macros/node_modules/resolve": { + "version": "1.22.12", + "resolved": "https://package-mirror.liara.ir/repository/npm/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "is-core-module": "^2.16.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://package-mirror.liara.ir/repository/npm/balanced-match/-/balanced-match-1.0.2.tgz", @@ -2539,7 +3265,6 @@ "version": "1.0.2", "resolved": "https://package-mirror.liara.ir/repository/npm/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -2570,7 +3295,6 @@ "version": "3.1.0", "resolved": "https://package-mirror.liara.ir/repository/npm/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, "license": "MIT", "engines": { "node": ">=6" @@ -2596,6 +3320,19 @@ ], "license": "CC-BY-4.0" }, + "node_modules/cfb": { + "version": "1.2.2", + "resolved": "https://package-mirror.liara.ir/repository/npm/cfb/-/cfb-1.2.2.tgz", + "integrity": "sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==", + "license": "Apache-2.0", + "dependencies": { + "adler-32": "~1.3.0", + "crc-32": "~1.2.0" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/chalk": { "version": "4.1.2", "resolved": "https://package-mirror.liara.ir/repository/npm/chalk/-/chalk-4.1.2.tgz", @@ -2619,6 +3356,24 @@ "integrity": "sha512-IV3Ou0jSMzZrd3pZ48nLkT9DA7Ag1pnPzaiQhpW7c3RbcqqzvzzVu+L8gfqMp/8IM2MQtSiqaCxrrcfu8I8rMA==", "license": "MIT" }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://package-mirror.liara.ir/repository/npm/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/codepage": { + "version": "1.15.0", + "resolved": "https://package-mirror.liara.ir/repository/npm/codepage/-/codepage-1.15.0.tgz", + "integrity": "sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://package-mirror.liara.ir/repository/npm/color-convert/-/color-convert-2.0.1.tgz", @@ -2639,6 +3394,18 @@ "dev": true, "license": "MIT" }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://package-mirror.liara.ir/repository/npm/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://package-mirror.liara.ir/repository/npm/concat-map/-/concat-map-0.0.1.tgz", @@ -2653,6 +3420,34 @@ "dev": true, "license": "MIT" }, + "node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://package-mirror.liara.ir/repository/npm/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/crc-32": { + "version": "1.2.2", + "resolved": "https://package-mirror.liara.ir/repository/npm/crc-32/-/crc-32-1.2.2.tgz", + "integrity": "sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==", + "license": "Apache-2.0", + "bin": { + "crc32": "bin/crc32.njs" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/cross-spawn": { "version": "7.0.6", "resolved": "https://package-mirror.liara.ir/repository/npm/cross-spawn/-/cross-spawn-7.0.6.tgz", @@ -2668,11 +3463,19 @@ "node": ">= 8" } }, + "node_modules/cssjanus": { + "version": "2.3.0", + "resolved": "https://package-mirror.liara.ir/repository/npm/cssjanus/-/cssjanus-2.3.0.tgz", + "integrity": "sha512-ZZXXn51SnxRxAZ6fdY7mBDPmA4OZd83q/J9Gdqz3YmE9TUq+9tZl+tdOnCi7PpNygI6PEkehj9rgifv5+W8a5A==", + "license": "Apache-2.0", + "engines": { + "node": ">=10.0.0" + } + }, "node_modules/csstype": { "version": "3.2.3", "resolved": "https://package-mirror.liara.ir/repository/npm/csstype/-/csstype-3.2.3.tgz", "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", - "dev": true, "license": "MIT" }, "node_modules/damerau-levenshtein": { @@ -2736,11 +3539,26 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/date-fns": { + "version": "4.3.0", + "resolved": "https://package-mirror.liara.ir/repository/npm/date-fns/-/date-fns-4.3.0.tgz", + "integrity": "sha512-OYcL+3N/jyWbYdFGqoMAhytDgxP9pbYPUUiRCOgn4Fewaadk9l/Wam4Avciiyp2BgkpfQyBV9B+ehnVJych+eQ==", + "license": "MIT", + "funding": { + "type": "github", + "url": "https://github.com/sponsors/kossnocorp" + } + }, + "node_modules/date-fns-jalali": { + "version": "4.0.0-0", + "resolved": "https://package-mirror.liara.ir/repository/npm/date-fns-jalali/-/date-fns-jalali-4.0.0-0.tgz", + "integrity": "sha512-EczB+gWceuWCRlacE4T+WmdP+BV/IUQpjQW9aBa9DNcXkKuZFv3WBDqeP2Ew+6YFBtPRRcH5U22+C6gcpwgG8A==", + "license": "MIT" + }, "node_modules/debug": { "version": "4.4.3", "resolved": "https://package-mirror.liara.ir/repository/npm/debug/-/debug-4.4.3.tgz", "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", - "dev": true, "license": "MIT", "dependencies": { "ms": "^2.1.3" @@ -2797,6 +3615,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://package-mirror.liara.ir/repository/npm/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, "node_modules/detect-libc": { "version": "2.1.2", "resolved": "https://package-mirror.liara.ir/repository/npm/detect-libc/-/detect-libc-2.1.2.tgz", @@ -2820,11 +3647,20 @@ "node": ">=0.10.0" } }, + "node_modules/dom-helpers": { + "version": "5.2.1", + "resolved": "https://package-mirror.liara.ir/repository/npm/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://package-mirror.liara.ir/repository/npm/dunder-proto/-/dunder-proto-1.0.1.tgz", "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "dev": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.1", @@ -2863,6 +3699,15 @@ "node": ">=10.13.0" } }, + "node_modules/error-ex": { + "version": "1.3.4", + "resolved": "https://package-mirror.liara.ir/repository/npm/error-ex/-/error-ex-1.3.4.tgz", + "integrity": "sha512-sqQamAnR14VgCr1A618A3sGrygcpK+HEbenA/HiEAkkUwcZIIB/tgWqHFxWgOyDh4nB4JCRimh79dR5Ywc9MDQ==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, "node_modules/es-abstract": { "version": "1.24.2", "resolved": "https://package-mirror.liara.ir/repository/npm/es-abstract/-/es-abstract-1.24.2.tgz", @@ -2936,7 +3781,6 @@ "version": "1.0.1", "resolved": "https://package-mirror.liara.ir/repository/npm/es-define-property/-/es-define-property-1.0.1.tgz", "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -2946,7 +3790,6 @@ "version": "1.3.0", "resolved": "https://package-mirror.liara.ir/repository/npm/es-errors/-/es-errors-1.3.0.tgz", "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -2984,7 +3827,6 @@ "version": "1.1.1", "resolved": "https://package-mirror.liara.ir/repository/npm/es-object-atoms/-/es-object-atoms-1.1.1.tgz", "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0" @@ -2997,7 +3839,6 @@ "version": "2.1.0", "resolved": "https://package-mirror.liara.ir/repository/npm/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "dev": true, "license": "MIT", "dependencies": { "es-errors": "^1.3.0", @@ -3054,7 +3895,6 @@ "version": "4.0.0", "resolved": "https://package-mirror.liara.ir/repository/npm/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, "license": "MIT", "engines": { "node": ">=10" @@ -3543,6 +4383,12 @@ "node": ">=16.0.0" } }, + "node_modules/file-saver": { + "version": "2.0.5", + "resolved": "https://package-mirror.liara.ir/repository/npm/file-saver/-/file-saver-2.0.5.tgz", + "integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==", + "license": "MIT" + }, "node_modules/fill-range": { "version": "7.1.1", "resolved": "https://package-mirror.liara.ir/repository/npm/fill-range/-/fill-range-7.1.1.tgz", @@ -3556,6 +4402,12 @@ "node": ">=8" } }, + "node_modules/find-root": { + "version": "1.1.0", + "resolved": "https://package-mirror.liara.ir/repository/npm/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", + "license": "MIT" + }, "node_modules/find-up": { "version": "5.0.0", "resolved": "https://package-mirror.liara.ir/repository/npm/find-up/-/find-up-5.0.0.tgz", @@ -3594,6 +4446,26 @@ "dev": true, "license": "ISC" }, + "node_modules/follow-redirects": { + "version": "1.16.0", + "resolved": "https://package-mirror.liara.ir/repository/npm/follow-redirects/-/follow-redirects-1.16.0.tgz", + "integrity": "sha512-y5rN/uOsadFT/JfYwhxRS5R7Qce+g3zG97+JrtFZlC9klX/W5hD7iiLzScI4nZqUS7DNUdhPgw4xI8W2LuXlUw==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, "node_modules/for-each": { "version": "0.3.5", "resolved": "https://package-mirror.liara.ir/repository/npm/for-each/-/for-each-0.3.5.tgz", @@ -3610,11 +4482,35 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://package-mirror.liara.ir/repository/npm/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/frac": { + "version": "1.1.2", + "resolved": "https://package-mirror.liara.ir/repository/npm/frac/-/frac-1.1.2.tgz", + "integrity": "sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8" + } + }, "node_modules/function-bind": { "version": "1.1.2", "resolved": "https://package-mirror.liara.ir/repository/npm/function-bind/-/function-bind-1.1.2.tgz", "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -3675,7 +4571,6 @@ "version": "1.3.0", "resolved": "https://package-mirror.liara.ir/repository/npm/get-intrinsic/-/get-intrinsic-1.3.0.tgz", "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "dev": true, "license": "MIT", "dependencies": { "call-bind-apply-helpers": "^1.0.2", @@ -3700,7 +4595,6 @@ "version": "1.0.1", "resolved": "https://package-mirror.liara.ir/repository/npm/get-proto/-/get-proto-1.0.1.tgz", "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "dev": true, "license": "MIT", "dependencies": { "dunder-proto": "^1.0.1", @@ -3788,7 +4682,6 @@ "version": "1.2.0", "resolved": "https://package-mirror.liara.ir/repository/npm/gopd/-/gopd-1.2.0.tgz", "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -3860,7 +4753,6 @@ "version": "1.1.0", "resolved": "https://package-mirror.liara.ir/repository/npm/has-symbols/-/has-symbols-1.1.0.tgz", "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -3873,7 +4765,6 @@ "version": "1.0.2", "resolved": "https://package-mirror.liara.ir/repository/npm/has-tostringtag/-/has-tostringtag-1.0.2.tgz", "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "dev": true, "license": "MIT", "dependencies": { "has-symbols": "^1.0.3" @@ -3889,7 +4780,6 @@ "version": "2.0.3", "resolved": "https://package-mirror.liara.ir/repository/npm/hasown/-/hasown-2.0.3.tgz", "integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==", - "dev": true, "license": "MIT", "dependencies": { "function-bind": "^1.1.2" @@ -3915,6 +4805,28 @@ "hermes-estree": "0.25.1" } }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://package-mirror.liara.ir/repository/npm/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "license": "BSD-3-Clause", + "dependencies": { + "react-is": "^16.7.0" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.1", + "resolved": "https://package-mirror.liara.ir/repository/npm/https-proxy-agent/-/https-proxy-agent-5.0.1.tgz", + "integrity": "sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==", + "license": "MIT", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, "node_modules/ignore": { "version": "5.3.2", "resolved": "https://package-mirror.liara.ir/repository/npm/ignore/-/ignore-5.3.2.tgz", @@ -3929,7 +4841,6 @@ "version": "3.3.1", "resolved": "https://package-mirror.liara.ir/repository/npm/import-fresh/-/import-fresh-3.3.1.tgz", "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", - "dev": true, "license": "MIT", "dependencies": { "parent-module": "^1.0.0", @@ -3985,6 +4896,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://package-mirror.liara.ir/repository/npm/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "license": "MIT" + }, "node_modules/is-async-function": { "version": "2.1.1", "resolved": "https://package-mirror.liara.ir/repository/npm/is-async-function/-/is-async-function-2.1.1.tgz", @@ -4078,7 +4995,6 @@ "version": "2.16.2", "resolved": "https://package-mirror.liara.ir/repository/npm/is-core-module/-/is-core-module-2.16.2.tgz", "integrity": "sha512-evOr8xfXKxE6qSR0hSXL2r3sd7ALj8+7jQEUvPYcm5sgZFdJ+AYzT6yNmJenvIYQBgIGwfwz08sL8zoL7yq2BA==", - "dev": true, "license": "MIT", "dependencies": { "hasown": "^2.0.3" @@ -4428,7 +5344,6 @@ "version": "4.0.0", "resolved": "https://package-mirror.liara.ir/repository/npm/js-tokens/-/js-tokens-4.0.0.tgz", "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true, "license": "MIT" }, "node_modules/js-yaml": { @@ -4448,7 +5363,6 @@ "version": "3.1.0", "resolved": "https://package-mirror.liara.ir/repository/npm/jsesc/-/jsesc-3.1.0.tgz", "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "dev": true, "license": "MIT", "bin": { "jsesc": "bin/jsesc" @@ -4464,6 +5378,12 @@ "dev": true, "license": "MIT" }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://package-mirror.liara.ir/repository/npm/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "license": "MIT" + }, "node_modules/json-schema-traverse": { "version": "0.4.1", "resolved": "https://package-mirror.liara.ir/repository/npm/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", @@ -4812,6 +5732,12 @@ "url": "https://opencollective.com/parcel" } }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://package-mirror.liara.ir/repository/npm/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "license": "MIT" + }, "node_modules/locate-path": { "version": "6.0.0", "resolved": "https://package-mirror.liara.ir/repository/npm/locate-path/-/locate-path-6.0.0.tgz", @@ -4839,7 +5765,6 @@ "version": "1.4.0", "resolved": "https://package-mirror.liara.ir/repository/npm/loose-envify/-/loose-envify-1.4.0.tgz", "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", - "dev": true, "license": "MIT", "dependencies": { "js-tokens": "^3.0.0 || ^4.0.0" @@ -4872,7 +5797,6 @@ "version": "1.1.0", "resolved": "https://package-mirror.liara.ir/repository/npm/math-intrinsics/-/math-intrinsics-1.1.0.tgz", "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -4902,6 +5826,27 @@ "node": ">=8.6" } }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://package-mirror.liara.ir/repository/npm/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://package-mirror.liara.ir/repository/npm/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, "node_modules/minimatch": { "version": "3.1.5", "resolved": "https://package-mirror.liara.ir/repository/npm/minimatch/-/minimatch-3.1.5.tgz", @@ -4929,7 +5874,6 @@ "version": "2.1.3", "resolved": "https://package-mirror.liara.ir/repository/npm/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, "license": "MIT" }, "node_modules/nanoid": { @@ -5084,7 +6028,6 @@ "version": "4.1.1", "resolved": "https://package-mirror.liara.ir/repository/npm/object-assign/-/object-assign-4.1.1.tgz", "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -5275,7 +6218,6 @@ "version": "1.0.1", "resolved": "https://package-mirror.liara.ir/repository/npm/parent-module/-/parent-module-1.0.1.tgz", "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, "license": "MIT", "dependencies": { "callsites": "^3.0.0" @@ -5284,6 +6226,24 @@ "node": ">=6" } }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://package-mirror.liara.ir/repository/npm/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/path-exists": { "version": "4.0.0", "resolved": "https://package-mirror.liara.ir/repository/npm/path-exists/-/path-exists-4.0.0.tgz", @@ -5308,9 +6268,17 @@ "version": "1.0.7", "resolved": "https://package-mirror.liara.ir/repository/npm/path-parse/-/path-parse-1.0.7.tgz", "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true, "license": "MIT" }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://package-mirror.liara.ir/repository/npm/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://package-mirror.liara.ir/repository/npm/picocolors/-/picocolors-1.1.1.tgz", @@ -5383,7 +6351,6 @@ "version": "15.8.1", "resolved": "https://package-mirror.liara.ir/repository/npm/prop-types/-/prop-types-15.8.1.tgz", "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", - "dev": true, "license": "MIT", "dependencies": { "loose-envify": "^1.4.0", @@ -5391,6 +6358,15 @@ "react-is": "^16.13.1" } }, + "node_modules/proxy-from-env": { + "version": "2.1.0", + "resolved": "https://package-mirror.liara.ir/repository/npm/proxy-from-env/-/proxy-from-env-2.1.0.tgz", + "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, "node_modules/punycode": { "version": "2.3.1", "resolved": "https://package-mirror.liara.ir/repository/npm/punycode/-/punycode-2.3.1.tgz", @@ -5447,9 +6423,49 @@ "version": "16.13.1", "resolved": "https://package-mirror.liara.ir/repository/npm/react-is/-/react-is-16.13.1.tgz", "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", - "dev": true, "license": "MIT" }, + "node_modules/react-paginate": { + "version": "8.3.0", + "resolved": "https://package-mirror.liara.ir/repository/npm/react-paginate/-/react-paginate-8.3.0.tgz", + "integrity": "sha512-TptZE37HPkT3R+7AszWA++LOTIsIHXcCSWMP9WW/abeF8sLpJzExFB/dVs7xbtqteJ5njF6kk+udTDC0AR3y5w==", + "license": "MIT", + "dependencies": { + "prop-types": "^15" + }, + "peerDependencies": { + "react": "^16 || ^17 || ^18 || ^19" + } + }, + "node_modules/react-toastify": { + "version": "11.1.0", + "resolved": "https://package-mirror.liara.ir/repository/npm/react-toastify/-/react-toastify-11.1.0.tgz", + "integrity": "sha512-e9h23x3phN0wbFeB6yovmWp7lobzV4CaCH0LO8nVP6H7Y+3GbcLpIzMm9dJhcp1RXbpyfvjgpfXqO80QAmn7sg==", + "license": "MIT", + "dependencies": { + "clsx": "^2.1.1" + }, + "peerDependencies": { + "react": "^18 || ^19", + "react-dom": "^18 || ^19" + } + }, + "node_modules/react-transition-group": { + "version": "4.4.5", + "resolved": "https://package-mirror.liara.ir/repository/npm/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" + } + }, "node_modules/reflect.getprototypeof": { "version": "1.0.10", "resolved": "https://package-mirror.liara.ir/repository/npm/reflect.getprototypeof/-/reflect.getprototypeof-1.0.10.tgz", @@ -5494,6 +6510,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/reselect": { + "version": "5.2.0", + "resolved": "https://package-mirror.liara.ir/repository/npm/reselect/-/reselect-5.2.0.tgz", + "integrity": "sha512-AgZ3UOZm3YndfrJ4OYjgrT7bmCm/1iqkjvEfH/oYjzh6PD2qw4QuT3jjnXIrpdt4MTpMXclMT3lXbmRY+XRakw==", + "license": "MIT" + }, "node_modules/resolve": { "version": "2.0.0-next.7", "resolved": "https://package-mirror.liara.ir/repository/npm/resolve/-/resolve-2.0.0-next.7.tgz", @@ -5522,7 +6544,6 @@ "version": "4.0.0", "resolved": "https://package-mirror.liara.ir/repository/npm/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, "license": "MIT", "engines": { "node": ">=4" @@ -5850,6 +6871,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://package-mirror.liara.ir/repository/npm/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/source-map-js": { "version": "1.2.1", "resolved": "https://package-mirror.liara.ir/repository/npm/source-map-js/-/source-map-js-1.2.1.tgz", @@ -5859,6 +6889,18 @@ "node": ">=0.10.0" } }, + "node_modules/ssf": { + "version": "0.11.2", + "resolved": "https://package-mirror.liara.ir/repository/npm/ssf/-/ssf-0.11.2.tgz", + "integrity": "sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==", + "license": "Apache-2.0", + "dependencies": { + "frac": "~1.1.2" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/stable-hash": { "version": "0.0.5", "resolved": "https://package-mirror.liara.ir/repository/npm/stable-hash/-/stable-hash-0.0.5.tgz", @@ -6039,6 +7081,24 @@ } } }, + "node_modules/stylis": { + "version": "4.4.0", + "resolved": "https://package-mirror.liara.ir/repository/npm/stylis/-/stylis-4.4.0.tgz", + "integrity": "sha512-5Z9ZpRzfuH6l/UAvCPAPUo3665Nk2wLaZU3x+TLHKVzIz33+sbJqbtrYoC3KD4/uVOr2Zp+L0LySezP9OHV9yA==", + "license": "MIT" + }, + "node_modules/stylis-plugin-rtl": { + "version": "2.1.1", + "resolved": "https://package-mirror.liara.ir/repository/npm/stylis-plugin-rtl/-/stylis-plugin-rtl-2.1.1.tgz", + "integrity": "sha512-q6xIkri6fBufIO/sV55md2CbgS5c6gg9EhSVATtHHCdOnbN/jcI0u3lYhNVeuI65c4lQPo67g8xmq5jrREvzlg==", + "license": "MIT", + "dependencies": { + "cssjanus": "^2.0.1" + }, + "peerDependencies": { + "stylis": "4.x" + } + }, "node_modules/supports-color": { "version": "7.2.0", "resolved": "https://package-mirror.liara.ir/repository/npm/supports-color/-/supports-color-7.2.0.tgz", @@ -6056,7 +7116,6 @@ "version": "1.0.0", "resolved": "https://package-mirror.liara.ir/repository/npm/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, "license": "MIT", "engines": { "node": ">= 0.4" @@ -6423,6 +7482,15 @@ "punycode": "^2.1.0" } }, + "node_modules/use-sync-external-store": { + "version": "1.6.0", + "resolved": "https://package-mirror.liara.ir/repository/npm/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", + "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://package-mirror.liara.ir/repository/npm/which/-/which-2.0.2.tgz", @@ -6528,6 +7596,24 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/wmf": { + "version": "1.0.2", + "resolved": "https://package-mirror.liara.ir/repository/npm/wmf/-/wmf-1.0.2.tgz", + "integrity": "sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/word": { + "version": "0.3.0", + "resolved": "https://package-mirror.liara.ir/repository/npm/word/-/word-0.3.0.tgz", + "integrity": "sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA==", + "license": "Apache-2.0", + "engines": { + "node": ">=0.8" + } + }, "node_modules/word-wrap": { "version": "1.2.5", "resolved": "https://package-mirror.liara.ir/repository/npm/word-wrap/-/word-wrap-1.2.5.tgz", @@ -6538,6 +7624,27 @@ "node": ">=0.10.0" } }, + "node_modules/xlsx": { + "version": "0.18.5", + "resolved": "https://package-mirror.liara.ir/repository/npm/xlsx/-/xlsx-0.18.5.tgz", + "integrity": "sha512-dmg3LCjBPHZnQp5/F/+nnTa+miPJxUXB6vtk42YjBBKayDNagxGEeIdWApkYPOf3Z3pm3k62Knjzp7lMeTEtFQ==", + "license": "Apache-2.0", + "dependencies": { + "adler-32": "~1.3.0", + "cfb": "~1.2.1", + "codepage": "~1.15.0", + "crc-32": "~1.2.1", + "ssf": "~0.11.2", + "wmf": "~1.0.1", + "word": "~0.3.0" + }, + "bin": { + "xlsx": "bin/xlsx.njs" + }, + "engines": { + "node": ">=0.8" + } + }, "node_modules/yallist": { "version": "3.1.1", "resolved": "https://package-mirror.liara.ir/repository/npm/yallist/-/yallist-3.1.1.tgz", @@ -6545,6 +7652,15 @@ "dev": true, "license": "ISC" }, + "node_modules/yaml": { + "version": "1.10.3", + "resolved": "https://package-mirror.liara.ir/repository/npm/yaml/-/yaml-1.10.3.tgz", + "integrity": "sha512-vIYeF1u3CjlhAFekPPAk2h/Kv4T3mAkMox5OymRiJQB0spDP10LHvt+K7G9Ny6NuuMAb25/6n1qyUjAcGNf/AA==", + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, "node_modules/yocto-queue": { "version": "0.1.0", "resolved": "https://package-mirror.liara.ir/repository/npm/yocto-queue/-/yocto-queue-0.1.0.tgz", diff --git a/package.json b/package.json index ce3cfc0..c24be44 100644 --- a/package.json +++ b/package.json @@ -9,15 +9,33 @@ "lint": "eslint" }, "dependencies": { + "@emotion/react": "^11.14.0", + "@emotion/styled": "^11.14.1", + "@mui/icons-material": "^9.0.1", + "@mui/material": "^9.0.1", + "@mui/material-nextjs": "^9.0.1", + "@mui/x-date-pickers": "^9.3.0", + "@tanstack/react-query": "^5.100.11", + "axios": "^1.16.1", + "date-fns": "^4.3.0", + "date-fns-jalali": "^4.0.0-0", + "file-saver": "^2.0.5", "next": "16.2.6", "react": "19.2.4", - "react-dom": "19.2.4" + "react-dom": "19.2.4", + "react-paginate": "^8.3.0", + "react-toastify": "^11.1.0", + "stylis": "^4.4.0", + "stylis-plugin-rtl": "^2.1.1", + "xlsx": "^0.18.5" }, "devDependencies": { "@tailwindcss/postcss": "^4", + "@types/file-saver": "^2.0.7", "@types/node": "^20", "@types/react": "^19", "@types/react-dom": "^19", + "@types/stylis": "^4.2.7", "eslint": "^9", "eslint-config-next": "16.2.6", "tailwindcss": "^4", diff --git a/services/api/auth.api.ts b/services/api/auth.api.ts new file mode 100644 index 0000000..6fe4431 --- /dev/null +++ b/services/api/auth.api.ts @@ -0,0 +1,6 @@ +import callAPI from "../caller/config"; + +export async function loginUser(data: any) { + return await callAPI.post("/auth/login", data).then((res) => res.data); +} + diff --git a/services/api/department.api.ts b/services/api/department.api.ts new file mode 100644 index 0000000..8ca13aa --- /dev/null +++ b/services/api/department.api.ts @@ -0,0 +1,5 @@ +import callAPI from "../caller/config"; + +export async function getDepartments() { + return await callAPI.get("/department/all").then((res) => res.data); +} \ No newline at end of file diff --git a/services/api/report.api.ts b/services/api/report.api.ts new file mode 100644 index 0000000..1fdbd4f --- /dev/null +++ b/services/api/report.api.ts @@ -0,0 +1,53 @@ +import callAPI from "../caller/config"; + +export async function getStatsReport() { + return await callAPI.get("/report/stats").then((res) => res.data); +} + +export async function getDepartmentReport() { + return await callAPI.get("/report/departments").then((res) => res.data); +} + +export async function getAgentPerformance() { + return await callAPI.get("/report/agents").then((res) => res.data); +} + +export async function getAvgResolutionTime() { + return await callAPI.get("/report/avg-resolution").then((res) => res.data); +} + +export async function getCriticalTickets() { + return await callAPI.get("/report/critical").then((res) => res.data); +} + +export async function getTicketsTrend(params: any) { + return await callAPI.get("/report/trend", { params }).then((res) => res.data); +} + +export async function getClosureRate() { + return await callAPI.get("/report/closure-rate").then((res) => res.data); +} + +export async function getSlaBreach() { + return await callAPI.get("/report/sla").then((res) => res.data); +} + +export async function getAgingReport() { + return await callAPI.get("/report/aging").then((res) => res.data); +} + +export async function getAgentEfficiency() { + return await callAPI.get("/report/agent-efficiency").then((res) => res.data); +} + +export async function getDepartmentLoad() { + return await callAPI.get("/report/department-load").then((res) => res.data); +} + +export async function getKpiReport() { + return await callAPI.get("/report/kpi").then((res) => res.data); +} + +export async function getPredictionReport() { + return await callAPI.get("/report/prediction").then((res) => res.data); +} diff --git a/services/api/ticket.api.ts b/services/api/ticket.api.ts new file mode 100644 index 0000000..8453396 --- /dev/null +++ b/services/api/ticket.api.ts @@ -0,0 +1,17 @@ +import callAPI from "../caller/config"; + +export async function createTicket(data: any) { + return await callAPI.post("/ticket/create", data).then((res) => res.data); +} + +export async function getAllTickets(params: any) { + return await callAPI.get("/ticket/all", { params }).then((res) => res.data); +} + +export async function removeTicket(id: string) { + return await callAPI.delete(`/ticket/remove/${id}`).then((res) => res.data); +} + +export async function getAllTicketsExport(params: any) { + return await callAPI.get("/ticket/all/export", { params }).then((res) => res.data); +} \ No newline at end of file diff --git a/services/api/users.api.ts b/services/api/users.api.ts new file mode 100644 index 0000000..b63cc68 --- /dev/null +++ b/services/api/users.api.ts @@ -0,0 +1,5 @@ +import callAPI from "../caller/config"; + +export async function getUsers() { + return await callAPI.get("/user/all").then((res) => res.data); +} diff --git a/services/caller/config.ts b/services/caller/config.ts new file mode 100644 index 0000000..09469fb --- /dev/null +++ b/services/caller/config.ts @@ -0,0 +1,25 @@ +import axios from "axios"; + +const callAPISetting = axios.create({ + baseURL: "http://localhost:8000/api/v1", + withCredentials: true, +}); + +callAPISetting.interceptors.request.use( + (res) => res, + (err) => Promise.reject(err), +); + +callAPISetting.interceptors.response.use( + (res) => res, + async (err) => Promise.reject(err), +); + +const callAPI = { + post: callAPISetting.post, + get: callAPISetting.get, + put: callAPISetting.put, + delete: callAPISetting.delete, +}; + +export default callAPI; diff --git a/services/hooks/department.hook.ts b/services/hooks/department.hook.ts new file mode 100644 index 0000000..85f7f8f --- /dev/null +++ b/services/hooks/department.hook.ts @@ -0,0 +1,12 @@ +import { useQuery } from "@tanstack/react-query"; +import { getDepartments } from "../api/department.api"; + +export const useGetAllDepartments = () => { + return useQuery({ + // قرار دادن پارامترها در queryKey باعث می‌شود با تغییر هر کدام، کش باطل و درخواست جدید ارسال شود + queryKey: ['get-all-tickets'], + queryFn: () => getDepartments(), + retry: false, + refetchOnWindowFocus: false, + }); +}; diff --git a/services/hooks/report.hook.ts b/services/hooks/report.hook.ts new file mode 100644 index 0000000..0bd1d85 --- /dev/null +++ b/services/hooks/report.hook.ts @@ -0,0 +1,30 @@ +import { useMutation } from "@tanstack/react-query"; +import * as api from "../api/report.api"; + +// هوک‌های Mutation برای دریافت گزارش‌ها به صورت دستی (On-Demand) + +export const useMutateStatsReport = () => useMutation({ mutationFn: api.getStatsReport }); + +export const useMutateDepartmentReport = () => useMutation({ mutationFn: api.getDepartmentReport }); + +export const useMutateAgentPerformance = () => useMutation({ mutationFn: api.getAgentPerformance }); + +export const useMutateAvgResolutionTime = () => useMutation({ mutationFn: api.getAvgResolutionTime }); + +export const useMutateCriticalTickets = () => useMutation({ mutationFn: api.getCriticalTickets }); + +export const useMutateTicketsTrend = () => useMutation({ mutationFn: (params: any) => api.getTicketsTrend(params) }); + +export const useMutateClosureRate = () => useMutation({ mutationFn: api.getClosureRate }); + +export const useMutateSlaBreach = () => useMutation({ mutationFn: api.getSlaBreach }); + +export const useMutateAgingReport = () => useMutation({ mutationFn: api.getAgingReport }); + +export const useMutateAgentEfficiency = () => useMutation({ mutationFn: api.getAgentEfficiency }); + +export const useMutateDepartmentLoad = () => useMutation({ mutationFn: api.getDepartmentLoad }); + +export const useMutateKpiReport = () => useMutation({ mutationFn: api.getKpiReport }); + +export const useMutatePredictionReport = () => useMutation({ mutationFn: api.getPredictionReport }); diff --git a/services/hooks/ticket.hook.ts b/services/hooks/ticket.hook.ts new file mode 100644 index 0000000..b708bd6 --- /dev/null +++ b/services/hooks/ticket.hook.ts @@ -0,0 +1,20 @@ +import { useMutation, useQuery } from "@tanstack/react-query"; +import { getAllTickets, getAllTicketsExport, removeTicket } from "../api/ticket.api"; + +export const useGetAllTickets = (params: { + page: number; + departmentId?: string; + priority?: string; + status?: string; +}) => { + return useQuery({ + // قرار دادن پارامترها در queryKey باعث می‌شود با تغییر هر کدام، کش باطل و درخواست جدید ارسال شود + queryKey: ["get-all-tickets", params], + queryFn: () => getAllTickets(params), + retry: false, + refetchOnWindowFocus: false, + }); +}; + +export const useRemoveTicket = () => useMutation({mutationFn:removeTicket}) +export const useGetAllTicketsExport = () => useMutation({mutationFn:getAllTicketsExport}) \ No newline at end of file diff --git a/services/hooks/users.hook.ts b/services/hooks/users.hook.ts new file mode 100644 index 0000000..6ea918b --- /dev/null +++ b/services/hooks/users.hook.ts @@ -0,0 +1,8 @@ +import { useQuery } from "@tanstack/react-query"; +import { getUsers } from "../api/users.api"; + +export const useGetAllUsers = () => + useQuery({ + queryKey: ["get-all-users"], + queryFn: getUsers, + }); diff --git a/tailwind.config.ts b/tailwind.config.ts new file mode 100644 index 0000000..df7e43b --- /dev/null +++ b/tailwind.config.ts @@ -0,0 +1,16 @@ +// tailwind.config.ts +export default { + theme: { + extend: { + animation: { + blink: 'blink 1.5s infinite', + }, + keyframes: { + blink: { + '0%, 100%': { opacity: '1' }, + '50%': { opacity: '0.4' }, + }, + }, + }, + }, +} diff --git a/ui/DateFilter.tsx b/ui/DateFilter.tsx new file mode 100644 index 0000000..deb9d8c --- /dev/null +++ b/ui/DateFilter.tsx @@ -0,0 +1,32 @@ +import { DatePicker } from "@mui/x-date-pickers/DatePicker"; +import { TextField, Box } from "@mui/material"; + +const DateFilters = ({ + startDate, + setStartDate, + endDate, + setEndDate, +}: { + startDate: any; + setStartDate: any; + endDate: any; + setEndDate: any; +}) => { + return ( + + setStartDate(newValue)} + slotProps={{ textField: { fullWidth: true } }} + /> + setEndDate(newValue)} + slotProps={{ textField: { fullWidth: true } }} + /> + + ); +}; +export default DateFilters; diff --git a/ui/DeleteConfirmModal.tsx b/ui/DeleteConfirmModal.tsx new file mode 100644 index 0000000..0ee6df7 --- /dev/null +++ b/ui/DeleteConfirmModal.tsx @@ -0,0 +1,80 @@ +"use client"; + +import { + Dialog, + DialogTitle, + DialogContent, + DialogActions, + Button, + Typography, + IconButton, +} from "@mui/material"; +import WarningAmberIcon from "@mui/icons-material/WarningAmber"; +import CloseIcon from "@mui/icons-material/Close"; + +export default function DeleteConfirmModal({ + open, + onClose, + onConfirm, + title = "آیا از حذف این مورد مطمئن هستید؟", + description = "بعد از حذف، امکان بازگردانی وجود ندارد.", +}: { + open: boolean; + onClose: () => void; + onConfirm: () => void; + title?: string; + description?: string; +}) { + return ( + + + تأیید حذف + + + + + + + + + + {title} + + + + {description} + + + + + + + + + + ); +} diff --git a/ui/ReactQueryProvider.tsx b/ui/ReactQueryProvider.tsx new file mode 100644 index 0000000..8bfc38d --- /dev/null +++ b/ui/ReactQueryProvider.tsx @@ -0,0 +1,30 @@ +"use client"; + +import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; +import { useState } from "react"; + +export default function ReactQueryProvider({ + children, +}: { + children: React.ReactNode; +}) { + const [queryClient] = useState( + () => + new QueryClient({ + defaultOptions: { + queries: { + staleTime: 1000 * 60, + retry: 1, + refetchOnWindowFocus: false, + }, + mutations: { + retry: 1, + }, + }, + }), + ); + + return ( + {children} + ); +} diff --git a/ui/SearchBox.tsx b/ui/SearchBox.tsx new file mode 100644 index 0000000..d5b0a24 --- /dev/null +++ b/ui/SearchBox.tsx @@ -0,0 +1,31 @@ +import { ChangeEventHandler } from 'react'; +import { TextField } from '@mui/material'; + +const SearchBox = ({ placeholder, onChange }:{placeholder:string,onChange:ChangeEventHandler}) => { + return ( + + ); +}; + +export default SearchBox; diff --git a/ui/Test.tsx b/ui/Test.tsx new file mode 100644 index 0000000..981e6f8 --- /dev/null +++ b/ui/Test.tsx @@ -0,0 +1,83 @@ +import { + Box, + Card, + CardContent, + Typography, + Button, + Stack, +} from "@mui/material"; +import VisibilityIcon from "@mui/icons-material/Visibility"; +import FileDownloadIcon from "@mui/icons-material/FileDownload"; + +const DataCategories = () => { + // لیست کارت‌ها (میتوانید این را از دیتابیس بگیرید) + const categories = [ + { id: 1, title: "آماركلي" }, + { id: 2, title: "تیکت‌های در انتظار" }, + { id: 3, title: "تيكت هاي بحراني" }, + { id: 4, title: "گزارش‌های ماهانه" }, + { id: 5, title: "گزارش‌های ماهانه" }, + { id: 6, title: "گزارش‌های ماهانه" }, + { id: 7, title: "گزارش‌های ماهانه" }, + { id: 8, title: "گزارش‌های ماهانه" }, + { id: 9, title: "گزارش‌های ماهانه" }, + { id: 10, title: "گزارش‌های ماهانه" }, + { id: 11, title: "گزارش‌های ماهانه" }, + { id: 12, title: "گزارش‌های ماهانه" }, + { id: 13, title: "گزارش‌های ماهانه" }, + ]; + + return ( + + {categories.map((item) => ( + + + + {item.title} + + + + + {/* */} + + + + ))} + + ); +}; + +export default DataCategories; diff --git a/ui/TicketDetailModel.tsx b/ui/TicketDetailModel.tsx new file mode 100644 index 0000000..cf32660 --- /dev/null +++ b/ui/TicketDetailModel.tsx @@ -0,0 +1,115 @@ +"use client"; + +import { + Dialog, + DialogTitle, + DialogContent, + IconButton, + Typography, + Chip, + Divider, +} from "@mui/material"; +import CloseIcon from "@mui/icons-material/Close"; +import { ticketPriorities, ticketStatuses } from "@/core/constant"; +import { TicketInterface } from "@/core/types"; + +export default function TicketDetailModal({ + open, + onClose, + ticket, +}: { + open: boolean; + onClose: () => void; + ticket: TicketInterface | null; +}) { + if (!ticket) return null; + const status = ticketStatuses.find((p) => p.id === ticket?.status); + const priority = ticketPriorities.find((p) => p.id === ticket?.priority); + return ( + + + جزئیات تیکت #{ticket.id.slice(-6)} + + + + + + +
+
+ + واحد / بخش + + + {ticket.department?.displayName} + +
+
+ + كاربر + + + {ticket.createdBy} + +
+
+ + ارجاع به + + + {ticket.assignee.fullname} + +
+
+
+ + وضعیت + + +
+
+ + اولویت + + +
+
+ + محل وقوع مشكل + + +
+
+ + + +
+ + توضیحات + + + {ticket.description || "توضیحی ثبت نشده است."} + +
+
+ + اقدام كارشناس + + + {ticket.helpdeskAction || "توضیحی ثبت نشده است."} + +
+
+
+
+ ); +} diff --git a/ui/form/LoginForm.tsx b/ui/form/LoginForm.tsx new file mode 100644 index 0000000..0a20879 --- /dev/null +++ b/ui/form/LoginForm.tsx @@ -0,0 +1,158 @@ +"use client"; + +import { useState } from "react"; +import { Box, Button, TextField, Paper } from "@mui/material"; +import { handleAxiosError } from "@/core/utils"; +import { toast } from "react-toastify"; +import { useRouter } from "next/navigation"; +import { loginUser } from "@/services/api/auth.api"; + +export default function LoginForm() { + const [showPassword, setShowPassword] = useState(false); + const router = useRouter(); + const [form, setForm] = useState({ + username: "", + password: "", + }); + + const handleChange = (e: React.ChangeEvent) => { + setForm({ + ...form, + [e.target.name]: e.target.value, + }); + }; + + const handleSubmit = async (e: React.FormEvent) => { + e.preventDefault(); + try { + const { message } = await loginUser(form); + toast.success(message); + router.push("/"); + } catch (error) { + toast.error(handleAxiosError(error)); + } + }; + + return ( + + +
+ ورود به سيستم ثبت تيكت ها +
+ +
+ + // + // + // ), + // }} + sx={{ + mb: 2, + "& .MuiOutlinedInput-root": { + borderRadius: 3, + background: "#f9fbff", + "& fieldset": { + borderColor: "#dbeafe", + }, + "&:hover fieldset": { + borderColor: "#90caf9", + }, + "&.Mui-focused fieldset": { + borderColor: "#1976d2", + borderWidth: "2px", + }, + }, + }} + /> + + + // + // + // ), + // endAdornment: ( + // + // setShowPassword(!showPassword)}> + // {showPassword ? : } + // + // + // ), + // }} + sx={{ + mb: 3, + "& .MuiOutlinedInput-root": { + borderRadius: 3, + background: "#f9fbff", + "& fieldset": { + borderColor: "#dbeafe", + }, + "&:hover fieldset": { + borderColor: "#90caf9", + }, + "&.Mui-focused fieldset": { + borderColor: "#1976d2", + borderWidth: "2px", + }, + }, + }} + /> + + + +
+
+ ); +} diff --git a/ui/form/TicketForm.tsx b/ui/form/TicketForm.tsx new file mode 100644 index 0000000..a484aad --- /dev/null +++ b/ui/form/TicketForm.tsx @@ -0,0 +1,268 @@ +"use client"; + +import { useEffect, useState } from "react"; +import { + Box, + Paper, + Typography, + TextField, + MenuItem, + Button, + Grid, +} from "@mui/material"; +import { + hospitalSoftwares, + requestType, + ticketPriorities, + ticketStatuses, +} from "@/core/constant"; +import { toast } from "react-toastify"; +import { handleAxiosError } from "@/core/utils"; +import { createTicket } from "@/services/api/ticket.api"; +interface DepartmentType { + id: string; + slug: string; + displayName: string; +} +export interface IUserListItem { + id: string; + fullname: string; + nationalCode: string; + mobile: string; + roleId: string; + createdAt: Date; + updatedAt: Date; +} + +export default function TicketForm({ + departments, + users, +}: { + departments: DepartmentType[]; + users: IUserListItem[]; +}) { + const [showFieldRelatedSystem, setShowFieldRelatedSystem] = useState(false); + const [form, setForm] = useState({ + createdBy: "", + departmentId: "", + internalPhone: "", + requestType: "", + priority: "medium", + description: "", + relatedSystem: "", + location: "", + helpdeskAction: "", + assignedTo: "", + status: "open", + finalNotes: "", + }); + + const handleChange = (e: any) => { + setForm({ + ...form, + [e.target.name]: e.target.value, + }); + }; + + const handleSubmit = async (e: any) => { + e.preventDefault(); + + try { + const { message } = await createTicket(form); + toast.success(message); + } catch (error) { + toast.error(handleAxiosError(error)); + } + }; + + useEffect(() => { + if (form.requestType === "1") { + form.relatedSystem = ""; + setShowFieldRelatedSystem(true); + } else { + form.relatedSystem = ""; + setShowFieldRelatedSystem(false); + } + }, [form.requestType]); + return ( +
+
+
فرم تيكت
+ +
+
+
+ + + {departments.map((dep) => ( + + {dep.displayName} + + ))} + + +
+ +
+ + {requestType.map((dep) => ( + + {dep.displayName} + + ))} + + {showFieldRelatedSystem && ( + + {hospitalSoftwares.map((item) => ( + {item.displayName} + ))} + + )} + +
+ +
+ + +
+ +
+ + {users.map((dep) => ( + + {dep.fullname} + + ))} + + + {ticketPriorities?.map((p: any) => ( + + {p.displayName} + + ))} + + + {ticketStatuses?.map((p: any) => ( + + {p.displayName} + + ))} + + +
+ +
+ +
+ + +
+
+
+
+ ); +} diff --git a/ui/layout/Sidebar.tsx b/ui/layout/Sidebar.tsx new file mode 100644 index 0000000..6b2e046 --- /dev/null +++ b/ui/layout/Sidebar.tsx @@ -0,0 +1,82 @@ +import { Apartment, Dashboard, Logout, Notes, Person, PictureInPicture, ShowChart } from "@mui/icons-material"; +import { Button } from "@mui/material"; +import Link from "next/link"; +import React from "react"; + +export default function Sidebar() { + return ( + <> +
+ {/* + + + + داشبورد + */} + + + + + ثبت تيكت + + + + + + مشاهده تيكت ها + + {/* + + + + مديريت واحد ها + + + + + + مديريت كاربران + */} + + + + + گزارش گيري + + +
+ + ); +}