2023-03-30 04:51:56 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								< script  lang = "ts" >  
						 
					
						
							
								
									
										
										
										
											2023-06-16 02:36:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    import { UIEventSource }  from "../../Logic/UIEventSource"
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    import type { ValidatorType }  from "./Validators"
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    import Validators from "./Validators"
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    import { ExclamationIcon }  from "@rgossiaux/svelte-heroicons/solid"
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    import { Translation }  from "../i18n/Translation"
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    import { createEventDispatcher ,  onDestroy }  from "svelte"
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    import { Validator }  from "./Validator"
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    import { Unit }  from "../../Models/Unit"
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    import UnitInput from "../Popup/UnitInput.svelte"
							 
						 
					
						
							
								
									
										
										
										
											2023-06-20 01:32:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    import { Utils }  from "../../Utils";
							 
						 
					
						
							
								
									
										
										
										
											2023-06-16 02:36:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    export let type: ValidatorType
							 
						 
					
						
							
								
									
										
										
										
											2023-06-21 17:13:09 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    export let feedback: UIEventSource< Translation >  | undefined
							 
						 
					
						
							
								
									
										
										
										
											2023-06-16 02:36:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    export let getCountry: () => string | undefined
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    export let placeholder: string | Translation | undefined
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    export let unit: Unit = undefined
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    export let value: UIEventSource< string > 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    /**
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     * Internal state bound to the input element.
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     *
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     * This is only copied to 'value' when appropriate so that no invalid values leak outside;
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     * Additionally, the unit is added when copying
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								     */
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    let _value = new UIEventSource(value.data ?? "")
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    let validator: Validator = Validators.get(type ?? "string")
							 
						 
					
						
							
								
									
										
										
										
											2023-06-20 01:32:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    if(validator === undefined){ 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        console.warn("Didn't find a validator for type", type)
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    }
							 
						 
					
						
							
								
									
										
										
										
											2023-06-16 02:36:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    let selectedUnit: UIEventSource< string >  = new UIEventSource< string > (undefined)
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    let _placeholder = placeholder ?? validator?.getPlaceholder() ?? type
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    function initValueAndDenom() { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if (unit &&  value.data) { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            const [v, denom] = unit?.findDenomination(value.data, getCountry)
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            if (denom) { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                _value.setData(v)
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                selectedUnit.setData(denom.canonical)
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            } else { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                _value.setData(value.data ?? "")
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            }
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        } else { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            _value.setData(value.data ?? "")
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        }
							 
						 
					
						
							
								
									
										
										
										
											2023-03-30 04:51:56 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								    }
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-06-16 02:36:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    initValueAndDenom()
							 
						 
					
						
							
								
									
										
										
										
											2023-06-11 01:32:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-06-16 02:36:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    $: { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        // The type changed -> reset some values
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        validator = Validators.get(type ?? "string")
							 
						 
					
						
							
								
									
										
										
										
											2023-06-20 01:32:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        
							 
						 
					
						
							
								
									
										
										
										
											2023-06-16 02:36:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        _placeholder = placeholder ?? validator?.getPlaceholder() ?? type
							 
						 
					
						
							
								
									
										
										
										
											2023-06-21 17:13:09 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        feedback?.setData(validator?.getFeedback(_value.data, getCountry))
							 
						 
					
						
							
								
									
										
										
										
											2023-06-11 01:32:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-06-16 02:36:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        initValueAndDenom()
							 
						 
					
						
							
								
									
										
										
										
											2023-06-11 01:32:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    }
							 
						 
					
						
							
								
									
										
										
										
											2023-03-30 04:51:56 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-06-16 02:36:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    function setValues() { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        // Update the value stores
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        const v = _value.data
							 
						 
					
						
							
								
									
										
										
										
											2023-06-20 01:32:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        if (!validator?.isValid(v, getCountry) || v === "") { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            feedback?.setData(validator?.getFeedback(v, getCountry))
							 
						 
					
						
							
								
									
										
										
										
											2023-06-21 17:13:09 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            value.setData("")
							 
						 
					
						
							
								
									
										
										
										
											2023-06-16 02:36:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								            return
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        }
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if (unit &&  isNaN(Number(v))) { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            value.setData(undefined)
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            return
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        }
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        feedback?.setData(undefined)
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        value.setData(v + (selectedUnit.data ?? ""))
							 
						 
					
						
							
								
									
										
										
										
											2023-06-11 01:32:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    }
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-06-16 02:36:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    onDestroy(_value.addCallbackAndRun((_) => setValues()))
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    onDestroy(selectedUnit.addCallback((_) => setValues()))
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    if (validator === undefined) { 
							 
						 
					
						
							
								
									
										
										
										
											2023-06-20 01:32:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								        throw "Not a valid type (no validator found) for type '" + type+"'; did you perhaps mean one of: "+Utils.sortedByLevenshteinDistance(type, Validators.AllValidators.map(v => v.name), v => v).slice(0, 5).join(", ")
							 
						 
					
						
							
								
									
										
										
										
											2023-06-16 02:36:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    }
							 
						 
					
						
							
								
									
										
										
										
											2023-06-11 01:32:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-06-20 01:32:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    const isValid = _value.map((v) => validator?.isValid(v, getCountry) ?? true)
							 
						 
					
						
							
								
									
										
										
										
											2023-06-11 01:32:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-06-16 02:36:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    let htmlElem: HTMLInputElement
							 
						 
					
						
							
								
									
										
										
										
											2023-06-11 01:32:30 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-06-16 02:36:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    let dispatch = createEventDispatcher< {  selected ,  submit  } >()
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    $: { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        if (htmlElem !== undefined) { 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            htmlElem.onfocus = () => dispatch("selected")
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        }
							 
						 
					
						
							
								
									
										
										
										
											2023-03-31 03:28:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    }
							 
						 
					
						
							
								
									
										
										
										
											2023-03-30 04:51:56 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								< / script >  
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
									
										
										
										
											2023-06-20 01:32:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{ #if  validator ? . textArea }  
						 
					
						
							
								
									
										
										
										
											2023-06-16 02:36:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    < form  on:submit | preventDefault = {()  =>  dispatch ( "submit" )} > 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    
							 
						 
					
						
							
								
									
										
										
										
											2023-06-14 20:39:36 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								  < textarea 
							 
						 
					
						
							
								
									
										
										
										
											2023-06-16 02:36:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								          class="w-full"
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								          bind:value={ $_value } 
							 
						 
					
						
							
								
									
										
										
										
											2023-06-20 01:32:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								          inputmode={ validator ? . inputmode  ??  "text" } 
							 
						 
					
						
							
								
									
										
										
										
											2023-06-16 02:36:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								          placeholder={ _placeholder } ></ textarea > 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    < / form > 
							 
						 
					
						
							
								
									
										
										
										
											2023-06-14 20:39:36 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								{ : else }  
						 
					
						
							
								
									
										
										
										
											2023-06-16 02:36:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								    < form  class = "inline-flex"  on:submit = {()  =>  dispatch ( "submit" )} > 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        < input 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                bind:this={ htmlElem } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                bind:value={ $_value } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								                class="w-full"
							 
						 
					
						
							
								
									
										
										
										
											2023-06-20 01:32:24 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                inputmode={ validator ? . inputmode  ??  "text" } 
							 
						 
					
						
							
								
									
										
										
										
											2023-06-16 02:36:11 +02:00 
										
									 
								 
							 
							
								
									
										 
								
							 
							
								 
							
							
								                placeholder={ _placeholder } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        />
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        { #if  ! $isValid } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            < ExclamationIcon  class = "-ml-6 h-6 w-6" / > 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        { /if } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        { #if  unit  !==  undefined } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								            < UnitInput  { unit }  { selectedUnit }  textValue = { _value }  upstreamValue= { value } / > 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								        { /if } 
							 
						 
					
						
							
								
							 
							
								
							 
							
								 
							
							
								    < / form > 
							 
						 
					
						
							
								
									
										
										
										
											2023-03-30 04:51:56 +02:00 
										
									 
								 
							 
							
								
							 
							
								 
							
							
								{ /if }