forked from MapComplete/MapComplete
66 lines
2.4 KiB
TypeScript
66 lines
2.4 KiB
TypeScript
import { UIEventSource } from "../../Logic/UIEventSource"
|
|
|
|
import { MapProperties } from "../../Models/MapProperties"
|
|
import { Feature } from "geojson"
|
|
import { GeoOperations } from "../../Logic/GeoOperations"
|
|
|
|
export interface InputHelperProperties {
|
|
/**
|
|
* Extra arguments which might be used by the helper component
|
|
*/
|
|
args?: (string | number | boolean)[]
|
|
|
|
/**
|
|
* Used for map-based helpers, such as 'direction'
|
|
*/
|
|
mapProperties?: Partial<MapProperties> & {
|
|
readonly location: UIEventSource<{ lon: number; lat: number }>
|
|
}
|
|
/**
|
|
* The feature that this question is about
|
|
* Used by the wikidata-input to read properties, which in turn is used to read the name to pre-populate the text field.
|
|
* Additionally, used for direction input to set the default location if no mapProperties with location are given
|
|
*/
|
|
feature?: Feature
|
|
}
|
|
|
|
export default class InputHelpers {
|
|
public static hideInputField: string[] = ["translation", "simple_tag", "tag"]
|
|
|
|
// noinspection JSUnusedLocalSymbols
|
|
/**
|
|
* Constructs a mapProperties-object for the given properties.
|
|
* Assumes that the first helper-args contains the desired zoom-level
|
|
* @param properties
|
|
* @private
|
|
*/
|
|
public static constructMapProperties(
|
|
properties: InputHelperProperties
|
|
): Partial<MapProperties> {
|
|
let location = properties?.mapProperties?.location
|
|
if (!location) {
|
|
const [lon, lat] = GeoOperations.centerpointCoordinates(properties.feature)
|
|
location = new UIEventSource<{ lon: number; lat: number }>({ lon, lat })
|
|
}
|
|
let mapProperties: Partial<MapProperties> = properties?.mapProperties ?? { location }
|
|
if (!mapProperties.location) {
|
|
mapProperties = { ...mapProperties, location }
|
|
}
|
|
let zoom = 17
|
|
if (properties?.args?.[0] !== undefined) {
|
|
zoom = Number(properties.args[0])
|
|
if (isNaN(zoom)) {
|
|
throw "Invalid zoom level for argument at 'length'-input"
|
|
}
|
|
}
|
|
if (!mapProperties.zoom) {
|
|
mapProperties = { ...mapProperties, zoom: new UIEventSource<number>(zoom) }
|
|
}
|
|
if (!mapProperties.rasterLayer) {
|
|
/* mapProperties = {
|
|
...mapProperties, rasterLayer: properties?.mapProperties?.rasterLayer
|
|
}*/
|
|
}
|
|
return mapProperties
|
|
}
|
|
}
|