@@ -10,6 +10,8 @@ import { ForeignKey } from './ForeignKeySelector.types'
10
10
import { ColumnField } from '../SidePanelEditor.types'
11
11
import InformationBox from 'components/ui/InformationBox'
12
12
import { FOREIGN_KEY_DELETION_ACTION } from 'data/database/database-query-constants'
13
+ import { FOREIGN_KEY_DELETION_OPTIONS } from './ForeignKeySelector.constants'
14
+ import { generateDeletionActionDescription } from './ForeignKeySelector.utils'
13
15
14
16
interface Props {
15
17
column : ColumnField
@@ -21,17 +23,14 @@ interface Props {
21
23
) => void
22
24
}
23
25
24
- // [Joshen] In the future, we can easily extend to other deletion actions as well by replacing
25
- // enableCascadeDelete with deletionAction
26
-
27
26
const ForeignKeySelector : FC < Props > = ( { column, visible = false , closePanel, saveChanges } ) => {
28
27
const { meta } = useStore ( )
29
28
const [ errors , setErrors ] = useState < any > ( { } )
30
29
const [ selectedForeignKey , setSelectedForeignKey ] = useState < ForeignKey > ( {
31
30
schema : 'public' ,
32
31
table : '' ,
33
32
column : '' ,
34
- enableCascadeDelete : false ,
33
+ deletionAction : FOREIGN_KEY_DELETION_ACTION . NO_ACTION ,
35
34
} )
36
35
37
36
const schemas = meta . schemas . list ( )
@@ -58,22 +57,27 @@ const ForeignKeySelector: FC<Props> = ({ column, visible = false, closePanel, sa
58
57
schema : foreignKey . target_table_schema ,
59
58
table : foreignKey . target_table_name ,
60
59
column : foreignKey . target_column_name ,
61
- enableCascadeDelete : foreignKey . deletion_action === FOREIGN_KEY_DELETION_ACTION . CASCADE ,
60
+ deletionAction : foreignKey . deletion_action ,
62
61
} )
63
62
} else {
64
63
setSelectedForeignKey ( {
65
64
schema : 'public' ,
66
65
table : '' ,
67
66
column : '' ,
68
- enableCascadeDelete : false ,
67
+ deletionAction : FOREIGN_KEY_DELETION_ACTION . NO_ACTION ,
69
68
} )
70
69
}
71
70
}
72
71
} , [ visible ] )
73
72
74
73
const updateSelectedSchema = ( schema : string ) => {
75
74
meta . tables . loadBySchema ( schema )
76
- const updatedForeignKey = { schema, table : '' , column : '' , enableCascadeDelete : false }
75
+ const updatedForeignKey = {
76
+ schema,
77
+ table : '' ,
78
+ column : '' ,
79
+ deletionAction : FOREIGN_KEY_DELETION_ACTION . NO_ACTION ,
80
+ }
77
81
setSelectedForeignKey ( updatedForeignKey )
78
82
}
79
83
@@ -84,7 +88,7 @@ const ForeignKeySelector: FC<Props> = ({ column, visible = false, closePanel, sa
84
88
schema : '' ,
85
89
table : '' ,
86
90
column : '' ,
87
- enableCascadeDelete : false ,
91
+ deletionAction : FOREIGN_KEY_DELETION_ACTION . NO_ACTION ,
88
92
} )
89
93
}
90
94
const table = find ( tables , { id : tableId } )
@@ -93,7 +97,7 @@ const ForeignKeySelector: FC<Props> = ({ column, visible = false, closePanel, sa
93
97
schema : table . schema ,
94
98
table : table . name ,
95
99
column : table . columns ?. length ? table . columns [ 0 ] . name : undefined ,
96
- enableCascadeDelete : false ,
100
+ deletionAction : FOREIGN_KEY_DELETION_ACTION . NO_ACTION ,
97
101
} )
98
102
}
99
103
}
@@ -107,9 +111,9 @@ const ForeignKeySelector: FC<Props> = ({ column, visible = false, closePanel, sa
107
111
}
108
112
}
109
113
110
- const updateEnableCascadeDelete = ( value : boolean ) => {
114
+ const updateDeletionAction = ( value : string ) => {
111
115
setErrors ( { } )
112
- setSelectedForeignKey ( { ...selectedForeignKey , enableCascadeDelete : value } )
116
+ setSelectedForeignKey ( { ...selectedForeignKey , deletionAction : value } )
113
117
}
114
118
115
119
const onSaveChanges = ( resolve : ( ) => void ) => {
@@ -129,9 +133,7 @@ const ForeignKeySelector: FC<Props> = ({ column, visible = false, closePanel, sa
129
133
saveChanges ( {
130
134
table : selectedTable ,
131
135
column : selectedColumn ,
132
- deletionAction : selectedForeignKey . enableCascadeDelete
133
- ? FOREIGN_KEY_DELETION_ACTION . CASCADE
134
- : FOREIGN_KEY_DELETION_ACTION . NO_ACTION ,
136
+ deletionAction : selectedForeignKey . deletionAction ,
135
137
} )
136
138
}
137
139
}
@@ -233,7 +235,11 @@ const ForeignKeySelector: FC<Props> = ({ column, visible = false, closePanel, sa
233
235
disabled
234
236
label = {
235
237
< div >
236
- Select a column from < code > { selectedForeignKey ?. table } </ code > to reference to
238
+ Select a column from{ ' ' }
239
+ < code className = "text-xs" >
240
+ { selectedForeignKey ?. schema } .{ selectedForeignKey ?. table }
241
+ </ code > { ' ' }
242
+ to reference to
237
243
</ div >
238
244
}
239
245
error = { errors . column }
@@ -246,7 +252,11 @@ const ForeignKeySelector: FC<Props> = ({ column, visible = false, closePanel, sa
246
252
// @ts -ignore
247
253
label = {
248
254
< div >
249
- Select a column from < code > { selectedForeignKey ?. table } </ code > to reference to
255
+ Select a column from{ ' ' }
256
+ < code className = "text-xs" >
257
+ { selectedForeignKey ?. schema } .{ selectedForeignKey ?. table }
258
+ </ code > { ' ' }
259
+ to reference to
250
260
</ div >
251
261
}
252
262
error = { errors . column }
@@ -262,13 +272,25 @@ const ForeignKeySelector: FC<Props> = ({ column, visible = false, closePanel, sa
262
272
) ) }
263
273
</ Listbox >
264
274
) }
265
- < Toggle
266
- label = "Enable cascade deletes"
275
+ < SidePanel . Separator />
276
+ < Listbox
277
+ id = "deletionAction"
278
+ value = { selectedForeignKey . deletionAction }
279
+ label = "Deletion action if referenced row is removed"
267
280
// @ts -ignore
268
- onChange = { ( value : boolean ) => updateEnableCascadeDelete ( value ) }
269
- checked = { selectedForeignKey . enableCascadeDelete }
270
- descriptionText = { `Deleting a record from ${ selectedForeignKey . schema } .${ selectedForeignKey . table } will also delete the referencing records from this table` }
271
- />
281
+ descriptionText = { generateDeletionActionDescription (
282
+ selectedForeignKey . deletionAction ,
283
+ `${ selectedForeignKey . schema } .${ selectedForeignKey . table } `
284
+ ) }
285
+ error = { errors . column }
286
+ onChange = { ( value : string ) => updateDeletionAction ( value ) }
287
+ >
288
+ { FOREIGN_KEY_DELETION_OPTIONS . map ( ( option ) => (
289
+ < Listbox . Option key = { option . key } value = { option . value } label = { option . label } >
290
+ < p className = "text-scale-1200" > { option . label } </ p >
291
+ </ Listbox . Option >
292
+ ) ) }
293
+ </ Listbox >
272
294
</ >
273
295
) }
274
296
</ div >
0 commit comments