"""Calculation revision list with opaque semantic selection."""
from __future__ import annotations
from typing import cast, override
from textual.app import ComposeResult
from textual.widgets import DataTable, Static
from ..components.widgets import ContentDataTable, ContentScroll
from .controller import (
DeclarationsWorkspaceController,
DeclarationsWorkspaceScreen,
declarations_copy,
natural_address,
revision_state_label,
timestamp_label,
)
[docs]
class DeclarationsRevisionsScreen(DeclarationsWorkspaceScreen):
"""Distinguish calculation revision identity from registry revision vocabulary."""
def __init__(self, controller: DeclarationsWorkspaceController) -> None:
"""Retain injected state and semantic selection."""
super().__init__(controller, id="declarations-revisions-screen")
self.selected_calculation_revision_id: str | None = None
[docs]
@override
def compose(self) -> ComposeResult:
yield Static(declarations_copy("tui.declarations.revisions.title"), classes="cadrumo-banner", markup=False)
with ContentScroll(id="declarations-page", classes="cadrumo-scroll declarations-page"):
yield ContentDataTable[str](id="declarations-navigation", cursor_type="row", zebra_stripes=True)
yield Static(declarations_copy("tui.declarations.revisions.explanation"), markup=False)
yield ContentDataTable[str](id="declarations-revisions", cursor_type="row", zebra_stripes=True)
yield Static(id="declarations-empty", classes="declarations-empty", markup=False)
yield Static(id="declarations-refusal", classes="declarations-refusal", markup=False)
[docs]
def on_mount(self) -> None:
"""Populate calculation revisions from the safe projection."""
self.populate_navigation()
table = cast("DataTable[str]", self.query_one("#declarations-revisions", DataTable))
table.add_column(declarations_copy("tui.declarations.column.declaration"), key="declaration", width=18)
table.add_column(declarations_copy("tui.declarations.column.updated"), key="updated", width=20)
table.add_column(declarations_copy("tui.declarations.column.local_state"), key="state", width=13)
table.add_column(declarations_copy("tui.declarations.column.current"), key="current", width=7)
table.add_column(declarations_copy("tui.declarations.column.filed"), key="filed", width=7)
for row in self.controller.projection.calculation_revisions:
table.add_row(
natural_address(row.modelo, row.filing_year, row.period),
timestamp_label(row.updated_at),
revision_state_label(row.state),
declarations_copy("tui.declarations.value.yes" if row.is_current else "tui.declarations.value.no"),
declarations_copy("tui.declarations.value.yes" if row.is_filed else "tui.declarations.value.no"),
key=row.calculation_revision_id,
)
if not table.row_count:
self.show_empty()
restored = self.controller.restored_id("declarations.calculation_revision")
index = next((i for i, item in enumerate(table.ordered_rows) if item.key.value == restored), None)
if index is None:
self.query_one("#declarations-navigation", DataTable).focus()
else:
table.move_cursor(row=index)
table.focus()
[docs]
def on_data_table_row_selected(self, event: DataTable.RowSelected) -> None:
"""Route a navigation row or invoke the injected revision handoff."""
if self.handle_navigation(event):
return
table = cast("DataTable[str]", event.data_table)
if table.id != "declarations-revisions" or event.row_key.value is None:
return
row = next(
item
for item in self.controller.projection.calculation_revisions
if item.calculation_revision_id == event.row_key.value
)
self.selected_calculation_revision_id = row.calculation_revision_id
if self.controller.revision_handoff is None:
self.refuse_handoff()
else:
self.controller.revision_handoff(row)
__all__ = ["DeclarationsRevisionsScreen"]