+
+
+
+
+
+
+
+
+ 0 && selectedFiles.length < files.length}
+ onChange={handleSelectAll}
+ />
+
+ Filename
+ Status
+ Created At
+ Finished At
+ Actions
+
+
+
+ {files.map((file) => (
+
+
+ handleSelectFile(file.id)}
+ />
+
+ {file.filename}
+
+
+
+
+ {new Date(file.created_at).toLocaleString()}
+
+
+ {(file.status === FileStatus.SUCCESS || file.status === FileStatus.FAILED)
+ ? new Date(file.updated_at).toLocaleString()
+ : '—'}
+
+
+ handleDeleteClick(file.id)}
+ size="small"
+ color="error"
+ sx={{ mr: 1 }}
+ >
+
+
+ {file.status === FileStatus.SUCCESS && (
+ handleDownload(file.id)}
+ size="small"
+ color="primary"
+ >
+
+
+ )}
+
+
+ ))}
+
+
+
+
+
+
+ );
+};
+
+export default FileList;
\ No newline at end of file
diff --git a/frontend/src/components/FileUpload.tsx b/frontend/src/components/FileUpload.tsx
new file mode 100644
index 0000000..b2f2701
--- /dev/null
+++ b/frontend/src/components/FileUpload.tsx
@@ -0,0 +1,66 @@
+import React, { useCallback } from 'react';
+import { useDropzone } from 'react-dropzone';
+import { Box, Typography, CircularProgress } from '@mui/material';
+import { api } from '../services/api';
+
+interface FileUploadProps {
+ onUploadComplete: () => void;
+}
+
+const FileUpload: React.FC