andrei 9e7fa036ad refactor: PatientsPage: Перенос PatientFormModal
Перенесен PatientFormModal в Dummies. Убрана логика модалки из usePatients.
2025-06-02 16:08:36 +05:00

194 lines
6.8 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import {
Input,
Select,
List,
FloatButton,
Row,
Col,
Table,
Button,
Popconfirm,
Typography,
Result, Tooltip
} from "antd";
import {
BuildOutlined,
PlusOutlined,
SortAscendingOutlined,
SortDescendingOutlined, TableOutlined,
TeamOutlined
} from "@ant-design/icons";
import PatientListCard from "../../Dummies/PatientListCard.jsx";
import PatientFormModal from "../../Dummies/PatientFormModal/PatientFormModal.jsx";
import SelectViewMode from "../../Widgets/SelectViewMode.jsx";
import LoadingIndicator from "../../Widgets/LoadingIndicator.jsx";
import usePatients from "./usePatients.js";
import usePatientsUI from "./usePatientsUI.js";
const {Option} = Select;
const {Title} = Typography;
const PatientsPage = () => {
const patientsData = usePatients();
const patientsUI = usePatientsUI(patientsData.patients);
const columns = [
{
title: "Фамилия",
dataIndex: "last_name",
key: "last_name",
sorter: (a, b) => a.last_name.localeCompare(b.last_name),
sortDirections: ["ascend", "descend"],
},
{
title: "Имя",
dataIndex: "first_name",
key: "first_name",
sorter: (a, b) => a.first_name.localeCompare(b.first_name),
sortDirections: ["ascend", "descend"],
},
{
title: "Отчество",
dataIndex: "patronymic",
key: "patronymic",
sortDirections: ["ascend", "descend"],
},
{
title: "Дата рождения",
dataIndex: "birthday",
sorter: (a, b) => new Date(a.birthday).getTime() - new Date(b.birthday).getTime(),
sortDirections: ["ascend", "descend"],
render: patientsUI.formatDate,
},
{
title: "Телефон",
dataIndex: "phone",
},
{
title: "Email",
dataIndex: "email",
},
{
title: "Действия",
fixed: 'right',
render: (_, record) => (
<Row gutter={[8, 8]}>
<Col xs={24} xl={12}>
<Button block onClick={() => patientsUI.handleEditPatient(record)}>Изменить</Button>
</Col>
<Col xs={24} xl={12}>
<Popconfirm
title="Вы уверены, что хотите удалить пациента?"
onConfirm={() => patientsData.handleDeletePatient(record.id)}
okText="Да, удалить"
cancelText="Отмена"
>
<Button danger block>Удалить</Button>
</Popconfirm>
</Col>
</Row>
),
},
];
const viewModes = [
{
value: "tile",
label: "Плитка",
icon: <BuildOutlined style={patientsUI.viewModIconStyle}/>
},
{
value: "table",
label: "Таблица",
icon: <TableOutlined style={patientsUI.viewModIconStyle}/>
}
];
if (patientsData.isError) return (
<Result
status="error"
title="Ошибка"
subTitle="Произошла ошибка в работе страницы"
/>
);
return (
<div style={patientsUI.containerStyle}>
<Title level={1}><TeamOutlined/> Пациенты</Title>
<Row gutter={[16, 16]} style={patientsUI.filterBarStyle}>
<Col xs={24} md={14} sm={10} xl={18} xxl={19}>
<Input
placeholder="Поиск пациента"
value={patientsUI.searchText}
onChange={(e) => patientsUI.handleSetSearchText(e.target.value)}
style={patientsUI.formItemStyle}
allowClear
/>
</Col>
{patientsUI.viewMode === "tile" && (
<Col xs={24} md={5} sm={6} xl={3} xxl={2}>
<Tooltip title={"Сортировка пациентов"}>
<Select
value={patientsUI.sortOrder}
onChange={patientsUI.handleSetSortOrder}
style={patientsUI.formItemStyle}
>
<Option value="asc"><SortAscendingOutlined/> А-Я</Option>
<Option value="desc"><SortDescendingOutlined/> Я-А</Option>
</Select>
</Tooltip>
</Col>
)}
<Col xs={24} md={patientsUI.viewMode === "tile" ? 5 : 10}
sm={patientsUI.viewMode === "tile" ? 8 : 14}
xl={patientsUI.viewMode === "tile" ? 3 : 5}
xxl={patientsUI.viewMode === "tile" ? 3 : 5}>
<SelectViewMode
viewMode={patientsUI.viewMode}
setViewMode={patientsUI.handleSetViewMode}
localStorageKey={"viewModePatients"}
toolTipText={"Формат отображения пациентов"}
viewModes={viewModes}
/>
</Col>
</Row>
{patientsData.isLoading ? <LoadingIndicator/> : patientsUI.viewMode === "tile" ? (
<List
grid={{gutter: 16, column: 3}}
dataSource={patientsUI.filteredPatients}
renderItem={patient => (
<List.Item>
<PatientListCard
patient={patient}
handleEditPatient={patientsUI.handleEditPatient}
handleDeletePatient={patientsData.handleDeletePatient}
/>
</List.Item>
)}
pagination={patientsUI.pagination}
/>
) : (
<Table
columns={columns}
dataSource={patientsUI.filteredPatients}
pagination={patientsUI.pagination}
/>
)}
<FloatButton
icon={<PlusOutlined/>}
type="primary"
onClick={patientsUI.handleAddPatient}
tooltip="Добавить пациента"
/>
<PatientFormModal/>
</div>
);
};
export default PatientsPage;