from textual.app import ComposeResult from textual.containers import HorizontalGroup from textual.screen import Screen from textual.widget import Widget from textual.widgets import DataTable, Footer, Header, Static, Input, Button class SearchBar(Static): DEFAULT_CSS = """ #teilchen-input { width: 4fr; } #button-search, #button-add { width: 1fr; } """ def compose(self) -> ComposeResult: with HorizontalGroup(id="search-bar-widget"): yield Input( placeholder="Enter Teilchen information: name, description, #tags", tooltip=( "This is a free-form field: Enter a name and " "description any way you like. You should use #hashtags for any " "meta information." ), id="teilchen-input", type="text", ) yield Button("Add", variant="success", classes="search-bar-buttons", id="button-add") yield Button( "Search", variant="default", classes="search-bar-buttons", id="button-search", ) TeilchenHeader = tuple[ Literal["pk"], Literal["Name"], Literal["Description"], Literal["Number"], Literal["Tags"], ] FAKE_DATA: list[TeilchenHeader | TeilchenDatum] = [ ("pk", "Name", "Description", "Number", "Tags"), (0, "Name0", "Description0", "9000", "#tag0 #tag00 #tag000"), (1, "Name1", "Description1", "9001", "#tag1 #tag11 #tag111"), (2, "Name2", "Description2", "9002", "#tag2 #tag22 #tag222"), (3, "Name3", "Description3", "9003", "#tag3 #tag33 #tag333"), (4, "Name4", "Description4", "9004", "#tag4 #tag44 #tag444"), (5, "Name5", "Description5", "9005", "#tag5 #tag55 #tag555"), ] class SearchResults(Widget): def compose(self) -> ComposeResult: yield DataTable(id="table-search-result", cursor_type="row", zebra_stripes=True) async def on_mount(self) -> None: table: DataTable[None] = self.query_one(DataTable[None]) _ = table.add_columns(*FAKE_DATA[0]) # pyright: ignore[reportArgumentType] _ = table.add_rows(FAKE_DATA[1:]) # pyright: ignore[reportArgumentType] class AddInventoryScreen(Screen[None]): def compose(self) -> ComposeResult: yield Header() yield SearchBar() yield SearchResults() yield Footer()