From 0c22b15c8d67895352029ccae727e14201ed817c Mon Sep 17 00:00:00 2001 From: pietervdvn Date: Tue, 21 Dec 2021 18:35:15 +0100 Subject: [PATCH] First part of a huge refactoring --- Customizations/AllKnownLayers.ts | 131 ------------------------------- all_themes_index.ts | 104 ++++++++++++++++++++++++ index_theme.ts.template | 101 ++++++++++++++++++++++++ 3 files changed, 205 insertions(+), 131 deletions(-) delete mode 100644 Customizations/AllKnownLayers.ts create mode 100644 all_themes_index.ts create mode 100644 index_theme.ts.template diff --git a/Customizations/AllKnownLayers.ts b/Customizations/AllKnownLayers.ts deleted file mode 100644 index 4f142cfeb..000000000 --- a/Customizations/AllKnownLayers.ts +++ /dev/null @@ -1,131 +0,0 @@ -import * as known_layers from "../assets/generated/known_layers_and_themes.json" -import {Utils} from "../Utils"; -import LayerConfig from "../Models/ThemeConfig/LayerConfig"; -import {TagRenderingConfigJson} from "../Models/ThemeConfig/Json/TagRenderingConfigJson"; -import SharedTagRenderings from "./SharedTagRenderings"; -import {LayerConfigJson} from "../Models/ThemeConfig/Json/LayerConfigJson"; -import WithContextLoader from "../Models/ThemeConfig/WithContextLoader"; - -export default class AllKnownLayers { - - public static inited = (_ => { - WithContextLoader.getKnownTagRenderings = (id => AllKnownLayers.getTagRendering(id)) - return true - })() - - public static runningGenerateScript = false; - - // Must be below the list... - public static sharedLayers: Map = AllKnownLayers.getSharedLayers(); - public static sharedLayersJson: Map = AllKnownLayers.getSharedLayersJson(); - - - public static added_by_default: string[] = ["gps_location", "gps_location_history", "home_location", "gps_track"] - public static no_include: string[] = ["conflation", "left_right_style", "split_point","current_view"] - /** - * Layer IDs of layers which have special properties through built-in hooks - */ - public static priviliged_layers: string[] = [...AllKnownLayers.added_by_default, "type_node", ...AllKnownLayers.no_include] - - /** - * Gets the appropriate tagRenderingJSON - * Allows to steal them from other layers. - * This will add the tags of the layer to the configuration though! - * @param renderingId - */ - static getTagRendering(renderingId: string): TagRenderingConfigJson[] { - if (renderingId.indexOf(".") < 0) { - const found = SharedTagRenderings.SharedTagRenderingJson.get(renderingId) - if(found === undefined){ - return [] - } - return [found] - } - - const [layerId, id] = renderingId.split(".") - const layer = AllKnownLayers.getSharedLayersJson().get(layerId) - if (layer === undefined) { - if (AllKnownLayers.runningGenerateScript) { - // Probably generating the layer overview - return [{ - id: "dummy" - }] - } - throw "Builtin layer " + layerId + " not found" - } - - const renderings = layer?.tagRenderings ?? [] - if (id === "*") { - return JSON.parse(JSON.stringify(renderings)) - } - - const selectByGroup = id.startsWith("*") - const expectedGroupName = id.substring(1) - - const allValidValues = [] - for (const rendering of renderings) { - if ((!selectByGroup && rendering["id"] === id) || (selectByGroup && rendering["group"] === expectedGroupName)) { - const found = JSON.parse(JSON.stringify(rendering)) - if (found.condition === undefined) { - found.condition = layer.source.osmTags - } else { - found.condition = {and: [found.condition, layer.source.osmTags]} - } - allValidValues.push(found) - } - } - if(allValidValues.length === 0){ - - throw `The rendering with id ${id} was not found in the builtin layer ${layerId}. Try one of ${Utils.NoNull(renderings.map(r => r["id"])).join(", ")}` - } - return allValidValues - } - - private static getSharedLayers(): Map { - const sharedLayers = new Map(); - for (const layer of known_layers.layers) { - try { - // @ts-ignore - const parsed = new LayerConfig(layer, "shared_layers") - sharedLayers.set(layer.id, parsed); - } catch (e) { - if (!Utils.runningFromConsole) { - console.error("CRITICAL: Could not parse a layer configuration!", layer.id, " due to", e) - } - } - } - - for (const layout of known_layers.themes) { - for (const layer of layout.layers) { - if (typeof layer === "string") { - continue; - } - if (layer.builtin !== undefined) { - // This is a builtin layer of which stuff is overridden - skip - continue; - } - try { - const parsed = new LayerConfig(layer, "shared_layer_in_theme") - sharedLayers.set(layer.id, parsed); - sharedLayers[layer.id] = parsed; - } catch (e) { - if (!Utils.runningFromConsole) { - console.error("Could not parse a layer in theme ", layout.id, "due to", e) - } - } - } - } - - return sharedLayers; - } - - private static getSharedLayersJson(): Map { - const sharedLayers = new Map(); - for (const layer of known_layers.layers) { - sharedLayers.set(layer.id, layer); - sharedLayers[layer.id] = layer; - } - return sharedLayers; - } - -} diff --git a/all_themes_index.ts b/all_themes_index.ts new file mode 100644 index 000000000..9364b5d8d --- /dev/null +++ b/all_themes_index.ts @@ -0,0 +1,104 @@ +import {FixedUiElement} from "./UI/Base/FixedUiElement"; +import {QueryParameters} from "./Logic/Web/QueryParameters"; +import Combine from "./UI/Base/Combine"; +import AvailableBaseLayers from "./Logic/Actors/AvailableBaseLayers"; +import MinimapImplementation from "./UI/Base/MinimapImplementation"; +import {Utils} from "./Utils"; +import AllThemesGui from "./UI/AllThemesGui"; +import DetermineLayout from "./Logic/DetermineLayout"; +import LayoutConfig from "./Models/ThemeConfig/LayoutConfig"; +import DefaultGUI from "./UI/DefaultGUI"; +import State from "./State"; +import AvailableBaseLayersImplementation from "./Logic/Actors/AvailableBaseLayersImplementation"; +import ShowOverlayLayerImplementation from "./UI/ShowDataLayer/ShowOverlayLayerImplementation"; +import {DefaultGuiState} from "./UI/DefaultGuiState"; + +// Workaround for a stupid crash: inject some functions which would give stupid circular dependencies or crash the other nodejs scripts running from console +MinimapImplementation.initialize() +AvailableBaseLayers.implement(new AvailableBaseLayersImplementation()) +ShowOverlayLayerImplementation.Implement(); +// Miscelleanous +Utils.DisableLongPresses() + +// --------------------- Special actions based on the parameters ----------------- +// @ts-ignore +if (location.href.startsWith("http://buurtnatuur.be")) { + // Reload the https version. This is important for the 'locate me' button + window.location.replace("https://buurtnatuur.be"); +} + + +class Init { + public static Init(layoutToUse: LayoutConfig, encoded: string) { + + if (layoutToUse === null) { + // Something went wrong, error message is already on screen + return; + } + + if (layoutToUse === undefined) { + // No layout found + new AllThemesGui() + return; + } + + // Workaround/legacy to keep the old paramters working as I renamed some of them + if (layoutToUse?.id === "cyclofix") { + const legacy = QueryParameters.GetQueryParameter("layer-bike_shops", "true", "Legacy - keep De Fietsambassade working"); + const correct = QueryParameters.GetQueryParameter("layer-bike_shop", "true", "Legacy - keep De Fietsambassade working") + if (legacy.data !== "true") { + correct.setData(legacy.data) + } + console.log("layer-bike_shop toggles: legacy:", legacy.data, "new:", correct.data) + + const legacyCafe = QueryParameters.GetQueryParameter("layer-bike_cafes", "true", "Legacy - keep De Fietsambassade working") + const correctCafe = QueryParameters.GetQueryParameter("layer-bike_cafe", "true", "Legacy - keep De Fietsambassade working") + if (legacyCafe.data !== "true") { + correctCafe.setData(legacy.data) + } + } + + + const guiState = new DefaultGuiState() + State.state = new State(layoutToUse); + DefaultGuiState.state = guiState; + // This 'leaks' the global state via the window object, useful for debugging + // @ts-ignore + 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); + }); + } + } +} + + +document.getElementById("decoration-desktop").remove(); +new Combine(["Initializing...
", + new FixedUiElement("If this message persist, something went wrong - click here to try again") + .SetClass("link-underline small") + .onClick(() => { + localStorage.clear(); + window.location.reload(true); + + })]) + .AttachTo("centermessage"); // Add an initialization and reset button if something goes wrong + +// @ts-ignore +if(typeof theme === "undefined"){ + DetermineLayout.GetLayout().then(value => { + console.log("Got ", value) + Init.Init(value[0], value[1]) + }).catch(err => { + console.error("Error while initializing: ", err, err.stack) + }) +} + + diff --git a/index_theme.ts.template b/index_theme.ts.template new file mode 100644 index 000000000..e8718f0b5 --- /dev/null +++ b/index_theme.ts.template @@ -0,0 +1,101 @@ +import {FixedUiElement} from "./UI/Base/FixedUiElement"; +import {QueryParameters} from "./Logic/Web/QueryParameters"; +import Combine from "./UI/Base/Combine"; +import AvailableBaseLayers from "./Logic/Actors/AvailableBaseLayers"; +import MinimapImplementation from "./UI/Base/MinimapImplementation"; +import {Utils} from "./Utils"; +import AllThemesGui from "./UI/AllThemesGui"; +import DetermineLayout from "./Logic/DetermineLayout"; +import LayoutConfig from "./Models/ThemeConfig/LayoutConfig"; +import DefaultGUI from "./UI/DefaultGUI"; +import State from "./State"; +import AvailableBaseLayersImplementation from "./Logic/Actors/AvailableBaseLayersImplementation"; +import ShowOverlayLayerImplementation from "./UI/ShowDataLayer/ShowOverlayLayerImplementation"; +import {DefaultGuiState} from "./UI/DefaultGuiState"; + +// Workaround for a stupid crash: inject some functions which would give stupid circular dependencies or crash the other nodejs scripts running from console +MinimapImplementation.initialize() +AvailableBaseLayers.implement(new AvailableBaseLayersImplementation()) +ShowOverlayLayerImplementation.Implement(); +// Miscelleanous +Utils.DisableLongPresses() + +// --------------------- Special actions based on the parameters ----------------- +// @ts-ignore +if (location.href.startsWith("http://buurtnatuur.be")) { + // Reload the https version. This is important for the 'locate me' button + window.location.replace("https://buurtnatuur.be"); +} + + +class Init { + public static Init(layoutToUse: LayoutConfig, encoded: string) { + + if (layoutToUse === null) { + // Something went wrong, error message is already on screen + return; + } + + if (layoutToUse === undefined) { + // No layout found + new AllThemesGui() + return; + } + + // Workaround/legacy to keep the old paramters working as I renamed some of them + if (layoutToUse?.id === "cyclofix") { + const legacy = QueryParameters.GetQueryParameter("layer-bike_shops", "true", "Legacy - keep De Fietsambassade working"); + const correct = QueryParameters.GetQueryParameter("layer-bike_shop", "true", "Legacy - keep De Fietsambassade working") + if (legacy.data !== "true") { + correct.setData(legacy.data) + } + console.log("layer-bike_shop toggles: legacy:", legacy.data, "new:", correct.data) + + const legacyCafe = QueryParameters.GetQueryParameter("layer-bike_cafes", "true", "Legacy - keep De Fietsambassade working") + const correctCafe = QueryParameters.GetQueryParameter("layer-bike_cafe", "true", "Legacy - keep De Fietsambassade working") + if (legacyCafe.data !== "true") { + correctCafe.setData(legacy.data) + } + } + + + const guiState = new DefaultGuiState() + State.state = new State(layoutToUse); + DefaultGuiState.state = guiState; + // This 'leaks' the global state via the window object, useful for debugging + // @ts-ignore + 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); + }); + } + } +} + + +document.getElementById("decoration-desktop").remove(); +new Combine(["Initializing...
", + new FixedUiElement("If this message persist, something went wrong - click here to try again") + .SetClass("link-underline small") + .onClick(() => { + localStorage.clear(); + window.location.reload(true); + + })]) + .AttachTo("centermessage"); // Add an initialization and reset button if something goes wrong + +// @ts-ignore +DetermineLayout.GetLayout().then(value => { + console.log("Got ", value) + Init.Init(value[0], value[1]) + }).catch(err => { + console.error("Error while initializing: ", err, err.stack) + }) + +