forked from MapComplete/MapComplete
Small fixes, perf improvements, remove duplicate images of ghost bikes, add wall mount
This commit is contained in:
parent
9978879536
commit
e74b4e3804
13 changed files with 57 additions and 26 deletions
|
@ -153,10 +153,10 @@ export class InitUiElements {
|
||||||
* This is given to the div which renders fullscreen on mobile devices
|
* This is given to the div which renders fullscreen on mobile devices
|
||||||
*/
|
*/
|
||||||
State.state.selectedElement.addCallback((feature) => {
|
State.state.selectedElement.addCallback((feature) => {
|
||||||
if (feature?.feature?.properties === undefined) {
|
if (feature?.properties === undefined) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const data = feature.feature.properties;
|
const data = feature.properties;
|
||||||
// Which is the applicable set?
|
// Which is the applicable set?
|
||||||
for (const layer of layoutToUse.layers) {
|
for (const layer of layoutToUse.layers) {
|
||||||
if (typeof layer === "string") {
|
if (typeof layer === "string") {
|
||||||
|
|
|
@ -322,14 +322,9 @@ export class FilteredLayer {
|
||||||
eventSource.addCallback(updateStyle);
|
eventSource.addCallback(updateStyle);
|
||||||
|
|
||||||
function openPopup(e) {
|
function openPopup(e) {
|
||||||
updateStyle()
|
|
||||||
|
|
||||||
|
|
||||||
if (feature.geometry.type === "Point") {
|
if (feature.geometry.type === "Point") {
|
||||||
State.state.selectedElement.setData({feature: feature});
|
return; // Points bind their own popups
|
||||||
return; // Points bind there own popups
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const uiElement = self._showOnPopup(eventSource, feature);
|
const uiElement = self._showOnPopup(eventSource, feature);
|
||||||
L.popup({
|
L.popup({
|
||||||
autoPan: true,
|
autoPan: true,
|
||||||
|
@ -337,14 +332,17 @@ export class FilteredLayer {
|
||||||
.setLatLng(e.latlng)
|
.setLatLng(e.latlng)
|
||||||
.openOn(State.state.bm.map);
|
.openOn(State.state.bm.map);
|
||||||
uiElement.Update();
|
uiElement.Update();
|
||||||
State.state.selectedElement.setData({feature: feature});
|
|
||||||
|
|
||||||
if (e) {
|
if (e) {
|
||||||
L.DomEvent.stop(e); // Marks the event as consumed
|
L.DomEvent.stop(e); // Marks the event as consumed
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
layer.on("click", openPopup);
|
layer.on("click", (e) => {
|
||||||
|
updateStyle();
|
||||||
|
openPopup(e);
|
||||||
|
State.state.selectedElement.setData(feature);
|
||||||
|
|
||||||
|
});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
2
State.ts
2
State.ts
|
@ -82,7 +82,7 @@ export default class State {
|
||||||
/**
|
/**
|
||||||
The latest element that was selected - used to generate the right UI at the right place
|
The latest element that was selected - used to generate the right UI at the right place
|
||||||
*/
|
*/
|
||||||
public readonly selectedElement = new UIEventSource<{ feature: any }>(undefined);
|
public readonly selectedElement = new UIEventSource<any>(undefined);
|
||||||
|
|
||||||
public readonly zoom: UIEventSource<number>;
|
public readonly zoom: UIEventSource<number>;
|
||||||
public readonly lat: UIEventSource<number>;
|
public readonly lat: UIEventSource<number>;
|
||||||
|
|
2
Svg.ts
2
Svg.ts
|
@ -34,7 +34,7 @@ export default class Svg {
|
||||||
public static bug_svg() { return new FixedUiElement(Svg.bug);}
|
public static bug_svg() { return new FixedUiElement(Svg.bug);}
|
||||||
public static bug_ui() { return new FixedUiElement(Svg.bug_img);}
|
public static bug_ui() { return new FixedUiElement(Svg.bug_img);}
|
||||||
|
|
||||||
public static camera_plus = " <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\" viewBox=\"0 -256 1950 1950\" version=\"1.1\" id=\"svg4\" sodipodi:docname=\"camera.svg\" inkscape:version=\"0.92.4 (5da689c313, 2019-01-14)\"> <metadata id=\"metadata10\"> <rdf:RDF> <cc:Work rdf:about=\"\"> <dc:format>image/svg+xml</dc:format> <dc:type rdf:resource=\"http://purl.org/dc/dcmitype/StillImage\" /> </cc:Work> </rdf:RDF> </metadata> <defs id=\"defs8\" /> <sodipodi:namedview pagecolor=\"#ffffff\" bordercolor=\"#666666\" borderopacity=\"1\" objecttolerance=\"10\" gridtolerance=\"10\" guidetolerance=\"10\" inkscape:pageopacity=\"0\" inkscape:pageshadow=\"2\" inkscape:window-width=\"1680\" inkscape:window-height=\"1013\" id=\"namedview6\" showgrid=\"false\" inkscape:zoom=\"0.1711561\" inkscape:cx=\"1154.0868\" inkscape:cy=\"749.93142\" inkscape:window-x=\"0\" inkscape:window-y=\"0\" inkscape:window-maximized=\"1\" inkscape:current-layer=\"svg4\" /> <path d=\"m 881.19,449.05 c 79.33333,0 147.1667,28.16667 203.5,84.5 56.3333,56.33333 84.5,124.16667 84.5,203.5 0,79.33333 -28.1667,147.16667 -84.5,203.5 -56.3333,56.3333 -124.16667,84.5 -203.5,84.5 -79.33333,0 -147.16667,-28.1667 -203.5,-84.5 -56.33333,-56.33333 -84.5,-124.16667 -84.5,-203.5 0,-79.33333 28.16667,-147.16667 84.5,-203.5 56.33333,-56.33333 124.16667,-84.5 203.5,-84.5 m 798,-316 c 70.6667,0 131,25 181,75 50,50 75,110.33333 75,181 v 896 c 0,70.6667 -25,131 -75,181 -50,50 -110.3333,75 -181,75 h -1408 c -70.66667,0 -131,-25 -181,-75 -50,-50 -75,-110.3333 -75,-181 v -896 c 0,-70.66667 25,-131 75,-181 50,-50 110.33333,-75 181,-75 h 130 l 51,-136 c 12.66667,-32.666667 35.83333,-60.833333 69.5,-84.5 33.66667,-23.66667 68.16667,-35.5 103.5,-35.5 h 512 c 35.3333,0 69.8333,11.83333 103.5,35.5 33.6667,23.666667 56.8333,51.833333 69.5,84.5 l 51,136 h 318 m -798,1052 c 123.3333,0 228.8333,-43.8333 316.5,-131.5 87.6667,-87.6667 131.5,-193.16667 131.5,-316.5 0,-123.33333 -43.8333,-228.83333 -131.5,-316.5 -87.6667,-87.66667 -193.1667,-131.5 -316.5,-131.5 -123.33333,0 -228.83333,43.83333 -316.5,131.5 -87.66667,87.66667 -131.5,193.16667 -131.5,316.5 0,123.33333 43.83333,228.8333 131.5,316.5 87.66667,87.6667 193.16667,131.5 316.5,131.5\" id=\"path2\" inkscape:connector-curvature=\"0\" sodipodi:nodetypes=\"csssssssccsssssssssssccssssccccsssssssc\" /> <g id=\"g854\" transform=\"translate(259.86064,302.45965)\"> <g id=\"g847\"> <circle style=\"fill:#7ebc6f;fill-opacity:1;stroke:none;stroke-width:21.93531036;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1\" id=\"path819\" cx=\"1351.3682\" cy=\"1044.5065\" r=\"335.30353\" /> </g> <g id=\"g844\"> <path style=\"fill: none !important;stroke:#fffff0;stroke-width:95.51803589;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1\" d=\"m 1154.7797,1044.3443 h 389.1358\" id=\"path821\" inkscape:connector-curvature=\"0\" /> <path style=\"fill: none !important;stroke:#fffff0;stroke-width:95.51803589;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1\" d=\"M 1349.9206,849.36269 V 1238.4985\" id=\"path821-3\" inkscape:connector-curvature=\"0\" /> </g> </g> </svg> "
|
public static camera_plus = " <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\" viewBox=\"0 -256 1950 1950\" version=\"1.1\" id=\"svg4\" sodipodi:docname=\"camera.svg\" inkscape:version=\"0.92.4 (5da689c313, 2019-01-14)\"> <metadata id=\"metadata10\"> <rdf:RDF> <cc:Work rdf:about=\"\"> <dc:format>image/svg+xml</dc:format> <dc:type rdf:resource=\"http://purl.org/dc/dcmitype/StillImage\" /> </cc:Work> </rdf:RDF> </metadata> <defs id=\"defs8\" /> <sodipodi:namedview pagecolor=\"#ffffff\" bordercolor=\"#666666\" borderopacity=\"1\" objecttolerance=\"10\" gridtolerance=\"10\" guidetolerance=\"10\" inkscape:pageopacity=\"0\" inkscape:pageshadow=\"2\" inkscape:window-width=\"1680\" inkscape:window-height=\"1013\" id=\"namedview6\" showgrid=\"false\" inkscape:zoom=\"0.1711561\" inkscape:cx=\"1154.0868\" inkscape:cy=\"749.93142\" inkscape:window-x=\"0\" inkscape:window-y=\"0\" inkscape:window-maximized=\"1\" inkscape:current-layer=\"svg4\" /> <path d=\"m 881.19,449.05 c 79.33333,0 147.1667,28.16667 203.5,84.5 56.3333,56.33333 84.5,124.16667 84.5,203.5 0,79.33333 -28.1667,147.16667 -84.5,203.5 -56.3333,56.3333 -124.16667,84.5 -203.5,84.5 -79.33333,0 -147.16667,-28.1667 -203.5,-84.5 -56.33333,-56.33333 -84.5,-124.16667 -84.5,-203.5 0,-79.33333 28.16667,-147.16667 84.5,-203.5 56.33333,-56.33333 124.16667,-84.5 203.5,-84.5 m 798,-316 c 70.6667,0 131,25 181,75 50,50 75,110.33333 75,181 v 896 c 0,70.6667 -25,131 -75,181 -50,50 -110.3333,75 -181,75 h -1408 c -70.66667,0 -131,-25 -181,-75 -50,-50 -75,-110.3333 -75,-181 v -896 c 0,-70.66667 25,-131 75,-181 50,-50 110.33333,-75 181,-75 h 130 l 51,-136 c 12.66667,-32.666667 35.83333,-60.833333 69.5,-84.5 33.66667,-23.66667 68.16667,-35.5 103.5,-35.5 h 512 c 35.3333,0 69.8333,11.83333 103.5,35.5 33.6667,23.666667 56.8333,51.833333 69.5,84.5 l 51,136 h 318 m -798,1052 c 123.3333,0 228.8333,-43.8333 316.5,-131.5 87.6667,-87.6667 131.5,-193.16667 131.5,-316.5 0,-123.33333 -43.8333,-228.83333 -131.5,-316.5 -87.6667,-87.66667 -193.1667,-131.5 -316.5,-131.5 -123.33333,0 -228.83333,43.83333 -316.5,131.5 -87.66667,87.66667 -131.5,193.16667 -131.5,316.5 0,123.33333 43.83333,228.8333 131.5,316.5 87.66667,87.6667 193.16667,131.5 316.5,131.5\" id=\"path2\" inkscape:connector-curvature=\"0\" sodipodi:nodetypes=\"csssssssccsssssssssssccssssccccsssssssc\" /> <g id=\"g854\" transform=\"translate(259.86064,302.45965)\"> <g id=\"g847\"> <circle style=\"fill:#7ebc6f;fill-opacity:1;stroke:none;stroke-width:21.93531036;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1\" id=\"path819\" cx=\"1351.3682\" cy=\"1044.5065\" r=\"335.30353\" /> </g> <g id=\"g844\"> <path style=\"fill: none !important;stroke:#ffffff !important;stroke-width:95.51803589;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1\" d=\"m 1154.7797,1044.3443 h 389.1358\" id=\"path821\" inkscape:connector-curvature=\"0\" /> <path style=\"fill: none !important;stroke:#ffffff !important;stroke-width:95.51803589;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1\" d=\"M 1349.9206,849.36269 V 1238.4985\" id=\"path821-3\" inkscape:connector-curvature=\"0\" /> </g> </g> </svg> "
|
||||||
public static camera_plus_img = Img.AsImageElement(Svg.camera_plus)
|
public static camera_plus_img = Img.AsImageElement(Svg.camera_plus)
|
||||||
public static camera_plus_svg() { return new FixedUiElement(Svg.camera_plus);}
|
public static camera_plus_svg() { return new FixedUiElement(Svg.camera_plus);}
|
||||||
public static camera_plus_ui() { return new FixedUiElement(Svg.camera_plus_img);}
|
public static camera_plus_ui() { return new FixedUiElement(Svg.camera_plus_img);}
|
||||||
|
|
|
@ -13,9 +13,11 @@ export class FullScreenMessageBox extends UIElement {
|
||||||
private readonly returnToTheMap: UIElement;
|
private readonly returnToTheMap: UIElement;
|
||||||
|
|
||||||
constructor(onClear: (() => void)) {
|
constructor(onClear: (() => void)) {
|
||||||
super(State.state.fullScreenMessage);
|
super();
|
||||||
this.HideOnEmpty(true);
|
this.HideOnEmpty(true);
|
||||||
|
const self = this;
|
||||||
State.state.fullScreenMessage.addCallbackAndRun(uiElement => {
|
State.state.fullScreenMessage.addCallbackAndRun(uiElement => {
|
||||||
|
self.Update();
|
||||||
if (uiElement === undefined) {
|
if (uiElement === undefined) {
|
||||||
location.hash = "";
|
location.hash = "";
|
||||||
} else {
|
} else {
|
||||||
|
@ -28,14 +30,12 @@ export class FullScreenMessageBox extends UIElement {
|
||||||
window.onhashchange = function () {
|
window.onhashchange = function () {
|
||||||
if (location.hash === "") {
|
if (location.hash === "") {
|
||||||
// No more element: back to the map!
|
// No more element: back to the map!
|
||||||
console.log("Clearing full screen message");
|
|
||||||
State.state.fullScreenMessage.setData(undefined);
|
State.state.fullScreenMessage.setData(undefined);
|
||||||
onClear();
|
onClear();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const self = this;
|
|
||||||
this.returnToTheMap =
|
this.returnToTheMap =
|
||||||
new Combine([Translations.t.general.returnToTheMap.Clone().SetStyle("font-size:xx-large")])
|
new Combine([Translations.t.general.returnToTheMap.Clone().SetStyle("font-size:xx-large")])
|
||||||
.SetStyle("background:#7ebc6f;" +
|
.SetStyle("background:#7ebc6f;" +
|
||||||
|
@ -69,7 +69,6 @@ export class FullScreenMessageBox extends UIElement {
|
||||||
}
|
}
|
||||||
|
|
||||||
const el = document.getElementById(this.id);
|
const el = document.getElementById(this.id);
|
||||||
console.warn(el, el.style.display);
|
|
||||||
|
|
||||||
const uielement = new Combine([State.state.fullScreenMessage.data]).SetStyle(
|
const uielement = new Combine([State.state.fullScreenMessage.data]).SetStyle(
|
||||||
"display:block;" +
|
"display:block;" +
|
||||||
|
|
|
@ -115,7 +115,7 @@ export class ImageUploadFlow extends UIElement {
|
||||||
"cursor:pointer;" +
|
"cursor:pointer;" +
|
||||||
"padding: 0.5em;" +
|
"padding: 0.5em;" +
|
||||||
"border-radius: 1em;" +
|
"border-radius: 1em;" +
|
||||||
"border: 3px solid var(--popup-border);" +
|
"border: 3px solid var(--foreground-color);" +
|
||||||
"box-sizing:border-box;")
|
"box-sizing:border-box;")
|
||||||
|
|
||||||
const actualInputElement =
|
const actualInputElement =
|
||||||
|
|
|
@ -40,7 +40,6 @@ export class FeatureInfoBox extends UIElement {
|
||||||
}
|
}
|
||||||
|
|
||||||
InnerRender(): string {
|
InnerRender(): string {
|
||||||
console.error("Inner rendering infobox for ", this._tags.data.id, this.id)
|
|
||||||
return new Combine([
|
return new Combine([
|
||||||
new Combine([this._title, this._titleIcons])
|
new Combine([this._title, this._titleIcons])
|
||||||
.SetClass("featureinfobox-titlebar"),
|
.SetClass("featureinfobox-titlebar"),
|
||||||
|
|
|
@ -9,6 +9,7 @@ import {SubstitutedTranslation} from "../SpecialVisualizations";
|
||||||
export default class TagRenderingAnswer extends UIElement {
|
export default class TagRenderingAnswer extends UIElement {
|
||||||
private _tags: UIEventSource<any>;
|
private _tags: UIEventSource<any>;
|
||||||
private _configuration: TagRenderingConfig;
|
private _configuration: TagRenderingConfig;
|
||||||
|
private _content: UIElement;
|
||||||
|
|
||||||
constructor(tags: UIEventSource<any>, configuration: TagRenderingConfig) {
|
constructor(tags: UIEventSource<any>, configuration: TagRenderingConfig) {
|
||||||
super(tags);
|
super(tags);
|
||||||
|
@ -31,7 +32,9 @@ export default class TagRenderingAnswer extends UIElement {
|
||||||
if (tr === undefined) {
|
if (tr === undefined) {
|
||||||
return "";
|
return "";
|
||||||
}
|
}
|
||||||
return new SubstitutedTranslation(tr, this._tags).Render();
|
// Bit of a hack; remember that the fields are updated
|
||||||
|
this._content = new SubstitutedTranslation(tr, this._tags);
|
||||||
|
return this._content.Render();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
|
@ -116,7 +116,7 @@ export class SimpleAddUI extends UIElement {
|
||||||
const loc = State.state.bm.LastClickLocation.data;
|
const loc = State.state.bm.LastClickLocation.data;
|
||||||
let feature = State.state.changes.createElement(tags, loc.lat, loc.lon);
|
let feature = State.state.changes.createElement(tags, loc.lat, loc.lon);
|
||||||
layerToAddTo.AddNewElement(feature);
|
layerToAddTo.AddNewElement(feature);
|
||||||
State.state.selectedElement.setData({feature: feature});
|
State.state.selectedElement.setData(feature);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -24,9 +24,10 @@ export class WelcomeMessage extends UIElement {
|
||||||
this.description = new Combine([
|
this.description = new Combine([
|
||||||
"<h3>", layout.title, "</h3>",
|
"<h3>", layout.title, "</h3>",
|
||||||
layout.description
|
layout.description
|
||||||
|
|
||||||
])
|
])
|
||||||
layout.descriptionTail
|
layout.descriptionTail
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
this.plzLogIn =
|
this.plzLogIn =
|
||||||
|
|
|
@ -43,8 +43,7 @@
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"tagRenderings": [
|
"tagRenderings": [
|
||||||
"images",
|
{
|
||||||
{
|
|
||||||
"render": {
|
"render": {
|
||||||
"en": "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.",
|
"en": "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.",
|
||||||
"nl": "Een Witte Fiets (of Spookfiets) is een aandenken aan een fietser die bij een verkeersongeval om het leven kwam. Het gaat over een witgeschilderde fiets die geplaatst werd in de buurt van het ongeval.",
|
"nl": "Een Witte Fiets (of Spookfiets) is een aandenken aan een fietser die bij een verkeersongeval om het leven kwam. Het gaat over een witgeschilderde fiets die geplaatst werd in de buurt van het ongeval.",
|
||||||
|
|
|
@ -65,12 +65,12 @@
|
||||||
<g
|
<g
|
||||||
id="g844">
|
id="g844">
|
||||||
<path
|
<path
|
||||||
style="fill:none;stroke:#fffff0;stroke-width:95.51803589;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
style="fill:none;stroke:#ffffff !important;stroke-width:95.51803589;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||||
d="m 1154.7797,1044.3443 h 389.1358"
|
d="m 1154.7797,1044.3443 h 389.1358"
|
||||||
id="path821"
|
id="path821"
|
||||||
inkscape:connector-curvature="0" />
|
inkscape:connector-curvature="0" />
|
||||||
<path
|
<path
|
||||||
style="fill:none;stroke:#fffff0;stroke-width:95.51803589;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
style="fill:none;stroke:#ffffff !important;stroke-width:95.51803589;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
|
||||||
d="M 1349.9206,849.36269 V 1238.4985"
|
d="M 1349.9206,849.36269 V 1238.4985"
|
||||||
id="path821-3"
|
id="path821-3"
|
||||||
inkscape:connector-curvature="0" />
|
inkscape:connector-curvature="0" />
|
||||||
|
|
Before Width: | Height: | Size: 3.8 KiB After Width: | Height: | Size: 3.8 KiB |
|
@ -230,6 +230,38 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"question": {
|
||||||
|
"en": "How is this camera placed?",
|
||||||
|
"nl": "Hoe is deze camera geplaatst?"
|
||||||
|
},
|
||||||
|
"freeform": {
|
||||||
|
"key": "camera:mount"
|
||||||
|
},
|
||||||
|
"mappings": [
|
||||||
|
{
|
||||||
|
"if": "camera:mount=wall",
|
||||||
|
"then": {
|
||||||
|
"en": "This camera is placed against a wall",
|
||||||
|
"nl": "Deze camera hangt aan een muur"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"if": "camera:mount=pole",
|
||||||
|
"then": {
|
||||||
|
"en": "This camera is placed one a pole",
|
||||||
|
"nl": "Deze camera staat op een paal"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"if": "camera:mount=pole",
|
||||||
|
"then": {
|
||||||
|
"en": "This camera is placed one a pole",
|
||||||
|
"nl": "Deze camera staat op een paal"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"hideUnderlayingFeaturesMinPercentage": 0,
|
"hideUnderlayingFeaturesMinPercentage": 0,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue