* feat: agenda page in vue (wip) * feat: scroll to agenda day * fix: vue 3 composition api + eslint settings * fix: agenda day scroll match indicator * fix: convert vite deps to yarn * fix: missing lodash + legacy build step * fix: agenda - move calendar into drawer * fix: improve agenda filter UI * fix: download ics + move agenda into own component * feat: use fullcalendar for agenda calendar view (wip) * feat: add events to agenda calendar * feat: agenda filter UI improvements * feat: agenda add to calendar dropdown * feat: agenda calendar filter + timezone + event coloring * feat: agenda calendar color improvements * chore: exclude dist-neue from git * feat: agenda calendar event modal * fix: rebuild yarn deps * chore: add run migration task to vscode * fix: agenda buttons display flag * feat: agenda event modal component * feat: show calendar event quick info on hover * fix: clear calendar quick info on timezone change * feat: agenda list view improvements * feat: agenda list row coloring * feat: agenda list note * feat: agenda list icons for office hours + hackathon * fix: agenda top links * refactor: use pinia as store for agenda components * feat: agenda jump to now * fix: agenda mobile improvements * feat: agenda search * feat: agenda search improvements * feat: agenda event recordings buttons for post-meeting * fix: agenda switch to meeting timezone on load * feat: agenda pre & live session buttons * fix: remove agenda utc + personalize links in top menu * feat: add pre-vue loading state on page load * feat: filter from agenda picker mode * fix: agenda UI improvements * fix: django-vite non-dev mode * chore: update yarn dependencies for vue + vite * feat: agenda settings panel + UI improvements * feat: agenda settings colors + import/export feature * feat: agenda color assignments + responsive UI improvements * feat: agenda realtime red line + debug datetime offset * feat: agenda add aria labels for settings * feat: add new agenda path + pages/menu * fix: bring base/menu.html up to main * fix: agenda various fixes * test: add new agenda item to meetings menu for item count * chore: restore devcontainer extensions list * fix: agenda UI improvements + montserrat default font * feat: agenda bolder text + hide event icons options * feat: agenda warning badge * fix: agenda various UI improvements + intersectionObserver fix * feat: agenda floorplan page + various UI improvements * feat: agenda floor plan pin * feat: view floor plan room from agenda * feat: agenda floor plan mobile optimization * feat: adjust calendar options + default calendar view in settings * feat: agenda persist picked events + change base font only on new agenda page * feat: agenda mobile view optimizations * fix: add .vite to cached volumes * fix: mobile view for filters, calendar, settings panels * test: upgrade cypress existing tests to work on bs5 + update dependencies * fix: use named url patterns to avoid hardcoded URLs. Add rudimentary test coverage for the neue views. Co-authored-by: Robert Sparks <rjsparks@nostrum.com>
533 lines
26 KiB
HTML
533 lines
26 KiB
HTML
{% extends "base.html" %}
|
|
{# Copyright The IETF Trust 2015-2021, All Rights Reserved #}
|
|
{% load origin %}
|
|
{% load static %}
|
|
{% load ietf_filters %}
|
|
{% load textfilters %}
|
|
{% load htmlfilters agenda_custom_tags %}
|
|
{% block title %}
|
|
IETF {{ schedule.meeting.number }} Meeting Agenda
|
|
{% if "-utc" in request.path %}(UTC){% endif %}
|
|
{% if personalize %}Personalization{% endif %}
|
|
{% endblock %}
|
|
{% block pagehead %}
|
|
<link rel="stylesheet" href="{% static "ietf/css/list.css" %}">
|
|
{% endblock %}
|
|
{% block morecss %}#weekview iframe { height: 25em; }{% endblock %}
|
|
{% block precontent %}
|
|
<div class="meeting-switch">
|
|
<i class="bi bi-arrow-left-right me-2"></i>
|
|
<a href="{% url 'agenda-neue' num=schedule.meeting.number %}">Switch to New Agenda Display</a>
|
|
</div>
|
|
{% endblock %}
|
|
{% block content %}
|
|
{% origin %}
|
|
{% if "-utc" in request.path %}
|
|
{% include "meeting/meeting_heading.html" with meeting=schedule.meeting updated=updated selected="agenda-utc" title_extra="(UTC)" %}
|
|
{% elif personalize %}
|
|
{% include "meeting/meeting_heading.html" with meeting=schedule.meeting updated=updated selected="select-sessions" title_extra="" %}
|
|
{% else %}
|
|
{% include "meeting/meeting_heading.html" with meeting=schedule.meeting updated=updated selected="agenda" title_extra="" %}
|
|
{% endif %}
|
|
{# the contents of #extra-nav will be moved into the RH nav panel #}
|
|
<div id="extra-nav" class="d-none">
|
|
<div class="d-flex flex-column px-2">
|
|
{% if now.date <= schedule.meeting.end_date %}
|
|
<a class="btn btn-sm btn-primary my-3 now-link" href="#">Jump to current session</a>
|
|
{% endif %}
|
|
<div class="d-flex">
|
|
{% include 'meeting/tz-display.html' with id_suffix="-rh" meeting_timezone=timezone minimal=True only %}
|
|
</div>
|
|
<div class="small text-muted">
|
|
Showing <span class="current-tz">{{ timezone|split:"_"|join:" "|split:"/"|join:" / " }}</span> time
|
|
</div>
|
|
</div>
|
|
</div>
|
|
{# cache this part -- it takes 3-6 seconds to generate #}
|
|
{% load cache %}
|
|
{% cache cache_time ietf_meeting_agenda_utc schedule.meeting.number request.path %}
|
|
<h2>
|
|
{% if personalize %}
|
|
Session selection
|
|
{% else %}
|
|
Agenda
|
|
{% endif %}
|
|
</h2>
|
|
{% if is_current_meeting %}
|
|
<p class="alert alert-info my-3">
|
|
<b>Note:</b> IETF agendas are subject to change, up to and during a meeting.
|
|
</p>
|
|
{% endif %}
|
|
{% if schedule.meeting.agenda_info_note %}
|
|
<p class="alert alert-info my-3">
|
|
{{ schedule.meeting.agenda_info_note|removetags:"h1"|safe }}
|
|
</p>
|
|
{% endif %}
|
|
{% include 'meeting/tz-display.html' with id_suffix="" meeting_timezone=timezone only %}
|
|
{% include "meeting/agenda_filter.html" with filter_categories=filter_categories customize_button_text="Filter this agenda view..." always_show=personalize %}
|
|
{% include "meeting/agenda_personalize_buttonlist.html" with meeting=schedule.meeting personalize=personalize only %}
|
|
<div class="input-group mb-3">
|
|
<button class="btn btn-outline-primary dropdown-toggle"
|
|
type="button"
|
|
data-bs-toggle="dropdown"
|
|
aria-expanded="false"
|
|
{% if filter_categories|length < 3 %}disabled{% endif %}>
|
|
Download area agenda
|
|
</button>
|
|
<ul class="dropdown-menu">
|
|
{% for fc in filter_categories %}
|
|
{% if not forloop.last %}
|
|
{# skip the last group, it's the office hours/misc #}
|
|
{% for p in fc|dictsort:"label" %}
|
|
<li>
|
|
<a class="dropdown-item"
|
|
href="{% url "ietf.meeting.views.agenda_ical" num=schedule.meeting.number %}?show={{ p.keyword }}">
|
|
{{ p.label }}
|
|
</a>
|
|
</li>
|
|
{% endfor %}
|
|
{% endif %}
|
|
{% endfor %}
|
|
</ul>
|
|
<a class="btn btn-outline-primary {% if non_area_keywords|length == 0 %}disabled{% endif %}"
|
|
href="{% if non_area_keywords %}{% url 'ietf.meeting.views.agenda_ical' num=schedule.meeting.number %}?show={{ non_area_keywords|join:',' }}{% else %}#{% endif %}">
|
|
Download non-area events
|
|
</a>
|
|
</div>
|
|
<div id="weekview" class="d-none mt-3">
|
|
<h2>
|
|
Schedule
|
|
{% if schedule.meeting.agenda_warning_note %}
|
|
<span class="badge rounded-pill bg-danger">
|
|
{{ schedule.meeting.agenda_warning_note|removetags:"h1" |safe }}
|
|
</span>
|
|
{% endif %}
|
|
</h2>
|
|
<iframe title="Schedule" class="w-100 overflow-hidden border border-dark"></iframe>
|
|
</div>
|
|
<h2 class="mt-3">
|
|
{% if personalize %}Personalize{% endif %}
|
|
Detailed Agenda
|
|
{% if schedule.meeting.agenda_warning_note %}
|
|
<span class="badge rounded-pill bg-danger">
|
|
{{ schedule.meeting.agenda_warning_note|removetags:"h1" |safe }}
|
|
</span>
|
|
{% endif %}
|
|
</h2>
|
|
{% if personalize %}
|
|
<p>
|
|
Check boxes below to select individual sessions.
|
|
</p>
|
|
{% endif %}
|
|
<table id="agenda-table" class="table table-sm tablesorter">
|
|
<thead>
|
|
<tr>
|
|
{% if personalize %}<th scope="col"></th>{% endif %}
|
|
<th scope="col"></th>
|
|
<th scope="col" data-sort="loc"></th>
|
|
<th scope="col" data-sort="group"></th>
|
|
<th scope="col" data-sort="area"></th>
|
|
<th scope="col" data-sort="desc"></th>
|
|
</tr>
|
|
</thead>
|
|
<tbody>
|
|
{% for item in filtered_assignments %}
|
|
{% ifchanged item.timeslot.time|date:"Y-m-d" %}
|
|
<tr class="table-primary show-with-children">
|
|
<th scope="col" colspan="{% if personalize %}6{% else %}5{% endif %}"
|
|
id="slot-{{ item.timeslot.time|slugify }}"
|
|
class="nav-heading">
|
|
{{ item.timeslot.time|date:"l, F j, Y" }}
|
|
</th>
|
|
</tr>
|
|
{% endifchanged %}
|
|
{% if item|is_special_agenda_item %}
|
|
<tr id="row-{{ item.slug }}"
|
|
data-filter-keywords="{{ item.filter_keywords|join:',' }}"
|
|
data-slot-start-ts="{{ item.start_timestamp }}"
|
|
data-slot-end-ts="{{ item.end_timestamp }}">
|
|
{% if personalize %}
|
|
<td class="text-center">
|
|
{% if item.session_keyword %}
|
|
<label class="d-none"
|
|
aria-label="Select session"
|
|
for="{{ item.session_keyword }}-{{ item.slug }}">
|
|
</label>
|
|
<input type="checkbox"
|
|
class="pickview form-check-input"
|
|
title="Select session"
|
|
name="selected-sessions"
|
|
id="{{ item.session_keyword }}-{{ item.slug }}"
|
|
value="{{ item.session_keyword }}"
|
|
data-filter-keywords="{{ item.filter_keywords|join:',' }}"
|
|
data-filter-item="{{ item.session_keyword }}">
|
|
{% endif %}
|
|
</td>
|
|
{% endif %}
|
|
<td class="text-end">{% include "meeting/timeslot_start_end.html" %}</td>
|
|
<td colspan="3">
|
|
{% if item.timeslot.show_location and item.timeslot.location %}
|
|
{% location_anchor item.timeslot %}
|
|
{{ item.timeslot.get_html_location }}
|
|
{% end_location_anchor %}
|
|
{% endif %}
|
|
{% if item.timeslot.show_location and item.timeslot.get_html_location %}
|
|
{% with item.timeslot.location.floorplan as floor %}
|
|
{% if item.timeslot.location.floorplan %}
|
|
<div class="d-none d-sm-block float-end">
|
|
<a href="{% url 'ietf.meeting.views.floor_plan' num=schedule.meeting.number %}#floor-{{ floor.name|xslugify }}"
|
|
class="float-end"
|
|
title="{{ floor.name }}">
|
|
<span class="badge rounded-pill bg-secondary">{{ floor.short }}</span>
|
|
</a>
|
|
</div>
|
|
{% endif %}
|
|
{% endwith %}
|
|
{% endif %}
|
|
</td>
|
|
<td>
|
|
{% agenda_anchor item.session %}
|
|
{% assignment_display_name item %}
|
|
{% end_agenda_anchor %}
|
|
{% if item.session.current_status == 'canceled' %}
|
|
<span class="badge rounded-pill bg-danger float-end">CANCELLED</span>
|
|
{% else %}
|
|
{% if item.slot_type.slug == 'other' %}
|
|
{% if item.session.agenda or item.session.remote_instructions or item.session.agenda_note %}
|
|
<div class="float-end ps-2">
|
|
{% include "meeting/session_buttons_include.html" with show_agenda=True item=item schedule=schedule %}
|
|
</div>
|
|
{% else %}
|
|
<div>
|
|
{% for slide in item.session.slides %}
|
|
<a href="{{ slide.get_href }}">{{ slide.title|clean_whitespace }}</a>
|
|
<br>
|
|
{% endfor %}
|
|
</div>
|
|
{% endif %}
|
|
{% endif %}
|
|
{% endif %}
|
|
</td>
|
|
</tr>
|
|
{% elif item|is_regular_agenda_item or item|is_plenary_agenda_item %}
|
|
{% if item|is_regular_agenda_item %}
|
|
{% ifchanged %}
|
|
<tr class="table-secondary session-label-row show-with-children"
|
|
data-slot-start-ts="{{ item.start_timestamp }}"
|
|
data-slot-end-ts="{{ item.end_timestamp }}">
|
|
{% if personalize %}<th scope="row" class="text-center"></th>{% endif %}
|
|
<th scope="row" class="text-end">{% include "meeting/timeslot_start_end.html" %}</th>
|
|
<th scope="row" colspan="4">
|
|
{{ item.timeslot.time|date:"l" }}
|
|
{{ item.timeslot.name|capfirst_allcaps }}
|
|
</th>
|
|
</tr>
|
|
{% endifchanged %}
|
|
{% endif %}
|
|
{% if item.session.historic_group %}
|
|
<tr id="row-{{ item.slug }}"
|
|
{% if item.slot_type.slug == 'plenary' %}class="{{ item.slot_type.slug }}danger"{% endif %}
|
|
data-filter-keywords="{{ item.filter_keywords|join:',' }}"
|
|
data-slot-start-ts="{{ item.start_timestamp }}"
|
|
data-slot-end-ts="{{ item.end_timestamp }}">
|
|
{% if personalize %}
|
|
<td class="text-center">
|
|
{% if item.session_keyword %}
|
|
<label class="d-none"
|
|
aria-label="Select session"
|
|
for="{{ item.session_keyword }}">
|
|
</label>
|
|
<input type="checkbox"
|
|
class="pickview form-check-input"
|
|
title="Select session"
|
|
name="selected-sessions"
|
|
id="{{ item.session_keyword }}"
|
|
value="{{ item.session_keyword }}"
|
|
data-filter-keywords="{{ item.filter_keywords|join:',' }}"
|
|
data-filter-item="{{ item.session_keyword }}">
|
|
{% endif %}
|
|
</td>
|
|
{% endif %}
|
|
{% if item.slot_type.slug == 'plenary' %}
|
|
<td class="text-end">{% include "meeting/timeslot_start_end.html" %}</td>
|
|
<td colspan="3">
|
|
{% if item.timeslot.show_location and item.timeslot.location %}
|
|
{% location_anchor item.timeslot %}
|
|
{{ item.timeslot.get_html_location }}
|
|
{% end_location_anchor %}
|
|
{% endif %}
|
|
</td>
|
|
{% else %}
|
|
<td>
|
|
{% with item.timeslot.location.floorplan as floor %}
|
|
{% if item.timeslot.location.floorplan %}
|
|
<div class="d-none d-sm-block">
|
|
<a href="{% url 'ietf.meeting.views.floor_plan' num=schedule.meeting.number %}#floor-{{ floor.name|xslugify }}"
|
|
class="float-end"
|
|
title="{{ floor.name }}">
|
|
<span class="badge rounded-pill bg-secondary">{{ floor.short }}</span>
|
|
</a>
|
|
</div>
|
|
{% endif %}
|
|
{% endwith %}
|
|
</td>
|
|
<td>
|
|
{% if item.timeslot.show_location and item.timeslot.location %}
|
|
{% location_anchor item.timeslot %}
|
|
{{ item.timeslot.get_html_location }}
|
|
{% end_location_anchor %}
|
|
{% endif %}
|
|
</td>
|
|
<td>
|
|
{% if item.session.historic_group.historic_parent.acronym %}
|
|
<div class="d-none d-sm-block">{{ item.session.historic_group.historic_parent.acronym }}</div>
|
|
{% endif %}
|
|
</td>
|
|
<td>
|
|
<div class="d-none d-sm-block">
|
|
{% if item.session.historic_group %}
|
|
<a href="{% url 'ietf.group.views.group_about' acronym=item.session.historic_group.acronym %}">
|
|
{{ item.session.historic_group.acronym }}
|
|
</a>
|
|
{% else %}
|
|
{{ item.session.historic_group.acronym }}
|
|
{% endif %}
|
|
</div>
|
|
</td>
|
|
{% endif %}
|
|
<td>
|
|
{% if item.session.current_status == 'canceled' %}
|
|
<span class="badge rounded-pill bg-danger float-end">Cancelled</span>
|
|
{% else %}
|
|
<div class="float-end ps-2">
|
|
{% include "meeting/session_buttons_include.html" with show_agenda=True session=item.session meeting=schedule.meeting %}
|
|
</div>
|
|
{% endif %}
|
|
<div class="d-sm-none">
|
|
{% if item.session.historic_group %}
|
|
<a href="{% url 'ietf.group.views.group_about' acronym=item.session.historic_group.acronym %}">
|
|
{{ item.session.historic_group.acronym }}</a>
|
|
{% else %}
|
|
{{ item.session.historic_group.acronym }}
|
|
{% endif %}
|
|
{% if item.session.historic_group.historic_parent.acronym %}
|
|
<span class="text-muted">{{ item.session.historic_group.historic_parent.acronym }}</span>
|
|
{% endif %}
|
|
</div>
|
|
|
|
{% agenda_anchor item.session %}
|
|
{% assignment_display_name item %}
|
|
{% end_agenda_anchor %}
|
|
{% if item.session.historic_group.state_id == "bof" %}
|
|
<span class="badge rounded-pill bg-success float-end">BOF</span>
|
|
{% endif %}
|
|
{% if item.session.current_status == 'resched' %}
|
|
<div class="badge rounded-pill bg-danger float-end">
|
|
Rescheduled
|
|
{% if item.session.rescheduled_to %}
|
|
TO
|
|
<div class="timetooltip reschedtimetooltip">
|
|
<div data-start-time="{{ item.session.rescheduled_to.utc_start_time|date:"U" }}"
|
|
data-end-time="{{ item.session.rescheduled_to.utc_end_time|date:"U" }}"
|
|
{% if item.timeslot.time|date:"l" != item.session.rescheduled_to.time|date:"l" %} data-weekday="1"{% endif %}>
|
|
{% if "-utc" in request.path %}
|
|
{{ item.session.rescheduled_to.utc_start_time|date:"l G:i"|upper }}-{{ item.session.rescheduled_to.utc_end_time|date:"G:i" }}
|
|
{% else %}
|
|
{{ item.session.rescheduled_to.time|date:"l G:i"|upper }}-{{ item.session.rescheduled_to.end_time|date:"G:i" }}
|
|
{% endif %}
|
|
</div>
|
|
</div>
|
|
{% endif %}
|
|
</div>
|
|
{% endif %}
|
|
{% if item.session.agenda_note|first_url|conference_url %}
|
|
<br>
|
|
<a href="{{ item.session.agenda_note|first_url }}">{{ item.session.agenda_note|slice:":23" }}
|
|
</a>
|
|
{% elif item.session.agenda_note %}
|
|
<br>
|
|
<span class="text-danger small">{{ item.session.agenda_note }}</span>
|
|
{% endif %}
|
|
</td>
|
|
</tr>
|
|
{% endif %}
|
|
{% endif %}
|
|
{% endfor %}
|
|
</tbody>
|
|
</table>
|
|
{% if personalize %}{# only show second copy of buttons for the personalize tab #}
|
|
{% include "meeting/agenda_personalize_buttonlist.html" with meeting=schedule.meeting personalize=personalize only %}
|
|
{% endif %}
|
|
{% endcache %}
|
|
{% endblock %}
|
|
{% block js %}
|
|
<script src="{% static 'ietf/js/agenda_filter.js' %}"></script>
|
|
<script>
|
|
// Update the agenda display with specified filters
|
|
function update_agenda_display(filter_params) {
|
|
var agenda_rows=$('[id^="row-"]')
|
|
|
|
if (!agenda_filter.filtering_is_enabled(filter_params)) {
|
|
// When filtering is not enabled, show all sessions
|
|
agenda_rows.show();
|
|
return;
|
|
}
|
|
|
|
// if groups were selected for filtering, hide all rows by default
|
|
agenda_rows.filter(function(index, row) {
|
|
return !!$(row).attr('data-filter-keywords');
|
|
}).hide();
|
|
|
|
// loop through the has items and change the UI element and row visibilities accordingly
|
|
$.each(filter_params.show, function (i, v) {
|
|
// this is a regular item by wg: when present, show these rows
|
|
agenda_filter.rows_matching_filter_keyword(agenda_rows, v).show();
|
|
});
|
|
$.each(filter_params.hide, function (i, v) {
|
|
// this is a "negative" item by wg: when present, hide these rows
|
|
agenda_filter.rows_matching_filter_keyword(agenda_rows, v).hide();
|
|
});
|
|
|
|
// Now hide any session label rows with no visible sessions. Identify
|
|
// by matching on start/end timestamps.
|
|
$('tr.session-label-row').each(function(i, e) {
|
|
var start_ts = $(e).attr('data-slot-start-ts');
|
|
var end_ts = $(e).attr('data-slot-end-ts');
|
|
var visible_rows = agenda_rows.filter(
|
|
'[data-slot-start-ts="' + start_ts + '"]' +
|
|
'[data-slot-end-ts="' + end_ts + '"]' +
|
|
':visible'
|
|
);
|
|
if (visible_rows.length > 0) {
|
|
$(e).show();
|
|
} else {
|
|
$(e).hide();
|
|
}
|
|
})
|
|
}
|
|
|
|
function update_ical_links(filter_params) {
|
|
$(".ical-link").toggleClass("d-none", !agenda_filter.filtering_is_enabled(filter_params));
|
|
}
|
|
|
|
function update_weekview(filter_params) {
|
|
var weekview = $("#weekview");
|
|
if (agenda_filter.filtering_is_enabled(filter_params)) {
|
|
weekview.removeClass("d-none");
|
|
} else {
|
|
weekview.addClass("d-none");
|
|
}
|
|
update_weekview_display();
|
|
}
|
|
|
|
function update_weekview_display() {
|
|
var weekview = $("#weekview");
|
|
if (!weekview.hasClass('d-none')) {
|
|
var queryparams = window.location.search;
|
|
if (queryparams) {
|
|
queryparams += '&tz=' + encodeURIComponent(ietf_timezone.get_current_tz().toLowerCase());
|
|
} else {
|
|
queryparams = '?tz=' + encodeURIComponent(ietf_timezone.get_current_tz().toLowerCase());
|
|
}
|
|
var new_url = 'week-view.html' + queryparams;
|
|
var wv_iframe = $(weekview).children('iframe');
|
|
var wv_window = wv_iframe.contentWindow;
|
|
if (wv_iframe.src && wv_window.location.hostname && wv_window.history && wv_window.history.replaceState) {
|
|
wv_window.history.replaceState({}, '', new_url);
|
|
wv_window.redraw_weekview();
|
|
} else {
|
|
// either have not yet loaded the iframe or we do not support history replacement
|
|
$(wv_iframe).attr("src", new_url);
|
|
}
|
|
}
|
|
}
|
|
|
|
function update_view(filter_params) {
|
|
update_agenda_display(filter_params);
|
|
update_weekview(filter_params)
|
|
update_ical_links(filter_params)
|
|
}
|
|
|
|
</script>
|
|
<script src="{% static 'ietf/js/list.js' %}">
|
|
</script>
|
|
<script src="{% static 'ietf/js/moment.js' %}">
|
|
</script>
|
|
<script src="{% static 'ietf/js/timezone.js' %}">
|
|
</script>
|
|
<script src="{% static 'ietf/js/agenda_materials.js' %}">
|
|
</script>
|
|
<script src="{% static 'ietf/js/agenda_timezone.js' %}">
|
|
</script>
|
|
{% if personalize %}
|
|
<script src="{% static 'ietf/js/agenda_personalize.js' %}">
|
|
</script>
|
|
{% endif %}
|
|
<script>
|
|
{% if settings.DEBUG and settings.DEBUG_AGENDA %}
|
|
speedup = +urlParam('speedup');
|
|
if (speedup < 1) {
|
|
speedup = 1;
|
|
}
|
|
start_time = moment().utc();
|
|
if (urlParam('date')) {
|
|
offset_time = moment.tz(decodeURIComponent(urlParam('date')), "UTC");
|
|
} else {
|
|
offset_time = start_time;
|
|
}
|
|
if (speedup > 1 || offset_time !== start_time) {
|
|
moment.now = function () {
|
|
return (+new Date() - start_time) * speedup + offset_time;
|
|
}
|
|
}
|
|
{% else %}
|
|
speedup = 1;
|
|
{% endif %}
|
|
|
|
|
|
$(document).ready(function() {
|
|
// Methods/variables here that are not in ietf_timezone or agenda_filter are from agenda_timezone.js
|
|
meeting_timezone = '{{ timezone }}';
|
|
|
|
// First, initialize_moments(). This must be done before calling any of the update methods.
|
|
// It does not need timezone info, so safe to call before initializing ietf_timezone.
|
|
initialize_moments(); // fills in moments in the agenda data
|
|
|
|
// Now set up callbacks related to ietf_timezone. This must happen before calling initialize().
|
|
// In particular, set_current_tz_cb() must be called before the update methods are called.
|
|
set_current_tz_cb(ietf_timezone.get_current_tz); // give agenda_timezone access to this method
|
|
ietf_timezone.set_tz_change_callback(function(newtz) {
|
|
update_times(newtz);
|
|
update_weekview_display();
|
|
}
|
|
);
|
|
|
|
// With callbacks in place, call ietf_timezone.initialize(). This will call the tz_change callback
|
|
// after setting things up.
|
|
{% if "-utc" in request.path %}
|
|
ietf_timezone.initialize('UTC');
|
|
{% else %}
|
|
ietf_timezone.initialize(meeting_timezone);
|
|
{% endif %}
|
|
|
|
// Now make other setup calls from agenda_timezone.js
|
|
add_tooltips();
|
|
init_timers(speedup);
|
|
|
|
// Finally, set up the agenda filter UI. This does not depend on the timezone.
|
|
{% if personalize %}
|
|
agenda_filter.set_update_callback(function (e) {
|
|
handleFilterParamUpdate(e);
|
|
});
|
|
|
|
document.getElementById('agenda-table')
|
|
.addEventListener('click', handleTableClick);
|
|
{% else %}
|
|
agenda_filter.set_update_callback(update_view);
|
|
{% endif %}
|
|
|
|
agenda_filter.enable();
|
|
}
|
|
);
|
|
</script>
|
|
{% endblock %} |