Routenplanung auf HAFAS (/journeys) umstellen, Zwischenhalte, Filter, Paginierung

Löst die WebApp aus der eigenen OTP2-Instanz heraus und nutzt dieselbe
HAFAS-Anbindung (VBB + Deutsche Bahn) wie die iOS-App, damit beide Clients
gegen dasselbe Backend-Feature-Set laufen:

- js/api.js: getJourneys() ruft jetzt /journeys statt /otp/journeys auf,
  inkl. via0-2 (Lat/Lon/Name/WaitMinutes), modes, bike, earlierRef/laterRef.
  Gibt die volle Antwort zurück statt nur { journeys }.
- js/app.js: bis zu 3 Zwischenhalte mit eigener Ortssuche und Aufenthaltszeit,
  Verkehrsmittel-Filter (ModeFilter-Komponente wiederverwendet), Fahrrad-
  Toggle, Früher/Später-Buttons zum Nachladen. Share-Link-Format um
  Vias/Modes/Bike erweitert, alter Umstiegszeit-Puffer entfernt (von HAFAS
  nicht unterstützt).
- index.html/styles.css: neue Formularelemente für Zwischenhalte, Filter
  und Paginierung.
- js/i18n.js: neue Übersetzungsschlüssel in DE/EN, alten sourceNote-String
  korrigiert (& wurde per textContent gesetzt und wäre literal
  angezeigt worden statt als &).
- README.md: Feature-Beschreibung aktualisiert.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01De7H8hR1Q9DdgyuS2ukN6y
This commit is contained in:
Claude committed 2026-09-28 11:49:14 +02:00
1 parent 9c3ec24bfe
commit 32c594bc4d
6 files changed
+358 -73

No files matched your search

+18 -12
View File
@@ -130,29 +130,35 @@
<button class="when-choice" data-when="arrival" type="button" aria-pressed="false" data-i18n="journey.arrivalAt">Ankunft um</button>
<input type="datetime-local" id="journey-when" class="journey-datetime" aria-label="Datum und Uhrzeit" hidden />
</div>
<div id="journey-vias" class="journey-vias"></div>
<button id="journey-add-via" class="text-button journey-add-via" type="button">+ <span data-i18n="journey.addVia">Zwischenhalt hinzufügen</span></button>
<label class="wheelchair-toggle">
<input type="checkbox" id="journey-wheelchair" />
<span><span aria-hidden="true">♿</span> <span data-i18n="journey.wheelchair">Nur rollstuhlgerechte Verbindungen</span></span>
</label>
<label class="wheelchair-toggle" id="journey-bike-row">
<input type="checkbox" id="journey-bike" />
<span><span aria-hidden="true">🚲</span> <span data-i18n="journey.bike">Fahrrad mitnehmen</span></span>
</label>
<div class="journey-modes-field" id="journey-modes-field">
<span class="journey-modes-field__label" data-i18n="journey.modes">Verkehrsmittel</span>
<div id="journey-mode-filter" class="mode-filter"></div>
</div>
<div class="journey-options-row">
<div class="transfer-slack-field">
<label for="journey-transfer-slack" data-i18n="journey.transferSlack">Umstiegszeit-Puffer</label>
<select id="journey-transfer-slack">
<option value="" data-i18n="journey.transferSlackDefault">Standard</option>
<option value="0" data-i18n="journey.transferSlack0">0 min (knapp)</option>
<option value="3">3 min</option>
<option value="5">5 min</option>
<option value="10">10 min</option>
<option value="15" data-i18n="journey.transferSlack15">15 min (sicher)</option>
</select>
</div>
<button id="journey-submit" class="journey-submit" type="button"><span data-i18n="journey.submit">Verbindungen suchen</span> <span aria-hidden="true">→</span></button>
</div>
<p class="journey-source-note" data-i18n="journey.sourceNote">🛰 Routenplanung über unsere selbst gehostete, offene Instanz (VBB-Region)</p>
<p class="journey-source-note" data-i18n="journey.sourceNote">🛰 Routenplanung mit Echtzeitdaten von VBB &amp; Deutscher Bahn</p>
<div id="journey-share-row" class="journey-share-row" hidden>
<button id="journey-share-btn" class="text-button" type="button"><span aria-hidden="true">🔗</span> <span data-i18n="journey.share">Route teilen</span></button>
</div>
<div id="journey-results" class="journey-results" aria-live="polite"></div>
<div id="journey-load-more-row" class="journey-load-more-row" hidden>
<button id="journey-earlier-btn" class="journey-load-more-btn" type="button" disabled>↑ <span data-i18n="journey.earlier">Früher</span></button>
<button id="journey-later-btn" class="journey-load-more-btn" type="button" disabled>↓ <span data-i18n="journey.later">Später</span></button>
</div>
</section>
<section class="tab-panel" data-tab-panel="nearby" hidden>