forked from MapComplete/MapComplete
		
	Add check for sync-selection mode, fix personal theme by revoking it's special status from 'determine theme', fix #871
This commit is contained in:
		
							parent
							
								
									3b01e62fbe
								
							
						
					
					
						commit
						7c6e292013
					
				
					 9 changed files with 59 additions and 27 deletions
				
			
		| 
						 | 
					@ -9,7 +9,6 @@ import BaseUIElement from "../UI/BaseUIElement";
 | 
				
			||||||
import {UIEventSource} from "./UIEventSource";
 | 
					import {UIEventSource} from "./UIEventSource";
 | 
				
			||||||
import {LocalStorageSource} from "./Web/LocalStorageSource";
 | 
					import {LocalStorageSource} from "./Web/LocalStorageSource";
 | 
				
			||||||
import LZString from "lz-string";
 | 
					import LZString from "lz-string";
 | 
				
			||||||
import * as personal from "../assets/themes/personal/personal.json";
 | 
					 | 
				
			||||||
import {FixLegacyTheme} from "../Models/ThemeConfig/Conversion/LegacyJsonConvert";
 | 
					import {FixLegacyTheme} from "../Models/ThemeConfig/Conversion/LegacyJsonConvert";
 | 
				
			||||||
import {LayerConfigJson} from "../Models/ThemeConfig/Json/LayerConfigJson";
 | 
					import {LayerConfigJson} from "../Models/ThemeConfig/Json/LayerConfigJson";
 | 
				
			||||||
import SharedTagRenderings from "../Customizations/SharedTagRenderings";
 | 
					import SharedTagRenderings from "../Customizations/SharedTagRenderings";
 | 
				
			||||||
| 
						 | 
					@ -52,17 +51,7 @@ export default class DetermineLayout {
 | 
				
			||||||
            console.log("Using layout", layoutId);
 | 
					            console.log("Using layout", layoutId);
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        layoutId = QueryParameters.GetQueryParameter("layout", layoutId, "The layout to load into MapComplete").data;
 | 
					        layoutId = QueryParameters.GetQueryParameter("layout", layoutId, "The layout to load into MapComplete").data;
 | 
				
			||||||
        const layoutToUse: LayoutConfig = AllKnownLayouts.allKnownLayouts.get(layoutId?.toLowerCase());
 | 
					        return AllKnownLayouts.allKnownLayouts.get(layoutId?.toLowerCase())
 | 
				
			||||||
 | 
					 | 
				
			||||||
        if (layoutToUse?.id === personal.id) {
 | 
					 | 
				
			||||||
            layoutToUse.layers = AllKnownLayouts.AllPublicLayers()
 | 
					 | 
				
			||||||
            for (const layer of layoutToUse.layers) {
 | 
					 | 
				
			||||||
                layer.minzoomVisible = Math.max(layer.minzoomVisible, layer.minzoom)
 | 
					 | 
				
			||||||
                layer.minzoom = Math.max(16, layer.minzoom)
 | 
					 | 
				
			||||||
            }
 | 
					 | 
				
			||||||
        }
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        return layoutToUse
 | 
					 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public static LoadLayoutFromHash(
 | 
					    public static LoadLayoutFromHash(
 | 
				
			||||||
| 
						 | 
					@ -161,7 +150,8 @@ export default class DetermineLayout {
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        const converState = {
 | 
					        const converState = {
 | 
				
			||||||
            tagRenderings: SharedTagRenderings.SharedTagRenderingJson,
 | 
					            tagRenderings: SharedTagRenderings.SharedTagRenderingJson,
 | 
				
			||||||
            sharedLayers: knownLayersDict
 | 
					            sharedLayers: knownLayersDict,
 | 
				
			||||||
 | 
					            publicLayers: new Set<string>()
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        json = new FixLegacyTheme().convertStrict(json, "While loading a dynamic theme")
 | 
					        json = new FixLegacyTheme().convertStrict(json, "While loading a dynamic theme")
 | 
				
			||||||
        const raw = json;
 | 
					        const raw = json;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2,7 +2,7 @@ import {Utils} from "../Utils";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export default class Constants {
 | 
					export default class Constants {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public static vNumber = "0.20.1";
 | 
					    public static vNumber = "0.20.2";
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
    public static ImgurApiKey = '7070e7167f0a25a'
 | 
					    public static ImgurApiKey = '7070e7167f0a25a'
 | 
				
			||||||
    public static readonly mapillary_client_token_v4 = "MLY|4441509239301885|b40ad2d3ea105435bd40c7e76993ae85"
 | 
					    public static readonly mapillary_client_token_v4 = "MLY|4441509239301885|b40ad2d3ea105435bd40c7e76993ae85"
 | 
				
			||||||
| 
						 | 
					@ -23,7 +23,7 @@ export default class Constants {
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * Layer IDs of layers which have special properties through built-in hooks
 | 
					     * Layer IDs of layers which have special properties through built-in hooks
 | 
				
			||||||
     */
 | 
					     */
 | 
				
			||||||
    public static readonly priviliged_layers: string[] = [...Constants.added_by_default, "type_node", "note", "import_candidate", ...Constants.no_include]
 | 
					    public static readonly priviliged_layers: string[] = [...Constants.added_by_default, "type_node", "note", "import_candidate", "direction", ...Constants.no_include]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // The user journey states thresholds when a new feature gets unlocked
 | 
					    // The user journey states thresholds when a new feature gets unlocked
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4,7 +4,8 @@ import {Utils} from "../../../Utils";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export interface DesugaringContext {
 | 
					export interface DesugaringContext {
 | 
				
			||||||
    tagRenderings: Map<string, TagRenderingConfigJson>
 | 
					    tagRenderings: Map<string, TagRenderingConfigJson>
 | 
				
			||||||
    sharedLayers: Map<string, LayerConfigJson>
 | 
					    sharedLayers: Map<string, LayerConfigJson>,
 | 
				
			||||||
 | 
					    publicLayers: Set<string>
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
export abstract class Conversion<TIn, TOut> {
 | 
					export abstract class Conversion<TIn, TOut> {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -454,8 +454,15 @@ class PreparePersonalTheme extends DesugaringStep<LayoutConfigJson> {
 | 
				
			||||||
            return {result: json}
 | 
					            return {result: json}
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        
 | 
					        
 | 
				
			||||||
        json.layers = Array.from(this._state.sharedLayers.keys()).filter(l => Constants.priviliged_layers.indexOf(l) < 0)
 | 
					        // The only thing this _really_ does, is adding the layer-ids into 'layers'
 | 
				
			||||||
        return {result: json};
 | 
					        // All other preparations are done by the 'override-all'-block in personal.json
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        json.layers = Array.from(this._state.sharedLayers.keys())
 | 
				
			||||||
 | 
					            .filter(l => Constants.priviliged_layers.indexOf(l) < 0)
 | 
				
			||||||
 | 
					            .filter(l => this._state.publicLayers.has(l))
 | 
				
			||||||
 | 
					        return {result: json, information: [
 | 
				
			||||||
 | 
					            "The personal theme has "+json.layers.length+" public layers"
 | 
				
			||||||
 | 
					            ]};
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -426,7 +426,7 @@ export interface LayerConfigJson {
 | 
				
			||||||
    units?: UnitConfigJson[]
 | 
					    units?: UnitConfigJson[]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /**
 | 
					    /**
 | 
				
			||||||
     * If set, synchronizes wether or not this layer is selected.
 | 
					     * If set, synchronizes whether or not this layer is enabled.
 | 
				
			||||||
     *
 | 
					     *
 | 
				
			||||||
     * no: Do not sync at all, always revert to default
 | 
					     * no: Do not sync at all, always revert to default
 | 
				
			||||||
     * local: keep selection on local storage
 | 
					     * local: keep selection on local storage
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -65,7 +65,8 @@ export default class LayerConfig extends WithContextLoader {
 | 
				
			||||||
    public readonly filterIsSameAs: string;
 | 
					    public readonly filterIsSameAs: string;
 | 
				
			||||||
    public readonly forceLoad: boolean;
 | 
					    public readonly forceLoad: boolean;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    public readonly syncSelection: "no" | "local" | "theme-only" | "global"
 | 
					    public static readonly syncSelectionAllowed =  ["no" , "local" , "theme-only" , "global"] as const;
 | 
				
			||||||
 | 
					    public readonly syncSelection: (typeof LayerConfig.syncSelectionAllowed)[number] // this is a trick to conver a constant array of strings into a type union of these values
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    constructor(
 | 
					    constructor(
 | 
				
			||||||
        json: LayerConfigJson,
 | 
					        json: LayerConfigJson,
 | 
				
			||||||
| 
						 | 
					@ -97,7 +98,10 @@ export default class LayerConfig extends WithContextLoader {
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        this.maxAgeOfCache = json.source.maxCacheAge ?? 24 * 60 * 60 * 30
 | 
					        this.maxAgeOfCache = json.source.maxCacheAge ?? 24 * 60 * 60 * 30
 | 
				
			||||||
        this.syncSelection = json.syncSelection;
 | 
					        if(json.syncSelection !== undefined && LayerConfig.syncSelectionAllowed.indexOf(json.syncSelection) < 0){
 | 
				
			||||||
 | 
					            throw context+ " Invalid sync-selection: must be one of "+LayerConfig.syncSelectionAllowed.map(v => `'${v}'`).join(", ")+" but got '"+json.syncSelection+"'"
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        this.syncSelection = json.syncSelection ?? "no";
 | 
				
			||||||
        const osmTags = TagUtils.Tag(
 | 
					        const osmTags = TagUtils.Tag(
 | 
				
			||||||
            json.source.osmTags,
 | 
					            json.source.osmTags,
 | 
				
			||||||
            context + "source.osmTags"
 | 
					            context + "source.osmTags"
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -223,7 +223,9 @@ export default class FeatureInfoBox extends ScrollableFullScreen {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
                        return new Combine([new TagRenderingAnswer(tags, config_all_tags, state),
 | 
					                        return new Combine([new TagRenderingAnswer(tags, config_all_tags, state),
 | 
				
			||||||
                            new TagRenderingAnswer(tags, config_download, state),
 | 
					                            new TagRenderingAnswer(tags, config_download, state),
 | 
				
			||||||
                            new TagRenderingAnswer(tags, config_id, state)])
 | 
					                            new TagRenderingAnswer(tags, config_id, state),
 | 
				
			||||||
 | 
					                            "This is layer "+layerConfig.id
 | 
				
			||||||
 | 
					                        ])
 | 
				
			||||||
                    }
 | 
					                    }
 | 
				
			||||||
                })
 | 
					                })
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -41,8 +41,9 @@
 | 
				
			||||||
  "overpassMaxZoom": 15,
 | 
					  "overpassMaxZoom": 15,
 | 
				
			||||||
  "overrideAll": {
 | 
					  "overrideAll": {
 | 
				
			||||||
    "minzoom": 17,
 | 
					    "minzoom": 17,
 | 
				
			||||||
    "syncSelection": "theme",
 | 
					    "syncSelection": "theme-only",
 | 
				
			||||||
    "shownByDefault": false
 | 
					    "shownByDefault": false
 | 
				
			||||||
  },
 | 
					  },
 | 
				
			||||||
 | 
					  "enableNoteImports": false,
 | 
				
			||||||
  "layers": []
 | 
					  "layers": []
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -13,8 +13,6 @@ import PointRenderingConfigJson from "../Models/ThemeConfig/Json/PointRenderingC
 | 
				
			||||||
import {PrepareLayer} from "../Models/ThemeConfig/Conversion/PrepareLayer";
 | 
					import {PrepareLayer} from "../Models/ThemeConfig/Conversion/PrepareLayer";
 | 
				
			||||||
import {PrepareTheme} from "../Models/ThemeConfig/Conversion/PrepareTheme";
 | 
					import {PrepareTheme} from "../Models/ThemeConfig/Conversion/PrepareTheme";
 | 
				
			||||||
import {DesugaringContext} from "../Models/ThemeConfig/Conversion/Conversion";
 | 
					import {DesugaringContext} from "../Models/ThemeConfig/Conversion/Conversion";
 | 
				
			||||||
import LayerConfig from "../Models/ThemeConfig/LayerConfig";
 | 
					 | 
				
			||||||
import LayerConfigJsonJSC from "../Docs/Schemas/LayerConfigJsonJSC";
 | 
					 | 
				
			||||||
import {Utils} from "../Utils";
 | 
					import {Utils} from "../Utils";
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// This scripts scans 'assets/layers/*.json' for layer definition files and 'assets/themes/*.json' for theme definition files.
 | 
					// This scripts scans 'assets/layers/*.json' for layer definition files and 'assets/themes/*.json' for theme definition files.
 | 
				
			||||||
| 
						 | 
					@ -190,7 +188,8 @@ class LayerOverviewUtils {
 | 
				
			||||||
        const sharedLayers = new Map<string, LayerConfigJson>()
 | 
					        const sharedLayers = new Map<string, LayerConfigJson>()
 | 
				
			||||||
        const state: DesugaringContext = {
 | 
					        const state: DesugaringContext = {
 | 
				
			||||||
            tagRenderings: sharedTagRenderings,
 | 
					            tagRenderings: sharedTagRenderings,
 | 
				
			||||||
            sharedLayers
 | 
					            sharedLayers,
 | 
				
			||||||
 | 
					            publicLayers: new Set()
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        const prepLayer = new PrepareLayer(state);
 | 
					        const prepLayer = new PrepareLayer(state);
 | 
				
			||||||
        for (const sharedLayerJson of layerFiles) {
 | 
					        for (const sharedLayerJson of layerFiles) {
 | 
				
			||||||
| 
						 | 
					@ -211,14 +210,42 @@ class LayerOverviewUtils {
 | 
				
			||||||
        return sharedLayers;
 | 
					        return sharedLayers;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    
 | 
					    
 | 
				
			||||||
 | 
					    private static publicLayerIdsFrom(themefiles: LayoutConfigJson[]): Set<string>{
 | 
				
			||||||
 | 
					        const publicLayers = [].concat(...themefiles
 | 
				
			||||||
 | 
					            .filter(th => !th.hideFromOverview)
 | 
				
			||||||
 | 
					            .map(th => th.layers))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        const publicLayerIds = new Set<string>()
 | 
				
			||||||
 | 
					        for (const publicLayer of publicLayers) {
 | 
				
			||||||
 | 
					            if(typeof publicLayer === "string"){
 | 
				
			||||||
 | 
					                publicLayerIds.add(publicLayer)
 | 
				
			||||||
 | 
					                continue
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            if(publicLayer["builtin"] !== undefined){
 | 
				
			||||||
 | 
					                const bi = publicLayer["builtin"]
 | 
				
			||||||
 | 
					                if(typeof bi === "string"){
 | 
				
			||||||
 | 
					                    publicLayerIds.add(bi)
 | 
				
			||||||
 | 
					                    continue
 | 
				
			||||||
 | 
					                }
 | 
				
			||||||
 | 
					                bi.forEach(id=>publicLayerIds.add(id))
 | 
				
			||||||
 | 
					                continue
 | 
				
			||||||
 | 
					            }
 | 
				
			||||||
 | 
					            publicLayerIds.add(publicLayer.id)
 | 
				
			||||||
 | 
					        }
 | 
				
			||||||
 | 
					        return publicLayerIds
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    private buildThemeIndex(knownImagePaths: Set<string>, sharedLayers: Map<string, LayerConfigJson>): Map<string, LayoutConfigJson> {
 | 
					    private buildThemeIndex(knownImagePaths: Set<string>, sharedLayers: Map<string, LayerConfigJson>): Map<string, LayoutConfigJson> {
 | 
				
			||||||
        console.log("   ---------- VALIDATING BUILTIN THEMES ---------")
 | 
					        console.log("   ---------- VALIDATING BUILTIN THEMES ---------")
 | 
				
			||||||
        const themeFiles = ScriptUtils.getThemeFiles();
 | 
					        const themeFiles = ScriptUtils.getThemeFiles();
 | 
				
			||||||
        const fixed = new Map<string, LayoutConfigJson>();
 | 
					        const fixed = new Map<string, LayoutConfigJson>();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        const publicLayers = LayerOverviewUtils.publicLayerIdsFrom(themeFiles.map(th => th.parsed))
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        const convertState: DesugaringContext = {
 | 
					        const convertState: DesugaringContext = {
 | 
				
			||||||
            sharedLayers,
 | 
					            sharedLayers,
 | 
				
			||||||
            tagRenderings: this.getSharedTagRenderings()
 | 
					            tagRenderings: this.getSharedTagRenderings(),
 | 
				
			||||||
 | 
					            publicLayers
 | 
				
			||||||
        }
 | 
					        }
 | 
				
			||||||
        for (const themeInfo of themeFiles) {
 | 
					        for (const themeInfo of themeFiles) {
 | 
				
			||||||
            let themeFile = themeInfo.parsed
 | 
					            let themeFile = themeInfo.parsed
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue