2023-04-16 03:42:26 +02:00
|
|
|
import { UIEventSource } from "../../Logic/UIEventSource"
|
2023-09-15 01:16:33 +02:00
|
|
|
|
2023-04-16 03:42:26 +02:00
|
|
|
import { MapProperties } from "../../Models/MapProperties"
|
|
|
|
|
import { Feature } from "geojson"
|
|
|
|
|
import { GeoOperations } from "../../Logic/GeoOperations"
|
2023-03-29 17:21:20 +02:00
|
|
|
|
2023-04-16 03:42:26 +02:00
|
|
|
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
|
|
|
|
|
}
|
2023-03-29 17:21:20 +02:00
|
|
|
|
|
|
|
|
export default class InputHelpers {
|
2023-08-23 11:11:53 +02:00
|
|
|
public static hideInputField: string[] = ["translation", "simple_tag", "tag"]
|
2023-08-08 13:52:58 +02:00
|
|
|
|
2023-09-15 01:16:33 +02:00
|
|
|
// noinspection JSUnusedLocalSymbols
|
2023-03-29 17:21:20 +02:00
|
|
|
/**
|
2023-04-16 03:42:26 +02:00
|
|
|
* Constructs a mapProperties-object for the given properties.
|
|
|
|
|
* Assumes that the first helper-args contains the desired zoom-level
|
|
|
|
|
* @param properties
|
|
|
|
|
* @private
|
2023-03-29 17:21:20 +02:00
|
|
|
*/
|
2023-09-15 01:16:33 +02:00
|
|
|
public static constructMapProperties(
|
2023-04-16 03:42:26 +02:00
|
|
|
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
|
2023-04-24 03:36:02 +02:00
|
|
|
if (properties?.args?.[0] !== undefined) {
|
2023-04-16 03:42:26 +02:00
|
|
|
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) }
|
|
|
|
|
}
|
2024-03-25 04:17:13 +01:00
|
|
|
if (!mapProperties.rasterLayer) {
|
2024-04-13 02:40:21 +02:00
|
|
|
/* mapProperties = {
|
2024-03-25 04:17:13 +01:00
|
|
|
...mapProperties, rasterLayer: properties?.mapProperties?.rasterLayer
|
|
|
|
|
}*/
|
|
|
|
|
}
|
2023-04-16 03:42:26 +02:00
|
|
|
return mapProperties
|
|
|
|
|
}
|
2023-03-29 17:21:20 +02:00
|
|
|
}
|