l'avís de drets de còpia per més detalls.",
"noDataLoaded": "No s'han carregat dades. La baixada estarà disponible aviat",
- "pdf": {},
"title": "Descarrega",
"uploadGpx": "Pujar la teva traça a OpenStreetMap"
},
@@ -342,6 +348,13 @@
},
"useSearch": "Utilitzeu la cerca de dalt per veure els valors predefinits",
"useSearchForMore": "Utilitzeu la funció de cerca per cercar dins de {total} valors més…",
+ "visualFeedback": {
+ "directionsRelative": {
+ "left": "esquerra",
+ "right": "dreta"
+ },
+ "fromGps": "{distance} {direction} de la seva ubicació"
+ },
"waitingForGeopermission": "Esperant al vostre permís per a utilitzar la geolocalització…",
"waitingForLocation": "Buscant la vostra ubicació actual…",
"weekdays": {
@@ -620,6 +633,11 @@
"description": "un número",
"feedback": "No és un nombre"
},
+ "id": {
+ "description": "un identificador",
+ "invalidCharacter": "Un identificador només pot contenir lletres, dígits i guions baixos",
+ "shouldBeLonger": "Un identificador ha de tenir almenys 3 caràcters"
+ },
"int": {
"description": "un número sencer"
},
@@ -644,6 +662,10 @@
"description": "un número sencer, positiu",
"noZero": "No es permet el zero"
},
+ "slope": {
+ "inputExplanation": "Poseu el telèfon a terra amb la part superior del telèfon apuntant cap a la part superior del pendent.",
+ "inputIncorrect": "Per a les mesures correctes, assegureu-vos que la fletxa està dins de la zona verda."
+ },
"string": {
"description": "un tros de text"
},
diff --git a/langs/fi.json b/langs/fi.json
index ce7c82368..5ae0f8515 100644
--- a/langs/fi.json
+++ b/langs/fi.json
@@ -22,13 +22,18 @@
"delete": "Poista",
"explanations": {
"hardDelete": "Tämä kohde poistetaan OpenStreetMapistä. Kokenut kartoittaja voi palauttaa sen.",
+ "retagNoOtherThemes": "Tämä kohde luokitellaan uudelleen ja piilotetaan tältä sovellukselta",
+ "retagOtherThemes": "Tämän kohteen ominaisuustietoja muutetaan, ja se ilmestyy näkyviin teemoissa {otherThemes}",
"selectReason": "Valitse, miksi tämä kohde pitäisi poistaa",
"softDelete": "Tämä kohde päivitetään ja piilotetaan tässä sovelluksessa. {reason}"
},
"isDeleted": "Tämä kohde on poistettu",
+ "isntAPoint": "Vain pisteitä voi poistaa. Valittu kohde on viiva, alue tai relaatio.",
+ "loading": "Tutkitaan ominaisuuksista, voiko tämän kohteen poistaa.",
"loginToDelete": "Kohteen poistamiseksi täytyy kirjautua",
"notEnoughExperience": "Tämän kohteen loi joku muu.",
"onlyEditedByLoggedInUser": "Tätä kohdetta ei ole muokannut kukaan muu kuin sinä, joten sen voi huoletta poistaa.",
+ "partOfOthers": "Tämä piste on osa viivaa tai relaatiota eikä sitä voi poistaa suoraan.",
"readMessages": "Sinulle on lukemattomia viestejä. Lue ne ennen kuin poistat kohteen – joku on saattanut lähettää palautetta",
"reasons": {
"disused": "Tämä kohde on poistettu käytöstä tai poistettu",
@@ -37,18 +42,23 @@
"test": "Tämä oli testikohde – kohdetta ei ollut ikinä olemassa"
},
"safeDelete": "Tämä kohde voidaan turvallisesti poistaa.",
+ "useSomethingElse": "Poista se toisella OpenStreetMap-editorilla",
"whyDelete": "Miksi tämä kohde pitäisi poistaa?"
},
"favourite": {
+ "loginNeeded": "Kirjaudu sisään
Oma asettelu on saatavilla vain OpenStreetMap-käyttäjille",
+ "panelIntro": "Oma teema
Käytä suosikkitasojasi kaikista virallisista teemoista",
"reload": "Lataa data uudelleen"
},
"favouritePoi": {
"button": {
+ "isFavourite": "Tämä paikka on merkitty suosikiksi ja näkyy kaikilla MapCompleten teemakartoilla, joita katselet.",
"isMarkedShort": "Merkitty suosikkisijainniksi",
"isNotMarkedShort": "Ei merkitty suosikiksi",
"markAsFavouriteTitle": "Merkitse tämä paikka suosikkisijainniksi",
- "markDescription": "Lisää tämä paikka henkilökohtaiselle suosikkilistalle",
- "unmark": "Poista henkilökohtaiselta suosikkilistalta"
+ "markDescription": "Lisää tämä paikka omalle suosikkilistalle",
+ "unmark": "Poista omalta suosikkilistalta",
+ "unmarkNotDeleted": "Tätä pistettä ei poisteta ja se pysyy näkyvissä kartoilla sinulle ja muille"
},
"downloadGeojson": "Lataa suosikkisi geojson-muodossa",
"downloadGpx": "Lataa suosikkisi GPX-muodossa",
@@ -59,39 +69,109 @@
"title": "Suosikkisijaintisi"
},
"flyer": {
+ "aerial": "Tämä kartta käyttää eri taustaa, joka on ilmakuva taholta Agentschap Informatie Vlaanderen",
"callToAction": "Kokeile sitä osoitteessa mapcomplete.org",
+ "cyclofix": "Pyöränpumput, korjausasemat, juomavesi ja pyöräkaupat ovat CycloFixissä",
+ "description": "Vaakasuuntainen A4-lentolehtinen MapCompleten mainostamiseen",
"editing": {
+ "ex": "Alla on yksinkertainen esimerkki siitä, miltä tämä näyttää luonnonsuojelualueella.",
+ "intro": "Käyttäjää tervehtii kartta, jolla on kohteita. Kun kohde valitaan, sen tiedot näytetään.",
"title": "Miltä käyttöliittymä näyttää?"
},
+ "examples": "MapCompletessa on paljon teemakarttoja. Muutamia niistä näkyy tässä.\n\nVerkossa on vielä lisää teemakarttoja aiheista: terveydenhuolto, sisänavigointi, esteettömyydes pyörätuolilla, jätteenkäsittelylaitokset, julkiset kirjahyllyt, sateenkaaren väreissä olevat suojatiet, … Löydä ne kaikki mapcomplete.org-sivustolta",
"fakeui": {
- "add_images": "Lisää kuvia muutamalla napsautuksella"
+ "add_images": "Lisää kuvia muutamalla napsautuksella",
+ "attributes": "Näyttää ominaisuudet ystävällisellä tavalla",
+ "edit": "Väärää tai vanhentunutta tietoa? Muokkauspainike on käden ulottuvilla.",
+ "question": "Jos ominaisuus ei ole vielä tiedossa, MapComplete esittää kysymyksen",
+ "see_images": "Näyttää kuvia aiemmilta tekijöiltä, Wikipediasta, Mapillarystä, …",
+ "wikipedia": "Linkitetyt Wikipedia-artikkelit näytetään"
},
+ "frontParagraph": "MapComplete on helppokäyttöinen verkkosovellus, jolla voi kerätä paikkatietoa OpenStreetMapiin. Sen avulla voi kerätä ja hallita olennaista tietoa avoimella, joukkoistetulla ja uudelleenkäytettävällä tavalla.\n\nUusia luokkia ja ominaisuuksia voi lisätä pyydettäessä.",
+ "lines_too": "Viivat ja monikulmiot näytetään myös. Lisäksi niiden ominaisuuksia ja kuvia voi muokata ja päivittää.",
"mapcomplete": {
+ "customize": "MapCompleten voi räätälöidä tarpeisiisi. Siihen voi lisätä uusia karttatasoja, uutta toiminnallisuutta tai sen voi tyylitellä käyttämään organisaatiosi väerjä ja fontteja.\nMeillä on myös kokemusta paikkatiedon joukkoistamiskampanjoiden aloittamisesta.\nPyydä tarjous ottamalla yhteyttä osoitteeseen pietervdvn@posteo.net.",
+ "intro": "MapComplete on sivusto, jolla on {mapCount} vuorovaikutteista karttaa. Jokaiselle kartalle voi lisätä ja päivittää tietoja. Siinä on paljon ominaisuuksia:",
+ "li0": "Näytä, missä on kiinnostavia paikkoja",
+ "li1": "Lisää uusia pisteitä ja päivitä nykyisten tietoja",
+ "li2": "Lisää yhteystietoja ja aukioloaikoja helposti",
+ "li3": "Voidaan lisätä muille verkkosivuille iFramen muodossa",
+ "li4": "Osa OpenStreetMap-ekosysteemiä, johon kuuluu paljon työkaluja",
+ "li5": "Mahdollisuus tuota olemassa olevia aineistoja",
+ "li6": "Paljon kehittyneitä ominaisuuksia, kuten puiden tunnistus ja kehittyneet syöttömenetelmät",
+ "li7": "Avoimen lähdekoodin ohjelmisto (GPL-lisenssillä) ja ilmainen käyttää",
"title": "Mikä MapComplete on?"
},
+ "onwheels": "Myös sisätilakartat pyörätuolillä liikkuville on käytettävissä.",
+ "osm": "OpenStreetMap on verkkokartta, jota voi muokata ja uudelleenkäyttää kuka tahansa mihin tahansa tarkoitukseen, kunhan lähde nimetään asianmukaisesti sekä data pidetään avoimena.\n\nSe on maailman suurin paikkatietokanta, ja sitä käytetään tuhansissa sovelluksissa ja verkkosivustoissa.",
"tagline": "Kerää paikkatietoa OpenStreetMapillä",
"title": "mapcomplete.org",
+ "toerisme_vlaanderen": "”Pin your point” -hanke tehtiin yhteistyössä Visit Flandersin kanssa. Yli 160 kartoittajaa lisäsi muutama tuhat penkkiä ja piknikpöytää sekä löysi 100 latausasemaa polkupyörille.",
"whatIsOsm": "Mikä OpenStreetMap on?"
},
"general": {
"404": "Tätä sivua ei ole olemassa",
+ "about": "Muokkaa ja lisää tiettyyn teemaan liittyviä tietoja OpenStreetMapiin helposti",
+ "aboutMapComplete": {
+ "intro": "MapCompletea voi käyttää lisäämään tietoja OpenStreetMapiin yhdestä teemasta. Vastaa kysymyksiin, niin muutoksesi ovat käytettävissä kaikkialla minuuttien kuluessa. Useimmissa teemoissa voi lisätä kuvia tai jopa jättää arvostelun. Teeman ylläpitäjä määrittelee teeman kohteet, kysymykset ja kielet."
+ },
"add": {
"addNew": "Lisää {category}",
+ "backToSelect": "Valitse toinen luokka",
+ "confirmButton": "Lisää {category}
Lisäyksesi näkyy kaikille
",
"confirmLocation": "Vahvista tämä sijainti",
"confirmTitle": "Lisätäänkö {title}?",
- "title": "Lisää uusi kohde"
+ "confirmWarning": "Täällä luomasi kohde näkyy kaikille. Ole hyvä ja lisää kartalle vain kohteita, jotka ovat oikeasti olemassa. Monet sovellukset käyttävät tätä tietoa.",
+ "disableFilters": "Poista käytöstä kaikki suodattimet",
+ "disableFiltersExplanation": "Jotkin kohteet saattavat olla piilossa suodattimen takia",
+ "enableLayer": "Ota käyttöön taso {name}",
+ "hasBeenImported": "Tämä kohde on jo tuotu",
+ "import": {
+ "hasBeenImported": "Tämä kohde on tuotu",
+ "howToTest": "Testaa lisäämällä test=true tai backend=osm-test URL-osoitteeseen. Muutoskokoelma tulostetaan konsoliin. Ole hyvä ja avaa pull request, jotta tämä teema voidaan virallistaa ja tuontipainike ottaa käyttöön.",
+ "importTags": "Kohteelle kirjataan {tags}",
+ "officialThemesOnly": "Tuontipainike ei ole käytössä epävirallisille teemoille vahinkojen välttämiseksi",
+ "wrongType": "Tämä kohde ei ole piste eikä viiva eikä sitä voida tuoda",
+ "wrongTypeToConflate": "Tämä kohde ei ole piste eikä viiva eikä sitä voida yhdistää",
+ "zoomInMore": "Lähennä karttaa lisää, jotta tämän kohteen voi tuoda"
+ },
+ "importTags": "Kohteelle kirjataan {tags}",
+ "intro": "Painoit kohtaa, jolle ei ole vielä tietoa.
",
+ "layerNotEnabled": "Taso {layer} ei ole käytössä. Ota taso käyttöön, jotta voit lisätä kohteen",
+ "openLayerControl": "Avaa tason hallintaikkuna",
+ "pleaseLogin": "Kirjaudu sisään, jotta voit lisätä uuden kohteen",
+ "presetInfo": "Uudelle pisteelle kirjataan {tags}",
+ "stillLoading": "Data latautuu vielä. Odota hetki ennen kuin lisäät uuden kohteen.",
+ "title": "Lisää uusi kohde",
+ "warnVisibleForEveryone": "Lisäyksesi näkyy kaikille",
+ "wrongType": "Tämä kohde ei ole piste eikä viiva eikä sitä voida tuoda",
+ "zoomInFurther": "Lähennä karttaa lisää, jotta kohteen voi lisätä.",
+ "zoomInMore": "Lähennä karttaa lisää, jotta voit tuoda tämän kohteen"
+ },
+ "apply_button": {
+ "appliedOnAnotherObject": "Kohteelle {id} kirjataan {tags}",
+ "isApplied": "Muutokset otetaan käyttöön"
},
"attribution": {
+ "attributionBackgroundLayer": "Nykyinen taustataso on {name}",
+ "attributionBackgroundLayerWithCopyright": "Nykyinen taustataso on {name}: {copyright}",
+ "attributionContent": "Kaiken datan tarjoaa OpenStreetMap, vapaasti uudelleenkäytettävissä Open Database Licensen mukaisesti.
",
+ "attributionTitle": "Kiitokset",
"donate": "Tue MapCompletea rahallisesti",
"editId": "Avaa OpenStreetMap-verkkoeditori tänne",
"editJosm": "Muokkaa täällä JOSM:illa",
"followOnMastodon": "Seuraa MapCompletea Mastodonissa",
+ "iconAttribution": {
+ "title": "Käytetyt kuvakkeet"
+ },
"josmOpened": "JOSM on avattu",
"openIssueTracker": "Ilmoita ohjelmavirheestä",
- "openMapillary": "Avaa Mapillary tänne"
+ "openMapillary": "Avaa Mapillary tänne",
+ "title": "Tekijänoikeudet ja alkuperä"
},
"backToIndex": "Palaa kaikkien teemakarttojen yleiskuvaan",
- "backgroundMap": "Taustakartta",
+ "backgroundMap": "Valitse taustataso",
+ "backgroundSwitch": "Vaihda taustaa",
"cancel": "Peruuta",
"download": {
"title": "Lataa"
@@ -112,12 +192,14 @@
"loginWithOpenStreetMap": "Kirjaudu sisään OpenStreetMapilla",
"logout": "Kirjaudu ulos",
"menu": {
- "aboutMapComplete": "Tietoa MapCompletesta"
+ "aboutMapComplete": "Tietoa MapCompletesta",
+ "filter": "Suodata dataa"
},
"morescreen": {
+ "createYourOwnTheme": "Luo oma MapComplete-teema alusta asti",
"noSearch": "Näytä kaikki teemat",
"searchForATheme": "Etsi teemaa",
- "streetcomplete": "Toinen, samanlainen sovellus on StreetComplete."
+ "streetcomplete": "Toinen, samankaltainen sovellus on StreetComplete."
},
"number": "numero",
"openTheMap": "Avaa kartta",
@@ -126,9 +208,12 @@
"loadingCountry": "Määritetään maata…",
"ph_closed": "suljettu",
"ph_not_known": " ",
- "ph_open": "avattu"
+ "ph_open": "auki"
},
- "pickLanguage": "Valitse kieli: ",
+ "pdf": {
+ "attrBackground": "Taustataso: {background}"
+ },
+ "pickLanguage": "Valitse kieli",
"questionBox": {
"answeredMultiple": "Vastasit {answered} kysymykseen",
"answeredOne": "Vastasit yhteen kysymykseen",
@@ -143,6 +228,7 @@
"search": {
"nothing": "Mitään ei löytynyt…",
"search": "Etsi paikkaa",
+ "searchShort": "Etsi…",
"searching": "Etsitään…"
},
"sharescreen": {
@@ -180,13 +266,24 @@
},
"hotkeyDocumentation": {
"action": "Toiminto",
- "key": "Näppäinyhdistelmä"
+ "key": "Näppäinyhdistelmä",
+ "openLayersPanel": "Avaa taustatasojen paneelin",
+ "selectAerial": "Asettaa taustaksi joko ilma- tai satelliittikuvan. Vaihtaa kahden parhaimman, saatavilla olevan tason välillä",
+ "selectMap": "Asettaa taustaksi kartan ulkoisesta lähteestä. Vaihtaa kahden parhaimman, saatavilla olevan tason välillä",
+ "selectMapnik": "Aseta taustatasoksi OpenStreetMap-carto",
+ "selectOsmbasedmap": "Aseta taustatasoksi OpenStreetMap-pohjainen kartta (tai poista käytöstä rasterimuotoinen taustataso)"
},
"image": {
"addPicture": "Lisää kuva",
+ "currentLicense": "Kuvasi julkaistaan lisenssillä {license}",
"doDelete": "Poista kuva",
"dontDelete": "Peruuta",
"isDeleted": "Poistettu",
+ "nearby": {
+ "link": "Tämä kuva näyttää kohteen",
+ "seeNearby": "Selaa ja linkitä läheisiä kuvia",
+ "title": "Läheiset katukuvat"
+ },
"pleaseLogin": "Kirjaudu sisään, jotta voit lisätä kuvan",
"respectPrivacy": "Älä valokuvaa ihmisiä tai rekisterikilpiä. Älä lähetä kuvia Google Mapsistä, Google Streetview’stä tai muista tekijänoikeuden alaisista lähteistä.",
"uploadDone": "Kuvasi on lisätty. Kiitoksia avusta!",
@@ -198,6 +295,15 @@
"pickTheme": "Aloita valitsemalla teema alta.",
"title": "Tervetuloa MapCompleteen"
},
+ "move": {
+ "inviteToMove": {
+ "generic": "Siirrä tätä pistettä"
+ },
+ "whyMove": "Miksi haluat siirtää tätä pistettä?"
+ },
+ "multi_apply": {
+ "autoApply": "Kun ominaisuuksia {attr_names} muutetaan, nämä ominaisuudet muuttuvat automaattisesti myös {count} muussa kohteessa"
+ },
"plantDetection": {
"tryAgain": "Valitse eri laji"
},
diff --git a/langs/layers/ca.json b/langs/layers/ca.json
index 10e1191bb..f89d20f61 100644
--- a/langs/layers/ca.json
+++ b/langs/layers/ca.json
@@ -284,6 +284,45 @@
"render": "Estació d'Ambulàncies"
}
},
+ "animal_shelter": {
+ "name": "Refugis d'animals",
+ "presets": {
+ "0": {
+ "title": "un refugi d'animals"
+ }
+ },
+ "tagRenderings": {
+ "2": {
+ "question": "Quin nom té aquest refugi d'animals?"
+ },
+ "6": {
+ "mappings": {
+ "0": {
+ "then": "Els animals romanen ací fins que son adoptats per un nou propietari"
+ },
+ "1": {
+ "then": "Els animals reben cures per a la resta de la seva vida"
+ },
+ "2": {
+ "then": "Els animals ferits es rehabiliten aquí fins que puguen ser alliberats de nou a la natura "
+ }
+ },
+ "question": "Quina és la finalitat del refugi d'animals?"
+ },
+ "7": {
+ "question": "Quan està obert aquest refugi d'animals?",
+ "render": "{opening_hours_table()}"
+ }
+ },
+ "title": {
+ "mappings": {
+ "0": {
+ "then": "{name}"
+ }
+ },
+ "render": "Refugi d'animals"
+ }
+ },
"artwork": {
"description": "Un mapa obert d'estàtues, busts, grafitis i altres obres d'art del tot el món",
"name": "Obres d'art",
@@ -1226,7 +1265,7 @@
"Bicycle parking type": {
"mappings": {
"0": {
- "then": "Bastidors de grapes"
+ "then": "Bastidors"
},
"1": {
"then": "Portarodes/bucles"
@@ -1856,6 +1895,216 @@
},
"charging_station": {
"tagRenderings": {
+ "Authentication": {
+ "mappings": {
+ "4": {
+ "then": "L'autenticació mitjançant NFC està disponible"
+ },
+ "5": {
+ "then": "L'autenticació mitjançant targeta de pagament està disponible"
+ },
+ "6": {
+ "then": "L'autenticació mitjançant targeta de debit està disponible"
+ },
+ "7": {
+ "then": "Carregar aquí (també) és possible sense autenticació"
+ }
+ },
+ "question": "Quin tipus d'autenticació hi ha disponible a l'estació de càrrega?"
+ },
+ "Available_charging_stations (generated)": {
+ "mappings": {
+ "0": {
+ "then": "Endoll de paret Schuko sense pin a terra (CEE7/4 tipus F)"
+ },
+ "1": {
+ "then": "Endoll de paret Schuko sense pin a terra (CEE7/4 tipus F)"
+ },
+ "2": {
+ "then": "Endoll de paret Europeu amb pin a terra (CEE7/4 tipus E)"
+ },
+ "3": {
+ "then": "Endoll de paret Europeu amb pin a terra (CEE7/4 tipus E)"
+ },
+ "4": {
+ "then": "CHAdeMo"
+ },
+ "5": {
+ "then": "CHAdeMo"
+ },
+ "6": {
+ "then": "Tipus 1 amb cable"
+ },
+ "7": {
+ "then": "Tipus 1 amb cable"
+ },
+ "8": {
+ "then": "Tipus 1 sense cable"
+ },
+ "9": {
+ "then": "Tipus 1 sense cable(J1772)"
+ },
+ "10": {
+ "then": "CSS Tipus 1 (també conegut com a Tipus 1 Combo)"
+ },
+ "11": {
+ "then": "CSS Tipus 1 (també conegut com a Tipus 1 Combo)"
+ },
+ "12": {
+ "then": "Supercarregador de Tesla"
+ },
+ "13": {
+ "then": "Supercarregador de Tesla"
+ },
+ "14": {
+ "then": "Tipus 2 (mennekes)"
+ },
+ "15": {
+ "then": "Tipus 2 (mennekes)"
+ },
+ "16": {
+ "then": "CSS Tipus 2 (mennekes)"
+ },
+ "17": {
+ "then": "CSS Tipus 2 (mennekes)"
+ }
+ }
+ },
+ "Network": {
+ "question": "Aquesta estació de càrrega forma part d'una xarxa?",
+ "render": "Part de la xarxa {network}"
+ },
+ "OH": {
+ "override": {
+ "question": "Quan està oberta aquesta estació de càrrega?"
+ }
+ },
+ "Operational status": {
+ "mappings": {
+ "0": {
+ "then": "Aquesta estació de càrrega funciona"
+ },
+ "1": {
+ "then": "Aquesta estació de carrega està trencada"
+ },
+ "2": {
+ "then": "Aquí està prevista una estació de recàrrega"
+ },
+ "4": {
+ "then": "Aquesta estació de recàrrega s'ha desactivat permanentment i ja no s'utilitza, però encara és visible"
+ }
+ },
+ "question": "Està en ús aquest punt de càrrega?"
+ },
+ "Operator": {
+ "mappings": {
+ "0": {
+ "then": "De fet, {operator} és la xarxa"
+ }
+ },
+ "question": "Qui és l'operadora d'aquesta estació de càrrega?",
+ "render": "Aquesta estació de càrrega l'opera {operator}"
+ },
+ "Parking:fee": {
+ "mappings": {
+ "0": {
+ "then": "No cal pagar una taxa addicional mentres carrega"
+ },
+ "1": {
+ "then": "Cal pagar una taxa addicional d'aparcament mentres carrega"
+ }
+ },
+ "question": "Cal pagar una taxa d'aparcament mentre es carrega?"
+ },
+ "Type": {
+ "mappings": {
+ "0": {
+ "then": "Aquí es poden carregar bicicletes"
+ },
+ "1": {
+ "then": "Aquí es poden carregar cotxes"
+ },
+ "2": {
+ "then": "Aquí es poden carregar Scooters"
+ },
+ "3": {
+ "then": "Aquí es poden carregar camions o trailers"
+ },
+ "4": {
+ "then": "Aquí es poden carregar autobusos"
+ }
+ },
+ "question": "Quins vehicles tenen permesa la càrrega aquí?"
+ },
+ "access": {
+ "mappings": {
+ "0": {
+ "then": "Qualsevol persona pot utilitzar aquesta estació de recàrrega (pot ser calgui un pagament)"
+ },
+ "1": {
+ "then": "Qualsevol persona pot utilitzar aquesta estació de recàrrega (pot ser calgui un pagament)"
+ },
+ "2": {
+ "then": "Sols clientes del lloc al que pertany aquest punt de càrrega poden utilitzar-lo
p.e. un punt de càrrega d'un hotel que sols poden utilizar-los els hostes"
+ },
+ "3": {
+ "then": "S'ha de sol·licitar una clau per a utilitzar aquest punt de càrrega
p.e un punt de càrrega operat per un hotel nomes utilitzable pel seus hostes, els quals reben una clau des de recepció per a desbloquejar el punt de càrrega"
+ },
+ "4": {
+ "then": "No accessible per al públic general (p.e. només accessible pels propietaris, empleats, ...)"
+ },
+ "5": {
+ "then": "Aquesta estació de càrrega és accessible al públic durant certes hores o condicions. Es poden aplicar restriccions, però es permet l'ús general."
+ }
+ },
+ "question": "Qui pot utilitzar aquesta estació de càrrega?",
+ "render": "L'accés està {access}"
+ },
+ "capacity": {
+ "question": "Quants vehicles poden carregar a la vegada?",
+ "render": "Aquí poden carregar {capacity} vehicles a l'hora"
+ },
+ "charge": {
+ "question": "Quant cal pagar per utilitzar aquesta estació de càrrega?",
+ "render": "Utilitzar aquesta estació de càrrega costa {charge}"
+ },
+ "email": {
+ "question": "Quin és el correu electrònic de l'operadora?",
+ "render": "En cas de problemes, envia un email a {email}"
+ },
+ "fee": {
+ "mappings": {
+ "0": {
+ "then": "Ús gratuït (sense autentificació)"
+ },
+ "1": {
+ "then": "Ús gratuït, però un s'ha d'autentificar"
+ },
+ "2": {
+ "then": "Ús gratuït"
+ },
+ "3": {
+ "then": "De pagament, però gratuït per als clients de l'hotel/bar/hospital/... que gestiona l'estació de càrrega"
+ },
+ "4": {
+ "then": "Ús de pagament"
+ }
+ },
+ "question": "Hi ha que pagar per utilitzar aquest punt de càrrega?"
+ },
+ "maxstay": {
+ "mappings": {
+ "0": {
+ "then": "No hi ha límit de temps per a deixar el teu vehicle aquí"
+ }
+ },
+ "question": "Quina és la quantitat màxima de temps que es permet permaneixer aquí?",
+ "render": "Un pot quedar-se com a màxim {canonical(maxstay)}"
+ },
+ "phone": {
+ "question": "A quin número es pot cridar si hi ha algun problema amb aquest punt de càrrega?",
+ "render": "En cas de problemes, truqueu a {phone}"
+ },
"rewritten-questions": {
"renderings": {
"0": {
@@ -3653,7 +3902,7 @@
"then": "Aquesta és una botiga de kebabs"
},
"4": {
- "then": "Això és un sandvitxeria"
+ "then": "Això és una botiga d'entrepans"
},
"5": {
"then": "Aquí es serveixen hamburgueses"
@@ -3686,13 +3935,13 @@
"then": "Aquí es serveixen plats tailandesos"
}
},
- "question": "Quin menjar es serveix aquí?",
+ "question": "Quin tipus de menjar es serveix aquí?",
"render": "Aquest lloc serveix principalment {cuisine}"
},
"Fastfood vs restaurant": {
"mappings": {
"0": {
- "then": "Aquest és un negoci de menjar ràpid, centrat en el servei ràpid. Si hi han seients disponibles, aquests seràn limitats i funcionals."
+ "then": "Aquest és un negoci de menjar ràpid, centrat en el servei ràpid. Si hi han seients disponibles, aquests seran limitats i funcionals."
},
"1": {
"then": "Un restaurant, centrat en crear una bona experiència on es serveix a taula"
@@ -6665,7 +6914,7 @@
"name": "Botiga",
"presets": {
"0": {
- "description": "Afegir una botiga nova",
+ "description": "Podeu especificar més endavant el que ven aquesta botiga.",
"title": "una botiga"
}
},
@@ -6906,6 +7155,20 @@
}
},
"tagRenderings": {
+ "basketball-hoops": {
+ "mappings": {
+ "1": {
+ "then": "Aquest camp de bàsquet té dos cèrcols"
+ },
+ "2": {
+ "then": "Aquest camp de bàsquet té quatre cèrcols"
+ },
+ "3": {
+ "then": "Aquest camp de bàsquet té {hoops} cèrcols"
+ }
+ },
+ "question": "Quants cèrcols té aquesta pista?"
+ },
"sport-pitch-access": {
"mappings": {
"0": {
@@ -6919,6 +7182,9 @@
},
"3": {
"then": "Privat - no accessible al públic"
+ },
+ "4": {
+ "then": "Accés públic"
}
},
"question": "Aquesta pista d'esports és accessible públicament?"
@@ -6947,6 +7213,9 @@
"mappings": {
"0": {
"then": "Sempre accesible"
+ },
+ "1": {
+ "then": "Sempre accesible"
}
}
},
@@ -6970,6 +7239,9 @@
"4": {
"then": "Aquí es juga al corfbol"
},
+ "5": {
+ "then": "Aquí es juga bàsquet"
+ },
"6": {
"then": "Açò és un skatepark"
}
@@ -6993,6 +7265,12 @@
},
"4": {
"then": "La superfície és formigó"
+ },
+ "5": {
+ "then": "La superfície és grava fina"
+ },
+ "6": {
+ "then": "La superfície d'aquesta pista és Tartan, una superfície sintètica, lleugerament molla i porosa"
}
},
"question": "Quina és la superfície d'aquest camp esportiu?",
@@ -7043,6 +7321,18 @@
},
"question": "Aquestes escales tenen un passamà?"
},
+ "incline": {
+ "mappings": {
+ "0": {
+ "then": "La direcció ascendent és {direction_absolute()}"
+ },
+ "1": {
+ "then": "La direcció descendent és {direction_absolute()}"
+ }
+ },
+ "question": "Quina és la inclinació d'aquestes escales?",
+ "render": "Aquestes escales tenen una inclinació de {incline}"
+ },
"multilevels": {
"override": {
"question": "Entre quines plantes estan aquestes escales?",
@@ -7765,6 +8055,7 @@
}
},
"trail": {
+ "description": "Rutes marcades",
"name": "Camins",
"tagRenderings": {
"Color": {
@@ -7781,6 +8072,19 @@
"3": {
"then": "Ruta groga"
}
+ },
+ "question": "Quin és el color de referència d'aquest sender?",
+ "render": "El color de referència és {colour}"
+ },
+ "Name": {
+ "question": "Quin és el nom d'aquest sender?",
+ "render": "Aquest sender s'anomena {name}"
+ },
+ "Operator tag": {
+ "mappings": {
+ "0": {
+ "then": "Aquest sender és mantingut per Natuurpunt"
+ }
}
},
"trail-length": {
@@ -8110,16 +8414,26 @@
}
}
},
+ "2": {
+ "applicableUnits": {
+ "0": {
+ "human": "{quantity} A"
+ }
+ }
+ },
"3": {
"applicableUnits": {
"0": {
- "human": "{quantity} metre"
+ "human": "{quantity} metre",
+ "humanSingular": "un metre"
},
"1": {
- "human": "{quantity} centimetre"
+ "human": "{quantity} centimetre",
+ "humanSingular": "un centímetre"
},
"2": {
- "human": "{quantity} mil·límetres"
+ "human": "{quantity} mil·límetres",
+ "humanSingular": "un mil·límetre"
},
"3": {
"human": "{quantity} peus"
@@ -8137,12 +8451,37 @@
"humanShort": "{quantity} mph"
}
}
+ },
+ "5": {
+ "applicableUnits": {
+ "0": {
+ "human": "{quantity} minuts",
+ "humanSingular": "un minut"
+ },
+ "1": {
+ "human": "{quantity} hores",
+ "humanSingular": "una hora"
+ },
+ "2": {
+ "human": "{quantity} dies"
+ }
+ }
}
}
},
"usersettings": {
"description": "Una capa especial que no està pensada per mostrar-se en un mapa, però que s'utilitza per configurar la configuració de l'usuari",
"tagRenderings": {
+ "a11y-features": {
+ "mappings": {
+ "0": {
+ "then": "Activar les funcions d'accessibilitat quan s'utilitzen les tecles de fletxa per navegar pel mapa"
+ },
+ "1": {
+ "then": "Sempre habilita les característiques d'accessibilitat"
+ }
+ }
+ },
"all-questions-at-once": {
"mappings": {
"0": {
@@ -8217,7 +8556,7 @@
"1": {
"then": {
"special": {
- "text": "Tens {_unreadMessages}
Open your inbox"
+ "text": "Tens {_unreadMessages} missatges
Obri la safata d'entrada"
}
}
}
@@ -8226,7 +8565,7 @@
"language_picker": {
"mappings": {
"0": {
- "then": "L'idioma es va establir mitjançant un paràmetre d'URL i l'usuari no pot definir-lo.²"
+ "then": "L'idioma es va establir mitjançant un paràmetre d'URL i l'usuari no pot definir-lo."
}
}
},
@@ -8262,6 +8601,9 @@
}
}
},
+ "show_crosshair": {
+ "questionHint": "Això pot ajudar a posicionar amb precisió un nou element"
+ },
"show_debug": {
"mappings": {
"0": {
@@ -8402,22 +8744,37 @@
"question": "Venda de productes carnis"
},
"17": {
- "question": "Venda de flors"
+ "question": "Venda de fruites"
},
"18": {
- "question": "Venda de tiquets d'aparcament"
+ "question": "Venda de maduixes"
},
"19": {
"question": "Venda de flors"
},
"20": {
- "question": "Venda de bitllets de transport públic"
+ "question": "Venda de tiquets d'aparcament"
},
"21": {
"question": "Venda de monedes premsades"
},
"22": {
"question": "Venda de bitllets de transport públic"
+ },
+ "23": {
+ "question": "Venda de llums de bicicletes"
+ },
+ "24": {
+ "question": "Venda de guants"
+ },
+ "25": {
+ "question": "Venda de kits de reparació de bicicletes"
+ },
+ "26": {
+ "question": "Venda de bombes de bicicletes"
+ },
+ "27": {
+ "question": "Venda de cadenat per a bicicletes"
}
}
}
@@ -8506,6 +8863,12 @@
"15": {
"then": "Es venen productes carnis"
},
+ "16": {
+ "then": "Es ven fruita"
+ },
+ "17": {
+ "then": "Es venen maduixes"
+ },
"18": {
"then": "Es venen flors"
},
@@ -8517,6 +8880,21 @@
},
"21": {
"then": "Es venen bitllets de transport públic"
+ },
+ "22": {
+ "then": "Es venen llums per a bicicletes"
+ },
+ "23": {
+ "then": "Es venen guants"
+ },
+ "24": {
+ "then": "Es venen kits de reparació de bicicletes"
+ },
+ "25": {
+ "then": "Es venen bombes de bicicletes"
+ },
+ "26": {
+ "then": "Es venen cadenats per a bicicletes"
}
},
"question": "Que ven aquesta màquina expenedora?",
diff --git a/langs/layers/en.json b/langs/layers/en.json
index 4642248a7..688ca1679 100644
--- a/langs/layers/en.json
+++ b/langs/layers/en.json
@@ -5042,6 +5042,30 @@
"2": {
"1": "a CNC drill",
"2": "CNC drill"
+ },
+ "3": {
+ "1": "a multimedia studio",
+ "2": "multimedia studio"
+ },
+ "4": {
+ "1": "a sewing machine",
+ "2": "sewing machine"
+ },
+ "5": {
+ "1": "a woodworking workshop",
+ "2": "woodworking workshop"
+ },
+ "6": {
+ "1": "a ceramics workshop",
+ "2": "ceramics workshop"
+ },
+ "7": {
+ "1": "a metal workshop",
+ "2": "metal workshop"
+ },
+ "8": {
+ "1": "a bicycle repair workshop",
+ "2": "bicycle repair workshop"
}
}
}
diff --git a/langs/layers/nl.json b/langs/layers/nl.json
index 2be3d0cfa..c7045b56b 100644
--- a/langs/layers/nl.json
+++ b/langs/layers/nl.json
@@ -27,6 +27,9 @@
"advertising": {
"name": "Reclame",
"presets": {
+ "12": {
+ "title": "een muurschildering"
+ },
"3": {
"description": "Een klein uithangbord voor buurtadvertenties, meestal gericht op voetgangers",
"title": "een uithangbord"
@@ -47,9 +50,6 @@
"8": {
"description": "Een stuk groot, weerbestendig textiel met opgedrukte reclameboodschap die permanent aan de muur hangt",
"title": "een spandoek"
- },
- "12": {
- "title": "een muurschildering"
}
},
"tagRenderings": {
@@ -107,6 +107,9 @@
},
"title": {
"mappings": {
+ "10": {
+ "then": "Muurschildering"
+ },
"3": {
"then": "Aanplakzuil"
},
@@ -124,9 +127,6 @@
},
"9": {
"then": "Aanplakzuil"
- },
- "10": {
- "then": "Muurschildering"
}
}
}
@@ -208,6 +208,15 @@
"1": {
"then": "Muurschildering"
},
+ "10": {
+ "then": "Azulejo (Spaanse siertegels)"
+ },
+ "11": {
+ "then": "Tegelwerk"
+ },
+ "12": {
+ "then": "Houtsculptuur"
+ },
"2": {
"then": "Schilderij"
},
@@ -231,15 +240,6 @@
},
"9": {
"then": "Reliëf"
- },
- "10": {
- "then": "Azulejo (Spaanse siertegels)"
- },
- "11": {
- "then": "Tegelwerk"
- },
- "12": {
- "then": "Houtsculptuur"
}
},
"question": "Wat voor soort kunstwerk is dit?",
@@ -1791,6 +1791,27 @@
"1": {
"question": "Heeft een Schuko stekker zonder aardingspin (CEE7/4 type F) "
},
+ "10": {
+ "question": "Heeft een Type 2 met kabel (J1772) "
+ },
+ "11": {
+ "question": "Heeft een Tesla Supercharger CCS (een type2 CCS met Tesla-logo) "
+ },
+ "12": {
+ "question": "Heeft een Tesla Supercharger (destination) "
+ },
+ "13": {
+ "question": "Heeft een Tesla supercharger (destination (Een Type 2 met kabel en Tesla-logo) "
+ },
+ "14": {
+ "question": "Heeft een USB om GSMs en kleine electronica op te laden "
+ },
+ "15": {
+ "question": "Heeft een Bosch Active Connect met 3 pinnen aan een kabel "
+ },
+ "16": {
+ "question": "Heeft een Bosch Active Connect met 5 pinnen aan een kabel "
+ },
"2": {
"question": "Heeft een Europese stekker met aardingspin (CEE7/4 type E) "
},
@@ -1814,27 +1835,6 @@
},
"9": {
"question": "Heeft een Type 2 CCS (mennekes) "
- },
- "10": {
- "question": "Heeft een Type 2 met kabel (J1772) "
- },
- "11": {
- "question": "Heeft een Tesla Supercharger CCS (een type2 CCS met Tesla-logo) "
- },
- "12": {
- "question": "Heeft een Tesla Supercharger (destination) "
- },
- "13": {
- "question": "Heeft een Tesla supercharger (destination (Een Type 2 met kabel en Tesla-logo) "
- },
- "14": {
- "question": "Heeft een USB om GSMs en kleine electronica op te laden "
- },
- "15": {
- "question": "Heeft een Bosch Active Connect met 3 pinnen aan een kabel "
- },
- "16": {
- "question": "Heeft een Bosch Active Connect met 5 pinnen aan een kabel "
}
}
}
@@ -1890,30 +1890,6 @@
"1": {
"then": "Schuko stekker zonder aardingspin (CEE7/4 type F)"
},
- "2": {
- "then": "Europese stekker met aardingspin (CEE7/4 type E)"
- },
- "3": {
- "then": "Europese stekker met aardingspin (CEE7/4 type E)"
- },
- "4": {
- "then": "Chademo"
- },
- "5": {
- "then": "Chademo"
- },
- "6": {
- "then": "Type 1 met kabel (J1772)"
- },
- "7": {
- "then": "Type 1 met kabel (J1772)"
- },
- "8": {
- "then": "Type 1 zonder kabel (J1772)"
- },
- "9": {
- "then": "Type 1 zonder kabel (J1772)"
- },
"10": {
"then": "Type 1 CCS (ook gekend als Type 1 Combo)"
},
@@ -1944,6 +1920,9 @@
"19": {
"then": "Type 2 met kabel (J1772)"
},
+ "2": {
+ "then": "Europese stekker met aardingspin (CEE7/4 type E)"
+ },
"20": {
"then": "Tesla Supercharger CCS (een type2 CCS met Tesla-logo)"
},
@@ -1974,11 +1953,32 @@
"29": {
"then": "Bosch Active Connect met 3 pinnen aan een kabel"
},
+ "3": {
+ "then": "Europese stekker met aardingspin (CEE7/4 type E)"
+ },
"30": {
"then": "Bosch Active Connect met 5 pinnen aan een kabel"
},
"31": {
"then": "Bosch Active Connect met 5 pinnen aan een kabel"
+ },
+ "4": {
+ "then": "Chademo"
+ },
+ "5": {
+ "then": "Chademo"
+ },
+ "6": {
+ "then": "Type 1 met kabel (J1772)"
+ },
+ "7": {
+ "then": "Type 1 met kabel (J1772)"
+ },
+ "8": {
+ "then": "Type 1 zonder kabel (J1772)"
+ },
+ "9": {
+ "then": "Type 1 zonder kabel (J1772)"
}
},
"question": "Welke aansluitingen zijn hier beschikbaar?"
@@ -2172,6 +2172,24 @@
"1": {
"2": "Europese stekker met aardingspin (CEE7/4 type E)"
},
+ "10": {
+ "2": "Tesla Supercharger CCS (een type2 CCS met Tesla-logo)"
+ },
+ "11": {
+ "2": "Tesla Supercharger (destination)"
+ },
+ "12": {
+ "2": "Tesla supercharger (destination (Een Type 2 met kabel en Tesla-logo)"
+ },
+ "13": {
+ "2": "USB om GSMs en kleine electronica op te laden"
+ },
+ "14": {
+ "2": "Bosch Active Connect met 3 pinnen aan een kabel"
+ },
+ "15": {
+ "2": "Bosch Active Connect met 5 pinnen aan een kabel"
+ },
"2": {
"2": "Chademo"
},
@@ -2195,24 +2213,6 @@
},
"9": {
"2": "Type 2 met kabel (J1772)"
- },
- "10": {
- "2": "Tesla Supercharger CCS (een type2 CCS met Tesla-logo)"
- },
- "11": {
- "2": "Tesla Supercharger (destination)"
- },
- "12": {
- "2": "Tesla supercharger (destination (Een Type 2 met kabel en Tesla-logo)"
- },
- "13": {
- "2": "USB om GSMs en kleine electronica op te laden"
- },
- "14": {
- "2": "Bosch Active Connect met 3 pinnen aan een kabel"
- },
- "15": {
- "2": "Bosch Active Connect met 5 pinnen aan een kabel"
}
}
}
@@ -2978,6 +2978,15 @@
"1": {
"then": "Dit fietspad is geplaveid"
},
+ "10": {
+ "then": "Dit fietspad is gemaakt van fijn grind"
+ },
+ "11": {
+ "then": "Dit fietspad is gemaakt van kiezelsteentjes"
+ },
+ "12": {
+ "then": "Dit fietspad is gemaakt van aarde"
+ },
"2": {
"then": "Dit fietspad is gemaakt van asfalt"
},
@@ -3001,15 +3010,6 @@
},
"9": {
"then": "Dit fietspad is gemaakt van grind"
- },
- "10": {
- "then": "Dit fietspad is gemaakt van fijn grind"
- },
- "11": {
- "then": "Dit fietspad is gemaakt van kiezelsteentjes"
- },
- "12": {
- "then": "Dit fietspad is gemaakt van aarde"
}
},
"question": "Waaruit is het oppervlak van het fietspad van gemaakt?",
@@ -3058,6 +3058,15 @@
"1": {
"then": "Dit fietspad is geplaveid"
},
+ "10": {
+ "then": "Dit fietspad is gemaakt van fijn grind"
+ },
+ "11": {
+ "then": "Dit fietspad is gemaakt van kiezelsteentjes"
+ },
+ "12": {
+ "then": "Dit fietspad is gemaakt van aarde"
+ },
"2": {
"then": "Dit fietspad is gemaakt van asfalt"
},
@@ -3081,15 +3090,6 @@
},
"9": {
"then": "Dit fietspad is gemaakt van grind"
- },
- "10": {
- "then": "Dit fietspad is gemaakt van fijn grind"
- },
- "11": {
- "then": "Dit fietspad is gemaakt van kiezelsteentjes"
- },
- "12": {
- "then": "Dit fietspad is gemaakt van aarde"
}
},
"question": "Waaruit is het oppervlak van de straat gemaakt?",
@@ -4138,6 +4138,21 @@
"1": {
"then": "Dit is een frituur"
},
+ "10": {
+ "then": "Dit is een Chinees restaurant"
+ },
+ "11": {
+ "then": "Dit is een Grieks restaurant"
+ },
+ "12": {
+ "then": "Dit is een Indisch restaurant"
+ },
+ "13": {
+ "then": "Dit is een Turks restaurant (dat meer dan enkel kebab verkoopt)"
+ },
+ "14": {
+ "then": "Dit is een Thaïs restaurant"
+ },
"2": {
"then": "Dit is een pastazaak"
},
@@ -4161,21 +4176,6 @@
},
"9": {
"then": "Dit is een Frans restaurant"
- },
- "10": {
- "then": "Dit is een Chinees restaurant"
- },
- "11": {
- "then": "Dit is een Grieks restaurant"
- },
- "12": {
- "then": "Dit is een Indisch restaurant"
- },
- "13": {
- "then": "Dit is een Turks restaurant (dat meer dan enkel kebab verkoopt)"
- },
- "14": {
- "then": "Dit is een Thaïs restaurant"
}
},
"question": "Welk soort gerechten worden hier geserveerd?",
@@ -4516,6 +4516,30 @@
"2": {
"1": "een CNC-boormachine",
"2": "CNC-boormachine"
+ },
+ "3": {
+ "1": "een multimedia-studio",
+ "2": "multimedia-studio"
+ },
+ "4": {
+ "1": "een naaimachine",
+ "2": "naaimachine"
+ },
+ "5": {
+ "1": "een houtbewerkingsatelier",
+ "2": "houtbewerkingsatelier"
+ },
+ "6": {
+ "1": "een keramiekatelier",
+ "2": "keramiekatelier"
+ },
+ "7": {
+ "1": "een metaalatelier",
+ "2": "metaalatelier"
+ },
+ "8": {
+ "1": "een fietsherstelplaats",
+ "2": "fietsherstelplaats"
}
}
}
@@ -5322,6 +5346,19 @@
}
}
},
+ "10": {
+ "options": {
+ "0": {
+ "question": "Alle Notes"
+ },
+ "1": {
+ "question": "Verberg import Notes"
+ },
+ "2": {
+ "question": "Toon enkel import Notes"
+ }
+ }
+ },
"2": {
"options": {
"0": {
@@ -5377,19 +5414,6 @@
"question": "Toon enkel open Notes"
}
}
- },
- "10": {
- "options": {
- "0": {
- "question": "Alle Notes"
- },
- "1": {
- "question": "Verberg import Notes"
- },
- "2": {
- "question": "Toon enkel import Notes"
- }
- }
}
},
"name": "OpenStreetMap Notes",
@@ -5681,6 +5705,21 @@
"1": {
"then": "Dit is een normale parkeerplek."
},
+ "10": {
+ "then": "Deze parkeerplek is gereserveerd voor ouders met kinderen."
+ },
+ "11": {
+ "then": "Deze parkeerplek is gereserveerd voor personeel."
+ },
+ "12": {
+ "then": "Deze parkeerplek is gereserveerd voor taxis."
+ },
+ "13": {
+ "then": "Deze parkeerplek is gereserveerd voor voertuigen met een aanhanger."
+ },
+ "14": {
+ "then": "Deze parkeerplek is gereserveerd voor autodelen."
+ },
"2": {
"then": "Dit is een gehandicaptenparkeerplaats."
},
@@ -5704,21 +5743,6 @@
},
"9": {
"then": "Deze parkeerplek is gereserveerd voor motoren."
- },
- "10": {
- "then": "Deze parkeerplek is gereserveerd voor ouders met kinderen."
- },
- "11": {
- "then": "Deze parkeerplek is gereserveerd voor personeel."
- },
- "12": {
- "then": "Deze parkeerplek is gereserveerd voor taxis."
- },
- "13": {
- "then": "Deze parkeerplek is gereserveerd voor voertuigen met een aanhanger."
- },
- "14": {
- "then": "Deze parkeerplek is gereserveerd voor autodelen."
}
},
"question": "Wat voor parkeerplek is dit?"
@@ -6285,6 +6309,21 @@
"1": {
"then": "Munten van 2 cent worden geaccepteerd"
},
+ "10": {
+ "then": "Munten van 20 rappen worden geaccepteerd"
+ },
+ "11": {
+ "then": "Munten van ½ frank worden geaccepteerd"
+ },
+ "12": {
+ "then": "Munten van 1 frank worden geaccepteerd"
+ },
+ "13": {
+ "then": "Munten van 2 frank worden geaccepteerd"
+ },
+ "14": {
+ "then": "Munten van 5 frank worden geaccepteerd"
+ },
"2": {
"then": "Munten van 5 cent worden geaccepteerd"
},
@@ -6308,21 +6347,6 @@
},
"9": {
"then": "Munten van 10 rappen worden geaccepteerd"
- },
- "10": {
- "then": "Munten van 20 rappen worden geaccepteerd"
- },
- "11": {
- "then": "Munten van ½ frank worden geaccepteerd"
- },
- "12": {
- "then": "Munten van 1 frank worden geaccepteerd"
- },
- "13": {
- "then": "Munten van 2 frank worden geaccepteerd"
- },
- "14": {
- "then": "Munten van 5 frank worden geaccepteerd"
}
},
"question": "Met welke munten kan je hier betalen?"
@@ -6335,6 +6359,15 @@
"1": {
"then": "Biljetten van 10 euro worden geaccepteerd"
},
+ "10": {
+ "then": "Biljetten van 100 frank worden geaccepteerd"
+ },
+ "11": {
+ "then": "Biljetten van 200 frank worden geaccepteerd"
+ },
+ "12": {
+ "then": "Biljetten van 1000 frank worden geaccepteerd"
+ },
"2": {
"then": "Biljetten van 20 euro worden geaccepteerd"
},
@@ -6358,15 +6391,6 @@
},
"9": {
"then": "Biljetten van 50 frank worden geaccepteerd"
- },
- "10": {
- "then": "Biljetten van 100 frank worden geaccepteerd"
- },
- "11": {
- "then": "Biljetten van 200 frank worden geaccepteerd"
- },
- "12": {
- "then": "Biljetten van 1000 frank worden geaccepteerd"
}
},
"question": "Met welke bankbiljetten kan je hier betalen?"
@@ -6685,30 +6709,6 @@
"1": {
"question": "Recycling van batterijen"
},
- "2": {
- "question": "Recycling van drankpakken"
- },
- "3": {
- "question": "Recycling van blikken"
- },
- "4": {
- "question": "Recycling van kleding"
- },
- "5": {
- "question": "Recycling van frituurvet"
- },
- "6": {
- "question": "Recycling van motorolie"
- },
- "7": {
- "question": "Recycling van tl-buizen"
- },
- "8": {
- "question": "Recycling van groen afval"
- },
- "9": {
- "question": "Recycling van glazen flessen"
- },
"10": {
"question": "Recycling van glas"
},
@@ -6739,11 +6739,35 @@
"19": {
"question": "Recycling van restafval"
},
+ "2": {
+ "question": "Recycling van drankpakken"
+ },
"20": {
"question": "Recycling van inktpatronen"
},
"21": {
"question": "Recycling van fietsen"
+ },
+ "3": {
+ "question": "Recycling van blikken"
+ },
+ "4": {
+ "question": "Recycling van kleding"
+ },
+ "5": {
+ "question": "Recycling van frituurvet"
+ },
+ "6": {
+ "question": "Recycling van motorolie"
+ },
+ "7": {
+ "question": "Recycling van tl-buizen"
+ },
+ "8": {
+ "question": "Recycling van groen afval"
+ },
+ "9": {
+ "question": "Recycling van glazen flessen"
}
}
},
@@ -6811,30 +6835,6 @@
"1": {
"then": "Drankpakken kunnen hier gerecycled worden"
},
- "2": {
- "then": "Blikken kunnen hier gerecycled worden"
- },
- "3": {
- "then": "Kleren kunnen hier gerecycled worden"
- },
- "4": {
- "then": "Frituurvet kan hier gerecycled worden"
- },
- "5": {
- "then": "Motorolie kan hier gerecycled worden"
- },
- "6": {
- "then": "TL-buizen kunnen hier gerecycled worden"
- },
- "7": {
- "then": "Groen afval kan hier gerecycled worden"
- },
- "8": {
- "then": "Organisch afval kan hier gerecycled worden"
- },
- "9": {
- "then": "Glazen flessen kunnen hier gerecycled worden"
- },
"10": {
"then": "Glas kan hier gerecycled worden"
},
@@ -6865,6 +6865,9 @@
"19": {
"then": "Schoenen kunnen hier gerecycled worden"
},
+ "2": {
+ "then": "Blikken kunnen hier gerecycled worden"
+ },
"20": {
"then": "Kleine elektrische apparaten kunnen hier gerecycled worden"
},
@@ -6879,6 +6882,27 @@
},
"24": {
"then": "Fietsen (en fietswrakken) kunnen hier gerecycled worden"
+ },
+ "3": {
+ "then": "Kleren kunnen hier gerecycled worden"
+ },
+ "4": {
+ "then": "Frituurvet kan hier gerecycled worden"
+ },
+ "5": {
+ "then": "Motorolie kan hier gerecycled worden"
+ },
+ "6": {
+ "then": "TL-buizen kunnen hier gerecycled worden"
+ },
+ "7": {
+ "then": "Groen afval kan hier gerecycled worden"
+ },
+ "8": {
+ "then": "Organisch afval kan hier gerecycled worden"
+ },
+ "9": {
+ "then": "Glazen flessen kunnen hier gerecycled worden"
}
},
"question": "Wat kan hier gerecycled worden?"
@@ -7600,6 +7624,12 @@
"1": {
"then": "Deze lantaarn gebruikt LEDs"
},
+ "10": {
+ "then": "Deze lantaarn gebruikt hogedruknatriumlampen (oranje met wit)"
+ },
+ "11": {
+ "then": "Deze lantaarn wordt verlicht met gas"
+ },
"2": {
"then": "Deze lantaarn gebruikt gloeilampen"
},
@@ -7623,12 +7653,6 @@
},
"9": {
"then": "Deze lantaarn gebruikt lagedruknatriumlampen (monochroom oranje)"
- },
- "10": {
- "then": "Deze lantaarn gebruikt hogedruknatriumlampen (oranje met wit)"
- },
- "11": {
- "then": "Deze lantaarn wordt verlicht met gas"
}
},
"question": "Wat voor verlichting gebruikt deze lantaarn?"
@@ -8541,6 +8565,20 @@
"usersettings": {
"description": "Een speciale lag die niet getoond wordt op de kaart, maar die de instellingen van de gebruiker weergeeft",
"tagRenderings": {
+ "a11y-features": {
+ "mappings": {
+ "0": {
+ "then": "Schakel toegankelijkheidsmode aan wanneer op de pijltjestoetsen wordt geduwd om de kaart te bewegen"
+ },
+ "1": {
+ "then": "Schakel de toegankelijkheidsmode altijd aan"
+ },
+ "2": {
+ "then": "Gebruik geen toegankelijkheidsmode"
+ }
+ },
+ "question": "Wanneer moet de toegankelijkheidsmode ingeschakeld worden?"
+ },
"all-questions-at-once": {
"mappings": {
"0": {
@@ -8596,8 +8634,12 @@
"mappings": {
"0": {
"then": "Sta kaartrotatie toe"
+ },
+ "1": {
+ "then": "Hou het noorden altijd naar boven"
}
- }
+ },
+ "question": "Moet het noorden altijd naar boven getoond worden?"
},
"inbox": {
"mappings": {
@@ -8607,12 +8649,29 @@
"text": "Ga naar je inbox"
}
}
+ },
+ "1": {
+ "then": {
+ "special": {
+ "text": "Je hebt {_unreadMessages} ongelezen berichten
Ga naar je inbox"
+ }
+ }
+ }
+ }
+ },
+ "language_picker": {
+ "mappings": {
+ "0": {
+ "then": "De taal werd ingesteld via een URL-parameter en kan niet manueel ingesteld worden."
}
}
},
"mangrove-keys": {
"render": {
- "after": "Iedereen die dit bestand bezit, kan met jouw identiteit wijzigingen maken"
+ "after": "Iedereen die dit bestand bezit, kan met jouw identiteit wijzigingen maken",
+ "special": {
+ "text": "Download de private sleutel van je Mangrove-account"
+ }
}
},
"picture-license": {
@@ -8632,7 +8691,15 @@
},
"question": "Met welke licentie wil je je afbeeldingen toevoegen?"
},
+ "settings-link": {
+ "render": {
+ "special": {
+ "text": "Open je instellingen op OpenStreetMap.org"
+ }
+ }
+ },
"show_crosshair": {
+ "question": "Moet er een kruisje getoond worden in het centrum van je display?",
"questionHint": "Dit kan helpen om nieuwe elementen accuraat te plaatsen"
},
"show_debug": {
@@ -8729,30 +8796,6 @@
"1": {
"question": "Verkoop van dranken"
},
- "2": {
- "question": "Verkoop van snoep"
- },
- "3": {
- "question": "Verkoop van eten"
- },
- "4": {
- "question": "Verkoop van sigaretten"
- },
- "5": {
- "question": "Verkoop van condooms"
- },
- "6": {
- "question": "Verkoop van koffie"
- },
- "7": {
- "question": "Verkoop van water"
- },
- "8": {
- "question": "Verkoop van kranten"
- },
- "9": {
- "question": "Verkoop van fietsbinnenbanden"
- },
"10": {
"question": "Verkoop van melk"
},
@@ -8783,6 +8826,9 @@
"19": {
"question": "Verkoop van bloemen"
},
+ "2": {
+ "question": "Verkoop van snoep"
+ },
"23": {
"question": "Verkoop van fietslampjes"
},
@@ -8797,6 +8843,27 @@
},
"27": {
"question": "Verkoop van fietssloten"
+ },
+ "3": {
+ "question": "Verkoop van eten"
+ },
+ "4": {
+ "question": "Verkoop van sigaretten"
+ },
+ "5": {
+ "question": "Verkoop van condooms"
+ },
+ "6": {
+ "question": "Verkoop van koffie"
+ },
+ "7": {
+ "question": "Verkoop van water"
+ },
+ "8": {
+ "question": "Verkoop van kranten"
+ },
+ "9": {
+ "question": "Verkoop van fietsbinnenbanden"
}
}
}
@@ -8837,30 +8904,6 @@
"1": {
"then": "Snoep wordt verkocht"
},
- "2": {
- "then": "Eten wordt verkocht"
- },
- "3": {
- "then": "Sigaretten worden verkocht"
- },
- "4": {
- "then": "Condooms worden verkocht"
- },
- "5": {
- "then": "Koffie wordt verkocht"
- },
- "6": {
- "then": "Drinkwater wordt verkocht"
- },
- "7": {
- "then": "Kranten worden verkocht"
- },
- "8": {
- "then": "Binnenbanden voor fietsen worden verkocht"
- },
- "9": {
- "then": "Melk wordt verkocht"
- },
"10": {
"then": "Brood wordt verkocht"
},
@@ -8891,6 +8934,9 @@
"19": {
"then": "Parkeerkaarten worden verkocht"
},
+ "2": {
+ "then": "Eten wordt verkocht"
+ },
"21": {
"then": "Openbaar vervoerkaartjes worden verkocht"
},
@@ -8908,6 +8954,27 @@
},
"26": {
"then": "Fietssloten worden verkocht"
+ },
+ "3": {
+ "then": "Sigaretten worden verkocht"
+ },
+ "4": {
+ "then": "Condooms worden verkocht"
+ },
+ "5": {
+ "then": "Koffie wordt verkocht"
+ },
+ "6": {
+ "then": "Drinkwater wordt verkocht"
+ },
+ "7": {
+ "then": "Kranten worden verkocht"
+ },
+ "8": {
+ "then": "Binnenbanden voor fietsen worden verkocht"
+ },
+ "9": {
+ "then": "Melk wordt verkocht"
}
},
"question": "Wat verkoopt deze verkoopautomaat?",
@@ -9200,4 +9267,4 @@
"render": "windturbine"
}
}
-}
\ No newline at end of file
+}
diff --git a/langs/themes/ca.json b/langs/themes/ca.json
index 53f08009d..933eb133c 100644
--- a/langs/themes/ca.json
+++ b/langs/themes/ca.json
@@ -464,7 +464,7 @@
"description": "Aquest mapa mostra xarxes de nodes ciclistes i et permet afegir-ne de nous de manera senzilla",
"layers": {
"0": {
- "name": "enllaços node a node",
+ "name": "Enllaços node a node",
"tagRenderings": {
"node2node-survey:date": {
"override": {
@@ -483,12 +483,21 @@
}
},
"1": {
- "name": "nodes",
+ "name": "Nodes",
+ "presets": {
+ "0": {
+ "title": "un node ciclista"
+ }
+ },
"tagRenderings": {
"node-expected_rcn_route_relations": {
"question": "A quants altes nodes ciclistes enllaça aquest node?",
"render": "Aquest node enllaça a {expected_rcn_route_relations} altres nodes ciclistes."
},
+ "node-rxn_ref": {
+ "question": "Quin és el número de referència d'aquest node ciclista?",
+ "render": "Aquest node ciclista té la referència número {rcn_ref}"
+ },
"node-survey:date": {
"override": {
"question": "Quan va ser sondejat aquest node ciclista per última vegada?",
@@ -746,6 +755,18 @@
"layers": {
"0": {
"override": {
+ "filter+": {
+ "0": {
+ "options": {
+ "1": {
+ "question": "Només mostra freiduries que utilitzen oli vegetal"
+ },
+ "2": {
+ "question": "Només mostra freiduries que utilitzen oli animal"
+ }
+ }
+ }
+ },
"name": "Botigues de patates"
}
}
@@ -785,6 +806,9 @@
}
}
},
+ "guideposts": {
+ "title": "Pal guia"
+ },
"hackerspaces": {
"description": "En aquest mapa podeu veure els hackerspaces, afegir un nou hackerspace o actualitzar les dades directament",
"shortDescription": "Un mapa dels hackerspaces",
@@ -820,6 +844,10 @@
"description": "En aquest mapa trobareu hotels a la vostra zona",
"title": "Hotels"
},
+ "icecream": {
+ "description": "Un mapa que mostra les gelateries i les màquines expenedores de gelats",
+ "title": "Gelat"
+ },
"indoors": {
"description": "En aquest mapa es mostren els llocs interiors accessibles al públic",
"title": "Interiors"
@@ -840,6 +868,111 @@
},
"title": "Vorals i encreuaments"
},
+ "mapcomplete-changes": {
+ "description": "Aquest mapa mostra tots els canvis fets amb MapComplete",
+ "layers": {
+ "0": {
+ "description": "Mostra tots els canvis de MapComplete",
+ "filter": {
+ "0": {
+ "options": {
+ "0": {
+ "question": "El nom del tema conté {search}"
+ }
+ }
+ },
+ "2": {
+ "options": {
+ "0": {
+ "question": "Fet pel col·laborador {search}"
+ }
+ }
+ },
+ "3": {
+ "options": {
+ "0": {
+ "question": "No fet pel col·laborador {search}"
+ }
+ }
+ },
+ "4": {
+ "options": {
+ "0": {
+ "question": "Fet abans de {search}"
+ }
+ }
+ },
+ "5": {
+ "options": {
+ "0": {
+ "question": "Fet després de {search}"
+ }
+ }
+ },
+ "6": {
+ "options": {
+ "0": {
+ "question": "Idioma de l'usuari (codi iso) {search}"
+ }
+ }
+ },
+ "7": {
+ "options": {
+ "0": {
+ "question": "Fet amb l'amfitrió {search}"
+ }
+ }
+ },
+ "8": {
+ "options": {
+ "0": {
+ "question": "El conjunt de canvis ha afegit almenys una imatge"
+ }
+ }
+ }
+ },
+ "tagRenderings": {
+ "contributor": {
+ "question": "Quin col·laborador va fer aquest canvi?",
+ "render": "Canvi fet per {user}"
+ },
+ "host": {
+ "question": "Amb quin amfitrió (lloc web) es va fer aquest canvi?",
+ "render": "Canviat amb {host}"
+ },
+ "locale": {
+ "question": "Amb quina configuració regional (idioma) s'ha fet aquest canvi?",
+ "render": "La configuració regional de l'usuari és {locale}"
+ },
+ "show_changeset_id": {
+ "render": "Conjunt de canvi {id}"
+ },
+ "theme-id": {
+ "question": "Quin tema es va utilitzar per fer aquest canvi?",
+ "render": "Canvi amb el tema {theme}"
+ },
+ "version": {
+ "question": "Quina versió de MapComplete es va utilitzar per fer aquest canvi?",
+ "render": "Fet amb {editor}"
+ }
+ },
+ "title": {
+ "render": "Conjunt de canvis per a {theme}"
+ }
+ },
+ "1": {
+ "override": {
+ "tagRenderings+": {
+ "0": {
+ "render": "Es pot trobar més estadística aquí"
+ }
+ }
+ }
+ }
+ },
+ "shortDescription": "Mostra els canvis fets amb MapComplete",
+ "title": "Canvis fets amb MapComplete"
+ },
"maproulette": {
"description": "Tema que mostra les tasques de MapRoulette, que us permet cercar-les, filtrar-les i solucionar-les.",
"title": "Tasques de MapRoulette"
diff --git a/public/css/index-tailwind-output.css b/public/css/index-tailwind-output.css
index 1069683f1..271102e3e 100644
--- a/public/css/index-tailwind-output.css
+++ b/public/css/index-tailwind-output.css
@@ -777,6 +777,10 @@ video {
float: left;
}
+.m-8 {
+ margin: 2rem;
+}
+
.m-4 {
margin: 1rem;
}
@@ -789,10 +793,6 @@ video {
margin: 0px;
}
-.m-8 {
- margin: 2rem;
-}
-
.m-2 {
margin: 0.5rem;
}
@@ -1111,6 +1111,10 @@ video {
height: fit-content;
}
+.h-16 {
+ height: 4rem;
+}
+
.h-0 {
height: 0px;
}
@@ -1139,10 +1143,6 @@ video {
height: 1.25rem;
}
-.h-16 {
- height: 4rem;
-}
-
.h-48 {
height: 12rem;
}
@@ -1207,6 +1207,10 @@ video {
width: 1.5rem;
}
+.w-16 {
+ width: 4rem;
+}
+
.w-screen {
width: 100vw;
}
@@ -1241,10 +1245,6 @@ video {
width: 2.75rem;
}
-.w-16 {
- width: 4rem;
-}
-
.w-64 {
width: 16rem;
}
@@ -2254,6 +2254,9 @@ video {
--catch-detail-foregroundcolor: white;
--catch-detail-color-contrast: #fb3afb;
--image-carousel-height: 350px;
+ /** Technical value, used by icon.svelte
+ */
+ --svg-color: #000000;
}
/***********************************************************************\
@@ -2799,6 +2802,10 @@ a.link-underline {
overflow: visible !important;
}
+svg.apply-fill path {
+ fill: var(--svg-color)
+}
+
.compass_arrow {
width: calc( 2.5rem - 1px ) ;
height: calc( 2.5rem - 1px )
diff --git a/scripts/fixSchemas.ts b/scripts/fixSchemas.ts
index 3acfec8ee..8d26dc720 100644
--- a/scripts/fixSchemas.ts
+++ b/scripts/fixSchemas.ts
@@ -6,6 +6,7 @@ import { Utils } from "../src/Utils"
import Validators from "../src/UI/InputElement/Validators"
import { AllKnownLayouts } from "../src/Customizations/AllKnownLayouts"
import { AllSharedLayers } from "../src/Customizations/AllSharedLayers"
+import Constants from "../src/Models/Constants"
const metainfo = {
type: "One of the inputValidator types",
@@ -199,11 +200,12 @@ function extractHintsFrom(
if (hints["suggestions"]) {
const suggestions = hints["suggestions"]
- const f = new Function("{ layers, themes, validators }", suggestions)
+ const f = new Function("{ layers, themes, validators, Constants }", suggestions)
hints["suggestions"] = f({
layers: AllSharedLayers.sharedLayers,
themes: AllKnownLayouts.allKnownLayouts,
validators: Validators,
+ Constants: Constants
})
}
return hints
diff --git a/scripts/prepare-build.sh b/scripts/prepare-build.sh
index 125003744..8b35f308e 100755
--- a/scripts/prepare-build.sh
+++ b/scripts/prepare-build.sh
@@ -16,9 +16,9 @@ export NODE_OPTIONS="--max-old-space-size=16384"
npm run generate:editor-layer-index &&
npm run prep:layeroverview &&
npm run generate && # includes a single "refresh:layeroverview". Resetting the files is unnecessary as they are not in there in the first place
+npm run generate:mapcomplete-changes-theme &&
npm run refresh:layeroverview && # run refresh:layeroverview a second time to propagate all calls
npm run refresh:layeroverview && # run refresh:layeroverview a third time to fix some issues with the favourite layer all calls
-npm run generate:mapcomplete-changes-theme &&
npm run generate:layouts
diff --git a/src/Models/Constants.ts b/src/Models/Constants.ts
index 326087e09..e8e080130 100644
--- a/src/Models/Constants.ts
+++ b/src/Models/Constants.ts
@@ -114,27 +114,42 @@ export default class Constants {
* These are the values that are allowed to use as 'backdrop' icon for a map pin
*/
private static readonly _defaultPinIcons = [
+ "pin",
"square",
"circle",
- "none",
- "pin",
- "person",
- "plus",
- "ring",
- "star",
- "teardrop",
- "triangle",
+ "checkmark",
+ "clock",
+ "close",
"crosshair",
+ "help",
+ "home",
+ "invalid",
+ "location",
+ "location_empty",
+ "location_locked",
+ "note",
+ "resolved",
+ "ring",
+ "scissors",
+ "teardrop",
+ "teardrop_with_hole_green",
+ "triangle",
"brick_wall_square",
"brick_wall_round",
"gps_arrow",
"checkmark",
"help",
- "clock",
- "invalid",
"close",
+ "invalid",
"heart",
"heart_outline",
+ "confirm",
+ "direction",
+ "not_found",
+ "mastodon",
+ "party",
+ "addSmall",
+
] as const
public static readonly defaultPinIcons: string[] = Constants._defaultPinIcons
diff --git a/src/Models/ThemeConfig/Conversion/Validation.ts b/src/Models/ThemeConfig/Conversion/Validation.ts
index 4cbb22e9d..ed4c79098 100644
--- a/src/Models/ThemeConfig/Conversion/Validation.ts
+++ b/src/Models/ThemeConfig/Conversion/Validation.ts
@@ -24,6 +24,7 @@ import { ConversionContext } from "./ConversionContext"
import * as eli from "../../../assets/editor-layer-index.json"
import { AvailableRasterLayers } from "../../RasterLayers"
import Back from "../../../assets/svg/Back.svelte"
+import PointRenderingConfigJson from "../Json/PointRenderingConfigJson"
class ValidateLanguageCompleteness extends DesugaringStep {
private readonly _languages: string[]
@@ -1016,6 +1017,7 @@ export class PrevalidateLayer extends DesugaringStep {
*/
private readonly _path: string
private readonly _studioValidations: boolean
+ private readonly _validatePointRendering = new ValidatePointRendering()
constructor(path: string, isBuiltin, doesImageExist, studioValidations) {
super("Runs various checks against common mistakes for a layer", [], "PrevalidateLayer")
@@ -1105,6 +1107,8 @@ export class PrevalidateLayer extends DesugaringStep {
context.enter("pointRendering").err("There are no pointRenderings at all...")
}
+ json.pointRendering?.forEach((pr,i) => this._validatePointRendering.convert(pr, context.enters("pointeRendering", i)))
+
if (json["mapRendering"]) {
context.enter("mapRendering").err("This layer has a legacy 'mapRendering'")
}
@@ -1409,13 +1413,40 @@ export class ValidateLayerConfig extends DesugaringStep {
}
}
+class ValidatePointRendering extends DesugaringStep {
+ constructor() {
+ super("Various checks for pointRenderings", [], "ValidatePOintRendering")
+ }
+
+ convert(json: PointRenderingConfigJson, context: ConversionContext): PointRenderingConfigJson {
+ if (json.marker === undefined && json.label === undefined) {
+ context.err(`A point rendering should define at least an marker or a label`)
+ }
+
+ if (json["markers"]) {
+ context.enter("markers").err(`Detected a field 'markerS' in pointRendering. It is written as a singular case`)
+ }
+ if (json.marker && !Array.isArray(json.marker)) {
+ context.enter("marker").err(
+ "The marker in a pointRendering should be an array"
+ )
+ }
+ if (json.location.length == 0) {
+ context.enter("location").err (
+ "A pointRendering should have at least one 'location' to defined where it should be rendered. "
+ )
+ }
+ return json
+
+
+ }
+}
export class ValidateLayer extends Conversion<
LayerConfigJson,
{ parsed: LayerConfig; raw: LayerConfigJson }
> {
private readonly _skipDefaultLayers: boolean
private readonly _prevalidation: PrevalidateLayer
-
constructor(
path: string,
isBuiltin: boolean,
diff --git a/src/Models/ThemeConfig/Json/LayerConfigJson.ts b/src/Models/ThemeConfig/Json/LayerConfigJson.ts
index b161e8727..ef3b43196 100644
--- a/src/Models/ThemeConfig/Json/LayerConfigJson.ts
+++ b/src/Models/ThemeConfig/Json/LayerConfigJson.ts
@@ -506,7 +506,7 @@ export interface LayerConfigJson {
* If the way is part of a relation, MapComplete will attempt to update this relation as well
* question: Should the contributor be able to split ways using this layer?
* iftrue: enable the 'split-roads'-component
- * iffalse: don't enable the split-roads componenet
+ * iffalse: don't enable the split-roads component
* ifunset: don't enable the split-roads component
* group: editing
*/
diff --git a/src/Models/ThemeConfig/Json/PointRenderingConfigJson.ts b/src/Models/ThemeConfig/Json/PointRenderingConfigJson.ts
index d4b69157f..96e94481b 100644
--- a/src/Models/ThemeConfig/Json/PointRenderingConfigJson.ts
+++ b/src/Models/ThemeConfig/Json/PointRenderingConfigJson.ts
@@ -5,7 +5,7 @@ export interface IconConfigJson {
/**
* question: What icon should be used?
* type: icon
- * suggestions: return ["pin","square","circle","checkmark","clock","close","crosshair","help","home","invalid","location","location_empty","location_locked","note","resolved","ring","scissors","teardrop","teardrop_with_hole_green","triangle"].map(i => ({if: "value="+i, then: i, icon: i}))
+ * suggestions: return Constants.defaultPinIcons.map(i => ({if: "value="+i, then: i, icon: i}))
*/
icon: string | MinimalTagRenderingConfigJson | { builtin: string; override: any }
/**
diff --git a/src/Models/ThemeConfig/PointRenderingConfig.ts b/src/Models/ThemeConfig/PointRenderingConfig.ts
index 84a4ecfe4..a522c45a7 100644
--- a/src/Models/ThemeConfig/PointRenderingConfig.ts
+++ b/src/Models/ThemeConfig/PointRenderingConfig.ts
@@ -79,23 +79,7 @@ export default class PointRenderingConfig extends WithContextLoader {
}
})
- if (json.marker === undefined && json.label === undefined) {
- throw `At ${context}: A point rendering should define at least an marker or a label`
- }
- if (json["markers"]) {
- throw `At ${context}.markers: detected a field 'markerS' in pointRendering. It is written as a singular case`
- }
- if (json.marker && !Array.isArray(json.marker)) {
- throw `At ${context}.marker: the marker in a pointRendering should be an array`
- }
- if (this.location.size == 0) {
- throw (
- "A pointRendering should have at least one 'location' to defined where it should be rendered. (At " +
- context +
- ".location)"
- )
- }
this.marker = (json.marker ?? []).map((m) => new IconConfig(m))
if (json.css !== undefined) {
this.cssDef = this.tr("css", undefined)
diff --git a/src/Models/ThemeConfig/TagRenderingConfig.ts b/src/Models/ThemeConfig/TagRenderingConfig.ts
index 384c43912..8a10a6348 100644
--- a/src/Models/ThemeConfig/TagRenderingConfig.ts
+++ b/src/Models/ThemeConfig/TagRenderingConfig.ts
@@ -370,20 +370,9 @@ export default class TagRenderingConfig {
let iconClass = commonSize
if (!!mapping.icon) {
if (typeof mapping.icon === "string" && mapping.icon !== "") {
- let stripped = mapping.icon
- if (stripped.endsWith(".svg")) {
- stripped = stripped.substring(0, stripped.length - 4)
- }
- if (Constants.defaultPinIcons.indexOf(stripped) >= 0) {
- icon = "./assets/svg/" + mapping.icon
- if (!icon.endsWith(".svg")) {
- icon += ".svg"
- }
- } else {
- icon = mapping.icon
- }
+ icon = mapping.icon.trim()
} else if (mapping.icon["path"]) {
- icon = mapping.icon["path"]
+ icon = mapping.icon["path"].trim()
iconClass = mapping.icon["class"] ?? iconClass
}
}
diff --git a/src/UI/BigComponents/OpenBackgroundSelectorButton.svelte b/src/UI/BigComponents/OpenBackgroundSelectorButton.svelte
index 3c2cb555f..e617e877d 100644
--- a/src/UI/BigComponents/OpenBackgroundSelectorButton.svelte
+++ b/src/UI/BigComponents/OpenBackgroundSelectorButton.svelte
@@ -1,7 +1,7 @@
diff --git a/src/UI/Map/Icon.svelte b/src/UI/Map/Icon.svelte
index 7bec894bc..d1d4223aa 100644
--- a/src/UI/Map/Icon.svelte
+++ b/src/UI/Map/Icon.svelte
@@ -1,46 +1,47 @@
{#if icon}
@@ -99,9 +100,9 @@
{:else if icon === "invalid"}
{:else if icon === "heart"}
-
+
{:else if icon === "heart_outline"}
-
+
{:else if icon === "confirm"}
{:else if icon === "direction"}
@@ -118,3 +119,4 @@
{/if}
{/if}
+
diff --git a/src/UI/Popup/TagRendering/TagRenderingEditable.svelte b/src/UI/Popup/TagRendering/TagRenderingEditable.svelte
index f4d82d321..4f02228a0 100644
--- a/src/UI/Popup/TagRendering/TagRenderingEditable.svelte
+++ b/src/UI/Popup/TagRendering/TagRenderingEditable.svelte
@@ -27,7 +27,7 @@
/**
* Indicates if this tagRendering currently shows the attribute or asks the question to _change_ the property
*/
- export let editMode = !config.IsKnown(tags.data) // || showQuestionIfUnknown;
+ export let editMode = !config.IsKnown(tags.data)
if (tags) {
onDestroy(
tags.addCallbackD((tags) => {
diff --git a/src/UI/Popup/TagRendering/TagRenderingQuestion.svelte b/src/UI/Popup/TagRendering/TagRenderingQuestion.svelte
index aeaf3c0da..1d6503523 100644
--- a/src/UI/Popup/TagRendering/TagRenderingQuestion.svelte
+++ b/src/UI/Popup/TagRendering/TagRenderingQuestion.svelte
@@ -159,7 +159,7 @@
}
}
- function onSave() {
+ function onSave(e) {
if (selectedTags === undefined) {
return
}
@@ -198,7 +198,9 @@
function onInputKeypress(e: KeyboardEvent) {
if (e.key === "Enter") {
- onSave()
+ e.preventDefault()
+ e.stopPropagation()
+ onSave(e)
}
}
diff --git a/src/UI/Studio/ArrayMultiAnswer.svelte b/src/UI/Studio/ArrayMultiAnswer.svelte
index 7c8e5b6d5..0af7e7bc5 100644
--- a/src/UI/Studio/ArrayMultiAnswer.svelte
+++ b/src/UI/Studio/ArrayMultiAnswer.svelte
@@ -41,7 +41,6 @@
diff --git a/src/UI/Studio/QuestionPreview.svelte b/src/UI/Studio/QuestionPreview.svelte
index 765772c26..3bcb6025f 100644
--- a/src/UI/Studio/QuestionPreview.svelte
+++ b/src/UI/Studio/QuestionPreview.svelte
@@ -117,7 +117,6 @@
selectedElement={state.exampleFeature}
{config}
editingEnabled={new ImmutableStore(true)}
- showQuestionIfUnknown={true}
{state}
{tags}
/>
diff --git a/src/UI/Studio/SchemaBasedField.svelte b/src/UI/Studio/SchemaBasedField.svelte
index c3dfd08e7..a32ae76f3 100644
--- a/src/UI/Studio/SchemaBasedField.svelte
+++ b/src/UI/Studio/SchemaBasedField.svelte
@@ -190,7 +190,6 @@
editMode={startInEditMode}
{config}
selectedElement={undefined}
- showQuestionIfUnknown={true}
{state}
{tags}
/>
diff --git a/src/UI/Studio/SchemaBasedMultiType.svelte b/src/UI/Studio/SchemaBasedMultiType.svelte
index b66df015c..c6ff4f192 100644
--- a/src/UI/Studio/SchemaBasedMultiType.svelte
+++ b/src/UI/Studio/SchemaBasedMultiType.svelte
@@ -215,7 +215,6 @@
diff --git a/src/UI/Studio/TagRenderingInput.svelte b/src/UI/Studio/TagRenderingInput.svelte
index e425ab44a..41e01a220 100644
--- a/src/UI/Studio/TagRenderingInput.svelte
+++ b/src/UI/Studio/TagRenderingInput.svelte
@@ -139,7 +139,6 @@
diff --git a/src/UI/Test.svelte b/src/UI/Test.svelte
index 5331a9d83..c4d5d1823 100644
--- a/src/UI/Test.svelte
+++ b/src/UI/Test.svelte
@@ -1,16 +1,7 @@
-Acc: {$maxAcc}
-{#if $recentlyShaken}
- SHAKEN
-{/if}
+
diff --git a/src/Utils.ts b/src/Utils.ts
index 73e67ed43..7185b2ddc 100644
--- a/src/Utils.ts
+++ b/src/Utils.ts
@@ -1450,7 +1450,10 @@ In the case that MapComplete is pointed to the testing grounds, the edit will be
public static scrollIntoView(element: HTMLBaseElement | HTMLDivElement) {
// Is the element completely in the view?
- const parentRect = Utils.findParentWithScrolling(element).getBoundingClientRect()
+ const parentRect = Utils.findParentWithScrolling(element)?.getBoundingClientRect()
+ if(!parentRect){
+ return
+ }
const elementRect = element.getBoundingClientRect()
// Check if the element is within the vertical bounds of the parent element
diff --git a/src/assets/schemas/layerconfigmeta.json b/src/assets/schemas/layerconfigmeta.json
index 901780eab..e7c724528 100644
--- a/src/assets/schemas/layerconfigmeta.json
+++ b/src/assets/schemas/layerconfigmeta.json
@@ -253,7 +253,7 @@
"question": "What extra attributes should be calculated with javascript?"
},
"type": "array",
- "description": "A list of extra tags to calculate, specified as \"keyToAssignTo=javascript-expression\".\nThere are a few extra functions available. Refer to Docs/CalculatedTags.md for more information\nThe functions will be run in order, e.g.\n[\nNot found... * \"_max_overlap_m2=Math.max(...feat.overlapsWith(\"someOtherLayer\").map(o => o.overlap))\n \"_max_overlap_ratio=Number(feat._max_overlap_m2)/feat.area\n]\nThe specified tags are evaluated lazily. E.g. if a calculated tag is only used in the popup (e.g. the number of nearby features),\nthe expensive calculation will only be performed then for that feature. This avoids clogging up the contributors PC when all features are loaded.\nIf a tag has to be evaluated strictly, use ':=' instead:\n[\n\"_some_key:=some_javascript_expression\"\n]\nSee the full documentation on [https://github.com/pietervdvn/MapComplete/blob/master/Docs/CalculatedTags.md]"
+ "description": "A list of extra tags to calculate, specified as \"keyToAssignTo=javascript-expression\".\nThere are a few extra functions available. Refer to Docs/CalculatedTags.md for more information\nThe functions will be run in order, e.g.\n[\n \"_max_overlap_m2=Math.max(...feat.overlapsWith(\"someOtherLayer\").map(o => o.overlap))\n \"_max_overlap_ratio=Number(feat._max_overlap_m2)/feat.area\n]\nThe specified tags are evaluated lazily. E.g. if a calculated tag is only used in the popup (e.g. the number of nearby features),\nthe expensive calculation will only be performed then for that feature. This avoids clogging up the contributors PC when all features are loaded.\nIf a tag has to be evaluated strictly, use ':=' instead:\n[\n\"_some_key:=some_javascript_expression\"\n]\nSee the full documentation on [https://github.com/pietervdvn/MapComplete/blob/master/Docs/CalculatedTags.md]"
},
{
"path": [
@@ -1770,6 +1770,81 @@
"if": "value=triangle",
"then": "triangle",
"icon": "triangle"
+ },
+ {
+ "if": "value=brick_wall_square",
+ "then": "brick_wall_square",
+ "icon": "brick_wall_square"
+ },
+ {
+ "if": "value=brick_wall_round",
+ "then": "brick_wall_round",
+ "icon": "brick_wall_round"
+ },
+ {
+ "if": "value=gps_arrow",
+ "then": "gps_arrow",
+ "icon": "gps_arrow"
+ },
+ {
+ "if": "value=checkmark",
+ "then": "checkmark",
+ "icon": "checkmark"
+ },
+ {
+ "if": "value=help",
+ "then": "help",
+ "icon": "help"
+ },
+ {
+ "if": "value=close",
+ "then": "close",
+ "icon": "close"
+ },
+ {
+ "if": "value=invalid",
+ "then": "invalid",
+ "icon": "invalid"
+ },
+ {
+ "if": "value=heart",
+ "then": "heart",
+ "icon": "heart"
+ },
+ {
+ "if": "value=heart_outline",
+ "then": "heart_outline",
+ "icon": "heart_outline"
+ },
+ {
+ "if": "value=confirm",
+ "then": "confirm",
+ "icon": "confirm"
+ },
+ {
+ "if": "value=direction",
+ "then": "direction",
+ "icon": "direction"
+ },
+ {
+ "if": "value=not_found",
+ "then": "not_found",
+ "icon": "not_found"
+ },
+ {
+ "if": "value=mastodon",
+ "then": "mastodon",
+ "icon": "mastodon"
+ },
+ {
+ "if": "value=party",
+ "then": "party",
+ "icon": "party"
+ },
+ {
+ "if": "value=addSmall",
+ "then": "addSmall",
+ "icon": "addSmall"
}
]
},
@@ -10403,7 +10478,7 @@
},
{
"if": "value=unit",
- "then": "unit - Library layer with all common units"
+ "then": "unit - Library layer with all common units. Units can _only_ be imported from this file."
},
{
"if": "value=usersettings",
@@ -10574,6 +10649,17 @@
}
]
},
+ "editButtonAriaLabel": {
+ "description": "When using a screenreader and selecting the 'edit' button, the current rendered value is read aloud in normal circumstances.\nIn some rare cases, this is not desirable. For example, if the rendered value is a link to a website, this link can be selected (and will be read aloud).\nIf the user presses _tab_ again, they'll select the button and have the link read aloud a second time.",
+ "anyOf": [
+ {
+ "$ref": "#/definitions/Record"
+ },
+ {
+ "type": "string"
+ }
+ ]
+ },
"labels": {
"description": "A list of labels. These are strings that are used for various purposes, e.g. to only include a subset of the tagRenderings when reusing a layer",
"type": "array",
@@ -10971,6 +11057,97 @@
],
"description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
},
+ {
+ "path": [
+ "tagRenderings",
+ "mappings",
+ "alsoShowIf"
+ ],
+ "required": false,
+ "hints": {},
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "$ref": "#/definitions/{or:TagConfigJson[];}"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Also show this 'then'-option if the feature matches these tags.\nIdeal for outdated tags."
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "mappings",
+ "alsoShowIf",
+ "and"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "mappings",
+ "alsoShowIf",
+ "or"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
{
"path": [
"tagRenderings",
@@ -11324,6 +11501,10 @@
{
"if": "value=id",
"then": "id Checks for valid identifiers for layers, will automatically replace spaces and uppercase"
+ },
+ {
+ "if": "value=slope",
+ "then": "slope Validates that the slope is a valid number.The accompanying input element uses the gyroscope and the compass to determine the correct incline. The sign of the incline will be set automatically. The bearing of the way is compared to the bearing of the compass, as such, the device knows if it is measuring in the forward or backward direction."
}
]
},
@@ -11544,6 +11725,23 @@
],
"description": "This hint is shown in subtle text under the question.\nThis can give some extra information on what the answer should ook like"
},
+ {
+ "path": [
+ "tagRenderings",
+ "editButtonAriaLabel"
+ ],
+ "required": false,
+ "hints": {},
+ "type": [
+ {
+ "$ref": "#/definitions/Record"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "When using a screenreader and selecting the 'edit' button, the current rendered value is read aloud in normal circumstances.\nIn some rare cases, this is not desirable. For example, if the rendered value is a link to a website, this link can be selected (and will be read aloud).\nIf the user presses _tab_ again, they'll select the button and have the link read aloud a second time."
+ },
{
"path": [
"tagRenderings",
@@ -12108,6 +12306,100 @@
],
"description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
},
+ {
+ "path": [
+ "tagRenderings",
+ "override",
+ "mappings",
+ "alsoShowIf"
+ ],
+ "required": false,
+ "hints": {},
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "$ref": "#/definitions/{or:TagConfigJson[];}"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Also show this 'then'-option if the feature matches these tags.\nIdeal for outdated tags."
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "override",
+ "mappings",
+ "alsoShowIf",
+ "and"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "override",
+ "mappings",
+ "alsoShowIf",
+ "or"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
{
"path": [
"tagRenderings",
@@ -12474,6 +12766,10 @@
{
"if": "value=id",
"then": "id Checks for valid identifiers for layers, will automatically replace spaces and uppercase"
+ },
+ {
+ "if": "value=slope",
+ "then": "slope Validates that the slope is a valid number.The accompanying input element uses the gyroscope and the compass to determine the correct incline. The sign of the incline will be set automatically. The bearing of the way is compared to the bearing of the compass, as such, the device knows if it is measuring in the forward or backward direction."
}
]
},
@@ -12704,6 +13000,24 @@
],
"description": "This hint is shown in subtle text under the question.\nThis can give some extra information on what the answer should ook like"
},
+ {
+ "path": [
+ "tagRenderings",
+ "override",
+ "editButtonAriaLabel"
+ ],
+ "required": false,
+ "hints": {},
+ "type": [
+ {
+ "$ref": "#/definitions/Record"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "When using a screenreader and selecting the 'edit' button, the current rendered value is read aloud in normal circumstances.\nIn some rare cases, this is not desirable. For example, if the rendered value is a link to a website, this link can be selected (and will be read aloud).\nIf the user presses _tab_ again, they'll select the button and have the link read aloud a second time."
+ },
{
"path": [
"tagRenderings",
@@ -13290,6 +13604,100 @@
],
"description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
},
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "mappings",
+ "alsoShowIf"
+ ],
+ "required": false,
+ "hints": {},
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "$ref": "#/definitions/{or:TagConfigJson[];}"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Also show this 'then'-option if the feature matches these tags.\nIdeal for outdated tags."
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "mappings",
+ "alsoShowIf",
+ "and"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "mappings",
+ "alsoShowIf",
+ "or"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
{
"path": [
"tagRenderings",
@@ -13656,6 +14064,10 @@
{
"if": "value=id",
"then": "id Checks for valid identifiers for layers, will automatically replace spaces and uppercase"
+ },
+ {
+ "if": "value=slope",
+ "then": "slope Validates that the slope is a valid number.The accompanying input element uses the gyroscope and the compass to determine the correct incline. The sign of the incline will be set automatically. The bearing of the way is compared to the bearing of the compass, as such, the device knows if it is measuring in the forward or backward direction."
}
]
},
@@ -13886,6 +14298,24 @@
],
"description": "This hint is shown in subtle text under the question.\nThis can give some extra information on what the answer should ook like"
},
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "editButtonAriaLabel"
+ ],
+ "required": false,
+ "hints": {},
+ "type": [
+ {
+ "$ref": "#/definitions/Record"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "When using a screenreader and selecting the 'edit' button, the current rendered value is read aloud in normal circumstances.\nIn some rare cases, this is not desirable. For example, if the rendered value is a link to a website, this link can be selected (and will be read aloud).\nIf the user presses _tab_ again, they'll select the button and have the link read aloud a second time."
+ },
{
"path": [
"tagRenderings",
@@ -14472,6 +14902,103 @@
],
"description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
},
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "override",
+ "mappings",
+ "alsoShowIf"
+ ],
+ "required": false,
+ "hints": {},
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "$ref": "#/definitions/{or:TagConfigJson[];}"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Also show this 'then'-option if the feature matches these tags.\nIdeal for outdated tags."
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "override",
+ "mappings",
+ "alsoShowIf",
+ "and"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "override",
+ "mappings",
+ "alsoShowIf",
+ "or"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
{
"path": [
"tagRenderings",
@@ -14851,6 +15378,10 @@
{
"if": "value=id",
"then": "id Checks for valid identifiers for layers, will automatically replace spaces and uppercase"
+ },
+ {
+ "if": "value=slope",
+ "then": "slope Validates that the slope is a valid number.The accompanying input element uses the gyroscope and the compass to determine the correct incline. The sign of the incline will be set automatically. The bearing of the way is compared to the bearing of the compass, as such, the device knows if it is measuring in the forward or backward direction."
}
]
},
@@ -15091,6 +15622,2652 @@
],
"description": "This hint is shown in subtle text under the question.\nThis can give some extra information on what the answer should ook like"
},
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "override",
+ "editButtonAriaLabel"
+ ],
+ "required": false,
+ "hints": {},
+ "type": [
+ {
+ "$ref": "#/definitions/Record"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "When using a screenreader and selecting the 'edit' button, the current rendered value is read aloud in normal circumstances.\nIn some rare cases, this is not desirable. For example, if the rendered value is a link to a website, this link can be selected (and will be read aloud).\nIf the user presses _tab_ again, they'll select the button and have the link read aloud a second time."
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "override",
+ "labels"
+ ],
+ "required": false,
+ "hints": {},
+ "type": "array",
+ "description": "A list of labels. These are strings that are used for various purposes, e.g. to only include a subset of the tagRenderings when reusing a layer"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "override",
+ "render"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "rendered",
+ "question": "What text should be rendered?",
+ "ifunset": "No text is shown if no predefined options match."
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/Record"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "special": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/Record>"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "type": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "type"
+ ]
+ }
+ ]
+ }
+ },
+ "required": [
+ "special"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "This piece of text will be shown in the infobox.\nIn this text, values within braces (such as {braced(key)}) are replaced by the corresponding `value` in the object.\nFor example, if the object contains tags `amenity=school; name=Windy Hill School`, the render string `This school is named {name}` will be shown to the user as `This school is named Windy Hill School`\nThis text will be shown if:\n- there is no mapping which matches (or there are no matches)\n- no question, no mappings and no 'freeform' is set\nNote that this is a HTML-interpreted value, so you can add links as e.g. '<a href='{website}'>{website}</a>' or include images such as `This is of type A <br><img src='typeA-icon.svg' />`"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "override",
+ "icon"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "icon",
+ "question": "what icon should be shown next to the 'render' value?",
+ "ifunset": "No additional icon is shown next to the always shown text"
+ },
+ "type": [
+ {
+ "type": "object",
+ "properties": {
+ "path": {
+ "description": "The path to the icon\nType: icon",
+ "type": "string"
+ },
+ "class": {
+ "description": "A hint to mapcomplete on how to render this icon within the mapping.\nThis is translated to 'mapping-icon-', so defining your own in combination with a custom CSS is possible (but discouraged)",
+ "type": "string"
+ }
+ },
+ "required": [
+ "path"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "An icon shown next to the rendering; typically shown pretty small\nThis is only shown next to the \"render\" value"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "override",
+ "icon",
+ "path"
+ ],
+ "required": true,
+ "hints": {
+ "typehint": "icon"
+ },
+ "type": "string",
+ "description": "The path to the icon"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "override",
+ "icon",
+ "class"
+ ],
+ "required": false,
+ "hints": {},
+ "type": "string",
+ "description": "A hint to mapcomplete on how to render this icon within the mapping.\nThis is translated to 'mapping-icon-', so defining your own in combination with a custom CSS is possible (but discouraged)"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "override",
+ "condition"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag",
+ "question": "When should this item be shown?",
+ "ifunset": "No specific condition set; always show this tagRendering or ask the question if unkown"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "$ref": "#/definitions/{or:TagConfigJson[];}"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Only show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "override",
+ "condition",
+ "and"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "override",
+ "condition",
+ "or"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "override",
+ "metacondition"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag",
+ "question": "When should this item be shown (including special conditions)?"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "$ref": "#/definitions/{or:TagConfigJson[];}"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "If set, this tag will be evaluated agains the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options.\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "override",
+ "metacondition",
+ "and"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "override",
+ "metacondition",
+ "or"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "override",
+ "description"
+ ],
+ "required": false,
+ "hints": {},
+ "type": [
+ {
+ "$ref": "#/definitions/Record"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "A human-readable text explaining what this tagRendering does.\nMostly used for the shared tagrenderings"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "override",
+ "classes"
+ ],
+ "required": false,
+ "hints": {
+ "question": "What css-classes should be applied to showing this attribute?"
+ },
+ "type": "string",
+ "description": "A list of css-classes to apply to the entire tagRendering.\nThese classes are applied in 'answer'-mode, not in question mode\nThis is only for advanced users.\nValues are split on ` ` (space)"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "mappings"
+ ],
+ "required": false,
+ "hints": {
+ "question": "What are common options?"
+ },
+ "type": "array",
+ "description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "mappings",
+ "if"
+ ],
+ "required": true,
+ "hints": {
+ "typehint": "tag",
+ "question": "What tags should be matched to show this option?"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "If in 'question'-mode and the contributor selects this option, these tags will be applied to the object"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "mappings",
+ "then"
+ ],
+ "required": true,
+ "hints": {
+ "typehint": "rendered",
+ "question": "What corresponding text should be shown?"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/Record"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Shown if the `if` is fulfilled"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "mappings",
+ "icon"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "icon",
+ "question": "What icon should be shown next to this mapping?",
+ "ifunset": "Show no icon"
+ },
+ "type": [
+ {
+ "type": "object",
+ "properties": {
+ "path": {
+ "description": "The path to the icon\nType: icon",
+ "type": "string"
+ },
+ "class": {
+ "description": "Size of the image",
+ "type": "string"
+ }
+ },
+ "required": [
+ "path"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "This icon will only be shown if the value is known, it is not displayed in the options (but might be in the future)"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "mappings",
+ "icon",
+ "path"
+ ],
+ "required": true,
+ "hints": {
+ "typehint": "icon"
+ },
+ "type": "string",
+ "description": "The path to the icon"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "mappings",
+ "icon",
+ "class"
+ ],
+ "required": false,
+ "hints": {},
+ "type": "string",
+ "description": "Size of the image"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "mappings",
+ "hideInAnswer"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag",
+ "question": "Under what circumstances should this mapping be hidden from the possibilities a contributor can pick?",
+ "iftrue": "Never show this mapping as option to pick",
+ "ifunset": "Always show this mapping as option to pick"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "$ref": "#/definitions/{or:TagConfigJson[];}"
+ },
+ {
+ "type": [
+ "string",
+ "boolean"
+ ]
+ }
+ ],
+ "description": "In some cases, multiple taggings exist (e.g. a default assumption, or a commonly mapped abbreviation and a fully written variation).\nIn the latter case, a correct text should be shown, but only a single, canonical tagging should be selectable by the user.\nIn this case, one of the mappings can be hiden by setting this flag.\nTo demonstrate an example making a default assumption:\nmappings: [\n {\n if: \"access=\", -- no access tag present, we assume accessible\n then: \"Accessible to the general public\",\n hideInAnswer: true\n },\n {\n if: \"access=yes\",\n then: \"Accessible to the general public\", -- the user selected this, we add that to OSM\n },\n {\n if: \"access=no\",\n then: \"Not accessible to the public\"\n }\n]\nFor example, for an operator, we have `operator=Agentschap Natuur en Bos`, which is often abbreviated to `operator=ANB`.\nThen, we would add two mappings:\n{\n if: \"operator=Agentschap Natuur en Bos\" -- the non-abbreviated version which should be uploaded\n then: \"Maintained by Agentschap Natuur en Bos\"\n},\n{\n if: \"operator=ANB\", -- we don't want to upload abbreviations\n then: \"Maintained by Agentschap Natuur en Bos\"\n hideInAnswer: true\n}\nHide in answer can also be a tagsfilter, e.g. to make sure an option is only shown when appropriate.\nKeep in mind that this is reverse logic: it will be hidden in the answer if the condition is true, it will thus only show in the case of a mismatch\ne.g., for toilets: if \"wheelchair=no\", we know there is no wheelchair dedicated room.\nFor the location of the changing table, the option \"in the wheelchair accessible toilet is weird\", so we write:\n{\n \"question\": \"Where is the changing table located?\"\n \"mappings\": [\n {\"if\":\"changing_table:location=female\",\"then\":\"In the female restroom\"},\n {\"if\":\"changing_table:location=male\",\"then\":\"In the male restroom\"},\n {\"if\":\"changing_table:location=wheelchair\",\"then\":\"In the wheelchair accessible restroom\", \"hideInAnswer\": \"wheelchair=no\"},\n ]\n}\nAlso have a look for the meta-tags\n{\n if: \"operator=Agentschap Natuur en Bos\",\n then: \"Maintained by Agentschap Natuur en Bos\",\n hideInAnswer: \"_country!=be\"\n}"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "mappings",
+ "hideInAnswer",
+ "and"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "mappings",
+ "hideInAnswer",
+ "or"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "mappings",
+ "alsoShowIf"
+ ],
+ "required": false,
+ "hints": {},
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "$ref": "#/definitions/{or:TagConfigJson[];}"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Also show this 'then'-option if the feature matches these tags.\nIdeal for outdated tags."
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "mappings",
+ "alsoShowIf",
+ "and"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "mappings",
+ "alsoShowIf",
+ "or"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "mappings",
+ "ifnot"
+ ],
+ "required": false,
+ "hints": {
+ "question": "What tags should be applied if this mapping is _not_ chosen?",
+ "ifunset": "Do not apply a tag if a different mapping is chosen."
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "$ref": "#/definitions/{or:TagConfigJson[];}"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Only applicable if 'multiAnswer' is set.\nThis is for situations such as:\n`accepts:coins=no` where one can select all the possible payment methods. However, we want to make explicit that some options _were not_ selected.\nThis can be done with `ifnot`\nNote that we can not explicitly render this negative case to the user, we cannot show `does _not_ accept coins`.\nIf this is important to your usecase, consider using multiple radiobutton-fields without `multiAnswer`"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "mappings",
+ "ifnot",
+ "and"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "mappings",
+ "ifnot",
+ "or"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "mappings",
+ "addExtraTags"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "simple_tag",
+ "question": "What extra tags should be added to the object if this object is chosen?"
+ },
+ "type": "array",
+ "description": "If chosen as answer, these tags will be applied onto the object, together with the tags from the `if`\nNot compatible with multiAnswer.\nThis can be used e.g. to erase other keys which indicate the 'not' value:\n```json\n{\n \"if\": \"crossing:marking=rainbow\",\n \"then\": \"This is a rainbow crossing\",\n \"addExtraTags\": [\"not:crossing:marking=\"]\n}\n```"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "mappings",
+ "searchTerms"
+ ],
+ "required": false,
+ "hints": {
+ "group": "hidden",
+ "question": "If there are many options, what search terms match too?"
+ },
+ "type": "object",
+ "description": "If there are many options, the mappings-radiobuttons will be replaced by an element with a searchfunction\nSearchterms (per language) allow to easily find an option if there are many options"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "mappings",
+ "priorityIf"
+ ],
+ "required": false,
+ "hints": {
+ "group": "hidden"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "$ref": "#/definitions/{or:TagConfigJson[];}"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "If the searchable selector is picked, mappings with this item will have priority and show up even if the others are hidden\nUse this sparingly"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "mappings",
+ "priorityIf",
+ "and"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "mappings",
+ "priorityIf",
+ "or"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "mappings",
+ "#"
+ ],
+ "required": false,
+ "hints": {
+ "group": "hidden"
+ },
+ "type": "string",
+ "description": "Used for comments or to disable a validation\nignore-image-in-then: normally, a `then`-clause is not allowed to have an `img`-html-element as icons are preferred. In some cases (most notably title-icons), this is allowed"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "multiAnswer"
+ ],
+ "required": false,
+ "hints": {
+ "question": "Should a contributor be allowed to select multiple mappings?",
+ "iftrue": "allow to select multiple mappings",
+ "iffalse": "only allow to select a single mapping",
+ "ifunset": "only allow to select a single mapping"
+ },
+ "type": "boolean",
+ "description": "If true, use checkboxes instead of radio buttons when asking the question"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "freeform"
+ ],
+ "required": false,
+ "hints": {},
+ "type": "object",
+ "description": "Allow freeform text input from the user"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "freeform",
+ "key"
+ ],
+ "required": false,
+ "hints": {
+ "question": "What is the name of the attribute that should be written to?",
+ "ifunset": "do not offer a freeform textfield as answer option"
+ },
+ "type": "string",
+ "description": "This is the OpenStreetMap-key that that value will be written to"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "freeform",
+ "type"
+ ],
+ "required": false,
+ "hints": {
+ "question": "What is the input type?",
+ "ifunset": "use an unconstrained string as input (default)",
+ "suggestions": [
+ {
+ "if": "value=string",
+ "then": "string A simple piece of text"
+ },
+ {
+ "if": "value=text",
+ "then": "text A longer piece of text. Uses an textArea instead of a textField"
+ },
+ {
+ "if": "value=date",
+ "then": "date A date with date picker"
+ },
+ {
+ "if": "value=nat",
+ "then": "nat A whole, positive number or zero"
+ },
+ {
+ "if": "value=int",
+ "then": "int A whole number, either positive, negative or zero"
+ },
+ {
+ "if": "value=distance",
+ "then": "distance A geographical distance in meters (rounded at two points). Will give an extra minimap with a measurement tool. Arguments: [ zoomlevel, preferredBackgroundMapType (comma separated) ], e.g. `[\"21\", \"map,photo\"]"
+ },
+ {
+ "if": "value=direction",
+ "then": "direction A geographical direction, in degrees. 0° is north, 90° is east, ... Will return a value between 0 (incl) and 360 (excl)."
+ },
+ {
+ "if": "value=wikidata",
+ "then": "wikidata A wikidata identifier, e.g. Q42. "
+ },
+ {
+ "if": "value=pnat",
+ "then": "pnat A strict positive number"
+ },
+ {
+ "if": "value=float",
+ "then": "float A decimal number"
+ },
+ {
+ "if": "value=pfloat",
+ "then": "pfloat A positive decimal number or zero"
+ },
+ {
+ "if": "value=email",
+ "then": "email An email adress"
+ },
+ {
+ "if": "value=url",
+ "then": "url The validatedTextField will format URLs to always be valid and have a https://-header (even though the 'https'-part will be hidden from the user. Furthermore, some tracking parameters will be removed"
+ },
+ {
+ "if": "value=phone",
+ "then": "phone A phone number"
+ },
+ {
+ "if": "value=opening_hours",
+ "then": "opening_hours Has extra elements to easily input when a POI is opened. "
+ },
+ {
+ "if": "value=color",
+ "then": "color Shows a color picker"
+ },
+ {
+ "if": "value=icon",
+ "then": "icon Makes sure that a valid .svg-path is added"
+ },
+ {
+ "if": "value=fediverse",
+ "then": "fediverse Validates fediverse addresses and normalizes them into `@username@server`-format"
+ },
+ {
+ "if": "value=id",
+ "then": "id Checks for valid identifiers for layers, will automatically replace spaces and uppercase"
+ },
+ {
+ "if": "value=slope",
+ "then": "slope Validates that the slope is a valid number.The accompanying input element uses the gyroscope and the compass to determine the correct incline. The sign of the incline will be set automatically. The bearing of the way is compared to the bearing of the compass, as such, the device knows if it is measuring in the forward or backward direction."
+ }
+ ]
+ },
+ "type": "string",
+ "description": "The type of the text-field, e.g. 'string', 'nat', 'float', 'date',...\nSee Docs/SpecialInputElements.md and UI/Input/ValidatedTextField.ts for supported values"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "freeform",
+ "placeholder"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "translation",
+ "group": "expert",
+ "question": "What placeholder text should be shown in the input-element if there is no input?"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/Record"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "A (translated) text that is shown (as gray text) within the textfield"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "freeform",
+ "helperArgs"
+ ],
+ "required": false,
+ "hints": {
+ "group": "expert"
+ },
+ "type": "array",
+ "description": "Extra parameters to initialize the input helper arguments.\nFor semantics, see the 'SpecialInputElements.md'"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "freeform",
+ "addExtraTags"
+ ],
+ "required": false,
+ "hints": {
+ "group": "expert"
+ },
+ "type": "array",
+ "description": "If a value is added with the textfield, these extra tag is addded.\nUseful to add a 'fixme=freeform textfield used - to be checked'"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "freeform",
+ "inline"
+ ],
+ "required": false,
+ "hints": {
+ "group": "expert",
+ "question": "Show the freeform as box within the question?",
+ "iftrue": "show the freeform input field as a small field within the question",
+ "ifunset": "show the freeform input field full-width"
+ },
+ "type": "boolean",
+ "description": "Instead of showing a full-width text field, the text field will be shown within the rendering of the question.\nThis combines badly with special input elements, as it'll distort the layout."
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "freeform",
+ "default"
+ ],
+ "required": false,
+ "hints": {
+ "group": "expert",
+ "question": "What value should be entered in the text field if no value is set?",
+ "ifunset": "do not prefill the textfield"
+ },
+ "type": "string",
+ "description": "This can help people to quickly enter the most common option"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "freeform",
+ "invalidValues"
+ ],
+ "required": false,
+ "hints": {
+ "group": "expert",
+ "question": "What values of the freeform key should be interpreted as 'unknown'?",
+ "ifunset": "The question will be considered answered if any value is set for the key"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "$ref": "#/definitions/{or:TagConfigJson[];}"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "For example, if a feature has `shop=yes`, the question 'what type of shop is this?' should still asked"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "freeform",
+ "invalidValues",
+ "and"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "freeform",
+ "invalidValues",
+ "or"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "question"
+ ],
+ "required": false,
+ "hints": {
+ "question": "What question should be shown to the contributor?",
+ "ifunset": "This tagrendering will be shown if it is known, but cannot be edited by the contributor, effectively resutling in a read-only rendering"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/Record"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "A question is presented ot the user if no mapping matches and the 'freeform' key is not set as well."
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "questionHint"
+ ],
+ "required": false,
+ "hints": {
+ "question": "Should some extra information be shown to the contributor, alongside the question?",
+ "ifunset": "No extra hint is given"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/Record"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "This hint is shown in subtle text under the question.\nThis can give some extra information on what the answer should ook like"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "editButtonAriaLabel"
+ ],
+ "required": false,
+ "hints": {},
+ "type": [
+ {
+ "$ref": "#/definitions/Record"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "When using a screenreader and selecting the 'edit' button, the current rendered value is read aloud in normal circumstances.\nIn some rare cases, this is not desirable. For example, if the rendered value is a link to a website, this link can be selected (and will be read aloud).\nIf the user presses _tab_ again, they'll select the button and have the link read aloud a second time."
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "labels"
+ ],
+ "required": false,
+ "hints": {},
+ "type": "array",
+ "description": "A list of labels. These are strings that are used for various purposes, e.g. to only include a subset of the tagRenderings when reusing a layer"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "render"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "rendered",
+ "question": "What text should be rendered?",
+ "ifunset": "No text is shown if no predefined options match."
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/Record"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "special": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/Record>"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "type": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "type"
+ ]
+ }
+ ]
+ }
+ },
+ "required": [
+ "special"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "This piece of text will be shown in the infobox.\nIn this text, values within braces (such as {braced(key)}) are replaced by the corresponding `value` in the object.\nFor example, if the object contains tags `amenity=school; name=Windy Hill School`, the render string `This school is named {name}` will be shown to the user as `This school is named Windy Hill School`\nThis text will be shown if:\n- there is no mapping which matches (or there are no matches)\n- no question, no mappings and no 'freeform' is set\nNote that this is a HTML-interpreted value, so you can add links as e.g. '<a href='{website}'>{website}</a>' or include images such as `This is of type A <br><img src='typeA-icon.svg' />`"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "icon"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "icon",
+ "question": "what icon should be shown next to the 'render' value?",
+ "ifunset": "No additional icon is shown next to the always shown text"
+ },
+ "type": [
+ {
+ "type": "object",
+ "properties": {
+ "path": {
+ "description": "The path to the icon\nType: icon",
+ "type": "string"
+ },
+ "class": {
+ "description": "A hint to mapcomplete on how to render this icon within the mapping.\nThis is translated to 'mapping-icon-', so defining your own in combination with a custom CSS is possible (but discouraged)",
+ "type": "string"
+ }
+ },
+ "required": [
+ "path"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "An icon shown next to the rendering; typically shown pretty small\nThis is only shown next to the \"render\" value"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "icon",
+ "path"
+ ],
+ "required": true,
+ "hints": {
+ "typehint": "icon"
+ },
+ "type": "string",
+ "description": "The path to the icon"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "icon",
+ "class"
+ ],
+ "required": false,
+ "hints": {},
+ "type": "string",
+ "description": "A hint to mapcomplete on how to render this icon within the mapping.\nThis is translated to 'mapping-icon-', so defining your own in combination with a custom CSS is possible (but discouraged)"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "condition"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag",
+ "question": "When should this item be shown?",
+ "ifunset": "No specific condition set; always show this tagRendering or ask the question if unkown"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "$ref": "#/definitions/{or:TagConfigJson[];}"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Only show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "condition",
+ "and"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "condition",
+ "or"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "metacondition"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag",
+ "question": "When should this item be shown (including special conditions)?"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "$ref": "#/definitions/{or:TagConfigJson[];}"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "If set, this tag will be evaluated agains the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options.\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "metacondition",
+ "and"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "metacondition",
+ "or"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "description"
+ ],
+ "required": false,
+ "hints": {},
+ "type": [
+ {
+ "$ref": "#/definitions/Record"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "A human-readable text explaining what this tagRendering does.\nMostly used for the shared tagrenderings"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "classes"
+ ],
+ "required": false,
+ "hints": {
+ "question": "What css-classes should be applied to showing this attribute?"
+ },
+ "type": "string",
+ "description": "A list of css-classes to apply to the entire tagRendering.\nThese classes are applied in 'answer'-mode, not in question mode\nThis is only for advanced users.\nValues are split on ` ` (space)"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "override",
+ "mappings"
+ ],
+ "required": false,
+ "hints": {
+ "question": "What are common options?"
+ },
+ "type": "array",
+ "description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "override",
+ "mappings",
+ "if"
+ ],
+ "required": true,
+ "hints": {
+ "typehint": "tag",
+ "question": "What tags should be matched to show this option?"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "If in 'question'-mode and the contributor selects this option, these tags will be applied to the object"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "override",
+ "mappings",
+ "then"
+ ],
+ "required": true,
+ "hints": {
+ "typehint": "rendered",
+ "question": "What corresponding text should be shown?"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/Record"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Shown if the `if` is fulfilled"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "override",
+ "mappings",
+ "icon"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "icon",
+ "question": "What icon should be shown next to this mapping?",
+ "ifunset": "Show no icon"
+ },
+ "type": [
+ {
+ "type": "object",
+ "properties": {
+ "path": {
+ "description": "The path to the icon\nType: icon",
+ "type": "string"
+ },
+ "class": {
+ "description": "Size of the image",
+ "type": "string"
+ }
+ },
+ "required": [
+ "path"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "This icon will only be shown if the value is known, it is not displayed in the options (but might be in the future)"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "override",
+ "mappings",
+ "icon",
+ "path"
+ ],
+ "required": true,
+ "hints": {
+ "typehint": "icon"
+ },
+ "type": "string",
+ "description": "The path to the icon"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "override",
+ "mappings",
+ "icon",
+ "class"
+ ],
+ "required": false,
+ "hints": {},
+ "type": "string",
+ "description": "Size of the image"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "override",
+ "mappings",
+ "hideInAnswer"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag",
+ "question": "Under what circumstances should this mapping be hidden from the possibilities a contributor can pick?",
+ "iftrue": "Never show this mapping as option to pick",
+ "ifunset": "Always show this mapping as option to pick"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "$ref": "#/definitions/{or:TagConfigJson[];}"
+ },
+ {
+ "type": [
+ "string",
+ "boolean"
+ ]
+ }
+ ],
+ "description": "In some cases, multiple taggings exist (e.g. a default assumption, or a commonly mapped abbreviation and a fully written variation).\nIn the latter case, a correct text should be shown, but only a single, canonical tagging should be selectable by the user.\nIn this case, one of the mappings can be hiden by setting this flag.\nTo demonstrate an example making a default assumption:\nmappings: [\n {\n if: \"access=\", -- no access tag present, we assume accessible\n then: \"Accessible to the general public\",\n hideInAnswer: true\n },\n {\n if: \"access=yes\",\n then: \"Accessible to the general public\", -- the user selected this, we add that to OSM\n },\n {\n if: \"access=no\",\n then: \"Not accessible to the public\"\n }\n]\nFor example, for an operator, we have `operator=Agentschap Natuur en Bos`, which is often abbreviated to `operator=ANB`.\nThen, we would add two mappings:\n{\n if: \"operator=Agentschap Natuur en Bos\" -- the non-abbreviated version which should be uploaded\n then: \"Maintained by Agentschap Natuur en Bos\"\n},\n{\n if: \"operator=ANB\", -- we don't want to upload abbreviations\n then: \"Maintained by Agentschap Natuur en Bos\"\n hideInAnswer: true\n}\nHide in answer can also be a tagsfilter, e.g. to make sure an option is only shown when appropriate.\nKeep in mind that this is reverse logic: it will be hidden in the answer if the condition is true, it will thus only show in the case of a mismatch\ne.g., for toilets: if \"wheelchair=no\", we know there is no wheelchair dedicated room.\nFor the location of the changing table, the option \"in the wheelchair accessible toilet is weird\", so we write:\n{\n \"question\": \"Where is the changing table located?\"\n \"mappings\": [\n {\"if\":\"changing_table:location=female\",\"then\":\"In the female restroom\"},\n {\"if\":\"changing_table:location=male\",\"then\":\"In the male restroom\"},\n {\"if\":\"changing_table:location=wheelchair\",\"then\":\"In the wheelchair accessible restroom\", \"hideInAnswer\": \"wheelchair=no\"},\n ]\n}\nAlso have a look for the meta-tags\n{\n if: \"operator=Agentschap Natuur en Bos\",\n then: \"Maintained by Agentschap Natuur en Bos\",\n hideInAnswer: \"_country!=be\"\n}"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "override",
+ "mappings",
+ "hideInAnswer",
+ "and"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "override",
+ "mappings",
+ "hideInAnswer",
+ "or"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "override",
+ "mappings",
+ "alsoShowIf"
+ ],
+ "required": false,
+ "hints": {},
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "$ref": "#/definitions/{or:TagConfigJson[];}"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Also show this 'then'-option if the feature matches these tags.\nIdeal for outdated tags."
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "override",
+ "mappings",
+ "alsoShowIf",
+ "and"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "override",
+ "mappings",
+ "alsoShowIf",
+ "or"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "override",
+ "mappings",
+ "ifnot"
+ ],
+ "required": false,
+ "hints": {
+ "question": "What tags should be applied if this mapping is _not_ chosen?",
+ "ifunset": "Do not apply a tag if a different mapping is chosen."
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "$ref": "#/definitions/{or:TagConfigJson[];}"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Only applicable if 'multiAnswer' is set.\nThis is for situations such as:\n`accepts:coins=no` where one can select all the possible payment methods. However, we want to make explicit that some options _were not_ selected.\nThis can be done with `ifnot`\nNote that we can not explicitly render this negative case to the user, we cannot show `does _not_ accept coins`.\nIf this is important to your usecase, consider using multiple radiobutton-fields without `multiAnswer`"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "override",
+ "mappings",
+ "ifnot",
+ "and"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "override",
+ "mappings",
+ "ifnot",
+ "or"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "override",
+ "mappings",
+ "addExtraTags"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "simple_tag",
+ "question": "What extra tags should be added to the object if this object is chosen?"
+ },
+ "type": "array",
+ "description": "If chosen as answer, these tags will be applied onto the object, together with the tags from the `if`\nNot compatible with multiAnswer.\nThis can be used e.g. to erase other keys which indicate the 'not' value:\n```json\n{\n \"if\": \"crossing:marking=rainbow\",\n \"then\": \"This is a rainbow crossing\",\n \"addExtraTags\": [\"not:crossing:marking=\"]\n}\n```"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "override",
+ "mappings",
+ "searchTerms"
+ ],
+ "required": false,
+ "hints": {
+ "group": "hidden",
+ "question": "If there are many options, what search terms match too?"
+ },
+ "type": "object",
+ "description": "If there are many options, the mappings-radiobuttons will be replaced by an element with a searchfunction\nSearchterms (per language) allow to easily find an option if there are many options"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "override",
+ "mappings",
+ "priorityIf"
+ ],
+ "required": false,
+ "hints": {
+ "group": "hidden"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "$ref": "#/definitions/{or:TagConfigJson[];}"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "If the searchable selector is picked, mappings with this item will have priority and show up even if the others are hidden\nUse this sparingly"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "override",
+ "mappings",
+ "priorityIf",
+ "and"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "override",
+ "mappings",
+ "priorityIf",
+ "or"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "override",
+ "mappings",
+ "#"
+ ],
+ "required": false,
+ "hints": {
+ "group": "hidden"
+ },
+ "type": "string",
+ "description": "Used for comments or to disable a validation\nignore-image-in-then: normally, a `then`-clause is not allowed to have an `img`-html-element as icons are preferred. In some cases (most notably title-icons), this is allowed"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "override",
+ "multiAnswer"
+ ],
+ "required": false,
+ "hints": {
+ "question": "Should a contributor be allowed to select multiple mappings?",
+ "iftrue": "allow to select multiple mappings",
+ "iffalse": "only allow to select a single mapping",
+ "ifunset": "only allow to select a single mapping"
+ },
+ "type": "boolean",
+ "description": "If true, use checkboxes instead of radio buttons when asking the question"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "override",
+ "freeform"
+ ],
+ "required": false,
+ "hints": {},
+ "type": "object",
+ "description": "Allow freeform text input from the user"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "override",
+ "freeform",
+ "key"
+ ],
+ "required": false,
+ "hints": {
+ "question": "What is the name of the attribute that should be written to?",
+ "ifunset": "do not offer a freeform textfield as answer option"
+ },
+ "type": "string",
+ "description": "This is the OpenStreetMap-key that that value will be written to"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "override",
+ "freeform",
+ "type"
+ ],
+ "required": false,
+ "hints": {
+ "question": "What is the input type?",
+ "ifunset": "use an unconstrained string as input (default)",
+ "suggestions": [
+ {
+ "if": "value=string",
+ "then": "string A simple piece of text"
+ },
+ {
+ "if": "value=text",
+ "then": "text A longer piece of text. Uses an textArea instead of a textField"
+ },
+ {
+ "if": "value=date",
+ "then": "date A date with date picker"
+ },
+ {
+ "if": "value=nat",
+ "then": "nat A whole, positive number or zero"
+ },
+ {
+ "if": "value=int",
+ "then": "int A whole number, either positive, negative or zero"
+ },
+ {
+ "if": "value=distance",
+ "then": "distance A geographical distance in meters (rounded at two points). Will give an extra minimap with a measurement tool. Arguments: [ zoomlevel, preferredBackgroundMapType (comma separated) ], e.g. `[\"21\", \"map,photo\"]"
+ },
+ {
+ "if": "value=direction",
+ "then": "direction A geographical direction, in degrees. 0° is north, 90° is east, ... Will return a value between 0 (incl) and 360 (excl)."
+ },
+ {
+ "if": "value=wikidata",
+ "then": "wikidata A wikidata identifier, e.g. Q42. "
+ },
+ {
+ "if": "value=pnat",
+ "then": "pnat A strict positive number"
+ },
+ {
+ "if": "value=float",
+ "then": "float A decimal number"
+ },
+ {
+ "if": "value=pfloat",
+ "then": "pfloat A positive decimal number or zero"
+ },
+ {
+ "if": "value=email",
+ "then": "email An email adress"
+ },
+ {
+ "if": "value=url",
+ "then": "url The validatedTextField will format URLs to always be valid and have a https://-header (even though the 'https'-part will be hidden from the user. Furthermore, some tracking parameters will be removed"
+ },
+ {
+ "if": "value=phone",
+ "then": "phone A phone number"
+ },
+ {
+ "if": "value=opening_hours",
+ "then": "opening_hours Has extra elements to easily input when a POI is opened. "
+ },
+ {
+ "if": "value=color",
+ "then": "color Shows a color picker"
+ },
+ {
+ "if": "value=icon",
+ "then": "icon Makes sure that a valid .svg-path is added"
+ },
+ {
+ "if": "value=fediverse",
+ "then": "fediverse Validates fediverse addresses and normalizes them into `@username@server`-format"
+ },
+ {
+ "if": "value=id",
+ "then": "id Checks for valid identifiers for layers, will automatically replace spaces and uppercase"
+ },
+ {
+ "if": "value=slope",
+ "then": "slope Validates that the slope is a valid number.The accompanying input element uses the gyroscope and the compass to determine the correct incline. The sign of the incline will be set automatically. The bearing of the way is compared to the bearing of the compass, as such, the device knows if it is measuring in the forward or backward direction."
+ }
+ ]
+ },
+ "type": "string",
+ "description": "The type of the text-field, e.g. 'string', 'nat', 'float', 'date',...\nSee Docs/SpecialInputElements.md and UI/Input/ValidatedTextField.ts for supported values"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "override",
+ "freeform",
+ "placeholder"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "translation",
+ "group": "expert",
+ "question": "What placeholder text should be shown in the input-element if there is no input?"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/Record"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "A (translated) text that is shown (as gray text) within the textfield"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "override",
+ "freeform",
+ "helperArgs"
+ ],
+ "required": false,
+ "hints": {
+ "group": "expert"
+ },
+ "type": "array",
+ "description": "Extra parameters to initialize the input helper arguments.\nFor semantics, see the 'SpecialInputElements.md'"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "override",
+ "freeform",
+ "addExtraTags"
+ ],
+ "required": false,
+ "hints": {
+ "group": "expert"
+ },
+ "type": "array",
+ "description": "If a value is added with the textfield, these extra tag is addded.\nUseful to add a 'fixme=freeform textfield used - to be checked'"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "override",
+ "freeform",
+ "inline"
+ ],
+ "required": false,
+ "hints": {
+ "group": "expert",
+ "question": "Show the freeform as box within the question?",
+ "iftrue": "show the freeform input field as a small field within the question",
+ "ifunset": "show the freeform input field full-width"
+ },
+ "type": "boolean",
+ "description": "Instead of showing a full-width text field, the text field will be shown within the rendering of the question.\nThis combines badly with special input elements, as it'll distort the layout."
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "override",
+ "freeform",
+ "default"
+ ],
+ "required": false,
+ "hints": {
+ "group": "expert",
+ "question": "What value should be entered in the text field if no value is set?",
+ "ifunset": "do not prefill the textfield"
+ },
+ "type": "string",
+ "description": "This can help people to quickly enter the most common option"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "override",
+ "freeform",
+ "invalidValues"
+ ],
+ "required": false,
+ "hints": {
+ "group": "expert",
+ "question": "What values of the freeform key should be interpreted as 'unknown'?",
+ "ifunset": "The question will be considered answered if any value is set for the key"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "$ref": "#/definitions/{or:TagConfigJson[];}"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "For example, if a feature has `shop=yes`, the question 'what type of shop is this?' should still asked"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "override",
+ "freeform",
+ "invalidValues",
+ "and"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "override",
+ "freeform",
+ "invalidValues",
+ "or"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "override",
+ "question"
+ ],
+ "required": false,
+ "hints": {
+ "question": "What question should be shown to the contributor?",
+ "ifunset": "This tagrendering will be shown if it is known, but cannot be edited by the contributor, effectively resutling in a read-only rendering"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/Record"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "A question is presented ot the user if no mapping matches and the 'freeform' key is not set as well."
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "override",
+ "questionHint"
+ ],
+ "required": false,
+ "hints": {
+ "question": "Should some extra information be shown to the contributor, alongside the question?",
+ "ifunset": "No extra hint is given"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/Record"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "This hint is shown in subtle text under the question.\nThis can give some extra information on what the answer should ook like"
+ },
+ {
+ "path": [
+ "tagRenderings",
+ "renderings",
+ "override",
+ "editButtonAriaLabel"
+ ],
+ "required": false,
+ "hints": {},
+ "type": [
+ {
+ "$ref": "#/definitions/Record"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "When using a screenreader and selecting the 'edit' button, the current rendered value is read aloud in normal circumstances.\nIn some rare cases, this is not desirable. For example, if the rendered value is a link to a website, this link can be selected (and will be read aloud).\nIf the user presses _tab_ again, they'll select the button and have the link read aloud a second time."
+ },
{
"path": [
"tagRenderings",
diff --git a/src/assets/schemas/layoutconfigmeta.json b/src/assets/schemas/layoutconfigmeta.json
index 4f51c924a..53e2252da 100644
--- a/src/assets/schemas/layoutconfigmeta.json
+++ b/src/assets/schemas/layoutconfigmeta.json
@@ -834,7 +834,7 @@
},
{
"if": "value=unit",
- "then": "unit - Library layer with all common units"
+ "then": "unit - Library layer with all common units. Units can _only_ be imported from this file."
},
{
"if": "value=usersettings",
@@ -966,7 +966,7 @@
]
},
"calculatedTags": {
- "description": "A list of extra tags to calculate, specified as \"keyToAssignTo=javascript-expression\".\nThere are a few extra functions available. Refer to Docs/CalculatedTags.md for more information\nThe functions will be run in order, e.g.\n[\nNot found... * \"_max_overlap_m2=Math.max(...feat.overlapsWith(\"someOtherLayer\").map(o => o.overlap))\n \"_max_overlap_ratio=Number(feat._max_overlap_m2)/feat.area\n]\n\nThe specified tags are evaluated lazily. E.g. if a calculated tag is only used in the popup (e.g. the number of nearby features),\nthe expensive calculation will only be performed then for that feature. This avoids clogging up the contributors PC when all features are loaded.\n\nIf a tag has to be evaluated strictly, use ':=' instead:\n\n[\n\"_some_key:=some_javascript_expression\"\n]\n\nSee the full documentation on [https://github.com/pietervdvn/MapComplete/blob/master/Docs/CalculatedTags.md]\n\ngroup: expert\nquestion: What extra attributes should be calculated with javascript?",
+ "description": "A list of extra tags to calculate, specified as \"keyToAssignTo=javascript-expression\".\nThere are a few extra functions available. Refer to Docs/CalculatedTags.md for more information\nThe functions will be run in order, e.g.\n[\n \"_max_overlap_m2=Math.max(...feat.overlapsWith(\"someOtherLayer\").map(o => o.overlap))\n \"_max_overlap_ratio=Number(feat._max_overlap_m2)/feat.area\n]\n\nThe specified tags are evaluated lazily. E.g. if a calculated tag is only used in the popup (e.g. the number of nearby features),\nthe expensive calculation will only be performed then for that feature. This avoids clogging up the contributors PC when all features are loaded.\n\nIf a tag has to be evaluated strictly, use ':=' instead:\n\n[\n\"_some_key:=some_javascript_expression\"\n]\n\nSee the full documentation on [https://github.com/pietervdvn/MapComplete/blob/master/Docs/CalculatedTags.md]\n\ngroup: expert\nquestion: What extra attributes should be calculated with javascript?",
"type": "array",
"items": {
"type": "string"
@@ -1419,6 +1419,17 @@
}
]
},
+ "editButtonAriaLabel": {
+ "description": "When using a screenreader and selecting the 'edit' button, the current rendered value is read aloud in normal circumstances.\nIn some rare cases, this is not desirable. For example, if the rendered value is a link to a website, this link can be selected (and will be read aloud).\nIf the user presses _tab_ again, they'll select the button and have the link read aloud a second time.",
+ "anyOf": [
+ {
+ "$ref": "#/definitions/Record"
+ },
+ {
+ "type": "string"
+ }
+ ]
+ },
"labels": {
"description": "A list of labels. These are strings that are used for various purposes, e.g. to only include a subset of the tagRenderings when reusing a layer",
"type": "array",
@@ -1727,7 +1738,7 @@
"$ref": "#/definitions/default_2"
},
{
- "$ref": "#/definitions/Record"
+ "$ref": "#/definitions/Record"
}
]
}
@@ -2055,7 +2066,7 @@
"question": "What extra attributes should be calculated with javascript?"
},
"type": "array",
- "description": "A list of extra tags to calculate, specified as \"keyToAssignTo=javascript-expression\".\nThere are a few extra functions available. Refer to Docs/CalculatedTags.md for more information\nThe functions will be run in order, e.g.\n[\nNot found... * \"_max_overlap_m2=Math.max(...feat.overlapsWith(\"someOtherLayer\").map(o => o.overlap))\n \"_max_overlap_ratio=Number(feat._max_overlap_m2)/feat.area\n]\nThe specified tags are evaluated lazily. E.g. if a calculated tag is only used in the popup (e.g. the number of nearby features),\nthe expensive calculation will only be performed then for that feature. This avoids clogging up the contributors PC when all features are loaded.\nIf a tag has to be evaluated strictly, use ':=' instead:\n[\n\"_some_key:=some_javascript_expression\"\n]\nSee the full documentation on [https://github.com/pietervdvn/MapComplete/blob/master/Docs/CalculatedTags.md]"
+ "description": "A list of extra tags to calculate, specified as \"keyToAssignTo=javascript-expression\".\nThere are a few extra functions available. Refer to Docs/CalculatedTags.md for more information\nThe functions will be run in order, e.g.\n[\n \"_max_overlap_m2=Math.max(...feat.overlapsWith(\"someOtherLayer\").map(o => o.overlap))\n \"_max_overlap_ratio=Number(feat._max_overlap_m2)/feat.area\n]\nThe specified tags are evaluated lazily. E.g. if a calculated tag is only used in the popup (e.g. the number of nearby features),\nthe expensive calculation will only be performed then for that feature. This avoids clogging up the contributors PC when all features are loaded.\nIf a tag has to be evaluated strictly, use ':=' instead:\n[\n\"_some_key:=some_javascript_expression\"\n]\nSee the full documentation on [https://github.com/pietervdvn/MapComplete/blob/master/Docs/CalculatedTags.md]"
},
{
"path": [
@@ -3627,6 +3638,81 @@
"if": "value=triangle",
"then": "triangle",
"icon": "triangle"
+ },
+ {
+ "if": "value=brick_wall_square",
+ "then": "brick_wall_square",
+ "icon": "brick_wall_square"
+ },
+ {
+ "if": "value=brick_wall_round",
+ "then": "brick_wall_round",
+ "icon": "brick_wall_round"
+ },
+ {
+ "if": "value=gps_arrow",
+ "then": "gps_arrow",
+ "icon": "gps_arrow"
+ },
+ {
+ "if": "value=checkmark",
+ "then": "checkmark",
+ "icon": "checkmark"
+ },
+ {
+ "if": "value=help",
+ "then": "help",
+ "icon": "help"
+ },
+ {
+ "if": "value=close",
+ "then": "close",
+ "icon": "close"
+ },
+ {
+ "if": "value=invalid",
+ "then": "invalid",
+ "icon": "invalid"
+ },
+ {
+ "if": "value=heart",
+ "then": "heart",
+ "icon": "heart"
+ },
+ {
+ "if": "value=heart_outline",
+ "then": "heart_outline",
+ "icon": "heart_outline"
+ },
+ {
+ "if": "value=confirm",
+ "then": "confirm",
+ "icon": "confirm"
+ },
+ {
+ "if": "value=direction",
+ "then": "direction",
+ "icon": "direction"
+ },
+ {
+ "if": "value=not_found",
+ "then": "not_found",
+ "icon": "not_found"
+ },
+ {
+ "if": "value=mastodon",
+ "then": "mastodon",
+ "icon": "mastodon"
+ },
+ {
+ "if": "value=party",
+ "then": "party",
+ "icon": "party"
+ },
+ {
+ "if": "value=addSmall",
+ "then": "addSmall",
+ "icon": "addSmall"
}
]
},
@@ -12523,7 +12609,7 @@
},
{
"if": "value=unit",
- "then": "unit - Library layer with all common units"
+ "then": "unit - Library layer with all common units. Units can _only_ be imported from this file."
},
{
"if": "value=usersettings",
@@ -12696,6 +12782,17 @@
}
]
},
+ "editButtonAriaLabel": {
+ "description": "When using a screenreader and selecting the 'edit' button, the current rendered value is read aloud in normal circumstances.\nIn some rare cases, this is not desirable. For example, if the rendered value is a link to a website, this link can be selected (and will be read aloud).\nIf the user presses _tab_ again, they'll select the button and have the link read aloud a second time.",
+ "anyOf": [
+ {
+ "$ref": "#/definitions/Record"
+ },
+ {
+ "type": "string"
+ }
+ ]
+ },
"labels": {
"description": "A list of labels. These are strings that are used for various purposes, e.g. to only include a subset of the tagRenderings when reusing a layer",
"type": "array",
@@ -13102,6 +13199,100 @@
],
"description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
},
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "mappings",
+ "alsoShowIf"
+ ],
+ "required": false,
+ "hints": {},
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "$ref": "#/definitions/{or:TagConfigJson[];}"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Also show this 'then'-option if the feature matches these tags.\nIdeal for outdated tags."
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "mappings",
+ "alsoShowIf",
+ "and"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "mappings",
+ "alsoShowIf",
+ "or"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
{
"path": [
"layers",
@@ -13468,6 +13659,10 @@
{
"if": "value=id",
"then": "id Checks for valid identifiers for layers, will automatically replace spaces and uppercase"
+ },
+ {
+ "if": "value=slope",
+ "then": "slope Validates that the slope is a valid number.The accompanying input element uses the gyroscope and the compass to determine the correct incline. The sign of the incline will be set automatically. The bearing of the way is compared to the bearing of the compass, as such, the device knows if it is measuring in the forward or backward direction."
}
]
},
@@ -13698,6 +13893,24 @@
],
"description": "This hint is shown in subtle text under the question.\nThis can give some extra information on what the answer should ook like"
},
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "editButtonAriaLabel"
+ ],
+ "required": false,
+ "hints": {},
+ "type": [
+ {
+ "$ref": "#/definitions/Record"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "When using a screenreader and selecting the 'edit' button, the current rendered value is read aloud in normal circumstances.\nIn some rare cases, this is not desirable. For example, if the rendered value is a link to a website, this link can be selected (and will be read aloud).\nIf the user presses _tab_ again, they'll select the button and have the link read aloud a second time."
+ },
{
"path": [
"layers",
@@ -14284,6 +14497,103 @@
],
"description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
},
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "override",
+ "mappings",
+ "alsoShowIf"
+ ],
+ "required": false,
+ "hints": {},
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "$ref": "#/definitions/{or:TagConfigJson[];}"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Also show this 'then'-option if the feature matches these tags.\nIdeal for outdated tags."
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "override",
+ "mappings",
+ "alsoShowIf",
+ "and"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "override",
+ "mappings",
+ "alsoShowIf",
+ "or"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
{
"path": [
"layers",
@@ -14663,6 +14973,10 @@
{
"if": "value=id",
"then": "id Checks for valid identifiers for layers, will automatically replace spaces and uppercase"
+ },
+ {
+ "if": "value=slope",
+ "then": "slope Validates that the slope is a valid number.The accompanying input element uses the gyroscope and the compass to determine the correct incline. The sign of the incline will be set automatically. The bearing of the way is compared to the bearing of the compass, as such, the device knows if it is measuring in the forward or backward direction."
}
]
},
@@ -14903,6 +15217,25 @@
],
"description": "This hint is shown in subtle text under the question.\nThis can give some extra information on what the answer should ook like"
},
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "override",
+ "editButtonAriaLabel"
+ ],
+ "required": false,
+ "hints": {},
+ "type": [
+ {
+ "$ref": "#/definitions/Record"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "When using a screenreader and selecting the 'edit' button, the current rendered value is read aloud in normal circumstances.\nIn some rare cases, this is not desirable. For example, if the rendered value is a link to a website, this link can be selected (and will be read aloud).\nIf the user presses _tab_ again, they'll select the button and have the link read aloud a second time."
+ },
{
"path": [
"layers",
@@ -15512,6 +15845,103 @@
],
"description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
},
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "mappings",
+ "alsoShowIf"
+ ],
+ "required": false,
+ "hints": {},
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "$ref": "#/definitions/{or:TagConfigJson[];}"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Also show this 'then'-option if the feature matches these tags.\nIdeal for outdated tags."
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "mappings",
+ "alsoShowIf",
+ "and"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "mappings",
+ "alsoShowIf",
+ "or"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
{
"path": [
"layers",
@@ -15891,6 +16321,10 @@
{
"if": "value=id",
"then": "id Checks for valid identifiers for layers, will automatically replace spaces and uppercase"
+ },
+ {
+ "if": "value=slope",
+ "then": "slope Validates that the slope is a valid number.The accompanying input element uses the gyroscope and the compass to determine the correct incline. The sign of the incline will be set automatically. The bearing of the way is compared to the bearing of the compass, as such, the device knows if it is measuring in the forward or backward direction."
}
]
},
@@ -16131,6 +16565,25 @@
],
"description": "This hint is shown in subtle text under the question.\nThis can give some extra information on what the answer should ook like"
},
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "editButtonAriaLabel"
+ ],
+ "required": false,
+ "hints": {},
+ "type": [
+ {
+ "$ref": "#/definitions/Record"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "When using a screenreader and selecting the 'edit' button, the current rendered value is read aloud in normal circumstances.\nIn some rare cases, this is not desirable. For example, if the rendered value is a link to a website, this link can be selected (and will be read aloud).\nIf the user presses _tab_ again, they'll select the button and have the link read aloud a second time."
+ },
{
"path": [
"layers",
@@ -16739,6 +17192,106 @@
],
"description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
},
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "mappings",
+ "alsoShowIf"
+ ],
+ "required": false,
+ "hints": {},
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "$ref": "#/definitions/{or:TagConfigJson[];}"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Also show this 'then'-option if the feature matches these tags.\nIdeal for outdated tags."
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "mappings",
+ "alsoShowIf",
+ "and"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "mappings",
+ "alsoShowIf",
+ "or"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
{
"path": [
"layers",
@@ -17131,6 +17684,10 @@
{
"if": "value=id",
"then": "id Checks for valid identifiers for layers, will automatically replace spaces and uppercase"
+ },
+ {
+ "if": "value=slope",
+ "then": "slope Validates that the slope is a valid number.The accompanying input element uses the gyroscope and the compass to determine the correct incline. The sign of the incline will be set automatically. The bearing of the way is compared to the bearing of the compass, as such, the device knows if it is measuring in the forward or backward direction."
}
]
},
@@ -17381,6 +17938,2751 @@
],
"description": "This hint is shown in subtle text under the question.\nThis can give some extra information on what the answer should ook like"
},
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "editButtonAriaLabel"
+ ],
+ "required": false,
+ "hints": {},
+ "type": [
+ {
+ "$ref": "#/definitions/Record"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "When using a screenreader and selecting the 'edit' button, the current rendered value is read aloud in normal circumstances.\nIn some rare cases, this is not desirable. For example, if the rendered value is a link to a website, this link can be selected (and will be read aloud).\nIf the user presses _tab_ again, they'll select the button and have the link read aloud a second time."
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "labels"
+ ],
+ "required": false,
+ "hints": {},
+ "type": "array",
+ "description": "A list of labels. These are strings that are used for various purposes, e.g. to only include a subset of the tagRenderings when reusing a layer"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "render"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "rendered",
+ "question": "What text should be rendered?",
+ "ifunset": "No text is shown if no predefined options match."
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/Record"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "special": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/Record>"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "type": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "type"
+ ]
+ }
+ ]
+ }
+ },
+ "required": [
+ "special"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "This piece of text will be shown in the infobox.\nIn this text, values within braces (such as {braced(key)}) are replaced by the corresponding `value` in the object.\nFor example, if the object contains tags `amenity=school; name=Windy Hill School`, the render string `This school is named {name}` will be shown to the user as `This school is named Windy Hill School`\nThis text will be shown if:\n- there is no mapping which matches (or there are no matches)\n- no question, no mappings and no 'freeform' is set\nNote that this is a HTML-interpreted value, so you can add links as e.g. '<a href='{website}'>{website}</a>' or include images such as `This is of type A <br><img src='typeA-icon.svg' />`"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "icon"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "icon",
+ "question": "what icon should be shown next to the 'render' value?",
+ "ifunset": "No additional icon is shown next to the always shown text"
+ },
+ "type": [
+ {
+ "type": "object",
+ "properties": {
+ "path": {
+ "description": "The path to the icon\nType: icon",
+ "type": "string"
+ },
+ "class": {
+ "description": "A hint to mapcomplete on how to render this icon within the mapping.\nThis is translated to 'mapping-icon-', so defining your own in combination with a custom CSS is possible (but discouraged)",
+ "type": "string"
+ }
+ },
+ "required": [
+ "path"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "An icon shown next to the rendering; typically shown pretty small\nThis is only shown next to the \"render\" value"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "icon",
+ "path"
+ ],
+ "required": true,
+ "hints": {
+ "typehint": "icon"
+ },
+ "type": "string",
+ "description": "The path to the icon"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "icon",
+ "class"
+ ],
+ "required": false,
+ "hints": {},
+ "type": "string",
+ "description": "A hint to mapcomplete on how to render this icon within the mapping.\nThis is translated to 'mapping-icon-', so defining your own in combination with a custom CSS is possible (but discouraged)"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "condition"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag",
+ "question": "When should this item be shown?",
+ "ifunset": "No specific condition set; always show this tagRendering or ask the question if unkown"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "$ref": "#/definitions/{or:TagConfigJson[];}"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Only show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "condition",
+ "and"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "condition",
+ "or"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "metacondition"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag",
+ "question": "When should this item be shown (including special conditions)?"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "$ref": "#/definitions/{or:TagConfigJson[];}"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "If set, this tag will be evaluated agains the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options.\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "metacondition",
+ "and"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "metacondition",
+ "or"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "description"
+ ],
+ "required": false,
+ "hints": {},
+ "type": [
+ {
+ "$ref": "#/definitions/Record"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "A human-readable text explaining what this tagRendering does.\nMostly used for the shared tagrenderings"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "classes"
+ ],
+ "required": false,
+ "hints": {
+ "question": "What css-classes should be applied to showing this attribute?"
+ },
+ "type": "string",
+ "description": "A list of css-classes to apply to the entire tagRendering.\nThese classes are applied in 'answer'-mode, not in question mode\nThis is only for advanced users.\nValues are split on ` ` (space)"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "mappings"
+ ],
+ "required": false,
+ "hints": {
+ "question": "What are common options?"
+ },
+ "type": "array",
+ "description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "mappings",
+ "if"
+ ],
+ "required": true,
+ "hints": {
+ "typehint": "tag",
+ "question": "What tags should be matched to show this option?"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "If in 'question'-mode and the contributor selects this option, these tags will be applied to the object"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "mappings",
+ "then"
+ ],
+ "required": true,
+ "hints": {
+ "typehint": "rendered",
+ "question": "What corresponding text should be shown?"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/Record"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Shown if the `if` is fulfilled"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "mappings",
+ "icon"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "icon",
+ "question": "What icon should be shown next to this mapping?",
+ "ifunset": "Show no icon"
+ },
+ "type": [
+ {
+ "type": "object",
+ "properties": {
+ "path": {
+ "description": "The path to the icon\nType: icon",
+ "type": "string"
+ },
+ "class": {
+ "description": "Size of the image",
+ "type": "string"
+ }
+ },
+ "required": [
+ "path"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "This icon will only be shown if the value is known, it is not displayed in the options (but might be in the future)"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "mappings",
+ "icon",
+ "path"
+ ],
+ "required": true,
+ "hints": {
+ "typehint": "icon"
+ },
+ "type": "string",
+ "description": "The path to the icon"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "mappings",
+ "icon",
+ "class"
+ ],
+ "required": false,
+ "hints": {},
+ "type": "string",
+ "description": "Size of the image"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "mappings",
+ "hideInAnswer"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag",
+ "question": "Under what circumstances should this mapping be hidden from the possibilities a contributor can pick?",
+ "iftrue": "Never show this mapping as option to pick",
+ "ifunset": "Always show this mapping as option to pick"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "$ref": "#/definitions/{or:TagConfigJson[];}"
+ },
+ {
+ "type": [
+ "string",
+ "boolean"
+ ]
+ }
+ ],
+ "description": "In some cases, multiple taggings exist (e.g. a default assumption, or a commonly mapped abbreviation and a fully written variation).\nIn the latter case, a correct text should be shown, but only a single, canonical tagging should be selectable by the user.\nIn this case, one of the mappings can be hiden by setting this flag.\nTo demonstrate an example making a default assumption:\nmappings: [\n {\n if: \"access=\", -- no access tag present, we assume accessible\n then: \"Accessible to the general public\",\n hideInAnswer: true\n },\n {\n if: \"access=yes\",\n then: \"Accessible to the general public\", -- the user selected this, we add that to OSM\n },\n {\n if: \"access=no\",\n then: \"Not accessible to the public\"\n }\n]\nFor example, for an operator, we have `operator=Agentschap Natuur en Bos`, which is often abbreviated to `operator=ANB`.\nThen, we would add two mappings:\n{\n if: \"operator=Agentschap Natuur en Bos\" -- the non-abbreviated version which should be uploaded\n then: \"Maintained by Agentschap Natuur en Bos\"\n},\n{\n if: \"operator=ANB\", -- we don't want to upload abbreviations\n then: \"Maintained by Agentschap Natuur en Bos\"\n hideInAnswer: true\n}\nHide in answer can also be a tagsfilter, e.g. to make sure an option is only shown when appropriate.\nKeep in mind that this is reverse logic: it will be hidden in the answer if the condition is true, it will thus only show in the case of a mismatch\ne.g., for toilets: if \"wheelchair=no\", we know there is no wheelchair dedicated room.\nFor the location of the changing table, the option \"in the wheelchair accessible toilet is weird\", so we write:\n{\n \"question\": \"Where is the changing table located?\"\n \"mappings\": [\n {\"if\":\"changing_table:location=female\",\"then\":\"In the female restroom\"},\n {\"if\":\"changing_table:location=male\",\"then\":\"In the male restroom\"},\n {\"if\":\"changing_table:location=wheelchair\",\"then\":\"In the wheelchair accessible restroom\", \"hideInAnswer\": \"wheelchair=no\"},\n ]\n}\nAlso have a look for the meta-tags\n{\n if: \"operator=Agentschap Natuur en Bos\",\n then: \"Maintained by Agentschap Natuur en Bos\",\n hideInAnswer: \"_country!=be\"\n}"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "mappings",
+ "hideInAnswer",
+ "and"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "mappings",
+ "hideInAnswer",
+ "or"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "mappings",
+ "alsoShowIf"
+ ],
+ "required": false,
+ "hints": {},
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "$ref": "#/definitions/{or:TagConfigJson[];}"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Also show this 'then'-option if the feature matches these tags.\nIdeal for outdated tags."
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "mappings",
+ "alsoShowIf",
+ "and"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "mappings",
+ "alsoShowIf",
+ "or"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "mappings",
+ "ifnot"
+ ],
+ "required": false,
+ "hints": {
+ "question": "What tags should be applied if this mapping is _not_ chosen?",
+ "ifunset": "Do not apply a tag if a different mapping is chosen."
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "$ref": "#/definitions/{or:TagConfigJson[];}"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Only applicable if 'multiAnswer' is set.\nThis is for situations such as:\n`accepts:coins=no` where one can select all the possible payment methods. However, we want to make explicit that some options _were not_ selected.\nThis can be done with `ifnot`\nNote that we can not explicitly render this negative case to the user, we cannot show `does _not_ accept coins`.\nIf this is important to your usecase, consider using multiple radiobutton-fields without `multiAnswer`"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "mappings",
+ "ifnot",
+ "and"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "mappings",
+ "ifnot",
+ "or"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "mappings",
+ "addExtraTags"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "simple_tag",
+ "question": "What extra tags should be added to the object if this object is chosen?"
+ },
+ "type": "array",
+ "description": "If chosen as answer, these tags will be applied onto the object, together with the tags from the `if`\nNot compatible with multiAnswer.\nThis can be used e.g. to erase other keys which indicate the 'not' value:\n```json\n{\n \"if\": \"crossing:marking=rainbow\",\n \"then\": \"This is a rainbow crossing\",\n \"addExtraTags\": [\"not:crossing:marking=\"]\n}\n```"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "mappings",
+ "searchTerms"
+ ],
+ "required": false,
+ "hints": {
+ "group": "hidden",
+ "question": "If there are many options, what search terms match too?"
+ },
+ "type": "object",
+ "description": "If there are many options, the mappings-radiobuttons will be replaced by an element with a searchfunction\nSearchterms (per language) allow to easily find an option if there are many options"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "mappings",
+ "priorityIf"
+ ],
+ "required": false,
+ "hints": {
+ "group": "hidden"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "$ref": "#/definitions/{or:TagConfigJson[];}"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "If the searchable selector is picked, mappings with this item will have priority and show up even if the others are hidden\nUse this sparingly"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "mappings",
+ "priorityIf",
+ "and"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "mappings",
+ "priorityIf",
+ "or"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "mappings",
+ "#"
+ ],
+ "required": false,
+ "hints": {
+ "group": "hidden"
+ },
+ "type": "string",
+ "description": "Used for comments or to disable a validation\nignore-image-in-then: normally, a `then`-clause is not allowed to have an `img`-html-element as icons are preferred. In some cases (most notably title-icons), this is allowed"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "multiAnswer"
+ ],
+ "required": false,
+ "hints": {
+ "question": "Should a contributor be allowed to select multiple mappings?",
+ "iftrue": "allow to select multiple mappings",
+ "iffalse": "only allow to select a single mapping",
+ "ifunset": "only allow to select a single mapping"
+ },
+ "type": "boolean",
+ "description": "If true, use checkboxes instead of radio buttons when asking the question"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "freeform"
+ ],
+ "required": false,
+ "hints": {},
+ "type": "object",
+ "description": "Allow freeform text input from the user"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "freeform",
+ "key"
+ ],
+ "required": false,
+ "hints": {
+ "question": "What is the name of the attribute that should be written to?",
+ "ifunset": "do not offer a freeform textfield as answer option"
+ },
+ "type": "string",
+ "description": "This is the OpenStreetMap-key that that value will be written to"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "freeform",
+ "type"
+ ],
+ "required": false,
+ "hints": {
+ "question": "What is the input type?",
+ "ifunset": "use an unconstrained string as input (default)",
+ "suggestions": [
+ {
+ "if": "value=string",
+ "then": "string A simple piece of text"
+ },
+ {
+ "if": "value=text",
+ "then": "text A longer piece of text. Uses an textArea instead of a textField"
+ },
+ {
+ "if": "value=date",
+ "then": "date A date with date picker"
+ },
+ {
+ "if": "value=nat",
+ "then": "nat A whole, positive number or zero"
+ },
+ {
+ "if": "value=int",
+ "then": "int A whole number, either positive, negative or zero"
+ },
+ {
+ "if": "value=distance",
+ "then": "distance A geographical distance in meters (rounded at two points). Will give an extra minimap with a measurement tool. Arguments: [ zoomlevel, preferredBackgroundMapType (comma separated) ], e.g. `[\"21\", \"map,photo\"]"
+ },
+ {
+ "if": "value=direction",
+ "then": "direction A geographical direction, in degrees. 0° is north, 90° is east, ... Will return a value between 0 (incl) and 360 (excl)."
+ },
+ {
+ "if": "value=wikidata",
+ "then": "wikidata A wikidata identifier, e.g. Q42. "
+ },
+ {
+ "if": "value=pnat",
+ "then": "pnat A strict positive number"
+ },
+ {
+ "if": "value=float",
+ "then": "float A decimal number"
+ },
+ {
+ "if": "value=pfloat",
+ "then": "pfloat A positive decimal number or zero"
+ },
+ {
+ "if": "value=email",
+ "then": "email An email adress"
+ },
+ {
+ "if": "value=url",
+ "then": "url The validatedTextField will format URLs to always be valid and have a https://-header (even though the 'https'-part will be hidden from the user. Furthermore, some tracking parameters will be removed"
+ },
+ {
+ "if": "value=phone",
+ "then": "phone A phone number"
+ },
+ {
+ "if": "value=opening_hours",
+ "then": "opening_hours Has extra elements to easily input when a POI is opened. "
+ },
+ {
+ "if": "value=color",
+ "then": "color Shows a color picker"
+ },
+ {
+ "if": "value=icon",
+ "then": "icon Makes sure that a valid .svg-path is added"
+ },
+ {
+ "if": "value=fediverse",
+ "then": "fediverse Validates fediverse addresses and normalizes them into `@username@server`-format"
+ },
+ {
+ "if": "value=id",
+ "then": "id Checks for valid identifiers for layers, will automatically replace spaces and uppercase"
+ },
+ {
+ "if": "value=slope",
+ "then": "slope Validates that the slope is a valid number.The accompanying input element uses the gyroscope and the compass to determine the correct incline. The sign of the incline will be set automatically. The bearing of the way is compared to the bearing of the compass, as such, the device knows if it is measuring in the forward or backward direction."
+ }
+ ]
+ },
+ "type": "string",
+ "description": "The type of the text-field, e.g. 'string', 'nat', 'float', 'date',...\nSee Docs/SpecialInputElements.md and UI/Input/ValidatedTextField.ts for supported values"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "freeform",
+ "placeholder"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "translation",
+ "group": "expert",
+ "question": "What placeholder text should be shown in the input-element if there is no input?"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/Record"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "A (translated) text that is shown (as gray text) within the textfield"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "freeform",
+ "helperArgs"
+ ],
+ "required": false,
+ "hints": {
+ "group": "expert"
+ },
+ "type": "array",
+ "description": "Extra parameters to initialize the input helper arguments.\nFor semantics, see the 'SpecialInputElements.md'"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "freeform",
+ "addExtraTags"
+ ],
+ "required": false,
+ "hints": {
+ "group": "expert"
+ },
+ "type": "array",
+ "description": "If a value is added with the textfield, these extra tag is addded.\nUseful to add a 'fixme=freeform textfield used - to be checked'"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "freeform",
+ "inline"
+ ],
+ "required": false,
+ "hints": {
+ "group": "expert",
+ "question": "Show the freeform as box within the question?",
+ "iftrue": "show the freeform input field as a small field within the question",
+ "ifunset": "show the freeform input field full-width"
+ },
+ "type": "boolean",
+ "description": "Instead of showing a full-width text field, the text field will be shown within the rendering of the question.\nThis combines badly with special input elements, as it'll distort the layout."
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "freeform",
+ "default"
+ ],
+ "required": false,
+ "hints": {
+ "group": "expert",
+ "question": "What value should be entered in the text field if no value is set?",
+ "ifunset": "do not prefill the textfield"
+ },
+ "type": "string",
+ "description": "This can help people to quickly enter the most common option"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "freeform",
+ "invalidValues"
+ ],
+ "required": false,
+ "hints": {
+ "group": "expert",
+ "question": "What values of the freeform key should be interpreted as 'unknown'?",
+ "ifunset": "The question will be considered answered if any value is set for the key"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "$ref": "#/definitions/{or:TagConfigJson[];}"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "For example, if a feature has `shop=yes`, the question 'what type of shop is this?' should still asked"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "freeform",
+ "invalidValues",
+ "and"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "freeform",
+ "invalidValues",
+ "or"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "question"
+ ],
+ "required": false,
+ "hints": {
+ "question": "What question should be shown to the contributor?",
+ "ifunset": "This tagrendering will be shown if it is known, but cannot be edited by the contributor, effectively resutling in a read-only rendering"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/Record"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "A question is presented ot the user if no mapping matches and the 'freeform' key is not set as well."
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "questionHint"
+ ],
+ "required": false,
+ "hints": {
+ "question": "Should some extra information be shown to the contributor, alongside the question?",
+ "ifunset": "No extra hint is given"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/Record"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "This hint is shown in subtle text under the question.\nThis can give some extra information on what the answer should ook like"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "editButtonAriaLabel"
+ ],
+ "required": false,
+ "hints": {},
+ "type": [
+ {
+ "$ref": "#/definitions/Record"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "When using a screenreader and selecting the 'edit' button, the current rendered value is read aloud in normal circumstances.\nIn some rare cases, this is not desirable. For example, if the rendered value is a link to a website, this link can be selected (and will be read aloud).\nIf the user presses _tab_ again, they'll select the button and have the link read aloud a second time."
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "labels"
+ ],
+ "required": false,
+ "hints": {},
+ "type": "array",
+ "description": "A list of labels. These are strings that are used for various purposes, e.g. to only include a subset of the tagRenderings when reusing a layer"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "render"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "rendered",
+ "question": "What text should be rendered?",
+ "ifunset": "No text is shown if no predefined options match."
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/Record"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "special": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/Record>"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "type": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "type"
+ ]
+ }
+ ]
+ }
+ },
+ "required": [
+ "special"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "This piece of text will be shown in the infobox.\nIn this text, values within braces (such as {braced(key)}) are replaced by the corresponding `value` in the object.\nFor example, if the object contains tags `amenity=school; name=Windy Hill School`, the render string `This school is named {name}` will be shown to the user as `This school is named Windy Hill School`\nThis text will be shown if:\n- there is no mapping which matches (or there are no matches)\n- no question, no mappings and no 'freeform' is set\nNote that this is a HTML-interpreted value, so you can add links as e.g. '<a href='{website}'>{website}</a>' or include images such as `This is of type A <br><img src='typeA-icon.svg' />`"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "icon"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "icon",
+ "question": "what icon should be shown next to the 'render' value?",
+ "ifunset": "No additional icon is shown next to the always shown text"
+ },
+ "type": [
+ {
+ "type": "object",
+ "properties": {
+ "path": {
+ "description": "The path to the icon\nType: icon",
+ "type": "string"
+ },
+ "class": {
+ "description": "A hint to mapcomplete on how to render this icon within the mapping.\nThis is translated to 'mapping-icon-', so defining your own in combination with a custom CSS is possible (but discouraged)",
+ "type": "string"
+ }
+ },
+ "required": [
+ "path"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "An icon shown next to the rendering; typically shown pretty small\nThis is only shown next to the \"render\" value"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "icon",
+ "path"
+ ],
+ "required": true,
+ "hints": {
+ "typehint": "icon"
+ },
+ "type": "string",
+ "description": "The path to the icon"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "icon",
+ "class"
+ ],
+ "required": false,
+ "hints": {},
+ "type": "string",
+ "description": "A hint to mapcomplete on how to render this icon within the mapping.\nThis is translated to 'mapping-icon-', so defining your own in combination with a custom CSS is possible (but discouraged)"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "condition"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag",
+ "question": "When should this item be shown?",
+ "ifunset": "No specific condition set; always show this tagRendering or ask the question if unkown"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "$ref": "#/definitions/{or:TagConfigJson[];}"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Only show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "condition",
+ "and"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "condition",
+ "or"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "metacondition"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag",
+ "question": "When should this item be shown (including special conditions)?"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "$ref": "#/definitions/{or:TagConfigJson[];}"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "If set, this tag will be evaluated agains the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options.\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "metacondition",
+ "and"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "metacondition",
+ "or"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "description"
+ ],
+ "required": false,
+ "hints": {},
+ "type": [
+ {
+ "$ref": "#/definitions/Record"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "A human-readable text explaining what this tagRendering does.\nMostly used for the shared tagrenderings"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "classes"
+ ],
+ "required": false,
+ "hints": {
+ "question": "What css-classes should be applied to showing this attribute?"
+ },
+ "type": "string",
+ "description": "A list of css-classes to apply to the entire tagRendering.\nThese classes are applied in 'answer'-mode, not in question mode\nThis is only for advanced users.\nValues are split on ` ` (space)"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "mappings"
+ ],
+ "required": false,
+ "hints": {
+ "question": "What are common options?"
+ },
+ "type": "array",
+ "description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "mappings",
+ "if"
+ ],
+ "required": true,
+ "hints": {
+ "typehint": "tag",
+ "question": "What tags should be matched to show this option?"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "If in 'question'-mode and the contributor selects this option, these tags will be applied to the object"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "mappings",
+ "then"
+ ],
+ "required": true,
+ "hints": {
+ "typehint": "rendered",
+ "question": "What corresponding text should be shown?"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/Record"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Shown if the `if` is fulfilled"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "mappings",
+ "icon"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "icon",
+ "question": "What icon should be shown next to this mapping?",
+ "ifunset": "Show no icon"
+ },
+ "type": [
+ {
+ "type": "object",
+ "properties": {
+ "path": {
+ "description": "The path to the icon\nType: icon",
+ "type": "string"
+ },
+ "class": {
+ "description": "Size of the image",
+ "type": "string"
+ }
+ },
+ "required": [
+ "path"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "This icon will only be shown if the value is known, it is not displayed in the options (but might be in the future)"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "mappings",
+ "icon",
+ "path"
+ ],
+ "required": true,
+ "hints": {
+ "typehint": "icon"
+ },
+ "type": "string",
+ "description": "The path to the icon"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "mappings",
+ "icon",
+ "class"
+ ],
+ "required": false,
+ "hints": {},
+ "type": "string",
+ "description": "Size of the image"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "mappings",
+ "hideInAnswer"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag",
+ "question": "Under what circumstances should this mapping be hidden from the possibilities a contributor can pick?",
+ "iftrue": "Never show this mapping as option to pick",
+ "ifunset": "Always show this mapping as option to pick"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "$ref": "#/definitions/{or:TagConfigJson[];}"
+ },
+ {
+ "type": [
+ "string",
+ "boolean"
+ ]
+ }
+ ],
+ "description": "In some cases, multiple taggings exist (e.g. a default assumption, or a commonly mapped abbreviation and a fully written variation).\nIn the latter case, a correct text should be shown, but only a single, canonical tagging should be selectable by the user.\nIn this case, one of the mappings can be hiden by setting this flag.\nTo demonstrate an example making a default assumption:\nmappings: [\n {\n if: \"access=\", -- no access tag present, we assume accessible\n then: \"Accessible to the general public\",\n hideInAnswer: true\n },\n {\n if: \"access=yes\",\n then: \"Accessible to the general public\", -- the user selected this, we add that to OSM\n },\n {\n if: \"access=no\",\n then: \"Not accessible to the public\"\n }\n]\nFor example, for an operator, we have `operator=Agentschap Natuur en Bos`, which is often abbreviated to `operator=ANB`.\nThen, we would add two mappings:\n{\n if: \"operator=Agentschap Natuur en Bos\" -- the non-abbreviated version which should be uploaded\n then: \"Maintained by Agentschap Natuur en Bos\"\n},\n{\n if: \"operator=ANB\", -- we don't want to upload abbreviations\n then: \"Maintained by Agentschap Natuur en Bos\"\n hideInAnswer: true\n}\nHide in answer can also be a tagsfilter, e.g. to make sure an option is only shown when appropriate.\nKeep in mind that this is reverse logic: it will be hidden in the answer if the condition is true, it will thus only show in the case of a mismatch\ne.g., for toilets: if \"wheelchair=no\", we know there is no wheelchair dedicated room.\nFor the location of the changing table, the option \"in the wheelchair accessible toilet is weird\", so we write:\n{\n \"question\": \"Where is the changing table located?\"\n \"mappings\": [\n {\"if\":\"changing_table:location=female\",\"then\":\"In the female restroom\"},\n {\"if\":\"changing_table:location=male\",\"then\":\"In the male restroom\"},\n {\"if\":\"changing_table:location=wheelchair\",\"then\":\"In the wheelchair accessible restroom\", \"hideInAnswer\": \"wheelchair=no\"},\n ]\n}\nAlso have a look for the meta-tags\n{\n if: \"operator=Agentschap Natuur en Bos\",\n then: \"Maintained by Agentschap Natuur en Bos\",\n hideInAnswer: \"_country!=be\"\n}"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "mappings",
+ "hideInAnswer",
+ "and"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "mappings",
+ "hideInAnswer",
+ "or"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "mappings",
+ "alsoShowIf"
+ ],
+ "required": false,
+ "hints": {},
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "$ref": "#/definitions/{or:TagConfigJson[];}"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Also show this 'then'-option if the feature matches these tags.\nIdeal for outdated tags."
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "mappings",
+ "alsoShowIf",
+ "and"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "mappings",
+ "alsoShowIf",
+ "or"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "mappings",
+ "ifnot"
+ ],
+ "required": false,
+ "hints": {
+ "question": "What tags should be applied if this mapping is _not_ chosen?",
+ "ifunset": "Do not apply a tag if a different mapping is chosen."
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "$ref": "#/definitions/{or:TagConfigJson[];}"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Only applicable if 'multiAnswer' is set.\nThis is for situations such as:\n`accepts:coins=no` where one can select all the possible payment methods. However, we want to make explicit that some options _were not_ selected.\nThis can be done with `ifnot`\nNote that we can not explicitly render this negative case to the user, we cannot show `does _not_ accept coins`.\nIf this is important to your usecase, consider using multiple radiobutton-fields without `multiAnswer`"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "mappings",
+ "ifnot",
+ "and"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "mappings",
+ "ifnot",
+ "or"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "mappings",
+ "addExtraTags"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "simple_tag",
+ "question": "What extra tags should be added to the object if this object is chosen?"
+ },
+ "type": "array",
+ "description": "If chosen as answer, these tags will be applied onto the object, together with the tags from the `if`\nNot compatible with multiAnswer.\nThis can be used e.g. to erase other keys which indicate the 'not' value:\n```json\n{\n \"if\": \"crossing:marking=rainbow\",\n \"then\": \"This is a rainbow crossing\",\n \"addExtraTags\": [\"not:crossing:marking=\"]\n}\n```"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "mappings",
+ "searchTerms"
+ ],
+ "required": false,
+ "hints": {
+ "group": "hidden",
+ "question": "If there are many options, what search terms match too?"
+ },
+ "type": "object",
+ "description": "If there are many options, the mappings-radiobuttons will be replaced by an element with a searchfunction\nSearchterms (per language) allow to easily find an option if there are many options"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "mappings",
+ "priorityIf"
+ ],
+ "required": false,
+ "hints": {
+ "group": "hidden"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "$ref": "#/definitions/{or:TagConfigJson[];}"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "If the searchable selector is picked, mappings with this item will have priority and show up even if the others are hidden\nUse this sparingly"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "mappings",
+ "priorityIf",
+ "and"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "mappings",
+ "priorityIf",
+ "or"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "mappings",
+ "#"
+ ],
+ "required": false,
+ "hints": {
+ "group": "hidden"
+ },
+ "type": "string",
+ "description": "Used for comments or to disable a validation\nignore-image-in-then: normally, a `then`-clause is not allowed to have an `img`-html-element as icons are preferred. In some cases (most notably title-icons), this is allowed"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "multiAnswer"
+ ],
+ "required": false,
+ "hints": {
+ "question": "Should a contributor be allowed to select multiple mappings?",
+ "iftrue": "allow to select multiple mappings",
+ "iffalse": "only allow to select a single mapping",
+ "ifunset": "only allow to select a single mapping"
+ },
+ "type": "boolean",
+ "description": "If true, use checkboxes instead of radio buttons when asking the question"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "freeform"
+ ],
+ "required": false,
+ "hints": {},
+ "type": "object",
+ "description": "Allow freeform text input from the user"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "freeform",
+ "key"
+ ],
+ "required": false,
+ "hints": {
+ "question": "What is the name of the attribute that should be written to?",
+ "ifunset": "do not offer a freeform textfield as answer option"
+ },
+ "type": "string",
+ "description": "This is the OpenStreetMap-key that that value will be written to"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "freeform",
+ "type"
+ ],
+ "required": false,
+ "hints": {
+ "question": "What is the input type?",
+ "ifunset": "use an unconstrained string as input (default)",
+ "suggestions": [
+ {
+ "if": "value=string",
+ "then": "string A simple piece of text"
+ },
+ {
+ "if": "value=text",
+ "then": "text A longer piece of text. Uses an textArea instead of a textField"
+ },
+ {
+ "if": "value=date",
+ "then": "date A date with date picker"
+ },
+ {
+ "if": "value=nat",
+ "then": "nat A whole, positive number or zero"
+ },
+ {
+ "if": "value=int",
+ "then": "int A whole number, either positive, negative or zero"
+ },
+ {
+ "if": "value=distance",
+ "then": "distance A geographical distance in meters (rounded at two points). Will give an extra minimap with a measurement tool. Arguments: [ zoomlevel, preferredBackgroundMapType (comma separated) ], e.g. `[\"21\", \"map,photo\"]"
+ },
+ {
+ "if": "value=direction",
+ "then": "direction A geographical direction, in degrees. 0° is north, 90° is east, ... Will return a value between 0 (incl) and 360 (excl)."
+ },
+ {
+ "if": "value=wikidata",
+ "then": "wikidata A wikidata identifier, e.g. Q42. "
+ },
+ {
+ "if": "value=pnat",
+ "then": "pnat A strict positive number"
+ },
+ {
+ "if": "value=float",
+ "then": "float A decimal number"
+ },
+ {
+ "if": "value=pfloat",
+ "then": "pfloat A positive decimal number or zero"
+ },
+ {
+ "if": "value=email",
+ "then": "email An email adress"
+ },
+ {
+ "if": "value=url",
+ "then": "url The validatedTextField will format URLs to always be valid and have a https://-header (even though the 'https'-part will be hidden from the user. Furthermore, some tracking parameters will be removed"
+ },
+ {
+ "if": "value=phone",
+ "then": "phone A phone number"
+ },
+ {
+ "if": "value=opening_hours",
+ "then": "opening_hours Has extra elements to easily input when a POI is opened. "
+ },
+ {
+ "if": "value=color",
+ "then": "color Shows a color picker"
+ },
+ {
+ "if": "value=icon",
+ "then": "icon Makes sure that a valid .svg-path is added"
+ },
+ {
+ "if": "value=fediverse",
+ "then": "fediverse Validates fediverse addresses and normalizes them into `@username@server`-format"
+ },
+ {
+ "if": "value=id",
+ "then": "id Checks for valid identifiers for layers, will automatically replace spaces and uppercase"
+ },
+ {
+ "if": "value=slope",
+ "then": "slope Validates that the slope is a valid number.The accompanying input element uses the gyroscope and the compass to determine the correct incline. The sign of the incline will be set automatically. The bearing of the way is compared to the bearing of the compass, as such, the device knows if it is measuring in the forward or backward direction."
+ }
+ ]
+ },
+ "type": "string",
+ "description": "The type of the text-field, e.g. 'string', 'nat', 'float', 'date',...\nSee Docs/SpecialInputElements.md and UI/Input/ValidatedTextField.ts for supported values"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "freeform",
+ "placeholder"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "translation",
+ "group": "expert",
+ "question": "What placeholder text should be shown in the input-element if there is no input?"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/Record"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "A (translated) text that is shown (as gray text) within the textfield"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "freeform",
+ "helperArgs"
+ ],
+ "required": false,
+ "hints": {
+ "group": "expert"
+ },
+ "type": "array",
+ "description": "Extra parameters to initialize the input helper arguments.\nFor semantics, see the 'SpecialInputElements.md'"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "freeform",
+ "addExtraTags"
+ ],
+ "required": false,
+ "hints": {
+ "group": "expert"
+ },
+ "type": "array",
+ "description": "If a value is added with the textfield, these extra tag is addded.\nUseful to add a 'fixme=freeform textfield used - to be checked'"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "freeform",
+ "inline"
+ ],
+ "required": false,
+ "hints": {
+ "group": "expert",
+ "question": "Show the freeform as box within the question?",
+ "iftrue": "show the freeform input field as a small field within the question",
+ "ifunset": "show the freeform input field full-width"
+ },
+ "type": "boolean",
+ "description": "Instead of showing a full-width text field, the text field will be shown within the rendering of the question.\nThis combines badly with special input elements, as it'll distort the layout."
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "freeform",
+ "default"
+ ],
+ "required": false,
+ "hints": {
+ "group": "expert",
+ "question": "What value should be entered in the text field if no value is set?",
+ "ifunset": "do not prefill the textfield"
+ },
+ "type": "string",
+ "description": "This can help people to quickly enter the most common option"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "freeform",
+ "invalidValues"
+ ],
+ "required": false,
+ "hints": {
+ "group": "expert",
+ "question": "What values of the freeform key should be interpreted as 'unknown'?",
+ "ifunset": "The question will be considered answered if any value is set for the key"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "$ref": "#/definitions/{or:TagConfigJson[];}"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "For example, if a feature has `shop=yes`, the question 'what type of shop is this?' should still asked"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "freeform",
+ "invalidValues",
+ "and"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "freeform",
+ "invalidValues",
+ "or"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "question"
+ ],
+ "required": false,
+ "hints": {
+ "question": "What question should be shown to the contributor?",
+ "ifunset": "This tagrendering will be shown if it is known, but cannot be edited by the contributor, effectively resutling in a read-only rendering"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/Record"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "A question is presented ot the user if no mapping matches and the 'freeform' key is not set as well."
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "questionHint"
+ ],
+ "required": false,
+ "hints": {
+ "question": "Should some extra information be shown to the contributor, alongside the question?",
+ "ifunset": "No extra hint is given"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/Record"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "This hint is shown in subtle text under the question.\nThis can give some extra information on what the answer should ook like"
+ },
+ {
+ "path": [
+ "layers",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "editButtonAriaLabel"
+ ],
+ "required": false,
+ "hints": {},
+ "type": [
+ {
+ "$ref": "#/definitions/Record"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "When using a screenreader and selecting the 'edit' button, the current rendered value is read aloud in normal circumstances.\nIn some rare cases, this is not desirable. For example, if the rendered value is a link to a website, this link can be selected (and will be read aloud).\nIf the user presses _tab_ again, they'll select the button and have the link read aloud a second time."
+ },
{
"path": [
"layers",
@@ -18820,7 +22122,7 @@
"question": "What extra attributes should be calculated with javascript?"
},
"type": "array",
- "description": "A list of extra tags to calculate, specified as \"keyToAssignTo=javascript-expression\".\nThere are a few extra functions available. Refer to Docs/CalculatedTags.md for more information\nThe functions will be run in order, e.g.\n[\nNot found... * \"_max_overlap_m2=Math.max(...feat.overlapsWith(\"someOtherLayer\").map(o => o.overlap))\n \"_max_overlap_ratio=Number(feat._max_overlap_m2)/feat.area\n]\nThe specified tags are evaluated lazily. E.g. if a calculated tag is only used in the popup (e.g. the number of nearby features),\nthe expensive calculation will only be performed then for that feature. This avoids clogging up the contributors PC when all features are loaded.\nIf a tag has to be evaluated strictly, use ':=' instead:\n[\n\"_some_key:=some_javascript_expression\"\n]\nSee the full documentation on [https://github.com/pietervdvn/MapComplete/blob/master/Docs/CalculatedTags.md]"
+ "description": "A list of extra tags to calculate, specified as \"keyToAssignTo=javascript-expression\".\nThere are a few extra functions available. Refer to Docs/CalculatedTags.md for more information\nThe functions will be run in order, e.g.\n[\n \"_max_overlap_m2=Math.max(...feat.overlapsWith(\"someOtherLayer\").map(o => o.overlap))\n \"_max_overlap_ratio=Number(feat._max_overlap_m2)/feat.area\n]\nThe specified tags are evaluated lazily. E.g. if a calculated tag is only used in the popup (e.g. the number of nearby features),\nthe expensive calculation will only be performed then for that feature. This avoids clogging up the contributors PC when all features are loaded.\nIf a tag has to be evaluated strictly, use ':=' instead:\n[\n\"_some_key:=some_javascript_expression\"\n]\nSee the full documentation on [https://github.com/pietervdvn/MapComplete/blob/master/Docs/CalculatedTags.md]"
},
{
"path": [
@@ -20447,6 +23749,81 @@
"if": "value=triangle",
"then": "triangle",
"icon": "triangle"
+ },
+ {
+ "if": "value=brick_wall_square",
+ "then": "brick_wall_square",
+ "icon": "brick_wall_square"
+ },
+ {
+ "if": "value=brick_wall_round",
+ "then": "brick_wall_round",
+ "icon": "brick_wall_round"
+ },
+ {
+ "if": "value=gps_arrow",
+ "then": "gps_arrow",
+ "icon": "gps_arrow"
+ },
+ {
+ "if": "value=checkmark",
+ "then": "checkmark",
+ "icon": "checkmark"
+ },
+ {
+ "if": "value=help",
+ "then": "help",
+ "icon": "help"
+ },
+ {
+ "if": "value=close",
+ "then": "close",
+ "icon": "close"
+ },
+ {
+ "if": "value=invalid",
+ "then": "invalid",
+ "icon": "invalid"
+ },
+ {
+ "if": "value=heart",
+ "then": "heart",
+ "icon": "heart"
+ },
+ {
+ "if": "value=heart_outline",
+ "then": "heart_outline",
+ "icon": "heart_outline"
+ },
+ {
+ "if": "value=confirm",
+ "then": "confirm",
+ "icon": "confirm"
+ },
+ {
+ "if": "value=direction",
+ "then": "direction",
+ "icon": "direction"
+ },
+ {
+ "if": "value=not_found",
+ "then": "not_found",
+ "icon": "not_found"
+ },
+ {
+ "if": "value=mastodon",
+ "then": "mastodon",
+ "icon": "mastodon"
+ },
+ {
+ "if": "value=party",
+ "then": "party",
+ "icon": "party"
+ },
+ {
+ "if": "value=addSmall",
+ "then": "addSmall",
+ "icon": "addSmall"
}
]
},
@@ -29606,7 +32983,7 @@
},
{
"if": "value=unit",
- "then": "unit - Library layer with all common units"
+ "then": "unit - Library layer with all common units. Units can _only_ be imported from this file."
},
{
"if": "value=usersettings",
@@ -29781,6 +33158,17 @@
}
]
},
+ "editButtonAriaLabel": {
+ "description": "When using a screenreader and selecting the 'edit' button, the current rendered value is read aloud in normal circumstances.\nIn some rare cases, this is not desirable. For example, if the rendered value is a link to a website, this link can be selected (and will be read aloud).\nIf the user presses _tab_ again, they'll select the button and have the link read aloud a second time.",
+ "anyOf": [
+ {
+ "$ref": "#/definitions/Record"
+ },
+ {
+ "type": "string"
+ }
+ ]
+ },
"labels": {
"description": "A list of labels. These are strings that are used for various purposes, e.g. to only include a subset of the tagRenderings when reusing a layer",
"type": "array",
@@ -30196,6 +33584,103 @@
],
"description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
},
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "mappings",
+ "alsoShowIf"
+ ],
+ "required": false,
+ "hints": {},
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "$ref": "#/definitions/{or:TagConfigJson[];}"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Also show this 'then'-option if the feature matches these tags.\nIdeal for outdated tags."
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "mappings",
+ "alsoShowIf",
+ "and"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "mappings",
+ "alsoShowIf",
+ "or"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
{
"path": [
"layers",
@@ -30575,6 +34060,10 @@
{
"if": "value=id",
"then": "id Checks for valid identifiers for layers, will automatically replace spaces and uppercase"
+ },
+ {
+ "if": "value=slope",
+ "then": "slope Validates that the slope is a valid number.The accompanying input element uses the gyroscope and the compass to determine the correct incline. The sign of the incline will be set automatically. The bearing of the way is compared to the bearing of the compass, as such, the device knows if it is measuring in the forward or backward direction."
}
]
},
@@ -30815,6 +34304,25 @@
],
"description": "This hint is shown in subtle text under the question.\nThis can give some extra information on what the answer should ook like"
},
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "editButtonAriaLabel"
+ ],
+ "required": false,
+ "hints": {},
+ "type": [
+ {
+ "$ref": "#/definitions/Record"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "When using a screenreader and selecting the 'edit' button, the current rendered value is read aloud in normal circumstances.\nIn some rare cases, this is not desirable. For example, if the rendered value is a link to a website, this link can be selected (and will be read aloud).\nIf the user presses _tab_ again, they'll select the button and have the link read aloud a second time."
+ },
{
"path": [
"layers",
@@ -31423,6 +34931,106 @@
],
"description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
},
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "override",
+ "mappings",
+ "alsoShowIf"
+ ],
+ "required": false,
+ "hints": {},
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "$ref": "#/definitions/{or:TagConfigJson[];}"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Also show this 'then'-option if the feature matches these tags.\nIdeal for outdated tags."
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "override",
+ "mappings",
+ "alsoShowIf",
+ "and"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "override",
+ "mappings",
+ "alsoShowIf",
+ "or"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
{
"path": [
"layers",
@@ -31815,6 +35423,10 @@
{
"if": "value=id",
"then": "id Checks for valid identifiers for layers, will automatically replace spaces and uppercase"
+ },
+ {
+ "if": "value=slope",
+ "then": "slope Validates that the slope is a valid number.The accompanying input element uses the gyroscope and the compass to determine the correct incline. The sign of the incline will be set automatically. The bearing of the way is compared to the bearing of the compass, as such, the device knows if it is measuring in the forward or backward direction."
}
]
},
@@ -32065,6 +35677,26 @@
],
"description": "This hint is shown in subtle text under the question.\nThis can give some extra information on what the answer should ook like"
},
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "override",
+ "editButtonAriaLabel"
+ ],
+ "required": false,
+ "hints": {},
+ "type": [
+ {
+ "$ref": "#/definitions/Record"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "When using a screenreader and selecting the 'edit' button, the current rendered value is read aloud in normal circumstances.\nIn some rare cases, this is not desirable. For example, if the rendered value is a link to a website, this link can be selected (and will be read aloud).\nIf the user presses _tab_ again, they'll select the button and have the link read aloud a second time."
+ },
{
"path": [
"layers",
@@ -32697,6 +36329,106 @@
],
"description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
},
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "mappings",
+ "alsoShowIf"
+ ],
+ "required": false,
+ "hints": {},
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "$ref": "#/definitions/{or:TagConfigJson[];}"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Also show this 'then'-option if the feature matches these tags.\nIdeal for outdated tags."
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "mappings",
+ "alsoShowIf",
+ "and"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "mappings",
+ "alsoShowIf",
+ "or"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
{
"path": [
"layers",
@@ -33089,6 +36821,10 @@
{
"if": "value=id",
"then": "id Checks for valid identifiers for layers, will automatically replace spaces and uppercase"
+ },
+ {
+ "if": "value=slope",
+ "then": "slope Validates that the slope is a valid number.The accompanying input element uses the gyroscope and the compass to determine the correct incline. The sign of the incline will be set automatically. The bearing of the way is compared to the bearing of the compass, as such, the device knows if it is measuring in the forward or backward direction."
}
]
},
@@ -33339,6 +37075,26 @@
],
"description": "This hint is shown in subtle text under the question.\nThis can give some extra information on what the answer should ook like"
},
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "editButtonAriaLabel"
+ ],
+ "required": false,
+ "hints": {},
+ "type": [
+ {
+ "$ref": "#/definitions/Record"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "When using a screenreader and selecting the 'edit' button, the current rendered value is read aloud in normal circumstances.\nIn some rare cases, this is not desirable. For example, if the rendered value is a link to a website, this link can be selected (and will be read aloud).\nIf the user presses _tab_ again, they'll select the button and have the link read aloud a second time."
+ },
{
"path": [
"layers",
@@ -33969,6 +37725,109 @@
],
"description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
},
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "mappings",
+ "alsoShowIf"
+ ],
+ "required": false,
+ "hints": {},
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "$ref": "#/definitions/{or:TagConfigJson[];}"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Also show this 'then'-option if the feature matches these tags.\nIdeal for outdated tags."
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "mappings",
+ "alsoShowIf",
+ "and"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "mappings",
+ "alsoShowIf",
+ "or"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
{
"path": [
"layers",
@@ -34374,6 +38233,10 @@
{
"if": "value=id",
"then": "id Checks for valid identifiers for layers, will automatically replace spaces and uppercase"
+ },
+ {
+ "if": "value=slope",
+ "then": "slope Validates that the slope is a valid number.The accompanying input element uses the gyroscope and the compass to determine the correct incline. The sign of the incline will be set automatically. The bearing of the way is compared to the bearing of the compass, as such, the device knows if it is measuring in the forward or backward direction."
}
]
},
@@ -34634,6 +38497,2850 @@
],
"description": "This hint is shown in subtle text under the question.\nThis can give some extra information on what the answer should ook like"
},
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "editButtonAriaLabel"
+ ],
+ "required": false,
+ "hints": {},
+ "type": [
+ {
+ "$ref": "#/definitions/Record"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "When using a screenreader and selecting the 'edit' button, the current rendered value is read aloud in normal circumstances.\nIn some rare cases, this is not desirable. For example, if the rendered value is a link to a website, this link can be selected (and will be read aloud).\nIf the user presses _tab_ again, they'll select the button and have the link read aloud a second time."
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "labels"
+ ],
+ "required": false,
+ "hints": {},
+ "type": "array",
+ "description": "A list of labels. These are strings that are used for various purposes, e.g. to only include a subset of the tagRenderings when reusing a layer"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "render"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "rendered",
+ "question": "What text should be rendered?",
+ "ifunset": "No text is shown if no predefined options match."
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/Record"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "special": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/Record>"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "type": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "type"
+ ]
+ }
+ ]
+ }
+ },
+ "required": [
+ "special"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "This piece of text will be shown in the infobox.\nIn this text, values within braces (such as {braced(key)}) are replaced by the corresponding `value` in the object.\nFor example, if the object contains tags `amenity=school; name=Windy Hill School`, the render string `This school is named {name}` will be shown to the user as `This school is named Windy Hill School`\nThis text will be shown if:\n- there is no mapping which matches (or there are no matches)\n- no question, no mappings and no 'freeform' is set\nNote that this is a HTML-interpreted value, so you can add links as e.g. '<a href='{website}'>{website}</a>' or include images such as `This is of type A <br><img src='typeA-icon.svg' />`"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "icon"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "icon",
+ "question": "what icon should be shown next to the 'render' value?",
+ "ifunset": "No additional icon is shown next to the always shown text"
+ },
+ "type": [
+ {
+ "type": "object",
+ "properties": {
+ "path": {
+ "description": "The path to the icon\nType: icon",
+ "type": "string"
+ },
+ "class": {
+ "description": "A hint to mapcomplete on how to render this icon within the mapping.\nThis is translated to 'mapping-icon-', so defining your own in combination with a custom CSS is possible (but discouraged)",
+ "type": "string"
+ }
+ },
+ "required": [
+ "path"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "An icon shown next to the rendering; typically shown pretty small\nThis is only shown next to the \"render\" value"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "icon",
+ "path"
+ ],
+ "required": true,
+ "hints": {
+ "typehint": "icon"
+ },
+ "type": "string",
+ "description": "The path to the icon"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "icon",
+ "class"
+ ],
+ "required": false,
+ "hints": {},
+ "type": "string",
+ "description": "A hint to mapcomplete on how to render this icon within the mapping.\nThis is translated to 'mapping-icon-', so defining your own in combination with a custom CSS is possible (but discouraged)"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "condition"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag",
+ "question": "When should this item be shown?",
+ "ifunset": "No specific condition set; always show this tagRendering or ask the question if unkown"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "$ref": "#/definitions/{or:TagConfigJson[];}"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Only show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "condition",
+ "and"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "condition",
+ "or"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "metacondition"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag",
+ "question": "When should this item be shown (including special conditions)?"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "$ref": "#/definitions/{or:TagConfigJson[];}"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "If set, this tag will be evaluated agains the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options.\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "metacondition",
+ "and"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "metacondition",
+ "or"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "description"
+ ],
+ "required": false,
+ "hints": {},
+ "type": [
+ {
+ "$ref": "#/definitions/Record"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "A human-readable text explaining what this tagRendering does.\nMostly used for the shared tagrenderings"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "classes"
+ ],
+ "required": false,
+ "hints": {
+ "question": "What css-classes should be applied to showing this attribute?"
+ },
+ "type": "string",
+ "description": "A list of css-classes to apply to the entire tagRendering.\nThese classes are applied in 'answer'-mode, not in question mode\nThis is only for advanced users.\nValues are split on ` ` (space)"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "mappings"
+ ],
+ "required": false,
+ "hints": {
+ "question": "What are common options?"
+ },
+ "type": "array",
+ "description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "mappings",
+ "if"
+ ],
+ "required": true,
+ "hints": {
+ "typehint": "tag",
+ "question": "What tags should be matched to show this option?"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "If in 'question'-mode and the contributor selects this option, these tags will be applied to the object"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "mappings",
+ "then"
+ ],
+ "required": true,
+ "hints": {
+ "typehint": "rendered",
+ "question": "What corresponding text should be shown?"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/Record"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Shown if the `if` is fulfilled"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "mappings",
+ "icon"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "icon",
+ "question": "What icon should be shown next to this mapping?",
+ "ifunset": "Show no icon"
+ },
+ "type": [
+ {
+ "type": "object",
+ "properties": {
+ "path": {
+ "description": "The path to the icon\nType: icon",
+ "type": "string"
+ },
+ "class": {
+ "description": "Size of the image",
+ "type": "string"
+ }
+ },
+ "required": [
+ "path"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "This icon will only be shown if the value is known, it is not displayed in the options (but might be in the future)"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "mappings",
+ "icon",
+ "path"
+ ],
+ "required": true,
+ "hints": {
+ "typehint": "icon"
+ },
+ "type": "string",
+ "description": "The path to the icon"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "mappings",
+ "icon",
+ "class"
+ ],
+ "required": false,
+ "hints": {},
+ "type": "string",
+ "description": "Size of the image"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "mappings",
+ "hideInAnswer"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag",
+ "question": "Under what circumstances should this mapping be hidden from the possibilities a contributor can pick?",
+ "iftrue": "Never show this mapping as option to pick",
+ "ifunset": "Always show this mapping as option to pick"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "$ref": "#/definitions/{or:TagConfigJson[];}"
+ },
+ {
+ "type": [
+ "string",
+ "boolean"
+ ]
+ }
+ ],
+ "description": "In some cases, multiple taggings exist (e.g. a default assumption, or a commonly mapped abbreviation and a fully written variation).\nIn the latter case, a correct text should be shown, but only a single, canonical tagging should be selectable by the user.\nIn this case, one of the mappings can be hiden by setting this flag.\nTo demonstrate an example making a default assumption:\nmappings: [\n {\n if: \"access=\", -- no access tag present, we assume accessible\n then: \"Accessible to the general public\",\n hideInAnswer: true\n },\n {\n if: \"access=yes\",\n then: \"Accessible to the general public\", -- the user selected this, we add that to OSM\n },\n {\n if: \"access=no\",\n then: \"Not accessible to the public\"\n }\n]\nFor example, for an operator, we have `operator=Agentschap Natuur en Bos`, which is often abbreviated to `operator=ANB`.\nThen, we would add two mappings:\n{\n if: \"operator=Agentschap Natuur en Bos\" -- the non-abbreviated version which should be uploaded\n then: \"Maintained by Agentschap Natuur en Bos\"\n},\n{\n if: \"operator=ANB\", -- we don't want to upload abbreviations\n then: \"Maintained by Agentschap Natuur en Bos\"\n hideInAnswer: true\n}\nHide in answer can also be a tagsfilter, e.g. to make sure an option is only shown when appropriate.\nKeep in mind that this is reverse logic: it will be hidden in the answer if the condition is true, it will thus only show in the case of a mismatch\ne.g., for toilets: if \"wheelchair=no\", we know there is no wheelchair dedicated room.\nFor the location of the changing table, the option \"in the wheelchair accessible toilet is weird\", so we write:\n{\n \"question\": \"Where is the changing table located?\"\n \"mappings\": [\n {\"if\":\"changing_table:location=female\",\"then\":\"In the female restroom\"},\n {\"if\":\"changing_table:location=male\",\"then\":\"In the male restroom\"},\n {\"if\":\"changing_table:location=wheelchair\",\"then\":\"In the wheelchair accessible restroom\", \"hideInAnswer\": \"wheelchair=no\"},\n ]\n}\nAlso have a look for the meta-tags\n{\n if: \"operator=Agentschap Natuur en Bos\",\n then: \"Maintained by Agentschap Natuur en Bos\",\n hideInAnswer: \"_country!=be\"\n}"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "mappings",
+ "hideInAnswer",
+ "and"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "mappings",
+ "hideInAnswer",
+ "or"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "mappings",
+ "alsoShowIf"
+ ],
+ "required": false,
+ "hints": {},
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "$ref": "#/definitions/{or:TagConfigJson[];}"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Also show this 'then'-option if the feature matches these tags.\nIdeal for outdated tags."
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "mappings",
+ "alsoShowIf",
+ "and"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "mappings",
+ "alsoShowIf",
+ "or"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "mappings",
+ "ifnot"
+ ],
+ "required": false,
+ "hints": {
+ "question": "What tags should be applied if this mapping is _not_ chosen?",
+ "ifunset": "Do not apply a tag if a different mapping is chosen."
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "$ref": "#/definitions/{or:TagConfigJson[];}"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Only applicable if 'multiAnswer' is set.\nThis is for situations such as:\n`accepts:coins=no` where one can select all the possible payment methods. However, we want to make explicit that some options _were not_ selected.\nThis can be done with `ifnot`\nNote that we can not explicitly render this negative case to the user, we cannot show `does _not_ accept coins`.\nIf this is important to your usecase, consider using multiple radiobutton-fields without `multiAnswer`"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "mappings",
+ "ifnot",
+ "and"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "mappings",
+ "ifnot",
+ "or"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "mappings",
+ "addExtraTags"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "simple_tag",
+ "question": "What extra tags should be added to the object if this object is chosen?"
+ },
+ "type": "array",
+ "description": "If chosen as answer, these tags will be applied onto the object, together with the tags from the `if`\nNot compatible with multiAnswer.\nThis can be used e.g. to erase other keys which indicate the 'not' value:\n```json\n{\n \"if\": \"crossing:marking=rainbow\",\n \"then\": \"This is a rainbow crossing\",\n \"addExtraTags\": [\"not:crossing:marking=\"]\n}\n```"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "mappings",
+ "searchTerms"
+ ],
+ "required": false,
+ "hints": {
+ "group": "hidden",
+ "question": "If there are many options, what search terms match too?"
+ },
+ "type": "object",
+ "description": "If there are many options, the mappings-radiobuttons will be replaced by an element with a searchfunction\nSearchterms (per language) allow to easily find an option if there are many options"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "mappings",
+ "priorityIf"
+ ],
+ "required": false,
+ "hints": {
+ "group": "hidden"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "$ref": "#/definitions/{or:TagConfigJson[];}"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "If the searchable selector is picked, mappings with this item will have priority and show up even if the others are hidden\nUse this sparingly"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "mappings",
+ "priorityIf",
+ "and"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "mappings",
+ "priorityIf",
+ "or"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "mappings",
+ "#"
+ ],
+ "required": false,
+ "hints": {
+ "group": "hidden"
+ },
+ "type": "string",
+ "description": "Used for comments or to disable a validation\nignore-image-in-then: normally, a `then`-clause is not allowed to have an `img`-html-element as icons are preferred. In some cases (most notably title-icons), this is allowed"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "multiAnswer"
+ ],
+ "required": false,
+ "hints": {
+ "question": "Should a contributor be allowed to select multiple mappings?",
+ "iftrue": "allow to select multiple mappings",
+ "iffalse": "only allow to select a single mapping",
+ "ifunset": "only allow to select a single mapping"
+ },
+ "type": "boolean",
+ "description": "If true, use checkboxes instead of radio buttons when asking the question"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "freeform"
+ ],
+ "required": false,
+ "hints": {},
+ "type": "object",
+ "description": "Allow freeform text input from the user"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "freeform",
+ "key"
+ ],
+ "required": false,
+ "hints": {
+ "question": "What is the name of the attribute that should be written to?",
+ "ifunset": "do not offer a freeform textfield as answer option"
+ },
+ "type": "string",
+ "description": "This is the OpenStreetMap-key that that value will be written to"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "freeform",
+ "type"
+ ],
+ "required": false,
+ "hints": {
+ "question": "What is the input type?",
+ "ifunset": "use an unconstrained string as input (default)",
+ "suggestions": [
+ {
+ "if": "value=string",
+ "then": "string A simple piece of text"
+ },
+ {
+ "if": "value=text",
+ "then": "text A longer piece of text. Uses an textArea instead of a textField"
+ },
+ {
+ "if": "value=date",
+ "then": "date A date with date picker"
+ },
+ {
+ "if": "value=nat",
+ "then": "nat A whole, positive number or zero"
+ },
+ {
+ "if": "value=int",
+ "then": "int A whole number, either positive, negative or zero"
+ },
+ {
+ "if": "value=distance",
+ "then": "distance A geographical distance in meters (rounded at two points). Will give an extra minimap with a measurement tool. Arguments: [ zoomlevel, preferredBackgroundMapType (comma separated) ], e.g. `[\"21\", \"map,photo\"]"
+ },
+ {
+ "if": "value=direction",
+ "then": "direction A geographical direction, in degrees. 0° is north, 90° is east, ... Will return a value between 0 (incl) and 360 (excl)."
+ },
+ {
+ "if": "value=wikidata",
+ "then": "wikidata A wikidata identifier, e.g. Q42. "
+ },
+ {
+ "if": "value=pnat",
+ "then": "pnat A strict positive number"
+ },
+ {
+ "if": "value=float",
+ "then": "float A decimal number"
+ },
+ {
+ "if": "value=pfloat",
+ "then": "pfloat A positive decimal number or zero"
+ },
+ {
+ "if": "value=email",
+ "then": "email An email adress"
+ },
+ {
+ "if": "value=url",
+ "then": "url The validatedTextField will format URLs to always be valid and have a https://-header (even though the 'https'-part will be hidden from the user. Furthermore, some tracking parameters will be removed"
+ },
+ {
+ "if": "value=phone",
+ "then": "phone A phone number"
+ },
+ {
+ "if": "value=opening_hours",
+ "then": "opening_hours Has extra elements to easily input when a POI is opened. "
+ },
+ {
+ "if": "value=color",
+ "then": "color Shows a color picker"
+ },
+ {
+ "if": "value=icon",
+ "then": "icon Makes sure that a valid .svg-path is added"
+ },
+ {
+ "if": "value=fediverse",
+ "then": "fediverse Validates fediverse addresses and normalizes them into `@username@server`-format"
+ },
+ {
+ "if": "value=id",
+ "then": "id Checks for valid identifiers for layers, will automatically replace spaces and uppercase"
+ },
+ {
+ "if": "value=slope",
+ "then": "slope Validates that the slope is a valid number.The accompanying input element uses the gyroscope and the compass to determine the correct incline. The sign of the incline will be set automatically. The bearing of the way is compared to the bearing of the compass, as such, the device knows if it is measuring in the forward or backward direction."
+ }
+ ]
+ },
+ "type": "string",
+ "description": "The type of the text-field, e.g. 'string', 'nat', 'float', 'date',...\nSee Docs/SpecialInputElements.md and UI/Input/ValidatedTextField.ts for supported values"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "freeform",
+ "placeholder"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "translation",
+ "group": "expert",
+ "question": "What placeholder text should be shown in the input-element if there is no input?"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/Record"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "A (translated) text that is shown (as gray text) within the textfield"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "freeform",
+ "helperArgs"
+ ],
+ "required": false,
+ "hints": {
+ "group": "expert"
+ },
+ "type": "array",
+ "description": "Extra parameters to initialize the input helper arguments.\nFor semantics, see the 'SpecialInputElements.md'"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "freeform",
+ "addExtraTags"
+ ],
+ "required": false,
+ "hints": {
+ "group": "expert"
+ },
+ "type": "array",
+ "description": "If a value is added with the textfield, these extra tag is addded.\nUseful to add a 'fixme=freeform textfield used - to be checked'"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "freeform",
+ "inline"
+ ],
+ "required": false,
+ "hints": {
+ "group": "expert",
+ "question": "Show the freeform as box within the question?",
+ "iftrue": "show the freeform input field as a small field within the question",
+ "ifunset": "show the freeform input field full-width"
+ },
+ "type": "boolean",
+ "description": "Instead of showing a full-width text field, the text field will be shown within the rendering of the question.\nThis combines badly with special input elements, as it'll distort the layout."
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "freeform",
+ "default"
+ ],
+ "required": false,
+ "hints": {
+ "group": "expert",
+ "question": "What value should be entered in the text field if no value is set?",
+ "ifunset": "do not prefill the textfield"
+ },
+ "type": "string",
+ "description": "This can help people to quickly enter the most common option"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "freeform",
+ "invalidValues"
+ ],
+ "required": false,
+ "hints": {
+ "group": "expert",
+ "question": "What values of the freeform key should be interpreted as 'unknown'?",
+ "ifunset": "The question will be considered answered if any value is set for the key"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "$ref": "#/definitions/{or:TagConfigJson[];}"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "For example, if a feature has `shop=yes`, the question 'what type of shop is this?' should still asked"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "freeform",
+ "invalidValues",
+ "and"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "freeform",
+ "invalidValues",
+ "or"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "question"
+ ],
+ "required": false,
+ "hints": {
+ "question": "What question should be shown to the contributor?",
+ "ifunset": "This tagrendering will be shown if it is known, but cannot be edited by the contributor, effectively resutling in a read-only rendering"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/Record"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "A question is presented ot the user if no mapping matches and the 'freeform' key is not set as well."
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "questionHint"
+ ],
+ "required": false,
+ "hints": {
+ "question": "Should some extra information be shown to the contributor, alongside the question?",
+ "ifunset": "No extra hint is given"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/Record"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "This hint is shown in subtle text under the question.\nThis can give some extra information on what the answer should ook like"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "editButtonAriaLabel"
+ ],
+ "required": false,
+ "hints": {},
+ "type": [
+ {
+ "$ref": "#/definitions/Record"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "When using a screenreader and selecting the 'edit' button, the current rendered value is read aloud in normal circumstances.\nIn some rare cases, this is not desirable. For example, if the rendered value is a link to a website, this link can be selected (and will be read aloud).\nIf the user presses _tab_ again, they'll select the button and have the link read aloud a second time."
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "labels"
+ ],
+ "required": false,
+ "hints": {},
+ "type": "array",
+ "description": "A list of labels. These are strings that are used for various purposes, e.g. to only include a subset of the tagRenderings when reusing a layer"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "render"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "rendered",
+ "question": "What text should be rendered?",
+ "ifunset": "No text is shown if no predefined options match."
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/Record"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "special": {
+ "allOf": [
+ {
+ "$ref": "#/definitions/Record>"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "type": {
+ "type": "string"
+ }
+ },
+ "required": [
+ "type"
+ ]
+ }
+ ]
+ }
+ },
+ "required": [
+ "special"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "This piece of text will be shown in the infobox.\nIn this text, values within braces (such as {braced(key)}) are replaced by the corresponding `value` in the object.\nFor example, if the object contains tags `amenity=school; name=Windy Hill School`, the render string `This school is named {name}` will be shown to the user as `This school is named Windy Hill School`\nThis text will be shown if:\n- there is no mapping which matches (or there are no matches)\n- no question, no mappings and no 'freeform' is set\nNote that this is a HTML-interpreted value, so you can add links as e.g. '<a href='{website}'>{website}</a>' or include images such as `This is of type A <br><img src='typeA-icon.svg' />`"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "icon"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "icon",
+ "question": "what icon should be shown next to the 'render' value?",
+ "ifunset": "No additional icon is shown next to the always shown text"
+ },
+ "type": [
+ {
+ "type": "object",
+ "properties": {
+ "path": {
+ "description": "The path to the icon\nType: icon",
+ "type": "string"
+ },
+ "class": {
+ "description": "A hint to mapcomplete on how to render this icon within the mapping.\nThis is translated to 'mapping-icon-', so defining your own in combination with a custom CSS is possible (but discouraged)",
+ "type": "string"
+ }
+ },
+ "required": [
+ "path"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "An icon shown next to the rendering; typically shown pretty small\nThis is only shown next to the \"render\" value"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "icon",
+ "path"
+ ],
+ "required": true,
+ "hints": {
+ "typehint": "icon"
+ },
+ "type": "string",
+ "description": "The path to the icon"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "icon",
+ "class"
+ ],
+ "required": false,
+ "hints": {},
+ "type": "string",
+ "description": "A hint to mapcomplete on how to render this icon within the mapping.\nThis is translated to 'mapping-icon-', so defining your own in combination with a custom CSS is possible (but discouraged)"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "condition"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag",
+ "question": "When should this item be shown?",
+ "ifunset": "No specific condition set; always show this tagRendering or ask the question if unkown"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "$ref": "#/definitions/{or:TagConfigJson[];}"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Only show this tagrendering (or ask the question) if the selected object also matches the tags specified as `condition`.\nThis is useful to ask a follow-up question.\nFor example, within toilets, asking _where_ the diaper changing table is is only useful _if_ there is one.\nThis can be done by adding `\"condition\": \"changing_table=yes\"`\nA full example would be:\n```json\n {\n \"question\": \"Where is the changing table located?\",\n \"render\": \"The changing table is located at {changing_table:location}\",\n \"condition\": \"changing_table=yes\",\n \"freeform\": {\n \"key\": \"changing_table:location\",\n \"inline\": true\n },\n \"mappings\": [\n {\n \"then\": \"The changing table is in the toilet for women.\",\n \"if\": \"changing_table:location=female_toilet\"\n },\n {\n \"then\": \"The changing table is in the toilet for men.\",\n \"if\": \"changing_table:location=male_toilet\"\n },\n {\n \"if\": \"changing_table:location=wheelchair_toilet\",\n \"then\": \"The changing table is in the toilet for wheelchair users.\",\n },\n {\n \"if\": \"changing_table:location=dedicated_room\",\n \"then\": \"The changing table is in a dedicated room. \",\n }\n ],\n \"id\": \"toilet-changing_table:location\"\n },\n```"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "condition",
+ "and"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "condition",
+ "or"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "metacondition"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag",
+ "question": "When should this item be shown (including special conditions)?"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "$ref": "#/definitions/{or:TagConfigJson[];}"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "If set, this tag will be evaluated agains the _usersettings/application state_ table.\nEnable 'show debug info' in user settings to see available options.\nNote that values with an underscore depicts _application state_ (including metainfo about the user) whereas values without an underscore depict _user settings_"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "metacondition",
+ "and"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "metacondition",
+ "or"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "description"
+ ],
+ "required": false,
+ "hints": {},
+ "type": [
+ {
+ "$ref": "#/definitions/Record"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "A human-readable text explaining what this tagRendering does.\nMostly used for the shared tagrenderings"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "classes"
+ ],
+ "required": false,
+ "hints": {
+ "question": "What css-classes should be applied to showing this attribute?"
+ },
+ "type": "string",
+ "description": "A list of css-classes to apply to the entire tagRendering.\nThese classes are applied in 'answer'-mode, not in question mode\nThis is only for advanced users.\nValues are split on ` ` (space)"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "mappings"
+ ],
+ "required": false,
+ "hints": {
+ "question": "What are common options?"
+ },
+ "type": "array",
+ "description": "Allows fixed-tag inputs, shown either as radiobuttons or as checkboxes"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "mappings",
+ "if"
+ ],
+ "required": true,
+ "hints": {
+ "typehint": "tag",
+ "question": "What tags should be matched to show this option?"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "If in 'question'-mode and the contributor selects this option, these tags will be applied to the object"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "mappings",
+ "then"
+ ],
+ "required": true,
+ "hints": {
+ "typehint": "rendered",
+ "question": "What corresponding text should be shown?"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/Record"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Shown if the `if` is fulfilled"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "mappings",
+ "icon"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "icon",
+ "question": "What icon should be shown next to this mapping?",
+ "ifunset": "Show no icon"
+ },
+ "type": [
+ {
+ "type": "object",
+ "properties": {
+ "path": {
+ "description": "The path to the icon\nType: icon",
+ "type": "string"
+ },
+ "class": {
+ "description": "Size of the image",
+ "type": "string"
+ }
+ },
+ "required": [
+ "path"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "This icon will only be shown if the value is known, it is not displayed in the options (but might be in the future)"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "mappings",
+ "icon",
+ "path"
+ ],
+ "required": true,
+ "hints": {
+ "typehint": "icon"
+ },
+ "type": "string",
+ "description": "The path to the icon"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "mappings",
+ "icon",
+ "class"
+ ],
+ "required": false,
+ "hints": {},
+ "type": "string",
+ "description": "Size of the image"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "mappings",
+ "hideInAnswer"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag",
+ "question": "Under what circumstances should this mapping be hidden from the possibilities a contributor can pick?",
+ "iftrue": "Never show this mapping as option to pick",
+ "ifunset": "Always show this mapping as option to pick"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "$ref": "#/definitions/{or:TagConfigJson[];}"
+ },
+ {
+ "type": [
+ "string",
+ "boolean"
+ ]
+ }
+ ],
+ "description": "In some cases, multiple taggings exist (e.g. a default assumption, or a commonly mapped abbreviation and a fully written variation).\nIn the latter case, a correct text should be shown, but only a single, canonical tagging should be selectable by the user.\nIn this case, one of the mappings can be hiden by setting this flag.\nTo demonstrate an example making a default assumption:\nmappings: [\n {\n if: \"access=\", -- no access tag present, we assume accessible\n then: \"Accessible to the general public\",\n hideInAnswer: true\n },\n {\n if: \"access=yes\",\n then: \"Accessible to the general public\", -- the user selected this, we add that to OSM\n },\n {\n if: \"access=no\",\n then: \"Not accessible to the public\"\n }\n]\nFor example, for an operator, we have `operator=Agentschap Natuur en Bos`, which is often abbreviated to `operator=ANB`.\nThen, we would add two mappings:\n{\n if: \"operator=Agentschap Natuur en Bos\" -- the non-abbreviated version which should be uploaded\n then: \"Maintained by Agentschap Natuur en Bos\"\n},\n{\n if: \"operator=ANB\", -- we don't want to upload abbreviations\n then: \"Maintained by Agentschap Natuur en Bos\"\n hideInAnswer: true\n}\nHide in answer can also be a tagsfilter, e.g. to make sure an option is only shown when appropriate.\nKeep in mind that this is reverse logic: it will be hidden in the answer if the condition is true, it will thus only show in the case of a mismatch\ne.g., for toilets: if \"wheelchair=no\", we know there is no wheelchair dedicated room.\nFor the location of the changing table, the option \"in the wheelchair accessible toilet is weird\", so we write:\n{\n \"question\": \"Where is the changing table located?\"\n \"mappings\": [\n {\"if\":\"changing_table:location=female\",\"then\":\"In the female restroom\"},\n {\"if\":\"changing_table:location=male\",\"then\":\"In the male restroom\"},\n {\"if\":\"changing_table:location=wheelchair\",\"then\":\"In the wheelchair accessible restroom\", \"hideInAnswer\": \"wheelchair=no\"},\n ]\n}\nAlso have a look for the meta-tags\n{\n if: \"operator=Agentschap Natuur en Bos\",\n then: \"Maintained by Agentschap Natuur en Bos\",\n hideInAnswer: \"_country!=be\"\n}"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "mappings",
+ "hideInAnswer",
+ "and"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "mappings",
+ "hideInAnswer",
+ "or"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "mappings",
+ "alsoShowIf"
+ ],
+ "required": false,
+ "hints": {},
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "$ref": "#/definitions/{or:TagConfigJson[];}"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Also show this 'then'-option if the feature matches these tags.\nIdeal for outdated tags."
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "mappings",
+ "alsoShowIf",
+ "and"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "mappings",
+ "alsoShowIf",
+ "or"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "mappings",
+ "ifnot"
+ ],
+ "required": false,
+ "hints": {
+ "question": "What tags should be applied if this mapping is _not_ chosen?",
+ "ifunset": "Do not apply a tag if a different mapping is chosen."
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "$ref": "#/definitions/{or:TagConfigJson[];}"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Only applicable if 'multiAnswer' is set.\nThis is for situations such as:\n`accepts:coins=no` where one can select all the possible payment methods. However, we want to make explicit that some options _were not_ selected.\nThis can be done with `ifnot`\nNote that we can not explicitly render this negative case to the user, we cannot show `does _not_ accept coins`.\nIf this is important to your usecase, consider using multiple radiobutton-fields without `multiAnswer`"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "mappings",
+ "ifnot",
+ "and"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "mappings",
+ "ifnot",
+ "or"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "mappings",
+ "addExtraTags"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "simple_tag",
+ "question": "What extra tags should be added to the object if this object is chosen?"
+ },
+ "type": "array",
+ "description": "If chosen as answer, these tags will be applied onto the object, together with the tags from the `if`\nNot compatible with multiAnswer.\nThis can be used e.g. to erase other keys which indicate the 'not' value:\n```json\n{\n \"if\": \"crossing:marking=rainbow\",\n \"then\": \"This is a rainbow crossing\",\n \"addExtraTags\": [\"not:crossing:marking=\"]\n}\n```"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "mappings",
+ "searchTerms"
+ ],
+ "required": false,
+ "hints": {
+ "group": "hidden",
+ "question": "If there are many options, what search terms match too?"
+ },
+ "type": "object",
+ "description": "If there are many options, the mappings-radiobuttons will be replaced by an element with a searchfunction\nSearchterms (per language) allow to easily find an option if there are many options"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "mappings",
+ "priorityIf"
+ ],
+ "required": false,
+ "hints": {
+ "group": "hidden"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "$ref": "#/definitions/{or:TagConfigJson[];}"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "If the searchable selector is picked, mappings with this item will have priority and show up even if the others are hidden\nUse this sparingly"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "mappings",
+ "priorityIf",
+ "and"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "mappings",
+ "priorityIf",
+ "or"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "mappings",
+ "#"
+ ],
+ "required": false,
+ "hints": {
+ "group": "hidden"
+ },
+ "type": "string",
+ "description": "Used for comments or to disable a validation\nignore-image-in-then: normally, a `then`-clause is not allowed to have an `img`-html-element as icons are preferred. In some cases (most notably title-icons), this is allowed"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "multiAnswer"
+ ],
+ "required": false,
+ "hints": {
+ "question": "Should a contributor be allowed to select multiple mappings?",
+ "iftrue": "allow to select multiple mappings",
+ "iffalse": "only allow to select a single mapping",
+ "ifunset": "only allow to select a single mapping"
+ },
+ "type": "boolean",
+ "description": "If true, use checkboxes instead of radio buttons when asking the question"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "freeform"
+ ],
+ "required": false,
+ "hints": {},
+ "type": "object",
+ "description": "Allow freeform text input from the user"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "freeform",
+ "key"
+ ],
+ "required": false,
+ "hints": {
+ "question": "What is the name of the attribute that should be written to?",
+ "ifunset": "do not offer a freeform textfield as answer option"
+ },
+ "type": "string",
+ "description": "This is the OpenStreetMap-key that that value will be written to"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "freeform",
+ "type"
+ ],
+ "required": false,
+ "hints": {
+ "question": "What is the input type?",
+ "ifunset": "use an unconstrained string as input (default)",
+ "suggestions": [
+ {
+ "if": "value=string",
+ "then": "string A simple piece of text"
+ },
+ {
+ "if": "value=text",
+ "then": "text A longer piece of text. Uses an textArea instead of a textField"
+ },
+ {
+ "if": "value=date",
+ "then": "date A date with date picker"
+ },
+ {
+ "if": "value=nat",
+ "then": "nat A whole, positive number or zero"
+ },
+ {
+ "if": "value=int",
+ "then": "int A whole number, either positive, negative or zero"
+ },
+ {
+ "if": "value=distance",
+ "then": "distance A geographical distance in meters (rounded at two points). Will give an extra minimap with a measurement tool. Arguments: [ zoomlevel, preferredBackgroundMapType (comma separated) ], e.g. `[\"21\", \"map,photo\"]"
+ },
+ {
+ "if": "value=direction",
+ "then": "direction A geographical direction, in degrees. 0° is north, 90° is east, ... Will return a value between 0 (incl) and 360 (excl)."
+ },
+ {
+ "if": "value=wikidata",
+ "then": "wikidata A wikidata identifier, e.g. Q42. "
+ },
+ {
+ "if": "value=pnat",
+ "then": "pnat A strict positive number"
+ },
+ {
+ "if": "value=float",
+ "then": "float A decimal number"
+ },
+ {
+ "if": "value=pfloat",
+ "then": "pfloat A positive decimal number or zero"
+ },
+ {
+ "if": "value=email",
+ "then": "email An email adress"
+ },
+ {
+ "if": "value=url",
+ "then": "url The validatedTextField will format URLs to always be valid and have a https://-header (even though the 'https'-part will be hidden from the user. Furthermore, some tracking parameters will be removed"
+ },
+ {
+ "if": "value=phone",
+ "then": "phone A phone number"
+ },
+ {
+ "if": "value=opening_hours",
+ "then": "opening_hours Has extra elements to easily input when a POI is opened. "
+ },
+ {
+ "if": "value=color",
+ "then": "color Shows a color picker"
+ },
+ {
+ "if": "value=icon",
+ "then": "icon Makes sure that a valid .svg-path is added"
+ },
+ {
+ "if": "value=fediverse",
+ "then": "fediverse Validates fediverse addresses and normalizes them into `@username@server`-format"
+ },
+ {
+ "if": "value=id",
+ "then": "id Checks for valid identifiers for layers, will automatically replace spaces and uppercase"
+ },
+ {
+ "if": "value=slope",
+ "then": "slope Validates that the slope is a valid number.The accompanying input element uses the gyroscope and the compass to determine the correct incline. The sign of the incline will be set automatically. The bearing of the way is compared to the bearing of the compass, as such, the device knows if it is measuring in the forward or backward direction."
+ }
+ ]
+ },
+ "type": "string",
+ "description": "The type of the text-field, e.g. 'string', 'nat', 'float', 'date',...\nSee Docs/SpecialInputElements.md and UI/Input/ValidatedTextField.ts for supported values"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "freeform",
+ "placeholder"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "translation",
+ "group": "expert",
+ "question": "What placeholder text should be shown in the input-element if there is no input?"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/Record"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "A (translated) text that is shown (as gray text) within the textfield"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "freeform",
+ "helperArgs"
+ ],
+ "required": false,
+ "hints": {
+ "group": "expert"
+ },
+ "type": "array",
+ "description": "Extra parameters to initialize the input helper arguments.\nFor semantics, see the 'SpecialInputElements.md'"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "freeform",
+ "addExtraTags"
+ ],
+ "required": false,
+ "hints": {
+ "group": "expert"
+ },
+ "type": "array",
+ "description": "If a value is added with the textfield, these extra tag is addded.\nUseful to add a 'fixme=freeform textfield used - to be checked'"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "freeform",
+ "inline"
+ ],
+ "required": false,
+ "hints": {
+ "group": "expert",
+ "question": "Show the freeform as box within the question?",
+ "iftrue": "show the freeform input field as a small field within the question",
+ "ifunset": "show the freeform input field full-width"
+ },
+ "type": "boolean",
+ "description": "Instead of showing a full-width text field, the text field will be shown within the rendering of the question.\nThis combines badly with special input elements, as it'll distort the layout."
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "freeform",
+ "default"
+ ],
+ "required": false,
+ "hints": {
+ "group": "expert",
+ "question": "What value should be entered in the text field if no value is set?",
+ "ifunset": "do not prefill the textfield"
+ },
+ "type": "string",
+ "description": "This can help people to quickly enter the most common option"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "freeform",
+ "invalidValues"
+ ],
+ "required": false,
+ "hints": {
+ "group": "expert",
+ "question": "What values of the freeform key should be interpreted as 'unknown'?",
+ "ifunset": "The question will be considered answered if any value is set for the key"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "$ref": "#/definitions/{or:TagConfigJson[];}"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "For example, if a feature has `shop=yes`, the question 'what type of shop is this?' should still asked"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "freeform",
+ "invalidValues",
+ "and"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "freeform",
+ "invalidValues",
+ "or"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "question"
+ ],
+ "required": false,
+ "hints": {
+ "question": "What question should be shown to the contributor?",
+ "ifunset": "This tagrendering will be shown if it is known, but cannot be edited by the contributor, effectively resutling in a read-only rendering"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/Record"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "A question is presented ot the user if no mapping matches and the 'freeform' key is not set as well."
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "questionHint"
+ ],
+ "required": false,
+ "hints": {
+ "question": "Should some extra information be shown to the contributor, alongside the question?",
+ "ifunset": "No extra hint is given"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/Record"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "This hint is shown in subtle text under the question.\nThis can give some extra information on what the answer should ook like"
+ },
+ {
+ "path": [
+ "layers",
+ "override",
+ "tagRenderings",
+ "renderings",
+ "override",
+ "editButtonAriaLabel"
+ ],
+ "required": false,
+ "hints": {},
+ "type": [
+ {
+ "$ref": "#/definitions/Record"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "When using a screenreader and selecting the 'edit' button, the current rendered value is read aloud in normal circumstances.\nIn some rare cases, this is not desirable. For example, if the rendered value is a link to a website, this link can be selected (and will be read aloud).\nIf the user presses _tab_ again, they'll select the button and have the link read aloud a second time."
+ },
{
"path": [
"layers",
diff --git a/src/assets/schemas/questionabletagrenderingconfigmeta.json b/src/assets/schemas/questionabletagrenderingconfigmeta.json
index 67a6c4aa3..a1e090956 100644
--- a/src/assets/schemas/questionabletagrenderingconfigmeta.json
+++ b/src/assets/schemas/questionabletagrenderingconfigmeta.json
@@ -225,6 +225,94 @@
],
"description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
},
+ {
+ "path": [
+ "mappings",
+ "alsoShowIf"
+ ],
+ "required": false,
+ "hints": {},
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "$ref": "#/definitions/{or:TagConfigJson[];}"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "Also show this 'then'-option if the feature matches these tags.\nIdeal for outdated tags."
+ },
+ {
+ "path": [
+ "mappings",
+ "alsoShowIf",
+ "and"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
+ {
+ "path": [
+ "mappings",
+ "alsoShowIf",
+ "or"
+ ],
+ "required": false,
+ "hints": {
+ "typehint": "tag"
+ },
+ "type": [
+ {
+ "$ref": "#/definitions/{and:TagConfigJson[];}"
+ },
+ {
+ "type": "object",
+ "properties": {
+ "or": {
+ "type": "array",
+ "items": {
+ "$ref": "#/definitions/TagConfigJson"
+ }
+ }
+ },
+ "required": [
+ "or"
+ ]
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "The main representation of Tags.\nSee https://github.com/pietervdvn/MapComplete/blob/develop/Docs/Tags_format.md for more documentation"
+ },
{
"path": [
"mappings",
@@ -565,6 +653,10 @@
{
"if": "value=id",
"then": "id Checks for valid identifiers for layers, will automatically replace spaces and uppercase"
+ },
+ {
+ "if": "value=slope",
+ "then": "slope Validates that the slope is a valid number.The accompanying input element uses the gyroscope and the compass to determine the correct incline. The sign of the incline will be set automatically. The bearing of the way is compared to the bearing of the compass, as such, the device knows if it is measuring in the forward or backward direction."
}
]
},
@@ -775,6 +867,22 @@
],
"description": "This hint is shown in subtle text under the question.\nThis can give some extra information on what the answer should ook like"
},
+ {
+ "path": [
+ "editButtonAriaLabel"
+ ],
+ "required": false,
+ "hints": {},
+ "type": [
+ {
+ "$ref": "#/definitions/Record"
+ },
+ {
+ "type": "string"
+ }
+ ],
+ "description": "When using a screenreader and selecting the 'edit' button, the current rendered value is read aloud in normal circumstances.\nIn some rare cases, this is not desirable. For example, if the rendered value is a link to a website, this link can be selected (and will be read aloud).\nIf the user presses _tab_ again, they'll select the button and have the link read aloud a second time."
+ },
{
"path": [
"labels"
diff --git a/src/index.css b/src/index.css
index fe4be9045..9b3072a15 100644
--- a/src/index.css
+++ b/src/index.css
@@ -53,6 +53,9 @@
--image-carousel-height: 350px;
+ /** Technical value, used by icon.svelte
+ */
+ --svg-color: #000000;
}
/***********************************************************************\
@@ -612,6 +615,10 @@ a.link-underline {
overflow: visible !important;
}
+svg.apply-fill path {
+ fill: var(--svg-color)
+}
+
.compass_arrow {
width: calc( 2.5rem - 1px ) ;
height: calc( 2.5rem - 1px )