From 6852278f92514edac5a99829be58b3557c8d892a Mon Sep 17 00:00:00 2001 From: Matt Date: Thu, 5 Mar 2026 17:36:13 +0100 Subject: [PATCH] fix: group project files by round in admin project detail - Sort files by round sortOrder first (via requirement.round.sortOrder) - Admin project detail now uses grouped file view with round headers - Files without a round requirement appear under "General" group Co-Authored-By: Claude Opus 4.6 --- src/app/(admin)/admin/projects/[id]/page.tsx | 59 ++++++++++++-------- src/server/routers/file.ts | 6 +- 2 files changed, 42 insertions(+), 23 deletions(-) diff --git a/src/app/(admin)/admin/projects/[id]/page.tsx b/src/app/(admin)/admin/projects/[id]/page.tsx index e376cd6..a02c368 100644 --- a/src/app/(admin)/admin/projects/[id]/page.tsx +++ b/src/app/(admin)/admin/projects/[id]/page.tsx @@ -816,33 +816,48 @@ function ProjectDetailContent({ projectId }: { projectId: string }) { /> - {/* All Files list */} + {/* All Files list — grouped by round */} {files && files.length > 0 && ( <> ({ - id: f.id, - fileName: f.fileName, - fileType: f.fileType, - mimeType: f.mimeType, - size: f.size, - bucket: f.bucket, - objectKey: f.objectKey, - pageCount: f.pageCount, - textPreview: f.textPreview, - detectedLang: f.detectedLang, - langConfidence: f.langConfidence, - analyzedAt: f.analyzedAt ? String(f.analyzedAt) : null, - requirementId: f.requirementId, - requirement: f.requirement ? { - id: f.requirement.id, - name: f.requirement.name, - description: f.requirement.description, - isRequired: f.requirement.isRequired, - } : null, - }))} + groupedFiles={(() => { + const groups = new Map() + const mappedFiles = files.map((f) => ({ + id: f.id, + fileName: f.fileName, + fileType: f.fileType as 'EXEC_SUMMARY' | 'PRESENTATION' | 'VIDEO' | 'OTHER' | 'BUSINESS_PLAN' | 'VIDEO_PITCH' | 'SUPPORTING_DOC', + mimeType: f.mimeType, + size: f.size, + bucket: f.bucket, + objectKey: f.objectKey, + pageCount: f.pageCount, + textPreview: f.textPreview, + detectedLang: f.detectedLang, + langConfidence: f.langConfidence, + analyzedAt: f.analyzedAt ? String(f.analyzedAt) : null, + requirementId: f.requirementId, + requirement: f.requirement ? { + id: f.requirement.id, + name: f.requirement.name, + description: f.requirement.description, + isRequired: f.requirement.isRequired, + } : null, + })) + for (const f of files) { + const roundId = f.requirement?.roundId ?? null + const roundName = f.requirement?.round?.name ?? 'General' + const sortOrder = f.requirement?.round?.sortOrder ?? -1 + const key = roundId ?? '_general' + if (!groups.has(key)) { + groups.set(key, { roundId, roundName, sortOrder, files: [] }) + } + const mapped = mappedFiles.find((m) => m.id === f.id)! + groups.get(key)!.files.push(mapped) + } + return Array.from(groups.values()) + })()} /> )} diff --git a/src/server/routers/file.ts b/src/server/routers/file.ts index 3d39cfe..b36b202 100644 --- a/src/server/routers/file.ts +++ b/src/server/routers/file.ts @@ -358,7 +358,11 @@ export const fileRouter = router({ }, }, }, - orderBy: [{ fileType: 'asc' }, { createdAt: 'asc' }], + orderBy: [ + { requirement: { round: { sortOrder: 'asc' } } }, + { fileType: 'asc' }, + { createdAt: 'asc' }, + ], }) }),