| 
									
										
										
										
											2023-06-04 00:43:32 +02:00
										 |  |  | <script lang="ts"> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     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"; | 
					
						
							| 
									
										
										
										
											2023-06-04 22:52:13 +02:00
										 |  |  |     import {UIEventSource} from "../../Logic/UIEventSource"; | 
					
						
							| 
									
										
										
										
											2023-06-04 00:43:32 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     export let state: SpecialVisualizationState | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     export let extension: string | 
					
						
							|  |  |  |     export let mimetype: string | 
					
						
							| 
									
										
										
										
											2023-06-07 00:14:20 +02:00
										 |  |  |     export let construct: (geojsonCleaned: FeatureCollection, title: string, status?: UIEventSource<string>) => (Blob | string) | Promise<void> | 
					
						
							| 
									
										
										
										
											2023-06-04 00:43:32 +02:00
										 |  |  |     export let mainText: Translation | 
					
						
							|  |  |  |     export let helperText: Translation | 
					
						
							|  |  |  |     export let metaIsIncluded: boolean | 
					
						
							|  |  |  |     let downloadHelper: DownloadHelper = new DownloadHelper(state) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     const t = Translations.t.general.download | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     let isExporting = false | 
					
						
							|  |  |  |     let isError = false | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-04 22:52:13 +02:00
										 |  |  |     let status: UIEventSource<string> = new UIEventSource<string>(undefined) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-06-04 00:43:32 +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-04 00:43:32 +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 22:52:13 +02:00
										 |  |  |             const title = `MapComplete_${name}_export_${new Date().toISOString().substr(0, 19)}.${extension}` | 
					
						
							| 
									
										
										
										
											2023-06-07 00:14:20 +02:00
										 |  |  |             const promise = construct(geojson, title, status) | 
					
						
							| 
									
										
										
										
											2023-06-04 00:43:32 +02:00
										 |  |  |             let data: Blob | string | 
					
						
							|  |  |  |             if (typeof promise === "string") { | 
					
						
							|  |  |  |                 data = promise | 
					
						
							|  |  |  |             } else if (typeof promise["then"] === "function") { | 
					
						
							| 
									
										
										
										
											2023-06-04 22:52:13 +02:00
										 |  |  |                 data = await <Promise<Blob | string>>promise | 
					
						
							| 
									
										
										
										
											2023-06-04 00:43:32 +02:00
										 |  |  |             } else { | 
					
						
							|  |  |  |                 data = <Blob>promise | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2023-06-04 22:52:13 +02:00
										 |  |  |             if (!data) { | 
					
						
							|  |  |  |                 return | 
					
						
							|  |  |  |             } | 
					
						
							| 
									
										
										
										
											2023-06-04 00:43:32 +02:00
										 |  |  |             console.log("Got data", data) | 
					
						
							|  |  |  |             Utils.offerContentsAsDownloadableFile( | 
					
						
							|  |  |  |                 data, | 
					
						
							| 
									
										
										
										
											2023-06-04 22:52:13 +02:00
										 |  |  |                 title, | 
					
						
							| 
									
										
										
										
											2023-06-04 00:43:32 +02:00
										 |  |  |                 { | 
					
						
							|  |  |  |                     mimetype, | 
					
						
							|  |  |  |                 } | 
					
						
							|  |  |  |             ) | 
					
						
							|  |  |  |         } catch (e) { | 
					
						
							|  |  |  |             isError = true | 
					
						
							| 
									
										
										
										
											2023-06-04 22:52:13 +02:00
										 |  |  |             console.error(e) | 
					
						
							|  |  |  |         } finally { | 
					
						
							|  |  |  |             isExporting = false | 
					
						
							|  |  |  |             gpsLayer.isDisplayed.setData(gpsIsDisplayed) | 
					
						
							| 
									
										
										
										
											2023-06-04 00:43:32 +02:00
										 |  |  |         } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | </script> | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | {#if isError} | 
					
						
							| 
									
										
										
										
											2023-06-04 22:52:13 +02:00
										 |  |  |     <Tr cls="alert" t={Translations.t.general.error}/> | 
					
						
							| 
									
										
										
										
											2023-06-04 00:43:32 +02:00
										 |  |  | {:else if isExporting} | 
					
						
							|  |  |  |     <Loading> | 
					
						
							| 
									
										
										
										
											2023-06-04 22:52:13 +02:00
										 |  |  |         {#if $status} | 
					
						
							|  |  |  |             {$status} | 
					
						
							|  |  |  |         {:else} | 
					
						
							|  |  |  |             <Tr t={t.exporting}/> | 
					
						
							|  |  |  |         {/if} | 
					
						
							| 
									
										
										
										
											2023-06-04 00:43:32 +02:00
										 |  |  |     </Loading> | 
					
						
							|  |  |  | {:else} | 
					
						
							|  |  |  |     <button class="flex w-full" on:click={clicked}> | 
					
						
							|  |  |  |         <slot name="image"> | 
					
						
							| 
									
										
										
										
											2023-06-07 00:14:20 +02:00
										 |  |  |             <ArrowDownTrayIcon class="w-12 h-12 mr-2 shrink-0"/> | 
					
						
							| 
									
										
										
										
											2023-06-04 00:43:32 +02:00
										 |  |  |         </slot> | 
					
						
							|  |  |  |         <span class="flex flex-col items-start"> | 
					
						
							|  |  |  |             <Tr t={mainText}/> | 
					
						
							|  |  |  |             <Tr t={helperText} cls="subtle"/> | 
					
						
							|  |  |  |         </span> | 
					
						
							|  |  |  |     </button> | 
					
						
							|  |  |  | {/if} |