From c694f42c0776748ffd895750a65dcff0659ca69c Mon Sep 17 00:00:00 2001 From: Kodjo Sossouvi Date: Sat, 2 Aug 2025 15:27:11 +0200 Subject: [PATCH] The correct tab is shown on undo - redo --- src/components/tabs/components/MyTabs.py | 15 +++++++++++++++ src/components/undo_redo/components/UndoRedo.py | 15 +++++++++++---- src/components/undo_redo/constants.py | 1 + 3 files changed, 27 insertions(+), 4 deletions(-) diff --git a/src/components/tabs/components/MyTabs.py b/src/components/tabs/components/MyTabs.py index 8ce1de2..f139c23 100644 --- a/src/components/tabs/components/MyTabs.py +++ b/src/components/tabs/components/MyTabs.py @@ -152,6 +152,14 @@ class MyTabs(BaseComponent): def get_tab_content_by_key(self, key): return self.tabs_by_key[key].content if key in self.tabs_by_key else None + def show_tab(self, tab_key, updated_content=None): + if updated_content: + tab_id = self._get_tab_id_from_tab_key(tab_key) + self.set_tab_content(tab_id, updated_content) + + self.select_tab_by_key(tab_key) + return self.refresh() + def refresh(self): return self.render(oob=True) @@ -188,6 +196,13 @@ class MyTabs(BaseComponent): active_tab = next(filter(lambda t: t.active, self.tabs), None) return active_tab.content if active_tab else None + def get_active_tab_key(self): + active_tab = next(filter(lambda t: t.active, self.tabs), None) + return active_tab.key if active_tab else None + + def _get_tab_id_from_tab_key(self, tab_key): + return self.tabs_by_key[tab_key].id if tab_key in self.tabs_by_key else None + @staticmethod def create_component_id(session): prefix = f"{MY_TABS_INSTANCE_ID}{session['user_id']}" diff --git a/src/components/undo_redo/components/UndoRedo.py b/src/components/undo_redo/components/UndoRedo.py index edb00b4..73af3d5 100644 --- a/src/components/undo_redo/components/UndoRedo.py +++ b/src/components/undo_redo/components/UndoRedo.py @@ -17,6 +17,7 @@ logger = logging.getLogger("UndoRedoApp") @dataclass class CommandHistory: attrs: UndoRedoAttrs + tab_key: str | None digest: str | None # digest to remember entry: str # digest to remember key: str # key @@ -35,11 +36,13 @@ class UndoRedo(BaseComponentSingleton): def snapshot(self, undo_redo_attrs: UndoRedoAttrs, entry, key, path=None): digest = self._settings_manager.get_digest(self._session, entry) # get the current digest (the last one) + active_tab_key = self.tabs_manager.get_active_tab_key() # init the history if this is the first call if len(self.history) == 0: digest_history = self._settings_manager.history(self._session, entry, digest, 2) command = CommandHistory(undo_redo_attrs, + active_tab_key, digest_history[1] if len(digest_history) > 1 else None, entry, key, @@ -47,7 +50,7 @@ class UndoRedo(BaseComponentSingleton): self.history.append(command) self.index = 0 - command = CommandHistory(undo_redo_attrs, digest, entry, key, path) + command = CommandHistory(undo_redo_attrs, active_tab_key, digest, entry, key, path) self.history = self.history[:self.index + 1] # self.history.append(command) @@ -76,7 +79,9 @@ class UndoRedo(BaseComponentSingleton): if current.attrs.on_undo is not None: ret = current.attrs.on_undo() - if isinstance(ret, FT) and 'id' in ret.attrs: + if current.attrs.update_tab and current.tab_key is not None and current.tab_key != self.tabs_manager.get_active_tab_key(): + ret = self.tabs_manager.show_tab(current.tab_key) + elif isinstance(ret, FT) and 'id' in ret.attrs: ret.attrs["hx-swap-oob"] = "true" return self, ret else: @@ -98,14 +103,16 @@ class UndoRedo(BaseComponentSingleton): if current_state is not NoDefault: current_state[current.key] = next_state[current.key] else: - current_state = {current.key : next_state[current.key]} + current_state = {current.key: next_state[current.key]} self._settings_manager.save(self._session, current.entry, current_state) self.index += 1 if current.attrs.on_redo is not None: ret = current.attrs.on_undo() - if isinstance(ret, FT) and 'id' in ret.attrs: + if current.attrs.update_tab and current.tab_key is not None and current.tab_key != self.tabs_manager.get_active_tab_key(): + ret = self.tabs_manager.show_tab(current.tab_key) + elif isinstance(ret, FT) and 'id' in ret.attrs: ret.attrs["hx-swap-oob"] = "true" return self, ret else: diff --git a/src/components/undo_redo/constants.py b/src/components/undo_redo/constants.py index 552143a..e4e315e 100644 --- a/src/components/undo_redo/constants.py +++ b/src/components/undo_redo/constants.py @@ -15,6 +15,7 @@ class Routes: class UndoRedoAttrs: name: str desc: str = None + update_tab: bool = True on_undo: Callable = None on_redo: Callable = None