forked from MapComplete/MapComplete
		
	Fix custom layouts
This commit is contained in:
		
							parent
							
								
									8e2e367a0c
								
							
						
					
					
						commit
						4b6769d601
					
				
					 5 changed files with 76 additions and 23 deletions
				
			
		
							
								
								
									
										56
									
								
								404.html
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										56
									
								
								404.html
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,56 @@ | |||
| <!DOCTYPE html> | ||||
| <html lang="en"> | ||||
| <head> | ||||
|     <meta charset="UTF-8"> | ||||
|     <meta content="width=device-width, initial-scale=1.0, user-scalable=no" name="viewport"> | ||||
|     <link href="./css/mobile.css" rel="stylesheet"/> | ||||
|     <link href="./css/tagrendering.css" rel="stylesheet"/> | ||||
|     <link href="./css/index-tailwind-output.css" rel="stylesheet"/> | ||||
|     <meta content="website" property="og:type"> | ||||
| 
 | ||||
|     <title>MapComplete - page not found</title> | ||||
|     <link href="./index.manifest" rel="manifest"> | ||||
|     <link href="./assets/svg/add.svg" rel="icon" sizes="any" type="image/svg+xml"> | ||||
|     <meta content="MapComplete - Page not found" property="og:title"> | ||||
|     <meta content="MapComplete is a platform to visualize OpenStreetMap on a specific topic and to easily contribute data back to it." | ||||
|           property="og:description"> | ||||
| 
 | ||||
|     <link href="./assets/generated/svg_mapcomplete_logo512.png" rel="apple-touch-icon" sizes="512x512"> | ||||
|     <link href="./assets/generated/svg_mapcomplete_logo384.png" rel="apple-touch-icon" sizes="384x384"> | ||||
|     <link href="./assets/generated/svg_mapcomplete_logo192.png" rel="apple-touch-icon" sizes="192x192"> | ||||
|     <link href="./assets/generated/svg_mapcomplete_logo180.png" rel="apple-touch-icon" sizes="180x180"> | ||||
|     <link href="./assets/generated/svg_mapcomplete_logo152.png" rel="apple-touch-icon" sizes="152x152"> | ||||
|     <link href="./assets/generated/svg_mapcomplete_logo144.png" rel="apple-touch-icon" sizes="144x144"> | ||||
|     <link href="./assets/generated/svg_mapcomplete_logo128.png" rel="apple-touch-icon" sizes="128x128"> | ||||
|     <link href="./assets/generated/svg_mapcomplete_logo120.png" rel="apple-touch-icon" sizes="120x120"> | ||||
|     <link href="./assets/generated/svg_mapcomplete_logo96.png" rel="apple-touch-icon" sizes="96x96"> | ||||
|     <link href="./assets/generated/svg_mapcomplete_logo72.png" rel="apple-touch-icon" sizes="72x72"> | ||||
| 
 | ||||
| 
 | ||||
|     <style> | ||||
|         #decoration-desktop img { | ||||
|             width: 100%; | ||||
|             height: 100%; | ||||
|         } | ||||
|     </style> | ||||
| 
 | ||||
| </head> | ||||
| <body> | ||||
| 
 | ||||
| <div id="decoration-desktop" style="position: fixed; left: 1em; bottom: 1em; width:35vh; height:35vh;"> | ||||
|     <!-- A nice decoration while loading or on errors --> | ||||
|     <!-- DECORATION 0 START --> | ||||
|     <img src="./assets/svg/add.svg"/> | ||||
|     <!-- DECORATION 0 END --> | ||||
| </div> | ||||
| 
 | ||||
| <div class="clutter absolute h-24 left-24 right-24 top-56 text-xl text-center" | ||||
|      id="maindiv" style="z-index: 4000"> | ||||
|     Not found... | ||||
| </div> | ||||
| 
 | ||||
| <script src="./notfound.ts"></script> | ||||
| <script async data-goatcounter="https://pietervdvn.goatcounter.com/count" src="//gc.zgo.at/count.js"></script> | ||||
| 
 | ||||
| </body> | ||||
| </html> | ||||
|  | @ -20,23 +20,18 @@ export default class DetermineLayout { | |||
|     /** | ||||
|      * Gets the correct layout for this website | ||||
|      */ | ||||
|     public static async GetLayout(): Promise<[LayoutConfig, string]> { | ||||
|     public static async GetLayout(): Promise<LayoutConfig> { | ||||
| 
 | ||||
|         const loadCustomThemeParam = QueryParameters.GetQueryParameter("userlayout", "false", "If not 'false', a custom (non-official) theme is loaded. This custom layout can be done in multiple ways: \n\n- The hash of the URL contains a base64-encoded .json-file containing the theme definition\n- The hash of the URL contains a lz-compressed .json-file, as generated by the custom theme generator\n- The parameter itself is an URL, in which case that URL will be downloaded. It should point to a .json of a theme") | ||||
|         const layoutFromBase64 = decodeURIComponent(loadCustomThemeParam.data); | ||||
| 
 | ||||
|         if (layoutFromBase64.startsWith("http")) { | ||||
|             const layout = await DetermineLayout.LoadRemoteTheme(layoutFromBase64) | ||||
|             return [layout, undefined] | ||||
|             return await DetermineLayout.LoadRemoteTheme(layoutFromBase64) | ||||
|         } | ||||
| 
 | ||||
|         if (layoutFromBase64 !== "false") { | ||||
|             // We have to load something from the hash (or from disk)
 | ||||
|             let loaded = DetermineLayout.LoadLayoutFromHash(loadCustomThemeParam); | ||||
|             if (loaded === null) { | ||||
|                 return [null, undefined] | ||||
|             } | ||||
|             return loaded | ||||
|             return DetermineLayout.LoadLayoutFromHash(loadCustomThemeParam) | ||||
|         } | ||||
| 
 | ||||
|         let layoutId: string = undefined | ||||
|  | @ -64,12 +59,12 @@ export default class DetermineLayout { | |||
|             } | ||||
|         } | ||||
| 
 | ||||
|         return [layoutToUse, undefined] | ||||
|         return layoutToUse | ||||
|     } | ||||
| 
 | ||||
|     public static LoadLayoutFromHash( | ||||
|         userLayoutParam: UIEventSource<string> | ||||
|     ): [LayoutConfig, string] | null { | ||||
|     ): LayoutConfig | null { | ||||
|         let hash = location.hash.substr(1); | ||||
|         try { | ||||
|             // layoutFromBase64 contains the name of the theme. This is partly to do tracking with goat counter
 | ||||
|  | @ -109,7 +104,9 @@ export default class DetermineLayout { | |||
| 
 | ||||
|             const knownLayersDict = new Map<string, LayerConfigJson>() | ||||
|             for (const key in known_layers["default"]) { | ||||
|                 knownLayersDict.set(key, known_layers["default"][key]) | ||||
|                const layer = known_layers["default"][key] | ||||
|                 console.log("Found shared layer "+layer.id) | ||||
|                 knownLayersDict.set(layer.id, layer) | ||||
|             } | ||||
|              | ||||
|             const converState = { | ||||
|  | @ -123,7 +120,7 @@ export default class DetermineLayout { | |||
|              | ||||
|             const layoutToUse = new LayoutConfig(json, false); | ||||
|             userLayoutParam.setData(layoutToUse.id); | ||||
|             return [layoutToUse, btoa(Utils.MinifyJSON(JSON.stringify(json)))]; | ||||
|             return layoutToUse; | ||||
|         } catch (e) { | ||||
|             console.error(e) | ||||
|             if (hash === undefined || hash.length < 10) { | ||||
|  |  | |||
|  | @ -406,7 +406,12 @@ export class UpdateLegacyLayer extends DesugaringStep<LayerConfigJson | string | | |||
|         } | ||||
| 
 | ||||
|         if (config.tagRenderings !== undefined) { | ||||
|             let i =0; | ||||
|             for (const tagRendering of config.tagRenderings) { | ||||
|                 i++; | ||||
|                 if(typeof tagRendering === "string" || tagRendering["builtin"] !== undefined){ | ||||
|                     continue | ||||
|                 } | ||||
|                 if (tagRendering["id"] === undefined) { | ||||
| 
 | ||||
|                     if (tagRendering["#"] !== undefined) { | ||||
|  | @ -414,6 +419,8 @@ export class UpdateLegacyLayer extends DesugaringStep<LayerConfigJson | string | | |||
|                         delete tagRendering["#"] | ||||
|                     } else if (tagRendering["freeform"]?.key !== undefined) { | ||||
|                         tagRendering["id"] = config.id + "-" + tagRendering["freeform"]["key"] | ||||
|                     }else{ | ||||
|                         tagRendering["id"] = "tr-"+i | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|  |  | |||
							
								
								
									
										13
									
								
								index.ts
									
										
									
									
									
								
							
							
						
						
									
										13
									
								
								index.ts
									
										
									
									
									
								
							|  | @ -20,7 +20,7 @@ ShowOverlayLayerImplementation.Implement(); | |||
| Utils.DisableLongPresses() | ||||
| 
 | ||||
| class Init { | ||||
|     public static Init(layoutToUse: LayoutConfig, encoded: string) { | ||||
|     public static Init(layoutToUse: LayoutConfig) { | ||||
| 
 | ||||
|         if (layoutToUse === null) { | ||||
|             // Something went wrong, error message is already on screen
 | ||||
|  | @ -41,14 +41,7 @@ class Init { | |||
|         window.mapcomplete_state = State.state; | ||||
|         new DefaultGUI(State.state, guiState) | ||||
| 
 | ||||
|         if (encoded !== undefined && encoded.length > 10) { | ||||
|             // We save the layout to the user settings and local storage
 | ||||
|             State.state.osmConnection.OnLoggedIn(() => { | ||||
|                 State.state.osmConnection | ||||
|                     .GetLongPreference("installed-theme-" + layoutToUse.id) | ||||
|                     .setData(encoded); | ||||
|             }); | ||||
|         } | ||||
|         | ||||
|     } | ||||
| } | ||||
| 
 | ||||
|  | @ -67,7 +60,7 @@ new Combine(["Initializing... <br/>", | |||
| // @ts-ignore
 | ||||
| DetermineLayout.GetLayout().then(value => { | ||||
|     console.log("Got ", value) | ||||
|     Init.Init(value[0], value[1]) | ||||
|     Init.Init(value) | ||||
|     }).catch(err => { | ||||
|         console.error("Error while initializing: ", err, err.stack) | ||||
|     }) | ||||
|  |  | |||
|  | @ -47,7 +47,7 @@ | |||
|     "deploy:production": "cd ~/git/mapcomplete.github.io/ && git pull && cd - && rm -rf ./assets/generated && npm run prepare-deploy && npm run optimize-images && rm -rf ~/git/mapcomplete.github.io/* && cp -r dist/* ~/git/mapcomplete.github.io/ && cd ~/git/mapcomplete.github.io/ && echo \"mapcomplete.osm.be\" > CNAME  && git add * && git commit -m 'New MapComplete Version' && git push && cd - && npm run clean && npm run gittag", | ||||
|     "gittag": "ts-node scripts/printVersion.ts | bash", | ||||
|     "lint": "tslint --project . -c tslint.json '**.ts' ", | ||||
|     "clean": "rm -rf .cache/ && (find *.html | grep -v \"\\(404|index\\|land\\|test\\|preferences\\|customGenerator\\|professional\\|automaton\\|theme\\).html\" | xargs rm) && (ls | grep \"^index_[a-zA-Z_]\\+\\.ts$\" | xargs rm) && (ls | grep \".*.webmanifest$\" | xargs rm)", | ||||
|     "clean": "rm -rf .cache/ && (find *.html | grep -v \"\\(404\\|index\\|land\\|test\\|preferences\\|customGenerator\\|professional\\|automaton\\|theme\\).html\" | xargs rm) && (ls | grep \"^index_[a-zA-Z_]\\+\\.ts$\" | xargs rm) && (ls | grep \".*.webmanifest$\" | xargs rm)", | ||||
|     "generate:dependency-graph": "node_modules/.bin/depcruise --exclude \"^node_modules\" --output-type dot Logic/State/MapState.ts > dependencies.dot && dot dependencies.dot -T svg -o dependencies.svg && rm dependencies.dot", | ||||
|     "genPostal": " ts-node ./scripts/postal_code_tools/createRoutablePoint.ts /home/pietervdvn/Downloads/postal_codes/postal_codes_town_hall_points.geojson /home/pietervdvn/Downloads/31370/Postcodes.geojson\n" | ||||
|   }, | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue