David Pomerenke
commited on
Commit
·
a3e21c6
1
Parent(s):
eb1696c
AutoComplete improvements and examples
Browse files
frontend/src/App.js
CHANGED
@@ -8,13 +8,11 @@ import WorldMap from './components/WorldMap'
|
|
8 |
import AutoComplete from './components/AutoComplete'
|
9 |
import LanguagePlot from './components/LanguagePlot'
|
10 |
import { Carousel } from 'primereact/carousel'
|
11 |
-
import { FilterMatchMode } from 'primereact/api'
|
12 |
|
13 |
function App () {
|
14 |
const [data, setData] = useState(null)
|
15 |
const [loading, setLoading] = useState(true)
|
16 |
const [error, setError] = useState(null)
|
17 |
-
const [allSuggestions, setAllSuggestions] = useState([])
|
18 |
const [selectedLanguages, setSelectedLanguages] = useState([])
|
19 |
useEffect(() => {
|
20 |
fetch('/api/data', {
|
@@ -37,38 +35,6 @@ function App () {
|
|
37 |
})
|
38 |
}, [selectedLanguages])
|
39 |
|
40 |
-
useEffect(() => {
|
41 |
-
if (data) {
|
42 |
-
const models = data.model_table.map(item => ({
|
43 |
-
type: 'Model',
|
44 |
-
value: item.model,
|
45 |
-
detail: item.provider,
|
46 |
-
searchText: item.model.toLowerCase()
|
47 |
-
}))
|
48 |
-
const languages = data.language_table.map(item => ({
|
49 |
-
type: 'Language',
|
50 |
-
value: item.autonym,
|
51 |
-
detail: item.language_name,
|
52 |
-
searchText:
|
53 |
-
item.language_name.toLowerCase() + ' ' + item.autonym.toLowerCase(),
|
54 |
-
bcp_47: item.bcp_47
|
55 |
-
}))
|
56 |
-
const datasets = data.dataset_table.map(item => ({
|
57 |
-
type: 'Dataset',
|
58 |
-
value: item.name,
|
59 |
-
detail: item.tasks,
|
60 |
-
searchText:
|
61 |
-
item.author.toLowerCase() +
|
62 |
-
' ' +
|
63 |
-
item.name.toLowerCase() +
|
64 |
-
' ' +
|
65 |
-
item.tasks.map(task => task.toLowerCase()).join(' ')
|
66 |
-
}))
|
67 |
-
const allSuggestions = [...models, ...languages, ...datasets]
|
68 |
-
setAllSuggestions(allSuggestions)
|
69 |
-
}
|
70 |
-
}, [data])
|
71 |
-
|
72 |
return (
|
73 |
<PrimeReactProvider>
|
74 |
<div style={{ height: '100%', display: 'flex', flexDirection: 'column' }}>
|
@@ -91,18 +57,15 @@ function App () {
|
|
91 |
</span>
|
92 |
</div>
|
93 |
<h1 style={{ fontSize: '2.5rem', fontWeight: '700' }}>
|
94 |
-
Global AI
|
95 |
</h1>
|
96 |
<p style={{ fontSize: '1.15rem', color: '#555', marginTop: '0' }}>
|
97 |
Tracking language proficiency of AI models for every language
|
98 |
</p>
|
99 |
<AutoComplete
|
100 |
-
|
101 |
-
onComplete={
|
102 |
-
if (item.type === 'Language') setSelectedLanguages(() => [item])
|
103 |
-
}}
|
104 |
/>
|
105 |
-
<pre>{JSON.stringify(selectedLanguages, null, 2)}</pre>
|
106 |
</header>
|
107 |
<main
|
108 |
style={{
|
@@ -169,6 +132,7 @@ function App () {
|
|
169 |
numVisible={1}
|
170 |
itemTemplate={item => item}
|
171 |
circular
|
|
|
172 |
/>
|
173 |
</div>
|
174 |
</>
|
|
|
8 |
import AutoComplete from './components/AutoComplete'
|
9 |
import LanguagePlot from './components/LanguagePlot'
|
10 |
import { Carousel } from 'primereact/carousel'
|
|
|
11 |
|
12 |
function App () {
|
13 |
const [data, setData] = useState(null)
|
14 |
const [loading, setLoading] = useState(true)
|
15 |
const [error, setError] = useState(null)
|
|
|
16 |
const [selectedLanguages, setSelectedLanguages] = useState([])
|
17 |
useEffect(() => {
|
18 |
fetch('/api/data', {
|
|
|
35 |
})
|
36 |
}, [selectedLanguages])
|
37 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
38 |
return (
|
39 |
<PrimeReactProvider>
|
40 |
<div style={{ height: '100%', display: 'flex', flexDirection: 'column' }}>
|
|
|
57 |
</span>
|
58 |
</div>
|
59 |
<h1 style={{ fontSize: '2.5rem', fontWeight: '700' }}>
|
60 |
+
Global AI Monitor
|
61 |
</h1>
|
62 |
<p style={{ fontSize: '1.15rem', color: '#555', marginTop: '0' }}>
|
63 |
Tracking language proficiency of AI models for every language
|
64 |
</p>
|
65 |
<AutoComplete
|
66 |
+
languages={data?.language_table}
|
67 |
+
onComplete={items => setSelectedLanguages(items)}
|
|
|
|
|
68 |
/>
|
|
|
69 |
</header>
|
70 |
<main
|
71 |
style={{
|
|
|
132 |
numVisible={1}
|
133 |
itemTemplate={item => item}
|
134 |
circular
|
135 |
+
style={{ width: '800px', minHeight: '650px' }}
|
136 |
/>
|
137 |
</div>
|
138 |
</>
|
frontend/src/components/AutoComplete.js
CHANGED
@@ -1,58 +1,100 @@
|
|
1 |
import { AutoComplete as PrimeAutoComplete } from 'primereact/autocomplete'
|
2 |
import { useState } from 'react'
|
3 |
-
const AutoComplete = ({
|
4 |
const [autoComplete, setAutoComplete] = useState('')
|
5 |
const [suggestions, setSuggestions] = useState([])
|
6 |
|
|
|
|
|
|
|
|
|
|
|
7 |
const search = e => {
|
8 |
-
const matches =
|
9 |
-
|
10 |
-
|
|
|
|
|
|
|
|
|
|
|
11 |
setSuggestions(matches)
|
12 |
}
|
13 |
|
14 |
-
const itemTemplate = item =>
|
15 |
-
|
16 |
-
|
17 |
-
|
18 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
19 |
</span>
|
20 |
-
|
21 |
-
|
22 |
-
|
23 |
-
|
24 |
-
|
25 |
-
|
26 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
27 |
style={{
|
28 |
display: 'flex',
|
29 |
-
|
30 |
-
|
|
|
|
|
|
|
|
|
|
|
31 |
}}
|
32 |
>
|
33 |
-
<span>
|
34 |
-
|
35 |
-
|
36 |
-
|
37 |
-
|
38 |
-
|
39 |
-
|
40 |
-
|
41 |
-
|
42 |
-
|
43 |
-
|
44 |
-
|
45 |
-
|
46 |
-
|
47 |
-
|
48 |
-
|
49 |
-
|
50 |
-
|
51 |
-
|
52 |
-
|
53 |
-
autoFocus
|
54 |
-
itemTemplate={itemTemplate}
|
55 |
-
/>
|
56 |
)
|
57 |
}
|
58 |
|
|
|
1 |
import { AutoComplete as PrimeAutoComplete } from 'primereact/autocomplete'
|
2 |
import { useState } from 'react'
|
3 |
+
const AutoComplete = ({ languages, onComplete }) => {
|
4 |
const [autoComplete, setAutoComplete] = useState('')
|
5 |
const [suggestions, setSuggestions] = useState([])
|
6 |
|
7 |
+
const exampleCodes = ['de', 'fr', 'ar', 'hi', 'sw', 'fa']
|
8 |
+
const exampleLanguages = languages?.filter(item =>
|
9 |
+
exampleCodes.includes(item.bcp_47)
|
10 |
+
)
|
11 |
+
|
12 |
const search = e => {
|
13 |
+
const matches = languages.filter(language => {
|
14 |
+
const query = e.query.toLowerCase()
|
15 |
+
return (
|
16 |
+
language.language_name.toLowerCase().includes(query) ||
|
17 |
+
language.autonym.toLowerCase().includes(query) ||
|
18 |
+
language.bcp_47.toLowerCase().includes(query)
|
19 |
+
)
|
20 |
+
})
|
21 |
setSuggestions(matches)
|
22 |
}
|
23 |
|
24 |
+
const itemTemplate = item => (
|
25 |
+
<div
|
26 |
+
style={{
|
27 |
+
display: 'flex',
|
28 |
+
flexDirection: 'row',
|
29 |
+
justifyContent: 'space-between'
|
30 |
+
}}
|
31 |
+
>
|
32 |
+
<span>
|
33 |
+
{item.autonym}
|
34 |
+
<span style={{ color: 'gray', marginLeft: '1rem' }}>
|
35 |
+
{item.language_name}
|
36 |
</span>
|
37 |
+
</span>
|
38 |
+
<span style={{ color: 'gray' }}>{item.bcp_47}</span>
|
39 |
+
</div>
|
40 |
+
)
|
41 |
+
|
42 |
+
return (
|
43 |
+
<>
|
44 |
+
<PrimeAutoComplete
|
45 |
+
placeholder='Search for language-specific leaderboards...'
|
46 |
+
value={autoComplete}
|
47 |
+
onChange={e => setAutoComplete(e.value)}
|
48 |
+
onClick={() => {
|
49 |
+
setAutoComplete('')
|
50 |
+
setSuggestions(languages)
|
51 |
+
}}
|
52 |
+
onSelect={e => {
|
53 |
+
setAutoComplete(e.value.language_name)
|
54 |
+
onComplete([e.value])
|
55 |
+
}}
|
56 |
+
suggestions={suggestions}
|
57 |
+
completeMethod={search}
|
58 |
+
virtualScrollerOptions={{ itemSize: 50 }} // smaller values give layout problems
|
59 |
+
delay={500}
|
60 |
+
autoHighlight
|
61 |
+
autoFocus
|
62 |
+
itemTemplate={itemTemplate}
|
63 |
+
field='language_name'
|
64 |
+
minLength={0}
|
65 |
+
/>
|
66 |
+
<span
|
67 |
style={{
|
68 |
display: 'flex',
|
69 |
+
flexWrap: 'wrap',
|
70 |
+
gap: '1rem',
|
71 |
+
rowGap: '0.3rem',
|
72 |
+
marginTop: '1rem',
|
73 |
+
maxWidth: '600px',
|
74 |
+
justifyContent: 'center',
|
75 |
+
color: '#555'
|
76 |
}}
|
77 |
>
|
78 |
+
<span>Examples:</span>
|
79 |
+
{exampleLanguages?.map(language => (
|
80 |
+
<a
|
81 |
+
onClick={() => {
|
82 |
+
onComplete([language])
|
83 |
+
setAutoComplete(language.language_name)
|
84 |
+
}}
|
85 |
+
style={{ textDecoration: 'underline', cursor: 'pointer' }}
|
86 |
+
>
|
87 |
+
{language.language_name} Leaderboard
|
88 |
+
</a>
|
89 |
+
))}
|
90 |
+
{/* <li>African Leaderboard</li>
|
91 |
+
<li>Indic Leaderboard</li>
|
92 |
+
<li>Transcription Leaderboard</li>
|
93 |
+
<li>Dataset Availability for African Languages</li>
|
94 |
+
<li>GPT 4.5 Evaluation</li>
|
95 |
+
<li>MMLU Evaluation of Open Models</li> */}
|
96 |
+
</span>
|
97 |
+
</>
|
|
|
|
|
|
|
98 |
)
|
99 |
}
|
100 |
|
frontend/src/components/DatasetTable.js
CHANGED
@@ -78,6 +78,7 @@ const DatasetTable = ({ data }) => {
|
|
78 |
scrollable
|
79 |
scrollHeight='600px'
|
80 |
id='dataset-table'
|
|
|
81 |
>
|
82 |
<Column
|
83 |
field='implemented'
|
|
|
78 |
scrollable
|
79 |
scrollHeight='600px'
|
80 |
id='dataset-table'
|
81 |
+
style={{ width: '800px', minHeight: '650px' }}
|
82 |
>
|
83 |
<Column
|
84 |
field='implemented'
|
frontend/src/components/LanguageTable.js
CHANGED
@@ -138,7 +138,7 @@ const LanguageTable = ({ data, selectedLanguages, setSelectedLanguages }) => {
|
|
138 |
scrollable
|
139 |
scrollHeight='600px'
|
140 |
id='language-table'
|
141 |
-
style={{ width: '800px' }}
|
142 |
>
|
143 |
<Column selectionMode="multiple" headerStyle={{ width: '3rem' }} />
|
144 |
<Column
|
|
|
138 |
scrollable
|
139 |
scrollHeight='600px'
|
140 |
id='language-table'
|
141 |
+
style={{ width: '800px', minHeight: '650px' }}
|
142 |
>
|
143 |
<Column selectionMode="multiple" headerStyle={{ width: '3rem' }} />
|
144 |
<Column
|
frontend/src/components/ModelTable.js
CHANGED
@@ -145,6 +145,7 @@ const ModelTable = ({ data }) => {
|
|
145 |
scrollable
|
146 |
scrollHeight='600px'
|
147 |
id='model-table'
|
|
|
148 |
>
|
149 |
<Column field='rank' body={rankBodyTemplate} />
|
150 |
<Column field='provider' header='Provider' style={{ minWidth: '5rem' }} body={providerBodyTemplate} />
|
|
|
145 |
scrollable
|
146 |
scrollHeight='600px'
|
147 |
id='model-table'
|
148 |
+
style={{ width: '800px', minHeight: '650px' }}
|
149 |
>
|
150 |
<Column field='rank' body={rankBodyTemplate} />
|
151 |
<Column field='provider' header='Provider' style={{ minWidth: '5rem' }} body={providerBodyTemplate} />
|
frontend/src/components/ScoreField.js
CHANGED
@@ -34,7 +34,8 @@ const ScoreField = (score, minScore, maxScore) => {
|
|
34 |
height: '100%',
|
35 |
width: `${percentage}%`,
|
36 |
backgroundColor: barColor,
|
37 |
-
zIndex: 0
|
|
|
38 |
}}
|
39 |
/>
|
40 |
|
|
|
34 |
height: '100%',
|
35 |
width: `${percentage}%`,
|
36 |
backgroundColor: barColor,
|
37 |
+
zIndex: 0,
|
38 |
+
transition: 'width 0.3s, background-color 0.3s'
|
39 |
}}
|
40 |
/>
|
41 |
|