The correct tab is shown on undo - redo
This commit is contained in:
@@ -152,6 +152,14 @@ class MyTabs(BaseComponent):
|
|||||||
def get_tab_content_by_key(self, key):
|
def get_tab_content_by_key(self, key):
|
||||||
return self.tabs_by_key[key].content if key in self.tabs_by_key else None
|
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):
|
def refresh(self):
|
||||||
return self.render(oob=True)
|
return self.render(oob=True)
|
||||||
|
|
||||||
@@ -188,6 +196,13 @@ class MyTabs(BaseComponent):
|
|||||||
active_tab = next(filter(lambda t: t.active, self.tabs), None)
|
active_tab = next(filter(lambda t: t.active, self.tabs), None)
|
||||||
return active_tab.content if active_tab else 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
|
@staticmethod
|
||||||
def create_component_id(session):
|
def create_component_id(session):
|
||||||
prefix = f"{MY_TABS_INSTANCE_ID}{session['user_id']}"
|
prefix = f"{MY_TABS_INSTANCE_ID}{session['user_id']}"
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ logger = logging.getLogger("UndoRedoApp")
|
|||||||
@dataclass
|
@dataclass
|
||||||
class CommandHistory:
|
class CommandHistory:
|
||||||
attrs: UndoRedoAttrs
|
attrs: UndoRedoAttrs
|
||||||
|
tab_key: str | None
|
||||||
digest: str | None # digest to remember
|
digest: str | None # digest to remember
|
||||||
entry: str # digest to remember
|
entry: str # digest to remember
|
||||||
key: str # key
|
key: str # key
|
||||||
@@ -35,11 +36,13 @@ class UndoRedo(BaseComponentSingleton):
|
|||||||
|
|
||||||
def snapshot(self, undo_redo_attrs: UndoRedoAttrs, entry, key, path=None):
|
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)
|
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
|
# init the history if this is the first call
|
||||||
if len(self.history) == 0:
|
if len(self.history) == 0:
|
||||||
digest_history = self._settings_manager.history(self._session, entry, digest, 2)
|
digest_history = self._settings_manager.history(self._session, entry, digest, 2)
|
||||||
command = CommandHistory(undo_redo_attrs,
|
command = CommandHistory(undo_redo_attrs,
|
||||||
|
active_tab_key,
|
||||||
digest_history[1] if len(digest_history) > 1 else None,
|
digest_history[1] if len(digest_history) > 1 else None,
|
||||||
entry,
|
entry,
|
||||||
key,
|
key,
|
||||||
@@ -47,7 +50,7 @@ class UndoRedo(BaseComponentSingleton):
|
|||||||
self.history.append(command)
|
self.history.append(command)
|
||||||
self.index = 0
|
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 = self.history[:self.index + 1] #
|
||||||
self.history.append(command)
|
self.history.append(command)
|
||||||
@@ -76,7 +79,9 @@ class UndoRedo(BaseComponentSingleton):
|
|||||||
|
|
||||||
if current.attrs.on_undo is not None:
|
if current.attrs.on_undo is not None:
|
||||||
ret = current.attrs.on_undo()
|
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"
|
ret.attrs["hx-swap-oob"] = "true"
|
||||||
return self, ret
|
return self, ret
|
||||||
else:
|
else:
|
||||||
@@ -98,14 +103,16 @@ class UndoRedo(BaseComponentSingleton):
|
|||||||
if current_state is not NoDefault:
|
if current_state is not NoDefault:
|
||||||
current_state[current.key] = next_state[current.key]
|
current_state[current.key] = next_state[current.key]
|
||||||
else:
|
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._settings_manager.save(self._session, current.entry, current_state)
|
||||||
|
|
||||||
self.index += 1
|
self.index += 1
|
||||||
|
|
||||||
if current.attrs.on_redo is not None:
|
if current.attrs.on_redo is not None:
|
||||||
ret = current.attrs.on_undo()
|
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"
|
ret.attrs["hx-swap-oob"] = "true"
|
||||||
return self, ret
|
return self, ret
|
||||||
else:
|
else:
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ class Routes:
|
|||||||
class UndoRedoAttrs:
|
class UndoRedoAttrs:
|
||||||
name: str
|
name: str
|
||||||
desc: str = None
|
desc: str = None
|
||||||
|
update_tab: bool = True
|
||||||
on_undo: Callable = None
|
on_undo: Callable = None
|
||||||
on_redo: Callable = None
|
on_redo: Callable = None
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user