@@ -2,7 +2,7 @@ import dayjs, { Dayjs } from "dayjs";
22
33import { LOADetail } from "../../settings/types/LOADetail" ;
44import { PermitType } from "../types/PermitType" ;
5- import { getEndOfDate , toLocalDayjs } from "../../../common/helpers/formatDate" ;
5+ import { getEndOfDate , getStartOfDate , toLocalDayjs } from "../../../common/helpers/formatDate" ;
66import { Nullable } from "../../../common/types/common" ;
77import { Application , ApplicationFormData } from "../types/application" ;
88import { getDefaultRequiredVal } from "../../../common/helpers/util" ;
@@ -80,21 +80,30 @@ export const getUpdatedLOASelection = (
8080 upToDateLOAs : LOADetail [ ] ,
8181 prevSelectedLOAs : PermitLOA [ ] ,
8282 minPermitExpiryDate : Dayjs ,
83+ permitStartDate : Dayjs ,
8384) => {
8485 // Each LOA should only be selected once, but there's a chance that an up-to-date LOA is also a previously selected LOA,
8586 // which means that LOA should only be shown once.
8687 // Thus, any overlapping LOA between the up-to-date LOAs and previously selected LOAs should only be included once,
8788 // and all non-overlapping LOAs that are not part of the up-to-date LOAs should be removed
8889 const prevSelectedLOANumbers = new Set ( [ ...prevSelectedLOAs . map ( loa => loa . loaNumber ) ] ) ;
8990
90- return upToDateLOAs . map ( loa => {
91+ // Updated selection for LOAs, not including empty selection option "None"
92+ const updatedSelection = upToDateLOAs . map ( loa => {
9193 const wasSelected = prevSelectedLOANumbers . has ( loa . loaNumber ) ;
9294 const isExpiringBeforeMinPermitExpiry = Boolean ( loa . expiryDate )
9395 && minPermitExpiryDate . isAfter ( getEndOfDate ( dayjs ( loa . expiryDate ) ) ) ;
9496
95- // Deselect and disable any LOAs expiring before min permit expiry date
96- const isSelected = wasSelected && ! isExpiringBeforeMinPermitExpiry ;
97- const isEnabled = ! isExpiringBeforeMinPermitExpiry ;
97+ const isStartingAfterPermitStartDate =
98+ permitStartDate . isBefore ( getStartOfDate ( dayjs ( loa . startDate ) ) ) ;
99+
100+ // Deselect and disable any LOAs expiring before min permit expiry date,
101+ // or hasn't started yet (ie. LOA starts after permit start date)
102+ const isSelected = wasSelected
103+ && ! isExpiringBeforeMinPermitExpiry
104+ && ! isStartingAfterPermitStartDate ;
105+
106+ const isEnabled = ! isExpiringBeforeMinPermitExpiry && ! isStartingAfterPermitStartDate ;
98107
99108 return {
100109 loa : {
@@ -113,14 +122,23 @@ export const getUpdatedLOASelection = (
113122 disabled : ! isEnabled ,
114123 } ;
115124 } ) ;
125+
126+ // Empty LOA selection state
127+ const emptyLOASelection = {
128+ loa : null ,
129+ checked : updatedSelection . filter ( ( { checked } ) => checked ) . length === 0 ,
130+ disabled : false ,
131+ } ;
132+
133+ return [ emptyLOASelection , ...updatedSelection ] ;
116134} ;
117135
118136/**
119137 * Get updated vehicle details and options based on selected LOAs.
120138 * @param selectedLOAs Selected LOAs for the permit
121139 * @param vehicleOptions Provided vehicle options for selection
122140 * @param prevSelectedVehicle Previously selected vehicle details in the permit form
123- * @param eligibleSubtypes Set of eligible vehicle subtypes
141+ * @param eligibleSubtypes Set of all possible eligible vehicle subtypes
124142 * @param vehicleRestrictions Restriction rules that each vehicle must meet
125143 * @returns Updated vehicle details and filtered vehicle options
126144 */
@@ -131,36 +149,46 @@ export const getUpdatedVehicleDetailsForLOAs = (
131149 eligibleSubtypes : Set < string > ,
132150 vehicleRestrictions : ( ( vehicle : Vehicle ) => boolean ) [ ] ,
133151) => {
152+ const isLOAUsed = selectedLOAs . length > 0 ;
153+
134154 const filteredVehicles = getAllowedVehicles (
135155 vehicleOptions ,
136156 eligibleSubtypes ,
137157 selectedLOAs ,
138158 vehicleRestrictions ,
139159 ) ;
140-
141- const filteredVehicleIds = filteredVehicles . map ( filteredVehicle => ( {
142- filteredVehicleType : filteredVehicle . vehicleType ,
143- filteredVehicleId : filteredVehicle . vehicleType === VEHICLE_TYPES . TRAILER
144- ? ( filteredVehicle as Trailer ) . trailerId
145- : ( filteredVehicle as PowerUnit ) . powerUnitId ,
146- } ) ) ;
147-
148- // If vehicle selected is an existing vehicle but is not in list of vehicle options
149- // Clear the selected vehicle
150- const { vehicleId, vehicleType } = prevSelectedVehicle ;
151- if ( vehicleId && ! filteredVehicleIds . some ( ( {
152- filteredVehicleType,
153- filteredVehicleId,
154- } ) => filteredVehicleType === vehicleType && filteredVehicleId === vehicleId ) ) {
160+
161+ // If an LOA is used, then the only allowable subtype is the one defined by the LOA
162+ // Otherwise, the allowable subtypes are the ones originally belonging to the permit type
163+ const allAllowableSubtypes = isLOAUsed
164+ ? new Set < string > ( [ selectedLOAs [ 0 ] . vehicleSubType ] )
165+ : eligibleSubtypes ;
166+
167+ // If vehicle selected is an existing vehicle (was originally chosen from inventory),
168+ // but its subtype is no longer valid, then clear the selected vehicle
169+ const { vehicleId, vehicleSubType } = prevSelectedVehicle ;
170+ if ( vehicleId && ! allAllowableSubtypes . has ( vehicleSubType ) ) {
171+ const defaultVehicleDetails = getDefaultVehicleDetails ( ) ;
172+
155173 return {
156174 filteredVehicleOptions : filteredVehicles ,
157- updatedVehicle : getDefaultVehicleDetails ( ) ,
175+ // If an LOA is used, fill the vehicle type and subtype with the LOA's vehicle type/subtype
176+ // Otherwise, simply clear the vehicle details and fill with default empty values
177+ updatedVehicle : isLOAUsed ? {
178+ ...defaultVehicleDetails ,
179+ vehicleType : selectedLOAs [ 0 ] . vehicleType ,
180+ vehicleSubType : selectedLOAs [ 0 ] . vehicleSubType ,
181+ } : defaultVehicleDetails ,
158182 } ;
159183 }
160184
161185 return {
162186 filteredVehicleOptions : filteredVehicles ,
163- updatedVehicle : prevSelectedVehicle ,
187+ updatedVehicle : isLOAUsed ? {
188+ ...prevSelectedVehicle ,
189+ vehicleType : selectedLOAs [ 0 ] . vehicleType ,
190+ vehicleSubType : selectedLOAs [ 0 ] . vehicleSubType ,
191+ } : prevSelectedVehicle ,
164192 } ;
165193} ;
166194
@@ -203,9 +231,10 @@ export const applyUpToDateLOAsToApplication = <T extends Nullable<ApplicationFor
203231 applicableLOAs ,
204232 prevSelectedLOAs ,
205233 minPermitExpiryDate ,
234+ applicationData . permitData . startDate ,
206235 )
207- . filter ( ( { checked } ) => checked )
208- . map ( ( { loa } ) => loa ) ;
236+ . filter ( ( { checked, loa } ) => checked && Boolean ( loa ) )
237+ . map ( ( { loa } ) => loa ) as PermitLOA [ ] ;
209238
210239 // Update duration in permit if selected LOAs changed
211240 const durationOptions = getAvailableDurationOptions (
0 commit comments