diff --git a/src/components/workflows/assets/Workflows.js b/src/components/workflows/assets/Workflows.js index bc7e329..16ed0c6 100644 --- a/src/components/workflows/assets/Workflows.js +++ b/src/components/workflows/assets/Workflows.js @@ -629,7 +629,7 @@ function bindWorkflowProperties(elementId) { const totalWidth = properties_component.getBoundingClientRect().width console.debug("totalWidth", totalWidth) - const minPropertiesWidth = Math.floor(totalWidth * 0.2); // 20% minimum + const minPropertiesWidth = 340; // this value avoid scroll bars const inputSection = document.getElementById(`pi_${elementId}`); const propertiesSection = document.getElementById(`pp_${elementId}`); diff --git a/src/components/workflows/commands.py b/src/components/workflows/commands.py index 6c31bb9..6fb2549 100644 --- a/src/components/workflows/commands.py +++ b/src/components/workflows/commands.py @@ -46,7 +46,7 @@ class WorkflowDesignerCommandManager(BaseCommandManager): def save_properties(self, component_id: str): return { "hx_post": f"{ROUTE_ROOT}{Routes.SaveProperties}", - "hx-target": f"#p_{self._id}", + "hx-target": f"#ppc_{self._id}", "hx-swap": "outerHTML", "hx-vals": f'js:{{"_id": "{self._id}", "component_id": "{component_id}"}}', } @@ -54,7 +54,7 @@ class WorkflowDesignerCommandManager(BaseCommandManager): def cancel_properties(self, component_id: str): return { "hx_post": f"{ROUTE_ROOT}{Routes.CancelProperties}", - "hx-target": f"#p_{self._id}", + "hx-target": f"#ppc_{self._id}", "hx-swap": "outerHTML", "hx-vals": f'js:{{"_id": "{self._id}", "component_id": "{component_id}"}}', } @@ -62,7 +62,7 @@ class WorkflowDesignerCommandManager(BaseCommandManager): def on_processor_details_event(self, component_id: str, event_name: str): return { "hx_post": f"{ROUTE_ROOT}{Routes.OnProcessorDetailsEvent}", - "hx-target": f"#p_{self._id}", + "hx-target": f"#ppc_{self._id}", "hx-trigger": "change", "hx-swap": "outerHTML", "hx-vals": f'js:{{"_id": "{self._id}", "component_id": "{component_id}", "event_name": "{event_name}"}}', diff --git a/src/components/workflows/components/WorkflowDesigner.py b/src/components/workflows/components/WorkflowDesigner.py index c699fed..6a3cf03 100644 --- a/src/components/workflows/components/WorkflowDesigner.py +++ b/src/components/workflows/components/WorkflowDesigner.py @@ -86,6 +86,7 @@ class WorkflowDesigner(BaseComponent): def refresh_state(self): self._state = self._db.load_state(self._key) self.properties.update_layout() + self.properties.update_component(self._state.selected_component_id) return self.__ft__(oob=True) def add_component(self, component_type, x, y): @@ -201,13 +202,13 @@ class WorkflowDesigner(BaseComponent): self._db.save_state(self._key, self._state, undo_redo_attrs) logger.debug(f"Saved properties for component {component_id}: {details}") - return self.refresh_properties(), self._undo_redo.refresh() + return self.properties.refresh(mode="form"), self._undo_redo.refresh() def cancel_properties(self, component_id: str): if component_id in self._state.components: logger.debug(f"Cancel saving properties for component {component_id}") - return self.refresh_properties() + return self.properties.refresh(mode="form") def set_selected_processor(self, component_id: str, processor_name: str): if component_id in self._state.components: @@ -249,7 +250,7 @@ class WorkflowDesigner(BaseComponent): elif event_name == "OnJiraRequestTypeChanged": component.properties["request_type"] = details["request_type"] - return self.refresh_properties() + return self.properties.refresh(mode="form") def get_workflow_name(self): return self._designer_settings.workflow_name diff --git a/src/components/workflows/components/WorkflowDesignerProperties.py b/src/components/workflows/components/WorkflowDesignerProperties.py index 1b876a2..2e524bb 100644 --- a/src/components/workflows/components/WorkflowDesignerProperties.py +++ b/src/components/workflows/components/WorkflowDesignerProperties.py @@ -5,7 +5,7 @@ from components.BaseComponent import BaseComponent from components.workflows.constants import COMPONENT_TYPES, PROCESSOR_TYPES from components_helpers import mk_dialog_buttons from core.jira import JiraRequestTypes, DEFAULT_SEARCH_FIELDS -from core.utils import merge_classes +from utils.DbManagementHelper import DbManagementHelper @dataclass @@ -152,7 +152,6 @@ class WorkflowDesignerProperties(BaseComponent): ), id=f"ppf_{self._id}", cls="wkf-properties-content-form", - #style=" flex-grow: 1;overflow: auto;" ) def _mk_select_processor(self): @@ -217,16 +216,8 @@ class WorkflowDesignerProperties(BaseComponent): P("Put the issue id here"), ) ] - - def _mk_extra_parameters(): - if request_type == JiraRequestTypes.Issues.value: - return Input(type="text", - name="fields", - value=self._component.properties.get("fields", DEFAULT_SEARCH_FIELDS), - placeholder="default fields", - cls="input w-full ml-2") else: - return None + return [Div("** Not Implemented **")] request_type = self._component.properties.get("request_type", JiraRequestTypes.Issues.value) return Div( @@ -247,6 +238,88 @@ class WorkflowDesignerProperties(BaseComponent): ), ) + def _mk_details_producer_repository(self): + selected_repo = self._component.properties.get("repository", None) + selected_table = self._component.properties.get("table", None) + + def _mk_repositories_options(): + repositories = DbManagementHelper.list_repositories(self._session) + if len(repositories) == 0: + return [Option("No repository available", disabled=True)] + + return ([Option("Choose a repository", disabled=True, selected="selected" if selected_repo is None else None)] + + [Option(repo.name, selected="selected" if repo.name == selected_repo else None) + for repo in DbManagementHelper.list_repositories(self._session)]) + + def _mk_tables_options(): + if selected_repo is None: + return [Option("No repository selected", disabled=True, selected="selected")] + + tables = DbManagementHelper.list_tables(self._session, selected_repo) + if len(tables) == 0: + return [Option("No table available", disabled=True)] + + return ([Option("Choose a table", disabled=True, selected="selected" if selected_table is None else None)] + + [Option(table, selected="selected" if table == selected_table else None) + for table in DbManagementHelper.list_tables(self._session, selected_repo)]) + + return Div( + Fieldset( + Legend("Repository", cls="fieldset-legend"), + Div( + Select( + *_mk_repositories_options(), + cls="select w-64", + id=f"repository_{self._id}", + name="repository", + **self._commands.on_processor_details_event(self._component.id, "OnRepositoryChanged"), + ), + P("Select the repository"), + ), + Div( + Select( + *_mk_tables_options(), + cls="select w-64", + id=f"table_{self._id}", + name="table", + ), + P("Select the table"), + ), + + cls="fieldset bg-base-200 border-base-300 rounded-box border p-4" + + ) + ) + + def _mk_details_filter_default(self): + return Div( + Fieldset( + Legend("Filter", cls="fieldset-legend"), + Input(type="text", + name="filter", + value=self._component.properties.get("filter", ""), + placeholder="Filter expression", + cls="input w-full"), + P("Filter expression"), + cls="fieldset bg-base-200 border-base-300 rounded-box border p-4" + ) + ) + + def _mk_details_presenter_default(self): + return Div( + Fieldset( + Legend("Presenter", cls="fieldset-legend"), + Input(type="text", + name="columns", + value=self._component.properties.get("columns", ""), + placeholder="Columns to display, separated by comma", + cls="input w-full"), + P("Comma separated list of columns to display. Use '*' to display all columns, 'source=dest' to rename columns."), + P("Use 'parent.*=*' to display all columns from object 'parent' and rename them removing the 'parent' prefix."), + cls="fieldset bg-base-200 border-base-300 rounded-box border p-4" + ) + ) + def __ft__(self, oob=False): # return self.render() return Div(