Skip to content

Commit 3f70df9

Browse files
authored
ORV2-5060: Add return trip to frontend (#2221)
1 parent 2cb3bb2 commit 3f70df9

File tree

11 files changed

+203
-1
lines changed

11 files changed

+203
-1
lines changed

frontend/src/features/permits/helpers/equality.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,9 @@ export const areManualRoutesEqual = (
223223
manualRoute1?.highwaySequence,
224224
manualRoute2?.highwaySequence,
225225
(seqNumber1, seqNumber2) => seqNumber1 === seqNumber2,
226+
) && (
227+
getDefaultRequiredVal(false, manualRoute1?.isReturnTrip)
228+
=== getDefaultRequiredVal(false, manualRoute2?.isReturnTrip)
226229
);
227230
};
228231

frontend/src/features/permits/helpers/route/getDefaultManualRoute.ts

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,5 +21,12 @@ export const getDefaultManualRoute = (
2121
totalDistance: permitType === PERMIT_TYPES.MFP
2222
? getDefaultRequiredVal(null, manualRoute?.totalDistance)
2323
: null,
24+
isReturnTrip: ([
25+
PERMIT_TYPES.STOS,
26+
PERMIT_TYPES.STOW,
27+
PERMIT_TYPES.STWS,
28+
] as PermitType[]).includes(permitType)
29+
? getDefaultRequiredVal(false, manualRoute?.isReturnTrip)
30+
: null,
2431
};
2532
};

frontend/src/features/permits/hooks/form/useApplicationFormContext.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,7 @@ export const useApplicationFormContext = () => {
6262
onUpdateHighwaySequence,
6363
onUpdateTripOrigin,
6464
onUpdateTripDestination,
65+
onUpdateIsReturnTrip,
6566
onUpdateTotalDistance,
6667
onUpdateVehicleConfigTrailers,
6768
onSetCommodityType,
@@ -308,6 +309,7 @@ export const useApplicationFormContext = () => {
308309
highwaySequence,
309310
tripOrigin: permittedRoute?.manualRoute?.origin,
310311
tripDestination: permittedRoute?.manualRoute?.destination,
312+
isReturnTrip: permittedRoute?.manualRoute?.isReturnTrip,
311313
totalDistance: permittedRoute?.manualRoute?.totalDistance,
312314
nextAllowedSubtypes,
313315
powerUnitSubtypeNamesMap,
@@ -333,6 +335,7 @@ export const useApplicationFormContext = () => {
333335
onUpdateHighwaySequence,
334336
onUpdateTripOrigin,
335337
onUpdateTripDestination,
338+
onUpdateIsReturnTrip,
336339
onUpdateTotalDistance,
337340
onUpdateVehicleConfigTrailers,
338341
commodityType: permittedCommodity?.commodityType,

frontend/src/features/permits/hooks/form/useApplicationFormUpdateMethods.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,13 @@ export const useApplicationFormUpdateMethods = () => {
135135
);
136136
}, [setValue]);
137137

138+
const onUpdateIsReturnTrip = useCallback((updatedIsReturnTrip: boolean) => {
139+
setValue(
140+
"permitData.permittedRoute.manualRoute.isReturnTrip",
141+
updatedIsReturnTrip,
142+
);
143+
}, [setValue]);
144+
138145
const onUpdateTotalDistance = useCallback((updatedTotalDistance?: RequiredOrNull<number>) => {
139146
setValue(
140147
"permitData.permittedRoute.manualRoute.totalDistance",
@@ -234,6 +241,7 @@ export const useApplicationFormUpdateMethods = () => {
234241
onUpdateHighwaySequence,
235242
onUpdateTripOrigin,
236243
onUpdateTripDestination,
244+
onUpdateIsReturnTrip,
237245
onUpdateTotalDistance,
238246
onUpdateVehicleConfigTrailers,
239247
onSetCommodityType,

frontend/src/features/permits/pages/Application/components/form/PermitForm.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ export const PermitForm = () => {
5050
highwaySequence,
5151
tripOrigin,
5252
tripDestination,
53+
isReturnTrip,
5354
totalDistance,
5455
nextAllowedSubtypes,
5556
powerUnitSubtypeNamesMap,
@@ -77,6 +78,7 @@ export const PermitForm = () => {
7778
onUpdateHighwaySequence,
7879
onUpdateTripOrigin,
7980
onUpdateTripDestination,
81+
onUpdateIsReturnTrip,
8082
onUpdateTotalDistance,
8183
onUpdateVehicleConfigTrailers,
8284
onChangeCommodityType,
@@ -191,10 +193,12 @@ export const PermitForm = () => {
191193
highwaySequence={highwaySequence}
192194
tripOrigin={tripOrigin}
193195
tripDestination={tripDestination}
196+
isReturnTrip={isReturnTrip}
194197
totalDistance={totalDistance}
195198
onUpdateHighwaySequence={onUpdateHighwaySequence}
196199
onUpdateTripOrigin={onUpdateTripOrigin}
197200
onUpdateTripDestination={onUpdateTripDestination}
201+
onUpdateIsReturnTrip={onUpdateIsReturnTrip}
198202
onUpdateTotalDistance={onUpdateTotalDistance}
199203
/>
200204

frontend/src/features/permits/pages/Application/components/form/TripDetailsSection/TripDetailsSection.tsx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,23 +18,27 @@ export const TripDetailsSection = ({
1818
tripOrigin,
1919
tripDestination,
2020
totalDistance,
21+
isReturnTrip,
2122
onUpdateHighwaySequence,
2223
onUpdateTripOrigin,
2324
onUpdateTripDestination,
2425
onUpdateTotalDistance,
26+
onUpdateIsReturnTrip,
2527
}: {
2628
feature: ORBCFormFeatureType;
2729
permitType: PermitType;
2830
highwaySequence: string[];
2931
tripOrigin?: Nullable<string>;
3032
tripDestination?: Nullable<string>;
3133
totalDistance?: Nullable<number>;
34+
isReturnTrip?: Nullable<boolean>;
3235
onUpdateHighwaySequence: (updatedHighwaySequence: string[]) => void;
3336
onUpdateTripOrigin: (updateTripOrigin: string) => void;
3437
onUpdateTripDestination: (updateTripDestination: string) => void;
3538
onUpdateTotalDistance: (
3639
updatedTotalDistance?: RequiredOrNull<number>,
3740
) => void;
41+
onUpdateIsReturnTrip: (updatedIsReturnTrip: boolean) => void;
3842
}) => {
3943
return permitType === PERMIT_TYPES.STOS || permitType === PERMIT_TYPES.MFP ? (
4044
<Box className="trip-details-section">
@@ -49,9 +53,11 @@ export const TripDetailsSection = ({
4953
tripOrigin={tripOrigin}
5054
tripDestination={tripDestination}
5155
totalDistance={totalDistance}
56+
isReturnTrip={isReturnTrip}
5257
onUpdateTripOrigin={onUpdateTripOrigin}
5358
onUpdateTripDestination={onUpdateTripDestination}
5459
onUpdateTotalDistance={onUpdateTotalDistance}
60+
onUpdateIsReturnTrip={onUpdateIsReturnTrip}
5561
/>
5662

5763
{permitType === PERMIT_TYPES.STOS ? (

frontend/src/features/permits/pages/Application/components/form/TripDetailsSection/TripOriginDestination.scss

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
@use "../../../../../../../themes/orbcStyles";
2+
13
.trip-origin-destination {
24
display: flex;
35
flex-direction: column;
@@ -20,6 +22,41 @@
2022
}
2123
}
2224

25+
.return-trip-options {
26+
display: flex;
27+
flex-direction: row;
28+
margin-top: 1.5rem;
29+
30+
&__label {
31+
margin: 0;
32+
display: flex;
33+
align-items: center;
34+
35+
&--return-trip {
36+
margin-left: 2.5rem;
37+
}
38+
}
39+
40+
&__label-text {
41+
margin: 0;
42+
}
43+
44+
&__radio {
45+
padding: 0;
46+
margin-right: 0.5rem;
47+
48+
&:hover {
49+
background-color: orbcStyles.$bc-border-grey;
50+
}
51+
52+
&--checked {
53+
&:hover {
54+
background-color: transparent;
55+
}
56+
}
57+
}
58+
}
59+
2360
& &__info {
2461
margin: 1.5rem 0 0 0;
2562
}

frontend/src/features/permits/pages/Application/components/form/TripDetailsSection/TripOriginDestination.tsx

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { Controller } from "react-hook-form";
2+
import { FormControlLabel, Radio, RadioGroup } from "@mui/material";
23

34
import "./TripOriginDestination.scss";
45
import { CustomFormComponent } from "../../../../../../../common/components/form/CustomFormComponents";
@@ -25,23 +26,32 @@ export const TripOriginDestination = ({
2526
tripOrigin,
2627
tripDestination,
2728
totalDistance,
29+
isReturnTrip,
2830
onUpdateTripOrigin,
2931
onUpdateTripDestination,
3032
onUpdateTotalDistance,
33+
onUpdateIsReturnTrip,
3134
}: {
3235
feature: ORBCFormFeatureType;
3336
permitType: PermitType;
3437
tripOrigin?: Nullable<string>;
3538
tripDestination?: Nullable<string>;
3639
totalDistance?: Nullable<number>;
40+
isReturnTrip?: Nullable<boolean>;
3741
onUpdateTripOrigin: (updateTripOrigin: string) => void;
3842
onUpdateTripDestination: (updateTripDestination: string) => void;
3943
onUpdateTotalDistance: (
4044
updatedTotalDistance?: RequiredOrNull<number>,
4145
) => void;
46+
onUpdateIsReturnTrip: (updatedIsReturnTrip: boolean) => void;
4247
}) => {
4348
const showExitPoint = permitType === PERMIT_TYPES.MFP;
4449
const showTotalDistance = permitType === PERMIT_TYPES.MFP;
50+
const showReturnTrip = ([
51+
PERMIT_TYPES.STOS,
52+
PERMIT_TYPES.STOW,
53+
PERMIT_TYPES.STWS,
54+
] as PermitType[]).includes(permitType);
4555

4656
const origin = getDefaultRequiredVal("", tripOrigin);
4757

@@ -110,6 +120,51 @@ export const TripOriginDestination = ({
110120
)}
111121
/>
112122

123+
{showReturnTrip ? (
124+
<RadioGroup
125+
className="return-trip-options"
126+
defaultValue={Boolean(isReturnTrip)}
127+
value={Boolean(isReturnTrip)}
128+
onChange={(e) => onUpdateIsReturnTrip(e.target.value === "true")}
129+
>
130+
<FormControlLabel
131+
className="return-trip-options__label return-trip-options__label--one-way"
132+
classes={{
133+
label: "return-trip-options__label-text",
134+
}}
135+
label="One Way"
136+
value={false}
137+
control={
138+
<Radio
139+
key="one-way"
140+
className="return-trip-options__radio"
141+
classes={{
142+
checked: "return-trip-options__radio--checked",
143+
}}
144+
/>
145+
}
146+
/>
147+
148+
<FormControlLabel
149+
className="return-trip-options__label return-trip-options__label--return-trip"
150+
classes={{
151+
label: "return-trip-options__label-text",
152+
}}
153+
label="Return Trip"
154+
value={true}
155+
control={
156+
<Radio
157+
key="return-trip"
158+
className="return-trip-options__radio"
159+
classes={{
160+
checked: "return-trip-options__radio--checked",
161+
}}
162+
/>
163+
}
164+
/>
165+
</RadioGroup>
166+
) : null}
167+
113168
{showExitPoint ? (
114169
<CustomFormComponent
115170
className="trip-origin-destination__input"

frontend/src/features/permits/pages/Application/components/review/TripDetails.scss

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,44 @@
1818
&__total-distance {
1919
margin-top: 1.5rem;
2020
}
21+
22+
&__is-return-trip {
23+
margin-top: 1.5rem;
24+
display: flex;
25+
flex-direction: column;
26+
align-items: flex-start;
27+
28+
.return-trip-option {
29+
margin: 0;
30+
31+
&__radio {
32+
padding: 0;
33+
margin-left: -0.125rem;
34+
margin-right: 0.5rem;
35+
color: orbcStyles.$disabled-colour;
36+
37+
&--disabled {
38+
color: orbcStyles.$disabled-colour;
39+
}
40+
}
41+
42+
&--disabled.return-trip-option__label {
43+
margin: 0;
44+
color: orbcStyles.$bc-black;
45+
}
46+
}
47+
}
48+
49+
&__info {
50+
display: flex;
51+
flex-direction: row;
52+
margin-top: 0.5rem;
53+
align-items: center;
54+
}
55+
56+
&__info-text {
57+
color: orbcStyles.$bc-black;
58+
}
2159
}
2260

2361
.review-highway-sequences {

frontend/src/features/permits/pages/Application/components/review/TripDetails.tsx

Lines changed: 41 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Box, Typography } from "@mui/material";
1+
import { Box, FormControlLabel, Radio, RadioGroup, Typography } from "@mui/material";
22

33
import "./TripDetails.scss";
44
import { Nullable } from "../../../../../../common/types/common";
@@ -19,6 +19,7 @@ export const TripDetails = ({
1919
const origin = getDefaultRequiredVal("", routeDetails?.manualRoute?.origin);
2020
const destination = getDefaultRequiredVal("", routeDetails?.manualRoute?.destination);
2121
const exitPoint = getDefaultRequiredVal("", routeDetails?.manualRoute?.exitPoint);
22+
const isReturnTrip = getDefaultRequiredVal(false, routeDetails?.manualRoute?.isReturnTrip);
2223
const totalDistanceStr = getDefaultRequiredVal(0, routeDetails?.manualRoute?.totalDistance).toFixed(2);
2324
const highwaySequence = getDefaultRequiredVal([], routeDetails?.manualRoute?.highwaySequence);
2425
const details = getDefaultRequiredVal("", routeDetails?.routeDetails);
@@ -37,6 +38,10 @@ export const TripDetails = ({
3738
routeDetails?.manualRoute?.exitPoint,
3839
oldRouteDetails?.manualRoute?.exitPoint,
3940
),
41+
isReturnTrip: areValuesDifferent(
42+
routeDetails?.manualRoute?.isReturnTrip,
43+
oldRouteDetails?.manualRoute?.isReturnTrip,
44+
),
4045
totalDistance: areValuesDifferent(
4146
totalDistanceStr,
4247
getDefaultRequiredVal(0, oldRouteDetails?.manualRoute?.totalDistance).toFixed(2),
@@ -55,6 +60,7 @@ export const TripDetails = ({
5560
origin: false,
5661
destination: false,
5762
exitPoint: false,
63+
isReturnTrip: false,
5864
totalDistance: false,
5965
highwaySequences: false,
6066
routeDetails: false,
@@ -109,6 +115,40 @@ export const TripDetails = ({
109115
</div>
110116
) : null}
111117

118+
{isReturnTrip ? (
119+
<div className="manual-route__is-return-trip">
120+
<RadioGroup
121+
className="manual-route__radio-group"
122+
defaultValue={isReturnTrip}
123+
>
124+
<FormControlLabel
125+
key="is-return-trip"
126+
className="return-trip-option"
127+
disabled={true}
128+
classes={{
129+
disabled: "return-trip-option--disabled",
130+
label: "return-trip-option__label",
131+
}}
132+
label="Return Trip"
133+
value={isReturnTrip}
134+
control={
135+
<Radio
136+
key="is-return-trip-true"
137+
className="return-trip-option__radio return-trip-option__radio--disabled"
138+
/>}
139+
/>
140+
</RadioGroup>
141+
142+
<Typography className="manual-route__info">
143+
<span className="manual-route__info-text">
144+
Permitted for return trip along the same route.
145+
</span>
146+
147+
{showDiffChip(changedFields.isReturnTrip)}
148+
</Typography>
149+
</div>
150+
) : null}
151+
112152
{exitPoint ? (
113153
<div className="manual-route__exit">
114154
<Typography className="manual-route__label">

0 commit comments

Comments
 (0)