import { DataTable } from 'primereact/datatable' import { Column } from 'primereact/column' import { FilterMatchMode } from 'primereact/api' import { MultiSelect } from 'primereact/multiselect' import { useState, useEffect } from 'react' import Medal from './Medal' import { Slider } from 'primereact/slider' import ScoreField from './ScoreField' const ModelTable = ({ data }) => { const [filters, setFilters] = useState({ type: { value: null, matchMode: FilterMatchMode.IN }, size: { value: null, matchMode: FilterMatchMode.BETWEEN }, cost: { value: null, matchMode: FilterMatchMode.BETWEEN } }) const rankBodyTemplate = rowData => { return } const typeRowFilterTemplate = options => { return ( { options.filterApplyCallback(e.value) setFilters(prevFilters => ({ ...prevFilters, type: { value: e.value, matchMode: FilterMatchMode.IN } })) }} placeholder='All types' /> ) } const formatSize = size => { if (size === null) { return '' } else if (size >= 0 && size <= 1) { return size.toFixed(2) + '' } else if (size < 1000) { return size.toFixed(0) + '' } else if (size < 1000 * 1000) { return (size / 1000).toFixed(0) + 'K' } else if (size < 1000 * 1000 * 1000) { return (size / 1000 / 1000).toFixed(0) + 'M' } else { return (size / 1000 / 1000 / 1000).toFixed(0) + 'B' } } const SliderWithLabel = ({ value, onChange, min, max }) => { const p = 10 const start = value === null ? min : Math.log(value[0]) / Math.log(p) const stop = value === null ? max : Math.log(value[1]) / Math.log(p) const [_value, _setValue] = useState([start, stop]) useEffect(() => { const timer = setTimeout(() => { onChange({ value: // set to "no filter" when (almost) the whole range is selected _value[0] <= min + 0.1 && _value[1] >= max - 0.1 ? null : [p ** _value[0], p ** _value[1]] }) }, 1000) return () => clearTimeout(timer) }, [_value, onChange, min, max]) return (
{formatSize(p ** _value[0])}
{formatSize(p ** _value[1])}
_setValue(e.value)} placeholder='All sizes' min={min} max={max} step={0.01} range style={{ marginTop: '5rem' }} />
) } const sizeFilterTemplate = options => { return ( { options.filterApplyCallback(e.value) setFilters(prevFilters => ({ ...prevFilters, size: { value: e.value, matchMode: FilterMatchMode.BETWEEN } })) }} /> ) } const costFilterTemplate = options => { return ( { options.filterApplyCallback(e.value) setFilters(prevFilters => ({ ...prevFilters, cost: { value: e.value, matchMode: FilterMatchMode.BETWEEN } })) }} /> ) } const sizeBodyTemplate = rowData => { const sizeStr = formatSize(rowData.size) return (
{sizeStr}
) } const modelBodyTemplate = rowData => (
{rowData.name}
) const typeBodyTemplate = rowData => { return rowData.type === 'Open' ? ( ) : ( ) } const costBodyTemplate = rowData => { return
${rowData.cost.toFixed(2)}
} const scoreBodyTemplate = (field, options = {}) => { const { minScore = 0, maxScore = 1 } = options return rowData => { const score = rowData[field] return ScoreField(score, minScore, maxScore) } } return ( AI Models} sortField='average' removableSort filters={filters} filterDisplay='menu' scrollable scrollHeight='600px' id='model-table' style={{ width: '800px', minHeight: '650px' }} > } filter filterElement={typeRowFilterTemplate} showFilterMatchModes={false} body={typeBodyTemplate} /> {/* */} ) } export default ModelTable