{% extends 'partials/base.html.twig' %} {% block content %} {% import 'macros/stats.html.twig' as stats_m %} {% import 'macros/cycling.html.twig' as cycling_m %} {% block map_assets %} {% do assets.addCss('theme://css-compiled/map.css') %} {% do assets.addJs('theme://js/map.js', {group: 'bottom'}) %} {% endblock %} {% set dailies_page = grav.pages.find(page.route ~ '/dailies') %} {% set stories_page = grav.pages.find(page.route ~ '/stories') %} {# journal_entries stays published-only — it feeds the map, stats and counts, which must never include drafts (R5). #} {% set journal_entries = dailies_page ? dailies_page.children.published() : [] %} {% set story_entries = stories_page ? stories_page.children.published() : [] %} {# Owner gate (KTD8): the site owner (not merely any login — the super-admin tester also authenticates) viewing the ACTIVE trip. Drives draft visibility in the feed and the Edit/Delete controls (threaded to the card partial). #} {% set active_trip_slug = (grav.config.site.active_trip|default(''))|split('/')|last %} {% set owner_can_edit = grav.user.authenticated and grav.user.username == grav.config.site.owner_username and page.slug == active_trip_slug %} {# Feed list is owner-aware: the owner sees drafts (unpublished) too; everyone else (and every non-active-trip view) sees published only (R5, KTD7). #} {% set journal_feed = (owner_can_edit and dailies_page) ? dailies_page.children : journal_entries %} {% set all_items = [] %} {% for e in journal_feed %} {% set all_items = all_items|merge([{'type': 'journal', 'page': e, 'date': e.header.date}]) %} {% endfor %} {% for s in story_entries %} {% set all_items = all_items|merge([{'type': 'story', 'page': s, 'date': s.header.date}]) %} {% endfor %} {% set all_items = all_items|sort_by_key('date', 4) %} {% set journal_count = journal_entries|length %} {% set story_count = story_entries|length %} {% set gps_points = [] %} {% for entry in journal_entries %} {% if entry.header.lat is not empty and entry.header.lng is not empty %} {% set gps_points = gps_points|merge([[entry.header.lat, entry.header.lng]]) %} {% endif %} {% endfor %} {% set gpx_urls = [] %} {% for name, media in page.media.all %} {% if name|split('.')|last == 'gpx' %} {% set gpx_urls = gpx_urls|merge([page.url ~ '/' ~ name]) %} {% endif %} {% endfor %} {% set has_gpx = gpx_urls|length > 0 %} {% set map_entries = [] %} {% for item in all_items %} {# drafts render as a feed card only — never a map marker (R5) #} {% if item.page.published and item.page.header.lat is not empty and item.page.header.lng is not empty %} {% set map_entries = map_entries|merge([{ 'type': item.type, 'lat': item.page.header.lat|number_format(6, '.', ''), 'lng': item.page.header.lng|number_format(6, '.', ''), 'slug': item.page.slug, 'title': item.page.title, 'url': item.page.url, 'force_connect': item.page.header.force_connect ? true : false, 'transport_mode': item.page.header.transport_mode ? item.page.header.transport_mode : null }]) %} {% endif %} {% endfor %}
{% include 'partials/entry-map.html.twig' with { map_id: 'trip-map', map_global: 'tripMap', entries: map_entries, card_prefix: 'entry-', story_markers: true, gpx_urls: gpx_urls, use_gpx: page.header.use_gpx ?? true, autoconnect: page.header.autoconnect ?? 'on', gpx_source_prefix: 'gpx', journey_id: 'trip-journey' } only %} {% include 'partials/trip-feed-col.html.twig' with { trip_page: page, all_items: all_items, journal_entries: journal_entries, journal_count: journal_count, story_count: story_count, has_gpx: has_gpx, gpx_urls: gpx_urls, gps_points: gps_points, show_sort: true, owner_can_edit: owner_can_edit } only %}
{% endblock %}