From f70ce53dc5411e80ee449389a472a80581397ac5 Mon Sep 17 00:00:00 2001 From: shuki Date: Fri, 6 Mar 2026 03:25:25 +0200 Subject: [PATCH] Fix operation log not showing by awaiting screen mount before CLI Add wait_ready() to OperationLog and await it in all callers before starting CLI commands. Ensures the modal with spinner is fully rendered before streaming begins. Co-Authored-By: Claude Opus 4.6 --- tui/screens/backup.py | 2 ++ tui/screens/remotes.py | 1 + tui/screens/restore.py | 1 + tui/screens/retention.py | 2 ++ tui/screens/schedule.py | 3 +++ tui/widgets/operation_log.py | 3 +++ 6 files changed, 12 insertions(+) diff --git a/tui/screens/backup.py b/tui/screens/backup.py index 77f90ce..d36bcfa 100644 --- a/tui/screens/backup.py +++ b/tui/screens/backup.py @@ -69,6 +69,7 @@ class BackupScreen(Screen): async def _do_backup(self, target: str, remote: str) -> None: log_screen = OperationLog(f"Backup: {target}") self.app.push_screen(log_screen) + await log_screen.wait_ready() args = ["backup", f"--target={target}"] if remote: args.append(f"--remote={remote}") @@ -83,6 +84,7 @@ class BackupScreen(Screen): async def _do_backup_all(self) -> None: log_screen = OperationLog("Backup All Targets") self.app.push_screen(log_screen) + await log_screen.wait_ready() rc = await stream_cli(log_screen.write, "backup", "--all") if rc == 0: log_screen.write("\n[green]All backups completed.[/green]") diff --git a/tui/screens/remotes.py b/tui/screens/remotes.py index 2666c0b..15da545 100644 --- a/tui/screens/remotes.py +++ b/tui/screens/remotes.py @@ -85,6 +85,7 @@ class RemotesScreen(Screen): async def _test_remote(self, name: str) -> None: log_screen = OperationLog(f"Testing Remote: {name}") self.app.push_screen(log_screen) + await log_screen.wait_ready() rc, stdout, stderr = await run_cli("remotes", "test", f"--name={name}") if stdout: log_screen.write(stdout) diff --git a/tui/screens/restore.py b/tui/screens/restore.py index 25ef505..47e2c88 100644 --- a/tui/screens/restore.py +++ b/tui/screens/restore.py @@ -114,6 +114,7 @@ class RestoreScreen(Screen): async def _do_restore(self, target: str, remote: str, snapshot: str, dest: str) -> None: log_screen = OperationLog(f"Restore: {target}") self.app.push_screen(log_screen) + await log_screen.wait_ready() args = ["restore", f"--target={target}", f"--remote={remote}", f"--snapshot={snapshot}"] if dest: args.append(f"--dest={dest}") diff --git a/tui/screens/retention.py b/tui/screens/retention.py index 25ee310..24d1cce 100644 --- a/tui/screens/retention.py +++ b/tui/screens/retention.py @@ -70,6 +70,7 @@ class RetentionScreen(Screen): async def _do_cleanup(self, target: str) -> None: log_screen = OperationLog(f"Retention: {target}") self.app.push_screen(log_screen) + await log_screen.wait_ready() rc = await stream_cli(log_screen.write, "retention", f"--target={target}") if rc == 0: log_screen.write("\n[green]Cleanup completed.[/green]") @@ -81,6 +82,7 @@ class RetentionScreen(Screen): async def _do_cleanup_all(self) -> None: log_screen = OperationLog("Retention: All Targets") self.app.push_screen(log_screen) + await log_screen.wait_ready() rc = await stream_cli(log_screen.write, "retention", "--all") if rc == 0: log_screen.write("\n[green]All cleanups completed.[/green]") diff --git a/tui/screens/schedule.py b/tui/screens/schedule.py index 88e722f..af43063 100644 --- a/tui/screens/schedule.py +++ b/tui/screens/schedule.py @@ -220,6 +220,7 @@ class ScheduleScreen(Screen): async def _install_schedules(self) -> None: log_screen = OperationLog("Install Schedules") self.app.push_screen(log_screen) + await log_screen.wait_ready() rc, stdout, stderr = await run_cli("schedule", "install") if stdout: log_screen.write(stdout) @@ -231,6 +232,7 @@ class ScheduleScreen(Screen): async def _remove_schedules(self) -> None: log_screen = OperationLog("Remove Schedules") self.app.push_screen(log_screen) + await log_screen.wait_ready() rc, stdout, stderr = await run_cli("schedule", "remove") if stdout: log_screen.write(stdout) @@ -242,6 +244,7 @@ class ScheduleScreen(Screen): async def _show_crontab(self) -> None: log_screen = OperationLog("Current Crontab") self.app.push_screen(log_screen) + await log_screen.wait_ready() rc, stdout, stderr = await run_cli("schedule", "show") if stdout: log_screen.write(stdout) diff --git a/tui/widgets/operation_log.py b/tui/widgets/operation_log.py index e644087..c5f09cb 100644 --- a/tui/widgets/operation_log.py +++ b/tui/widgets/operation_log.py @@ -46,6 +46,9 @@ class OperationLog(ModalScreen[None]): else: log.write(text) + async def wait_ready(self) -> None: + await self._mounted_event.wait() + def finish(self) -> None: self._running = False try: