Skip to content

Commit dcf2362

Browse files
feat: update roster to add shifts in holidays and leaves
1 parent c09ae04 commit dcf2362

File tree

1 file changed

+47
-50
lines changed

1 file changed

+47
-50
lines changed

roster/src/components/MonthViewTable.vue

Lines changed: 47 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -75,10 +75,7 @@
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;
@@ -95,44 +92,41 @@
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
321315
type 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
324323
const 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-
382378
const 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
509507
const 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

Comments
 (0)