From b213071251fdd92f68d5af5441793e26368edf30 Mon Sep 17 00:00:00 2001 From: DiTus Date: Thu, 26 Feb 2026 15:21:15 +0100 Subject: [PATCH] Clean up and finalize indicator persistence on TF change - Remove multiple delayed redraw calls from app.js (now handled in chart.js) - Remove excessive diagnostic logging throughout codebase - Keep useful debug warning for old indicators-panel.js module - Indicator list, parameters, and visibility now persist across TF switches - Indicators automatically recalculate with new TF candles when they load --- src/api/dashboard/static/js/app.js | 29 +------- .../static/js/ui/indicators-panel-new.js | 72 +++---------------- 2 files changed, 10 insertions(+), 91 deletions(-) diff --git a/src/api/dashboard/static/js/app.js b/src/api/dashboard/static/js/app.js index c4ff4ce..38f9f47 100644 --- a/src/api/dashboard/static/js/app.js +++ b/src/api/dashboard/static/js/app.js @@ -64,8 +64,7 @@ window.deleteSavedSimulation = deleteSavedSimulation; window.clearSimulationResults = clearSimulationResults; window.updateTimeframeDisplay = updateTimeframeDisplay; window.renderIndicatorList = function() { - // Legacy function - replaced by initIndicatorPanel - window.initIndicatorPanel(); + // This function is no longer needed for sidebar indicators }; // Export init function for global access @@ -88,30 +87,6 @@ document.addEventListener('DOMContentLoaded', async () => { await loadStrategies(); - // Initialize new indicator panel + // Initialize indicator panel window.initIndicatorPanel(); - - const originalSwitchTimeframe = window.dashboard.switchTimeframe.bind(window.dashboard); - window.dashboard.switchTimeframe = function(interval) { - originalSwitchTimeframe(interval); - - // Force redraw indicators after TF switch with multiple attempts - setTimeout(() => { - if (window.drawIndicatorsOnChart) { - window.drawIndicatorsOnChart(); - } - }, 100); - - setTimeout(() => { - if (window.drawIndicatorsOnChart) { - window.drawIndicatorsOnChart(); - } - }, 300); - - setTimeout(() => { - if (window.drawIndicatorsOnChart) { - window.drawIndicatorsOnChart(); - } - }, 500); - }; }); diff --git a/src/api/dashboard/static/js/ui/indicators-panel-new.js b/src/api/dashboard/static/js/ui/indicators-panel-new.js index 4cd2cfd..3ed9de3 100644 --- a/src/api/dashboard/static/js/ui/indicators-panel-new.js +++ b/src/api/dashboard/static/js/ui/indicators-panel-new.js @@ -87,15 +87,10 @@ function groupPlotsByColor(plots) { } export function initIndicatorPanel() { - console.log('[IndicatorPanel] Initializing...'); - console.log('[IndicatorPanel] Current activeIndicators count:', activeIndicators.length); - console.trace('[IndicatorPanel] initIndicatorPanel call stack:'); renderIndicatorPanel(); - console.log('[IndicatorPanel] Initialized'); } export function getActiveIndicators() { - console.log('getActiveIndicators:', activeIndicators.map(i => ({id: i.id, visible: i.visible}))); return activeIndicators; } @@ -110,12 +105,9 @@ export function setActiveIndicators(indicators) { export function renderIndicatorPanel() { const container = document.getElementById('indicatorPanel'); if (!container) { - console.error('[IndicatorPanel] Container #indicatorPanel not found!'); return; } - console.log('[IndicatorPanel] Rendering panel, searchQuery:', searchQuery, 'selectedCategory:', selectedCategory); - const available = getAvailableIndicators(); const catalog = available.filter(ind => { if (searchQuery && !ind.name.toLowerCase().includes(searchQuery.toLowerCase())) return false; @@ -124,8 +116,10 @@ export function renderIndicatorPanel() { const cat = CATEGORY_MAP[ind.type] || 'trend'; return cat === selectedCategory; }); - - console.log("[IndicatorPanel] Total indicators:", available.length, "Filtered to:", catalog.length); + if (selectedCategory === 'favorites') return false; + const cat = CATEGORY_MAP[ind.type] || 'trend'; + return cat === selectedCategory; + }); const favoriteIds = new Set(userPresets.favorites || []); @@ -377,7 +371,6 @@ function setupEventListeners() { e.stopPropagation(); const type = addBtn.dataset.type; if (type && window.addIndicator) { - console.log('[IndicatorPanel] Add button clicked for type:', type); window.addIndicator(type); } return; @@ -496,26 +489,15 @@ window.clearAllIndicators = function() { } function removeIndicatorById(id) { - console.log(`[removeIndicatorById] Attempting to remove indicator: ${id}`); - console.log('Call stack:', console.trace()); - const idx = activeIndicators.findIndex(a => a.id === id); - if (idx < 0) { - console.warn(`[removeIndicatorById] Indicator ${id} not found in array`); - return; - } - - console.log(`[removeIndicatorById] Removing indicator at index ${idx}`); + if (idx < 0) return; activeIndicators[idx].series?.forEach(s => { try { window.dashboard?.chart?.removeSeries(s); } catch(e) {} }); - // Remove the specific indicator, don't clear the whole array activeIndicators.splice(idx, 1); - console.log(`[removeIndicatorById] After removal, array now has ${activeIndicators.length} indicators`); - if (configuringId === id) { configuringId = null; } @@ -639,9 +621,6 @@ function addIndicator(type) { params[input.name] = input.default; }); - console.log(`[addIndicator] Adding ${id} to array, current count: ${activeIndicators.length}`); - console.trace('Call stack:'); - activeIndicators.push({ id, type, @@ -652,8 +631,6 @@ function addIndicator(type) { visible: true }); - console.log(`[addIndicator] After push, array count: ${activeIndicators.length}`); - // Don't set configuringId so indicators are NOT expanded by default renderIndicatorPanel(); drawIndicatorsOnChart(); @@ -664,19 +641,15 @@ function saveUserPresets() { } function renderIndicatorOnPane(indicator, meta, instance, candles, paneIndex, lineStyleMap) { - console.log(`renderIndicatorOnPane for ${indicator.id}, candles.length=${candles.length}, paneIndex=${paneIndex}`); - // Recalculate with current TF candles const results = instance.calculate(candles); - console.log(`Calculated results for ${indicator.id}:`, results?.length || 0, 'values'); // Clear previous series for this indicator if (indicator.series && indicator.series.length > 0) { indicator.series.forEach(s => { try { window.dashboard.chart.removeSeries(s); - console.log(`Removed series for ${indicator.id}`); - } catch(e) { console.error('Error removing series:', e); } + } catch(e) {} }); } indicator.series = []; @@ -691,10 +664,7 @@ function renderIndicatorOnPane(indicator, meta, instance, candles, paneIndex, li meta.plots.forEach((plot, plotIdx) => { if (isObjectResult) { const hasData = results.some(r => r && r[plot.id] !== undefined && r[plot.id] !== null); - if (!hasData) { - console.log(`No data for plot ${plot.id} in ${indicator.id}`); - return; - } + if (!hasData) return; } const plotColor = indicator.params[`_color_${plotIdx}`] || plot.color || '#2962ff'; @@ -716,7 +686,6 @@ function renderIndicatorOnPane(indicator, meta, instance, candles, paneIndex, li } } - console.log(`Plot ${plot.id} has ${data.length} data points`); if (data.length === 0) return; let series; @@ -805,26 +774,14 @@ export function drawIndicatorsOnChart() { return; } - if (activeIndicators.length === 0) { - console.error('⚠️ drawIndicatorsOnChart: activeIndicators is EMPTY!'); - console.error('⚠️ This means indicators were lost during TF switch!'); - console.trace('Call stack showing where we are:'); - } - const currentInterval = window.dashboard.currentInterval; const candles = window.dashboard.allData.get(currentInterval); - console.log(`drawIndicatorsOnChart called: interval=${currentInterval}, candles=${candles?.length || 0}, activeIndicators=${activeIndicators.length}`); - console.log('Active indicators visibility:', activeIndicators.map(i => ({id: i.id, visible: i.visible}))); - console.trace('[drawIndicatorsOnChart] Call stack:'); - if (!candles || candles.length === 0) { return; } - console.log('[drawIndicatorsOnChart] Removing series complete, remaining indicators:', activeIndicators.length); - - // First, remove all existing series + // Remove all existing series activeIndicators.forEach(ind => { ind.series?.forEach(s => { try { window.dashboard.chart.removeSeries(s); } catch(e) {} @@ -832,8 +789,6 @@ export function drawIndicatorsOnChart() { ind.series = []; }); - console.log('[drawIndicatorsOnChart] Series arrays cleared, indicator count:', activeIndicators.length); - const lineStyleMap = { 'solid': LightweightCharts.LineStyle.Solid, 'dotted': LightweightCharts.LineStyle.Dotted, @@ -848,9 +803,7 @@ export function drawIndicatorsOnChart() { // Process all indicators, filtering by visibility activeIndicators.forEach(ind => { - console.log(`Checking indicator ${ind.id} for rendering - visible=${ind.visible}, type=${typeof ind.visible}`); if (ind.visible === false || ind.visible === 'false') { - console.log(`Skipping invisible indicator ${ind.id}`); return; } @@ -867,8 +820,6 @@ export function drawIndicatorsOnChart() { } }); - console.log('Rendering indicators:', { overlayCount: overlayIndicators.length, paneCount: paneIndicators.length }); - // Calculate heights based on VISIBLE indicators only const totalPanes = 1 + paneIndicators.length; const mainPaneHeight = paneIndicators.length > 0 ? 60 : 100; @@ -876,28 +827,21 @@ export function drawIndicatorsOnChart() { window.dashboard.chart.panes()[0]?.setHeight(mainPaneHeight); - let totalSeriesCreated = 0; overlayIndicators.forEach(({ indicator, meta, instance }) => { - const oldLen = indicator.series.length; renderIndicatorOnPane(indicator, meta, instance, candles, 0, lineStyleMap); - totalSeriesCreated += indicator.series.length - oldLen; }); paneIndicators.forEach(({ indicator, meta, instance }, idx) => { const paneIndex = nextPaneIndex++; indicatorPanes.set(indicator.id, paneIndex); - const oldLen = indicator.series.length; renderIndicatorOnPane(indicator, meta, instance, candles, paneIndex, lineStyleMap); - totalSeriesCreated += indicator.series.length - oldLen; const pane = window.dashboard.chart.panes()[paneIndex]; if (pane) { pane.setHeight(paneHeight); } }); - - console.log(`drawIndicatorsOnChart complete - created ${totalSeriesCreated} series for ${overlayIndicators.length + paneIndicators.length} visible indicators`); } function resetIndicator(id) {