From 089017b1367bf790da993472920000ee73922069 Mon Sep 17 00:00:00 2001 From: Pieter Vander Vennet Date: Sat, 5 Apr 2025 04:01:19 +0200 Subject: [PATCH] Themes(toilets): improve tagging of wheelchair accessible toilets, various fixes to make this possible --- assets/layers/toilet/toilet.json | 448 +++++++++++++----- .../toilet_at_amenity/toilet_at_amenity.json | 53 +-- .../mapcomplete-changes.json | 9 +- langs/layers/ca.json | 8 +- langs/layers/cs.json | 8 +- langs/layers/da.json | 8 +- langs/layers/de.json | 8 +- langs/layers/en.json | 116 ++++- langs/layers/es.json | 8 +- langs/layers/fr.json | 8 +- langs/layers/nl.json | 60 ++- langs/layers/uk.json | 8 +- public/css/index-tailwind-output.css | 5 - .../Actors/FeaturePropertiesStore.ts | 2 +- src/Logic/State/UserSettingsMetaTagging.ts | 48 +- src/UI/Popup/GroupedView.svelte | 23 +- src/UI/Popup/TagRendering/Questionbox.svelte | 2 +- .../TagRendering/TagRenderingAnswer.svelte | 3 +- .../UISpecialVisualisations.ts | 15 +- 19 files changed, 617 insertions(+), 223 deletions(-) diff --git a/assets/layers/toilet/toilet.json b/assets/layers/toilet/toilet.json index ff4ff196b..3364dbf00 100644 --- a/assets/layers/toilet/toilet.json +++ b/assets/layers/toilet/toilet.json @@ -121,7 +121,9 @@ "if": { "or": [ "wheelchair=yes", - "wheelchair=designated" + "wheelchair=designated", + "toilets:wheelchair=yes", + "toilets:wheelchair=designated" ] }, "then": "./assets/layers/toilet/wheelchair.svg" @@ -453,7 +455,8 @@ ] }, "=labels": [ - "relevant-questions" + "relevant-questions", + "no-prefix" ], "question": { "en": "When are these toilets opened?", @@ -467,110 +470,11 @@ } } }, - { - "id": "toilets-wheelchair", - "labels": [ - "relevant-questions" - ], - "question": { - "en": "Is there a dedicated toilet for wheelchair users?", - "de": "Können Rollstuhlfahrer die Toilette benutzen?", - "fr": "Y a-t-il des toilettes réservées aux personnes en fauteuil roulant ?", - "nl": "Is er een rolstoeltoegankelijke toilet voorzien?", - "it": "C'è un WC riservato alle persone in sedia a rotelle?", - "da": "Er der et særligt toilet til kørestolsbrugere?", - "ca": "Hi ha un lavabo específic per a usuaris amb cadira de rodes?", - "cs": "Je zde vyhrazená toaleta pro vozíčkáře?", - "es": "¿Hay un baño dedicado para usuarios de sillas de ruedas?" - }, - "mappings": [ - { - "then": { - "en": "There is a dedicated toilet for wheelchair users", - "de": "Rollstuhlfahrer können die Toilette benutzen", - "fr": "Il y a des toilettes réservées pour les personnes à mobilité réduite", - "nl": "Er is een toilet voor rolstoelgebruikers", - "it": "C'è un WC riservato alle persone in sedia a rotelle", - "es": "Hay un baño dedicado para usuarios de sillas de ruedas", - "da": "Der er et særligt toilet til kørestolsbrugere", - "ca": "Hi ha un lavabo dedicat per a usuaris amb cadira de rodes", - "cs": "K dispozici je speciální toaleta pro vozíčkáře" - }, - "if": "wheelchair=yes" - }, - { - "if": "wheelchair=no", - "then": { - "en": "No wheelchair access", - "de": "Rollstuhlfahrer können die Toilette nicht benutzen", - "fr": "Non accessible aux personnes à mobilité réduite", - "nl": "Niet toegankelijk voor rolstoelgebruikers", - "it": "Non accessibile in sedia a rotelle", - "ru": "Недоступно пользователям кресел-колясок", - "es": "Sin acceso para sillas de ruedas", - "da": "Ingen kørestolsadgang", - "ca": "Sense accés per a cadires de rodes", - "cs": "Žádný bezbariérový přístup" - } - }, - { - "if": "wheelchair=designated", - "then": { - "en": "There is only a dedicated toilet for wheelchair users", - "nl": "Er is alleen een toilet voor rolstoelgebruikers", - "de": "Es gibt nur eine barrierefreie Toilette für Rollstuhlfahrer", - "da": "Der er kun et særligt toilet til kørestolsbrugere", - "ca": "És només un lavabo per a usuaris amb cadira de rodes", - "cs": "K dispozici je pouze vyhrazená toaleta pro vozíčkáře", - "es": "Solo hay un baño dedicado para usuarios de sillas de ruedas" - } - } - ] - }, - { - "id": "wheelchair-door-width", - "condition": { - "and": [ - { - "or": [ - "wheelchair=yes", - "wheelchair=designated" - ] - } - ] - }, - "labels": [ - "relevant-questions" - ], - "question": { - "en": "What is the width of the door to the wheelchair accessible toilet?", - "nl": "Hoe breed is de deur van de rolstoeltoegankelijke toilet?", - "fr": "Quelle est la largeur de la porte des toilettes accessibles aux fauteuils roulants ?", - "de": "Wie breit ist die Tür zur rollstuhlgerechten Toilette?", - "da": "Hvad er bredden på døren til det kørestolsvenlige toilet?", - "ca": "Quina és l'amplada de la porta per al lavabo accéssible?", - "cs": "Jaká je šířka dveří na bezbariérovou toaletu?", - "es": "¿Cuál es el ancho de la puerta del baño accesible para sillas de ruedas?" - }, - "render": { - "en": "The door to the wheelchair-accessible toilet is {canonical(door:width)} wide", - "nl": "De deur naar de rolstoeltoegankelijke toilet is {canonical(door:width)} wide", - "fr": "La porte des toilettes accessibles aux fauteuils roulants a une large de {canonical(door:width)}", - "de": "Die Tür zur rollstuhlgerechten Toilette ist {canonical(door:width)} breit", - "da": "Døren til det kørestolsvenlige toilet er {canonical(door:width)} bred", - "ca": "La porta del vàter accessible amb cadira de rodes té {canonical(door:width)} d'ample", - "cs": "Dveře na bezbariérovou toaletu mají šířku {canonical(door:width)}", - "es": "La puerta del baño accesible para sillas de ruedas tiene {canonical(door:width)} de ancho" - }, - "freeform": { - "key": "door:width", - "type": "pfloat" - } - }, { "id": "toilets-type", "labels": [ - "relevant-questions" + "relevant-questions", + "prefixed" ], "question": { "en": "Which kind of toilets are these?", @@ -643,8 +547,16 @@ ] }, { - "condition": "toilets:position!=urinal", + "condition": { + "and": [ + "toilets:position!=urinal" + ] + }, "id": "gender_segregated", + "labels": [ + "relevant-questions", + "no-prefix" + ], "question": { "en": "Are these toilets gender-segregated?", "nl": "Zijn deze toiletten gescheiden op basis van geslacht?", @@ -688,6 +600,10 @@ }, { "id": "menstrual_products", + "labels": [ + "relevant-questions", + "prefixed" + ], "question": { "en": "Are free, menstrual products distributed here?", "nl": "Zijn er gratis menstruatieproducten beschikbaar?", @@ -747,6 +663,10 @@ }, { "id": "menstrual_products_location", + "labels": [ + "relevant-questions", + "prefixed" + ], "question": { "en": "Where are the free menstrual products located?", "nl": "Waar bevinden de gratis menstruatieproducten zich?", @@ -756,9 +676,13 @@ "ca": "On estan ubicats els productes menstruals gratuïts?" }, "condition": { - "or": [ - "toilets:menstrual_products=limited", - "toilets:menstrual_products:location~*" + "and": [ + { + "or": [ + "toilets:menstrual_products=limited", + "toilets:menstrual_products:location~*" + ] + } ] }, "render": { @@ -812,7 +736,8 @@ { "id": "toilets-changing-table", "labels": [ - "relevant-questions" + "relevant-questions", + "no-prefix" ], "question": { "en": "Is a changing table (to change diapers) available?", @@ -859,7 +784,12 @@ }, { "labels": [ - "relevant-questions" + "relevant-questions", + "no-prefix" + ], + "labels": [ + "relevant-questions", + "no-prefix" ], "question": { "en": "Where is the changing table located?", @@ -955,6 +885,10 @@ }, { "id": "toilet-supervised", + "labels": [ + "relevant-questions", + "no-prefix" + ], "question": { "en": "Is this toilets supervised by a person?", "nl": "Is er toezicht op deze toilet?" @@ -999,6 +933,10 @@ }, { "id": "toilet-has-paper", + "labels": [ + "relevant-questions", + "prefixed" + ], "labels": [ "relevant-questions" ], @@ -1051,6 +989,10 @@ "labels": [ "relevant-questions" ], + "labels": [ + "relevant-questions", + "prefixed" + ], "id": "toilet-handwashing", "question": { "en": "Do these toilets have a sink to wash your hands?", @@ -1093,6 +1035,10 @@ }, { "id": "toilet-drying", + "labels": [ + "relevant-questions", + "prefixed" + ], "question": { "en": "Do these toilets have a device to dry your hands?", "nl": "Hebben deze toiletten een apparaat om je handen te drogen?" @@ -1135,9 +1081,285 @@ } } ], - "condition": "toilets:handwashing=yes" + "condition": { + "and": [ + "toilets:handwashing=yes" + ] + } }, - "description" + "description", + { + "id": "wheelchair-group", + "labels": [ + "relevant-questions", + "prefixed" + ], + "render": { + "special": { + "type": "group", + "header": "wheelchair-title", + "labels": "wheelchair" + } + } + }, + { + "id": "toilets-wheelchair", + "labels": [ + "relevant-questions", + "wheelchair", + "hidden", + "no-prefix" + ], + "question": { + "en": "Is there a dedicated toilet for wheelchair users?", + "de": "Können Rollstuhlfahrer die Toilette benutzen?", + "fr": "Y a-t-il des toilettes réservées aux personnes en fauteuil roulant ?", + "nl": "Is er een rolstoeltoegankelijke toilet voorzien?", + "it": "C'è un WC riservato alle persone in sedia a rotelle?", + "da": "Er der et særligt toilet til kørestolsbrugere?", + "ca": "Hi ha un lavabo específic per a usuaris amb cadira de rodes?", + "cs": "Je zde vyhrazená toaleta pro vozíčkáře?", + "es": "¿Hay un baño dedicado para usuarios de sillas de ruedas?" + }, + "mappings": [ + { + "then": { + "en": "There is a dedicated toilet for wheelchair users", + "de": "Rollstuhlfahrer können die Toilette benutzen", + "fr": "Il y a des toilettes réservées pour les personnes à mobilité réduite", + "nl": "Er is een toilet voor rolstoelgebruikers", + "it": "C'è un WC riservato alle persone in sedia a rotelle", + "es": "Hay un baño dedicado para usuarios de sillas de ruedas", + "da": "Der er et særligt toilet til kørestolsbrugere", + "ca": "Hi ha un lavabo dedicat per a usuaris amb cadira de rodes", + "cs": "K dispozici je speciální toaleta pro vozíčkáře" + }, + "if": "wheelchair=yes" + }, + { + "if": "wheelchair=no", + "then": { + "en": "No wheelchair access", + "de": "Rollstuhlfahrer können die Toilette nicht benutzen", + "fr": "Non accessible aux personnes à mobilité réduite", + "nl": "Niet toegankelijk voor rolstoelgebruikers", + "it": "Non accessibile in sedia a rotelle", + "ru": "Недоступно пользователям кресел-колясок", + "es": "Sin acceso para sillas de ruedas", + "da": "Ingen kørestolsadgang", + "ca": "Sense accés per a cadires de rodes", + "cs": "Žádný bezbariérový přístup" + } + }, + { + "if": "wheelchair=designated", + "then": { + "en": "There is only a dedicated toilet for wheelchair users", + "nl": "Er is alleen een toilet voor rolstoelgebruikers", + "de": "Es gibt nur eine barrierefreie Toilette für Rollstuhlfahrer", + "da": "Der er kun et særligt toilet til kørestolsbrugere", + "ca": "És només un lavabo per a usuaris amb cadira de rodes", + "cs": "K dispozici je pouze vyhrazená toaleta pro vozíčkáře", + "es": "Solo hay un baño dedicado para usuarios de sillas de ruedas" + } + } + ] + }, + { + "id": "wheelchair-picture-carousel", + "condition": { + "and": [ + { + "or": [ + "wheelchair=yes", + "wheelchair=designated", + "toilets:wheelchair=yes", + "toilets:wheelchair=designated" + ] + } + ] + }, + "labels": [ + "wheelchair", + "hidden", + "relevant-questions", + "prefixed" + ], + "render": { + "special": { + "type": "image_carousel", + "image_key": "toilets:wheelchair:panoramax;toilets:wheelchair:image;toilets:wheelchair:mapillary" + } + } + }, + { + "id": "wheelchair-picture", + "condition": { + "and": [ + { + "or": [ + "wheelchair=yes", + "wheelchair=designated", + "toilets:wheelchair=yes", + "toilets:wheelchair=designated" + ] + } + ] + }, + "labels": [ + "wheelchair", + "hidden", + "relevant-questions", + "prefixed" + ], + "render": { + "special": { + "type": "image_upload", + "image_key": "toilets:wheelchair:panoramax", + "label": { + "en": "Add a picture of the wheelchair accessible toilet", + "nl": "Voeg een foto van de rolstoeltoegankelijke toilet toe" + } + } + } + }, + { + "id": "wheelchair-title", + "labels": [ + "hidden", + "relevant-questions", + "prefixed" + ], + "render": { + "en": "Wheelchair accessible toilet", + "nl": "Rolstoeltoegankelijke toilet" + }, + "icon": "./assets/layers/toilet/wheelchair.svg", + "mappings": [ + { + "if": { + "or": [ + "wheelchair=no", + "toilets:wheelchair=no" + ] + }, + "then": { + "en": "No wheelchair accessible toilet", + "nl": "Geen rolstoeltoegankelijke toilet" + } + } + ] + }, + { + "id": "wheelchair-access", + "question": { + "en": "Is the wheelchair-accessible toilet locked?", + "nl": "Is de rolstoeltoegankelijke toilet op slot?" + }, + "condition": { + "and": [ + { + "or": [ + "wheelchair=yes", + "wheelchair=designated", + "toilets:wheelchair=yes", + "toilets:wheelchair=designated" + ] + }, + { + "or": [ + "access=yes", + "access=public", + "access=customers" + ] + } + ] + }, + "labels": [ + "hidden", + "wheelchair", + "relevant-questions", + "prefixed" + ], + "mappings": [ + { + "if": "toilets:wheelchair:access=yes", + "alsoShowIf": "toilets:wheelchair:access=", + "then": { + "en": "The wheelchair accessible toilets are freely accessible", + "nl": "De rolstoeltoegankelijke toilet is vrij toegankelijk" + } + }, + { + "if": "toilets:wheelchair:access=key", + "icon": "key", + "then": { + "en": "One needs to ask permission to access wheelchair-accessible toilet, e.g. by asking a key", + "nl": "Men moet toestemming vragen om de rolstoeltoegankelijke toilet te gebruiken, bv. door een sleutel te vragen" + } + } + ] + }, + { + "id": "wheelchair-door-width", + "condition": { + "and": [ + { + "or": [ + "wheelchair=yes", + "wheelchair=designated", + "toilets:wheelchair=yes", + "toilets:wheelchair=designated" + ] + } + ] + }, + "labels": [ + "relevant-questions", + "wheelchair", + "hidden", + "prefixed" + ], + "question": { + "en": "What is the width of the door to the wheelchair accessible toilet?", + "nl": "Hoe breed is de deur van de rolstoeltoegankelijke toilet?", + "fr": "Quelle est la largeur de la porte des toilettes accessibles aux fauteuils roulants ?", + "de": "Wie breit ist die Tür zur rollstuhlgerechten Toilette?", + "da": "Hvad er bredden på døren til det kørestolsvenlige toilet?", + "ca": "Quina és l'amplada de la porta per al lavabo accéssible?", + "cs": "Jaká je šířka dveří na bezbariérovou toaletu?", + "es": "¿Cuál es el ancho de la puerta del baño accesible para sillas de ruedas?" + }, + "render": { + "en": "The door to the wheelchair-accessible toilet is {canonical(door:width)} wide", + "nl": "De deur naar de rolstoeltoegankelijke toilet is {canonical(door:width)} wide", + "fr": "La porte des toilettes accessibles aux fauteuils roulants a une large de {canonical(door:width)}", + "de": "Die Tür zur rollstuhlgerechten Toilette ist {canonical(door:width)} breit", + "da": "Døren til det kørestolsvenlige toilet er {canonical(door:width)} bred", + "ca": "La porta del vàter accessible amb cadira de rodes té {canonical(door:width)} d'ample", + "cs": "Dveře na bezbariérovou toaletu mají šířku {canonical(door:width)}", + "es": "La puerta del baño accesible para sillas de ruedas tiene {canonical(door:width)} de ancho" + }, + "freeform": { + "key": "door:width", + "type": "pfloat" + } + }, + { + "id": "questions-wheelchair", + "labels": [ + "wheelchair", + "hidden", + "relevant-questions" + ], + "render": { + "special": { + "type": "questions", + "show_all": "yes", + "labels": "wheelchair" + } + } + } ], "filter": [ { @@ -1159,7 +1381,9 @@ "osmTags": { "or": [ "wheelchair=yes", - "wheelchair=designated" + "wheelchair=designated", + "toilets:wheelchair=yes", + "toilets:wheelchair=designated" ] } } diff --git a/assets/layers/toilet_at_amenity/toilet_at_amenity.json b/assets/layers/toilet_at_amenity/toilet_at_amenity.json index 63e9d1d99..3656a0eac 100644 --- a/assets/layers/toilet_at_amenity/toilet_at_amenity.json +++ b/assets/layers/toilet_at_amenity/toilet_at_amenity.json @@ -349,6 +349,10 @@ }, { "id": "toilets-wheelchair", + "labels": [ + "wheelchair", + "hidden" + ], "question": { "en": "Is there a dedicated toilet for wheelchair users?", "de": "Können Rollstuhlfahrer die Toilette benutzen?", @@ -406,48 +410,21 @@ } ] }, + "toilet.prefixed", { - "id": "wheelchair-door-width", - "condition": { - "or": [ - "toilets:wheelchair=yes", - "toilets:wheelchair=designated" - ] - }, - "question": { - "en": "What is the width of the door to the wheelchair accessible toilet?", - "nl": "Hoe breed is de deur van de rolstoeltoegankelijke toilet?", - "fr": "Quelle est la largeur de la porte des toilettes accessibles aux fauteuils roulants ?", - "de": "Wie breit ist die Tür zur rollstuhlgerechten Toilette?", - "da": "Hvad er bredden på døren til det kørestolsvenlige toilet?", - "ca": "Quina és l'amplada de la porta del lavabo accessible per a cadira de rodes?", - "cs": "Jaká je šířka dveří na bezbariérovou toaletu?", - "sl": "Koliko so široka vrata v stranišče za invalide na vozičku?", - "es": "¿Cuál es el ancho de la puerta del baño accesible para sillas de ruedas?" - }, + "id": "questions-wheelchair", + "labels": [ + "wheelchair", + "hidden" + ], "render": { - "en": "The door to the wheelchair-accessible toilet is {canonical(toilets:door:width)} wide", - "nl": "De deur naar de rolstoeltoegankelijke toilet is {canonical(toilets:door:width)} wide", - "fr": "La porte des toilettes accessibles aux fauteuils roulants a une large de {canonical(toilets:door:width)}", - "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", - "ca": "La porta del vàter accessible amb cadira de rodes és {canonical(toilets:door:width)} d'ample", - "cs": "Dveře na toaletu pro vozíčkáře jsou {canonical(toilets:door:width)} široké", - "sl": "Vrata v stranišče za invalide na vozičku so široka {canonical(toilets:door:width)}", - "es": "La puerta del baño accesible para sillas de ruedas tiene {canonical(toilets:door:width)} de ancho" - }, - "freeform": { - "key": "toilets:door:width", - "type": "pfloat" + "special": { + "type": "questions", + "labels": "wheelchair", + "show_all": "yes" + } } }, - "toilet.toilets-type", - "toilet.toilets-changing-table", - "toilet.toilet-changing_table:location", - "toilet.toilet-handwashing", - "toilet.toilet-has-paper", - "toilet.menstrual_products", - "toilet.menstrual_products_location", { "builtin": "description", "override": { diff --git a/assets/themes/mapcomplete-changes/mapcomplete-changes.json b/assets/themes/mapcomplete-changes/mapcomplete-changes.json index 335c9ba80..5b843b26b 100644 --- a/assets/themes/mapcomplete-changes/mapcomplete-changes.json +++ b/assets/themes/mapcomplete-changes/mapcomplete-changes.json @@ -858,21 +858,24 @@ { "question": { "en": "All platforms", - "cs": "Všechny platformy" + "cs": "Všechny platformy", + "de": "Alle Plattformen" }, "quesiton": "All platforms" }, { "question": { "en": "Made with Android", - "cs": "Vytvořeno s Androidem" + "cs": "Vytvořeno s Androidem", + "de": "Mit Android erstellt" }, "osmTags": "android=yes" }, { "question": { "en": "Made on the web", - "cs": "Vytvořeno na webu" + "cs": "Vytvořeno na webu", + "de": "Im Internet erstellt" }, "osmTags": "android=" } diff --git a/langs/layers/ca.json b/langs/layers/ca.json index 82e2bfb2d..859f50b57 100644 --- a/langs/layers/ca.json +++ b/langs/layers/ca.json @@ -5242,8 +5242,12 @@ "questionHint": "Això podria estar escrit al cartell del nom del carrer", "render": "Anomenat en honor a {name:etymology}" }, - "street-name-sign-image": { - "render": "{image_carousel(image:streetsign)}
{image_upload(image:streetsign, Afegeix una imatge de la placa amb el nom del carrer)}" + "streetsign-upload": { + "render": { + "special": { + "label": "Afegeix una imatge de la placa amb el nom del carrer" + } + } }, "wikipedia": { "render": "Existeix un article de la Viquipèdia sobre aquest carrer:
{wikipedia():max-height:25rem}" diff --git a/langs/layers/cs.json b/langs/layers/cs.json index 5f2374ac0..d9db3aed6 100644 --- a/langs/layers/cs.json +++ b/langs/layers/cs.json @@ -5057,8 +5057,12 @@ "questionHint": "To může být napsáno na ceduli s názvem ulice", "render": "Pojmenováno po {name:etymology}" }, - "street-name-sign-image": { - "render": "{image_carousel(image:streetsign)}
{image_upload(image:streetsign, Add image of a street name sign)}" + "streetsign-upload": { + "render": { + "special": { + "label": "Add image of a street name sign" + } + } }, "wikipedia": { "render": "Článek na Wikipedii o této ulici existuje:
{wikipedia():max-height:25rem}" diff --git a/langs/layers/da.json b/langs/layers/da.json index 4e678fa6b..7e43b9a68 100644 --- a/langs/layers/da.json +++ b/langs/layers/da.json @@ -1589,8 +1589,12 @@ "question": "Hvad er dette objekt opkaldt efter?", "render": "Opkaldt efter {name:etymology}" }, - "street-name-sign-image": { - "render": "{image_carousel(image:streetsign)}
{image_upload(image:streetsign, Tilføj foto af gadenavneskilt)}" + "streetsign-upload": { + "render": { + "special": { + "label": "Tilføj foto af gadenavneskilt" + } + } }, "wikipedia": { "render": "Der findes en Wikipedia-artikel om denne gade:
{wikipedia():max-height:25rem}" diff --git a/langs/layers/de.json b/langs/layers/de.json index 63239fdfb..a2b607428 100644 --- a/langs/layers/de.json +++ b/langs/layers/de.json @@ -5220,8 +5220,12 @@ "questionHint": "Das könnte auf einem Straßenschild stehen", "render": "Benannt nach {name:etymology}" }, - "street-name-sign-image": { - "render": "{image_carousel(image:streetsign)}
{image_upload(image:streetsign, Bild eines Straßenschildes hinzufügen)}" + "streetsign-upload": { + "render": { + "special": { + "label": "Bild eines Straßenschildes hinzufügen" + } + } }, "wikipedia": { "render": "Zu dieser Straße existiert ein Wikipedia-Artikel:
{wikipedia():max-height:25rem}" diff --git a/langs/layers/en.json b/langs/layers/en.json index 6f9771553..0371dbd36 100644 --- a/langs/layers/en.json +++ b/langs/layers/en.json @@ -759,6 +759,19 @@ }, "question": "What notes can you withdraw here?" }, + "indoor": { + "override": { + "mappings": { + "0": { + "then": "This ATM is located indoors" + }, + "1": { + "then": "This ATM is located outdoors" + } + }, + "question": "Is this ATM located indoors?" + } + }, "name": { "render": "The name of this ATM is {name}" }, @@ -5382,8 +5395,12 @@ "questionHint": "This might be written on the street name sign", "render": "Named after {name:etymology}" }, - "street-name-sign-image": { - "render": "{image_carousel(image:streetsign)}
{image_upload(image:streetsign, Add image of a street name sign)}" + "streetsign-upload": { + "render": { + "special": { + "label": "Add image of a street name sign" + } + } }, "wikipedia": { "render": "A Wikipedia article about this street exists:
{wikipedia():max-height:25rem}" @@ -6731,6 +6748,14 @@ }, "question": "What type of hydrant is it?", "render": " Hydrant type: {fire_hydrant:type}" + }, + "ref": { + "freeform": { + "placeholder": "Reference number of the hydrant" + }, + "question": "What is the reference number of this hydrant?", + "questionHint": "This can usually be found on the hydrant or on a nearby sign.", + "render": "Reference number: {ref}" } }, "title": { @@ -7419,6 +7444,10 @@ "0": { "description": "A memorial is a physical object which remembers a person or event.", "title": "a memorial" + }, + "1": { + "description": "A memorial is a physical object which remembers a person or event and is attached to a wall.", + "title": "a memorial on a wall" } }, "tagRenderings": { @@ -8856,6 +8885,9 @@ "presets": { "0": { "title": "a bookcase" + }, + "1": { + "title": "a bookcase on a wall" } }, "tagRenderings": { @@ -11658,6 +11690,17 @@ } }, "question": "How is this street lamp mounted?" + }, + "utility_pole": { + "mappings": { + "0": { + "then": "This lamp is mounted on a utility pole" + }, + "1": { + "then": "This lamp is not mounted on a utility pole" + } + }, + "question": "Is this lamp mounted on a utility pole?" } }, "title": { @@ -12324,9 +12367,35 @@ }, "question": "Is there a dedicated toilet for wheelchair users?" }, + "wheelchair-access": { + "mappings": { + "0": { + "then": "The wheelchair accessible toilets are freely accessible" + }, + "1": { + "then": "One needs to ask permission to access wheelchair-accessible toilet, e.g. by asking a key" + } + }, + "question": "Is the wheelchair-accessible toilet locked?" + }, "wheelchair-door-width": { "question": "What is the width of the door to the wheelchair accessible toilet?", "render": "The door to the wheelchair-accessible toilet is {canonical(door:width)} wide" + }, + "wheelchair-picture": { + "render": { + "special": { + "label": "Add a picture of the wheelchair accessible toilet" + } + } + }, + "wheelchair-title": { + "mappings": { + "0": { + "then": "No wheelchair accessible toilet" + } + }, + "render": "Wheelchair accessible toilet" } }, "title": { @@ -13509,6 +13578,29 @@ "render": "Settings" } }, + "utility_pole": { + "description": "Layer showing various types of utility poles.", + "name": "Utility Poles", + "presets": { + "0": { + "title": "a utility pole" + } + }, + "tagRenderings": { + "street_lamp": { + "mappings": { + "0": { + "then": "This utility pole has a street lamp mounted on it." + }, + "1": { + "then": "This utility pole does not have a street lamp mounted on it." + } + }, + "question": "Does this utility pole have a street lamp mounted on it?" + } + }, + "title": "Utility Pole" + }, "vending_machine": { "description": "Layer showing vending machines", "filter": { @@ -14031,6 +14123,9 @@ "3": { "description": "A wayside cross is a christian cross that is placed by a road or pathway. This cross is mounted on a wall", "title": "a wayside cross mounted on a wall" + }, + "4": { + "title": "a mother mary shrine on the first floor" } }, "tagRenderings": { @@ -14169,6 +14264,23 @@ }, "question": "What's the name of this {title()}?", "render": "The name of this {title()} is {name}" + }, + "subject:wikidata": { + "mappings": { + "0": { + "then": "Mother mary is depicted" + }, + "1": { + "then": "Jesus Christ as a child is depicted" + }, + "2": { + "then": "Jesus Christ (as an adult) is depicted" + }, + "3": { + "then": "Saint Anne (mother of Mary) is depicted" + } + }, + "question": "Who is depicted?" } }, "title": { diff --git a/langs/layers/es.json b/langs/layers/es.json index 8507b389e..7dccd28cd 100644 --- a/langs/layers/es.json +++ b/langs/layers/es.json @@ -4912,8 +4912,12 @@ "questionHint": "Esto podría estar escrito en el letrero del nombre de la calle", "render": "Nombrado en honor a {name:etymology}" }, - "street-name-sign-image": { - "render": "{image_carousel(image:streetsign)}
{image_upload(image:streetsign, Agregar imagen de un letrero de nombre de calle)}" + "streetsign-upload": { + "render": { + "special": { + "label": "Agregar imagen de un letrero de nombre de calle" + } + } }, "wikipedia": { "render": "Existe un artículo de Wikipedia sobre esta calle:
{wikipedia():max-height:25rem}" diff --git a/langs/layers/fr.json b/langs/layers/fr.json index 125dfd1a0..c1000a381 100644 --- a/langs/layers/fr.json +++ b/langs/layers/fr.json @@ -3476,8 +3476,12 @@ "questionHint": "Cela peut être indiqué sur le panneau de la rue", "render": "Nommé en référence à {name:etymology}" }, - "street-name-sign-image": { - "render": "{image_carousel(image:streetsign)}
{image_upload(image:streetsign, Ajouter une photo de la plaque de rue)}" + "streetsign-upload": { + "render": { + "special": { + "label": "Ajouter une photo de la plaque de rue" + } + } }, "wikipedia": { "render": "Un article Wikipédia à propos de cette rue existe :
{wikipedia():max-height:25rem}" diff --git a/langs/layers/nl.json b/langs/layers/nl.json index 27d6bb491..2b090bec3 100644 --- a/langs/layers/nl.json +++ b/langs/layers/nl.json @@ -735,6 +735,19 @@ }, "question": "Welke bankbiljetten kan je hier afhalen?" }, + "indoor": { + "override": { + "mappings": { + "0": { + "then": "Deze geldautomaat bevindt zich binnen" + }, + "1": { + "then": "Deze geldautomaat bevindt zich buiten" + } + }, + "question": "Bevindt deze geldautomaat zich binnen?" + } + }, "name": { "render": "De naam van deze geldautomaat is {name}" }, @@ -5041,8 +5054,12 @@ "questionHint": "Dit staat mogelijks vermeld op het straatnaambordje", "render": "Vernoemd naar {name:etymology}" }, - "street-name-sign-image": { - "render": "{image_carousel(image:streetsign)}
{image_upload(image:streetsign, Voeg afbeelding van straatnaambordje toe)}" + "streetsign-upload": { + "render": { + "special": { + "label": "Voeg afbeelding van straatnaambordje toe" + } + } }, "wikipedia": { "render": "Een Wikipedia artikel over deze straat bestaat:
{wikipedia():max-height:25rem}" @@ -5971,6 +5988,14 @@ }, "question": "Wat voor soort brandkraan is dit?", "render": " Het type brandkraan is {fire_hydrant:type}" + }, + "ref": { + "freeform": { + "placeholder": "Referentienummer van de brandkraan" + }, + "question": "Wat is het referentienummer van deze brandkraan?", + "questionHint": "Dit nummer is meestal te vinden op de brandkraan of op een nabijgelegen bord.", + "render": "Referentienummer: {ref}" } }, "title": { @@ -6469,7 +6494,12 @@ "name": "Gedenktekens", "presets": { "0": { + "description": "Een fysiek object dat een persoon of gebeurtenis herdenkt", "title": "een gedenkteken" + }, + "1": { + "description": "Een fysiek object dat een persoon of gebeurtenis herdenkt en dat ophangt aan een muur.", + "title": "een gedenkteken dat aan een muur hangt" } }, "tagRenderings": { @@ -9902,9 +9932,35 @@ }, "question": "Is er een rolstoeltoegankelijke toilet voorzien?" }, + "wheelchair-access": { + "mappings": { + "0": { + "then": "De rolstoeltoegankelijke toilet is vrij toegankelijk" + }, + "1": { + "then": "Men moet toestemming vragen om de rolstoeltoegankelijke toilet te gebruiken, bv. door een sleutel te vragen" + } + }, + "question": "Is de rolstoeltoegankelijke toilet op slot?" + }, "wheelchair-door-width": { "question": "Hoe breed is de deur van de rolstoeltoegankelijke toilet?", "render": "De deur naar de rolstoeltoegankelijke toilet is {canonical(door:width)} wide" + }, + "wheelchair-picture": { + "render": { + "special": { + "label": "Voeg een foto van de rolstoeltoegankelijke toilet toe" + } + } + }, + "wheelchair-title": { + "mappings": { + "0": { + "then": "Geen rolstoeltoegankelijke toilet" + } + }, + "render": "Rolstoeltoegankelijke toilet" } }, "title": { diff --git a/langs/layers/uk.json b/langs/layers/uk.json index 91dff7ef7..6f0b2784c 100644 --- a/langs/layers/uk.json +++ b/langs/layers/uk.json @@ -1280,8 +1280,12 @@ "etymology_multi_apply": { "render": "{multi_apply(_same_name_ids, name:etymology:wikidata;name:etymology, Автоматичне застосування даних до всіх сегментів з однаковою назвою, true)}" }, - "street-name-sign-image": { - "render": "{image_carousel(image:streetsign)}
{image_upload(image:streetsign, Додати зображення таблички з назвою вулиці)}" + "streetsign-upload": { + "render": { + "special": { + "label": "Додати зображення таблички з назвою вулиці" + } + } }, "wikipedia-etymology": { "question": "На честь якого елемента Вікіданих названо цей об'єкт?" diff --git a/public/css/index-tailwind-output.css b/public/css/index-tailwind-output.css index a7b75b064..62aec3673 100644 --- a/public/css/index-tailwind-output.css +++ b/public/css/index-tailwind-output.css @@ -3354,11 +3354,6 @@ input[type="range"].range-lg::-moz-range-thumb { background-color: rgb(249 250 251 / var(--tw-bg-opacity, 1)) !important; } -.bg-black { - --tw-bg-opacity: 1; - background-color: rgb(0 0 0 / var(--tw-bg-opacity, 1)); -} - .bg-blue-100 { --tw-bg-opacity: 1; background-color: rgb(225 239 254 / var(--tw-bg-opacity, 1)); diff --git a/src/Logic/FeatureSource/Actors/FeaturePropertiesStore.ts b/src/Logic/FeatureSource/Actors/FeaturePropertiesStore.ts index 6c8e5f292..e99398f23 100644 --- a/src/Logic/FeatureSource/Actors/FeaturePropertiesStore.ts +++ b/src/Logic/FeatureSource/Actors/FeaturePropertiesStore.ts @@ -53,7 +53,7 @@ export default class FeaturePropertiesStore { public getStore(id: string): UIEventSource> { const store = this._elements.get(id) if (store === undefined) { - console.error("PANIC: no store for", id) + console.warn("PANIC: no properties store for", id) } return store } diff --git a/src/Logic/State/UserSettingsMetaTagging.ts b/src/Logic/State/UserSettingsMetaTagging.ts index 6e568c5c3..33a5ae85b 100644 --- a/src/Logic/State/UserSettingsMetaTagging.ts +++ b/src/Logic/State/UserSettingsMetaTagging.ts @@ -1,42 +1,14 @@ import { Utils } from "../../Utils" /** This code is autogenerated - do not edit. Edit ./assets/layers/usersettings/usersettings.json instead */ export class ThemeMetaTagging { - public static readonly themeName = "usersettings" + public static readonly themeName = "usersettings" - public metaTaggging_for_usersettings(feat: { properties: Record }) { - Utils.AddLazyProperty(feat.properties, "_mastodon_candidate_md", () => - feat.properties._description - .match(/\[[^\]]*\]\((.*(mastodon|en.osm.town).*)\).*/) - ?.at(1) - ) - Utils.AddLazyProperty( - feat.properties, - "_d", - () => feat.properties._description?.replace(/</g, "<")?.replace(/>/g, ">") ?? "" - ) - Utils.AddLazyProperty(feat.properties, "_mastodon_candidate_a", () => - ((feat) => { - const e = document.createElement("div") - e.innerHTML = feat.properties._d - return Array.from(e.getElementsByTagName("a")).filter( - (a) => a.href.match(/mastodon|en.osm.town/) !== null - )[0]?.href - })(feat) - ) - Utils.AddLazyProperty(feat.properties, "_mastodon_link", () => - ((feat) => { - const e = document.createElement("div") - e.innerHTML = feat.properties._d - return Array.from(e.getElementsByTagName("a")).filter( - (a) => a.getAttribute("rel")?.indexOf("me") >= 0 - )[0]?.href - })(feat) - ) - Utils.AddLazyProperty( - feat.properties, - "_mastodon_candidate", - () => feat.properties._mastodon_candidate_md ?? feat.properties._mastodon_candidate_a - ) - feat.properties["__current_backgroun"] = "initial_value" - } -} + public metaTaggging_for_usersettings(feat: {properties: Record}) { + Utils.AddLazyProperty(feat.properties, '_mastodon_candidate_md', () => feat.properties._description.match(/\[[^\]]*\]\((.*(mastodon|en.osm.town).*)\).*/)?.at(1) ) + Utils.AddLazyProperty(feat.properties, '_d', () => feat.properties._description?.replace(/</g,'<')?.replace(/>/g,'>') ?? '' ) + Utils.AddLazyProperty(feat.properties, '_mastodon_candidate_a', () => (feat => {const e = document.createElement('div');e.innerHTML = feat.properties._d;return Array.from(e.getElementsByTagName("a")).filter(a => a.href.match(/mastodon|en.osm.town/) !== null)[0]?.href }) (feat) ) + Utils.AddLazyProperty(feat.properties, '_mastodon_link', () => (feat => {const e = document.createElement('div');e.innerHTML = feat.properties._d;return Array.from(e.getElementsByTagName("a")).filter(a => a.getAttribute("rel")?.indexOf('me') >= 0)[0]?.href})(feat) ) + Utils.AddLazyProperty(feat.properties, '_mastodon_candidate', () => feat.properties._mastodon_candidate_md ?? feat.properties._mastodon_candidate_a ) + feat.properties['__current_backgroun'] = 'initial_value' + } +} \ No newline at end of file diff --git a/src/UI/Popup/GroupedView.svelte b/src/UI/Popup/GroupedView.svelte index 038b97c22..9e40e4ca8 100644 --- a/src/UI/Popup/GroupedView.svelte +++ b/src/UI/Popup/GroupedView.svelte @@ -17,7 +17,10 @@ export let layer: LayerConfig let headerTr = layer.tagRenderings.find((tr) => tr.id === header) - let trgs: TagRenderingConfig[] = [] + if (headerTr === undefined) { + console.error("Header tagRendering with ID", header, "was not found") + } + let tagRenderings: TagRenderingConfig[] = [] let seenIds = new Set() for (const label of labels) { for (const tr of layer.tagRenderings) { @@ -25,20 +28,30 @@ continue } if (label === tr.id || tr.labels.some((l) => l === label)) { - trgs.push(tr) + tagRenderings.push(tr) seenIds.add(tr.id) } } } - +{#if tagRenderings.length > 0} +
+ +
- + {#if headerTr} + + {:else} + {header} + {/if}
- {#each trgs as config (config.id)} + {#each tagRenderings as config (config.id)} {#if config.IsKnown($tags) && (config.condition === undefined || config.condition.matchesProperties($tags))} {/if} {/each}
+
+ +{/if} diff --git a/src/UI/Popup/TagRendering/Questionbox.svelte b/src/UI/Popup/TagRendering/Questionbox.svelte index 646c1167d..53c787274 100644 --- a/src/UI/Popup/TagRendering/Questionbox.svelte +++ b/src/UI/Popup/TagRendering/Questionbox.svelte @@ -31,7 +31,7 @@ */ export let notForLabels: string[] | undefined = undefined const _notForLabels = new Set(notForLabels) - let showAllQuestionsAtOnce: Store = + export let showAllQuestionsAtOnce: Store = state.userRelatedState?.showAllQuestionsAtOnce ?? new ImmutableStore(false) function allowed(labels: string[]) { diff --git a/src/UI/Popup/TagRendering/TagRenderingAnswer.svelte b/src/UI/Popup/TagRendering/TagRenderingAnswer.svelte index 5b31e2a20..9b8a5666b 100644 --- a/src/UI/Popup/TagRendering/TagRenderingAnswer.svelte +++ b/src/UI/Popup/TagRendering/TagRenderingAnswer.svelte @@ -22,7 +22,8 @@ export let id: string = undefined if (config === undefined) { - throw "Config is undefined in tagRenderingAnswer" + console.error("TagRenderingAnswer: Config is undefined") + throw ("Config is undefined in tagRenderingAnswer") } let trs: Store<{ then: Translation; icon?: string; iconClass?: string }[]> = tags.mapD((tags) => Utils.NoNull(config?.GetRenderValues(tags)) diff --git a/src/UI/SpecialVisualisations/UISpecialVisualisations.ts b/src/UI/SpecialVisualisations/UISpecialVisualisations.ts index 57c5ebdff..09cb1caf1 100644 --- a/src/UI/SpecialVisualisations/UISpecialVisualisations.ts +++ b/src/UI/SpecialVisualisations/UISpecialVisualisations.ts @@ -1,6 +1,6 @@ import { SpecialVisualizationState, SpecialVisualizationSvelte } from "../SpecialVisualization" import SvelteUIElement from "../Base/SvelteUIElement" -import { UIEventSource } from "../../Logic/UIEventSource" +import { ImmutableStore, Store, UIEventSource } from "../../Logic/UIEventSource" import { Feature } from "geojson" import LayerConfig from "../../Models/ThemeConfig/LayerConfig" import Questionbox from "../Popup/TagRendering/Questionbox.svelte" @@ -31,6 +31,11 @@ class QuestionViz implements SpecialVisualizationSvelte { name: "blacklisted-labels", doc: "One or more ';'-separated labels of questions which should _not_ be included. Note that the questionbox which is added by default will blacklist 'hidden'" }, + { + name: "show_all", + default: "user-preference", + doc: "Either `no`, `yes` or `user-preference`. Indicates if all questions should be shown at once" + } ] svelteBased = true group: "default" @@ -50,6 +55,13 @@ class QuestionViz implements SpecialVisualizationSvelte { ?.split(";") ?.map((s) => s.trim()) ?.filter((s) => s !== "") + const showAll = args[2] + let showAllQuestionsAtOnce: Store = state.userRelatedState?.showAllQuestionsAtOnce + if (showAll === "yes") { + showAllQuestionsAtOnce = new ImmutableStore(true) + } else if (showAll === "no") { + showAllQuestionsAtOnce = new ImmutableStore(false) + } return new SvelteUIElement(Questionbox, { layer, tags, @@ -57,6 +69,7 @@ class QuestionViz implements SpecialVisualizationSvelte { state, onlyForLabels: labels, notForLabels: blacklist, + showAllQuestionsAtOnce }) } }