import { Store, UIEventSource } from "../Logic/UIEventSource"; import BaseUIElement from "./BaseUIElement"; import LayoutConfig from "../Models/ThemeConfig/LayoutConfig"; import { IndexedFeatureSource, WritableFeatureSource } from "../Logic/FeatureSource/FeatureSource"; import { OsmConnection } from "../Logic/Osm/OsmConnection"; import { Changes } from "../Logic/Osm/Changes"; import { ExportableMap, MapProperties } from "../Models/MapProperties"; import LayerState from "../Logic/State/LayerState"; import { Feature, Geometry, Point } from "geojson"; import FullNodeDatabaseSource from "../Logic/FeatureSource/TiledFeatureSource/FullNodeDatabaseSource"; import { MangroveIdentity } from "../Logic/Web/MangroveReviews"; import { GeoIndexedStoreForLayer } from "../Logic/FeatureSource/Actors/GeoIndexedStore"; import LayerConfig from "../Models/ThemeConfig/LayerConfig"; import FeatureSwitchState from "../Logic/State/FeatureSwitchState"; import { MenuState } from "../Models/MenuState"; import OsmObjectDownloader from "../Logic/Osm/OsmObjectDownloader"; import {RasterLayerPolygon} from "../Models/RasterLayers"; /** * The state needed to render a special Visualisation. */ export interface SpecialVisualizationState { readonly guistate: MenuState readonly layout: LayoutConfig readonly featureSwitches: FeatureSwitchState readonly layerState: LayerState readonly featureProperties: { getStore(id: string): UIEventSource> } readonly indexedFeatures: IndexedFeatureSource /** * Some features will create a new element that should be displayed. * These can be injected by appending them to this featuresource (and pinging it) */ readonly newFeatures: WritableFeatureSource readonly historicalUserLocations: WritableFeatureSource> readonly osmConnection: OsmConnection readonly featureSwitchUserbadge: Store readonly featureSwitchIsTesting: Store readonly changes: Changes readonly osmObjectDownloader: OsmObjectDownloader /** * State of the main map */ readonly mapProperties: MapProperties & ExportableMap readonly selectedElement: UIEventSource /** * Works together with 'selectedElement' to indicate what properties should be displayed */ readonly selectedLayer: UIEventSource /** * If data is currently being fetched from external sources */ readonly dataIsLoading: Store /** * Only needed for 'ReplaceGeometryAction' */ readonly fullNodeDatabase?: FullNodeDatabaseSource readonly perLayer: ReadonlyMap readonly userRelatedState: { readonly showTags: UIEventSource<"no" | undefined | "always" | "yes">; readonly mangroveIdentity: MangroveIdentity readonly showAllQuestionsAtOnce: UIEventSource readonly preferencesAsTags: Store> readonly language: UIEventSource } readonly lastClickObject: WritableFeatureSource readonly availableLayers: Store } export interface SpecialVisualization { readonly funcName: string readonly docs: string | BaseUIElement readonly example?: string /** * Indicates that this special visualisation will make requests to the 'alLNodesDatabase' and that it thus should be included */ readonly needsNodeDatabase?: boolean readonly args: { name: string defaultValue?: string doc: string required?: false | boolean }[] readonly getLayerDependencies?: (argument: string[]) => string[] structuredExamples?(): { feature: Feature>; args: string[] }[] constr( state: SpecialVisualizationState, tagSource: UIEventSource>, argument: string[], feature: Feature, layer: LayerConfig ): BaseUIElement } export type RenderingSpecification = | string | { func: SpecialVisualization args: string[] style: string }