fix: similar properties loaded from API and admin password hash
- Replace hardcoded similar properties with dynamic API loading - Similar properties now use correct slugs for navigation - Fix admin password hash for authentication (admin123) - Remove duplicate HTML footer tags from previous fix
This commit is contained in:
@@ -1228,55 +1228,8 @@
|
||||
<h2 class="section-title" data-i18n="similar.title" style="font-size: 2rem;">Propiedades Similares</h2>
|
||||
<p class="text-muted" data-i18n="similar.subtitle">Otras opciones que podrían interesarte</p>
|
||||
</div>
|
||||
<div class="row">
|
||||
<div class="col-lg-4 col-md-6" data-aos="fade-up" data-aos-delay="100">
|
||||
<div class="similar-card">
|
||||
<a href="property.html" class="similar-card-image">
|
||||
<img src="https://images.unsplash.com/photo-1486406146926-c627a92ad1ab?w=600&q=80" alt="Terreno urbano">
|
||||
<span class="similar-card-badge urban" data-i18n="similar.urban">Urbano</span>
|
||||
</a>
|
||||
<div class="similar-card-content">
|
||||
<a href="property.html" class="similar-card-title" data-i18n="similar.card1.title">Parcela Urbana en Granadilla</a>
|
||||
<p class="similar-card-location"><i class="bi bi-geo-alt"></i>Granadilla de Abona</p>
|
||||
<div class="similar-card-footer">
|
||||
<span class="similar-card-price">210.000 €</span>
|
||||
<span class="similar-card-area"><i class="bi bi-rulers"></i>1.800 m²</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-lg-4 col-md-6" data-aos="fade-up" data-aos-delay="200">
|
||||
<div class="similar-card">
|
||||
<a href="property.html" class="similar-card-image">
|
||||
<img src="https://images.unsplash.com/photo-1500382017468-9049fed747ef?w=600&q=80" alt="Terreno agrícola">
|
||||
<span class="similar-card-badge agricultural" data-i18n="similar.agricultural">Agrícola</span>
|
||||
</a>
|
||||
<div class="similar-card-content">
|
||||
<a href="property.html" class="similar-card-title" data-i18n="similar.card2.title">Terreno Agrícola en Güímar</a>
|
||||
<p class="similar-card-location"><i class="bi bi-geo-alt"></i>Güímar, Tenerife Sur</p>
|
||||
<div class="similar-card-footer">
|
||||
<span class="similar-card-price">125.000 €</span>
|
||||
<span class="similar-card-area"><i class="bi bi-rulers"></i>8.500 m²</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="col-lg-4 col-md-6" data-aos="fade-up" data-aos-delay="300">
|
||||
<div class="similar-card">
|
||||
<a href="property.html" class="similar-card-image">
|
||||
<img src="https://images.unsplash.com/photo-1613490493576-7fde63acd811?w=600&q=80" alt="Villa">
|
||||
<span class="similar-card-badge house" data-i18n="similar.house">Casa</span>
|
||||
</a>
|
||||
<div class="similar-card-content">
|
||||
<a href="property.html" class="similar-card-title" data-i18n="similar.card3.title">Villa con Vistas al Mar</a>
|
||||
<p class="similar-card-location"><i class="bi bi-geo-alt"></i>Los Cristianos, Arona</p>
|
||||
<div class="similar-card-footer">
|
||||
<span class="similar-card-price">595.000 €</span>
|
||||
<span class="similar-card-area"><i class="bi bi-rulers"></i>350 m²</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="row" id="similarPropertiesGrid">
|
||||
<!-- Dynamically loaded -->
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
@@ -1638,7 +1591,77 @@
|
||||
const urlParams = new URLSearchParams(window.location.search);
|
||||
const lang = urlParams.get('lang') || 'es';
|
||||
switchLanguage(lang);
|
||||
|
||||
// Load similar properties
|
||||
loadSimilarProperties();
|
||||
});
|
||||
|
||||
// ============ SIMILAR PROPERTIES ============
|
||||
async function loadSimilarProperties() {
|
||||
const container = $('#similarPropertiesGrid');
|
||||
const currentSlug = window.location.pathname.split('/').pop() || 'terreno-urbano-adeje';
|
||||
|
||||
try {
|
||||
const response = await fetch('/api/properties?limit=3');
|
||||
const result = await response.json();
|
||||
|
||||
if (!result.success || !result.data) {
|
||||
container.html('<div class="col-12 text-center text-muted">No hay propiedades disponibles</div>');
|
||||
return;
|
||||
}
|
||||
|
||||
// Filter out current property and get first 3
|
||||
const similarProps = result.data
|
||||
.filter(p => p.slug !== currentSlug)
|
||||
.slice(0, 3);
|
||||
|
||||
const typeLabels = {
|
||||
urban: { es: 'Urbano', ru: 'Городской', class: 'urban' },
|
||||
agricultural: { es: 'Agrícola', ru: 'Сельхоз', class: 'agricultural' },
|
||||
house: { es: 'Casa', ru: 'Дом', class: 'house' },
|
||||
apartment: { es: 'Apartamento', ru: 'Апартаменты', class: 'apartment' }
|
||||
};
|
||||
|
||||
container.empty();
|
||||
|
||||
similarProps.forEach((property, index) => {
|
||||
const typeInfo = typeLabels[property.type] || typeLabels.urban;
|
||||
const typeLabel = typeInfo[currentLang];
|
||||
const images = JSON.parse(property.images || '[]');
|
||||
const mainImage = images[0] || 'https://images.unsplash.com/photo-1564013799919-ab600027ffc6?w=600&q=80';
|
||||
const priceFormatted = new Intl.NumberFormat('es-ES').format(property.price);
|
||||
const areaFormatted = new Intl.NumberFormat('es-ES').format(property.area);
|
||||
const title = property[`title_${currentLang}`] || property.title_es;
|
||||
|
||||
const card = `
|
||||
<div class="col-lg-4 col-md-6" data-aos="fade-up" data-aos-delay="${(index + 1) * 100}">
|
||||
<div class="similar-card">
|
||||
<a href="/property/${property.slug}" class="similar-card-image">
|
||||
<img src="${mainImage}" alt="${title}">
|
||||
<span class="similar-card-badge ${typeInfo.class}">${typeLabel}</span>
|
||||
</a>
|
||||
<div class="similar-card-content">
|
||||
<a href="/property/${property.slug}" class="similar-card-title">${title}</a>
|
||||
<p class="similar-card-location">
|
||||
<i class="bi bi-geo-alt"></i> ${property.city}
|
||||
</p>
|
||||
<div class="similar-card-footer">
|
||||
<span class="similar-card-price">${priceFormatted} €</span>
|
||||
<span class="similar-card-area">
|
||||
<i class="bi bi-rulers"></i> ${areaFormatted} m²
|
||||
</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
`;
|
||||
container.append(card);
|
||||
});
|
||||
} catch (error) {
|
||||
console.error('Error loading similar properties:', error);
|
||||
container.html('<div class="col-12 text-center text-muted">Error al cargar propiedades</div>');
|
||||
}
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
|
||||
@@ -479,9 +479,9 @@ function seedData() {
|
||||
[s.id, s.icon, s.title_es, s.title_ru, s.desc_es, s.desc_ru])
|
||||
})
|
||||
|
||||
// Admin user
|
||||
// Admin user (password: admin123)
|
||||
db.run('INSERT INTO users (id, email, password_hash, name, role) VALUES (?, ?, ?, ?, ?)',
|
||||
['user-001', 'admin@tenerifeprop.com', '$2b$10$dummyHashForDemo', 'Admin', 'admin'])
|
||||
['user-001', 'admin@tenerifeprop.com', '$2b$10$wlW1hhV6tgq8gKFtnmTBXOO8yNEv3d2UyUvwbnbX84iW3JbB3h07O', 'Admin', 'admin'])
|
||||
|
||||
console.log('✅ Database seeded successfully')
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user