Skip to content

Commit cba8f28

Browse files
authored
Merge pull request #586 from HSLdevcom/fix/84213
2 parents 175c138 + b6ba5d7 commit cba8f28

5 files changed

Lines changed: 73 additions & 33 deletions

File tree

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "hsl-map-publisher",
3-
"version": "1.2.2",
3+
"version": "1.2.3",
44
"description": "HSL Map Publisher",
55
"main": "index.js",
66
"scripts": {

src/components/map/stopMapContainer.js

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ import haversine from 'haversine';
1111
import apolloWrapper from 'util/apolloWrapper';
1212
import config from 'util/config';
1313
import promiseWrapper from 'util/promiseWrapper';
14-
import { isNumberVariant, trimRouteId, isDropOffOnly } from 'util/domain';
14+
import { trimRouteId, isDropOffOnly, filterRouteSegments } from 'util/domain';
1515
import { calculateStopsViewport } from 'util/stopPoster';
1616
import routeCompare from 'util/routeCompare';
1717

@@ -100,14 +100,14 @@ const nearbyItemsQuery = gql`
100100
}
101101
`;
102102

103-
const stopsMapper = stopGroup => ({
104-
...stopGroup,
105-
// Assume all stops face the same way
106-
calculatedHeading: stopGroup.stops.nodes[0].calculatedHeading,
107-
routes: flatMap(stopGroup.stops.nodes, node =>
108-
node.routeSegments.nodes
109-
.filter(routeSegment => routeSegment.hasRegularDayDepartures === true)
110-
.filter(routeSegment => !isNumberVariant(routeSegment.routeId))
103+
const stopsMapper = stopGroup => {
104+
const allSegments = flatMap(stopGroup.stops.nodes, node => node.routeSegments.nodes);
105+
106+
return {
107+
...stopGroup,
108+
// Assume all stops face the same way
109+
calculatedHeading: stopGroup.stops.nodes[0].calculatedHeading,
110+
routes: filterRouteSegments(allSegments)
111111
.filter(routeSegment => !isDropOffOnly(routeSegment))
112112
.map(routeSegment => {
113113
const mergedRouteSegment = mergeRouteSegments(
@@ -141,9 +141,10 @@ const stopsMapper = stopGroup => ({
141141
mode: mergedRouteSegment.route.nodes[0].mode,
142142
trunkRoute,
143143
};
144-
}),
145-
).sort(routeCompare),
146-
});
144+
})
145+
.sort(routeCompare),
146+
};
147+
};
147148

148149
const nearbyItemsMapper = mapProps(props => {
149150
const stops = props.data.stopGroups.nodes

src/components/routeDiagram/routeDiagramContainer.js

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import compose from 'recompose/compose';
55
import mapProps from 'recompose/mapProps';
66
import flatMap from 'lodash/flatMap';
77
import sortBy from 'lodash/sortBy';
8-
import { isNumberVariant, trimRouteId, isDropOffOnly, filterRoute } from 'util/domain';
8+
import { trimRouteId, isDropOffOnly, filterRoute, filterRouteSegments } from 'util/domain';
99
import apolloWrapper from 'util/apolloWrapper';
1010
import { routesToTree } from 'util/routes';
1111

@@ -100,11 +100,9 @@ const nodeToStop = ({ stopByStopId }) => {
100100

101101
const propsMapper = mapProps(props => {
102102
const routes = flatMap(props.data.stops.nodes, s =>
103-
flatMap(s.siblings.nodes, stop =>
104-
stop.routeSegments.nodes
105-
// Select regular routes that allow boarding from current stop
106-
.filter(routeSegment => routeSegment.hasRegularDayDepartures === true)
107-
.filter(routeSegment => !isNumberVariant(routeSegment.routeId))
103+
flatMap(s.siblings.nodes, stop => {
104+
const allSegments = stop.routeSegments.nodes;
105+
return filterRouteSegments(allSegments)
108106
.filter(routeSegment => !isDropOffOnly(routeSegment))
109107
.filter(routeSegment =>
110108
filterRoute({ routeId: routeSegment.routeId, filter: props.routeFilter }),
@@ -115,8 +113,8 @@ const propsMapper = mapProps(props => {
115113
trunkRoute: routeSegment.line.nodes[0].trunkRoute === '1',
116114
// List all stops (including drop-off only) for each route
117115
stops: sortBy(routeSegment.nextStops.nodes, node => node.stopIndex).map(nodeToStop),
118-
})),
119-
),
116+
}));
117+
}),
120118
);
121119
const treeMaxWidth = props.maxColumns ? props.maxColumns : props.printAsA3 ? 5 : 6; // Defaults 6 for normal posters and 5 for a3 posters.
122120

src/components/stopPoster/routesContainer.js

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import flatMap from 'lodash/flatMap';
77
import groupBy from 'lodash/groupBy';
88
import compact from 'lodash/compact';
99

10-
import { isNumberVariant, trimRouteId, isDropOffOnly, filterRoute } from 'util/domain';
10+
import { trimRouteId, isDropOffOnly, filterRoute, filterRouteSegments } from 'util/domain';
1111
import apolloWrapper from 'util/apolloWrapper';
1212
import routeCompare from 'util/routeCompare';
1313

@@ -47,18 +47,16 @@ const routesQuery = gql`
4747

4848
const propsMapper = mapProps(props => {
4949
const { data, routeFilter, ...propsToForward } = props;
50-
const stops = flatMap(
50+
51+
const allSegments = flatMap(
5152
data.stop.siblings.nodes.map(s =>
52-
s.routeSegments.nodes
53-
.map(routeSegment => ({ ...routeSegment, platform: s.platform }))
54-
.filter(routeSegment => routeSegment.hasRegularDayDepartures === true)
55-
.filter(routeSegment => !isNumberVariant(routeSegment.routeId))
56-
.filter(routeSegment => !isDropOffOnly(routeSegment))
57-
.filter(routeSegment =>
58-
filterRoute({ routeId: routeSegment.routeId, filter: routeFilter }),
59-
),
53+
s.routeSegments.nodes.map(routeSegment => ({ ...routeSegment, platform: s.platform })),
6054
),
6155
);
56+
57+
const stops = filterRouteSegments(allSegments)
58+
.filter(routeSegment => !isDropOffOnly(routeSegment))
59+
.filter(routeSegment => filterRoute({ routeId: routeSegment.routeId, filter: routeFilter }));
6260
const routes = stops.map(routeSegment => ({
6361
...routeSegment.route.nodes[0],
6462
viaFi: routeSegment.viaFi,
@@ -69,7 +67,6 @@ const propsMapper = mapProps(props => {
6967
platform: routeSegment.platform,
7068
}));
7169

72-
// Group similar routes and place the platforminfo in the list
7370
const routesGrouped = Object.values(groupBy(routes, r => r.routeId + r.destinationFi))
7471
.map(r =>
7572
r.reduce((prev, curr) => ({ ...prev, platforms: prev.platforms.concat(curr.platform) }), {

src/util/domain.js

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,7 @@ function groupOnConsecutive(groupedOnVersion) {
223223
}
224224

225225
function getListOfVersionsAsString(versions) {
226-
const alsoBasic = versions.some(version => version && version.trim() === '');
226+
const alsoBasic = versions.some(version => version != null && version.trim() === '');
227227
const letters = versions.filter(version => version && version.trim() !== '').sort();
228228
if (letters.length === 0) return '';
229229
const letterString = letters.join(',');
@@ -360,6 +360,49 @@ function getShelterText(stopType) {
360360
}
361361
}
362362

363+
/**
364+
* Filters route segments, keeping only non-number-variant segments that either have regular day
365+
* departures themselves, or have a numbered variant that does.
366+
* @param {Array} segments
367+
* @returns {Array} Filtered segments
368+
*/
369+
function filterRouteSegments(segments) {
370+
const variantsWithDepartures = segments.filter(
371+
s => isNumberVariant(s.routeId) && s.hasRegularDayDepartures === true,
372+
);
373+
374+
const variantIdssWithDepartures = variantsWithDepartures.map(s => s.routeId);
375+
376+
const baseRouteIdsWithVariantDepartures = new Set(
377+
segments
378+
.filter(s => !isNumberVariant(s.routeId))
379+
.filter(s => variantIdssWithDepartures.some(variantId => variantId.startsWith(s.routeId)))
380+
.map(s => s.routeId),
381+
);
382+
383+
const filtered = segments.filter(
384+
s => s.hasRegularDayDepartures === true || baseRouteIdsWithVariantDepartures.has(s.routeId),
385+
);
386+
387+
return filtered
388+
.filter(s => !isNumberVariant(s.routeId))
389+
.map(s => {
390+
if (baseRouteIdsWithVariantDepartures.has(s.routeId) && s.hasRegularDayDepartures !== true) {
391+
const variant = variantsWithDepartures.find(v => v.routeId.startsWith(s.routeId));
392+
if (variant) {
393+
// promote variant to main route
394+
// but keep the base routeId and platform.
395+
return {
396+
...variant,
397+
routeId: s.routeId,
398+
platform: s.platform,
399+
};
400+
}
401+
}
402+
return s;
403+
});
404+
}
405+
363406
export {
364407
isNumberVariant,
365408
isRailRoute,
@@ -378,4 +421,5 @@ export {
378421
getFormattedRouteList,
379422
formatRouteString,
380423
getShelterText,
424+
filterRouteSegments,
381425
};

0 commit comments

Comments
 (0)