| 
									
										
										
										
											2023-04-06 01:33:08 +02:00
										 |  |  | <script lang="ts"> | 
					
						
							| 
									
										
										
										
											2023-06-14 20:39:36 +02:00
										 |  |  |   import FilteredLayer from "../../Models/FilteredLayer" | 
					
						
							|  |  |  |   import type { FilterConfigOption } from "../../Models/ThemeConfig/FilterConfig" | 
					
						
							|  |  |  |   import Locale from "../i18n/Locale" | 
					
						
							|  |  |  |   import ValidatedInput from "../InputElement/ValidatedInput.svelte" | 
					
						
							|  |  |  |   import { UIEventSource } from "../../Logic/UIEventSource" | 
					
						
							|  |  |  |   import { onDestroy } from "svelte" | 
					
						
							|  |  |  |   import { Utils } from "../../Utils" | 
					
						
							| 
									
										
										
										
											2023-04-06 01:33:08 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-14 20:39:36 +02:00
										 |  |  |   export let filteredLayer: FilteredLayer | 
					
						
							|  |  |  |   export let option: FilterConfigOption | 
					
						
							|  |  |  |   export let id: string | 
					
						
							|  |  |  |   let parts: ({ message: string } | { subs: string })[] | 
					
						
							|  |  |  |   let language = Locale.language | 
					
						
							|  |  |  |   $: { | 
					
						
							|  |  |  |     const template = option.question.textFor($language) | 
					
						
							|  |  |  |     parts = Utils.splitIntoSubstitutionParts(template) | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  |   let fieldValues: Record<string, UIEventSource<string>> = {} | 
					
						
							|  |  |  |   let fieldTypes: Record<string, string> = {} | 
					
						
							|  |  |  |   let appliedFilter = <UIEventSource<string>>filteredLayer.appliedFilters.get(id) | 
					
						
							|  |  |  |   let initialState: Record<string, string> = JSON.parse(appliedFilter?.data ?? "{}") | 
					
						
							| 
									
										
										
										
											2023-04-06 01:33:08 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-14 20:39:36 +02:00
										 |  |  |   function setFields() { | 
					
						
							|  |  |  |     const properties: Record<string, string> = {} | 
					
						
							|  |  |  |     for (const key in fieldValues) { | 
					
						
							|  |  |  |       const v = fieldValues[key].data | 
					
						
							|  |  |  |       if (v === undefined) { | 
					
						
							|  |  |  |         properties[key] = undefined | 
					
						
							|  |  |  |       } else { | 
					
						
							|  |  |  |         properties[key] = v | 
					
						
							|  |  |  |       } | 
					
						
							| 
									
										
										
										
											2023-05-24 00:50:27 +02:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2023-06-14 20:39:36 +02:00
										 |  |  |     appliedFilter?.setData(FilteredLayer.fieldsToString(properties)) | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2023-04-06 01:33:08 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-14 20:39:36 +02:00
										 |  |  |   for (const field of option.fields) { | 
					
						
							|  |  |  |     // A bit of cheating: the 'parts' will have '}' suffixed for fields | 
					
						
							|  |  |  |     const src = new UIEventSource<string>(initialState[field.name] ?? "") | 
					
						
							|  |  |  |     fieldTypes[field.name] = field.type | 
					
						
							|  |  |  |     fieldValues[field.name] = src | 
					
						
							|  |  |  |     onDestroy( | 
					
						
							|  |  |  |       src.stabilized(200).addCallback(() => { | 
					
						
							|  |  |  |         setFields() | 
					
						
							|  |  |  |       }) | 
					
						
							|  |  |  |     ) | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2023-04-06 01:33:08 +02:00
										 |  |  | </script> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <div> | 
					
						
							| 
									
										
										
										
											2023-06-14 20:39:36 +02:00
										 |  |  |   {#each parts as part, i} | 
					
						
							|  |  |  |     {#if part.subs} | 
					
						
							|  |  |  |       <!-- This is a field! --> | 
					
						
							|  |  |  |       <span class="mx-1"> | 
					
						
							|  |  |  |         <ValidatedInput value={fieldValues[part.subs]} type={fieldTypes[part.subs]} /> | 
					
						
							|  |  |  |       </span> | 
					
						
							|  |  |  |     {:else} | 
					
						
							|  |  |  |       {part.message} | 
					
						
							|  |  |  |     {/if} | 
					
						
							|  |  |  |   {/each} | 
					
						
							| 
									
										
										
										
											2023-04-06 01:33:08 +02:00
										 |  |  | </div> |