forked from MapComplete/MapComplete
		
	Merge master
This commit is contained in:
		
						commit
						c3041af5f7
					
				
					 50 changed files with 2313 additions and 1152 deletions
				
			
		|  | @ -21,6 +21,7 @@ | ||||||
|     + [description](#description) |     + [description](#description) | ||||||
|     + [payment-options](#payment-options) |     + [payment-options](#payment-options) | ||||||
|     + [payment-options-advanced](#payment-options-advanced) |     + [payment-options-advanced](#payment-options-advanced) | ||||||
|  |     + [payment-options-split](#payment-options-split) | ||||||
|     + [opening_hours_24_7](#opening_hours_24_7) |     + [opening_hours_24_7](#opening_hours_24_7) | ||||||
|     + [level](#level) |     + [level](#level) | ||||||
|     + [bicycle_rental.*bicycle_rental](#bicycle_rental*bicycle_rental) |     + [bicycle_rental.*bicycle_rental](#bicycle_rental*bicycle_rental) | ||||||
|  | @ -46,7 +47,6 @@ | ||||||
|     + [opening_hours_by_appointment](#opening_hours_by_appointment) |     + [opening_hours_by_appointment](#opening_hours_by_appointment) | ||||||
|     + [multilevels](#multilevels) |     + [multilevels](#multilevels) | ||||||
|     + [induction-loop](#induction-loop) |     + [induction-loop](#induction-loop) | ||||||
|     + [payment-options-split](#payment-options-split) |  | ||||||
|     + [denominations-coins](#denominations-coins) |     + [denominations-coins](#denominations-coins) | ||||||
|     + [check_date](#check_date) |     + [check_date](#check_date) | ||||||
|     + [all_tags](#all_tags) |     + [all_tags](#all_tags) | ||||||
|  | @ -56,6 +56,7 @@ | ||||||
|     + [mastodon](#mastodon) |     + [mastodon](#mastodon) | ||||||
|     + [contact](#contact) |     + [contact](#contact) | ||||||
|     + [etymology.wikipedia-etymology](#etymologywikipedia-etymology) |     + [etymology.wikipedia-etymology](#etymologywikipedia-etymology) | ||||||
|  |     + [toilet.relevant-questions](#toiletrelevant-questions) | ||||||
|     + [denominations-notes](#denominations-notes) |     + [denominations-notes](#denominations-notes) | ||||||
|     + [single_level](#single_level) |     + [single_level](#single_level) | ||||||
|     + [survey_date](#survey_date) |     + [survey_date](#survey_date) | ||||||
|  | @ -410,6 +411,23 @@ | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | ### payment-options-split  | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |   - bicycle_tube_vending_machine | ||||||
|  |   - elongated_coin | ||||||
|  |   - parking_ticket_machine | ||||||
|  |   - shower | ||||||
|  |   - ticket_machine | ||||||
|  |   - toilet | ||||||
|  |   - vending_machine | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| ### opening_hours_24_7  | ### opening_hours_24_7  | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @ -753,22 +771,6 @@ | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| ### payment-options-split  |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|   - elongated_coin |  | ||||||
|   - parking_ticket_machine |  | ||||||
|   - shower |  | ||||||
|   - ticket_machine |  | ||||||
|   - toilet |  | ||||||
|   - vending_machine |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
| ### denominations-coins  | ### denominations-coins  | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @ -866,6 +868,17 @@ | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  |   - indoors | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | ### toilet.relevant-questions  | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|   - indoors |   - indoors | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -47,7 +47,7 @@ this quick overview is incomplete | ||||||
| attribute | type | values which are supported by this layer | attribute | type | values which are supported by this layer | ||||||
| ----------- | ------ | ------------------------------------------ | ----------- | ------ | ------------------------------------------ | ||||||
| [<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/id#values) [id](https://wiki.openstreetmap.org/wiki/Key:id) | Multiple choice |  | [<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/id#values) [id](https://wiki.openstreetmap.org/wiki/Key:id) | Multiple choice |  | ||||||
| [<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/vending#values) [vending](https://wiki.openstreetmap.org/wiki/Key:vending) | [string](../SpecialInputElements.md#string) | [drinks](https://wiki.openstreetmap.org/wiki/Tag:vending%3Ddrinks) [sweets](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dsweets) [food](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dfood) [cigarettes](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dcigarettes) [condoms](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dcondoms) [coffee](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dcoffee) [water](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dwater) [newspapers](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dnewspapers) [bicycle_tube](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dbicycle_tube) [milk](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dmilk) [bread](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dbread) [eggs](https://wiki.openstreetmap.org/wiki/Tag:vending%3Deggs) [cheese](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dcheese) [honey](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dhoney) [potatoes](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dpotatoes) [flowers](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dflowers) [parking_tickets](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dparking_tickets) [elongated_coin](https://wiki.openstreetmap.org/wiki/Tag:vending%3Delongated_coin) [public_transport_tickets](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dpublic_transport_tickets) [meat](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dmeat) | [<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/vending#values) [vending](https://wiki.openstreetmap.org/wiki/Key:vending) | [string](../SpecialInputElements.md#string) | [drinks](https://wiki.openstreetmap.org/wiki/Tag:vending%3Ddrinks) [sweets](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dsweets) [food](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dfood) [cigarettes](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dcigarettes) [condoms](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dcondoms) [coffee](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dcoffee) [water](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dwater) [newspapers](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dnewspapers) [bicycle_tube](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dbicycle_tube) [milk](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dmilk) [bread](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dbread) [eggs](https://wiki.openstreetmap.org/wiki/Tag:vending%3Deggs) [cheese](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dcheese) [honey](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dhoney) [potatoes](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dpotatoes) [meat](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dmeat) [flowers](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dflowers) [parking_tickets](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dparking_tickets) [elongated_coin](https://wiki.openstreetmap.org/wiki/Tag:vending%3Delongated_coin) [public_transport_tickets](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dpublic_transport_tickets) [bicycle_light](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dbicycle_light) [gloves](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dgloves) [bicycle_repair_kit](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dbicycle_repair_kit) [bicycle_pump](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dbicycle_pump) [bicycle_lock](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dbicycle_lock) | ||||||
| [<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/opening_hours#values) [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) | [opening_hours](../SpecialInputElements.md#opening_hours) | [24/7](https://wiki.openstreetmap.org/wiki/Tag:opening_hours%3D24/7) | [<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/opening_hours#values) [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) | [opening_hours](../SpecialInputElements.md#opening_hours) | [24/7](https://wiki.openstreetmap.org/wiki/Tag:opening_hours%3D24/7) | ||||||
| [<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/payment:coins:denominations#values) [payment:coins:denominations](https://wiki.openstreetmap.org/wiki/Key:payment:coins:denominations) | Multiple choice | [0.01 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D0.01 EUR) [0.02 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D0.02 EUR) [0.05 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D0.05 EUR) [0.10 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D0.10 EUR) [0.20 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D0.20 EUR) [0.50 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D0.50 EUR) [1 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D1 EUR) [2 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D2 EUR) [0.05 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D0.05 CHF) [0.10 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D0.10 CHF) [0.20 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D0.20 CHF) [0.50 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D0.50 CHF) [1 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D1 CHF) [2 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D2 CHF) [5 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D5 CHF) | [<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/payment:coins:denominations#values) [payment:coins:denominations](https://wiki.openstreetmap.org/wiki/Key:payment:coins:denominations) | Multiple choice | [0.01 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D0.01 EUR) [0.02 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D0.02 EUR) [0.05 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D0.05 EUR) [0.10 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D0.10 EUR) [0.20 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D0.20 EUR) [0.50 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D0.50 EUR) [1 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D1 EUR) [2 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D2 EUR) [0.05 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D0.05 CHF) [0.10 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D0.10 CHF) [0.20 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D0.20 CHF) [0.50 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D0.50 CHF) [1 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D1 CHF) [2 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D2 CHF) [5 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D5 CHF) | ||||||
| [<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/payment:notes:denominations#values) [payment:notes:denominations](https://wiki.openstreetmap.org/wiki/Key:payment:notes:denominations) | Multiple choice | [5 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D5 EUR) [10 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D10 EUR) [20 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D20 EUR) [50 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D50 EUR) [100 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D100 EUR) [200 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D200 EUR) [500 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D500 EUR) [10 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D10 CHF) [20 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D20 CHF) [50 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D50 CHF) [100 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D100 CHF) [200 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D200 CHF) [1000 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D1000 CHF) | [<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/payment:notes:denominations#values) [payment:notes:denominations](https://wiki.openstreetmap.org/wiki/Key:payment:notes:denominations) | Multiple choice | [5 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D5 EUR) [10 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D10 EUR) [20 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D20 EUR) [50 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D50 EUR) [100 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D100 EUR) [200 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D200 EUR) [500 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D500 EUR) [10 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D10 CHF) [20 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D20 CHF) [50 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D50 CHF) [100 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D100 CHF) [200 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D200 CHF) [1000 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D1000 CHF) | ||||||
|  | @ -119,11 +119,16 @@ This is rendered with  `This vending machine sells {vending}` | ||||||
|   - *Cheese is sold*  corresponds with  `vending=cheese` |   - *Cheese is sold*  corresponds with  `vending=cheese` | ||||||
|   - *Honey is sold*  corresponds with  `vending=honey` |   - *Honey is sold*  corresponds with  `vending=honey` | ||||||
|   - *Potatoes are sold*  corresponds with  `vending=potatoes` |   - *Potatoes are sold*  corresponds with  `vending=potatoes` | ||||||
|  |   - *Meat is sold*  corresponds with  `vending=meat` | ||||||
|   - *Flowers are sold*  corresponds with  `vending=flowers` |   - *Flowers are sold*  corresponds with  `vending=flowers` | ||||||
|   - *Parking tickets are sold*  corresponds with  `vending=parking_tickets` |   - *Parking tickets are sold*  corresponds with  `vending=parking_tickets` | ||||||
|   - *Pressed pennies are sold*  corresponds with  `vending=elongated_coin` |   - *Pressed pennies are sold*  corresponds with  `vending=elongated_coin` | ||||||
|   - *Public transport tickets are sold*  corresponds with  `vending=public_transport_tickets` |   - *Public transport tickets are sold*  corresponds with  `vending=public_transport_tickets` | ||||||
|   - *Meat products are being sold*  corresponds with  `vending=meat` |   - *Bicycle lights are sold*  corresponds with  `vending=bicycle_light` | ||||||
|  |   - *Gloves are sold*  corresponds with  `vending=gloves` | ||||||
|  |   - *Bicycle repair kits are sold*  corresponds with  `vending=bicycle_repair_kit` | ||||||
|  |   - *Bicycle pumps are sold*  corresponds with  `vending=bicycle_pump` | ||||||
|  |   - *Bicycle locks are sold*  corresponds with  `vending=bicycle_lock` | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @ -429,11 +434,16 @@ vending.12 | Sale of eggs | vending~^(.*eggs.*)$ | ||||||
| vending.13 | Sale of cheese | vending~^(.*cheese.*)$ | vending.13 | Sale of cheese | vending~^(.*cheese.*)$ | ||||||
| vending.14 | Sale of honey | vending~^(.*honey.*)$ | vending.14 | Sale of honey | vending~^(.*honey.*)$ | ||||||
| vending.15 | Sale of potatoes | vending~^(.*potatoes.*)$ | vending.15 | Sale of potatoes | vending~^(.*potatoes.*)$ | ||||||
| vending.16 | Sale of flowers | vending~^(.*flowers.*)$ | vending.16 | Sale of meat | vending~^(.*meat.*)$ | ||||||
| vending.17 | Sale of parking | vending~^(.*parking_tickets.*)$ | vending.17 | Sale of flowers | vending~^(.*flowers.*)$ | ||||||
| vending.18 | Sale of pressed pennies | vending=elongated_coin | vending.18 | Sale of parking tickets | vending~^(.*parking_tickets.*)$ | ||||||
| vending.19 | Sale of public transport tickets | vending~^(.*public_transport_tickets.*)$ | vending.19 | Sale of pressed pennies | vending=elongated_coin | ||||||
| vending.20 | Sale of meat products | vending=meat | vending.20 | Sale of public transport tickets | vending~^(.*public_transport_tickets.*)$ | ||||||
|  | vending.21 | Sale of bicycle lights | vending=bicycle_light | ||||||
|  | vending.22 | Sale of gloves | vending=gloves | ||||||
|  | vending.23 | Sale of bicycle repair kits | vending=bicycle_repair_kit | ||||||
|  | vending.24 | Sale of bicycle pumps | vending=bicycle_pump | ||||||
|  | vending.25 | Sale of bicycle locks | vending=bicycle_lock | ||||||
|   |   | ||||||
| 
 | 
 | ||||||
| This document is autogenerated from [assets/themes/vending_machine/vending_machine.json](https://github.com/pietervdvn/MapComplete/blob/develop/assets/themes/vending_machine/vending_machine.json) | This document is autogenerated from [assets/themes/vending_machine/vending_machine.json](https://github.com/pietervdvn/MapComplete/blob/develop/assets/themes/vending_machine/vending_machine.json) | ||||||
|  |  | ||||||
|  | @ -51,6 +51,7 @@ attribute | type | values which are supported by this layer | ||||||
| [<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/charge#values) [charge](https://wiki.openstreetmap.org/wiki/Key:charge) | [string](../SpecialInputElements.md#string) |  | [<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/charge#values) [charge](https://wiki.openstreetmap.org/wiki/Key:charge) | [string](../SpecialInputElements.md#string) |  | ||||||
| [<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/brand#values) [brand](https://wiki.openstreetmap.org/wiki/Key:brand) | [string](../SpecialInputElements.md#string) | [Continental](https://wiki.openstreetmap.org/wiki/Tag:brand%3DContinental) [Schwalbe](https://wiki.openstreetmap.org/wiki/Tag:brand%3DSchwalbe) | [<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/brand#values) [brand](https://wiki.openstreetmap.org/wiki/Key:brand) | [string](../SpecialInputElements.md#string) | [Continental](https://wiki.openstreetmap.org/wiki/Tag:brand%3DContinental) [Schwalbe](https://wiki.openstreetmap.org/wiki/Tag:brand%3DSchwalbe) | ||||||
| [<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/operator#values) [operator](https://wiki.openstreetmap.org/wiki/Key:operator) | [string](../SpecialInputElements.md#string) | [Schwalbe](https://wiki.openstreetmap.org/wiki/Tag:operator%3DSchwalbe) [Continental](https://wiki.openstreetmap.org/wiki/Tag:operator%3DContinental) | [<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/operator#values) [operator](https://wiki.openstreetmap.org/wiki/Key:operator) | [string](../SpecialInputElements.md#string) | [Schwalbe](https://wiki.openstreetmap.org/wiki/Tag:operator%3DSchwalbe) [Continental](https://wiki.openstreetmap.org/wiki/Tag:operator%3DContinental) | ||||||
|  | [<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/vending#values) [vending](https://wiki.openstreetmap.org/wiki/Key:vending) | Multiple choice | [bicycle_tube](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dbicycle_tube) [bicycle_light](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dbicycle_light) [gloves](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dgloves) [bicycle_repair_kit](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dbicycle_repair_kit) [bicycle_pump](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dbicycle_pump) [bicycle_lock](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dbicycle_lock) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @ -121,22 +122,32 @@ This is rendered with  `A bicycle tube costs {charge}` | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| ### vending-machine-payment-methods  | ### payment-options-split  | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| The question is  *How can one pay at this tube vending machine?* | The question is  *Which methods of payment are accepted here?* | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|   - *Payment with coins is possible*  corresponds with  `payment:coins=yes` |   - *Cash is accepted here*  corresponds with  `payment:cash=yes` | ||||||
|  |   - This option cannot be chosen as answer | ||||||
|  |   - Unselecting this answer will add  | ||||||
|  |   - *Payment cards are accepted here*  corresponds with  `payment:cards=yes` | ||||||
|  |   - This option cannot be chosen as answer | ||||||
|  |   - Unselecting this answer will add  | ||||||
|  |   - *Payment by QR-code is possible here*  corresponds with  `payment:qr_code=yes` | ||||||
|  |   - Unselecting this answer will add <a href='https://wiki.openstreetmap.org/wiki/Key:payment:qr_code' target='_blank'>payment:qr_code</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:payment:qr_code%3Dno' target='_blank'>no</a> | ||||||
|  |   - *Coins are accepted here*  corresponds with  `payment:coins=yes` | ||||||
|   - Unselecting this answer will add <a href='https://wiki.openstreetmap.org/wiki/Key:payment:coins' target='_blank'>payment:coins</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:payment:coins%3Dno' target='_blank'>no</a> |   - Unselecting this answer will add <a href='https://wiki.openstreetmap.org/wiki/Key:payment:coins' target='_blank'>payment:coins</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:payment:coins%3Dno' target='_blank'>no</a> | ||||||
|   - *Payment with notes is possible*  corresponds with  `payment:notes=yes` |   - *Bank notes are accepted here*  corresponds with  `payment:notes=yes` | ||||||
|   - Unselecting this answer will add <a href='https://wiki.openstreetmap.org/wiki/Key:payment:notes' target='_blank'>payment:notes</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:payment:notes%3Dno' target='_blank'>no</a> |   - Unselecting this answer will add <a href='https://wiki.openstreetmap.org/wiki/Key:payment:notes' target='_blank'>payment:notes</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:payment:notes%3Dno' target='_blank'>no</a> | ||||||
|   - *Payment with cards is possible*  corresponds with  `payment:cards=yes` |   - *Debit cards are accepted here*  corresponds with  `payment:debit_cards=yes` | ||||||
|   - Unselecting this answer will add <a href='https://wiki.openstreetmap.org/wiki/Key:payment:cards' target='_blank'>payment:cards</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:payment:cards%3Dno' target='_blank'>no</a> |   - Unselecting this answer will add <a href='https://wiki.openstreetmap.org/wiki/Key:payment:debit_cards' target='_blank'>payment:debit_cards</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:payment:debit_cards%3Dno' target='_blank'>no</a> | ||||||
|  |   - *Credit cards are accepted here*  corresponds with  `payment:credit_cards=yes` | ||||||
|  |   - Unselecting this answer will add <a href='https://wiki.openstreetmap.org/wiki/Key:payment:credit_cards' target='_blank'>payment:credit_cards</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:payment:credit_cards%3Dno' target='_blank'>no</a> | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @ -181,26 +192,22 @@ This is rendered with  `This vending machine is maintained by {operator}` | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| ### bicycle_tube_vending_maching-other-items  | ### other-items-vending  | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| The question is  *Are other bicycle bicycle accessories sold here?* | The question is  *Are other biycle accessories sold here?* | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|   - *Bicycle lights are sold here*  corresponds with  `vending:bicycle_light=yes` |   - *Bicycle inner tubes are sold here*  corresponds with  `vending=bicycle_tube` | ||||||
|   - Unselecting this answer will add <a href='https://wiki.openstreetmap.org/wiki/Key:vending:bicycle_light' target='_blank'>vending:bicycle_light</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:vending:bicycle_light%3Dno' target='_blank'>no</a> |   - *Bicycle lights are sold here*  corresponds with  `vending=bicycle_light` | ||||||
|   - *Gloves are sold here*  corresponds with  `vending:gloves=yes` |   - *Gloves are sold here*  corresponds with  `vending=gloves` | ||||||
|   - Unselecting this answer will add <a href='https://wiki.openstreetmap.org/wiki/Key:vending:gloves' target='_blank'>vending:gloves</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:vending:gloves%3Dno' target='_blank'>no</a> |   - *Bicycle repair kits are sold here*  corresponds with  `vending=bicycle_repair_kit` | ||||||
|   - *Bicycle repair kits are sold here*  corresponds with  `vending:bicycle_repair_kit=yes` |   - *Bicycle pumps are sold here*  corresponds with  `vending=bicycle_pump` | ||||||
|   - Unselecting this answer will add <a href='https://wiki.openstreetmap.org/wiki/Key:vending:bicycle_repair_kit' target='_blank'>vending:bicycle_repair_kit</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:vending:bicycle_repair_kit%3Dno' target='_blank'>no</a> |   - *Bicycle locks are sold here*  corresponds with  `vending=bicycle_lock` | ||||||
|   - *Bicycle pumps are sold here*  corresponds with  `vending:bicycle_pump=yes` |  | ||||||
|   - Unselecting this answer will add <a href='https://wiki.openstreetmap.org/wiki/Key:vending:bicycle_pump' target='_blank'>vending:bicycle_pump</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:vending:bicycle_pump%3Dno' target='_blank'>no</a> |  | ||||||
|   - *Bicycle locks are sold here*  corresponds with  `vending:bicycle_lock=yes` |  | ||||||
|   - Unselecting this answer will add <a href='https://wiki.openstreetmap.org/wiki/Key:vending:bicycle_lock' target='_blank'>vending:bicycle_lock</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:vending:bicycle_lock%3Dno' target='_blank'>no</a> |  | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -55,6 +55,17 @@ attribute | type | values which are supported by this layer | ||||||
| [<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/room#values) [room](https://wiki.openstreetmap.org/wiki/Key:room) | Multiple choice | [administration](https://wiki.openstreetmap.org/wiki/Tag:room%3Dadministration) [auditorium](https://wiki.openstreetmap.org/wiki/Tag:room%3Dauditorium) [bedroom](https://wiki.openstreetmap.org/wiki/Tag:room%3Dbedroom) [chapel](https://wiki.openstreetmap.org/wiki/Tag:room%3Dchapel) [class](https://wiki.openstreetmap.org/wiki/Tag:room%3Dclass) [computer](https://wiki.openstreetmap.org/wiki/Tag:room%3Dcomputer) [conference](https://wiki.openstreetmap.org/wiki/Tag:room%3Dconference) [crypt](https://wiki.openstreetmap.org/wiki/Tag:room%3Dcrypt) [kitchen](https://wiki.openstreetmap.org/wiki/Tag:room%3Dkitchen) [laboratory](https://wiki.openstreetmap.org/wiki/Tag:room%3Dlaboratory) [library](https://wiki.openstreetmap.org/wiki/Tag:room%3Dlibrary) [locker](https://wiki.openstreetmap.org/wiki/Tag:room%3Dlocker) [nursery](https://wiki.openstreetmap.org/wiki/Tag:room%3Dnursery) [office](https://wiki.openstreetmap.org/wiki/Tag:room%3Doffice) [prison_cell](https://wiki.openstreetmap.org/wiki/Tag:room%3Dprison_cell) [restaurant](https://wiki.openstreetmap.org/wiki/Tag:room%3Drestaurant) [security_check](https://wiki.openstreetmap.org/wiki/Tag:room%3Dsecurity_check) [sport](https://wiki.openstreetmap.org/wiki/Tag:room%3Dsport) [storage](https://wiki.openstreetmap.org/wiki/Tag:room%3Dstorage) [technical](https://wiki.openstreetmap.org/wiki/Tag:room%3Dtechnical) [toilets](https://wiki.openstreetmap.org/wiki/Tag:room%3Dtoilets) [waiting](https://wiki.openstreetmap.org/wiki/Tag:room%3Dwaiting) | [<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/room#values) [room](https://wiki.openstreetmap.org/wiki/Key:room) | Multiple choice | [administration](https://wiki.openstreetmap.org/wiki/Tag:room%3Dadministration) [auditorium](https://wiki.openstreetmap.org/wiki/Tag:room%3Dauditorium) [bedroom](https://wiki.openstreetmap.org/wiki/Tag:room%3Dbedroom) [chapel](https://wiki.openstreetmap.org/wiki/Tag:room%3Dchapel) [class](https://wiki.openstreetmap.org/wiki/Tag:room%3Dclass) [computer](https://wiki.openstreetmap.org/wiki/Tag:room%3Dcomputer) [conference](https://wiki.openstreetmap.org/wiki/Tag:room%3Dconference) [crypt](https://wiki.openstreetmap.org/wiki/Tag:room%3Dcrypt) [kitchen](https://wiki.openstreetmap.org/wiki/Tag:room%3Dkitchen) [laboratory](https://wiki.openstreetmap.org/wiki/Tag:room%3Dlaboratory) [library](https://wiki.openstreetmap.org/wiki/Tag:room%3Dlibrary) [locker](https://wiki.openstreetmap.org/wiki/Tag:room%3Dlocker) [nursery](https://wiki.openstreetmap.org/wiki/Tag:room%3Dnursery) [office](https://wiki.openstreetmap.org/wiki/Tag:room%3Doffice) [prison_cell](https://wiki.openstreetmap.org/wiki/Tag:room%3Dprison_cell) [restaurant](https://wiki.openstreetmap.org/wiki/Tag:room%3Drestaurant) [security_check](https://wiki.openstreetmap.org/wiki/Tag:room%3Dsecurity_check) [sport](https://wiki.openstreetmap.org/wiki/Tag:room%3Dsport) [storage](https://wiki.openstreetmap.org/wiki/Tag:room%3Dstorage) [technical](https://wiki.openstreetmap.org/wiki/Tag:room%3Dtechnical) [toilets](https://wiki.openstreetmap.org/wiki/Tag:room%3Dtoilets) [waiting](https://wiki.openstreetmap.org/wiki/Tag:room%3Dwaiting) | ||||||
| [<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/capacity#values) [capacity](https://wiki.openstreetmap.org/wiki/Key:capacity) | [pnat](../SpecialInputElements.md#pnat) |  | [<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/capacity#values) [capacity](https://wiki.openstreetmap.org/wiki/Key:capacity) | [pnat](../SpecialInputElements.md#pnat) |  | ||||||
| [<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/name:etymology:wikidata#values) [name:etymology:wikidata](https://wiki.openstreetmap.org/wiki/Key:name:etymology:wikidata) | [wikidata](../SpecialInputElements.md#wikidata) |  | [<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/name:etymology:wikidata#values) [name:etymology:wikidata](https://wiki.openstreetmap.org/wiki/Key:name:etymology:wikidata) | [wikidata](../SpecialInputElements.md#wikidata) |  | ||||||
|  | [<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/access#values) [access](https://wiki.openstreetmap.org/wiki/Key:access) | [string](../SpecialInputElements.md#string) | [yes](https://wiki.openstreetmap.org/wiki/Tag:access%3Dyes) [customers](https://wiki.openstreetmap.org/wiki/Tag:access%3Dcustomers) [no](https://wiki.openstreetmap.org/wiki/Tag:access%3Dno) [key](https://wiki.openstreetmap.org/wiki/Tag:access%3Dkey) | ||||||
|  | [<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/fee#values) [fee](https://wiki.openstreetmap.org/wiki/Key:fee) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:fee%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:fee%3Dno) | ||||||
|  | [<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/charge#values) [charge](https://wiki.openstreetmap.org/wiki/Key:charge) | [string](../SpecialInputElements.md#string) |  | ||||||
|  | [<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/opening_hours#values) [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) | [opening_hours](../SpecialInputElements.md#opening_hours) | [24/7](https://wiki.openstreetmap.org/wiki/Tag:opening_hours%3D24/7) | ||||||
|  | [<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/wheelchair#values) [wheelchair](https://wiki.openstreetmap.org/wiki/Key:wheelchair) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:wheelchair%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:wheelchair%3Dno) [designated](https://wiki.openstreetmap.org/wiki/Tag:wheelchair%3Ddesignated) | ||||||
|  | [<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/door:width#values) [door:width](https://wiki.openstreetmap.org/wiki/Key:door:width) | [pfloat](../SpecialInputElements.md#pfloat) |  | ||||||
|  | [<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/toilets:position#values) [toilets:position](https://wiki.openstreetmap.org/wiki/Key:toilets:position) | Multiple choice | [seated](https://wiki.openstreetmap.org/wiki/Tag:toilets:position%3Dseated) [urinal](https://wiki.openstreetmap.org/wiki/Tag:toilets:position%3Durinal) [squat](https://wiki.openstreetmap.org/wiki/Tag:toilets:position%3Dsquat) [seated;urinal](https://wiki.openstreetmap.org/wiki/Tag:toilets:position%3Dseated;urinal) | ||||||
|  | [<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/changing_table#values) [changing_table](https://wiki.openstreetmap.org/wiki/Key:changing_table) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:changing_table%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:changing_table%3Dno) | ||||||
|  | [<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/changing_table:location#values) [changing_table:location](https://wiki.openstreetmap.org/wiki/Key:changing_table:location) | [string](../SpecialInputElements.md#string) | [female_toilet](https://wiki.openstreetmap.org/wiki/Tag:changing_table:location%3Dfemale_toilet) [male_toilet](https://wiki.openstreetmap.org/wiki/Tag:changing_table:location%3Dmale_toilet) [wheelchair_toilet](https://wiki.openstreetmap.org/wiki/Tag:changing_table:location%3Dwheelchair_toilet) [dedicated_room](https://wiki.openstreetmap.org/wiki/Tag:changing_table:location%3Ddedicated_room) | ||||||
|  | [<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/toilets:handwashing#values) [toilets:handwashing](https://wiki.openstreetmap.org/wiki/Key:toilets:handwashing) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:toilets:handwashing%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:toilets:handwashing%3Dno) | ||||||
|  | [<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/toilets:paper_supplied#values) [toilets:paper_supplied](https://wiki.openstreetmap.org/wiki/Key:toilets:paper_supplied) | Multiple choice | [yes](https://wiki.openstreetmap.org/wiki/Tag:toilets:paper_supplied%3Dyes) [no](https://wiki.openstreetmap.org/wiki/Tag:toilets:paper_supplied%3Dno) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @ -231,6 +242,276 @@ This is rendered with  `<h3>Wikipedia article of the name giver</h3>{wikipedia(n | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | ### toilet-access  | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | The question is  *Are these toilets publicly accessible?* | ||||||
|  | 
 | ||||||
|  | This rendering asks information about the property  [access](https://wiki.openstreetmap.org/wiki/Key:access)  | ||||||
|  | 
 | ||||||
|  | This is rendered with  `Access is {access}` | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |   - *Public access*  corresponds with  `access=yes` | ||||||
|  |   - *Only access to customers*  corresponds with  `access=customers` | ||||||
|  |   - *Not accessible*  corresponds with  `access=no` | ||||||
|  |   - *Accessible, but one has to ask a key to enter*  corresponds with  `access=key` | ||||||
|  |   - *Public access*  corresponds with  `access=public` | ||||||
|  |   - This option cannot be chosen as answer | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | This tagrendering is only visible in the popup if the following condition is met: `amenity=toilets` | ||||||
|  | 
 | ||||||
|  | This tagrendering has labels  `relevant-questions` | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | ### toilets-fee  | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | The question is  *Are these toilets free to use?* | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |   - *These are paid toilets*  corresponds with  `fee=yes` | ||||||
|  |   - *Free to use*  corresponds with  `fee=no` | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | This tagrendering is only visible in the popup if the following condition is met: `amenity=toilets&access!=no` | ||||||
|  | 
 | ||||||
|  | This tagrendering has labels  `relevant-questions` | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | ### toilet-charge  | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | The question is  *How much does one have to pay for these toilets?* | ||||||
|  | 
 | ||||||
|  | This rendering asks information about the property  [charge](https://wiki.openstreetmap.org/wiki/Key:charge)  | ||||||
|  | 
 | ||||||
|  | This is rendered with  `The fee is {charge}` | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | This tagrendering is only visible in the popup if the following condition is met: `amenity=toilets&fee=yes` | ||||||
|  | 
 | ||||||
|  | This tagrendering has labels  `relevant-questions` | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | ### payment-options-split  | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | The question is  *Which methods of payment are accepted here?* | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |   - *Cash is accepted here*  corresponds with  `payment:cash=yes` | ||||||
|  |   - This option cannot be chosen as answer | ||||||
|  |   - Unselecting this answer will add  | ||||||
|  |   - *Payment cards are accepted here*  corresponds with  `payment:cards=yes` | ||||||
|  |   - This option cannot be chosen as answer | ||||||
|  |   - Unselecting this answer will add  | ||||||
|  |   - *Payment by QR-code is possible here*  corresponds with  `payment:qr_code=yes` | ||||||
|  |   - Unselecting this answer will add <a href='https://wiki.openstreetmap.org/wiki/Key:payment:qr_code' target='_blank'>payment:qr_code</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:payment:qr_code%3Dno' target='_blank'>no</a> | ||||||
|  |   - *Coins are accepted here*  corresponds with  `payment:coins=yes` | ||||||
|  |   - Unselecting this answer will add <a href='https://wiki.openstreetmap.org/wiki/Key:payment:coins' target='_blank'>payment:coins</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:payment:coins%3Dno' target='_blank'>no</a> | ||||||
|  |   - *Bank notes are accepted here*  corresponds with  `payment:notes=yes` | ||||||
|  |   - Unselecting this answer will add <a href='https://wiki.openstreetmap.org/wiki/Key:payment:notes' target='_blank'>payment:notes</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:payment:notes%3Dno' target='_blank'>no</a> | ||||||
|  |   - *Debit cards are accepted here*  corresponds with  `payment:debit_cards=yes` | ||||||
|  |   - Unselecting this answer will add <a href='https://wiki.openstreetmap.org/wiki/Key:payment:debit_cards' target='_blank'>payment:debit_cards</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:payment:debit_cards%3Dno' target='_blank'>no</a> | ||||||
|  |   - *Credit cards are accepted here*  corresponds with  `payment:credit_cards=yes` | ||||||
|  |   - Unselecting this answer will add <a href='https://wiki.openstreetmap.org/wiki/Key:payment:credit_cards' target='_blank'>payment:credit_cards</a>=<a href='https://wiki.openstreetmap.org/wiki/Tag:payment:credit_cards%3Dno' target='_blank'>no</a> | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | This tagrendering is only visible in the popup if the following condition is met: `amenity=toilets&fee=yes` | ||||||
|  | 
 | ||||||
|  | This tagrendering has labels  `relevant-questions` | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | ### opening_hours_24_7  | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | The question is  *When are these toilets opened?* | ||||||
|  | 
 | ||||||
|  | This rendering asks information about the property  [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours)  | ||||||
|  | 
 | ||||||
|  | This is rendered with  `<h3>Opening hours</h3>{opening_hours_table(opening_hours)}` | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |   - *24/7 opened (including holidays)*  corresponds with  `opening_hours=24/7` | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | This tagrendering is only visible in the popup if the following condition is met: `amenity=toilets&access!=no` | ||||||
|  | 
 | ||||||
|  | This tagrendering has labels  `relevant-questions` | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | ### toilets-wheelchair  | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | The question is  *Is there a dedicated toilet for wheelchair users?* | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |   - *There is a dedicated toilet for wheelchair users*  corresponds with  `wheelchair=yes` | ||||||
|  |   - *No wheelchair access*  corresponds with  `wheelchair=no` | ||||||
|  |   - *There is only a dedicated toilet for wheelchair users*  corresponds with  `wheelchair=designated` | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | This tagrendering is only visible in the popup if the following condition is met: `amenity=toilets` | ||||||
|  | 
 | ||||||
|  | This tagrendering has labels  `relevant-questions` | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | ### wheelchair-door-width  | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | The question is  *What is the width of the door to the wheelchair accessible toilet?* | ||||||
|  | 
 | ||||||
|  | This rendering asks information about the property  [door:width](https://wiki.openstreetmap.org/wiki/Key:door:width)  | ||||||
|  | 
 | ||||||
|  | This is rendered with  `The door to the wheelchair-accessible toilet is {canonical(door:width)} wide` | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | This tagrendering is only visible in the popup if the following condition is met: `amenity=toilets&wheelchair=yes|wheelchair=designated` | ||||||
|  | 
 | ||||||
|  | This tagrendering has labels  `relevant-questions` | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | ### toilets-type  | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | The question is  *Which kind of toilets are this?* | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |   - *There are only seated toilets*  corresponds with  `toilets:position=seated` | ||||||
|  |   - *There are only urinals here*  corresponds with  `toilets:position=urinal` | ||||||
|  |   - *There are only squat toilets here*  corresponds with  `toilets:position=squat` | ||||||
|  |   - *Both seated toilets and urinals are available here*  corresponds with  `toilets:position=seated;urinal` | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | This tagrendering is only visible in the popup if the following condition is met: `amenity=toilets` | ||||||
|  | 
 | ||||||
|  | This tagrendering has labels  `relevant-questions` | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | ### toilets-changing-table  | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | The question is  *Is a changing table (to change diapers) available?* | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |   - *A changing table is available*  corresponds with  `changing_table=yes` | ||||||
|  |   - *No changing table is available*  corresponds with  `changing_table=no` | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | This tagrendering is only visible in the popup if the following condition is met: `amenity=toilets` | ||||||
|  | 
 | ||||||
|  | This tagrendering has labels  `relevant-questions` | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | ### toilet-changing_table:location  | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | The question is  *Where is the changing table located?* | ||||||
|  | 
 | ||||||
|  | This rendering asks information about the property  [changing_table:location](https://wiki.openstreetmap.org/wiki/Key:changing_table:location)  | ||||||
|  | 
 | ||||||
|  | This is rendered with  `The changing table is located at {changing_table:location}` | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |   - *The changing table is in the toilet for women. *  corresponds with  `changing_table:location=female_toilet` | ||||||
|  |   - *The changing table is in the toilet for men. *  corresponds with  `changing_table:location=male_toilet` | ||||||
|  |   - *The changing table is in the toilet for wheelchair users. *  corresponds with  `changing_table:location=wheelchair_toilet` | ||||||
|  |   - *The changing table is in a dedicated room. *  corresponds with  `changing_table:location=dedicated_room` | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | This tagrendering is only visible in the popup if the following condition is met: `amenity=toilets&changing_table=yes` | ||||||
|  | 
 | ||||||
|  | This tagrendering has labels  `relevant-questions` | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | ### toilet-handwashing  | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | The question is  *Do these toilets have a sink to wash your hands?* | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |   - *This toilets have a sink to wash your hands*  corresponds with  `toilets:handwashing=yes` | ||||||
|  |   - *This toilets <b>don't</b> have a sink to wash your hands*  corresponds with  `toilets:handwashing=no` | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | This tagrendering is only visible in the popup if the following condition is met: `amenity=toilets` | ||||||
|  | 
 | ||||||
|  | This tagrendering has labels  `relevant-questions` | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | ### toilet-has-paper  | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | The question is  *Does one have to bring their own toilet paper to this toilet?* | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  |   - *This toilet is equipped with toilet paper*  corresponds with  `toilets:paper_supplied=yes` | ||||||
|  |   - *You have to bring your own toilet paper to this toilet*  corresponds with  `toilets:paper_supplied=no` | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | This tagrendering is only visible in the popup if the following condition is met: `amenity=toilets&toilets:position!=urinal` | ||||||
|  | 
 | ||||||
|  | This tagrendering has labels  `relevant-questions` | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
| ### leftover-questions  | ### leftover-questions  | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -161,6 +161,8 @@ This is rendered with  `Access is {access}` | ||||||
|   - This option cannot be chosen as answer |   - This option cannot be chosen as answer | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | This tagrendering has labels  `relevant-questions` | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| ### toilets-fee  | ### toilets-fee  | ||||||
|  | @ -177,6 +179,8 @@ The question is  *Are these toilets free to use?* | ||||||
|   - *Free to use*  corresponds with  `fee=no` |   - *Free to use*  corresponds with  `fee=no` | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | This tagrendering has labels  `relevant-questions` | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| ### toilet-charge  | ### toilet-charge  | ||||||
|  | @ -193,6 +197,8 @@ This is rendered with  `The fee is {charge}` | ||||||
| 
 | 
 | ||||||
| This tagrendering is only visible in the popup if the following condition is met: `fee=yes` | This tagrendering is only visible in the popup if the following condition is met: `fee=yes` | ||||||
| 
 | 
 | ||||||
|  | This tagrendering has labels  `relevant-questions` | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| ### payment-options-split  | ### payment-options-split  | ||||||
|  | @ -225,6 +231,8 @@ The question is  *Which methods of payment are accepted here?* | ||||||
| 
 | 
 | ||||||
| This tagrendering is only visible in the popup if the following condition is met: `fee=yes` | This tagrendering is only visible in the popup if the following condition is met: `fee=yes` | ||||||
| 
 | 
 | ||||||
|  | This tagrendering has labels  `relevant-questions` | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| ### opening_hours_24_7  | ### opening_hours_24_7  | ||||||
|  | @ -244,6 +252,8 @@ This is rendered with  `<h3>Opening hours</h3>{opening_hours_table(opening_hours | ||||||
|   - *24/7 opened (including holidays)*  corresponds with  `opening_hours=24/7` |   - *24/7 opened (including holidays)*  corresponds with  `opening_hours=24/7` | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | This tagrendering has labels  `relevant-questions` | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| ### toilets-wheelchair  | ### toilets-wheelchair  | ||||||
|  | @ -261,6 +271,8 @@ The question is  *Is there a dedicated toilet for wheelchair users?* | ||||||
|   - *There is only a dedicated toilet for wheelchair users*  corresponds with  `wheelchair=designated` |   - *There is only a dedicated toilet for wheelchair users*  corresponds with  `wheelchair=designated` | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | This tagrendering has labels  `relevant-questions` | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| ### wheelchair-door-width  | ### wheelchair-door-width  | ||||||
|  | @ -277,6 +289,8 @@ This is rendered with  `The door to the wheelchair-accessible toilet is {canonic | ||||||
| 
 | 
 | ||||||
| This tagrendering is only visible in the popup if the following condition is met: `wheelchair=yes|wheelchair=designated` | This tagrendering is only visible in the popup if the following condition is met: `wheelchair=yes|wheelchair=designated` | ||||||
| 
 | 
 | ||||||
|  | This tagrendering has labels  `relevant-questions` | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| ### toilets-type  | ### toilets-type  | ||||||
|  | @ -295,6 +309,8 @@ The question is  *Which kind of toilets are this?* | ||||||
|   - *Both seated toilets and urinals are available here*  corresponds with  `toilets:position=seated;urinal` |   - *Both seated toilets and urinals are available here*  corresponds with  `toilets:position=seated;urinal` | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | This tagrendering has labels  `relevant-questions` | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| ### toilets-changing-table  | ### toilets-changing-table  | ||||||
|  | @ -311,6 +327,8 @@ The question is  *Is a changing table (to change diapers) available?* | ||||||
|   - *No changing table is available*  corresponds with  `changing_table=no` |   - *No changing table is available*  corresponds with  `changing_table=no` | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | This tagrendering has labels  `relevant-questions` | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| ### toilet-changing_table:location  | ### toilet-changing_table:location  | ||||||
|  | @ -335,6 +353,8 @@ This is rendered with  `The changing table is located at {changing_table:locatio | ||||||
| 
 | 
 | ||||||
| This tagrendering is only visible in the popup if the following condition is met: `changing_table=yes` | This tagrendering is only visible in the popup if the following condition is met: `changing_table=yes` | ||||||
| 
 | 
 | ||||||
|  | This tagrendering has labels  `relevant-questions` | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| ### toilet-handwashing  | ### toilet-handwashing  | ||||||
|  | @ -351,6 +371,8 @@ The question is  *Do these toilets have a sink to wash your hands?* | ||||||
|   - *This toilets <b>don't</b> have a sink to wash your hands*  corresponds with  `toilets:handwashing=no` |   - *This toilets <b>don't</b> have a sink to wash your hands*  corresponds with  `toilets:handwashing=no` | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | This tagrendering has labels  `relevant-questions` | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| ### toilet-has-paper  | ### toilet-has-paper  | ||||||
|  | @ -367,6 +389,8 @@ The question is  *Does one have to bring their own toilet paper to this toilet?* | ||||||
|   - *You have to bring your own toilet paper to this toilet*  corresponds with  `toilets:paper_supplied=no` |   - *You have to bring your own toilet paper to this toilet*  corresponds with  `toilets:paper_supplied=no` | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | This tagrendering has labels  `relevant-questions` | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| ### description  | ### description  | ||||||
|  |  | ||||||
|  | @ -255,6 +255,8 @@ The question is  *Which kind of toilets are this?* | ||||||
|   - *Both seated toilets and urinals are available here*  corresponds with  `toilets:position=seated;urinal` |   - *Both seated toilets and urinals are available here*  corresponds with  `toilets:position=seated;urinal` | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | This tagrendering has labels  `relevant-questions` | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| ### toilets-changing-table  | ### toilets-changing-table  | ||||||
|  | @ -271,6 +273,8 @@ The question is  *Is a changing table (to change diapers) available?* | ||||||
|   - *No changing table is available*  corresponds with  `changing_table=no` |   - *No changing table is available*  corresponds with  `changing_table=no` | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | This tagrendering has labels  `relevant-questions` | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| ### toilet-changing_table:location  | ### toilet-changing_table:location  | ||||||
|  | @ -295,6 +299,8 @@ This is rendered with  `The changing table is located at {changing_table:locatio | ||||||
| 
 | 
 | ||||||
| This tagrendering is only visible in the popup if the following condition is met: `changing_table=yes` | This tagrendering is only visible in the popup if the following condition is met: `changing_table=yes` | ||||||
| 
 | 
 | ||||||
|  | This tagrendering has labels  `relevant-questions` | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| ### toilet-handwashing  | ### toilet-handwashing  | ||||||
|  | @ -311,6 +317,8 @@ The question is  *Do these toilets have a sink to wash your hands?* | ||||||
|   - *This toilets <b>don't</b> have a sink to wash your hands*  corresponds with  `toilets:handwashing=no` |   - *This toilets <b>don't</b> have a sink to wash your hands*  corresponds with  `toilets:handwashing=no` | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | This tagrendering has labels  `relevant-questions` | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| ### toilet-has-paper  | ### toilet-has-paper  | ||||||
|  | @ -327,6 +335,8 @@ The question is  *Does one have to bring their own toilet paper to this toilet?* | ||||||
|   - *You have to bring your own toilet paper to this toilet*  corresponds with  `toilets:paper_supplied=no` |   - *You have to bring your own toilet paper to this toilet*  corresponds with  `toilets:paper_supplied=no` | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | This tagrendering has labels  `relevant-questions` | ||||||
|  | 
 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| ### description  | ### description  | ||||||
|  |  | ||||||
|  | @ -47,7 +47,7 @@ this quick overview is incomplete | ||||||
| attribute | type | values which are supported by this layer | attribute | type | values which are supported by this layer | ||||||
| ----------- | ------ | ------------------------------------------ | ----------- | ------ | ------------------------------------------ | ||||||
| [<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/id#values) [id](https://wiki.openstreetmap.org/wiki/Key:id) | Multiple choice |  | [<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/id#values) [id](https://wiki.openstreetmap.org/wiki/Key:id) | Multiple choice |  | ||||||
| [<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/vending#values) [vending](https://wiki.openstreetmap.org/wiki/Key:vending) | [string](../SpecialInputElements.md#string) | [drinks](https://wiki.openstreetmap.org/wiki/Tag:vending%3Ddrinks) [sweets](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dsweets) [food](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dfood) [cigarettes](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dcigarettes) [condoms](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dcondoms) [coffee](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dcoffee) [water](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dwater) [newspapers](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dnewspapers) [bicycle_tube](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dbicycle_tube) [milk](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dmilk) [bread](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dbread) [eggs](https://wiki.openstreetmap.org/wiki/Tag:vending%3Deggs) [cheese](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dcheese) [honey](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dhoney) [potatoes](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dpotatoes) [flowers](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dflowers) [parking_tickets](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dparking_tickets) [elongated_coin](https://wiki.openstreetmap.org/wiki/Tag:vending%3Delongated_coin) [public_transport_tickets](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dpublic_transport_tickets) [meat](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dmeat) | [<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/vending#values) [vending](https://wiki.openstreetmap.org/wiki/Key:vending) | [string](../SpecialInputElements.md#string) | [drinks](https://wiki.openstreetmap.org/wiki/Tag:vending%3Ddrinks) [sweets](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dsweets) [food](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dfood) [cigarettes](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dcigarettes) [condoms](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dcondoms) [coffee](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dcoffee) [water](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dwater) [newspapers](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dnewspapers) [bicycle_tube](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dbicycle_tube) [milk](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dmilk) [bread](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dbread) [eggs](https://wiki.openstreetmap.org/wiki/Tag:vending%3Deggs) [cheese](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dcheese) [honey](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dhoney) [potatoes](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dpotatoes) [meat](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dmeat) [flowers](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dflowers) [parking_tickets](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dparking_tickets) [elongated_coin](https://wiki.openstreetmap.org/wiki/Tag:vending%3Delongated_coin) [public_transport_tickets](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dpublic_transport_tickets) [bicycle_light](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dbicycle_light) [gloves](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dgloves) [bicycle_repair_kit](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dbicycle_repair_kit) [bicycle_pump](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dbicycle_pump) [bicycle_lock](https://wiki.openstreetmap.org/wiki/Tag:vending%3Dbicycle_lock) | ||||||
| [<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/opening_hours#values) [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) | [opening_hours](../SpecialInputElements.md#opening_hours) | [24/7](https://wiki.openstreetmap.org/wiki/Tag:opening_hours%3D24/7) | [<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/opening_hours#values) [opening_hours](https://wiki.openstreetmap.org/wiki/Key:opening_hours) | [opening_hours](../SpecialInputElements.md#opening_hours) | [24/7](https://wiki.openstreetmap.org/wiki/Tag:opening_hours%3D24/7) | ||||||
| [<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/payment:coins:denominations#values) [payment:coins:denominations](https://wiki.openstreetmap.org/wiki/Key:payment:coins:denominations) | Multiple choice | [0.01 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D0.01 EUR) [0.02 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D0.02 EUR) [0.05 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D0.05 EUR) [0.10 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D0.10 EUR) [0.20 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D0.20 EUR) [0.50 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D0.50 EUR) [1 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D1 EUR) [2 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D2 EUR) [0.05 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D0.05 CHF) [0.10 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D0.10 CHF) [0.20 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D0.20 CHF) [0.50 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D0.50 CHF) [1 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D1 CHF) [2 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D2 CHF) [5 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D5 CHF) | [<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/payment:coins:denominations#values) [payment:coins:denominations](https://wiki.openstreetmap.org/wiki/Key:payment:coins:denominations) | Multiple choice | [0.01 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D0.01 EUR) [0.02 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D0.02 EUR) [0.05 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D0.05 EUR) [0.10 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D0.10 EUR) [0.20 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D0.20 EUR) [0.50 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D0.50 EUR) [1 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D1 EUR) [2 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D2 EUR) [0.05 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D0.05 CHF) [0.10 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D0.10 CHF) [0.20 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D0.20 CHF) [0.50 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D0.50 CHF) [1 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D1 CHF) [2 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D2 CHF) [5 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:coins:denominations%3D5 CHF) | ||||||
| [<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/payment:notes:denominations#values) [payment:notes:denominations](https://wiki.openstreetmap.org/wiki/Key:payment:notes:denominations) | Multiple choice | [5 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D5 EUR) [10 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D10 EUR) [20 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D20 EUR) [50 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D50 EUR) [100 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D100 EUR) [200 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D200 EUR) [500 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D500 EUR) [10 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D10 CHF) [20 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D20 CHF) [50 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D50 CHF) [100 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D100 CHF) [200 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D200 CHF) [1000 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D1000 CHF) | [<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/payment:notes:denominations#values) [payment:notes:denominations](https://wiki.openstreetmap.org/wiki/Key:payment:notes:denominations) | Multiple choice | [5 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D5 EUR) [10 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D10 EUR) [20 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D20 EUR) [50 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D50 EUR) [100 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D100 EUR) [200 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D200 EUR) [500 EUR](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D500 EUR) [10 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D10 CHF) [20 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D20 CHF) [50 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D50 CHF) [100 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D100 CHF) [200 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D200 CHF) [1000 CHF](https://wiki.openstreetmap.org/wiki/Tag:payment:notes:denominations%3D1000 CHF) | ||||||
|  | @ -119,11 +119,16 @@ This is rendered with  `This vending machine sells {vending}` | ||||||
|   - *Cheese is sold*  corresponds with  `vending=cheese` |   - *Cheese is sold*  corresponds with  `vending=cheese` | ||||||
|   - *Honey is sold*  corresponds with  `vending=honey` |   - *Honey is sold*  corresponds with  `vending=honey` | ||||||
|   - *Potatoes are sold*  corresponds with  `vending=potatoes` |   - *Potatoes are sold*  corresponds with  `vending=potatoes` | ||||||
|  |   - *Meat is sold*  corresponds with  `vending=meat` | ||||||
|   - *Flowers are sold*  corresponds with  `vending=flowers` |   - *Flowers are sold*  corresponds with  `vending=flowers` | ||||||
|   - *Parking tickets are sold*  corresponds with  `vending=parking_tickets` |   - *Parking tickets are sold*  corresponds with  `vending=parking_tickets` | ||||||
|   - *Pressed pennies are sold*  corresponds with  `vending=elongated_coin` |   - *Pressed pennies are sold*  corresponds with  `vending=elongated_coin` | ||||||
|   - *Public transport tickets are sold*  corresponds with  `vending=public_transport_tickets` |   - *Public transport tickets are sold*  corresponds with  `vending=public_transport_tickets` | ||||||
|   - *Meat products are being sold*  corresponds with  `vending=meat` |   - *Bicycle lights are sold*  corresponds with  `vending=bicycle_light` | ||||||
|  |   - *Gloves are sold*  corresponds with  `vending=gloves` | ||||||
|  |   - *Bicycle repair kits are sold*  corresponds with  `vending=bicycle_repair_kit` | ||||||
|  |   - *Bicycle pumps are sold*  corresponds with  `vending=bicycle_pump` | ||||||
|  |   - *Bicycle locks are sold*  corresponds with  `vending=bicycle_lock` | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @ -429,11 +434,16 @@ vending.12 | Sale of eggs | vending~^(.*eggs.*)$ | ||||||
| vending.13 | Sale of cheese | vending~^(.*cheese.*)$ | vending.13 | Sale of cheese | vending~^(.*cheese.*)$ | ||||||
| vending.14 | Sale of honey | vending~^(.*honey.*)$ | vending.14 | Sale of honey | vending~^(.*honey.*)$ | ||||||
| vending.15 | Sale of potatoes | vending~^(.*potatoes.*)$ | vending.15 | Sale of potatoes | vending~^(.*potatoes.*)$ | ||||||
| vending.16 | Sale of flowers | vending~^(.*flowers.*)$ | vending.16 | Sale of meat | vending~^(.*meat.*)$ | ||||||
| vending.17 | Sale of parking | vending~^(.*parking_tickets.*)$ | vending.17 | Sale of flowers | vending~^(.*flowers.*)$ | ||||||
| vending.18 | Sale of pressed pennies | vending=elongated_coin | vending.18 | Sale of parking tickets | vending~^(.*parking_tickets.*)$ | ||||||
| vending.19 | Sale of public transport tickets | vending~^(.*public_transport_tickets.*)$ | vending.19 | Sale of pressed pennies | vending=elongated_coin | ||||||
| vending.20 | Sale of meat products | vending=meat | vending.20 | Sale of public transport tickets | vending~^(.*public_transport_tickets.*)$ | ||||||
|  | vending.21 | Sale of bicycle lights | vending=bicycle_light | ||||||
|  | vending.22 | Sale of gloves | vending=gloves | ||||||
|  | vending.23 | Sale of bicycle repair kits | vending=bicycle_repair_kit | ||||||
|  | vending.24 | Sale of bicycle pumps | vending=bicycle_pump | ||||||
|  | vending.25 | Sale of bicycle locks | vending=bicycle_lock | ||||||
|   |   | ||||||
| 
 | 
 | ||||||
| This document is autogenerated from [assets/layers/vending_machine/vending_machine.json](https://github.com/pietervdvn/MapComplete/blob/develop/assets/layers/vending_machine/vending_machine.json) | This document is autogenerated from [assets/layers/vending_machine/vending_machine.json](https://github.com/pietervdvn/MapComplete/blob/develop/assets/layers/vending_machine/vending_machine.json) | ||||||
|  |  | ||||||
|  | @ -49,7 +49,7 @@ this quick overview is incomplete | ||||||
| attribute | type | values which are supported by this layer | attribute | type | values which are supported by this layer | ||||||
| ----------- | ------ | ------------------------------------------ | ----------- | ------ | ------------------------------------------ | ||||||
| [<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/id#values) [id](https://wiki.openstreetmap.org/wiki/Key:id) | Multiple choice |  | [<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/id#values) [id](https://wiki.openstreetmap.org/wiki/Key:id) | Multiple choice |  | ||||||
| [<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/waste#values) [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) | [<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/waste#values) [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) [paper](https://wiki.openstreetmap.org/wiki/Tag:waste%3Dpaper) | ||||||
| [<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/vending#values) [vending](https://wiki.openstreetmap.org/wiki/Key:vending) | Multiple choice | [dog_excrement_bag](https://wiki.openstreetmap.org/wiki/Tag:vending%3Ddog_excrement_bag) [](https://wiki.openstreetmap.org/wiki/Tag:vending%3D) | [<img src='https://mapcomplete.org/assets/svg/statistics.svg' height='18px'>](https://taginfo.openstreetmap.org/keys/vending#values) [vending](https://wiki.openstreetmap.org/wiki/Key:vending) | Multiple choice | [dog_excrement_bag](https://wiki.openstreetmap.org/wiki/Tag:vending%3Ddog_excrement_bag) [](https://wiki.openstreetmap.org/wiki/Tag:vending%3D) | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  | @ -104,6 +104,7 @@ The question is  *What kind of waste basket is this?* | ||||||
|   - *A waste basket for drugs*  corresponds with  `waste=drugs` |   - *A waste basket for drugs*  corresponds with  `waste=drugs` | ||||||
|   - *A waste basket for needles and other sharp objects*  corresponds with  `waste=sharps` |   - *A waste basket for needles and other sharp objects*  corresponds with  `waste=sharps` | ||||||
|   - *A waste basket for plastic*  corresponds with  `waste=plastic` |   - *A waste basket for plastic*  corresponds with  `waste=plastic` | ||||||
|  |   - *A waste basket for paper*  corresponds with  `waste=paper` | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
|  | @ -988,18 +988,38 @@ | ||||||
|       "description": "Layer 'Bicycle tube vending machine' shows and asks freeform values for key 'charge' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')" |       "description": "Layer 'Bicycle tube vending machine' shows and asks freeform values for key 'charge' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')" | ||||||
|     }, |     }, | ||||||
|     { |     { | ||||||
|       "key": "payment:coins", |       "key": "payment:cash", | ||||||
|       "description": "Layer 'Bicycle tube vending machine' shows payment:coins=yes with a fixed text, namely 'Payment with coins is possible' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')", |       "description": "Layer 'Bicycle tube vending machine' shows payment:cash=yes with a fixed text, namely 'Cash is accepted here' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')", | ||||||
|       "value": "yes" |  | ||||||
|     }, |  | ||||||
|     { |  | ||||||
|       "key": "payment:notes", |  | ||||||
|       "description": "Layer 'Bicycle tube vending machine' shows payment:notes=yes with a fixed text, namely 'Payment with notes is possible' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')", |  | ||||||
|       "value": "yes" |       "value": "yes" | ||||||
|     }, |     }, | ||||||
|     { |     { | ||||||
|       "key": "payment:cards", |       "key": "payment:cards", | ||||||
|       "description": "Layer 'Bicycle tube vending machine' shows payment:cards=yes with a fixed text, namely 'Payment with cards is possible' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')", |       "description": "Layer 'Bicycle tube vending machine' shows payment:cards=yes with a fixed text, namely 'Payment cards are accepted here' (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')", | ||||||
|  |       "value": "yes" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "key": "payment:qr_code", | ||||||
|  |       "description": "Layer 'Bicycle tube vending machine' shows payment:qr_code=yes with a fixed text, namely 'Payment by QR-code is possible here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')", | ||||||
|  |       "value": "yes" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "key": "payment:coins", | ||||||
|  |       "description": "Layer 'Bicycle tube vending machine' shows payment:coins=yes with a fixed text, namely 'Coins are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')", | ||||||
|  |       "value": "yes" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "key": "payment:notes", | ||||||
|  |       "description": "Layer 'Bicycle tube vending machine' shows payment:notes=yes with a fixed text, namely 'Bank notes are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')", | ||||||
|  |       "value": "yes" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "key": "payment:debit_cards", | ||||||
|  |       "description": "Layer 'Bicycle tube vending machine' shows payment:debit_cards=yes with a fixed text, namely 'Debit cards are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')", | ||||||
|  |       "value": "yes" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "key": "payment:credit_cards", | ||||||
|  |       "description": "Layer 'Bicycle tube vending machine' shows payment:credit_cards=yes with a fixed text, namely 'Credit cards are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')", | ||||||
|       "value": "yes" |       "value": "yes" | ||||||
|     }, |     }, | ||||||
|     { |     { | ||||||
|  | @ -1031,29 +1051,34 @@ | ||||||
|       "value": "Continental" |       "value": "Continental" | ||||||
|     }, |     }, | ||||||
|     { |     { | ||||||
|       "key": "vending:bicycle_light", |       "key": "vending", | ||||||
|       "description": "Layer 'Bicycle tube vending machine' shows vending:bicycle_light=yes with a fixed text, namely 'Bicycle lights are sold here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')", |       "description": "Layer 'Bicycle tube vending machine' shows vending=bicycle_tube with a fixed text, namely 'Bicycle inner tubes are sold here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')", | ||||||
|       "value": "yes" |       "value": "bicycle_tube" | ||||||
|     }, |     }, | ||||||
|     { |     { | ||||||
|       "key": "vending:gloves", |       "key": "vending", | ||||||
|       "description": "Layer 'Bicycle tube vending machine' shows vending:gloves=yes with a fixed text, namely 'Gloves are sold here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')", |       "description": "Layer 'Bicycle tube vending machine' shows vending=bicycle_light with a fixed text, namely 'Bicycle lights are sold here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')", | ||||||
|       "value": "yes" |       "value": "bicycle_light" | ||||||
|     }, |     }, | ||||||
|     { |     { | ||||||
|       "key": "vending:bicycle_repair_kit", |       "key": "vending", | ||||||
|       "description": "Layer 'Bicycle tube vending machine' shows vending:bicycle_repair_kit=yes with a fixed text, namely 'Bicycle repair kits are sold here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')", |       "description": "Layer 'Bicycle tube vending machine' shows vending=gloves with a fixed text, namely 'Gloves are sold here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')", | ||||||
|       "value": "yes" |       "value": "gloves" | ||||||
|     }, |     }, | ||||||
|     { |     { | ||||||
|       "key": "vending:bicycle_pump", |       "key": "vending", | ||||||
|       "description": "Layer 'Bicycle tube vending machine' shows vending:bicycle_pump=yes with a fixed text, namely 'Bicycle pumps are sold here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')", |       "description": "Layer 'Bicycle tube vending machine' shows vending=bicycle_repair_kit with a fixed text, namely 'Bicycle repair kits are sold here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')", | ||||||
|       "value": "yes" |       "value": "bicycle_repair_kit" | ||||||
|     }, |     }, | ||||||
|     { |     { | ||||||
|       "key": "vending:bicycle_lock", |       "key": "vending", | ||||||
|       "description": "Layer 'Bicycle tube vending machine' shows vending:bicycle_lock=yes with a fixed text, namely 'Bicycle locks are sold here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')", |       "description": "Layer 'Bicycle tube vending machine' shows vending=bicycle_pump with a fixed text, namely 'Bicycle pumps are sold here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')", | ||||||
|       "value": "yes" |       "value": "bicycle_pump" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "key": "vending", | ||||||
|  |       "description": "Layer 'Bicycle tube vending machine' shows vending=bicycle_lock with a fixed text, namely 'Bicycle locks are sold here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Cyclofix - a map for cyclists')", | ||||||
|  |       "value": "bicycle_lock" | ||||||
|     }, |     }, | ||||||
|     { |     { | ||||||
|       "key": "amenity", |       "key": "amenity", | ||||||
|  |  | ||||||
|  | @ -215,6 +215,186 @@ | ||||||
|       "key": "name:etymology:wikidata", |       "key": "name:etymology:wikidata", | ||||||
|       "description": "Layer 'Indoors' shows and asks freeform values for key 'name:etymology:wikidata' (in the mapcomplete.org theme 'Indoors') (This is only shown if name:etymology!=unknown)" |       "description": "Layer 'Indoors' shows and asks freeform values for key 'name:etymology:wikidata' (in the mapcomplete.org theme 'Indoors') (This is only shown if name:etymology!=unknown)" | ||||||
|     }, |     }, | ||||||
|  |     { | ||||||
|  |       "key": "access", | ||||||
|  |       "description": "Layer 'Indoors' shows and asks freeform values for key 'access' (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets)" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "key": "access", | ||||||
|  |       "description": "Layer 'Indoors' shows access=yes with a fixed text, namely 'Public access' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets)", | ||||||
|  |       "value": "yes" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "key": "access", | ||||||
|  |       "description": "Layer 'Indoors' shows access=customers with a fixed text, namely 'Only access to customers' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets)", | ||||||
|  |       "value": "customers" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "key": "access", | ||||||
|  |       "description": "Layer 'Indoors' shows access=no with a fixed text, namely 'Not accessible' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets)", | ||||||
|  |       "value": "no" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "key": "access", | ||||||
|  |       "description": "Layer 'Indoors' shows access=key with a fixed text, namely 'Accessible, but one has to ask a key to enter' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets)", | ||||||
|  |       "value": "key" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "key": "access", | ||||||
|  |       "description": "Layer 'Indoors' shows access=public with a fixed text, namely 'Public access' (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets)", | ||||||
|  |       "value": "public" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "key": "fee", | ||||||
|  |       "description": "Layer 'Indoors' shows fee=yes with a fixed text, namely 'These are paid toilets' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets&access!=no)", | ||||||
|  |       "value": "yes" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "key": "fee", | ||||||
|  |       "description": "Layer 'Indoors' shows fee=no with a fixed text, namely 'Free to use' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets&access!=no)", | ||||||
|  |       "value": "no" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "key": "charge", | ||||||
|  |       "description": "Layer 'Indoors' shows and asks freeform values for key 'charge' (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets&fee=yes)" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "key": "payment:cash", | ||||||
|  |       "description": "Layer 'Indoors' shows payment:cash=yes with a fixed text, namely 'Cash is accepted here' (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets&fee=yes)", | ||||||
|  |       "value": "yes" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "key": "payment:cards", | ||||||
|  |       "description": "Layer 'Indoors' shows payment:cards=yes with a fixed text, namely 'Payment cards are accepted here' (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets&fee=yes)", | ||||||
|  |       "value": "yes" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "key": "payment:qr_code", | ||||||
|  |       "description": "Layer 'Indoors' shows payment:qr_code=yes with a fixed text, namely 'Payment by QR-code is possible here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets&fee=yes)", | ||||||
|  |       "value": "yes" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "key": "payment:coins", | ||||||
|  |       "description": "Layer 'Indoors' shows payment:coins=yes with a fixed text, namely 'Coins are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets&fee=yes)", | ||||||
|  |       "value": "yes" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "key": "payment:notes", | ||||||
|  |       "description": "Layer 'Indoors' shows payment:notes=yes with a fixed text, namely 'Bank notes are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets&fee=yes)", | ||||||
|  |       "value": "yes" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "key": "payment:debit_cards", | ||||||
|  |       "description": "Layer 'Indoors' shows payment:debit_cards=yes with a fixed text, namely 'Debit cards are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets&fee=yes)", | ||||||
|  |       "value": "yes" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "key": "payment:credit_cards", | ||||||
|  |       "description": "Layer 'Indoors' shows payment:credit_cards=yes with a fixed text, namely 'Credit cards are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets&fee=yes)", | ||||||
|  |       "value": "yes" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "key": "opening_hours", | ||||||
|  |       "description": "Layer 'Indoors' shows and asks freeform values for key 'opening_hours' (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets&access!=no)" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "key": "opening_hours", | ||||||
|  |       "description": "Layer 'Indoors' shows opening_hours=24/7 with a fixed text, namely '24/7 opened (including holidays)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets&access!=no)", | ||||||
|  |       "value": "24/7" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "key": "wheelchair", | ||||||
|  |       "description": "Layer 'Indoors' shows wheelchair=yes with a fixed text, namely 'There is a dedicated toilet for wheelchair users' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets)", | ||||||
|  |       "value": "yes" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "key": "wheelchair", | ||||||
|  |       "description": "Layer 'Indoors' shows wheelchair=no with a fixed text, namely 'No wheelchair access' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets)", | ||||||
|  |       "value": "no" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "key": "wheelchair", | ||||||
|  |       "description": "Layer 'Indoors' shows wheelchair=designated with a fixed text, namely 'There is only a dedicated toilet for wheelchair users' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets)", | ||||||
|  |       "value": "designated" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "key": "door:width", | ||||||
|  |       "description": "Layer 'Indoors' shows and asks freeform values for key 'door:width' (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets&wheelchair=yes|wheelchair=designated)" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "key": "toilets:position", | ||||||
|  |       "description": "Layer 'Indoors' shows toilets:position=seated with a fixed text, namely 'There are only seated toilets' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets)", | ||||||
|  |       "value": "seated" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "key": "toilets:position", | ||||||
|  |       "description": "Layer 'Indoors' shows toilets:position=urinal with a fixed text, namely 'There are only urinals here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets)", | ||||||
|  |       "value": "urinal" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "key": "toilets:position", | ||||||
|  |       "description": "Layer 'Indoors' shows toilets:position=squat with a fixed text, namely 'There are only squat toilets here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets)", | ||||||
|  |       "value": "squat" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "key": "toilets:position", | ||||||
|  |       "description": "Layer 'Indoors' shows toilets:position=seated;urinal with a fixed text, namely 'Both seated toilets and urinals are available here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets)", | ||||||
|  |       "value": "seated;urinal" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "key": "changing_table", | ||||||
|  |       "description": "Layer 'Indoors' shows changing_table=yes with a fixed text, namely 'A changing table is available' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets)", | ||||||
|  |       "value": "yes" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "key": "changing_table", | ||||||
|  |       "description": "Layer 'Indoors' shows changing_table=no with a fixed text, namely 'No changing table is available' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets)", | ||||||
|  |       "value": "no" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "key": "changing_table:location", | ||||||
|  |       "description": "Layer 'Indoors' shows and asks freeform values for key 'changing_table:location' (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets&changing_table=yes)" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "key": "changing_table:location", | ||||||
|  |       "description": "Layer 'Indoors' shows changing_table:location=female_toilet with a fixed text, namely 'The changing table is in the toilet for women. ' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets&changing_table=yes)", | ||||||
|  |       "value": "female_toilet" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "key": "changing_table:location", | ||||||
|  |       "description": "Layer 'Indoors' shows changing_table:location=male_toilet with a fixed text, namely 'The changing table is in the toilet for men. ' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets&changing_table=yes)", | ||||||
|  |       "value": "male_toilet" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "key": "changing_table:location", | ||||||
|  |       "description": "Layer 'Indoors' shows changing_table:location=wheelchair_toilet with a fixed text, namely 'The changing table is in the toilet for wheelchair users. ' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets&changing_table=yes)", | ||||||
|  |       "value": "wheelchair_toilet" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "key": "changing_table:location", | ||||||
|  |       "description": "Layer 'Indoors' shows changing_table:location=dedicated_room with a fixed text, namely 'The changing table is in a dedicated room. ' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets&changing_table=yes)", | ||||||
|  |       "value": "dedicated_room" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "key": "toilets:handwashing", | ||||||
|  |       "description": "Layer 'Indoors' shows toilets:handwashing=yes with a fixed text, namely 'This toilets have a sink to wash your hands' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets)", | ||||||
|  |       "value": "yes" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "key": "toilets:handwashing", | ||||||
|  |       "description": "Layer 'Indoors' shows toilets:handwashing=no with a fixed text, namely 'This toilets <b>don't</b> have a sink to wash your hands' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets)", | ||||||
|  |       "value": "no" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "key": "toilets:paper_supplied", | ||||||
|  |       "description": "Layer 'Indoors' shows toilets:paper_supplied=yes with a fixed text, namely 'This toilet is equipped with toilet paper' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets&toilets:position!=urinal)", | ||||||
|  |       "value": "yes" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "key": "toilets:paper_supplied", | ||||||
|  |       "description": "Layer 'Indoors' shows toilets:paper_supplied=no with a fixed text, namely 'You have to bring your own toilet paper to this toilet' and allows to pick this as a default answer (in the mapcomplete.org theme 'Indoors') (This is only shown if amenity=toilets&toilets:position!=urinal)", | ||||||
|  |       "value": "no" | ||||||
|  |     }, | ||||||
|     { |     { | ||||||
|       "key": "highway", |       "key": "highway", | ||||||
|       "description": "The MapComplete theme Indoors has a layer Pedestrian paths showing features with this tag", |       "description": "The MapComplete theme Indoors has a layer Pedestrian paths showing features with this tag", | ||||||
|  |  | ||||||
|  | @ -1514,18 +1514,38 @@ | ||||||
|       "description": "Layer 'Bicycle tube vending machine' shows and asks freeform values for key 'charge' (in the mapcomplete.org theme 'Personal theme')" |       "description": "Layer 'Bicycle tube vending machine' shows and asks freeform values for key 'charge' (in the mapcomplete.org theme 'Personal theme')" | ||||||
|     }, |     }, | ||||||
|     { |     { | ||||||
|       "key": "payment:coins", |       "key": "payment:cash", | ||||||
|       "description": "Layer 'Bicycle tube vending machine' shows payment:coins=yes with a fixed text, namely 'Payment with coins is possible' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", |       "description": "Layer 'Bicycle tube vending machine' shows payment:cash=yes with a fixed text, namely 'Cash is accepted here' (in the mapcomplete.org theme 'Personal theme')", | ||||||
|       "value": "yes" |  | ||||||
|     }, |  | ||||||
|     { |  | ||||||
|       "key": "payment:notes", |  | ||||||
|       "description": "Layer 'Bicycle tube vending machine' shows payment:notes=yes with a fixed text, namely 'Payment with notes is possible' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", |  | ||||||
|       "value": "yes" |       "value": "yes" | ||||||
|     }, |     }, | ||||||
|     { |     { | ||||||
|       "key": "payment:cards", |       "key": "payment:cards", | ||||||
|       "description": "Layer 'Bicycle tube vending machine' shows payment:cards=yes with a fixed text, namely 'Payment with cards is possible' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", |       "description": "Layer 'Bicycle tube vending machine' shows payment:cards=yes with a fixed text, namely 'Payment cards are accepted here' (in the mapcomplete.org theme 'Personal theme')", | ||||||
|  |       "value": "yes" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "key": "payment:qr_code", | ||||||
|  |       "description": "Layer 'Bicycle tube vending machine' shows payment:qr_code=yes with a fixed text, namely 'Payment by QR-code is possible here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", | ||||||
|  |       "value": "yes" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "key": "payment:coins", | ||||||
|  |       "description": "Layer 'Bicycle tube vending machine' shows payment:coins=yes with a fixed text, namely 'Coins are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", | ||||||
|  |       "value": "yes" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "key": "payment:notes", | ||||||
|  |       "description": "Layer 'Bicycle tube vending machine' shows payment:notes=yes with a fixed text, namely 'Bank notes are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", | ||||||
|  |       "value": "yes" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "key": "payment:debit_cards", | ||||||
|  |       "description": "Layer 'Bicycle tube vending machine' shows payment:debit_cards=yes with a fixed text, namely 'Debit cards are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", | ||||||
|  |       "value": "yes" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "key": "payment:credit_cards", | ||||||
|  |       "description": "Layer 'Bicycle tube vending machine' shows payment:credit_cards=yes with a fixed text, namely 'Credit cards are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", | ||||||
|       "value": "yes" |       "value": "yes" | ||||||
|     }, |     }, | ||||||
|     { |     { | ||||||
|  | @ -1557,29 +1577,34 @@ | ||||||
|       "value": "Continental" |       "value": "Continental" | ||||||
|     }, |     }, | ||||||
|     { |     { | ||||||
|       "key": "vending:bicycle_light", |       "key": "vending", | ||||||
|       "description": "Layer 'Bicycle tube vending machine' shows vending:bicycle_light=yes with a fixed text, namely 'Bicycle lights are sold here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", |       "description": "Layer 'Bicycle tube vending machine' shows vending=bicycle_tube with a fixed text, namely 'Bicycle inner tubes are sold here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", | ||||||
|       "value": "yes" |       "value": "bicycle_tube" | ||||||
|     }, |     }, | ||||||
|     { |     { | ||||||
|       "key": "vending:gloves", |       "key": "vending", | ||||||
|       "description": "Layer 'Bicycle tube vending machine' shows vending:gloves=yes with a fixed text, namely 'Gloves are sold here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", |       "description": "Layer 'Bicycle tube vending machine' shows vending=bicycle_light with a fixed text, namely 'Bicycle lights are sold here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", | ||||||
|       "value": "yes" |       "value": "bicycle_light" | ||||||
|     }, |     }, | ||||||
|     { |     { | ||||||
|       "key": "vending:bicycle_repair_kit", |       "key": "vending", | ||||||
|       "description": "Layer 'Bicycle tube vending machine' shows vending:bicycle_repair_kit=yes with a fixed text, namely 'Bicycle repair kits are sold here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", |       "description": "Layer 'Bicycle tube vending machine' shows vending=gloves with a fixed text, namely 'Gloves are sold here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", | ||||||
|       "value": "yes" |       "value": "gloves" | ||||||
|     }, |     }, | ||||||
|     { |     { | ||||||
|       "key": "vending:bicycle_pump", |       "key": "vending", | ||||||
|       "description": "Layer 'Bicycle tube vending machine' shows vending:bicycle_pump=yes with a fixed text, namely 'Bicycle pumps are sold here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", |       "description": "Layer 'Bicycle tube vending machine' shows vending=bicycle_repair_kit with a fixed text, namely 'Bicycle repair kits are sold here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", | ||||||
|       "value": "yes" |       "value": "bicycle_repair_kit" | ||||||
|     }, |     }, | ||||||
|     { |     { | ||||||
|       "key": "vending:bicycle_lock", |       "key": "vending", | ||||||
|       "description": "Layer 'Bicycle tube vending machine' shows vending:bicycle_lock=yes with a fixed text, namely 'Bicycle locks are sold here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", |       "description": "Layer 'Bicycle tube vending machine' shows vending=bicycle_pump with a fixed text, namely 'Bicycle pumps are sold here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", | ||||||
|       "value": "yes" |       "value": "bicycle_pump" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "key": "vending", | ||||||
|  |       "description": "Layer 'Bicycle tube vending machine' shows vending=bicycle_lock with a fixed text, namely 'Bicycle locks are sold here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", | ||||||
|  |       "value": "bicycle_lock" | ||||||
|     }, |     }, | ||||||
|     { |     { | ||||||
|       "key": "amenity", |       "key": "amenity", | ||||||
|  | @ -8548,6 +8573,186 @@ | ||||||
|       "key": "name:etymology:wikidata", |       "key": "name:etymology:wikidata", | ||||||
|       "description": "Layer 'Indoors' shows and asks freeform values for key 'name:etymology:wikidata' (in the mapcomplete.org theme 'Personal theme') (This is only shown if name:etymology!=unknown)" |       "description": "Layer 'Indoors' shows and asks freeform values for key 'name:etymology:wikidata' (in the mapcomplete.org theme 'Personal theme') (This is only shown if name:etymology!=unknown)" | ||||||
|     }, |     }, | ||||||
|  |     { | ||||||
|  |       "key": "access", | ||||||
|  |       "description": "Layer 'Indoors' shows and asks freeform values for key 'access' (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets)" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "key": "access", | ||||||
|  |       "description": "Layer 'Indoors' shows access=yes with a fixed text, namely 'Public access' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets)", | ||||||
|  |       "value": "yes" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "key": "access", | ||||||
|  |       "description": "Layer 'Indoors' shows access=customers with a fixed text, namely 'Only access to customers' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets)", | ||||||
|  |       "value": "customers" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "key": "access", | ||||||
|  |       "description": "Layer 'Indoors' shows access=no with a fixed text, namely 'Not accessible' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets)", | ||||||
|  |       "value": "no" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "key": "access", | ||||||
|  |       "description": "Layer 'Indoors' shows access=key with a fixed text, namely 'Accessible, but one has to ask a key to enter' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets)", | ||||||
|  |       "value": "key" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "key": "access", | ||||||
|  |       "description": "Layer 'Indoors' shows access=public with a fixed text, namely 'Public access' (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets)", | ||||||
|  |       "value": "public" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "key": "fee", | ||||||
|  |       "description": "Layer 'Indoors' shows fee=yes with a fixed text, namely 'These are paid toilets' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets&access!=no)", | ||||||
|  |       "value": "yes" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "key": "fee", | ||||||
|  |       "description": "Layer 'Indoors' shows fee=no with a fixed text, namely 'Free to use' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets&access!=no)", | ||||||
|  |       "value": "no" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "key": "charge", | ||||||
|  |       "description": "Layer 'Indoors' shows and asks freeform values for key 'charge' (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets&fee=yes)" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "key": "payment:cash", | ||||||
|  |       "description": "Layer 'Indoors' shows payment:cash=yes with a fixed text, namely 'Cash is accepted here' (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets&fee=yes)", | ||||||
|  |       "value": "yes" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "key": "payment:cards", | ||||||
|  |       "description": "Layer 'Indoors' shows payment:cards=yes with a fixed text, namely 'Payment cards are accepted here' (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets&fee=yes)", | ||||||
|  |       "value": "yes" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "key": "payment:qr_code", | ||||||
|  |       "description": "Layer 'Indoors' shows payment:qr_code=yes with a fixed text, namely 'Payment by QR-code is possible here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets&fee=yes)", | ||||||
|  |       "value": "yes" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "key": "payment:coins", | ||||||
|  |       "description": "Layer 'Indoors' shows payment:coins=yes with a fixed text, namely 'Coins are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets&fee=yes)", | ||||||
|  |       "value": "yes" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "key": "payment:notes", | ||||||
|  |       "description": "Layer 'Indoors' shows payment:notes=yes with a fixed text, namely 'Bank notes are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets&fee=yes)", | ||||||
|  |       "value": "yes" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "key": "payment:debit_cards", | ||||||
|  |       "description": "Layer 'Indoors' shows payment:debit_cards=yes with a fixed text, namely 'Debit cards are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets&fee=yes)", | ||||||
|  |       "value": "yes" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "key": "payment:credit_cards", | ||||||
|  |       "description": "Layer 'Indoors' shows payment:credit_cards=yes with a fixed text, namely 'Credit cards are accepted here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets&fee=yes)", | ||||||
|  |       "value": "yes" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "key": "opening_hours", | ||||||
|  |       "description": "Layer 'Indoors' shows and asks freeform values for key 'opening_hours' (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets&access!=no)" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "key": "opening_hours", | ||||||
|  |       "description": "Layer 'Indoors' shows opening_hours=24/7 with a fixed text, namely '24/7 opened (including holidays)' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets&access!=no)", | ||||||
|  |       "value": "24/7" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "key": "wheelchair", | ||||||
|  |       "description": "Layer 'Indoors' shows wheelchair=yes with a fixed text, namely 'There is a dedicated toilet for wheelchair users' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets)", | ||||||
|  |       "value": "yes" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "key": "wheelchair", | ||||||
|  |       "description": "Layer 'Indoors' shows wheelchair=no with a fixed text, namely 'No wheelchair access' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets)", | ||||||
|  |       "value": "no" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "key": "wheelchair", | ||||||
|  |       "description": "Layer 'Indoors' shows wheelchair=designated with a fixed text, namely 'There is only a dedicated toilet for wheelchair users' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets)", | ||||||
|  |       "value": "designated" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "key": "door:width", | ||||||
|  |       "description": "Layer 'Indoors' shows and asks freeform values for key 'door:width' (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets&wheelchair=yes|wheelchair=designated)" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "key": "toilets:position", | ||||||
|  |       "description": "Layer 'Indoors' shows toilets:position=seated with a fixed text, namely 'There are only seated toilets' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets)", | ||||||
|  |       "value": "seated" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "key": "toilets:position", | ||||||
|  |       "description": "Layer 'Indoors' shows toilets:position=urinal with a fixed text, namely 'There are only urinals here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets)", | ||||||
|  |       "value": "urinal" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "key": "toilets:position", | ||||||
|  |       "description": "Layer 'Indoors' shows toilets:position=squat with a fixed text, namely 'There are only squat toilets here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets)", | ||||||
|  |       "value": "squat" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "key": "toilets:position", | ||||||
|  |       "description": "Layer 'Indoors' shows toilets:position=seated;urinal with a fixed text, namely 'Both seated toilets and urinals are available here' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets)", | ||||||
|  |       "value": "seated;urinal" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "key": "changing_table", | ||||||
|  |       "description": "Layer 'Indoors' shows changing_table=yes with a fixed text, namely 'A changing table is available' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets)", | ||||||
|  |       "value": "yes" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "key": "changing_table", | ||||||
|  |       "description": "Layer 'Indoors' shows changing_table=no with a fixed text, namely 'No changing table is available' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets)", | ||||||
|  |       "value": "no" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "key": "changing_table:location", | ||||||
|  |       "description": "Layer 'Indoors' shows and asks freeform values for key 'changing_table:location' (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets&changing_table=yes)" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "key": "changing_table:location", | ||||||
|  |       "description": "Layer 'Indoors' shows changing_table:location=female_toilet with a fixed text, namely 'The changing table is in the toilet for women. ' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets&changing_table=yes)", | ||||||
|  |       "value": "female_toilet" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "key": "changing_table:location", | ||||||
|  |       "description": "Layer 'Indoors' shows changing_table:location=male_toilet with a fixed text, namely 'The changing table is in the toilet for men. ' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets&changing_table=yes)", | ||||||
|  |       "value": "male_toilet" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "key": "changing_table:location", | ||||||
|  |       "description": "Layer 'Indoors' shows changing_table:location=wheelchair_toilet with a fixed text, namely 'The changing table is in the toilet for wheelchair users. ' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets&changing_table=yes)", | ||||||
|  |       "value": "wheelchair_toilet" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "key": "changing_table:location", | ||||||
|  |       "description": "Layer 'Indoors' shows changing_table:location=dedicated_room with a fixed text, namely 'The changing table is in a dedicated room. ' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets&changing_table=yes)", | ||||||
|  |       "value": "dedicated_room" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "key": "toilets:handwashing", | ||||||
|  |       "description": "Layer 'Indoors' shows toilets:handwashing=yes with a fixed text, namely 'This toilets have a sink to wash your hands' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets)", | ||||||
|  |       "value": "yes" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "key": "toilets:handwashing", | ||||||
|  |       "description": "Layer 'Indoors' shows toilets:handwashing=no with a fixed text, namely 'This toilets <b>don't</b> have a sink to wash your hands' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets)", | ||||||
|  |       "value": "no" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "key": "toilets:paper_supplied", | ||||||
|  |       "description": "Layer 'Indoors' shows toilets:paper_supplied=yes with a fixed text, namely 'This toilet is equipped with toilet paper' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets&toilets:position!=urinal)", | ||||||
|  |       "value": "yes" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "key": "toilets:paper_supplied", | ||||||
|  |       "description": "Layer 'Indoors' shows toilets:paper_supplied=no with a fixed text, namely 'You have to bring your own toilet paper to this toilet' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if amenity=toilets&toilets:position!=urinal)", | ||||||
|  |       "value": "no" | ||||||
|  |     }, | ||||||
|     { |     { | ||||||
|       "key": "information", |       "key": "information", | ||||||
|       "description": "The MapComplete theme Personal theme has a layer Information boards showing features with this tag", |       "description": "The MapComplete theme Personal theme has a layer Information boards showing features with this tag", | ||||||
|  | @ -14229,6 +14434,11 @@ | ||||||
|       "description": "Layer 'Vending Machines' shows vending=potatoes with a fixed text, namely 'Potatoes are sold' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", |       "description": "Layer 'Vending Machines' shows vending=potatoes with a fixed text, namely 'Potatoes are sold' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", | ||||||
|       "value": "potatoes" |       "value": "potatoes" | ||||||
|     }, |     }, | ||||||
|  |     { | ||||||
|  |       "key": "vending", | ||||||
|  |       "description": "Layer 'Vending Machines' shows vending=meat with a fixed text, namely 'Meat is sold' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", | ||||||
|  |       "value": "meat" | ||||||
|  |     }, | ||||||
|     { |     { | ||||||
|       "key": "vending", |       "key": "vending", | ||||||
|       "description": "Layer 'Vending Machines' shows vending=flowers with a fixed text, namely 'Flowers are sold' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", |       "description": "Layer 'Vending Machines' shows vending=flowers with a fixed text, namely 'Flowers are sold' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", | ||||||
|  | @ -14251,8 +14461,28 @@ | ||||||
|     }, |     }, | ||||||
|     { |     { | ||||||
|       "key": "vending", |       "key": "vending", | ||||||
|       "description": "Layer 'Vending Machines' shows vending=meat with a fixed text, namely 'Meat products are being sold' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", |       "description": "Layer 'Vending Machines' shows vending=bicycle_light with a fixed text, namely 'Bicycle lights are sold' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", | ||||||
|       "value": "meat" |       "value": "bicycle_light" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "key": "vending", | ||||||
|  |       "description": "Layer 'Vending Machines' shows vending=gloves with a fixed text, namely 'Gloves are sold' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", | ||||||
|  |       "value": "gloves" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "key": "vending", | ||||||
|  |       "description": "Layer 'Vending Machines' shows vending=bicycle_repair_kit with a fixed text, namely 'Bicycle repair kits are sold' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", | ||||||
|  |       "value": "bicycle_repair_kit" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "key": "vending", | ||||||
|  |       "description": "Layer 'Vending Machines' shows vending=bicycle_pump with a fixed text, namely 'Bicycle pumps are sold' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", | ||||||
|  |       "value": "bicycle_pump" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "key": "vending", | ||||||
|  |       "description": "Layer 'Vending Machines' shows vending=bicycle_lock with a fixed text, namely 'Bicycle locks are sold' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", | ||||||
|  |       "value": "bicycle_lock" | ||||||
|     }, |     }, | ||||||
|     { |     { | ||||||
|       "key": "opening_hours", |       "key": "opening_hours", | ||||||
|  | @ -14587,6 +14817,11 @@ | ||||||
|       "description": "Layer 'Waste Basket' shows waste=plastic with a fixed text, namely 'A waste basket for plastic' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", |       "description": "Layer 'Waste Basket' shows waste=plastic with a fixed text, namely 'A waste basket for plastic' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", | ||||||
|       "value": "plastic" |       "value": "plastic" | ||||||
|     }, |     }, | ||||||
|  |     { | ||||||
|  |       "key": "waste", | ||||||
|  |       "description": "Layer 'Waste Basket' shows waste=paper with a fixed text, namely 'A waste basket for paper' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme')", | ||||||
|  |       "value": "paper" | ||||||
|  |     }, | ||||||
|     { |     { | ||||||
|       "key": "vending", |       "key": "vending", | ||||||
|       "description": "Layer 'Waste Basket' shows vending=dog_excrement_bag with a fixed text, namely 'This waste basket has a dispenser for (dog) excrement bags' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if waste=dog_excrement|waste=trash|)", |       "description": "Layer 'Waste Basket' shows vending=dog_excrement_bag with a fixed text, namely 'This waste basket has a dispenser for (dog) excrement bags' and allows to pick this as a default answer (in the mapcomplete.org theme 'Personal theme') (This is only shown if waste=dog_excrement|waste=trash|)", | ||||||
|  |  | ||||||
|  | @ -114,6 +114,11 @@ | ||||||
|       "description": "Layer 'Vending Machines' shows vending=potatoes with a fixed text, namely 'Potatoes are sold' and allows to pick this as a default answer (in the mapcomplete.org theme 'Vending Machines')", |       "description": "Layer 'Vending Machines' shows vending=potatoes with a fixed text, namely 'Potatoes are sold' and allows to pick this as a default answer (in the mapcomplete.org theme 'Vending Machines')", | ||||||
|       "value": "potatoes" |       "value": "potatoes" | ||||||
|     }, |     }, | ||||||
|  |     { | ||||||
|  |       "key": "vending", | ||||||
|  |       "description": "Layer 'Vending Machines' shows vending=meat with a fixed text, namely 'Meat is sold' and allows to pick this as a default answer (in the mapcomplete.org theme 'Vending Machines')", | ||||||
|  |       "value": "meat" | ||||||
|  |     }, | ||||||
|     { |     { | ||||||
|       "key": "vending", |       "key": "vending", | ||||||
|       "description": "Layer 'Vending Machines' shows vending=flowers with a fixed text, namely 'Flowers are sold' and allows to pick this as a default answer (in the mapcomplete.org theme 'Vending Machines')", |       "description": "Layer 'Vending Machines' shows vending=flowers with a fixed text, namely 'Flowers are sold' and allows to pick this as a default answer (in the mapcomplete.org theme 'Vending Machines')", | ||||||
|  | @ -136,8 +141,28 @@ | ||||||
|     }, |     }, | ||||||
|     { |     { | ||||||
|       "key": "vending", |       "key": "vending", | ||||||
|       "description": "Layer 'Vending Machines' shows vending=meat with a fixed text, namely 'Meat products are being sold' and allows to pick this as a default answer (in the mapcomplete.org theme 'Vending Machines')", |       "description": "Layer 'Vending Machines' shows vending=bicycle_light with a fixed text, namely 'Bicycle lights are sold' and allows to pick this as a default answer (in the mapcomplete.org theme 'Vending Machines')", | ||||||
|       "value": "meat" |       "value": "bicycle_light" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "key": "vending", | ||||||
|  |       "description": "Layer 'Vending Machines' shows vending=gloves with a fixed text, namely 'Gloves are sold' and allows to pick this as a default answer (in the mapcomplete.org theme 'Vending Machines')", | ||||||
|  |       "value": "gloves" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "key": "vending", | ||||||
|  |       "description": "Layer 'Vending Machines' shows vending=bicycle_repair_kit with a fixed text, namely 'Bicycle repair kits are sold' and allows to pick this as a default answer (in the mapcomplete.org theme 'Vending Machines')", | ||||||
|  |       "value": "bicycle_repair_kit" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "key": "vending", | ||||||
|  |       "description": "Layer 'Vending Machines' shows vending=bicycle_pump with a fixed text, namely 'Bicycle pumps are sold' and allows to pick this as a default answer (in the mapcomplete.org theme 'Vending Machines')", | ||||||
|  |       "value": "bicycle_pump" | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "key": "vending", | ||||||
|  |       "description": "Layer 'Vending Machines' shows vending=bicycle_lock with a fixed text, namely 'Bicycle locks are sold' and allows to pick this as a default answer (in the mapcomplete.org theme 'Vending Machines')", | ||||||
|  |       "value": "bicycle_lock" | ||||||
|     }, |     }, | ||||||
|     { |     { | ||||||
|       "key": "opening_hours", |       "key": "opening_hours", | ||||||
|  |  | ||||||
|  | @ -70,6 +70,11 @@ | ||||||
|       "description": "Layer 'Waste Basket' shows waste=plastic with a fixed text, namely 'A waste basket for plastic' and allows to pick this as a default answer (in the mapcomplete.org theme 'Waste')", |       "description": "Layer 'Waste Basket' shows waste=plastic with a fixed text, namely 'A waste basket for plastic' and allows to pick this as a default answer (in the mapcomplete.org theme 'Waste')", | ||||||
|       "value": "plastic" |       "value": "plastic" | ||||||
|     }, |     }, | ||||||
|  |     { | ||||||
|  |       "key": "waste", | ||||||
|  |       "description": "Layer 'Waste Basket' shows waste=paper with a fixed text, namely 'A waste basket for paper' and allows to pick this as a default answer (in the mapcomplete.org theme 'Waste')", | ||||||
|  |       "value": "paper" | ||||||
|  |     }, | ||||||
|     { |     { | ||||||
|       "key": "vending", |       "key": "vending", | ||||||
|       "description": "Layer 'Waste Basket' shows vending=dog_excrement_bag with a fixed text, namely 'This waste basket has a dispenser for (dog) excrement bags' and allows to pick this as a default answer (in the mapcomplete.org theme 'Waste') (This is only shown if waste=dog_excrement|waste=trash|)", |       "description": "Layer 'Waste Basket' shows vending=dog_excrement_bag with a fixed text, namely 'This waste basket has a dispenser for (dog) excrement bags' and allows to pick this as a default answer (in the mapcomplete.org theme 'Waste') (This is only shown if waste=dog_excrement|waste=trash|)", | ||||||
|  |  | ||||||
|  | @ -70,6 +70,11 @@ | ||||||
|       "description": "Layer 'Waste Basket' shows waste=plastic with a fixed text, namely 'A waste basket for plastic' and allows to pick this as a default answer (in the mapcomplete.org theme 'Waste Basket')", |       "description": "Layer 'Waste Basket' shows waste=plastic with a fixed text, namely 'A waste basket for plastic' and allows to pick this as a default answer (in the mapcomplete.org theme 'Waste Basket')", | ||||||
|       "value": "plastic" |       "value": "plastic" | ||||||
|     }, |     }, | ||||||
|  |     { | ||||||
|  |       "key": "waste", | ||||||
|  |       "description": "Layer 'Waste Basket' shows waste=paper with a fixed text, namely 'A waste basket for paper' and allows to pick this as a default answer (in the mapcomplete.org theme 'Waste Basket')", | ||||||
|  |       "value": "paper" | ||||||
|  |     }, | ||||||
|     { |     { | ||||||
|       "key": "vending", |       "key": "vending", | ||||||
|       "description": "Layer 'Waste Basket' shows vending=dog_excrement_bag with a fixed text, namely 'This waste basket has a dispenser for (dog) excrement bags' and allows to pick this as a default answer (in the mapcomplete.org theme 'Waste Basket') (This is only shown if waste=dog_excrement|waste=trash|)", |       "description": "Layer 'Waste Basket' shows vending=dog_excrement_bag with a fixed text, namely 'This waste basket has a dispenser for (dog) excrement bags' and allows to pick this as a default answer (in the mapcomplete.org theme 'Waste Basket') (This is only shown if waste=dog_excrement|waste=trash|)", | ||||||
|  |  | ||||||
|  | @ -293,10 +293,13 @@ | ||||||
|     "internet-ssid", |     "internet-ssid", | ||||||
|     "reviews" |     "reviews" | ||||||
|   ], |   ], | ||||||
|  |   "minzoom": 12, | ||||||
|   "filter": [ |   "filter": [ | ||||||
|     "open_now", |     "open_now", | ||||||
|     "accepts_cash", |     "accepts_cash", | ||||||
|     "accepts_cards" |     "accepts_cards", | ||||||
|  |     "has_internet", | ||||||
|  |     "has_electricity" | ||||||
|   ], |   ], | ||||||
|   "deletion": { |   "deletion": { | ||||||
|     "softDeletionTags": { |     "softDeletionTags": { | ||||||
|  |  | ||||||
|  | @ -147,7 +147,8 @@ | ||||||
|         "fr": "<h3>Contient {_contained_climbing_routes_count} voies</h3> <ul>{_contained_climbing_routes}</ul>", |         "fr": "<h3>Contient {_contained_climbing_routes_count} voies</h3> <ul>{_contained_climbing_routes}</ul>", | ||||||
|         "it": "<h3>Contiene {_contained_climbing_routes_count} vie</h3> <ul>{_contained_climbing_routes}</ul>", |         "it": "<h3>Contiene {_contained_climbing_routes_count} vie</h3> <ul>{_contained_climbing_routes}</ul>", | ||||||
|         "de": "<h3> Enthält {_contained_climbing_routes_count} Routen</h3> <ul>{_contained_climbing_routes}</ul>", |         "de": "<h3> Enthält {_contained_climbing_routes_count} Routen</h3> <ul>{_contained_climbing_routes}</ul>", | ||||||
|         "nl": "<h3>Bevat {_contained_climbing_routes_count} routes</h3> <ul>{_contained_climbing_routes}</ul>" |         "nl": "<h3>Bevat {_contained_climbing_routes_count} routes</h3> <ul>{_contained_climbing_routes}</ul>", | ||||||
|  |         "ca": "<h3>Conté {_contained_climbing_routes_count} rutes</h3> <ul>{_contained_climbing_routes}</ul>" | ||||||
|       }, |       }, | ||||||
|       "condition": "_contained_climbing_routes~*", |       "condition": "_contained_climbing_routes~*", | ||||||
|       "id": "Contained_climbing_routes" |       "id": "Contained_climbing_routes" | ||||||
|  | @ -206,7 +207,8 @@ | ||||||
|             "fr": "Rocher d’escalade, rocher avec une ou peu de voie permettant d’escalader sans corde", |             "fr": "Rocher d’escalade, rocher avec une ou peu de voie permettant d’escalader sans corde", | ||||||
|             "de": "Ein Kletterfelsen - ein einzelner Felsen oder eine Klippe mit einer oder wenigen Kletterrouten, die ohne Seil sicher bestiegen werden können", |             "de": "Ein Kletterfelsen - ein einzelner Felsen oder eine Klippe mit einer oder wenigen Kletterrouten, die ohne Seil sicher bestiegen werden können", | ||||||
|             "it": "Un masso per arrampicata (una singola roccia o falesia con una o poche vie di arrampicata che possono essere scalate in sicurezza senza una corda)", |             "it": "Un masso per arrampicata (una singola roccia o falesia con una o poche vie di arrampicata che possono essere scalate in sicurezza senza una corda)", | ||||||
|             "nl": "Een klimboulder - een enkele rots of klif met één of enkele klimroutes die veilig zonder touw kunnen worden beklommen" |             "nl": "Een klimboulder - een enkele rots of klif met één of enkele klimroutes die veilig zonder touw kunnen worden beklommen", | ||||||
|  |             "ca": "Una roca d'escalada: una única roca o penya-segat amb una o unes quantes vies d'escalada que es poden escalar amb seguretat sense corda" | ||||||
|           } |           } | ||||||
|         }, |         }, | ||||||
|         { |         { | ||||||
|  | @ -256,7 +258,8 @@ | ||||||
|             "de": "Kalkstein", |             "de": "Kalkstein", | ||||||
|             "it": "Calcare", |             "it": "Calcare", | ||||||
|             "pa_PK": "چونہ پتھر", |             "pa_PK": "چونہ پتھر", | ||||||
|             "eu": "Kareharria" |             "eu": "Kareharria", | ||||||
|  |             "ca": "Calcària" | ||||||
|           } |           } | ||||||
|         } |         } | ||||||
|       ], |       ], | ||||||
|  |  | ||||||
|  | @ -272,6 +272,33 @@ | ||||||
|           "osmTags": "dog=no" |           "osmTags": "dog=no" | ||||||
|         } |         } | ||||||
|       ] |       ] | ||||||
|  |     }, | ||||||
|  |     { | ||||||
|  |       "id": "has_internet", | ||||||
|  |       "options": [ | ||||||
|  |         { | ||||||
|  |           "question": { | ||||||
|  |             "en": "Offers internet" | ||||||
|  |           }, | ||||||
|  |           "osmTags": { | ||||||
|  |             "or": [ | ||||||
|  |               "internet_access=wlan", | ||||||
|  |               "internet_access=yes", | ||||||
|  |               "internet_access=wired" | ||||||
|  |             ] | ||||||
|  |           } | ||||||
|  |         } | ||||||
|  |       ] | ||||||
|  |     }, | ||||||
|  |     {"id": "has_electricity", | ||||||
|  |       "options": [ | ||||||
|  |         { | ||||||
|  |           "question": { | ||||||
|  |             "en": "Offers electricity" | ||||||
|  |           }, | ||||||
|  |           "osmTags": "service:electricity=yes" | ||||||
|  |         } | ||||||
|  |       ] | ||||||
|     } |     } | ||||||
|   ] |   ] | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -250,7 +250,8 @@ | ||||||
|         "it": "Piazzata in data {start_date}", |         "it": "Piazzata in data {start_date}", | ||||||
|         "fr": "Placé le {start_date}", |         "fr": "Placé le {start_date}", | ||||||
|         "ru": "Установлен {start_date}", |         "ru": "Установлен {start_date}", | ||||||
|         "de": "Aufgestellt am {start_date}" |         "de": "Aufgestellt am {start_date}", | ||||||
|  |         "ca": "Col·locat el {start_date}" | ||||||
|       }, |       }, | ||||||
|       "freeform": { |       "freeform": { | ||||||
|         "key": "start_date", |         "key": "start_date", | ||||||
|  |  | ||||||
|  | @ -342,7 +342,9 @@ | ||||||
|             "en": "These are toilets" |             "en": "These are toilets" | ||||||
|           }, |           }, | ||||||
|           "icon": "./assets/layers/indoors/room_toilets.svg", |           "icon": "./assets/layers/indoors/room_toilets.svg", | ||||||
|           "addExtraTags": ["amenity=toilets"] |           "addExtraTags": [ | ||||||
|  |             "amenity=toilets" | ||||||
|  |           ] | ||||||
|         }, |         }, | ||||||
|         { |         { | ||||||
|           "if": "room=waiting", |           "if": "room=waiting", | ||||||
|  | @ -384,7 +386,9 @@ | ||||||
|       "builtin": "toilet.relevant-questions", |       "builtin": "toilet.relevant-questions", | ||||||
|       "override": { |       "override": { | ||||||
|         "condition": { |         "condition": { | ||||||
|           "+and": ["amenity=toilets"] |           "+and": [ | ||||||
|  |             "amenity=toilets" | ||||||
|  |           ] | ||||||
|         } |         } | ||||||
|       } |       } | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  | @ -47,6 +47,7 @@ | ||||||
|   "minzoom": 13, |   "minzoom": 13, | ||||||
|   "tagRenderings": [ |   "tagRenderings": [ | ||||||
|     "images", |     "images", | ||||||
|  |     "reviews", | ||||||
|     { |     { | ||||||
|       "id": "name", |       "id": "name", | ||||||
|       "freeform": { |       "freeform": { | ||||||
|  |  | ||||||
|  | @ -51,7 +51,8 @@ | ||||||
|         "en": "{sport} is played here", |         "en": "{sport} is played here", | ||||||
|         "it": "Qui si gioca a {sport}", |         "it": "Qui si gioca a {sport}", | ||||||
|         "de": "Hier wird {sport} gespielt", |         "de": "Hier wird {sport} gespielt", | ||||||
|         "es": "Aquí se juega al {sport}" |         "es": "Aquí se juega al {sport}", | ||||||
|  |         "ca": "{sport} es juga aquí" | ||||||
|       }, |       }, | ||||||
|       "freeform": { |       "freeform": { | ||||||
|         "key": "sport" |         "key": "sport" | ||||||
|  | @ -62,7 +63,8 @@ | ||||||
|         "en": "Which sport can be played here?", |         "en": "Which sport can be played here?", | ||||||
|         "it": "Quale sport si gioca qui?", |         "it": "Quale sport si gioca qui?", | ||||||
|         "de": "Welche Sportarten können hier gespielt werden?", |         "de": "Welche Sportarten können hier gespielt werden?", | ||||||
|         "es": "¿Qué deporte se practica aquí?" |         "es": "¿Qué deporte se puede practicar aquí?", | ||||||
|  |         "ca": "Quin esport es pot practicar aquí?" | ||||||
|       }, |       }, | ||||||
|       "multiAnswer": true, |       "multiAnswer": true, | ||||||
|       "mappings": [ |       "mappings": [ | ||||||
|  | @ -172,7 +174,8 @@ | ||||||
|           "then": { |           "then": { | ||||||
|             "en": "This is a skatepark", |             "en": "This is a skatepark", | ||||||
|             "nl": "Dit is een skatepark", |             "nl": "Dit is een skatepark", | ||||||
|             "de": "Dies ist ein Skatepark" |             "de": "Dies ist ein Skatepark", | ||||||
|  |             "ca": "Açò és un skatepark" | ||||||
|           } |           } | ||||||
|         } |         } | ||||||
|       ], |       ], | ||||||
|  | @ -235,7 +238,8 @@ | ||||||
|         "ru": "Поверхность - <b>{surface}</b>", |         "ru": "Поверхность - <b>{surface}</b>", | ||||||
|         "it": "La superficie è <b>{surface}</b>", |         "it": "La superficie è <b>{surface}</b>", | ||||||
|         "de": "Der Belag ist <b>{surface}</b>", |         "de": "Der Belag ist <b>{surface}</b>", | ||||||
|         "es": "La superficie es <b>{surface}</b>" |         "es": "La superficie es <b>{surface}</b>", | ||||||
|  |         "ca": "La superfícies és <b>{surface}</b>" | ||||||
|       }, |       }, | ||||||
|       "freeform": { |       "freeform": { | ||||||
|         "key": "surface" |         "key": "surface" | ||||||
|  |  | ||||||
|  | @ -2,11 +2,13 @@ | ||||||
|   "id": "sports_centre", |   "id": "sports_centre", | ||||||
|   "name": { |   "name": { | ||||||
|     "en": "Sports centres", |     "en": "Sports centres", | ||||||
|     "de": "Sportzentren" |     "de": "Sportzentren", | ||||||
|  |     "ca": "Centres esportius" | ||||||
|   }, |   }, | ||||||
|   "description": { |   "description": { | ||||||
|     "en": "Indoor and outdoor sports centres can be found on this layer", |     "en": "Indoor and outdoor sports centres can be found on this layer", | ||||||
|     "de": "Hallen- und Freiluftsportzentren sind auf dieser Ebene zu finden" |     "de": "Hallen- und Freiluftsportzentren sind auf dieser Ebene zu finden", | ||||||
|  |     "ca": "En aquesta capa es poden trobar centres esportius interiors i exteriors" | ||||||
|   }, |   }, | ||||||
|   "minzoom": 12, |   "minzoom": 12, | ||||||
|   "source": { |   "source": { | ||||||
|  | @ -15,7 +17,8 @@ | ||||||
|   "title": { |   "title": { | ||||||
|     "render": { |     "render": { | ||||||
|       "en": "Sports centre", |       "en": "Sports centre", | ||||||
|       "de": "Sportzentrum" |       "de": "Sportzentrum", | ||||||
|  |       "ca": "Centre esportiu" | ||||||
|     }, |     }, | ||||||
|     "mappings": [ |     "mappings": [ | ||||||
|       { |       { | ||||||
|  | @ -36,7 +39,8 @@ | ||||||
|     { |     { | ||||||
|       "title": { |       "title": { | ||||||
|         "en": "a sports centre", |         "en": "a sports centre", | ||||||
|         "de": "ein Sportzentrum" |         "de": "ein Sportzentrum", | ||||||
|  |         "ca": "un centre esportiu" | ||||||
|       }, |       }, | ||||||
|       "tags": [ |       "tags": [ | ||||||
|         "leisure=sports_centre" |         "leisure=sports_centre" | ||||||
|  |  | ||||||
|  | @ -9,7 +9,8 @@ | ||||||
|   "description": { |   "description": { | ||||||
|     "en": "Layer showing stairs and escalators", |     "en": "Layer showing stairs and escalators", | ||||||
|     "de": "Ebene mit Treppen und Rolltreppen", |     "de": "Ebene mit Treppen und Rolltreppen", | ||||||
|     "nl": "Laag met trappen en roltrappen" |     "nl": "Laag met trappen en roltrappen", | ||||||
|  |     "ca": "Capa que mostra escales i escales mecàniques" | ||||||
|   }, |   }, | ||||||
|   "title": { |   "title": { | ||||||
|     "render": { |     "render": { | ||||||
|  |  | ||||||
|  | @ -349,7 +349,8 @@ | ||||||
|         "fr": "À quel niveau se trouve cette caméra ?", |         "fr": "À quel niveau se trouve cette caméra ?", | ||||||
|         "it": "A che piano si trova questa videocamera?", |         "it": "A che piano si trova questa videocamera?", | ||||||
|         "de": "Auf welcher Ebene befindet sich diese Kamera?", |         "de": "Auf welcher Ebene befindet sich diese Kamera?", | ||||||
|         "es": "¿A qué nivel está colocada esta cámara?" |         "es": "¿A qué nivel está colocada esta cámara?", | ||||||
|  |         "ca": "A quina planta es troba aquesta càmera?" | ||||||
|       }, |       }, | ||||||
|       "render": { |       "render": { | ||||||
|         "en": "Located on level {level}", |         "en": "Located on level {level}", | ||||||
|  |  | ||||||
|  | @ -5,7 +5,8 @@ | ||||||
|     "nl": "Universiteiten en hogescholen", |     "nl": "Universiteiten en hogescholen", | ||||||
|     "de": "Hochschulen und Universitäten", |     "de": "Hochschulen und Universitäten", | ||||||
|     "fr": "Collèges et universités", |     "fr": "Collèges et universités", | ||||||
|     "da": "Gymnasier og universiteter" |     "da": "Gymnasier og universiteter", | ||||||
|  |     "ca": "Instituts superiors i universitats" | ||||||
|   }, |   }, | ||||||
|   "description": "Layer with all tertiary education institutes (ISCED:2011 levels 6,7 and 8)", |   "description": "Layer with all tertiary education institutes (ISCED:2011 levels 6,7 and 8)", | ||||||
|   "source": { |   "source": { | ||||||
|  | @ -42,7 +43,8 @@ | ||||||
|           "nl": "Hogeschool", |           "nl": "Hogeschool", | ||||||
|           "de": "(Fach)hochschule", |           "de": "(Fach)hochschule", | ||||||
|           "fr": "Établissement d'enseignement supérieur non universitaire", |           "fr": "Établissement d'enseignement supérieur non universitaire", | ||||||
|           "pa_PK": "کالج" |           "pa_PK": "کالج", | ||||||
|  |           "ca": "Institut superior" | ||||||
|         } |         } | ||||||
|       }, |       }, | ||||||
|       { |       { | ||||||
|  | @ -64,7 +66,8 @@ | ||||||
|           "nl": "Onderwijsinstelling die tertiair onderwijs geeft", |           "nl": "Onderwijsinstelling die tertiair onderwijs geeft", | ||||||
|           "de": "Schule mit tertiärem Bildungsangebot", |           "de": "Schule mit tertiärem Bildungsangebot", | ||||||
|           "fr": "École dispensant un enseignement supérieur", |           "fr": "École dispensant un enseignement supérieur", | ||||||
|           "da": "Skole, der udbyder videregående uddannelser" |           "da": "Skole, der udbyder videregående uddannelser", | ||||||
|  |           "ca": "Escola que imparteix educació terciària" | ||||||
|         } |         } | ||||||
|       } |       } | ||||||
|     ] |     ] | ||||||
|  | @ -88,7 +91,8 @@ | ||||||
|             "nl": "Dit is een onderwijsinstelling waar post-secundair, niet-tertiair onderwijs wordt gegeven. Om dit onderwijs te volgen, moet je je secundair onderwijs afgewerkt hebben maar de opleiding behaalt niet het niveau van van een bachelor.", |             "nl": "Dit is een onderwijsinstelling waar post-secundair, niet-tertiair onderwijs wordt gegeven. Om dit onderwijs te volgen, moet je je secundair onderwijs afgewerkt hebben maar de opleiding behaalt niet het niveau van van een bachelor.", | ||||||
|             "de": "Es handelt sich um eine postsekundäre, nicht-tertiäre Bildungseinrichtung. Man muss die Sekundarstufe abgeschlossen haben, um sich hier einzuschreiben, aber es werden keine Bachelor-Abschlüsse (oder höhere Abschlüsse) verliehen", |             "de": "Es handelt sich um eine postsekundäre, nicht-tertiäre Bildungseinrichtung. Man muss die Sekundarstufe abgeschlossen haben, um sich hier einzuschreiben, aber es werden keine Bachelor-Abschlüsse (oder höhere Abschlüsse) verliehen", | ||||||
|             "fr": "C'est un établissement d'enseignement post-secondaire, non tertiaire. Il faut avoir terminé l'enseignement secondaire pour s'inscrire ici, mais aucun baccalauréat (ou diplôme supérieur) n'est délivré ici", |             "fr": "C'est un établissement d'enseignement post-secondaire, non tertiaire. Il faut avoir terminé l'enseignement secondaire pour s'inscrire ici, mais aucun baccalauréat (ou diplôme supérieur) n'est délivré ici", | ||||||
|             "da": "Dette er en institution for post-gymnasial, ikke-tertiær uddannelse. Man skal have gennemført en ungdomsuddannelse for at tilmelde sig her, men her uddeles ingen bachelor (eller højere) grader" |             "da": "Dette er en institution for post-gymnasial, ikke-tertiær uddannelse. Man skal have gennemført en ungdomsuddannelse for at tilmelde sig her, men her uddeles ingen bachelor (eller højere) grader", | ||||||
|  |             "ca": "Aquesta és una institució d'educació postsecundària i no terciària. S'ha d'haver completat l'educació secundària per matricular-se aquí, però aquí no s'obtenen títols de batxillerat (o superiors)" | ||||||
|           } |           } | ||||||
|         }, |         }, | ||||||
|         { |         { | ||||||
|  | @ -202,7 +206,8 @@ | ||||||
|         "en": "An institute where tertiary education is given (at the level equivalent of a bachelors degree or higher). A single point per campus is enough - buildings and faculties should not be mapped with different university points.", |         "en": "An institute where tertiary education is given (at the level equivalent of a bachelors degree or higher). A single point per campus is enough - buildings and faculties should not be mapped with different university points.", | ||||||
|         "nl": "Een onderwijsinstelling waar tertiair onderwijs wordt gegeven - dit is onderwijs waarvan het niveau overeenkomt met een bachelor of hoger is. Eén enkel punt per campus is genoeg - gebouwen en faculteiten worden hier niet op aangeduid.", |         "nl": "Een onderwijsinstelling waar tertiair onderwijs wordt gegeven - dit is onderwijs waarvan het niveau overeenkomt met een bachelor of hoger is. Eén enkel punt per campus is genoeg - gebouwen en faculteiten worden hier niet op aangeduid.", | ||||||
|         "de": "Eine Einrichtung, an der tertiäre Bildung vermittelt wird (auf dem Niveau eines Bachelor-Abschlusses oder höher). Ein einziger Punkt pro Campus ist ausreichend - Gebäude und Fakultäten sollten nicht mit Universitätspunkten gekennzeichnet werden.", |         "de": "Eine Einrichtung, an der tertiäre Bildung vermittelt wird (auf dem Niveau eines Bachelor-Abschlusses oder höher). Ein einziger Punkt pro Campus ist ausreichend - Gebäude und Fakultäten sollten nicht mit Universitätspunkten gekennzeichnet werden.", | ||||||
|         "fr": "Un institut où l'on dispense un enseignement supérieur (au niveau équivalent à un bachelor ou plus). Un simple point par campus est suffisant - les bâtiments et les facultés ne doivent pas être cartographiés avec différents points d'université." |         "fr": "Un institut où l'on dispense un enseignement supérieur (au niveau équivalent à un bachelor ou plus). Un simple point par campus est suffisant - les bâtiments et les facultés ne doivent pas être cartographiés avec différents points d'université.", | ||||||
|  |         "ca": "Un institut on s'imparteix ensenyament terciari (al nivell equivalent de batxillerat o superior). N'hi ha prou amb un únic punt per campus: els edificis i les facultats no s'han de cartografiar amb diferents punts universitaris." | ||||||
|       }, |       }, | ||||||
|       "tags": [ |       "tags": [ | ||||||
|         "amenity=university", |         "amenity=university", | ||||||
|  |  | ||||||
|  | @ -530,7 +530,9 @@ | ||||||
|         "ca": "El cambiador està a {changing_table:location}" |         "ca": "El cambiador està a {changing_table:location}" | ||||||
|       }, |       }, | ||||||
|       "condition": { |       "condition": { | ||||||
|         "and":["changing_table=yes"] |         "and": [ | ||||||
|  |           "changing_table=yes" | ||||||
|  |         ] | ||||||
|       }, |       }, | ||||||
|       "freeform": { |       "freeform": { | ||||||
|         "key": "changing_table:location", |         "key": "changing_table:location", | ||||||
|  |  | ||||||
|  | @ -14,7 +14,8 @@ | ||||||
|     "render": { |     "render": { | ||||||
|       "en": "Toilet at amenity", |       "en": "Toilet at amenity", | ||||||
|       "de": "Toilette in Einrichtung", |       "de": "Toilette in Einrichtung", | ||||||
|       "nl": "Toilet in een voorziening" |       "nl": "Toilet in een voorziening", | ||||||
|  |       "ca": "Lavabo a la instal·lació" | ||||||
|     }, |     }, | ||||||
|     "mappings": [ |     "mappings": [ | ||||||
|       { |       { | ||||||
|  | @ -22,7 +23,8 @@ | ||||||
|         "then": { |         "then": { | ||||||
|           "en": "Toilet at {name}", |           "en": "Toilet at {name}", | ||||||
|           "de": "Toilette in {name}", |           "de": "Toilette in {name}", | ||||||
|           "nl": "Toilet bij {name}" |           "nl": "Toilet bij {name}", | ||||||
|  |           "ca": "Bany a {name}" | ||||||
|         } |         } | ||||||
|       } |       } | ||||||
|     ] |     ] | ||||||
|  | @ -197,7 +199,8 @@ | ||||||
|         "condition": "toilets:access!=no", |         "condition": "toilets:access!=no", | ||||||
|         "question": { |         "question": { | ||||||
|           "en": "When is the amenity where these toilets are located open?", |           "en": "When is the amenity where these toilets are located open?", | ||||||
|           "de": "Wann ist der Ort, an dem sich diese Toiletten befinden, geöffnet?" |           "de": "Wann ist der Ort, an dem sich diese Toiletten befinden, geöffnet?", | ||||||
|  |           "ca": "Quan està oberta la instal·lació on es troben aquests lavabos?" | ||||||
|         } |         } | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|  | @ -273,7 +276,8 @@ | ||||||
|         "nl": "De deur naar de rolstoeltoegankelijke toilet is {canonical(toilets:door:width)} wide", |         "nl": "De deur naar de rolstoeltoegankelijke toilet is {canonical(toilets:door:width)} wide", | ||||||
|         "fr": "La porte des toilettes accessibles aux fauteuils roulants a une large de {canonical(toilets:door:width)}", |         "fr": "La porte des toilettes accessibles aux fauteuils roulants a une large de {canonical(toilets:door:width)}", | ||||||
|         "de": "Die Tür zur rollstuhlgerechten Toilette ist {canonical(toilets:door:width)} breit", |         "de": "Die Tür zur rollstuhlgerechten Toilette ist {canonical(toilets:door:width)} breit", | ||||||
|         "da": "Døren til det kørestolsvenlige toilet er {canonical(toilets:door:width)} bred" |         "da": "Døren til det kørestolsvenlige toilet er {canonical(toilets:door:width)} bred", | ||||||
|  |         "ca": "La porta del vàter accessible amb cadira de rodes és {canonical(toilets:door:width)} d'ample" | ||||||
|       }, |       }, | ||||||
|       "freeform": { |       "freeform": { | ||||||
|         "key": "toilets:door:width", |         "key": "toilets:door:width", | ||||||
|  | @ -329,7 +333,8 @@ | ||||||
|             "nl": "Gratis toegankelijk", |             "nl": "Gratis toegankelijk", | ||||||
|             "de": "Nutzung kostenlos", |             "de": "Nutzung kostenlos", | ||||||
|             "fr": "Utilisation gratuite", |             "fr": "Utilisation gratuite", | ||||||
|             "da": "Gratis at bruge" |             "da": "Gratis at bruge", | ||||||
|  |             "ca": "Ús gratuït" | ||||||
|           }, |           }, | ||||||
|           "osmTags": { |           "osmTags": { | ||||||
|             "or": [ |             "or": [ | ||||||
|  |  | ||||||
|  | @ -10,7 +10,8 @@ | ||||||
|   "description": { |   "description": { | ||||||
|     "en": "Layer showing different types of transit stops.", |     "en": "Layer showing different types of transit stops.", | ||||||
|     "de": "Ebene mit verschiedenen Arten von Haltestellen.", |     "de": "Ebene mit verschiedenen Arten von Haltestellen.", | ||||||
|     "da": "Lag, der viser forskellige typer transitstop." |     "da": "Lag, der viser forskellige typer transitstop.", | ||||||
|  |     "ca": "Capa que mostra diferents tipus de parades de transport públic" | ||||||
|   }, |   }, | ||||||
|   "source": { |   "source": { | ||||||
|     "osmTags": { |     "osmTags": { | ||||||
|  | @ -25,7 +26,8 @@ | ||||||
|       "en": "Transit Stop", |       "en": "Transit Stop", | ||||||
|       "de": "Haltestelle", |       "de": "Haltestelle", | ||||||
|       "da": "Transit Stop", |       "da": "Transit Stop", | ||||||
|       "nl": "Bushalte" |       "nl": "Bushalte", | ||||||
|  |       "ca": "Parada de transport públic" | ||||||
|     }, |     }, | ||||||
|     "mappings": [ |     "mappings": [ | ||||||
|       { |       { | ||||||
|  | @ -53,13 +55,6 @@ | ||||||
|       "label": "<div style=\"background: white; display: block\">{name}</div>" |       "label": "<div style=\"background: white; display: block\">{name}</div>" | ||||||
|     } |     } | ||||||
|   ], |   ], | ||||||
|   "calculatedTags": [ |  | ||||||
|     "_routes=feat.memberships()", |  | ||||||
|     "_contained_routes_properties=feat.memberships().map(p => {return {id: p.relation.id, name: p.relation.properties.name} }).filter((v,i,a)=>a.findIndex(t=>(JSON.stringify(t) === JSON.stringify(v)))===i)", |  | ||||||
|     "_contained_route_ids=JSON.parse(feat.properties._contained_routes_properties ?? '[]').map(p => p.id)", |  | ||||||
|     "_contained_routes=JSON.parse(feat.properties._contained_routes_properties ?? '[]').map(p => `<li><a href='#relation/${p.id}'>${p.name ?? 'bus route'}</a></li>`).join('')", |  | ||||||
|     "_contained_routes_count=JSON.parse(feat.properties._contained_routes_properties ?? '[]').length" |  | ||||||
|   ], |  | ||||||
|   "tagRenderings": [ |   "tagRenderings": [ | ||||||
|     { |     { | ||||||
|       "id": "stop_name", |       "id": "stop_name", | ||||||
|  |  | ||||||
|  | @ -915,7 +915,7 @@ | ||||||
|             "nl": "Verkoop van bloemen", |             "nl": "Verkoop van bloemen", | ||||||
|             "de": "Verkauf von Blumen", |             "de": "Verkauf von Blumen", | ||||||
|             "fr": "Vente de fleurs", |             "fr": "Vente de fleurs", | ||||||
|             "ca": "Venda de flors" |             "ca": "Venda d'aparcament" | ||||||
|           }, |           }, | ||||||
|           "osmTags": "vending~i~.*flowers.*" |           "osmTags": "vending~i~.*flowers.*" | ||||||
|         }, |         }, | ||||||
|  | @ -923,21 +923,21 @@ | ||||||
|           "osmTags": "vending~i~.*parking_tickets.*", |           "osmTags": "vending~i~.*parking_tickets.*", | ||||||
|           "question": { |           "question": { | ||||||
|             "en": "Sale of parking tickets", |             "en": "Sale of parking tickets", | ||||||
|             "ca": "Venda d'aparcament" |             "ca": "Venda de monedes premsades" | ||||||
|           } |           } | ||||||
|         }, |         }, | ||||||
|         { |         { | ||||||
|           "osmTags": "vending=elongated_coin", |           "osmTags": "vending=elongated_coin", | ||||||
|           "question": { |           "question": { | ||||||
|             "en": "Sale of pressed pennies", |             "en": "Sale of pressed pennies", | ||||||
|             "ca": "Venda de monedes premsades" |             "ca": "Venda de bitllets de transport públic" | ||||||
|           } |           } | ||||||
|         }, |         }, | ||||||
|         { |         { | ||||||
|           "osmTags": "vending~i~.*public_transport_tickets.*", |           "osmTags": "vending~i~.*public_transport_tickets.*", | ||||||
|           "question": { |           "question": { | ||||||
|             "en": "Sale of public transport tickets", |             "en": "Sale of public transport tickets", | ||||||
|             "ca": "Venda de bitllets de transport públic" |             "ca": "Venda de productes carnis" | ||||||
|           } |           } | ||||||
|         }, |         }, | ||||||
|         { |         { | ||||||
|  |  | ||||||
|  | @ -461,8 +461,12 @@ | ||||||
|         ] |         ] | ||||||
|       } |       } | ||||||
|     }, |     }, | ||||||
|     "drinking_water", |     { | ||||||
|     "toilet" |       "builtin": ["toilet","drinking_water"], | ||||||
|  |       "override": { | ||||||
|  |         "minzoom": 15 | ||||||
|  |       } | ||||||
|  |     } | ||||||
|   ], |   ], | ||||||
|   "credits": "Christian Neumann <christian@utopicode.de>" |   "credits": "Christian Neumann <christian@utopicode.de>" | ||||||
| } | } | ||||||
|  | @ -197,6 +197,7 @@ | ||||||
|         "example": "Exemple", |         "example": "Exemple", | ||||||
|         "examples": "Exemples", |         "examples": "Exemples", | ||||||
|         "fewChangesBefore": "Contesta unes quantes preguntes sobre elements existents abans d'afegir-ne un de nou.", |         "fewChangesBefore": "Contesta unes quantes preguntes sobre elements existents abans d'afegir-ne un de nou.", | ||||||
|  |         "geopermissionDenied": "Es va denegar l'ús de la geolocalització", | ||||||
|         "getStartedLogin": "Entra a OpenStreetMap per començar", |         "getStartedLogin": "Entra a OpenStreetMap per començar", | ||||||
|         "getStartedNewAccount": " o <a href=\"https://www.openstreetmap.org/user/new\" target=\"_blank\">crea un nou compte</a>", |         "getStartedNewAccount": " o <a href=\"https://www.openstreetmap.org/user/new\" target=\"_blank\">crea un nou compte</a>", | ||||||
|         "goToInbox": "Obrir missatges", |         "goToInbox": "Obrir missatges", | ||||||
|  | @ -556,11 +557,16 @@ | ||||||
|     "reviews": { |     "reviews": { | ||||||
|         "affiliated_reviewer_warning": "(Ressenya afiliada)", |         "affiliated_reviewer_warning": "(Ressenya afiliada)", | ||||||
|         "attribution": "Les ressenyes funcionen gràcies a <a href=\"https://mangrove.reviews/\" target=\"_blank\">Mangrove Reviews</a> i estan disponibles sota <a href=\"https://mangrove.reviews/terms#8-licensing-of-content\" target=\"_blank\">CC-BY 4.0</a>.", |         "attribution": "Les ressenyes funcionen gràcies a <a href=\"https://mangrove.reviews/\" target=\"_blank\">Mangrove Reviews</a> i estan disponibles sota <a href=\"https://mangrove.reviews/terms#8-licensing-of-content\" target=\"_blank\">CC-BY 4.0</a>.", | ||||||
|         "i_am_affiliated": "<span>Tinc alguna filiació amb aquest objecte</span><br/><span class='subtle'>Marca-ho si n'ets cap, creador, treballador, …</span>", |         "i_am_affiliated": "Tinc alguna filiació amb aquest objecte", | ||||||
|  |         "i_am_affiliated_explanation": "Marqueu si sou propietari, creador, empleat,…", | ||||||
|         "name_required": "És requerit un nom per mostrar i crear revisions", |         "name_required": "És requerit un nom per mostrar i crear revisions", | ||||||
|         "no_reviews_yet": "No hi ha revisions encara. Sigues el primer a escriure'n una i ajuda al negoci i a les dades lliures!", |         "no_reviews_yet": "No hi ha revisions encara. Sigues el primer a escriure'n una i ajuda al negoci i a les dades lliures!", | ||||||
|  |         "question": "Com valoraries {title()}?", | ||||||
|  |         "question_opinion": "Com va ser la vostra experiència?", | ||||||
|  |         "reviewing_as": "Ressenyant com a {nickname}", | ||||||
|  |         "reviewing_as_anonymous": "Ressenyant com a anònim", | ||||||
|         "save": "Desar", |         "save": "Desar", | ||||||
|         "saved": "<span class=\"thanks\">Revisió compartida. Gràcies per compartir!</span>", |         "saved": "Ressenya compartida. Gràcies per compartir!", | ||||||
|         "saving_review": "Desant…", |         "saving_review": "Desant…", | ||||||
|         "title": "{count} revisions", |         "title": "{count} revisions", | ||||||
|         "title_singular": "Una revisió", |         "title_singular": "Una revisió", | ||||||
|  |  | ||||||
|  | @ -1,4 +1,7 @@ | ||||||
| { | { | ||||||
|  |     "advanced": { | ||||||
|  |         "title": "Pokročilé funkce" | ||||||
|  |     }, | ||||||
|     "centerMessage": { |     "centerMessage": { | ||||||
|         "loadingData": "Načítání dat…", |         "loadingData": "Načítání dat…", | ||||||
|         "ready": "Hotovo!", |         "ready": "Hotovo!", | ||||||
|  |  | ||||||
|  | @ -197,6 +197,7 @@ | ||||||
|         "example": "Beispiel", |         "example": "Beispiel", | ||||||
|         "examples": "Beispiele", |         "examples": "Beispiele", | ||||||
|         "fewChangesBefore": "Bitte beantworten Sie einige Fragen zu bestehenden Objekten, bevor Sie ein neues Objekt hinzufügen.", |         "fewChangesBefore": "Bitte beantworten Sie einige Fragen zu bestehenden Objekten, bevor Sie ein neues Objekt hinzufügen.", | ||||||
|  |         "geopermissionDenied": "Die Verwendung der Standortbestimmung wurde verweigert", | ||||||
|         "getStartedLogin": "Bei OpenStreetMap anmelden, um loszulegen", |         "getStartedLogin": "Bei OpenStreetMap anmelden, um loszulegen", | ||||||
|         "getStartedNewAccount": " oder <a href=\"https://www.openstreetmap.org/user/new\" target=\"_blank\">ein neues Konto anlegen</a>", |         "getStartedNewAccount": " oder <a href=\"https://www.openstreetmap.org/user/new\" target=\"_blank\">ein neues Konto anlegen</a>", | ||||||
|         "goToInbox": "Posteingang öffnen", |         "goToInbox": "Posteingang öffnen", | ||||||
|  | @ -417,7 +418,20 @@ | ||||||
|         "respectPrivacy": "Bitte respektieren Sie die Privatsphäre. Fotografieren Sie weder Personen noch Nummernschilder. Benutzen Sie keine urheberrechtlich geschützten Quellen wie z.B. Google Maps oder Google Streetview.", |         "respectPrivacy": "Bitte respektieren Sie die Privatsphäre. Fotografieren Sie weder Personen noch Nummernschilder. Benutzen Sie keine urheberrechtlich geschützten Quellen wie z.B. Google Maps oder Google Streetview.", | ||||||
|         "toBig": "Ihr Bild ist mit {actual_size} zu groß. Die maximale Bildgröße ist {max_size}", |         "toBig": "Ihr Bild ist mit {actual_size} zu groß. Die maximale Bildgröße ist {max_size}", | ||||||
|         "upload": { |         "upload": { | ||||||
|             "failReasons": "Keine Internetverbindung" |             "failReasons": "Keine Internetverbindung", | ||||||
|  |             "failReasonsAdvanced": "Alternativ dazu können Sie einstellen, dass Ihr Browser und Ihre Erweiterungen die APIs von Drittanbietern nicht blockieren.", | ||||||
|  |             "multiple": { | ||||||
|  |                 "done": "{count} Bilder erfolgreich hochgeladen. Vielen Dank!", | ||||||
|  |                 "partiallyDone": "{count} Bilder werden hochgeladen, {done} Bilder erledigt…", | ||||||
|  |                 "someFailed": "Entschuldigung, {count} Bilder konnten nicht hochgeladen werden", | ||||||
|  |                 "uploading": "{count} Bilder werden hochgeladen…" | ||||||
|  |             }, | ||||||
|  |             "one": { | ||||||
|  |                 "done": "Bild erfolgreich hochgeladen. Vielen Dank!", | ||||||
|  |                 "failed": "Entschuldigung, das Bild konnte nicht hochgeladen werden", | ||||||
|  |                 "retrying": "Das Bild wird wiederholt hochgeladen…", | ||||||
|  |                 "uploading": "Das Bild wird hochgeladen…" | ||||||
|  |             } | ||||||
|         }, |         }, | ||||||
|         "uploadDone": "Ihr Bild wurde hinzugefügt. Vielen Dank für Ihre Hilfe!", |         "uploadDone": "Ihr Bild wurde hinzugefügt. Vielen Dank für Ihre Hilfe!", | ||||||
|         "uploadFailed": "Das Bild konnte nicht hochladen werden. Haben Sie eine aktive Internetverbindung und sind APIs von Dritten erlaubt? Der Brave Browser oder UMatrix blockieren diese eventuell.", |         "uploadFailed": "Das Bild konnte nicht hochladen werden. Haben Sie eine aktive Internetverbindung und sind APIs von Dritten erlaubt? Der Brave Browser oder UMatrix blockieren diese eventuell.", | ||||||
|  | @ -504,7 +518,9 @@ | ||||||
|     }, |     }, | ||||||
|     "plantDetection": { |     "plantDetection": { | ||||||
|         "back": "Zurück zur Artenübersicht", |         "back": "Zurück zur Artenübersicht", | ||||||
|  |         "button": "Automatische Erkennung der Pflanzenart durch die KI von Plantnet.org", | ||||||
|         "confirm": "Arten auswählen", |         "confirm": "Arten auswählen", | ||||||
|  |         "done": "Die Art wurde übernommen", | ||||||
|         "error": "Bei der Erkennung der Baumart ist ein Fehler aufgetreten: {error}", |         "error": "Bei der Erkennung der Baumart ist ein Fehler aufgetreten: {error}", | ||||||
|         "howTo": { |         "howTo": { | ||||||
|             "intro": "Für optimale Ergebnisse,", |             "intro": "Für optimale Ergebnisse,", | ||||||
|  | @ -521,7 +537,8 @@ | ||||||
|         "poweredByPlantnet": "Bereitgestellt von <a href='https://plantnet.org' target='_blank'>plantnet.org</a>", |         "poweredByPlantnet": "Bereitgestellt von <a href='https://plantnet.org' target='_blank'>plantnet.org</a>", | ||||||
|         "querying": "Abfrage bei plantnet.org mit {length} Fotos", |         "querying": "Abfrage bei plantnet.org mit {length} Fotos", | ||||||
|         "seeInfo": "Weitere Informationen über diese Art", |         "seeInfo": "Weitere Informationen über diese Art", | ||||||
|         "takeImages": "Machen Sie Fotos vom Baum, um die Baumart automatisch zu erkennen" |         "takeImages": "Machen Sie Fotos vom Baum, um die Baumart automatisch zu erkennen", | ||||||
|  |         "tryAgain": "Wähle eine andere Art" | ||||||
|     }, |     }, | ||||||
|     "privacy": { |     "privacy": { | ||||||
|         "editing": "Ihre Änderungen werden auf OpenStreetMap gespeichert und sind öffentlich zugänglich. Ein mit MapComplete erstellter Änderungssatz enthält folgende Daten: <ul><li>Ihre Änderungen</li><li>Ihren Benutzernamen</li><li>Den Zeitpunkt Ihrer Änderungen</li><li>Das bei Ihren Änderungen verwendete MapComplete-Thema</li><li>Die Sprache Ihrer Benutzeroberfläche</li><li>Ihre Entfernung zu den geänderten Objekten. Dadurch kann festgestellt werden, ob die Änderungen vor Ort gespeichert wurden</li></ul> Ausführliche Informationen finden Sie in <a href=\"https://wiki.osmfoundation.org/wiki/Privacy_Policy\" target=\"_blank\">den Datenschutzbestimmungen auf OpenStreetMap.org</a>. Wir möchten Sie daran erinnern, dass Sie zur Anmeldung einen fiktiven Namen verwenden können.", |         "editing": "Ihre Änderungen werden auf OpenStreetMap gespeichert und sind öffentlich zugänglich. Ein mit MapComplete erstellter Änderungssatz enthält folgende Daten: <ul><li>Ihre Änderungen</li><li>Ihren Benutzernamen</li><li>Den Zeitpunkt Ihrer Änderungen</li><li>Das bei Ihren Änderungen verwendete MapComplete-Thema</li><li>Die Sprache Ihrer Benutzeroberfläche</li><li>Ihre Entfernung zu den geänderten Objekten. Dadurch kann festgestellt werden, ob die Änderungen vor Ort gespeichert wurden</li></ul> Ausführliche Informationen finden Sie in <a href=\"https://wiki.osmfoundation.org/wiki/Privacy_Policy\" target=\"_blank\">den Datenschutzbestimmungen auf OpenStreetMap.org</a>. Wir möchten Sie daran erinnern, dass Sie zur Anmeldung einen fiktiven Namen verwenden können.", | ||||||
|  | @ -540,11 +557,16 @@ | ||||||
|     "reviews": { |     "reviews": { | ||||||
|         "affiliated_reviewer_warning": "(Partner-Rezension)", |         "affiliated_reviewer_warning": "(Partner-Rezension)", | ||||||
|         "attribution": "Rezensionen von <a href=\"https://mangrove.reviews/\" target=\"_blank\">Mangrove Reviews</a> sind unter <a href=\"https://mangrove.reviews/terms#8-licensing-of-content\" target=\"_blank\">CC-BY 4.0</a> verfügbar.", |         "attribution": "Rezensionen von <a href=\"https://mangrove.reviews/\" target=\"_blank\">Mangrove Reviews</a> sind unter <a href=\"https://mangrove.reviews/terms#8-licensing-of-content\" target=\"_blank\">CC-BY 4.0</a> verfügbar.", | ||||||
|         "i_am_affiliated": "<span>Ich bin an diesem Objekt beteiligt</span><br/><span class='subtle'>Auswählen, wenn Sie Eigentümer, Ersteller, Angestellter … sind</span>", |         "i_am_affiliated": "Ich bin mit diesem Objekt vertraut", | ||||||
|  |         "i_am_affiliated_explanation": "Prüfung, ob Sie der Eigentümer, Ersteller, Angestellter, … sind", | ||||||
|         "name_required": "Der Name des Objekts ist erforderlich, um Bewertungen zu erstellen und anzuzeigen", |         "name_required": "Der Name des Objekts ist erforderlich, um Bewertungen zu erstellen und anzuzeigen", | ||||||
|         "no_reviews_yet": "Es gibt noch keine Bewertungen. Hilf mit der ersten Bewertung dem Geschäft und der Open Data Bewegung!", |         "no_reviews_yet": "Es gibt noch keine Bewertungen. Hilf mit der ersten Bewertung dem Geschäft und der Open Data Bewegung!", | ||||||
|  |         "question": "Wie bewerten Sie {title()}?", | ||||||
|  |         "question_opinion": "Wie war Ihre Erfahrung?", | ||||||
|  |         "reviewing_as": "Als {nickname} bewerten", | ||||||
|  |         "reviewing_as_anonymous": "Anonym bewerten", | ||||||
|         "save": "Speichern", |         "save": "Speichern", | ||||||
|         "saved": "<span class=\"thanks\">Bewertung gespeichert. Danke fürs Teilen!</span>", |         "saved": "Bewertung gespeichert. Danke fürs Teilen!", | ||||||
|         "saving_review": "Speichern…", |         "saving_review": "Speichern…", | ||||||
|         "title": "{count} Rezensionen", |         "title": "{count} Rezensionen", | ||||||
|         "title_singular": "Eine Rezension", |         "title_singular": "Eine Rezension", | ||||||
|  |  | ||||||
|  | @ -2396,10 +2396,25 @@ | ||||||
|             } |             } | ||||||
|         }, |         }, | ||||||
|         "tagRenderings": { |         "tagRenderings": { | ||||||
|  |             "Contained_climbing_routes": { | ||||||
|  |                 "render": "<h3>Conté {_contained_climbing_routes_count} rutes</h3> <ul>{_contained_climbing_routes}</ul>" | ||||||
|  |             }, | ||||||
|             "Rock type (crag/rock/cliff only)": { |             "Rock type (crag/rock/cliff only)": { | ||||||
|  |                 "mappings": { | ||||||
|  |                     "0": { | ||||||
|  |                         "then": "Calcària" | ||||||
|  |                     } | ||||||
|  |                 }, | ||||||
|                 "question": "Quin és el tipus de roca aquí?", |                 "question": "Quin és el tipus de roca aquí?", | ||||||
|                 "render": "El tipus de roca és {rock}" |                 "render": "El tipus de roca és {rock}" | ||||||
|             }, |             }, | ||||||
|  |             "Type": { | ||||||
|  |                 "mappings": { | ||||||
|  |                     "0": { | ||||||
|  |                         "then": "Una roca d'escalada: una única roca o penya-segat amb una o unes quantes vies d'escalada que es poden escalar amb seguretat sense corda" | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             }, | ||||||
|             "name": { |             "name": { | ||||||
|                 "render": "<strong>{name}</strong>" |                 "render": "<strong>{name}</strong>" | ||||||
|             } |             } | ||||||
|  | @ -4424,7 +4439,8 @@ | ||||||
|                 } |                 } | ||||||
|             }, |             }, | ||||||
|             "ghost_bike-start_date": { |             "ghost_bike-start_date": { | ||||||
|                 "question": "Quan es va instal·lar aquesta bicicleta Ghost?" |                 "question": "Quan es va instal·lar aquesta bicicleta Ghost?", | ||||||
|  |                 "render": "Col·locat el {start_date}" | ||||||
|             } |             } | ||||||
|         }, |         }, | ||||||
|         "title": { |         "title": { | ||||||
|  | @ -7451,8 +7467,13 @@ | ||||||
|                     }, |                     }, | ||||||
|                     "4": { |                     "4": { | ||||||
|                         "then": "Aquí es juga al corfbol" |                         "then": "Aquí es juga al corfbol" | ||||||
|  |                     }, | ||||||
|  |                     "6": { | ||||||
|  |                         "then": "Açò és un skatepark" | ||||||
|                     } |                     } | ||||||
|                 } |                 }, | ||||||
|  |                 "question": "Quin esport es pot practicar aquí?", | ||||||
|  |                 "render": "{sport} es juga aquí" | ||||||
|             }, |             }, | ||||||
|             "sport_pitch-surface": { |             "sport_pitch-surface": { | ||||||
|                 "mappings": { |                 "mappings": { | ||||||
|  | @ -7472,14 +7493,28 @@ | ||||||
|                         "then": "La superfície és <b>formigó</b>" |                         "then": "La superfície és <b>formigó</b>" | ||||||
|                     } |                     } | ||||||
|                 }, |                 }, | ||||||
|                 "question": "Quina és la superfície d'aquest camp esportiu?" |                 "question": "Quina és la superfície d'aquest camp esportiu?", | ||||||
|  |                 "render": "La superfícies és <b>{surface}</b>" | ||||||
|             } |             } | ||||||
|         }, |         }, | ||||||
|         "title": { |         "title": { | ||||||
|             "render": "Camp d'esports" |             "render": "Camp d'esports" | ||||||
|         } |         } | ||||||
|     }, |     }, | ||||||
|  |     "sports_centre": { | ||||||
|  |         "description": "En aquesta capa es poden trobar centres esportius interiors i exteriors", | ||||||
|  |         "name": "Centres esportius", | ||||||
|  |         "presets": { | ||||||
|  |             "0": { | ||||||
|  |                 "title": "un centre esportiu" | ||||||
|  |             } | ||||||
|  |         }, | ||||||
|  |         "title": { | ||||||
|  |             "render": "Centre esportiu" | ||||||
|  |         } | ||||||
|  |     }, | ||||||
|     "stairs": { |     "stairs": { | ||||||
|  |         "description": "Capa que mostra escales i escales mecàniques", | ||||||
|         "name": "Escales", |         "name": "Escales", | ||||||
|         "tagRenderings": { |         "tagRenderings": { | ||||||
|             "conveying": { |             "conveying": { | ||||||
|  | @ -7746,6 +7781,7 @@ | ||||||
|                 "question": "Quin tipus de càmera és aquesta?" |                 "question": "Quin tipus de càmera és aquesta?" | ||||||
|             }, |             }, | ||||||
|             "Level": { |             "Level": { | ||||||
|  |                 "question": "A quina planta es troba aquesta càmera?", | ||||||
|                 "render": "Ubicat a la planta {level}" |                 "render": "Ubicat a la planta {level}" | ||||||
|             }, |             }, | ||||||
|             "Operator": { |             "Operator": { | ||||||
|  | @ -7852,14 +7888,19 @@ | ||||||
|         } |         } | ||||||
|     }, |     }, | ||||||
|     "tertiary_education": { |     "tertiary_education": { | ||||||
|  |         "name": "Instituts superiors i universitats", | ||||||
|         "presets": { |         "presets": { | ||||||
|             "0": { |             "0": { | ||||||
|  |                 "description": "Un institut on s'imparteix ensenyament terciari (al nivell equivalent de batxillerat o superior). N'hi ha prou amb un únic punt per campus: els edificis i les facultats no s'han de cartografiar amb diferents punts universitaris.", | ||||||
|                 "title": "una universitat" |                 "title": "una universitat" | ||||||
|             } |             } | ||||||
|         }, |         }, | ||||||
|         "tagRenderings": { |         "tagRenderings": { | ||||||
|             "institution-kind": { |             "institution-kind": { | ||||||
|                 "mappings": { |                 "mappings": { | ||||||
|  |                     "0": { | ||||||
|  |                         "then": "Aquesta és una institució d'educació postsecundària i no terciària. S'ha d'haver completat l'educació secundària per matricular-se aquí, però aquí no s'obtenen títols de batxillerat (o superiors)" | ||||||
|  |                     }, | ||||||
|                     "1": { |                     "1": { | ||||||
|                         "then": "Açò és una universitat, una institució d'educació terciaria on s'imparteixen carreres universitàries o superior." |                         "then": "Açò és una universitat, una institució d'educació terciaria on s'imparteixen carreres universitàries o superior." | ||||||
|                     } |                     } | ||||||
|  | @ -7883,8 +7924,14 @@ | ||||||
|         }, |         }, | ||||||
|         "title": { |         "title": { | ||||||
|             "mappings": { |             "mappings": { | ||||||
|  |                 "1": { | ||||||
|  |                     "then": "Institut superior" | ||||||
|  |                 }, | ||||||
|                 "2": { |                 "2": { | ||||||
|                     "then": "Universitat" |                     "then": "Universitat" | ||||||
|  |                 }, | ||||||
|  |                 "3": { | ||||||
|  |                     "then": "Escola que imparteix educació terciària" | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  | @ -8147,10 +8194,22 @@ | ||||||
|                         "question": "Accessible amb cadira de rodes" |                         "question": "Accessible amb cadira de rodes" | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|  |             }, | ||||||
|  |             "2": { | ||||||
|  |                 "options": { | ||||||
|  |                     "0": { | ||||||
|  |                         "question": "Ús gratuït" | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|             } |             } | ||||||
|         }, |         }, | ||||||
|         "name": "Lavabos a altres instal·lacions", |         "name": "Lavabos a altres instal·lacions", | ||||||
|         "tagRenderings": { |         "tagRenderings": { | ||||||
|  |             "opening_hours": { | ||||||
|  |                 "override": { | ||||||
|  |                     "question": "Quan està oberta la instal·lació on es troben aquests lavabos?" | ||||||
|  |                 } | ||||||
|  |             }, | ||||||
|             "toilet-access": { |             "toilet-access": { | ||||||
|                 "mappings": { |                 "mappings": { | ||||||
|                     "0": { |                     "0": { | ||||||
|  | @ -8202,9 +8261,18 @@ | ||||||
|                 "question": "Hi ha un lavabo específic per a usuaris amb cadira de rodes?" |                 "question": "Hi ha un lavabo específic per a usuaris amb cadira de rodes?" | ||||||
|             }, |             }, | ||||||
|             "wheelchair-door-width": { |             "wheelchair-door-width": { | ||||||
|                 "question": "Quina és l'amplada de la porta del lavabo accessible per a cadira de rodes?" |                 "question": "Quina és l'amplada de la porta del lavabo accessible per a cadira de rodes?", | ||||||
|  |                 "render": "La porta del vàter accessible amb cadira de rodes és {canonical(toilets:door:width)} d'ample" | ||||||
|             } |             } | ||||||
|         }, |         }, | ||||||
|  |         "title": { | ||||||
|  |             "mappings": { | ||||||
|  |                 "0": { | ||||||
|  |                     "then": "Bany a {name}" | ||||||
|  |                 } | ||||||
|  |             }, | ||||||
|  |             "render": "Lavabo a la instal·lació" | ||||||
|  |         }, | ||||||
|         "units": { |         "units": { | ||||||
|             "0": { |             "0": { | ||||||
|                 "applicableUnits": { |                 "applicableUnits": { | ||||||
|  | @ -8290,6 +8358,7 @@ | ||||||
|         } |         } | ||||||
|     }, |     }, | ||||||
|     "transit_stops": { |     "transit_stops": { | ||||||
|  |         "description": "Capa que mostra diferents tipus de parades de transport públic", | ||||||
|         "filter": { |         "filter": { | ||||||
|             "0": { |             "0": { | ||||||
|                 "options": { |                 "options": { | ||||||
|  | @ -8422,7 +8491,8 @@ | ||||||
|                 "0": { |                 "0": { | ||||||
|                     "then": "Parada {name}" |                     "then": "Parada {name}" | ||||||
|                 } |                 } | ||||||
|             } |             }, | ||||||
|  |             "render": "Parada de transport públic" | ||||||
|         } |         } | ||||||
|     }, |     }, | ||||||
|     "tree_node": { |     "tree_node": { | ||||||
|  | @ -8812,6 +8882,12 @@ | ||||||
|                     "16": { |                     "16": { | ||||||
|                         "question": "Venda de productes carnis" |                         "question": "Venda de productes carnis" | ||||||
|                     }, |                     }, | ||||||
|  |                     "17": { | ||||||
|  |                         "question": "Venda d'aparcament" | ||||||
|  |                     }, | ||||||
|  |                     "18": { | ||||||
|  |                         "question": "Venda de monedes premsades" | ||||||
|  |                     }, | ||||||
|                     "19": { |                     "19": { | ||||||
|                         "question": "Venda de flors" |                         "question": "Venda de flors" | ||||||
|                     }, |                     }, | ||||||
|  |  | ||||||
|  | @ -3170,6 +3170,9 @@ | ||||||
|                     }, |                     }, | ||||||
|                     "6": { |                     "6": { | ||||||
|                         "then": "En affaldskurv til plast" |                         "then": "En affaldskurv til plast" | ||||||
|  |                     }, | ||||||
|  |                     "7": { | ||||||
|  |                         "then": "En affaldskurv til papir" | ||||||
|                     } |                     } | ||||||
|                 }, |                 }, | ||||||
|                 "question": "Hvad er det for en affaldskurv?" |                 "question": "Hvad er det for en affaldskurv?" | ||||||
|  |  | ||||||
|  | @ -35,6 +35,16 @@ | ||||||
|             "1": { |             "1": { | ||||||
|                 "title": "eine freistehende Posterbox" |                 "title": "eine freistehende Posterbox" | ||||||
|             }, |             }, | ||||||
|  |             "10": { | ||||||
|  |                 "description": "Verwendet für Werbeschilder, Leuchtreklamen, Logos und institutionelle Eingangsschilder", | ||||||
|  |                 "title": "ein Schild" | ||||||
|  |             }, | ||||||
|  |             "11": { | ||||||
|  |                 "title": "eine Skulptur" | ||||||
|  |             }, | ||||||
|  |             "12": { | ||||||
|  |                 "title": "eine Wandmalerei" | ||||||
|  |             }, | ||||||
|             "2": { |             "2": { | ||||||
|                 "title": "eine wandmontierte Posterbox" |                 "title": "eine wandmontierte Posterbox" | ||||||
|             }, |             }, | ||||||
|  | @ -61,16 +71,6 @@ | ||||||
|             }, |             }, | ||||||
|             "9": { |             "9": { | ||||||
|                 "title": "ein Totem" |                 "title": "ein Totem" | ||||||
|             }, |  | ||||||
|             "10": { |  | ||||||
|                 "description": "Verwendet für Werbeschilder, Leuchtreklamen, Logos und institutionelle Eingangsschilder", |  | ||||||
|                 "title": "ein Schild" |  | ||||||
|             }, |  | ||||||
|             "11": { |  | ||||||
|                 "title": "eine Skulptur" |  | ||||||
|             }, |  | ||||||
|             "12": { |  | ||||||
|                 "title": "eine Wandmalerei" |  | ||||||
|             } |             } | ||||||
|         }, |         }, | ||||||
|         "tagRenderings": { |         "tagRenderings": { | ||||||
|  | @ -165,6 +165,9 @@ | ||||||
|                     "1": { |                     "1": { | ||||||
|                         "then": "Dies ist ein Brett" |                         "then": "Dies ist ein Brett" | ||||||
|                     }, |                     }, | ||||||
|  |                     "10": { | ||||||
|  |                         "then": "Dies ist eine Wandmalerei" | ||||||
|  |                     }, | ||||||
|                     "2": { |                     "2": { | ||||||
|                         "then": "Dies ist eine Litfaßsäule" |                         "then": "Dies ist eine Litfaßsäule" | ||||||
|                     }, |                     }, | ||||||
|  | @ -188,9 +191,6 @@ | ||||||
|                     }, |                     }, | ||||||
|                     "9": { |                     "9": { | ||||||
|                         "then": "Dies ist ein Totem" |                         "then": "Dies ist ein Totem" | ||||||
|                     }, |  | ||||||
|                     "10": { |  | ||||||
|                         "then": "Dies ist eine Wandmalerei" |  | ||||||
|                     } |                     } | ||||||
|                 }, |                 }, | ||||||
|                 "question": "Welche Art von Werbung ist das?", |                 "question": "Welche Art von Werbung ist das?", | ||||||
|  | @ -205,6 +205,9 @@ | ||||||
|                 "1": { |                 "1": { | ||||||
|                     "then": "Brett" |                     "then": "Brett" | ||||||
|                 }, |                 }, | ||||||
|  |                 "10": { | ||||||
|  |                     "then": "Wandmalerei" | ||||||
|  |                 }, | ||||||
|                 "2": { |                 "2": { | ||||||
|                     "then": "Posterbox" |                     "then": "Posterbox" | ||||||
|                 }, |                 }, | ||||||
|  | @ -228,9 +231,6 @@ | ||||||
|                 }, |                 }, | ||||||
|                 "9": { |                 "9": { | ||||||
|                     "then": "Totem" |                     "then": "Totem" | ||||||
|                 }, |  | ||||||
|                 "10": { |  | ||||||
|                     "then": "Wandmalerei" |  | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  | @ -312,6 +312,15 @@ | ||||||
|                     "1": { |                     "1": { | ||||||
|                         "then": "Wandbild" |                         "then": "Wandbild" | ||||||
|                     }, |                     }, | ||||||
|  |                     "10": { | ||||||
|  |                         "then": "Azulejo (spanische dekorative Fliesenarbeit)" | ||||||
|  |                     }, | ||||||
|  |                     "11": { | ||||||
|  |                         "then": "Fliesenarbeit" | ||||||
|  |                     }, | ||||||
|  |                     "12": { | ||||||
|  |                         "then": "Holzschnitzerei" | ||||||
|  |                     }, | ||||||
|                     "2": { |                     "2": { | ||||||
|                         "then": "Malerei" |                         "then": "Malerei" | ||||||
|                     }, |                     }, | ||||||
|  | @ -335,15 +344,6 @@ | ||||||
|                     }, |                     }, | ||||||
|                     "9": { |                     "9": { | ||||||
|                         "then": "Relief" |                         "then": "Relief" | ||||||
|                     }, |  | ||||||
|                     "10": { |  | ||||||
|                         "then": "Azulejo (spanische dekorative Fliesenarbeit)" |  | ||||||
|                     }, |  | ||||||
|                     "11": { |  | ||||||
|                         "then": "Fliesenarbeit" |  | ||||||
|                     }, |  | ||||||
|                     "12": { |  | ||||||
|                         "then": "Holzschnitzerei" |  | ||||||
|                     } |                     } | ||||||
|                 }, |                 }, | ||||||
|                 "question": "Um welche Art Kunstwerk handelt es sich?", |                 "question": "Um welche Art Kunstwerk handelt es sich?", | ||||||
|  | @ -1837,6 +1837,27 @@ | ||||||
|                     "1": { |                     "1": { | ||||||
|                         "question": "Verfügt über einen <div style='display: inline-block'><b><b>Schuko-Stecker</b> ohne Erdungsstift (CEE7/4 Typ F)</b><img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/CEE7_4F.svg'/></div>" |                         "question": "Verfügt über einen <div style='display: inline-block'><b><b>Schuko-Stecker</b> ohne Erdungsstift (CEE7/4 Typ F)</b><img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/CEE7_4F.svg'/></div>" | ||||||
|                     }, |                     }, | ||||||
|  |                     "10": { | ||||||
|  |                         "question": "Hat einen <div style='display: inline-block'><b><b>Typ 2</b> (Mennekes)</b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/Type2_tethered.svg'/></div> Anschluss mit Kabel" | ||||||
|  |                     }, | ||||||
|  |                     "11": { | ||||||
|  |                         "question": "Hat einen <div style='display: inline-block'><b><b>Tesla Supercharger CCS</b> (Typ 2 CSS vonTesla)</b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/Type2_CCS.svg'/></div> Anschluss" | ||||||
|  |                     }, | ||||||
|  |                     "12": { | ||||||
|  |                         "question": "Hat einen <div style='display: inline-block'><b><b>Tesla Supercharger (Destination)</b></b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/Tesla-hpwc-model-s.svg'/></div> Anschluss" | ||||||
|  |                     }, | ||||||
|  |                     "13": { | ||||||
|  |                         "question": "Hat einen <div style='display: inline-block'><b><b>Tesla Supercharger (Destination)</b> (Typ 2 von Tesla)</b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/Type2_tethered.svg'/></div> Anschluss mit Kabel" | ||||||
|  |                     }, | ||||||
|  |                     "14": { | ||||||
|  |                         "question": "Hat einen <div style='display: inline-block'><b><b>USB</b>-Anschluss zum Aufladen von Telefonen und kleinen Elektrogeräten</b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/usb_port.svg'/></div>" | ||||||
|  |                     }, | ||||||
|  |                     "15": { | ||||||
|  |                         "question": "Hat einen <div style='display: inline-block'><b><b>Bosch Active Connect Anschluss mit 3 Pins</b></b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/bosch-3pin.svg'/></div> und Kabel" | ||||||
|  |                     }, | ||||||
|  |                     "16": { | ||||||
|  |                         "question": "Hat einen <div style='display: inline-block'><b><b>Bosch Active Connect Anschluss mit 5 Pins</b></b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/bosch-5pin.svg'/></div> und Kabel" | ||||||
|  |                     }, | ||||||
|                     "2": { |                     "2": { | ||||||
|                         "question": "Verfügt über einen <div style='display: inline-block'><b><b>europäischen Netzstecker</b> mit Erdungsstift (CEE7/4 Typ E)</b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/TypeE.svg'/></div> Anschluss" |                         "question": "Verfügt über einen <div style='display: inline-block'><b><b>europäischen Netzstecker</b> mit Erdungsstift (CEE7/4 Typ E)</b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/TypeE.svg'/></div> Anschluss" | ||||||
|                     }, |                     }, | ||||||
|  | @ -1860,27 +1881,6 @@ | ||||||
|                     }, |                     }, | ||||||
|                     "9": { |                     "9": { | ||||||
|                         "question": "Hat einen <div style='display: inline-block'><b><b>Typ 2 CCS</b> (Mennekes)</b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/Type2_CCS.svg'/></div> Anschluss" |                         "question": "Hat einen <div style='display: inline-block'><b><b>Typ 2 CCS</b> (Mennekes)</b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/Type2_CCS.svg'/></div> Anschluss" | ||||||
|                     }, |  | ||||||
|                     "10": { |  | ||||||
|                         "question": "Hat einen <div style='display: inline-block'><b><b>Typ 2</b> (Mennekes)</b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/Type2_tethered.svg'/></div> Anschluss mit Kabel" |  | ||||||
|                     }, |  | ||||||
|                     "11": { |  | ||||||
|                         "question": "Hat einen <div style='display: inline-block'><b><b>Tesla Supercharger CCS</b> (Typ 2 CSS vonTesla)</b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/Type2_CCS.svg'/></div> Anschluss" |  | ||||||
|                     }, |  | ||||||
|                     "12": { |  | ||||||
|                         "question": "Hat einen <div style='display: inline-block'><b><b>Tesla Supercharger (Destination)</b></b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/Tesla-hpwc-model-s.svg'/></div> Anschluss" |  | ||||||
|                     }, |  | ||||||
|                     "13": { |  | ||||||
|                         "question": "Hat einen <div style='display: inline-block'><b><b>Tesla Supercharger (Destination)</b> (Typ 2 von Tesla)</b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/Type2_tethered.svg'/></div> Anschluss mit Kabel" |  | ||||||
|                     }, |  | ||||||
|                     "14": { |  | ||||||
|                         "question": "Hat einen <div style='display: inline-block'><b><b>USB</b>-Anschluss zum Aufladen von Telefonen und kleinen Elektrogeräten</b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/usb_port.svg'/></div>" |  | ||||||
|                     }, |  | ||||||
|                     "15": { |  | ||||||
|                         "question": "Hat einen <div style='display: inline-block'><b><b>Bosch Active Connect Anschluss mit 3 Pins</b></b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/bosch-3pin.svg'/></div> und Kabel" |  | ||||||
|                     }, |  | ||||||
|                     "16": { |  | ||||||
|                         "question": "Hat einen <div style='display: inline-block'><b><b>Bosch Active Connect Anschluss mit 5 Pins</b></b> <img style='width:1rem; display: inline-block' src='./assets/layers/charging_station/bosch-5pin.svg'/></div> und Kabel" |  | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|             } |             } | ||||||
|  | @ -1936,30 +1936,6 @@ | ||||||
|                     "1": { |                     "1": { | ||||||
|                         "then": "<b>Schuko-Stecker</b> ohne Erdungsstift (CEE7/4 Typ F)" |                         "then": "<b>Schuko-Stecker</b> ohne Erdungsstift (CEE7/4 Typ F)" | ||||||
|                     }, |                     }, | ||||||
|                     "2": { |  | ||||||
|                         "then": "<b>Europäischer Netzstecker</b> mit Erdungsstift (CEE7/4 Typ E)" |  | ||||||
|                     }, |  | ||||||
|                     "3": { |  | ||||||
|                         "then": "<b>Europäischer Netzstecker</b> mit Erdungsstift (CEE7/4 Typ E)" |  | ||||||
|                     }, |  | ||||||
|                     "4": { |  | ||||||
|                         "then": "<b>Chademo-Anschluss</b>" |  | ||||||
|                     }, |  | ||||||
|                     "5": { |  | ||||||
|                         "then": "<b>Chademo-Anschluss</b>" |  | ||||||
|                     }, |  | ||||||
|                     "6": { |  | ||||||
|                         "then": "<b>Typ 1 mit Kabel</b> (J1772)" |  | ||||||
|                     }, |  | ||||||
|                     "7": { |  | ||||||
|                         "then": "<b>Typ 1 mit Kabel</b> (J1772)" |  | ||||||
|                     }, |  | ||||||
|                     "8": { |  | ||||||
|                         "then": "<b>Typ 1 <i>ohne</i> Kabel</b> (J1772)" |  | ||||||
|                     }, |  | ||||||
|                     "9": { |  | ||||||
|                         "then": "<b> Typ 1 <i>ohne </i> Kabel</b> (J1772)" |  | ||||||
|                     }, |  | ||||||
|                     "10": { |                     "10": { | ||||||
|                         "then": "<b>Typ 1 CCS</b> (Typ 1 Combo)" |                         "then": "<b>Typ 1 CCS</b> (Typ 1 Combo)" | ||||||
|                     }, |                     }, | ||||||
|  | @ -1990,6 +1966,9 @@ | ||||||
|                     "19": { |                     "19": { | ||||||
|                         "then": "<b>Typ 2 mit Kabel</b> (mennekes)" |                         "then": "<b>Typ 2 mit Kabel</b> (mennekes)" | ||||||
|                     }, |                     }, | ||||||
|  |                     "2": { | ||||||
|  |                         "then": "<b>Europäischer Netzstecker</b> mit Erdungsstift (CEE7/4 Typ E)" | ||||||
|  |                     }, | ||||||
|                     "20": { |                     "20": { | ||||||
|                         "then": "<b>Tesla Supercharger CCS</b> (Typ 2 CSS von Tesla)" |                         "then": "<b>Tesla Supercharger CCS</b> (Typ 2 CSS von Tesla)" | ||||||
|                     }, |                     }, | ||||||
|  | @ -2020,11 +1999,32 @@ | ||||||
|                     "29": { |                     "29": { | ||||||
|                         "then": "<b> Bosch Active Connect mit 3 Pins </b> und Kabel" |                         "then": "<b> Bosch Active Connect mit 3 Pins </b> und Kabel" | ||||||
|                     }, |                     }, | ||||||
|  |                     "3": { | ||||||
|  |                         "then": "<b>Europäischer Netzstecker</b> mit Erdungsstift (CEE7/4 Typ E)" | ||||||
|  |                     }, | ||||||
|                     "30": { |                     "30": { | ||||||
|                         "then": "<b>Bosch Active Connect mit 5 Pins</b> und Kabel" |                         "then": "<b>Bosch Active Connect mit 5 Pins</b> und Kabel" | ||||||
|                     }, |                     }, | ||||||
|                     "31": { |                     "31": { | ||||||
|                         "then": "<b> Bosch Active Connect mit 5 Pins </b> und Kabel" |                         "then": "<b> Bosch Active Connect mit 5 Pins </b> und Kabel" | ||||||
|  |                     }, | ||||||
|  |                     "4": { | ||||||
|  |                         "then": "<b>Chademo-Anschluss</b>" | ||||||
|  |                     }, | ||||||
|  |                     "5": { | ||||||
|  |                         "then": "<b>Chademo-Anschluss</b>" | ||||||
|  |                     }, | ||||||
|  |                     "6": { | ||||||
|  |                         "then": "<b>Typ 1 mit Kabel</b> (J1772)" | ||||||
|  |                     }, | ||||||
|  |                     "7": { | ||||||
|  |                         "then": "<b>Typ 1 mit Kabel</b> (J1772)" | ||||||
|  |                     }, | ||||||
|  |                     "8": { | ||||||
|  |                         "then": "<b>Typ 1 <i>ohne</i> Kabel</b> (J1772)" | ||||||
|  |                     }, | ||||||
|  |                     "9": { | ||||||
|  |                         "then": "<b> Typ 1 <i>ohne </i> Kabel</b> (J1772)" | ||||||
|                     } |                     } | ||||||
|                 }, |                 }, | ||||||
|                 "question": "Welche Ladeanschlüsse gibt es hier?" |                 "question": "Welche Ladeanschlüsse gibt es hier?" | ||||||
|  | @ -3562,6 +3562,15 @@ | ||||||
|                     "1": { |                     "1": { | ||||||
|                         "then": "Dieser Radweg hat einen festen Belag" |                         "then": "Dieser Radweg hat einen festen Belag" | ||||||
|                     }, |                     }, | ||||||
|  |                     "10": { | ||||||
|  |                         "then": "Dieser Radweg besteht aus feinem Schotter" | ||||||
|  |                     }, | ||||||
|  |                     "11": { | ||||||
|  |                         "then": "Der Radweg ist aus Kies" | ||||||
|  |                     }, | ||||||
|  |                     "12": { | ||||||
|  |                         "then": "Dieser Radweg besteht aus Rohboden" | ||||||
|  |                     }, | ||||||
|                     "2": { |                     "2": { | ||||||
|                         "then": "Der Radweg ist aus Asphalt" |                         "then": "Der Radweg ist aus Asphalt" | ||||||
|                     }, |                     }, | ||||||
|  | @ -3585,15 +3594,6 @@ | ||||||
|                     }, |                     }, | ||||||
|                     "9": { |                     "9": { | ||||||
|                         "then": "Der Radweg ist aus Schotter" |                         "then": "Der Radweg ist aus Schotter" | ||||||
|                     }, |  | ||||||
|                     "10": { |  | ||||||
|                         "then": "Dieser Radweg besteht aus feinem Schotter" |  | ||||||
|                     }, |  | ||||||
|                     "11": { |  | ||||||
|                         "then": "Der Radweg ist aus Kies" |  | ||||||
|                     }, |  | ||||||
|                     "12": { |  | ||||||
|                         "then": "Dieser Radweg besteht aus Rohboden" |  | ||||||
|                     } |                     } | ||||||
|                 }, |                 }, | ||||||
|                 "question": "Was ist der Belag dieses Radwegs?", |                 "question": "Was ist der Belag dieses Radwegs?", | ||||||
|  | @ -3642,6 +3642,15 @@ | ||||||
|                     "1": { |                     "1": { | ||||||
|                         "then": "Dieser Radweg hat einen festen Belag" |                         "then": "Dieser Radweg hat einen festen Belag" | ||||||
|                     }, |                     }, | ||||||
|  |                     "10": { | ||||||
|  |                         "then": "Dieser Radweg besteht aus feinem Schotter" | ||||||
|  |                     }, | ||||||
|  |                     "11": { | ||||||
|  |                         "then": "Der Radweg ist aus Kies" | ||||||
|  |                     }, | ||||||
|  |                     "12": { | ||||||
|  |                         "then": "Dieser Radweg besteht aus Rohboden" | ||||||
|  |                     }, | ||||||
|                     "2": { |                     "2": { | ||||||
|                         "then": "Der Radweg ist aus Asphalt" |                         "then": "Der Radweg ist aus Asphalt" | ||||||
|                     }, |                     }, | ||||||
|  | @ -3665,15 +3674,6 @@ | ||||||
|                     }, |                     }, | ||||||
|                     "9": { |                     "9": { | ||||||
|                         "then": "Der Radweg ist aus Schotter" |                         "then": "Der Radweg ist aus Schotter" | ||||||
|                     }, |  | ||||||
|                     "10": { |  | ||||||
|                         "then": "Dieser Radweg besteht aus feinem Schotter" |  | ||||||
|                     }, |  | ||||||
|                     "11": { |  | ||||||
|                         "then": "Der Radweg ist aus Kies" |  | ||||||
|                     }, |  | ||||||
|                     "12": { |  | ||||||
|                         "then": "Dieser Radweg besteht aus Rohboden" |  | ||||||
|                     } |                     } | ||||||
|                 }, |                 }, | ||||||
|                 "question": "Was ist der Belag dieser Straße?", |                 "question": "Was ist der Belag dieser Straße?", | ||||||
|  | @ -4217,6 +4217,17 @@ | ||||||
|                 "question": "Verfügt der Aufzug über eine Sprachausgabe?", |                 "question": "Verfügt der Aufzug über eine Sprachausgabe?", | ||||||
|                 "questionHint": "Z.B. werden Stockwerke angesagt" |                 "questionHint": "Z.B. werden Stockwerke angesagt" | ||||||
|             }, |             }, | ||||||
|  |             "tactile_writing_available": { | ||||||
|  |                 "mappings": { | ||||||
|  |                     "0": { | ||||||
|  |                         "then": "Dieser Aufzug hat eine taktile Schrift in Brailleschrift" | ||||||
|  |                     }, | ||||||
|  |                     "1": { | ||||||
|  |                         "then": "Dieser Aufzug hat keine taktile Schrift" | ||||||
|  |                     } | ||||||
|  |                 }, | ||||||
|  |                 "question": "Hat dieser Aufzug taktile Schrift?" | ||||||
|  |             }, | ||||||
|             "tactile_writing_language": { |             "tactile_writing_language": { | ||||||
|                 "render": { |                 "render": { | ||||||
|                     "special": { |                     "special": { | ||||||
|  | @ -4561,6 +4572,19 @@ | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|             }, |             }, | ||||||
|  |             "10": { | ||||||
|  |                 "options": { | ||||||
|  |                     "0": { | ||||||
|  |                         "question": "Keine Bevorzugung von Hunden" | ||||||
|  |                     }, | ||||||
|  |                     "1": { | ||||||
|  |                         "question": "Hunde erlaubt" | ||||||
|  |                     }, | ||||||
|  |                     "2": { | ||||||
|  |                         "question": "Keine Hunde erlaubt" | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             }, | ||||||
|             "2": { |             "2": { | ||||||
|                 "options": { |                 "options": { | ||||||
|                     "0": { |                     "0": { | ||||||
|  | @ -4750,30 +4774,6 @@ | ||||||
|                     "1": { |                     "1": { | ||||||
|                         "then": "Die Fitness-Station hat ein Schild mit Anweisungen für eine bestimmte Übung." |                         "then": "Die Fitness-Station hat ein Schild mit Anweisungen für eine bestimmte Übung." | ||||||
|                     }, |                     }, | ||||||
|                     "2": { |  | ||||||
|                         "then": "Die Fitness-Station hat eine Einrichtung für Sit-ups." |  | ||||||
|                     }, |  | ||||||
|                     "3": { |  | ||||||
|                         "then": "Die Fitness-Station hat eine Vorrichtung für Liegestütze. In der Regel eine oder mehrere niedrige Reckstangen." |  | ||||||
|                     }, |  | ||||||
|                     "4": { |  | ||||||
|                         "then": "Die Fitness-Station hat Stangen zum Dehnen." |  | ||||||
|                     }, |  | ||||||
|                     "5": { |  | ||||||
|                         "then": "Die Fitness-Station hat eine Vorrichtung für Rückenstrecker (Hyperextensions)." |  | ||||||
|                     }, |  | ||||||
|                     "6": { |  | ||||||
|                         "then": "Die Fitness-Station hat Ringe für Gymnastikübungen." |  | ||||||
|                     }, |  | ||||||
|                     "7": { |  | ||||||
|                         "then": "Die Fitness-Station hat eine horizontale Leiter (Monkey Bars)." |  | ||||||
|                     }, |  | ||||||
|                     "8": { |  | ||||||
|                         "then": "Die Fitness-Station hat eine Sprossenwand zum Klettern." |  | ||||||
|                     }, |  | ||||||
|                     "9": { |  | ||||||
|                         "then": "Die Fitness-Station hat Pfosten für Slalomübungen." |  | ||||||
|                     }, |  | ||||||
|                     "10": { |                     "10": { | ||||||
|                         "then": "Die Fitness-Station hat Trittsteine." |                         "then": "Die Fitness-Station hat Trittsteine." | ||||||
|                     }, |                     }, | ||||||
|  | @ -4804,6 +4804,9 @@ | ||||||
|                     "19": { |                     "19": { | ||||||
|                         "then": "Die Fitness-Station hat Kampfseile (battle ropes)." |                         "then": "Die Fitness-Station hat Kampfseile (battle ropes)." | ||||||
|                     }, |                     }, | ||||||
|  |                     "2": { | ||||||
|  |                         "then": "Die Fitness-Station hat eine Einrichtung für Sit-ups." | ||||||
|  |                     }, | ||||||
|                     "20": { |                     "20": { | ||||||
|                         "then": "Die Fitness-Station hat ein Fahrradergometer." |                         "then": "Die Fitness-Station hat ein Fahrradergometer." | ||||||
|                     }, |                     }, | ||||||
|  | @ -4818,6 +4821,27 @@ | ||||||
|                     }, |                     }, | ||||||
|                     "24": { |                     "24": { | ||||||
|                         "then": "Die Fitness-Station hat eine Slackline." |                         "then": "Die Fitness-Station hat eine Slackline." | ||||||
|  |                     }, | ||||||
|  |                     "3": { | ||||||
|  |                         "then": "Die Fitness-Station hat eine Vorrichtung für Liegestütze. In der Regel eine oder mehrere niedrige Reckstangen." | ||||||
|  |                     }, | ||||||
|  |                     "4": { | ||||||
|  |                         "then": "Die Fitness-Station hat Stangen zum Dehnen." | ||||||
|  |                     }, | ||||||
|  |                     "5": { | ||||||
|  |                         "then": "Die Fitness-Station hat eine Vorrichtung für Rückenstrecker (Hyperextensions)." | ||||||
|  |                     }, | ||||||
|  |                     "6": { | ||||||
|  |                         "then": "Die Fitness-Station hat Ringe für Gymnastikübungen." | ||||||
|  |                     }, | ||||||
|  |                     "7": { | ||||||
|  |                         "then": "Die Fitness-Station hat eine horizontale Leiter (Monkey Bars)." | ||||||
|  |                     }, | ||||||
|  |                     "8": { | ||||||
|  |                         "then": "Die Fitness-Station hat eine Sprossenwand zum Klettern." | ||||||
|  |                     }, | ||||||
|  |                     "9": { | ||||||
|  |                         "then": "Die Fitness-Station hat Pfosten für Slalomübungen." | ||||||
|                     } |                     } | ||||||
|                 }, |                 }, | ||||||
|                 "question": "Welche Übungsgeräte gibt es an dieser Fitness-Station?" |                 "question": "Welche Übungsgeräte gibt es an dieser Fitness-Station?" | ||||||
|  | @ -4880,6 +4904,9 @@ | ||||||
|             }, |             }, | ||||||
|             "2": { |             "2": { | ||||||
|                 "options": { |                 "options": { | ||||||
|  |                     "0": { | ||||||
|  |                         "question": "Restaurants und Schnellimbissbetriebe" | ||||||
|  |                     }, | ||||||
|                     "1": { |                     "1": { | ||||||
|                         "question": "Nur Fastfood-Geschäfte" |                         "question": "Nur Fastfood-Geschäfte" | ||||||
|                     }, |                     }, | ||||||
|  | @ -4888,6 +4915,13 @@ | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|             }, |             }, | ||||||
|  |             "3": { | ||||||
|  |                 "options": { | ||||||
|  |                     "0": { | ||||||
|  |                         "question": "Hat ein vegetarisches Menü" | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             }, | ||||||
|             "4": { |             "4": { | ||||||
|                 "options": { |                 "options": { | ||||||
|                     "0": { |                     "0": { | ||||||
|  | @ -4927,6 +4961,21 @@ | ||||||
|                     "1": { |                     "1": { | ||||||
|                         "then": "Dies ist eine Pommesbude" |                         "then": "Dies ist eine Pommesbude" | ||||||
|                     }, |                     }, | ||||||
|  |                     "10": { | ||||||
|  |                         "then": "Hier werden chinesische Gerichte serviert" | ||||||
|  |                     }, | ||||||
|  |                     "11": { | ||||||
|  |                         "then": "Hier werden griechische Gerichte serviert" | ||||||
|  |                     }, | ||||||
|  |                     "12": { | ||||||
|  |                         "then": "Hier werden indische Gerichte serviert" | ||||||
|  |                     }, | ||||||
|  |                     "13": { | ||||||
|  |                         "then": "Hier werden türkische Gerichte serviert" | ||||||
|  |                     }, | ||||||
|  |                     "14": { | ||||||
|  |                         "then": "Hier werden thailändische Gerichte serviert" | ||||||
|  |                     }, | ||||||
|                     "2": { |                     "2": { | ||||||
|                         "then": "Bietet vorwiegend Pastagerichte an" |                         "then": "Bietet vorwiegend Pastagerichte an" | ||||||
|                     }, |                     }, | ||||||
|  | @ -4950,21 +4999,6 @@ | ||||||
|                     }, |                     }, | ||||||
|                     "9": { |                     "9": { | ||||||
|                         "then": "Hier werden französische Gerichte serviert" |                         "then": "Hier werden französische Gerichte serviert" | ||||||
|                     }, |  | ||||||
|                     "10": { |  | ||||||
|                         "then": "Hier werden chinesische Gerichte serviert" |  | ||||||
|                     }, |  | ||||||
|                     "11": { |  | ||||||
|                         "then": "Hier werden griechische Gerichte serviert" |  | ||||||
|                     }, |  | ||||||
|                     "12": { |  | ||||||
|                         "then": "Hier werden indische Gerichte serviert" |  | ||||||
|                     }, |  | ||||||
|                     "13": { |  | ||||||
|                         "then": "Hier werden türkische Gerichte serviert" |  | ||||||
|                     }, |  | ||||||
|                     "14": { |  | ||||||
|                         "then": "Hier werden thailändische Gerichte serviert" |  | ||||||
|                     } |                     } | ||||||
|                 }, |                 }, | ||||||
|                 "question": "Was für Essen gibt es hier?", |                 "question": "Was für Essen gibt es hier?", | ||||||
|  | @ -5532,6 +5566,61 @@ | ||||||
|                 }, |                 }, | ||||||
|                 "question": "Wie lautet die Nummer dieses Raums?", |                 "question": "Wie lautet die Nummer dieses Raums?", | ||||||
|                 "render": "Dieser Raum hat die Raumnummer {ref}" |                 "render": "Dieser Raum hat die Raumnummer {ref}" | ||||||
|  |             }, | ||||||
|  |             "room-capacity": { | ||||||
|  |                 "question": "Wie viele Personen passen höchstens in diesen Raum?" | ||||||
|  |             }, | ||||||
|  |             "room-type": { | ||||||
|  |                 "mappings": { | ||||||
|  |                     "0": { | ||||||
|  |                         "then": "Dies ist ein Verwaltungsraum" | ||||||
|  |                     }, | ||||||
|  |                     "1": { | ||||||
|  |                         "then": "Dies ist ein Auditorium" | ||||||
|  |                     }, | ||||||
|  |                     "10": { | ||||||
|  |                         "then": "Dies ist ein Labor" | ||||||
|  |                     }, | ||||||
|  |                     "11": { | ||||||
|  |                         "then": "Dies ist eine Bibliothek" | ||||||
|  |                     }, | ||||||
|  |                     "12": { | ||||||
|  |                         "then": "Dies ist ein Umkleideraum" | ||||||
|  |                     }, | ||||||
|  |                     "14": { | ||||||
|  |                         "then": "Dies ist ein Büro" | ||||||
|  |                     }, | ||||||
|  |                     "15": { | ||||||
|  |                         "then": "Dies ist eine Gefängniszelle" | ||||||
|  |                     }, | ||||||
|  |                     "16": { | ||||||
|  |                         "then": "Dies ist ein Restaurant" | ||||||
|  |                     }, | ||||||
|  |                     "2": { | ||||||
|  |                         "then": "Dies ist ein Schlafzimmer" | ||||||
|  |                     }, | ||||||
|  |                     "3": { | ||||||
|  |                         "then": "Dies ist eine Kapelle" | ||||||
|  |                     }, | ||||||
|  |                     "4": { | ||||||
|  |                         "then": "Dies ist ein Klassenzimmer" | ||||||
|  |                     }, | ||||||
|  |                     "5": { | ||||||
|  |                         "then": "Dies ist ein Klassenzimmer" | ||||||
|  |                     }, | ||||||
|  |                     "6": { | ||||||
|  |                         "then": "Dies ist ein Computerraum" | ||||||
|  |                     }, | ||||||
|  |                     "7": { | ||||||
|  |                         "then": "Dies ist ein Konferenzraum" | ||||||
|  |                     }, | ||||||
|  |                     "8": { | ||||||
|  |                         "then": "Dies ist eine Krypta" | ||||||
|  |                     }, | ||||||
|  |                     "9": { | ||||||
|  |                         "then": "Dies ist eine Küche" | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|             } |             } | ||||||
|         }, |         }, | ||||||
|         "title": { |         "title": { | ||||||
|  | @ -6183,6 +6272,19 @@ | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|             }, |             }, | ||||||
|  |             "10": { | ||||||
|  |                 "options": { | ||||||
|  |                     "0": { | ||||||
|  |                         "question": "Alle Notizen" | ||||||
|  |                     }, | ||||||
|  |                     "1": { | ||||||
|  |                         "question": "Importnotizen ausblenden" | ||||||
|  |                     }, | ||||||
|  |                     "2": { | ||||||
|  |                         "question": "Nur Importnotizen anzeigen" | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|  |             }, | ||||||
|             "2": { |             "2": { | ||||||
|                 "options": { |                 "options": { | ||||||
|                     "0": { |                     "0": { | ||||||
|  | @ -6238,19 +6340,6 @@ | ||||||
|                         "question": "Nur offene Notizen anzeigen" |                         "question": "Nur offene Notizen anzeigen" | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|             }, |  | ||||||
|             "10": { |  | ||||||
|                 "options": { |  | ||||||
|                     "0": { |  | ||||||
|                         "question": "Alle Notizen" |  | ||||||
|                     }, |  | ||||||
|                     "1": { |  | ||||||
|                         "question": "Importnotizen ausblenden" |  | ||||||
|                     }, |  | ||||||
|                     "2": { |  | ||||||
|                         "question": "Nur Importnotizen anzeigen" |  | ||||||
|                     } |  | ||||||
|                 } |  | ||||||
|             } |             } | ||||||
|         }, |         }, | ||||||
|         "name": "OpenStreetMap-Hinweise", |         "name": "OpenStreetMap-Hinweise", | ||||||
|  | @ -6579,6 +6668,21 @@ | ||||||
|                     "1": { |                     "1": { | ||||||
|                         "then": "Dies ist ein normaler Stellplatz." |                         "then": "Dies ist ein normaler Stellplatz." | ||||||
|                     }, |                     }, | ||||||
|  |                     "10": { | ||||||
|  |                         "then": "Dies ist ein Stellplatz, der für Eltern mit Kindern reserviert ist." | ||||||
|  |                     }, | ||||||
|  |                     "11": { | ||||||
|  |                         "then": "Dies ist ein Stellplatz, der für das Personal reserviert ist." | ||||||
|  |                     }, | ||||||
|  |                     "12": { | ||||||
|  |                         "then": "Dies ist ein Stellplatz, der für Taxis reserviert ist." | ||||||
|  |                     }, | ||||||
|  |                     "13": { | ||||||
|  |                         "then": "Dies ist ein Stellplatz, der für Fahrzeuge mit Anhänger reserviert ist." | ||||||
|  |                     }, | ||||||
|  |                     "14": { | ||||||
|  |                         "then": "Dies ist ein Stellplatz, der für Carsharing reserviert ist." | ||||||
|  |                     }, | ||||||
|                     "2": { |                     "2": { | ||||||
|                         "then": "Dies ist ein Behindertenstellplatz." |                         "then": "Dies ist ein Behindertenstellplatz." | ||||||
|                     }, |                     }, | ||||||
|  | @ -6602,21 +6706,6 @@ | ||||||
|                     }, |                     }, | ||||||
|                     "9": { |                     "9": { | ||||||
|                         "then": "Dies ist ein Stellplatz, der für Motorräder reserviert ist." |                         "then": "Dies ist ein Stellplatz, der für Motorräder reserviert ist." | ||||||
|                     }, |  | ||||||
|                     "10": { |  | ||||||
|                         "then": "Dies ist ein Stellplatz, der für Eltern mit Kindern reserviert ist." |  | ||||||
|                     }, |  | ||||||
|                     "11": { |  | ||||||
|                         "then": "Dies ist ein Stellplatz, der für das Personal reserviert ist." |  | ||||||
|                     }, |  | ||||||
|                     "12": { |  | ||||||
|                         "then": "Dies ist ein Stellplatz, der für Taxis reserviert ist." |  | ||||||
|                     }, |  | ||||||
|                     "13": { |  | ||||||
|                         "then": "Dies ist ein Stellplatz, der für Fahrzeuge mit Anhänger reserviert ist." |  | ||||||
|                     }, |  | ||||||
|                     "14": { |  | ||||||
|                         "then": "Dies ist ein Stellplatz, der für Carsharing reserviert ist." |  | ||||||
|                     } |                     } | ||||||
|                 }, |                 }, | ||||||
|                 "question": "Welche Art von Stellplatz ist dies?" |                 "question": "Welche Art von Stellplatz ist dies?" | ||||||
|  | @ -7629,30 +7718,6 @@ | ||||||
|                     "1": { |                     "1": { | ||||||
|                         "question": "Recycling von Batterien" |                         "question": "Recycling von Batterien" | ||||||
|                     }, |                     }, | ||||||
|                     "2": { |  | ||||||
|                         "question": "Recycling von Getränkekartons" |  | ||||||
|                     }, |  | ||||||
|                     "3": { |  | ||||||
|                         "question": "Recycling von Dosen" |  | ||||||
|                     }, |  | ||||||
|                     "4": { |  | ||||||
|                         "question": "Recycling von Kleidung" |  | ||||||
|                     }, |  | ||||||
|                     "5": { |  | ||||||
|                         "question": "Recycling von Speiseöl" |  | ||||||
|                     }, |  | ||||||
|                     "6": { |  | ||||||
|                         "question": "Recycling von Motoröl" |  | ||||||
|                     }, |  | ||||||
|                     "7": { |  | ||||||
|                         "question": "Recycling von Leuchtstoffröhren" |  | ||||||
|                     }, |  | ||||||
|                     "8": { |  | ||||||
|                         "question": "Recycling von Grünabfällen" |  | ||||||
|                     }, |  | ||||||
|                     "9": { |  | ||||||
|                         "question": "Recycling von Glasflaschen" |  | ||||||
|                     }, |  | ||||||
|                     "10": { |                     "10": { | ||||||
|                         "question": "Recycling von Glas" |                         "question": "Recycling von Glas" | ||||||
|                     }, |                     }, | ||||||
|  | @ -7683,11 +7748,35 @@ | ||||||
|                     "19": { |                     "19": { | ||||||
|                         "question": "Recycling von Restabfällen" |                         "question": "Recycling von Restabfällen" | ||||||
|                     }, |                     }, | ||||||
|  |                     "2": { | ||||||
|  |                         "question": "Recycling von Getränkekartons" | ||||||
|  |                     }, | ||||||
|                     "20": { |                     "20": { | ||||||
|                         "question": "Recycling von Druckerpatronen" |                         "question": "Recycling von Druckerpatronen" | ||||||
|                     }, |                     }, | ||||||
|                     "21": { |                     "21": { | ||||||
|                         "question": "Recycling von Fahrrädern" |                         "question": "Recycling von Fahrrädern" | ||||||
|  |                     }, | ||||||
|  |                     "3": { | ||||||
|  |                         "question": "Recycling von Dosen" | ||||||
|  |                     }, | ||||||
|  |                     "4": { | ||||||
|  |                         "question": "Recycling von Kleidung" | ||||||
|  |                     }, | ||||||
|  |                     "5": { | ||||||
|  |                         "question": "Recycling von Speiseöl" | ||||||
|  |                     }, | ||||||
|  |                     "6": { | ||||||
|  |                         "question": "Recycling von Motoröl" | ||||||
|  |                     }, | ||||||
|  |                     "7": { | ||||||
|  |                         "question": "Recycling von Leuchtstoffröhren" | ||||||
|  |                     }, | ||||||
|  |                     "8": { | ||||||
|  |                         "question": "Recycling von Grünabfällen" | ||||||
|  |                     }, | ||||||
|  |                     "9": { | ||||||
|  |                         "question": "Recycling von Glasflaschen" | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|             }, |             }, | ||||||
|  | @ -7755,30 +7844,6 @@ | ||||||
|                     "1": { |                     "1": { | ||||||
|                         "then": "Getränkekartons können hier recycelt werden" |                         "then": "Getränkekartons können hier recycelt werden" | ||||||
|                     }, |                     }, | ||||||
|                     "2": { |  | ||||||
|                         "then": "Dosen können hier recycelt werden" |  | ||||||
|                     }, |  | ||||||
|                     "3": { |  | ||||||
|                         "then": "Kleidung kann hier recycelt werden" |  | ||||||
|                     }, |  | ||||||
|                     "4": { |  | ||||||
|                         "then": "Speiseöl kann hier recycelt werden" |  | ||||||
|                     }, |  | ||||||
|                     "5": { |  | ||||||
|                         "then": "Motoröl kann hier recycelt werden" |  | ||||||
|                     }, |  | ||||||
|                     "6": { |  | ||||||
|                         "then": "Hier können Leuchtstoffröhren recycelt werden" |  | ||||||
|                     }, |  | ||||||
|                     "7": { |  | ||||||
|                         "then": "Grünabfälle können hier recycelt werden" |  | ||||||
|                     }, |  | ||||||
|                     "8": { |  | ||||||
|                         "then": "Bio-Abfall kann hier recycelt werden" |  | ||||||
|                     }, |  | ||||||
|                     "9": { |  | ||||||
|                         "then": "Glasflaschen können hier recycelt werden" |  | ||||||
|                     }, |  | ||||||
|                     "10": { |                     "10": { | ||||||
|                         "then": "Glas kann hier recycelt werden" |                         "then": "Glas kann hier recycelt werden" | ||||||
|                     }, |                     }, | ||||||
|  | @ -7809,6 +7874,9 @@ | ||||||
|                     "19": { |                     "19": { | ||||||
|                         "then": "Schuhe können hier recycelt werden" |                         "then": "Schuhe können hier recycelt werden" | ||||||
|                     }, |                     }, | ||||||
|  |                     "2": { | ||||||
|  |                         "then": "Dosen können hier recycelt werden" | ||||||
|  |                     }, | ||||||
|                     "20": { |                     "20": { | ||||||
|                         "then": "Elektrokleingeräte können hier recycelt werden" |                         "then": "Elektrokleingeräte können hier recycelt werden" | ||||||
|                     }, |                     }, | ||||||
|  | @ -7823,6 +7891,27 @@ | ||||||
|                     }, |                     }, | ||||||
|                     "24": { |                     "24": { | ||||||
|                         "then": "Fahrräder können hier recycelt werden" |                         "then": "Fahrräder können hier recycelt werden" | ||||||
|  |                     }, | ||||||
|  |                     "3": { | ||||||
|  |                         "then": "Kleidung kann hier recycelt werden" | ||||||
|  |                     }, | ||||||
|  |                     "4": { | ||||||
|  |                         "then": "Speiseöl kann hier recycelt werden" | ||||||
|  |                     }, | ||||||
|  |                     "5": { | ||||||
|  |                         "then": "Motoröl kann hier recycelt werden" | ||||||
|  |                     }, | ||||||
|  |                     "6": { | ||||||
|  |                         "then": "Hier können Leuchtstoffröhren recycelt werden" | ||||||
|  |                     }, | ||||||
|  |                     "7": { | ||||||
|  |                         "then": "Grünabfälle können hier recycelt werden" | ||||||
|  |                     }, | ||||||
|  |                     "8": { | ||||||
|  |                         "then": "Bio-Abfall kann hier recycelt werden" | ||||||
|  |                     }, | ||||||
|  |                     "9": { | ||||||
|  |                         "then": "Glasflaschen können hier recycelt werden" | ||||||
|                     } |                     } | ||||||
|                 }, |                 }, | ||||||
|                 "question": "Was kann hier recycelt werden?" |                 "question": "Was kann hier recycelt werden?" | ||||||
|  | @ -8626,6 +8715,12 @@ | ||||||
|                     "1": { |                     "1": { | ||||||
|                         "then": "Diese Straßenlaterne verwendet LEDs" |                         "then": "Diese Straßenlaterne verwendet LEDs" | ||||||
|                     }, |                     }, | ||||||
|  |                     "10": { | ||||||
|  |                         "then": "Diese Straßenlaterne verwendet Hochdruck-Natriumdampflampen (orange mit weiß)" | ||||||
|  |                     }, | ||||||
|  |                     "11": { | ||||||
|  |                         "then": "Diese Straßenlaterne wird mit Gas beleuchtet" | ||||||
|  |                     }, | ||||||
|                     "2": { |                     "2": { | ||||||
|                         "then": "Diese Straßenlaterne verwendet Glühlampenlicht" |                         "then": "Diese Straßenlaterne verwendet Glühlampenlicht" | ||||||
|                     }, |                     }, | ||||||
|  | @ -8649,12 +8744,6 @@ | ||||||
|                     }, |                     }, | ||||||
|                     "9": { |                     "9": { | ||||||
|                         "then": "Diese Straßenlaterne verwendet Niederdruck-Natriumdampflampen (einfarbig orange)" |                         "then": "Diese Straßenlaterne verwendet Niederdruck-Natriumdampflampen (einfarbig orange)" | ||||||
|                     }, |  | ||||||
|                     "10": { |  | ||||||
|                         "then": "Diese Straßenlaterne verwendet Hochdruck-Natriumdampflampen (orange mit weiß)" |  | ||||||
|                     }, |  | ||||||
|                     "11": { |  | ||||||
|                         "then": "Diese Straßenlaterne wird mit Gas beleuchtet" |  | ||||||
|                     } |                     } | ||||||
|                 }, |                 }, | ||||||
|                 "question": "Mit welcher Art von Beleuchtung arbeitet diese Straßenlaterne?" |                 "question": "Mit welcher Art von Beleuchtung arbeitet diese Straßenlaterne?" | ||||||
|  | @ -9748,6 +9837,27 @@ | ||||||
|                     "1": { |                     "1": { | ||||||
|                         "question": "Verkauf von Getränken" |                         "question": "Verkauf von Getränken" | ||||||
|                     }, |                     }, | ||||||
|  |                     "10": { | ||||||
|  |                         "question": "Verkauf von Milch" | ||||||
|  |                     }, | ||||||
|  |                     "11": { | ||||||
|  |                         "question": "Verkauf von Brot" | ||||||
|  |                     }, | ||||||
|  |                     "12": { | ||||||
|  |                         "question": "Verkauf von Eiern" | ||||||
|  |                     }, | ||||||
|  |                     "13": { | ||||||
|  |                         "question": "Verkauf von Käse" | ||||||
|  |                     }, | ||||||
|  |                     "14": { | ||||||
|  |                         "question": "Verkauf von Honig" | ||||||
|  |                     }, | ||||||
|  |                     "15": { | ||||||
|  |                         "question": "Verkauf von Kartoffeln" | ||||||
|  |                     }, | ||||||
|  |                     "16": { | ||||||
|  |                         "question": "Verkauf von Blumen" | ||||||
|  |                     }, | ||||||
|                     "2": { |                     "2": { | ||||||
|                         "question": "Verkauf von Süßigkeiten" |                         "question": "Verkauf von Süßigkeiten" | ||||||
|                     }, |                     }, | ||||||
|  | @ -9835,30 +9945,6 @@ | ||||||
|                     "1": { |                     "1": { | ||||||
|                         "then": "Süßigkeiten werden verkauft" |                         "then": "Süßigkeiten werden verkauft" | ||||||
|                     }, |                     }, | ||||||
|                     "2": { |  | ||||||
|                         "then": "Lebensmittel werden verkauft" |  | ||||||
|                     }, |  | ||||||
|                     "3": { |  | ||||||
|                         "then": "Zigaretten werden verkauft" |  | ||||||
|                     }, |  | ||||||
|                     "4": { |  | ||||||
|                         "then": "Kondome werden verkauft" |  | ||||||
|                     }, |  | ||||||
|                     "5": { |  | ||||||
|                         "then": "Kaffee wird verkauft" |  | ||||||
|                     }, |  | ||||||
|                     "6": { |  | ||||||
|                         "then": "Trinkwasser wird verkauft" |  | ||||||
|                     }, |  | ||||||
|                     "7": { |  | ||||||
|                         "then": "Zeitungen werden verkauft" |  | ||||||
|                     }, |  | ||||||
|                     "8": { |  | ||||||
|                         "then": "Fahrradschläuche werden verkauft" |  | ||||||
|                     }, |  | ||||||
|                     "9": { |  | ||||||
|                         "then": "Milch wird verkauft" |  | ||||||
|                     }, |  | ||||||
|                     "10": { |                     "10": { | ||||||
|                         "then": "Brot wird verkauft" |                         "then": "Brot wird verkauft" | ||||||
|                     }, |                     }, | ||||||
|  | @ -9882,6 +9968,30 @@ | ||||||
|                     }, |                     }, | ||||||
|                     "21": { |                     "21": { | ||||||
|                         "then": "Fahrscheine werden verkauft" |                         "then": "Fahrscheine werden verkauft" | ||||||
|  |                     }, | ||||||
|  |                     "2": { | ||||||
|  |                         "then": "Lebensmittel werden verkauft" | ||||||
|  |                     }, | ||||||
|  |                     "3": { | ||||||
|  |                         "then": "Zigaretten werden verkauft" | ||||||
|  |                     }, | ||||||
|  |                     "4": { | ||||||
|  |                         "then": "Kondome werden verkauft" | ||||||
|  |                     }, | ||||||
|  |                     "5": { | ||||||
|  |                         "then": "Kaffee wird verkauft" | ||||||
|  |                     }, | ||||||
|  |                     "6": { | ||||||
|  |                         "then": "Trinkwasser wird verkauft" | ||||||
|  |                     }, | ||||||
|  |                     "7": { | ||||||
|  |                         "then": "Zeitungen werden verkauft" | ||||||
|  |                     }, | ||||||
|  |                     "8": { | ||||||
|  |                         "then": "Fahrradschläuche werden verkauft" | ||||||
|  |                     }, | ||||||
|  |                     "9": { | ||||||
|  |                         "then": "Milch wird verkauft" | ||||||
|                     } |                     } | ||||||
|                 }, |                 }, | ||||||
|                 "question": "Was wird in diesem Automaten verkauft?", |                 "question": "Was wird in diesem Automaten verkauft?", | ||||||
|  |  | ||||||
|  | @ -4193,7 +4193,7 @@ | ||||||
|                         "then": "Aquí se juega al baloncesto" |                         "then": "Aquí se juega al baloncesto" | ||||||
|                     } |                     } | ||||||
|                 }, |                 }, | ||||||
|                 "question": "¿Qué deporte se practica aquí?", |                 "question": "¿Qué deporte se puede practicar aquí?", | ||||||
|                 "render": "Aquí se juega al {sport}" |                 "render": "Aquí se juega al {sport}" | ||||||
|             }, |             }, | ||||||
|             "sport_pitch-surface": { |             "sport_pitch-surface": { | ||||||
|  |  | ||||||
|  | @ -775,6 +775,9 @@ | ||||||
|                     }, |                     }, | ||||||
|                     "6": { |                     "6": { | ||||||
|                         "then": "Keranjang sampah untuk plastik" |                         "then": "Keranjang sampah untuk plastik" | ||||||
|  |                     }, | ||||||
|  |                     "7": { | ||||||
|  |                         "then": "Keranjang sampah untuk kertas" | ||||||
|                     } |                     } | ||||||
|                 }, |                 }, | ||||||
|                 "question": "Keranjang sampah macam apa ini?" |                 "question": "Keranjang sampah macam apa ini?" | ||||||
|  |  | ||||||
|  | @ -2731,6 +2731,9 @@ | ||||||
|                     }, |                     }, | ||||||
|                     "6": { |                     "6": { | ||||||
|                         "then": "Un cestino rifiuti per la plastica" |                         "then": "Un cestino rifiuti per la plastica" | ||||||
|  |                     }, | ||||||
|  |                     "7": { | ||||||
|  |                         "then": "Un cestino rifiuti per la carta" | ||||||
|                     } |                     } | ||||||
|                 }, |                 }, | ||||||
|                 "question": "Che tipo di cestino dei rifiuti è questo?" |                 "question": "Che tipo di cestino dei rifiuti è questo?" | ||||||
|  |  | ||||||
|  | @ -55,10 +55,14 @@ export class NewGeometryFromChangesFeatureSource implements WritableFeatureSourc | ||||||
|      * @private |      * @private | ||||||
|      */ |      */ | ||||||
|     private handleChange(change: ChangeDescription): boolean { |     private handleChange(change: ChangeDescription): boolean { | ||||||
|         const backend = this._backend |         if (change.changes === undefined) { | ||||||
|         const allElementStorage = this._allElementStorage |             // The geometry is not described - not a new point or geometry change, but probably a tagchange to a newly created point
 | ||||||
|  |             // Not something that should be handled here
 | ||||||
|  |             return false | ||||||
|  |         } | ||||||
| 
 | 
 | ||||||
|         console.log("Handling pending change") |         const allElementStorage = this._allElementStorage | ||||||
|  |         console.log("Handling pending change", change) | ||||||
|         if (change.id > 0) { |         if (change.id > 0) { | ||||||
|             // This is an already existing object
 |             // This is an already existing object
 | ||||||
|             // In _most_ of the cases, this means that this _isn't_ a new object
 |             // In _most_ of the cases, this means that this _isn't_ a new object
 | ||||||
|  | @ -86,10 +90,6 @@ export class NewGeometryFromChangesFeatureSource implements WritableFeatureSourc | ||||||
|             this._featureProperties.trackFeature(feature) |             this._featureProperties.trackFeature(feature) | ||||||
|             this.addNewFeature(feature) |             this.addNewFeature(feature) | ||||||
|             return true |             return true | ||||||
|         } else if (change.changes === undefined) { |  | ||||||
|             // The geometry is not described - not a new point or geometry change, but probably a tagchange to a newly created point
 |  | ||||||
|             // Not something that should be handled here
 |  | ||||||
|             return false |  | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         try { |         try { | ||||||
|  | @ -151,7 +151,7 @@ export class NewGeometryFromChangesFeatureSource implements WritableFeatureSourc | ||||||
|                 continue |                 continue | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|             somethingChanged ||= this.handleChange(change) |             somethingChanged = this.handleChange(change) || somethingChanged // important: _first_ evaluate the method, to avoid shortcutting
 | ||||||
|         } |         } | ||||||
|         if (somethingChanged) { |         if (somethingChanged) { | ||||||
|             this.features.ping() |             this.features.ping() | ||||||
|  |  | ||||||
|  | @ -525,11 +525,14 @@ export class Changes { | ||||||
|                     pending = pending.map((ch) => ChangeDescriptionTools.rewriteIds(ch, remappings)) |                     pending = pending.map((ch) => ChangeDescriptionTools.rewriteIds(ch, remappings)) | ||||||
|                     console.log("Result is", pending) |                     console.log("Result is", pending) | ||||||
|                 } |                 } | ||||||
|  | 
 | ||||||
|                 const changes: { |                 const changes: { | ||||||
|                     newObjects: OsmObject[] |                     newObjects: OsmObject[] | ||||||
|                     modifiedObjects: OsmObject[] |                     modifiedObjects: OsmObject[] | ||||||
|                     deletedObjects: OsmObject[] |                     deletedObjects: OsmObject[] | ||||||
|                 } = self.CreateChangesetObjects(pending, objects) |                 } = self.CreateChangesetObjects(pending, objects) | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|                 return Changes.createChangesetFor("" + csId, changes) |                 return Changes.createChangesetFor("" + csId, changes) | ||||||
|             }, |             }, | ||||||
|             metatags, |             metatags, | ||||||
|  | @ -558,19 +561,8 @@ export class Changes { | ||||||
|             const successes = await Promise.all( |             const successes = await Promise.all( | ||||||
|                 Array.from(pendingPerTheme, async ([theme, pendingChanges]) => { |                 Array.from(pendingPerTheme, async ([theme, pendingChanges]) => { | ||||||
|                     try { |                     try { | ||||||
|                         const openChangeset = this.state.osmConnection |                         const openChangeset = UIEventSource.asInt(this.state.osmConnection | ||||||
|                             .GetPreference("current-open-changeset-" + theme) |                             .GetPreference("current-open-changeset-" + theme)) | ||||||
|                             .sync( |  | ||||||
|                                 (str) => { |  | ||||||
|                                     const n = Number(str) |  | ||||||
|                                     if (isNaN(n)) { |  | ||||||
|                                         return undefined |  | ||||||
|                                     } |  | ||||||
|                                     return n |  | ||||||
|                                 }, |  | ||||||
|                                 [], |  | ||||||
|                                 (n) => "" + n |  | ||||||
|                             ) |  | ||||||
|                         console.log( |                         console.log( | ||||||
|                             "Using current-open-changeset-" + |                             "Using current-open-changeset-" + | ||||||
|                                 theme + |                                 theme + | ||||||
|  |  | ||||||
|  | @ -1,9 +1,14 @@ | ||||||
| import { UIEventSource } from "../UIEventSource" | import { UIEventSource } from "../UIEventSource" | ||||||
| import UserDetails, { OsmConnection } from "./OsmConnection" | import UserDetails, { OsmConnection } from "./OsmConnection" | ||||||
| import { Utils } from "../../Utils" | import { Utils } from "../../Utils" | ||||||
|  | import { LocalStorageSource } from "../Web/LocalStorageSource"; | ||||||
| 
 | 
 | ||||||
| export class OsmPreferences { | export class OsmPreferences { | ||||||
|     public preferences = new UIEventSource<Record<string, string>>({}, "all-osm-preferences") |     /** | ||||||
|  |      * A dictionary containing all the preferences. The 'preferenceSources' will be initialized from this | ||||||
|  |      * We keep a local copy of them, to init mapcomplete with the previous choices and to be able to get the open changesets right away | ||||||
|  |      */ | ||||||
|  |     public preferences = LocalStorageSource.GetParsed<Record<string, string>>( "all-osm-preferences", {}) | ||||||
|     private readonly preferenceSources = new Map<string, UIEventSource<string>>() |     private readonly preferenceSources = new Map<string, UIEventSource<string>>() | ||||||
|     private auth: any |     private auth: any | ||||||
|     private userDetails: UIEventSource<UserDetails> |     private userDetails: UIEventSource<UserDetails> | ||||||
|  |  | ||||||
|  | @ -165,7 +165,7 @@ export default class FeatureSwitchState extends OsmConnectionFeatureSwitches { | ||||||
|             (urls) => urls?.join(",") |             (urls) => urls?.join(",") | ||||||
|         ) |         ) | ||||||
| 
 | 
 | ||||||
|         this.overpassTimeout = UIEventSource.asFloat( |         this.overpassTimeout = UIEventSource.asInt( | ||||||
|             QueryParameters.GetQueryParameter( |             QueryParameters.GetQueryParameter( | ||||||
|                 "overpassTimeout", |                 "overpassTimeout", | ||||||
|                 "" + layoutToUse?.overpassTimeout, |                 "" + layoutToUse?.overpassTimeout, | ||||||
|  | @ -181,7 +181,7 @@ export default class FeatureSwitchState extends OsmConnectionFeatureSwitches { | ||||||
|             ) |             ) | ||||||
|         ) |         ) | ||||||
| 
 | 
 | ||||||
|         this.osmApiTileSize = UIEventSource.asFloat( |         this.osmApiTileSize = UIEventSource.asInt( | ||||||
|             QueryParameters.GetQueryParameter( |             QueryParameters.GetQueryParameter( | ||||||
|                 "osmApiTileSize", |                 "osmApiTileSize", | ||||||
|                 "" + layoutToUse?.osmApiTileSize, |                 "" + layoutToUse?.osmApiTileSize, | ||||||
|  |  | ||||||
|  | @ -1,28 +1,28 @@ | ||||||
| import { Utils } from "../Utils" | import { Utils } from "../Utils"; | ||||||
| import { Readable, Subscriber, Unsubscriber, Updater, Writable } from "svelte/store" | import { Readable, Subscriber, Unsubscriber, Updater, Writable } from "svelte/store"; | ||||||
| 
 | 
 | ||||||
| /** | /** | ||||||
|  * Various static utils |  * Various static utils | ||||||
|  */ |  */ | ||||||
| export class Stores { | export class Stores { | ||||||
|     public static Chronic(millis: number, asLong: () => boolean = undefined): Store<Date> { |     public static Chronic(millis: number, asLong: () => boolean = undefined): Store<Date> { | ||||||
|         const source = new UIEventSource<Date>(undefined) |         const source = new UIEventSource<Date>(undefined); | ||||||
| 
 | 
 | ||||||
|         function run() { |         function run() { | ||||||
|             source.setData(new Date()) |             source.setData(new Date()); | ||||||
|             if (asLong === undefined || asLong()) { |             if (asLong === undefined || asLong()) { | ||||||
|                 window.setTimeout(run, millis) |                 window.setTimeout(run, millis); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         run() |         run(); | ||||||
|         return source |         return source; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     public static FromPromiseWithErr<T>( |     public static FromPromiseWithErr<T>( | ||||||
|         promise: Promise<T> |         promise: Promise<T> | ||||||
|     ): Store<{ success: T } | { error: any }> { |     ): Store<{ success: T } | { error: any }> { | ||||||
|         return UIEventSource.FromPromiseWithErr(promise) |         return UIEventSource.FromPromiseWithErr(promise); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
|  | @ -32,14 +32,14 @@ export class Stores { | ||||||
|      * @constructor |      * @constructor | ||||||
|      */ |      */ | ||||||
|     public static FromPromise<T>(promise: Promise<T>): Store<T> { |     public static FromPromise<T>(promise: Promise<T>): Store<T> { | ||||||
|         const src = new UIEventSource<T>(undefined) |         const src = new UIEventSource<T>(undefined); | ||||||
|         promise?.then((d) => src.setData(d)) |         promise?.then((d) => src.setData(d)); | ||||||
|         promise?.catch((err) => console.warn("Promise failed:", err)) |         promise?.catch((err) => console.warn("Promise failed:", err)); | ||||||
|         return src |         return src; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     public static flatten<X>(source: Store<Store<X>>, possibleSources?: Store<any>[]): Store<X> { |     public static flatten<X>(source: Store<Store<X>>, possibleSources?: Store<any>[]): Store<X> { | ||||||
|         return UIEventSource.flatten(source, possibleSources) |         return UIEventSource.flatten(source, possibleSources); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
|  | @ -57,39 +57,39 @@ export class Stores { | ||||||
|      * @constructor |      * @constructor | ||||||
|      */ |      */ | ||||||
|     public static ListStabilized<T>(src: Store<T[]>): Store<T[]> { |     public static ListStabilized<T>(src: Store<T[]>): Store<T[]> { | ||||||
|         const stable = new UIEventSource<T[]>(undefined) |         const stable = new UIEventSource<T[]>(undefined); | ||||||
|         src.addCallbackAndRun((list) => { |         src.addCallbackAndRun((list) => { | ||||||
|             if (list === undefined) { |             if (list === undefined) { | ||||||
|                 stable.setData(undefined) |                 stable.setData(undefined); | ||||||
|                 return |                 return; | ||||||
|             } |             } | ||||||
|             if (Utils.sameList(stable.data, list)) { |             if (Utils.sameList(stable.data, list)) { | ||||||
|                 return |                 return; | ||||||
|             } |             } | ||||||
|             stable.setData(list) |             stable.setData(list); | ||||||
|         }) |         }); | ||||||
|         return stable |         return stable; | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| export abstract class Store<T> implements Readable<T> { | export abstract class Store<T> implements Readable<T> { | ||||||
|     abstract readonly data: T |     abstract readonly data: T; | ||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
|      * Optional value giving a title to the UIEventSource, mainly used for debugging |      * Optional value giving a title to the UIEventSource, mainly used for debugging | ||||||
|      */ |      */ | ||||||
|     public readonly tag: string | undefined |     public readonly tag: string | undefined; | ||||||
| 
 | 
 | ||||||
|     constructor(tag: string = undefined) { |     constructor(tag: string = undefined) { | ||||||
|         this.tag = tag |         this.tag = tag; | ||||||
|         if (tag === undefined || tag === "") { |         if (tag === undefined || tag === "") { | ||||||
|             let createStack = Utils.runningFromConsole |             let createStack = Utils.runningFromConsole; | ||||||
|             if (!Utils.runningFromConsole) { |             if (!Utils.runningFromConsole) { | ||||||
|                 createStack = window.location.hostname === "127.0.0.1" |                 createStack = window.location.hostname === "127.0.0.1"; | ||||||
|             } |             } | ||||||
|             if (createStack) { |             if (createStack) { | ||||||
|                 const callstack = new Error().stack.split("\n") |                 const callstack = new Error().stack.split("\n"); | ||||||
|                 this.tag = callstack[1] |                 this.tag = callstack[1]; | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
|  | @ -100,13 +100,13 @@ export abstract class Store<T> implements Readable<T> { | ||||||
|     public mapD<J>(f: (t: T) => J, extraStoresToWatch?: Store<any>[]): Store<J> { |     public mapD<J>(f: (t: T) => J, extraStoresToWatch?: Store<any>[]): Store<J> { | ||||||
|         return this.map((t) => { |         return this.map((t) => { | ||||||
|             if (t === undefined) { |             if (t === undefined) { | ||||||
|                 return undefined |                 return undefined; | ||||||
|             } |             } | ||||||
|             if (t === null) { |             if (t === null) { | ||||||
|                 return null |                 return null; | ||||||
|             } |             } | ||||||
|             return f(t) |             return f(t); | ||||||
|         }, extraStoresToWatch) |         }, extraStoresToWatch); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
|  | @ -135,17 +135,17 @@ export abstract class Store<T> implements Readable<T> { | ||||||
|     public withEqualityStabilized( |     public withEqualityStabilized( | ||||||
|         comparator: (t: T | undefined, t1: T | undefined) => boolean |         comparator: (t: T | undefined, t1: T | undefined) => boolean | ||||||
|     ): Store<T> { |     ): Store<T> { | ||||||
|         let oldValue = undefined |         let oldValue = undefined; | ||||||
|         return this.map((v) => { |         return this.map((v) => { | ||||||
|             if (v == oldValue) { |             if (v == oldValue) { | ||||||
|                 return oldValue |                 return oldValue; | ||||||
|             } |             } | ||||||
|             if (comparator(oldValue, v)) { |             if (comparator(oldValue, v)) { | ||||||
|                 return oldValue |                 return oldValue; | ||||||
|             } |             } | ||||||
|             oldValue = v |             oldValue = v; | ||||||
|             return v |             return v; | ||||||
|         }) |         }); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
|  | @ -195,49 +195,49 @@ export abstract class Store<T> implements Readable<T> { | ||||||
|      * lastValue // => "def"
 |      * lastValue // => "def"
 | ||||||
|      */ |      */ | ||||||
|     public bind<X>(f: (t: T) => Store<X>): Store<X> { |     public bind<X>(f: (t: T) => Store<X>): Store<X> { | ||||||
|         const mapped = this.map(f) |         const mapped = this.map(f); | ||||||
|         const sink = new UIEventSource<X>(undefined) |         const sink = new UIEventSource<X>(undefined); | ||||||
|         const seenEventSources = new Set<Store<X>>() |         const seenEventSources = new Set<Store<X>>(); | ||||||
|         mapped.addCallbackAndRun((newEventSource) => { |         mapped.addCallbackAndRun((newEventSource) => { | ||||||
|             if (newEventSource === null) { |             if (newEventSource === null) { | ||||||
|                 sink.setData(null) |                 sink.setData(null); | ||||||
|             } else if (newEventSource === undefined) { |             } else if (newEventSource === undefined) { | ||||||
|                 sink.setData(undefined) |                 sink.setData(undefined); | ||||||
|             } else if (!seenEventSources.has(newEventSource)) { |             } else if (!seenEventSources.has(newEventSource)) { | ||||||
|                 seenEventSources.add(newEventSource) |                 seenEventSources.add(newEventSource); | ||||||
|                 newEventSource.addCallbackAndRun((resultData) => { |                 newEventSource.addCallbackAndRun((resultData) => { | ||||||
|                     if (mapped.data === newEventSource) { |                     if (mapped.data === newEventSource) { | ||||||
|                         sink.setData(resultData) |                         sink.setData(resultData); | ||||||
|                     } |                     } | ||||||
|                 }) |                 }); | ||||||
|             } else { |             } else { | ||||||
|                 // Already seen, so we don't have to add a callback, just update the value
 |                 // Already seen, so we don't have to add a callback, just update the value
 | ||||||
|                 sink.setData(newEventSource.data) |                 sink.setData(newEventSource.data); | ||||||
|             } |             } | ||||||
|         }) |         }); | ||||||
| 
 | 
 | ||||||
|         return sink |         return sink; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     public stabilized(millisToStabilize): Store<T> { |     public stabilized(millisToStabilize): Store<T> { | ||||||
|         if (Utils.runningFromConsole) { |         if (Utils.runningFromConsole) { | ||||||
|             return this |             return this; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         const newSource = new UIEventSource<T>(this.data) |         const newSource = new UIEventSource<T>(this.data); | ||||||
| 
 | 
 | ||||||
|         const self = this |         const self = this; | ||||||
|         this.addCallback((latestData) => { |         this.addCallback((latestData) => { | ||||||
|             window.setTimeout(() => { |             window.setTimeout(() => { | ||||||
|                 if (self.data == latestData) { |                 if (self.data == latestData) { | ||||||
|                     // compare by reference.
 |                     // compare by reference.
 | ||||||
|                     // Note that 'latestData' and 'self.data' are both from the same UIEVentSource, but both are dereferenced at a different time
 |                     // Note that 'latestData' and 'self.data' are both from the same UIEVentSource, but both are dereferenced at a different time
 | ||||||
|                     newSource.setData(latestData) |                     newSource.setData(latestData); | ||||||
|                 } |                 } | ||||||
|             }, millisToStabilize) |             }, millisToStabilize); | ||||||
|         }) |         }); | ||||||
| 
 | 
 | ||||||
|         return newSource |         return newSource; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
|  | @ -247,23 +247,23 @@ export abstract class Store<T> implements Readable<T> { | ||||||
|      * @constructor |      * @constructor | ||||||
|      */ |      */ | ||||||
|     public AsPromise(condition?: (t: T) => boolean): Promise<T> { |     public AsPromise(condition?: (t: T) => boolean): Promise<T> { | ||||||
|         const self = this |         const self = this; | ||||||
|         condition = condition ?? ((t) => t !== undefined) |         condition = condition ?? ((t) => t !== undefined); | ||||||
|         return new Promise((resolve) => { |         return new Promise((resolve) => { | ||||||
|             const data = self.data |             const data = self.data; | ||||||
|             if (condition(data)) { |             if (condition(data)) { | ||||||
|                 resolve(data) |                 resolve(data); | ||||||
|             } else { |             } else { | ||||||
|                 self.addCallbackD((data) => { |                 self.addCallbackD((data) => { | ||||||
|                     if (condition(data)) { |                     if (condition(data)) { | ||||||
|                         resolve(data) |                         resolve(data); | ||||||
|                         return true // return true to unregister as we only need to be called once
 |                         return true; // return true to unregister as we only need to be called once
 | ||||||
|                     } else { |                     } else { | ||||||
|                         return false // We didn't resolve yet, wait for the next ping
 |                         return false; // We didn't resolve yet, wait for the next ping
 | ||||||
|                     } |                     } | ||||||
|                 }) |                 }); | ||||||
|             } |             } | ||||||
|         }) |         }); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
|  | @ -275,50 +275,51 @@ export abstract class Store<T> implements Readable<T> { | ||||||
| 
 | 
 | ||||||
|         // Note: run is wrapped in an anonymous function. 'Run' returns the value. If this value happens to be true, it would unsubscribe
 |         // Note: run is wrapped in an anonymous function. 'Run' returns the value. If this value happens to be true, it would unsubscribe
 | ||||||
|         return this.addCallbackAndRun((v) => { |         return this.addCallbackAndRun((v) => { | ||||||
|             run(v) |             run(v); | ||||||
|         }) |         }); | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| export class ImmutableStore<T> extends Store<T> { | export class ImmutableStore<T> extends Store<T> { | ||||||
|     public readonly data: T |     public readonly data: T; | ||||||
| 
 | 
 | ||||||
|     constructor(data: T) { |     constructor(data: T) { | ||||||
|         super() |         super(); | ||||||
|         this.data = data |         this.data = data; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     private static readonly pass: () => void = () => {} |     private static readonly pass: () => void = () => { | ||||||
|  |     }; | ||||||
| 
 | 
 | ||||||
|     addCallback(_: (data: T) => void): () => void { |     addCallback(_: (data: T) => void): () => void { | ||||||
|         // pass: data will never change
 |         // pass: data will never change
 | ||||||
|         return ImmutableStore.pass |         return ImmutableStore.pass; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     addCallbackAndRun(callback: (data: T) => void): () => void { |     addCallbackAndRun(callback: (data: T) => void): () => void { | ||||||
|         callback(this.data) |         callback(this.data); | ||||||
|         // no callback registry: data will never change
 |         // no callback registry: data will never change
 | ||||||
|         return ImmutableStore.pass |         return ImmutableStore.pass; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     addCallbackAndRunD(callback: (data: T) => void): () => void { |     addCallbackAndRunD(callback: (data: T) => void): () => void { | ||||||
|         if (this.data !== undefined) { |         if (this.data !== undefined) { | ||||||
|             callback(this.data) |             callback(this.data); | ||||||
|         } |         } | ||||||
|         // no callback registry: data will never change
 |         // no callback registry: data will never change
 | ||||||
|         return ImmutableStore.pass |         return ImmutableStore.pass; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     addCallbackD(_: (data: T) => void): () => void { |     addCallbackD(_: (data: T) => void): () => void { | ||||||
|         // pass: data will never change
 |         // pass: data will never change
 | ||||||
|         return ImmutableStore.pass |         return ImmutableStore.pass; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     map<J>(f: (t: T) => J, extraStores: Store<any>[] = undefined): ImmutableStore<J> { |     map<J>(f: (t: T) => J, extraStores: Store<any>[] = undefined): ImmutableStore<J> { | ||||||
|         if (extraStores?.length > 0) { |         if (extraStores?.length > 0) { | ||||||
|             return new MappedStore(this, f, extraStores, undefined, f(this.data)) |             return new MappedStore(this, f, extraStores, undefined, f(this.data)); | ||||||
|         } |         } | ||||||
|         return new ImmutableStore<J>(f(this.data)) |         return new ImmutableStore<J>(f(this.data)); | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -326,8 +327,8 @@ export class ImmutableStore<T> extends Store<T> { | ||||||
|  * Keeps track of the callback functions |  * Keeps track of the callback functions | ||||||
|  */ |  */ | ||||||
| class ListenerTracker<T> { | class ListenerTracker<T> { | ||||||
|     public pingCount = 0 |     public pingCount = 0; | ||||||
|     private readonly _callbacks: ((t: T) => boolean | void | any)[] = [] |     private readonly _callbacks: ((t: T) => boolean | void | any)[] = []; | ||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
|      * Adds a callback which can be called; a function to unregister is returned |      * Adds a callback which can be called; a function to unregister is returned | ||||||
|  | @ -335,17 +336,17 @@ class ListenerTracker<T> { | ||||||
|     public addCallback(callback: (t: T) => boolean | void | any): () => void { |     public addCallback(callback: (t: T) => boolean | void | any): () => void { | ||||||
|         if (callback === console.log) { |         if (callback === console.log) { | ||||||
|             // This ^^^ actually works!
 |             // This ^^^ actually works!
 | ||||||
|             throw "Don't add console.log directly as a callback - you'll won't be able to find it afterwards. Wrap it in a lambda instead." |             throw "Don't add console.log directly as a callback - you'll won't be able to find it afterwards. Wrap it in a lambda instead."; | ||||||
|         } |         } | ||||||
|         this._callbacks.push(callback) |         this._callbacks.push(callback); | ||||||
| 
 | 
 | ||||||
|         // Give back an unregister-function!
 |         // Give back an unregister-function!
 | ||||||
|         return () => { |         return () => { | ||||||
|             const index = this._callbacks.indexOf(callback) |             const index = this._callbacks.indexOf(callback); | ||||||
|             if (index >= 0) { |             if (index >= 0) { | ||||||
|                 this._callbacks.splice(index, 1) |                 this._callbacks.splice(index, 1); | ||||||
|             } |             } | ||||||
|         } |         }; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
|  | @ -353,40 +354,40 @@ class ListenerTracker<T> { | ||||||
|      * Returns the number of registered callbacks |      * Returns the number of registered callbacks | ||||||
|      */ |      */ | ||||||
|     public ping(data: T): number { |     public ping(data: T): number { | ||||||
|         this.pingCount++ |         this.pingCount++; | ||||||
|         let toDelete = undefined |         let toDelete = undefined; | ||||||
|         let startTime = new Date().getTime() / 1000 |         let startTime = new Date().getTime() / 1000; | ||||||
|         for (const callback of this._callbacks) { |         for (const callback of this._callbacks) { | ||||||
|             try { |             try { | ||||||
|                 if (callback(data) === true) { |                 if (callback(data) === true) { | ||||||
|                     // This callback wants to be deleted
 |                     // This callback wants to be deleted
 | ||||||
|                     // Note: it has to return precisely true in order to avoid accidental deletions
 |                     // Note: it has to return precisely true in order to avoid accidental deletions
 | ||||||
|                     if (toDelete === undefined) { |                     if (toDelete === undefined) { | ||||||
|                         toDelete = [callback] |                         toDelete = [callback]; | ||||||
|                     } else { |                     } else { | ||||||
|                         toDelete.push(callback) |                         toDelete.push(callback); | ||||||
|                     } |                     } | ||||||
|                 } |                 } | ||||||
|             } catch (e) { |             } catch (e) { | ||||||
|                 console.error("Got an error while running a callback:", e) |                 console.error("Got an error while running a callback:", e); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|         let endTime = new Date().getTime() / 1000 |         let endTime = new Date().getTime() / 1000; | ||||||
|         if (endTime - startTime > 500) { |         if (endTime - startTime > 500) { | ||||||
|             console.trace( |             console.trace( | ||||||
|                 "Warning: a ping took more then 500ms; this is probably a performance issue" |                 "Warning: a ping took more then 500ms; this is probably a performance issue" | ||||||
|             ) |             ); | ||||||
|         } |         } | ||||||
|         if (toDelete !== undefined) { |         if (toDelete !== undefined) { | ||||||
|             for (const toDeleteElement of toDelete) { |             for (const toDeleteElement of toDelete) { | ||||||
|                 this._callbacks.splice(this._callbacks.indexOf(toDeleteElement), 1) |                 this._callbacks.splice(this._callbacks.indexOf(toDeleteElement), 1); | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|         return this._callbacks.length |         return this._callbacks.length; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     length() { |     length() { | ||||||
|         return this._callbacks.length |         return this._callbacks.length; | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | @ -394,16 +395,16 @@ class ListenerTracker<T> { | ||||||
|  * The mapped store is a helper type which does the mapping of a function. |  * The mapped store is a helper type which does the mapping of a function. | ||||||
|  */ |  */ | ||||||
| class MappedStore<TIn, T> extends Store<T> { | class MappedStore<TIn, T> extends Store<T> { | ||||||
|     private static readonly pass: () => {} |     private static readonly pass: () => {}; | ||||||
|     private readonly _upstream: Store<TIn> |     private readonly _upstream: Store<TIn>; | ||||||
|     private readonly _upstreamCallbackHandler: ListenerTracker<TIn> | undefined |     private readonly _upstreamCallbackHandler: ListenerTracker<TIn> | undefined; | ||||||
|     private _upstreamPingCount: number = -1 |     private _upstreamPingCount: number = -1; | ||||||
|     private _unregisterFromUpstream: () => void |     private _unregisterFromUpstream: () => void; | ||||||
|     private readonly _f: (t: TIn) => T |     private readonly _f: (t: TIn) => T; | ||||||
|     private readonly _extraStores: Store<any>[] | undefined |     private readonly _extraStores: Store<any>[] | undefined; | ||||||
|     private _unregisterFromExtraStores: (() => void)[] | undefined |     private _unregisterFromExtraStores: (() => void)[] | undefined; | ||||||
|     private _callbacks: ListenerTracker<T> = new ListenerTracker<T>() |     private _callbacks: ListenerTracker<T> = new ListenerTracker<T>(); | ||||||
|     private _callbacksAreRegistered = false |     private _callbacksAreRegistered = false; | ||||||
| 
 | 
 | ||||||
|     constructor( |     constructor( | ||||||
|         upstream: Store<TIn>, |         upstream: Store<TIn>, | ||||||
|  | @ -413,20 +414,20 @@ class MappedStore<TIn, T> extends Store<T> { | ||||||
|         initialState: T, |         initialState: T, | ||||||
|         onDestroy?: (f: () => void) => void |         onDestroy?: (f: () => void) => void | ||||||
|     ) { |     ) { | ||||||
|         super() |         super(); | ||||||
|         this._upstream = upstream |         this._upstream = upstream; | ||||||
|         this._upstreamCallbackHandler = upstreamListenerHandler |         this._upstreamCallbackHandler = upstreamListenerHandler; | ||||||
|         this._f = f |         this._f = f; | ||||||
|         this._data = initialState |         this._data = initialState; | ||||||
|         this._upstreamPingCount = upstreamListenerHandler?.pingCount |         this._upstreamPingCount = upstreamListenerHandler?.pingCount; | ||||||
|         this._extraStores = extraStores |         this._extraStores = extraStores; | ||||||
|         this.registerCallbacksToUpstream() |         this.registerCallbacksToUpstream(); | ||||||
|         if (onDestroy !== undefined) { |         if (onDestroy !== undefined) { | ||||||
|             onDestroy(() => this.unregisterFromUpstream()) |             onDestroy(() => this.unregisterFromUpstream()); | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     private _data: T |     private _data: T; | ||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
|      * Gets the current data from the store |      * Gets the current data from the store | ||||||
|  | @ -442,27 +443,27 @@ class MappedStore<TIn, T> extends Store<T> { | ||||||
|             // Callbacks are not registered, so we haven't been listening for updates from the upstream which might have changed
 |             // Callbacks are not registered, so we haven't been listening for updates from the upstream which might have changed
 | ||||||
|             if (this._upstreamCallbackHandler?.pingCount != this._upstreamPingCount) { |             if (this._upstreamCallbackHandler?.pingCount != this._upstreamPingCount) { | ||||||
|                 // Upstream has pinged - let's update our data first
 |                 // Upstream has pinged - let's update our data first
 | ||||||
|                 this._data = this._f(this._upstream.data) |                 this._data = this._f(this._upstream.data); | ||||||
|             } |             } | ||||||
|             return this._data |             return this._data; | ||||||
|         } |         } | ||||||
|         return this._data |         return this._data; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     map<J>(f: (t: T) => J, extraStores: Store<any>[] = undefined): Store<J> { |     map<J>(f: (t: T) => J, extraStores: Store<any>[] = undefined): Store<J> { | ||||||
|         let stores: Store<any>[] = undefined |         let stores: Store<any>[] = undefined; | ||||||
|         if (extraStores?.length > 0 || this._extraStores?.length > 0) { |         if (extraStores?.length > 0 || this._extraStores?.length > 0) { | ||||||
|             stores = [] |             stores = []; | ||||||
|         } |         } | ||||||
|         if (extraStores?.length > 0) { |         if (extraStores?.length > 0) { | ||||||
|             stores.push(...extraStores) |             stores.push(...extraStores); | ||||||
|         } |         } | ||||||
|         if (this._extraStores?.length > 0) { |         if (this._extraStores?.length > 0) { | ||||||
|             this._extraStores?.forEach((store) => { |             this._extraStores?.forEach((store) => { | ||||||
|                 if (stores.indexOf(store) < 0) { |                 if (stores.indexOf(store) < 0) { | ||||||
|                     stores.push(store) |                     stores.push(store); | ||||||
|                 } |                 } | ||||||
|             }) |             }); | ||||||
|         } |         } | ||||||
|         return new MappedStore( |         return new MappedStore( | ||||||
|             this, |             this, | ||||||
|  | @ -470,111 +471,111 @@ class MappedStore<TIn, T> extends Store<T> { | ||||||
|             stores, |             stores, | ||||||
|             this._callbacks, |             this._callbacks, | ||||||
|             f(this.data) |             f(this.data) | ||||||
|         ) |         ); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     addCallback(callback: (data: T) => any | boolean | void): () => void { |     addCallback(callback: (data: T) => any | boolean | void): () => void { | ||||||
|         if (!this._callbacksAreRegistered) { |         if (!this._callbacksAreRegistered) { | ||||||
|             // This is the first callback that is added
 |             // This is the first callback that is added
 | ||||||
|             // We register this 'map' to the upstream object and all the streams
 |             // We register this 'map' to the upstream object and all the streams
 | ||||||
|             this.registerCallbacksToUpstream() |             this.registerCallbacksToUpstream(); | ||||||
|         } |         } | ||||||
|         const unregister = this._callbacks.addCallback(callback) |         const unregister = this._callbacks.addCallback(callback); | ||||||
|         return () => { |         return () => { | ||||||
|             unregister() |             unregister(); | ||||||
|             if (this._callbacks.length() == 0) { |             if (this._callbacks.length() == 0) { | ||||||
|                 this.unregisterFromUpstream() |                 this.unregisterFromUpstream(); | ||||||
|             } |             } | ||||||
|         } |         }; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     addCallbackAndRun(callback: (data: T) => any | boolean | void): () => void { |     addCallbackAndRun(callback: (data: T) => any | boolean | void): () => void { | ||||||
|         const unregister = this.addCallback(callback) |         const unregister = this.addCallback(callback); | ||||||
|         const doRemove = callback(this.data) |         const doRemove = callback(this.data); | ||||||
|         if (doRemove === true) { |         if (doRemove === true) { | ||||||
|             unregister() |             unregister(); | ||||||
|             return MappedStore.pass |             return MappedStore.pass; | ||||||
|         } |         } | ||||||
|         return unregister |         return unregister; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     addCallbackAndRunD(callback: (data: T) => any | boolean | void): () => void { |     addCallbackAndRunD(callback: (data: T) => any | boolean | void): () => void { | ||||||
|         return this.addCallbackAndRun((data) => { |         return this.addCallbackAndRun((data) => { | ||||||
|             if (data !== undefined) { |             if (data !== undefined) { | ||||||
|                 return callback(data) |                 return callback(data); | ||||||
|             } |             } | ||||||
|         }) |         }); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     addCallbackD(callback: (data: T) => any | boolean | void): () => void { |     addCallbackD(callback: (data: T) => any | boolean | void): () => void { | ||||||
|         return this.addCallback((data) => { |         return this.addCallback((data) => { | ||||||
|             if (data !== undefined) { |             if (data !== undefined) { | ||||||
|                 return callback(data) |                 return callback(data); | ||||||
|             } |             } | ||||||
|         }) |         }); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     private unregisterFromUpstream() { |     private unregisterFromUpstream() { | ||||||
|         console.debug("Unregistering callbacks for", this.tag) |         console.debug("Unregistering callbacks for", this.tag); | ||||||
|         this._callbacksAreRegistered = false |         this._callbacksAreRegistered = false; | ||||||
|         this._unregisterFromUpstream() |         this._unregisterFromUpstream(); | ||||||
|         this._unregisterFromExtraStores?.forEach((unr) => unr()) |         this._unregisterFromExtraStores?.forEach((unr) => unr()); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     private registerCallbacksToUpstream() { |     private registerCallbacksToUpstream() { | ||||||
|         const self = this |         const self = this; | ||||||
| 
 | 
 | ||||||
|         this._unregisterFromUpstream = this._upstream.addCallback((_) => self.update()) |         this._unregisterFromUpstream = this._upstream.addCallback((_) => self.update()); | ||||||
|         this._unregisterFromExtraStores = this._extraStores?.map((store) => |         this._unregisterFromExtraStores = this._extraStores?.map((store) => | ||||||
|             store?.addCallback((_) => self.update()) |             store?.addCallback((_) => self.update()) | ||||||
|         ) |         ); | ||||||
|         this._callbacksAreRegistered = true |         this._callbacksAreRegistered = true; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     private update(): void { |     private update(): void { | ||||||
|         const newData = this._f(this._upstream.data) |         const newData = this._f(this._upstream.data); | ||||||
|         this._upstreamPingCount = this._upstreamCallbackHandler?.pingCount |         this._upstreamPingCount = this._upstreamCallbackHandler?.pingCount; | ||||||
|         if (this._data == newData) { |         if (this._data == newData) { | ||||||
|             return |             return; | ||||||
|         } |         } | ||||||
|         this._data = newData |         this._data = newData; | ||||||
|         this._callbacks.ping(this._data) |         this._callbacks.ping(this._data); | ||||||
|     } |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| export class UIEventSource<T> extends Store<T> implements Writable<T> { | export class UIEventSource<T> extends Store<T> implements Writable<T> { | ||||||
|     private static readonly pass: () => {} |     private static readonly pass: () => {}; | ||||||
|     public data: T |     public data: T; | ||||||
|     _callbacks: ListenerTracker<T> = new ListenerTracker<T>() |     _callbacks: ListenerTracker<T> = new ListenerTracker<T>(); | ||||||
| 
 | 
 | ||||||
|     constructor(data: T, tag: string = "") { |     constructor(data: T, tag: string = "") { | ||||||
|         super(tag) |         super(tag); | ||||||
|         this.data = data |         this.data = data; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     public static flatten<X>( |     public static flatten<X>( | ||||||
|         source: Store<Store<X>>, |         source: Store<Store<X>>, | ||||||
|         possibleSources?: Store<any>[] |         possibleSources?: Store<any>[] | ||||||
|     ): UIEventSource<X> { |     ): UIEventSource<X> { | ||||||
|         const sink = new UIEventSource<X>(source.data?.data) |         const sink = new UIEventSource<X>(source.data?.data); | ||||||
| 
 | 
 | ||||||
|         source.addCallback((latestData) => { |         source.addCallback((latestData) => { | ||||||
|             sink.setData(latestData?.data) |             sink.setData(latestData?.data); | ||||||
|             latestData.addCallback((data) => { |             latestData.addCallback((data) => { | ||||||
|                 if (source.data !== latestData) { |                 if (source.data !== latestData) { | ||||||
|                     return true |                     return true; | ||||||
|                 } |                 } | ||||||
|                 sink.setData(data) |                 sink.setData(data); | ||||||
|             }) |             }); | ||||||
|         }) |         }); | ||||||
| 
 | 
 | ||||||
|         for (const possibleSource of possibleSources ?? []) { |         for (const possibleSource of possibleSources ?? []) { | ||||||
|             possibleSource?.addCallback(() => { |             possibleSource?.addCallback(() => { | ||||||
|                 sink.setData(source.data?.data) |                 sink.setData(source.data?.data); | ||||||
|             }) |             }); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         return sink |         return sink; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
|  | @ -585,16 +586,16 @@ export class UIEventSource<T> extends Store<T> implements Writable<T> { | ||||||
|         promise: Promise<T>, |         promise: Promise<T>, | ||||||
|         onError: (e: any) => void = undefined |         onError: (e: any) => void = undefined | ||||||
|     ): UIEventSource<T> { |     ): UIEventSource<T> { | ||||||
|         const src = new UIEventSource<T>(undefined) |         const src = new UIEventSource<T>(undefined); | ||||||
|         promise?.then((d) => src.setData(d)) |         promise?.then((d) => src.setData(d)); | ||||||
|         promise?.catch((err) => { |         promise?.catch((err) => { | ||||||
|             if (onError !== undefined) { |             if (onError !== undefined) { | ||||||
|                 onError(err) |                 onError(err); | ||||||
|             } else { |             } else { | ||||||
|                 console.warn("Promise failed:", err) |                 console.warn("Promise failed:", err); | ||||||
|             } |             } | ||||||
|         }) |         }); | ||||||
|         return src |         return src; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
|  | @ -606,26 +607,68 @@ export class UIEventSource<T> extends Store<T> implements Writable<T> { | ||||||
|     public static FromPromiseWithErr<T>( |     public static FromPromiseWithErr<T>( | ||||||
|         promise: Promise<T> |         promise: Promise<T> | ||||||
|     ): UIEventSource<{ success: T } | { error: any }> { |     ): UIEventSource<{ success: T } | { error: any }> { | ||||||
|         const src = new UIEventSource<{ success: T } | { error: any }>(undefined) |         const src = new UIEventSource<{ success: T } | { error: any }>(undefined); | ||||||
|         promise?.then((d) => src.setData({ success: d })) |         promise?.then((d) => src.setData({ success: d })); | ||||||
|         promise?.catch((err) => src.setData({ error: err })) |         promise?.catch((err) => src.setData({ error: err })); | ||||||
|         return src |         return src; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     public static asFloat(source: UIEventSource<string>): UIEventSource<number> { |     /** | ||||||
|  |      * | ||||||
|  |      * @param source | ||||||
|  |      * UIEventSource.asInt(new UIEventSource("123")).data // => 123
 | ||||||
|  |      * UIEventSource.asInt(new UIEventSource("123456789")).data // => 123456789
 | ||||||
|  |      * | ||||||
|  |      * const srcStr = new UIEventSource("123456789")) | ||||||
|  |      * const srcInt = UIEventSource.asInt(srcStr) | ||||||
|  |      * srcInt.setData(987654321) | ||||||
|  |      * srcStr.data // => "987654321"
 | ||||||
|  |      */ | ||||||
|  |     public static asInt(source: UIEventSource<string>): UIEventSource<number> { | ||||||
|         return source.sync( |         return source.sync( | ||||||
|             (str) => { |             (str) => { | ||||||
|                 let parsed = parseFloat(str) |                 let parsed = parseInt(str); | ||||||
|                 return isNaN(parsed) ? undefined : parsed |                 return isNaN(parsed) ? undefined : parsed; | ||||||
|             }, |             }, | ||||||
|             [], |             [], | ||||||
|             (fl) => { |             (fl) => { | ||||||
|                 if (fl === undefined || isNaN(fl)) { |                 if (fl === undefined || isNaN(fl)) { | ||||||
|                     return undefined |                     return undefined; | ||||||
|                 } |                 } | ||||||
|                 return ("" + fl).substr(0, 8) |                 return ("" + fl); | ||||||
|             } |             } | ||||||
|         ) |         ); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * UIEventSource.asFloat(new UIEventSource("123")).data // => 123
 | ||||||
|  |      * UIEventSource.asFloat(new UIEventSource("123456789")).data // => 123456789
 | ||||||
|  |      * UIEventSource.asFloat(new UIEventSource("0.5")).data // => 0.5
 | ||||||
|  |      * UIEventSource.asFloat(new UIEventSource("0.125")).data // => 0.125
 | ||||||
|  |      * UIEventSource.asFloat(new UIEventSource("0.0000000001")).data // => 0.0000000001
 | ||||||
|  |      * | ||||||
|  |      * | ||||||
|  |      * const srcStr = new UIEventSource("123456789")) | ||||||
|  |      * const srcInt = UIEventSource.asFloat(srcStr) | ||||||
|  |      * srcInt.setData(987654321) | ||||||
|  |      * srcStr.data // => "987654321"
 | ||||||
|  |      * @param source | ||||||
|  |      */ | ||||||
|  | 
 | ||||||
|  |     public static asFloat(source: UIEventSource<string>): UIEventSource<number> { | ||||||
|  |         return source.sync( | ||||||
|  |             (str) => { | ||||||
|  |                 let parsed = parseFloat(str); | ||||||
|  |                 return isNaN(parsed) ? undefined : parsed; | ||||||
|  |             }, | ||||||
|  |             [], | ||||||
|  |             (fl) => { | ||||||
|  |                 if (fl === undefined || isNaN(fl)) { | ||||||
|  |                     return undefined; | ||||||
|  |                 } | ||||||
|  |                 return ("" + fl); | ||||||
|  |             } | ||||||
|  |         ); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     static asBoolean(stringUIEventSource: UIEventSource<string>) { |     static asBoolean(stringUIEventSource: UIEventSource<string>) { | ||||||
|  | @ -633,7 +676,7 @@ export class UIEventSource<T> extends Store<T> implements Writable<T> { | ||||||
|             (str) => str === "true", |             (str) => str === "true", | ||||||
|             [], |             [], | ||||||
|             (b) => "" + b |             (b) => "" + b | ||||||
|         ) |         ); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
|  | @ -641,9 +684,9 @@ export class UIEventSource<T> extends Store<T> implements Writable<T> { | ||||||
|      * However, this value can be overriden without affecting source |      * However, this value can be overriden without affecting source | ||||||
|      */ |      */ | ||||||
|     static feedFrom<T>(store: Store<T>): UIEventSource<T> { |     static feedFrom<T>(store: Store<T>): UIEventSource<T> { | ||||||
|         const src = new UIEventSource(store.data) |         const src = new UIEventSource(store.data); | ||||||
|         store.addCallback((t) => src.setData(t)) |         store.addCallback((t) => src.setData(t)); | ||||||
|         return src |         return src; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
|  | @ -653,46 +696,46 @@ export class UIEventSource<T> extends Store<T> implements Writable<T> { | ||||||
|      * @param callback |      * @param callback | ||||||
|      */ |      */ | ||||||
|     public addCallback(callback: (latestData: T) => boolean | void | any): () => void { |     public addCallback(callback: (latestData: T) => boolean | void | any): () => void { | ||||||
|         return this._callbacks.addCallback(callback) |         return this._callbacks.addCallback(callback); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     public addCallbackAndRun(callback: (latestData: T) => boolean | void | any): () => void { |     public addCallbackAndRun(callback: (latestData: T) => boolean | void | any): () => void { | ||||||
|         const doDeleteCallback = callback(this.data) |         const doDeleteCallback = callback(this.data); | ||||||
|         if (doDeleteCallback !== true) { |         if (doDeleteCallback !== true) { | ||||||
|             return this.addCallback(callback) |             return this.addCallback(callback); | ||||||
|         } else { |         } else { | ||||||
|             return UIEventSource.pass |             return UIEventSource.pass; | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     public addCallbackAndRunD(callback: (data: T) => void): () => void { |     public addCallbackAndRunD(callback: (data: T) => void): () => void { | ||||||
|         return this.addCallbackAndRun((data) => { |         return this.addCallbackAndRun((data) => { | ||||||
|             if (data !== undefined && data !== null) { |             if (data !== undefined && data !== null) { | ||||||
|                 return callback(data) |                 return callback(data); | ||||||
|             } |             } | ||||||
|         }) |         }); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     public addCallbackD(callback: (data: T) => void): () => void { |     public addCallbackD(callback: (data: T) => void): () => void { | ||||||
|         return this.addCallback((data) => { |         return this.addCallback((data) => { | ||||||
|             if (data !== undefined && data !== null) { |             if (data !== undefined && data !== null) { | ||||||
|                 return callback(data) |                 return callback(data); | ||||||
|             } |             } | ||||||
|         }) |         }); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     public setData(t: T): UIEventSource<T> { |     public setData(t: T): UIEventSource<T> { | ||||||
|         if (this.data == t) { |         if (this.data == t) { | ||||||
|             // MUST COMPARE BY REFERENCE!
 |             // MUST COMPARE BY REFERENCE!
 | ||||||
|             return |             return; | ||||||
|         } |         } | ||||||
|         this.data = t |         this.data = t; | ||||||
|         this._callbacks.ping(t) |         this._callbacks.ping(t); | ||||||
|         return this |         return this; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     public ping(): void { |     public ping(): void { | ||||||
|         this._callbacks.ping(this.data) |         this._callbacks.ping(this.data); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
|  | @ -724,7 +767,7 @@ export class UIEventSource<T> extends Store<T> implements Writable<T> { | ||||||
|         extraSources: Store<any>[] = [], |         extraSources: Store<any>[] = [], | ||||||
|         onDestroy?: (f: () => void) => void |         onDestroy?: (f: () => void) => void | ||||||
|     ): Store<J> { |     ): Store<J> { | ||||||
|         return new MappedStore(this, f, extraSources, this._callbacks, f(this.data), onDestroy) |         return new MappedStore(this, f, extraSources, this._callbacks, f(this.data), onDestroy); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
|  | @ -736,14 +779,14 @@ export class UIEventSource<T> extends Store<T> implements Writable<T> { | ||||||
|             this, |             this, | ||||||
|             (t) => { |             (t) => { | ||||||
|                 if (t === undefined) { |                 if (t === undefined) { | ||||||
|                     return undefined |                     return undefined; | ||||||
|                 } |                 } | ||||||
|                 return f(t) |                 return f(t); | ||||||
|             }, |             }, | ||||||
|             extraSources, |             extraSources, | ||||||
|             this._callbacks, |             this._callbacks, | ||||||
|             this.data === undefined ? undefined : f(this.data) |             this.data === undefined ? undefined : f(this.data) | ||||||
|         ) |         ); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
|  | @ -760,53 +803,53 @@ export class UIEventSource<T> extends Store<T> implements Writable<T> { | ||||||
|         g: (j: J, t: T) => T, |         g: (j: J, t: T) => T, | ||||||
|         allowUnregister = false |         allowUnregister = false | ||||||
|     ): UIEventSource<J> { |     ): UIEventSource<J> { | ||||||
|         const self = this |         const self = this; | ||||||
| 
 | 
 | ||||||
|         const stack = new Error().stack.split("\n") |         const stack = new Error().stack.split("\n"); | ||||||
|         const callee = stack[1] |         const callee = stack[1]; | ||||||
| 
 | 
 | ||||||
|         const newSource = new UIEventSource<J>(f(this.data), "map(" + this.tag + ")@" + callee) |         const newSource = new UIEventSource<J>(f(this.data), "map(" + this.tag + ")@" + callee); | ||||||
| 
 | 
 | ||||||
|         const update = function () { |         const update = function() { | ||||||
|             newSource.setData(f(self.data)) |             newSource.setData(f(self.data)); | ||||||
|             return allowUnregister && newSource._callbacks.length() === 0 |             return allowUnregister && newSource._callbacks.length() === 0; | ||||||
|         } |         }; | ||||||
| 
 | 
 | ||||||
|         this.addCallback(update) |         this.addCallback(update); | ||||||
|         for (const extraSource of extraSources) { |         for (const extraSource of extraSources) { | ||||||
|             extraSource?.addCallback(update) |             extraSource?.addCallback(update); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         if (g !== undefined) { |         if (g !== undefined) { | ||||||
|             newSource.addCallback((latest) => { |             newSource.addCallback((latest) => { | ||||||
|                 self.setData(g(latest, self.data)) |                 self.setData(g(latest, self.data)); | ||||||
|             }) |             }); | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         return newSource |         return newSource; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     public syncWith(otherSource: UIEventSource<T>, reverseOverride = false): UIEventSource<T> { |     public syncWith(otherSource: UIEventSource<T>, reverseOverride = false): UIEventSource<T> { | ||||||
|         this.addCallback((latest) => otherSource.setData(latest)) |         this.addCallback((latest) => otherSource.setData(latest)); | ||||||
|         const self = this |         const self = this; | ||||||
|         otherSource.addCallback((latest) => self.setData(latest)) |         otherSource.addCallback((latest) => self.setData(latest)); | ||||||
|         if (reverseOverride) { |         if (reverseOverride) { | ||||||
|             if (otherSource.data !== undefined) { |             if (otherSource.data !== undefined) { | ||||||
|                 this.setData(otherSource.data) |                 this.setData(otherSource.data); | ||||||
|             } |             } | ||||||
|         } else if (this.data === undefined) { |         } else if (this.data === undefined) { | ||||||
|             this.setData(otherSource.data) |             this.setData(otherSource.data); | ||||||
|         } else { |         } else { | ||||||
|             otherSource.setData(this.data) |             otherSource.setData(this.data); | ||||||
|         } |         } | ||||||
|         return this |         return this; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     set(value: T): void { |     set(value: T): void { | ||||||
|         this.setData(value) |         this.setData(value); | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     update(f: Updater<T> & ((value: T) => T)): void { |     update(f: Updater<T> & ((value: T) => T)): void { | ||||||
|         this.setData(f(this.data)) |         this.setData(f(this.data)); | ||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -1,21 +1,21 @@ | ||||||
| import { ImmutableStore, Store, UIEventSource } from "../../Logic/UIEventSource"; | import { ImmutableStore, Store, UIEventSource } from "../../Logic/UIEventSource" | ||||||
| import type { Map as MlMap } from "maplibre-gl"; | import type { Map as MlMap } from "maplibre-gl" | ||||||
| import { GeoJSONSource, Marker } from "maplibre-gl"; | import { GeoJSONSource, Marker } from "maplibre-gl" | ||||||
| import { ShowDataLayerOptions } from "./ShowDataLayerOptions"; | import { ShowDataLayerOptions } from "./ShowDataLayerOptions" | ||||||
| import { GeoOperations } from "../../Logic/GeoOperations"; | import { GeoOperations } from "../../Logic/GeoOperations" | ||||||
| import LayerConfig from "../../Models/ThemeConfig/LayerConfig"; | import LayerConfig from "../../Models/ThemeConfig/LayerConfig" | ||||||
| import PointRenderingConfig from "../../Models/ThemeConfig/PointRenderingConfig"; | import PointRenderingConfig from "../../Models/ThemeConfig/PointRenderingConfig" | ||||||
| import { OsmTags } from "../../Models/OsmFeature"; | import { OsmTags } from "../../Models/OsmFeature" | ||||||
| import { FeatureSource, FeatureSourceForLayer } from "../../Logic/FeatureSource/FeatureSource"; | import { FeatureSource, FeatureSourceForLayer } from "../../Logic/FeatureSource/FeatureSource" | ||||||
| import { BBox } from "../../Logic/BBox"; | import { BBox } from "../../Logic/BBox" | ||||||
| import { Feature, Point } from "geojson"; | import { Feature, Point } from "geojson" | ||||||
| import LineRenderingConfig from "../../Models/ThemeConfig/LineRenderingConfig"; | import LineRenderingConfig from "../../Models/ThemeConfig/LineRenderingConfig" | ||||||
| import { Utils } from "../../Utils"; | import { Utils } from "../../Utils" | ||||||
| import * as range_layer from "../../../assets/layers/range/range.json"; | import * as range_layer from "../../../assets/layers/range/range.json" | ||||||
| import { LayerConfigJson } from "../../Models/ThemeConfig/Json/LayerConfigJson"; | import { LayerConfigJson } from "../../Models/ThemeConfig/Json/LayerConfigJson" | ||||||
| import PerLayerFeatureSourceSplitter from "../../Logic/FeatureSource/PerLayerFeatureSourceSplitter"; | import PerLayerFeatureSourceSplitter from "../../Logic/FeatureSource/PerLayerFeatureSourceSplitter" | ||||||
| import FilteredLayer from "../../Models/FilteredLayer"; | import FilteredLayer from "../../Models/FilteredLayer" | ||||||
| import SimpleFeatureSource from "../../Logic/FeatureSource/Sources/SimpleFeatureSource"; | import SimpleFeatureSource from "../../Logic/FeatureSource/Sources/SimpleFeatureSource" | ||||||
| 
 | 
 | ||||||
| class PointRenderingLayer { | class PointRenderingLayer { | ||||||
|     private readonly _config: PointRenderingConfig |     private readonly _config: PointRenderingConfig | ||||||
|  | @ -289,16 +289,16 @@ class LineRenderingLayer { | ||||||
|         { |         { | ||||||
|             // Add source to the map or update the feature source
 |             // Add source to the map or update the feature source
 | ||||||
|             if (src === undefined) { |             if (src === undefined) { | ||||||
|                 this.currentSourceData = features; |                 this.currentSourceData = features | ||||||
|                 map.addSource(this._layername, { |                 map.addSource(this._layername, { | ||||||
|                     type: "geojson", |                     type: "geojson", | ||||||
|                     data: { |                     data: { | ||||||
|                         type: "FeatureCollection", |                         type: "FeatureCollection", | ||||||
|                         features |                         features, | ||||||
|                     }, |                     }, | ||||||
|                     promoteId: "id" |                     promoteId: "id", | ||||||
|                 }); |                 }) | ||||||
|                 const linelayer = this._layername + "_line"; |                 const linelayer = this._layername + "_line" | ||||||
|                 map.addLayer({ |                 map.addLayer({ | ||||||
|                     source: this._layername, |                     source: this._layername, | ||||||
|                     id: linelayer, |                     id: linelayer, | ||||||
|  | @ -307,12 +307,12 @@ class LineRenderingLayer { | ||||||
|                         "line-color": ["feature-state", "color"], |                         "line-color": ["feature-state", "color"], | ||||||
|                         "line-opacity": ["feature-state", "color-opacity"], |                         "line-opacity": ["feature-state", "color-opacity"], | ||||||
|                         "line-width": ["feature-state", "width"], |                         "line-width": ["feature-state", "width"], | ||||||
|                         "line-offset": ["feature-state", "offset"] |                         "line-offset": ["feature-state", "offset"], | ||||||
|                     }, |                     }, | ||||||
|                     layout: { |                     layout: { | ||||||
|                         "line-cap": "round" |                         "line-cap": "round", | ||||||
|                     } |                     }, | ||||||
|                 }); |                 }) | ||||||
| 
 | 
 | ||||||
|                 for (const feature of features) { |                 for (const feature of features) { | ||||||
|                     if(!feature.properties.id){ |                     if(!feature.properties.id){ | ||||||
|  | @ -327,10 +327,10 @@ class LineRenderingLayer { | ||||||
| 
 | 
 | ||||||
|                 map.on("click", linelayer, (e) => { |                 map.on("click", linelayer, (e) => { | ||||||
|                     // line-layer-listener
 |                     // line-layer-listener
 | ||||||
|                     e.originalEvent["consumed"] = true; |                     e.originalEvent["consumed"] = true | ||||||
|                     this._onClick(e.features[0]); |                     this._onClick(e.features[0]) | ||||||
|                 }); |                 }) | ||||||
|                 const polylayer = this._layername + "_polygon"; |                 const polylayer = this._layername + "_polygon" | ||||||
| 
 | 
 | ||||||
|                 map.addLayer({ |                 map.addLayer({ | ||||||
|                     source: this._layername, |                     source: this._layername, | ||||||
|  | @ -340,40 +340,40 @@ class LineRenderingLayer { | ||||||
|                     layout: {}, |                     layout: {}, | ||||||
|                     paint: { |                     paint: { | ||||||
|                         "fill-color": ["feature-state", "fillColor"], |                         "fill-color": ["feature-state", "fillColor"], | ||||||
|                         "fill-opacity": ["feature-state", "fillColor-opacity"] |                         "fill-opacity": ["feature-state", "fillColor-opacity"], | ||||||
|                     } |                     }, | ||||||
|                 }); |                 }) | ||||||
|                 if (this._onClick) { |                 if (this._onClick) { | ||||||
|                     map.on("click", polylayer, (e) => { |                     map.on("click", polylayer, (e) => { | ||||||
|                         // polygon-layer-listener
 |                         // polygon-layer-listener
 | ||||||
|                         if (e.originalEvent["consumed"]) { |                         if (e.originalEvent["consumed"]) { | ||||||
|                             // This is a polygon beneath a marker, we can ignore it
 |                             // This is a polygon beneath a marker, we can ignore it
 | ||||||
|                             return; |                             return | ||||||
|                         } |                         } | ||||||
|                         e.originalEvent["consumed"] = true; |                         e.originalEvent["consumed"] = true | ||||||
|                         this._onClick(e.features[0]); |                         this._onClick(e.features[0]) | ||||||
|                     }); |                     }) | ||||||
|                 } |                 } | ||||||
| 
 | 
 | ||||||
|                 this._visibility?.addCallbackAndRunD((visible) => { |                 this._visibility?.addCallbackAndRunD((visible) => { | ||||||
|                     try { |                     try { | ||||||
|                         map.setLayoutProperty(linelayer, "visibility", visible ? "visible" : "none"); |                         map.setLayoutProperty(linelayer, "visibility", visible ? "visible" : "none") | ||||||
|                         map.setLayoutProperty(polylayer, "visibility", visible ? "visible" : "none"); |                         map.setLayoutProperty(polylayer, "visibility", visible ? "visible" : "none") | ||||||
|                     } catch (e) { |                     } catch (e) { | ||||||
|                         console.warn( |                         console.warn( | ||||||
|                             "Error while setting visibility of layers ", |                             "Error while setting visibility of layers ", | ||||||
|                             linelayer, |                             linelayer, | ||||||
|                             polylayer, |                             polylayer, | ||||||
|                             e |                             e | ||||||
|                         ); |                         ) | ||||||
|                     } |                     } | ||||||
|                 }); |                 }) | ||||||
|             } else { |             } else { | ||||||
|                 this.currentSourceData = features; |                 this.currentSourceData = features | ||||||
|                 src.setData({ |                 src.setData({ | ||||||
|                     type: "FeatureCollection", |                     type: "FeatureCollection", | ||||||
|                     features: this.currentSourceData |                     features: this.currentSourceData, | ||||||
|                 }); |                 }) | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|         for (let i = 0; i < features.length; i++) { |         for (let i = 0; i < features.length; i++) { | ||||||
|  | @ -407,7 +407,7 @@ class LineRenderingLayer { | ||||||
|                   this.calculatePropsFor(feature.properties) |                   this.calculatePropsFor(feature.properties) | ||||||
|                 ) |                 ) | ||||||
|                 tags.addCallbackD((properties) => { |                 tags.addCallbackD((properties) => { | ||||||
|                     if(!map.getLayer(this._layername)){ |                     if (!map.getLayer(this._layername)) { | ||||||
|                         return |                         return | ||||||
|                     } |                     } | ||||||
|                     map.setFeatureState( |                     map.setFeatureState( | ||||||
|  |  | ||||||
|  | @ -50,6 +50,9 @@ | ||||||
|   $: isHardDelete = changedProperties[DeleteConfig.deleteReasonKey] !== undefined |   $: isHardDelete = changedProperties[DeleteConfig.deleteReasonKey] !== undefined | ||||||
| 
 | 
 | ||||||
|   async function onDelete() { |   async function onDelete() { | ||||||
|  |     if(selectedTags === undefined){ | ||||||
|  |       return | ||||||
|  |     } | ||||||
|     currentState = "applying" |     currentState = "applying" | ||||||
|     let actionToTake: OsmChangeAction |     let actionToTake: OsmChangeAction | ||||||
|     const changedProperties = TagUtils.changeAsProperties(selectedTags.asChange(tags?.data ?? {})) |     const changedProperties = TagUtils.changeAsProperties(selectedTags.asChange(tags?.data ?? {})) | ||||||
|  |  | ||||||
							
								
								
									
										896
									
								
								src/Utils.ts
									
										
									
									
									
								
							
							
						
						
									
										896
									
								
								src/Utils.ts
									
										
									
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load diff
											
										
									
								
							|  | @ -1,11 +1,11 @@ | ||||||
| { | { | ||||||
|   "contributors": [ |   "contributors": [ | ||||||
|     { |     { | ||||||
|       "commits": 6039, |       "commits": 6055, | ||||||
|       "contributor": "Pieter Vander Vennet" |       "contributor": "Pieter Vander Vennet" | ||||||
|     }, |     }, | ||||||
|     { |     { | ||||||
|       "commits": 408, |       "commits": 414, | ||||||
|       "contributor": "Robin van der Linde" |       "contributor": "Robin van der Linde" | ||||||
|     }, |     }, | ||||||
|     { |     { | ||||||
|  | @ -52,6 +52,10 @@ | ||||||
|       "commits": 24, |       "commits": 24, | ||||||
|       "contributor": "Ward" |       "contributor": "Ward" | ||||||
|     }, |     }, | ||||||
|  |     { | ||||||
|  |       "commits": 21, | ||||||
|  |       "contributor": "dependabot[bot]" | ||||||
|  |     }, | ||||||
|     { |     { | ||||||
|       "commits": 21, |       "commits": 21, | ||||||
|       "contributor": "wjtje" |       "contributor": "wjtje" | ||||||
|  | @ -60,10 +64,6 @@ | ||||||
|       "commits": 21, |       "commits": 21, | ||||||
|       "contributor": "AlexanderRebai" |       "contributor": "AlexanderRebai" | ||||||
|     }, |     }, | ||||||
|     { |  | ||||||
|       "commits": 20, |  | ||||||
|       "contributor": "dependabot[bot]" |  | ||||||
|     }, |  | ||||||
|     { |     { | ||||||
|       "commits": 19, |       "commits": 19, | ||||||
|       "contributor": "Niels Elgaard Larsen" |       "contributor": "Niels Elgaard Larsen" | ||||||
|  | @ -106,11 +106,11 @@ | ||||||
|     }, |     }, | ||||||
|     { |     { | ||||||
|       "commits": 11, |       "commits": 11, | ||||||
|       "contributor": "RobJN" |       "contributor": "Thibault Molleman" | ||||||
|     }, |     }, | ||||||
|     { |     { | ||||||
|       "commits": 10, |       "commits": 11, | ||||||
|       "contributor": "Thibault Molleman" |       "contributor": "RobJN" | ||||||
|     }, |     }, | ||||||
|     { |     { | ||||||
|       "commits": 10, |       "commits": 10, | ||||||
|  |  | ||||||
|  | @ -1,7 +1,7 @@ | ||||||
| { | { | ||||||
|   "contributors": [ |   "contributors": [ | ||||||
|     { |     { | ||||||
|       "commits": 306, |       "commits": 308, | ||||||
|       "contributor": "kjon" |       "contributor": "kjon" | ||||||
|     }, |     }, | ||||||
|     { |     { | ||||||
|  | @ -9,7 +9,7 @@ | ||||||
|       "contributor": "Pieter Vander Vennet" |       "contributor": "Pieter Vander Vennet" | ||||||
|     }, |     }, | ||||||
|     { |     { | ||||||
|       "commits": 171, |       "commits": 176, | ||||||
|       "contributor": "paunofu" |       "contributor": "paunofu" | ||||||
|     }, |     }, | ||||||
|     { |     { | ||||||
|  |  | ||||||
							
								
								
									
										17
									
								
								src/test.ts
									
										
									
									
									
								
							
							
						
						
									
										17
									
								
								src/test.ts
									
										
									
									
									
								
							|  | @ -1,15 +1,8 @@ | ||||||
| import LayoutConfig from "./Models/ThemeConfig/LayoutConfig" | import LayoutConfig from "./Models/ThemeConfig/LayoutConfig"; | ||||||
| import * as theme from "./assets/generated/themes/bookcases.json" | import * as theme from "./assets/generated/themes/bookcases.json"; | ||||||
| import ThemeViewState from "./Models/ThemeViewState" | import ThemeViewState from "./Models/ThemeViewState"; | ||||||
| import Combine from "./UI/Base/Combine" | import Combine from "./UI/Base/Combine"; | ||||||
| import SpecialVisualizations from "./UI/SpecialVisualizations" | import SpecialVisualizations from "./UI/SpecialVisualizations"; | ||||||
| import ValidatedInput from "./UI/InputElement/ValidatedInput.svelte" |  | ||||||
| import SvelteUIElement from "./UI/Base/SvelteUIElement" |  | ||||||
| import { UIEventSource } from "./Logic/UIEventSource" |  | ||||||
| import { Unit } from "./Models/Unit" |  | ||||||
| import { Denomination } from "./Models/Denomination" |  | ||||||
| import { VariableUiElement } from "./UI/Base/VariableUIElement" |  | ||||||
| import { FixedUiElement } from "./UI/Base/FixedUiElement" |  | ||||||
| 
 | 
 | ||||||
| function testspecial() { | function testspecial() { | ||||||
|     const layout = new LayoutConfig(<any>theme, true) // qp.data === "" ?  : new AllKnownLayoutsLazy().get(qp.data)
 |     const layout = new LayoutConfig(<any>theme, true) // qp.data === "" ?  : new AllKnownLayoutsLazy().get(qp.data)
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue