Tweaks to popup closing behaviour

This commit is contained in:
Pieter Vander Vennet 2021-01-04 23:36:02 +01:00
parent baf41cb79d
commit 5523603e70
3 changed files with 29 additions and 12 deletions

View file

@ -278,8 +278,10 @@ export class InitUiElements {
checkbox.isEnabled.setData(false); checkbox.isEnabled.setData(false);
}) })
State.state.selectedElement.addCallback(() => { State.state.selectedElement.addCallback(selected => {
checkbox.isEnabled.setData(false); if(selected !== undefined){
checkbox.isEnabled.setData(false);
}
}) })
@ -367,11 +369,6 @@ export class InitUiElements {
attr attr
); );
State.state.leafletMap.setData(bm.map); State.state.leafletMap.setData(bm.map);
bm.map.on("popupclose", () => {
State.state.selectedElement.setData(undefined)
})
} }
private static InitLayers() { private static InitLayers() {

View file

@ -75,12 +75,14 @@ export default class State {
/** /**
This message is shown full screen on mobile devices This message is shown full screen on mobile devices
*/ */
public readonly fullScreenMessage = new UIEventSource<UIElement>(undefined); public readonly fullScreenMessage = new UIEventSource<UIElement>(undefined)
.addCallback(fs => console.log("Fullscreen message is", fs));
/** /**
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<any>(undefined); public readonly selectedElement = new UIEventSource<any>(undefined)
.addCallback(selected => console.log("Selected element is", selected));
public readonly featureSwitchUserbadge: UIEventSource<boolean>; public readonly featureSwitchUserbadge: UIEventSource<boolean>;
public readonly featureSwitchSearch: UIEventSource<boolean>; public readonly featureSwitchSearch: UIEventSource<boolean>;

View file

@ -17,6 +17,7 @@ export default class ShowDataLayer {
private readonly _layerDict; private readonly _layerDict;
private readonly _leafletMap: UIEventSource<L.Map>; private readonly _leafletMap: UIEventSource<L.Map>;
private readonly _onSelectedTrigger: any = {}; // osmId+geometry.type+matching_layer_id --> () => void
constructor(features: UIEventSource<{ feature: any, freshness: Date }[]>, constructor(features: UIEventSource<{ feature: any, freshness: Date }[]>,
leafletMap: UIEventSource<L.Map>, leafletMap: UIEventSource<L.Map>,
@ -63,6 +64,16 @@ export default class ShowDataLayer {
zoom.map(z => (layoutToUse.clustering?.maxZoom ?? 0) >= z).addCallback(() => { zoom.map(z => (layoutToUse.clustering?.maxZoom ?? 0) >= z).addCallback(() => {
update(); update();
}); });
State.state.selectedElement.addCallback(feature => {
if(feature === undefined){
return;
}
const id = feature.properties.id+feature.geometry.type+feature._matching_layer_id;
const action = self._onSelectedTrigger[id];
if(action){
action();
}
});
} }
@ -109,7 +120,7 @@ export default class ShowDataLayer {
const tags = State.state.allElements.getEventSourceFor(feature); const tags = State.state.allElements.getEventSourceFor(feature);
let uiElement: LazyElement = new LazyElement(() => new FeatureInfoBox(tags, layer)); const uiElement: LazyElement = new LazyElement(() => new FeatureInfoBox(tags, layer));
popup.setContent(uiElement.Render()); popup.setContent(uiElement.Render());
leafletLayer.bindPopup(popup); leafletLayer.bindPopup(popup);
// We first render the UIelement (which'll still need an update later on...) // We first render the UIelement (which'll still need an update later on...)
@ -118,10 +129,17 @@ export default class ShowDataLayer {
leafletLayer.on("click", (e) => { leafletLayer.on("click", (e) => {
// We set the element as selected... // We set the element as selected...
uiElement.Activate(); // uiElement.Activate();
State.state.selectedElement.setData(feature); State.state.selectedElement.setData(feature);
}); });
const id = feature.properties.id+feature.geometry.type+feature._matching_layer_id;
this._onSelectedTrigger[id]
= () => {
leafletLayer.openPopup();
uiElement.Activate();
}
if (feature.properties.id.replace(/\//g, "_") === Hash.Get().data) { if (feature.properties.id.replace(/\//g, "_") === Hash.Get().data) {
// This element is in the URL, so this is a share link // This element is in the URL, so this is a share link