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 Language Monitor
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
- allSuggestions={allSuggestions}
101
- onComplete={item => {
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 = ({ allSuggestions, onComplete }) => {
4
  const [autoComplete, setAutoComplete] = useState('')
5
  const [suggestions, setSuggestions] = useState([])
6
 
 
 
 
 
 
7
  const search = e => {
8
- const matches = allSuggestions.filter(suggestion =>
9
- suggestion.searchText.includes(e.query.toLowerCase())
10
- )
 
 
 
 
 
11
  setSuggestions(matches)
12
  }
13
 
14
- const itemTemplate = item => {
15
- let detail
16
- if (item.type === "Dataset") {
17
- detail = <span>
18
- {item.detail.map(task => <span key={task} style={{ color: "gray", marginLeft: '1rem', backgroundColor: 'lightgray', padding: '0.2rem', borderRadius: '0.2rem' }}>{task}</span>)}
 
 
 
 
 
 
 
19
  </span>
20
- } else if (item.detail) {
21
- detail = <span style={{ color: 'gray', marginLeft: '1rem' }}>{item.detail}</span>
22
- } else {
23
- detail = null
24
- }
25
- return (
26
- <div
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
27
  style={{
28
  display: 'flex',
29
- flexDirection: 'row',
30
- justifyContent: 'space-between',
 
 
 
 
 
31
  }}
32
  >
33
- <span>{item.value}{detail}</span>
34
- <span style={{ color: 'gray' }}>{item.type}</span>
35
- </div>
36
- )
37
- }
38
-
39
- return (
40
- <PrimeAutoComplete
41
- placeholder='Search for model, language, or dataset'
42
- value={autoComplete}
43
- onChange={e => setAutoComplete(e.value)}
44
- onSelect={e => {
45
- setAutoComplete(e.value.value)
46
- onComplete(e.value)
47
- }}
48
- suggestions={suggestions}
49
- completeMethod={search}
50
- virtualScrollerOptions={{ itemSize: 50 }}
51
- delay={500}
52
- autoHighlight
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