import { Controller } from '@hotwired/stimulus' /** * Area creation controller * Handles the area creation modal and form submission */ export default class extends Controller { static targets = [ 'modal', 'form', 'nameInput', 'latitudeInput', 'longitudeInput', 'radiusInput', 'radiusDisplay', 'submitButton', 'submitSpinner', 'submitText' ] static values = { apiKey: String } connect() { this.area = null this.setupEventListeners() console.log('[Area Creation V2] Controller connected') } /** * Setup event listeners for area drawing */ setupEventListeners() { document.addEventListener('area:drawn', (e) => { this.open(e.detail.center, e.detail.radius) }) } /** * Open the modal with area data */ open(center, radius) { // Store area data this.area = { center, radius } // Update form fields this.latitudeInputTarget.value = center[1] this.longitudeInputTarget.value = center[0] this.radiusInputTarget.value = Math.round(radius) this.radiusDisplayTarget.textContent = Math.round(radius) // Show modal this.modalTarget.classList.add('modal-open') this.nameInputTarget.focus() } /** * Close the modal */ close() { this.modalTarget.classList.remove('modal-open') this.resetForm() } /** * Submit the form */ async submit(event) { event.preventDefault() if (!this.area) { console.error('No area data available') return } const formData = new FormData(this.formTarget) const name = formData.get('name') const latitude = parseFloat(formData.get('latitude')) const longitude = parseFloat(formData.get('longitude')) const radius = parseFloat(formData.get('radius')) if (!name || !latitude || !longitude || !radius) { alert('Please fill in all required fields') return } this.setLoading(true) try { const response = await fetch('/api/v1/areas', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${this.apiKeyValue}` }, body: JSON.stringify({ name, latitude, longitude, radius }) }) if (!response.ok) { const error = await response.json() throw new Error(error.message || 'Failed to create area') } const area = await response.json() // Close modal this.close() // Dispatch document event for area created document.dispatchEvent(new CustomEvent('area:created', { detail: { area } })) } catch (error) { console.error('Error creating area:', error) alert(`Error creating area: ${error.message}`) } finally { this.setLoading(false) } } /** * Set loading state */ setLoading(loading) { this.submitButtonTarget.disabled = loading if (loading) { this.submitSpinnerTarget.classList.remove('hidden') this.submitTextTarget.textContent = 'Creating...' } else { this.submitSpinnerTarget.classList.add('hidden') this.submitTextTarget.textContent = 'Create Area' } } /** * Reset form */ resetForm() { this.formTarget.reset() this.area = null this.radiusDisplayTarget.textContent = '0' } /** * Show success message */ showSuccess(message) { // Try to use the Toast component if available if (window.Toast) { window.Toast.show(message, 'success') } } }