forked from MapComplete/MapComplete
		
	Add assets for entrances, add first dependency injection
This commit is contained in:
		
						commit
						8e40d76281
					
				
					 13 changed files with 1735 additions and 48 deletions
				
			
		| 
						 | 
					@ -39,15 +39,23 @@ export class AllKnownLayouts {
 | 
				
			||||||
                throw "Priviliged layer definition not found: " + id
 | 
					                throw "Priviliged layer definition not found: " + id
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        const allLayers: LayerConfig[] = Array.from(AllKnownLayers.sharedLayers.values())
 | 
					        const allLayers: LayerConfig[] = Array.from(AllKnownLayers.sharedLayers.values())
 | 
				
			||||||
 | 
					            .filter(layer => AllKnownLayers.priviliged_layers.indexOf(layer.id) < 0)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        const builtinLayerIds: Set<string> = new Set<string>()
 | 
				
			||||||
 | 
					        allLayers.forEach(l => builtinLayerIds.add(l.id))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        const themesPerLayer = new Map<string, string[]>()
 | 
					        const themesPerLayer = new Map<string, string[]>()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        for (const layout of Array.from(AllKnownLayouts.allKnownLayouts.values())) {
 | 
					        for (const layout of Array.from(AllKnownLayouts.allKnownLayouts.values())) {
 | 
				
			||||||
            if(layout.hideFromOverview){
 | 
					            if (layout.hideFromOverview) {
 | 
				
			||||||
                continue
 | 
					                continue
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            for (const layer of layout.layers) {
 | 
					            for (const layer of layout.layers) {
 | 
				
			||||||
 | 
					                if (!builtinLayerIds.has(layer.id)) {
 | 
				
			||||||
 | 
					                    continue
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
                if (!themesPerLayer.has(layer.id)) {
 | 
					                if (!themesPerLayer.has(layer.id)) {
 | 
				
			||||||
                    themesPerLayer.set(layer.id, [])
 | 
					                    themesPerLayer.set(layer.id, [])
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
| 
						 | 
					@ -57,8 +65,9 @@ export class AllKnownLayouts {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        let popularLayerCutoff = 2;
 | 
					        let popularLayerCutoff = 2;
 | 
				
			||||||
        const popupalLayers = allLayers.filter((layer) => themesPerLayer.get(layer.id)?.length >= 2)
 | 
					        const popuparLayers = allLayers.filter(layer => themesPerLayer.get(layer.id)?.length >= 2)
 | 
				
			||||||
            .filter(layer => AllKnownLayers.priviliged_layers.indexOf(layer.id) < 0)
 | 
					
 | 
				
			||||||
 | 
					        const unpopularLayers = allLayers.filter(layer => themesPerLayer.get(layer.id)?.length < 2)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return new Combine([
 | 
					        return new Combine([
 | 
				
			||||||
            new Title("Special and other useful layers", 1),
 | 
					            new Title("Special and other useful layers", 1),
 | 
				
			||||||
| 
						 | 
					@ -68,10 +77,15 @@ export class AllKnownLayouts {
 | 
				
			||||||
            ...AllKnownLayers.priviliged_layers
 | 
					            ...AllKnownLayers.priviliged_layers
 | 
				
			||||||
                .map(id => AllKnownLayers.sharedLayers.get(id))
 | 
					                .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)),
 | 
					                .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),
 | 
					            new Title("Normal layers", 1),
 | 
				
			||||||
            "The following layers are used by at least "+popularLayerCutoff+" mapcomplete themes and might be interesting for your custom theme too",
 | 
					            "The following layers are included in MapComplete",
 | 
				
			||||||
            new List(popupalLayers.map(layer => "[" + layer.id + "](#" + layer.id + ")")),
 | 
					            new Title("Frequently reused layers", 2),
 | 
				
			||||||
            ...popupalLayers.map((layer) => layer.GenerateDocumentation(themesPerLayer.get(layer.id)))
 | 
					            "The following layers are used by at least " + popularLayerCutoff + " mapcomplete themes and might be interesting for your custom theme too",
 | 
				
			||||||
 | 
					            new List(popuparLayers.map(layer => "[" + layer.id + "](#" + layer.id + ")")),
 | 
				
			||||||
 | 
					            ...popuparLayers.map((layer) => layer.GenerateDocumentation(themesPerLayer.get(layer.id))),
 | 
				
			||||||
 | 
					            new List(unpopularLayers.map(layer => "[" + layer.id + "](#" + layer.id + ")")),
 | 
				
			||||||
 | 
					            ...unpopularLayers.map(layer => layer.GenerateDocumentation(themesPerLayer.get(layer.id))
 | 
				
			||||||
 | 
					            )
 | 
				
			||||||
        ])
 | 
					        ])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							| 
						 | 
					@ -16,7 +16,7 @@ export default class FeatureSwitchState {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public readonly featureSwitchUserbadge: UIEventSource<boolean>;
 | 
					    public readonly featureSwitchUserbadge: UIEventSource<boolean>;
 | 
				
			||||||
    public readonly featureSwitchSearch: UIEventSource<boolean>;
 | 
					    public readonly featureSwitchSearch: UIEventSource<boolean>;
 | 
				
			||||||
    public readonly featureSwitchBackgroundSlection: UIEventSource<boolean>;
 | 
					    public readonly featureSwitchBackgroundSelection: UIEventSource<boolean>;
 | 
				
			||||||
    public readonly featureSwitchAddNew: UIEventSource<boolean>;
 | 
					    public readonly featureSwitchAddNew: UIEventSource<boolean>;
 | 
				
			||||||
    public readonly featureSwitchWelcomeMessage: UIEventSource<boolean>;
 | 
					    public readonly featureSwitchWelcomeMessage: UIEventSource<boolean>;
 | 
				
			||||||
    public readonly featureSwitchIframePopoutEnabled: UIEventSource<boolean>;
 | 
					    public readonly featureSwitchIframePopoutEnabled: UIEventSource<boolean>;
 | 
				
			||||||
| 
						 | 
					@ -72,7 +72,7 @@ export default class FeatureSwitchState {
 | 
				
			||||||
            (layoutToUse) => layoutToUse?.enableSearch ?? true,
 | 
					            (layoutToUse) => layoutToUse?.enableSearch ?? true,
 | 
				
			||||||
            "Disables/Enables the search bar"
 | 
					            "Disables/Enables the search bar"
 | 
				
			||||||
        );
 | 
					        );
 | 
				
			||||||
        this.featureSwitchBackgroundSlection = featSw(
 | 
					        this.featureSwitchBackgroundSelection = featSw(
 | 
				
			||||||
            "fs-background",
 | 
					            "fs-background",
 | 
				
			||||||
            (layoutToUse) => layoutToUse?.enableBackgroundLayerSelection ?? true,
 | 
					            (layoutToUse) => layoutToUse?.enableBackgroundLayerSelection ?? true,
 | 
				
			||||||
            "Disables/Enables the background layer control"
 | 
					            "Disables/Enables the background layer control"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,7 +1,7 @@
 | 
				
			||||||
import {Translation} from "../../UI/i18n/Translation";
 | 
					import {Translation} from "../../UI/i18n/Translation";
 | 
				
			||||||
import SourceConfig from "./SourceConfig";
 | 
					import SourceConfig from "./SourceConfig";
 | 
				
			||||||
import TagRenderingConfig from "./TagRenderingConfig";
 | 
					import TagRenderingConfig from "./TagRenderingConfig";
 | 
				
			||||||
import PresetConfig from "./PresetConfig";
 | 
					import PresetConfig, {PreciseInput} from "./PresetConfig";
 | 
				
			||||||
import {LayerConfigJson} from "./Json/LayerConfigJson";
 | 
					import {LayerConfigJson} from "./Json/LayerConfigJson";
 | 
				
			||||||
import Translations from "../../UI/i18n/Translations";
 | 
					import Translations from "../../UI/i18n/Translations";
 | 
				
			||||||
import {TagUtils} from "../../Logic/Tags/TagUtils";
 | 
					import {TagUtils} from "../../Logic/Tags/TagUtils";
 | 
				
			||||||
| 
						 | 
					@ -26,19 +26,19 @@ import * as icons from "../../assets/tagRenderings/icons.json"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default class LayerConfig extends WithContextLoader {
 | 
					export default class LayerConfig extends WithContextLoader {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    id: string;
 | 
					    public readonly id: string;
 | 
				
			||||||
    name: Translation;
 | 
					    public readonly name: Translation;
 | 
				
			||||||
    description: Translation;
 | 
					    public readonly description: Translation;
 | 
				
			||||||
    source: SourceConfig;
 | 
					    public readonly source: SourceConfig;
 | 
				
			||||||
    calculatedTags: [string, string][];
 | 
					    public readonly calculatedTags: [string, string][];
 | 
				
			||||||
    doNotDownload: boolean;
 | 
					    public readonly doNotDownload: boolean;
 | 
				
			||||||
    passAllFeatures: boolean;
 | 
					    public readonly  passAllFeatures: boolean;
 | 
				
			||||||
    isShown: TagRenderingConfig;
 | 
					    public readonly isShown: TagRenderingConfig;
 | 
				
			||||||
    minzoom: number;
 | 
					    public readonly  minzoom: number;
 | 
				
			||||||
    minzoomVisible: number;
 | 
					    public readonly  minzoomVisible: number;
 | 
				
			||||||
    maxzoom: number;
 | 
					    public readonly  maxzoom: number;
 | 
				
			||||||
    title?: TagRenderingConfig;
 | 
					    public readonly title?: TagRenderingConfig;
 | 
				
			||||||
    titleIcons: TagRenderingConfig[];
 | 
					    public readonly titleIcons: TagRenderingConfig[];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public readonly mapRendering: PointRenderingConfig[]
 | 
					    public readonly mapRendering: PointRenderingConfig[]
 | 
				
			||||||
    public readonly lineRendering: LineRenderingConfig[]
 | 
					    public readonly lineRendering: LineRenderingConfig[]
 | 
				
			||||||
| 
						 | 
					@ -53,10 +53,10 @@ export default class LayerConfig extends WithContextLoader {
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    public readonly maxAgeOfCache: number
 | 
					    public readonly maxAgeOfCache: number
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    presets: PresetConfig[];
 | 
					    public readonly presets: PresetConfig[];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    tagRenderings: TagRenderingConfig[];
 | 
					    public readonly tagRenderings: TagRenderingConfig[];
 | 
				
			||||||
    filters: FilterConfig[];
 | 
					    public readonly filters: FilterConfig[];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    constructor(
 | 
					    constructor(
 | 
				
			||||||
        json: LayerConfigJson,
 | 
					        json: LayerConfigJson,
 | 
				
			||||||
| 
						 | 
					@ -153,8 +153,7 @@ export default class LayerConfig extends WithContextLoader {
 | 
				
			||||||
            throw "Presets should be a list of items (at " + context + ")"
 | 
					            throw "Presets should be a list of items (at " + context + ")"
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        this.presets = (json.presets ?? []).map((pr, i) => {
 | 
					        this.presets = (json.presets ?? []).map((pr, i) => {
 | 
				
			||||||
 | 
					            let preciseInput: PreciseInput = {
 | 
				
			||||||
            let preciseInput: any = {
 | 
					 | 
				
			||||||
                preferredBackground: ["photo"],
 | 
					                preferredBackground: ["photo"],
 | 
				
			||||||
                snapToLayers: undefined,
 | 
					                snapToLayers: undefined,
 | 
				
			||||||
                maxSnapDistance: undefined
 | 
					                maxSnapDistance: undefined
 | 
				
			||||||
| 
						 | 
					@ -165,6 +164,7 @@ export default class LayerConfig extends WithContextLoader {
 | 
				
			||||||
                        preferredBackground: undefined
 | 
					                        preferredBackground: undefined
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
 | 
					                
 | 
				
			||||||
                let snapToLayers: string[];
 | 
					                let snapToLayers: string[];
 | 
				
			||||||
                if (typeof pr.preciseInput.snapToLayer === "string") {
 | 
					                if (typeof pr.preciseInput.snapToLayer === "string") {
 | 
				
			||||||
                    snapToLayers = [pr.preciseInput.snapToLayer]
 | 
					                    snapToLayers = [pr.preciseInput.snapToLayer]
 | 
				
			||||||
| 
						 | 
					@ -180,7 +180,7 @@ export default class LayerConfig extends WithContextLoader {
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
                preciseInput = {
 | 
					                preciseInput = {
 | 
				
			||||||
                    preferredBackground: preferredBackground,
 | 
					                    preferredBackground: preferredBackground,
 | 
				
			||||||
                    snapToLayers: snapToLayers,
 | 
					                    snapToLayers,
 | 
				
			||||||
                    maxSnapDistance: pr.preciseInput.maxSnapDistance ?? 10
 | 
					                    maxSnapDistance: pr.preciseInput.maxSnapDistance ?? 10
 | 
				
			||||||
                }
 | 
					                }
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
| 
						 | 
					@ -441,6 +441,10 @@ export default class LayerConfig extends WithContextLoader {
 | 
				
			||||||
            ]
 | 
					            ]
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        for (const dep of Array.from(this.getDependencies())) {
 | 
				
			||||||
 | 
					            extraProps.push(new Combine(["This layer will automatically load ", new Link(dep, "#"+dep)," into the layout as it depends on it."]))
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        return new Combine([
 | 
					        return new Combine([
 | 
				
			||||||
            new Title(this.id, 3),
 | 
					            new Title(this.id, 3),
 | 
				
			||||||
            this.description,
 | 
					            this.description,
 | 
				
			||||||
| 
						 | 
					@ -480,4 +484,23 @@ export default class LayerConfig extends WithContextLoader {
 | 
				
			||||||
    public isLeftRightSensitive(): boolean {
 | 
					    public isLeftRightSensitive(): boolean {
 | 
				
			||||||
        return this.lineRendering.some(lr => lr.leftRightSensitive)
 | 
					        return this.lineRendering.some(lr => lr.leftRightSensitive)
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /**
 | 
				
			||||||
 | 
					     * Returns a set of all other layer-ids that this layer needs to function.
 | 
				
			||||||
 | 
					     * E.g. if this layers does snap to another layer in the preset, this other layer id will be mentioned
 | 
				
			||||||
 | 
					     */
 | 
				
			||||||
 | 
					    public getDependencies(): Set<string>{
 | 
				
			||||||
 | 
					        const deps = new Set<string>()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        for (const preset of this.presets ?? []) {
 | 
				
			||||||
 | 
					            if(preset.preciseInput?.snapToLayers === undefined){
 | 
				
			||||||
 | 
					                continue
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            preset.preciseInput?.snapToLayers?.forEach(id => {
 | 
				
			||||||
 | 
					                deps.add(id);
 | 
				
			||||||
 | 
					            })
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
 | 
					        return deps
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -166,7 +166,7 @@ export default class LayoutConfig {
 | 
				
			||||||
                        return
 | 
					                        return
 | 
				
			||||||
                    } else {
 | 
					                    } else {
 | 
				
			||||||
                        const shared = AllKnownLayers.sharedLayers.get(layer)
 | 
					                        const shared = AllKnownLayers.sharedLayers.get(layer)
 | 
				
			||||||
                        if(shared === undefined){
 | 
					                        if (shared === undefined) {
 | 
				
			||||||
                            throw `Shared layer ${layer} not found (at ${context}.layers[${i}])`
 | 
					                            throw `Shared layer ${layer} not found (at ${context}.layers[${i}])`
 | 
				
			||||||
                        }
 | 
					                        }
 | 
				
			||||||
                        result.push(shared)
 | 
					                        result.push(shared)
 | 
				
			||||||
| 
						 | 
					@ -215,14 +215,35 @@ export default class LayoutConfig {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        // Some special layers which are always included by default
 | 
					        // Some special layers which are always included by default
 | 
				
			||||||
        for (const defaultLayer of AllKnownLayers.added_by_default) {
 | 
					        for (const defaultLayer of AllKnownLayers.added_by_default) {
 | 
				
			||||||
            if(result.some(l => l?.id === defaultLayer)){
 | 
					            if (result.some(l => l?.id === defaultLayer)) {
 | 
				
			||||||
                continue; // Already added
 | 
					                continue; // Already added
 | 
				
			||||||
            }
 | 
					            }
 | 
				
			||||||
            result.push(AllKnownLayers.sharedLayers.get(defaultLayer))
 | 
					            const sharedLayer = AllKnownLayers.sharedLayers.get(defaultLayer)
 | 
				
			||||||
 | 
					            if (sharedLayer !== undefined) {
 | 
				
			||||||
 | 
					                result.push(sharedLayer)
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        let unmetDependencies: { dependency: string, layer: string }[] = []
 | 
				
			||||||
 | 
					        do {
 | 
				
			||||||
 | 
					            const dependencies: { dependency: string, layer: string }[] = [].concat(...result.map(l => Array.from(l.getDependencies()).map(d => ({
 | 
				
			||||||
 | 
					                dependency: d,
 | 
				
			||||||
 | 
					                layer: l.id
 | 
				
			||||||
 | 
					            }))))
 | 
				
			||||||
 | 
					            const loadedLayers = new Set(result.map(r => r.id))
 | 
				
			||||||
 | 
					            unmetDependencies = dependencies.filter(dep => !loadedLayers.has(dep.dependency))
 | 
				
			||||||
 | 
					            for (const unmetDependency of unmetDependencies) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                console.log("Recursively loading unmet dependency ", unmetDependency.dependency, "(needed by " + unmetDependency.layer + ")")
 | 
				
			||||||
 | 
					                const dep = AllKnownLayers.sharedLayers.get(unmetDependency.dependency)
 | 
				
			||||||
 | 
					                if (dep === undefined) {
 | 
				
			||||||
 | 
					                    throw "The layer '" + unmetDependency.layer + "' needs '" + unmetDependency.dependency + "' to be loaded, but it could not be found as builtin layer (at " + context + ")"
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                result.unshift(dep)
 | 
				
			||||||
 | 
					                unmetDependencies = unmetDependencies.filter(d => d.dependency !== unmetDependency.dependency)
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        } while (unmetDependencies.length > 0)
 | 
				
			||||||
        return {layers: result, extractAllNodes: exportAllNodes}
 | 
					        return {layers: result, extractAllNodes: exportAllNodes}
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -303,8 +324,8 @@ export default class LayoutConfig {
 | 
				
			||||||
        return this.layers.some(l => l.isLeftRightSensitive())
 | 
					        return this.layers.some(l => l.isLeftRightSensitive())
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public getMatchingLayer(tags: any) : LayerConfig | undefined{
 | 
					    public getMatchingLayer(tags: any): LayerConfig | undefined {
 | 
				
			||||||
        if(tags === undefined){
 | 
					        if (tags === undefined) {
 | 
				
			||||||
            return undefined
 | 
					            return undefined
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        for (const layer of this.layers) {
 | 
					        for (const layer of this.layers) {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,6 +1,12 @@
 | 
				
			||||||
import {Translation} from "../../UI/i18n/Translation";
 | 
					import {Translation} from "../../UI/i18n/Translation";
 | 
				
			||||||
import {Tag} from "../../Logic/Tags/Tag";
 | 
					import {Tag} from "../../Logic/Tags/Tag";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					export interface PreciseInput {
 | 
				
			||||||
 | 
					    preferredBackground?: string[],
 | 
				
			||||||
 | 
					    snapToLayers?: string[],
 | 
				
			||||||
 | 
					    maxSnapDistance?: number
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default interface PresetConfig {
 | 
					export default interface PresetConfig {
 | 
				
			||||||
    title: Translation,
 | 
					    title: Translation,
 | 
				
			||||||
    tags: Tag[],
 | 
					    tags: Tag[],
 | 
				
			||||||
| 
						 | 
					@ -8,9 +14,5 @@ export default interface PresetConfig {
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * If precise input is set, then an extra map is shown in which the user can drag the map to the precise location
 | 
					     * If precise input is set, then an extra map is shown in which the user can drag the map to the precise location
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    preciseInput?: {
 | 
					    preciseInput?: PreciseInput
 | 
				
			||||||
        preferredBackground?: string[],
 | 
					 | 
				
			||||||
        snapToLayers?: string[],
 | 
					 | 
				
			||||||
        maxSnapDistance?: number
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -20,7 +20,7 @@ export default class FilterView extends VariableUiElement {
 | 
				
			||||||
        const backgroundSelector = new Toggle(
 | 
					        const backgroundSelector = new Toggle(
 | 
				
			||||||
            new BackgroundSelector(),
 | 
					            new BackgroundSelector(),
 | 
				
			||||||
            undefined,
 | 
					            undefined,
 | 
				
			||||||
            State.state.featureSwitchBackgroundSlection
 | 
					            State.state.featureSwitchBackgroundSelection
 | 
				
			||||||
        )
 | 
					        )
 | 
				
			||||||
        super(
 | 
					        super(
 | 
				
			||||||
            filteredLayer.map((filteredLayers) => {
 | 
					            filteredLayer.map((filteredLayers) => {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -19,6 +19,7 @@ import BackgroundMapSwitch from "./BackgroundMapSwitch";
 | 
				
			||||||
export default class LeftControls extends Combine {
 | 
					export default class LeftControls extends Combine {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    constructor(state: {
 | 
					    constructor(state: {
 | 
				
			||||||
 | 
					                    featureSwitchBackgroundSelection: UIEventSource<boolean>;
 | 
				
			||||||
                    layoutToUse: LayoutConfig,
 | 
					                    layoutToUse: LayoutConfig,
 | 
				
			||||||
                    featurePipeline: FeaturePipeline,
 | 
					                    featurePipeline: FeaturePipeline,
 | 
				
			||||||
                    currentBounds: UIEventSource<BBox>,
 | 
					                    currentBounds: UIEventSource<BBox>,
 | 
				
			||||||
| 
						 | 
					@ -75,9 +76,15 @@ export default class LeftControls extends Combine {
 | 
				
			||||||
            state.featureSwitchFilter
 | 
					            state.featureSwitchFilter
 | 
				
			||||||
        );
 | 
					        );
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
 | 
					        const mapSwitch = new Toggle(
 | 
				
			||||||
 | 
					            new BackgroundMapSwitch(state, state.backgroundLayer),
 | 
				
			||||||
 | 
					            undefined,
 | 
				
			||||||
 | 
					            state.featureSwitchBackgroundSelection
 | 
				
			||||||
 | 
					        )
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        super([filterButton,
 | 
					        super([filterButton,
 | 
				
			||||||
            downloadButtonn,
 | 
					            downloadButtonn,
 | 
				
			||||||
            new BackgroundMapSwitch(state, state.backgroundLayer)
 | 
					           mapSwitch
 | 
				
			||||||
        ])
 | 
					        ])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        this.SetClass("flex flex-col")
 | 
					        this.SetClass("flex flex-col")
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -18,7 +18,7 @@ export class DefaultGuiState {
 | 
				
			||||||
        this.welcomeMessageOpenedTab = UIEventSource.asFloat(QueryParameters.GetQueryParameter(
 | 
					        this.welcomeMessageOpenedTab = UIEventSource.asFloat(QueryParameters.GetQueryParameter(
 | 
				
			||||||
            "tab",
 | 
					            "tab",
 | 
				
			||||||
            "0",
 | 
					            "0",
 | 
				
			||||||
            `The tab that is shown in the welcome-message. 0 = the explanation of the theme,1 = OSM-credits, 2 = sharescreen, 3 = more themes, 4 = about mapcomplete (user must be logged in and have >${Constants.userJourney.mapCompleteHelpUnlock} changesets)`
 | 
					            `The tab that is shown in the welcome-message.`
 | 
				
			||||||
        ));
 | 
					        ));
 | 
				
			||||||
        this.welcomeMessageIsOpened = QueryParameters.GetBooleanQueryParameter(
 | 
					        this.welcomeMessageIsOpened = QueryParameters.GetBooleanQueryParameter(
 | 
				
			||||||
            "welcome-control-toggle",
 | 
					            "welcome-control-toggle",
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										69
									
								
								assets/layers/entrance/door.svg
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										69
									
								
								assets/layers/entrance/door.svg
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,69 @@
 | 
				
			||||||
 | 
					<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 | 
				
			||||||
 | 
					<svg
 | 
				
			||||||
 | 
					   xmlns:dc="http://purl.org/dc/elements/1.1/"
 | 
				
			||||||
 | 
					   xmlns:cc="http://creativecommons.org/ns#"
 | 
				
			||||||
 | 
					   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
 | 
				
			||||||
 | 
					   xmlns:svg="http://www.w3.org/2000/svg"
 | 
				
			||||||
 | 
					   xmlns="http://www.w3.org/2000/svg"
 | 
				
			||||||
 | 
					   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
 | 
				
			||||||
 | 
					   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
 | 
				
			||||||
 | 
					   inkscape:version="1.0rc1 (09960d6, 2020-04-09)"
 | 
				
			||||||
 | 
					   height="100"
 | 
				
			||||||
 | 
					   width="100"
 | 
				
			||||||
 | 
					   sodipodi:docname="noun_Door_1512154.svg"
 | 
				
			||||||
 | 
					   id="svg985"
 | 
				
			||||||
 | 
					   viewBox="0 0 100 100"
 | 
				
			||||||
 | 
					   y="0px"
 | 
				
			||||||
 | 
					   x="0px"
 | 
				
			||||||
 | 
					   version="1.1">
 | 
				
			||||||
 | 
					  <metadata
 | 
				
			||||||
 | 
					     id="metadata991">
 | 
				
			||||||
 | 
					    <rdf:RDF>
 | 
				
			||||||
 | 
					      <cc:Work
 | 
				
			||||||
 | 
					         rdf:about="">
 | 
				
			||||||
 | 
					        <dc:format>image/svg+xml</dc:format>
 | 
				
			||||||
 | 
					        <dc:type
 | 
				
			||||||
 | 
					           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
 | 
				
			||||||
 | 
					        <dc:title></dc:title>
 | 
				
			||||||
 | 
					      </cc:Work>
 | 
				
			||||||
 | 
					    </rdf:RDF>
 | 
				
			||||||
 | 
					  </metadata>
 | 
				
			||||||
 | 
					  <defs
 | 
				
			||||||
 | 
					     id="defs989" />
 | 
				
			||||||
 | 
					  <sodipodi:namedview
 | 
				
			||||||
 | 
					     inkscape:current-layer="svg985"
 | 
				
			||||||
 | 
					     inkscape:window-maximized="0"
 | 
				
			||||||
 | 
					     inkscape:window-y="13"
 | 
				
			||||||
 | 
					     inkscape:window-x="19"
 | 
				
			||||||
 | 
					     inkscape:cy="62.5"
 | 
				
			||||||
 | 
					     inkscape:cx="46.363636"
 | 
				
			||||||
 | 
					     inkscape:zoom="2.2"
 | 
				
			||||||
 | 
					     showgrid="false"
 | 
				
			||||||
 | 
					     id="namedview987"
 | 
				
			||||||
 | 
					     inkscape:window-height="480"
 | 
				
			||||||
 | 
					     inkscape:window-width="850"
 | 
				
			||||||
 | 
					     inkscape:pageshadow="2"
 | 
				
			||||||
 | 
					     inkscape:pageopacity="0"
 | 
				
			||||||
 | 
					     guidetolerance="10"
 | 
				
			||||||
 | 
					     gridtolerance="10"
 | 
				
			||||||
 | 
					     objecttolerance="10"
 | 
				
			||||||
 | 
					     borderopacity="1"
 | 
				
			||||||
 | 
					     bordercolor="#666666"
 | 
				
			||||||
 | 
					     pagecolor="#ffffff" />
 | 
				
			||||||
 | 
					  <g
 | 
				
			||||||
 | 
					     id="g979"
 | 
				
			||||||
 | 
					     transform="matrix(1.098403,0,0,1.098403,-4.8856189,-1050.6679)">
 | 
				
			||||||
 | 
					    <path
 | 
				
			||||||
 | 
					       inkscape:connector-curvature="0"
 | 
				
			||||||
 | 
					       id="path977"
 | 
				
			||||||
 | 
					       overflow="visible"
 | 
				
			||||||
 | 
					       display="inline"
 | 
				
			||||||
 | 
					       visibility="visible"
 | 
				
			||||||
 | 
					       marker="none"
 | 
				
			||||||
 | 
					       stroke="none"
 | 
				
			||||||
 | 
					       fill-opacity="1"
 | 
				
			||||||
 | 
					       fill="#000000"
 | 
				
			||||||
 | 
					       d="m 19.895978,958.36667 a 0.99873128,0.99999802 0 0 0 -0.8114,0.9999 v 84.99133 h -8.9877 a 0.99873128,0.99999802 0 0 0 -0.1872001,0 1.0030103,1.0042825 0 1 0 0.1872001,1.9998 h 79.8905 a 0.99873128,0.99999802 0 1 0 0,-1.9998 h -8.9877 v -84.99133 a 0.99873128,0.99999802 0 0 0 -0.9986,-0.9999 h -59.9179 a 0.99873128,0.99999802 0 0 0 -0.1872,0 z m 1.1858,1.9998 h 57.9207 v 83.99143 h -5.9918 v -76.99213 a 0.99873128,0.99999802 0 0 0 -0.9987,-0.9999 h -43.9397 a 0.99873128,0.99999802 0 0 0 -0.1873,0 0.99873128,0.99999802 0 0 0 -0.8114,0.9999 v 76.99213 h -5.9918 z m 7.9891,7.9992 h 41.9425 v 75.99223 h -41.9425 z m 32.9548,36.49623 c -0.7386,0 -1.3708,0.4031 -1.7164,0.9999 h -4.2754 a 0.99873128,0.99999802 0 0 0 -0.1872,0 1.0030202,1.0042924 0 0 0 0.1872,1.9998 h 4.2754 c 0.3456,0.5969 0.9778,0.9999 1.7164,0.9999 1.103,0 1.9973,-0.8954 1.9973,-1.9998 0,-1.1045 -0.8943,-1.9998 -1.9973,-1.9998 z"
 | 
				
			||||||
 | 
					       style="color:#000000;text-indent:0;text-transform:none;direction:ltr;baseline-shift:baseline;enable-background:accumulate" />
 | 
				
			||||||
 | 
					  </g>
 | 
				
			||||||
 | 
					</svg>
 | 
				
			||||||
| 
		 After Width: | Height: | Size: 2.8 KiB  | 
							
								
								
									
										91
									
								
								assets/layers/entrance/emergency_door.svg
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										91
									
								
								assets/layers/entrance/emergency_door.svg
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,91 @@
 | 
				
			||||||
 | 
					<?xml version="1.0" encoding="UTF-8" standalone="no"?>
 | 
				
			||||||
 | 
					<!-- Created with Inkscape (http://www.inkscape.org/) -->
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					<svg
 | 
				
			||||||
 | 
					   xmlns:dc="http://purl.org/dc/elements/1.1/"
 | 
				
			||||||
 | 
					   xmlns:cc="http://creativecommons.org/ns#"
 | 
				
			||||||
 | 
					   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
 | 
				
			||||||
 | 
					   xmlns:svg="http://www.w3.org/2000/svg"
 | 
				
			||||||
 | 
					   xmlns="http://www.w3.org/2000/svg"
 | 
				
			||||||
 | 
					   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
 | 
				
			||||||
 | 
					   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
 | 
				
			||||||
 | 
					   width="32mm"
 | 
				
			||||||
 | 
					   height="32mm"
 | 
				
			||||||
 | 
					   viewBox="0 0 113.38583 113.38583"
 | 
				
			||||||
 | 
					   id="svg2"
 | 
				
			||||||
 | 
					   version="1.1"
 | 
				
			||||||
 | 
					   inkscape:version="0.91 r13725"
 | 
				
			||||||
 | 
					   sodipodi:docname="emergency_door.svg"
 | 
				
			||||||
 | 
					   inkscape:export-filename="/home/adrien/Documents/Programmation/Web/panieravide.github.io/levelup/img/door.png"
 | 
				
			||||||
 | 
					   inkscape:export-xdpi="25.4"
 | 
				
			||||||
 | 
					   inkscape:export-ydpi="25.4">
 | 
				
			||||||
 | 
					  <defs
 | 
				
			||||||
 | 
					     id="defs4" />
 | 
				
			||||||
 | 
					  <sodipodi:namedview
 | 
				
			||||||
 | 
					     id="base"
 | 
				
			||||||
 | 
					     pagecolor="#ffffff"
 | 
				
			||||||
 | 
					     bordercolor="#666666"
 | 
				
			||||||
 | 
					     borderopacity="1.0"
 | 
				
			||||||
 | 
					     inkscape:pageopacity="0.0"
 | 
				
			||||||
 | 
					     inkscape:pageshadow="2"
 | 
				
			||||||
 | 
					     inkscape:zoom="3.959798"
 | 
				
			||||||
 | 
					     inkscape:cx="17.362557"
 | 
				
			||||||
 | 
					     inkscape:cy="53.453701"
 | 
				
			||||||
 | 
					     inkscape:document-units="px"
 | 
				
			||||||
 | 
					     inkscape:current-layer="layer1"
 | 
				
			||||||
 | 
					     showgrid="false"
 | 
				
			||||||
 | 
					     inkscape:window-width="1600"
 | 
				
			||||||
 | 
					     inkscape:window-height="843"
 | 
				
			||||||
 | 
					     inkscape:window-x="1920"
 | 
				
			||||||
 | 
					     inkscape:window-y="568"
 | 
				
			||||||
 | 
					     inkscape:window-maximized="1"
 | 
				
			||||||
 | 
					     showguides="false" />
 | 
				
			||||||
 | 
					  <metadata
 | 
				
			||||||
 | 
					     id="metadata7">
 | 
				
			||||||
 | 
					    <rdf:RDF>
 | 
				
			||||||
 | 
					      <cc:Work
 | 
				
			||||||
 | 
					         rdf:about="">
 | 
				
			||||||
 | 
					        <dc:format>image/svg+xml</dc:format>
 | 
				
			||||||
 | 
					        <dc:type
 | 
				
			||||||
 | 
					           rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
 | 
				
			||||||
 | 
					        <dc:title />
 | 
				
			||||||
 | 
					      </cc:Work>
 | 
				
			||||||
 | 
					    </rdf:RDF>
 | 
				
			||||||
 | 
					  </metadata>
 | 
				
			||||||
 | 
					  <g
 | 
				
			||||||
 | 
					     inkscape:label="Calque 1"
 | 
				
			||||||
 | 
					     inkscape:groupmode="layer"
 | 
				
			||||||
 | 
					     id="layer1"
 | 
				
			||||||
 | 
					     transform="translate(0,-938.97638)">
 | 
				
			||||||
 | 
					    <path
 | 
				
			||||||
 | 
					       style="fill:none;fill-rule:evenodd;stroke:#000000;stroke-width:2.00000024;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
 | 
				
			||||||
 | 
					       d="m 0,1031.3622 114.00001,0"
 | 
				
			||||||
 | 
					       id="path4138"
 | 
				
			||||||
 | 
					       inkscape:connector-curvature="0"
 | 
				
			||||||
 | 
					       sodipodi:nodetypes="cc" />
 | 
				
			||||||
 | 
					    <rect
 | 
				
			||||||
 | 
					       style="opacity:1;fill:#e2e2e2;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:2.00000024;stroke-linecap:square;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
 | 
				
			||||||
 | 
					       id="rect4136-8"
 | 
				
			||||||
 | 
					       width="60.000004"
 | 
				
			||||||
 | 
					       height="80.000008"
 | 
				
			||||||
 | 
					       x="34.500004"
 | 
				
			||||||
 | 
					       y="951.36212" />
 | 
				
			||||||
 | 
					    <g
 | 
				
			||||||
 | 
					       id="g4150"
 | 
				
			||||||
 | 
					       transform="matrix(1.0676647,0,0,1.0676647,3.6639253,-75.770373)"
 | 
				
			||||||
 | 
					       style="stroke:#ffffff;stroke-opacity:1;stroke-width:0.9366237;stroke-miterlimit:4;stroke-dasharray:none;fill:#019501;fill-opacity:1">
 | 
				
			||||||
 | 
					      <path
 | 
				
			||||||
 | 
					         sodipodi:nodetypes="acccccccccccsscccsccscccccccccccccccaa"
 | 
				
			||||||
 | 
					         id="path4142"
 | 
				
			||||||
 | 
					         d="m 68.306561,997.51621 c -0.860179,-1.02295 -3.90737,-0.8997 -3.90737,-0.8997 l -4.107632,0 -2.888536,-3.32659 c -1.587556,-1.82228 -3.816505,-4.2996 -4.944625,-5.51551 l -2.06064,-2.21759 -10.080305,-0.14192 c -8.582362,-0.12828 -10.357334,-0.0368 -11.812973,0.65368 -2.9186,1.80372 -3.923351,4.81999 -5.429991,7.37782 -2.844868,4.81179 -2.827582,6.35841 0.07096,7.2782 3.773223,-0.5747 4.728773,-4.42983 6.354323,-7.12172 l 1.748132,-2.88581 3.156009,0 c 1.895061,0 3.170111,0.21335 3.170111,0.52585 0,0.51903 -3.344333,7.89048 -4.691254,10.35048 -0.434873,0.7915 -0.928426,4.1168 -1.265042,8.5838 -0.302501,4.0121 -0.62911,7.5829 -0.725091,7.9196 -0.130553,0.4594 -2.172087,0.6095 -8.088354,0.6095 -10.00024,0 -11.499088,0.5914 -12.765035,5.0038 l -0.3984807,1.3783 13.2062767,0 c 12.6486,0 13.252235,-0.036 14.144269,-0.9962 0.786502,-0.8416 0.982558,-2.1107 1.279145,-8.2153 0.325699,-6.6959 0.596812,-8.47 1.109016,-7.2327 0.111902,0.2684 3.009536,6.0091 6.437568,12.7505 3.998459,7.8513 6.691392,12.5822 7.491993,13.1599 0.982557,0.705 1.969663,0.8688 4.52158,0.7551 l 3.256995,-0.1547 -6.327484,-12.7505 c -3.479886,-7.0189 -6.800563,-13.7785 -7.37827,-15.0112 l -1.05079,-2.2472 2.315376,-5.0042 c 1.278234,-2.75118 2.451844,-4.98513 2.615603,-4.96147 0.163759,0.0246 1.646691,1.61985 3.284286,3.55403 l 2.984061,3.52314 5.49049,0.1455 c 0,0 4.349574,0.3122 5.48594,-1.1729 0.753414,-0.9846 0.597657,-2.76508 -0.200261,-3.71399 z"
 | 
				
			||||||
 | 
					         style="fill:#019501;stroke:#ffffff;stroke-opacity:1;stroke-width:0.9366237;stroke-miterlimit:4;stroke-dasharray:none;fill-opacity:1"
 | 
				
			||||||
 | 
					         inkscape:connector-curvature="0" />
 | 
				
			||||||
 | 
					      <circle
 | 
				
			||||||
 | 
					         r="5.9375"
 | 
				
			||||||
 | 
					         cy="977.94257"
 | 
				
			||||||
 | 
					         cx="49.653049"
 | 
				
			||||||
 | 
					         id="path4148"
 | 
				
			||||||
 | 
					         style="opacity:1;fill:#019501;fill-opacity:1;fill-rule:nonzero;stroke:#ffffff;stroke-width:0.9366237;stroke-linecap:square;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
 | 
				
			||||||
 | 
					    </g>
 | 
				
			||||||
 | 
					  </g>
 | 
				
			||||||
 | 
					</svg>
 | 
				
			||||||
| 
		 After Width: | Height: | Size: 4.7 KiB  | 
							
								
								
									
										22
									
								
								assets/layers/entrance/license_info.json
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								assets/layers/entrance/license_info.json
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,22 @@
 | 
				
			||||||
 | 
					[
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "path": "door.svg",
 | 
				
			||||||
 | 
					    "license": "CC-BY 3.0 Unported",
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "Icons Bazaar"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://commons.wikimedia.org/wiki/File:Noun_Project_Door_icon_1512154.svg"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  },
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "path": "emergency_door.svg",
 | 
				
			||||||
 | 
					    "license": "CC-BY-SA 4.0 international",
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "PanierAvide"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://commons.wikimedia.org/wiki/File:Emergency_door_icon.svg"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
							
								
								
									
										12
									
								
								assets/themes/cyclenodes/license_info.json
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										12
									
								
								assets/themes/cyclenodes/license_info.json
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,12 @@
 | 
				
			||||||
 | 
					[
 | 
				
			||||||
 | 
					  {
 | 
				
			||||||
 | 
					    "path": "logo.svg",
 | 
				
			||||||
 | 
					    "license": "GPL",
 | 
				
			||||||
 | 
					    "authors": [
 | 
				
			||||||
 | 
					      "sebkur"
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    "sources": [
 | 
				
			||||||
 | 
					      "https://github.com/mobanisto/MapComplete/commit/1aeb1fdb5b09908d67907f3c816152bfebfdcc79"
 | 
				
			||||||
 | 
					    ]
 | 
				
			||||||
 | 
					  }
 | 
				
			||||||
 | 
					]
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue