Files
intotheeast-com/docs/working/plans/2026-07-04-standalone-page-cleanup.md
T
2026-07-04 13:43:27 +02:00

7.4 KiB

artifact_contract, artifact_readiness, product_contract_source
artifact_contract artifact_readiness product_contract_source
ce-unified-plan/v1 requirements-only ce-brainstorm

Standalone Sub-Page Cleanup — retire redundant map/stats/dailies/stories pages

Status: 🔄 In progress — Phase 1 + 1.5 (title alignment) + Phase 2 (entry-map partial) complete (2026-07-04, pushed to production). Discovered Phase-1 test debt: ~13 Playwright tests across 7 specs still target the deleted standalone views — cleanup pending owner decision.

Plan type: refactor · Depth: Standard · Origin: sequel to 2026-06-27-map-init-consolidation.md — that plan unified the map engine (MapUtils.initEntryMap()) onto trip + home but deferred feed-map/map.html; this plan removes those deferred surfaces entirely.


Summary

Every trip carries four standalone sub-pages — 02.map, 03.stats, plus the standalone dailies and stories list views — that are fully consolidated onto the trip page (inline map + filter bar + inline stats via trip-feed-col) and are no longer reachable from navigation. They are also the last consumers of the old map code path: feed-map.html.twig hand-rolls an inline MapLibre init that duplicates MapUtils.initEntryMap(), and map.html.twig is a third variant built on renderGpxJourney directly.

This plan removes the dead pages/logic (Phase 1) and then finishes the shared-logic arc by de-duplicating the map markup that trip and home still copy-paste (Phase 2).

Net effect after both phases: the entire site renders maps through exactly one code path (initEntryMap()), invoked from exactly one shared partial.

Goal

  • Remove unused pages and view logic so the codebase has no orphaned templates or dead map variants.
  • Preserve all content and all currently-linked behavior — this is a pure internal cleanup, no user-visible feature change on the pages that remain.
  • Converge on a single map code path.

Product authority / decisions locked

  • Scope = Option 2 (all four standalone views retired), confirmed by owner.
  • Keepers — must not break: home.html.twig, trips.html.twig (trip overview), trip.html.twig, story.html.twig, and every shared element they use (trip-feed-col, home-predeparture, macros/stats, macros/cycling, macros/date-range, map.css, map.js).
  • Containers stay: 01.dailies/ and 04.stories/ folders remain as data containers (they physically hold entries/stories; trip + home fetch children via grav.pages.find(route ~ '/dailies').children).
  • Old URLs are don't-care: /map, /stats, /dailies, /stories direct hits may 404. No redirects required (owner decision). Individual entry/story detail pages underneath remain reachable.

Phase 1 — Cleanup (content + logic + old templates)

Delete these page templates (old / unreachable views):

  • user/themes/intotheeast/templates/map.html.twig — old map variant (renderGpxJourney inline)
  • user/themes/intotheeast/templates/stats.html.twig — orphaned (nothing links to it)
  • user/themes/intotheeast/templates/dailies.html.twig — standalone list view, consolidated onto trip page
  • user/themes/intotheeast/templates/stories.html.twig — standalone list view, consolidated onto trip page

Delete this partial (dies with its only two consumers):

  • user/themes/intotheeast/templates/partials/feed-map.html.twig — old inline-script map duplicate; included only by the two deleted list views.

Delete these page folders (empty pure-view shells) across every trip:

  • user/pages/01.trips/<slug>/02.map/
  • user/pages/01.trips/<slug>/03.stats/
  • (applies to all trips: central-asia-2023, italy-2025, italy-2026-demo, slovenia-2024, us-canada-mex-2024)

Repoint the two container pages so nothing errors (keep the folders, retire the view):

  • 01.dailies/dailies.md and 04.stories/stories.md: change template: off the deleted templates (e.g. to default), and mark the container non-routable/non-visible so its own URL is inert while children stay reachable.

Also update / remove any dangling reference to the deleted pages found during work (e.g. the link_href: … ~ '/map' line lived inside dailies.html.twig, which is being deleted — confirm no other template links to /map, /stats, /dailies, /stories as a destination).

Phase 1 acceptance criteria

  • Site renders with no Twig errors on: home (active-trip + between-trips), /trips, every trip page, and an individual entry and story detail page.
  • Trip page + home still show the inline map, filter bar, and stats correctly (child-fetch via find(...).children still resolves).
  • grep for feed-map.html.twig, map.html.twig, stats.html.twig, dailies.html.twig, stories.html.twig returns no remaining include/import/link references.
  • No content lost: journal entries and stories still present and reachable at their detail URLs.
  • Only one non-initEntryMap map path removed — confirm map.css/map.js and macros/stats are untouched.

Phase 2 — Optimization (finish the shared-logic arc)

trip.html.twig and home.html.twig still hand-write near-identical map markup (home-map-colhome-map/trip-map div → fullscreen button) plus a thin inline <script> calling MapUtils.initEntryMap(...). Extract the shared shape.

  • Create user/themes/intotheeast/templates/partials/entry-map.html.twig taking parameters for: container id, fullscreen button id, entries array, and gpx config (urls / use / autoconnect / sourcePrefix / journeyId), plus the fit config.
  • trip.html.twig and home.html.twig (active branch) both {% include … with {…} only %} the new partial instead of their inline markup + script.
  • Keep the JS engine (initEntryMap) as the single source of truth — the partial only supplies markup + the thin invocation.

Phase 2 acceptance criteria

  • Trip and home maps render and behave identically to pre-Phase-2 (markers, popups, click-to-scroll-and-highlight, GPX journey, fullscreen toggle).
  • The map-div markup + invocation exist in exactly one place (entry-map.html.twig); no copy-paste twin remains in trip/home.
  • Existing map-alignment tests (that assert window.tripMap / window.homeMap globals) still pass.

Non-goals / scope boundaries

  • Not deleting the 01.dailies/ or 04.stories/ container folders or any content inside them.
  • Not adding redirects for old URLs (owner deferred; 404 is acceptable).
  • Not touching the keeper pages' behavior or the trip-feed-col / home-predeparture partials, the stats/cycling macros, or map.css/map.js.
  • Not changing the GPX-manager, post form, or trip-switching config.

Risks & verification

  • Risk: container repoint leaves child entries unreachable. Mitigation: verify routable: false on a parent does not unroute children in this Grav version — load an entry and a story detail URL after the change.
  • Risk: a stray reference to a deleted template elsewhere (e.g. trips.html.twig counts, sitemap, feed). Mitigation: repo-wide grep before declaring Phase 1 done (acceptance criterion above).
  • Verification path: dev server at http://localhost:8081; walk home (both modes), /trips, each trip, one entry, one story; then run the map-alignment test suite for Phase 2.

Open questions

  • None blocking. (Container repoint mechanism — routable:false vs a minimal redirect — is an implementation detail for planning; owner has already ruled old-URL behavior don't-care.)