diff --git a/Models/ThemeConfig/Conversion/LegacyJsonConvert.ts b/Models/ThemeConfig/Conversion/LegacyJsonConvert.ts index c03b1b4d7..7be672c92 100644 --- a/Models/ThemeConfig/Conversion/LegacyJsonConvert.ts +++ b/Models/ThemeConfig/Conversion/LegacyJsonConvert.ts @@ -344,9 +344,6 @@ class ValidateTheme extends DesugaringStep { { // Legacy format checks if (this._isBuiltin) { - if (typeof json.language === "string") { - errors.push("The theme " + json.id + " has a string as language. Please use a list of strings") - } if (json["units"] !== undefined) { errors.push("The theme " + json.id + " has units defined - these should be defined on the layer instead. (Hint: use overrideAll: { '+units': ... }) ") } diff --git a/Models/ThemeConfig/Json/LayoutConfigJson.ts b/Models/ThemeConfig/Json/LayoutConfigJson.ts index 79742b2fb..d3f545581 100644 --- a/Models/ThemeConfig/Json/LayoutConfigJson.ts +++ b/Models/ThemeConfig/Json/LayoutConfigJson.ts @@ -41,20 +41,16 @@ export interface LayoutConfigJson { * Should be sortable, where the higher value is the later version */ version: string; - /** - * The supported language(s). - * This should be a two-letter, lowercase code which identifies the language, e.g. "en", "nl", ... - * If the theme supports multiple languages, use a list: `["en","nl","fr"]` to allow the user to pick any of them - */ - language: string | string[]; /** - * Only used in 'generateLayerOverview': if present, every translation will be checked to make sure it is fully translated + * Only used in 'generateLayerOverview': if present, every translation will be checked to make sure it is fully translated. + * + * This must be a list of two-letter, lowercase codes which identifies the language, e.g. "en", "nl", ... */ mustHaveLanguage?: string[] /** - * The title, as shown in the welcome message and the more-screen + * The title, as shown in the welcome message and the more-screen. */ title: string | any; diff --git a/Models/ThemeConfig/LayerConfig.ts b/Models/ThemeConfig/LayerConfig.ts index 065c0b74d..eea16081b 100644 --- a/Models/ThemeConfig/LayerConfig.ts +++ b/Models/ThemeConfig/LayerConfig.ts @@ -301,8 +301,9 @@ export default class LayerConfig extends WithContextLoader { if (mapRendering === undefined) { return undefined } - const defaultTags = new UIEventSource(TagUtils.changeAsProperties(this.source.osmTags.asChange({id: "node/-1"}))) - return mapRendering.GenerateLeafletStyle(defaultTags, false, {noSize: true}).html + const baseTags = TagUtils.changeAsProperties(this.source.osmTags.asChange({id: "node/-1"})) + return mapRendering.GenerateLeafletStyle(new UIEventSource(baseTags), false, + {noSize: true, includeBadges: false}).html } public GenerateDocumentation(usedInThemes: string[], layerIsNeededBy: Map, dependencies: { diff --git a/Models/ThemeConfig/LayoutConfig.ts b/Models/ThemeConfig/LayoutConfig.ts index 4fb833612..389a69000 100644 --- a/Models/ThemeConfig/LayoutConfig.ts +++ b/Models/ThemeConfig/LayoutConfig.ts @@ -66,14 +66,13 @@ export default class LayoutConfig { this.maintainer = json.maintainer; this.credits = json.credits; this.version = json.version; - this.language = []; + this.language = Array.from(Object.keys(json.title)); - if (typeof json.language === "string") { - this.language = [json.language]; - } else { - this.language = json.language; - } { + if (typeof json.title === "string") { + console.error("The title is not a translation, it instead is ", json.title, "("+typeof json.title+")") + throw `The title of a theme should always be a translation, as it sets the corresponding languages (${context}.title)` + } if (this.language.length == 0) { throw `No languages defined. Define at least one language. (${context}.languages)` } @@ -120,7 +119,7 @@ export default class LayoutConfig { this.clustering = { maxZoom: 16, - minNeededElements: 25, + minNeededElements: 250, }; if (json.clustering === false) { this.clustering = { @@ -130,7 +129,7 @@ export default class LayoutConfig { } else if (json.clustering) { this.clustering = { maxZoom: json.clustering.maxZoom ?? 18, - minNeededElements: json.clustering.minNeededElements ?? 25, + minNeededElements: json.clustering.minNeededElements ?? 250, } } diff --git a/Models/ThemeConfig/PointRenderingConfig.ts b/Models/ThemeConfig/PointRenderingConfig.ts index ac957a985..6ef8f5aa7 100644 --- a/Models/ThemeConfig/PointRenderingConfig.ts +++ b/Models/ThemeConfig/PointRenderingConfig.ts @@ -150,7 +150,8 @@ export default class PointRenderingConfig extends WithContextLoader { tags: UIEventSource, clickable: boolean, options?: { - noSize: false | boolean + noSize: false | boolean, + includeBadges: true | boolean } ): { @@ -201,7 +202,11 @@ export default class PointRenderingConfig extends WithContextLoader { const icon = this.GetSimpleIcon(tags) - const iconAndBadges = new Combine([icon, this.GetBadges(tags)]) + let badges = undefined; + if( options?.includeBadges ?? true){ + badges = this.GetBadges(tags) + } + const iconAndBadges = new Combine([icon,badges ]) .SetClass("block relative") if (!options?.noSize) { diff --git a/UI/BigComponents/FilterView.ts b/UI/BigComponents/FilterView.ts index fe1ecec8e..738bd9b00 100644 --- a/UI/BigComponents/FilterView.ts +++ b/UI/BigComponents/FilterView.ts @@ -22,7 +22,8 @@ import {InputElement} from "../Input/InputElement"; import {DropDown} from "../Input/DropDown"; export default class FilterView extends VariableUiElement { - constructor(filteredLayer: UIEventSource, tileLayers: { config: TilesourceConfig, isDisplayed: UIEventSource }[]) { + constructor(filteredLayer: UIEventSource, + tileLayers: { config: TilesourceConfig, isDisplayed: UIEventSource }[]) { const backgroundSelector = new Toggle( new BackgroundSelector(), undefined, @@ -30,8 +31,11 @@ export default class FilterView extends VariableUiElement { ) super( filteredLayer.map((filteredLayers) => { + // Create the views which toggle layers (and filters them) ... let elements = filteredLayers?.map(l => FilterView.createOneFilteredLayerElement(l)) + // ... create views for non-interactive layers ... elements = elements.concat(tileLayers.map(tl => FilterView.createOverlayToggle(tl))) + // ... and add the dropdown to select a different background return elements.concat(backgroundSelector); } ) @@ -93,11 +97,6 @@ export default class FilterView extends VariableUiElement { iconStyle ); - if (filteredLayer.layerDef.name === undefined) { - return; - } - - const name: Translation = Translations.WT( filteredLayer.layerDef.name ); diff --git a/assets/themes/notes/notes.json b/assets/themes/notes/notes.json index b92bbbadc..73b1e830e 100644 --- a/assets/themes/notes/notes.json +++ b/assets/themes/notes/notes.json @@ -1,15 +1,16 @@ { "id": "notes", - "language": [ - "en" - ], "maintainer": "MapComplete", "startLat": 0, "startLon": 0, "startZoom": 0, - "title": "Notes on OpenStreetMap", + "title": { + "en": "Notes on OpenStreetMap" + }, "version": "0.1", - "description": "A note is a pin on the map with some text to indicate something wrong.

Make sure to checkout the filter view to search for users and text.", + "description": { + "en": "A note is a pin on the map with some text to indicate something wrong.

Make sure to checkout the filter view to search for users and text." + }, "icon": "./assets/svg/resolved.svg", "clustering": false, "enableDownload": true, diff --git a/assets/themes/toilets/toilets.json b/assets/themes/toilets/toilets.json index 7653ba81b..e008133c1 100644 --- a/assets/themes/toilets/toilets.json +++ b/assets/themes/toilets/toilets.json @@ -14,7 +14,7 @@ "hu": "WC-térkép" }, "description": { - "en": "A map of public toilets", + "en": "OpenStreetMap has the biggest dataset of toilets. Worldwide, over 300.000 toilets are known in this map. And, best of all, if one is missing, you can easily add it yourself!

So, if you need to pee or poo, find a loo!", "de": "Eine Karte mit öffentlich zugänglichen Toiletten", "fr": "Carte affichant les WC et toilettes publiques", "nl": "Een kaart met openbare toiletten", diff --git a/scripts/generateLayerOverview.ts b/scripts/generateLayerOverview.ts index 251a92f2d..d293889ee 100644 --- a/scripts/generateLayerOverview.ts +++ b/scripts/generateLayerOverview.ts @@ -196,4 +196,10 @@ class LayerOverviewUtils { } } +try{ new LayerOverviewUtils().main(process.argv) + +}catch(e){ + console.error("ERROR WHILE GENERATING THE LAYERS:", e) + console.log("If a weird error persists, 'npm run reset:layeroverview'") +} diff --git a/scripts/lint.ts b/scripts/lint.ts index c41ded14d..4857af6cb 100644 --- a/scripts/lint.ts +++ b/scripts/lint.ts @@ -1,6 +1,6 @@ import ScriptUtils from "./ScriptUtils"; import {writeFileSync} from "fs"; -import {FixLegacyTheme, UpdateLegacyLayer} from "../Models/ThemeConfig/LegacyJsonConvert"; +import {FixLegacyTheme, UpdateLegacyLayer} from "../Models/ThemeConfig/Conversion/LegacyJsonConvert"; /* * This script reads all theme and layer files and reformats them inplace diff --git a/test/Theme.spec.ts b/test/Theme.spec.ts index ce005bbd1..4cd428f06 100644 --- a/test/Theme.spec.ts +++ b/test/Theme.spec.ts @@ -16,7 +16,6 @@ export default class ThemeSpec extends T { let themeConfigJson: LayoutConfigJson = { description: "Descr", icon: "", - language: ["en"], layers: [ { builtin: "public_bookcase",