Volver a la wiki

Versión 1.51.0 — Dashboard 100% reordenable (Rooms y No Map incluidas)

Resumen

Mejora iterativa de la v1.50.0 (drag&drop de blueprints). La v1.51.0 extiende el reorden manual a todas las secciones del Dashboard:

Feedback: Respuesta directa a la observación de Edu: “no solo hay Maps en el dashboard — las Salas y los racks sin asignar también deberían moverse”.

Versión: v1.51.0 (2026-07-13)
Línea: ↕️ Dashboard: TODAS las secciones reordenables — Rooms y No Map incluidas

Lo que cambia

Antes (v1.50.0)

Después (v1.51.0)

Comportamiento sin reorden previo

Si una org nunca ha arrastrado las secciones, el orden sigue siendo el histórico:

  1. Rooms (si hay)
  2. Blueprints (por sort_order, alfabético si no tienen)
  3. No Map

El cambio solo actúa cuando el usuario lo usa (drag&drop). Retrocompatible.

Cambios técnicos

Nuevos/Modificados

racks/services/dashboard_sections.py (NEW, 86 LOC)

Servicio que centraliza la lógica de ordenamiento:

Consumidores: racks/views.index() y core/htmx_views.racks_list().

blueprints/api/blueprints.py — reorder_blueprints()

Endpoint actualizado:

blueprints/api/schemas.py — BlueprintsReorderSchema

class BlueprintsReorderSchema(Schema):
    """Tokens en orden visual: "rooms", "<blueprint_id>", "nomap"."""
    section_keys: list[str]

racks/views.py — index()

Cambio: racks (lista plana, ordenada) → sections (lista tipada de secciones) + racks_list (sin ordenar, para compatibilidad).

sections = build_sections(racks_by_group, group_rollups, org.id if org else None, rooms=rooms)
context = {"sections": sections, "racks_list": racks_list, ...}

core/htmx_views.py — racks_list()

Similares cambios: construye sections y lo pasa al template.

sections = build_sections(racks_by_group, {}, org.id if org else None)
return render(request, "htmx/racks/list.html", {"sections": sections, ...})

templates/index.html (REFACTOR, ~50 LOC)

Ejemplo:

<!-- OLD v1.50.0 -->
{% regroup racks by blueprint_name as racks_by_blueprint %}
{% for bp_group in racks_by_blueprint %}
  {% if bp_group.grouper %}
    <div data-blueprint-id="{{ bp_group.list.0.blueprint_id }}">
  {% else %}
    {# No Map inline, sin draggable #}
  {% endif %}
{% endfor %}

<!-- NEW v1.51.0 -->
{% for section in sections %}
  {% if section.kind == 'rooms' %}
    <div data-section-key="rooms" draggable="true">...
  {% elif section.kind == 'bp' %}
    <div data-section-key="{{ section.blueprint_id }}" draggable="true">...
  {% elif section.kind == 'nomap' %}
    <div data-section-key="nomap" draggable="true">...
  {% endif %}
{% endfor %}

templates/htmx/racks/list.html (REFACTOR)

Similar refactor: {% regroup %} → {% for section in sections %}.

static/js/dashboard.js — Drag&drop

Cambios menores:

tests/api/test_blueprints_reorder.py (REFACTOR)

Pruebas expandidas:

Versionado y dependencias

Verificación

E2E local (Docker)

Tests

Nota sobre “Rows no se mueven” (v1.50.0)

El reporte se reprodujo localmente: las Rows salían con draggable y data-blueprint-id correctos, indistinguibles de los Maps. Probable caché de estáticos al probar recién desplegado. Esta v1.51.0 unififica el mecanismo, eliminando cualquier excepción.

Impacto para desarrolladores

Cambio breaking para consumidores externos del endpoint (si los hay, que no los hay):

Cambio en contexto de template (importante para sobrecargas custom):

Migration: No requiere migración de BD.

Retrocompatibilidad

✅ Totalmente retrocompatible:

Próximos pasos (fuera de esta PR)

Véase también

Subir