diff --git a/api/app/application/patients_repository.py b/api/app/application/patients_repository.py index b9f5b52..17ba552 100644 --- a/api/app/application/patients_repository.py +++ b/api/app/application/patients_repository.py @@ -1,4 +1,4 @@ -from typing import Sequence, Optional, Tuple +from typing import Sequence, Optional, Tuple, Literal from sqlalchemy import select, func, or_ from sqlalchemy.ext.asyncio import AsyncSession @@ -10,7 +10,8 @@ class PatientsRepository: def __init__(self, db: AsyncSession): self.db = db - async def get_all(self, skip: int = 0, limit: int = 10, search: str = None) -> Tuple[Sequence[Patient], int]: + async def get_all(self, skip: int = 0, limit: int = 10, search: str = None, + sort_order: Literal["asc", "desc"] = "asc") -> Tuple[Sequence[Patient], int]: stmt = select(Patient) if search: @@ -25,6 +26,11 @@ class PatientsRepository: ) ) + if sort_order == "desc": + stmt = stmt.order_by(Patient.last_name.desc()) + else: + stmt = stmt.order_by(Patient.last_name.asc()) + stmt = stmt.offset(skip).limit(limit) result = await self.db.execute(stmt) patients = result.scalars().all() diff --git a/api/app/controllers/patients_router.py b/api/app/controllers/patients_router.py index ebf33e3..eb2dc3a 100644 --- a/api/app/controllers/patients_router.py +++ b/api/app/controllers/patients_router.py @@ -1,3 +1,5 @@ +from typing import Literal + from fastapi import APIRouter, Depends, Query from sqlalchemy.ext.asyncio import AsyncSession @@ -20,11 +22,12 @@ async def get_all_patients( page: int = Query(1, ge=1, description="Page number"), page_size: int = Query(10, ge=1, le=100, description="Number of patients per page"), search: str = Query(None, description="Search term for filtering patients"), + sort_order: Literal["asc", "desc"] = Query("asc", description="Sort order by first_name (asc or desc)"), db: AsyncSession = Depends(get_db), user=Depends(get_current_user), ): patients_service = PatientsService(db) - patients, total_count = await patients_service.get_all_patients(page, page_size, search) + patients, total_count = await patients_service.get_all_patients(page, page_size, search, sort_order) return {"patients": patients, "total_count": total_count} diff --git a/api/app/infrastructure/patients_service.py b/api/app/infrastructure/patients_service.py index 6b2e033..dad217b 100644 --- a/api/app/infrastructure/patients_service.py +++ b/api/app/infrastructure/patients_service.py @@ -1,4 +1,4 @@ -from typing import Optional, Tuple +from typing import Optional, Tuple, Literal from fastapi import HTTPException from sqlalchemy.ext.asyncio import AsyncSession @@ -13,10 +13,10 @@ class PatientsService: def __init__(self, db: AsyncSession): self.patient_repository = PatientsRepository(db) - async def get_all_patients(self, page: int = 1, page_size: int = 10, search: str = None) -> Tuple[ + async def get_all_patients(self, page: int = 1, page_size: int = 10, search: str = None, sort_order: Literal["asc", "desc"] = "asc") -> Tuple[ list[PatientEntity], int]: skip = (page - 1) * page_size - patients, total_count = await self.patient_repository.get_all(skip=skip, limit=page_size, search=search) + patients, total_count = await self.patient_repository.get_all(skip=skip, limit=page_size, search=search, sort_order=sort_order) return ( [self.model_to_entity(patient) for patient in patients], total_count diff --git a/web-app/src/Api/patientsApi.js b/web-app/src/Api/patientsApi.js index 4a3b082..d12c781 100644 --- a/web-app/src/Api/patientsApi.js +++ b/web-app/src/Api/patientsApi.js @@ -7,9 +7,14 @@ export const patientsApi = createApi({ tagTypes: ['Patient'], endpoints: (builder) => ({ getPatients: builder.query({ - query: ({ page, pageSize, search }) => ({ + query: ({ page, pageSize, search, sortOrder }) => ({ url: '/patients/', - params: { page, page_size: pageSize, search: search || undefined }, + params: { + page, + page_size: pageSize, + search: search || undefined, + sort_order: sortOrder || undefined, + }, }), providesTags: ['Patients'], }), diff --git a/web-app/src/Components/Pages/PatientsPage/PatientsPage.jsx b/web-app/src/Components/Pages/PatientsPage/PatientsPage.jsx index 02c659c..b40b41f 100644 --- a/web-app/src/Components/Pages/PatientsPage/PatientsPage.jsx +++ b/web-app/src/Components/Pages/PatientsPage/PatientsPage.jsx @@ -18,7 +18,7 @@ import { SortAscendingOutlined, SortDescendingOutlined, TableOutlined, - TeamOutlined, + TeamOutlined } from "@ant-design/icons"; import PatientListCard from "../../Dummies/PatientListCard.jsx"; import PatientFormModal from "../../Dummies/PatientFormModal/PatientFormModal.jsx"; @@ -37,24 +37,20 @@ const PatientsPage = () => { title: "Фамилия", dataIndex: "last_name", key: "last_name", - sorter: true, }, { title: "Имя", dataIndex: "first_name", key: "first_name", - sorter: true, }, { title: "Отчество", dataIndex: "patronymic", key: "patronymic", - sorter: true, }, { title: "Дата рождения", dataIndex: "birthday", - sorter: true, render: patientsData.formatDate, }, { @@ -118,26 +114,23 @@ const PatientsPage = () => { placeholder="Поиск пациента" value={patientsData.searchText} onChange={(e) => patientsData.handleSetSearchText(e.target.value)} - onPressEnter={patientsData.handleSearch} style={patientsData.formItemStyle} allowClear onClear={patientsData.handleClearSearch} /> - {patientsData.viewMode === "tile" && ( -