forked from MapComplete/MapComplete
Merge branch 'develop' into feature/studio
This commit is contained in:
commit
d9417f4937
135 changed files with 242 additions and 356 deletions
|
@ -53,7 +53,7 @@ The Graphical User Interface is composed of various UI-elements. For every UI-el
|
||||||
|
|
||||||
There are some basic elements, such as:
|
There are some basic elements, such as:
|
||||||
|
|
||||||
- `FixedUIElement` which shows a fixed, unchangeble element
|
- `FixedUIElement` which shows a fixed, unchangeable element
|
||||||
- `Img` to show an image
|
- `Img` to show an image
|
||||||
- `Combine` which wraps everything given (strings and other elements) in a div
|
- `Combine` which wraps everything given (strings and other elements) in a div
|
||||||
- `List`
|
- `List`
|
||||||
|
|
|
@ -34,6 +34,25 @@ export class UpdateLegacyLayer extends DesugaringStep<
|
||||||
delete config["overpassTags"]
|
delete config["overpassTags"]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (const preset of config.presets ?? []) {
|
||||||
|
const preciseInput = preset["preciseInput"]
|
||||||
|
if (typeof preciseInput === "boolean") {
|
||||||
|
delete preset["preciseInput"]
|
||||||
|
} else if (preciseInput !== undefined) {
|
||||||
|
delete preciseInput["preferredBackground"]
|
||||||
|
console.log("Precise input:", preciseInput)
|
||||||
|
preset.snapToLayer = preciseInput.snapToLayer
|
||||||
|
delete preciseInput.snapToLayer
|
||||||
|
if (preciseInput.maxSnapDistance) {
|
||||||
|
preset.maxSnapDistance = preciseInput.maxSnapDistance
|
||||||
|
delete preciseInput.maxSnapDistance
|
||||||
|
}
|
||||||
|
if (Object.keys(preciseInput).length == 0) {
|
||||||
|
delete preset["preciseInput"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (config.tagRenderings !== undefined) {
|
if (config.tagRenderings !== undefined) {
|
||||||
let i = 0
|
let i = 0
|
||||||
for (const tagRendering of config.tagRenderings) {
|
for (const tagRendering of config.tagRenderings) {
|
||||||
|
|
|
@ -282,36 +282,16 @@ export interface LayerConfigJson {
|
||||||
exampleImages?: string[]
|
exampleImages?: string[]
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* If set, the user will prompted to confirm the location before actually adding the data.
|
* If specified, these layers will be shown to and the new point will be snapped towards it
|
||||||
* This will be with a 'drag crosshair'-method.
|
|
||||||
*
|
|
||||||
* If 'preferredBackgroundCategory' is set, the element will attempt to pick a background layer of that category.
|
|
||||||
*/
|
*/
|
||||||
preciseInput?:
|
snapToLayer?: string | string[]
|
||||||
| true
|
/**
|
||||||
| {
|
* If specified, a new point will only be snapped if it is within this range.
|
||||||
/**
|
* Distance in meter
|
||||||
* The type of background picture
|
*
|
||||||
*/
|
* Default: 10
|
||||||
preferredBackground?:
|
*/
|
||||||
| "osmbasedmap"
|
maxSnapDistance?: number
|
||||||
| "photo"
|
|
||||||
| "historicphoto"
|
|
||||||
| "map"
|
|
||||||
| string
|
|
||||||
| string[]
|
|
||||||
/**
|
|
||||||
* If specified, these layers will be shown to and the new point will be snapped towards it
|
|
||||||
*/
|
|
||||||
snapToLayer?: string | string[]
|
|
||||||
/**
|
|
||||||
* If specified, a new point will only be snapped if it is within this range.
|
|
||||||
* Distance in meter
|
|
||||||
*
|
|
||||||
* Default: 10
|
|
||||||
*/
|
|
||||||
maxSnapDistance?: number
|
|
||||||
}
|
|
||||||
}[]
|
}[]
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -234,37 +234,27 @@ export default class LayerConfig extends WithContextLoader {
|
||||||
snapToLayers: undefined,
|
snapToLayers: undefined,
|
||||||
maxSnapDistance: undefined,
|
maxSnapDistance: undefined,
|
||||||
}
|
}
|
||||||
if (pr.preciseInput !== undefined) {
|
if (pr["preciseInput"] !== undefined) {
|
||||||
if (pr.preciseInput === true) {
|
throw "Layer " + this.id + " still uses the old 'preciseInput'-field"
|
||||||
pr.preciseInput = {
|
}
|
||||||
preferredBackground: undefined,
|
if (pr.snapToLayer !== undefined) {
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
let snapToLayers: string[]
|
let snapToLayers: string[]
|
||||||
if (typeof pr.preciseInput.snapToLayer === "string") {
|
if (typeof pr.snapToLayer === "string") {
|
||||||
snapToLayers = [pr.preciseInput.snapToLayer]
|
snapToLayers = [pr.snapToLayer]
|
||||||
} else {
|
} else {
|
||||||
snapToLayers = pr.preciseInput.snapToLayer
|
snapToLayers = pr.snapToLayer
|
||||||
}
|
}
|
||||||
|
|
||||||
let preferredBackground: (
|
|
||||||
| "map"
|
|
||||||
| "photo"
|
|
||||||
| "osmbasedmap"
|
|
||||||
| "historicphoto"
|
|
||||||
| string
|
|
||||||
)[]
|
|
||||||
if (typeof pr.preciseInput.preferredBackground === "string") {
|
|
||||||
preferredBackground = [pr.preciseInput.preferredBackground]
|
|
||||||
} else {
|
|
||||||
preferredBackground = pr.preciseInput.preferredBackground
|
|
||||||
}
|
|
||||||
preciseInput = {
|
preciseInput = {
|
||||||
preferredBackground,
|
|
||||||
snapToLayers,
|
snapToLayers,
|
||||||
maxSnapDistance: pr.preciseInput.maxSnapDistance ?? 10,
|
maxSnapDistance: pr.maxSnapDistance ?? 10,
|
||||||
}
|
}
|
||||||
|
} else if (pr.maxSnapDistance !== undefined) {
|
||||||
|
throw (
|
||||||
|
"Layer " +
|
||||||
|
this.id +
|
||||||
|
" defines a maxSnapDistance, but does not include a `snapToLayer`"
|
||||||
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
const config: PresetConfig = {
|
const config: PresetConfig = {
|
||||||
|
|
|
@ -50,12 +50,13 @@
|
||||||
on:mousemove={(e) => {
|
on:mousemove={(e) => {
|
||||||
if (isDown) {
|
if (isDown) {
|
||||||
onPosChange(e.clientX, e.clientY)
|
onPosChange(e.clientX, e.clientY)
|
||||||
|
e.preventDefault()
|
||||||
}
|
}
|
||||||
}}
|
}}
|
||||||
on:mouseup={() => {
|
on:mouseup={() => {
|
||||||
isDown = false
|
isDown = false
|
||||||
}}
|
}}
|
||||||
on:touchmove={(e) => onPosChange(e.touches[0].clientX, e.touches[0].clientY)}
|
on:touchmove={(e) =>{ onPosChange(e.touches[0].clientX, e.touches[0].clientY); e.preventDefault() }}
|
||||||
on:touchstart={(e) => onPosChange(e.touches[0].clientX, e.touches[0].clientY)}
|
on:touchstart={(e) => onPosChange(e.touches[0].clientX, e.touches[0].clientY)}
|
||||||
>
|
>
|
||||||
<div class="absolute top-0 left-0 h-full w-full cursor-pointer">
|
<div class="absolute top-0 left-0 h-full w-full cursor-pointer">
|
||||||
|
|
|
@ -83,7 +83,7 @@
|
||||||
|
|
||||||
<div class="min-h-32 relative h-full cursor-pointer overflow-hidden">
|
<div class="min-h-32 relative h-full cursor-pointer overflow-hidden">
|
||||||
<div class="absolute top-0 left-0 h-full w-full cursor-pointer">
|
<div class="absolute top-0 left-0 h-full w-full cursor-pointer">
|
||||||
<MaplibreMap {map} />
|
<MaplibreMap center={({lng: initialCoordinate.lon, lat: initialCoordinate.lat})}} {map} />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div
|
<div
|
||||||
|
|
|
@ -7,8 +7,9 @@
|
||||||
import { onMount } from "svelte"
|
import { onMount } from "svelte"
|
||||||
import { Map } from "@onsvisual/svelte-maps"
|
import { Map } from "@onsvisual/svelte-maps"
|
||||||
import type { Map as MaplibreMap } from "maplibre-gl"
|
import type { Map as MaplibreMap } from "maplibre-gl"
|
||||||
import type { Writable } from "svelte/store"
|
import type {Readable, Writable} from "svelte/store"
|
||||||
import { AvailableRasterLayers } from "../../Models/RasterLayers"
|
import { AvailableRasterLayers } from "../../Models/RasterLayers"
|
||||||
|
import {writable} from "svelte/store";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Beware: this map will _only_ be set by this component
|
* Beware: this map will _only_ be set by this component
|
||||||
|
@ -17,7 +18,7 @@
|
||||||
export let map: Writable<MaplibreMap>
|
export let map: Writable<MaplibreMap>
|
||||||
|
|
||||||
export let attribution = false
|
export let attribution = false
|
||||||
let center = {}
|
export let center: Readable<{ lng: number ,lat : number }> = writable({lng: 0, lat: 0})
|
||||||
|
|
||||||
onMount(() => {
|
onMount(() => {
|
||||||
$map.on("load", function () {
|
$map.on("load", function () {
|
||||||
|
|
|
@ -17,7 +17,7 @@ import SvelteUIElement from "./Base/SvelteUIElement"
|
||||||
import Filterview from "./BigComponents/Filterview.svelte"
|
import Filterview from "./BigComponents/Filterview.svelte"
|
||||||
import FilteredLayer from "../Models/FilteredLayer"
|
import FilteredLayer from "../Models/FilteredLayer"
|
||||||
|
|
||||||
class StatisticsForOverviewFile extends Combine {
|
class StatsticsForOverviewFile extends Combine {
|
||||||
constructor(homeUrl: string, paths: string[]) {
|
constructor(homeUrl: string, paths: string[]) {
|
||||||
paths = paths.filter((p) => !p.endsWith("file-overview.json"))
|
paths = paths.filter((p) => !p.endsWith("file-overview.json"))
|
||||||
const layer = new LayoutConfig(<any>mcChanges, true).layers[0]
|
const layer = new LayoutConfig(<any>mcChanges, true).layers[0]
|
||||||
|
@ -177,7 +177,7 @@ class StatisticsForOverviewFile extends Combine {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export default class StatisticsGUI extends VariableUiElement {
|
class StatisticsGUI extends VariableUiElement {
|
||||||
private static readonly homeUrl =
|
private static readonly homeUrl =
|
||||||
"https://raw.githubusercontent.com/pietervdvn/MapComplete-data/main/changeset-metadata/"
|
"https://raw.githubusercontent.com/pietervdvn/MapComplete-data/main/changeset-metadata/"
|
||||||
private static readonly stats_files = "file-overview.json"
|
private static readonly stats_files = "file-overview.json"
|
||||||
|
@ -192,7 +192,7 @@ export default class StatisticsGUI extends VariableUiElement {
|
||||||
return new Loading("Loading overview...")
|
return new Loading("Loading overview...")
|
||||||
}
|
}
|
||||||
|
|
||||||
return new StatisticsForOverviewFile(StatisticsGUI.homeUrl, paths)
|
return new StatsticsForOverviewFile(StatisticsGUI.homeUrl, paths)
|
||||||
})
|
})
|
||||||
)
|
)
|
||||||
this.SetClass("block w-full h-full")
|
this.SetClass("block w-full h-full")
|
||||||
|
|
|
@ -1059,9 +1059,7 @@
|
||||||
"cs": "plakátovací skříň připevněná na stěnu",
|
"cs": "plakátovací skříň připevněná na stěnu",
|
||||||
"pt": "uma caixa de pôster montada em uma parede"
|
"pt": "uma caixa de pôster montada em uma parede"
|
||||||
},
|
},
|
||||||
"preciseInput": {
|
"snapToLayer": "walls_and_buildings"
|
||||||
"snapToLayer": "walls_and_buildings"
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"tags": [
|
"tags": [
|
||||||
|
@ -1175,16 +1173,13 @@
|
||||||
"fr": "un écran fixé au mur",
|
"fr": "un écran fixé au mur",
|
||||||
"pt": "uma tela montada em uma parede"
|
"pt": "uma tela montada em uma parede"
|
||||||
},
|
},
|
||||||
"preciseInput": {
|
|
||||||
"preferredBackground": "map",
|
|
||||||
"snapToLayer": "walls_and_buildings",
|
|
||||||
"maxSnapDistance": 5
|
|
||||||
},
|
|
||||||
"exampleImages": [
|
"exampleImages": [
|
||||||
"./assets/themes/advertising/Subway_screen.jpg",
|
"./assets/themes/advertising/Subway_screen.jpg",
|
||||||
"./assets/themes/advertising/TV_media.jpg",
|
"./assets/themes/advertising/TV_media.jpg",
|
||||||
"./assets/themes/advertising/Times square.jpg"
|
"./assets/themes/advertising/Times square.jpg"
|
||||||
]
|
],
|
||||||
|
"snapToLayer": "walls_and_buildings",
|
||||||
|
"maxSnapDistance": 5
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"tags": [
|
"tags": [
|
||||||
|
@ -1209,15 +1204,12 @@
|
||||||
"nl": "Een stuk groot, weerbestendig textiel met opgedrukte reclameboodschap die permanent aan de muur hangt",
|
"nl": "Een stuk groot, weerbestendig textiel met opgedrukte reclameboodschap die permanent aan de muur hangt",
|
||||||
"pt": "Uma peça de tecido impermeável com uma mensagem impressa, permanentemente ancorada na parede"
|
"pt": "Uma peça de tecido impermeável com uma mensagem impressa, permanentemente ancorada na parede"
|
||||||
},
|
},
|
||||||
"preciseInput": {
|
|
||||||
"preferredBackground": "map",
|
|
||||||
"snapToLayer": "walls_and_buildings",
|
|
||||||
"maxSnapDistance": 5
|
|
||||||
},
|
|
||||||
"exampleImages": [
|
"exampleImages": [
|
||||||
"./assets/themes/advertising/tarp_feder.jpg",
|
"./assets/themes/advertising/tarp_feder.jpg",
|
||||||
"./assets/themes/advertising/tarp_madrid.jpg"
|
"./assets/themes/advertising/tarp_madrid.jpg"
|
||||||
]
|
],
|
||||||
|
"snapToLayer": "walls_and_buildings",
|
||||||
|
"maxSnapDistance": 5
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"tags": [
|
"tags": [
|
||||||
|
@ -1252,11 +1244,6 @@
|
||||||
"pt": "um sinal",
|
"pt": "um sinal",
|
||||||
"pt_BR": "uma placa"
|
"pt_BR": "uma placa"
|
||||||
},
|
},
|
||||||
"preciseInput": {
|
|
||||||
"preferredBackground": "map",
|
|
||||||
"snapToLayer": "walls_and_buildings",
|
|
||||||
"maxSnapDistance": 5
|
|
||||||
},
|
|
||||||
"description": {
|
"description": {
|
||||||
"en": "Used for advertising signs, neon signs, logos & institutional entrance signs",
|
"en": "Used for advertising signs, neon signs, logos & institutional entrance signs",
|
||||||
"es": "Se utiliza para carteles publicitarios, letreros de neón, logotipos y carteles en entradas institucionales",
|
"es": "Se utiliza para carteles publicitarios, letreros de neón, logotipos y carteles en entradas institucionales",
|
||||||
|
@ -1270,7 +1257,9 @@
|
||||||
"./assets/themes/advertising/Waitrose_sign.jpg",
|
"./assets/themes/advertising/Waitrose_sign.jpg",
|
||||||
"./assets/themes/advertising/sign_EOI.jpg",
|
"./assets/themes/advertising/sign_EOI.jpg",
|
||||||
"./assets/themes/advertising/farma_sign.jpg"
|
"./assets/themes/advertising/farma_sign.jpg"
|
||||||
]
|
],
|
||||||
|
"snapToLayer": "walls_and_buildings",
|
||||||
|
"maxSnapDistance": 5
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"tags": [
|
"tags": [
|
||||||
|
@ -1304,15 +1293,12 @@
|
||||||
"fr": "une peinture murale",
|
"fr": "une peinture murale",
|
||||||
"pt": "uma pintura de parede"
|
"pt": "uma pintura de parede"
|
||||||
},
|
},
|
||||||
"preciseInput": {
|
|
||||||
"preferredBackground": "map",
|
|
||||||
"snapToLayer": "walls_and_buildings",
|
|
||||||
"maxSnapDistance": 5
|
|
||||||
},
|
|
||||||
"exampleImages": [
|
"exampleImages": [
|
||||||
"./assets/themes/advertising/Capitol_wall.jpg",
|
"./assets/themes/advertising/Capitol_wall.jpg",
|
||||||
"./assets/themes/advertising/clarke_wall.jpg"
|
"./assets/themes/advertising/clarke_wall.jpg"
|
||||||
]
|
],
|
||||||
|
"snapToLayer": "walls_and_buildings",
|
||||||
|
"maxSnapDistance": 5
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|
|
@ -139,9 +139,7 @@
|
||||||
"cs": "umělecké dílo na zdi",
|
"cs": "umělecké dílo na zdi",
|
||||||
"es": "Una obra de arte en la pared"
|
"es": "Una obra de arte en la pared"
|
||||||
},
|
},
|
||||||
"preciseInput": {
|
"snapToLayer": "walls_and_buildings"
|
||||||
"snapToLayer": "walls_and_buildings"
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"calculatedTags": [
|
"calculatedTags": [
|
||||||
|
|
|
@ -108,13 +108,8 @@
|
||||||
"nb_NO": "En pullert i veien",
|
"nb_NO": "En pullert i veien",
|
||||||
"ca": "Un bol·lard a la carretera"
|
"ca": "Un bol·lard a la carretera"
|
||||||
},
|
},
|
||||||
"preciseInput": {
|
"snapToLayer": "cycleways_and_roads",
|
||||||
"preferredBackground": [
|
"maxSnapDistance": 25
|
||||||
"photo"
|
|
||||||
],
|
|
||||||
"snapToLayer": "cycleways_and_roads",
|
|
||||||
"maxSnapDistance": 25
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"title": {
|
"title": {
|
||||||
|
@ -144,13 +139,8 @@
|
||||||
"nb_NO": "Sykkelbarrièrer, for å dempe farten",
|
"nb_NO": "Sykkelbarrièrer, for å dempe farten",
|
||||||
"ca": "Una barrera ciclista que relanteix als ciclistes"
|
"ca": "Una barrera ciclista que relanteix als ciclistes"
|
||||||
},
|
},
|
||||||
"preciseInput": {
|
"snapToLayer": "cycleways_and_roads",
|
||||||
"preferredBackground": [
|
"maxSnapDistance": 25
|
||||||
"photo"
|
|
||||||
],
|
|
||||||
"snapToLayer": "cycleways_and_roads",
|
|
||||||
"maxSnapDistance": 25
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"tagRenderings": [
|
"tagRenderings": [
|
||||||
|
|
|
@ -22,7 +22,7 @@
|
||||||
"cs": "Lavičky",
|
"cs": "Lavičky",
|
||||||
"pa_PK": "بینچ"
|
"pa_PK": "بینچ"
|
||||||
},
|
},
|
||||||
"minzoom": 17,
|
"minzoom": 14,
|
||||||
"source": {
|
"source": {
|
||||||
"osmTags": "amenity=bench"
|
"osmTags": "amenity=bench"
|
||||||
},
|
},
|
||||||
|
|
|
@ -133,9 +133,6 @@
|
||||||
"da": "Et teleskop eller en kikkert monteret på en stang, som offentligheden kan se sig omkring med. <img src='./assets/layers/binocular/binoculars_example.jpg' style='height: 300px; width: auto; display: block;' />",
|
"da": "Et teleskop eller en kikkert monteret på en stang, som offentligheden kan se sig omkring med. <img src='./assets/layers/binocular/binoculars_example.jpg' style='height: 300px; width: auto; display: block;' />",
|
||||||
"es": "Un telescopio o unos prismáticos montados en un poste, disponible para que el público mire alrededor. <img src='./assets/layers/binocular/binoculars_example.jpg' style='height: 300px; width: auto; display: block;' />",
|
"es": "Un telescopio o unos prismáticos montados en un poste, disponible para que el público mire alrededor. <img src='./assets/layers/binocular/binoculars_example.jpg' style='height: 300px; width: auto; display: block;' />",
|
||||||
"ca": "Un telescopi o un parell de prismàtics muntats en un pal, a disposició del públic per mirar al seu voltant. <img src='./assets/layers/binocular/binoculars_example.jpg' style='height: 300px; width: auto; display: block;' />"
|
"ca": "Un telescopi o un parell de prismàtics muntats en un pal, a disposició del públic per mirar al seu voltant. <img src='./assets/layers/binocular/binoculars_example.jpg' style='height: 300px; width: auto; display: block;' />"
|
||||||
},
|
|
||||||
"preciseInput": {
|
|
||||||
"preferredBackground": "photo"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
|
|
@ -46,9 +46,6 @@
|
||||||
"da": "En pub, mest et sted at drikke øl i et varme, afslappede omgivelser",
|
"da": "En pub, mest et sted at drikke øl i et varme, afslappede omgivelser",
|
||||||
"fr": "Un pub, principalement pour boire un verre dans une atmosphère chaleureuse et décontractée",
|
"fr": "Un pub, principalement pour boire un verre dans une atmosphère chaleureuse et décontractée",
|
||||||
"ca": "Un bar, principalment per a beure cerveses en un interior càlid i relaxat"
|
"ca": "Un bar, principalment per a beure cerveses en un interior càlid i relaxat"
|
||||||
},
|
|
||||||
"preciseInput": {
|
|
||||||
"preferredBackground": "map"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -74,9 +71,6 @@
|
||||||
"es": "Un <b>bar de copas</b> más moderno y comercial, posiblemente con una instalación de música y luz",
|
"es": "Un <b>bar de copas</b> más moderno y comercial, posiblemente con una instalación de música y luz",
|
||||||
"fr": "Un <b>bar</b> plus moderne et commercial, avec éventuellement musique et jeux de lumière",
|
"fr": "Un <b>bar</b> plus moderne et commercial, avec éventuellement musique et jeux de lumière",
|
||||||
"ca": "Un <b>bar de copes</b> més modern i comercial, possiblement amb equipació de música i llums"
|
"ca": "Un <b>bar de copes</b> més modern i comercial, possiblement amb equipació de música i llums"
|
||||||
},
|
|
||||||
"preciseInput": {
|
|
||||||
"preferredBackground": "map"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -102,9 +96,6 @@
|
||||||
"es": "Una <b>cafetería</b> para beber té, café o una bebida alcohólica en un ambiente tranquilo",
|
"es": "Una <b>cafetería</b> para beber té, café o una bebida alcohólica en un ambiente tranquilo",
|
||||||
"fr": "Un <b>café</b> pour prendre un thé, un café ou une boisson alcoolisée dans un environnement calme",
|
"fr": "Un <b>café</b> pour prendre un thé, un café ou une boisson alcoolisée dans un environnement calme",
|
||||||
"ca": "Una <b>cafeteria</b> per a a beure té, café o una beguda alcohólica en un ambient tranquil"
|
"ca": "Una <b>cafeteria</b> per a a beure té, café o una beguda alcohólica en un ambient tranquil"
|
||||||
},
|
|
||||||
"preciseInput": {
|
|
||||||
"preferredBackground": "map"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -128,9 +119,6 @@
|
||||||
"fr": "Une <b>boîte de nuit</b> ou discothèque pour danser sur de la musique de DJ accompagnée de jeux de lumière et un bar pour prendre une boisson (alcoolisée)",
|
"fr": "Une <b>boîte de nuit</b> ou discothèque pour danser sur de la musique de DJ accompagnée de jeux de lumière et un bar pour prendre une boisson (alcoolisée)",
|
||||||
"da": "En <b>natklub</b> eller diskotek med fokus på dans, musik af en DJ med tilhørende lysshow og en bar for at få (alkoholiske) drinks",
|
"da": "En <b>natklub</b> eller diskotek med fokus på dans, musik af en DJ med tilhørende lysshow og en bar for at få (alkoholiske) drinks",
|
||||||
"ca": "Un <b>club nocturn</b> o discoteca centrat en ballar, música d'un DJ acompanyat d'un espectacle de llums i una barra on obtindre begudes (alcohòliques)"
|
"ca": "Un <b>club nocturn</b> o discoteca centrat en ballar, música d'un DJ acompanyat d'un espectacle de llums i una barra on obtindre begudes (alcohòliques)"
|
||||||
},
|
|
||||||
"preciseInput": {
|
|
||||||
"preferredBackground": "map"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
|
|
@ -4705,9 +4705,6 @@
|
||||||
"da": "en ladestation til elektriske cykler med et normalt europæisk vægstik <img src='./assets/layers/charging_station/typee.svg' style='width: 2rem; height: 2rem; float: left; background: white; border-radius: 1rem; margin-right: 0.5rem'/> (beregnet til opladning af elektriske cykler)",
|
"da": "en ladestation til elektriske cykler med et normalt europæisk vægstik <img src='./assets/layers/charging_station/typee.svg' style='width: 2rem; height: 2rem; float: left; background: white; border-radius: 1rem; margin-right: 0.5rem'/> (beregnet til opladning af elektriske cykler)",
|
||||||
"de": "eine Ladestation für Elektrofahrräder mit einer normalen europäischen Steckdose <img src='./assets/layers/charging_station/typee.svg' style='width: 2rem; height: 2rem; float: left; background: white; border-radius: 1rem; margin-right: 0.5rem'/> (zum Laden von Elektrofahrrädern)",
|
"de": "eine Ladestation für Elektrofahrräder mit einer normalen europäischen Steckdose <img src='./assets/layers/charging_station/typee.svg' style='width: 2rem; height: 2rem; float: left; background: white; border-radius: 1rem; margin-right: 0.5rem'/> (zum Laden von Elektrofahrrädern)",
|
||||||
"es": "una estación de carga para bicicletas eléctricas con un enchufe de pared europeo normal <img src='./assets/layers/charging_station/typee.svg' style='width: 2rem; height: 2rem; float: left; background: white; border-radius: 1rem; margin-right: 0.5rem'/> (pensado para cargar bicicletas eléctricas)"
|
"es": "una estación de carga para bicicletas eléctricas con un enchufe de pared europeo normal <img src='./assets/layers/charging_station/typee.svg' style='width: 2rem; height: 2rem; float: left; background: white; border-radius: 1rem; margin-right: 0.5rem'/> (pensado para cargar bicicletas eléctricas)"
|
||||||
},
|
|
||||||
"preciseInput": {
|
|
||||||
"preferredBackground": "map"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -4723,9 +4720,6 @@
|
||||||
"da": "en ladestation til biler",
|
"da": "en ladestation til biler",
|
||||||
"de": "Eine Ladestation für Elektrofahrzeuge",
|
"de": "Eine Ladestation für Elektrofahrzeuge",
|
||||||
"es": "una estación de carga para coches"
|
"es": "una estación de carga para coches"
|
||||||
},
|
|
||||||
"preciseInput": {
|
|
||||||
"preferredBackground": "map"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
|
|
@ -409,12 +409,6 @@
|
||||||
"nl": "Een publiekelijk zichtbare klok",
|
"nl": "Een publiekelijk zichtbare klok",
|
||||||
"de": "Eine öffentlich sichtbare Uhr",
|
"de": "Eine öffentlich sichtbare Uhr",
|
||||||
"ca": "Un rellotge visible públicament"
|
"ca": "Un rellotge visible públicament"
|
||||||
},
|
|
||||||
"preciseInput": {
|
|
||||||
"preferredBackground": [
|
|
||||||
"photo",
|
|
||||||
"map"
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -435,13 +429,7 @@
|
||||||
"ca": "Un rellotge visible públicament muntat en una paret",
|
"ca": "Un rellotge visible públicament muntat en una paret",
|
||||||
"fr": "Une horloge publique fixée sur un mur"
|
"fr": "Une horloge publique fixée sur un mur"
|
||||||
},
|
},
|
||||||
"preciseInput": {
|
"snapToLayer": "walls_and_buildings"
|
||||||
"preferredBackground": [
|
|
||||||
"photo",
|
|
||||||
"map"
|
|
||||||
],
|
|
||||||
"snapToLayer": "walls_and_buildings"
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"allowMove": true,
|
"allowMove": true,
|
||||||
|
|
|
@ -84,13 +84,8 @@
|
||||||
"da": "Overgang for fodgængere og/eller cyklister",
|
"da": "Overgang for fodgængere og/eller cyklister",
|
||||||
"es": "Cruce para peatones y/o ciclistas"
|
"es": "Cruce para peatones y/o ciclistas"
|
||||||
},
|
},
|
||||||
"preciseInput": {
|
"snapToLayer": "cycleways_and_roads",
|
||||||
"preferredBackground": [
|
"maxSnapDistance": 25
|
||||||
"photo"
|
|
||||||
],
|
|
||||||
"snapToLayer": "cycleways_and_roads",
|
|
||||||
"maxSnapDistance": 25
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"title": {
|
"title": {
|
||||||
|
@ -113,13 +108,8 @@
|
||||||
"da": "Trafiksignal på en vej",
|
"da": "Trafiksignal på en vej",
|
||||||
"es": "Señal de tráfico en una carretera"
|
"es": "Señal de tráfico en una carretera"
|
||||||
},
|
},
|
||||||
"preciseInput": {
|
"snapToLayer": "cycleways_and_roads",
|
||||||
"preferredBackground": [
|
"maxSnapDistance": 25
|
||||||
"photo"
|
|
||||||
],
|
|
||||||
"snapToLayer": "cycleways_and_roads",
|
|
||||||
"maxSnapDistance": 25
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"tagRenderings": [
|
"tagRenderings": [
|
||||||
|
|
|
@ -72,11 +72,8 @@
|
||||||
"tags": [
|
"tags": [
|
||||||
"emergency=defibrillator"
|
"emergency=defibrillator"
|
||||||
],
|
],
|
||||||
"preciseInput": {
|
"snapToLayer": "walls_and_buildings",
|
||||||
"preferredBackground": "map",
|
"maxSnapDistance": 5
|
||||||
"snapToLayer": "walls_and_buildings",
|
|
||||||
"maxSnapDistance": 5
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"tagRenderings": [
|
"tagRenderings": [
|
||||||
|
|
|
@ -453,15 +453,12 @@
|
||||||
"de": "einen Eingang",
|
"de": "einen Eingang",
|
||||||
"nl": "een toegang"
|
"nl": "een toegang"
|
||||||
},
|
},
|
||||||
"preciseInput": {
|
|
||||||
"preferredBackground": "photo",
|
|
||||||
"snapToLayer": [
|
|
||||||
"walls_and_buildings",
|
|
||||||
"pedestrian_path"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"tags": [
|
"tags": [
|
||||||
"entrance=yes"
|
"entrance=yes"
|
||||||
|
],
|
||||||
|
"snapToLayer": [
|
||||||
|
"walls_and_buildings",
|
||||||
|
"pedestrian_path"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -470,14 +467,11 @@
|
||||||
"de": "eine Innentür",
|
"de": "eine Innentür",
|
||||||
"nl": "een binnendeur"
|
"nl": "een binnendeur"
|
||||||
},
|
},
|
||||||
"preciseInput": {
|
|
||||||
"preferredBackground": "map",
|
|
||||||
"snapToLayer": [
|
|
||||||
"indoors"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"tags": [
|
"tags": [
|
||||||
"indoor=door"
|
"indoor=door"
|
||||||
|
],
|
||||||
|
"snapToLayer": [
|
||||||
|
"indoors"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
|
|
@ -38,9 +38,6 @@
|
||||||
"de": "Ein klassisches Speiselokal mit Sitzgelegenheiten, in dem vollständige Mahlzeiten von Kellnern serviert werden",
|
"de": "Ein klassisches Speiselokal mit Sitzgelegenheiten, in dem vollständige Mahlzeiten von Kellnern serviert werden",
|
||||||
"es": "Un lugar de comidas formal, con mesas y sillas y que vende comidas completas servidas por camareros",
|
"es": "Un lugar de comidas formal, con mesas y sillas y que vende comidas completas servidas por camareros",
|
||||||
"fr": "Un lieu de restauration formel avec des installations pour s'asseoir vendant des repas complets servis par des serveurs"
|
"fr": "Un lieu de restauration formel avec des installations pour s'asseoir vendant des repas complets servis par des serveurs"
|
||||||
},
|
|
||||||
"preciseInput": {
|
|
||||||
"preferredBackground": "map"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -61,9 +58,6 @@
|
||||||
"de": "Ein Lebensmittelunternehmen, das sich auf schnellen Thekendienst und Essen zum Mitnehmen konzentriert",
|
"de": "Ein Lebensmittelunternehmen, das sich auf schnellen Thekendienst und Essen zum Mitnehmen konzentriert",
|
||||||
"es": "Un negocio de comida centrado en servicio rápido solo en mostrador y comida para llevar",
|
"es": "Un negocio de comida centrado en servicio rápido solo en mostrador y comida para llevar",
|
||||||
"fr": "Une entreprise alimentaire se concentrant sur le service rapide au comptoir et les plats à emporter"
|
"fr": "Une entreprise alimentaire se concentrant sur le service rapide au comptoir et les plats à emporter"
|
||||||
},
|
|
||||||
"preciseInput": {
|
|
||||||
"preferredBackground": "map"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -84,9 +78,6 @@
|
||||||
"de": "Eine Pommesbude",
|
"de": "Eine Pommesbude",
|
||||||
"fr": "Une restauration rapide centré sur la vente de frites",
|
"fr": "Une restauration rapide centré sur la vente de frites",
|
||||||
"ca": "Un local de menjar ràpid centrat en les patates fregides"
|
"ca": "Un local de menjar ràpid centrat en les patates fregides"
|
||||||
},
|
|
||||||
"preciseInput": {
|
|
||||||
"preferredBackground": "map"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
|
|
@ -254,14 +254,11 @@
|
||||||
"de": "Bordstein in einem Fußweg",
|
"de": "Bordstein in einem Fußweg",
|
||||||
"fr": "Bordure dans un trottoir"
|
"fr": "Bordure dans un trottoir"
|
||||||
},
|
},
|
||||||
"preciseInput": {
|
"snapToLayer": [
|
||||||
"maxSnapDistance": 10,
|
"cycleways_and_roads",
|
||||||
"preferredBackground": "photo",
|
"kerbs"
|
||||||
"snapToLayer": [
|
],
|
||||||
"cycleways_and_roads",
|
"maxSnapDistance": 10
|
||||||
"kerbs"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"filter": [
|
"filter": [
|
||||||
|
|
|
@ -34,9 +34,6 @@
|
||||||
"de": "ein Paketschließfach",
|
"de": "ein Paketschließfach",
|
||||||
"ca": "una bústia intel·ligent"
|
"ca": "una bústia intel·ligent"
|
||||||
},
|
},
|
||||||
"preciseInput": {
|
|
||||||
"preferredBackground": "photo"
|
|
||||||
},
|
|
||||||
"tags": [
|
"tags": [
|
||||||
"amenity=parcel_locker"
|
"amenity=parcel_locker"
|
||||||
]
|
]
|
||||||
|
|
|
@ -65,10 +65,7 @@
|
||||||
},
|
},
|
||||||
"tags": [
|
"tags": [
|
||||||
"amenity=public_bookcase"
|
"amenity=public_bookcase"
|
||||||
],
|
]
|
||||||
"preciseInput": {
|
|
||||||
"preferredBackground": "photo"
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"tagRenderings": [
|
"tagRenderings": [
|
||||||
|
|
|
@ -55,13 +55,8 @@
|
||||||
"fr": "Passage piéton",
|
"fr": "Passage piéton",
|
||||||
"ca": "Pas de vianants"
|
"ca": "Pas de vianants"
|
||||||
},
|
},
|
||||||
"preciseInput": {
|
"snapToLayer": "cycleways_and_roads",
|
||||||
"preferredBackground": [
|
"maxSnapDistance": 25
|
||||||
"photo"
|
|
||||||
],
|
|
||||||
"snapToLayer": "cycleways_and_roads",
|
|
||||||
"maxSnapDistance": 25
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"tagRenderings": [
|
"tagRenderings": [
|
||||||
|
|
|
@ -72,13 +72,10 @@
|
||||||
"nl": "een flitspaal",
|
"nl": "een flitspaal",
|
||||||
"es": "una cámara de velocidad"
|
"es": "una cámara de velocidad"
|
||||||
},
|
},
|
||||||
"preciseInput": {
|
"snapToLayer": [
|
||||||
"preferredBackground": "photo",
|
"maxspeed"
|
||||||
"maxSnapDistance": 10,
|
],
|
||||||
"snapToLayer": [
|
"maxSnapDistance": 10
|
||||||
"maxspeed"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"mapRendering": [
|
"mapRendering": [
|
||||||
|
|
|
@ -78,10 +78,7 @@
|
||||||
},
|
},
|
||||||
"tags": [
|
"tags": [
|
||||||
"highway=speed_display"
|
"highway=speed_display"
|
||||||
],
|
]
|
||||||
"preciseInput": {
|
|
||||||
"preferredBackground": "photo"
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"mapRendering": [
|
"mapRendering": [
|
||||||
|
|
|
@ -57,8 +57,7 @@
|
||||||
},
|
},
|
||||||
"tags": [
|
"tags": [
|
||||||
"highway=street_lamp"
|
"highway=street_lamp"
|
||||||
],
|
]
|
||||||
"preciseInput": {}
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"tagRenderings": [
|
"tagRenderings": [
|
||||||
|
|
|
@ -592,14 +592,7 @@
|
||||||
"de": "eine an einer Wand montierte Überwachungskamera",
|
"de": "eine an einer Wand montierte Überwachungskamera",
|
||||||
"es": "una cámara de vigilancia montada en una pared"
|
"es": "una cámara de vigilancia montada en una pared"
|
||||||
},
|
},
|
||||||
"preciseInput": {
|
"snapToLayer": "walls_and_buildings"
|
||||||
"snapToLayer": "walls_and_buildings",
|
|
||||||
"preferredBackground": [
|
|
||||||
"photo",
|
|
||||||
"osmbasedmap",
|
|
||||||
"map"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"mapRendering": [
|
"mapRendering": [
|
||||||
|
|
|
@ -757,9 +757,6 @@
|
||||||
"de": "Ein Baum mit Blättern, z. B. Eiche oder Buche.",
|
"de": "Ein Baum mit Blättern, z. B. Eiche oder Buche.",
|
||||||
"es": "Un árbol de hojas como el Roble o el Álamo.",
|
"es": "Un árbol de hojas como el Roble o el Álamo.",
|
||||||
"pt": "Uma árvore de uma espécie com folhas, como carvalho ou populus."
|
"pt": "Uma árvore de uma espécie com folhas, como carvalho ou populus."
|
||||||
},
|
|
||||||
"preciseInput": {
|
|
||||||
"preferredBackground": "photo"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -787,9 +784,6 @@
|
||||||
"de": "Ein Baum mit Nadeln, z. B. Kiefer oder Fichte.",
|
"de": "Ein Baum mit Nadeln, z. B. Kiefer oder Fichte.",
|
||||||
"es": "Un árbol de hojas agujas, como el Pino o el Abeto.",
|
"es": "Un árbol de hojas agujas, como el Pino o el Abeto.",
|
||||||
"da": "Et træ af en art med nåle, såsom fyr eller gran."
|
"da": "Et træ af en art med nåle, såsom fyr eller gran."
|
||||||
},
|
|
||||||
"preciseInput": {
|
|
||||||
"preferredBackground": "photo"
|
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
|
@ -819,9 +813,6 @@
|
||||||
"de": "Wenn Sie nicht sicher sind, ob es sich um einen Laubbaum oder einen Nadelbaum handelt.",
|
"de": "Wenn Sie nicht sicher sind, ob es sich um einen Laubbaum oder einen Nadelbaum handelt.",
|
||||||
"es": "Si no estás seguro de si es un árbol de hoja ancha o de hoja de aguja.",
|
"es": "Si no estás seguro de si es un árbol de hoja ancha o de hoja de aguja.",
|
||||||
"da": "Hvis du ikke er sikker på, om det er et løv- eller nåletræ."
|
"da": "Hvis du ikke er sikker på, om det er et løv- eller nåletræ."
|
||||||
},
|
|
||||||
"preciseInput": {
|
|
||||||
"preferredBackground": "photo"
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
|
|
@ -31,7 +31,6 @@
|
||||||
},
|
},
|
||||||
"maintainer": "Offsel",
|
"maintainer": "Offsel",
|
||||||
"icon": "./assets/themes/advertising/icon.svg",
|
"icon": "./assets/themes/advertising/icon.svg",
|
||||||
"version": "2023_01_29",
|
|
||||||
"startLat": 0,
|
"startLat": 0,
|
||||||
"startLon": 0,
|
"startLon": 0,
|
||||||
"startZoom": 1,
|
"startZoom": 1,
|
||||||
|
|
|
@ -67,7 +67,7 @@
|
||||||
"calculatedTags": [
|
"calculatedTags": [
|
||||||
"_closest_osm_poi=closest(feat)('atm')?.properties?.id",
|
"_closest_osm_poi=closest(feat)('atm')?.properties?.id",
|
||||||
"_closest_osm_poi_distance=Math.round(distanceTo(feat)(feat.properties._closest_osm_poi))",
|
"_closest_osm_poi_distance=Math.round(distanceTo(feat)(feat.properties._closest_osm_poi))",
|
||||||
"_has_closeby_feature=Number(feat.properties._closest_osm_poi_distance) < 50 ? 'yes' : 'no'"
|
"_has_closeby_feature=Number(feat.properties._closest_osm_poi_distance) < 150 ? 'yes' : 'no'"
|
||||||
],
|
],
|
||||||
"=tagRenderings": [
|
"=tagRenderings": [
|
||||||
{
|
{
|
||||||
|
|
|
@ -41,7 +41,7 @@
|
||||||
"prepare-deploy": "npm run generate:service-worker && ./scripts/build.sh",
|
"prepare-deploy": "npm run generate:service-worker && ./scripts/build.sh",
|
||||||
"format": "prettier --write '**/*.ts' '**/*.svelte'",
|
"format": "prettier --write '**/*.ts' '**/*.svelte'",
|
||||||
"clean:tests": "(find . -type f -name \"*.doctest.ts\" | xargs -r rm)",
|
"clean:tests": "(find . -type f -name \"*.doctest.ts\" | xargs -r rm)",
|
||||||
"clean": "rm -rf .cache/ && (find *.html | grep -v \"^\\(404\\|index\\|land\\|test\\|preferences\\|customGenerator\\|professional\\|automaton\\|import_helper\\|import_viewer\\|theme\\|style_test\\).html\" | xargs -r rm) && (ls | grep \"^index_[a-zA-Z_-]\\+\\.ts$\" | xargs -r rm) && (ls | grep \".*.webmanifest$\" | grep -v \"manifest.webmanifest\" | xargs -r rm)",
|
"clean": "rm -rf .cache/ && (find *.html | grep -v \"^\\(404\\|index\\|land\\|test\\|preferences\\|studio\\|professional\\|automaton\\|import_helper\\|import_viewer\\|theme\\|style_test\\).html\" | xargs -r rm) && (ls | grep \"^index_[a-zA-Z_-]\\+\\.ts$\" | xargs -r rm) && (ls | grep \".*.webmanifest$\" | grep -v \"manifest.webmanifest\" | xargs -r rm)",
|
||||||
"generate:dependency-graph": "node_modules/.bin/depcruise --exclude \"^node_modules\" --output-type dot Logic/State/MapState.ts > dependencies.dot && dot dependencies.dot -T svg -o dependencies.svg && rm dependencies.dot",
|
"generate:dependency-graph": "node_modules/.bin/depcruise --exclude \"^node_modules\" --output-type dot Logic/State/MapState.ts > dependencies.dot && dot dependencies.dot -T svg -o dependencies.svg && rm dependencies.dot",
|
||||||
"weblate-add-upstream": "git remote add weblate-github git@github.com:weblate/MapComplete.git && git remote add weblate-hosted-core https://hosted.weblate.org/git/mapcomplete/core/ && git remote add weblate-hosted-layers https://hosted.weblate.org/git/mapcomplete/layers/",
|
"weblate-add-upstream": "git remote add weblate-github git@github.com:weblate/MapComplete.git && git remote add weblate-hosted-core https://hosted.weblate.org/git/mapcomplete/core/ && git remote add weblate-hosted-layers https://hosted.weblate.org/git/mapcomplete/layers/",
|
||||||
"weblate-merge": "git remote update weblate-github; git merge weblate-github/weblate-mapcomplete-core weblate-github/weblate-mapcomplete-layers weblate-github/weblate-mapcomplete-layer-translations",
|
"weblate-merge": "git remote update weblate-github; git merge weblate-github/weblate-mapcomplete-core weblate-github/weblate-mapcomplete-layers weblate-github/weblate-mapcomplete-layer-translations",
|
||||||
|
|
|
@ -72,7 +72,7 @@ for (const layerFile of layerFiles) {
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
addArticleToPresets(fixed)
|
addArticleToPresets(fixed)
|
||||||
writeFileSync(layerFile.path, JSON.stringify(fixed, null, " "))
|
writeFileSync(layerFile.path, JSON.stringify(fixed, null, " ") + "\n")
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.error("COULD NOT LINT LAYER" + layerFile.path + ":\n\t" + e)
|
console.error("COULD NOT LINT LAYER" + layerFile.path + ":\n\t" + e)
|
||||||
}
|
}
|
||||||
|
|
20
statistics.html
Normal file
20
statistics.html
Normal file
|
@ -0,0 +1,20 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta charset="UTF-8">
|
||||||
|
<title>MapComplete statistics</title>
|
||||||
|
<meta content="width=device-width, initial-scale=1.0, user-scalable=no" name="viewport">
|
||||||
|
<link href="./css/mobile.css" rel="stylesheet"/>
|
||||||
|
<link href="./css/openinghourstable.css" rel="stylesheet"/>
|
||||||
|
<link href="./css/tagrendering.css" rel="stylesheet"/>
|
||||||
|
<link href="css/ReviewElement.css" rel="stylesheet"/>
|
||||||
|
<link href="./css/index-tailwind-output.css" rel="stylesheet"/>
|
||||||
|
<link href="./css/wikipedia.css" rel="stylesheet"/>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<div id="main">Loading statistics...</div>
|
||||||
|
<script src="./UI/StatisticsGUI.ts" type="module"></script>
|
||||||
|
<script async data-goatcounter="https://pietervdvn.goatcounter.com/count" src="//gc.zgo.at/count.js"></script>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
Loading…
Add table
Reference in a new issue