1
- import React , { useState , useRef , useEffect , useCallback , useMemo } from 'react' ;
1
+ import React , { useState , useRef , useEffect , useMemo } from 'react' ;
2
2
import Form , { FieldProps , utils } from '@rjsf/core' ;
3
3
import { JSONSchema7 } from 'json-schema' ;
4
4
import { omit , head , max as fnMax , min as fnMin , isNil } from 'lodash' ;
@@ -106,13 +106,6 @@ export const FormComponent: React.FC<FieldProps> = (props) => {
106
106
return field ;
107
107
} , [ jsonSchema ] ) ;
108
108
109
- const customOnChange = useCallback (
110
- ( newData : Array < LinearMetadataItem > ) => {
111
- onChange ( newData . filter ( ( e ) => ( valueField ? ! isNil ( e [ valueField ] ) : true ) ) ) ;
112
- } ,
113
- [ onChange , valueField ]
114
- ) ;
115
-
116
109
const fixedData = useMemo (
117
110
( ) => fixLinearMetadataItems ( formData ?. filter ( notEmpty ) , distance ) ,
118
111
[ formData , distance ]
@@ -180,6 +173,13 @@ export const FormComponent: React.FC<FieldProps> = (props) => {
180
173
// case when you click on the already selected item => reset
181
174
setSelected ( ( old ) => ( ( old ?? - 1 ) === index ? null : index ) ) ;
182
175
setHovered ( null ) ;
176
+ if ( valueField && isNil ( _item [ valueField ] ) && isNil ( selected ) ) {
177
+ fixedData [ index ] = {
178
+ ..._item ,
179
+ [ valueField ] : 0 ,
180
+ }
181
+ onChange ( fixedData )
182
+ }
183
183
}
184
184
setClickPrevent ( false ) ;
185
185
} , 150 ) as number ;
@@ -190,7 +190,7 @@ export const FormComponent: React.FC<FieldProps> = (props) => {
190
190
if ( clickTimeout ) clearTimeout ( clickTimeout ) ;
191
191
setClickPrevent ( true ) ;
192
192
const newData = splitAt ( data , point ) ;
193
- customOnChange ( newData ) ;
193
+ onChange ( newData ) ;
194
194
} }
195
195
onWheel = { ( e , _item , _index , point ) => {
196
196
setViewBox ( getZoomedViewBox ( data , viewBox , e . deltaY > 0 ? 'OUT' : 'IN' , point ) ) ;
@@ -203,7 +203,7 @@ export const FormComponent: React.FC<FieldProps> = (props) => {
203
203
setMode ( ! finalized ? 'resizing' : null ) ;
204
204
try {
205
205
const result = resizeSegment ( fixedData , index , gap , 'end' ) ;
206
- if ( finalized ) customOnChange ( result . result ) ;
206
+ if ( finalized ) onChange ( result . result ) ;
207
207
else {
208
208
setData ( result . result ) ;
209
209
// if index has changed, we need to impact the index modification
@@ -285,7 +285,7 @@ export const FormComponent: React.FC<FieldProps> = (props) => {
285
285
title = { t ( 'Editor.linear-metadata.merge-with-left' ) }
286
286
disabled = { selected === 0 }
287
287
onClick = { ( ) => {
288
- customOnChange ( mergeIn ( data , selected , 'left' ) ) ;
288
+ onChange ( mergeIn ( data , selected , 'left' ) ) ;
289
289
setSelected ( selected - 1 ) ;
290
290
} }
291
291
>
@@ -299,7 +299,7 @@ export const FormComponent: React.FC<FieldProps> = (props) => {
299
299
const splitPosition =
300
300
selectedData . begin + ( selectedData . end - selectedData . begin ) / 2 ;
301
301
const newData = splitAt ( data , splitPosition ) ;
302
- customOnChange ( newData ) ;
302
+ onChange ( newData ) ;
303
303
} }
304
304
>
305
305
< IoIosCut />
@@ -309,7 +309,7 @@ export const FormComponent: React.FC<FieldProps> = (props) => {
309
309
type = "button"
310
310
title = { t ( 'Editor.linear-metadata.merge-with-right' ) }
311
311
disabled = { selected === data . length - 1 }
312
- onClick = { ( ) => customOnChange ( mergeIn ( data , selected , 'right' ) ) }
312
+ onClick = { ( ) => onChange ( mergeIn ( data , selected , 'right' ) ) }
313
313
>
314
314
< BsBoxArrowInRight />
315
315
</ button >
@@ -363,43 +363,41 @@ export const FormComponent: React.FC<FieldProps> = (props) => {
363
363
} }
364
364
formData = { selectedData }
365
365
onChange = { ( e ) => {
366
- if ( e . errors . length === 0 ) {
367
- const newItem = e . formData ;
368
- const oldItem = data [ selected ] ;
369
- let newData = [ ...data ] ;
370
- // we keep the old value for begin and end
371
- // they will be change in the resize function if needed
372
- newData [ selected ] = {
373
- ...oldItem ,
374
- ...omit ( newItem , [ 'begin' , 'end' ] ) ,
375
- } ;
366
+ const newItem = e . formData ;
367
+ const oldItem = data [ selected ] ;
368
+ let newData = [ ...data ] ;
369
+ // we keep the old value for begin and end
370
+ // they will be change in the resize function if needed
371
+ newData [ selected ] = {
372
+ ...oldItem ,
373
+ ...omit ( newItem , [ 'begin' , 'end' ] ) ,
374
+ } ;
376
375
377
- // Check if there is a resize
378
- try {
379
- if ( newItem . begin !== oldItem . begin ) {
380
- const resizeBegin = resizeSegment (
381
- [ ...newData ] ,
382
- selected ,
383
- newItem . begin - oldItem . begin ,
384
- 'begin'
385
- ) ;
386
- newData = resizeBegin . result ;
387
- }
388
- if ( oldItem . end !== newItem . end ) {
389
- const resizeEnd = resizeSegment (
390
- [ ...newData ] ,
391
- selected ,
392
- newItem . end - oldItem . end ,
393
- 'end'
394
- ) ;
395
- newData = resizeEnd . result ;
396
- }
397
- customOnChange ( newData ) ;
398
- } catch ( error ) {
399
- // TODO: Should we display the resize error ?
400
- } finally {
401
- setSelectedData ( newItem ) ;
376
+ // Check if there is a resize
377
+ try {
378
+ if ( newItem . begin !== oldItem . begin ) {
379
+ const resizeBegin = resizeSegment (
380
+ [ ...newData ] ,
381
+ selected ,
382
+ newItem . begin - oldItem . begin ,
383
+ 'begin'
384
+ ) ;
385
+ newData = resizeBegin . result ;
386
+ }
387
+ if ( oldItem . end !== newItem . end ) {
388
+ const resizeEnd = resizeSegment (
389
+ [ ...newData ] ,
390
+ selected ,
391
+ newItem . end - oldItem . end ,
392
+ 'end'
393
+ ) ;
394
+ newData = resizeEnd . result ;
402
395
}
396
+ onChange ( newData ) ;
397
+ } catch ( error ) {
398
+ // TODO: Should we display the resize error ?
399
+ } finally {
400
+ setSelectedData ( newItem ) ;
403
401
}
404
402
} }
405
403
>
0 commit comments