695401f237
- Reemplaza Netlify Functions con servidor Python/Flask (server.py) - Adapta dashboard para contar tickets en lugar de Story Points - Conecta al proyecto IO (Infra) de Jira - Elimina secciones de QA y Code Review - Agrega métricas de solicitudes semanales y reporters - Excluye devs inactivos y unifica nombres duplicados Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
160 lines
7.7 KiB
HTML
160 lines
7.7 KiB
HTML
<!DOCTYPE html>
|
||
<html lang="es">
|
||
<head>
|
||
<meta charset="UTF-8">
|
||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||
<title>Dashboard Infra — Tickets</title>
|
||
<link rel="stylesheet" href="./css/styles.css">
|
||
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/4.4.1/chart.umd.min.js"></script>
|
||
<script type="module" src="./js/app.js" defer></script>
|
||
</head>
|
||
<body>
|
||
|
||
<!-- Loading overlay -->
|
||
<div class="loading-overlay" id="loadingOverlay">
|
||
<div class="spinner"></div>
|
||
<p>Consultando Jira en tiempo real…</p>
|
||
</div>
|
||
|
||
<!-- Error banner -->
|
||
<div class="error-banner" id="errorBanner"></div>
|
||
<div class="error-banner" id="limitBanner" style="background:#fff7d6; color:#a15900; border-color:#ffab00;"></div>
|
||
|
||
<!-- Header Principal -->
|
||
<header>
|
||
<div>
|
||
<h1>📊 Dashboard Infra</h1>
|
||
<div style="font-size:13px;opacity:.7;margin-top:4px;">
|
||
Proyecto: <strong>Infra</strong> · invera.atlassian.net
|
||
</div>
|
||
</div>
|
||
<div class="header-meta">
|
||
<span id="lastUpdatedLabel">—</span>
|
||
<span class="cache-badge" id="cacheBadge"></span>
|
||
<label style="font-size:12px;opacity:0.8;color:white;margin-right:-6px;">Rango:</label>
|
||
<select id="timeRangeFilter" style="padding:4px 8px; font-size:12px; border-radius:4px; max-width:120px;">
|
||
<option value="1d">Hoy</option>
|
||
<option value="7d">Últimos 7 días</option>
|
||
<option value="30d">Último mes</option>
|
||
<option value="90d" selected>Últimos 3 meses</option>
|
||
<option value="365d">Último año</option>
|
||
<option value="all">Histórico completo</option>
|
||
</select>
|
||
<button class="refresh-btn" id="refreshBtn">↻ Actualizar</button>
|
||
</div>
|
||
</header>
|
||
|
||
<!-- ── SECCIÓN 1: Carga de Trabajo (Pendientes) ── -->
|
||
<div class="section-header current">
|
||
<div class="dot" style="background:#0065ff;"></div>
|
||
<h2>Carga de Trabajo Actual</h2>
|
||
<span id="currentTicketsLabel" style="font-size:12px;color:#5e6c84;margin-left:8px;">Tickets pendientes en el tablero</span>
|
||
|
||
<div class="filter-group">
|
||
<label>Filtrar por Dev:</label>
|
||
<select id="devFilter"><option value="all">Cargando...</option></select>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="main">
|
||
<div class="section-block">
|
||
<div class="kpi-row">
|
||
<div class="kpi progress" title="Tickets actualmente en la columna En Progreso"><div class="kpi-value" id="kpi-ip">—</div><div class="kpi-label">Tickets En Progreso</div><div class="kpi-sub">Trabajo en curso</div></div>
|
||
<div class="kpi todo" title="Tickets pendientes que aún no comenzaron"><div class="kpi-value" id="kpi-todo">—</div><div class="kpi-label">Tickets Por Hacer</div><div class="kpi-sub">Backlog del periodo</div></div>
|
||
<div class="kpi members" title="Cantidad de personas con tickets asignados en este momento"><div class="kpi-value" id="kpi-members">—</div><div class="kpi-label">DevOps</div><div class="kpi-sub">Con tickets pendientes</div></div>
|
||
</div>
|
||
|
||
<div class="charts-grid">
|
||
<div class="chart-card">
|
||
<h3>🔵 Tkt pendientes</h3>
|
||
<div class="sub">Story Points con trabajo pendiente</div>
|
||
<div style="position:relative;height:260px"><canvas id="chartCurrentState"></canvas></div>
|
||
</div>
|
||
<div class="chart-card">
|
||
<h3 style="display:flex;align-items:center;">📢 Alertas de Salud
|
||
<div class="pop-trigger" style="margin-left:8px; font-size:14px; cursor:help; border:none;">ℹ️
|
||
<div class="pop-content" style="text-transform:none; font-weight:normal; letter-spacing:normal; text-align:left; font-size:12px; width:260px;">
|
||
<strong>Tipos de Alertas:</strong><br><br>
|
||
<span class="badge" style="background:#ffab00;color:white;font-size:10px;padding:2px 4px;">ESTANCADO</span> › +14 días en curso.<br><br>
|
||
<span class="badge" style="background:#ff5630;color:white;font-size:10px;padding:2px 4px;">VENCIDO</span> › Fecha de entrega caducada.<br><br>
|
||
<span class="badge" style="background:#6554c0;color:white;font-size:10px;padding:2px 4px;">SIN SP</span> › Completado sin estimación.<br><br>
|
||
<span class="badge" style="background:#ff8b00;color:white;font-size:10px;padding:2px 4px;">HUÉRFANO</span> › Ticket con SP sin asignar.<br><br>
|
||
<span class="badge" style="background:#36b37e;color:white;font-size:10px;padding:2px 4px;">DEV LIBRE</span> › Dev sin tickets pendientes ni en curso.
|
||
</div>
|
||
</div>
|
||
</h3>
|
||
<div class="sub">Tickets estancados o sin estimación</div>
|
||
<div id="warningsSection" style="display:none; overflow-y:auto; max-height:230px; margin-top:10px;">
|
||
<ul class="warning-list" id="warningsList" style="padding:0; margin:0;"></ul>
|
||
</div>
|
||
<div id="noWarningsMsg" style="text-align:center; color:#36b37e; padding:40px 0; display:none;">
|
||
✅ No hay alertas pendientes
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="table-card">
|
||
<h3>Detalle de Carga de Trabajo</h3>
|
||
<table>
|
||
<thead><tr><th>Desarrollador</th><th>🔵 En Progreso</th><th>⏳ Por Hacer</th><th>Total Pendiente</th><th>Distribución</th></tr></thead>
|
||
<tbody id="tableCurrentState"></tbody>
|
||
</table>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
<!-- ── SECCIÓN 2: Rendimiento & Resultados ── -->
|
||
<div class="section-header history">
|
||
<div class="dot" style="background:#36b37e;"></div>
|
||
<h2>Resultados del Período</h2>
|
||
<span style="font-size:12px;color:#5e6c84;margin-left:8px;">Story Points finalizados y velocidad</span>
|
||
<span class="badge" id="filterBadge" style="display:none;"></span>
|
||
</div>
|
||
|
||
<div class="main">
|
||
<div class="section-block">
|
||
<div class="kpi-row-3">
|
||
<div class="kpi done" title="Total de tickets completados en el período de tiempo seleccionado"><div class="kpi-value" id="kpi-done-period">—</div><div class="kpi-label">Tickets Completados</div><div class="kpi-sub">en el período</div></div>
|
||
<div class="kpi progress" title="Promedio de tickets resueltos por semana en el período seleccionado"><div class="kpi-value" id="kpi-avg-period">—</div><div class="kpi-label">Promedio tkts / semana</div><div class="kpi-sub" id="kpi-avg-period-sub">tickets por semana</div></div>
|
||
<div class="kpi" style="border-color:#6554c0;" title="Promedio de tickets nuevos solicitados por semana en el período seleccionado"><div class="kpi-value" id="kpi-created-week">—</div><div class="kpi-label">Tkts solicitados / semana</div><div class="kpi-sub" id="kpi-created-week-sub">tickets por semana</div></div>
|
||
</div>
|
||
|
||
<div class="charts-grid">
|
||
<div class="chart-card">
|
||
<h3>✅ Tickets Completados</h3>
|
||
<div class="sub">Período seleccionado</div>
|
||
<div style="position:relative;height:260px"><canvas id="chartDoneDev"></canvas></div>
|
||
</div>
|
||
<div class="chart-card">
|
||
<h3>📥 Solicitudes de Tickets</h3>
|
||
<div class="sub">Tickets creados por persona en el período</div>
|
||
<div style="position:relative;height:260px"><canvas id="chartVelocity"></canvas></div>
|
||
</div>
|
||
</div>
|
||
|
||
<div class="table-card">
|
||
<h3 style="display:flex; justify-content:space-between; align-items:center;">
|
||
<span>SP Completados — Tabla Resumen</span>
|
||
<span id="teamAvgLabel" style="font-size:12px; font-weight:normal; background:#e6fcff; color:#0065ff; padding:4px 8px; border-radius:4px; display:none;"></span>
|
||
</h3>
|
||
<table>
|
||
<thead><tr><th>Desarrollador</th><th>✅ Tickets Total</th><th>📉 % del equipo</th></tr></thead>
|
||
<tbody id="tableHistory"></tbody>
|
||
</table>
|
||
</div>
|
||
</div>
|
||
</div>
|
||
|
||
|
||
|
||
<!-- ── SECCIÓN: Revisión de Código (Code Review) ── -->
|
||
|
||
|
||
|
||
<footer>
|
||
Dashboard en tiempo real · Arquitectura Modular Serverless · Realizado para Vercel & Jira
|
||
</footer>
|
||
|
||
</body>
|
||
</html>
|