Spaces:
Sleeping
Sleeping
| document.addEventListener('DOMContentLoaded', function() { | |
| // Voltage Drop Calculator Elements | |
| const form = document.getElementById('calculator-form'); | |
| const cableContainer = document.getElementById('cable-container'); | |
| const addCableButton = document.getElementById('add-cable'); | |
| const calculateButton = document.querySelector('.btn-calculate'); | |
| let cableCount = 1; | |
| const maxCables = 3; | |
| // Function to check if all form fields are filled | |
| function checkFormValidity() { | |
| const isValid = form.checkValidity(); | |
| if (isValid) { | |
| calculateButton.disabled = false; | |
| calculateButton.classList.add('enabled'); | |
| } else { | |
| calculateButton.disabled = true; | |
| calculateButton.classList.remove('enabled'); | |
| } | |
| } | |
| // Function to update the IDs and names of the inputs in each cable group | |
| function updateCableGroupInputs() { | |
| const cableGroups = document.querySelectorAll('.cable-group'); | |
| cableGroups.forEach((group, index) => { | |
| group.querySelectorAll('input, select').forEach(input => { | |
| const baseName = input.name.split('[')[0]; // Get the base name without the index | |
| input.name = `${baseName}[${index}]`; | |
| input.id = `${baseName}-${index}`; // Update the id as well for accessibility | |
| }); | |
| group.querySelector('h2').textContent = `Cable ${index + 1}`; // Update the cable group title | |
| }); | |
| } | |
| // Function to copy values from the first cable group | |
| function copyInitialCableValues(newCableGroup) { | |
| const initialCableGroup = document.querySelector('.cable-group'); | |
| // Copy values from the initial cable group to the new cable group | |
| initialCableGroup.querySelectorAll('input, select').forEach((input, index) => { | |
| const correspondingInput = newCableGroup.querySelectorAll('input, select')[index]; | |
| correspondingInput.value = input.value; | |
| }); | |
| } | |
| // Function to update the visibility of the remove buttons | |
| function updateRemoveButtons() { | |
| const removeButtons = document.querySelectorAll('.btn-remove-cable'); | |
| removeButtons.forEach(button => { | |
| if (cableCount > 1) { | |
| button.style.display = 'inline-block'; | |
| } else { | |
| button.style.display = 'none'; | |
| } | |
| }); | |
| } | |
| // Add a new cable section | |
| addCableButton.addEventListener('click', function() { | |
| if (cableCount < maxCables) { | |
| const newCableGroup = document.querySelector('.cable-group').cloneNode(true); | |
| // Copy values from the initial cable group | |
| copyInitialCableValues(newCableGroup); | |
| // Append the new cable group to the container | |
| cableContainer.appendChild(newCableGroup); | |
| cableCount++; | |
| updateCableGroupInputs(); // Update IDs and titles | |
| updateRemoveButtons(); | |
| checkFormValidity(); | |
| } | |
| if (cableCount >= maxCables) { | |
| addCableButton.disabled = true; | |
| } | |
| }); | |
| // Remove a cable section | |
| cableContainer.addEventListener('click', function(event) { | |
| if (event.target.classList.contains('btn-remove-cable')) { | |
| if (cableCount > 1) { | |
| event.target.closest('.cable-group').remove(); | |
| cableCount--; | |
| updateCableGroupInputs(); // Update IDs and titles | |
| addCableButton.disabled = false; | |
| updateRemoveButtons(); | |
| checkFormValidity(); | |
| } | |
| } | |
| }); | |
| // Handle form submission for voltage drop calculator | |
| form.addEventListener('submit', async function(event) { | |
| event.preventDefault(); | |
| const formData = new FormData(form); | |
| const cablesData = []; | |
| // Iterate over the form data and collect all cables | |
| for (let i = 0; i < cableCount; i++) { | |
| const voltage = parseFloat(formData.get(`voltage[${i}]`)); | |
| const load = parseFloat(formData.get(`load[${i}]`)); | |
| const length = parseFloat(formData.get(`length[${i}]`)); | |
| const cable_type = formData.get(`cable_type[${i}]`); | |
| cablesData.push({ voltage, load, length, cable_type }); | |
| } | |
| console.log("Sending cables data:", cablesData); // Debugging line | |
| // Send the cables data to the backend | |
| const response = await fetch('/calculate', { | |
| method: 'POST', | |
| headers: { | |
| 'Content-Type': 'application/json' | |
| }, | |
| body: JSON.stringify({ cables: cablesData }) | |
| }); | |
| if (response.ok) { | |
| const results = await response.json(); | |
| // Display the results | |
| let resultsHtml = ''; | |
| results.forEach((result, index) => { | |
| let remainingVoltage = cablesData[index].voltage - result.voltage_drop; | |
| // Ensure voltage doesn't go below 0 | |
| if (remainingVoltage < 0) remainingVoltage = 0; | |
| // Calculate the percentage drop | |
| const voltageDropPercentage = ((cablesData[index].voltage - remainingVoltage) / cablesData[index].voltage) * 100; | |
| // Determine the color based on the percentage drop | |
| let colorClass = ''; | |
| if (voltageDropPercentage > 10) { | |
| colorClass = 'red-text'; | |
| } else if (voltageDropPercentage > 5) { | |
| colorClass = 'orange-text'; | |
| } | |
| resultsHtml += `<p class="${colorClass}">Cable ${index + 1} Voltage: ${remainingVoltage.toFixed(2)} V</p>`; | |
| resultsHtml += `<p class="${colorClass}">Voltage Drop: ${voltageDropPercentage.toFixed(2)}%</p>`; | |
| }); | |
| document.getElementById('result').innerHTML = resultsHtml; | |
| } else { | |
| console.error("Error:", response.statusText); | |
| } | |
| }); | |
| // Initially check the form validity and update buttons on page load | |
| form.addEventListener('input', checkFormValidity); | |
| checkFormValidity(); | |
| updateRemoveButtons(); | |
| }); | |