forked from MapComplete/MapComplete
		
	
		
			
				
	
	
		
			60 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			Svelte
		
	
	
	
	
	
			
		
		
	
	
			60 lines
		
	
	
	
		
			2.1 KiB
		
	
	
	
		
			Svelte
		
	
	
	
	
	
<script lang="ts">
 | 
						|
    import FilteredLayer from "../../Models/FilteredLayer";
 | 
						|
    import type {FilterConfigOption} from "../../Models/ThemeConfig/FilterConfig";
 | 
						|
    import Locale from "../i18n/Locale";
 | 
						|
    import ValidatedInput from "../InputElement/ValidatedInput.svelte";
 | 
						|
    import {UIEventSource} from "../../Logic/UIEventSource";
 | 
						|
    import {onDestroy} from "svelte";
 | 
						|
    import {Utils} from "../../Utils";
 | 
						|
 | 
						|
    export let filteredLayer: FilteredLayer;
 | 
						|
    export let option: FilterConfigOption;
 | 
						|
    export let id: string;
 | 
						|
    let parts: ({ message: string } | { subs: string })[];
 | 
						|
    let language = Locale.language;
 | 
						|
    $: {
 | 
						|
        const template = option.question.textFor($language)
 | 
						|
        parts = Utils.splitIntoSubstitutionParts(template)
 | 
						|
    }
 | 
						|
    let fieldValues: Record<string, UIEventSource<string>> = {};
 | 
						|
    let fieldTypes: Record<string, string> = {};
 | 
						|
    let appliedFilter = <UIEventSource<string>>filteredLayer.appliedFilters.get(id);
 | 
						|
    let initialState: Record<string, string> = JSON.parse(appliedFilter?.data ?? "{}");
 | 
						|
 | 
						|
    function setFields() {
 | 
						|
        const properties: Record<string, string> = {};
 | 
						|
        for (const key in fieldValues) {
 | 
						|
            const v = fieldValues[key].data;
 | 
						|
            if (v === undefined) {
 | 
						|
                properties[key] = undefined;
 | 
						|
            } else {
 | 
						|
                properties[key] = v;
 | 
						|
            }
 | 
						|
        }
 | 
						|
        appliedFilter?.setData(FilteredLayer.fieldsToString(properties));
 | 
						|
    }
 | 
						|
 | 
						|
    for (const field of option.fields) {
 | 
						|
        // A bit of cheating: the 'parts' will have '}' suffixed for fields
 | 
						|
        const src = new UIEventSource<string>(initialState[field.name] ?? "");
 | 
						|
        fieldTypes[field.name] = field.type;
 | 
						|
        fieldValues[field.name] = src;
 | 
						|
        onDestroy(src.stabilized(200).addCallback(() => {
 | 
						|
            setFields();
 | 
						|
        }));
 | 
						|
    }
 | 
						|
    
 | 
						|
</script>
 | 
						|
 | 
						|
<div>
 | 
						|
    {#each parts as part, i}
 | 
						|
        {#if part.subs}
 | 
						|
            <!-- This is a field! -->
 | 
						|
            <span class="mx-1">
 | 
						|
            <ValidatedInput value={fieldValues[part.subs]} type={fieldTypes[part.subs]}/>
 | 
						|
            </span>
 | 
						|
        {:else}
 | 
						|
            {part.message}
 | 
						|
        {/if}
 | 
						|
    {/each}
 | 
						|
</div>
 |