";
+ }
+
+}
\ No newline at end of file
diff --git a/UI/Base/VerticalCombine.ts b/UI/Base/VerticalCombine.ts
index 82d2f3d..03e7abf 100644
--- a/UI/Base/VerticalCombine.ts
+++ b/UI/Base/VerticalCombine.ts
@@ -10,7 +10,7 @@ export class VerticalCombine extends UIElement {
this._className = className;
}
- protected InnerRender(): string {
+ InnerRender(): string {
let html = "";
for (const element of this._elements) {
if (!element.IsEmpty()) {
diff --git a/UI/Img.ts b/UI/Img.ts
index 72ca2ba..7a89820 100644
--- a/UI/Img.ts
+++ b/UI/Img.ts
@@ -1,4 +1,6 @@
export class Img {
+ static readonly checkmark = ``;
+ static readonly no_checkmark = ``;
static osmAbstractLogo: string =
" `
+
static openFilterButton: string = ` `
-
+
}
diff --git a/UI/Input/CheckBox.ts b/UI/Input/CheckBox.ts
index 7f03c97..f2da2e7 100644
--- a/UI/Input/CheckBox.ts
+++ b/UI/Input/CheckBox.ts
@@ -6,26 +6,26 @@ import instantiate = WebAssembly.instantiate;
export class CheckBox extends UIElement{
- private readonly _data: UIEventSource;
+ public readonly isEnabled: UIEventSource;
private readonly _showEnabled: string|UIElement;
private readonly _showDisabled: string|UIElement;
constructor(showEnabled: string | UIElement, showDisabled: string | UIElement, data: UIEventSource | boolean = false) {
super(undefined);
- this._data =
+ this.isEnabled =
data instanceof UIEventSource ? data : new UIEventSource(data ?? false);
- this.ListenTo(this._data);
+ this.ListenTo(this.isEnabled);
this._showEnabled = showEnabled;
this._showDisabled = showDisabled;
const self = this;
this.onClick(() => {
- self._data.setData(!self._data.data);
+ self.isEnabled.setData(!self.isEnabled.data);
})
}
InnerRender(): string {
- if (this._data.data) {
+ if (this.isEnabled.data) {
return Translations.W(this._showEnabled).Render();
} else {
return Translations.W(this._showDisabled).Render();
diff --git a/UI/LayerSelection.ts b/UI/LayerSelection.ts
index 27be49a..28432b9 100644
--- a/UI/LayerSelection.ts
+++ b/UI/LayerSelection.ts
@@ -3,6 +3,7 @@ import { FilteredLayer } from "../Logic/FilteredLayer";
import { CheckBox } from "./Input/CheckBox";
import Combine from "./Base/Combine";
import {Utils} from "../Utils";
+import {Img} from "./Img";
export class LayerSelection extends UIElement{
@@ -25,9 +26,7 @@ export class LayerSelection extends UIElement{
this._checkboxes.push(new CheckBox(
new Combine([checkbox, icon, name]),
new Combine([
- ``,
+ Img.checkmark,
icon,
layer.layerDef.name]),
layer.isDisplayed));
diff --git a/UI/ShareScreen.ts b/UI/ShareScreen.ts
new file mode 100644
index 0000000..8f8c281
--- /dev/null
+++ b/UI/ShareScreen.ts
@@ -0,0 +1,159 @@
+import {UIElement} from "./UIElement";
+import {Layout} from "../Customizations/Layout";
+import Translations from "./i18n/Translations";
+import {FixedUiElement} from "./Base/FixedUiElement";
+import Combine from "./Base/Combine";
+import {VariableUiElement} from "./Base/VariableUIElement";
+import {UIEventSource} from "./UIEventSource";
+import {CheckBox} from "./Input/CheckBox";
+import {VerticalCombine} from "./Base/VerticalCombine";
+import {QueryParameters} from "../Logic/QueryParameters";
+import {Img} from "./Img";
+
+export class ShareScreen extends UIElement {
+
+ private _shareButton: UIElement;
+
+ private _options: UIElement;
+ private _iframeCode: UIElement;
+ private _link: UIElement;
+ private _linkStatus: UIElement;
+
+ constructor(layout: Layout, currentLocation: UIEventSource<{ zoom: number, lat: number, lon: number }>) {
+ super(undefined)
+ const tr = Translations.t.general.sharescreen;
+
+ const optionCheckboxes: UIElement[] = []
+ const optionParts: (UIEventSource)[] = [];
+
+ const includeLocation = new CheckBox(
+ new Combine([Img.checkmark, "Include current location"]),
+ new Combine([Img.no_checkmark, "Include current location"]),
+ true
+ )
+ optionCheckboxes.push(includeLocation);
+ optionParts.push(includeLocation.isEnabled.map((includeL) => {
+ if (includeL) {
+ return `z=${currentLocation.data.zoom}&lat=${currentLocation.data.lat}&lon=${currentLocation.data.lon}`
+ } else {
+ return null;
+ }
+ }, [currentLocation]));
+
+
+ const switches = [{urlName: "fs-userbadge", human: "Enable the login-button"},
+ {urlName: "fs-search", human: "Enable search bar"},
+ {urlName: "fs-welcome-message", human: "Enable the welcome message"},
+ {urlName: "fs-layers", human: "Enable layer control"},
+ {urlName: "fs-add-new", human: "Enable the 'add new POI' button"}
+ ]
+
+
+ for (const swtch of switches) {
+
+ const checkbox = new CheckBox(
+ new Combine([Img.checkmark, swtch.human]),
+ new Combine([Img.no_checkmark, swtch.human]),
+ true
+ );
+ optionCheckboxes.push(checkbox);
+ optionParts.push(checkbox.isEnabled.map((isEn) => {
+ if (isEn) {
+ return null;
+ } else {
+ return `${swtch.urlName}=false`
+ }
+ }))
+
+
+ }
+
+
+ this._options = new VerticalCombine(optionCheckboxes)
+ const url = currentLocation.map(() => {
+
+ let literalText = "https://pietervdvn.github.io/MapComplete/" + layout.name + ".html"
+
+ const parts = [];
+ for (const part of optionParts) {
+ if (part.data === null) {
+ continue;
+ }
+ parts.push(part.data);
+ }
+
+ if (parts.length === 0) {
+ return literalText;
+ }
+
+ return literalText + "?" + parts.join("&");
+ }, optionParts);
+ this._iframeCode = new VariableUiElement(
+ url.map((url) => {
+ return `
+ <iframe src="${url}" title="${layout.name} with MapComplete"></iframe>
+ `
+ })
+ );
+
+
+ this._link = new VariableUiElement(
+ url.map((url) => {
+ return ``
+ })
+ );
+
+
+ const status = new UIEventSource(" ");
+ this._linkStatus = new VariableUiElement(status);
+ const self = this;
+ this._link.onClick(async () => {
+
+ const shareData = {
+ title: Translations.W(layout.name).InnerRender(),
+ text: Translations.W(layout.description).InnerRender(),
+ url: self._link.data,
+ }
+
+ function rejected() {
+ status.setData("Copying to clipboard...")
+ var copyText = document.getElementById("code-link--copyable");
+
+ // @ts-ignore
+ copyText.select();
+ // @ts-ignore
+ copyText.setSelectionRange(0, 99999); /*For mobile devices*/
+
+ document.execCommand("copy");
+ status.setData("Copied to clipboard")
+ }
+
+ try {
+ navigator.share(shareData)
+ .then(() => {
+ status.setData("Thanks for sharing!")
+ }, rejected)
+ .catch(rejected)
+ } catch (err) {
+ rejected();
+ }
+
+ });
+
+ }
+
+ InnerRender(): string {
+
+ const tr = Translations.t.general.sharescreen;
+
+ return new VerticalCombine([
+ tr.intro,
+ this._link,
+ this._linkStatus,
+ tr.embedIntro,
+ this._options,
+ this._iframeCode
+ ]).Render()
+ }
+
+}
\ No newline at end of file
diff --git a/UI/UIElement.ts b/UI/UIElement.ts
index 48b4268..6d6d7cf 100644
--- a/UI/UIElement.ts
+++ b/UI/UIElement.ts
@@ -136,6 +136,8 @@ export abstract class UIElement extends UIEventSource{
public IsEmpty(): boolean {
return this.InnerRender() === "";
}
+
}
+
diff --git a/UI/i18n/Translations.ts b/UI/i18n/Translations.ts
index 35c58e2..a442a8e 100644
--- a/UI/i18n/Translations.ts
+++ b/UI/i18n/Translations.ts
@@ -528,6 +528,33 @@ export default class Translations {
nl: "Het telefoonnummer van {category} is {phone}"
})
+ },
+ openStreetMapIntro: new T({
+ en: "
An Open Map
" +
+ "Wouldn't it be cool if there was a single map, which everyone could freely use and edit?" +
+ "A single place to store all geo-information? Then, all those websites with different, small and incompatible maps (which are always outdated) wouldn't be needed anymore.
" +
+ "
OpenStreetMap is this map. The map data can be used for free (with attribution and publication of changes to that data)." +
+ " On top of that, everyone can freely add new data and fix errors. This website uses OpenStreetMap as well. All the data is from there, and your answers and corrections are added there as well.
" +
+ "
A ton of people and application already use OpenStreetMap: Maps.me, OsmAnd, but also the maps at Facebook, Intsagram, Apple-maps and Bing-maps are (partly) powered by OpenStreetMap." +
+ "If you change something here, it'll be reflected in those applications too - after their next update!
",
+ nl: "
Een open kaart
" +
+ "
Zou het niet fantastisch zijn als er een open kaart zou zijn, die door iedereen aangepast én gebruikt kon worden? Waar iedereen zijn interesses aan zou kunnen toevoegen?" +
+ "Dan zouden er geen duizend-en-één verschillende kleine kaartjes, websites, ... meer nodig zijn
" +
+ "
OpenStreetMap is deze open kaart. Je mag de kaartdata gratis gebruiken (mits bronvermelding en herpublicatie van aanpassingen). Daarenboven mag je de kaart ook gratis aanpassen als je een account maakt." +
+ "Ook deze website is gebaseerd op OpenStreetMap. Als je hier een vraag beantwoord, gaat het antwoord daar ook naartoe
" +
+ "
Tenslotte zijn er reeds vele gebruikers van OpenStreetMap. Denk maar Maps.me, OsmAnd, verschillende gespecialiseerde routeplanners, de achtergrondkaarten op Facebook, Instagram, ... Zelfs Apple Maps en Bing-Maps gebruiken OpenStreetMap in hun kaarten!
" +
+ "Kortom, als je hier een antwoord geeft of een fout aanpast, zal dat na een tijdje ook in al dié applicaties te zien zijn."
+ }),
+
+ sharescreen: {
+ intro:new T({
+ en: "
Share this map
Share this map by copying the link below and sending it to friends and family:"
+ }),
+ embedIntro: new T({
+ en: "
+
+
+`
+ );
+
+ els.push(link)
+
+
+ }
+
+
+ return new VerticalCombine([
+ tr.intro,
+ new VerticalCombine(els),
+ tr.streetcomplete
+ ]).Render();
+ }
+
+}
\ No newline at end of file
diff --git a/UI/i18n/Translations.ts b/UI/i18n/Translations.ts
index 90d1ed4..bdfdf83 100644
--- a/UI/i18n/Translations.ts
+++ b/UI/i18n/Translations.ts
@@ -668,19 +668,19 @@ export default class Translations {
},
openStreetMapIntro: new T({
- en: "
An Open Map
" +
+ en: "
An Open Map
" +
"Wouldn't it be cool if there was a single map, which everyone could freely use and edit?" +
"A single place to store all geo-information? Then, all those websites with different, small and incompatible maps (which are always outdated) wouldn't be needed anymore." +
"
OpenStreetMap is this map. The map data can be used for free (with attribution and publication of changes to that data)." +
" On top of that, everyone can freely add new data and fix errors. This website uses OpenStreetMap as well. All the data is from there, and your answers and corrections are added there as well.
" +
"
A ton of people and application already use OpenStreetMap: Maps.me, OsmAnd, but also the maps at Facebook, Intsagram, Apple-maps and Bing-maps are (partly) powered by OpenStreetMap." +
"If you change something here, it'll be reflected in those applications too - after their next update!
",
- nl: "
Een open kaart
" +
+ nl: "
Een open kaart
" +
"
Zou het niet fantastisch zijn als er een open kaart zou zijn, die door iedereen aangepast én gebruikt kon worden? Waar iedereen zijn interesses aan zou kunnen toevoegen?" +
"Dan zouden er geen duizend-en-één verschillende kleine kaartjes, websites, ... meer nodig zijn
" +
"
OpenStreetMap is deze open kaart. Je mag de kaartdata gratis gebruiken (mits bronvermelding en herpublicatie van aanpassingen). Daarenboven mag je de kaart ook gratis aanpassen als je een account maakt." +
"Ook deze website is gebaseerd op OpenStreetMap. Als je hier een vraag beantwoord, gaat het antwoord daar ook naartoe
" +
- "
Tenslotte zijn er reeds vele gebruikers van OpenStreetMap. Denk maar Maps.me, OsmAnd, verschillende gespecialiseerde routeplanners, de achtergrondkaarten op Facebook, Instagram, ... Zelfs Apple Maps en Bing-Maps gebruiken OpenStreetMap in hun kaarten!
" +
+ "
Tenslotte zijn er reeds vele gebruikers van OpenStreetMap. Denk maar Maps.me, OsmAnd, verschillende gespecialiseerde routeplanners, de achtergrondkaarten op Facebook, Instagram,... Zelfs Apple Maps en Bing-Maps gebruiken OpenStreetMap in hun kaarten!
" +
"Kortom, als je hier een antwoord geeft of een fout aanpast, zal dat na een tijdje ook in al dié applicaties te zien zijn."
}),
@@ -691,6 +691,14 @@ export default class Translations {
embedIntro: new T({
en: "
Embed on your website
Please, embed this map into your website. We encourage you to do it - you don't even have to ask permission. It is free, and always will be. The more people using this, the more valuable it becomes."
})
+ },
+ morescreen: {
+ intro:new T({
+ en:"
More quests
Do you enjoy collecting geodata? There are more layers available.",
+ }),
+ streetcomplete: new T({
+ en: "Another, similar application is StreetComplete"
+ })
}
}
}
diff --git a/index.css b/index.css
index 611a2c1..fdf8c08 100644
--- a/index.css
+++ b/index.css
@@ -1183,4 +1183,27 @@ form {
padding: 1em;
width: 2em;
height: 2em;
-}
\ No newline at end of file
+}
+
+/** Switch layout **/
+
+.switch-layout a{
+ display: flex;
+ flex-wrap: nowrap;
+ flex-direction: row;
+ font-size: large;
+ margin: 0.5em;
+ background-color: #e5f5ff;
+ border-radius: 1em;
+ align-items: center;
+ text-decoration: none;
+ color: black;
+
+}
+
+.switch-layout a img{
+ width: 3em;
+ max-height: 3em;
+ margin-right: 0.5em;
+ padding: 0.5em;
+}
diff --git a/test.ts b/test.ts
index 8463906..0d68023 100644
--- a/test.ts
+++ b/test.ts
@@ -1,37 +1,4 @@
+import {MoreScreen} from "./UI/MoreScreen";
+import {UIEventSource} from "./UI/UIEventSource";
-import { And, Tag, Or } from "./Logic/TagsFilter";
-import { Overpass } from "./Logic/Overpass";
-
-
-function anyValueExcept(key: string, exceptValue: string) {
- return new And([
- new Tag(key, "*"),
- new Tag(key, exceptValue, true)
- ])
-}
-
-const sellsBikes = new Tag("service:bicycle:retail", "yes")
-const repairsBikes = anyValueExcept("service:bicycle:repair", "no")
-const rentsBikes = new Tag("service:bicycle:rental", "yes")
-const hasPump = new Tag("service:bicycle:pump", "yes")
-const hasDiy = new Tag("service:bicycle:diy", "yes")
-const sellsSecondHand = anyValueExcept("service:bicycle:repair", "no")
-const hasBikeServices = new Or([
- sellsBikes,
- repairsBikes,
- rentsBikes,
- hasPump,
- hasDiy,
- sellsSecondHand
-])
-
-const overpassFilter = new And([
- new Tag("shop", "bicycle", true),
- hasBikeServices
-])
-
-const overpass = new Overpass(overpassFilter)
-
-// console.log(overpass.buildQuery('bbox:51.12246976163816,3.1045767593383795,51.289518504257174,3.2848313522338866'))
-
-console.log(overpassFilter.asOverpass())
+new MoreScreen(new UIEventSource<{zoom: number, lat: number, lon: number}>({zoom: 16, lat: 51.3, lon: 3.2})).AttachTo("maindiv")
\ No newline at end of file
From 21dd38c3c7e3c3353f2a9643437a011a0ed24b86 Mon Sep 17 00:00:00 2001
From: Pieter Vander Vennet
Date: Wed, 29 Jul 2020 15:54:44 +0200
Subject: [PATCH 3/3] Small tweaks
---
UI/ShareScreen.ts | 1 +
UI/i18n/Translations.ts | 7 +++++--
index.css | 4 ++--
3 files changed, 8 insertions(+), 4 deletions(-)
diff --git a/UI/ShareScreen.ts b/UI/ShareScreen.ts
index 8f8c281..591a3f3 100644
--- a/UI/ShareScreen.ts
+++ b/UI/ShareScreen.ts
@@ -150,6 +150,7 @@ export class ShareScreen extends UIElement {
tr.intro,
this._link,
this._linkStatus,
+ tr.addToHomeScreen,
tr.embedIntro,
this._options,
this._iframeCode
diff --git a/UI/i18n/Translations.ts b/UI/i18n/Translations.ts
index bdfdf83..447b082 100644
--- a/UI/i18n/Translations.ts
+++ b/UI/i18n/Translations.ts
@@ -685,11 +685,14 @@ export default class Translations {
}),
sharescreen: {
- intro:new T({
+ intro: new T({
en: "
Share this map
Share this map by copying the link below and sending it to friends and family:"
}),
+ addToHomeScreen: new T({
+ en: "
Add to your home screen
You can easily add this website to your home screen for a native feel. Click the 'add to home screen button' in the URL bar to do this."
+ }),
embedIntro: new T({
- en: "
Embed on your website
Please, embed this map into your website. We encourage you to do it - you don't even have to ask permission. It is free, and always will be. The more people using this, the more valuable it becomes."
+ en: "
Embed on your website
Please, embed this map into your website. We encourage you to do it - you don't even have to ask permission. It is free, and always will be. The more people using this, the more valuable it becomes."
})
},
morescreen: {
diff --git a/index.css b/index.css
index fdf8c08..dfdc93d 100644
--- a/index.css
+++ b/index.css
@@ -345,8 +345,8 @@ form {
border-radius: 2em;
border-top-left-radius: 0;
border-bottom-left-radius: 0;
- max-width: 30em;
- width: 35vw;
+ max-width: 40em;
+ width: 45vw;
max-height: calc(100vh - 15em);
overflow-y: auto;
}