| 
									
										
										
										
											2023-06-04 00:43:32 +02:00
										 |  |  | <script lang="ts"> | 
					
						
							| 
									
										
										
										
											2023-06-14 20:39:36 +02:00
										 |  |  |   import type { SpecialVisualizationState } from "../SpecialVisualization" | 
					
						
							|  |  |  |   import { ArrowDownTrayIcon } from "@babeard/svelte-heroicons/mini" | 
					
						
							|  |  |  |   import Tr from "../Base/Tr.svelte" | 
					
						
							|  |  |  |   import Translations from "../i18n/Translations" | 
					
						
							|  |  |  |   import type { FeatureCollection } from "geojson" | 
					
						
							|  |  |  |   import Loading from "../Base/Loading.svelte" | 
					
						
							|  |  |  |   import { Translation } from "../i18n/Translation" | 
					
						
							|  |  |  |   import DownloadHelper from "./DownloadHelper" | 
					
						
							|  |  |  |   import { Utils } from "../../Utils" | 
					
						
							|  |  |  |   import type { PriviligedLayerType } from "../../Models/Constants" | 
					
						
							|  |  |  |   import { UIEventSource } from "../../Logic/UIEventSource" | 
					
						
							| 
									
										
										
										
											2023-06-04 00:43:32 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-14 20:39:36 +02:00
										 |  |  |   export let state: SpecialVisualizationState | 
					
						
							| 
									
										
										
										
											2023-06-04 00:43:32 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-14 20:39:36 +02:00
										 |  |  |   export let extension: string | 
					
						
							|  |  |  |   export let mimetype: string | 
					
						
							|  |  |  |   export let construct: ( | 
					
						
							|  |  |  |     geojsonCleaned: FeatureCollection, | 
					
						
							|  |  |  |     title: string, | 
					
						
							|  |  |  |     status?: UIEventSource<string> | 
					
						
							|  |  |  |   ) => (Blob | string) | Promise<void> | 
					
						
							|  |  |  |   export let mainText: Translation | 
					
						
							|  |  |  |   export let helperText: Translation | 
					
						
							|  |  |  |   export let metaIsIncluded: boolean | 
					
						
							|  |  |  |   let downloadHelper: DownloadHelper = new DownloadHelper(state) | 
					
						
							| 
									
										
										
										
											2023-06-04 00:43:32 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-14 20:39:36 +02:00
										 |  |  |   const t = Translations.t.general.download | 
					
						
							| 
									
										
										
										
											2023-06-04 00:43:32 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-14 20:39:36 +02:00
										 |  |  |   let isExporting = false | 
					
						
							|  |  |  |   let isError = false | 
					
						
							| 
									
										
										
										
											2023-06-04 00:43:32 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-14 20:39:36 +02:00
										 |  |  |   let status: UIEventSource<string> = new UIEventSource<string>(undefined) | 
					
						
							| 
									
										
										
										
											2023-06-04 00:43:32 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-14 20:39:36 +02:00
										 |  |  |   async function clicked() { | 
					
						
							|  |  |  |     isExporting = true | 
					
						
							|  |  |  |     const gpsLayer = state.layerState.filteredLayers.get(<PriviligedLayerType>"gps_location") | 
					
						
							|  |  |  |     state.lastClickObject.features.setData([]) | 
					
						
							| 
									
										
										
										
											2023-06-04 22:52:13 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-14 20:39:36 +02:00
										 |  |  |     const gpsIsDisplayed = gpsLayer.isDisplayed.data | 
					
						
							|  |  |  |     try { | 
					
						
							|  |  |  |       gpsLayer.isDisplayed.setData(false) | 
					
						
							|  |  |  |       const geojson: FeatureCollection = downloadHelper.getCleanGeoJson(metaIsIncluded) | 
					
						
							|  |  |  |       const name = state.layout.id | 
					
						
							| 
									
										
										
										
											2023-06-04 00:43:32 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-14 20:39:36 +02:00
										 |  |  |       const title = `MapComplete_${name}_export_${new Date() | 
					
						
							|  |  |  |         .toISOString() | 
					
						
							|  |  |  |         .substr(0, 19)}.${extension}` | 
					
						
							|  |  |  |       const promise = construct(geojson, title, status) | 
					
						
							|  |  |  |       let data: Blob | string | 
					
						
							|  |  |  |       if (typeof promise === "string") { | 
					
						
							|  |  |  |         data = promise | 
					
						
							|  |  |  |       } else if (typeof promise["then"] === "function") { | 
					
						
							|  |  |  |         data = await (<Promise<Blob | string>>promise) | 
					
						
							|  |  |  |       } else { | 
					
						
							|  |  |  |         data = <Blob>promise | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       if (!data) { | 
					
						
							|  |  |  |         return | 
					
						
							|  |  |  |       } | 
					
						
							|  |  |  |       console.log("Got data", data) | 
					
						
							|  |  |  |       Utils.offerContentsAsDownloadableFile(data, title, { | 
					
						
							|  |  |  |         mimetype, | 
					
						
							|  |  |  |       }) | 
					
						
							|  |  |  |     } catch (e) { | 
					
						
							|  |  |  |       isError = true | 
					
						
							|  |  |  |       console.error(e) | 
					
						
							|  |  |  |     } finally { | 
					
						
							|  |  |  |       isExporting = false | 
					
						
							|  |  |  |       gpsLayer.isDisplayed.setData(gpsIsDisplayed) | 
					
						
							| 
									
										
										
										
											2023-06-04 00:43:32 +02:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2023-06-14 20:39:36 +02:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2023-06-04 00:43:32 +02:00
										 |  |  | </script> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | {#if isError} | 
					
						
							| 
									
										
										
										
											2023-06-14 20:39:36 +02:00
										 |  |  |   <Tr cls="alert" t={Translations.t.general.error} /> | 
					
						
							| 
									
										
										
										
											2023-06-04 00:43:32 +02:00
										 |  |  | {:else if isExporting} | 
					
						
							| 
									
										
										
										
											2023-06-14 20:39:36 +02:00
										 |  |  |   <Loading> | 
					
						
							|  |  |  |     {#if $status} | 
					
						
							|  |  |  |       {$status} | 
					
						
							|  |  |  |     {:else} | 
					
						
							|  |  |  |       <Tr t={t.exporting} /> | 
					
						
							|  |  |  |     {/if} | 
					
						
							|  |  |  |   </Loading> | 
					
						
							| 
									
										
										
										
											2023-06-04 00:43:32 +02:00
										 |  |  | {:else} | 
					
						
							| 
									
										
										
										
											2023-06-14 20:39:36 +02:00
										 |  |  |   <button class="flex w-full" on:click={clicked}> | 
					
						
							|  |  |  |     <slot name="image"> | 
					
						
							| 
									
										
										
										
											2023-06-14 20:44:01 +02:00
										 |  |  |       <ArrowDownTrayIcon class="mr-2 h-12 w-12 shrink-0" /> | 
					
						
							| 
									
										
										
										
											2023-06-14 20:39:36 +02:00
										 |  |  |     </slot> | 
					
						
							|  |  |  |     <span class="flex flex-col items-start"> | 
					
						
							|  |  |  |       <Tr t={mainText} /> | 
					
						
							|  |  |  |       <Tr t={helperText} cls="subtle" /> | 
					
						
							|  |  |  |     </span> | 
					
						
							|  |  |  |   </button> | 
					
						
							| 
									
										
										
										
											2023-06-04 00:43:32 +02:00
										 |  |  | {/if} |