Skip to content

Commit d566f98

Browse files
feat(Select compared version): User can pick another (older) feed version to compare stats to the se
1 parent 3d8398f commit d566f98

File tree

7 files changed

+87
-34
lines changed

7 files changed

+87
-34
lines changed

lib/gtfs/reducers/filter.js

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import type {FilterState} from '../../types/reducers'
88

99
export const defaultState = {
1010
activeFeeds: {},
11+
comparedVersion: null,
1112
dateTimeFilter: {
1213
date: moment().format('YYYYMMDD'),
1314
from: 0, // 12 AM
@@ -50,11 +51,16 @@ const gtfsFilter = (state: FilterState = defaultState, action: Action): FilterSt
5051
})
5152
case 'SET_ACTIVE_FEEDVERSION':
5253
return update(state, {
54+
comparedVersion: {$set: action.payload ? action.payload.previousVersionId : null},
5355
showAllRoutesOnMap: {$set: false},
5456
patternFilter: {$set: null},
5557
routeFilter: {$set: null},
5658
version: {$set: action.payload ? action.payload.id : null}
5759
})
60+
case 'SET_COMPARED_FEEDVERSION':
61+
return update(state, {
62+
comparedVersion: {$set: action.payload ? action.payload.id : null}
63+
})
5864
case 'UPDATE_GTFS_MAP_STATE':
5965
return update(state, {map: {$set: action.payload}})
6066
case 'UPDATE_GTFS_PERMISSION_FILTER':

lib/manager/actions/versions.js

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,17 @@ export function setActiveVersion (version: FeedVersion) {
115115
}
116116
}
117117
}
118+
// setComparedVersion used in components
119+
export const settingComparedVersion = createAction(
120+
'SET_COMPARED_FEEDVERSION',
121+
(payload: FeedVersion) => payload
122+
)
123+
export function setComparedVersion (version: FeedVersion) {
124+
return function (dispatch: dispatchFn, getState: getStateFn) {
125+
// Dispatch action to set value in reducer.
126+
dispatch(settingComparedVersion(version))
127+
}
128+
}
118129
const uploadingFeed = createVoidPayloadAction('UPLOADING_FEED')
119130

120131
export type VersionActions = ActionType<typeof deletingFeedVersion> |
@@ -613,6 +624,17 @@ export function setVersionIndex (
613624
}
614625
}
615626
627+
export function setComparedVersionIndex (
628+
feed: Feed,
629+
index: number
630+
) {
631+
return function (dispatch: dispatchFn, getState: getStateFn) {
632+
if (feed.feedVersions) {
633+
dispatch(setComparedVersion(feed.feedVersions[index - 1]))
634+
}
635+
}
636+
}
637+
616638
/**
617639
* Starts the export shapes server job for a particular feed version.
618640
*

lib/manager/components/version/FeedVersionNavigator.js

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import type {FeedVersion, GtfsPlusValidation, Note} from '../../../types'
2424
import type {GtfsState, ManagerUserState} from '../../../types/reducers'
2525

2626
type Props = ContainerProps & {
27+
comparedVersionIndex: number,
2728
createDeploymentFromFeedSource: typeof deploymentActions.createDeploymentFromFeedSource,
2829
deleteFeedVersion: typeof versionsActions.deleteFeedVersion,
2930
downloadFeedViaToken: typeof versionsActions.downloadFeedViaToken,
@@ -42,6 +43,7 @@ type Props = ContainerProps & {
4243
publishFeedVersion: typeof versionsActions.publishFeedVersion,
4344
renameFeedVersion: typeof versionsActions.renameFeedVersion,
4445
runFetchFeed: typeof feedsActions.runFetchFeed,
46+
setComparedVersionIndex: typeof versionsActions.setComparedVersionIndex,
4547
setVersionIndex: typeof versionsActions.setVersionIndex,
4648
sortedVersions: Array<FeedVersion>,
4749
uploadFeed: typeof versionsActions.uploadFeed,
@@ -121,12 +123,19 @@ export default class FeedVersionNavigator extends Component<Props, State> {
121123
}
122124
}
123125

126+
_onSelectComparedVersion = (index: number) => {
127+
if (index !== this.props.comparedVersionIndex) {
128+
this.props.setComparedVersionIndex(this.props.feedSource, index)
129+
}
130+
}
131+
124132
render () {
125133
const versionTitleStyle = {
126134
fontSize: '24px',
127135
fontWeight: 'bold'
128136
}
129137
const {
138+
comparedVersionIndex,
130139
deleteDisabled,
131140
deleteFeedVersion,
132141
disabled,
@@ -149,10 +158,8 @@ export default class FeedVersionNavigator extends Component<Props, State> {
149158
versionSection
150159
} = this.props
151160
const {feedVersions: versions} = feedSource
152-
const comparedVersionIndex = feedVersionIndex - 1;
153161

154162
if (!versions) return null
155-
const nothingToCompare = (versions.length < 2);
156163

157164
if (typeof feedVersionIndex === 'undefined') return null
158165
const version = hasVersions && versions[feedVersionIndex - 1]
@@ -221,11 +228,17 @@ export default class FeedVersionNavigator extends Component<Props, State> {
221228
href='#'
222229
id='prevVersionSelector'
223230
title={comparedVersionIndex > 0 ? `Comparing to: ${this.messages('version')} ${comparedVersionIndex}` : `<This is the first feed version>`}
224-
disabled={comparedVersionIndex == 0}
225-
>
231+
disabled={comparedVersionIndex === 0}
232+
onSelect={this._onSelectComparedVersion}>
226233
{versions.map((version, k) => {
227234
k = k + 1
228-
return <MenuItem key={k} eventKey={k} disabled={k >= feedVersionIndex}>{k}. {version.name}</MenuItem>
235+
if (k >= feedVersionIndex) {
236+
return (
237+
<MenuItem key={k} disabled eventKey={null}>
238+
{k}. (Cannot compare with self or more recent)
239+
</MenuItem>
240+
)
241+
} else return <MenuItem key={k} eventKey={k}>{k}. {version.name}</MenuItem>
229242
})}
230243
</DropdownButton>
231244
</ButtonGroup>

lib/manager/components/version/FeedVersionTabs.js

Lines changed: 27 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
import moment from 'moment'
44
import React, {Component} from 'react'
5-
import {Row, Col, Tabs, Tab, ListGroupItem, Label, Badge} from 'react-bootstrap'
5+
import {Row, Col, Tabs, Tab, ListGroupItem, Label} from 'react-bootstrap'
66
import numeral from 'numeral'
77

88
import {getComponentMessages, isModuleEnabled} from '../../../common/util/config'
@@ -19,14 +19,14 @@ import type {Element} from 'react'
1919
import type {FeedVersion} from '../../../types'
2020

2121
type Props = {
22-
feedVersionIndex: number,
22+
comparedVersion: FeedVersion,
2323
comparedVersionIndex: number,
24+
feedVersionIndex: number,
2425
isochroneBand: any,
2526
onChangeIsochroneBand: number => void,
2627
selectTab: string => void,
2728
tab: string,
28-
version: FeedVersion,
29-
comparedVersion: FeedVersion
29+
version: FeedVersion
3030
}
3131

3232
export default class FeedVersionTabs extends Component<Props> {
@@ -106,30 +106,32 @@ export default class FeedVersionTabs extends Component<Props> {
106106
<Tab eventKey={'feed'} title='Summary'>
107107
<Row>
108108
{countFields.map(c => {
109-
const summary = version.validationSummary;
110-
const diff = comparedVersion ? (summary[c] - comparedVersion.validationSummary[c]) : 0;
109+
const summary = version.validationSummary
110+
const diff = comparedVersion ? (summary[c] - comparedVersion.validationSummary[c]) : 0
111111

112112
return (
113-
<Col xs={2} className='text-center' key={c}>
114-
<p
115-
title={`${summary[c]}` /* do we need this? */ }
116-
style={{marginBottom: '0px', fontSize: '200%'}}>
117-
{numeral(summary[c]).format('0a ')}
113+
<Col xs={2} className='text-center' key={c}>
114+
<div
115+
title={`${summary[c]}` /* do we need this? */}
116+
style={{marginBottom: '0px', fontSize: '200%'}}>
117+
{numeral(summary[c]).format('0a')}
118+
{comparedVersion
119+
? <sup style={{width: 0, display: 'inline-block'}}>
120+
<Label
121+
style={{fontSize: '50%', padding: '0 0.2em 0.1em'}}
122+
bsStyle={diff > 0 ? 'success' : (diff < 0 ? 'warning' : 'default')}
123+
title={`Compared to Version ${comparedVersionIndex}`}>
124+
{diff === 0 ? '=' : ((diff > 0 ? '+' : '') + numeral(diff).format('0a'))}
125+
</Label>
126+
</sup>
127+
: null}
118128

119-
{comparedVersion ?
120-
<Label
121-
style={{fontSize: '40%'}}
122-
bsStyle={diff > 0 ? 'success' : (diff < 0 ? 'warning' : 'default')}
123-
title={`Compared to Version ${comparedVersionIndex}`}>
124-
{diff == 0 ? '=' : ((diff > 0 ? '+' : '') + numeral(diff).format('0a'))}
125-
{ /*&#x2197;+{summary[c] - comparedVersion.validationSummary[c]*/}
126-
</Label>
127-
: null}
128-
</p>
129-
<p style={{marginBottom: '0px'}}>{this.messages(c)}</p>
130-
</Col>
131-
);
132-
})}
129+
</div>
130+
131+
<p style={{marginBottom: '0px'}}>{this.messages(c)}</p>
132+
</Col>
133+
)
134+
})}
133135
<Col xs={2} className='text-center'>
134136
<p
135137
title={daysActive}

lib/manager/components/version/FeedVersionViewer.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ import type {Feed, FeedVersion, GtfsPlusValidation, Note, Project} from '../../.
2222
import type {GtfsState, ManagerUserState} from '../../../types/reducers'
2323

2424
export type Props = {
25+
comparedVersion: FeedVersion,
26+
comparedVersionIndex: number,
2527
deleteDisabled: ?boolean,
2628
deleteFeedVersion: typeof versionsActions.deleteFeedVersion,
2729
downloadFeedViaToken: typeof versionsActions.downloadFeedViaToken,
@@ -31,7 +33,6 @@ export type Props = {
3133
feedSource: Feed,
3234
feedSource: Feed,
3335
feedVersionIndex: number,
34-
comparedVersionIndex: number,
3536
fetchGTFSEntities: typeof versionsActions.fetchGTFSEntities,
3637
fetchValidationErrors: typeof versionsActions.fetchValidationErrors,
3738
gtfs: GtfsState,
@@ -48,7 +49,6 @@ export type Props = {
4849
renameFeedVersion: typeof versionsActions.renameFeedVersion,
4950
user: ManagerUserState,
5051
version: FeedVersion,
51-
comparedVersion: FeedVersion,
5252
versionSection: ?string,
5353
versions: Array<FeedVersion>
5454
}

lib/manager/containers/ActiveFeedVersionNavigator.js

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ import {
1515
mergeVersions,
1616
publishFeedVersion,
1717
renameFeedVersion,
18+
setComparedVersionIndex,
1819
setVersionIndex,
1920
uploadFeed
2021
} from '../actions/versions'
@@ -39,7 +40,7 @@ export type Props = {
3940
}
4041

4142
const mapStateToProps = (state: AppState, ownProps: Props) => {
42-
let feedVersionIndex
43+
let feedVersionIndex, comparedVersionIndex
4344
const {routeParams, feedSource} = ownProps
4445
const {feedVersions} = feedSource
4546
const {feedVersionIndex: fvi, subpage} = routeParams
@@ -63,7 +64,7 @@ const mapStateToProps = (state: AppState, ownProps: Props) => {
6364
? feedVersions.sort(versionsLastUpdatedComparator)
6465
: []
6566

66-
let version
67+
let version, comparedVersion
6768

6869
if (
6970
hasVersions &&
@@ -72,15 +73,22 @@ const mapStateToProps = (state: AppState, ownProps: Props) => {
7273
feedVersions.length >= feedVersionIndex
7374
) {
7475
version = sortedVersions[feedVersionIndex - 1]
76+
77+
if (gtfs.filter.comparedVersion) {
78+
comparedVersionIndex = sortedVersions.findIndex(feedVer => feedVer.id === gtfs.filter.comparedVersion) + 1
79+
comparedVersion = sortedVersions[comparedVersionIndex - 1]
80+
}
7581
}
7682
return {
7783
gtfs,
7884
hasVersions,
7985
feedVersionIndex,
86+
comparedVersionIndex,
8087
gtfsPlusValidation: state.gtfsplus.validation,
8188
sortedVersions,
8289
user: state.user,
8390
version,
91+
comparedVersion,
8492
versionIndexDoesNotExist,
8593
versionSection: subpage
8694
}
@@ -101,6 +109,7 @@ const mapDispatchToProps = {
101109
publishFeedVersion,
102110
renameFeedVersion,
103111
runFetchFeed,
112+
setComparedVersionIndex,
104113
setVersionIndex,
105114
uploadFeed
106115
}

lib/types/reducers.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -281,6 +281,7 @@ export type DateTimeFilter = {
281281

282282
export type FilterState = {
283283
activeFeeds: any,
284+
comparedVersion: any,
284285
dateTimeFilter: DateTimeFilter,
285286
loadedFeeds: Array<any>,
286287
map: MapFilter,

0 commit comments

Comments
 (0)