feat: upload test record attachments per run case

Allow testers to attach evidence files to a single test case within a
specific test run, proving the test was actually executed. Attachments
are scoped to the RunCase (per-execution), not the shared case definition.

Backend:
- runCaseAttachments join table + model (CASCADE on runCase/attachment)
- POST/GET /runcaseattachments routes (reuse /attachments download+delete)

Frontend:
- new "Test record" tab in the run case detail pane with drag-and-drop
  upload, scoped to reporters; i18n for all 6 locales

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
LittleYellow
2026-06-24 07:01:44 +08:00
parent 55e78875ae
commit 02fa631f02
16 changed files with 569 additions and 7 deletions

View File

@@ -362,7 +362,13 @@
"no_case_selected": "Kein Testfall ausgewählt",
"case_detail": "Testfall-Details",
"comments": "Kommentare",
"history": "Verlauf"
"history": "Verlauf",
"test_record": "Testnachweis",
"download": "Herunterladen",
"delete": "Löschen",
"click_to_upload": "Zum Hochladen klicken",
"or_drag_and_drop": " oder per Drag & Drop",
"max_file_size": "Max. Dateigröße"
},
"Comments": {
"comments": "Kommentare",

View File

@@ -362,7 +362,13 @@
"no_case_selected": "No test case selected",
"case_detail": "Test case detail",
"comments": "Comments",
"history": "History"
"history": "History",
"test_record": "Test record",
"download": "Download",
"delete": "Delete",
"click_to_upload": "Click to upload",
"or_drag_and_drop": " or drag and drop",
"max_file_size": "Max. file size"
},
"Comments": {
"comments": "Comments",

View File

@@ -362,7 +362,13 @@
"no_case_selected": "テストケースが選択されていません",
"case_detail": "テストケース詳細",
"comments": "コメント",
"history": "履歴"
"history": "履歴",
"test_record": "テスト記録",
"download": "ダウンロード",
"delete": "削除",
"click_to_upload": "クリックしてアップロード",
"or_drag_and_drop": "またはドラッグアンドドロップ",
"max_file_size": "最大ファイルサイズ"
},
"Comments": {
"comments": "コメント",

View File

@@ -362,7 +362,13 @@
"no_case_selected": "Nenhum caso de teste selecionado",
"case_detail": "Detalhe do caso de teste",
"comments": "Comentários",
"history": "Histórico"
"history": "Histórico",
"test_record": "Registro de teste",
"download": "Baixar",
"delete": "Excluir",
"click_to_upload": "Clique para enviar",
"or_drag_and_drop": " ou arraste e solte",
"max_file_size": "Tamanho máx. do arquivo"
},
"Comments": {
"comments": "Comentários",

View File

@@ -362,7 +362,13 @@
"no_case_selected": "未选择测试用例",
"case_detail": "测试用例详情",
"comments": "评论",
"history": "历史"
"history": "历史",
"test_record": "测试记录",
"download": "下载",
"delete": "删除",
"click_to_upload": "点击上传",
"or_drag_and_drop": " 或拖拽文件到此处",
"max_file_size": "最大文件大小"
},
"Comments": {
"comments": "评论",

View File

@@ -362,7 +362,13 @@
"no_case_selected": "未選擇測試案例",
"case_detail": "測試案例詳情",
"comments": "留言",
"history": "歷史"
"history": "歷史",
"test_record": "測試紀錄",
"download": "下載",
"delete": "刪除",
"click_to_upload": "點擊上傳",
"or_drag_and_drop": " 或將檔案拖曳至此處",
"max_file_size": "檔案大小上限"
},
"Comments": {
"comments": "留言",