mapcomplete/Customizations/AllKnownLayouts.ts

138 lines
5.5 KiB
TypeScript
Raw Normal View History

2021-02-26 17:22:24 +01:00
import AllKnownLayers from "./AllKnownLayers";
2021-04-10 03:50:44 +02:00
import * as known_themes from "../assets/generated/known_layers_and_themes.json"
import LayoutConfig from "../Models/ThemeConfig/LayoutConfig";
import LayerConfig from "../Models/ThemeConfig/LayerConfig";
2021-11-08 02:36:01 +01:00
import BaseUIElement from "../UI/BaseUIElement";
import Combine from "../UI/Base/Combine";
import Title from "../UI/Base/Title";
import List from "../UI/Base/List";
2020-07-05 18:59:47 +02:00
export class AllKnownLayouts {
2020-09-17 13:13:02 +02:00
2021-04-10 03:50:44 +02:00
public static allKnownLayouts: Map<string, LayoutConfig> = AllKnownLayouts.AllLayouts();
public static layoutsList: LayoutConfig[] = AllKnownLayouts.GenerateOrderedList(AllKnownLayouts.allKnownLayouts);
2021-11-07 16:34:51 +01:00
public static AllPublicLayers() {
const allLayers: LayerConfig[] = []
const seendIds = new Set<string>()
const publicLayouts = AllKnownLayouts.layoutsList.filter(l => !l.hideFromOverview)
for (const layout of publicLayouts) {
2021-11-07 16:34:51 +01:00
if (layout.hideFromOverview) {
continue
}
for (const layer of layout.layers) {
2021-11-07 16:34:51 +01:00
if (seendIds.has(layer.id)) {
continue
}
seendIds.add(layer.id)
allLayers.push(layer)
}
}
return allLayers
}
2021-11-07 16:34:51 +01:00
2021-11-08 02:36:01 +01:00
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))
2021-11-08 14:18:45 +01:00
.map((l) => l.GenerateDocumentation(themesPerLayer.get(l.id), AllKnownLayers.added_by_default.indexOf(l.id) >= 0, AllKnownLayers.no_include.indexOf(l.id) < 0)),
2021-11-08 02:36:01 +01:00
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)))
])
}
2021-04-10 03:50:44 +02:00
private static GenerateOrderedList(allKnownLayouts: Map<string, LayoutConfig>): LayoutConfig[] {
2021-04-22 03:57:50 +02:00
const keys = ["personal", "cyclofix", "hailhydrant", "bookcases", "toilets", "aed"]
2021-04-10 03:50:44 +02:00
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 {
2021-03-21 01:49:08 +01:00
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")
);
2020-07-31 04:58:58 +02:00
2021-03-21 01:49:08 +01:00
}
return layout;
}
2020-07-25 01:07:02 +02:00
2020-11-11 16:23:49 +01:00
private static AllLayouts(): Map<string, LayoutConfig> {
2021-04-10 03:50:44 +02:00
const dict: Map<string, LayoutConfig> = new Map();
for (const layoutConfigJson of known_themes.themes) {
2021-10-11 23:52:17 +02:00
// @ts-ignore
2021-04-10 03:50:44 +02:00
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") {
2021-02-26 17:22:24 +01:00
layer = layout.layers[i] = AllKnownLayers.sharedLayers.get(layer);
2021-03-21 01:49:08 +01:00
if (layer === undefined) {
2021-02-26 17:22:24 +01:00
console.log("Defined layers are ", AllKnownLayers.sharedLayers.keys())
throw `Layer ${layer} was not found or defined - probably a type was made`
}
}
2020-07-25 01:07:02 +02:00
}
}
2021-04-10 03:50:44 +02:00
return dict;
2020-07-05 18:59:47 +02:00
}
2020-07-05 18:59:47 +02:00
}