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 <noreply@anthropic.com>
This commit is contained in:
@@ -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]")
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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}")
|
||||
|
||||
@@ -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]")
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user