forked from MapComplete/MapComplete
		
	
		
			
				
	
	
		
			66 lines
		
	
	
	
		
			1.9 KiB
		
	
	
	
		
			Svelte
		
	
	
	
	
	
			
		
		
	
	
			66 lines
		
	
	
	
		
			1.9 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>
 |