Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
65 commits
Select commit Hold shift + click to select a range
6558d39
feat: make Panel collapsible
Isoscelestial Feb 5, 2026
a6303c6
feat: use new collapsing panel system for club listing officers panel…
Isoscelestial Feb 6, 2026
872436d
chore(panel): cleanup comments, more logical callback function callin…
Isoscelestial Feb 6, 2026
b68be2e
fix(panel): add slotClassNames prop to resolve inconsistent absolutel…
Isoscelestial Feb 6, 2026
4e11b04
add: transparent and conditionally transparent panels
Isoscelestial Feb 13, 2026
4e25efe
Merge branch 'feature/improved-panels' into feature/redesigned-events…
Isoscelestial Feb 14, 2026
b697be1
add(events): begin implementing redesigned events directory page
Isoscelestial Feb 14, 2026
4f2692e
feat(events): move events directory tab switcher to layout
Isoscelestial Feb 14, 2026
6216dcb
fix(events): tab switcher forgetting selected tab when page refreshed
Isoscelestial Feb 14, 2026
5c542fa
feat(events): begin implementing UI for events directory page body
Isoscelestial Feb 14, 2026
5cb9a9d
feat(events): add filter list for time and location filters; begin ad…
Isoscelestial Feb 15, 2026
b554667
fix(events): fix modal and layout styles
Isoscelestial Feb 15, 2026
6168fbf
feat(events): add custom date pickers
Isoscelestial Feb 15, 2026
7af9cd4
feat: temporarily modify events.byDateRange to also return club data
Isoscelestial Feb 18, 2026
12033e6
feat(events): add view options bar
Isoscelestial Feb 18, 2026
7b07f50
fix(events): stop clear button triggering exclusion on filter list
Isoscelestial Feb 21, 2026
153c521
feat(events): begin adding filter tags
Isoscelestial Feb 21, 2026
8131576
feat(events): begin adding event filter schema; add URL query params …
Isoscelestial Feb 23, 2026
95eaea4
feat(events): split panels into memoized components, add location inc…
Isoscelestial Mar 1, 2026
d581836
fix(events): unstable objects causing re-renders, missing location ex…
Isoscelestial Mar 1, 2026
d0e4d78
feat: useFilterFieldsMemo wrapper hook for useMemo
Isoscelestial Mar 1, 2026
43be82b
feat: add keybinds to toggle sidebar and change page
Isoscelestial Mar 1, 2026
82abfa0
feat(events): tags filter
Isoscelestial Mar 1, 2026
8c93823
feat(events): date filter
Isoscelestial Mar 1, 2026
8025dbe
fix: stabilize tags filter panel
Isoscelestial Mar 2, 2026
c805d27
fix: set param's custom dateStart and dateEnd if their state has a value
Isoscelestial Mar 2, 2026
ffce070
refactor: setParams function to easily set the URL search params, add…
Isoscelestial Mar 2, 2026
a774a06
feat(events): filters bar, improve useFilterFieldsMemo, use prop dril…
Isoscelestial Mar 9, 2026
fa7b687
refactor: type safe wrapper class for URLSearchParams with callback f…
Isoscelestial Mar 9, 2026
715a1c7
feat(events): fully functional filters bar
Isoscelestial Mar 9, 2026
48e548d
chore: lint and format
Isoscelestial Mar 9, 2026
fa5a9f2
feat(events): better mobile pagination input field
Isoscelestial Mar 11, 2026
2ef78d0
fix: /events tabs not set on navigate; FilterList exclusion visibilit…
Isoscelestial Mar 11, 2026
befc860
git ignore .vscode
Isoscelestial Mar 11, 2026
1c797cd
feat(events): view options
Isoscelestial Mar 13, 2026
d86b60f
fix(events): hotkey responsiveness, round date days, move sidebar but…
Isoscelestial Mar 17, 2026
6f39271
feat(events): clear all filters buttons
Isoscelestial Mar 17, 2026
ea83b1c
feat(events): search bar
Isoscelestial Mar 18, 2026
ddc15c9
feat(events): misc. style tweaks
Isoscelestial Mar 18, 2026
2eb8e0e
fix(events): misc fixes and refactors
Isoscelestial Mar 23, 2026
a3436b3
feat(events): dirty state for filter chip
Isoscelestial Mar 24, 2026
21c3af1
feat(events): clear query field button, pagination on bottom of page
Isoscelestial Mar 30, 2026
f7672cd
feat(events): API query calls, begin rewriting findByFilters procedur…
Isoscelestial Mar 31, 2026
c7fff62
feat(events): sort by recency when viewing past events
Isoscelestial Mar 31, 2026
18ed6ef
fix(events): go to first page when filters change
Isoscelestial Mar 31, 2026
c3457bf
feat(events): pagination response
Isoscelestial Mar 31, 2026
bf1281e
feat(events): use SQL select rather than Drizzle query, implement tag…
Isoscelestial Apr 1, 2026
b616e36
feat(events): performance improvements, loading state, framer motion,…
Isoscelestial Apr 2, 2026
218b0ec
feat(events): use SwipeableDrawer instead of Modal for mobile filters…
Isoscelestial Apr 5, 2026
0ce8c81
feat(events): implement clubs filter, add placeholder for query and l…
Isoscelestial Apr 5, 2026
080942e
fix(events): default export for useStable, responsive event cards
Isoscelestial Apr 5, 2026
1e6b52f
fix(events): make event search bar work by adding schema index
Isoscelestial Apr 5, 2026
51c7c3d
feat(events): change view layout
Isoscelestial Apr 5, 2026
5d396e9
fix(events): don't refetch on mount if server fetched already, displa…
Isoscelestial Apr 5, 2026
a27ad9e
feat(events): add event count to header, comment out calendar feed su…
Isoscelestial Apr 5, 2026
dc39cc8
fix(events): improved error handling
Isoscelestial Apr 5, 2026
3b68782
feat(events): abstract setParams, create ParamSetter class, move rela…
Isoscelestial Apr 5, 2026
257e0fb
feat(events): change z index of sentry feedback button instead of hid…
Isoscelestial Apr 5, 2026
8dd2bf2
fix(events): use store instead of raising state, which caused infinit…
Isoscelestial Apr 6, 2026
e4e905b
chore: remove deprecated schemas from eventFilter.ts
Isoscelestial Apr 6, 2026
de2f0f9
feat(events): add snackbar when using a filter that requires being si…
Isoscelestial Apr 6, 2026
9337ecf
Merge branch 'develop' into feature/redesigned-events-directory
Isoscelestial Apr 6, 2026
5ecdbd2
fix: merge errors
Isoscelestial Apr 6, 2026
ba3d5ba
refactor: combine ClubTagEdit and ClubTagFilter
Isoscelestial Apr 6, 2026
d0fa490
refactor(events): improved querying for registered events and joined …
Isoscelestial Apr 6, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -41,3 +41,4 @@ yarn-error.log*

.idea
.neon
.vscode
2 changes: 1 addition & 1 deletion src/app/admin/clubs/[slug]/events/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ export default async function Page({ params, searchParams }: Props) {
includePast,
currentTime: now,
}),
api.event.countByClubId({
api.event.count({
clubId: club.id,
includePast,
currentTime: now,
Expand Down
5 changes: 3 additions & 2 deletions src/app/directory/create/CreateClubForm.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@
import { useMutation } from '@tanstack/react-query';
import { useRouter } from 'next/navigation';
import { z } from 'zod';
import ClubTagAutocomplete from '@src/components/club/ClubTagAutocomplete';
import Panel from '@src/components/common/Panel';
import { ClubTagEdit } from '@src/components/manage/form/ClubTagEdit';
import { useTRPC } from '@src/trpc/react';
import { useAppForm } from '@src/utils/form';
import { createClubSchema } from '@src/utils/formSchemas';
Expand Down Expand Up @@ -79,7 +79,8 @@ const CreateClubForm = () => {
</form.AppField>
<form.Field name="tags">
{(field) => (
<ClubTagEdit
<ClubTagAutocomplete
allowAddingOptions
value={field.state.value}
onChange={(value) => {
field.handleChange(value);
Expand Down
14 changes: 14 additions & 0 deletions src/app/events/(directory)/calendar/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
const Events = async () => {
return (
<main className="font-bold relative select-none h-72">
<h1 className="absolute top-1/2 left-1/2 -translate-x-1/2 -translate-y-1/2 text-[200px] text-slate-200 dark:text-slate-800">
WIP
</h1>
<h2 className="absolute bottom-1/2 left-1/2 -translate-x-1/2 translate-y-20 text-3xl text-slate-800 dark:text-slate-200">
Coming soon!
</h2>
</main>
);
};

export default Events;
22 changes: 22 additions & 0 deletions src/app/events/(directory)/layout.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import { ReactNode } from 'react';
import EventsTitle from '@src/components/events/directory/EventsTitle';
import { EventHeader } from '@src/components/header/Header';

type EventDirectoryLayoutProps = {
children: ReactNode;
};

export default async function EventDirectoryLayout({
children,
}: EventDirectoryLayoutProps) {
return (
<>
<EventHeader />
<main className="mb-5 flex flex-col sm:px-4 max-w-6xl mx-auto">
{/* EventsTitle should be in layout.tsx so that it doesn't re-render between pages */}
<EventsTitle />
<div className="flex flex-col gap-y-4 max-sm:px-4">{children}</div>
</main>
</>
);
}
47 changes: 47 additions & 0 deletions src/app/events/(directory)/page.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
import { type Metadata } from 'next';
import { redirect } from 'next/navigation';
import EventsBody from '@src/components/events/directory/EventsBody';
import { api } from '@src/trpc/server';
import { eventFiltersSchema, EventParamsSchema } from '@src/utils/eventFilter';

export const metadata: Metadata = {
title: 'Events',
description: 'The place to find events at UTD.',
alternates: {
canonical: 'https://clubs.utdnebula.com/events',
},
openGraph: {
url: 'https://clubs.utdnebula.com/events',
description: 'The place to find events at UTD.',
},
};
const Events = async (props: { searchParams: Promise<EventParamsSchema> }) => {
const searchParams = await props.searchParams;
const parsed = eventFiltersSchema.parse(searchParams);

// Server-side query to avoid client-side fetching on load
const results = await Promise.allSettled([
api.event.findByFilters({ filters: parsed }),
api.event.count({ includePast: true }),
]);

const initialEvents =
results[0].status === 'fulfilled' ? results[0].value : undefined;
const count = results[1].status === 'fulfilled' ? results[1].value : 0;

// If error fetching events with current filters, clear all filters and reload page
if (
results[0].status === 'rejected' &&
Object.keys(searchParams).length > 0
) {
redirect('/events');
}

return (
<>
<EventsBody initialQueryData={initialEvents} total={count} />
</>
);
};

export default Events;
40 changes: 0 additions & 40 deletions src/app/events/EventsNone.tsx

This file was deleted.

63 changes: 0 additions & 63 deletions src/app/events/EventsTitle.tsx

This file was deleted.

47 changes: 0 additions & 47 deletions src/app/events/page.tsx

This file was deleted.

2 changes: 1 addition & 1 deletion src/app/layout.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ const inter = Inter({

const baiJamjuree = Bai_Jamjuree({
subsets: ['latin'],
weight: ['500', '700'],
weight: ['500', '600', '700'],
variable: '--font-display',
});

Expand Down
5 changes: 3 additions & 2 deletions src/app/manage/[slug]/(dashboard)/(forms)/Details.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,10 @@ import { DatePicker } from '@mui/x-date-pickers/DatePicker';
import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query';
import { useState } from 'react';
import { useUploadToUploadURL } from 'src/utils/uploadImage';
import ClubTagAutocomplete from '@src/components/club/ClubTagAutocomplete';
import Panel, { PanelSkeleton } from '@src/components/common/Panel';
import Confirmation from '@src/components/Confirmation';
import { setSnackbar, SnackbarPresets } from '@src/components/global/Snackbar';
import { ClubTagEdit } from '@src/components/manage/form/ClubTagEdit';
import FormImage from '@src/components/manage/form/FormImage';
import { SelectClub } from '@src/server/db/models';
import { useTRPC } from '@src/trpc/react';
Expand Down Expand Up @@ -278,7 +278,8 @@ const Details = ({ club }: DetailsProps) => {
</div>
<form.Field name="tags">
{(field) => (
<ClubTagEdit
<ClubTagAutocomplete
allowAddingOptions
value={field.state.value}
onChange={(value) => {
field.handleChange(value);
Expand Down
2 changes: 1 addition & 1 deletion src/app/manage/[slug]/events/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@ export default async function Page({
currentTime: now,
});

const totalCount = await api.event.countByClubId({
const totalCount = await api.event.count({
clubId: club.id,
includePast,
currentTime: now,
Expand Down
Loading
Loading