from html import escape from admin_app.view.view_models import ( AdminLoginPageView, AdminPanelHomeView, AdminPanelMetric, AdminPanelModuleCard, AdminPanelNavigationItem, AdminPanelQuickAction, AdminPanelRoadmapItem, AdminPanelSurfaceLink, AdminToolReviewPageView, AdminToolReviewWorkflowStep, ) BOOTSTRAP_CSS_HREF = "https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/css/bootstrap.min.css" BOOTSTRAP_JS_HREF = "https://cdn.jsdelivr.net/npm/bootstrap@5.3.3/dist/js/bootstrap.bundle.min.js" _BADGE_CLASS_MAP = { "success": "bg-success-subtle text-success-emphasis border border-success-subtle", "warning": "bg-warning-subtle text-warning-emphasis border border-warning-subtle", "info": "bg-info-subtle text-info-emphasis border border-info-subtle", "primary": "bg-primary-subtle text-primary-emphasis border border-primary-subtle", "secondary": "bg-secondary-subtle text-secondary-emphasis border border-secondary-subtle", "dark": "bg-dark-subtle text-dark-emphasis border border-dark-subtle", } def render_panel_home( view: AdminPanelHomeView, *, css_href: str, js_href: str, ) -> str: navigation_markup = _render_navigation(view.navigation) quick_actions_markup = _render_quick_actions(view.quick_actions) metrics_markup = _render_metrics(view.metrics) modules_markup = _render_modules(view.modules) surface_links_markup = _render_surface_links(view.surface_links) roadmap_markup = _render_roadmap(view.roadmap) panel_title = escape(view.panel_title) app_name = escape(view.app_name) panel_subtitle = escape(view.panel_subtitle) environment = escape(view.environment) version = escape(view.version) api_prefix = escape(view.api_prefix) service = escape(view.service) release_label = escape(view.release_label) return f""" {panel_title}
Area interna protegida Minimal Bootstrap

Dashboard do administrador

A home protegida organiza o trabalho do time interno por fluxo, com foco no que realmente importa depois do login.

{quick_actions_markup}
{metrics_markup}

Areas do sistema

Onde o time interno opera

A dashboard agora funciona como ponto de orientacao para entrar nas areas certas sem expor atalhos desnecessarios.

{modules_markup}

Acessos disponiveis

Entradas claras para as areas protegidas

Fluxo recomendado

Como navegar no painel

{roadmap_markup}
""" def render_login_page( view: AdminLoginPageView, *, css_href: str, js_href: str, ) -> str: security_markup = _render_text_list(view.security_highlights) notes_markup = _render_text_list(view.integration_notes) return f""" {escape(view.title)}
""" def _render_navigation(items: tuple[AdminPanelNavigationItem, ...]) -> str: links: list[str] = [] for item in items: badge_markup = "" if item.badge: badge_markup = ( f'{escape(item.badge)}' ) active_class = " active shadow-sm" if item.is_active else "" links.append( f"""
{escape(item.label)}
{escape(item.description)}
{badge_markup}
""".strip() ) return "\n".join(links) def _render_quick_actions(items: tuple[AdminPanelQuickAction, ...]) -> str: return "\n".join( f'{escape(item.label)}' for item in items ) def _render_metrics(items: tuple[AdminPanelMetric, ...]) -> str: cards: list[str] = [] for item in items: cards.append( f"""

{escape(item.label)}

{escape(item.value)}

{escape(item.description)}

""".strip() ) return "\n".join(cards) def _render_modules(items: tuple[AdminPanelModuleCard, ...]) -> str: cards: list[str] = [] for item in items: highlights = "".join( f'
  • {escape(highlight)}
  • ' for highlight in item.highlights ) cta_markup = 'Em preparacao' if item.href and item.cta_label and item.is_available: cta_markup = ( f'{escape(item.cta_label)}' ) badge_classes = _BADGE_CLASS_MAP.get(item.status_variant, _BADGE_CLASS_MAP["secondary"]) cards.append( f"""

    {escape(item.eyebrow)}

    {escape(item.title)}

    {escape(item.status_label)}

    {escape(item.description)}

      {highlights}
    {cta_markup}
    """.strip() ) return "\n".join(cards) def _render_surface_links(items: tuple[AdminPanelSurfaceLink, ...]) -> str: cards: list[str] = [] for item in items: cards.append( f"""
    {escape(item.method)}
    {escape(item.label)}
    {escape(item.description)}
    Abrir
    """.strip() ) return "\n".join(cards) def _render_roadmap(items: tuple[AdminPanelRoadmapItem, ...]) -> str: cards: list[str] = [] for item in items: cards.append( f"""
    Etapa {escape(item.step)}
    {escape(item.title)}
    {escape(item.description)}
    {escape(item.status_label)}
    """.strip() ) return "\n".join(cards) def _render_text_list(items: tuple[str, ...]) -> str: return "\n".join( f"
  • {escape(item)}
  • " for item in items ) def render_tool_review_page( view: AdminToolReviewPageView, *, css_href: str, js_href: str, ) -> str: workflow_markup = _render_tool_review_workflow(view.workflow) review_notes_markup = _render_text_list(view.review_notes) approval_notes_markup = _render_text_list(view.approval_notes) activation_notes_markup = _render_text_list(view.activation_notes) return f""" {escape(view.title)}
    Governanca de tools Revisao e ativacao

    Fluxo visual de aprovacao no painel

    Esta tela conecta a sessao web do painel aos snapshots administrativos de tools para que o time consiga revisar a fila, conferir contratos e acompanhar o catalogo ativo.

    Voltar ao overview

    Fila de revisao

    0

    Items aguardando leitura tecnica ou aprovacao humana.

    Publicacoes ativas

    0

    Catalogo publicado e pronto para abastecer o runtime de produto.

    Etapas do contrato

    {len(view.workflow)}

    Workflow compartilhado entre revisao, aprovacao e ativacao.

    Pipeline visual

    Etapas que a tela acompanha

    Os cards abaixo resumem o trajeto de uma tool desde a analise ate a ativacao no produto.

    {workflow_markup}

    Fila atual

    Revisao tecnica e aprovacao

    A fila abaixo e lida da superficie web do painel e respeita o papel da sessao autenticada.

    Bootstrap

    Nenhum item carregado ainda

    Clique em atualizar leitura para sincronizar a fila de revisao do painel.

    Checklist de aprovacao

    Playbook para a decisao humana

    Aprovacao e ativacao continuam controladas pelo papel administrativo e pela leitura do contrato compartilhado.

    Antes de aprovar

      {approval_notes_markup}

    Lifecycle disponivel

    Aguardando leitura do contrato compartilhado...

    Tipos de parametro

    Aguardando

    Catalogo ativo

    Ativacao e superficie publicada

    Quando a sessao tem permissao de publicacao, o painel tambem exibe o catalogo conhecido de tools ativas.

    Catalogo

    Catalogo ainda nao sincronizado

    A leitura da ativacao aparece aqui assim que a sessao web carregar as publicacoes disponiveis.

    """ def _render_tool_review_workflow(items: tuple[AdminToolReviewWorkflowStep, ...]) -> str: cards: list[str] = [] for item in items: badge_classes = _BADGE_CLASS_MAP.get(item.status_variant, _BADGE_CLASS_MAP["secondary"]) cards.append( f"""

    {escape(item.eyebrow)}

    {escape(item.title)}

    {escape(item.status_label)}

    {escape(item.description)}

    """.strip() ) return "\n".join(cards)