diff --git a/src/components/debugger/components/JsonViewer.py b/src/components/debugger/components/JsonViewer.py index f59beb2..907d612 100644 --- a/src/components/debugger/components/JsonViewer.py +++ b/src/components/debugger/components/JsonViewer.py @@ -62,7 +62,7 @@ class JsonViewerHelper: class JsonViewer(BaseComponent): def __init__(self, session, _id, owner, user_id, data, hooks=None, key=None, boundaries=None): super().__init__(session, _id) - self._key = key + self._key = key # for comparison between two jsonviewer components self._owner = owner # debugger component self.user_id = user_id self.data = data @@ -88,6 +88,10 @@ class JsonViewer(BaseComponent): self._helper = JsonViewerHelper() + def set_data(self, data): + self.data = data + self.node = self._create_node(None, data) + def set_node_folding(self, node_id, folding): if folding == self._folding_mode: self._nodes_to_track.remove(node_id) diff --git a/src/components/workflows/components/WorkflowDesigner.py b/src/components/workflows/components/WorkflowDesigner.py index 5ab896a..89df280 100644 --- a/src/components/workflows/components/WorkflowDesigner.py +++ b/src/components/workflows/components/WorkflowDesigner.py @@ -46,13 +46,13 @@ class WorkflowDesigner(BaseComponent): self.properties = WorkflowDesignerProperties(self._session, f"{self._id}", self) workflow_name = self._designer_settings.workflow_name - self._player = InstanceManager.get(self._session, - WorkflowPlayer.create_component_id(self._session, workflow_name), - WorkflowPlayer, - settings_manager=self._settings_manager, - tabs_manager=self.tabs_manager, - designer=self, - boundaries=boundaries) + self.player = InstanceManager.get(self._session, + WorkflowPlayer.create_component_id(self._session, workflow_name), + WorkflowPlayer, + settings_manager=self._settings_manager, + tabs_manager=self.tabs_manager, + designer=self, + boundaries=boundaries) self._error_message = None @@ -222,22 +222,22 @@ class WorkflowDesigner(BaseComponent): def play_workflow(self, boundaries: dict): self._error_message = None - self._player.run() - if self._player.global_error: + self.player.run() + if self.player.global_error: # Show the error message in the same tab - self._error_message = self._player.global_error + self._error_message = self.player.global_error else: - self.properties.set_entry_selector_data(self._player.nb_items) + self.properties.set_entry_selector_data(self.player.nb_items) # change the tab and display the results - self._player.set_boundaries(boundaries) - self.tabs_manager.add_tab(f"Workflow {self._designer_settings.workflow_name}", self._player, self._player.key) + self.player.set_boundaries(boundaries) + self.tabs_manager.add_tab(f"Workflow {self._designer_settings.workflow_name}", self.player, self.player.key) return self.tabs_manager.refresh() def stop_workflow(self): self._error_message = None - self._player.stop() + self.player.stop() self.properties.set_entry_selector_data(0) return self.tabs_manager.refresh() @@ -315,7 +315,7 @@ class WorkflowDesigner(BaseComponent): def _mk_component(self, component: WorkflowComponent): - runtime_state = self._player.get_component_runtime_state(component.id) + runtime_state = self.player.get_component_runtime_state(component.id) info = COMPONENT_TYPES[component.type] is_selected = self._state.selected_component_id == component.id diff --git a/src/components/workflows/components/WorkflowDesignerProperties.py b/src/components/workflows/components/WorkflowDesignerProperties.py index 54dbca5..d7db313 100644 --- a/src/components/workflows/components/WorkflowDesignerProperties.py +++ b/src/components/workflows/components/WorkflowDesignerProperties.py @@ -1,6 +1,7 @@ from fasthtml.common import * from components.BaseComponent import BaseComponent +from components.debugger.components.JsonViewer import JsonViewer from components.entryselector.components.EntrySelector import EntrySelector from components.workflows.constants import COMPONENT_TYPES, PROCESSOR_TYPES from components_helpers import mk_dialog_buttons @@ -26,10 +27,21 @@ class WorkflowDesignerProperties(BaseComponent): self._component = None self.update_layout() self.update_component(self._owner.get_state().selected_component_id) - self.entry_selector = InstanceManager.new(self._session, - EntrySelector, - owner=self, - hooks={"on_entry_selected": self.on_entry_selector_changed}) + self.entry_selector: EntrySelector = InstanceManager.new(self._session, + EntrySelector, + owner=self, + hooks={ + "on_entry_selected": self.on_entry_selector_changed}) + self._input_jsonviewer: JsonViewer = InstanceManager.new(self._session, + JsonViewer, + owner=self, + user_id=None, + data=None) + self._output_jsonviewer: JsonViewer = InstanceManager.new(self._session, + JsonViewer, + owner=self, + user_id=None, + data=None) def set_entry_selector_data(self, data): self.entry_selector.set_data(data) @@ -64,8 +76,24 @@ class WorkflowDesignerProperties(BaseComponent): return self.__ft__(oob=oob) def on_entry_selector_changed(self, entry): - return (self._mk_input(content="input:" + entry, oob=True), - self._mk_output(content="output:" + entry, oob=True)) + entry = int(entry) + + input_data, output_data = None, None + selected_component_id = self._owner.get_state().selected_component_id + if selected_component_id is not None: + runtime_state = self._owner.player.runtime_states.get(selected_component_id, None) + if runtime_state is not None: + input_content = runtime_state.input[entry] if len(runtime_state.input) > entry else None + output_content = runtime_state.output[entry] if len(runtime_state.output) > entry else None + if input_content is not None: + self._input_jsonviewer.set_data(input_content.item.as_dict()) + input_data = self._input_jsonviewer + if output_content is not None: + self._output_jsonviewer.set_data(output_content.item.as_dict()) + output_data = self._output_jsonviewer + + return (self._mk_input(content=input_data, oob=True), + self._mk_output(content=output_data, oob=True)) def _mk_layout(self): return Div( diff --git a/src/core/Expando.py b/src/core/Expando.py index d8622ca..390fe79 100644 --- a/src/core/Expando.py +++ b/src/core/Expando.py @@ -48,6 +48,9 @@ class Expando: return self._props.copy() def to_dict(self, mappings: dict) -> dict: + """ + Return the information as a dictionary, with the given mappings + """ return {prop_name: self.get(path) for path, prop_name in mappings.items() if prop_name is not None} def __hasattr__(self, item):