diff --git a/src/Logic/FeatureSource/Sources/ThemeSource.ts b/src/Logic/FeatureSource/Sources/ThemeSource.ts index 9c7b5008c..80c85b44e 100644 --- a/src/Logic/FeatureSource/Sources/ThemeSource.ts +++ b/src/Logic/FeatureSource/Sources/ThemeSource.ts @@ -1,6 +1,6 @@ import GeoJsonSource from "./GeoJsonSource" import LayerConfig from "../../../Models/ThemeConfig/LayerConfig" -import { UpdatableFeatureSource } from "../FeatureSource" +import { FeatureSource, UpdatableFeatureSource } from "../FeatureSource" import { Or } from "../../Tags/Or" import FeatureSwitchState from "../../State/FeatureSwitchState" import OverpassFeatureSource from "./OverpassFeatureSource" @@ -64,8 +64,8 @@ export default class ThemeSource extends FeatureSourceMerger { const mvtSources: UpdatableFeatureSource[] = osmLayers .filter((f) => mvtAvailableLayers.has(f.id)) .map((l) => ThemeSource.setupMvtSource(l, mapProperties, isDisplayed(l.id))) - const nonMvtSources = [] - const nonMvtLayers = osmLayers.filter((l) => !mvtAvailableLayers.has(l.id)) + const nonMvtSources: FeatureSource[] = [] + const nonMvtLayers: LayerConfig[] = osmLayers.filter((l) => !mvtAvailableLayers.has(l.id)) const isLoading = new UIEventSource(false) diff --git a/src/UI/Popup/ExportAsGpxViz.ts b/src/UI/Popup/ExportAsGpxViz.ts deleted file mode 100644 index c95d0c707..000000000 --- a/src/UI/Popup/ExportAsGpxViz.ts +++ /dev/null @@ -1,49 +0,0 @@ -import Translations from "../i18n/Translations" -import { SubtleButton } from "../Base/SubtleButton" -import Svg from "../../Svg" -import Combine from "../Base/Combine" -import { GeoOperations } from "../../Logic/GeoOperations" -import { Utils } from "../../Utils" -import { SpecialVisualization, SpecialVisualizationState } from "../SpecialVisualization" -import { UIEventSource } from "../../Logic/UIEventSource" -import { Feature, LineString } from "geojson" -import LayerConfig from "../../Models/ThemeConfig/LayerConfig" -import ToSvelte from "../Base/ToSvelte.svelte" -import SvelteUIElement from "../Base/SvelteUIElement" -import ArrowDownTray from "@babeard/svelte-heroicons/mini/ArrowDownTray" - -export class ExportAsGpxViz implements SpecialVisualization { - funcName = "export_as_gpx" - docs = "Exports the selected feature as GPX-file" - args = [] - needsUrls = [] - constr( - state: SpecialVisualizationState, - tagSource: UIEventSource>, - argument: string[], - feature: Feature, - layer: LayerConfig - ) { - const t = Translations.t.general.download - if (feature.geometry.type !== "LineString") { - return undefined - } - return new SubtleButton( - new SvelteUIElement(ArrowDownTray), - new Combine([ - t.downloadFeatureAsGpx.SetClass("font-bold text-lg"), - t.downloadGpxHelper.SetClass("subtle"), - ]).SetClass("flex flex-col") - ) - .SetClass("w-full") - .onClick(() => { - console.log("Exporting as GPX!") - const tags = tagSource.data - const title = layer.title?.GetRenderValue(tags)?.Subs(tags)?.txt ?? "gpx_track" - const gpx = GeoOperations.toGpx(>feature, title) - Utils.offerContentsAsDownloadableFile(gpx, title + "_mapcomplete_export.gpx", { - mimetype: "{gpx=application/gpx+xml}", - }) - }) - } -} diff --git a/src/UI/Popup/ExportFeatureButton.svelte b/src/UI/Popup/ExportFeatureButton.svelte new file mode 100644 index 000000000..57bff1093 --- /dev/null +++ b/src/UI/Popup/ExportFeatureButton.svelte @@ -0,0 +1,43 @@ + + + + diff --git a/src/UI/SpecialVisualizations.ts b/src/UI/SpecialVisualizations.ts index bde54b0b7..f55682774 100644 --- a/src/UI/SpecialVisualizations.ts +++ b/src/UI/SpecialVisualizations.ts @@ -2,11 +2,7 @@ import Combine from "./Base/Combine" import { FixedUiElement } from "./Base/FixedUiElement" import BaseUIElement from "./BaseUIElement" import Title from "./Base/Title" -import { - RenderingSpecification, - SpecialVisualization, - SpecialVisualizationState, -} from "./SpecialVisualization" +import { RenderingSpecification, SpecialVisualization, SpecialVisualizationState } from "./SpecialVisualization" import { HistogramViz } from "./Popup/HistogramViz" import MinimapViz from "./Popup/MinimapViz.svelte" import { ShareLinkViz } from "./Popup/ShareLinkViz" @@ -35,13 +31,13 @@ import FeatureReviews from "../Logic/Web/MangroveReviews" import Maproulette, { MaprouletteTask } from "../Logic/Maproulette" import SvelteUIElement from "./Base/SvelteUIElement" import { BBoxFeatureSourceForLayer } from "../Logic/FeatureSource/Sources/TouchesBboxFeatureSource" -import { Feature, GeoJsonProperties } from "geojson" +import { Feature, GeoJsonProperties, LineString } from "geojson" import { GeoOperations } from "../Logic/GeoOperations" import CreateNewNote from "./Popup/Notes/CreateNewNote.svelte" import AddNewPoint from "./Popup/AddNewPoint/AddNewPoint.svelte" import LayerConfig from "../Models/ThemeConfig/LayerConfig" import TagRenderingConfig from "../Models/ThemeConfig/TagRenderingConfig" -import { ExportAsGpxViz } from "./Popup/ExportAsGpxViz" +import ExportFeatureButton from "./Popup/ExportFeatureButton.svelte" import WikipediaPanel from "./Wikipedia/WikipediaPanel.svelte" import TagRenderingEditable from "./Popup/TagRendering/TagRenderingEditable.svelte" import { PointImportButtonViz } from "./Popup/ImportButtons/PointImportButtonViz" @@ -49,7 +45,6 @@ import WayImportButtonViz from "./Popup/ImportButtons/WayImportButtonViz" import ConflateImportButtonViz from "./Popup/ImportButtons/ConflateImportButtonViz" import DeleteWizard from "./Popup/DeleteFlow/DeleteWizard.svelte" import OpenIdEditor from "./BigComponents/OpenIdEditor.svelte" -import FediverseValidator from "./InputElement/Validators/FediverseValidator" import SendEmail from "./Popup/SendEmail.svelte" import UploadImage from "./Image/UploadImage.svelte" import { Imgur } from "../Logic/ImageProviders/Imgur" @@ -73,7 +68,6 @@ import NearbyImages from "./Image/NearbyImages.svelte" import NearbyImagesCollapsed from "./Image/NearbyImagesCollapsed.svelte" import MoveWizard from "./Popup/MoveWizard.svelte" import { Unit } from "../Models/Unit" -import Link from "./Base/Link.svelte" import OrientationDebugPanel from "./Debug/OrientationDebugPanel.svelte" import MaprouletteSetStatus from "./MapRoulette/MaprouletteSetStatus.svelte" import DirectionIndicator from "./Base/DirectionIndicator.svelte" @@ -127,7 +121,7 @@ class NearbyImageVis implements SpecialVisualization { tags: UIEventSource>, args: string[], feature: Feature, - layer: LayerConfig + layer: LayerConfig, ): SvelteUIElement { const isOpen = args[0] === "open" const readonly = args[1] === "readonly" @@ -194,7 +188,7 @@ class StealViz implements SpecialVisualization { selectedElement: otherFeature, state, layer, - }) + }), ) } if (elements.length === 1) { @@ -202,8 +196,8 @@ class StealViz implements SpecialVisualization { } return new Combine(elements).SetClass("flex flex-col") }, - [state.indexedFeatures.featuresById] - ) + [state.indexedFeatures.featuresById], + ), ) } @@ -255,11 +249,11 @@ class CloseNoteViz implements SpecialVisualization { public constr( state: SpecialVisualizationState, tags: UIEventSource>, - args: string[] + args: string[], ): SvelteUIElement { const { text, icon, idkey, comment, minZoom, zoomButton } = Utils.ParseVisArgs( this.args, - args + args, ) return new SvelteUIElement(CloseNoteButton, { @@ -300,7 +294,7 @@ export class QuestionViz implements SpecialVisualization { tags: UIEventSource>, args: string[], feature: Feature, - layer: LayerConfig + layer: LayerConfig, ): SvelteUIElement { const labels = args[0] ?.split(";") @@ -332,7 +326,7 @@ export default class SpecialVisualizations { for (const specialVisualization of SpecialVisualizations.specialVisualizations) { SpecialVisualizations.specialVisualisationsDict.set( specialVisualization.funcName, - specialVisualization + specialVisualization, ) } } @@ -352,15 +346,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, "" + example + "", @@ -369,18 +363,18 @@ export default class SpecialVisualizations { public static constructSpecification( template: string, - extraMappings: SpecialVisualization[] = [] + extraMappings: SpecialVisualization[] = [], ): RenderingSpecification[] { return SpecialVisualisationUtils.constructSpecification( template, SpecialVisualizations.specialVisualisationsDict, - extraMappings + extraMappings, ) } public static HelpMessage(): string { const helpTexts: string[] = SpecialVisualizations.specialVisualizations.map((viz) => - SpecialVisualizations.DocumentationFor(viz) + SpecialVisualizations.DocumentationFor(viz), ) const firstPart = new Combine([ @@ -413,10 +407,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() @@ -454,10 +448,10 @@ export default class SpecialVisualizations { assignTo: state.userRelatedState.language, availableLanguages: languages, preferredLanguages: state.osmConnection.userDetails.map( - (ud) => ud.languages + (ud) => ud.languages, ), }) - }) + }), ) }, }, @@ -496,7 +490,7 @@ export default class SpecialVisualizations { state: SpecialVisualizationState, tagSource: UIEventSource>, args: string[], - feature: Feature + feature: Feature, ): SvelteUIElement { return new SvelteUIElement(MinimapViz, { state, args, feature, tagSource }) }, @@ -508,7 +502,7 @@ export default class SpecialVisualizations { constr( state: SpecialVisualizationState, - tagSource: UIEventSource> + tagSource: UIEventSource>, ): BaseUIElement { return new VariableUiElement( tagSource @@ -518,7 +512,7 @@ export default class SpecialVisualizations { return new SvelteUIElement(SplitRoadWizard, { id, state }) } return undefined - }) + }), ) }, }, @@ -532,7 +526,7 @@ export default class SpecialVisualizations { tagSource: UIEventSource>, argument: string[], feature: Feature, - layer: LayerConfig + layer: LayerConfig, ): BaseUIElement { if (feature.geometry.type !== "Point") { return undefined @@ -555,7 +549,7 @@ export default class SpecialVisualizations { tagSource: UIEventSource>, argument: string[], feature: Feature, - layer: LayerConfig + layer: LayerConfig, ): BaseUIElement { if (!layer.deletion) { return undefined @@ -570,7 +564,34 @@ export default class SpecialVisualizations { }, }, new ShareLinkViz(), - new ExportAsGpxViz(), + { + funcName: "export_as_gpx", + docs: "Exports the selected feature as GPX-file", + args: [], + needsUrls: [], + + constr( + state: SpecialVisualizationState, + tags: UIEventSource>, + argument: string[], + feature: Feature, + layer: LayerConfig, + ) { + if (feature.geometry.type !== "LineString") { + return undefined + } + const t = Translations.t.general.download + + return new SvelteUIElement(ExportFeatureButton, { + tags, feature, layer, + mimetype: "{gpx=application/gpx+xml}", + extension: "gpx", + construct: (feature: Feature, title: string) => GeoOperations.toGpx(feature, title), + helpertext: t.downloadGpxHelper, + maintext: t.downloadFeatureAsGpx, + }) + }, + }, new UploadToOsmViz(), new MultiApplyViz(), new AddNoteCommentViz(), @@ -583,7 +604,7 @@ export default class SpecialVisualizations { state: SpecialVisualizationState, tagSource: UIEventSource>, argument: string[], - feature: Feature + feature: Feature, ): BaseUIElement { const [lon, lat] = GeoOperations.centerpointCoordinates(feature) return new SvelteUIElement(CreateNewNote, { @@ -646,7 +667,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( @@ -656,9 +677,9 @@ export default class SpecialVisualizations { } const response = e["success"] return Translation.fromMap(response.labels) - }) + }), ) - }) + }), ), }, new MapillaryLinkVis(), @@ -672,7 +693,7 @@ export default class SpecialVisualizations { tags: UIEventSource>, _, __, - layer: LayerConfig + layer: LayerConfig, ) => new SvelteUIElement(AllTagsPanel, { tags, layer }), }, { @@ -694,7 +715,7 @@ export default class SpecialVisualizations { return new ImageCarousel( AllImageProviders.LoadImagesFor(tags, imagePrefixes), tags, - state + state, ) }, }, @@ -758,7 +779,7 @@ export default class SpecialVisualizations { nameKey: nameKey, fallbackName, }, - state.featureSwitchIsTesting + state.featureSwitchIsTesting, ) return new SvelteUIElement(StarsBarIcon, { score: reviews.average, @@ -792,7 +813,7 @@ export default class SpecialVisualizations { nameKey: nameKey, fallbackName, }, - state.featureSwitchIsTesting + state.featureSwitchIsTesting, ) return new SvelteUIElement(ReviewForm, { reviews, state, tags, feature, layer }) }, @@ -823,7 +844,7 @@ export default class SpecialVisualizations { nameKey: nameKey, fallbackName, }, - state.featureSwitchIsTesting + state.featureSwitchIsTesting, ) return new SvelteUIElement(AllReviews, { reviews, state, tags, feature, layer }) }, @@ -849,7 +870,7 @@ export default class SpecialVisualizations { tagSource: UIEventSource>, args: string[], feature: Feature, - layer: LayerConfig + layer: LayerConfig, ): BaseUIElement { return new Combine([ SpecialVisualizations.specialVisualisationsDict["create_review"].constr( @@ -857,14 +878,14 @@ export default class SpecialVisualizations { tagSource, args, feature, - layer + layer, ), SpecialVisualizations.specialVisualisationsDict["list_reviews"].constr( state, tagSource, args, feature, - layer + layer, ), ]) }, @@ -882,7 +903,7 @@ export default class SpecialVisualizations { constr( state: SpecialVisualizationState, _: UIEventSource>, - argument: string[] + argument: string[], ): BaseUIElement { const [text] = argument return new SvelteUIElement(ImportReviewIdentity, { state, text }) @@ -939,7 +960,7 @@ export default class SpecialVisualizations { constr( state: SpecialVisualizationState, tags: UIEventSource>, - args: string[] + args: string[], ): SvelteUIElement { const keyToUse = args[0] const prefix = args[1] @@ -976,17 +997,17 @@ export default class SpecialVisualizations { return undefined } const allUnits: Unit[] = [].concat( - ...(state?.theme?.layers?.map((lyr) => lyr.units) ?? []) + ...(state?.theme?.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) - }) + }), ) }, }, @@ -995,31 +1016,16 @@ export default class SpecialVisualizations { docs: "Exports the selected feature as GeoJson-file", args: [], - constr: (state, tagSource, tagsSource, feature, layer) => { + constr: (state, tags, args, feature, layer) => { const t = Translations.t.general.download - - return new SubtleButton( - new SvelteUIElement(ArrowDownTray), - new Combine([ - t.downloadFeatureAsGeojson.SetClass("font-bold text-lg"), - t.downloadGeoJsonHelper.SetClass("subtle"), - ]).SetClass("flex flex-col") - ) - .onClick(() => { - console.log("Exporting as Geojson") - const tags = tagSource.data - const title = - layer?.title?.GetRenderValue(tags)?.Subs(tags)?.txt ?? "geojson" - const data = JSON.stringify(feature, null, " ") - Utils.offerContentsAsDownloadableFile( - data, - title + "_mapcomplete_export.geojson", - { - mimetype: "application/vnd.geo+json", - } - ) - }) - .SetClass("w-full") + return new SvelteUIElement(ExportFeatureButton, { + tags, feature, layer, + mimetype: "application/vnd.geo+json", + extension: "geojson", + construct: (feature: Feature) => JSON.stringify(feature, null, " "), + maintext: t.downloadFeatureAsGeojson, + helpertext: t.downloadGeoJsonHelper, + }) }, }, { @@ -1052,7 +1058,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) @@ -1093,10 +1099,10 @@ export default class SpecialVisualizations { new SvelteUIElement(NoteCommentElement, { comment, state, - }) - ) + }), + ), ).SetClass("flex flex-col") - }) + }), ), }, { @@ -1129,7 +1135,7 @@ export default class SpecialVisualizations { tagsSource: UIEventSource>, _: string[], feature: Feature, - layer: LayerConfig + layer: LayerConfig, ) => new VariableUiElement( tagsSource.map((tags) => { @@ -1149,7 +1155,7 @@ export default class SpecialVisualizations { }) .SetClass("px-1") .setSpan() - }) + }), ), }, { @@ -1165,8 +1171,8 @@ export default class SpecialVisualizations { const challenge = Stores.FromPromise( Utils.downloadJsonCached( `${Maproulette.defaultEndpoint}/challenge/${parentId}`, - 24 * 60 * 60 * 1000 - ) + 24 * 60 * 60 * 1000, + ), ) return new VariableUiElement( @@ -1191,7 +1197,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.", @@ -1205,15 +1211,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" + @@ -1289,7 +1295,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) => { @@ -1299,8 +1305,8 @@ export default class SpecialVisualizations { const fsBboxed = new BBoxFeatureSourceForLayer(fs, bbox) return new StatisticsPanel(fsBboxed) }, - [state.mapProperties.bounds] - ) + [state.mapProperties.bounds], + ), ) }, }, @@ -1370,7 +1376,7 @@ export default class SpecialVisualizations { constr( state: SpecialVisualizationState, tagSource: UIEventSource>, - args: string[] + args: string[], ): SvelteUIElement { let [text, href, classnames, download, ariaLabel, icon] = args if (download === "") { @@ -1408,7 +1414,7 @@ export default class SpecialVisualizations { }, }, null, - " " + " ", ) + "\n```", args: [ @@ -1432,7 +1438,7 @@ export default class SpecialVisualizations { featureTags: UIEventSource>, args: string[], feature: Feature, - layer: LayerConfig + layer: LayerConfig, ) { const [key, tr, classesRaw] = args let classes = classesRaw ?? "" @@ -1450,7 +1456,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 } @@ -1466,7 +1472,7 @@ export default class SpecialVisualizations { elements.push(subsTr) } return elements - }) + }), ) }, }, @@ -1486,7 +1492,7 @@ export default class SpecialVisualizations { tagSource: UIEventSource>, argument: string[], feature: Feature, - layer: LayerConfig + layer: LayerConfig, ): BaseUIElement { return new VariableUiElement( tagSource.map((tags) => { @@ -1498,7 +1504,7 @@ export default class SpecialVisualizations { console.error("Cannot create a translation for", v, "due to", e) return JSON.stringify(v) } - }) + }), ) }, }, @@ -1518,10 +1524,10 @@ export default class SpecialVisualizations { tags: UIEventSource>, argument: string[], feature: Feature, - layer: LayerConfig + layer: LayerConfig, ): BaseUIElement { const key = argument[0] - return new SvelteUIElement(FediverseLink, {key, tags, state}) + return new SvelteUIElement(FediverseLink, { key, tags, state }) }, }, @@ -1541,7 +1547,7 @@ export default class SpecialVisualizations { tagSource: UIEventSource>, args: string[], feature: Feature, - layer: LayerConfig + layer: LayerConfig, ): BaseUIElement { return new FixedUiElement("{" + args[0] + "}") }, @@ -1562,7 +1568,7 @@ export default class SpecialVisualizations { tagSource: UIEventSource>, argument: string[], feature: Feature, - layer: LayerConfig + layer: LayerConfig, ): BaseUIElement { const key = argument[0] ?? "value" return new VariableUiElement( @@ -1580,12 +1586,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") } - }) + }), ) }, }, @@ -1606,7 +1612,7 @@ export default class SpecialVisualizations { tagSource: UIEventSource>, argument: string[], feature: Feature, - layer: LayerConfig + layer: LayerConfig, ): BaseUIElement { const giggityUrl = argument[0] return new SvelteUIElement(Giggity, { tags: tagSource, state, giggityUrl }) @@ -1622,12 +1628,12 @@ export default class SpecialVisualizations { _: UIEventSource>, argument: string[], feature: Feature, - layer: LayerConfig + layer: LayerConfig, ): BaseUIElement { const tags = (( state )).geolocation.currentUserLocation.features.map( - (features) => features[0]?.properties + (features) => features[0]?.properties, ) return new Combine([ new SvelteUIElement(OrientationDebugPanel, {}), @@ -1649,7 +1655,7 @@ export default class SpecialVisualizations { tagSource: UIEventSource>, argument: string[], feature: Feature, - layer: LayerConfig + layer: LayerConfig, ): BaseUIElement { return new SvelteUIElement(MarkAsFavourite, { tags: tagSource, @@ -1669,7 +1675,7 @@ export default class SpecialVisualizations { tagSource: UIEventSource>, argument: string[], feature: Feature, - layer: LayerConfig + layer: LayerConfig, ): BaseUIElement { return new SvelteUIElement(MarkAsFavouriteMini, { tags: tagSource, @@ -1689,7 +1695,7 @@ export default class SpecialVisualizations { tagSource: UIEventSource>, argument: string[], feature: Feature, - layer: LayerConfig + layer: LayerConfig, ): BaseUIElement { return new SvelteUIElement(DirectionIndicator, { state, feature }) }, @@ -1702,7 +1708,7 @@ export default class SpecialVisualizations { state: SpecialVisualizationState, tags: UIEventSource>, argument: string[], - feature: Feature + feature: Feature, ): SvelteUIElement { return new SvelteUIElement(QrCode, { state, tags, feature }) }, @@ -1721,7 +1727,7 @@ export default class SpecialVisualizations { constr( state: SpecialVisualizationState, tagSource: UIEventSource>, - args: string[] + args: string[], ): BaseUIElement { const key = args[0] === "" ? "_direction:centerpoint" : args[0] return new VariableUiElement( @@ -1732,11 +1738,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] - }) + }), ) }, }, @@ -1766,7 +1772,7 @@ export default class SpecialVisualizations { tagSource: UIEventSource>, args: string[], feature: Feature, - layer: LayerConfig + layer: LayerConfig, ): BaseUIElement { const url = args[0] const readonly = args[3] === "yes" @@ -1792,12 +1798,12 @@ export default class SpecialVisualizations { tagSource: UIEventSource>, 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, ) }, }, @@ -1835,7 +1841,7 @@ export default class SpecialVisualizations { tags: UIEventSource>, argument: string[], feature: Feature, - layer: LayerConfig + layer: LayerConfig, ): BaseUIElement { const key = argument[0] ?? "website" const useProxy = argument[1] !== "no" @@ -1862,11 +1868,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 @@ -1876,7 +1882,7 @@ export default class SpecialVisualizations { console.error(e) throw e } - })() + })(), ) } return Stores.FromPromiseWithErr( @@ -1885,27 +1891,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( @@ -1920,7 +1926,7 @@ export default class SpecialVisualizations { collapsed: isClosed, }), undefined, - url.map((url) => !!url) + url.map((url) => !!url), ) }, }, @@ -1940,7 +1946,7 @@ export default class SpecialVisualizations { tagSource: UIEventSource>, argument: string[], feature: Feature, - layer: LayerConfig + layer: LayerConfig, ): BaseUIElement { const text = argument[0] const cssClasses = argument[1] @@ -1962,7 +1968,7 @@ export default class SpecialVisualizations { tagSource: UIEventSource>, argument: string[], feature: Feature, - layer: LayerConfig + layer: LayerConfig, ): BaseUIElement { const translation = tagSource.map((tags) => { const layer = state.theme.getMatchingLayer(tags) @@ -1980,7 +1986,7 @@ export default class SpecialVisualizations { tagSource: UIEventSource>, argument: string[], feature: Feature, - layer: LayerConfig + layer: LayerConfig, ): BaseUIElement { return new SvelteUIElement(PendingChangesIndicator, { state, compact: false }) }, @@ -2000,7 +2006,7 @@ export default class SpecialVisualizations { tagSource: UIEventSource>, argument: string[], feature: Feature, - layer: LayerConfig + layer: LayerConfig, ): SvelteUIElement { return new SvelteUIElement(ClearCaches, { msg: argument[0] ?? "Clear local caches", @@ -2025,7 +2031,7 @@ export default class SpecialVisualizations { tags: UIEventSource>, argument: string[], selectedElement: Feature, - layer: LayerConfig + layer: LayerConfig, ): SvelteUIElement { const [header, labelsStr] = argument const labels = labelsStr.split(";").map((x) => x.trim()) @@ -2048,7 +2054,7 @@ export default class SpecialVisualizations { tags: UIEventSource>, argument: string[], selectedElement: Feature, - layer: LayerConfig + layer: LayerConfig, ): SvelteUIElement { const t = Translations.t.preset_type const question: QuestionableTagRenderingConfigJson = { @@ -2088,7 +2094,7 @@ export default class SpecialVisualizations { tagSource: UIEventSource>, argument: string[], feature: Feature, - layer: LayerConfig + layer: LayerConfig, ): BaseUIElement { const text = argument[0] return new SubtleButton(undefined, text).onClick(() => { @@ -2110,7 +2116,7 @@ export default class SpecialVisualizations { "Invalid special visualisation found: funcName is undefined or doesn't match " + regex + 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" ) }