Skip to content

Commit f26feb9

Browse files
authored
Merge pull request #2285 from broadinstitute/jb-facet-filter-varname
Fixing filter search state bug when IDs are duplicated (SCP-6028)
2 parents eb5da34 + 35137a1 commit f26feb9

File tree

3 files changed

+39
-58
lines changed

3 files changed

+39
-58
lines changed

app/javascript/components/search/controls/FiltersBoxSearchable.jsx

Lines changed: 37 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,21 @@
11
import React, { useState } from 'react'
22
import { FontAwesomeIcon } from '@fortawesome/react-fontawesome'
3-
import { faExternalLinkAlt, faTimesCircle } from '@fortawesome/free-solid-svg-icons'
3+
import { faExternalLinkAlt, faSearch, faTimesCircle } from '@fortawesome/free-solid-svg-icons'
44
import pluralize from 'pluralize'
55
import _find from 'lodash/find'
66
import _remove from 'lodash/remove'
77

8-
import { fetchFacetFilters } from '~/lib/scp-api'
98
import FiltersBox from './FiltersBox'
10-
import FiltersSearchBar from './FiltersSearchBar'
9+
import FormControl from 'react-bootstrap/lib/FormControl'
10+
import Button from 'react-bootstrap/lib/Button'
1111

1212
/**
1313
* Component for filter search and filter lists
1414
*/
1515
export default function FiltersBoxSearchable({ facet, selection, setSelection, show, setShow, hideControls }) {
1616
// State that is specific to FiltersBox
1717
const [matchingFilters, setMatchingFilters] = useState(facet.filters)
18+
const [searchText, setSearchText] = useState('')
1819
const [hasFilterSearchResults, setHasFilterSearchResults] = useState(false)
1920

2021
/*
@@ -42,14 +43,17 @@ export default function FiltersBoxSearchable({ facet, selection, setSelection, s
4243
* For example, among the many filters in the "Disease" facet, search
4344
* for filters matching the term "tuberculosis".
4445
*/
45-
async function searchFilters(terms) {
46-
const apiData = await fetchFacetFilters(facet.id, terms)
47-
const matchingFilters = apiData.filters
48-
const hasResults = apiData.query !== '' && matchingFilters.length > 0
46+
function searchFilters(terms) {
47+
const lcTerms = terms.split(' ').map(text => text.toLowerCase())
48+
const newFilters = facet.filters.filter(facetFilter => {
49+
return lcTerms.some(lcTerm => {
50+
return facetFilter.name.toLowerCase().includes(lcTerm)
51+
})
52+
})
53+
const hasResults = newFilters.length > 0
4954

5055
setHasFilterSearchResults(hasResults)
51-
52-
setMatchingFilters(matchingFilters)
56+
setMatchingFilters(newFilters)
5357
}
5458

5559
/**
@@ -98,10 +102,30 @@ export default function FiltersBoxSearchable({ facet, selection, setSelection, s
98102
show && <div className={componentName} id={componentId}>
99103
{ showSearchBar && (
100104
<>
101-
<FiltersSearchBar
102-
filtersBoxId={componentId}
103-
searchFilters={searchFilters}
104-
/>
105+
<div className='filters-search-bar'>
106+
<div>
107+
<FormControl
108+
id={`filters-search-bar-${facet.id}`}
109+
type='text'
110+
autoComplete='false'
111+
placeholder='Search for a filter'
112+
value={searchText}
113+
onChange={e => {
114+
setSearchText(e.target.value)
115+
searchFilters(e.target.value)
116+
}
117+
}
118+
/>
119+
<div className="input-group-append">
120+
<Button
121+
className='search-button'
122+
aria-label='Search'
123+
>
124+
<FontAwesomeIcon icon={faSearch}/>
125+
</Button>
126+
</div>
127+
</div>
128+
</div>
105129
{ selectedFilterBadges }
106130
<div className='filters-box-header'>
107131
<span className='default-filters-list-name'>

app/javascript/components/search/controls/FiltersSearchBar.jsx

Lines changed: 0 additions & 44 deletions
This file was deleted.

app/models/search_facet.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -405,7 +405,8 @@ def get_unique_filter_values(public_only: false)
405405
end
406406
return filter_map if is_numeric?
407407

408-
filter_map.uniq { |filter| [filter[:id]&.downcase, filter[:name]&.downcase] }.reject do |filter|
408+
# some filters will have the same ontology id but different label, so take the first to prevent duplicates
409+
filter_map.uniq { |filter| [filter[:id]&.downcase] }.reject do |filter|
409410
filter[:id].blank? || filter[:name].blank?
410411
end
411412
end

0 commit comments

Comments
 (0)