@@ -13,34 +13,32 @@ import styles from './index.less';
13
13
import { flatArray } from '.' ;
14
14
import classNames from 'classnames' ;
15
15
import RiskLevelLabel from '@/component/RiskLevelLabel' ;
16
+ import ConnectionPopover from '@/component/ConnectionPopover' ;
16
17
17
- type DatabaseOption = {
18
+ export type DatabaseOption = {
18
19
label : string ;
19
20
value : number ;
20
21
dataSource : IConnection ;
21
22
environment : IEnvironment ;
22
23
existed : boolean ;
24
+ disabled : boolean ;
25
+ expired : boolean ;
23
26
} ;
24
27
const InnerSelect : React . FC < {
28
+ rootName : ( number | string ) [ ] ;
25
29
innerName : number ;
26
30
outerName : number ;
27
31
innerIndex : number ;
28
- projectId : number ;
32
+ disabled : boolean ;
29
33
databaseOptions : DatabaseOption [ ] ;
30
34
innerRemove : ( value : number ) => void ;
31
- } > = ( { innerName, outerName, innerIndex, projectId , databaseOptions, innerRemove } ) => {
35
+ } > = ( { rootName , innerName, outerName, innerIndex, disabled , databaseOptions, innerRemove } ) => {
32
36
const ref = useRef ( null ) ;
33
37
const form = Form . useFormInstance ( ) ;
34
38
const [ searchValue , setSearchValue ] = useState < string > ( ) ;
35
- const orderedDatabaseIds = useWatch < number [ ] [ ] > ( [ 'parameters' , 'orderedDatabaseIds' ] , form ) ;
36
- const currentOrderedDatabaseIds = useWatch < number [ ] > (
37
- [ 'parameters' , 'orderedDatabaseIds' , outerName ] ,
38
- form ,
39
- ) ;
40
- const currnetOrderedDatabaseId = useWatch < number > (
41
- [ 'parameters' , 'orderedDatabaseIds' , outerName , innerName ] ,
42
- form ,
43
- ) ;
39
+ const orderedDatabaseIds = useWatch < number [ ] [ ] > ( rootName , form ) ;
40
+ const currentOrderedDatabaseIds = useWatch < number [ ] > ( [ ...rootName , outerName ] , form ) ;
41
+ const currnetOrderedDatabaseId = useWatch < number > ( [ ...rootName , outerName , innerName ] , form ) ;
44
42
const [ popoverOpen , setPopoverOpen ] = useState < boolean > ( false ) ;
45
43
46
44
const databaseOptionMap = databaseOptions ?. reduce ( ( pre , cur ) => {
@@ -51,7 +49,7 @@ const InnerSelect: React.FC<{
51
49
const currentOrderedDatabaseId = currentOrderedDatabaseIds [ originIndex ] ;
52
50
currentOrderedDatabaseIds . splice ( originIndex , 1 ) ;
53
51
currentOrderedDatabaseIds . splice ( targetIndex , 0 , currentOrderedDatabaseId ) ;
54
- form . setFieldValue ( [ 'parameters' , 'orderedDatabaseIds' , origin ] , currentOrderedDatabaseIds ) ;
52
+ form . setFieldValue ( [ ... rootName , origin ] , currentOrderedDatabaseIds ) ;
55
53
} ;
56
54
const [ { canDrop, isOver } , drop ] = useDrop ( {
57
55
accept : 'box' ,
@@ -73,7 +71,7 @@ const InnerSelect: React.FC<{
73
71
originOrderedDatabaseIds ?. splice ( item ?. originInnerIndex , 1 ) ;
74
72
orderedDatabaseIds ?. splice ( item ?. originOuterName , 1 , originOrderedDatabaseIds ) ;
75
73
const newOrderedDatabaseIds = orderedDatabaseIds ?. filter ( ( ids ) => ids ?. length ) ;
76
- form . setFieldValue ( [ 'parameters' , 'orderedDatabaseIds' ] , newOrderedDatabaseIds ) ;
74
+ form . setFieldValue ( rootName , newOrderedDatabaseIds ) ;
77
75
}
78
76
} ,
79
77
collect : ( monitor ) => {
@@ -156,70 +154,81 @@ const InnerSelect: React.FC<{
156
154
) ;
157
155
}
158
156
} ;
159
- const renderItem = ( item : DatabaseOption ) => {
157
+ const renderItem = (
158
+ item : DatabaseOption ,
159
+ setSearchValue : React . Dispatch < React . SetStateAction < string > > ,
160
+ ) => {
160
161
const icon = getDataSourceStyleByConnectType ( item ?. dataSource ?. type ) ;
161
162
const databaseIds = flatArray ( orderedDatabaseIds ) ;
162
- const isDisabled = databaseIds ?. includes ( item ?. value ) ;
163
+ const isSelected = databaseIds ?. includes ( item ?. value ) ;
163
164
return (
164
- < div
165
- title = { item ?. label }
166
- key = { item ?. value }
167
- data-key = { item ?. value }
168
- onClick = { ( ) => {
169
- if ( isDisabled ) {
170
- return ;
171
- }
172
- form . setFieldValue (
173
- [ 'parameters' , 'orderedDatabaseIds' , outerName , innerName ] ,
174
- item ?. value ,
175
- ) ;
176
- setPopoverOpen ( false ) ;
177
- } }
165
+ < Popover
166
+ showArrow = { false }
167
+ placement = { 'right' }
168
+ content = { < ConnectionPopover connection = { item ?. dataSource } /> }
178
169
>
179
- < Tooltip
180
- title = {
181
- isDisabled
182
- ? formatMessage ( {
183
- id : 'src.component.Task.MutipleAsyncTask.CreateModal.BF1212E7' ,
184
- defaultMessage : '该数据库已被选中' ,
185
- } )
186
- : null
187
- }
170
+ < div
171
+ title = { item ?. label }
172
+ key = { item ?. value }
173
+ data-key = { item ?. value }
174
+ onClick = { ( ) => {
175
+ if ( isSelected || item ?. expired ) {
176
+ return ;
177
+ }
178
+ setSearchValue ( '' ) ;
179
+ form . setFieldValue ( [ ...rootName , outerName , innerName ] , item ?. value ) ;
180
+ setPopoverOpen ( false ) ;
181
+ } }
188
182
>
189
- < div
190
- className = { classNames ( styles . option , {
191
- [ styles . optionDisabled ] : isDisabled ,
192
- } ) }
183
+ < Tooltip
184
+ title = {
185
+ isSelected
186
+ ? formatMessage ( {
187
+ id : 'src.component.Task.MutipleAsyncTask.CreateModal.BF1212E7' ,
188
+ defaultMessage : '该数据库已被选中' ,
189
+ } )
190
+ : null
191
+ }
193
192
>
194
- < Space >
195
- < Icon
196
- component = { icon ?. icon ?. component }
197
- style = { {
198
- color : isDisabled ? 'var(--icon-color-disable)' : icon ?. icon ?. color ,
199
- fontSize : 16 ,
200
- marginRight : 4 ,
201
- } }
202
- />
193
+ < div
194
+ className = { classNames ( styles . option , {
195
+ [ styles . optionDisabled ] : isSelected || item ?. expired ,
196
+ } ) }
197
+ >
198
+ < Space >
199
+ < Icon
200
+ component = { icon ?. icon ?. component }
201
+ style = { {
202
+ color :
203
+ isSelected || item ?. expired ? 'var(--icon-color-disable)' : icon ?. icon ?. color ,
204
+ fontSize : 16 ,
205
+ marginRight : 4 ,
206
+ } }
207
+ />
203
208
209
+ < div
210
+ style = { {
211
+ color :
212
+ isSelected || item ?. expired
213
+ ? 'var(--mask-color)'
214
+ : 'var(--text-color-primary)' ,
215
+ } }
216
+ >
217
+ { item ?. label }
218
+ </ div >
219
+ < div style = { { color : 'var(--mask-color)' } } > { item ?. dataSource ?. name } </ div >
220
+ </ Space >
204
221
< div
205
222
style = { {
206
- color : isDisabled ? 'var(--mask-color)' : 'var(--text-color-primary)' ,
223
+ height : '6px' ,
224
+ width : '6px' ,
225
+ backgroundColor : item ?. environment ?. style ,
207
226
} }
208
- >
209
- { item ?. label }
210
- </ div >
211
- < div style = { { color : 'var(--mask-color)' } } > { item ?. dataSource ?. name } </ div >
212
- </ Space >
213
- < div
214
- style = { {
215
- height : '6px' ,
216
- width : '6px' ,
217
- backgroundColor : item ?. environment ?. style ,
218
- } }
219
- />
220
- </ div >
221
- </ Tooltip >
222
- </ div >
227
+ />
228
+ </ div >
229
+ </ Tooltip >
230
+ </ div >
231
+ </ Popover >
223
232
) ;
224
233
} ;
225
234
useEffect ( ( ) => {
@@ -230,10 +239,11 @@ const InnerSelect: React.FC<{
230
239
return (
231
240
< div
232
241
ref = { ref }
242
+ className = { styles . dragIem }
233
243
style = { {
234
244
borderTop : isOver ? '1px solid blue' : '1px solid transparent' ,
235
245
opacity : isDragging ? 0 : 1 ,
236
- width : '430px ' ,
246
+ width : '444px ' ,
237
247
} }
238
248
>
239
249
< Form . Item >
@@ -302,18 +312,19 @@ const InnerSelect: React.FC<{
302
312
return item ;
303
313
}
304
314
} )
305
- ?. map ( ( item ) => renderItem ( item ) )
306
- : databaseOptions ?. map ( ( item ) => renderItem ( item ) ) }
315
+ ?. map ( ( item ) => renderItem ( item , setSearchValue ) )
316
+ : databaseOptions ?. map ( ( item ) => renderItem ( item , setSearchValue ) ) }
307
317
</ div >
308
318
}
309
319
>
310
320
< Select
311
321
showSearch
312
322
optionFilterProp = "title"
313
323
style = { { width : 390 } }
324
+ searchValue = { searchValue }
314
325
onSearch = { ( searchValue ) => setSearchValue ( searchValue ) }
315
326
placeholder = { getPlaceholder ( ) }
316
- disabled = { ! projectId }
327
+ disabled = { disabled }
317
328
allowClear
318
329
open = { false }
319
330
/>
@@ -326,19 +337,17 @@ const InnerSelect: React.FC<{
326
337
) ;
327
338
} ;
328
339
const InnerSelecter : React . FC < {
340
+ rootName : ( number | string ) [ ] ;
329
341
innerFields : FormListFieldData [ ] ;
330
342
outerName : number ;
331
- projectId : number ;
343
+ disabled : boolean ;
332
344
databaseOptions : DatabaseOption [ ] ;
333
345
innerRemove : ( index : number | number [ ] ) => void ;
334
- } > = ( { innerFields, outerName, projectId , databaseOptions, innerRemove } ) => {
346
+ } > = ( { rootName , innerFields, outerName, disabled , databaseOptions, innerRemove } ) => {
335
347
const ref = useRef ( null ) ;
336
348
const form = Form . useFormInstance ( ) ;
337
- const orderedDatabaseIds = useWatch < number [ ] [ ] > ( [ 'parameters' , 'orderedDatabaseIds' ] , form ) ;
338
- const currentOrderedDatabaseIds = useWatch < number [ ] > (
339
- [ 'parameters' , 'orderedDatabaseIds' , outerName ] ,
340
- form ,
341
- ) ;
349
+ const orderedDatabaseIds = useWatch < number [ ] [ ] > ( rootName , form ) ;
350
+ const currentOrderedDatabaseIds = useWatch < number [ ] > ( [ ...rootName , outerName ] , form ) ;
342
351
343
352
const [ { canDrop, isOver } , drop ] = useDrop ( {
344
353
accept : 'box' ,
@@ -351,7 +360,7 @@ const InnerSelecter: React.FC<{
351
360
orderedDatabaseIds [ outerName ] = currentOrderedDatabaseIds ;
352
361
orderedDatabaseIds ?. [ item ?. originOuterName ] ?. splice ( item ?. originInnerIndex , 1 ) ;
353
362
const newOrderedDatabaseIds = orderedDatabaseIds ?. filter ( ( ids ) => ids ?. length ) ;
354
- form . setFieldValue ( [ 'parameters' , 'orderedDatabaseIds' ] , newOrderedDatabaseIds ) ;
363
+ form . setFieldValue ( rootName , newOrderedDatabaseIds ) ;
355
364
} ,
356
365
collect : ( monitor ) => {
357
366
return {
@@ -370,8 +379,9 @@ const InnerSelecter: React.FC<{
370
379
< div >
371
380
{ innerFields ?. map ( ( { key : innerKey , name : innerName , ...innerRestField } , innerIndex ) => (
372
381
< InnerSelect
382
+ rootName = { rootName }
373
383
key = { innerIndex }
374
- projectId = { projectId }
384
+ disabled = { disabled }
375
385
databaseOptions = { databaseOptions }
376
386
innerIndex = { innerIndex }
377
387
outerName = { outerName }
0 commit comments