feat: session file registry with drag-and-drop on day view
Adds a FileDropZone at the bottom of the day view where users can drop all session files at once. Filenames are regex-matched to subjects using their animal_id_string (word-boundary aware, so "2852" won't match "28520"). Only metadata is recorded — files are never uploaded. Backend: new session_files table (id, daily_status_id, filename, file_size BIGINT, file_type, last_modified, notes). Routes: POST /api/daily-statuses/:id/files (batch create) GET /api/daily-statuses/:id/files DELETE /api/session-files/:id Frontend: FileDropZone shows per-subject match groups, unmatched files, and a warning for subjects with no match. After saving, registered files are displayed with delete capability. test-files/: generate_test_files.sh creates 4 dummy files per subject (2×bin, 2×csv) with correct naming for drag-and-drop testing. Pre-generated for 2026-04-23 with IDs 2852/3076/3077/3078. Tests: 19 tests covering drag state, regex matching, save payload, partial-overlap prevention, multi-subject batching, and delete. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
@@ -43,10 +43,25 @@ model DailyStatus {
|
||||
analysis_summary Json?
|
||||
animal Animal @relation(fields: [animal_id], references: [id], onDelete: Cascade)
|
||||
analyses DailyAnalysis[]
|
||||
session_files SessionFile[]
|
||||
|
||||
@@map("daily_statuses")
|
||||
}
|
||||
|
||||
model SessionFile {
|
||||
id String @id @default(uuid())
|
||||
daily_status_id String
|
||||
daily_status DailyStatus @relation(fields: [daily_status_id], references: [id], onDelete: Cascade)
|
||||
filename String
|
||||
file_size BigInt
|
||||
file_type String?
|
||||
last_modified BigInt?
|
||||
notes String?
|
||||
created_at DateTime @default(now())
|
||||
|
||||
@@map("session_files")
|
||||
}
|
||||
|
||||
model DailyAnalysis {
|
||||
id String @id @default(uuid())
|
||||
daily_status_id String
|
||||
|
||||
Reference in New Issue
Block a user