75 lines
1.7 KiB
Python
75 lines
1.7 KiB
Python
from textual.app import App, ComposeResult
|
|
from textual.containers import ScrollableContainer
|
|
from textual.widgets import Footer, Header, Static
|
|
import typer
|
|
from websocket import create_connection
|
|
|
|
from learn_sql_model.cli.common import verbose_callback
|
|
|
|
dashboard_app = typer.Typer()
|
|
|
|
|
|
@dashboard_app.callback()
|
|
def config(
|
|
verbose: bool = typer.Option(
|
|
False,
|
|
callback=verbose_callback,
|
|
help="show the log messages",
|
|
),
|
|
):
|
|
"dashboard cli"
|
|
|
|
|
|
class HeroName(Static):
|
|
"""A stopwatch widget."""
|
|
|
|
|
|
class HerosDisplay(Static):
|
|
"""A stopwatch widget."""
|
|
|
|
@property
|
|
def ws(self):
|
|
def connect():
|
|
self._ws = create_connection(
|
|
f"ws://{config.api_client.url.replace('https://', '')}/ws-heros"
|
|
)
|
|
|
|
if not hasattr(self, "_ws"):
|
|
connect()
|
|
if not self._ws.connected:
|
|
connect()
|
|
return self._ws
|
|
|
|
def compose(self) -> ComposeResult:
|
|
"""Create child widgets of a stopwatch."""
|
|
for hero in self.heros:
|
|
yield HeroName(hero.name)
|
|
|
|
|
|
class DashboardApp(App):
|
|
"""A Textual app to manage stopwatches."""
|
|
|
|
BINDINGS = [("d", "toggle_dark", "Toggle dark mode")]
|
|
# heros = reactive(Heros.list())
|
|
|
|
def compose(self) -> ComposeResult:
|
|
"""Create child widgets for the app."""
|
|
yield Header()
|
|
yield Footer()
|
|
yield ScrollableContainer(HerosDisplay())
|
|
|
|
def action_toggle_dark(self) -> None:
|
|
"""An action to toggle dark mode."""
|
|
self.dark = not self.dark
|
|
|
|
|
|
@dashboard_app.command()
|
|
def run(
|
|
verbose: bool = typer.Option(
|
|
False,
|
|
callback=verbose_callback,
|
|
help="show the log messages",
|
|
),
|
|
):
|
|
app = DashboardApp()
|
|
app.run()
|