Added custom render event on timetable

This commit is contained in:
sianida26 2024-06-25 03:25:22 +07:00
parent 4c3b66b2b5
commit 96412d49f7
2 changed files with 55 additions and 46 deletions

View File

@ -12,6 +12,7 @@ type Props = {
endTime: dayjs.Dayjs; endTime: dayjs.Dayjs;
events: Event[]; events: Event[];
renderCell?: (events: Event[]) => JSX.Element; renderCell?: (events: Event[]) => JSX.Element;
renderEvent?: (event: Event) => JSX.Element;
}; };
export default function DayColumn({ export default function DayColumn({
@ -20,6 +21,7 @@ export default function DayColumn({
endTime, endTime,
events, events,
renderCell, renderCell,
renderEvent,
}: Props) { }: Props) {
const isToday = day.isSame(dayjs(), "day"); const isToday = day.isSame(dayjs(), "day");
@ -40,7 +42,7 @@ export default function DayColumn({
return ( return (
// Base Cell // Base Cell
<div key={i} className="border-t h-20"> <div key={i} className="border-t h-20 relative">
{renderCell ? ( {renderCell ? (
<div className="w-full h-full relative"> <div className="w-full h-full relative">
{renderCell( {renderCell(
@ -66,7 +68,11 @@ export default function DayColumn({
)} )}
</div> </div>
) : ( ) : (
<div className="flex pr-1.5 w-full gap-1 relative hover:bg-gray-100 h-full"> <button className="flex pr-1.5 w-full gap-1 relative hover:bg-gray-100 h-full"></button>
)}
{/* Events Container */}
<div className="absolute w-full h-full top-0 left-0 flex gap-1 pr-1.5 pointer-events-none">
{events {events
.filter((event) => { .filter((event) => {
return ( return (
@ -74,12 +80,8 @@ export default function DayColumn({
event.start, event.start,
"hour" "hour"
) || ) ||
(currentDateTime.isAfter( (currentDateTime.isAfter(event.start) &&
event.start currentDateTime.isBefore(event.end))
) &&
currentDateTime.isBefore(
event.end
))
); );
}) })
.map((event, i) => .map((event, i) =>
@ -89,7 +91,7 @@ export default function DayColumn({
) ? ( ) ? (
<div <div
key={i} key={i}
className="bg-primary-100 rounded-sm text-sm text-left pl-1 text-primary-800 font-medium w-full z-10 relative" className="w-full z-10 relative pointer-events-auto"
style={{ style={{
minHeight: "min-content", minHeight: "min-content",
@ -108,14 +110,19 @@ export default function DayColumn({
top: `${(event.start.minute() * 100) / 60}%`, top: `${(event.start.minute() * 100) / 60}%`,
}} }}
> >
{renderEvent ? (
renderEvent(event)
) : (
<button className="bg-primary-100 rounded-sm text-sm text-left pl-1 text-primary-800 font-medium w-full h-full flex items-start justify-start">
{event.title} {event.title}
</button>
)}
</div> </div>
) : ( ) : (
<div className="w-full"></div> <div className="w-full"></div>
) )
)} )}
</div> </div>
)}
</div> </div>
); );
})} })}

View File

@ -17,6 +17,7 @@ type Props = {
endTime?: dayjs.Dayjs; endTime?: dayjs.Dayjs;
events: Event[]; events: Event[];
renderCell?: (events: Event[]) => JSX.Element; renderCell?: (events: Event[]) => JSX.Element;
renderEvent?: (event: Event) => JSX.Element;
}; };
export default function Timetable({ events, ...props }: Props) { export default function Timetable({ events, ...props }: Props) {
@ -94,6 +95,7 @@ export default function Timetable({ events, ...props }: Props) {
startTime={startTime} startTime={startTime}
endTime={endTime} endTime={endTime}
renderCell={props.renderCell} renderCell={props.renderCell}
renderEvent={props.renderEvent}
/> />
))} ))}
</div> </div>