diff --git a/html/rechner/index.html b/html/rechner/index.html index ac6173a..e203ee9 100644 --- a/html/rechner/index.html +++ b/html/rechner/index.html @@ -8,7 +8,7 @@ script-src 'self' 'unsafe-inline' 'unsafe-eval' https://cdn.jsdelivr.net; style-src 'self' 'unsafe-inline'; img-src 'self' data:; - connect-src 'self' http://localhost:3000; + connect-src 'self' http://localhost:3001; "> Rechner diff --git a/html/rechner/script.js b/html/rechner/script.js index 5856554..43c4452 100644 --- a/html/rechner/script.js +++ b/html/rechner/script.js @@ -1,4 +1,4 @@ -"use strict"; + "use strict"; (() => { // Helper functions const $ = id => { @@ -32,7 +32,7 @@ const updateCoinTrackersToBackend = (trackers) => { console.log("Saving trackers to backend:", trackers); - fetch('/api/coinTrackers', { + fetch('http://localhost:3001/api/coinTrackers', { method: 'POST', headers: { 'Content-Type': 'application/json', @@ -1182,7 +1182,7 @@ const loadCoinTrackers = () => { console.log("Loading trackers from backend..."); - fetch('/api/coinTrackers') + fetch('http://localhost:3001/api/coinTrackers') .then(response => { if (!response.ok) { throw new Error('Network response was not ok'); @@ -1507,57 +1507,79 @@ console.log("updateAnalysisTable called"); console.trace("Call stack for updateAnalysisTable"); - // Get reinvestment rate from the dedicated analysis input - NOT the main calculator + // FIXED: Use main calculator inputs first, fallback to analysis settings if needed + const mainInitialPrincipal = parseFloat($('initialPrincipal')?.value) || 0; + const mainDailyRate = parseFloat($('dailyRate')?.value) || 0; + const mainTermDays = parseInt($('termDays')?.value) || 0; + const mainReinvestRate = parseFloat($('reinvestRate')?.value) || 0; + + // Get analysis settings as fallback/override const reinvestRateElement = document.getElementById('analysisReinvestRate'); const analysisDaysElement = document.getElementById('analysisDays'); console.log("Elements found:", !!reinvestRateElement, !!analysisDaysElement); - console.log("Elements:", reinvestRateElement, analysisDaysElement); - if (reinvestRateElement) { - console.log("Reinvest rate value:", reinvestRateElement.value); - console.log("Reinvest rate attribute:", reinvestRateElement.getAttribute('value')); - console.log("Reinvest rate type:", typeof reinvestRateElement.value); - } - if (analysisDaysElement) { - console.log("Days value:", analysisDaysElement.value); - console.log("Days attribute:", analysisDaysElement.getAttribute('value')); - console.log("Days type:", typeof analysisDaysElement.value); - } + console.log("Main calculator values:", {mainInitialPrincipal, mainDailyRate, mainTermDays, mainReinvestRate}); - const reinvestRate = reinvestRateElement ? parseFloat(reinvestRateElement.value) || 0 : 0; - const days = analysisDaysElement ? parseInt(analysisDaysElement.value) || 30 : 30; + // Use main calculator values, but allow analysis settings to override if they have non-zero values + let reinvestRate = mainReinvestRate; + let days = mainTermDays; + let initialPrincipal = mainInitialPrincipal; + let dailyRate = mainDailyRate; + + // Override with analysis settings ONLY if they have meaningful values different from defaults + if (reinvestRateElement && reinvestRateElement.value !== "" && reinvestRateElement.value !== "0") { + const analysisReinvestRate = parseFloat(reinvestRateElement.value); + if (analysisReinvestRate > 0) { + reinvestRate = analysisReinvestRate; + } + } + if (analysisDaysElement && analysisDaysElement.value !== "" && analysisDaysElement.value !== "30") { + const analysisDays = parseInt(analysisDaysElement.value); + if (analysisDays > 0 && analysisDays !== 30) { + days = analysisDays; + } + } console.log("Parsed values - Reinvest Rate:", reinvestRate, "Days:", days); + console.log("Using values - Initial Principal:", initialPrincipal, "Daily Rate:", dailyRate); - // Get data from active coin trackers - const container = $('coinTrackerContainer'); - const trackerDivs = container.getElementsByClassName("coin-tracker"); + // If we have main calculator values, use those for initial investment and yield + // Otherwise fall back to coin tracker data + let totalInvestment = initialPrincipal; + let weightedAverageDailyYield = dailyRate; - // Initialize total investment and weighted yield - let totalInvestment = 0; - let weightedYieldSum = 0; + // Only use coin tracker data if main calculator has no values + if (totalInvestment === 0 || weightedAverageDailyYield === 0) { + // Get data from active coin trackers + const container = $('coinTrackerContainer'); + const trackerDivs = container.getElementsByClassName("coin-tracker"); + + // Initialize total investment and weighted yield + totalInvestment = 0; + let weightedYieldSum = 0; + + // Calculate total investment and weighted yield + Array.from(trackerDivs).forEach(div => { + if (div.dataset.active === "false") return; + const table = div.querySelector("table.coin-table"); + if (!table) return; - // Calculate total investment and weighted yield - Array.from(trackerDivs).forEach(div => { - if (div.dataset.active === "false") return; - const table = div.querySelector("table.coin-table"); - if (!table) return; - - const rows = table.querySelector("tbody").rows; - if (rows.length > 0) { - const lastRow = rows[rows.length - 1]; - const inputCurrent = lastRow.cells[2].querySelector("input"); - const currentVal = parseFloat(inputCurrent.value || "0") || 0; - const yieldInput = lastRow.cells[5].querySelector("input"); - const dailyYieldPercent = parseFloat(yieldInput.value || "0") || 0; - - totalInvestment += currentVal; - weightedYieldSum += (currentVal * dailyYieldPercent); - } - }); - - // Calculate weighted average daily yield - const weightedAverageDailyYield = totalInvestment > 0 ? (weightedYieldSum / totalInvestment) : 0; + const rows = table.querySelector("tbody").rows; + if (rows.length > 0) { + const lastRow = rows[rows.length - 1]; + const inputCurrent = lastRow.cells[2].querySelector("input"); + const currentVal = parseFloat(inputCurrent.value || "0") || 0; + const yieldInput = lastRow.cells[5].querySelector("input"); + const dailyYieldPercent = parseFloat(yieldInput.value || "0") || 0; + + totalInvestment += currentVal; + weightedYieldSum += (currentVal * dailyYieldPercent); + } + }); + + // Calculate weighted average daily yield + weightedAverageDailyYield = totalInvestment > 0 ? (weightedYieldSum / totalInvestment) : 0; + } console.log("Analysis values - Reinvest Rate:", reinvestRate, "Days:", days); console.log("Total Investment:", totalInvestment, "Weighted Yield:", weightedAverageDailyYield); @@ -1617,7 +1639,7 @@ document.getElementById('createBackupBtn').textContent = 'Creating backup...'; // Make request to API - fetch(`/api/backup/create${backupName ? `?name=${encodeURIComponent(backupName)}` : ''}`) + fetch(`http://localhost:3001/api/backup/create${backupName ? `?name=${encodeURIComponent(backupName)}` : ''}`) .then(response => { if (!response.ok) { throw new Error(`Network error: ${response.status}`); @@ -1648,7 +1670,7 @@ // Function to load the list of available backups const loadBackupList = () => { - fetch('/api/backup/list') + fetch('http://localhost:3001/api/backup/list') .then(response => { if (!response.ok) { throw new Error('Network response was not ok'); @@ -1773,7 +1795,7 @@ return; } - fetch(`/api/backup/restore/${filename}`) + fetch(`http://localhost:3001/api/backup/restore/${filename}`) .then(response => { if (!response.ok) { throw new Error('Network response was not ok'); diff --git a/html/rechner/server.js b/html/rechner/server.js index 1c6f678..1e94295 100644 --- a/html/rechner/server.js +++ b/html/rechner/server.js @@ -5,12 +5,20 @@ const fs = require('fs'); const path = require('path'); const cron = require('node-cron'); const app = express(); -const port = 3000; +const port = 3001; // Serve static files from the current directory app.use(express.static(__dirname)); app.use(bodyParser.json()); +// Add CORS middleware +app.use((req, res, next) => { + res.header('Access-Control-Allow-Origin', '*'); + res.header('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS'); + res.header('Access-Control-Allow-Headers', 'Origin, X-Requested-With, Content-Type, Accept'); + next(); +}); + // Create backups directory if it doesn't exist const backupDir = path.join(__dirname, 'backups'); if (!fs.existsSync(backupDir)) {