aboutsummaryrefslogtreecommitdiff
path: root/modern/src/form/LinkField.js
diff options
context:
space:
mode:
Diffstat (limited to 'modern/src/form/LinkField.js')
-rw-r--r--modern/src/form/LinkField.js44
1 files changed, 24 insertions, 20 deletions
diff --git a/modern/src/form/LinkField.js b/modern/src/form/LinkField.js
index b228fb34..81467a1b 100644
--- a/modern/src/form/LinkField.js
+++ b/modern/src/form/LinkField.js
@@ -1,4 +1,6 @@
-import { FormControl, InputLabel, MenuItem, Select } from '@material-ui/core';
+import {
+ FormControl, InputLabel, MenuItem, Select,
+} from '@material-ui/core';
import React, { useState } from 'react';
import { useEffectAsync } from '../reactHelper';
@@ -11,8 +13,8 @@ const LinkField = ({
baseId,
keyBase,
keyLink,
- keyGetter = item => item.id,
- titleGetter = item => item.name,
+ keyGetter = (item) => item.id,
+ titleGetter = (item) => item.name,
}) => {
const [items, setItems] = useState();
const [linked, setLinked] = useState();
@@ -28,34 +30,36 @@ const LinkField = ({
const response = await fetch(endpointLinked);
if (response.ok) {
const data = await response.json();
- setLinked(data.map(it => it.id));
+ setLinked(data.map((it) => it.id));
}
}, []);
- const createBody = linkId => {
+ const createBody = (linkId) => {
const body = {};
body[keyBase] = baseId;
body[keyLink] = linkId;
return body;
- }
+ };
- const onChange = async event => {
+ const onChange = async (event) => {
const oldValue = linked;
const newValue = event.target.value;
- for (const added of newValue.filter(it => !oldValue.includes(it))) {
- await fetch('/api/permissions', {
+ const results = [];
+ newValue.filter((it) => !oldValue.includes(it)).forEach((added) => {
+ results.push(fetch('/api/permissions', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(createBody(added)),
- });
- }
- for (const removed of oldValue.filter(it => !newValue.includes(it))) {
- await fetch('/api/permissions', {
+ }));
+ });
+ oldValue.filter((it) => !newValue.includes(it)).forEach((removed) => {
+ results.push(fetch('/api/permissions', {
method: 'DELETE',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(createBody(removed)),
- });
- }
+ }));
+ });
+ await Promise.all(results);
setLinked(newValue);
};
@@ -66,16 +70,16 @@ const LinkField = ({
<Select
multiple
value={linked}
- onChange={onChange}>
- {items.map(item => (
+ onChange={onChange}
+ >
+ {items.map((item) => (
<MenuItem key={keyGetter(item)} value={keyGetter(item)}>{titleGetter(item)}</MenuItem>
))}
</Select>
</FormControl>
);
- } else {
- return null;
}
-}
+ return null;
+};
export default LinkField;