From 285fb28dafffe08e576507b4b970bcba4ed7ec6a Mon Sep 17 00:00:00 2001 From: Yehia Mohamed <102627389+YehiaFarghaly@users.noreply.github.com> Date: Sun, 15 Oct 2023 01:12:40 +0200 Subject: [PATCH] fix clinic errors --- authentication/src/api/user.js | 4 +- client/package-lock.json | 1 + client/package.json | 3 +- .../MainLayout/Header/ProfileSection/index.js | 2 +- .../Sidebar/MenuList/menu-items/pages.js | 12 +---- client/src/pages/Appointment/Appointment.js | 9 ++-- client/src/pages/DoctorListofPatients.js | 40 ++++++++++++++-- client/src/pages/DoctorPatientRow.js | 24 ++++++---- client/src/pages/HealthRecordDetails.js | 46 +++++++++---------- .../src/pages/family-member/FamilyMembers.js | 2 +- client/src/routes/MainRoutes.js | 6 ++- clinic/src/api/DoctorAPI.js | 2 +- .../repository/appointment-repository.js | 10 ++-- patient/src/database/models/Patient.js | 6 +-- patient/src/utils/Constants.js | 15 ++++++ 15 files changed, 114 insertions(+), 68 deletions(-) diff --git a/authentication/src/api/user.js b/authentication/src/api/user.js index c93533ef..d2debdd1 100644 --- a/authentication/src/api/user.js +++ b/authentication/src/api/user.js @@ -160,8 +160,8 @@ export const user = (app) => { maxAge: ONE_DAY_MAX_AGE_IN_MILLEMIINUTS, }); res.send({ - id: logedinUser._id, - name: logedinUser.userName, + id: logedinUser.userId, + userName: logedinUser.userName, type: logedinUser.type, }); } catch (err) { diff --git a/client/package-lock.json b/client/package-lock.json index d5f074de..0d9a380e 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -25,6 +25,7 @@ "formik": "^2.2.9", "framer-motion": "^6.3.16", "install": "^0.13.0", + "lodash": "^4.17.21", "material-ui-popup-state": "^4.0.1", "npm": "^10.2.0", "prop-types": "^15.8.1", diff --git a/client/package.json b/client/package.json index e7f8df12..6e0d6e16 100644 --- a/client/package.json +++ b/client/package.json @@ -16,11 +16,12 @@ "@tabler/icons": "^1.72.0", "apexcharts": "^3.35.3", "axios": "^1.5.1", - "dayjs": "^1.11.10", "date-fns": "^2.30.0", + "dayjs": "^1.11.10", "formik": "^2.2.9", "framer-motion": "^6.3.16", "install": "^0.13.0", + "lodash": "^4.17.21", "material-ui-popup-state": "^4.0.1", "npm": "^10.2.0", "prop-types": "^15.8.1", diff --git a/client/src/layout/MainLayout/Header/ProfileSection/index.js b/client/src/layout/MainLayout/Header/ProfileSection/index.js index fff35af5..30f40572 100644 --- a/client/src/layout/MainLayout/Header/ProfileSection/index.js +++ b/client/src/layout/MainLayout/Header/ProfileSection/index.js @@ -390,7 +390,7 @@ const ProfileSection = () => { selectedIndex === 1 } onClick={() => { - navigate('/profile'); + navigate('pages/profile'); }} > diff --git a/client/src/layout/MainLayout/Sidebar/MenuList/menu-items/pages.js b/client/src/layout/MainLayout/Sidebar/MenuList/menu-items/pages.js index 3bcfc614..a0b5aee2 100644 --- a/client/src/layout/MainLayout/Sidebar/MenuList/menu-items/pages.js +++ b/client/src/layout/MainLayout/Sidebar/MenuList/menu-items/pages.js @@ -56,14 +56,6 @@ const pages = { }, ], }, - { - id: 'profile', - title: 'Profile', - type: 'item', - icon: icons.AccountBoxIcon, - url: '/pages/profile', - target: false, - }, { id: 'admins', title: 'Admins', @@ -146,10 +138,10 @@ const pages = { }, { id: 'ListOfPatients', - title: 'ListOfPatientsRegiested', + title: 'My Patients', type: 'item', icon: icons.IconStethoscope, - url: '/pages/listOfPatients', + url: '/pages/my-patients', target: false, }, ], diff --git a/client/src/pages/Appointment/Appointment.js b/client/src/pages/Appointment/Appointment.js index 5c2fedc3..e682f9ce 100644 --- a/client/src/pages/Appointment/Appointment.js +++ b/client/src/pages/Appointment/Appointment.js @@ -7,14 +7,16 @@ import { useUserContext } from 'hooks/useUserContext.js'; import { useFilter } from 'contexts/FilterContext.js'; import { APPOINTMENT_FILTER_ARRAY } from 'utils/Constants.js'; import { filterAppointmentsByDate } from 'utils/AppointmentUtils.js'; +// import _ from 'lodash'; const Appointment = () => { - const [appointments, setAppointments] = useState([]); + const [appointments, setAppointments] = useState(null); const [originalAppointments, setOriginalAppointments] = useState([]); const [selectedAppointment, setSelectedAppointment] = useState(null); const { filterData, updateFilter } = useFilter(); const { user } = useUserContext(); const userId = user.id; + console.log({ userId }); useEffect(() => { clinicAxios .get('/appointments/' + userId) @@ -22,6 +24,7 @@ const Appointment = () => { setAppointments(response.data); setOriginalAppointments(response.data); updateFilter(APPOINTMENT_FILTER_ARRAY); + console.log('appoitments = ', response.data); }) .catch((error) => { console.log(error); @@ -42,10 +45,10 @@ const Appointment = () => { return ( - + />} { - const [finalListOFPatients, setPatients] = useState([]); + const [patients, setPatients] = useState([]); + const [originalPatients, setOriginalPatients] = useState([]); const [isLoading, setIsLoading] = useState(true); + const [appointments, setAppointments] = useState([]); + const { searchQuery } = useSearch(); + const { filterData, updateFilter } = useFilter(); const { user } = useUserContext(); const id = user.id; + useEffect(() => { + clinicAxios.get(`/appointments/${id}`).then((response) => { + setAppointments(response.data); + }).catch(err => console.log(err.message)); fetch('http://localhost:8001/doctors/' + id + '/patients') .then((response) => response.json()) .then((data) => { setPatients(data.finalListOFPatients); + setOriginalPatients(data.finalListOFPatients); + updateFilter([{ + attribute: 'Appointments', + values: ['Upcoming', 'Finished'] + }]); setIsLoading(false); }) .catch((error) => { @@ -30,6 +45,23 @@ const Patients = () => { }); }, []); + const isUpcomingAppointment = (id) => { + for (let i = 0; i < appointments.length; i++) { + const appointment = appointments[i]; + const currentDate = new Date(); + if (appointment.date > currentDate && appointment.patientId === id) return true; + } + return false; + }; + + useEffect(() => { + const filteredPatients = originalPatients.filter((patient) => + patient.name.includes(searchQuery) && + (!filterData[0].selectedValue || filterData[0].selectedValue === 'Finished' || (filterData[0].selectedValue === 'Upcoming' && isUpcomingAppointment(patient._id))) + ); + setPatients(filteredPatients); + }, [originalPatients, searchQuery, filterData]); + return ( {isLoading ? ( @@ -48,8 +80,8 @@ const Patients = () => { - {Array.isArray(finalListOFPatients) && - finalListOFPatients.map((patient) => ( + {Array.isArray(patients) && + patients.map((patient) => ( { setPatientDetailsOpen(true); }; - // const handleClose = () => { - // setPatientDetailsOpen(false); - // console.log('close',isPatientDetailsOpen); - // }; + const handleClose = () => { + console.log('here'); + setPatientDetailsOpen(false); + }; return ( + <> {patient.name} {patient.email} @@ -36,14 +38,16 @@ const PatientRow = ({ patient }) => { {patient.mobileNumber} {/* Conditionally render the popup based on the 'open' state */} - + + + ); }; diff --git a/client/src/pages/HealthRecordDetails.js b/client/src/pages/HealthRecordDetails.js index cca82801..efc7732b 100644 --- a/client/src/pages/HealthRecordDetails.js +++ b/client/src/pages/HealthRecordDetails.js @@ -1,4 +1,4 @@ - + import Button from '@mui/material/Button'; import Dialog from '@mui/material/Dialog'; import DialogTitle from '@mui/material/DialogTitle'; @@ -23,62 +23,58 @@ function formatHealthRecord(healthRecord) { healthRecordString += `Health Issue: ${healthRecord.healthIssue},\nHealth Issue Date: ${formatDate(healthRecord.healthIssueDate)},\nHealth Issue Description: ${healthRecord.healthIssueDescription}\n`; healthRecordString += '----------\n'; }); - + return healthRecordString; } - -function HealthRecordDetails({ isPatientDetailsOpen,setPatientDetailsOpen, patient }) { + +const HealthRecordDetails = ( { isPatientDetailsOpen, handleClose, patient } ) => { const emergencyContact = formateEmergencyContact(patient.emergencyContact); const healthRecord = formatHealthRecord(patient.healthrecords); - + console.log({ isPatientDetailsOpen }); return ( - setPatientDetailsOpen(false)} + 800 ? 500 : 1000 }, }}> - - <> Patient Details - + - Name: {patient.name} + Name: {patient.name} - Gender: {patient.gender} + Gender: {patient.gender} - mobileNumber: {patient.mobileNumber} + mobileNumber: {patient.mobileNumber} - dateOfBirth: {formatDate(patient.dateOfBirth)} - + dateOfBirth: {formatDate(patient.dateOfBirth)} + {emergencyContact} - + - healthRecords: + healthRecords:
{healthRecord}
- + {/* Add more patient details as needed */}
- - {console.log('ewew',isPatientDetailsOpen)} - - +
); -} +}; export default HealthRecordDetails; diff --git a/client/src/pages/family-member/FamilyMembers.js b/client/src/pages/family-member/FamilyMembers.js index f32f820d..bc5dbd42 100644 --- a/client/src/pages/family-member/FamilyMembers.js +++ b/client/src/pages/family-member/FamilyMembers.js @@ -45,7 +45,7 @@ const FamilyMembers = () => { .then((data) => { setFamilyMembers(data.familyMembers); setIsLoading(false); - }); + }).catch(() => setIsLoading(false)); }; fetch(); }, []); diff --git a/client/src/routes/MainRoutes.js b/client/src/routes/MainRoutes.js index eb960688..a2b46a7d 100644 --- a/client/src/routes/MainRoutes.js +++ b/client/src/routes/MainRoutes.js @@ -91,6 +91,10 @@ const MainRoutes = { path: 'prescriptions', element: , }, + { + path: 'my-patients', + element: + }, { path: 'packages', element: , @@ -107,7 +111,7 @@ const MainRoutes = { { path: 'My Patients', - element: , + element: , }, ], }, diff --git a/clinic/src/api/DoctorAPI.js b/clinic/src/api/DoctorAPI.js index 727d5ae6..507a1b70 100644 --- a/clinic/src/api/DoctorAPI.js +++ b/clinic/src/api/DoctorAPI.js @@ -137,7 +137,7 @@ export const doctor = (app) => { .json({ message: 'Invalid ID' }); const deletedDoctor = await service.deleteDoctor(id); if (deletedDoctor) { - axios.delete(`${AUTH_BASE_URL}/users/${id}`); + await axios.delete(`${AUTH_BASE_URL}/users/${id}`); res.status(OK_STATUS_CODE).json({ message: 'doctor deleted!', diff --git a/clinic/src/database/repository/appointment-repository.js b/clinic/src/database/repository/appointment-repository.js index 5f8c755f..1353524a 100644 --- a/clinic/src/database/repository/appointment-repository.js +++ b/clinic/src/database/repository/appointment-repository.js @@ -1,13 +1,11 @@ import AppointmentModel from '../models/Appointment.js'; -import mongoose from 'mongoose'; class AppointmentRepository { async findAppointmentsByUserId(id) { - const userID = new mongoose.Types.ObjectId(id); - const appointments = await AppointmentModel.find({ - $or: [{ patientId: userID }, { doctorId: userID }], - }); - return appointments; + const appointments = await AppointmentModel.find({}); + return appointments.filter((appointment) => + appointment.patientId.toString() === id.toString() || appointment.doctorId.toString() === id.toString() + ); } } diff --git a/patient/src/database/models/Patient.js b/patient/src/database/models/Patient.js index bcc00a23..2dcd1aec 100644 --- a/patient/src/database/models/Patient.js +++ b/patient/src/database/models/Patient.js @@ -1,5 +1,5 @@ import mongoose from 'mongoose'; -import { FAMILY_RELATIONS, GENDERS } from '../../utils/Constants.js'; +import { FAMILIY_EMERGENCY, GENDERS } from '../../utils/Constants.js'; import bcrypt from 'bcrypt'; const patientSchema = mongoose.Schema({ @@ -50,7 +50,7 @@ const patientSchema = mongoose.Schema({ relation: { type: String, required: true, - enum: FAMILY_RELATIONS, + enum: FAMILIY_EMERGENCY, }, }, familyMembers: [ @@ -76,7 +76,7 @@ const patientSchema = mongoose.Schema({ }, relation: { type: String, - enum: FAMILY_RELATIONS, + enum: FAMILIY_EMERGENCY, required: true, }, }, diff --git a/patient/src/utils/Constants.js b/patient/src/utils/Constants.js index 68b40885..fdfb0a8b 100644 --- a/patient/src/utils/Constants.js +++ b/patient/src/utils/Constants.js @@ -17,6 +17,21 @@ export const PORT_NUMBER = 8002; export const MONGO_URI = 'mongodb://localhost:27017'; +export const FAMILIY_EMERGENCY = [ + 'Parent', + 'Child', + 'Sibling', + 'Spouse', + 'Grandparent', + 'Grandchild', + 'Aunt', + 'Uncle', + 'Niece', + 'Nephew', + 'Cousin', + 'Other', +]; + export const FAMILY_RELATIONS = ['HUSBAND', 'WIFE', 'CHILD']; export const CREATED_STATUS_CODE = 201;