| 
									
										
										
										
											2023-03-30 04:51:56 +02:00
										 |  |  | <script lang="ts"> | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-31 03:28:11 +02:00
										 |  |  |   import { UIEventSource } from "../../Logic/UIEventSource"; | 
					
						
							| 
									
										
										
										
											2023-03-30 04:51:56 +02:00
										 |  |  |   import type { ValidatorType } from "./Validators"; | 
					
						
							|  |  |  |   import Validators from "./Validators"; | 
					
						
							|  |  |  |   import { ExclamationIcon } from "@rgossiaux/svelte-heroicons/solid"; | 
					
						
							|  |  |  |   import { Translation } from "../i18n/Translation"; | 
					
						
							| 
									
										
										
										
											2023-03-31 03:28:11 +02:00
										 |  |  |   import { createEventDispatcher } from "svelte"; | 
					
						
							| 
									
										
										
										
											2023-03-30 04:51:56 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |   export let value: UIEventSource<string>; | 
					
						
							|  |  |  |   // Internal state, only copied to 'value' so that no invalid values leak outside | 
					
						
							| 
									
										
										
										
											2023-03-31 03:28:11 +02:00
										 |  |  |   let _value = new UIEventSource(value.data ?? ""); | 
					
						
							| 
									
										
										
										
											2023-03-30 04:51:56 +02:00
										 |  |  |   export let type: ValidatorType; | 
					
						
							|  |  |  |   let validator = Validators.get(type); | 
					
						
							| 
									
										
										
										
											2023-03-31 03:28:11 +02:00
										 |  |  |   export let feedback: UIEventSource<Translation> | undefined = undefined; | 
					
						
							| 
									
										
										
										
											2023-03-30 04:51:56 +02:00
										 |  |  |   _value.addCallbackAndRun(v => { | 
					
						
							| 
									
										
										
										
											2023-03-31 03:28:11 +02:00
										 |  |  |     if (validator.isValid(v)) { | 
					
						
							|  |  |  |       feedback?.setData(undefined); | 
					
						
							|  |  |  |       value.setData(v); | 
					
						
							|  |  |  |       return; | 
					
						
							| 
									
										
										
										
											2023-03-30 04:51:56 +02:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2023-03-31 03:28:11 +02:00
										 |  |  |     value.setData(undefined); | 
					
						
							| 
									
										
										
										
											2023-03-30 04:51:56 +02:00
										 |  |  |     feedback?.setData(validator.getFeedback(v)); | 
					
						
							| 
									
										
										
										
											2023-03-31 03:28:11 +02:00
										 |  |  |   }); | 
					
						
							| 
									
										
										
										
											2023-03-30 04:51:56 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |   if (validator === undefined) { | 
					
						
							|  |  |  |     throw "Not a valid type for a validator:" + type; | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   const isValid = _value.map(v => validator.isValid(v)); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-03-31 03:28:11 +02:00
										 |  |  |   let htmlElem: HTMLInputElement; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   let dispatch = createEventDispatcher<{ selected }>(); | 
					
						
							|  |  |  |   $: { | 
					
						
							| 
									
										
										
										
											2023-04-06 01:33:08 +02:00
										 |  |  |     console.log(htmlElem); | 
					
						
							| 
									
										
										
										
											2023-03-31 03:28:11 +02:00
										 |  |  |     if (htmlElem !== undefined) { | 
					
						
							|  |  |  |       htmlElem.onfocus = () => { | 
					
						
							| 
									
										
										
										
											2023-04-06 01:33:08 +02:00
										 |  |  |         console.log("Dispatching selected event"); | 
					
						
							| 
									
										
										
										
											2023-03-31 03:28:11 +02:00
										 |  |  |         return dispatch("selected"); | 
					
						
							|  |  |  |       }; | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2023-03-30 04:51:56 +02:00
										 |  |  | </script> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | {#if validator.textArea} | 
					
						
							| 
									
										
										
										
											2023-04-06 01:33:08 +02:00
										 |  |  |   <textarea class="w-full" bind:value={$_value} inputmode={validator.inputmode ?? "text"}></textarea> | 
					
						
							| 
									
										
										
										
											2023-03-30 04:51:56 +02:00
										 |  |  | {:else } | 
					
						
							| 
									
										
										
										
											2023-04-06 01:33:08 +02:00
										 |  |  |   <span class="flex"> | 
					
						
							| 
									
										
										
										
											2023-03-31 03:28:11 +02:00
										 |  |  |     <input bind:this={htmlElem} bind:value={$_value} inputmode={validator.inputmode ?? "text"}> | 
					
						
							| 
									
										
										
										
											2023-03-30 04:51:56 +02:00
										 |  |  |     {#if !$isValid} | 
					
						
							|  |  |  |       <ExclamationIcon class="h-6 w-6 -ml-6"></ExclamationIcon> | 
					
						
							|  |  |  |     {/if} | 
					
						
							| 
									
										
										
										
											2023-04-06 01:33:08 +02:00
										 |  |  |   </span> | 
					
						
							| 
									
										
										
										
											2023-03-30 04:51:56 +02:00
										 |  |  | {/if} |