class AddressDisplay extends HTMLElement {
constructor() {
super();
// Create a shadow DOM
this.attachShadow({ mode: "open" });
// Initial render
this.render();
// Element references
this._locationDisplay = this.shadowRoot.querySelector(".location-display");
this._streetAddress = this.shadowRoot.querySelector(".street-address");
this._postCode = this.shadowRoot.querySelector(".post-code");
this._district = this.shadowRoot.querySelector(".district");
this._region = this.shadowRoot.querySelector(".region");
this._country = this.shadowRoot.querySelector(".country");
}
// Initial render of component
render() {
this.shadowRoot.innerHTML = `
`;
}
// Public methods
show(location) {
console.log("Showing location", location);
// Extract context data from properties
const props = location.properties;
const context = props.context || {};
// Populate structured fields
// Street Address - combine address, street, housenumber if available
let addressStr = "";
if (context.address) addressStr += context.address.address_number;
if (context.street) {
if (addressStr) addressStr += " ";
addressStr += context.street.name;
}
if (addressStr === "") {
addressStr = props.name || props.full_address || "-";
}
this._streetAddress.textContent = addressStr;
// Post Code
this._postCode.textContent = context.postcode.name || "-";
// District (could be district, locality, or place)
this._district.textContent =
context.district.name ||
context.place.name ||
context.locality.name ||
"-";
// Region (state, province, etc.)
this._region.textContent = context.region.name || "-";
// Country
this._country.textContent = context.country.name || "-";
}
}
customElements.define("address-display", AddressDisplay);