feat: Исправление фильтрации и UI для выдачи линз
This commit is contained in:
parent
b8bc7023a0
commit
0a7fd16a29
@ -1,3 +1,4 @@
|
|||||||
|
from datetime import date
|
||||||
from typing import Optional, Sequence, Tuple, Literal
|
from typing import Optional, Sequence, Tuple, Literal
|
||||||
|
|
||||||
from sqlalchemy import select, desc, or_, func, asc
|
from sqlalchemy import select, desc, or_, func, asc
|
||||||
@ -17,8 +18,8 @@ class LensIssuesRepository:
|
|||||||
limit: int = 10,
|
limit: int = 10,
|
||||||
search: Optional[str] = None,
|
search: Optional[str] = None,
|
||||||
sort_order: Literal["asc", "desc"] = "desc",
|
sort_order: Literal["asc", "desc"] = "desc",
|
||||||
start_date: Optional[str] = None,
|
start_date: Optional[date] = None,
|
||||||
end_date: Optional[str] = None
|
end_date: Optional[date] = None
|
||||||
) -> Tuple[Sequence[LensIssue], int]:
|
) -> Tuple[Sequence[LensIssue], int]:
|
||||||
stmt = (
|
stmt = (
|
||||||
select(LensIssue)
|
select(LensIssue)
|
||||||
@ -62,6 +63,7 @@ class LensIssuesRepository:
|
|||||||
)
|
)
|
||||||
if start_date:
|
if start_date:
|
||||||
count_stmt = count_stmt.filter(LensIssue.issue_date >= start_date)
|
count_stmt = count_stmt.filter(LensIssue.issue_date >= start_date)
|
||||||
|
|
||||||
if end_date:
|
if end_date:
|
||||||
count_stmt = count_stmt.filter(LensIssue.issue_date <= end_date)
|
count_stmt = count_stmt.filter(LensIssue.issue_date <= end_date)
|
||||||
|
|
||||||
|
|||||||
@ -1,3 +1,4 @@
|
|||||||
|
from datetime import date
|
||||||
from typing import Optional, Literal
|
from typing import Optional, Literal
|
||||||
|
|
||||||
from fastapi import APIRouter, Depends, Query
|
from fastapi import APIRouter, Depends, Query
|
||||||
@ -23,8 +24,8 @@ async def get_all_lens_issues(
|
|||||||
page_size: int = Query(10, ge=1, le=100),
|
page_size: int = Query(10, ge=1, le=100),
|
||||||
search: Optional[str] = Query(None),
|
search: Optional[str] = Query(None),
|
||||||
sort_order: Literal["asc", "desc"] = Query("desc"),
|
sort_order: Literal["asc", "desc"] = Query("desc"),
|
||||||
start_date: Optional[str] = Query(None),
|
start_date: Optional[date] = Query(None),
|
||||||
end_date: Optional[str] = Query(None),
|
end_date: Optional[date] = Query(None),
|
||||||
db: AsyncSession = Depends(get_db),
|
db: AsyncSession = Depends(get_db),
|
||||||
user=Depends(get_current_user),
|
user=Depends(get_current_user),
|
||||||
):
|
):
|
||||||
|
|||||||
@ -1,3 +1,4 @@
|
|||||||
|
from datetime import date
|
||||||
from typing import Optional, Literal, Tuple
|
from typing import Optional, Literal, Tuple
|
||||||
|
|
||||||
from fastapi import HTTPException
|
from fastapi import HTTPException
|
||||||
@ -28,8 +29,8 @@ class LensIssuesService:
|
|||||||
limit: int = 10,
|
limit: int = 10,
|
||||||
search: Optional[str] = None,
|
search: Optional[str] = None,
|
||||||
sort_order: Literal["asc", "desc"] = "desc",
|
sort_order: Literal["asc", "desc"] = "desc",
|
||||||
start_date: Optional[str] = None,
|
start_date: Optional[date] = None,
|
||||||
end_date: Optional[str] = None
|
end_date: Optional[date] = None
|
||||||
) -> Tuple[list[LensIssueEntity], int]:
|
) -> Tuple[list[LensIssueEntity], int]:
|
||||||
lens_issues, total_count = await self.lens_issues_repository.get_all(
|
lens_issues, total_count = await self.lens_issues_repository.get_all(
|
||||||
skip=skip,
|
skip=skip,
|
||||||
|
|||||||
@ -25,7 +25,6 @@ import timezone from "dayjs/plugin/timezone";
|
|||||||
|
|
||||||
dayjs.extend(utc);
|
dayjs.extend(utc);
|
||||||
dayjs.extend(timezone);
|
dayjs.extend(timezone);
|
||||||
dayjs.tz.setDefault("Europe/Moscow");
|
|
||||||
|
|
||||||
const { useBreakpoint } = Grid;
|
const { useBreakpoint } = Grid;
|
||||||
|
|
||||||
@ -35,13 +34,13 @@ const useAppointments = () => {
|
|||||||
const { collapsed, siderWidth, hovered, selectedAppointment } = useSelector(state => state.appointmentsUI);
|
const { collapsed, siderWidth, hovered, selectedAppointment } = useSelector(state => state.appointmentsUI);
|
||||||
const screens = useBreakpoint();
|
const screens = useBreakpoint();
|
||||||
|
|
||||||
const [currentMonth, setCurrentMonth] = useState(dayjs().tz("Europe/Moscow").startOf('month'));
|
const [currentMonth, setCurrentMonth] = useState(dayjs().startOf('month'));
|
||||||
|
|
||||||
const startDate = currentMonth.startOf('month').tz("Europe/Moscow").format('YYYY-MM-DD');
|
const startDate = currentMonth.startOf('month').format('YYYY-MM-DD');
|
||||||
const endDate = currentMonth.endOf('month').tz("Europe/Moscow").format('YYYY-MM-DD');
|
const endDate = currentMonth.endOf('month').format('YYYY-MM-DD');
|
||||||
|
|
||||||
const handleMonthChange = (newMonth) => {
|
const handleMonthChange = (newMonth) => {
|
||||||
setCurrentMonth(dayjs(newMonth).tz("Europe/Moscow").startOf('month'));
|
setCurrentMonth(dayjs(newMonth).startOf('month'));
|
||||||
};
|
};
|
||||||
|
|
||||||
const {
|
const {
|
||||||
@ -155,7 +154,7 @@ const useAppointments = () => {
|
|||||||
|
|
||||||
const upcomingEvents = useMemo(() =>
|
const upcomingEvents = useMemo(() =>
|
||||||
[...upcomingAppointments, ...upcomingScheduledAppointments]
|
[...upcomingAppointments, ...upcomingScheduledAppointments]
|
||||||
.sort((a, b) => dayjs(a.appointment_datetime || a.scheduled_datetime).tz("Europe/Moscow") - dayjs(b.appointment_datetime || b.scheduled_datetime).tz("Europe/Moscow"))
|
.sort((a, b) => dayjs(a.appointment_datetime || a.scheduled_datetime) - dayjs(b.appointment_datetime || b.scheduled_datetime))
|
||||||
.slice(0, 5),
|
.slice(0, 5),
|
||||||
[upcomingAppointments, upcomingScheduledAppointments]
|
[upcomingAppointments, upcomingScheduledAppointments]
|
||||||
);
|
);
|
||||||
|
|||||||
@ -87,6 +87,7 @@ const IssuesPage = () => {
|
|||||||
/>
|
/>
|
||||||
);
|
);
|
||||||
|
|
||||||
|
const TimeLineView = () => {
|
||||||
const timeLineItems = useMemo(() => issuesData.issues.map(issue => ({
|
const timeLineItems = useMemo(() => issuesData.issues.map(issue => ({
|
||||||
label: dayjs(issue.issue_date).format("DD.MM.YYYY"),
|
label: dayjs(issue.issue_date).format("DD.MM.YYYY"),
|
||||||
children: (
|
children: (
|
||||||
@ -108,18 +109,12 @@ const IssuesPage = () => {
|
|||||||
</Col>
|
</Col>
|
||||||
</Row>
|
</Row>
|
||||||
),
|
),
|
||||||
})), [issuesData]);
|
})), []);
|
||||||
|
|
||||||
const TimeLineView = () => {
|
|
||||||
const paginatedItems = timeLineItems.slice(
|
|
||||||
(issuesData.currentPage - 1) * issuesData.pageSize,
|
|
||||||
issuesData.currentPage * issuesData.pageSize
|
|
||||||
);
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<Timeline
|
<Timeline
|
||||||
items={paginatedItems}
|
items={timeLineItems}
|
||||||
mode={screens.xs ? "left" : "right"}
|
mode={screens.xs ? "left" : "right"}
|
||||||
/>
|
/>
|
||||||
<Row
|
<Row
|
||||||
@ -128,12 +123,7 @@ const IssuesPage = () => {
|
|||||||
justify="end"
|
justify="end"
|
||||||
>
|
>
|
||||||
<Pagination
|
<Pagination
|
||||||
current={issuesData.currentPage}
|
{...issuesData.pagination}
|
||||||
pageSize={issuesData.pageSize}
|
|
||||||
total={issuesData.total_count}
|
|
||||||
onChange={issuesData.handlePaginationChange}
|
|
||||||
showSizeChanger={true}
|
|
||||||
pageSizeOptions={["5", "10", "20", "50"]}
|
|
||||||
/>
|
/>
|
||||||
</Row>
|
</Row>
|
||||||
</>
|
</>
|
||||||
@ -157,7 +147,6 @@ const IssuesPage = () => {
|
|||||||
placeholder="Поиск по пациенту или врачу"
|
placeholder="Поиск по пациенту или врачу"
|
||||||
value={issuesData.tempSearchText}
|
value={issuesData.tempSearchText}
|
||||||
onChange={(e) => issuesData.handleSetTempSearchText(e.target.value)}
|
onChange={(e) => issuesData.handleSetTempSearchText(e.target.value)}
|
||||||
onPressEnter={issuesData.handleSearch}
|
|
||||||
style={issuesData.formItemStyle}
|
style={issuesData.formItemStyle}
|
||||||
allowClear
|
allowClear
|
||||||
onClear={issuesData.handleClearSearch}
|
onClear={issuesData.handleClearSearch}
|
||||||
|
|||||||
@ -105,7 +105,10 @@ const useIssues = () => {
|
|||||||
borderRadius: 8
|
borderRadius: 8
|
||||||
};
|
};
|
||||||
|
|
||||||
const handleSetTempSearchText = (value) => setTempSearchText(value);
|
const handleSetTempSearchText = (value) => {
|
||||||
|
setTempSearchText(value);
|
||||||
|
handleSearch();
|
||||||
|
};
|
||||||
|
|
||||||
const handleSearch = () => {
|
const handleSearch = () => {
|
||||||
dispatch(setSearchText(tempSearchText));
|
dispatch(setSearchText(tempSearchText));
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user