import React, { useState } from "react"; import { Table, TableBody, TableCell, TableHead, TableRow, IconButton, Box, Typography, Accordion, AccordionSummary, AccordionDetails, Checkbox, Tooltip, Button, } from "@mui/material"; import DeleteIcon from "@mui/icons-material/Delete"; import SelectAllIcon from "@mui/icons-material/SelectAll"; import ExpandMoreIcon from "@mui/icons-material/ExpandMore"; import { useRouter } from "next/router"; interface Job { id: string; url: string; elements: Object[]; result: Object; time_created: Date; } interface JobTableProps { jobs: Job[]; fetchJobs: () => void; } const JobTable: React.FC = ({ jobs, fetchJobs }) => { const [selectedJobs, setSelectedJobs] = useState>(new Set()); const [allSelected, setAllSelected] = useState(false); const router = useRouter(); const handleDownload = async (id: string) => { const response = await fetch("/api/download", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ id: id }), }); if (response.ok) { const blob = await response.blob(); const url = window.URL.createObjectURL(blob); const a = document.createElement("a"); a.style.display = "none"; a.href = url; a.download = `job_${id}.csv`; document.body.appendChild(a); a.click(); window.URL.revokeObjectURL(url); } else { console.error("Failed to download the file."); } }; const handleNavigate = (elements: Object[], url: string) => { router.push({ pathname: "/", query: { elements: JSON.stringify(elements), url: url, }, }); }; const handleSelectJob = (id: string) => { setSelectedJobs((prevSelected) => { const newSelected = new Set(prevSelected); if (newSelected.has(id)) { newSelected.delete(id); } else { newSelected.add(id); } return newSelected; }); }; const handleSelectAll = () => { if (allSelected) { setSelectedJobs(new Set()); } else { const allJobIds = new Set(jobs.map((job) => job.id)); setSelectedJobs(allJobIds); } setAllSelected(!allSelected); }; const handleDeleteSelected = async () => { const response = await fetch("/api/delete-scrape-jobs", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ ids: Array.from(selectedJobs) }), }); if (response.ok) { fetchJobs(); setSelectedJobs(new Set()); } }; return ( Scrape Jobs Select Id Url Elements Result Time Created Actions {jobs.map((row, index) => ( handleSelectJob(row.id)} /> {row.id} {row.url} {JSON.stringify(row.elements)} } aria-controls="panel1a-content" id="panel1a-header" sx={{ minHeight: 0, "&.Mui-expanded": { minHeight: 0 }, }} > Show Result {JSON.stringify(row.result, null, 2)} {new Date(row.time_created).toLocaleString()} ))}
); }; export default JobTable;