From d0903de8120f2a98619a2be7343cebdd43c0d5b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Tom=C3=A1=C5=A1=20Ml=C3=A1dek?= Date: Mon, 23 Oct 2023 12:28:12 +0200 Subject: [PATCH] feat(webui): proper set operations --- webui/src/components/CombineColumn.svelte | 36 ++++++++++++++++++++--- 1 file changed, 32 insertions(+), 4 deletions(-) diff --git a/webui/src/components/CombineColumn.svelte b/webui/src/components/CombineColumn.svelte index bc635c6..1b2bb5e 100644 --- a/webui/src/components/CombineColumn.svelte +++ b/webui/src/components/CombineColumn.svelte @@ -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);
@@ -98,6 +119,13 @@ on:remove={(ev) => (includedGroups = includedGroups.filter((e) => e !== ev.detail))} /> + (requiredGroups = [...requiredGroups, ev.detail])} + on:remove={(ev) => + (requiredGroups = requiredGroups.filter((e) => e !== ev.detail))} + />