@@ -71,6 +71,7 @@ interface DatabaseDeleteObject extends DatabaseObject {
71
71
interface DatabaseListProps {
72
72
addDangerToast : ( msg : string ) => void ;
73
73
addSuccessToast : ( msg : string ) => void ;
74
+ addInfoToast : ( msg : string ) => void ;
74
75
user : {
75
76
userId : string | number ;
76
77
firstName : string ;
@@ -101,6 +102,7 @@ function BooleanDisplay({ value }: { value: Boolean }) {
101
102
102
103
function DatabaseList ( {
103
104
addDangerToast,
105
+ addInfoToast,
104
106
addSuccessToast,
105
107
user,
106
108
} : DatabaseListProps ) {
@@ -121,6 +123,9 @@ function DatabaseList({
121
123
const fullUser = useSelector < any , UserWithPermissionsAndRoles > (
122
124
state => state . user ,
123
125
) ;
126
+ const shouldSyncPermsInAsyncMode = useSelector < any , boolean > (
127
+ state => state . common ?. conf . SYNC_DB_PERMISSIONS_IN_ASYNC_MODE ,
128
+ ) ;
124
129
const showDatabaseModal = getUrlParam ( URL_PARAMS . showDatabaseModal ) ;
125
130
126
131
const [ query , setQuery ] = useQueryParams ( {
@@ -335,6 +340,44 @@ function DatabaseList({
335
340
setPreparingExport ( true ) ;
336
341
}
337
342
343
+ function handleDatabasePermSync ( database : DatabaseObject ) {
344
+ if ( shouldSyncPermsInAsyncMode ) {
345
+ addInfoToast ( t ( 'Validating connectivity for %s' , database . database_name ) ) ;
346
+ } else {
347
+ addInfoToast ( t ( 'Syncing permissions for %s' , database . database_name ) ) ;
348
+ }
349
+ SupersetClient . post ( {
350
+ endpoint : `/api/v1/database/${ database . id } /sync_permissions/` ,
351
+ } ) . then (
352
+ ( { response } ) => {
353
+ // Sync request
354
+ if ( response . status === 200 ) {
355
+ addSuccessToast (
356
+ t ( 'Permissions successfully synced for %s' , database . database_name ) ,
357
+ ) ;
358
+ }
359
+ // Async request
360
+ else {
361
+ addInfoToast (
362
+ t (
363
+ 'Syncing permissions for %s in the background' ,
364
+ database . database_name ,
365
+ ) ,
366
+ ) ;
367
+ }
368
+ } ,
369
+ createErrorHandler ( errMsg =>
370
+ addDangerToast (
371
+ t (
372
+ 'An error occurred while syncing permissions for %s: %s' ,
373
+ database . database_name ,
374
+ errMsg ,
375
+ ) ,
376
+ ) ,
377
+ ) ,
378
+ ) ;
379
+ }
380
+
338
381
const initialSort = [ { id : 'changed_on_delta_humanized' , desc : true } ] ;
339
382
340
383
const columns = useMemo (
@@ -426,6 +469,7 @@ function DatabaseList({
426
469
handleDatabaseEditModal ( { database : original , modalOpen : true } ) ;
427
470
const handleDelete = ( ) => openDatabaseDeleteModal ( original ) ;
428
471
const handleExport = ( ) => handleDatabaseExport ( original ) ;
472
+ const handleSync = ( ) => handleDatabasePermSync ( original ) ;
429
473
if ( ! canEdit && ! canDelete && ! canExport ) {
430
474
return null ;
431
475
}
@@ -481,6 +525,23 @@ function DatabaseList({
481
525
</ span >
482
526
</ Tooltip >
483
527
) }
528
+ { canEdit && (
529
+ < Tooltip
530
+ id = "sync-action-tooltip"
531
+ title = { t ( 'Sync Permissions' ) }
532
+ placement = "bottom"
533
+ >
534
+ < span
535
+ role = "button"
536
+ data-test = "database-sync-perm"
537
+ tabIndex = { 0 }
538
+ className = "action-button"
539
+ onClick = { handleSync }
540
+ >
541
+ < Icons . Refresh />
542
+ </ span >
543
+ </ Tooltip >
544
+ ) }
484
545
</ Actions >
485
546
) ;
486
547
} ,
0 commit comments