<!-- Google Map Import -->
<!-- Should be place on the <head> section and need to modify the API key depending on the project -->
<link rel="preload" as="script" href="//maps.googleapis.com/maps/api/js?key=AIzaSyCvWMyTkTt0lMg0hK0PBs3eDt9MDoZevgU&libraries=places&v=3.exp" />
<script src="//maps.googleapis.com/maps/api/js?key=AIzaSyCvWMyTkTt0lMg0hK0PBs3eDt9MDoZevgU&libraries=places&v=3.exp"></script>
<div class="wrapper">
<div class="grid-container">
<div class="grid-x grid-padding-x gutter">
<div class="large-8 large-offset-2 cell">
<div id="form-address-fields" required class="address-fields">
<div class="spacer"></div>
<div class="grid-x grid-padding-x gutter">
<div class="large-12 medium-12 small-12 cell">
<ins-input address-lookup
label="Search Addresss"
id="form-address-search"
name="address_form"
placeholder="Search Addresss"
icon="icon-map-pin">
</ins-input>
<input type="hidden" form-address-field
id="address_form_address_id"
name="address_form_address_id" />
</div>
<div class="large-6 medium-6 small-12 cell">
<ins-input form-address-field
required validate
label="Address 1*"
id="address_form_address_1"
placeholder="Address 1"
name="address_form_address_1"
value="" >
</ins-input>
</div>
<div class="large-6 medium-6 small-12 cell">
<ins-input form-address-field
label="Address 2"
id="address_form_address_2"
placeholder="Address 2"
name="address_form_address_2"
value="" >
</ins-input>
</div>
<div class="large-6 medium-6 small-12 cell">
<ins-input form-address-field
required validate
label="City*"
id="address_form_city"
placeholder="City"
name="address_form_city"
value="" >
</ins-input>
</div>
<div class="large-6 medium-6 small-12 cell">
<ins-input form-address-field
required validate
label="State*"
id="address_form_state"
placeholder="State"
name="address_form_state"
value="">
</ins-input>
</div>
<div class="large-6 medium-6 small-12 cell">
<ins-input form-address-field
required validate
label="Zip / Postal Code*"
id="address_form_postcode"
placeholder="Zip / Postal Code"
name="address_form_postcode"
value="" >
</ins-input>
</div>
<div class="large-6 medium-6 small-12 cell">
<ins-input form-address-field
required validate
label="Country*"
id="address_form_country"
placeholder="Country"
name="address_form_country"
value="">
</ins-input>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
Note:

let addressValueChanged = false;
var AddressLookup = (function () {
// google address lookup field
let searchAddressElement;
return {
methods: {
fillAddress(field, type) {
let address = field.getPlace();
AddressLookup.methods.resetAddress(type);
AddressLookup.methods.unselectAddressCards(type);
if (address && address.address_components) {
AddressLookup.methods.mapGoogleAddress(address.address_components, type);
addressValueChanged = true;
}
},
resetAddress(type) {
let addressField = document.querySelectorAll(`[${type}-address-field]`);
for (let i = 0; i < addressField.length; i++) {
addressField[i].value = "";
}
},
unselectAddressCards(type) {
let cards = document.querySelectorAll(`ins-checkbox-card[name="${type}-address-cards"]`);
cards.forEach(el => {
el.classList.remove('is-invalid');
el.removeAttribute('selected');
el.selected = false;
});
},
mapGoogleAddress(address, name) {
address.forEach(item => {
let addressType = item.types[0];
// Update fields as needed on project.
switch (addressType) {
case "street_number":
document.getElementById(`${name}_address_1`).value = item['short_name'] + " ";
break;
case "premise":
document.getElementById(`${name}_address_1`).value = item['long_name'] + " ";
break;
case "route":
document.getElementById(`${name}_address_1`).value += item['long_name'] + " ";
break;
case "neighborhood":
document.getElementById(`${name}_address_2`).value += item['long_name'] + " ";
break;
case "sublocality_level_1":
document.getElementById(`${name}_address_2`).value += item['long_name'] + " ";
break;
case "locality":
if (address.length > 7 &&
address.length < 9 &&
address[6].long_name !== "Canada") {
document.getElementById(`${name}_address_2`).value += item['long_name'] + " ";
} else document.getElementById(`${name}_city`).value = item['long_name'] + " ";
break;
case "postal_town":
document.getElementById(`${name}_city`).value += item['long_name'];
break;
case "administrative_area_level_2":
if (address.length <= 7) {
// document.getElementById(`${name}_suburb`).value = item['long_name'] + " ";
document.getElementById(`${name}_state`).value = item['long_name'] + " ";
} else document.getElementById(`${name}_state`).value = item['long_name'] + " ";
break;
case "administrative_area_level_1":
if (address.length < 8)
document.getElementById(`${name}_state`).value += item['short_name'];
else
document.getElementById(`${name}_city`).value += item['short_name'];
break;
case "country":
document.getElementById(`${name}_country`).value = item['long_name'];
// document.getElementById(`${name}_country_code`).value = item['short_name'];
break;
case "postal_code":
case "postal_code_prefix":
document.getElementById(`${name}_postcode`).value = item['short_name'];
break;
}
});
}
},
events: {
initGoogleAddressLookup: function () {
let lookupFields = document.querySelectorAll('[address-lookup]');
for(let i = 0; i < lookupFields.length; i++) {
searchAddressElement = lookupFields[i];
searchAddressElement.addEventListener('didLoad',
this.initEventListeners(searchAddressElement));
}
},
initEventListeners: function (field) {
let name = field.getAttribute('name');
let setStateInterval = setInterval(() => {
let lookupField = field.querySelector('input');
if (lookupField && google !== undefined) {
// Initialize google autocomplete on field
let searchAddressField = new google.maps.places.Autocomplete(lookupField);
// Set initial restrict to the listed countries
searchAddressField.setComponentRestrictions({ country: ["au"] });
// Fill address event
searchAddressField.addListener('place_changed', (event) => {
AddressLookup.methods.fillAddress(searchAddressField, name);
});
clearInterval(setStateInterval);
}
}, 300);
},
}
}
})();
// Initialize on window load
window.AddressLookup = AddressLookup;
// Set timeout, make sure INS components has been loaded
setTimeout(() => {
AddressLookup.events.initGoogleAddressLookup();
}, 200);