From edb1a0f3f6e651aeae088e63d1ba95ff16a59107 Mon Sep 17 00:00:00 2001 From: RWEMAREMY Date: Wed, 11 Sep 2024 15:51:48 +0200 Subject: [PATCH] advancing calender functionality --- src/components/Calendar.tsx | 234 +++++++++++++++++++++++++----------- 1 file changed, 164 insertions(+), 70 deletions(-) diff --git a/src/components/Calendar.tsx b/src/components/Calendar.tsx index da7d6707..f0fea7b0 100644 --- a/src/components/Calendar.tsx +++ b/src/components/Calendar.tsx @@ -13,6 +13,12 @@ import { ADD_EVENT, GET_EVENTS } from '../Mutations/event'; import moment from 'moment'; /* istanbul ignore next */ +type Trainee = { + id: number; + name: string; + role: 'admin' | 'manager' | 'trainee'; +}; + const Calendar = () => { useDocumentTitle('Calendar'); const [addEventModel, setAddEventModel] = useState(false); @@ -27,6 +33,21 @@ const Calendar = () => { const [data, setData] = useState([]); const [getEvents] = useLazyQuery(GET_EVENTS); const [createEvent] = useMutation(ADD_EVENT); + const [showTraineeDropdown, setShowTraineeDropdown] = useState(false); + const [trainees, setTrainees] = useState([ + { id: 1, name: 'John Doe', role: 'admin' }, + { id: 2, name: 'Jane Smith', role: 'manager' }, + { id: 3, name: 'Bob Johnson', role: 'trainee' }, + { id: 4, name: 'Alice Brown', role: 'trainee' }, + { id: 5, name: 'Charlie Green', role: 'manager' }, + { id: 6, name: 'Diana White', role: 'trainee' }, + { id: 7, name: 'Ethan Black', role: 'admin' }, + { id: 8, name: 'Fiona Blue', role: 'manager' }, + { id: 9, name: 'George Gray', role: 'trainee' }, + { id: 10, name: 'Hannah Purple', role: 'trainee' }, + ]); + const [selectedTrainees, setSelectedTrainees] = useState([]); + useEffect(() => { const fetchData = async () => { /* istanbul ignore next */ @@ -52,26 +73,24 @@ const Calendar = () => { }; fetchData(); }, []); + const { t } = useTranslation(); - const renderEvent = - /* istanbul ignore next */ - (e: EventContentArg) => ( - /* istanbul ignore next */ -
${e.event.title}
${e.event.extendedProps.hostName}
${e.event.extendedProps.timeToStart} - ${e.event.extendedProps.timeToFinish}
`} - className="bg-primary text-white max-w-full min-w-full overflow-auto text-xs md:text-sm" - > -

{e.event.title}

-

{e.event.extendedProps.hostName}

-

- {e.event.extendedProps.timeToStart} -{' '} - {e.event.extendedProps.timeToFinish} -

- - - ); + const renderEvent = (e: EventContentArg) => ( +
${e.event.title}
${e.event.extendedProps.hostName}
${e.event.extendedProps.timeToStart} - ${e.event.extendedProps.timeToFinish}
`} + className="bg-primary text-white max-w-full min-w-full overflow-auto text-xs md:text-sm" + > +

{e.event.title}

+

{e.event.extendedProps.hostName}

+

+ {e.event.extendedProps.timeToStart} -{' '} + {e.event.extendedProps.timeToFinish} +

+ + + ); const removeModel = (e: any) => { e.preventDefault(); @@ -83,7 +102,6 @@ const Calendar = () => { const newState = !addEventModel; setAddEventModel(newState); }; - /* istanbul ignore next */ const handleAddEvent = (e: any) => { e.preventDefault(); @@ -104,12 +122,33 @@ const Calendar = () => { }, 1000); }; + const handleAddGuest = (traineeId: number) => { + setSelectedTrainees((prev) => + prev.includes(traineeId) + ? prev.filter((id) => id !== traineeId) + : [...prev, traineeId], + ); + }; + + const getRoleClass = (role: Trainee['role']) => { + switch (role) { + case 'admin': + return 'bg-red-500'; + case 'manager': + return 'bg-yellow-500'; + case 'trainee': + return 'bg-green-500'; + default: + return 'bg-gray-500'; + } + }; + return ( <> - {/* =========================== Start:: RegisterTraineeModel =========================== */}
@@ -119,14 +158,10 @@ const Calendar = () => {
- {/* istanbul ignore next */}
- /* istanbul ignore next */ - handleAddEvent(e) - } + className=" py-3 px-8 overflow-y-auto h-full " + onSubmit={(e) => handleAddEvent(e)} >
@@ -137,7 +172,6 @@ const Calendar = () => { className=" dark:bg-dark-tertiary border dark:text-white border-primary rounded outline-none px-5 font-sans text-xs py-2 w-full" placeholder={t('Event title')} value={newEvent.title} - // eslint-disable-next-line prettier/prettier onChange={(e) => setNewEvent({ ...newEvent, title: e.target.value }) } @@ -153,11 +187,11 @@ const Calendar = () => { className=" dark:bg-dark-tertiary dark:text-white border border-primary rounded outline-none px-5 font-sans text-xs py-2 w-full" placeholder={t('Host name')} value={newEvent.hostName} - onChange /* istanbul ignore next */={(e) => - /* istanbul ignore next */ setNewEvent({ - ...newEvent, - hostName: e.target.value, - }) + onChange={(e) => + setNewEvent({ + ...newEvent, + hostName: e.target.value, + }) } />
@@ -170,11 +204,11 @@ const Calendar = () => { placeholderText={t('Start Date')} style={{ marginRight: '10px' }} selected={newEvent.start} - onChange /* istanbul ignore next */={(start: any) => - /* istanbul ignore next */ setNewEvent({ - ...newEvent, - start, - }) + onChange={(start: any) => + setNewEvent({ + ...newEvent, + start, + }) } />
@@ -187,43 +221,104 @@ const Calendar = () => { placeholderText={t('End Date')} style={{ marginRight: '10px' }} selected={newEvent.end} - onChange=/* istanbul ignore next */ {(end: any) => - /* istanbul ignore next */ - setNewEvent({ ...newEvent, end }) - } + onChange={(end: any) => setNewEvent({ ...newEvent, end })} />
-
-
- - /* istanbul ignore next */ - setNewEvent({ ...newEvent, timeToStart: e.target.value }) - } - /> +
+
+
+ + setNewEvent({ + ...newEvent, + timeToStart: e.target.value, + }) + } + /> +
+
+ + setNewEvent({ + ...newEvent, + timeToFinish: e.target.value, + }) + } + /> +
-
-
- - /* istanbul ignore next */ - setNewEvent({ ...newEvent, timeToFinish: e.target.value }) - } - /> +
+
+ {t('Add guests')} + +
+ {showTraineeDropdown && ( +
+ {trainees.map((trainee) => ( +
+ handleAddGuest(trainee.id)} + className="mr-2" + /> + +
+ ))} +
+ )} +
+ {selectedTrainees.map((id) => { + const trainee = trainees.find((t) => t.id === id); + if (!trainee) return null; + return ( + + {trainee.name} ({trainee.role}) + + + ); + })}
@@ -243,7 +338,6 @@ const Calendar = () => {
- {/* =========================== End:: RegisterTraineeModel =============================== */}