From 02525bcb98bc1841c5734623be4d7936e66f32b2 Mon Sep 17 00:00:00 2001 From: Ariel Costas Guerrero Date: Fri, 7 Nov 2025 10:28:24 +0100 Subject: Finish implementing navidad --- Taskfile.yml | 6 ++ data/vigo/download-stops.py | 19 ++--- data/vigo/overrides/navidad-2025.yaml | 120 ++++++++++++++++++++++-------- src/frontend/app/components/StopAlert.css | 13 +--- src/frontend/app/components/StopAlert.tsx | 20 +++-- src/frontend/app/data/StopDataProvider.ts | 5 +- src/frontend/public/pwa-worker.js | 2 +- src/frontend/public/stops/vigo.json | 108 ++++++++++++++++++--------- 8 files changed, 195 insertions(+), 98 deletions(-) diff --git a/Taskfile.yml b/Taskfile.yml index da88106..a7080db 100644 --- a/Taskfile.yml +++ b/Taskfile.yml @@ -37,3 +37,9 @@ tasks: desc: Generate stop-based JSON reports for specified dates or date ranges. cmds: - uv --directory ./src/gtfs_vigo_stops run ./stop_report.py --output-dir ./output --feed-url https://datos.vigo.org/data/transporte/gtfs_vigo.zip --force + + gen-stop-json: + desc: Generate stop-based JSON files for specified dates or date ranges. + cmds: + - uv --directory ./data/vigo run ./download-stops.py + - uv --directory ./data/santiago run ./download-stops.py diff --git a/data/vigo/download-stops.py b/data/vigo/download-stops.py index f332f5b..3211f99 100644 --- a/data/vigo/download-stops.py +++ b/data/vigo/download-stops.py @@ -32,7 +32,7 @@ def apply_overrides(stops, overrides): """Apply overrides to the stop data and add new stops""" # Track existing stop IDs existing_stop_ids = {stop.get("stopId") for stop in stops} - + # Apply overrides to existing stops for stop in stops: stop_id = stop.get("stopId") @@ -67,18 +67,15 @@ def apply_overrides(stops, overrides): if "cancelled" in override: stop["cancelled"] = override["cancelled"] - # Add alert title + if "alert" in override: + stop["alert"] = override["alert"] + if "title" in override: stop["title"] = override["title"] - # Add alert message if "message" in override: stop["message"] = override["message"] - # Add alternate codes - if "alternateCodes" in override: - stop["alternateCodes"] = override["alternateCodes"] - # Add new stops (those with "new: true" parameter) new_stops_added = 0 for stop_id, override in overrides.items(): @@ -86,7 +83,7 @@ def apply_overrides(stops, overrides): if override.get("new") and stop_id not in existing_stop_ids: # Ensure stop_id is an integer for consistency stop_id_int = int(stop_id) if isinstance(stop_id, str) else stop_id - + # Create the new stop new_stop = { "stopId": stop_id_int, @@ -97,7 +94,7 @@ def apply_overrides(stops, overrides): "longitude": override.get("location", {}).get("longitude"), "lines": override.get("lines", []) } - + # Add optional fields (excluding the 'new' parameter) if "alternateNames" in override: for key, value in override["alternateNames"].items(): @@ -112,10 +109,10 @@ def apply_overrides(stops, overrides): new_stop["message"] = override["message"] if "alternateCodes" in override: new_stop["alternateCodes"] = override["alternateCodes"] - + stops.append(new_stop) new_stops_added += 1 - + if new_stops_added > 0: print(f"Added {new_stops_added} new stops from overrides") diff --git a/data/vigo/overrides/navidad-2025.yaml b/data/vigo/overrides/navidad-2025.yaml index 3afc456..cb20222 100644 --- a/data/vigo/overrides/navidad-2025.yaml +++ b/data/vigo/overrides/navidad-2025.yaml @@ -1,32 +1,88 @@ -20208: - new: true - name: "Colón 12" - title: "Parada provisional sin datos" - description: "Parada provisional donde paran las líneas de Policarpo Sanz 40 *exceptuando 9B*" - location: - latitude: 42.23805815883466 - longitude: -8.72057889828808 - lines: - - "C1" - - "A" - - "5A" - - "9B" - - "15B" - - "15C" - - "24" - - "28" - - "N4" - -6620: - cancelled: true - title: "Parada movida a Colón 12" - description: "Con motivo del corte por las atracciones navideñas, las líneas se deben coger en Colón 12 (20208), excepto la línea 9B que arranca en Urzaiz-Príncipe." - alternateCodes: - - 20208 - -20198: - cancelled: true - title: "Parada movida a Marqués de Valladares (fronte 19)" - description: "Con motivo del corte por las atracciones navideñas, las líneas se deben coger en Marqués de Valladares (fronte 19), excepto la línea 9B que arranca en Urzaiz-Príncipe y la 24 que para en Colón 12 (provisional)." - alternateCodes: - - 20206 \ No newline at end of file +20208: + new: true + name: "Colón 12" + title: "Parada provisional sin datos" + message: "Parada provisional donde paran las líneas de Policarpo Sanz 40 *exceptuando 9B*" + location: + latitude: 42.23805815883466 + longitude: -8.72057889828808 + lines: + - "C1" + - "A" + - "5A" + - "9B" + - "15B" + - "15C" + - "24" + - "28" + - "N4" + +20194: # Cánovas del Castillo 28 + cancelled: true + alert: "error" + title: "Cerrada por navidad" + message: | + Con motivo de las atracciones navideñas, esta parada queda anulada. + La parada más cercana es Cánovas del Castillo, 18 (frente CC A Laxe). + +14121: # Reconquista, 2 (Correos) + cancelled: true + alert: "error" + title: "Cerrada por navidad" + message: | + Con motivo de las atracciones navideñas, esta parada queda anulada. + Línea 9B comienza en Urzaiz-Príncipe. + Línea 24 se puede tomar en Colón 12 (provisional). + Resto de líneas en Marqués de Valladares (fronte 19) - subiendo Reconquista, primera calle a la derecha. + +20198: # Policarpo Sanz, 26 + cancelled: true + alert: "error" + title: "Parada movida a Marqués de Valladares (fronte 19)" + message: "Con motivo del corte por las atracciones navideñas, las líneas se deben coger en Marqués de Valladares (fronte 19), excepto la línea 9B que arranca en Urzaiz-Príncipe y la 24 que para en Colón 12 (provisional)." + +6620: # Policarpo Sanz, 40 + cancelled: true + title: "Parada movida a Colón 12" + message: "Con motivo del corte por las atracciones navideñas, las líneas se deben coger en Colón 12 (20208), excepto la línea 9B que arranca en Urzaiz-Príncipe." + alternateCodes: + - 20208 + +6860: # Praza de Compostela + alert: "warning" + title: L24 no realiza parada + message: | + Con motivo de las atracciones navideñas, la línea 24 no realiza parada en esta ubicación. + Se puede tomar en Areal (aduana), antes del semáforo de Colón. + +3230: # Colón, 27 + alert: warning + title: L17 no realiza parada + message: | + Con motivo de las atracciones navideñas, la línea 17 no realiza parada en esta ubicación. + Se puede tomar en Urzaiz, 13 (cruce República Argentina). + +5520: # García Barbón 7 (hacia Urzaiz/P.Sanz) + cancelled: true + alert: "error" + title: "Cerrada por navidad" + message: | + Con motivo de las atracciones navideñas, esta parada queda anulada. + Líneas C3, 10, N1, 5B, 16 y 17 en García Barbón, 43 (restaurante Porto Santo). + Líneas 4A y 4C (dir. Coia), 7, 12B, 16 y 17 se pueden tomar en Colón, 26 (oficina Banco Sabadell). + +5530: # García Barbón 18 (hacia Teis) + cancelled: true + alert: "error" + title: "Cerrada por navidad" + message: | + Con motivo de las atracciones navideñas, esta parada queda anulada. + Líneas C3 y 10 se pueden tomar en Rosalía de Castro 4 (detrás de ABANCA). + Resto de líneas en García Barbón 28 (pasando Alfonso XIII) + +5540: # García Barbón 28 (hacia Teis) + alert: "warning" + title: "Líneas C3 y 10 no realizan parada" + message: | + Con motivo de las atracciones navideñas, las líneas C3 y 10 realizan + provisionalmente la parada en Rúa Oporto 28 (calle perpendicular a la parada). diff --git a/src/frontend/app/components/StopAlert.css b/src/frontend/app/components/StopAlert.css index 2ba3baa..c1d9a0a 100644 --- a/src/frontend/app/components/StopAlert.css +++ b/src/frontend/app/components/StopAlert.css @@ -72,7 +72,7 @@ } .stop-alert-compact .stop-alert-title { - font-size: 0.85rem; + font-size: 0.95rem; } .stop-alert-message { @@ -81,17 +81,6 @@ } .stop-alert-compact .stop-alert-message { - font-size: 0.8rem; -} - -.stop-alert-alternate-codes { font-size: 0.85rem; - margin-top: 0.25rem; - font-style: italic; - opacity: 0.8; -} - -.stop-alert-compact .stop-alert-alternate-codes { - font-size: 0.75rem; } diff --git a/src/frontend/app/components/StopAlert.tsx b/src/frontend/app/components/StopAlert.tsx index a96f93e..d969108 100644 --- a/src/frontend/app/components/StopAlert.tsx +++ b/src/frontend/app/components/StopAlert.tsx @@ -1,5 +1,5 @@ -import React from "react"; -import { AlertCircle, Info } from "lucide-react"; +import React, { useMemo } from "react"; +import { AlertCircle, AlertOctagon, Info, TriangleAlert } from "lucide-react"; import type { Stop } from "~/data/StopDataProvider"; import "./StopAlert.css"; @@ -15,11 +15,21 @@ export const StopAlert: React.FC = ({ stop, compact = false }) = return null; } - const isError = stop.cancelled === true; + const alertType = useMemo(() => { + if (stop.alert === "error") return "stop-alert-error"; + if (stop.alert === "warning") return "stop-alert-warning"; + return "stop-alert-info"; + }, [stop.alert]); + + const alertIcon = useMemo(() => { + if (stop.alert === "error") return ; + if (stop.alert === "warning") return ; + return ; + }, [stop.alert]); return ( -
- {isError ? : } +
+ {alertIcon}
{stop.title &&
{stop.title}
} {stop.message &&
{stop.message}
} diff --git a/src/frontend/app/data/StopDataProvider.ts b/src/frontend/app/data/StopDataProvider.ts index 25a617b..799dcb5 100644 --- a/src/frontend/app/data/StopDataProvider.ts +++ b/src/frontend/app/data/StopDataProvider.ts @@ -18,10 +18,11 @@ export interface Stop { lines: string[]; favourite?: boolean; amenities?: string[]; - cancelled?: boolean; + title?: string; message?: string; - alternateCodes?: string[]; + alert?: "info"|"warning"|"error"; + cancelled?: boolean; } // In-memory cache and lookup map per region diff --git a/src/frontend/public/pwa-worker.js b/src/frontend/public/pwa-worker.js index 04364df..bfe4b7e 100644 --- a/src/frontend/public/pwa-worker.js +++ b/src/frontend/public/pwa-worker.js @@ -1,4 +1,4 @@ -const CACHE_VERSION = "20251106b"; +const CACHE_VERSION = "20251107a"; const STATIC_CACHE_NAME = `static-cache-${CACHE_VERSION}`; const STATIC_CACHE_ASSETS = [ "/favicon.ico", diff --git a/src/frontend/public/stops/vigo.json b/src/frontend/public/stops/vigo.json index b025348..3a4bc99 100644 --- a/src/frontend/public/stops/vigo.json +++ b/src/frontend/public/stops/vigo.json @@ -1140,6 +1140,7 @@ "6", "9B", "15B", + "15C", "28" ] }, @@ -1154,6 +1155,7 @@ "6", "9B", "15B", + "15C", "28" ] }, @@ -3518,7 +3520,10 @@ "15C", "16", "17" - ] + ], + "alert": "warning", + "title": "L17 no realiza parada", + "message": "Con motivo de las atracciones navideñas, la línea 17 no realiza parada en esta ubicación.\nSe puede tomar en Urzaiz, 13 (cruce República Argentina).\n" }, { "stopId": 3240, @@ -3564,7 +3569,8 @@ "latitude": 42.226287696, "longitude": -8.737475832, "lines": [ - "15B" + "15B", + "15C" ] }, { @@ -6039,7 +6045,11 @@ "amenities": [ "shelter", "display" - ] + ], + "cancelled": true, + "alert": "error", + "title": "Cerrada por navidad", + "message": "Con motivo de las atracciones navideñas, esta parada queda anulada.\nLíneas C3, 10, N1, 5B, 16 y 17 en García Barbón, 43 (restaurante Porto Santo).\nLíneas 4A y 4C (dir. Coia), 7, 12B, 16 y 17 se pueden tomar en Colón, 26 (oficina Banco Sabadell).\n" }, { "stopId": 5530, @@ -6059,7 +6069,11 @@ "amenities": [ "shelter", "display" - ] + ], + "cancelled": true, + "alert": "error", + "title": "Cerrada por navidad", + "message": "Con motivo de las atracciones navideñas, esta parada queda anulada.\nLíneas C3 y 10 se pueden tomar en Rosalía de Castro 4 (detrás de ABANCA).\nResto de líneas en García Barbón 28 (pasando Alfonso XIII)\n" }, { "stopId": 5540, @@ -6078,7 +6092,10 @@ "24", "H2", "PSA 1" - ] + ], + "alert": "warning", + "title": "Líneas C3 y 10 no realizan parada", + "message": "Con motivo de las atracciones navideñas, las líneas C3 y 10 realizan\nprovisionalmente la parada en Rúa Oporto 28 (calle perpendicular a la parada).\n" }, { "stopId": 5560, @@ -7362,19 +7379,15 @@ "9B", "15B", "15C", - "24", - "28", - "N4" - ], - "cancelled": true, - "title": "Parada movida a Colón 12", - "alternateCodes": [ - 20208 + "24" ], "amenities": [ "shelter", "display" - ] + ], + "cancelled": true, + "title": "Parada movida a Colón 12", + "message": "Con motivo del corte por las atracciones navideñas, las líneas se deben coger en Colón 12 (20208), excepto la línea 9B que arranca en Urzaiz-Príncipe." }, { "stopId": 6640, @@ -7604,7 +7617,10 @@ "N4", "H1", "VTS" - ] + ], + "alert": "warning", + "title": "L24 no realiza parada", + "message": "Con motivo de las atracciones navideñas, la línea 24 no realiza parada en esta ubicación.\nSe puede tomar en Areal (aduana), antes del semáforo de Colón.\n" }, { "stopId": 6880, @@ -9787,7 +9803,8 @@ "latitude": 42.169776602, "longitude": -8.678942156, "lines": [ - "A" + "A", + "15C" ] }, { @@ -10144,6 +10161,17 @@ "15C" ] }, + { + "stopId": 9030, + "name": { + "original": "Xestoso (B)" + }, + "latitude": 42.207537397, + "longitude": -8.670071905, + "lines": [ + "15B" + ] + }, { "stopId": 9040, "name": { @@ -10325,10 +10353,12 @@ "10", "15B", "15C", - "24", - "28", - "N4" - ] + "24" + ], + "cancelled": true, + "alert": "error", + "title": "Cerrada por navidad", + "message": "Con motivo de las atracciones navideñas, esta parada queda anulada.\nLínea 9B comienza en Urzaiz-Príncipe.\nLínea 24 se puede tomar en Colón 12 (provisional).\nResto de líneas en Marqués de Valladares (fronte 19) - subiendo Reconquista, primera calle a la derecha.\n" }, { "stopId": 14122, @@ -14950,10 +14980,12 @@ "9B", "10", "15B", - "15C", - "28", - "N4" - ] + "15C" + ], + "cancelled": true, + "alert": "error", + "title": "Cerrada por navidad", + "message": "Con motivo de las atracciones navideñas, esta parada queda anulada.\nLa parada más cercana es Cánovas del Castillo, 18 (frente CC A Laxe).\n" }, { "stopId": 20195, @@ -15019,18 +15051,15 @@ "10", "15B", "15C", - "24", - "28", - "N4" - ], - "cancelled": true, - "title": "Parada movida a Marqués de Valladares (fronte 19)", - "alternateCodes": [ - 20206 + "24" ], "amenities": [ "shelter" - ] + ], + "cancelled": true, + "alert": "error", + "title": "Parada movida a Marqués de Valladares (fronte 19)", + "message": "Con motivo del corte por las atracciones navideñas, las líneas se deben coger en Marqués de Valladares (fronte 19), excepto la línea 9B que arranca en Urzaiz-Príncipe y la 24 que para en Colón 12 (provisional)." }, { "stopId": 20199, @@ -15068,8 +15097,16 @@ "latitude": 42.238271922, "longitude": -8.723353532, "lines": [ + "C1", "C3d", - "10" + "A", + "5A", + "9B", + "10", + "15B", + "15C", + "28", + "N4" ] }, { @@ -15090,7 +15127,8 @@ "28", "N4" ], - "title": "Parada provisional sin datos" + "title": "Parada provisional sin datos", + "message": "Parada provisional donde paran las líneas de Policarpo Sanz 40 *exceptuando 9B*" }, { "stopId": 20209, -- cgit v1.3