Working version of tabsearch. Added subsequent and fuzzy matching. Need to fix the unit tests

This commit is contained in:
2025-11-16 11:52:22 +01:00
parent 09c4217cb6
commit c38a012c74
9 changed files with 290 additions and 47 deletions

View File

@@ -77,11 +77,6 @@ class Commands(BaseCommands):
return Command(f"{self._prefix}UpdateBoundaries",
"Update component boundaries",
self._owner.update_boundaries).htmx(target=None)
def search_tab(self, query: str):
return Command(f"{self._prefix}SearchTab",
"Search for a tab by name",
self._owner.search_tab, query).htmx(target=f"#{self._id}-dropdown-content")
class TabsManager(MultipleInstance):
@@ -97,7 +92,10 @@ class TabsManager(MultipleInstance):
self._state = TabsManagerState(self)
self.commands = Commands(self)
self._boundaries = Boundaries()
self._search = Search(self._session).set_items(self._get_tabs_labels())
self._search = Search(self._session,
items=self._get_tab_list(),
get_attr=lambda x: x["label"],
template=self._mk_tab_button)
logger.debug(f"TabsManager created with id: {self._id}")
logger.debug(f" tabs : {self._get_ordered_tabs()}")
logger.debug(f" active tab : {self._state.active_tab}")
@@ -176,6 +174,7 @@ class TabsManager(MultipleInstance):
# Add tab metadata to state
state.tabs[tab_id] = {
'id': tab_id,
'label': label,
'component_type': component_type,
'component_id': component_id
@@ -193,7 +192,7 @@ class TabsManager(MultipleInstance):
# finally, update the state
self._state.update(state)
self._search.set_items(self._get_tabs_labels())
self._search.set_items(self._get_tab_list())
return tab_id
@@ -251,23 +250,10 @@ class TabsManager(MultipleInstance):
# Update state
self._state.update(state)
self._search.set_items(self._get_tabs_labels())
self._search.set_items(self._get_tab_list())
return self
def search_tab(self, query: str):
"""
Search tabs by name (for dropdown search).
Args:
query: Search query
Returns:
Dropdown content with filtered tabs
"""
# This will be implemented later for search functionality
pass
def add_tab_btn(self):
return mk.icon(tab_add24_regular,
id=f"{self._id}-add-tab-btn",
@@ -285,7 +271,7 @@ class TabsManager(MultipleInstance):
def _mk_tabs_header(self, oob=False):
# Create visible tab buttons
visible_tab_buttons = [
self._mk_tab_button(tab_id, self._state.tabs[tab_id])
self._mk_tab_button(self._state.tabs[tab_id])
for tab_id in self._state.tabs_order
if tab_id in self._state.tabs
]
@@ -300,7 +286,7 @@ class TabsManager(MultipleInstance):
hx_swap_oob="true" if oob else None
)
def _mk_tab_button(self, tab_id: str, tab_data: dict, in_dropdown: bool = False):
def _mk_tab_button(self, tab_data: dict, in_dropdown: bool = False):
"""
Create a single tab button with its label and close button.
@@ -312,6 +298,7 @@ class TabsManager(MultipleInstance):
Returns:
Button element representing the tab
"""
tab_id = tab_data["id"]
is_active = tab_id == self._state.active_tab
close_btn = mk.mk(
@@ -382,8 +369,8 @@ class TabsManager(MultipleInstance):
hx_swap_oob=f"beforeend:#{self._id}-content-wrapper",
)
def _get_tabs_labels(self):
return [tab["label"] for tab in self._state.tabs.values()]
def _get_tab_list(self):
return [self._state.tabs[tab_id] for tab_id in self._state.tabs_order if tab_id in self._state.tabs]
def update_boundaries(self):
return Script(f"updateBoundaries('{self._id}');")