7575 'bg-gray-50':
7676 dropCell.employee === employee.name &&
7777 dropCell.date === day.date &&
78- !(
79- isHolidayOrLeave(employee.name, day.date) ||
80- hasSameShift(employee.name, day.date)
81- ),
78+ !hasSameShift(employee.name, day.date),
8279 }"
8380 @mouseenter ="
8481 hoveredCell.employee = employee.name;
9592 "
9693 @drop ="
9794 () => {
98- if (
99- !(
100- isHolidayOrLeave(employee.name, day.date) ||
101- hasSameShift(employee.name, day.date)
102- )
103- ) {
95+ if (!hasSameShift(employee.name, day.date)) {
10496 loading = true;
10597 swapShift.submit();
10698 }
10799 }
108100 "
109101 >
110- <!-- Holiday -->
111- <div
112- v-if =" events.data?.[employee.name]?.[day.date]?.holiday"
113- class =" blocked-cell"
114- >
102+ <div class =" flex flex-col space-y-1.5 translate-x-0 translate-y-0" >
103+ <!-- Holiday -->
115104 <div
116- v-html ="
117- events.data[employee.name][day.date].weekly_off
118- ? '<strong>WO</strong>'
119- : events.data[employee.name][day.date].description
120- "
121- ></div >
122- </div >
105+ v-if =" events.data?.[employee.name]?.[day.date]?.holiday"
106+ class =" blocked-cell"
107+ >
108+ <div
109+ v-html ="
110+ events.data[employee.name][day.date].holiday.weekly_off
111+ ? '<strong>WO</strong>'
112+ : events.data[employee.name][day.date].holiday
113+ .description
114+ "
115+ ></div >
116+ </div >
123117
124- <!-- Leave -->
125- <div
126- v-else-if =" events.data?.[employee.name]?.[day.date]?.leave"
127- class =" blocked-cell"
128- >
129- {{ events.data[employee.name][day.date].leave_type }}
130- </div >
118+ <!-- Leave -->
119+ <div
120+ v-else-if =" events.data?.[employee.name]?.[day.date]?.leave"
121+ class =" blocked-cell"
122+ >
123+ {{ events.data[employee.name][day.date].leave .leave_type }}
124+ </div >
131125
132- <!-- Shifts -->
133- <div v-else class =" flex flex-col space-y-1.5 translate-x-0 translate-y-0" >
126+ <!-- Shifts -->
134127 <div
135- v-for =" shift in events.data?.[employee.name]?.[day.date]"
128+ v-for =" shift in events.data?.[employee.name]?.[day.date]?.shift ||
129+ []"
136130 @mouseenter ="
137131 hoveredCell.shift = shift.name;
138132 hoveredCell.shift_type = shift.shift_type;
@@ -319,7 +313,12 @@ interface ShiftAssignment extends Shift {
319313}
320314
321315type Events = Record <string , (HolidayWithDate | LeaveApplication | ShiftAssignment )[]>;
322- type MappedEvents = Record <string , Record <string , Holiday | Leave | Shift []>>;
316+ interface DateEvents {
317+ holiday? : Holiday ;
318+ leave? : Leave ;
319+ shift? : Shift [];
320+ }
321+ type MappedEvents = Record <string , Record <string , DateEvents >>;
323322
324323const props = defineProps <{
325324 firstOfMonth: Dayjs ;
@@ -376,12 +375,9 @@ watch(loading, (val) => {
376375 if (! val ) dropCell .value = { employee: " " , date: " " , shift: " " };
377376});
378377
379- const isHolidayOrLeave = (employee : string , day : string ) =>
380- events .data ?.[employee ]?.[day ]?.holiday || events .data ?.[employee ]?.[day ]?.leave ;
381-
382378const hasSameShift = (employee : string , day : string ) =>
383- Array .isArray (events .data ?.[employee ]?.[day ]) &&
384- events .data ?.[employee ]?.[day ].some (
379+ Array .isArray (events .data ?.[employee ]?.[day ]?. shift ) &&
380+ events .data ?.[employee ]?.[day ].shift . some (
385381 (shift : Shift ) =>
386382 shift .shift_type === hoveredCell .value .shift_type &&
387383 shift .shift_location === hoveredCell .value .shift_location &&
@@ -444,21 +440,22 @@ const mapEventsToDates = (data: Events, mappedEvents: MappedEvents, employee: st
444440 const date = props .firstOfMonth .date (d );
445441 const key = date .format (" YYYY-MM-DD" );
446442
443+ mappedEvents [employee ][key ] = {};
447444 for (const event of Object .values (data [employee ])) {
448- let result: Holiday | Leave | undefined ;
445+ let result;
449446 if (" holiday" in event ) {
450447 result = handleHoliday (event , date );
451448 if (result ) {
452- mappedEvents [employee ][key ] = result ;
453- break ;
449+ mappedEvents [employee ][key ].holiday = result ;
454450 }
455451 } else if (" leave" in event ) {
456452 result = handleLeave (event , date );
457453 if (result ) {
458- mappedEvents [employee ][key ] = result ;
459- break ;
454+ mappedEvents [employee ][key ].leave = result ;
460455 }
461- } else handleShifts (event , date , mappedEvents , employee , key );
456+ } else {
457+ handleShifts (event , date , mappedEvents , employee , key );
458+ }
462459 }
463460 sortShiftsByStartTime (mappedEvents , employee , key );
464461 }
@@ -493,8 +490,9 @@ const handleShifts = (
493490 dayjs (event .start_date ).isSameOrBefore (date ) &&
494491 (dayjs (event .end_date ).isSameOrAfter (date ) || ! event .end_date )
495492 ) {
496- if (! Array .isArray (mappedEvents [employee ][key ])) mappedEvents [employee ][key ] = [];
497- mappedEvents [employee ][key ].push ({
493+ if (! Array .isArray (mappedEvents [employee ][key ].shift ))
494+ mappedEvents [employee ][key ].shift = [];
495+ mappedEvents [employee ][key ].shift .push ({
498496 name: event .name ,
499497 shift_type: event .shift_type ,
500498 shift_location: event .shift_location ,
@@ -507,10 +505,9 @@ const handleShifts = (
507505};
508506
509507const sortShiftsByStartTime = (mappedEvents : MappedEvents , employee : string , key : string ) => {
510- if (Array .isArray (mappedEvents [employee ][key ]))
511- mappedEvents [employee ][key ].sort ((a : Shift , b : Shift ) =>
512- a .start_time .localeCompare (b .start_time ),
513- );
508+ const entry = mappedEvents [employee ][key ];
509+ if (entry && typeof entry === " object" && " shift" in entry && Array .isArray (entry .shift ))
510+ entry .shift .sort ((a : Shift , b : Shift ) => a .start_time .localeCompare (b .start_time ));
514511};
515512 </script >
516513
0 commit comments