diff --git a/assets/themes/mapcomplete-changes/mapcomplete-changes.json b/assets/themes/mapcomplete-changes/mapcomplete-changes.json index 2274fc3f6f..43c13c03f9 100644 --- a/assets/themes/mapcomplete-changes/mapcomplete-changes.json +++ b/assets/themes/mapcomplete-changes/mapcomplete-changes.json @@ -46,6 +46,12 @@ "en": "Shows all MapComplete changes" }, "tagRenderings": [ + { + "id": "render_id", + "render": { + "en": "Changeset {id}" + } + }, { "id": "contributor", "render": { @@ -73,9 +79,230 @@ "point", "centroid" ], - "icon": {"render":"teardrop:#00cc00", - "mappings": [{"if":"theme=aed","then":"./assets/themes/aed/logo.svg"},{"if":"theme=aed_brugge","then":"./assets/themes/aed/logo.svg"},{"if":"theme=artwork","then":"./assets/themes/artwork/artwork.svg"},{"if":"theme=benches","then":"./assets/themes/benches/bench_poi.svg"},{"if":"theme=bicyclelib","then":"./assets/themes/bicyclelib/logo.svg"},{"if":"theme=binoculars","then":"./assets/layers/binocular/telescope.svg"},{"if":"theme=bookcases","then":"./assets/themes/bookcases/bookcase.svg"},{"if":"theme=buurtnatuur","then":"./assets/themes/buurtnatuur/groen_logo.svg"},{"if":"theme=cafes_and_pubs","then":"./assets/layers/cafe_pub/pub.svg"},{"if":"theme=campersite","then":"./assets/themes/campersite/caravan.svg"},{"if":"theme=charging_stations","then":"./assets/themes/charging_stations/logo.svg"},{"if":"theme=climbing","then":"./assets/themes/climbing/climbing_icon.svg"},{"if":"theme=cycle_highways","then":"./assets/themes/cycle_highways/fietssnelwegen-logo.svg"},{"if":"theme=cycle_infra","then":"./assets/themes/cycle_infra/cycle-infra.svg"},{"if":"theme=cyclenodes","then":"./assets/themes/cyclenodes/logo.svg"},{"if":"theme=cyclestreets","then":"./assets/themes/cyclestreets/F111.svg"},{"if":"theme=cyclofix","then":"./assets/themes/cyclofix/logo.svg"},{"if":"theme=drinking_water","then":"./assets/themes/drinking_water/logo.svg"},{"if":"theme=entrances","then":"./assets/layers/entrance/door.svg"},{"if":"theme=etymology","then":"./assets/layers/etymology/logo.svg"},{"if":"theme=facadegardens","then":"./assets/themes/facadegardens/geveltuin.svg"},{"if":"theme=food","then":"./assets/layers/food/restaurant.svg"},{"if":"theme=fritures","then":"./assets/themes/fritures/logo.svg"},{"if":"theme=fruit_trees","then":"./assets/themes/fruit_trees/fruit_tree.svg"},{"if":"theme=ghostbikes","then":"./assets/themes/ghostbikes/logo.svg"},{"if":"theme=grb","then":"./assets/themes/grb_import/housenumber_blank.svg"},{"if":"theme=grb_fixme","then":"./assets/svg/bug.svg"},{"if":"theme=missing_streets","then":"./assets/svg/robot.svg"},{"if":"theme=hackerspaces","then":"./assets/themes/hackerspaces/glider.svg"},{"if":"theme=hailhydrant","then":"./assets/themes/hailhydrant/logo.svg"},{"if":"theme=mapcomplete-changes","then":"./assets/svg/logo.svg"},{"if":"theme=maps","then":"./assets/themes/maps/logo.svg"},{"if":"theme=nature","then":"./assets/themes/nature/logo.svg"},{"if":"theme=natuurpunt","then":"./assets/themes/natuurpunt/natuurpunt.png"},{"if":"theme=notes","then":"./assets/svg/resolved.svg"},{"if":"theme=observation_towers","then":"./assets/layers/observation_tower/Tower_observation.svg"},{"if":"theme=openwindpowermap","then":"./assets/themes/openwindpowermap/wind_turbine.svg"},{"if":"theme=parkings","then":"./assets/themes/parkings/parkings.svg"},{"if":"theme=personal","then":"./assets/svg/addSmall.svg"},{"if":"theme=play_forests","then":"./assets/layers/play_forest/icon.svg"},{"if":"theme=playgrounds","then":"./assets/themes/playgrounds/playground.svg"},{"if":"theme=postal_codes","then":"./assets/themes/postal_codes/townhall.svg"},{"if":"theme=postboxes","then":"./assets/themes/postboxes/postbox.svg"},{"if":"theme=shops","then":"./assets/themes/shops/shop.svg"},{"if":"theme=sidewalks","then":"./assets/svg/bug.svg"},{"if":"theme=speelplekken","then":"./assets/themes/speelplekken/logo.svg"},{"if":"theme=sport_pitches","then":"./assets/layers/sport_pitch/table_tennis.svg"},{"if":"theme=street_lighting","then":"./assets/layers/street_lamps/street_lamp.svg"},{"if":"theme=street_lighting_assen","then":"./assets/layers/street_lamps/street_lamp.svg"},{"if":"theme=surveillance","then":"./assets/themes/surveillance/logo.svg"},{"if":"theme=toerisme_vlaanderen","then":"./assets/svg/teardrop_with_hole_green.svg"},{"if":"theme=toilets","then":"./assets/themes/toilets/toilets.svg"},{"if":"theme=trees","then":"./assets/themes/trees/logo.svg"},{"if":"theme=uk_addresses","then":"./assets/themes/uk_addresses/housenumber_unknown.svg"},{"if":"theme=waste_basket","then":"./assets/themes/waste_basket/waste_basket.svg"}] - + "icon": { + "render": "teardrop:#00cc00", + "mappings": [ + { + "if": "theme=aed", + "then": "./assets/themes/aed/logo.svg" + }, + { + "if": "theme=aed_brugge", + "then": "./assets/themes/aed/logo.svg" + }, + { + "if": "theme=artwork", + "then": "./assets/themes/artwork/artwork.svg" + }, + { + "if": "theme=benches", + "then": "./assets/themes/benches/bench_poi.svg" + }, + { + "if": "theme=bicyclelib", + "then": "./assets/themes/bicyclelib/logo.svg" + }, + { + "if": "theme=binoculars", + "then": "./assets/layers/binocular/telescope.svg" + }, + { + "if": "theme=bookcases", + "then": "./assets/themes/bookcases/bookcase.svg" + }, + { + "if": "theme=buurtnatuur", + "then": "./assets/themes/buurtnatuur/groen_logo.svg" + }, + { + "if": "theme=cafes_and_pubs", + "then": "./assets/layers/cafe_pub/pub.svg" + }, + { + "if": "theme=campersite", + "then": "./assets/themes/campersite/caravan.svg" + }, + { + "if": "theme=charging_stations", + "then": "./assets/themes/charging_stations/logo.svg" + }, + { + "if": "theme=climbing", + "then": "./assets/themes/climbing/climbing_icon.svg" + }, + { + "if": "theme=cycle_highways", + "then": "./assets/themes/cycle_highways/fietssnelwegen-logo.svg" + }, + { + "if": "theme=cycle_infra", + "then": "./assets/themes/cycle_infra/cycle-infra.svg" + }, + { + "if": "theme=cyclenodes", + "then": "./assets/themes/cyclenodes/logo.svg" + }, + { + "if": "theme=cyclestreets", + "then": "./assets/themes/cyclestreets/F111.svg" + }, + { + "if": "theme=cyclofix", + "then": "./assets/themes/cyclofix/logo.svg" + }, + { + "if": "theme=drinking_water", + "then": "./assets/themes/drinking_water/logo.svg" + }, + { + "if": "theme=entrances", + "then": "./assets/layers/entrance/door.svg" + }, + { + "if": "theme=etymology", + "then": "./assets/layers/etymology/logo.svg" + }, + { + "if": "theme=facadegardens", + "then": "./assets/themes/facadegardens/geveltuin.svg" + }, + { + "if": "theme=food", + "then": "./assets/layers/food/restaurant.svg" + }, + { + "if": "theme=fritures", + "then": "./assets/themes/fritures/logo.svg" + }, + { + "if": "theme=fruit_trees", + "then": "./assets/themes/fruit_trees/fruit_tree.svg" + }, + { + "if": "theme=ghostbikes", + "then": "./assets/themes/ghostbikes/logo.svg" + }, + { + "if": "theme=grb", + "then": "./assets/themes/grb_import/housenumber_blank.svg" + }, + { + "if": "theme=grb_fixme", + "then": "./assets/svg/bug.svg" + }, + { + "if": "theme=missing_streets", + "then": "./assets/svg/robot.svg" + }, + { + "if": "theme=hackerspaces", + "then": "./assets/themes/hackerspaces/glider.svg" + }, + { + "if": "theme=hailhydrant", + "then": "./assets/themes/hailhydrant/logo.svg" + }, + { + "if": "theme=mapcomplete-changes", + "then": "./assets/svg/logo.svg" + }, + { + "if": "theme=maps", + "then": "./assets/themes/maps/logo.svg" + }, + { + "if": "theme=nature", + "then": "./assets/themes/nature/logo.svg" + }, + { + "if": "theme=natuurpunt", + "then": "./assets/themes/natuurpunt/natuurpunt.png" + }, + { + "if": "theme=notes", + "then": "./assets/svg/resolved.svg" + }, + { + "if": "theme=observation_towers", + "then": "./assets/layers/observation_tower/Tower_observation.svg" + }, + { + "if": "theme=openwindpowermap", + "then": "./assets/themes/openwindpowermap/wind_turbine.svg" + }, + { + "if": "theme=parkings", + "then": "./assets/themes/parkings/parkings.svg" + }, + { + "if": "theme=personal", + "then": "./assets/svg/addSmall.svg" + }, + { + "if": "theme=play_forests", + "then": "./assets/layers/play_forest/icon.svg" + }, + { + "if": "theme=playgrounds", + "then": "./assets/themes/playgrounds/playground.svg" + }, + { + "if": "theme=postal_codes", + "then": "./assets/themes/postal_codes/townhall.svg" + }, + { + "if": "theme=postboxes", + "then": "./assets/themes/postboxes/postbox.svg" + }, + { + "if": "theme=shops", + "then": "./assets/themes/shops/shop.svg" + }, + { + "if": "theme=sidewalks", + "then": "./assets/svg/bug.svg" + }, + { + "if": "theme=speelplekken", + "then": "./assets/themes/speelplekken/logo.svg" + }, + { + "if": "theme=sport_pitches", + "then": "./assets/layers/sport_pitch/table_tennis.svg" + }, + { + "if": "theme=street_lighting", + "then": "./assets/layers/street_lamps/street_lamp.svg" + }, + { + "if": "theme=street_lighting_assen", + "then": "./assets/layers/street_lamps/street_lamp.svg" + }, + { + "if": "theme=surveillance", + "then": "./assets/themes/surveillance/logo.svg" + }, + { + "if": "theme=toerisme_vlaanderen", + "then": "./assets/svg/teardrop_with_hole_green.svg" + }, + { + "if": "theme=toilets", + "then": "./assets/themes/toilets/toilets.svg" + }, + { + "if": "theme=trees", + "then": "./assets/themes/trees/logo.svg" + }, + { + "if": "theme=uk_addresses", + "then": "./assets/themes/uk_addresses/housenumber_unknown.svg" + }, + { + "if": "theme=waste_basket", + "then": "./assets/themes/waste_basket/waste_basket.svg" + } + ] }, "iconSize": "30,30,bottom" } @@ -156,15 +383,16 @@ "_embedded_cs:themes=feat.get('_embedded_cs').map(cs => cs.theme)", "_embedded_cs:users=feat.get('_embedded_cs').map(cs => cs['_last_edit:contributor'])" ], - "+mapRendering": [{ - "location": [ - "point" - ], - "icon":"statistics:black", - "iconSize": "30,30,center" - }] - + "+mapRendering": [ + { + "location": [ + "point" + ], + "icon": "statistics:black", + "iconSize": "30,30,center" + } + ] } } ] -} +} \ No newline at end of file diff --git a/assets/themes/mapcomplete-changes/mapcomplete-changes.proto.json b/assets/themes/mapcomplete-changes/mapcomplete-changes.proto.json new file mode 100644 index 0000000000..290fd14169 --- /dev/null +++ b/assets/themes/mapcomplete-changes/mapcomplete-changes.proto.json @@ -0,0 +1,176 @@ +{ + "id": "mapcomplete-changes", + "title": { + "en": "Changes made with MapComplete" + }, + "shortDescription": { + "en": "Shows changes made by MapComplete" + }, + "description": { + "en": "This maps shows all the changes made with MapComplete" + }, + "language": [ + "en" + ], + "maintainer": "", + "icon": "./assets/svg/logo.svg", + "hideFromOverview": true, + "version": "0", + "startLat": 0, + "startLon": 0, + "startZoom": 1, + "widenFactor": 0.05, + "clustering": false, + "layers": [ + { + "id": "mapcomplete-changes", + "name": { + "en": "Changeset centers" + }, + "minzoom": 0, + "source": { + "osmTags": "editor~*", + "geoJson": "https://raw.githubusercontent.com/pietervdvn/MapComplete-data/main/mapcomplete-changes/tile_{z}_{x}_{y}.geojson", + "geoJsonZoomLevel": 8, + "maxCacheAge": 0 + }, + "calculatedTags": [ + "_last_edit:contributor:lc:=feat.properties['_last_edit:contributor'].toLowerCase()" + ], + "title": { + "render": { + "en": "Changeset for {theme}" + } + }, + "description": { + "en": "Shows all MapComplete changes" + }, + "tagRenderings": [ + { + "id": "render_id", + "render": { + "en": "Changeset {id}" + } + }, + { + "id": "contributor", + "render": { + "en": "Change made by {_last_edit:contributor}" + } + }, + { + "id": "theme", + "render": { + "en": "Change with theme {theme}" + }, + "mappings": [ + { + "if": "theme~http.*", + "then": { + "en": "Change with unofficial theme {theme}" + } + } + ] + } + ], + "mapRendering": [ + { + "location": [ + "point", + "centroid" + ], + "icon": { + "render": "teardrop:#00cc00" + }, + "iconSize": "30,30,center" + } + ], + "filter": [ + { + "id": "theme-search", + "options": [ + { + "osmTags": "theme~.*{search}.*", + "fields": [ + { + "name": "search" + } + ], + "question": { + "en": "Themename contains {search}" + } + } + ] + }, + { + "id": "created_by", + "options": [ + { + "osmTags": "_last_edit:contributor:lc~.*{search}.*", + "fields": [ + { + "name": "search" + } + ], + "question": { + "en": "Made by contributor {search}" + } + } + ] + }, + { + "id": "not_created_by", + "options": [ + { + "osmTags": "_last_edit:contributor:lc!~.*{search}.*", + "fields": [ + { + "name": "search" + } + ], + "question": { + "en": "Not made by contributor {search}" + } + } + ] + } + ] + }, + { + "builtin": "current_view", + "override": { + "title": "Statistics on changesets in the current view", + "tagRenderings": [ + { + "id": "link_to_more", + "render": { + "en": "More statistics can be found here" + } + }, + { + "id": "hist_themes", + "render": "{histogram(_embedded_cs:themes, Themename, Number of changesets)}" + }, + { + "id": "hist_themes", + "render": "{histogram(_embedded_cs:users, Contributor, Number of changesets)}" + } + ], + "calculatedTags": [ + "_embedded_cs=feat.overlapWith('mapcomplete-changes').map(f => f.feat.properties)", + "_embedded_cs:themes=feat.get('_embedded_cs').map(cs => cs.theme)", + "_embedded_cs:users=feat.get('_embedded_cs').map(cs => cs['_last_edit:contributor'])" + ], + "+mapRendering": [ + { + "location": [ + "point" + ], + "icon": "statistics:black", + "iconSize": "30,30,center" + } + ] + } + } + ] +} \ No newline at end of file diff --git a/langs/themes/en.json b/langs/themes/en.json index 488cf5ac7a..9d45eeca75 100644 --- a/langs/themes/en.json +++ b/langs/themes/en.json @@ -934,6 +934,65 @@ "shortDescription": "Map to show hydrants, extinguishers, fire stations, and ambulance stations.", "title": "Hydrants, Extinguishers, Fire stations, and Ambulance stations." }, + "mapcomplete-changes": { + "description": "This maps shows all the changes made with MapComplete", + "layers": { + "0": { + "description": "Shows all MapComplete changes", + "filter": { + "0": { + "options": { + "0": { + "question": "Themename contains {search}" + } + } + }, + "1": { + "options": { + "0": { + "question": "Made by contributor {search}" + } + } + }, + "2": { + "options": { + "0": { + "question": "Not made by contributor {search}" + } + } + } + }, + "name": "Changeset centers", + "tagRenderings": { + "contributor": { + "render": "Change made by {_last_edit:contributor}" + }, + "theme": { + "mappings": { + "0": { + "then": "Change with unofficial theme {theme}" + } + }, + "render": "Change with theme {theme}" + } + }, + "title": { + "render": "Changeset for {theme}" + } + }, + "1": { + "override": { + "tagRenderings": { + "link_to_more": { + "render": "More statistics can be found here" + } + } + } + } + }, + "shortDescription": "Shows changes made by MapComplete", + "title": "Changes made with MapComplete" + }, "maps": { "description": "On this map you can find all maps OpenStreetMap knows - typically a big map on an information board showing the area, city or region, e.g. a tourist map on the back of a billboard, a map of a nature reserve, a map of cycling networks in the region, ...)

If a map is missing, you can easily map this map on OpenStreetMap.", "shortDescription": "This theme shows all (touristic) maps that OpenStreetMap knows of", diff --git a/scripts/ScriptUtils.ts b/scripts/ScriptUtils.ts index 62923d2bfc..817e32d6c2 100644 --- a/scripts/ScriptUtils.ts +++ b/scripts/ScriptUtils.ts @@ -121,7 +121,7 @@ export default class ScriptUtils { public static getThemeFiles(): { parsed: LayoutConfigJson, path: string }[] { return ScriptUtils.readDirRecSync("./assets/themes") - .filter(path => path.endsWith(".json")) + .filter(path => path.endsWith(".json") && !path.endsWith(".proto.json")) .filter(path => path.indexOf("license_info.json") < 0) .map(path => { try { diff --git a/scripts/generateLayerOverview.ts b/scripts/generateLayerOverview.ts index 1be2cb556f..f0b63f47fb 100644 --- a/scripts/generateLayerOverview.ts +++ b/scripts/generateLayerOverview.ts @@ -1,5 +1,5 @@ import ScriptUtils from "./ScriptUtils"; -import {existsSync, mkdirSync, writeFileSync} from "fs"; +import {existsSync, mkdirSync, readFileSync, writeFileSync} from "fs"; import * as licenses from "../assets/generated/license_info.json" import {LayoutConfigJson} from "../Models/ThemeConfig/Json/LayoutConfigJson"; import {LayerConfigJson} from "../Models/ThemeConfig/Json/LayerConfigJson"; @@ -15,16 +15,11 @@ import {Translation} from "../UI/i18n/Translation"; import {TagRenderingConfigJson} from "../Models/ThemeConfig/Json/TagRenderingConfigJson"; import * as questions from "../assets/tagRenderings/questions.json"; import * as icons from "../assets/tagRenderings/icons.json"; +import PointRenderingConfigJson from "../Models/ThemeConfig/Json/PointRenderingConfigJson"; // This scripts scans 'assets/layers/*.json' for layer definition files and 'assets/themes/*.json' for theme definition files. // It spits out an overview of those to be used to load them -interface LayersAndThemes { - themes: LayoutConfigJson[], - layers: { parsed: LayerConfigJson, path: string }[] -} - - class LayerOverviewUtils { writeSmallOverview(themes: { id: string, title: any, shortDescription: any, icon: string, hideFromOverview: boolean }[]) { @@ -112,15 +107,21 @@ class LayerOverviewUtils { writeFileSync("./assets/generated/known_layers.json", JSON.stringify(Array.from(sharedLayers.values()))) - /* - writeFileSync('./assets/themes/mapcomplete-changes/icons-mapping.txt', JSON.stringify( - Array.from(sharedThemes.values()).map(th => ({ - if: "theme=" + th.id, - then: th.icon - })) - )) //*/ + { + // mapcomplete-changes shows an icon for each corresponding mapcomplete-theme + const iconsPerTheme = + Array.from(sharedThemes.values()).map(th => ({ + if: "theme=" + th.id, + then: th.icon + })) + const proto: LayoutConfigJson = JSON.parse(readFileSync("./assets/themes/mapcomplete-changes/mapcomplete-changes.proto.json", "UTF8")); + const protolayer = (proto.layers.filter(l => l["id"] === "mapcomplete-changes")[0]) + const rendering = (protolayer.mapRendering[0]) + rendering.icon["mappings"] = iconsPerTheme + writeFileSync('./assets/themes/mapcomplete-changes/mapcomplete-changes.json', JSON.stringify(proto, null, " ")) + } } private buildLayerIndex(knownImagePaths: Set): Map { diff --git a/test/CreateNoteImportLayer.spec.ts b/test/CreateNoteImportLayer.spec.ts index 9624637b5d..0d98811e6b 100644 --- a/test/CreateNoteImportLayer.spec.ts +++ b/test/CreateNoteImportLayer.spec.ts @@ -21,7 +21,7 @@ export default class CreateNoteImportLayerSpec extends T { const layer = new LayerConfig(layerPrepare.convertStrict(desugaringState, bookcases, "ImportLayerGeneratorTest:Parse bookcases"), "ImportLayerGeneratorTest: init bookcases-layer") const generator = new CreateNoteImportLayer() const generatedLayer = generator.convertStrict(desugaringState, layer, "ImportLayerGeneratorTest: convert") - fs.writeFileSync("bookcases-import-layer.generated.json", JSON.stringify(generatedLayer, null, " "), "utf8") + // fs.writeFileSync("bookcases-import-layer.generated.json", JSON.stringify(generatedLayer, null, " "), "utf8") console.log(JSON.stringify(generatedLayer, null, " ")) }] ]);