mapcomplete/Customizations/Layers/BikeCafes.ts

82 lines
2.6 KiB
TypeScript

import {LayerDefinition} from "../LayerDefinition";
import FixedText from "../Questions/FixedText";
import {ImageCarouselWithUploadConstructor} from "../../UI/Image/ImageCarouselWithUpload";
import Translations from "../../UI/i18n/Translations";
import CafeName from "../Questions/bike/CafeName";
import { Or, And, Tag, anyValueExcept, Regex } from "../../Logic/TagsFilter";
import { PhoneNumberQuestion } from "../Questions/PhoneNumberQuestion";
import Website from "../Questions/Website";
import CafeRepair from "../Questions/bike/CafeRepair";
import CafeDiy from "../Questions/bike/CafeDiy";
import CafePump from "../Questions/bike/CafePump";
export default class BikeCafes extends LayerDefinition {
private readonly repairsBikes = anyValueExcept("service:bicycle:repair", "no")
private readonly hasPump = new Tag("service:bicycle:pump", "yes")
private readonly diy = new Tag("service:bicycle:diy", "yes")
private readonly bikeServices = [
this.diy,
this.repairsBikes,
this.hasPump
]
private readonly to = Translations.t.cyclofix.cafe
constructor() {
super();
this.name = this.to.name;
this.icon = "./assets/bike/cafe.svg";
this.overpassFilter = new And([
new Or([
new Regex("amenity", "^pub|bar|cafe")
]),
new Or([
...this.bikeServices,
new Tag("pub", "cycling")
])
])
this.presets = [
{
title: Translations.t.cyclofix.cafe.title,
icon: "/assets/bike/cafe.svg",
tags : [
new Tag("amenity", "pub"),
new Tag("pub", "cycling"),
]
}
]
this.maxAllowedOverlapPercentage = 10;
this.minzoom = 13;
this.style = this.generateStyleFunction();
this.title = new FixedText(this.to.title)
this.elementsToShow = [
new ImageCarouselWithUploadConstructor(),
new CafeName(),
new PhoneNumberQuestion("{name}"),
new Website("{name}"),
new CafeRepair(),
new CafeDiy(),
new CafePump()
];
this.wayHandling = LayerDefinition.WAYHANDLING_CENTER_AND_WAY;
}
private generateStyleFunction() {
const self = this;
return function (properties: any) {
return {
color: "#00bb00",
icon: {
iconUrl: self.icon,
iconSize: [50, 50],
iconAnchor: [25,50]
}
};
};
}
}