David Pomerenke commited on
Commit
b6b84c7
·
1 Parent(s): 6baf3ad

Store filter state globally

Browse files
frontend/src/App.js CHANGED
@@ -8,13 +8,23 @@ import WorldMap from './components/WorldMap'
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 [allSuggestions, setAllSuggestions] = useState([])
17
- const [filters, setFilters] = useState([])
 
 
 
 
 
 
 
 
 
18
  useEffect(() => {
19
  fetch('/results.json')
20
  .then(response => {
@@ -93,7 +103,25 @@ function App () {
93
  </p>
94
  <AutoComplete
95
  allSuggestions={allSuggestions}
96
- onComplete={item => setFilters(prevFilters => [item])}
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
97
  />
98
  </header>
99
  <main
@@ -121,7 +149,11 @@ function App () {
121
  maxWidth: 'min(100vw, 800px)'
122
  }}
123
  >
124
- <ModelTable data={data} />
 
 
 
 
125
  </div>
126
  <div
127
  style={{
@@ -129,7 +161,11 @@ function App () {
129
  maxWidth: 'min(100vw, 800px)'
130
  }}
131
  >
132
- <LanguageTable data={data} />
 
 
 
 
133
  </div>
134
  <div
135
  style={{
 
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 [languageFilters, setLanguageFilters] = useState({
19
+ language_name: { value: null, matchMode: FilterMatchMode.EQUALS }, // via global search
20
+ family: { value: null, matchMode: FilterMatchMode.IN },
21
+ speakers: { value: null, matchMode: FilterMatchMode.BETWEEN }
22
+ })
23
+ const [modelFilters, setModelFilters] = useState({
24
+ model: { value: null, matchMode: FilterMatchMode.ENDS_WITH }, // via global search
25
+ type: { value: null, matchMode: FilterMatchMode.IN },
26
+ size: { value: null, matchMode: FilterMatchMode.BETWEEN }
27
+ })
28
  useEffect(() => {
29
  fetch('/results.json')
30
  .then(response => {
 
103
  </p>
104
  <AutoComplete
105
  allSuggestions={allSuggestions}
106
+ onComplete={item => {
107
+ const languageValue =
108
+ item.type === 'Language' ? item.detail : null
109
+ const modelValue = item.type === 'Model' ? item.value : null
110
+ setLanguageFilters(prevFilters => ({
111
+ ...prevFilters,
112
+ language_name: {
113
+ value: languageValue,
114
+ matchMode: FilterMatchMode.EQUALS
115
+ }
116
+ }))
117
+ setModelFilters(prevFilters => ({
118
+ ...prevFilters,
119
+ model: {
120
+ value: modelValue,
121
+ matchMode: FilterMatchMode.ENDS_WITH
122
+ }
123
+ }))
124
+ }}
125
  />
126
  </header>
127
  <main
 
149
  maxWidth: 'min(100vw, 800px)'
150
  }}
151
  >
152
+ <ModelTable
153
+ data={data}
154
+ filters={modelFilters}
155
+ setFilters={setModelFilters}
156
+ />
157
  </div>
158
  <div
159
  style={{
 
161
  maxWidth: 'min(100vw, 800px)'
162
  }}
163
  >
164
+ <LanguageTable
165
+ data={data}
166
+ filters={languageFilters}
167
+ setFilters={setLanguageFilters}
168
+ />
169
  </div>
170
  <div
171
  style={{
frontend/src/components/AutoComplete.js CHANGED
@@ -44,7 +44,7 @@ const AutoComplete = ({ allSuggestions, onComplete }) => {
44
  onChange={e => setAutoComplete(e.value)}
45
  onSelect={e => {
46
  setAutoComplete(e.value.value)
47
- onComplete(e.value.value)
48
  }}
49
  suggestions={suggestions}
50
  completeMethod={search}
 
44
  onChange={e => setAutoComplete(e.value)}
45
  onSelect={e => {
46
  setAutoComplete(e.value.value)
47
+ onComplete(e.value)
48
  }}
49
  suggestions={suggestions}
50
  completeMethod={search}
frontend/src/components/LanguageTable.js CHANGED
@@ -6,12 +6,7 @@ import { useState, useEffect } from 'react'
6
  import { Slider } from 'primereact/slider'
7
  import ScoreField from './ScoreField'
8
 
9
- const LanguageTable = ({ data }) => {
10
- const [filters, setFilters] = useState({
11
- language_name: { value: null, matchMode: FilterMatchMode.CONTAINS },
12
- family: { value: null, matchMode: FilterMatchMode.IN },
13
- speakers: { value: null, matchMode: FilterMatchMode.BETWEEN },
14
- })
15
  const table = data.language_table
16
 
17
  const families = [...new Set(table.map(item => item.family))].slice(0, 10)
 
6
  import { Slider } from 'primereact/slider'
7
  import ScoreField from './ScoreField'
8
 
9
+ const LanguageTable = ({ data, filters, setFilters }) => {
 
 
 
 
 
10
  const table = data.language_table
11
 
12
  const families = [...new Set(table.map(item => item.family))].slice(0, 10)
frontend/src/components/ModelTable.js CHANGED
@@ -7,13 +7,7 @@ import Medal from './Medal'
7
  import { Slider } from 'primereact/slider'
8
  import ScoreField from './ScoreField'
9
 
10
- const ModelTable = ({ data }) => {
11
- const [filters, setFilters] = useState({
12
- provider: { value: null, matchMode: FilterMatchMode.IN },
13
- model: { value: null, matchMode: FilterMatchMode.CONTAINS },
14
- type: { value: null, matchMode: FilterMatchMode.IN },
15
- size: { value: null, matchMode: FilterMatchMode.BETWEEN }
16
- })
17
  const table = data.model_table
18
  const rankBodyTemplate = rowData => {
19
  return <Medal rank={rowData.rank} />
 
7
  import { Slider } from 'primereact/slider'
8
  import ScoreField from './ScoreField'
9
 
10
+ const ModelTable = ({ data, filters, setFilters }) => {
 
 
 
 
 
 
11
  const table = data.model_table
12
  const rankBodyTemplate = rowData => {
13
  return <Medal rank={rowData.rank} />