From 7f3e6270a264103473ccedfaeeb1fcf944645557 Mon Sep 17 00:00:00 2001 From: Kodjo Sossouvi Date: Sun, 25 Jan 2026 09:47:05 +0100 Subject: [PATCH] Added draft of DataGridColumnsManager that uses Search and Dropdown --- src/myfasthtml/assets/myfasthtml.css | 2 +- src/myfasthtml/controls/DataGrid.py | 5 ++++- .../controls/DataGridColumnsManager.py | 22 +++++++++++++++++-- src/myfasthtml/controls/DataGridsManager.py | 7 ++---- src/myfasthtml/controls/Search.py | 2 +- src/myfasthtml/core/instances.py | 2 +- 6 files changed, 29 insertions(+), 11 deletions(-) diff --git a/src/myfasthtml/assets/myfasthtml.css b/src/myfasthtml/assets/myfasthtml.css index 29eb6ff..9053953 100644 --- a/src/myfasthtml/assets/myfasthtml.css +++ b/src/myfasthtml/assets/myfasthtml.css @@ -459,7 +459,7 @@ .mf-search-results { margin-top: 0.5rem; - max-height: 200px; + max-height: 400px; overflow: auto; } diff --git a/src/myfasthtml/controls/DataGrid.py b/src/myfasthtml/controls/DataGrid.py index 759ec04..cf96926 100644 --- a/src/myfasthtml/controls/DataGrid.py +++ b/src/myfasthtml/controls/DataGrid.py @@ -14,6 +14,7 @@ from myfasthtml.controls.CycleStateControl import CycleStateControl from myfasthtml.controls.DataGridColumnsManager import DataGridColumnsManager from myfasthtml.controls.DataGridQuery import DataGridQuery, DG_QUERY_FILTER from myfasthtml.controls.Mouse import Mouse +from myfasthtml.controls.Panel import Panel from myfasthtml.controls.datagrid_objects import DataGridColumnState, DataGridRowState, \ DatagridSelectionState, DataGridHeaderFooterConf, DatagridEditionState from myfasthtml.controls.helpers import mk @@ -138,6 +139,8 @@ class DataGrid(MultipleInstance): self.commands = Commands(self) self.init_from_dataframe(self._state.ne_df, init_state=False) # state comes from DatagridState + self._panel = Panel(self, _id="-panel") + # add DataGridQuery self._datagrid_filter = DataGridQuery(self) self._datagrid_filter.bind_command("QueryChanged", self.commands.filter()) @@ -649,7 +652,7 @@ class DataGrid(MultipleInstance): self._columns_manager, cls="flex"), cls="flex items-center justify-between mb-2"), - self.mk_table(), + self._panel.set_main(self.mk_table()), Script(f"initDataGrid('{self._id}');"), Mouse(self, combinations=self._mouse_support), id=self._id, diff --git a/src/myfasthtml/controls/DataGridColumnsManager.py b/src/myfasthtml/controls/DataGridColumnsManager.py index a4266f1..574a946 100644 --- a/src/myfasthtml/controls/DataGridColumnsManager.py +++ b/src/myfasthtml/controls/DataGridColumnsManager.py @@ -1,6 +1,8 @@ -from fasthtml.components import Div +from fasthtml.components import * from myfasthtml.controls.Dropdown import Dropdown +from myfasthtml.controls.Search import Search +from myfasthtml.controls.datagrid_objects import DataGridColumnState from myfasthtml.controls.helpers import mk from myfasthtml.icons.fluent_p1 import settings16_regular @@ -9,7 +11,23 @@ class DataGridColumnsManager(Dropdown): def __init__(self, parent, _id=None): super().__init__(parent, _id=_id, align="right") self.button = mk.icon(settings16_regular) - self.content = Div("DataGridColumnsManager") + self.content = self.create_content() + def mk_column(self, col_def: DataGridColumnState): + return Div( + Input(type="checkbox", checked=col_def.visible, cls="ml-2"), + Label(col_def.col_id, cls="ml-2"), + cls="flex mb-1", + ) + + def create_content(self): + return Search(self, + items_names="Columns", + items=self.columns, + get_attr=lambda x: x.col_id, + template=self.mk_column + ) + + @property def columns(self): return self._parent._state.columns diff --git a/src/myfasthtml/controls/DataGridsManager.py b/src/myfasthtml/controls/DataGridsManager.py index 33594fd..9e070c2 100644 --- a/src/myfasthtml/controls/DataGridsManager.py +++ b/src/myfasthtml/controls/DataGridsManager.py @@ -8,7 +8,6 @@ from fasthtml.components import Div from myfasthtml.controls.BaseCommands import BaseCommands from myfasthtml.controls.DataGrid import DataGrid from myfasthtml.controls.FileUpload import FileUpload -from myfasthtml.controls.Panel import Panel from myfasthtml.controls.TabsManager import TabsManager from myfasthtml.controls.TreeView import TreeView, TreeNode from myfasthtml.controls.helpers import mk @@ -106,7 +105,7 @@ class DataGridsManager(MultipleInstance): parent_id = self._tree.ensure_path(document.namespace) tree_node = TreeNode(label=document.name, type="excel", parent=parent_id) self._tree.add_node(tree_node, parent_id=parent_id) - return self._mk_tree(), self._tabs_manager.change_tab_content(tab_id, document.name, Panel(self).set_main(dg)) + return self._mk_tree(), self._tabs_manager.change_tab_content(tab_id, document.name, dg) def select_document(self, node_id): document_id = self._tree.get_bag(node_id) @@ -137,9 +136,7 @@ class DataGridsManager(MultipleInstance): # Recreate the DataGrid with its saved state dg = DataGrid(self._tabs_manager, _id=document.datagrid_id) # reload the state & settings - - # Wrap in Panel - return Panel(self).set_main(dg) + return dg def clear_tree(self): self._state.elements = [] diff --git a/src/myfasthtml/controls/Search.py b/src/myfasthtml/controls/Search.py index edf7f6b..61c25ab 100644 --- a/src/myfasthtml/controls/Search.py +++ b/src/myfasthtml/controls/Search.py @@ -64,7 +64,7 @@ class Search(MultipleInstance): self.items = items or [] self.filtered = self.items.copy() self.get_attr = get_attr or (lambda x: x) - self.template = template or Div + self.template = template or (lambda x: Div(self.get_attr(x))) self.commands = Commands(self) def set_items(self, items): diff --git a/src/myfasthtml/core/instances.py b/src/myfasthtml/core/instances.py index 760de6a..0242a13 100644 --- a/src/myfasthtml/core/instances.py +++ b/src/myfasthtml/core/instances.py @@ -117,7 +117,7 @@ class BaseInstance: return _id if _id.startswith("-") and parent is not None: - return f"{parent.get_prefix()}{_id}" + return f"{parent.get_id()}{_id}" return _id