From 92dff8f3c9162ebb5d007c21ea0dab6e190d97c7 Mon Sep 17 00:00:00 2001
From: PxlLoewe <72106766+PxlLoewe@users.noreply.github.com>
Date: Mon, 10 Mar 2025 23:29:02 -0700
Subject: [PATCH] added Badges to Dashboard, warning for full events
---
apps/hub-server/modules/chron.ts | 5 ++-
apps/hub-server/modules/event.ts | 11 ++++-
apps/hub/app/(app)/_components/Badges.tsx | 15 +++----
apps/hub/app/(app)/_components/Events.tsx | 21 +++++++++
.../event/_components/AppointmentModal.tsx | 8 +++-
.../(app)/admin/event/_components/Form.tsx | 4 +-
.../event/_components/ParticipantModal.tsx | 12 ++++++
.../hub/app/(app)/events/_components/item.tsx | 18 ++++++--
.../app/(app)/events/_components/modalBtn.tsx | 40 +++++++++++++++---
apps/hub/app/(app)/events/page.tsx | 20 +++++++++
.../hub/app/_components}/Badge/Badge.tsx | 15 +++++--
.../hub/app/_components}/Badge/d-1.png | Bin
.../hub/app/_components}/Badge/d-2.png | Bin
.../hub/app/_components}/Badge/d-3.png | Bin
.../app/_components}/Badge/day-1-member.png | Bin
.../hub/app/_components}/Badge/p-1.png | Bin
.../hub/app/_components}/Badge/p-2.png | Bin
.../hub/app/_components}/Badge/p-3.png | Bin
packages/database/prisma/schema/user.prisma | 2 +-
packages/ui/src/index.ts | 1 -
20 files changed, 141 insertions(+), 31 deletions(-)
rename {packages/ui/src => apps/hub/app/_components}/Badge/Badge.tsx (62%)
rename {packages/ui/src => apps/hub/app/_components}/Badge/d-1.png (100%)
rename {packages/ui/src => apps/hub/app/_components}/Badge/d-2.png (100%)
rename {packages/ui/src => apps/hub/app/_components}/Badge/d-3.png (100%)
rename {packages/ui/src => apps/hub/app/_components}/Badge/day-1-member.png (100%)
rename {packages/ui/src => apps/hub/app/_components}/Badge/p-1.png (100%)
rename {packages/ui/src => apps/hub/app/_components}/Badge/p-2.png (100%)
rename {packages/ui/src => apps/hub/app/_components}/Badge/p-3.png (100%)
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 (
<>