forked from MapComplete/MapComplete
		
	
		
			
				
	
	
		
			137 lines
		
	
	
	
		
			5.5 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			137 lines
		
	
	
	
		
			5.5 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
| import AllKnownLayers from "./AllKnownLayers";
 | |
| import * as known_themes from "../assets/generated/known_layers_and_themes.json"
 | |
| import LayoutConfig from "../Models/ThemeConfig/LayoutConfig";
 | |
| import LayerConfig from "../Models/ThemeConfig/LayerConfig";
 | |
| import BaseUIElement from "../UI/BaseUIElement";
 | |
| import Combine from "../UI/Base/Combine";
 | |
| import Title from "../UI/Base/Title";
 | |
| import List from "../UI/Base/List";
 | |
| 
 | |
| export class AllKnownLayouts {
 | |
| 
 | |
| 
 | |
|     public static allKnownLayouts: Map<string, LayoutConfig> = AllKnownLayouts.AllLayouts();
 | |
|     public static layoutsList: LayoutConfig[] = AllKnownLayouts.GenerateOrderedList(AllKnownLayouts.allKnownLayouts);
 | |
| 
 | |
|     public static AllPublicLayers() {
 | |
|         const allLayers: LayerConfig[] = []
 | |
|         const seendIds = new Set<string>()
 | |
|         const publicLayouts = AllKnownLayouts.layoutsList.filter(l => !l.hideFromOverview)
 | |
|         for (const layout of publicLayouts) {
 | |
|             if (layout.hideFromOverview) {
 | |
|                 continue
 | |
|             }
 | |
|             for (const layer of layout.layers) {
 | |
|                 if (seendIds.has(layer.id)) {
 | |
|                     continue
 | |
|                 }
 | |
|                 seendIds.add(layer.id)
 | |
|                 allLayers.push(layer)
 | |
|             }
 | |
| 
 | |
|         }
 | |
|         return allLayers
 | |
|     }
 | |
| 
 | |
|     public static GenLayerOverviewText(): BaseUIElement {
 | |
|         for (const id of AllKnownLayers.priviliged_layers) {
 | |
|             if (!AllKnownLayers.sharedLayers.has(id)) {
 | |
|                 throw "Priviliged layer definition not found: " + id
 | |
|             }
 | |
|         }
 | |
|         const allLayers: LayerConfig[] = Array.from(AllKnownLayers.sharedLayers.values())
 | |
| 
 | |
|         const themesPerLayer = new Map<string, string[]>()
 | |
| 
 | |
|         for (const layout of Array.from(AllKnownLayouts.allKnownLayouts.values())) {
 | |
|             if(layout.hideFromOverview){
 | |
|                 continue
 | |
|             }
 | |
|             for (const layer of layout.layers) {
 | |
|                 if (!themesPerLayer.has(layer.id)) {
 | |
|                     themesPerLayer.set(layer.id, [])
 | |
|                 }
 | |
|                 themesPerLayer.get(layer.id).push(layout.id)
 | |
|             }
 | |
|         }
 | |
| 
 | |
| 
 | |
|         let popularLayerCutoff = 2;
 | |
|         const popupalLayers = allLayers.filter((layer) => themesPerLayer.get(layer.id)?.length >= 2)
 | |
|             .filter(layer => AllKnownLayers.priviliged_layers.indexOf(layer.id) < 0)
 | |
| 
 | |
|         return new Combine([
 | |
|             new Title("Special and other useful layers", 1),
 | |
|             "MapComplete has a few data layers available in the theme which have special properties through builtin-hooks. Furthermore, there are some normal layers (which are built from normal Theme-config files) but are so general that they get a mention here.",
 | |
|             new Title("Priviliged layers", 1),
 | |
|             new List(AllKnownLayers.priviliged_layers.map(id => "[" + id + "](#" + id + ")")),
 | |
|             ...AllKnownLayers.priviliged_layers
 | |
|                 .map(id => AllKnownLayers.sharedLayers.get(id))
 | |
|                 .map((l) => l.GenerateDocumentation(themesPerLayer.get(l.id), AllKnownLayers.added_by_default.indexOf(l.id) >= 0, AllKnownLayers.no_include.indexOf(l.id) < 0)),
 | |
|             new Title("Frequently reused layers", 1),
 | |
|             "The following layers are used by at least "+popularLayerCutoff+" mapcomplete themes and might be interesting for your custom theme too",
 | |
|             new List(popupalLayers.map(layer => "[" + layer.id + "](#" + layer.id + ")")),
 | |
|             ...popupalLayers.map((layer) => layer.GenerateDocumentation(themesPerLayer.get(layer.id)))
 | |
|         ])
 | |
| 
 | |
| 
 | |
|     }
 | |
| 
 | |
|     private static GenerateOrderedList(allKnownLayouts: Map<string, LayoutConfig>): LayoutConfig[] {
 | |
|         const keys = ["personal", "cyclofix", "hailhydrant", "bookcases", "toilets", "aed"]
 | |
|         const list = []
 | |
|         for (const key of keys) {
 | |
|             list.push(allKnownLayouts.get(key))
 | |
|         }
 | |
|         allKnownLayouts.forEach((layout, key) => {
 | |
|             if (keys.indexOf(key) < 0) {
 | |
|                 list.push(layout)
 | |
|             }
 | |
|         })
 | |
|         return list;
 | |
|     }
 | |
| 
 | |
|     private static AddGhostBikes(layout: LayoutConfig): LayoutConfig {
 | |
|         const now = new Date();
 | |
|         const m = now.getMonth() + 1;
 | |
|         const day = new Date().getDate() + 1;
 | |
|         const date = day + "/" + m;
 | |
|         if (date === "31/10" || date === "1/11" || date === "2/11") {
 | |
|             console.log("The current date is ", date, ", which means we remember our dead")
 | |
|             // Around Halloween/Fiesta de muerte/Allerzielen, we remember the dead
 | |
|             layout.layers.push(
 | |
|                 AllKnownLayers.sharedLayers.get("ghost_bike")
 | |
|             );
 | |
| 
 | |
|         }
 | |
|         return layout;
 | |
| 
 | |
|     }
 | |
| 
 | |
|     private static AllLayouts(): Map<string, LayoutConfig> {
 | |
|         const dict: Map<string, LayoutConfig> = new Map();
 | |
|         for (const layoutConfigJson of known_themes.themes) {
 | |
|             // @ts-ignore
 | |
|             const layout = new LayoutConfig(layoutConfigJson, true)
 | |
| 
 | |
|             if (layout.id === "cyclofix") {
 | |
|                 AllKnownLayouts.AddGhostBikes(layout)
 | |
|             }
 | |
|             dict.set(layout.id, layout)
 | |
| 
 | |
|             for (let i = 0; i < layout.layers.length; i++) {
 | |
|                 let layer = layout.layers[i];
 | |
|                 if (typeof (layer) === "string") {
 | |
|                     layer = layout.layers[i] = AllKnownLayers.sharedLayers.get(layer);
 | |
|                     if (layer === undefined) {
 | |
|                         console.log("Defined layers are ", AllKnownLayers.sharedLayers.keys())
 | |
|                         throw `Layer ${layer} was not found or defined - probably a type was made`
 | |
|                     }
 | |
|                 }
 | |
| 
 | |
|             }
 | |
|         }
 | |
|         return dict;
 | |
|     }
 | |
| 
 | |
| }
 |