From b9bc3f59800af40886b8ef3d2adcda49c84aba1f Mon Sep 17 00:00:00 2001 From: Pieter Vander Vennet Date: Wed, 29 Jan 2025 20:37:04 +0100 Subject: [PATCH] Refactoring: move special visualisations into multiple files --- scripts/generateDocs.ts | 14 +- src/Logic/State/UserSettingsMetaTagging.ts | 48 +- .../ImportButtons/ConflateImportButtonViz.ts | 2 + .../ImportButtons/PointImportButtonViz.ts | 3 +- .../Popup/ImportButtons/WayImportButtonViz.ts | 2 + src/UI/Popup/MapillaryLinkVis.ts | 9 +- src/UI/Popup/PlantNetDetectionViz.ts | 1 + src/UI/Popup/TagApplyButton.ts | 2 + .../DataImportSpecialVisualisations.ts | 211 +++++- .../NoteVisualisations.ts | 50 +- .../ReviewSpecialVisualisations.ts | 172 +++-- ...deringManipulationSpecialVisualisations.ts | 237 ++++++ ...ebAndCommunicationSpecialVisualisations.ts | 193 ++++- src/UI/SpecialVisualizations.ts | 696 +----------------- 14 files changed, 839 insertions(+), 801 deletions(-) diff --git a/scripts/generateDocs.ts b/scripts/generateDocs.ts index 902e302050..0dd694eead 100644 --- a/scripts/generateDocs.ts +++ b/scripts/generateDocs.ts @@ -136,6 +136,11 @@ export class GenerateDocs extends Script { async main(args: string[]) { console.log("Starting documentation generation...") ScriptUtils.fixUtils() + + this.WriteMarkdownFile("./Docs/SpecialRenderings.md", SpecialVisualizations.HelpMessage(), [ + "src/UI/SpecialVisualizations.ts" + ]) + if (!existsSync("./Docs/Themes")) { mkdirSync("./Docs/Themes") } @@ -166,13 +171,12 @@ export class GenerateDocs extends Script { ScriptUtils.erasableLog("Written docs for theme", theme.id) }) - this.WriteMarkdownFile("./Docs/SpecialRenderings.md", SpecialVisualizations.HelpMessage(), [ - "src/UI/SpecialVisualizations.ts", - ]) + this.WriteMarkdownFile( "./Docs/CalculatedTags.md", ["# Metatags", SimpleMetaTaggers.HelpText(), ExtraFunctions.HelpText()].join("\n"), - ["src/Logic/SimpleMetaTagger.ts", "src/Logic/ExtraFunctions.ts"] + ["src/Logic/SimpleMetaTagger.ts", "src/Logic/ExtraFunctions.ts"], + { noTableOfContents: false } ) this.WriteMarkdownFile("./Docs/SpecialInputElements.md", Validators.HelpText(), [ "src/UI/InputElement/Validators.ts", @@ -212,7 +216,7 @@ export class GenerateDocs extends Script { markdown: string, autogenSource: string[], options?: { - noTableOfContents: boolean + noTableOfContents?: boolean } ): void { for (const source of autogenSource) { diff --git a/src/Logic/State/UserSettingsMetaTagging.ts b/src/Logic/State/UserSettingsMetaTagging.ts index 6e568c5c32..33a5ae85b5 100644 --- a/src/Logic/State/UserSettingsMetaTagging.ts +++ b/src/Logic/State/UserSettingsMetaTagging.ts @@ -1,42 +1,14 @@ import { Utils } from "../../Utils" /** This code is autogenerated - do not edit. Edit ./assets/layers/usersettings/usersettings.json instead */ export class ThemeMetaTagging { - public static readonly themeName = "usersettings" + public static readonly themeName = "usersettings" - public metaTaggging_for_usersettings(feat: { properties: Record }) { - Utils.AddLazyProperty(feat.properties, "_mastodon_candidate_md", () => - feat.properties._description - .match(/\[[^\]]*\]\((.*(mastodon|en.osm.town).*)\).*/) - ?.at(1) - ) - Utils.AddLazyProperty( - feat.properties, - "_d", - () => feat.properties._description?.replace(/</g, "<")?.replace(/>/g, ">") ?? "" - ) - Utils.AddLazyProperty(feat.properties, "_mastodon_candidate_a", () => - ((feat) => { - const e = document.createElement("div") - e.innerHTML = feat.properties._d - return Array.from(e.getElementsByTagName("a")).filter( - (a) => a.href.match(/mastodon|en.osm.town/) !== null - )[0]?.href - })(feat) - ) - Utils.AddLazyProperty(feat.properties, "_mastodon_link", () => - ((feat) => { - const e = document.createElement("div") - e.innerHTML = feat.properties._d - return Array.from(e.getElementsByTagName("a")).filter( - (a) => a.getAttribute("rel")?.indexOf("me") >= 0 - )[0]?.href - })(feat) - ) - Utils.AddLazyProperty( - feat.properties, - "_mastodon_candidate", - () => feat.properties._mastodon_candidate_md ?? feat.properties._mastodon_candidate_a - ) - feat.properties["__current_backgroun"] = "initial_value" - } -} + public metaTaggging_for_usersettings(feat: {properties: Record}) { + Utils.AddLazyProperty(feat.properties, '_mastodon_candidate_md', () => feat.properties._description.match(/\[[^\]]*\]\((.*(mastodon|en.osm.town).*)\).*/)?.at(1) ) + Utils.AddLazyProperty(feat.properties, '_d', () => feat.properties._description?.replace(/</g,'<')?.replace(/>/g,'>') ?? '' ) + Utils.AddLazyProperty(feat.properties, '_mastodon_candidate_a', () => (feat => {const e = document.createElement('div');e.innerHTML = feat.properties._d;return Array.from(e.getElementsByTagName("a")).filter(a => a.href.match(/mastodon|en.osm.town/) !== null)[0]?.href }) (feat) ) + Utils.AddLazyProperty(feat.properties, '_mastodon_link', () => (feat => {const e = document.createElement('div');e.innerHTML = feat.properties._d;return Array.from(e.getElementsByTagName("a")).filter(a => a.getAttribute("rel")?.indexOf('me') >= 0)[0]?.href})(feat) ) + Utils.AddLazyProperty(feat.properties, '_mastodon_candidate', () => feat.properties._mastodon_candidate_md ?? feat.properties._mastodon_candidate_a ) + feat.properties['__current_backgroun'] = 'initial_value' + } +} \ No newline at end of file diff --git a/src/UI/Popup/ImportButtons/ConflateImportButtonViz.ts b/src/UI/Popup/ImportButtons/ConflateImportButtonViz.ts index a405d53001..b53ef1c00a 100644 --- a/src/UI/Popup/ImportButtons/ConflateImportButtonViz.ts +++ b/src/UI/Popup/ImportButtons/ConflateImportButtonViz.ts @@ -24,6 +24,8 @@ export interface ConflateFlowArguments extends ImportFlowArguments { export default class ConflateImportButtonViz implements SpecialVisualization, AutoAction { supportsAutoAction: boolean = true needsUrls = [] + group = "data_import" + public readonly funcName: string = "conflate_button" public readonly args: { name: string diff --git a/src/UI/Popup/ImportButtons/PointImportButtonViz.ts b/src/UI/Popup/ImportButtons/PointImportButtonViz.ts index 1eb28f8ec7..f29aa90f6f 100644 --- a/src/UI/Popup/ImportButtons/PointImportButtonViz.ts +++ b/src/UI/Popup/ImportButtons/PointImportButtonViz.ts @@ -2,7 +2,6 @@ import { Feature, Point } from "geojson" import { UIEventSource } from "../../../Logic/UIEventSource" import { SpecialVisualization, SpecialVisualizationState } from "../../SpecialVisualization" import BaseUIElement from "../../BaseUIElement" -import LayerConfig from "../../../Models/ThemeConfig/LayerConfig" import SvelteUIElement from "../../Base/SvelteUIElement" import PointImportFlow from "./PointImportFlow.svelte" import { PointImportFlowArguments, PointImportFlowState } from "./PointImportFlowState" @@ -20,9 +19,11 @@ export class PointImportButtonViz implements SpecialVisualization { public readonly example?: string public readonly args: { name: string; defaultValue?: string; doc: string; split?: boolean }[] public needsUrls = [] + group = "data_import" constructor() { this.funcName = "import_button" + this.docs = "This button will copy the point from an external dataset into OpenStreetMap" + ImportFlowUtils.documentationGeneral diff --git a/src/UI/Popup/ImportButtons/WayImportButtonViz.ts b/src/UI/Popup/ImportButtons/WayImportButtonViz.ts index 73a43b1c8f..954633eca2 100644 --- a/src/UI/Popup/ImportButtons/WayImportButtonViz.ts +++ b/src/UI/Popup/ImportButtons/WayImportButtonViz.ts @@ -21,6 +21,8 @@ import FullNodeDatabaseSource from "../../../Logic/FeatureSource/TiledFeatureSou export default class WayImportButtonViz implements AutoAction, SpecialVisualization { public readonly funcName: string = "import_way_button" needsUrls = [] + group = "data_import" + public readonly docs: string = "This button will copy the data from an external dataset into OpenStreetMap, copying the geometry and adding it as a 'line'" + ImportFlowUtils.documentationGeneral diff --git a/src/UI/Popup/MapillaryLinkVis.ts b/src/UI/Popup/MapillaryLinkVis.ts index b65d24b8bc..ab05fd9e7f 100644 --- a/src/UI/Popup/MapillaryLinkVis.ts +++ b/src/UI/Popup/MapillaryLinkVis.ts @@ -1,13 +1,14 @@ import { GeoOperations } from "../../Logic/GeoOperations" import { ImmutableStore, UIEventSource } from "../../Logic/UIEventSource" -import { SpecialVisualization, SpecialVisualizationState } from "../SpecialVisualization" +import { SpecialVisualizationState, SpecialVisualizationSvelte } from "../SpecialVisualization" import { Feature } from "geojson" -import BaseUIElement from "../BaseUIElement" import SvelteUIElement from "../Base/SvelteUIElement" import MapillaryLink from "../BigComponents/MapillaryLink.svelte" -export class MapillaryLinkVis implements SpecialVisualization { +export class MapillaryLinkVis implements SpecialVisualizationSvelte { funcName = "mapillary_link" + group = "web_and_communication" + docs = "Adds a button to open mapillary on the specified location" needsUrls = [] @@ -24,7 +25,7 @@ export class MapillaryLinkVis implements SpecialVisualization { tagsSource: UIEventSource>, args: string[], feature: Feature - ): BaseUIElement { + ): SvelteUIElement { const [lon, lat] = GeoOperations.centerpointCoordinates(feature) let zoom = Number(args[0]) if (isNaN(zoom)) { diff --git a/src/UI/Popup/PlantNetDetectionViz.ts b/src/UI/Popup/PlantNetDetectionViz.ts index 5d7d0c2d8c..6e7e2efbe7 100644 --- a/src/UI/Popup/PlantNetDetectionViz.ts +++ b/src/UI/Popup/PlantNetDetectionViz.ts @@ -13,6 +13,7 @@ import { default as PlantNetCode } from "../../Logic/Web/PlantNet" export class PlantNetDetectionViz implements SpecialVisualization { funcName = "plantnet_detection" needsUrls = [PlantNetCode.baseUrl] + group = "data_import" docs = "Sends the images linked to the current object to plantnet.org and asks it what plant species is shown on it. The user can then select the correct species; the corresponding wikidata-identifier will then be added to the object (together with `source:species:wikidata=plantnet.org AI`). " diff --git a/src/UI/Popup/TagApplyButton.ts b/src/UI/Popup/TagApplyButton.ts index 1473389a48..61679a56f3 100644 --- a/src/UI/Popup/TagApplyButton.ts +++ b/src/UI/Popup/TagApplyButton.ts @@ -20,6 +20,8 @@ import Icon from "../Map/Icon.svelte" export default class TagApplyButton implements AutoAction, SpecialVisualization { public readonly funcName = "tag_apply" needsUrls = [] + group = "data_import" + public readonly docs = "Shows a big button; clicking this button will apply certain tags onto the feature.\n\nThe first argument takes a specification of which tags to add.\n" + Utils.Special_visualizations_tagsToApplyHelpText diff --git a/src/UI/SpecialVisualisations/DataImportSpecialVisualisations.ts b/src/UI/SpecialVisualisations/DataImportSpecialVisualisations.ts index 9cfdd86b80..7b5da7c41f 100644 --- a/src/UI/SpecialVisualisations/DataImportSpecialVisualisations.ts +++ b/src/UI/SpecialVisualisations/DataImportSpecialVisualisations.ts @@ -1,14 +1,33 @@ -import { SpecialVisualizationSvelte } from "../SpecialVisualization" +import { SpecialVisualization, SpecialVisualizationState } from "../SpecialVisualization" import Maproulette from "../../Logic/Maproulette" import SvelteUIElement from "../Base/SvelteUIElement" import MaprouletteSetStatus from "../MapRoulette/MaprouletteSetStatus.svelte" +import TagApplyButton from "../Popup/TagApplyButton" +import { PointImportButtonViz } from "../Popup/ImportButtons/PointImportButtonViz" +import WayImportButtonViz from "../Popup/ImportButtons/WayImportButtonViz" +import ConflateImportButtonViz from "../Popup/ImportButtons/ConflateImportButtonViz" +import { PlantNetDetectionViz } from "../Popup/PlantNetDetectionViz" +import Constants from "../../Models/Constants" +import { Store, Stores, UIEventSource } from "../../Logic/UIEventSource" +import { Feature, GeoJsonProperties } from "geojson" +import LayerConfig from "../../Models/ThemeConfig/LayerConfig" +import BaseUIElement from "../BaseUIElement" +import LinkedDataLoader from "../../Logic/Web/LinkedDataLoader" +import Toggle from "../Input/Toggle" +import ComparisonTool from "../Comparison/ComparisonTool.svelte" +import { Utils } from "../../Utils" -export class MapRouletteSpecialVisualisations { - public static initList(): SpecialVisualizationSvelte[] { +export class DataImportSpecialVisualisations { + public static initList(): (SpecialVisualization & { group })[] { return [ - { + new TagApplyButton(), + new PointImportButtonViz(), + new WayImportButtonViz(), + new ConflateImportButtonViz(), + new PlantNetDetectionViz(), + { funcName: "maproulette_set_status", - group: "maproulette", + group: "data_import", docs: "Change the status of the given MapRoulette task", needsUrls: [Maproulette.defaultEndpoint], example: @@ -87,6 +106,186 @@ export class MapRouletteSpecialVisualisations { askFeedback }) } - }] + }, + { + funcName: "linked_data_from_website", + group: "data_import", + docs: "Attempts to load (via a proxy) the specified website and parsed ld+json from there. Suitable data will be offered to import into OSM. Note: this element is added by default", + args: [ + { + name: "key", + defaultValue: "website", + doc: "Attempt to load ld+json from the specified URL. This can be in an embedded