Skip to content

Commit ec3e5a6

Browse files
committed
Access control for fields and fieldgroups
1 parent c9dd68a commit ec3e5a6

23 files changed

+726
-29
lines changed
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
import Dialog from '@material-ui/core/Dialog';
2+
import DialogContent from '@material-ui/core/DialogContent';
3+
import DialogTitle from '@material-ui/core/DialogTitle';
4+
import { compose } from 'redux';
5+
6+
import * as formActions from '../../formactions/fieldgroup';
7+
import withUI from '../../hoc/withUI';
8+
import WizardForm from '../ui/WizardForm';
9+
10+
import FieldGroupAccessControlForm from './FieldGroupAccessControlForm';
11+
12+
function FieldGroupAccessControlDialog({
13+
groupName,
14+
open,
15+
onClose,
16+
onSuccess,
17+
onFail,
18+
openSnackBar,
19+
}) {
20+
const onSubmitSuccess = (response, dispatch, props) => {
21+
const { data: metadataFieldAccessControlDocument } = response;
22+
const { id: accessId } = metadataFieldAccessControlDocument;
23+
const messageContent = `Metadata Field Group Access Control ${accessId} Created`;
24+
openSnackBar({ messageContent });
25+
if (onSuccess) onSuccess(response, dispatch, props);
26+
onClose();
27+
};
28+
const onSubmitFail = (error) => {
29+
const messageContent = 'Error Creating Metadata Field Group Access Control';
30+
openSnackBar({ messageContent, messageColor: 'secondary' });
31+
if (onFail) onFail(error);
32+
};
33+
return (
34+
<Dialog open={open} onClose={onClose} fullWidth maxWidth={false}>
35+
<DialogTitle>New Metadata Field Access Control</DialogTitle>
36+
<DialogContent>
37+
<WizardForm
38+
groupName={groupName}
39+
FormComponent={FieldGroupAccessControlForm}
40+
documentName="metadataFieldAccessControlDocument"
41+
onSubmit={formActions.onCreateMetadataFieldAccess}
42+
onSubmitSuccess={onSubmitSuccess}
43+
onSubmitFail={onSubmitFail}
44+
onCancel={onClose}
45+
/>
46+
</DialogContent>
47+
</Dialog>
48+
);
49+
}
50+
51+
export default compose(withUI)(FieldGroupAccessControlDialog);
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
import FormControl from '@material-ui/core/FormControl';
2+
import InputLabel from '@material-ui/core/InputLabel';
3+
import MenuItem from '@material-ui/core/MenuItem';
4+
import Typography from '@material-ui/core/Typography';
5+
import { reduxForm } from 'redux-form';
6+
7+
import { required } from '../../utils/FieldValidation';
8+
import { TextField, Select } from '../form';
9+
import { loadGroupOptions } from '../group/GroupSelect';
10+
import Field from '../ui/Field';
11+
import FormSection from '../ui/FormSection';
12+
import { StatefulAsyncSelect } from '../ui/Select';
13+
import { loadUserOptions } from '../user/UserSelect';
14+
15+
function MetadataFieldAccessControlDocument() {
16+
return (
17+
<>
18+
<Field
19+
name="user"
20+
label="User"
21+
component={StatefulAsyncSelect}
22+
loadOptions={loadUserOptions}
23+
cacheOptions
24+
isClearable
25+
fullWidth
26+
/>
27+
<Field
28+
name="group"
29+
label="Group"
30+
component={StatefulAsyncSelect}
31+
loadOptions={loadGroupOptions}
32+
cacheOptions
33+
isClearable
34+
creatable
35+
/>
36+
<FormControl fullWidth>
37+
<InputLabel htmlFor="permission">Permission</InputLabel>
38+
<Field name="permission" component={Select}>
39+
<MenuItem value="NONE">None</MenuItem>
40+
<MenuItem value="READ">Read</MenuItem>
41+
<MenuItem value="WRITE">Write</MenuItem>
42+
<MenuItem value="DELETE">Delete</MenuItem>
43+
</Field>
44+
</FormControl>
45+
</>
46+
);
47+
}
48+
49+
function FieldGroupAccessControlForm({ groupName, error, handleSubmit }) {
50+
return (
51+
<form onSubmit={handleSubmit}>
52+
{error && <Typography color="error">{error}</Typography>}
53+
{!groupName && (
54+
<Field name="groupName" component={TextField} validate={[required]} fullWidth />
55+
)}
56+
57+
<FormSection
58+
name="metadataFieldAccessControlDocument"
59+
component={MetadataFieldAccessControlDocument}
60+
/>
61+
<button type="submit" hidden />
62+
</form>
63+
);
64+
}
65+
66+
export default reduxForm()(FieldGroupAccessControlForm);
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
import Button from '@material-ui/core/Button';
2+
import Dialog from '@material-ui/core/Dialog';
3+
import DialogActions from '@material-ui/core/DialogActions';
4+
import DialogTitle from '@material-ui/core/DialogTitle';
5+
import Divider from '@material-ui/core/Divider';
6+
import { compose } from 'redux';
7+
8+
import { fieldgroup as MetadataFieldGroupApi } from '@vidispine/vdt-api';
9+
10+
import withUI from '../../hoc/withUI';
11+
12+
export const REMOVE_FIELDGROUP_ACCESS_DIALOG = 'REMOVE_FIELDGROUP_ACCESS_DIALOG';
13+
14+
function FieldGroupAccessControlRemove({
15+
open,
16+
onClose,
17+
onSuccess,
18+
onFail,
19+
openSnackBar,
20+
groupName,
21+
accessId,
22+
}) {
23+
const onRemove = async () => {
24+
try {
25+
await MetadataFieldGroupApi.removeFieldGroupAccess({ groupName, accessId });
26+
const messageContent = `Metadata Field Group Access ${accessId} Removed`;
27+
openSnackBar({ messageContent });
28+
onClose();
29+
if (onSuccess) onSuccess();
30+
} catch (error) {
31+
const messageContent = 'Error Removing Metadata Field Group Access';
32+
if (onFail) onFail(error);
33+
openSnackBar({ messageContent, messageColor: 'secondary' });
34+
}
35+
};
36+
return (
37+
<Dialog open={open} onClose={onClose} fullWidth maxWidth={false}>
38+
<DialogTitle>{`Delete Access ID ${accessId} for field ${groupName}`}</DialogTitle>
39+
<Divider />
40+
<DialogActions>
41+
<Button size="small" onClick={onClose}>
42+
Close
43+
</Button>
44+
<Button size="small" color="secondary" onClick={onRemove}>
45+
Delete
46+
</Button>
47+
</DialogActions>
48+
</Dialog>
49+
);
50+
}
51+
52+
export default compose(withUI)(FieldGroupAccessControlRemove);

src/components/fieldgroup/FieldGroupParamsForm.jsx

Lines changed: 18 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1+
import FormControl from '@material-ui/core/FormControl';
12
import FormControlLabel from '@material-ui/core/FormControlLabel';
3+
import FormHelperText from '@material-ui/core/FormHelperText';
24
import Typography from '@material-ui/core/Typography';
35
import { reduxForm } from 'redux-form';
46

@@ -17,28 +19,22 @@ const queryParams = () => (
1719
label="data"
1820
helperText="Comma-separated list of any additional data to include. accepts wildcard characters."
1921
/>
20-
<FormControlLabel
21-
control={
22-
<Field
23-
name="includeValues"
24-
component={BoolCheckbox}
25-
fullWidth
26-
label="includeValues"
27-
helperText="Return the value enumeration for each field"
28-
/>
29-
}
30-
/>
31-
<FormControlLabel
32-
control={
33-
<Field
34-
name="traverse"
35-
component={BoolCheckbox}
36-
fullWidth
37-
label="traverse"
38-
helperText="Traverse any sub-groups in order to retrieve the entire hierarchy."
39-
/>
40-
}
41-
/>
22+
<FormControl fullWidth>
23+
<FormControlLabel
24+
control={<Field name="includeValues" component={BoolCheckbox} />}
25+
label="Include Values"
26+
/>
27+
<FormHelperText>Return the value enumeration for each field</FormHelperText>
28+
</FormControl>
29+
<FormControl fullWidth>
30+
<FormControlLabel
31+
control={<Field name="traverse" component={BoolCheckbox} />}
32+
label="Traverse"
33+
/>
34+
<FormHelperText>
35+
Traverse any sub-groups in order to retrieve the entire hierarchy.
36+
</FormHelperText>
37+
</FormControl>
4238
</>
4339
);
4440

src/components/fieldgroup/FieldGroupPermissionRow.jsx

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@ export default function FieldGroupPermissionRow({ metadataFieldGroupPermission }
99
<TableCell>{metadataFieldGroupPermission?.fieldGroup}</TableCell>
1010
<TableCell>{metadataFieldGroupPermission?.field}</TableCell>
1111
<TableCell>{metadataFieldGroupPermission?.username}</TableCell>
12-
<TableCell />
1312
</TableRow>
1413
);
1514
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
import Dialog from '@material-ui/core/Dialog';
2+
import DialogContent from '@material-ui/core/DialogContent';
3+
import DialogTitle from '@material-ui/core/DialogTitle';
4+
import { compose } from 'redux';
5+
6+
import * as formActions from '../../formactions/metadatafield';
7+
import withUI from '../../hoc/withUI';
8+
import WizardForm from '../ui/WizardForm';
9+
10+
import MetadataFieldAccessControlForm from './MetadataFieldAccessControlForm';
11+
12+
function MetadataFieldAccessControlDialog({
13+
fieldName,
14+
open,
15+
onClose,
16+
onSuccess,
17+
onFail,
18+
openSnackBar,
19+
}) {
20+
const onSubmitSuccess = (response, dispatch, props) => {
21+
const { data: metadataFieldAccessControlDocument } = response;
22+
const { id: accessId } = metadataFieldAccessControlDocument;
23+
const messageContent = `Metadata Field Access Control ${accessId} Created`;
24+
openSnackBar({ messageContent });
25+
if (onSuccess) onSuccess(response, dispatch, props);
26+
onClose();
27+
};
28+
const onSubmitFail = (error) => {
29+
const messageContent = 'Error Creating Metadata Field Access Control';
30+
openSnackBar({ messageContent, messageColor: 'secondary' });
31+
if (onFail) onFail(error);
32+
};
33+
return (
34+
<Dialog open={open} onClose={onClose} fullWidth maxWidth={false}>
35+
<DialogTitle>New Metadata Field Access Control</DialogTitle>
36+
<DialogContent>
37+
<WizardForm
38+
fieldName={fieldName}
39+
FormComponent={MetadataFieldAccessControlForm}
40+
documentName="metadataFieldAccessControlDocument"
41+
onSubmit={formActions.onCreateMetadataFieldAccess}
42+
onSubmitSuccess={onSubmitSuccess}
43+
onSubmitFail={onSubmitFail}
44+
onCancel={onClose}
45+
/>
46+
</DialogContent>
47+
</Dialog>
48+
);
49+
}
50+
51+
export default compose(withUI)(MetadataFieldAccessControlDialog);
Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
import FormControl from '@material-ui/core/FormControl';
2+
import InputLabel from '@material-ui/core/InputLabel';
3+
import MenuItem from '@material-ui/core/MenuItem';
4+
import Typography from '@material-ui/core/Typography';
5+
import { reduxForm } from 'redux-form';
6+
7+
import { required } from '../../utils/FieldValidation';
8+
import { TextField, Select } from '../form';
9+
import { loadGroupOptions } from '../group/GroupSelect';
10+
import Field from '../ui/Field';
11+
import FormSection from '../ui/FormSection';
12+
import { StatefulAsyncSelect } from '../ui/Select';
13+
import { loadUserOptions } from '../user/UserSelect';
14+
15+
function MetadataFieldAccessControlDocument() {
16+
return (
17+
<>
18+
<Field
19+
name="user"
20+
label="User"
21+
component={StatefulAsyncSelect}
22+
loadOptions={loadUserOptions}
23+
cacheOptions
24+
isClearable
25+
fullWidth
26+
/>
27+
<Field
28+
name="group"
29+
label="Group"
30+
component={StatefulAsyncSelect}
31+
loadOptions={loadGroupOptions}
32+
cacheOptions
33+
isClearable
34+
creatable
35+
/>
36+
<FormControl fullWidth>
37+
<InputLabel htmlFor="permission">Permission</InputLabel>
38+
<Field name="permission" component={Select}>
39+
<MenuItem value="NONE">None</MenuItem>
40+
<MenuItem value="READ">Read</MenuItem>
41+
<MenuItem value="WRITE">Write</MenuItem>
42+
<MenuItem value="DELETE">Delete</MenuItem>
43+
</Field>
44+
</FormControl>
45+
</>
46+
);
47+
}
48+
49+
function MetadataFieldAccessControlForm({ fieldName, error, handleSubmit }) {
50+
return (
51+
<form onSubmit={handleSubmit}>
52+
{error && <Typography color="error">{error}</Typography>}
53+
{!fieldName && (
54+
<Field name="fieldName" component={TextField} validate={[required]} fullWidth />
55+
)}
56+
57+
<FormSection
58+
name="metadataFieldAccessControlDocument"
59+
component={MetadataFieldAccessControlDocument}
60+
/>
61+
<button type="submit" hidden />
62+
</form>
63+
);
64+
}
65+
66+
export default reduxForm()(MetadataFieldAccessControlForm);
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
import Card from '@material-ui/core/Card';
2+
import CardContent from '@material-ui/core/CardContent';
3+
4+
import MetadataFieldAccessControlTable from './MetadataFieldAccessControlTable';
5+
6+
function MetadataFieldAccessControlListCard({
7+
metadataFieldAccessControlListDocument = {},
8+
onOpenRemove,
9+
}) {
10+
const { access: metadataFieldAccessControlList = [] } = metadataFieldAccessControlListDocument;
11+
return (
12+
<Card>
13+
<CardContent>
14+
<MetadataFieldAccessControlTable
15+
metadataFieldAccessControlList={metadataFieldAccessControlList}
16+
onOpenRemove={onOpenRemove}
17+
/>
18+
</CardContent>
19+
</Card>
20+
);
21+
}
22+
23+
export default MetadataFieldAccessControlListCard;

0 commit comments

Comments
 (0)