Projet

Général

Profil

0002-geolocation-add-support-for-multiple-address-autocom.patch

Serghei Mihai, 04 novembre 2021 10:41

Télécharger (7,23 ko)

Voir les différences:

Subject: [PATCH 2/2] geolocation: add support for multiple address
 autocompletion widgets (#57792)

 wcs/qommon/static/js/qommon.geolocation.js    | 112 ++++++++++--------
 .../forms/widgets/select_jsonp--address.html  |   2 +-
 2 files changed, 66 insertions(+), 48 deletions(-)
wcs/qommon/static/js/qommon.geolocation.js
1
$(function() {
2
function geoloc_prefill(element_type, element_value)
1
function geoloc_prefill(element_type, element_value, widget_name=null)
3 2
{
4
  $('div[data-geolocation="' + element_type +'"] input').val(element_value);
5
  $('div[data-geolocation="' + element_type +'"] textarea').val(element_value);
6
  var $options = $('div[data-geolocation="' + element_type +'"] option');
3
  var selector = 'div[data-geolocation="' + element_type +'"]:first';
4
  if (widget_name) {
5
    selector = 'div[data-widget-name="' + widget_name + '"] ~ ' + selector;
6
  }
7
  $(selector).find('input').val(element_value);
8
  $(selector).find('textarea').val(element_value);
9
  var $options = $(selector).find('option');
7 10
  if ($options.length == 0) return;
8 11

  
9 12
  var slugified_value = $.slugify(element_value);
......
24 27
  }
25 28
}
26 29

  
30
function init_sync_from_template_address() {
31
  const widget_selector = '.JsonpSingleSelectWidget.template-address';
32
  $(widget_selector + ' select').on('change', function() {
33
    var data = $(this).select2('data');
34
    var widget_name = $(this).parents('div.widget').data('widget-name');
35
    if (data) {
36
      var number_and_street = null;
37
      var address = undefined;
38
      if (typeof data[0].address == "object") {
39
        address = data[0].address;
40
      } else {
41
        address = data[0];
42
      }
43
      var road = address.road || address.nom_rue;
44
      var house_number = address.house_number || address.numero;
45
      var city = address.city || address.nom_commune;
46
      var postcode = address.postcode || address.code_postal;
47
      if (house_number && road) {
48
        number_and_street = house_number + ' ' + road;
49
      } else {
50
        number_and_street = road;
51
      }
52
      geoloc_prefill('number-and-street', number_and_street, widget_name);
53
      geoloc_prefill('house', house_number, widget_name);
54
      geoloc_prefill('road', road, widget_name);
55
      geoloc_prefill('city', city, widget_name);
56
      geoloc_prefill('postcode', postcode, widget_name);
57
      geoloc_prefill('country', address.country, widget_name);
58
    }
59
  });
60

  
61
  $('input.wcs-manual-address').on('change', function() {
62
    var widget = $(this).parents('div.widget');
63
    widget.nextUntil(widget_selector, 'div[data-geolocation]').find('input').attr('readonly', this.checked ? null : 'readonly');
64
    widget.nextUntil(widget_selector, 'div[data-geolocation]').find('textarea').attr('readonly', this.checked ? null : 'readonly');
65
    if (this.checked) {
66
      widget.nextUntil(widget_selector, 'div[data-geolocation]:not(.template-address)').attr('hidden', null)
67
    } else if ($(widget_selector + '.hide-address-parts').length) {
68
      widget.nextUntil(widget_selector, 'div[data-geolocation]:not(.template-address)').attr('hidden', 'hidden')
69
    }
70
  });
71

  
72
  if ($(widget_selector).length) {
73
    $('div[data-geolocation] input, div[data-geolocation] textarea').attr('readonly', 'readonly')
74
    if ($(widget_selector + '.hide-address-parts').length) {
75
      $('div[data-geolocation]:not(.template-address)').attr('hidden', 'hidden')
76
    }
77
  }
78
}
79

  
80

  
81
$(function() {
82
  init_sync_from_template_address();
83
  $('form').on('wcs:block-row-added', function() {
84
    init_sync_from_template_address();
85
  });
27 86
  $(document).on('set-geolocation', function(event, coords, options) {
28 87
    $.getJSON(WCS_ROOT_URL + '/api/reverse-geocoding?lat=' + coords.lat + '&lon=' + coords.lng, function(data) {
29 88
      unset_sync_callback()
......
67 126
      set_sync_callback()
68 127
    });
69 128
  });
70
  $('.JsonpSingleSelectWidget.template-address select').on('change', function() {
71
    var data = $('.JsonpSingleSelectWidget.template-address select').select2('data');
72
    if (data) {
73
      var number_and_street = null;
74
      var address = undefined;
75
      if (typeof data[0].address == "object") {
76
        address = data[0].address;
77
      } else {
78
        address = data[0];
79
      }
80
      var road = address.road || address.nom_rue;
81
      var house_number = address.house_number || address.numero;
82
      var city = address.city || address.nom_commune;
83
      var postcode = address.postcode || address.code_postal;
84
      if (house_number && road) {
85
        number_and_street = house_number + ' ' + road;
86
      } else {
87
        number_and_street = road;
88
      }
89
      geoloc_prefill('number-and-street', number_and_street);
90
      geoloc_prefill('house', house_number);
91
      geoloc_prefill('road', road);
92
      geoloc_prefill('city', city);
93
      geoloc_prefill('postcode', postcode);
94
      geoloc_prefill('country', address.country);
95
    }
96
  });
129

  
97 130
  if ($('.qommon-map').length == 0 && $('.JsonpSingleSelectWidget.template-address').length == 0) {
98 131
    /* if there's no map on the page, we do the geolocation without leaflet. */
99 132
    if (navigator.geolocation) {
......
113 146
      );
114 147
    }
115 148
  }
116
  if ($('.JsonpSingleSelectWidget.template-address').length) {
117
    $('div[data-geolocation] input, div[data-geolocation] textarea').attr('readonly', 'readonly')
118
    if ($('.JsonpSingleSelectWidget.template-address.hide-address-parts').length) {
119
      $('div[data-geolocation]:not(.template-address)').attr('hidden', 'hidden')
120
    }
121
  }
122

  
123
  $('#wcs-manual-address').on('change', function() {
124
    $('div[data-geolocation] input, div[data-geolocation] textarea').attr('readonly', this.checked ? null : 'readonly');
125
    if (this.checked) {
126
      $('div[data-geolocation]:not(.template-address)').attr('hidden', null)
127
    } else if ($('.JsonpSingleSelectWidget.template-address.hide-address-parts').length) {
128
      $('div[data-geolocation]:not(.template-address)').attr('hidden', 'hidden')
129
    }
130
  });
131 149

  
132 150
  function set_sync_callback() {
133 151
    var $map = $('.qommon-map');
wcs/qommon/templates/qommon/forms/widgets/select_jsonp--address.html
4 4
{{ block.super }}
5 5
{% if not widget.readonly %}
6 6
<div>
7
<label><input id="wcs-manual-address" type="checkbox"><span>{% trans "If you cannot find this address in the list you can check this box to manually enter it." %}</span></label>
7
<label><input class="wcs-manual-address" type="checkbox"><span>{% trans "If you cannot find this address in the list you can check this box to manually enter it." %}</span></label>
8 8
</div>
9 9
{% endif %}
10 10
{% endblock %}
11
-