-
Notifications
You must be signed in to change notification settings - Fork 3
Bot builder in sidebar #830
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Changes from 14 commits
c020463
4488f7f
ff5f486
db0975f
e5dcef4
df49769
df76b4d
976d1ee
cf968b2
2dfeb70
377e931
4f37b5d
aea0371
05b09e5
7211cf0
95bb0b4
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
@@ -45,7 +45,7 @@ | |||||||||||||||||||||||||||||||||||||||||
| from daras_ai_v2.exceptions import InsufficientCredits | ||||||||||||||||||||||||||||||||||||||||||
| from daras_ai_v2.fastapi_tricks import get_route_path | ||||||||||||||||||||||||||||||||||||||||||
| from daras_ai_v2.github_tools import github_url_for_file | ||||||||||||||||||||||||||||||||||||||||||
| from daras_ai_v2.gooey_builder import render_gooey_builder | ||||||||||||||||||||||||||||||||||||||||||
| from daras_ai_v2.gooey_builder import render_gooey_builder, render_gooey_builder_inline | ||||||||||||||||||||||||||||||||||||||||||
| from daras_ai_v2.grid_layout_widget import grid_layout | ||||||||||||||||||||||||||||||||||||||||||
| from daras_ai_v2.html_spinner_widget import html_spinner | ||||||||||||||||||||||||||||||||||||||||||
| from daras_ai_v2.manage_api_keys_widget import manage_api_keys | ||||||||||||||||||||||||||||||||||||||||||
|
|
@@ -82,6 +82,7 @@ | |||||||||||||||||||||||||||||||||||||||||
| ) | ||||||||||||||||||||||||||||||||||||||||||
| from widgets.publish_form import clear_publish_form | ||||||||||||||||||||||||||||||||||||||||||
| from widgets.saved_workflow import render_saved_workflow_preview | ||||||||||||||||||||||||||||||||||||||||||
| from widgets.sidebar import sidebar_layout, use_sidebar | ||||||||||||||||||||||||||||||||||||||||||
| from widgets.workflow_image import ( | ||||||||||||||||||||||||||||||||||||||||||
| render_change_notes_input, | ||||||||||||||||||||||||||||||||||||||||||
| render_workflow_photo_uploader, | ||||||||||||||||||||||||||||||||||||||||||
|
|
@@ -415,6 +416,54 @@ def render(self): | |||||||||||||||||||||||||||||||||||||||||
| with header_placeholder: | ||||||||||||||||||||||||||||||||||||||||||
| self._render_header() | ||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||
| def render_sidebar(self): | ||||||||||||||||||||||||||||||||||||||||||
| if not self.is_current_user_admin(): | ||||||||||||||||||||||||||||||||||||||||||
| return | ||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||
| sidebar_ref = use_sidebar("builder-sidebar", self.request.session) | ||||||||||||||||||||||||||||||||||||||||||
| if self.tab != RecipeTabs.run and self.tab != RecipeTabs.preview: | ||||||||||||||||||||||||||||||||||||||||||
| if sidebar_ref.is_open or sidebar_ref.is_mobile_open: | ||||||||||||||||||||||||||||||||||||||||||
| sidebar_ref.set_open(False) | ||||||||||||||||||||||||||||||||||||||||||
| sidebar_ref.set_mobile_open(False) | ||||||||||||||||||||||||||||||||||||||||||
| raise gui.RerunException() | ||||||||||||||||||||||||||||||||||||||||||
| return | ||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||
| if sidebar_ref.is_open or sidebar_ref.is_mobile_open: | ||||||||||||||||||||||||||||||||||||||||||
| gui.tag( | ||||||||||||||||||||||||||||||||||||||||||
| "button", | ||||||||||||||||||||||||||||||||||||||||||
| type="submit", | ||||||||||||||||||||||||||||||||||||||||||
| name="onCloseGooeyBuilder", | ||||||||||||||||||||||||||||||||||||||||||
| value="yes", | ||||||||||||||||||||||||||||||||||||||||||
| hidden=True, | ||||||||||||||||||||||||||||||||||||||||||
| id="onClose", | ||||||||||||||||||||||||||||||||||||||||||
| ) # hidden button to trigger the onClose event passed in the config | ||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||
| if gui.session_state.pop("onCloseGooeyBuilder", None): | ||||||||||||||||||||||||||||||||||||||||||
| sidebar_ref.set_open(False) | ||||||||||||||||||||||||||||||||||||||||||
| raise gui.RerunException() | ||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||
| with gui.div(className="w-100 h-100"): | ||||||||||||||||||||||||||||||||||||||||||
| self._render_gooey_builder() | ||||||||||||||||||||||||||||||||||||||||||
| else: | ||||||||||||||||||||||||||||||||||||||||||
| with gui.styled("& .gooey-builder-open-button:hover { scale: 1.2; }"): | ||||||||||||||||||||||||||||||||||||||||||
| with gui.div( | ||||||||||||||||||||||||||||||||||||||||||
| className="w-100 position-absolute", | ||||||||||||||||||||||||||||||||||||||||||
| style={"bottom": "24px", "left": "16px", "zIndex": "1000"}, | ||||||||||||||||||||||||||||||||||||||||||
| ): | ||||||||||||||||||||||||||||||||||||||||||
| gooey_builder_open_button = gui.button( | ||||||||||||||||||||||||||||||||||||||||||
| label=f"<img src='{settings.GOOEY_BUILDER_ICON}' style='width: 56px; height: 56px; border-radius: 50%;' />", | ||||||||||||||||||||||||||||||||||||||||||
| className="btn btn-secondary border-0 d-none d-md-block p-0 gooey-builder-open-button", | ||||||||||||||||||||||||||||||||||||||||||
| style={ | ||||||||||||||||||||||||||||||||||||||||||
| "width": "56px", | ||||||||||||||||||||||||||||||||||||||||||
| "height": "56px", | ||||||||||||||||||||||||||||||||||||||||||
| "borderRadius": "50%", | ||||||||||||||||||||||||||||||||||||||||||
| "boxShadow": "#0000001a 0 1px 4px, #0003 0 2px 12px", | ||||||||||||||||||||||||||||||||||||||||||
| }, | ||||||||||||||||||||||||||||||||||||||||||
| ) | ||||||||||||||||||||||||||||||||||||||||||
| if gooey_builder_open_button: | ||||||||||||||||||||||||||||||||||||||||||
| sidebar_ref.set_open(True) | ||||||||||||||||||||||||||||||||||||||||||
| raise gui.RerunException() | ||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||
| def _render_header(self): | ||||||||||||||||||||||||||||||||||||||||||
| from widgets.workflow_image import CIRCLE_IMAGE_WORKFLOWS | ||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||
|
|
@@ -1172,8 +1221,6 @@ def render_selected_tab(self): | |||||||||||||||||||||||||||||||||||||||||
| self.render_deleted_output() | ||||||||||||||||||||||||||||||||||||||||||
| return | ||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||
| self._render_gooey_builder() | ||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||
| with gui.styled(INPUT_OUTPUT_COLS_CSS): | ||||||||||||||||||||||||||||||||||||||||||
| input_col, output_col = gui.columns([3, 2], gap="medium") | ||||||||||||||||||||||||||||||||||||||||||
| with input_col: | ||||||||||||||||||||||||||||||||||||||||||
|
|
@@ -1220,7 +1267,7 @@ def _render_gooey_builder(self): | |||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||
| if not self.is_current_user_admin(): | ||||||||||||||||||||||||||||||||||||||||||
| return | ||||||||||||||||||||||||||||||||||||||||||
| render_gooey_builder( | ||||||||||||||||||||||||||||||||||||||||||
| render_gooey_builder_inline( | ||||||||||||||||||||||||||||||||||||||||||
| page_slug=self.slug_versions[-1], | ||||||||||||||||||||||||||||||||||||||||||
| builder_state=dict( | ||||||||||||||||||||||||||||||||||||||||||
| status=dict( | ||||||||||||||||||||||||||||||||||||||||||
|
|
@@ -1241,6 +1288,27 @@ def _render_gooey_builder(self): | |||||||||||||||||||||||||||||||||||||||||
| ), | ||||||||||||||||||||||||||||||||||||||||||
| ) | ||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||
| # render_gooey_builder( | ||||||||||||||||||||||||||||||||||||||||||
| # page_slug=self.slug_versions[-1], | ||||||||||||||||||||||||||||||||||||||||||
| # builder_state=dict( | ||||||||||||||||||||||||||||||||||||||||||
| # status=dict( | ||||||||||||||||||||||||||||||||||||||||||
| # error_msg=gui.session_state.get(StateKeys.error_msg), | ||||||||||||||||||||||||||||||||||||||||||
| # run_status=gui.session_state.get(StateKeys.run_status), | ||||||||||||||||||||||||||||||||||||||||||
| # run_time=gui.session_state.get(StateKeys.run_time), | ||||||||||||||||||||||||||||||||||||||||||
| # ), | ||||||||||||||||||||||||||||||||||||||||||
| # request=extract_model_fields( | ||||||||||||||||||||||||||||||||||||||||||
| # model=self.RequestModel, state=gui.session_state | ||||||||||||||||||||||||||||||||||||||||||
| # ), | ||||||||||||||||||||||||||||||||||||||||||
| # response=extract_model_fields( | ||||||||||||||||||||||||||||||||||||||||||
| # model=self.ResponseModel, state=gui.session_state | ||||||||||||||||||||||||||||||||||||||||||
| # ), | ||||||||||||||||||||||||||||||||||||||||||
| # metadata=dict( | ||||||||||||||||||||||||||||||||||||||||||
| # title=self.current_pr.title, | ||||||||||||||||||||||||||||||||||||||||||
| # description=self.current_pr.notes, | ||||||||||||||||||||||||||||||||||||||||||
| # ), | ||||||||||||||||||||||||||||||||||||||||||
| # ), | ||||||||||||||||||||||||||||||||||||||||||
| # ) | ||||||||||||||||||||||||||||||||||||||||||
|
Comment on lines
+1291
to
+1310
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion | 🟠 Major Remove commented code once the filtered approach is restored. After applying the fix from the previous review to filter -
- # render_gooey_builder(
- # page_slug=self.slug_versions[-1],
- # builder_state=dict(
- # status=dict(
- # error_msg=gui.session_state.get(StateKeys.error_msg),
- # run_status=gui.session_state.get(StateKeys.run_status),
- # run_time=gui.session_state.get(StateKeys.run_time),
- # ),
- # request=extract_model_fields(
- # model=self.RequestModel, state=gui.session_state
- # ),
- # response=extract_model_fields(
- # model=self.ResponseModel, state=gui.session_state
- # ),
- # metadata=dict(
- # title=self.current_pr.title,
- # description=self.current_pr.notes,
- # ),
- # ),
- # )📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents |
||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||
| def _render_version_history(self): | ||||||||||||||||||||||||||||||||||||||||||
| versions = self.current_pr.versions.all() | ||||||||||||||||||||||||||||||||||||||||||
| first_version = versions[0] | ||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -45,6 +45,7 @@ | |
| from handles.models import Handle | ||
| from routers.custom_api_router import CustomAPIRouter | ||
| from routers.static_pages import serve_static_file | ||
| from widgets.sidebar import sidebar_layout, use_sidebar | ||
| from widgets.workflow_search import SearchFilters, render_search_bar_with_redirect | ||
| from workspaces.widgets import global_workspace_selector, workspace_selector_link | ||
|
|
||
|
|
@@ -701,7 +702,7 @@ def render_recipe_page( | |
| if not gui.session_state: | ||
| gui.session_state.update(page.current_sr_to_session_state()) | ||
|
|
||
| with page_wrapper(request): | ||
| with page_wrapper(request, page=page, is_recipe_page=True): | ||
| page.render() | ||
|
|
||
| return dict( | ||
|
|
@@ -720,81 +721,126 @@ def get_og_url_path(request) -> str: | |
| @contextmanager | ||
| def page_wrapper( | ||
| request: Request, | ||
| page: None = None, | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Fix incorrect type annotation for The type annotation Apply this diff to fix the type annotation: def page_wrapper(
request: Request,
- page: None = None,
+ page: typing.Optional["BasePage"] = None,
className="",
search_filters: typing.Optional[SearchFilters] = None,
show_search_bar: bool = True,
):Note: You may need to add 🤖 Prompt for AI Agents |
||
| className="", | ||
| search_filters: typing.Optional[SearchFilters] = None, | ||
| show_search_bar: bool = True, | ||
| is_recipe_page: bool = False, | ||
| ): | ||
| from routers.account import explore_in_current_workspace | ||
|
|
||
| context = {"request": request, "block_incognito": True} | ||
|
|
||
| with gui.div(className="d-flex flex-column min-vh-100"): | ||
| gui.html(templates.get_template("gtag.html").render(**context)) | ||
| container = page if page else None | ||
| sidebar_ref = use_sidebar("builder-sidebar", request.session, default_open=False) | ||
| sidebar_content, pane_content = sidebar_layout(sidebar_ref) | ||
|
|
||
| with ( | ||
| gui.div(className="header"), | ||
| gui.div(className="navbar navbar-expand-xl bg-transparent p-0 m-0"), | ||
| gui.div(className="container-xxl my-2"), | ||
| gui.div( | ||
| className="position-relative w-100 d-flex justify-content-between gap-2" | ||
| ), | ||
| ): | ||
| with ( | ||
| gui.div(className="d-md-block"), | ||
| gui.tag("a", href="/"), | ||
| ): | ||
| gui.tag( | ||
| "img", | ||
| src=settings.GOOEY_LOGO_IMG, | ||
| width="300", | ||
| height="142", | ||
| className="img-fluid logo d-none d-sm-block", | ||
| ) | ||
| gui.tag( | ||
| "img", | ||
| src=settings.GOOEY_LOGO_RECT, | ||
| width="145", | ||
| height="40", | ||
| className="img-fluid logo d-sm-none", | ||
| ) | ||
| is_builder_sidebar_open = sidebar_ref.is_open | ||
| if not is_recipe_page and (is_builder_sidebar_open): | ||
| sidebar_ref.set_open(False) | ||
| sidebar_ref.set_mobile_open(False) | ||
| raise gui.RerunException() | ||
|
|
||
|
Comment on lines
+734
to
743
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Treat mobile-open sidebars as “open” and close them on non-recipe pages
Updating the flag to consider mobile state fixes both the guard and the layout branches that depend on it: - is_builder_sidebar_open = sidebar_ref.is_open
- if not is_recipe_page and (is_builder_sidebar_open):
+ is_builder_sidebar_open = sidebar_ref.is_open or sidebar_ref.is_mobile_open
+ if not is_recipe_page and is_builder_sidebar_open:
sidebar_ref.set_open(False)
sidebar_ref.set_mobile_open(False)
raise gui.RerunException()This also makes the header and main-content sizing react consistently to mobile-open sidebars. 🤖 Prompt for AI Agents |
||
| if show_search_bar: | ||
| _render_mobile_search_button(request, search_filters) | ||
| with sidebar_content: | ||
| if container: | ||
| container.render_sidebar() | ||
|
|
||
| with gui.div( | ||
| className="d-flex gap-2 justify-content-end flex-wrap align-items-center" | ||
| with pane_content: | ||
| with gui.div(className="d-flex flex-column min-vh-100 w-100 px-2"): | ||
| gui.html(templates.get_template("gtag.html").render(**context)) | ||
|
|
||
| with ( | ||
| gui.div(className="header"), | ||
| gui.div(className="navbar navbar-expand-xl bg-transparent p-0 m-0"), | ||
| gui.div( | ||
| className="container-xxl my-2" | ||
| if not is_builder_sidebar_open | ||
| else "my-2 mx-2 w-100" | ||
| ), | ||
| gui.div( | ||
| className="position-relative w-100 d-flex justify-content-between gap-2" | ||
| ), | ||
| ): | ||
| for url, label in settings.HEADER_LINKS: | ||
| render_header_link( | ||
| url=url, label=label, icon=settings.HEADER_ICONS.get(url) | ||
| with ( | ||
| gui.div(className="d-md-block"), | ||
| gui.tag("a", href="/"), | ||
| ): | ||
| gui.tag( | ||
| "img", | ||
| src=settings.GOOEY_LOGO_IMG, | ||
| width="300", | ||
| height="142", | ||
| className="img-fluid logo d-none d-sm-block", | ||
| ) | ||
|
|
||
| if request.user and not request.user.is_anonymous: | ||
| render_header_link( | ||
| url=get_route_path(explore_in_current_workspace), | ||
| label="Saved", | ||
| icon=icons.save, | ||
| gui.tag( | ||
| "img", | ||
| src=settings.GOOEY_LOGO_RECT, | ||
| width="145", | ||
| height="40", | ||
| className="img-fluid logo d-sm-none", | ||
| ) | ||
|
|
||
| current_workspace = global_workspace_selector( | ||
| request.user, request.session | ||
| ) | ||
| else: | ||
| current_workspace = None | ||
| anonymous_login_container(request, context) | ||
| with gui.div( | ||
| className="d-flex justify-content-end flex-grow-1 align-items-center" | ||
| ): | ||
| if request.user and request.user.is_admin: | ||
| gooey_builder_mobile_open_button = gui.button( | ||
| label=f"<img src='{settings.GOOEY_BUILDER_ICON}' style='width: 36px; height: 36px; border-radius: 50%;' />", | ||
| className="border-0 m-0 btn btn-secondary rounded-pill d-md-none gooey-builder-open-button p-0", | ||
| style={ | ||
| "width": "36px", | ||
| "height": "36px", | ||
| "borderRadius": "50%", | ||
| }, | ||
| ) | ||
| if gooey_builder_mobile_open_button: | ||
| sidebar_ref.set_mobile_open(True) | ||
| raise gui.RerunException() | ||
|
|
||
| if show_search_bar: | ||
| _render_mobile_search_button(request, search_filters) | ||
|
|
||
| with gui.div( | ||
| className="d-flex gap-2 justify-content-end flex-wrap align-items-center" | ||
| ): | ||
| for url, label in settings.HEADER_LINKS: | ||
| render_header_link( | ||
| url=url, | ||
| label=label, | ||
| icon=settings.HEADER_ICONS.get(url), | ||
| ) | ||
|
|
||
| if request.user and not request.user.is_anonymous: | ||
| render_header_link( | ||
| url=get_route_path(explore_in_current_workspace), | ||
| label="Saved", | ||
| icon=icons.save, | ||
| ) | ||
|
|
||
| current_workspace = global_workspace_selector( | ||
| request.user, request.session | ||
| ) | ||
| else: | ||
| current_workspace = None | ||
| anonymous_login_container(request, context) | ||
|
|
||
| gui.html(copy_to_clipboard_scripts) | ||
|
|
||
| gui.html(copy_to_clipboard_scripts) | ||
|
|
||
| with gui.div(id="main-content", className="container-xxl " + className): | ||
| yield current_workspace | ||
| with gui.div( | ||
| id="main-content", | ||
| className="container-xxl " | ||
| if not is_builder_sidebar_open | ||
| else "mx-2 w-100" + className, | ||
| ): | ||
| yield current_workspace | ||
|
|
||
coderabbitai[bot] marked this conversation as resolved.
Show resolved
Hide resolved
|
||
| gui.html(templates.get_template("footer.html").render(**context)) | ||
| gui.html(templates.get_template("login_scripts.html").render(**context)) | ||
| gui.html(templates.get_template("footer.html").render(**context)) | ||
| gui.html(templates.get_template("login_scripts.html").render(**context)) | ||
|
|
||
|
|
||
| def _render_mobile_search_button(request: Request, search_filters: SearchFilters): | ||
| with gui.div( | ||
| className="d-flex d-md-none flex-grow-1 justify-content-end", | ||
| className="d-flex d-md-none justify-content-end", | ||
| ): | ||
| gui.button( | ||
| icons.search, | ||
|
|
||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Ensure sidebar close works for both desktop and mobile states
In
render_sidebar, when handling the hidden"onCloseGooeyBuilder"button, onlysidebar_ref.set_open(False)is called. If the sidebar was opened via the mobile state (is_mobile_open), this leavesis_mobile_openTruein the session, so the sidebar may immediately re‑open or get out of sync on mobile.Recommend closing both flags when the builder’s
onClosefires:🤖 Prompt for AI Agents