/** * @file * JavaScript behaviors for Algolia places location integration. */ (function ($, Drupal, drupalSettings) { 'use strict'; // @see https://github.com/algolia/places // @see https://community.algolia.com/places/documentation.html#options Drupal.webform = Drupal.webform || {}; Drupal.webform.locationPlaces = Drupal.webform.locationPlaces || {}; Drupal.webform.locationPlaces.options = Drupal.webform.locationPlaces.options || {}; var mapping = { lat: 'lat', lng: 'lng', name: 'name', postcode: 'postcode', locality: 'locality', city: 'city', administrative: 'administrative', country: 'country', countryCode: 'country_code', county: 'county', suburb: 'suburb' }; /** * Initialize location places. * * @type {Drupal~behavior} */ Drupal.behaviors.webformLocationPlaces = { attach: function (context) { if (!window.places) { return; } $(context).find('.js-webform-type-webform-location-places').once('webform-location-places').each(function () { var $element = $(this); var $input = $element.find('.webform-location-places'); // Prevent the 'Enter' key from submitting the form. $input.keydown(function (event) { if (event.keyCode === 13) { event.preventDefault(); } }); var options = $.extend({ type: 'address', useDeviceLocation: true, container: $input.get(0) }, Drupal.webform.locationPlaces.options); // Add application id and API key. if (drupalSettings.webform.location.places.app_id && drupalSettings.webform.location.places.api_key) { options.appId = drupalSettings.webform.location.places.app_id; options.apiKey = drupalSettings.webform.location.places.api_key; } var placesAutocomplete = window.places(options); // Disable autocomplete. // @see https://gist.github.com/niksumeiko/360164708c3b326bd1c8 var isChrome = /Chrome/.test(window.navigator.userAgent) && /Google Inc/.test(window.navigator.vendor); $input.attr('autocomplete', (isChrome) ? 'off' : 'false'); // Sync values on change and clear events. placesAutocomplete.on('change', function (e) { $.each(mapping, function (source, destination) { var value = (source === 'lat' || source === 'lng' ? e.suggestion.latlng[source] : e.suggestion[source]) || ''; setValue(destination, value); }); }); placesAutocomplete.on('clear', function (e) { $.each(mapping, function (source, destination) { setValue(destination, ''); }); }); /** * Set attribute value. * * @param {string} name * The attribute name * @param {string} value * The attribute value */ function setValue(name, value) { var inputSelector = ':input[data-webform-location-places-attribute="' + name + '"]'; $element.find(inputSelector).val(value); } }); } }; })(jQuery, Drupal, drupalSettings);