feat: add travelling branch and GPX to home map (active trip mode)
This commit is contained in:
@@ -1,21 +1,25 @@
|
|||||||
{% extends 'partials/base.html.twig' %}
|
{% extends 'partials/base.html.twig' %}
|
||||||
|
|
||||||
{% block content %}
|
{% block content %}
|
||||||
{% set slug = config.site.active_trip %}
|
{% set trip_route = config.site.active_trip %}
|
||||||
{% set trip = grav.pages.find('/trips/' ~ slug) %}
|
{% set trip = grav.pages.find(trip_route) %}
|
||||||
{% set dailies_page = grav.pages.find('/trips/' ~ slug ~ '/dailies') %}
|
|
||||||
{% set stories_page = grav.pages.find('/trips/' ~ slug ~ '/stories') %}
|
{% if config.site.travelling %}
|
||||||
|
{# ══════════════════════════════════════════════════════════ ACTIVE TRIP MODE #}
|
||||||
|
|
||||||
|
{% set dailies_page = grav.pages.find(trip_route ~ '/dailies') %}
|
||||||
|
{% set stories_page = grav.pages.find(trip_route ~ '/stories') %}
|
||||||
{% set journal_entries = dailies_page ? dailies_page.children.published() : [] %}
|
{% set journal_entries = dailies_page ? dailies_page.children.published() : [] %}
|
||||||
{% set story_entries = stories_page ? stories_page.children.published() : [] %}
|
{% set story_entries = stories_page ? stories_page.children.published() : [] %}
|
||||||
|
|
||||||
{% set all_items = [] %}
|
{% set all_items = [] %}
|
||||||
{% for e in journal_entries %}
|
{% for e in journal_entries %}
|
||||||
{% set all_items = all_items|merge([{'type': 'journal', 'page': e, 'date': e.date}]) %}
|
{% set all_items = all_items|merge([{'type': 'journal', 'page': e, 'date': e.header.date}]) %}
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
{% for s in story_entries %}
|
{% for s in story_entries %}
|
||||||
{% set all_items = all_items|merge([{'type': 'story', 'page': s, 'date': s.date}]) %}
|
{% set all_items = all_items|merge([{'type': 'story', 'page': s, 'date': s.header.date}]) %}
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
{% set all_items = all_items|sort((a, b) => a.date < b.date ? 1 : -1) %}
|
{% set all_items = all_items|sort_by_key('date', 3) %}
|
||||||
|
|
||||||
{% set journal_count = journal_entries|length %}
|
{% set journal_count = journal_entries|length %}
|
||||||
{% set story_count = story_entries|length %}
|
{% set story_count = story_entries|length %}
|
||||||
@@ -28,11 +32,21 @@
|
|||||||
'lng': item.page.header.lng|number_format(6, '.', ''),
|
'lng': item.page.header.lng|number_format(6, '.', ''),
|
||||||
'slug': item.page.slug,
|
'slug': item.page.slug,
|
||||||
'title': item.page.title,
|
'title': item.page.title,
|
||||||
'url': item.page.url
|
'url': item.page.url,
|
||||||
|
'force_connect': item.page.header.force_connect ? true : false
|
||||||
}]) %}
|
}]) %}
|
||||||
{% endif %}
|
{% endif %}
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|
||||||
|
{% set home_gpx_urls = [] %}
|
||||||
|
{% if trip %}
|
||||||
|
{% for name, media in trip.media.all %}
|
||||||
|
{% if name|split('.')|last == 'gpx' %}
|
||||||
|
{% set home_gpx_urls = home_gpx_urls|merge([trip.url ~ '/' ~ name]) %}
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
<div class="home-layout">
|
<div class="home-layout">
|
||||||
<div class="home-map-col">
|
<div class="home-map-col">
|
||||||
<div class="home-map" id="home-map"></div>
|
<div class="home-map" id="home-map"></div>
|
||||||
@@ -40,7 +54,7 @@
|
|||||||
|
|
||||||
<div class="home-feed-col">
|
<div class="home-feed-col">
|
||||||
<div class="home-trip-header">
|
<div class="home-trip-header">
|
||||||
<h1 class="home-trip-name">{{ trip ? trip.title : slug }}</h1>
|
<h1 class="home-trip-name">{{ trip ? trip.title : trip_route }}</h1>
|
||||||
<span class="home-trip-counts">
|
<span class="home-trip-counts">
|
||||||
{{ journal_count }} journal {{ journal_count == 1 ? 'entry' : 'entries' }}
|
{{ journal_count }} journal {{ journal_count == 1 ? 'entry' : 'entries' }}
|
||||||
{% if story_count > 0 %} · {{ story_count }} {{ story_count == 1 ? 'story' : 'stories' }}{% endif %}
|
{% if story_count > 0 %} · {{ story_count }} {{ story_count == 1 ? 'story' : 'stories' }}{% endif %}
|
||||||
@@ -130,9 +144,13 @@
|
|||||||
{% if map_entries|length > 0 %}
|
{% if map_entries|length > 0 %}
|
||||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/maplibre-gl@4/dist/maplibre-gl.css">
|
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/maplibre-gl@4/dist/maplibre-gl.css">
|
||||||
<script src="https://cdn.jsdelivr.net/npm/maplibre-gl@4/dist/maplibre-gl.js"></script>
|
<script src="https://cdn.jsdelivr.net/npm/maplibre-gl@4/dist/maplibre-gl.js"></script>
|
||||||
|
{% if home_gpx_urls|length > 0 %}
|
||||||
|
<script src="https://cdn.jsdelivr.net/npm/@mapbox/togeojson@0.16.2/togeojson.min.js"></script>
|
||||||
|
{% endif %}
|
||||||
<script src="{{ url('theme://js/maplibre-utils.js') }}"></script>
|
<script src="{{ url('theme://js/maplibre-utils.js') }}"></script>
|
||||||
<script>
|
<script>
|
||||||
var HOME_ENTRIES = {{ map_entries|json_encode|raw }};
|
var HOME_ENTRIES = {{ map_entries|json_encode|raw }};
|
||||||
|
var HOME_GPX_URLS = {{ home_gpx_urls|json_encode|raw }};
|
||||||
|
|
||||||
var homeMap = new maplibregl.Map({
|
var homeMap = new maplibregl.Map({
|
||||||
container: 'home-map',
|
container: 'home-map',
|
||||||
@@ -166,6 +184,7 @@ homeMap.on('load', function () {
|
|||||||
new maplibregl.Marker({ element: el }).setLngLat(lngLat).addTo(homeMap);
|
new maplibregl.Marker({ element: el }).setLngLat(lngLat).addTo(homeMap);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
/* Draw simple journey line immediately; replaced below if GPX is present */
|
||||||
MapUtils.addJourneyLine(homeMap, coords, 'home-journey');
|
MapUtils.addJourneyLine(homeMap, coords, 'home-journey');
|
||||||
|
|
||||||
if (HOME_ENTRIES.length === 1) {
|
if (HOME_ENTRIES.length === 1) {
|
||||||
@@ -175,7 +194,39 @@ homeMap.on('load', function () {
|
|||||||
}
|
}
|
||||||
|
|
||||||
setTimeout(function () { homeMap.resize(); }, 100);
|
setTimeout(function () { homeMap.resize(); }, 100);
|
||||||
|
|
||||||
|
if (HOME_GPX_URLS.length > 0) {
|
||||||
|
Promise.all(HOME_GPX_URLS.map(function (url, idx) {
|
||||||
|
return fetch(url)
|
||||||
|
.then(function (r) { return r.text(); })
|
||||||
|
.then(function (text) {
|
||||||
|
var xml = new DOMParser().parseFromString(text, 'text/xml');
|
||||||
|
var geojson = toGeoJSON.gpx(xml);
|
||||||
|
var sid = 'home-gpx-' + idx;
|
||||||
|
homeMap.addSource(sid, { type: 'geojson', data: geojson });
|
||||||
|
homeMap.addLayer({
|
||||||
|
id: sid + '-line', type: 'line', source: sid,
|
||||||
|
layout: { 'line-join': 'round', 'line-cap': 'round' },
|
||||||
|
paint: { 'line-color': MapUtils.ACCENT, 'line-width': 2, 'line-opacity': 0.7 }
|
||||||
|
});
|
||||||
|
return MapUtils.extractTrackpoints(geojson);
|
||||||
|
})
|
||||||
|
.catch(function (err) { console.warn('GPX load failed:', url, err); return []; });
|
||||||
|
})).then(function (allTrackpoints) {
|
||||||
|
if (homeMap.getLayer('home-journey')) homeMap.removeLayer('home-journey');
|
||||||
|
if (homeMap.getSource('home-journey')) homeMap.removeSource('home-journey');
|
||||||
|
var valid = allTrackpoints.filter(function (tp) { return tp.length > 0; });
|
||||||
|
var segments = MapUtils.buildJourneySegments(HOME_ENTRIES, valid, 10);
|
||||||
|
MapUtils.addJourneySegments(homeMap, segments, 'home-journey');
|
||||||
|
});
|
||||||
|
}
|
||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
{% endif %}
|
{% endif %}
|
||||||
|
|
||||||
|
{% else %}
|
||||||
|
{# ════════════════════════════════════════════════ BETWEEN-TRIPS MODE (Task 3) #}
|
||||||
|
<p class="feed-empty" style="padding: 2rem;">Off season — highlights coming in Task 3.</p>
|
||||||
|
{% endif %}
|
||||||
|
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|||||||
Reference in New Issue
Block a user