Skip to content

Commit 55577dc

Browse files
authored
Merge pull request #203 from DataScience-GT/feature/member-site
Feature: feature/member-site to dev
2 parents a1017de + 64fded1 commit 55577dc

5 files changed

Lines changed: 79 additions & 57 deletions

File tree

apphosting.yaml

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ scripts:
77
runConfig:
88
runtime: nodejs20
99
concurrency: 80
10-
cpu: 1
10+
cpu: 2
1111
memoryMiB: 1024
1212
minInstances: 0
1313
maxInstances: 10
@@ -31,17 +31,14 @@ env:
3131
value: https://datasciencegt.org
3232
- variable: NEXTAUTH_URL
3333
value: https://datasciencegt.org
34-
# Stripe Configuration
3534
- variable: STRIPE_SECRET_KEY
36-
# Project Number identifier (safe to commit) used for robust resolution
3735
secret: projects/672446353769/secrets/STRIPE_SECRET_KEY
3836
- variable: NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY
3937
secret: projects/672446353769/secrets/NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY
4038
- variable: STRIPE_WEBHOOK_SECRET
4139
secret: projects/672446353769/secrets/STRIPE_WEBHOOK_SECRET
4240
- variable: NODE_ENV
4341
value: production
44-
# Email Provider (Magic Link Login via Gmail)
4542
- variable: EMAIL_SERVER_HOST
4643
value: smtp.gmail.com
4744
- variable: EMAIL_SERVER_PORT

packages/api/src/routers/judge.ts

Lines changed: 2 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -795,20 +795,13 @@ export const judgeRouter = createTRPCRouter({
795795
})
796796
.returning();
797797

798-
// Fetch all projects for this hackathon
799798
const allProjects = await ctx.db!.query.judgingProjects.findMany({
800799
where: eq(judgingProjects.hackathonId, input.hackathonId),
801800
orderBy: [asc(judgingProjects.tableNumber)],
802801
});
803802

804-
// Filter based on track if assigned
805-
const assignedProjects = input.track
806-
? allProjects.filter((p) => {
807-
const inTracks = p.tracks?.includes(input.track!) ?? false;
808-
const inChallenges = p.challenges?.includes(input.track!) ?? false;
809-
return inTracks || inChallenges;
810-
})
811-
: allProjects;
803+
// Auto-assign all projects - judges choose what to judge
804+
const assignedProjects = allProjects;
812805

813806
if (assignedProjects.length > 0) {
814807
await ctx.db!.insert(judgeQueue).values(

sites/mainweb/app/(portal)/admin/hackathons/[id]/page.tsx

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -50,21 +50,30 @@ export default function AdminHackathonUnifiedDashboard() {
5050

5151
{/* HEADER */}
5252
<header className="relative z-10 w-full pt-8 pb-4 px-4 md:px-6 bg-[#050505]/90 backdrop-blur-md border-b border-white/5 sticky top-0 md:static">
53-
<div className="max-w-7xl mx-auto flex flex-col md:flex-row md:items-end justify-between gap-4">
54-
<div>
55-
<Link href="/admin/hackathons" className="mb-4 flex items-center gap-2 text-gray-500 hover:text-white transition-colors text-xs font-mono uppercase tracking-wider group w-fit">
56-
<svg className="w-4 h-4 transform group-hover:-translate-x-1 transition-transform" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M10 19l-7-7m0 0l7-7m-7 7h18" /></svg>
57-
Back to Hub
58-
</Link>
59-
<p className="text-[#00A8A8] font-mono text-xs tracking-[0.2em] uppercase mb-1 flex items-center gap-2">
60-
<span className="w-1.5 h-1.5 rounded-full bg-[#00A8A8] animate-pulse" />
61-
Operations Dashboard
62-
</p>
63-
<h1 className="text-3xl md:text-4xl font-black text-white uppercase tracking-tight italic">
64-
{hackathon.name}
65-
</h1>
66-
</div>
53+
<div className="max-w-7xl mx-auto flex flex-col gap-3 md:flex-row md:items-end md:justify-between">
54+
<div>
55+
<Link href="/admin/hackathons" className="mb-2 md:mb-0 flex items-center gap-2 text-gray-500 hover:text-white transition-colors text-xs font-mono uppercase tracking-wider group w-fit" aria-label="Back to hackathons hub">
56+
<svg className="w-4 h-4 shrink-0 md:scale-110" fill="none" stroke="currentColor" viewBox="0 0 24 24"><path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M10 19l-7-7m0 0l7-7m-7 7h18" /></svg>
57+
<span className="hidden md:inline">Back to Hub</span>
58+
</Link>
59+
<p className="text-[#00A8A8] font-mono text-xs tracking-[0.2em] uppercase mb-1">
60+
<span className="w-1.5 h-1.5 rounded-full bg-[#00A8A8] animate-pulse" />
61+
<span className="hidden sm:inline">Operations Dashboard</span>
62+
<span className="sm:hidden">Stats</span>
63+
</p>
64+
<h1 className="text-xl md:text-3xl lg:text-4xl font-black text-white uppercase tracking-tight italic">
65+
{hackathon.name}
66+
</h1>
6767
</div>
68+
<div className="flex flex-wrap gap-2">
69+
<Link
70+
href={`/admin/hackathons/${hackathon.id}/scanner`}
71+
className="px-3 py-2 rounded-lg bg-cyan-500/10 border border-cyan-500/30 text-cyan-400 text-xs font-medium hover:bg-cyan-500/20 active:scale-95 transition-all"
72+
>
73+
Quick Scan
74+
</Link>
75+
</div>
76+
</div>
6877
</header>
6978

7079
{/* DESKTOP TABS */}

sites/mainweb/app/(portal)/club/page.tsx

Lines changed: 46 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -207,68 +207,73 @@ export default function ClubPage() {
207207
</div>
208208

209209
{/* Navigation */}
210-
<nav className="flex flex-1 gap-2 overflow-x-auto pb-2 scrollbar-none lg:flex-col lg:pb-0">
210+
<nav className="w-full gap-2 overflow-x-auto pb-2 scrollbar-none lg:grid lg:grid-cols-5 lg:gap-3 lg:overflow-visible">
211211
<Link
212212
href="/club#general"
213-
className={`group flex shrink-0 items-center justify-center gap-3 rounded-xl border border-transparent px-6 py-4 text-sm font-bold tracking-widest transition-all duration-200 lg:w-full lg:justify-between ${
213+
className={`group flex items-center justify-center gap-2 rounded-xl border border-transparent py-3 px-4 text-sm font-bold tracking-wider transition-all duration-200 md:py-3 md:text-base ${
214214
activeTab === 'general'
215215
? 'border-green-500/20 bg-green-500/10 text-green-400 shadow-[inset_0_0_20px_rgba(34,197,94,0.05)]'
216216
: 'text-gray-500 hover:bg-white/[0.02] hover:text-white'
217217
}`}
218+
aria-label="General Events - Club gatherings with QR check-ins"
218219
>
219-
<span>General Events</span>
220+
<span>Events</span>
220221
<span
221222
className={`h-2 w-2 rounded-full transition-all ${activeTab === 'general' ? "bg-green-400 shadow-[0_0_8px_rgba(74,222,128,0.5)]" : "bg-transparent group-hover:bg-green-500/40"}`}
222223
></span>
223224
</Link>
224225
<Link
225226
href="/club#hackathons"
226-
className={`group flex shrink-0 items-center justify-center gap-3 rounded-xl border border-transparent px-6 py-4 text-sm font-bold tracking-widest transition-all duration-200 lg:w-full lg:justify-between ${
227+
className={`group flex items-center justify-center gap-2 rounded-xl border border-transparent py-3 px-4 text-sm font-bold tracking-wider transition-all duration-200 md:py-3 md:text-base ${
227228
activeTab === 'hackathons'
228229
? 'border-[#00A8A8]/20 bg-white/[0.03] text-[#00A8A8] shadow-[inset_0_0_20px_rgba(0,168,168,0.05)]'
229230
: 'text-gray-500 hover:bg-white/[0.02] hover:text-white'
230231
}`}
232+
aria-label="My Hackathons - Competition events you're registered for"
231233
>
232-
<span>My Hackathons</span>
234+
<span>Hackathons</span>
233235
<span
234236
className={`h-2 w-2 rounded-full transition-all ${activeTab === 'hackathons' ? "bg-[#00A8A8] shadow-[0_0_8px_rgba(0,168,168,0.5)]" : "bg-transparent group-hover:bg-[#00A8A8]/40"}`}
235237
></span>
236238
</Link>
237239
<Link
238240
href="/club#projects"
239-
className={`group flex shrink-0 items-center justify-center gap-3 rounded-xl border border-transparent px-6 py-4 text-sm font-bold tracking-widest transition-all duration-200 lg:w-full lg:justify-between ${
241+
className={`group flex items-center justify-center gap-2 rounded-xl border border-transparent py-3 px-4 text-sm font-bold tracking-wider transition-all duration-200 md:py-3 md:text-base ${
240242
activeTab === 'projects'
241243
? 'border-[#00A8A8]/20 bg-white/[0.03] text-[#00A8A8] shadow-[inset_0_0_20px_rgba(0,168,168,0.05)]'
242244
: 'text-gray-500 hover:bg-white/[0.02] hover:text-white'
243245
}`}
246+
aria-label="My Projects - Your submitted project entries"
244247
>
245-
<span>My Projects</span>
248+
<span>Projects</span>
246249
<span
247250
className={`h-2 w-2 rounded-full transition-all ${activeTab === 'projects' ? "bg-[#00A8A8] shadow-[0_0_8px_rgba(0,168,168,0.5)]" : "bg-transparent group-hover:bg-[#00A8A8]/40"}`}
248251
></span>
249252
</Link>
250253
<Link
251254
href="/club#history"
252-
className={`group flex shrink-0 items-center justify-center gap-3 rounded-xl border border-transparent px-6 py-4 text-sm font-bold tracking-widest transition-all duration-200 lg:w-full lg:justify-between ${
255+
className={`group flex items-center justify-center gap-2 rounded-xl border border-transparent py-3 px-4 text-sm font-bold tracking-wider transition-all duration-200 md:py-3 md:text-base ${
253256
activeTab === 'history'
254257
? 'border-[#00A8A8]/20 bg-white/[0.03] text-[#00A8A8] shadow-[inset_0_0_20px_rgba(0,168,168,0.05)]'
255258
: 'text-gray-500 hover:bg-white/[0.02] hover:text-white'
256259
}`}
260+
aria-label="Attendance History - Your event check-in records"
257261
>
258-
<span>Attendance History</span>
262+
<span>History</span>
259263
<span
260264
className={`h-2 w-2 rounded-full transition-all ${activeTab === 'history' ? "bg-[#00A8A8] shadow-[0_0_8px_rgba(0,168,168,0.5)]" : "bg-transparent group-hover:bg-[#00A8A8]/40"}`}
261265
></span>
262266
</Link>
263267
<Link
264268
href="/club#status"
265-
className={`group flex shrink-0 items-center justify-center gap-3 rounded-xl border border-transparent px-6 py-4 text-sm font-bold tracking-widest transition-all duration-200 lg:w-full lg:justify-between ${
269+
className={`group flex items-center justify-center gap-2 rounded-xl border border-transparent py-3 px-4 text-sm font-bold tracking-wider transition-all duration-200 md:py-3 md:text-base ${
266270
activeTab === 'status'
267271
? 'border-[#00A8A8]/20 bg-white/[0.03] text-[#00A8A8] shadow-[inset_0_0_20px_rgba(0,168,168,0.05)]'
268272
: 'text-gray-500 hover:bg-white/[0.02] hover:text-white'
269273
}`}
274+
aria-label="Membership Status - Your member access info"
270275
>
271-
<span>Membership</span>
276+
<span>Status</span>
272277
<span
273278
className={`h-2 w-2 rounded-full transition-all ${activeTab === 'status' ? "bg-[#00A8A8] shadow-[0_0_8px_rgba(0,168,168,0.5)]" : "bg-transparent group-hover:bg-[#00A8A8]/40"}`}
274279
></span>
@@ -299,35 +304,53 @@ export default function ClubPage() {
299304
</li>
300305
</ul>
301306
</div>
302-
<div className="mt-6 rounded-xl border border-white/5 bg-white/5 p-6">
303-
<h4 className="mb-2 font-mono text-xs font-bold tracking-widest text-white uppercase">Quick Navigation</h4>
304-
<div className="flex flex-wrap gap-2">
307+
<div className="mt-6 rounded-xl border border-white/5 bg-white/5 p-4 md:p-6">
308+
<h4 className="mb-3 flex items-center gap-2 font-mono text-xs font-bold tracking-wider text-white uppercase">
309+
<svg className="w-4 h-4" fill="none" stroke="currentColor" viewBox="0 0 24 24">
310+
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 001-1v-4a1 1 0 011-1h2a2 2 0 002-2v-4a2 2 0 00-2-2h-2a2 2 0 00-2 2v4a1 1 0 001 1zm-3 1h2" />
311+
</svg>
312+
Quick Links
313+
</h4>
314+
<div className="grid grid-cols-2 gap-3">
305315
<Link
306316
href="/hackathons"
307-
className="inline-flex items-center gap-2 rounded-lg border border-green-500/30 bg-green-500/10 px-4 py-2 text-xs font-mono text-green-400 transition-all hover:bg-green-500/20 hover:shadow-[0_0_10px_rgba(34,197,94,0.3)]"
317+
className="group flex items-center justify-center gap-2 rounded-xl border border-green-500/30 bg-green-500/10 px-4 py-3 text-sm font-medium text-green-400 transition-all hover:bg-green-500/20 active:scale-[0.98]"
318+
aria-label="Browse all hackathons and competitions"
308319
>
309-
<svg className="w-3 h-3" fill="none" stroke="currentColor" viewBox="0 0 24 24">
320+
<svg className="w-4 h-4 shrink-0" fill="none" stroke="currentColor" viewBox="0 0 24 24">
310321
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M13 10V3L4 14h7v7l9-11h-7z" />
311322
</svg>
312-
Browse Hackathons
323+
<span>Browse Hackathons</span>
313324
</Link>
314325
<Link
315326
href="/club"
316-
className="inline-flex items-center gap-2 rounded-lg border border-white/20 bg-white/5 px-4 py-2 text-xs font-mono text-white transition-all hover:bg-white/10 hover:shadow-[0_0_10px_rgba(255,255,255,0.1)]"
327+
className="group flex items-center justify-center gap-2 rounded-xl border border-white/20 bg-white/5 px-4 py-3 text-sm font-medium text-white transition-all hover:bg-white/10 active:scale-[0.98]"
328+
aria-label="Go to club events terminal"
317329
>
318-
<svg className="w-3 h-3" fill="none" stroke="currentColor" viewBox="0 0 24 24">
330+
<svg className="w-4 h-4 shrink-0" fill="none" stroke="currentColor" viewBox="0 0 24 24">
319331
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 012-2h2a2 2 0 012 2" />
320332
</svg>
321-
Club Terminal
333+
<span>Club Terminal</span>
322334
</Link>
323335
<Link
324336
href="/judge"
325-
className="inline-flex items-center gap-2 rounded-lg border border-purple-500/30 bg-purple-500/10 px-4 py-2 text-xs font-mono text-purple-400 transition-all hover:bg-purple-500/20"
337+
className="group flex items-center justify-center gap-2 rounded-xl border border-purple-500/30 bg-purple-500/10 px-4 py-3 text-sm font-medium text-purple-400 transition-all hover:bg-purple-500/20 active:scale-[0.98]"
338+
aria-label="Access judge portal"
326339
>
327-
<svg className="w-3 h-3" fill="none" stroke="currentColor" viewBox="0 0 24 24">
340+
<svg className="w-4 h-4 shrink-0" fill="none" stroke="currentColor" viewBox="0 0 24 24">
328341
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 012-2h2a2 2 0 012 2" />
329342
</svg>
330-
Judge Portal
343+
<span>Judge Portal</span>
344+
</Link>
345+
<Link
346+
href="/dashboard"
347+
className="group flex items-center justify-center gap-2 rounded-xl border border-gray-500/30 bg-gray-500/10 px-4 py-3 text-sm font-medium text-gray-400 transition-all hover:bg-gray-500/20 active:scale-[0.98]"
348+
aria-label="Return to main dashboard"
349+
>
350+
<svg className="w-4 h-4 shrink-0" fill="none" stroke="currentColor" viewBox="0 0 24 24">
351+
<path strokeLinecap="round" strokeLinejoin="round" strokeWidth={2} d="M3 12l2-2m0 0l7-7 7 7M5 10v10a1 1 0 001 1h3m10-11l2 2m-2-2v10a1 1 0 01-1 1h-3m-6 0a1 1 0 00-1 1v4a1 1 0 011 1h2a2 2 0 002-2v-4a1 1 0 001-1zm-3 1h2" />
352+
</svg>
353+
<span>Dashboard</span>
331354
</Link>
332355
</div>
333356
</div>

sites/mainweb/app/(portal)/hackathons/page.tsx

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -107,19 +107,19 @@ export default function HackathonsPage() {
107107
</div>
108108

109109
{/* Status Filter */}
110-
<div className="flex items-center bg-black/40 border border-white/5 p-1.5 rounded-xl gap-1 mb-8 overflow-x-auto">
110+
<div className="flex flex-wrap items-center bg-black/40 border border-white/5 p-2 rounded-xl gap-2 mb-6 sm:mb-8">
111111
<button
112112
onClick={() => setStatusFilter('all')}
113-
className={`px-4 py-2 rounded-lg text-sm font-semibold transition-all ${statusFilter === 'all'
113+
className={`flex-1 min-w-[120px] px-4 py-3 rounded-lg text-sm font-semibold transition-all ${statusFilter === 'all'
114114
? 'bg-cyan-500/10 text-cyan-400 border border-cyan-500/30'
115115
: 'text-gray-500 hover:text-white hover:bg-white/5'
116116
}`}
117117
>
118-
All Hackathons
118+
All
119119
</button>
120120
<button
121121
onClick={() => setStatusFilter('open')}
122-
className={`px-4 py-2 rounded-lg text-sm font-semibold transition-all ${statusFilter === 'open'
122+
className={`flex-1 min-w-[120px] px-4 py-3 rounded-lg text-sm font-semibold transition-all ${statusFilter === 'open'
123123
? 'bg-emerald-500/10 text-emerald-400 border border-emerald-500/30'
124124
: 'text-gray-500 hover:text-white hover:bg-white/5'
125125
}`}
@@ -128,7 +128,7 @@ export default function HackathonsPage() {
128128
</button>
129129
<button
130130
onClick={() => setStatusFilter('live')}
131-
className={`px-4 py-2 rounded-lg text-sm font-semibold transition-all ${statusFilter === 'live'
131+
className={`flex-1 min-w-[120px] px-4 py-3 rounded-lg text-sm font-semibold transition-all ${statusFilter === 'live'
132132
? 'bg-cyan-500/10 text-cyan-400 border border-cyan-500/30'
133133
: 'text-gray-500 hover:text-white hover:bg-white/5'
134134
}`}
@@ -137,7 +137,7 @@ export default function HackathonsPage() {
137137
</button>
138138
<button
139139
onClick={() => setStatusFilter('completed')}
140-
className={`px-4 py-2 rounded-lg text-sm font-semibold transition-all ${statusFilter === 'completed'
140+
className={`flex-1 min-w-[120px] px-4 py-3 rounded-lg text-sm font-semibold transition-all ${statusFilter === 'completed'
141141
? 'bg-white/10 text-white/60 border border-white/10'
142142
: 'text-gray-500 hover:text-white hover:bg-white/5'
143143
}`}
@@ -147,7 +147,7 @@ export default function HackathonsPage() {
147147
</div>
148148

149149
{/* Grid */}
150-
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-6">
150+
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4 sm:gap-6">
151151
{hackathons
152152
.filter((h) => {
153153
if (statusFilter === 'all') return true;

0 commit comments

Comments
 (0)