From f49c64a2019e5d23fb50892ba8bb09495f33b6c3 Mon Sep 17 00:00:00 2001 From: Robin van der Linde Date: Thu, 25 Apr 2024 21:00:14 +0200 Subject: [PATCH] Save extra tags --- .../Helpers/NameSuggestionIndexInput.svelte | 32 +++++++++++++++++-- src/UI/InputElement/InputHelper.svelte | 4 +-- .../Popup/TagRendering/FreeformInput.svelte | 3 +- .../TagRendering/TagRenderingQuestion.svelte | 23 +++++++++++++ 4 files changed, 57 insertions(+), 5 deletions(-) diff --git a/src/UI/InputElement/Helpers/NameSuggestionIndexInput.svelte b/src/UI/InputElement/Helpers/NameSuggestionIndexInput.svelte index 6a4957cbaa..3549f2e323 100644 --- a/src/UI/InputElement/Helpers/NameSuggestionIndexInput.svelte +++ b/src/UI/InputElement/Helpers/NameSuggestionIndexInput.svelte @@ -13,14 +13,17 @@ * All props for this input helper */ export let value: UIEventSource = new UIEventSource(undefined) + // Since we're getting extra tags aside from the standard we need to export them + export let extraTags: UIEventSource> export let feature: Feature - export let tags: UIEventSource> export let helperArgs: (string | number | boolean)[] export let key: string let maintag = helperArgs[0].toString() let tag = key + let selectedItem: NSIItem + const path = `${tag}s/${maintag.split("=")[0]}/${maintag.split("=")[1]}` // Check if the path exists in the NSI file @@ -64,6 +67,10 @@ /** * Some interfaces for the NSI files */ + + /** + * Main name suggestion index file + */ interface NSIFile { _meta: { version: string @@ -95,6 +102,22 @@ } fromTemplate?: boolean } + + /** + * Function called when an item is selected + */ + function select(item: NSIItem) { + value.setData(item.tags[tag]) + selectedItem = item + // Tranform the object into record and remove the tag we're using, as well as the maintag + const tags = Object.entries(item.tags).reduce((acc, [key, value]) => { + if (key !== tag && key !== maintag.split("=")[0]) { + acc[key] = value + } + return acc + }, {} as Record) + extraTags.setData(tags) + }
@@ -104,7 +127,12 @@
{ - value.setData(item.tags[tag]) + select(item) + }} + on:keydown={(e) => { + if (e.key === "Enter") { + select(item) + } }} > {item.displayName} diff --git a/src/UI/InputElement/InputHelper.svelte b/src/UI/InputElement/InputHelper.svelte index 581b38815b..7781476b94 100644 --- a/src/UI/InputElement/InputHelper.svelte +++ b/src/UI/InputElement/InputHelper.svelte @@ -27,9 +27,9 @@ export let feature: Feature export let args: (string | number | boolean)[] = undefined export let state: SpecialVisualizationState - export let tags: UIEventSource> export let helperArgs: (string | number | boolean)[] export let key: string + export let extraTags: UIEventSource> let properties = { feature, args: args ?? [] } @@ -55,5 +55,5 @@ {:else if type === "wikidata"} InputHelpers.constructWikidataHelper(value, properties)} /> {:else if type === "nsi"} - + {/if} diff --git a/src/UI/Popup/TagRendering/FreeformInput.svelte b/src/UI/Popup/TagRendering/FreeformInput.svelte index aca885e436..829c4b5e2f 100644 --- a/src/UI/Popup/TagRendering/FreeformInput.svelte +++ b/src/UI/Popup/TagRendering/FreeformInput.svelte @@ -15,6 +15,7 @@ export let unvalidatedText: UIEventSource = new UIEventSource(value.data) export let config: TagRenderingConfig export let tags: UIEventSource> + export let extraTags: UIEventSource> export let feature: Feature = undefined export let state: SpecialVisualizationState @@ -77,9 +78,9 @@ type={config.freeform.type} {value} {state} - {tags} {helperArgs} {key} + {extraTags} on:submit />
diff --git a/src/UI/Popup/TagRendering/TagRenderingQuestion.svelte b/src/UI/Popup/TagRendering/TagRenderingQuestion.svelte index 5ad9e1b983..fdcade5d7f 100644 --- a/src/UI/Popup/TagRendering/TagRenderingQuestion.svelte +++ b/src/UI/Popup/TagRendering/TagRenderingQuestion.svelte @@ -31,6 +31,7 @@ import { TrashIcon } from "@rgossiaux/svelte-heroicons/solid" import { Tag } from "../../../Logic/Tags/Tag" import { get, writable } from "svelte/store" + import { And } from "../../../Logic/Tags/And" export let config: TagRenderingConfig export let tags: UIEventSource> @@ -38,6 +39,7 @@ export let state: SpecialVisualizationState export let layer: LayerConfig | undefined export let selectedTags: UploadableTag = undefined + export let extraTags: UIEventSource> = new UIEventSource({}) export let allowDeleteOfFreeform: boolean = false @@ -179,9 +181,27 @@ } function onSave(_ = undefined) { + console.log("Extra tags to save", extraTags.data) if (selectedTags === undefined) { return } + + if (extraTags.data) { + // Map the extraTags into an array of Tag objects + const extraTagsArray = Object.entries(extraTags.data).map(([k, v]) => new Tag(k, v)) + + // Check the type of selectedTags + if (selectedTags instanceof Tag) { + // Re-define selectedTags as an And + selectedTags = new And([selectedTags, ...extraTagsArray]) + } else if (selectedTags instanceof And) { + // Add the extraTags to the existing And + selectedTags = new And([...selectedTags.and, ...extraTagsArray]) + } else { + console.error("selectedTags is not of type Tag or And") + } + } + if (layer === undefined || (layer?.source === null && layer.id !== "favourite")) { /** * This is a special, priviliged layer. @@ -287,6 +307,7 @@ {feedback} {unit} {state} + {extraTags} feature={selectedElement} value={freeformInput} unvalidatedText={freeformInputUnvalidated} @@ -330,6 +351,7 @@ {feedback} {unit} {state} + {extraTags} feature={selectedElement} value={freeformInput} unvalidatedText={freeformInputUnvalidated} @@ -374,6 +396,7 @@ {feedback} {unit} {state} + {extraTags} feature={selectedElement} value={freeformInput} unvalidatedText={freeformInputUnvalidated}