diff --git a/frappe/public/js/frappe/form/controls/geolocation.js b/frappe/public/js/frappe/form/controls/geolocation.js index 4d6e1bc426..827a9be315 100644 --- a/frappe/public/js/frappe/form/controls/geolocation.js +++ b/frappe/public/js/frappe/form/controls/geolocation.js @@ -13,30 +13,41 @@ frappe.ui.form.ControlGeolocation = class ControlGeolocation extends frappe.ui.f if (!this.disp_area) { return; } + if (!this.map_id) { + this.map_id = frappe.dom.get_unique_id(); + this.map_area = $( + `
+
+
` + ); - this.map_id = frappe.dom.get_unique_id(); - this.map_area = $( - `
-
-
` - ); + $(this.disp_area).html(this.map_area); + } - $(this.disp_area).html(this.map_area); + // show again on idempotent invocations $(this.disp_area).removeClass("like-disabled-input"); $(this.disp_area).css("display", "block"); if (this.frm) { - this.make_map(value); + this.make_map(); + if (value) { + this.bind_leaflet_data(value); + } } else { $(document).on("frappe.ui.Dialog:shown", () => { this.make_map(); + if (value) { + this.bind_leaflet_data(value); + } }); } } make_map(value) { - this.customize_draw_controls(); - this.bind_leaflet_map(); + if (!this.map) { + this.customize_draw_controls(); + this.bind_leaflet_map(); + } if (this.disabled) { this.map.dragging.disable(); this.map.touchZoom.disable(); @@ -47,17 +58,17 @@ frappe.ui.form.ControlGeolocation = class ControlGeolocation extends frappe.ui.f this.map.zoomControl.remove(); } else { this.bind_leaflet_draw_control(); - this.bind_leaflet_event_listeners(); - this.bind_leaflet_locate_control(); - this.bind_leaflet_data(value); + if (!this.bound_event_listeners) { + this.bind_leaflet_event_listeners(); + } + if (!this.locate_control) { + this.bind_leaflet_locate_control(); + } } } bind_leaflet_data(value) { /* render raw value from db into map */ - if (!this.map || !value) { - return; - } this.clear_editable_layers(); const data_layers = new L.FeatureGroup().addLayer( @@ -159,15 +170,14 @@ frappe.ui.form.ControlGeolocation = class ControlGeolocation extends frappe.ui.f } bind_leaflet_draw_control() { - if ( - !frappe.perm.has_perm(this.doctype, this.df.permlevel, "write", this.doc) || - this.df.read_only - ) { - return; + if (!this.draw_control) { + this.draw_control = this.get_leaflet_controls(); + } + if (this.disp_status == "Write") { + this.draw_control.addTo(this.map); + } else { + this.draw_control.remove(); } - - this.draw_control = this.get_leaflet_controls(); - this.map.addControl(this.draw_control); } get_leaflet_controls() { @@ -205,6 +215,7 @@ frappe.ui.form.ControlGeolocation = class ControlGeolocation extends frappe.ui.f } bind_leaflet_event_listeners() { + this.bound_event_listeners = true; this.map.on("draw:created", (e) => { var type = e.layerType, layer = e.layer;