1
1
import {
2
2
useCallback ,
3
- useMemo ,
4
3
useState ,
5
4
} from 'react' ;
6
5
import {
@@ -11,14 +10,9 @@ import {
11
10
SelectInput ,
12
11
} from '@ifrc-go/ui' ;
13
12
import { useTranslation } from '@ifrc-go/ui/hooks' ;
13
+ import { stringValueSelector } from '@ifrc-go/ui/utils' ;
14
14
import {
15
- numericKeySelector ,
16
- stringValueSelector ,
17
- } from '@ifrc-go/ui/utils' ;
18
- import {
19
- isDefined ,
20
15
isNotDefined ,
21
- listToMap ,
22
16
randomString ,
23
17
} from '@togglecorp/fujs' ;
24
18
import {
@@ -43,7 +37,6 @@ import EruInputItem from './EruInputItem';
43
37
import schema , {
44
38
type BaseFormType ,
45
39
type EruReadinessBody ,
46
- type EruReadinessPostBody ,
47
40
} from './schema' ;
48
41
49
42
import i18n from './i18n.json' ;
@@ -63,13 +56,12 @@ function eruOwnerLabelSelector(option: EruOwnerOption) {
63
56
64
57
const defaultFormValues : PartialForm < EruReadinessBody > = { } ;
65
58
59
+ const eruTypeKeySelector = ( eruType : EruTypeOption ) => eruType . key ;
60
+
66
61
/** @knipignore */
67
62
// eslint-disable-next-line import/prefer-default-export
68
63
export function Component ( ) {
69
64
const strings = useTranslation ( i18n ) ;
70
- // const { eruId } = useParams<{ eruId: number }>();
71
- // TODO: Use useParams for eruId
72
- const eruId = 1 ;
73
65
74
66
const alert = useAlertContext ( ) ;
75
67
const {
@@ -90,38 +82,19 @@ export function Component() {
90
82
91
83
const error = getErrorObject ( formError ) ;
92
84
93
- const {
94
- pending : createEruReadinessPending ,
95
- trigger : createEruReadiness ,
96
- } = useLazyRequest ( {
97
- url : '/api/v2/eru-readiness/' ,
98
- method : 'POST' ,
99
- body : ( ctx : EruReadinessPostBody ) => ctx ,
100
- onSuccess : ( ) => {
101
- alert . show (
102
- strings . eruFormCreatedSuccessfully ,
103
- { variant : 'success' } ,
104
- ) ;
105
- } ,
106
- onFailure : ( ) => {
107
- alert . show (
108
- strings . eruFormFailedToCreate ,
109
- {
110
- variant : 'danger' ,
111
- } ,
112
- ) ;
113
- } ,
114
- } ) ;
85
+ const [ eruId , setEruId ] = useState < number | undefined > ( ) ;
86
+
87
+ const [ selectedEruTypeList , setSelectedEruTypeList ] = useState < EruTypeOption [ 'key' ] [ ] | undefined > ( ) ;
88
+
89
+ const [ selectedEruOwner , setSelectedEruOwner ] = useState < EruOwnerOption [ 'id' ] > ( ) ;
115
90
116
91
const {
117
92
trigger : updateEruReadinessForm ,
118
93
pending : updateEruReadinessFormPending ,
119
94
} = useLazyRequest ( {
120
95
url : '/api/v2/eru-readiness/{id}/' ,
121
96
method : 'PATCH' ,
122
- pathVariables : isDefined ( eruId ) ? {
123
- id : Number ( eruId ) ,
124
- } : undefined ,
97
+ pathVariables : eruId !== undefined ? { id : Number ( eruId ) } : undefined ,
125
98
body : ( ctx : EruReadinessBody ) => ctx ,
126
99
onSuccess : ( ) => {
127
100
alert . show (
@@ -156,59 +129,86 @@ export function Component() {
156
129
preserveResponse : true ,
157
130
} ) ;
158
131
159
- const eruTypesTitleMap = useMemo (
160
- ( ) => (
161
- listToMap (
162
- deployments_eru_type ,
163
- ( eruType ) => eruType . key ,
164
- ( eruType ) => eruType . value ,
165
- )
166
- ) ,
167
- [ deployments_eru_type ] ,
168
- ) ;
132
+ const {
133
+ trigger : fetchEruReadinessData ,
134
+ pending : fetchEruReadinessDataPending ,
135
+ } = useLazyRequest ( {
136
+ url : '/api/v2/eru-readiness/' ,
137
+ query : ( eruOwnerId : number ) => ( { eru_owner : eruOwnerId } ) ,
138
+ onSuccess : ( response ) => {
139
+ const results = response ?. results ?? [ ] ;
140
+ if ( results ?. length > 0 ) {
141
+ const existingData = results [ 0 ] ;
142
+ setEruId ( existingData . id ) ;
143
+ setValue ( {
144
+ ...existingData ,
145
+ eru_owner : existingData . eru_owner_details ?. id ,
146
+ eru_types : existingData . eru_types ?. map ( ( eruType ) => ( {
147
+ ...eruType ,
148
+ id : eruType . type ,
149
+ } ) ) ,
150
+ } ) ;
151
+ setSelectedEruTypeList ( existingData . eru_types ?. map ( ( eruType ) => eruType . type ) ) ;
152
+ setSelectedEruOwner ( existingData . eru_owner_details ?. id ) ;
153
+ } else {
154
+ setEruId ( undefined ) ;
155
+ setValue ( { ...defaultFormValues , eru_owner : undefined } ) ;
156
+ setSelectedEruTypeList ( undefined ) ;
157
+ setSelectedEruOwner ( undefined ) ;
158
+ }
159
+ } ,
160
+ } ) ;
169
161
170
162
const {
171
163
setValue : onEruChange ,
172
164
} = useFormArray ( 'eru_types' , setFieldValue ) ;
173
165
174
166
const eruOwnerOption = eruOwnerResponse ?. results ;
175
167
176
- const [ selectedEruType , setSelectedEruType ] = useState < EruTypeOption | undefined > ( ) ;
177
-
178
- const handleInputChange = useCallback ( ( type : EruTypeOption [ 'key' ] ) => {
179
- const newEruTypeItem = {
180
- client_id : randomString ( ) ,
181
- type,
182
- id : eruId ,
183
- } ;
184
-
185
- setFieldValue (
186
- ( oldValue : number [ ] | undefined ) => (
187
- [ ...( oldValue ?? [ ] ) , newEruTypeItem ]
188
- ) ,
189
- 'eru_types' as const ,
190
- ) ;
191
- setSelectedEruType ( undefined ) ;
192
- } , [
193
- eruId ,
194
- setFieldValue ,
195
- ] ) ;
196
-
197
168
const handleSubmit = useCallback ( ( finalValue : BaseFormType ) => {
198
169
setValue ( finalValue ) ;
199
- if ( isNotDefined ( finalValue ) ) {
170
+
171
+ if ( isNotDefined ( finalValue ) || ! finalValue . eru_owner ) {
200
172
return ;
201
173
}
174
+
202
175
if ( isNotDefined ( eruId ) ) {
203
- createEruReadiness ( finalValue as EruReadinessPostBody ) ;
204
- } else {
205
- updateEruReadinessForm ( finalValue as EruReadinessBody ) ;
176
+ alert . show (
177
+ strings . eruNoRecord ,
178
+ { variant : 'warning' } ,
179
+ ) ;
180
+ return ;
206
181
}
182
+
183
+ const updatedEruTypes = ( selectedEruTypeList || [ ] ) . map ( ( type ) => {
184
+ const existingEru = finalValue . eru_types ?. find ( ( eruType ) => eruType . type === type ) ;
185
+
186
+ return {
187
+ id : existingEru ?. id ?? undefined ,
188
+ type,
189
+ comment : existingEru ?. comment ?? null ,
190
+ equipment_readiness : existingEru ?. equipment_readiness ?? 1 ,
191
+ people_readiness : existingEru ?. people_readiness ?? 1 ,
192
+ funding_readiness : existingEru ?. funding_readiness ?? 1 ,
193
+ has_capacity_to_lead : existingEru ?. has_capacity_to_lead ?? false ,
194
+ has_capacity_to_support : existingEru ?. has_capacity_to_support ?? false ,
195
+ } ;
196
+ } ) ;
197
+
198
+ const updatedFinalValue : EruReadinessBody = {
199
+ ...finalValue ,
200
+ eru_types : updatedEruTypes ,
201
+ eru_owner : finalValue . eru_owner ,
202
+ } ;
203
+
204
+ updateEruReadinessForm ( updatedFinalValue ) ;
207
205
} , [
206
+ alert ,
208
207
setValue ,
209
- createEruReadiness ,
210
208
updateEruReadinessForm ,
211
209
eruId ,
210
+ selectedEruTypeList ,
211
+ strings . eruNoRecord ,
212
212
] ) ;
213
213
214
214
const handleSave = useCallback ( ( ) => {
@@ -224,16 +224,53 @@ export function Component() {
224
224
handleSubmit ,
225
225
] ) ;
226
226
227
- const disabled = createEruReadinessPending || updateEruReadinessFormPending || eruOwnerPending ;
227
+ const disabled = updateEruReadinessFormPending
228
+ || eruOwnerPending || fetchEruReadinessDataPending ;
228
229
229
230
const handleCancel = useCallback ( ( ) => {
230
231
setFieldValue ( [ ] , 'eru_types' ) ;
231
- setFieldValue ( undefined , 'eru_owner' ) ;
232
- setSelectedEruType ( undefined ) ;
232
+ setSelectedEruOwner ( undefined ) ;
233
+ setSelectedEruTypeList ( undefined ) ;
233
234
} , [
234
235
setFieldValue ,
235
236
] ) ;
236
237
238
+ const handleSelectERUType = useCallback ( ( values : EruTypeOption [ 'key' ] [ ] | undefined ) => {
239
+ setSelectedEruTypeList ( values ) ;
240
+
241
+ const existingEruTypeList = value . eru_types ?. map ( ( eruType ) => eruType . id ) ;
242
+ const addedEruTypeList = values ?. filter ( ( v ) => ! existingEruTypeList ?. includes ( v ) ) ;
243
+ const removedEruTypeList = existingEruTypeList ?. filter ( ( v ) => ! values ?. includes ( v ) ) ;
244
+
245
+ const addedEruTypeObjectList = addedEruTypeList ?. map ( ( a ) => ( {
246
+ clientId : randomString ( ) ,
247
+ id : a ,
248
+ type : a ,
249
+ } ) ) ;
250
+
251
+ const newFieldValues = value . eru_types ?. filter (
252
+ ( fv ) => ! removedEruTypeList ?. includes ( fv . id ) ,
253
+ ) ;
254
+
255
+ setFieldValue ( [ ...( newFieldValues ?? [ ] ) , ...( addedEruTypeObjectList ?? [ ] ) ] , 'eru_types' ) ;
256
+ } , [ value . eru_types , setFieldValue ] ) ;
257
+
258
+ const handleEruOwnerChange = useCallback (
259
+ ( newValue : number | undefined ) => {
260
+ setSelectedEruOwner ( newValue ) ;
261
+ setFieldValue ( newValue , 'eru_owner' ) ;
262
+
263
+ if ( newValue ) {
264
+ setValue ( { } ) ;
265
+ fetchEruReadinessData ( newValue ) ;
266
+ } else {
267
+ setValue ( { ...defaultFormValues , eru_owner : undefined } ) ;
268
+ setSelectedEruTypeList ( undefined ) ;
269
+ }
270
+ } ,
271
+ [ setFieldValue , fetchEruReadinessData , setValue ] ,
272
+ ) ;
273
+
237
274
return (
238
275
< Page
239
276
className = { styles . updateForm }
@@ -269,8 +306,8 @@ export function Component() {
269
306
< SelectInput
270
307
name = "eru_owner"
271
308
options = { eruOwnerOption }
272
- onChange = { setFieldValue }
273
- value = { value . eru_owner }
309
+ onChange = { handleEruOwnerChange }
310
+ value = { selectedEruOwner }
274
311
keySelector = { eruOwnerKeySelector }
275
312
labelSelector = { eruOwnerLabelSelector }
276
313
error = { error ?. eru_owner }
@@ -285,13 +322,10 @@ export function Component() {
285
322
< MultiSelectInput
286
323
name = "eru_types"
287
324
options = { deployments_eru_type }
288
- value = { selectedEruType }
289
- keySelector = { numericKeySelector }
325
+ value = { selectedEruTypeList }
326
+ keySelector = { eruTypeKeySelector }
290
327
labelSelector = { stringValueSelector }
291
- onChange = { ( selected ) => {
292
- const singleType = Array . isArray ( selected ) ? selected [ 0 ] : selected ;
293
- handleInputChange ( singleType ) ;
294
- } }
328
+ onChange = { handleSelectERUType }
295
329
disabled = { disabled }
296
330
/>
297
331
</ InputSection >
@@ -303,7 +337,9 @@ export function Component() {
303
337
index = { index }
304
338
value = { eruType }
305
339
onChange = { onEruChange }
306
- title = { eruTypesTitleMap }
340
+ title = { deployments_eru_type ?. find (
341
+ ( type ) => type . key === eruType . type ,
342
+ ) ?. value }
307
343
error = { getErrorObject ( error ?. eru_types ) }
308
344
/>
309
345
) ) }
0 commit comments