bioflow / ui /app /data /data-view.tsx
yassinekolsi
Fix all TypeScript errors: remove unused imports, delete orphan reactflow components
532554f
"use client"
import { CloudUpload, Database, Download, Eye, FileText, Folder, HardDrive, Upload, ExternalLink } from "lucide-react"
import { useRouter } from "next/navigation"
import { SectionHeader } from "@/components/page-header"
import { Badge } from "@/components/ui/badge"
import { Button } from "@/components/ui/button"
import { Card, CardContent } from "@/components/ui/card"
import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table"
import { Tabs, TabsContent,TabsList, TabsTrigger } from "@/components/ui/tabs"
import { Dataset, Statistics } from "@/types/data"
interface DataViewProps {
datasets: Dataset[];
stats: Statistics | null;
}
export function DataView({ datasets, stats }: DataViewProps) {
const router = useRouter()
const statCards = [
{ label: "Datasets", value: stats?.datasets?.toString() ?? "—", icon: Folder, color: "text-blue-500" },
{ label: "Molecules", value: stats?.molecules ?? "—", icon: FileText, color: "text-cyan-500" },
{ label: "Proteins", value: stats?.proteins ?? "—", icon: Database, color: "text-emerald-500" },
{ label: "Storage Used", value: stats?.storage ?? "—", icon: HardDrive, color: "text-amber-500" },
]
const handleView = (dataset: Dataset) => {
// Navigate to explorer with this dataset's data
router.push(`/explorer?dataset=${encodeURIComponent(dataset.name)}`)
}
const handleDownload = (dataset: Dataset) => {
// For KIBA/DAVIS, these are from TDC - provide info
alert(`Dataset: ${dataset.name}\n\nThis dataset is loaded from Therapeutics Data Commons (TDC).\n\nTo download raw data, visit: https://tdcommons.ai/\n\nOr access via Python:\nfrom tdc.multi_pred import DTI\ndata = DTI(name='${dataset.name.includes('KIBA') ? 'KIBA' : 'DAVIS'}')`)
}
return (
<div className="space-y-8">
<div className="grid grid-cols-1 md:grid-cols-4 gap-4">
{statCards.map((stat, i) => (
<Card key={i}>
<CardContent className="p-6">
<div className="flex justify-between items-start mb-2">
<div className="text-sm font-medium text-muted-foreground">{stat.label}</div>
<div className={`text-lg ${stat.color}`}><stat.icon className="h-5 w-5" /></div>
</div>
<div className="text-2xl font-bold">{stat.value}</div>
</CardContent>
</Card>
))}
</div>
<Tabs defaultValue="datasets">
<TabsList>
<TabsTrigger value="datasets">Datasets</TabsTrigger>
<TabsTrigger value="upload">Upload</TabsTrigger>
<TabsTrigger value="processing">Processing</TabsTrigger>
</TabsList>
<TabsContent value="datasets" className="space-y-4">
<SectionHeader title="Your Datasets" icon={<Folder className="h-5 w-5 text-primary" />} />
<Card>
<Table>
<TableHeader>
<TableRow>
<TableHead>Name</TableHead>
<TableHead>Type</TableHead>
<TableHead>Items</TableHead>
<TableHead>Size</TableHead>
<TableHead>Updated</TableHead>
<TableHead className="text-right">Actions</TableHead>
</TableRow>
</TableHeader>
<TableBody>
{datasets.length === 0 && (
<TableRow>
<TableCell colSpan={6} className="text-center text-muted-foreground text-sm">No datasets found.</TableCell>
</TableRow>
)}
{datasets.map((ds, i) => (
<TableRow key={i}>
<TableCell className="font-medium">{ds.name}</TableCell>
<TableCell>
<div className="flex items-center gap-2">
<Badge variant={ds.type === 'Drug-Target' ? 'default' : 'secondary'}>{ds.type}</Badge>
</div>
</TableCell>
<TableCell>{ds.count}</TableCell>
<TableCell>{ds.size}</TableCell>
<TableCell>{ds.updated}</TableCell>
<TableCell className="text-right">
<div className="flex justify-end gap-2">
<Button
size="icon"
variant="ghost"
className="h-8 w-8"
onClick={() => handleView(ds)}
title="View in Explorer"
>
<Eye className="h-4 w-4" />
</Button>
<Button
size="icon"
variant="ghost"
className="h-8 w-8"
onClick={() => handleDownload(ds)}
title="Download Info"
>
<Download className="h-4 w-4" />
</Button>
<a
href="https://tdcommons.ai/"
target="_blank"
rel="noopener noreferrer"
>
<Button
size="icon"
variant="ghost"
className="h-8 w-8"
title="View on TDC"
>
<ExternalLink className="h-4 w-4" />
</Button>
</a>
</div>
</TableCell>
</TableRow>
))}
</TableBody>
</Table>
</Card>
</TabsContent>
<TabsContent value="upload">
<SectionHeader title="Upload New Data" icon={<Upload className="h-5 w-5 text-primary" />} />
<Card>
<CardContent className="p-12">
<div className="border-2 border-dashed rounded-lg p-12 flex flex-col items-center justify-center text-center space-y-4 hover:bg-accent/50 transition-colors cursor-pointer">
<div className="h-16 w-16 rounded-full bg-primary/10 flex items-center justify-center text-primary">
<CloudUpload className="h-8 w-8" />
</div>
<div>
<div className="text-lg font-semibold">Click to upload or drag and drop</div>
<div className="text-sm text-muted-foreground">CSV, SDF, FASTA, or JSON (max 50MB)</div>
</div>
</div>
</CardContent>
</Card>
</TabsContent>
<TabsContent value="processing">
<Card>
<CardContent className="p-12 text-center text-muted-foreground">
No active processing tasks.
</CardContent>
</Card>
</TabsContent>
</Tabs>
</div>
)
}