Skip to content

Commit b7f0928

Browse files
author
David Emory
committed
feat(form): Initial work on detailed, mobile-ready settings panel
1 parent 3413bc7 commit b7f0928

File tree

8 files changed

+216
-1
lines changed

8 files changed

+216
-1
lines changed

lib/actions/ui.js

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
import { createAction } from 'redux-actions'
2+
3+
export const setShowExtendedSettings = createAction('SET_SHOW_EXTENDED_SETTINGS')

lib/components/form/form.css

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,3 +12,44 @@
1212
text-align: center;
1313
margin: 8px 0px;
1414
}
15+
16+
.otp .settings-bar {
17+
position: relative;
18+
}
19+
20+
.otp .settings-bar .button-container {
21+
float: right;
22+
}
23+
24+
.otp .settings-selector-panel {
25+
padding: 10px;
26+
}
27+
28+
.otp .settings-selector-panel .button-row {
29+
margin-bottom: 20px;
30+
}
31+
32+
.otp .settings-selector-panel .button-row .selected {
33+
background-color: #ccc;
34+
}
35+
36+
.otp .modes-panel .mode-group-row {
37+
background-color: #ccc;
38+
margin-bottom: 10px;
39+
padding: 8px;
40+
}
41+
42+
.otp .modes-panel .mode-group-row .group-name {
43+
display: inline-block;
44+
vertical-align: top;
45+
width: 120px;
46+
padding-top: 10px;
47+
}
48+
49+
.otp .modes-panel .mode-group-row .mode-icon {
50+
display: inline-block;
51+
vertical-align: top;
52+
width: 36px;
53+
height: 36px;
54+
margin-left: 10px;
55+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
import React, { Component } from 'react'
2+
import { connect } from 'react-redux'
3+
4+
class GeneralSettingsPanel extends Component {
5+
render () {
6+
return (
7+
<div className='modes-panel'>
8+
General Settings
9+
</div>
10+
)
11+
}
12+
}
13+
14+
// connect to redux store
15+
16+
const mapStateToProps = (state, ownProps) => {
17+
return {
18+
}
19+
}
20+
21+
const mapDispatchToProps = (dispatch, ownProps) => {
22+
return {
23+
}
24+
}
25+
26+
export default connect(mapStateToProps, mapDispatchToProps)(GeneralSettingsPanel)

lib/components/form/modes-panel.js

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
import React, { Component, PropTypes } from 'react'
2+
import { connect } from 'react-redux'
3+
4+
class ModesPanel extends Component {
5+
static propTypes = {
6+
modeGroups: PropTypes.array
7+
}
8+
9+
render () {
10+
return (
11+
<div className='modes-panel'>
12+
{this.props.modeGroups.map((group, k) => {
13+
return (
14+
<div className='mode-group-row' key={k}>
15+
<div className='group-name'>{group.name}</div>
16+
{group.modes.map(mode => {
17+
return (
18+
<div key={mode} className={`mode-icon icon-mode-${mode.toLowerCase()}`} />
19+
)
20+
})}
21+
</div>
22+
)
23+
})}
24+
</div>
25+
)
26+
}
27+
}
28+
29+
// connect to redux store
30+
31+
const mapStateToProps = (state, ownProps) => {
32+
return {
33+
modeGroups: state.otp.config.modeGroups
34+
}
35+
}
36+
37+
const mapDispatchToProps = (dispatch, ownProps) => {
38+
return {
39+
}
40+
}
41+
42+
export default connect(mapStateToProps, mapDispatchToProps)(ModesPanel)
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
import React, { Component, PropTypes } from 'react'
2+
import { Button } from 'react-bootstrap'
3+
import { connect } from 'react-redux'
4+
5+
import { setShowExtendedSettings } from '../../actions/ui'
6+
7+
class SettingsBar extends Component {
8+
static propTypes = {
9+
setShowExtendedSettings: PropTypes.func,
10+
showExtendedSettings: PropTypes.bool
11+
}
12+
13+
render () {
14+
return (
15+
<div className='settings-bar'>
16+
<div className='button-container'>
17+
<Button
18+
className='settings-button'
19+
onClick={() => { this.props.setShowExtendedSettings2(!this.props.showExtendedSettings) }}
20+
>Settings</Button>
21+
</div>
22+
<div className='selected-modes'>All Modes</div>
23+
<div style={{ clear: 'both' }} />
24+
</div>
25+
)
26+
}
27+
}
28+
29+
const mapStateToProps = (state, ownProps) => {
30+
return {
31+
showExtendedSettings: state.otp.ui.showExtendedSettings
32+
}
33+
}
34+
35+
const mapDispatchToProps = (dispatch, ownProps) => {
36+
return {
37+
setShowExtendedSettings2: (showExtendedSettings) => {
38+
dispatch(setShowExtendedSettings({showExtendedSettings}))
39+
}
40+
}
41+
}
42+
43+
export default connect(mapStateToProps, mapDispatchToProps)(SettingsBar)
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
import React, { Component } from 'react'
2+
import { Button, ButtonGroup } from 'react-bootstrap'
3+
4+
import ModesPanel from './modes-panel'
5+
import GeneralSettingsPanel from './general-settings-panel'
6+
7+
const panels = [
8+
{
9+
key: 'MODES',
10+
text: 'Modes',
11+
component: <ModesPanel />
12+
}, {
13+
key: 'GENERAL',
14+
text: 'General',
15+
component: <GeneralSettingsPanel />
16+
}
17+
]
18+
19+
export default class SettingsSelectorPanel extends Component {
20+
constructor (props) {
21+
super(props)
22+
this.state = { activePanel: 'MODES' }
23+
}
24+
25+
render () {
26+
return (
27+
<div className='settings-selector-panel'>
28+
<div className='button-row'>
29+
<ButtonGroup justified>
30+
{panels.map(panel => {
31+
return (
32+
<ButtonGroup key={panel.key}>
33+
<Button
34+
className={panel.key === this.state.activePanel ? 'selected' : ''}
35+
onClick={() => this.setState({ activePanel: panel.key })}
36+
>{panel.text}</Button>
37+
</ButtonGroup>
38+
)
39+
})}
40+
</ButtonGroup>
41+
</div>
42+
{panels.find(p => p.key === this.state.activePanel).component}
43+
</div>
44+
)
45+
}
46+
}

lib/index.js

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,12 @@
11
import DateTimeSelector from './components/form/date-time-selector'
22
import ErrorMessage from './components/form/error-message'
3+
import GeneralSettingsPanel from './components/form/general-settings-panel'
34
import LocationField from './components/form/location-field'
45
import ModeSelector from './components/form/mode-selector'
6+
import ModesPanel from './components/form/modes-panel'
57
import PlanTripButton from './components/form/plan-trip-button'
8+
import SettingsBar from './components/form/settings-bar'
9+
import SettingsSelectorPanel from './components/form/settings-selector-panel'
610
import SwitchButton from './components/form/switch-button'
711

812
import BaseLayers from './components/map/base-layers'
@@ -23,9 +27,13 @@ export {
2327
// form components
2428
DateTimeSelector,
2529
ErrorMessage,
30+
GeneralSettingsPanel,
2631
LocationField,
2732
ModeSelector,
33+
ModesPanel,
2834
PlanTripButton,
35+
SettingsBar,
36+
SettingsSelectorPanel,
2937
SwitchButton,
3038

3139
// map components

lib/reducers/create-otp-reducer.js

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,10 @@ function createOtpReducer (config, initialQuery) {
3131
config: Object.assign(defaultConfig, config),
3232
currentQuery,
3333
searches: [],
34-
activeSearch: 0
34+
activeSearch: 0,
35+
ui: {
36+
showExtendedSettings: false
37+
}
3538
}
3639

3740
return (state = initialState, action) => {
@@ -108,6 +111,9 @@ function createOtpReducer (config, initialQuery) {
108111
case 'SET_AUTOPLAN':
109112
return update(state, { config: { autoPlan: { $set: action.payload.autoPlan } } })
110113

114+
case 'SET_SHOW_EXTENDED_SETTINGS':
115+
return update(state, { ui: { showExtendedSettings: { $set: action.payload.showExtendedSettings } } })
116+
111117
default:
112118
return state
113119
}

0 commit comments

Comments
 (0)