fix logs
This commit is contained in:
parent
ec2295ce67
commit
0d1b7a6e8c
1 changed files with 181 additions and 65 deletions
|
|
@ -145,11 +145,7 @@ class MonitorScreen(Screen):
|
||||||
# Set up auto-refresh every 5 seconds
|
# Set up auto-refresh every 5 seconds
|
||||||
self.refresh_timer = self.set_interval(5.0, self._auto_refresh)
|
self.refresh_timer = self.set_interval(5.0, self._auto_refresh)
|
||||||
|
|
||||||
# Focus the services table
|
self._focus_services_table()
|
||||||
try:
|
|
||||||
self.services_table.focus()
|
|
||||||
except Exception:
|
|
||||||
pass
|
|
||||||
|
|
||||||
def on_unmount(self) -> None:
|
def on_unmount(self) -> None:
|
||||||
"""Clean up when unmounting."""
|
"""Clean up when unmounting."""
|
||||||
|
|
@ -224,6 +220,9 @@ class MonitorScreen(Screen):
|
||||||
docling_pid,
|
docling_pid,
|
||||||
"Start/Stop/Logs"
|
"Start/Stop/Logs"
|
||||||
)
|
)
|
||||||
|
# Restore docling selection when it was the last active table
|
||||||
|
if self._last_selected_table == "docling":
|
||||||
|
self._focus_docling_table(focus=False, set_last=False)
|
||||||
# Populate images table (unique images as reported by runtime)
|
# Populate images table (unique images as reported by runtime)
|
||||||
if self.images_table:
|
if self.images_table:
|
||||||
for image in sorted(images):
|
for image in sorted(images):
|
||||||
|
|
@ -509,16 +508,52 @@ class MonitorScreen(Screen):
|
||||||
self.run_worker(self._refresh_services())
|
self.run_worker(self._refresh_services())
|
||||||
|
|
||||||
def action_cursor_down(self) -> None:
|
def action_cursor_down(self) -> None:
|
||||||
"""Move cursor down in services table."""
|
"""Move selection down, handling both tables."""
|
||||||
|
active_table = self._get_active_table_name()
|
||||||
|
|
||||||
try:
|
try:
|
||||||
self.services_table.action_cursor_down()
|
if active_table == "docling":
|
||||||
|
return # Nothing to move within docling table
|
||||||
|
|
||||||
|
if not self.services_table:
|
||||||
|
return
|
||||||
|
|
||||||
|
row_count = self._table_row_count(self.services_table)
|
||||||
|
current = self._get_cursor_row(self.services_table)
|
||||||
|
if current is None:
|
||||||
|
current = 0
|
||||||
|
|
||||||
|
if current < row_count - 1:
|
||||||
|
self.services_table.action_cursor_down()
|
||||||
|
self._last_selected_table = "services"
|
||||||
|
elif self._table_row_count(self.docling_table):
|
||||||
|
self._focus_docling_table()
|
||||||
except Exception:
|
except Exception:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
def action_cursor_up(self) -> None:
|
def action_cursor_up(self) -> None:
|
||||||
"""Move cursor up in services table."""
|
"""Move selection up, handling both tables."""
|
||||||
|
active_table = self._get_active_table_name()
|
||||||
|
|
||||||
try:
|
try:
|
||||||
self.services_table.action_cursor_up()
|
if active_table == "docling":
|
||||||
|
self._focus_services_table(row="last")
|
||||||
|
return
|
||||||
|
|
||||||
|
if not self.services_table:
|
||||||
|
return
|
||||||
|
|
||||||
|
current = self._get_cursor_row(self.services_table)
|
||||||
|
if current is None:
|
||||||
|
current = 0
|
||||||
|
|
||||||
|
if current > 0:
|
||||||
|
self.services_table.action_cursor_up()
|
||||||
|
else:
|
||||||
|
# Already at the top; nothing else to do
|
||||||
|
self._set_cursor_row(self.services_table, 0)
|
||||||
|
|
||||||
|
self._last_selected_table = "services"
|
||||||
except Exception:
|
except Exception:
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
|
@ -664,59 +699,37 @@ class MonitorScreen(Screen):
|
||||||
self.notify(f"Error opening logs: {e}", severity="error")
|
self.notify(f"Error opening logs: {e}", severity="error")
|
||||||
|
|
||||||
def _get_selected_service(self) -> str | None:
|
def _get_selected_service(self) -> str | None:
|
||||||
"""Get the currently selected service from either table."""
|
"""Resolve the currently selected service based on active table."""
|
||||||
try:
|
try:
|
||||||
# Check both tables regardless of last_selected_table to handle cursor navigation
|
active_table = self._get_active_table_name()
|
||||||
services_table = self.query_one("#services-table", DataTable)
|
|
||||||
services_cursor = services_table.cursor_row
|
|
||||||
|
|
||||||
docling_cursor = None
|
if active_table == "docling" and self.docling_table:
|
||||||
if self.docling_table:
|
cursor = self._get_cursor_row(self.docling_table)
|
||||||
docling_cursor = self.docling_table.cursor_row
|
if cursor is not None and cursor >= 0:
|
||||||
|
|
||||||
# If we have a last selected table preference, use it if that table has a valid selection
|
|
||||||
if self._last_selected_table == "docling" and self.docling_table:
|
|
||||||
if docling_cursor is not None and docling_cursor >= 0:
|
|
||||||
row_data = self.docling_table.get_row_at(docling_cursor)
|
|
||||||
if row_data:
|
|
||||||
return "docling-serve"
|
|
||||||
|
|
||||||
elif self._last_selected_table == "services":
|
|
||||||
if services_cursor is not None and services_cursor >= 0:
|
|
||||||
row_data = services_table.get_row_at(services_cursor)
|
|
||||||
if row_data:
|
|
||||||
service_name = str(row_data[0])
|
|
||||||
service_mapping = {
|
|
||||||
"openrag-backend": "openrag-backend",
|
|
||||||
"openrag-frontend": "openrag-frontend",
|
|
||||||
"opensearch": "opensearch",
|
|
||||||
"langflow": "langflow",
|
|
||||||
"dashboards": "dashboards",
|
|
||||||
}
|
|
||||||
selected_service = service_mapping.get(service_name, service_name)
|
|
||||||
return selected_service
|
|
||||||
|
|
||||||
# Fallback: check both tables if no last_selected_table or it doesn't have a selection
|
|
||||||
if self.docling_table and docling_cursor is not None and docling_cursor >= 0:
|
|
||||||
row_data = self.docling_table.get_row_at(docling_cursor)
|
|
||||||
if row_data:
|
|
||||||
return "docling-serve"
|
return "docling-serve"
|
||||||
|
|
||||||
if services_cursor is not None and services_cursor >= 0:
|
services_table = self.query_one("#services-table", DataTable)
|
||||||
row_data = services_table.get_row_at(services_cursor)
|
row_count = self._table_row_count(services_table)
|
||||||
if row_data:
|
if row_count == 0:
|
||||||
service_name = str(row_data[0])
|
return None
|
||||||
service_mapping = {
|
|
||||||
"openrag-backend": "openrag-backend",
|
|
||||||
"openrag-frontend": "openrag-frontend",
|
|
||||||
"opensearch": "opensearch",
|
|
||||||
"langflow": "langflow",
|
|
||||||
"dashboards": "dashboards",
|
|
||||||
}
|
|
||||||
selected_service = service_mapping.get(service_name, service_name)
|
|
||||||
return selected_service
|
|
||||||
|
|
||||||
return None
|
cursor = self._get_cursor_row(services_table)
|
||||||
|
if cursor is None or cursor < 0 or cursor >= row_count:
|
||||||
|
cursor = 0
|
||||||
|
|
||||||
|
row_data = services_table.get_row_at(cursor)
|
||||||
|
if not row_data:
|
||||||
|
return None
|
||||||
|
|
||||||
|
service_name = str(row_data[0])
|
||||||
|
service_mapping = {
|
||||||
|
"openrag-backend": "openrag-backend",
|
||||||
|
"openrag-frontend": "openrag-frontend",
|
||||||
|
"opensearch": "opensearch",
|
||||||
|
"langflow": "langflow",
|
||||||
|
"dashboards": "dashboards",
|
||||||
|
}
|
||||||
|
return service_mapping.get(service_name, service_name)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
self.notify(f"Error getting selected service: {e}", severity="error")
|
self.notify(f"Error getting selected service: {e}", severity="error")
|
||||||
return None
|
return None
|
||||||
|
|
@ -728,15 +741,118 @@ class MonitorScreen(Screen):
|
||||||
try:
|
try:
|
||||||
# Track which table was selected
|
# Track which table was selected
|
||||||
if selected_table.id == "services-table":
|
if selected_table.id == "services-table":
|
||||||
self._last_selected_table = "services"
|
self._focus_services_table(row="current")
|
||||||
# Clear docling table selection
|
|
||||||
if self.docling_table:
|
|
||||||
self.docling_table.cursor_row = -1
|
|
||||||
elif selected_table.id == "docling-table":
|
elif selected_table.id == "docling-table":
|
||||||
self._last_selected_table = "docling"
|
self._focus_docling_table()
|
||||||
# Clear services table selection
|
|
||||||
services_table = self.query_one("#services-table", DataTable)
|
|
||||||
services_table.cursor_row = -1
|
|
||||||
except Exception:
|
except Exception:
|
||||||
# Ignore errors during table manipulation
|
# Ignore errors during table manipulation
|
||||||
pass
|
pass
|
||||||
|
|
||||||
|
def _get_active_table_name(self) -> str:
|
||||||
|
"""Determine which table is currently active."""
|
||||||
|
if self.docling_table and self.docling_table.has_focus:
|
||||||
|
return "docling"
|
||||||
|
if self.services_table and self.services_table.has_focus:
|
||||||
|
return "services"
|
||||||
|
return self._last_selected_table or "services"
|
||||||
|
|
||||||
|
def _table_row_count(self, table: DataTable | None) -> int:
|
||||||
|
"""Safely compute the number of rows in a DataTable."""
|
||||||
|
if not table:
|
||||||
|
return 0
|
||||||
|
|
||||||
|
count_attr = getattr(table, "row_count", None)
|
||||||
|
if callable(count_attr):
|
||||||
|
try:
|
||||||
|
return int(count_attr())
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
|
||||||
|
if isinstance(count_attr, int):
|
||||||
|
return count_attr
|
||||||
|
|
||||||
|
try:
|
||||||
|
rows = getattr(table, "rows", None)
|
||||||
|
if rows is not None:
|
||||||
|
return len(rows)
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
|
||||||
|
return 0
|
||||||
|
|
||||||
|
def _get_cursor_row(self, table: DataTable | None) -> int | None:
|
||||||
|
"""Return the current cursor row for the given table."""
|
||||||
|
if not table:
|
||||||
|
return None
|
||||||
|
|
||||||
|
coord = getattr(table, "cursor_coordinate", None)
|
||||||
|
if coord is None:
|
||||||
|
return None
|
||||||
|
|
||||||
|
row = getattr(coord, "row", None)
|
||||||
|
if row is not None:
|
||||||
|
return row
|
||||||
|
|
||||||
|
if isinstance(coord, tuple) and coord:
|
||||||
|
return coord[0]
|
||||||
|
|
||||||
|
return None
|
||||||
|
|
||||||
|
def _set_cursor_row(self, table: DataTable | None, row: int) -> None:
|
||||||
|
"""Set the cursor row for the given table, if possible."""
|
||||||
|
if not table:
|
||||||
|
return
|
||||||
|
|
||||||
|
try:
|
||||||
|
table.cursor_coordinate = (row, 0)
|
||||||
|
except Exception:
|
||||||
|
move_cursor = getattr(table, "move_cursor", None)
|
||||||
|
if callable(move_cursor):
|
||||||
|
try:
|
||||||
|
move_cursor(row, 0, expand=False)
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
|
||||||
|
def _focus_services_table(self, row: str | None = None, set_last: bool = True) -> None:
|
||||||
|
"""Focus the services table and update selection."""
|
||||||
|
if not self.services_table:
|
||||||
|
return
|
||||||
|
|
||||||
|
try:
|
||||||
|
self.services_table.focus()
|
||||||
|
row_count = self._table_row_count(self.services_table)
|
||||||
|
|
||||||
|
if row_count:
|
||||||
|
if row == "last":
|
||||||
|
self._set_cursor_row(self.services_table, row_count - 1)
|
||||||
|
elif row == "current":
|
||||||
|
# Keep existing cursor position if valid
|
||||||
|
cursor = self._get_cursor_row(self.services_table)
|
||||||
|
if cursor is None or cursor < 0 or cursor >= row_count:
|
||||||
|
self._set_cursor_row(self.services_table, 0)
|
||||||
|
else:
|
||||||
|
cursor = self._get_cursor_row(self.services_table)
|
||||||
|
if cursor is None or cursor < 0:
|
||||||
|
self._set_cursor_row(self.services_table, 0)
|
||||||
|
|
||||||
|
if set_last:
|
||||||
|
self._last_selected_table = "services"
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
|
||||||
|
def _focus_docling_table(self, focus: bool = True, set_last: bool = True) -> None:
|
||||||
|
"""Focus the docling table and select its row."""
|
||||||
|
if not self.docling_table:
|
||||||
|
return
|
||||||
|
|
||||||
|
try:
|
||||||
|
if focus:
|
||||||
|
self.docling_table.focus()
|
||||||
|
|
||||||
|
if self._table_row_count(self.docling_table):
|
||||||
|
self._set_cursor_row(self.docling_table, 0)
|
||||||
|
|
||||||
|
if set_last:
|
||||||
|
self._last_selected_table = "docling"
|
||||||
|
except Exception:
|
||||||
|
pass
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue