@@ -27,29 +27,30 @@ export default class BrowserFilter extends React.Component {
27
27
open : false ,
28
28
filters : new List ( ) ,
29
29
} ;
30
+ this . toggle = this . toggle . bind ( this )
30
31
}
31
32
32
33
componentDidMount ( ) {
33
34
this . node = ReactDOM . findDOMNode ( this ) ;
34
35
}
35
36
36
37
componentWillReceiveProps ( props ) {
37
- if ( props . schema !== this . props . schema ) {
38
+ if ( props . className !== this . props . className ) {
38
39
this . setState ( { open : false } ) ;
39
40
}
40
41
}
41
42
42
- open ( ) {
43
+ toggle ( ) {
43
44
let filters = this . props . filters ;
44
45
if ( this . props . filters . size === 0 ) {
45
46
let available = Filters . availableFilters ( this . props . schema , null , BLACKLISTED_FILTERS ) ;
46
47
let field = Object . keys ( available ) [ 0 ] ;
47
48
filters = new List ( [ new Map ( { field : field , constraint : available [ field ] [ 0 ] } ) ] ) ;
48
49
}
49
- this . setState ( {
50
- open : true ,
50
+ this . setState ( prevState => ( {
51
+ open : ! prevState . open ,
51
52
filters : filters ,
52
- } ) ;
53
+ } ) ) ;
53
54
this . props . setCurrent ( null ) ;
54
55
}
55
56
@@ -62,9 +63,7 @@ export default class BrowserFilter extends React.Component {
62
63
}
63
64
64
65
clear ( ) {
65
- this . setState ( { open : false } , ( ) => {
66
- this . props . onChange ( new Map ( ) ) ;
67
- } ) ;
66
+ this . props . onChange ( new Map ( ) ) ;
68
67
}
69
68
70
69
apply ( ) {
@@ -76,27 +75,26 @@ export default class BrowserFilter extends React.Component {
76
75
}*/
77
76
return filter ;
78
77
} )
79
- this . setState ( { open : false } , ( ) => {
80
- this . props . onChange ( formatted ) ;
81
- } ) ;
78
+ this . props . onChange ( formatted ) ;
82
79
}
83
80
84
81
render ( ) {
85
82
let popover = null ;
83
+ let buttonStyle = [ styles . entry ] ;
84
+
86
85
if ( this . state . open ) {
87
86
let position = Position . inDocument ( this . node ) ;
88
87
let popoverStyle = [ styles . popover ] ;
88
+ buttonStyle . push ( styles . title ) ;
89
+
89
90
if ( this . props . filters . size ) {
90
91
popoverStyle . push ( styles . active ) ;
91
92
}
92
93
let available = Filters . availableFilters ( this . props . schema , this . state . filters ) ;
93
94
popover = (
94
- < Popover fixed = { true } position = { position } >
95
+ < Popover fixed = { true } position = { position } onExternalClick = { this . toggle } >
95
96
< div className = { popoverStyle . join ( ' ' ) } onClick = { ( ) => this . props . setCurrent ( null ) } >
96
- < div className = { styles . title } onClick = { ( ) => this . setState ( { open : false } ) } >
97
- < Icon name = 'filter-solid' width = { 14 } height = { 14 } />
98
- < span > { this . props . filters . size ? 'Filtered' : 'Filter' } </ span >
99
- </ div >
97
+ < div onClick = { this . toggle } style = { { cursor : 'pointer' , width : this . node . clientWidth , height : this . node . clientHeight } } > </ div >
100
98
< div className = { styles . body } >
101
99
< Filter
102
100
blacklist = { BLACKLISTED_FILTERS }
@@ -129,13 +127,12 @@ export default class BrowserFilter extends React.Component {
129
127
</ Popover >
130
128
) ;
131
129
}
132
- let buttonStyle = [ styles . entry ] ;
133
130
if ( this . props . filters . size ) {
134
131
buttonStyle . push ( styles . active ) ;
135
132
}
136
133
return (
137
134
< div className = { styles . wrap } >
138
- < div className = { buttonStyle . join ( ' ' ) } onClick = { this . open . bind ( this ) } >
135
+ < div className = { buttonStyle . join ( ' ' ) } onClick = { this . toggle } >
139
136
< Icon name = 'filter-solid' width = { 14 } height = { 14 } />
140
137
< span > { this . props . filters . size ? 'Filtered' : 'Filter' } </ span >
141
138
</ div >
0 commit comments