forked from MapComplete/MapComplete
		
	
		
			
	
	
		
			68 lines
		
	
	
	
		
			2 KiB
		
	
	
	
		
			Svelte
		
	
	
	
	
	
		
		
			
		
	
	
			68 lines
		
	
	
	
		
			2 KiB
		
	
	
	
		
			Svelte
		
	
	
	
	
	
| 
								 | 
							
								<script lang="ts">
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    import {Unit} from "../../Models/Unit";
							 | 
						||
| 
								 | 
							
								    import {Store, UIEventSource} from "../../Logic/UIEventSource";
							 | 
						||
| 
								 | 
							
								    import Tr from "../Base/Tr.svelte";
							 | 
						||
| 
								 | 
							
								    import {onDestroy} from "svelte";
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    export let unit: Unit
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * The current value of the input field
							 | 
						||
| 
								 | 
							
								     * Not necessarily a correct number
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    export let textValue: UIEventSource<string>
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * The actual _valid_ value that is upstreamed
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    export let upstreamValue: Store<string>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    let isSingle: Store<boolean> = textValue.map(v => Number(v) === 1)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    export let selectedUnit: UIEventSource<string> = new UIEventSource<string>(undefined)
							 | 
						||
| 
								 | 
							
								    export let getCountry = () => "be"
							 | 
						||
| 
								 | 
							
								    console.log("Unit", unit)
							 | 
						||
| 
								 | 
							
								    onDestroy(upstreamValue.addCallbackAndRun(v => {
							 | 
						||
| 
								 | 
							
								        if (v === undefined) {
							 | 
						||
| 
								 | 
							
								            if (!selectedUnit.data) {
							 | 
						||
| 
								 | 
							
								                selectedUnit.setData(unit.getDefaultDenomination(getCountry).canonical)
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            return
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        const selected = unit.findDenomination(v, getCountry)
							 | 
						||
| 
								 | 
							
								        if (selected === undefined) {
							 | 
						||
| 
								 | 
							
								            selectedUnit.setData(unit.getDefaultDenomination(getCountry).canonical)
							 | 
						||
| 
								 | 
							
								            return
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        const [value, denomination] = selected
							 | 
						||
| 
								 | 
							
								        selectedUnit.setData(denomination.canonical)
							 | 
						||
| 
								 | 
							
								        return
							 | 
						||
| 
								 | 
							
								    }))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    onDestroy(textValue.addCallbackAndRunD(v => {
							 | 
						||
| 
								 | 
							
								        // Fallback in case that the user manually types a denomination
							 | 
						||
| 
								 | 
							
								        const [value, denomination] = unit.findDenomination(v, getCountry)
							 | 
						||
| 
								 | 
							
								        if (value === undefined || denomination === undefined) {
							 | 
						||
| 
								 | 
							
								            return
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        textValue.setData(value)
							 | 
						||
| 
								 | 
							
								        selectedUnit.setData(denomination.canonical)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    }))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								</script>
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								<select bind:value={$selectedUnit}>
							 | 
						||
| 
								 | 
							
								    {#each unit.denominations as denom (denom.canonical)}
							 | 
						||
| 
								 | 
							
								        <option value={denom.canonical}>
							 | 
						||
| 
								 | 
							
								            {#if $isSingle}
							 | 
						||
| 
								 | 
							
								                <Tr t={denom.humanSingular}/>
							 | 
						||
| 
								 | 
							
								            {:else }
							 | 
						||
| 
								 | 
							
								                <Tr t={denom.human}/>
							 | 
						||
| 
								 | 
							
								            {/if}
							 | 
						||
| 
								 | 
							
								        </option>
							 | 
						||
| 
								 | 
							
								    {/each}
							 | 
						||
| 
								 | 
							
								</select>
							 |