-
Notifications
You must be signed in to change notification settings - Fork 12
/
Copy pathpermission-form.js
131 lines (114 loc) · 4.39 KB
/
permission-form.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
import React, { useEffect, useState } from "react";
import { CheckboxInput, TextInput, SelectInput } from "../../forms/inputs";
import { versionAuthFields } from "./auth-fields";
const PermissionForm = ({objectFields, tokenChoices, objecttypeChoices, modeChoices, formData}) => {
const {values, errors} = formData;
const [mode, setMode] = useState(values["mode"]);
const [useFields, setUseFields] = useState(values["use_fields"]);
const [objectType, setObjectType] = useState(values["object_type"]);
if (!values["fields"]) {
values["fields"] = "{}"
}
const [fields, setFields] = useState( JSON.parse(values["fields"]) || {} )
const [dataFieldChoices, setDataFieldChoices] = useState({});
const fetchObjecttypeVersions = (objecttype_id) => {
fetch(`/admin/core/objecttype/${objecttype_id}/_versions/`, {
method: 'GET',
})
.then(response => response.json())
.then(response_data => {
if (response_data?.length > 0) {
const objecttypes = {
[objecttype_id]: response_data.reduce((acc, version) => {
const properties = Object.keys(version?.jsonSchema?.properties || {});
acc[version.version] = properties.reduce((propsAcc, prop) => {
propsAcc[prop] = `record__data__${prop}`;
return propsAcc;
}, {});
return acc;
}, {})
};
setDataFieldChoices(objecttypes);
}
})
.catch(error => {
console.error('An error occurred while fetching the Objecttype versions endpoint:', error);
});
};
useEffect(() => {
if (objectType) {
fetchObjecttypeVersions(objectType);
}
}, [objectType]);
return (
<fieldset className="module aligned">
<div className="form-row">
<SelectInput
name="token_auth"
id="id_token_auth"
label="Token auth:"
choices={tokenChoices}
initialValue={values["token_auth"]}
errors={errors["token_auth"]}
/>
</div>
<div className="form-row">
<SelectInput
name="object_type"
id="id_object_type"
label="Object type:"
choices={objecttypeChoices}
helpText="Changing the Object type will not maintain the previously selected authorization fields."
initialValue={values["object_type"]}
errors={errors["object_type"]}
onChange={(value) => {
setObjectType(value);
setFields({});
}}
/>
</div>
<div className="form-row">
<SelectInput
name="mode"
id="id_mode"
label="Mode:"
choices={modeChoices}
initialValue={mode}
errors={errors["mode"]}
onChange={(value) => {
setMode(value);
if (value === "read_and_write") {
setUseFields(false);
}
}}
/>
</div>
<div className="form-row">
<CheckboxInput
name="use_fields"
id="id_use_fields"
label="Use field-based authorization"
disabled={!mode || mode === "read_and_write" || Object.keys(dataFieldChoices || {}).length === 0}
value={useFields}
onChange={(value) => {setUseFields(value)}}
/>
</div>
<TextInput
name="fields"
id="id_fields"
hidden={true}
value={useFields ? JSON.stringify(fields) : ""}
/>
{ useFields && dataFieldChoices && objectType in dataFieldChoices ?
<div className="form-row">
<label htmlFor="id_selected_fields">Fields:</label>
<div id="id_selected_fields" className="permission-fields">
{ versionAuthFields(objectType, objectFields, dataFieldChoices, fields, setFields) }
</div>
</div>
: null
}
</fieldset>
);
};
export { PermissionForm };