Skip to content

Commit 1553775

Browse files
feat: Add RunAnalysisPage to gui pages that runs the analyzer (#292)
* feat: add new routes to GuiRoutes * fix: make self.back_text optional in GuiPage * add RunAnalysisPage and register it in main_workflow.py * add navigation in analysis_params.py * chore: rename ConfigureAnalsys to ConfigureAnalsysiDatasetPage * rename analysis_configure.py -> analysis_configure_dataset.py * rename analysis_configure_dataset.py -> analysis_dataset.py * update import statements * fix: imports in main_workflow.py and analyzer_new.py * fix routing variable names * feat: update RunAnalysisPage with progress bars and buttons * feat: disable cancel button after error make return button visible * use nonlocal var for cancel_request tracking * make reuturn and success buttons visible after analysis is run * dev: use `USE_RENDER_DELAY` constant var * ux: make return_btn visible after successful analysis * feat: wrap analysis run into ui.dialog, initial attempt * remove retrun button for now * fix routes, button positioning * add PostAnalysisPage and add to workflow
1 parent 703a107 commit 1553775

File tree

8 files changed

+312
-22
lines changed

8 files changed

+312
-22
lines changed

gui/base.py

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,11 @@ class GuiRoutes(BaseModel):
3939
select_analyzer_fork: str = "/select_analyzer_fork"
4040
select_analyzer: str = "/select_analyzer"
4141
select_previous_analyzer: str = "/select_previous_analyzer"
42-
configure_analysis: str = "/configure_analysis"
42+
configure_analysis_dataset: str = "/configure_analysis_dataset"
4343
configure_analysis_parameters: str = "/configure_analysis_parameters"
4444
preview_dataset: str = "/preview_dataset"
45+
run_analysis: str = "/run_analysis"
46+
post_analysis: str = "/post_analysis"
4547

4648

4749
class GuiColors(BaseModel):
@@ -297,13 +299,16 @@ def _render_header(self) -> None:
297299
with ui.row().classes("w-full items-center justify-between"):
298300
# Left: Back button or spacer
299301
with ui.element("div").classes("flex items-center"):
300-
if self.show_back_button and self.back_route and self.back_text:
301-
ui.button(
302-
text=self.back_text,
303-
icon=self.back_icon,
304-
color="accent",
305-
on_click=self._handle_back_click,
306-
).props("flat")
302+
if self.show_back_button and self.back_route:
303+
# Build button parameters conditionally
304+
btn_kwargs = {
305+
"icon": self.back_icon,
306+
"color": "accent",
307+
"on_click": self._handle_back_click,
308+
}
309+
if self.back_text:
310+
btn_kwargs["text"] = self.back_text
311+
ui.button(**btn_kwargs).props("flat")
307312

308313
# Center: Title
309314
ui.label(self.title).classes("text-h6")

gui/main_workflow.py

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,10 +9,12 @@
99
from gui.context import GUIContext
1010
from gui.pages import (
1111
ConfigureAnalaysisParams,
12-
ConfigureAnalysis,
12+
ConfigureAnalysisDatasetPage,
1313
ImportDatasetPage,
1414
NewProjectPage,
15+
PostAnalysisPage,
1516
PreviewDatasetPage,
17+
RunAnalysisPage,
1618
SelectAnalyzerForkPage,
1719
SelectNewAnalyzerPage,
1820
SelectPreviousAnalyzerPage,
@@ -81,20 +83,33 @@ def select_previous_analyzer():
8183
page = SelectPreviousAnalyzerPage(session=gui_session)
8284
page.render()
8385

84-
@ui.page(gui_routes.configure_analysis)
85-
def configure_analysis():
86-
page = ConfigureAnalysis(session=gui_session)
86+
@ui.page(gui_routes.configure_analysis_dataset)
87+
def configure_analysis_dataset():
88+
"""Renders page where user selects dataset columns and previews."""
89+
page = ConfigureAnalysisDatasetPage(session=gui_session)
8790
page.render()
8891

8992
@ui.page(gui_routes.configure_analysis_parameters)
9093
def configure_analysis_parameters():
94+
"""Render page to allow user to configure analysis parameters."""
9195
page = ConfigureAnalaysisParams(session=gui_session)
9296
page.render()
9397

98+
@ui.page(gui_routes.run_analysis)
99+
def run_analysis():
100+
"""Render page that runs the analysis with selected parameters."""
101+
page = RunAnalysisPage(session=gui_session)
102+
page.render()
103+
104+
@ui.page(gui_routes.post_analysis)
105+
def post_analysis():
106+
"""Show options once analysis completes."""
107+
page = PostAnalysisPage(session=gui_session)
108+
page.render()
109+
94110
# Launch in native mode
95111
ui.run(
96-
native=False,
97-
window_size=(800, 600),
112+
native=True,
98113
title="CIB Mango Tree",
99114
favicon="🥭",
100115
reload=False,

gui/pages/__init__.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
1-
from .analysis_configure import ConfigureAnalysis
1+
from .analysis_dataset import ConfigureAnalysisDatasetPage
22
from .analysis_params import ConfigureAnalaysisParams
3+
from .analysis_post import PostAnalysisPage
4+
from .analysis_run import RunAnalysisPage
35
from .analyzer_new import SelectNewAnalyzerPage
46
from .analyzer_previous import SelectPreviousAnalyzerPage
57
from .analyzer_select import SelectAnalyzerForkPage
@@ -17,7 +19,9 @@
1719
"SelectAnalyzerForkPage",
1820
"SelectNewAnalyzerPage",
1921
"SelectPreviousAnalyzerPage",
20-
"ConfigureAnalysis",
22+
"ConfigureAnalysisDatasetPage",
2123
"ConfigureAnalaysisParams",
24+
"RunAnalysisPage",
25+
"PostAnalysisPage",
2226
"PreviewDatasetPage",
2327
]
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,12 @@
55
from gui.base import GuiPage, GuiSession, gui_routes
66

77

8-
class ConfigureAnalysis(GuiPage):
8+
class ConfigureAnalysisDatasetPage(GuiPage):
99
def __init__(self, session: GuiSession):
1010
config_analysis_title: str = "Configure Analysis"
1111
super().__init__(
1212
session=session,
13-
route=gui_routes.configure_analysis,
13+
route=gui_routes.configure_analysis_dataset,
1414
title=(
1515
f"{session.current_project.display_name}: {config_analysis_title}"
1616
if session.current_project is not None

gui/pages/analysis_params.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ def __init__(self, session: GuiSession):
1414
route=gui_routes.configure_analysis_parameters,
1515
title=f"{session.current_project.display_name}: Configure Parameters",
1616
show_back_button=True,
17-
back_route=gui_routes.configure_analysis,
17+
back_route=gui_routes.configure_analysis_dataset,
1818
show_footer=True,
1919
)
2020

@@ -27,7 +27,7 @@ def render_content(self):
2727

2828
if not self.session.column_mapping:
2929
self.notify_warning("Column mapping not configured. Redirecting...")
30-
self.navigate_to(gui_routes.configure_analysis)
30+
self.navigate_to(gui_routes.configure_analysis_dataset)
3131
return
3232

3333
analyzer = self.session.selected_analyzer
@@ -106,7 +106,7 @@ def _on_proceed():
106106
self.session.analysis_params = final_params
107107

108108
# TODO: Navigate to next step (run analysis or review page)
109-
self.notify_success("Coming soon!")
109+
self.navigate_to(gui_routes.run_analysis)
110110

111111
ui.button(
112112
"Proceed to Run Analysis",

gui/pages/analysis_post.py

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
from nicegui import ui
2+
3+
from gui.base import GuiPage, GuiSession, gui_routes
4+
5+
BUTTON_OPTIONS = {
6+
"dashboard": "Open results dashboard",
7+
"export": "Export raw output files",
8+
"open_folder": "Open results folder",
9+
}
10+
11+
12+
class PostAnalysisPage(GuiPage):
13+
14+
def __init__(self, session: GuiSession):
15+
super().__init__(
16+
session=session,
17+
route=gui_routes.post_analysis,
18+
title=f"{session.current_project.display_name}: Configure Parameters",
19+
show_back_button=True,
20+
back_route=gui_routes.configure_analysis_dataset,
21+
show_footer=True,
22+
)
23+
24+
def render_content(self):
25+
26+
with (
27+
ui.column()
28+
.classes("items-center justify-center")
29+
.style("height: 80vh; width: 100%")
30+
):
31+
# Prompt label
32+
ui.label("What would you like to do next?").classes("q-mb-lg").style(
33+
"font-size: 1.05rem"
34+
)
35+
36+
# Action buttons row
37+
with ui.row().classes("gap-4"):
38+
39+
for btn_label in BUTTON_OPTIONS.values():
40+
ui.button(
41+
btn_label,
42+
on_click=ui.notify("Coming soon!"),
43+
color="primary",
44+
)

0 commit comments

Comments
 (0)