From 16355c4106dd0c9c4871ee5f0f48d972063af5d4 Mon Sep 17 00:00:00 2001 From: Miguel Date: Thu, 14 Aug 2025 16:02:10 +0200 Subject: [PATCH] feat: Update application events and system state management with new plot session events, enhanced plot definitions, and improved PlotManager component for better session control and configuration handling. --- application_events.json | 582 +++++++++++++++++- config/data/plot_definitions.json | 2 +- config/data/plot_variables.json | 20 +- frontend/src/components/PlotManagerSimple.jsx | 298 ++++++--- .../src/components/PlotRealtimeSession.jsx | 67 +- system_state.json | 6 +- 6 files changed, 879 insertions(+), 96 deletions(-) diff --git a/application_events.json b/application_events.json index 55c0ddc..37aca15 100644 --- a/application_events.json +++ b/application_events.json @@ -911,8 +911,586 @@ "trigger_variable": null, "auto_started": true } + }, + { + "timestamp": "2025-08-14T15:05:13.082016", + "level": "info", + "event_type": "plot_session_created", + "message": "Plot session 'UR29' created and started", + "details": { + "session_id": "plot_1", + "variables": [ + "UR29_Brix", + "UR29_ma" + ], + "time_window": 20, + "trigger_variable": null, + "auto_started": true + } + }, + { + "timestamp": "2025-08-14T15:05:19.544702", + "level": "info", + "event_type": "plot_session_created", + "message": "Plot session 'UR29' created and started", + "details": { + "session_id": "plot_1", + "variables": [ + "UR29_Brix", + "UR29_ma" + ], + "time_window": 20, + "trigger_variable": null, + "auto_started": true + } + }, + { + "timestamp": "2025-08-14T15:05:23.384537", + "level": "info", + "event_type": "plot_session_created", + "message": "Plot session 'UR29' created and started", + "details": { + "session_id": "plot_1", + "variables": [ + "UR29_Brix", + "UR29_ma" + ], + "time_window": 20, + "trigger_variable": null, + "auto_started": true + } + }, + { + "timestamp": "2025-08-14T15:05:25.630774", + "level": "info", + "event_type": "plot_session_created", + "message": "Plot session 'UR29' created and started", + "details": { + "session_id": "plot_1", + "variables": [ + "UR29_Brix", + "UR29_ma" + ], + "time_window": 20, + "trigger_variable": null, + "auto_started": true + } + }, + { + "timestamp": "2025-08-14T15:28:19.815284", + "level": "info", + "event_type": "application_started", + "message": "Application initialization completed successfully", + "details": {} + }, + { + "timestamp": "2025-08-14T15:28:19.884191", + "level": "info", + "event_type": "dataset_activated", + "message": "Dataset activated: DAR", + "details": { + "dataset_id": "DAR", + "variables_count": 2, + "streaming_count": 2, + "prefix": "gateway_phoenix" + } + }, + { + "timestamp": "2025-08-14T15:28:19.888188", + "level": "info", + "event_type": "csv_recording_started", + "message": "CSV recording started: 1 datasets activated", + "details": { + "activated_datasets": 1, + "total_datasets": 3 + } + }, + { + "timestamp": "2025-08-14T15:28:19.891188", + "level": "info", + "event_type": "udp_streaming_started", + "message": "UDP streaming to PlotJuggler started", + "details": { + "udp_host": "127.0.0.1", + "udp_port": 9870, + "datasets_available": 3 + } + }, + { + "timestamp": "2025-08-14T15:28:19.913733", + "level": "error", + "event_type": "csv_cleanup_failed", + "message": "CSV cleanup failed: 'max_hours'", + "details": {} + }, + { + "timestamp": "2025-08-14T15:28:27.534594", + "level": "info", + "event_type": "plot_session_created", + "message": "Plot session 'UR29' created and started", + "details": { + "session_id": "plot_1", + "variables": [ + "UR29_Brix", + "UR29_ma" + ], + "time_window": 20, + "trigger_variable": null, + "auto_started": true + } + }, + { + "timestamp": "2025-08-14T15:28:41.233200", + "level": "info", + "event_type": "plot_session_created", + "message": "Plot session 'UR29' created and started", + "details": { + "session_id": "plot_1", + "variables": [ + "UR29_Brix", + "UR29_ma" + ], + "time_window": 20, + "trigger_variable": null, + "auto_started": true + } + }, + { + "timestamp": "2025-08-14T15:33:53.298915", + "level": "info", + "event_type": "application_started", + "message": "Application initialization completed successfully", + "details": {} + }, + { + "timestamp": "2025-08-14T15:33:53.350464", + "level": "info", + "event_type": "dataset_activated", + "message": "Dataset activated: DAR", + "details": { + "dataset_id": "DAR", + "variables_count": 2, + "streaming_count": 2, + "prefix": "gateway_phoenix" + } + }, + { + "timestamp": "2025-08-14T15:33:53.353473", + "level": "info", + "event_type": "csv_recording_started", + "message": "CSV recording started: 1 datasets activated", + "details": { + "activated_datasets": 1, + "total_datasets": 3 + } + }, + { + "timestamp": "2025-08-14T15:33:53.357410", + "level": "info", + "event_type": "udp_streaming_started", + "message": "UDP streaming to PlotJuggler started", + "details": { + "udp_host": "127.0.0.1", + "udp_port": 9870, + "datasets_available": 3 + } + }, + { + "timestamp": "2025-08-14T15:33:53.379922", + "level": "error", + "event_type": "csv_cleanup_failed", + "message": "CSV cleanup failed: 'max_hours'", + "details": {} + }, + { + "timestamp": "2025-08-14T15:34:05.357970", + "level": "info", + "event_type": "plot_session_created", + "message": "Plot session 'UR29' created and started", + "details": { + "session_id": "plot_1", + "variables": [ + "UR29_Brix", + "UR29_ma" + ], + "time_window": 20, + "trigger_variable": null, + "auto_started": true + } + }, + { + "timestamp": "2025-08-14T15:49:43.574411", + "level": "info", + "event_type": "application_started", + "message": "Application initialization completed successfully", + "details": {} + }, + { + "timestamp": "2025-08-14T15:49:43.623131", + "level": "info", + "event_type": "dataset_activated", + "message": "Dataset activated: DAR", + "details": { + "dataset_id": "DAR", + "variables_count": 2, + "streaming_count": 2, + "prefix": "gateway_phoenix" + } + }, + { + "timestamp": "2025-08-14T15:49:43.626396", + "level": "info", + "event_type": "csv_recording_started", + "message": "CSV recording started: 1 datasets activated", + "details": { + "activated_datasets": 1, + "total_datasets": 3 + } + }, + { + "timestamp": "2025-08-14T15:49:43.628399", + "level": "info", + "event_type": "udp_streaming_started", + "message": "UDP streaming to PlotJuggler started", + "details": { + "udp_host": "127.0.0.1", + "udp_port": 9870, + "datasets_available": 3 + } + }, + { + "timestamp": "2025-08-14T15:49:43.654855", + "level": "error", + "event_type": "csv_cleanup_failed", + "message": "CSV cleanup failed: 'max_hours'", + "details": {} + }, + { + "timestamp": "2025-08-14T15:49:51.181481", + "level": "info", + "event_type": "plot_session_created", + "message": "Plot session 'UR29' created and started", + "details": { + "session_id": "plot_1", + "variables": [ + "UR29_Brix", + "UR29_ma" + ], + "time_window": 20, + "trigger_variable": null, + "auto_started": true + } + }, + { + "timestamp": "2025-08-14T15:50:01.495815", + "level": "info", + "event_type": "plot_session_created", + "message": "Plot session 'UR29' created and started", + "details": { + "session_id": "plot_1", + "variables": [ + "UR29_Brix", + "UR29_ma" + ], + "time_window": 20, + "trigger_variable": null, + "auto_started": true + } + }, + { + "timestamp": "2025-08-14T15:50:11.269643", + "level": "info", + "event_type": "plot_session_created", + "message": "Plot session 'UR29' created and started", + "details": { + "session_id": "plot_1", + "variables": [ + "UR29_Brix", + "UR29_ma" + ], + "time_window": 20, + "trigger_variable": null, + "auto_started": true + } + }, + { + "timestamp": "2025-08-14T15:50:25.266473", + "level": "info", + "event_type": "plot_session_created", + "message": "Plot session 'UR29' created and started", + "details": { + "session_id": "plot_1", + "variables": [ + "UR29_Brix", + "UR29_ma" + ], + "time_window": 20, + "trigger_variable": null, + "auto_started": true + } + }, + { + "timestamp": "2025-08-14T15:51:28.701739", + "level": "info", + "event_type": "plot_session_created", + "message": "Plot session 'UR29' created and started", + "details": { + "session_id": "plot_1", + "variables": [ + "UR29_Brix", + "UR29_ma" + ], + "time_window": 40, + "trigger_variable": null, + "auto_started": true + } + }, + { + "timestamp": "2025-08-14T15:51:37.177827", + "level": "info", + "event_type": "plot_session_created", + "message": "Plot session 'UR29' created and started", + "details": { + "session_id": "plot_1", + "variables": [ + "UR29_Brix", + "UR29_ma" + ], + "time_window": 40, + "trigger_variable": null, + "auto_started": true + } + }, + { + "timestamp": "2025-08-14T15:52:00.981320", + "level": "info", + "event_type": "plot_session_created", + "message": "Plot session 'UR29' created and started", + "details": { + "session_id": "plot_1", + "variables": [ + "UR29_Brix", + "UR29_ma" + ], + "time_window": 40, + "trigger_variable": null, + "auto_started": true + } + }, + { + "timestamp": "2025-08-14T15:54:01.861161", + "level": "info", + "event_type": "plot_session_created", + "message": "Plot session 'UR29' created and started", + "details": { + "session_id": "plot_1", + "variables": [ + "UR29_Brix", + "UR29_ma" + ], + "time_window": 40, + "trigger_variable": null, + "auto_started": true + } + }, + { + "timestamp": "2025-08-14T15:54:09.237860", + "level": "info", + "event_type": "plot_session_created", + "message": "Plot session 'UR29' created and started", + "details": { + "session_id": "plot_1", + "variables": [ + "UR29_Brix", + "UR29_ma" + ], + "time_window": 20, + "trigger_variable": null, + "auto_started": true + } + }, + { + "timestamp": "2025-08-14T15:54:21.495214", + "level": "info", + "event_type": "plot_session_created", + "message": "Plot session 'UR29' created and started", + "details": { + "session_id": "plot_1", + "variables": [ + "UR29_Brix", + "UR29_ma" + ], + "time_window": 20, + "trigger_variable": null, + "auto_started": true + } + }, + { + "timestamp": "2025-08-14T15:58:52.564607", + "level": "info", + "event_type": "application_started", + "message": "Application initialization completed successfully", + "details": {} + }, + { + "timestamp": "2025-08-14T15:58:52.631147", + "level": "info", + "event_type": "dataset_activated", + "message": "Dataset activated: DAR", + "details": { + "dataset_id": "DAR", + "variables_count": 2, + "streaming_count": 2, + "prefix": "gateway_phoenix" + } + }, + { + "timestamp": "2025-08-14T15:58:52.636144", + "level": "info", + "event_type": "csv_recording_started", + "message": "CSV recording started: 1 datasets activated", + "details": { + "activated_datasets": 1, + "total_datasets": 3 + } + }, + { + "timestamp": "2025-08-14T15:58:52.640144", + "level": "info", + "event_type": "udp_streaming_started", + "message": "UDP streaming to PlotJuggler started", + "details": { + "udp_host": "127.0.0.1", + "udp_port": 9870, + "datasets_available": 3 + } + }, + { + "timestamp": "2025-08-14T15:58:52.661477", + "level": "error", + "event_type": "csv_cleanup_failed", + "message": "CSV cleanup failed: 'max_hours'", + "details": {} + }, + { + "timestamp": "2025-08-14T16:00:00.366424", + "level": "error", + "event_type": "csv_cleanup_failed", + "message": "CSV cleanup failed: 'max_hours'", + "details": {} + }, + { + "timestamp": "2025-08-14T16:00:38.957148", + "level": "info", + "event_type": "application_started", + "message": "Application initialization completed successfully", + "details": {} + }, + { + "timestamp": "2025-08-14T16:00:39.022563", + "level": "info", + "event_type": "dataset_activated", + "message": "Dataset activated: DAR", + "details": { + "dataset_id": "DAR", + "variables_count": 2, + "streaming_count": 2, + "prefix": "gateway_phoenix" + } + }, + { + "timestamp": "2025-08-14T16:00:39.027564", + "level": "info", + "event_type": "csv_recording_started", + "message": "CSV recording started: 1 datasets activated", + "details": { + "activated_datasets": 1, + "total_datasets": 3 + } + }, + { + "timestamp": "2025-08-14T16:00:39.029563", + "level": "info", + "event_type": "udp_streaming_started", + "message": "UDP streaming to PlotJuggler started", + "details": { + "udp_host": "127.0.0.1", + "udp_port": 9870, + "datasets_available": 3 + } + }, + { + "timestamp": "2025-08-14T16:00:39.084155", + "level": "error", + "event_type": "csv_cleanup_failed", + "message": "CSV cleanup failed: 'max_hours'", + "details": {} + }, + { + "timestamp": "2025-08-14T16:01:29.356193", + "level": "info", + "event_type": "plot_session_created", + "message": "Plot session 'UR29' created and started", + "details": { + "session_id": "plot_1", + "variables": [ + "UR29_Brix", + "UR29_ma" + ], + "time_window": 20, + "trigger_variable": null, + "auto_started": true + } + }, + { + "timestamp": "2025-08-14T16:01:35.624303", + "level": "info", + "event_type": "plot_session_created", + "message": "Plot session 'UR29' created and started", + "details": { + "session_id": "plot_1", + "variables": [ + "UR29_Brix", + "UR29_ma" + ], + "time_window": 20, + "trigger_variable": null, + "auto_started": true + } + }, + { + "timestamp": "2025-08-14T16:01:44.863171", + "level": "info", + "event_type": "plot_session_created", + "message": "Plot session 'UR29' created and started", + "details": { + "session_id": "plot_1", + "variables": [ + "UR29_Brix", + "UR29_ma" + ], + "time_window": 20, + "trigger_variable": null, + "auto_started": true + } + }, + { + "timestamp": "2025-08-14T16:01:52.736771", + "level": "info", + "event_type": "plot_session_created", + "message": "Plot session 'UR29' created and started", + "details": { + "session_id": "plot_1", + "variables": [ + "UR29_Brix", + "UR29_ma" + ], + "time_window": 20, + "trigger_variable": null, + "auto_started": true + } } ], - "last_updated": "2025-08-14T15:04:12.217187", - "total_entries": 90 + "last_updated": "2025-08-14T16:01:52.736771", + "total_entries": 137 } \ No newline at end of file diff --git a/config/data/plot_definitions.json b/config/data/plot_definitions.json index 6c600dc..1ba9e6c 100644 --- a/config/data/plot_definitions.json +++ b/config/data/plot_definitions.json @@ -5,7 +5,7 @@ "line_tension": 0, "name": "UR29", "point_hover_radius": 4, - "point_radius": 1, + "point_radius": 4, "stepped": true, "time_window": 20, "trigger_enabled": false, diff --git a/config/data/plot_variables.json b/config/data/plot_variables.json index 3fac8b2..9626833 100644 --- a/config/data/plot_variables.json +++ b/config/data/plot_variables.json @@ -4,20 +4,20 @@ "plot_id": "plot_1", "variables": [ { - "color": "#3498db", - "enabled": true, - "label": "Brix", - "line_width": 2, "variable_name": "UR29_Brix", - "y_axis": "left" + "label": "Brix", + "color": "#3498db", + "line_width": 2, + "y_axis": "left", + "enabled": true }, { - "color": "#e74c3c", - "enabled": true, - "label": "ma", - "line_width": 2, "variable_name": "UR29_ma", - "y_axis": "left" + "label": "ma", + "color": "#dce740", + "line_width": 2, + "y_axis": "left", + "enabled": true } ] } diff --git a/frontend/src/components/PlotManagerSimple.jsx b/frontend/src/components/PlotManagerSimple.jsx index 420610c..a1c18d9 100644 --- a/frontend/src/components/PlotManagerSimple.jsx +++ b/frontend/src/components/PlotManagerSimple.jsx @@ -35,13 +35,16 @@ import { useVariableContext } from '../contexts/VariableContext' import * as api from '../services/api' // Collapsible Plot Items Form - Each item in the array is individually collapsible -function CollapsiblePlotItemsForm({ data, schema, uiSchema, onSave, title, icon, getItemLabel }) { +function CollapsiblePlotItemsForm({ data, schema, uiSchema, onSave, title, icon, getItemLabel, isExpanded, onToggleExpansion }) { const [formData, setFormData] = useState(data) const [expandedItems, setExpandedItems] = useState(new Set()) useEffect(() => { - setFormData(data) - }, [data]) + // Solo actualizar formData si data realmente cambió en contenido + if (JSON.stringify(data) !== JSON.stringify(formData)) { + setFormData(data) + } + }, [data]) // Removed formData from dependencies to avoid infinite loop if (!schema || !formData) { return ( @@ -97,8 +100,13 @@ function CollapsiblePlotItemsForm({ data, schema, uiSchema, onSave, title, icon, setExpandedItems(newExpanded) } - const saveChanges = () => { - onSave(formData) + const saveChanges = async () => { + try { + await onSave(formData) + // No hacer nada con la expansión aquí - será manejado por el componente padre + } catch (error) { + console.error('Error saving:', error) + } } // Get item schema from the array schema @@ -119,6 +127,17 @@ function CollapsiblePlotItemsForm({ data, schema, uiSchema, onSave, title, icon, + {/* Si se proporciona toggle de expansión externa, agregar botón de colapso */} + {onToggleExpansion && ( + + )} @@ -129,76 +148,144 @@ function CollapsiblePlotItemsForm({ data, schema, uiSchema, onSave, title, icon, - - {items.length === 0 ? ( - - - No items configured yet - - - - ) : ( - - {items.map((item, index) => { - const isExpanded = expandedItems.has(index) - const itemLabel = getItemLabel ? getItemLabel(item) : (item.name || item.id || `Item ${index + 1}`) - - return ( - - - - + {/* Usar Collapse si se proporciona estado de expansión externo */} + {onToggleExpansion ? ( + + + {items.length === 0 ? ( + + + No items configured yet + + + + ) : ( + + {items.map((item, index) => { + const isItemExpanded = expandedItems.has(index) + const itemLabel = getItemLabel ? getItemLabel(item) : (item.name || item.id || `Item ${index + 1}`) + + return ( + + + + + + #{index + 1} + + + + + + + +
updateItem(index, newItemData)} + > +
{/* Prevents form buttons from showing */} +
+
+
+
+ ) + })} +
+ )} +
+
+ ) : ( + + {items.length === 0 ? ( + + + No items configured yet + + + + ) : ( + + {items.map((item, index) => { + const isItemExpanded = expandedItems.has(index) + const itemLabel = getItemLabel ? getItemLabel(item) : (item.name || item.id || `Item ${index + 1}`) + + return ( + + + + + + #{index + 1} + - #{index + 1} -
- -
-
- - - -
updateItem(index, newItemData)} - > -
{/* Prevents form buttons from showing */} -
-
-
-
- ) - })} -
- )} -
+ + + + + +
updateItem(index, newItemData)} + > +
{/* Prevents form buttons from showing */} +
+
+
+ + ) + })} + + )} + + )} ) } // Collapsible Plot Component -function CollapsiblePlotChart({ plotDefinition, plotVariables, onConfigUpdate, onRemove }) { - const [isOpen, setIsOpen] = useState(false) +function CollapsiblePlotChart({ plotDefinition, plotVariables, onConfigUpdate, onReloadConfig, onRemove, isExpanded, onToggleExpansion }) { return ( @@ -214,10 +301,10 @@ function CollapsiblePlotChart({ plotDefinition, plotVariables, onConfigUpdate, o