From 297f4b3868899738fb26bb59e2e52591162ab181 Mon Sep 17 00:00:00 2001 From: Pieter Vander Vennet Date: Mon, 27 Jan 2025 23:20:21 +0100 Subject: [PATCH] Docs: add some more structure to the specialRenderings.md-file --- Docs/Layers/childcare.md | 139 +++++ Docs/Layers/dog_toilet.md | 73 +++ Docs/Layers/food_dog_friendly.md | 612 ++++++++++++++++++++ Docs/Layers/shop_dog_friendly.md | 937 +++++++++++++++++++++++++++++++ Docs/Layers/waste_basket_dogs.md | 97 ++++ scripts/generateDocs.ts | 3 +- src/UI/Popup/AutoApplyButton.ts | 23 +- src/UI/SpecialVisualizations.ts | 401 +++++++------ 8 files changed, 2086 insertions(+), 199 deletions(-) create mode 100644 Docs/Layers/childcare.md create mode 100644 Docs/Layers/dog_toilet.md create mode 100644 Docs/Layers/food_dog_friendly.md create mode 100644 Docs/Layers/shop_dog_friendly.md create mode 100644 Docs/Layers/waste_basket_dogs.md diff --git a/Docs/Layers/childcare.md b/Docs/Layers/childcare.md new file mode 100644 index 0000000000..20e85e285e --- /dev/null +++ b/Docs/Layers/childcare.md @@ -0,0 +1,139 @@ +[//]: # (WARNING: this file is automatically generated. Please find the sources at the bottom and edit those sources) + +# childcare + +Shows kindergartens and preschools. Both are grouped in one layer, as they are regularly confused with each other + + - This layer is shown at zoomlevel **12** and higher + +## Table of contents + +1. [Themes using this layer](#themes-using-this-layer) +2. [Presets](#presets) +3. [Basic tags for this layer](#basic-tags-for-this-layer) +4. [Supported attributes](#supported-attributes) + - [name](#name) + - [website](#website) + - [email](#email) + - [phone](#phone) + - [opening_hours](#opening_hours) + - [Opening hours](#opening-hours) + - [capacity](#capacity) + - [leftover-questions](#leftover-questions) + - [move-button](#move-button) + - [delete-button](#delete-button) + - [lod](#lod) +5. [Filters](#filters) + +## Themes using this layer + + - [education](https://mapcomplete.org/education) + - [personal](https://mapcomplete.org/personal) + +## Presets + +The following options to create new points are included: + + - **a childcare** which has the following tags:amenity=childcare + +## Basic tags for this layer + +Elements must match the expression **amenity=childcare** + +[Execute on overpass](http://overpass-turbo.eu/?Q=%5Bout%3Ajson%5D%5Btimeout%3A90%5D%3B%28%20%20%20%20nwr%5B%22amenity%22%3D%22childcare%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 | +-----|-----|----- | +| [name](https://wiki.openstreetmap.org/wiki/Key:name) | [string](../SpecialInputElements.md#string) | | +| [website](https://wiki.openstreetmap.org/wiki/Key:website) | [url](../SpecialInputElements.md#url) | | +| [email](https://wiki.openstreetmap.org/wiki/Key:email) | [email](../SpecialInputElements.md#email) | | +| [phone](https://wiki.openstreetmap.org/wiki/Key:phone) | [phone](../SpecialInputElements.md#phone) | | +| [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) | [opening_hours](../SpecialInputElements.md#opening_hours) | | +| [capacity](https://wiki.openstreetmap.org/wiki/Key:capacity) | [pnat](../SpecialInputElements.md#pnat) | | + +### name + +The question is `What is the name of this facility?` +*This facility is named {name}* is shown if `name` is set + +### website + +The question is `What is the website of {title()}?` +*{website}* is shown if `website` is set + + - *{contact:website}* is shown if with contact:website~.+. _This option cannot be chosen as answer_ + +This tagrendering has labels +`contact` + +### email + +The question is `What is the email address of {title()}?` +*{email}* is shown if `email` is set + + - *{contact:email}* is shown if with contact:email~.+. _This option cannot be chosen as answer_ + - *{operator:email}* is shown if with operator:email~.+. _This option cannot be chosen as answer_ + +This tagrendering has labels +`contact` + +### phone + +The question is `What is the phone number of {title()}?` +*{link(&LBRACEphone&RBRACE,tel:&LBRACEphone&RBRACE,,,,)}* is shown if `phone` is set + + - *{link(&LBRACEcontact:phone&RBRACE,tel:&LBRACEcontact:phone&RBRACE,,,,)}* is shown if with contact:phone~.+. _This option cannot be chosen as answer_ + +This tagrendering has labels +`contact` + +### opening_hours + +The question is `When is this childcare opened?` +*

Opening hours

{opening_hours_table(opening_hours)}* is shown if `opening_hours` is set + + - *Marked as closed for an unspecified time* is shown if with opening_hours=closed. _This option cannot be chosen as answer_ + +This tagrendering is only visible in the popup if the following condition is met: amenity=childcare + +### capacity + +The question is `How much kids (at most) can be enrolled here?` +*This facility has room for {capacity} kids* is shown if `capacity` is set + +### 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 | +-----|-----|----- | +| open_now.0 | Now open | _isOpen=yes | + + + +This document is autogenerated from [assets/layers/childcare/childcare.json](https://github.com/pietervdvn/MapComplete/blob/develop/assets/layers/childcare/childcare.json) diff --git a/Docs/Layers/dog_toilet.md b/Docs/Layers/dog_toilet.md new file mode 100644 index 0000000000..66cddbe716 --- /dev/null +++ b/Docs/Layers/dog_toilet.md @@ -0,0 +1,73 @@ +[//]: # (WARNING: this file is automatically generated. Please find the sources at the bottom and edit those sources) + +# dog_toilet + +A dog toilet is a facility designated for dogs to urinate and excrete. This can be a designated, signposted patch of grass, a sand pit or a fenced area. + + - This layer is shown at zoomlevel **13** and higher + +## Table of contents + +1. [Themes using this layer](#themes-using-this-layer) +2. [Presets](#presets) +3. [Basic tags for this layer](#basic-tags-for-this-layer) +4. [Supported attributes](#supported-attributes) + - [images](#images) + - [barrier](#barrier) + - [leftover-questions](#leftover-questions) + - [move-button](#move-button) + - [lod](#lod) + +## Themes using this layer + + - [personal](https://mapcomplete.org/personal) + - [pets](https://mapcomplete.org/pets) + +## Presets + +The following options to create new points are included: + + - **a dog toilet** which has the following tags:amenity=dog_toilet + +## Basic tags for this layer + +Elements must match the expression **amenity=dog_toilet** + +[Execute on overpass](http://overpass-turbo.eu/?Q=%5Bout%3Ajson%5D%5Btimeout%3A90%5D%3B%28%20%20%20%20nwr%5B%22amenity%22%3D%22dog_toilet%22%5D%28%7B%7Bbbox%7D%7D%29%3B%0A%29%3Bout%20body%3B%3E%3Bout%20skel%20qt%3B) + +## Supported attributes + +### 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()}* + +### barrier + +The question is `Is this dog toilet fenced?` + + - *There is a fence around this dog toilet* is shown if with barrier=fence + - *There is a hedge around this dog toilet* is shown if with barrier=hedge + - *There is a barrier around this dog toilet* is shown if with barrier=yes + - *There is no barrier around this dog toilet* is shown if with not:barrier=fence + +### 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()}* + +### 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/layers/dog_toilet/dog_toilet.json](https://github.com/pietervdvn/MapComplete/blob/develop/assets/layers/dog_toilet/dog_toilet.json) diff --git a/Docs/Layers/food_dog_friendly.md b/Docs/Layers/food_dog_friendly.md new file mode 100644 index 0000000000..59ba3aca7a --- /dev/null +++ b/Docs/Layers/food_dog_friendly.md @@ -0,0 +1,612 @@ +[//]: # (WARNING: this file is automatically generated. Please find the sources at the bottom and edit those sources) + +# food_dog_friendly + +This layer is based on [food](../Layers/food.md) + +A layer showing restaurants and fast-food amenities (with a special rendering for friteries) + + - This layer is shown at zoomlevel **12** 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) + - [images](#images) + - [reviews](#reviews) + - [Name](#name) + - [Fastfood vs restaurant](#fastfood-vs-restaurant) + - [opening_hours](#opening_hours) + - [Opening hours](#opening-hours) + - [website](#website) + - [email](#email) + - [phone](#phone) + - [payment-options](#payment-options) + - [repeated](#repeated) + - [single_level](#single_level) + - [wheelchair-access](#wheelchair-access) + - [Cuisine](#cuisine) + - [show-menu-image](#show-menu-image) + - [add-menu-image](#add-menu-image) + - [menu-website](#menu-website) + - [Reservation](#reservation) + - [Takeaway](#takeaway) + - [delivery](#delivery) + - [drive-through](#drive-through) + - [drive-through-opening_hours](#drive-through-opening_hours) + - [Drive-through opening hours](#drive-through-opening-hours) + - [Vegetarian (no friture)](#vegetarian-(no-friture)) + - [Vegan (no friture)](#vegan-(no-friture)) + - [halal (no friture)](#halal-(no-friture)) + - [organic (no friture)](#organic-(no-friture)) + - [friture-vegetarian](#friture-vegetarian) + - [friture-vegan](#friture-vegan) + - [friture-organic](#friture-organic) + - [friture-oil](#friture-oil) + - [friture-take-your-container](#friture-take-your-container) + - [sugar_free](#sugar_free) + - [gluten_free](#gluten_free) + - [lactose_free](#lactose_free) + - [smoking](#smoking) + - [service:electricity](#serviceelectricity) + - [seating](#seating) + - [dog-access](#dog-access) + - [internet](#internet) + - [internet-fee](#internet-fee) + - [internet-ssid](#internet-ssid) + - [leftover-questions](#leftover-questions) + - [move-button](#move-button) + - [delete-button](#delete-button) + - [lod](#lod) +4. [Filters](#filters) + +## Themes using this layer + + - [pets](https://mapcomplete.org/pets) + +## Basic tags for this layer + +Elements must match **all** of the following expressions: + +0. amenity=fast_food | amenity=restaurant +1. dog=unleashed | dog=leashed | dog=yes + +[Execute on overpass](http://overpass-turbo.eu/?Q=%5Bout%3Ajson%5D%5Btimeout%3A90%5D%3B%28%20%20%20%20nwr%5B%22amenity%22%3D%22fast_food%22%5D%5B%22dog%22%3D%22unleashed%22%5D%28%7B%7Bbbox%7D%7D%29%3B%0A%20%20%20%20nwr%5B%22amenity%22%3D%22fast_food%22%5D%5B%22dog%22%3D%22leashed%22%5D%28%7B%7Bbbox%7D%7D%29%3B%0A%20%20%20%20nwr%5B%22amenity%22%3D%22fast_food%22%5D%5B%22dog%22%3D%22yes%22%5D%28%7B%7Bbbox%7D%7D%29%3B%0A%20%20%20%20nwr%5B%22amenity%22%3D%22restaurant%22%5D%5B%22dog%22%3D%22unleashed%22%5D%28%7B%7Bbbox%7D%7D%29%3B%0A%20%20%20%20nwr%5B%22amenity%22%3D%22restaurant%22%5D%5B%22dog%22%3D%22leashed%22%5D%28%7B%7Bbbox%7D%7D%29%3B%0A%20%20%20%20nwr%5B%22amenity%22%3D%22restaurant%22%5D%5B%22dog%22%3D%22yes%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 | +-----|-----|----- | +| [name](https://wiki.openstreetmap.org/wiki/Key:name) | [string](../SpecialInputElements.md#string) | | +| [amenity](https://wiki.openstreetmap.org/wiki/Key:amenity) | Multiple choice | [fast_food](https://wiki.openstreetmap.org/wiki/Tag:amenity%3Dfast_food) [restaurant](https://wiki.openstreetmap.org/wiki/Tag:amenity%3Drestaurant) | +| [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) | [opening_hours](../SpecialInputElements.md#opening_hours) | | +| [website](https://wiki.openstreetmap.org/wiki/Key:website) | [url](../SpecialInputElements.md#url) | | +| [email](https://wiki.openstreetmap.org/wiki/Key:email) | [email](../SpecialInputElements.md#email) | | +| [phone](https://wiki.openstreetmap.org/wiki/Key:phone) | [phone](../SpecialInputElements.md#phone) | | +| [level](https://wiki.openstreetmap.org/wiki/Key:level) | [float](../SpecialInputElements.md#float) | [0](https://wiki.openstreetmap.org/wiki/Tag:level%3D0) [1](https://wiki.openstreetmap.org/wiki/Tag:level%3D1) [-1](https://wiki.openstreetmap.org/wiki/Tag:level%3D-1) | +| [wheelchair](https://wiki.openstreetmap.org/wiki/Key:wheelchair) | Multiple choice | [designated](https://wiki.openstreetmap.org/wiki/Tag:wheelchair%3Ddesignated) [yes](https://wiki.openstreetmap.org/wiki/Tag:wheelchair%3Dyes) [limited](https://wiki.openstreetmap.org/wiki/Tag:wheelchair%3Dlimited) [no](https://wiki.openstreetmap.org/wiki/Tag:wheelchair%3Dno) | +| [cuisine](https://wiki.openstreetmap.org/wiki/Key:cuisine) | [string](../SpecialInputElements.md#string) | [pizza](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dpizza) [friture](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dfriture) [pasta](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dpasta) [kebab](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dkebab) [sandwich](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dsandwich) [burger](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dburger) [sushi](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dsushi) [coffee](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dcoffee) [italian](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Ditalian) [french](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dfrench) [chinese](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dchinese) [greek](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dgreek) [indian](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dindian) [turkish](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dturkish) [thai](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dthai) [mexican ](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dmexican ) [japanese ](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Djapanese ) [chicken ](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dchicken ) [seafood ](https://wiki.openstreetmap.org/wiki/Tag:cuisine%3Dseafood ) | +| [website:menu](https://wiki.openstreetmap.org/wiki/Key:website:menu) | [url](../SpecialInputElements.md#url) | | +| [reservation](https://wiki.openstreetmap.org/wiki/Key:reservation) | Multiple choice | [required](https://wiki.openstreetmap.org/wiki/Tag:reservation%3Drequired) [recommended](https://wiki.openstreetmap.org/wiki/Tag:reservation%3Drecommended) [yes](https://wiki.openstreetmap.org/wiki/Tag:reservation%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:reservation%3Dno) | +| [takeaway](https://wiki.openstreetmap.org/wiki/Key:takeaway) | Multiple choice | [only](https://wiki.openstreetmap.org/wiki/Tag:takeaway%3Donly) [yes](https://wiki.openstreetmap.org/wiki/Tag:takeaway%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:takeaway%3Dno) | +| [delivery](https://wiki.openstreetmap.org/wiki/Key:delivery) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:delivery%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:delivery%3Dno) | +| [drive_through](https://wiki.openstreetmap.org/wiki/Key:drive_through) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:drive_through%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:drive_through%3Dno) | +| [opening_hours:drive_through](https://wiki.openstreetmap.org/wiki/Key:opening_hours:drive_through) | [opening_hours](../SpecialInputElements.md#opening_hours) | [](https://wiki.openstreetmap.org/wiki/Tag:opening_hours:drive_through%3D) | +| [diet:vegetarian](https://wiki.openstreetmap.org/wiki/Key:diet:vegetarian) | Multiple choice | [no](https://wiki.openstreetmap.org/wiki/Tag:diet:vegetarian%3Dno) [limited](https://wiki.openstreetmap.org/wiki/Tag:diet:vegetarian%3Dlimited) [yes](https://wiki.openstreetmap.org/wiki/Tag:diet:vegetarian%3Dyes) [only](https://wiki.openstreetmap.org/wiki/Tag:diet:vegetarian%3Donly) [on_demand](https://wiki.openstreetmap.org/wiki/Tag:diet:vegetarian%3Don_demand) | +| [diet:vegan](https://wiki.openstreetmap.org/wiki/Key:diet:vegan) | Multiple choice | [no](https://wiki.openstreetmap.org/wiki/Tag:diet:vegan%3Dno) [limited](https://wiki.openstreetmap.org/wiki/Tag:diet:vegan%3Dlimited) [yes](https://wiki.openstreetmap.org/wiki/Tag:diet:vegan%3Dyes) [only](https://wiki.openstreetmap.org/wiki/Tag:diet:vegan%3Donly) [on_demand](https://wiki.openstreetmap.org/wiki/Tag:diet:vegan%3Don_demand) | +| [diet:halal](https://wiki.openstreetmap.org/wiki/Key:diet:halal) | Multiple choice | [no](https://wiki.openstreetmap.org/wiki/Tag:diet:halal%3Dno) [limited](https://wiki.openstreetmap.org/wiki/Tag:diet:halal%3Dlimited) [yes](https://wiki.openstreetmap.org/wiki/Tag:diet:halal%3Dyes) [only](https://wiki.openstreetmap.org/wiki/Tag:diet:halal%3Donly) | +| [organic](https://wiki.openstreetmap.org/wiki/Key:organic) | Multiple choice | [no](https://wiki.openstreetmap.org/wiki/Tag:organic%3Dno) [yes](https://wiki.openstreetmap.org/wiki/Tag:organic%3Dyes) [only](https://wiki.openstreetmap.org/wiki/Tag:organic%3Donly) | +| [diet:vegetarian](https://wiki.openstreetmap.org/wiki/Key:diet:vegetarian) | Multiple choice | [only](https://wiki.openstreetmap.org/wiki/Tag:diet:vegetarian%3Donly) [yes](https://wiki.openstreetmap.org/wiki/Tag:diet:vegetarian%3Dyes) [limited](https://wiki.openstreetmap.org/wiki/Tag:diet:vegetarian%3Dlimited) [no](https://wiki.openstreetmap.org/wiki/Tag:diet:vegetarian%3Dno) | +| [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) | +| [organic](https://wiki.openstreetmap.org/wiki/Key:organic) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:organic%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:organic%3Dno) [only](https://wiki.openstreetmap.org/wiki/Tag:organic%3Donly) | +| [friture:oil](https://wiki.openstreetmap.org/wiki/Key:friture:oil) | Multiple choice | [vegetable](https://wiki.openstreetmap.org/wiki/Tag:friture:oil%3Dvegetable) [animal](https://wiki.openstreetmap.org/wiki/Tag:friture:oil%3Danimal) | +| [reusable_packaging:accept](https://wiki.openstreetmap.org/wiki/Key:reusable_packaging:accept) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:reusable_packaging:accept%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:reusable_packaging:accept%3Dno) [only](https://wiki.openstreetmap.org/wiki/Tag:reusable_packaging:accept%3Donly) | +| [diet:sugar_free](https://wiki.openstreetmap.org/wiki/Key:diet:sugar_free) | Multiple choice | [only](https://wiki.openstreetmap.org/wiki/Tag:diet:sugar_free%3Donly) [yes](https://wiki.openstreetmap.org/wiki/Tag:diet:sugar_free%3Dyes) [limited](https://wiki.openstreetmap.org/wiki/Tag:diet:sugar_free%3Dlimited) [no](https://wiki.openstreetmap.org/wiki/Tag:diet:sugar_free%3Dno) | +| [diet:gluten_free](https://wiki.openstreetmap.org/wiki/Key:diet:gluten_free) | Multiple choice | [only](https://wiki.openstreetmap.org/wiki/Tag:diet:gluten_free%3Donly) [yes](https://wiki.openstreetmap.org/wiki/Tag:diet:gluten_free%3Dyes) [limited](https://wiki.openstreetmap.org/wiki/Tag:diet:gluten_free%3Dlimited) [no](https://wiki.openstreetmap.org/wiki/Tag:diet:gluten_free%3Dno) | +| [diet:lactose_free](https://wiki.openstreetmap.org/wiki/Key:diet:lactose_free) | Multiple choice | [only](https://wiki.openstreetmap.org/wiki/Tag:diet:lactose_free%3Donly) [yes](https://wiki.openstreetmap.org/wiki/Tag:diet:lactose_free%3Dyes) [limited](https://wiki.openstreetmap.org/wiki/Tag:diet:lactose_free%3Dlimited) [no](https://wiki.openstreetmap.org/wiki/Tag:diet:lactose_free%3Dno) | +| [smoking](https://wiki.openstreetmap.org/wiki/Key:smoking) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:smoking%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:smoking%3Dno) [outside](https://wiki.openstreetmap.org/wiki/Tag:smoking%3Doutside) | +| [service:electricity](https://wiki.openstreetmap.org/wiki/Key:service:electricity) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:service:electricity%3Dyes) [limited](https://wiki.openstreetmap.org/wiki/Tag:service:electricity%3Dlimited) [ask](https://wiki.openstreetmap.org/wiki/Tag:service:electricity%3Dask) [no](https://wiki.openstreetmap.org/wiki/Tag:service:electricity%3Dno) | +| [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) | +| [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) [terminal;wifi](https://wiki.openstreetmap.org/wiki/Tag:internet_access%3Dterminal;wifi) | +| [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) | + +### 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()}* + +### reviews +Shows the reviews module (including the possibility to leave a review) +_This tagrendering has no question and is thus read-only_ +*{create_review()}{list_reviews()}* + +### Name + +The question is `What is the name of this business?` +*The name of this business is {name}* is shown if `name` is set + +### Fastfood vs restaurant + +The question is `What type of business is this?` + + - *This is a fast-food business, focused on fast service. If seating is available, it is rather limited and functional.* is shown if with amenity=fast_food + - *A restaurant, focused on creating a nice experience where one is served at the table* is shown if with amenity=restaurant + +### opening_hours + +The question is `What are the opening hours of {title()}?` +*

Opening hours

{opening_hours_table(opening_hours)}* is shown if `opening_hours` is set + + - *Marked as closed for an unspecified time* is shown if with opening_hours=closed. _This option cannot be chosen as answer_ + +### website + +The question is `What is the website of {title()}?` +*{website}* is shown if `website` is set + + - *{contact:website}* is shown if with contact:website~.+. _This option cannot be chosen as answer_ + +This tagrendering has labels +`contact` + +### email + +The question is `What is the email address of {title()}?` +*{email}* is shown if `email` is set + + - *{contact:email}* is shown if with contact:email~.+. _This option cannot be chosen as answer_ + - *{operator:email}* is shown if with operator:email~.+. _This option cannot be chosen as answer_ + +This tagrendering has labels +`contact` + +### phone + +The question is `What is the phone number of {title()}?` +*{link(&LBRACEphone&RBRACE,tel:&LBRACEphone&RBRACE,,,,)}* is shown if `phone` is set + + - *{link(&LBRACEcontact:phone&RBRACE,tel:&LBRACEcontact:phone&RBRACE,,,,)}* is shown if with contact:phone~.+. _This option cannot be chosen as answer_ + +This tagrendering has labels +`contact` + +### payment-options + +The question is `Which methods of payment are accepted here?` + + - *Cash is accepted here* is shown if with payment:cash=yes. Unselecting this answer will add payment:cash=no + - *Payment cards are accepted here* is shown if with payment:cards=yes. Unselecting this answer will add payment:cards=no + - *Payment by QR-code is possible here* is shown if with payment:qr_code=yes. Unselecting this answer will add payment:qr_code=no + +### repeated + +_This tagrendering has no question and is thus read-only_ +*Multiple, identical objects can be found on floors {repeat_on}.* + +This tagrendering is only visible in the popup if the following condition is met: repeat_on~.+ +This tagrendering has labels +`level` + +### single_level + +The question is `On what level is this feature located?` +*Located on the {level}th floor* is shown if `level` is set + + - *Located underground* is shown if with location=underground. _This option cannot be chosen as answer_ + - *Located on the ground floor* is shown if with level=0 + - *Located on the ground floor* is shown if with level=. _This option cannot be chosen as answer_ + - *Located on the first floor* is shown if with level=1 + - *Located on the first basement level* is shown if with level=-1 + +This tagrendering has labels +`level` + +### wheelchair-access + +The question is `Is this place accessible with a wheelchair?` + + - *This place is specially adapted for wheelchair users* is shown if with wheelchair=designated + - *This place is easily reachable with a wheelchair* is shown if with wheelchair=yes + - *It is possible to reach this place in a wheelchair, but it is not easy* is shown if with wheelchair=limited + - *This place is not reachable with a wheelchair* is shown if with wheelchair=no + +### Cuisine + +The question is `What kind of food is served here?` +*This place mostly serves {cuisine}* is shown if `cuisine` is set + + - *Pizzeria* is shown if with cuisine=pizza + - *Friture* is shown if with cuisine=friture + - *Serves mainly pasta* is shown if with cuisine=pasta + - *Kebab shop* is shown if with cuisine=kebab + - *Sandwich shop* is shown if with cuisine=sandwich + - *Burgersrestaurant* is shown if with cuisine=burger + - *Sushi restaurant* is shown if with cuisine=sushi + - *Coffeebar* is shown if with cuisine=coffee + - *Italian restaurant (which serves more than pasta and pizza)* is shown if with cuisine=italian + - *French restaurant* is shown if with cuisine=french + - *Chinese* is shown if with cuisine=chinese + - *Greek* is shown if with cuisine=greek + - *Indian* is shown if with cuisine=indian + - *Turkish restaurant* is shown if with cuisine=turkish + - *Thai restaurant* is shown if with cuisine=thai + - *Mexican dishes are served here* is shown if with cuisine=mexican + - *Japanese dishes are served here* is shown if with cuisine=japanese + - *Chicken based dishes are served here* is shown if with cuisine=chicken + - *Seafood dishes are served here* is shown if with cuisine=seafood + +### show-menu-image + +_This tagrendering has no question and is thus read-only_ +*{image_carousel(image:menu)}* + +### add-menu-image + +_This tagrendering has no question and is thus read-only_ +*{image_upload(image:menu,Add an image from the menu,)}* + +### 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 + +### Reservation + +The question is `Is a reservation required for this place?` + + - *A reservation is required at this place* is shown if with reservation=required + - *A reservation is not required, but still recommended to make sure you get a table* is shown if with reservation=recommended + - *Reservation is possible at this place* is shown if with reservation=yes + - *Reservation is not possible at this place* is shown if with reservation=no + +### Takeaway + +The question is `Does this place offer take-away?` + + - *This is a take-away only business* is shown if with takeaway=only + - *Take-away is possible here* is shown if with takeaway=yes + - *Take-away is not possible here* is shown if with takeaway=no + +### delivery + +The question is `Does {title()} deliver food to your home?` + + - *This business does home delivery (possibly via a third party)* is shown if with delivery=yes + - *This business does not deliver at home* is shown if with delivery=no + +### drive-through + +The question is `Does this fast-food restaurant have a drive-through?` + + - *This fast-food restaurant has a drive-through* is shown if with drive_through=yes + - *This fast-food restaurant does not have a drive-through* is shown if with drive_through=no + +This tagrendering is only visible in the popup if the following condition is met: amenity=fast_food + +### drive-through-opening_hours + +The question is `What are the opening hours of the drive-through?` +*

Drive-through opening hours

{opening_hours_table(opening_hours:drive_through)}* is shown if `opening_hours:drive_through` is set + + - *The opening hours of the drive-through are the same as the restaurant* is shown if with opening_hours:drive_through= + +This tagrendering is only visible in the popup if the following condition is met: drive_through=yes + +### Vegetarian (no friture) + +The question is `Does this restaurant have a vegetarian option?` + + - *No vegetarian options are available* is shown if with diet:vegetarian=no + - *Some vegetarian options are available* is shown if with diet:vegetarian=limited + - *Vegetarian options are available* is shown if with diet:vegetarian=yes + - *All dishes are vegetarian* is shown if with diet:vegetarian=only + - *Some dishes might be adapted to a vegetarian version, but this should be demanded* is shown if with diet:vegetarian=on_demand + +### Vegan (no friture) + +The question is `Does this business serve vegan meals?` + + - *No vegan options available* is shown if with diet:vegan=no + - *Some vegan options are available* is shown if with diet:vegan=limited + - *Vegan options are available* is shown if with diet:vegan=yes + - *All dishes are vegan* is shown if with diet:vegan=only + - *Some dishes might be adapted to a vegan version if asked for* is shown if with diet:vegan=on_demand + +### halal (no friture) + +The question is `Does this restaurant offer a halal menu?` + + - *There are no halal options available* is shown if with diet:halal=no + - *There is a small halal menu* is shown if with diet:halal=limited + - *There is a halal menu* is shown if with diet:halal=yes + - *Only halal options are available* is shown if with diet:halal=only + +### organic (no friture) + +The question is `Does this restaurant offer organic food?` + + - *There are no organic options available* is shown if with organic=no + - *There is an organic menu* is shown if with organic=yes + - *Only organic options are available* is shown if with organic=only + +### friture-vegetarian + +The question is `Does this fries shop have vegetarian snacks?` + + - *Serves only vegetarian snacks and burgers* is shown if with diet:vegetarian=only + - *Vegetarian snacks are available* is shown if with diet:vegetarian=yes + - *Only a small selection of snacks are vegetarian* is shown if with diet:vegetarian=limited + - *No vegetarian snacks are available* is shown if with diet:vegetarian=no + +This tagrendering is only visible in the popup if the following condition is met: cuisine=friture + +### friture-vegan + +The question is `Does this fries shop have vegan snacks?` + + - *Serves only vegan snacks and burgers* is shown if with diet:vegan=only + - *Vegan snacks are available* is shown if with diet:vegan=yes + - *A small selection of vegan snacks are available* is shown if with diet:vegan=limited + - *No vegan snacks are available* is shown if with diet:vegan=no + +This tagrendering is only visible in the popup if the following condition is met: cuisine=friture + +### friture-organic + +The question is `Does this fries shop offer organic snacks?` + + - *Organic snacks are available* is shown if with organic=yes + - *No organic snacks are available* is shown if with organic=no + - *Only organic snacks are available* is shown if with organic=only + +This tagrendering is only visible in the popup if the following condition is met: cuisine=friture + +### friture-oil + +The question is `Does this fries shop use vegetable or animal oil for cooking?` + + - *The frying is done with vegetable oil* is shown if with friture:oil=vegetable + - *The frying is done with animal oil* is shown if with friture:oil=animal + +This tagrendering is only visible in the popup if the following condition is met: cuisine=friture + +### friture-take-your-container + +The question is `If you bring your own container (such as a cooking pot and small pots), is it used to package your order?` + + - *You can bring your own containers to get your order, saving on single-use packaging material and thus waste* is shown if with reusable_packaging:accept=yes + - *Bringing your own container is not allowed* is shown if with reusable_packaging:accept=no + - *You must bring your own container to order here.* is shown if with reusable_packaging:accept=only + +This tagrendering is only visible in the popup if the following condition is met: cuisine=friture + +### sugar_free + +The question is `Does this shop have a sugar free offering?` + + - *This shop only sells sugar free products* is shown if with diet:sugar_free=only + - *This shop has a big sugar free offering* is shown if with diet:sugar_free=yes + - *This shop has a limited sugar free offering* is shown if with diet:sugar_free=limited + - *This shop has no sugar free offering* is shown if with diet:sugar_free=no + +This tagrendering has labels +`diets` + +### gluten_free + +The question is `Does this shop have a gluten free offering?` + + - *This shop only sells gluten free products* is shown if with diet:gluten_free=only + - *This shop has a big gluten free offering* is shown if with diet:gluten_free=yes + - *This shop has a limited gluten free offering* is shown if with diet:gluten_free=limited + - *This shop has no gluten free offering* is shown if with diet:gluten_free=no + +This tagrendering has labels +`diets` + +### lactose_free + +The question is `Does {title()} have a lactose-free offering?` + + - *Only sells lactose free products* is shown if with diet:lactose_free=only + - *Big lactose free offering* is shown if with diet:lactose_free=yes + - *Limited lactose free offering* is shown if with diet:lactose_free=limited + - *No lactose free offering* is shown if with diet:lactose_free=no + +This tagrendering has labels +`diets` + +### smoking + +The question is `Is smoking allowed at {title()}?` + + - *Smoking is allowed* is shown if with smoking=yes + - *Smoking is not allowed* is shown if with smoking=no + - *Smoking is allowed outside.* is shown if with smoking=outside + +### service:electricity + +The question is `Does this amenity have electrical outlets, available to customers when they are inside?` + + - *There are plenty of domestic sockets available to customers seated indoors, where they can charge their electronics* is shown if with service:electricity=yes + - *There are a few domestic sockets available to customers seated indoors, where they can charge their electronics* is shown if with service:electricity=limited + - *There are no sockets available indoors to customers, but charging might be possible if the staff is asked* is shown if with service:electricity=ask + - *There are a no domestic sockets available to customers seated indoors* is shown if with service:electricity=no + +### seating + +The question is `What kind of seating does {title()} have?` + + - *This place has outdoor seating* is shown if with outdoor_seating=yes. Unselecting this answer will add outdoor_seating=no + - *This place has indoor seating* is shown if with indoor_seating=yes. Unselecting this answer will add indoor_seating=no + +### 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 + +### internet + +The question is `Does this place offer internet access?` + + - *This place offers wireless internet access* is shown if with internet_access=wlan + - *This place does not offer internet access* is shown if with internet_access=no + - *This place offers internet access* is shown if with internet_access=yes. _This option cannot be chosen as answer_ + - *This place offers internet access via a terminal or computer* is shown if with internet_access=terminal + - *This place offers wired internet access* is shown if with internet_access=wired + - *This place offers both wireless internet and internet access via a terminal or computer* is shown if with internet_access=terminal;wifi + +This tagrendering has labels +`internet-all` + +### internet-fee + +The question is `Is there a fee for internet access?` + + - *There is a fee for the internet access at this place* is shown if with internet_access:fee=yes + - *Internet access is free at this place* is shown if with internet_access:fee=no + - *Internet access is free at this place, for customers only* is shown if with internet_access:fee=customers + +This tagrendering is only visible in the popup if the following condition is met: internet_access!=no & internet_access~.+ +This tagrendering has labels +`internet-all` + +### internet-ssid + +The question is `What is the network name for the wireless internet access?` +*The network name is {internet_access:ssid}* is shown if `internet_access:ssid` is set + + - *Telekom* is shown if with internet_access:ssid=Telekom + +This tagrendering is only visible in the popup if the following condition is met: internet_access~^(.*wlan.*)$ +This tagrendering has labels +`internet-all` + +### 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 | +-----|-----|----- | +| open_now.0 | Now open | _isOpen=yes | + +| id | question | osmTags | +-----|-----|----- | +| reservation.0 | Reservation not required | reservation=no | reservation=optional | reservation= | + +| id | question | osmTags | +-----|-----|----- | +| food-category.0 | *Restaurants and fast food businesses* (default) | | +| food-category.1 | Only fastfood businesses | amenity=fast_food | +| food-category.2 | Only restaurants | amenity=restaurant | + +| id | question | osmTags | +-----|-----|----- | +| vegetarian.0 | Has a vegetarian menu | diet:vegetarian=yes | diet:vegetarian=only | diet:vegan=yes | diet:vegan=only | + +| id | question | osmTags | +-----|-----|----- | +| vegan.0 | Has a vegan menu | diet:vegan=yes | diet:vegan=only | + +| id | question | osmTags | +-----|-----|----- | +| halal.0 | Has a halal menu | diet:halal=yes | diet:halal=only | + +| id | question | osmTags | +-----|-----|----- | +| has_organic.0 | Has organic options | organic=yes | organic=only | + +| id | question | osmTags | +-----|-----|----- | +| sugar_free.0 | Has a sugar-free offering | diet:sugar_free=yes | diet:sugar_free=only | diet:sugar_free=limited | + +| id | question | osmTags | +-----|-----|----- | +| gluten_free.0 | Has a gluten free offering | diet:gluten_free=yes | diet:gluten_free=only | diet:gluten_free=limited | + +| id | question | osmTags | +-----|-----|----- | +| lactose_free.0 | Has a lactose free offering | diet:lactose_free=yes | diet:lactose_free=only | diet:lactose_free=limited | + +| id | question | osmTags | +-----|-----|----- | +| outdoor_seating.0 | Has outdoor seating | outdoor_seating=yes | + +| id | question | osmTags | +-----|-----|----- | +| indoor_seating.0 | Has indoor seating | indoor_seating=yes | + +| id | question | osmTags | +-----|-----|----- | +| accepts_cash.0 | Accepts cash | payment:cash=yes | + +| id | question | osmTags | +-----|-----|----- | +| accepts_cards.0 | Accepts payment cards | payment:cards=yes | + +| id | question | osmTags | +-----|-----|----- | +| dogs.0 | *No preference towards dogs* (default) | | +| dogs.1 | Dogs allowed | dog=unleashed | dog=yes | +| dogs.2 | No dogs allowed | dog=no | + +| id | question | osmTags | +-----|-----|----- | +| Cuisine.0 | *What kind of food is served here?* (default) | | +| Cuisine.1 | Pizzeria | cuisine=pizza | +| Cuisine.2 | Friture | cuisine=friture | +| Cuisine.3 | Serves mainly pasta | cuisine=pasta | +| Cuisine.4 | Kebab shop | cuisine=kebab | +| Cuisine.5 | Sandwich shop | cuisine=sandwich | +| Cuisine.6 | Burgersrestaurant | cuisine=burger | +| Cuisine.7 | Sushi restaurant | cuisine=sushi | +| Cuisine.8 | Coffeebar | cuisine=coffee | +| Cuisine.9 | Italian restaurant (which serves more than pasta and pizza) | cuisine=italian | +| Cuisine.10 | French restaurant | cuisine=french | +| Cuisine.11 | Chinese | cuisine=chinese | +| Cuisine.12 | Greek | cuisine=greek | +| Cuisine.13 | Indian | cuisine=indian | +| Cuisine.14 | Turkish restaurant | cuisine=turkish | +| Cuisine.15 | Thai restaurant | cuisine=thai | +| Cuisine.16 | Mexican dishes are served here | cuisine=mexican | +| Cuisine.17 | Japanese dishes are served here | cuisine=japanese | +| Cuisine.18 | Chicken based dishes are served here | cuisine=chicken | +| Cuisine.19 | Seafood dishes are served here | cuisine=seafood | + +| id | question | osmTags | +-----|-----|----- | +| has_internet.0 | Offers internet | internet_access=wlan | internet_access=yes | internet_access=wired | + + + +This document is autogenerated from [assets/themes/pets/pets.json](https://github.com/pietervdvn/MapComplete/blob/develop/assets/themes/pets/pets.json) diff --git a/Docs/Layers/shop_dog_friendly.md b/Docs/Layers/shop_dog_friendly.md new file mode 100644 index 0000000000..46fe2412c0 --- /dev/null +++ b/Docs/Layers/shop_dog_friendly.md @@ -0,0 +1,937 @@ +[//]: # (WARNING: this file is automatically generated. Please find the sources at the bottom and edit those sources) + +# shop_dog_friendly + +This layer is based on [shops](../Layers/shops.md) + +A shop + + - This layer is shown at zoomlevel **15** 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) + - [images](#images) + - [reviews](#reviews) + - [shops-name](#shops-name) + - [shop_types](#shop_types) + - [brand](#brand) + - [second_hand](#second_hand) + - [opening_hours](#opening_hours) + - [Opening hours](#opening-hours) + - [website](#website) + - [email](#email) + - [phone](#phone) + - [payment-options](#payment-options) + - [repeated](#repeated) + - [single_level](#single_level) + - [copyshop-print-sizes](#copyshop-print-sizes) + - [copyshop-binding](#copyshop-binding) + - [optometrist_service](#optometrist_service) + - [key_cutter](#key_cutter) + - [sells_new_bikes](#sells_new_bikes) + - [bike_second_hand](#bike_second_hand) + - [repairs_bikes](#repairs_bikes) + - [bicycle_rental](#bicycle_rental) + - [bicycle-types](#bicycle-types) + - [rental-capacity-city_bike](#rental-capacity-city_bike) + - [rental-capacity-ebike](#rental-capacity-ebike) + - [rental-capacity-kid_bike](#rental-capacity-kid_bike) + - [rental-capacity-bmx](#rental-capacity-bmx) + - [rental-capacity-mtb](#rental-capacity-mtb) + - [rental-capacity-bicycle_pannier](#rental-capacity-bicycle_pannier) + - [rental-capacity-tandem_bicycle](#rental-capacity-tandem_bicycle) + - [bike_pump_service](#bike_pump_service) + - [bike_repair_tools](#bike_repair_tools) + - [bike_wash](#bike_wash) + - [bike_cleaning-service_bicycle_cleaning_charge](#bike_cleaning-service_bicycle_cleaning_charge) + - [internet](#internet) + - [internet-fee](#internet-fee) + - [internet-ssid](#internet-ssid) + - [organic](#organic) + - [sugar_free](#sugar_free) + - [gluten_free](#gluten_free) + - [lactose_free](#lactose_free) + - [dog-access](#dog-access) + - [description](#description) + - [leftover-questions](#leftover-questions) + - [move-button](#move-button) + - [delete-button](#delete-button) + - [lod](#lod) +4. [Filters](#filters) + +## Themes using this layer + + - [pets](https://mapcomplete.org/pets) + +## Basic tags for this layer + +Elements must match **all** of the following expressions: + +0. craft=shoe_repair | craft=key_cutter | shop~.+ +1. dog=leashed | dog=yes +2. shop!=mall + +[Execute on overpass](http://overpass-turbo.eu/?Q=%5Bout%3Ajson%5D%5Btimeout%3A90%5D%3B%28%20%20%20%20nwr%5B%22craft%22%3D%22shoe_repair%22%5D%5B%22dog%22%3D%22leashed%22%5D%5B%22shop%22!%3D%22mall%22%5D%28%7B%7Bbbox%7D%7D%29%3B%0A%20%20%20%20nwr%5B%22craft%22%3D%22shoe_repair%22%5D%5B%22dog%22%3D%22yes%22%5D%5B%22shop%22!%3D%22mall%22%5D%28%7B%7Bbbox%7D%7D%29%3B%0A%20%20%20%20nwr%5B%22craft%22%3D%22key_cutter%22%5D%5B%22dog%22%3D%22leashed%22%5D%5B%22shop%22!%3D%22mall%22%5D%28%7B%7Bbbox%7D%7D%29%3B%0A%20%20%20%20nwr%5B%22craft%22%3D%22key_cutter%22%5D%5B%22dog%22%3D%22yes%22%5D%5B%22shop%22!%3D%22mall%22%5D%28%7B%7Bbbox%7D%7D%29%3B%0A%20%20%20%20nwr%5B%22shop%22%5D%5B%22dog%22%3D%22leashed%22%5D%5B%22shop%22!%3D%22mall%22%5D%28%7B%7Bbbox%7D%7D%29%3B%0A%20%20%20%20nwr%5B%22shop%22%5D%5B%22dog%22%3D%22yes%22%5D%5B%22shop%22!%3D%22mall%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 | +-----|-----|----- | +| [name](https://wiki.openstreetmap.org/wiki/Key:name) | [string](../SpecialInputElements.md#string) | | +| [shop](https://wiki.openstreetmap.org/wiki/Key:shop) | [string](../SpecialInputElements.md#string) | [bicycle_rental](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbicycle_rental) [agrarian](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dagrarian) [alcohol](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dalcohol) [anime](https://wiki.openstreetmap.org/wiki/Tag:shop%3Danime) [antiques](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dantiques) [appliance](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dappliance) [art](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dart) [baby_goods](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbaby_goods) [bag](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbag) [bakery](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbakery) [bathroom_furnishing](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbathroom_furnishing) [beauty](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbeauty) [bed](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbed) [beverages](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbeverages) [bicycle](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbicycle) [boat](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dboat) [bookmaker](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbookmaker) [books](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbooks) [brewing_supplies](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbrewing_supplies) [butcher](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dbutcher) [camera](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcamera) [candles](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcandles) [cannabis](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcannabis) [car](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcar) [car_parts](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcar_parts) [car_repair](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcar_repair) [caravan](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcaravan) [carpet](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcarpet) [catalogue](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcatalogue) [charity](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcharity) [cheese](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcheese) [chemist](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dchemist) [chocolate](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dchocolate) [clothes](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dclothes) [coffee](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcoffee) [collector](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcollector) [computer](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcomputer) [confectionery](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dconfectionery) [convenience](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dconvenience) [copyshop](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcopyshop) [cosmetics](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcosmetics) [country_store](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcountry_store) [craft](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcraft) [curtain](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dcurtain) [dairy](https://wiki.openstreetmap.org/wiki/Tag:shop%3Ddairy) [deli](https://wiki.openstreetmap.org/wiki/Tag:shop%3Ddeli) [department_store](https://wiki.openstreetmap.org/wiki/Tag:shop%3Ddepartment_store) [doityourself](https://wiki.openstreetmap.org/wiki/Tag:shop%3Ddoityourself) [doors](https://wiki.openstreetmap.org/wiki/Tag:shop%3Ddoors) [dry_cleaning](https://wiki.openstreetmap.org/wiki/Tag:shop%3Ddry_cleaning) [e-cigarette](https://wiki.openstreetmap.org/wiki/Tag:shop%3De-cigarette) [electrical](https://wiki.openstreetmap.org/wiki/Tag:shop%3Delectrical) [electronics](https://wiki.openstreetmap.org/wiki/Tag:shop%3Delectronics) [erotic](https://wiki.openstreetmap.org/wiki/Tag:shop%3Derotic) [fabric](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfabric) [farm](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfarm) [fashion_accessories](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfashion_accessories) [fireplace](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfireplace) [fishing](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfishing) [flooring](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dflooring) [florist](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dflorist) [frame](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dframe) [frozen_food](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfrozen_food) [fuel](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfuel) [funeral_directors](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfuneral_directors) [furniture](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dfurniture) [games](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dgames) [garden_centre](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dgarden_centre) [gas](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dgas) [general](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dgeneral) [gift](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dgift) [greengrocer](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dgreengrocer) [hairdresser](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhairdresser) [hairdresser_supply](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhairdresser_supply) [hardware](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhardware) [health_food](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhealth_food) [hearing_aids](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhearing_aids) [herbalist](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dherbalist) [hifi](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhifi) [honey](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhoney) [household_linen](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhousehold_linen) [houseware](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhouseware) [hunting](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dhunting) [interior_decoration](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dinterior_decoration) [jewelry](https://wiki.openstreetmap.org/wiki/Tag:shop%3Djewelry) [kiosk](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dkiosk) [kitchen](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dkitchen) [laundry](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dlaundry) [leather](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dleather) [lighting](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dlighting) [locksmith](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dlocksmith) [lottery](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dlottery) [mall](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmall) [massage](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmassage) [medical_supply](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmedical_supply) [military_surplus](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmilitary_surplus) [mobile_phone](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmobile_phone) [model](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmodel) [money_lender](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmoney_lender) [motorcycle](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmotorcycle) [motorcycle_repair](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmotorcycle_repair) [music](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmusic) [musical_instrument](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dmusical_instrument) [newsagent](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dnewsagent) [nutrition_supplements](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dnutrition_supplements) [nuts](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dnuts) [optician](https://wiki.openstreetmap.org/wiki/Tag:shop%3Doptician) [outdoor](https://wiki.openstreetmap.org/wiki/Tag:shop%3Doutdoor) [outpost](https://wiki.openstreetmap.org/wiki/Tag:shop%3Doutpost) [paint](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpaint) [party](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dparty) [pasta](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpasta) [pastry](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpastry) [pawnbroker](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpawnbroker) [perfumery](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dperfumery) [pet](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpet) [pet_grooming](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpet_grooming) [photo](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dphoto) [pottery](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpottery) [printer_ink](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dprinter_ink) [psychic](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpsychic) [pyrotechnics](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dpyrotechnics) [radiotechnics](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dradiotechnics) [religion](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dreligion) [rental](https://wiki.openstreetmap.org/wiki/Tag:shop%3Drental) [repair](https://wiki.openstreetmap.org/wiki/Tag:shop%3Drepair) [rice](https://wiki.openstreetmap.org/wiki/Tag:shop%3Drice) [scuba_diving](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dscuba_diving) [seafood](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dseafood) [second_hand](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dsecond_hand) [sewing](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dsewing) [shoe_repair](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dshoe_repair) [shoes](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dshoes) [spices](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dspices) [sports](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dsports) [stationery](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dstationery) [storage_rental](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dstorage_rental) [supermarket](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dsupermarket) [swimming_pool](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dswimming_pool) [tailor](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtailor) [tattoo](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtattoo) [tea](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtea) [telecommunication](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtelecommunication) [ticket](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dticket) [tiles](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtiles) [tobacco](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtobacco) [tool_hire](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtool_hire) [toys](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtoys) [trade](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtrade) [travel_agency](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtravel_agency) [trophy](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtrophy) [tyres](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dtyres) [vacuum_cleaner](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dvacuum_cleaner) [variety_store](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dvariety_store) [video](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dvideo) [video_games](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dvideo_games) [watches](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwatches) [water](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwater) [water_sports](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwater_sports) [weapons](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dweapons) [wholesale](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwholesale) [wigs](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwigs) [window_blind](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwindow_blind) [wine](https://wiki.openstreetmap.org/wiki/Tag:shop%3Dwine) | +| [brand](https://wiki.openstreetmap.org/wiki/Key:brand) | [string](../SpecialInputElements.md#string) | | +| [second_hand](https://wiki.openstreetmap.org/wiki/Key:second_hand) | Multiple choice | [only](https://wiki.openstreetmap.org/wiki/Tag:second_hand%3Donly) [yes](https://wiki.openstreetmap.org/wiki/Tag:second_hand%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:second_hand%3Dno) | +| [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) | [opening_hours](../SpecialInputElements.md#opening_hours) | | +| [website](https://wiki.openstreetmap.org/wiki/Key:website) | [url](../SpecialInputElements.md#url) | | +| [email](https://wiki.openstreetmap.org/wiki/Key:email) | [email](../SpecialInputElements.md#email) | | +| [phone](https://wiki.openstreetmap.org/wiki/Key:phone) | [phone](../SpecialInputElements.md#phone) | | +| [level](https://wiki.openstreetmap.org/wiki/Key:level) | [float](../SpecialInputElements.md#float) | [0](https://wiki.openstreetmap.org/wiki/Tag:level%3D0) [1](https://wiki.openstreetmap.org/wiki/Tag:level%3D1) [-1](https://wiki.openstreetmap.org/wiki/Tag:level%3D-1) | +| [service:binding](https://wiki.openstreetmap.org/wiki/Key:service:binding) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:service:binding%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:service:binding%3Dno) | +| [healthcare](https://wiki.openstreetmap.org/wiki/Key:healthcare) | Multiple choice | [optometrist](https://wiki.openstreetmap.org/wiki/Tag:healthcare%3Doptometrist) [audiologist](https://wiki.openstreetmap.org/wiki/Tag:healthcare%3Daudiologist) | +| [service:bicycle:retail](https://wiki.openstreetmap.org/wiki/Key:service:bicycle:retail) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:service:bicycle:retail%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:service:bicycle:retail%3Dno) | +| [service:bicycle:second_hand](https://wiki.openstreetmap.org/wiki/Key:service:bicycle:second_hand) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:service:bicycle:second_hand%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:service:bicycle:second_hand%3Dno) [only](https://wiki.openstreetmap.org/wiki/Tag:service:bicycle:second_hand%3Donly) | +| [service:bicycle:repair](https://wiki.openstreetmap.org/wiki/Key:service:bicycle:repair) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:service:bicycle:repair%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:service:bicycle:repair%3Dno) [only_sold](https://wiki.openstreetmap.org/wiki/Tag:service:bicycle:repair%3Donly_sold) [brand](https://wiki.openstreetmap.org/wiki/Tag:service:bicycle:repair%3Dbrand) | +| [service:bicycle:rental](https://wiki.openstreetmap.org/wiki/Key:service:bicycle:rental) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:service:bicycle:rental%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:service:bicycle:rental%3Dno) | +| [rental](https://wiki.openstreetmap.org/wiki/Key:rental) | [string](../SpecialInputElements.md#string) | [city_bike](https://wiki.openstreetmap.org/wiki/Tag:rental%3Dcity_bike) [ebike](https://wiki.openstreetmap.org/wiki/Tag:rental%3Debike) [bmx](https://wiki.openstreetmap.org/wiki/Tag:rental%3Dbmx) [mtb](https://wiki.openstreetmap.org/wiki/Tag:rental%3Dmtb) [kid_bike](https://wiki.openstreetmap.org/wiki/Tag:rental%3Dkid_bike) [tandem](https://wiki.openstreetmap.org/wiki/Tag:rental%3Dtandem) [racebike](https://wiki.openstreetmap.org/wiki/Tag:rental%3Dracebike) [bike_helmet](https://wiki.openstreetmap.org/wiki/Tag:rental%3Dbike_helmet) [cargo_bike](https://wiki.openstreetmap.org/wiki/Tag:rental%3Dcargo_bike) | +| [capacity:city_bike](https://wiki.openstreetmap.org/wiki/Key:capacity:city_bike) | [pnat](../SpecialInputElements.md#pnat) | | +| [capacity:ebike](https://wiki.openstreetmap.org/wiki/Key:capacity:ebike) | [pnat](../SpecialInputElements.md#pnat) | | +| [capacity:kid_bike](https://wiki.openstreetmap.org/wiki/Key:capacity:kid_bike) | [pnat](../SpecialInputElements.md#pnat) | | +| [capacity:bmx](https://wiki.openstreetmap.org/wiki/Key:capacity:bmx) | [pnat](../SpecialInputElements.md#pnat) | | +| [capacity:mtb](https://wiki.openstreetmap.org/wiki/Key:capacity:mtb) | [pnat](../SpecialInputElements.md#pnat) | | +| [capacity:bicycle_pannier](https://wiki.openstreetmap.org/wiki/Key:capacity:bicycle_pannier) | [pnat](../SpecialInputElements.md#pnat) | | +| [capacity:tandem_bicycle](https://wiki.openstreetmap.org/wiki/Key:capacity:tandem_bicycle) | [pnat](../SpecialInputElements.md#pnat) | | +| [service:bicycle:pump](https://wiki.openstreetmap.org/wiki/Key:service:bicycle:pump) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:service:bicycle:pump%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:service:bicycle:pump%3Dno) [separate](https://wiki.openstreetmap.org/wiki/Tag:service:bicycle:pump%3Dseparate) | +| [service:bicycle:diy](https://wiki.openstreetmap.org/wiki/Key:service:bicycle:diy) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:service:bicycle:diy%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:service:bicycle:diy%3Dno) [only_sold](https://wiki.openstreetmap.org/wiki/Tag:service:bicycle:diy%3Donly_sold) | +| [service:bicycle:cleaning](https://wiki.openstreetmap.org/wiki/Key:service:bicycle:cleaning) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:service:bicycle:cleaning%3Dyes) [diy](https://wiki.openstreetmap.org/wiki/Tag:service:bicycle:cleaning%3Ddiy) [no](https://wiki.openstreetmap.org/wiki/Tag:service:bicycle:cleaning%3Dno) | +| [service:bicycle:cleaning:charge](https://wiki.openstreetmap.org/wiki/Key:service:bicycle:cleaning:charge) | [string](../SpecialInputElements.md#string) | | +| [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) [terminal;wifi](https://wiki.openstreetmap.org/wiki/Tag:internet_access%3Dterminal;wifi) | +| [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) | +| [organic](https://wiki.openstreetmap.org/wiki/Key:organic) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:organic%3Dyes) [only](https://wiki.openstreetmap.org/wiki/Tag:organic%3Donly) [no](https://wiki.openstreetmap.org/wiki/Tag:organic%3Dno) | +| [diet:sugar_free](https://wiki.openstreetmap.org/wiki/Key:diet:sugar_free) | Multiple choice | [only](https://wiki.openstreetmap.org/wiki/Tag:diet:sugar_free%3Donly) [yes](https://wiki.openstreetmap.org/wiki/Tag:diet:sugar_free%3Dyes) [limited](https://wiki.openstreetmap.org/wiki/Tag:diet:sugar_free%3Dlimited) [no](https://wiki.openstreetmap.org/wiki/Tag:diet:sugar_free%3Dno) | +| [diet:gluten_free](https://wiki.openstreetmap.org/wiki/Key:diet:gluten_free) | Multiple choice | [only](https://wiki.openstreetmap.org/wiki/Tag:diet:gluten_free%3Donly) [yes](https://wiki.openstreetmap.org/wiki/Tag:diet:gluten_free%3Dyes) [limited](https://wiki.openstreetmap.org/wiki/Tag:diet:gluten_free%3Dlimited) [no](https://wiki.openstreetmap.org/wiki/Tag:diet:gluten_free%3Dno) | +| [diet:lactose_free](https://wiki.openstreetmap.org/wiki/Key:diet:lactose_free) | Multiple choice | [only](https://wiki.openstreetmap.org/wiki/Tag:diet:lactose_free%3Donly) [yes](https://wiki.openstreetmap.org/wiki/Tag:diet:lactose_free%3Dyes) [limited](https://wiki.openstreetmap.org/wiki/Tag:diet:lactose_free%3Dlimited) [no](https://wiki.openstreetmap.org/wiki/Tag:diet:lactose_free%3Dno) | +| [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) | +| [description](https://wiki.openstreetmap.org/wiki/Key:description) | [text](../SpecialInputElements.md#text) | | + +### 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()}* + +### reviews +Shows the reviews module (including the possibility to leave a review) +_This tagrendering has no question and is thus read-only_ +*{create_review()}{list_reviews()}* + +### shops-name + +The question is `What is the name of this shop?` +*This shop is called {name}* is shown if `name` is set + +### shop_types + +The question is `What kind of shop is this?` +*This is a {shop}* is shown if `shop` is set + + - *Bicycle rental shop* is shown if with shop=bicycle_rental + - *Farm Supply Shop* is shown if with shop=agrarian + - *Liquor Store* is shown if with shop=alcohol + - *Anime / Manga Shop* is shown if with shop=anime + - *Antique Shop* is shown if with shop=antiques + - *Appliance Store* is shown if with shop=appliance + - *Art Store* is shown if with shop=art + - *Baby Goods Store* is shown if with shop=baby_goods + - *Bag/Luggage Store* is shown if with shop=bag + - *Bakery* is shown if with shop=bakery + - *Bathroom Furnishing Store* is shown if with shop=bathroom_furnishing + - *Beauty Shop* is shown if with shop=beauty + - *Bedding/Mattress Store* is shown if with shop=bed + - *Beverage Store* is shown if with shop=beverages + - *Bicycle Shop* is shown if with shop=bicycle + - *Boat Store* is shown if with shop=boat + - *Bookmaker* is shown if with shop=bookmaker + - *Bookstore* is shown if with shop=books + - *Brewing Supply Store* is shown if with shop=brewing_supplies + - *Butcher* is shown if with shop=butcher + - *Camera Equipment Store* is shown if with shop=camera + - *Candle Shop* is shown if with shop=candles + - *Cannabis Shop* is shown if with shop=cannabis + - *Car Dealership* is shown if with shop=car + - *Car Parts Store* is shown if with shop=car_parts + - *Car Repair Shop* is shown if with shop=car_repair + - *RV Dealership* is shown if with shop=caravan + - *Carpet Store* is shown if with shop=carpet + - *Catalog Shop* is shown if with shop=catalogue + - *Charity Store* is shown if with shop=charity + - *Cheese Store* is shown if with shop=cheese + - *Drugstore* is shown if with shop=chemist + - *Chocolate Store* is shown if with shop=chocolate + - *Clothing Store* is shown if with shop=clothes + - *Coffee Store* is shown if with shop=coffee + - *Collectibles Shop* is shown if with shop=collector + - *Computer Store* is shown if with shop=computer + - *Candy Store* is shown if with shop=confectionery + - *Convenience Store* is shown if with shop=convenience + - *Copy Store* is shown if with shop=copyshop + - *Cosmetics Store* is shown if with shop=cosmetics + - *Rural Supplies Store* is shown if with shop=country_store + - *Arts & Crafts Store* is shown if with shop=craft + - *Curtain Store* is shown if with shop=curtain + - *Dairy Store* is shown if with shop=dairy + - *Delicatessen* is shown if with shop=deli + - *Department Store* is shown if with shop=department_store + - *DIY Store* is shown if with shop=doityourself + - *Door Shop* is shown if with shop=doors + - *Dry Cleaner* is shown if with shop=dry_cleaning + - *E-Cigarette Shop* is shown if with shop=e-cigarette + - *Electrical Equipment Store* is shown if with shop=electrical + - *Electronics Store* is shown if with shop=electronics + - *Erotic Store* is shown if with shop=erotic + - *Fabric Store* is shown if with shop=fabric + - *Produce Stand* is shown if with shop=farm + - *Fashion Accessories Store* is shown if with shop=fashion_accessories + - *Fireplace Store* is shown if with shop=fireplace + - *Fishing Shop* is shown if with shop=fishing + - *Flooring Supply Shop* is shown if with shop=flooring + - *Florist* is shown if with shop=florist + - *Framing Shop* is shown if with shop=frame + - *Frozen Food Store* is shown if with shop=frozen_food + - *Fuel Shop* is shown if with shop=fuel + - *Funeral Home* is shown if with shop=funeral_directors + - *Furniture Store* is shown if with shop=furniture + - *Tabletop Game Store* is shown if with shop=games + - *Garden Center* is shown if with shop=garden_centre + - *Bottled Gas Shop* is shown if with shop=gas + - *General Store* is shown if with shop=general + - *Gift Shop* is shown if with shop=gift + - *Greengrocer* is shown if with shop=greengrocer + - *Hairdresser* is shown if with shop=hairdresser + - *Hairdresser Supply Store* is shown if with shop=hairdresser_supply + - *Hardware Store* is shown if with shop=hardware + - *Health Food Store* is shown if with shop=health_food + - *Hearing Aids Store* is shown if with shop=hearing_aids + - *Herbalist* is shown if with shop=herbalist + - *Hifi Store* is shown if with shop=hifi + - *Honey Store* is shown if with shop=honey + - *Household Linen Shop* is shown if with shop=household_linen + - *Houseware Store* is shown if with shop=houseware + - *Hunting Shop* is shown if with shop=hunting + - *Interior Decoration Store* is shown if with shop=interior_decoration + - *Jewelry Store* is shown if with shop=jewelry + - *Kiosk* is shown if with shop=kiosk + - *Kitchen Design Store* is shown if with shop=kitchen + - *Laundry* is shown if with shop=laundry + - *Leather Store* is shown if with shop=leather + - *Lighting Store* is shown if with shop=lighting + - *Locksmith* is shown if with shop=locksmith + - *Lottery Shop* is shown if with shop=lottery + - *Mall* is shown if with shop=mall + - *Massage Shop* is shown if with shop=massage + - *Medical Supply Store* is shown if with shop=medical_supply + - *Military Surplus Store* is shown if with shop=military_surplus + - *Mobile Phone Store* is shown if with shop=mobile_phone + - *Model Shop* is shown if with shop=model + - *Money Lender* is shown if with shop=money_lender + - *Motorcycle Dealership* is shown if with shop=motorcycle + - *Motorcycle Repair Shop* is shown if with shop=motorcycle_repair + - *Music Store* is shown if with shop=music + - *Musical Instrument Store* is shown if with shop=musical_instrument + - *Newsstand* is shown if with shop=newsagent + - *Nutrition Supplements Store* is shown if with shop=nutrition_supplements + - *Nuts Shop* is shown if with shop=nuts + - *Optician* is shown if with shop=optician + - *Outdoors Store* is shown if with shop=outdoor + - *Online Retailer Outpost* is shown if with shop=outpost + - *Paint Store* is shown if with shop=paint + - *Party Supply Store* is shown if with shop=party + - *Pasta Store* is shown if with shop=pasta + - *Pastry Shop* is shown if with shop=pastry + - *Pawnshop* is shown if with shop=pawnbroker + - *Perfume Store* is shown if with shop=perfumery + - *Pet Store* is shown if with shop=pet + - *Pet Groomer* is shown if with shop=pet_grooming + - *Photography Store* is shown if with shop=photo + - *Pottery Store* is shown if with shop=pottery + - *Printer Ink Store* is shown if with shop=printer_ink + - *Psychic* is shown if with shop=psychic + - *Fireworks Store* is shown if with shop=pyrotechnics + - *Radio/Electronic Component Store* is shown if with shop=radiotechnics + - *Religious Store* is shown if with shop=religion + - *Rental Shop* is shown if with shop=rental + - *Repair Shop* is shown if with shop=repair + - *Rice Store* is shown if with shop=rice + - *Scuba Diving Shop* is shown if with shop=scuba_diving + - *Seafood Shop* is shown if with shop=seafood + - *Thrift Store* is shown if with shop=second_hand + - *Sewing Supply Shop* is shown if with shop=sewing + - *Shoe Repair Shop* is shown if with shop=shoe_repair + - *Shoe Store* is shown if with shop=shoes + - *Spice Shop* is shown if with shop=spices + - *Sporting Goods Store* is shown if with shop=sports + - *Stationery Store* is shown if with shop=stationery + - *Storage Rental* is shown if with shop=storage_rental + - *Supermarket* is shown if with shop=supermarket + - *Pool Supply Store* is shown if with shop=swimming_pool + - *Tailor* is shown if with shop=tailor + - *Tattoo Parlor* is shown if with shop=tattoo + - *Tea Store* is shown if with shop=tea + - *Telecom Retail Store* is shown if with shop=telecommunication + - *Ticket Seller* is shown if with shop=ticket + - *Tile Shop* is shown if with shop=tiles + - *Tobacco Shop* is shown if with shop=tobacco + - *Tool Rental* is shown if with shop=tool_hire + - *Toy Store* is shown if with shop=toys + - *Trade Shop* is shown if with shop=trade + - *Travel Agency* is shown if with shop=travel_agency + - *Trophy Shop* is shown if with shop=trophy + - *Tire Store* is shown if with shop=tyres + - *Vacuum Cleaner Store* is shown if with shop=vacuum_cleaner + - *Discount Store* is shown if with shop=variety_store + - *Video Store* is shown if with shop=video + - *Video Game Store* is shown if with shop=video_games + - *Watches Shop* is shown if with shop=watches + - *Drinking Water Shop* is shown if with shop=water + - *Watersport/Swim Shop* is shown if with shop=water_sports + - *Weapon Shop* is shown if with shop=weapons + - *Wholesale Store* is shown if with shop=wholesale + - *Wig Shop* is shown if with shop=wigs + - *Window Blind Store* is shown if with shop=window_blind + - *Wine Shop* is shown if with shop=wine + - *This shop is no longer used. It is vacant* is shown if with disused:shop= + +This tagrendering has labels +`description` + +### brand + +The question is `What is the brand of this shop?` +*Part of {brand}* is shown if `brand` is set + + - *This shop does not have a specific brand, it is not part of a bigger chain* is shown if with not:brand=yes + +### second_hand + +The question is `Does this shop sell second-hand items?` + + - *This shop sells second-hand items only* is shown if with second_hand=only + - *This shop sells second-hand items along with new items* is shown if with second_hand=yes + - *This shop only sells brand-new items* is shown if with second_hand=no + +This tagrendering is only visible in the popup if the following condition is met: shop=clothes | shop=books | shop=charity | shop=furniture | shop=mobile_phone | shop=computer | shop=toys + +### opening_hours + +The question is `What are the opening hours of {title()}?` +*

Opening hours

{opening_hours_table(opening_hours)}* is shown if `opening_hours` is set + + - *Marked as closed for an unspecified time* is shown if with opening_hours=closed. _This option cannot be chosen as answer_ + +### website + +The question is `What is the website of {title()}?` +*{website}* is shown if `website` is set + + - *{contact:website}* is shown if with contact:website~.+. _This option cannot be chosen as answer_ + +This tagrendering has labels +`contact` + +### email + +The question is `What is the email address of {title()}?` +*{email}* is shown if `email` is set + + - *{contact:email}* is shown if with contact:email~.+. _This option cannot be chosen as answer_ + - *{operator:email}* is shown if with operator:email~.+. _This option cannot be chosen as answer_ + +This tagrendering has labels +`contact` + +### phone + +The question is `What is the phone number of {title()}?` +*{link(&LBRACEphone&RBRACE,tel:&LBRACEphone&RBRACE,,,,)}* is shown if `phone` is set + + - *{link(&LBRACEcontact:phone&RBRACE,tel:&LBRACEcontact:phone&RBRACE,,,,)}* is shown if with contact:phone~.+. _This option cannot be chosen as answer_ + +This tagrendering has labels +`contact` + +### payment-options + +The question is `Which methods of payment are accepted here?` + + - *Cash is accepted here* is shown if with payment:cash=yes. Unselecting this answer will add payment:cash=no + - *Payment cards are accepted here* is shown if with payment:cards=yes. Unselecting this answer will add payment:cards=no + - *Payment by QR-code is possible here* is shown if with payment:qr_code=yes. Unselecting this answer will add payment:qr_code=no + +### repeated + +_This tagrendering has no question and is thus read-only_ +*Multiple, identical objects can be found on floors {repeat_on}.* + +This tagrendering is only visible in the popup if the following condition is met: repeat_on~.+ +This tagrendering has labels +`level` + +### single_level + +The question is `On what level is this feature located?` +*Located on the {level}th floor* is shown if `level` is set + + - *Located underground* is shown if with location=underground. _This option cannot be chosen as answer_ + - *Located on the ground floor* is shown if with level=0 + - *Located on the ground floor* is shown if with level=. _This option cannot be chosen as answer_ + - *Located on the first floor* is shown if with level=1 + - *Located on the first basement level* is shown if with level=-1 + +This tagrendering has labels +`level` + +### copyshop-print-sizes + +The question is `What paper formats does this shop offer?` + + - *This shop can print on papers of size A4* is shown if with service:print:A4=yes. Unselecting this answer will add service:print:A4=no + - *This shop can print on papers of size A3* is shown if with service:print:A3=yes. Unselecting this answer will add service:print:A3=no + - *This shop can print on papers of size A2* is shown if with service:print:A2=yes. Unselecting this answer will add service:print:A2=no + - *This shop can print on papers of size A1* is shown if with service:print:A1=yes. Unselecting this answer will add service:print:A1=no + - *This shop can print on papers of size A0* is shown if with service:print:A0=yes. Unselecting this answer will add service:print:A0=no + +This tagrendering is only visible in the popup if the following condition is met: service:print=yes | shop~^(.*copyshop.*)$ | shop~^(.*stationery.*)$ + +### copyshop-binding + +The question is `Does this shop offer a binding service?` + + - *This shop binds papers into a booklet* is shown if with service:binding=yes + - *This shop does bind books* is shown if with service:binding=no + +This tagrendering is only visible in the popup if the following condition is met: service:print=yes | shop~^(.*copyshop.*)$ | shop~^(.*stationery.*)$ + +### optometrist_service + +The question is `Are medical services available here?` + + - *This shop offers eye exams by certified optometrists* is shown if with healthcare=optometrist. Unselecting this answer will add not:healtcare=optometrist + - *This shop offers hearing tests by a certified audiologist* is shown if with healthcare=audiologist. Unselecting this answer will add not:healthcare=audiologist + +This tagrendering is only visible in the popup if the following condition is met: shop=optician | shop=hearing_aid | shop=medical_supply + +### key_cutter + +The question is `Does this shop offer key cutting?` + + - *This shop is also specialized in key cutting* is shown if with craft=key_cutter + - *This shop offers key cutting as a service* is shown if with service:key_cutting=yes + - *This shops does not offer key cutting as a service* is shown if with craft= & service:key_cutting=no + +This tagrendering is only visible in the popup if the following condition is met: craft=key_cutting | shop=shoe_repair | shop=diy | shop=doityourself | shop=home_improvement | shop=hardware | shop=locksmith | shop=repair | service:key_cutting~.+ + +### sells_new_bikes + +The question is `Does this shop sell bikes?` + + - *This shop sells new bikes* is shown if with service:bicycle:retail=yes + - *This shop doesn't sell new bikes* is shown if with service:bicycle:retail=no + +This tagrendering is only visible in the popup if the following condition is met: shop=outdoor | shop=sport | shop=sports | shop=diy | shop=doityourself | service:bicycle:retail~.+ + +### bike_second_hand + +The question is `Does this shop sell second-hand bikes?` + + - *This shop sells second-hand bikes* is shown if with service:bicycle:second_hand=yes + - *This shop doesn't sell second-hand bikes* is shown if with service:bicycle:second_hand=no + - *This shop only sells second-hand bikes* is shown if with service:bicycle:second_hand=only + +This tagrendering is only visible in the popup if the following condition is met: shop=bicycle | shop=charity | shop=second_hand | shop=bicycle_repair | service:bicycle:second_hand~.+ + +### repairs_bikes + +The question is `Does this shop repair bikes?` + + - *This shop repairs bikes* is shown if with service:bicycle:repair=yes + - *This shop doesn't repair bikes* is shown if with service:bicycle:repair=no + - *This shop only repairs bikes bought here* is shown if with service:bicycle:repair=only_sold + - *This shop only repairs bikes of a certain brand* is shown if with service:bicycle:repair=brand + +This tagrendering is only visible in the popup if the following condition is met: service:bicycle:retail=yes | service:bicycle:second_hand=yes | service:bicycle:second_hand=only | shop=sport | shop=sports | shop=outdoor | shop=bicycle | service:bicycle:repair~.+ + +### bicycle_rental + +The question is `Does this shop rent out bikes?` + + - *This shop rents out bikes* is shown if with service:bicycle:rental=yes + - *This shop doesn't rent out bikes* is shown if with service:bicycle:rental=no + +This tagrendering is only visible in the popup if the following condition is met: shop=bicycle | shop=sport | shop=sports | shop=bicycle_repair | shop=outdoor | shop=rental | service:bicycle:rental~.+ + +### bicycle-types + +The question is `What kind of bicycles and accessories are rented here?` +*{rental} is rented here* is shown if `rental` is set + + - *Normal city bikes can be rented here* is shown if with rental=city_bike + - *Electrical bikes can be rented here* is shown if with rental=ebike + - *BMX bikes can be rented here* is shown if with rental=bmx + - *Mountainbikes can be rented here* is shown if with rental=mtb + - *Bikes for children can be rented here* is shown if with rental=kid_bike + - *Tandem bicycles can be rented here* is shown if with rental=tandem + - *Race bicycles can be rented here* is shown if with rental=racebike + - *Bike helmets can be rented here* is shown if with rental=bike_helmet + - *Cargo bikes can be rented here* is shown if with rental=cargo_bike + +This tagrendering is only visible in the popup if the following condition is met: service:bicycle:rental=yes | bicycle_rental~.+ +This tagrendering has labels +`bicycle_rental` + +### rental-capacity-city_bike + +The question is `How many city bikes can be rented here?` +*{capacity:city_bike} city bikes can be rented here* is shown if `capacity:city_bike` is set + +This tagrendering is only visible in the popup if the following condition is met: (service:bicycle:rental=yes | bicycle_rental~.+) & rental~^(.*city_bike.*)$ +This tagrendering has labels +`bicycle_rental` + +### rental-capacity-ebike + +The question is `How many electrical bikes can be rented here?` +*{capacity:ebike} electrical bikes can be rented here* is shown if `capacity:ebike` is set + +This tagrendering is only visible in the popup if the following condition is met: (service:bicycle:rental=yes | bicycle_rental~.+) & rental~^(.*ebike.*)$ +This tagrendering has labels +`bicycle_rental` + +### rental-capacity-kid_bike + +The question is `How many bikes for children can be rented here?` +*{capacity:kid_bike} bikes for children can be rented here* is shown if `capacity:kid_bike` is set + +This tagrendering is only visible in the popup if the following condition is met: (service:bicycle:rental=yes | bicycle_rental~.+) & rental~^(.*kid_bike.*)$ +This tagrendering has labels +`bicycle_rental` + +### rental-capacity-bmx + +The question is `How many BMX bikes can be rented here?` +*{capacity:bmx} BMX bikes can be rented here* is shown if `capacity:bmx` is set + +This tagrendering is only visible in the popup if the following condition is met: (service:bicycle:rental=yes | bicycle_rental~.+) & rental~^(.*bmx.*)$ +This tagrendering has labels +`bicycle_rental` + +### rental-capacity-mtb + +The question is `How many mountainbikes can be rented here?` +*{capacity:mtb} mountainbikes can be rented here* is shown if `capacity:mtb` is set + +This tagrendering is only visible in the popup if the following condition is met: (service:bicycle:rental=yes | bicycle_rental~.+) & rental~^(.*mtb.*)$ +This tagrendering has labels +`bicycle_rental` + +### rental-capacity-bicycle_pannier + +The question is `How many bicycle panniers can be rented here?` +*{capacity:bicycle_pannier} bicycle panniers can be rented here* is shown if `capacity:bicycle_pannier` is set + +This tagrendering is only visible in the popup if the following condition is met: (service:bicycle:rental=yes | bicycle_rental~.+) & rental~^(.*bicycle_pannier.*)$ +This tagrendering has labels +`bicycle_rental` + +### rental-capacity-tandem_bicycle + +The question is `How many tandem can be rented here?` +*{capacity:tandem_bicycle} tandem can be rented here* is shown if `capacity:tandem_bicycle` is set + +This tagrendering is only visible in the popup if the following condition is met: (service:bicycle:rental=yes | bicycle_rental~.+) & rental~^(.*tandem_bicycle.*)$ +This tagrendering has labels +`bicycle_rental` + +### bike_pump_service + +The question is `Does this shop offer a bike pump for use by anyone?` + + - *This shop offers a bike pump for anyone* is shown if with service:bicycle:pump=yes + - *This shop doesn't offer a bike pump for anyone* is shown if with service:bicycle:pump=no + - *There is bicycle pump, it is shown as a separate point* is shown if with service:bicycle:pump=separate + +This tagrendering is only visible in the popup if the following condition is met: service:bicycle:retail=yes | shop=bicycle | shop=bicycle_repair | ^(service:bicycle:.+)$~~^(yes)$ | service:bicycle:pump~.+ + +### bike_repair_tools + +The question is `Are there tools here to repair your own bike?` + + - *This shop offers tools for DIY bicycle repair* is shown if with service:bicycle:diy=yes + - *This shop doesn't offer tools for DIY bicycle repair* is shown if with service:bicycle:diy=no + - *Tools for DIY bicycle repair are only available if you bought/hire the bike in the shop* is shown if with service:bicycle:diy=only_sold + +This tagrendering is only visible in the popup if the following condition is met: shop=bicycle | shop=bicycle_repair | service:bicycle:diy~.+ | service:bicycle:repair~^(yes|only)$ + +### bike_wash + +The question is `Are bicycles washed here?` + + - *This shop cleans bicycles* is shown if with service:bicycle:cleaning=yes + - *This shop has an installation where one can clean bicycles themselves* is shown if with service:bicycle:cleaning=diy + - *This shop doesn't offer bicycle cleaning* is shown if with service:bicycle:cleaning=no + +This tagrendering is only visible in the popup if the following condition is met: shop=bicycle | shop=bicycle_repair | ^(service:bicycle:.*)$~~^(yes|only)$ | service:bicycle:cleaning~.+ + +### bike_cleaning-service_bicycle_cleaning_charge + +The question is `How much does it cost to use the cleaning service?` +*Using the cleaning service costs {service:bicycle:cleaning:charge}* is shown if `service:bicycle:cleaning:charge` is set + + - *The cleaning service is free to use* is shown if with service:bicycle:cleaning:fee=no + - *Free to use* is shown if with service:bicycle:cleaning:fee=yes & service:bicycle:cleaning:charge=. _This option cannot be chosen as answer_ + +This tagrendering is only visible in the popup if the following condition is met: amenity!=bicycle_wash & service:bicycle:cleaning!=no & service:bicycle:cleaning~.+ + +### internet + +The question is `Does this place offer internet access?` + + - *This place offers wireless internet access* is shown if with internet_access=wlan + - *This place does not offer internet access* is shown if with internet_access=no + - *This place offers internet access* is shown if with internet_access=yes. _This option cannot be chosen as answer_ + - *This place offers internet access via a terminal or computer* is shown if with internet_access=terminal + - *This place offers wired internet access* is shown if with internet_access=wired + - *This place offers both wireless internet and internet access via a terminal or computer* is shown if with internet_access=terminal;wifi + +This tagrendering has labels +`internet-all` + +### internet-fee + +The question is `Is there a fee for internet access?` + + - *There is a fee for the internet access at this place* is shown if with internet_access:fee=yes + - *Internet access is free at this place* is shown if with internet_access:fee=no + - *Internet access is free at this place, for customers only* is shown if with internet_access:fee=customers + +This tagrendering is only visible in the popup if the following condition is met: internet_access!=no & internet_access~.+ +This tagrendering has labels +`internet-all` + +### internet-ssid + +The question is `What is the network name for the wireless internet access?` +*The network name is {internet_access:ssid}* is shown if `internet_access:ssid` is set + + - *Telekom* is shown if with internet_access:ssid=Telekom + +This tagrendering is only visible in the popup if the following condition is met: internet_access~^(.*wlan.*)$ +This tagrendering has labels +`internet-all` + +### organic + +The question is `Does this shop offer organic products?` + + - *This shop offers organic products* is shown if with organic=yes + - *This shop only offers organic products* is shown if with organic=only + - *This shop does not offer organic products* is shown if with organic=no + +This tagrendering is only visible in the popup if the following condition is met: shop=supermarket | shop=convenience | shop=farm | shop=greengrocer | shop=health_food | shop=clothes | shop=shoes | shop=butcher | shop=cosmetics | shop=deli | shop=bakery | shop=alcohol | shop=seafood | shop=beverages | shop=florist + +### sugar_free + +The question is `Does this shop have a sugar free offering?` + + - *This shop only sells sugar free products* is shown if with diet:sugar_free=only + - *This shop has a big sugar free offering* is shown if with diet:sugar_free=yes + - *This shop has a limited sugar free offering* is shown if with diet:sugar_free=limited + - *This shop has no sugar free offering* is shown if with diet:sugar_free=no + +This tagrendering is only visible in the popup if the following condition is met: shop=supermarket | shop=convenience | shop=farm | shop=greengrocer | shop=health_food | shop=deli | shop=bakery | shop=beverages | shop=beverages | shop=pastry | shop=chocolate | shop=frozen_food | shop=ice_cream +This tagrendering has labels +`diets` + +### gluten_free + +The question is `Does this shop have a gluten free offering?` + + - *This shop only sells gluten free products* is shown if with diet:gluten_free=only + - *This shop has a big gluten free offering* is shown if with diet:gluten_free=yes + - *This shop has a limited gluten free offering* is shown if with diet:gluten_free=limited + - *This shop has no gluten free offering* is shown if with diet:gluten_free=no + +This tagrendering is only visible in the popup if the following condition is met: shop=supermarket | shop=convenience | shop=farm | shop=greengrocer | shop=health_food | shop=deli | shop=bakery | shop=beverages | shop=beverages | shop=pastry | shop=chocolate | shop=frozen_food | shop=ice_cream +This tagrendering has labels +`diets` + +### lactose_free + +The question is `Does {title()} have a lactose-free offering?` + + - *Only sells lactose free products* is shown if with diet:lactose_free=only + - *Big lactose free offering* is shown if with diet:lactose_free=yes + - *Limited lactose free offering* is shown if with diet:lactose_free=limited + - *No lactose free offering* is shown if with diet:lactose_free=no + +This tagrendering is only visible in the popup if the following condition is met: shop=supermarket | shop=convenience | shop=farm | shop=greengrocer | shop=health_food | shop=deli | shop=bakery | shop=beverages | shop=beverages | shop=pastry | shop=chocolate | shop=frozen_food | shop=ice_cream +This tagrendering has labels +`diets` + +### 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 + +### description + +The question is `Is there still some relevant info that the previous questions did not cover? Feel free to add it here.` +*{description}* is shown if `description` is set + +### 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 | +-----|-----|----- | +| second_hand.0 | Only show shops selling second-hand items | shop=second_hand | shop=charity | second_hand=yes | second_hand=only | service:bicycle:second_hand~^(yes|only)$ | + +| id | question | osmTags | +-----|-----|----- | +| has_organic.0 | Has organic options | organic=yes | organic=only | + +| id | question | osmTags | +-----|-----|----- | +| dogs.0 | *No preference towards dogs* (default) | | +| dogs.1 | Dogs allowed | dog=unleashed | dog=yes | +| dogs.2 | No dogs allowed | dog=no | + +| id | question | osmTags | +-----|-----|----- | +| shop_types.0 | *What kind of shop is this?* (default) | | +| shop_types.1 | Bicycle rental shop | shop=bicycle_rental | ((shop=rental & amenity=bicycle_rental)) | +| shop_types.2 | Farm Supply Shop | shop=agrarian | +| shop_types.3 | Liquor Store | shop=alcohol | +| shop_types.4 | Anime / Manga Shop | shop=anime | +| shop_types.5 | Antique Shop | shop=antiques | +| shop_types.6 | Appliance Store | shop=appliance | +| shop_types.7 | Art Store | shop=art | +| shop_types.8 | Baby Goods Store | shop=baby_goods | +| shop_types.9 | Bag/Luggage Store | shop=bag | +| shop_types.10 | Bakery | shop=bakery | +| shop_types.11 | Bathroom Furnishing Store | shop=bathroom_furnishing | +| shop_types.12 | Beauty Shop | shop=beauty | +| shop_types.13 | Bedding/Mattress Store | shop=bed | +| shop_types.14 | Beverage Store | shop=beverages | +| shop_types.15 | Bicycle Shop | shop=bicycle | +| shop_types.16 | Boat Store | shop=boat | +| shop_types.17 | Bookmaker | shop=bookmaker | +| shop_types.18 | Bookstore | shop=books | +| shop_types.19 | Brewing Supply Store | shop=brewing_supplies | +| shop_types.20 | Butcher | shop=butcher | +| shop_types.21 | Camera Equipment Store | shop=camera | +| shop_types.22 | Candle Shop | shop=candles | +| shop_types.23 | Cannabis Shop | shop=cannabis | +| shop_types.24 | Car Dealership | shop=car | +| shop_types.25 | Car Parts Store | shop=car_parts | +| shop_types.26 | Car Repair Shop | shop=car_repair | +| shop_types.27 | RV Dealership | shop=caravan | +| shop_types.28 | Carpet Store | shop=carpet | +| shop_types.29 | Catalog Shop | shop=catalogue | +| shop_types.30 | Charity Store | shop=charity | +| shop_types.31 | Cheese Store | shop=cheese | +| shop_types.32 | Drugstore | shop=chemist | +| shop_types.33 | Chocolate Store | shop=chocolate | +| shop_types.34 | Clothing Store | shop=clothes | +| shop_types.35 | Coffee Store | shop=coffee | +| shop_types.36 | Collectibles Shop | shop=collector | +| shop_types.37 | Computer Store | shop=computer | +| shop_types.38 | Candy Store | shop=confectionery | +| shop_types.39 | Convenience Store | shop=convenience | +| shop_types.40 | Copy Store | shop=copyshop | +| shop_types.41 | Cosmetics Store | shop=cosmetics | +| shop_types.42 | Rural Supplies Store | shop=country_store | +| shop_types.43 | Arts & Crafts Store | shop=craft | +| shop_types.44 | Curtain Store | shop=curtain | +| shop_types.45 | Dairy Store | shop=dairy | +| shop_types.46 | Delicatessen | shop=deli | +| shop_types.47 | Department Store | shop=department_store | +| shop_types.48 | DIY Store | shop=doityourself | +| shop_types.49 | Door Shop | shop=doors | +| shop_types.50 | Dry Cleaner | shop=dry_cleaning | +| shop_types.51 | E-Cigarette Shop | shop=e-cigarette | +| shop_types.52 | Electrical Equipment Store | shop=electrical | +| shop_types.53 | Electronics Store | shop=electronics | +| shop_types.54 | Erotic Store | shop=erotic | +| shop_types.55 | Fabric Store | shop=fabric | +| shop_types.56 | Produce Stand | shop=farm | +| shop_types.57 | Fashion Accessories Store | shop=fashion_accessories | +| shop_types.58 | Fireplace Store | shop=fireplace | +| shop_types.59 | Fishing Shop | shop=fishing | +| shop_types.60 | Flooring Supply Shop | shop=flooring | +| shop_types.61 | Florist | shop=florist | +| shop_types.62 | Framing Shop | shop=frame | +| shop_types.63 | Frozen Food Store | shop=frozen_food | +| shop_types.64 | Fuel Shop | shop=fuel | +| shop_types.65 | Funeral Home | shop=funeral_directors | +| shop_types.66 | Furniture Store | shop=furniture | +| shop_types.67 | Tabletop Game Store | shop=games | +| shop_types.68 | Garden Center | shop=garden_centre | +| shop_types.69 | Bottled Gas Shop | shop=gas | +| shop_types.70 | General Store | shop=general | +| shop_types.71 | Gift Shop | shop=gift | +| shop_types.72 | Greengrocer | shop=greengrocer | +| shop_types.73 | Hairdresser | shop=hairdresser | +| shop_types.74 | Hairdresser Supply Store | shop=hairdresser_supply | +| shop_types.75 | Hardware Store | shop=hardware | +| shop_types.76 | Health Food Store | shop=health_food | +| shop_types.77 | Hearing Aids Store | shop=hearing_aids | +| shop_types.78 | Herbalist | shop=herbalist | +| shop_types.79 | Hifi Store | shop=hifi | +| shop_types.80 | Honey Store | shop=honey | +| shop_types.81 | Household Linen Shop | shop=household_linen | +| shop_types.82 | Houseware Store | shop=houseware | +| shop_types.83 | Hunting Shop | shop=hunting | +| shop_types.84 | Interior Decoration Store | shop=interior_decoration | +| shop_types.85 | Jewelry Store | shop=jewelry | +| shop_types.86 | Kiosk | shop=kiosk | +| shop_types.87 | Kitchen Design Store | shop=kitchen | +| shop_types.88 | Laundry | shop=laundry | +| shop_types.89 | Leather Store | shop=leather | +| shop_types.90 | Lighting Store | shop=lighting | +| shop_types.91 | Locksmith | shop=locksmith | +| shop_types.92 | Lottery Shop | shop=lottery | +| shop_types.93 | Mall | shop=mall | +| shop_types.94 | Massage Shop | shop=massage | +| shop_types.95 | Medical Supply Store | shop=medical_supply | +| shop_types.96 | Military Surplus Store | shop=military_surplus | +| shop_types.97 | Mobile Phone Store | shop=mobile_phone | +| shop_types.98 | Model Shop | shop=model | +| shop_types.99 | Money Lender | shop=money_lender | +| shop_types.100 | Motorcycle Dealership | shop=motorcycle | +| shop_types.101 | Motorcycle Repair Shop | shop=motorcycle_repair | +| shop_types.102 | Music Store | shop=music | +| shop_types.103 | Musical Instrument Store | shop=musical_instrument | +| shop_types.104 | Newsstand | shop=newsagent | +| shop_types.105 | Nutrition Supplements Store | shop=nutrition_supplements | +| shop_types.106 | Nuts Shop | shop=nuts | +| shop_types.107 | Optician | shop=optician | +| shop_types.108 | Outdoors Store | shop=outdoor | +| shop_types.109 | Online Retailer Outpost | shop=outpost | +| shop_types.110 | Paint Store | shop=paint | +| shop_types.111 | Party Supply Store | shop=party | +| shop_types.112 | Pasta Store | shop=pasta | +| shop_types.113 | Pastry Shop | shop=pastry | +| shop_types.114 | Pawnshop | shop=pawnbroker | +| shop_types.115 | Perfume Store | shop=perfumery | +| shop_types.116 | Pet Store | shop=pet | +| shop_types.117 | Pet Groomer | shop=pet_grooming | +| shop_types.118 | Photography Store | shop=photo | +| shop_types.119 | Pottery Store | shop=pottery | +| shop_types.120 | Printer Ink Store | shop=printer_ink | +| shop_types.121 | Psychic | shop=psychic | +| shop_types.122 | Fireworks Store | shop=pyrotechnics | +| shop_types.123 | Radio/Electronic Component Store | shop=radiotechnics | +| shop_types.124 | Religious Store | shop=religion | +| shop_types.125 | Rental Shop | shop=rental | +| shop_types.126 | Repair Shop | shop=repair | +| shop_types.127 | Rice Store | shop=rice | +| shop_types.128 | Scuba Diving Shop | shop=scuba_diving | +| shop_types.129 | Seafood Shop | shop=seafood | +| shop_types.130 | Thrift Store | shop=second_hand | +| shop_types.131 | Sewing Supply Shop | shop=sewing | +| shop_types.132 | Shoe Repair Shop | shop=shoe_repair | +| shop_types.133 | Shoe Store | shop=shoes | +| shop_types.134 | Spice Shop | shop=spices | +| shop_types.135 | Sporting Goods Store | shop=sports | +| shop_types.136 | Stationery Store | shop=stationery | +| shop_types.137 | Storage Rental | shop=storage_rental | +| shop_types.138 | Supermarket | shop=supermarket | +| shop_types.139 | Pool Supply Store | shop=swimming_pool | +| shop_types.140 | Tailor | shop=tailor | +| shop_types.141 | Tattoo Parlor | shop=tattoo | +| shop_types.142 | Tea Store | shop=tea | +| shop_types.143 | Telecom Retail Store | shop=telecommunication | +| shop_types.144 | Ticket Seller | shop=ticket | +| shop_types.145 | Tile Shop | shop=tiles | +| shop_types.146 | Tobacco Shop | shop=tobacco | +| shop_types.147 | Tool Rental | shop=tool_hire | +| shop_types.148 | Toy Store | shop=toys | +| shop_types.149 | Trade Shop | shop=trade | +| shop_types.150 | Travel Agency | shop=travel_agency | +| shop_types.151 | Trophy Shop | shop=trophy | +| shop_types.152 | Tire Store | shop=tyres | +| shop_types.153 | Vacuum Cleaner Store | shop=vacuum_cleaner | +| shop_types.154 | Discount Store | shop=variety_store | +| shop_types.155 | Video Store | shop=video | +| shop_types.156 | Video Game Store | shop=video_games | +| shop_types.157 | Watches Shop | shop=watches | +| shop_types.158 | Drinking Water Shop | shop=water | +| shop_types.159 | Watersport/Swim Shop | shop=water_sports | +| shop_types.160 | Weapon Shop | shop=weapons | +| shop_types.161 | Wholesale Store | shop=wholesale | +| shop_types.162 | Wig Shop | shop=wigs | +| shop_types.163 | Window Blind Store | shop=window_blind | +| shop_types.164 | Wine Shop | shop=wine | +| shop_types.165 | This shop is no longer used. It is vacant | disused:shop= | (shop=disused | shop=vacant | disused:shop~^(.+)$ | abandoned:shop~^(.+)$) | + +| id | question | osmTags | +-----|-----|----- | +| open_now.0 | Now open | _isOpen=yes | + +| id | question | osmTags | +-----|-----|----- | +| accepts_cash.0 | Accepts cash | payment:cash=yes | + +| id | question | osmTags | +-----|-----|----- | +| accepts_cards.0 | Accepts payment cards | payment:cards=yes | + +| id | question | osmTags | +-----|-----|----- | +| has_internet.0 | Offers internet | internet_access=wlan | internet_access=yes | internet_access=wired | + +| id | question | osmTags | +-----|-----|----- | +| sugar_free.0 | Has a sugar-free offering | diet:sugar_free=yes | diet:sugar_free=only | diet:sugar_free=limited | + +| id | question | osmTags | +-----|-----|----- | +| gluten_free.0 | Has a gluten free offering | diet:gluten_free=yes | diet:gluten_free=only | diet:gluten_free=limited | + +| id | question | osmTags | +-----|-----|----- | +| lactose_free.0 | Has a lactose free offering | diet:lactose_free=yes | diet:lactose_free=only | diet:lactose_free=limited | + + + +This document is autogenerated from [assets/themes/pets/pets.json](https://github.com/pietervdvn/MapComplete/blob/develop/assets/themes/pets/pets.json) diff --git a/Docs/Layers/waste_basket_dogs.md b/Docs/Layers/waste_basket_dogs.md new file mode 100644 index 0000000000..362d62ed87 --- /dev/null +++ b/Docs/Layers/waste_basket_dogs.md @@ -0,0 +1,97 @@ +[//]: # (WARNING: this file is automatically generated. Please find the sources at the bottom and edit those sources) + +# waste_basket_dogs + +This layer is based on [waste_basket](../Layers/waste_basket.md) + +This is a public waste basket, thrash can, where you can throw away your thrash. + + - This layer is shown at zoomlevel **14** 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) + - [images](#images) + - [waste-basket-waste-types](#waste-basket-waste-types) + - [dispensing_dog_bags](#dispensing_dog_bags) + - [leftover-questions](#leftover-questions) + - [move-button](#move-button) + - [delete-button](#delete-button) + - [lod](#lod) + +## Themes using this layer + + - [pets](https://mapcomplete.org/pets) + +## Basic tags for this layer + +Elements must match **all** of the following expressions: + +0. vending=excrement_bags +1. amenity=waste_basket + +[Execute on overpass](http://overpass-turbo.eu/?Q=%5Bout%3Ajson%5D%5Btimeout%3A90%5D%3B%28%20%20%20%20nwr%5B%22vending%22%3D%22excrement_bags%22%5D%5B%22amenity%22%3D%22waste_basket%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 | +-----|-----|----- | +| [waste](https://wiki.openstreetmap.org/wiki/Key:waste) | Multiple choice | [trash](https://wiki.openstreetmap.org/wiki/Tag:waste%3Dtrash) [dog_excrement](https://wiki.openstreetmap.org/wiki/Tag:waste%3Ddog_excrement) [cigarettes](https://wiki.openstreetmap.org/wiki/Tag:waste%3Dcigarettes) [drugs](https://wiki.openstreetmap.org/wiki/Tag:waste%3Ddrugs) [sharps](https://wiki.openstreetmap.org/wiki/Tag:waste%3Dsharps) [plastic](https://wiki.openstreetmap.org/wiki/Tag:waste%3Dplastic) [pmd](https://wiki.openstreetmap.org/wiki/Tag:waste%3Dpmd) [paper](https://wiki.openstreetmap.org/wiki/Tag:waste%3Dpaper) | +| [vending](https://wiki.openstreetmap.org/wiki/Key:vending) | Multiple choice | [excrement_bags](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dexcrement_bags) [](https://wiki.openstreetmap.org/wiki/Tag:vending%3D) | + +### 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()}* + +### waste-basket-waste-types + +The question is `What kind of waste basket is this?` + + - *A waste basket for general waste* is shown if with waste=. _This option cannot be chosen as answer_ + - *A waste basket for general waste* is shown if with waste=trash + - *A waste basket for dog excrements* is shown if with waste=dog_excrement + - *A waste basket for cigarettes* is shown if with waste=cigarettes + - *A waste basket for drugs* is shown if with waste=drugs + - *A waste basket for needles and other sharp objects* is shown if with waste=sharps + - *A waste basket for plastic* is shown if with waste=plastic + - *A waste basket for plastic packaging, metal packaging and drink cartons (PMD)* is shown if with waste=pmd + - *A waste basket for paper* is shown if with waste=paper + +### dispensing_dog_bags + +The question is `Does this waste basket have a dispenser for dog excrement bags?` + + - *This waste basket has a dispenser for (dog) excrement bags* is shown if with vending=excrement_bags & not:vending= + - *This waste basket does not have a dispenser for (dog) excrement bags* is shown if with not:vending=excrement_bags & vending= + - *This waste basket does not have a dispenser for (dog) excrement bags* is shown if with vending=. _This option cannot be chosen as answer_ + +### 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` + + +This document is autogenerated from [assets/themes/pets/pets.json](https://github.com/pietervdvn/MapComplete/blob/develop/assets/themes/pets/pets.json) diff --git a/scripts/generateDocs.ts b/scripts/generateDocs.ts index 094b494c98..ddd918ff0a 100644 --- a/scripts/generateDocs.ts +++ b/scripts/generateDocs.ts @@ -30,6 +30,7 @@ import TableOfContents from "../src/UI/Base/TableOfContents" import MarkdownUtils from "../src/Utils/MarkdownUtils" import { parse as parse_html } from "node-html-parser" import { AvailableRasterLayers } from "../src/Models/RasterLayers" +import { ImmutableStore } from "../src/Logic/UIEventSource" /** * Converts a markdown-file into a .json file, which a walkthrough/slideshow element can use @@ -253,7 +254,7 @@ export class GenerateDocs extends Script { } private generateHotkeyDocs() { - new ThemeViewState(new ThemeConfig(bookcases), new Set()) + new ThemeViewState(new ThemeConfig(bookcases), new ImmutableStore(new Set())) this.WriteMarkdownFile("./Docs/Hotkeys.md", Hotkeys.generateDocumentation(), [ "src/UI/Base/Hotkeys.ts", ]) diff --git a/src/UI/Popup/AutoApplyButton.ts b/src/UI/Popup/AutoApplyButton.ts index 9137faa0c7..a2cdf12d08 100644 --- a/src/UI/Popup/AutoApplyButton.ts +++ b/src/UI/Popup/AutoApplyButton.ts @@ -16,7 +16,6 @@ import { UIElement } from "../UIElement" import FilteredLayer from "../../Models/FilteredLayer" import TagRenderingConfig from "../../Models/ThemeConfig/TagRenderingConfig" import Lazy from "../Base/Lazy" -import List from "../Base/List" import { SpecialVisualization, SpecialVisualizationState } from "../SpecialVisualization" import { IndexedFeatureSource } from "../../Logic/FeatureSource/FeatureSource" import { MapLibreAdaptor } from "../Map/MapLibreAdaptor" @@ -264,19 +263,15 @@ export default class AutoApplyButton implements SpecialVisualization { ) } - private static generateDocs(supportedActions: string[]) { - return new Combine([ - "A button to run many actions for many features at once.", - "To effectively use this button, you'll need some ingredients:", - new List([ - "A target layer with features for which an action is defined in a tag rendering. The following special visualisations support an autoAction: " + - supportedActions.join(", "), - "A host feature to place the auto-action on. This can be a big outline (such as a city). Another good option for this is the layer ", - new Link("current_view", "./BuiltinLayers.md#current_view"), - "Then, use a calculated tag on the host feature to determine the overlapping object ids", - "At last, add this component", - ]), - ]).AsMarkdown() + private static generateDocs(supportedActions: string[]): string { + return ` + A button to run many actions for many features at once. + To effectively use this button, you'll need some ingredients: + + 1. A target layer with features for which an action is defined in a tag rendering. The following special visualisations support an autoAction: ${supportedActions.join(", ")} + 2. A host feature to place the auto-action on. This can be a big outline (such as a city). Another good option for this is the layer [current_view](./BuiltinLayers.md#current_view) + 3. Then, use a calculated tag on the host feature to determine the overlapping object ids + 4. At last, add this component` } constr( diff --git a/src/UI/SpecialVisualizations.ts b/src/UI/SpecialVisualizations.ts index 18bd5d7936..196cc0d86b 100644 --- a/src/UI/SpecialVisualizations.ts +++ b/src/UI/SpecialVisualizations.ts @@ -81,13 +81,13 @@ class StealViz implements SpecialVisualization { { name: "featureId", doc: "The key of the attribute which contains the id of the feature from which to use the tags", - required: true, + required: true }, { name: "tagRenderingId", doc: "The layer-id and tagRenderingId to render. Can be multiple value if ';'-separated (in which case every value must also contain the layerId, e.g. `layerId.tagRendering0; layerId.tagRendering1`). Note: this can cause layer injection", - required: true, - }, + required: true + } ] needsUrls = [] svelteBased = true @@ -121,7 +121,7 @@ class StealViz implements SpecialVisualization { tags: otherTags, selectedElement: otherFeature, state, - layer, + layer }) ) } @@ -146,7 +146,6 @@ class StealViz implements SpecialVisualization { } - export default class SpecialVisualizations { public static specialVisualizations: SpecialVisualization[] = SpecialVisualizations.initList() public static specialVisualisationsDict: Map = new Map< @@ -178,18 +177,18 @@ 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 + "", + "" + example + "" ].join("\n\n") } @@ -205,48 +204,82 @@ export default class SpecialVisualizations { } public static HelpMessage(): string { - const helpTexts: string[] = SpecialVisualizations.specialVisualizations.map((viz) => - SpecialVisualizations.DocumentationFor(viz) + + const vis = [...SpecialVisualizations.specialVisualizations] + vis.sort((a, b) => { + return a.funcName < b.funcName ? -1 : 1 + }) + vis.sort((a, b) => { + if (a.group === b.group) { + return 0 + } + return (a.group ?? "xxx") < (b.group ?? "xxx") ? -1 : 1 + }) + + const groupExplanations: Record = { + "default": "These special visualisations are interactive components that most elements get by default. You'll normally won't need them in custom layers", + "favourites": "Elements relating to marking an object as favourite (giving it a heart). Default element", + "settings": "Elements part of the usersettings-ui", + "images": "Elements related to adding or manipulating images. Normally also added by default, but in some cases a tweaked version is needed", + "notes": "Elements relating to OpenStreetMap-notes, e.g. the component to close and/or add a comment", + "reviews": "Elements relating to seeing and adding ratings and reviews with Mangrove.reviews" + } + + const helpTexts: string[] = [] + let lastGroup: string = null + for (const viz of vis) { + if (viz.group !== lastGroup) { + lastGroup = viz.group + if (viz.group === undefined) { + + + helpTexts.push("## Unclassified elements\n\nVarious elements") + } else { + + helpTexts.push("## " + viz.group) + if (!groupExplanations[viz.group]) { + throw "\n\n >>>> ERROR <<<< Unknown visualisation group type: " + viz.group + "\n\n\n" + } + helpTexts.push(groupExplanations[viz.group]) + } + } + helpTexts.push(SpecialVisualizations.DocumentationFor(viz)) + } + + const example = JSON.stringify( + { + render: { + special: { + type: "some_special_visualisation", + argname: "some_arg", + message: { + en: "some other really long message", + nl: "een boodschap in een andere taal" + }, + other_arg_name: "more args" + }, + before: { + en: "Some text to prefix before the special element (e.g. a title)", + nl: "Een tekst om voor het element te zetten (bv. een titel)" + }, + after: { + en: "Some text to put after the element, e.g. a footer" + } + } + }, + null, + " " ) - const firstPart = new Combine([ - new Title("Special tag renderings", 1), - + const firstPart = [ + "# Special tag renderings", "In a tagrendering, some special values are substituted by an advanced UI-element. This allows advanced features and visualizations to be reused by custom themes or even to query third-party API's.", "General usage is `{func_name()}`, `{func_name(arg, someotherarg)}` or `{func_name(args):cssClasses}`. Note that you _do not_ need to use quotes around your arguments, the comma is enough to separate them. This also implies you cannot use a comma in your args", - new Title("Using expanded syntax", 4), + "#### Using expanded syntax", `Instead of using \`{"render": {"en": "{some_special_visualisation(some_arg, some other really long message, more args)} , "nl": "{some_special_visualisation(some_arg, een boodschap in een andere taal, more args)}}\`, one can also write`, - new FixedUiElement( - JSON.stringify( - { - render: { - special: { - type: "some_special_visualisation", - argname: "some_arg", - message: { - en: "some other really long message", - nl: "een boodschap in een andere taal", - }, - other_arg_name: "more args", - }, - before: { - en: "Some text to prefix before the special element (e.g. a title)", - nl: "Een tekst om voor het element te zetten (bv. een titel)", - }, - after: { - en: "Some text to put after the element, e.g. a footer", - }, - }, - }, - 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)', - ]) - .SetClass("flex flex-col") - .AsMarkdown() - console.log(">>> ", helpTexts.join("\n\n")) + "```\n" + example + "\n```\n", + "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)" + ].join("\n\n") return firstPart + "\n\n" + helpTexts.join("\n\n") } @@ -267,9 +300,9 @@ export default class SpecialVisualizations { const [lon, lat] = GeoOperations.centerpointCoordinates(feature) return new SvelteUIElement(AddNewPoint, { state, - coordinate: { lon, lat }, + coordinate: { lon, lat } }) - }, + } }, { funcName: "language_picker", @@ -286,11 +319,11 @@ export default class SpecialVisualizations { availableLanguages: languages, preferredLanguages: state.osmConnection.userDetails.map( (ud) => ud?.languages ?? [] - ), + ) }) }) ) - }, + } }, new HistogramViz(), @@ -324,9 +357,9 @@ export default class SpecialVisualizations { construct: (feature: Feature, title: string) => GeoOperations.toGpx(feature, title), helpertext: t.downloadGpxHelper, - maintext: t.downloadFeatureAsGpx, + maintext: t.downloadFeatureAsGpx }) - }, + } }, new UploadToOsmViz(), new MultiApplyViz(), @@ -346,8 +379,8 @@ export default class SpecialVisualizations { { name: "keyToShowWikipediaFor", doc: "Use the wikidata entry from this key to show the wikipedia article for. Multiple keys can be given (separated by ';'), in which case the first matching value is used", - defaultValue: "wikidata;wikipedia", - }, + defaultValue: "wikidata;wikipedia" + } ], needsUrls: [...Wikidata.neededUrls, ...Wikipedia.neededUrls], @@ -360,9 +393,9 @@ export default class SpecialVisualizations { return tags[key]?.split(";")?.map((id) => id.trim()) ?? [] }) return new SvelteUIElement(WikipediaPanel, { - wikiIds, + wikiIds }) - }, + } }, { funcName: "wikidata_label", @@ -371,8 +404,8 @@ export default class SpecialVisualizations { { name: "keyToShowWikidataFor", doc: "Use the wikidata entry from this key to show the label", - defaultValue: "wikidata", - }, + defaultValue: "wikidata" + } ], needsUrls: Wikidata.neededUrls, example: @@ -396,7 +429,7 @@ export default class SpecialVisualizations { }) ) }) - ), + ) }, new MapillaryLinkVis(), new LanguageElement(), @@ -410,7 +443,7 @@ export default class SpecialVisualizations { _, __, layer: LayerConfig - ) => new SvelteUIElement(AllTagsPanel, { tags, layer }), + ) => new SvelteUIElement(AllTagsPanel, { tags, layer }) }, { funcName: "reviews", @@ -460,18 +493,18 @@ export default class SpecialVisualizations { { name: "key", defaultValue: "opening_hours", - doc: "The tagkey from which the table is constructed.", + doc: "The tagkey from which the table is constructed." }, { name: "prefix", defaultValue: "", - doc: "Remove this string from the start of the value before parsing. __Note: use `&LPARENs` to indicate `(` if needed__", + doc: "Remove this string from the start of the value before parsing. __Note: use `&LPARENs` to indicate `(` if needed__" }, { name: "postfix", defaultValue: "", - doc: "Remove this string from the end of the value before parsing. __Note: use `&RPARENs` to indicate `)` if needed__", - }, + doc: "Remove this string from the end of the value before parsing. __Note: use `&RPARENs` to indicate `)` if needed__" + } ], needsUrls: [Constants.countryCoderEndpoint], example: @@ -479,7 +512,7 @@ export default class SpecialVisualizations { constr: (state, tagSource: UIEventSource, args) => { const [key, prefix, postfix] = args return new OpeningHoursVisualization(tagSource, key, prefix, postfix) - }, + } }, { funcName: "opening_hours_state", @@ -488,18 +521,18 @@ export default class SpecialVisualizations { { name: "key", defaultValue: "opening_hours", - doc: "The tagkey from which the opening hours are read.", + doc: "The tagkey from which the opening hours are read." }, { name: "prefix", defaultValue: "", - doc: "Remove this string from the start of the value before parsing. __Note: use `&LPARENs` to indicate `(` if needed__", + doc: "Remove this string from the start of the value before parsing. __Note: use `&LPARENs` to indicate `(` if needed__" }, { name: "postfix", defaultValue: "", - doc: "Remove this string from the end of the value before parsing. __Note: use `&RPARENs` to indicate `)` if needed__", - }, + doc: "Remove this string from the end of the value before parsing. __Note: use `&RPARENs` to indicate `)` if needed__" + } ], constr( state: SpecialVisualizationState, @@ -514,9 +547,9 @@ export default class SpecialVisualizations { keyToUse, tags, prefix, - postfix, + postfix }) - }, + } }, { funcName: "canonical", @@ -528,8 +561,8 @@ export default class SpecialVisualizations { { name: "key", doc: "The key of the tag to give the canonical text for", - required: true, - }, + required: true + } ], constr: (state, tagSource, args) => { const key = args[0] @@ -553,7 +586,7 @@ export default class SpecialVisualizations { return unit.asHumanLongValue(value, getCountry) }) ) - }, + } }, { funcName: "export_as_geojson", @@ -571,9 +604,9 @@ export default class SpecialVisualizations { construct: (feature: Feature) => JSON.stringify(feature, null, " "), maintext: t.downloadFeatureAsGeojson, - helpertext: t.downloadGeoJsonHelper, + helpertext: t.downloadGeoJsonHelper }) - }, + } }, { funcName: "open_in_iD", @@ -583,9 +616,9 @@ export default class SpecialVisualizations { constr: (state, feature) => { return new SvelteUIElement(OpenIdEditor, { mapProperties: state.mapProperties, - objectId: feature.data.id, + objectId: feature.data.id }) - }, + } }, { funcName: "open_in_josm", @@ -595,7 +628,7 @@ export default class SpecialVisualizations { constr: (state) => { return new SvelteUIElement(OpenJosm, { state }) - }, + } }, { funcName: "clear_location_history", @@ -610,7 +643,7 @@ export default class SpecialVisualizations { state.historicalUserLocations.features.setData([]) state.selectedElement.setData(undefined) }) - }, + } }, { funcName: "visualize_note_comments", @@ -619,13 +652,13 @@ export default class SpecialVisualizations { { name: "commentsKey", doc: "The property name of the comments, which should be stringified json", - defaultValue: "comments", + defaultValue: "comments" }, { name: "start", doc: "Drop the first 'start' comments", - defaultValue: "0", - }, + defaultValue: "0" + } ], needsUrls: [Constants.osmAuthConfig.url], constr: (state, tags, args) => @@ -645,12 +678,12 @@ export default class SpecialVisualizations { (comment) => new SvelteUIElement(NoteCommentElement, { comment, - state, + state }) ) ).SetClass("flex flex-col") }) - ), + ) }, { funcName: "title", @@ -667,7 +700,7 @@ export default class SpecialVisualizations { layer: LayerConfig ) => { return new SvelteUIElement(FeatureTitle, { state, tags, feature, layer }) - }, + } }, { funcName: "maproulette_task", @@ -711,7 +744,7 @@ export default class SpecialVisualizations { }) ) }, - 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.", + 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." }, { funcName: "maproulette_set_status", @@ -722,15 +755,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" + @@ -738,32 +771,32 @@ export default class SpecialVisualizations { args: [ { name: "message", - doc: "A message to show to the user", + doc: "A message to show to the user" }, { name: "image", doc: "Image to show", - defaultValue: "confirm", + defaultValue: "confirm" }, { name: "message_confirm", - doc: "What to show when the task is closed, either by the user or was already closed.", + doc: "What to show when the task is closed, either by the user or was already closed." }, { name: "status", doc: "A statuscode to apply when the button is clicked. 1 = `close`, 2 = `false_positive`, 3 = `skip`, 4 = `deleted`, 5 = `already fixed` (on the map, e.g. for duplicates), 6 = `too hard`", - defaultValue: "1", + defaultValue: "1" }, { name: "maproulette_id", doc: "The property name containing the maproulette id", - defaultValue: "mr_taskId", + defaultValue: "mr_taskId" }, { name: "ask_feedback", doc: "If not an empty string, this will be used as question to ask some additional feedback. A text field will be added", - defaultValue: "", - }, + defaultValue: "" + } ], constr: (state, tagsSource, args) => { @@ -773,7 +806,7 @@ export default class SpecialVisualizations { message_closed, statusToSet, maproulette_id_key, - askFeedback, + askFeedback ] = args if (image === "") { image = "confirm" @@ -790,9 +823,9 @@ export default class SpecialVisualizations { message_closed, statusToSet, maproulette_id_key, - askFeedback, + askFeedback }) - }, + } }, { funcName: "statistics", @@ -819,7 +852,7 @@ export default class SpecialVisualizations { [state.mapProperties.bounds] ) ) - }, + } }, { funcName: "send_email", @@ -828,29 +861,29 @@ export default class SpecialVisualizations { { name: "to", doc: "Who to send the email to?", - required: true, + required: true }, { name: "subject", doc: "The subject of the email", - required: true, + required: true }, { name: "body", doc: "The text in the email", - required: true, + required: true }, { name: "button_text", doc: "The text shown on the button in the UI", - required: true, - }, + required: true + } ], constr(__, tags, args) { return new SvelteUIElement(SendEmail, { args, tags }) - }, + } }, { funcName: "link", @@ -859,29 +892,29 @@ export default class SpecialVisualizations { { name: "text", doc: "Text to be shown", - required: true, + required: true }, { name: "href", doc: "The URL to link to. Note that this will be URI-encoded before ", - required: true, + required: true }, { name: "class", - doc: "CSS-classes to add to the element", + doc: "CSS-classes to add to the element" }, { name: "download", - doc: "Expects a string which denotes the filename to download the contents of `href` into. If set, this link will act as a download-button.", + doc: "Expects a string which denotes the filename to download the contents of `href` into. If set, this link will act as a download-button." }, { name: "arialabel", - doc: "If set, this text will be used as aria-label", + doc: "If set, this text will be used as aria-label" }, { 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( @@ -903,9 +936,9 @@ export default class SpecialVisualizations { download: tagSource.map((tags) => Utils.SubstituteKeys(download, tags)), ariaLabel: tagSource.map((tags) => Utils.SubstituteKeys(ariaLabel, tags)), newTab: new ImmutableStore(newTab), - icon: tagSource.map((tags) => Utils.SubstituteKeys(icon, tags)), + icon: tagSource.map((tags) => Utils.SubstituteKeys(icon, tags)) }).setSpan() - }, + } }, { funcName: "multi", @@ -919,10 +952,10 @@ export default class SpecialVisualizations { type: "multi", key: "_doors_from_building_properties", tagrendering: { - en: "The building containing this feature has a door of width {entrance:width}", - }, - }, - }, + en: "The building containing this feature has a door of width {entrance:width}" + } + } + } }, null, " " @@ -932,17 +965,17 @@ export default class SpecialVisualizations { { name: "key", doc: "The property to read and to interpret as a list of properties", - required: true, + required: true }, { name: "tagrendering", doc: "An entire tagRenderingConfig", - required: true, + required: true }, { name: "classes", - doc: "CSS-classes to apply on every individual item. Seperated by `space`", - }, + doc: "CSS-classes to apply on every individual item. Seperated by `space`" + } ], constr( state: SpecialVisualizationState, @@ -978,7 +1011,7 @@ export default class SpecialVisualizations { tags: new ImmutableStore(property), state, feature, - layer, + layer // clss: classes ?? "", }).SetClass(classes) elements.push(subsTr) @@ -986,7 +1019,7 @@ export default class SpecialVisualizations { return elements }) ) - }, + } }, { funcName: "translated", @@ -996,8 +1029,8 @@ export default class SpecialVisualizations { { name: "key", doc: "The attribute to interpret as json", - defaultValue: "value", - }, + defaultValue: "value" + } ], constr( state: SpecialVisualizationState, @@ -1018,7 +1051,7 @@ export default class SpecialVisualizations { } }) ) - }, + } }, { funcName: "fediverse_link", @@ -1027,8 +1060,8 @@ export default class SpecialVisualizations { { name: "key", doc: "The attribute-name containing the link", - required: true, - }, + required: true + } ], constr( @@ -1040,7 +1073,7 @@ export default class SpecialVisualizations { ): BaseUIElement { const key = argument[0] return new SvelteUIElement(FediverseLink, { key, tags, state }) - }, + } }, { funcName: "braced", @@ -1050,8 +1083,8 @@ export default class SpecialVisualizations { { name: "text", required: true, - doc: "The value to show", - }, + doc: "The value to show" + } ], constr( state: SpecialVisualizationState, @@ -1061,7 +1094,7 @@ export default class SpecialVisualizations { layer: LayerConfig ): BaseUIElement { return new FixedUiElement("{" + args[0] + "}") - }, + } }, { funcName: "tags", @@ -1071,8 +1104,8 @@ export default class SpecialVisualizations { { name: "key", defaultValue: "value", - doc: "The key to look for the tags", - }, + doc: "The key to look for the tags" + } ], constr( state: SpecialVisualizationState, @@ -1097,14 +1130,14 @@ 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") } }) ) - }, + } }, { @@ -1120,7 +1153,7 @@ export default class SpecialVisualizations { layer: LayerConfig ): BaseUIElement { return new SvelteUIElement(DirectionIndicator, { state, feature }) - }, + } }, { @@ -1130,8 +1163,8 @@ export default class SpecialVisualizations { { name: "key", doc: "The attribute containing the degrees", - defaultValue: "_direction:centerpoint", - }, + defaultValue: "_direction:centerpoint" + } ], constr( @@ -1154,7 +1187,7 @@ export default class SpecialVisualizations { return Translations.t.general.visualFeedback.directionsAbsolute[dir] }) ) - }, + } }, { funcName: "compare_data", @@ -1163,18 +1196,18 @@ export default class SpecialVisualizations { { name: "url", required: true, - doc: "The attribute containing the url where to fetch more data", + doc: "The attribute containing the url where to fetch more data" }, { name: "host", required: true, - doc: "The domain name(s) where data might be fetched from - this is needed to set the CSP. A domain must include 'https', e.g. 'https://example.com'. For multiple domains, separate them with ';'. If you don't know the possible domains, use '*'. ", + doc: "The domain name(s) where data might be fetched from - this is needed to set the CSP. A domain must include 'https', e.g. 'https://example.com'. For multiple domains, separate them with ';'. If you don't know the possible domains, use '*'. " }, { name: "readonly", required: false, - doc: "If 'yes', will not show 'apply'-buttons", - }, + doc: "If 'yes', will not show 'apply'-buttons" + } ], docs: "Gives an interactive element which shows a tag comparison between the OSM-object and the upstream object. This allows to copy some or all tags into OSM", constr( @@ -1194,9 +1227,9 @@ export default class SpecialVisualizations { layer, feature, readonly, - externalData, + externalData }) - }, + } }, { funcName: "linked_data_from_website", @@ -1205,26 +1238,26 @@ export default class SpecialVisualizations { { name: "key", defaultValue: "website", - doc: "Attempt to load ld+json from the specified URL. This can be in an embedded