MapComplete/src/UI/InputElement/Validators/DistanceValidator.ts

Ignoring revisions in .git-blame-ignore-revs. Click here to bypass and see the normal blame view.

62 lines
2.2 KiB
TypeScript
Raw Normal View History

import { Validator } from "../Validator"
import { Utils } from "../../../Utils"
import { eliCategory } from "../../../Models/RasterLayerProperties"
export default class DistanceValidator extends Validator {
private readonly docs: string = [
"#### Helper-arguments",
"Options are:",
2025-04-15 18:18:44 +02:00
[
"````json",
' "background": "some_background_id or category, e.g. \'map\'"',
' "zoom": 20 # initial zoom level of the map',
"}",
2025-04-15 18:18:44 +02:00
"```",
].join("\n"),
].join("\n\n")
constructor() {
super(
"distance",
2025-04-15 18:18:44 +02:00
'A geographical distance in meters (rounded at two points). Will give an extra minimap with a measurement tool. Arguments: [ zoomlevel, preferredBackgroundMapType (comma separated) ], e.g. `["21", "map,photo"]',
"decimal"
)
}
isValid = (str) => {
const t = Number(str)
return !isNaN(t)
}
validateArguments(args: any): undefined | string {
if (args === undefined) {
return undefined
}
if (typeof args !== "object" || Array.isArray(args)) {
return "Expected an object of type `{background?: string, zoom?: number}`"
}
const optionalKeys = ["background", "zoom"]
2025-04-15 18:18:44 +02:00
const keys = Object.keys(args).filter((k) => optionalKeys.indexOf(k) < 0)
if (keys.length > 0) {
2025-04-15 18:18:44 +02:00
return (
"Unknown key " + keys.join("; ") + "; use " + optionalKeys.join("; ") + " instead"
)
}
const bg = args["background"]
if (bg && eliCategory.indexOf(bg) < 0) {
2025-04-15 18:18:44 +02:00
return (
"The given background layer is not a recognized ELI-type. Perhaps you meant one of " +
Utils.sortedByLevenshteinDistance(bg, eliCategory).slice(0, 5)
2025-04-15 18:18:44 +02:00
)
}
if (typeof args["zoom"] !== "number") {
return "zoom must be a number, got a " + typeof args["zoom"]
}
if (typeof args["zoom"] !== "number" || args["zoom"] <= 1 || args["zoom"] > 25) {
return "zoom must be a number between 2 and 25, got " + args["zoom"]
}
return undefined
}
}