From a61088c6be88093ef720a9d9f320716dd0f9447c Mon Sep 17 00:00:00 2001 From: Berkeley Martinez Date: Wed, 22 Jun 2016 16:43:48 -0700 Subject: [PATCH] Feature(map): add expand/collapse all button/logic --- .../challenges/components/map/Header.jsx | 43 +++++++++++++++---- common/app/routes/challenges/redux/actions.js | 2 + common/app/routes/challenges/redux/reducer.js | 16 ++++++- common/app/routes/challenges/redux/types.js | 2 + 4 files changed, 54 insertions(+), 9 deletions(-) diff --git a/common/app/routes/challenges/components/map/Header.jsx b/common/app/routes/challenges/components/map/Header.jsx index 7f0c26e657..41e81c8782 100644 --- a/common/app/routes/challenges/components/map/Header.jsx +++ b/common/app/routes/challenges/components/map/Header.jsx @@ -3,13 +3,26 @@ import { connect } from 'react-redux'; import PureComponent from 'react-pure-render/component'; import { InputGroup, FormControl, Button, Row } from 'react-bootstrap'; import classnames from 'classnames'; -import { clearFilter, updateFilter } from '../../redux/actions'; +import { + clearFilter, + updateFilter, + collapseAll, + expandAll +} from '../../redux/actions'; const ESC = 27; const clearIcon = ; const searchIcon = ; -const bindableActions = { clearFilter, updateFilter }; -const mapStateToProps = state => ({ filter: state.challengesApp.filter }); +const bindableActions = { + clearFilter, + updateFilter, + collapseAll, + expandAll +}; +const mapStateToProps = state => ({ + isAllCollapsed: state.challengesApp.mapUi.isAllCollapsed, + filter: state.challengesApp.filter +}); export class Header extends PureComponent { constructor(...props) { super(...props); @@ -17,9 +30,12 @@ export class Header extends PureComponent { } static displayName = 'MapHeader'; static propTypes = { - clearFilter: PropTypes.func, + isAllCollapsed: PropTypes.bool, filter: PropTypes.string, - updateFilter: PropTypes.func + clearFilter: PropTypes.func, + updateFilter: PropTypes.func, + collapseAll: PropTypes.func, + expandAll: PropTypes.func }; handleKeyDown(e) { @@ -37,14 +53,24 @@ export class Header extends PureComponent { render() { const { + filter, updateFilter, clearFilter, - filter + collapseAll, + expandAll, + isAllCollapsed } = this.props; const inputClass = classnames({ 'map-filter': true, filled: !!filter }); + const buttonClass = classnames({ + 'center-block': true, + active: isAllCollapsed + }); + const buttonCopy = isAllCollapsed ? + 'Expand all challenges' : + 'Collapse all challenges'; return (
- Collapse all challenges + { buttonCopy } diff --git a/common/app/routes/challenges/redux/actions.js b/common/app/routes/challenges/redux/actions.js index f48790d141..8890e2251f 100644 --- a/common/app/routes/challenges/redux/actions.js +++ b/common/app/routes/challenges/redux/actions.js @@ -64,6 +64,8 @@ export const initMap = createAction( } ); export const toggleThisPanel = createAction(types.toggleThisPanel); +export const collapseAll = createAction(types.collapseAll); +export const expandAll = createAction(types.expandAll); export const clearFilter = createAction(types.clearFilter); diff --git a/common/app/routes/challenges/redux/reducer.js b/common/app/routes/challenges/redux/reducer.js index b072489158..073408ad96 100644 --- a/common/app/routes/challenges/redux/reducer.js +++ b/common/app/routes/challenges/redux/reducer.js @@ -46,7 +46,7 @@ const initialState = { legacyKey: '', files: {}, // map - mapUi: {}, + mapUi: { isAllCollapsed: false }, filter: '', superBlocks: [], // misc @@ -246,6 +246,20 @@ const mapReducer = handleActions( [types.toggleThisPanel]: (state, { payload }) => ({ ...state, [payload]: !state[payload] + }), + [types.collapseAll]: state => ({ + ...Object.keys(state).reduce((newState, key) => { + newState[key] = false; + return newState; + }, {}), + isAllCollapsed: true + }), + [types.expandAll]: state => ({ + ...Object.keys(state).reduce((newState, key) => { + newState[key] = true; + return newState; + }, {}), + isAllCollapsed: false }) }, initialState.mapUi diff --git a/common/app/routes/challenges/redux/types.js b/common/app/routes/challenges/redux/types.js index c758986620..3a17532170 100644 --- a/common/app/routes/challenges/redux/types.js +++ b/common/app/routes/challenges/redux/types.js @@ -22,6 +22,8 @@ export default createTypes([ 'clearFilter', 'initMap', 'toggleThisPanel', + 'collapseAll', + 'expandAll', // files 'updateFile',