Port bird-hides to new JSON-format, various improvements
This commit is contained in:
parent
00a6611e1f
commit
9e4035befc
22 changed files with 460 additions and 378 deletions
|
@ -15,6 +15,8 @@ import * as drinkingWater from "../../assets/layers/drinking_water/drinking_wate
|
||||||
import * as ghostbikes from "../../assets/layers/ghost_bike/ghost_bike.json"
|
import * as ghostbikes from "../../assets/layers/ghost_bike/ghost_bike.json"
|
||||||
import * as viewpoint from "../../assets/layers/viewpoint/viewpoint.json"
|
import * as viewpoint from "../../assets/layers/viewpoint/viewpoint.json"
|
||||||
import * as bike_parking from "../../assets/layers/bike_parking/bike_parking.json"
|
import * as bike_parking from "../../assets/layers/bike_parking/bike_parking.json"
|
||||||
|
import * as birdhides from "../../assets/layers/bird_hide/birdhides.json"
|
||||||
|
|
||||||
import {Utils} from "../../Utils";
|
import {Utils} from "../../Utils";
|
||||||
|
|
||||||
export class FromJSON {
|
export class FromJSON {
|
||||||
|
@ -29,6 +31,7 @@ export class FromJSON {
|
||||||
FromJSON.Layer(ghostbikes),
|
FromJSON.Layer(ghostbikes),
|
||||||
FromJSON.Layer(viewpoint),
|
FromJSON.Layer(viewpoint),
|
||||||
FromJSON.Layer(bike_parking),
|
FromJSON.Layer(bike_parking),
|
||||||
|
FromJSON.Layer(birdhides),
|
||||||
];
|
];
|
||||||
|
|
||||||
for (const layer of sharedLayersList) {
|
for (const layer of sharedLayersList) {
|
||||||
|
|
|
@ -1,164 +0,0 @@
|
||||||
import {LayerDefinition} from "../LayerDefinition";
|
|
||||||
import {And, Or, Tag} from "../../Logic/Tags";
|
|
||||||
import {ImageCarouselWithUploadConstructor} from "../../UI/Image/ImageCarouselWithUpload";
|
|
||||||
import {TagRenderingOptions} from "../TagRenderingOptions";
|
|
||||||
|
|
||||||
export class Birdhide extends LayerDefinition {
|
|
||||||
|
|
||||||
private static readonly birdhide = new Tag("leisure", "bird_hide");
|
|
||||||
|
|
||||||
|
|
||||||
constructor() {
|
|
||||||
super("birdhide",{
|
|
||||||
name: "vogelkijkplaats",
|
|
||||||
description: "Een plaats om vogels te kijken, zoals een vogelkijkhut of kijkwand",
|
|
||||||
overpassFilter: Birdhide.birdhide,
|
|
||||||
elementsToShow: [],
|
|
||||||
icon: "assets/nature/birdhide.svg",
|
|
||||||
minzoom: 12,
|
|
||||||
wayHandling: LayerDefinition.WAYHANDLING_CENTER_AND_WAY,
|
|
||||||
presets: [
|
|
||||||
{
|
|
||||||
title: "Vogelkijkplaats",
|
|
||||||
tags: [Birdhide.birdhide]
|
|
||||||
}
|
|
||||||
],
|
|
||||||
style(): { color: string; icon: any } {
|
|
||||||
return {color: "", icon: undefined};
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
function rmStart(toRemove: string, title: string): string {
|
|
||||||
if (title.toLowerCase().indexOf(toRemove.toLowerCase()) == 0) {
|
|
||||||
return title.substr(toRemove.length).trim();
|
|
||||||
}
|
|
||||||
return title;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
function rmStarts(toRemove: string[], title: string) {
|
|
||||||
for (const toRm of toRemove) {
|
|
||||||
title = rmStart(toRm, title);
|
|
||||||
}
|
|
||||||
return title;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.title = new TagRenderingOptions({
|
|
||||||
tagsPreprocessor: (tags) => {
|
|
||||||
if (tags.name) {
|
|
||||||
const nm =
|
|
||||||
rmStarts(
|
|
||||||
["Vogelkijkhut", "Vogelkijkwand", "Kijkwand", "Kijkhut"],
|
|
||||||
tags.name);
|
|
||||||
|
|
||||||
tags.name = " '" + nm + "'";
|
|
||||||
} else {
|
|
||||||
tags.name = "";
|
|
||||||
}
|
|
||||||
},
|
|
||||||
mappings: [
|
|
||||||
{
|
|
||||||
k: new And([new Tag("shelter", "no"), new Tag("building", "")]),
|
|
||||||
txt: "Vogelkijkwand{name}"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
k: new And([new Tag("amenity", "shelter"), new Tag("building", "yes")]),
|
|
||||||
txt: "Vogelijkhut{name}"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
k: new Tag("amenity", "shelter"),
|
|
||||||
txt: "Vogelijkhut{name}"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
k: new Tag("shelter", "yes"),
|
|
||||||
txt: "Vogelijkhut{name}"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
k: new Tag("amenity", "shelter"),
|
|
||||||
txt: "Vogelijkhut{name}"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
k: new Tag("building", "yes"),
|
|
||||||
txt: "Vogelijkhut{name}"
|
|
||||||
},
|
|
||||||
{k: null, txt: "Vogelkijkplaats{name}"}
|
|
||||||
]
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
this.style = (properties) => {
|
|
||||||
let icon = "assets/nature/birdhide.svg";
|
|
||||||
if (new Or([new Tag("amenity", "shelter"), new Tag("building", "yes"), new Tag("shelter", "yes")]).matchesProperties(properties)) {
|
|
||||||
icon = "assets/nature/birdshelter.svg";
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
|
||||||
color: "#0000bb",
|
|
||||||
icon: {
|
|
||||||
iconUrl: icon,
|
|
||||||
iconSize: [40,40],
|
|
||||||
iconAnchor: [20,20]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
this.elementsToShow = [
|
|
||||||
new ImageCarouselWithUploadConstructor(),
|
|
||||||
|
|
||||||
new TagRenderingOptions({
|
|
||||||
question: "Is dit een kijkwand of kijkhut?",
|
|
||||||
mappings: [
|
|
||||||
{
|
|
||||||
k: new And([new Tag("shelter", "no"), new Tag("building", ""), new Tag("amenity", "")]),
|
|
||||||
txt: "Vogelkijkwand"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
k: new And([new Tag("amenity", "shelter"), new Tag("building", "yes"), new Tag("shelter", "yes")]),
|
|
||||||
txt: "Vogelijkhut"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
k: new Or([new Tag("amenity", "shelter"), new Tag("building", "yes"), new Tag("shelter", "yes")]),
|
|
||||||
txt: "Vogelijkhut"
|
|
||||||
},
|
|
||||||
|
|
||||||
]
|
|
||||||
}),
|
|
||||||
new TagRenderingOptions({
|
|
||||||
question: "Is ze rolstoeltoegankelijk?",
|
|
||||||
mappings: [
|
|
||||||
{
|
|
||||||
k: new Tag("wheelchair", "no"),
|
|
||||||
txt: "Niet rolstoeltoegankelijk"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
k: new Tag("wheelchair", "limited"),
|
|
||||||
txt: "Een rolstoel raakt er, maar het is niet makkelijk"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
k: new Tag("wheelchair", "yes"),
|
|
||||||
txt: "Een rolstoel raakt er gemakkelijk"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}),
|
|
||||||
|
|
||||||
new TagRenderingOptions({
|
|
||||||
question: "Wie beheert deze?",
|
|
||||||
freeform: {
|
|
||||||
key: "operator",
|
|
||||||
template: "Beheer door $$$",
|
|
||||||
renderTemplate: "Beheer door {operator}",
|
|
||||||
placeholder: "organisatie"
|
|
||||||
},
|
|
||||||
mappings: [
|
|
||||||
{k: new Tag("operator", "Natuurpunt"), txt: "Natuurpunt"},
|
|
||||||
{k: new Tag("operator", "Agentschap Natuur en Bos"), txt: "het Agentschap Natuur en Bos (ANB)"},
|
|
||||||
|
|
||||||
]
|
|
||||||
})
|
|
||||||
|
|
||||||
|
|
||||||
];
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,5 +1,4 @@
|
||||||
import {Layout} from "../Layout";
|
import {Layout} from "../Layout";
|
||||||
import {Birdhide} from "../Layers/Birdhide";
|
|
||||||
import {InformationBoard} from "../Layers/InformationBoard";
|
import {InformationBoard} from "../Layers/InformationBoard";
|
||||||
import {NatureReserves} from "../Layers/NatureReserves";
|
import {NatureReserves} from "../Layers/NatureReserves";
|
||||||
|
|
||||||
|
@ -9,7 +8,7 @@ export class Natuurpunt extends Layout{
|
||||||
"natuurpunt",
|
"natuurpunt",
|
||||||
["nl"],
|
["nl"],
|
||||||
"De natuur in",
|
"De natuur in",
|
||||||
[new Birdhide(), new InformationBoard(), new NatureReserves(true), "drinking_water"],
|
["birdhides", new InformationBoard(), new NatureReserves(true), "drinking_water"],
|
||||||
12,
|
12,
|
||||||
51.20875,
|
51.20875,
|
||||||
3.22435,
|
3.22435,
|
||||||
|
@ -17,6 +16,6 @@ export class Natuurpunt extends Layout{
|
||||||
"",
|
"",
|
||||||
""
|
""
|
||||||
);
|
);
|
||||||
this.icon = "./assets/nature/birdhide.svg"
|
this.icon = "./assets/layers/bird_hide/birdhide.svg"
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -103,8 +103,9 @@ class OnlyShowIf extends UIElement implements TagDependantUIElement {
|
||||||
return this._embedded.IsQuestioning();
|
return this._embedded.IsQuestioning();
|
||||||
}
|
}
|
||||||
|
|
||||||
Activate(): void {
|
Activate(): UIElement {
|
||||||
this._embedded.Activate();
|
this._embedded.Activate();
|
||||||
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
Update(): void {
|
Update(): void {
|
||||||
|
|
|
@ -46,7 +46,7 @@ export class RegexTag extends TagsFilter {
|
||||||
matches(tags: { k: string; v: string }[]): boolean {
|
matches(tags: { k: string; v: string }[]): boolean {
|
||||||
for (const tag of tags) {
|
for (const tag of tags) {
|
||||||
if (RegexTag.doesMatch(tag.k, this.key)){
|
if (RegexTag.doesMatch(tag.k, this.key)){
|
||||||
return RegexTag.doesMatch(tag.v, this.value);
|
return RegexTag.doesMatch(tag.v, this.value) != this.invert;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
|
|
@ -22,7 +22,7 @@ export default class CustomGeneratorPanel extends UIElement {
|
||||||
private mainPanel: UIElement;
|
private mainPanel: UIElement;
|
||||||
private loginButton: UIElement;
|
private loginButton: UIElement;
|
||||||
|
|
||||||
private connection: OsmConnection;
|
private readonly connection: OsmConnection;
|
||||||
|
|
||||||
constructor(connection: OsmConnection, layout: LayoutConfigJson) {
|
constructor(connection: OsmConnection, layout: LayoutConfigJson) {
|
||||||
super(connection.userDetails);
|
super(connection.userDetails);
|
||||||
|
@ -40,7 +40,7 @@ export default class CustomGeneratorPanel extends UIElement {
|
||||||
private InitMainPanel(layout: LayoutConfigJson, userDetails: UserDetails, connection: OsmConnection) {
|
private InitMainPanel(layout: LayoutConfigJson, userDetails: UserDetails, connection: OsmConnection) {
|
||||||
const es = new UIEventSource(layout);
|
const es = new UIEventSource(layout);
|
||||||
const encoded = es.map(config => btoa(JSON.stringify(config)));
|
const encoded = es.map(config => btoa(JSON.stringify(config)));
|
||||||
encoded.addCallback(encoded => LocalStorageSource.Get("\"last-custom-theme\""))
|
encoded.addCallback(encoded => LocalStorageSource.Get("last-custom-theme"))
|
||||||
const liveUrl = encoded.map(encoded => `./index.html?userlayout=${es.data.id}#${encoded}`)
|
const liveUrl = encoded.map(encoded => `./index.html?userlayout=${es.data.id}#${encoded}`)
|
||||||
const iframe = liveUrl.map(url => `<iframe src='${url}' width='100%' height='99%' style="box-sizing: border-box" title='Theme Preview'></iframe>`);
|
const iframe = liveUrl.map(url => `<iframe src='${url}' width='100%' height='99%' style="box-sizing: border-box" title='Theme Preview'></iframe>`);
|
||||||
const currentSetting = new UIEventSource<SingleSetting<any>>(undefined)
|
const currentSetting = new UIEventSource<SingleSetting<any>>(undefined)
|
||||||
|
|
|
@ -11,7 +11,7 @@ export class GenerateEmpty {
|
||||||
overpassTags: {and: [""]},
|
overpassTags: {and: [""]},
|
||||||
title: undefined,
|
title: undefined,
|
||||||
description: {},
|
description: {},
|
||||||
tagRenderings: []
|
tagRenderings: [],
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -41,7 +41,7 @@ export default class TagRenderingPanel extends InputElement<TagRenderingConfigJs
|
||||||
this.options = options ?? {};
|
this.options = options ?? {};
|
||||||
const questionsNotUnlocked = userDetails.csCount < State.userJourney.themeGeneratorFullUnlock;
|
const questionsNotUnlocked = userDetails.csCount < State.userJourney.themeGeneratorFullUnlock;
|
||||||
this.options.disableQuestions =
|
this.options.disableQuestions =
|
||||||
(this.options.disableQuestions ?? false) &&
|
(this.options.disableQuestions ?? false) ||
|
||||||
questionsNotUnlocked;
|
questionsNotUnlocked;
|
||||||
|
|
||||||
this.intro = new Combine(["<h3>", options?.title ?? "TagRendering", "</h3>", options?.description ?? ""])
|
this.intro = new Combine(["<h3>", options?.title ?? "TagRendering", "</h3>", options?.description ?? ""])
|
||||||
|
|
|
@ -85,7 +85,7 @@ export class ImageCarousel extends TagDependantUIElement {
|
||||||
|
|
||||||
|
|
||||||
this._deleteButton = new ConfirmDialog(showDeleteButton,
|
this._deleteButton = new ConfirmDialog(showDeleteButton,
|
||||||
"<img src='assets/delete.svg' alt='Afbeelding verwijderen' class='delete-image'>",
|
"<img src='./assets/delete.svg' alt='Afbeelding verwijderen' class='delete-image'>",
|
||||||
"<span>Afbeelding verwijderen</span>",
|
"<span>Afbeelding verwijderen</span>",
|
||||||
"<span>Terug</span>",
|
"<span>Terug</span>",
|
||||||
deleteCurrent,
|
deleteCurrent,
|
||||||
|
@ -149,6 +149,7 @@ export class ImageCarousel extends TagDependantUIElement {
|
||||||
Activate() {
|
Activate() {
|
||||||
super.Activate();
|
super.Activate();
|
||||||
this.searcher.Activate();
|
this.searcher.Activate();
|
||||||
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -53,6 +53,7 @@ class ImageCarouselWithUpload extends TagDependantUIElement {
|
||||||
super.Activate();
|
super.Activate();
|
||||||
this._imageElement.Activate();
|
this._imageElement.Activate();
|
||||||
this._pictureUploader.Activate();
|
this._pictureUploader.Activate();
|
||||||
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
Update() {
|
Update() {
|
||||||
|
|
|
@ -16,7 +16,7 @@ export default class SingleTagInput extends InputElement<string> {
|
||||||
|
|
||||||
constructor(value: UIEventSource<string> = undefined) {
|
constructor(value: UIEventSource<string> = undefined) {
|
||||||
super(undefined);
|
super(undefined);
|
||||||
this._value = value ?? new UIEventSource<string>(undefined);
|
this._value = value ?? new UIEventSource<string>("");
|
||||||
|
|
||||||
this.key = TextField.KeyInput();
|
this.key = TextField.KeyInput();
|
||||||
|
|
||||||
|
|
|
@ -86,6 +86,7 @@ export class SlideShow extends UIElement {
|
||||||
}
|
}
|
||||||
this._next.Update();
|
this._next.Update();
|
||||||
this._prev.Update();
|
this._prev.Update();
|
||||||
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -47,7 +47,7 @@ export class UserBadge extends UIElement {
|
||||||
this._homeButton = new VariableUiElement(
|
this._homeButton = new VariableUiElement(
|
||||||
this._userDetails.map((userinfo) => {
|
this._userDetails.map((userinfo) => {
|
||||||
if (userinfo.home) {
|
if (userinfo.home) {
|
||||||
return "<img id='home' src='./assets/home.svg' alt='home' class='small-userbadge-icon'> ";
|
return "<img src='./assets/home.svg' alt='home' class='small-userbadge-icon'> ";
|
||||||
}
|
}
|
||||||
return "";
|
return "";
|
||||||
})
|
})
|
||||||
|
|
Before Width: | Height: | Size: 2.6 KiB After Width: | Height: | Size: 2.6 KiB |
251
assets/layers/bird_hide/birdhides.json
Normal file
251
assets/layers/bird_hide/birdhides.json
Normal file
|
@ -0,0 +1,251 @@
|
||||||
|
{
|
||||||
|
"id": "birdhides",
|
||||||
|
"name": {
|
||||||
|
"nl": "Vogelkijkhutten"
|
||||||
|
},
|
||||||
|
"minzoom": 14,
|
||||||
|
"overpassTags": {
|
||||||
|
"and": [
|
||||||
|
"leisure=bird_hide"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"title": {
|
||||||
|
"render": {
|
||||||
|
"nl": "Vogelkijkplaats"
|
||||||
|
},
|
||||||
|
"mappings": [
|
||||||
|
{
|
||||||
|
"if": {
|
||||||
|
"and": [
|
||||||
|
"name~((V|v)ogel.*).*"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"then": {
|
||||||
|
"nl": "{name}"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"if": {
|
||||||
|
"and": [
|
||||||
|
"name~*",
|
||||||
|
{
|
||||||
|
"or": [
|
||||||
|
"building!~no",
|
||||||
|
"shelter=yes"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"then": {
|
||||||
|
"nl": "Vogelkijkhut {name}"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"if": {
|
||||||
|
"and": [
|
||||||
|
"name~*"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"then": {
|
||||||
|
"nl": "Vogelkijkwand {name}"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"description": {
|
||||||
|
"nl": "Een vogelkijkhut"
|
||||||
|
},
|
||||||
|
"tagRenderings": [
|
||||||
|
{
|
||||||
|
"question": {
|
||||||
|
"nl": "Is dit een kijkwand of kijkhut?"
|
||||||
|
},
|
||||||
|
"mappings": [
|
||||||
|
{
|
||||||
|
"if": {
|
||||||
|
"and": [
|
||||||
|
"shelter=no",
|
||||||
|
"building=",
|
||||||
|
"amenity="
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"then": {
|
||||||
|
"nl": "Vogelkijkwand"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"if": {
|
||||||
|
"and": [
|
||||||
|
"amenity=shelter",
|
||||||
|
"building=yes",
|
||||||
|
"shelter=yes"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"then": {
|
||||||
|
"nl": "Vogelkijkhut"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"if": {
|
||||||
|
"or": [
|
||||||
|
"amenity=shelter",
|
||||||
|
"building=yes",
|
||||||
|
"shelter=yes"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"then": {
|
||||||
|
"nl": "Vogelkijkhut"
|
||||||
|
},
|
||||||
|
"hideInAnswer": true
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"question": {
|
||||||
|
"nl": "Is deze vogelkijkplaats rolstoeltoegankelijk?"
|
||||||
|
},
|
||||||
|
"mappings": [
|
||||||
|
{
|
||||||
|
"if": {
|
||||||
|
"and": [
|
||||||
|
"wheelchair=designated"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"then": {
|
||||||
|
"nl": "Er zijn speciale voorzieningen voor rolstoelen"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"if": {
|
||||||
|
"and": [
|
||||||
|
"wheelchair=yes"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"then": {
|
||||||
|
"nl": "Een rolstoel raakt er vlot"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"if": {
|
||||||
|
"and": [
|
||||||
|
"wheelchair=limited"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"then": {
|
||||||
|
"nl": "Je kan er raken met een rolstoel, maar het is niet makkelijk"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"if": {
|
||||||
|
"and": [
|
||||||
|
"wheelchair=no"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"then": {
|
||||||
|
"nl": "Niet rolstoeltoegankelijk"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"render": {
|
||||||
|
"nl": "Beheer door {operator}"
|
||||||
|
},
|
||||||
|
"freeform": {
|
||||||
|
"key": "operator"
|
||||||
|
},
|
||||||
|
"question": {
|
||||||
|
"nl": "Wie beheert deze vogelkijkplaats?"
|
||||||
|
},
|
||||||
|
"mappings": [
|
||||||
|
{
|
||||||
|
"if": {
|
||||||
|
"and": [
|
||||||
|
"operator~Natuurpunt"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"then": {
|
||||||
|
"nl": "Beheer door Natuurpunt"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"if": {
|
||||||
|
"and": [
|
||||||
|
"operator=Agentschap Natuur en Bos"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"then": {
|
||||||
|
"nl": "Beheer door het Agentschap Natuur en Bos "
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"icon": {
|
||||||
|
"render": {
|
||||||
|
"nl": "./assets/layers/bird_hide/birdhide.svg"
|
||||||
|
},
|
||||||
|
"mappings": [
|
||||||
|
{
|
||||||
|
"if": {
|
||||||
|
"or": [
|
||||||
|
"building=yes",
|
||||||
|
"shelter=yes",
|
||||||
|
"amenity=shelter"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"then": "./assets/layers/bird_hide/birdshelter.svg"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"size": {
|
||||||
|
"question": {},
|
||||||
|
"freeform": {
|
||||||
|
"addExtraTags": []
|
||||||
|
},
|
||||||
|
"render": {
|
||||||
|
"nl": "40,40,center"
|
||||||
|
},
|
||||||
|
"mappings": []
|
||||||
|
},
|
||||||
|
"color": {
|
||||||
|
"render": {
|
||||||
|
"nl": "#94bb28"
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"stroke": {
|
||||||
|
"render": {
|
||||||
|
"nl": "3"
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"presets": [
|
||||||
|
{
|
||||||
|
"tags": [
|
||||||
|
"leisure=bird_hide",
|
||||||
|
"building=yes",
|
||||||
|
"shelter=yes",
|
||||||
|
"amenity=shelter"
|
||||||
|
],
|
||||||
|
"title": {
|
||||||
|
"nl": "Vogelkijkhut"
|
||||||
|
},
|
||||||
|
"description": {
|
||||||
|
"nl": "Een overdekte hut waarbinnen er warm en droog naar vogels gekeken kan worden"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"tags": [
|
||||||
|
"leisure=bird_hide",
|
||||||
|
"building=no",
|
||||||
|
"shelter=no"
|
||||||
|
],
|
||||||
|
"title": {
|
||||||
|
"nl": "Vogelkijkwand"
|
||||||
|
},
|
||||||
|
"description": {
|
||||||
|
"nl": "Een vogelkijkwand waarachter men kan staan om vogels te kijken"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"wayHandling": 2
|
||||||
|
}
|
Before Width: | Height: | Size: 3.3 KiB After Width: | Height: | Size: 3.3 KiB |
Binary file not shown.
Before Width: | Height: | Size: 23 KiB |
84
css/slideshow.css
Normal file
84
css/slideshow.css
Normal file
|
@ -0,0 +1,84 @@
|
||||||
|
|
||||||
|
.image-slideshow {
|
||||||
|
position: relative;
|
||||||
|
text-align: center;
|
||||||
|
max-width: 100%;
|
||||||
|
margin-top: 1em;
|
||||||
|
margin-bottom: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slides {
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.prev-button {
|
||||||
|
background-color: black;
|
||||||
|
opacity: 0.3;
|
||||||
|
width: 4.0em;
|
||||||
|
|
||||||
|
height: 100%;
|
||||||
|
padding-left: 0.5em;
|
||||||
|
padding-right: 0.5em;
|
||||||
|
position: absolute;
|
||||||
|
top: 50%;
|
||||||
|
left: 0;
|
||||||
|
transform: translate(0, -50%);
|
||||||
|
|
||||||
|
z-index: 5060;
|
||||||
|
|
||||||
|
border-radius: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.next-button {
|
||||||
|
background-color: black;
|
||||||
|
opacity: 0.3;
|
||||||
|
width: 4.0em;
|
||||||
|
height: 100%;
|
||||||
|
padding-left: 0.5em;
|
||||||
|
padding-right: 0.5em;
|
||||||
|
position: absolute;
|
||||||
|
top: 50%;
|
||||||
|
right: 0;
|
||||||
|
transform: translate(0, -50%);
|
||||||
|
border-radius: 1em;
|
||||||
|
|
||||||
|
|
||||||
|
z-index: 5060;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.vspan {
|
||||||
|
height: calc(50% - 3em);
|
||||||
|
}
|
||||||
|
|
||||||
|
.prev-button img {
|
||||||
|
margin-left: -1em;
|
||||||
|
width: 6em;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.next-button img {
|
||||||
|
margin-left: -1em;
|
||||||
|
width: 6em;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slide > span {
|
||||||
|
max-height: 40vh;
|
||||||
|
}
|
||||||
|
|
||||||
|
.slide > span img {
|
||||||
|
height: auto;
|
||||||
|
width: auto;
|
||||||
|
max-width: 100%;
|
||||||
|
max-height: 30vh;
|
||||||
|
border-radius: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.hidden {
|
||||||
|
/* This is used by the slideshow, to hide non-active slides*/
|
||||||
|
display: none !important;
|
||||||
|
|
||||||
|
}
|
89
css/userbadge.css
Normal file
89
css/userbadge.css
Normal file
|
@ -0,0 +1,89 @@
|
||||||
|
|
||||||
|
.small-userbadge-icon {
|
||||||
|
width: 1em;
|
||||||
|
height: 1em;
|
||||||
|
fill: black;
|
||||||
|
border-radius: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#profile-pic {
|
||||||
|
float: left;
|
||||||
|
width: 4em;
|
||||||
|
height: 4em;
|
||||||
|
padding: 0;
|
||||||
|
margin: 0;
|
||||||
|
-webkit-border-radius: 50%;
|
||||||
|
-moz-border-radius: 50%;
|
||||||
|
border-radius: 50%;
|
||||||
|
opacity: 0;
|
||||||
|
transition: opacity 500ms linear;
|
||||||
|
}
|
||||||
|
|
||||||
|
#username {
|
||||||
|
text-decoration: none;
|
||||||
|
color: black;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#usertext {
|
||||||
|
width: max-content;
|
||||||
|
margin: 0;
|
||||||
|
|
||||||
|
padding: 0.9em;
|
||||||
|
padding-left: 4.7em; /* Should be half of profile-pic's width + actual padding (same as padding-right)*/
|
||||||
|
padding-right: 1.5em;
|
||||||
|
border-radius: 2em; /*Half border radius width/height*/
|
||||||
|
height: 2.2em; /*SHould equal profile-pic height - padding*/
|
||||||
|
z-index: 5000;
|
||||||
|
text-align: left;
|
||||||
|
background-color: white;
|
||||||
|
background-size: 100%;
|
||||||
|
display: block;
|
||||||
|
|
||||||
|
line-height: 0.75em;
|
||||||
|
}
|
||||||
|
|
||||||
|
#usertext a {
|
||||||
|
text-decoration: none;
|
||||||
|
color: black;
|
||||||
|
}
|
||||||
|
|
||||||
|
#userbadge {
|
||||||
|
display: inline-block;
|
||||||
|
text-align: center;
|
||||||
|
background-color: white;
|
||||||
|
-webkit-border-radius: 2em;
|
||||||
|
-moz-border-radius: 2em;
|
||||||
|
border-radius: 2em;
|
||||||
|
border-bottom-right-radius: 1.5em;
|
||||||
|
border-top-right-radius: 1.5em;
|
||||||
|
margin: 0;
|
||||||
|
margin-bottom: 0.5em;
|
||||||
|
|
||||||
|
min-width: 20em;
|
||||||
|
pointer-events: all;
|
||||||
|
}
|
||||||
|
|
||||||
|
.userbadge-login {
|
||||||
|
font-weight: bold;
|
||||||
|
font-size: large;
|
||||||
|
background-color: #e5f5ff !important;
|
||||||
|
height:3em;
|
||||||
|
|
||||||
|
display: inline-block;
|
||||||
|
text-align: center;
|
||||||
|
-webkit-border-radius: 2em;
|
||||||
|
-moz-border-radius: 2em;
|
||||||
|
border-radius: 2em;
|
||||||
|
border-bottom-right-radius: 1.5em;
|
||||||
|
border-top-right-radius: 1.5em;
|
||||||
|
margin: 0;
|
||||||
|
|
||||||
|
min-width: 20em;
|
||||||
|
pointer-events: all;
|
||||||
|
}
|
||||||
|
|
||||||
|
#userbadge-and-search {
|
||||||
|
display: inline-block;
|
||||||
|
width: min-content;
|
||||||
|
}
|
|
@ -12,6 +12,7 @@ if (window.location.hash.length > 10) {
|
||||||
} else {
|
} else {
|
||||||
const hash = LocalStorageSource.Get("last-custom-theme").data
|
const hash = LocalStorageSource.Get("last-custom-theme").data
|
||||||
if (hash !== undefined) {
|
if (hash !== undefined) {
|
||||||
|
console.log("Using theme from local storage")
|
||||||
layout = JSON.parse(atob(hash)) as LayoutConfigJson;
|
layout = JSON.parse(atob(hash)) as LayoutConfigJson;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
217
index.css
217
index.css
|
@ -4,23 +4,10 @@
|
||||||
padding: 0;
|
padding: 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
body {
|
body {
|
||||||
font-family: 'Helvetica Neue', Arial, sans-serif;
|
font-family: 'Helvetica Neue', Arial, sans-serif;
|
||||||
}
|
}
|
||||||
|
|
||||||
form {
|
|
||||||
display: inline;
|
|
||||||
}
|
|
||||||
|
|
||||||
.invalid {
|
|
||||||
box-shadow: 0 0 10px #ff5353;
|
|
||||||
}
|
|
||||||
|
|
||||||
.shadow {
|
|
||||||
box-shadow: 0 0 10px #00000066;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#leafletDiv {
|
#leafletDiv {
|
||||||
height: 100%;
|
height: 100%;
|
||||||
|
@ -40,10 +27,6 @@
|
||||||
display: none; /*Hidden by default, only visible on mobile*/
|
display: none; /*Hidden by default, only visible on mobile*/
|
||||||
}
|
}
|
||||||
|
|
||||||
#help-button-mobile {
|
|
||||||
display: none;
|
|
||||||
}
|
|
||||||
|
|
||||||
#geolocate-button img {
|
#geolocate-button img {
|
||||||
width: 31px;
|
width: 31px;
|
||||||
height: 31px;
|
height: 31px;
|
||||||
|
@ -54,8 +37,9 @@
|
||||||
display: block;
|
display: block;
|
||||||
}
|
}
|
||||||
|
|
||||||
.selected-element {
|
|
||||||
fill: black
|
#help-button-mobile {
|
||||||
|
display: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**************** GENERIC ****************/
|
/**************** GENERIC ****************/
|
||||||
|
@ -78,6 +62,18 @@
|
||||||
padding-bottom: 0.15em;
|
padding-bottom: 0.15em;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
form {
|
||||||
|
display: inline;
|
||||||
|
}
|
||||||
|
|
||||||
|
.invalid {
|
||||||
|
box-shadow: 0 0 10px #ff5353;
|
||||||
|
}
|
||||||
|
|
||||||
|
.shadow {
|
||||||
|
box-shadow: 0 0 10px #00000066;
|
||||||
|
}
|
||||||
|
|
||||||
.soft {
|
.soft {
|
||||||
background-color: #e5f5ff;
|
background-color: #e5f5ff;
|
||||||
font-weight: bold;
|
font-weight: bold;
|
||||||
|
@ -126,103 +122,6 @@
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**************** USER BADGE ****************/
|
|
||||||
|
|
||||||
.small-userbadge-icon {
|
|
||||||
width: 1em;
|
|
||||||
height: 1em;
|
|
||||||
fill: black;
|
|
||||||
border-radius: 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#home {
|
|
||||||
cursor: pointer;
|
|
||||||
}
|
|
||||||
|
|
||||||
#profile-pic {
|
|
||||||
float: left;
|
|
||||||
width: 4em;
|
|
||||||
height: 4em;
|
|
||||||
padding: 0;
|
|
||||||
margin: 0;
|
|
||||||
-webkit-border-radius: 50%;
|
|
||||||
-moz-border-radius: 50%;
|
|
||||||
border-radius: 50%;
|
|
||||||
opacity: 0;
|
|
||||||
transition: opacity 500ms linear;
|
|
||||||
}
|
|
||||||
|
|
||||||
#username {
|
|
||||||
text-decoration: none;
|
|
||||||
color: black;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#usertext {
|
|
||||||
width: max-content;
|
|
||||||
margin: 0;
|
|
||||||
|
|
||||||
padding: 0.9em;
|
|
||||||
padding-left: 4.7em; /* Should be half of profile-pic's width + actual padding (same as padding-right)*/
|
|
||||||
padding-right: 1.5em;
|
|
||||||
border-radius: 2em; /*Half border radius width/height*/
|
|
||||||
height: 2.2em; /*SHould equal profile-pic height - padding*/
|
|
||||||
z-index: 5000;
|
|
||||||
text-align: left;
|
|
||||||
background-color: white;
|
|
||||||
background-size: 100%;
|
|
||||||
display: block;
|
|
||||||
|
|
||||||
line-height: 0.75em;
|
|
||||||
}
|
|
||||||
|
|
||||||
#usertext a {
|
|
||||||
text-decoration: none;
|
|
||||||
color: black;
|
|
||||||
}
|
|
||||||
|
|
||||||
#userbadge {
|
|
||||||
display: inline-block;
|
|
||||||
text-align: center;
|
|
||||||
background-color: white;
|
|
||||||
-webkit-border-radius: 2em;
|
|
||||||
-moz-border-radius: 2em;
|
|
||||||
border-radius: 2em;
|
|
||||||
border-bottom-right-radius: 1.5em;
|
|
||||||
border-top-right-radius: 1.5em;
|
|
||||||
margin: 0;
|
|
||||||
margin-bottom: 0.5em;
|
|
||||||
|
|
||||||
min-width: 20em;
|
|
||||||
pointer-events: all;
|
|
||||||
}
|
|
||||||
|
|
||||||
.userbadge-login {
|
|
||||||
font-weight: bold;
|
|
||||||
font-size: large;
|
|
||||||
background-color: #e5f5ff !important;
|
|
||||||
height:3em;
|
|
||||||
|
|
||||||
display: inline-block;
|
|
||||||
text-align: center;
|
|
||||||
-webkit-border-radius: 2em;
|
|
||||||
-moz-border-radius: 2em;
|
|
||||||
border-radius: 2em;
|
|
||||||
border-bottom-right-radius: 1.5em;
|
|
||||||
border-top-right-radius: 1.5em;
|
|
||||||
margin: 0;
|
|
||||||
|
|
||||||
min-width: 20em;
|
|
||||||
pointer-events: all;
|
|
||||||
}
|
|
||||||
|
|
||||||
#userbadge-and-search {
|
|
||||||
display: inline-block;
|
|
||||||
width: min-content;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#searchbox {
|
#searchbox {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
|
@ -614,7 +513,6 @@
|
||||||
#welcomeMessage {
|
#welcomeMessage {
|
||||||
display: inline-block;
|
display: inline-block;
|
||||||
background-color: white;
|
background-color: white;
|
||||||
padding: 1em;
|
|
||||||
border-radius: 0;
|
border-radius: 0;
|
||||||
width: 100%;
|
width: 100%;
|
||||||
max-width: 100%;
|
max-width: 100%;
|
||||||
|
@ -719,90 +617,6 @@
|
||||||
/************ Slideshow *****************/
|
/************ Slideshow *****************/
|
||||||
|
|
||||||
|
|
||||||
.image-slideshow {
|
|
||||||
position: relative;
|
|
||||||
text-align: center;
|
|
||||||
max-width: 100%;
|
|
||||||
margin-top: 1em;
|
|
||||||
margin-bottom: 1em;
|
|
||||||
}
|
|
||||||
|
|
||||||
.slides {
|
|
||||||
overflow: hidden;
|
|
||||||
}
|
|
||||||
|
|
||||||
.prev-button {
|
|
||||||
background-color: black;
|
|
||||||
opacity: 0.3;
|
|
||||||
width: 4.0em;
|
|
||||||
|
|
||||||
height: 100%;
|
|
||||||
padding-left: 0.5em;
|
|
||||||
padding-right: 0.5em;
|
|
||||||
position: absolute;
|
|
||||||
top: 50%;
|
|
||||||
left: 0;
|
|
||||||
transform: translate(0, -50%);
|
|
||||||
|
|
||||||
z-index: 5060;
|
|
||||||
|
|
||||||
border-radius: 1em;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
.next-button {
|
|
||||||
background-color: black;
|
|
||||||
opacity: 0.3;
|
|
||||||
width: 4.0em;
|
|
||||||
height: 100%;
|
|
||||||
padding-left: 0.5em;
|
|
||||||
padding-right: 0.5em;
|
|
||||||
position: absolute;
|
|
||||||
top: 50%;
|
|
||||||
right: 0;
|
|
||||||
transform: translate(0, -50%);
|
|
||||||
border-radius: 1em;
|
|
||||||
|
|
||||||
|
|
||||||
z-index: 5060;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
.vspan {
|
|
||||||
height: calc(50% - 3em);
|
|
||||||
}
|
|
||||||
|
|
||||||
.prev-button img {
|
|
||||||
margin-left: -1em;
|
|
||||||
width: 6em;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.next-button img {
|
|
||||||
margin-left: -1em;
|
|
||||||
width: 6em;
|
|
||||||
text-align: center;
|
|
||||||
}
|
|
||||||
|
|
||||||
.slide > span {
|
|
||||||
max-height: 40vh;
|
|
||||||
}
|
|
||||||
|
|
||||||
.slide > span img {
|
|
||||||
height: auto;
|
|
||||||
width: auto;
|
|
||||||
max-width: 100%;
|
|
||||||
max-height: 30vh;
|
|
||||||
border-radius: 1em;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
.hidden {
|
|
||||||
/* This is used by the slideshow, to hide non-active slides*/
|
|
||||||
display: none !important;
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
.imgWithAttr {
|
.imgWithAttr {
|
||||||
max-height: 20em;
|
max-height: 20em;
|
||||||
|
@ -1101,7 +915,6 @@
|
||||||
padding: 0.5em;
|
padding: 0.5em;
|
||||||
padding-left: 0.75em;
|
padding-left: 0.75em;
|
||||||
|
|
||||||
height: 3em;
|
|
||||||
width: 14em;
|
width: 14em;
|
||||||
border-radius: 1em;
|
border-radius: 1em;
|
||||||
border-top-left-radius: 0;
|
border-top-left-radius: 0;
|
||||||
|
|
|
@ -7,6 +7,8 @@
|
||||||
<title>MapComplete</title>
|
<title>MapComplete</title>
|
||||||
<link rel="stylesheet" href="./vendor/leaflet.css"/>
|
<link rel="stylesheet" href="./vendor/leaflet.css"/>
|
||||||
<link rel="stylesheet" href="./index.css"/>
|
<link rel="stylesheet" href="./index.css"/>
|
||||||
|
<link rel="stylesheet" href="./css/userbadge.css"/>
|
||||||
|
<link rel="stylesheet" href="./css/slideshow.css"/>
|
||||||
<link rel="manifest" href="./manifest.manifest">
|
<link rel="manifest" href="./manifest.manifest">
|
||||||
<link rel="icon" href="assets/add.svg" sizes="any" type="image/svg+xml">
|
<link rel="icon" href="assets/add.svg" sizes="any" type="image/svg+xml">
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue