Projet

Général

Profil

0001-maps-display-marker-data-in-popup-21034.patch

Josué Kouka, 15 février 2018 10:49

Télécharger (6,01 ko)

Voir les différences:

Subject: [PATCH] maps: display marker data in popup (#21034)

 .../maps/migrations/0005_auto_20180214_1544.py     | 19 +++++++++++++++++++
 combo/apps/maps/models.py                          | 10 +++++++++-
 combo/apps/maps/static/js/combo.map.js             | 22 ++++++++++++++++++++++
 combo/apps/maps/templates/maps/map_cell.html       |  1 +
 4 files changed, 51 insertions(+), 1 deletion(-)
 create mode 100644 combo/apps/maps/migrations/0005_auto_20180214_1544.py
combo/apps/maps/migrations/0005_auto_20180214_1544.py
1
# -*- coding: utf-8 -*-
2
from __future__ import unicode_literals
3

  
4
from django.db import migrations, models
5

  
6

  
7
class Migration(migrations.Migration):
8

  
9
    dependencies = [
10
        ('maps', '0004_map_initial_state'),
11
    ]
12

  
13
    operations = [
14
        migrations.AddField(
15
            model_name='map',
16
            name='marker_onclick_behaviour',
17
            field=models.CharField(default=b'none', max_length=32, verbose_name='Marker behaviour on clik', choices=[(b'none', 'Nothing'), (b'display_data', 'Display data in popup')]),
18
        ),
19
    ]
combo/apps/maps/models.py
67 67
    ('wheelchair', _('Wheelchair')),
68 68
]
69 69

  
70
MARKER_ONCLIK_BEHAVIOUR = [
71
    ('none', _('Nothing')),
72
    ('display_data', _('Display data in popup')),
73
]
74

  
70 75
ZOOM_LEVELS = [ ('0', _('Whole world')),
71 76
                ('9', _('Wide area')),
72 77
                ('11', _('Area')),
......
200 205
                                   choices=ZOOM_LEVELS, default='0')
201 206
    max_zoom = models.CharField(_('Maximal zoom level'), max_length=2,
202 207
                                choices=ZOOM_LEVELS, default=19)
208
    marker_onclick_behaviour = models.CharField(_('Marker behaviour on clik'), max_length=32,
209
                                                default='none', choices=MARKER_ONCLIK_BEHAVIOUR)
203 210
    layers = models.ManyToManyField(MapLayer, verbose_name=_('Layers'), blank=True)
204 211

  
205 212
    template_name = 'maps/map_cell.html'
......
216 223

  
217 224
    def get_default_form_class(self):
218 225
        fields = ('title', 'initial_state', 'initial_zoom', 'min_zoom',
219
                  'max_zoom', 'layers')
226
                  'max_zoom', 'marker_onclick_behaviour', 'layers')
220 227
        widgets = {'layers': forms.widgets.CheckboxSelectMultiple}
221 228
        return forms.models.modelform_factory(self.__class__, fields=fields,
222 229
                                             widgets=widgets)
......
245 252
        ctx['tile_urltemplate'] = settings.COMBO_MAP_TILE_URLTEMPLATE
246 253
        ctx['map_attribution'] = settings.COMBO_MAP_ATTRIBUTION
247 254
        ctx['max_bounds'] = settings.COMBO_MAP_MAX_BOUNDS
255
        ctx['marker_onclick_behaviour'] = self.marker_onclick_behaviour
248 256
        return ctx
combo/apps/maps/static/js/combo.map.js
12 12
              var geo_json = L.geoJson(data, {
13 13
                  onEachFeature: function(feature, layer) {
14 14
                      $(cell).trigger('combo:map-feature-prepare', {'feature': feature, 'layer': layer});
15
                      var marker_onclick_behaviour = $map_widget.data('marker-onclick-behaviour');
16
                      if (marker_onclick_behaviour === 'display_data'){
17
                            var popup = '';
18
                            if (feature.properties.display_fields) {
19
                                $.each(feature.properties.display_fields, function(key, value) {
20
                                    popup += '<p class="popup-field"><span class="field-value">' + value[1] + '</span>';
21
                                });
22
                            } else {
23
                                // sort object properties
24
                                let properties = Object.keys(feature.properties).sort().reduce(function(new_prop, key){
25
                                    new_prop[key] = feature.properties[key];
26
                                    return new_prop;
27
                                }, {});
28
                                $.each(properties, function(key, value){
29
                                    // exclude object type properties
30
                                    if (typeof(value) !== 'object'){
31
                                        popup += '<p class="popup-field"><span class="field-value">' + value + '</span>' + '</p>';
32
                                    }
33
                                });
34
                            }
35
                            layer.bindPopup(popup);
36
                      }
15 37
                  },
16 38
                  pointToLayer: function (feature, latlng) {
17 39
                      var markerStyles = "background-color: " + feature.properties.layer.colour + ";";
combo/apps/maps/templates/maps/map_cell.html
6 6
        data-max-zoom="{{ max_zoom }}" data-init-lat="{{ init_lat }}"
7 7
        data-init-lng="{{ init_lng }}" data-geojson-url="{{ geojson_url }}"
8 8
        data-tile-urltemplate="{{ tile_urltemplate}}" data-map-attribution="{{ map_attribution}}"
9
        data-marker-onclick-behaviour="{{ cell.marker_onclick_behaviour }}"
9 10
        {% if max_bounds.corner1.lat %}
10 11
        data-max-bounds-lat1="{{ max_bounds.corner1.lat }}"
11 12
        data-max-bounds-lng1="{{ max_bounds.corner1.lng }}"
12
-