David Pomerenke commited on
Commit
f723129
·
1 Parent(s): dd24d65

Search field

Browse files
frontend/src/App.js CHANGED
@@ -4,10 +4,14 @@ import 'primereact/resources/themes/lara-light-cyan/theme.css'
4
  import ModelTable from './components/ModelTable'
5
  import LanguageTable from './components/LanguageTable'
6
  import DatasetTable from './components/DatasetTable'
 
 
7
  function App () {
8
  const [data, setData] = useState(null)
9
  const [loading, setLoading] = useState(true)
10
  const [error, setError] = useState(null)
 
 
11
 
12
  useEffect(() => {
13
  fetch('/results.json')
@@ -27,7 +31,18 @@ function App () {
27
  })
28
  }, [])
29
 
 
 
 
 
 
 
 
 
 
 
30
  return (
 
31
  <div style={{ height: '100%', display: 'flex', flexDirection: 'column' }}>
32
  <header
33
  style={{
@@ -53,12 +68,9 @@ function App () {
53
  <p style={{ fontSize: '1.15rem', color: '#555', marginTop: '0' }}>
54
  Tracking language proficiency of AI models for every language
55
  </p>
 
56
  </header>
57
- <PrimeReactProvider>
58
- {loading && <p>...</p>}
59
- {error && <p>Error: {error}</p>}
60
- {data && (
61
- <div
62
  style={{
63
  display: 'flex',
64
  flexDirection: 'row',
@@ -71,6 +83,10 @@ function App () {
71
  paddingBottom: '5vh'
72
  }}
73
  >
 
 
 
 
74
  <div
75
  style={{
76
  flex: '60vw 100vw 40vw',
@@ -95,10 +111,11 @@ function App () {
95
  >
96
  <DatasetTable data={data} />
97
  </div>
98
- </div>
99
  )}
100
- </PrimeReactProvider>
101
  </div>
 
102
  )
103
  }
104
 
 
4
  import ModelTable from './components/ModelTable'
5
  import LanguageTable from './components/LanguageTable'
6
  import DatasetTable from './components/DatasetTable'
7
+ import AutoComplete from './components/AutoComplete'
8
+
9
  function App () {
10
  const [data, setData] = useState(null)
11
  const [loading, setLoading] = useState(true)
12
  const [error, setError] = useState(null)
13
+ const [allSuggestions, setAllSuggestions] = useState([])
14
+ const [filters, setFilters] = useState([])
15
 
16
  useEffect(() => {
17
  fetch('/results.json')
 
31
  })
32
  }, [])
33
 
34
+ useEffect(() => {
35
+ if (data) {
36
+ const models = data.model_table.map(item => ({ type: 'Model', value: item.model, searchText: item.provider.toLowerCase() + ' ' + item.model.toLowerCase() }))
37
+ const languages = data.language_table.map(item => ({ type: 'Language', value: item.language_name, searchText: item.language_name.toLowerCase() }))
38
+ const datasets = data.dataset_table.map(item => ({ type: 'Dataset', value: item.name, searchText: item.author.toLowerCase() + ' ' + item.name.toLowerCase() + ' ' + item.tasks.map(task => task.toLowerCase()).join(' ') }))
39
+ const allSuggestions = [...models, ...languages, ...datasets]
40
+ setAllSuggestions(allSuggestions)
41
+ }
42
+ }, [data])
43
+
44
  return (
45
+ <PrimeReactProvider>
46
  <div style={{ height: '100%', display: 'flex', flexDirection: 'column' }}>
47
  <header
48
  style={{
 
68
  <p style={{ fontSize: '1.15rem', color: '#555', marginTop: '0' }}>
69
  Tracking language proficiency of AI models for every language
70
  </p>
71
+ <AutoComplete allSuggestions={allSuggestions} onComplete={item => setFilters(prevFilters => [item])} />
72
  </header>
73
+ <main
 
 
 
 
74
  style={{
75
  display: 'flex',
76
  flexDirection: 'row',
 
83
  paddingBottom: '5vh'
84
  }}
85
  >
86
+ {loading && <p>...</p>}
87
+ {error && <p>Error: {error}</p>}
88
+ {data && (
89
+ <>
90
  <div
91
  style={{
92
  flex: '60vw 100vw 40vw',
 
111
  >
112
  <DatasetTable data={data} />
113
  </div>
114
+ </>
115
  )}
116
+ </main>
117
  </div>
118
+ </PrimeReactProvider>
119
  )
120
  }
121
 
frontend/src/components/AutoComplete.js ADDED
@@ -0,0 +1,50 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
+ console.log(allSuggestions)
9
+ const matches = allSuggestions.filter(suggestion =>
10
+ suggestion.searchText.includes(e.query.toLowerCase())
11
+ )
12
+ setSuggestions(matches)
13
+ }
14
+
15
+ const itemTemplate = item => {
16
+ return (
17
+ <div
18
+ style={{
19
+ display: 'flex',
20
+ flexDirection: 'row',
21
+ justifyContent: 'space-between'
22
+ }}
23
+ >
24
+ <div>{item.value}</div>
25
+ <div style={{ color: 'gray' }}>{item.type}</div>
26
+ </div>
27
+ )
28
+ }
29
+
30
+ return (
31
+ <PrimeAutoComplete
32
+ placeholder='Search for model, language, or dataset'
33
+ value={autoComplete}
34
+ onChange={e => setAutoComplete(e.value)}
35
+ onSelect={e => {
36
+ setAutoComplete(e.value.value)
37
+ onComplete(e.value.value)
38
+ }}
39
+ suggestions={suggestions}
40
+ completeMethod={search}
41
+ virtualScrollerOptions={{ itemSize: 50 }}
42
+ delay={500}
43
+ autoHighlight
44
+ autoFocus
45
+ itemTemplate={itemTemplate}
46
+ />
47
+ )
48
+ }
49
+
50
+ export default AutoComplete
frontend/src/index.css CHANGED
@@ -57,3 +57,11 @@ html, body, #root {
57
  background: linear-gradient(to bottom, #ffaa00, #ff8000);
58
  color: white;
59
  }
 
 
 
 
 
 
 
 
 
57
  background: linear-gradient(to bottom, #ffaa00, #ff8000);
58
  color: white;
59
  }
60
+
61
+ .p-autocomplete-input {
62
+ width: max(100%, 40vw);
63
+ margin-top: 2vh;
64
+ border-radius: 0px;
65
+ border: 1px solid rgba(0, 0, 0, 0.7);
66
+ box-shadow: 3px 3px 1px 0px rgba(0, 0, 0, 0.2);;
67
+ }