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);