forked from MapComplete/MapComplete
		
	Add overview of all themes if none are defined
This commit is contained in:
		
							parent
							
								
									7a2b99a566
								
							
						
					
					
						commit
						092c12a449
					
				
					 12 changed files with 94 additions and 53 deletions
				
			
		| 
						 | 
					@ -22,7 +22,8 @@ export default class AllTranslationAssets {
 | 
				
			||||||
    ready: new Translation( {"en":"Done!","ca":"Fet.","es":"Hecho.","nl":"Klaar!","fr":"Finis!","gl":"Feito!","de":"Erledigt!"} ),
 | 
					    ready: new Translation( {"en":"Done!","ca":"Fet.","es":"Hecho.","nl":"Klaar!","fr":"Finis!","gl":"Feito!","de":"Erledigt!"} ),
 | 
				
			||||||
    retrying: new Translation( {"en":"Loading data failed. Trying again... ({count})","ca":"La càrrega de dades ha fallat.Tornant-ho a intentar... ({count})","es":"La carga de datos ha fallado.Volviéndolo a probar... ({count})","gl":"A carga dos datos fallou. Tentándoo de novo... ({count})","fr":"Le chargement a échoué. Essayer à nouveau... ({count})","de":"Laden von Daten fehlgeschlagen. Erneuter Versuch... ({count})"} ),
 | 
					    retrying: new Translation( {"en":"Loading data failed. Trying again... ({count})","ca":"La càrrega de dades ha fallat.Tornant-ho a intentar... ({count})","es":"La carga de datos ha fallado.Volviéndolo a probar... ({count})","gl":"A carga dos datos fallou. Tentándoo de novo... ({count})","fr":"Le chargement a échoué. Essayer à nouveau... ({count})","de":"Laden von Daten fehlgeschlagen. Erneuter Versuch... ({count})"} ),
 | 
				
			||||||
},
 | 
					},
 | 
				
			||||||
  general: {    loginWithOpenStreetMap: new Translation( {"en":"Login with OpenStreetMap","ca":"Entra a OpenStreetMap","es":"Entra en OpenStreetMap","nl":"Aanmelden met OpenStreetMap","fr":"Se connecter avec OpenStreeMap","gl":"Inicia a sesión no OpenStreetMap","de":"Anmeldung mit OpenStreetMap"} ),
 | 
					  general: {    index: new Translation( {"#":"This text is shown above the theme buttons when no theme is loaded","en":"<h3>Welcome to MapComplete</h3> MapComplete is an OpenStreetMap-viewer and editor, which shows you information about a specific theme.<br/><br/>Pick a theme below to get started.","nl":"<h3>Welkom bij MapComplete</h3> MapComplete is een OpenStreetMap applicatie waar informatie over een specifiek thema bekeken en aangepast kan worden.<br/><br/>Kies hieronder een thema om te beginnen."} ),
 | 
				
			||||||
 | 
					    loginWithOpenStreetMap: new Translation( {"en":"Login with OpenStreetMap","ca":"Entra a OpenStreetMap","es":"Entra en OpenStreetMap","nl":"Aanmelden met OpenStreetMap","fr":"Se connecter avec OpenStreeMap","gl":"Inicia a sesión no OpenStreetMap","de":"Anmeldung mit OpenStreetMap"} ),
 | 
				
			||||||
    welcomeBack: new Translation( {"en":"You are logged in, welcome back!","ca":"Has entrat, benvingut.","es":"Has entrado, bienvenido.","nl":"Je bent aangemeld. Welkom terug!","fr":"Vous êtes connecté. Bienvenue!","gl":"Iniciaches a sesión, benvido.","de":"Sie sind eingeloggt, willkommen zurück!"} ),
 | 
					    welcomeBack: new Translation( {"en":"You are logged in, welcome back!","ca":"Has entrat, benvingut.","es":"Has entrado, bienvenido.","nl":"Je bent aangemeld. Welkom terug!","fr":"Vous êtes connecté. Bienvenue!","gl":"Iniciaches a sesión, benvido.","de":"Sie sind eingeloggt, willkommen zurück!"} ),
 | 
				
			||||||
    loginToStart: new Translation( {"en":"Login to answer this question","ca":"Entra per contestar aquesta pregunta","es":"Entra para contestar esta pregunta","nl":"Meld je aan om deze vraag te beantwoorden","fr":"Connectez-vous pour répondre à cette question","gl":"Inicia a sesión para responder esta pregunta","de":"Anmelden, um diese Frage zu beantworten"} ),
 | 
					    loginToStart: new Translation( {"en":"Login to answer this question","ca":"Entra per contestar aquesta pregunta","es":"Entra para contestar esta pregunta","nl":"Meld je aan om deze vraag te beantwoorden","fr":"Connectez-vous pour répondre à cette question","gl":"Inicia a sesión para responder esta pregunta","de":"Anmelden, um diese Frage zu beantworten"} ),
 | 
				
			||||||
    search: {      search: new Translation( {"en":"Search a location","ca":"Cerca una ubicació","es":"Busca una ubicación","nl":"Zoek naar een locatie","fr":"Chercher un lieu","gl":"Procurar unha localización","de":"Einen Ort suchen"} ),
 | 
					    search: {      search: new Translation( {"en":"Search a location","ca":"Cerca una ubicació","es":"Busca una ubicación","nl":"Zoek naar een locatie","fr":"Chercher un lieu","gl":"Procurar unha localización","de":"Einen Ort suchen"} ),
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2,7 +2,7 @@ import { Utils } from "../Utils";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default class Constants {
 | 
					export default class Constants {
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    public static vNumber = "0.4.7";
 | 
					    public static vNumber = "0.4.8";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // The user journey states thresholds when a new feature gets unlocked
 | 
					    // The user journey states thresholds when a new feature gets unlocked
 | 
				
			||||||
    public static userJourney = {
 | 
					    public static userJourney = {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										8
									
								
								State.ts
									
										
									
									
									
								
							
							
						
						
									
										8
									
								
								State.ts
									
										
									
									
									
								
							| 
						 | 
					@ -125,11 +125,11 @@ export default class State {
 | 
				
			||||||
        this.layoutToUse.setData(layoutToUse);
 | 
					        this.layoutToUse.setData(layoutToUse);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        const zoom = State.asFloat(
 | 
					        const zoom = State.asFloat(
 | 
				
			||||||
            QueryParameters.GetQueryParameter("z", "" + layoutToUse.startZoom, "The initial/current zoom level")
 | 
					            QueryParameters.GetQueryParameter("z", "" + layoutToUse?.startZoom, "The initial/current zoom level")
 | 
				
			||||||
                .syncWith(LocalStorageSource.Get("zoom")));
 | 
					                .syncWith(LocalStorageSource.Get("zoom")));
 | 
				
			||||||
        const lat = State.asFloat(QueryParameters.GetQueryParameter("lat", "" + layoutToUse.startLat, "The initial/current latitude")
 | 
					        const lat = State.asFloat(QueryParameters.GetQueryParameter("lat", "" + layoutToUse?.startLat, "The initial/current latitude")
 | 
				
			||||||
            .syncWith(LocalStorageSource.Get("lat")));
 | 
					            .syncWith(LocalStorageSource.Get("lat")));
 | 
				
			||||||
        const lon = State.asFloat(QueryParameters.GetQueryParameter("lon", "" + layoutToUse.startLon, "The initial/current longitude of the app")
 | 
					        const lon = State.asFloat(QueryParameters.GetQueryParameter("lon", "" + layoutToUse?.startLon, "The initial/current longitude of the app")
 | 
				
			||||||
            .syncWith(LocalStorageSource.Get("lon")));
 | 
					            .syncWith(LocalStorageSource.Get("lon")));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -192,7 +192,7 @@ export default class State {
 | 
				
			||||||
            testParam === "true",
 | 
					            testParam === "true",
 | 
				
			||||||
            QueryParameters.GetQueryParameter("oauth_token", undefined,
 | 
					            QueryParameters.GetQueryParameter("oauth_token", undefined,
 | 
				
			||||||
                "Used to complete the login"),
 | 
					                "Used to complete the login"),
 | 
				
			||||||
            layoutToUse.id,
 | 
					            layoutToUse?.id,
 | 
				
			||||||
            true
 | 
					            true
 | 
				
			||||||
        );
 | 
					        );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -78,7 +78,6 @@ export default class FullWelcomePaneWithTabs extends UIElement {
 | 
				
			||||||
        ]).SetClass("only-on-mobile")
 | 
					        ]).SetClass("only-on-mobile")
 | 
				
			||||||
            .onClick(() => State.state.fullScreenMessage.setData(undefined));
 | 
					            .onClick(() => State.state.fullScreenMessage.setData(undefined));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        tabbedPart.SetStyle("overflow-y: auto; max-height: calc( 100vh - 4em);display:block;")
 | 
					 | 
				
			||||||
        this._component = new Combine([tabbedPart, backButton]).SetStyle("width:100%;");
 | 
					        this._component = new Combine([tabbedPart, backButton]).SetStyle("width:100%;");
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -10,12 +10,17 @@ import {SubtleButton} from "../Base/SubtleButton";
 | 
				
			||||||
import Translations from "../i18n/Translations";
 | 
					import Translations from "../i18n/Translations";
 | 
				
			||||||
import * as personal from "../../assets/themes/personalLayout/personalLayout.json"
 | 
					import * as personal from "../../assets/themes/personalLayout/personalLayout.json"
 | 
				
			||||||
import Constants from "../../Models/Constants";
 | 
					import Constants from "../../Models/Constants";
 | 
				
			||||||
 | 
					import LanguagePicker from "../LanguagePicker";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default class MoreScreen extends UIElement {
 | 
					export default class MoreScreen extends UIElement {
 | 
				
			||||||
 | 
					    private readonly _onMainScreen: boolean;
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    private _component: UIElement;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    constructor() {
 | 
					    constructor(onMainScreen: boolean = false) {
 | 
				
			||||||
        super(State.state.locationControl);
 | 
					        super(State.state.locationControl);
 | 
				
			||||||
 | 
					        this._onMainScreen = onMainScreen;
 | 
				
			||||||
        this.ListenTo(State.state.osmConnection.userDetails);
 | 
					        this.ListenTo(State.state.osmConnection.userDetails);
 | 
				
			||||||
        this.ListenTo(State.state.installedThemes);
 | 
					        this.ListenTo(State.state.installedThemes);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
| 
						 | 
					@ -35,7 +40,7 @@ export default class MoreScreen extends UIElement {
 | 
				
			||||||
                return undefined;
 | 
					                return undefined;
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        if (layout.id === State.state.layoutToUse.data.id) {
 | 
					        if (layout.id === State.state.layoutToUse.data?.id) {
 | 
				
			||||||
            return undefined;
 | 
					            return undefined;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -115,12 +120,23 @@ export default class MoreScreen extends UIElement {
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        let intro : UIElement= tr.intro;
 | 
				
			||||||
 | 
					        if(this._onMainScreen){
 | 
				
			||||||
 | 
					           intro = new Combine([
 | 
				
			||||||
               
 | 
					               
 | 
				
			||||||
        return new VerticalCombine([
 | 
					           LanguagePicker.CreateLanguagePicker(Translations.t.general.index.SupportedLanguages())
 | 
				
			||||||
            tr.intro,
 | 
					               .SetStyle("position: absolute; right: 1.5em; top: 1.5em;"),
 | 
				
			||||||
 | 
					            Translations.t.general.index.SetStyle("margin-top: 2em;display:block; margin-bottom: 1em;")
 | 
				
			||||||
 | 
					           ]) 
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        this._component = new VerticalCombine([
 | 
				
			||||||
 | 
					          intro,
 | 
				
			||||||
            new VerticalCombine(els),
 | 
					            new VerticalCombine(els),
 | 
				
			||||||
            tr.streetcomplete
 | 
					            tr.streetcomplete
 | 
				
			||||||
        ]).Render();
 | 
					        ]);
 | 
				
			||||||
 | 
					        return this._component.Render();
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -42,7 +42,7 @@ export default class SharePanel extends UIElement {
 | 
				
			||||||
                "Copy the json configuration from the 'save-tab', paste it between the 'nowiki'-tags in the Wiki",
 | 
					                "Copy the json configuration from the 'save-tab', paste it between the 'nowiki'-tags in the Wiki",
 | 
				
			||||||
                "Click 'save' to save the wiki page",
 | 
					                "Click 'save' to save the wiki page",
 | 
				
			||||||
                "Share the link with the url parameter <span class='literal-code'>userlayout=wiki:YOURWIKIPAGE</span>, e.g. " +
 | 
					                "Share the link with the url parameter <span class='literal-code'>userlayout=wiki:YOURWIKIPAGE</span>, e.g. " +
 | 
				
			||||||
                `<a href='./index.html?userlayout=${proposedNameEnc}' target='_blank'>https://${window.location.host}?userlayout=${proposedNameEnc}</a>`
 | 
					                `<a href='./custom?userlayout=${proposedNameEnc}' target='_blank'>https://${window.location.host}?userlayout=${proposedNameEnc}</a>`
 | 
				
			||||||
            ].map(li => `<li>${li}</li>`),
 | 
					            ].map(li => `<li>${li}</li>`),
 | 
				
			||||||
 | 
					
 | 
				
			||||||
            "</ol>",
 | 
					            "</ol>",
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -11,7 +11,7 @@ export class Translation extends UIElement {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    constructor(translations: object, context?: string) {
 | 
					    constructor(translations: object, context?: string) {
 | 
				
			||||||
        super(Locale.language)
 | 
					        super(Locale.language)
 | 
				
			||||||
        if(translations === undefined){
 | 
					        if (translations === undefined) {
 | 
				
			||||||
            throw `Translation without content (${context})`
 | 
					            throw `Translation without content (${context})`
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        let count = 0;
 | 
					        let count = 0;
 | 
				
			||||||
| 
						 | 
					@ -19,11 +19,40 @@ export class Translation extends UIElement {
 | 
				
			||||||
            count++;
 | 
					            count++;
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        this.translations = translations;
 | 
					        this.translations = translations;
 | 
				
			||||||
        if(count === 0){
 | 
					        if (count === 0) {
 | 
				
			||||||
            throw `No translations given in the object (${context})`
 | 
					            throw `No translations given in the object (${context})`
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    get txt(): string {
 | 
				
			||||||
 | 
					        if (this.translations["*"]) {
 | 
				
			||||||
 | 
					            return this.translations["*"];
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        const txt = this.translations[Translation.forcedLanguage ?? Locale.language.data];
 | 
				
			||||||
 | 
					        if (txt !== undefined) {
 | 
				
			||||||
 | 
					            return txt;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        const en = this.translations["en"];
 | 
				
			||||||
 | 
					        if (en !== undefined) {
 | 
				
			||||||
 | 
					            return en;
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        for (const i in this.translations) {
 | 
				
			||||||
 | 
					            return this.translations[i]; // Return a random language
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        console.error("Missing language ", Locale.language.data, "for", this.translations)
 | 
				
			||||||
 | 
					        return "";
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public SupportedLanguages(): string[] {
 | 
				
			||||||
 | 
					        const langs = []
 | 
				
			||||||
 | 
					        for (const translationsKey in this.translations) {
 | 
				
			||||||
 | 
					            if(translationsKey === "#"){
 | 
				
			||||||
 | 
					                continue;
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            langs.push(translationsKey)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return langs;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public Subs(text: any): Translation {
 | 
					    public Subs(text: any): Translation {
 | 
				
			||||||
        const newTranslations = {};
 | 
					        const newTranslations = {};
 | 
				
			||||||
| 
						 | 
					@ -57,27 +86,6 @@ export class Translation extends UIElement {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
    get txt(): string {
 | 
					 | 
				
			||||||
        if (this.translations["*"]) {
 | 
					 | 
				
			||||||
            return this.translations["*"];
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        const txt = this.translations[Translation.forcedLanguage ?? Locale.language.data];
 | 
					 | 
				
			||||||
        if (txt !== undefined) {
 | 
					 | 
				
			||||||
            return txt;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        const en = this.translations["en"];
 | 
					 | 
				
			||||||
        if (en !== undefined) {
 | 
					 | 
				
			||||||
            return en;
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        for (const i in this.translations) {
 | 
					 | 
				
			||||||
            return this.translations[i]; // Return a random language
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
        console.error("Missing language ", Locale.language.data, "for", this.translations)
 | 
					 | 
				
			||||||
        return "";
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    InnerRender(): string {
 | 
					    InnerRender(): string {
 | 
				
			||||||
        return this.txt
 | 
					        return this.txt
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -24,10 +24,10 @@
 | 
				
			||||||
  "maintainer": "MapComplete",
 | 
					  "maintainer": "MapComplete",
 | 
				
			||||||
  "icon": "./assets/themes/cyclofix/logo.svg",
 | 
					  "icon": "./assets/themes/cyclofix/logo.svg",
 | 
				
			||||||
  "version": "0",
 | 
					  "version": "0",
 | 
				
			||||||
  "startLat": 50.8465573,
 | 
					  "startLat": 0,
 | 
				
			||||||
  "defaultBackgroundId": "CartoDB.Voyager",
 | 
					  "defaultBackgroundId": "CartoDB.Voyager",
 | 
				
			||||||
  "startLon": 4.3516970,
 | 
					  "startLon": 0,
 | 
				
			||||||
  "startZoom": 16,
 | 
					  "startZoom": 1,
 | 
				
			||||||
  "widenFactor": 0.05,
 | 
					  "widenFactor": 0.05,
 | 
				
			||||||
  "socialImage": "./assets/themes/cyclofix/logo.svg",
 | 
					  "socialImage": "./assets/themes/cyclofix/logo.svg",
 | 
				
			||||||
  "layers": [
 | 
					  "layers": [
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -162,6 +162,13 @@
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
  "general": {
 | 
					  "general": {
 | 
				
			||||||
 | 
					    "index": {
 | 
				
			||||||
 | 
					      "#": "This text is shown above the theme buttons when no theme is loaded",
 | 
				
			||||||
 | 
					      "en": "<h3>Welcome to MapComplete</h3> MapComplete is an OpenStreetMap-viewer and editor, which shows you information about a specific theme.<br/><br/>Pick a theme below to get started.",
 | 
				
			||||||
 | 
					      "nl": "<h3>Welkom bij MapComplete</h3> MapComplete is een OpenStreetMap applicatie waar informatie over een specifiek thema bekeken en aangepast kan worden.<br/><br/>Kies hieronder een thema om te beginnen."
 | 
				
			||||||
 | 
					    },
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
    "loginWithOpenStreetMap": {
 | 
					    "loginWithOpenStreetMap": {
 | 
				
			||||||
      "en": "Login with OpenStreetMap",
 | 
					      "en": "Login with OpenStreetMap",
 | 
				
			||||||
      "ca": "Entra a OpenStreetMap",
 | 
					      "ca": "Entra a OpenStreetMap",
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -19,7 +19,9 @@
 | 
				
			||||||
    <link rel="stylesheet" href="vendor/MarkerCluster.css"/>
 | 
					    <link rel="stylesheet" href="vendor/MarkerCluster.css"/>
 | 
				
			||||||
    <link rel="stylesheet" href="vendor/MarkerCluster.Default.css"/>
 | 
					    <link rel="stylesheet" href="vendor/MarkerCluster.Default.css"/>
 | 
				
			||||||
    <!-- $$$CUSTOM-CSS -->
 | 
					    <!-- $$$CUSTOM-CSS -->
 | 
				
			||||||
 | 
					    <!-- $$$MANIFEST -->
 | 
				
			||||||
    <link rel="manifest" href="./manifest.manifest">
 | 
					    <link rel="manifest" href="./manifest.manifest">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <link rel="icon" href="assets/svg/add.svg" sizes="any" type="image/svg+xml">
 | 
					    <link rel="icon" href="assets/svg/add.svg" sizes="any" type="image/svg+xml">
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    <meta property="og:type" content="website">
 | 
					    <meta property="og:type" content="website">
 | 
				
			||||||
| 
						 | 
					@ -35,7 +37,7 @@
 | 
				
			||||||
</head>
 | 
					</head>
 | 
				
			||||||
<body>
 | 
					<body>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<div style="position: absolute; left: 1em; bottom: 1em; width:35vh; height:35vh;"
 | 
					<div style="position: fixed; left: 1em; bottom: 1em; width:35vh; height:35vh;"
 | 
				
			||||||
     id="decoration-desktop">
 | 
					     id="decoration-desktop">
 | 
				
			||||||
    <!-- A nice decoration while loading or on errors -->
 | 
					    <!-- A nice decoration while loading or on errors -->
 | 
				
			||||||
    <!-- DECORATION 0 START -->
 | 
					    <!-- DECORATION 0 START -->
 | 
				
			||||||
| 
						 | 
					@ -63,7 +65,6 @@
 | 
				
			||||||
</div>
 | 
					</div>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
<div id="centermessage">Loading MapComplete, hang on...</div>
 | 
					<div id="centermessage">Loading MapComplete, hang on...</div>
 | 
				
			||||||
<div id="top-right"></div>
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
<span id="geolocate-button"></span>
 | 
					<span id="geolocate-button"></span>
 | 
				
			||||||
<div id="leafletDiv"></div>
 | 
					<div id="leafletDiv"></div>
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										25
									
								
								index.ts
									
										
									
									
									
								
							
							
						
						
									
										25
									
								
								index.ts
									
										
									
									
									
								
							| 
						 | 
					@ -6,8 +6,10 @@ import {UIEventSource} from "./Logic/UIEventSource";
 | 
				
			||||||
import * as $ from "jquery";
 | 
					import * as $ from "jquery";
 | 
				
			||||||
import LayoutConfig from "./Customizations/JSON/LayoutConfig";
 | 
					import LayoutConfig from "./Customizations/JSON/LayoutConfig";
 | 
				
			||||||
import {Utils} from "./Utils";
 | 
					import {Utils} from "./Utils";
 | 
				
			||||||
 | 
					import MoreScreen from "./UI/BigComponents/MoreScreen";
 | 
				
			||||||
 | 
					import State from "./State";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
let defaultLayout = "bookcases"
 | 
					let defaultLayout = ""
 | 
				
			||||||
// --------------------- Special actions based on the parameters -----------------
 | 
					// --------------------- Special actions based on the parameters -----------------
 | 
				
			||||||
// @ts-ignore
 | 
					// @ts-ignore
 | 
				
			||||||
if (location.href.startsWith("http://buurtnatuur.be")) {
 | 
					if (location.href.startsWith("http://buurtnatuur.be")) {
 | 
				
			||||||
| 
						 | 
					@ -21,7 +23,7 @@ if (location.href.indexOf("buurtnatuur.be") >= 0) {
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const customCssQP = QueryParameters.GetQueryParameter("custom-css", "", "If specified, the custom css from the given link will be loaded additionaly");
 | 
					const customCssQP = QueryParameters.GetQueryParameter("custom-css", "", "If specified, the custom css from the given link will be loaded additionaly");
 | 
				
			||||||
if(customCssQP.data !== undefined && customCssQP.data !== ""){
 | 
					if (customCssQP.data !== undefined && customCssQP.data !== "") {
 | 
				
			||||||
    Utils.LoadCustomCss(customCssQP.data);
 | 
					    Utils.LoadCustomCss(customCssQP.data);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -42,17 +44,16 @@ if (location.hostname === "localhost" || location.hostname === "127.0.0.1") {
 | 
				
			||||||
// ----------------- SELECT THE RIGHT QUESTSET -----------------
 | 
					// ----------------- SELECT THE RIGHT QUESTSET -----------------
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					 | 
				
			||||||
const path = window.location.pathname.split("/").slice(-1)[0];
 | 
					const path = window.location.pathname.split("/").slice(-1)[0];
 | 
				
			||||||
if (path !== "index.html" && path !== "") {
 | 
					if (path !== "index.html" && path !== "") {
 | 
				
			||||||
    defaultLayout = path;
 | 
					    defaultLayout = path;
 | 
				
			||||||
    if(path.endsWith(".html")){
 | 
					    if (path.endsWith(".html")) {
 | 
				
			||||||
        defaultLayout = path.substr(0, path.length - 5);
 | 
					        defaultLayout = path.substr(0, path.length - 5);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    console.log("Using layout", defaultLayout);
 | 
					    console.log("Using layout", defaultLayout);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
defaultLayout = QueryParameters.GetQueryParameter("layout", defaultLayout,"The layout to load into MapComplete").data;
 | 
					defaultLayout = QueryParameters.GetQueryParameter("layout", defaultLayout, "The layout to load into MapComplete").data;
 | 
				
			||||||
let layoutToUse: LayoutConfig = AllKnownLayouts.allSets[defaultLayout.toLowerCase()] ?? AllKnownLayouts["all"];
 | 
					let layoutToUse: LayoutConfig = AllKnownLayouts.allSets[defaultLayout.toLowerCase()];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const userLayoutParam = QueryParameters.GetQueryParameter("userlayout", "false");
 | 
					const userLayoutParam = QueryParameters.GetQueryParameter("userlayout", "false");
 | 
				
			||||||
| 
						 | 
					@ -76,7 +77,7 @@ if (layoutFromBase64.startsWith("wiki:")) {
 | 
				
			||||||
            data = data.substr(start,
 | 
					            data = data.substr(start,
 | 
				
			||||||
                data.indexOf("<div class=\"printfooter\">") - start)
 | 
					                data.indexOf("<div class=\"printfooter\">") - start)
 | 
				
			||||||
            data = data.substr(0, data.lastIndexOf("</p>"))
 | 
					            data = data.substr(0, data.lastIndexOf("</p>"))
 | 
				
			||||||
            data = data.substr( data.indexOf("<p>") + 3) 
 | 
					            data = data.substr(data.indexOf("<p>") + 3)
 | 
				
			||||||
            console.log(data)
 | 
					            console.log(data)
 | 
				
			||||||
            try {
 | 
					            try {
 | 
				
			||||||
                const parsed = JSON.parse(data);
 | 
					                const parsed = JSON.parse(data);
 | 
				
			||||||
| 
						 | 
					@ -100,8 +101,16 @@ if (layoutFromBase64.startsWith("wiki:")) {
 | 
				
			||||||
} else if (layoutFromBase64 !== "false") {
 | 
					} else if (layoutFromBase64 !== "false") {
 | 
				
			||||||
    layoutToUse = InitUiElements.LoadLayoutFromHash(userLayoutParam);
 | 
					    layoutToUse = InitUiElements.LoadLayoutFromHash(userLayoutParam);
 | 
				
			||||||
    InitUiElements.InitAll(layoutToUse, layoutFromBase64, testing, defaultLayout, location.hash.substr(1));
 | 
					    InitUiElements.InitAll(layoutToUse, layoutFromBase64, testing, defaultLayout, location.hash.substr(1));
 | 
				
			||||||
} else {
 | 
					} else if (layoutToUse !== undefined) {
 | 
				
			||||||
 | 
					    // This is the default case: a builtin theme
 | 
				
			||||||
    InitUiElements.InitAll(layoutToUse, layoutFromBase64, testing, defaultLayout);
 | 
					    InitUiElements.InitAll(layoutToUse, layoutFromBase64, testing, defaultLayout);
 | 
				
			||||||
 | 
					} else {
 | 
				
			||||||
 | 
					    State.state = new State(undefined);
 | 
				
			||||||
 | 
					    document.getElementById("messagesboxmobile").remove();
 | 
				
			||||||
 | 
					    new MoreScreen(true)
 | 
				
			||||||
 | 
					        .SetStyle("background: var(--background-color); display: block; margin-left: 5vw; margin-right: 5vw; pointer-events: all;")
 | 
				
			||||||
 | 
					        .AttachTo("topleft-tools");
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
window.addEventListener('contextmenu', function (e) { // Not compatible with IE < 9
 | 
					window.addEventListener('contextmenu', function (e) { // Not compatible with IE < 9
 | 
				
			||||||
    e.preventDefault();
 | 
					    e.preventDefault();
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -227,7 +227,7 @@ function createLandingPage(layout: LayoutConfig) {
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    let output = template
 | 
					    let output = template
 | 
				
			||||||
        .replace(`./manifest.manifest`, `./${enc(layout.id)}.webmanifest`)
 | 
					        .replace("./manifest.manifest",`${enc(layout.id)}.webmanifest`)
 | 
				
			||||||
        .replace("<!-- $$$OG-META -->", og)
 | 
					        .replace("<!-- $$$OG-META -->", og)
 | 
				
			||||||
        .replace(/<title>.+?<\/title>/, `<title>${ogTitle}</title>`)
 | 
					        .replace(/<title>.+?<\/title>/, `<title>${ogTitle}</title>`)
 | 
				
			||||||
        .replace("Loading MapComplete, hang on...", `Loading MapComplete theme <i>${ogTitle}</i>...`)
 | 
					        .replace("Loading MapComplete, hang on...", `Loading MapComplete theme <i>${ogTitle}</i>...`)
 | 
				
			||||||
| 
						 | 
					@ -251,7 +251,7 @@ if (! existsSync(generatedDir)) {
 | 
				
			||||||
    mkdirSync(generatedDir)
 | 
					    mkdirSync(generatedDir)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
const blacklist = ["", "test", ".", "..", "manifest", "index", "land", "preferences", "account", "openstreetmap"]
 | 
					const blacklist = ["", "test", ".", "..", "manifest", "index", "land", "preferences", "account", "openstreetmap","custom"]
 | 
				
			||||||
const all = AllKnownLayouts.allSets;
 | 
					const all = AllKnownLayouts.allSets;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
let wikiPage = "{|class=\"wikitable sortable\"\n" +
 | 
					let wikiPage = "{|class=\"wikitable sortable\"\n" +
 | 
				
			||||||
| 
						 | 
					@ -278,12 +278,12 @@ for (const layoutName in all) {
 | 
				
			||||||
    const manifestLocation = encodeURIComponent(layout.id.toLowerCase()) + ".webmanifest";
 | 
					    const manifestLocation = encodeURIComponent(layout.id.toLowerCase()) + ".webmanifest";
 | 
				
			||||||
    writeFile(manifestLocation, manif, err);
 | 
					    writeFile(manifestLocation, manif, err);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Create a landing page for the given theme
 | 
				
			||||||
    const landing = createLandingPage(layout);
 | 
					    const landing = createLandingPage(layout);
 | 
				
			||||||
    writeFile(enc(layout.id) + ".html", landing, err)
 | 
					    writeFile(enc(layout.id) + ".html", landing, err)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    wikiPage += "\n"+generateWikiEntry(layout);
 | 
					    wikiPage += "\n"+generateWikiEntry(layout);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					 | 
				
			||||||
wikiPage += "\n|}"
 | 
					wikiPage += "\n|}"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
writeFile(generatedDir + "/wikiIndex", wikiPage, (err) => {
 | 
					writeFile(generatedDir + "/wikiIndex", wikiPage, (err) => {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue