@@ -20,6 +20,8 @@ import Toggle from 'components/Toggle/Toggle.react';
20
20
import Autocomplete from 'components/Autocomplete/Autocomplete.react' ;
21
21
import { Map , fromJS } from 'immutable' ;
22
22
import TrackVisibility from 'components/TrackVisibility/TrackVisibility.react' ;
23
+ import { CurrentApp } from '../../context/currentApp' ;
24
+ import generatePath from '../../lib/generatePath' ;
23
25
24
26
let origin = new Position ( 0 , 0 ) ;
25
27
@@ -517,6 +519,8 @@ function renderPointerCheckboxes(
517
519
518
520
const intersectionMargin = '10px 0px 0px 20px' ;
519
521
export default class PermissionsDialog extends React . Component {
522
+ static contextType = CurrentApp ;
523
+
520
524
constructor ( props ) {
521
525
super ( props ) ;
522
526
@@ -647,23 +651,31 @@ export default class PermissionsDialog extends React.Component {
647
651
let key ;
648
652
let value = { } ;
649
653
650
- if ( type === 'user' ) {
654
+ if ( typeof entry === 'string' ) {
655
+ key = type + ':' + entry ;
656
+ value [ type ] = {
657
+ name : entry ,
658
+ id : undefined
659
+ } ;
660
+ }
661
+
662
+ else if ( type === 'user' ) {
651
663
key = entry . id ;
652
664
value [ type ] = {
653
665
name : entry . get ( 'username' ) ,
654
666
id : entry . id
655
667
} ;
656
668
}
657
669
658
- if ( type === 'role' ) {
670
+ else if ( type === 'role' ) {
659
671
key = 'role:' + entry . getName ( ) ;
660
672
value [ type ] = {
661
673
name : entry . getName ( ) ,
662
674
id : entry . id
663
675
} ;
664
676
}
665
677
666
- if ( type === 'pointer' ) {
678
+ else if ( type === 'pointer' ) {
667
679
key = entry ;
668
680
value [ type ] = true ;
669
681
}
@@ -971,7 +983,21 @@ export default class PermissionsDialog extends React.Component {
971
983
return output ;
972
984
}
973
985
986
+ urlForKey ( key ) {
987
+ let isRole = key . startsWith ( 'role:' )
988
+ let className = isRole ? '_Role' : '_User' ;
989
+ let field = isRole ? 'name' : 'objectId' ;
990
+ let value = isRole ? key . replace ( 'role:' , '' ) : key
991
+ let filters = JSON . stringify ( [ {
992
+ field,
993
+ constraint : 'eq' ,
994
+ compareTo : value
995
+ } ] ) ;
996
+ return generatePath ( this . context , `browser/${ className } ?filters=${ encodeURIComponent ( filters ) } ` ) ;
997
+ }
998
+
974
999
renderRow ( key , columns , types ) {
1000
+
975
1001
const pill = text => (
976
1002
< span className = { styles . pillType } >
977
1003
< Pill value = { text } />
@@ -982,20 +1008,21 @@ export default class PermissionsDialog extends React.Component {
982
1008
const type = ( types && types . get ( key ) ) || { } ;
983
1009
984
1010
let pointer = this . state . pointerPerms . has ( key ) ;
985
- let label = < span > { key } </ span > ;
1011
+ let label = < span > < a target = "_blank" href = { this . urlForKey ( key ) } > { key } </ a > </ span > ;
986
1012
987
1013
if ( type . user ) {
988
1014
label = (
989
1015
< span >
990
1016
< p >
991
1017
< span >
992
- < span className = { styles . selectable } > { type . user . id } </ span >
1018
+ < span className = { styles . selectable } >
1019
+ < a target = "_blank" href = { this . urlForKey ( key ) } > { type . user . id } </ a >
1020
+ </ span >
993
1021
{ pill ( 'User' ) }
994
1022
</ span >
995
1023
</ p >
996
1024
< p className = { styles . hint } >
997
- { 'username: ' }
998
- < span className = { styles . selectable } > { type . user . name } </ span >
1025
+ username: < span className = { styles . selectable } style = { { color :type . user . name ? undefined : '#f00' } } > { type . user . name ?? 'user not found' } </ span >
999
1026
</ p >
1000
1027
</ span >
1001
1028
) ;
@@ -1005,11 +1032,11 @@ export default class PermissionsDialog extends React.Component {
1005
1032
< p >
1006
1033
< span >
1007
1034
< span className = { styles . prefix } > { 'role:' } </ span >
1008
- { type . role . name }
1035
+ < a target = "_blank" href = { this . urlForKey ( key ) } > { type . role . name } </ a >
1009
1036
</ span >
1010
1037
</ p >
1011
1038
< p className = { styles . hint } >
1012
- id: < span className = { styles . selectable } > { type . role . id } </ span >
1039
+ id: < span className = { styles . selectable } style = { { color : type . role . id ? undefined : '#f00' } } > { type . role . id ?? 'role not found' } </ span >
1013
1040
</ p >
1014
1041
</ span >
1015
1042
) ;
0 commit comments