diff --git a/web-app/src/Components/Widgets/AppointmentViewModal/AppointmentViewModal.jsx b/web-app/src/Components/Dummies/AppointmentViewModal/AppointmentViewModal.jsx
similarity index 93%
rename from web-app/src/Components/Widgets/AppointmentViewModal/AppointmentViewModal.jsx
rename to web-app/src/Components/Dummies/AppointmentViewModal/AppointmentViewModal.jsx
index c248eea..9dd3307 100644
--- a/web-app/src/Components/Widgets/AppointmentViewModal/AppointmentViewModal.jsx
+++ b/web-app/src/Components/Dummies/AppointmentViewModal/AppointmentViewModal.jsx
@@ -22,6 +22,7 @@ const AppointmentViewModal = () => {
downloadFile,
deletingFiles,
deleteFile,
+ printResults,
} = useAppointmentView();
if (!selectedAppointment) {
@@ -103,7 +104,6 @@ const AppointmentViewModal = () => {
{deletingFiles[file.id] ? labels.deleting : labels.delete}
-
@@ -113,6 +113,13 @@ const AppointmentViewModal = () => {
)}
+
diff --git a/web-app/src/Components/Widgets/AppointmentViewModal/useAppointmentView.js b/web-app/src/Components/Dummies/AppointmentViewModal/useAppointmentView.js
similarity index 54%
rename from web-app/src/Components/Widgets/AppointmentViewModal/useAppointmentView.js
rename to web-app/src/Components/Dummies/AppointmentViewModal/useAppointmentView.js
index 9f680f5..6667fe0 100644
--- a/web-app/src/Components/Widgets/AppointmentViewModal/useAppointmentView.js
+++ b/web-app/src/Components/Dummies/AppointmentViewModal/useAppointmentView.js
@@ -1,29 +1,29 @@
-import {useDispatch, useSelector} from "react-redux";
-import {setSelectedAppointment} from "../../../Redux/Slices/appointmentsSlice.js";
+import { useDispatch, useSelector } from "react-redux";
+import { setSelectedAppointment } from "../../../Redux/Slices/appointmentsSlice.js";
import dayjs from "dayjs";
-import {useState} from "react";
-import {useGetAppointmentFilesQuery, useDeleteAppointmentFileMutation} from "../../../Api/appointmentFilesApi.js";
-import {baseQueryWithAuth} from "../../../Api/baseQuery.js";
-import {notification} from "antd";
+import { useState } from "react";
+import { useGetAppointmentFilesQuery, useDeleteAppointmentFileMutation } from "../../../Api/appointmentFilesApi.js";
+import { baseQueryWithAuth } from "../../../Api/baseQuery.js";
+import { notification } from "antd";
const useAppointmentView = () => {
const dispatch = useDispatch();
- const {selectedAppointment} = useSelector((state) => state.appointmentsUI);
+ const { selectedAppointment } = useSelector((state) => state.appointmentsUI);
- const {data: files = [], isLoading: isFilesLoading} = useGetAppointmentFilesQuery(
+ const { data: files = [], isLoading: isFilesLoading } = useGetAppointmentFilesQuery(
selectedAppointment?.id,
- {skip: !selectedAppointment?.id}
+ { skip: !selectedAppointment?.id }
);
- const [deleteAppointmentFile, {isLoading: isDeletingFile}] = useDeleteAppointmentFileMutation();
+ const [deleteAppointmentFile, { isLoading: isDeletingFile }] = useDeleteAppointmentFileMutation();
const [downloadingFiles, setDownloadingFiles] = useState({});
const [deletingFiles, setDeletingFiles] = useState({});
const modalWidth = 700;
- const blockStyle = {marginBottom: 16};
- const footerRowStyle = {marginTop: 16};
- const footerButtonStyle = {marginRight: 8};
+ const blockStyle = { marginBottom: 16 };
+ const footerRowStyle = { marginTop: 16 };
+ const footerButtonStyle = { marginRight: 8 };
const labels = {
title: "Просмотр приема",
@@ -45,6 +45,7 @@ const useAppointmentView = () => {
delete: "Удалить",
deleting: "Удаление...",
confirmDelete: "Вы уверены, что хотите удалить файл?",
+ printResults: "Печать результатов",
};
const visible = !!selectedAppointment;
@@ -79,8 +80,8 @@ const useAppointmentView = () => {
const downloadFile = async (fileId, fileName) => {
try {
- setDownloadingFiles((prev) => ({...prev, [fileId]: true}));
- const {url, ...options} = await baseQueryWithAuth(
+ setDownloadingFiles((prev) => ({ ...prev, [fileId]: true }));
+ const { url, ...options } = await baseQueryWithAuth(
{
url: `/appointment_files/${fileId}/file/`,
method: 'GET',
@@ -113,7 +114,6 @@ const useAppointmentView = () => {
link.click();
link.remove();
window.URL.revokeObjectURL(downloadUrl);
-
} catch (error) {
console.error("Error downloading file:", error);
notification.error({
@@ -122,13 +122,13 @@ const useAppointmentView = () => {
placement: "topRight",
});
} finally {
- setDownloadingFiles((prev) => ({...prev, [fileId]: false}));
+ setDownloadingFiles((prev) => ({ ...prev, [fileId]: false }));
}
};
const deleteFile = async (fileId, fileName) => {
try {
- setDeletingFiles((prev) => ({...prev, [fileId]: true}));
+ setDeletingFiles((prev) => ({ ...prev, [fileId]: true }));
await deleteAppointmentFile(fileId).unwrap();
notification.success({
message: "Файл удален",
@@ -143,7 +143,70 @@ const useAppointmentView = () => {
placement: "topRight",
});
} finally {
- setDeletingFiles((prev) => ({...prev, [fileId]: false}));
+ setDeletingFiles((prev) => ({ ...prev, [fileId]: false }));
+ }
+ };
+
+ const printResults = () => {
+ if (!selectedAppointment?.results || selectedAppointment.results === labels.resultsNotSpecified) {
+ notification.error({
+ message: "Ошибка печати",
+ description: "Результаты приема отсутствуют.",
+ placement: "topRight",
+ });
+ return;
+ }
+
+ try {
+ const results = getResults(selectedAppointment.results);
+ const patientName = getPatientName(selectedAppointment.patient);
+ const appointmentTime = getAppointmentTime(selectedAppointment.appointment_datetime);
+
+ const printWindow = window.open('', '_blank', 'width=800,height=600');
+ if (!printWindow) {
+ notification.error({
+ message: "Ошибка печати",
+ description: "Не удалось открыть окно для печати. Проверьте настройки блокировки всплывающих окон.",
+ placement: "topRight",
+ });
+ return;
+ }
+
+ printWindow.document.write(`
+
+
+ Результаты приема - ${patientName}
+
+
+
+ Результаты приема
+ Пациент: ${patientName}
+ Дата и время приема: ${appointmentTime}
+ ${results}
+
+
+ `);
+ printWindow.document.close();
+
+ printWindow.onload = () => {
+ printWindow.focus();
+ printWindow.print();
+ setTimeout(() => {
+ printWindow.close();
+ }, 500);
+ };
+ } catch (error) {
+ console.error("Error printing results:", error);
+ notification.error({
+ message: "Ошибка печати",
+ description: "Не удалось выполнить печать. Попробуйте снова.",
+ placement: "topRight",
+ });
}
};
@@ -168,6 +231,7 @@ const useAppointmentView = () => {
deletingFiles,
deleteFile,
isDeletingFile,
+ printResults,
};
};
diff --git a/web-app/src/Components/Pages/AppointmentsPage/AppointmentsPage.jsx b/web-app/src/Components/Pages/AppointmentsPage/AppointmentsPage.jsx
index 411a03d..e28d667 100644
--- a/web-app/src/Components/Pages/AppointmentsPage/AppointmentsPage.jsx
+++ b/web-app/src/Components/Pages/AppointmentsPage/AppointmentsPage.jsx
@@ -19,7 +19,7 @@ import {
setSelectedAppointment,
setSelectedScheduledAppointment
} from "../../../Redux/Slices/appointmentsSlice.js";
-import AppointmentViewModal from "../../Widgets/AppointmentViewModal/AppointmentViewModal.jsx";
+import AppointmentViewModal from "../../Dummies/AppointmentViewModal/AppointmentViewModal.jsx";
import ScheduledAppointmentFormModal
from "../../Dummies/ScheduledAppintmentFormModal/ScheduledAppointmentFormModal.jsx";
import ScheduledAppointmentsViewModal
diff --git a/web-app/src/Components/Pages/HomePage/HomePage.jsx b/web-app/src/Components/Pages/HomePage/HomePage.jsx
index 3cc0b40..9a81e9c 100644
--- a/web-app/src/Components/Pages/HomePage/HomePage.jsx
+++ b/web-app/src/Components/Pages/HomePage/HomePage.jsx
@@ -22,7 +22,7 @@ import {
import AppointmentFormModal from "../../Dummies/AppointmentFormModal/AppointmentFormModal.jsx";
import ScheduledAppointmentFormModal
from "../../Dummies/ScheduledAppintmentFormModal/ScheduledAppointmentFormModal.jsx";
-import AppointmentViewModal from "../../Widgets/AppointmentViewModal/AppointmentViewModal.jsx";
+import AppointmentViewModal from "../../Dummies/AppointmentViewModal/AppointmentViewModal.jsx";
import ScheduledAppointmentsViewModal
from "../../Widgets/ScheduledAppointmentsViewModal/ScheduledAppointmentsViewModal.jsx";
import PatientFormModal from "../../Dummies/PatientFormModal/PatientFormModal.jsx";