forked from MapComplete/MapComplete
		
	
		
			
	
	
		
			89 lines
		
	
	
	
		
			2.8 KiB
		
	
	
	
		
			Svelte
		
	
	
	
	
	
		
		
			
		
	
	
			89 lines
		
	
	
	
		
			2.8 KiB
		
	
	
	
		
			Svelte
		
	
	
	
	
	
| 
								 | 
							
								<script lang="ts">
							 | 
						||
| 
								 | 
							
								  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 SubtleButton from "../../Base/SubtleButton.svelte";
							 | 
						||
| 
								 | 
							
								  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";
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  /**
							 | 
						||
| 
								 | 
							
								   * 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>
							 | 
						||
| 
								 | 
							
								  }[] = [];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  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) {
							 | 
						||
| 
								 | 
							
								        // ...and we cannot enable the layer control -> we skip, as these presets can never be shown anyway
							 | 
						||
| 
								 | 
							
								        continue;
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      if (layer.name === undefined) {
							 | 
						||
| 
								 | 
							
								        // this layer can never be toggled on in any case, so we skip the presets
							 | 
						||
| 
								 | 
							
								        continue;
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    for (const preset of layer.presets) {
							 | 
						||
| 
								 | 
							
								      const tags = TagUtils.KVtoProperties(preset.tags ?? []);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      const icon: string =
							 | 
						||
| 
								 | 
							
								        layer.mapRendering[0]
							 | 
						||
| 
								 | 
							
								          .RenderIcon(new ImmutableStore<any>(tags), false)
							 | 
						||
| 
								 | 
							
								          .html.SetClass("w-12 h-12 block relative")
							 | 
						||
| 
								 | 
							
								          .ConstructElement().innerHTML;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      const description = preset.description?.FirstSentence();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								      const simplified = {
							 | 
						||
| 
								 | 
							
								        preset,
							 | 
						||
| 
								 | 
							
								        layer,
							 | 
						||
| 
								 | 
							
								        icon,
							 | 
						||
| 
								 | 
							
								        description,
							 | 
						||
| 
								 | 
							
								        tags,
							 | 
						||
| 
								 | 
							
								        text: Translations.t.general.add.addNew.Subs({ category: preset.title }, preset.title["context"])
							 | 
						||
| 
								 | 
							
								      };
							 | 
						||
| 
								 | 
							
								      presets.push(simplified);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  const dispatch = createEventDispatcher<{ select: {preset: PresetConfig, layer: LayerConfig, icon: string, tags: Record<string, string>} }>();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								</script>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<div>
							 | 
						||
| 
								 | 
							
								  <Tr t={Translations.t.general.add.intro} />
							 | 
						||
| 
								 | 
							
								  {#each presets as preset}
							 | 
						||
| 
								 | 
							
								    <SubtleButton on:click={() => dispatch("select", preset)}>
							 | 
						||
| 
								 | 
							
								      <FromHtml slot="image" src={preset.icon}></FromHtml>
							 | 
						||
| 
								 | 
							
								      <div slot="message">
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        <b>
							 | 
						||
| 
								 | 
							
								          <Tr t={preset.text} />
							 | 
						||
| 
								 | 
							
								        </b>
							 | 
						||
| 
								 | 
							
								        {#if preset.description}
							 | 
						||
| 
								 | 
							
								          <Tr t={preset.description}/>
							 | 
						||
| 
								 | 
							
								        {/if}
							 | 
						||
| 
								 | 
							
								      </div>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    </SubtleButton>
							 | 
						||
| 
								 | 
							
								  {/each}
							 | 
						||
| 
								 | 
							
								</div>
							 |