尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證製作者的介紹僅有上面的一句話。 更多詳情請閱讀儲存庫 README。 儲存庫 README ↗
正在載入完整 README。
檢視完整 README ↗Panel de gestión de tareas por coordinación. Frontend estático en HTML/CSS/JS, datos en Supabase a través de una función serverless de Vercel (las credenciales nunca llegan al navegador).
dircom-dashboard/
├── index.html Estructura de la página (barra lateral, contenedores) y carga de scripts
├── manual-dircom.html Manual de usuario
├── css/
│ └── styles.css Estilos
├── img/
│ └── favicon.webp
├── js/
│ ├── config.js Paleta de colores y campos del sistema
│ ├── state.js Estado global y permisos en pantalla
│ ├── utils.js Utilidades (fechas, colores, etiquetas, avisos)
│ ├── api.js Llamadas a /api/data y normalización de datos
│ ├── metricas.js Cálculo de KPI por período (fechas, agregados, comparación)
│ ├── components/
│ │ ├── listas.js Listas de tareas y personas
│ │ ├── modales.js Formularios y detalle de tarea
│ │ ├── buscador.js Buscador de la barra lateral
│ │ └── tablas.js Indicadores y tablas de reporte (pantalla y PDF)
│ ├── views/ Una vista por archivo
│ │ ├── dashboard.js
│ │ ├── tareas.js
│ │ ├── personas.js
│ │ ├── coordinaciones.js
│ │ ├── calendario.js
│ │ ├── reportes.js
│ │ ├── opciones.js
│ │ └── papelera.js
│ ├── reporte.js Reporte de gestión imprimible / PDF
│ ├── exportar.js Exportación a Excel (CSV)
│ ├── acciones.js Crear, editar, cambiar estado y eliminar
│ ├── app.js Navegación y render principal
│ └── main.js Arranque y actualización automática
├── api/
│ ├── data.js Función serverless de Vercel (intermediario con Supabase)
│ └── keepalive.js Cron diario que consulta Supabase para que no se pause
└── vercel.json
Los archivos de js/ son scripts clásicos (no módulos ES): comparten el ámbito global para que los
onclick="..." del HTML generado encuentren las funciones. El orden de los <script> en
index.html importa: main.js va al final porque es el que arranca la aplicación.
Variables de entorno necesarias para api/data.js:
| Variable | Descripción |
|---|---|
SUPABASE_URL | URL del proyecto Supabase |
SUPABASE_SERVICE_KEY | Service role key de Supabase (secreta) |
SESION_SECRETO | Firma las sesiones de Google (secreta). Sin ella no se puede entrar con Google |
DIRECTORA_CORREO | Correos @ufrontera.cl con acceso total (Administración), separados por coma. Se revisa en cada petición |
CRON_SECRET | Opcional: protege /api/keepalive para que solo lo llame el cron |
CORREO_USUARIO | Opcional: cuenta @ufrontera.cl que envía los avisos por correo (Gmail SMTP). Sin ella y CORREO_CLAVE no se envían correos |
CORREO_CLAVE | Contraseña de aplicación de Google de esa cuenta (secreta) |
VER_COMO_CORREO | Opcional: correos que pueden usar "👁 Ver como…" (ver el dashboard como otra persona de Equipo, en solo lectura), separados por coma |
CORREO_PRUEBA | Opcional, solo para probar: todos los correos van a esta dirección y la app muestra el resultado del envío. No usar en Production |
El plan gratuito de Supabase pausa el proyecto tras 7 días sin actividad. Para evitarlo,
vercel.json programa un cron diario (12:00 UTC) que llama a /api/keepalive, que hace una
consulta mínima a coordinaciones. Los crons solo corren en el despliegue de producción (main).
Tablas usadas en Supabase: coordinaciones, personas, tareas, opciones.
Desde v2.3.0 la tabla tareas necesita la columna completed_at (fecha de término), que
api/data.js fija al marcar una tarea como completada y borra si se reabre:
alter table tareas add column if not exists completed_at timestamptz;
Desde v2.6.0 también necesita asignado_por y asignado_at: el servidor registra quién creó o
reasignó cada tarea (directora, coord:<id> o general) y cuándo. Con eso, el enlace de cada
coordinación muestra las tareas que la directora le creó o asignó desde la última visita:
alter table tareas add column if not exists asignado_por text;
alter table tareas add column if not exists asignado_at timestamptz;
Desde v2.7.0 (login con Google) la tabla personas necesita el correo de cada persona y el permiso
"Gestiona tareas". asignado_por puede valer además persona:<id>:
alter table personas add column if not exists correo text;
create unique index if not exists personas_correo_unico on personas (lower(correo));
alter table personas add column if not exists gestiona_tareas boolean not null default false;
Desde v2.8.0 los avisos 🔔 salen de la tabla eventos (creada, asignada, fecha, revision), que llena el
servidor; el "visto" de cada persona queda en personas.visto_at:
create table eventos (
id bigint generated always as identity primary key,
created_at timestamptz not null default now(),
tipo text not null, tarea_id text not null, coord_id text, para text,
actor_id text, actor_rol text, actor_nombre text
);
create index eventos_created_at on eventos (created_at desc);
alter table eventos enable row level security;
alter table personas add column visto_at timestamptz;
Desde v2.12.0 el permiso "Gestiona tareas de su coordinación":
alter table personas add column if not exists gestiona_coord boolean not null default false;
Vista 📈 Reportes: período configurable (atajos o fechas desde/hasta), filtro por coordinación y comparación con el período anterior de igual duración.
| Indicador | Cálculo |
|---|---|
| Creadas / Completadas | Tareas cuya fecha de creación / de término cae en el período |
| Pendientes / Vencidas al cierre | Estado al último día del período |
| Tiempo de resolución | Días entre creación y término (promedio y mediana) |
| Cumplimiento de plazos | Completadas en o antes de su fecha límite ÷ completadas con fecha límite |
Desglose por persona, coordinación, tipo de requerimiento, categoría y solicitante. Salidas: PDF (ventana de impresión) y Excel (CSV) con el detalle de cada tarea y columnas Sí/No para filtrar o armar tablas dinámicas. Las tareas en la papelera no se consideran.
La interfaz se puede abrir directamente, pero los datos vienen de /api/data, que solo existe
cuando corre Vercel. Para probar con datos reales:
npm i -g vercel
vercel link # vincular con el proyecto existente
vercel env pull # descargar las variables de entorno
vercel dev # http://localhost:3000
Login con Google (https://<dominio>/ → "Iniciar sesión con Google", solo cuentas @ufrontera.cl).
api/data.js verifica el token de Google, busca a la persona por personas.correo y entrega una
sesión firmada de 30 días. El rol se vuelve a calcular en cada petición:
| Rol | Cómo se define | Puede |
|---|---|---|
Administración (directora) | Correo en DIRECTORA_CORREO | Todo |
Gestiona tareas (gestor) | personas.gestiona_tareas | Crear y modificar tareas de todas las coordinaciones |
Coordinador/a (coordinador) | personas.es_jefe | Todo con las tareas de su coordinación; nombre y cargo de su equipo |
Gestiona tareas de su coordinación (gestorCoord) | personas.gestiona_coord | Crear y modificar tareas de su coordinación (como el coordinador/a, sin editar personas ni recibir los avisos de Revisión) |
Integrante (integrante) | Resto | En sus tareas abiertas: estado hasta Revisión, descripción y link |
Personas, permisos, correos, coordinaciones y opciones solo los modifica Administración. Los
permisos se comprueban en el servidor (denegar()); la interfaz solo oculta los botones.
Sin sesión, la API responde 401 y no entrega datos: la app muestra la pantalla de login sobre un
tablero de muestra desenfocado. Desde v2.10.0 no hay otra forma de entrar (se retiraron el enlace
?k= y los enlaces por coordinación ?coord=).
personas.gestiona_coord, rol gestorCoord): crea, edita, completa y archiva tareas solo de su coordinación; su coordinador/a recibe aviso 🔔 y correo de lo que crea, asigna o cambia de fechagetAll les entrega aparte (calendario) las tareas con fecha de las demás coordinaciones, solo para el calendario y sin poder editarlas; integrantes ven solo su calendario. "👁 Ver como…" para los correos de VER_COMO_CORREO: el servidor arma la vista de otra persona y rechaza cualquier cambio mientras está activo?k= (DIRECTORA_KEY), los enlaces antiguos y las variables ENLACES_SOLO_LECTURA y SOLO_CON_GOOGLECORREO_PRUEBA); aviso cuando cambia la fecha límite; la fecha límite ya no se muestra un día antes ni vence antes de tiempoSOLO_CON_GOOGLE); la vista de la directora pasa a llamarse Administración; nombre "DirCom"css/, js/, img/), sin cambios de funcionalidad