from datetime import datetime from textual import on from textual.app import ComposeResult from textual.containers import Horizontal, Vertical, Container from textual.widgets import DataTable, Input class ListPane(Container): def compose(self) -> ComposeResult: with Vertical(): yield DataTable() with Horizontal(id="filter"): yield Input( id="search", placeholder="Category/activity name contains text" ) yield Input( id="date", placeholder="After date, in {0} format".format( datetime.now().strftime("%Y-%m-%d") ), ) def action_refresh(self) -> None: self._refresh() def action_sort(self) -> None: self.table.cursor_type = "column" def on_data_table_column_selected(self, event): self.sort = (event.column_key,) event.data_table.sort(*self.sort) event.data_table.cursor_type = "row" def action_filter(self) -> None: self.query_one("#filter").display = True self._refresh() self.query_one("#filter #search").focus() def on_input_submitted(self, event): self.table.focus() def action_cancelfilter(self) -> None: self.query_one("#filter").display = False self.query_one("#filter #search").clear() self.query_one("#filter #date").clear() self.table.focus() self._refresh() @on(Input.Changed, "#filter Input") def filter(self, event): self._refresh()