<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Agenda - Edward Betts</title> <link href="{{ url_for("static", filename="bootstrap5/css/bootstrap.min.css") }}" rel="stylesheet"> <link rel="icon" href="data:image/svg+xml,<svg xmlns=%22http://www.w3.org/2000/svg%22 viewBox=%220 0 100 100%22><text y=%22.9em%22 font-size=%2290%22>📅</text></svg>"> <script async src="{{ url_for("static", filename="es-module-shims/es-module-shims.js") }}"></script> <script type='importmap'> { "imports": { "@fullcalendar/core": "https://cdn.skypack.dev/@fullcalendar/core@6.1.9", "@fullcalendar/daygrid": "https://cdn.skypack.dev/@fullcalendar/daygrid@6.1.9", "@fullcalendar/timegrid": "https://cdn.skypack.dev/@fullcalendar/timegrid@6.1.9", "@fullcalendar/list": "https://cdn.skypack.dev/@fullcalendar/list@6.1.9", "@fullcalendar/core/locales/en-gb": "https://cdn.skypack.dev/@fullcalendar/core@6.1.9/locales/en-gb" } } </script> <script type='module'> import { Calendar } from '@fullcalendar/core' import dayGridPlugin from '@fullcalendar/daygrid' import timeGridPlugin from '@fullcalendar/timegrid' import listPlugin from '@fullcalendar/list' import gbLocale from '@fullcalendar/core/locales/en-gb'; // Function to save the current view to local storage function saveView(view) { localStorage.setItem('fullCalendarDefaultView', view); } // Function to get the saved view from local storage function getSavedView() { return localStorage.getItem('fullCalendarDefaultView') || 'dayGridMonth'; } document.addEventListener('DOMContentLoaded', function() { const calendarEl = document.getElementById('calendar') const calendar = new Calendar(calendarEl, { locale: gbLocale, plugins: [dayGridPlugin, timeGridPlugin, listPlugin ], themeSystem: 'bootstrap5', firstDay: 1, initialView: getSavedView(), viewDidMount: function(info) { saveView(info.view.type); }, headerToolbar: { left: 'prev,next today', center: 'title', right: 'dayGridMonth,timeGridWeek,timeGridDay,listWeek' }, nowIndicator: true, weekNumbers: true, eventTimeFormat: { hour: '2-digit', minute: '2-digit', hour12: false, }, events: {{ fullcalendar_events | tojson(indent=2) }}, eventDidMount: function(info) { info.el.title = info.event.title; }, }) calendar.render() }) </script> </head> {% set event_labels = { "economist": "📰 The Economist", "mothers_day": "Mothers' day", "fathers_day": "Fathers' day", "uk_financial_year_end": "End of financial year", "bank_holiday": "UK bank holiday", "us_holiday": "US holiday", "uk_clock_change": "UK clock change", "us_clock_change": "US clock change", "us_presidential_election": "US pres. election", "xmas_last_second": "Christmas last posting 2nd class", "xmas_last_first": "Christmas last posting 1st class", "up_series": "Up documentary", "waste_schedule": "Waste schedule", "gwr_advance_tickets": "GWR advance tickets", "critical_mass": "Critical Mass", } %} {%set class_map = { "bank_holiday": "bg-success-subtle", "conference": "bg-primary-subtle", "us_holiday": "bg-secondary-subtle", "birthday": "bg-info-subtle", "waste_schedule": "bg-danger-subtle", } %} {% from "navbar.html" import navbar with context %} <body> {{ navbar() }} <div class="container-fluid mt-2"> <h1>Agenda</h1> <p> <a href="/tools">← personal tools</a> </p> <ul> <li>Today is {{now.strftime("%A, %-d %b %Y")}}</li> {% if gbpusd %} <li>GBPUSD: {{"{:,.3f}".format(gbpusd)}}</li> {% endif %} <li>GWR advance ticket furthest date: {% if gwr_advance_tickets %} {{ gwr_advance_tickets.strftime("%A, %-d %b %Y") }} {% else %} unknown {% endif %} </li> <li>Bristol Sunrise: {{ sunrise.strftime("%H:%M:%S") }} / Sunset: {{ sunset.strftime("%H:%M:%S") }}</li> </ul> {% if errors %} {% for error in errors %} <div class="alert alert-danger" role="alert"> Error: {{ error }} </div> {% endfor %} {% endif %} <h3>Stock markets</h3> {% for market in stock_markets %} <p>{{ market }}</p> {% endfor %} <div class="mb-3" id="calendar"></div> <h3>Agenda</h3> {% for event in events if event.as_date >= two_weeks_ago %} {% if loop.first or event.date.year != loop.previtem.date.year or event.date.month != loop.previtem.date.month %} <div class="row mt-2"> <div class="col"> <h4>{{ event.date.strftime("%B %Y") }}</h4> </div> </div> {% endif %} {% set delta = event.delta_days(today) %} {% if event.name == "today" %} <div class="row"> <div class="col bg-warning-subtle"> <h3>today</h3> </div> </div> {% else %} {% set cell_bg = " bg-warning-subtle" if delta == "today" else "" %} <div class="row border border-1 {% if event.name in class_map %} {{ class_map[event.name]}}{% else %}{{ cell_bg }}{% endif %}"> <div class="col-md-2{{ cell_bg }}"> {{event.as_date.strftime("%a, %d, %b")}} {{event.display_time or ""}} {{event.display_timezone or ""}} </div> <div class="col-md-2{{ cell_bg }}"> {% if event.end_date %} {% if event.end_as_date == event.as_date and event.has_time %} end: {{event.end_date.strftime("%H:%M") }} (duration: {{event.end_date - event.date}}) {% elif event.end_date != event.date %} {{event.end_date}} {% endif %} {% endif %} </div> <div class="col-md-7 text-start"> {% if event.url %}<a href="{{ event.url }}">{% endif %} {{ event_labels.get(event.name) or event.name }} {%- if event.title -%}: {{ event.title_with_emoji }}{% endif %} {% if event.url %}</a>{% endif %} </div> <div class="col-md-1{{ cell_bg }}"> {{ delta }} </div> </div> {% endif %} {% endfor %} <div class="mt-2"> <h5>Page generation time</h5> <ul> <li>Data gather took {{ "%.1f" | format(data_gather_seconds) }} seconds</li> <li>Stock market open/close took {{ "%.1f" | format(stock_market_times_seconds) }} seconds</li> {% for name, seconds in timings %} <li>{{ name }} took {{ "%.1f" | format(seconds) }} seconds</li> {% endfor %} </ul> </div> </div> <script src="{{ url_for("static", filename="bootstrap5/js/bootstrap.bundle.min.js") }}"></script> </body> </html>