forked from MapComplete/MapComplete
		
	Add some IDs and validation on IDS
This commit is contained in:
		
							parent
							
								
									4cb09ba8e7
								
							
						
					
					
						commit
						699e609fd7
					
				
					 6 changed files with 20 additions and 285 deletions
				
			
		|  | @ -8,7 +8,7 @@ export interface TagRenderingConfigJson { | ||||||
| 
 | 
 | ||||||
|     /** |     /** | ||||||
|      * The id of the tagrendering, should be an unique string. |      * The id of the tagrendering, should be an unique string. | ||||||
|      * Used to keep the translations in sync |      * Used to keep the translations in sync. Only used in the tagRenderings-array of a layerConfig, not requered otherwise | ||||||
|      */ |      */ | ||||||
|     id?: string, |     id?: string, | ||||||
|      |      | ||||||
|  |  | ||||||
|  | @ -276,6 +276,13 @@ export default class LayerConfig { | ||||||
| 
 | 
 | ||||||
|         this.tagRenderings = trs(json.tagRenderings, false); |         this.tagRenderings = trs(json.tagRenderings, false); | ||||||
|          |          | ||||||
|  |        const missingIds = json.tagRenderings.filter(tr => typeof tr !== "string" && tr["builtin"] === undefined && tr["id"] === undefined); | ||||||
|  | 
 | ||||||
|  |        if(missingIds.length > 0){ | ||||||
|  |            console.error("Some tagRenderings of", this.id, "are missing an id:", missingIds) | ||||||
|  |            throw "Missing ids in tagrenderings" | ||||||
|  |        } | ||||||
|  |         | ||||||
|         this.filters = (json.filter ?? []).map((option, i) => { |         this.filters = (json.filter ?? []).map((option, i) => { | ||||||
|             return new FilterConfig(option, `${context}.filter-[${i}]`) |             return new FilterConfig(option, `${context}.filter-[${i}]`) | ||||||
|         }); |         }); | ||||||
|  |  | ||||||
|  | @ -13,7 +13,7 @@ import {Utils} from "../../Utils"; | ||||||
|  */ |  */ | ||||||
| export default class TagRenderingConfig { | export default class TagRenderingConfig { | ||||||
| 
 | 
 | ||||||
|     readonly id?: string; |     readonly id: string; | ||||||
|     readonly render?: Translation; |     readonly render?: Translation; | ||||||
|     readonly question?: Translation; |     readonly question?: Translation; | ||||||
|     readonly condition?: TagsFilter; |     readonly condition?: TagsFilter; | ||||||
|  | @ -57,6 +57,7 @@ export default class TagRenderingConfig { | ||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|  |          | ||||||
|         this.id = json.id ?? ""; |         this.id = json.id ?? ""; | ||||||
|         this.render = Translations.T(json.render, context + ".render"); |         this.render = Translations.T(json.render, context + ".render"); | ||||||
|         this.question = Translations.T(json.question, context + ".question"); |         this.question = Translations.T(json.question, context + ".question"); | ||||||
|  |  | ||||||
|  | @ -63,6 +63,7 @@ | ||||||
|       }, |       }, | ||||||
|       "tagRenderings": [ |       "tagRenderings": [ | ||||||
|         { |         { | ||||||
|  |           "id": "turbine-output", | ||||||
|           "render": { |           "render": { | ||||||
|             "en": "The power output of this wind turbine is {generator:output:electricity}.", |             "en": "The power output of this wind turbine is {generator:output:electricity}.", | ||||||
|             "fr": "La puissance générée par cette éolienne est de {generator:output:electricity}." |             "fr": "La puissance générée par cette éolienne est de {generator:output:electricity}." | ||||||
|  | @ -77,6 +78,7 @@ | ||||||
|           } |           } | ||||||
|         }, |         }, | ||||||
|         { |         { | ||||||
|  |           "id": "turbine-operator", | ||||||
|           "render": { |           "render": { | ||||||
|             "en": "This wind turbine is operated by {operator}.", |             "en": "This wind turbine is operated by {operator}.", | ||||||
|             "fr": "Cette éolienne est opérée par {operator}." |             "fr": "Cette éolienne est opérée par {operator}." | ||||||
|  | @ -90,6 +92,7 @@ | ||||||
|           } |           } | ||||||
|         }, |         }, | ||||||
|         { |         { | ||||||
|  |           "id": "turbine-height", | ||||||
|           "render": { |           "render": { | ||||||
|             "en": "The total height (including rotor radius) of this wind turbine is {height} metres.", |             "en": "The total height (including rotor radius) of this wind turbine is {height} metres.", | ||||||
|             "fr": "La hauteur totale, incluant les pales, est de {height} mètres." |             "fr": "La hauteur totale, incluant les pales, est de {height} mètres." | ||||||
|  | @ -104,6 +107,7 @@ | ||||||
|           } |           } | ||||||
|         }, |         }, | ||||||
|         { |         { | ||||||
|  |           "id": "turbine-diameter", | ||||||
|           "render": { |           "render": { | ||||||
|             "en": "The rotor diameter of this wind turbine is {rotor:diameter} metres.", |             "en": "The rotor diameter of this wind turbine is {rotor:diameter} metres.", | ||||||
|             "fr": "Le diamètre du rotor est de {rotor:diameter} mètres." |             "fr": "Le diamètre du rotor est de {rotor:diameter} mètres." | ||||||
|  | @ -118,6 +122,7 @@ | ||||||
|           } |           } | ||||||
|         }, |         }, | ||||||
|         { |         { | ||||||
|  |           "id": "turbine-start-date", | ||||||
|           "render": { |           "render": { | ||||||
|             "en": "This wind turbine went into operation on/in {start_date}.", |             "en": "This wind turbine went into operation on/in {start_date}.", | ||||||
|             "fr": "L’éolienne est active depuis {start_date}." |             "fr": "L’éolienne est active depuis {start_date}." | ||||||
|  |  | ||||||
|  | @ -166,11 +166,13 @@ | ||||||
|       }, |       }, | ||||||
|       "tagRenderings": [ |       "tagRenderings": [ | ||||||
|         { |         { | ||||||
|  |           "id": "walk-length", | ||||||
|           "render": { |           "render": { | ||||||
|             "nl": "Deze wandeling is <b>{_length:km}km</b> lang" |             "nl": "Deze wandeling is <b>{_length:km}km</b> lang" | ||||||
|           } |           } | ||||||
|         }, |         }, | ||||||
|         { |         { | ||||||
|  |           "id":"walk-type", | ||||||
|           "mappings": [ |           "mappings": [ | ||||||
|             { |             { | ||||||
|               "if": "route=iwn", |               "if": "route=iwn", | ||||||
|  | @ -199,6 +201,7 @@ | ||||||
|           ] |           ] | ||||||
|         }, |         }, | ||||||
|         { |         { | ||||||
|  |           "id": "walk-description", | ||||||
|           "render": { |           "render": { | ||||||
|             "nl": "<h3>Korte beschrijving:</h3>{description}" |             "nl": "<h3>Korte beschrijving:</h3>{description}" | ||||||
|           }, |           }, | ||||||
|  | @ -209,6 +212,7 @@ | ||||||
|           } |           } | ||||||
|         }, |         }, | ||||||
|         { |         { | ||||||
|  |           "id": "walk-operator", | ||||||
|           "question": { |           "question": { | ||||||
|             "nl": "Wie beheert deze wandeling en plaatst dus de signalisatiebordjes?" |             "nl": "Wie beheert deze wandeling en plaatst dus de signalisatiebordjes?" | ||||||
|           }, |           }, | ||||||
|  | @ -218,6 +222,7 @@ | ||||||
|           } |           } | ||||||
|         }, |         }, | ||||||
|         { |         { | ||||||
|  |           "id": "walk-operator-email", | ||||||
|           "question": { |           "question": { | ||||||
|             "nl": "Naar wie kan men emailen bij problemen rond signalisatie?" |             "nl": "Naar wie kan men emailen bij problemen rond signalisatie?" | ||||||
|           }, |           }, | ||||||
|  |  | ||||||
|  | @ -1,283 +0,0 @@ | ||||||
| { |  | ||||||
|   "id": "speelplekken_temp", |  | ||||||
|   "title": { |  | ||||||
|     "nl": "Speelplekken in de Antwerpse Zuidrand" |  | ||||||
|   }, |  | ||||||
|   "shortDescription": { |  | ||||||
|     "nl": "Speelplekken in de Antwerpse Zuidrand" |  | ||||||
|   }, |  | ||||||
|   "description": { |  | ||||||
|     "nl": "Speelplekken in de Antwerpse Zuidrand. Een project van Provincie Antwerpen, in samenwerking met Createlli, Sportpret en OpenStreetMap België" |  | ||||||
|   }, |  | ||||||
|   "language": [ |  | ||||||
|     "nl" |  | ||||||
|   ], |  | ||||||
|   "maintainer": "MapComplete", |  | ||||||
|   "icon": "./assets/themes/speelplekken/logo.svg", |  | ||||||
|   "hideFromOverview": true, |  | ||||||
|   "lockLocation": true, |  | ||||||
|   "version": "0", |  | ||||||
|   "startLat": 51.17174, |  | ||||||
|   "startLon": 4.449462, |  | ||||||
|   "startZoom": 12, |  | ||||||
|   "widenFactor": 0.05, |  | ||||||
|   "socialImage": "", |  | ||||||
|   "defaultBackgroundId": "CartoDB.Positron", |  | ||||||
|   "layers": [ |  | ||||||
|     { |  | ||||||
|       "builtin": "play_forest", |  | ||||||
|       "override": { |  | ||||||
|         "source": { |  | ||||||
|           "geoJson": "https://pietervdvn.github.io/speelplekken_cache/speelplekken_{z}_{x}_{y}.geojson", |  | ||||||
|           "geoJsonZoomLevel": 14, |  | ||||||
|           "isOsmCache": true |  | ||||||
|         }, |  | ||||||
|         "icon": "./assets/themes/speelplekken/speelbos.svg", |  | ||||||
|         "minzoom": 12 |  | ||||||
|       }, |  | ||||||
|       "calculatedTags": [ |  | ||||||
|         "_is_shadowed=feat.overlapWith('shadow').length > 0 ? 'yes': ''" |  | ||||||
|       ] |  | ||||||
|     }, |  | ||||||
|     { |  | ||||||
|       "builtin": "playground", |  | ||||||
|       "override": { |  | ||||||
|         "icon": "./assets/themes/speelplekken/speeltuin.svg", |  | ||||||
|         "minzoom": 14, |  | ||||||
|         "source": { |  | ||||||
|           "geoJsonLocal": "http://127.0.0.1:8080/speelplekken_{layer}_{z}_{x}_{y}.geojson", |  | ||||||
|           "geoJson": "https://pietervdvn.github.io/speelplekken_cache/speelplekken_{layer}_{z}_{x}_{y}.geojson", |  | ||||||
|           "geoJsonZoomLevel": 14, |  | ||||||
|           "isOsmCache": true |  | ||||||
|         }, |  | ||||||
|         "calculatedTags": [ |  | ||||||
|           "_is_shadowed=feat.overlapWith('shadow').length > 0 ? 'yes': ''" |  | ||||||
|         ] |  | ||||||
|       } |  | ||||||
|     }, |  | ||||||
|     { |  | ||||||
|       "builtin": "village_green", |  | ||||||
|       "override": { |  | ||||||
|         "icon": "./assets/themes/speelplekken/speelweide.svg", |  | ||||||
|         "minzoom": 14, |  | ||||||
|         "source": { |  | ||||||
|           "geoJsonLocal": "http://127.0.0.1:8080/speelplekken_{layer}_{z}_{x}_{y}.geojson", |  | ||||||
|           "geoJson": "https://pietervdvn.github.io/speelplekken_cache/speelplekken_{layer}_{z}_{x}_{y}.geojson", |  | ||||||
|           "geoJsonZoomLevel": 14, |  | ||||||
|           "isOsmCache": true |  | ||||||
|         }, |  | ||||||
|         "calculatedTags": [ |  | ||||||
|           "_is_shadowed=feat.overlapWith('shadow').length > 0 ? 'yes': ''" |  | ||||||
|         ] |  | ||||||
|       } |  | ||||||
|     }, |  | ||||||
|     { |  | ||||||
|       "builtin": "grass_in_parks", |  | ||||||
|       "override": { |  | ||||||
|         "icon": "./assets/themes/speelplekken/speelweide.svg", |  | ||||||
|         "minzoom": 14, |  | ||||||
|         "source": { |  | ||||||
|           "geoJsonLocal": "http://127.0.0.1:8080/speelplekken_{layer}_{z}_{x}_{y}.geojson", |  | ||||||
|           "geoJson": "https://pietervdvn.github.io/speelplekken_cache/speelplekken_{layer}_{z}_{x}_{y}.geojson", |  | ||||||
|           "geoJsonZoomLevel": 14, |  | ||||||
|           "isOsmCache": true |  | ||||||
|         }, |  | ||||||
|         "calculatedTags": [ |  | ||||||
|           "_is_shadowed=feat.overlapWith('shadow').length > 0 ? 'yes': ''" |  | ||||||
|         ] |  | ||||||
|       } |  | ||||||
|     }, |  | ||||||
|     { |  | ||||||
|       "builtin": "sport_pitch", |  | ||||||
|       "override": { |  | ||||||
|         "minzoom": 15, |  | ||||||
|         "source": { |  | ||||||
|           "geoJsonLocal": "http://127.0.0.1:8080/speelplekken_{layer}_{z}_{x}_{y}.geojson", |  | ||||||
|           "geoJson": "https://pietervdvn.github.io/speelplekken_cache/speelplekken_{layer}_{z}_{x}_{y}.geojson", |  | ||||||
|           "geoJsonZoomLevel": 14, |  | ||||||
|           "isOsmCache": true |  | ||||||
|         }, |  | ||||||
|         "calculatedTags": [ |  | ||||||
|           "_is_shadowed=feat.overlapWith('shadow').length > 0 ? 'yes': ''" |  | ||||||
|         ] |  | ||||||
|       } |  | ||||||
|     }, |  | ||||||
|     { |  | ||||||
|       "builtin": "slow_roads", |  | ||||||
|       "override": { |  | ||||||
|         "+tagRenderings": [ |  | ||||||
|           { |  | ||||||
|             "question": "Is dit een publiek toegankelijk pad?", |  | ||||||
|             "mappings": [ |  | ||||||
|               { |  | ||||||
|                 "if": "access=private", |  | ||||||
|                 "then": "Dit is een privaat pad" |  | ||||||
|               }, |  | ||||||
|               { |  | ||||||
|                 "if": "access=no", |  | ||||||
|                 "then": "Dit is een privaat pad", |  | ||||||
|                 "hideInAnswer": true |  | ||||||
|               }, |  | ||||||
|               { |  | ||||||
|                 "if": "access=permissive", |  | ||||||
|                 "then": "Dit pad is duidelijk in private eigendom, maar er hangen geen verbodsborden dus mag men erover" |  | ||||||
|               } |  | ||||||
|             ] |  | ||||||
|           } |  | ||||||
|         ], |  | ||||||
|         "calculatedTags": [ |  | ||||||
|           "_part_of_walking_routes=Array.from(new Set(feat.memberships().map(r => \"<a href='#relation/\"+r.relation.id+\"'>\" + r.relation.tags.name + \"</a>\"))).join(', ')", |  | ||||||
|           "_is_shadowed=feat.overlapWith('shadow').length > 0 ? 'yes': ''" |  | ||||||
|         ], |  | ||||||
|         "minzoom": 18, |  | ||||||
|         "source": { |  | ||||||
|           "geoJsonLocal": "http://127.0.0.1:8080/speelplekken_{layer}_{z}_{x}_{y}.geojson", |  | ||||||
|           "geoJson": "https://pietervdvn.github.io/speelplekken_cache/speelplekken_{layer}_{z}_{x}_{y}.geojson", |  | ||||||
|           "geoJsonZoomLevel": 14, |  | ||||||
|           "isOsmCache": true |  | ||||||
|         } |  | ||||||
|       } |  | ||||||
|     }, |  | ||||||
|     { |  | ||||||
|       "id": "walking_routes", |  | ||||||
|       "name": { |  | ||||||
|         "nl": "Wandelroutes van provincie Antwerpen" |  | ||||||
|       }, |  | ||||||
|       "description": "Walking routes by 'provincie Antwerpen'", |  | ||||||
|       "source": { |  | ||||||
|         "osmTags": { |  | ||||||
|           "and": [ |  | ||||||
|             "type=route", |  | ||||||
|             "route=foot", |  | ||||||
|             "operator~[pP]rovincie Antwerpen" |  | ||||||
|           ] |  | ||||||
|         }, |  | ||||||
|         "geoJson": "https://pietervdvn.github.io/speelplekken_cache/speelplekken_{layer}_{z}_{x}_{y}.geojson", |  | ||||||
|         "geoJsonZoomLevel": 14, |  | ||||||
|         "isOsmCache": true |  | ||||||
|       }, |  | ||||||
|       "title": { |  | ||||||
|         "render": "Wandeling <i>{name}</i>", |  | ||||||
|         "mappings": [ |  | ||||||
|           { |  | ||||||
|             "if": "name~.*wandeling.*", |  | ||||||
|             "then": "{name}" |  | ||||||
|           } |  | ||||||
|         ] |  | ||||||
|       }, |  | ||||||
|       "tagRenderings": [ |  | ||||||
|         { |  | ||||||
|           "render": { |  | ||||||
|             "nl": "Deze wandeling is <b>{_length:km}km</b> lang" |  | ||||||
|           } |  | ||||||
|         }, |  | ||||||
|         { |  | ||||||
|           "mappings": [ |  | ||||||
|             { |  | ||||||
|               "if": "route=iwn", |  | ||||||
|               "then": { |  | ||||||
|                 "nl": "Dit is een internationale wandelroute" |  | ||||||
|               } |  | ||||||
|             }, |  | ||||||
|             { |  | ||||||
|               "if": "route=nwn", |  | ||||||
|               "then": { |  | ||||||
|                 "nl": "Dit is een nationale wandelroute" |  | ||||||
|               } |  | ||||||
|             }, |  | ||||||
|             { |  | ||||||
|               "if": "route=rwn", |  | ||||||
|               "then": { |  | ||||||
|                 "nl": "Dit is een regionale wandelroute" |  | ||||||
|               } |  | ||||||
|             }, |  | ||||||
|             { |  | ||||||
|               "if": "route=lwn", |  | ||||||
|               "then": { |  | ||||||
|                 "nl": "Dit is een lokale wandelroute" |  | ||||||
|               } |  | ||||||
|             } |  | ||||||
|           ] |  | ||||||
|         }, |  | ||||||
|         { |  | ||||||
|           "render": { |  | ||||||
|             "nl": "<h3>Korte beschrijving:</h3>{description}" |  | ||||||
|           }, |  | ||||||
|           "question": "Geef een korte beschrijving van de wandeling (max 255 tekens)", |  | ||||||
|           "freeform": { |  | ||||||
|             "key": "description", |  | ||||||
|             "type": "text" |  | ||||||
|           } |  | ||||||
|         }, |  | ||||||
|         { |  | ||||||
|           "question": { |  | ||||||
|             "nl": "Wie beheert deze wandeling en plaatst dus de signalisatiebordjes?" |  | ||||||
|           }, |  | ||||||
|           "render": "Signalisatie geplaatst door {operator}", |  | ||||||
|           "freeform": { |  | ||||||
|             "key": "operator" |  | ||||||
|           } |  | ||||||
|         }, |  | ||||||
|         { |  | ||||||
|           "question": { |  | ||||||
|             "nl": "Naar wie kan men emailen bij problemen rond signalisatie?" |  | ||||||
|           }, |  | ||||||
|           "render": { |  | ||||||
|             "nl": "Bij problemen met signalisatie kan men emailen naar <a href='mailto:{operator:email}'>{operator:email}</a>" |  | ||||||
|           }, |  | ||||||
|           "freeform": { |  | ||||||
|             "key": "operator:email", |  | ||||||
|             "type": "email" |  | ||||||
|           } |  | ||||||
|         }, |  | ||||||
|         "questions", |  | ||||||
|         "reviews" |  | ||||||
|       ], |  | ||||||
|       "color": { |  | ||||||
|         "render": "#6d6", |  | ||||||
|         "mappings": [ |  | ||||||
|           { |  | ||||||
|             "if": "color~*", |  | ||||||
|             "then": "{color}" |  | ||||||
|           }, |  | ||||||
|           { |  | ||||||
|             "if": "colour~*", |  | ||||||
|             "then": "{colour}" |  | ||||||
|           } |  | ||||||
|         ] |  | ||||||
|       }, |  | ||||||
|       "width": { |  | ||||||
|         "render": "9" |  | ||||||
|       } |  | ||||||
|     } |  | ||||||
|   ], |  | ||||||
|   "clustering": { |  | ||||||
|     "maxZoom": 16, |  | ||||||
|     "minNeededElements": 100 |  | ||||||
|   }, |  | ||||||
|   "roamingRenderings": [ |  | ||||||
|     { |  | ||||||
|       "render": "Maakt deel uit van {_part_of_walking_routes}", |  | ||||||
|       "condition": "_part_of_walking_routes~*" |  | ||||||
|     }, |  | ||||||
|     { |  | ||||||
|       "render": "<a href='{video}' target='blank'>Een kinder-reportage vinden jullie hier<a/>", |  | ||||||
|       "freeform": { |  | ||||||
|         "key": "video", |  | ||||||
|         "type": "url" |  | ||||||
|       }, |  | ||||||
|       "question": "Wat is de link naar de video-reportage?" |  | ||||||
|     } |  | ||||||
|   ], |  | ||||||
|   "overrideAll": { |  | ||||||
|     "isShown": { |  | ||||||
|       "render": "yes", |  | ||||||
|       "mappings": [ |  | ||||||
|         { |  | ||||||
|           "if": "_is_shadowed=yes", |  | ||||||
|           "then": "no" |  | ||||||
|         } |  | ||||||
|       ] |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
| } |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue