I can display an single workflow item

This commit is contained in:
2025-08-26 22:47:16 +02:00
parent fe5668fbed
commit e90e7b01dd
4 changed files with 57 additions and 22 deletions

View File

@@ -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)

View File

@@ -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

View File

@@ -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(

View File

@@ -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):