diff --git a/Docs/BuiltinIndex.md b/Docs/BuiltinIndex.md index bb1243ffb..9a4d3d7c0 100644 --- a/Docs/BuiltinIndex.md +++ b/Docs/BuiltinIndex.md @@ -61,7 +61,6 @@ - grave - guidepost - hackerspace - - hotel - hydrant - ice_cream - indoors @@ -112,6 +111,7 @@ - toilet - toilet_at_amenity - tool_library + - tourism_accomodation - trail - transit_stops - tree_node @@ -168,13 +168,13 @@ - food - food_courts - hackerspace - - hotel - ice_cream - love_hotel - pharmacy - playground - shops - stripclub + - tourism_accomodation - veterinary ### website @@ -198,7 +198,6 @@ - food_courts - governments - hackerspace - - hotel - kindergarten_childcare - nature_reserve - observation_tower @@ -234,7 +233,6 @@ - food_courts - governments - hackerspace - - hotel - kindergarten_childcare - pharmacy - physiotherapist @@ -263,7 +261,6 @@ - food - governments - hackerspace - - hotel - kindergarten_childcare - pharmacy - physiotherapist @@ -313,6 +310,7 @@ - love_hotel - stripclub - tool_library + - tourism_accomodation ### mastodon @@ -417,12 +415,12 @@ - food - food_courts - hackerspace - - hotel - ice_cream - observation_tower - outdoor_seating - playground_equipment - sports_centre + - tourism_accomodation - transit_stops ### smoking @@ -441,13 +439,13 @@ - cafe_pub - food + - tourism_accomodation ### internet - cafe_pub - climbing_gym - food - - hotel - shops ### internet-fee @@ -455,7 +453,6 @@ - cafe_pub - climbing_gym - food - - hotel - shops ### internet-ssid @@ -463,7 +460,6 @@ - cafe_pub - climbing_gym - food - - hotel - shops ### questions @@ -596,6 +592,7 @@ - hackerspace - outdoor_seating + - tourism_accomodation ### diets @@ -675,6 +672,14 @@ - toilet_at_amenity + ### {preset_type_select()} + + - tourism_accomodation + + ### brand + + - tourism_accomodation + This document is autogenerated from [assets/layers/*.json](https://github.com/pietervdvn/MapComplete/blob/develop/assets/layers/*.json) diff --git a/Docs/BuiltinQuestions.md b/Docs/BuiltinQuestions.md index da2b892a8..f275ff0f2 100644 --- a/Docs/BuiltinQuestions.md +++ b/Docs/BuiltinQuestions.md @@ -74,6 +74,7 @@ This is a special layer - data is not sourced from OpenStreetMap 49. [seasonal](#seasonal) 50. [shower](#shower) 51. [preset_description](#preset_description) +52. [brand](#brand) ## Supported attributes @@ -112,6 +113,7 @@ This is a special layer - data is not sourced from OpenStreetMap | [diet:vegan](https://wiki.openstreetmap.org/wiki/Key:diet:vegan) | Multiple choice | [only](https://wiki.openstreetmap.org/wiki/Tag:diet:vegan%3Donly) [yes](https://wiki.openstreetmap.org/wiki/Tag:diet:vegan%3Dyes) [limited](https://wiki.openstreetmap.org/wiki/Tag:diet:vegan%3Dlimited) [no](https://wiki.openstreetmap.org/wiki/Tag:diet:vegan%3Dno) | | [seasonal](https://wiki.openstreetmap.org/wiki/Key:seasonal) | Multiple choice | [no](https://wiki.openstreetmap.org/wiki/Tag:seasonal%3Dno) [summer](https://wiki.openstreetmap.org/wiki/Tag:seasonal%3Dsummer) [spring;summer;autumn](https://wiki.openstreetmap.org/wiki/Tag:seasonal%3Dspring;summer;autumn) | | [shower](https://wiki.openstreetmap.org/wiki/Key:shower) | Multiple choice | [hot](https://wiki.openstreetmap.org/wiki/Tag:shower%3Dhot) [cold](https://wiki.openstreetmap.org/wiki/Tag:shower%3Dcold) [yes](https://wiki.openstreetmap.org/wiki/Tag:shower%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:shower%3Dno) | +| [brand](https://wiki.openstreetmap.org/wiki/Key:brand) | [string](../SpecialInputElements.md#string) | | @@ -135,7 +137,7 @@ _This tagrendering has no question and is thus read-only_ ### mapillary Shows a button to open Mapillary on this location _This tagrendering has no question and is thus read-only_ -*{mapillary()}* +*{mapillary_link()}* @@ -201,7 +203,7 @@ The question is `What is the Mastodon-handle of {title()}?` ### facebook Shows and asks for the facebook handle The question is `What is the facebook page of of {title()}?` -*{link(Facebook page,&LBRACEcontact:facebook&RBRACE,,,)}
Facebook is known to harm mental health, manipulate public opinion and cause hate. Try to use healthier alternatives
* is shown if `contact:facebook` is set +*{link(Facebook page,&LBRACEcontact:facebook&RBRACE,,,,)}
Facebook is known to harm mental health, manipulate public opinion and cause hate. Try to use healthier alternatives
* is shown if `contact:facebook` is set @@ -728,4 +730,16 @@ _This tagrendering has no question and is thus read-only_ +### brand + +The question is `Is {title()} part of a bigger brand?` +*Part of {brand}* is shown if `brand` is set + + + - *Not part of a bigger brand* is shown if with nobrand=yes + + + + + This document is autogenerated from [assets/layers/questions/questions.json](https://github.com/pietervdvn/MapComplete/blob/develop/assets/layers/questions/questions.json) diff --git a/Docs/Layers/artwork.md b/Docs/Layers/artwork.md index 6a03ddc56..410db4ad6 100644 --- a/Docs/Layers/artwork.md +++ b/Docs/Layers/artwork.md @@ -147,7 +147,7 @@ This tagrendering has labels ### artwork-website The question is `Is there a website with more information about this artwork?` -*{link(More information on this website,&LBRACEwebsite&RBRACE,,,)}* is shown if `website` is set +*{link(More information on this website,&LBRACEwebsite&RBRACE,,,,)}* is shown if `website` is set This tagrendering has labels diff --git a/Docs/Layers/artwork_on_wall.md b/Docs/Layers/artwork_on_wall.md new file mode 100644 index 000000000..f929cde03 --- /dev/null +++ b/Docs/Layers/artwork_on_wall.md @@ -0,0 +1,458 @@ +[//]: # (WARNING: this file is automatically generated. Please find the sources at the bottom and edit those sources) + +# artwork_on_wall + + +This layer is based on [artwork](../Layers/artwork.md) + +An open map of statues, busts, graffitis and other artwork all over the world + + + + + + + - This layer is shown at zoomlevel **16** and higher + + + +## Table of contents + +1. [Themes using this layer](#themes-using-this-layer) +2. [Basic tags for this layer](#basic-tags-for-this-layer) +3. [Supported attributes](#supported-attributes) + - [historic_or_not](#historic_or_not) + - [images](#images) + - [artwork-artwork_type](#artwork-artwork_type) + - [artwork-artist-wikidata](#artwork-artist-wikidata) + - [artwork-artist_name](#artwork-artist_name) + - [artwork-website](#artwork-website) + - [wikipedia](#wikipedia) + - [artwork_subject](#artwork_subject) + - [doubles_as_memorial](#doubles_as_memorial) + - [memorial-type](#memorial-type) + - [inscription](#inscription) + - [doubles_as_bench](#doubles_as_bench) + - [bench-backrest](#bench-backrest) + - [bench-armrest](#bench-armrest) + - [bench-seats](#bench-seats) + - [bench-material](#bench-material) + - [bench-direction](#bench-direction) + - [bench-colour](#bench-colour) + - [bench-survey:date](#bench-surveydate) + - [bench-inscription](#bench-inscription) + - [bench-memorial](#bench-memorial) + - [leftover-questions](#leftover-questions) + - [move-button](#move-button) + - [delete-button](#delete-button) + - [lod](#lod) +4. [Filters](#filters) + +## Themes using this layer + + + + - [ghostsigns](https://mapcomplete.org/ghostsigns) + + + +## Basic tags for this layer + +Elements must match **all** of the following expressions: + +0. tourism=artwork +1. artwork_type=mural | artwork_type=graffiti | artwork_type=mosaic | artwork_type=relief | artwork_type=painting | artwork_type=mural_painting + +[Execute on overpass](http://overpass-turbo.eu/?Q=%5Bout%3Ajson%5D%5Btimeout%3A90%5D%3B%28%20%20%20%20nwr%5B%22tourism%22%3D%22artwork%22%5D%5B%22artwork_type%22%3D%22mural%22%5D%28%7B%7Bbbox%7D%7D%29%3B%0A%20%20%20%20nwr%5B%22tourism%22%3D%22artwork%22%5D%5B%22artwork_type%22%3D%22graffiti%22%5D%28%7B%7Bbbox%7D%7D%29%3B%0A%20%20%20%20nwr%5B%22tourism%22%3D%22artwork%22%5D%5B%22artwork_type%22%3D%22mosaic%22%5D%28%7B%7Bbbox%7D%7D%29%3B%0A%20%20%20%20nwr%5B%22tourism%22%3D%22artwork%22%5D%5B%22artwork_type%22%3D%22relief%22%5D%28%7B%7Bbbox%7D%7D%29%3B%0A%20%20%20%20nwr%5B%22tourism%22%3D%22artwork%22%5D%5B%22artwork_type%22%3D%22painting%22%5D%28%7B%7Bbbox%7D%7D%29%3B%0A%20%20%20%20nwr%5B%22tourism%22%3D%22artwork%22%5D%5B%22artwork_type%22%3D%22mural_painting%22%5D%28%7B%7Bbbox%7D%7D%29%3B%0A%29%3Bout%20body%3B%3E%3Bout%20skel%20qt%3B) + +## Supported attributes + +**Warning:**,this quick overview is incomplete, + +| attribute | type | values which are supported by this layer | +-----|-----|----- | +| [historic](https://wiki.openstreetmap.org/wiki/Key:historic) | Multiple choice | [advertising](https://wiki.openstreetmap.org/wiki/Tag:historic%3Dadvertising) [](https://wiki.openstreetmap.org/wiki/Tag:historic%3D) | +| [artwork_type](https://wiki.openstreetmap.org/wiki/Key:artwork_type) | [string](../SpecialInputElements.md#string) | [architecture](https://wiki.openstreetmap.org/wiki/Tag:artwork_type%3Darchitecture) [mural](https://wiki.openstreetmap.org/wiki/Tag:artwork_type%3Dmural) [painting](https://wiki.openstreetmap.org/wiki/Tag:artwork_type%3Dpainting) [sculpture](https://wiki.openstreetmap.org/wiki/Tag:artwork_type%3Dsculpture) [statue](https://wiki.openstreetmap.org/wiki/Tag:artwork_type%3Dstatue) [bust](https://wiki.openstreetmap.org/wiki/Tag:artwork_type%3Dbust) [stone](https://wiki.openstreetmap.org/wiki/Tag:artwork_type%3Dstone) [installation](https://wiki.openstreetmap.org/wiki/Tag:artwork_type%3Dinstallation) [graffiti](https://wiki.openstreetmap.org/wiki/Tag:artwork_type%3Dgraffiti) [relief](https://wiki.openstreetmap.org/wiki/Tag:artwork_type%3Drelief) [azulejo](https://wiki.openstreetmap.org/wiki/Tag:artwork_type%3Dazulejo) [tilework](https://wiki.openstreetmap.org/wiki/Tag:artwork_type%3Dtilework) [woodcarving](https://wiki.openstreetmap.org/wiki/Tag:artwork_type%3Dwoodcarving) | +| [artist:wikidata](https://wiki.openstreetmap.org/wiki/Key:artist:wikidata) | [wikidata](../SpecialInputElements.md#wikidata) | | +| [artist_name](https://wiki.openstreetmap.org/wiki/Key:artist_name) | [string](../SpecialInputElements.md#string) | | +| [website](https://wiki.openstreetmap.org/wiki/Key:website) | [url](../SpecialInputElements.md#url) | | +| [wikidata](https://wiki.openstreetmap.org/wiki/Key:wikidata) | [wikidata](../SpecialInputElements.md#wikidata) | | +| [subject:wikidata](https://wiki.openstreetmap.org/wiki/Key:subject:wikidata) | [wikidata](../SpecialInputElements.md#wikidata) | | +| [historic](https://wiki.openstreetmap.org/wiki/Key:historic) | Multiple choice | [memorial](https://wiki.openstreetmap.org/wiki/Tag:historic%3Dmemorial) [](https://wiki.openstreetmap.org/wiki/Tag:historic%3D) | +| [memorial](https://wiki.openstreetmap.org/wiki/Key:memorial) | [string](../SpecialInputElements.md#string) | [statue](https://wiki.openstreetmap.org/wiki/Tag:memorial%3Dstatue) [plaque](https://wiki.openstreetmap.org/wiki/Tag:memorial%3Dplaque) [bench](https://wiki.openstreetmap.org/wiki/Tag:memorial%3Dbench) [ghost_bike](https://wiki.openstreetmap.org/wiki/Tag:memorial%3Dghost_bike) [stolperstein](https://wiki.openstreetmap.org/wiki/Tag:memorial%3Dstolperstein) [stele](https://wiki.openstreetmap.org/wiki/Tag:memorial%3Dstele) [stone](https://wiki.openstreetmap.org/wiki/Tag:memorial%3Dstone) [bust](https://wiki.openstreetmap.org/wiki/Tag:memorial%3Dbust) [sculpture](https://wiki.openstreetmap.org/wiki/Tag:memorial%3Dsculpture) [obelisk](https://wiki.openstreetmap.org/wiki/Tag:memorial%3Dobelisk) [cross](https://wiki.openstreetmap.org/wiki/Tag:memorial%3Dcross) [blue_plaque](https://wiki.openstreetmap.org/wiki/Tag:memorial%3Dblue_plaque) [tank](https://wiki.openstreetmap.org/wiki/Tag:memorial%3Dtank) [tree](https://wiki.openstreetmap.org/wiki/Tag:memorial%3Dtree) | +| [inscription](https://wiki.openstreetmap.org/wiki/Key:inscription) | [text](../SpecialInputElements.md#text) | | +| [amenity](https://wiki.openstreetmap.org/wiki/Key:amenity) | Multiple choice | [bench](https://wiki.openstreetmap.org/wiki/Tag:amenity%3Dbench) [](https://wiki.openstreetmap.org/wiki/Tag:amenity%3D) | +| [backrest](https://wiki.openstreetmap.org/wiki/Key:backrest) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:backrest%3Dyes) [yes](https://wiki.openstreetmap.org/wiki/Tag:backrest%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:backrest%3Dno) | +| [armrest](https://wiki.openstreetmap.org/wiki/Key:armrest) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:armrest%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:armrest%3Dno) | +| [seats](https://wiki.openstreetmap.org/wiki/Key:seats) | [nat](../SpecialInputElements.md#nat) | | +| [material](https://wiki.openstreetmap.org/wiki/Key:material) | [string](../SpecialInputElements.md#string) | [wood](https://wiki.openstreetmap.org/wiki/Tag:material%3Dwood) [metal](https://wiki.openstreetmap.org/wiki/Tag:material%3Dmetal) [stone](https://wiki.openstreetmap.org/wiki/Tag:material%3Dstone) [concrete](https://wiki.openstreetmap.org/wiki/Tag:material%3Dconcrete) [plastic](https://wiki.openstreetmap.org/wiki/Tag:material%3Dplastic) [steel](https://wiki.openstreetmap.org/wiki/Tag:material%3Dsteel) | +| [direction](https://wiki.openstreetmap.org/wiki/Key:direction) | [direction](../SpecialInputElements.md#direction) | | +| [colour](https://wiki.openstreetmap.org/wiki/Key:colour) | [color](../SpecialInputElements.md#color) | [brown](https://wiki.openstreetmap.org/wiki/Tag:colour%3Dbrown) [green](https://wiki.openstreetmap.org/wiki/Tag:colour%3Dgreen) [gray](https://wiki.openstreetmap.org/wiki/Tag:colour%3Dgray) [white](https://wiki.openstreetmap.org/wiki/Tag:colour%3Dwhite) [red](https://wiki.openstreetmap.org/wiki/Tag:colour%3Dred) [black](https://wiki.openstreetmap.org/wiki/Tag:colour%3Dblack) [blue](https://wiki.openstreetmap.org/wiki/Tag:colour%3Dblue) [yellow](https://wiki.openstreetmap.org/wiki/Tag:colour%3Dyellow) | +| [survey:date](https://wiki.openstreetmap.org/wiki/Key:survey:date) | [date](../SpecialInputElements.md#date) | [](https://wiki.openstreetmap.org/wiki/Tag:survey:date%3D) | +| [inscription](https://wiki.openstreetmap.org/wiki/Key:inscription) | [text](../SpecialInputElements.md#text) | | +| [historic](https://wiki.openstreetmap.org/wiki/Key:historic) | Multiple choice | [memorial](https://wiki.openstreetmap.org/wiki/Tag:historic%3Dmemorial) [](https://wiki.openstreetmap.org/wiki/Tag:historic%3D) | + + + + +### historic_or_not + +The question is `Is this artwork a historic advertisement?` + + + + - *This artwork is a historic advertisement* is shown if with historic=advertising + - *This artwork is not a historic advertisement* is shown if with historic= + + + + + +### images +This block shows the known images which are linked with the `image`-keys, but also via `mapillary` and `wikidata` and shows the button to upload new images +_This tagrendering has no question and is thus read-only_ +*{image_carousel()}{image_upload()}* + + + + +### artwork-artwork_type + +The question is `What is the type of this artwork?` +*This is a {artwork_type}* is shown if `artwork_type` is set + + + - *Architecture* is shown if with artwork_type=architecture + - *Mural* is shown if with artwork_type=mural + - *Painting* is shown if with artwork_type=painting + - *Sculpture* is shown if with artwork_type=sculpture + - *Statue* is shown if with artwork_type=statue + - *Bust* is shown if with artwork_type=bust + - *Stone* is shown if with artwork_type=stone + - *Installation* is shown if with artwork_type=installation + - *Graffiti* is shown if with artwork_type=graffiti + - *Relief* is shown if with artwork_type=relief + - *Azulejo (Spanish decorative tilework)* is shown if with artwork_type=azulejo + - *Tilework* is shown if with artwork_type=tilework + - *Woodcarving* is shown if with artwork_type=woodcarving + + + +This tagrendering has labels +`artwork-question` + +### artwork-artist-wikidata + +The question is `Who made this artwork?` +*This artwork was made by {wikidata_label(artist:wikidata):font-weight:bold}
{wikipedia(artist:wikidata)}* is shown if `artist:wikidata` is set + + +This tagrendering has labels +`artwork-question` + +### artwork-artist_name + +The question is `Which artist created this?` +*Created by {artist_name}* is shown if `artist_name` is set + + +This tagrendering has labels +`artwork-question` + +### artwork-website + +The question is `Is there a website with more information about this artwork?` +*{link(More information on this website,&LBRACEwebsite&RBRACE,,,,)}* is shown if `website` is set + + +This tagrendering has labels +`artwork-question` + +### wikipedia +Shows a wikipedia box with the corresponding wikipedia article; the wikidata-item link can be changed by a contributor +The question is `What is the corresponding Wikidata entity?` +*{wikipedia():max-height:25rem}* is shown if `wikidata` is set + + + - *{wikipedia():max-height:25rem}* is shown if with wikipedia~.+. _This option cannot be chosen as answer_ + - *No Wikipedia page has been linked yet* is shown if with wikidata=. _This option cannot be chosen as answer_ + + + + + +### artwork_subject + +The question is `What does this artwork depict?` +*This artwork depicts {wikidata_label(subject:wikidata)}{wikipedia(subject:wikidata)}* is shown if `subject:wikidata` is set + +This tagrendering is only visible in the popup if the following condition is met: subject:wikidata~.+ +This tagrendering has labels +`artwork-question` + +### doubles_as_memorial + +The question is `Does this artwork serve as a memorial?` + + + + - *This artwork also serves as a memorial* is shown if with historic=memorial + - *This artwork does not serve as a bench* is shown if with historic= + + + + + +### memorial-type + +The question is `What type of memorial is this?` +*This is a {memorial}* is shown if `memorial` is set + + + - *This is a statue* is shown if with memorial=statue + - *This is a plaque* is shown if with memorial=plaque + - *This is a commemorative bench* is shown if with memorial=bench + - *This is a ghost bike - a bicycle painted white to remember a cyclist whom deceased because of a car crash* is shown if with memorial=ghost_bike + - *This is a stolperstein (stumbing stone)* is shown if with memorial=stolperstein + - *This is a stele* is shown if with memorial=stele + - *This is a memorial stone* is shown if with memorial=stone + - *This is a bust* is shown if with memorial=bust + - *This is a sculpture* is shown if with memorial=sculpture + - *This is an obelisk* is shown if with memorial=obelisk + - *This is a cross* is shown if with memorial=cross + - *This is a blue plaque* is shown if with memorial=blue_plaque + - *This is a historic tank, permanently placed in public space as memorial* is shown if with memorial=tank + - *This is a memorial tree* is shown if with memorial=tree + - *This is a gravestone; the person is buried here* is shown if with historic=tomb + + +This tagrendering is only visible in the popup if the following condition is met: historic=memorial +This tagrendering has labels +`memorial-questions` + +### inscription + +The question is `What is the inscription on this memorial?` +*The inscription on this memorial reads:

{inscription}

* is shown if `inscription` is set + + + - *This memorial does not have an inscription* is shown if with not:inscription=yes + + +This tagrendering is only visible in the popup if the following condition is met: historic=memorial & memorial!=bench +This tagrendering has labels +`memorial-questions` + +### doubles_as_bench + +The question is `Does this artwork serve as a bench?` + + + + - *This artwork also serves as a bench* is shown if with amenity=bench + - *This artwork does not serve as a bench* is shown if with amenity= + - *This artwork does not serve as a bench* is shown if with amenity!=bench. _This option cannot be chosen as answer_ + + + + + +### bench-backrest + +The question is `Does this bench have a backrest?` + + + + - *This bench is two-sided and shares the backrest* is shown if with backrest=yes & two_sided=yes + - *This bench does have a backrest* is shown if with backrest=yes + - *This bench does not have a backrest* is shown if with backrest=no + + +This tagrendering is only visible in the popup if the following condition is met: amenity=bench +This tagrendering has labels +`bench-questions` + +### bench-armrest + +The question is `Does this bench have one or more armrests?` + + + + - *This bench does have one or more armrests* is shown if with armrest=yes + - *This bench does not have any armrests* is shown if with armrest=no + + +This tagrendering is only visible in the popup if the following condition is met: amenity=bench +This tagrendering has labels +`bench-questions` + +### bench-seats + +The question is `How many seats does this bench have?` +*This bench has {seats} seats* is shown if `seats` is set + + + - *This bench does not have separated seats* is shown if with seats:separated=no + + +This tagrendering is only visible in the popup if the following condition is met: amenity=bench +This tagrendering has labels +`bench-questions` + +### bench-material + +The question is `What is the bench (seating) made from?` +*Material: {material}* is shown if `material` is set + + + - *The seating is made from wood* is shown if with material=wood + - *The seating is made from metal* is shown if with material=metal + - *The seating is made from stone* is shown if with material=stone + - *The seating is made from concrete* is shown if with material=concrete + - *The seating is made from plastic* is shown if with material=plastic + - *The seating is made from steel* is shown if with material=steel + + +This tagrendering is only visible in the popup if the following condition is met: amenity=bench +This tagrendering has labels +`bench-questions` + +### bench-direction + +The question is `In which direction are you looking when sitting on the bench?` +*When sitting on the bench, one looks towards {direction}°.* is shown if `direction` is set + +This tagrendering is only visible in the popup if the following condition is met: amenity=bench & two_sided!=yes +This tagrendering has labels +`bench-questions` + +### bench-colour + +The question is `Which colour does this bench have?` +*Colour: {colour}* is shown if `colour` is set + + + - *Colour: brown* is shown if with colour=brown + - *Colour: green* is shown if with colour=green + - *Colour: gray* is shown if with colour=gray + - *Colour: white* is shown if with colour=white + - *Colour: red* is shown if with colour=red + - *Colour: black* is shown if with colour=black + - *Colour: blue* is shown if with colour=blue + - *Colour: yellow* is shown if with colour=yellow + + +This tagrendering is only visible in the popup if the following condition is met: amenity=bench +This tagrendering has labels +`bench-questions` + +### bench-survey:date + +The question is `When was this bench last surveyed?` +*This bench was last surveyed on {survey:date}* is shown if `survey:date` is set + + + - *Surveyed today!* is shown if with survey:date= + + +This tagrendering is only visible in the popup if the following condition is met: amenity=bench +This tagrendering has labels +`bench-questions` + +### bench-inscription + +The question is `Does this bench have an inscription?` +*This bench has the following inscription:

{inscription}

* is shown if `inscription` is set + + + - *This bench does not have an inscription* is shown if with not:inscription=yes + - *This bench probably does not not have an inscription* is shown if with inscription=. _This option cannot be chosen as answer_ + + +This tagrendering is only visible in the popup if the following condition is met: amenity=bench +This tagrendering has labels +`bench-questions` + +### bench-memorial + +The question is `Does this bench act as memorial for someone or something?` + + + + - *This bench is a memorial for someone or something* is shown if with historic=memorial + - *This bench is a not a memorial for someone or something* is shown if with historic= & not:historic=memorial + + +This tagrendering is only visible in the popup if the following condition is met: amenity=bench & (historic=memorial | memorial=bench | tourism=artwork | inscription~.+) +This tagrendering has labels +`bench-questions` + +### leftover-questions + +_This tagrendering has no question and is thus read-only_ +*{questions( ,)}* + + + + +### move-button + +_This tagrendering has no question and is thus read-only_ +*{move_button()}* + + + + +### delete-button + +_This tagrendering has no question and is thus read-only_ +*{delete_button()}* + + + + +### lod + +_This tagrendering has no question and is thus read-only_ +*{linked_data_from_website()}* + + +This tagrendering has labels +`added_by_default` + +## Filters + + + +| id | question | osmTags | +-----|-----|----- | +| has_image.0 | *With and without images* (default) | | +| has_image.1 | Has at least one image | image~.+ | image:0~.+ | image:1~.+ | image:2~.+ | image:3~.+ | mapillary~.+ | +| has_image.2 | Probably does not have an image | image= & image:0= & image:1= & image:2= & image:3= & mapillary= | + + + + + + +| id | question | osmTags | +-----|-----|----- | +| artwork-artwork_type.0 | *What is the type of this artwork?* (default) | | +| artwork-artwork_type.1 | Architecture | artwork_type=architecture | +| artwork-artwork_type.2 | Mural | artwork_type=mural | +| artwork-artwork_type.3 | Painting | artwork_type=painting | +| artwork-artwork_type.4 | Sculpture | artwork_type=sculpture | +| artwork-artwork_type.5 | Statue | artwork_type=statue | +| artwork-artwork_type.6 | Bust | artwork_type=bust | +| artwork-artwork_type.7 | Stone | artwork_type=stone | +| artwork-artwork_type.8 | Installation | artwork_type=installation | +| artwork-artwork_type.9 | Graffiti | artwork_type=graffiti | +| artwork-artwork_type.10 | Relief | artwork_type=relief | +| artwork-artwork_type.11 | Azulejo (Spanish decorative tilework) | artwork_type=azulejo | +| artwork-artwork_type.12 | Tilework | artwork_type=tilework | +| artwork-artwork_type.13 | Woodcarving | artwork_type=woodcarving | + + + + +This document is autogenerated from [assets/themes/ghostsigns/ghostsigns.json](https://github.com/pietervdvn/MapComplete/blob/develop/assets/themes/ghostsigns/ghostsigns.json) diff --git a/Docs/Layers/assisted_repair.md b/Docs/Layers/assisted_repair.md index 4ad4f3cef..7a777e2a2 100644 --- a/Docs/Layers/assisted_repair.md +++ b/Docs/Layers/assisted_repair.md @@ -158,7 +158,7 @@ The question is `What is the Mastodon-handle of {title()}?` ### facebook Shows and asks for the facebook handle The question is `What is the facebook page of of {title()}?` -*{link(Facebook page,&LBRACEcontact:facebook&RBRACE,,,)}
Facebook is known to harm mental health, manipulate public opinion and cause hate. Try to use healthier alternatives
* is shown if `contact:facebook` is set +*{link(Facebook page,&LBRACEcontact:facebook&RBRACE,,,,)}
Facebook is known to harm mental health, manipulate public opinion and cause hate. Try to use healthier alternatives
* is shown if `contact:facebook` is set diff --git a/Docs/Layers/bench.md b/Docs/Layers/bench.md index 9ed27bde6..231e4fd43 100644 --- a/Docs/Layers/bench.md +++ b/Docs/Layers/bench.md @@ -286,7 +286,7 @@ This tagrendering has labels ### artwork-website The question is `Is there a website with more information about this artwork?` -*{link(More information on this website,&LBRACEwebsite&RBRACE,,,)}* is shown if `website` is set +*{link(More information on this website,&LBRACEwebsite&RBRACE,,,,)}* is shown if `website` is set This tagrendering is only visible in the popup if the following condition is met: tourism=artwork This tagrendering has labels diff --git a/Docs/Layers/dogfoodb.md b/Docs/Layers/dogfoodb.md index 9491c5002..06ffcaf03 100644 --- a/Docs/Layers/dogfoodb.md +++ b/Docs/Layers/dogfoodb.md @@ -312,7 +312,7 @@ _This tagrendering has no question and is thus read-only_ ### menu-website The question is `On what webpage is the menu published?` -*{link(Consult the menu,&LBRACEwebsite:menu&RBRACE,,,)}* is shown if `website:menu` is set +*{link(Consult the menu,&LBRACEwebsite:menu&RBRACE,,,,)}* is shown if `website:menu` is set diff --git a/Docs/Layers/drinking_water.md b/Docs/Layers/drinking_water.md index fee536d73..9ccc3a0ef 100644 --- a/Docs/Layers/drinking_water.md +++ b/Docs/Layers/drinking_water.md @@ -238,7 +238,7 @@ This tagrendering has labels ### artwork-website The question is `Is there a website with more information about this artwork?` -*{link(More information on this website,&LBRACEwebsite&RBRACE,,,)}* is shown if `website` is set +*{link(More information on this website,&LBRACEwebsite&RBRACE,,,,)}* is shown if `website` is set This tagrendering is only visible in the popup if the following condition is met: tourism=artwork This tagrendering has labels diff --git a/Docs/Layers/food.md b/Docs/Layers/food.md index 9c2b32d79..a0511e519 100644 --- a/Docs/Layers/food.md +++ b/Docs/Layers/food.md @@ -320,7 +320,7 @@ _This tagrendering has no question and is thus read-only_ ### menu-website The question is `On what webpage is the menu published?` -*{link(Consult the menu,&LBRACEwebsite:menu&RBRACE,,,)}* is shown if `website:menu` is set +*{link(Consult the menu,&LBRACEwebsite:menu&RBRACE,,,,)}* is shown if `website:menu` is set diff --git a/Docs/Layers/food_glutenfree.md b/Docs/Layers/food_glutenfree.md index ab3a5f542..270622cf7 100644 --- a/Docs/Layers/food_glutenfree.md +++ b/Docs/Layers/food_glutenfree.md @@ -329,7 +329,7 @@ _This tagrendering has no question and is thus read-only_ ### menu-website The question is `On what webpage is the menu published?` -*{link(Consult the menu,&LBRACEwebsite:menu&RBRACE,,,)}* is shown if `website:menu` is set +*{link(Consult the menu,&LBRACEwebsite:menu&RBRACE,,,,)}* is shown if `website:menu` is set diff --git a/Docs/Layers/food_lactosefree.md b/Docs/Layers/food_lactosefree.md index 7570c4467..800636311 100644 --- a/Docs/Layers/food_lactosefree.md +++ b/Docs/Layers/food_lactosefree.md @@ -329,7 +329,7 @@ _This tagrendering has no question and is thus read-only_ ### menu-website The question is `On what webpage is the menu published?` -*{link(Consult the menu,&LBRACEwebsite:menu&RBRACE,,,)}* is shown if `website:menu` is set +*{link(Consult the menu,&LBRACEwebsite:menu&RBRACE,,,,)}* is shown if `website:menu` is set diff --git a/Docs/Layers/friture.md b/Docs/Layers/friture.md index 4209f2ef9..c5754ba6a 100644 --- a/Docs/Layers/friture.md +++ b/Docs/Layers/friture.md @@ -312,7 +312,7 @@ _This tagrendering has no question and is thus read-only_ ### menu-website The question is `On what webpage is the menu published?` -*{link(Consult the menu,&LBRACEwebsite:menu&RBRACE,,,)}* is shown if `website:menu` is set +*{link(Consult the menu,&LBRACEwebsite:menu&RBRACE,,,,)}* is shown if `website:menu` is set diff --git a/Docs/Layers/ghost_bike.md b/Docs/Layers/ghost_bike.md index 951c981a6..b05481b5e 100644 --- a/Docs/Layers/ghost_bike.md +++ b/Docs/Layers/ghost_bike.md @@ -96,7 +96,7 @@ The question is `Whom is remembered by this ghost bike?` ### ghost_bike-source The question is `On what webpage can one find more info about the ghost bike or the accident?` -*{link(More info available,&LBRACEsource&RBRACE,,,)}* is shown if `source` is set +*{link(More info available,&LBRACEsource&RBRACE,,,,)}* is shown if `source` is set diff --git a/Docs/Layers/public_bookcase.md b/Docs/Layers/public_bookcase.md index 84e6697d2..99cd89df1 100644 --- a/Docs/Layers/public_bookcase.md +++ b/Docs/Layers/public_bookcase.md @@ -185,7 +185,7 @@ The question is `When was this public bookcase installed?` ### public_bookcase-website The question is `Is there a website with more information about this public bookcase?` -*{link(More info on the website,&LBRACEwebsite&RBRACE,,,)}* is shown if `website` is set +*{link(More info on the website,&LBRACEwebsite&RBRACE,,,,)}* is shown if `website` is set diff --git a/Docs/Layers/tool_library.md b/Docs/Layers/tool_library.md index 5015a347c..199ea07f2 100644 --- a/Docs/Layers/tool_library.md +++ b/Docs/Layers/tool_library.md @@ -120,7 +120,7 @@ This tagrendering has labels ### facebook Shows and asks for the facebook handle The question is `What is the facebook page of of {title()}?` -*{link(Facebook page,&LBRACEcontact:facebook&RBRACE,,,)}
Facebook is known to harm mental health, manipulate public opinion and cause hate. Try to use healthier alternatives
* is shown if `contact:facebook` is set +*{link(Facebook page,&LBRACEcontact:facebook&RBRACE,,,,)}
Facebook is known to harm mental health, manipulate public opinion and cause hate. Try to use healthier alternatives
* is shown if `contact:facebook` is set diff --git a/Docs/Layers/hotel.md b/Docs/Layers/tourism_accomodation.md similarity index 73% rename from Docs/Layers/hotel.md rename to Docs/Layers/tourism_accomodation.md index 76e717194..d3d8a725c 100644 --- a/Docs/Layers/hotel.md +++ b/Docs/Layers/tourism_accomodation.md @@ -1,18 +1,18 @@ [//]: # (WARNING: this file is automatically generated. Please find the sources at the bottom and edit those sources) -# hotel - - - - -Layer showing all hotels +# tourism_accomodation - - This layer is shown at zoomlevel **13** and higher + + + + + + - This layer is shown at zoomlevel **12** and higher @@ -24,6 +24,8 @@ Layer showing all hotels - [images](#images) - [reviews](#reviews) - [name](#name) + - [presettypeselect](#presettypeselect) + - [brand](#brand) - [phone](#phone) - [email](#email) - [website](#website) @@ -31,6 +33,7 @@ Layer showing all hotels - [internet](#internet) - [internet-fee](#internet-fee) - [internet-ssid](#internet-ssid) + - [dog-access](#dog-access) - [leftover-questions](#leftover-questions) - [move-button](#move-button) - [lod](#lod) @@ -48,9 +51,12 @@ Layer showing all hotels ## Basic tags for this layer -Elements must match the expression **tourism=hotel** +Elements must match **any** of the following expressions: -[Execute on overpass](http://overpass-turbo.eu/?Q=%5Bout%3Ajson%5D%5Btimeout%3A90%5D%3B%28%20%20%20%20nwr%5B%22tourism%22%3D%22hotel%22%5D%28%7B%7Bbbox%7D%7D%29%3B%0A%29%3Bout%20body%3B%3E%3Bout%20skel%20qt%3B) + - tourism=hostel + - tourism=hotel + +[Execute on overpass](http://overpass-turbo.eu/?Q=%5Bout%3Ajson%5D%5Btimeout%3A90%5D%3B%28%20%20%20%20nwr%5B%22tourism%22%3D%22hostel%22%5D%28%7B%7Bbbox%7D%7D%29%3B%0A%20%20%20%20nwr%5B%22tourism%22%3D%22hotel%22%5D%28%7B%7Bbbox%7D%7D%29%3B%0A%29%3Bout%20body%3B%3E%3Bout%20skel%20qt%3B) ## Supported attributes @@ -59,6 +65,7 @@ Elements must match the expression ** [name](https://wiki.openstreetmap.org/wiki/Key:name) | [string](../SpecialInputElements.md#string) | | +| [brand](https://wiki.openstreetmap.org/wiki/Key:brand) | [string](../SpecialInputElements.md#string) | | | [phone](https://wiki.openstreetmap.org/wiki/Key:phone) | [phone](../SpecialInputElements.md#phone) | | | [email](https://wiki.openstreetmap.org/wiki/Key:email) | [email](../SpecialInputElements.md#email) | | | [website](https://wiki.openstreetmap.org/wiki/Key:website) | [url](../SpecialInputElements.md#url) | | @@ -66,6 +73,7 @@ Elements must match the expression ** [internet_access](https://wiki.openstreetmap.org/wiki/Key:internet_access) | Multiple choice | [wlan](https://wiki.openstreetmap.org/wiki/Tag:internet_access%3Dwlan) [no](https://wiki.openstreetmap.org/wiki/Tag:internet_access%3Dno) [terminal](https://wiki.openstreetmap.org/wiki/Tag:internet_access%3Dterminal) [wired](https://wiki.openstreetmap.org/wiki/Tag:internet_access%3Dwired) | | [internet_access:fee](https://wiki.openstreetmap.org/wiki/Key:internet_access:fee) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:internet_access:fee%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:internet_access:fee%3Dno) [customers](https://wiki.openstreetmap.org/wiki/Tag:internet_access:fee%3Dcustomers) | | [internet_access:ssid](https://wiki.openstreetmap.org/wiki/Key:internet_access:ssid) | [string](../SpecialInputElements.md#string) | [Telekom](https://wiki.openstreetmap.org/wiki/Tag:internet_access:ssid%3DTelekom) | +| [dog](https://wiki.openstreetmap.org/wiki/Key:dog) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:dog%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:dog%3Dno) [leashed](https://wiki.openstreetmap.org/wiki/Tag:dog%3Dleashed) [unleashed](https://wiki.openstreetmap.org/wiki/Tag:dog%3Dunleashed) [outside](https://wiki.openstreetmap.org/wiki/Tag:dog%3Doutside) | @@ -88,8 +96,28 @@ _This tagrendering has no question and is thus read-only_ ### name -The question is `What is the name of this hotel?` -*This hotel is called {name}* is shown if `name` is set +The question is `What is the name of this {title()}?` +*{name}* is shown if `name` is set + + + + +### presettypeselect + +_This tagrendering has no question and is thus read-only_ +*{preset_type_select()}* + + + + +### brand + +The question is `Is {title()} part of a bigger brand?` +*Part of {brand}* is shown if `brand` is set + + + - *Not part of a bigger brand* is shown if with nobrand=yes + @@ -194,6 +222,22 @@ This tagrendering is only visible in the popup if the following condition is met This tagrendering has labels `internet-all` +### dog-access + +The question is `Are dogs allowed in this business?` + + + + - *Dogs are allowed* is shown if with dog=yes + - *Dogs are not allowed* is shown if with dog=no + - *Dogs are allowed, but they have to be leashed* is shown if with dog=leashed + - *Dogs are allowed and can run around freely* is shown if with dog=unleashed + - *Dogs are allowed only outside* is shown if with dog=outside + + + + + ### leftover-questions _This tagrendering has no question and is thus read-only_ @@ -220,4 +264,4 @@ This tagrendering has labels `added_by_default` -This document is autogenerated from [assets/layers/hotel/hotel.json](https://github.com/pietervdvn/MapComplete/blob/develop/assets/layers/hotel/hotel.json) +This document is autogenerated from [assets/layers/tourism_accomodation/tourism_accomodation.json](https://github.com/pietervdvn/MapComplete/blob/develop/assets/layers/tourism_accomodation/tourism_accomodation.json) diff --git a/Docs/SpecialRenderings.md b/Docs/SpecialRenderings.md index 0a9f5cddc..937c2e2f4 100644 --- a/Docs/SpecialRenderings.md +++ b/Docs/SpecialRenderings.md @@ -20,79 +20,79 @@ General usage is `{func_name()}`, `{func_name(arg, someotherarg)}` or `{func_nam - [Example usage of questions](#example-usage-of-questions) 2. [add_new_point](#add_new_point) - [Example usage of add_new_point](#example-usage-of-add_new_point) -3. [user_profile](#user_profile) - - [Example usage of user_profile](#example-usage-of-user_profile) -4. [language_picker](#language_picker) +3. [language_picker](#language_picker) - [Example usage of language_picker](#example-usage-of-language_picker) -5. [logout](#logout) +4. [logout](#logout) - [Example usage of logout](#example-usage-of-logout) -6. [histogram](#histogram) +5. [histogram](#histogram) - [Example usage of histogram](#example-usage-of-histogram) -7. [steal](#steal) +6. [steal](#steal) - [Example usage of steal](#example-usage-of-steal) -8. [minimap](#minimap) +7. [minimap](#minimap) - [Example usage of minimap](#example-usage-of-minimap) -9. [split_button](#split_button) +8. [split_button](#split_button) - [Example usage of split_button](#example-usage-of-split_button) -10. [move_button](#move_button) +9. [move_button](#move_button) - [Example usage of move_button](#example-usage-of-move_button) -11. [delete_button](#delete_button) +10. [delete_button](#delete_button) - [Example usage of delete_button](#example-usage-of-delete_button) -12. [share_link](#share_link) +11. [share_link](#share_link) - [Example usage of share_link](#example-usage-of-share_link) -13. [export_as_gpx](#export_as_gpx) +12. [export_as_gpx](#export_as_gpx) - [Example usage of export_as_gpx](#example-usage-of-export_as_gpx) -14. [upload_to_osm](#upload_to_osm) +13. [upload_to_osm](#upload_to_osm) - [Example usage of upload_to_osm](#example-usage-of-upload_to_osm) -15. [multi_apply](#multi_apply) +14. [multi_apply](#multi_apply) - [Example usage of multi_apply](#example-usage-of-multi_apply) -16. [add_note_comment](#add_note_comment) +15. [add_note_comment](#add_note_comment) - [Example usage of add_note_comment](#example-usage-of-add_note_comment) -17. [open_note](#open_note) +16. [open_note](#open_note) - [Example usage of open_note](#example-usage-of-open_note) -18. [close_note](#close_note) +17. [close_note](#close_note) - [Example usage of close_note](#example-usage-of-close_note) -19. [plantnet_detection](#plantnet_detection) +18. [plantnet_detection](#plantnet_detection) - [Example usage of plantnet_detection](#example-usage-of-plantnet_detection) -20. [tag_apply](#tag_apply) +19. [tag_apply](#tag_apply) - [Example usage of tag_apply](#example-usage-of-tag_apply) -21. [import_button](#import_button) +20. [import_button](#import_button) - [Specifying which tags to copy or add](#specifying-which-tags-to-copy-or-add) - [Importing a dataset into OpenStreetMap: requirements](#importing-a-dataset-into-openstreetmap-requirements) - [Disabled in unofficial themes](#disabled-in-unofficial-themes) - [Example usage of import_button](#example-usage-of-import_button) -22. [import_way_button](#import_way_button) +21. [import_way_button](#import_way_button) - [Specifying which tags to copy or add](#specifying-which-tags-to-copy-or-add) - [Importing a dataset into OpenStreetMap: requirements](#importing-a-dataset-into-openstreetmap-requirements) - [Disabled in unofficial themes](#disabled-in-unofficial-themes) - [Example usage of import_way_button](#example-usage-of-import_way_button) -23. [conflate_button](#conflate_button) +22. [conflate_button](#conflate_button) - [Specifying which tags to copy or add](#specifying-which-tags-to-copy-or-add) - [Importing a dataset into OpenStreetMap: requirements](#importing-a-dataset-into-openstreetmap-requirements) - [Disabled in unofficial themes](#disabled-in-unofficial-themes) - [Example usage of conflate_button](#example-usage-of-conflate_button) -24. [nearby_images](#nearby_images) +23. [nearby_images](#nearby_images) - [Example usage of nearby_images](#example-usage-of-nearby_images) -25. [wikipedia](#wikipedia) +24. [wikipedia](#wikipedia) - [Example usage of wikipedia](#example-usage-of-wikipedia) -26. [wikidata_label](#wikidata_label) +25. [wikidata_label](#wikidata_label) - [Example usage of wikidata_label](#example-usage-of-wikidata_label) -27. [mapillary_link](#mapillary_link) +26. [mapillary_link](#mapillary_link) - [Example usage of mapillary_link](#example-usage-of-mapillary_link) -28. [language_chooser](#language_chooser) +27. [language_chooser](#language_chooser) - [Example usage of language_chooser](#example-usage-of-language_chooser) -29. [all_tags](#all_tags) +28. [all_tags](#all_tags) - [Example usage of all_tags](#example-usage-of-all_tags) -30. [image_carousel](#image_carousel) +29. [image_carousel](#image_carousel) - [Example usage of image_carousel](#example-usage-of-image_carousel) -31. [image_upload](#image_upload) +30. [image_upload](#image_upload) - [Example usage of image_upload](#example-usage-of-image_upload) -32. [rating](#rating) +31. [rating](#rating) - [Example usage of rating](#example-usage-of-rating) -33. [create_review](#create_review) +32. [create_review](#create_review) - [Example usage of create_review](#example-usage-of-create_review) -34. [list_reviews](#list_reviews) +33. [list_reviews](#list_reviews) - [Example usage of list_reviews](#example-usage-of-list_reviews) +34. [reviews](#reviews) + - [Example usage of reviews](#example-usage-of-reviews) 35. [import_mangrove_key](#import_mangrove_key) - [Example usage of import_mangrove_key](#example-usage-of-import_mangrove_key) 36. [opening_hours_table](#opening_hours_table) @@ -181,16 +181,6 @@ An element which allows to add a new point on the 'last_click'-location. Only ma `{add_new_point()}` -### user_profile - -A component showing information about the currently logged in user (username, profile description, profile picture + link to edit them). Mostly meant to be used in the 'user-settings' - - - -#### Example usage of user_profile - -`{user_profile()}` - ### language_picker A component to set the language of the user interface @@ -847,6 +837,24 @@ Adds an overview of the mangrove-reviews of this object. Mangrove.Reviews needs #### Example usage of list_reviews +`{list_reviews(name,)}` + +### reviews + +A pragmatic combination of `create_review` and `list_reviews` + + + +| name | default | description | +-----|-----|----- | +| subjectKey | name | The key to use to determine the subject. If specified, the subject will be tags[subjectKey] | +| fallback | _undefined_ | The identifier to use, if tags[subjectKey] as specified above is not available. This is effectively a fallback value | + + + + +#### Example usage of reviews + `{reviews()}` for a vanilla review, `{reviews(name, play_forest)}` to review a play forest. If a name is known, the name will be used as identifier, otherwise 'play_forest' is used ### import_mangrove_key @@ -1099,13 +1107,14 @@ Construct a link. By using the 'special' visualisation notation, translations sh | class | _undefined_ | CSS-classes to add to the element | | download | _undefined_ | Expects a string which denotes the filename to download the contents of `href` into. If set, this link will act as a download-button. | | arialabel | _undefined_ | If set, this text will be used as aria-label | +| icon | _undefined_ | If set, show this icon next to the link. You might want to combine this with `class: button` | #### Example usage of link -`{link(,,,,)}` +`{link(,,,,,)}` ### multi @@ -1368,6 +1377,116 @@ Shows the extra description from the presets of the layer, if one matches. It wi `{preset_description()}` +### preset_type_select + +An editable tag rendering which allows to change the type + + + +#### Example usage of preset_type_select + +`{preset_type_select()}` + +### pending_changes + +A module showing the pending changes, with the option to clear the pending changes + + + +#### Example usage of pending_changes + +`{pending_changes()}` + +### clear_caches + +A button which clears the locally downloaded data and the service worker. Login status etc will be kept + + + +| name | default | description | +-----|-----|----- | +| text | _undefined_ | The text to show on the button | + + + + +#### Example usage of clear_caches + +`{clear_caches()}` + +### group + +A collapsable group (accordion) + + + +| name | default | description | +-----|-----|----- | +| header | _undefined_ | The _identifier_ of a single tagRendering. This will be used as header | +| labels | _undefined_ | A `;`-separated list of either identifiers or label names. All tagRenderings matching this value will be shown in the accordion | + + + + +#### Example usage of group + +`{group(,)}` + +### preset_type_select + +An editable tag rendering which allows to change the type + + + +#### Example usage of preset_type_select + +`{preset_type_select()}` + +### pending_changes + +A module showing the pending changes, with the option to clear the pending changes + + + +#### Example usage of pending_changes + +`{pending_changes()}` + +### clear_caches + +A button which clears the locally downloaded data and the service worker. Login status etc will be kept + + + +| name | default | description | +-----|-----|----- | +| text | _undefined_ | The text to show on the button | + + + + +#### Example usage of clear_caches + +`{clear_caches()}` + +### group + +A collapsable group (accordion) + + + +| name | default | description | +-----|-----|----- | +| header | _undefined_ | The _identifier_ of a single tagRendering. This will be used as header | +| labels | _undefined_ | A `;`-separated list of either identifiers or label names. All tagRenderings matching this value will be shown in the accordion | + + + + +#### Example usage of group + +`{group(,)}` + ### auto_apply A button to run many actions for many features at once. To effectively use this button, you'll need some ingredients: diff --git a/Docs/TagInfo/mapcomplete_ghostsigns.json b/Docs/TagInfo/mapcomplete_ghostsigns.json index a71757941..4c303943c 100644 --- a/Docs/TagInfo/mapcomplete_ghostsigns.json +++ b/Docs/TagInfo/mapcomplete_ghostsigns.json @@ -278,6 +278,436 @@ { "key": "ref", "description": "Layer 'All advertentie wall paintings' shows and asks freeform values for key 'ref' (in the mapcomplete.org theme 'Ghost Signs') (This is only shown if advertising!=sign)" + }, + { + "key": "tourism", + "description": "The MapComplete theme Ghost Signs has a layer Artworks showing features with this tag", + "value": "artwork" + }, + { + "key": "artwork_type", + "description": "The MapComplete theme Ghost Signs has a layer Artworks showing features with this tag", + "value": "mural" + }, + { + "key": "artwork_type", + "description": "The MapComplete theme Ghost Signs has a layer Artworks showing features with this tag", + "value": "graffiti" + }, + { + "key": "artwork_type", + "description": "The MapComplete theme Ghost Signs has a layer Artworks showing features with this tag", + "value": "mosaic" + }, + { + "key": "artwork_type", + "description": "The MapComplete theme Ghost Signs has a layer Artworks showing features with this tag", + "value": "relief" + }, + { + "key": "artwork_type", + "description": "The MapComplete theme Ghost Signs has a layer Artworks showing features with this tag", + "value": "painting" + }, + { + "key": "artwork_type", + "description": "The MapComplete theme Ghost Signs has a layer Artworks showing features with this tag", + "value": "mural_painting" + }, + { + "key": "historic", + "description": "Layer 'Artworks' shows historic=advertising with a fixed text, namely 'This artwork is a historic advertisement' and allows to pick this as a default answer (in the mapcomplete.org theme 'Ghost Signs')", + "value": "advertising" + }, + { + "key": "historic", + "description": "Layer 'Artworks' shows historic= with a fixed text, namely 'This artwork is not a historic advertisement' and allows to pick this as a default answer (in the mapcomplete.org theme 'Ghost Signs') Picking this answer will delete the key historic.", + "value": "" + }, + { + "key": "id", + "description": "Layer 'Artworks' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Ghost Signs') (This is only shown if _backend~.+ & _last_edit:passed_time<300 & (_version_number= | _version_number=1))" + }, + { + "key": "image", + "description": "The layer 'Artworks allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary" + }, + { + "key": "mapillary", + "description": "The layer 'Artworks allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary" + }, + { + "key": "wikidata", + "description": "The layer 'Artworks allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary" + }, + { + "key": "wikipedia", + "description": "The layer 'Artworks allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary" + }, + { + "key": "artwork_type", + "description": "Layer 'Artworks' shows and asks freeform values for key 'artwork_type' (in the mapcomplete.org theme 'Ghost Signs')" + }, + { + "key": "artwork_type", + "description": "Layer 'Artworks' shows artwork_type=architecture with a fixed text, namely 'Architecture' and allows to pick this as a default answer (in the mapcomplete.org theme 'Ghost Signs')", + "value": "architecture" + }, + { + "key": "artwork_type", + "description": "Layer 'Artworks' shows artwork_type=mural with a fixed text, namely 'Mural' and allows to pick this as a default answer (in the mapcomplete.org theme 'Ghost Signs')", + "value": "mural" + }, + { + "key": "artwork_type", + "description": "Layer 'Artworks' shows artwork_type=painting with a fixed text, namely 'Painting' and allows to pick this as a default answer (in the mapcomplete.org theme 'Ghost Signs')", + "value": "painting" + }, + { + "key": "artwork_type", + "description": "Layer 'Artworks' shows artwork_type=sculpture with a fixed text, namely 'Sculpture' and allows to pick this as a default answer (in the mapcomplete.org theme 'Ghost Signs')", + "value": "sculpture" + }, + { + "key": "artwork_type", + "description": "Layer 'Artworks' shows artwork_type=statue with a fixed text, namely 'Statue' and allows to pick this as a default answer (in the mapcomplete.org theme 'Ghost Signs')", + "value": "statue" + }, + { + "key": "artwork_type", + "description": "Layer 'Artworks' shows artwork_type=bust with a fixed text, namely 'Bust' and allows to pick this as a default answer (in the mapcomplete.org theme 'Ghost Signs')", + "value": "bust" + }, + { + "key": "artwork_type", + "description": "Layer 'Artworks' shows artwork_type=stone with a fixed text, namely 'Stone' and allows to pick this as a default answer (in the mapcomplete.org theme 'Ghost Signs')", + "value": "stone" + }, + { + "key": "artwork_type", + "description": "Layer 'Artworks' shows artwork_type=installation with a fixed text, namely 'Installation' and allows to pick this as a default answer (in the mapcomplete.org theme 'Ghost Signs')", + "value": "installation" + }, + { + "key": "artwork_type", + "description": "Layer 'Artworks' shows artwork_type=graffiti with a fixed text, namely 'Graffiti' and allows to pick this as a default answer (in the mapcomplete.org theme 'Ghost Signs')", + "value": "graffiti" + }, + { + "key": "artwork_type", + "description": "Layer 'Artworks' shows artwork_type=relief with a fixed text, namely 'Relief' and allows to pick this as a default answer (in the mapcomplete.org theme 'Ghost Signs')", + "value": "relief" + }, + { + "key": "artwork_type", + "description": "Layer 'Artworks' shows artwork_type=azulejo with a fixed text, namely 'Azulejo (Spanish decorative tilework)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Ghost Signs')", + "value": "azulejo" + }, + { + "key": "artwork_type", + "description": "Layer 'Artworks' shows artwork_type=tilework with a fixed text, namely 'Tilework' and allows to pick this as a default answer (in the mapcomplete.org theme 'Ghost Signs')", + "value": "tilework" + }, + { + "key": "artwork_type", + "description": "Layer 'Artworks' shows artwork_type=woodcarving with a fixed text, namely 'Woodcarving' and allows to pick this as a default answer (in the mapcomplete.org theme 'Ghost Signs')", + "value": "woodcarving" + }, + { + "key": "artist:wikidata", + "description": "Layer 'Artworks' shows and asks freeform values for key 'artist:wikidata' (in the mapcomplete.org theme 'Ghost Signs')" + }, + { + "key": "artist_name", + "description": "Layer 'Artworks' shows and asks freeform values for key 'artist_name' (in the mapcomplete.org theme 'Ghost Signs') (This is only shown if artist:wikidata=)" + }, + { + "key": "website", + "description": "Layer 'Artworks' shows and asks freeform values for key 'website' (in the mapcomplete.org theme 'Ghost Signs')" + }, + { + "key": "wikidata", + "description": "Layer 'Artworks' shows and asks freeform values for key 'wikidata' (in the mapcomplete.org theme 'Ghost Signs')" + }, + { + "key": "wikipedia", + "description": "Layer 'Artworks' shows wikipedia~.+ with a fixed text, namely '{wikipedia():max-height:25rem}' (in the mapcomplete.org theme 'Ghost Signs')" + }, + { + "key": "wikidata", + "description": "Layer 'Artworks' shows wikidata= with a fixed text, namely 'No Wikipedia page has been linked yet' (in the mapcomplete.org theme 'Ghost Signs') Picking this answer will delete the key wikidata.", + "value": "" + }, + { + "key": "subject:wikidata", + "description": "Layer 'Artworks' shows and asks freeform values for key 'subject:wikidata' (in the mapcomplete.org theme 'Ghost Signs') (This is only shown if subject:wikidata~.+)" + }, + { + "key": "historic", + "description": "Layer 'Artworks' shows historic=memorial with a fixed text, namely 'This artwork also serves as a memorial' and allows to pick this as a default answer (in the mapcomplete.org theme 'Ghost Signs')", + "value": "memorial" + }, + { + "key": "historic", + "description": "Layer 'Artworks' shows historic= with a fixed text, namely 'This artwork does not serve as a bench' and allows to pick this as a default answer (in the mapcomplete.org theme 'Ghost Signs') Picking this answer will delete the key historic.", + "value": "" + }, + { + "key": "memorial", + "description": "Layer 'Artworks' shows and asks freeform values for key 'memorial' (in the mapcomplete.org theme 'Ghost Signs') (This is only shown if historic=memorial)" + }, + { + "key": "memorial", + "description": "Layer 'Artworks' shows memorial=statue with a fixed text, namely 'This is a statue' and allows to pick this as a default answer (in the mapcomplete.org theme 'Ghost Signs') (This is only shown if historic=memorial)", + "value": "statue" + }, + { + "key": "memorial", + "description": "Layer 'Artworks' shows memorial=plaque with a fixed text, namely 'This is a plaque' and allows to pick this as a default answer (in the mapcomplete.org theme 'Ghost Signs') (This is only shown if historic=memorial)", + "value": "plaque" + }, + { + "key": "memorial", + "description": "Layer 'Artworks' shows memorial=bench with a fixed text, namely 'This is a commemorative bench' and allows to pick this as a default answer (in the mapcomplete.org theme 'Ghost Signs') (This is only shown if historic=memorial)", + "value": "bench" + }, + { + "key": "memorial", + "description": "Layer 'Artworks' shows memorial=ghost_bike with a fixed text, namely 'This is a ghost bike - a bicycle painted white to remember a cyclist whom deceased because of a car crash' and allows to pick this as a default answer (in the mapcomplete.org theme 'Ghost Signs') (This is only shown if historic=memorial)", + "value": "ghost_bike" + }, + { + "key": "memorial", + "description": "Layer 'Artworks' shows memorial=stolperstein with a fixed text, namely 'This is a stolperstein (stumbing stone)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Ghost Signs') (This is only shown if historic=memorial)", + "value": "stolperstein" + }, + { + "key": "memorial", + "description": "Layer 'Artworks' shows memorial=stele with a fixed text, namely 'This is a stele' and allows to pick this as a default answer (in the mapcomplete.org theme 'Ghost Signs') (This is only shown if historic=memorial)", + "value": "stele" + }, + { + "key": "memorial", + "description": "Layer 'Artworks' shows memorial=stone with a fixed text, namely 'This is a memorial stone' and allows to pick this as a default answer (in the mapcomplete.org theme 'Ghost Signs') (This is only shown if historic=memorial)", + "value": "stone" + }, + { + "key": "memorial", + "description": "Layer 'Artworks' shows memorial=bust with a fixed text, namely 'This is a bust' and allows to pick this as a default answer (in the mapcomplete.org theme 'Ghost Signs') (This is only shown if historic=memorial)", + "value": "bust" + }, + { + "key": "memorial", + "description": "Layer 'Artworks' shows memorial=sculpture with a fixed text, namely 'This is a sculpture' and allows to pick this as a default answer (in the mapcomplete.org theme 'Ghost Signs') (This is only shown if historic=memorial)", + "value": "sculpture" + }, + { + "key": "memorial", + "description": "Layer 'Artworks' shows memorial=obelisk with a fixed text, namely 'This is an obelisk' and allows to pick this as a default answer (in the mapcomplete.org theme 'Ghost Signs') (This is only shown if historic=memorial)", + "value": "obelisk" + }, + { + "key": "memorial", + "description": "Layer 'Artworks' shows memorial=cross with a fixed text, namely 'This is a cross' and allows to pick this as a default answer (in the mapcomplete.org theme 'Ghost Signs') (This is only shown if historic=memorial)", + "value": "cross" + }, + { + "key": "memorial", + "description": "Layer 'Artworks' shows memorial=blue_plaque with a fixed text, namely 'This is a blue plaque' and allows to pick this as a default answer (in the mapcomplete.org theme 'Ghost Signs') (This is only shown if historic=memorial)", + "value": "blue_plaque" + }, + { + "key": "memorial", + "description": "Layer 'Artworks' shows memorial=tank with a fixed text, namely 'This is a historic tank, permanently placed in public space as memorial' and allows to pick this as a default answer (in the mapcomplete.org theme 'Ghost Signs') (This is only shown if historic=memorial)", + "value": "tank" + }, + { + "key": "memorial", + "description": "Layer 'Artworks' shows memorial=tree with a fixed text, namely 'This is a memorial tree' and allows to pick this as a default answer (in the mapcomplete.org theme 'Ghost Signs') (This is only shown if historic=memorial)", + "value": "tree" + }, + { + "key": "historic", + "description": "Layer 'Artworks' shows historic=tomb with a fixed text, namely 'This is a gravestone; the person is buried here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Ghost Signs') (This is only shown if historic=memorial)", + "value": "tomb" + }, + { + "key": "inscription", + "description": "Layer 'Artworks' shows and asks freeform values for key 'inscription' (in the mapcomplete.org theme 'Ghost Signs') (This is only shown if memorial!=bench & historic=memorial)" + }, + { + "key": "not:inscription", + "description": "Layer 'Artworks' shows not:inscription=yes with a fixed text, namely 'This memorial does not have an inscription' and allows to pick this as a default answer (in the mapcomplete.org theme 'Ghost Signs') (This is only shown if memorial!=bench & historic=memorial)", + "value": "yes" + }, + { + "key": "amenity", + "description": "Layer 'Artworks' shows amenity=bench with a fixed text, namely 'This artwork also serves as a bench' and allows to pick this as a default answer (in the mapcomplete.org theme 'Ghost Signs')", + "value": "bench" + }, + { + "key": "amenity", + "description": "Layer 'Artworks' shows amenity= with a fixed text, namely 'This artwork does not serve as a bench' and allows to pick this as a default answer (in the mapcomplete.org theme 'Ghost Signs') Picking this answer will delete the key amenity.", + "value": "" + }, + { + "key": "backrest", + "description": "Layer 'Artworks' shows backrest=yes & two_sided=yes with a fixed text, namely 'This bench is two-sided and shares the backrest' and allows to pick this as a default answer (in the mapcomplete.org theme 'Ghost Signs') (This is only shown if amenity=bench)", + "value": "yes" + }, + { + "key": "two_sided", + "description": "Layer 'Artworks' shows backrest=yes & two_sided=yes with a fixed text, namely 'This bench is two-sided and shares the backrest' and allows to pick this as a default answer (in the mapcomplete.org theme 'Ghost Signs') (This is only shown if amenity=bench)", + "value": "yes" + }, + { + "key": "backrest", + "description": "Layer 'Artworks' shows backrest=yes with a fixed text, namely 'This bench does have a backrest' and allows to pick this as a default answer (in the mapcomplete.org theme 'Ghost Signs') (This is only shown if amenity=bench)", + "value": "yes" + }, + { + "key": "backrest", + "description": "Layer 'Artworks' shows backrest=no with a fixed text, namely 'This bench does not have a backrest' and allows to pick this as a default answer (in the mapcomplete.org theme 'Ghost Signs') (This is only shown if amenity=bench)", + "value": "no" + }, + { + "key": "armrest", + "description": "Layer 'Artworks' shows armrest=yes with a fixed text, namely 'This bench does have one or more armrests' and allows to pick this as a default answer (in the mapcomplete.org theme 'Ghost Signs') (This is only shown if amenity=bench)", + "value": "yes" + }, + { + "key": "armrest", + "description": "Layer 'Artworks' shows armrest=no with a fixed text, namely 'This bench does not have any armrests' and allows to pick this as a default answer (in the mapcomplete.org theme 'Ghost Signs') (This is only shown if amenity=bench)", + "value": "no" + }, + { + "key": "seats", + "description": "Layer 'Artworks' shows and asks freeform values for key 'seats' (in the mapcomplete.org theme 'Ghost Signs') (This is only shown if amenity=bench)" + }, + { + "key": "seats:separated", + "description": "Layer 'Artworks' shows seats:separated=no with a fixed text, namely 'This bench does not have separated seats' and allows to pick this as a default answer (in the mapcomplete.org theme 'Ghost Signs') (This is only shown if amenity=bench)", + "value": "no" + }, + { + "key": "material", + "description": "Layer 'Artworks' shows and asks freeform values for key 'material' (in the mapcomplete.org theme 'Ghost Signs') (This is only shown if amenity=bench)" + }, + { + "key": "material", + "description": "Layer 'Artworks' shows material=wood with a fixed text, namely 'The seating is made from wood' and allows to pick this as a default answer (in the mapcomplete.org theme 'Ghost Signs') (This is only shown if amenity=bench)", + "value": "wood" + }, + { + "key": "material", + "description": "Layer 'Artworks' shows material=metal with a fixed text, namely 'The seating is made from metal' and allows to pick this as a default answer (in the mapcomplete.org theme 'Ghost Signs') (This is only shown if amenity=bench)", + "value": "metal" + }, + { + "key": "material", + "description": "Layer 'Artworks' shows material=stone with a fixed text, namely 'The seating is made from stone' and allows to pick this as a default answer (in the mapcomplete.org theme 'Ghost Signs') (This is only shown if amenity=bench)", + "value": "stone" + }, + { + "key": "material", + "description": "Layer 'Artworks' shows material=concrete with a fixed text, namely 'The seating is made from concrete' and allows to pick this as a default answer (in the mapcomplete.org theme 'Ghost Signs') (This is only shown if amenity=bench)", + "value": "concrete" + }, + { + "key": "material", + "description": "Layer 'Artworks' shows material=plastic with a fixed text, namely 'The seating is made from plastic' and allows to pick this as a default answer (in the mapcomplete.org theme 'Ghost Signs') (This is only shown if amenity=bench)", + "value": "plastic" + }, + { + "key": "material", + "description": "Layer 'Artworks' shows material=steel with a fixed text, namely 'The seating is made from steel' and allows to pick this as a default answer (in the mapcomplete.org theme 'Ghost Signs') (This is only shown if amenity=bench)", + "value": "steel" + }, + { + "key": "direction", + "description": "Layer 'Artworks' shows and asks freeform values for key 'direction' (in the mapcomplete.org theme 'Ghost Signs') (This is only shown if two_sided!=yes & amenity=bench)" + }, + { + "key": "colour", + "description": "Layer 'Artworks' shows and asks freeform values for key 'colour' (in the mapcomplete.org theme 'Ghost Signs') (This is only shown if amenity=bench)" + }, + { + "key": "colour", + "description": "Layer 'Artworks' shows colour=brown with a fixed text, namely 'Colour: brown' and allows to pick this as a default answer (in the mapcomplete.org theme 'Ghost Signs') (This is only shown if amenity=bench)", + "value": "brown" + }, + { + "key": "colour", + "description": "Layer 'Artworks' shows colour=green with a fixed text, namely 'Colour: green' and allows to pick this as a default answer (in the mapcomplete.org theme 'Ghost Signs') (This is only shown if amenity=bench)", + "value": "green" + }, + { + "key": "colour", + "description": "Layer 'Artworks' shows colour=gray with a fixed text, namely 'Colour: gray' and allows to pick this as a default answer (in the mapcomplete.org theme 'Ghost Signs') (This is only shown if amenity=bench)", + "value": "gray" + }, + { + "key": "colour", + "description": "Layer 'Artworks' shows colour=white with a fixed text, namely 'Colour: white' and allows to pick this as a default answer (in the mapcomplete.org theme 'Ghost Signs') (This is only shown if amenity=bench)", + "value": "white" + }, + { + "key": "colour", + "description": "Layer 'Artworks' shows colour=red with a fixed text, namely 'Colour: red' and allows to pick this as a default answer (in the mapcomplete.org theme 'Ghost Signs') (This is only shown if amenity=bench)", + "value": "red" + }, + { + "key": "colour", + "description": "Layer 'Artworks' shows colour=black with a fixed text, namely 'Colour: black' and allows to pick this as a default answer (in the mapcomplete.org theme 'Ghost Signs') (This is only shown if amenity=bench)", + "value": "black" + }, + { + "key": "colour", + "description": "Layer 'Artworks' shows colour=blue with a fixed text, namely 'Colour: blue' and allows to pick this as a default answer (in the mapcomplete.org theme 'Ghost Signs') (This is only shown if amenity=bench)", + "value": "blue" + }, + { + "key": "colour", + "description": "Layer 'Artworks' shows colour=yellow with a fixed text, namely 'Colour: yellow' and allows to pick this as a default answer (in the mapcomplete.org theme 'Ghost Signs') (This is only shown if amenity=bench)", + "value": "yellow" + }, + { + "key": "survey:date", + "description": "Layer 'Artworks' shows and asks freeform values for key 'survey:date' (in the mapcomplete.org theme 'Ghost Signs') (This is only shown if amenity=bench)" + }, + { + "key": "survey:date", + "description": "Layer 'Artworks' shows survey:date= with a fixed text, namely 'Surveyed today!' and allows to pick this as a default answer (in the mapcomplete.org theme 'Ghost Signs') Picking this answer will delete the key survey:date. (This is only shown if amenity=bench)", + "value": "" + }, + { + "key": "inscription", + "description": "Layer 'Artworks' shows and asks freeform values for key 'inscription' (in the mapcomplete.org theme 'Ghost Signs') (This is only shown if amenity=bench)" + }, + { + "key": "not:inscription", + "description": "Layer 'Artworks' shows not:inscription=yes with a fixed text, namely 'This bench does not have an inscription' and allows to pick this as a default answer (in the mapcomplete.org theme 'Ghost Signs') (This is only shown if amenity=bench)", + "value": "yes" + }, + { + "key": "inscription", + "description": "Layer 'Artworks' shows inscription= with a fixed text, namely 'This bench probably does not not have an inscription' (in the mapcomplete.org theme 'Ghost Signs') Picking this answer will delete the key inscription. (This is only shown if amenity=bench)", + "value": "" + }, + { + "key": "historic", + "description": "Layer 'Artworks' shows historic=memorial with a fixed text, namely 'This bench is a memorial for someone or something' and allows to pick this as a default answer (in the mapcomplete.org theme 'Ghost Signs') (This is only shown if (historic=memorial | inscription~.+ | memorial=bench | tourism=artwork) & amenity=bench)", + "value": "memorial" + }, + { + "key": "historic", + "description": "Layer 'Artworks' shows historic= & not:historic=memorial with a fixed text, namely 'This bench is a not a memorial for someone or something' and allows to pick this as a default answer (in the mapcomplete.org theme 'Ghost Signs') Picking this answer will delete the key historic. (This is only shown if (historic=memorial | inscription~.+ | memorial=bench | tourism=artwork) & amenity=bench)", + "value": "" + }, + { + "key": "not:historic", + "description": "Layer 'Artworks' shows historic= & not:historic=memorial with a fixed text, namely 'This bench is a not a memorial for someone or something' and allows to pick this as a default answer (in the mapcomplete.org theme 'Ghost Signs') (This is only shown if (historic=memorial | inscription~.+ | memorial=bench | tourism=artwork) & amenity=bench)", + "value": "memorial" } ] } \ No newline at end of file diff --git a/Docs/TagInfo/mapcomplete_hotels.json b/Docs/TagInfo/mapcomplete_hotels.json index 70183d8a9..dfa087145 100644 --- a/Docs/TagInfo/mapcomplete_hotels.json +++ b/Docs/TagInfo/mapcomplete_hotels.json @@ -5,137 +5,176 @@ "description": "On this map, you'll find hotels in your area", "project_url": "https://mapcomplete.org/hotels", "doc_url": "https://github.com/pietervdvn/MapComplete/tree/master/assets/themes/", - "icon_url": "https://mapcomplete.org/assets/layers/hotel/hotel.svg", + "icon_url": "https://mapcomplete.org/assets/layers/tourism_accomodation/hotel.svg", "contact_name": "Pieter Vander Vennet", "contact_email": "pietervdvn@posteo.net" }, "tags": [ { "key": "tourism", - "description": "The MapComplete theme Hotels has a layer Hotels showing features with this tag", + "description": "The MapComplete theme Hotels has a layer Tourism accomodation showing features with this tag", + "value": "hostel" + }, + { + "key": "tourism", + "description": "The MapComplete theme Hotels has a layer Tourism accomodation showing features with this tag", "value": "hotel" }, { "key": "id", - "description": "Layer 'Hotels' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Hotels') (This is only shown if _backend~.+ & _last_edit:passed_time<300 & (_version_number= | _version_number=1))" + "description": "Layer 'Tourism accomodation' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Hotels') (This is only shown if _backend~.+ & _last_edit:passed_time<300 & (_version_number= | _version_number=1))" }, { "key": "image", - "description": "The layer 'Hotels allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary" + "description": "The layer 'Tourism accomodation allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary" }, { "key": "mapillary", - "description": "The layer 'Hotels allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary" + "description": "The layer 'Tourism accomodation allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary" }, { "key": "wikidata", - "description": "The layer 'Hotels allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary" + "description": "The layer 'Tourism accomodation allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary" }, { "key": "wikipedia", - "description": "The layer 'Hotels allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary" + "description": "The layer 'Tourism accomodation allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary" }, { "key": "name", - "description": "Layer 'Hotels' shows and asks freeform values for key 'name' (in the mapcomplete.org theme 'Hotels')" + "description": "Layer 'Tourism accomodation' shows and asks freeform values for key 'name' (in the mapcomplete.org theme 'Hotels')" + }, + { + "key": "brand", + "description": "Layer 'Tourism accomodation' shows and asks freeform values for key 'brand' (in the mapcomplete.org theme 'Hotels')" + }, + { + "key": "nobrand", + "description": "Layer 'Tourism accomodation' shows nobrand=yes with a fixed text, namely 'Not part of a bigger brand' and allows to pick this as a default answer (in the mapcomplete.org theme 'Hotels')", + "value": "yes" }, { "key": "phone", - "description": "Layer 'Hotels' shows and asks freeform values for key 'phone' (in the mapcomplete.org theme 'Hotels')" + "description": "Layer 'Tourism accomodation' shows and asks freeform values for key 'phone' (in the mapcomplete.org theme 'Hotels')" }, { "key": "contact:phone", - "description": "Layer 'Hotels' shows contact:phone~.+ with a fixed text, namely '{contact:phone}' (in the mapcomplete.org theme 'Hotels')" + "description": "Layer 'Tourism accomodation' shows contact:phone~.+ with a fixed text, namely '{contact:phone}' (in the mapcomplete.org theme 'Hotels')" }, { "key": "email", - "description": "Layer 'Hotels' shows and asks freeform values for key 'email' (in the mapcomplete.org theme 'Hotels')" + "description": "Layer 'Tourism accomodation' shows and asks freeform values for key 'email' (in the mapcomplete.org theme 'Hotels')" }, { "key": "contact:email", - "description": "Layer 'Hotels' shows contact:email~.+ with a fixed text, namely '{contact:email}' (in the mapcomplete.org theme 'Hotels')" + "description": "Layer 'Tourism accomodation' shows contact:email~.+ with a fixed text, namely '{contact:email}' (in the mapcomplete.org theme 'Hotels')" }, { "key": "operator:email", - "description": "Layer 'Hotels' shows operator:email~.+ with a fixed text, namely '{operator:email}' (in the mapcomplete.org theme 'Hotels')" + "description": "Layer 'Tourism accomodation' shows operator:email~.+ with a fixed text, namely '{operator:email}' (in the mapcomplete.org theme 'Hotels')" }, { "key": "website", - "description": "Layer 'Hotels' shows and asks freeform values for key 'website' (in the mapcomplete.org theme 'Hotels')" + "description": "Layer 'Tourism accomodation' shows and asks freeform values for key 'website' (in the mapcomplete.org theme 'Hotels')" }, { "key": "contact:website", - "description": "Layer 'Hotels' shows contact:website~.+ with a fixed text, namely '{contact:website}' (in the mapcomplete.org theme 'Hotels')" + "description": "Layer 'Tourism accomodation' shows contact:website~.+ with a fixed text, namely '{contact:website}' (in the mapcomplete.org theme 'Hotels')" }, { "key": "wheelchair", - "description": "Layer 'Hotels' shows wheelchair=designated with a fixed text, namely 'This place is specially adapted for wheelchair users' and allows to pick this as a default answer (in the mapcomplete.org theme 'Hotels')", + "description": "Layer 'Tourism accomodation' shows wheelchair=designated with a fixed text, namely 'This place is specially adapted for wheelchair users' and allows to pick this as a default answer (in the mapcomplete.org theme 'Hotels')", "value": "designated" }, { "key": "wheelchair", - "description": "Layer 'Hotels' shows wheelchair=yes with a fixed text, namely 'This place is easily reachable with a wheelchair' and allows to pick this as a default answer (in the mapcomplete.org theme 'Hotels')", + "description": "Layer 'Tourism accomodation' shows wheelchair=yes with a fixed text, namely 'This place is easily reachable with a wheelchair' and allows to pick this as a default answer (in the mapcomplete.org theme 'Hotels')", "value": "yes" }, { "key": "wheelchair", - "description": "Layer 'Hotels' shows wheelchair=limited with a fixed text, namely 'It is possible to reach this place in a wheelchair, but it is not easy' and allows to pick this as a default answer (in the mapcomplete.org theme 'Hotels')", + "description": "Layer 'Tourism accomodation' shows wheelchair=limited with a fixed text, namely 'It is possible to reach this place in a wheelchair, but it is not easy' and allows to pick this as a default answer (in the mapcomplete.org theme 'Hotels')", "value": "limited" }, { "key": "wheelchair", - "description": "Layer 'Hotels' shows wheelchair=no with a fixed text, namely 'This place is not reachable with a wheelchair' and allows to pick this as a default answer (in the mapcomplete.org theme 'Hotels')", + "description": "Layer 'Tourism accomodation' shows wheelchair=no with a fixed text, namely 'This place is not reachable with a wheelchair' and allows to pick this as a default answer (in the mapcomplete.org theme 'Hotels')", "value": "no" }, { "key": "internet_access", - "description": "Layer 'Hotels' shows internet_access=wlan with a fixed text, namely 'This place offers wireless internet access' and allows to pick this as a default answer (in the mapcomplete.org theme 'Hotels')", + "description": "Layer 'Tourism accomodation' shows internet_access=wlan with a fixed text, namely 'This place offers wireless internet access' and allows to pick this as a default answer (in the mapcomplete.org theme 'Hotels')", "value": "wlan" }, { "key": "internet_access", - "description": "Layer 'Hotels' shows internet_access=no with a fixed text, namely 'This place does not offer internet access' and allows to pick this as a default answer (in the mapcomplete.org theme 'Hotels')", + "description": "Layer 'Tourism accomodation' shows internet_access=no with a fixed text, namely 'This place does not offer internet access' and allows to pick this as a default answer (in the mapcomplete.org theme 'Hotels')", "value": "no" }, { "key": "internet_access", - "description": "Layer 'Hotels' shows internet_access=yes with a fixed text, namely 'This place offers internet access' (in the mapcomplete.org theme 'Hotels')", + "description": "Layer 'Tourism accomodation' shows internet_access=yes with a fixed text, namely 'This place offers internet access' (in the mapcomplete.org theme 'Hotels')", "value": "yes" }, { "key": "internet_access", - "description": "Layer 'Hotels' shows internet_access=terminal with a fixed text, namely 'This place offers internet access via a terminal or computer' and allows to pick this as a default answer (in the mapcomplete.org theme 'Hotels')", + "description": "Layer 'Tourism accomodation' shows internet_access=terminal with a fixed text, namely 'This place offers internet access via a terminal or computer' and allows to pick this as a default answer (in the mapcomplete.org theme 'Hotels')", "value": "terminal" }, { "key": "internet_access", - "description": "Layer 'Hotels' shows internet_access=wired with a fixed text, namely 'This place offers wired internet access' and allows to pick this as a default answer (in the mapcomplete.org theme 'Hotels')", + "description": "Layer 'Tourism accomodation' shows internet_access=wired with a fixed text, namely 'This place offers wired internet access' and allows to pick this as a default answer (in the mapcomplete.org theme 'Hotels')", "value": "wired" }, { "key": "internet_access:fee", - "description": "Layer 'Hotels' shows internet_access:fee=yes with a fixed text, namely 'There is a fee for the internet access at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'Hotels') (This is only shown if internet_access!=no & internet_access~.+)", + "description": "Layer 'Tourism accomodation' shows internet_access:fee=yes with a fixed text, namely 'There is a fee for the internet access at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'Hotels') (This is only shown if internet_access!=no & internet_access~.+)", "value": "yes" }, { "key": "internet_access:fee", - "description": "Layer 'Hotels' shows internet_access:fee=no with a fixed text, namely 'Internet access is free at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'Hotels') (This is only shown if internet_access!=no & internet_access~.+)", + "description": "Layer 'Tourism accomodation' shows internet_access:fee=no with a fixed text, namely 'Internet access is free at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'Hotels') (This is only shown if internet_access!=no & internet_access~.+)", "value": "no" }, { "key": "internet_access:fee", - "description": "Layer 'Hotels' shows internet_access:fee=customers with a fixed text, namely 'Internet access is free at this place, for customers only' and allows to pick this as a default answer (in the mapcomplete.org theme 'Hotels') (This is only shown if internet_access!=no & internet_access~.+)", + "description": "Layer 'Tourism accomodation' shows internet_access:fee=customers with a fixed text, namely 'Internet access is free at this place, for customers only' and allows to pick this as a default answer (in the mapcomplete.org theme 'Hotels') (This is only shown if internet_access!=no & internet_access~.+)", "value": "customers" }, { "key": "internet_access:ssid", - "description": "Layer 'Hotels' shows and asks freeform values for key 'internet_access:ssid' (in the mapcomplete.org theme 'Hotels') (This is only shown if internet_access=wlan)" + "description": "Layer 'Tourism accomodation' shows and asks freeform values for key 'internet_access:ssid' (in the mapcomplete.org theme 'Hotels') (This is only shown if internet_access=wlan)" }, { "key": "internet_access:ssid", - "description": "Layer 'Hotels' shows internet_access:ssid=Telekom with a fixed text, namely 'Telekom' and allows to pick this as a default answer (in the mapcomplete.org theme 'Hotels') (This is only shown if internet_access=wlan)", + "description": "Layer 'Tourism accomodation' shows internet_access:ssid=Telekom with a fixed text, namely 'Telekom' and allows to pick this as a default answer (in the mapcomplete.org theme 'Hotels') (This is only shown if internet_access=wlan)", "value": "Telekom" }, + { + "key": "dog", + "description": "Layer 'Tourism accomodation' shows dog=yes with a fixed text, namely 'Dogs are allowed' and allows to pick this as a default answer (in the mapcomplete.org theme 'Hotels')", + "value": "yes" + }, + { + "key": "dog", + "description": "Layer 'Tourism accomodation' shows dog=no with a fixed text, namely 'Dogs are not allowed' and allows to pick this as a default answer (in the mapcomplete.org theme 'Hotels')", + "value": "no" + }, + { + "key": "dog", + "description": "Layer 'Tourism accomodation' shows dog=leashed with a fixed text, namely 'Dogs are allowed, but they have to be leashed' and allows to pick this as a default answer (in the mapcomplete.org theme 'Hotels')", + "value": "leashed" + }, + { + "key": "dog", + "description": "Layer 'Tourism accomodation' shows dog=unleashed with a fixed text, namely 'Dogs are allowed and can run around freely' and allows to pick this as a default answer (in the mapcomplete.org theme 'Hotels')", + "value": "unleashed" + }, + { + "key": "dog", + "description": "Layer 'Tourism accomodation' shows dog=outside with a fixed text, namely 'Dogs are allowed only outside' and allows to pick this as a default answer (in the mapcomplete.org theme 'Hotels')", + "value": "outside" + }, { "key": "amenity", "description": "The MapComplete theme Hotels has a layer Love hotels showing features with this tag", diff --git a/Docs/TagInfo/mapcomplete_onwheels.json b/Docs/TagInfo/mapcomplete_onwheels.json index bcbbf43aa..6b5388d8a 100644 --- a/Docs/TagInfo/mapcomplete_onwheels.json +++ b/Docs/TagInfo/mapcomplete_onwheels.json @@ -3462,130 +3462,169 @@ }, { "key": "tourism", - "description": "The MapComplete theme OnWheels has a layer Hotels showing features with this tag", + "description": "The MapComplete theme OnWheels has a layer Tourism accomodation showing features with this tag", + "value": "hostel" + }, + { + "key": "tourism", + "description": "The MapComplete theme OnWheels has a layer Tourism accomodation showing features with this tag", "value": "hotel" }, { "key": "id", - "description": "Layer 'Hotels' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'OnWheels') (This is only shown if _backend~.+ & _last_edit:passed_time<300 & (_version_number= | _version_number=1))" + "description": "Layer 'Tourism accomodation' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'OnWheels') (This is only shown if _backend~.+ & _last_edit:passed_time<300 & (_version_number= | _version_number=1))" }, { "key": "image", - "description": "The layer 'Hotels allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary" + "description": "The layer 'Tourism accomodation allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary" }, { "key": "mapillary", - "description": "The layer 'Hotels allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary" + "description": "The layer 'Tourism accomodation allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary" }, { "key": "wikidata", - "description": "The layer 'Hotels allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary" + "description": "The layer 'Tourism accomodation allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary" }, { "key": "wikipedia", - "description": "The layer 'Hotels allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary" + "description": "The layer 'Tourism accomodation allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary" }, { "key": "name", - "description": "Layer 'Hotels' shows and asks freeform values for key 'name' (in the mapcomplete.org theme 'OnWheels')" + "description": "Layer 'Tourism accomodation' shows and asks freeform values for key 'name' (in the mapcomplete.org theme 'OnWheels')" + }, + { + "key": "brand", + "description": "Layer 'Tourism accomodation' shows and asks freeform values for key 'brand' (in the mapcomplete.org theme 'OnWheels')" + }, + { + "key": "nobrand", + "description": "Layer 'Tourism accomodation' shows nobrand=yes with a fixed text, namely 'Not part of a bigger brand' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels')", + "value": "yes" }, { "key": "phone", - "description": "Layer 'Hotels' shows and asks freeform values for key 'phone' (in the mapcomplete.org theme 'OnWheels')" + "description": "Layer 'Tourism accomodation' shows and asks freeform values for key 'phone' (in the mapcomplete.org theme 'OnWheels')" }, { "key": "contact:phone", - "description": "Layer 'Hotels' shows contact:phone~.+ with a fixed text, namely '{contact:phone}' (in the mapcomplete.org theme 'OnWheels')" + "description": "Layer 'Tourism accomodation' shows contact:phone~.+ with a fixed text, namely '{contact:phone}' (in the mapcomplete.org theme 'OnWheels')" }, { "key": "email", - "description": "Layer 'Hotels' shows and asks freeform values for key 'email' (in the mapcomplete.org theme 'OnWheels')" + "description": "Layer 'Tourism accomodation' shows and asks freeform values for key 'email' (in the mapcomplete.org theme 'OnWheels')" }, { "key": "contact:email", - "description": "Layer 'Hotels' shows contact:email~.+ with a fixed text, namely '{contact:email}' (in the mapcomplete.org theme 'OnWheels')" + "description": "Layer 'Tourism accomodation' shows contact:email~.+ with a fixed text, namely '{contact:email}' (in the mapcomplete.org theme 'OnWheels')" }, { "key": "operator:email", - "description": "Layer 'Hotels' shows operator:email~.+ with a fixed text, namely '{operator:email}' (in the mapcomplete.org theme 'OnWheels')" + "description": "Layer 'Tourism accomodation' shows operator:email~.+ with a fixed text, namely '{operator:email}' (in the mapcomplete.org theme 'OnWheels')" }, { "key": "website", - "description": "Layer 'Hotels' shows and asks freeform values for key 'website' (in the mapcomplete.org theme 'OnWheels')" + "description": "Layer 'Tourism accomodation' shows and asks freeform values for key 'website' (in the mapcomplete.org theme 'OnWheels')" }, { "key": "contact:website", - "description": "Layer 'Hotels' shows contact:website~.+ with a fixed text, namely '{contact:website}' (in the mapcomplete.org theme 'OnWheels')" + "description": "Layer 'Tourism accomodation' shows contact:website~.+ with a fixed text, namely '{contact:website}' (in the mapcomplete.org theme 'OnWheels')" }, { "key": "wheelchair", - "description": "Layer 'Hotels' shows wheelchair=designated with a fixed text, namely 'This place is specially adapted for wheelchair users' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels')", + "description": "Layer 'Tourism accomodation' shows wheelchair=designated with a fixed text, namely 'This place is specially adapted for wheelchair users' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels')", "value": "designated" }, { "key": "wheelchair", - "description": "Layer 'Hotels' shows wheelchair=yes with a fixed text, namely 'This place is easily reachable with a wheelchair' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels')", + "description": "Layer 'Tourism accomodation' shows wheelchair=yes with a fixed text, namely 'This place is easily reachable with a wheelchair' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels')", "value": "yes" }, { "key": "wheelchair", - "description": "Layer 'Hotels' shows wheelchair=limited with a fixed text, namely 'It is possible to reach this place in a wheelchair, but it is not easy' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels')", + "description": "Layer 'Tourism accomodation' shows wheelchair=limited with a fixed text, namely 'It is possible to reach this place in a wheelchair, but it is not easy' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels')", "value": "limited" }, { "key": "wheelchair", - "description": "Layer 'Hotels' shows wheelchair=no with a fixed text, namely 'This place is not reachable with a wheelchair' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels')", + "description": "Layer 'Tourism accomodation' shows wheelchair=no with a fixed text, namely 'This place is not reachable with a wheelchair' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels')", "value": "no" }, { "key": "internet_access", - "description": "Layer 'Hotels' shows internet_access=wlan with a fixed text, namely 'This place offers wireless internet access' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels')", + "description": "Layer 'Tourism accomodation' shows internet_access=wlan with a fixed text, namely 'This place offers wireless internet access' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels')", "value": "wlan" }, { "key": "internet_access", - "description": "Layer 'Hotels' shows internet_access=no with a fixed text, namely 'This place does not offer internet access' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels')", + "description": "Layer 'Tourism accomodation' shows internet_access=no with a fixed text, namely 'This place does not offer internet access' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels')", "value": "no" }, { "key": "internet_access", - "description": "Layer 'Hotels' shows internet_access=yes with a fixed text, namely 'This place offers internet access' (in the mapcomplete.org theme 'OnWheels')", + "description": "Layer 'Tourism accomodation' shows internet_access=yes with a fixed text, namely 'This place offers internet access' (in the mapcomplete.org theme 'OnWheels')", "value": "yes" }, { "key": "internet_access", - "description": "Layer 'Hotels' shows internet_access=terminal with a fixed text, namely 'This place offers internet access via a terminal or computer' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels')", + "description": "Layer 'Tourism accomodation' shows internet_access=terminal with a fixed text, namely 'This place offers internet access via a terminal or computer' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels')", "value": "terminal" }, { "key": "internet_access", - "description": "Layer 'Hotels' shows internet_access=wired with a fixed text, namely 'This place offers wired internet access' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels')", + "description": "Layer 'Tourism accomodation' shows internet_access=wired with a fixed text, namely 'This place offers wired internet access' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels')", "value": "wired" }, { "key": "internet_access:fee", - "description": "Layer 'Hotels' shows internet_access:fee=yes with a fixed text, namely 'There is a fee for the internet access at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels') (This is only shown if internet_access!=no & internet_access~.+)", + "description": "Layer 'Tourism accomodation' shows internet_access:fee=yes with a fixed text, namely 'There is a fee for the internet access at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels') (This is only shown if internet_access!=no & internet_access~.+)", "value": "yes" }, { "key": "internet_access:fee", - "description": "Layer 'Hotels' shows internet_access:fee=no with a fixed text, namely 'Internet access is free at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels') (This is only shown if internet_access!=no & internet_access~.+)", + "description": "Layer 'Tourism accomodation' shows internet_access:fee=no with a fixed text, namely 'Internet access is free at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels') (This is only shown if internet_access!=no & internet_access~.+)", "value": "no" }, { "key": "internet_access:fee", - "description": "Layer 'Hotels' shows internet_access:fee=customers with a fixed text, namely 'Internet access is free at this place, for customers only' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels') (This is only shown if internet_access!=no & internet_access~.+)", + "description": "Layer 'Tourism accomodation' shows internet_access:fee=customers with a fixed text, namely 'Internet access is free at this place, for customers only' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels') (This is only shown if internet_access!=no & internet_access~.+)", "value": "customers" }, { "key": "internet_access:ssid", - "description": "Layer 'Hotels' shows and asks freeform values for key 'internet_access:ssid' (in the mapcomplete.org theme 'OnWheels') (This is only shown if internet_access=wlan)" + "description": "Layer 'Tourism accomodation' shows and asks freeform values for key 'internet_access:ssid' (in the mapcomplete.org theme 'OnWheels') (This is only shown if internet_access=wlan)" }, { "key": "internet_access:ssid", - "description": "Layer 'Hotels' shows internet_access:ssid=Telekom with a fixed text, namely 'Telekom' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels') (This is only shown if internet_access=wlan)", + "description": "Layer 'Tourism accomodation' shows internet_access:ssid=Telekom with a fixed text, namely 'Telekom' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels') (This is only shown if internet_access=wlan)", "value": "Telekom" }, + { + "key": "dog", + "description": "Layer 'Tourism accomodation' shows dog=yes with a fixed text, namely 'Dogs are allowed' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels')", + "value": "yes" + }, + { + "key": "dog", + "description": "Layer 'Tourism accomodation' shows dog=no with a fixed text, namely 'Dogs are not allowed' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels')", + "value": "no" + }, + { + "key": "dog", + "description": "Layer 'Tourism accomodation' shows dog=leashed with a fixed text, namely 'Dogs are allowed, but they have to be leashed' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels')", + "value": "leashed" + }, + { + "key": "dog", + "description": "Layer 'Tourism accomodation' shows dog=unleashed with a fixed text, namely 'Dogs are allowed and can run around freely' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels')", + "value": "unleashed" + }, + { + "key": "dog", + "description": "Layer 'Tourism accomodation' shows dog=outside with a fixed text, namely 'Dogs are allowed only outside' and allows to pick this as a default answer (in the mapcomplete.org theme 'OnWheels')", + "value": "outside" + }, { "key": "office", "description": "The MapComplete theme OnWheels has a layer governments showing features with this tag", diff --git a/Docs/TagInfo/mapcomplete_personal.json b/Docs/TagInfo/mapcomplete_personal.json index 916e82219..06c5a7d48 100644 --- a/Docs/TagInfo/mapcomplete_personal.json +++ b/Docs/TagInfo/mapcomplete_personal.json @@ -10935,132 +10935,6 @@ "key": "opening_hours:visitors", "description": "Layer 'Hospitals' shows and asks freeform values for key 'opening_hours:visitors' (in the mapcomplete.org theme 'Personal theme')" }, - { - "key": "tourism", - "description": "The MapComplete theme Personal theme has a layer Hotels showing features with this tag", - "value": "hotel" - }, - { - "key": "id", - "description": "Layer 'Hotels' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ & _last_edit:passed_time<300 & (_version_number= | _version_number=1))" - }, - { - "key": "image", - "description": "The layer 'Hotels allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary" - }, - { - "key": "mapillary", - "description": "The layer 'Hotels allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary" - }, - { - "key": "wikidata", - "description": "The layer 'Hotels allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary" - }, - { - "key": "wikipedia", - "description": "The layer 'Hotels allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary" - }, - { - "key": "name", - "description": "Layer 'Hotels' shows and asks freeform values for key 'name' (in the mapcomplete.org theme 'Personal theme')" - }, - { - "key": "phone", - "description": "Layer 'Hotels' shows and asks freeform values for key 'phone' (in the mapcomplete.org theme 'Personal theme')" - }, - { - "key": "contact:phone", - "description": "Layer 'Hotels' shows contact:phone~.+ with a fixed text, namely '{contact:phone}' (in the mapcomplete.org theme 'Personal theme')" - }, - { - "key": "email", - "description": "Layer 'Hotels' shows and asks freeform values for key 'email' (in the mapcomplete.org theme 'Personal theme')" - }, - { - "key": "contact:email", - "description": "Layer 'Hotels' shows contact:email~.+ with a fixed text, namely '{contact:email}' (in the mapcomplete.org theme 'Personal theme')" - }, - { - "key": "operator:email", - "description": "Layer 'Hotels' shows operator:email~.+ with a fixed text, namely '{operator:email}' (in the mapcomplete.org theme 'Personal theme')" - }, - { - "key": "website", - "description": "Layer 'Hotels' shows and asks freeform values for key 'website' (in the mapcomplete.org theme 'Personal theme')" - }, - { - "key": "contact:website", - "description": "Layer 'Hotels' shows contact:website~.+ with a fixed text, namely '{contact:website}' (in the mapcomplete.org theme 'Personal theme')" - }, - { - "key": "wheelchair", - "description": "Layer 'Hotels' shows wheelchair=designated with a fixed text, namely 'This place is specially adapted for wheelchair users' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", - "value": "designated" - }, - { - "key": "wheelchair", - "description": "Layer 'Hotels' shows wheelchair=yes with a fixed text, namely 'This place is easily reachable with a wheelchair' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", - "value": "yes" - }, - { - "key": "wheelchair", - "description": "Layer 'Hotels' shows wheelchair=limited with a fixed text, namely 'It is possible to reach this place in a wheelchair, but it is not easy' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", - "value": "limited" - }, - { - "key": "wheelchair", - "description": "Layer 'Hotels' shows wheelchair=no with a fixed text, namely 'This place is not reachable with a wheelchair' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", - "value": "no" - }, - { - "key": "internet_access", - "description": "Layer 'Hotels' shows internet_access=wlan with a fixed text, namely 'This place offers wireless internet access' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", - "value": "wlan" - }, - { - "key": "internet_access", - "description": "Layer 'Hotels' shows internet_access=no with a fixed text, namely 'This place does not offer internet access' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", - "value": "no" - }, - { - "key": "internet_access", - "description": "Layer 'Hotels' shows internet_access=yes with a fixed text, namely 'This place offers internet access' (in the mapcomplete.org theme 'Personal theme')", - "value": "yes" - }, - { - "key": "internet_access", - "description": "Layer 'Hotels' shows internet_access=terminal with a fixed text, namely 'This place offers internet access via a terminal or computer' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", - "value": "terminal" - }, - { - "key": "internet_access", - "description": "Layer 'Hotels' shows internet_access=wired with a fixed text, namely 'This place offers wired internet access' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", - "value": "wired" - }, - { - "key": "internet_access:fee", - "description": "Layer 'Hotels' shows internet_access:fee=yes with a fixed text, namely 'There is a fee for the internet access at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if internet_access!=no & internet_access~.+)", - "value": "yes" - }, - { - "key": "internet_access:fee", - "description": "Layer 'Hotels' shows internet_access:fee=no with a fixed text, namely 'Internet access is free at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if internet_access!=no & internet_access~.+)", - "value": "no" - }, - { - "key": "internet_access:fee", - "description": "Layer 'Hotels' shows internet_access:fee=customers with a fixed text, namely 'Internet access is free at this place, for customers only' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if internet_access!=no & internet_access~.+)", - "value": "customers" - }, - { - "key": "internet_access:ssid", - "description": "Layer 'Hotels' shows and asks freeform values for key 'internet_access:ssid' (in the mapcomplete.org theme 'Personal theme') (This is only shown if internet_access=wlan)" - }, - { - "key": "internet_access:ssid", - "description": "Layer 'Hotels' shows internet_access:ssid=Telekom with a fixed text, namely 'Telekom' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if internet_access=wlan)", - "value": "Telekom" - }, { "key": "emergency", "description": "The MapComplete theme Personal theme has a layer Map of hydrants showing features with this tag", @@ -18999,6 +18873,171 @@ "description": "Layer 'Tool libraries' shows fee=donation with a fixed text, namely 'A donation can be given when borrowing tools' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", "value": "donation" }, + { + "key": "tourism", + "description": "The MapComplete theme Personal theme has a layer Tourism accomodation showing features with this tag", + "value": "hostel" + }, + { + "key": "tourism", + "description": "The MapComplete theme Personal theme has a layer Tourism accomodation showing features with this tag", + "value": "hotel" + }, + { + "key": "id", + "description": "Layer 'Tourism accomodation' shows id~.+ with a fixed text, namely 'You just created this element! Thanks for sharing this info with the world and helping people worldwide.' (in the mapcomplete.org theme 'Personal theme') (This is only shown if _backend~.+ & _last_edit:passed_time<300 & (_version_number= | _version_number=1))" + }, + { + "key": "image", + "description": "The layer 'Tourism accomodation allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary" + }, + { + "key": "mapillary", + "description": "The layer 'Tourism accomodation allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary" + }, + { + "key": "wikidata", + "description": "The layer 'Tourism accomodation allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary" + }, + { + "key": "wikipedia", + "description": "The layer 'Tourism accomodation allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary" + }, + { + "key": "name", + "description": "Layer 'Tourism accomodation' shows and asks freeform values for key 'name' (in the mapcomplete.org theme 'Personal theme')" + }, + { + "key": "brand", + "description": "Layer 'Tourism accomodation' shows and asks freeform values for key 'brand' (in the mapcomplete.org theme 'Personal theme')" + }, + { + "key": "nobrand", + "description": "Layer 'Tourism accomodation' shows nobrand=yes with a fixed text, namely 'Not part of a bigger brand' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "yes" + }, + { + "key": "phone", + "description": "Layer 'Tourism accomodation' shows and asks freeform values for key 'phone' (in the mapcomplete.org theme 'Personal theme')" + }, + { + "key": "contact:phone", + "description": "Layer 'Tourism accomodation' shows contact:phone~.+ with a fixed text, namely '{contact:phone}' (in the mapcomplete.org theme 'Personal theme')" + }, + { + "key": "email", + "description": "Layer 'Tourism accomodation' shows and asks freeform values for key 'email' (in the mapcomplete.org theme 'Personal theme')" + }, + { + "key": "contact:email", + "description": "Layer 'Tourism accomodation' shows contact:email~.+ with a fixed text, namely '{contact:email}' (in the mapcomplete.org theme 'Personal theme')" + }, + { + "key": "operator:email", + "description": "Layer 'Tourism accomodation' shows operator:email~.+ with a fixed text, namely '{operator:email}' (in the mapcomplete.org theme 'Personal theme')" + }, + { + "key": "website", + "description": "Layer 'Tourism accomodation' shows and asks freeform values for key 'website' (in the mapcomplete.org theme 'Personal theme')" + }, + { + "key": "contact:website", + "description": "Layer 'Tourism accomodation' shows contact:website~.+ with a fixed text, namely '{contact:website}' (in the mapcomplete.org theme 'Personal theme')" + }, + { + "key": "wheelchair", + "description": "Layer 'Tourism accomodation' shows wheelchair=designated with a fixed text, namely 'This place is specially adapted for wheelchair users' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "designated" + }, + { + "key": "wheelchair", + "description": "Layer 'Tourism accomodation' shows wheelchair=yes with a fixed text, namely 'This place is easily reachable with a wheelchair' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "yes" + }, + { + "key": "wheelchair", + "description": "Layer 'Tourism accomodation' shows wheelchair=limited with a fixed text, namely 'It is possible to reach this place in a wheelchair, but it is not easy' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "limited" + }, + { + "key": "wheelchair", + "description": "Layer 'Tourism accomodation' shows wheelchair=no with a fixed text, namely 'This place is not reachable with a wheelchair' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "no" + }, + { + "key": "internet_access", + "description": "Layer 'Tourism accomodation' shows internet_access=wlan with a fixed text, namely 'This place offers wireless internet access' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "wlan" + }, + { + "key": "internet_access", + "description": "Layer 'Tourism accomodation' shows internet_access=no with a fixed text, namely 'This place does not offer internet access' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "no" + }, + { + "key": "internet_access", + "description": "Layer 'Tourism accomodation' shows internet_access=yes with a fixed text, namely 'This place offers internet access' (in the mapcomplete.org theme 'Personal theme')", + "value": "yes" + }, + { + "key": "internet_access", + "description": "Layer 'Tourism accomodation' shows internet_access=terminal with a fixed text, namely 'This place offers internet access via a terminal or computer' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "terminal" + }, + { + "key": "internet_access", + "description": "Layer 'Tourism accomodation' shows internet_access=wired with a fixed text, namely 'This place offers wired internet access' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "wired" + }, + { + "key": "internet_access:fee", + "description": "Layer 'Tourism accomodation' shows internet_access:fee=yes with a fixed text, namely 'There is a fee for the internet access at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if internet_access!=no & internet_access~.+)", + "value": "yes" + }, + { + "key": "internet_access:fee", + "description": "Layer 'Tourism accomodation' shows internet_access:fee=no with a fixed text, namely 'Internet access is free at this place' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if internet_access!=no & internet_access~.+)", + "value": "no" + }, + { + "key": "internet_access:fee", + "description": "Layer 'Tourism accomodation' shows internet_access:fee=customers with a fixed text, namely 'Internet access is free at this place, for customers only' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if internet_access!=no & internet_access~.+)", + "value": "customers" + }, + { + "key": "internet_access:ssid", + "description": "Layer 'Tourism accomodation' shows and asks freeform values for key 'internet_access:ssid' (in the mapcomplete.org theme 'Personal theme') (This is only shown if internet_access=wlan)" + }, + { + "key": "internet_access:ssid", + "description": "Layer 'Tourism accomodation' shows internet_access:ssid=Telekom with a fixed text, namely 'Telekom' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if internet_access=wlan)", + "value": "Telekom" + }, + { + "key": "dog", + "description": "Layer 'Tourism accomodation' shows dog=yes with a fixed text, namely 'Dogs are allowed' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "yes" + }, + { + "key": "dog", + "description": "Layer 'Tourism accomodation' shows dog=no with a fixed text, namely 'Dogs are not allowed' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "no" + }, + { + "key": "dog", + "description": "Layer 'Tourism accomodation' shows dog=leashed with a fixed text, namely 'Dogs are allowed, but they have to be leashed' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "leashed" + }, + { + "key": "dog", + "description": "Layer 'Tourism accomodation' shows dog=unleashed with a fixed text, namely 'Dogs are allowed and can run around freely' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "unleashed" + }, + { + "key": "dog", + "description": "Layer 'Tourism accomodation' shows dog=outside with a fixed text, namely 'Dogs are allowed only outside' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", + "value": "outside" + }, { "key": "type", "description": "The MapComplete theme Personal theme has a layer Bus lines showing features with this tag", diff --git a/Docs/Themes/fritures.md b/Docs/Themes/fritures.md index b23ad84fe..edcb1d192 100644 --- a/Docs/Themes/fritures.md +++ b/Docs/Themes/fritures.md @@ -338,7 +338,7 @@ _This tagrendering has no question and is thus read-only_ ### menu-website The question is `On what webpage is the menu published?` -*{link(Consult the menu,&LBRACEwebsite:menu&RBRACE,,,)}* is shown if `website:menu` is set +*{link(Consult the menu,&LBRACEwebsite:menu&RBRACE,,,,)}* is shown if `website:menu` is set diff --git a/Docs/Themes/ghostsigns.md b/Docs/Themes/ghostsigns.md index eed5f919d..4a270258f 100644 --- a/Docs/Themes/ghostsigns.md +++ b/Docs/Themes/ghostsigns.md @@ -11,6 +11,7 @@ This theme contains the following layers: - [ghostsigns (defined in this theme)](#ghostsigns) - [advertising_wall_paintings (defined in this theme)](#advertising_wall_paintings) + - [artwork_on_wall (defined in this theme)](#artwork_on_wall) - [walls_and_buildings](../Layers/walls_and_buildings.md) @@ -51,6 +52,35 @@ Available languages: + [move-button](#move-button) + [delete-button](#delete-button) + [lod](#lod) +4. [artwork_on_wall](#artwork_on_wall) + - [Basic tags for this layer](#basic-tags-for-this-layer) + - [Supported attributes](#supported-attributes) + + [historic_or_not](#historic_or_not) + + [images](#images) + + [artwork-artwork_type](#artwork-artwork_type) + + [artwork-artist-wikidata](#artwork-artist-wikidata) + + [artwork-artist_name](#artwork-artist_name) + + [artwork-website](#artwork-website) + + [wikipedia](#wikipedia) + + [artwork_subject](#artwork_subject) + + [doubles_as_memorial](#doubles_as_memorial) + + [memorial-type](#memorial-type) + + [inscription](#inscription) + + [doubles_as_bench](#doubles_as_bench) + + [bench-backrest](#bench-backrest) + + [bench-armrest](#bench-armrest) + + [bench-seats](#bench-seats) + + [bench-material](#bench-material) + + [bench-direction](#bench-direction) + + [bench-colour](#bench-colour) + + [bench-survey:date](#bench-surveydate) + + [bench-inscription](#bench-inscription) + + [bench-memorial](#bench-memorial) + + [leftover-questions](#leftover-questions) + + [move-button](#move-button) + + [delete-button](#delete-button) + + [lod](#lod) + - [Filters](#filters) # Layers defined in this theme configuration file These layers can not be reused in different themes. @@ -352,6 +382,421 @@ _This tagrendering has no question and is thus read-only_ This tagrendering has labels `added_by_default` +# artwork_on_wall + + +This layer is based on [artwork](../Layers/artwork.md) + +An open map of statues, busts, graffitis and other artwork all over the world + + + + + + + - This layer is shown at zoomlevel **16** and higher + + + +No themes use this layer + +## Basic tags for this layer + +Elements must match **all** of the following expressions: + +0. tourism=artwork +1. artwork_type=mural | artwork_type=graffiti | artwork_type=mosaic | artwork_type=relief | artwork_type=painting | artwork_type=mural_painting + +[Execute on overpass](http://overpass-turbo.eu/?Q=%5Bout%3Ajson%5D%5Btimeout%3A90%5D%3B%28%20%20%20%20nwr%5B%22tourism%22%3D%22artwork%22%5D%5B%22artwork_type%22%3D%22mural%22%5D%28%7B%7Bbbox%7D%7D%29%3B%0A%20%20%20%20nwr%5B%22tourism%22%3D%22artwork%22%5D%5B%22artwork_type%22%3D%22graffiti%22%5D%28%7B%7Bbbox%7D%7D%29%3B%0A%20%20%20%20nwr%5B%22tourism%22%3D%22artwork%22%5D%5B%22artwork_type%22%3D%22mosaic%22%5D%28%7B%7Bbbox%7D%7D%29%3B%0A%20%20%20%20nwr%5B%22tourism%22%3D%22artwork%22%5D%5B%22artwork_type%22%3D%22relief%22%5D%28%7B%7Bbbox%7D%7D%29%3B%0A%20%20%20%20nwr%5B%22tourism%22%3D%22artwork%22%5D%5B%22artwork_type%22%3D%22painting%22%5D%28%7B%7Bbbox%7D%7D%29%3B%0A%20%20%20%20nwr%5B%22tourism%22%3D%22artwork%22%5D%5B%22artwork_type%22%3D%22mural_painting%22%5D%28%7B%7Bbbox%7D%7D%29%3B%0A%29%3Bout%20body%3B%3E%3Bout%20skel%20qt%3B) + +## Supported attributes + +**Warning:**,this quick overview is incomplete, + +| attribute | type | values which are supported by this layer | +-----|-----|----- | +| [historic](https://wiki.openstreetmap.org/wiki/Key:historic) | Multiple choice | [advertising](https://wiki.openstreetmap.org/wiki/Tag:historic%3Dadvertising) [](https://wiki.openstreetmap.org/wiki/Tag:historic%3D) | +| [artwork_type](https://wiki.openstreetmap.org/wiki/Key:artwork_type) | [string](../SpecialInputElements.md#string) | [architecture](https://wiki.openstreetmap.org/wiki/Tag:artwork_type%3Darchitecture) [mural](https://wiki.openstreetmap.org/wiki/Tag:artwork_type%3Dmural) [painting](https://wiki.openstreetmap.org/wiki/Tag:artwork_type%3Dpainting) [sculpture](https://wiki.openstreetmap.org/wiki/Tag:artwork_type%3Dsculpture) [statue](https://wiki.openstreetmap.org/wiki/Tag:artwork_type%3Dstatue) [bust](https://wiki.openstreetmap.org/wiki/Tag:artwork_type%3Dbust) [stone](https://wiki.openstreetmap.org/wiki/Tag:artwork_type%3Dstone) [installation](https://wiki.openstreetmap.org/wiki/Tag:artwork_type%3Dinstallation) [graffiti](https://wiki.openstreetmap.org/wiki/Tag:artwork_type%3Dgraffiti) [relief](https://wiki.openstreetmap.org/wiki/Tag:artwork_type%3Drelief) [azulejo](https://wiki.openstreetmap.org/wiki/Tag:artwork_type%3Dazulejo) [tilework](https://wiki.openstreetmap.org/wiki/Tag:artwork_type%3Dtilework) [woodcarving](https://wiki.openstreetmap.org/wiki/Tag:artwork_type%3Dwoodcarving) | +| [artist:wikidata](https://wiki.openstreetmap.org/wiki/Key:artist:wikidata) | [wikidata](../SpecialInputElements.md#wikidata) | | +| [artist_name](https://wiki.openstreetmap.org/wiki/Key:artist_name) | [string](../SpecialInputElements.md#string) | | +| [website](https://wiki.openstreetmap.org/wiki/Key:website) | [url](../SpecialInputElements.md#url) | | +| [wikidata](https://wiki.openstreetmap.org/wiki/Key:wikidata) | [wikidata](../SpecialInputElements.md#wikidata) | | +| [subject:wikidata](https://wiki.openstreetmap.org/wiki/Key:subject:wikidata) | [wikidata](../SpecialInputElements.md#wikidata) | | +| [historic](https://wiki.openstreetmap.org/wiki/Key:historic) | Multiple choice | [memorial](https://wiki.openstreetmap.org/wiki/Tag:historic%3Dmemorial) [](https://wiki.openstreetmap.org/wiki/Tag:historic%3D) | +| [memorial](https://wiki.openstreetmap.org/wiki/Key:memorial) | [string](../SpecialInputElements.md#string) | [statue](https://wiki.openstreetmap.org/wiki/Tag:memorial%3Dstatue) [plaque](https://wiki.openstreetmap.org/wiki/Tag:memorial%3Dplaque) [bench](https://wiki.openstreetmap.org/wiki/Tag:memorial%3Dbench) [ghost_bike](https://wiki.openstreetmap.org/wiki/Tag:memorial%3Dghost_bike) [stolperstein](https://wiki.openstreetmap.org/wiki/Tag:memorial%3Dstolperstein) [stele](https://wiki.openstreetmap.org/wiki/Tag:memorial%3Dstele) [stone](https://wiki.openstreetmap.org/wiki/Tag:memorial%3Dstone) [bust](https://wiki.openstreetmap.org/wiki/Tag:memorial%3Dbust) [sculpture](https://wiki.openstreetmap.org/wiki/Tag:memorial%3Dsculpture) [obelisk](https://wiki.openstreetmap.org/wiki/Tag:memorial%3Dobelisk) [cross](https://wiki.openstreetmap.org/wiki/Tag:memorial%3Dcross) [blue_plaque](https://wiki.openstreetmap.org/wiki/Tag:memorial%3Dblue_plaque) [tank](https://wiki.openstreetmap.org/wiki/Tag:memorial%3Dtank) [tree](https://wiki.openstreetmap.org/wiki/Tag:memorial%3Dtree) | +| [inscription](https://wiki.openstreetmap.org/wiki/Key:inscription) | [text](../SpecialInputElements.md#text) | | +| [amenity](https://wiki.openstreetmap.org/wiki/Key:amenity) | Multiple choice | [bench](https://wiki.openstreetmap.org/wiki/Tag:amenity%3Dbench) [](https://wiki.openstreetmap.org/wiki/Tag:amenity%3D) | +| [backrest](https://wiki.openstreetmap.org/wiki/Key:backrest) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:backrest%3Dyes) [yes](https://wiki.openstreetmap.org/wiki/Tag:backrest%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:backrest%3Dno) | +| [armrest](https://wiki.openstreetmap.org/wiki/Key:armrest) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:armrest%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:armrest%3Dno) | +| [seats](https://wiki.openstreetmap.org/wiki/Key:seats) | [nat](../SpecialInputElements.md#nat) | | +| [material](https://wiki.openstreetmap.org/wiki/Key:material) | [string](../SpecialInputElements.md#string) | [wood](https://wiki.openstreetmap.org/wiki/Tag:material%3Dwood) [metal](https://wiki.openstreetmap.org/wiki/Tag:material%3Dmetal) [stone](https://wiki.openstreetmap.org/wiki/Tag:material%3Dstone) [concrete](https://wiki.openstreetmap.org/wiki/Tag:material%3Dconcrete) [plastic](https://wiki.openstreetmap.org/wiki/Tag:material%3Dplastic) [steel](https://wiki.openstreetmap.org/wiki/Tag:material%3Dsteel) | +| [direction](https://wiki.openstreetmap.org/wiki/Key:direction) | [direction](../SpecialInputElements.md#direction) | | +| [colour](https://wiki.openstreetmap.org/wiki/Key:colour) | [color](../SpecialInputElements.md#color) | [brown](https://wiki.openstreetmap.org/wiki/Tag:colour%3Dbrown) [green](https://wiki.openstreetmap.org/wiki/Tag:colour%3Dgreen) [gray](https://wiki.openstreetmap.org/wiki/Tag:colour%3Dgray) [white](https://wiki.openstreetmap.org/wiki/Tag:colour%3Dwhite) [red](https://wiki.openstreetmap.org/wiki/Tag:colour%3Dred) [black](https://wiki.openstreetmap.org/wiki/Tag:colour%3Dblack) [blue](https://wiki.openstreetmap.org/wiki/Tag:colour%3Dblue) [yellow](https://wiki.openstreetmap.org/wiki/Tag:colour%3Dyellow) | +| [survey:date](https://wiki.openstreetmap.org/wiki/Key:survey:date) | [date](../SpecialInputElements.md#date) | [](https://wiki.openstreetmap.org/wiki/Tag:survey:date%3D) | +| [inscription](https://wiki.openstreetmap.org/wiki/Key:inscription) | [text](../SpecialInputElements.md#text) | | +| [historic](https://wiki.openstreetmap.org/wiki/Key:historic) | Multiple choice | [memorial](https://wiki.openstreetmap.org/wiki/Tag:historic%3Dmemorial) [](https://wiki.openstreetmap.org/wiki/Tag:historic%3D) | + + + + +### historic_or_not + +The question is `Is this artwork a historic advertisement?` + + + + - *This artwork is a historic advertisement* is shown if with historic=advertising + - *This artwork is not a historic advertisement* is shown if with historic= + + + + + +### images +This block shows the known images which are linked with the `image`-keys, but also via `mapillary` and `wikidata` and shows the button to upload new images +_This tagrendering has no question and is thus read-only_ +*{image_carousel()}{image_upload()}* + + + + +### artwork-artwork_type + +The question is `What is the type of this artwork?` +*This is a {artwork_type}* is shown if `artwork_type` is set + + + - *Architecture* is shown if with artwork_type=architecture + - *Mural* is shown if with artwork_type=mural + - *Painting* is shown if with artwork_type=painting + - *Sculpture* is shown if with artwork_type=sculpture + - *Statue* is shown if with artwork_type=statue + - *Bust* is shown if with artwork_type=bust + - *Stone* is shown if with artwork_type=stone + - *Installation* is shown if with artwork_type=installation + - *Graffiti* is shown if with artwork_type=graffiti + - *Relief* is shown if with artwork_type=relief + - *Azulejo (Spanish decorative tilework)* is shown if with artwork_type=azulejo + - *Tilework* is shown if with artwork_type=tilework + - *Woodcarving* is shown if with artwork_type=woodcarving + + + +This tagrendering has labels +`artwork-question` + +### artwork-artist-wikidata + +The question is `Who made this artwork?` +*This artwork was made by {wikidata_label(artist:wikidata):font-weight:bold}
{wikipedia(artist:wikidata)}* is shown if `artist:wikidata` is set + + +This tagrendering has labels +`artwork-question` + +### artwork-artist_name + +The question is `Which artist created this?` +*Created by {artist_name}* is shown if `artist_name` is set + + +This tagrendering has labels +`artwork-question` + +### artwork-website + +The question is `Is there a website with more information about this artwork?` +*{link(More information on this website,&LBRACEwebsite&RBRACE,,,,)}* is shown if `website` is set + + +This tagrendering has labels +`artwork-question` + +### wikipedia +Shows a wikipedia box with the corresponding wikipedia article; the wikidata-item link can be changed by a contributor +The question is `What is the corresponding Wikidata entity?` +*{wikipedia():max-height:25rem}* is shown if `wikidata` is set + + + - *{wikipedia():max-height:25rem}* is shown if with wikipedia~.+. _This option cannot be chosen as answer_ + - *No Wikipedia page has been linked yet* is shown if with wikidata=. _This option cannot be chosen as answer_ + + + + + +### artwork_subject + +The question is `What does this artwork depict?` +*This artwork depicts {wikidata_label(subject:wikidata)}{wikipedia(subject:wikidata)}* is shown if `subject:wikidata` is set + +This tagrendering is only visible in the popup if the following condition is met: subject:wikidata~.+ +This tagrendering has labels +`artwork-question` + +### doubles_as_memorial + +The question is `Does this artwork serve as a memorial?` + + + + - *This artwork also serves as a memorial* is shown if with historic=memorial + - *This artwork does not serve as a bench* is shown if with historic= + + + + + +### memorial-type + +The question is `What type of memorial is this?` +*This is a {memorial}* is shown if `memorial` is set + + + - *This is a statue* is shown if with memorial=statue + - *This is a plaque* is shown if with memorial=plaque + - *This is a commemorative bench* is shown if with memorial=bench + - *This is a ghost bike - a bicycle painted white to remember a cyclist whom deceased because of a car crash* is shown if with memorial=ghost_bike + - *This is a stolperstein (stumbing stone)* is shown if with memorial=stolperstein + - *This is a stele* is shown if with memorial=stele + - *This is a memorial stone* is shown if with memorial=stone + - *This is a bust* is shown if with memorial=bust + - *This is a sculpture* is shown if with memorial=sculpture + - *This is an obelisk* is shown if with memorial=obelisk + - *This is a cross* is shown if with memorial=cross + - *This is a blue plaque* is shown if with memorial=blue_plaque + - *This is a historic tank, permanently placed in public space as memorial* is shown if with memorial=tank + - *This is a memorial tree* is shown if with memorial=tree + - *This is a gravestone; the person is buried here* is shown if with historic=tomb + + +This tagrendering is only visible in the popup if the following condition is met: historic=memorial +This tagrendering has labels +`memorial-questions` + +### inscription + +The question is `What is the inscription on this memorial?` +*The inscription on this memorial reads:

{inscription}

* is shown if `inscription` is set + + + - *This memorial does not have an inscription* is shown if with not:inscription=yes + + +This tagrendering is only visible in the popup if the following condition is met: historic=memorial & memorial!=bench +This tagrendering has labels +`memorial-questions` + +### doubles_as_bench + +The question is `Does this artwork serve as a bench?` + + + + - *This artwork also serves as a bench* is shown if with amenity=bench + - *This artwork does not serve as a bench* is shown if with amenity= + - *This artwork does not serve as a bench* is shown if with amenity!=bench. _This option cannot be chosen as answer_ + + + + + +### bench-backrest + +The question is `Does this bench have a backrest?` + + + + - *This bench is two-sided and shares the backrest* is shown if with backrest=yes & two_sided=yes + - *This bench does have a backrest* is shown if with backrest=yes + - *This bench does not have a backrest* is shown if with backrest=no + + +This tagrendering is only visible in the popup if the following condition is met: amenity=bench +This tagrendering has labels +`bench-questions` + +### bench-armrest + +The question is `Does this bench have one or more armrests?` + + + + - *This bench does have one or more armrests* is shown if with armrest=yes + - *This bench does not have any armrests* is shown if with armrest=no + + +This tagrendering is only visible in the popup if the following condition is met: amenity=bench +This tagrendering has labels +`bench-questions` + +### bench-seats + +The question is `How many seats does this bench have?` +*This bench has {seats} seats* is shown if `seats` is set + + + - *This bench does not have separated seats* is shown if with seats:separated=no + + +This tagrendering is only visible in the popup if the following condition is met: amenity=bench +This tagrendering has labels +`bench-questions` + +### bench-material + +The question is `What is the bench (seating) made from?` +*Material: {material}* is shown if `material` is set + + + - *The seating is made from wood* is shown if with material=wood + - *The seating is made from metal* is shown if with material=metal + - *The seating is made from stone* is shown if with material=stone + - *The seating is made from concrete* is shown if with material=concrete + - *The seating is made from plastic* is shown if with material=plastic + - *The seating is made from steel* is shown if with material=steel + + +This tagrendering is only visible in the popup if the following condition is met: amenity=bench +This tagrendering has labels +`bench-questions` + +### bench-direction + +The question is `In which direction are you looking when sitting on the bench?` +*When sitting on the bench, one looks towards {direction}°.* is shown if `direction` is set + +This tagrendering is only visible in the popup if the following condition is met: amenity=bench & two_sided!=yes +This tagrendering has labels +`bench-questions` + +### bench-colour + +The question is `Which colour does this bench have?` +*Colour: {colour}* is shown if `colour` is set + + + - *Colour: brown* is shown if with colour=brown + - *Colour: green* is shown if with colour=green + - *Colour: gray* is shown if with colour=gray + - *Colour: white* is shown if with colour=white + - *Colour: red* is shown if with colour=red + - *Colour: black* is shown if with colour=black + - *Colour: blue* is shown if with colour=blue + - *Colour: yellow* is shown if with colour=yellow + + +This tagrendering is only visible in the popup if the following condition is met: amenity=bench +This tagrendering has labels +`bench-questions` + +### bench-survey:date + +The question is `When was this bench last surveyed?` +*This bench was last surveyed on {survey:date}* is shown if `survey:date` is set + + + - *Surveyed today!* is shown if with survey:date= + + +This tagrendering is only visible in the popup if the following condition is met: amenity=bench +This tagrendering has labels +`bench-questions` + +### bench-inscription + +The question is `Does this bench have an inscription?` +*This bench has the following inscription:

{inscription}

* is shown if `inscription` is set + + + - *This bench does not have an inscription* is shown if with not:inscription=yes + - *This bench probably does not not have an inscription* is shown if with inscription=. _This option cannot be chosen as answer_ + + +This tagrendering is only visible in the popup if the following condition is met: amenity=bench +This tagrendering has labels +`bench-questions` + +### bench-memorial + +The question is `Does this bench act as memorial for someone or something?` + + + + - *This bench is a memorial for someone or something* is shown if with historic=memorial + - *This bench is a not a memorial for someone or something* is shown if with historic= & not:historic=memorial + + +This tagrendering is only visible in the popup if the following condition is met: amenity=bench & (historic=memorial | memorial=bench | tourism=artwork | inscription~.+) +This tagrendering has labels +`bench-questions` + +### leftover-questions + +_This tagrendering has no question and is thus read-only_ +*{questions( ,)}* + + + + +### move-button + +_This tagrendering has no question and is thus read-only_ +*{move_button()}* + + + + +### delete-button + +_This tagrendering has no question and is thus read-only_ +*{delete_button()}* + + + + +### lod + +_This tagrendering has no question and is thus read-only_ +*{linked_data_from_website()}* + + +This tagrendering has labels +`added_by_default` + +## Filters + + + +| id | question | osmTags | +-----|-----|----- | +| has_image.0 | *With and without images* (default) | | +| has_image.1 | Has at least one image | image~.+ | image:0~.+ | image:1~.+ | image:2~.+ | image:3~.+ | mapillary~.+ | +| has_image.2 | Probably does not have an image | image= & image:0= & image:1= & image:2= & image:3= & mapillary= | + + + + + + +| id | question | osmTags | +-----|-----|----- | +| artwork-artwork_type.0 | *What is the type of this artwork?* (default) | | +| artwork-artwork_type.1 | Architecture | artwork_type=architecture | +| artwork-artwork_type.2 | Mural | artwork_type=mural | +| artwork-artwork_type.3 | Painting | artwork_type=painting | +| artwork-artwork_type.4 | Sculpture | artwork_type=sculpture | +| artwork-artwork_type.5 | Statue | artwork_type=statue | +| artwork-artwork_type.6 | Bust | artwork_type=bust | +| artwork-artwork_type.7 | Stone | artwork_type=stone | +| artwork-artwork_type.8 | Installation | artwork_type=installation | +| artwork-artwork_type.9 | Graffiti | artwork_type=graffiti | +| artwork-artwork_type.10 | Relief | artwork_type=relief | +| artwork-artwork_type.11 | Azulejo (Spanish decorative tilework) | artwork_type=azulejo | +| artwork-artwork_type.12 | Tilework | artwork_type=tilework | +| artwork-artwork_type.13 | Woodcarving | artwork_type=woodcarving | + + This document is autogenerated from [assets/themes/ghostsigns/ghostsigns.json](https://github.com/pietervdvn/MapComplete/blob/develop/assets/themes/ghostsigns/ghostsigns.json) diff --git a/Docs/Themes/glutenfree.md b/Docs/Themes/glutenfree.md index 00a70e6af..b57114270 100644 --- a/Docs/Themes/glutenfree.md +++ b/Docs/Themes/glutenfree.md @@ -420,7 +420,7 @@ _This tagrendering has no question and is thus read-only_ ### menu-website The question is `On what webpage is the menu published?` -*{link(Consult the menu,&LBRACEwebsite:menu&RBRACE,,,)}* is shown if `website:menu` is set +*{link(Consult the menu,&LBRACEwebsite:menu&RBRACE,,,,)}* is shown if `website:menu` is set diff --git a/Docs/Themes/hotels.md b/Docs/Themes/hotels.md index 05b6d5e2a..2539294f3 100644 --- a/Docs/Themes/hotels.md +++ b/Docs/Themes/hotels.md @@ -9,7 +9,7 @@ The theme introduction reads: This theme contains the following layers: - - [hotel](../Layers/hotel.md) + - [tourism_accomodation](../Layers/tourism_accomodation.md) - [love_hotel](../Layers/love_hotel.md) diff --git a/Docs/Themes/lactosefree.md b/Docs/Themes/lactosefree.md index 36c82ca40..519e155b3 100644 --- a/Docs/Themes/lactosefree.md +++ b/Docs/Themes/lactosefree.md @@ -418,7 +418,7 @@ _This tagrendering has no question and is thus read-only_ ### menu-website The question is `On what webpage is the menu published?` -*{link(Consult the menu,&LBRACEwebsite:menu&RBRACE,,,)}* is shown if `website:menu` is set +*{link(Consult the menu,&LBRACEwebsite:menu&RBRACE,,,,)}* is shown if `website:menu` is set diff --git a/Docs/Themes/onwheels.md b/Docs/Themes/onwheels.md index 35ed8818c..d2ec34e00 100644 --- a/Docs/Themes/onwheels.md +++ b/Docs/Themes/onwheels.md @@ -26,7 +26,7 @@ This theme contains the following layers: - [reception_desk](../Layers/reception_desk.md) - [walls_and_buildings](../Layers/walls_and_buildings.md) - [elevator](../Layers/elevator.md) - - [hotel](../Layers/hotel.md) + - [tourism_accomodation](../Layers/tourism_accomodation.md) - [governments](../Layers/governments.md) - [current_view](../Layers/current_view.md) - [maproulette_challenge](../Layers/maproulette_challenge.md) diff --git a/Docs/Themes/openlovemap.md b/Docs/Themes/openlovemap.md index d2fe71a0a..6c41eccc3 100644 --- a/Docs/Themes/openlovemap.md +++ b/Docs/Themes/openlovemap.md @@ -18,7 +18,7 @@ This theme contains the following layers: - [erotic_cinema (defined in this theme)](#erotic_cinema) - [cinema](../Layers/cinema.md) - [love_hotel](../Layers/love_hotel.md) - - [hotel](../Layers/hotel.md) + - [tourism_accomodation](../Layers/tourism_accomodation.md) Available languages: diff --git a/Docs/Themes/personal.md b/Docs/Themes/personal.md index e97a3117d..de0aaa277 100644 --- a/Docs/Themes/personal.md +++ b/Docs/Themes/personal.md @@ -67,7 +67,6 @@ This theme contains the following layers: - [guidepost](../Layers/guidepost.md) - [hackerspace](../Layers/hackerspace.md) - [hospital](../Layers/hospital.md) - - [hotel](../Layers/hotel.md) - [hydrant](../Layers/hydrant.md) - [ice_cream](../Layers/ice_cream.md) - [indoors](../Layers/indoors.md) @@ -121,6 +120,7 @@ This theme contains the following layers: - [toilet](../Layers/toilet.md) - [toilet_at_amenity](../Layers/toilet_at_amenity.md) - [tool_library](../Layers/tool_library.md) + - [tourism_accomodation](../Layers/tourism_accomodation.md) - [transit_routes](../Layers/transit_routes.md) - [transit_stops](../Layers/transit_stops.md) - [tree_node](../Layers/tree_node.md) diff --git a/Docs/Themes/pets.md b/Docs/Themes/pets.md index 67af67edc..9efb3a1ed 100644 --- a/Docs/Themes/pets.md +++ b/Docs/Themes/pets.md @@ -394,7 +394,7 @@ _This tagrendering has no question and is thus read-only_ ### menu-website The question is `On what webpage is the menu published?` -*{link(Consult the menu,&LBRACEwebsite:menu&RBRACE,,,)}* is shown if `website:menu` is set +*{link(Consult the menu,&LBRACEwebsite:menu&RBRACE,,,,)}* is shown if `website:menu` is set diff --git a/Docs/Themes/sidewalks.md b/Docs/Themes/sidewalks.md deleted file mode 100644 index edff3f528..000000000 --- a/Docs/Themes/sidewalks.md +++ /dev/null @@ -1,192 +0,0 @@ -[//]: # (WARNING: this file is automatically generated. Please find the sources at the bottom and edit those sources) - -## Sidewalks ( [sidewalks](https://mapcomplete.org/sidewalks) ) -_This document details some technical information about this MapComplete theme, mostly about the attributes used in the theme. Various links point toward more information about the attributes, e.g. to the OpenStreetMap-wiki, to TagInfo or tools creating statistics_ -The theme introduction reads: - -> Experimental theme - -This theme contains the following layers: - - - - [sidewalks (defined in this theme)](#sidewalks) - - -Available languages: - - - - en - - ru - - nl - - de - - ca - - es - - fr - - nb_NO - - it - - da - - pa_PK - - cs - - zh_Hant - - eu - - pl - - -# Table of contents - - - [Sidewalks ( sidewalks )](#sidewalks-(-sidewalks-)) -1. [Layers defined in this theme configuration file](#layers-defined-in-this-theme-configuration-file) -2. [sidewalks](#sidewalks) - - [Basic tags for this layer](#basic-tags-for-this-layer) - - [Supported attributes](#supported-attributes) - + [streetname](#streetname) - + [sidewalk_minimap_left](#sidewalk_minimap_left) - + [has_sidewalk_left](#has_sidewalk_left) - + [sidewalk_width_left](#sidewalk_width_left) - + [sidewalk_minimap_right](#sidewalk_minimap_right) - + [has_sidewalk_right](#has_sidewalk_right) - + [sidewalk_width_right](#sidewalk_width_right) - + [leftover-questions](#leftover-questions) - + [split_button](#split_button) - + [lod](#lod) - -# Layers defined in this theme configuration file -These layers can not be reused in different themes. -# sidewalks - - - - -Layer showing sidewalks of highways - - - - - - - - This layer is shown at zoomlevel **12** and higher - - - -No themes use this layer - -## Basic tags for this layer - -Elements must match **any** of the following expressions: - - - highway=residential - - highway=unclassified - - highway=tertiary - - highway=secondary - -[Execute on overpass](http://overpass-turbo.eu/?Q=%5Bout%3Ajson%5D%5Btimeout%3A90%5D%3B%28%20%20%20%20nwr%5B%22highway%22%3D%22residential%22%5D%28%7B%7Bbbox%7D%7D%29%3B%0A%20%20%20%20nwr%5B%22highway%22%3D%22unclassified%22%5D%28%7B%7Bbbox%7D%7D%29%3B%0A%20%20%20%20nwr%5B%22highway%22%3D%22tertiary%22%5D%28%7B%7Bbbox%7D%7D%29%3B%0A%20%20%20%20nwr%5B%22highway%22%3D%22secondary%22%5D%28%7B%7Bbbox%7D%7D%29%3B%0A%29%3Bout%20body%3B%3E%3Bout%20skel%20qt%3B) - -## Supported attributes - -**Warning:**,this quick overview is incomplete, - -| attribute | type | values which are supported by this layer | ------|-----|----- | -| [sidewalk:left](https://wiki.openstreetmap.org/wiki/Key:sidewalk:left) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:sidewalk:left%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:sidewalk:left%3Dno) [separate](https://wiki.openstreetmap.org/wiki/Tag:sidewalk:left%3Dseparate) | -| [sidewalk:left:width](https://wiki.openstreetmap.org/wiki/Key:sidewalk:left:width) | [distance](../SpecialInputElements.md#distance) | | -| [sidewalk:right](https://wiki.openstreetmap.org/wiki/Key:sidewalk:right) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:sidewalk:right%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:sidewalk:right%3Dno) [separate](https://wiki.openstreetmap.org/wiki/Tag:sidewalk:right%3Dseparate) | -| [sidewalk:right:width](https://wiki.openstreetmap.org/wiki/Key:sidewalk:right:width) | [distance](../SpecialInputElements.md#distance) | | - - - - -### streetname - -_This tagrendering has no question and is thus read-only_ -*This street is named {name}* - - - - -### sidewalk_minimap_left - -_This tagrendering has no question and is thus read-only_ -*{sided_minimap(left):height:8rem;border-radius:0.5rem;overflow:hidden}* - - - - -### has_sidewalk_left - -The question is `Is there a sidewalk on this side of the road?` - - - - - *There is a sidewalk on this side of the road* is shown if with sidewalk:left=yes - - *There is no sidewalk to walk on* is shown if with sidewalk:left=no - - *There is a separately mapped sidewalk to walk on* is shown if with sidewalk:left=separate - - - - - -### sidewalk_width_left - -The question is `What is the width of the sidewalk on this side of the road?` -*This sidewalk is {sidewalk:left:width}m wide* is shown if `sidewalk:left:width` is set - -This tagrendering is only visible in the popup if the following condition is met: sidewalk:left=yes - - -### sidewalk_minimap_right - -_This tagrendering has no question and is thus read-only_ -*{sided_minimap(right):height:8rem;border-radius:0.5rem;overflow:hidden}* - - - - -### has_sidewalk_right - -The question is `Is there a sidewalk on this side of the road?` - - - - - *There is a sidewalk on this side of the road* is shown if with sidewalk:right=yes - - *There is no sidewalk to walk on* is shown if with sidewalk:right=no - - *There is a separately mapped sidewalk to walk on* is shown if with sidewalk:right=separate - - - - - -### sidewalk_width_right - -The question is `What is the width of the sidewalk on this side of the road?` -*This sidewalk is {sidewalk:right:width}m wide* is shown if `sidewalk:right:width` is set - -This tagrendering is only visible in the popup if the following condition is met: sidewalk:right=yes - - -### leftover-questions - -_This tagrendering has no question and is thus read-only_ -*{questions( ,)}* - - - - -### split_button - -_This tagrendering has no question and is thus read-only_ -*{split_button()}* - - - - -### lod - -_This tagrendering has no question and is thus read-only_ -*{linked_data_from_website()}* - - -This tagrendering has labels -`added_by_default` - - -This document is autogenerated from [assets/themes/sidewalks/sidewalks.json](https://github.com/pietervdvn/MapComplete/blob/develop/assets/themes/sidewalks/sidewalks.json) diff --git a/Docs/Themes/velopark.md b/Docs/Themes/velopark.md index 9fff0f574..a35caee9c 100644 --- a/Docs/Themes/velopark.md +++ b/Docs/Themes/velopark.md @@ -138,7 +138,7 @@ Elements must match the expression **mr_taskId~.+** ### velopark-ref The question is `What is the URL of the data path within Velopark?` -*This bicycle parking is on OpenStreetMap and is linked to Velopark:{link(&LBRACEref:velopark&RBRACE,&LBRACEref:velopark&RBRACE,,,)}* is shown if `ref:velopark` is set +*This bicycle parking is on OpenStreetMap and is linked to Velopark:{link(&LBRACEref:velopark&RBRACE,&LBRACEref:velopark&RBRACE,,,,)}* is shown if `ref:velopark` is set This tagrendering is only visible in the popup if the following condition is met: amenity=bicycle_parking @@ -162,7 +162,7 @@ _This tagrendering has no question and is thus read-only_ ### is_linked _This tagrendering has no question and is thus read-only_ -*{link(Matched with bicycle parking &LBRACE_osm_parkings_with_this_velopark_ref&RBRACE,#&LBRACE_osm_parkings_with_this_velopark_ref&RBRACE,,,)}* is shown if `_osm_parkings_with_this_velopark_ref` is set +*{link(Matched with bicycle parking &LBRACE_osm_parkings_with_this_velopark_ref&RBRACE,#&LBRACE_osm_parkings_with_this_velopark_ref&RBRACE,,,,)}* is shown if `_osm_parkings_with_this_velopark_ref` is set @@ -170,7 +170,7 @@ _This tagrendering has no question and is thus read-only_ ### velopark-link _This tagrendering has no question and is thus read-only_ -*This is data from Velopark. {link(See on velopark &LPARENSwebpage&RPARENS,https://www.velopark.be/static/data/&LBRACEmr_velopark_id&RBRACE,,,)}* +*This is data from Velopark. {link(See on velopark &LPARENSwebpage&RPARENS,https://www.velopark.be/static/data/&LBRACEmr_velopark_id&RBRACE,,,,)}* @@ -262,7 +262,7 @@ _This tagrendering has no question and is thus read-only_ ### velopark-data-link _This tagrendering has no question and is thus read-only_ -*{link(Inspect raw data on velopark.be,&LBRACEref:velopark&RBRACE,,,)}* +*{link(Inspect raw data on velopark.be,&LBRACEref:velopark&RBRACE,,,,)}* @@ -375,7 +375,7 @@ Elements must match **all** of the following expressions: ### velopark-ref The question is `What is the URL of the data path within Velopark?` -*This bicycle parking is on OpenStreetMap and is linked to Velopark:{link(&LBRACEref:velopark&RBRACE,&LBRACEref:velopark&RBRACE,,,)}* is shown if `ref:velopark` is set +*This bicycle parking is on OpenStreetMap and is linked to Velopark:{link(&LBRACEref:velopark&RBRACE,&LBRACEref:velopark&RBRACE,,,,)}* is shown if `ref:velopark` is set This tagrendering is only visible in the popup if the following condition is met: amenity=bicycle_parking diff --git a/Docs/URL_Parameters.md b/Docs/URL_Parameters.md index 595f81f1b..a89a6fb41 100644 --- a/Docs/URL_Parameters.md +++ b/Docs/URL_Parameters.md @@ -24,26 +24,27 @@ This document gives an overview of which URL-parameters can be used to influence 15. [fs-layers-enabled](#fs-layers-enabled) 16. [fs-all-questions](#fs-all-questions) 17. [fs-export](#fs-export) -18. [test](#test) -19. [debug](#debug) -20. [moreprivacy](#moreprivacy) -21. [overpassUrl](#overpassurl) -22. [overpassTimeout](#overpasstimeout) -23. [overpassMaxZoom](#overpassmaxzoom) -24. [osmApiTileSize](#osmapitilesize) -25. [background](#background) -26. [z](#z) -27. [lat](#lat) -28. [lon](#lon) -29. [oauth_token](#oauth_token) -30. [layer-public_bookcase](#layer-public_bookcase) -31. [filter-public_bookcase-kid-books](#filter-public_bookcase-kid-books) -32. [filter-public_bookcase-adult-books](#filter-public_bookcase-adult-books) -33. [filter-public_bookcase-inside](#filter-public_bookcase-inside) -34. [filter-public_bookcase-has_image](#filter-public_bookcase-has_image) -35. [layer-note_import_public_bookcase](#layer-note_import_public_bookcase) -36. [mode](#mode) -37. [layer-](#layer-) +18. [fs-cache](#fs-cache) +19. [test](#test) +20. [debug](#debug) +21. [moreprivacy](#moreprivacy) +22. [overpassUrl](#overpassurl) +23. [overpassTimeout](#overpasstimeout) +24. [overpassMaxZoom](#overpassmaxzoom) +25. [osmApiTileSize](#osmapitilesize) +26. [background](#background) +27. [z](#z) +28. [lat](#lat) +29. [lon](#lon) +30. [oauth_token](#oauth_token) +31. [layer-public_bookcase](#layer-public_bookcase) +32. [filter-public_bookcase-kid-books](#filter-public_bookcase-kid-books) +33. [filter-public_bookcase-adult-books](#filter-public_bookcase-adult-books) +34. [filter-public_bookcase-inside](#filter-public_bookcase-inside) +35. [filter-public_bookcase-has_image](#filter-public_bookcase-has_image) +36. [layer-note_import_public_bookcase](#layer-note_import_public_bookcase) +37. [mode](#mode) +38. [layer-](#layer-) ## What is a URL parameter? @@ -132,7 +133,7 @@ The default value is _false_ Disables/Enables logging in and thus disables editing all together. This effectively puts MapComplete into read-only mode. -This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L99) +This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L101) @@ -142,7 +143,7 @@ The default value is _true_ Disables/Enables the search bar -This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L114) +This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L116) @@ -152,7 +153,7 @@ The default value is _true_ Disables/Enables the background layer control where a user can enable e.g. aerial imagery -This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L119) +This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L121) @@ -162,7 +163,7 @@ The default value is _true_ Disables/Enables the filter view where a user can enable/disable MapComplete-layers or filter for certain properties -This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L125) +This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L127) @@ -172,7 +173,7 @@ The default value is _true_ Disables/enables the help menu or welcome message -This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L131) +This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L133) @@ -182,7 +183,7 @@ The default value is _true_ Disables/enables the button to get in touch with the community -This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L136) +This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L138) @@ -192,7 +193,7 @@ The default value is _true_ Disables/Enables the extraLink button. By default, if in iframe mode and the welcome message is hidden, a popout button to the full mapcomplete instance is shown instead (unless disabled with this switch or another extraLink button is enabled) -This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L141) +This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L143) @@ -202,7 +203,7 @@ The default value is _true_ Disables/Enables the various links which go back to the index page with the theme overview -This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L146) +This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L148) @@ -212,7 +213,7 @@ The default value is _true_ Disables/Enables the 'Share-screen'-tab in the welcome message -This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L151) +This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L153) @@ -222,7 +223,7 @@ The default value is _true_ Disables/Enables the geolocation button -This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L156) +This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L158) @@ -232,7 +233,7 @@ The default value is _true_ If set to false, all layers will be disabled - except the explicitly enabled layers -This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L162) +This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L164) @@ -242,7 +243,7 @@ The default value is _true_ Always show all questions -This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L167) +This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L169) @@ -252,7 +253,17 @@ The default value is _false_ Enable the export as GeoJSON and CSV button -This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L173) +This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L175) + + + +The default value is _true_ + +## fs-cache + +Enable/disable caching from localStorage + +This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L181) @@ -262,7 +273,7 @@ The default value is _true_ If true, 'dryrun' mode is activated. The app will behave as normal, except that changes to OSM will be printed onto the console instead of actually uploaded to osm.org -This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L188) +This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L197) @@ -272,7 +283,7 @@ The default value is _false_ If true, shows some extra debugging help such as all the available tags on every object -This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L194) +This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L203) @@ -282,7 +293,7 @@ The default value is _false_ If true, the location distance indication will not be written to the changeset and other privacy enhancing measures might be taken. -This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L200) +This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L209) @@ -292,7 +303,7 @@ The default value is _false_ Point mapcomplete to a different overpass-instance. Example: https://overpass-api.de/api/interpreter -This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L206) +This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L215) @@ -302,7 +313,7 @@ The default value is _https://overpass-api.de/api/interpreter,https://overpass.k Set a different timeout (in seconds) for queries in overpass -This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L217) +This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L226) @@ -312,7 +323,7 @@ The default value is _30_ point to switch between OSM-api and overpass -This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L225) +This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L234) @@ -322,7 +333,7 @@ The default value is _16_ Tilesize when the OSM-API is used to fetch data within a BBOX -This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L233) +This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L242) @@ -332,7 +343,7 @@ The default value is _17_ The id of the background layer to start with -This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L240) +This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L249) @@ -372,7 +383,7 @@ The default value is _0_ Used to complete the login -This documentation is defined in the source code at [ThemeViewState.ts](/src/Models/ThemeViewState.ts#L177) +This documentation is defined in the source code at [ThemeViewState.ts](/src/Models/ThemeViewState.ts#L171) diff --git a/scripts/ScriptUtils.ts b/scripts/ScriptUtils.ts index b2176b7d3..d006e8740 100644 --- a/scripts/ScriptUtils.ts +++ b/scripts/ScriptUtils.ts @@ -172,14 +172,13 @@ export default class ScriptUtils { headers?: any, timeoutSecs?: number ): Promise<{ content: string } | { redirect: string } | "timeout"> { - if(url.startsWith("./assets")){ - return Promise.resolve({content: readFileSync("./public/"+url, "utf8")}) + if (url.startsWith("./assets")) { + return Promise.resolve({ content: readFileSync("./public/" + url, "utf8") }) } - if(url.startsWith("./")){ - return Promise.resolve({content: readFileSync(url, "utf8")}) + if (url.startsWith("./")) { + return Promise.resolve({ content: readFileSync(url, "utf8") }) } - const requestPromise = new Promise((resolve, reject) => { try { headers = headers ?? {} diff --git a/scripts/downloadEli.ts b/scripts/downloadEli.ts index 8dd79e657..8a56dd982 100644 --- a/scripts/downloadEli.ts +++ b/scripts/downloadEli.ts @@ -100,14 +100,17 @@ class DownloadEli extends Script { const contents = '{"type":"FeatureCollection",\n "features": [\n' + - keptLayers.filter(l => l.properties.id !== "Bing").map((l) => JSON.stringify(l)).join(",\n") + + keptLayers + .filter((l) => l.properties.id !== "Bing") + .map((l) => JSON.stringify(l)) + .join(",\n") + "\n]}" - const bing = keptLayers.find(l => l.properties.id === "Bing") - if(bing){ + const bing = keptLayers.find((l) => l.properties.id === "Bing") + if (bing) { fs.writeFileSync(targetBing, JSON.stringify(bing), { encoding: "utf8" }) console.log("Written", targetBing) - }else{ + } else { console.log("No bing entry found") } fs.writeFileSync(target, contents, { encoding: "utf8" }) diff --git a/scripts/generateLayerOverview.ts b/scripts/generateLayerOverview.ts index 4da86da38..56ce636f9 100644 --- a/scripts/generateLayerOverview.ts +++ b/scripts/generateLayerOverview.ts @@ -273,7 +273,6 @@ class LayerOverviewUtils extends Script { JSON.stringify(theme, null, " "), { encoding: "utf8" } ) - } writeLayer(layer: LayerConfigJson) { @@ -852,7 +851,11 @@ class LayerOverviewUtils extends Script { } } - const usedImages = Utils.Dedup(new ExtractImages(true, knownTagRenderings).convertStrict(themeFile).map(x => x.path)) + const usedImages = Utils.Dedup( + new ExtractImages(true, knownTagRenderings) + .convertStrict(themeFile) + .map((x) => x.path) + ) usedImages.sort() themeFile["_usedImages"] = usedImages diff --git a/scripts/handleErrors.ts b/scripts/handleErrors.ts index 43070dc4d..ac9b2c8f0 100644 --- a/scripts/handleErrors.ts +++ b/scripts/handleErrors.ts @@ -74,7 +74,12 @@ class HandleErrors extends Script { } for (const parsed of all) { - console.log(parsed.message.username, parsed.message.layout, parsed.message.message, parsed.date) + console.log( + parsed.message.username, + parsed.message.layout, + parsed.message.message, + parsed.date + ) const e = parsed.message const neededIds = Changes.GetNeededIds(e.pendingChanges) @@ -112,7 +117,7 @@ class HandleErrors extends Script { "Changes for " + parsed.index + ": empty changeset, not creating a file for it" )*/ } else if (createdChangesets.has(changeset)) { - /* console.log( + /* console.log( "Changeset " + parsed.index + " is identical to previously seen changeset, not writing to file" @@ -126,7 +131,7 @@ ${changeset}` } const refusedContent = JSON.stringify(refused) if (refusedFiles.has(refusedContent)) { - /* console.log( + /* console.log( "Refused changes for " + parsed.index + " is identical to previously seen changeset, not writing to file" diff --git a/src/Customizations/AllKnownLayouts.ts b/src/Customizations/AllKnownLayouts.ts index 04b6ff72e..5882b3135 100644 --- a/src/Customizations/AllKnownLayouts.ts +++ b/src/Customizations/AllKnownLayouts.ts @@ -36,7 +36,7 @@ export class AllKnownLayoutsLazy { return this.raw.get(key) } - public size(){ + public size() { return this.raw.size } diff --git a/src/Logic/Actors/BackgroundLayerResetter.ts b/src/Logic/Actors/BackgroundLayerResetter.ts index 71089df90..2a6efb0b7 100644 --- a/src/Logic/Actors/BackgroundLayerResetter.ts +++ b/src/Logic/Actors/BackgroundLayerResetter.ts @@ -1,6 +1,10 @@ import { Store, UIEventSource } from "../UIEventSource" import { Utils } from "../../Utils" -import { AvailableRasterLayers, RasterLayerPolygon, RasterLayerUtils } from "../../Models/RasterLayers" +import { + AvailableRasterLayers, + RasterLayerPolygon, + RasterLayerUtils, +} from "../../Models/RasterLayers" /** * When a user pans around on the map, they might pan out of the range of the current background raster layer. @@ -9,24 +13,32 @@ import { AvailableRasterLayers, RasterLayerPolygon, RasterLayerUtils } from "../ export default class BackgroundLayerResetter { constructor( currentBackgroundLayer: UIEventSource, - availableLayers: {store: Store} + availableLayers: { store: Store } ) { if (Utils.runningFromConsole) { return } - currentBackgroundLayer.addCallbackAndRunD(l => { - if(l.geometry !== undefined && AvailableRasterLayers.globalLayers.find(global => global.properties.id !== l.properties.id)){ - BackgroundLayerResetter.installHandler(currentBackgroundLayer, availableLayers.store) + currentBackgroundLayer.addCallbackAndRunD((l) => { + if ( + l.geometry !== undefined && + AvailableRasterLayers.globalLayers.find( + (global) => global.properties.id !== l.properties.id + ) + ) { + BackgroundLayerResetter.installHandler( + currentBackgroundLayer, + availableLayers.store + ) return true // unregister } }) - } - private static installHandler( currentBackgroundLayer: UIEventSource, - availableLayers: Store - ){ + private static installHandler( + currentBackgroundLayer: UIEventSource, + availableLayers: Store + ) { // Change the baseLayer back to OSM if we go out of the current range of the layer availableLayers.addCallbackAndRunD((availableLayers) => { // We only check on move/on change of the availableLayers diff --git a/src/Logic/Actors/PreferredRasterLayerSelector.ts b/src/Logic/Actors/PreferredRasterLayerSelector.ts index 63420ab30..2a1ef51ff 100644 --- a/src/Logic/Actors/PreferredRasterLayerSelector.ts +++ b/src/Logic/Actors/PreferredRasterLayerSelector.ts @@ -20,7 +20,7 @@ export class PreferredRasterLayerSelector { queryParameter: UIEventSource, preferredBackgroundLayer: UIEventSource< string | "photo" | "map" | "osmbasedmap" | undefined - >, + > ) { this._rasterLayerSetting = rasterLayerSetting this._availableLayers = availableLayers @@ -47,8 +47,8 @@ export class PreferredRasterLayerSelector { this._preferredBackgroundLayer.addCallbackD((_) => self.updateLayer()) - rasterLayerSetting.addCallbackAndRunD(layer => { - if (AvailableRasterLayers.globalLayers.find(l => l.id === layer.properties.id)) { + rasterLayerSetting.addCallbackAndRunD((layer) => { + if (AvailableRasterLayers.globalLayers.find((l) => l.id === layer.properties.id)) { return } this._availableLayers.store.addCallbackD((_) => self.updateLayer()) @@ -67,7 +67,9 @@ export class PreferredRasterLayerSelector { if (targetLayerId === undefined || targetLayerId === "default") { return } - const global = AvailableRasterLayers.globalLayers.find(l => l.properties.id === targetLayerId) + const global = AvailableRasterLayers.globalLayers.find( + (l) => l.properties.id === targetLayerId + ) if (global) { this._rasterLayerSetting.setData(global) return diff --git a/src/Logic/DetermineLayout.ts b/src/Logic/DetermineLayout.ts index 09bc96cba..0225b16b9 100644 --- a/src/Logic/DetermineLayout.ts +++ b/src/Logic/DetermineLayout.ts @@ -108,12 +108,18 @@ export default class DetermineLayout { ).data const id = layoutId?.toLowerCase() const layouts = AllKnownLayouts.allKnownLayouts - if(layouts.size() == 0){ + if (layouts.size() == 0) { throw "Build failed or running, no layouts are known at all" } if (layouts.getConfig(id) === undefined) { - const alternatives = Utils.sortedByLevenshteinDistance(id, Array.from(layouts.keys()), i => i).slice(0, 3) - const msg = (`No builtin map theme with name ${layoutId} exists. Perhaps you meant one of ${alternatives.join(", ")}`) + const alternatives = Utils.sortedByLevenshteinDistance( + id, + Array.from(layouts.keys()), + (i) => i + ).slice(0, 3) + const msg = `No builtin map theme with name ${layoutId} exists. Perhaps you meant one of ${alternatives.join( + ", " + )}` throw msg } return layouts.get(id) @@ -204,11 +210,11 @@ export default class DetermineLayout { id: json.id, description: json.description, descriptionTail: { - en: "
Layer only mode.
The loaded custom theme actually isn't a custom theme, but only contains a layer." + en: "
Layer only mode.
The loaded custom theme actually isn't a custom theme, but only contains a layer.", }, icon, title: json.name, - layers: [json] + layers: [json], } } @@ -221,7 +227,7 @@ export default class DetermineLayout { tagRenderings: DetermineLayout.getSharedTagRenderings(), tagRenderingOrder: DetermineLayout.getSharedTagRenderingOrder(), sharedLayers: knownLayersDict, - publicLayers: new Set() + publicLayers: new Set(), } json = new FixLegacyTheme().convertStrict(json) const raw = json @@ -245,7 +251,7 @@ export default class DetermineLayout { } return new LayoutConfig(json, false, { definitionRaw: JSON.stringify(raw, null, " "), - definedAtUrl: sourceUrl + definedAtUrl: sourceUrl, }) } diff --git a/src/Logic/FeatureSource/Sources/LayoutSource.ts b/src/Logic/FeatureSource/Sources/LayoutSource.ts index 9cfa8ed85..196f926fc 100644 --- a/src/Logic/FeatureSource/Sources/LayoutSource.ts +++ b/src/Logic/FeatureSource/Sources/LayoutSource.ts @@ -55,12 +55,11 @@ export default class LayoutSource extends FeatureSourceMerger { mapProperties, { isActive: isDisplayed(layer.id), - maxAge: layer.maxAgeOfCache + maxAge: layer.maxAgeOfCache, } ) fromCache.set(layer.id, src) } - } const mvtSources: UpdatableFeatureSource[] = osmLayers .filter((f) => mvtAvailableLayers.has(f.id)) @@ -170,7 +169,7 @@ export default class LayoutSource extends FeatureSourceMerger { backend, isActive, patchRelations: true, - fullNodeDatabase + fullNodeDatabase, }) } @@ -202,11 +201,11 @@ export default class LayoutSource extends FeatureSourceMerger { widenFactor: featureSwitches.layoutToUse.widenFactor, overpassUrl: featureSwitches.overpassUrl, overpassTimeout: featureSwitches.overpassTimeout, - overpassMaxZoom: featureSwitches.overpassMaxZoom + overpassMaxZoom: featureSwitches.overpassMaxZoom, }, { padToTiles: zoom.map((zoom) => Math.min(15, zoom + 1)), - isActive + isActive, } ) } diff --git a/src/Logic/MetaTagging.ts b/src/Logic/MetaTagging.ts index 55f78d96c..9501783d1 100644 --- a/src/Logic/MetaTagging.ts +++ b/src/Logic/MetaTagging.ts @@ -129,7 +129,7 @@ export default class MetaTagging { state.featureProperties, { includeDates: !lightUpdate, - evaluateStrict: !lightUpdate + evaluateStrict: !lightUpdate, } ) } @@ -305,7 +305,7 @@ export default class MetaTagging { return [] } return [state.perLayer.get(layerId).GetFeaturesWithin(bbox)] - } + }, } } @@ -350,8 +350,8 @@ export default class MetaTagging { if (MetaTagging.errorPrintCount < MetaTagging.stopErrorOutputAt) { console.warn( "Could not calculate a " + - (isStrict ? "strict " : "") + - "calculated tag for key", + (isStrict ? "strict " : "") + + "calculated tag for key", key, "for feature", feat.properties.id, @@ -359,9 +359,9 @@ export default class MetaTagging { code, "(in layer", layerId + - ") due to \n" + - e + - "\n. Are you the theme creator? Doublecheck your code. Note that the metatags might not be stable on new features", + ") due to \n" + + e + + "\n. Are you the theme creator? Doublecheck your code. Note that the metatags might not be stable on new features", e, e.stack, { feat } diff --git a/src/Logic/Osm/Changes.ts b/src/Logic/Osm/Changes.ts index cf17f08e5..a13d1e03e 100644 --- a/src/Logic/Osm/Changes.ts +++ b/src/Logic/Osm/Changes.ts @@ -440,7 +440,13 @@ export class Changes { } }) - if(!(result.newObjects.length === 0 && result.modifiedObjects.length === 0 && result.deletedObjects.length === 0)) { + if ( + !( + result.newObjects.length === 0 && + result.modifiedObjects.length === 0 && + result.deletedObjects.length === 0 + ) + ) { console.debug( "Calculated the pending changes: ", result.newObjects.length, @@ -589,7 +595,13 @@ export class Changes { if (matchFound) { toUpload.push(c) } else { - console.log("Refusing change about "+c.type+"/"+ c.id+" as not in the objects. No internet?") + console.log( + "Refusing change about " + + c.type + + "/" + + c.id + + " as not in the objects. No internet?" + ) refused.push(c) } }) @@ -711,7 +723,7 @@ export class Changes { let { toUpload, refused } = this.fragmentChanges(pending, objects) - if(toUpload.length === 0){ + if (toUpload.length === 0) { return refused } await this._changesetHandler.UploadChangeset( diff --git a/src/Logic/Osm/ChangesetHandler.ts b/src/Logic/Osm/ChangesetHandler.ts index ac8b0f910..8868b7932 100644 --- a/src/Logic/Osm/ChangesetHandler.ts +++ b/src/Logic/Osm/ChangesetHandler.ts @@ -154,7 +154,7 @@ export class ChangesetHandler { if (this._reportError) { this._reportError(e) } - if(( e).status === 400){ + if ((e).status === 400) { // This request is invalid. We simply drop the changes and hope that someone will analyze what went wrong with it in the upload; we pretend everything went fine return } diff --git a/src/Logic/Osm/OsmConnection.ts b/src/Logic/Osm/OsmConnection.ts index ab948720b..b705e3839 100644 --- a/src/Logic/Osm/OsmConnection.ts +++ b/src/Logic/Osm/OsmConnection.ts @@ -107,7 +107,8 @@ export class OsmConnection { ud.name = "Fake user" ud.totalMessages = 42 ud.languages = ["en"] - ud.description = "The 'fake-user' is a URL-parameter which allows to test features without needing an OSM account or even internet connection." + ud.description = + "The 'fake-user' is a URL-parameter which allows to test features without needing an OSM account or even internet connection." this.loadingStatus.setData("logged-in") } this.UpdateCapabilities() diff --git a/src/Logic/State/FeatureSwitchState.ts b/src/Logic/State/FeatureSwitchState.ts index 3c2a936c2..6fb5bb768 100644 --- a/src/Logic/State/FeatureSwitchState.ts +++ b/src/Logic/State/FeatureSwitchState.ts @@ -184,7 +184,6 @@ export default class FeatureSwitchState extends OsmConnectionFeatureSwitches { "Enable/disable caching from localStorage" ) - let testingDefaultValue = false if ( !Utils.runningFromConsole && diff --git a/src/Logic/State/GeoLocationState.ts b/src/Logic/State/GeoLocationState.ts index 805914588..03ba3a04d 100644 --- a/src/Logic/State/GeoLocationState.ts +++ b/src/Logic/State/GeoLocationState.ts @@ -57,7 +57,8 @@ export class GeoLocationState { * If the user denies the geolocation this time, we unset this flag * @private */ - private readonly _previousLocationGrant: UIEventSource = LocalStorageSource.GetParsed("geolocation-permissions", false) + private readonly _previousLocationGrant: UIEventSource = + LocalStorageSource.GetParsed("geolocation-permissions", false) /** * Used to detect a permission retraction @@ -67,8 +68,8 @@ export class GeoLocationState { /** * A human explanation of the current gps state, to be shown on the home screen or as tooltip */ - public readonly gpsStateExplanation : Store - constructor() { + public readonly gpsStateExplanation: Store + constructor() { const self = this this.permission.addCallbackAndRunD(async (state) => { @@ -103,33 +104,33 @@ export class GeoLocationState { this.requestPermission() } + this.gpsStateExplanation = this.gpsAvailable.map( + (available) => { + if (this.currentGPSLocation.data !== undefined) { + if (!this.allowMoving.data) { + return Translations.t.general.visualFeedback.islocked + } - this.gpsStateExplanation = this.gpsAvailable.map(available => { - - if (this.currentGPSLocation.data !== undefined) { - if (!this.allowMoving.data) { - return Translations.t.general.visualFeedback.islocked + return Translations.t.general.labels.jumpToLocation } - return Translations.t.general.labels.jumpToLocation - } - - if (!available) { - return Translations.t.general.labels.locationNotAvailable - } - if (this.permission.data === "denied") { - return Translations.t.general.geopermissionDenied - } - if (this.permission.data === "prompt") { - return Translations.t.general.labels.jumpToLocation - } - if (this.permission.data === "requested") { - return Translations.t.general.waitingForGeopermission - } - return Translations.t.general.waitingForLocation - }, [this.allowMoving, this.permission, this.currentGPSLocation]) - - } + if (!available) { + return Translations.t.general.labels.locationNotAvailable + } + if (this.permission.data === "denied") { + return Translations.t.general.geopermissionDenied + } + if (this.permission.data === "prompt") { + return Translations.t.general.labels.jumpToLocation + } + if (this.permission.data === "requested") { + return Translations.t.general.waitingForGeopermission + } + return Translations.t.general.waitingForLocation + }, + [this.allowMoving, this.permission, this.currentGPSLocation] + ) + } /** * Requests the user to allow access to their position. @@ -208,12 +209,12 @@ export class GeoLocationState { self._previousLocationGrant.setData(true) }, function (e) { - if(e.code === 2 || e.code === 3){ + if (e.code === 2 || e.code === 3) { self._gpsAvailable.set(false) return } self._gpsAvailable.set(true) // We go back to the default assumption that the location is physically available - if(e.code === 1) { + if (e.code === 1) { self.permission.set("denied") self._grantedThisSession.setData(false) return diff --git a/src/Logic/State/UserRelatedState.ts b/src/Logic/State/UserRelatedState.ts index c11db56fe..4ec9665a0 100644 --- a/src/Logic/State/UserRelatedState.ts +++ b/src/Logic/State/UserRelatedState.ts @@ -391,12 +391,14 @@ export default class UserRelatedState { for (const k in userDetails) { amendedPrefs.data["_" + k] = "" + userDetails[k] } - if(userDetails.description){ - amendedPrefs.data["_description_html"] = Utils.purify(new Showdown.Converter() - .makeHtml(userDetails.description) - ?.replace(/>/g, ">") - ?.replace(/</g, "<") - ?.replace(/\n/g, "")) + if (userDetails.description) { + amendedPrefs.data["_description_html"] = Utils.purify( + new Showdown.Converter() + .makeHtml(userDetails.description) + ?.replace(/>/g, ">") + ?.replace(/</g, "<") + ?.replace(/\n/g, "") + ) } usersettingMetaTagging.metaTaggging_for_usersettings({ properties: amendedPrefs.data }) diff --git a/src/Logic/State/UserSettingsMetaTagging.ts b/src/Logic/State/UserSettingsMetaTagging.ts index 33a5ae85b..6e568c5c3 100644 --- a/src/Logic/State/UserSettingsMetaTagging.ts +++ b/src/Logic/State/UserSettingsMetaTagging.ts @@ -1,14 +1,42 @@ import { Utils } from "../../Utils" /** This code is autogenerated - do not edit. Edit ./assets/layers/usersettings/usersettings.json instead */ export class ThemeMetaTagging { - public static readonly themeName = "usersettings" + public static readonly themeName = "usersettings" - public metaTaggging_for_usersettings(feat: {properties: Record}) { - Utils.AddLazyProperty(feat.properties, '_mastodon_candidate_md', () => feat.properties._description.match(/\[[^\]]*\]\((.*(mastodon|en.osm.town).*)\).*/)?.at(1) ) - Utils.AddLazyProperty(feat.properties, '_d', () => feat.properties._description?.replace(/</g,'<')?.replace(/>/g,'>') ?? '' ) - Utils.AddLazyProperty(feat.properties, '_mastodon_candidate_a', () => (feat => {const e = document.createElement('div');e.innerHTML = feat.properties._d;return Array.from(e.getElementsByTagName("a")).filter(a => a.href.match(/mastodon|en.osm.town/) !== null)[0]?.href }) (feat) ) - Utils.AddLazyProperty(feat.properties, '_mastodon_link', () => (feat => {const e = document.createElement('div');e.innerHTML = feat.properties._d;return Array.from(e.getElementsByTagName("a")).filter(a => a.getAttribute("rel")?.indexOf('me') >= 0)[0]?.href})(feat) ) - Utils.AddLazyProperty(feat.properties, '_mastodon_candidate', () => feat.properties._mastodon_candidate_md ?? feat.properties._mastodon_candidate_a ) - feat.properties['__current_backgroun'] = 'initial_value' - } -} \ No newline at end of file + public metaTaggging_for_usersettings(feat: { properties: Record }) { + Utils.AddLazyProperty(feat.properties, "_mastodon_candidate_md", () => + feat.properties._description + .match(/\[[^\]]*\]\((.*(mastodon|en.osm.town).*)\).*/) + ?.at(1) + ) + Utils.AddLazyProperty( + feat.properties, + "_d", + () => feat.properties._description?.replace(/</g, "<")?.replace(/>/g, ">") ?? "" + ) + Utils.AddLazyProperty(feat.properties, "_mastodon_candidate_a", () => + ((feat) => { + const e = document.createElement("div") + e.innerHTML = feat.properties._d + return Array.from(e.getElementsByTagName("a")).filter( + (a) => a.href.match(/mastodon|en.osm.town/) !== null + )[0]?.href + })(feat) + ) + Utils.AddLazyProperty(feat.properties, "_mastodon_link", () => + ((feat) => { + const e = document.createElement("div") + e.innerHTML = feat.properties._d + return Array.from(e.getElementsByTagName("a")).filter( + (a) => a.getAttribute("rel")?.indexOf("me") >= 0 + )[0]?.href + })(feat) + ) + Utils.AddLazyProperty( + feat.properties, + "_mastodon_candidate", + () => feat.properties._mastodon_candidate_md ?? feat.properties._mastodon_candidate_a + ) + feat.properties["__current_backgroun"] = "initial_value" + } +} diff --git a/src/Logic/Tags/TagUtils.ts b/src/Logic/Tags/TagUtils.ts index bddb17295..354257fb9 100644 --- a/src/Logic/Tags/TagUtils.ts +++ b/src/Logic/Tags/TagUtils.ts @@ -218,7 +218,7 @@ export class TagUtils { * * TagUtils.KVtoProperties([new Tag("a","b"), new Tag("c","d")] // => {a: "b", c: "d"} */ - static KVtoProperties(tags: {key: string, value: string}[]): Record { + static KVtoProperties(tags: { key: string; value: string }[]): Record { const properties: Record = {} for (const tag of tags) { properties[tag.key] = tag.value @@ -226,7 +226,7 @@ export class TagUtils { return properties } - static KVObjtoProperties(tags: {k: string, v: string}[]): Record { + static KVObjtoProperties(tags: { k: string; v: string }[]): Record { const properties: Record = {} for (const tag of tags) { properties[tag.k] = tag.v diff --git a/src/Logic/Web/IdbLocalStorage.ts b/src/Logic/Web/IdbLocalStorage.ts index 9411d1e3b..c28f4b165 100644 --- a/src/Logic/Web/IdbLocalStorage.ts +++ b/src/Logic/Web/IdbLocalStorage.ts @@ -10,7 +10,7 @@ export class IdbLocalStorage { public static Get( key: string, - options?: { defaultValue?: T; whenLoaded?: (t: T | null) => void }, + options?: { defaultValue?: T; whenLoaded?: (t: T | null) => void } ): UIEventSource { if (IdbLocalStorage._sourceCache[key] !== undefined) { return IdbLocalStorage._sourceCache[key] diff --git a/src/Logic/Web/NameSuggestionIndex.ts b/src/Logic/Web/NameSuggestionIndex.ts index df3ceda10..1ab669470 100644 --- a/src/Logic/Web/NameSuggestionIndex.ts +++ b/src/Logic/Web/NameSuggestionIndex.ts @@ -143,14 +143,14 @@ export default class NameSuggestionIndex { tags: Record, country: string[], location?: [number, number], - options?:{ + options?: { /** * If set, sort by frequency instead of alphabetically */ sortByFrequency: boolean } ): Promise { - const mappings: (Mapping & {frequency: number})[] = [] + const mappings: (Mapping & { frequency: number })[] = [] const frequencies = await NameSuggestionIndex.fetchFrequenciesFor(type, country) for (const key in tags) { if (key.startsWith("_")) { @@ -196,11 +196,11 @@ export default class NameSuggestionIndex { // As such, it should be "true" but this is not supported priorityIf: frequency > 0 ? new RegexTag("id", /.*/) : undefined, searchTerms: { "*": [nsiItem.displayName, nsiItem.id] }, - frequency: frequency ?? -1 + frequency: frequency ?? -1, }) } } - if(options?.sortByFrequency){ + if (options?.sortByFrequency) { mappings.sort((a, b) => b.frequency - a.frequency) } diff --git a/src/Logic/Web/ThemeViewStateHashActor.ts b/src/Logic/Web/ThemeViewStateHashActor.ts index 250eecd8d..68d6a8c15 100644 --- a/src/Logic/Web/ThemeViewStateHashActor.ts +++ b/src/Logic/Web/ThemeViewStateHashActor.ts @@ -17,7 +17,7 @@ export default class ThemeViewStateHashActor { "The possible hashes are:", "", MenuState._menuviewTabs.map((tab) => "`menu:" + tab + "`").join(","), - MenuState._themeviewTabs.map((tab) => "`theme-menu:" + tab + "`").join(",") + MenuState._themeviewTabs.map((tab) => "`theme-menu:" + tab + "`").join(","), ] /** diff --git a/src/Models/RasterLayers.ts b/src/Models/RasterLayers.ts index be928f488..d7d488c1d 100644 --- a/src/Models/RasterLayers.ts +++ b/src/Models/RasterLayers.ts @@ -8,26 +8,26 @@ import { GeoOperations } from "../Logic/GeoOperations" import { RasterLayerProperties } from "./RasterLayerProperties" import { Utils } from "../Utils" -export type EditorLayerIndex = (Feature & - RasterLayerPolygon)[] +export type EditorLayerIndex = (Feature & RasterLayerPolygon)[] export class AvailableRasterLayers { private static _editorLayerIndex: EditorLayerIndex = undefined - private static _editorLayerIndexStore: UIEventSource = new UIEventSource(undefined) + private static _editorLayerIndexStore: UIEventSource = + new UIEventSource(undefined) public static async editorLayerIndex(): Promise { - if(AvailableRasterLayers._editorLayerIndex !== undefined){ + if (AvailableRasterLayers._editorLayerIndex !== undefined) { return AvailableRasterLayers._editorLayerIndex } console.debug("Downloading ELI") - const eli = await Utils.downloadJson<{ features: EditorLayerIndex }>("./assets/data/editor-layer-index.json") - this._editorLayerIndex = eli.features.filter(l => l.properties.id !== "Bing") + const eli = await Utils.downloadJson<{ features: EditorLayerIndex }>( + "./assets/data/editor-layer-index.json" + ) + this._editorLayerIndex = eli.features.filter((l) => l.properties.id !== "Bing") this._editorLayerIndexStore.set(this._editorLayerIndex) return this._editorLayerIndex } - - public static globalLayers: RasterLayerPolygon[] = globallayers.layers .filter( (properties) => @@ -41,7 +41,7 @@ export class AvailableRasterLayers { geometry: BBox.global.asGeometry(), } ) - public static bing = bingJson + public static bing = bingJson public static readonly osmCartoProperties: RasterLayerProperties = { id: "osm", name: "OpenStreetMap", @@ -70,10 +70,14 @@ export class AvailableRasterLayers { return l.properties.id === "protomaps.sunny" }) - public static layersAvailableAt( location: Store<{ lon: number; lat: number }>, - enableBing?: Store): {store: Store } { - const store = {store: undefined} - Utils.AddLazyProperty(store, "store", () => AvailableRasterLayers._layersAvailableAt(location, enableBing)) + public static layersAvailableAt( + location: Store<{ lon: number; lat: number }>, + enableBing?: Store + ): { store: Store } { + const store = { store: undefined } + Utils.AddLazyProperty(store, "store", () => + AvailableRasterLayers._layersAvailableAt(location, enableBing) + ) return store } @@ -81,19 +85,19 @@ export class AvailableRasterLayers { location: Store<{ lon: number; lat: number }>, enableBing?: Store ): Store { - this.editorLayerIndex() // start the download const availableLayersBboxes = Stores.ListStabilized( - location.mapD((loc) => { - const eli = AvailableRasterLayers._editorLayerIndexStore.data - if(!eli){ - return [] - } - const lonlat: [number, number] = [loc.lon, loc.lat] - return eli.filter((eliPolygon) => - BBox.get(eliPolygon).contains(lonlat) - ) - }, [AvailableRasterLayers._editorLayerIndexStore]) + location.mapD( + (loc) => { + const eli = AvailableRasterLayers._editorLayerIndexStore.data + if (!eli) { + return [] + } + const lonlat: [number, number] = [loc.lon, loc.lat] + return eli.filter((eliPolygon) => BBox.get(eliPolygon).contains(lonlat)) + }, + [AvailableRasterLayers._editorLayerIndexStore] + ) ) return Stores.ListStabilized( availableLayersBboxes.map( @@ -126,7 +130,6 @@ export class AvailableRasterLayers { ) ) } - } export class RasterLayerUtils { diff --git a/src/Models/ThemeConfig/Conversion/Conversion.ts b/src/Models/ThemeConfig/Conversion/Conversion.ts index 9285659cd..d19519de1 100644 --- a/src/Models/ThemeConfig/Conversion/Conversion.ts +++ b/src/Models/ThemeConfig/Conversion/Conversion.ts @@ -84,7 +84,7 @@ export class Pipe extends Conversion { convert(json: TIn, context: ConversionContext): TOut { const r0 = this._step0.convert(json, context.inOperation(this._step0.name)) - if(context.hasErrors() && this._failfast){ + if (context.hasErrors() && this._failfast) { return undefined } return this._step1.convert(r0, context.inOperation(this._step1.name)) diff --git a/src/Models/ThemeConfig/Conversion/DetectMappingsWithImages.ts b/src/Models/ThemeConfig/Conversion/DetectMappingsWithImages.ts index 3821205cc..aa9f787fb 100644 --- a/src/Models/ThemeConfig/Conversion/DetectMappingsWithImages.ts +++ b/src/Models/ThemeConfig/Conversion/DetectMappingsWithImages.ts @@ -12,7 +12,7 @@ export class DetectMappingsWithImages extends DesugaringStep\` instead. The images found are ${images.join( - ", ", - )}. (This check can be turned of by adding "#": "${ignoreToken}" in the mapping, but this is discouraged`, + ", " + )}. (This check can be turned of by adding "#": "${ignoreToken}" in the mapping, but this is discouraged` ) } else { ctx.info( `Ignored image ${images.join( - ", ", - )} in 'then'-clause of a mapping as this check has been disabled`, + ", " + )} in 'then'-clause of a mapping as this check has been disabled` ) for (const image of images) { diff --git a/src/Models/ThemeConfig/Conversion/MiscTagRenderingChecks.ts b/src/Models/ThemeConfig/Conversion/MiscTagRenderingChecks.ts index 2392a8077..c37f2a4b7 100644 --- a/src/Models/ThemeConfig/Conversion/MiscTagRenderingChecks.ts +++ b/src/Models/ThemeConfig/Conversion/MiscTagRenderingChecks.ts @@ -1,7 +1,10 @@ import { DesugaringStep } from "./Conversion" import { TagRenderingConfigJson } from "../Json/TagRenderingConfigJson" import { LayerConfigJson } from "../Json/LayerConfigJson" -import { MappingConfigJson, QuestionableTagRenderingConfigJson } from "../Json/QuestionableTagRenderingConfigJson" +import { + MappingConfigJson, + QuestionableTagRenderingConfigJson, +} from "../Json/QuestionableTagRenderingConfigJson" import { ConversionContext } from "./ConversionContext" import { Translation } from "../../../UI/i18n/Translation" import NameSuggestionIndex from "../../../Logic/Web/NameSuggestionIndex" @@ -20,17 +23,17 @@ export class MiscTagRenderingChecks extends DesugaringStepwithout
the question, resulting in a weird phrasing in the information box", + "A mapping should not start with 'yes' or 'no'. If the attribute is known, it will only show 'yes' or 'no' without the question, resulting in a weird phrasing in the information box" ) } } } if (json["group"]) { - context.err("Groups are deprecated, use `\"label\": [\"" + json["group"] + "\"]` instead") + context.err('Groups are deprecated, use `"label": ["' + json["group"] + '"]` instead') } if (json["question"] && json.freeform?.key === undefined && json.mappings === undefined) { context.err( - "A question is defined, but no mappings nor freeform (key) are. Add at least one of them", + "A question is defined, but no mappings nor freeform (key) are. Add at least one of them" ) } if (json["question"] && !json.freeform && (json.mappings?.length ?? 0) == 1) { @@ -93,7 +96,7 @@ export class MiscTagRenderingChecks extends DesugaringStepjson.render) @@ -145,7 +148,7 @@ export class MiscTagRenderingChecks extends DesugaringStep txt.indexOf(`{${funcName}(${json.freeform.key}`) >= 0, + (funcName) => txt.indexOf(`{${funcName}(${json.freeform.key}`) >= 0 ) ) { continue @@ -169,7 +172,7 @@ export class MiscTagRenderingChecks extends DesugaringStep new Tag(t.key, t.value).asHumanString()).join(" ; "), + tags.map((t) => new Tag(t.key, t.value).asHumanString()).join(" ; ") ) } } else if (json.freeform.type === "nsi") { context .enters("freeform", "type") .warn( - "No need to explicitly set type to 'NSI', autodetected based on freeform type", + "No need to explicitly set type to 'NSI', autodetected based on freeform type" ) } } if (json.render && json["question"] && json.freeform === undefined) { context.err( `Detected a tagrendering which takes input without freeform key in ${context}; the question is ${new Translation( - json["question"], - ).textFor("en")}`, + json["question"] + ).textFor("en")}` ) } @@ -230,9 +233,9 @@ export class MiscTagRenderingChecks extends DesugaringStep { path: string, isBuiltin: boolean, doesImageExist: DoesImageExist, - studioValidations: boolean, + studioValidations: boolean ) { super("Runs various checks against common mistakes for a layer", [], "PrevalidateLayer") this._path = path @@ -50,7 +50,7 @@ export class PrevalidateLayer extends DesugaringStep { context .enter("source") .err( - "No source section is defined; please define one as data is not loaded otherwise", + "No source section is defined; please define one as data is not loaded otherwise" ) } else { if (json.source === "special" || json.source === "special:library") { @@ -58,7 +58,7 @@ export class PrevalidateLayer extends DesugaringStep { context .enters("source", "osmTags") .err( - "No osmTags defined in the source section - these should always be present, even for geojson layer", + "No osmTags defined in the source section - these should always be present, even for geojson layer" ) } else { const osmTags = TagUtils.Tag(json.source["osmTags"], context + "source.osmTags") @@ -67,7 +67,7 @@ export class PrevalidateLayer extends DesugaringStep { .enters("source", "osmTags") .err( "The source states tags which give a very wide selection: it only uses negative expressions, which will result in too much and unexpected data. Add at least one required tag. The tags are:\n\t" + - osmTags.asHumanString(false, false, {}), + osmTags.asHumanString(false, false, {}) ) } } @@ -93,10 +93,10 @@ export class PrevalidateLayer extends DesugaringStep { .enter("syncSelection") .err( "Invalid sync-selection: must be one of " + - LayerConfig.syncSelectionAllowed.map((v) => `'${v}'`).join(", ") + - " but got '" + - json.syncSelection + - "'", + LayerConfig.syncSelectionAllowed.map((v) => `'${v}'`).join(", ") + + " but got '" + + json.syncSelection + + "'" ) } if (json["pointRenderings"]?.length > 0) { @@ -115,7 +115,7 @@ export class PrevalidateLayer extends DesugaringStep { } json.pointRendering?.forEach((pr, i) => - this._validatePointRendering.convert(pr, context.enters("pointeRendering", i)), + this._validatePointRendering.convert(pr, context.enters("pointeRendering", i)) ) if (json["mapRendering"]) { @@ -132,8 +132,8 @@ export class PrevalidateLayer extends DesugaringStep { if (!Constants.priviliged_layers.find((x) => x == json.id)) { context.err( "Layer " + - json.id + - " uses 'special' as source.osmTags. However, this layer is not a priviliged layer", + json.id + + " uses 'special' as source.osmTags. However, this layer is not a priviliged layer" ) } } @@ -148,19 +148,19 @@ export class PrevalidateLayer extends DesugaringStep { context .enter("title") .err( - "This layer does not have a title defined but it does have tagRenderings. Not having a title will disable the popups, resulting in an unclickable element. Please add a title. If not having a popup is intended and the tagrenderings need to be kept (e.g. in a library layer), set `title: null` to disable this error.", + "This layer does not have a title defined but it does have tagRenderings. Not having a title will disable the popups, resulting in an unclickable element. Please add a title. If not having a popup is intended and the tagrenderings need to be kept (e.g. in a library layer), set `title: null` to disable this error." ) } if (json.title === null) { context.info( - "Title is `null`. This results in an element that cannot be clicked - even though tagRenderings is set.", + "Title is `null`. This results in an element that cannot be clicked - even though tagRenderings is set." ) } { // Check for multiple, identical builtin questions - usability for studio users const duplicates = Utils.Duplicates( - json.tagRenderings.filter((tr) => typeof tr === "string"), + json.tagRenderings.filter((tr) => typeof tr === "string") ) for (let i = 0; i < json.tagRenderings.length; i++) { const tagRendering = json.tagRenderings[i] @@ -190,7 +190,7 @@ export class PrevalidateLayer extends DesugaringStep { { // duplicate ids in tagrenderings check const duplicates = Utils.NoNull( - Utils.Duplicates(Utils.NoNull((json.tagRenderings ?? []).map((tr) => tr["id"]))), + Utils.Duplicates(Utils.NoNull((json.tagRenderings ?? []).map((tr) => tr["id"]))) ) if (duplicates.length > 0) { // It is tempting to add an index to this warning; however, due to labels the indices here might be different from the index in the tagRendering list @@ -198,11 +198,11 @@ export class PrevalidateLayer extends DesugaringStep { .enter("tagRenderings") .err( "Some tagrenderings have a duplicate id: " + - duplicates.join(", ") + - "\n" + - JSON.stringify( - json.tagRenderings.filter((tr) => duplicates.indexOf(tr["id"]) >= 0), - ), + duplicates.join(", ") + + "\n" + + JSON.stringify( + json.tagRenderings.filter((tr) => duplicates.indexOf(tr["id"]) >= 0) + ) ) } } @@ -235,8 +235,8 @@ export class PrevalidateLayer extends DesugaringStep { if (json["overpassTags"] !== undefined) { context.err( "Layer " + - json.id + - "still uses the old 'overpassTags'-format. Please use \"source\": {\"osmTags\": }' instead of \"overpassTags\": (note: this isn't your fault, the custom theme generator still spits out the old format)", + json.id + + 'still uses the old \'overpassTags\'-format. Please use "source": {"osmTags": }\' instead of "overpassTags": (note: this isn\'t your fault, the custom theme generator still spits out the old format)' ) } const forbiddenTopLevel = [ @@ -256,7 +256,7 @@ export class PrevalidateLayer extends DesugaringStep { } if (json["hideUnderlayingFeaturesMinPercentage"] !== undefined) { context.err( - "Layer " + json.id + " contains an old 'hideUnderlayingFeaturesMinPercentage'", + "Layer " + json.id + " contains an old 'hideUnderlayingFeaturesMinPercentage'" ) } @@ -273,9 +273,9 @@ export class PrevalidateLayer extends DesugaringStep { if (this._path != undefined && this._path.indexOf(expected) < 0) { context.err( "Layer is in an incorrect place. The path is " + - this._path + - ", but expected " + - expected, + this._path + + ", but expected " + + expected ) } } @@ -293,13 +293,13 @@ export class PrevalidateLayer extends DesugaringStep { .enter(["tagRenderings", ...emptyIndexes]) .err( `Some tagrendering-ids are empty or have an emtpy string; this is not allowed (at ${emptyIndexes.join( - ",", - )}])`, + "," + )}])` ) } const duplicateIds = Utils.Duplicates( - (json.tagRenderings ?? [])?.map((f) => f["id"]).filter((id) => id !== "questions"), + (json.tagRenderings ?? [])?.map((f) => f["id"]).filter((id) => id !== "questions") ) if (duplicateIds.length > 0 && !Utils.runningFromConsole) { context @@ -323,7 +323,7 @@ export class PrevalidateLayer extends DesugaringStep { if (json.tagRenderings !== undefined) { new On( "tagRenderings", - new Each(new ValidateTagRenderings(json, this._doesImageExist)), + new Each(new ValidateTagRenderings(json, this._doesImageExist)) ).convert(json, context) } @@ -350,7 +350,7 @@ export class PrevalidateLayer extends DesugaringStep { context .enters("pointRendering", i, "marker", indexM, "icon", "condition") .err( - "Don't set a condition in a marker as this will result in an invisible but clickable element. Use extra filters in the source instead.", + "Don't set a condition in a marker as this will result in an invisible but clickable element. Use extra filters in the source instead." ) } } @@ -388,9 +388,9 @@ export class PrevalidateLayer extends DesugaringStep { .enters("presets", i, "tags") .err( "This preset does not match the required tags of this layer. This implies that a newly added point will not show up.\n A newly created point will have properties: " + - tags.asHumanString(false, false, {}) + - "\n The required tags are: " + - baseTags.asHumanString(false, false, {}), + tags.asHumanString(false, false, {}) + + "\n The required tags are: " + + baseTags.asHumanString(false, false, {}) ) } } diff --git a/src/Models/ThemeConfig/Conversion/ValidateTagRenderings.ts b/src/Models/ThemeConfig/Conversion/ValidateTagRenderings.ts index ca2deef05..627b43340 100644 --- a/src/Models/ThemeConfig/Conversion/ValidateTagRenderings.ts +++ b/src/Models/ThemeConfig/Conversion/ValidateTagRenderings.ts @@ -26,7 +26,7 @@ export class ValidateTagRenderings extends Fuse { new On("question", new ValidatePossibleLinks()), new On("questionHint", new ValidatePossibleLinks()), new On("mappings", new Each(new On("then", new ValidatePossibleLinks()))), - new MiscTagRenderingChecks(layerConfig), + new MiscTagRenderingChecks(layerConfig) ) } } diff --git a/src/Models/ThemeConfig/Conversion/ValidateTheme.ts b/src/Models/ThemeConfig/Conversion/ValidateTheme.ts index 1747ff710..d5aee78bb 100644 --- a/src/Models/ThemeConfig/Conversion/ValidateTheme.ts +++ b/src/Models/ThemeConfig/Conversion/ValidateTheme.ts @@ -22,7 +22,7 @@ export class ValidateTheme extends DesugaringStep { doesImageExist: DoesImageExist, path: string, isBuiltin: boolean, - sharedTagRenderings?: Set, + sharedTagRenderings?: Set ) { super("Doesn't change anything, but emits warnings and errors", [], "ValidateTheme") this._validateImage = doesImageExist @@ -41,15 +41,15 @@ export class ValidateTheme extends DesugaringStep { if (json["units"] !== undefined) { context.err( "The theme " + - json.id + - " has units defined - these should be defined on the layer instead. (Hint: use overrideAll: { '+units': ... }) ", + json.id + + " has units defined - these should be defined on the layer instead. (Hint: use overrideAll: { '+units': ... }) " ) } if (json["roamingRenderings"] !== undefined) { context.err( "Theme " + - json.id + - " contains an old 'roamingRenderings'. Use an 'overrideAll' instead", + json.id + + " contains an old 'roamingRenderings'. Use an 'overrideAll' instead" ) } } @@ -67,10 +67,10 @@ export class ValidateTheme extends DesugaringStep { for (const remoteImage of remoteImages) { context.err( "Found a remote image: " + - remoteImage.path + - " in theme " + - json.id + - ", please download it.", + remoteImage.path + + " in theme " + + json.id + + ", please download it." ) } for (const image of images) { @@ -86,17 +86,17 @@ export class ValidateTheme extends DesugaringStep { const filename = this._path.substring( this._path.lastIndexOf("/") + 1, - this._path.length - 5, + this._path.length - 5 ) if (theme.id !== filename) { context.err( "Theme ids should be the same as the name.json, but we got id: " + - theme.id + - " and filename " + - filename + - " (" + - this._path + - ")", + theme.id + + " and filename " + + filename + + " (" + + this._path + + ")" ) } this._validateImage.convert(theme.icon, context.enter("icon")) @@ -104,13 +104,13 @@ export class ValidateTheme extends DesugaringStep { const dups = Utils.Duplicates(json.layers.map((layer) => layer["id"])) if (dups.length > 0) { context.err( - `The theme ${json.id} defines multiple layers with id ${dups.join(", ")}`, + `The theme ${json.id} defines multiple layers with id ${dups.join(", ")}` ) } if (json["mustHaveLanguage"] !== undefined) { new ValidateLanguageCompleteness(...json["mustHaveLanguage"]).convert( theme, - context, + context ) } if (!json.hideFromOverview && theme.id !== "personal" && this._isBuiltin) { @@ -118,7 +118,7 @@ export class ValidateTheme extends DesugaringStep { const targetLanguage = theme.title.SupportedLanguages()[0] if (targetLanguage !== "en") { context.err( - `TargetLanguage is not 'en' for public theme ${theme.id}, it is ${targetLanguage}. Move 'en' up in the title of the theme and set it as the first key`, + `TargetLanguage is not 'en' for public theme ${theme.id}, it is ${targetLanguage}. Move 'en' up in the title of the theme and set it as the first key` ) } diff --git a/src/Models/ThemeConfig/Conversion/ValidateThemeAndLayers.ts b/src/Models/ThemeConfig/Conversion/ValidateThemeAndLayers.ts index e4ffd2a0e..556f3f37d 100644 --- a/src/Models/ThemeConfig/Conversion/ValidateThemeAndLayers.ts +++ b/src/Models/ThemeConfig/Conversion/ValidateThemeAndLayers.ts @@ -9,7 +9,7 @@ export class ValidateThemeAndLayers extends Fuse { doesImageExist: DoesImageExist, path: string, isBuiltin: boolean, - sharedTagRenderings?: Set, + sharedTagRenderings?: Set ) { super( "Validates a theme and the contained layers", @@ -19,10 +19,10 @@ export class ValidateThemeAndLayers extends Fuse { new Each( new Bypass( (layer) => Constants.added_by_default.indexOf(layer.id) < 0, - new ValidateLayerConfig(undefined, isBuiltin, doesImageExist, false, true), - ), - ), - ), + new ValidateLayerConfig(undefined, isBuiltin, doesImageExist, false, true) + ) + ) + ) ) } } diff --git a/src/Models/ThemeConfig/Conversion/Validation.ts b/src/Models/ThemeConfig/Conversion/Validation.ts index bb5c12532..521547eac 100644 --- a/src/Models/ThemeConfig/Conversion/Validation.ts +++ b/src/Models/ThemeConfig/Conversion/Validation.ts @@ -28,7 +28,7 @@ export class ValidateLanguageCompleteness extends DesugaringStep { super( "Checks that the given object is fully translated in the specified languages", [], - "ValidateLanguageCompleteness", + "ValidateLanguageCompleteness" ) this._languages = languages ?? ["en"] } @@ -42,18 +42,18 @@ export class ValidateLanguageCompleteness extends DesugaringStep { .filter( (t) => t.tr.translations[neededLanguage] === undefined && - t.tr.translations["*"] === undefined, + t.tr.translations["*"] === undefined ) .forEach((missing) => { context .enter(missing.context.split(".")) .err( `The theme ${obj.id} should be translation-complete for ` + - neededLanguage + - ", but it lacks a translation for " + - missing.context + - ".\n\tThe known translation is " + - missing.tr.textFor("en"), + neededLanguage + + ", but it lacks a translation for " + + missing.context + + ".\n\tThe known translation is " + + missing.tr.textFor("en") ) }) } @@ -70,7 +70,7 @@ export class DoesImageExist extends DesugaringStep { constructor( knownImagePaths: Set, checkExistsSync: (path: string) => boolean = undefined, - ignore?: Set, + ignore?: Set ) { super("Checks if an image exists", [], "DoesImageExist") this._ignore = ignore @@ -106,15 +106,15 @@ export class DoesImageExist extends DesugaringStep { if (!this._knownImagePaths.has(image)) { if (this.doesPathExist === undefined) { context.err( - `Image with path ${image} not found or not attributed; it is used in ${context}`, + `Image with path ${image} not found or not attributed; it is used in ${context}` ) } else if (!this.doesPathExist(image)) { context.err( - `Image with path ${image} does not exist.\n Check for typo's and missing directories in the path.`, + `Image with path ${image} does not exist.\n Check for typo's and missing directories in the path.` ) } else { context.err( - `Image with path ${image} is not attributed (but it exists); execute 'npm run query:licenses' to add the license information and/or run 'npm run generate:licenses' to compile all the license info`, + `Image with path ${image} is not attributed (but it exists); execute 'npm run query:licenses' to add the license information and/or run 'npm run generate:licenses' to compile all the license info` ) } } @@ -127,7 +127,7 @@ class OverrideShadowingCheck extends DesugaringStep { super( "Checks that an 'overrideAll' does not override a single override", [], - "OverrideShadowingCheck", + "OverrideShadowingCheck" ) } @@ -174,7 +174,11 @@ class MiscThemeChecks extends DesugaringStep { context.err("The theme " + json.id + " has no 'layers' defined") } if (!Array.isArray(json.layers)) { - context.enter("layers").err("The 'layers'-field should be an array, but it is not. Did you pase a layer identifier and forget to add the '[' and ']'?") + context + .enter("layers") + .err( + "The 'layers'-field should be an array, but it is not. Did you pase a layer identifier and forget to add the '[' and ']'?" + ) } if (json.socialImage === "") { context.warn("Social image for theme " + json.id + " is the emtpy string") @@ -183,9 +187,9 @@ class MiscThemeChecks extends DesugaringStep { context.warn("Obsolete field `clustering` is still around") } - if(json.layers === undefined){ + if (json.layers === undefined) { context.err("This theme has no layers defined") - }else{ + } else { for (let i = 0; i < json.layers.length; i++) { const l = json.layers[i] if (l["override"]?.["source"] === undefined) { @@ -207,7 +211,7 @@ class MiscThemeChecks extends DesugaringStep { context .enter("overideAll") .err( - "'overrideAll' is spelled with _two_ `r`s. You only wrote a single one of them.", + "'overrideAll' is spelled with _two_ `r`s. You only wrote a single one of them." ) } return json @@ -219,7 +223,7 @@ export class PrevalidateTheme extends Fuse { super( "Various consistency checks on the raw JSON", new MiscThemeChecks(), - new OverrideShadowingCheck(), + new OverrideShadowingCheck() ) } } @@ -229,7 +233,7 @@ export class DetectConflictingAddExtraTags extends DesugaringStep ["_abc"] */ private static extractCalculatedTagNames( - layerConfig?: LayerConfigJson | { calculatedTags: string[] }, + layerConfig?: LayerConfigJson | { calculatedTags: string[] } ) { return ( layerConfig?.calculatedTags?.map((ct) => { @@ -529,16 +533,16 @@ export class DetectShadowedMappings extends DesugaringStep does have `rel='noopener'` set", [], - "ValidatePossibleLinks", + "ValidatePossibleLinks" ) } @@ -593,21 +597,21 @@ export class ValidatePossibleLinks extends DesugaringStep, - context: ConversionContext, + context: ConversionContext ): string | Record { if (typeof json === "string") { if (this.isTabnabbingProne(json)) { context.err( "The string " + - json + - " has a link targeting `_blank`, but it doesn't have `rel='noopener'` set. This gives rise to reverse tabnapping", + json + + " has a link targeting `_blank`, but it doesn't have `rel='noopener'` set. This gives rise to reverse tabnapping" ) } } else { for (const k in json) { if (this.isTabnabbingProne(json[k])) { context.err( - `The translation for ${k} '${json[k]}' has a link targeting \`_blank\`, but it doesn't have \`rel='noopener'\` set. This gives rise to reverse tabnapping`, + `The translation for ${k} '${json[k]}' has a link targeting \`_blank\`, but it doesn't have \`rel='noopener'\` set. This gives rise to reverse tabnapping` ) } } @@ -625,7 +629,7 @@ export class CheckTranslation extends DesugaringStep { super( "Checks that a translation is valid and internally consistent", ["*"], - "CheckTranslation", + "CheckTranslation" ) this._allowUndefined = allowUndefined } @@ -672,7 +676,7 @@ export class ValidateLayerConfig extends DesugaringStep { isBuiltin: boolean, doesImageExist: DoesImageExist, studioValidations: boolean = false, - skipDefaultLayers: boolean = false, + skipDefaultLayers: boolean = false ) { super("Thin wrapper around 'ValidateLayer", [], "ValidateLayerConfig") this.validator = new ValidateLayer( @@ -680,7 +684,7 @@ export class ValidateLayerConfig extends DesugaringStep { isBuiltin, doesImageExist, studioValidations, - skipDefaultLayers, + skipDefaultLayers ) } @@ -708,7 +712,7 @@ export class ValidatePointRendering extends DesugaringStep { .enters("fields", i) .err( `Invalid filter: ${type} is not a valid textfield type.\n\tTry one of ${Array.from( - Validators.availableTypes, - ).join(",")}`, + Validators.availableTypes + ).join(",")}` ) } } @@ -884,13 +888,13 @@ export class DetectDuplicateFilters extends DesugaringStep<{ super( "Tries to detect layers where a shared filter can be used (or where similar filters occur)", [], - "DetectDuplicateFilters", + "DetectDuplicateFilters" ) } convert( json: { layers: LayerConfigJson[]; themes: LayoutConfigJson[] }, - context: ConversionContext, + context: ConversionContext ): { layers: LayerConfigJson[]; themes: LayoutConfigJson[] } { const { layers, themes } = json const perOsmTag = new Map< @@ -954,7 +958,7 @@ export class DetectDuplicateFilters extends DesugaringStep<{ filter: FilterConfigJson }[] >, - layout?: LayoutConfigJson | undefined, + layout?: LayoutConfigJson | undefined ): void { if (layer.filter === undefined || layer.filter === null) { return @@ -994,7 +998,7 @@ export class DetectDuplicatePresets extends DesugaringStep { super( "Detects mappings which have identical (english) names or identical mappings.", ["presets"], - "DetectDuplicatePresets", + "DetectDuplicatePresets" ) } @@ -1005,13 +1009,13 @@ export class DetectDuplicatePresets extends DesugaringStep { if (new Set(enNames).size != enNames.length) { const dups = Utils.Duplicates(enNames) const layersWithDup = json.layers.filter((l) => - l.presets.some((p) => dups.indexOf(p.title.textFor("en")) >= 0), + l.presets.some((p) => dups.indexOf(p.title.textFor("en")) >= 0) ) const layerIds = layersWithDup.map((l) => l.id) context.err( `This theme has multiple presets which are named:${dups}, namely layers ${layerIds.join( - ", ", - )} this is confusing for contributors and is probably the result of reusing the same layer multiple times. Use \`{"override": {"=presets": []}}\` to remove some presets`, + ", " + )} this is confusing for contributors and is probably the result of reusing the same layer multiple times. Use \`{"override": {"=presets": []}}\` to remove some presets` ) } @@ -1026,17 +1030,17 @@ export class DetectDuplicatePresets extends DesugaringStep { Utils.SameObject(presetATags, presetBTags) && Utils.sameList( presetA.preciseInput.snapToLayers, - presetB.preciseInput.snapToLayers, + presetB.preciseInput.snapToLayers ) ) { context.err( `This theme has multiple presets with the same tags: ${presetATags.asHumanString( false, false, - {}, + {} )}, namely the preset '${presets[i].title.textFor("en")}' and '${presets[ j - ].title.textFor("en")}'`, + ].title.textFor("en")}'` ) } } @@ -1061,13 +1065,13 @@ export class ValidateThemeEnsemble extends Conversion< super( "Validates that all themes together are logical, i.e. no duplicate ids exists within (overriden) themes", [], - "ValidateThemeEnsemble", + "ValidateThemeEnsemble" ) } convert( json: LayoutConfig[], - context: ConversionContext, + context: ConversionContext ): Map< string, { @@ -1118,11 +1122,11 @@ export class ValidateThemeEnsemble extends Conversion< context.err( [ "The layer with id '" + - id + - "' is found in multiple themes with different tag definitions:", + id + + "' is found in multiple themes with different tag definitions:", "\t In theme " + oldTheme + ":\t" + oldTags.asHumanString(false, false, {}), "\tIn theme " + theme.id + ":\t" + tags.asHumanString(false, false, {}), - ].join("\n"), + ].join("\n") ) } } diff --git a/src/Models/ThemeConfig/LayoutConfig.ts b/src/Models/ThemeConfig/LayoutConfig.ts index 0c3bf8a49..dc3d3534b 100644 --- a/src/Models/ThemeConfig/LayoutConfig.ts +++ b/src/Models/ThemeConfig/LayoutConfig.ts @@ -338,7 +338,7 @@ export default class LayoutConfig implements LayoutInformation { ...json, layers: json.layers.filter((l) => l["id"] !== "favourite"), } - const usedImages =json._usedImages + const usedImages = json._usedImages usedImages.sort() this.usedImages = Utils.Dedup(usedImages) diff --git a/src/Models/ThemeConfig/TagRenderingConfig.ts b/src/Models/ThemeConfig/TagRenderingConfig.ts index 4002f3df3..d83939e7d 100644 --- a/src/Models/ThemeConfig/TagRenderingConfig.ts +++ b/src/Models/ThemeConfig/TagRenderingConfig.ts @@ -963,7 +963,7 @@ export class TagRenderingConfigUtils { tags, country.split(";"), center, - {sortByFrequency: true} + { sortByFrequency: true } ) ) }) diff --git a/src/Models/ThemeViewState.ts b/src/Models/ThemeViewState.ts index 6960f938a..2fb45b381 100644 --- a/src/Models/ThemeViewState.ts +++ b/src/Models/ThemeViewState.ts @@ -2,7 +2,11 @@ import LayoutConfig from "./ThemeConfig/LayoutConfig" import { SpecialVisualizationState } from "../UI/SpecialVisualization" import { Changes } from "../Logic/Osm/Changes" import { Store, UIEventSource } from "../Logic/UIEventSource" -import { FeatureSource, IndexedFeatureSource, WritableFeatureSource } from "../Logic/FeatureSource/FeatureSource" +import { + FeatureSource, + IndexedFeatureSource, + WritableFeatureSource, +} from "../Logic/FeatureSource/FeatureSource" import { OsmConnection } from "../Logic/Osm/OsmConnection" import { ExportableMap, MapProperties } from "./MapProperties" import LayerState from "../Logic/State/LayerState" @@ -46,7 +50,9 @@ import BackgroundLayerResetter from "../Logic/Actors/BackgroundLayerResetter" import SaveFeatureSourceToLocalStorage from "../Logic/FeatureSource/Actors/SaveFeatureSourceToLocalStorage" import BBoxFeatureSource from "../Logic/FeatureSource/Sources/TouchesBboxFeatureSource" import ThemeViewStateHashActor from "../Logic/Web/ThemeViewStateHashActor" -import NoElementsInViewDetector, { FeatureViewState } from "../Logic/Actors/NoElementsInViewDetector" +import NoElementsInViewDetector, { + FeatureViewState, +} from "../Logic/Actors/NoElementsInViewDetector" import FilteredLayer from "./FilteredLayer" import { PreferredRasterLayerSelector } from "../Logic/Actors/PreferredRasterLayerSelector" import { ImageUploadManager } from "../Logic/ImageProviders/ImageUploadManager" @@ -155,7 +161,7 @@ export default class ThemeViewState implements SpecialVisualizationState { this.featureSwitches = new FeatureSwitchState(layout) this.guistate = new MenuState( this.featureSwitches.featureSwitchWelcomeMessage.data, - layout.id, + layout.id ) this.map = new UIEventSource(undefined) const geolocationState = new GeoLocationState() @@ -171,14 +177,14 @@ export default class ThemeViewState implements SpecialVisualizationState { oauth_token: QueryParameters.GetQueryParameter( "oauth_token", undefined, - "Used to complete the login", + "Used to complete the login" ), }) this.userRelatedState = new UserRelatedState( this.osmConnection, layout, this.featureSwitches, - this.mapProperties, + this.mapProperties ) this.userRelatedState.fixateNorth.addCallbackAndRunD((fixated) => { this.mapProperties.allowRotating.setData(fixated !== "yes") @@ -189,20 +195,20 @@ export default class ThemeViewState implements SpecialVisualizationState { geolocationState, this.selectedElement, this.mapProperties, - this.userRelatedState.gpsLocationHistoryRetentionTime, + this.userRelatedState.gpsLocationHistoryRetentionTime ) this.geolocationControl = new GeolocationControlState(this.geolocation, this.mapProperties) this.availableLayers = AvailableRasterLayers.layersAvailableAt( this.mapProperties.location, - this.osmConnection.isLoggedIn, + this.osmConnection.isLoggedIn ) this.layerState = new LayerState( this.osmConnection, layout.layers, layout.id, - this.featureSwitches.featureSwitchLayerDefault, + this.featureSwitches.featureSwitchLayerDefault ) { @@ -211,7 +217,7 @@ export default class ThemeViewState implements SpecialVisualizationState { const isDisplayed = QueryParameters.GetBooleanQueryParameter( "overlay-" + rasterInfo.id, rasterInfo.defaultState ?? true, - "Whether or not overlay layer " + rasterInfo.id + " is shown", + "Whether or not overlay layer " + rasterInfo.id + " is shown" ) const state = { isDisplayed } overlayLayerStates.set(rasterInfo.id, state) @@ -236,7 +242,7 @@ export default class ThemeViewState implements SpecialVisualizationState { this.osmConnection.Backend(), (id) => this.layerState.filteredLayers.get(id).isDisplayed, mvtAvailableLayers, - this.fullNodeDatabase, + this.fullNodeDatabase ) let currentViewIndex = 0 @@ -254,7 +260,7 @@ export default class ThemeViewState implements SpecialVisualizationState { id: "current_view_" + currentViewIndex, }), ] - }), + }) ) this.featuresInView = new BBoxFeatureSource(layoutSource, this.mapProperties.bounds) @@ -272,19 +278,19 @@ export default class ThemeViewState implements SpecialVisualizationState { featureSwitches: this.featureSwitches, }, layout?.isLeftRightSensitive() ?? false, - (e) => this.reportError(e), + (e) => this.reportError(e) ) this.historicalUserLocations = this.geolocation.historicalUserLocations this.newFeatures = new NewGeometryFromChangesFeatureSource( this.changes, layoutSource, - this.featureProperties, + this.featureProperties ) layoutSource.addSource(this.newFeatures) const perLayer = new PerLayerFeatureSourceSplitter( Array.from(this.layerState.filteredLayers.values()).filter( - (l) => l.layerDef?.source !== null, + (l) => l.layerDef?.source !== null ), new ChangeGeometryApplicator(this.indexedFeatures, this.changes), { @@ -295,10 +301,10 @@ export default class ThemeViewState implements SpecialVisualizationState { "Got ", features.length, "leftover features, such as", - features[0].properties, + features[0].properties ) }, - }, + } ) this.perLayer = perLayer.perLayer } @@ -338,12 +344,12 @@ export default class ThemeViewState implements SpecialVisualizationState { this.lastClickObject = new LastClickFeatureSource( this.layout, this.mapProperties.lastClickLocation, - this.userRelatedState.addNewFeatureMode, + this.userRelatedState.addNewFeatureMode ) this.osmObjectDownloader = new OsmObjectDownloader( this.osmConnection.Backend(), - this.changes, + this.changes ) this.perLayerFiltered = this.showNormalDataOn(this.map) @@ -354,7 +360,7 @@ export default class ThemeViewState implements SpecialVisualizationState { currentZoom: this.mapProperties.zoom, layerState: this.layerState, bounds: this.visualFeedbackViewportBounds, - }, + } ) this.hasDataInView = new NoElementsInViewDetector(this).hasFeatureInView this.imageUploadManager = new ImageUploadManager( @@ -362,7 +368,7 @@ export default class ThemeViewState implements SpecialVisualizationState { Imgur.singleton, this.featureProperties, this.osmConnection, - this.changes, + this.changes ) this.favourites = new FavouritesFeatureSource(this) const longAgo = new Date() @@ -408,7 +414,7 @@ export default class ThemeViewState implements SpecialVisualizationState { LayoutSource.fromCacheZoomLevel, fs, this.featureProperties, - fs.layer.layerDef.maxAgeOfCache, + fs.layer.layerDef.maxAgeOfCache ) toLocalStorage.set(layerId, storage) }) @@ -421,7 +427,7 @@ export default class ThemeViewState implements SpecialVisualizationState { const doShowLayer = this.mapProperties.zoom.map( (z) => (fs.layer.isDisplayed?.data ?? true) && z >= (fs.layer.layerDef?.minzoom ?? 0), - [fs.layer.isDisplayed], + [fs.layer.isDisplayed] ) if (!doShowLayer.data && this.featureSwitches.featureSwitchFilter.data === false) { @@ -438,7 +444,7 @@ export default class ThemeViewState implements SpecialVisualizationState { fs.layer, fs, (id) => this.featureProperties.getStore(id), - this.layerState.globalFilters, + this.layerState.globalFilters ) filteringFeatureSource.set(layerName, filtered) @@ -582,7 +588,7 @@ export default class ThemeViewState implements SpecialVisualizationState { return } this.selectClosestAtCenter(0) - }, + } ) for (let i = 1; i < 9; i++) { @@ -600,7 +606,7 @@ export default class ThemeViewState implements SpecialVisualizationState { onUp: true, }, doc, - () => this.selectClosestAtCenter(i - 1), + () => this.selectClosestAtCenter(i - 1) ) } @@ -617,7 +623,7 @@ export default class ThemeViewState implements SpecialVisualizationState { if (this.featureSwitches.featureSwitchBackgroundSelection.data) { this.guistate.backgroundLayerSelectionIsOpened.setData(true) } - }, + } ) Hotkeys.RegisterHotkey( { @@ -629,60 +635,57 @@ export default class ThemeViewState implements SpecialVisualizationState { if (this.featureSwitches.featureSwitchFilter.data) { this.guistate.openFilterView() } - }, + } ) Hotkeys.RegisterHotkey( { shift: "O" }, Translations.t.hotkeyDocumentation.selectMapnik, () => { this.mapProperties.rasterLayer.setData(AvailableRasterLayers.osmCarto) - }, + } ) const setLayerCategory = (category: EliCategory) => { const timeOfCall = new Date() - const available = this.availableLayers.store.addCallbackAndRunD( - available => { - const now = new Date() - const timeDiff= (now.getTime() - timeOfCall.getTime()) / 1000 - if(timeDiff > 3){ - return true // unregister - } - const current = this.mapProperties.rasterLayer - const best = RasterLayerUtils.SelectBestLayerAccordingTo( - available, - category, - current.data, - ) - console.log("Best layer for category", category, "is", best.properties.id) - current.setData(best) - - }, - ) + const available = this.availableLayers.store.addCallbackAndRunD((available) => { + const now = new Date() + const timeDiff = (now.getTime() - timeOfCall.getTime()) / 1000 + if (timeDiff > 3) { + return true // unregister + } + const current = this.mapProperties.rasterLayer + const best = RasterLayerUtils.SelectBestLayerAccordingTo( + available, + category, + current.data + ) + console.log("Best layer for category", category, "is", best.properties.id) + current.setData(best) + }) } Hotkeys.RegisterHotkey( { nomod: "O" }, Translations.t.hotkeyDocumentation.selectOsmbasedmap, - () => setLayerCategory("osmbasedmap"), + () => setLayerCategory("osmbasedmap") ) Hotkeys.RegisterHotkey( { nomod: "M" }, Translations.t.hotkeyDocumentation.selectMap, - () => setLayerCategory("map"), + () => setLayerCategory("map") ) Hotkeys.RegisterHotkey( { nomod: "P" }, Translations.t.hotkeyDocumentation.selectAerial, - () => setLayerCategory("photo"), + () => setLayerCategory("photo") ) Hotkeys.RegisterHotkey( { nomod: "L" }, Translations.t.hotkeyDocumentation.geolocate, () => { this.geolocationControl.handleClick() - }, + } ) return true }) @@ -694,7 +697,7 @@ export default class ThemeViewState implements SpecialVisualizationState { Translations.t.hotkeyDocumentation.translationMode, () => { Locale.showLinkToWeblate.setData(!Locale.showLinkToWeblate.data) - }, + } ) } @@ -705,7 +708,7 @@ export default class ThemeViewState implements SpecialVisualizationState { const normalLayers = this.layout.layers.filter( (l) => Constants.priviliged_layers.indexOf(l.id) < 0 && - !l.id.startsWith("note_import"), + !l.id.startsWith("note_import") ) const maxzoom = Math.min(...normalLayers.map((l) => l.minzoom)) @@ -713,7 +716,7 @@ export default class ThemeViewState implements SpecialVisualizationState { (l) => Constants.priviliged_layers.indexOf(l.id) < 0 && l.source.geojsonSource === undefined && - l.doCount, + l.doCount ) const summaryTileSource = new SummaryTileSource( Constants.SummaryServer, @@ -722,7 +725,7 @@ export default class ThemeViewState implements SpecialVisualizationState { this.mapProperties, { isActive: this.mapProperties.zoom.map((z) => z < maxzoom), - }, + } ) return new SummaryTileSourceRewriter(summaryTileSource, this.layerState.filteredLayers) @@ -743,12 +746,12 @@ export default class ThemeViewState implements SpecialVisualizationState { gps_location_history: this.geolocation.historicalUserLocations, gps_track: this.geolocation.historicalUserLocationsTrack, selected_element: new StaticFeatureSource( - this.selectedElement.map((f) => (f === undefined ? empty : [f])), + this.selectedElement.map((f) => (f === undefined ? empty : [f])) ), range: new StaticFeatureSource( this.mapProperties.maxbounds.map((bbox) => - bbox === undefined ? empty : [bbox.asGeoJson({ id: "range" })], - ), + bbox === undefined ? empty : [bbox.asGeoJson({ id: "range" })] + ) ), current_view: this.currentView, favourite: this.favourites, @@ -763,7 +766,7 @@ export default class ThemeViewState implements SpecialVisualizationState { ShowDataLayer.showRange( this.map, new StaticFeatureSource([bbox.asGeoJson({ id: "range" })]), - this.featureSwitches.featureSwitchIsTesting, + this.featureSwitches.featureSwitchIsTesting ) } const currentViewLayer = this.layout.layers.find((l) => l.id === "current_view") @@ -777,7 +780,7 @@ export default class ThemeViewState implements SpecialVisualizationState { currentViewLayer, this.layout, this.osmObjectDownloader, - this.featureProperties, + this.featureProperties ) }) } @@ -821,20 +824,20 @@ export default class ThemeViewState implements SpecialVisualizationState { const lastClickLayerConfig = new LayerConfig( last_click_layerconfig, - "last_click", + "last_click" ) const lastClickFiltered = lastClickLayerConfig.isShown === undefined ? specialLayers.last_click : specialLayers.last_click.features.mapD((fs) => - fs.filter((f) => { - const matches = lastClickLayerConfig.isShown.matchesProperties( - f.properties, - ) - console.debug("LastClick ", f, "matches", matches) - return matches - }), - ) + fs.filter((f) => { + const matches = lastClickLayerConfig.isShown.matchesProperties( + f.properties + ) + console.debug("LastClick ", f, "matches", matches) + return matches + }) + ) new ShowDataLayer(this.map, { features: new StaticFeatureSource(lastClickFiltered), layer: lastClickLayerConfig, @@ -881,7 +884,7 @@ export default class ThemeViewState implements SpecialVisualizationState { this.mapProperties.rasterLayer, this.availableLayers, this.featureSwitches.backgroundLayerId, - this.userRelatedState.preferredBackgroundLayer, + this.userRelatedState.preferredBackgroundLayer ) } @@ -897,7 +900,7 @@ export default class ThemeViewState implements SpecialVisualizationState { ? ">>> _Not_ reporting error to report server as testmode is on" : ">>> Reporting error to", Constants.ErrorReportServer, - message, + message ) if (isTesting) { return diff --git a/src/UI/Base/DynLink.svelte b/src/UI/Base/DynLink.svelte index 10477b91f..9337a5ff6 100644 --- a/src/UI/Base/DynLink.svelte +++ b/src/UI/Base/DynLink.svelte @@ -21,7 +21,7 @@ class={$classnames} > {#if $icon} - - {/if} + + {/if} {@html $text} diff --git a/src/UI/Base/Img.ts b/src/UI/Base/Img.ts index fcc413ec0..d566c44f2 100644 --- a/src/UI/Base/Img.ts +++ b/src/UI/Base/Img.ts @@ -2,7 +2,7 @@ import { Utils } from "../../Utils" import BaseUIElement from "../BaseUIElement" /** * @deprecated -*/ + */ export default class Img extends BaseUIElement { private readonly _src: string private readonly _rawSvg: boolean diff --git a/src/UI/Base/MapControlButton.svelte b/src/UI/Base/MapControlButton.svelte index 610d864be..e9349c34a 100644 --- a/src/UI/Base/MapControlButton.svelte +++ b/src/UI/Base/MapControlButton.svelte @@ -12,14 +12,13 @@ export let cls = "m-0.5 p-0.5 sm:p-1 md:m-1" export let enabled: Store = new ImmutableStore(true) export let arialabel: Translation = undefined - export let arialabelDynamic : Store = new ImmutableStore(arialabel) - let arialabelString = arialabelDynamic.bind(tr => tr?.current) + export let arialabelDynamic: Store = new ImmutableStore(arialabel) + let arialabelString = arialabelDynamic.bind((tr) => tr?.current) export let htmlElem: UIEventSource = undefined let _htmlElem: HTMLElement $: { htmlElem?.setData(_htmlElem) } -
    - {#each $pending as pending}
  • - {#if pending.changes !== undefined} - Create {pending.type}/{pending.id} {JSON.stringify(TagUtils.KVObjtoProperties(pending.tags))} + Create {pending.type}/{pending.id} + {JSON.stringify(TagUtils.KVObjtoProperties(pending.tags))} {:else} Modify {pending.type}/{pending.id} {JSON.stringify(pending.tags)} {/if} {#if pending.type === "way" && pending.changes?.nodes} {pending.changes.nodes.join(" ")} {/if} -
  • {/each}
- {/if} - - diff --git a/src/UI/BigComponents/SelectedElementView.svelte b/src/UI/BigComponents/SelectedElementView.svelte index 096323a48..62a2f6d2f 100644 --- a/src/UI/BigComponents/SelectedElementView.svelte +++ b/src/UI/BigComponents/SelectedElementView.svelte @@ -17,11 +17,11 @@ export let highlightedRendering: UIEventSource = undefined export let tags: UIEventSource> = state?.featureProperties?.getStore( - selectedElement.properties.id, + selectedElement.properties.id ) let isAddNew = tags.mapD( - (t) => t?.id?.startsWith(LastClickFeatureSource.newPointElementId) ?? false, + (t) => t?.id?.startsWith(LastClickFeatureSource.newPointElementId) ?? false ) export let layer: LayerConfig @@ -32,29 +32,32 @@ onDestroy( state.userRelatedState.preferencesAsTags.addCallbackAndRun((tags) => { _metatags = tags - }), + }) ) } let knownTagRenderings: Store = tags.mapD((tgs) => - layer?.tagRenderings?.filter( - (config) => { - if (mustMatchLabels !== undefined) { - if (!mustMatchLabels.has(config.id) && !config?.labels?.some(l => mustMatchLabels.has(l))) { - return false - } - } else if (dontMatchLabels) { - if (dontMatchLabels.has(config.id) || config?.labels?.some(l => dontMatchLabels.has(l))) { - return false - } - } - if (!config.IsKnown(tgs)) { + layer?.tagRenderings?.filter((config) => { + if (mustMatchLabels !== undefined) { + if ( + !mustMatchLabels.has(config.id) && + !config?.labels?.some((l) => mustMatchLabels.has(l)) + ) { return false } - return (config.condition?.matchesProperties(tgs) ?? true) && - (config.metacondition?.matchesProperties({ ...tgs, ..._metatags }) ?? true) - }, - ), + } else if (dontMatchLabels) { + if (dontMatchLabels.has(config.id) || config?.labels?.some((l) => dontMatchLabels.has(l))) { + return false + } + } + if (!config.IsKnown(tgs)) { + return false + } + return ( + (config.condition?.matchesProperties(tgs) ?? true) && + (config.metacondition?.matchesProperties({ ...tgs, ..._metatags }) ?? true) + ) + }) ) diff --git a/src/UI/BigComponents/ShareScreen.svelte b/src/UI/BigComponents/ShareScreen.svelte index 87cae1ccd..cd17c4a8c 100644 --- a/src/UI/BigComponents/ShareScreen.svelte +++ b/src/UI/BigComponents/ShareScreen.svelte @@ -123,7 +123,7 @@
- +
diff --git a/src/UI/BigComponents/ThemeIntroPanel.svelte b/src/UI/BigComponents/ThemeIntroPanel.svelte index e4d611ca3..06404839f 100644 --- a/src/UI/BigComponents/ThemeIntroPanel.svelte +++ b/src/UI/BigComponents/ThemeIntroPanel.svelte @@ -78,9 +78,12 @@
- - diff --git a/src/UI/Flowbite/AccordionSingle.svelte b/src/UI/Flowbite/AccordionSingle.svelte index da4d90143..5857cb1e9 100644 --- a/src/UI/Flowbite/AccordionSingle.svelte +++ b/src/UI/Flowbite/AccordionSingle.svelte @@ -6,7 +6,7 @@ - +
diff --git a/src/UI/Input/Toggle.ts b/src/UI/Input/Toggle.ts index c37b1c27d..c4cf238ba 100644 --- a/src/UI/Input/Toggle.ts +++ b/src/UI/Input/Toggle.ts @@ -17,7 +17,6 @@ export default class Toggle extends VariableUiElement { super(isEnabled?.map((isEnabled) => (isEnabled ? showEnabled : showDisabled))) this.isEnabled = isEnabled } - } /** @@ -34,5 +33,4 @@ export class ClickableToggle extends Toggle { super(showEnabled, showDisabled, isEnabled) this.isEnabled = isEnabled } - } diff --git a/src/UI/Map/Icon.svelte b/src/UI/Map/Icon.svelte index 2fa9d5145..12f4eb58f 100644 --- a/src/UI/Map/Icon.svelte +++ b/src/UI/Map/Icon.svelte @@ -148,7 +148,7 @@ {:else if Utils.isEmoji(icon)} - {icon} + {icon} {:else} diff --git a/src/UI/Map/RasterLayerHandler.ts b/src/UI/Map/RasterLayerHandler.ts index 2dfa3de6f..2a2108d1e 100644 --- a/src/UI/Map/RasterLayerHandler.ts +++ b/src/UI/Map/RasterLayerHandler.ts @@ -22,7 +22,7 @@ class SingleBackgroundHandler { constructor( map: Store, targetLayer: RasterLayerPolygon, - background: UIEventSource, + background: UIEventSource ) { this._targetLayer = targetLayer this._map = map @@ -57,10 +57,9 @@ class SingleBackgroundHandler { "Removing raster layer", this._targetLayer.properties.id, "map moved and not been used for", - SingleBackgroundHandler.DEACTIVATE_AFTER, + SingleBackgroundHandler.DEACTIVATE_AFTER ) try { - if (map.getLayer(this._targetLayer.properties.id)) { map.removeLayer(this._targetLayer.properties.id) } @@ -157,7 +156,7 @@ class SingleBackgroundHandler { "raster-opacity": 0, }, }, - addLayerBeforeId, + addLayerBeforeId ) this.opacity.addCallbackAndRun((o) => { try { @@ -175,14 +174,14 @@ class SingleBackgroundHandler { private fadeOut() { Stores.Chronic( 8, - () => this.opacity.data > 0 && this._deactivationTime !== undefined, + () => this.opacity.data > 0 && this._deactivationTime !== undefined ).addCallback((_) => this.opacity.setData(Math.max(0, this.opacity.data - this.fadeStep))) } private fadeIn() { Stores.Chronic( 8, - () => this.opacity.data < 1.0 && this._deactivationTime === undefined, + () => this.opacity.data < 1.0 && this._deactivationTime === undefined ).addCallback((_) => this.opacity.setData(Math.min(1.0, this.opacity.data + this.fadeStep))) } } @@ -200,7 +199,7 @@ export default class RasterLayerHandler { } public static prepareSource( - layer: RasterLayerProperties, + layer: RasterLayerProperties ): RasterSourceSpecification | VectorSourceSpecification { if (layer.type === "vector") { const vs: VectorSourceSpecification = { diff --git a/src/UI/Map/RasterLayerOverview.svelte b/src/UI/Map/RasterLayerOverview.svelte index 286470328..86c6e007b 100644 --- a/src/UI/Map/RasterLayerOverview.svelte +++ b/src/UI/Map/RasterLayerOverview.svelte @@ -14,7 +14,7 @@ import TitledPanel from "../Base/TitledPanel.svelte" import Loading from "../Base/Loading.svelte" - export let availableLayers: {store: Store} + export let availableLayers: { store: Store } export let mapproperties: MapProperties export let userstate: UserRelatedState export let map: Store @@ -35,7 +35,7 @@ function availableForCategory(type: CategoryType): Store { const keywords = categories[type] return _availableLayers.mapD((available) => - available.filter((layer) => keywords.indexOf(layer.properties.category) >= 0), + available.filter((layer) => keywords.indexOf(layer.properties.category) >= 0) ) } @@ -57,7 +57,7 @@ {#if $_availableLayers?.length < 1} - {:else } + {:else}
| undefined = undefined let rasterLayer = new UIEventSource(availableLayers[0]) - let rasterLayerId = rasterLayer.sync(l => l?.properties?.id, [], id => availableLayers.find(l => l.properties.id === id)) + let rasterLayerId = rasterLayer.sync( + (l) => l?.properties?.id, + [], + (id) => availableLayers.find((l) => l.properties.id === id) + ) rasterLayer.setData(availableLayers[0]) $: rasterLayer.setData(availableLayers[0]) @@ -32,13 +36,13 @@ return } rasterLayer.setData(fav) - }), + }) ) onDestroy( rasterLayer.addCallbackAndRunD((selected) => { favourite?.setData(selected.properties.id) - }), + }) ) } @@ -52,7 +56,7 @@ } else { rasterLayerOnMap.setData(undefined) } - }), + }) ) } diff --git a/src/UI/Popup/ClearCaches.svelte b/src/UI/Popup/ClearCaches.svelte index f78c88add..a8be35e53 100644 --- a/src/UI/Popup/ClearCaches.svelte +++ b/src/UI/Popup/ClearCaches.svelte @@ -1,14 +1,12 @@ {/each} diff --git a/src/UI/Popup/Notes/CloseNoteButton.svelte b/src/UI/Popup/Notes/CloseNoteButton.svelte index 31fe64ab5..0560e38a8 100644 --- a/src/UI/Popup/Notes/CloseNoteButton.svelte +++ b/src/UI/Popup/Notes/CloseNoteButton.svelte @@ -18,7 +18,6 @@ export let minzoom: number export let zoomMoreMessage: string - let curZoom = state.mapProperties.zoom const isClosed = tags.map((tags) => (tags["closed_at"] ?? "") !== "") @@ -29,7 +28,6 @@ tags.data["closed_at"] = new Date().toISOString() tags.ping() } - @@ -37,7 +35,6 @@
- {#if $isClosed} {:else if minzoom <= $curZoom} @@ -50,5 +47,4 @@ {:else if zoomMoreMessage} {zoomMoreMessage} {/if} - diff --git a/src/UI/Popup/QrCode.svelte b/src/UI/Popup/QrCode.svelte index ad0ecb2a7..ddaa095bf 100644 --- a/src/UI/Popup/QrCode.svelte +++ b/src/UI/Popup/QrCode.svelte @@ -16,18 +16,14 @@ let [lon, lat] = GeoOperations.centerpointCoordinates(feature) - const includeLayout = window.location.pathname - .split("/") - .at(-1) - .startsWith("theme") - const layout = includeLayout - ? "layout=" + state.layout.id + "&" - : "" - let id: Store = tags.mapD(tags => tags.id) - let url = id.mapD(id => `${window.location.protocol}//${window.location.host}${window.location.pathname}?${layout}lat=${lat}&lon=${lon}&z=15` + - `#${id}`) - - + const includeLayout = window.location.pathname.split("/").at(-1).startsWith("theme") + const layout = includeLayout ? "layout=" + state.layout.id + "&" : "" + let id: Store = tags.mapD((tags) => tags.id) + let url = id.mapD( + (id) => + `${window.location.protocol}//${window.location.host}${window.location.pathname}?${layout}lat=${lat}&lon=${lon}&z=15` + + `#${id}` + ) function toggleSize() { if (size.data !== bigSize) { @@ -42,5 +38,9 @@ {:else} - toggleSize()} src={new Qr($url).toImageElement($size)} style={`width: ${$size}px; height: ${$size}px`} /> + toggleSize()} + src={new Qr($url).toImageElement($size)} + style={`width: ${$size}px; height: ${$size}px`} + /> {/if} diff --git a/src/UI/Popup/TagRendering/Questionbox.svelte b/src/UI/Popup/TagRendering/Questionbox.svelte index 814cfdc26..86e72bf5f 100644 --- a/src/UI/Popup/TagRendering/Questionbox.svelte +++ b/src/UI/Popup/TagRendering/Questionbox.svelte @@ -31,7 +31,8 @@ */ export let notForLabels: string[] | undefined = undefined const _notForLabels = new Set(notForLabels) - let showAllQuestionsAtOnce : Store= state.userRelatedState?.showAllQuestionsAtOnce ?? new ImmutableStore(false) + let showAllQuestionsAtOnce: Store = + state.userRelatedState?.showAllQuestionsAtOnce ?? new ImmutableStore(false) function allowed(labels: string[]) { if (onlyForLabels?.length > 0 && !labels.some((l) => _onlyForLabels.has(l))) { diff --git a/src/UI/Popup/TagRendering/TagRenderingEditable.svelte b/src/UI/Popup/TagRendering/TagRenderingEditable.svelte index 08cfa85d4..c80fc52b7 100644 --- a/src/UI/Popup/TagRendering/TagRenderingEditable.svelte +++ b/src/UI/Popup/TagRendering/TagRenderingEditable.svelte @@ -32,19 +32,18 @@ onDestroy( tags.addCallbackD((tags) => { const knownNow = config.IsKnown(tags) - if(!knownNow){ + if (!knownNow) { editMode = true return } - if(knownNow && !knownAtTheStart) { + if (knownNow && !knownAtTheStart) { // Some other question might have set this to 'known', so we close the 'editMode' editMode = false // well, not really 'known at the start', but it is known at this point in time, so it should not set 'editMode' to false automatically anymore knownAtTheStart = true } - - }), + }) ) } diff --git a/src/UI/Popup/TagRendering/TagRenderingQuestion.svelte b/src/UI/Popup/TagRendering/TagRenderingQuestion.svelte index 21d761c39..90203e64c 100644 --- a/src/UI/Popup/TagRendering/TagRenderingQuestion.svelte +++ b/src/UI/Popup/TagRendering/TagRenderingQuestion.svelte @@ -306,7 +306,8 @@ let hideMappingsUnlessSearchedFor = config.mappings.length > 8 && config.mappings.some((m) => m.priorityIf !== undefined) $: question = config.question - $: hideMappingsUnlessSearchedFor = config.mappings.length > 8 && config.mappings.some((m) => m.priorityIf !== undefined) + $: hideMappingsUnlessSearchedFor = + config.mappings.length > 8 && config.mappings.some((m) => m.priorityIf !== undefined) if (state?.osmConnection) { onDestroy( @@ -362,7 +363,7 @@ />
{#if hideMappingsUnlessSearchedFor} -
+
{/if} diff --git a/src/UI/SpecialVisualisationUtils.ts b/src/UI/SpecialVisualisationUtils.ts index 3e04b10d3..cd011c2a6 100644 --- a/src/UI/SpecialVisualisationUtils.ts +++ b/src/UI/SpecialVisualisationUtils.ts @@ -1,8 +1,6 @@ import { RenderingSpecification, SpecialVisualization } from "./SpecialVisualization" export default class SpecialVisualisationUtils { - - /** * * For a given string, returns a specification what parts are fixed and what parts are special renderings. @@ -27,7 +25,7 @@ export default class SpecialVisualisationUtils { public static constructSpecification( template: string, specialVisualisations: Map, - extraMappings: SpecialVisualization[] = [], + extraMappings: SpecialVisualization[] = [] ): RenderingSpecification[] { if (template === "") { return [] @@ -36,15 +34,13 @@ export default class SpecialVisualisationUtils { if (template["type"] !== undefined) { console.trace( "Got a non-expanded template while constructing the specification, it still has a 'special-key':", - template, + template ) throw "Got a non-expanded template while constructing the specification" } // Note: the '.*?' in the regex reads as 'any character, but in a non-greedy way' - const matched = template.match( - new RegExp(`(.*){\([a-zA-Z_]+\)\\((.*?)\\)(:.*)?}(.*)`, "s"), - ) + const matched = template.match(new RegExp(`(.*){\([a-zA-Z_]+\)\\((.*?)\\)(:.*)?}(.*)`, "s")) if (matched === null) { // IF we end up here, no changes have to be made - except to remove any resting {} return [template] @@ -52,11 +48,11 @@ export default class SpecialVisualisationUtils { const fName = matched[2] let knownSpecial = specialVisualisations.get(fName) - if(!knownSpecial && extraMappings?.length > 0){ - knownSpecial = extraMappings.find(em => em.funcName === fName) + if (!knownSpecial && extraMappings?.length > 0) { + knownSpecial = extraMappings.find((em) => em.funcName === fName) } - if(!knownSpecial){ - throw "Didn't find a special visualisation: "+fName+" in "+template + if (!knownSpecial) { + throw "Didn't find a special visualisation: " + fName + " in " + template } // Always a boring string @@ -64,13 +60,12 @@ export default class SpecialVisualisationUtils { const argument: string = matched[3] /* .trim() // We don't trim, as spaces might be relevant, e.g. "what is ... of {title()}"*/ const style: string = matched[4]?.substring(1) ?? "" - const partAfter: RenderingSpecification[] = SpecialVisualisationUtils.constructSpecification( - matched[5], - specialVisualisations, - extraMappings, - ) - - + const partAfter: RenderingSpecification[] = + SpecialVisualisationUtils.constructSpecification( + matched[5], + specialVisualisations, + extraMappings + ) const args: string[] = knownSpecial.args.map((arg) => arg.defaultValue ?? "") if (argument.length > 0) { @@ -92,12 +87,10 @@ export default class SpecialVisualisationUtils { func: knownSpecial, } partAfter.unshift(element) - if(partBefore.length > 0){ + if (partBefore.length > 0) { partAfter.unshift(partBefore) - } return partAfter - } private static undoEncoding(str: string) { diff --git a/src/UI/SpecialVisualizations.ts b/src/UI/SpecialVisualizations.ts index b71992d0c..29bcb2db6 100644 --- a/src/UI/SpecialVisualizations.ts +++ b/src/UI/SpecialVisualizations.ts @@ -2,7 +2,11 @@ import Combine from "./Base/Combine" import { FixedUiElement } from "./Base/FixedUiElement" import BaseUIElement from "./BaseUIElement" import Title from "./Base/Title" -import { RenderingSpecification, SpecialVisualization, SpecialVisualizationState } from "./SpecialVisualization" +import { + RenderingSpecification, + SpecialVisualization, + SpecialVisualizationState, +} from "./SpecialVisualization" import { HistogramViz } from "./Popup/HistogramViz" import MinimapViz from "./Popup/MinimapViz.svelte" import { ShareLinkViz } from "./Popup/ShareLinkViz" @@ -122,7 +126,7 @@ class NearbyImageVis implements SpecialVisualization { tags: UIEventSource>, args: string[], feature: Feature, - layer: LayerConfig, + layer: LayerConfig ): SvelteUIElement { const isOpen = args[0] === "open" const readonly = args[1] === "readonly" @@ -189,7 +193,7 @@ class StealViz implements SpecialVisualization { selectedElement: otherFeature, state, layer, - }), + }) ) } if (elements.length === 1) { @@ -197,8 +201,8 @@ class StealViz implements SpecialVisualization { } return new Combine(elements).SetClass("flex flex-col") }, - [state.indexedFeatures.featuresById], - ), + [state.indexedFeatures.featuresById] + ) ) } @@ -247,17 +251,17 @@ class CloseNoteViz implements SpecialVisualization { }, ] - public constr(state: SpecialVisualizationState, tags: UIEventSource>, args: string[], feature: Feature, layer: LayerConfig): SvelteUIElement { - - const { - text, - icon, - idkey, - comment, - minZoom, - zoomButton, - } = Utils.ParseVisArgs(this.args, args) - + public constr( + state: SpecialVisualizationState, + tags: UIEventSource>, + args: string[], + feature: Feature, + layer: LayerConfig + ): SvelteUIElement { + const { text, icon, idkey, comment, minZoom, zoomButton } = Utils.ParseVisArgs( + this.args, + args + ) return new SvelteUIElement(CloseNoteButton, { state, @@ -297,7 +301,7 @@ export class QuestionViz implements SpecialVisualization { tags: UIEventSource>, args: string[], feature: Feature, - layer: LayerConfig, + layer: LayerConfig ): SvelteUIElement { const labels = args[0] ?.split(";") @@ -320,11 +324,17 @@ export class QuestionViz implements SpecialVisualization { export default class SpecialVisualizations { public static specialVisualizations: SpecialVisualization[] = SpecialVisualizations.initList() - public static specialVisualisationsDict: Map = new Map() + public static specialVisualisationsDict: Map = new Map< + string, + SpecialVisualization + >() static { for (const specialVisualization of SpecialVisualizations.specialVisualizations) { - SpecialVisualizations.specialVisualisationsDict.set(specialVisualization.funcName, specialVisualization) + SpecialVisualizations.specialVisualisationsDict.set( + specialVisualization.funcName, + specialVisualization + ) } } @@ -343,15 +353,15 @@ export default class SpecialVisualizations { viz.docs, viz.args.length > 0 ? MarkdownUtils.table( - ["name", "default", "description"], - viz.args.map((arg) => { - let defaultArg = arg.defaultValue ?? "_undefined_" - if (defaultArg == "") { - defaultArg = "_empty string_" - } - return [arg.name, defaultArg, arg.doc] - }), - ) + ["name", "default", "description"], + viz.args.map((arg) => { + let defaultArg = arg.defaultValue ?? "_undefined_" + if (defaultArg == "") { + defaultArg = "_empty string_" + } + return [arg.name, defaultArg, arg.doc] + }) + ) : undefined, "#### Example usage of " + viz.funcName, "" + example + "", @@ -360,14 +370,18 @@ export default class SpecialVisualizations { public static constructSpecification( template: string, - extraMappings: SpecialVisualization[] = [], + extraMappings: SpecialVisualization[] = [] ): RenderingSpecification[] { - return SpecialVisualisationUtils.constructSpecification(template, SpecialVisualizations.specialVisualisationsDict, extraMappings) + return SpecialVisualisationUtils.constructSpecification( + template, + SpecialVisualizations.specialVisualisationsDict, + extraMappings + ) } public static HelpMessage(): string { const helpTexts: string[] = SpecialVisualizations.specialVisualizations.map((viz) => - SpecialVisualizations.DocumentationFor(viz), + SpecialVisualizations.DocumentationFor(viz) ) const firstPart = new Combine([ @@ -400,10 +414,10 @@ export default class SpecialVisualizations { }, }, null, - " ", - ), + " " + ) ).SetClass("code"), - "In other words: use `{ \"before\": ..., \"after\": ..., \"special\": {\"type\": ..., \"argname\": ...argvalue...}`. The args are in the `special` block; an argvalue can be a string, a translation or another value. (Refer to class `RewriteSpecial` in case of problems)", + 'In other words: use `{ "before": ..., "after": ..., "special": {"type": ..., "argname": ...argvalue...}`. The args are in the `special` block; an argvalue can be a string, a translation or another value. (Refer to class `RewriteSpecial` in case of problems)', ]) .SetClass("flex flex-col") .AsMarkdown() @@ -441,10 +455,10 @@ export default class SpecialVisualizations { assignTo: state.userRelatedState.language, availableLanguages: languages, preferredLanguages: state.osmConnection.userDetails.map( - (ud) => ud.languages, + (ud) => ud.languages ), }) - }), + }) ) }, }, @@ -483,7 +497,7 @@ export default class SpecialVisualizations { state: SpecialVisualizationState, tagSource: UIEventSource>, args: string[], - feature: Feature, + feature: Feature ): SvelteUIElement { return new SvelteUIElement(MinimapViz, { state, args, feature, tagSource }) }, @@ -495,7 +509,7 @@ export default class SpecialVisualizations { constr( state: SpecialVisualizationState, - tagSource: UIEventSource>, + tagSource: UIEventSource> ): BaseUIElement { return new VariableUiElement( tagSource @@ -505,7 +519,7 @@ export default class SpecialVisualizations { return new SvelteUIElement(SplitRoadWizard, { id, state }) } return undefined - }), + }) ) }, }, @@ -519,7 +533,7 @@ export default class SpecialVisualizations { tagSource: UIEventSource>, argument: string[], feature: Feature, - layer: LayerConfig, + layer: LayerConfig ): BaseUIElement { if (feature.geometry.type !== "Point") { return undefined @@ -542,7 +556,7 @@ export default class SpecialVisualizations { tagSource: UIEventSource>, argument: string[], feature: Feature, - layer: LayerConfig, + layer: LayerConfig ): BaseUIElement { if (!layer.deletion) { return undefined @@ -570,7 +584,7 @@ export default class SpecialVisualizations { state: SpecialVisualizationState, tagSource: UIEventSource>, argument: string[], - feature: Feature, + feature: Feature ): BaseUIElement { const [lon, lat] = GeoOperations.centerpointCoordinates(feature) return new SvelteUIElement(CreateNewNote, { @@ -633,7 +647,7 @@ export default class SpecialVisualizations { .map((tags) => tags[args[0]]) .map((wikidata) => { wikidata = Utils.NoEmpty( - wikidata?.split(";")?.map((wd) => wd.trim()) ?? [], + wikidata?.split(";")?.map((wd) => wd.trim()) ?? [] )[0] const entry = Wikidata.LoadWikidataEntry(wikidata) return new VariableUiElement( @@ -643,9 +657,9 @@ export default class SpecialVisualizations { } const response = e["success"] return Translation.fromMap(response.labels) - }), + }) ) - }), + }) ), }, new MapillaryLinkVis(), @@ -659,7 +673,7 @@ export default class SpecialVisualizations { tags: UIEventSource>, _, __, - layer: LayerConfig, + layer: LayerConfig ) => new SvelteUIElement(AllTagsPanel, { tags, layer }), }, { @@ -681,7 +695,7 @@ export default class SpecialVisualizations { return new ImageCarousel( AllImageProviders.LoadImagesFor(tags, imagePrefixes), tags, - state, + state ) }, }, @@ -738,7 +752,7 @@ export default class SpecialVisualizations { nameKey: nameKey, fallbackName, }, - state.featureSwitchIsTesting, + state.featureSwitchIsTesting ) return new SvelteUIElement(StarsBarIcon, { score: reviews.average, @@ -772,7 +786,7 @@ export default class SpecialVisualizations { nameKey: nameKey, fallbackName, }, - state.featureSwitchIsTesting, + state.featureSwitchIsTesting ) return new SvelteUIElement(ReviewForm, { reviews, state, tags, feature, layer }) }, @@ -781,7 +795,7 @@ export default class SpecialVisualizations { funcName: "list_reviews", docs: "Adds an overview of the mangrove-reviews of this object. Mangrove.Reviews needs - in order to identify the reviewed object - a coordinate and a name. By default, the name of the object is given, but this can be overwritten", needsUrls: [MangroveReviews.ORIGINAL_API], - args: [ + args: [ { name: "subjectKey", defaultValue: "name", @@ -803,16 +817,16 @@ export default class SpecialVisualizations { nameKey: nameKey, fallbackName, }, - state.featureSwitchIsTesting, + state.featureSwitchIsTesting ) return new SvelteUIElement(AllReviews, { reviews, state, tags, feature, layer }) }, }, { - funcName:"reviews", + funcName: "reviews", example: "`{reviews()}` for a vanilla review, `{reviews(name, play_forest)}` to review a play forest. If a name is known, the name will be used as identifier, otherwise 'play_forest' is used", - docs:"A pragmatic combination of `create_review` and `list_reviews`", + docs: "A pragmatic combination of `create_review` and `list_reviews`", args: [ { name: "subjectKey", @@ -824,15 +838,30 @@ export default class SpecialVisualizations { doc: "The identifier to use, if tags[subjectKey] as specified above is not available. This is effectively a fallback value", }, ], - constr(state: SpecialVisualizationState, tagSource: UIEventSource>, args: string[], feature: Feature, layer: LayerConfig): BaseUIElement { + constr( + state: SpecialVisualizationState, + tagSource: UIEventSource>, + args: string[], + feature: Feature, + layer: LayerConfig + ): BaseUIElement { return new Combine([ - SpecialVisualizations.specialVisualisationsDict["create_review"].constr(state, tagSource, args, feature, layer), - SpecialVisualizations.specialVisualisationsDict["list_reviews"].constr(state, tagSource, args, feature, layer) - - + SpecialVisualizations.specialVisualisationsDict["create_review"].constr( + state, + tagSource, + args, + feature, + layer + ), + SpecialVisualizations.specialVisualisationsDict["list_reviews"].constr( + state, + tagSource, + args, + feature, + layer + ), ]) - } - + }, }, { funcName: "import_mangrove_key", @@ -847,7 +876,7 @@ export default class SpecialVisualizations { constr( state: SpecialVisualizationState, _: UIEventSource>, - argument: string[], + argument: string[] ): BaseUIElement { const [text] = argument return new SvelteUIElement(ImportReviewIdentity, { state, text }) @@ -904,7 +933,7 @@ export default class SpecialVisualizations { constr( state: SpecialVisualizationState, tags: UIEventSource>, - args: string[], + args: string[] ): SvelteUIElement { const keyToUse = args[0] const prefix = args[1] @@ -941,17 +970,17 @@ export default class SpecialVisualizations { return undefined } const allUnits: Unit[] = [].concat( - ...(state?.layout?.layers?.map((lyr) => lyr.units) ?? []), + ...(state?.layout?.layers?.map((lyr) => lyr.units) ?? []) ) const unit = allUnits.filter((unit) => - unit.isApplicableToKey(key), + unit.isApplicableToKey(key) )[0] if (unit === undefined) { return value } const getCountry = () => tagSource.data._country return unit.asHumanLongValue(value, getCountry) - }), + }) ) }, }, @@ -968,7 +997,7 @@ export default class SpecialVisualizations { new Combine([ t.downloadFeatureAsGeojson.SetClass("font-bold text-lg"), t.downloadGeoJsonHelper.SetClass("subtle"), - ]).SetClass("flex flex-col"), + ]).SetClass("flex flex-col") ) .onClick(() => { console.log("Exporting as Geojson") @@ -981,7 +1010,7 @@ export default class SpecialVisualizations { title + "_mapcomplete_export.geojson", { mimetype: "application/vnd.geo+json", - }, + } ) }) .SetClass("w-full") @@ -1017,7 +1046,7 @@ export default class SpecialVisualizations { constr: (state) => { return new SubtleButton( new SvelteUIElement(Trash).SetClass("h-6"), - Translations.t.general.removeLocationHistory, + Translations.t.general.removeLocationHistory ).onClick(() => { state.historicalUserLocations.features.setData([]) state.selectedElement.setData(undefined) @@ -1055,10 +1084,10 @@ export default class SpecialVisualizations { .filter((c) => c.text !== "") .map( (c, i) => - new NoteCommentElement(c, state, i, comments.length), - ), + new NoteCommentElement(c, state, i, comments.length) + ) ).SetClass("flex flex-col") - }), + }) ), }, { @@ -1092,7 +1121,7 @@ export default class SpecialVisualizations { tagsSource: UIEventSource>, _: string[], feature: Feature, - layer: LayerConfig, + layer: LayerConfig ) => new VariableUiElement( tagsSource.map((tags) => { @@ -1112,7 +1141,7 @@ export default class SpecialVisualizations { }) .SetClass("px-1") .setSpan() - }), + }) ), }, { @@ -1128,8 +1157,8 @@ export default class SpecialVisualizations { const challenge = Stores.FromPromise( Utils.downloadJsonCached( `${Maproulette.defaultEndpoint}/challenge/${parentId}`, - 24 * 60 * 60 * 1000, - ), + 24 * 60 * 60 * 1000 + ) ) return new VariableUiElement( @@ -1154,7 +1183,7 @@ export default class SpecialVisualizations { } else { return [title, new List(listItems)] } - }), + }) ) }, docs: "Fetches the metadata of MapRoulette campaign that this task is part of and shows those details (namely `title`, `description` and `instruction`).\n\nThis reads the property `mr_challengeId` to detect the parent campaign.", @@ -1168,15 +1197,15 @@ export default class SpecialVisualizations { "\n" + "```json\n" + "{\n" + - " \"id\": \"mark_duplicate\",\n" + - " \"render\": {\n" + - " \"special\": {\n" + - " \"type\": \"maproulette_set_status\",\n" + - " \"message\": {\n" + - " \"en\": \"Mark as not found or false positive\"\n" + + ' "id": "mark_duplicate",\n' + + ' "render": {\n' + + ' "special": {\n' + + ' "type": "maproulette_set_status",\n' + + ' "message": {\n' + + ' "en": "Mark as not found or false positive"\n' + " },\n" + - " \"status\": \"2\",\n" + - " \"image\": \"close\"\n" + + ' "status": "2",\n' + + ' "image": "close"\n' + " }\n" + " }\n" + "}\n" + @@ -1252,7 +1281,7 @@ export default class SpecialVisualizations { (l) => l.name !== null && l.title && - state.perLayer.get(l.id) !== undefined, + state.perLayer.get(l.id) !== undefined ) .map( (l) => { @@ -1262,8 +1291,8 @@ export default class SpecialVisualizations { const fsBboxed = new BBoxFeatureSourceForLayer(fs, bbox) return new StatisticsPanel(fsBboxed) }, - [state.mapProperties.bounds], - ), + [state.mapProperties.bounds] + ) ) }, }, @@ -1326,14 +1355,14 @@ export default class SpecialVisualizations { }, { name: "icon", - doc: "If set, show this icon next to the link. You might want to combine this with `class: button`" + doc: "If set, show this icon next to the link. You might want to combine this with `class: button`", }, ], constr( state: SpecialVisualizationState, tagSource: UIEventSource>, - args: string[], + args: string[] ): BaseUIElement { let [text, href, classnames, download, ariaLabel, icon] = args if (download === "") { @@ -1345,8 +1374,8 @@ export default class SpecialVisualizations { (tags) => Utils.SubstituteKeys(href, tags).replaceAll( / /g, - "%20", - ), /* Chromium based browsers eat the spaces */ + "%20" + ) /* Chromium based browsers eat the spaces */ ) return new SvelteUIElement(DynLink, { text: textStore, @@ -1377,7 +1406,7 @@ export default class SpecialVisualizations { }, }, null, - " ", + " " ) + "\n```", args: [ @@ -1401,7 +1430,7 @@ export default class SpecialVisualizations { featureTags: UIEventSource>, args: string[], feature: Feature, - layer: LayerConfig, + layer: LayerConfig ) { const [key, tr, classesRaw] = args let classes = classesRaw ?? "" @@ -1419,7 +1448,7 @@ export default class SpecialVisualizations { "Could not create a special visualization for multi(", args.join(", ") + ")", "no properties found for object", - feature.properties.id, + feature.properties.id ) return undefined } @@ -1435,7 +1464,7 @@ export default class SpecialVisualizations { elements.push(subsTr) } return elements - }), + }) ) }, }, @@ -1455,7 +1484,7 @@ export default class SpecialVisualizations { tagSource: UIEventSource>, argument: string[], feature: Feature, - layer: LayerConfig, + layer: LayerConfig ): BaseUIElement { return new VariableUiElement( tagSource.map((tags) => { @@ -1467,7 +1496,7 @@ export default class SpecialVisualizations { console.error("Cannot create a translation for", v, "due to", e) return JSON.stringify(v) } - }), + }) ) }, }, @@ -1487,7 +1516,7 @@ export default class SpecialVisualizations { tagSource: UIEventSource>, argument: string[], feature: Feature, - layer: LayerConfig, + layer: LayerConfig ): BaseUIElement { const key = argument[0] const validator = new FediverseValidator() @@ -1497,7 +1526,7 @@ export default class SpecialVisualizations { .map((fediAccount) => { fediAccount = validator.reformat(fediAccount) const [_, username, host] = fediAccount.match( - FediverseValidator.usernameAtServer, + FediverseValidator.usernameAtServer ) const normalLink = new SvelteUIElement(Link, { @@ -1509,10 +1538,10 @@ export default class SpecialVisualizations { const loggedInContributorMastodon = state.userRelatedState?.preferencesAsTags?.data?.[ "_mastodon_link" - ] + ] console.log( "LoggedinContributorMastodon", - loggedInContributorMastodon, + loggedInContributorMastodon ) if (!loggedInContributorMastodon) { return normalLink @@ -1528,7 +1557,7 @@ export default class SpecialVisualizations { newTab: true, }).SetClass("button"), ]) - }), + }) ) }, }, @@ -1548,7 +1577,7 @@ export default class SpecialVisualizations { tagSource: UIEventSource>, args: string[], feature: Feature, - layer: LayerConfig, + layer: LayerConfig ): BaseUIElement { return new FixedUiElement("{" + args[0] + "}") }, @@ -1569,7 +1598,7 @@ export default class SpecialVisualizations { tagSource: UIEventSource>, argument: string[], feature: Feature, - layer: LayerConfig, + layer: LayerConfig ): BaseUIElement { const key = argument[0] ?? "value" return new VariableUiElement( @@ -1587,12 +1616,12 @@ export default class SpecialVisualizations { } catch (e) { return new FixedUiElement( "Could not parse this tag: " + - JSON.stringify(value) + - " due to " + - e, + JSON.stringify(value) + + " due to " + + e ).SetClass("alert") } - }), + }) ) }, }, @@ -1613,7 +1642,7 @@ export default class SpecialVisualizations { tagSource: UIEventSource>, argument: string[], feature: Feature, - layer: LayerConfig, + layer: LayerConfig ): BaseUIElement { const giggityUrl = argument[0] return new SvelteUIElement(Giggity, { tags: tagSource, state, giggityUrl }) @@ -1629,12 +1658,12 @@ export default class SpecialVisualizations { _: UIEventSource>, argument: string[], feature: Feature, - layer: LayerConfig, + layer: LayerConfig ): BaseUIElement { const tags = (( state )).geolocation.currentUserLocation.features.map( - (features) => features[0]?.properties, + (features) => features[0]?.properties ) return new Combine([ new SvelteUIElement(OrientationDebugPanel, {}), @@ -1656,7 +1685,7 @@ export default class SpecialVisualizations { tagSource: UIEventSource>, argument: string[], feature: Feature, - layer: LayerConfig, + layer: LayerConfig ): BaseUIElement { return new SvelteUIElement(MarkAsFavourite, { tags: tagSource, @@ -1676,7 +1705,7 @@ export default class SpecialVisualizations { tagSource: UIEventSource>, argument: string[], feature: Feature, - layer: LayerConfig, + layer: LayerConfig ): BaseUIElement { return new SvelteUIElement(MarkAsFavouriteMini, { tags: tagSource, @@ -1696,7 +1725,7 @@ export default class SpecialVisualizations { tagSource: UIEventSource>, argument: string[], feature: Feature, - layer: LayerConfig, + layer: LayerConfig ): BaseUIElement { return new SvelteUIElement(DirectionIndicator, { state, feature }) }, @@ -1709,7 +1738,7 @@ export default class SpecialVisualizations { state: SpecialVisualizationState, tags: UIEventSource>, argument: string[], - feature: Feature, + feature: Feature ): SvelteUIElement { return new SvelteUIElement(QrCode, { state, tags, feature }) }, @@ -1728,7 +1757,7 @@ export default class SpecialVisualizations { constr( state: SpecialVisualizationState, tagSource: UIEventSource>, - args: string[], + args: string[] ): BaseUIElement { const key = args[0] === "" ? "_direction:centerpoint" : args[0] return new VariableUiElement( @@ -1739,11 +1768,11 @@ export default class SpecialVisualizations { }) .mapD((value) => { const dir = GeoOperations.bearingToHuman( - GeoOperations.parseBearing(value), + GeoOperations.parseBearing(value) ) console.log("Human dir", dir) return Translations.t.general.visualFeedback.directionsAbsolute[dir] - }), + }) ) }, }, @@ -1773,7 +1802,7 @@ export default class SpecialVisualizations { tagSource: UIEventSource>, args: string[], feature: Feature, - layer: LayerConfig, + layer: LayerConfig ): BaseUIElement { const url = args[0] const readonly = args[3] === "yes" @@ -1799,12 +1828,12 @@ export default class SpecialVisualizations { tagSource: UIEventSource>, args: string[], feature: Feature, - layer: LayerConfig, + layer: LayerConfig ): BaseUIElement { return new Toggle( undefined, new SvelteUIElement(LoginButton, { osmConnection: state.osmConnection }), - state.osmConnection.isLoggedIn, + state.osmConnection.isLoggedIn ) }, }, @@ -1842,7 +1871,7 @@ export default class SpecialVisualizations { tags: UIEventSource>, argument: string[], feature: Feature, - layer: LayerConfig, + layer: LayerConfig ): BaseUIElement { const key = argument[0] ?? "website" const useProxy = argument[1] !== "no" @@ -1869,11 +1898,11 @@ export default class SpecialVisualizations { const features = await LinkedDataLoader.fetchVeloparkEntry( url, - loadAll, + loadAll ) const feature = features.find( - (f) => f.properties["ref:velopark"] === url, + (f) => f.properties["ref:velopark"] === url ) ?? features[0] const properties = feature.properties properties["ref:velopark"] = url @@ -1883,7 +1912,7 @@ export default class SpecialVisualizations { console.error(e) throw e } - })(), + })() ) } return Stores.FromPromiseWithErr( @@ -1892,27 +1921,27 @@ export default class SpecialVisualizations { return await LinkedDataLoader.fetchJsonLd( url, { country }, - useProxy ? "proxy" : "fetch-lod", + useProxy ? "proxy" : "fetch-lod" ) } catch (e) { console.log( "Could not get with proxy/download LOD, attempting to download directly. Error for ", url, "is", - e, + e ) return await LinkedDataLoader.fetchJsonLd( url, { country }, - "fetch-raw", + "fetch-raw" ) } - })(), + })() ) }) externalData.addCallbackAndRunD((lod) => - console.log("linked_data_from_website received the following data:", lod), + console.log("linked_data_from_website received the following data:", lod) ) return new Toggle( @@ -1927,7 +1956,7 @@ export default class SpecialVisualizations { collapsed: isClosed, }), undefined, - url.map((url) => !!url), + url.map((url) => !!url) ) }, }, @@ -1947,7 +1976,7 @@ export default class SpecialVisualizations { tagSource: UIEventSource>, argument: string[], feature: Feature, - layer: LayerConfig, + layer: LayerConfig ): BaseUIElement { const text = argument[0] const cssClasses = argument[1] @@ -1969,7 +1998,7 @@ export default class SpecialVisualizations { tagSource: UIEventSource>, argument: string[], feature: Feature, - layer: LayerConfig, + layer: LayerConfig ): BaseUIElement { const translation = tagSource.map((tags) => { const presets = state.layout.getMatchingLayer(tags)?.presets @@ -2000,18 +2029,24 @@ export default class SpecialVisualizations { return mostShadowed?.description ?? matchingPresets[0]?.description }) return new VariableUiElement(translation) - } + }, }, { funcName: "preset_type_select", docs: "An editable tag rendering which allows to change the type", args: [], - constr(state: SpecialVisualizationState, tags: UIEventSource>, argument: string[], selectedElement: Feature, layer: LayerConfig): SvelteUIElement { + constr( + state: SpecialVisualizationState, + tags: UIEventSource>, + argument: string[], + selectedElement: Feature, + layer: LayerConfig + ): SvelteUIElement { const t = Translations.t.preset_type const question: QuestionableTagRenderingConfigJson = { id: layer.id + "-type", question: t.question.translations, - mappings: layer.presets.map(pr => { + mappings: layer.presets.map((pr) => { return { if: new And(pr.tags).asJson(), then: (pr.description ? t.typeDescription : t.typeTitle).Subs({ @@ -2024,7 +2059,10 @@ export default class SpecialVisualizations { const config = new TagRenderingConfig(question) return new SvelteUIElement(TagRenderingEditable, { config, - tags, selectedElement, state, layer, + tags, + selectedElement, + state, + layer, }) }, }, @@ -2032,7 +2070,13 @@ export default class SpecialVisualizations { funcName: "pending_changes", docs: "A module showing the pending changes, with the option to clear the pending changes", args: [], - constr(state: SpecialVisualizationState, tagSource: UIEventSource>, argument: string[], feature: Feature, layer: LayerConfig): BaseUIElement { + constr( + state: SpecialVisualizationState, + tagSource: UIEventSource>, + argument: string[], + feature: Feature, + layer: LayerConfig + ): BaseUIElement { return new SvelteUIElement(PendingChangesIndicator, { state, compact: false }) }, }, @@ -2046,8 +2090,16 @@ export default class SpecialVisualizations { doc: "The text to show on the button", }, ], - constr(state: SpecialVisualizationState, tagSource: UIEventSource>, argument: string[], feature: Feature, layer: LayerConfig): SvelteUIElement { - return new SvelteUIElement(ClearCaches, { msg: argument[0] ?? "Clear local caches" }) + constr( + state: SpecialVisualizationState, + tagSource: UIEventSource>, + argument: string[], + feature: Feature, + layer: LayerConfig + ): SvelteUIElement { + return new SvelteUIElement(ClearCaches, { + msg: argument[0] ?? "Clear local caches", + }) }, }, { @@ -2063,11 +2115,22 @@ export default class SpecialVisualizations { doc: "A `;`-separated list of either identifiers or label names. All tagRenderings matching this value will be shown in the accordion", }, ], - constr(state: SpecialVisualizationState, tags: UIEventSource>, argument: string[], selectedElement: Feature, layer: LayerConfig): SvelteUIElement { + constr( + state: SpecialVisualizationState, + tags: UIEventSource>, + argument: string[], + selectedElement: Feature, + layer: LayerConfig + ): SvelteUIElement { const [header, labelsStr] = argument - const labels = labelsStr.split(";").map(x => x.trim()) + const labels = labelsStr.split(";").map((x) => x.trim()) return new SvelteUIElement(GroupedView, { - state, tags, selectedElement, layer, header, labels, + state, + tags, + selectedElement, + layer, + header, + labels, }) }, }, @@ -2075,12 +2138,18 @@ export default class SpecialVisualizations { funcName: "preset_type_select", docs: "An editable tag rendering which allows to change the type", args: [], - constr(state: SpecialVisualizationState, tags: UIEventSource>, argument: string[], selectedElement: Feature, layer: LayerConfig): SvelteUIElement { + constr( + state: SpecialVisualizationState, + tags: UIEventSource>, + argument: string[], + selectedElement: Feature, + layer: LayerConfig + ): SvelteUIElement { const t = Translations.t.preset_type const question: QuestionableTagRenderingConfigJson = { id: layer.id + "-type", question: t.question.translations, - mappings: layer.presets.map(pr => { + mappings: layer.presets.map((pr) => { return { if: new And(pr.tags).asJson(), then: (pr.description ? t.typeDescription : t.typeTitle).Subs({ @@ -2093,7 +2162,10 @@ export default class SpecialVisualizations { const config = new TagRenderingConfig(question) return new SvelteUIElement(TagRenderingEditable, { config, - tags, selectedElement, state, layer, + tags, + selectedElement, + state, + layer, }) }, }, @@ -2101,7 +2173,13 @@ export default class SpecialVisualizations { funcName: "pending_changes", docs: "A module showing the pending changes, with the option to clear the pending changes", args: [], - constr(state: SpecialVisualizationState, tagSource: UIEventSource>, argument: string[], feature: Feature, layer: LayerConfig): BaseUIElement { + constr( + state: SpecialVisualizationState, + tagSource: UIEventSource>, + argument: string[], + feature: Feature, + layer: LayerConfig + ): BaseUIElement { return new SvelteUIElement(PendingChangesIndicator, { state, compact: false }) }, }, @@ -2115,8 +2193,16 @@ export default class SpecialVisualizations { doc: "The text to show on the button", }, ], - constr(state: SpecialVisualizationState, tagSource: UIEventSource>, argument: string[], feature: Feature, layer: LayerConfig): SvelteUIElement { - return new SvelteUIElement(ClearCaches, { msg: argument[0] ?? "Clear local caches" }) + constr( + state: SpecialVisualizationState, + tagSource: UIEventSource>, + argument: string[], + feature: Feature, + layer: LayerConfig + ): SvelteUIElement { + return new SvelteUIElement(ClearCaches, { + msg: argument[0] ?? "Clear local caches", + }) }, }, { @@ -2132,11 +2218,22 @@ export default class SpecialVisualizations { doc: "A `;`-separated list of either identifiers or label names. All tagRenderings matching this value will be shown in the accordion", }, ], - constr(state: SpecialVisualizationState, tags: UIEventSource>, argument: string[], selectedElement: Feature, layer: LayerConfig): SvelteUIElement { + constr( + state: SpecialVisualizationState, + tags: UIEventSource>, + argument: string[], + selectedElement: Feature, + layer: LayerConfig + ): SvelteUIElement { const [header, labelsStr] = argument - const labels = labelsStr.split(";").map(x => x.trim()) + const labels = labelsStr.split(";").map((x) => x.trim()) return new SvelteUIElement(GroupedView, { - state, tags, selectedElement, layer, header, labels, + state, + tags, + selectedElement, + layer, + header, + labels, }) }, }, @@ -2144,15 +2241,16 @@ export default class SpecialVisualizations { specialVisualizations.push(new AutoApplyButton(specialVisualizations)) - const regex= /[a-zA-Z_]+/ + const regex = /[a-zA-Z_]+/ const invalid = specialVisualizations .map((sp, i) => ({ sp, i })) .filter((sp) => sp.sp.funcName === undefined || !sp.sp.funcName.match(regex)) if (invalid.length > 0) { throw ( - "Invalid special visualisation found: funcName is undefined or doesn't match "+regex + + "Invalid special visualisation found: funcName is undefined or doesn't match " + + regex + invalid.map((sp) => sp.i).join(", ") + - ". Did you perhaps type \n funcName: \"funcname\" // type declaration uses COLON\ninstead of:\n funcName = \"funcName\" // value definition uses EQUAL" + '. Did you perhaps type \n funcName: "funcname" // type declaration uses COLON\ninstead of:\n funcName = "funcName" // value definition uses EQUAL' ) } diff --git a/src/UI/Studio/CollapsedTagRenderingPreview.svelte b/src/UI/Studio/CollapsedTagRenderingPreview.svelte index 177894793..9c21d82ae 100644 --- a/src/UI/Studio/CollapsedTagRenderingPreview.svelte +++ b/src/UI/Studio/CollapsedTagRenderingPreview.svelte @@ -1,5 +1,4 @@ - - -
+ +
{#if !isTagRenderingBlock} -
+
{#if schema.hints.icon} @@ -134,30 +130,30 @@
{:else if typeof value === "string"} Builtin: {value} - {:else if value["builtin"]} + {:else if value["builtin"]} reused tagrendering {JSON.stringify(value["builtin"])} {:else} {/if}
-
+
{#if usesOverride} - This block uses an builtin/override construction and cannot be edited in Studio. - Edit the code directly + This block uses an builtin/override construction and cannot be edited in Studio. Edit the code + directly {:else if isTagRenderingBlock} @@ -183,29 +179,25 @@ {#if i + 1 < $currentValue.length} {/if} {:else if schema.hints.types} - + {:else} {#each subparts as subpart} - + {/each} {/if}
diff --git a/src/UI/Studio/DeleteButton.svelte b/src/UI/Studio/DeleteButton.svelte index 191379f4a..c824b6bb2 100644 --- a/src/UI/Studio/DeleteButton.svelte +++ b/src/UI/Studio/DeleteButton.svelte @@ -23,10 +23,9 @@
- Deleting this layer will delete your version. If you clicked a layer made by someone else, their version will - remain. - - If you ever accidentally delete a layer, contact Pietervdvn. He might have a backup + Deleting this layer will delete your version. If you clicked a layer made by someone else, + their version will remain. If you ever accidentally delete a layer, contact Pietervdvn. He + might have a backup
deleteLayer()}> @@ -35,8 +34,5 @@ Do delete this {objectType}
-
- - diff --git a/src/UI/Studio/EditLayer.svelte b/src/UI/Studio/EditLayer.svelte index 88ca9c31d..358fa5998 100644 --- a/src/UI/Studio/EditLayer.svelte +++ b/src/UI/Studio/EditLayer.svelte @@ -82,7 +82,7 @@ let highlightedItem: UIEventSource = state.highlightedItem -