2023-04-06 01:33:08 +02:00
< script lang = "ts" >
2023-06-14 20:39:36 +02:00
import LayoutConfig from "../../../Models/ThemeConfig/LayoutConfig"
import { createEventDispatcher } from "svelte"
import type PresetConfig from "../../../Models/ThemeConfig/PresetConfig"
import Tr from "../../Base/Tr.svelte"
import Translations from "../../i18n/Translations.js"
import { Translation } from "../../i18n/Translation"
import type { SpecialVisualizationState } from "../../SpecialVisualization"
import { ImmutableStore } from "../../../Logic/UIEventSource"
import { TagUtils } from "../../../Logic/Tags/TagUtils"
import LayerConfig from "../../../Models/ThemeConfig/LayerConfig"
import FromHtml from "../../Base/FromHtml.svelte"
import NextButton from "../../Base/NextButton.svelte"
2023-04-06 01:33:08 +02:00
2023-06-14 20:39:36 +02:00
/**
* This component lists all the presets and allows the user to select one
*/
export let state: SpecialVisualizationState
let layout: LayoutConfig = state.layout
let presets: {
preset: PresetConfig
layer: LayerConfig
text: Translation
icon: string
tags: Record< string , string >
}[] = []
2023-04-06 01:33:08 +02:00
2023-06-14 20:39:36 +02:00
for (const layer of layout.layers) {
const flayer = state.layerState.filteredLayers.get(layer.id)
if (flayer.isDisplayed.data === false) {
// The layer is not displayed...
if (!state.featureSwitches.featureSwitchFilter.data) {
2023-10-16 12:54:41 +02:00
console.log("Not showing presets for layer", flayer.layerDef.id, "as not displayed and featureSwitchFilter.data is set",state.featureSwitches.featureSwitchFilter.data)
2023-06-14 20:39:36 +02:00
// ...and we cannot enable the layer control -> we skip, as these presets can never be shown anyway
continue
}
2023-04-06 01:33:08 +02:00
2023-06-14 20:39:36 +02:00
if (layer.name === undefined) {
// this layer can never be toggled on in any case, so we skip the presets
continue
}
}
2023-04-06 01:33:08 +02:00
2023-06-14 20:39:36 +02:00
for (const preset of layer.presets) {
const tags = TagUtils.KVtoProperties(preset.tags ?? [])
2023-04-06 01:33:08 +02:00
2023-06-14 20:39:36 +02:00
const icon: string = layer.mapRendering[0]
.RenderIcon(new ImmutableStore< any > (tags), false)
.html.SetClass("w-12 h-12 block relative")
.ConstructElement().innerHTML
2023-04-06 01:33:08 +02:00
2023-06-14 20:39:36 +02:00
const description = preset.description?.FirstSentence()
2023-04-06 01:33:08 +02:00
2023-06-14 20:39:36 +02:00
const simplified = {
preset,
layer,
icon,
description,
tags,
text: Translations.t.general.add.addNew.Subs(
{ category : preset.title } ,
preset.title["context"]
),
}
presets.push(simplified)
2023-05-14 03:24:13 +02:00
}
2023-06-14 20:39:36 +02:00
}
2023-04-06 01:33:08 +02:00
2023-06-14 20:39:36 +02:00
const dispatch = createEventDispatcher< {
select: { preset : PresetConfig ; layer : LayerConfig ; icon : string ; tags : Record < string , string > }
}>()
2023-04-06 01:33:08 +02:00
< / script >
2023-06-14 20:44:01 +02:00
< div class = "flex w-full flex-col" >
2023-06-14 20:39:36 +02:00
< h2 class = "mr-12" >
<!-- The title gets a big right margin to give place to the 'close' - button, see https://github.com/pietervdvn/MapComplete/issues/1445 -->
< Tr t = { Translations . t . general . add . intro } / >
< / h2 >
2023-04-06 01:33:08 +02:00
2023-06-14 20:39:36 +02:00
{ #each presets as preset }
< NextButton on:click = {() => dispatch ( "select" , preset )} >
< FromHtml slot = "image" src = { preset . icon } / >
< div class = "flex flex-col" >
< b class = "w-fit" >
< Tr t = { preset . text } / >
< / b >
{ #if preset . description }
< Tr t = { preset . description } cls="font-normal" />
{ /if }
< / div >
< / NextButton >
{ /each }
2023-04-06 01:33:08 +02:00
< / div >