diff --git a/application_events.json b/application_events.json
index e9f355d..0c42a82 100644
--- a/application_events.json
+++ b/application_events.json
@@ -7090,8 +7090,78 @@
"trigger_variable": null,
"auto_started": true
}
+ },
+ {
+ "timestamp": "2025-08-15T18:58:33.217127",
+ "level": "info",
+ "event_type": "plot_session_created",
+ "message": "Plot session 'UR29' created and started",
+ "details": {
+ "session_id": "plot_1_1755277113217_7",
+ "variables": [
+ "UR29_Brix",
+ "UR29_ma",
+ "AUX Blink_1.0S",
+ "AUX Blink_1.6S"
+ ],
+ "time_window": 36,
+ "trigger_variable": null,
+ "auto_started": true
+ }
+ },
+ {
+ "timestamp": "2025-08-15T19:01:07.918276",
+ "level": "info",
+ "event_type": "plot_session_created",
+ "message": "Plot session 'Clock' created and started",
+ "details": {
+ "session_id": "Clock_1755277267917_8",
+ "variables": [
+ "AUX Blink_1.0S",
+ "AUX Blink_1.6S"
+ ],
+ "time_window": 10,
+ "trigger_variable": null,
+ "auto_started": true
+ }
+ },
+ {
+ "timestamp": "2025-08-15T19:05:09.401035",
+ "level": "info",
+ "event_type": "plot_session_created",
+ "message": "Plot session 'UR29' created and started",
+ "details": {
+ "session_id": "plot_1_1755277509401_9",
+ "variables": [
+ "UR29_Brix",
+ "UR29_ma",
+ "AUX Blink_1.0S",
+ "AUX Blink_1.6S"
+ ],
+ "time_window": 36,
+ "trigger_variable": null,
+ "auto_started": true
+ }
+ },
+ {
+ "timestamp": "2025-08-15T19:06:20.284691",
+ "level": "info",
+ "event_type": "plot_session_created",
+ "message": "Plot session 'UR29' created and started",
+ "details": {
+ "session_id": "plot_1_1755277580284_10",
+ "variables": [
+ "UR29_Brix",
+ "UR29_ma",
+ "AUX Blink_1.0S",
+ "AUX Blink_1.6S"
+ ],
+ "time_window": 36,
+ "trigger_variable": null,
+ "auto_started": true
+ }
}
],
- "last_updated": "2025-08-15T18:54:24.318797",
- "total_entries": 579
+ "last_updated": "2025-08-15T19:06:20.284691",
+ "total_entries": 583
}
\ No newline at end of file
diff --git a/frontend/src/components/ChartjsPlot.jsx b/frontend/src/components/ChartjsPlot.jsx
index 7435eec..cb1de3c 100644
--- a/frontend/src/components/ChartjsPlot.jsx
+++ b/frontend/src/components/ChartjsPlot.jsx
@@ -251,35 +251,6 @@ const ChartjsPlot = ({ session, height = '400px' }) => {
return false;
}, [session]);
- // Diagnostic function to help identify issues
- const runDiagnostics = useCallback(() => {
- console.log('🔍 Chart Diagnostics:', {
- chartExists: !!chartRef.current,
- canvasExists: !!canvasRef.current,
- sessionId: session?.session_id,
- sessionActive: session?.is_active,
- sessionPaused: session?.is_paused,
- health: chartHealthRef.current,
- datasets: chartRef.current?.data?.datasets?.length || 0,
- realtimeConfig: !!chartRef.current?.options?.scales?.x?.realtime
- });
-
- // Check for common issues
- const issues = [];
- if (!chartRef.current) issues.push('Chart not initialized');
- if (!session?.is_active) issues.push('Session not active');
- if (session?.is_paused) issues.push('Session is paused');
- if (chartHealthRef.current.consecutiveErrors > 5) issues.push(`${chartHealthRef.current.consecutiveErrors} consecutive errors`);
-
- if (issues.length > 0) {
- console.warn('⚠️ Issues detected:', issues);
- } else {
- console.log('✅ No issues detected');
- }
-
- return issues;
- }, [session]);
-
// Load historical data from CSV files
const loadHistoricalData = useCallback(async (variables, timeWindow) => {
try {
@@ -1872,48 +1843,6 @@ const ChartjsPlot = ({ session, height = '400px' }) => {
🔄 Reset Zoom
- {/* Auto-recovery button when chart health is poor */}
- {!chartHealthRef.current.isHealthy && (
- <>
-
-
-
- >
- )}
)}
diff --git a/frontend/src/components/PlotRealtimeSession.jsx b/frontend/src/components/PlotRealtimeSession.jsx
index 46e1e6a..6eb0bf0 100644
--- a/frontend/src/components/PlotRealtimeSession.jsx
+++ b/frontend/src/components/PlotRealtimeSession.jsx
@@ -522,12 +522,6 @@ export default function PlotRealtimeSession({
<> | Trigger: {localConfig.trigger_variable}>
)}
-
- Tab: {browserTabId}
- {actualSessionId && actualSessionId !== plotDefinition.id && (
- <> | Session: {actualSessionId.substring(0, 40)}...>
- )}
-
diff --git a/frontend/src/components/TabCoordinationDemo.jsx b/frontend/src/components/TabCoordinationDemo.jsx
deleted file mode 100644
index 0e5b3b3..0000000
--- a/frontend/src/components/TabCoordinationDemo.jsx
+++ /dev/null
@@ -1,62 +0,0 @@
-import React from 'react'
-import { Box, Text, Badge, VStack, HStack, useColorModeValue } from '@chakra-ui/react'
-import { getTabCoordinator } from '../utils/TabCoordinator'
-
-/**
- * TabCoordinationDemo - Componente de demostración para mostrar el estado de coordinación
- */
-export default function TabCoordinationDemo() {
- const [coordinator, setCoordinator] = React.useState(null)
- const [isLeader, setIsLeader] = React.useState(false)
- const [tabInfo, setTabInfo] = React.useState({})
- const bgColor = useColorModeValue('gray.50', 'gray.800')
-
- React.useEffect(() => {
- const coord = getTabCoordinator()
- setCoordinator(coord)
- setIsLeader(coord.getIsLeader())
- setTabInfo({
- tabId: coord.tabId,
- isLeader: coord.getIsLeader()
- })
-
- // Subscribirse a cambios de liderazgo
- const unsubscribe = coord.subscribe('demo', ({ type, data }) => {
- if (type === 'leadership_change') {
- setIsLeader(data.isLeader)
- setTabInfo(prev => ({
- ...prev,
- isLeader: data.isLeader
- }))
- }
- })
-
- return unsubscribe
- }, [])
-
- if (!coordinator) {
- return Loading coordinator...
- }
-
- return (
-
-
-
- 🔗 Tab Coordination Status
-
- {isLeader ? '👑 Leader' : '👥 Follower'}
-
-
-
- Tab ID: {tabInfo.tabId}
-
-
- Role: {isLeader ? 'Making real connections to backend' : 'Receiving data from leader tab'}
-
-
- Only the leader tab creates actual HTTP connections. Other tabs receive data via BroadcastChannel.
-
-
-
- )
-}
diff --git a/frontend/src/pages/Dashboard.jsx b/frontend/src/pages/Dashboard.jsx
index 33a1ea5..0d1f537 100644
--- a/frontend/src/pages/Dashboard.jsx
+++ b/frontend/src/pages/Dashboard.jsx
@@ -54,7 +54,6 @@ import LayoutObjectFieldTemplate from '../components/rjsf/LayoutObjectFieldTempl
import { VariableProvider, useVariableContext } from '../contexts/VariableContext'
import * as api from '../services/api'
import { useCoordinatedPolling } from '../hooks/useCoordinatedConnection'
-import TabCoordinationDemo from '../components/TabCoordinationDemo'
// Collapsible Array Items Form - Each item in the array is individually collapsible
function CollapsibleArrayItemsForm({ data, schema, uiSchema, onSave, title, icon, getItemLabel }) {
@@ -1131,9 +1130,6 @@ function DashboardContent() {
)}
- {/* Tab Coordination Demo */}
-
-