| 
									
										
										
										
											2023-05-30 02:52:22 +02:00
										 |  |  | <script lang="ts"> | 
					
						
							| 
									
										
										
										
											2023-06-14 20:39:36 +02:00
										 |  |  |   /** | 
					
						
							|  |  |  |    * The 'importflow' does some basic setup, e.g. validate that imports are allowed, that the user is logged-in, ... | 
					
						
							|  |  |  |    * They show some default components | 
					
						
							|  |  |  |    */ | 
					
						
							|  |  |  |   import ImportFlow from "./ImportFlow" | 
					
						
							|  |  |  |   import LoginToggle from "../../Base/LoginToggle.svelte" | 
					
						
							|  |  |  |   import BackButton from "../../Base/BackButton.svelte" | 
					
						
							|  |  |  |   import Translations from "../../i18n/Translations" | 
					
						
							|  |  |  |   import Tr from "../../Base/Tr.svelte" | 
					
						
							|  |  |  |   import NextButton from "../../Base/NextButton.svelte" | 
					
						
							|  |  |  |   import { createEventDispatcher } from "svelte" | 
					
						
							|  |  |  |   import Loading from "../../Base/Loading.svelte" | 
					
						
							|  |  |  |   import { And } from "../../../Logic/Tags/And" | 
					
						
							|  |  |  |   import TagHint from "../TagHint.svelte" | 
					
						
							|  |  |  |   import { TagsFilter } from "../../../Logic/Tags/TagsFilter" | 
					
						
							|  |  |  |   import { Store } from "../../../Logic/UIEventSource" | 
					
						
							|  |  |  |   import Svg from "../../../Svg" | 
					
						
							|  |  |  |   import ToSvelte from "../../Base/ToSvelte.svelte" | 
					
						
							|  |  |  |   import { EyeIcon, EyeOffIcon } from "@rgossiaux/svelte-heroicons/solid" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   export let importFlow: ImportFlow | 
					
						
							|  |  |  |   let state = importFlow.state | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   export let currentFlowStep: "start" | "confirm" | "importing" | "imported" = "start" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   const isLoading = state.dataIsLoading | 
					
						
							|  |  |  |   const dispatch = createEventDispatcher<{ confirm }>() | 
					
						
							|  |  |  |   const canBeImported = importFlow.canBeImported() | 
					
						
							|  |  |  |   const tags: Store<TagsFilter> = importFlow.tagsToApply.map((tags) => new And(tags)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   const isDisplayed = importFlow.targetLayer.isDisplayed | 
					
						
							|  |  |  |   const hasFilter = importFlow.targetLayer.hasFilter | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   function abort() { | 
					
						
							|  |  |  |     state.selectedElement.setData(undefined) | 
					
						
							|  |  |  |     state.selectedLayer.setData(undefined) | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2023-05-30 02:52:22 +02:00
										 |  |  | </script> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | <LoginToggle {state}> | 
					
						
							| 
									
										
										
										
											2023-06-14 20:39:36 +02:00
										 |  |  |   {#if $canBeImported !== true && $canBeImported !== undefined} | 
					
						
							|  |  |  |     <Tr cls="alert w-full flex justify-center" t={$canBeImported.error} /> | 
					
						
							|  |  |  |     {#if $canBeImported.extraHelp} | 
					
						
							|  |  |  |       <Tr t={$canBeImported.extraHelp} /> | 
					
						
							|  |  |  |     {/if} | 
					
						
							|  |  |  |   {:else if !$isDisplayed} | 
					
						
							|  |  |  |     <!-- Check that the layer is enabled, so that we don't add a duplicate --> | 
					
						
							| 
									
										
										
										
											2023-06-14 20:44:01 +02:00
										 |  |  |     <div class="alert flex items-center justify-center"> | 
					
						
							| 
									
										
										
										
											2023-06-14 20:39:36 +02:00
										 |  |  |       <EyeOffIcon class="w-8" /> | 
					
						
							|  |  |  |       <Tr | 
					
						
							|  |  |  |         t={Translations.t.general.add.layerNotEnabled.Subs({ | 
					
						
							|  |  |  |           layer: importFlow.targetLayer.layerDef.name, | 
					
						
							|  |  |  |         })} | 
					
						
							|  |  |  |       /> | 
					
						
							|  |  |  |     </div> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     <div class="flex flex-wrap-reverse md:flex-nowrap"> | 
					
						
							|  |  |  |       <button | 
					
						
							|  |  |  |         class="flex w-full gap-x-1" | 
					
						
							|  |  |  |         on:click={() => { | 
					
						
							|  |  |  |           abort() | 
					
						
							|  |  |  |           state.guistate.openFilterView(importFlow.targetLayer.layerDef) | 
					
						
							|  |  |  |         }} | 
					
						
							|  |  |  |       > | 
					
						
							|  |  |  |         <ToSvelte construct={Svg.layers_svg().SetClass("w-12")} /> | 
					
						
							|  |  |  |         <Tr t={Translations.t.general.add.openLayerControl} /> | 
					
						
							|  |  |  |       </button> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       <button | 
					
						
							| 
									
										
										
										
											2023-06-14 20:44:01 +02:00
										 |  |  |         class="primary flex w-full gap-x-1" | 
					
						
							| 
									
										
										
										
											2023-06-14 20:39:36 +02:00
										 |  |  |         on:click={() => { | 
					
						
							|  |  |  |           isDisplayed.setData(true) | 
					
						
							|  |  |  |           abort() | 
					
						
							|  |  |  |         }} | 
					
						
							|  |  |  |       > | 
					
						
							|  |  |  |         <EyeIcon class="w-12" /> | 
					
						
							|  |  |  |         <Tr | 
					
						
							|  |  |  |           t={Translations.t.general.add.enableLayer.Subs({ | 
					
						
							|  |  |  |             name: importFlow.targetLayer.layerDef.name, | 
					
						
							|  |  |  |           })} | 
					
						
							|  |  |  |         /> | 
					
						
							|  |  |  |       </button> | 
					
						
							|  |  |  |     </div> | 
					
						
							|  |  |  |   {:else if $hasFilter} | 
					
						
							|  |  |  |     <!-- Some filters are enabled. The feature to add might already be mapped, but hidden --> | 
					
						
							| 
									
										
										
										
											2023-06-14 20:44:01 +02:00
										 |  |  |     <div class="alert flex items-center justify-center"> | 
					
						
							| 
									
										
										
										
											2023-06-14 20:39:36 +02:00
										 |  |  |       <EyeOffIcon class="w-8" /> | 
					
						
							|  |  |  |       <Tr t={Translations.t.general.add.disableFiltersExplanation} /> | 
					
						
							|  |  |  |     </div> | 
					
						
							|  |  |  |     <div class="flex flex-wrap-reverse md:flex-nowrap"> | 
					
						
							|  |  |  |       <button | 
					
						
							| 
									
										
										
										
											2023-06-14 20:44:01 +02:00
										 |  |  |         class="primary flex w-full gap-x-1" | 
					
						
							| 
									
										
										
										
											2023-06-14 20:39:36 +02:00
										 |  |  |         on:click={() => { | 
					
						
							|  |  |  |           abort() | 
					
						
							|  |  |  |           importFlow.targetLayer.disableAllFilters() | 
					
						
							|  |  |  |         }} | 
					
						
							|  |  |  |       > | 
					
						
							|  |  |  |         <EyeOffIcon class="w-12" /> | 
					
						
							|  |  |  |         <Tr t={Translations.t.general.add.disableFilters} /> | 
					
						
							|  |  |  |       </button> | 
					
						
							|  |  |  |       <button | 
					
						
							|  |  |  |         class="flex w-full gap-x-1" | 
					
						
							|  |  |  |         on:click={() => { | 
					
						
							|  |  |  |           abort() | 
					
						
							|  |  |  |           state.guistate.openFilterView(importFlow.targetLayer.layerDef) | 
					
						
							|  |  |  |         }} | 
					
						
							|  |  |  |       > | 
					
						
							|  |  |  |         <ToSvelte construct={Svg.layers_svg().SetClass("w-12")} /> | 
					
						
							|  |  |  |         <Tr t={Translations.t.general.add.openLayerControl} /> | 
					
						
							|  |  |  |       </button> | 
					
						
							|  |  |  |     </div> | 
					
						
							|  |  |  |   {:else if $isLoading} | 
					
						
							|  |  |  |     <Loading> | 
					
						
							|  |  |  |       <Tr t={Translations.t.general.add.stillLoading} /> | 
					
						
							|  |  |  |     </Loading> | 
					
						
							|  |  |  |   {:else if currentFlowStep === "start"} | 
					
						
							|  |  |  |     <NextButton clss="primary w-full" on:click={() => (currentFlowStep = "confirm")}> | 
					
						
							|  |  |  |       <slot name="start-flow-text"> | 
					
						
							|  |  |  |         {#if importFlow?.args?.icon} | 
					
						
							| 
									
										
										
										
											2023-06-14 20:44:01 +02:00
										 |  |  |           <img class="h-8 w-8" src={importFlow.args.icon} /> | 
					
						
							| 
									
										
										
										
											2023-05-30 02:52:22 +02:00
										 |  |  |         {/if} | 
					
						
							| 
									
										
										
										
											2023-06-14 20:39:36 +02:00
										 |  |  |         {importFlow.args.text} | 
					
						
							|  |  |  |       </slot> | 
					
						
							|  |  |  |     </NextButton> | 
					
						
							|  |  |  |   {:else if currentFlowStep === "confirm"} | 
					
						
							| 
									
										
										
										
											2023-06-14 20:44:01 +02:00
										 |  |  |     <div class="flex h-full w-full flex-col"> | 
					
						
							|  |  |  |       <div class="h-full w-full"> | 
					
						
							| 
									
										
										
										
											2023-06-14 20:39:36 +02:00
										 |  |  |         <slot name="map" /> | 
					
						
							|  |  |  |       </div> | 
					
						
							|  |  |  |       <div class="flex flex-col-reverse md:flex-row"> | 
					
						
							|  |  |  |         <BackButton clss="w-full" on:click={() => (currentFlowStep = "start")}> | 
					
						
							|  |  |  |           <Tr t={Translations.t.general.back} /> | 
					
						
							|  |  |  |         </BackButton> | 
					
						
							|  |  |  |         <NextButton | 
					
						
							|  |  |  |           clss="primary w-full" | 
					
						
							|  |  |  |           on:click={() => { | 
					
						
							|  |  |  |             currentFlowStep = "imported" | 
					
						
							|  |  |  |             dispatch("confirm") | 
					
						
							|  |  |  |           }} | 
					
						
							|  |  |  |         > | 
					
						
							| 
									
										
										
										
											2023-06-14 20:44:01 +02:00
										 |  |  |           <span slot="image" class="h-8 w-8 pr-4"> | 
					
						
							| 
									
										
										
										
											2023-06-14 20:39:36 +02:00
										 |  |  |             {#if importFlow.args.icon} | 
					
						
							|  |  |  |               <img src={importFlow.args.icon} /> | 
					
						
							|  |  |  |             {:else} | 
					
						
							|  |  |  |               <ToSvelte construct={Svg.confirm_svg().SetClass("w-8 h-8 pr-4")} /> | 
					
						
							|  |  |  |             {/if} | 
					
						
							|  |  |  |           </span> | 
					
						
							|  |  |  |           <slot name="confirm-text"> | 
					
						
							|  |  |  |             {importFlow.args.text} | 
					
						
							|  |  |  |           </slot> | 
					
						
							| 
									
										
										
										
											2023-06-01 02:52:21 +02:00
										 |  |  |         </NextButton> | 
					
						
							| 
									
										
										
										
											2023-06-14 20:39:36 +02:00
										 |  |  |       </div> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       <div class="subtle"> | 
					
						
							|  |  |  |         <TagHint | 
					
						
							|  |  |  |           embedIn={(str) => Translations.t.general.add.import.importTags.Subs({ tags: str })} | 
					
						
							|  |  |  |           {state} | 
					
						
							|  |  |  |           tags={$tags} | 
					
						
							|  |  |  |         /> | 
					
						
							|  |  |  |       </div> | 
					
						
							|  |  |  |     </div> | 
					
						
							|  |  |  |   {:else if currentFlowStep === "importing"} | 
					
						
							|  |  |  |     <Loading /> | 
					
						
							|  |  |  |   {:else if currentFlowStep === "imported"} | 
					
						
							|  |  |  |     <div class="thanks w-full p-4"> | 
					
						
							|  |  |  |       <Tr t={Translations.t.general.add.import.hasBeenImported} /> | 
					
						
							|  |  |  |     </div> | 
					
						
							|  |  |  |   {/if} | 
					
						
							| 
									
										
										
										
											2023-05-30 02:52:22 +02:00
										 |  |  | </LoginToggle> |