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/_components/admin/club/data/MemberDemographics.tsx b/apps/blade/src/app/_components/admin/club/data/MemberDemographics.tsx index 8fda1163d..0d2273e00 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({ + fetchAll: true, + }); const { data: duesPayingStatus } = api.member.getDuesPayingMembers.useQuery(); const { data: events } = api.event.getEvents.useQuery(); const { data: duesPaymentDates } = 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..0d0644761 100644 --- a/packages/api/src/routers/member.ts +++ b/packages/api/src/routers/member.ts @@ -330,33 +330,55 @@ export const memberRouter = { getMembers: permProcedure .input( z - .object({ - currentPage: z.number().min(1).optional(), - pageSize: z.number().min(1).max(100).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); - const currentPage = input?.currentPage ?? 1; - const pageSize = input?.pageSize ?? 10; + // If theres a fetch all flag set to true OR no inputs are passed in get all members + if ( + 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: asc(Member.id), + }); + } + + 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 +386,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 +399,7 @@ export const memberRouter = { ); } - if (input?.schoolFilter) { + if (input.schoolFilter) { conditions.push( eq( Member.school, @@ -386,7 +408,7 @@ export const memberRouter = { ); } - if (input?.majorFilter) { + if (input.majorFilter) { conditions.push( eq( Member.major, @@ -400,7 +422,7 @@ export const memberRouter = { } // Sorting - if (input?.sortByTime) { + if (input.sortByTime) { query = query.orderBy( input.sortOrder === "desc" ? desc(Member.dateCreated) @@ -409,7 +431,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";