New close icon, fix #58, small tweaks to buurtnatuur quests

This commit is contained in:
Pieter Vander Vennet 2020-07-24 14:46:25 +02:00
parent fac7aec20b
commit 7bbc140f05
18 changed files with 180 additions and 72 deletions

View file

@ -16,6 +16,12 @@ export class LayerDefinition {
* This name is shown in the 'add XXX button' * This name is shown in the 'add XXX button'
*/ */
name: string | UIElement; name: string | UIElement;
/***
* This is shown under the 'add new' button to indicate what kind of feature one is adding.
*/
description: string | UIElement
/** /**
* These tags are added whenever a new point is added by the user on the map. * These tags are added whenever a new point is added by the user on the map.
* This is the ideal place to add extra info, such as "fixme=added by MapComplete, geometry should be checked" * This is the ideal place to add extra info, such as "fixme=added by MapComplete, geometry should be checked"

View file

@ -1,9 +1,7 @@
import {LayerDefinition} from "../LayerDefinition"; import {LayerDefinition} from "../LayerDefinition";
import {Quests} from "../../Quests"; import {Or, Tag} from "../../Logic/TagsFilter";
import {And, Or, Tag} from "../../Logic/TagsFilter";
import {AccessTag} from "../Questions/AccessTag"; import {AccessTag} from "../Questions/AccessTag";
import {OperatorTag} from "../Questions/OperatorTag"; import {OperatorTag} from "../Questions/OperatorTag";
import {TagRenderingOptions} from "../TagRendering";
import {NameQuestion} from "../Questions/NameQuestion"; import {NameQuestion} from "../Questions/NameQuestion";
import {NameInline} from "../Questions/NameInline"; import {NameInline} from "../Questions/NameInline";
import {DescriptionQuestion} from "../Questions/DescriptionQuestion"; import {DescriptionQuestion} from "../Questions/DescriptionQuestion";
@ -13,8 +11,8 @@ export class Bos extends LayerDefinition {
constructor() { constructor() {
super(); super();
this.name = "bos"; this.name = "Bos";
this.icon = "./assets/tree_white_background.svg"; this.icon = "";
this.overpassFilter = new Or([ this.overpassFilter = new Or([
new Tag("natural", "wood"), new Tag("natural", "wood"),

View file

@ -12,10 +12,11 @@ export class GhostBike extends LayerDefinition {
this.name = "ghost bike"; this.name = "ghost bike";
this.overpassFilter = new Tag("memorial", "ghost_bike") this.overpassFilter = new Tag("memorial", "ghost_bike")
this.title = new FixedText("Ghost bike"); this.title = new FixedText("Ghost bike");
this.description = "A <b>ghost bike</b> is a memorial for a cyclist who died in a traffic accident," +
" in the form of a white bicycle placed permanently near the accident location.";
this.elementsToShow = [ this.elementsToShow = [
new FixedText("A <b>ghost bike</b> is a memorial for a cyclist who died in a traffic accident," + new FixedText(this.description),
" in the form of a white bicycle placed permanently near the accident location."),
new ImageCarouselWithUploadConstructor(), new ImageCarouselWithUploadConstructor(),
new TagRenderingOptions({ new TagRenderingOptions({

View file

@ -12,8 +12,8 @@ export class NatureReserves extends LayerDefinition {
constructor(moreQuests: boolean = false) { constructor(moreQuests: boolean = false) {
super(); super();
this.name = "natuurgebied"; this.name = "Natuurgebied";
this.icon = "./assets/tree_white_background.svg"; this.icon = "";
this.overpassFilter = this.overpassFilter =
new Or([new Tag("leisure", "nature_reserve"), new Tag("boundary", "protected_area")]); new Or([new Tag("leisure", "nature_reserve"), new Tag("boundary", "protected_area")]);
this.maxAllowedOverlapPercentage = 10; this.maxAllowedOverlapPercentage = 10;

View file

@ -1,5 +1,4 @@
import {LayerDefinition} from "../LayerDefinition"; import {LayerDefinition} from "../LayerDefinition";
import {Quests} from "../../Quests";
import {And, Or, Tag} from "../../Logic/TagsFilter"; import {And, Or, Tag} from "../../Logic/TagsFilter";
import {AccessTag} from "../Questions/AccessTag"; import {AccessTag} from "../Questions/AccessTag";
import {OperatorTag} from "../Questions/OperatorTag"; import {OperatorTag} from "../Questions/OperatorTag";
@ -47,8 +46,8 @@ export class Park extends LayerDefinition {
constructor() { constructor() {
super(); super();
this.name = "park"; this.name = "Park";
this.icon = ""; this.icon = undefined;
this.overpassFilter = this.overpassFilter =
new Or([new Tag("leisure", "park"), new Tag("landuse", "village_green")]); new Or([new Tag("leisure", "park"), new Tag("landuse", "village_green")]);
this.newElementTags = [new Tag("leisure", "park"), this.newElementTags = [new Tag("leisure", "park"),

View file

@ -0,0 +1,6 @@
import {LayerDefinition} from "../LayerDefinition";
export class Viewpoint extends LayerDefinition{
}

View file

@ -89,7 +89,6 @@ export class WelcomeMessage extends UIElement {
this.userDetails = osmConnection.userDetails; this.userDetails = osmConnection.userDetails;
this.description = layout.welcomeMessage; this.description = layout.welcomeMessage;
console.log(" >>>>",this.description, "DESCR ")
this.plzLogIn = layout.gettingStartedPlzLogin; this.plzLogIn = layout.gettingStartedPlzLogin;
this.welcomeBack = layout.welcomeBackMessage; this.welcomeBack = layout.welcomeBackMessage;
this.tail = layout.welcomeTail; this.tail = layout.welcomeTail;

View file

@ -39,10 +39,12 @@ export class Groen extends Layout {
"<li>Je kan altijd een vraag overslaan als je het antwoord niet weet of niet zeker bent</li>" + "<li>Je kan altijd een vraag overslaan als je het antwoord niet weet of niet zeker bent</li>" +
"<li>Je kan altijd een foto toevoegen</li>" + "<li>Je kan altijd een foto toevoegen</li>" +
"<li>Je kan ook zelf een gebied toevoegen door op de kaart te klikken</li>" + "<li>Je kan ook zelf een gebied toevoegen door op de kaart te klikken</li>" +
"<li>Je kan deze website ook openen op je smartphone, zo kan je ter plaatse gaan om vragen te beantwoorden en foto's te maken</li>" +
"</ul>" + "</ul>" +
"<small>" + "<small>" +
"<p>" + "<p>" +
"De oorspronkelijke data komt van <b>OpenStreetMap</b> en je antwoorden worden daar bewaard.<br/> Omdat iedereen vrij kan meewerken aan dit project, kunnen we niet garanderen dat er geen fouten opduiken." + "De oorspronkelijke data komt van <b>OpenStreetMap</b> en je antwoorden worden daar bewaard.<br/> Omdat iedereen vrij kan meewerken aan dit project, kunnen we niet garanderen dat er geen fouten opduiken." +
"Kan je hier niet aanpassen wat je wilt, dan kan je dat zelf via OpenStreetMap.org doen. Groen kan geen enkele verantwoordelijkheid nemen over de kaart." +
"</p>" + "</p>" +
"Je privacy is belangrijk. We tellen wel hoeveel gebruikers deze website bezoeken. We plaatsen een cookie waar geen persoonlijke informatie in bewaard wordt. " + "Je privacy is belangrijk. We tellen wel hoeveel gebruikers deze website bezoeken. We plaatsen een cookie waar geen persoonlijke informatie in bewaard wordt. " +
"Als je inlogt, komt er een tweede cookie bij met je inloggegevens." + "Als je inlogt, komt er een tweede cookie bij met je inloggegevens." +

View file

@ -8,7 +8,6 @@ export class AccessTag extends TagRenderingOptions {
private static options = { private static options = {
priority: 20, priority: 20,
question: "Is dit gebied toegankelijk?", question: "Is dit gebied toegankelijk?",
primer: "Dit gebied is ",
freeform: { freeform: {
key: "access:description", key: "access:description",
template: "Iets anders: $$$", template: "Iets anders: $$$",
@ -16,15 +15,15 @@ export class AccessTag extends TagRenderingOptions {
placeholder: "Specifieer" placeholder: "Specifieer"
}, },
mappings: [ mappings: [
{k: new And([new Tag("access", "yes"), new Tag("fee", "")]), txt: "publiek toegankelijk"}, {k: new And([new Tag("access", "yes"), new Tag("fee", "")]), txt: "Publiek toegankelijk"},
{k: new And([new Tag("access", "no"), new Tag("fee", "")]), txt: "niet toegankelijk"}, {k: new And([new Tag("access", "no"), new Tag("fee", "")]), txt: "Niet toegankelijk"},
{k: new And([new Tag("access", "private"), new Tag("fee", "")]), txt: "niet toegankelijk, want privegebied"}, {k: new And([new Tag("access", "private"), new Tag("fee", "")]), txt: "Niet toegankelijk, want privegebied"},
{k: new And([new Tag("access", "permissive"), new Tag("fee", "")]), txt: "toegankelijk, maar het is privegebied"}, {k: new And([new Tag("access", "permissive"), new Tag("fee", "")]), txt: "Toegankelijk, maar het is privegebied"},
{k: new And([new Tag("access", "guided"), new Tag("fee", "")]), txt: "enkel met gids of op activiteit"}, {k: new And([new Tag("access", "guided"), new Tag("fee", "")]), txt: "Enkel met gids of op activiteit"},
{ {
k: new And([new Tag("access", "yes"), k: new And([new Tag("access", "yes"),
new Tag("fee", "yes")]), new Tag("fee", "yes")]),
txt: "toegankelijk mits betaling", txt: "Toegankelijk mits betaling",
priority: 10 priority: 10
}, },
] ]

View file

@ -12,8 +12,8 @@ export class OperatorTag extends TagRenderingOptions {
question: "Wie beheert dit gebied?", question: "Wie beheert dit gebied?",
freeform: { freeform: {
key: "operator", key: "operator",
template: "Dit gebied wordt beheerd door $$$", template: "Beheer door $$$",
renderTemplate: "Dit gebied wordt beheerd door {operator}", renderTemplate: "Beheer door {operator}",
placeholder: "organisatie" placeholder: "organisatie"
}, },
mappings: [ mappings: [

View file

@ -5,10 +5,19 @@ import {UIElement} from "../UI/UIElement";
export class BaseLayers { export class BaseLayers {
public static readonly defaultLayerName = "Kaart van OpenStreetMap"; public static readonly defaultLayer: { name: string, layer: any } = {
public static readonly baseLayers = { name: "Kaart van OpenStreetMap", layer: L.tileLayer("https://tile.openstreetmap.org/{z}/{x}/{y}.png",
["Luchtfoto Vlaanderen (recentste door AIV)"]: {
L.tileLayer("https://tile.informatievlaanderen.be/ws/raadpleegdiensten/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&" + attribution: '',
maxZoom: 19,
minZoom: 1
})
};
public static readonly baseLayers: { name: string, layer: any } [] = [
{
name: "Luchtfoto Vlaanderen (recentste door AIV)",
layer: L.tileLayer("https://tile.informatievlaanderen.be/ws/raadpleegdiensten/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&" +
"LAYER=omwrgbmrvl&STYLE=&FORMAT=image/png&tileMatrixSet=GoogleMapsVL&tileMatrix={z}&tileRow={y}&tileCol={x}", "LAYER=omwrgbmrvl&STYLE=&FORMAT=image/png&tileMatrixSet=GoogleMapsVL&tileMatrix={z}&tileRow={y}&tileCol={x}",
{ {
// omwrgbmrvl // omwrgbmrvl
@ -16,28 +25,29 @@ export class BaseLayers {
maxZoom: 20, maxZoom: 20,
minZoom: 1, minZoom: 1,
wmts: true wmts: true
}), })
["Luchtfoto Vlaanderen (2013-2015, door AIV)"]: L.tileLayer.wms('https://geoservices.informatievlaanderen.be/raadpleegdiensten/OGW/wms?s', },
{ BaseLayers.defaultLayer,
layers: "OGWRGB13_15VL", {
attribution: "Luchtfoto's van © AIV Vlaanderen (2013-2015) | " name: "Luchtfoto Vlaanderen (2013-2015, door AIV)",
}), layer: L.tileLayer.wms('https://geoservices.informatievlaanderen.be/raadpleegdiensten/OGW/wms?s',
[BaseLayers.defaultLayerName]: L.tileLayer("https://tile.openstreetmap.org/{z}/{x}/{y}.png", {
{ layers: "OGWRGB13_15VL",
attribution: '', attribution: "Luchtfoto's van © AIV Vlaanderen (2013-2015) | "
maxZoom: 19, })
minZoom: 1 },
}), {
["Kaart Grootschalig ReferentieBestand Vlaanderen (GRB) door AIV"]: L.tileLayer("https://tile.informatievlaanderen.be/ws/raadpleegdiensten/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=grb_bsk&STYLE=&FORMAT=image/png&tileMatrixSet=GoogleMapsVL&tileMatrix={z}&tileCol={x}&tileRow={y}", name: "Kaart Grootschalig ReferentieBestand Vlaanderen (GRB) door AIV",
{ layer: L.tileLayer("https://tile.informatievlaanderen.be/ws/raadpleegdiensten/wmts?SERVICE=WMTS&REQUEST=GetTile&VERSION=1.0.0&LAYER=grb_bsk&STYLE=&FORMAT=image/png&tileMatrixSet=GoogleMapsVL&tileMatrix={z}&tileCol={x}&tileRow={y}",
attribution: 'Achtergrond <i>Grootschalig ReferentieBestand</i>(GRB) © AGIV', {
maxZoom: 20, attribution: 'Achtergrond <i>Grootschalig ReferentieBestand</i>(GRB) © AGIV',
minZoom: 1, maxZoom: 20,
wmts: true minZoom: 1,
}), wmts: true
}; })
}
public static readonly defaultLayer = BaseLayers.baseLayers[BaseLayers.defaultLayerName]; ]
;
} }
@ -50,13 +60,11 @@ export class Basemap {
public Location: UIEventSource<{ zoom: number, lat: number, lon: number }>; public Location: UIEventSource<{ zoom: number, lat: number, lon: number }>;
public LastClickLocation: UIEventSource<{ lat: number, lon: number }> = new UIEventSource<{ lat: number, lon: number }>(undefined) public LastClickLocation: UIEventSource<{ lat: number, lon: number }> = new UIEventSource<{ lat: number, lon: number }>(undefined)
private _previousLayer : L.tileLayer= undefined; private _previousLayer: L.tileLayer = undefined;
public CurrentLayer: UIEventSource<{ public CurrentLayer: UIEventSource<{
name: string, name: string,
layer: L.tileLayer layer: L.tileLayer
}> = new UIEventSource<L.tileLayer>( }> = new UIEventSource<L.tileLayer>(BaseLayers.defaultLayer);
{name: BaseLayers.defaultLayerName, layer: BaseLayers.defaultLayer}
);
constructor(leafletElementId: string, constructor(leafletElementId: string,
@ -65,7 +73,7 @@ export class Basemap {
this.map = L.map(leafletElementId, { this.map = L.map(leafletElementId, {
center: [location.data.lat, location.data.lon], center: [location.data.lat, location.data.lon],
zoom: location.data.zoom, zoom: location.data.zoom,
layers: [BaseLayers.defaultLayer], layers: [BaseLayers.defaultLayer.layer],
}); });

View file

@ -10,7 +10,7 @@ export class DropDown<T> extends InputElement<T> {
private readonly _label: UIElement; private readonly _label: UIElement;
private readonly _values: { value: T; shown: UIElement }[]; private readonly _values: { value: T; shown: UIElement }[];
private readonly _value; private readonly _value : UIEventSource<T>;
constructor(label: string | UIElement, constructor(label: string | UIElement,
values: { value: T, shown: string | UIElement }[], values: { value: T, shown: string | UIElement }[],
@ -75,8 +75,6 @@ export class DropDown<T> extends InputElement<T> {
} }
protected InnerUpdate(element) { protected InnerUpdate(element) {
var e = document.getElementById("dropdown-" + this.id); var e = document.getElementById("dropdown-" + this.id);
if(e === null){ if(e === null){
return; return;
@ -86,13 +84,13 @@ export class DropDown<T> extends InputElement<T> {
// @ts-ignore // @ts-ignore
var index = parseInt(e.selectedIndex); var index = parseInt(e.selectedIndex);
self._value.setData(self._values[index].value); self._value.setData(self._values[index].value);
}); });
var t = this._value.data; var t = this._value.data;
for (let i = 0; i < this._values.length ; i++) { for (let i = 0; i < this._values.length ; i++) {
const value = this._values[i]; const value = this._values[i].value;
if (value.value == t) { console.log("Checking",value," against ",t, ":", t === value)
if (value === t) {
// @ts-ignore // @ts-ignore
e.selectedIndex = i; e.selectedIndex = i;
} }

View file

@ -2,6 +2,7 @@ import { UIElement } from "./UIElement";
import { FilteredLayer } from "../Logic/FilteredLayer"; import { FilteredLayer } from "../Logic/FilteredLayer";
import { CheckBox } from "./Input/CheckBox"; import { CheckBox } from "./Input/CheckBox";
import Combine from "./Base/Combine"; import Combine from "./Base/Combine";
import {Utils} from "../Utils";
export class LayerSelection extends UIElement{ export class LayerSelection extends UIElement{

View file

@ -14,4 +14,8 @@ export class Utils {
} }
return undefined; return undefined;
} }
}
public static Upper(str : string){
return str.substr(0,1).toUpperCase() + str.substr(1);
}
}

85
assets/close.svg Normal file
View file

@ -0,0 +1,85 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!-- Created with Inkscape (http://www.inkscape.org/) -->
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
width="100"
height="100"
viewBox="0 0 26.458333 26.458334"
version="1.1"
id="svg8"
sodipodi:docname="close.svg"
inkscape:version="0.92.4 (5da689c313, 2019-01-14)">
<defs
id="defs2" />
<sodipodi:namedview
id="base"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageopacity="0.0"
inkscape:pageshadow="2"
inkscape:zoom="2.8284271"
inkscape:cx="-12.514944"
inkscape:cy="118.94409"
inkscape:document-units="px"
inkscape:current-layer="layer1"
showgrid="false"
units="px"
showguides="true"
inkscape:guide-bbox="true"
inkscape:window-width="1920"
inkscape:window-height="1001"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1">
<sodipodi:guide
position="13.229167,23.859748"
orientation="1,0"
id="guide815"
inkscape:locked="false" />
<sodipodi:guide
position="14.944824,13.229167"
orientation="0,1"
id="guide817"
inkscape:locked="false" />
</sodipodi:namedview>
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
<dc:title />
</cc:Work>
</rdf:RDF>
</metadata>
<g
inkscape:label="Layer 1"
inkscape:groupmode="layer"
id="layer1"
transform="translate(0,-270.54165)">
<g
id="g836"
transform="matrix(1.7481308,0,0,1.7481308,-10.001295,-212.27744)">
<path
inkscape:connector-curvature="0"
id="path815"
d="M 18.972892,289.3838 7.7469352,278.15784 v 0"
style="fill:none;stroke:#000000;stroke-width:3.4395833;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
<path
inkscape:connector-curvature="0"
id="path815-3"
d="M 18.98982,278.10371 7.7638604,289.32967 v 0"
style="fill:none;stroke:#000000;stroke-width:3.4395833;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.7 KiB

View file

@ -324,7 +324,7 @@ form {
border-top-left-radius: 0; border-top-left-radius: 0;
border-bottom-left-radius: 0; border-bottom-left-radius: 0;
width: 100%; width: 100%;
max-width: 25vw; max-width: 35vw;
} }
#messagesbox { #messagesbox {

View file

@ -199,12 +199,7 @@ const closedFilterButton = `<button id="filter__button" class="filter__button fi
const openFilterButton = ` const openFilterButton = `
<button id="filter__button" class="filter__button">${Img.openFilterButton}</button>`; <button id="filter__button" class="filter__button">${Img.openFilterButton}</button>`;
let baseLayerOptions = []; let baseLayerOptions = BaseLayers.baseLayers.map((layer) => {return {value: layer, shown: layer.name}});
for (const key in BaseLayers.baseLayers) {
baseLayerOptions.push({value: {name: key, layer: BaseLayers.baseLayers[key]}, shown: key});
}
const backgroundMapPicker = new Combine([new DropDown(`Background map`, baseLayerOptions, bm.CurrentLayer), openFilterButton]); const backgroundMapPicker = new Combine([new DropDown(`Background map`, baseLayerOptions, bm.CurrentLayer), openFilterButton]);
const layerSelection = new Combine([`<p class="filter__label">Maplayers</p>`, new LayerSelection(flayers)]); const layerSelection = new Combine([`<p class="filter__label">Maplayers</p>`, new LayerSelection(flayers)]);
let layerControl = backgroundMapPicker; let layerControl = backgroundMapPicker;
@ -279,16 +274,14 @@ new UserBadge(osmConnection.userDetails,
new SearchAndGo(bm).AttachTo("searchbox"); new SearchAndGo(bm).AttachTo("searchbox");
/*
new CollapseButton("messagesbox")
.AttachTo("collapseButton");*/
const welcome = new WelcomeMessage(layoutToUse, osmConnection).onClick(() => { const welcome = new WelcomeMessage(layoutToUse, osmConnection).onClick(() => {
}); });
const help = new FixedUiElement(`<div class='collapse-button-img'><img src='assets/help.svg' alt='collapse'></div>`); const help = new FixedUiElement(`<div class='collapse-button-img'><img src='assets/help.svg' alt='help'></div>`);
const close = new FixedUiElement(`<div class='collapse-button-img'><img src='assets/close.svg' alt='close'></div>`);
new CheckBox( new CheckBox(
new Combine([ new Combine([
new Combine(["<span class='collapse-button'>", help, "</span>"]), new Combine(["<span class='collapse-button'>", close, "</span>"]),
welcome]), welcome]),
new Combine(["<span class='open-button'>", help, "</span>"]) new Combine(["<span class='open-button'>", help, "</span>"])
, true , true

View file

@ -0,0 +1,9 @@
import {DropDown} from "./UI/Input/DropDown";
import {UIEventSource} from "./UI/UIEventSource";
const source = new UIEventSource(10)
const dd = new DropDown("Test", [
{value: 5, shown: "five"},
{value: 10, shown: "ten"}
], source).AttachTo("maindiv")