From 88dc5470d909c513c0c1aec9c3dfa94ae9dc9c0f Mon Sep 17 00:00:00 2001 From: Samandar Turgunboyev Date: Mon, 26 Jan 2026 16:40:07 +0500 Subject: [PATCH] task update --- src/features/doctors/lib/api.ts | 7 +++ src/features/doctors/ui/FilterDoctor.tsx | 56 ++++++++++++++++++- src/features/pharmacies/lib/api.ts | 7 +++ src/features/pharmacies/lib/data.ts | 8 +-- src/features/pharmacies/lib/form.ts | 4 +- .../pharmacies/ui/AddedPharmacies.tsx | 41 ++++++-------- .../pharmacies/ui/PharmaciesFilter.tsx | 54 +++++++++++++++++- src/features/plans/lib/data.ts | 4 +- src/features/plans/lib/form.ts | 2 +- src/features/plans/ui/AddedPlan.tsx | 11 ++-- src/shared/config/api/URLs.ts | 2 + src/widgets/sidebar-layout/index.tsx | 11 ++-- vite.config.ts | 4 ++ 13 files changed, 165 insertions(+), 46 deletions(-) diff --git a/src/features/doctors/lib/api.ts b/src/features/doctors/lib/api.ts index ca4803c..93eaa31 100644 --- a/src/features/doctors/lib/api.ts +++ b/src/features/doctors/lib/api.ts @@ -37,4 +37,11 @@ export const doctor_api = { const res = await httpClient.delete(`${API_URLS.DOCTOR}${id}/delete/`); return res; }, + + async export() { + const res = await httpClient.get(`${API_URLS.DOCTOR_EXPORT}`, { + responseType: "blob", + }); + return res; + }, }; diff --git a/src/features/doctors/ui/FilterDoctor.tsx b/src/features/doctors/ui/FilterDoctor.tsx index 51d91d0..8234a6f 100644 --- a/src/features/doctors/ui/FilterDoctor.tsx +++ b/src/features/doctors/ui/FilterDoctor.tsx @@ -1,3 +1,4 @@ +import { doctor_api } from "@/features/doctors/lib/api"; import type { DoctorListResData } from "@/features/doctors/lib/data"; import AddedDoctor from "@/features/doctors/ui/AddedDoctor"; import { Button } from "@/shared/ui/button"; @@ -9,8 +10,11 @@ import { DialogTrigger, } from "@/shared/ui/dialog"; import { Input } from "@/shared/ui/input"; -import { Plus } from "lucide-react"; +import { useMutation } from "@tanstack/react-query"; +import type { AxiosError } from "axios"; +import { CloudDownload, Loader2, Plus } from "lucide-react"; import type { Dispatch, SetStateAction } from "react"; +import { toast } from "sonner"; interface Props { searchName: string; @@ -49,6 +53,45 @@ const FilterDoctor = ({ setEditingPlan, editingPlan, }: Props) => { + const { mutate, isPending } = useMutation({ + mutationFn: async () => { + const res = await doctor_api.export(); + return res.data; + }, + onSuccess: (data: Blob) => { + // Blob URL yaratish + const url = window.URL.createObjectURL( + new Blob([data], { + type: "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", + }), + ); + + // elementi orqali yuklab olish + const link = document.createElement("a"); + link.href = url; + link.setAttribute("download", "doctor_export.xlsx"); // Fayl nomi + document.body.appendChild(link); + link.click(); + link.remove(); + + // Blob URL-ni ozod qilish + window.URL.revokeObjectURL(url); + + toast.success("Excel muvaffaqiyatli yuklab olindi", { + position: "top-center", + richColors: true, + }); + }, + onError: (err: AxiosError) => { + const errMessage = err.response?.data as { message: string }; + const messageText = errMessage.message; + + toast.error(messageText || "Xatolik yuz berdi", { + richColors: true, + position: "top-center", + }); + }, + }); return (
setSearchUser(e.target.value)} className="w-full md:w-48" /> + + +