Skip to content

Commit 6da29a9

Browse files
committed
feat: add auth domains to snapshot access
1 parent 5da8194 commit 6da29a9

File tree

1 file changed

+93
-44
lines changed

1 file changed

+93
-44
lines changed

src/components/snapshot/SnapshotAccess.tsx

Lines changed: 93 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,14 @@ import React from 'react';
22
import { connect } from 'react-redux';
33
import _ from 'lodash';
44
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';
610
import UserList from '../UserList';
711
import { SnapshotRoles } from '../../constants';
8-
import { getRoleMembersFromPolicies } from '../../libs/utils';
12+
import { getRoleMembersFromPolicies, useOnMount } from '../../libs/utils';
913
import {
1014
addSnapshotPolicyMember,
1115
removeSnapshotPolicyMember,
@@ -16,20 +20,24 @@ import { TdrState } from '../../reducers';
1620
import { SnapshotRequest } from '../../reducers/snapshot';
1721
import { AppDispatch } from '../../store';
1822
import AddUserAccess, { AccessPermission } from '../common/AddUserAccess';
23+
import JadeDropdown from '../dataset/data/JadeDropdown';
1924

2025
const styles = () => ({
2126
helpContainer: {
2227
padding: '30px 0 10px',
2328
},
2429
});
2530

31+
const JadeLink = styled('span')(({ theme }) => theme.mixins.jadeLink);
32+
2633
type SnapshotAccessProps = {
2734
dispatch: AppDispatch;
2835
policies: Array<PolicyModel>;
2936
snapshot: SnapshotModel;
3037
snapshotRequest: SnapshotRequest;
3138
userRoles: Array<string>;
3239
createMode?: boolean;
40+
userGroups: Array<ManagedGroupMembershipEntry>;
3341
};
3442

3543
function SnapshotAccess({
@@ -39,7 +47,14 @@ function SnapshotAccess({
3947
snapshotRequest,
4048
userRoles,
4149
createMode,
50+
userGroups,
4251
}: SnapshotAccessProps) {
52+
const [selectedAuthDomain, setSelectedAuthDomain] = React.useState<string | undefined>(undefined);
53+
54+
useOnMount(() => {
55+
dispatch(getUserGroups());
56+
});
57+
4358
const transformRoleToCreatePolicy = (role: string): string => `${_.camelCase(role)}s`;
4459

4560
const addUsers = (role: string, usersToAdd: string[]) => {
@@ -94,49 +109,82 @@ function SnapshotAccess({
94109
];
95110

96111
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>
102156
</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+
</>
140188
);
141189
}
142190

@@ -146,6 +194,7 @@ function mapStateToProps(state: TdrState) {
146194
snapshot: state.snapshots.snapshot,
147195
snapshotRequest: state.snapshots.snapshotRequest,
148196
userRoles: state.snapshots.userRoles,
197+
userGroups: state.user.userGroups,
149198
};
150199
}
151200

0 commit comments

Comments
 (0)