diff --git a/app.py b/app.py index 03eff12..ed9ed86 100644 --- a/app.py +++ b/app.py @@ -681,6 +681,32 @@ def _results(station_crs, slug, travel_date, journey_type, return_date): next_date, **{**common_url_args, "return_date": next_return_date}, ) + prev_outbound_url = _results_url( + station_crs, slug, prev_date, **common_url_args + ) + next_outbound_url = _results_url( + station_crs, slug, next_date, **common_url_args + ) + prev_return_url = ( + _results_url( + station_crs, + slug, + travel_date, + **{**common_url_args, "return_date": prev_return_date}, + ) + if return_date + else None + ) + next_return_url = ( + _results_url( + station_crs, + slug, + travel_date, + **{**common_url_args, "return_date": next_return_date}, + ) + if return_date + else None + ) destination_links = [ ( destination_slug, @@ -775,6 +801,10 @@ def _results(station_crs, slug, travel_date, journey_type, return_date): next_date=next_date, prev_results_url=prev_results_url, next_results_url=next_results_url, + prev_outbound_url=prev_outbound_url, + next_outbound_url=next_outbound_url, + prev_return_url=prev_return_url, + next_return_url=next_return_url, destination_links=destination_links, results_base_url=results_base_url, travel_date_display=travel_date_display, diff --git a/circle_line.py b/circle_line.py index c0d945c..76baaf9 100644 --- a/circle_line.py +++ b/circle_line.py @@ -165,13 +165,17 @@ def next_service( def upcoming_services( - earliest_board: datetime, count: int = 2, direction: str = 'pad_to_kx' + earliest_board: datetime, + count: int = 2, + direction: str = 'pad_to_kx', + preceding: int = 0, ) -> list[tuple[datetime, datetime]]: """ - Return up to *count* Circle line services for *direction*, starting from - *earliest_board*. + Return Circle line services for *direction* around *earliest_board*. - Each element is (depart_origin, arrive_destination) as datetimes. + Returns up to *preceding* services before earliest_board followed by up to + *count* services at or after earliest_board. Each element is + (depart_origin, arrive_destination) as datetimes. """ timetable = _get_timetable().get(direction, {})[_day_type(earliest_board.weekday())] board_secs = ( @@ -180,13 +184,17 @@ def upcoming_services( + earliest_board.second ) midnight = earliest_board.replace(hour=0, minute=0, second=0, microsecond=0) + pre_results = [] results = [] for pad_secs, kxp_secs in timetable: - if pad_secs >= board_secs: - results.append(( - midnight + timedelta(seconds=pad_secs), - midnight + timedelta(seconds=kxp_secs), - )) + entry = ( + midnight + timedelta(seconds=pad_secs), + midnight + timedelta(seconds=kxp_secs), + ) + if pad_secs < board_secs: + pre_results.append(entry) + else: + results.append(entry) if len(results) == count: break - return results + return pre_results[-preceding:] + results if preceding else results diff --git a/templates/base.html b/templates/base.html index 53b3f70..5009f0c 100644 --- a/templates/base.html +++ b/templates/base.html @@ -246,6 +246,7 @@ /* Results page layout */ .back-link { margin-bottom: 1rem; } .date-nav { display: flex; align-items: center; gap: 0.75rem; margin-bottom: 0.5rem; } + .date-nav-label { min-width: 6rem; font-weight: 600; font-size: 0.9rem; } .switcher-section { margin: 0.9rem 0 1rem; } .section-label { font-size: 0.9rem; font-weight: 600; margin-bottom: 0.45rem; } .filter-row { margin-top: 0.75rem; display: flex; gap: 1.5rem; align-items: center; flex-wrap: wrap; } diff --git a/templates/results.html b/templates/results.html index 96b2e8a..067a1e7 100644 --- a/templates/results.html +++ b/templates/results.html @@ -20,13 +20,28 @@ {{ departure_station_name }} → {{ destination }} {% endif %} + {% if journey_type == 'return' %} +
+ + {% else %}