forked from MapComplete/MapComplete
		
	Move hotel to 'tourism_accomodation', include hostels, fix #2070
This commit is contained in:
		
							parent
							
								
									1bea51cc8b
								
							
						
					
					
						commit
						bc584be782
					
				
					 34 changed files with 652 additions and 754 deletions
				
			
		| 
						 | 
				
			
			@ -23,7 +23,7 @@ import { ImageCarousel } from "./Image/ImageCarousel"
 | 
			
		|||
import { VariableUiElement } from "./Base/VariableUIElement"
 | 
			
		||||
import { Utils } from "../Utils"
 | 
			
		||||
import Wikidata, { WikidataResponse } from "../Logic/Web/Wikidata"
 | 
			
		||||
import { Translation } from "./i18n/Translation"
 | 
			
		||||
import { Translation, TypedTranslation } from "./i18n/Translation"
 | 
			
		||||
import Translations from "./i18n/Translations"
 | 
			
		||||
import OpeningHoursVisualization from "./OpeningHours/OpeningHoursVisualization"
 | 
			
		||||
import { SubtleButton } from "./Base/SubtleButton"
 | 
			
		||||
| 
						 | 
				
			
			@ -102,6 +102,7 @@ import PendingChangesIndicator from "./BigComponents/PendingChangesIndicator.sve
 | 
			
		|||
import QrCode from "./Popup/QrCode.svelte"
 | 
			
		||||
import ClearCaches from "./Popup/ClearCaches.svelte"
 | 
			
		||||
import GroupedView from "./Popup/GroupedView.svelte"
 | 
			
		||||
import { QuestionableTagRenderingConfigJson } from "../Models/ThemeConfig/Json/QuestionableTagRenderingConfigJson"
 | 
			
		||||
 | 
			
		||||
class NearbyImageVis implements SpecialVisualization {
 | 
			
		||||
    // Class must be in SpecialVisualisations due to weird cyclical import that breaks the tests
 | 
			
		||||
| 
						 | 
				
			
			@ -127,7 +128,7 @@ class NearbyImageVis implements SpecialVisualization {
 | 
			
		|||
        tags: UIEventSource<Record<string, string>>,
 | 
			
		||||
        args: string[],
 | 
			
		||||
        feature: Feature,
 | 
			
		||||
        layer: LayerConfig
 | 
			
		||||
        layer: LayerConfig,
 | 
			
		||||
    ): SvelteUIElement {
 | 
			
		||||
        const isOpen = args[0] === "open"
 | 
			
		||||
        const readonly = args[1] === "readonly"
 | 
			
		||||
| 
						 | 
				
			
			@ -194,7 +195,7 @@ class StealViz implements SpecialVisualization {
 | 
			
		|||
                                selectedElement: otherFeature,
 | 
			
		||||
                                state,
 | 
			
		||||
                                layer,
 | 
			
		||||
                            })
 | 
			
		||||
                            }),
 | 
			
		||||
                        )
 | 
			
		||||
                    }
 | 
			
		||||
                    if (elements.length === 1) {
 | 
			
		||||
| 
						 | 
				
			
			@ -202,8 +203,8 @@ class StealViz implements SpecialVisualization {
 | 
			
		|||
                    }
 | 
			
		||||
                    return new Combine(elements).SetClass("flex flex-col")
 | 
			
		||||
                },
 | 
			
		||||
                [state.indexedFeatures.featuresById]
 | 
			
		||||
            )
 | 
			
		||||
                [state.indexedFeatures.featuresById],
 | 
			
		||||
            ),
 | 
			
		||||
        )
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -260,7 +261,7 @@ class CloseNoteViz implements SpecialVisualization {
 | 
			
		|||
            idkey,
 | 
			
		||||
            comment,
 | 
			
		||||
            minZoom,
 | 
			
		||||
            zoomButton
 | 
			
		||||
            zoomButton,
 | 
			
		||||
        } = Utils.ParseVisArgs(this.args, args)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -272,7 +273,7 @@ class CloseNoteViz implements SpecialVisualization {
 | 
			
		|||
            message: comment,
 | 
			
		||||
            text: Translations.T(text),
 | 
			
		||||
            minzoom: minZoom,
 | 
			
		||||
            zoomMoreMessage: zoomButton
 | 
			
		||||
            zoomMoreMessage: zoomButton,
 | 
			
		||||
        })
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			@ -302,7 +303,7 @@ export class QuestionViz implements SpecialVisualization {
 | 
			
		|||
        tags: UIEventSource<Record<string, string>>,
 | 
			
		||||
        args: string[],
 | 
			
		||||
        feature: Feature,
 | 
			
		||||
        layer: LayerConfig
 | 
			
		||||
        layer: LayerConfig,
 | 
			
		||||
    ): SvelteUIElement {
 | 
			
		||||
        const labels = args[0]
 | 
			
		||||
            ?.split(";")
 | 
			
		||||
| 
						 | 
				
			
			@ -341,15 +342,15 @@ export default class SpecialVisualizations {
 | 
			
		|||
            viz.docs,
 | 
			
		||||
            viz.args.length > 0
 | 
			
		||||
                ? MarkdownUtils.table(
 | 
			
		||||
                      ["name", "default", "description"],
 | 
			
		||||
                      viz.args.map((arg) => {
 | 
			
		||||
                          let defaultArg = arg.defaultValue ?? "_undefined_"
 | 
			
		||||
                          if (defaultArg == "") {
 | 
			
		||||
                              defaultArg = "_empty string_"
 | 
			
		||||
                          }
 | 
			
		||||
                          return [arg.name, defaultArg, arg.doc]
 | 
			
		||||
                      })
 | 
			
		||||
                  )
 | 
			
		||||
                    ["name", "default", "description"],
 | 
			
		||||
                    viz.args.map((arg) => {
 | 
			
		||||
                        let defaultArg = arg.defaultValue ?? "_undefined_"
 | 
			
		||||
                        if (defaultArg == "") {
 | 
			
		||||
                            defaultArg = "_empty string_"
 | 
			
		||||
                        }
 | 
			
		||||
                        return [arg.name, defaultArg, arg.doc]
 | 
			
		||||
                    }),
 | 
			
		||||
                )
 | 
			
		||||
                : undefined,
 | 
			
		||||
            "#### Example usage of " + viz.funcName,
 | 
			
		||||
            "<code>" + example + "</code>",
 | 
			
		||||
| 
						 | 
				
			
			@ -358,14 +359,14 @@ export default class SpecialVisualizations {
 | 
			
		|||
 | 
			
		||||
    public static constructSpecification(
 | 
			
		||||
        template: string,
 | 
			
		||||
        extraMappings: SpecialVisualization[] = []
 | 
			
		||||
        extraMappings: SpecialVisualization[] = [],
 | 
			
		||||
    ): RenderingSpecification[] {
 | 
			
		||||
        return SpecialVisualisationUtils.constructSpecification(template, extraMappings)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public static HelpMessage(): string {
 | 
			
		||||
        const helpTexts: string[] = SpecialVisualizations.specialVisualizations.map((viz) =>
 | 
			
		||||
            SpecialVisualizations.DocumentationFor(viz)
 | 
			
		||||
            SpecialVisualizations.DocumentationFor(viz),
 | 
			
		||||
        )
 | 
			
		||||
 | 
			
		||||
        const firstPart = new Combine([
 | 
			
		||||
| 
						 | 
				
			
			@ -398,10 +399,10 @@ export default class SpecialVisualizations {
 | 
			
		|||
                        },
 | 
			
		||||
                    },
 | 
			
		||||
                    null,
 | 
			
		||||
                    "  "
 | 
			
		||||
                )
 | 
			
		||||
                    "  ",
 | 
			
		||||
                ),
 | 
			
		||||
            ).SetClass("code"),
 | 
			
		||||
            'In other words: use `{ "before": ..., "after": ..., "special": {"type": ..., "argname": ...argvalue...}`. The args are in the `special` block; an argvalue can be a string, a translation or another value. (Refer to class `RewriteSpecial` in case of problems)',
 | 
			
		||||
            "In other words: use `{ \"before\": ..., \"after\": ..., \"special\": {\"type\": ..., \"argname\": ...argvalue...}`. The args are in the `special` block; an argvalue can be a string, a translation or another value. (Refer to class `RewriteSpecial` in case of problems)",
 | 
			
		||||
        ])
 | 
			
		||||
            .SetClass("flex flex-col")
 | 
			
		||||
            .AsMarkdown()
 | 
			
		||||
| 
						 | 
				
			
			@ -439,10 +440,10 @@ export default class SpecialVisualizations {
 | 
			
		|||
                                assignTo: state.userRelatedState.language,
 | 
			
		||||
                                availableLanguages: languages,
 | 
			
		||||
                                preferredLanguages: state.osmConnection.userDetails.map(
 | 
			
		||||
                                    (ud) => ud.languages
 | 
			
		||||
                                    (ud) => ud.languages,
 | 
			
		||||
                                ),
 | 
			
		||||
                            })
 | 
			
		||||
                        })
 | 
			
		||||
                        }),
 | 
			
		||||
                    )
 | 
			
		||||
                },
 | 
			
		||||
            },
 | 
			
		||||
| 
						 | 
				
			
			@ -481,7 +482,7 @@ export default class SpecialVisualizations {
 | 
			
		|||
                    state: SpecialVisualizationState,
 | 
			
		||||
                    tagSource: UIEventSource<Record<string, string>>,
 | 
			
		||||
                    args: string[],
 | 
			
		||||
                    feature: Feature
 | 
			
		||||
                    feature: Feature,
 | 
			
		||||
                ): SvelteUIElement {
 | 
			
		||||
                    return new SvelteUIElement(MinimapViz, { state, args, feature, tagSource })
 | 
			
		||||
                },
 | 
			
		||||
| 
						 | 
				
			
			@ -493,7 +494,7 @@ export default class SpecialVisualizations {
 | 
			
		|||
 | 
			
		||||
                constr(
 | 
			
		||||
                    state: SpecialVisualizationState,
 | 
			
		||||
                    tagSource: UIEventSource<Record<string, string>>
 | 
			
		||||
                    tagSource: UIEventSource<Record<string, string>>,
 | 
			
		||||
                ): BaseUIElement {
 | 
			
		||||
                    return new VariableUiElement(
 | 
			
		||||
                        tagSource
 | 
			
		||||
| 
						 | 
				
			
			@ -503,7 +504,7 @@ export default class SpecialVisualizations {
 | 
			
		|||
                                    return new SvelteUIElement(SplitRoadWizard, { id, state })
 | 
			
		||||
                                }
 | 
			
		||||
                                return undefined
 | 
			
		||||
                            })
 | 
			
		||||
                            }),
 | 
			
		||||
                    )
 | 
			
		||||
                },
 | 
			
		||||
            },
 | 
			
		||||
| 
						 | 
				
			
			@ -517,7 +518,7 @@ export default class SpecialVisualizations {
 | 
			
		|||
                    tagSource: UIEventSource<Record<string, string>>,
 | 
			
		||||
                    argument: string[],
 | 
			
		||||
                    feature: Feature,
 | 
			
		||||
                    layer: LayerConfig
 | 
			
		||||
                    layer: LayerConfig,
 | 
			
		||||
                ): BaseUIElement {
 | 
			
		||||
                    if (feature.geometry.type !== "Point") {
 | 
			
		||||
                        return undefined
 | 
			
		||||
| 
						 | 
				
			
			@ -540,7 +541,7 @@ export default class SpecialVisualizations {
 | 
			
		|||
                    tagSource: UIEventSource<Record<string, string>>,
 | 
			
		||||
                    argument: string[],
 | 
			
		||||
                    feature: Feature,
 | 
			
		||||
                    layer: LayerConfig
 | 
			
		||||
                    layer: LayerConfig,
 | 
			
		||||
                ): BaseUIElement {
 | 
			
		||||
                    if (!layer.deletion) {
 | 
			
		||||
                        return undefined
 | 
			
		||||
| 
						 | 
				
			
			@ -568,7 +569,7 @@ export default class SpecialVisualizations {
 | 
			
		|||
                    state: SpecialVisualizationState,
 | 
			
		||||
                    tagSource: UIEventSource<Record<string, string>>,
 | 
			
		||||
                    argument: string[],
 | 
			
		||||
                    feature: Feature
 | 
			
		||||
                    feature: Feature,
 | 
			
		||||
                ): BaseUIElement {
 | 
			
		||||
                    const [lon, lat] = GeoOperations.centerpointCoordinates(feature)
 | 
			
		||||
                    return new SvelteUIElement(CreateNewNote, {
 | 
			
		||||
| 
						 | 
				
			
			@ -631,7 +632,7 @@ export default class SpecialVisualizations {
 | 
			
		|||
                            .map((tags) => tags[args[0]])
 | 
			
		||||
                            .map((wikidata) => {
 | 
			
		||||
                                wikidata = Utils.NoEmpty(
 | 
			
		||||
                                    wikidata?.split(";")?.map((wd) => wd.trim()) ?? []
 | 
			
		||||
                                    wikidata?.split(";")?.map((wd) => wd.trim()) ?? [],
 | 
			
		||||
                                )[0]
 | 
			
		||||
                                const entry = Wikidata.LoadWikidataEntry(wikidata)
 | 
			
		||||
                                return new VariableUiElement(
 | 
			
		||||
| 
						 | 
				
			
			@ -641,9 +642,9 @@ export default class SpecialVisualizations {
 | 
			
		|||
                                        }
 | 
			
		||||
                                        const response = <WikidataResponse>e["success"]
 | 
			
		||||
                                        return Translation.fromMap(response.labels)
 | 
			
		||||
                                    })
 | 
			
		||||
                                    }),
 | 
			
		||||
                                )
 | 
			
		||||
                            })
 | 
			
		||||
                            }),
 | 
			
		||||
                    ),
 | 
			
		||||
            },
 | 
			
		||||
            new MapillaryLinkVis(),
 | 
			
		||||
| 
						 | 
				
			
			@ -657,7 +658,7 @@ export default class SpecialVisualizations {
 | 
			
		|||
                    tags: UIEventSource<Record<string, string>>,
 | 
			
		||||
                    _,
 | 
			
		||||
                    __,
 | 
			
		||||
                    layer: LayerConfig
 | 
			
		||||
                    layer: LayerConfig,
 | 
			
		||||
                ) => new SvelteUIElement(AllTagsPanel, { tags, layer }),
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
| 
						 | 
				
			
			@ -679,7 +680,7 @@ export default class SpecialVisualizations {
 | 
			
		|||
                    return new ImageCarousel(
 | 
			
		||||
                        AllImageProviders.LoadImagesFor(tags, imagePrefixes),
 | 
			
		||||
                        tags,
 | 
			
		||||
                        state
 | 
			
		||||
                        state,
 | 
			
		||||
                    )
 | 
			
		||||
                },
 | 
			
		||||
            },
 | 
			
		||||
| 
						 | 
				
			
			@ -736,7 +737,7 @@ export default class SpecialVisualizations {
 | 
			
		|||
                            nameKey: nameKey,
 | 
			
		||||
                            fallbackName,
 | 
			
		||||
                        },
 | 
			
		||||
                        state.featureSwitchIsTesting
 | 
			
		||||
                        state.featureSwitchIsTesting,
 | 
			
		||||
                    )
 | 
			
		||||
                    return new SvelteUIElement(StarsBarIcon, {
 | 
			
		||||
                        score: reviews.average,
 | 
			
		||||
| 
						 | 
				
			
			@ -770,7 +771,7 @@ export default class SpecialVisualizations {
 | 
			
		|||
                            nameKey: nameKey,
 | 
			
		||||
                            fallbackName,
 | 
			
		||||
                        },
 | 
			
		||||
                        state.featureSwitchIsTesting
 | 
			
		||||
                        state.featureSwitchIsTesting,
 | 
			
		||||
                    )
 | 
			
		||||
                    return new SvelteUIElement(ReviewForm, { reviews, state, tags, feature, layer })
 | 
			
		||||
                },
 | 
			
		||||
| 
						 | 
				
			
			@ -803,7 +804,7 @@ export default class SpecialVisualizations {
 | 
			
		|||
                            nameKey: nameKey,
 | 
			
		||||
                            fallbackName,
 | 
			
		||||
                        },
 | 
			
		||||
                        state.featureSwitchIsTesting
 | 
			
		||||
                        state.featureSwitchIsTesting,
 | 
			
		||||
                    )
 | 
			
		||||
                    return new SvelteUIElement(AllReviews, { reviews, state, tags, feature, layer })
 | 
			
		||||
                },
 | 
			
		||||
| 
						 | 
				
			
			@ -821,7 +822,7 @@ export default class SpecialVisualizations {
 | 
			
		|||
                constr(
 | 
			
		||||
                    state: SpecialVisualizationState,
 | 
			
		||||
                    _: UIEventSource<Record<string, string>>,
 | 
			
		||||
                    argument: string[]
 | 
			
		||||
                    argument: string[],
 | 
			
		||||
                ): BaseUIElement {
 | 
			
		||||
                    const [text] = argument
 | 
			
		||||
                    return new SvelteUIElement(ImportReviewIdentity, { state, text })
 | 
			
		||||
| 
						 | 
				
			
			@ -878,7 +879,7 @@ export default class SpecialVisualizations {
 | 
			
		|||
                constr(
 | 
			
		||||
                    state: SpecialVisualizationState,
 | 
			
		||||
                    tags: UIEventSource<Record<string, string>>,
 | 
			
		||||
                    args: string[]
 | 
			
		||||
                    args: string[],
 | 
			
		||||
                ): SvelteUIElement {
 | 
			
		||||
                    const keyToUse = args[0]
 | 
			
		||||
                    const prefix = args[1]
 | 
			
		||||
| 
						 | 
				
			
			@ -915,17 +916,17 @@ export default class SpecialVisualizations {
 | 
			
		|||
                                    return undefined
 | 
			
		||||
                                }
 | 
			
		||||
                                const allUnits: Unit[] = [].concat(
 | 
			
		||||
                                    ...(state?.layout?.layers?.map((lyr) => lyr.units) ?? [])
 | 
			
		||||
                                    ...(state?.layout?.layers?.map((lyr) => lyr.units) ?? []),
 | 
			
		||||
                                )
 | 
			
		||||
                                const unit = allUnits.filter((unit) =>
 | 
			
		||||
                                    unit.isApplicableToKey(key)
 | 
			
		||||
                                    unit.isApplicableToKey(key),
 | 
			
		||||
                                )[0]
 | 
			
		||||
                                if (unit === undefined) {
 | 
			
		||||
                                    return value
 | 
			
		||||
                                }
 | 
			
		||||
                                const getCountry = () => tagSource.data._country
 | 
			
		||||
                                return unit.asHumanLongValue(value, getCountry)
 | 
			
		||||
                            })
 | 
			
		||||
                            }),
 | 
			
		||||
                    )
 | 
			
		||||
                },
 | 
			
		||||
            },
 | 
			
		||||
| 
						 | 
				
			
			@ -942,7 +943,7 @@ export default class SpecialVisualizations {
 | 
			
		|||
                        new Combine([
 | 
			
		||||
                            t.downloadFeatureAsGeojson.SetClass("font-bold text-lg"),
 | 
			
		||||
                            t.downloadGeoJsonHelper.SetClass("subtle"),
 | 
			
		||||
                        ]).SetClass("flex flex-col")
 | 
			
		||||
                        ]).SetClass("flex flex-col"),
 | 
			
		||||
                    )
 | 
			
		||||
                        .onClick(() => {
 | 
			
		||||
                            console.log("Exporting as Geojson")
 | 
			
		||||
| 
						 | 
				
			
			@ -955,7 +956,7 @@ export default class SpecialVisualizations {
 | 
			
		|||
                                title + "_mapcomplete_export.geojson",
 | 
			
		||||
                                {
 | 
			
		||||
                                    mimetype: "application/vnd.geo+json",
 | 
			
		||||
                                }
 | 
			
		||||
                                },
 | 
			
		||||
                            )
 | 
			
		||||
                        })
 | 
			
		||||
                        .SetClass("w-full")
 | 
			
		||||
| 
						 | 
				
			
			@ -991,7 +992,7 @@ export default class SpecialVisualizations {
 | 
			
		|||
                constr: (state) => {
 | 
			
		||||
                    return new SubtleButton(
 | 
			
		||||
                        new SvelteUIElement(Trash).SetClass("h-6"),
 | 
			
		||||
                        Translations.t.general.removeLocationHistory
 | 
			
		||||
                        Translations.t.general.removeLocationHistory,
 | 
			
		||||
                    ).onClick(() => {
 | 
			
		||||
                        state.historicalUserLocations.features.setData([])
 | 
			
		||||
                        state.selectedElement.setData(undefined)
 | 
			
		||||
| 
						 | 
				
			
			@ -1029,10 +1030,10 @@ export default class SpecialVisualizations {
 | 
			
		|||
                                        .filter((c) => c.text !== "")
 | 
			
		||||
                                        .map(
 | 
			
		||||
                                            (c, i) =>
 | 
			
		||||
                                                new NoteCommentElement(c, state, i, comments.length)
 | 
			
		||||
                                        )
 | 
			
		||||
                                                new NoteCommentElement(c, state, i, comments.length),
 | 
			
		||||
                                        ),
 | 
			
		||||
                                ).SetClass("flex flex-col")
 | 
			
		||||
                            })
 | 
			
		||||
                            }),
 | 
			
		||||
                    ),
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
| 
						 | 
				
			
			@ -1066,7 +1067,7 @@ export default class SpecialVisualizations {
 | 
			
		|||
                    tagsSource: UIEventSource<Record<string, string>>,
 | 
			
		||||
                    _: string[],
 | 
			
		||||
                    feature: Feature,
 | 
			
		||||
                    layer: LayerConfig
 | 
			
		||||
                    layer: LayerConfig,
 | 
			
		||||
                ) =>
 | 
			
		||||
                    new VariableUiElement(
 | 
			
		||||
                        tagsSource.map((tags) => {
 | 
			
		||||
| 
						 | 
				
			
			@ -1086,7 +1087,7 @@ export default class SpecialVisualizations {
 | 
			
		|||
                            })
 | 
			
		||||
                                .SetClass("px-1")
 | 
			
		||||
                                .setSpan()
 | 
			
		||||
                        })
 | 
			
		||||
                        }),
 | 
			
		||||
                    ),
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
| 
						 | 
				
			
			@ -1102,8 +1103,8 @@ export default class SpecialVisualizations {
 | 
			
		|||
                    const challenge = Stores.FromPromise(
 | 
			
		||||
                        Utils.downloadJsonCached<MaprouletteTask>(
 | 
			
		||||
                            `${Maproulette.defaultEndpoint}/challenge/${parentId}`,
 | 
			
		||||
                            24 * 60 * 60 * 1000
 | 
			
		||||
                        )
 | 
			
		||||
                            24 * 60 * 60 * 1000,
 | 
			
		||||
                        ),
 | 
			
		||||
                    )
 | 
			
		||||
 | 
			
		||||
                    return new VariableUiElement(
 | 
			
		||||
| 
						 | 
				
			
			@ -1128,7 +1129,7 @@ export default class SpecialVisualizations {
 | 
			
		|||
                            } else {
 | 
			
		||||
                                return [title, new List(listItems)]
 | 
			
		||||
                            }
 | 
			
		||||
                        })
 | 
			
		||||
                        }),
 | 
			
		||||
                    )
 | 
			
		||||
                },
 | 
			
		||||
                docs: "Fetches the metadata of MapRoulette campaign that this task is part of and shows those details (namely `title`, `description` and `instruction`).\n\nThis reads the property `mr_challengeId` to detect the parent campaign.",
 | 
			
		||||
| 
						 | 
				
			
			@ -1142,15 +1143,15 @@ export default class SpecialVisualizations {
 | 
			
		|||
                    "\n" +
 | 
			
		||||
                    "```json\n" +
 | 
			
		||||
                    "{\n" +
 | 
			
		||||
                    '   "id": "mark_duplicate",\n' +
 | 
			
		||||
                    '   "render": {\n' +
 | 
			
		||||
                    '      "special": {\n' +
 | 
			
		||||
                    '         "type": "maproulette_set_status",\n' +
 | 
			
		||||
                    '         "message": {\n' +
 | 
			
		||||
                    '            "en": "Mark as not found or false positive"\n' +
 | 
			
		||||
                    "   \"id\": \"mark_duplicate\",\n" +
 | 
			
		||||
                    "   \"render\": {\n" +
 | 
			
		||||
                    "      \"special\": {\n" +
 | 
			
		||||
                    "         \"type\": \"maproulette_set_status\",\n" +
 | 
			
		||||
                    "         \"message\": {\n" +
 | 
			
		||||
                    "            \"en\": \"Mark as not found or false positive\"\n" +
 | 
			
		||||
                    "         },\n" +
 | 
			
		||||
                    '         "status": "2",\n' +
 | 
			
		||||
                    '         "image": "close"\n' +
 | 
			
		||||
                    "         \"status\": \"2\",\n" +
 | 
			
		||||
                    "         \"image\": \"close\"\n" +
 | 
			
		||||
                    "      }\n" +
 | 
			
		||||
                    "   }\n" +
 | 
			
		||||
                    "}\n" +
 | 
			
		||||
| 
						 | 
				
			
			@ -1226,7 +1227,7 @@ export default class SpecialVisualizations {
 | 
			
		|||
                                (l) =>
 | 
			
		||||
                                    l.name !== null &&
 | 
			
		||||
                                    l.title &&
 | 
			
		||||
                                    state.perLayer.get(l.id) !== undefined
 | 
			
		||||
                                    state.perLayer.get(l.id) !== undefined,
 | 
			
		||||
                            )
 | 
			
		||||
                            .map(
 | 
			
		||||
                                (l) => {
 | 
			
		||||
| 
						 | 
				
			
			@ -1236,8 +1237,8 @@ export default class SpecialVisualizations {
 | 
			
		|||
                                    const fsBboxed = new BBoxFeatureSourceForLayer(fs, bbox)
 | 
			
		||||
                                    return new StatisticsPanel(fsBboxed)
 | 
			
		||||
                                },
 | 
			
		||||
                                [state.mapProperties.bounds]
 | 
			
		||||
                            )
 | 
			
		||||
                                [state.mapProperties.bounds],
 | 
			
		||||
                            ),
 | 
			
		||||
                    )
 | 
			
		||||
                },
 | 
			
		||||
            },
 | 
			
		||||
| 
						 | 
				
			
			@ -1300,14 +1301,19 @@ export default class SpecialVisualizations {
 | 
			
		|||
                    },
 | 
			
		||||
                    {
 | 
			
		||||
                        name: "icon",
 | 
			
		||||
<<<<<<< HEAD
 | 
			
		||||
                        doc: "If set, show this icon next to the link. You might want to combine this with `class: button`"
 | 
			
		||||
                    }
 | 
			
		||||
=======
 | 
			
		||||
                        doc: "If set, show this icon next to the link. You might want to combine this with `class: button`",
 | 
			
		||||
                    },
 | 
			
		||||
>>>>>>> 8277bd3a1 (Move hotel to 'tourism_accomodation', include hostels, fix #2070)
 | 
			
		||||
                ],
 | 
			
		||||
 | 
			
		||||
                constr(
 | 
			
		||||
                    state: SpecialVisualizationState,
 | 
			
		||||
                    tagSource: UIEventSource<Record<string, string>>,
 | 
			
		||||
                    args: string[]
 | 
			
		||||
                    args: string[],
 | 
			
		||||
                ): BaseUIElement {
 | 
			
		||||
                    let [text, href, classnames, download, ariaLabel, icon] = args
 | 
			
		||||
                    if (download === "") {
 | 
			
		||||
| 
						 | 
				
			
			@ -1319,8 +1325,8 @@ export default class SpecialVisualizations {
 | 
			
		|||
                        (tags) =>
 | 
			
		||||
                            Utils.SubstituteKeys(href, tags).replaceAll(
 | 
			
		||||
                                / /g,
 | 
			
		||||
                                "%20"
 | 
			
		||||
                            ) /* Chromium based browsers eat the spaces */
 | 
			
		||||
                                "%20",
 | 
			
		||||
                            ), /* Chromium based browsers eat the spaces */
 | 
			
		||||
                    )
 | 
			
		||||
                    return new SvelteUIElement(DynLink, {
 | 
			
		||||
                        text: textStore,
 | 
			
		||||
| 
						 | 
				
			
			@ -1329,7 +1335,7 @@ export default class SpecialVisualizations {
 | 
			
		|||
                        download: tagSource.map((tags) => Utils.SubstituteKeys(download, tags)),
 | 
			
		||||
                        ariaLabel: tagSource.map((tags) => Utils.SubstituteKeys(ariaLabel, tags)),
 | 
			
		||||
                        newTab: new ImmutableStore(newTab),
 | 
			
		||||
                        icon: tagSource.map((tags) => Utils.SubstituteKeys(icon, tags))
 | 
			
		||||
                        icon: tagSource.map((tags) => Utils.SubstituteKeys(icon, tags)),
 | 
			
		||||
                    }).setSpan()
 | 
			
		||||
                },
 | 
			
		||||
            },
 | 
			
		||||
| 
						 | 
				
			
			@ -1351,7 +1357,7 @@ export default class SpecialVisualizations {
 | 
			
		|||
                            },
 | 
			
		||||
                        },
 | 
			
		||||
                        null,
 | 
			
		||||
                        "  "
 | 
			
		||||
                        "  ",
 | 
			
		||||
                    ) +
 | 
			
		||||
                    "\n```",
 | 
			
		||||
                args: [
 | 
			
		||||
| 
						 | 
				
			
			@ -1375,7 +1381,7 @@ export default class SpecialVisualizations {
 | 
			
		|||
                    featureTags: UIEventSource<Record<string, string>>,
 | 
			
		||||
                    args: string[],
 | 
			
		||||
                    feature: Feature,
 | 
			
		||||
                    layer: LayerConfig
 | 
			
		||||
                    layer: LayerConfig,
 | 
			
		||||
                ) {
 | 
			
		||||
                    const [key, tr, classesRaw] = args
 | 
			
		||||
                    let classes = classesRaw ?? ""
 | 
			
		||||
| 
						 | 
				
			
			@ -1393,7 +1399,7 @@ export default class SpecialVisualizations {
 | 
			
		|||
                                    "Could not create a special visualization for multi(",
 | 
			
		||||
                                    args.join(", ") + ")",
 | 
			
		||||
                                    "no properties found for object",
 | 
			
		||||
                                    feature.properties.id
 | 
			
		||||
                                    feature.properties.id,
 | 
			
		||||
                                )
 | 
			
		||||
                                return undefined
 | 
			
		||||
                            }
 | 
			
		||||
| 
						 | 
				
			
			@ -1409,7 +1415,7 @@ export default class SpecialVisualizations {
 | 
			
		|||
                                elements.push(subsTr)
 | 
			
		||||
                            }
 | 
			
		||||
                            return elements
 | 
			
		||||
                        })
 | 
			
		||||
                        }),
 | 
			
		||||
                    )
 | 
			
		||||
                },
 | 
			
		||||
            },
 | 
			
		||||
| 
						 | 
				
			
			@ -1429,7 +1435,7 @@ export default class SpecialVisualizations {
 | 
			
		|||
                    tagSource: UIEventSource<Record<string, string>>,
 | 
			
		||||
                    argument: string[],
 | 
			
		||||
                    feature: Feature,
 | 
			
		||||
                    layer: LayerConfig
 | 
			
		||||
                    layer: LayerConfig,
 | 
			
		||||
                ): BaseUIElement {
 | 
			
		||||
                    return new VariableUiElement(
 | 
			
		||||
                        tagSource.map((tags) => {
 | 
			
		||||
| 
						 | 
				
			
			@ -1441,7 +1447,7 @@ export default class SpecialVisualizations {
 | 
			
		|||
                                console.error("Cannot create a translation for", v, "due to", e)
 | 
			
		||||
                                return JSON.stringify(v)
 | 
			
		||||
                            }
 | 
			
		||||
                        })
 | 
			
		||||
                        }),
 | 
			
		||||
                    )
 | 
			
		||||
                },
 | 
			
		||||
            },
 | 
			
		||||
| 
						 | 
				
			
			@ -1461,7 +1467,7 @@ export default class SpecialVisualizations {
 | 
			
		|||
                    tagSource: UIEventSource<Record<string, string>>,
 | 
			
		||||
                    argument: string[],
 | 
			
		||||
                    feature: Feature,
 | 
			
		||||
                    layer: LayerConfig
 | 
			
		||||
                    layer: LayerConfig,
 | 
			
		||||
                ): BaseUIElement {
 | 
			
		||||
                    const key = argument[0]
 | 
			
		||||
                    const validator = new FediverseValidator()
 | 
			
		||||
| 
						 | 
				
			
			@ -1471,7 +1477,7 @@ export default class SpecialVisualizations {
 | 
			
		|||
                            .map((fediAccount) => {
 | 
			
		||||
                                fediAccount = validator.reformat(fediAccount)
 | 
			
		||||
                                const [_, username, host] = fediAccount.match(
 | 
			
		||||
                                    FediverseValidator.usernameAtServer
 | 
			
		||||
                                    FediverseValidator.usernameAtServer,
 | 
			
		||||
                                )
 | 
			
		||||
 | 
			
		||||
                                const normalLink = new SvelteUIElement(Link, {
 | 
			
		||||
| 
						 | 
				
			
			@ -1483,10 +1489,10 @@ export default class SpecialVisualizations {
 | 
			
		|||
                                const loggedInContributorMastodon =
 | 
			
		||||
                                    state.userRelatedState?.preferencesAsTags?.data?.[
 | 
			
		||||
                                        "_mastodon_link"
 | 
			
		||||
                                    ]
 | 
			
		||||
                                        ]
 | 
			
		||||
                                console.log(
 | 
			
		||||
                                    "LoggedinContributorMastodon",
 | 
			
		||||
                                    loggedInContributorMastodon
 | 
			
		||||
                                    loggedInContributorMastodon,
 | 
			
		||||
                                )
 | 
			
		||||
                                if (!loggedInContributorMastodon) {
 | 
			
		||||
                                    return normalLink
 | 
			
		||||
| 
						 | 
				
			
			@ -1502,7 +1508,7 @@ export default class SpecialVisualizations {
 | 
			
		|||
                                        newTab: true,
 | 
			
		||||
                                    }).SetClass("button"),
 | 
			
		||||
                                ])
 | 
			
		||||
                            })
 | 
			
		||||
                            }),
 | 
			
		||||
                    )
 | 
			
		||||
                },
 | 
			
		||||
            },
 | 
			
		||||
| 
						 | 
				
			
			@ -1522,7 +1528,7 @@ export default class SpecialVisualizations {
 | 
			
		|||
                    tagSource: UIEventSource<Record<string, string>>,
 | 
			
		||||
                    args: string[],
 | 
			
		||||
                    feature: Feature,
 | 
			
		||||
                    layer: LayerConfig
 | 
			
		||||
                    layer: LayerConfig,
 | 
			
		||||
                ): BaseUIElement {
 | 
			
		||||
                    return new FixedUiElement("{" + args[0] + "}")
 | 
			
		||||
                },
 | 
			
		||||
| 
						 | 
				
			
			@ -1543,7 +1549,7 @@ export default class SpecialVisualizations {
 | 
			
		|||
                    tagSource: UIEventSource<Record<string, string>>,
 | 
			
		||||
                    argument: string[],
 | 
			
		||||
                    feature: Feature,
 | 
			
		||||
                    layer: LayerConfig
 | 
			
		||||
                    layer: LayerConfig,
 | 
			
		||||
                ): BaseUIElement {
 | 
			
		||||
                    const key = argument[0] ?? "value"
 | 
			
		||||
                    return new VariableUiElement(
 | 
			
		||||
| 
						 | 
				
			
			@ -1561,12 +1567,12 @@ export default class SpecialVisualizations {
 | 
			
		|||
                            } catch (e) {
 | 
			
		||||
                                return new FixedUiElement(
 | 
			
		||||
                                    "Could not parse this tag: " +
 | 
			
		||||
                                        JSON.stringify(value) +
 | 
			
		||||
                                        " due to " +
 | 
			
		||||
                                        e
 | 
			
		||||
                                    JSON.stringify(value) +
 | 
			
		||||
                                    " due to " +
 | 
			
		||||
                                    e,
 | 
			
		||||
                                ).SetClass("alert")
 | 
			
		||||
                            }
 | 
			
		||||
                        })
 | 
			
		||||
                        }),
 | 
			
		||||
                    )
 | 
			
		||||
                },
 | 
			
		||||
            },
 | 
			
		||||
| 
						 | 
				
			
			@ -1587,7 +1593,7 @@ export default class SpecialVisualizations {
 | 
			
		|||
                    tagSource: UIEventSource<Record<string, string>>,
 | 
			
		||||
                    argument: string[],
 | 
			
		||||
                    feature: Feature,
 | 
			
		||||
                    layer: LayerConfig
 | 
			
		||||
                    layer: LayerConfig,
 | 
			
		||||
                ): BaseUIElement {
 | 
			
		||||
                    const giggityUrl = argument[0]
 | 
			
		||||
                    return new SvelteUIElement(Giggity, { tags: tagSource, state, giggityUrl })
 | 
			
		||||
| 
						 | 
				
			
			@ -1603,12 +1609,12 @@ export default class SpecialVisualizations {
 | 
			
		|||
                    _: UIEventSource<Record<string, string>>,
 | 
			
		||||
                    argument: string[],
 | 
			
		||||
                    feature: Feature,
 | 
			
		||||
                    layer: LayerConfig
 | 
			
		||||
                    layer: LayerConfig,
 | 
			
		||||
                ): BaseUIElement {
 | 
			
		||||
                    const tags = (<ThemeViewState>(
 | 
			
		||||
                        state
 | 
			
		||||
                    )).geolocation.currentUserLocation.features.map(
 | 
			
		||||
                        (features) => features[0]?.properties
 | 
			
		||||
                        (features) => features[0]?.properties,
 | 
			
		||||
                    )
 | 
			
		||||
                    return new Combine([
 | 
			
		||||
                        new SvelteUIElement(OrientationDebugPanel, {}),
 | 
			
		||||
| 
						 | 
				
			
			@ -1630,7 +1636,7 @@ export default class SpecialVisualizations {
 | 
			
		|||
                    tagSource: UIEventSource<Record<string, string>>,
 | 
			
		||||
                    argument: string[],
 | 
			
		||||
                    feature: Feature,
 | 
			
		||||
                    layer: LayerConfig
 | 
			
		||||
                    layer: LayerConfig,
 | 
			
		||||
                ): BaseUIElement {
 | 
			
		||||
                    return new SvelteUIElement(MarkAsFavourite, {
 | 
			
		||||
                        tags: tagSource,
 | 
			
		||||
| 
						 | 
				
			
			@ -1650,7 +1656,7 @@ export default class SpecialVisualizations {
 | 
			
		|||
                    tagSource: UIEventSource<Record<string, string>>,
 | 
			
		||||
                    argument: string[],
 | 
			
		||||
                    feature: Feature,
 | 
			
		||||
                    layer: LayerConfig
 | 
			
		||||
                    layer: LayerConfig,
 | 
			
		||||
                ): BaseUIElement {
 | 
			
		||||
                    return new SvelteUIElement(MarkAsFavouriteMini, {
 | 
			
		||||
                        tags: tagSource,
 | 
			
		||||
| 
						 | 
				
			
			@ -1670,7 +1676,7 @@ export default class SpecialVisualizations {
 | 
			
		|||
                    tagSource: UIEventSource<Record<string, string>>,
 | 
			
		||||
                    argument: string[],
 | 
			
		||||
                    feature: Feature,
 | 
			
		||||
                    layer: LayerConfig
 | 
			
		||||
                    layer: LayerConfig,
 | 
			
		||||
                ): BaseUIElement {
 | 
			
		||||
                    return new SvelteUIElement(DirectionIndicator, { state, feature })
 | 
			
		||||
                },
 | 
			
		||||
| 
						 | 
				
			
			@ -1683,10 +1689,10 @@ export default class SpecialVisualizations {
 | 
			
		|||
                    state: SpecialVisualizationState,
 | 
			
		||||
                    tags: UIEventSource<Record<string, string>>,
 | 
			
		||||
                    argument: string[],
 | 
			
		||||
                    feature: Feature
 | 
			
		||||
                    feature: Feature,
 | 
			
		||||
                ): SvelteUIElement {
 | 
			
		||||
                    return new SvelteUIElement(QrCode , {state, tags, feature}   )
 | 
			
		||||
                }
 | 
			
		||||
                    return new SvelteUIElement(QrCode, { state, tags, feature })
 | 
			
		||||
                },
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                funcName: "direction_absolute",
 | 
			
		||||
| 
						 | 
				
			
			@ -1702,7 +1708,7 @@ export default class SpecialVisualizations {
 | 
			
		|||
                constr(
 | 
			
		||||
                    state: SpecialVisualizationState,
 | 
			
		||||
                    tagSource: UIEventSource<Record<string, string>>,
 | 
			
		||||
                    args: string[]
 | 
			
		||||
                    args: string[],
 | 
			
		||||
                ): BaseUIElement {
 | 
			
		||||
                    const key = args[0] === "" ? "_direction:centerpoint" : args[0]
 | 
			
		||||
                    return new VariableUiElement(
 | 
			
		||||
| 
						 | 
				
			
			@ -1713,11 +1719,11 @@ export default class SpecialVisualizations {
 | 
			
		|||
                            })
 | 
			
		||||
                            .mapD((value) => {
 | 
			
		||||
                                const dir = GeoOperations.bearingToHuman(
 | 
			
		||||
                                    GeoOperations.parseBearing(value)
 | 
			
		||||
                                    GeoOperations.parseBearing(value),
 | 
			
		||||
                                )
 | 
			
		||||
                                console.log("Human dir", dir)
 | 
			
		||||
                                return Translations.t.general.visualFeedback.directionsAbsolute[dir]
 | 
			
		||||
                            })
 | 
			
		||||
                            }),
 | 
			
		||||
                    )
 | 
			
		||||
                },
 | 
			
		||||
            },
 | 
			
		||||
| 
						 | 
				
			
			@ -1747,7 +1753,7 @@ export default class SpecialVisualizations {
 | 
			
		|||
                    tagSource: UIEventSource<Record<string, string>>,
 | 
			
		||||
                    args: string[],
 | 
			
		||||
                    feature: Feature,
 | 
			
		||||
                    layer: LayerConfig
 | 
			
		||||
                    layer: LayerConfig,
 | 
			
		||||
                ): BaseUIElement {
 | 
			
		||||
                    const url = args[0]
 | 
			
		||||
                    const readonly = args[3] === "yes"
 | 
			
		||||
| 
						 | 
				
			
			@ -1773,12 +1779,12 @@ export default class SpecialVisualizations {
 | 
			
		|||
                    tagSource: UIEventSource<Record<string, string>>,
 | 
			
		||||
                    args: string[],
 | 
			
		||||
                    feature: Feature,
 | 
			
		||||
                    layer: LayerConfig
 | 
			
		||||
                    layer: LayerConfig,
 | 
			
		||||
                ): BaseUIElement {
 | 
			
		||||
                    return new Toggle(
 | 
			
		||||
                        undefined,
 | 
			
		||||
                        new SvelteUIElement(LoginButton, { osmConnection: state.osmConnection }),
 | 
			
		||||
                        state.osmConnection.isLoggedIn
 | 
			
		||||
                        state.osmConnection.isLoggedIn,
 | 
			
		||||
                    )
 | 
			
		||||
                },
 | 
			
		||||
            },
 | 
			
		||||
| 
						 | 
				
			
			@ -1816,7 +1822,7 @@ export default class SpecialVisualizations {
 | 
			
		|||
                    tags: UIEventSource<Record<string, string>>,
 | 
			
		||||
                    argument: string[],
 | 
			
		||||
                    feature: Feature,
 | 
			
		||||
                    layer: LayerConfig
 | 
			
		||||
                    layer: LayerConfig,
 | 
			
		||||
                ): BaseUIElement {
 | 
			
		||||
                    const key = argument[0] ?? "website"
 | 
			
		||||
                    const useProxy = argument[1] !== "no"
 | 
			
		||||
| 
						 | 
				
			
			@ -1843,11 +1849,11 @@ export default class SpecialVisualizations {
 | 
			
		|||
                                            const features =
 | 
			
		||||
                                                await LinkedDataLoader.fetchVeloparkEntry(
 | 
			
		||||
                                                    url,
 | 
			
		||||
                                                    loadAll
 | 
			
		||||
                                                    loadAll,
 | 
			
		||||
                                                )
 | 
			
		||||
                                            const feature =
 | 
			
		||||
                                                features.find(
 | 
			
		||||
                                                    (f) => f.properties["ref:velopark"] === url
 | 
			
		||||
                                                    (f) => f.properties["ref:velopark"] === url,
 | 
			
		||||
                                                ) ?? features[0]
 | 
			
		||||
                                            const properties = feature.properties
 | 
			
		||||
                                            properties["ref:velopark"] = url
 | 
			
		||||
| 
						 | 
				
			
			@ -1857,7 +1863,7 @@ export default class SpecialVisualizations {
 | 
			
		|||
                                            console.error(e)
 | 
			
		||||
                                            throw e
 | 
			
		||||
                                        }
 | 
			
		||||
                                    })()
 | 
			
		||||
                                    })(),
 | 
			
		||||
                                )
 | 
			
		||||
                            }
 | 
			
		||||
                            return Stores.FromPromiseWithErr(
 | 
			
		||||
| 
						 | 
				
			
			@ -1866,27 +1872,27 @@ export default class SpecialVisualizations {
 | 
			
		|||
                                        return await LinkedDataLoader.fetchJsonLd(
 | 
			
		||||
                                            url,
 | 
			
		||||
                                            { country },
 | 
			
		||||
                                            useProxy ? "proxy" : "fetch-lod"
 | 
			
		||||
                                            useProxy ? "proxy" : "fetch-lod",
 | 
			
		||||
                                        )
 | 
			
		||||
                                    } catch (e) {
 | 
			
		||||
                                        console.log(
 | 
			
		||||
                                            "Could not get with proxy/download LOD, attempting to download directly. Error for ",
 | 
			
		||||
                                            url,
 | 
			
		||||
                                            "is",
 | 
			
		||||
                                            e
 | 
			
		||||
                                            e,
 | 
			
		||||
                                        )
 | 
			
		||||
                                        return await LinkedDataLoader.fetchJsonLd(
 | 
			
		||||
                                            url,
 | 
			
		||||
                                            { country },
 | 
			
		||||
                                            "fetch-raw"
 | 
			
		||||
                                            "fetch-raw",
 | 
			
		||||
                                        )
 | 
			
		||||
                                    }
 | 
			
		||||
                                })()
 | 
			
		||||
                                })(),
 | 
			
		||||
                            )
 | 
			
		||||
                        })
 | 
			
		||||
 | 
			
		||||
                    externalData.addCallbackAndRunD((lod) =>
 | 
			
		||||
                        console.log("linked_data_from_website received the following data:", lod)
 | 
			
		||||
                        console.log("linked_data_from_website received the following data:", lod),
 | 
			
		||||
                    )
 | 
			
		||||
 | 
			
		||||
                    return new Toggle(
 | 
			
		||||
| 
						 | 
				
			
			@ -1901,7 +1907,7 @@ export default class SpecialVisualizations {
 | 
			
		|||
                            collapsed: isClosed,
 | 
			
		||||
                        }),
 | 
			
		||||
                        undefined,
 | 
			
		||||
                        url.map((url) => !!url)
 | 
			
		||||
                        url.map((url) => !!url),
 | 
			
		||||
                    )
 | 
			
		||||
                },
 | 
			
		||||
            },
 | 
			
		||||
| 
						 | 
				
			
			@ -1921,7 +1927,7 @@ export default class SpecialVisualizations {
 | 
			
		|||
                    tagSource: UIEventSource<Record<string, string>>,
 | 
			
		||||
                    argument: string[],
 | 
			
		||||
                    feature: Feature,
 | 
			
		||||
                    layer: LayerConfig
 | 
			
		||||
                    layer: LayerConfig,
 | 
			
		||||
                ): BaseUIElement {
 | 
			
		||||
                    const text = argument[0]
 | 
			
		||||
                    const cssClasses = argument[1]
 | 
			
		||||
| 
						 | 
				
			
			@ -1943,7 +1949,7 @@ export default class SpecialVisualizations {
 | 
			
		|||
                    tagSource: UIEventSource<Record<string, string>>,
 | 
			
		||||
                    argument: string[],
 | 
			
		||||
                    feature: Feature,
 | 
			
		||||
                    layer: LayerConfig
 | 
			
		||||
                    layer: LayerConfig,
 | 
			
		||||
                ): BaseUIElement {
 | 
			
		||||
                    const translation = tagSource.map((tags) => {
 | 
			
		||||
                        const presets = state.layout.getMatchingLayer(tags)?.presets
 | 
			
		||||
| 
						 | 
				
			
			@ -1977,25 +1983,51 @@ export default class SpecialVisualizations {
 | 
			
		|||
                }
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                funcName:"pending_changes",
 | 
			
		||||
                funcName: "preset_type_select",
 | 
			
		||||
                docs: "An editable tag rendering which allows to change the type",
 | 
			
		||||
                args: [],
 | 
			
		||||
                constr(state: SpecialVisualizationState, tags: UIEventSource<Record<string, string>>, argument: string[], selectedElement: Feature, layer: LayerConfig): SvelteUIElement {
 | 
			
		||||
                    const t = Translations.t.preset_type
 | 
			
		||||
                    const question: QuestionableTagRenderingConfigJson = {
 | 
			
		||||
                        id: layer.id + "-type",
 | 
			
		||||
                        question: t.question.translations,
 | 
			
		||||
                        mappings: layer.presets.map(pr => {
 | 
			
		||||
                            return {
 | 
			
		||||
                                if: new And(pr.tags).asJson(),
 | 
			
		||||
                                then: (pr.description ? t.typeDescription : t.typeTitle).Subs({
 | 
			
		||||
                                    title: pr.title,
 | 
			
		||||
                                    description: pr.description,
 | 
			
		||||
                                }).translations,
 | 
			
		||||
                            }
 | 
			
		||||
                        }),
 | 
			
		||||
                    }
 | 
			
		||||
                    const config = new TagRenderingConfig(question)
 | 
			
		||||
                    return new SvelteUIElement(TagRenderingEditable, {
 | 
			
		||||
                        config,
 | 
			
		||||
                        tags, selectedElement, state, layer,
 | 
			
		||||
                    })
 | 
			
		||||
                },
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                funcName: "pending_changes",
 | 
			
		||||
                docs: "A module showing the pending changes, with the option to clear the pending changes",
 | 
			
		||||
                args:[],
 | 
			
		||||
                args: [],
 | 
			
		||||
                constr(state: SpecialVisualizationState, tagSource: UIEventSource<Record<string, string>>, argument: string[], feature: Feature, layer: LayerConfig): BaseUIElement {
 | 
			
		||||
                    return new SvelteUIElement(PendingChangesIndicator, {state, compact: false})
 | 
			
		||||
                }
 | 
			
		||||
                    return new SvelteUIElement(PendingChangesIndicator, { state, compact: false })
 | 
			
		||||
                },
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
                funcName: "clear_caches",
 | 
			
		||||
                docs: "A button which clears the locally downloaded data and the service worker. Login status etc will be kept",
 | 
			
		||||
                args:[
 | 
			
		||||
                args: [
 | 
			
		||||
                    {
 | 
			
		||||
                        name: "text",
 | 
			
		||||
                        required: true,
 | 
			
		||||
                        doc: "The text to show on the button"
 | 
			
		||||
                    }
 | 
			
		||||
                        doc: "The text to show on the button",
 | 
			
		||||
                    },
 | 
			
		||||
                ],
 | 
			
		||||
                constr(state: SpecialVisualizationState, tagSource: UIEventSource<Record<string, string>>, argument: string[], feature: Feature, layer: LayerConfig): SvelteUIElement {
 | 
			
		||||
                    return new SvelteUIElement<any, any, any>(ClearCaches, {msg: argument[0] ?? "Clear local caches"})
 | 
			
		||||
                    return new SvelteUIElement<any, any, any>(ClearCaches, { msg: argument[0] ?? "Clear local caches" })
 | 
			
		||||
                },
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
| 
						 | 
				
			
			@ -2004,21 +2036,21 @@ export default class SpecialVisualizations {
 | 
			
		|||
                args: [
 | 
			
		||||
                    {
 | 
			
		||||
                        name: "header",
 | 
			
		||||
                        doc: "The _identifier_ of a single tagRendering. This will be used as header"
 | 
			
		||||
                        doc: "The _identifier_ of a single tagRendering. This will be used as header",
 | 
			
		||||
                    },
 | 
			
		||||
                    {
 | 
			
		||||
                        name: "labels",
 | 
			
		||||
                        doc: "A `;`-separated list of either identifiers or label names. All tagRenderings matching this value will be shown in the accordion"
 | 
			
		||||
                    }
 | 
			
		||||
                        doc: "A `;`-separated list of either identifiers or label names. All tagRenderings matching this value will be shown in the accordion",
 | 
			
		||||
                    },
 | 
			
		||||
                ],
 | 
			
		||||
                constr(state: SpecialVisualizationState, tags: UIEventSource<Record<string, string>>, argument: string[], selectedElement: Feature, layer: LayerConfig): SvelteUIElement {
 | 
			
		||||
                    const [header, labelsStr] = argument
 | 
			
		||||
                    const labels = labelsStr.split(";").map(x => x.trim())
 | 
			
		||||
                    return new SvelteUIElement<any, any, any>(GroupedView, {
 | 
			
		||||
                        state, tags, selectedElement, layer, header, labels
 | 
			
		||||
                        state, tags, selectedElement, layer, header, labels,
 | 
			
		||||
                    })
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
                },
 | 
			
		||||
            },
 | 
			
		||||
        ]
 | 
			
		||||
 | 
			
		||||
        specialVisualizations.push(new AutoApplyButton(specialVisualizations))
 | 
			
		||||
| 
						 | 
				
			
			@ -2030,7 +2062,7 @@ export default class SpecialVisualizations {
 | 
			
		|||
            throw (
 | 
			
		||||
                "Invalid special visualisation found: funcName is undefined for " +
 | 
			
		||||
                invalid.map((sp) => sp.i).join(", ") +
 | 
			
		||||
                '. Did you perhaps type \n  funcName: "funcname" // type declaration uses COLON\ninstead of:\n  funcName = "funcName" // value definition uses EQUAL'
 | 
			
		||||
                ". Did you perhaps type \n  funcName: \"funcname\" // type declaration uses COLON\ninstead of:\n  funcName = \"funcName\" // value definition uses EQUAL"
 | 
			
		||||
            )
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue