1
-
2
1
import { css , jsx } from '@emotion/react' ;
3
2
import React , { useContext } from 'react' ;
4
3
import get from 'lodash/get' ;
@@ -8,51 +7,100 @@ import ThemeContext from '../../style/themes/ThemeContext';
8
7
import { Trigger as MetaFilter } from '../../widgets/Filter/types/MetaFilter' ;
9
8
10
9
function getVisibleFilters ( currentFilter , commonFilters ) {
11
- const visibleFilters = union ( commonFilters ,
10
+ const visibleFilters = union (
11
+ commonFilters ,
12
12
Object . keys ( get ( currentFilter , 'must' , { } ) ) ,
13
- Object . keys ( get ( currentFilter , 'must_not' , { } ) ) ) ;
13
+ Object . keys ( get ( currentFilter , 'must_not' , { } ) )
14
+ ) ;
14
15
return visibleFilters ;
15
16
}
16
17
18
+ const FilterBarContent = ( { className = '' , config, filter, ...props } ) => {
19
+ const theme = useContext ( ThemeContext ) ;
20
+
21
+ const visibleFilters = getVisibleFilters (
22
+ filter ,
23
+ config . defaultVisibleFilters
24
+ ) ;
25
+ const availableFilters = visibleFilters . map ( ( x ) => config . filters [ x ] ) ;
26
+
27
+ return (
28
+ < div className = { className } css = { style ( theme ) } { ...props } >
29
+ { availableFilters . map ( ( x , i ) => {
30
+ if ( ! x ) return null ; // if no widget is defined for this filter, then do not show anything
31
+ return < x . Button key = { i } /> ;
32
+ } ) }
33
+ { Object . keys ( config . filters ) . length !==
34
+ config . defaultVisibleFilters . length && (
35
+ < div >
36
+ < MetaFilter />
37
+ </ div >
38
+ ) }
39
+ </ div >
40
+ ) ;
41
+ } ;
42
+
17
43
const FilterBar = ( {
18
44
className = '' ,
19
45
config,
20
46
filter,
47
+ withWrapper = true ,
21
48
...props
22
49
} ) => {
23
50
const theme = useContext ( ThemeContext ) ;
24
51
const prefix = theme . prefix || 'gbif' ;
25
52
const elementName = 'filterBar' ;
26
53
27
- const visibleFilters = getVisibleFilters ( filter , config . defaultVisibleFilters ) ;
28
- const availableFilters = visibleFilters . map ( x => config . filters [ x ] ) ;
29
-
30
- return < div className = { `${ className } ${ prefix } -${ elementName } ` } css = { css `${ style ( theme ) } ` } { ...props } >
31
- { availableFilters . map ( ( x , i ) => {
32
- if ( ! x ) return null ; // if no widget is defined for this filter, then do not show anything
33
- return < x . Button key = { i } />
34
- } ) }
35
- { Object . keys ( config . filters ) . length !== config . defaultVisibleFilters . length &&
36
- < div >
37
- < MetaFilter />
38
- </ div > }
39
- </ div >
40
- }
54
+ return withWrapper ? (
55
+ < div
56
+ className = { `${ className } ${ prefix } -${ elementName } ` }
57
+ css = { cssFilter ( { theme } ) }
58
+ { ...props }
59
+ >
60
+ < div css = { title ( { theme } ) } > FILTERS</ div >
61
+ < FilterBarContent config = { config } filter = { filter } />
62
+ </ div >
63
+ ) : (
64
+ < FilterBarContent
65
+ config = { config }
66
+ filter = { filter }
67
+ className = { `${ className } ${ prefix } -${ elementName } ` }
68
+ { ...props }
69
+ />
70
+ ) ;
71
+ } ;
41
72
42
- FilterBar . propTypes = {
43
- }
73
+ FilterBarContent . propTypes = { } ;
44
74
45
75
export const style = ( theme ) => css `
46
76
display : flex;
47
77
flex-direction : row;
48
78
flex-wrap : wrap;
49
79
margin-bottom : -4px ;
50
- > div {
80
+ > div {
51
81
max-width : 100% ;
52
- margin-right : 4px ;
82
+ margin-right : 4px ;
53
83
margin-bottom : 4px ;
54
84
}
55
85
` ;
56
86
87
+ export const title = ( { theme } ) => css `
88
+ position : absolute;
89
+ font-size : 0.9em ;
90
+ font-weight : bold;
91
+ color : ${ theme . color500 } ;
92
+ top : -14px ;
93
+ left : 10px ;
94
+ background-color : ${ theme . paperBackground } ;
95
+ padding : 4px ;
96
+ ` ;
97
+
98
+ export const cssFilter = ( { theme } ) => css `
99
+ position : relative;
100
+ padding : 12px ;
101
+ border : 1px solid ${ theme . paperBorderColor } ;
102
+ border-radius : ${ theme . borderRadius } px;
103
+ ` ;
104
+
57
105
const mapContextToProps = ( { filter } ) => ( { filter } ) ;
58
106
export default withFilter ( mapContextToProps ) ( FilterBar ) ;
0 commit comments