@@ -27,29 +27,30 @@ export default class BrowserFilter extends React.Component {
2727 open : false ,
2828 filters : new List ( ) ,
2929 } ;
30+ this . toggle = this . toggle . bind ( this )
3031 }
3132
3233 componentDidMount ( ) {
3334 this . node = ReactDOM . findDOMNode ( this ) ;
3435 }
3536
3637 componentWillReceiveProps ( props ) {
37- if ( props . schema !== this . props . schema ) {
38+ if ( props . className !== this . props . className ) {
3839 this . setState ( { open : false } ) ;
3940 }
4041 }
4142
42- open ( ) {
43+ toggle ( ) {
4344 let filters = this . props . filters ;
4445 if ( this . props . filters . size === 0 ) {
4546 let available = Filters . availableFilters ( this . props . schema , null , BLACKLISTED_FILTERS ) ;
4647 let field = Object . keys ( available ) [ 0 ] ;
4748 filters = new List ( [ new Map ( { field : field , constraint : available [ field ] [ 0 ] } ) ] ) ;
4849 }
49- this . setState ( {
50- open : true ,
50+ this . setState ( prevState => ( {
51+ open : ! prevState . open ,
5152 filters : filters ,
52- } ) ;
53+ } ) ) ;
5354 this . props . setCurrent ( null ) ;
5455 }
5556
@@ -62,9 +63,7 @@ export default class BrowserFilter extends React.Component {
6263 }
6364
6465 clear ( ) {
65- this . setState ( { open : false } , ( ) => {
66- this . props . onChange ( new Map ( ) ) ;
67- } ) ;
66+ this . props . onChange ( new Map ( ) ) ;
6867 }
6968
7069 apply ( ) {
@@ -76,27 +75,26 @@ export default class BrowserFilter extends React.Component {
7675 }*/
7776 return filter ;
7877 } )
79- this . setState ( { open : false } , ( ) => {
80- this . props . onChange ( formatted ) ;
81- } ) ;
78+ this . props . onChange ( formatted ) ;
8279 }
8380
8481 render ( ) {
8582 let popover = null ;
83+ let buttonStyle = [ styles . entry ] ;
84+
8685 if ( this . state . open ) {
8786 let position = Position . inDocument ( this . node ) ;
8887 let popoverStyle = [ styles . popover ] ;
88+ buttonStyle . push ( styles . title ) ;
89+
8990 if ( this . props . filters . size ) {
9091 popoverStyle . push ( styles . active ) ;
9192 }
9293 let available = Filters . availableFilters ( this . props . schema , this . state . filters ) ;
9394 popover = (
94- < Popover fixed = { true } position = { position } >
95+ < Popover fixed = { true } position = { position } onExternalClick = { this . toggle } >
9596 < 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 >
10098 < div className = { styles . body } >
10199 < Filter
102100 blacklist = { BLACKLISTED_FILTERS }
@@ -129,13 +127,12 @@ export default class BrowserFilter extends React.Component {
129127 </ Popover >
130128 ) ;
131129 }
132- let buttonStyle = [ styles . entry ] ;
133130 if ( this . props . filters . size ) {
134131 buttonStyle . push ( styles . active ) ;
135132 }
136133 return (
137134 < div className = { styles . wrap } >
138- < div className = { buttonStyle . join ( ' ' ) } onClick = { this . open . bind ( this ) } >
135+ < div className = { buttonStyle . join ( ' ' ) } onClick = { this . toggle } >
139136 < Icon name = 'filter-solid' width = { 14 } height = { 14 } />
140137 < span > { this . props . filters . size ? 'Filtered' : 'Filter' } </ span >
141138 </ div >
0 commit comments