From 17b833dd88107f027a5760308c6e375e4a795cf7 Mon Sep 17 00:00:00 2001 From: Samandar Turgunboyev Date: Fri, 5 Dec 2025 17:49:55 +0500 Subject: [PATCH] update api request and response --- src/features/distributed/lib/api.ts | 17 ++ src/features/distributed/lib/data.ts | 29 ++ .../distributed/ui/DistributedList.tsx | 199 +++++++++++++ .../distributed/ui/SpecificationDetail .tsx | 92 ++++++ src/features/doctors/lib/api.ts | 1 + src/features/doctors/ui/AddedDoctor.tsx | 7 +- src/features/objects/lib/api.ts | 1 + src/features/pharmacies/lib/api.ts | 1 + .../pharmacies/ui/AddedPharmacies.tsx | 7 +- src/features/plans/lib/data.ts | 25 +- src/features/plans/lib/form.ts | 6 + src/features/plans/ui/AddedPlan.tsx | 281 +++++++++++++++++- src/features/plans/ui/PalanTable.tsx | 20 +- src/features/plans/ui/PlanDetail.tsx | 84 +++++- src/features/support/lib/api.ts | 18 ++ src/features/support/lib/data.ts | 27 ++ src/features/support/ui/SupportDetail.tsx | 70 +++++ src/features/support/ui/SupportList.tsx | 225 ++++++++++++++ src/pages/Distributed.tsx | 12 + src/pages/Support.tsx | 12 + src/providers/routing/AppRoutes.tsx | 10 + src/shared/config/api/URLs.ts | 36 ++- src/widgets/sidebar-layout/index.tsx | 11 + 23 files changed, 1155 insertions(+), 36 deletions(-) create mode 100644 src/features/distributed/lib/api.ts create mode 100644 src/features/distributed/lib/data.ts create mode 100644 src/features/distributed/ui/DistributedList.tsx create mode 100644 src/features/distributed/ui/SpecificationDetail .tsx create mode 100644 src/features/support/lib/api.ts create mode 100644 src/features/support/lib/data.ts create mode 100644 src/features/support/ui/SupportDetail.tsx create mode 100644 src/features/support/ui/SupportList.tsx create mode 100644 src/pages/Distributed.tsx create mode 100644 src/pages/Support.tsx diff --git a/src/features/distributed/lib/api.ts b/src/features/distributed/lib/api.ts new file mode 100644 index 0000000..5ea5ffd --- /dev/null +++ b/src/features/distributed/lib/api.ts @@ -0,0 +1,17 @@ +import type { DistributedList } from "@/features/distributed/lib/data"; +import httpClient from "@/shared/config/api/httpClient"; +import { API_URLS } from "@/shared/config/api/URLs"; +import type { AxiosResponse } from "axios"; + +export const distributed_api = { + async list(params: { + limit?: number; + offset?: number; + product?: string; + user?: string; + date?: string; + }): Promise> { + const res = await httpClient.get(API_URLS.DISTRIBUTED, { params }); + return res; + }, +}; diff --git a/src/features/distributed/lib/data.ts b/src/features/distributed/lib/data.ts new file mode 100644 index 0000000..f02ec2f --- /dev/null +++ b/src/features/distributed/lib/data.ts @@ -0,0 +1,29 @@ +export interface DistributedList { + status_code: number; + status: string; + message: string; + data: { + count: number; + next: null | string; + previous: null | string; + results: DistributedListData[]; + }; +} + +export interface DistributedListData { + id: number; + product: { + id: number; + name: string; + price: number; + }; + quantity: number; + employee_name: string; + user: { + id: number; + first_name: string; + last_name: string; + }; + created_at: string; + date: string; +} diff --git a/src/features/distributed/ui/DistributedList.tsx b/src/features/distributed/ui/DistributedList.tsx new file mode 100644 index 0000000..32f2d35 --- /dev/null +++ b/src/features/distributed/ui/DistributedList.tsx @@ -0,0 +1,199 @@ +import { distributed_api } from "@/features/distributed/lib/api"; +import type { DistributedListData } from "@/features/distributed/lib/data"; +import { DistributedDetail } from "@/features/distributed/ui/SpecificationDetail "; +import formatDate from "@/shared/lib/formatDate"; +import { Button } from "@/shared/ui/button"; +import { Calendar } from "@/shared/ui/calendar"; +import { Input } from "@/shared/ui/input"; +import Pagination from "@/shared/ui/pagination"; +import { Popover, PopoverContent, PopoverTrigger } from "@/shared/ui/popover"; +import { + Table, + TableBody, + TableCell, + TableHead, + TableHeader, + TableRow, +} from "@/shared/ui/table"; +import { useQuery } from "@tanstack/react-query"; +import { ChevronDownIcon, Eye, Loader2 } from "lucide-react"; +import { useState } from "react"; + +const DistributedList = () => { + const [currentPage, setCurrentPage] = useState(1); + const [nameFilter, setNameFilter] = useState(""); + const limit = 20; + const [disctritFilter, setDisctritFilter] = useState(""); + const [openDate, setOpenDate] = useState(false); + const [dateFilter, setDateFilter] = useState(undefined); + const [open, setOpen] = useState(false); + const [supportDetail, setSupportDetail] = + useState(null); + + const { data, isLoading, isError } = useQuery({ + queryKey: [ + "distributed_list", + currentPage, + nameFilter, + disctritFilter, + dateFilter, + ], + queryFn: () => + distributed_api.list({ + limit, + offset: (currentPage - 1) * limit, + product: nameFilter, + user: disctritFilter, + date: dateFilter && formatDate.format(dateFilter, "YYYY-MM-DD"), + }), + select(data) { + return data.data.data; + }, + }); + + const totalPages = data ? Math.ceil(data?.count / limit) : 1; + + return ( +
+
+

Yordam so'rovlari ro'yxati

+ +
+ setDisctritFilter(e.target.value)} + /> + setNameFilter(e.target.value)} + /> + + + + + + + { + setDateFilter(date); + setOpenDate(false); + }} + /> +
+ +
+
+
+
+
+
+ {isLoading && ( +
+ + + +
+ )} + + {isError && ( +
+ + Ma'lumotlarni olishda xatolik yuz berdi. + +
+ )} + {!isLoading && !isError && ( + + + + ID + Kim qo'shgan + Xaridorning ismi + Mahsulot nomi + Nechta berilgan + Topshirilgan sana + Amallar + + + + {data && data.results.length > 0 ? ( + data?.results.map((plan) => ( + + {plan.id} + + {plan.user.first_name} {plan.user.last_name} + + {plan.employee_name} + {plan.product.name} + {plan.quantity} + + {formatDate.format(plan.date, "YYYY-MM-DD")} + + + + + + )) + ) : ( + + + Farmasevtika topilmadi. + + + )} + +
+ )} +
+ + + +
+ ); +}; + +export default DistributedList; diff --git a/src/features/distributed/ui/SpecificationDetail .tsx b/src/features/distributed/ui/SpecificationDetail .tsx new file mode 100644 index 0000000..1c10fe7 --- /dev/null +++ b/src/features/distributed/ui/SpecificationDetail .tsx @@ -0,0 +1,92 @@ +"use client"; + +import type { DistributedListData } from "@/features/distributed/lib/data"; +import { + Dialog, + DialogContent, + DialogHeader, + DialogTitle, +} from "@/shared/ui/dialog"; +import type { Dispatch, SetStateAction } from "react"; + +interface Props { + specification: DistributedListData | null; + open: boolean; + setOpen: Dispatch>; +} + +export const DistributedDetail = ({ specification, open, setOpen }: Props) => { + if (!specification) return null; + + return ( + + + + + Tafsilot + + + +
+ {/* Asosiy ma'lumotlar - Grid */} +
+ {/* Xaridor */} +
+

+ Xaridorning ismi +

+

+ {specification.employee_name} +

+
+ + {/* Foydalanuvchi */} +
+

+ Mas'ul xodim +

+

+ {specification.user.first_name} {specification.user.last_name} +

+
+ +
+

+ Topshirilgan sanasi +

+

+ {specification.date} +

+
+
+ + {/* Dorilar ro'yxati */} +
+

+ Topshirilgan dori +

+ +
+
+
+
+
+

+ {specification.product.name} +

+
+
+ + Miqdor: {specification.quantity} ta + +
+
+
+
+
+
+
+
+
+ ); +}; diff --git a/src/features/doctors/lib/api.ts b/src/features/doctors/lib/api.ts index e980426..ca4803c 100644 --- a/src/features/doctors/lib/api.ts +++ b/src/features/doctors/lib/api.ts @@ -17,6 +17,7 @@ export const doctor_api = { work_place?: string; sphere?: string; user?: string; + user_id?: number; }): Promise> { const res = await httpClient.get(`${API_URLS.DOCTOR}list/`, { params }); return res; diff --git a/src/features/doctors/ui/AddedDoctor.tsx b/src/features/doctors/ui/AddedDoctor.tsx index 11405c7..e7143cb 100644 --- a/src/features/doctors/ui/AddedDoctor.tsx +++ b/src/features/doctors/ui/AddedDoctor.tsx @@ -106,16 +106,19 @@ const AddedDoctor = ({ initialValues, setDialogOpen }: Props) => { return data.data.data; }, }); + const user_id = form.watch("user"); const { data: object, isLoading: isObjectLoading } = useQuery({ - queryKey: ["object_list", searchUser, selectDiscrit], + queryKey: ["object_list", searchUser, selectDiscrit, user_id], queryFn: () => { const params: { name?: string; district?: string; + user_id?: number; } = { name: searchUser, district: selectDiscrit, + user_id: Number(user_id), }; return object_api.list(params); @@ -125,8 +128,6 @@ const AddedDoctor = ({ initialValues, setDialogOpen }: Props) => { }, }); - const user_id = form.watch("user"); - const { data: discrit, isLoading: discritLoading } = useQuery({ queryKey: ["discrit_list", searchDiscrit, user_id], queryFn: () => { diff --git a/src/features/objects/lib/api.ts b/src/features/objects/lib/api.ts index 9f96669..90df6ca 100644 --- a/src/features/objects/lib/api.ts +++ b/src/features/objects/lib/api.ts @@ -14,6 +14,7 @@ export const object_api = { name?: string; district?: string; user?: string; + user_id?: number; }): Promise> { const res = await httpClient.get(`${API_URLS.OBJECT}list/`, { params }); return res; diff --git a/src/features/pharmacies/lib/api.ts b/src/features/pharmacies/lib/api.ts index 79de765..77af247 100644 --- a/src/features/pharmacies/lib/api.ts +++ b/src/features/pharmacies/lib/api.ts @@ -15,6 +15,7 @@ export const pharmacies_api = { place?: string; district?: string; user?: string; + user_id?: number; }): Promise> { const res = await httpClient.get(`${API_URLS.PHARMACIES}list/`, { params }); return res; diff --git a/src/features/pharmacies/ui/AddedPharmacies.tsx b/src/features/pharmacies/ui/AddedPharmacies.tsx index 52a12fc..01ddf85 100644 --- a/src/features/pharmacies/ui/AddedPharmacies.tsx +++ b/src/features/pharmacies/ui/AddedPharmacies.tsx @@ -102,16 +102,19 @@ const AddedPharmacies = ({ initialValues, setDialogOpen }: Props) => { return data.data.data; }, }); + const user_id = form.watch("user"); const { data: object, isLoading: isObjectLoading } = useQuery({ - queryKey: ["object_list", searchUser, selectDiscrit], + queryKey: ["object_list", searchUser, selectDiscrit, user_id], queryFn: () => { const params: { name?: string; district?: string; + user_id?: number; } = { name: searchUser, district: selectDiscrit, + user_id: Number(user_id), }; return object_api.list(params); @@ -121,8 +124,6 @@ const AddedPharmacies = ({ initialValues, setDialogOpen }: Props) => { }, }); - const user_id = form.watch("user"); - const { data: discrit, isLoading: discritLoading } = useQuery({ queryKey: ["discrit_list", searchDiscrit, user_id], queryFn: () => { diff --git a/src/features/plans/lib/data.ts b/src/features/plans/lib/data.ts index 1f8ac74..cd6837c 100644 --- a/src/features/plans/lib/data.ts +++ b/src/features/plans/lib/data.ts @@ -26,12 +26,27 @@ export interface PlanListData { title: string; description: string; date: string; + comment: null | string; + doctor: { + id: number; + first_name: string; + last_name: string; + } | null; + pharmacy: { + id: number; + name: string; + } | null; user: { id: number; first_name: string; last_name: string; }; - is_done: true; + longitude: number; + latitude: number; + extra_location: { + latitude: number; + longitude: number; + }; created_at: string; } @@ -40,10 +55,18 @@ export interface PlanCreateReq { description: string; date: string; user_id: number; + doctor_id: number | null; + pharmacy_id: number | null; + longitude: number; + latitude: number; + extra_location: { longitude: number; latitude: number }; } export interface PlanUpdateReq { title: string; description: string; date: string; + longitude: number; + latitude: number; + extra_location: { longitude: number; latitude: number }; } diff --git a/src/features/plans/lib/form.ts b/src/features/plans/lib/form.ts index 48c38ef..96fbb97 100644 --- a/src/features/plans/lib/form.ts +++ b/src/features/plans/lib/form.ts @@ -5,4 +5,10 @@ export const createPlanFormData = z.object({ description: z.string().min(1, { message: "Majburiy maydon" }), user: z.string().min(1, { message: "Majburiy maydon" }), date: z.string().min(1, { message: "Majburiy maydon" }), + doctor_id: z.string().optional(), + pharmacy_id: z.string().optional(), }); + +// longitude: number; +// latitude: number; +// extra_location: { longitude: number; latitude: number }; diff --git a/src/features/plans/ui/AddedPlan.tsx b/src/features/plans/ui/AddedPlan.tsx index 4ce1008..b84ad9e 100644 --- a/src/features/plans/ui/AddedPlan.tsx +++ b/src/features/plans/ui/AddedPlan.tsx @@ -1,3 +1,5 @@ +import { doctor_api } from "@/features/doctors/lib/api"; +import { pharmacies_api } from "@/features/pharmacies/lib/api"; import { plans_api } from "@/features/plans/lib/api"; import type { PlanCreateReq, @@ -53,8 +55,16 @@ const AddedPlan = ({ initialValues, setDialogOpen }: Props) => { date: initialValues ? initialValues?.date : "", }, }); + + const [type, setType] = useState<"DOCTOR" | "PHARM">("DOCTOR"); + const [long, setLong] = useState(41.233); + const [lat, setLat] = useState(63.233); const [searchUser, setSearchUser] = useState(""); const [openUser, setOpenUser] = useState(false); + const [searchDoctor, setSearchDoctor] = useState(""); + const [openDoctor, setOpenDoctor] = useState(false); + const [searchPharm, setSearchPharm] = useState(""); + const [openPharm, setOpenPharm] = useState(false); const queryClient = useQueryClient(); const [open, setOpen] = useState(false); @@ -79,6 +89,50 @@ const AddedPlan = ({ initialValues, setDialogOpen }: Props) => { }, }); + const user_id = form.watch("user"); + + const { data: doctor, isLoading: isDoctorLoading } = useQuery({ + queryKey: ["doctor_list", searchDoctor, user_id], + queryFn: () => { + const params: { + limit?: number; + offset?: number; + user_id?: number; + full_name?: string; + } = { + limit: 8, + full_name: searchDoctor, + user_id: Number(user_id), + }; + + return doctor_api.list(params); + }, + select(data) { + return data.data.data; + }, + }); + + const { data: pharm, isLoading: isPharmLoading } = useQuery({ + queryKey: ["pharm_list", searchPharm, user_id], + queryFn: () => { + const params: { + limit?: number; + offset?: number; + user_id?: number; + name?: string; + } = { + limit: 8, + name: searchPharm, + user_id: Number(user_id), + }; + + return pharmacies_api.list(params); + }, + select(data) { + return data.data.data; + }, + }); + const { mutate, isPending } = useMutation({ mutationFn: (body: PlanCreateReq) => plans_api.create(body), onSuccess: () => { @@ -117,18 +171,32 @@ const AddedPlan = ({ initialValues, setDialogOpen }: Props) => { function onSubmit(data: z.infer) { if (initialValues) { edit({ - id: initialValues.id, body: { date: formatDate.format(data.date, "YYYY-MM-DD"), description: data.description, + extra_location: { + latitude: initialValues.latitude, + longitude: initialValues.longitude, + }, + latitude: initialValues.latitude, + longitude: initialValues.longitude, title: data.name, }, + id: initialValues.id, }); } else { mutate({ date: formatDate.format(data.date, "YYYY-MM-DD"), description: data.description, + extra_location: { + latitude: lat, + longitude: long, + }, + latitude: lat, + longitude: long, title: data.name, + doctor_id: data.doctor_id ? Number(data.doctor_id) : null, + pharmacy_id: data.pharmacy_id ? Number(data.pharmacy_id) : null, user_id: Number(data.user), }); } @@ -223,6 +291,213 @@ const AddedPlan = ({ initialValues, setDialogOpen }: Props) => { ); }} /> +
+ + +
+ {type === "DOCTOR" && ( + { + const selectedUser = doctor?.results.find( + (u) => String(u.id) === field.value, + ); + return ( + + + + + + + + + + + + + + + + {isDoctorLoading ? ( +
+ +
+ ) : doctor && doctor.results.length > 0 ? ( + + {doctor.results.map((u) => ( + { + field.onChange(String(u.id)); + setOpenDoctor(false); + setLat(u.latitude); + setLong(u.longitude); + form.setValue("pharmacy_id", undefined); + }} + > + + {u.first_name} {u.last_name} + + ))} + + ) : ( + Shifokor topilmadi + )} +
+
+
+
+ + +
+ ); + }} + /> + )} + + {type === "PHARM" && ( + { + const selectedUser = pharm?.results.find( + (u) => String(u.id) === field.value, + ); + return ( + + + + + + + + + + + + + + + + {isPharmLoading ? ( +
+ +
+ ) : pharm && pharm.results.length > 0 ? ( + + {pharm.results.map((u) => ( + { + field.onChange(String(u.id)); + setOpenPharm(false); + setLat(u.latitude); + setLong(u.longitude); + form.setValue("doctor_id", undefined); + }} + > + + {u.name} + + ))} + + ) : ( + Dorixona topilmadi + )} +
+
+
+
+ + +
+ ); + }} + /> + )} { + + + + ); +}; + +export default SupportDetail; diff --git a/src/features/support/ui/SupportList.tsx b/src/features/support/ui/SupportList.tsx new file mode 100644 index 0000000..3055b00 --- /dev/null +++ b/src/features/support/ui/SupportList.tsx @@ -0,0 +1,225 @@ +import { support_api } from "@/features/support/lib/api"; +import type { SupportListData } from "@/features/support/lib/data"; +import SupportDetail from "@/features/support/ui/SupportDetail"; +import formatDate from "@/shared/lib/formatDate"; +import { Button } from "@/shared/ui/button"; +import { Calendar } from "@/shared/ui/calendar"; +import { Input } from "@/shared/ui/input"; +import Pagination from "@/shared/ui/pagination"; +import { Popover, PopoverContent, PopoverTrigger } from "@/shared/ui/popover"; +import { + Table, + TableBody, + TableCell, + TableHead, + TableHeader, + TableRow, +} from "@/shared/ui/table"; +import { useQuery } from "@tanstack/react-query"; +import { ChevronDownIcon, Eye, Loader2 } from "lucide-react"; +import { useEffect, useState } from "react"; + +const SupportList = () => { + const [currentPage, setCurrentPage] = useState(1); + const [nameFilter, setNameFilter] = useState(""); + const [disctritFilter, setDisctritFilter] = useState(null); + const [open, setOpen] = useState(false); + const [openDate, setOpenDate] = useState(false); + const [supportDetail, setSupportDetail] = useState( + null, + ); + const [dateFilter, setDateFilter] = useState(undefined); + + useEffect(() => { + if (disctritFilter?.length === 0) { + setDisctritFilter(null); + } + }, [disctritFilter]); + + const limit = 20; + const { data, isLoading, isError } = useQuery({ + queryKey: [ + "factory_list", + currentPage, + nameFilter, + disctritFilter, + dateFilter, + ], + queryFn: () => { + const params: { + limit?: number; + offset?: number; + problem?: string; + district?: string; + user?: string; + date?: string; + } = { + limit: limit, + offset: (currentPage - 1) * limit, + user: nameFilter, + }; + + if (disctritFilter !== null) { + params.district = disctritFilter; + } + + if (dateFilter) { + params.date = formatDate.format(dateFilter, "YYYY-MM-DD"); + } + + return support_api.list(params); + }, + select(data) { + return data.data.data; + }, + }); + const totalPages = data ? Math.ceil(data?.count / limit) : 1; + + return ( +
+
+

Yordam so'rovlari ro'yxati

+ +
+ setNameFilter(e.target.value)} + /> + setDisctritFilter(e.target.value)} + /> + + + + + + + { + setDateFilter(date); + setOpenDate(false); + }} + /> +
+ +
+
+
+
+
+
+ {isLoading && ( +
+ + + +
+ )} + + {isError && ( +
+ + Ma'lumotlarni olishda xatolik yuz berdi. + +
+ )} + {!isLoading && !isError && ( + + + + ID + Kim jo'natgan + Habar haqida + Habar turi + Tuman + Jo'natilgan sanasi + Amallar + + + + {data && data.results.length > 0 ? ( + data?.results.map((plan) => ( + + {plan.id} + + {plan.user.first_name} {plan.user.last_name} + + {plan.problem.slice(0, 50)}... + + {plan.type === "PROBLEM" + ? "Muommo hal qilish" + : "Yordam so'rash"} + + + {plan.district ? plan.district.name : "-"} + + {plan.date} + + + + + )) + ) : ( + + + Farmasevtika topilmadi. + + + )} + +
+ )} +
+ + + +
+ ); +}; + +export default SupportList; diff --git a/src/pages/Distributed.tsx b/src/pages/Distributed.tsx new file mode 100644 index 0000000..c0d00ef --- /dev/null +++ b/src/pages/Distributed.tsx @@ -0,0 +1,12 @@ +import DistributedList from "@/features/distributed/ui/DistributedList"; +import SidebarLayout from "@/SidebarLayout"; + +const Distributed = () => { + return ( + + + + ); +}; + +export default Distributed; diff --git a/src/pages/Support.tsx b/src/pages/Support.tsx new file mode 100644 index 0000000..8e40582 --- /dev/null +++ b/src/pages/Support.tsx @@ -0,0 +1,12 @@ +import SupportList from "@/features/support/ui/SupportList"; +import SidebarLayout from "@/SidebarLayout"; + +const Support = () => { + return ( + + + + ); +}; + +export default Support; diff --git a/src/providers/routing/AppRoutes.tsx b/src/providers/routing/AppRoutes.tsx index 71a28e8..77abdbf 100644 --- a/src/providers/routing/AppRoutes.tsx +++ b/src/providers/routing/AppRoutes.tsx @@ -1,4 +1,5 @@ import LoginLayout from "@/LoginLayout"; +import Distributed from "@/pages/Distributed"; import Districts from "@/pages/Districts"; import Doctors from "@/pages/Doctors"; import UsersPage from "@/pages/Home"; @@ -11,6 +12,7 @@ import Region from "@/pages/Region"; import Reports from "@/pages/Reports"; import SentLocations from "@/pages/SentLocations"; import Specifications from "@/pages/Specifications"; +import Support from "@/pages/Support"; import TourPlan from "@/pages/TourPlan"; import routesConfig from "@/providers/routing/config"; import { Navigate, useRoutes } from "react-router-dom"; @@ -78,6 +80,14 @@ const AppRouter = () => { path: "/dashboard/region", element: , }, + { + path: "/dashboard/support", + element: , + }, + { + path: "/dashboard/distributed-product/", + element: , + }, ]); return routes; diff --git a/src/shared/config/api/URLs.ts b/src/shared/config/api/URLs.ts index bc5a0b0..57b2641 100644 --- a/src/shared/config/api/URLs.ts +++ b/src/shared/config/api/URLs.ts @@ -1,19 +1,23 @@ +const API_V = "/api/v1/"; + export const API_URLS = { BASE_URL: import.meta.env.VITE_API_URL || "https://api.meridynpharma.com", - LOGIN: "/api/v1/authentication/admin_login/", - USER: "/api/v1/admin/user/", - REGION: "/api/v1/admin/district/", - REGIONS: "/api/v1/admin/region/", - DISTRICT: "/api/v1/admin/district/", - DOCTOR: "/api/v1/admin/doctor/", - OBJECT: "/api/v1/admin/place/", - PHARMACIES: "/api/v1/admin/pharmacy/", - PLANS: "/api/v1/admin/plan/", - PILL: "/api/v1/admin/product/", - LOCATION: "/api/v1/admin/location/", - USER_LOCATION: "/api/v1/admin/user_location/", - ORDER: "/api/v1/admin/order/", - FACTORY: "/api/v1/admin/factory/", - REPORT: "/api/v1/admin/payment/", - TOUR_PLAN: "/api/v1/admin/tour_plan/", + LOGIN: `${API_V}authentication/admin_login/`, + USER: `${API_V}admin/user/`, + REGION: `${API_V}admin/district/`, + REGIONS: `${API_V}admin/region/`, + DISTRICT: `${API_V}admin/district/`, + DOCTOR: `${API_V}admin/doctor/`, + OBJECT: `${API_V}admin/place/`, + PHARMACIES: `${API_V}admin/pharmacy/`, + PLANS: `${API_V}admin/plan/`, + PILL: `${API_V}admin/product/`, + LOCATION: `${API_V}admin/location/`, + USER_LOCATION: `${API_V}admin/user_location/`, + ORDER: `${API_V}admin/order/`, + FACTORY: `${API_V}admin/factory/`, + REPORT: `${API_V}admin/payment/`, + TOUR_PLAN: `${API_V}admin/tour_plan/`, + SUPPORT: `${API_V}admin/support/list/`, + DISTRIBUTED: `${API_V}admin/distributed_product/list/`, }; diff --git a/src/widgets/sidebar-layout/index.tsx b/src/widgets/sidebar-layout/index.tsx index 007d406..f200884 100644 --- a/src/widgets/sidebar-layout/index.tsx +++ b/src/widgets/sidebar-layout/index.tsx @@ -1,4 +1,5 @@ import { + AlertCircle, BriefcaseMedical, Building2, Calendar, @@ -96,6 +97,16 @@ const items = [ url: "/dashboard/pharmaceuticals", icon: Microscope, }, + { + title: "Yordam so'rovlari", + url: "/dashboard/support", + icon: AlertCircle, + }, + { + title: "Tarqatilgan dorilar", + url: "/dashboard/distributed-product", + icon: Pill, + }, ]; export function AppSidebar() {