@@ -24,13 +24,11 @@ interface SchemaFormComparisonProps {
2424const FieldWrapper = ( {
2525 children,
2626 diffType,
27- orderChanged,
2827 changes,
2928} : {
3029 children : React . ReactNode ;
3130 diffType : 'added' | 'removed' | 'modified' | 'unchanged' ;
3231 fieldName : string ;
33- orderChanged ?: { oldIndex : number ; newIndex : number } ;
3432 changes ?: {
3533 label ?: { old : string ; new : string } ;
3634 required ?: { old : boolean ; new : boolean } ;
@@ -54,9 +52,9 @@ const FieldWrapper = ({
5452 nestedFields ?: unknown [ ] ;
5553 } ;
5654} ) => {
57- const styles = getDiffStyles ( diffType , ! ! orderChanged ) ;
55+ const styles = getDiffStyles ( diffType ) ;
5856
59- if ( diffType === 'unchanged' && ! orderChanged ) {
57+ if ( diffType === 'unchanged' ) {
6058 return < div > { children } </ div > ;
6159 }
6260
@@ -78,14 +76,7 @@ const FieldWrapper = ({
7876 ) ,
7977 } ;
8078
81- const reorderedBadge = orderChanged && diffType === 'unchanged' && (
82- < span className = 'text-xs font-semibold text-blue-700 bg-blue-100 px-2 py-1 rounded' >
83- MOVED
84- </ span >
85- ) ;
86-
87- const badge =
88- reorderedBadge || ( diffType !== 'unchanged' && badges [ diffType ] ) ;
79+ const badge = badges [ diffType ] ;
8980
9081 const renderChanges = ( ) => {
9182 if ( ! changes || diffType !== 'modified' ) return null ;
@@ -221,12 +212,7 @@ const FieldWrapper = ({
221212
222213 return (
223214 < div className = { `p-3 mb-2 rounded ${ styles } relative` } >
224- < div className = 'absolute top-2 right-2' >
225- { badge }
226- { orderChanged && diffType !== 'unchanged' && (
227- < span className = 'ml-2 text-xs text-gray-600' > (position changed)</ span >
228- ) }
229- </ div >
215+ < div className = 'absolute top-2 right-2' > { badge } </ div >
230216 { children }
231217 { renderChanges ( ) }
232218 </ div >
@@ -248,7 +234,6 @@ const FormPanel = ({
248234 string ,
249235 {
250236 diffType : 'added' | 'removed' | 'modified' | 'unchanged' ;
251- orderChanged ?: { oldIndex : number ; newIndex : number } ;
252237 changes ?: unknown ;
253238 }
254239 > ;
@@ -260,26 +245,83 @@ const FormPanel = ({
260245 } ) ;
261246
262247 const fieldsWithWrappers = useMemo ( ( ) => {
263- return fields . map ( ( field ) => {
264- const diff = diffMap . get ( field . name ) ;
265- const diffType = diff ?. diffType || 'unchanged' ;
266- const orderChanged = diff ?. orderChanged ;
267- const changes = diff ?. changes ;
268-
269- return {
270- ...field ,
271- WrapperComponent : ( { children } : { children : React . ReactNode } ) => (
272- < FieldWrapper
273- diffType = { diffType }
274- fieldName = { field . name }
275- orderChanged = { orderChanged }
276- changes = { changes as never }
277- >
278- { children }
279- </ FieldWrapper >
280- ) ,
281- } ;
282- } ) ;
248+ // Recursive function to apply wrappers to fields and their nested fields
249+ const applyWrappers = (
250+ fields : JSFField [ ] ,
251+ diffMap : Map <
252+ string ,
253+ {
254+ diffType : 'added' | 'removed' | 'modified' | 'unchanged' ;
255+ changes ?: unknown ;
256+ }
257+ > ,
258+ ) : JSFField [ ] => {
259+ return fields . map ( ( field ) => {
260+ const diff = diffMap . get ( field . name ) ;
261+ const diffType = diff ?. diffType || 'unchanged' ;
262+ const changes = diff ?. changes ;
263+
264+ // If this field has nested fields (e.g., fieldset), recursively apply wrappers
265+ const nestedFields = ( field as never as { fields ?: JSFField [ ] } ) . fields ;
266+ let processedField = field ;
267+
268+ if ( nestedFields && Array . isArray ( nestedFields ) ) {
269+ // Build a nested diff map from the changes.nestedFields
270+ const nestedDiffMap = new Map <
271+ string ,
272+ {
273+ diffType : 'added' | 'removed' | 'modified' | 'unchanged' ;
274+ changes ?: unknown ;
275+ }
276+ > ( ) ;
277+
278+ if (
279+ changes &&
280+ typeof changes === 'object' &&
281+ 'nestedFields' in changes &&
282+ Array . isArray ( changes . nestedFields )
283+ ) {
284+ (
285+ changes . nestedFields as Array < {
286+ fieldName : string ;
287+ diffType : 'added' | 'removed' | 'modified' | 'unchanged' ;
288+ changes ?: unknown ;
289+ } >
290+ ) . forEach ( ( nestedDiff ) => {
291+ nestedDiffMap . set ( nestedDiff . fieldName , {
292+ diffType : nestedDiff . diffType ,
293+ changes : nestedDiff . changes ,
294+ } ) ;
295+ } ) ;
296+ }
297+
298+ // Recursively apply wrappers to nested fields
299+ const wrappedNestedFields = applyWrappers (
300+ nestedFields ,
301+ nestedDiffMap ,
302+ ) ;
303+ processedField = {
304+ ...field ,
305+ fields : wrappedNestedFields ,
306+ } as JSFField ;
307+ }
308+
309+ return {
310+ ...processedField ,
311+ WrapperComponent : ( { children } : { children : React . ReactNode } ) => (
312+ < FieldWrapper
313+ diffType = { diffType }
314+ fieldName = { field . name }
315+ changes = { changes as never }
316+ >
317+ { children }
318+ </ FieldWrapper >
319+ ) ,
320+ } ;
321+ } ) ;
322+ } ;
323+
324+ return applyWrappers ( fields , diffMap ) ;
283325 } , [ fields , diffMap ] ) ;
284326
285327 return (
@@ -369,8 +411,7 @@ export const SchemaFormComparison = ({
369411 const hasNoDifferences =
370412 diff . added . length === 0 &&
371413 diff . removed . length === 0 &&
372- diff . modified . length === 0 &&
373- diff . reordered . length === 0 ;
414+ diff . modified . length === 0 ;
374415
375416 return (
376417 < div className = 'space-y-6' >
@@ -409,15 +450,6 @@ export const SchemaFormComparison = ({
409450 </ span >
410451 </ div >
411452 ) }
412- { diff . reordered . length > 0 && (
413- < div className = 'flex items-center gap-2' >
414- < span className = 'w-4 h-4 bg-blue-500 rounded' > </ span >
415- < span className = 'text-sm' >
416- { diff . reordered . length } field
417- { diff . reordered . length > 1 ? 's' : '' } reordered
418- </ span >
419- </ div >
420- ) }
421453 </ div >
422454 ) }
423455 </ CardContent >
0 commit comments