diff --git a/TODO.md b/TODO.md
index cd8bbd06d..80cc591d3 100644
--- a/TODO.md
+++ b/TODO.md
@@ -16,9 +16,9 @@ Calendar
- [x] E2E test adding and editing event
- [x] Add winners page
- [ ] E2E test add winners page
-- [ ] Winners on the event info page
+- [x] Winners on the event info page
- [ ] There should be a banner on the list page if you have past tournaments to report
-- [ ] On the user page tab showing past results
+- [x] On the user page tab showing past results
- [ ] Translations
## Other
diff --git a/app/components/Section.tsx b/app/components/Section.tsx
index ece561687..fbe6b3440 100644
--- a/app/components/Section.tsx
+++ b/app/components/Section.tsx
@@ -3,13 +3,13 @@ export function Section({
children,
className,
}: {
- title: string;
+ title?: string;
children: React.ReactNode;
className?: string;
}) {
return (
-
{title}
+ {title &&
{title}
}
{children}
);
diff --git a/app/db/models/calendar.server.ts b/app/db/models/calendar.server.ts
index eabaeeb4b..549ee56e0 100644
--- a/app/db/models/calendar.server.ts
+++ b/app/db/models/calendar.server.ts
@@ -285,6 +285,69 @@ export function findResultsByEventId(eventId: CalendarEvent["id"]) {
return result;
}
+const findResultsByUserIdStm = sql.prepare(`
+ select
+ "CalendarEvent"."id" as "eventId",
+ "CalendarEvent"."name" as "eventName",
+ "CalendarEventResultTeam"."name" as "teamName",
+ "CalendarEventResultTeam"."placement",
+ "CalendarEvent"."participantCount",
+ (select max("startTime")
+ from "CalendarEventDate"
+ where "eventId" = "CalendarEvent"."id")
+ as "startTime"
+ from "CalendarEventResultPlayer"
+ join "CalendarEventResultTeam"
+ on "CalendarEventResultTeam"."id" = "CalendarEventResultPlayer"."teamId"
+ join "CalendarEvent"
+ on "CalendarEvent"."id" = "CalendarEventResultTeam"."eventId"
+ where "CalendarEventResultPlayer"."userId" = $userId
+ order by "startTime" desc
+`);
+
+const findMatesByResultTeamIdStm = sql.prepare(`
+ select
+ "CalendarEventResultPlayer"."name",
+ "User"."id",
+ "User"."discordName" as "discordName",
+ "User"."discordDiscriminator" as "discordDiscriminator",
+ "User"."discordId" as "discordId",
+ "User"."discordAvatar" as "discordAvatar"
+ from "CalendarEventResultPlayer"
+ join "User"
+ on "User"."id" = "CalendarEventResultPlayer"."userId"
+ where "teamId" = $teamId
+ and "userId" != $userId
+`);
+
+export function findResultsByUserId(userId: User["id"]) {
+ return (
+ findResultsByUserIdStm.all({ userId }) as Array<{
+ eventId: CalendarEvent["id"];
+ eventName: CalendarEvent["name"];
+ teamName: CalendarEventResultTeam["name"];
+ placement: CalendarEventResultTeam["placement"];
+ participantCount: CalendarEvent["participantCount"];
+ startTime: CalendarEventDate["startTime"];
+ }>
+ ).map((row) => ({
+ ...row,
+ mates: (
+ findMatesByResultTeamIdStm.all({
+ teamId: row.eventId,
+ userId,
+ }) as Array<{
+ name: CalendarEventResultPlayer["name"];
+ id: User["id"];
+ discordName: User["discordName"];
+ discordDiscriminator: User["discordDiscriminator"];
+ discordId: User["discordId"];
+ discordAvatar: User["discordAvatar"];
+ }>
+ ).map(({ name, ...mate }) => name ?? mate),
+ }));
+}
+
const findAllBetweenTwoTimestampsStm = sql.prepare(`
select
"CalendarEvent"."name",
diff --git a/app/routes/calendar/$id/index.tsx b/app/routes/calendar/$id/index.tsx
index 50aa53a96..a03605baf 100644
--- a/app/routes/calendar/$id/index.tsx
+++ b/app/routes/calendar/$id/index.tsx
@@ -26,7 +26,7 @@ import {
import styles from "~/styles/calendar-event.css";
import { databaseTimestampToDate } from "~/utils/dates";
import { notFoundIfFalsy } from "~/utils/remix";
-import { discordFullName, makeTitle } from "~/utils/strings";
+import { discordFullName, makeTitle, placementString } from "~/utils/strings";
import {
calendarEditPage,
calendarReportWinnersPage,
@@ -171,10 +171,10 @@ function Results() {