Save extra tags

This commit is contained in:
Robin van der Linde 2024-04-25 21:00:14 +02:00
parent a944a26e9c
commit f49c64a201
Signed by untrusted user: Robin-van-der-Linde
GPG key ID: 53956B3252478F0D
4 changed files with 57 additions and 5 deletions

View file

@ -13,14 +13,17 @@
* All props for this input helper
*/
export let value: UIEventSource<string> = new UIEventSource<string>(undefined)
// Since we're getting extra tags aside from the standard we need to export them
export let extraTags: UIEventSource<Record<string, string>>
export let feature: Feature
export let tags: UIEventSource<Record<string, string>>
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<string, string> 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<string, string>)
extraTags.setData(tags)
}
</script>
<div>
@ -104,7 +127,12 @@
<div
class="m-1 h-fit rounded-full border border-black p-4 text-center"
on:click={() => {
value.setData(item.tags[tag])
select(item)
}}
on:keydown={(e) => {
if (e.key === "Enter") {
select(item)
}
}}
>
{item.displayName}

View file

@ -27,9 +27,9 @@
export let feature: Feature
export let args: (string | number | boolean)[] = undefined
export let state: SpecialVisualizationState
export let tags: UIEventSource<Record<string, string>>
export let helperArgs: (string | number | boolean)[]
export let key: string
export let extraTags: UIEventSource<Record<string, string>>
let properties = { feature, args: args ?? [] }
</script>
@ -55,5 +55,5 @@
{:else if type === "wikidata"}
<ToSvelte construct={() => InputHelpers.constructWikidataHelper(value, properties)} />
{:else if type === "nsi"}
<NameSuggestionIndexInput {value} {feature} {tags} {helperArgs} {key} />
<NameSuggestionIndexInput {value} {feature} {helperArgs} {key} {extraTags} />
{/if}

View file

@ -15,6 +15,7 @@
export let unvalidatedText: UIEventSource<string> = new UIEventSource<string>(value.data)
export let config: TagRenderingConfig
export let tags: UIEventSource<Record<string, string>>
export let extraTags: UIEventSource<Record<string, string>>
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
/>
</div>

View file

@ -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<Record<string, string>>
@ -38,6 +39,7 @@
export let state: SpecialVisualizationState
export let layer: LayerConfig | undefined
export let selectedTags: UploadableTag = undefined
export let extraTags: UIEventSource<Record<string, string>> = 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}