forked from MapComplete/MapComplete
Tweaks to popup closing behaviour
This commit is contained in:
parent
baf41cb79d
commit
5523603e70
3 changed files with 29 additions and 12 deletions
|
@ -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() {
|
||||||
|
|
6
State.ts
6
State.ts
|
@ -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>;
|
||||||
|
|
|
@ -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
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue