From 0ee23ce36d88eabe65bc2a277f9ba200c53b8138 Mon Sep 17 00:00:00 2001 From: pietervdvn Date: Sun, 5 Dec 2021 02:06:14 +0100 Subject: [PATCH] Further improvements to entrances theme, add layer-crossdependency detection, add layers which another layer depends on automatically to the theme, add documentation on which layers depends on which other layers, regenerate documentation --- Customizations/AllKnownLayers.ts | 3 +- Customizations/AllKnownLayouts.ts | 22 +- Docs/BuiltinLayers.md | 56 +- Docs/CalculatedTags.md | 5 +- Docs/SpecialRenderings.md | 68 +- Docs/TagInfo/mapcomplete_entrances.json | 203 + Logic/{ExtraFunction.ts => ExtraFunctions.ts} | 414 +- Logic/MetaTagging.ts | 6 +- Logic/UIEventSource.ts | 5 + Models/ThemeConfig/DependencyCalculator.ts | 111 + Models/ThemeConfig/LayerConfig.ts | 36 +- Models/ThemeConfig/LayoutConfig.ts | 44 +- Models/ThemeConfig/TagRenderingConfig.ts | 69 +- UI/Base/Title.ts | 10 +- UI/BigComponents/ImportButton.ts | 14 + UI/SpecialVisualizations.ts | 6 +- UI/i18n/Translation.ts | 4 + assets/layers/entrance/entrance.json | 66 +- .../walls_and_buildings.json | 11 +- assets/themes/aed/aed.json | 1 - assets/themes/aed/aed_brugge.json | 1 - assets/themes/climbing/climbing.json | 2 +- assets/themes/entrances/entrances.json | 22 + assets/themes/surveillance/surveillance.json | 1 - dependencies.svg | 8177 +++++++++++++++++ scripts/generateDocs.ts | 4 +- scripts/generateLayerOverview.ts | 2 + 27 files changed, 9032 insertions(+), 331 deletions(-) create mode 100644 Docs/TagInfo/mapcomplete_entrances.json rename Logic/{ExtraFunction.ts => ExtraFunctions.ts} (52%) create mode 100644 Models/ThemeConfig/DependencyCalculator.ts create mode 100644 assets/themes/entrances/entrances.json create mode 100644 dependencies.svg diff --git a/Customizations/AllKnownLayers.ts b/Customizations/AllKnownLayers.ts index b85b2dccd..d5f1350d2 100644 --- a/Customizations/AllKnownLayers.ts +++ b/Customizations/AllKnownLayers.ts @@ -13,6 +13,7 @@ export default class AllKnownLayers { return true })() + public static runningGenerateScript = false; // Must be below the list... public static sharedLayers: Map = AllKnownLayers.getSharedLayers(); @@ -44,7 +45,7 @@ export default class AllKnownLayers { const [layerId, id] = renderingId.split(".") const layer = AllKnownLayers.getSharedLayersJson().get(layerId) if (layer === undefined) { - if (Utils.runningFromConsole) { + if (AllKnownLayers.runningGenerateScript) { // Probably generating the layer overview return [{ id: "dummy" diff --git a/Customizations/AllKnownLayouts.ts b/Customizations/AllKnownLayouts.ts index ba59b0b04..22964023c 100644 --- a/Customizations/AllKnownLayouts.ts +++ b/Customizations/AllKnownLayouts.ts @@ -6,6 +6,7 @@ import BaseUIElement from "../UI/BaseUIElement"; import Combine from "../UI/Base/Combine"; import Title from "../UI/Base/Title"; import List from "../UI/Base/List"; +import DependencyCalculator from "../Models/ThemeConfig/DependencyCalculator"; export class AllKnownLayouts { @@ -69,6 +70,21 @@ export class AllKnownLayouts { const unpopularLayers = allLayers.filter(layer => themesPerLayer.get(layer.id)?.length < 2) + // Determine the cross-dependencies + const layerIsNeededBy : Map = new Map() + + for (const layer of allLayers) { + for (const dep of DependencyCalculator.getLayerDependencies(layer)) { + const dependency = dep.neededLayer + if(!layerIsNeededBy.has(dependency)){ + layerIsNeededBy.set(dependency, []) + } + layerIsNeededBy.get(dependency).push(layer.id) + } + + + } + return new Combine([ new Title("Special and other useful layers", 1), "MapComplete has a few data layers available in the theme which have special properties through builtin-hooks. Furthermore, there are some normal layers (which are built from normal Theme-config files) but are so general that they get a mention here.", @@ -76,15 +92,15 @@ export class AllKnownLayouts { new List(AllKnownLayers.priviliged_layers.map(id => "[" + id + "](#" + id + ")")), ...AllKnownLayers.priviliged_layers .map(id => AllKnownLayers.sharedLayers.get(id)) - .map((l) => l.GenerateDocumentation(themesPerLayer.get(l.id), AllKnownLayers.added_by_default.indexOf(l.id) >= 0, AllKnownLayers.no_include.indexOf(l.id) < 0)), + .map((l) => l.GenerateDocumentation(themesPerLayer.get(l.id), layerIsNeededBy, DependencyCalculator.getLayerDependencies(l),AllKnownLayers.added_by_default.indexOf(l.id) >= 0, AllKnownLayers.no_include.indexOf(l.id) < 0)), new Title("Normal layers", 1), "The following layers are included in MapComplete", new Title("Frequently reused layers", 2), "The following layers are used by at least " + popularLayerCutoff + " mapcomplete themes and might be interesting for your custom theme too", new List(popuparLayers.map(layer => "[" + layer.id + "](#" + layer.id + ")")), - ...popuparLayers.map((layer) => layer.GenerateDocumentation(themesPerLayer.get(layer.id))), + ...popuparLayers.map((layer) => layer.GenerateDocumentation(themesPerLayer.get(layer.id),layerIsNeededBy,DependencyCalculator.getLayerDependencies(layer))), new List(unpopularLayers.map(layer => "[" + layer.id + "](#" + layer.id + ")")), - ...unpopularLayers.map(layer => layer.GenerateDocumentation(themesPerLayer.get(layer.id)) + ...unpopularLayers.map(layer => layer.GenerateDocumentation(themesPerLayer.get(layer.id),layerIsNeededBy,DependencyCalculator.getLayerDependencies(layer)) ) ]) diff --git a/Docs/BuiltinLayers.md b/Docs/BuiltinLayers.md index e5c607a42..7dca1f417 100644 --- a/Docs/BuiltinLayers.md +++ b/Docs/BuiltinLayers.md @@ -69,6 +69,8 @@ * [Themes using this layer](#themes-using-this-layer) + [direction](#direction) * [Themes using this layer](#themes-using-this-layer) + + [entrance](#entrance) + * [Themes using this layer](#themes-using-this-layer) + [etymology](#etymology) * [Themes using this layer](#themes-using-this-layer) + [extinguisher](#extinguisher) @@ -318,7 +320,8 @@ A facility where bicycles can be lent for longer period of times - + - This layer will automatically load [drinking_water](#drinking_water) into the layout as it depends on it: A calculated tag loads features from this layer (calculatedTag[0] which calculates the value for _closest_other_drinking_water) + - This layer is needed as dependency for layer [drinking_water](#drinking_water) @@ -394,6 +397,9 @@ Special builtin layer providing all walls and buildings. This layer is useful in - Not visible in the layer selection by default. If you want to make this layer toggable, override `name` - Not rendered on the map by default. If you want to rendering this on the map, override `mapRenderings` + - This layer is needed as dependency for layer [defibrillator](#defibrillator) + - This layer is needed as dependency for layer [entrance](#entrance) + - This layer is needed as dependency for layer [surveillance_camera](#surveillance_camera) @@ -405,6 +411,7 @@ Special builtin layer providing all walls and buildings. This layer is useful in - [aed](https://mapcomplete.osm.be/aed) + - [entrances](https://mapcomplete.osm.be/entrances) - [surveillance](https://mapcomplete.osm.be/surveillance) @@ -451,6 +458,7 @@ Special builtin layer providing all walls and buildings. This layer is useful in - [cycleways_and_roads](#cycleways_and_roads) - [defibrillator](#defibrillator) - [direction](#direction) + - [entrance](#entrance) - [etymology](#etymology) - [extinguisher](#extinguisher) - [fire_station](#fire_station) @@ -545,7 +553,8 @@ Obstacles while cycling, such as bollards and cycle barriers - - This layer will automatically load [cycleways_and_roads](#cycleways_and_roads) into the layout as it depends on it. + - This layer will automatically load [cycleways_and_roads](#cycleways_and_roads) into the layout as it depends on it: a preset snaps to this layer (presets[0]) + - This layer will automatically load [cycleways_and_roads](#cycleways_and_roads) into the layout as it depends on it: a preset snaps to this layer (presets[1]) @@ -863,7 +872,8 @@ Crossings for pedestrians and cyclists - - This layer will automatically load [cycleways_and_roads](#cycleways_and_roads) into the layout as it depends on it. + - This layer will automatically load [cycleways_and_roads](#cycleways_and_roads) into the layout as it depends on it: a preset snaps to this layer (presets[0]) + - This layer will automatically load [cycleways_and_roads](#cycleways_and_roads) into the layout as it depends on it: a preset snaps to this layer (presets[1]) @@ -885,7 +895,10 @@ Crossings for pedestrians and cyclists - + - This layer is needed as dependency for layer [barrier](#barrier) + - This layer is needed as dependency for layer [barrier](#barrier) + - This layer is needed as dependency for layer [crossings](#crossings) + - This layer is needed as dependency for layer [crossings](#crossings) @@ -907,7 +920,8 @@ Crossings for pedestrians and cyclists - - This layer will automatically load [walls_and_buildings](#walls_and_buildings) into the layout as it depends on it. + - This layer will automatically load [walls_and_buildings](#walls_and_buildings) into the layout as it depends on it: a preset snaps to this layer (presets[1]) + - This layer is needed as dependency for layer [Brugge](#Brugge) @@ -945,6 +959,30 @@ This layer visualizes directions - [surveillance](https://mapcomplete.osm.be/surveillance) +### entrance + + + +A layer showing entrances and offering capabilities to survey some advanced data which is important for e.g. wheelchair users (but also bicycle users, people who want to deliver, ...) + +[Go to the source code](../assets/layers/entrance/entrance.json) + + + + - This layer will automatically load [walls_and_buildings](#walls_and_buildings) into the layout as it depends on it: a preset snaps to this layer (presets[0]) + + + + +#### Themes using this layer + + + + + + - [entrances](https://mapcomplete.osm.be/entrances) + + ### etymology @@ -1285,7 +1323,7 @@ A sport pitch - + - This layer is needed as dependency for layer [Assen](#Assen) @@ -1307,7 +1345,7 @@ A sport pitch - - This layer will automatically load [walls_and_buildings](#walls_and_buildings) into the layout as it depends on it. + - This layer will automatically load [walls_and_buildings](#walls_and_buildings) into the layout as it depends on it: a preset snaps to this layer (presets[1]) @@ -1493,7 +1531,7 @@ A climbing gym - + - This layer is needed as dependency for layer [climbing](#climbing) @@ -1517,7 +1555,7 @@ A climbing opportunity - + - This layer will automatically load [climbing_route](#climbing_route) into the layout as it depends on it: A calculated tag loads features from this layer (calculatedTag[0] which calculates the value for _contained_climbing_routes_properties) diff --git a/Docs/CalculatedTags.md b/Docs/CalculatedTags.md index 8e19bdc03..2615357cd 100644 --- a/Docs/CalculatedTags.md +++ b/Docs/CalculatedTags.md @@ -239,10 +239,7 @@ For example to get all objects which overlap or embed from a layer, use `_contai If a 'unique tag key' is given, the tag with this key will only appear once (e.g. if 'name' is given, all features will have a different name) - 0. list of features or layer name or '*' to get all features - 1. amount of features - 2. unique tag key (optional) - 3. maxDistanceInMeters (optional) + ### memberships diff --git a/Docs/SpecialRenderings.md b/Docs/SpecialRenderings.md index 096d0cce1..99933c0e0 100644 --- a/Docs/SpecialRenderings.md +++ b/Docs/SpecialRenderings.md @@ -7,39 +7,39 @@ 1. [Special tag renderings](#special-tag-renderings) + [all_tags](#all_tags) - * [Example usage](#example-usage) + * [Example usage of all_tags](#example-usage-of-all_tags) + [image_carousel](#image_carousel) - * [Example usage](#example-usage) + * [Example usage of image_carousel](#example-usage-of-image_carousel) + [image_upload](#image_upload) - * [Example usage](#example-usage) + * [Example usage of image_upload](#example-usage-of-image_upload) + [wikipedia](#wikipedia) - * [Example usage](#example-usage) + * [Example usage of wikipedia](#example-usage-of-wikipedia) + [minimap](#minimap) - * [Example usage](#example-usage) + * [Example usage of minimap](#example-usage-of-minimap) + [sided_minimap](#sided_minimap) - * [Example usage](#example-usage) + * [Example usage of sided_minimap](#example-usage-of-sided_minimap) + [reviews](#reviews) - * [Example usage](#example-usage) + * [Example usage of reviews](#example-usage-of-reviews) + [opening_hours_table](#opening_hours_table) - * [Example usage](#example-usage) + * [Example usage of opening_hours_table](#example-usage-of-opening_hours_table) + [live](#live) - * [Example usage](#example-usage) + * [Example usage of live](#example-usage-of-live) + [histogram](#histogram) - * [Example usage](#example-usage) + * [Example usage of histogram](#example-usage-of-histogram) + [share_link](#share_link) - * [Example usage](#example-usage) + * [Example usage of share_link](#example-usage-of-share_link) + [canonical](#canonical) - * [Example usage](#example-usage) + * [Example usage of canonical](#example-usage-of-canonical) + [import_button](#import_button) - * [Example usage](#example-usage) + * [Example usage of import_button](#example-usage-of-import_button) + [multi_apply](#multi_apply) - * [Example usage](#example-usage) + * [Example usage of multi_apply](#example-usage-of-multi_apply) + [tag_apply](#tag_apply) - * [Example usage](#example-usage) + * [Example usage of tag_apply](#example-usage-of-tag_apply) + [export_as_gpx](#export_as_gpx) - * [Example usage](#example-usage) + * [Example usage of export_as_gpx](#example-usage-of-export_as_gpx) + [clear_location_history](#clear_location_history) - * [Example usage](#example-usage) + * [Example usage of clear_location_history](#example-usage-of-clear_location_history) In a tagrendering, some special values are substituted by an advanced UI-element. This allows advanced features and visualizations to be reused by custom themes or even to query third-party API's. General usage is `{func_name()}`, `{func_name(arg, someotherarg)}` or `{func_name(args):cssStyle}`. Note that you _do not_ need to use quotes around your arguments, the comma is enough to separate them. This also implies you cannot use a comma in your args @@ -47,7 +47,7 @@ Prints all key-value pairs of the object - used for debugging -#### Example usage +#### Example usage of all_tags `{all_tags()}` @@ -60,7 +60,7 @@ name | default | description image key/prefix (multiple values allowed if comma-seperated) | image,mapillary,image,wikidata,wikimedia_commons,image,image | The keys given to the images, e.g. if image is given, the first picture URL will be added as image, the second as image:0, the third as image:1, etc... -#### Example usage +#### Example usage of image_carousel `{image_carousel(image,mapillary,image,wikidata,wikimedia_commons,image,image)}` @@ -74,7 +74,7 @@ image-key | image | Image tag to add the URL to (or image-tag:0, image-tag:1 whe label | Add image | The text to show on the button -#### Example usage +#### Example usage of image_upload `{image_upload(image,Add image)}` @@ -87,7 +87,7 @@ name | default | description keyToShowWikipediaFor | wikidata | Use the wikidata entry from this key to show the wikipedia article for -#### Example usage +#### Example usage of wikipedia `{wikipedia()}` is a basic example, `{wikipedia(name:etymology:wikidata)}` to show the wikipedia page of whom the feature was named after. Also remember that these can be styled, e.g. `{wikipedia():max-height: 10rem}` to limit the height @@ -101,7 +101,7 @@ zoomlevel | 18 | The (maximum) zoomlevel: the target zoomlevel after fitting the idKey | id | (Matches all resting arguments) This argument should be the key of a property of the feature. The corresponding value is interpreted as either the id or the a list of ID's. The features with these ID's will be shown on this minimap. -#### Example usage +#### Example usage of minimap `{minimap()}`, `{minimap(17, id, _list_of_embedded_feature_ids_calculated_by_calculated_tag):height:10rem; border: 2px solid black}` @@ -114,7 +114,7 @@ name | default | description side | _undefined_ | The side to show, either `left` or `right` -#### Example usage +#### Example usage of sided_minimap `{sided_minimap(left)}` @@ -128,7 +128,7 @@ subjectKey | name | The key to use to determine the subject. If specified, the s fallback | _undefined_ | The identifier to use, if tags[subjectKey] as specified above is not available. This is effectively a fallback value -#### Example usage +#### Example usage of reviews `{reviews()}` for a vanilla review, `{reviews(name, play_forest)}` to review a play forest. If a name is known, the name will be used as identifier, otherwise 'play_forest' is used @@ -143,7 +143,7 @@ prefix | _empty string_ | Remove this string from the start of the value before postfix | _empty string_ | Remove this string from the end of the value before parsing. __Note: use `&RPARENs` to indicate `)` if needed__ -#### Example usage +#### Example usage of opening_hours_table A normal opening hours table can be invoked with `{opening_hours_table()}`. A table for e.g. conditional access with opening hours can be `{opening_hours_table(access:conditional, no @ &LPARENS, &RPARENS)}` @@ -158,7 +158,7 @@ Shorthands | _undefined_ | A list of shorthands, of the format 'shorthandname:pa path | _undefined_ | The path (or shorthand) that should be returned -#### Example usage +#### Example usage of live {live({url},{url:format},hour)} {live(https://data.mobility.brussels/bike/api/counts/?request=live&featureID=CB2105,hour:data.hour_cnt;day:data.day_cnt;year:data.year_cnt,hour)} @@ -174,7 +174,7 @@ countHeader | _empty string_ | The text to put above the counts colors* | _undefined_ | (Matches all resting arguments - optional) Matches a regex onto a color value, e.g. `3[a-zA-Z+-]*:#33cc33` -#### Example usage +#### Example usage of histogram `{histogram('some_key')}` with properties being `{some_key: ['a','b','a','c']} to create a histogram @@ -187,7 +187,7 @@ name | default | description url | _undefined_ | The url to share (default: current URL) -#### Example usage +#### Example usage of share_link {share_link()} to share the current page, {share_link()} to share the given url @@ -200,7 +200,7 @@ name | default | description key | _undefined_ | The key of the tag to give the canonical text for -#### Example usage +#### Example usage of canonical {canonical(length)} will give 42 metre (in french) @@ -264,7 +264,7 @@ Snap onto layer(s)/replace geometry with this other way | _undefined_ | - If th snap max distance | 5 | The maximum distance that this point will move to snap onto a layer (in meters) -#### Example usage +#### Example usage of import_button `{import_button(,,Import this data into OpenStreetMap,./assets/svg/addSmall.svg,18,,5)}` @@ -281,7 +281,7 @@ autoapply | _undefined_ | A boolean indicating wether this tagging should be app overwrite | _undefined_ | If set to 'true', the tags on the other objects will always be overwritten. The default behaviour will be to only change the tags on other objects if they are either undefined or had the same value before the change -#### Example usage +#### Example usage of multi_apply {multi_apply(_features_with_the_same_name_within_100m, name:etymology:wikidata;name:etymology, Apply etymology information on all nearby objects with the same name)} @@ -310,7 +310,7 @@ image | _undefined_ | An image to show to the contributor on the button id_of_object_to_apply_this_one | _undefined_ | If specified, applies the the tags onto _another_ object. The id will be read from properties[id_of_object_to_apply_this_one] of the selected object. The tags are still calculated based on the tags of the _selected_ element -#### Example usage +#### Example usage of tag_apply `{tag_apply(survey_date:=$_now:date, Surveyed today!)}` @@ -318,7 +318,7 @@ id_of_object_to_apply_this_one | _undefined_ | If specified, applies the the tag Exports the selected feature as GPX-file -#### Example usage +#### Example usage of export_as_gpx `{export_as_gpx()}` @@ -326,7 +326,7 @@ id_of_object_to_apply_this_one | _undefined_ | If specified, applies the the tag A button to remove the travelled track information from the device -#### Example usage +#### Example usage of clear_location_history `{clear_location_history()}` diff --git a/Docs/TagInfo/mapcomplete_entrances.json b/Docs/TagInfo/mapcomplete_entrances.json new file mode 100644 index 000000000..a298f8bc1 --- /dev/null +++ b/Docs/TagInfo/mapcomplete_entrances.json @@ -0,0 +1,203 @@ +{ + "data_format": 1, + "project": { + "name": "MapComplete Entrances", + "description": "Survey entrances to help wheelchair routing", + "project_url": "https://mapcomplete.osm.be/entrances", + "doc_url": "https://github.com/pietervdvn/MapComplete/tree/master/assets/themes/", + "icon_url": "https://mapcomplete.osm.be/assets/layers/entrance/door.svg", + "contact_name": "Pieter Vander Vennet, MapComplete", + "contact_email": "pietervdvn@posteo.net" + }, + "tags": [ + { + "key": "entrance", + "description": "The MapComplete theme Entrances has a layer Entrance showing features with this tag" + }, + { + "key": "indoor", + "description": "The MapComplete theme Entrances has a layer Entrance showing features with this tag", + "value": "door" + }, + { + "key": "image", + "description": "The layer 'Entrance allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary" + }, + { + "key": "mapillary", + "description": "The layer 'Entrance allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary" + }, + { + "key": "wikidata", + "description": "The layer 'Entrance allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary" + }, + { + "key": "wikipedia", + "description": "The layer 'Entrance allows to upload images and adds them under the 'image'-tag (and image:0, image:1, ... for multiple images). Furhtermore, this layer shows images based on the keys image, wikidata, wikipedia, wikimedia_commons and mapillary" + }, + { + "key": "entrance", + "description": "Layer 'Entrance' shows entrance=yes with a fixed text, namely 'No specific entrance type is known' (in the MapComplete.osm.be theme 'Entrances')", + "value": "yes" + }, + { + "key": "entrance", + "description": "Layer 'Entrance' shows entrance=&indoor=door with a fixed text, namely 'This is an indoor door, separating a room or a corridor within a single building' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Entrances') Picking this answer will delete the key entrance.", + "value": "" + }, + { + "key": "indoor", + "description": "Layer 'Entrance' shows entrance=&indoor=door with a fixed text, namely 'This is an indoor door, separating a room or a corridor within a single building' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Entrances')", + "value": "door" + }, + { + "key": "indoor", + "description": "Layer 'Entrance' shows indoor=&entrance=main with a fixed text, namely 'This is the main entrance' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Entrances') Picking this answer will delete the key indoor.", + "value": "" + }, + { + "key": "entrance", + "description": "Layer 'Entrance' shows indoor=&entrance=main with a fixed text, namely 'This is the main entrance' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Entrances')", + "value": "main" + }, + { + "key": "indoor", + "description": "Layer 'Entrance' shows indoor=&entrance=secondary with a fixed text, namely 'This is a secondary entrance' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Entrances') Picking this answer will delete the key indoor.", + "value": "" + }, + { + "key": "entrance", + "description": "Layer 'Entrance' shows indoor=&entrance=secondary with a fixed text, namely 'This is a secondary entrance' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Entrances')", + "value": "secondary" + }, + { + "key": "indoor", + "description": "Layer 'Entrance' shows indoor=&entrance=service with a fixed text, namely 'This is a service entrance - normally only used for employees, delivery, ...' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Entrances') Picking this answer will delete the key indoor.", + "value": "" + }, + { + "key": "entrance", + "description": "Layer 'Entrance' shows indoor=&entrance=service with a fixed text, namely 'This is a service entrance - normally only used for employees, delivery, ...' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Entrances')", + "value": "service" + }, + { + "key": "indoor", + "description": "Layer 'Entrance' shows indoor=&entrance=exit with a fixed text, namely 'This is an exit where one can not enter' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Entrances') Picking this answer will delete the key indoor.", + "value": "" + }, + { + "key": "entrance", + "description": "Layer 'Entrance' shows indoor=&entrance=exit with a fixed text, namely 'This is an exit where one can not enter' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Entrances')", + "value": "exit" + }, + { + "key": "indoor", + "description": "Layer 'Entrance' shows indoor=&entrance=entrance with a fixed text, namely 'This is an entrance where one can only enter (but not exit)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Entrances') Picking this answer will delete the key indoor.", + "value": "" + }, + { + "key": "entrance", + "description": "Layer 'Entrance' shows indoor=&entrance=entrance with a fixed text, namely 'This is an entrance where one can only enter (but not exit)' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Entrances')", + "value": "entrance" + }, + { + "key": "indoor", + "description": "Layer 'Entrance' shows indoor=&entrance=emergency with a fixed text, namely 'This is emergency exit' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Entrances') Picking this answer will delete the key indoor.", + "value": "" + }, + { + "key": "entrance", + "description": "Layer 'Entrance' shows indoor=&entrance=emergency with a fixed text, namely 'This is emergency exit' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Entrances')", + "value": "emergency" + }, + { + "key": "indoor", + "description": "Layer 'Entrance' shows indoor=&entrance=home with a fixed text, namely 'This is the entrance to a private home' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Entrances') Picking this answer will delete the key indoor.", + "value": "" + }, + { + "key": "entrance", + "description": "Layer 'Entrance' shows indoor=&entrance=home with a fixed text, namely 'This is the entrance to a private home' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Entrances')", + "value": "home" + }, + { + "key": "door", + "description": "Layer 'Entrance' shows door=yes with a fixed text, namely 'The door type is not known' (in the MapComplete.osm.be theme 'Entrances')", + "value": "yes" + }, + { + "key": "door", + "description": "Layer 'Entrance' shows door=hinged with a fixed text, namely 'A classical, hinged door supported by joints' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Entrances')", + "value": "hinged" + }, + { + "key": "door", + "description": "Layer 'Entrance' shows door=revolving with a fixed text, namely 'A revolving door which hangs on a central shaft, rotating within a cylindrical enclosure' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Entrances')", + "value": "revolving" + }, + { + "key": "door", + "description": "Layer 'Entrance' shows door=overhead with a fixed text, namely 'A door which rolls from overhead, typically seen for garages' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Entrances')", + "value": "overhead" + }, + { + "key": "door", + "description": "Layer 'Entrance' shows door=no with a fixed text, namely 'This is an entrance without a physical door' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Entrances')", + "value": "no" + }, + { + "key": "automatic_door", + "description": "Layer 'Entrance' shows automatic_door=yes with a fixed text, namely 'This is an automatic door' (in the MapComplete.osm.be theme 'Entrances')", + "value": "yes" + }, + { + "key": "automatic_door", + "description": "Layer 'Entrance' shows automatic_door=no with a fixed text, namely 'This door is not automated' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Entrances')", + "value": "no" + }, + { + "key": "automatic_door", + "description": "Layer 'Entrance' shows automatic_door=motion with a fixed text, namely 'This door will open automatically when motion is detected' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Entrances')", + "value": "motion" + }, + { + "key": "automatic_door", + "description": "Layer 'Entrance' shows automatic_door=floor with a fixed text, namely 'This door will open automatically when a sensor in the floor is triggered' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Entrances')", + "value": "floor" + }, + { + "key": "automatic_door", + "description": "Layer 'Entrance' shows automatic_door=button with a fixed text, namely 'This door will open automatically when a button is pressed' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Entrances')", + "value": "button" + }, + { + "key": "automatic_door", + "description": "Layer 'Entrance' shows automatic_door=slowdown_button with a fixed text, namely 'This door revolves automatically all the time, but has a button to slow it down, e.g. for wheelchair users' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Entrances')", + "value": "slowdown_button" + }, + { + "key": "automatic_door", + "description": "Layer 'Entrance' shows automatic_door=continuous with a fixed text, namely 'This door revolves automatically all the time' and allows to pick this as a default answer (in the MapComplete.osm.be theme 'Entrances')", + "value": "continuous" + }, + { + "key": "automatic_door", + "description": "Layer 'Entrance' shows automatic_door=serviced_on_button_press with a fixed text, namely 'This door will be opened by staff when requested by pressing a button any; -export class ExtraFunction { +} - static readonly intro = new Combine([ - new Title("Calculating tags with Javascript", 2), - "In some cases, it is useful to have some tags calculated based on other properties. Some useful tags are available by default (e.g. `lat`, `lon`, `_country`), as detailed above.", - "It is also possible to calculate your own tags - but this requires some javascript knowledge.", - "", - "Before proceeding, some warnings:", - new List([ - "DO NOT DO THIS AS BEGINNER", - "**Only do this if all other techniques fail** This should _not_ be done to create a rendering effect, only to calculate a specific value", - "**THIS MIGHT BE DISABLED WITHOUT ANY NOTICE ON UNOFFICIAL THEMES** As unofficial themes might be loaded from the internet, this is the equivalent of injecting arbitrary code into the client. It'll be disabled if abuse occurs." - ]), - "To enable this feature, add a field `calculatedTags` in the layer object, e.g.:", - "````", - "\"calculatedTags\": [", - " \"_someKey=javascript-expression\",", - " \"name=feat.properties.name ?? feat.properties.ref ?? feat.properties.operator\",", - " \"_distanceCloserThen3Km=feat.distanceTo( some_lon, some_lat) < 3 ? 'yes' : 'no'\" ", - " ]", - "````", - "", - "The above code will be executed for every feature in the layer. The feature is accessible as `feat` and is an amended geojson object:", - - new List([ - "`area` contains the surface area (in square meters) of the object", - "`lat` and `lon` contain the latitude and longitude" - ]), - "Some advanced functions are available on **feat** as well:" - ]).SetClass("flex-col").AsMarkdown(); +class OverlapFunc implements ExtraFunction { - private static readonly OverlapFunc = new ExtraFunction( - { - name: "overlapWith", - doc: "Gives a list of features from the specified layer which this feature (partly) overlaps with. A point which is embedded in the feature is detected as well." + - "If the current feature is a point, all features that this point is embeded in are given.\n\n" + - "The returned value is `{ feat: GeoJSONFeature, overlap: number}[]` where `overlap` is the overlapping surface are (in m²) for areas, the overlapping length (in meter) if the current feature is a line or `undefined` if the current feature is a point.\n" + - "The resulting list is sorted in descending order by overlap. The feature with the most overlap will thus be the first in the list\n" + - "\n" + - "For example to get all objects which overlap or embed from a layer, use `_contained_climbing_routes_properties=feat.overlapWith('climbing_route')`", - args: ["...layerIds - one or more layer ids of the layer from which every feature is checked for overlap)"] - }, - (params, feat) => { - return (...layerIds: string[]) => { - const result: { feat: any, overlap: number }[] = [] + _name = "overlapWith"; + _doc = "Gives a list of features from the specified layer which this feature (partly) overlaps with. A point which is embedded in the feature is detected as well." + + "If the current feature is a point, all features that this point is embeded in are given.\n\n" + + "The returned value is `{ feat: GeoJSONFeature, overlap: number}[]` where `overlap` is the overlapping surface are (in m²) for areas, the overlapping length (in meter) if the current feature is a line or `undefined` if the current feature is a point.\n" + + "The resulting list is sorted in descending order by overlap. The feature with the most overlap will thus be the first in the list\n" + + "\n" + + "For example to get all objects which overlap or embed from a layer, use `_contained_climbing_routes_properties=feat.overlapWith('climbing_route')`" + _args = ["...layerIds - one or more layer ids of the layer from which every feature is checked for overlap)"] - const bbox = BBox.get(feat) + _f(params, feat) { + return (...layerIds: string[]) => { + const result: { feat: any, overlap: number }[] = [] - for (const layerId of layerIds) { - const otherLayers = params.getFeaturesWithin(layerId, bbox) - if (otherLayers === undefined) { - continue; - } - if (otherLayers.length === 0) { - continue; - } - for (const otherLayer of otherLayers) { - result.push(...GeoOperations.calculateOverlap(feat, otherLayer)); - } + const bbox = BBox.get(feat) + + for (const layerId of layerIds) { + const otherLayers = params.getFeaturesWithin(layerId, bbox) + if (otherLayers === undefined) { + continue; + } + if (otherLayers.length === 0) { + continue; + } + for (const otherLayer of otherLayers) { + result.push(...GeoOperations.calculateOverlap(feat, otherLayer)); } - - result.sort((a, b) => b.overlap - a.overlap) - - return result; } + + result.sort((a, b) => b.overlap - a.overlap) + + return result; } - ) - private static readonly DistanceToFunc = new ExtraFunction( - { - name: "distanceTo", - doc: "Calculates the distance between the feature and a specified point in meter. The input should either be a pair of coordinates, a geojson feature or the ID of an object", - args: ["feature OR featureID OR longitude", "undefined OR latitude"] - }, - (featuresPerLayer, feature) => { - return (arg0, lat) => { - if (arg0 === undefined) { + } +} + +class DistanceToFunc implements ExtraFunction { + + _name = "distanceTo"; + _doc = "Calculates the distance between the feature and a specified point in meter. The input should either be a pair of coordinates, a geojson feature or the ID of an object"; + _args = ["feature OR featureID OR longitude", "undefined OR latitude"] + + _f(featuresPerLayer, feature) { + return (arg0, lat) => { + if (arg0 === undefined) { + return undefined; + } + if (typeof arg0 === "number") { + // Feature._lon and ._lat is conveniently place by one of the other metatags + return GeoOperations.distanceBetween([arg0, lat], [feature._lon, feature._lat]); + } + if (typeof arg0 === "string") { + // This is an identifier + // TODO FIXME + const feature = undefined // State.state.allElements.ContainingFeatures.get(arg0); + if (feature === undefined) { return undefined; } - if (typeof arg0 === "number") { - // Feature._lon and ._lat is conveniently place by one of the other metatags - return GeoOperations.distanceBetween([arg0, lat], [feature._lon, feature._lat]); - } - if (typeof arg0 === "string") { - // This is an identifier - const feature = State.state.allElements.ContainingFeatures.get(arg0); - if (feature === undefined) { - return undefined; - } - arg0 = feature; - } - - // arg0 is probably a feature - return GeoOperations.distanceBetween(GeoOperations.centerpointCoordinates(arg0), [feature._lon, feature._lat]) - - } - } - ) - private static readonly ClosestObjectFunc = new ExtraFunction( - { - name: "closest", - doc: "Given either a list of geojson features or a single layer name, gives the single object which is nearest to the feature. In the case of ways/polygons, only the centerpoint is considered. Returns a single geojson feature or undefined if nothing is found (or not yet laoded)", - args: ["list of features or a layer name or '*' to get all features"] - }, - (params, feature) => { - return (features) => ExtraFunction.GetClosestNFeatures(params, feature, features)?.[0]?.feat - } - ) - - private static readonly ClosestNObjectFunc = new ExtraFunction( - { - name: "closestn", - doc: "Given either a list of geojson features or a single layer name, gives the n closest objects which are nearest to the feature (excluding the feature itself). In the case of ways/polygons, only the centerpoint is considered. " + - "Returns a list of `{feat: geojson, distance:number}` the empty list if nothing is found (or not yet loaded)\n\n" + - "If a 'unique tag key' is given, the tag with this key will only appear once (e.g. if 'name' is given, all features will have a different name)", - args: ["list of features or layer name or '*' to get all features", "amount of features", "unique tag key (optional)", "maxDistanceInMeters (optional)"] - }, - (params, feature) => { - - return (features, amount, uniqueTag, maxDistanceInMeters) => { - let distance: number = Number(maxDistanceInMeters) - if (isNaN(distance)) { - distance = undefined - } - return ExtraFunction.GetClosestNFeatures(params, feature, features, { - maxFeatures: Number(amount), - uniqueTag: uniqueTag, - maxDistance: distance - }); - } - } - ) - - private static readonly Memberships = new ExtraFunction( - { - name: "memberships", - doc: "Gives a list of `{role: string, relation: Relation}`-objects, containing all the relations that this feature is part of. " + - "\n\n" + - "For example: `_part_of_walking_routes=feat.memberships().map(r => r.relation.tags.name).join(';')`", - args: [] - }, - (params, feat) => { - return () => - params.memberships.knownRelations.data.get(feat.properties.id) ?? [] - - } - ) - - private static readonly GetParsed = new ExtraFunction( - { - name: "get", - doc: "Gets the property of the feature, parses it (as JSON) and returns it. Might return 'undefined' if not defined, null, ...", - args: ["key"] - }, - (params, feat) => { - return key => { - const value = feat.properties[key] - if (value === undefined) { - return undefined; - } - try { - const parsed = JSON.parse(value) - if (parsed === null) { - return undefined; - } - return parsed; - } catch (e) { - console.warn("Could not parse property " + key + " due to: " + e + ", the value is " + value) - return undefined; - } - + arg0 = feature; } + // arg0 is probably a feature + return GeoOperations.distanceBetween(GeoOperations.centerpointCoordinates(arg0), [feature._lon, feature._lat]) + } - ) + } +} - private static readonly allFuncs: ExtraFunction[] = [ - ExtraFunction.DistanceToFunc, - ExtraFunction.OverlapFunc, - ExtraFunction.ClosestObjectFunc, - ExtraFunction.ClosestNObjectFunc, - ExtraFunction.Memberships, - ExtraFunction.GetParsed - ]; - private readonly _name: string; - private readonly _args: string[]; - private readonly _doc: string; - private readonly _f: (params: ExtraFuncParams, feat: any) => any; - constructor(options: { name: string, doc: string, args: string[] }, - f: ((params: ExtraFuncParams, feat: any) => any)) { - this._name = options.name; - this._doc = options.doc; - this._args = options.args; - this._f = f; +class ClosestObjectFunc implements ExtraFunction { + _name = "closest" + _doc = "Given either a list of geojson features or a single layer name, gives the single object which is nearest to the feature. In the case of ways/polygons, only the centerpoint is considered. Returns a single geojson feature or undefined if nothing is found (or not yet laoded)" + + _args = ["list of features or a layer name or '*' to get all features"] + + _f(params, feature) { + return (features) => ClosestNObjectFunc.GetClosestNFeatures(params, feature, features)?.[0]?.feat } - public static FullPatchFeature(params: ExtraFuncParams, feature) { - for (const func of ExtraFunction.allFuncs) { - func.PatchFeature(params, feature); +} + + +class ClosestNObjectFunc implements ExtraFunction { + _f(params, feature) { + + return (features, amount, uniqueTag, maxDistanceInMeters) => { + let distance: number = Number(maxDistanceInMeters) + if (isNaN(distance)) { + distance = undefined + } + return ClosestNObjectFunc.GetClosestNFeatures(params, feature, features, { + maxFeatures: Number(amount), + uniqueTag: uniqueTag, + maxDistance: distance + }); } } - public static HelpText(): BaseUIElement { - - const elems = [] - for (const func of ExtraFunction.allFuncs) { - elems.push(new Title(func._name, 3), - func._doc, - new List(func._args, true)) - } - - return new Combine([ - ExtraFunction.intro, - new List(ExtraFunction.allFuncs.map(func => `[${func._name}](#${func._name})`)), - ...elems - ]); - } + _name = "closestn" + _doc = "Given either a list of geojson features or a single layer name, gives the n closest objects which are nearest to the feature (excluding the feature itself). In the case of ways/polygons, only the centerpoint is considered. " + + "Returns a list of `{feat: geojson, distance:number}` the empty list if nothing is found (or not yet loaded)\n\n" + + "If a 'unique tag key' is given, the tag with this key will only appear once (e.g. if 'name' is given, all features will have a different name)" + _args: ["list of features or layer name or '*' to get all features", "amount of features", "unique tag key (optional)", "maxDistanceInMeters (optional)"] /** * Gets the closes N features, sorted by ascending distance. @@ -248,10 +144,10 @@ export class ExtraFunction { * @constructor * @private */ - private static GetClosestNFeatures(params: ExtraFuncParams, - feature: any, - features: string | any[], - options?: { maxFeatures?: number, uniqueTag?: string | undefined, maxDistance?: number }): { feat: any, distance: number }[] { + static GetClosestNFeatures(params: ExtraFuncParams, + feature: any, + features: string | any[], + options?: { maxFeatures?: number, uniqueTag?: string | undefined, maxDistance?: number }): { feat: any, distance: number }[] { const maxFeatures = options?.maxFeatures ?? 1 const maxDistance = options?.maxDistance ?? 500 const uniqueTag: string | undefined = options?.uniqueTag @@ -366,7 +262,115 @@ export class ExtraFunction { return closestFeatures; } - public PatchFeature(params: ExtraFuncParams, feature: any) { - feature[this._name] = this._f(params, feature) +} + + +class Memberships implements ExtraFunction { + _name = "memberships" + _doc = "Gives a list of `{role: string, relation: Relation}`-objects, containing all the relations that this feature is part of. " + + "\n\n" + + "For example: `_part_of_walking_routes=feat.memberships().map(r => r.relation.tags.name).join(';')`" + _args = [] + + _f(params, feat) { + return () => + params.memberships.knownRelations.data.get(feat.properties.id) ?? [] + } } + + +class GetParsed implements ExtraFunction { + _name = "get" + _doc = "Gets the property of the feature, parses it (as JSON) and returns it. Might return 'undefined' if not defined, null, ..." + _args = ["key"] + _f(params, feat) { + return key => { + const value = feat.properties[key] + if (value === undefined) { + return undefined; + } + try { + const parsed = JSON.parse(value) + if (parsed === null) { + return undefined; + } + return parsed; + } catch (e) { + console.warn("Could not parse property " + key + " due to: " + e + ", the value is " + value) + return undefined; + } + + } + + } +} + + +export class ExtraFunctions { + + + static readonly intro = new Combine([ + new Title("Calculating tags with Javascript", 2), + "In some cases, it is useful to have some tags calculated based on other properties. Some useful tags are available by default (e.g. `lat`, `lon`, `_country`), as detailed above.", + "It is also possible to calculate your own tags - but this requires some javascript knowledge.", + "", + "Before proceeding, some warnings:", + new List([ + "DO NOT DO THIS AS BEGINNER", + "**Only do this if all other techniques fail** This should _not_ be done to create a rendering effect, only to calculate a specific value", + "**THIS MIGHT BE DISABLED WITHOUT ANY NOTICE ON UNOFFICIAL THEMES** As unofficial themes might be loaded from the internet, this is the equivalent of injecting arbitrary code into the client. It'll be disabled if abuse occurs." + ]), + "To enable this feature, add a field `calculatedTags` in the layer object, e.g.:", + "````", + "\"calculatedTags\": [", + " \"_someKey=javascript-expression\",", + " \"name=feat.properties.name ?? feat.properties.ref ?? feat.properties.operator\",", + " \"_distanceCloserThen3Km=feat.distanceTo( some_lon, some_lat) < 3 ? 'yes' : 'no'\" ", + " ]", + "````", + "", + "The above code will be executed for every feature in the layer. The feature is accessible as `feat` and is an amended geojson object:", + + new List([ + "`area` contains the surface area (in square meters) of the object", + "`lat` and `lon` contain the latitude and longitude" + ]), + "Some advanced functions are available on **feat** as well:" + ]).SetClass("flex-col").AsMarkdown(); + + + private static readonly allFuncs: ExtraFunction[] = [ + new DistanceToFunc(), + new OverlapFunc(), + new ClosestObjectFunc(), + new ClosestNObjectFunc(), + new Memberships(), + new GetParsed() + ]; + + public static FullPatchFeature(params: ExtraFuncParams, feature) { + for (const func of ExtraFunctions.allFuncs) { + feature[func._name] = func._f(params, feature) + } + } + + public static HelpText(): BaseUIElement { + + const elems = [] + for (const func of ExtraFunctions.allFuncs) { + console.log("Generating ", func.constructor.name) + elems.push(new Title(func._name, 3), + func._doc, + new List(func._args ?? [], true)) + } + + return new Combine([ + ExtraFunctions.intro, + new List(ExtraFunctions.allFuncs.map(func => `[${func._name}](#${func._name})`)), + ...elems + ]); + } + + +} diff --git a/Logic/MetaTagging.ts b/Logic/MetaTagging.ts index 0ac9ba4e1..ac7f973e4 100644 --- a/Logic/MetaTagging.ts +++ b/Logic/MetaTagging.ts @@ -1,5 +1,5 @@ import SimpleMetaTagger from "./SimpleMetaTagger"; -import {ExtraFuncParams, ExtraFunction} from "./ExtraFunction"; +import {ExtraFuncParams, ExtraFunctions} from "./ExtraFunctions"; import LayerConfig from "../Models/ThemeConfig/LayerConfig"; import State from "../State"; @@ -105,7 +105,7 @@ export default class MetaTagging { } - private static createFunctionsForFeature(calculatedTags: [string, string][]): ((feature: any) => void)[] { + public static createFunctionsForFeature(calculatedTags: [string, string][]): ((feature: any) => void)[] { const functions: ((feature: any) => void)[] = []; for (const entry of calculatedTags) { const key = entry[0] @@ -176,7 +176,7 @@ export default class MetaTagging { const functions = MetaTagging.createFunctionsForFeature(calculatedTags) - ExtraFunction.FullPatchFeature(params, feature); + ExtraFunctions.FullPatchFeature(params, feature); for (const f of functions) { f(feature); } diff --git a/Logic/UIEventSource.ts b/Logic/UIEventSource.ts index ebf4400c2..f29ef5b67 100644 --- a/Logic/UIEventSource.ts +++ b/Logic/UIEventSource.ts @@ -224,6 +224,7 @@ export class UIEventSource { public ping(): void { let toDelete = undefined + let startTime = new Date().getTime() / 1000; for (const callback of this._callbacks) { if (callback(this.data) === true) { // This callback wants to be deleted @@ -235,6 +236,10 @@ export class UIEventSource { } } } + let endTime = new Date().getTime() / 1000 + if((endTime - startTime) > 500){ + console.trace("Warning: a ping of ",this.tag," took more then 500ms; this is probably a performance issue") + } if (toDelete !== undefined) { for (const toDeleteElement of toDelete) { this._callbacks.splice(this._callbacks.indexOf(toDeleteElement), 1) diff --git a/Models/ThemeConfig/DependencyCalculator.ts b/Models/ThemeConfig/DependencyCalculator.ts new file mode 100644 index 000000000..60903dd5f --- /dev/null +++ b/Models/ThemeConfig/DependencyCalculator.ts @@ -0,0 +1,111 @@ +import {SpecialVisualization} from "../../UI/SpecialVisualizations"; +import {SubstitutedTranslation} from "../../UI/SubstitutedTranslation"; +import TagRenderingConfig from "./TagRenderingConfig"; +import {ExtraFuncParams, ExtraFunctions} from "../../Logic/ExtraFunctions"; +import LayerConfig from "./LayerConfig"; + +export default class DependencyCalculator { + + public static GetTagRenderingDependencies(tr: TagRenderingConfig): string[] { + + if(tr === undefined){ + throw "Got undefined tag rendering in getTagRenderingDependencies" + } + const deps: string[] = [] + + // All translated snippets + const parts: string[] = [].concat(...(tr.EnumerateTranslations().map(tr => tr.AllValues()))) + + for (const part of parts) { + const specialVizs: { func: SpecialVisualization, args: string[] }[] + = SubstitutedTranslation.ExtractSpecialComponents(part).map(o => o.special) + .filter(o => o?.func?.getLayerDependencies !== undefined) + for (const specialViz of specialVizs) { + deps.push(...specialViz.func.getLayerDependencies(specialViz.args)) + } + } + return deps; + } + + /** + * Returns a set of all other layer-ids that this layer needs to function. + * E.g. if this layers does snap to another layer in the preset, this other layer id will be mentioned + */ + public static getLayerDependencies(layer: LayerConfig): { neededLayer: string, reason: string, context?: string, neededBy: string }[] { + const deps: { neededLayer: string, reason: string, context?: string, neededBy: string }[] = [] + + for (let i = 0; layer.presets !== undefined && i < layer.presets.length; i++) { + const preset = layer.presets[i]; + preset.preciseInput?.snapToLayers?.forEach(id => { + deps.push({ + neededLayer: id, + reason: "a preset snaps to this layer", + context: "presets[" + i + "]", + neededBy: layer.id + }); + }) + } + + for (const tr of layer.AllTagRenderings()) { + for (const dep of DependencyCalculator.GetTagRenderingDependencies(tr)) { + deps.push({ + neededLayer: dep, + reason: "a tagrendering needs this layer", + context: tr.id, + neededBy: layer.id + }) + } + } + + if (layer.calculatedTags?.length > 0) { + const obj = { + type: "Feature", + geometry: { + type: "Point", + coordinates: [0, 0] + }, + properties: { + id: "node/1" + } + } + let currentKey = undefined + let currentLine = undefined + const params: ExtraFuncParams = { + getFeaturesWithin: (layerId, _) => { + + if(layerId === '*'){ + // This is a wildcard + return [] + } + + // The important line: steal the dependencies! + deps.push({ + neededLayer: layerId, reason: "A calculated tag loads features from this layer", + context: "calculatedTag[" + currentLine + "] which calculates the value for " + currentKey, + neededBy: layer.id + }) + + return [] + }, + memberships: undefined + } + // Init the extra patched functions... + ExtraFunctions.FullPatchFeature(params, obj) + // ... Run the calculated tag code, which will trigger the getFeaturesWithin above... + for (let i = 0; i < layer.calculatedTags.length; i++) { + const [key, code] = layer.calculatedTags[i]; + currentLine = i; // Leak the state... + currentKey = key; + try { + + const func = new Function("feat", "return " + code + ";"); + const result = func(obj) + obj.properties[key] = JSON.stringify(result); + } catch (e) { + } + } + } + + return deps + } +} \ No newline at end of file diff --git a/Models/ThemeConfig/LayerConfig.ts b/Models/ThemeConfig/LayerConfig.ts index 11daedc55..ba9550529 100644 --- a/Models/ThemeConfig/LayerConfig.ts +++ b/Models/ThemeConfig/LayerConfig.ts @@ -413,7 +413,11 @@ export default class LayerConfig extends WithContextLoader { } - public GenerateDocumentation(usedInThemes: string[], addedByDefault = false, canBeIncluded = true): BaseUIElement { + public GenerateDocumentation(usedInThemes: string[], layerIsNeededBy: Map, dependencies: { + context?: string; + reason: string; + neededLayer: string; + }[], addedByDefault = false, canBeIncluded = true): BaseUIElement { const extraProps = [] if (canBeIncluded) { @@ -441,8 +445,12 @@ export default class LayerConfig extends WithContextLoader { ] } - for (const dep of Array.from(this.getDependencies())) { - extraProps.push(new Combine(["This layer will automatically load ", new Link(dep, "#"+dep)," into the layout as it depends on it."])) + for (const dep of dependencies) { + extraProps.push(new Combine(["This layer will automatically load ", new Link(dep.neededLayer, "#"+dep.neededLayer)," into the layout as it depends on it: ", dep.reason, "("+dep.context+")"])) + } + + for(const revDep of layerIsNeededBy?.get(this.id) ?? []){ + extraProps.push(new Combine(["This layer is needed as dependency for layer",new Link(revDep, "#"+revDep)])) } return new Combine([ @@ -462,6 +470,10 @@ export default class LayerConfig extends WithContextLoader { } return this.calculatedTags.map((code) => code[1]); } + + AllTagRenderings(): TagRenderingConfig[]{ + return Utils.NoNull([...this.tagRenderings, ...this.titleIcons, this.title, this.isShown]) +} public ExtractImages(): Set { const parts: Set[] = []; @@ -485,22 +497,4 @@ export default class LayerConfig extends WithContextLoader { return this.lineRendering.some(lr => lr.leftRightSensitive) } - /** - * Returns a set of all other layer-ids that this layer needs to function. - * E.g. if this layers does snap to another layer in the preset, this other layer id will be mentioned - */ - public getDependencies(): Set{ - const deps = new Set() - - for (const preset of this.presets ?? []) { - if(preset.preciseInput?.snapToLayers === undefined){ - continue - } - preset.preciseInput?.snapToLayers?.forEach(id => { - deps.add(id); - }) - } - - return deps - } } \ No newline at end of file diff --git a/Models/ThemeConfig/LayoutConfig.ts b/Models/ThemeConfig/LayoutConfig.ts index 6b059398e..157e4fd4b 100644 --- a/Models/ThemeConfig/LayoutConfig.ts +++ b/Models/ThemeConfig/LayoutConfig.ts @@ -6,6 +6,7 @@ import LayerConfig from "./LayerConfig"; import {LayerConfigJson} from "./Json/LayerConfigJson"; import Constants from "../Constants"; import TilesourceConfig from "./TilesourceConfig"; +import DependencyCalculator from "./DependencyCalculator"; export default class LayoutConfig { public readonly id: string; @@ -193,7 +194,6 @@ export default class LayoutConfig { names = [names] } names.forEach(name => { - if (name === "type_node") { // This is a very special layer which triggers special behaviour exportAllNodes = true; @@ -221,29 +221,47 @@ export default class LayoutConfig { const sharedLayer = AllKnownLayers.sharedLayers.get(defaultLayer) if (sharedLayer !== undefined) { result.push(sharedLayer) + }else if(!AllKnownLayers.runningGenerateScript){ + throw "SharedLayer "+defaultLayer+" not found" } } - let unmetDependencies: { dependency: string, layer: string }[] = [] + if(AllKnownLayers.runningGenerateScript){ + return {layers: result, extractAllNodes: exportAllNodes} + } + // Verify cross-dependencies + let unmetDependencies: { neededLayer: string, neededBy: string, reason: string, context?: string }[] = [] do { - const dependencies: { dependency: string, layer: string }[] = [].concat(...result.map(l => Array.from(l.getDependencies()).map(d => ({ - dependency: d, - layer: l.id - })))) - const loadedLayers = new Set(result.map(r => r.id)) - unmetDependencies = dependencies.filter(dep => !loadedLayers.has(dep.dependency)) - for (const unmetDependency of unmetDependencies) { + const dependencies: { neededLayer: string, reason: string, context?: string, neededBy: string }[] = [] - console.log("Recursively loading unmet dependency ", unmetDependency.dependency, "(needed by " + unmetDependency.layer + ")") - const dep = AllKnownLayers.sharedLayers.get(unmetDependency.dependency) + for (const layerConfig of result) { + const layerDeps = DependencyCalculator.getLayerDependencies(layerConfig) + dependencies.push(...layerDeps) + } + + const loadedLayers = new Set(result.map(r => r.id)) + // During the generate script, builtin layers are verified but not loaded - so we have to add them manually here + // Their existance is checked elsewhere, so this is fine + unmetDependencies = dependencies.filter(dep => !loadedLayers.has(dep.neededLayer)) + for (const unmetDependency of unmetDependencies) { + const dep = AllKnownLayers.sharedLayers.get(unmetDependency.neededLayer) if (dep === undefined) { - throw "The layer '" + unmetDependency.layer + "' needs '" + unmetDependency.dependency + "' to be loaded, but it could not be found as builtin layer (at " + context + ")" + + const message = + ["Loading a dependency failed: layer "+unmetDependency.neededLayer+" is not found, neither as layer of "+json.id+" nor as builtin layer.", + "This layer is needed by "+unmetDependency.neededBy, + unmetDependency.reason+" (at "+unmetDependency.context+")", + "Loaded layers are: "+result.map(l => l.id).join(",") + + ] + throw message.join("\n\t"); } result.unshift(dep) - unmetDependencies = unmetDependencies.filter(d => d.dependency !== unmetDependency.dependency) + unmetDependencies = unmetDependencies.filter(d => d.neededLayer !== unmetDependency.neededLayer) } } while (unmetDependencies.length > 0) + return {layers: result, extractAllNodes: exportAllNodes} } diff --git a/Models/ThemeConfig/TagRenderingConfig.ts b/Models/ThemeConfig/TagRenderingConfig.ts index 6716b63ab..c9674097f 100644 --- a/Models/ThemeConfig/TagRenderingConfig.ts +++ b/Models/ThemeConfig/TagRenderingConfig.ts @@ -58,11 +58,10 @@ export default class TagRenderingConfig { if (typeof json === "number") { - json = ""+json + json = "" + json } - if (typeof json === "string") { this.render = Translations.T(json, context + ".render"); this.multiAnswer = false; @@ -71,12 +70,11 @@ export default class TagRenderingConfig { this.id = json.id ?? ""; - if(this.id.match(/^[a-zA-Z0-9 ()?\/=:;,_-]*$/) === null){ - throw "Invalid ID in "+context+": an id can only contain [a-zA-Z0-0_-] as characters. The offending id is: "+this.id + if (this.id.match(/^[a-zA-Z0-9 ()?\/=:;,_-]*$/) === null) { + throw "Invalid ID in " + context + ": an id can only contain [a-zA-Z0-0_-] as characters. The offending id is: " + this.id } - - - + + this.group = json.group ?? ""; this.render = Translations.T(json.render, context + ".render"); this.question = Translations.T(json.question, context + ".question"); @@ -106,9 +104,9 @@ export default class TagRenderingConfig { throw `Freeform.args is defined. This should probably be 'freeform.helperArgs' (at ${context})` } - - if(json.freeform.key === "questions"){ - if(this.id !== "questions"){ + + if (json.freeform.key === "questions") { + if (this.id !== "questions") { throw `If you use a freeform key 'questions', the ID must be 'questions' too to trigger the special behaviour. The current id is '${this.id}' (at ${context})` } } @@ -187,53 +185,52 @@ export default class TagRenderingConfig { if (this.id === "questions" && this.render !== undefined) { for (const ln in this.render.translations) { - const txt :string = this.render.translations[ln] - if(txt.indexOf("{questions}") >= 0){ + const txt: string = this.render.translations[ln] + if (txt.indexOf("{questions}") >= 0) { continue } throw `${context}: The rendering for language ${ln} does not contain {questions}. This is a bug, as this rendering should include exactly this to trigger those questions to be shown!` } - if(this.freeform?.key !== undefined && this.freeform?.key !== "questions"){ + if (this.freeform?.key !== undefined && this.freeform?.key !== "questions") { throw `${context}: If the ID is questions to trigger a question box, the only valid freeform value is 'questions' as well. Set freeform to questions or remove the freeform all together` } } if (this.freeform) { - if(this.render === undefined){ + if (this.render === undefined) { throw `${context}: Detected a freeform key without rendering... Key: ${this.freeform.key} in ${context}` } for (const ln in this.render.translations) { - const txt :string = this.render.translations[ln] - if(txt === ""){ - throw context+" Rendering for language "+ln+" is empty" + const txt: string = this.render.translations[ln] + if (txt === "") { + throw context + " Rendering for language " + ln + " is empty" } - if(txt.indexOf("{"+this.freeform.key+"}") >= 0){ + if (txt.indexOf("{" + this.freeform.key + "}") >= 0) { continue } - if(txt.indexOf("{"+this.freeform.key+":") >= 0){ + if (txt.indexOf("{" + this.freeform.key + ":") >= 0) { continue } - if(txt.indexOf("{canonical("+this.freeform.key+")") >= 0){ + if (txt.indexOf("{canonical(" + this.freeform.key + ")") >= 0) { continue } - if(this.freeform.type === "opening_hours" && txt.indexOf("{opening_hours_table(") >= 0){ + if (this.freeform.type === "opening_hours" && txt.indexOf("{opening_hours_table(") >= 0) { continue } - if(this.freeform.type === "wikidata" && txt.indexOf("{wikipedia("+this.freeform.key) >= 0){ + if (this.freeform.type === "wikidata" && txt.indexOf("{wikipedia(" + this.freeform.key) >= 0) { continue } - if(this.freeform.key === "wikidata" && txt.indexOf("{wikipedia()") >= 0){ + if (this.freeform.key === "wikidata" && txt.indexOf("{wikipedia()") >= 0) { continue } throw `${context}: The rendering for language ${ln} does not contain the freeform key {${this.freeform.key}}. This is a bug, as this rendering should show exactly this freeform key!\nThe rendering is ${txt} ` - + } } - if (this.render && this.question && this.freeform === undefined) { throw `${context}: Detected a tagrendering which takes input without freeform key in ${context}; the question is ${this.question.txt}` } @@ -377,7 +374,7 @@ export default class TagRenderingConfig { } } - if(this.id === "questions"){ + if (this.id === "questions") { return this.render } @@ -391,6 +388,26 @@ export default class TagRenderingConfig { return defltValue; } + /** + * Gets all translations that might be rendered in all languages + * USed for static analysis + * @constructor + * @private + */ + EnumerateTranslations(): Translation[] { + const translations: Translation[] = [] + for (const key in this) { + if(!this.hasOwnProperty(key)){ + continue; + } + const o = this[key] + if (o instanceof Translation) { + translations.push(o) + } + } + return translations; + } + public ExtractImages(isIcon: boolean): Set { const usedIcons = new Set() diff --git a/UI/Base/Title.ts b/UI/Base/Title.ts index e926bd746..49c4b5ded 100644 --- a/UI/Base/Title.ts +++ b/UI/Base/Title.ts @@ -1,5 +1,6 @@ import BaseUIElement from "../BaseUIElement"; import {FixedUiElement} from "./FixedUiElement"; +import {Utils} from "../../Utils"; export default class Title extends BaseUIElement { public readonly title: BaseUIElement; @@ -10,6 +11,9 @@ export default class Title extends BaseUIElement { constructor(embedded: string | BaseUIElement, level: number = 3) { super() + if(embedded === undefined){ + throw "A title should have some content. Undefined is not allowed" + } if (typeof embedded === "string") { this.title = new FixedUiElement(embedded) } else { @@ -23,7 +27,11 @@ export default class Title extends BaseUIElement { }else if(embedded instanceof FixedUiElement){ innerText = embedded.content }else{ - this.title.ConstructElement()?.innerText + if(Utils.runningFromConsole){ + console.log("Not constructing an anchor for title with embedded content of "+embedded) + }else{ + innerText = embedded.ConstructElement()?.innerText + } } this.id = innerText?.replace(/ /g, '-') diff --git a/UI/BigComponents/ImportButton.ts b/UI/BigComponents/ImportButton.ts index 58a3ff579..595b56860 100644 --- a/UI/BigComponents/ImportButton.ts +++ b/UI/BigComponents/ImportButton.ts @@ -140,6 +140,20 @@ ${Utils.Special_visualizations_tagsToApplyHelpText} defaultValue: "5" }] + getLayerDependencies(args: string[]){ + const dependsOnLayers: string[] = [] + + // The target layer + dependsOnLayers.push(args[0]) + + const snapOntoLayers = args[5]?.trim() ?? ""; + if(args[5] !== ""){ + dependsOnLayers.push(...snapOntoLayers.split(";")) + } + + return dependsOnLayers + } + constr(state, tagSource, args, guiState) { if (!state.layoutToUse.official && !(state.featureSwitchIsTesting.data || state.osmConnection._oauth_config.url === OsmConnection.oauth_configs["osm-test"].url)) { return new Combine([new FixedUiElement("The import button is disabled for unofficial themes to prevent accidents.").SetClass("alert"), diff --git a/UI/SpecialVisualizations.ts b/UI/SpecialVisualizations.ts index dc1fc2c7a..a6760f5d5 100644 --- a/UI/SpecialVisualizations.ts +++ b/UI/SpecialVisualizations.ts @@ -44,7 +44,8 @@ export interface SpecialVisualization { constr: ((state: State, tagSource: UIEventSource, argument: string[], guistate: DefaultGuiState,) => BaseUIElement), docs: string, example?: string, - args: { name: string, defaultValue?: string, doc: string }[] + args: { name: string, defaultValue?: string, doc: string }[], + getLayerDependencies?: (argument: string[]) => string[] } export default class SpecialVisualizations { @@ -477,6 +478,7 @@ export default class SpecialVisualizations { } }, new ImportButtonSpecialViz(), + { funcName: "multi_apply", docs: "A button to apply the tagging of this object onto a list of other features. This is an advanced feature for which you'll need calculatedTags", @@ -688,7 +690,7 @@ export default class SpecialVisualizations { return [arg.name, defaultArg, arg.doc]; }) ) : undefined, - new Title("Example usage", 4), + new Title("Example usage of "+viz.funcName, 4), new FixedUiElement( viz.example ?? "`{" + viz.funcName + "(" + viz.args.map(arg => arg.defaultValue).join(",") + ")}`" ).SetClass("literal-code"), diff --git a/UI/i18n/Translation.ts b/UI/i18n/Translation.ts index f3966508f..a962410a2 100644 --- a/UI/i18n/Translation.ts +++ b/UI/i18n/Translation.ts @@ -112,6 +112,10 @@ export class Translation extends BaseUIElement { } return langs; } + + public AllValues(): string[]{ + return this.SupportedLanguages().map(lng => this.translations[lng]); + } public Subs(text: any): Translation { const newTranslations = {}; diff --git a/assets/layers/entrance/entrance.json b/assets/layers/entrance/entrance.json index 488249930..cb5e84b96 100644 --- a/assets/layers/entrance/entrance.json +++ b/assets/layers/entrance/entrance.json @@ -21,6 +21,7 @@ } }, "tagRenderings": [ + "images", { "id": "Entrance type", "question": { @@ -167,6 +168,67 @@ } ] }, + { + "id": "automatic_door", + "question": "Is this door automated?", + "condition": "door!=no", + "mappings": [ + { + "if": "automatic_door=yes", + "then": { + "en": "This is an automatic door" + }, + "hideInAnswer": true + }, + { + "if": "automatic_door=no", + "then": { + "en": "This door is not automated" + } + }, + { + "if": "automatic_door=motion", + "then": { + "en": "This door will open automatically when motion is detected" + } + }, + { + "if": "automatic_door=floor", + "then": { + "en": "This door will open automatically when a sensor in the floor is triggered" + } + }, + { + "if": "automatic_door=button", + "then": { + "en": "This door will open automatically when a button is pressed" + } + }, + { + "if": "automatic_door=slowdown_button", + "then": { + "en": "This door revolves automatically all the time, but has a button to slow it down, e.g. for wheelchair users" + } + }, + { + "if": "automatic_door=continuous", + "then": { + "en": "This door revolves automatically all the time" + } + },{ + "if": "automatic_door=serviced_on_button_press", + "then": { + "en": "This door will be opened by staff when requested by pressing a buttonLength overview{histogram(_length_hist)}", "fr": "

Résumé de longueur

{histogram(_length_hist)}", - "de": "

Längenübersicht

{histogramm(_length_hist)}", + "de": "

Längenübersicht

{histogram(_length_hist)}", "it": "

Riassunto della lunghezza

{histogram(_length_hist)}" }, "condition": "_length_hist!~\\[\\]", diff --git a/assets/themes/entrances/entrances.json b/assets/themes/entrances/entrances.json new file mode 100644 index 000000000..4b5d9a794 --- /dev/null +++ b/assets/themes/entrances/entrances.json @@ -0,0 +1,22 @@ +{ + "id": "entrances", + "title": { + "en":"Entrances" + }, + "icon": "./assets/layers/entrance/door.svg", + "description": { + "en":"A map showing all entrances, which surveys for important aspects for wheelchair users" + }, + "shortDescription": {"en": + "Survey entrances to help wheelchair routing" + }, + "language": ["en"], + "version": "2021-12-04", + "maintainer": "MapComplete", + "layers": [ + "entrance" + ], + "startZoom": 15, + "startLat": 51.0490, + "startLon": 3.7297 +} \ No newline at end of file diff --git a/assets/themes/surveillance/surveillance.json b/assets/themes/surveillance/surveillance.json index 25a22fcae..1e460a0f7 100644 --- a/assets/themes/surveillance/surveillance.json +++ b/assets/themes/surveillance/surveillance.json @@ -49,7 +49,6 @@ "socialImage": "", "defaultBackgroundId": "osm", "layers": [ - "walls_and_buildings", "direction", "surveillance_camera" ] diff --git a/dependencies.svg b/dependencies.svg new file mode 100644 index 000000000..169e50155 --- /dev/null +++ b/dependencies.svg @@ -0,0 +1,8177 @@ + + + + + + +dependency-cruiser output + + +cluster_Customizations + +Customizations + + +cluster_Logic + +Logic + + +cluster_Logic/Actors + +Actors + + +cluster_Logic/FeatureSource + +FeatureSource + + +cluster_Logic/FeatureSource/Actors + +Actors + + +cluster_Logic/FeatureSource/Sources + +Sources + + +cluster_Logic/FeatureSource/TiledFeatureSource + +TiledFeatureSource + + +cluster_Logic/ImageProviders + +ImageProviders + + +cluster_Logic/Osm + +Osm + + +cluster_Logic/Osm/Actions + +Actions + + +cluster_Logic/State + +State + + +cluster_Logic/Tags + +Tags + + +cluster_Logic/Web + +Web + + +cluster_Models + +Models + + +cluster_Models/ThemeConfig + +ThemeConfig + + +cluster_UI + +UI + + +cluster_UI/Base + +Base + + +cluster_UI/BigComponents + +BigComponents + + +cluster_UI/Image + +Image + + +cluster_UI/Input + +Input + + +cluster_UI/NewPoint + +NewPoint + + +cluster_UI/OpeningHours + +OpeningHours + + +cluster_UI/Popup + +Popup + + +cluster_UI/Reviews + +Reviews + + +cluster_UI/ShowDataLayer + +ShowDataLayer + + +cluster_UI/Wikipedia + +Wikipedia + + +cluster_UI/i18n + +i18n + + +cluster_assets + +assets + + +cluster_assets/generated + +generated + + +cluster_assets/layers + +layers + + +cluster_assets/layers/bike_repair_station + +bike_repair_station + + +cluster_assets/layers/cluster_style + +cluster_style + + +cluster_assets/layers/split_point + +split_point + + +cluster_assets/tagRenderings + +tagRenderings + + +cluster_assets/themes + +themes + + +cluster_assets/themes/personal + +personal + + +cluster_scripts + +scripts + + +cluster_test + +test + + + +AllTranslationAssets.ts + + +AllTranslationAssets.ts + + + + + +assets/generated/CompiledTranslations.ts + + +CompiledTranslations.ts + + + + + +AllTranslationAssets.ts->assets/generated/CompiledTranslations.ts + + + + + +UI/i18n/Translation.ts + + +Translation.ts + + + + + +assets/generated/CompiledTranslations.ts->UI/i18n/Translation.ts + + + + + +Customizations/AllKnownLayers.ts + + +AllKnownLayers.ts + + + + + +assets/generated/known_layers_and_themes.json + + +known_layers_and_themes.json + + + + + +Customizations/AllKnownLayers.ts->assets/generated/known_layers_and_themes.json + + + + + +Models/ThemeConfig/LayerConfig.ts + + +LayerConfig.ts + + + + + +Customizations/AllKnownLayers.ts->Models/ThemeConfig/LayerConfig.ts + + + + + + + +Models/ThemeConfig/WithContextLoader.ts + + +WithContextLoader.ts + + + + + +Customizations/AllKnownLayers.ts->Models/ThemeConfig/WithContextLoader.ts + + + + + + + +Utils.ts + + +Utils.ts + + + + + +Customizations/AllKnownLayers.ts->Utils.ts + + + + + +Customizations/SharedTagRenderings.ts + + +SharedTagRenderings.ts + + + + + +Customizations/AllKnownLayers.ts->Customizations/SharedTagRenderings.ts + + + + + + + +Models/ThemeConfig/LayerConfig.ts->Models/ThemeConfig/WithContextLoader.ts + + + + + + + +Models/ThemeConfig/LayerConfig.ts->Utils.ts + + + + + +UI/Base/Combine.ts + + +Combine.ts + + + + + +Models/ThemeConfig/LayerConfig.ts->UI/Base/Combine.ts + + + + + +UI/Base/List.ts + + +List.ts + + + + + +Models/ThemeConfig/LayerConfig.ts->UI/Base/List.ts + + + + + + + +UI/Base/Title.ts + + +Title.ts + + + + + +Models/ThemeConfig/LayerConfig.ts->UI/Base/Title.ts + + + + + +assets/tagRenderings/icons.json + + +icons.json + + + + + +Models/ThemeConfig/LayerConfig.ts->assets/tagRenderings/icons.json + + + + + +Models/ThemeConfig/TagRenderingConfig.ts + + +TagRenderingConfig.ts + + + + + +Models/ThemeConfig/LayerConfig.ts->Models/ThemeConfig/TagRenderingConfig.ts + + + + + + + +Logic/UIEventSource.ts + + +UIEventSource.ts + + + + + +Models/ThemeConfig/LayerConfig.ts->Logic/UIEventSource.ts + + + + + +UI/i18n/Translations.ts + + +Translations.ts + + + + + +Models/ThemeConfig/LayerConfig.ts->UI/i18n/Translations.ts + + + + + +Logic/ExtraFunctions.ts + + +ExtraFunctions.ts + + + + + +Models/ThemeConfig/LayerConfig.ts->Logic/ExtraFunctions.ts + + + + + +UI/Base/Link.ts + + +Link.ts + + + + + +Models/ThemeConfig/LayerConfig.ts->UI/Base/Link.ts + + + + + +Logic/Tags/TagUtils.ts + + +TagUtils.ts + + + + + +Models/ThemeConfig/LayerConfig.ts->Logic/Tags/TagUtils.ts + + + + + +Models/ThemeConfig/DeleteConfig.ts + + +DeleteConfig.ts + + + + + +Models/ThemeConfig/LayerConfig.ts->Models/ThemeConfig/DeleteConfig.ts + + + + + +Models/ThemeConfig/FilterConfig.ts + + +FilterConfig.ts + + + + + +Models/ThemeConfig/LayerConfig.ts->Models/ThemeConfig/FilterConfig.ts + + + + + +Models/Unit.ts + + +Unit.ts + + + + + +Models/ThemeConfig/LayerConfig.ts->Models/Unit.ts + + + + + +Models/ThemeConfig/LineRenderingConfig.ts + + +LineRenderingConfig.ts + + + + + +Models/ThemeConfig/LayerConfig.ts->Models/ThemeConfig/LineRenderingConfig.ts + + + + + + + +Models/ThemeConfig/MoveConfig.ts + + +MoveConfig.ts + + + + + +Models/ThemeConfig/LayerConfig.ts->Models/ThemeConfig/MoveConfig.ts + + + + + +Models/ThemeConfig/PointRenderingConfig.ts + + +PointRenderingConfig.ts + + + + + +Models/ThemeConfig/LayerConfig.ts->Models/ThemeConfig/PointRenderingConfig.ts + + + + + + + +Models/ThemeConfig/SourceConfig.ts + + +SourceConfig.ts + + + + + +Models/ThemeConfig/LayerConfig.ts->Models/ThemeConfig/SourceConfig.ts + + + + + +Models/ThemeConfig/WithContextLoader.ts->Utils.ts + + + + + +Models/ThemeConfig/WithContextLoader.ts->Customizations/SharedTagRenderings.ts + + + + + + + +Models/ThemeConfig/WithContextLoader.ts->Models/ThemeConfig/TagRenderingConfig.ts + + + + + + + +assets/colors.json + + +colors.json + + + + + +Utils.ts->assets/colors.json + + + + + +Customizations/SharedTagRenderings.ts->Utils.ts + + + + + +Customizations/SharedTagRenderings.ts->assets/tagRenderings/icons.json + + + + + +assets/tagRenderings/questions.json + + +questions.json + + + + + +Customizations/SharedTagRenderings.ts->assets/tagRenderings/questions.json + + + + + +Customizations/SharedTagRenderings.ts->Models/ThemeConfig/TagRenderingConfig.ts + + + + + + + +Customizations/AllKnownLayouts.ts + + +AllKnownLayouts.ts + + + + + +Customizations/AllKnownLayouts.ts->Customizations/AllKnownLayers.ts + + + + + +Customizations/AllKnownLayouts.ts->assets/generated/known_layers_and_themes.json + + + + + +Models/ThemeConfig/LayoutConfig.ts + + +LayoutConfig.ts + + + + + +Customizations/AllKnownLayouts.ts->Models/ThemeConfig/LayoutConfig.ts + + + + + +Customizations/AllKnownLayouts.ts->UI/Base/Combine.ts + + + + + +Customizations/AllKnownLayouts.ts->UI/Base/List.ts + + + + + + + +Customizations/AllKnownLayouts.ts->UI/Base/Title.ts + + + + + +Models/ThemeConfig/LayoutConfig.ts->Customizations/AllKnownLayers.ts + + + + + + + +Models/ThemeConfig/LayoutConfig.ts->Models/ThemeConfig/LayerConfig.ts + + + + + + + +Models/ThemeConfig/LayoutConfig.ts->Utils.ts + + + + + +Models/Constants.ts + + +Constants.ts + + + + + +Models/ThemeConfig/LayoutConfig.ts->Models/Constants.ts + + + + + +Models/ThemeConfig/LayoutConfig.ts->UI/i18n/Translation.ts + + + + + +Models/ThemeConfig/TilesourceConfig.ts + + +TilesourceConfig.ts + + + + + +Models/ThemeConfig/LayoutConfig.ts->Models/ThemeConfig/TilesourceConfig.ts + + + + + +UI/Base/Combine.ts->Utils.ts + + + + + +UI/Base/FixedUiElement.ts + + +FixedUiElement.ts + + + + + +UI/Base/Combine.ts->UI/Base/FixedUiElement.ts + + + + + +UI/BaseUIElement.ts + + +BaseUIElement.ts + + + + + +UI/Base/Combine.ts->UI/BaseUIElement.ts + + + + + +UI/Base/List.ts->Utils.ts + + + + + +UI/Base/List.ts->UI/i18n/Translations.ts + + + + + +UI/Base/List.ts->UI/BaseUIElement.ts + + + + + +UI/Base/Title.ts->UI/Base/FixedUiElement.ts + + + + + +UI/Base/Title.ts->UI/BaseUIElement.ts + + + + + +Models/ThemeConfig/TagRenderingConfig.ts->Utils.ts + + + + + +Models/ThemeConfig/TagRenderingConfig.ts->UI/i18n/Translations.ts + + + + + +Logic/Tags/And.ts + + +And.ts + + + + + +Models/ThemeConfig/TagRenderingConfig.ts->Logic/Tags/And.ts + + + + + +Models/ThemeConfig/TagRenderingConfig.ts->Logic/Tags/TagUtils.ts + + + + + +Models/ThemeConfig/TagRenderingConfig.ts->UI/i18n/Translation.ts + + + + + +UI/Input/ValidatedTextField.ts + + +ValidatedTextField.ts + + + + + +Models/ThemeConfig/TagRenderingConfig.ts->UI/Input/ValidatedTextField.ts + + + + + +UI/SubstitutedTranslation.ts + + +SubstitutedTranslation.ts + + + + + +Models/ThemeConfig/TagRenderingConfig.ts->UI/SubstitutedTranslation.ts + + + + + + + +Logic/Actors/AvailableBaseLayers.ts + + +AvailableBaseLayers.ts + + + + + +Logic/Actors/AvailableBaseLayers.ts->Logic/UIEventSource.ts + + + + + +Logic/UIEventSource.ts->Utils.ts + + + + + +Logic/Actors/ChangeToElementsActor.ts + + +ChangeToElementsActor.ts + + + + + +Logic/Actors/InstalledThemes.ts + + +InstalledThemes.ts + + + + + +Logic/Actors/InstalledThemes.ts->Utils.ts + + + + + +Logic/Actors/InstalledThemes.ts->Models/ThemeConfig/LayoutConfig.ts + + + + + + + +Logic/Actors/OverpassFeatureSource.ts + + +OverpassFeatureSource.ts + + + + + +Logic/Actors/OverpassFeatureSource.ts->Customizations/AllKnownLayers.ts + + + + + + + +Logic/Actors/OverpassFeatureSource.ts->Utils.ts + + + + + +Logic/Actors/OverpassFeatureSource.ts->Logic/UIEventSource.ts + + + + + +Logic/Osm/Overpass.ts + + +Overpass.ts + + + + + +Logic/Actors/OverpassFeatureSource.ts->Logic/Osm/Overpass.ts + + + + + +Logic/SimpleMetaTagger.ts + + +SimpleMetaTagger.ts + + + + + +Logic/Actors/OverpassFeatureSource.ts->Logic/SimpleMetaTagger.ts + + + + + + + +Logic/Tags/Or.ts + + +Or.ts + + + + + +Logic/Actors/OverpassFeatureSource.ts->Logic/Tags/Or.ts + + + + + +Logic/Osm/Overpass.ts->Utils.ts + + + + + +Logic/SimpleMetaTagger.ts->Utils.ts + + + + + +Logic/SimpleMetaTagger.ts->UI/Base/Combine.ts + + + + + + + +Logic/SimpleMetaTagger.ts->UI/Base/Title.ts + + + + + + + +Logic/GeoOperations.ts + + +GeoOperations.ts + + + + + +Logic/SimpleMetaTagger.ts->Logic/GeoOperations.ts + + + + + +State.ts + + +State.ts + + + + + +Logic/SimpleMetaTagger.ts->State.ts + + + + + + + +Logic/SimpleMetaTagger.ts->UI/Base/FixedUiElement.ts + + + + + +Logic/Tags/TagsFilter.ts + + +TagsFilter.ts + + + + + +Logic/Tags/Or.ts->Logic/Tags/TagsFilter.ts + + + + + +Logic/Actors/PendingChangesUploader.ts + + +PendingChangesUploader.ts + + + + + +Logic/Actors/PendingChangesUploader.ts->Utils.ts + + + + + +Logic/Actors/PendingChangesUploader.ts->Models/Constants.ts + + + + + + + +Models/Constants.ts->Utils.ts + + + + + +Logic/Actors/SelectedElementTagsUpdater.ts + + +SelectedElementTagsUpdater.ts + + + + + +Logic/Actors/SelectedElementTagsUpdater.ts->Logic/SimpleMetaTagger.ts + + + + + + + +Logic/Osm/OsmObject.ts + + +OsmObject.ts + + + + + +Logic/Actors/SelectedElementTagsUpdater.ts->Logic/Osm/OsmObject.ts + + + + + +Logic/Osm/OsmObject.ts->Utils.ts + + + + + +Logic/Osm/OsmObject.ts->Logic/UIEventSource.ts + + + + + +assets/polygon-features.json + + +polygon-features.json + + + + + +Logic/Osm/OsmObject.ts->assets/polygon-features.json + + + + + +Logic/Actors/SelectedFeatureHandler.ts + + +SelectedFeatureHandler.ts + + + + + +Logic/Actors/SelectedFeatureHandler.ts->Logic/Osm/OsmObject.ts + + + + + +Logic/Actors/SelectedFeatureHandler.ts->Logic/GeoOperations.ts + + + + + +Logic/GeoOperations.ts->Models/Constants.ts + + + + + +Logic/BBox.ts + + +BBox.ts + + + + + +Logic/GeoOperations.ts->Logic/BBox.ts + + + + + + + +Logic/Actors/TitleHandler.ts + + +TitleHandler.ts + + + + + +Logic/Actors/TitleHandler.ts->Utils.ts + + + + + +Logic/Actors/TitleHandler.ts->UI/Base/Combine.ts + + + + + +Logic/Actors/TitleHandler.ts->Logic/UIEventSource.ts + + + + + +UI/i18n/Locale.ts + + +Locale.ts + + + + + +Logic/Actors/TitleHandler.ts->UI/i18n/Locale.ts + + + + + +Logic/Actors/TitleHandler.ts->UI/i18n/Translations.ts + + + + + +UI/Popup/TagRenderingAnswer.ts + + +TagRenderingAnswer.ts + + + + + +Logic/Actors/TitleHandler.ts->UI/Popup/TagRenderingAnswer.ts + + + + + + + +UI/i18n/Locale.ts->Utils.ts + + + + + +Logic/Web/LocalStorageSource.ts + + +LocalStorageSource.ts + + + + + +UI/i18n/Locale.ts->Logic/Web/LocalStorageSource.ts + + + + + +Logic/Web/QueryParameters.ts + + +QueryParameters.ts + + + + + +UI/i18n/Locale.ts->Logic/Web/QueryParameters.ts + + + + + +UI/i18n/Translations.ts->AllTranslationAssets.ts + + + + + +UI/i18n/Translations.ts->UI/Base/FixedUiElement.ts + + + + + +UI/i18n/Translations.ts->UI/i18n/Translation.ts + + + + + +UI/Popup/TagRenderingAnswer.ts->Utils.ts + + + + + +UI/Popup/TagRenderingAnswer.ts->UI/Base/List.ts + + + + + +UI/Base/VariableUIElement.ts + + +VariableUIElement.ts + + + + + +UI/Popup/TagRenderingAnswer.ts->UI/Base/VariableUIElement.ts + + + + + +UI/Popup/TagRenderingAnswer.ts->UI/SubstitutedTranslation.ts + + + + + + + +Logic/BBox.ts->Logic/GeoOperations.ts + + + + + + + +Models/TileRange.ts + + +TileRange.ts + + + + + +Logic/BBox.ts->Models/TileRange.ts + + + + + +Logic/ElementStorage.ts + + +ElementStorage.ts + + + + + +Logic/ElementStorage.ts->Logic/UIEventSource.ts + + + + + +Logic/ExtraFunctions.ts->UI/Base/Combine.ts + + + + + +Logic/ExtraFunctions.ts->UI/Base/List.ts + + + + + + + +Logic/ExtraFunctions.ts->UI/Base/Title.ts + + + + + +Logic/ExtraFunctions.ts->Logic/GeoOperations.ts + + + + + +Logic/ExtraFunctions.ts->Logic/BBox.ts + + + + + +Logic/FeatureSource/Actors/RegisteringAllFromFeatureSourceActor.ts + + +RegisteringAllFromFeatureSourceActor.ts + + + + + +Logic/FeatureSource/Actors/RegisteringAllFromFeatureSourceActor.ts->State.ts + + + + + + + +Logic/State/FeaturePipelineState.ts + + +FeaturePipelineState.ts + + + + + +State.ts->Logic/State/FeaturePipelineState.ts + + + + + + + +Logic/FeatureSource/Actors/SaveTileToLocalStorageActor.ts + + +SaveTileToLocalStorageActor.ts + + + + + +Logic/FeatureSource/Actors/SaveTileToLocalStorageActor.ts->Logic/UIEventSource.ts + + + + + +Logic/FeatureSource/Actors/SaveTileToLocalStorageActor.ts->Logic/BBox.ts + + + + + +Logic/FeatureSource/Actors/SaveTileToLocalStorageActor.ts->Models/TileRange.ts + + + + + + + +Logic/Web/IdbLocalStorage.ts + + +IdbLocalStorage.ts + + + + + +Logic/FeatureSource/Actors/SaveTileToLocalStorageActor.ts->Logic/Web/IdbLocalStorage.ts + + + + + +Logic/FeatureSource/Sources/SimpleFeatureSource.ts + + +SimpleFeatureSource.ts + + + + + +Logic/FeatureSource/Actors/SaveTileToLocalStorageActor.ts->Logic/FeatureSource/Sources/SimpleFeatureSource.ts + + + + + +Logic/Web/IdbLocalStorage.ts->Logic/UIEventSource.ts + + + + + +Logic/FeatureSource/Sources/SimpleFeatureSource.ts->Logic/UIEventSource.ts + + + + + +Logic/FeatureSource/Sources/SimpleFeatureSource.ts->Logic/BBox.ts + + + + + +Logic/FeatureSource/FeaturePipeline.ts + + +FeaturePipeline.ts + + + + + +Logic/FeatureSource/FeaturePipeline.ts->Logic/UIEventSource.ts + + + + + +Logic/FeatureSource/FeaturePipeline.ts->Logic/Actors/OverpassFeatureSource.ts + + + + + + + +Logic/FeatureSource/FeaturePipeline.ts->Models/TileRange.ts + + + + + +Logic/FeatureSource/FeaturePipeline.ts->Logic/FeatureSource/Actors/RegisteringAllFromFeatureSourceActor.ts + + + + + + + +Logic/FeatureSource/FeaturePipeline.ts->Logic/FeatureSource/Actors/SaveTileToLocalStorageActor.ts + + + + + +Logic/MetaTagging.ts + + +MetaTagging.ts + + + + + +Logic/FeatureSource/FeaturePipeline.ts->Logic/MetaTagging.ts + + + + + + + +Logic/Osm/RelationsTracker.ts + + +RelationsTracker.ts + + + + + +Logic/FeatureSource/FeaturePipeline.ts->Logic/Osm/RelationsTracker.ts + + + + + +Logic/FeatureSource/PerLayerFeatureSourceSplitter.ts + + +PerLayerFeatureSourceSplitter.ts + + + + + +Logic/FeatureSource/FeaturePipeline.ts->Logic/FeatureSource/PerLayerFeatureSourceSplitter.ts + + + + + +Logic/FeatureSource/Sources/ChangeGeometryApplicator.ts + + +ChangeGeometryApplicator.ts + + + + + +Logic/FeatureSource/FeaturePipeline.ts->Logic/FeatureSource/Sources/ChangeGeometryApplicator.ts + + + + + +Logic/FeatureSource/Sources/FilteringFeatureSource.ts + + +FilteringFeatureSource.ts + + + + + +Logic/FeatureSource/FeaturePipeline.ts->Logic/FeatureSource/Sources/FilteringFeatureSource.ts + + + + + +Logic/FeatureSource/Sources/GeoJsonSource.ts + + +GeoJsonSource.ts + + + + + +Logic/FeatureSource/FeaturePipeline.ts->Logic/FeatureSource/Sources/GeoJsonSource.ts + + + + + +Logic/FeatureSource/Sources/NewGeometryFromChangesFeatureSource.ts + + +NewGeometryFromChangesFeatureSource.ts + + + + + +Logic/FeatureSource/FeaturePipeline.ts->Logic/FeatureSource/Sources/NewGeometryFromChangesFeatureSource.ts + + + + + + + +Logic/FeatureSource/Sources/RememberingSource.ts + + +RememberingSource.ts + + + + + +Logic/FeatureSource/FeaturePipeline.ts->Logic/FeatureSource/Sources/RememberingSource.ts + + + + + +Logic/FeatureSource/TiledFeatureSource/DynamicGeoJsonTileSource.ts + + +DynamicGeoJsonTileSource.ts + + + + + +Logic/FeatureSource/FeaturePipeline.ts->Logic/FeatureSource/TiledFeatureSource/DynamicGeoJsonTileSource.ts + + + + + +Logic/FeatureSource/TiledFeatureSource/FullNodeDatabaseSource.ts + + +FullNodeDatabaseSource.ts + + + + + +Logic/FeatureSource/FeaturePipeline.ts->Logic/FeatureSource/TiledFeatureSource/FullNodeDatabaseSource.ts + + + + + +Logic/FeatureSource/TiledFeatureSource/OsmFeatureSource.ts + + +OsmFeatureSource.ts + + + + + +Logic/FeatureSource/FeaturePipeline.ts->Logic/FeatureSource/TiledFeatureSource/OsmFeatureSource.ts + + + + + +Logic/FeatureSource/TiledFeatureSource/TiledFeatureSource.ts + + +TiledFeatureSource.ts + + + + + +Logic/FeatureSource/FeaturePipeline.ts->Logic/FeatureSource/TiledFeatureSource/TiledFeatureSource.ts + + + + + +Logic/FeatureSource/TiledFeatureSource/TileHierarchy.ts + + +TileHierarchy.ts + + + + + +Logic/FeatureSource/FeaturePipeline.ts->Logic/FeatureSource/TiledFeatureSource/TileHierarchy.ts + + + + + +Logic/FeatureSource/TiledFeatureSource/TileHierarchyMerger.ts + + +TileHierarchyMerger.ts + + + + + +Logic/FeatureSource/FeaturePipeline.ts->Logic/FeatureSource/TiledFeatureSource/TileHierarchyMerger.ts + + + + + +Logic/FeatureSource/TileFreshnessCalculator.ts + + +TileFreshnessCalculator.ts + + + + + +Logic/FeatureSource/FeaturePipeline.ts->Logic/FeatureSource/TileFreshnessCalculator.ts + + + + + +Logic/MetaTagging.ts->Logic/SimpleMetaTagger.ts + + + + + + + +Logic/MetaTagging.ts->Logic/ExtraFunctions.ts + + + + + +Logic/MetaTagging.ts->State.ts + + + + + + + +Logic/Osm/RelationsTracker.ts->Logic/UIEventSource.ts + + + + + +Logic/FeatureSource/PerLayerFeatureSourceSplitter.ts->Logic/FeatureSource/Sources/SimpleFeatureSource.ts + + + + + +Logic/FeatureSource/Sources/ChangeGeometryApplicator.ts->Logic/UIEventSource.ts + + + + + +Logic/Osm/Actions/ChangeDescription.ts + + +ChangeDescription.ts + + + + + +Logic/FeatureSource/Sources/ChangeGeometryApplicator.ts->Logic/Osm/Actions/ChangeDescription.ts + + + + + +Logic/FeatureSource/Sources/FilteringFeatureSource.ts->Logic/UIEventSource.ts + + + + + +Logic/FeatureSource/Sources/FilteringFeatureSource.ts->Logic/BBox.ts + + + + + +Logic/Web/Hash.ts + + +Hash.ts + + + + + +Logic/FeatureSource/Sources/FilteringFeatureSource.ts->Logic/Web/Hash.ts + + + + + +Logic/FeatureSource/Sources/GeoJsonSource.ts->Utils.ts + + + + + +Logic/FeatureSource/Sources/GeoJsonSource.ts->Logic/UIEventSource.ts + + + + + +Logic/FeatureSource/Sources/GeoJsonSource.ts->Logic/GeoOperations.ts + + + + + +Logic/FeatureSource/Sources/GeoJsonSource.ts->Logic/BBox.ts + + + + + +Logic/FeatureSource/Sources/GeoJsonSource.ts->Models/TileRange.ts + + + + + +Logic/FeatureSource/Sources/NewGeometryFromChangesFeatureSource.ts->Logic/UIEventSource.ts + + + + + +Logic/FeatureSource/Sources/NewGeometryFromChangesFeatureSource.ts->Logic/Osm/OsmObject.ts + + + + + +Logic/FeatureSource/Sources/NewGeometryFromChangesFeatureSource.ts->State.ts + + + + + + + +Logic/FeatureSource/TiledFeatureSource/DynamicGeoJsonTileSource.ts->Utils.ts + + + + + +Logic/FeatureSource/TiledFeatureSource/DynamicGeoJsonTileSource.ts->Logic/UIEventSource.ts + + + + + +Logic/FeatureSource/TiledFeatureSource/DynamicGeoJsonTileSource.ts->Logic/FeatureSource/Sources/GeoJsonSource.ts + + + + + +Logic/FeatureSource/TiledFeatureSource/DynamicTileSource.ts + + +DynamicTileSource.ts + + + + + +Logic/FeatureSource/TiledFeatureSource/DynamicGeoJsonTileSource.ts->Logic/FeatureSource/TiledFeatureSource/DynamicTileSource.ts + + + + + +Logic/FeatureSource/TiledFeatureSource/FullNodeDatabaseSource.ts->Logic/Osm/OsmObject.ts + + + + + +Logic/FeatureSource/TiledFeatureSource/FullNodeDatabaseSource.ts->Logic/FeatureSource/Sources/SimpleFeatureSource.ts + + + + + +Logic/FeatureSource/TiledFeatureSource/OsmFeatureSource.ts->Utils.ts + + + + + +Logic/FeatureSource/TiledFeatureSource/OsmFeatureSource.ts->Logic/UIEventSource.ts + + + + + +Logic/FeatureSource/TiledFeatureSource/OsmFeatureSource.ts->Logic/Tags/Or.ts + + + + + +Logic/FeatureSource/TiledFeatureSource/OsmFeatureSource.ts->Logic/BBox.ts + + + + + +Logic/FeatureSource/TiledFeatureSource/OsmFeatureSource.ts->Models/TileRange.ts + + + + + + + +Logic/FeatureSource/TiledFeatureSource/OsmFeatureSource.ts->Logic/FeatureSource/PerLayerFeatureSourceSplitter.ts + + + + + +Logic/FeatureSource/Sources/StaticFeatureSource.ts + + +StaticFeatureSource.ts + + + + + +Logic/FeatureSource/TiledFeatureSource/OsmFeatureSource.ts->Logic/FeatureSource/Sources/StaticFeatureSource.ts + + + + + +Logic/FeatureSource/TiledFeatureSource/TiledFeatureSource.ts->Logic/UIEventSource.ts + + + + + +Logic/FeatureSource/TiledFeatureSource/TiledFeatureSource.ts->Logic/BBox.ts + + + + + +Logic/FeatureSource/TiledFeatureSource/TiledFeatureSource.ts->Models/TileRange.ts + + + + + + + +Logic/FeatureSource/TiledFeatureSource/TileHierarchyMerger.ts->Logic/UIEventSource.ts + + + + + +Logic/FeatureSource/TiledFeatureSource/TileHierarchyMerger.ts->Logic/BBox.ts + + + + + +Logic/FeatureSource/TiledFeatureSource/TileHierarchyMerger.ts->Models/TileRange.ts + + + + + + + +Logic/FeatureSource/Sources/FeatureSourceMerger.ts + + +FeatureSourceMerger.ts + + + + + +Logic/FeatureSource/TiledFeatureSource/TileHierarchyMerger.ts->Logic/FeatureSource/Sources/FeatureSourceMerger.ts + + + + + +Logic/FeatureSource/TileFreshnessCalculator.ts->Models/TileRange.ts + + + + + + + +Logic/Osm/Actions/ChangeDescription.ts->Logic/Osm/OsmObject.ts + + + + + +Logic/FeatureSource/Sources/FeatureSourceMerger.ts->Logic/UIEventSource.ts + + + + + +Logic/FeatureSource/Sources/FeatureSourceMerger.ts->Models/TileRange.ts + + + + + +Logic/Web/Hash.ts->Utils.ts + + + + + +Logic/Web/Hash.ts->Logic/UIEventSource.ts + + + + + +Logic/FeatureSource/Sources/RenderingMultiPlexerFeatureSource.ts + + +RenderingMultiPlexerFeatureSource.ts + + + + + +Logic/FeatureSource/Sources/RenderingMultiPlexerFeatureSource.ts->Logic/GeoOperations.ts + + + + + +Logic/FeatureSource/Sources/StaticFeatureSource.ts->Logic/UIEventSource.ts + + + + + +Logic/FeatureSource/TiledFeatureSource/DynamicTileSource.ts->Models/TileRange.ts + + + + + +Logic/ImageProviders/AllImageProviders.ts + + +AllImageProviders.ts + + + + + +Logic/ImageProviders/AllImageProviders.ts->Logic/UIEventSource.ts + + + + + +Logic/ImageProviders/GenericImageProvider.ts + + +GenericImageProvider.ts + + + + + +Logic/ImageProviders/AllImageProviders.ts->Logic/ImageProviders/GenericImageProvider.ts + + + + + +Logic/ImageProviders/Imgur.ts + + +Imgur.ts + + + + + +Logic/ImageProviders/AllImageProviders.ts->Logic/ImageProviders/Imgur.ts + + + + + +Logic/ImageProviders/Mapillary.ts + + +Mapillary.ts + + + + + +Logic/ImageProviders/AllImageProviders.ts->Logic/ImageProviders/Mapillary.ts + + + + + +Logic/ImageProviders/WikidataImageProvider.ts + + +WikidataImageProvider.ts + + + + + +Logic/ImageProviders/AllImageProviders.ts->Logic/ImageProviders/WikidataImageProvider.ts + + + + + +Logic/ImageProviders/WikimediaImageProvider.ts + + +WikimediaImageProvider.ts + + + + + +Logic/ImageProviders/AllImageProviders.ts->Logic/ImageProviders/WikimediaImageProvider.ts + + + + + +Logic/ImageProviders/ImageProvider.ts + + +ImageProvider.ts + + + + + +Logic/ImageProviders/GenericImageProvider.ts->Logic/ImageProviders/ImageProvider.ts + + + + + +Logic/ImageProviders/Imgur.ts->Utils.ts + + + + + +Logic/ImageProviders/Imgur.ts->Models/Constants.ts + + + + + + + +Logic/ImageProviders/Imgur.ts->Logic/ImageProviders/ImageProvider.ts + + + + + +Logic/ImageProviders/LicenseInfo.ts + + +LicenseInfo.ts + + + + + +Logic/ImageProviders/Imgur.ts->Logic/ImageProviders/LicenseInfo.ts + + + + + +Logic/ImageProviders/Mapillary.ts->Utils.ts + + + + + +Logic/ImageProviders/Mapillary.ts->Models/Constants.ts + + + + + + + +Logic/ImageProviders/Mapillary.ts->Logic/ImageProviders/ImageProvider.ts + + + + + +Logic/ImageProviders/Mapillary.ts->Logic/ImageProviders/LicenseInfo.ts + + + + + +Svg.ts + + +Svg.ts + + + + + +Logic/ImageProviders/Mapillary.ts->Svg.ts + + + + + +Logic/ImageProviders/WikidataImageProvider.ts->Logic/ImageProviders/WikimediaImageProvider.ts + + + + + +Logic/ImageProviders/WikidataImageProvider.ts->Logic/ImageProviders/ImageProvider.ts + + + + + +Logic/ImageProviders/WikidataImageProvider.ts->Svg.ts + + + + + +Logic/Web/Wikidata.ts + + +Wikidata.ts + + + + + +Logic/ImageProviders/WikidataImageProvider.ts->Logic/Web/Wikidata.ts + + + + + +Logic/ImageProviders/WikimediaImageProvider.ts->Utils.ts + + + + + +Logic/ImageProviders/WikimediaImageProvider.ts->Logic/ImageProviders/ImageProvider.ts + + + + + +Logic/ImageProviders/WikimediaImageProvider.ts->Logic/ImageProviders/LicenseInfo.ts + + + + + +Logic/ImageProviders/WikimediaImageProvider.ts->Svg.ts + + + + + +Logic/ImageProviders/WikimediaImageProvider.ts->UI/Base/Link.ts + + + + + +Logic/Web/Wikimedia.ts + + +Wikimedia.ts + + + + + +Logic/ImageProviders/WikimediaImageProvider.ts->Logic/Web/Wikimedia.ts + + + + + +Logic/ImageProviders/ImageProvider.ts->Utils.ts + + + + + +Logic/ImageProviders/ImageProvider.ts->Logic/UIEventSource.ts + + + + + +Logic/ImageProviders/ImgurUploader.ts + + +ImgurUploader.ts + + + + + +Logic/ImageProviders/ImgurUploader.ts->Logic/UIEventSource.ts + + + + + +Logic/ImageProviders/ImgurUploader.ts->Logic/ImageProviders/Imgur.ts + + + + + +UI/Base/Img.ts + + +Img.ts + + + + + +Svg.ts->UI/Base/Img.ts + + + + + +Svg.ts->UI/Base/FixedUiElement.ts + + + + + +Logic/Web/Wikidata.ts->Utils.ts + + + + + +Logic/Web/Wikidata.ts->Logic/UIEventSource.ts + + + + + +UI/Base/Link.ts->UI/i18n/Translations.ts + + + + + + + +UI/Base/Link.ts->UI/BaseUIElement.ts + + + + + +Logic/Web/Wikimedia.ts->Utils.ts + + + + + +Logic/Osm/Actions/ChangeLocationAction.ts + + +ChangeLocationAction.ts + + + + + +Logic/Osm/Actions/OsmChangeAction.ts + + +OsmChangeAction.ts + + + + + +Logic/Osm/Actions/ChangeLocationAction.ts->Logic/Osm/Actions/OsmChangeAction.ts + + + + + +Logic/Osm/Actions/ChangeTagAction.ts + + +ChangeTagAction.ts + + + + + +Logic/Osm/Actions/ChangeTagAction.ts->Logic/Osm/Actions/OsmChangeAction.ts + + + + + +Logic/Osm/Actions/CreateNewNodeAction.ts + + +CreateNewNodeAction.ts + + + + + +Logic/Osm/Actions/CreateNewNodeAction.ts->Logic/GeoOperations.ts + + + + + +Logic/Osm/Actions/CreateNewNodeAction.ts->Logic/Osm/Actions/OsmChangeAction.ts + + + + + +Logic/Osm/Actions/CreateNewNodeAction.ts->Logic/Tags/And.ts + + + + + +Logic/Tags/And.ts->Logic/Tags/TagsFilter.ts + + + + + +Logic/Osm/Actions/CreateNewWayAction.ts + + +CreateNewWayAction.ts + + + + + +Logic/Osm/Actions/CreateNewWayAction.ts->Logic/Osm/Actions/OsmChangeAction.ts + + + + + +Logic/Osm/Actions/CreateNewWayAction.ts->Logic/Osm/Actions/CreateNewNodeAction.ts + + + + + +Logic/Osm/Actions/CreateNewWayAction.ts->Logic/Tags/And.ts + + + + + +Logic/Osm/Actions/CreateWayWithPointReuseAction.ts + + +CreateWayWithPointReuseAction.ts + + + + + +Logic/Osm/Actions/CreateWayWithPointReuseAction.ts->Logic/GeoOperations.ts + + + + + +Logic/Osm/Actions/CreateWayWithPointReuseAction.ts->Logic/BBox.ts + + + + + +Logic/Osm/Actions/CreateWayWithPointReuseAction.ts->Logic/FeatureSource/Sources/StaticFeatureSource.ts + + + + + +Logic/Osm/Actions/CreateWayWithPointReuseAction.ts->Logic/Osm/Actions/OsmChangeAction.ts + + + + + +Logic/Osm/Actions/CreateWayWithPointReuseAction.ts->Logic/Osm/Actions/CreateNewNodeAction.ts + + + + + +Logic/Osm/Actions/CreateWayWithPointReuseAction.ts->Logic/Osm/Actions/CreateNewWayAction.ts + + + + + +Logic/Osm/Actions/DeleteAction.ts + + +DeleteAction.ts + + + + + +Logic/Osm/Actions/DeleteAction.ts->Logic/Osm/OsmObject.ts + + + + + +Logic/Osm/Actions/DeleteAction.ts->State.ts + + + + + + + +Logic/Osm/Actions/DeleteAction.ts->Logic/Osm/Actions/OsmChangeAction.ts + + + + + +Logic/Osm/Actions/DeleteAction.ts->Logic/Osm/Actions/ChangeTagAction.ts + + + + + +Logic/Osm/Actions/DeleteAction.ts->Logic/Tags/And.ts + + + + + +Logic/Tags/Tag.ts + + +Tag.ts + + + + + +Logic/Osm/Actions/DeleteAction.ts->Logic/Tags/Tag.ts + + + + + +Logic/Tags/Tag.ts->Utils.ts + + + + + +Logic/Tags/Tag.ts->Logic/Tags/TagsFilter.ts + + + + + +Logic/Tags/RegexTag.ts + + +RegexTag.ts + + + + + +Logic/Tags/Tag.ts->Logic/Tags/RegexTag.ts + + + + + + + +Logic/Osm/Actions/RelationSplitHandler.ts + + +RelationSplitHandler.ts + + + + + +Logic/Osm/Actions/RelationSplitHandler.ts->Logic/Osm/OsmObject.ts + + + + + +Logic/Osm/Actions/RelationSplitHandler.ts->Logic/Osm/Actions/OsmChangeAction.ts + + + + + +Logic/Osm/Actions/ReplaceGeometryAction.ts + + +ReplaceGeometryAction.ts + + + + + +Logic/Osm/Actions/ReplaceGeometryAction.ts->Utils.ts + + + + + +Logic/Osm/Actions/ReplaceGeometryAction.ts->Logic/Osm/OsmObject.ts + + + + + +Logic/Osm/Actions/ReplaceGeometryAction.ts->Logic/GeoOperations.ts + + + + + +Logic/Osm/Actions/ReplaceGeometryAction.ts->Logic/FeatureSource/Sources/StaticFeatureSource.ts + + + + + +Logic/Osm/Actions/ReplaceGeometryAction.ts->Logic/Osm/Actions/OsmChangeAction.ts + + + + + +Logic/Osm/Actions/ReplaceGeometryAction.ts->Logic/Osm/Actions/ChangeTagAction.ts + + + + + +Logic/Osm/Actions/ReplaceGeometryAction.ts->Logic/Osm/Actions/CreateNewNodeAction.ts + + + + + +Logic/Osm/Actions/ReplaceGeometryAction.ts->Logic/Tags/And.ts + + + + + +Logic/Osm/Actions/SplitAction.ts + + +SplitAction.ts + + + + + +Logic/Osm/Actions/SplitAction.ts->Logic/Osm/OsmObject.ts + + + + + +Logic/Osm/Actions/SplitAction.ts->Logic/GeoOperations.ts + + + + + +Logic/Osm/Actions/SplitAction.ts->Logic/Osm/Actions/OsmChangeAction.ts + + + + + +Logic/Osm/Actions/SplitAction.ts->Logic/Osm/Actions/RelationSplitHandler.ts + + + + + +Logic/Osm/Changes.ts + + +Changes.ts + + + + + +Logic/Osm/Changes.ts->Utils.ts + + + + + +Logic/Osm/Changes.ts->Logic/UIEventSource.ts + + + + + +Logic/Osm/Changes.ts->Logic/SimpleMetaTagger.ts + + + + + + + +Logic/Osm/Changes.ts->Models/Constants.ts + + + + + + + +Logic/Osm/Changes.ts->Logic/Osm/OsmObject.ts + + + + + +Logic/Osm/Changes.ts->Logic/GeoOperations.ts + + + + + +Logic/Osm/Changes.ts->State.ts + + + + + + + +Logic/Osm/Changes.ts->Logic/Osm/Actions/CreateNewNodeAction.ts + + + + + +Logic/Osm/Changes.ts->Logic/Web/LocalStorageSource.ts + + + + + +Logic/Web/LocalStorageSource.ts->Logic/UIEventSource.ts + + + + + +Logic/Osm/ChangesetHandler.ts + + +ChangesetHandler.ts + + + + + +Logic/Osm/ChangesetHandler.ts->Utils.ts + + + + + +Logic/Osm/ChangesetHandler.ts->Models/Constants.ts + + + + + +Logic/Osm/ChangesetHandler.ts->UI/i18n/Locale.ts + + + + + +Logic/Osm/ChangesetHandler.ts->State.ts + + + + + + + +Logic/Osm/OsmConnection.ts + + +OsmConnection.ts + + + + + +Logic/Osm/OsmConnection.ts->Utils.ts + + + + + +Logic/Osm/OsmConnection.ts->Logic/UIEventSource.ts + + + + + +Logic/Osm/OsmConnection.ts->Logic/Osm/OsmObject.ts + + + + + +Logic/Osm/OsmConnection.ts->Svg.ts + + + + + +Logic/Osm/OsmConnection.ts->Logic/Osm/ChangesetHandler.ts + + + + + + + +Logic/Osm/OsmConnection.ts->UI/Base/Img.ts + + + + + + + +Logic/Osm/OsmPreferences.ts + + +OsmPreferences.ts + + + + + +Logic/Osm/OsmConnection.ts->Logic/Osm/OsmPreferences.ts + + + + + +UI/Base/Img.ts->Utils.ts + + + + + +UI/Base/Img.ts->UI/BaseUIElement.ts + + + + + +Logic/Osm/OsmPreferences.ts->Utils.ts + + + + + +Logic/Osm/OsmPreferences.ts->Logic/UIEventSource.ts + + + + + +UI/Base/FixedUiElement.ts->UI/BaseUIElement.ts + + + + + +Logic/State/ElementsState.ts + + +ElementsState.ts + + + + + +Logic/State/ElementsState.ts->Utils.ts + + + + + +Logic/State/ElementsState.ts->Logic/UIEventSource.ts + + + + + +Logic/State/ElementsState.ts->Logic/Actors/ChangeToElementsActor.ts + + + + + +Logic/State/ElementsState.ts->Logic/Actors/PendingChangesUploader.ts + + + + + +Logic/State/ElementsState.ts->Logic/Actors/TitleHandler.ts + + + + + + + +Logic/State/ElementsState.ts->Logic/ElementStorage.ts + + + + + +Logic/State/ElementsState.ts->Logic/Osm/Changes.ts + + + + + + + +Logic/State/ElementsState.ts->Logic/Web/LocalStorageSource.ts + + + + + +Logic/State/ElementsState.ts->Logic/Web/QueryParameters.ts + + + + + +Logic/State/FeatureSwitchState.ts + + +FeatureSwitchState.ts + + + + + +Logic/State/ElementsState.ts->Logic/State/FeatureSwitchState.ts + + + + + +Logic/Web/QueryParameters.ts->Utils.ts + + + + + +Logic/Web/QueryParameters.ts->Logic/UIEventSource.ts + + + + + +Logic/Web/QueryParameters.ts->Logic/Web/Hash.ts + + + + + +Logic/State/FeatureSwitchState.ts->Utils.ts + + + + + +Logic/State/FeatureSwitchState.ts->Logic/UIEventSource.ts + + + + + +Logic/State/FeatureSwitchState.ts->Models/Constants.ts + + + + + + + +Logic/State/FeatureSwitchState.ts->Logic/Web/QueryParameters.ts + + + + + +Logic/State/FeaturePipelineState.ts->Logic/Actors/SelectedFeatureHandler.ts + + + + + +Logic/State/FeaturePipelineState.ts->Models/TileRange.ts + + + + + +Logic/State/FeaturePipelineState.ts->Logic/FeatureSource/FeaturePipeline.ts + + + + + + + +Logic/State/FeaturePipelineState.ts->Logic/Web/Hash.ts + + + + + +UI/ShowDataLayer/ShowDataLayer.ts + + +ShowDataLayer.ts + + + + + +Logic/State/FeaturePipelineState.ts->UI/ShowDataLayer/ShowDataLayer.ts + + + + + + + +UI/ShowDataLayer/ShowTileInfo.ts + + +ShowTileInfo.ts + + + + + +Logic/State/FeaturePipelineState.ts->UI/ShowDataLayer/ShowTileInfo.ts + + + + + + + +UI/ShowDataLayer/TileHierarchyAggregator.ts + + +TileHierarchyAggregator.ts + + + + + +Logic/State/FeaturePipelineState.ts->UI/ShowDataLayer/TileHierarchyAggregator.ts + + + + + +Logic/State/MapState.ts + + +MapState.ts + + + + + +Logic/State/FeaturePipelineState.ts->Logic/State/MapState.ts + + + + + + + +UI/ShowDataLayer/ShowDataLayer.ts->Logic/UIEventSource.ts + + + + + +UI/ShowDataLayer/ShowDataLayer.ts->Logic/FeatureSource/Sources/RenderingMultiPlexerFeatureSource.ts + + + + + +UI/Popup/FeatureInfoBox.ts + + +FeatureInfoBox.ts + + + + + +UI/ShowDataLayer/ShowDataLayer.ts->UI/Popup/FeatureInfoBox.ts + + + + + + + +UI/ShowDataLayer/ShowTileInfo.ts->Models/ThemeConfig/LayerConfig.ts + + + + + + + +UI/ShowDataLayer/ShowTileInfo.ts->Logic/GeoOperations.ts + + + + + +UI/ShowDataLayer/ShowTileInfo.ts->Models/TileRange.ts + + + + + +UI/ShowDataLayer/ShowTileInfo.ts->Logic/FeatureSource/Sources/StaticFeatureSource.ts + + + + + +UI/ShowDataLayer/ShowTileInfo.ts->UI/ShowDataLayer/ShowDataLayer.ts + + + + + + + +assets/layers/cluster_style/cluster_style.json + + +cluster_style.json + + + + + +UI/ShowDataLayer/ShowTileInfo.ts->assets/layers/cluster_style/cluster_style.json + + + + + +UI/ShowDataLayer/TileHierarchyAggregator.ts->Logic/UIEventSource.ts + + + + + +UI/ShowDataLayer/TileHierarchyAggregator.ts->Logic/BBox.ts + + + + + +UI/ShowDataLayer/TileHierarchyAggregator.ts->Models/TileRange.ts + + + + + +UI/ShowDataLayer/TileHierarchyAggregator.ts->Logic/FeatureSource/Sources/StaticFeatureSource.ts + + + + + +Logic/State/MapState.ts->Logic/Actors/AvailableBaseLayers.ts + + + + + +Logic/State/MapState.ts->Logic/UIEventSource.ts + + + + + +Logic/State/MapState.ts->Logic/GeoOperations.ts + + + + + +Logic/State/MapState.ts->Models/TileRange.ts + + + + + +Logic/State/MapState.ts->Logic/FeatureSource/Sources/SimpleFeatureSource.ts + + + + + +Logic/State/MapState.ts->Logic/Web/LocalStorageSource.ts + + + + + +Logic/State/MapState.ts->Logic/Web/QueryParameters.ts + + + + + +assets/themes/personal/personal.json + + +personal.json + + + + + +Logic/State/MapState.ts->assets/themes/personal/personal.json + + + + + +UI/Base/Minimap.ts + + +Minimap.ts + + + + + +Logic/State/MapState.ts->UI/Base/Minimap.ts + + + + + +UI/BigComponents/Attribution.ts + + +Attribution.ts + + + + + +Logic/State/MapState.ts->UI/BigComponents/Attribution.ts + + + + + +UI/ShowDataLayer/ShowOverlayLayer.ts + + +ShowOverlayLayer.ts + + + + + +Logic/State/MapState.ts->UI/ShowDataLayer/ShowOverlayLayer.ts + + + + + +Logic/State/UserRelatedState.ts + + +UserRelatedState.ts + + + + + +Logic/State/MapState.ts->Logic/State/UserRelatedState.ts + + + + + + + +UI/BigComponents/Attribution.ts->Utils.ts + + + + + +UI/BigComponents/Attribution.ts->UI/Base/Combine.ts + + + + + +UI/BigComponents/Attribution.ts->Models/Constants.ts + + + + + +UI/BigComponents/Attribution.ts->Svg.ts + + + + + +UI/BigComponents/Attribution.ts->UI/Base/Link.ts + + + + + +UI/BigComponents/Attribution.ts->UI/Base/VariableUIElement.ts + + + + + +Logic/State/UserRelatedState.ts->Utils.ts + + + + + +Logic/State/UserRelatedState.ts->Logic/Actors/InstalledThemes.ts + + + + + + + +Logic/State/UserRelatedState.ts->Logic/Actors/SelectedElementTagsUpdater.ts + + + + + + + +Logic/State/UserRelatedState.ts->UI/i18n/Locale.ts + + + + + +Logic/State/UserRelatedState.ts->Logic/Web/LocalStorageSource.ts + + + + + +Logic/State/UserRelatedState.ts->Logic/Osm/OsmConnection.ts + + + + + + + +Logic/State/UserRelatedState.ts->Logic/State/ElementsState.ts + + + + + + + +Logic/State/UserRelatedState.ts->Logic/Web/QueryParameters.ts + + + + + +Logic/Web/MangroveReviews.ts + + +MangroveReviews.ts + + + + + +Logic/State/UserRelatedState.ts->Logic/Web/MangroveReviews.ts + + + + + +Logic/Web/MangroveReviews.ts->Logic/UIEventSource.ts + + + + + +Logic/Tags/ComparingTag.ts + + +ComparingTag.ts + + + + + +Logic/Tags/RegexTag.ts->Logic/Tags/Tag.ts + + + + + + + +Logic/Tags/RegexTag.ts->Logic/Tags/TagsFilter.ts + + + + + +Logic/Tags/SubstitutingTag.ts + + +SubstitutingTag.ts + + + + + +Logic/Tags/TagUtils.ts->Utils.ts + + + + + +Logic/Tags/TagUtils.ts->Logic/Tags/Or.ts + + + + + +Logic/Tags/TagUtils.ts->Logic/Tags/And.ts + + + + + +Logic/Tags/TagUtils.ts->Logic/Tags/Tag.ts + + + + + +Logic/Tags/TagUtils.ts->Logic/Tags/ComparingTag.ts + + + + + +Logic/Tags/TagUtils.ts->Logic/Tags/RegexTag.ts + + + + + +Logic/Tags/TagUtils.ts->Logic/Tags/SubstitutingTag.ts + + + + + +util + +util + + + +Logic/Tags/TagUtils.ts->util + + + + + +Logic/Web/LiveQueryHandler.ts + + +LiveQueryHandler.ts + + + + + +Logic/Web/LiveQueryHandler.ts->Utils.ts + + + + + +Logic/Web/LiveQueryHandler.ts->Logic/UIEventSource.ts + + + + + +Logic/Web/Wikipedia.ts + + +Wikipedia.ts + + + + + +Logic/Web/Wikipedia.ts->Utils.ts + + + + + +Logic/Web/Wikipedia.ts->Logic/UIEventSource.ts + + + + + +Models/Denomination.ts + + +Denomination.ts + + + + + +Models/Denomination.ts->UI/i18n/Translations.ts + + + + + +UI/Input/Toggle.ts + + +Toggle.ts + + + + + +Models/Denomination.ts->UI/Input/Toggle.ts + + + + + +UI/Input/Toggle.ts->Logic/UIEventSource.ts + + + + + +UI/Input/Toggle.ts->UI/Base/VariableUIElement.ts + + + + + +UI/Base/Lazy.ts + + +Lazy.ts + + + + + +UI/Input/Toggle.ts->UI/Base/Lazy.ts + + + + + +Models/ThemeConfig/DeleteConfig.ts->UI/i18n/Translations.ts + + + + + + + +Models/ThemeConfig/DeleteConfig.ts->Logic/Tags/TagUtils.ts + + + + + +Models/ThemeConfig/FilterConfig.ts->UI/i18n/Translations.ts + + + + + + + +Models/ThemeConfig/FilterConfig.ts->Logic/Tags/TagUtils.ts + + + + + +Models/Unit.ts->UI/Base/Combine.ts + + + + + + + +Models/Unit.ts->UI/Base/FixedUiElement.ts + + + + + +Models/Unit.ts->Models/Denomination.ts + + + + + +Models/ThemeConfig/LineRenderingConfig.ts->Models/ThemeConfig/WithContextLoader.ts + + + + + + + +Models/ThemeConfig/LineRenderingConfig.ts->Utils.ts + + + + + +Models/ThemeConfig/PointRenderingConfig.ts->Models/ThemeConfig/WithContextLoader.ts + + + + + + + +Models/ThemeConfig/PointRenderingConfig.ts->Utils.ts + + + + + +Models/ThemeConfig/PointRenderingConfig.ts->Customizations/SharedTagRenderings.ts + + + + + + + +Models/ThemeConfig/PointRenderingConfig.ts->UI/Base/Combine.ts + + + + + + + +Models/ThemeConfig/PointRenderingConfig.ts->Models/ThemeConfig/TagRenderingConfig.ts + + + + + + + +Models/ThemeConfig/PointRenderingConfig.ts->Svg.ts + + + + + +Models/ThemeConfig/PointRenderingConfig.ts->UI/Base/Img.ts + + + + + + + +Models/ThemeConfig/PointRenderingConfig.ts->UI/Base/FixedUiElement.ts + + + + + +Models/ThemeConfig/PointRenderingConfig.ts->Logic/Tags/TagUtils.ts + + + + + +Models/ThemeConfig/PointRenderingConfig.ts->UI/Base/VariableUIElement.ts + + + + + + + +Models/ThemeConfig/SourceConfig.ts->Logic/Tags/RegexTag.ts + + + + + +UI/i18n/Translation.ts->Utils.ts + + + + + +UI/i18n/Translation.ts->UI/i18n/Locale.ts + + + + + +UI/i18n/Translation.ts->UI/BaseUIElement.ts + + + + + +Models/ThemeConfig/TilesourceConfig.ts->UI/i18n/Translations.ts + + + + + +Models/ThemeConfig/LegacyJsonConvert.ts + + +LegacyJsonConvert.ts + + + + + +UI/Base/VariableUIElement.ts->UI/BaseUIElement.ts + + + + + +UI/Input/ValidatedTextField.ts->Utils.ts + + + + + +UI/Input/ValidatedTextField.ts->UI/Base/Combine.ts + + + + + +UI/Input/ValidatedTextField.ts->UI/Base/Title.ts + + + + + +UI/Input/ValidatedTextField.ts->Logic/Actors/AvailableBaseLayers.ts + + + + + +UI/Input/ValidatedTextField.ts->Logic/UIEventSource.ts + + + + + +UI/Input/ValidatedTextField.ts->Logic/GeoOperations.ts + + + + + +UI/Input/ValidatedTextField.ts->Logic/Web/Wikidata.ts + + + + + +UI/Base/Table.ts + + +Table.ts + + + + + +UI/Input/ValidatedTextField.ts->UI/Base/Table.ts + + + + + +UI/Input/DropDown.ts + + +DropDown.ts + + + + + +UI/Input/ValidatedTextField.ts->UI/Input/DropDown.ts + + + + + +UI/Input/ColorPicker.ts + + +ColorPicker.ts + + + + + +UI/Input/ValidatedTextField.ts->UI/Input/ColorPicker.ts + + + + + +UI/Input/CombinedInputElement.ts + + +CombinedInputElement.ts + + + + + +UI/Input/ValidatedTextField.ts->UI/Input/CombinedInputElement.ts + + + + + +UI/Input/DirectionInput.ts + + +DirectionInput.ts + + + + + +UI/Input/ValidatedTextField.ts->UI/Input/DirectionInput.ts + + + + + +UI/Input/FixedInputElement.ts + + +FixedInputElement.ts + + + + + +UI/Input/ValidatedTextField.ts->UI/Input/FixedInputElement.ts + + + + + +UI/Input/LengthInput.ts + + +LengthInput.ts + + + + + +UI/Input/ValidatedTextField.ts->UI/Input/LengthInput.ts + + + + + +UI/Input/SimpleDatePicker.ts + + +SimpleDatePicker.ts + + + + + +UI/Input/ValidatedTextField.ts->UI/Input/SimpleDatePicker.ts + + + + + +UI/Input/TextField.ts + + +TextField.ts + + + + + +UI/Input/ValidatedTextField.ts->UI/Input/TextField.ts + + + + + +UI/OpeningHours/OpeningHoursInput.ts + + +OpeningHoursInput.ts + + + + + +UI/Input/ValidatedTextField.ts->UI/OpeningHours/OpeningHoursInput.ts + + + + + +UI/Wikipedia/WikidataSearchBox.ts + + +WikidataSearchBox.ts + + + + + +UI/Input/ValidatedTextField.ts->UI/Wikipedia/WikidataSearchBox.ts + + + + + +UI/SubstitutedTranslation.ts->Utils.ts + + + + + +UI/SubstitutedTranslation.ts->UI/Base/Combine.ts + + + + + +UI/SubstitutedTranslation.ts->UI/i18n/Locale.ts + + + + + +UI/SubstitutedTranslation.ts->State.ts + + + + + + + +UI/SubstitutedTranslation.ts->UI/Base/FixedUiElement.ts + + + + + +UI/SubstitutedTranslation.ts->UI/Base/VariableUIElement.ts + + + + + +UI/SpecialVisualizations.ts + + +SpecialVisualizations.ts + + + + + +UI/SubstitutedTranslation.ts->UI/SpecialVisualizations.ts + + + + + + + +UI/DefaultGuiState.ts + + +DefaultGuiState.ts + + + + + +UI/SubstitutedTranslation.ts->UI/DefaultGuiState.ts + + + + + +UI/Base/Button.ts + + +Button.ts + + + + + +UI/Base/Button.ts->UI/i18n/Translations.ts + + + + + +UI/Base/Button.ts->UI/BaseUIElement.ts + + + + + +UI/BaseUIElement.ts->Utils.ts + + + + + +UI/Base/Lazy.ts->UI/BaseUIElement.ts + + + + + +UI/Base/Loading.ts + + +Loading.ts + + + + + +UI/Base/Loading.ts->UI/Base/Combine.ts + + + + + +UI/Base/Loading.ts->UI/i18n/Translations.ts + + + + + +UI/Base/Loading.ts->Svg.ts + + + + + +UI/Base/ScrollableFullScreen.ts + + +ScrollableFullScreen.ts + + + + + +UI/Base/ScrollableFullScreen.ts->UI/Base/Combine.ts + + + + + +UI/Base/ScrollableFullScreen.ts->Logic/UIEventSource.ts + + + + + +UI/Base/ScrollableFullScreen.ts->Logic/Web/Hash.ts + + + + + +UI/Base/ScrollableFullScreen.ts->Svg.ts + + + + + +UI/Base/ScrollableFullScreen.ts->UI/Base/Img.ts + + + + + +UI/Base/ScrollableFullScreen.ts->UI/Base/FixedUiElement.ts + + + + + +UI/UIElement.ts + + +UIElement.ts + + + + + +UI/Base/ScrollableFullScreen.ts->UI/UIElement.ts + + + + + +UI/UIElement.ts->UI/BaseUIElement.ts + + + + + +UI/Base/SubtleButton.ts + + +SubtleButton.ts + + + + + +UI/Base/SubtleButton.ts->UI/Base/Combine.ts + + + + + +UI/Base/SubtleButton.ts->UI/i18n/Translations.ts + + + + + +UI/Base/SubtleButton.ts->UI/Base/Link.ts + + + + + +UI/Base/SubtleButton.ts->UI/Base/Img.ts + + + + + +UI/Base/SubtleButton.ts->UI/UIElement.ts + + + + + +UI/Base/TabbedComponent.ts + + +TabbedComponent.ts + + + + + +UI/Base/TabbedComponent.ts->UI/Base/Combine.ts + + + + + +UI/Base/TabbedComponent.ts->Logic/UIEventSource.ts + + + + + +UI/Base/TabbedComponent.ts->UI/i18n/Translations.ts + + + + + +UI/Base/TabbedComponent.ts->UI/Base/VariableUIElement.ts + + + + + +UI/Base/Table.ts->Utils.ts + + + + + +UI/Base/Table.ts->UI/i18n/Translations.ts + + + + + +UI/Base/Table.ts->UI/BaseUIElement.ts + + + + + +UI/BigComponents/Histogram.ts + + +Histogram.ts + + + + + +UI/BigComponents/Histogram.ts->Utils.ts + + + + + +UI/BigComponents/Histogram.ts->UI/Base/Combine.ts + + + + + +UI/BigComponents/Histogram.ts->UI/i18n/Translations.ts + + + + + +UI/BigComponents/Histogram.ts->UI/Base/FixedUiElement.ts + + + + + +UI/BigComponents/Histogram.ts->UI/Base/VariableUIElement.ts + + + + + +UI/BigComponents/Histogram.ts->UI/Base/Table.ts + + + + + +UI/BigComponents/ImportButton.ts + + +ImportButton.ts + + + + + +UI/BigComponents/ImportButton.ts->Customizations/AllKnownLayers.ts + + + + + + + +UI/BigComponents/ImportButton.ts->Utils.ts + + + + + +UI/BigComponents/ImportButton.ts->UI/Base/Combine.ts + + + + + +UI/BigComponents/ImportButton.ts->Logic/UIEventSource.ts + + + + + +UI/BigComponents/ImportButton.ts->Models/Constants.ts + + + + + +UI/BigComponents/ImportButton.ts->UI/i18n/Translations.ts + + + + + +UI/BigComponents/ImportButton.ts->Logic/FeatureSource/Sources/StaticFeatureSource.ts + + + + + +UI/BigComponents/ImportButton.ts->Svg.ts + + + + + +UI/BigComponents/ImportButton.ts->Logic/Osm/Actions/CreateNewNodeAction.ts + + + + + +UI/BigComponents/ImportButton.ts->Logic/Osm/Actions/CreateWayWithPointReuseAction.ts + + + + + +UI/BigComponents/ImportButton.ts->Logic/Tags/Tag.ts + + + + + +UI/BigComponents/ImportButton.ts->Logic/Osm/Actions/ReplaceGeometryAction.ts + + + + + +UI/BigComponents/ImportButton.ts->Logic/Osm/OsmConnection.ts + + + + + + + +UI/BigComponents/ImportButton.ts->UI/Base/Img.ts + + + + + +UI/BigComponents/ImportButton.ts->UI/Base/FixedUiElement.ts + + + + + +UI/BigComponents/ImportButton.ts->UI/ShowDataLayer/ShowDataLayer.ts + + + + + + + +UI/BigComponents/ImportButton.ts->UI/Base/Minimap.ts + + + + + +UI/BigComponents/ImportButton.ts->UI/Input/Toggle.ts + + + + + +UI/BigComponents/ImportButton.ts->UI/Base/VariableUIElement.ts + + + + + +UI/BigComponents/ImportButton.ts->UI/Base/Lazy.ts + + + + + +UI/BigComponents/ImportButton.ts->UI/Base/Loading.ts + + + + + +UI/BigComponents/ImportButton.ts->UI/Base/SubtleButton.ts + + + + + +UI/NewPoint/ConfirmLocationOfPoint.ts + + +ConfirmLocationOfPoint.ts + + + + + +UI/BigComponents/ImportButton.ts->UI/NewPoint/ConfirmLocationOfPoint.ts + + + + + + + +UI/ShowDataLayer/ShowDataMultiLayer.ts + + +ShowDataMultiLayer.ts + + + + + +UI/BigComponents/ImportButton.ts->UI/ShowDataLayer/ShowDataMultiLayer.ts + + + + + + + +UI/BigComponents/ImportButton.ts->UI/SpecialVisualizations.ts + + + + + + + +UI/NewPoint/ConfirmLocationOfPoint.ts->UI/Base/Combine.ts + + + + + +UI/NewPoint/ConfirmLocationOfPoint.ts->Logic/Actors/AvailableBaseLayers.ts + + + + + +UI/NewPoint/ConfirmLocationOfPoint.ts->Logic/UIEventSource.ts + + + + + +UI/NewPoint/ConfirmLocationOfPoint.ts->UI/i18n/Translations.ts + + + + + +UI/NewPoint/ConfirmLocationOfPoint.ts->Svg.ts + + + + + +UI/NewPoint/ConfirmLocationOfPoint.ts->Logic/Tags/TagUtils.ts + + + + + +UI/NewPoint/ConfirmLocationOfPoint.ts->UI/Input/Toggle.ts + + + + + +UI/NewPoint/ConfirmLocationOfPoint.ts->UI/Base/SubtleButton.ts + + + + + +UI/BigComponents/SimpleAddUI.ts + + +SimpleAddUI.ts + + + + + +UI/NewPoint/ConfirmLocationOfPoint.ts->UI/BigComponents/SimpleAddUI.ts + + + + + + + +UI/Input/LocationInput.ts + + +LocationInput.ts + + + + + +UI/NewPoint/ConfirmLocationOfPoint.ts->UI/Input/LocationInput.ts + + + + + + + +UI/ShowDataLayer/ShowDataMultiLayer.ts->Logic/FeatureSource/PerLayerFeatureSourceSplitter.ts + + + + + +UI/ShowDataLayer/ShowDataMultiLayer.ts->UI/ShowDataLayer/ShowDataLayer.ts + + + + + + + +UI/SpecialVisualizations.ts->Customizations/AllKnownLayers.ts + + + + + + + +UI/SpecialVisualizations.ts->Utils.ts + + + + + +UI/SpecialVisualizations.ts->UI/Base/Combine.ts + + + + + +UI/SpecialVisualizations.ts->UI/Base/Title.ts + + + + + +UI/SpecialVisualizations.ts->Logic/UIEventSource.ts + + + + + +UI/SpecialVisualizations.ts->Logic/SimpleMetaTagger.ts + + + + + + + +UI/SpecialVisualizations.ts->Logic/GeoOperations.ts + + + + + +UI/SpecialVisualizations.ts->UI/i18n/Translations.ts + + + + + +UI/SpecialVisualizations.ts->State.ts + + + + + + + +UI/SpecialVisualizations.ts->Logic/Web/Hash.ts + + + + + +UI/SpecialVisualizations.ts->Logic/FeatureSource/Sources/StaticFeatureSource.ts + + + + + +UI/SpecialVisualizations.ts->Logic/ImageProviders/AllImageProviders.ts + + + + + +UI/SpecialVisualizations.ts->Svg.ts + + + + + +UI/SpecialVisualizations.ts->Logic/Osm/Actions/ChangeTagAction.ts + + + + + +UI/SpecialVisualizations.ts->Logic/Tags/And.ts + + + + + +UI/SpecialVisualizations.ts->Logic/Tags/Tag.ts + + + + + +UI/SpecialVisualizations.ts->UI/Base/FixedUiElement.ts + + + + + +UI/SpecialVisualizations.ts->UI/ShowDataLayer/ShowDataLayer.ts + + + + + + + +UI/SpecialVisualizations.ts->UI/Base/Minimap.ts + + + + + +UI/SpecialVisualizations.ts->Logic/Web/MangroveReviews.ts + + + + + +UI/SpecialVisualizations.ts->Logic/Web/LiveQueryHandler.ts + + + + + +UI/SpecialVisualizations.ts->UI/Input/Toggle.ts + + + + + +UI/SpecialVisualizations.ts->UI/Base/VariableUIElement.ts + + + + + +UI/SpecialVisualizations.ts->UI/Base/SubtleButton.ts + + + + + +UI/SpecialVisualizations.ts->UI/Base/Table.ts + + + + + +UI/SpecialVisualizations.ts->UI/BigComponents/Histogram.ts + + + + + +UI/SpecialVisualizations.ts->UI/BigComponents/ImportButton.ts + + + + + + + +UI/SpecialVisualizations.ts->UI/ShowDataLayer/ShowDataMultiLayer.ts + + + + + + + +UI/BigComponents/ShareButton.ts + + +ShareButton.ts + + + + + +UI/SpecialVisualizations.ts->UI/BigComponents/ShareButton.ts + + + + + +UI/Image/ImageCarousel.ts + + +ImageCarousel.ts + + + + + +UI/SpecialVisualizations.ts->UI/Image/ImageCarousel.ts + + + + + + + +UI/Image/ImageUploadFlow.ts + + +ImageUploadFlow.ts + + + + + +UI/SpecialVisualizations.ts->UI/Image/ImageUploadFlow.ts + + + + + + + +UI/OpeningHours/OpeningHoursVisualization.ts + + +OpeningHoursVisualization.ts + + + + + +UI/SpecialVisualizations.ts->UI/OpeningHours/OpeningHoursVisualization.ts + + + + + + + +UI/Popup/MultiApply.ts + + +MultiApply.ts + + + + + +UI/SpecialVisualizations.ts->UI/Popup/MultiApply.ts + + + + + +UI/Reviews/ReviewElement.ts + + +ReviewElement.ts + + + + + +UI/SpecialVisualizations.ts->UI/Reviews/ReviewElement.ts + + + + + +UI/Reviews/ReviewForm.ts + + +ReviewForm.ts + + + + + +UI/SpecialVisualizations.ts->UI/Reviews/ReviewForm.ts + + + + + +UI/Wikipedia/WikipediaBox.ts + + +WikipediaBox.ts + + + + + +UI/SpecialVisualizations.ts->UI/Wikipedia/WikipediaBox.ts + + + + + +UI/BigComponents/LicensePicker.ts + + +LicensePicker.ts + + + + + +UI/BigComponents/LicensePicker.ts->Logic/UIEventSource.ts + + + + + +UI/BigComponents/LicensePicker.ts->UI/i18n/Translations.ts + + + + + +UI/BigComponents/LicensePicker.ts->State.ts + + + + + + + +UI/BigComponents/LicensePicker.ts->UI/Input/DropDown.ts + + + + + +UI/Input/DropDown.ts->Logic/UIEventSource.ts + + + + + +UI/Input/DropDown.ts->UI/i18n/Translations.ts + + + + + +UI/Input/InputElement.ts + + +InputElement.ts + + + + + +UI/Input/DropDown.ts->UI/Input/InputElement.ts + + + + + +UI/BigComponents/ShareButton.ts->UI/BaseUIElement.ts + + + + + +UI/BigComponents/SimpleAddUI.ts->UI/Base/Combine.ts + + + + + +UI/BigComponents/SimpleAddUI.ts->Logic/UIEventSource.ts + + + + + +UI/BigComponents/SimpleAddUI.ts->Models/Constants.ts + + + + + +UI/BigComponents/SimpleAddUI.ts->Logic/Osm/OsmObject.ts + + + + + +UI/BigComponents/SimpleAddUI.ts->UI/i18n/Translations.ts + + + + + +UI/BigComponents/SimpleAddUI.ts->Svg.ts + + + + + +UI/BigComponents/SimpleAddUI.ts->Logic/Osm/Actions/CreateNewNodeAction.ts + + + + + +UI/BigComponents/SimpleAddUI.ts->Logic/Tags/TagUtils.ts + + + + + +UI/BigComponents/SimpleAddUI.ts->UI/Input/Toggle.ts + + + + + +UI/BigComponents/SimpleAddUI.ts->UI/Base/VariableUIElement.ts + + + + + +UI/BigComponents/SimpleAddUI.ts->UI/Base/SubtleButton.ts + + + + + +UI/BigComponents/SimpleAddUI.ts->UI/NewPoint/ConfirmLocationOfPoint.ts + + + + + + + + + + + +UI/DefaultGuiState.ts->Logic/UIEventSource.ts + + + + + +UI/DefaultGuiState.ts->Logic/Web/Hash.ts + + + + + +UI/DefaultGuiState.ts->Logic/Web/QueryParameters.ts + + + + + +UI/Image/AttributedImage.ts + + +AttributedImage.ts + + + + + +UI/Image/AttributedImage.ts->UI/Base/Combine.ts + + + + + +UI/Image/AttributedImage.ts->Logic/ImageProviders/Mapillary.ts + + + + + +UI/Image/AttributedImage.ts->UI/Base/Img.ts + + + + + +UI/Image/Attribution.ts + + +Attribution.ts + + + + + +UI/Image/AttributedImage.ts->UI/Image/Attribution.ts + + + + + +UI/Image/Attribution.ts->UI/Base/Combine.ts + + + + + +UI/Image/Attribution.ts->UI/i18n/Translations.ts + + + + + +UI/Image/Attribution.ts->UI/Base/VariableUIElement.ts + + + + + +UI/Image/DeleteImage.ts + + +DeleteImage.ts + + + + + +UI/Image/DeleteImage.ts->UI/Base/Combine.ts + + + + + +UI/Image/DeleteImage.ts->UI/i18n/Translations.ts + + + + + +UI/Image/DeleteImage.ts->State.ts + + + + + + + +UI/Image/DeleteImage.ts->Svg.ts + + + + + +UI/Image/DeleteImage.ts->Logic/Osm/Actions/ChangeTagAction.ts + + + + + +UI/Image/DeleteImage.ts->Logic/Tags/Tag.ts + + + + + +UI/Image/DeleteImage.ts->UI/Input/Toggle.ts + + + + + +UI/Image/ImageCarousel.ts->UI/Base/Combine.ts + + + + + +UI/Image/ImageCarousel.ts->UI/Input/Toggle.ts + + + + + +UI/Image/ImageCarousel.ts->UI/Image/AttributedImage.ts + + + + + +UI/Image/ImageCarousel.ts->UI/Image/DeleteImage.ts + + + + + + + +UI/Image/SlideShow.ts + + +SlideShow.ts + + + + + +UI/Image/ImageCarousel.ts->UI/Image/SlideShow.ts + + + + + +UI/Image/SlideShow.ts->Utils.ts + + + + + +UI/Image/SlideShow.ts->UI/Base/Combine.ts + + + + + +UI/Image/SlideShow.ts->UI/BaseUIElement.ts + + + + + +UI/Image/ImageUploadFlow.ts->UI/Base/Combine.ts + + + + + +UI/Image/ImageUploadFlow.ts->Logic/UIEventSource.ts + + + + + +UI/Image/ImageUploadFlow.ts->UI/i18n/Translations.ts + + + + + +UI/Image/ImageUploadFlow.ts->State.ts + + + + + + + +UI/Image/ImageUploadFlow.ts->Logic/ImageProviders/ImgurUploader.ts + + + + + +UI/Image/ImageUploadFlow.ts->Svg.ts + + + + + +UI/Image/ImageUploadFlow.ts->Logic/Osm/Actions/ChangeTagAction.ts + + + + + +UI/Image/ImageUploadFlow.ts->Logic/Tags/Tag.ts + + + + + +UI/Image/ImageUploadFlow.ts->UI/Base/FixedUiElement.ts + + + + + +UI/Image/ImageUploadFlow.ts->UI/Input/Toggle.ts + + + + + +UI/Image/ImageUploadFlow.ts->UI/Base/VariableUIElement.ts + + + + + +UI/Image/ImageUploadFlow.ts->UI/BigComponents/LicensePicker.ts + + + + + + + +UI/Input/FileSelectorButton.ts + + +FileSelectorButton.ts + + + + + +UI/Image/ImageUploadFlow.ts->UI/Input/FileSelectorButton.ts + + + + + +UI/Input/FileSelectorButton.ts->Logic/UIEventSource.ts + + + + + +UI/Input/FileSelectorButton.ts->UI/Input/InputElement.ts + + + + + +UI/Input/Checkboxes.ts + + +Checkboxes.ts + + + + + +UI/Input/Checkboxes.ts->Utils.ts + + + + + +UI/Input/Checkboxes.ts->Logic/UIEventSource.ts + + + + + +UI/Input/Checkboxes.ts->UI/Input/InputElement.ts + + + + + +UI/Input/InputElement.ts->UI/BaseUIElement.ts + + + + + +UI/Input/ColorPicker.ts->Logic/UIEventSource.ts + + + + + +UI/Input/ColorPicker.ts->UI/Input/InputElement.ts + + + + + +UI/Input/CombinedInputElement.ts->UI/Base/Combine.ts + + + + + +UI/Input/CombinedInputElement.ts->UI/Input/InputElement.ts + + + + + +UI/Input/DirectionInput.ts->Utils.ts + + + + + +UI/Input/DirectionInput.ts->UI/Base/Combine.ts + + + + + +UI/Input/DirectionInput.ts->Logic/UIEventSource.ts + + + + + +UI/Input/DirectionInput.ts->Svg.ts + + + + + +UI/Input/DirectionInput.ts->UI/Base/FixedUiElement.ts + + + + + +UI/Input/DirectionInput.ts->UI/Base/Minimap.ts + + + + + +UI/Input/DirectionInput.ts->UI/Input/InputElement.ts + + + + + +UI/Input/FixedInputElement.ts->Logic/UIEventSource.ts + + + + + +UI/Input/FixedInputElement.ts->UI/i18n/Translations.ts + + + + + +UI/Input/FixedInputElement.ts->UI/Input/InputElement.ts + + + + + +UI/Input/InputElementMap.ts + + +InputElementMap.ts + + + + + +UI/Input/InputElementMap.ts->UI/Input/InputElement.ts + + + + + +UI/Input/InputElementWrapper.ts + + +InputElementWrapper.ts + + + + + +UI/Input/InputElementWrapper.ts->UI/SubstitutedTranslation.ts + + + + + + + +UI/Input/InputElementWrapper.ts->UI/Input/InputElement.ts + + + + + +UI/Input/LengthInput.ts->Utils.ts + + + + + +UI/Input/LengthInput.ts->UI/Base/Combine.ts + + + + + +UI/Input/LengthInput.ts->Logic/UIEventSource.ts + + + + + +UI/Input/LengthInput.ts->Logic/GeoOperations.ts + + + + + +UI/Input/LengthInput.ts->Svg.ts + + + + + +UI/Input/LengthInput.ts->UI/Base/Minimap.ts + + + + + +UI/Input/LengthInput.ts->UI/Input/InputElement.ts + + + + + +UI/Input/LocationInput.ts->Models/ThemeConfig/LayerConfig.ts + + + + + + + +UI/Input/LocationInput.ts->UI/Base/Combine.ts + + + + + +UI/Input/LocationInput.ts->Logic/UIEventSource.ts + + + + + +UI/Input/LocationInput.ts->Logic/GeoOperations.ts + + + + + +UI/Input/LocationInput.ts->State.ts + + + + + + + +UI/Input/LocationInput.ts->Logic/FeatureSource/Sources/StaticFeatureSource.ts + + + + + +UI/Input/LocationInput.ts->Svg.ts + + + + + +UI/Input/LocationInput.ts->UI/Base/FixedUiElement.ts + + + + + +UI/Input/LocationInput.ts->UI/ShowDataLayer/ShowDataLayer.ts + + + + + + + +UI/Input/LocationInput.ts->UI/Base/Minimap.ts + + + + + +UI/Input/LocationInput.ts->UI/Input/Toggle.ts + + + + + +UI/Input/LocationInput.ts->UI/ShowDataLayer/ShowDataMultiLayer.ts + + + + + + + + + + + +UI/Input/LocationInput.ts->UI/Input/InputElement.ts + + + + + +UI/Input/RadioButton.ts + + +RadioButton.ts + + + + + +UI/Input/RadioButton.ts->Utils.ts + + + + + +UI/Input/RadioButton.ts->Logic/UIEventSource.ts + + + + + +UI/Input/RadioButton.ts->UI/Input/InputElement.ts + + + + + +UI/Input/SimpleDatePicker.ts->Logic/UIEventSource.ts + + + + + +UI/Input/SimpleDatePicker.ts->UI/Input/InputElement.ts + + + + + +UI/Input/TextField.ts->Logic/UIEventSource.ts + + + + + +UI/Input/TextField.ts->UI/i18n/Translations.ts + + + + + +UI/Input/TextField.ts->UI/Input/InputElement.ts + + + + + +UI/OpeningHours/OpeningHoursInput.ts->Utils.ts + + + + + +UI/OpeningHours/OpeningHoursInput.ts->UI/Base/Combine.ts + + + + + +UI/OpeningHours/OpeningHoursInput.ts->Logic/UIEventSource.ts + + + + + +UI/OpeningHours/OpeningHoursInput.ts->UI/i18n/Translations.ts + + + + + +UI/OpeningHours/OpeningHoursInput.ts->UI/Base/FixedUiElement.ts + + + + + +UI/OpeningHours/OpeningHoursInput.ts->UI/Base/VariableUIElement.ts + + + + + +UI/OpeningHours/OpeningHoursInput.ts->UI/Input/InputElement.ts + + + + + +UI/OpeningHours/OpeningHours.ts + + +OpeningHours.ts + + + + + +UI/OpeningHours/OpeningHoursInput.ts->UI/OpeningHours/OpeningHours.ts + + + + + +UI/OpeningHours/OpeningHoursPicker.ts + + +OpeningHoursPicker.ts + + + + + +UI/OpeningHours/OpeningHoursInput.ts->UI/OpeningHours/OpeningHoursPicker.ts + + + + + +UI/OpeningHours/PublicHolidayInput.ts + + +PublicHolidayInput.ts + + + + + +UI/OpeningHours/OpeningHoursInput.ts->UI/OpeningHours/PublicHolidayInput.ts + + + + + +UI/Wikipedia/WikidataSearchBox.ts->UI/Base/Combine.ts + + + + + +UI/Wikipedia/WikidataSearchBox.ts->UI/Base/Title.ts + + + + + +UI/Wikipedia/WikidataSearchBox.ts->Logic/UIEventSource.ts + + + + + +UI/Wikipedia/WikidataSearchBox.ts->UI/i18n/Locale.ts + + + + + +UI/Wikipedia/WikidataSearchBox.ts->UI/i18n/Translations.ts + + + + + +UI/Wikipedia/WikidataSearchBox.ts->Svg.ts + + + + + +UI/Wikipedia/WikidataSearchBox.ts->Logic/Web/Wikidata.ts + + + + + +UI/Wikipedia/WikidataSearchBox.ts->UI/Base/VariableUIElement.ts + + + + + +UI/Wikipedia/WikidataSearchBox.ts->UI/Input/InputElement.ts + + + + + +UI/Wikipedia/WikidataSearchBox.ts->UI/Input/TextField.ts + + + + + +UI/Wikipedia/WikidataSearchBox.ts->UI/Wikipedia/WikipediaBox.ts + + + + + +UI/Wikipedia/WikidataPreviewBox.ts + + +WikidataPreviewBox.ts + + + + + +UI/Wikipedia/WikidataSearchBox.ts->UI/Wikipedia/WikidataPreviewBox.ts + + + + + +UI/Input/VariableInputElement.ts + + +VariableInputElement.ts + + + + + +UI/Input/VariableInputElement.ts->UI/Base/VariableUIElement.ts + + + + + +UI/Input/VariableInputElement.ts->UI/Input/InputElement.ts + + + + + +UI/OpeningHours/OpeningHours.ts->Utils.ts + + + + + +UI/OpeningHours/OpeningHoursPicker.ts->Logic/UIEventSource.ts + + + + + +UI/OpeningHours/OpeningHoursPicker.ts->UI/Input/InputElement.ts + + + + + +UI/OpeningHours/OpeningHoursPicker.ts->UI/OpeningHours/OpeningHours.ts + + + + + +UI/OpeningHours/OpeningHoursPickerTable.ts + + +OpeningHoursPickerTable.ts + + + + + +UI/OpeningHours/OpeningHoursPicker.ts->UI/OpeningHours/OpeningHoursPickerTable.ts + + + + + +UI/OpeningHours/PublicHolidayInput.ts->UI/Base/Combine.ts + + + + + +UI/OpeningHours/PublicHolidayInput.ts->Logic/UIEventSource.ts + + + + + +UI/OpeningHours/PublicHolidayInput.ts->UI/i18n/Translations.ts + + + + + +UI/OpeningHours/PublicHolidayInput.ts->UI/Input/Toggle.ts + + + + + +UI/OpeningHours/PublicHolidayInput.ts->UI/Input/DropDown.ts + + + + + +UI/OpeningHours/PublicHolidayInput.ts->UI/Input/InputElement.ts + + + + + +UI/OpeningHours/PublicHolidayInput.ts->UI/Input/TextField.ts + + + + + +UI/OpeningHours/PublicHolidayInput.ts->UI/OpeningHours/OpeningHours.ts + + + + + +UI/OpeningHours/OpeningHoursPickerTable.ts->Utils.ts + + + + + +UI/OpeningHours/OpeningHoursPickerTable.ts->UI/Base/Combine.ts + + + + + +UI/OpeningHours/OpeningHoursPickerTable.ts->Logic/UIEventSource.ts + + + + + +UI/OpeningHours/OpeningHoursPickerTable.ts->UI/i18n/Translations.ts + + + + + +UI/OpeningHours/OpeningHoursPickerTable.ts->UI/Base/FixedUiElement.ts + + + + + +UI/OpeningHours/OpeningHoursPickerTable.ts->UI/Base/VariableUIElement.ts + + + + + +UI/OpeningHours/OpeningHoursPickerTable.ts->UI/Input/InputElement.ts + + + + + +UI/OpeningHours/OpeningHoursRange.ts + + +OpeningHoursRange.ts + + + + + +UI/OpeningHours/OpeningHoursPickerTable.ts->UI/OpeningHours/OpeningHoursRange.ts + + + + + +UI/OpeningHours/OpeningHoursRange.ts->Utils.ts + + + + + +UI/OpeningHours/OpeningHoursRange.ts->UI/Base/Combine.ts + + + + + +UI/OpeningHours/OpeningHoursRange.ts->Svg.ts + + + + + +UI/OpeningHours/OpeningHoursRange.ts->UI/Base/FixedUiElement.ts + + + + + +UI/OpeningHours/OpeningHoursRange.ts->UI/BaseUIElement.ts + + + + + +UI/OpeningHours/OpeningHoursRange.ts->UI/OpeningHours/OpeningHours.ts + + + + + +UI/OpeningHours/OpeningHoursVisualization.ts->UI/Base/Combine.ts + + + + + +UI/OpeningHours/OpeningHoursVisualization.ts->Models/Constants.ts + + + + + +UI/OpeningHours/OpeningHoursVisualization.ts->UI/i18n/Translations.ts + + + + + +UI/OpeningHours/OpeningHoursVisualization.ts->State.ts + + + + + + + +UI/OpeningHours/OpeningHoursVisualization.ts->UI/Base/FixedUiElement.ts + + + + + +UI/OpeningHours/OpeningHoursVisualization.ts->UI/Input/Toggle.ts + + + + + +UI/OpeningHours/OpeningHoursVisualization.ts->UI/Base/VariableUIElement.ts + + + + + +UI/OpeningHours/OpeningHoursVisualization.ts->UI/Base/Table.ts + + + + + +UI/OpeningHours/OpeningHoursVisualization.ts->UI/OpeningHours/OpeningHours.ts + + + + + +UI/Popup/DeleteWizard.ts + + +DeleteWizard.ts + + + + + +UI/Popup/DeleteWizard.ts->UI/Base/Combine.ts + + + + + +UI/Popup/DeleteWizard.ts->Models/ThemeConfig/TagRenderingConfig.ts + + + + + + + +UI/Popup/DeleteWizard.ts->Logic/UIEventSource.ts + + + + + +UI/Popup/DeleteWizard.ts->Models/Constants.ts + + + + + +UI/Popup/DeleteWizard.ts->Logic/Osm/OsmObject.ts + + + + + +UI/Popup/DeleteWizard.ts->UI/i18n/Translations.ts + + + + + +UI/Popup/DeleteWizard.ts->State.ts + + + + + + + +UI/Popup/DeleteWizard.ts->Svg.ts + + + + + +UI/Popup/DeleteWizard.ts->Logic/Osm/Actions/DeleteAction.ts + + + + + + + +UI/Popup/DeleteWizard.ts->UI/Base/FixedUiElement.ts + + + + + +UI/Popup/DeleteWizard.ts->UI/Input/Toggle.ts + + + + + +UI/Popup/DeleteWizard.ts->UI/Base/VariableUIElement.ts + + + + + +UI/Popup/DeleteWizard.ts->UI/Base/SubtleButton.ts + + + + + +UI/Popup/TagRenderingQuestion.ts + + +TagRenderingQuestion.ts + + + + + +UI/Popup/DeleteWizard.ts->UI/Popup/TagRenderingQuestion.ts + + + + + + + +UI/Popup/TagRenderingQuestion.ts->Utils.ts + + + + + +UI/Popup/TagRenderingQuestion.ts->UI/Base/Combine.ts + + + + + +UI/Popup/TagRenderingQuestion.ts->Logic/UIEventSource.ts + + + + + +UI/Popup/TagRenderingQuestion.ts->Models/Constants.ts + + + + + +UI/Popup/TagRenderingQuestion.ts->UI/i18n/Translations.ts + + + + + +UI/Popup/TagRenderingQuestion.ts->State.ts + + + + + + + +UI/Popup/TagRenderingQuestion.ts->Logic/Osm/Actions/ChangeTagAction.ts + + + + + +UI/Popup/TagRenderingQuestion.ts->Logic/Tags/And.ts + + + + + +UI/Popup/TagRenderingQuestion.ts->Logic/Tags/Tag.ts + + + + + +UI/Popup/TagRenderingQuestion.ts->UI/Base/FixedUiElement.ts + + + + + +UI/Popup/TagRenderingQuestion.ts->Logic/Tags/TagUtils.ts + + + + + +UI/Popup/TagRenderingQuestion.ts->UI/Input/Toggle.ts + + + + + +UI/Popup/TagRenderingQuestion.ts->UI/Base/VariableUIElement.ts + + + + + +UI/Popup/TagRenderingQuestion.ts->UI/Input/ValidatedTextField.ts + + + + + +UI/Popup/TagRenderingQuestion.ts->UI/SubstitutedTranslation.ts + + + + + + + +UI/Popup/TagRenderingQuestion.ts->UI/Input/DropDown.ts + + + + + +UI/Popup/TagRenderingQuestion.ts->UI/Input/Checkboxes.ts + + + + + +UI/Popup/TagRenderingQuestion.ts->UI/Input/FixedInputElement.ts + + + + + +UI/Popup/TagRenderingQuestion.ts->UI/Input/InputElementMap.ts + + + + + +UI/Popup/TagRenderingQuestion.ts->UI/Input/InputElementWrapper.ts + + + + + + + +UI/Popup/TagRenderingQuestion.ts->UI/Input/RadioButton.ts + + + + + +UI/Popup/TagRenderingQuestion.ts->UI/Input/VariableInputElement.ts + + + + + +UI/Popup/SaveButton.ts + + +SaveButton.ts + + + + + +UI/Popup/TagRenderingQuestion.ts->UI/Popup/SaveButton.ts + + + + + +UI/Popup/EditableTagRendering.ts + + +EditableTagRendering.ts + + + + + +UI/Popup/EditableTagRendering.ts->UI/Base/Combine.ts + + + + + +UI/Popup/EditableTagRendering.ts->Logic/UIEventSource.ts + + + + + +UI/Popup/EditableTagRendering.ts->UI/i18n/Translations.ts + + + + + +UI/Popup/EditableTagRendering.ts->UI/Popup/TagRenderingAnswer.ts + + + + + + + +UI/Popup/EditableTagRendering.ts->State.ts + + + + + + + +UI/Popup/EditableTagRendering.ts->Svg.ts + + + + + +UI/Popup/EditableTagRendering.ts->UI/Input/Toggle.ts + + + + + +UI/Popup/EditableTagRendering.ts->UI/Base/Lazy.ts + + + + + +UI/Popup/EditableTagRendering.ts->UI/Popup/TagRenderingQuestion.ts + + + + + + + +UI/Popup/FeatureInfoBox.ts->Utils.ts + + + + + +UI/Popup/FeatureInfoBox.ts->Customizations/SharedTagRenderings.ts + + + + + + + +UI/Popup/FeatureInfoBox.ts->UI/Base/Combine.ts + + + + + +UI/Popup/FeatureInfoBox.ts->Models/ThemeConfig/TagRenderingConfig.ts + + + + + + + +UI/Popup/FeatureInfoBox.ts->Models/Constants.ts + + + + + +UI/Popup/FeatureInfoBox.ts->UI/Popup/TagRenderingAnswer.ts + + + + + + + +UI/Popup/FeatureInfoBox.ts->State.ts + + + + + + + +UI/Popup/FeatureInfoBox.ts->UI/Input/Toggle.ts + + + + + +UI/Popup/FeatureInfoBox.ts->UI/Base/VariableUIElement.ts + + + + + +UI/Popup/FeatureInfoBox.ts->UI/SubstitutedTranslation.ts + + + + + + + +UI/Popup/FeatureInfoBox.ts->UI/Base/ScrollableFullScreen.ts + + + + + +UI/Popup/FeatureInfoBox.ts->UI/Popup/DeleteWizard.ts + + + + + + + +UI/Popup/FeatureInfoBox.ts->UI/Popup/EditableTagRendering.ts + + + + + + + +UI/Popup/MoveWizard.ts + + +MoveWizard.ts + + + + + +UI/Popup/FeatureInfoBox.ts->UI/Popup/MoveWizard.ts + + + + + + + +UI/Popup/QuestionBox.ts + + +QuestionBox.ts + + + + + +UI/Popup/FeatureInfoBox.ts->UI/Popup/QuestionBox.ts + + + + + + + +UI/Popup/SplitRoadWizard.ts + + +SplitRoadWizard.ts + + + + + +UI/Popup/FeatureInfoBox.ts->UI/Popup/SplitRoadWizard.ts + + + + + + + +UI/Popup/MoveWizard.ts->UI/Base/Combine.ts + + + + + +UI/Popup/MoveWizard.ts->Logic/Actors/AvailableBaseLayers.ts + + + + + +UI/Popup/MoveWizard.ts->Logic/UIEventSource.ts + + + + + +UI/Popup/MoveWizard.ts->Logic/Osm/OsmObject.ts + + + + + +UI/Popup/MoveWizard.ts->Logic/GeoOperations.ts + + + + + +UI/Popup/MoveWizard.ts->UI/i18n/Translations.ts + + + + + +UI/Popup/MoveWizard.ts->Svg.ts + + + + + +UI/Popup/MoveWizard.ts->Logic/Osm/Actions/ChangeLocationAction.ts + + + + + +UI/Popup/MoveWizard.ts->UI/Input/Toggle.ts + + + + + +UI/Popup/MoveWizard.ts->UI/Base/VariableUIElement.ts + + + + + +UI/Popup/MoveWizard.ts->UI/Base/SubtleButton.ts + + + + + +UI/Popup/MoveWizard.ts->UI/Input/LocationInput.ts + + + + + + + +UI/Popup/QuestionBox.ts->UI/Base/Combine.ts + + + + + +UI/Popup/QuestionBox.ts->Logic/UIEventSource.ts + + + + + +UI/Popup/QuestionBox.ts->UI/i18n/Translations.ts + + + + + +UI/Popup/QuestionBox.ts->UI/Base/VariableUIElement.ts + + + + + +UI/Popup/QuestionBox.ts->UI/Base/Lazy.ts + + + + + +UI/Popup/QuestionBox.ts->UI/Popup/TagRenderingQuestion.ts + + + + + + + +UI/Popup/SplitRoadWizard.ts->Models/ThemeConfig/LayerConfig.ts + + + + + + + +UI/Popup/SplitRoadWizard.ts->UI/Base/Combine.ts + + + + + +UI/Popup/SplitRoadWizard.ts->UI/Base/Title.ts + + + + + +UI/Popup/SplitRoadWizard.ts->Logic/UIEventSource.ts + + + + + +UI/Popup/SplitRoadWizard.ts->Logic/GeoOperations.ts + + + + + +UI/Popup/SplitRoadWizard.ts->UI/i18n/Translations.ts + + + + + +UI/Popup/SplitRoadWizard.ts->Logic/BBox.ts + + + + + +UI/Popup/SplitRoadWizard.ts->State.ts + + + + + + + +UI/Popup/SplitRoadWizard.ts->Logic/FeatureSource/Sources/StaticFeatureSource.ts + + + + + +UI/Popup/SplitRoadWizard.ts->Svg.ts + + + + + +UI/Popup/SplitRoadWizard.ts->Logic/Osm/Actions/SplitAction.ts + + + + + +UI/Popup/SplitRoadWizard.ts->UI/ShowDataLayer/ShowDataLayer.ts + + + + + + + +UI/Popup/SplitRoadWizard.ts->UI/Base/Minimap.ts + + + + + +UI/Popup/SplitRoadWizard.ts->UI/Input/Toggle.ts + + + + + +UI/Popup/SplitRoadWizard.ts->UI/Base/Button.ts + + + + + +UI/Popup/SplitRoadWizard.ts->UI/Base/SubtleButton.ts + + + + + +UI/Popup/SplitRoadWizard.ts->UI/ShowDataLayer/ShowDataMultiLayer.ts + + + + + + + +assets/layers/split_point/split_point.json + + +split_point.json + + + + + +UI/Popup/SplitRoadWizard.ts->assets/layers/split_point/split_point.json + + + + + +UI/Popup/MultiApply.ts->UI/Base/Combine.ts + + + + + +UI/Popup/MultiApply.ts->UI/i18n/Translations.ts + + + + + +UI/Popup/MultiApply.ts->Logic/Osm/Actions/ChangeTagAction.ts + + + + + +UI/Popup/MultiApply.ts->Logic/Tags/And.ts + + + + + +UI/Popup/MultiApply.ts->Logic/Tags/Tag.ts + + + + + +UI/Popup/MultiApply.ts->UI/Base/FixedUiElement.ts + + + + + +UI/Popup/MultiApply.ts->UI/Input/Toggle.ts + + + + + +UI/Popup/MultiApply.ts->UI/Base/VariableUIElement.ts + + + + + +UI/Popup/MultiApply.ts->UI/Base/SubtleButton.ts + + + + + +UI/Popup/SaveButton.ts->Logic/UIEventSource.ts + + + + + +UI/Popup/SaveButton.ts->UI/i18n/Translations.ts + + + + + +UI/Popup/SaveButton.ts->UI/Input/Toggle.ts + + + + + +UI/Reviews/ReviewElement.ts->UI/Base/Combine.ts + + + + + +UI/Reviews/ReviewElement.ts->UI/i18n/Translations.ts + + + + + +UI/Reviews/ReviewElement.ts->UI/Base/Link.ts + + + + + +UI/Reviews/ReviewElement.ts->UI/Base/Img.ts + + + + + +UI/Reviews/ReviewElement.ts->UI/Base/VariableUIElement.ts + + + + + +UI/Reviews/SingleReview.ts + + +SingleReview.ts + + + + + +UI/Reviews/ReviewElement.ts->UI/Reviews/SingleReview.ts + + + + + +UI/Reviews/SingleReview.ts->Utils.ts + + + + + +UI/Reviews/SingleReview.ts->UI/Base/Combine.ts + + + + + +UI/Reviews/SingleReview.ts->UI/i18n/Translations.ts + + + + + +UI/Reviews/SingleReview.ts->UI/Base/Img.ts + + + + + +UI/Reviews/SingleReview.ts->UI/Base/FixedUiElement.ts + + + + + +UI/Reviews/ReviewForm.ts->UI/Base/Combine.ts + + + + + +UI/Reviews/ReviewForm.ts->Logic/UIEventSource.ts + + + + + +UI/Reviews/ReviewForm.ts->UI/i18n/Translations.ts + + + + + +UI/Reviews/ReviewForm.ts->Svg.ts + + + + + +UI/Reviews/ReviewForm.ts->UI/Input/Toggle.ts + + + + + +UI/Reviews/ReviewForm.ts->UI/Base/VariableUIElement.ts + + + + + +UI/Reviews/ReviewForm.ts->UI/Input/Checkboxes.ts + + + + + +UI/Reviews/ReviewForm.ts->UI/Input/InputElement.ts + + + + + +UI/Reviews/ReviewForm.ts->UI/Input/TextField.ts + + + + + +UI/Reviews/ReviewForm.ts->UI/Popup/SaveButton.ts + + + + + +UI/Wikipedia/WikipediaBox.ts->UI/Base/Combine.ts + + + + + +UI/Wikipedia/WikipediaBox.ts->UI/Base/Title.ts + + + + + +UI/Wikipedia/WikipediaBox.ts->UI/i18n/Locale.ts + + + + + +UI/Wikipedia/WikipediaBox.ts->UI/i18n/Translations.ts + + + + + +UI/Wikipedia/WikipediaBox.ts->Svg.ts + + + + + +UI/Wikipedia/WikipediaBox.ts->Logic/Web/Wikidata.ts + + + + + +UI/Wikipedia/WikipediaBox.ts->UI/Base/Link.ts + + + + + +UI/Wikipedia/WikipediaBox.ts->UI/Base/FixedUiElement.ts + + + + + +UI/Wikipedia/WikipediaBox.ts->Logic/Web/Wikipedia.ts + + + + + +UI/Wikipedia/WikipediaBox.ts->UI/i18n/Translation.ts + + + + + +UI/Wikipedia/WikipediaBox.ts->UI/Base/VariableUIElement.ts + + + + + +UI/Wikipedia/WikipediaBox.ts->UI/Base/Loading.ts + + + + + +UI/Wikipedia/WikipediaBox.ts->UI/Base/TabbedComponent.ts + + + + + +UI/Wikipedia/WikipediaBox.ts->UI/Wikipedia/WikidataPreviewBox.ts + + + + + +UI/Wikipedia/WikidataPreviewBox.ts->Utils.ts + + + + + +UI/Wikipedia/WikidataPreviewBox.ts->UI/Base/Combine.ts + + + + + +UI/Wikipedia/WikidataPreviewBox.ts->UI/i18n/Translations.ts + + + + + +UI/Wikipedia/WikidataPreviewBox.ts->Logic/ImageProviders/WikimediaImageProvider.ts + + + + + +UI/Wikipedia/WikidataPreviewBox.ts->Svg.ts + + + + + +UI/Wikipedia/WikidataPreviewBox.ts->Logic/Web/Wikidata.ts + + + + + +UI/Wikipedia/WikidataPreviewBox.ts->UI/Base/Link.ts + + + + + +UI/Wikipedia/WikidataPreviewBox.ts->UI/Base/Img.ts + + + + + +UI/Wikipedia/WikidataPreviewBox.ts->UI/Base/FixedUiElement.ts + + + + + +UI/Wikipedia/WikidataPreviewBox.ts->UI/i18n/Translation.ts + + + + + +UI/Wikipedia/WikidataPreviewBox.ts->UI/Base/VariableUIElement.ts + + + + + +UI/Wikipedia/WikidataPreviewBox.ts->UI/Base/Loading.ts + + + + + +assert + +assert + + + +assets/layers/bike_repair_station/bike_repair_station.json + + +bike_repair_station.json + + + + + +fs + +fs + + + +https + +https + + + +scripts/ScriptUtils.ts + + +ScriptUtils.ts + + + + + +scripts/ScriptUtils.ts->Utils.ts + + + + + +scripts/ScriptUtils.ts->fs + + + + + +scripts/ScriptUtils.ts->https + + + + + +test/Actors.spec.ts + + +Actors.spec.ts + + + + + +test/Actors.spec.ts->Utils.ts + + + + + +test/Actors.spec.ts->Customizations/AllKnownLayouts.ts + + + + + +test/Actors.spec.ts->Logic/UIEventSource.ts + + + + + +test/Actors.spec.ts->Logic/Actors/SelectedElementTagsUpdater.ts + + + + + +test/Actors.spec.ts->Logic/Actors/SelectedFeatureHandler.ts + + + + + +test/Actors.spec.ts->Logic/ElementStorage.ts + + + + + +test/Actors.spec.ts->Logic/State/UserRelatedState.ts + + + + + +test/TestHelper.ts + + +TestHelper.ts + + + + + +test/Actors.spec.ts->test/TestHelper.ts + + + + + +test/GeoOperations.spec.ts + + +GeoOperations.spec.ts + + + + + +test/GeoOperations.spec.ts->Utils.ts + + + + + +test/GeoOperations.spec.ts->Logic/GeoOperations.ts + + + + + +test/GeoOperations.spec.ts->Logic/BBox.ts + + + + + +test/GeoOperations.spec.ts->assert + + + + + +test/GeoOperations.spec.ts->test/TestHelper.ts + + + + + +test/ImageAttribution.spec.ts + + +ImageAttribution.spec.ts + + + + + +test/ImageAttribution.spec.ts->Models/ThemeConfig/LayerConfig.ts + + + + + +test/ImageAttribution.spec.ts->Utils.ts + + + + + +test/ImageAttribution.spec.ts->UI/i18n/Translation.ts + + + + + +test/ImageAttribution.spec.ts->assert + + + + + +test/ImageAttribution.spec.ts->assets/layers/bike_repair_station/bike_repair_station.json + + + + + +test/ImageAttribution.spec.ts->test/TestHelper.ts + + + + + +test/ImageProvider.spec.ts + + +ImageProvider.spec.ts + + + + + +test/ImageProvider.spec.ts->Utils.ts + + + + + +test/ImageProvider.spec.ts->Logic/UIEventSource.ts + + + + + +test/ImageProvider.spec.ts->Logic/ImageProviders/AllImageProviders.ts + + + + + +test/ImageProvider.spec.ts->test/TestHelper.ts + + + + + +test/LegacyThemeLoader.spec.ts + + +LegacyThemeLoader.spec.ts + + + + + +test/LegacyThemeLoader.spec.ts->Models/ThemeConfig/LayoutConfig.ts + + + + + +test/LegacyThemeLoader.spec.ts->Models/ThemeConfig/LegacyJsonConvert.ts + + + + + +test/LegacyThemeLoader.spec.ts->test/TestHelper.ts + + + + + +test/OsmObject.spec.ts + + +OsmObject.spec.ts + + + + + +test/OsmObject.spec.ts->Logic/Osm/OsmObject.ts + + + + + +test/OsmObject.spec.ts->test/TestHelper.ts + + + + + +test/RelationSplitHandler.spec.ts + + +RelationSplitHandler.spec.ts + + + + + +test/RelationSplitHandler.spec.ts->Utils.ts + + + + + +test/RelationSplitHandler.spec.ts->Logic/Osm/OsmObject.ts + + + + + +test/RelationSplitHandler.spec.ts->Logic/Osm/Actions/RelationSplitHandler.ts + + + + + +test/RelationSplitHandler.spec.ts->Logic/Osm/Changes.ts + + + + + +test/RelationSplitHandler.spec.ts->test/TestHelper.ts + + + + + +test/ReplaceGeometry.spec.ts + + +ReplaceGeometry.spec.ts + + + + + +test/ReplaceGeometry.spec.ts->Utils.ts + + + + + +test/ReplaceGeometry.spec.ts->test/TestHelper.ts + + + + + +test/SplitAction.spec.ts + + +SplitAction.spec.ts + + + + + +test/SplitAction.spec.ts->Utils.ts + + + + + +test/SplitAction.spec.ts->Logic/Osm/Actions/SplitAction.ts + + + + + +test/SplitAction.spec.ts->Logic/Osm/Changes.ts + + + + + +test/SplitAction.spec.ts->assert + + + + + +test/SplitAction.spec.ts->test/TestHelper.ts + + + + + +test/Tag.spec.ts + + +Tag.spec.ts + + + + + +test/Tag.spec.ts->Utils.ts + + + + + +test/Tag.spec.ts->Models/ThemeConfig/TagRenderingConfig.ts + + + + + +test/Tag.spec.ts->UI/i18n/Locale.ts + + + + + +test/Tag.spec.ts->UI/i18n/Translations.ts + + + + + +test/Tag.spec.ts->Logic/Tags/And.ts + + + + + +test/Tag.spec.ts->Logic/Tags/Tag.ts + + + + + +test/Tag.spec.ts->Logic/Tags/TagUtils.ts + + + + + +test/Tag.spec.ts->UI/i18n/Translation.ts + + + + + +test/Tag.spec.ts->UI/OpeningHours/OpeningHours.ts + + + + + +test/Tag.spec.ts->assert + + + + + +test/Tag.spec.ts->test/TestHelper.ts + + + + + +test/TestAll.ts + + +TestAll.ts + + + + + +test/TestAll.ts->Utils.ts + + + + + +test/TestAll.ts->scripts/ScriptUtils.ts + + + + + +test/TestAll.ts->test/Actors.spec.ts + + + + + +test/TestAll.ts->test/GeoOperations.spec.ts + + + + + +test/TestAll.ts->test/ImageAttribution.spec.ts + + + + + +test/TestAll.ts->test/ImageProvider.spec.ts + + + + + +test/TestAll.ts->test/LegacyThemeLoader.spec.ts + + + + + +test/TestAll.ts->test/OsmObject.spec.ts + + + + + +test/TestAll.ts->test/RelationSplitHandler.spec.ts + + + + + +test/TestAll.ts->test/ReplaceGeometry.spec.ts + + + + + +test/TestAll.ts->test/SplitAction.spec.ts + + + + + +test/TestAll.ts->test/Tag.spec.ts + + + + + +test/Theme.spec.ts + + +Theme.spec.ts + + + + + +test/TestAll.ts->test/Theme.spec.ts + + + + + +test/TileFreshnessCalculator.spec.ts + + +TileFreshnessCalculator.spec.ts + + + + + +test/TestAll.ts->test/TileFreshnessCalculator.spec.ts + + + + + +test/Units.spec.ts + + +Units.spec.ts + + + + + +test/TestAll.ts->test/Units.spec.ts + + + + + +test/Utils.spec.ts + + +Utils.spec.ts + + + + + +test/TestAll.ts->test/Utils.spec.ts + + + + + +test/Wikidata.spec.test.ts + + +Wikidata.spec.test.ts + + + + + +test/TestAll.ts->test/Wikidata.spec.test.ts + + + + + +test/Theme.spec.ts->Utils.ts + + + + + +test/Theme.spec.ts->Models/ThemeConfig/LayoutConfig.ts + + + + + +test/Theme.spec.ts->assert + + + + + +test/Theme.spec.ts->test/TestHelper.ts + + + + + +test/TileFreshnessCalculator.spec.ts->Models/TileRange.ts + + + + + +test/TileFreshnessCalculator.spec.ts->Logic/FeatureSource/TileFreshnessCalculator.ts + + + + + +test/TileFreshnessCalculator.spec.ts->assert + + + + + +test/TileFreshnessCalculator.spec.ts->test/TestHelper.ts + + + + + +test/Units.spec.ts->Models/Denomination.ts + + + + + +test/Units.spec.ts->Models/Unit.ts + + + + + +test/Units.spec.ts->assert + + + + + +test/Units.spec.ts->test/TestHelper.ts + + + + + +test/Utils.spec.ts->Utils.ts + + + + + +test/Utils.spec.ts->assert + + + + + +test/Utils.spec.ts->test/TestHelper.ts + + + + + +test/Wikidata.spec.test.ts->Utils.ts + + + + + +test/Wikidata.spec.test.ts->Logic/Web/Wikidata.ts + + + + + +test/Wikidata.spec.test.ts->assert + + + + + +test/Wikidata.spec.test.ts->test/TestHelper.ts + + + + + diff --git a/scripts/generateDocs.ts b/scripts/generateDocs.ts index fa79ed9d7..ff0d3fc0d 100644 --- a/scripts/generateDocs.ts +++ b/scripts/generateDocs.ts @@ -2,7 +2,7 @@ import {Utils} from "../Utils"; import SpecialVisualizations from "../UI/SpecialVisualizations"; import SimpleMetaTagger from "../Logic/SimpleMetaTagger"; import Combine from "../UI/Base/Combine"; -import {ExtraFunction} from "../Logic/ExtraFunction"; +import {ExtraFunctions} from "../Logic/ExtraFunctions"; import ValidatedTextField from "../UI/Input/ValidatedTextField"; import BaseUIElement from "../UI/BaseUIElement"; import Translations from "../UI/i18n/Translations"; @@ -39,7 +39,7 @@ function WriteFile(filename, html: BaseUIElement, autogenSource: string[]): void } WriteFile("./Docs/SpecialRenderings.md", SpecialVisualizations.HelpMessage(), ["UI/SpecialVisualisations.ts"]) -WriteFile("./Docs/CalculatedTags.md", new Combine([new Title("Metatags", 1), SimpleMetaTagger.HelpText(), ExtraFunction.HelpText()]).SetClass("flex-col"), +WriteFile("./Docs/CalculatedTags.md", new Combine([new Title("Metatags", 1), SimpleMetaTagger.HelpText(), ExtraFunctions.HelpText()]).SetClass("flex-col"), ["SimpleMetaTagger", "ExtraFunction"]) WriteFile("./Docs/SpecialInputElements.md", ValidatedTextField.HelpText(), ["ValidatedTextField.ts"]); WriteFile("./Docs/BuiltinLayers.md", AllKnownLayouts.GenLayerOverviewText(), ["AllKnownLayers.ts"]) diff --git a/scripts/generateLayerOverview.ts b/scripts/generateLayerOverview.ts index c24fd4b03..a4fac7a54 100644 --- a/scripts/generateLayerOverview.ts +++ b/scripts/generateLayerOverview.ts @@ -7,6 +7,7 @@ import {LayerConfigJson} from "../Models/ThemeConfig/Json/LayerConfigJson"; import LayerConfig from "../Models/ThemeConfig/LayerConfig"; import {Translation} from "../UI/i18n/Translation"; import {Utils} from "../Utils"; +import AllKnownLayers from "../Customizations/AllKnownLayers"; // This scripts scans 'assets/layers/*.json' for layer definition files and 'assets/themes/*.json' for theme definition files. // It spits out an overview of those to be used to load them @@ -89,6 +90,7 @@ class LayerOverviewUtils { main(args: string[]) { + AllKnownLayers.runningGenerateScript = true; const layerFiles = ScriptUtils.getLayerFiles(); const themeFiles = ScriptUtils.getThemeFiles();