@@ -12,7 +12,7 @@ import {
12
12
TacoButton ,
13
13
} from "lowcoder-design" ;
14
14
import _ from "lodash" ;
15
- import { useEffect , useState } from "react" ;
15
+ import { useEffect , useState , useCallback } from "react" ;
16
16
import { useDispatch , useSelector } from "react-redux" ;
17
17
import { AppState } from "redux/reducers" ;
18
18
import { fetchDatasourceStructure } from "redux/reduxActions/datasourceActions" ;
@@ -552,13 +552,22 @@ const CreateFormBody = (props: { onCreate: CreateHandler }) => {
552
552
const dataSourceId : string | undefined = Form . useWatch ( "dataSourceId" , form ) ;
553
553
const dataSourceItems = useDataSourceItems ( ) ;
554
554
const dataSourceItem = dataSourceItems . find ( ( t ) => t . dataSource . id === dataSourceId ) ;
555
+
556
+ // Cleanup form on unmount
557
+ useEffect ( ( ) => {
558
+ return ( ) => {
559
+ form . resetFields ( ) ;
560
+ } ;
561
+ } , [ form ] ) ;
562
+
555
563
// default to the first item
556
564
useEffect ( ( ) => {
557
565
if ( ! dataSourceItem ) {
558
566
const id = dataSourceItems . length > 0 ? dataSourceItems [ 0 ] . dataSource . id : undefined ;
559
567
form . setFieldsValue ( { dataSourceId : id } ) ;
560
568
}
561
- } , [ dataSourceItems ] ) ;
569
+ } , [ dataSourceItems , dataSourceItem , form ] ) ;
570
+
562
571
// Refetch when changed
563
572
const dispatch = useDispatch ( ) ;
564
573
useEffect ( ( ) => {
@@ -570,25 +579,27 @@ const CreateFormBody = (props: { onCreate: CreateHandler }) => {
570
579
const tableName : string | undefined = Form . useWatch ( "tableName" , form ) ;
571
580
const tableStructures = useTableStructures ( dataSourceId ) ;
572
581
const tableStructure = tableStructures . find ( ( t ) => t . name === tableName ) ;
582
+
573
583
// default to the first one
574
584
useEffect ( ( ) => {
575
585
if ( ! tableStructure ) {
576
586
const name = tableStructures . length > 0 ? tableStructures [ 0 ] . name : undefined ;
577
587
form . setFieldsValue ( { tableName : name } ) ;
578
588
}
579
- } , [ tableStructures ] ) ;
589
+ } , [ tableStructures , tableStructure , form ] ) ;
590
+
580
591
// Columns of the data table, saved to support drag and drop
581
592
const [ items , setItems ] = useState < RowItem [ ] > ( [ ] ) ;
582
593
const dataSourceTypeConfig = dataSourceItem ?. typeConfig ;
594
+
583
595
useEffect ( ( ) => {
584
596
const { initItems, initColumns } = getInitItemsAndColumns ( dataSourceTypeConfig , tableStructure ) ;
585
597
// Set the initial value by the method. Because if another table has the same column name, setting via initialValue is invalid.
586
598
form . setFieldsValue ( { columns : initColumns } ) ;
587
599
setItems ( initItems ) ;
588
- } , [ dataSourceTypeConfig , tableStructure ] ) ;
600
+ } , [ dataSourceTypeConfig , tableStructure , form ] ) ;
589
601
590
- const handleDragEnd = ( e : { active : { id : string } ; over : { id : string } | null } ) => {
591
- console . log ( 'handleDragEnd' , e ) ;
602
+ const handleDragEnd = useCallback ( ( e : { active : { id : string } ; over : { id : string } | null } ) => {
592
603
if ( ! e . over ) {
593
604
return ;
594
605
}
@@ -603,7 +614,7 @@ const CreateFormBody = (props: { onCreate: CreateHandler }) => {
603
614
newData . splice ( toIndex , 0 , movedItem ) ;
604
615
605
616
setItems ( newData ) ;
606
- } ;
617
+ } , [ items ] ) ;
607
618
608
619
const emptyText = getEmptyText ( dataSourceItems . length , tableStructures . length , items . length ) ;
609
620
@@ -688,27 +699,40 @@ const CreateFormBody = (props: { onCreate: CreateHandler }) => {
688
699
689
700
export const CreateForm = ( props : { onCreate : CreateHandler } ) => {
690
701
const [ visible , setVisible ] = useState ( false ) ;
702
+
703
+ const handleMouseDown = useCallback ( ( e : React . MouseEvent ) => {
704
+ setVisible ( true ) ;
705
+ e . stopPropagation ( ) ;
706
+ } , [ ] ) ;
707
+
708
+ const handleKeyDown = useCallback ( ( e : React . KeyboardEvent ) => {
709
+ e . stopPropagation ( ) ;
710
+ } , [ ] ) ;
711
+
712
+ const handleClick = useCallback ( ( e : React . MouseEvent ) => {
713
+ e . stopPropagation ( ) ;
714
+ } , [ ] ) ;
715
+
716
+ const handleCancel = useCallback ( ( ) => {
717
+ setVisible ( false ) ;
718
+ } , [ ] ) ;
719
+
691
720
return (
692
721
< >
693
- < OpenDialogButton
694
- onMouseDown = { ( e ) => {
695
- setVisible ( true ) ;
696
- e . stopPropagation ( ) ;
697
- } }
698
- >
722
+ < OpenDialogButton onMouseDown = { handleMouseDown } >
699
723
{ trans ( "formComp.openDialogButton" ) }
700
724
</ OpenDialogButton >
701
725
< div
702
- onKeyDown = { ( e ) => e . stopPropagation ( ) }
703
- onMouseDown = { ( e ) => e . stopPropagation ( ) }
704
- onClick = { ( e ) => e . stopPropagation ( ) }
726
+ onKeyDown = { handleKeyDown }
727
+ onMouseDown = { handleMouseDown }
728
+ onClick = { handleClick }
705
729
>
706
730
< CustomModal
707
731
open = { visible }
708
732
destroyOnClose = { true }
709
733
title = { trans ( "formComp.generateForm" ) }
710
734
footer = { null }
711
- onCancel = { ( ) => setVisible ( false ) }
735
+ onCancel = { handleCancel }
712
736
width = "600px"
713
737
children = { < CreateFormBody { ...props } /> }
714
738
styles = { { body : { padding : 0 } } }
0 commit comments