From e252f349bb7d23fd377bb32390b9580b8dd59466 Mon Sep 17 00:00:00 2001 From: Jesus Gonzalez Date: Mon, 16 Feb 2026 16:02:41 -0500 Subject: [PATCH 1/5] Removed the forced pagination of any component that called getMembers Removed Confetti Component references from raffle-draw since it was removed in the "Component Refactor" PR Ran Format, Lint, Typecheck --- .../admin/banquet-raffle/raffle-draw.tsx | 18 +------------ .../app/admin/forms/[slug]/responses/page.tsx | 1 - packages/api/src/routers/member.ts | 26 +++++++++++++------ packages/api/src/utils.ts | 7 ++--- 4 files changed, 21 insertions(+), 31 deletions(-) diff --git a/apps/blade/src/app/_components/admin/banquet-raffle/raffle-draw.tsx b/apps/blade/src/app/_components/admin/banquet-raffle/raffle-draw.tsx index 3179ddda7..d0f30dfc5 100644 --- a/apps/blade/src/app/_components/admin/banquet-raffle/raffle-draw.tsx +++ b/apps/blade/src/app/_components/admin/banquet-raffle/raffle-draw.tsx @@ -4,11 +4,10 @@ /* eslint-disable @typescript-eslint/no-unsafe-member-access */ /* eslint-disable @typescript-eslint/no-unnecessary-condition */ /* eslint-disable @typescript-eslint/no-empty-function */ -/* eslint-disable @typescript-eslint/no-unsafe-call */ + "use client"; import { useEffect, useRef, useState } from "react"; -import confetti from "canvas-confetti"; import { Sparkles, Trophy, Volume2, VolumeX } from "lucide-react"; import { Button } from "@forge/ui/button"; @@ -233,21 +232,6 @@ export default function RaffleDraw({ entries }: { entries: RaffleEntry[] }) { const finalEntry = visibleEntries[mid]; setWinner(finalEntry ?? null); playWinnerSound(); - - // Confetti - if (containerRef.current) { - const rect = containerRef.current.getBoundingClientRect(); - void confetti({ - particleCount: 150, - spread: 90, - origin: { - x: - rect.left / window.innerWidth + - rect.width / window.innerWidth / 2, - y: rect.top / window.innerHeight, - }, - }); - } } }, animationSpeed); diff --git a/apps/blade/src/app/admin/forms/[slug]/responses/page.tsx b/apps/blade/src/app/admin/forms/[slug]/responses/page.tsx index 1f9576dd8..361b4f53f 100644 --- a/apps/blade/src/app/admin/forms/[slug]/responses/page.tsx +++ b/apps/blade/src/app/admin/forms/[slug]/responses/page.tsx @@ -17,7 +17,6 @@ export default async function FormResponsesPage({ }: { params: { slug: string }; }) { - // eslint-disable-next-line @typescript-eslint/no-unsafe-assignment const session = await auth(); if (!session) { redirect(SIGN_IN_PATH); diff --git a/packages/api/src/routers/member.ts b/packages/api/src/routers/member.ts index 2cbd61a83..3df920975 100644 --- a/packages/api/src/routers/member.ts +++ b/packages/api/src/routers/member.ts @@ -353,10 +353,20 @@ export const memberRouter = { .query(async ({ input, ctx }) => { controlPerms.or(["READ_MEMBERS", "READ_CLUB_DATA"], ctx); - const currentPage = input?.currentPage ?? 1; - const pageSize = input?.pageSize ?? 10; + if ( + typeof input?.currentPage === "undefined" && + typeof input?.pageSize === "undefined" && + typeof input?.searchTerm === "undefined" && + typeof input?.schoolFilter === "undefined" && + typeof input?.majorFilter === "undefined" + ) { + return db.query.Member.findMany(); + } + + const currentPage = input.currentPage ?? 1; + const pageSize = input.pageSize ?? 10; const offset = (currentPage - 1) * pageSize; - const searchPattern = `%${input?.searchTerm ?? ""}%`; + const searchPattern = `%${input.searchTerm ?? ""}%`; // Build the base query let query = db.select().from(Member); @@ -364,7 +374,7 @@ export const memberRouter = { // Build conditions array const conditions = []; - if (input?.searchTerm && input.searchTerm.length > 0) { + if (input.searchTerm && input.searchTerm.length > 0) { conditions.push( or( ilike(Member.firstName, searchPattern), @@ -377,7 +387,7 @@ export const memberRouter = { ); } - if (input?.schoolFilter) { + if (input.schoolFilter) { conditions.push( eq( Member.school, @@ -386,7 +396,7 @@ export const memberRouter = { ); } - if (input?.majorFilter) { + if (input.majorFilter) { conditions.push( eq( Member.major, @@ -400,7 +410,7 @@ export const memberRouter = { } // Sorting - if (input?.sortByTime) { + if (input.sortByTime) { query = query.orderBy( input.sortOrder === "desc" ? desc(Member.dateCreated) @@ -409,7 +419,7 @@ export const memberRouter = { ? desc(Member.timeCreated) : asc(Member.timeCreated), ) as typeof query; - } else if (input?.sortField && input.sortOrder) { + } else if (input.sortField && input.sortOrder) { const sortColumn = Member[input.sortField]; query = query.orderBy( input.sortOrder === "asc" ? asc(sortColumn) : desc(sortColumn), diff --git a/packages/api/src/utils.ts b/packages/api/src/utils.ts index 2c9863016..5d3d7f3f8 100644 --- a/packages/api/src/utils.ts +++ b/packages/api/src/utils.ts @@ -10,14 +10,11 @@ import Stripe from "stripe"; import z from "zod"; import type { Session } from "@forge/auth/server"; +import type { Form } from "@forge/db/schemas/knight-hacks"; import { DISCORD, EVENTS, FORMS, MINIO, PERMISSIONS } from "@forge/consts"; import { db } from "@forge/db/client"; import { JudgeSession, Roles } from "@forge/db/schemas/auth"; -import { - Form, - FormSchemaSchema, - FormsSchemas, -} from "@forge/db/schemas/knight-hacks"; +import { FormSchemaSchema, FormsSchemas } from "@forge/db/schemas/knight-hacks"; import { client } from "@forge/email"; import { env } from "./env"; From 4e16f17d4d1eb1d2378cc6fb6d8447c0769e4f56 Mon Sep 17 00:00:00 2001 From: Jesus Gonzalez Date: Mon, 16 Feb 2026 16:23:53 -0500 Subject: [PATCH 2/5] Adjusted code to coderabbit suggestion and MILLION suggestion --- packages/api/src/routers/member.ts | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/packages/api/src/routers/member.ts b/packages/api/src/routers/member.ts index 3df920975..4ae131247 100644 --- a/packages/api/src/routers/member.ts +++ b/packages/api/src/routers/member.ts @@ -354,11 +354,13 @@ export const memberRouter = { controlPerms.or(["READ_MEMBERS", "READ_CLUB_DATA"], ctx); if ( - typeof input?.currentPage === "undefined" && - typeof input?.pageSize === "undefined" && - typeof input?.searchTerm === "undefined" && - typeof input?.schoolFilter === "undefined" && - typeof input?.majorFilter === "undefined" + input?.currentPage === undefined && + input?.pageSize === undefined && + input?.searchTerm === undefined && + input?.schoolFilter === undefined && + input?.majorFilter === undefined && + input?.sortField === undefined && + input?.sortByTime === undefined ) { return db.query.Member.findMany(); } From 9513139c5ac90b45cfefe1a75efbf2d4fd39c0d6 Mon Sep 17 00:00:00 2001 From: Jesus Gonzalez Date: Mon, 16 Feb 2026 16:28:43 -0500 Subject: [PATCH 3/5] Ran format --- packages/api/src/routers/member.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/api/src/routers/member.ts b/packages/api/src/routers/member.ts index 4ae131247..2573db5b7 100644 --- a/packages/api/src/routers/member.ts +++ b/packages/api/src/routers/member.ts @@ -358,8 +358,8 @@ export const memberRouter = { input?.pageSize === undefined && input?.searchTerm === undefined && input?.schoolFilter === undefined && - input?.majorFilter === undefined && - input?.sortField === undefined && + input?.majorFilter === undefined && + input?.sortField === undefined && input?.sortByTime === undefined ) { return db.query.Member.findMany(); From 6df30091674c1ad33e171c0788370b6e5c8e7adb Mon Sep 17 00:00:00 2001 From: Jesus Gonzalez Date: Mon, 16 Feb 2026 19:47:00 -0500 Subject: [PATCH 4/5] Added coderabbits suggestions Added option to pass in Infinity for page size to get all members (for alex) --- .../admin/club/data/MemberDemographics.tsx | 4 +++- packages/api/src/routers/member.ts | 13 +++++++++++-- 2 files changed, 14 insertions(+), 3 deletions(-) diff --git a/apps/blade/src/app/_components/admin/club/data/MemberDemographics.tsx b/apps/blade/src/app/_components/admin/club/data/MemberDemographics.tsx index 8fda1163d..af1c7ca32 100644 --- a/apps/blade/src/app/_components/admin/club/data/MemberDemographics.tsx +++ b/apps/blade/src/app/_components/admin/club/data/MemberDemographics.tsx @@ -13,7 +13,9 @@ import ShirtSizePie from "./member-data/ShirtSizePie"; import YearOfStudyPie from "./member-data/YearOfStudyPie"; export default function MemberDemographics() { - const { data: members } = api.member.getMembers.useQuery(); + const { data: members } = api.member.getMembers.useQuery({ + pageSize: Infinity, + }); const { data: duesPayingStatus } = api.member.getDuesPayingMembers.useQuery(); const { data: events } = api.event.getEvents.useQuery(); const { data: duesPaymentDates } = diff --git a/packages/api/src/routers/member.ts b/packages/api/src/routers/member.ts index 2573db5b7..8f5b4556f 100644 --- a/packages/api/src/routers/member.ts +++ b/packages/api/src/routers/member.ts @@ -332,7 +332,7 @@ export const memberRouter = { z .object({ currentPage: z.number().min(1).optional(), - pageSize: z.number().min(1).max(100).optional(), + pageSize: z.number().min(1).optional(), searchTerm: z.string().optional(), sortField: z .enum([ @@ -362,7 +362,16 @@ export const memberRouter = { input?.sortField === undefined && input?.sortByTime === undefined ) { - return db.query.Member.findMany(); + return db.query.Member.findMany({ + orderBy: (member, { asc }) => asc(member.id), + }); + } + + // Optional choice pageSize = Infinity + if (input.pageSize === Infinity) { + return db.query.Member.findMany({ + orderBy: (member, { asc }) => asc(member.id), + }); } const currentPage = input.currentPage ?? 1; From d12440b2424c9e206a6cce49a18599dd339a2f4c Mon Sep 17 00:00:00 2001 From: Jesus Gonzalez Date: Mon, 16 Feb 2026 20:44:50 -0500 Subject: [PATCH 5/5] Removed passing in Infinity, instead set fetchAll to true, Ran format, lint, typecheck --- .../admin/club/data/MemberDemographics.tsx | 2 +- packages/api/src/routers/member.ts | 67 ++++++++++--------- 2 files changed, 35 insertions(+), 34 deletions(-) diff --git a/apps/blade/src/app/_components/admin/club/data/MemberDemographics.tsx b/apps/blade/src/app/_components/admin/club/data/MemberDemographics.tsx index af1c7ca32..0d2273e00 100644 --- a/apps/blade/src/app/_components/admin/club/data/MemberDemographics.tsx +++ b/apps/blade/src/app/_components/admin/club/data/MemberDemographics.tsx @@ -14,7 +14,7 @@ import YearOfStudyPie from "./member-data/YearOfStudyPie"; export default function MemberDemographics() { const { data: members } = api.member.getMembers.useQuery({ - pageSize: Infinity, + fetchAll: true, }); const { data: duesPayingStatus } = api.member.getDuesPayingMembers.useQuery(); const { data: events } = api.event.getEvents.useQuery(); diff --git a/packages/api/src/routers/member.ts b/packages/api/src/routers/member.ts index 8f5b4556f..0d0644761 100644 --- a/packages/api/src/routers/member.ts +++ b/packages/api/src/routers/member.ts @@ -330,47 +330,48 @@ export const memberRouter = { getMembers: permProcedure .input( z - .object({ - currentPage: z.number().min(1).optional(), - pageSize: z.number().min(1).optional(), - searchTerm: z.string().optional(), - sortField: z - .enum([ - "firstName", - "lastName", - "email", - "discordUser", - "dateCreated", - ]) - .optional(), - sortOrder: z.enum(["desc", "asc"]).optional(), - sortByTime: z.boolean().optional(), - schoolFilter: z.string().optional(), - majorFilter: z.string().optional(), - }) + .union([ + z.object({ + fetchAll: z.literal(true), + }), + z.object({ + fetchAll: z.literal(false).optional(), + currentPage: z.number().min(1).optional(), + pageSize: z.number().min(1).optional(), + searchTerm: z.string().optional(), + sortField: z + .enum([ + "firstName", + "lastName", + "email", + "discordUser", + "dateCreated", + ]) + .optional(), + sortOrder: z.enum(["desc", "asc"]).optional(), + sortByTime: z.boolean().optional(), + schoolFilter: z.string().optional(), + majorFilter: z.string().optional(), + }), + ]) .optional(), ) .query(async ({ input, ctx }) => { controlPerms.or(["READ_MEMBERS", "READ_CLUB_DATA"], ctx); + // If theres a fetch all flag set to true OR no inputs are passed in get all members if ( - input?.currentPage === undefined && - input?.pageSize === undefined && - input?.searchTerm === undefined && - input?.schoolFilter === undefined && - input?.majorFilter === undefined && - input?.sortField === undefined && - input?.sortByTime === undefined + input?.fetchAll || + (input?.currentPage === undefined && + input?.pageSize === undefined && + input?.searchTerm === undefined && + input?.schoolFilter === undefined && + input?.majorFilter === undefined && + input?.sortField === undefined && + input?.sortByTime === undefined) ) { return db.query.Member.findMany({ - orderBy: (member, { asc }) => asc(member.id), - }); - } - - // Optional choice pageSize = Infinity - if (input.pageSize === Infinity) { - return db.query.Member.findMany({ - orderBy: (member, { asc }) => asc(member.id), + orderBy: asc(Member.id), }); }