'use client' import { useState, useEffect } from 'react' import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card" import { Button } from "@/components/ui/button" import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table" import { Eye, Calendar, ChevronDown, ChevronUp } from 'lucide-react' import { Collapsible, CollapsibleContent, CollapsibleTrigger } from "@/components/ui/collapsible" interface Dataset { id: string name: string created_at: string record_count: number status: 'completed' | 'processing' | 'failed' data: any[] } interface DatasetViewerProps { projectId: string datasetType: 'factory' | 'template' } export default function DatasetViewer({ projectId, datasetType }: DatasetViewerProps) { const [datasets, setDatasets] = useState([]) const [selectedDataset, setSelectedDataset] = useState(null) const [datasetData, setDatasetData] = useState([]) const [loading, setLoading] = useState(true) const [viewingData, setViewingData] = useState(false) const [isDatasetListOpen, setIsDatasetListOpen] = useState(true) const [currentPage, setCurrentPage] = useState(1) const recordsPerPage = 2 useEffect(() => { fetchDatasets() }, [projectId, datasetType]) const fetchDatasets = async () => { try { setLoading(true) // Replace with your actual API endpoint const response = await fetch(`/api/dataset/list`, { method: 'POST', headers: { 'Content-Type': 'application/json', }, body: JSON.stringify({ projectId: projectId, datasetType: datasetType, }), }) const data = await response.json() // Ensure data is always an array setDatasets(Array.isArray(data) ? data : []) } catch (error) { console.error('Error fetching datasets:', error) setDatasets([]) } finally { setLoading(false) } } const viewDataset = async (dataset: Dataset) => { try { setViewingData(true) setSelectedDataset(dataset) setCurrentPage(1) // Reset to first page when viewing new dataset const dataset_data = datasets.find((d) => d.id === dataset.id)?.data // Replace with your actual API endpoint // const response = await fetch(`/api/dataset/get`, { // method: 'POST', // headers: { // 'Content-Type': 'application/json', // }, // body: JSON.stringify({ // projectId: projectId, // datasetName: dataset.name, // }), // }) // const data = await response.json() setDatasetData(dataset_data || []) } catch (error) { console.error('Error fetching dataset data:', error) setDatasetData([]) } finally { setViewingData(false) } } // Pagination calculations const totalPages = Math.ceil(datasetData.length / recordsPerPage) const startIndex = (currentPage - 1) * recordsPerPage const endIndex = startIndex + recordsPerPage const currentPageData = datasetData.slice(startIndex, endIndex) const goToPage = (page: number) => { setCurrentPage(Math.max(1, Math.min(page, totalPages))) } if (loading) { return (
Loading datasets...
) } if (datasets.length === 0) { return (

No {datasetType === 'factory' ? 'data factory' : 'data template'} datasets found for this project

) } return (
{/* Collapsible Dataset List */}
Available Datasets
{datasets.length} dataset{datasets.length !== 1 ? 's' : ''} {isDatasetListOpen ? ( ) : ( )}
Name Created Records Status Actions {Array.isArray(datasets) && datasets.map((dataset) => ( {dataset.name}
{(() => { if (!dataset.created_at) return 'N/A' // Parse yyyy-mm-dd_hh-mm-ss format const [datePart, timePart] = dataset.created_at.split('_') if (!datePart || !timePart) return dataset.created_at const [year, month, day] = datePart.split('-') const [hours, minutes, seconds] = timePart.split('-') const dateStr = `${year}-${month}-${day}T${hours}:${minutes}:${seconds}` return new Date(dateStr).toLocaleString() })()}
{dataset.record_count.toLocaleString()} {dataset.status}
))}
{/* Dataset Data Viewer with Pagination */} {selectedDataset && ( Dataset: {selectedDataset.name} {viewingData ? (
Loading dataset data...
) : datasetData.length > 0 ? (
id {Object.keys(datasetData[0] || {}).filter(key => key !== 'id').map((key) => ( {key} ))} {currentPageData.map((record, index) => ( {typeof record.id === 'object' ? JSON.stringify(record.id) : String(record.id)} {Object.entries(record).filter(([key]) => key !== 'id').map(([key, value], cellIndex) => ( {typeof value === 'object' ? JSON.stringify(value) : String(value)} ))} ))}
{/* Pagination Controls */} {totalPages > 1 && (
Showing {startIndex + 1}-{Math.min(endIndex, datasetData.length)} of {datasetData.length} records
{Array.from({ length: Math.min(5, totalPages) }, (_, i) => { let pageNum; if (totalPages <= 5) { pageNum = i + 1; } else if (currentPage <= 3) { pageNum = i + 1; } else if (currentPage >= totalPages - 2) { pageNum = totalPages - 4 + i; } else { pageNum = currentPage - 2 + i; } return ( ); })}
)}
) : (
No data available for this dataset
)}
)}
) }