Skip to content

Commit d85db5e

Browse files
The colors for the accessibility comparison tab can now be changed in the preferences
This includes the colors of the polygons for the intersection and location/scenario 1 and 2, as well as the origin point in scenario mode and the two origin points in location mode. Fix: #1795
1 parent e9e80db commit d85db5e

File tree

8 files changed

+187
-48
lines changed

8 files changed

+187
-48
lines changed

locales/en/transit.json

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -773,17 +773,23 @@
773773
"accessibilityComparison": {
774774
"Title": "Accessibility map comparison",
775775
"Legend": "Legend",
776+
"ScenarioNPolygon": "Scenario {{scenarioNumber}} polygon",
777+
"ScenarioLocation": "Scenarios location",
776778
"ScenarioIntersection": "Intersection of the scenarios",
779+
"ScenarioIntersectionPolygon": "Scenarios intersection polygon",
777780
"LocationIntersection": "Intersection of the locations",
781+
"LocationIntersectionPolygon": "Locations intersection polygon",
778782
"LocationN": "Location {{locationNumber}}",
783+
"LocationNPolygon": "Location {{locationNumber}} polygon",
779784
"Difference": "Difference",
780785
"SelectMaxTime": "Select max time to display (minutes)",
781786
"ComparisonByScenario": "Comparison by scenario",
782787
"ComparisonByLocation": "Comparison by location",
783788
"contextMenu": {
784789
"SetAsLocation1": "Set as Location 1",
785790
"SetAsLocation2": "Set as Location 2"
786-
}
791+
},
792+
"Colors": "Colors"
787793
},
788794
"gtfs": {
789795
"ButtonImport": "Import",
@@ -1032,6 +1038,14 @@
10321038
"transitAccessibilityMap": {
10331039
"LocationColor": "Location color",
10341040
"PolygonColor": "Accessibility polygon default color"
1041+
},
1042+
"transitAccessibilityMapComparison": {
1043+
"IntersectionLocationColor": "Intersection location color",
1044+
"IntersectionPolygonColor": "Intersection polygon default color",
1045+
"ComparisonLocation1Color": "Comparison location 1 color",
1046+
"ComparisonPolygon1Color": "Comparison polygon 1 default color",
1047+
"ComparisonLocation2Color": "Comparison location 2 color",
1048+
"ComparisonPolygon2Color": "Comparison polygon 2 default color"
10351049
}
10361050
},
10371051
"documentationTooltip": {

locales/fr/transit.json

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -773,17 +773,23 @@
773773
"accessibilityComparison": {
774774
"Title": "Comparaison de cartes d'accessibilité",
775775
"Legend": "Légende",
776+
"ScenarioNPolygon": "Polygone du scénario {{scenarioNumber}}",
777+
"ScenarioLocation": "Lieu des scénarios",
776778
"ScenarioIntersection": "Intersection des scénarios",
779+
"ScenarioIntersectionPolygon": "Polygone de l'intersection des scénarios",
777780
"LocationIntersection": "Intersection des lieux",
781+
"LocationIntersectionPolygon": "Polygone de l'intersection des lieux",
778782
"LocationN": "Lieu {{locationNumber}}",
783+
"LocationNPolygon": "Polygone du lieu {{locationNumber}}",
779784
"Difference": "Différence",
780785
"SelectMaxTime": "Sélectionner le temps maximal à afficher (en minutes)",
781786
"ComparisonByScenario": "Comparaison par scénario",
782787
"ComparisonByLocation": "Comparaison par lieu",
783788
"contextMenu": {
784789
"SetAsLocation1": "Définir comme le Lieu 1",
785790
"SetAsLocation2": "Définir comme le Lieu 2"
786-
}
791+
},
792+
"Colors": "Couleurs"
787793
},
788794
"gtfs": {
789795
"ButtonImport": "Importer",
@@ -1032,6 +1038,14 @@
10321038
"transitAccessibilityMap": {
10331039
"LocationColor": "Couleur du lieu",
10341040
"PolygonColor": "Couleur par défaut du polygone d'accessibilité"
1041+
},
1042+
"transitAccessibilityMapComparison": {
1043+
"IntersectionLocationColor": "Couleur du lieu d'intersection",
1044+
"IntersectionPolygonColor": "Couleur par défaut du polygone d'intersection",
1045+
"ComparisonLocation1Color": "Couleur du lieu de comparaison 1",
1046+
"ComparisonPolygon1Color": "Couleur par défaut du polygone de comparaison 1",
1047+
"ComparisonLocation2Color": "Couleur du lieu de comparaison 2",
1048+
"ComparisonPolygon2Color": "Couleur par défaut du polygone de comparaison 2"
10351049
}
10361050
},
10371051
"documentationTooltip": {

packages/chaire-lib-common/src/config/defaultPreferences.config.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -390,8 +390,14 @@ const defaultPreferences: PreferencesModel = {
390390
walkingSpeedMps: 1.3888888888,
391391
walkingSpeedFactor: 1.0, // walking travel times are weighted using this factor: Example: > 1.0 means faster walking, < 1.0 means slower walking
392392
maxTotalTravelTimeSeconds: 1800,
393-
locationColor: 'rgba(47, 138, 243, 1.0)',
393+
locationColor: 'rgba(47, 138, 243, 1)',
394394
polygonColor: 'rgba(47, 138, 243, 0.4)',
395+
intersectionLocationColor: 'rgba(47, 138, 243, 1)',
396+
intersectionPolygonColor: 'rgba(47, 138, 243, 0.6)',
397+
comparisonLocation1Color: 'rgba(252, 208, 89, 1)',
398+
comparisonPolygon1Color: 'rgba(252, 208, 89, 0.6)',
399+
comparisonLocation2Color: 'rgba(231, 74, 184, 1)',
400+
comparisonPolygon2Color: 'rgba(231, 74, 184, 0.6)',
395401
calculatePois: false,
396402
calculatePopulation: false
397403
},

packages/transition-frontend/src/components/forms/accessibilityComparison/AccessibilityComparisonForm.tsx

Lines changed: 84 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,6 @@ import {
5050
minutesToSeconds
5151
} from 'chaire-lib-common/lib/utils/DateTimeUtils';
5252
import AccessibilityComparisonStatsComponent from './AccessibilityComparisonStatsComponent';
53-
import * as AccessibilityComparisonConstants from './accessibilityComparisonConstants';
5453
import { comparisonModes } from './comparisonModes';
5554
import AccessibilityMapCoordinatesComponent from '../accessibilityMap/widgets/AccessibilityMapCoordinateComponent';
5655
import TimeOfTripComponent from '../transitRouting/widgets/TimeOfTripComponent';
@@ -90,6 +89,12 @@ interface TransitRoutingFormState extends ChangeEventsState<TransitAccessibility
9089
contextMenuRoot: Root | undefined;
9190
alternateScenario1Id?: string;
9291
alternateScenario2Id?: string;
92+
intersectionLocationColor: string;
93+
intersectionPolygonColor: string;
94+
comparisonLocation1Color: string;
95+
comparisonPolygon1Color: string;
96+
comparisonLocation2Color: string;
97+
comparisonPolygon2Color: string;
9398
}
9499

95100
class AccessibilityComparisonForm extends ChangeEventsForm<AccessibilityComparisonFormProps, TransitRoutingFormState> {
@@ -123,14 +128,28 @@ class AccessibilityComparisonForm extends ChangeEventsForm<AccessibilityComparis
123128
alternateScenario1Id: '',
124129
alternateScenario2Id: '',
125130
contextMenu: null,
126-
contextMenuRoot: undefined
131+
contextMenuRoot: undefined,
132+
intersectionLocationColor: Preferences.get(
133+
'transit.routing.transitAccessibilityMap.intersectionLocationColor'
134+
),
135+
intersectionPolygonColor: Preferences.get(
136+
'transit.routing.transitAccessibilityMap.intersectionPolygonColor'
137+
),
138+
comparisonLocation1Color: Preferences.get(
139+
'transit.routing.transitAccessibilityMap.comparisonLocation1Color'
140+
),
141+
comparisonPolygon1Color: Preferences.get('transit.routing.transitAccessibilityMap.comparisonPolygon1Color'),
142+
comparisonLocation2Color: Preferences.get(
143+
'transit.routing.transitAccessibilityMap.comparisonLocation2Color'
144+
),
145+
comparisonPolygon2Color: Preferences.get('transit.routing.transitAccessibilityMap.comparisonPolygon2Color')
127146
};
128147

129148
this.displayMap = this.displayMap.bind(this);
130149
this.calculateRouting = this.calculateRouting.bind(this);
131150
this.onScenarioCollectionUpdate = this.onScenarioCollectionUpdate.bind(this);
132151

133-
routingEngine.updatePointColor(AccessibilityComparisonConstants.INTERSECTION_COLOR);
152+
routingEngine.updatePointColor(this.state.intersectionLocationColor);
134153
if (routingEngine.hasLocation()) {
135154
(serviceLocator.eventManager as EventManager).emitEvent<MapUpdateLayerEventType>('map.updateLayer', {
136155
layerName: 'accessibilityMapPoints',
@@ -175,17 +194,17 @@ class AccessibilityComparisonForm extends ChangeEventsForm<AccessibilityComparis
175194

176195
const numberOfPolygons = routing.attributes.numberOfPolygons as number;
177196

178-
const colors = {
179-
intersectionColor: this.convertToRGBA(AccessibilityComparisonConstants.INTERSECTION_COLOR, 0.6),
180-
scenario1Minus2Color: this.convertToRGBA(AccessibilityComparisonConstants.MAP_1_COLOR, 0.6),
181-
scenario2Minus1Color: this.convertToRGBA(AccessibilityComparisonConstants.MAP_2_COLOR, 0.6)
197+
const polygonColors = {
198+
intersectionColor: this.state.intersectionPolygonColor,
199+
scenario1Minus2Color: this.state.comparisonPolygon1Color,
200+
scenario2Minus1Color: this.state.comparisonPolygon2Color
182201
};
183202

184203
const mapComparison = await calculateAccessibilityMapComparison(
185204
currentResult1.polygons,
186205
currentResult2.polygons,
187206
numberOfPolygons,
188-
colors
207+
polygonColors
189208
);
190209

191210
const finalMap: TransitAccessibilityMapWithPolygonAndTimeResult[] = [];
@@ -498,8 +517,17 @@ class AccessibilityComparisonForm extends ChangeEventsForm<AccessibilityComparis
498517
};
499518
}
500519

501-
private convertToRGBA = (rgbValue: string, alpha: number) => {
502-
return rgbValue.replace(')', `, ${alpha})`).replace('rgb', 'rgba');
520+
// Takes in a color string of the rgba format and returns a new one with the same rgb values but the inputed alpha value.
521+
// Necessary for the stats component. We want to pass the polygons colors as props to color some text in the results table, but the colors for those are transparent, while we want to text to be opaque.
522+
private changeAlphaValue = (rgbaValue: string, alpha: number) => {
523+
const rgbaArray = rgbaValue.split(',');
524+
if (rgbaArray.length !== 4) {
525+
console.error(`The color value ${rgbaValue} isn't properly formatted to convert the alpha value.`);
526+
return rgbaValue;
527+
}
528+
529+
rgbaArray[3] = `${alpha})`;
530+
return rgbaArray.join();
503531
};
504532

505533
render() {
@@ -531,30 +559,58 @@ class AccessibilityComparisonForm extends ChangeEventsForm<AccessibilityComparis
531559
return (
532560
<React.Fragment>
533561
<Collapsible
534-
trigger={this.props.t('transit:accessibilityComparison:Legend')}
562+
trigger={this.props.t('transit:accessibilityComparison:Colors')}
535563
open={true}
536564
transitionTime={100}
537565
>
566+
{mode === 'scenarios' && (
567+
<div className="tr__form-section">
568+
{this.props.t('transit:accessibilityComparison:ScenarioLocation')}: &nbsp;
569+
<span style={{ color: this.state.intersectionLocationColor }}>&#9673;</span>
570+
</div>
571+
)}
538572
<div className="tr__form-section">
539-
{mode === 'scenarios'
540-
? this.props.t('transit:transitComparison:ScenarioN', { scenarioNumber: '1' })
541-
: this.props.t('transit:accessibilityComparison:LocationN', { locationNumber: '1' })}
573+
{this.props.t(
574+
`transit:accessibilityComparison:${mode === 'scenarios' ? 'Scenario' : 'Location'}IntersectionPolygon`
575+
)}
542576
: &nbsp;
543-
<span style={{ color: AccessibilityComparisonConstants.MAP_1_COLOR }}>&#9673;</span>
577+
<span style={{ color: this.state.intersectionPolygonColor }}>&#9673;</span>
544578
</div>
579+
{mode === 'locations' && (
580+
<div className="tr__form-section">
581+
{this.props.t('transit:accessibilityComparison:LocationN', { locationNumber: '1' })}:
582+
&nbsp;
583+
<span style={{ color: this.state.comparisonLocation1Color }}>&#9673;</span>
584+
</div>
585+
)}
545586
<div className="tr__form-section">
546587
{mode === 'scenarios'
547-
? this.props.t('transit:transitComparison:ScenarioN', { scenarioNumber: '2' })
548-
: this.props.t('transit:accessibilityComparison:LocationN', { locationNumber: '2' })}
588+
? this.props.t('transit:accessibilityComparison:ScenarioNPolygon', {
589+
scenarioNumber: '1'
590+
})
591+
: this.props.t('transit:accessibilityComparison:LocationNPolygon', {
592+
locationNumber: '1'
593+
})}
549594
: &nbsp;
550-
<span style={{ color: AccessibilityComparisonConstants.MAP_2_COLOR }}>&#9673;</span>
595+
<span style={{ color: this.state.comparisonPolygon1Color }}>&#9673;</span>
551596
</div>
597+
{mode === 'locations' && (
598+
<div className="tr__form-section">
599+
{this.props.t('transit:accessibilityComparison:LocationN', { locationNumber: '2' })}:
600+
&nbsp;
601+
<span style={{ color: this.state.comparisonLocation2Color }}>&#9673;</span>
602+
</div>
603+
)}
552604
<div className="tr__form-section">
553-
{this.props.t(
554-
`transit:accessibilityComparison:${mode === 'scenarios' ? 'Scenario' : 'Location'}Intersection`
555-
)}
605+
{mode === 'scenarios'
606+
? this.props.t('transit:accessibilityComparison:ScenarioNPolygon', {
607+
scenarioNumber: '2'
608+
})
609+
: this.props.t('transit:accessibilityComparison:LocationNPolygon', {
610+
locationNumber: '2'
611+
})}
556612
: &nbsp;
557-
<span style={{ color: AccessibilityComparisonConstants.INTERSECTION_COLOR }}>&#9673;</span>
613+
<span style={{ color: this.state.comparisonPolygon2Color }}>&#9673;</span>
558614
</div>
559615
</Collapsible>
560616

@@ -951,6 +1007,8 @@ class AccessibilityComparisonForm extends ChangeEventsForm<AccessibilityComparis
9511007
<AccessibilityComparisonStatsComponent
9521008
accessibilityPolygons={this.state.currentPolygons}
9531009
mode={mode}
1010+
color1={this.changeAlphaValue(this.state.comparisonPolygon1Color, 1)}
1011+
color2={this.changeAlphaValue(this.state.comparisonPolygon2Color, 1)}
9541012
/>
9551013
</React.Fragment>
9561014
)}
@@ -968,8 +1026,8 @@ class AccessibilityComparisonForm extends ChangeEventsForm<AccessibilityComparis
9681026
const value = comparisonModes[index];
9691027
this.onValueChange('selectedMode', { value });
9701028
if (value === 'scenarios') {
971-
routing.updatePointColor(AccessibilityComparisonConstants.INTERSECTION_COLOR);
972-
alternateRouting.updatePointColor(AccessibilityComparisonConstants.INTERSECTION_COLOR);
1029+
routing.updatePointColor(this.state.intersectionLocationColor);
1030+
alternateRouting.updatePointColor(this.state.intersectionLocationColor);
9731031
if (routing.hasLocation()) {
9741032
alternateRouting.setLocation(
9751033
routing.attributes.locationGeojson!.geometry.coordinates
@@ -983,8 +1041,8 @@ class AccessibilityComparisonForm extends ChangeEventsForm<AccessibilityComparis
9831041
);
9841042
}
9851043
} else if (value === 'locations') {
986-
routing.updatePointColor(AccessibilityComparisonConstants.MAP_1_COLOR);
987-
alternateRouting.updatePointColor(AccessibilityComparisonConstants.MAP_2_COLOR);
1044+
routing.updatePointColor(this.state.comparisonLocation1Color);
1045+
alternateRouting.updatePointColor(this.state.comparisonLocation2Color);
9881046
alternateRouting.attributes.scenarioId = routing.attributes.scenarioId;
9891047
if (routing.hasLocation()) {
9901048
alternateRouting.setLocation(

packages/transition-frontend/src/components/forms/accessibilityComparison/AccessibilityComparisonStatsComponent.tsx

Lines changed: 6 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
import React, { JSX, useState } from 'react';
88
import { useTranslation } from 'react-i18next';
99
import { Tooltip } from 'react-tooltip';
10-
import * as AccessibilityComparisonConstants from './accessibilityComparisonConstants';
1110
import { ComparisonMode } from './comparisonModes';
1211
import { InputCheckboxBoolean } from 'chaire-lib-frontend/lib/components/input/InputCheckbox';
1312

@@ -17,6 +16,8 @@ export interface AccessibilityComparisonStatsComponentProps {
1716
result2: GeoJSON.FeatureCollection;
1817
};
1918
mode: ComparisonMode;
19+
color1: string;
20+
color2: string;
2021
}
2122

2223
const AccessibilityComparisonStatsComponent: React.FunctionComponent<AccessibilityComparisonStatsComponentProps> = (
@@ -248,12 +249,12 @@ const AccessibilityComparisonStatsComponent: React.FunctionComponent<Accessibili
248249
<thead>
249250
<tr>
250251
<th></th>
251-
<th style={{ color: AccessibilityComparisonConstants.MAP_1_COLOR }}>
252+
<th style={{ color: props.color1 }}>
252253
{props.mode === 'scenarios'
253254
? t('transit:transitComparison:ScenarioN', { scenarioNumber: '1' })
254255
: t('transit:accessibilityComparison:LocationN', { locationNumber: '1' })}
255256
</th>
256-
<th style={{ color: AccessibilityComparisonConstants.MAP_2_COLOR }}>
257+
<th style={{ color: props.color2 }}>
257258
{props.mode === 'scenarios'
258259
? t('transit:transitComparison:ScenarioN', { scenarioNumber: '2' })
259260
: t('transit:accessibilityComparison:LocationN', { locationNumber: '2' })}
@@ -264,13 +265,13 @@ const AccessibilityComparisonStatsComponent: React.FunctionComponent<Accessibili
264265
<tbody>{combinedFeaturesStatsTable}</tbody>
265266
</table>
266267
<Tooltip id="difference-header" opacity={1}>
267-
<span style={{ color: AccessibilityComparisonConstants.MAP_2_COLOR }}>
268+
<span style={{ color: props.color2 }}>
268269
{props.mode === 'scenarios'
269270
? t('transit:transitComparison:ScenarioN', { scenarioNumber: '2' })
270271
: t('transit:accessibilityComparison:LocationN', { locationNumber: '2' })}
271272
</span>
272273
&nbsp;-&nbsp;
273-
<span style={{ color: AccessibilityComparisonConstants.MAP_1_COLOR }}>
274+
<span style={{ color: props.color1 }}>
274275
{props.mode === 'scenarios'
275276
? t('transit:transitComparison:ScenarioN', { scenarioNumber: '1' })
276277
: t('transit:accessibilityComparison:LocationN', { locationNumber: '1' })}

packages/transition-frontend/src/components/forms/accessibilityComparison/accessibilityComparisonConstants.ts

Lines changed: 0 additions & 14 deletions
This file was deleted.

0 commit comments

Comments
 (0)