]> git.openstreetmap.org Git - rails.git/commitdiff
Map Data asynchronous checkbox
authornertc <davidtsiklauri7@gmail.com>
Wed, 12 Mar 2025 08:39:13 +0000 (12:39 +0400)
committernertc <davidtsiklauri7@gmail.com>
Wed, 12 Mar 2025 08:46:19 +0000 (12:46 +0400)
app/assets/javascripts/index/layers/data.js
app/assets/javascripts/leaflet.layers.js
app/assets/javascripts/leaflet.map.js
vendor/assets/leaflet/leaflet.osm.js

index 8925cc48001341a2bfd44adf2dc248d513f11010..c0fffd72d061dd140d809f6c6d1daf3a92380493 100644 (file)
@@ -89,6 +89,15 @@ OSM.initializeDataLayer = function (map) {
 
     if (dataLoader) dataLoader.abort();
 
 
     if (dataLoader) dataLoader.abort();
 
+    $("#layers-data-loading").remove();
+
+    const spanLoading = $("<span>")
+      .attr("id", "layers-data-loading")
+      .attr("class", "spinner-border spinner-border-sm ms-1")
+      .attr("role", "status")
+      .html("<span class='visually-hidden'>" + I18n.t("browse.start_rjs.loading") + "</span>")
+      .appendTo($("#label-layers-data"));
+
     dataLoader = new AbortController();
     fetch(url, { signal: dataLoader.signal })
       .then(response => {
     dataLoader = new AbortController();
     fetch(url, { signal: dataLoader.signal })
       .then(response => {
@@ -131,7 +140,10 @@ OSM.initializeDataLayer = function (map) {
           $("#browse_status").empty();
         });
       })
           $("#browse_status").empty();
         });
       })
-      .finally(() => dataLoader = null);
+      .finally(() => {
+        dataLoader = null;
+        spanLoading.remove();
+      });
   }
 
   function onSelect(layer) {
   }
 
   function onSelect(layer) {
index f7142ead157b0ba64b8cc19583531ada1f39520e..57d3fc6c03c18442ac916be61efc3c0e9935832f 100644 (file)
@@ -100,6 +100,7 @@ L.OSM.layers = function (options) {
 
         const label = $("<label>")
           .attr("class", "form-check-label")
 
         const label = $("<label>")
           .attr("class", "form-check-label")
+          .attr("id", `label-layers-${name}`)
           .appendTo(item);
 
         let checked = map.hasLayer(layer);
           .appendTo(item);
 
         let checked = map.hasLayer(layer);
@@ -114,10 +115,15 @@ L.OSM.layers = function (options) {
 
         input.on("change", function () {
           checked = input.is(":checked");
 
         input.on("change", function () {
           checked = input.is(":checked");
+          if (layer.cancelLoading) {
+            layer.cancelLoading();
+          }
+
           if (checked) {
             map.addLayer(layer);
           } else {
             map.removeLayer(layer);
           if (checked) {
             map.addLayer(layer);
           } else {
             map.removeLayer(layer);
+            $(`#layers-${name}-loading`).remove();
           }
         });
 
           }
         });
 
index 6adf2138d79c65c3826a10bce5b82a9617e0e3eb..abeb4d3e426d896526b914f665e5a04e506ec6a4 100644 (file)
@@ -47,7 +47,7 @@ L.OSM.Map = L.Map.extend({
     this.noteLayer = new L.FeatureGroup();
     this.noteLayer.options = { code: "N" };
 
     this.noteLayer = new L.FeatureGroup();
     this.noteLayer.options = { code: "N" };
 
-    this.dataLayer = new L.OSM.DataLayer(null);
+    this.dataLayer = new L.OSM.DataLayer(null, { asynchronous: true });
     this.dataLayer.options.code = "D";
 
     this.gpsLayer = new L.OSM.GPS({
     this.dataLayer.options.code = "D";
 
     this.gpsLayer = new L.OSM.GPS({
@@ -306,7 +306,8 @@ L.OSM.Map = L.Map.extend({
               way: objectStyle,
               area: objectStyle,
               changeset: changesetStyle
               way: objectStyle,
               area: objectStyle,
               changeset: changesetStyle
-            }
+            },
+            asynchronous: true
           });
 
           map._objectLayer.interestingNode = function (node, wayNodes, relationNodes) {
           });
 
           map._objectLayer.interestingNode = function (node, wayNodes, relationNodes) {
index 53d18bf2cecc83cf82506335528ff91227eb7f38..83cc3e2d6c778c15fd1ca02e10034348c41c99f2 100644 (file)
@@ -104,6 +104,13 @@ L.OSM.DataLayer = L.FeatureGroup.extend({
     }
   },
 
     }
   },
 
+  loadingLayers: [],
+
+  cancelLoading: function () {
+    this.loadingLayers.forEach(layer => clearTimeout(layer));
+    this.loadingLayers = [];
+  },
+
   addData: function (features) {
     if (!(features instanceof Array)) {
       features = this.buildFeatures(features);
   addData: function (features) {
     if (!(features instanceof Array)) {
       features = this.buildFeatures(features);
@@ -220,9 +227,11 @@ L.OSM.DataLayer = L.FeatureGroup.extend({
   eachLayer: function (method, context, asynchronous = false) {
     for (let i in this._layers) {
       if (asynchronous) {
   eachLayer: function (method, context, asynchronous = false) {
     for (let i in this._layers) {
       if (asynchronous) {
-        setTimeout(() => {
-          method.call(context, this._layers[i]);
-        });
+        this.loadingLayers.push(
+          setTimeout(() => {
+            method.call(context, this._layers[i]);
+          })
+        );
       } else {
         method.call(context, this._layers[i]);
       }
       } else {
         method.call(context, this._layers[i]);
       }