import React from 'react'; import update from 'immutability-helper'; import block from 'bem-block'; import cx from 'classnames'; import ConnectionMap from './map/connection-map.class'; import { IAvailableCountryFilter, IAvailableFilters } from './data'; import SVGIconInfo from './svg/icon-info.svg'; import SVGIconTick from './svg/tick.svg'; import SVGIconArrowBack from './svg/arrow-back.svg'; import findIndex from 'lodash/findIndex'; interface ISidebarFilterConfig { label: string; filterName: string; filterPath: Array; valueIfChecked: any; valueIfUnChecked: any; hasInfo?: boolean; infoText?: string; } interface IFilterSidebarProps { map: ConnectionMap; availableFilters: IAvailableFilters; onBackAction: () => void; } interface IFilterSidebarState { filters: { [x: string]: boolean; }; showInfo: { [x: string]: boolean; }; selectedCountries: Array; selectedCountryIndex: number; } const bem = block('sidebar'); const isListedFilters = [ { label: 'All', filterName: 'isListedNone', filterValue: null }, { label: 'Listed', filterName: 'isListedTrue', filterValue: true }, { label: 'Private', filterName: 'isListedFalse', filterValue: false } ]; export default class FilterSideBar extends React.Component< IFilterSidebarProps, IFilterSidebarState > { state = { filters: { isListedNone: true }, showInfo: {}, selectedCountries: [], selectedCountryIndex: -1 }; private _handleFilterCheckboxChange( { filterName, filterPath, valueIfChecked = true, valueIfUnChecked = false }: ISidebarFilterConfig, event: React.ChangeEvent ) { const checked = event.target.checked; this.setState(oldState => update(oldState, { filters: { $merge: { [filterName]: checked } } }) ); this.props.map.setFilter( filterPath, checked ? valueIfChecked : valueIfUnChecked ); } private _handleListedFilterRadioChange( { filterName, filterValue }, event: React.ChangeEvent ) { const checked = event.target.checked; const filterUpdate = isListedFilters.reduce((prev, curr) => { prev[curr.filterName] = false; return prev; }, {}); filterUpdate[filterName] = checked; this.setState( oldState => update(oldState, { filters: { $merge: filterUpdate } }), () => { this.props.map.setFilter(['company', 'isListed'], filterValue); } ); } private _handleCountrySelectChange( event: React.ChangeEvent ) { if (parseInt(event.target.value, 10) >= 0) { const selectedCountry = this.props.availableFilters.countries[ event.target.value ]; this.setState(oldState => update(oldState, { selectedCountries: { $push: [selectedCountry] } }) ); this.props.map.setFilter( ['country_iso3'], selectedCountry.country_iso3, selectedCountry.country_iso3 ); } } private _handleSelectedCountryRemove( selectedCountry: IAvailableCountryFilter ) { this.setState(oldState => update(oldState, { selectedCountries: { $splice: [ [ oldState.selectedCountries.findIndex( country => country.country_iso3 === selectedCountry.country_iso3 ), 1 ] ] } }) ); this.props.map.setFilter( ['country_iso3'], null, selectedCountry.country_iso3 ); } private _renderCheckboxFromFilter = ( filter: ISidebarFilterConfig, changeFn?: ( filter: ISidebarFilterConfig, event: React.ChangeEvent ) => void ) => ( ); private _clearAllFilters(event: React.MouseEvent) { this.props.map.clearFilters(); this.setState(oldState => ({ filters: { isListedNone: true }, selectedCountries: [], selectedCountryIndex: -1 })); } private _isFiltered = () => this.state.filters['isListedTrue'] || this.state.filters['isListedFalse'] || (Object.keys(this.state.filters).length > 1 || this.state.selectedCountries.length > 0); render() { const filters = [ { label: 'scoutAsia companies', filterName: 'isScoutCompany', filterPath: ['isScoutCompany'], valueIfChecked: true, valueIfUnChecked: null, hasInfo: true, infoText: 'scoutAsia companies have revenues over $10m, or at least 150 employees, and operate within 24 Asian countries.' } ]; return ( ); } }