From 79f3c42b0c04c7fd77481c14e6e9c345677b8c42 Mon Sep 17 00:00:00 2001 From: Ariel Costas Guerrero <94913521+arielcostas@users.noreply.github.com> Date: Tue, 4 Mar 2025 00:51:42 +0100 Subject: Add table layout like iTranvias, remake settings page --- src/pages/About.tsx | 45 ++++++++++++++++++++++++-------- src/pages/Estimates.tsx | 68 ++++++------------------------------------------- 2 files changed, 43 insertions(+), 70 deletions(-) (limited to 'src/pages') diff --git a/src/pages/About.tsx b/src/pages/About.tsx index 918d484..7e1b0d3 100644 --- a/src/pages/About.tsx +++ b/src/pages/About.tsx @@ -1,8 +1,9 @@ -import { Moon, Sun } from "lucide-react"; -import { useTheme } from "../ThemeContext"; +import { List, Moon, Sun, Table, Table2, TableCellsMerge, TableColumnsSplit } from "lucide-react"; +import { useApp } from "../AppContext"; +import "../styles/About.css"; export function About() { - const {theme, toggleTheme} = useTheme(); + const { theme, setTheme, tableStyle, setTableStyle } = useApp(); return (
@@ -11,12 +12,36 @@ export function About() { Aplicación web para encontrar paradas y tiempos de llegada de los autobuses urbanos de Vigo, España.

- +
+

Ajustes

+
+ + +
+
+ + +
+
+ ¿Qué significa esto? +

+ La tabla de horarios puede mostrarse de dos formas: +

+
+
Mostrar por orden
+
Las paradas se muestran en el orden en que se visitan. Aplicaciones como Infobus (Vitrasa) usan este estilo.
+
Agrupar por línea
+
Las paradas se agrupan por la línea de autobús. Aplicaciones como iTranvias (A Coruña) o Moovit (más o menos) usan este estilo.
+
+
+
+

Créditos

Código en GitHub @@ -26,7 +51,7 @@ export function About() {

- Datos obtenidos de datos.vigo.org bajo + Datos obtenidos de datos.vigo.org bajo licencia Open Data Commons Attribution License

diff --git a/src/pages/Estimates.tsx b/src/pages/Estimates.tsx index a445300..900ffc5 100644 --- a/src/pages/Estimates.tsx +++ b/src/pages/Estimates.tsx @@ -1,11 +1,13 @@ import { JSX, useEffect, useState } from "react"; import { useParams } from "react-router"; import { StopDataProvider } from "../data/StopDataProvider"; -import LineIcon from "../components/LineIcon"; import { Star } from 'lucide-react'; import "../styles/Estimates.css"; +import { RegularTable } from "../components/RegularTable"; +import { useApp } from "../AppContext"; +import { GroupedTable } from "../components/GroupedTable"; -interface StopDetails { +export interface StopDetails { stop: { id: number; name: string; @@ -32,6 +34,7 @@ export function Estimates(): JSX.Element { const [dataDate, setDataDate] = useState(null); const [favourited, setFavourited] = useState(false); const params = useParams(); + const { tableStyle } = useApp(); useEffect(() => { loadData(params.stopId!) @@ -48,22 +51,6 @@ export function Estimates(): JSX.Element { ); }, [params.stopId]); - const absoluteArrivalTime = (minutes: number) => { - const now = new Date() - const arrival = new Date(now.getTime() + minutes * 60000) - return Intl.DateTimeFormat(navigator.language, { - hour: '2-digit', - minute: '2-digit' - }).format(arrival) - } - - const formatDistance = (meters: number) => { - if (meters > 1024) { - return `${(meters / 1000).toFixed(1)} km`; - } else { - return `${meters} m`; - } - } const toggleFavourite = () => { if (favourited) { @@ -87,48 +74,9 @@ export function Estimates(): JSX.Element {
- - - - - - - - - - - - - - {data.estimates - .sort((a, b) => a.minutes - b.minutes) - .map((estimate, idx) => ( - - - - - - - ))} - - - {data?.estimates.length === 0 && ( - - - - - - )} -
Estimaciones de llegadas a las {dataDate?.toLocaleTimeString()}
LíneaRutaMinutosMetros
{estimate.route} - {estimate.minutes > 15 - ? absoluteArrivalTime(estimate.minutes) - : `${estimate.minutes} min`} - - {estimate.meters > -1 - ? formatDistance(estimate.meters) - : "No disponible" - } -
No hay estimaciones disponibles
+ {tableStyle === 'grouped' ? + : + }
) -- cgit v1.3