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>
 |