@@ -4,6 +4,7 @@ import type {
4
4
DocumentPreferences ,
5
5
Field ,
6
6
FieldSchemaMap ,
7
+ FieldState ,
7
8
FormFieldWithoutComponents ,
8
9
FormState ,
9
10
FormStateWithoutComponents ,
@@ -139,14 +140,14 @@ export const addFieldStatePromise = async (args: AddFieldStatePromiseArgs): Prom
139
140
140
141
let fieldPermissions : SanitizedFieldPermissions = true
141
142
142
- const fieldState : FormFieldWithoutComponents = {
143
- errorPaths : [ ] ,
144
- fieldSchema : includeSchema ? field : undefined ,
145
- initialValue : undefined ,
146
- isSidebar : fieldIsSidebar ( field ) ,
147
- passesCondition ,
148
- valid : true ,
149
- value : undefined ,
143
+ const fieldState : FieldState = { }
144
+
145
+ if ( passesCondition === false ) {
146
+ fieldState . passesCondition = false
147
+ }
148
+
149
+ if ( includeSchema ) {
150
+ fieldState . fieldSchema = field
150
151
}
151
152
152
153
if ( fieldAffectsData ( field ) && ! fieldIsHiddenOrDisabled ( field ) ) {
@@ -213,6 +214,10 @@ export const addFieldStatePromise = async (args: AddFieldStatePromiseArgs): Prom
213
214
addErrorPathToParentArg ( errorPath )
214
215
}
215
216
217
+ if ( ! fieldState . errorPaths ) {
218
+ fieldState . errorPaths = [ ]
219
+ }
220
+
216
221
if ( ! fieldState . errorPaths . includes ( errorPath ) ) {
217
222
fieldState . errorPaths . push ( errorPath )
218
223
fieldState . valid = false
@@ -223,8 +228,6 @@ export const addFieldStatePromise = async (args: AddFieldStatePromiseArgs): Prom
223
228
fieldState . errorMessage = validationResult
224
229
fieldState . valid = false
225
230
addErrorPathToParent ( path )
226
- } else {
227
- fieldState . valid = true
228
231
}
229
232
230
233
switch ( field . type ) {
@@ -237,14 +240,16 @@ export const addFieldStatePromise = async (args: AddFieldStatePromiseArgs): Prom
237
240
row . id = row ?. id || new ObjectId ( ) . toHexString ( )
238
241
239
242
if ( ! omitParents && ( ! filter || filter ( args ) ) ) {
240
- state [ parentPath + '.id' ] = {
241
- fieldSchema : includeSchema
242
- ? field . fields . find ( ( field ) => fieldIsID ( field ) )
243
- : undefined ,
243
+ const idKey = parentPath + '.id'
244
+
245
+ state [ idKey ] = {
244
246
initialValue : row . id ,
245
- valid : true ,
246
247
value : row . id ,
247
248
}
249
+
250
+ if ( includeSchema ) {
251
+ state [ idKey ] . fieldSchema = field . fields . find ( ( field ) => fieldIsID ( field ) )
252
+ }
248
253
}
249
254
250
255
acc . promises . push (
@@ -280,50 +285,58 @@ export const addFieldStatePromise = async (args: AddFieldStatePromiseArgs): Prom
280
285
} ) ,
281
286
)
282
287
283
- const previousRows = previousFormState ?. [ path ] ?. rows || [ ]
284
- const collapsedRowIDsFromPrefs = preferences ?. fields ?. [ path ] ?. collapsed
288
+ if ( ! acc . rows ) {
289
+ acc . rows = [ ]
290
+ }
285
291
286
292
acc . rows . push ( {
287
293
id : row . id ,
288
- collapsed : ( ( ) => {
289
- // First, check if `previousFormState` has a matching row
290
- const previousRow = previousRows . find ( ( prevRow ) => prevRow . id === row . id )
291
- if ( previousRow ?. collapsed !== undefined ) {
292
- return previousRow . collapsed
293
- }
294
+ } )
294
295
295
- // If previousFormState is undefined, check preferences
296
- if ( collapsedRowIDsFromPrefs !== undefined ) {
297
- return collapsedRowIDsFromPrefs . includes ( row . id ) // Check if collapsed in preferences
298
- }
296
+ const previousRows = previousFormState ?. [ path ] ?. rows || [ ]
297
+ const collapsedRowIDsFromPrefs = preferences ?. fields ?. [ path ] ?. collapsed
299
298
300
- // If neither exists, fallback to `field.admin.initCollapsed`
301
- return field . admin . initCollapsed
302
- } ) ( ) ,
303
- } )
299
+ const collapsed = ( ( ) => {
300
+ // First, check if `previousFormState` has a matching row
301
+ const previousRow = previousRows . find ( ( prevRow ) => prevRow . id === row . id )
302
+ if ( previousRow ?. collapsed !== undefined ) {
303
+ return previousRow . collapsed
304
+ }
305
+
306
+ // If previousFormState is undefined, check preferences
307
+ if ( collapsedRowIDsFromPrefs !== undefined ) {
308
+ return collapsedRowIDsFromPrefs . includes ( row . id ) // Check if collapsed in preferences
309
+ }
310
+
311
+ // If neither exists, fallback to `field.admin.initCollapsed`
312
+ return field . admin . initCollapsed
313
+ } ) ( )
314
+
315
+ if ( collapsed ) {
316
+ acc . rows [ acc . rows . length - 1 ] . collapsed = collapsed
317
+ }
304
318
305
319
return acc
306
320
} ,
307
321
{
308
322
promises : [ ] ,
309
- rows : [ ] ,
323
+ rows : undefined ,
310
324
} ,
311
325
)
312
326
313
327
// Wait for all promises and update fields with the results
314
328
await Promise . all ( promises )
315
329
316
- fieldState . rows = rows
330
+ if ( rows ) {
331
+ fieldState . rows = rows
332
+ }
317
333
318
334
// Unset requiresRender
319
335
// so it will be removed from form state
320
336
fieldState . requiresRender = false
321
337
322
338
// Add values to field state
323
- if ( data [ field . name ] === null ) {
324
- fieldState . value = null
325
- fieldState . initialValue = null
326
- } else {
339
+ if ( data [ field . name ] !== null ) {
327
340
fieldState . value = forceFullValue ? arrayValue : arrayValue . length
328
341
fieldState . initialValue = forceFullValue ? arrayValue : arrayValue . length
329
342
@@ -359,35 +372,48 @@ export const addFieldStatePromise = async (args: AddFieldStatePromiseArgs): Prom
359
372
row . id = row ?. id || new ObjectId ( ) . toHexString ( )
360
373
361
374
if ( ! omitParents && ( ! filter || filter ( args ) ) ) {
362
- state [ parentPath + '.id' ] = {
363
- fieldSchema : includeSchema
364
- ? block . fields . find ( ( blockField ) => fieldIsID ( blockField ) )
365
- : undefined ,
375
+ // Handle block `id` field
376
+ const idKey = parentPath + '.id'
377
+
378
+ state [ idKey ] = {
366
379
initialValue : row . id ,
367
- valid : true ,
368
380
value : row . id ,
369
381
}
370
382
371
- state [ parentPath + '.blockType' ] = {
372
- fieldSchema : includeSchema
373
- ? block . fields . find (
374
- ( blockField ) => 'name' in blockField && blockField . name === 'blockType' ,
375
- )
376
- : undefined ,
383
+ if ( includeSchema ) {
384
+ state [ idKey ] . fieldSchema = includeSchema
385
+ ? block . fields . find ( ( blockField ) => fieldIsID ( blockField ) )
386
+ : undefined
387
+ }
388
+
389
+ // Handle `blockType` field
390
+ const fieldKey = parentPath + '.blockType'
391
+
392
+ state [ fieldKey ] = {
377
393
initialValue : row . blockType ,
378
- valid : true ,
379
394
value : row . blockType ,
380
395
}
381
396
382
- state [ parentPath + '.blockName' ] = {
383
- fieldSchema : includeSchema
384
- ? block . fields . find (
385
- ( blockField ) => 'name' in blockField && blockField . name === 'blockName' ,
386
- )
387
- : undefined ,
388
- initialValue : row . blockName ,
389
- valid : true ,
390
- value : row . blockName ,
397
+ if ( includeSchema ) {
398
+ state [ fieldKey ] . fieldSchema = block . fields . find (
399
+ ( blockField ) => 'name' in blockField && blockField . name === 'blockType' ,
400
+ )
401
+ }
402
+
403
+ // Handle `blockName` field
404
+ const blockNameKey = parentPath + '.blockName'
405
+
406
+ state [ blockNameKey ] = { }
407
+
408
+ if ( row . blockName ) {
409
+ state [ blockNameKey ] . initialValue = row . blockName
410
+ state [ blockNameKey ] . value = row . blockName
411
+ }
412
+
413
+ if ( includeSchema ) {
414
+ state [ blockNameKey ] . fieldSchema = block . fields . find (
415
+ ( blockField ) => 'name' in blockField && blockField . name === 'blockName' ,
416
+ )
391
417
}
392
418
}
393
419
@@ -428,16 +454,21 @@ export const addFieldStatePromise = async (args: AddFieldStatePromiseArgs): Prom
428
454
} ) ,
429
455
)
430
456
431
- const collapsedRowIDs = preferences ?. fields ?. [ path ] ?. collapsed
432
-
433
457
acc . rowMetadata . push ( {
434
458
id : row . id ,
435
459
blockType : row . blockType ,
436
- collapsed :
437
- collapsedRowIDs === undefined
438
- ? field . admin . initCollapsed
439
- : collapsedRowIDs . includes ( row . id ) ,
440
460
} )
461
+
462
+ const collapsedRowIDs = preferences ?. fields ?. [ path ] ?. collapsed
463
+
464
+ const collapsed =
465
+ collapsedRowIDs === undefined
466
+ ? field . admin . initCollapsed
467
+ : collapsedRowIDs . includes ( row . id )
468
+
469
+ if ( collapsed ) {
470
+ acc . rowMetadata [ acc . rowMetadata . length - 1 ] . collapsed = collapsed
471
+ }
441
472
}
442
473
443
474
return acc
@@ -604,8 +635,10 @@ export const addFieldStatePromise = async (args: AddFieldStatePromiseArgs): Prom
604
635
}
605
636
606
637
default : {
607
- fieldState . value = data [ field . name ]
608
- fieldState . initialValue = data [ field . name ]
638
+ if ( data [ field . name ] !== undefined ) {
639
+ fieldState . value = data [ field . name ]
640
+ fieldState . initialValue = data [ field . name ]
641
+ }
609
642
610
643
// Add field to state
611
644
if ( ! filter || filter ( args ) ) {
@@ -621,11 +654,10 @@ export const addFieldStatePromise = async (args: AddFieldStatePromiseArgs): Prom
621
654
if ( ! filter || filter ( args ) ) {
622
655
state [ path ] = {
623
656
disableFormData : true ,
624
- errorPaths : [ ] ,
625
- initialValue : undefined ,
626
- passesCondition,
627
- valid : true ,
628
- value : undefined ,
657
+ }
658
+
659
+ if ( passesCondition === false ) {
660
+ state [ path ] . passesCondition = false
629
661
}
630
662
}
631
663
0 commit comments