import Component from '@glimmer/component'; import { fn } from '@ember/helper'; import { on } from '@ember/modifier'; import capitalize from '../helpers/capitalize'; import Icon from '../components/icon'; import { tracked } from '@glimmer/tracking'; import { action } from '@ember/object'; export default class PlaceDetails extends Component { @tracked isEditing = false; @tracked editTitle = ''; @tracked editDescription = ''; constructor() { super(...arguments); this.resetEditFields(); } get place() { return this.args.place || {}; } get tags() { return this.place.osmTags || {}; } get name() { return ( this.place.title || this.tags.name || this.tags['name:en'] || 'Unnamed Place' ); } @action resetEditFields() { this.editTitle = this.name; this.editDescription = this.place.description || ''; } @action startEditing() { if (!this.place.createdAt) return; // Only allow editing saved places this.resetEditFields(); this.isEditing = true; } @action cancelEditing() { this.isEditing = false; } @action async saveChanges(event) { event.preventDefault(); if (this.args.onSave) { await this.args.onSave({ ...this.place, title: this.editTitle, description: this.editDescription, }); } this.isEditing = false; } @action updateTitle(e) { this.editTitle = e.target.value; } @action updateDescription(e) { this.editDescription = e.target.value; } get type() { return ( this.tags.amenity || this.tags.shop || this.tags.tourism || this.tags.leisure || this.tags.historic || 'Point of Interest' ); } get address() { const t = this.tags; const parts = []; // Street + Number if (t['addr:street']) { let street = t['addr:street']; if (t['addr:housenumber']) { street += ` ${t['addr:housenumber']}`; } parts.push(street); } // Postcode + City if (t['addr:city']) { let city = t['addr:city']; if (t['addr:postcode']) { city = `${t['addr:postcode']} ${city}`; } parts.push(city); } if (parts.length === 0) return null; return parts.join(', '); } get phone() { return this.tags.phone || this.tags['contact:phone']; } get website() { return this.place.url || this.tags.website || this.tags['contact:website']; } get websiteDomain() { const url = new URL(this.website); return url.hostname; } get openingHours() { return this.tags.opening_hours; } get cuisine() { if (!this.tags.cuisine) return null; return this.tags.cuisine .split(';') .map((c) => capitalize.compute([c])) .map((c) => c.replace('_', ' ')) .join(', '); } get wikipedia() { return this.tags.wikipedia; } get geoLink() { const lat = this.place.lat; const lon = this.place.lon; if (!lat || !lon) return '#'; const label = encodeURIComponent(this.name); return `geo:${lat},${lon}?q=${lat},${lon}(${label})`; } get visibleGeoLink() { const lat = this.place.lat; const lon = this.place.lon; if (!lat || !lon) return ''; return `${lat}, ${lon}`; } get osmUrl() { const id = this.place.osmId; if (!id) return null; const type = this.place.osmType || 'node'; return `https://www.openstreetmap.org/${type}/${id}`; } get gmapsUrl() { return `https://www.google.com/maps/search/?api=1&query=${this.name}&query=${this.place.lat},${this.place.lon}`; } }