Spaces:
Running
Running
| 'use client'; | |
| import { useState } from 'react'; | |
| import { Modal } from '@/components/Modal'; | |
| import Link from 'next/link'; | |
| import { TextInput } from '@/components/formInputs'; | |
| import useDatasetList from '@/hooks/useDatasetList'; | |
| import { Button } from '@headlessui/react'; | |
| import { FaRegTrashAlt } from 'react-icons/fa'; | |
| import { openConfirm } from '@/components/ConfirmModal'; | |
| import { TopBar, MainContent } from '@/components/layout'; | |
| import UniversalTable, { TableColumn } from '@/components/UniversalTable'; | |
| import { apiClient } from '@/utils/api'; | |
| import { useRouter } from 'next/navigation'; | |
| export default function Datasets() { | |
| const router = useRouter(); | |
| const { datasets, status, refreshDatasets } = useDatasetList(); | |
| const [newDatasetName, setNewDatasetName] = useState(''); | |
| const [isNewDatasetModalOpen, setIsNewDatasetModalOpen] = useState(false); | |
| // Transform datasets array into rows with objects | |
| const tableRows = datasets.map(dataset => ({ | |
| name: dataset, | |
| actions: dataset, // Pass full dataset name for actions | |
| })); | |
| const columns: TableColumn[] = [ | |
| { | |
| title: 'Dataset Name', | |
| key: 'name', | |
| render: row => ( | |
| <Link href={`/datasets/${row.name}`} className="text-gray-200 hover:text-gray-100"> | |
| {row.name} | |
| </Link> | |
| ), | |
| }, | |
| { | |
| title: 'Actions', | |
| key: 'actions', | |
| className: 'w-20 text-right', | |
| render: row => ( | |
| <button | |
| className="text-gray-200 hover:bg-red-600 p-2 rounded-full transition-colors" | |
| onClick={() => handleDeleteDataset(row.name)} | |
| > | |
| <FaRegTrashAlt /> | |
| </button> | |
| ), | |
| }, | |
| ]; | |
| const handleDeleteDataset = (datasetName: string) => { | |
| openConfirm({ | |
| title: 'Delete Dataset', | |
| message: `Are you sure you want to delete the dataset "${datasetName}"? This action cannot be undone.`, | |
| type: 'warning', | |
| confirmText: 'Delete', | |
| onConfirm: () => { | |
| apiClient | |
| .post('/api/datasets/delete', { name: datasetName }) | |
| .then(() => { | |
| console.log('Dataset deleted:', datasetName); | |
| refreshDatasets(); | |
| }) | |
| .catch(error => { | |
| console.error('Error deleting dataset:', error); | |
| }); | |
| }, | |
| }); | |
| }; | |
| const handleCreateDataset = async (e: React.FormEvent) => { | |
| e.preventDefault(); | |
| try { | |
| const data = await apiClient.post('/api/datasets/create', { name: newDatasetName }).then(res => res.data); | |
| console.log('New dataset created:', data); | |
| refreshDatasets(); | |
| setNewDatasetName(''); | |
| setIsNewDatasetModalOpen(false); | |
| } catch (error) { | |
| console.error('Error creating new dataset:', error); | |
| } | |
| }; | |
| const openNewDatasetModal = () => { | |
| openConfirm({ | |
| title: 'New Dataset', | |
| message: 'Enter the name of the new dataset:', | |
| type: 'info', | |
| confirmText: 'Create', | |
| inputTitle: 'Dataset Name', | |
| onConfirm: async (name?: string) => { | |
| if (!name) { | |
| console.error('Dataset name is required.'); | |
| return; | |
| } | |
| try { | |
| const data = await apiClient.post('/api/datasets/create', { name }).then(res => res.data); | |
| console.log('New dataset created:', data); | |
| if (data.name) { | |
| router.push(`/datasets/${data.name}`); | |
| } else { | |
| refreshDatasets(); | |
| } | |
| } catch (error) { | |
| console.error('Error creating new dataset:', error); | |
| } | |
| }, | |
| }); | |
| }; | |
| return ( | |
| <> | |
| <TopBar> | |
| <div> | |
| <h1 className="text-2xl font-semibold text-gray-100">Datasets</h1> | |
| </div> | |
| <div className="flex-1"></div> | |
| <div> | |
| <Button | |
| className="text-gray-200 bg-slate-600 px-4 py-2 rounded-md hover:bg-slate-500 transition-colors" | |
| onClick={() => openNewDatasetModal()} | |
| > | |
| New Dataset | |
| </Button> | |
| </div> | |
| </TopBar> | |
| <MainContent> | |
| <UniversalTable | |
| columns={columns} | |
| rows={tableRows} | |
| isLoading={status === 'loading'} | |
| onRefresh={refreshDatasets} | |
| /> | |
| </MainContent> | |
| <Modal | |
| isOpen={isNewDatasetModalOpen} | |
| onClose={() => setIsNewDatasetModalOpen(false)} | |
| title="New Dataset" | |
| size="md" | |
| > | |
| <div className="space-y-4 text-gray-200"> | |
| <form onSubmit={handleCreateDataset}> | |
| <div className="text-sm text-gray-400"> | |
| This will create a new folder with the name below in your dataset folder. | |
| </div> | |
| <div className="mt-4"> | |
| <TextInput label="Dataset Name" value={newDatasetName} onChange={value => setNewDatasetName(value)} /> | |
| </div> | |
| <div className="mt-6 flex justify-end space-x-3"> | |
| <button | |
| type="button" | |
| className="rounded-md bg-gray-700 px-4 py-2 text-gray-200 hover:bg-gray-600 focus:outline-none focus:ring-2 focus:ring-gray-500" | |
| onClick={() => setIsNewDatasetModalOpen(false)} | |
| > | |
| Cancel | |
| </button> | |
| <button | |
| type="submit" | |
| className="rounded-md bg-blue-600 px-4 py-2 text-white hover:bg-blue-700 focus:outline-none focus:ring-2 focus:ring-blue-500" | |
| > | |
| Confirm | |
| </button> | |
| </div> | |
| </form> | |
| </div> | |
| </Modal> | |
| </> | |
| ); | |
| } | |