forked from MapComplete/MapComplete
Save extra tags
This commit is contained in:
parent
a944a26e9c
commit
f49c64a201
4 changed files with 57 additions and 5 deletions
|
@ -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}
|
||||
|
|
|
@ -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}
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue