feat(webui): proper set operations
parent
5cc013a42c
commit
d0903de812
|
@ -12,15 +12,22 @@
|
|||
|
||||
export let spec: string;
|
||||
|
||||
const individualSpecs = spec.split(/(?=[+-])/);
|
||||
const individualSpecs = spec.split(/(?=[+=-])/);
|
||||
let includedGroups = individualSpecs
|
||||
.filter((s) => s.startsWith("+"))
|
||||
.map((s) => s.slice(1));
|
||||
let requiredGroups = individualSpecs
|
||||
.filter((s) => s.startsWith("="))
|
||||
.map((s) => s.slice(1));
|
||||
let excludedGroups = individualSpecs
|
||||
.filter((s) => s.startsWith("-"))
|
||||
.map((s) => s.slice(1));
|
||||
|
||||
$: if (includedGroups.length == 0 && excludedGroups.length == 0) {
|
||||
$: if (
|
||||
includedGroups.length === 0 &&
|
||||
requiredGroups.length === 0 &&
|
||||
excludedGroups.length === 0
|
||||
) {
|
||||
dispatch("close");
|
||||
}
|
||||
|
||||
|
@ -56,6 +63,7 @@
|
|||
let resultEntities = [];
|
||||
async function updateResultEntities(
|
||||
includedGroups: string[],
|
||||
requiredGroups: string[],
|
||||
excludedGroups: string[],
|
||||
) {
|
||||
const included = includedGroups.length
|
||||
|
@ -69,6 +77,17 @@
|
|||
)
|
||||
).objects
|
||||
: [];
|
||||
const required = requiredGroups.length
|
||||
? (
|
||||
await api.query(
|
||||
new Query().matches(
|
||||
undefined,
|
||||
ATTR_IN,
|
||||
requiredGroups.map((g) => `@${g}`),
|
||||
),
|
||||
)
|
||||
).objects
|
||||
: [];
|
||||
const excluded = excludedGroups.length
|
||||
? (
|
||||
await api.query(
|
||||
|
@ -80,9 +99,11 @@
|
|||
)
|
||||
).objects
|
||||
: [];
|
||||
resultEntities = Object.keys(included).filter((e) => !(e in excluded));
|
||||
resultEntities = Object.keys(included)
|
||||
.filter((e) => !requiredGroups.length || Object.keys(required).includes(e))
|
||||
.filter((e) => !Object.keys(excluded).includes(e));
|
||||
}
|
||||
$: updateResultEntities(includedGroups, excludedGroups);
|
||||
$: updateResultEntities(includedGroups, requiredGroups, excludedGroups);
|
||||
</script>
|
||||
|
||||
<div class="view" data-address-multi={resultEntities}>
|
||||
|
@ -98,6 +119,13 @@
|
|||
on:remove={(ev) =>
|
||||
(includedGroups = includedGroups.filter((e) => e !== ev.detail))}
|
||||
/>
|
||||
<EntitySetEditor
|
||||
entities={requiredGroups}
|
||||
header={$i18n.t("Require")}
|
||||
on:add={(ev) => (requiredGroups = [...requiredGroups, ev.detail])}
|
||||
on:remove={(ev) =>
|
||||
(requiredGroups = requiredGroups.filter((e) => e !== ev.detail))}
|
||||
/>
|
||||
<EntitySetEditor
|
||||
entities={excludedGroups}
|
||||
header={$i18n.t("Exclude")}
|
||||
|
|
Loading…
Reference in New Issue