solarspec-hub / script.js
fernando-bold's picture
conclua
38a803e verified
// Global state and utilities
const AppState = {
currentPage: window.location.pathname.split('/').pop()
};
document.addEventListener('DOMContentLoaded', () => {
// Initialize page specific functionality
if (AppState.currentPage === 'technical-sheets.html') {
initTechnicalSheetsPage();
} else if (AppState.currentPage === 'products.html') {
initProductsPage();
}
// Common functionality (theme toggler, etc.)
initCommon();
];
// Filter options
const categories = ['All', 'Inverters', 'Solar Panels', 'Structures', 'Batteries'];
const manufacturers = ['All', 'GOODWE', 'GROWATT', 'SUNGROW', 'DEYE', 'HUAWEI', 'FRONIUS', 'SMA', 'ABB'];
const powerRanges = [
{ label: 'All', min: 0, max: Infinity },
{ label: '0-10kW (Residential)', min: 0, max: 10 },
{ label: '10-50kW (Small Commercial)', min: 10, max: 50 },
{ label: '50-100kW (Medium Commercial)', min: 50, max: 100 },
{ label: '100kW+ (Large Commercial)', min: 100, max: Infinity }
];
// DOM elements
const searchInput = document.getElementById('search-input');
const filterToggle = document.getElementById('filter-toggle');
const filtersContainer = document.getElementById('filters-container');
const equipmentGrid = document.getElementById('equipment-grid');
const emptyState = document.getElementById('empty-state');
const equipmentCount = document.getElementById('equipment-count');
const clearFilters = document.getElementById('clear-filters');
// State
let searchQuery = '';
let selectedCategory = 'All';
let selectedManufacturer = 'All';
let selectedPowerRange = 0;
// Initialize
renderFilters();
renderEquipment();
// Event listeners
searchInput.addEventListener('input', (e) => {
searchQuery = e.target.value.toLowerCase();
renderEquipment();
});
filterToggle.addEventListener('click', () => {
filtersContainer.classList.toggle('hidden');
});
clearFilters.addEventListener('click', () => {
searchQuery = '';
selectedCategory = 'All';
selectedManufacturer = 'All';
selectedPowerRange = 0;
searchInput.value = '';
renderEquipment();
updateActiveFilters();
});
function renderFilters() {
const categoryFilters = document.getElementById('category-filters');
const manufacturerFilters = document.getElementById('manufacturer-filters');
const powerRangeFilters = document.getElementById('power-range-filters');
// Category filters
categories.forEach(category => {
const button = document.createElement('button');
button.textContent = category;
button.className = `px-3 py-1 rounded-full text-sm ${selectedCategory === category ? 'bg-primary-500 text-white' : 'bg-gray-100 dark:bg-gray-700 hover:bg-gray-200 dark:hover:bg-gray-600'}`;
button.addEventListener('click', () => {
selectedCategory = category;
renderEquipment();
updateActiveFilters();
});
categoryFilters.appendChild(button);
});
// Manufacturer filters
manufacturers.forEach(manufacturer => {
const button = document.createElement('button');
button.textContent = manufacturer;
button.className = `px-3 py-1 rounded-full text-sm ${selectedManufacturer === manufacturer ? 'bg-primary-500 text-white' : 'bg-gray-100 dark:bg-gray-700 hover:bg-gray-200 dark:hover:bg-gray-600'}`;
button.addEventListener('click', () => {
selectedManufacturer = manufacturer;
renderEquipment();
updateActiveFilters();
});
manufacturerFilters.appendChild(button);
});
// Power range filters
powerRanges.forEach((range, index) => {
const button = document.createElement('button');
button.textContent = range.label;
button.className = `px-3 py-1 rounded-full text-xs ${selectedPowerRange === index ? 'bg-primary-500 text-white' : 'bg-gray-100 dark:bg-gray-700 hover:bg-gray-200 dark:hover:bg-gray-600'}`;
button.addEventListener('click', () => {
selectedPowerRange = index;
renderEquipment();
updateActiveFilters();
});
powerRangeFilters.appendChild(button);
});
}
function updateActiveFilters() {
// Update active states for filter buttons
document.querySelectorAll('#category-filters button').forEach(button => {
button.className = `px-3 py-1 rounded-full text-sm ${selectedCategory === button.textContent ? 'bg-primary-500 text-white' : 'bg-gray-100 dark:bg-gray-700 hover:bg-gray-200 dark:hover:bg-gray-600'}`;
});
document.querySelectorAll('#manufacturer-filters button').forEach(button => {
button.className = `px-3 py-1 rounded-full text-sm ${selectedManufacturer === button.textContent ? 'bg-primary-500 text-white' : 'bg-gray-100 dark:bg-gray-700 hover:bg-gray-200 dark:hover:bg-gray-600'}`;
});
document.querySelectorAll('#power-range-filters button').forEach((button, index) => {
button.className = `px-3 py-1 rounded-full text-xs ${selectedPowerRange === index ? 'bg-primary-500 text-white' : 'bg-gray-100 dark:bg-gray-700 hover:bg-gray-200 dark:hover:bg-gray-600'}`;
});
}
function renderEquipment() {
const filtered = equipmentDatabase.filter(item => {
const matchesSearch =
item.manufacturer.toLowerCase().includes(searchQuery) ||
item.model.toLowerCase().includes(searchQuery) ||
item.sku.toLowerCase().includes(searchQuery);
const matchesCategory =
selectedCategory === 'All' ||
item.category.toLowerCase() === selectedCategory.toLowerCase();
const matchesManufacturer =
selectedManufacturer === 'All' ||
item.manufacturer === selectedManufacturer;
const powerRange = powerRanges[selectedPowerRange];
const matchesPowerRange =
item.power_kw >= powerRange.min && item.power_kw <= powerRange.max;
return matchesSearch && matchesCategory && matchesManufacturer && matchesPowerRange;
});
equipmentGrid.innerHTML = '';
if (filtered.length === 0) {
emptyState.classList.remove('hidden');
equipmentGrid.classList.add('hidden');
} else {
emptyState.classList.add('hidden');
equipmentGrid.classList.remove('hidden');
filtered.forEach(item => {
const card = document.createElement('custom-equipment-card');
card.setAttribute('data-equipment', JSON.stringify(item));
equipmentGrid.appendChild(card);
});
}
equipmentCount.textContent = `${filtered.length} ${filtered.length === 1 ? 'equipment' : 'equipments'}`;
}
}
function initProductsPage() {
// Sample product data
const products = [
{
id: 1,
name: 'Premium Solar Panel 400W',
price: 249.99,
category: 'Solar Panels',
image_url: 'http://static.photos/solar/320x240/1'
},
{
id: 2,
name: 'Home Inverter 5kW',
price: 1299.99,
category: 'Inverters',
image_url: 'http://static.photos/technology/320x240/2'
},
{
id: 3,
name: 'Mounting System Kit',
price: 399.99,
category: 'Structures',
image_url: 'http://static.photos/construction/320x240/3'
},
{
id: 4,
name: 'Lithium Battery 10kWh',
price: 3499.99,
category: 'Batteries',
image_url: 'http://static.photos/technology/320x240/4'
}
];
const productsGrid = document.getElementById('products-grid');
const emptyState = document.getElementById('empty-state');
const productCount = document.getElementById('product-count');
// Render products
if (products.length === 0) {
emptyState.classList.remove('hidden');
productsGrid.classList.add('hidden');
} else {
emptyState.classList.add('hidden');
productsGrid.classList.remove('hidden');
products.forEach(product => {
const card = document.createElement('product-card');
card.setAttribute('data-product', JSON.stringify(product));
productsGrid.appendChild(card);
});
}
productCount.textContent = `${products.length} ${products.length === 1 ? 'product' : 'products'}`;
}
function initCommon() {
// Theme toggle functionality
const themeToggle = document.getElementById('theme-toggle');
if (themeToggle) {
themeToggle.addEventListener('click', () => {
document.documentElement.classList.toggle('dark');
localStorage.setItem('darkMode', document.documentElement.classList.contains('dark'));
});
}
}
function initTechnicalSheetsPage() {
// Equipment data
const equipmentDatabase = [
{
sku: 'GOODWEGW250KHTIMAGEPRODUCT600142',
manufacturer: 'GOODWE',
model: 'GW250K-HT',
category: 'inverters',
power_kw: 250,
voltage_v: 380,
mppt_count: 10,
efficiency_percent: 98.5,
price_brl: 182250.0,
image_url: 'https://cdn.yellosolarhub.com/products/inversores/GOODWE-GW250K-HT_IMAGE_PRODUCT_600142.png',
notes: 'Largest GOODWE inverter - 250kW for large commercial projects',
sync_status: 'synchronized',
recovered_value: 450250.0
},
// ... (other equipment objects from the React code)
];
// Filter options
const categories = ['All', 'Inverters', 'Solar Panels', 'Structures', 'Batteries'];
const manufacturers = ['All', 'GOODWE', 'GROWATT', 'SUNGROW', 'DEYE', 'HUAWEI', 'FRONIUS', 'SMA', 'ABB'];
const powerRanges = [
{ label: 'All', min: 0, max: Infinity },
{ label: '0-10kW (Residential)', min: 0, max: 10 },
{ label: '10-50kW (Small Commercial)', min: 10, max: 50 },
{ label: '50-100kW (Medium Commercial)', min: 50, max: 100 },
{ label: '100kW+ (Large Commercial)', min: 100, max: Infinity }
];
// DOM elements
const searchInput = document.getElementById('search-input');
const filterToggle = document.getElementById('filter-toggle');
const filtersContainer = document.getElementById('filters-container');
const equipmentGrid = document.getElementById('equipment-grid');
const emptyState = document.getElementById('empty-state');
const equipmentCount = document.getElementById('equipment-count');
const clearFilters = document.getElementById('clear-filters');
// State
let searchQuery = '';
let selectedCategory = 'All';
let selectedManufacturer = 'All';
let selectedPowerRange = 0;
// Initialize
renderFilters();
renderEquipment();
// Event listeners
searchInput.addEventListener('input', (e) => {
searchQuery = e.target.value.toLowerCase();
renderEquipment();
});
filterToggle.addEventListener('click', () => {
filtersContainer.classList.toggle('hidden');
});
clearFilters.addEventListener('click', () => {
searchQuery = '';
selectedCategory = 'All';
selectedManufacturer = 'All';
selectedPowerRange = 0;
searchInput.value = '';
renderEquipment();
updateActiveFilters();
});
function renderFilters() {
const categoryFilters = document.getElementById('category-filters');
const manufacturerFilters = document.getElementById('manufacturer-filters');
const powerRangeFilters = document.getElementById('power-range-filters');
// Category filters
categories.forEach(category => {
const button = document.createElement('button');
button.textContent = category;
button.className = `px-3 py-1 rounded-full text-sm ${selectedCategory === category ? 'bg-primary-500 text-white' : 'bg-gray-100 dark:bg-gray-700 hover:bg-gray-200 dark:hover:bg-gray-600'}`;
button.addEventListener('click', () => {
selectedCategory = category;
renderEquipment();
updateActiveFilters();
});
categoryFilters.appendChild(button);
});
// Manufacturer filters
manufacturers.forEach(manufacturer => {
const button = document.createElement('button');
button.textContent = manufacturer;
button.className = `px-3 py-1 rounded-full text-sm ${selectedManufacturer === manufacturer ? 'bg-primary-500 text-white' : 'bg-gray-100 dark:bg-gray-700 hover:bg-gray-200 dark:hover:bg-gray-600'}`;
button.addEventListener('click', () => {
selectedManufacturer = manufacturer;
renderEquipment();
updateActiveFilters();
});
manufacturerFilters.appendChild(button);
});
// Power range filters
powerRanges.forEach((range, index) => {
const button = document.createElement('button');
button.textContent = range.label;
button.className = `px-3 py-1 rounded-full text-xs ${selectedPowerRange === index ? 'bg-primary-500 text-white' : 'bg-gray-100 dark:bg-gray-700 hover:bg-gray-200 dark:hover:bg-gray-600'}`;
button.addEventListener('click', () => {
selectedPowerRange = index;
renderEquipment();
updateActiveFilters();
});
powerRangeFilters.appendChild(button);
});
}
function updateActiveFilters() {
// Update active states for filter buttons
document.querySelectorAll('#category-filters button').forEach(button => {
button.className = `px-3 py-1 rounded-full text-sm ${selectedCategory === button.textContent ? 'bg-primary-500 text-white' : 'bg-gray-100 dark:bg-gray-700 hover:bg-gray-200 dark:hover:bg-gray-600'}`;
});
document.querySelectorAll('#manufacturer-filters button').forEach(button => {
button.className = `px-3 py-1 rounded-full text-sm ${selectedManufacturer === button.textContent ? 'bg-primary-500 text-white' : 'bg-gray-100 dark:bg-gray-700 hover:bg-gray-200 dark:hover:bg-gray-600'}`;
});
document.querySelectorAll('#power-range-filters button').forEach((button, index) => {
button.className = `px-3 py-1 rounded-full text-xs ${selectedPowerRange === index ? 'bg-primary-500 text-white' : 'bg-gray-100 dark:bg-gray-700 hover:bg-gray-200 dark:hover:bg-gray-600'}`;
});
}
function renderEquipment() {
const filtered = equipmentDatabase.filter(item => {
const matchesSearch =
item.manufacturer.toLowerCase().includes(searchQuery) ||
item.model.toLowerCase().includes(searchQuery) ||
item.sku.toLowerCase().includes(searchQuery);
const matchesCategory =
selectedCategory === 'All' ||
item.category.toLowerCase() === selectedCategory.toLowerCase();
const matchesManufacturer =
selectedManufacturer === 'All' ||
item.manufacturer === selectedManufacturer;
const powerRange = powerRanges[selectedPowerRange];
const matchesPowerRange =
item.power_kw >= powerRange.min && item.power_kw <= powerRange.max;
return matchesSearch && matchesCategory && matchesManufacturer && matchesPowerRange;
});
equipmentGrid.innerHTML = '';
if (filtered.length === 0) {
emptyState.classList.remove('hidden');
equipmentGrid.classList.add('hidden');
} else {
emptyState.classList.add('hidden');
equipmentGrid.classList.remove('hidden');
filtered.forEach(item => {
const card = document.createElement('custom-equipment-card');
card.setAttribute('data-equipment', JSON.stringify(item));
equipmentGrid.appendChild(card);
});
}
equipmentCount.textContent = `${filtered.length} ${filtered.length === 1 ? 'equipment' : 'equipments'}`;
}
});