From 810dd2f3fc2017e28ee20ef364cf0a9499788bd0 Mon Sep 17 00:00:00 2001 From: vquilon Date: Mon, 14 Oct 2024 19:41:20 +0200 Subject: [PATCH] Optimizacion en la carga del loading. Soporte para multiples versiones de streamlit. Mejoras en la posicion de la barra de navegacion. --- .../navbar/native_streamlit_multipage/app.py | 9 +- examples/framework/multi_page.py | 30 +- requirements.txt | 2 +- .../components/loader/__init__.py | 1 - .../components/navbar/__init__.py | 246 ++++++------- .../framework/multilit/app_template.py | 40 +- .../framework/multilit/loading_app.py | 11 +- .../framework/multilit/multilit_app.py | 345 +++++++++++------- 8 files changed, 363 insertions(+), 321 deletions(-) diff --git a/examples/components/navbar/native_streamlit_multipage/app.py b/examples/components/navbar/native_streamlit_multipage/app.py index 9301c6b..eb705d2 100644 --- a/examples/components/navbar/native_streamlit_multipage/app.py +++ b/examples/components/navbar/native_streamlit_multipage/app.py @@ -25,11 +25,6 @@ def my_sidebar(): with st.sidebar: - st.logo( - image="https://streamlit.io/images/brand/streamlit-logo-primary-colormark-darktext.svg", - icon_image="https://streamlit.io/images/brand/streamlit-mark-color.png" - ) - st.write("Logged in:", st.session_state.logged_in) position_mode = st.radio( "Navbar position mode", @@ -109,6 +104,10 @@ def logout(): ) st.session_state["app_map"] = app_map +st.logo( + image="https://streamlit.io/images/brand/streamlit-logo-primary-colormark-darktext.svg", + icon_image="https://streamlit.io/images/brand/streamlit-mark-color.png" +) my_sidebar() position_mode = st.session_state.get("position_mode", "top") diff --git a/examples/framework/multi_page.py b/examples/framework/multi_page.py index 0f63703..5eca40f 100644 --- a/examples/framework/multi_page.py +++ b/examples/framework/multi_page.py @@ -1,20 +1,40 @@ import streamlit as st from streamlit_plugins.framework.multilit import MultiApp, MultiHeadApp + def run(): + with st.sidebar: + position_mode = st.radio( + "Navbar position mode", + ["top", "under"], + index=0 if st.session_state.get("position_mode", "top") == "top" else 1, + ) + sticky_nav = st.checkbox( + "Sticky navbar", value=st.session_state.get("sticky_nav", True) + ) + within_fragment = st.checkbox( + "Use within fragment", value=st.session_state.get("within_fragment", False) + ) + st.divider() + st.session_state["position_mode"] = position_mode + st.session_state["sticky_nav"] = sticky_nav + st.session_state["within_fragment"] = within_fragment + # sticky_nav = False + # position_mode = "top" + # within_fragment = False multi_app = MultiApp( title="Demo", nav_horizontal=True, layout='wide', favicon="📚", - use_navbar=False, navbar_sticky=True, navbar_mode="top", + use_navbar=True, navbar_sticky=sticky_nav, navbar_mode=position_mode, use_cookie_cache=True, sidebar_state='auto', - navbar_animation=True, allow_url_nav=True, hide_streamlit_markers=False, use_banner_images=None, + navbar_animation=True, allow_url_nav=False, hide_streamlit_markers=False, use_banner_images=None, banner_spacing=None, clear_cross_app_sessions=True, session_params=None, - use_loader=False, within_fragment=True + use_loader=True, within_fragment=within_fragment ) class Demo1App(MultiHeadApp): def run(self): with st.sidebar: - st.write("This is a sidebar") + st.write("This is a sidebar defined on App") st.title("Demo 1") _LOREM_IPSUM = [ @@ -54,7 +74,7 @@ def run(self): demo1_app = Demo1App() demo2_app = Demo2App(with_loader=False) - @multi_app.addapp(title="Home", is_home=True) + @multi_app.addapp(title="Home", app_type="home") def my_home(): st.info('HOME') if st.button('Demo1', key="change-app_demo1"): diff --git a/requirements.txt b/requirements.txt index a33ee19..17c3250 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,4 @@ -streamlit<=1.37.0 +streamlit>=1.36.0 # Multilit compress-pickle~=2.1.0 diff --git a/streamlit_plugins/components/loader/__init__.py b/streamlit_plugins/components/loader/__init__.py index a9c705c..879bc0a 100644 --- a/streamlit_plugins/components/loader/__init__.py +++ b/streamlit_plugins/components/loader/__init__.py @@ -4458,7 +4458,6 @@ def stop_loader(self): with self.loader_container: self.display_element.empty() - def __enter__(self): self.run_loader() diff --git a/streamlit_plugins/components/navbar/__init__.py b/streamlit_plugins/components/navbar/__init__.py index 4680d7e..c65cb12 100644 --- a/streamlit_plugins/components/navbar/__init__.py +++ b/streamlit_plugins/components/navbar/__init__.py @@ -16,12 +16,28 @@ else: _component_func = components.declare_component("nav_bar", url="http://localhost:3000") -GAP_BETWEEN_COMPS = "1rem" +GAP_BETWEEN_COMPS = 1 + +major, minnor, bug = st.__version__.split('.') +major, minnor, bug = int(major), int(minnor), int(bug) + + +TOP_SIDE_ELEMENTS_MARGIN = 1.05 +TOP_SIDE_ELEMENTS_WIDTH = 4 +TOP_LINE_HEIGHT = 0.125 +MARGIN_SIDE_NARROW_DIFF = 2 +MARGIN_SIDE_NAVBAR = 0.5 +SCROLLBAR_WIDTH = 6 # px +HEADER_HEIGHT = 3.75 + +COLLAPSE_CONTROLL_CLASS = "collapsedControl" +if major == 1: + if 36 < minnor <= 37: + COLLAPSE_CONTROLL_CLASS = "collapsedControl" + if minnor >= 38: + COLLAPSE_CONTROLL_CLASS = "stSidebarCollapsedControl" NAV_STYLE = f""" -header[data-testid="stHeader"] {{ - margin-right: 6px; -}} div:has(> iframe[title="{_component_func.name}"]) [data-testid="stSkeleton"] {{ height: 3.75rem; }} @@ -34,11 +50,13 @@ width: 100%; }} div:has(> iframe[title="{_component_func.name}"]) {{ + position: sticky; opacity: 1 !important; display: flex; flex-direction: column; align-items: center; - padding: 0 2.5rem; + padding: 0; + margin-top: calc(-1 * {GAP_BETWEEN_COMPS}rem); }} """ @@ -55,13 +73,6 @@ .stApp > header {{ border-bottom: 1px solid #c3c3c380; }} - div:has(> iframe[title="{_component_func.name}"]) {{ - position: fixed; - z-index: 1000; - top: calc(3.75rem - 0.125rem); - padding: 0; - margin-top: calc((-1 * {GAP_BETWEEN_COMPS})); - }} div:has(> iframe[title="{_component_func.name}"]) [data-testid="stSkeleton"], iframe[title="{_component_func.name}"] {{ position: relative; @@ -70,40 +81,35 @@ background-color: var(--background-color); /* box-shadow: none !important; */ }} + div:has(> iframe[title="{_component_func.name}"]) {{ + z-index: 1000; + }} @media (min-width: 576px) {{ div:has(> iframe[title="{_component_func.name}"]) {{ - width: calc(100% + 10rem + 1rem - 1px); - margin-left: -5.5rem; - padding: 0 1.5rem; + width: 100%; }} }} - @media (max-width: 575px) {{ + @media (max-width: 575.98px) {{ div:has(> iframe[title="{_component_func.name}"]) {{ - width: calc(100vw + 1rem - 7px); - margin-left: -1.5rem; - padding: 0 1.5rem; + width: 100%; }} }} @media (min-width: 768px) {{ div:has(> iframe[title="{_component_func.name}"]) {{ - position: sticky !important; - width: calc(100% + 8rem + 1rem - 1px); - margin-top: calc(-3rem + (-1 * {GAP_BETWEEN_COMPS})); - margin-left: -4.5rem; - padding: 0 0.5rem; + width: 100%; }} }} """ UNDER_NAV_STICKY_STYLE = f""" - div:has(> iframe[title="{_component_func.name}"]) + div {{ - margin-top: 2rem; + div:has(> iframe[title="{_component_func.name}"]) {{ + top: calc({HEADER_HEIGHT}rem + 1rem); }} """ UNDER_NAV_FIXED_STYLE = f""" - div:has(> iframe[title="{_component_func.name}"]) + div {{ - margin-top: 2rem; + div:has(> iframe[title="{_component_func.name}"]) {{ + top: calc({HEADER_HEIGHT}rem - 5px); }} """ @@ -112,144 +118,109 @@ background: transparent !important; }} div:has(> iframe[title="{_component_func.name}"]) {{ - top: 0rem; + top: {TOP_LINE_HEIGHT}rem; z-index: 999990; padding: 0; - margin-top: calc((-1 * {GAP_BETWEEN_COMPS})); }} div:has(> iframe[title="{_component_func.name}"]) [data-testid="stSkeleton"], iframe[title="{_component_func.name}"] {{ position: relative; - top: 0.125rem; + top: {TOP_LINE_HEIGHT}rem; border-top-right-radius: 0; border-top-left-radius: 0; }} - [data-testid="collapsedControl"] {{ - /* flex-direction: column !important; */ + [data-testid="{COLLAPSE_CONTROLL_CLASS}"] {{ border-right: solid 1px #c3c3c380; }} - [data-testid="collapsedControl"]:has(> [data-testid="stLogoSpacer"]) {{ + [data-testid="{COLLAPSE_CONTROLL_CLASS}"]:has(> [data-testid="stLogoSpacer"]) {{ flex-direction: row !important; }} -""" - -NAV_TOP_FIXED_LOGO_MARGIN = "0.7125em" -NAV_TOP_FIXED_STYLE = f""" - div:has(> iframe[title="{_component_func.name}"]) {{ - /* width: calc(100% - 6rem); */ - /* left: 4.25rem; */ + div:has(> iframe[title="{_component_func.name}"]) + div {{ + margin-top: 2rem; }} - @media (max-width: 768px) {{ + + /* AJUSTE DEL ANCHO */ + @media (min-width: 576px) {{ div:has(> iframe[title="{_component_func.name}"]) {{ - width: calc(100% - 8rem); - left: 4.5rem; + width: calc(100% - {MARGIN_SIDE_NAVBAR}rem + {SCROLLBAR_WIDTH}px); }} - }} - @media(max-width: 575px) {{ - div:has(> iframe[title="{_component_func.name}"]) {{ - width: calc(100% - 5em); - left: 0; + [data-layout="narrow"] div:has(> iframe[title="{_component_func.name}"]) {{ + width: calc(100% - {MARGIN_SIDE_NAVBAR}rem + {SCROLLBAR_WIDTH}px - 2 * {MARGIN_SIDE_NARROW_DIFF}rem); + left: calc({TOP_SIDE_ELEMENTS_MARGIN}rem + {TOP_SIDE_ELEMENTS_WIDTH}rem); }} - body:has([data-testid="collapsedControl"] > img) div:has(> iframe[title="{_component_func.name}"]) {{ - width: calc(100% - 11rem); - left: 7.5rem; - }} - body:has([data-testid="collapsedControl"] > img:last-child) div:has(> iframe[title="{_component_func.name}"]) {{ - width: calc(100% - 9rem); - left: 5.125rem; - }} - body:has([data-testid="collapsedControl"] > [data-testid="stLogoSpacer"]) div:has(> iframe[title="{_component_func.name}"]) {{ - width: calc(100% - 7.75rem); - left: 4.125rem; + [data-layout="narrow"]:has(> [data-testid="stSidebar"][aria-expanded="true"]) div:has(> iframe[title="{_component_func.name}"]) {{ + left: 0; }} }} - @media (min-width: 576px) {{ + @media(max-width: 575.98px) {{ div:has(> iframe[title="{_component_func.name}"]) {{ - width: 100%; - padding: 0; - margin-left: calc(-0.5rem - 0.5em); + width: calc(100% - 2*({TOP_SIDE_ELEMENTS_WIDTH}rem + {MARGIN_SIDE_NAVBAR}rem)); + left: calc({TOP_SIDE_ELEMENTS_MARGIN}rem + {TOP_SIDE_ELEMENTS_WIDTH}rem + {MARGIN_SIDE_NAVBAR}rem); }} - body:has([data-testid="collapsedControl"] > img:last-child) div:has(> iframe[title="{_component_func.name}"]) {{ - width: calc(100% - 1.25em); - margin-left: calc(-0.5rem + 0.75em); + [data-layout="narrow"] div:has(> iframe[title="{_component_func.name}"]) {{ + width: calc(100% - 2*({TOP_SIDE_ELEMENTS_WIDTH}rem + {MARGIN_SIDE_NAVBAR}rem - {MARGIN_SIDE_NARROW_DIFF}rem)); + left: calc({TOP_SIDE_ELEMENTS_MARGIN}rem + {TOP_SIDE_ELEMENTS_WIDTH}rem + {MARGIN_SIDE_NAVBAR}rem); }} - body:has([data-testid="collapsedControl"] > img) div:has(> iframe[title="{_component_func.name}"]) {{ - width: calc(100% - 3em); - margin-left: calc(-0.5rem + 3em); + [data-layout="wide"]:not(:has(> [data-testid="{COLLAPSE_CONTROLL_CLASS}"])) div:has(> iframe[title="{_component_func.name}"]) {{ + width: calc(100% - {TOP_SIDE_ELEMENTS_WIDTH}rem); + left: 0; }} - body:has([data-testid="collapsedControl"] > [data-testid="stLogoSpacer"]) div:has(> iframe[title="{_component_func.name}"]) {{ + [data-layout="narrow"]:not(:has(> [data-testid="{COLLAPSE_CONTROLL_CLASS}"])) div:has(> iframe[title="{_component_func.name}"]) {{ width: 100%; - margin-left: calc(-0.5rem - 0.125em); + margin-left: calc(-1*({MARGIN_SIDE_NARROW_DIFF}rem)); + left: 0; }} }} - div:has(> iframe[title="{_component_func.name}"]) + div {{ - margin-top: 2rem; - }} """ -NAV_TOP_STICKY_LOGO_MARGIN = "1.25em" +NAV_TOP_FIXED_STYLE = f""" +""" + NAV_TOP_STICKY_STYLE = f""" - div:has(> iframe[title="{_component_func.name}"]) {{ - width: calc(100% - 8.5rem); - left: calc(4.25rem + {NAV_TOP_STICKY_LOGO_MARGIN}); - }} - @media (min-width: 576px) {{ - div:has(> iframe[title="{_component_func.name}"]) {{ - width: calc(100% - {NAV_TOP_STICKY_LOGO_MARGIN}); - margin-left: -4.25rem; - padding: 0; - }} - body:has([data-testid="collapsedControl"] > img:last-child) div:has(> iframe[title="{_component_func.name}"]) {{ - width: calc(100% - 2em); - left: 4.25em; - }} - body:has([data-testid="collapsedControl"] > img) div:has(> iframe[title="{_component_func.name}"]) {{ - width: calc(100% - 3.5em); - left: 7.5em; - }} - body:has([data-testid="collapsedControl"] > [data-testid="stLogoSpacer"]) div:has(> iframe[title="{_component_func.name}"]) {{ - width: 100%; - left: 4.25rem; - }} +""" + +VERTICAL_ST_STYLE = f""" + header {{ + position: static; }} @media(max-width: 575px) {{ - div:has(> iframe[title="{_component_func.name}"]) {{ - width: calc(100% - 5rem); - left: 0; - }} - body:has([data-testid="collapsedControl"] > img:last-child) div:has(> iframe[title="{_component_func.name}"]) {{ - width: calc(100% - 9.215em); - left: 5.25rem; - }} - body:has([data-testid="collapsedControl"] > img) div:has(> iframe[title="{_component_func.name}"]) {{ - width: calc(100% - 11em); - left: 7.5rem; - }} - body:has([data-testid="collapsedControl"] > [data-testid="stLogoSpacer"]) div:has(> iframe[title="{_component_func.name}"]) {{ - width: calc(100% - 8rem); - left: 4.25rem; + body:has( [data-testid="{COLLAPSE_CONTROLL_CLASS}"] > [data-testid="stLogo"]) [data-testid="stHeader"] {{ + height: 5.75rem; }} }} - div:has(> iframe[title="{_component_func.name}"]) + div {{ - margin-top: 2rem; + [data-testid="{COLLAPSE_CONTROLL_CLASS}"], [data-testid="stToolbar"] {{ + max-width: {TOP_SIDE_ELEMENTS_WIDTH}rem; + width: {TOP_SIDE_ELEMENTS_WIDTH}rem; + backdrop-filter: blur(5px); + max-height: 3rem; }} -""" - -VERTICAL_ST_STYLE = """ - header { - position: static; - } - - [data-testid="stToolbar"] { + [data-testid="stToolbar"] {{ display: flex; flex-direction: column-reverse; flex-wrap: nowrap; align-items: flex-end; border-left: solid 1px #c3c3c380; - } - - [data-testid="stStatusWidget"] { - position: absolute; + justify-content: flex-end; + overflow: visible; + + /* AJUSTE DEL LATERAL */ + right: calc({TOP_SIDE_ELEMENTS_MARGIN}rem + {SCROLLBAR_WIDTH}px); + }} + [data-testid="{COLLAPSE_CONTROLL_CLASS}"] {{ + flex-direction: column !important; + justify-content: flex-start; + + /* AJUSTE DEL LATERAL */ + left: {TOP_SIDE_ELEMENTS_MARGIN}rem; + }} + [data-testid="{COLLAPSE_CONTROLL_CLASS}"]:has([data-testid="stLogoSpacer"]) {{ + flex-direction: column-reverse !important; + }} + [data-testid="{COLLAPSE_CONTROLL_CLASS}"] [data-testid="stLogoSpacer"] {{ + display: none; + }} + [data-testid="stStatusWidget"] {{ + position: relative; right: 0; top: 100%; margin-top: 1rem; @@ -258,21 +229,20 @@ padding: 0.5em; border: 1px solid #dcdcdc2e; border-radius: 5px; - } + }} - [data-testid="stToolbar"] > [data-testid="stToolbarActions"] { + [data-testid="stToolbar"] > [data-testid="stToolbarActions"] {{ display: flex; -webkit-box-align: center; align-items: flex-end; flex-direction: column; flex-wrap: nowrap; - } + }} """ STICKY_NAV_STYLE = f""" div:has(> iframe[title="{_component_func.name}"]) {{ - position: sticky; - padding-top: 0.5rem !important; + }} div:has(> iframe[title="{_component_func.name}"]) [data-testid="stSkeleton"], iframe[title="{_component_func.name}"] {{ @@ -281,9 +251,11 @@ }} """ FIXED_NAV_STYLE = f""" +.stMainBlockContainer {{ + padding-top: 3rem; +}} div:has(> iframe[title="{_component_func.name}"]) {{ - position: sticky; /* Fixed with custom width */ - /* margin-top: calc(-6rem + (-1 * {GAP_BETWEEN_COMPS})); */ + margin-bottom: 1rem; }} div:has(> iframe[title="{_component_func.name}"]) [data-testid="stSkeleton"], iframe[title="{_component_func.name}"] {{ @@ -392,7 +364,8 @@ def st_navbar( option_menu=False, default_app_selected_id=None, override_app_selected_id=None, - reclick_load=True + reclick_load=True, + input_styles: str = None ): # if key not in st.session_state: # st.session_state[key] = None @@ -492,7 +465,8 @@ def st_navbar( if hide_streamlit_markers: style += HIDE_ST_STYLE - st.markdown(f"', unsafe_allow_html=True) if self._within_fragment: - new_app_id = self._fragment_navbar(menu_data) + new_app_id = self._fragment_navbar(menu_data, styles=styles) else: - new_app_id = self._standalone_navbar(menu_data) + new_app_id = self._standalone_navbar(menu_data, styles=styles) if new_app_id != self.session_state.selected_app: self.session_state.selected_app = new_app_id @@ -589,38 +648,75 @@ def _run_navbar(self, menu_data): return new_app_id - def _run_selected(self): - app_label = None - try: - if self.session_state.selected_app is None: + def _get_next_app_info(self): + if self.session_state.selected_app is None: + self.session_state.other_nav_app = None + self.session_state.previous_app = None + self.session_state.selected_app = self._home_id + app_id = self._home_id + + else: + if self.session_state.other_nav_app is not None: + self.session_state.previous_app = self.session_state.selected_app + self.session_state.selected_app = self.session_state.other_nav_app self.session_state.other_nav_app = None - self.session_state.previous_app = None - self.session_state.selected_app = self._home_id - app = self._home_app - app_id = self._home_id + elif self.session_state.url_nav_app is not None: + self.session_state.previous_app = self.session_state.selected_app + self.session_state.selected_app = self.session_state.url_nav_app + self.session_state.url_nav_app = None + if self.session_state.selected_app == self._home_id: + app_id = self._home_id else: - if self.session_state.other_nav_app is not None: - self.session_state.previous_app = self.session_state.selected_app - self.session_state.selected_app = self.session_state.other_nav_app - self.session_state.other_nav_app = None - - if self.session_state.selected_app == self._home_id: - app = self._home_app - app_id = self._home_id - else: - app = self._apps[self.session_state.selected_app] - app_id = self.session_state.selected_app + app_id = self.session_state.selected_app + + app_label = app_id + if app_id in self._navbar_pointers: + app_label = self._navbar_pointers[app_id][0] + if app_id == self._home_id: + app_label = self._home_label[0] + if app_id == self._logout_id: + app_label = self._logout_label[0] - app_label = app_id - if app_id in self._navbar_pointers: - app_label = self._navbar_pointers[app_id][0] - if app_id == self._home_id: - app_label = self._home_label[0] - if app_id == self._logout_id: - app_label = self._logout_label[0] + return app_id, app_label + def _raise_base_exception(self, e, app_label): + if isinstance(e, RerunException): + raise e + + if isinstance(e, StopException): + while isinstance(e, StopException): + if e.__context__ is None: + break + e = e.__context__ + + trace_err = "".join(traceback.format_exception(type(e), e, e.__traceback__)) + # trace_err = traceback.format_exc() + + if isinstance(e, StopException): + raise e + + logger.error(trace_err) + + # TODO: Averiguar como parar un stop y poder enviar el error a la interfaz de streamlit + run_ctx = get_script_run_ctx() + with run_ctx.script_requests._lock: + run_ctx.script_requests._state = ScriptRequestType.CONTINUE + + self.session_state.uncaught_error = trace_err + + st.error( + f'😭 Error triggered from app: **{app_label}**\n\n' + f'Details:\n' + f'```{trace_err}```', + icon="🚨" + ) + raise e + + def _run_selected(self, app): + app_label = None + try: # print("Running", app_label) if self._verbose and self.session_state.uncaught_error: st.error( @@ -633,6 +729,9 @@ def _run_selected(self): # with self._theme_change_container: # self._run_change_theme() + if self._allow_url_nav: + st.query_params['page'] = app.get_id() + if self._user_loader and app.has_loading(): self._loader_app.run(app, status_msg=app_label) else: @@ -640,38 +739,8 @@ def _run_selected(self): app.run() self.session_state.uncaught_error = None - except BaseException as e: - if isinstance(e, RerunException): - raise e - - if isinstance(e, StopException): - while isinstance(e, StopException): - if e.__context__ is None: - break - e = e.__context__ - - trace_err = "".join(traceback.format_exception(type(e), e, e.__traceback__)) - # trace_err = traceback.format_exc() - - logger.error(trace_err) - - if isinstance(e, StopException): - raise e - - # TODO: Averiguar como parar un stop y poder enviar el error a la interfaz de streamlit - run_ctx = get_script_run_ctx() - with run_ctx.script_requests._lock: - run_ctx.script_requests._state = ScriptRequestType.CONTINUE - - self.session_state.uncaught_error = trace_err - - st.error( - f'😭 Error triggered from app: **{app_label}**\n\n' - f'Details:\n' - f'```{trace_err}```', - icon="🚨" - ) - raise e + except Exception as e: + self._raise_base_exception(e, app_label) def _clear_session_values(self): for key in st.session_state: @@ -762,7 +831,7 @@ def get_user_session_params(self): def _do_logout(self): self.session_state.allow_access = self._no_access_level - self._logged_in = False + self.session_state.logged_in = False # self._delete_cookie_cache() if callable(self._logout_callback): self._logout_callback() @@ -771,14 +840,14 @@ def _do_logout(self): def _do_url_params(self): if self._allow_url_nav: - query_params = st.query_params - if 'selected' in query_params: + if 'page' in query_params: # and (query_params['selected'])[0] != self.session_state.previous_app: - if query_params['selected'] != 'None' and query_params['selected'] != self.session_state.selected_app: - self.session_state.other_nav_app = query_params['selected'] - del query_params['selected'] - + if query_params['page'] != 'None' and query_params['page'] != self.session_state.selected_app: + self.session_state.url_nav_app = query_params['page'] + del query_params['page'] + else: + self.session_state.url_nav_app = None def enable_guest_access(self, guest_access_level=1, guest_username='guest'): """ This method will auto login a guest user when the app is secured with a login app, this will allow fora guest user to by-pass the login app and gain access to the other apps that the assigned access level will allow. @@ -859,22 +928,22 @@ def run(self): else: cols[idx].image(im) - if self.session_state.allow_access > self._no_access_level or self._login_app is None: - if callable(self._login_callback): - if not self.session_state.logged_in: - self.session_state.logged_in = True - self._login_callback() + # Verifico la autenticacion (loggued_in) y la autorizacion (allow_access) + if self._check_login_callback(): if self._nav_item_count == 0: self._default() else: self._build_nav_menu() - self._run_selected() - elif self.session_state.allow_access < self._no_access_level: - self.session_state.current_user = self._guest_name - self._unsecure_app.run() + + app_id, app_label = self._get_next_app_info() + app = self._apps.get(app_id) + # Aqui se verifica autorizacion + self._run_selected(app) + # elif self.session_state.allow_access < self._no_access_level: + # self.session_state.current_user = self._guest_name + # self._unsecure_app.run() else: - self.session_state.logged_in = False self.session_state.current_user = None self.session_state.access_hash = None self._login_app.run()