From 406ec46c81dd21a7c2227bbbb245d6ef07817c86 Mon Sep 17 00:00:00 2001 From: Matt Date: Tue, 3 Feb 2026 10:50:47 +0100 Subject: [PATCH] UI simplification: remove redundant pages, reorganize Quick Actions Phase 2 UI Cleanup: - Delete empty programs/[id]/settings page - Delete redundant projects/[id]/assignments page (use round-level management) - Delete unused /users redirect directory - Remove Settings button from program detail page - Reorganize Round Quick Actions into visual groups (Project Management, Round Management) Note: Mentor inline assignment deferred - the existing mentor page has complex AI suggestion functionality that would need careful refactoring. Co-Authored-By: Claude Opus 4.5 --- src/app/(admin)/admin/programs/[id]/page.tsx | 22 +-- .../admin/programs/[id]/settings/page.tsx | 83 -------- .../admin/projects/[id]/assignments/page.tsx | 177 ------------------ src/app/(admin)/admin/rounds/[id]/page.tsx | 87 +++++---- src/app/(admin)/admin/users/[id]/page.tsx | 10 - src/app/(admin)/admin/users/invite/page.tsx | 5 - src/app/(admin)/admin/users/page.tsx | 5 - 7 files changed, 56 insertions(+), 333 deletions(-) delete mode 100644 src/app/(admin)/admin/programs/[id]/settings/page.tsx delete mode 100644 src/app/(admin)/admin/projects/[id]/assignments/page.tsx delete mode 100644 src/app/(admin)/admin/users/[id]/page.tsx delete mode 100644 src/app/(admin)/admin/users/invite/page.tsx delete mode 100644 src/app/(admin)/admin/users/page.tsx diff --git a/src/app/(admin)/admin/programs/[id]/page.tsx b/src/app/(admin)/admin/programs/[id]/page.tsx index 473e7c1..b864673 100644 --- a/src/app/(admin)/admin/programs/[id]/page.tsx +++ b/src/app/(admin)/admin/programs/[id]/page.tsx @@ -18,7 +18,7 @@ import { TableHeader, TableRow, } from '@/components/ui/table' -import { ArrowLeft, Pencil, Plus, Settings } from 'lucide-react' +import { ArrowLeft, Pencil, Plus } from 'lucide-react' import { formatDateOnly } from '@/lib/utils' interface ProgramDetailPageProps { @@ -64,20 +64,12 @@ export default async function ProgramDetailPage({ params }: ProgramDetailPagePro

-
- - -
+ {program.description && ( diff --git a/src/app/(admin)/admin/programs/[id]/settings/page.tsx b/src/app/(admin)/admin/programs/[id]/settings/page.tsx deleted file mode 100644 index 4e0bd29..0000000 --- a/src/app/(admin)/admin/programs/[id]/settings/page.tsx +++ /dev/null @@ -1,83 +0,0 @@ -'use client' - -import { useParams } from 'next/navigation' -import Link from 'next/link' -import { trpc } from '@/lib/trpc/client' -import { Button } from '@/components/ui/button' -import { - Card, - CardContent, - CardDescription, - CardHeader, - CardTitle, -} from '@/components/ui/card' -import { Skeleton } from '@/components/ui/skeleton' -import { ArrowLeft } from 'lucide-react' - -export default function ProgramSettingsPage() { - const params = useParams() - const id = params.id as string - - const { data: program, isLoading } = trpc.program.get.useQuery({ id }) - - if (isLoading) { - return ( -
-
- -
- - -
-
- - - - - - -
- ) - } - - return ( -
-
- - - -
-

Program Settings

-

- Configure settings for {program?.name} -

-
-
- - - - Program Configuration - - Advanced settings for this program - - - -
- Program-specific settings will be available in a future update. -
- For now, manage rounds and projects through the program detail page. -
-
- -
-
-
-
- ) -} diff --git a/src/app/(admin)/admin/projects/[id]/assignments/page.tsx b/src/app/(admin)/admin/projects/[id]/assignments/page.tsx deleted file mode 100644 index 7e6d4c6..0000000 --- a/src/app/(admin)/admin/projects/[id]/assignments/page.tsx +++ /dev/null @@ -1,177 +0,0 @@ -'use client' - -import { useParams } from 'next/navigation' -import Link from 'next/link' -import { trpc } from '@/lib/trpc/client' -import { Button } from '@/components/ui/button' -import { Badge } from '@/components/ui/badge' -import { - Card, - CardContent, - CardDescription, - CardHeader, - CardTitle, -} from '@/components/ui/card' -import { - Table, - TableBody, - TableCell, - TableHead, - TableHeader, - TableRow, -} from '@/components/ui/table' -import { Skeleton } from '@/components/ui/skeleton' -import { - AlertDialog, - AlertDialogAction, - AlertDialogCancel, - AlertDialogContent, - AlertDialogDescription, - AlertDialogFooter, - AlertDialogHeader, - AlertDialogTitle, - AlertDialogTrigger, -} from '@/components/ui/alert-dialog' -import { ArrowLeft, Plus, UserMinus } from 'lucide-react' -import { toast } from 'sonner' - -export default function ProjectAssignmentsPage() { - const params = useParams() - const id = params.id as string - - const { data: project, isLoading: projectLoading } = trpc.project.get.useQuery({ id }) - const { data: assignments = [], isLoading: assignmentsLoading } = trpc.assignment.listByProject.useQuery({ projectId: id }) - - const utils = trpc.useUtils() - - const removeAssignment = trpc.assignment.delete.useMutation({ - onSuccess: () => { - toast.success('Assignment removed') - utils.assignment.listByProject.invalidate({ projectId: id }) - }, - onError: (error) => { - toast.error(error.message || 'Failed to remove assignment') - }, - }) - - // Remove handled via AlertDialog in JSX - - const isLoading = projectLoading || assignmentsLoading - - if (isLoading) { - return ( -
-
- -
- - -
-
- - - - - - - -
- ) - } - - return ( -
-
-
- - - -
-

Jury Assignments

-

- {project?.title} -

-
-
- -
- - - - Assigned Jury Members - - {assignments.length} jury member{assignments.length !== 1 ? 's' : ''} assigned to evaluate this project - - - - {assignments.length === 0 ? ( -
- No jury members assigned yet. -
- ) : ( - - - - Jury Member - Status - Actions - - - - {assignments.map((assignment) => ( - - -
-

{assignment.user.name}

-

{assignment.user.email}

-
-
- - - {assignment.evaluation?.status || 'Pending'} - - - - - - - - - - Remove Assignment - - Remove this jury member from the project? Their evaluation data will also be deleted. - - - - Cancel - removeAssignment.mutate({ id: assignment.id })}> - Remove - - - - - -
- ))} -
-
- )} -
-
-
- ) -} diff --git a/src/app/(admin)/admin/rounds/[id]/page.tsx b/src/app/(admin)/admin/rounds/[id]/page.tsx index 4881c60..f52f2fe 100644 --- a/src/app/(admin)/admin/rounds/[id]/page.tsx +++ b/src/app/(admin)/admin/rounds/[id]/page.tsx @@ -602,46 +602,57 @@ function RoundDetailContent({ roundId }: { roundId: string }) { Quick Actions - -
- - {!isFilteringRound && ( - - )} - - - - - + + + + +
+ + + {/* Round Management */} +
+

Round Management

+
+ + {!isFilteringRound && ( + + )} +
diff --git a/src/app/(admin)/admin/users/[id]/page.tsx b/src/app/(admin)/admin/users/[id]/page.tsx deleted file mode 100644 index 59e96d6..0000000 --- a/src/app/(admin)/admin/users/[id]/page.tsx +++ /dev/null @@ -1,10 +0,0 @@ -import { redirect } from 'next/navigation' - -export default async function UserEditPage({ - params, -}: { - params: Promise<{ id: string }> -}) { - const { id } = await params - redirect(`/admin/members/${id}`) -} diff --git a/src/app/(admin)/admin/users/invite/page.tsx b/src/app/(admin)/admin/users/invite/page.tsx deleted file mode 100644 index d356862..0000000 --- a/src/app/(admin)/admin/users/invite/page.tsx +++ /dev/null @@ -1,5 +0,0 @@ -import { redirect } from 'next/navigation' - -export default function UserInvitePage() { - redirect('/admin/members/invite') -} diff --git a/src/app/(admin)/admin/users/page.tsx b/src/app/(admin)/admin/users/page.tsx deleted file mode 100644 index 4032af2..0000000 --- a/src/app/(admin)/admin/users/page.tsx +++ /dev/null @@ -1,5 +0,0 @@ -import { redirect } from 'next/navigation' - -export default function UsersPage() { - redirect('/admin/members') -}