class ParkingGrid extends HTMLElement { static get observedAttributes() { return ['slots', 'slots-data']; } constructor() { super(); this.slots = 20; this.slotsData = Array(this.slots).fill(null); } attributeChangedCallback(name, oldValue, newValue) { if (name === 'slots') { this.slots = parseInt(newValue) || 20; this.render(); } if (name === 'slots-data') { try { this.slotsData = JSON.parse(newValue) || Array(this.slots).fill(null); this.render(); } catch (e) { console.error('Error parsing slots data', e); } } } connectedCallback() { this.attachShadow({ mode: 'open' }); this.render(); } render() { const slotSize = this.slots <= 30 ? 'min-w-[100px]' : this.slots <= 50 ? 'min-w-[80px]' : 'min-w-[60px]'; this.shadowRoot.innerHTML = `
${Array.from({ length: this.slots }, (_, i) => { const slotData = this.slotsData[i]; let bgColor = 'bg-gray-100'; let borderColor = 'border-gray-200'; let textColor = 'text-gray-800'; if (slotData) { switch(slotData.type) { case 'monthly-fixed': bgColor = 'bg-green-100'; borderColor = 'border-green-300'; textColor = 'text-green-800'; break; case 'monthly-rotating': bgColor = 'bg-yellow-100'; borderColor = 'border-yellow-300'; textColor = 'text-yellow-800'; break; case 'hourly': bgColor = 'bg-red-100'; borderColor = 'border-red-300'; textColor = 'text-red-800'; break; } } return `
${i + 1} ${slotData ? `
${slotData.plateNumber} ` : `
`}
`; }).join('')}
`; // Reemplazar íconos feather const featherIcons = this.shadowRoot.querySelectorAll('[data-feather]'); featherIcons.forEach(icon => { feather.replace(icon); }); } } customElements.define('parking-grid', ParkingGrid);