|
1 | 1 | import React, { useState } from 'react' |
2 | 2 | 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' |
4 | 4 | import pluralize from 'pluralize' |
5 | 5 | import _find from 'lodash/find' |
6 | 6 | import _remove from 'lodash/remove' |
7 | 7 |
|
8 | | -import { fetchFacetFilters } from '~/lib/scp-api' |
9 | 8 | 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' |
11 | 11 |
|
12 | 12 | /** |
13 | 13 | * Component for filter search and filter lists |
14 | 14 | */ |
15 | 15 | export default function FiltersBoxSearchable({ facet, selection, setSelection, show, setShow, hideControls }) { |
16 | 16 | // State that is specific to FiltersBox |
17 | 17 | const [matchingFilters, setMatchingFilters] = useState(facet.filters) |
| 18 | + const [searchText, setSearchText] = useState('') |
18 | 19 | const [hasFilterSearchResults, setHasFilterSearchResults] = useState(false) |
19 | 20 |
|
20 | 21 | /* |
@@ -42,14 +43,17 @@ export default function FiltersBoxSearchable({ facet, selection, setSelection, s |
42 | 43 | * For example, among the many filters in the "Disease" facet, search |
43 | 44 | * for filters matching the term "tuberculosis". |
44 | 45 | */ |
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 |
49 | 54 |
|
50 | 55 | setHasFilterSearchResults(hasResults) |
51 | | - |
52 | | - setMatchingFilters(matchingFilters) |
| 56 | + setMatchingFilters(newFilters) |
53 | 57 | } |
54 | 58 |
|
55 | 59 | /** |
@@ -98,10 +102,30 @@ export default function FiltersBoxSearchable({ facet, selection, setSelection, s |
98 | 102 | show && <div className={componentName} id={componentId}> |
99 | 103 | { showSearchBar && ( |
100 | 104 | <> |
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> |
105 | 129 | { selectedFilterBadges } |
106 | 130 | <div className='filters-box-header'> |
107 | 131 | <span className='default-filters-list-name'> |
|
0 commit comments