forked from MapComplete/MapComplete
		
	First version of unit handling: canonicalizing on input
This commit is contained in:
		
							parent
							
								
									fca3f45908
								
							
						
					
					
						commit
						0012a2f683
					
				
					 11 changed files with 379 additions and 48 deletions
				
			
		|  | @ -1,14 +1,15 @@ | |||
| import {LayerConfigJson} from "./LayerConfigJson"; | ||||
| import {TagRenderingConfigJson} from "./TagRenderingConfigJson"; | ||||
| import UnitConfigJson from "./UnitConfigJson"; | ||||
| 
 | ||||
| /** | ||||
|  * Defines the entire theme. | ||||
|  *  | ||||
|  * | ||||
|  * A theme is the collection of the layers that are shown; the intro text, the icon, ... | ||||
|  * It more or less defines the entire experience. | ||||
|  *  | ||||
|  * | ||||
|  * Most of the fields defined here are metadata about the theme, such as its name, description, supported languages, default starting location, ... | ||||
|  *  | ||||
|  * | ||||
|  * The main chunk of the json will however be the 'layers'-array, where the details of your layers are. | ||||
|  * | ||||
|  * General remark: a type (string | any) indicates either a fixed or a translatable string. | ||||
|  | @ -16,10 +17,10 @@ import {TagRenderingConfigJson} from "./TagRenderingConfigJson"; | |||
| export interface LayoutConfigJson { | ||||
|     /** | ||||
|      * The id of this layout. | ||||
|      *  | ||||
|      * | ||||
|      * This is used as hashtag in the changeset message, which will read something like "Adding data with #mapcomplete for theme #<the theme id>" | ||||
|      * Make sure it is something decent and descriptive, it should be a simple, lowercase string. | ||||
|      *  | ||||
|      * | ||||
|      * On official themes, it'll become the name of the page, e.g. | ||||
|      * 'cyclestreets' which become 'cyclestreets.html' | ||||
|      */ | ||||
|  | @ -29,7 +30,7 @@ export interface LayoutConfigJson { | |||
|      * Who helped to create this theme and should be attributed? | ||||
|      */ | ||||
|     credits?: string; | ||||
|      | ||||
| 
 | ||||
|     /** | ||||
|      * Who does maintian this preset? | ||||
|      */ | ||||
|  | @ -49,7 +50,7 @@ export interface LayoutConfigJson { | |||
|      * If the theme supports multiple languages, use a list: `["en","nl","fr"]` to allow the user to pick any of them | ||||
|      */ | ||||
|     language: string | string[]; | ||||
|      | ||||
| 
 | ||||
|     /** | ||||
|      * The title, as shown in the welcome message and the more-screen | ||||
|      */ | ||||
|  | @ -60,7 +61,7 @@ export interface LayoutConfigJson { | |||
|      * Note that if this one is not defined, the first sentence of 'description' is used | ||||
|      */ | ||||
|     shortDescription?: string | any; | ||||
|      | ||||
| 
 | ||||
|     /** | ||||
|      * The description, as shown in the welcome message and the more-screen | ||||
|      */ | ||||
|  | @ -116,7 +117,7 @@ export interface LayoutConfigJson { | |||
| 
 | ||||
|     /** | ||||
|      * An override applied on all layers of the theme. | ||||
|      *  | ||||
|      * | ||||
|      * E.g.: if there are two layers defined: | ||||
|      * ``` | ||||
|      * "layers"[ | ||||
|  | @ -124,7 +125,7 @@ export interface LayoutConfigJson { | |||
|      *  {"title", ..., "tagRenderings", [...], "osmSource":{"tags" ...}} | ||||
|      * ] | ||||
|      * ``` | ||||
|      *  | ||||
|      * | ||||
|      * and overrideAll is specified: | ||||
|      * ``` | ||||
|      * "overrideAll": { | ||||
|  | @ -136,11 +137,11 @@ export interface LayoutConfigJson { | |||
|      *  {"title", ..., "tagRenderings", [...], "osmSource":{"tags" ..., "geoJsonSource":"xyz"}} | ||||
|      * ] | ||||
|      * ``` | ||||
|      *  | ||||
|      * | ||||
|      * If the overrideAll contains a list where the keys starts with a plus, the values will be appended (instead of discarding the old list) | ||||
|      */ | ||||
|     overrideAll?: any; | ||||
|      | ||||
| 
 | ||||
|     /** | ||||
|      * The id of the default background. BY default: vanilla OSM | ||||
|      */ | ||||
|  | @ -149,42 +150,107 @@ export interface LayoutConfigJson { | |||
|     /** | ||||
|      * The number of seconds that a feature is allowed to stay in the cache. | ||||
|      * The caching flow is as following: | ||||
|      *  | ||||
|      * | ||||
|      * 1. The application is opened the first time | ||||
|      * 2. An overpass query is run | ||||
|      * 3. The result is saved to local storage | ||||
|      *  | ||||
|      * | ||||
|      * On the next opening: | ||||
|      * | ||||
|      * 1. The application is opened | ||||
|      * 2. Data is loaded from cache and displayed | ||||
|      * 3. An overpass query is run | ||||
|      * 4. All data (both from overpass ánd local storage) are saved again to local storage (except when to old) | ||||
|      *  | ||||
|      * | ||||
|      * Default value: 60 days | ||||
|      */ | ||||
|     cacheTimout?: number; | ||||
|      | ||||
|      | ||||
| 
 | ||||
| 
 | ||||
|     /** | ||||
|      * The layers to display. | ||||
|      *  | ||||
|      * | ||||
|      * Every layer contains a description of which feature to display - the overpassTags which are queried. | ||||
|      * Instead of running one query for every layer, the query is fused. | ||||
|      *  | ||||
|      * | ||||
|      * Afterwards, every layer is given the list of features. | ||||
|      * Every layer takes away the features that match with them*, and give the leftovers to the next layers. | ||||
|      *  | ||||
|      * | ||||
|      * This implies that the _order_ of the layers is important in the case of features with the same tags; | ||||
|      * as the later layers might never receive their feature. | ||||
|      *  | ||||
|      * | ||||
|      * *layers can also remove 'leftover'-features if the leftovers overlap with a feature in the layer itself | ||||
|      *  | ||||
|      * | ||||
|      * Note that builtin layers can be reused. Either put in the name of the layer to reuse, or use {builtin: "layername", override: ...} | ||||
|      * The 'override'-object will be copied over the original values of the layer, which allows to change certain aspects of the layer | ||||
|      *  | ||||
|      * | ||||
|      */ | ||||
|     layers: (LayerConfigJson | string | {builtin: string, override: any})[], | ||||
|     layers: (LayerConfigJson | string | { builtin: string, override: any })[], | ||||
| 
 | ||||
|     /** | ||||
|      * In some cases, a value is represented in a certain unit (such as meters for heigt/distance/..., km/h for speed, ...) | ||||
|      * | ||||
|      * Sometimes, multiple denominations are possible (e.g. km/h vs mile/h; megawatt vs kilowatt vs gigawatt for power generators, ...) | ||||
|      * | ||||
|      * This brings in some troubles, as there are multiple ways to write it (no denomitation, 'm' vs 'meter' 'metre', ...) | ||||
|      * | ||||
|      * Not only do we want to write consistent data to OSM, we also want to present this consistently to the user. | ||||
|      * This is handled by defining units. | ||||
|      * | ||||
|      * # Usage | ||||
|      * | ||||
|      * First of all, you define which keys have units applied, for example: | ||||
|      * | ||||
|      * ``` | ||||
|      * units: [ | ||||
|      *  appliesTo: ["maxspeed", "maxspeed:hgv", "maxspeed:bus"] | ||||
|      *  applicableUnits: [ | ||||
|      *      ... | ||||
|      *  ] | ||||
|      * ] | ||||
|      * ``` | ||||
|      * | ||||
|      * ApplicableUnits defines which is the canonical extension, how it is presented to the user, ...: | ||||
|      * | ||||
|      * ``` | ||||
|      * applicableUnits: [ | ||||
|      * { | ||||
|      *     canonicalDenomination: "km/h", | ||||
|      *     alternativeDenomination: ["km/u", "kmh", "kph"] | ||||
|      *     default: true, | ||||
|      *     human: { | ||||
|      *         en: "kilometer/hour", | ||||
|      *         nl: "kilometer/uur" | ||||
|      *     }, | ||||
|      *     humanShort: { | ||||
|      *         en: "km/h", | ||||
|      *         nl: "km/u" | ||||
|      *     } | ||||
|      * }, | ||||
|      * { | ||||
|      *     canoncialDenomination: "mph", | ||||
|      *     ... similar for miles an hour ... | ||||
|      * } | ||||
|      * ] | ||||
|      * ``` | ||||
|      * | ||||
|      * | ||||
|      * If this is defined, then every key which the denominations apply to (`maxspeed`, `maxspeed:hgv` and `maxspeed:bus`) will be rewritten at the metatagging stage: | ||||
|      * every value will be parsed and the canonical extension will be added add presented to the other parts of the code. | ||||
|      * | ||||
|      * Also, if a freeform text field is used, an extra dropdown with applicable denominations will be given | ||||
|      * | ||||
|      */ | ||||
|      | ||||
|     units?: { | ||||
| 
 | ||||
|         /** | ||||
|          * Every key from this list will be normalized | ||||
|          */ | ||||
|         appliesToKey: string[], | ||||
| 
 | ||||
|         applicableUnits: UnitConfigJson[] | ||||
|     }[] | ||||
| 
 | ||||
|     /** | ||||
|      * If defined, data will be clustered. | ||||
|  | @ -218,7 +284,7 @@ export interface LayoutConfigJson { | |||
|      * Off by default, which will enable panning to the entire world | ||||
|      */ | ||||
|     lockLocation?: boolean | [[number, number], [number, number]]; | ||||
|      | ||||
| 
 | ||||
|     enableUserBadge?: boolean; | ||||
|     enableShareScreen?: boolean; | ||||
|     enableMoreQuests?: boolean; | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue