upend/webui/src/components/MultiGroupEditor.svelte

75 lines
1.8 KiB
Svelte

<script lang="ts">
import api from "../lib/api";
import { ATTR_IN } from "@upnd/upend/constants";
import { i18n } from "../i18n";
import { Query, UpListing } from "@upnd/upend";
import EntitySetEditor from "./EntitySetEditor.svelte";
import { Any } from "@upnd/upend/query";
export let entities: string[];
let groups = [];
let groupListing: UpListing | undefined = undefined;
async function updateGroups() {
const currentEntities = entities.concat();
const allGroups = await api.query(
Query.matches(
currentEntities.map((e) => `@${e}`),
ATTR_IN,
Any,
),
);
const commonGroups = new Set(
allGroups.values
.filter((v) => v.t == "Address")
.map((v) => v.c)
.filter((groupAddr) => {
return Object.values(allGroups.objects).every((obj) => {
return obj.attr[ATTR_IN].some((v) => v.value.c === groupAddr);
});
}),
);
if (entities.toString() == currentEntities.toString()) {
groups = Array.from(commonGroups);
groupListing = allGroups;
}
}
$: entities && updateGroups();
async function addGroup(address: string) {
await api.putEntry(
entities.map((entity) => ({
entity,
attribute: ATTR_IN,
value: {
t: "Address",
c: address,
},
})),
);
await updateGroups();
}
async function removeGroup(address: string) {
await Promise.all(
entities.map((entity) =>
api.deleteEntry(
groupListing.objects[entity].attr[ATTR_IN].find(
(v) => v.value.c === address,
).address,
),
),
);
await updateGroups();
}
</script>
<EntitySetEditor
entities={groups}
header={$i18n.t("Common groups")}
on:add={(ev) => addGroup(ev.detail)}
on:remove={(ev) => removeGroup(ev.detail)}
/>