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) | ||||
|     + [payment-options](#payment-options) | ||||
|     + [payment-options-advanced](#payment-options-advanced) | ||||
|     + [payment-options-split](#payment-options-split) | ||||
|     + [opening_hours_24_7](#opening_hours_24_7) | ||||
|     + [level](#level) | ||||
|     + [bicycle_rental.*bicycle_rental](#bicycle_rental*bicycle_rental) | ||||
|  | @ -46,7 +47,6 @@ | |||
|     + [opening_hours_by_appointment](#opening_hours_by_appointment) | ||||
|     + [multilevels](#multilevels) | ||||
|     + [induction-loop](#induction-loop) | ||||
|     + [payment-options-split](#payment-options-split) | ||||
|     + [denominations-coins](#denominations-coins) | ||||
|     + [check_date](#check_date) | ||||
|     + [all_tags](#all_tags) | ||||
|  | @ -56,6 +56,7 @@ | |||
|     + [mastodon](#mastodon) | ||||
|     + [contact](#contact) | ||||
|     + [etymology.wikipedia-etymology](#etymologywikipedia-etymology) | ||||
|     + [toilet.relevant-questions](#toiletrelevant-questions) | ||||
|     + [denominations-notes](#denominations-notes) | ||||
|     + [single_level](#single_level) | ||||
|     + [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  | ||||
| 
 | ||||
| 
 | ||||
|  | @ -753,22 +771,6 @@ | |||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| ### payment-options-split  | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
|   - elongated_coin | ||||
|   - parking_ticket_machine | ||||
|   - shower | ||||
|   - ticket_machine | ||||
|   - toilet | ||||
|   - vending_machine | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| ### denominations-coins  | ||||
| 
 | ||||
| 
 | ||||
|  | @ -866,6 +868,17 @@ | |||
| 
 | ||||
| 
 | ||||
| 
 | ||||
|   - indoors | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| ### toilet.relevant-questions  | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
|   - indoors | ||||
| 
 | ||||
| 
 | ||||
|  |  | |||
|  | @ -47,7 +47,7 @@ this quick overview is incomplete | |||
| 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/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/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) | ||||
|  | @ -119,11 +119,16 @@ This is rendered with  `This vending machine sells {vending}` | |||
|   - *Cheese is sold*  corresponds with  `vending=cheese` | ||||
|   - *Honey is sold*  corresponds with  `vending=honey` | ||||
|   - *Potatoes are sold*  corresponds with  `vending=potatoes` | ||||
|   - *Meat is sold*  corresponds with  `vending=meat` | ||||
|   - *Flowers are sold*  corresponds with  `vending=flowers` | ||||
|   - *Parking tickets are sold*  corresponds with  `vending=parking_tickets` | ||||
|   - *Pressed pennies are sold*  corresponds with  `vending=elongated_coin` | ||||
|   - *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.14 | Sale of honey | vending~^(.*honey.*)$ | ||||
| vending.15 | Sale of potatoes | vending~^(.*potatoes.*)$ | ||||
| vending.16 | Sale of flowers | vending~^(.*flowers.*)$ | ||||
| vending.17 | Sale of parking | vending~^(.*parking_tickets.*)$ | ||||
| vending.18 | Sale of pressed pennies | vending=elongated_coin | ||||
| vending.19 | Sale of public transport tickets | vending~^(.*public_transport_tickets.*)$ | ||||
| vending.20 | Sale of meat products | vending=meat | ||||
| vending.16 | Sale of meat | vending~^(.*meat.*)$ | ||||
| vending.17 | Sale of flowers | vending~^(.*flowers.*)$ | ||||
| vending.18 | Sale of parking tickets | vending~^(.*parking_tickets.*)$ | ||||
| vending.19 | Sale of pressed pennies | vending=elongated_coin | ||||
| 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) | ||||
|  |  | |||
|  | @ -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/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/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> | ||||
|   - *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> | ||||
|   - *Payment with cards is possible*  corresponds with  `payment: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> | ||||
|   - *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> | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
|  | @ -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` | ||||
|   - 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> | ||||
|   - *Gloves are sold here*  corresponds with  `vending:gloves=yes` | ||||
|   - 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=yes` | ||||
|   - 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 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> | ||||
|   - *Bicycle inner tubes are sold here*  corresponds with  `vending=bicycle_tube` | ||||
|   - *Bicycle lights are sold here*  corresponds with  `vending=bicycle_light` | ||||
|   - *Gloves are sold here*  corresponds with  `vending=gloves` | ||||
|   - *Bicycle repair kits are sold here*  corresponds with  `vending=bicycle_repair_kit` | ||||
|   - *Bicycle pumps are sold here*  corresponds with  `vending=bicycle_pump` | ||||
|   - *Bicycle locks are sold here*  corresponds with  `vending=bicycle_lock` | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
|  |  | |||
|  | @ -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/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/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  | ||||
| 
 | ||||
| 
 | ||||
|  |  | |||
|  | @ -161,6 +161,8 @@ This is rendered with  `Access is {access}` | |||
|   - This option cannot be chosen as answer | ||||
| 
 | ||||
| 
 | ||||
| This tagrendering has labels  `relevant-questions` | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| ### toilets-fee  | ||||
|  | @ -177,6 +179,8 @@ The question is  *Are these toilets free to use?* | |||
|   - *Free to use*  corresponds with  `fee=no` | ||||
| 
 | ||||
| 
 | ||||
| This tagrendering has labels  `relevant-questions` | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| ### 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 has labels  `relevant-questions` | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| ### 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 has labels  `relevant-questions` | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| ### 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` | ||||
| 
 | ||||
| 
 | ||||
| This tagrendering has labels  `relevant-questions` | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| ### 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` | ||||
| 
 | ||||
| 
 | ||||
| This tagrendering has labels  `relevant-questions` | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| ### 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 has labels  `relevant-questions` | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| ### 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` | ||||
| 
 | ||||
| 
 | ||||
| This tagrendering has labels  `relevant-questions` | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| ### 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` | ||||
| 
 | ||||
| 
 | ||||
| This tagrendering has labels  `relevant-questions` | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| ### 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 has labels  `relevant-questions` | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| ### 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 tagrendering has labels  `relevant-questions` | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| ### 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` | ||||
| 
 | ||||
| 
 | ||||
| This tagrendering has labels  `relevant-questions` | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| ### 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` | ||||
| 
 | ||||
| 
 | ||||
| This tagrendering has labels  `relevant-questions` | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| ### 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` | ||||
| 
 | ||||
| 
 | ||||
| This tagrendering has labels  `relevant-questions` | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| ### 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 has labels  `relevant-questions` | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| ### 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 tagrendering has labels  `relevant-questions` | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| ### 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` | ||||
| 
 | ||||
| 
 | ||||
| This tagrendering has labels  `relevant-questions` | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| ### description  | ||||
|  |  | |||
|  | @ -47,7 +47,7 @@ this quick overview is incomplete | |||
| 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/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/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) | ||||
|  | @ -119,11 +119,16 @@ This is rendered with  `This vending machine sells {vending}` | |||
|   - *Cheese is sold*  corresponds with  `vending=cheese` | ||||
|   - *Honey is sold*  corresponds with  `vending=honey` | ||||
|   - *Potatoes are sold*  corresponds with  `vending=potatoes` | ||||
|   - *Meat is sold*  corresponds with  `vending=meat` | ||||
|   - *Flowers are sold*  corresponds with  `vending=flowers` | ||||
|   - *Parking tickets are sold*  corresponds with  `vending=parking_tickets` | ||||
|   - *Pressed pennies are sold*  corresponds with  `vending=elongated_coin` | ||||
|   - *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.14 | Sale of honey | vending~^(.*honey.*)$ | ||||
| vending.15 | Sale of potatoes | vending~^(.*potatoes.*)$ | ||||
| vending.16 | Sale of flowers | vending~^(.*flowers.*)$ | ||||
| vending.17 | Sale of parking | vending~^(.*parking_tickets.*)$ | ||||
| vending.18 | Sale of pressed pennies | vending=elongated_coin | ||||
| vending.19 | Sale of public transport tickets | vending~^(.*public_transport_tickets.*)$ | ||||
| vending.20 | Sale of meat products | vending=meat | ||||
| vending.16 | Sale of meat | vending~^(.*meat.*)$ | ||||
| vending.17 | Sale of flowers | vending~^(.*flowers.*)$ | ||||
| vending.18 | Sale of parking tickets | vending~^(.*parking_tickets.*)$ | ||||
| vending.19 | Sale of pressed pennies | vending=elongated_coin | ||||
| 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) | ||||
|  |  | |||
|  | @ -49,7 +49,7 @@ this quick overview is incomplete | |||
| 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/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) | ||||
| 
 | ||||
| 
 | ||||
|  | @ -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 needles and other sharp objects*  corresponds with  `waste=sharps` | ||||
|   - *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')" | ||||
|     }, | ||||
|     { | ||||
|       "key": "payment:coins", | ||||
|       "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')", | ||||
|       "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')", | ||||
|       "key": "payment:cash", | ||||
|       "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: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" | ||||
|     }, | ||||
|     { | ||||
|  | @ -1031,29 +1051,34 @@ | |||
|       "value": "Continental" | ||||
|     }, | ||||
|     { | ||||
|       "key": "vending:bicycle_light", | ||||
|       "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')", | ||||
|       "value": "yes" | ||||
|       "key": "vending", | ||||
|       "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": "bicycle_tube" | ||||
|     }, | ||||
|     { | ||||
|       "key": "vending:gloves", | ||||
|       "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')", | ||||
|       "value": "yes" | ||||
|       "key": "vending", | ||||
|       "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": "bicycle_light" | ||||
|     }, | ||||
|     { | ||||
|       "key": "vending:bicycle_repair_kit", | ||||
|       "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')", | ||||
|       "value": "yes" | ||||
|       "key": "vending", | ||||
|       "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": "gloves" | ||||
|     }, | ||||
|     { | ||||
|       "key": "vending:bicycle_pump", | ||||
|       "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')", | ||||
|       "value": "yes" | ||||
|       "key": "vending", | ||||
|       "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": "bicycle_repair_kit" | ||||
|     }, | ||||
|     { | ||||
|       "key": "vending:bicycle_lock", | ||||
|       "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')", | ||||
|       "value": "yes" | ||||
|       "key": "vending", | ||||
|       "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": "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", | ||||
|  |  | |||
|  | @ -215,6 +215,186 @@ | |||
|       "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)" | ||||
|     }, | ||||
|     { | ||||
|       "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", | ||||
|       "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')" | ||||
|     }, | ||||
|     { | ||||
|       "key": "payment:coins", | ||||
|       "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')", | ||||
|       "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')", | ||||
|       "key": "payment:cash", | ||||
|       "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: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" | ||||
|     }, | ||||
|     { | ||||
|  | @ -1557,29 +1577,34 @@ | |||
|       "value": "Continental" | ||||
|     }, | ||||
|     { | ||||
|       "key": "vending:bicycle_light", | ||||
|       "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')", | ||||
|       "value": "yes" | ||||
|       "key": "vending", | ||||
|       "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": "bicycle_tube" | ||||
|     }, | ||||
|     { | ||||
|       "key": "vending:gloves", | ||||
|       "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')", | ||||
|       "value": "yes" | ||||
|       "key": "vending", | ||||
|       "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": "bicycle_light" | ||||
|     }, | ||||
|     { | ||||
|       "key": "vending:bicycle_repair_kit", | ||||
|       "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')", | ||||
|       "value": "yes" | ||||
|       "key": "vending", | ||||
|       "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": "gloves" | ||||
|     }, | ||||
|     { | ||||
|       "key": "vending:bicycle_pump", | ||||
|       "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')", | ||||
|       "value": "yes" | ||||
|       "key": "vending", | ||||
|       "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": "bicycle_repair_kit" | ||||
|     }, | ||||
|     { | ||||
|       "key": "vending:bicycle_lock", | ||||
|       "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')", | ||||
|       "value": "yes" | ||||
|       "key": "vending", | ||||
|       "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": "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", | ||||
|  | @ -8548,6 +8573,186 @@ | |||
|       "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)" | ||||
|     }, | ||||
|     { | ||||
|       "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", | ||||
|       "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')", | ||||
|       "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", | ||||
|       "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", | ||||
|       "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')", | ||||
|       "value": "meat" | ||||
|       "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": "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", | ||||
|  | @ -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')", | ||||
|       "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", | ||||
|       "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')", | ||||
|       "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", | ||||
|       "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", | ||||
|       "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')", | ||||
|       "value": "meat" | ||||
|       "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": "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", | ||||
|  |  | |||
|  | @ -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')", | ||||
|       "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", | ||||
|       "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')", | ||||
|       "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", | ||||
|       "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", | ||||
|     "reviews" | ||||
|   ], | ||||
|   "minzoom": 12, | ||||
|   "filter": [ | ||||
|     "open_now", | ||||
|     "accepts_cash", | ||||
|     "accepts_cards" | ||||
|     "accepts_cards", | ||||
|     "has_internet", | ||||
|     "has_electricity" | ||||
|   ], | ||||
|   "deletion": { | ||||
|     "softDeletionTags": { | ||||
|  |  | |||
|  | @ -147,7 +147,8 @@ | |||
|         "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>", | ||||
|         "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~*", | ||||
|       "id": "Contained_climbing_routes" | ||||
|  | @ -206,7 +207,8 @@ | |||
|             "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", | ||||
|             "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", | ||||
|             "it": "Calcare", | ||||
|             "pa_PK": "چونہ پتھر", | ||||
|             "eu": "Kareharria" | ||||
|             "eu": "Kareharria", | ||||
|             "ca": "Calcària" | ||||
|           } | ||||
|         } | ||||
|       ], | ||||
|  |  | |||
|  | @ -272,6 +272,33 @@ | |||
|           "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}", | ||||
|         "fr": "Placé le {start_date}", | ||||
|         "ru": "Установлен {start_date}", | ||||
|         "de": "Aufgestellt am {start_date}" | ||||
|         "de": "Aufgestellt am {start_date}", | ||||
|         "ca": "Col·locat el {start_date}" | ||||
|       }, | ||||
|       "freeform": { | ||||
|         "key": "start_date", | ||||
|  |  | |||
|  | @ -342,7 +342,9 @@ | |||
|             "en": "These are toilets" | ||||
|           }, | ||||
|           "icon": "./assets/layers/indoors/room_toilets.svg", | ||||
|           "addExtraTags": ["amenity=toilets"] | ||||
|           "addExtraTags": [ | ||||
|             "amenity=toilets" | ||||
|           ] | ||||
|         }, | ||||
|         { | ||||
|           "if": "room=waiting", | ||||
|  | @ -384,7 +386,9 @@ | |||
|       "builtin": "toilet.relevant-questions", | ||||
|       "override": { | ||||
|         "condition": { | ||||
|           "+and": ["amenity=toilets"] | ||||
|           "+and": [ | ||||
|             "amenity=toilets" | ||||
|           ] | ||||
|         } | ||||
|       } | ||||
|     } | ||||
|  |  | |||
|  | @ -47,6 +47,7 @@ | |||
|   "minzoom": 13, | ||||
|   "tagRenderings": [ | ||||
|     "images", | ||||
|     "reviews", | ||||
|     { | ||||
|       "id": "name", | ||||
|       "freeform": { | ||||
|  |  | |||
|  | @ -51,7 +51,8 @@ | |||
|         "en": "{sport} is played here", | ||||
|         "it": "Qui si gioca a {sport}", | ||||
|         "de": "Hier wird {sport} gespielt", | ||||
|         "es": "Aquí se juega al {sport}" | ||||
|         "es": "Aquí se juega al {sport}", | ||||
|         "ca": "{sport} es juga aquí" | ||||
|       }, | ||||
|       "freeform": { | ||||
|         "key": "sport" | ||||
|  | @ -62,7 +63,8 @@ | |||
|         "en": "Which sport can be played here?", | ||||
|         "it": "Quale sport si gioca qui?", | ||||
|         "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, | ||||
|       "mappings": [ | ||||
|  | @ -172,7 +174,8 @@ | |||
|           "then": { | ||||
|             "en": "This is a 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>", | ||||
|         "it": "La superficie è <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": { | ||||
|         "key": "surface" | ||||
|  |  | |||
|  | @ -2,11 +2,13 @@ | |||
|   "id": "sports_centre", | ||||
|   "name": { | ||||
|     "en": "Sports centres", | ||||
|     "de": "Sportzentren" | ||||
|     "de": "Sportzentren", | ||||
|     "ca": "Centres esportius" | ||||
|   }, | ||||
|   "description": { | ||||
|     "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, | ||||
|   "source": { | ||||
|  | @ -15,7 +17,8 @@ | |||
|   "title": { | ||||
|     "render": { | ||||
|       "en": "Sports centre", | ||||
|       "de": "Sportzentrum" | ||||
|       "de": "Sportzentrum", | ||||
|       "ca": "Centre esportiu" | ||||
|     }, | ||||
|     "mappings": [ | ||||
|       { | ||||
|  | @ -36,7 +39,8 @@ | |||
|     { | ||||
|       "title": { | ||||
|         "en": "a sports centre", | ||||
|         "de": "ein Sportzentrum" | ||||
|         "de": "ein Sportzentrum", | ||||
|         "ca": "un centre esportiu" | ||||
|       }, | ||||
|       "tags": [ | ||||
|         "leisure=sports_centre" | ||||
|  |  | |||
|  | @ -9,7 +9,8 @@ | |||
|   "description": { | ||||
|     "en": "Layer showing stairs and escalators", | ||||
|     "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": { | ||||
|     "render": { | ||||
|  |  | |||
|  | @ -349,7 +349,8 @@ | |||
|         "fr": "À quel niveau se trouve cette caméra ?", | ||||
|         "it": "A che piano si trova questa videocamera?", | ||||
|         "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": { | ||||
|         "en": "Located on level {level}", | ||||
|  |  | |||
|  | @ -5,7 +5,8 @@ | |||
|     "nl": "Universiteiten en hogescholen", | ||||
|     "de": "Hochschulen und Universitäten", | ||||
|     "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)", | ||||
|   "source": { | ||||
|  | @ -42,7 +43,8 @@ | |||
|           "nl": "Hogeschool", | ||||
|           "de": "(Fach)hochschule", | ||||
|           "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", | ||||
|           "de": "Schule mit tertiärem Bildungsangebot", | ||||
|           "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.", | ||||
|             "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", | ||||
|             "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.", | ||||
|         "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.", | ||||
|         "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": [ | ||||
|         "amenity=university", | ||||
|  |  | |||
|  | @ -530,7 +530,9 @@ | |||
|         "ca": "El cambiador està a {changing_table:location}" | ||||
|       }, | ||||
|       "condition": { | ||||
|         "and":["changing_table=yes"] | ||||
|         "and": [ | ||||
|           "changing_table=yes" | ||||
|         ] | ||||
|       }, | ||||
|       "freeform": { | ||||
|         "key": "changing_table:location", | ||||
|  |  | |||
|  | @ -14,7 +14,8 @@ | |||
|     "render": { | ||||
|       "en": "Toilet at amenity", | ||||
|       "de": "Toilette in Einrichtung", | ||||
|       "nl": "Toilet in een voorziening" | ||||
|       "nl": "Toilet in een voorziening", | ||||
|       "ca": "Lavabo a la instal·lació" | ||||
|     }, | ||||
|     "mappings": [ | ||||
|       { | ||||
|  | @ -22,7 +23,8 @@ | |||
|         "then": { | ||||
|           "en": "Toilet at {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", | ||||
|         "question": { | ||||
|           "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", | ||||
|         "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", | ||||
|         "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": { | ||||
|         "key": "toilets:door:width", | ||||
|  | @ -329,7 +333,8 @@ | |||
|             "nl": "Gratis toegankelijk", | ||||
|             "de": "Nutzung kostenlos", | ||||
|             "fr": "Utilisation gratuite", | ||||
|             "da": "Gratis at bruge" | ||||
|             "da": "Gratis at bruge", | ||||
|             "ca": "Ús gratuït" | ||||
|           }, | ||||
|           "osmTags": { | ||||
|             "or": [ | ||||
|  |  | |||
|  | @ -10,7 +10,8 @@ | |||
|   "description": { | ||||
|     "en": "Layer showing different types of transit stops.", | ||||
|     "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": { | ||||
|     "osmTags": { | ||||
|  | @ -25,7 +26,8 @@ | |||
|       "en": "Transit Stop", | ||||
|       "de": "Haltestelle", | ||||
|       "da": "Transit Stop", | ||||
|       "nl": "Bushalte" | ||||
|       "nl": "Bushalte", | ||||
|       "ca": "Parada de transport públic" | ||||
|     }, | ||||
|     "mappings": [ | ||||
|       { | ||||
|  | @ -53,13 +55,6 @@ | |||
|       "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": [ | ||||
|     { | ||||
|       "id": "stop_name", | ||||
|  |  | |||
|  | @ -915,7 +915,7 @@ | |||
|             "nl": "Verkoop van bloemen", | ||||
|             "de": "Verkauf von Blumen", | ||||
|             "fr": "Vente de fleurs", | ||||
|             "ca": "Venda de flors" | ||||
|             "ca": "Venda d'aparcament" | ||||
|           }, | ||||
|           "osmTags": "vending~i~.*flowers.*" | ||||
|         }, | ||||
|  | @ -923,21 +923,21 @@ | |||
|           "osmTags": "vending~i~.*parking_tickets.*", | ||||
|           "question": { | ||||
|             "en": "Sale of parking tickets", | ||||
|             "ca": "Venda d'aparcament" | ||||
|             "ca": "Venda de monedes premsades" | ||||
|           } | ||||
|         }, | ||||
|         { | ||||
|           "osmTags": "vending=elongated_coin", | ||||
|           "question": { | ||||
|             "en": "Sale of pressed pennies", | ||||
|             "ca": "Venda de monedes premsades" | ||||
|             "ca": "Venda de bitllets de transport públic" | ||||
|           } | ||||
|         }, | ||||
|         { | ||||
|           "osmTags": "vending~i~.*public_transport_tickets.*", | ||||
|           "question": { | ||||
|             "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>" | ||||
| } | ||||
| } | ||||
|  |  | |||
|  | @ -197,6 +197,7 @@ | |||
|         "example": "Exemple", | ||||
|         "examples": "Exemples", | ||||
|         "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", | ||||
|         "getStartedNewAccount": " o <a href=\"https://www.openstreetmap.org/user/new\" target=\"_blank\">crea un nou compte</a>", | ||||
|         "goToInbox": "Obrir missatges", | ||||
|  | @ -556,11 +557,16 @@ | |||
|     "reviews": { | ||||
|         "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>.", | ||||
|         "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", | ||||
|         "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", | ||||
|         "saved": "<span class=\"thanks\">Revisió compartida. Gràcies per compartir!</span>", | ||||
|         "saved": "Ressenya compartida. Gràcies per compartir!", | ||||
|         "saving_review": "Desant…", | ||||
|         "title": "{count} revisions", | ||||
|         "title_singular": "Una revisió", | ||||
|  |  | |||
|  | @ -1,4 +1,7 @@ | |||
| { | ||||
|     "advanced": { | ||||
|         "title": "Pokročilé funkce" | ||||
|     }, | ||||
|     "centerMessage": { | ||||
|         "loadingData": "Načítání dat…", | ||||
|         "ready": "Hotovo!", | ||||
|  |  | |||
|  | @ -197,6 +197,7 @@ | |||
|         "example": "Beispiel", | ||||
|         "examples": "Beispiele", | ||||
|         "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", | ||||
|         "getStartedNewAccount": " oder <a href=\"https://www.openstreetmap.org/user/new\" target=\"_blank\">ein neues Konto anlegen</a>", | ||||
|         "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.", | ||||
|         "toBig": "Ihr Bild ist mit {actual_size} zu groß. Die maximale Bildgröße ist {max_size}", | ||||
|         "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!", | ||||
|         "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": { | ||||
|         "back": "Zurück zur Artenübersicht", | ||||
|         "button": "Automatische Erkennung der Pflanzenart durch die KI von Plantnet.org", | ||||
|         "confirm": "Arten auswählen", | ||||
|         "done": "Die Art wurde übernommen", | ||||
|         "error": "Bei der Erkennung der Baumart ist ein Fehler aufgetreten: {error}", | ||||
|         "howTo": { | ||||
|             "intro": "Für optimale Ergebnisse,", | ||||
|  | @ -521,7 +537,8 @@ | |||
|         "poweredByPlantnet": "Bereitgestellt von <a href='https://plantnet.org' target='_blank'>plantnet.org</a>", | ||||
|         "querying": "Abfrage bei plantnet.org mit {length} Fotos", | ||||
|         "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": { | ||||
|         "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": { | ||||
|         "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.", | ||||
|         "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", | ||||
|         "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", | ||||
|         "saved": "<span class=\"thanks\">Bewertung gespeichert. Danke fürs Teilen!</span>", | ||||
|         "saved": "Bewertung gespeichert. Danke fürs Teilen!", | ||||
|         "saving_review": "Speichern…", | ||||
|         "title": "{count} Rezensionen", | ||||
|         "title_singular": "Eine Rezension", | ||||
|  |  | |||
|  | @ -2396,10 +2396,25 @@ | |||
|             } | ||||
|         }, | ||||
|         "tagRenderings": { | ||||
|             "Contained_climbing_routes": { | ||||
|                 "render": "<h3>Conté {_contained_climbing_routes_count} rutes</h3> <ul>{_contained_climbing_routes}</ul>" | ||||
|             }, | ||||
|             "Rock type (crag/rock/cliff only)": { | ||||
|                 "mappings": { | ||||
|                     "0": { | ||||
|                         "then": "Calcària" | ||||
|                     } | ||||
|                 }, | ||||
|                 "question": "Quin és el tipus de roca aquí?", | ||||
|                 "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": { | ||||
|                 "render": "<strong>{name}</strong>" | ||||
|             } | ||||
|  | @ -4424,7 +4439,8 @@ | |||
|                 } | ||||
|             }, | ||||
|             "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": { | ||||
|  | @ -7451,8 +7467,13 @@ | |||
|                     }, | ||||
|                     "4": { | ||||
|                         "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": { | ||||
|                 "mappings": { | ||||
|  | @ -7472,14 +7493,28 @@ | |||
|                         "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": { | ||||
|             "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": { | ||||
|         "description": "Capa que mostra escales i escales mecàniques", | ||||
|         "name": "Escales", | ||||
|         "tagRenderings": { | ||||
|             "conveying": { | ||||
|  | @ -7746,6 +7781,7 @@ | |||
|                 "question": "Quin tipus de càmera és aquesta?" | ||||
|             }, | ||||
|             "Level": { | ||||
|                 "question": "A quina planta es troba aquesta càmera?", | ||||
|                 "render": "Ubicat a la planta {level}" | ||||
|             }, | ||||
|             "Operator": { | ||||
|  | @ -7852,14 +7888,19 @@ | |||
|         } | ||||
|     }, | ||||
|     "tertiary_education": { | ||||
|         "name": "Instituts superiors i universitats", | ||||
|         "presets": { | ||||
|             "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" | ||||
|             } | ||||
|         }, | ||||
|         "tagRenderings": { | ||||
|             "institution-kind": { | ||||
|                 "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": { | ||||
|                         "then": "Açò és una universitat, una institució d'educació terciaria on s'imparteixen carreres universitàries o superior." | ||||
|                     } | ||||
|  | @ -7883,8 +7924,14 @@ | |||
|         }, | ||||
|         "title": { | ||||
|             "mappings": { | ||||
|                 "1": { | ||||
|                     "then": "Institut superior" | ||||
|                 }, | ||||
|                 "2": { | ||||
|                     "then": "Universitat" | ||||
|                 }, | ||||
|                 "3": { | ||||
|                     "then": "Escola que imparteix educació terciària" | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | @ -8147,10 +8194,22 @@ | |||
|                         "question": "Accessible amb cadira de rodes" | ||||
|                     } | ||||
|                 } | ||||
|             }, | ||||
|             "2": { | ||||
|                 "options": { | ||||
|                     "0": { | ||||
|                         "question": "Ús gratuït" | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         }, | ||||
|         "name": "Lavabos a altres instal·lacions", | ||||
|         "tagRenderings": { | ||||
|             "opening_hours": { | ||||
|                 "override": { | ||||
|                     "question": "Quan està oberta la instal·lació on es troben aquests lavabos?" | ||||
|                 } | ||||
|             }, | ||||
|             "toilet-access": { | ||||
|                 "mappings": { | ||||
|                     "0": { | ||||
|  | @ -8202,9 +8261,18 @@ | |||
|                 "question": "Hi ha un lavabo específic per a usuaris amb cadira de rodes?" | ||||
|             }, | ||||
|             "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": { | ||||
|             "0": { | ||||
|                 "applicableUnits": { | ||||
|  | @ -8290,6 +8358,7 @@ | |||
|         } | ||||
|     }, | ||||
|     "transit_stops": { | ||||
|         "description": "Capa que mostra diferents tipus de parades de transport públic", | ||||
|         "filter": { | ||||
|             "0": { | ||||
|                 "options": { | ||||
|  | @ -8422,7 +8491,8 @@ | |||
|                 "0": { | ||||
|                     "then": "Parada {name}" | ||||
|                 } | ||||
|             } | ||||
|             }, | ||||
|             "render": "Parada de transport públic" | ||||
|         } | ||||
|     }, | ||||
|     "tree_node": { | ||||
|  | @ -8812,6 +8882,12 @@ | |||
|                     "16": { | ||||
|                         "question": "Venda de productes carnis" | ||||
|                     }, | ||||
|                     "17": { | ||||
|                         "question": "Venda d'aparcament" | ||||
|                     }, | ||||
|                     "18": { | ||||
|                         "question": "Venda de monedes premsades" | ||||
|                     }, | ||||
|                     "19": { | ||||
|                         "question": "Venda de flors" | ||||
|                     }, | ||||
|  | @ -9261,4 +9337,4 @@ | |||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
| } | ||||
|  |  | |||
|  | @ -3170,6 +3170,9 @@ | |||
|                     }, | ||||
|                     "6": { | ||||
|                         "then": "En affaldskurv til plast" | ||||
|                     }, | ||||
|                     "7": { | ||||
|                         "then": "En affaldskurv til papir" | ||||
|                     } | ||||
|                 }, | ||||
|                 "question": "Hvad er det for en affaldskurv?" | ||||
|  |  | |||
|  | @ -35,6 +35,16 @@ | |||
|             "1": { | ||||
|                 "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": { | ||||
|                 "title": "eine wandmontierte Posterbox" | ||||
|             }, | ||||
|  | @ -61,16 +71,6 @@ | |||
|             }, | ||||
|             "9": { | ||||
|                 "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": { | ||||
|  | @ -165,6 +165,9 @@ | |||
|                     "1": { | ||||
|                         "then": "Dies ist ein Brett" | ||||
|                     }, | ||||
|                     "10": { | ||||
|                         "then": "Dies ist eine Wandmalerei" | ||||
|                     }, | ||||
|                     "2": { | ||||
|                         "then": "Dies ist eine Litfaßsäule" | ||||
|                     }, | ||||
|  | @ -188,9 +191,6 @@ | |||
|                     }, | ||||
|                     "9": { | ||||
|                         "then": "Dies ist ein Totem" | ||||
|                     }, | ||||
|                     "10": { | ||||
|                         "then": "Dies ist eine Wandmalerei" | ||||
|                     } | ||||
|                 }, | ||||
|                 "question": "Welche Art von Werbung ist das?", | ||||
|  | @ -205,6 +205,9 @@ | |||
|                 "1": { | ||||
|                     "then": "Brett" | ||||
|                 }, | ||||
|                 "10": { | ||||
|                     "then": "Wandmalerei" | ||||
|                 }, | ||||
|                 "2": { | ||||
|                     "then": "Posterbox" | ||||
|                 }, | ||||
|  | @ -228,9 +231,6 @@ | |||
|                 }, | ||||
|                 "9": { | ||||
|                     "then": "Totem" | ||||
|                 }, | ||||
|                 "10": { | ||||
|                     "then": "Wandmalerei" | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | @ -312,6 +312,15 @@ | |||
|                     "1": { | ||||
|                         "then": "Wandbild" | ||||
|                     }, | ||||
|                     "10": { | ||||
|                         "then": "Azulejo (spanische dekorative Fliesenarbeit)" | ||||
|                     }, | ||||
|                     "11": { | ||||
|                         "then": "Fliesenarbeit" | ||||
|                     }, | ||||
|                     "12": { | ||||
|                         "then": "Holzschnitzerei" | ||||
|                     }, | ||||
|                     "2": { | ||||
|                         "then": "Malerei" | ||||
|                     }, | ||||
|  | @ -335,15 +344,6 @@ | |||
|                     }, | ||||
|                     "9": { | ||||
|                         "then": "Relief" | ||||
|                     }, | ||||
|                     "10": { | ||||
|                         "then": "Azulejo (spanische dekorative Fliesenarbeit)" | ||||
|                     }, | ||||
|                     "11": { | ||||
|                         "then": "Fliesenarbeit" | ||||
|                     }, | ||||
|                     "12": { | ||||
|                         "then": "Holzschnitzerei" | ||||
|                     } | ||||
|                 }, | ||||
|                 "question": "Um welche Art Kunstwerk handelt es sich?", | ||||
|  | @ -1837,6 +1837,27 @@ | |||
|                     "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>" | ||||
|                     }, | ||||
|                     "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": { | ||||
|                         "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": { | ||||
|                         "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": { | ||||
|                         "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": { | ||||
|                         "then": "<b>Typ 1 CCS</b> (Typ 1 Combo)" | ||||
|                     }, | ||||
|  | @ -1990,6 +1966,9 @@ | |||
|                     "19": { | ||||
|                         "then": "<b>Typ 2 mit Kabel</b> (mennekes)" | ||||
|                     }, | ||||
|                     "2": { | ||||
|                         "then": "<b>Europäischer Netzstecker</b> mit Erdungsstift (CEE7/4 Typ E)" | ||||
|                     }, | ||||
|                     "20": { | ||||
|                         "then": "<b>Tesla Supercharger CCS</b> (Typ 2 CSS von Tesla)" | ||||
|                     }, | ||||
|  | @ -2020,11 +1999,32 @@ | |||
|                     "29": { | ||||
|                         "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": { | ||||
|                         "then": "<b>Bosch Active Connect mit 5 Pins</b> und Kabel" | ||||
|                     }, | ||||
|                     "31": { | ||||
|                         "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?" | ||||
|  | @ -3562,6 +3562,15 @@ | |||
|                     "1": { | ||||
|                         "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": { | ||||
|                         "then": "Der Radweg ist aus Asphalt" | ||||
|                     }, | ||||
|  | @ -3585,15 +3594,6 @@ | |||
|                     }, | ||||
|                     "9": { | ||||
|                         "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?", | ||||
|  | @ -3642,6 +3642,15 @@ | |||
|                     "1": { | ||||
|                         "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": { | ||||
|                         "then": "Der Radweg ist aus Asphalt" | ||||
|                     }, | ||||
|  | @ -3665,15 +3674,6 @@ | |||
|                     }, | ||||
|                     "9": { | ||||
|                         "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?", | ||||
|  | @ -4217,6 +4217,17 @@ | |||
|                 "question": "Verfügt der Aufzug über eine Sprachausgabe?", | ||||
|                 "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": { | ||||
|                 "render": { | ||||
|                     "special": { | ||||
|  | @ -4561,6 +4572,19 @@ | |||
|                     } | ||||
|                 } | ||||
|             }, | ||||
|             "10": { | ||||
|                 "options": { | ||||
|                     "0": { | ||||
|                         "question": "Keine Bevorzugung von Hunden" | ||||
|                     }, | ||||
|                     "1": { | ||||
|                         "question": "Hunde erlaubt" | ||||
|                     }, | ||||
|                     "2": { | ||||
|                         "question": "Keine Hunde erlaubt" | ||||
|                     } | ||||
|                 } | ||||
|             }, | ||||
|             "2": { | ||||
|                 "options": { | ||||
|                     "0": { | ||||
|  | @ -4750,30 +4774,6 @@ | |||
|                     "1": { | ||||
|                         "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": { | ||||
|                         "then": "Die Fitness-Station hat Trittsteine." | ||||
|                     }, | ||||
|  | @ -4804,6 +4804,9 @@ | |||
|                     "19": { | ||||
|                         "then": "Die Fitness-Station hat Kampfseile (battle ropes)." | ||||
|                     }, | ||||
|                     "2": { | ||||
|                         "then": "Die Fitness-Station hat eine Einrichtung für Sit-ups." | ||||
|                     }, | ||||
|                     "20": { | ||||
|                         "then": "Die Fitness-Station hat ein Fahrradergometer." | ||||
|                     }, | ||||
|  | @ -4818,6 +4821,27 @@ | |||
|                     }, | ||||
|                     "24": { | ||||
|                         "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?" | ||||
|  | @ -4880,6 +4904,9 @@ | |||
|             }, | ||||
|             "2": { | ||||
|                 "options": { | ||||
|                     "0": { | ||||
|                         "question": "Restaurants und Schnellimbissbetriebe" | ||||
|                     }, | ||||
|                     "1": { | ||||
|                         "question": "Nur Fastfood-Geschäfte" | ||||
|                     }, | ||||
|  | @ -4888,6 +4915,13 @@ | |||
|                     } | ||||
|                 } | ||||
|             }, | ||||
|             "3": { | ||||
|                 "options": { | ||||
|                     "0": { | ||||
|                         "question": "Hat ein vegetarisches Menü" | ||||
|                     } | ||||
|                 } | ||||
|             }, | ||||
|             "4": { | ||||
|                 "options": { | ||||
|                     "0": { | ||||
|  | @ -4927,6 +4961,21 @@ | |||
|                     "1": { | ||||
|                         "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": { | ||||
|                         "then": "Bietet vorwiegend Pastagerichte an" | ||||
|                     }, | ||||
|  | @ -4950,21 +4999,6 @@ | |||
|                     }, | ||||
|                     "9": { | ||||
|                         "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?", | ||||
|  | @ -5532,6 +5566,61 @@ | |||
|                 }, | ||||
|                 "question": "Wie lautet die Nummer dieses Raums?", | ||||
|                 "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": { | ||||
|  | @ -6183,6 +6272,19 @@ | |||
|                     } | ||||
|                 } | ||||
|             }, | ||||
|             "10": { | ||||
|                 "options": { | ||||
|                     "0": { | ||||
|                         "question": "Alle Notizen" | ||||
|                     }, | ||||
|                     "1": { | ||||
|                         "question": "Importnotizen ausblenden" | ||||
|                     }, | ||||
|                     "2": { | ||||
|                         "question": "Nur Importnotizen anzeigen" | ||||
|                     } | ||||
|                 } | ||||
|             }, | ||||
|             "2": { | ||||
|                 "options": { | ||||
|                     "0": { | ||||
|  | @ -6238,19 +6340,6 @@ | |||
|                         "question": "Nur offene Notizen anzeigen" | ||||
|                     } | ||||
|                 } | ||||
|             }, | ||||
|             "10": { | ||||
|                 "options": { | ||||
|                     "0": { | ||||
|                         "question": "Alle Notizen" | ||||
|                     }, | ||||
|                     "1": { | ||||
|                         "question": "Importnotizen ausblenden" | ||||
|                     }, | ||||
|                     "2": { | ||||
|                         "question": "Nur Importnotizen anzeigen" | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         }, | ||||
|         "name": "OpenStreetMap-Hinweise", | ||||
|  | @ -6579,6 +6668,21 @@ | |||
|                     "1": { | ||||
|                         "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": { | ||||
|                         "then": "Dies ist ein Behindertenstellplatz." | ||||
|                     }, | ||||
|  | @ -6602,21 +6706,6 @@ | |||
|                     }, | ||||
|                     "9": { | ||||
|                         "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?" | ||||
|  | @ -7629,30 +7718,6 @@ | |||
|                     "1": { | ||||
|                         "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": { | ||||
|                         "question": "Recycling von Glas" | ||||
|                     }, | ||||
|  | @ -7683,11 +7748,35 @@ | |||
|                     "19": { | ||||
|                         "question": "Recycling von Restabfällen" | ||||
|                     }, | ||||
|                     "2": { | ||||
|                         "question": "Recycling von Getränkekartons" | ||||
|                     }, | ||||
|                     "20": { | ||||
|                         "question": "Recycling von Druckerpatronen" | ||||
|                     }, | ||||
|                     "21": { | ||||
|                         "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": { | ||||
|                         "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": { | ||||
|                         "then": "Glas kann hier recycelt werden" | ||||
|                     }, | ||||
|  | @ -7809,6 +7874,9 @@ | |||
|                     "19": { | ||||
|                         "then": "Schuhe können hier recycelt werden" | ||||
|                     }, | ||||
|                     "2": { | ||||
|                         "then": "Dosen können hier recycelt werden" | ||||
|                     }, | ||||
|                     "20": { | ||||
|                         "then": "Elektrokleingeräte können hier recycelt werden" | ||||
|                     }, | ||||
|  | @ -7823,6 +7891,27 @@ | |||
|                     }, | ||||
|                     "24": { | ||||
|                         "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?" | ||||
|  | @ -8626,6 +8715,12 @@ | |||
|                     "1": { | ||||
|                         "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": { | ||||
|                         "then": "Diese Straßenlaterne verwendet Glühlampenlicht" | ||||
|                     }, | ||||
|  | @ -8649,12 +8744,6 @@ | |||
|                     }, | ||||
|                     "9": { | ||||
|                         "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?" | ||||
|  | @ -9748,6 +9837,27 @@ | |||
|                     "1": { | ||||
|                         "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": { | ||||
|                         "question": "Verkauf von Süßigkeiten" | ||||
|                     }, | ||||
|  | @ -9835,30 +9945,6 @@ | |||
|                     "1": { | ||||
|                         "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": { | ||||
|                         "then": "Brot wird verkauft" | ||||
|                     }, | ||||
|  | @ -9882,6 +9968,30 @@ | |||
|                     }, | ||||
|                     "21": { | ||||
|                         "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?", | ||||
|  |  | |||
|  | @ -4193,7 +4193,7 @@ | |||
|                         "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}" | ||||
|             }, | ||||
|             "sport_pitch-surface": { | ||||
|  |  | |||
|  | @ -775,6 +775,9 @@ | |||
|                     }, | ||||
|                     "6": { | ||||
|                         "then": "Keranjang sampah untuk plastik" | ||||
|                     }, | ||||
|                     "7": { | ||||
|                         "then": "Keranjang sampah untuk kertas" | ||||
|                     } | ||||
|                 }, | ||||
|                 "question": "Keranjang sampah macam apa ini?" | ||||
|  |  | |||
|  | @ -2731,6 +2731,9 @@ | |||
|                     }, | ||||
|                     "6": { | ||||
|                         "then": "Un cestino rifiuti per la plastica" | ||||
|                     }, | ||||
|                     "7": { | ||||
|                         "then": "Un cestino rifiuti per la carta" | ||||
|                     } | ||||
|                 }, | ||||
|                 "question": "Che tipo di cestino dei rifiuti è questo?" | ||||
|  |  | |||
|  | @ -55,10 +55,14 @@ export class NewGeometryFromChangesFeatureSource implements WritableFeatureSourc | |||
|      * @private | ||||
|      */ | ||||
|     private handleChange(change: ChangeDescription): boolean { | ||||
|         const backend = this._backend | ||||
|         const allElementStorage = this._allElementStorage | ||||
|         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 | ||||
|         } | ||||
| 
 | ||||
|         console.log("Handling pending change") | ||||
|         const allElementStorage = this._allElementStorage | ||||
|         console.log("Handling pending change", change) | ||||
|         if (change.id > 0) { | ||||
|             // This is an already existing 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.addNewFeature(feature) | ||||
|             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 { | ||||
|  | @ -151,7 +151,7 @@ export class NewGeometryFromChangesFeatureSource implements WritableFeatureSourc | |||
|                 continue | ||||
|             } | ||||
| 
 | ||||
|             somethingChanged ||= this.handleChange(change) | ||||
|             somethingChanged = this.handleChange(change) || somethingChanged // important: _first_ evaluate the method, to avoid shortcutting
 | ||||
|         } | ||||
|         if (somethingChanged) { | ||||
|             this.features.ping() | ||||
|  |  | |||
|  | @ -525,11 +525,14 @@ export class Changes { | |||
|                     pending = pending.map((ch) => ChangeDescriptionTools.rewriteIds(ch, remappings)) | ||||
|                     console.log("Result is", pending) | ||||
|                 } | ||||
| 
 | ||||
|                 const changes: { | ||||
|                     newObjects: OsmObject[] | ||||
|                     modifiedObjects: OsmObject[] | ||||
|                     deletedObjects: OsmObject[] | ||||
|                 } = self.CreateChangesetObjects(pending, objects) | ||||
| 
 | ||||
| 
 | ||||
|                 return Changes.createChangesetFor("" + csId, changes) | ||||
|             }, | ||||
|             metatags, | ||||
|  | @ -558,19 +561,8 @@ export class Changes { | |||
|             const successes = await Promise.all( | ||||
|                 Array.from(pendingPerTheme, async ([theme, pendingChanges]) => { | ||||
|                     try { | ||||
|                         const openChangeset = this.state.osmConnection | ||||
|                             .GetPreference("current-open-changeset-" + theme) | ||||
|                             .sync( | ||||
|                                 (str) => { | ||||
|                                     const n = Number(str) | ||||
|                                     if (isNaN(n)) { | ||||
|                                         return undefined | ||||
|                                     } | ||||
|                                     return n | ||||
|                                 }, | ||||
|                                 [], | ||||
|                                 (n) => "" + n | ||||
|                             ) | ||||
|                         const openChangeset = UIEventSource.asInt(this.state.osmConnection | ||||
|                             .GetPreference("current-open-changeset-" + theme)) | ||||
|                         console.log( | ||||
|                             "Using current-open-changeset-" + | ||||
|                                 theme + | ||||
|  |  | |||
|  | @ -1,9 +1,14 @@ | |||
| import { UIEventSource } from "../UIEventSource" | ||||
| import UserDetails, { OsmConnection } from "./OsmConnection" | ||||
| import { Utils } from "../../Utils" | ||||
| import { LocalStorageSource } from "../Web/LocalStorageSource"; | ||||
| 
 | ||||
| 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 auth: any | ||||
|     private userDetails: UIEventSource<UserDetails> | ||||
|  |  | |||
|  | @ -165,7 +165,7 @@ export default class FeatureSwitchState extends OsmConnectionFeatureSwitches { | |||
|             (urls) => urls?.join(",") | ||||
|         ) | ||||
| 
 | ||||
|         this.overpassTimeout = UIEventSource.asFloat( | ||||
|         this.overpassTimeout = UIEventSource.asInt( | ||||
|             QueryParameters.GetQueryParameter( | ||||
|                 "overpassTimeout", | ||||
|                 "" + layoutToUse?.overpassTimeout, | ||||
|  | @ -181,7 +181,7 @@ export default class FeatureSwitchState extends OsmConnectionFeatureSwitches { | |||
|             ) | ||||
|         ) | ||||
| 
 | ||||
|         this.osmApiTileSize = UIEventSource.asFloat( | ||||
|         this.osmApiTileSize = UIEventSource.asInt( | ||||
|             QueryParameters.GetQueryParameter( | ||||
|                 "osmApiTileSize", | ||||
|                 "" + layoutToUse?.osmApiTileSize, | ||||
|  |  | |||
|  | @ -1,28 +1,28 @@ | |||
| import { Utils } from "../Utils" | ||||
| import { Readable, Subscriber, Unsubscriber, Updater, Writable } from "svelte/store" | ||||
| import { Utils } from "../Utils"; | ||||
| import { Readable, Subscriber, Unsubscriber, Updater, Writable } from "svelte/store"; | ||||
| 
 | ||||
| /** | ||||
|  * Various static utils | ||||
|  */ | ||||
| export class Stores { | ||||
|     public static Chronic(millis: number, asLong: () => boolean = undefined): Store<Date> { | ||||
|         const source = new UIEventSource<Date>(undefined) | ||||
|         const source = new UIEventSource<Date>(undefined); | ||||
| 
 | ||||
|         function run() { | ||||
|             source.setData(new Date()) | ||||
|             source.setData(new Date()); | ||||
|             if (asLong === undefined || asLong()) { | ||||
|                 window.setTimeout(run, millis) | ||||
|                 window.setTimeout(run, millis); | ||||
|             } | ||||
|         } | ||||
| 
 | ||||
|         run() | ||||
|         return source | ||||
|         run(); | ||||
|         return source; | ||||
|     } | ||||
| 
 | ||||
|     public static FromPromiseWithErr<T>( | ||||
|         promise: Promise<T> | ||||
|     ): Store<{ success: T } | { error: any }> { | ||||
|         return UIEventSource.FromPromiseWithErr(promise) | ||||
|         return UIEventSource.FromPromiseWithErr(promise); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|  | @ -32,14 +32,14 @@ export class Stores { | |||
|      * @constructor | ||||
|      */ | ||||
|     public static FromPromise<T>(promise: Promise<T>): Store<T> { | ||||
|         const src = new UIEventSource<T>(undefined) | ||||
|         promise?.then((d) => src.setData(d)) | ||||
|         promise?.catch((err) => console.warn("Promise failed:", err)) | ||||
|         return src | ||||
|         const src = new UIEventSource<T>(undefined); | ||||
|         promise?.then((d) => src.setData(d)); | ||||
|         promise?.catch((err) => console.warn("Promise failed:", err)); | ||||
|         return src; | ||||
|     } | ||||
| 
 | ||||
|     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 | ||||
|      */ | ||||
|     public static ListStabilized<T>(src: Store<T[]>): Store<T[]> { | ||||
|         const stable = new UIEventSource<T[]>(undefined) | ||||
|         const stable = new UIEventSource<T[]>(undefined); | ||||
|         src.addCallbackAndRun((list) => { | ||||
|             if (list === undefined) { | ||||
|                 stable.setData(undefined) | ||||
|                 return | ||||
|                 stable.setData(undefined); | ||||
|                 return; | ||||
|             } | ||||
|             if (Utils.sameList(stable.data, list)) { | ||||
|                 return | ||||
|                 return; | ||||
|             } | ||||
|             stable.setData(list) | ||||
|         }) | ||||
|         return stable | ||||
|             stable.setData(list); | ||||
|         }); | ||||
|         return stable; | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| 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 | ||||
|      */ | ||||
|     public readonly tag: string | undefined | ||||
|     public readonly tag: string | undefined; | ||||
| 
 | ||||
|     constructor(tag: string = undefined) { | ||||
|         this.tag = tag | ||||
|         this.tag = tag; | ||||
|         if (tag === undefined || tag === "") { | ||||
|             let createStack = Utils.runningFromConsole | ||||
|             let createStack = Utils.runningFromConsole; | ||||
|             if (!Utils.runningFromConsole) { | ||||
|                 createStack = window.location.hostname === "127.0.0.1" | ||||
|                 createStack = window.location.hostname === "127.0.0.1"; | ||||
|             } | ||||
|             if (createStack) { | ||||
|                 const callstack = new Error().stack.split("\n") | ||||
|                 this.tag = callstack[1] | ||||
|                 const callstack = new Error().stack.split("\n"); | ||||
|                 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> { | ||||
|         return this.map((t) => { | ||||
|             if (t === undefined) { | ||||
|                 return undefined | ||||
|                 return undefined; | ||||
|             } | ||||
|             if (t === null) { | ||||
|                 return null | ||||
|                 return null; | ||||
|             } | ||||
|             return f(t) | ||||
|         }, extraStoresToWatch) | ||||
|             return f(t); | ||||
|         }, extraStoresToWatch); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|  | @ -135,17 +135,17 @@ export abstract class Store<T> implements Readable<T> { | |||
|     public withEqualityStabilized( | ||||
|         comparator: (t: T | undefined, t1: T | undefined) => boolean | ||||
|     ): Store<T> { | ||||
|         let oldValue = undefined | ||||
|         let oldValue = undefined; | ||||
|         return this.map((v) => { | ||||
|             if (v == oldValue) { | ||||
|                 return oldValue | ||||
|                 return oldValue; | ||||
|             } | ||||
|             if (comparator(oldValue, v)) { | ||||
|                 return oldValue | ||||
|                 return oldValue; | ||||
|             } | ||||
|             oldValue = v | ||||
|             return v | ||||
|         }) | ||||
|             oldValue = v; | ||||
|             return v; | ||||
|         }); | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|  | @ -195,49 +195,49 @@ export abstract class Store<T> implements Readable<T> { | |||
|      * lastValue // => "def"
 | ||||
|      */ | ||||
|     public bind<X>(f: (t: T) => Store<X>): Store<X> { | ||||
|         const mapped = this.map(f) | ||||
|         const sink = new UIEventSource<X>(undefined) | ||||
|         const seenEventSources = new Set<Store<X>>() | ||||
|         const mapped = this.map(f); | ||||
|         const sink = new UIEventSource<X>(undefined); | ||||
|         const seenEventSources = new Set<Store<X>>(); | ||||
|         mapped.addCallbackAndRun((newEventSource) => { | ||||
|             if (newEventSource === null) { | ||||
|                 sink.setData(null) | ||||
|                 sink.setData(null); | ||||
|             } else if (newEventSource === undefined) { | ||||
|                 sink.setData(undefined) | ||||
|                 sink.setData(undefined); | ||||
|             } else if (!seenEventSources.has(newEventSource)) { | ||||
|                 seenEventSources.add(newEventSource) | ||||
|                 seenEventSources.add(newEventSource); | ||||
|                 newEventSource.addCallbackAndRun((resultData) => { | ||||
|                     if (mapped.data === newEventSource) { | ||||
|                         sink.setData(resultData) | ||||
|                         sink.setData(resultData); | ||||
|                     } | ||||
|                 }) | ||||
|                 }); | ||||
|             } else { | ||||
|                 // 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> { | ||||
|         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) => { | ||||
|             window.setTimeout(() => { | ||||
|                 if (self.data == latestData) { | ||||
|                     // compare by reference.
 | ||||
|                     // 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 | ||||
|      */ | ||||
|     public AsPromise(condition?: (t: T) => boolean): Promise<T> { | ||||
|         const self = this | ||||
|         condition = condition ?? ((t) => t !== undefined) | ||||
|         const self = this; | ||||
|         condition = condition ?? ((t) => t !== undefined); | ||||
|         return new Promise((resolve) => { | ||||
|             const data = self.data | ||||
|             const data = self.data; | ||||
|             if (condition(data)) { | ||||
|                 resolve(data) | ||||
|                 resolve(data); | ||||
|             } else { | ||||
|                 self.addCallbackD((data) => { | ||||
|                     if (condition(data)) { | ||||
|                         resolve(data) | ||||
|                         return true // return true to unregister as we only need to be called once
 | ||||
|                         resolve(data); | ||||
|                         return true; // return true to unregister as we only need to be called once
 | ||||
|                     } 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
 | ||||
|         return this.addCallbackAndRun((v) => { | ||||
|             run(v) | ||||
|         }) | ||||
|             run(v); | ||||
|         }); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| export class ImmutableStore<T> extends Store<T> { | ||||
|     public readonly data: T | ||||
|     public readonly data: T; | ||||
| 
 | ||||
|     constructor(data: T) { | ||||
|         super() | ||||
|         this.data = data | ||||
|         super(); | ||||
|         this.data = data; | ||||
|     } | ||||
| 
 | ||||
|     private static readonly pass: () => void = () => {} | ||||
|     private static readonly pass: () => void = () => { | ||||
|     }; | ||||
| 
 | ||||
|     addCallback(_: (data: T) => void): () => void { | ||||
|         // pass: data will never change
 | ||||
|         return ImmutableStore.pass | ||||
|         return ImmutableStore.pass; | ||||
|     } | ||||
| 
 | ||||
|     addCallbackAndRun(callback: (data: T) => void): () => void { | ||||
|         callback(this.data) | ||||
|         callback(this.data); | ||||
|         // no callback registry: data will never change
 | ||||
|         return ImmutableStore.pass | ||||
|         return ImmutableStore.pass; | ||||
|     } | ||||
| 
 | ||||
|     addCallbackAndRunD(callback: (data: T) => void): () => void { | ||||
|         if (this.data !== undefined) { | ||||
|             callback(this.data) | ||||
|             callback(this.data); | ||||
|         } | ||||
|         // no callback registry: data will never change
 | ||||
|         return ImmutableStore.pass | ||||
|         return ImmutableStore.pass; | ||||
|     } | ||||
| 
 | ||||
|     addCallbackD(_: (data: T) => void): () => void { | ||||
|         // pass: data will never change
 | ||||
|         return ImmutableStore.pass | ||||
|         return ImmutableStore.pass; | ||||
|     } | ||||
| 
 | ||||
|     map<J>(f: (t: T) => J, extraStores: Store<any>[] = undefined): ImmutableStore<J> { | ||||
|         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 | ||||
|  */ | ||||
| class ListenerTracker<T> { | ||||
|     public pingCount = 0 | ||||
|     private readonly _callbacks: ((t: T) => boolean | void | any)[] = [] | ||||
|     public pingCount = 0; | ||||
|     private readonly _callbacks: ((t: T) => boolean | void | any)[] = []; | ||||
| 
 | ||||
|     /** | ||||
|      * 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 { | ||||
|         if (callback === console.log) { | ||||
|             // 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!
 | ||||
|         return () => { | ||||
|             const index = this._callbacks.indexOf(callback) | ||||
|             const index = this._callbacks.indexOf(callback); | ||||
|             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 | ||||
|      */ | ||||
|     public ping(data: T): number { | ||||
|         this.pingCount++ | ||||
|         let toDelete = undefined | ||||
|         let startTime = new Date().getTime() / 1000 | ||||
|         this.pingCount++; | ||||
|         let toDelete = undefined; | ||||
|         let startTime = new Date().getTime() / 1000; | ||||
|         for (const callback of this._callbacks) { | ||||
|             try { | ||||
|                 if (callback(data) === true) { | ||||
|                     // This callback wants to be deleted
 | ||||
|                     // Note: it has to return precisely true in order to avoid accidental deletions
 | ||||
|                     if (toDelete === undefined) { | ||||
|                         toDelete = [callback] | ||||
|                         toDelete = [callback]; | ||||
|                     } else { | ||||
|                         toDelete.push(callback) | ||||
|                         toDelete.push(callback); | ||||
|                     } | ||||
|                 } | ||||
|             } 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) { | ||||
|             console.trace( | ||||
|                 "Warning: a ping took more then 500ms; this is probably a performance issue" | ||||
|             ) | ||||
|             ); | ||||
|         } | ||||
|         if (toDelete !== undefined) { | ||||
|             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() { | ||||
|         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. | ||||
|  */ | ||||
| class MappedStore<TIn, T> extends Store<T> { | ||||
|     private static readonly pass: () => {} | ||||
|     private readonly _upstream: Store<TIn> | ||||
|     private readonly _upstreamCallbackHandler: ListenerTracker<TIn> | undefined | ||||
|     private _upstreamPingCount: number = -1 | ||||
|     private _unregisterFromUpstream: () => void | ||||
|     private readonly _f: (t: TIn) => T | ||||
|     private readonly _extraStores: Store<any>[] | undefined | ||||
|     private _unregisterFromExtraStores: (() => void)[] | undefined | ||||
|     private _callbacks: ListenerTracker<T> = new ListenerTracker<T>() | ||||
|     private _callbacksAreRegistered = false | ||||
|     private static readonly pass: () => {}; | ||||
|     private readonly _upstream: Store<TIn>; | ||||
|     private readonly _upstreamCallbackHandler: ListenerTracker<TIn> | undefined; | ||||
|     private _upstreamPingCount: number = -1; | ||||
|     private _unregisterFromUpstream: () => void; | ||||
|     private readonly _f: (t: TIn) => T; | ||||
|     private readonly _extraStores: Store<any>[] | undefined; | ||||
|     private _unregisterFromExtraStores: (() => void)[] | undefined; | ||||
|     private _callbacks: ListenerTracker<T> = new ListenerTracker<T>(); | ||||
|     private _callbacksAreRegistered = false; | ||||
| 
 | ||||
|     constructor( | ||||
|         upstream: Store<TIn>, | ||||
|  | @ -413,20 +414,20 @@ class MappedStore<TIn, T> extends Store<T> { | |||
|         initialState: T, | ||||
|         onDestroy?: (f: () => void) => void | ||||
|     ) { | ||||
|         super() | ||||
|         this._upstream = upstream | ||||
|         this._upstreamCallbackHandler = upstreamListenerHandler | ||||
|         this._f = f | ||||
|         this._data = initialState | ||||
|         this._upstreamPingCount = upstreamListenerHandler?.pingCount | ||||
|         this._extraStores = extraStores | ||||
|         this.registerCallbacksToUpstream() | ||||
|         super(); | ||||
|         this._upstream = upstream; | ||||
|         this._upstreamCallbackHandler = upstreamListenerHandler; | ||||
|         this._f = f; | ||||
|         this._data = initialState; | ||||
|         this._upstreamPingCount = upstreamListenerHandler?.pingCount; | ||||
|         this._extraStores = extraStores; | ||||
|         this.registerCallbacksToUpstream(); | ||||
|         if (onDestroy !== undefined) { | ||||
|             onDestroy(() => this.unregisterFromUpstream()) | ||||
|             onDestroy(() => this.unregisterFromUpstream()); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     private _data: T | ||||
|     private _data: T; | ||||
| 
 | ||||
|     /** | ||||
|      * 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
 | ||||
|             if (this._upstreamCallbackHandler?.pingCount != this._upstreamPingCount) { | ||||
|                 // 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> { | ||||
|         let stores: Store<any>[] = undefined | ||||
|         let stores: Store<any>[] = undefined; | ||||
|         if (extraStores?.length > 0 || this._extraStores?.length > 0) { | ||||
|             stores = [] | ||||
|             stores = []; | ||||
|         } | ||||
|         if (extraStores?.length > 0) { | ||||
|             stores.push(...extraStores) | ||||
|             stores.push(...extraStores); | ||||
|         } | ||||
|         if (this._extraStores?.length > 0) { | ||||
|             this._extraStores?.forEach((store) => { | ||||
|                 if (stores.indexOf(store) < 0) { | ||||
|                     stores.push(store) | ||||
|                     stores.push(store); | ||||
|                 } | ||||
|             }) | ||||
|             }); | ||||
|         } | ||||
|         return new MappedStore( | ||||
|             this, | ||||
|  | @ -470,111 +471,111 @@ class MappedStore<TIn, T> extends Store<T> { | |||
|             stores, | ||||
|             this._callbacks, | ||||
|             f(this.data) | ||||
|         ) | ||||
|         ); | ||||
|     } | ||||
| 
 | ||||
|     addCallback(callback: (data: T) => any | boolean | void): () => void { | ||||
|         if (!this._callbacksAreRegistered) { | ||||
|             // This is the first callback that is added
 | ||||
|             // 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 () => { | ||||
|             unregister() | ||||
|             unregister(); | ||||
|             if (this._callbacks.length() == 0) { | ||||
|                 this.unregisterFromUpstream() | ||||
|                 this.unregisterFromUpstream(); | ||||
|             } | ||||
|         } | ||||
|         }; | ||||
|     } | ||||
| 
 | ||||
|     addCallbackAndRun(callback: (data: T) => any | boolean | void): () => void { | ||||
|         const unregister = this.addCallback(callback) | ||||
|         const doRemove = callback(this.data) | ||||
|         const unregister = this.addCallback(callback); | ||||
|         const doRemove = callback(this.data); | ||||
|         if (doRemove === true) { | ||||
|             unregister() | ||||
|             return MappedStore.pass | ||||
|             unregister(); | ||||
|             return MappedStore.pass; | ||||
|         } | ||||
|         return unregister | ||||
|         return unregister; | ||||
|     } | ||||
| 
 | ||||
|     addCallbackAndRunD(callback: (data: T) => any | boolean | void): () => void { | ||||
|         return this.addCallbackAndRun((data) => { | ||||
|             if (data !== undefined) { | ||||
|                 return callback(data) | ||||
|                 return callback(data); | ||||
|             } | ||||
|         }) | ||||
|         }); | ||||
|     } | ||||
| 
 | ||||
|     addCallbackD(callback: (data: T) => any | boolean | void): () => void { | ||||
|         return this.addCallback((data) => { | ||||
|             if (data !== undefined) { | ||||
|                 return callback(data) | ||||
|                 return callback(data); | ||||
|             } | ||||
|         }) | ||||
|         }); | ||||
|     } | ||||
| 
 | ||||
|     private unregisterFromUpstream() { | ||||
|         console.debug("Unregistering callbacks for", this.tag) | ||||
|         this._callbacksAreRegistered = false | ||||
|         this._unregisterFromUpstream() | ||||
|         this._unregisterFromExtraStores?.forEach((unr) => unr()) | ||||
|         console.debug("Unregistering callbacks for", this.tag); | ||||
|         this._callbacksAreRegistered = false; | ||||
|         this._unregisterFromUpstream(); | ||||
|         this._unregisterFromExtraStores?.forEach((unr) => unr()); | ||||
|     } | ||||
| 
 | ||||
|     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) => | ||||
|             store?.addCallback((_) => self.update()) | ||||
|         ) | ||||
|         this._callbacksAreRegistered = true | ||||
|         ); | ||||
|         this._callbacksAreRegistered = true; | ||||
|     } | ||||
| 
 | ||||
|     private update(): void { | ||||
|         const newData = this._f(this._upstream.data) | ||||
|         this._upstreamPingCount = this._upstreamCallbackHandler?.pingCount | ||||
|         const newData = this._f(this._upstream.data); | ||||
|         this._upstreamPingCount = this._upstreamCallbackHandler?.pingCount; | ||||
|         if (this._data == newData) { | ||||
|             return | ||||
|             return; | ||||
|         } | ||||
|         this._data = newData | ||||
|         this._callbacks.ping(this._data) | ||||
|         this._data = newData; | ||||
|         this._callbacks.ping(this._data); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| export class UIEventSource<T> extends Store<T> implements Writable<T> { | ||||
|     private static readonly pass: () => {} | ||||
|     public data: T | ||||
|     _callbacks: ListenerTracker<T> = new ListenerTracker<T>() | ||||
|     private static readonly pass: () => {}; | ||||
|     public data: T; | ||||
|     _callbacks: ListenerTracker<T> = new ListenerTracker<T>(); | ||||
| 
 | ||||
|     constructor(data: T, tag: string = "") { | ||||
|         super(tag) | ||||
|         this.data = data | ||||
|         super(tag); | ||||
|         this.data = data; | ||||
|     } | ||||
| 
 | ||||
|     public static flatten<X>( | ||||
|         source: Store<Store<X>>, | ||||
|         possibleSources?: Store<any>[] | ||||
|     ): UIEventSource<X> { | ||||
|         const sink = new UIEventSource<X>(source.data?.data) | ||||
|         const sink = new UIEventSource<X>(source.data?.data); | ||||
| 
 | ||||
|         source.addCallback((latestData) => { | ||||
|             sink.setData(latestData?.data) | ||||
|             sink.setData(latestData?.data); | ||||
|             latestData.addCallback((data) => { | ||||
|                 if (source.data !== latestData) { | ||||
|                     return true | ||||
|                     return true; | ||||
|                 } | ||||
|                 sink.setData(data) | ||||
|             }) | ||||
|         }) | ||||
|                 sink.setData(data); | ||||
|             }); | ||||
|         }); | ||||
| 
 | ||||
|         for (const possibleSource of possibleSources ?? []) { | ||||
|             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>, | ||||
|         onError: (e: any) => void = undefined | ||||
|     ): UIEventSource<T> { | ||||
|         const src = new UIEventSource<T>(undefined) | ||||
|         promise?.then((d) => src.setData(d)) | ||||
|         const src = new UIEventSource<T>(undefined); | ||||
|         promise?.then((d) => src.setData(d)); | ||||
|         promise?.catch((err) => { | ||||
|             if (onError !== undefined) { | ||||
|                 onError(err) | ||||
|                 onError(err); | ||||
|             } 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>( | ||||
|         promise: Promise<T> | ||||
|     ): UIEventSource<{ success: T } | { error: any }> { | ||||
|         const src = new UIEventSource<{ success: T } | { error: any }>(undefined) | ||||
|         promise?.then((d) => src.setData({ success: d })) | ||||
|         promise?.catch((err) => src.setData({ error: err })) | ||||
|         return src | ||||
|         const src = new UIEventSource<{ success: T } | { error: any }>(undefined); | ||||
|         promise?.then((d) => src.setData({ success: d })); | ||||
|         promise?.catch((err) => src.setData({ error: err })); | ||||
|         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( | ||||
|             (str) => { | ||||
|                 let parsed = parseFloat(str) | ||||
|                 return isNaN(parsed) ? undefined : parsed | ||||
|                 let parsed = parseInt(str); | ||||
|                 return isNaN(parsed) ? undefined : parsed; | ||||
|             }, | ||||
|             [], | ||||
|             (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>) { | ||||
|  | @ -633,7 +676,7 @@ export class UIEventSource<T> extends Store<T> implements Writable<T> { | |||
|             (str) => str === "true", | ||||
|             [], | ||||
|             (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 | ||||
|      */ | ||||
|     static feedFrom<T>(store: Store<T>): UIEventSource<T> { | ||||
|         const src = new UIEventSource(store.data) | ||||
|         store.addCallback((t) => src.setData(t)) | ||||
|         return src | ||||
|         const src = new UIEventSource(store.data); | ||||
|         store.addCallback((t) => src.setData(t)); | ||||
|         return src; | ||||
|     } | ||||
| 
 | ||||
|     /** | ||||
|  | @ -653,46 +696,46 @@ export class UIEventSource<T> extends Store<T> implements Writable<T> { | |||
|      * @param callback | ||||
|      */ | ||||
|     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 { | ||||
|         const doDeleteCallback = callback(this.data) | ||||
|         const doDeleteCallback = callback(this.data); | ||||
|         if (doDeleteCallback !== true) { | ||||
|             return this.addCallback(callback) | ||||
|             return this.addCallback(callback); | ||||
|         } else { | ||||
|             return UIEventSource.pass | ||||
|             return UIEventSource.pass; | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     public addCallbackAndRunD(callback: (data: T) => void): () => void { | ||||
|         return this.addCallbackAndRun((data) => { | ||||
|             if (data !== undefined && data !== null) { | ||||
|                 return callback(data) | ||||
|                 return callback(data); | ||||
|             } | ||||
|         }) | ||||
|         }); | ||||
|     } | ||||
| 
 | ||||
|     public addCallbackD(callback: (data: T) => void): () => void { | ||||
|         return this.addCallback((data) => { | ||||
|             if (data !== undefined && data !== null) { | ||||
|                 return callback(data) | ||||
|                 return callback(data); | ||||
|             } | ||||
|         }) | ||||
|         }); | ||||
|     } | ||||
| 
 | ||||
|     public setData(t: T): UIEventSource<T> { | ||||
|         if (this.data == t) { | ||||
|             // MUST COMPARE BY REFERENCE!
 | ||||
|             return | ||||
|             return; | ||||
|         } | ||||
|         this.data = t | ||||
|         this._callbacks.ping(t) | ||||
|         return this | ||||
|         this.data = t; | ||||
|         this._callbacks.ping(t); | ||||
|         return this; | ||||
|     } | ||||
| 
 | ||||
|     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>[] = [], | ||||
|         onDestroy?: (f: () => void) => void | ||||
|     ): 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, | ||||
|             (t) => { | ||||
|                 if (t === undefined) { | ||||
|                     return undefined | ||||
|                     return undefined; | ||||
|                 } | ||||
|                 return f(t) | ||||
|                 return f(t); | ||||
|             }, | ||||
|             extraSources, | ||||
|             this._callbacks, | ||||
|             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, | ||||
|         allowUnregister = false | ||||
|     ): UIEventSource<J> { | ||||
|         const self = this | ||||
|         const self = this; | ||||
| 
 | ||||
|         const stack = new Error().stack.split("\n") | ||||
|         const callee = stack[1] | ||||
|         const stack = new Error().stack.split("\n"); | ||||
|         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 () { | ||||
|             newSource.setData(f(self.data)) | ||||
|             return allowUnregister && newSource._callbacks.length() === 0 | ||||
|         } | ||||
|         const update = function() { | ||||
|             newSource.setData(f(self.data)); | ||||
|             return allowUnregister && newSource._callbacks.length() === 0; | ||||
|         }; | ||||
| 
 | ||||
|         this.addCallback(update) | ||||
|         this.addCallback(update); | ||||
|         for (const extraSource of extraSources) { | ||||
|             extraSource?.addCallback(update) | ||||
|             extraSource?.addCallback(update); | ||||
|         } | ||||
| 
 | ||||
|         if (g !== undefined) { | ||||
|             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> { | ||||
|         this.addCallback((latest) => otherSource.setData(latest)) | ||||
|         const self = this | ||||
|         otherSource.addCallback((latest) => self.setData(latest)) | ||||
|         this.addCallback((latest) => otherSource.setData(latest)); | ||||
|         const self = this; | ||||
|         otherSource.addCallback((latest) => self.setData(latest)); | ||||
|         if (reverseOverride) { | ||||
|             if (otherSource.data !== undefined) { | ||||
|                 this.setData(otherSource.data) | ||||
|                 this.setData(otherSource.data); | ||||
|             } | ||||
|         } else if (this.data === undefined) { | ||||
|             this.setData(otherSource.data) | ||||
|             this.setData(otherSource.data); | ||||
|         } else { | ||||
|             otherSource.setData(this.data) | ||||
|             otherSource.setData(this.data); | ||||
|         } | ||||
|         return this | ||||
|         return this; | ||||
|     } | ||||
| 
 | ||||
|     set(value: T): void { | ||||
|         this.setData(value) | ||||
|         this.setData(value); | ||||
|     } | ||||
| 
 | ||||
|     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 type { Map as MlMap } from "maplibre-gl"; | ||||
| import { GeoJSONSource, Marker } from "maplibre-gl"; | ||||
| import { ShowDataLayerOptions } from "./ShowDataLayerOptions"; | ||||
| import { GeoOperations } from "../../Logic/GeoOperations"; | ||||
| import LayerConfig from "../../Models/ThemeConfig/LayerConfig"; | ||||
| import PointRenderingConfig from "../../Models/ThemeConfig/PointRenderingConfig"; | ||||
| import { OsmTags } from "../../Models/OsmFeature"; | ||||
| import { FeatureSource, FeatureSourceForLayer } from "../../Logic/FeatureSource/FeatureSource"; | ||||
| import { BBox } from "../../Logic/BBox"; | ||||
| import { Feature, Point } from "geojson"; | ||||
| import LineRenderingConfig from "../../Models/ThemeConfig/LineRenderingConfig"; | ||||
| import { Utils } from "../../Utils"; | ||||
| import * as range_layer from "../../../assets/layers/range/range.json"; | ||||
| import { LayerConfigJson } from "../../Models/ThemeConfig/Json/LayerConfigJson"; | ||||
| import PerLayerFeatureSourceSplitter from "../../Logic/FeatureSource/PerLayerFeatureSourceSplitter"; | ||||
| import FilteredLayer from "../../Models/FilteredLayer"; | ||||
| import SimpleFeatureSource from "../../Logic/FeatureSource/Sources/SimpleFeatureSource"; | ||||
| import { ImmutableStore, Store, UIEventSource } from "../../Logic/UIEventSource" | ||||
| import type { Map as MlMap } from "maplibre-gl" | ||||
| import { GeoJSONSource, Marker } from "maplibre-gl" | ||||
| import { ShowDataLayerOptions } from "./ShowDataLayerOptions" | ||||
| import { GeoOperations } from "../../Logic/GeoOperations" | ||||
| import LayerConfig from "../../Models/ThemeConfig/LayerConfig" | ||||
| import PointRenderingConfig from "../../Models/ThemeConfig/PointRenderingConfig" | ||||
| import { OsmTags } from "../../Models/OsmFeature" | ||||
| import { FeatureSource, FeatureSourceForLayer } from "../../Logic/FeatureSource/FeatureSource" | ||||
| import { BBox } from "../../Logic/BBox" | ||||
| import { Feature, Point } from "geojson" | ||||
| import LineRenderingConfig from "../../Models/ThemeConfig/LineRenderingConfig" | ||||
| import { Utils } from "../../Utils" | ||||
| import * as range_layer from "../../../assets/layers/range/range.json" | ||||
| import { LayerConfigJson } from "../../Models/ThemeConfig/Json/LayerConfigJson" | ||||
| import PerLayerFeatureSourceSplitter from "../../Logic/FeatureSource/PerLayerFeatureSourceSplitter" | ||||
| import FilteredLayer from "../../Models/FilteredLayer" | ||||
| import SimpleFeatureSource from "../../Logic/FeatureSource/Sources/SimpleFeatureSource" | ||||
| 
 | ||||
| class PointRenderingLayer { | ||||
|     private readonly _config: PointRenderingConfig | ||||
|  | @ -289,16 +289,16 @@ class LineRenderingLayer { | |||
|         { | ||||
|             // Add source to the map or update the feature source
 | ||||
|             if (src === undefined) { | ||||
|                 this.currentSourceData = features; | ||||
|                 this.currentSourceData = features | ||||
|                 map.addSource(this._layername, { | ||||
|                     type: "geojson", | ||||
|                     data: { | ||||
|                         type: "FeatureCollection", | ||||
|                         features | ||||
|                         features, | ||||
|                     }, | ||||
|                     promoteId: "id" | ||||
|                 }); | ||||
|                 const linelayer = this._layername + "_line"; | ||||
|                     promoteId: "id", | ||||
|                 }) | ||||
|                 const linelayer = this._layername + "_line" | ||||
|                 map.addLayer({ | ||||
|                     source: this._layername, | ||||
|                     id: linelayer, | ||||
|  | @ -307,12 +307,12 @@ class LineRenderingLayer { | |||
|                         "line-color": ["feature-state", "color"], | ||||
|                         "line-opacity": ["feature-state", "color-opacity"], | ||||
|                         "line-width": ["feature-state", "width"], | ||||
|                         "line-offset": ["feature-state", "offset"] | ||||
|                         "line-offset": ["feature-state", "offset"], | ||||
|                     }, | ||||
|                     layout: { | ||||
|                         "line-cap": "round" | ||||
|                     } | ||||
|                 }); | ||||
|                         "line-cap": "round", | ||||
|                     }, | ||||
|                 }) | ||||
| 
 | ||||
|                 for (const feature of features) { | ||||
|                     if(!feature.properties.id){ | ||||
|  | @ -327,10 +327,10 @@ class LineRenderingLayer { | |||
| 
 | ||||
|                 map.on("click", linelayer, (e) => { | ||||
|                     // line-layer-listener
 | ||||
|                     e.originalEvent["consumed"] = true; | ||||
|                     this._onClick(e.features[0]); | ||||
|                 }); | ||||
|                 const polylayer = this._layername + "_polygon"; | ||||
|                     e.originalEvent["consumed"] = true | ||||
|                     this._onClick(e.features[0]) | ||||
|                 }) | ||||
|                 const polylayer = this._layername + "_polygon" | ||||
| 
 | ||||
|                 map.addLayer({ | ||||
|                     source: this._layername, | ||||
|  | @ -340,40 +340,40 @@ class LineRenderingLayer { | |||
|                     layout: {}, | ||||
|                     paint: { | ||||
|                         "fill-color": ["feature-state", "fillColor"], | ||||
|                         "fill-opacity": ["feature-state", "fillColor-opacity"] | ||||
|                     } | ||||
|                 }); | ||||
|                         "fill-opacity": ["feature-state", "fillColor-opacity"], | ||||
|                     }, | ||||
|                 }) | ||||
|                 if (this._onClick) { | ||||
|                     map.on("click", polylayer, (e) => { | ||||
|                         // polygon-layer-listener
 | ||||
|                         if (e.originalEvent["consumed"]) { | ||||
|                             // This is a polygon beneath a marker, we can ignore it
 | ||||
|                             return; | ||||
|                             return | ||||
|                         } | ||||
|                         e.originalEvent["consumed"] = true; | ||||
|                         this._onClick(e.features[0]); | ||||
|                     }); | ||||
|                         e.originalEvent["consumed"] = true | ||||
|                         this._onClick(e.features[0]) | ||||
|                     }) | ||||
|                 } | ||||
| 
 | ||||
|                 this._visibility?.addCallbackAndRunD((visible) => { | ||||
|                     try { | ||||
|                         map.setLayoutProperty(linelayer, "visibility", visible ? "visible" : "none"); | ||||
|                         map.setLayoutProperty(polylayer, "visibility", visible ? "visible" : "none"); | ||||
|                         map.setLayoutProperty(linelayer, "visibility", visible ? "visible" : "none") | ||||
|                         map.setLayoutProperty(polylayer, "visibility", visible ? "visible" : "none") | ||||
|                     } catch (e) { | ||||
|                         console.warn( | ||||
|                             "Error while setting visibility of layers ", | ||||
|                             linelayer, | ||||
|                             polylayer, | ||||
|                             e | ||||
|                         ); | ||||
|                         ) | ||||
|                     } | ||||
|                 }); | ||||
|                 }) | ||||
|             } else { | ||||
|                 this.currentSourceData = features; | ||||
|                 this.currentSourceData = features | ||||
|                 src.setData({ | ||||
|                     type: "FeatureCollection", | ||||
|                     features: this.currentSourceData | ||||
|                 }); | ||||
|                     features: this.currentSourceData, | ||||
|                 }) | ||||
|             } | ||||
|         } | ||||
|         for (let i = 0; i < features.length; i++) { | ||||
|  | @ -407,7 +407,7 @@ class LineRenderingLayer { | |||
|                   this.calculatePropsFor(feature.properties) | ||||
|                 ) | ||||
|                 tags.addCallbackD((properties) => { | ||||
|                     if(!map.getLayer(this._layername)){ | ||||
|                     if (!map.getLayer(this._layername)) { | ||||
|                         return | ||||
|                     } | ||||
|                     map.setFeatureState( | ||||
|  |  | |||
|  | @ -50,6 +50,9 @@ | |||
|   $: isHardDelete = changedProperties[DeleteConfig.deleteReasonKey] !== undefined | ||||
| 
 | ||||
|   async function onDelete() { | ||||
|     if(selectedTags === undefined){ | ||||
|       return | ||||
|     } | ||||
|     currentState = "applying" | ||||
|     let actionToTake: OsmChangeAction | ||||
|     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": [ | ||||
|     { | ||||
|       "commits": 6039, | ||||
|       "commits": 6055, | ||||
|       "contributor": "Pieter Vander Vennet" | ||||
|     }, | ||||
|     { | ||||
|       "commits": 408, | ||||
|       "commits": 414, | ||||
|       "contributor": "Robin van der Linde" | ||||
|     }, | ||||
|     { | ||||
|  | @ -52,6 +52,10 @@ | |||
|       "commits": 24, | ||||
|       "contributor": "Ward" | ||||
|     }, | ||||
|     { | ||||
|       "commits": 21, | ||||
|       "contributor": "dependabot[bot]" | ||||
|     }, | ||||
|     { | ||||
|       "commits": 21, | ||||
|       "contributor": "wjtje" | ||||
|  | @ -60,10 +64,6 @@ | |||
|       "commits": 21, | ||||
|       "contributor": "AlexanderRebai" | ||||
|     }, | ||||
|     { | ||||
|       "commits": 20, | ||||
|       "contributor": "dependabot[bot]" | ||||
|     }, | ||||
|     { | ||||
|       "commits": 19, | ||||
|       "contributor": "Niels Elgaard Larsen" | ||||
|  | @ -106,11 +106,11 @@ | |||
|     }, | ||||
|     { | ||||
|       "commits": 11, | ||||
|       "contributor": "RobJN" | ||||
|       "contributor": "Thibault Molleman" | ||||
|     }, | ||||
|     { | ||||
|       "commits": 10, | ||||
|       "contributor": "Thibault Molleman" | ||||
|       "commits": 11, | ||||
|       "contributor": "RobJN" | ||||
|     }, | ||||
|     { | ||||
|       "commits": 10, | ||||
|  |  | |||
|  | @ -1,7 +1,7 @@ | |||
| { | ||||
|   "contributors": [ | ||||
|     { | ||||
|       "commits": 306, | ||||
|       "commits": 308, | ||||
|       "contributor": "kjon" | ||||
|     }, | ||||
|     { | ||||
|  | @ -9,7 +9,7 @@ | |||
|       "contributor": "Pieter Vander Vennet" | ||||
|     }, | ||||
|     { | ||||
|       "commits": 171, | ||||
|       "commits": 176, | ||||
|       "contributor": "paunofu" | ||||
|     }, | ||||
|     { | ||||
|  |  | |||
							
								
								
									
										17
									
								
								src/test.ts
									
										
									
									
									
								
							
							
						
						
									
										17
									
								
								src/test.ts
									
										
									
									
									
								
							|  | @ -1,15 +1,8 @@ | |||
| import LayoutConfig from "./Models/ThemeConfig/LayoutConfig" | ||||
| import * as theme from "./assets/generated/themes/bookcases.json" | ||||
| import ThemeViewState from "./Models/ThemeViewState" | ||||
| import Combine from "./UI/Base/Combine" | ||||
| 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" | ||||
| import LayoutConfig from "./Models/ThemeConfig/LayoutConfig"; | ||||
| import * as theme from "./assets/generated/themes/bookcases.json"; | ||||
| import ThemeViewState from "./Models/ThemeViewState"; | ||||
| import Combine from "./UI/Base/Combine"; | ||||
| import SpecialVisualizations from "./UI/SpecialVisualizations"; | ||||
| 
 | ||||
| function testspecial() { | ||||
|     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