diff --git a/apps/hub-server/modules/chron.ts b/apps/hub-server/modules/chron.ts index e07208c4..ce06df5e 100644 --- a/apps/hub-server/modules/chron.ts +++ b/apps/hub-server/modules/chron.ts @@ -80,7 +80,6 @@ const updateParticipantMoodleResults = async () => { }; export const checkFinishedParticipants = async () => { - console.log("Checking finished participants"); const participantsPending = await prisma.participant.findMany({ where: { completetionWorkflowFinished: false, @@ -95,6 +94,9 @@ export const checkFinishedParticipants = async () => { const completed = eventCompleted(p.Event, p); if (!completed) return; + console.log( + `User ${p.User.firstname} ${p.User.lastname} - ${p.User.publicId} finished event ${p.Event.name}`, + ); handleParticipantFinished(p.Event, p, p.User); }); }; @@ -103,7 +105,6 @@ CronJob.from({ cronTime: "0 * * * *", onTick: syncMoodleIds, start: true }); CronJob.from({ cronTime: "*/1 * * * *", onTick: async () => { - console.log("Updating participant moodle results"); await updateParticipantMoodleResults(); await checkFinishedParticipants(); }, diff --git a/apps/hub-server/modules/event.ts b/apps/hub-server/modules/event.ts index 94b100fe..87a14525 100644 --- a/apps/hub-server/modules/event.ts +++ b/apps/hub-server/modules/event.ts @@ -12,16 +12,23 @@ export const handleParticipantFinished = async ( }, }); + const badgedToAdd = event.finishedBadges.filter((badge) => { + return !user.badges.includes(badge); + }); + const permissionsToAdd = event.finishedPermissions.filter((permission) => { + return !user.permissions.includes(permission); + }); + await prisma.user.update({ where: { id: user.id, }, data: { badges: { - push: event.finishedBadges, + push: badgedToAdd, }, permissions: { - push: event.finishedPermissions, + push: permissionsToAdd, }, }, }); diff --git a/apps/hub/app/(app)/_components/Badges.tsx b/apps/hub/app/(app)/_components/Badges.tsx index 4cd467d6..637e58af 100644 --- a/apps/hub/app/(app)/_components/Badges.tsx +++ b/apps/hub/app/(app)/_components/Badges.tsx @@ -1,7 +1,6 @@ -import { Badge } from "@repo/ui"; - import { Award } from "lucide-react"; import { getServerSession } from "../../api/auth/[...nextauth]/auth"; +import { Badge } from "../../_components/Badge/Badge"; export const Badges = async () => { const session = await getServerSession(); @@ -15,13 +14,11 @@ export const Badges = async () => { Verdiente Abzeichen - {session.user.badges.map((badge) => { - return ( -
- -
- ); - })} +
+ {session.user.badges.map((badge, i) => { + return ; + })} +
); diff --git a/apps/hub/app/(app)/_components/Events.tsx b/apps/hub/app/(app)/_components/Events.tsx index 03e042f4..478ef34f 100644 --- a/apps/hub/app/(app)/_components/Events.tsx +++ b/apps/hub/app/(app)/_components/Events.tsx @@ -41,6 +41,26 @@ export default async () => { }, }); + const appointments = await prisma.eventAppointment.findMany({ + where: { + appointmentDate: { + gte: new Date(), + }, + }, + include: { + Participants: { + where: { + userId: user.id, + }, + }, + _count: { + select: { + Participants: true, + }, + }, + }, + }); + const filteredEvents = events.filter((event) => { console.log; if (eventCompleted(event, event.participants[0])) return false; @@ -64,6 +84,7 @@ export default async () => { {filteredEvents.map((event) => { return ( - + {/* { onSubmit={form.handleSubmit(async (values) => { setLoading(true); - const createdEvent = await upsertEvent(values, event?.id); + await upsertEvent(values, event?.id); setLoading(false); if (!event) redirect(`/admin/event`); })} @@ -201,7 +201,7 @@ export const Form = ({ event }: { event?: Event }) => { header: "Datum", accessorKey: "appointmentDate", accessorFn: (date) => - new Date(date.appointmentDate).toLocaleDateString(), + new Date(date.appointmentDate).toLocaleString(), }, { header: "Presenter", diff --git a/apps/hub/app/(app)/admin/event/_components/ParticipantModal.tsx b/apps/hub/app/(app)/admin/event/_components/ParticipantModal.tsx index 060a4cb6..369de4ca 100644 --- a/apps/hub/app/(app)/admin/event/_components/ParticipantModal.tsx +++ b/apps/hub/app/(app)/admin/event/_components/ParticipantModal.tsx @@ -4,6 +4,7 @@ import { Participant, Prisma } from "@repo/db"; import { UseFormReturn } from "react-hook-form"; import { upsertParticipant } from "../../../events/actions"; import { RefObject } from "react"; +import { deleteParticipant } from "../action"; interface ParticipantModalProps { participantForm: UseFormReturn; @@ -59,6 +60,17 @@ export const ParticipantModal = ({ ))} + diff --git a/apps/hub/app/(app)/events/_components/item.tsx b/apps/hub/app/(app)/events/_components/item.tsx index 37ea3d57..66c692ed 100644 --- a/apps/hub/app/(app)/events/_components/item.tsx +++ b/apps/hub/app/(app)/events/_components/item.tsx @@ -3,11 +3,13 @@ import { DrawingPinFilledIcon, EnterIcon } from "@radix-ui/react-icons"; import { Event, Participant, EventAppointment, User } from "@repo/db"; import ModalBtn from "./modalBtn"; import MDEditor from "@uiw/react-md-editor"; +import { Badge } from "../../../_components/Badge/Badge"; export const KursItem = ({ user, event, selectedAppointments, + appointments, }: { user: User; event: Event & { @@ -15,6 +17,7 @@ export const KursItem = ({ participants: Participant[]; }; selectedAppointments: EventAppointment[]; + appointments: EventAppointment[]; }) => { return (
@@ -45,7 +48,11 @@ export const KursItem = ({ />
-
{event.finishedBadges}
+
+ {event.finishedBadges.map((b) => { + return ; + })} +
@@ -55,10 +62,13 @@ export const KursItem = ({

{!!event.requiredBadges.length && (
- Abzeichen: + Abzeichen:
{event.requiredBadges.map((badge) => ( -
+
{badge}
))} @@ -71,7 +81,7 @@ export const KursItem = ({ user={user} event={event} title={event.name} - dates={event.appointments} + dates={appointments} participant={event.participants[0]} modalId={`${event.name}_modal.${event.id}`} /> diff --git a/apps/hub/app/(app)/events/_components/modalBtn.tsx b/apps/hub/app/(app)/events/_components/modalBtn.tsx index 2126ba04..21dd1788 100644 --- a/apps/hub/app/(app)/events/_components/modalBtn.tsx +++ b/apps/hub/app/(app)/events/_components/modalBtn.tsx @@ -8,20 +8,23 @@ import { import { Event, EventAppointment, Participant, prisma, User } from "@repo/db"; import { cn } from "../../../../helper/cn"; import { inscribeToMoodleCourse, upsertParticipant } from "../actions"; -import { Check, Clock10Icon, Cross, EyeIcon } from "lucide-react"; +import { + Check, + Clock10Icon, + Cross, + EyeIcon, + MessageCircleWarning, + TriangleAlert, +} from "lucide-react"; import { useForm } from "react-hook-form"; import { - EventAppointmentOptionalDefaults, - EventAppointmentSchema, ParticipantOptionalDefaults, ParticipantOptionalDefaultsSchema, - ParticipantSchema, } from "@repo/db/zod"; import { zodResolver } from "@hookform/resolvers/zod"; import { Select } from "../../../_components/ui/Select"; import toast from "react-hot-toast"; import { useRouter } from "next/navigation"; -import { JsonArray } from "../../../../../../packages/database/generated/client/runtime/library"; import { eventCompleted } from "@repo/ui"; interface ModalBtnProps { @@ -85,6 +88,11 @@ const ModalBtn = ({ }, }); const selectedAppointment = selectedAppointments[0]; + const selectedDate = dates.find( + (date) => + date.id === selectAppointmentForm.watch("eventAppointmentId") || + selectedAppointment?.id, + ); return ( <>
+

Bitte finde dich an diesem Termin in unserem Discord ein.

diff --git a/apps/hub/app/(app)/events/page.tsx b/apps/hub/app/(app)/events/page.tsx index 0c6f8a93..304a52cb 100644 --- a/apps/hub/app/(app)/events/page.tsx +++ b/apps/hub/app/(app)/events/page.tsx @@ -30,6 +30,25 @@ export default async () => { }, }, }); + const appointments = await prisma.eventAppointment.findMany({ + where: { + appointmentDate: { + gte: new Date(), + }, + }, + include: { + Participants: { + where: { + userId: user.id, + }, + }, + _count: { + select: { + Participants: true, + }, + }, + }, + }); const userAppointments = await prisma.eventAppointment.findMany({ where: { Participants: { @@ -51,6 +70,7 @@ export default async () => { {events.map((event) => { return ( { +export const Badge = ({ + name, + className, +}: { + name: BADGES; + className?: string; +}) => { const image = BadgeImage[name]; return ( - - + + {name} ); }; diff --git a/packages/ui/src/Badge/d-1.png b/apps/hub/app/_components/Badge/d-1.png similarity index 100% rename from packages/ui/src/Badge/d-1.png rename to apps/hub/app/_components/Badge/d-1.png diff --git a/packages/ui/src/Badge/d-2.png b/apps/hub/app/_components/Badge/d-2.png similarity index 100% rename from packages/ui/src/Badge/d-2.png rename to apps/hub/app/_components/Badge/d-2.png diff --git a/packages/ui/src/Badge/d-3.png b/apps/hub/app/_components/Badge/d-3.png similarity index 100% rename from packages/ui/src/Badge/d-3.png rename to apps/hub/app/_components/Badge/d-3.png diff --git a/packages/ui/src/Badge/day-1-member.png b/apps/hub/app/_components/Badge/day-1-member.png similarity index 100% rename from packages/ui/src/Badge/day-1-member.png rename to apps/hub/app/_components/Badge/day-1-member.png diff --git a/packages/ui/src/Badge/p-1.png b/apps/hub/app/_components/Badge/p-1.png similarity index 100% rename from packages/ui/src/Badge/p-1.png rename to apps/hub/app/_components/Badge/p-1.png diff --git a/packages/ui/src/Badge/p-2.png b/apps/hub/app/_components/Badge/p-2.png similarity index 100% rename from packages/ui/src/Badge/p-2.png rename to apps/hub/app/_components/Badge/p-2.png diff --git a/packages/ui/src/Badge/p-3.png b/apps/hub/app/_components/Badge/p-3.png similarity index 100% rename from packages/ui/src/Badge/p-3.png rename to apps/hub/app/_components/Badge/p-3.png diff --git a/packages/database/prisma/schema/user.prisma b/packages/database/prisma/schema/user.prisma index 90b11bbd..b6d137b3 100644 --- a/packages/database/prisma/schema/user.prisma +++ b/packages/database/prisma/schema/user.prisma @@ -27,7 +27,7 @@ model User { moodleId Int? @map(name: "moodle_id") emailVerified DateTime? @map(name: "email_verified") image String? - badges BADGES[] @default([]) + badges BADGES[] @unique @default([]) permissions PERMISSION[] @default([]) createdAt DateTime @default(now()) @map(name: "created_at") updatedAt DateTime @default(now()) @map(name: "updated_at") diff --git a/packages/ui/src/index.ts b/packages/ui/src/index.ts index 5c19ae83..00924967 100644 --- a/packages/ui/src/index.ts +++ b/packages/ui/src/index.ts @@ -1,2 +1 @@ -export * from "./Badge/Badge"; export * from "./helper/event";