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
|
* All props for this input helper
|
||||||
*/
|
*/
|
||||||
export let value: UIEventSource<string> = new UIEventSource<string>(undefined)
|
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 feature: Feature
|
||||||
export let tags: UIEventSource<Record<string, string>>
|
|
||||||
export let helperArgs: (string | number | boolean)[]
|
export let helperArgs: (string | number | boolean)[]
|
||||||
export let key: string
|
export let key: string
|
||||||
|
|
||||||
let maintag = helperArgs[0].toString()
|
let maintag = helperArgs[0].toString()
|
||||||
let tag = key
|
let tag = key
|
||||||
|
|
||||||
|
let selectedItem: NSIItem
|
||||||
|
|
||||||
const path = `${tag}s/${maintag.split("=")[0]}/${maintag.split("=")[1]}`
|
const path = `${tag}s/${maintag.split("=")[0]}/${maintag.split("=")[1]}`
|
||||||
|
|
||||||
// Check if the path exists in the NSI file
|
// Check if the path exists in the NSI file
|
||||||
|
@ -64,6 +67,10 @@
|
||||||
/**
|
/**
|
||||||
* Some interfaces for the NSI files
|
* Some interfaces for the NSI files
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Main name suggestion index file
|
||||||
|
*/
|
||||||
interface NSIFile {
|
interface NSIFile {
|
||||||
_meta: {
|
_meta: {
|
||||||
version: string
|
version: string
|
||||||
|
@ -95,6 +102,22 @@
|
||||||
}
|
}
|
||||||
fromTemplate?: boolean
|
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>
|
</script>
|
||||||
|
|
||||||
<div>
|
<div>
|
||||||
|
@ -104,7 +127,12 @@
|
||||||
<div
|
<div
|
||||||
class="m-1 h-fit rounded-full border border-black p-4 text-center"
|
class="m-1 h-fit rounded-full border border-black p-4 text-center"
|
||||||
on:click={() => {
|
on:click={() => {
|
||||||
value.setData(item.tags[tag])
|
select(item)
|
||||||
|
}}
|
||||||
|
on:keydown={(e) => {
|
||||||
|
if (e.key === "Enter") {
|
||||||
|
select(item)
|
||||||
|
}
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
{item.displayName}
|
{item.displayName}
|
||||||
|
|
|
@ -27,9 +27,9 @@
|
||||||
export let feature: Feature
|
export let feature: Feature
|
||||||
export let args: (string | number | boolean)[] = undefined
|
export let args: (string | number | boolean)[] = undefined
|
||||||
export let state: SpecialVisualizationState
|
export let state: SpecialVisualizationState
|
||||||
export let tags: UIEventSource<Record<string, string>>
|
|
||||||
export let helperArgs: (string | number | boolean)[]
|
export let helperArgs: (string | number | boolean)[]
|
||||||
export let key: string
|
export let key: string
|
||||||
|
export let extraTags: UIEventSource<Record<string, string>>
|
||||||
|
|
||||||
let properties = { feature, args: args ?? [] }
|
let properties = { feature, args: args ?? [] }
|
||||||
</script>
|
</script>
|
||||||
|
@ -55,5 +55,5 @@
|
||||||
{:else if type === "wikidata"}
|
{:else if type === "wikidata"}
|
||||||
<ToSvelte construct={() => InputHelpers.constructWikidataHelper(value, properties)} />
|
<ToSvelte construct={() => InputHelpers.constructWikidataHelper(value, properties)} />
|
||||||
{:else if type === "nsi"}
|
{:else if type === "nsi"}
|
||||||
<NameSuggestionIndexInput {value} {feature} {tags} {helperArgs} {key} />
|
<NameSuggestionIndexInput {value} {feature} {helperArgs} {key} {extraTags} />
|
||||||
{/if}
|
{/if}
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
export let unvalidatedText: UIEventSource<string> = new UIEventSource<string>(value.data)
|
export let unvalidatedText: UIEventSource<string> = new UIEventSource<string>(value.data)
|
||||||
export let config: TagRenderingConfig
|
export let config: TagRenderingConfig
|
||||||
export let tags: UIEventSource<Record<string, string>>
|
export let tags: UIEventSource<Record<string, string>>
|
||||||
|
export let extraTags: UIEventSource<Record<string, string>>
|
||||||
|
|
||||||
export let feature: Feature = undefined
|
export let feature: Feature = undefined
|
||||||
export let state: SpecialVisualizationState
|
export let state: SpecialVisualizationState
|
||||||
|
@ -77,9 +78,9 @@
|
||||||
type={config.freeform.type}
|
type={config.freeform.type}
|
||||||
{value}
|
{value}
|
||||||
{state}
|
{state}
|
||||||
{tags}
|
|
||||||
{helperArgs}
|
{helperArgs}
|
||||||
{key}
|
{key}
|
||||||
|
{extraTags}
|
||||||
on:submit
|
on:submit
|
||||||
/>
|
/>
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -31,6 +31,7 @@
|
||||||
import { TrashIcon } from "@rgossiaux/svelte-heroicons/solid"
|
import { TrashIcon } from "@rgossiaux/svelte-heroicons/solid"
|
||||||
import { Tag } from "../../../Logic/Tags/Tag"
|
import { Tag } from "../../../Logic/Tags/Tag"
|
||||||
import { get, writable } from "svelte/store"
|
import { get, writable } from "svelte/store"
|
||||||
|
import { And } from "../../../Logic/Tags/And"
|
||||||
|
|
||||||
export let config: TagRenderingConfig
|
export let config: TagRenderingConfig
|
||||||
export let tags: UIEventSource<Record<string, string>>
|
export let tags: UIEventSource<Record<string, string>>
|
||||||
|
@ -38,6 +39,7 @@
|
||||||
export let state: SpecialVisualizationState
|
export let state: SpecialVisualizationState
|
||||||
export let layer: LayerConfig | undefined
|
export let layer: LayerConfig | undefined
|
||||||
export let selectedTags: UploadableTag = undefined
|
export let selectedTags: UploadableTag = undefined
|
||||||
|
export let extraTags: UIEventSource<Record<string, string>> = new UIEventSource({})
|
||||||
|
|
||||||
export let allowDeleteOfFreeform: boolean = false
|
export let allowDeleteOfFreeform: boolean = false
|
||||||
|
|
||||||
|
@ -179,9 +181,27 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
function onSave(_ = undefined) {
|
function onSave(_ = undefined) {
|
||||||
|
console.log("Extra tags to save", extraTags.data)
|
||||||
if (selectedTags === undefined) {
|
if (selectedTags === undefined) {
|
||||||
return
|
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")) {
|
if (layer === undefined || (layer?.source === null && layer.id !== "favourite")) {
|
||||||
/**
|
/**
|
||||||
* This is a special, priviliged layer.
|
* This is a special, priviliged layer.
|
||||||
|
@ -287,6 +307,7 @@
|
||||||
{feedback}
|
{feedback}
|
||||||
{unit}
|
{unit}
|
||||||
{state}
|
{state}
|
||||||
|
{extraTags}
|
||||||
feature={selectedElement}
|
feature={selectedElement}
|
||||||
value={freeformInput}
|
value={freeformInput}
|
||||||
unvalidatedText={freeformInputUnvalidated}
|
unvalidatedText={freeformInputUnvalidated}
|
||||||
|
@ -330,6 +351,7 @@
|
||||||
{feedback}
|
{feedback}
|
||||||
{unit}
|
{unit}
|
||||||
{state}
|
{state}
|
||||||
|
{extraTags}
|
||||||
feature={selectedElement}
|
feature={selectedElement}
|
||||||
value={freeformInput}
|
value={freeformInput}
|
||||||
unvalidatedText={freeformInputUnvalidated}
|
unvalidatedText={freeformInputUnvalidated}
|
||||||
|
@ -374,6 +396,7 @@
|
||||||
{feedback}
|
{feedback}
|
||||||
{unit}
|
{unit}
|
||||||
{state}
|
{state}
|
||||||
|
{extraTags}
|
||||||
feature={selectedElement}
|
feature={selectedElement}
|
||||||
value={freeformInput}
|
value={freeformInput}
|
||||||
unvalidatedText={freeformInputUnvalidated}
|
unvalidatedText={freeformInputUnvalidated}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue