@@ -2,10 +2,14 @@ import React from 'react';
2
2
import { connect } from 'react-redux' ;
3
3
import _ from 'lodash' ;
4
4
import { withStyles } from '@mui/styles' ;
5
- import { Grid , Typography } from '@mui/material' ;
5
+ import { Grid , Typography , Box , Link , FormLabel } from '@mui/material' ;
6
+ import { styled } from '@mui/system' ;
7
+ import { LaunchOutlined } from '@mui/icons-material' ;
8
+ import { ManagedGroupMembershipEntry } from 'src/models/group' ;
9
+ import { getUserGroups } from 'actions/index' ;
6
10
import UserList from '../UserList' ;
7
11
import { SnapshotRoles } from '../../constants' ;
8
- import { getRoleMembersFromPolicies } from '../../libs/utils' ;
12
+ import { getRoleMembersFromPolicies , useOnMount } from '../../libs/utils' ;
9
13
import {
10
14
addSnapshotPolicyMember ,
11
15
removeSnapshotPolicyMember ,
@@ -16,20 +20,24 @@ import { TdrState } from '../../reducers';
16
20
import { SnapshotRequest } from '../../reducers/snapshot' ;
17
21
import { AppDispatch } from '../../store' ;
18
22
import AddUserAccess , { AccessPermission } from '../common/AddUserAccess' ;
23
+ import JadeDropdown from '../dataset/data/JadeDropdown' ;
19
24
20
25
const styles = ( ) => ( {
21
26
helpContainer : {
22
27
padding : '30px 0 10px' ,
23
28
} ,
24
29
} ) ;
25
30
31
+ const JadeLink = styled ( 'span' ) ( ( { theme } ) => theme . mixins . jadeLink ) ;
32
+
26
33
type SnapshotAccessProps = {
27
34
dispatch : AppDispatch ;
28
35
policies : Array < PolicyModel > ;
29
36
snapshot : SnapshotModel ;
30
37
snapshotRequest : SnapshotRequest ;
31
38
userRoles : Array < string > ;
32
39
createMode ?: boolean ;
40
+ userGroups : Array < ManagedGroupMembershipEntry > ;
33
41
} ;
34
42
35
43
function SnapshotAccess ( {
@@ -39,7 +47,14 @@ function SnapshotAccess({
39
47
snapshotRequest,
40
48
userRoles,
41
49
createMode,
50
+ userGroups,
42
51
} : SnapshotAccessProps ) {
52
+ const [ selectedAuthDomain , setSelectedAuthDomain ] = React . useState < string | undefined > ( undefined ) ;
53
+
54
+ useOnMount ( ( ) => {
55
+ dispatch ( getUserGroups ( ) ) ;
56
+ } ) ;
57
+
43
58
const transformRoleToCreatePolicy = ( role : string ) : string => `${ _ . camelCase ( role ) } s` ;
44
59
45
60
const addUsers = ( role : string , usersToAdd : string [ ] ) => {
@@ -94,49 +109,82 @@ function SnapshotAccess({
94
109
] ;
95
110
96
111
return (
97
- < Grid container spacing = { 1 } >
98
- < Typography variant = "h6" > Roles</ Typography >
99
- { canManageUsers && (
100
- < Grid item xs = { 12 } >
101
- < AddUserAccess permissions = { permissions } onAdd = { addUsers } />
112
+ < >
113
+ < Box sx = { { my : 2 } } >
114
+ < Grid container spacing = { 1 } >
115
+ < Typography variant = "h6" > Roles</ Typography >
116
+ { canManageUsers && (
117
+ < Grid item xs = { 12 } >
118
+ < AddUserAccess permissions = { permissions } onAdd = { addUsers } />
119
+ </ Grid >
120
+ ) }
121
+ < Grid item xs = { 12 } data-cy = "snapshot-stewards" >
122
+ < UserList
123
+ users = { stewards }
124
+ typeOfUsers = "Stewards"
125
+ canManageUsers = { canManageUsers }
126
+ removeUser = { removeUser ( SnapshotRoles . STEWARD ) }
127
+ />
128
+ </ Grid >
129
+ < Grid item xs = { 12 } data-cy = "snapshot-readers" >
130
+ < UserList
131
+ users = { readers }
132
+ typeOfUsers = "Readers"
133
+ canManageUsers = { canManageUsers }
134
+ removeUser = { removeUser ( SnapshotRoles . READER ) }
135
+ defaultOpen = { createMode }
136
+ />
137
+ </ Grid >
138
+ < Grid item xs = { 12 } data-cy = "snapshot-discoverers" >
139
+ < UserList
140
+ users = { discoverers }
141
+ typeOfUsers = "Discoverers"
142
+ canManageUsers = { canManageUsers }
143
+ removeUser = { removeUser ( SnapshotRoles . DISCOVERER ) }
144
+ defaultOpen = { createMode }
145
+ />
146
+ </ Grid >
147
+ < Grid item xs = { 12 } data-cy = "snapshot-aggregate-data-readers" >
148
+ < UserList
149
+ users = { aggregateDataReaders }
150
+ typeOfUsers = "Aggregate Data Readers"
151
+ canManageUsers = { canManageUsers }
152
+ removeUser = { removeUser ( SnapshotRoles . AGGREGATE_DATA_READER ) }
153
+ defaultOpen = { createMode }
154
+ />
155
+ </ Grid >
102
156
</ Grid >
103
- ) }
104
- < Grid item xs = { 12 } data-cy = "snapshot-stewards" >
105
- < UserList
106
- users = { stewards }
107
- typeOfUsers = "Stewards"
108
- canManageUsers = { canManageUsers }
109
- removeUser = { removeUser ( SnapshotRoles . STEWARD ) }
110
- />
111
- </ Grid >
112
- < Grid item xs = { 12 } data-cy = "snapshot-readers" >
113
- < UserList
114
- users = { readers }
115
- typeOfUsers = "Readers"
116
- canManageUsers = { canManageUsers }
117
- removeUser = { removeUser ( SnapshotRoles . READER ) }
118
- defaultOpen = { createMode }
119
- />
120
- </ Grid >
121
- < Grid item xs = { 12 } data-cy = "snapshot-discoverers" >
122
- < UserList
123
- users = { discoverers }
124
- typeOfUsers = "Discoverers"
125
- canManageUsers = { canManageUsers }
126
- removeUser = { removeUser ( SnapshotRoles . DISCOVERER ) }
127
- defaultOpen = { createMode }
128
- />
129
- </ Grid >
130
- < Grid item xs = { 12 } data-cy = "snapshot-aggregate-data-readers" >
131
- < UserList
132
- users = { aggregateDataReaders }
133
- typeOfUsers = "Aggregate Data Readers"
134
- canManageUsers = { canManageUsers }
135
- removeUser = { removeUser ( SnapshotRoles . AGGREGATE_DATA_READER ) }
136
- defaultOpen = { createMode }
137
- />
138
- </ Grid >
139
- </ Grid >
157
+ </ Box >
158
+ < FormLabel sx = { { fontWeight : 700 , color : '#333f52' } } htmlFor = "authorization-domain" >
159
+ Authorization Domain
160
+ < span style = { { fontWeight : 400 , fontStyle : 'italic' } } > - (optional)</ span >
161
+ </ FormLabel >
162
+ < Box sx = { { mb : 1 } } >
163
+ Authorization Domains restrict data access to only specified individuals in a group and are
164
+ intended to fulfill requirements you may have for data governed by a compliance standard,
165
+ such as federal controlled-access data or HIPAA protected data. They follow all snapshot
166
+ copies and cannot be removed. For more details, see{ ' ' }
167
+ < Link
168
+ href = "https://support.terra.bio/hc/en-us/articles/360026775691"
169
+ target = "_blank"
170
+ rel = "noopener noreferrer"
171
+ >
172
+ < JadeLink >
173
+ When to use an Authorization Domain
174
+ < LaunchOutlined fontSize = "small" />
175
+ </ JadeLink >
176
+ </ Link >
177
+ .
178
+ </ Box >
179
+ < JadeDropdown
180
+ sx = { { height : '2.5rem' } }
181
+ disabled = { userGroups ? userGroups . length <= 1 : true }
182
+ options = { userGroups ? userGroups . map ( ( group ) => group . groupName ) : [ ] }
183
+ name = "authorization-domain"
184
+ onSelectedItem = { ( event ) => setSelectedAuthDomain ( event . target . value ) }
185
+ value = { selectedAuthDomain || '' }
186
+ />
187
+ </ >
140
188
) ;
141
189
}
142
190
@@ -146,6 +194,7 @@ function mapStateToProps(state: TdrState) {
146
194
snapshot : state . snapshots . snapshot ,
147
195
snapshotRequest : state . snapshots . snapshotRequest ,
148
196
userRoles : state . snapshots . userRoles ,
197
+ userGroups : state . user . userGroups ,
149
198
} ;
150
199
}
151
200
0 commit comments