@@ -7,13 +7,14 @@ import {
7
7
} from 'common/api/osrdEditoastApi' ;
8
8
import { useModal } from 'common/BootstrapSNCF/ModalSNCF' ;
9
9
import { useDispatch , useSelector } from 'react-redux' ;
10
- import { setFailure , setSuccess } from 'reducers/main' ;
10
+ import { addFailureNotification , setFailure , setSuccess } from 'reducers/main' ;
11
11
import Tabs , { TabProps } from 'common/Tabs' ;
12
12
import RollingStockEditorFormModal from 'modules/rollingStock/components/RollingStockEditor/RollingStockEditorFormModal' ;
13
13
import {
14
14
getRollingStockEditorDefaultValues ,
15
15
getDefaultRollingStockMode ,
16
16
rollingStockEditorQueryArg ,
17
+ checkRollingStockFormValidity ,
17
18
} from 'modules/rollingStock/helpers/utils' ;
18
19
import {
19
20
RollingStockEditorParameter ,
@@ -53,6 +54,7 @@ const RollingStockEditorForm = ({
53
54
54
55
const [ isValid , setIsValid ] = useState ( true ) ;
55
56
const [ optionValue , setOptionValue ] = useState ( '' ) ;
57
+ const [ errorMessage , setErrorMessage ] = useState ( '' ) ;
56
58
57
59
const selectedTractionMode = useSelector ( getTractionMode ) ;
58
60
@@ -149,22 +151,35 @@ const RollingStockEditorForm = ({
149
151
150
152
const submit = ( e : React . FormEvent < HTMLFormElement > , data : RollingStockParametersValues ) => {
151
153
e . preventDefault ( ) ;
154
+ let error : undefined | { name : string ; message : string } ;
152
155
if ( ! data . name ) {
153
- dispatch (
154
- setFailure ( {
155
- name : t ( 'messages.invalidForm' ) ,
156
- message : t ( 'messages.missingName' ) ,
157
- } )
158
- ) ;
156
+ error = {
157
+ name : t ( 'messages.invalidForm' ) ,
158
+ message : t ( 'messages.missingName' ) ,
159
+ } ;
159
160
} else if ( ! selectedTractionMode || ! currentRsEffortCurve ) {
160
- dispatch (
161
- setFailure ( {
162
- name : t ( 'messages.invalidForm' ) ,
163
- message : t ( 'messages.missingEffortCurves' ) ,
161
+ error = {
162
+ name : t ( 'messages.invalidForm' ) ,
163
+ message : t ( 'messages.missingEffortCurves' ) ,
164
+ } ;
165
+ }
166
+ if ( error ) {
167
+ dispatch ( addFailureNotification ( error ) ) ;
168
+ return ;
169
+ }
170
+
171
+ const { invalidFields, validRollingStockForm } = checkRollingStockFormValidity ( data ) ;
172
+ if ( invalidFields . length ) {
173
+ setRollingStockValues ( validRollingStockForm ) ;
174
+ setErrorMessage (
175
+ t ( 'messages.missingInformationAutomaticallyFilled' , {
176
+ invalidFields : invalidFields . map ( ( field ) => t ( field ) . toLowerCase ( ) ) . join ( ', ' ) ,
177
+ count : invalidFields . length ,
164
178
} )
165
179
) ;
166
180
} else {
167
- const payload = rollingStockEditorQueryArg ( data , currentRsEffortCurve ) ;
181
+ setErrorMessage ( '' ) ;
182
+ const payload = rollingStockEditorQueryArg ( validRollingStockForm , currentRsEffortCurve ! ) ;
168
183
openModal (
169
184
< RollingStockEditorFormModal
170
185
setAddOrEditState = { setAddOrEditState }
@@ -256,18 +271,23 @@ const RollingStockEditorForm = ({
256
271
onSubmit = { ( e ) => submit ( e , rollingStockValues ) }
257
272
>
258
273
< Tabs pills fullWidth tabs = { [ tabRollingStockDetails , tabRollingStockCurves ] } />
259
- < div className = "d-flex justify-content-between align-items-center" >
260
- < div className = "ml-auto my-3 pr-3" >
261
- < button
262
- type = "button"
263
- className = "btn btn-secondary mr-2 py-1 px-2"
264
- onClick = { ( ) => cancel ( ) }
265
- >
266
- { t ( 'translation:common.cancel' ) }
267
- </ button >
268
- < button type = "submit" className = "btn btn-primary py-1 px-2" disabled = { ! isValid } >
269
- { t ( 'translation:common.confirm' ) }
270
- </ button >
274
+ < div className = "d-flex justify-content-end" >
275
+ < div className = "d-flex flex-column justify-content-end" >
276
+ { errorMessage && (
277
+ < p className = "text-danger mb-1 ml-auto error-message text-wrap" > { errorMessage } </ p >
278
+ ) }
279
+ < div className = "d-flex justify-content-end" >
280
+ < button
281
+ type = "button"
282
+ className = "btn btn-secondary mr-2 py-1 px-2"
283
+ onClick = { ( ) => cancel ( ) }
284
+ >
285
+ { t ( 'translation:common.cancel' ) }
286
+ </ button >
287
+ < button type = "submit" className = "btn btn-primary py-1 px-2" disabled = { ! isValid } >
288
+ { t ( 'translation:common.confirm' ) }
289
+ </ button >
290
+ </ div >
271
291
</ div >
272
292
</ div >
273
293
</ form >
0 commit comments