Projet

Général

Profil

0001-maps-factor-all-geojson-layer-tracking-into-a-single.patch

Frédéric Péters, 12 mai 2020 15:45

Télécharger (6,95 ko)

Voir les différences:

Subject: [PATCH 1/3] maps: factor all geojson layer tracking into a single
 object (#42761)

 combo/apps/maps/static/js/combo.map.js       | 92 +++++++++++---------
 combo/apps/maps/templates/maps/map_cell.html |  6 +-
 2 files changed, 56 insertions(+), 42 deletions(-)
combo/apps/maps/static/js/combo.map.js
1 1
$(function() {
2 2
    L.Map.include(
3 3
      {
4
        add_geojson_layer: function(callback, geojson_data) {
4
        init_geojson_layers: function(layers) {
5
           if (Array.isArray(layers)) { // backward compatibility
6
             this.geojson_layers = Object();
7
             for (var i=0; i<layers.length; i++) {
8
               this.geojson_layers[layers[i].slug] = Object();
9
               this.geojson_layers[layers[i].slug].url = layers[i].url;
10
             }
11
           } else {
12
             this.geojson_layers = layers;
13
           }
14
        },
15

  
16
        load_geojson_layers: function(callback) {
17
          var layer_slugs = Object.keys(this.geojson_layers);
18
          for (var i=0; i<layer_slugs.length; i++) {
19
            var layer = this.geojson_layers[layer_slugs[i]];
20
            layer.status = 'loading';
21
            this.add_geojson_layer(callback, layer);
22
          }
23
        },
24

  
25
        add_geojson_layer: function(callback, geojson_layer) {
5 26
          var map = this;
6 27
          var $map_widget = $(map.getContainer());
7 28
          var cell = $map_widget.parents('div.cell')[0];
8
          var geojson_url = geojson_data.url;
29
          var geojson_url = geojson_layer.url;
9 30

  
10 31
          $.getJSON(geojson_url).done(
11 32
            function(data) {
......
59 80
                      return L.marker(latlng, {icon: marker});
60 81
                  }
61 82
              });
83

  
84
              // track global marker bounds
85
              var bounds = geo_json.getBounds();
86
              if (bounds.isValid()) {
87
                if (!map.bounds) {
88
                  map.bounds = L.latLngBounds(bounds);
89
                } else {
90
                  map.bounds.extend(bounds);
91
                }
92
              }
93

  
62 94
              if ($map_widget.data('group-markers')) {
63
                  if (map.geojson_layers[geojson_data.slug]) {
64
                      map.clustered_markers.removeLayer(map.geojson_layers[geojson_data.slug]);
95
                  if (geojson_layer.leaflet_layer) {
96
                      map.clustered_markers.removeLayer(geojson_layer.leaflet_layer);
65 97
                  }
66 98
                  map.clustered_markers.addLayer(geo_json);
67 99
              } else {
68
                  if (map.geojson_layers[geojson_data.slug]) {
69
                      map.geojson_layers[geojson_data.slug].remove();
100
                  if (geojson_layer.leaflet_layer) {
101
                      geojson_layer.leaflet_layer.remove();
70 102
                  }
71 103
                  geo_json.addTo(map);
72 104
              }
73
              map.geojson_layers[geojson_data.slug] = geo_json;
105
              geojson_layer.leaflet_layer = geo_json;
74 106
              if (callback) {
75 107
                  callback(geo_json);
76 108
              }
77
              geojson_data.status = 'loaded';
109
              geojson_layer.status = 'loaded';
78 110
          }).fail(function(jqxhr, textStatus, error) {
79
              geojson_data.status = 'error';
111
              geojson_layer.status = 'error';
80 112
          }).always(function() {
81 113
              map.trigger_markers_if_ready();
82 114
          });
83 115
        },
116

  
84 117
        trigger_markers_if_ready: function() {
85 118
          var map = this;
86 119
          var $map_widget = $(map.getContainer());
87
          var map_id = $map_widget.data('cell-id');
88 120
          var cell = $map_widget.parents('div.cell')[0];
89
          var geojson_layers = window['geojson_'+map_id];
121
          var layer_slugs = Object.keys(this.geojson_layers);
90 122
          var loading = 0;
91
          for (var i=0; i<geojson_layers.length; i++) {
92
            if (geojson_layers[i].status == 'loading') loading++;
123
          for (var i=0; i<layer_slugs.length; i++) {
124
            var layer = this.geojson_layers[layer_slugs[i]];
125
            if (layer.status == 'loading') loading++;
93 126
          }
94 127
          if (loading == 0) {
95 128
            $(cell).trigger('combo:map-markers-ready');
......
153 186
            });
154 187
            map.addLayer(map.clustered_markers);
155 188
        }
156
        map.geojson_layers = Object();
157 189
        if ($map_widget.data('draggable') === false) {
158 190
          map.dragging.disable();
159 191
        }
......
209 241
            ).addTo(map);
210 242
        });
211 243
        map.bounds = null;
212
        map.geojson_layers_loaded = 0;
213
        var geojson_layers = window['geojson_'+map_id];
214
        if (geojson_layers.length) {
215
            $.each(geojson_layers, function(idx, geojson_data) {
216
                geojson_data.status = 'loading';
217
                map.add_geojson_layer(function(geo_json) {
218
                    var bounds = geo_json.getBounds();
219
                    if (bounds.isValid()) {
220
                        if (!map.bounds) {
221
                            map.bounds = L.latLngBounds(bounds);
222
                        } else {
223
                            map.bounds.extend(bounds);
224
                        }
225
                        if (init_state == 'fit-markers') {
226
                            map.fitBounds(map.bounds);
227
                        }
228
                    }
229
                }, geojson_data);
230
                map.geojson_layers_loaded += 1;
231
                if (map.geojson_layers_loaded == geojson_layers.length) {
232
                    $(cell).trigger('combo:map-ready');
233
                }
234
            });
235
        } else {
236
            $(cell).trigger('combo:map-ready');
244
        map.init_geojson_layers(window['geojson_'+map_id]);
245
        if (init_state == 'fit-markers') {
246
          $(cell).on('combo:map-markers-ready', function() {
247
            map.fitBounds(map.bounds);
248
          });
237 249
        }
250
        map.load_geojson_layers()
251
        $(cell).trigger('combo:map-ready');
238 252
    };
239 253
    $('div.cell.map').each(function() {
240 254
        render_map(this);
combo/apps/maps/templates/maps/map_cell.html
30 30
      opacity: {{ layer.opacity|as_json|safe }}
31 31
    });
32 32
  {% endfor %}
33
  var geojson_{{ cell.pk }} = [];
33
  var geojson_{{ cell.pk }} = Object();
34 34
  {% for layer in geojson_layers %}
35
  geojson_{{ cell.pk }}.push({
35
  geojson_{{ cell.pk }}["{{ layer.slug }}"] = {
36 36
    url: '{{ layer.url }}',
37 37
    slug: '{{ layer.slug }}'
38
  });
38
  };
39 39
  {% endfor %}
40 40
</script>
41 41
</div>
42
-