Spaces:
Running
Running
| // 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'}`; | |
| } | |
| }); |