import {Translation} from "../../UI/i18n/Translation"; import TagRenderingConfig from "./TagRenderingConfig"; import LayerConfig from "./LayerConfig"; import {LayoutConfigJson} from "./LayoutConfigJson"; import SharedLayers from "../SharedLayers"; import SharedTagRenderings from "../SharedTagRenderings"; export default class LayoutConfig { public readonly id: string; public readonly maintainer: string; public readonly changesetmessage?: string; public readonly version: string; public readonly language: string[]; public readonly title: Translation; public readonly shortDescription?: Translation; public readonly description: Translation; public readonly descriptionTail?: Translation; public readonly icon: string; public readonly socialImage?: string; public readonly startZoom: number; public readonly startLat: number; public readonly startLon: number; public readonly widenFactor: number; public readonly roamingRenderings: TagRenderingConfig[]; public readonly defaultBackgroundId?: string; public readonly layers: LayerConfig[]; public readonly clustering?: { maxZoom: number, minNeededElements: number }; public readonly hideFromOverview: boolean; public readonly enableUserBadge: boolean; public readonly enableShareScreen: boolean; public readonly enableMoreQuests: boolean; public readonly enableAddNewPoints: boolean; public readonly enableLayers: boolean; public readonly enableSearch: boolean; public readonly enableGeolocation: boolean; public readonly enableBackgroundLayerSelection: boolean; public readonly customCss?: string; constructor(json: LayoutConfigJson, context?: string) { this.id = json.id; context = (context ?? "") + "." + this.id; this.maintainer = json.maintainer; this.changesetmessage = json.changesetmessage; this.version = json.version; this.language = []; if (typeof json.language === "string") { this.language = [json.language]; } else { this.language = json.language; } if (json.title === undefined) { throw "Title not defined in " + this.id; } if (json.description === undefined) { throw "Description not defined in " + this.id; } this.title = new Translation(json.title, context + ".title"); this.description = new Translation(json.description, context + ".description"); this.shortDescription = json.shortDescription === undefined ? this.description.FirstSentence() : new Translation(json.shortDescription, context + ".shortdescription"); this.descriptionTail = json.descriptionTail === undefined ? new Translation({"*": ""}, context) : new Translation(json.descriptionTail, context + ".descriptionTail"); this.icon = json.icon; this.socialImage = json.socialImage; this.startZoom = json.startZoom; this.startLat = json.startLat; this.startLon = json.startLon; this.widenFactor = json.widenFactor ?? 0.05; this.roamingRenderings = (json.roamingRenderings ?? []).map((tr, i) => { if (typeof tr === "string") { if (SharedTagRenderings.SharedTagRendering[tr] !== undefined) { return SharedTagRenderings.SharedTagRendering[tr]; } } return new TagRenderingConfig(tr, `${this.id}.roaming_renderings[${i}]`); } ); this.defaultBackgroundId = json.defaultBackgroundId; this.layers = json.layers.map((layer, i) => { if (typeof layer === "string"){ if (SharedLayers.sharedLayers[layer] !== undefined) { return SharedLayers.sharedLayers[layer]; } else { throw "Unkown fixed layer " + layer; } } return new LayerConfig(layer, this.roamingRenderings, `${this.id}.layers[${i}]`); }); this.clustering = { maxZoom: 16, minNeededElements: 250 }; if(json.clustering){ this.clustering = { maxZoom : json.clustering.maxZoom ?? 18, minNeededElements: json.clustering.minNeededElements ?? 1 } for (const layer of this.layers) { if(layer.wayHandling !== LayerConfig.WAYHANDLING_CENTER_ONLY){ console.error("WARNING: In order to allow clustering, every layer must be set to CENTER_ONLY. Layer", layer.id,"does not respect this for layout",this.id); } } } this.hideFromOverview = json.hideFromOverview ?? false; this.enableUserBadge = json.enableUserBadge ?? true; this.enableShareScreen = json.enableShareScreen ?? true; this.enableMoreQuests = json.enableMoreQuests ?? true; this.enableLayers = json.enableLayers ?? true; this.enableSearch = json.enableSearch ?? true; this.enableGeolocation = json.enableGeolocation ?? true; this.enableAddNewPoints = json.enableAddNewPoints ?? true; this.enableBackgroundLayerSelection = json.enableBackgroundLayerSelection ?? true; this.customCss = json.customCss; } }