diff --git a/site/scripts/proactive-e2e.mjs b/site/scripts/proactive-e2e.mjs
index 7eb9cd3f..2a4eefef 100644
--- a/site/scripts/proactive-e2e.mjs
+++ b/site/scripts/proactive-e2e.mjs
@@ -411,6 +411,21 @@ try {
if (await boton.count()) await boton.click();
};
await page.goto(base + "/app/novedades/" + noticeId + "/");
+ // Un aviso de cambios abre con el cambio primero, no con los ajustes.
+ const cambios = page.locator(".campu-home .campu-changes");
+ await cambios.waitFor();
+ const titularCambio = (await page.locator(".campu-home h1").innerText()).replace(/\s+/g, " ");
+ assert.match(titularCambio, /^(Encontré \d+ cambios en tus cursos\.|Cambió |Publicaron |Ya no aparece|Hay un anuncio)/, titularCambio);
+ assert.equal(await page.getByRole("heading", { name: "Cómo quieres que te avise" }).count(), 0);
+ assert.match(await cambios.innerText(), /nota oficial en mi upc/i, "el cambio se ve sin abrir nada");
+ // Y el orden: el cambio va antes que lo que viene.
+ const orden = await page.evaluate(() => {
+ const q = (s) => document.querySelector(s);
+ const c = q(".campu-home .campu-changes"), w = q(".campu-home .campu-week");
+ return !w || Boolean(c.compareDocumentPosition(w) & Node.DOCUMENT_POSITION_FOLLOWING);
+ });
+ assert.equal(orden, true, "el cambio va primero");
+ await openDetail();
await page
.getByRole("heading", { name: "Esto es lo que pude revisar." })
.waitFor();
@@ -575,6 +590,8 @@ try {
),
session,
);
+ // Con el aviso ya abierto, la vista pasa a la simple: el detalle se abre después.
+ await page.locator(".campu-home").waitFor();
await openDetail();
await page
.getByRole("heading", { name: "Esto es lo que pude revisar." })
diff --git a/site/src/components/CampuUpdates.tsx b/site/src/components/CampuUpdates.tsx
index ee00bda0..6090f3de 100644
--- a/site/src/components/CampuUpdates.tsx
+++ b/site/src/components/CampuUpdates.tsx
@@ -503,10 +503,65 @@ function DeliveryCard({
);
}
+/** Lo que cambió en este aviso, con su valor anterior cuando lo hay. Va primero: es lo que
+ * la persona vino a ver al tocar el correo. */
+function ChangesCard({ events }: { events: any[] }) {
+ if (!events.length) return null;
+ return (
+ Antes no tenía nota registrada. Peso anterior registrado: {e.before.weight}%
+ Nota anterior registrada: {e.before.score} /{" "}
+ {e.before.maxScore ?? "máximo no especificado"}
+ Vencimiento anterior registrado: {timestamp(e.before.dueAt)}Cambios de este aviso
+ {events.map((e) => (
+
Última revisión: {timestamp(checkedAt)}
Antes no tenía nota registrada.
- )} - {typeof e.before?.weight === "number" && - e.before.weight !== e.fact.weight && ( -Peso anterior registrado: {e.before.weight}%
- )} - {typeof e.before?.score === "number" && ( -- Nota anterior registrada: {e.before.score} /{" "} - {e.before.maxScore ?? "máximo no especificado"} -
- )} - {e.before?.dueAt && e.before.dueAt !== e.fact.dueAt && ( -- Vencimiento anterior registrado:{" "} - {timestamp(e.before.dueAt)} -
- )} -