Skip to content

Commit fecceb0

Browse files
author
Gaël UTARD
committed
Plug tile view on mapentity views
1 parent 5386414 commit fecceb0

File tree

12 files changed

+59
-103
lines changed

12 files changed

+59
-103
lines changed

geotrek/common/templates/common/leaflet_test.html

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
<div id="map" style="height: 800px; width: 100%;">
1212
</div>
1313
<script type="text/javascript" src="//unpkg.com/[email protected]/dist/leaflet.js"></script>
14-
<script type="text/javascript" src="{% static 'common/js/leaflet.geojson.grid.js' %}"></script>
14+
<script type="text/javascript" src="{% static 'mapentity/leaflet.geojson.grid.js' %}"></script>
1515
<script type="text/javascript">
1616
document.addEventListener("DOMContentLoaded", function() {
1717
// create map

geotrek/core/static/core/main.js

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
MapEntity.pathsLayer = function buildPathLayer(options) {
1+
MapEntity.pathsLayer = function buildPathLayer(url, options) {
22
var options = options || {};
33
options.style = L.Util.extend(options.style || {}, window.SETTINGS.map.styles.path);
44

5-
var pathsLayer = new L.ObjectsLayer(null, options);
5+
var pathsLayer = new L.ObjectsLayer(url, options);
66

77
// Show paths extremities
88
if (window.SETTINGS.showExtremities) {
@@ -22,20 +22,19 @@ $(window).on('entity:map', function (e, data) {
2222

2323
if (!is_form_view && (data.viewname == 'detail' || data.modelname != 'path')) {
2424

25-
var pathsLayer = MapEntity.pathsLayer({
26-
indexing: false,
27-
style: { clickable: false },
28-
modelname: 'path',
29-
no_draft: data.modelname != 'path',
30-
});
3125
if (data.viewname == 'detail'){
32-
pathsLayer.load(window.SETTINGS.urls.path_layer);
26+
var pathsLayer = MapEntity.pathsLayer(window.SETTINGS.urls.tile.replace(new RegExp('modelname', 'g'), 'path'), {
27+
indexing: false,
28+
style: { clickable: false },
29+
modelname: 'path',
30+
no_draft: data.modelname != 'path',
31+
});
3332
pathsLayer.addTo(map);
33+
pathsLayer.on('loaded', function () {
34+
if (pathsLayer._map)
35+
pathsLayer.bringToBack();
36+
});
3437
};
35-
pathsLayer.on('loaded', function () {
36-
if (pathsLayer._map)
37-
pathsLayer.bringToBack();
38-
});
3938

4039
map.on('layeradd', function (e) {
4140
// Start ajax loading at last

geotrek/core/templates/core/core_extrabody_fragment.html

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@
22
<script type="text/javascript">
33
MapEntity.i18n['Paths'] = "{% trans "Paths" %}";
44

5-
window.SETTINGS.urls['path_layer'] = "{% url "core:path_layer" %}";
65
window.SETTINGS.urls['path_graph'] = "{% url "core:path_json_graph" %}";
76
</script>
87
<script type="text/javascript" src="{% static "core/main.js" %}"></script>

geotrek/maintenance/templates/maintenance/project_detail.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -121,9 +121,9 @@
121121
if (geojson.properties.name) layer.bindTooltip(geojson.properties.name);
122122
}
123123

124-
function interventionUrl(properties, layer) {
124+
function interventionUrl(id) {
125125
return window.SETTINGS.urls.detail.replace(new RegExp('modelname', 'g'), 'intervention')
126-
.replace('0', properties.pk);
126+
.replace('0', id);
127127
};
128128
});
129129
</script>

geotrek/trekking/views.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
from django.views.generic import CreateView, ListView, DetailView
1212
from django.views.generic.detail import BaseDetailView
1313
from mapentity.helpers import alphabet_enumeration
14-
from mapentity.views import (MapEntityLayer, MapEntityList, MapEntityJsonList,
14+
from mapentity.views import (MapEntityLayer, MapEntityTileLayer, MapEntityList, MapEntityJsonList,
1515
MapEntityFormat, MapEntityDetail, MapEntityMapImage,
1616
MapEntityDocument, MapEntityCreate, MapEntityUpdate,
1717
MapEntityDelete, LastModifiedMixin, MapEntityViewSet)
@@ -58,6 +58,10 @@ class TrekLayer(MapEntityLayer):
5858
geometry_field_db = 'geom'
5959

6060

61+
class TrekTileLayer(MapEntityTileLayer):
62+
queryset = Trek.objects.existing()
63+
64+
6165
class TrekList(FlattenPicturesMixin, MapEntityList):
6266
filterform = TrekFilterSet
6367
columns = ['id', 'name', 'duration', 'difficulty', 'departure', 'thumbnail']

mapentity/registry.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ def scan_views(self):
7171
for name, view in inspect.getmembers(views_module):
7272
if inspect.isclass(view) and issubclass(view, View):
7373
# Pick-up views
74-
if hasattr(view, 'get_entity_kind') or issubclass(view, mapentity_views.MapEntityViewSet):
74+
if hasattr(view, 'get_entity_kind') or issubclass(view, mapentity_views.MapEntityViewSet) or issubclass(view, mapentity_views.MapEntityTileLayer):
7575
try:
7676
view_model = view.model or view.queryset.model
7777
except AttributeError:
@@ -128,14 +128,15 @@ class dynamic_viewset(mapentity_views.MapEntityViewSet):
128128

129129
# Dynamically define tile view
130130
if tile_view is None:
131-
_queryset = self.get_queryset()
132-
_serializer = self.get_tile_serializer()
133-
134131
class dynamic_tile_view(mapentity_views.MapEntityTileLayer):
135-
queryset = _queryset
136-
serializer_class = _serializer
132+
pass
137133
tile_view = dynamic_tile_view
138134

135+
if not tile_view.queryset:
136+
tile_view.queryset = self.get_queryset()
137+
if not tile_view.serializer_class:
138+
tile_view.serializer_class = self.get_tile_serializer()
139+
139140
picked.append(tile_view)
140141

141142
# Returns Django URL patterns

mapentity/settings.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,9 @@
122122
'css': 'mapentity/Leaflet.groupedlayercontrol/src/leaflet.groupedlayercontrol.css',
123123
'js': 'mapentity/Leaflet.groupedlayercontrol/src/leaflet.groupedlayercontrol.js'
124124
}),
125+
('leaflet.geojson.grid', {
126+
'js': 'mapentity/leaflet.geojson.grid.js',
127+
}),
125128
('mapentity', {
126129
'js': ['mapentity/mapentity.js',
127130
'mapentity/mapentity.forms.js'],

mapentity/static/mapentity/leaflet-objectslayer.js

Lines changed: 9 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
L.ObjectsLayer = L.GeoJSON.extend({
1+
L.ObjectsLayer = L.GeoJSONTileLayer.extend({
22
options: {
33
indexing: true,
44
highlight: true,
@@ -12,7 +12,7 @@ L.ObjectsLayer = L.GeoJSON.extend({
1212

1313
includes: L.Mixin.Events,
1414

15-
initialize: function (geojson, options) {
15+
initialize: function (url, options) {
1616
// Pointers to all layers by pk - immutable
1717
this._objects = {};
1818
// Hold the currently visible layers (subset of _objects)
@@ -44,14 +44,15 @@ L.ObjectsLayer = L.GeoJSON.extend({
4444
this.options.styles = L.Util.extend({}, this.options.styles);
4545
this.options.styles['default'] = L.Util.extend({}, this.options.style);
4646

47+
L.GeoJSONTileLayer.prototype.initialize.call(this, url, this.options);
4748

4849
// Highlight on mouse over, using global events
4950
if (this.options.highlight) {
50-
this.on('mouseover', function(e) {
51+
this.layer.on('mouseover', function(e) {
5152
var pk = this.getPk(e.layer);
5253
$(window).trigger('entity:mouseover', {pk: pk, modelname: options.modelname});
5354
}, this);
54-
this.on('mouseout', function(e) {
55+
this.layer.on('mouseout', function(e) {
5556
var pk = this.getPk(e.layer);
5657
$(window).trigger('entity:mouseout', {pk: pk, modelname: options.modelname});
5758
}, this);
@@ -69,29 +70,12 @@ L.ObjectsLayer = L.GeoJSON.extend({
6970
}
7071
}, this));
7172

72-
7373
// Optionnaly make them clickable
7474
if (this.options.objectUrl) {
75-
this.on('click', function(e) {
76-
window.location = this.options.objectUrl(e.layer.properties, e.layer);
75+
this.layer.on('click', function(e) {
76+
window.location = this.options.objectUrl(e.layer.feature.id);
7777
}, this);
7878
}
79-
80-
var dataurl = null;
81-
if (typeof(geojson) == 'string') {
82-
dataurl = geojson;
83-
geojson = null;
84-
}
85-
L.GeoJSON.prototype.initialize.call(this, geojson, this.options);
86-
87-
// Fire Leaflet.Spin events
88-
this.on('loaded loading', function (e) {
89-
this.fire('data:' + e.type);
90-
}, this);
91-
92-
if (dataurl) {
93-
this.load(dataurl);
94-
}
9579
},
9680

9781
_mapObjects: function (geojson, layer) {
@@ -109,29 +93,6 @@ L.ObjectsLayer = L.GeoJSON.extend({
10993
}
11094
},
11195

112-
load: function (url) {
113-
console.log("load", url)
114-
var jsonLoad = function (data) {
115-
var features = jQuery.grep(data.features, function(obj, i) {
116-
return obj.geometry !== null;
117-
});
118-
data.features = features;
119-
this.addData(data);
120-
this.loading = false;
121-
this.fire('loaded');
122-
};
123-
var jsonError = function () {
124-
this.loading = false;
125-
this.fire('loaded');
126-
console.error("Could not load url '" + url + "'");
127-
if (this._map) $(this._map._container).addClass('map-error');
128-
};
129-
this.loading = true;
130-
this.fire('loading');
131-
$.getJSON(url, L.Util.bind(jsonLoad, this))
132-
.error(L.Util.bind(jsonError, this));
133-
},
134-
13596
getLayer: function (pk) {
13697
return this._objects[pk];
13798
},
@@ -149,32 +110,7 @@ L.ObjectsLayer = L.GeoJSON.extend({
149110

150111
// Show all layers matching the pks
151112
updateFromPks: function(pks) {
152-
var self = this,
153-
new_objects = {},
154-
already_added_layer,
155-
to_add_layer;
156-
157-
// Gather all layer to see in new objects
158-
// Remove them from _current_objects if they are already shown
159-
// This way _current_objects will only contain layer to be removed
160-
$.each(pks, function(idx, to_add_pk) {
161-
already_added_layer = self._current_objects[to_add_pk];
162-
if (already_added_layer) {
163-
new_objects[to_add_pk] = already_added_layer;
164-
delete self._current_objects[to_add_pk];
165-
} else {
166-
to_add_layer = new_objects[to_add_pk] = self._objects[to_add_pk];
167-
// list can be ready before map, on first load
168-
if (to_add_layer) self.addLayer(to_add_layer);
169-
}
170-
});
171-
172-
// Remove all remaining layers
173-
$.each(self._current_objects, function(pk, layer) {
174-
self.removeLayer(layer);
175-
});
176-
177-
self._current_objects = new_objects;
113+
console.log("Should filter map features again");
178114
},
179115

180116
getCurrentLayers: function () {
@@ -202,7 +138,7 @@ L.ObjectsLayer = L.GeoJSON.extend({
202138
this.fire('highlight', {layer: layer});
203139
}
204140
else {
205-
this.resetStyle(layer);
141+
this.layer.resetStyle(layer);
206142
}
207143
},
208144

geotrek/common/static/common/js/leaflet.geojson.grid.js renamed to mapentity/static/mapentity/leaflet.geojson.grid.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,15 @@
99
layer: null,
1010
features: null,
1111
cache: null,
12+
ajaxCount: 0,
1213

1314
//
1415
// Leaflet layer methods
1516
//
1617
initialize(url, options) {
1718
this.url = url;
1819
this.layer = new L.GeoJSON(null, options);
20+
this.layer.loading = true;
1921
this.features = {};
2022
this.cache = {};
2123
L.GridLayer.prototype.initialize.call(this, options);
@@ -92,9 +94,20 @@
9294
},
9395

9496
_ajaxRequest: function(method, url, data, callback) {
97+
var tilelayer = this;
98+
if (tilelayer.ajaxCount++ === 0) {
99+
// For Leaflet.Spin
100+
tilelayer.layer.loading = true;
101+
tilelayer.layer.fire('data:loading');
102+
}
95103
var request = new XMLHttpRequest();
96104
request.open(method, url, true);
97105
request.onreadystatechange = function() {
106+
if (request.readyState === 4 && --tilelayer.ajaxCount === 0) {
107+
// For Leaflet.Spin
108+
tilelayer.layer.loading = false;
109+
tilelayer.layer.fire('data:loaded');
110+
}
98111
if (request.readyState === 4 && request.status === 200) {
99112
callback(JSON.parse(request.responseText));
100113
}

mapentity/static/mapentity/mapentity.map.js

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -187,7 +187,7 @@ $(window).on('entity:map:detail', function (e, data) {
187187
}
188188

189189
// Add layers
190-
var objectLayer = new L.ObjectsLayer(geojson, {
190+
var objectLayer = new L.GeoJSON(geojson, {
191191
style: DETAIL_STYLE,
192192
indexing: false,
193193
modelname: data.modelname
@@ -230,17 +230,17 @@ $(window).on('entity:map:list', function (e, data) {
230230
* Objects Layer
231231
* .......................
232232
*/
233-
function getUrl(properties, layer) {
233+
function getUrl(id) {
234234
return window.SETTINGS.urls.detail.replace(new RegExp('modelname', 'g'), data.modelname)
235-
.replace('0', properties.pk);
235+
.replace('0', id);
236236
}
237237
if (typeof window.SETTINGS.map.styles.others === "function"){
238238
var style = window.SETTINGS.map.styles.others;
239239
}
240240
else{
241241
var style = L.Util.extend({}, window.SETTINGS.map.styles.others);
242242
}
243-
var objectsLayer = new L.ObjectsLayer(null, {
243+
var objectsLayer = new L.ObjectsLayer(window.SETTINGS.urls.tile.replace(new RegExp('modelname', 'g'), data.modelname), {
244244
objectUrl: getUrl,
245245
style: style,
246246
modelname: data.modelname,
@@ -252,7 +252,6 @@ $(window).on('entity:map:list', function (e, data) {
252252
if (e.layer._map !== null) e.layer.bringToFront();
253253
});
254254
map.addLayer(objectsLayer);
255-
objectsLayer.load(window.SETTINGS.urls.layer.replace(new RegExp('modelname', 'g'), data.modelname));
256255

257256
var nameHTML = '<span style="color: '+ style['color'] + ';">&#x25A3;</span>&nbsp;' + data.objectsname;
258257
map.layerscontrol.addOverlay(objectsLayer, nameHTML, tr("Objects"));

0 commit comments

Comments
 (0)