Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
12 changes: 7 additions & 5 deletions server/src/components/MentorPopUp.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,12 @@ const MentorPopUp: React.FC<MentorPopUpProps> = ({ isOpen, onClose, mentorDetail
};

const handleAccept = async () => {
// Check if studentActivity is empty
if (!mentorDetails.studentActivity) {
console.log("No activity available for this journal entry.");
return; // Prevent further action if there's no activity
}

try {
const response = await fetch(`/api/mentor-activity/${mentorDetails.id}`, {
method: 'POST',
Expand All @@ -80,8 +86,6 @@ const MentorPopUp: React.FC<MentorPopUpProps> = ({ isOpen, onClose, mentorDetail
};

return (


<AlertDialog open={isOpen} onOpenChange={onClose}>
<AlertDialogTrigger asChild>
<div />
Expand Down Expand Up @@ -131,6 +135,4 @@ const MentorPopUp: React.FC<MentorPopUpProps> = ({ isOpen, onClose, mentorDetail
);
};



export default MentorPopUp
export default MentorPopUp;
97 changes: 58 additions & 39 deletions server/src/components/calendar.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -43,15 +43,15 @@ interface FormData {
}

interface FeedbackData {
review: string,
status: string,
mentorId: string
review: string;
status: string;
mentorId: string;
}

interface MentorFormData {
date: string,
workingHours: number,
activities: string
date: string;
workingHours: number;
activities: string;
}

interface CalendarEvent {
Expand Down Expand Up @@ -145,8 +145,10 @@ const TaskCalendar: React.FC<TaskCalendarProps> = ({ selectedUser }) => {
if (data) {
const parsedEvents =
role === "mentor"
? studentId === selectedUser ?convertToCalendarEventsMentor(data)
: convertToCalendarEvents(data): convertToCalendarEvents(data);
? studentId === selectedUser
? convertToCalendarEventsMentor(data)
: convertToCalendarEvents(data)
: convertToCalendarEvents(data);
setEvents(parsedEvents);
}
};
Expand Down Expand Up @@ -190,7 +192,10 @@ const TaskCalendar: React.FC<TaskCalendarProps> = ({ selectedUser }) => {
};

const processResponse = async (existingEvent: any, formattedDate: string) => {
if ((role === "mentor" && studentId !== selectedUser) || (role === "student")) {
if (
(role === "mentor" && studentId !== selectedUser) ||
role === "student"
) {
const feedbackData = await fetchFeedback(existingEvent.id, formattedDate);
updateFormData(existingEvent, feedbackData, formattedDate);
} else {
Expand Down Expand Up @@ -258,18 +263,30 @@ const TaskCalendar: React.FC<TaskCalendarProps> = ({ selectedUser }) => {

const todayMoment = moment().startOf("day");
const dayBeforeYesterday = moment().subtract(2, "days").startOf("day");

if (
moment(date).isSame(todayMoment, "day") ||
moment(date).isBetween(dayBeforeYesterday, todayMoment, "day", "[]")
) {
setIsEditable(true);

setIsEditable(
moment(date).isSame(today, "day") ||
moment(date).isBetween(dayBeforeYesterday, today, "day", "[]")
);

fetchEventForDate(formattedDate);

const isDateInEvents = events.some((event) => {
const eventStart = moment(event.start).format("YYYY-MM-DD");
const eventEnd = moment(event.end).format("YYYY-MM-DD");
return eventStart === formattedDate || eventEnd === formattedDate;
});

if (role === "mentor") {
if (isDateInEvents) {
setTaskModalOpen(true);
} else {
setTaskModalOpen(false);
showToast("No Task", "No task submitted for this day.");
}
} else {
setIsEditable(false);
setTaskModalOpen(true);
}

fetchEventForDate(formattedDate);
setTaskModalOpen(true);
};

const handleClose = () => {
Expand Down Expand Up @@ -436,7 +453,7 @@ const TaskCalendar: React.FC<TaskCalendarProps> = ({ selectedUser }) => {
taskModalOpen={taskModalOpen}
setTaskModalOpen={setTaskModalOpen}
role={role}
selectedUser={selectedUser || ''}
selectedUser={selectedUser || ""}
studentId={studentId}
formData={formData}
workingHours={workingHours}
Expand All @@ -453,7 +470,7 @@ const TaskCalendar: React.FC<TaskCalendarProps> = ({ selectedUser }) => {
taskModalOpen={taskModalOpen}
setTaskModalOpen={setTaskModalOpen}
role={role}
selectedUser={selectedUser || ''}
selectedUser={selectedUser || ""}
studentId={studentId}
formData={formData}
workingHours={workingHours}
Expand All @@ -479,24 +496,26 @@ const TaskCalendar: React.FC<TaskCalendarProps> = ({ selectedUser }) => {
handleSubmit={handleSubmit}
/>

<div className="relative w-[90vw] h-[80vh] ">
<BigCalendar
events={events}
localizer={localizer}
defaultView={Views.MONTH}
view={Views.MONTH}
startAccessor="start"
endAccessor="end"
onSelectSlot={(slotInfo) => handleDateClick(slotInfo.start)}
onSelectEvent={(event) => handleDateClick(event.start)}
selectable
components={{
toolbar: CustomToolbar,
}}
eventPropGetter={(event) => eventPropGetter(event, selectedUser || "")} // Pass selectedUser here
style={{height: "100%"}}
/>
</div>
<div className="relative w-[90vw] h-[80vh] ">
<BigCalendar
events={events}
localizer={localizer}
defaultView={Views.MONTH}
view={Views.MONTH}
startAccessor="start"
endAccessor="end"
onSelectSlot={(slotInfo) => handleDateClick(slotInfo.start)}
onSelectEvent={(event) => handleDateClick(event.start)}
selectable
components={{
toolbar: CustomToolbar,
}}
eventPropGetter={(event) =>
eventPropGetter(event, selectedUser || "")
} // Pass selectedUser here
style={{ height: "100%" }}
/>
</div>

{toast && (
<Toast>
Expand Down
93 changes: 68 additions & 25 deletions server/src/components/mentorTaskDetailDialog.tsx
Original file line number Diff line number Diff line change
@@ -1,11 +1,28 @@
// src/components/MentorTaskDetailDialog.tsx
'use client'
import React, { useState } from 'react';
import { AlertDialog, AlertDialogTrigger, AlertDialogContent, AlertDialogHeader, AlertDialogTitle, AlertDialogDescription, AlertDialogFooter, AlertDialogCancel, AlertDialogAction } from '@/components/ui/alert-dialog';
import { Input } from '@/components/ui/input';
import { Button } from '@/components/ui/button';
import { Textarea } from '@/components/ui/textarea';
import { ToastProvider, Toast, ToastTitle, ToastDescription, ToastClose, ToastViewport } from '@/components/ui/toast';
"use client";
import React, { useState } from "react";
import {
AlertDialog,
AlertDialogTrigger,
AlertDialogContent,
AlertDialogHeader,
AlertDialogTitle,
AlertDialogDescription,
AlertDialogFooter,
AlertDialogCancel,
AlertDialogAction,
} from "@/components/ui/alert-dialog";
import { Input } from "@/components/ui/input";
import { Button } from "@/components/ui/button";
import { Textarea } from "@/components/ui/textarea";
import {
ToastProvider,
Toast,
ToastTitle,
ToastDescription,
ToastClose,
ToastViewport,
} from "@/components/ui/toast";

interface MentorTaskDetailDialogProps {
taskModalOpen: boolean;
Expand Down Expand Up @@ -37,10 +54,10 @@ const MentorTaskDetailDialog: React.FC<MentorTaskDetailDialogProps> = ({
review,
setReview,
setStatus,
handleClose
handleClose,
}) => {
const [showToast, setShowToast] = useState(false);
const [toastMessage, setToastMessage] = useState('');
const [toastMessage, setToastMessage] = useState("");
const [showHoursToast, setShowHoursToast] = useState(false);

const handleTextChange = (value: string, setter: (value: string) => void) => {
Expand All @@ -55,7 +72,9 @@ const MentorTaskDetailDialog: React.FC<MentorTaskDetailDialogProps> = ({
const handleValidationAndAction = (action: string) => {
if (!notes || !workingHours) {
setShowToast(true);
setToastMessage("Notes and Working Hours must be provided before accepting or rejecting.");
setToastMessage(
"Notes and Working Hours must be provided before accepting or rejecting."
);
return;
}
setStatus(action);
Expand All @@ -70,32 +89,44 @@ const MentorTaskDetailDialog: React.FC<MentorTaskDetailDialogProps> = ({
};

return (
role === 'mentor' && selectedUser !== studentId && (
role === "mentor" &&
selectedUser !== studentId && (
<ToastProvider>
<AlertDialog open={taskModalOpen} onOpenChange={setTaskModalOpen}>
<AlertDialogTrigger asChild>
<div />
</AlertDialogTrigger>
<AlertDialogContent className="max-w-2xl mx-auto p-6 bg-white rounded-lg shadow-lg">
<AlertDialogHeader>
<AlertDialogTitle className="text-2xl font-semibold text-gray-900">Mentor Task Detail</AlertDialogTitle>
<AlertDialogTitle className="text-2xl font-semibold text-gray-900">
Mentor Task Detail
</AlertDialogTitle>
</AlertDialogHeader>
<AlertDialogDescription className="text-gray-700">
<div className="flex gap-6 mb-4">
<div className="w-1/2">
<span className="block text-sm font-medium text-black mb-1">Date</span>
<Input type="date" value={formData.date} disabled className="text-black" />
<span className="block text-sm font-medium text-black mb-1">
Date
</span>
<Input
type="date"
value={formData.date}
disabled
className="text-black"
/>
</div>
<div className="w-1/2">
<span className="block text-sm font-medium text-black mb-1">Working Hours</span>
<span className="block text-sm font-medium text-black mb-1">
Working Hours
</span>
<Input
type="number"
value={workingHours}
disabled={true}
onChange={(e) => {
const value = e.target.value;
if (value === '') {

if (value === "") {
setWorkingHours(0);
} else {
const hours = Number(value);
Expand All @@ -112,7 +143,9 @@ const MentorTaskDetailDialog: React.FC<MentorTaskDetailDialogProps> = ({
</div>
</div>
<div className="mb-6">
<h3 className="text-lg font-semibold text-black mb-2">Activity</h3>
<h3 className="text-lg font-semibold text-black mb-2">
Activity
</h3>
<Textarea
value={notes}
onChange={(e) => handleTextChange(e.target.value, setNotes)}
Expand All @@ -122,17 +155,26 @@ const MentorTaskDetailDialog: React.FC<MentorTaskDetailDialogProps> = ({
/>
</div>
<div className="mb-6">
<h3 className="text-lg font-semibold text-black mb-2">Review</h3>
<h3 className="text-lg font-semibold text-black mb-2">
Review
</h3>
<textarea
value={review}
onChange={(e) => handleTextChange(e.target.value, setReview)}
placeholder="Enter your review here..."
className="w-full h-32 p-3 border border-gray-300 rounded-md bg-white"
className={`w-full h-32 p-3 border border-gray-300 rounded-md bg-white ${
notes == "" ? "cursor-not-allowed" : ""}`}
disabled={notes == ""}
/>
</div>
</AlertDialogDescription>
<AlertDialogFooter className="flex justify-end gap-3 mt-4">
<Button onClick={() => setTaskModalOpen(false)} className=" text-white bg[#666668] px-4 py-2 rounded-md">Close</Button>
<Button
onClick={() => setTaskModalOpen(false)}
className=" text-white bg[#666668] px-4 py-2 rounded-md"
>
Close
</Button>
<Button
disabled={review == ""}
onClick={() => handleValidationAndAction('approved')}
Expand Down Expand Up @@ -161,15 +203,16 @@ const MentorTaskDetailDialog: React.FC<MentorTaskDetailDialogProps> = ({
{showHoursToast && (
<Toast>
<ToastTitle>Invalid Working Hours</ToastTitle>
<ToastDescription>Please enter a number between 1 and 12 for working hours.</ToastDescription>
<ToastDescription>
Please enter a number between 1 and 12 for working hours.
</ToastDescription>
<ToastClose onClick={() => setShowHoursToast(false)} />
</Toast>
)}
</Toast>
)}
<ToastViewport />
</ToastProvider>
)
);
};

export default MentorTaskDetailDialog;