forked from MapComplete/MapComplete
Update of the 'addNewMarker': show icons, show plus button, show label
This commit is contained in:
parent
a2955eaf91
commit
3c73dfd6b2
12 changed files with 416 additions and 121 deletions
|
@ -3,6 +3,8 @@ import Svg from "../../Svg";
|
||||||
import {UIEventSource} from "../UIEventSource";
|
import {UIEventSource} from "../UIEventSource";
|
||||||
import Img from "../../UI/Base/Img";
|
import Img from "../../UI/Base/Img";
|
||||||
import ScrollableFullScreen from "../../UI/Base/ScrollableFullScreen";
|
import ScrollableFullScreen from "../../UI/Base/ScrollableFullScreen";
|
||||||
|
import AddNewMarker from "../../UI/BigComponents/AddNewMarker";
|
||||||
|
import FilteredLayer from "../../Models/FilteredLayer";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The stray-click-hanlders adds a marker to the map if no feature was clicked.
|
* The stray-click-hanlders adds a marker to the map if no feature was clicked.
|
||||||
|
@ -14,7 +16,7 @@ export default class StrayClickHandler {
|
||||||
constructor(
|
constructor(
|
||||||
lastClickLocation: UIEventSource<{ lat: number, lon: number }>,
|
lastClickLocation: UIEventSource<{ lat: number, lon: number }>,
|
||||||
selectedElement: UIEventSource<string>,
|
selectedElement: UIEventSource<string>,
|
||||||
filteredLayers: UIEventSource<{ readonly isDisplayed: UIEventSource<boolean> }[]>,
|
filteredLayers: UIEventSource<FilteredLayer[]>,
|
||||||
leafletMap: UIEventSource<L.Map>,
|
leafletMap: UIEventSource<L.Map>,
|
||||||
uiToShow: ScrollableFullScreen) {
|
uiToShow: ScrollableFullScreen) {
|
||||||
const self = this;
|
const self = this;
|
||||||
|
@ -40,12 +42,12 @@ export default class StrayClickHandler {
|
||||||
|
|
||||||
selectedElement.setData(undefined);
|
selectedElement.setData(undefined);
|
||||||
self._lastMarker = L.marker([lastClick.lat, lastClick.lon], {
|
self._lastMarker = L.marker([lastClick.lat, lastClick.lon], {
|
||||||
icon: L.icon({
|
icon: L.divIcon({
|
||||||
iconUrl: Img.AsData(Svg.add),
|
html: new AddNewMarker(filteredLayers).ConstructElement(),
|
||||||
iconSize: [50, 50],
|
iconSize: [50, 50],
|
||||||
iconAnchor: [25, 50],
|
iconAnchor: [25, 50],
|
||||||
popupAnchor: [0, -45]
|
popupAnchor: [0, -45]
|
||||||
})
|
})
|
||||||
});
|
});
|
||||||
const popup = L.popup({
|
const popup = L.popup({
|
||||||
autoPan: true,
|
autoPan: true,
|
||||||
|
|
|
@ -2,7 +2,7 @@ import { Utils } from "../Utils";
|
||||||
|
|
||||||
export default class Constants {
|
export default class Constants {
|
||||||
|
|
||||||
public static vNumber = "0.9.0";
|
public static vNumber = "0.9.1";
|
||||||
|
|
||||||
// The user journey states thresholds when a new feature gets unlocked
|
// The user journey states thresholds when a new feature gets unlocked
|
||||||
public static userJourney = {
|
public static userJourney = {
|
||||||
|
|
54
UI/BigComponents/AddNewMarker.ts
Normal file
54
UI/BigComponents/AddNewMarker.ts
Normal file
|
@ -0,0 +1,54 @@
|
||||||
|
import {UIEventSource} from "../../Logic/UIEventSource";
|
||||||
|
import Combine from "../Base/Combine";
|
||||||
|
import Translations from "../i18n/Translations";
|
||||||
|
import {VariableUiElement} from "../Base/VariableUIElement";
|
||||||
|
import FilteredLayer from "../../Models/FilteredLayer";
|
||||||
|
import {TagUtils} from "../../Logic/Tags/TagUtils";
|
||||||
|
import Svg from "../../Svg";
|
||||||
|
|
||||||
|
export default class AddNewMarker extends Combine {
|
||||||
|
|
||||||
|
constructor(filteredLayers: UIEventSource<FilteredLayer[]>) {
|
||||||
|
const icons = new VariableUiElement(filteredLayers.map(filteredLayers => {
|
||||||
|
const icons = []
|
||||||
|
let last = undefined;
|
||||||
|
for (const filteredLayer of filteredLayers) {
|
||||||
|
const layer = filteredLayer.layerDef;
|
||||||
|
for (const preset of filteredLayer.layerDef.presets) {
|
||||||
|
const tags = TagUtils.KVtoProperties(preset.tags)
|
||||||
|
const icon = layer.GenerateLeafletStyle(new UIEventSource<any>(tags), false).icon.html
|
||||||
|
.SetClass("block relative")
|
||||||
|
.SetStyle("width: 42px; height: 42px;");
|
||||||
|
icons.push(icon)
|
||||||
|
if (last === undefined) {
|
||||||
|
last = layer.GenerateLeafletStyle(new UIEventSource<any>(tags), false).icon.html
|
||||||
|
.SetClass("block relative")
|
||||||
|
.SetStyle("width: 42px; height: 42px;");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if(icons.length === 1){
|
||||||
|
return icons[0]
|
||||||
|
}
|
||||||
|
icons.push(last)
|
||||||
|
const elem = new Combine(icons).SetClass("flex")
|
||||||
|
elem.SetClass("slide min-w-min").SetStyle("animation: slide " + icons.length + "s linear infinite;")
|
||||||
|
return elem;
|
||||||
|
}))
|
||||||
|
const label = Translations.t.general.add.addNewMapLabel.Clone()
|
||||||
|
.SetClass("block center absolute text-sm min-w-min pl-1 pr-1 bg-gray-400 rounded-3xl text-white opacity-65 whitespace-nowrap")
|
||||||
|
.SetStyle("top: 65px; transform: translateX(-50%)")
|
||||||
|
super([
|
||||||
|
new Combine([
|
||||||
|
Svg.add_pin_svg().SetClass("absolute").SetStyle("width: 50px; filter: drop-shadow(grey 0 0 10px"),
|
||||||
|
new Combine([icons])
|
||||||
|
.SetStyle("width: 50px")
|
||||||
|
.SetClass("absolute p-1 rounded-full overflow-hidden"),
|
||||||
|
Svg.addSmall_svg().SetClass("absolute animate-pulse").SetStyle("width: 30px; left: 30px; top: 35px;")
|
||||||
|
]).SetClass("absolute"),
|
||||||
|
new Combine([label]).SetStyle("position: absolute; left: 50%")
|
||||||
|
])
|
||||||
|
this.SetClass("block relative");
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -204,7 +204,7 @@ export default class SimpleAddUI extends Toggle {
|
||||||
).onClick(cancel)
|
).onClick(cancel)
|
||||||
|
|
||||||
return new Combine([
|
return new Combine([
|
||||||
Translations.t.general.add.confirmIntro.Subs({title: preset.name}),
|
// Translations.t.general.add.confirmIntro.Subs({title: preset.name}),
|
||||||
State.state.osmConnection.userDetails.data.dryRun ?
|
State.state.osmConnection.userDetails.data.dryRun ?
|
||||||
Translations.t.general.testing.Clone().SetClass("alert") : undefined,
|
Translations.t.general.testing.Clone().SetClass("alert") : undefined,
|
||||||
openLayerOrConfirm,
|
openLayerOrConfirm,
|
||||||
|
|
|
@ -226,7 +226,6 @@
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
"question": {
|
"question": {
|
||||||
"en": "What is the email address of the maintainer?",
|
"en": "What is the email address of the maintainer?",
|
||||||
|
@ -249,7 +248,6 @@
|
||||||
},
|
},
|
||||||
"render": "<a href='tel:{phone}'>{phone}</a>"
|
"render": "<a href='tel:{phone}'>{phone}</a>"
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
"question": {
|
"question": {
|
||||||
"nl": "Wanneer is dit fietsherstelpunt open?",
|
"nl": "Wanneer is dit fietsherstelpunt open?",
|
||||||
|
@ -410,10 +408,13 @@
|
||||||
{
|
{
|
||||||
"#": "Email maintainer",
|
"#": "Email maintainer",
|
||||||
"condition": {
|
"condition": {
|
||||||
"and": ["email~*", "service:bicycle:pump:operational_status=broken"]
|
"and": [
|
||||||
|
"email~*",
|
||||||
|
"service:bicycle:pump:operational_status=broken"
|
||||||
|
]
|
||||||
},
|
},
|
||||||
"render": {
|
"render": {
|
||||||
"en": "<a href='mailto:{email}?subject=Broken bicycle pump&body=Hello,%0D%0A%0D%0AWith this email, I'd like to inform you that the bicycle pump located at https://mapcomplete.osm.be/cyclofix#{id} is broken.'>Report this bicycle pump as broken</a>",
|
"en": "<a href='mailto:{email}?subject=Broken bicycle pump&body=Hello,\n\nWith this email, I'd like to inform you that the bicycle pump located at https://mapcomplete.osm.be/cyclofix?lat={_lat}&lon={_lon}&z=18#{id} is broken.'>Report this bicycle pump as broken</a>",
|
||||||
"nl": "<a href='mailto:{email}?subject=Kapotte fietspomp&body=Geachte,%0D%0A%0D%0AGraag had ik u gemeld dat een fietspomp defect is. De fietspomp bevindt zich hier: https://mapcomplete.osm.be/cyclofix#{id}.'>Rapporteer deze fietspomp als kapot</a>"
|
"nl": "<a href='mailto:{email}?subject=Kapotte fietspomp&body=Geachte,%0D%0A%0D%0AGraag had ik u gemeld dat een fietspomp defect is. De fietspomp bevindt zich hier: https://mapcomplete.osm.be/cyclofix#{id}.'>Rapporteer deze fietspomp als kapot</a>"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
version="1.1"
|
version="1.1"
|
||||||
id="svg132"
|
id="svg132"
|
||||||
sodipodi:docname="addSmall.svg"
|
sodipodi:docname="addSmall.svg"
|
||||||
inkscape:version="0.92.4 (5da689c313, 2019-01-14)"
|
inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"
|
||||||
style="fill:none">
|
style="fill:none">
|
||||||
<metadata
|
<metadata
|
||||||
id="metadata136">
|
id="metadata136">
|
||||||
|
@ -23,7 +23,7 @@
|
||||||
<dc:format>image/svg+xml</dc:format>
|
<dc:format>image/svg+xml</dc:format>
|
||||||
<dc:type
|
<dc:type
|
||||||
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
|
||||||
<dc:title></dc:title>
|
<dc:title />
|
||||||
</cc:Work>
|
</cc:Work>
|
||||||
</rdf:RDF>
|
</rdf:RDF>
|
||||||
</metadata>
|
</metadata>
|
||||||
|
@ -37,16 +37,16 @@
|
||||||
inkscape:pageopacity="0"
|
inkscape:pageopacity="0"
|
||||||
inkscape:pageshadow="2"
|
inkscape:pageshadow="2"
|
||||||
inkscape:window-width="1920"
|
inkscape:window-width="1920"
|
||||||
inkscape:window-height="1001"
|
inkscape:window-height="1003"
|
||||||
id="namedview134"
|
id="namedview134"
|
||||||
showgrid="false"
|
showgrid="false"
|
||||||
showguides="true"
|
showguides="true"
|
||||||
inkscape:guide-bbox="true"
|
inkscape:guide-bbox="true"
|
||||||
inkscape:zoom="5.5166017"
|
inkscape:zoom="5.5166017"
|
||||||
inkscape:cx="9.5832222"
|
inkscape:cx="-5.2810012"
|
||||||
inkscape:cy="51.981151"
|
inkscape:cy="51.981151"
|
||||||
inkscape:window-x="0"
|
inkscape:window-x="1024"
|
||||||
inkscape:window-y="0"
|
inkscape:window-y="1080"
|
||||||
inkscape:window-maximized="1"
|
inkscape:window-maximized="1"
|
||||||
inkscape:current-layer="svg132">
|
inkscape:current-layer="svg132">
|
||||||
<sodipodi:guide
|
<sodipodi:guide
|
||||||
|
@ -60,7 +60,7 @@
|
||||||
cy="49.02142"
|
cy="49.02142"
|
||||||
r="49"
|
r="49"
|
||||||
id="circle4"
|
id="circle4"
|
||||||
style="fill:#70c549" />
|
style="fill:#37d649;fill-opacity:1;stroke:#606060;stroke-opacity:1" />
|
||||||
<defs
|
<defs
|
||||||
id="defs130">
|
id="defs130">
|
||||||
<filter
|
<filter
|
||||||
|
@ -275,14 +275,9 @@
|
||||||
id="layer1"
|
id="layer1"
|
||||||
inkscape:label="Layer 1">
|
inkscape:label="Layer 1">
|
||||||
<path
|
<path
|
||||||
inkscape:connector-curvature="0"
|
style="color:#000000;font-style:normal;font-variant:normal;font-weight:normal;font-stretch:normal;font-size:medium;line-height:normal;font-family:sans-serif;font-variant-ligatures:normal;font-variant-position:normal;font-variant-caps:normal;font-variant-numeric:normal;font-variant-alternates:normal;font-feature-settings:normal;text-indent:0;text-align:start;text-decoration:none;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000000;letter-spacing:normal;word-spacing:normal;text-transform:none;writing-mode:lr-tb;direction:ltr;text-orientation:mixed;dominant-baseline:auto;baseline-shift:baseline;text-anchor:start;white-space:normal;shape-padding:0;clip-rule:nonzero;display:inline;overflow:visible;visibility:visible;opacity:1;isolation:auto;mix-blend-mode:normal;color-interpolation:sRGB;color-interpolation-filters:linearRGB;solid-color:#000000;solid-opacity:1;vector-effect:none;fill:#ffffff;fill-opacity:1;fill-rule:nonzero;stroke:none;stroke-width:1.99999998;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;color-rendering:auto;image-rendering:auto;shape-rendering:auto;text-rendering:auto;enable-background:accumulate"
|
||||||
id="path815"
|
d="M 48.451172 13.953125 A 8.3145427 8.3145427 0 0 0 42.529297 16.5625 A 8.3145427 8.3145427 0 0 0 40.267578 22.380859 L 40.267578 39.757812 L 23.134766 39.757812 A 8.3145427 8.3145427 0 0 0 17.134766 42.193359 A 8.3145427 8.3145427 0 0 0 23.138672 56.386719 L 40.267578 56.386719 L 40.267578 73.435547 A 8.3145427 8.3145427 0 1 0 56.894531 73.439453 L 56.894531 56.386719 L 74.191406 56.386719 A 8.3145427 8.3145427 0 1 0 74.195312 39.757812 L 56.892578 39.757812 L 56.892578 22.380859 A 8.3145427 8.3145427 0 0 0 48.451172 13.953125 z "
|
||||||
d="M 22.100902,291.35894 5.785709,275.04375 v 0"
|
transform="matrix(0.3195493,0.3195493,-0.3195493,0.3195493,13.753427,252.28933)"
|
||||||
style="fill:none;stroke:#ffffff;stroke-width:7.51411438;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
id="path815" />
|
||||||
<path
|
|
||||||
inkscape:connector-curvature="0"
|
|
||||||
id="path815-3"
|
|
||||||
d="M 22.125504,274.96508 5.8103071,291.28027 v 0"
|
|
||||||
style="fill:none;stroke:#ffffff;stroke-width:7.51411438;stroke-linecap:round;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" />
|
|
||||||
</g>
|
</g>
|
||||||
</svg>
|
</svg>
|
||||||
|
|
Before Width: | Height: | Size: 7.9 KiB After Width: | Height: | Size: 9.2 KiB |
270
assets/svg/add_pin.svg
Normal file
270
assets/svg/add_pin.svg
Normal file
|
@ -0,0 +1,270 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<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="98"
|
||||||
|
height="121"
|
||||||
|
viewBox="0 0 98 121"
|
||||||
|
fill="none"
|
||||||
|
version="1.1"
|
||||||
|
id="svg132"
|
||||||
|
sodipodi:docname="add_pin.svg"
|
||||||
|
inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)">
|
||||||
|
<metadata
|
||||||
|
id="metadata136">
|
||||||
|
<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>
|
||||||
|
<sodipodi:namedview
|
||||||
|
pagecolor="#ffffff"
|
||||||
|
bordercolor="#666666"
|
||||||
|
borderopacity="1"
|
||||||
|
objecttolerance="10"
|
||||||
|
gridtolerance="10"
|
||||||
|
guidetolerance="10"
|
||||||
|
inkscape:pageopacity="0"
|
||||||
|
inkscape:pageshadow="2"
|
||||||
|
inkscape:window-width="1920"
|
||||||
|
inkscape:window-height="1003"
|
||||||
|
id="namedview134"
|
||||||
|
showgrid="false"
|
||||||
|
showguides="true"
|
||||||
|
inkscape:guide-bbox="true"
|
||||||
|
inkscape:zoom="5.5166017"
|
||||||
|
inkscape:cx="-2.1344259"
|
||||||
|
inkscape:cy="67.640966"
|
||||||
|
inkscape:window-x="1024"
|
||||||
|
inkscape:window-y="1080"
|
||||||
|
inkscape:window-maximized="1"
|
||||||
|
inkscape:current-layer="svg132">
|
||||||
|
<sodipodi:guide
|
||||||
|
position="48.580633,-10.69499"
|
||||||
|
orientation="1,0"
|
||||||
|
id="guide959"
|
||||||
|
inkscape:locked="false" />
|
||||||
|
</sodipodi:namedview>
|
||||||
|
<path
|
||||||
|
style="fill:#70c549"
|
||||||
|
d="M 49,0 C 21.938047,0 0,21.938047 0,49 c 0.02348371,16.851276 8.7043271,32.508219 22.984375,41.455078 4.110658,2.633337 9.028373,8.324463 13.179687,13.515622 4.485102,5.60856 6.977885,17.12361 12.416016,17.21094 5.438131,-0.0873 7.932867,-11.60238 12.417969,-17.21094 3.591801,-4.491491 7.407182,-9.366614 11.611328,-12.093747 C 88.250957,83.276304 97.97807,66.850204 98,49 98,21.938047 76.061953,0 49,0 Z"
|
||||||
|
id="circle4"
|
||||||
|
inkscape:connector-curvature="0"
|
||||||
|
sodipodi:nodetypes="sccscsccs" />
|
||||||
|
<defs
|
||||||
|
id="defs130">
|
||||||
|
<filter
|
||||||
|
id="filter0_d"
|
||||||
|
x="58.84"
|
||||||
|
y="52.704"
|
||||||
|
width="25.4126"
|
||||||
|
height="17.436"
|
||||||
|
filterUnits="userSpaceOnUse"
|
||||||
|
color-interpolation-filters="sRGB">
|
||||||
|
<feFlood
|
||||||
|
flood-opacity="0"
|
||||||
|
result="BackgroundImageFix"
|
||||||
|
id="feFlood52" />
|
||||||
|
<feColorMatrix
|
||||||
|
in="SourceAlpha"
|
||||||
|
type="matrix"
|
||||||
|
values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"
|
||||||
|
id="feColorMatrix54" />
|
||||||
|
<feOffset
|
||||||
|
dy="4"
|
||||||
|
id="feOffset56" />
|
||||||
|
<feGaussianBlur
|
||||||
|
stdDeviation="2"
|
||||||
|
id="feGaussianBlur58" />
|
||||||
|
<feColorMatrix
|
||||||
|
type="matrix"
|
||||||
|
values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.25 0"
|
||||||
|
id="feColorMatrix60" />
|
||||||
|
<feBlend
|
||||||
|
mode="normal"
|
||||||
|
in2="BackgroundImageFix"
|
||||||
|
result="effect1_dropShadow"
|
||||||
|
id="feBlend62" />
|
||||||
|
<feBlend
|
||||||
|
mode="normal"
|
||||||
|
in="SourceGraphic"
|
||||||
|
in2="effect1_dropShadow"
|
||||||
|
result="shape"
|
||||||
|
id="feBlend64" />
|
||||||
|
</filter>
|
||||||
|
<filter
|
||||||
|
id="filter1_d"
|
||||||
|
x="14"
|
||||||
|
y="15"
|
||||||
|
width="38.0001"
|
||||||
|
height="38"
|
||||||
|
filterUnits="userSpaceOnUse"
|
||||||
|
color-interpolation-filters="sRGB">
|
||||||
|
<feFlood
|
||||||
|
flood-opacity="0"
|
||||||
|
result="BackgroundImageFix"
|
||||||
|
id="feFlood67" />
|
||||||
|
<feColorMatrix
|
||||||
|
in="SourceAlpha"
|
||||||
|
type="matrix"
|
||||||
|
values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"
|
||||||
|
id="feColorMatrix69" />
|
||||||
|
<feOffset
|
||||||
|
dy="4"
|
||||||
|
id="feOffset71" />
|
||||||
|
<feGaussianBlur
|
||||||
|
stdDeviation="2"
|
||||||
|
id="feGaussianBlur73" />
|
||||||
|
<feColorMatrix
|
||||||
|
type="matrix"
|
||||||
|
values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.25 0"
|
||||||
|
id="feColorMatrix75" />
|
||||||
|
<feBlend
|
||||||
|
mode="normal"
|
||||||
|
in2="BackgroundImageFix"
|
||||||
|
result="effect1_dropShadow"
|
||||||
|
id="feBlend77" />
|
||||||
|
<feBlend
|
||||||
|
mode="normal"
|
||||||
|
in="SourceGraphic"
|
||||||
|
in2="effect1_dropShadow"
|
||||||
|
result="shape"
|
||||||
|
id="feBlend79" />
|
||||||
|
</filter>
|
||||||
|
<filter
|
||||||
|
id="filter2_d"
|
||||||
|
x="39.5"
|
||||||
|
y="7"
|
||||||
|
width="53"
|
||||||
|
height="53"
|
||||||
|
filterUnits="userSpaceOnUse"
|
||||||
|
color-interpolation-filters="sRGB">
|
||||||
|
<feFlood
|
||||||
|
flood-opacity="0"
|
||||||
|
result="BackgroundImageFix"
|
||||||
|
id="feFlood82" />
|
||||||
|
<feColorMatrix
|
||||||
|
in="SourceAlpha"
|
||||||
|
type="matrix"
|
||||||
|
values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"
|
||||||
|
id="feColorMatrix84" />
|
||||||
|
<feOffset
|
||||||
|
dy="4"
|
||||||
|
id="feOffset86" />
|
||||||
|
<feGaussianBlur
|
||||||
|
stdDeviation="2"
|
||||||
|
id="feGaussianBlur88" />
|
||||||
|
<feColorMatrix
|
||||||
|
type="matrix"
|
||||||
|
values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.25 0"
|
||||||
|
id="feColorMatrix90" />
|
||||||
|
<feBlend
|
||||||
|
mode="normal"
|
||||||
|
in2="BackgroundImageFix"
|
||||||
|
result="effect1_dropShadow"
|
||||||
|
id="feBlend92" />
|
||||||
|
<feBlend
|
||||||
|
mode="normal"
|
||||||
|
in="SourceGraphic"
|
||||||
|
in2="effect1_dropShadow"
|
||||||
|
result="shape"
|
||||||
|
id="feBlend94" />
|
||||||
|
</filter>
|
||||||
|
<filter
|
||||||
|
id="filter3_d"
|
||||||
|
x="11"
|
||||||
|
y="54"
|
||||||
|
width="54.7667"
|
||||||
|
height="38.1429"
|
||||||
|
filterUnits="userSpaceOnUse"
|
||||||
|
color-interpolation-filters="sRGB">
|
||||||
|
<feFlood
|
||||||
|
flood-opacity="0"
|
||||||
|
result="BackgroundImageFix"
|
||||||
|
id="feFlood97" />
|
||||||
|
<feColorMatrix
|
||||||
|
in="SourceAlpha"
|
||||||
|
type="matrix"
|
||||||
|
values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"
|
||||||
|
id="feColorMatrix99" />
|
||||||
|
<feOffset
|
||||||
|
dy="4"
|
||||||
|
id="feOffset101" />
|
||||||
|
<feGaussianBlur
|
||||||
|
stdDeviation="2"
|
||||||
|
id="feGaussianBlur103" />
|
||||||
|
<feColorMatrix
|
||||||
|
type="matrix"
|
||||||
|
values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.25 0"
|
||||||
|
id="feColorMatrix105" />
|
||||||
|
<feBlend
|
||||||
|
mode="normal"
|
||||||
|
in2="BackgroundImageFix"
|
||||||
|
result="effect1_dropShadow"
|
||||||
|
id="feBlend107" />
|
||||||
|
<feBlend
|
||||||
|
mode="normal"
|
||||||
|
in="SourceGraphic"
|
||||||
|
in2="effect1_dropShadow"
|
||||||
|
result="shape"
|
||||||
|
id="feBlend109" />
|
||||||
|
</filter>
|
||||||
|
<filter
|
||||||
|
id="filter4_d"
|
||||||
|
x="41"
|
||||||
|
y="64"
|
||||||
|
width="28"
|
||||||
|
height="29"
|
||||||
|
filterUnits="userSpaceOnUse"
|
||||||
|
color-interpolation-filters="sRGB">
|
||||||
|
<feFlood
|
||||||
|
flood-opacity="0"
|
||||||
|
result="BackgroundImageFix"
|
||||||
|
id="feFlood112" />
|
||||||
|
<feColorMatrix
|
||||||
|
in="SourceAlpha"
|
||||||
|
type="matrix"
|
||||||
|
values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0"
|
||||||
|
id="feColorMatrix114" />
|
||||||
|
<feOffset
|
||||||
|
dy="4"
|
||||||
|
id="feOffset116" />
|
||||||
|
<feGaussianBlur
|
||||||
|
stdDeviation="2"
|
||||||
|
id="feGaussianBlur118" />
|
||||||
|
<feColorMatrix
|
||||||
|
type="matrix"
|
||||||
|
values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0.25 0"
|
||||||
|
id="feColorMatrix120" />
|
||||||
|
<feBlend
|
||||||
|
mode="normal"
|
||||||
|
in2="BackgroundImageFix"
|
||||||
|
result="effect1_dropShadow"
|
||||||
|
id="feBlend122" />
|
||||||
|
<feBlend
|
||||||
|
mode="normal"
|
||||||
|
in="SourceGraphic"
|
||||||
|
in2="effect1_dropShadow"
|
||||||
|
result="shape"
|
||||||
|
id="feBlend124" />
|
||||||
|
</filter>
|
||||||
|
<clipPath
|
||||||
|
id="clip0">
|
||||||
|
<rect
|
||||||
|
width="31.8198"
|
||||||
|
height="31.8198"
|
||||||
|
fill="white"
|
||||||
|
transform="translate(43.5 29.5) rotate(-45)"
|
||||||
|
id="rect127" />
|
||||||
|
</clipPath>
|
||||||
|
</defs>
|
||||||
|
</svg>
|
After Width: | Height: | Size: 7.5 KiB |
72
index.css
72
index.css
|
@ -11,39 +11,39 @@
|
||||||
.max-h-20vh {
|
.max-h-20vh {
|
||||||
max-height: 20vh;
|
max-height: 20vh;
|
||||||
}
|
}
|
||||||
|
|
||||||
.z-above-map{
|
.z-above-map {
|
||||||
z-index: 10000
|
z-index: 10000
|
||||||
}
|
}
|
||||||
|
|
||||||
.z-above-controls{
|
.z-above-controls {
|
||||||
z-index: 10001
|
z-index: 10001
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.btn {
|
.btn {
|
||||||
@apply inline-flex justify-center;
|
@apply inline-flex justify-center;
|
||||||
@apply py-2 px-4;
|
@apply py-2 px-4;
|
||||||
@apply border border-transparent shadow-sm;
|
@apply border border-transparent shadow-sm;
|
||||||
@apply shadow-sm rounded-3xl;
|
@apply shadow-sm rounded-3xl;
|
||||||
@apply ring-2 ring-blue-200 hover:ring-blue-300;
|
@apply ring-2 ring-blue-200 hover:ring-blue-300;
|
||||||
@apply mt-1 mr-1;
|
@apply mt-1 mr-1;
|
||||||
@apply text-sm font-medium text-white;
|
@apply text-sm font-medium text-white;
|
||||||
@apply bg-blue-600 hover:bg-blue-700;
|
@apply bg-blue-600 hover:bg-blue-700;
|
||||||
@apply focus:outline-none focus:ring-blue-700;
|
@apply focus:outline-none focus:ring-blue-700;
|
||||||
}
|
}
|
||||||
|
|
||||||
.btn-secondary {
|
.btn-secondary {
|
||||||
@apply bg-gray-600 hover:bg-gray-700;
|
@apply bg-gray-600 hover:bg-gray-700;
|
||||||
}
|
}
|
||||||
|
|
||||||
.btn-disabled {
|
.btn-disabled {
|
||||||
@apply bg-gray-500 hover:bg-gray-500;
|
@apply bg-gray-500 hover:bg-gray-500;
|
||||||
@apply text-gray-300;
|
@apply text-gray-300;
|
||||||
@apply ring-gray-200 hover:ring-gray-200 focus:ring-gray-200;
|
@apply ring-gray-200 hover:ring-gray-200 focus:ring-gray-200;
|
||||||
@apply cursor-default;
|
@apply cursor-default;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -61,7 +61,7 @@
|
||||||
--shadow-color: #00000066;
|
--shadow-color: #00000066;
|
||||||
--variable-title-height: 0px; /* Set by javascript */
|
--variable-title-height: 0px; /* Set by javascript */
|
||||||
--return-to-the-map-height: 2em;
|
--return-to-the-map-height: 2em;
|
||||||
|
|
||||||
--image-carousel-height: 350px;
|
--image-carousel-height: 350px;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -75,6 +75,7 @@ html, body {
|
||||||
color: var(--foreground-color);
|
color: var(--foreground-color);
|
||||||
font-family: 'Helvetica Neue', Arial, sans-serif;
|
font-family: 'Helvetica Neue', Arial, sans-serif;
|
||||||
}
|
}
|
||||||
|
|
||||||
.leaflet-overlay-pane .leaflet-zoom-animated {
|
.leaflet-overlay-pane .leaflet-zoom-animated {
|
||||||
/* Another workaround to keep leaflet working */
|
/* Another workaround to keep leaflet working */
|
||||||
width: initial !important;
|
width: initial !important;
|
||||||
|
@ -93,7 +94,7 @@ svg, img {
|
||||||
display: unset;
|
display: unset;
|
||||||
}
|
}
|
||||||
|
|
||||||
.mapcontrol svg path{
|
.mapcontrol svg path {
|
||||||
fill: var(--subtle-detail-color-contrast) !important;
|
fill: var(--subtle-detail-color-contrast) !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -125,12 +126,12 @@ btn {
|
||||||
width: 4rem !important;
|
width: 4rem !important;
|
||||||
}
|
}
|
||||||
|
|
||||||
.space-between{
|
.space-between {
|
||||||
justify-content: space-between;
|
justify-content: space-between;
|
||||||
}
|
}
|
||||||
|
|
||||||
.link-underline a {
|
.link-underline a {
|
||||||
text-decoration: underline 1px #0078a855;;
|
text-decoration: underline 1px #0078a855;;
|
||||||
color: #0078A8;
|
color: #0078A8;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -182,7 +183,9 @@ li::marker {
|
||||||
color: var(--subtle-detail-color-light-contrast);
|
color: var(--subtle-detail-color-light-contrast);
|
||||||
}
|
}
|
||||||
|
|
||||||
.border-attention-catch{ border: 5px solid var(--catch-detail-color);}
|
.border-attention-catch {
|
||||||
|
border: 5px solid var(--catch-detail-color);
|
||||||
|
}
|
||||||
|
|
||||||
.direction-svg svg path {
|
.direction-svg svg path {
|
||||||
fill: var(--catch-detail-color) !important;
|
fill: var(--catch-detail-color) !important;
|
||||||
|
@ -299,6 +302,15 @@ li::marker {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@keyframes slide {
|
||||||
|
from {
|
||||||
|
transform: translateX(0%);
|
||||||
|
}
|
||||||
|
|
||||||
|
to {
|
||||||
|
transform: translateX(calc(-100% + 42px));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/**************************************/
|
/**************************************/
|
||||||
|
|
||||||
|
@ -380,7 +392,7 @@ li::marker {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
.slideshow-item img{
|
.slideshow-item img {
|
||||||
height: var(--image-carousel-height);
|
height: var(--image-carousel-height);
|
||||||
width: unset;
|
width: unset;
|
||||||
}
|
}
|
|
@ -86,6 +86,7 @@
|
||||||
"number": "number",
|
"number": "number",
|
||||||
"osmLinkTooltip": "See this object on OpenStreetMap for history and more editing options",
|
"osmLinkTooltip": "See this object on OpenStreetMap for history and more editing options",
|
||||||
"add": {
|
"add": {
|
||||||
|
"addNewMapLabel": "Add new item",
|
||||||
"addNew": "Add a new {category} here",
|
"addNew": "Add a new {category} here",
|
||||||
"presetInfo": "The new POI will have {tags}",
|
"presetInfo": "The new POI will have {tags}",
|
||||||
"warnVisibleForEveryone": "Your addition will be visible for everyone",
|
"warnVisibleForEveryone": "Your addition will be visible for everyone",
|
||||||
|
|
|
@ -575,6 +575,9 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"9": {
|
||||||
|
"render": "<a href='mailto:{email}?subject=Kapotte fietspomp&body=Geachte,%0D%0A%0D%0AGraag had ik u gemeld dat een fietspomp defect is. De fietspomp bevindt zich hier: https://mapcomplete.osm.be/cyclofix#{id}.'>Rapporteer deze fietspomp als kapot</a>"
|
||||||
|
},
|
||||||
"10": {
|
"10": {
|
||||||
"question": "Welke ventielen werken er met de pomp?",
|
"question": "Welke ventielen werken er met de pomp?",
|
||||||
"render": "Deze pomp werkt met de volgende ventielen: {valves}",
|
"render": "Deze pomp werkt met de volgende ventielen: {valves}",
|
||||||
|
|
|
@ -46,6 +46,7 @@
|
||||||
"number": "getal",
|
"number": "getal",
|
||||||
"osmLinkTooltip": "Bekijk dit object op OpenStreetMap waar geschiedenis en meer aanpasopties zijn",
|
"osmLinkTooltip": "Bekijk dit object op OpenStreetMap waar geschiedenis en meer aanpasopties zijn",
|
||||||
"add": {
|
"add": {
|
||||||
|
"addNewMapLabel": "Voeg item toe",
|
||||||
"addNew": "Voeg hier een {category} toe",
|
"addNew": "Voeg hier een {category} toe",
|
||||||
"title": "Nieuw punt toevoegen?",
|
"title": "Nieuw punt toevoegen?",
|
||||||
"intro": "Je klikte ergens waar er nog geen data is. Kies hieronder welk punt je wilt toevoegen<br/>",
|
"intro": "Je klikte ergens waar er nog geen data is. Kies hieronder welk punt je wilt toevoegen<br/>",
|
||||||
|
|
86
test.ts
86
test.ts
|
@ -1,73 +1,29 @@
|
||||||
import {UIEventSource} from "./Logic/UIEventSource";
|
import {UIEventSource} from "./Logic/UIEventSource";
|
||||||
import {AllKnownLayouts} from "./Customizations/AllKnownLayouts";
|
import AllKnownLayers from "./Customizations/AllKnownLayers";
|
||||||
import State from "./State";
|
import {FixedUiElement} from "./UI/Base/FixedUiElement";
|
||||||
import LocationInput from "./UI/Input/LocationInput";
|
|
||||||
import Loc from "./Models/Loc";
|
|
||||||
import {VariableUiElement} from "./UI/Base/VariableUIElement";
|
import {VariableUiElement} from "./UI/Base/VariableUIElement";
|
||||||
import AvailableBaseLayers from "./Logic/Actors/AvailableBaseLayers";
|
import {TagUtils} from "./Logic/Tags/TagUtils";
|
||||||
import LayoutConfig from "./Models/ThemeConfig/LayoutConfig";
|
import Combine from "./UI/Base/Combine";
|
||||||
|
import Svg from "./Svg";
|
||||||
|
import Translations from "./UI/i18n/Translations";
|
||||||
|
import LayerConfig from "./Models/ThemeConfig/LayerConfig";
|
||||||
|
import AddNewMarker from "./UI/BigComponents/AddNewMarker";
|
||||||
|
|
||||||
const layout = new UIEventSource<LayoutConfig>(AllKnownLayouts.allKnownLayouts.get("cycle_infra"))
|
|
||||||
State.state = new State(layout.data)
|
|
||||||
|
|
||||||
const features = new UIEventSource<{ feature: any }[]>([
|
function genMarker(filteredLayers: UIEventSource<{ appliedFilters: undefined; isDisplayed: UIEventSource<boolean>; layerDef: LayerConfig }[]>) {
|
||||||
|
return new AddNewMarker(filteredLayers)
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
let filteredLayers = new UIEventSource([
|
||||||
{
|
{
|
||||||
feature: {
|
layerDef: AllKnownLayers.sharedLayers.get("toilet"),
|
||||||
"type": "Feature",
|
isDisplayed: new UIEventSource<boolean>(true),
|
||||||
"properties": {},
|
appliedFilters: undefined
|
||||||
"geometry": {
|
|
||||||
"type": "LineString",
|
|
||||||
"coordinates": [
|
|
||||||
[
|
|
||||||
3.219616413116455,
|
|
||||||
51.215315026941276
|
|
||||||
],
|
|
||||||
[
|
|
||||||
3.221080899238586,
|
|
||||||
51.21564432998662
|
|
||||||
]
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
feature: {
|
|
||||||
"type": "Feature",
|
|
||||||
"properties": {},
|
|
||||||
"geometry": {
|
|
||||||
"type": "LineString",
|
|
||||||
"coordinates": [
|
|
||||||
[
|
|
||||||
3.220340609550476,
|
|
||||||
51.21547967875836
|
|
||||||
],
|
|
||||||
[
|
|
||||||
3.2198095321655273,
|
|
||||||
51.216390293480515
|
|
||||||
]
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
])
|
])
|
||||||
|
genMarker(filteredLayers).SetStyle("width: 50px; height: 70px")
|
||||||
|
.SetClass("block border-black border")
|
||||||
|
.AttachTo("maindiv")
|
||||||
|
|
||||||
features.data.map(f => State.state.allElements.addOrGetElement(f.feature))
|
new FixedUiElement("").AttachTo("extradiv")
|
||||||
const loc = new UIEventSource<Loc>({
|
|
||||||
zoom: 19,
|
|
||||||
lat: 51.21547967875836,
|
|
||||||
lon: 3.220340609550476
|
|
||||||
})
|
|
||||||
const li = new LocationInput(
|
|
||||||
{
|
|
||||||
mapBackground: AvailableBaseLayers.SelectBestLayerAccordingTo(loc, new UIEventSource<string | string[]>("map")),
|
|
||||||
snapTo: features,
|
|
||||||
snappedPointTags: {
|
|
||||||
"barrier": "cycle_barrier"
|
|
||||||
},
|
|
||||||
maxSnapDistance: 15,
|
|
||||||
requiresSnapping: false,
|
|
||||||
centerLocation: loc
|
|
||||||
}
|
|
||||||
)
|
|
||||||
li.SetStyle("height: 30rem").AttachTo("maindiv")
|
|
||||||
new VariableUiElement(li.GetValue().map(JSON.stringify)).AttachTo("extradiv")
|
|
Loading…
Add table
Add a link
Reference in a new issue