Feature Request: HTML support and column tooltips in DataGrid/DataTable

Feature Request: Soporte para Tooltips y HTML en DataGrid/DataTable de Shiny for Python

Resumen Ejecutivo

Después de 6 meses, Shiny for Python continúa sin funcionalidades básicas que R Shiny con DT ha tenido por años. Esta limitación está afectando la adopción de Shiny for Python y obligando a usuarios a volver a R Shiny.


:clipboard: Funcionalidades Faltantes

1. Tooltips en Encabezados de Columnas

Problema: No existe forma de agregar descripciones explicativas en los headers de columnas que aparezcan al hacer hover.

Caso de uso: Mostrar definiciones, unidades de medida, o aclaraciones sobre cada columna sin ocupar espacio visual.

Estado actual: :cross_mark: No disponible


2. HTML Personalizado en Celdas

Problema: No se puede renderizar HTML/CSS dentro de las celdas.

Impacto: Imposible crear:

  • ✗ Badges con colores de fondo condicionales
  • ✗ Rectángulos redondeados con transparencia
  • ✗ Iconos personalizados con estilos
  • ✗ Cualquier formato visual avanzado

Estado actual: :cross_mark: No disponible


:bar_chart: Comparación con R Shiny

En R con DT (funciona perfectamente):

library(DT)

datatable(df, 
  escape = FALSE,  # ✓ Permite HTML en celdas
  options = list(
    columnDefs = list(
      list(
        targets = 0, 
        render = JS("function(data, type, row) {
          return '<span class=\"badge\">' + data + '</span>';
        }")
      )
    )
  ),
  container = withTags(table(
    thead(
      tr(
        th(title = 'Descripción del producto', 'Producto'),
        th(title = 'Unidades vendidas', 'Ventas')
      )
    )
  ))
)

En Python con Shiny (NO funciona):

:cross_mark: No existe esta funcionalidad

render.DataGrid(
    df,
    escape=False,  # Esta opción NO existe
    column_tooltips={...}  # Esta opción NO existe
)

:light_bulb: Workarounds Actuales (Todos Insatisfactorios)

Opción 1: Caracteres Unicode/Emojis

df["Producto"] = "🟢 " + df["Producto"]  # No profesional

Problemas:

  • No es profesional
  • Limitado visualmente
  • No permite control de colores/estilos

Opción 2: Renderizar HTML Manual

@render.ui
def tabla():
    return ui.HTML(df.to_html(escape=False))

Problemas:

  • ✗ Pierde filtros interactivos
  • ✗ Pierde ordenamiento
  • ✗ Pierde selección de filas
  • ✗ Pierde paginación

Opción 3: Great Tables

from great_tables import GT
gt = GT(df).data_color(...)

Problemas:

  • ✗ Tabla estática (no interactiva)
  • ✗ No permite filtros
  • ✗ No permite selección
  • ✗ Solo para reportes, no para exploración de datos

:bullseye: Funcionalidad Solicitada

API Propuesta:

render.DataGrid(
    df,
    
    # 1. Permitir HTML en celdas
    escape=False,  
    
    # 2. Tooltips en columnas
    column_tooltips={
        "Producto": "Nombre del producto vendido",
        "Ventas": "Unidades vendidas en el período",
        "Cumplimiento": "Porcentaje de cumplimiento del objetivo"
    },
    
    # 3. Función de formato/estilo por celda
    cell_renderer=lambda row, col, val: {
        "html": f'<span class="badge">{val}</span>',
        "style": {
            "background-color": get_color(val),
            "border-radius": "8px",
            "padding": "4px 8px"
        }
    },
    
    # 4. O alternativamente, clases CSS condicionales
    cell_classes=lambda row, col, val: {
        "badge-success" if val >= 100 else "badge-warning"
    }
)

:fire: Impacto en la Comunidad

Reportes de usuarios:

  • "Tuve el mismo problema hace 6 meses. Pasa el tiempo y 0 evolución"
  • Usuarios abandonando Shiny for Python por falta de estas funcionalidades básicas
  • Migración de vuelta a R Shiny para proyectos que requieren tablas avanzadas

Consecuencias:

  1. Menor adopción de Shiny for Python
  2. Frustración en usuarios existentes
  3. Pérdida de credibilidad vs R Shiny
  4. Limitación en casos de uso reales

:date: Prioridad

:red_circle: ALTA - CRÍTICO

Justificación:

  • Es funcionalidad básica esperada en cualquier librería moderna de tablas
  • R Shiny lo tiene desde hace años
    Bloquea casos de uso comunes en dashboards empresariales
  • Afecta negativamente la adopción de Shiny for Python

:hammer_and_wrench: Implementación Sugerida

Fase 1: HTML en Celdas

Agregar parámetro escape=False similar a pd.DataFrame.to_html()

Fase 2: Tooltips en Columnas

Agregar parámetro column_tooltips con diccionario de descripciones

Fase 3: Funciones de Formato

Permitir funciones callback para renderizar celdas con HTML/CSS personalizado

:books: Referencias


:folded_hands: Solicitud

Por favor consideren esta funcionalidad para Shiny for Python 1.0+. Es una de las principales barreras para la adopción empresarial de la librería.


Reportado por: Comunidad de usuarios de Shiny for Python
Fecha: 2026
Versión de Shiny: 1.x.x