67 lines
1.9 KiB
TypeScript
67 lines
1.9 KiB
TypeScript
import { Calendar } from "lucide-react";
|
|
import { getServerSession } from "../../api/auth/[...nextauth]/auth";
|
|
import { JSX } from "react";
|
|
import { getPublicUser, prisma } from "@repo/db";
|
|
import { formatTimeRange } from "../../../helper/timerange";
|
|
|
|
export const Bookings: () => Promise<JSX.Element> = async () => {
|
|
const session = await getServerSession();
|
|
const futureBookings = await prisma.booking.findMany({
|
|
where: {
|
|
startTime: {
|
|
gte: new Date(),
|
|
lte: new Date(Date.now() + 7 * 24 * 60 * 60 * 1000),
|
|
},
|
|
},
|
|
orderBy: {
|
|
startTime: "asc",
|
|
},
|
|
include: {
|
|
User: true,
|
|
Station: true,
|
|
},
|
|
});
|
|
if (!session) return <div />;
|
|
|
|
return (
|
|
<div className="card-body">
|
|
<h2 className="card-title justify-between">
|
|
<span className="card-title">
|
|
<Calendar className="h-4 w-4" /> Zukünftige Buchungen
|
|
</span>
|
|
</h2>
|
|
<div className="flex flex-wrap gap-2">
|
|
{futureBookings.length === 0 && (
|
|
<span className="text-sm text-gray-500">
|
|
Keine zukünftigen Buchungen. Du kannst dir welche im Buchungssystem erstellen.
|
|
</span>
|
|
)}
|
|
{futureBookings.map((booking) => {
|
|
return (
|
|
<div
|
|
key={booking.id}
|
|
className={`alert alert-horizontal ${booking.type.startsWith("LST_") ? "alert-success" : "alert-info"} alert-soft px-3 py-2`}
|
|
>
|
|
<div className="flex items-center gap-3">
|
|
<span className="badge badge-outline text-xs">
|
|
{booking.type.startsWith("LST_")
|
|
? "LST"
|
|
: booking.Station?.bosCallsignShort || booking.Station?.bosCallsign}
|
|
</span>
|
|
<span className="text-sm font-medium">{getPublicUser(booking.User).fullName}</span>
|
|
</div>
|
|
<div className="flex items-center gap-2">
|
|
<div className="text-right">
|
|
<p className="text-xs font-medium">
|
|
{formatTimeRange(booking, { includeDate: true })}
|
|
</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
);
|
|
})}
|
|
</div>
|
|
</div>
|
|
);
|
|
};
|