| 
									
										
										
										
											2022-09-08 21:40:48 +02:00
										 |  |  | import DetermineLayout from "./Logic/DetermineLayout" | 
					
						
							| 
									
										
										
										
											2023-04-13 23:40:28 +02:00
										 |  |  | import ThemeViewState from "./Models/ThemeViewState" | 
					
						
							|  |  |  | import SvelteUIElement from "./UI/Base/SvelteUIElement" | 
					
						
							|  |  |  | import ThemeViewGUI from "./UI/ThemeViewGUI.svelte" | 
					
						
							| 
									
										
										
										
											2023-06-14 20:39:36 +02:00
										 |  |  | import { FixedUiElement } from "./UI/Base/FixedUiElement" | 
					
						
							| 
									
										
										
										
											2023-07-08 02:53:45 +02:00
										 |  |  | import Combine from "./UI/Base/Combine" | 
					
						
							|  |  |  | import { SubtleButton } from "./UI/Base/SubtleButton" | 
					
						
							|  |  |  | import { Utils } from "./Utils" | 
					
						
							| 
									
										
										
										
											2024-02-18 15:59:28 +01:00
										 |  |  | import Constants from "./Models/Constants" | 
					
						
							| 
									
										
										
										
											2024-06-16 19:00:43 +02:00
										 |  |  | import ArrowDownTray from "@babeard/svelte-heroicons/mini/ArrowDownTray" | 
					
						
							| 
									
										
										
										
											2024-01-16 23:03:33 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-09-16 02:55:13 +02:00
										 |  |  | function webgl_support() { | 
					
						
							|  |  |  |     try { | 
					
						
							| 
									
										
										
										
											2024-01-16 23:03:33 +01:00
										 |  |  |         const canvas = document.createElement("canvas") | 
					
						
							| 
									
										
										
										
											2023-09-16 02:55:13 +02:00
										 |  |  |         return ( | 
					
						
							|  |  |  |             !!window.WebGLRenderingContext && | 
					
						
							|  |  |  |             (canvas.getContext("webgl") || canvas.getContext("experimental-webgl")) | 
					
						
							|  |  |  |         ) | 
					
						
							|  |  |  |     } catch (e) { | 
					
						
							|  |  |  |         return false | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2024-03-28 15:53:41 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | async function timeout(timeMS: number): Promise<{ layers: string[] }> { | 
					
						
							|  |  |  |     await Utils.waitFor(timeMS) | 
					
						
							|  |  |  |     return { layers: [] } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-19 15:38:46 +01:00
										 |  |  | async function getAvailableLayers(): Promise<Set<string>> { | 
					
						
							|  |  |  |     try { | 
					
						
							| 
									
										
										
										
											2024-06-12 15:03:10 +02:00
										 |  |  |         const host = new URL(Constants.SummaryServer).host | 
					
						
							| 
									
										
										
										
											2024-03-28 15:53:41 +01:00
										 |  |  |         const status: { layers: string[] } = await Promise.any([ | 
					
						
							| 
									
										
										
										
											2024-06-16 16:06:26 +02:00
										 |  |  |             Utils.downloadJson<{ layers }>("https://" + host + "/summary/status.json"), | 
					
						
							| 
									
										
										
										
											2024-04-30 23:14:57 +02:00
										 |  |  |             timeout(2500), | 
					
						
							| 
									
										
										
										
											2024-03-28 15:53:41 +01:00
										 |  |  |         ]) | 
					
						
							| 
									
										
										
										
											2024-02-19 15:38:46 +01:00
										 |  |  |         return new Set<string>(status.layers) | 
					
						
							|  |  |  |     } catch (e) { | 
					
						
							|  |  |  |         console.error("Could not get MVT available layers due to", e) | 
					
						
							|  |  |  |         return new Set<string>() | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2024-02-18 15:59:28 +01:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2024-03-28 15:53:41 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-18 15:59:28 +01:00
										 |  |  | async function main() { | 
					
						
							|  |  |  |     try { | 
					
						
							|  |  |  |         if (!webgl_support()) { | 
					
						
							|  |  |  |             throw "WebGL is not supported or not enabled. This is essential for MapComplete to function, please enable this." | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |         const [layout, availableLayers] = await Promise.all([ | 
					
						
							|  |  |  |             DetermineLayout.GetLayout(), | 
					
						
							| 
									
										
										
										
											2024-04-13 02:40:21 +02:00
										 |  |  |             await getAvailableLayers(), | 
					
						
							| 
									
										
										
										
											2024-02-18 15:59:28 +01:00
										 |  |  |         ]) | 
					
						
							| 
									
										
										
										
											2024-08-16 11:12:53 +02:00
										 |  |  |         availableLayers?.delete("cycle_highways") // TODO remove after next cache.mapcomplete.org update
 | 
					
						
							| 
									
										
										
										
											2024-02-19 15:38:46 +01:00
										 |  |  |         console.log("The available layers on server are", Array.from(availableLayers)) | 
					
						
							|  |  |  |         const state = new ThemeViewState(layout, availableLayers) | 
					
						
							| 
									
										
										
										
											2024-06-20 04:21:29 +02:00
										 |  |  |         const target = document.getElementById("maindiv") | 
					
						
							| 
									
										
										
										
											2024-06-18 03:33:11 +02:00
										 |  |  |         const childs = Array.from(target.children) | 
					
						
							| 
									
										
										
										
											2024-06-15 02:21:18 +02:00
										 |  |  |         new ThemeViewGUI({ | 
					
						
							| 
									
										
										
										
											2024-06-18 03:33:11 +02:00
										 |  |  |             target, | 
					
						
							| 
									
										
										
										
											2024-06-16 16:06:26 +02:00
										 |  |  |             props: { state }, | 
					
						
							| 
									
										
										
										
											2024-06-15 02:21:18 +02:00
										 |  |  |         }) | 
					
						
							| 
									
										
										
										
											2024-06-20 04:21:29 +02:00
										 |  |  |         childs.forEach((ch) => target.removeChild(ch)) | 
					
						
							| 
									
										
										
										
											2024-04-13 02:40:21 +02:00
										 |  |  |         Array.from(document.getElementsByClassName("delete-on-load")).forEach((el) => { | 
					
						
							| 
									
										
										
										
											2024-03-21 22:39:36 +01:00
										 |  |  |             el.parentElement.removeChild(el) | 
					
						
							|  |  |  |         }) | 
					
						
							| 
									
										
										
										
											2024-02-18 15:59:28 +01:00
										 |  |  |     } catch (err) { | 
					
						
							|  |  |  |         console.error("Error while initializing: ", err, err.stack) | 
					
						
							|  |  |  |         const customDefinition = DetermineLayout.getCustomDefinition() | 
					
						
							|  |  |  |         new Combine([ | 
					
						
							| 
									
										
										
										
											2024-04-23 15:35:18 +02:00
										 |  |  |             new FixedUiElement(err.toString().split("\n").join("<br/>")).SetClass("block alert"), | 
					
						
							| 
									
										
										
										
											2024-01-16 23:03:33 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-02-18 15:59:28 +01:00
										 |  |  |             customDefinition?.length > 0 | 
					
						
							| 
									
										
										
										
											2024-06-20 04:21:29 +02:00
										 |  |  |                 ? new SubtleButton( | 
					
						
							|  |  |  |                       new SvelteUIElement(ArrowDownTray), | 
					
						
							|  |  |  |                       "Download the raw file" | 
					
						
							|  |  |  |                   ).onClick(() => | 
					
						
							|  |  |  |                       Utils.offerContentsAsDownloadableFile( | 
					
						
							|  |  |  |                           DetermineLayout.getCustomDefinition(), | 
					
						
							|  |  |  |                           "mapcomplete-theme.json", | 
					
						
							|  |  |  |                           { mimetype: "application/json" } | 
					
						
							|  |  |  |                       ) | 
					
						
							| 
									
										
										
										
											2024-04-13 02:40:21 +02:00
										 |  |  |                   ) | 
					
						
							|  |  |  |                 : undefined, | 
					
						
							| 
									
										
										
										
											2024-02-18 15:59:28 +01:00
										 |  |  |         ]).AttachTo("maindiv") | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2023-06-26 11:11:22 +02:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2024-02-18 15:59:28 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-04-13 02:40:21 +02:00
										 |  |  | main().then((_) => {}) |