Spaces:
Sleeping
Sleeping
import React, { FC, useState } from 'react'; | |
import { AllModelsData, ModelMetrics } from '../types'; | |
interface Props { | |
data: AllModelsData; | |
selectedModels: string[]; | |
metrics: string[]; | |
colors: string[]; | |
} | |
const LanguageLevelTable: FC<Props> = ({ data, selectedModels, metrics, colors }) => { | |
const [selectedLanguage, setSelectedLanguage] = useState<string | null>(null); | |
const [selectedMetric, setSelectedMetric] = useState<string>(metrics[0]); | |
const languagePairs = selectedModels.length | |
? Object.keys(data[selectedModels[0]] || {}).filter(k => k !== 'averages') | |
: []; | |
const filteredData = selectedLanguage | |
? languagePairs.filter(pair => pair === selectedLanguage) | |
: languagePairs; | |
return ( | |
<div className="bg-white rounded-xl shadow-lg p-6 mb-8"> | |
<h2 className="text-2xl font-bold text-gray-800 mb-6">Language-Level Table</h2> | |
{/* Filters */} | |
<div className="flex space-x-4 mb-4"> | |
<select | |
value={selectedLanguage || ''} | |
onChange={e => setSelectedLanguage(e.target.value || null)} | |
className="px-4 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-indigo-500" | |
> | |
<option value="">All Languages</option> | |
{languagePairs.map(pair => ( | |
<option key={pair} value={pair}> | |
{pair.toUpperCase()} | |
</option> | |
))} | |
</select> | |
<select | |
value={selectedMetric} | |
onChange={e => setSelectedMetric(e.target.value)} | |
className="px-4 py-2 border border-gray-300 rounded-lg focus:outline-none focus:ring-2 focus:ring-indigo-500" | |
> | |
{metrics.map(metric => ( | |
<option key={metric} value={metric}> | |
{metric.toUpperCase()} | |
</option> | |
))} | |
</select> | |
</div> | |
{/* Table */} | |
<div className="overflow-x-auto"> | |
<table className="w-full text-sm"> | |
<thead> | |
<tr className="border-b border-gray-200"> | |
<th className="text-left py-3 px-4 font-semibold">Language Pair</th> | |
{selectedModels.map((model, index) => ( | |
<th | |
key={model} | |
className="text-center py-3 px-4 font-semibold" | |
style={{ color: colors[index % colors.length] }} | |
> | |
{model} | |
</th> | |
))} | |
</tr> | |
</thead> | |
<tbody> | |
{filteredData.map(pair => ( | |
<tr key={pair} className="border-b border-gray-100 hover:bg-gray-50"> | |
<td className="py-3 px-4 font-medium">{pair.toUpperCase()}</td> | |
{selectedModels.map(model => ( | |
<td key={model} className="text-center py-3 px-4"> | |
{data[model]?.[pair]?.[selectedMetric as keyof ModelMetrics]?.toFixed(3) || '-'} | |
</td> | |
))} | |
</tr> | |
))} | |
</tbody> | |
</table> | |
</div> | |
</div> | |
); | |
}; | |
export default LanguageLevelTable; |