337 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
			
		
		
	
	
			337 lines
		
	
	
		
			11 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
{% extends "base.html" %}
 | 
						|
 | 
						|
{% block title %}{{ trip.title }} ({{ display_date(trip.start) }}) - Edward Betts{% endblock %}
 | 
						|
 | 
						|
{% from "macros.html" import trip_link, display_datetime, display_date_no_year, display_date, conference_row, accommodation_row, flight_row, train_row with context %}
 | 
						|
 | 
						|
{% set row = { "flight": flight_row, "train": train_row } %}
 | 
						|
 | 
						|
{% macro next_and_previous() %}
 | 
						|
  <p>
 | 
						|
    {% if prev_trip %}
 | 
						|
      previous: {{ trip_link(prev_trip) }} ({{ (trip.start - prev_trip.end).days }} days)
 | 
						|
    {% endif %}
 | 
						|
    {% if next_trip %}
 | 
						|
      next: {{ trip_link(next_trip) }} ({{ (next_trip.start - trip.end).days }} days)
 | 
						|
    {% endif %}
 | 
						|
  </p>
 | 
						|
{% endmacro %}
 | 
						|
 | 
						|
{% block style %}
 | 
						|
 | 
						|
{% if coordinates %}
 | 
						|
 <link rel="stylesheet" href="{{ url_for("static", filename="leaflet/leaflet.css") }}">
 | 
						|
{% endif %}
 | 
						|
 | 
						|
{% set conference_column_count = 7 %}
 | 
						|
{% set accommodation_column_count = 7 %}
 | 
						|
{% set travel_column_count = 9 %}
 | 
						|
<style>
 | 
						|
.conferences {
 | 
						|
  display: grid;
 | 
						|
  grid-template-columns: repeat({{ conference_column_count }}, auto); /* 7 columns for each piece of information */
 | 
						|
  gap: 10px;
 | 
						|
  justify-content: start;
 | 
						|
}
 | 
						|
 | 
						|
.accommodation {
 | 
						|
  display: grid;
 | 
						|
  grid-template-columns: repeat({{ accommodation_column_count }}, auto);
 | 
						|
  gap: 10px;
 | 
						|
  justify-content: start;
 | 
						|
}
 | 
						|
 | 
						|
.travel {
 | 
						|
  display: grid;
 | 
						|
  grid-template-columns: repeat({{ travel_column_count }}, auto);
 | 
						|
  gap: 10px;
 | 
						|
  justify-content: start;
 | 
						|
}
 | 
						|
 | 
						|
.grid-item {
 | 
						|
  /* Additional styling for grid items can go here */
 | 
						|
}
 | 
						|
 | 
						|
.half-map {
 | 
						|
  height: 100vh;
 | 
						|
}
 | 
						|
 | 
						|
.full-window-map {
 | 
						|
  position: fixed; /* Make the map fixed position */
 | 
						|
  top: 56px;
 | 
						|
  left: 0;
 | 
						|
  right: 0;
 | 
						|
  bottom: 0;
 | 
						|
  z-index: 9999; /* Make sure it sits on top */
 | 
						|
}
 | 
						|
 | 
						|
#toggleMapSize {
 | 
						|
  position: fixed;  /* Fixed position */
 | 
						|
  top: 66px;        /* 10px from the top */
 | 
						|
  right: 10px;      /* 10px from the right */
 | 
						|
  z-index: 10000;   /* Higher than the map's z-index */
 | 
						|
}
 | 
						|
 | 
						|
</style>
 | 
						|
{% endblock %}
 | 
						|
 | 
						|
{% set end = trip.end %}
 | 
						|
{% set total_distance = trip.total_distance() %}
 | 
						|
{% set distances_by_transport_type = trip.distances_by_transport_type() %}
 | 
						|
 | 
						|
{% block content %}
 | 
						|
<div class="row">
 | 
						|
  <div class="col-md-6 col-sm-12">
 | 
						|
    <div class="m-3">
 | 
						|
    {{ next_and_previous() }}
 | 
						|
    <h1>{{ trip.title }}</h1>
 | 
						|
    <p class="lead">
 | 
						|
    {% if end %}
 | 
						|
      {{ display_date_no_year(trip.start) }} to {{ display_date_no_year(end) }}
 | 
						|
      ({{ (end - trip.start).days }} nights)
 | 
						|
    {% else %}
 | 
						|
      {{ display_date_no_year(trip.start) }} (end date missing)
 | 
						|
    {% endif %}
 | 
						|
    </p>
 | 
						|
 | 
						|
    <div class="mb-3">
 | 
						|
    {# <div>Countries: {{ trip.countries_str }}</div> #}
 | 
						|
    <div>Locations: {{ trip.locations_str }}</div>
 | 
						|
 | 
						|
    {% if total_distance %}
 | 
						|
      <div>Total distance:
 | 
						|
      {{ "{:,.0f} km / {:,.0f} miles".format(total_distance, total_distance / 1.60934) }}
 | 
						|
      </div>
 | 
						|
    {% endif %}
 | 
						|
 | 
						|
    {% if distances_by_transport_type %}
 | 
						|
      {% for transport_type, distance in distances_by_transport_type %}
 | 
						|
        <div>{{ transport_type | title }} distance:
 | 
						|
          {{ "{:,.0f} km / {:,.0f} miles".format(distance, distance / 1.60934) }}
 | 
						|
        </div>
 | 
						|
      {% endfor %}
 | 
						|
    {% endif %}
 | 
						|
 | 
						|
 | 
						|
    {% set delta = human_readable_delta(trip.start) %}
 | 
						|
    {% if delta %}
 | 
						|
      <div>How long until trip: {{ delta }}</div>
 | 
						|
    {% endif %}
 | 
						|
    </div>
 | 
						|
 | 
						|
    {% for item in trip.conferences %}
 | 
						|
      {% set country = get_country(item.country) if item.country else None %}
 | 
						|
      <div class="card my-1">
 | 
						|
        <div class="card-body">
 | 
						|
          <h5 class="card-title">
 | 
						|
            <a href="{{ item.url }}">{{ item.name }}</a>
 | 
						|
            <small class="text-muted">
 | 
						|
              {{ display_date_no_year(item.start) }} to {{ display_date_no_year(item.end) }}
 | 
						|
            </small>
 | 
						|
          </h5>
 | 
						|
          <p class="card-text">
 | 
						|
            <strong>Topic:</strong> {{ item.topic }}
 | 
						|
            <strong>Venue:</strong> {{ item.venue }}
 | 
						|
            <strong>Location:</strong>  {{ item.location }}
 | 
						|
            {% if country %}
 | 
						|
              {{ country.flag }}
 | 
						|
            {% elif item.online %}
 | 
						|
              💻 Online
 | 
						|
            {% else %}
 | 
						|
              <span class="text-bg-danger p-2">
 | 
						|
                country code <strong>{{ item.country }}</strong> not found
 | 
						|
              </span>
 | 
						|
            {% endif %}
 | 
						|
            {% if item.free %}
 | 
						|
              <span class="badge bg-success text-nowrap">free to attend</span>
 | 
						|
            {% elif item.price and item.currency %}
 | 
						|
              <span class="badge bg-info text-nowrap">price: {{ item.price }} {{ item.currency }}</span>
 | 
						|
            {% endif %}
 | 
						|
          </p>
 | 
						|
        </div>
 | 
						|
      </div>
 | 
						|
    {% endfor %}
 | 
						|
 | 
						|
    {% for item in trip.accommodation %}
 | 
						|
      {% set country = get_country(item.country) if item.country else None %}
 | 
						|
      {% set nights = (item.to.date() - item.from.date()).days %}
 | 
						|
      <div class="card my-1">
 | 
						|
        <div class="card-body">
 | 
						|
          <h5 class="card-title">
 | 
						|
            {% if item.operator %}{{ item.operator }}: {% endif %}
 | 
						|
            <a href="{{ item.url }}">{{ item.name }}</a>
 | 
						|
            <small class="text-muted">
 | 
						|
              {{ display_date_no_year(item.from) }} to {{ display_date_no_year(item.to) }}
 | 
						|
              ({% if nights == 1 %}1 night{% else %}{{ nights }} nights{% endif %})
 | 
						|
            </small>
 | 
						|
          </h5>
 | 
						|
          <p class="card-text">
 | 
						|
            <strong>Address:</strong> {{ item.address }}
 | 
						|
            <strong>Location:</strong> {{ item.location }}
 | 
						|
            {% if country %}
 | 
						|
              {{ country.flag }}
 | 
						|
            {% else %}
 | 
						|
              <span class="text-bg-danger p-2">
 | 
						|
                country code <strong>{{ item.country }}</strong> not found
 | 
						|
              </span>
 | 
						|
            {% endif %}
 | 
						|
            {% if g.user.is_authenticated and item.price and item.currency %}
 | 
						|
              <span class="badge bg-info text-nowrap">price: {{ item.price }} {{ item.currency }}</span>
 | 
						|
            {% endif %}
 | 
						|
          </p>
 | 
						|
        </div>
 | 
						|
      </div>
 | 
						|
    {% endfor %}
 | 
						|
 | 
						|
    {% if trip.flight_bookings %}
 | 
						|
    <h3>Flight bookings</h3>
 | 
						|
    {% for item in trip.flight_bookings %}
 | 
						|
      <div>
 | 
						|
        {{ item.flights | map(attribute="airline_name") | unique | join(" + ") }}
 | 
						|
        {% if g.user.is_authenticated and item.booking_reference %}
 | 
						|
          <strong>booking reference:</strong> {{ item.booking_reference }}
 | 
						|
        {% endif %}
 | 
						|
        {% if g.user.is_authenticated and item.price and item.currency %}
 | 
						|
          <span class="badge bg-info text-nowrap">price: {{ item.price }} {{ item.currency }}</span>
 | 
						|
        {% endif %}
 | 
						|
      </div>
 | 
						|
    {% endfor %}
 | 
						|
    {% endif %}
 | 
						|
 | 
						|
    {% for item in trip.events %}
 | 
						|
      {% set country = get_country(item.country) if item.country else None %}
 | 
						|
      <div class="card my-1">
 | 
						|
        <div class="card-body">
 | 
						|
          <h5 class="card-title">
 | 
						|
            <a href="{{ item.url }}">{{ item.title }}</a>
 | 
						|
            <small class="text-muted">{{ display_date_no_year(item.date) }}</small>
 | 
						|
          </h5>
 | 
						|
          <p class="card-text">
 | 
						|
            Address: {{ item.address }}
 | 
						|
            | Location: {{ item.location }}
 | 
						|
            {% if country %}
 | 
						|
              {{ country.flag }}
 | 
						|
            {% else %}
 | 
						|
              <span class="text-bg-danger p-2">
 | 
						|
                country code <strong>{{ item.country }}</strong> not found
 | 
						|
              </span>
 | 
						|
            {% endif %}
 | 
						|
            {% if g.user.is_authenticated and item.price and item.currency %}
 | 
						|
              | <span class="badge bg-info text-nowrap">price: {{ item.price }} {{ item.currency }}</span>
 | 
						|
            {% endif %}
 | 
						|
          </p>
 | 
						|
        </div>
 | 
						|
      </div>
 | 
						|
    {% endfor %}
 | 
						|
 | 
						|
    {% for item in trip.travel %}
 | 
						|
      <div class="card my-1">
 | 
						|
        <div class="card-body">
 | 
						|
          <h5 class="card-title">
 | 
						|
            {% if item.type == "flight" %}
 | 
						|
              ✈️
 | 
						|
              {{ item.from_airport.name }} ({{ item.from_airport.iata}})
 | 
						|
              →
 | 
						|
              {{ item.to_airport.name }} ({{item.to_airport.iata}})
 | 
						|
            {% elif item.type == "train" %}
 | 
						|
              🚆
 | 
						|
              {{ item.from }}
 | 
						|
              →
 | 
						|
              {{ item.to }}
 | 
						|
            {% endif %}
 | 
						|
          </h5>
 | 
						|
          <p class="card-text">
 | 
						|
            {% if item.type == "flight" %}
 | 
						|
              <div>
 | 
						|
                <span>{{ item.airline_name }} ({{ item.airline }})</span>
 | 
						|
                ✨
 | 
						|
                {{ display_datetime(item.depart) }}
 | 
						|
                {% if item.arrive %}
 | 
						|
                →
 | 
						|
                {{ item.arrive.strftime("%H:%M %z") }}
 | 
						|
                <span>🕒{{ ((item.arrive - item.depart).total_seconds() // 60) | int }} mins</span>
 | 
						|
                {% endif %}
 | 
						|
                ✨
 | 
						|
                <span>{{ item.airline }}{{ item.flight_number }}</span>
 | 
						|
 | 
						|
                {% if item.distance %}
 | 
						|
                  <span>
 | 
						|
                    🌍distance:
 | 
						|
                    {{ "{:,.0f} km / {:,.0f} miles".format(item.distance, item.distance / 1.60934) }}
 | 
						|
                  </span>
 | 
						|
                {% endif %}
 | 
						|
 | 
						|
 | 
						|
              </div>
 | 
						|
            {% elif item.type == "train" %}
 | 
						|
              <div>
 | 
						|
                {{ display_datetime(item.depart) }}
 | 
						|
                →
 | 
						|
                {{ item.arrive.strftime("%H:%M %z") }}
 | 
						|
                {% if item.class %}
 | 
						|
                  <span class="badge bg-info text-nowrap">{{ item.class }}</span>
 | 
						|
                {% endif %}
 | 
						|
                <span>🕒{{ ((item.arrive - item.depart).total_seconds() // 60) | int }} mins</span>
 | 
						|
                {% if item.distance %}
 | 
						|
                  <span>
 | 
						|
                    🛤️
 | 
						|
                    {{ "{:,.0f} km / {:,.0f} miles".format(item.distance, item.distance / 1.60934) }}
 | 
						|
                  </span>
 | 
						|
                {% endif %}
 | 
						|
              </div>
 | 
						|
            {% endif %}
 | 
						|
          </p>
 | 
						|
        </div>
 | 
						|
      </div>
 | 
						|
    {% endfor %}
 | 
						|
 | 
						|
    <div class="mt-3">
 | 
						|
    <h4>Holidays</h4>
 | 
						|
    {% if holidays %}
 | 
						|
      <table class="table table-hover w-auto">
 | 
						|
      {% for item in holidays %}
 | 
						|
        {% set country = get_country(item.country) %}
 | 
						|
        <tr>
 | 
						|
          {% if loop.first or item.date != loop.previtem.date %}
 | 
						|
            <td class="text-end">{{ display_date(item.date) }}</td>
 | 
						|
          {% else %}
 | 
						|
            <td></td>
 | 
						|
          {% endif %}
 | 
						|
          <td>{{ country.flag }} {{ country.name }}</td>
 | 
						|
          <td>{{ item.display_name }}</td>
 | 
						|
        </tr>
 | 
						|
      {% endfor %}
 | 
						|
      </table>
 | 
						|
    {% else %}
 | 
						|
      <p>No public holidays during trip.</p>
 | 
						|
    {% endif %}
 | 
						|
    </div>
 | 
						|
 | 
						|
    {{ next_and_previous() }}
 | 
						|
 | 
						|
    </div>
 | 
						|
  </div>
 | 
						|
  <div class="col-md-6 col-sm-12">
 | 
						|
    <button id="toggleMapSize" class="btn btn-primary mb-2">Toggle map size</button>
 | 
						|
    <div id="map" class="half-map">
 | 
						|
    </div>
 | 
						|
  </div>
 | 
						|
</div>
 | 
						|
{% endblock %}
 | 
						|
 | 
						|
{% block scripts %}
 | 
						|
 | 
						|
<script src="{{ url_for("static", filename="leaflet/leaflet.js") }}"></script>
 | 
						|
<script src="{{ url_for("static", filename="leaflet-geodesic/leaflet.geodesic.umd.min.js") }}"></script>
 | 
						|
 | 
						|
<script src="{{ url_for("static", filename="js/map.js") }}"></script>
 | 
						|
 | 
						|
<script>
 | 
						|
var coordinates = {{ coordinates | tojson }};
 | 
						|
var routes = {{ routes | tojson }};
 | 
						|
 | 
						|
build_map("map", coordinates, routes);
 | 
						|
 | 
						|
</script>
 | 
						|
{% endblock %}
 |