Many tweaks to use MC in an iframe with less clutter
This commit is contained in:
parent
894b0d45ca
commit
f88cb9a730
19 changed files with 384 additions and 236 deletions
|
@ -37,18 +37,19 @@ This document gives an overview of which URL-parameters can be used to influence
|
|||
22. [ overpassMaxZoom ](#-overpassmaxzoom-)
|
||||
23. [ osmApiTileSize ](#-osmapitilesize-)
|
||||
24. [ background ](#-background-)
|
||||
25. [ z ](#-z-)
|
||||
26. [ lat ](#-lat-)
|
||||
27. [ lon ](#-lon-)
|
||||
28. [ oauth_token ](#-oauth_token-)
|
||||
29. [ layer-public_bookcase ](#-layer-public_bookcase-)
|
||||
30. [ filter-public_bookcase-kid-books ](#-filter-public_bookcase-kid-books-)
|
||||
31. [ filter-public_bookcase-adult-books ](#-filter-public_bookcase-adult-books-)
|
||||
32. [ filter-public_bookcase-inside ](#-filter-public_bookcase-inside-)
|
||||
33. [ filter-public_bookcase-has_image ](#-filter-public_bookcase-has_image-)
|
||||
34. [ layer-note_import_public_bookcase ](#-layer-note_import_public_bookcase-)
|
||||
35. [ mode ](#-mode-)
|
||||
36. [ layer-<layer-id> ](#-layer-<layer-id>-)
|
||||
25. [ fs-layers-enabled ](#-fs-layers-enabled-)
|
||||
26. [ z ](#-z-)
|
||||
27. [ lat ](#-lat-)
|
||||
28. [ lon ](#-lon-)
|
||||
29. [ oauth_token ](#-oauth_token-)
|
||||
30. [ layer-public_bookcase ](#-layer-public_bookcase-)
|
||||
31. [ filter-public_bookcase-kid-books ](#-filter-public_bookcase-kid-books-)
|
||||
32. [ filter-public_bookcase-adult-books ](#-filter-public_bookcase-adult-books-)
|
||||
33. [ filter-public_bookcase-inside ](#-filter-public_bookcase-inside-)
|
||||
34. [ filter-public_bookcase-has_image ](#-filter-public_bookcase-has_image-)
|
||||
35. [ layer-note_import_public_bookcase ](#-layer-note_import_public_bookcase-)
|
||||
36. [ mode ](#-mode-)
|
||||
37. [ layer-<layer-id> ](#-layer-<layer-id>-)
|
||||
|
||||
What is a URL parameter?
|
||||
--------------------------
|
||||
|
@ -145,7 +146,7 @@ This documentation is defined in the source code at [FeatureSwitchState.ts](/src
|
|||
|
||||
Disables/Enables logging in and thus disables editing all together. This effectively puts MapComplete into read-only mode.
|
||||
|
||||
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L100)
|
||||
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L99)
|
||||
|
||||
The default value is _true_
|
||||
|
||||
|
@ -156,7 +157,7 @@ This documentation is defined in the source code at [FeatureSwitchState.ts](/src
|
|||
|
||||
Disables/Enables the search bar
|
||||
|
||||
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L115)
|
||||
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L114)
|
||||
|
||||
The default value is _true_
|
||||
|
||||
|
@ -167,7 +168,7 @@ This documentation is defined in the source code at [FeatureSwitchState.ts](/src
|
|||
|
||||
Disables/Enables the background layer control where a user can enable e.g. aerial imagery
|
||||
|
||||
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L120)
|
||||
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L119)
|
||||
|
||||
The default value is _true_
|
||||
|
||||
|
@ -178,7 +179,7 @@ This documentation is defined in the source code at [FeatureSwitchState.ts](/src
|
|||
|
||||
Disables/Enables the filter view where a user can enable/disable MapComplete-layers or filter for certain properties
|
||||
|
||||
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L126)
|
||||
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L125)
|
||||
|
||||
The default value is _true_
|
||||
|
||||
|
@ -189,7 +190,7 @@ This documentation is defined in the source code at [FeatureSwitchState.ts](/src
|
|||
|
||||
Disables/enables the help menu or welcome message
|
||||
|
||||
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L132)
|
||||
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L131)
|
||||
|
||||
The default value is _true_
|
||||
|
||||
|
@ -200,7 +201,7 @@ This documentation is defined in the source code at [FeatureSwitchState.ts](/src
|
|||
|
||||
Disables/enables the button to get in touch with the community
|
||||
|
||||
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L137)
|
||||
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L136)
|
||||
|
||||
The default value is _true_
|
||||
|
||||
|
@ -211,7 +212,7 @@ This documentation is defined in the source code at [FeatureSwitchState.ts](/src
|
|||
|
||||
Disables/Enables the extraLink button. By default, if in iframe mode and the welcome message is hidden, a popout button to the full mapcomplete instance is shown instead (unless disabled with this switch or another extraLink button is enabled)
|
||||
|
||||
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L142)
|
||||
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L141)
|
||||
|
||||
The default value is _true_
|
||||
|
||||
|
@ -222,7 +223,7 @@ This documentation is defined in the source code at [FeatureSwitchState.ts](/src
|
|||
|
||||
Disables/Enables the various links which go back to the index page with the theme overview
|
||||
|
||||
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L147)
|
||||
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L146)
|
||||
|
||||
The default value is _true_
|
||||
|
||||
|
@ -233,7 +234,7 @@ This documentation is defined in the source code at [FeatureSwitchState.ts](/src
|
|||
|
||||
Disables/Enables the 'Share-screen'-tab in the welcome message
|
||||
|
||||
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L152)
|
||||
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L151)
|
||||
|
||||
The default value is _true_
|
||||
|
||||
|
@ -244,7 +245,7 @@ This documentation is defined in the source code at [FeatureSwitchState.ts](/src
|
|||
|
||||
Disables/Enables the geolocation button
|
||||
|
||||
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L157)
|
||||
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L156)
|
||||
|
||||
The default value is _true_
|
||||
|
||||
|
@ -255,7 +256,7 @@ This documentation is defined in the source code at [FeatureSwitchState.ts](/src
|
|||
|
||||
Always show all questions
|
||||
|
||||
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L162)
|
||||
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L161)
|
||||
|
||||
The default value is _false_
|
||||
|
||||
|
@ -266,7 +267,7 @@ This documentation is defined in the source code at [FeatureSwitchState.ts](/src
|
|||
|
||||
Enable the export as GeoJSON and CSV button
|
||||
|
||||
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L168)
|
||||
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L167)
|
||||
|
||||
The default value is _true_
|
||||
|
||||
|
@ -277,7 +278,7 @@ This documentation is defined in the source code at [FeatureSwitchState.ts](/src
|
|||
|
||||
If true, 'dryrun' mode is activated. The app will behave as normal, except that changes to OSM will be printed onto the console instead of actually uploaded to osm.org
|
||||
|
||||
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L182)
|
||||
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L181)
|
||||
|
||||
The default value is _false_
|
||||
|
||||
|
@ -288,7 +289,7 @@ This documentation is defined in the source code at [FeatureSwitchState.ts](/src
|
|||
|
||||
If true, shows some extra debugging help such as all the available tags on every object
|
||||
|
||||
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L188)
|
||||
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L187)
|
||||
|
||||
The default value is _false_
|
||||
|
||||
|
@ -299,7 +300,7 @@ This documentation is defined in the source code at [FeatureSwitchState.ts](/src
|
|||
|
||||
If true, the location distance indication will not be written to the changeset and other privacy enhancing measures might be taken.
|
||||
|
||||
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L194)
|
||||
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L193)
|
||||
|
||||
The default value is _false_
|
||||
|
||||
|
@ -310,7 +311,7 @@ This documentation is defined in the source code at [FeatureSwitchState.ts](/src
|
|||
|
||||
Point mapcomplete to a different overpass-instance. Example: https://overpass-api.de/api/interpreter
|
||||
|
||||
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L200)
|
||||
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L199)
|
||||
|
||||
The default value is _https://overpass-api.de/api/interpreter,https://overpass.kumi.systems/api/interpreter,https://overpass.openstreetmap.ru/cgi/interpreter_
|
||||
|
||||
|
@ -321,7 +322,7 @@ This documentation is defined in the source code at [FeatureSwitchState.ts](/src
|
|||
|
||||
Set a different timeout (in seconds) for queries in overpass
|
||||
|
||||
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L211)
|
||||
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L210)
|
||||
|
||||
The default value is _30_
|
||||
|
||||
|
@ -332,7 +333,7 @@ This documentation is defined in the source code at [FeatureSwitchState.ts](/src
|
|||
|
||||
point to switch between OSM-api and overpass
|
||||
|
||||
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L219)
|
||||
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L218)
|
||||
|
||||
The default value is _16_
|
||||
|
||||
|
@ -343,7 +344,7 @@ This documentation is defined in the source code at [FeatureSwitchState.ts](/src
|
|||
|
||||
Tilesize when the OSM-API is used to fetch data within a BBOX
|
||||
|
||||
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L227)
|
||||
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L226)
|
||||
|
||||
The default value is _17_
|
||||
|
||||
|
@ -354,12 +355,23 @@ This documentation is defined in the source code at [FeatureSwitchState.ts](/src
|
|||
|
||||
The id of the background layer to start with
|
||||
|
||||
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L234)
|
||||
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L233)
|
||||
|
||||
No default value set
|
||||
|
||||
|
||||
|
||||
fs-layers-enabled
|
||||
-------------------
|
||||
|
||||
If set to false, all layers will be disabled - except the explicitly enabled layers
|
||||
|
||||
This documentation is defined in the source code at [FeatureSwitchState.ts](/src/Logic/State/FeatureSwitchState.ts#L239)
|
||||
|
||||
The default value is _true_
|
||||
|
||||
|
||||
|
||||
z
|
||||
---
|
||||
|
||||
|
@ -398,7 +410,7 @@ This documentation is defined in the source code at [InitialMapPositioning.ts](/
|
|||
|
||||
Used to complete the login
|
||||
|
||||
This documentation is defined in the source code at [ThemeViewState.ts](/src/Models/ThemeViewState.ts#L168)
|
||||
This documentation is defined in the source code at [ThemeViewState.ts](/src/Models/ThemeViewState.ts#L174)
|
||||
|
||||
No default value set
|
||||
|
||||
|
@ -409,7 +421,7 @@ This documentation is defined in the source code at [ThemeViewState.ts](/src/Mod
|
|||
|
||||
Whether or not layer public_bookcase is shown
|
||||
|
||||
This documentation is defined in the source code at [FilteredLayer.ts](/src/Models/FilteredLayer.ts#L105)
|
||||
This documentation is defined in the source code at [FilteredLayer.ts](/src/Models/FilteredLayer.ts#L110)
|
||||
|
||||
The default value is _true_
|
||||
|
||||
|
@ -464,7 +476,7 @@ This documentation is defined in the source code at [FilterConfig.ts](/src/Model
|
|||
|
||||
Whether or not layer note_import_public_bookcase is shown
|
||||
|
||||
This documentation is defined in the source code at [FilteredLayer.ts](/src/Models/FilteredLayer.ts#L105)
|
||||
This documentation is defined in the source code at [FilteredLayer.ts](/src/Models/FilteredLayer.ts#L110)
|
||||
|
||||
The default value is _true_
|
||||
|
||||
|
|
|
@ -2743,6 +2743,7 @@
|
|||
"_last_edit:passed_time>=300"
|
||||
]
|
||||
},
|
||||
"metacondition": "__featureSwitchEnableLogin=true",
|
||||
"render": {
|
||||
"special": {
|
||||
"type": "if_nothing_known",
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
{
|
||||
"id": "summary",
|
||||
"description": "Special layer which shows `count`",
|
||||
"description": "Special layer which shows `count`, probably provided by the clustering server or some clustering algorithm",
|
||||
"source": "special",
|
||||
"title": {
|
||||
"render": {
|
||||
|
@ -16,7 +16,14 @@
|
|||
"centroid"
|
||||
],
|
||||
"iconSize": "40,40",
|
||||
"label": "{total_metric}",
|
||||
"label": {
|
||||
"mappings": [
|
||||
{
|
||||
"if": "total_metric!=0",
|
||||
"then": "{total_metric}"
|
||||
}
|
||||
]
|
||||
},
|
||||
"labelCss": "background: #ffffffbb",
|
||||
"labelCssClasses": "w-12 text-lg rounded-xl p-1 px-2"
|
||||
}
|
||||
|
|
|
@ -116,7 +116,8 @@
|
|||
"centroid"
|
||||
]
|
||||
}
|
||||
]
|
||||
],
|
||||
"isCounted": false
|
||||
}
|
||||
},
|
||||
{
|
||||
|
@ -152,7 +153,8 @@
|
|||
"filter": {
|
||||
"sameAs": "charging_station_ebikes"
|
||||
},
|
||||
"minzoom": 18
|
||||
"minzoom": 18,
|
||||
"isCounted": false
|
||||
}
|
||||
},
|
||||
{
|
||||
|
@ -178,7 +180,8 @@
|
|||
"filter": {
|
||||
"sameAs": "vending_machine_bicycle"
|
||||
},
|
||||
"minzoom": 18
|
||||
"minzoom": 18,
|
||||
"isCounted": false
|
||||
}
|
||||
}
|
||||
],
|
||||
|
|
|
@ -1,13 +1,20 @@
|
|||
{
|
||||
"id": "mapcomplete-changes",
|
||||
"title": {
|
||||
"en": "Changes made with MapComplete"
|
||||
"en": "Changes made with MapComplete",
|
||||
"da": "Ændringer lavet med MapComplete",
|
||||
"de": "Änderungen mit MapComplete"
|
||||
},
|
||||
"shortDescription": {
|
||||
"en": "Shows changes made by MapComplete"
|
||||
"en": "Shows changes made by MapComplete",
|
||||
"da": "Vis ændringer lavet med MapComplete",
|
||||
"de": "Änderungen von MapComplete anzeigen"
|
||||
},
|
||||
"description": {
|
||||
"en": "This maps shows all the changes made with MapComplete"
|
||||
"en": "This maps shows all the changes made with MapComplete",
|
||||
"da": "Dette kort viser alle ændringer foretaget med MapComplete",
|
||||
"de": "Diese Karte zeigt alle mit MapComplete vorgenommenen Änderungen",
|
||||
"pl": "Ta mapa pokazuje wszystkie zmiany wprowadzone za pomocą MapComplete"
|
||||
},
|
||||
"icon": "./assets/svg/logo.svg",
|
||||
"hideFromOverview": true,
|
||||
|
@ -18,7 +25,9 @@
|
|||
{
|
||||
"id": "mapcomplete-changes",
|
||||
"name": {
|
||||
"en": "Changeset centers"
|
||||
"en": "Changeset centers",
|
||||
"de": "Zentrum der Änderungssätze",
|
||||
"zh_Hant": "變更集中心"
|
||||
},
|
||||
"minzoom": 0,
|
||||
"source": {
|
||||
|
@ -28,41 +37,51 @@
|
|||
},
|
||||
"title": {
|
||||
"render": {
|
||||
"en": "Changeset for {theme}"
|
||||
"en": "Changeset for {theme}",
|
||||
"de": "Änderungssatz für {theme}"
|
||||
}
|
||||
},
|
||||
"description": {
|
||||
"en": "Shows all MapComplete changes"
|
||||
"en": "Shows all MapComplete changes",
|
||||
"da": "Vis alle MapComplete-ændringer",
|
||||
"de": "Alle MapComplete-Änderungen anzeigen"
|
||||
},
|
||||
"tagRenderings": [
|
||||
{
|
||||
"id": "show_changeset_id",
|
||||
"render": {
|
||||
"en": "Changeset <a href='https://openstreetmap.org/changeset/{id}' target='_blank'>{id}</a>"
|
||||
"en": "Changeset <a href='https://openstreetmap.org/changeset/{id}' target='_blank'>{id}</a>",
|
||||
"de": "Änderungssatz <a href='https://openstreetmap.org/changeset/{id}' target='_blank'>{id}</a>"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "contributor",
|
||||
"question": {
|
||||
"en": "What contributor did make this change?"
|
||||
"en": "What contributor did make this change?",
|
||||
"da": "Hvilke bidragsydere lavede denne ændring?",
|
||||
"de": "Welcher Mitwirkende hat diese Änderung vorgenommen?"
|
||||
},
|
||||
"freeform": {
|
||||
"key": "user"
|
||||
},
|
||||
"render": {
|
||||
"en": "Change made by <a href='https://openstreetmap.org/user/{user}' target='_blank'>{user}</a>"
|
||||
"en": "Change made by <a href='https://openstreetmap.org/user/{user}' target='_blank'>{user}</a>",
|
||||
"da": "Ændring lavet af <a href='https://openstreetmap.org/user/{user}' target='_blank'>{user}</a>",
|
||||
"de": "Änderung vorgenommen von <a href='https://openstreetmap.org/user/{user}' target='_blank'>{user}</a>"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "theme-id",
|
||||
"question": {
|
||||
"en": "What theme was used to make this change?"
|
||||
"en": "What theme was used to make this change?",
|
||||
"de": "Welches Thema wurde für die Änderung verwendet?"
|
||||
},
|
||||
"freeform": {
|
||||
"key": "theme"
|
||||
},
|
||||
"render": {
|
||||
"en": "Change with theme <a href='https://mapcomplete.org/{theme}'>{theme}</a>"
|
||||
"en": "Change with theme <a href='https://mapcomplete.org/{theme}'>{theme}</a>",
|
||||
"de": "Geändert mit Thema <a href='https://mapcomplete.osm.be/{theme}'>{theme}</a>"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
@ -71,19 +90,23 @@
|
|||
"key": "locale"
|
||||
},
|
||||
"question": {
|
||||
"en": "What locale (language) was this change made in?"
|
||||
"en": "What locale (language) was this change made in?",
|
||||
"de": "In welcher Benutzersprache wurde die Änderung vorgenommen?"
|
||||
},
|
||||
"render": {
|
||||
"en": "User locale is {locale}"
|
||||
"en": "User locale is {locale}",
|
||||
"de": "Benutzersprache {locale}"
|
||||
}
|
||||
},
|
||||
{
|
||||
"id": "host",
|
||||
"render": {
|
||||
"en": "Change with with <a href='{host}'>{host}</a>"
|
||||
"en": "Change with with <a href='{host}'>{host}</a>",
|
||||
"de": "Änderung über <a href='{host}'>{host}</a>"
|
||||
},
|
||||
"question": {
|
||||
"en": "What host (website) was this change made with?"
|
||||
"en": "What host (website) was this change made with?",
|
||||
"de": "Über welchen Host (Webseite) wurde diese Änderung vorgenommen?"
|
||||
},
|
||||
"freeform": {
|
||||
"key": "host"
|
||||
|
@ -104,10 +127,13 @@
|
|||
{
|
||||
"id": "version",
|
||||
"question": {
|
||||
"en": "What version of MapComplete was used to make this change?"
|
||||
"en": "What version of MapComplete was used to make this change?",
|
||||
"de": "Mit welcher MapComplete Version wurde die Änderung vorgenommen?"
|
||||
},
|
||||
"render": {
|
||||
"en": "Made with {editor}"
|
||||
"en": "Made with {editor}",
|
||||
"da": "Lavet med {editor}",
|
||||
"de": "Erstellt mit {editor}"
|
||||
},
|
||||
"freeform": {
|
||||
"key": "editor"
|
||||
|
@ -493,7 +519,10 @@
|
|||
}
|
||||
],
|
||||
"question": {
|
||||
"en": "Themename contains {search}"
|
||||
"en": "Themename contains {search}",
|
||||
"da": "Temanavn indeholder {search}",
|
||||
"de": "Themenname enthält {search}",
|
||||
"pl": "Nazwa tematu zawiera {search}"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
@ -509,7 +538,9 @@
|
|||
}
|
||||
],
|
||||
"question": {
|
||||
"en": "Themename does <b>not</b> contain {search}"
|
||||
"en": "Themename does <b>not</b> contain {search}",
|
||||
"da": "Temanavn indeholder <b>ikke</b> {search}",
|
||||
"de": "Themename enthält <b>not</b> {search}"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
@ -525,7 +556,9 @@
|
|||
}
|
||||
],
|
||||
"question": {
|
||||
"en": "Made by contributor {search}"
|
||||
"en": "Made by contributor {search}",
|
||||
"da": "Lavet af bidragsyder {search}",
|
||||
"de": "Erstellt vom Mitwirkenden {search}"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
@ -541,7 +574,9 @@
|
|||
}
|
||||
],
|
||||
"question": {
|
||||
"en": "<b>Not</b> made by contributor {search}"
|
||||
"en": "<b>Not</b> made by contributor {search}",
|
||||
"da": "<b>Ikke</b> lavet af bidragsyder {search}",
|
||||
"de": "<b>Nicht</b> erstellt von Mitwirkendem {search}"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
@ -558,7 +593,9 @@
|
|||
}
|
||||
],
|
||||
"question": {
|
||||
"en": "Made before {search}"
|
||||
"en": "Made before {search}",
|
||||
"da": "Lavet før {search}",
|
||||
"de": "Erstellt vor {search}"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
@ -575,7 +612,9 @@
|
|||
}
|
||||
],
|
||||
"question": {
|
||||
"en": "Made after {search}"
|
||||
"en": "Made after {search}",
|
||||
"da": "Lavet efter {search}",
|
||||
"de": "Erstellt nach {search}"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
@ -591,7 +630,8 @@
|
|||
}
|
||||
],
|
||||
"question": {
|
||||
"en": "User language (iso-code) {search}"
|
||||
"en": "User language (iso-code) {search}",
|
||||
"de": "Benutzersprache (ISO-Code) {search}"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
@ -607,7 +647,8 @@
|
|||
}
|
||||
],
|
||||
"question": {
|
||||
"en": "Made with host {search}"
|
||||
"en": "Made with host {search}",
|
||||
"de": "Erstellt mit Host {search}"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
@ -618,7 +659,8 @@
|
|||
{
|
||||
"osmTags": "add-image>0",
|
||||
"question": {
|
||||
"en": "Changeset added at least one image"
|
||||
"en": "Changeset added at least one image",
|
||||
"de": "Änderungssatz hat mindestens ein Bild hinzugefügt"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
@ -629,7 +671,8 @@
|
|||
{
|
||||
"osmTags": "theme!=grb",
|
||||
"question": {
|
||||
"en": "Exclude GRB theme"
|
||||
"en": "Exclude GRB theme",
|
||||
"de": "GRB-Thema ausschließen"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
@ -640,7 +683,8 @@
|
|||
{
|
||||
"osmTags": "theme!=etymology",
|
||||
"question": {
|
||||
"en": "Exclude etymology theme"
|
||||
"en": "Exclude etymology theme",
|
||||
"de": "Etymologie-Thema ausschließen"
|
||||
}
|
||||
}
|
||||
]
|
||||
|
@ -655,7 +699,8 @@
|
|||
{
|
||||
"id": "link_to_more",
|
||||
"render": {
|
||||
"en": "More statistics can be found <a href='https://github.com/pietervdvn/MapComplete/tree/develop/Docs/Tools/graphs' target='_blank'>here</a>"
|
||||
"en": "More statistics can be found <a href='https://github.com/pietervdvn/MapComplete/tree/develop/Docs/Tools/graphs' target='_blank'>here</a>",
|
||||
"de": "Weitere Statistiken gibt es <a href='https://github.com/pietervdvn/MapComplete/tree/develop/Docs/Tools/graphs' target='_blank'>hier</a>"
|
||||
}
|
||||
},
|
||||
{
|
||||
|
|
|
@ -59,7 +59,7 @@
|
|||
"currentInOsmIs": "Momentan hat OpenStreetMap den folgenden Wert erfasst:",
|
||||
"done": "Fertig",
|
||||
"error": "Verknüpfte Daten konnten nicht von der Website geladen werden",
|
||||
"lastModified": "Die externen Daten wurden zuletzt am {Datum} geändert",
|
||||
"lastModified": "Die externen Daten wurden zuletzt am {date} geändert",
|
||||
"loadedFrom": "Die folgenden Daten werden von <a href={url}>{source}</a> unter Verwendung des eingebetteten JSON-LD geladen",
|
||||
"missing": {
|
||||
"intro": "OpenStreetMap hat keine Informationen über die folgenden Attribute",
|
||||
|
|
|
@ -322,6 +322,7 @@
|
|||
"openStreetMapIntro": "<h3>An Open Map</h3><p>One that everyone can use and edit freely. A single place to store all geo-info. Different, small, incompatible and outdated maps are not needed anywhere.</p><p><b><a href='https://OpenStreetMap.org' target='_blank'>OpenStreetMap</a></b> is not the enemy map. The map data can be used freely (with <a href='https://osm.org/copyright' target='_blank'>attribution and publication of changes to that data</a>). Everyone can add new data and fix errors. This website uses OpenStreetMap. All the data is from there, and your answers and corrections are used all over.</p><p>Many people and apps already use OpenStreetMap: <a href='https://organicmaps.app/' target='_blank'>Organic Maps</a>, <a href='https://osmAnd.net' target='_blank'>OsmAnd</a>, but also the maps at Facebook, Instagram, Apple-maps and Bing-maps are (partly) powered by OpenStreetMap.</p>",
|
||||
"openTheMap": "Open the map",
|
||||
"openTheMapAtGeolocation": "Zoom to your location",
|
||||
"openTheMapReason": "to view, edit and add information",
|
||||
"opening_hours": {
|
||||
"all_days_from": "Opened every day {ranges}",
|
||||
"closed_permanently": "Closed for an unknown duration",
|
||||
|
@ -401,9 +402,15 @@
|
|||
"copiedToClipboard": "Link copied to clipboard",
|
||||
"documentation": "For more information on available URL-parameters, <a href='https://github.com/pietervdvn/MapComplete/blob/develop/Docs/URL_Parameters.md' target='_blank'>consult the documentation</a>",
|
||||
"embedIntro": "<h3>Embed on your website</h3>Please, embed this map into your website. <br/>We encourage you to do it - you don't even have to ask permission. <br/> It is free, and always will be. The more people are using this, the more valuable it becomes.",
|
||||
"fsBackground": "Enable switching backgrounds",
|
||||
"fsFilter": "Enable the possibility to toggle layers and filters",
|
||||
"fsGeolocation": "Enable geolocation",
|
||||
"fsUserbadge": "Enable the login button",
|
||||
"fsWelcomeMessage": "Show the welcome message popup and associated tabs",
|
||||
"intro": "<h3>Share this map</h3> Share this map by copying the link below and sending it to friends and family:",
|
||||
"openLayers": "Open the layers and filters menu",
|
||||
"options": "Sharing options",
|
||||
"stateIsIncluded": "The current state of the layers and filters is included in the shared link and iframe.",
|
||||
"thanksForSharing": "Thanks for sharing!",
|
||||
"title": "Share this map"
|
||||
},
|
||||
|
|
|
@ -51,7 +51,7 @@ export class SummaryTileSourceRewriter implements FeatureSource {
|
|||
...f.properties,
|
||||
id: f.properties.id + bitmap,
|
||||
total: newTotal,
|
||||
total_metric: Utils.numberWithMetrixPrefix(newTotal),
|
||||
total_metric: Utils.numberWithMetricPrefix(newTotal),
|
||||
},
|
||||
})
|
||||
fullTotal += newTotal
|
||||
|
@ -101,12 +101,12 @@ export class SummaryTileSource extends DynamicTileSource {
|
|||
return SummaryTileSource.empty
|
||||
}
|
||||
const counts = count["success"]
|
||||
if (counts === undefined || counts["total"] === 0) {
|
||||
const total = Number(counts?.["total"] ?? 0)
|
||||
if (total === 0) {
|
||||
return SummaryTileSource.empty
|
||||
}
|
||||
const lat = counts["lat"]
|
||||
const lon = counts["lon"]
|
||||
const total = Number(counts["total"])
|
||||
const tileBbox = new BBox(Tiles.tile_bounds_lon_lat(z, x, y))
|
||||
if (!tileBbox.contains([lon, lat])) {
|
||||
console.error(
|
||||
|
@ -128,7 +128,7 @@ export class SummaryTileSource extends DynamicTileSource {
|
|||
summary: "yes",
|
||||
...counts,
|
||||
total,
|
||||
total_metric: Utils.numberWithMetrixPrefix(total),
|
||||
total_metric: Utils.numberWithMetricPrefix(total),
|
||||
layers: layersSummed,
|
||||
},
|
||||
geometry: {
|
||||
|
|
|
@ -18,14 +18,14 @@ class FeatureSwitchUtils {
|
|||
key,
|
||||
"" + defaultValue,
|
||||
documentation,
|
||||
{ stackOffset: -1 }
|
||||
{ stackOffset: -1 },
|
||||
)
|
||||
|
||||
// It takes the current layout, extracts the default value for this query parameter. A query parameter event source is then retrieved and flattened
|
||||
return queryParam.sync(
|
||||
(str) => (str === undefined ? defaultValue : str !== "false"),
|
||||
[],
|
||||
(b) => (b == defaultValue ? undefined : "" + b)
|
||||
(b) => (b == defaultValue ? undefined : "" + b),
|
||||
)
|
||||
}
|
||||
}
|
||||
|
@ -37,7 +37,7 @@ export class OsmConnectionFeatureSwitches {
|
|||
this.featureSwitchFakeUser = QueryParameters.GetBooleanQueryParameter(
|
||||
"fake-user",
|
||||
false,
|
||||
"If true, 'dryrun' mode is activated and a fake user account is loaded"
|
||||
"If true, 'dryrun' mode is activated and a fake user account is loaded",
|
||||
)
|
||||
}
|
||||
}
|
||||
|
@ -99,14 +99,14 @@ export default class FeatureSwitchState extends OsmConnectionFeatureSwitches {
|
|||
this.featureSwitchEnableLogin = FeatureSwitchUtils.initSwitch(
|
||||
"fs-enable-login",
|
||||
layoutToUse?.enableUserBadge ?? true,
|
||||
"Disables/Enables logging in and thus disables editing all together. This effectively puts MapComplete into read-only mode."
|
||||
"Disables/Enables logging in and thus disables editing all together. This effectively puts MapComplete into read-only mode.",
|
||||
)
|
||||
{
|
||||
if (QueryParameters.wasInitialized("fs-userbadge")) {
|
||||
// userbadge is the legacy name for 'enable-login'
|
||||
this.featureSwitchEnableLogin.setData(
|
||||
QueryParameters.GetBooleanQueryParameter("fs-userbadge", undefined, "Legacy")
|
||||
.data
|
||||
.data,
|
||||
)
|
||||
}
|
||||
}
|
||||
|
@ -114,60 +114,64 @@ export default class FeatureSwitchState extends OsmConnectionFeatureSwitches {
|
|||
this.featureSwitchSearch = FeatureSwitchUtils.initSwitch(
|
||||
"fs-search",
|
||||
layoutToUse?.enableSearch ?? true,
|
||||
"Disables/Enables the search bar"
|
||||
"Disables/Enables the search bar",
|
||||
)
|
||||
this.featureSwitchBackgroundSelection = FeatureSwitchUtils.initSwitch(
|
||||
"fs-background",
|
||||
layoutToUse?.enableBackgroundLayerSelection ?? true,
|
||||
"Disables/Enables the background layer control where a user can enable e.g. aerial imagery"
|
||||
"Disables/Enables the background layer control where a user can enable e.g. aerial imagery",
|
||||
)
|
||||
|
||||
this.featureSwitchFilter = FeatureSwitchUtils.initSwitch(
|
||||
"fs-filter",
|
||||
layoutToUse?.enableLayers ?? true,
|
||||
"Disables/Enables the filter view where a user can enable/disable MapComplete-layers or filter for certain properties"
|
||||
"Disables/Enables the filter view where a user can enable/disable MapComplete-layers or filter for certain properties",
|
||||
)
|
||||
|
||||
this.featureSwitchWelcomeMessage = FeatureSwitchUtils.initSwitch(
|
||||
"fs-welcome-message",
|
||||
true,
|
||||
"Disables/enables the help menu or welcome message"
|
||||
"Disables/enables the help menu or welcome message",
|
||||
)
|
||||
this.featureSwitchCommunityIndex = FeatureSwitchUtils.initSwitch(
|
||||
"fs-community-index",
|
||||
this.featureSwitchEnableLogin.data,
|
||||
"Disables/enables the button to get in touch with the community"
|
||||
"Disables/enables the button to get in touch with the community",
|
||||
)
|
||||
this.featureSwitchExtraLinkEnabled = FeatureSwitchUtils.initSwitch(
|
||||
"fs-iframe-popout",
|
||||
true,
|
||||
"Disables/Enables the extraLink button. By default, if in iframe mode and the welcome message is hidden, a popout button to the full mapcomplete instance is shown instead (unless disabled with this switch or another extraLink button is enabled)"
|
||||
"Disables/Enables the extraLink button. By default, if in iframe mode and the welcome message is hidden, a popout button to the full mapcomplete instance is shown instead (unless disabled with this switch or another extraLink button is enabled)",
|
||||
)
|
||||
this.featureSwitchBackToThemeOverview = FeatureSwitchUtils.initSwitch(
|
||||
"fs-homepage-link",
|
||||
layoutToUse?.enableMoreQuests ?? true,
|
||||
"Disables/Enables the various links which go back to the index page with the theme overview"
|
||||
"Disables/Enables the various links which go back to the index page with the theme overview",
|
||||
)
|
||||
this.featureSwitchShareScreen = FeatureSwitchUtils.initSwitch(
|
||||
"fs-share-screen",
|
||||
layoutToUse?.enableShareScreen ?? true,
|
||||
"Disables/Enables the 'Share-screen'-tab in the welcome message"
|
||||
"Disables/Enables the 'Share-screen'-tab in the welcome message",
|
||||
)
|
||||
this.featureSwitchGeolocation = FeatureSwitchUtils.initSwitch(
|
||||
"fs-geolocation",
|
||||
layoutToUse?.enableGeolocation ?? true,
|
||||
"Disables/Enables the geolocation button"
|
||||
"Disables/Enables the geolocation button",
|
||||
)
|
||||
|
||||
this.featureSwitchLayerDefault = QueryParameters.GetBooleanQueryParameter("fs-layers-enabled", true,
|
||||
"If set to false, all layers will be disabled - except the explicitly enabled layers",
|
||||
)
|
||||
this.featureSwitchShowAllQuestions = FeatureSwitchUtils.initSwitch(
|
||||
"fs-all-questions",
|
||||
layoutToUse?.enableShowAllQuestions ?? false,
|
||||
"Always show all questions"
|
||||
"Always show all questions",
|
||||
)
|
||||
|
||||
this.featureSwitchEnableExport = FeatureSwitchUtils.initSwitch(
|
||||
"fs-export",
|
||||
layoutToUse?.enableExportButton ?? true,
|
||||
"Enable the export as GeoJSON and CSV button"
|
||||
"Enable the export as GeoJSON and CSV button",
|
||||
)
|
||||
|
||||
let testingDefaultValue = false
|
||||
|
@ -181,63 +185,60 @@ export default class FeatureSwitchState extends OsmConnectionFeatureSwitches {
|
|||
this.featureSwitchIsTesting = QueryParameters.GetBooleanQueryParameter(
|
||||
"test",
|
||||
testingDefaultValue,
|
||||
"If true, 'dryrun' mode is activated. The app will behave as normal, except that changes to OSM will be printed onto the console instead of actually uploaded to osm.org"
|
||||
"If true, 'dryrun' mode is activated. The app will behave as normal, except that changes to OSM will be printed onto the console instead of actually uploaded to osm.org",
|
||||
)
|
||||
|
||||
this.featureSwitchIsDebugging = QueryParameters.GetBooleanQueryParameter(
|
||||
"debug",
|
||||
false,
|
||||
"If true, shows some extra debugging help such as all the available tags on every object"
|
||||
"If true, shows some extra debugging help such as all the available tags on every object",
|
||||
)
|
||||
|
||||
this.featureSwitchMorePrivacy = QueryParameters.GetBooleanQueryParameter(
|
||||
"moreprivacy",
|
||||
layoutToUse.enableMorePrivacy,
|
||||
"If true, the location distance indication will not be written to the changeset and other privacy enhancing measures might be taken."
|
||||
"If true, the location distance indication will not be written to the changeset and other privacy enhancing measures might be taken.",
|
||||
)
|
||||
|
||||
this.overpassUrl = QueryParameters.GetQueryParameter(
|
||||
"overpassUrl",
|
||||
(layoutToUse?.overpassUrl ?? Constants.defaultOverpassUrls).join(","),
|
||||
"Point mapcomplete to a different overpass-instance. Example: https://overpass-api.de/api/interpreter"
|
||||
"Point mapcomplete to a different overpass-instance. Example: https://overpass-api.de/api/interpreter",
|
||||
).sync(
|
||||
(param) => param?.split(","),
|
||||
[],
|
||||
(urls) => urls?.join(",")
|
||||
(urls) => urls?.join(","),
|
||||
)
|
||||
|
||||
this.overpassTimeout = UIEventSource.asInt(
|
||||
QueryParameters.GetQueryParameter(
|
||||
"overpassTimeout",
|
||||
"" + layoutToUse?.overpassTimeout,
|
||||
"Set a different timeout (in seconds) for queries in overpass"
|
||||
)
|
||||
"Set a different timeout (in seconds) for queries in overpass",
|
||||
),
|
||||
)
|
||||
|
||||
this.overpassMaxZoom = UIEventSource.asFloat(
|
||||
QueryParameters.GetQueryParameter(
|
||||
"overpassMaxZoom",
|
||||
"" + layoutToUse?.overpassMaxZoom,
|
||||
" point to switch between OSM-api and overpass"
|
||||
)
|
||||
" point to switch between OSM-api and overpass",
|
||||
),
|
||||
)
|
||||
|
||||
this.osmApiTileSize = UIEventSource.asInt(
|
||||
QueryParameters.GetQueryParameter(
|
||||
"osmApiTileSize",
|
||||
"" + layoutToUse?.osmApiTileSize,
|
||||
"Tilesize when the OSM-API is used to fetch data within a BBOX"
|
||||
)
|
||||
"Tilesize when the OSM-API is used to fetch data within a BBOX",
|
||||
),
|
||||
)
|
||||
|
||||
this.backgroundLayerId = QueryParameters.GetQueryParameter(
|
||||
"background",
|
||||
layoutToUse?.defaultBackgroundId,
|
||||
"The id of the background layer to start with"
|
||||
"The id of the background layer to start with",
|
||||
)
|
||||
|
||||
this.featureSwitchLayerDefault = QueryParameters.GetBooleanQueryParameter("fs-layers-enabled",true,
|
||||
"If set to false, all layers will be disabled - except the explicitly enabled layers"
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,42 +1,14 @@
|
|||
import { Utils } from "../../Utils"
|
||||
/** This code is autogenerated - do not edit. Edit ./assets/layers/usersettings/usersettings.json instead */
|
||||
export class ThemeMetaTagging {
|
||||
public static readonly themeName = "usersettings"
|
||||
public static readonly themeName = "usersettings"
|
||||
|
||||
public metaTaggging_for_usersettings(feat: { properties: Record<string, string> }) {
|
||||
Utils.AddLazyProperty(feat.properties, "_mastodon_candidate_md", () =>
|
||||
feat.properties._description
|
||||
.match(/\[[^\]]*\]\((.*(mastodon|en.osm.town).*)\).*/)
|
||||
?.at(1)
|
||||
)
|
||||
Utils.AddLazyProperty(
|
||||
feat.properties,
|
||||
"_d",
|
||||
() => feat.properties._description?.replace(/</g, "<")?.replace(/>/g, ">") ?? ""
|
||||
)
|
||||
Utils.AddLazyProperty(feat.properties, "_mastodon_candidate_a", () =>
|
||||
((feat) => {
|
||||
const e = document.createElement("div")
|
||||
e.innerHTML = feat.properties._d
|
||||
return Array.from(e.getElementsByTagName("a")).filter(
|
||||
(a) => a.href.match(/mastodon|en.osm.town/) !== null
|
||||
)[0]?.href
|
||||
})(feat)
|
||||
)
|
||||
Utils.AddLazyProperty(feat.properties, "_mastodon_link", () =>
|
||||
((feat) => {
|
||||
const e = document.createElement("div")
|
||||
e.innerHTML = feat.properties._d
|
||||
return Array.from(e.getElementsByTagName("a")).filter(
|
||||
(a) => a.getAttribute("rel")?.indexOf("me") >= 0
|
||||
)[0]?.href
|
||||
})(feat)
|
||||
)
|
||||
Utils.AddLazyProperty(
|
||||
feat.properties,
|
||||
"_mastodon_candidate",
|
||||
() => feat.properties._mastodon_candidate_md ?? feat.properties._mastodon_candidate_a
|
||||
)
|
||||
feat.properties["__current_backgroun"] = "initial_value"
|
||||
}
|
||||
}
|
||||
public metaTaggging_for_usersettings(feat: {properties: Record<string, string>}) {
|
||||
Utils.AddLazyProperty(feat.properties, '_mastodon_candidate_md', () => feat.properties._description.match(/\[[^\]]*\]\((.*(mastodon|en.osm.town).*)\).*/)?.at(1) )
|
||||
Utils.AddLazyProperty(feat.properties, '_d', () => feat.properties._description?.replace(/</g,'<')?.replace(/>/g,'>') ?? '' )
|
||||
Utils.AddLazyProperty(feat.properties, '_mastodon_candidate_a', () => (feat => {const e = document.createElement('div');e.innerHTML = feat.properties._d;return Array.from(e.getElementsByTagName("a")).filter(a => a.href.match(/mastodon|en.osm.town/) !== null)[0]?.href }) (feat) )
|
||||
Utils.AddLazyProperty(feat.properties, '_mastodon_link', () => (feat => {const e = document.createElement('div');e.innerHTML = feat.properties._d;return Array.from(e.getElementsByTagName("a")).filter(a => a.getAttribute("rel")?.indexOf('me') >= 0)[0]?.href})(feat) )
|
||||
Utils.AddLazyProperty(feat.properties, '_mastodon_candidate', () => feat.properties._mastodon_candidate_md ?? feat.properties._mastodon_candidate_a )
|
||||
feat.properties['__current_backgroun'] = 'initial_value'
|
||||
}
|
||||
}
|
|
@ -120,6 +120,11 @@ export class MenuState {
|
|||
name: "community",
|
||||
showOverOthers: true,
|
||||
},
|
||||
{
|
||||
toggle: this.filtersPanelIsOpened,
|
||||
name: "filters",
|
||||
showOverOthers: true,
|
||||
},
|
||||
{
|
||||
toggle: this.menuIsOpened,
|
||||
name: "menu",
|
||||
|
@ -135,11 +140,7 @@ export class MenuState {
|
|||
name: "background",
|
||||
showOverOthers: true,
|
||||
},
|
||||
{
|
||||
toggle: this.filtersPanelIsOpened,
|
||||
name: "filters",
|
||||
showOverOthers: true,
|
||||
},
|
||||
|
||||
]
|
||||
for (const toggle of this.allToggles) {
|
||||
toggle.toggle.addCallback((isOpen) => {
|
||||
|
|
|
@ -328,7 +328,7 @@ export default class PointRenderingConfig extends WithContextLoader {
|
|||
?.SetClass("flex items-center justify-center absolute marker-label")
|
||||
?.SetClass(cssClassesLabel)
|
||||
if (cssLabel) {
|
||||
label.SetStyle(cssLabel)
|
||||
label?.SetStyle(cssLabel)
|
||||
} else if (labelOnly) {
|
||||
return label?.SetStyle("transform: translate(-50%, -50%);")
|
||||
}
|
||||
|
|
|
@ -365,7 +365,7 @@ export default class ThemeViewState implements SpecialVisualizationState {
|
|||
)
|
||||
this.favourites = new FavouritesFeatureSource(this)
|
||||
|
||||
this.featureSummary = this.setupSummaryLayer()
|
||||
this.featureSummary = this.setupSummaryLayer(new LayerConfig(<LayerConfigJson> summaryLayer, "summaryLayer", true))
|
||||
this.toCacheSavers = this.initSaveToLocalStorage()
|
||||
this.initActors()
|
||||
this.drawSpecialLayers()
|
||||
|
@ -681,7 +681,7 @@ export default class ThemeViewState implements SpecialVisualizationState {
|
|||
)
|
||||
}
|
||||
|
||||
private setupSummaryLayer(): SummaryTileSourceRewriter {
|
||||
private setupSummaryLayer(summaryLayerConfig: LayerConfig): SummaryTileSourceRewriter {
|
||||
/**
|
||||
* MaxZoom for the summary layer
|
||||
*/
|
||||
|
@ -707,7 +707,9 @@ export default class ThemeViewState implements SpecialVisualizationState {
|
|||
isActive: this.mapProperties.zoom.map((z) => z < maxzoom),
|
||||
}
|
||||
)
|
||||
return new SummaryTileSourceRewriter(summaryTileSource, this.layerState.filteredLayers)
|
||||
|
||||
const src =new SummaryTileSourceRewriter(summaryTileSource, this.layerState.filteredLayers)
|
||||
return src
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -793,10 +795,10 @@ export default class ThemeViewState implements SpecialVisualizationState {
|
|||
selectedElement: this.selectedElement,
|
||||
})
|
||||
})
|
||||
|
||||
const summaryLayerConfig = new LayerConfig(<LayerConfigJson>summaryLayer, "summaryLayer")
|
||||
new ShowDataLayer(this.map, {
|
||||
features: specialLayers.summary,
|
||||
layer: new LayerConfig(<LayerConfigJson>summaryLayer, "summaryLayer"),
|
||||
layer: summaryLayerConfig,
|
||||
// doShowLayer: this.mapProperties.zoom.map((z) => z < maxzoom),
|
||||
selectedElement: this.selectedElement,
|
||||
})
|
||||
|
|
59
src/UI/Base/Copyable.svelte
Normal file
59
src/UI/Base/Copyable.svelte
Normal file
|
@ -0,0 +1,59 @@
|
|||
<script lang="ts">
|
||||
|
||||
import { Utils } from "../../Utils"
|
||||
import Share from "@babeard/svelte-heroicons/solid/Share"
|
||||
import { DocumentDuplicateIcon } from "@rgossiaux/svelte-heroicons/outline"
|
||||
import Tr from "./Tr.svelte"
|
||||
import Translations from "../i18n/Translations"
|
||||
import ThemeViewState from "../../Models/ThemeViewState"
|
||||
const tr = Translations.t.general.sharescreen
|
||||
|
||||
export let text: string
|
||||
export let state: ThemeViewState = undefined
|
||||
async function shareCurrentLink() {
|
||||
await navigator.share({
|
||||
title: Translations.W(state.layout.title)?.ConstructElement().textContent ?? "MapComplete",
|
||||
text: Translations.W(state.layout.description)?.ConstructElement().textContent ?? "",
|
||||
url: text,
|
||||
})
|
||||
}
|
||||
|
||||
let isCopied = false
|
||||
|
||||
async function copyCurrentLink() {
|
||||
await navigator.clipboard.writeText(text)
|
||||
isCopied = true
|
||||
await Utils.waitFor(5000)
|
||||
isCopied = false
|
||||
}
|
||||
</script>
|
||||
|
||||
<div class="flex flex-col">
|
||||
|
||||
<div class="flex">
|
||||
<div class="literal-code" on:click={(e) => Utils.selectTextIn(e.target)}>
|
||||
{text}
|
||||
</div>
|
||||
<div class="flex flex-col">
|
||||
{#if typeof navigator?.share === "function" && state !== undefined}
|
||||
<button class="h-8 w-8 shrink-0 p-1" on:click={shareCurrentLink}>
|
||||
<Share />
|
||||
</button>
|
||||
{/if}
|
||||
{#if navigator.clipboard !== undefined}
|
||||
<button class="no-image-background h-8 w-8 shrink-0 p-1" on:click={copyCurrentLink}>
|
||||
<DocumentDuplicateIcon />
|
||||
</button>
|
||||
{/if}
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
<div class="flex justify-center">
|
||||
{#if isCopied}
|
||||
<Tr t={tr.copiedToClipboard} cls="thanks m-2" />
|
||||
{/if}
|
||||
</div>
|
||||
</div>
|
|
@ -15,7 +15,10 @@
|
|||
import ToSvelte from "../Base/ToSvelte.svelte"
|
||||
import Img from "../Base/Img"
|
||||
import Qr from "../../Utils/Qr"
|
||||
import AccordionSingle from "../Flowbite/AccordionSingle.svelte"
|
||||
import Share from "@babeard/svelte-heroicons/solid/Share"
|
||||
import Constants from "../../Models/Constants"
|
||||
import Copyable from "../Base/Copyable.svelte"
|
||||
|
||||
export let state: ThemeViewState
|
||||
const tr = Translations.t.general.sharescreen
|
||||
|
@ -24,98 +27,106 @@
|
|||
let linkToShare: string = undefined
|
||||
/**
|
||||
* In some cases (local deploys, custom themes), we need to set the URL to `/theme.html?layout=xyz` instead of `/xyz?...`
|
||||
* Note that the 'layout='-param will be included automatically
|
||||
*/
|
||||
let needsThemeRedirect = url.port !== "" || url.hostname.match(/^[0-9]/) || !state.layout.official
|
||||
let layoutId = state.layout.id
|
||||
let baseLink =
|
||||
url.protocol +
|
||||
"//" +
|
||||
url.host +
|
||||
"/" +
|
||||
(needsThemeRedirect ? "theme.html?layout=" + layoutId + "&" : layoutId + "?")
|
||||
`${url.protocol}//${url.host}/${needsThemeRedirect ? "theme.html" : layoutId}?`
|
||||
|
||||
let showWelcomeMessage = true
|
||||
let enableLogin = true
|
||||
$: {
|
||||
let enableFilters = true
|
||||
let enableBackground = true
|
||||
let enableGeolocation = true
|
||||
|
||||
function calculateLinkToShare(
|
||||
showWelcomeMessage: boolean,
|
||||
enableLogin: boolean,
|
||||
enableFilters: boolean,
|
||||
enableBackground: boolean,
|
||||
enableGeolocation: boolean) {
|
||||
const layout = state.layout
|
||||
let excluded = Utils.NoNull([
|
||||
showWelcomeMessage ? undefined : "fs-welcome-message",
|
||||
enableLogin ? undefined : "fs-enable-login",
|
||||
enableFilters ? undefined : "fs-filter",
|
||||
enableBackground ? undefined : "fs-background",
|
||||
enableGeolocation ? undefined : "fs-geolocation",
|
||||
|
||||
])
|
||||
linkToShare =
|
||||
baseLink +
|
||||
QueryParameters.GetParts(new Set(excluded))
|
||||
.concat(excluded.map((k) => k + "=" + false))
|
||||
.join("&")
|
||||
const layerParamsWhitelist: string[] = ["fs-layers-enabled=false"]
|
||||
const layerParamsBlacklist: string[] = []
|
||||
|
||||
for (const flayer of state.layerState.filteredLayers.values()) {
|
||||
const id = flayer.layerDef.id
|
||||
if (flayer.layerDef.filterIsSameAs) {
|
||||
continue
|
||||
}
|
||||
if (id.indexOf("note_import") >= 0) {
|
||||
continue
|
||||
}
|
||||
if (Constants.added_by_default.indexOf(<any>id) >= 0) {
|
||||
continue
|
||||
}
|
||||
const enabled = flayer.isDisplayed.data
|
||||
if (enabled) {
|
||||
layerParamsWhitelist.push("layer-" + id + "=true")
|
||||
} else {
|
||||
layerParamsBlacklist.push("layer-" + id + "=false")
|
||||
}
|
||||
}
|
||||
|
||||
const layersBlack = layerParamsBlacklist.join("&")
|
||||
const layersWhite = layerParamsWhitelist.join("&")
|
||||
const layers = layersBlack.length < layersWhite.length ? layerParamsBlacklist : layerParamsWhitelist
|
||||
const params = QueryParameters.GetParts(new Set(excluded))
|
||||
.filter(part => !part.startsWith("layer-"))
|
||||
.concat(...layers)
|
||||
.concat(excluded.map((k) => k + "=" + false))
|
||||
linkToShare = baseLink + Utils.Dedup(params).join("&")
|
||||
|
||||
if (layout.definitionRaw !== undefined) {
|
||||
linkToShare += "&userlayout=" + (layout.definedAtUrl ?? layout.id)
|
||||
}
|
||||
}
|
||||
|
||||
async function shareCurrentLink() {
|
||||
await navigator.share({
|
||||
title: Translations.W(state.layout.title)?.ConstructElement().textContent ?? "MapComplete",
|
||||
text: Translations.W(state.layout.description)?.ConstructElement().textContent ?? "",
|
||||
url: linkToShare,
|
||||
})
|
||||
}
|
||||
$: calculateLinkToShare(showWelcomeMessage, enableLogin, enableFilters, enableBackground, enableGeolocation)
|
||||
|
||||
let isCopied = false
|
||||
let iframeCode: string
|
||||
$: iframeCode = `<iframe src="${linkToShare}"
|
||||
${enableGeolocation ? 'allow="geolocation"' : ""} width="100%" height="100%" style="min-width: 250px; min-height: 250px"
|
||||
title="${state.layout.title?.txt ?? "MapComplete"} with MapComplete">
|
||||
</iframe>`
|
||||
|
||||
Array.from(state.layerState.filteredLayers.values()).forEach(flayer => flayer.isDisplayed.addCallbackAndRunD(_ => {
|
||||
calculateLinkToShare(showWelcomeMessage, enableLogin, enableFilters, enableBackground, enableGeolocation)
|
||||
}))
|
||||
|
||||
async function copyCurrentLink() {
|
||||
await navigator.clipboard.writeText(linkToShare)
|
||||
isCopied = true
|
||||
await Utils.waitFor(5000)
|
||||
isCopied = false
|
||||
}
|
||||
</script>
|
||||
|
||||
<div class="flex flex-col">
|
||||
<div class="flex items-start justify-between">
|
||||
<div class="flex flex-col">
|
||||
<Tr t={tr.intro} />
|
||||
<div class="flex">
|
||||
{#if typeof navigator?.share === "function"}
|
||||
<button class="h-8 w-8 shrink-0 p-1" on:click={shareCurrentLink}>
|
||||
<Share />
|
||||
</button>
|
||||
{/if}
|
||||
{#if navigator.clipboard !== undefined}
|
||||
<button class="no-image-background h-8 w-8 shrink-0 p-1" on:click={copyCurrentLink}>
|
||||
<DocumentDuplicateIcon />
|
||||
</button>
|
||||
{/if}
|
||||
<div class="literal-code" on:click={(e) => Utils.selectTextIn(e.target)}>
|
||||
{linkToShare}
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex flex-col">
|
||||
<Tr t={tr.intro} />
|
||||
|
||||
<Copyable {state} text={linkToShare}/>
|
||||
|
||||
|
||||
</div>
|
||||
<div class="flex justify-center">
|
||||
|
||||
<ToSvelte
|
||||
construct={() => new Img(new Qr(linkToShare).toImageElement(125)).SetStyle("width: 125px")}
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div class="flex justify-center">
|
||||
{#if isCopied}
|
||||
<Tr t={tr.copiedToClipboard} cls="thanks m-2" />
|
||||
{/if}
|
||||
</div>
|
||||
|
||||
<Tr t={tr.embedIntro} />
|
||||
|
||||
<div class="interactive flex flex-col p-1">
|
||||
<div class="literal-code m-1">
|
||||
<span class="literal-code iframe-code-block"> <br />
|
||||
<iframe src="{linkToShare}"
|
||||
<br />
|
||||
allow="geolocation" width="100%" height="100%" style="min-width: 250px; min-height: 250px"
|
||||
<br />
|
||||
title="{state.layout.title?.txt ?? "MapComplete"} with MapComplete">
|
||||
<br />
|
||||
</iframe>
|
||||
<br />
|
||||
</span>
|
||||
<Copyable text={iframeCode}/>
|
||||
|
||||
<AccordionSingle>
|
||||
<div slot="header">
|
||||
<Tr t={tr.options}/>
|
||||
</div>
|
||||
<div class="link-underline my-1 flex flex-col">
|
||||
<label>
|
||||
|
@ -127,7 +138,34 @@
|
|||
<input bind:checked={enableLogin} type="checkbox" id="share_enable_login" />
|
||||
<Tr t={tr.fsUserbadge} />
|
||||
</label>
|
||||
|
||||
|
||||
<label>
|
||||
<input bind:checked={enableFilters} type="checkbox" id="share_enable_filter" />
|
||||
<Tr t={tr.fsFilter} />
|
||||
</label>
|
||||
|
||||
|
||||
<label>
|
||||
<input bind:checked={enableBackground} type="checkbox" id="share_enable_background" />
|
||||
<Tr t={tr.fsBackground} />
|
||||
</label>
|
||||
|
||||
<label>
|
||||
<input bind:checked={enableGeolocation} type="checkbox" id="share_enable_geolocation" />
|
||||
<Tr t={tr.fsGeolocation} />
|
||||
</label>
|
||||
|
||||
<span>
|
||||
|
||||
<Tr t={tr.stateIsIncluded}/>
|
||||
<a class="inline-block w-fit cursor-pointer" on:click={() => state.guistate.filtersPanelIsOpened.set(true)}>
|
||||
<Tr t={tr.openLayers}/>
|
||||
</a>
|
||||
</span>
|
||||
|
||||
<Tr cls="link-underline" t={tr.documentation} />
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<Tr cls="link-underline" t={tr.documentation} />
|
||||
</AccordionSingle>
|
||||
</div>
|
||||
|
|
|
@ -63,8 +63,13 @@
|
|||
|
||||
<!-- Buttons: open map, go to location, search -->
|
||||
<NextButton clss="primary w-full" on:click={() => state.guistate.themeIsOpened.setData(false)}>
|
||||
<div class="flex w-full justify-center text-2xl">
|
||||
<Tr t={Translations.t.general.openTheMap} />
|
||||
<div class="flex flex-col w-full items-center">
|
||||
<div class="flex w-full justify-center text-2xl">
|
||||
<Tr t={Translations.t.general.openTheMap} />
|
||||
</div>
|
||||
<If condition={state.featureSwitches.featureSwitchEnableLogin}>
|
||||
<Tr t={Translations.t.general.openTheMapReason} />
|
||||
</If>
|
||||
</div>
|
||||
</NextButton>
|
||||
|
||||
|
|
|
@ -100,15 +100,21 @@
|
|||
})
|
||||
|
||||
let selectedLayer: Store<LayerConfig> = state.selectedElement.mapD((element) => {
|
||||
if (element.properties.id.startsWith("current_view")) {
|
||||
const id = element.properties.id
|
||||
if (id.startsWith("current_view")) {
|
||||
return currentViewLayer
|
||||
}
|
||||
if (element.properties.id.startsWith(LastClickFeatureSource.newPointElementId)) {
|
||||
if(id.startsWith("summary_")){
|
||||
console.log("Not selecting a summary object. The summary object is", element)
|
||||
return undefined
|
||||
}
|
||||
if (id.startsWith(LastClickFeatureSource.newPointElementId)) {
|
||||
return layout.layers.find((l) => l.id === "last_click")
|
||||
}
|
||||
if (element.properties.id === "location_track") {
|
||||
if (id === "location_track") {
|
||||
return layout.layers.find((l) => l.id === "gps_track")
|
||||
}
|
||||
|
||||
return state.layout.getMatchingLayer(element.properties)
|
||||
})
|
||||
let currentZoom = state.mapProperties.zoom
|
||||
|
|
|
@ -1643,7 +1643,7 @@ In the case that MapComplete is pointed to the testing grounds, the edit will be
|
|||
*
|
||||
* Supported metric prefixes are: [k, M, G, T, P, E]
|
||||
*/
|
||||
public static numberWithMetrixPrefix(n: number) {
|
||||
public static numberWithMetricPrefix(n: number) {
|
||||
let index = 0
|
||||
while (n > 1000) {
|
||||
n = Math.round(n / 1000)
|
||||
|
|
|
@ -1,12 +1 @@
|
|||
{
|
||||
"sections": [
|
||||
"# How to work with TagRenderings\n\nThe information box shows various attributes of the selected feature in a human friendly way.\n\nThis is done by a **tagRendering** which converts attributes into text.\n\nThis can be done by using **predefined options** (mappings) or with a **render**-string\n",
|
||||
"# Predefined options\n\nA predefined option states that, `if` a certain tag is present, `then` a certain text should be shown.\n\nFor example, a playground may be lit or not.\nIn OpenStreetMap, this is encoded with the tag `lit=yes` or `lit=no`. We might want to show `This playground is lit at night` and `This playground is not lit at night` to users of MapComplete.\n\nThis is what this will look like in the interface:\n\n<img class=\"w-1/2\" src=\"./assets/docs/PredefinedOption.png\"/>\n",
|
||||
"# Substituting attributes\n\nIf none of the predefined options match, the string given in the `render`-field is used (under the question _\"What text should be rendered?\"_).\n\nA special property about all shown texts is that, **if the name of a key appears between braces, this will be replaced by the corresponding value**.\n\nFor example, if the object has tags `min_age=3` and the text to display is `Accessible to kids older than {min_age} years`, then this will be displayed to the user as **Accessible to kids older than 3 years**\n\nNote that this also works withing predifined options\n",
|
||||
"# Special values\n\nSpecial components can be summoned by calling them. For example, the relevant wikipedia will be displayed by entering the text `{wikipedia()}`. A table with opening hours is displayed with `{opening_hours()}`. For a full reference, [see the documentation](https://github.com/pietervdvn/MapComplete/blob/master/Docs/SpecialRenderings.md).\n",
|
||||
"# Requesting data with predefined options\n\nThese renderings can be turned into a way to contribute data easily. If a **question** is provided, then these renderings will be asked if unknown or gain the pencil to make changes. \n\nA predefined option will show up as an option that can be picked.\n<img class=\"w-1/2\" src=\"./assets/docs/QuestionPredefinedOptions.png\"/>\n",
|
||||
"# Requesting data with an input field\n\nIt is also possible to have a text field. For this, the **key** to write into must be given (_What is the name of the attribute that should be written to?_), in this case `max_age`.\n<img class=\"w-1/2\" src=\"./assets/docs/QuestionTextField.png\"/>\n",
|
||||
"# Combining predefined options and freeform text\n\nA text field and predefined options can be combined. The contributor can then choose between a predefined option or filling out something.\n<img class=\"w-1/2\" src=\"./assets/docs/QuestionCombined.png\"/>\n",
|
||||
"# Selecting multiple values\n\nOne can set a question to allow multiple answers. This works with predefined options or a freeform text field.\n\n<img class=\"w-1/2\" src=\"./assets/docs/QuestionMulti.png\"/>\n\nNote that these will be rendered as a list:\n\n<img class=\"w-1/2\" src=\"./assets/docs/RenderMulti.png\"/>\n"
|
||||
]
|
||||
}
|
||||
{"sections":["# How to work with TagRenderings\n\nThe information box shows various attributes of the selected feature in a human friendly way.\n\nThis is done by a **tagRendering** which converts attributes into text.\n\nThis can be done by using **predefined options** (mappings) or with a **render**-string\n","# Predefined options\n\nA predefined option states that, `if` a certain tag is present, `then` a certain text should be shown.\n\nFor example, a playground may be lit or not.\nIn OpenStreetMap, this is encoded with the tag `lit=yes` or `lit=no`. We might want to show `This playground is lit at night` and `This playground is not lit at night` to users of MapComplete.\n\nThis is what this will look like in the interface:\n\n<img class=\"h-fit\" src=\"./assets/docs/PredefinedOption.png\"/>\n","# Substituting attributes\n\nIf none of the predefined options match, the string given in the `render`-field is used (under the question _\"What text should be rendered?\"_).\n\nA special property about all shown texts is that, **if the name of a key appears between braces, this will be replaced by the corresponding value**.\n\nFor example, if the object has tags `min_age=3` and the text to display is `Accessible to kids older than {min_age} years`, then this will be displayed to the user as **Accessible to kids older than 3 years**\n\nNote that this also works withing predifined options\n","# Special values\n\nSpecial components can be summoned by calling them. For example, the relevant wikipedia will be displayed by entering the text `{wikipedia()}`. A table with opening hours is displayed with `{opening_hours()}`. For a full reference, [see the documentation](https://github.com/pietervdvn/MapComplete/blob/master/Docs/SpecialRenderings.md).\n","# Requesting data with predefined options\n\nThese renderings can be turned into a way to contribute data easily. If a **question** is provided, then these renderings will be asked if unknown or gain the pencil to make changes. \n\nA predefined option will show up as an option that can be picked.\n<img class=\"w-1/2\" src=\"./assets/docs/QuestionPredefinedOptions.png\"/>\n","# Requesting data with an input field\n\nIt is also possible to have a text field. For this, the **key** to write into must be given (_What is the name of the attribute that should be written to?_), in this case `max_age`.\n<img class=\"w-1/2\" src=\"./assets/docs/QuestionTextField.png\"/>\n","# Combining predefined options and freeform text\n\nA text field and predefined options can be combined. The contributor can then choose between a predefined option or filling out something.\n<img class=\"w-1/2\" src=\"./assets/docs/QuestionCombined.png\"/>\n","# Selecting multiple values\n\nOne can set a question to allow multiple answers. This works with predefined options or a freeform text field.\n\n<img class=\"w-1/2 h-fit\" src=\"./assets/docs/QuestionMulti.png\"/>\n\nNote that these will be rendered as a list:\n\n<img class=\"w-1/2 h-fit\" src=\"./assets/docs/RenderMulti.png\"/>\n"]}
|
Loading…
Reference in a new issue