Note: Your request for a third session must be approved by an area director before
being submitted to agenda@ietf.org. Click "Submit" below to email an approval
@@ -30,6 +40,8 @@
diff --git a/ietf/settings.py b/ietf/settings.py
index 53614017c..75ec5bc89 100644
--- a/ietf/settings.py
+++ b/ietf/settings.py
@@ -959,8 +959,11 @@ INTERNET_DRAFT_DAYS_TO_EXPIRE = 185
FLOORPLAN_MEDIA_DIR = 'floor'
FLOORPLAN_DIR = os.path.join(MEDIA_ROOT, FLOORPLAN_MEDIA_DIR)
+FLOORPLAN_LEGACY_BASE_URL = 'https://tools.ietf.org/agenda/{meeting.number}/venue/'
+FLOORPLAN_LAST_LEGACY_MEETING = 95 # last meeting to use FLOORPLAN_LEGACY_BASE_URL
MEETING_USES_CODIMD_DATE = datetime.date(2020,7,6)
+MEETING_LEGACY_OFFICE_HOURS_END = 111 # last meeting to use legacy office hours representation
# Maximum dimensions to accept at all
MEETINGHOST_LOGO_MAX_UPLOAD_WIDTH = 400
diff --git a/ietf/static/ietf/css/ietf.css b/ietf/static/ietf/css/ietf.css
index 3f48b6d9b..02f8614e2 100644
--- a/ietf/static/ietf/css/ietf.css
+++ b/ietf/static/ietf/css/ietf.css
@@ -1545,6 +1545,43 @@ a.fc-event, .fc-event, .fc-content, .fc-title, .fc-event-container {
width: 10em;
}
+.timeslot-edit .tstable div.timeslot {
+ border: #000000 solid 1px;
+ border-radius: 0.5em;
+ padding: 0.5em;
+}
+
+.timeslot-edit .tstable .timeslot .ts-name {
+ overflow: hidden;
+}
+.timeslot-edit .tstable .timeslot .ts-type {
+ font-size: smaller;
+}
+
+.timeslot-edit .tstable .timeslot .timeslot-buttons {
+ float: right;
+}
+
+.timeslot-edit .tstable .timeslot.in-official-use {
+ background-color: #d9edf7;
+}
+
+.timeslot-edit .tstable .timeslot.in-unofficial-use {
+ background-color: #f8f8e0;
+}
+
+.timeslot-edit .tstable td.timeslot-collision {
+ background-color: #ffa0a0;
+}
+
+.timeslot-edit .tstable .tstype_unavail {
+ background-color:#666;
+}
+
+.timeslot-edit .official-use-warning {
+ color: #ff0000;
+}
+
.rightmarker, .leftmarker {
width: 3px;
padding-right: 0px !important;
diff --git a/ietf/static/ietf/js/meeting/session_details_form.js b/ietf/static/ietf/js/meeting/session_details_form.js
new file mode 100644
index 000000000..28907bf92
--- /dev/null
+++ b/ietf/static/ietf/js/meeting/session_details_form.js
@@ -0,0 +1,109 @@
+/* Copyright The IETF Trust 2021, All Rights Reserved
+ *
+ * JS support for the SessionDetailsForm
+ * */
+(function() {
+ 'use strict';
+
+ /* Find the id prefix for each widget. Individual elements have a _ suffix. */
+ function get_widget_ids(elements) {
+ const ids = new Set();
+ for (let ii=0; ii < elements.length; ii++) {
+ const parts = elements[ii].id.split('_');
+ parts.pop();
+ ids.add(parts.join('_'));
+ }
+ return ids;
+ }
+
+ /* Set the 'type' element to a type valid for the currently selected purpose, if possible */
+ function set_valid_type(type_elt, purpose, allowed_types) {
+ const valid_types = allowed_types[purpose] || [];
+ if (valid_types.indexOf(type_elt.value) === -1) {
+ type_elt.value = (valid_types.length > 0) ? valid_types[0] : '';
+ }
+ }
+
+ /* Hide any type options not allowed for the selected purpose */
+ function update_type_option_visibility(type_option_elts, purpose, allowed_types) {
+ const valid_types = allowed_types[purpose] || [];
+ for (const elt of type_option_elts) {
+ if (valid_types.indexOf(elt.value) === -1) {
+ elt.setAttribute('hidden', 'hidden');
+ } else {
+ elt.removeAttribute('hidden');
+ }
+ }
+ }
+
+ /* Update visibility of 'type' select so it is only shown when multiple options are available */
+ function update_widget_visibility(elt, purpose, allowed_types) {
+ const valid_types = allowed_types[purpose] || [];
+ if (valid_types.length > 1) {
+ elt.removeAttribute('hidden'); // make visible
+ } else {
+ elt.setAttribute('hidden', 'hidden'); // make invisible
+ }
+ }
+
+ /* Update the 'type' select to reflect a change in the selected purpose */
+ function update_type_element(type_elt, purpose, type_options, allowed_types) {
+ update_widget_visibility(type_elt, purpose, allowed_types);
+ update_type_option_visibility(type_options, purpose, allowed_types);
+ set_valid_type(type_elt, purpose, allowed_types);
+ }
+
+ function update_name_field_visibility(name_elt, purpose) {
+ const row = name_elt.closest('tr');
+ if (purpose === 'session') {
+ row.setAttribute('hidden', 'hidden');
+ } else {
+ row.removeAttribute('hidden');
+ }
+ }
+
+ /* Factory for event handler with a closure */
+ function purpose_change_handler(name_elt, type_elt, type_options, allowed_types) {
+ return function(event) {
+ const purpose = event.target.value;
+ update_name_field_visibility(name_elt, purpose);
+ update_type_element(type_elt, purpose, type_options, allowed_types);
+ };
+ }
+
+ function add_purpose_change_handler(form) {
+ const id_prefix = 'id_' + form.dataset.prefix;
+ const name_elt = document.getElementById(id_prefix + '-name');
+ const purpose_elt = document.getElementById(id_prefix + '-purpose');
+ const type_elt = document.getElementById(id_prefix + '-type');
+ const type_options = type_elt.getElementsByTagName('option');
+ const allowed_types = JSON.parse(type_elt.dataset.allowedOptions);
+
+ // update on future changes
+ purpose_elt.addEventListener(
+ 'change',
+ purpose_change_handler(name_elt, type_elt, type_options, allowed_types)
+ );
+
+ // update immediately
+ update_type_element(type_elt, purpose_elt.value, type_options, allowed_types);
+ update_name_field_visibility(name_elt, purpose_elt.value);
+
+ // hide the purpose selector if only one option
+ const purpose_options = purpose_elt.querySelectorAll('option:not([value=""])');
+ if (purpose_options.length < 2) {
+ purpose_elt.closest('tr').setAttribute('hidden', 'hidden');
+ }
+ }
+
+ /* Initialization */
+ function on_load() {
+ /* Find elements that are parts of the session details forms. This is an
+ * HTMLCollection that will update if the DOM changes, so ok to evaluate immediately. */
+ const forms = document.getElementsByClassName('session-details-form');
+ for (const form of forms) {
+ add_purpose_change_handler(form);
+ }
+ }
+ window.addEventListener('load', on_load, false);
+})();
\ No newline at end of file
diff --git a/ietf/templates/meeting/agenda.html b/ietf/templates/meeting/agenda.html
index 70f6fdbd8..8a74420c3 100644
--- a/ietf/templates/meeting/agenda.html
+++ b/ietf/templates/meeting/agenda.html
@@ -4,7 +4,7 @@
{% load static %}
{% load ietf_filters %}
{% load textfilters %}
-{% load htmlfilters %}
+{% load htmlfilters agenda_custom_tags%}
{% block title %}
IETF {{ schedule.meeting.number }} meeting agenda
@@ -143,119 +143,105 @@
{% endifchanged %}
- {% if item.timeslot.type_id == 'regular' %}
- {% ifchanged %}
-
- |
-
+ {% if item|is_special_agenda_item %}
+ |
+ |
+
{% include "meeting/timeslot_start_end.html" %}
-
- |
-
- {% include "meeting/timeslot_start_end.html" %}
-
- {{ item.timeslot.time|date:"l"}}
- {{item.timeslot.name|capfirst_allcaps}}
- |
- |
-
- {% endifchanged %}
- {% endif %}
-
- {% if item.timeslot.type.slug == 'break' or item.timeslot.type.slug == 'reg' or item.timeslot.type.slug == 'other' %}
-
- |
-
-
- {% include "meeting/timeslot_start_end.html" %}
-
- |
-
-
- {% include "meeting/timeslot_start_end.html" %}
-
- {% if item.timeslot.show_location and item.timeslot.get_html_location %}
- {% if schedule.meeting.number|add:"0" < 96 %}
- {{item.timeslot.get_html_location}}
- {% elif item.timeslot.location.floorplan %}
- {{item.timeslot.get_html_location}}
- {% else %}
- {{item.timeslot.get_html_location}}
- {% endif %}
- {% with item.timeslot.location.floorplan as floor %}
- {% if item.timeslot.location.floorplan %}
-
- {{floor.short}}
-
- {% endif %}
- {% endwith %}
- {% endif %}
- |
-
- {% if item.session.agenda %}
-
- {{item.timeslot.name}}
-
- {% else %}
- {{item.timeslot.name}}
- {% endif %}
-
- {% if item.session.current_status == 'canceled' %}
- CANCELLED
- {% else %}
-
- {% if item.timeslot.type.slug == 'other' %}
- {% if item.session.agenda or item.session.remote_instructions or item.session.agenda_note %}
- {% include "meeting/session_buttons_include.html" with show_agenda=True item=item schedule=schedule %}
- {% else %}
- {% for slide in item.session.slides %}
- {{ slide.title|clean_whitespace }}
-
- {% endfor %}
- {% endif %}
+ |
+
+
+ {% include "meeting/timeslot_start_end.html" %}
+
+ {% location_anchor item.timeslot %}
+ {{ item.timeslot.get_html_location }}
+ {% end_location_anchor %}
+ {% if item.timeslot.show_location and item.timeslot.get_html_location %}
+ {% with item.timeslot.location.floorplan as floor %}
+ {% if item.timeslot.location.floorplan %}
+
+ {{floor.short}}
+
+ {% endif %}
+ {% endwith %}
{% endif %}
-
- {% endif %}
- |
- |
-
- {% endif %}
+
+
+ {% agenda_anchor item.session %}
+ {% assignment_display_name item %}
+ {% end_agenda_anchor %}
+
+ {% if item.session.current_status == 'canceled' %}
+ CANCELLED
+ {% else %}
+
+ {% if item.slot_type.slug == 'other' %}
+ {% if item.session.agenda or item.session.remote_instructions or item.session.agenda_note %}
+ {% include "meeting/session_buttons_include.html" with show_agenda=True item=item schedule=schedule %}
+ {% else %}
+ {% for slide in item.session.slides %}
+ {{ slide.title|clean_whitespace }}
+
+ {% endfor %}
+ {% endif %}
+ {% endif %}
+
+ {% endif %}
+ |
+ |
+
+
+ {% elif item|is_regular_agenda_item or item|is_plenary_agenda_item %}
+
+ {% if item|is_regular_agenda_item %}
+ {% ifchanged %}
+
+ |
+
+
+ {% include "meeting/timeslot_start_end.html" %}
+
+ |
+
+
+ {% include "meeting/timeslot_start_end.html" %}
+
+ {{ item.timeslot.time|date:"l"}}
+ {{item.timeslot.name|capfirst_allcaps}}
+ |
+ |
+
+ {% endifchanged %}
+ {% endif %}
- {% if item.timeslot.type_id == 'regular' or item.timeslot.type.slug == 'plenary' %}
{% if item.session.historic_group %}
-
|
- {% if item.timeslot.type.slug == 'plenary' %}
+ {% if item.slot_type.slug == 'plenary' %}
{% include "meeting/timeslot_start_end.html" %}
|
-
+ |
{% include "meeting/timeslot_start_end.html" %}
- {% if item.timeslot.show_location and item.timeslot.get_html_location %}
- {% if schedule.meeting.number|add:"0" < 96 %}
- {{item.timeslot.get_html_location}}
- {% elif item.timeslot.location.floorplan %}
- {{item.timeslot.get_html_location}}
- {% else %}
- {{item.timeslot.get_html_location}}
- {% endif %}
- {% endif %}
- |
+ {% location_anchor item.timeslot %}
+ {{ item.timeslot.get_html_location }}
+ {% end_location_anchor %}
+
{% else %}
@@ -269,15 +255,9 @@
{% endwith %}
|
- {% if item.timeslot.show_location and item.timeslot.get_html_location %}
- {% if schedule.meeting.number|add:"0" < 96 %}
- {{item.timeslot.get_html_location}}
- {% elif item.timeslot.location.floorplan %}
- {{item.timeslot.get_html_location}}
- {% else %}
- {{item.timeslot.get_html_location}}
- {% endif %}
- {% endif %}
+ {% location_anchor item.timeslot %}
+ {{ item.timeslot.get_html_location }}
+ {% end_location_anchor %}
|
{{item.session.historic_group.historic_parent.acronym}} |
@@ -292,18 +272,9 @@
{% endif %}
- {% if item.session.agenda %}
-
- {% endif %}
- {% if item.timeslot.type.slug == 'plenary' %}
- {{item.timeslot.name}}
- {% else %}
- {{item.session.historic_group.name}}
- {% endif %}
- {% if item.session.agenda %}
-
- {% endif %}
-
+ {% agenda_anchor item.session %}
+ {% assignment_display_name item %}
+ {% end_agenda_anchor %}
{% if item.session.current_status == 'canceled' %}
CANCELLED
{% else %}
@@ -453,9 +424,9 @@
// either have not yet loaded the iframe or we do not support history replacement
wv_iframe.src = new_url;
}
- }
+ }
}
-
+
function update_view(filter_params) {
update_agenda_display(filter_params);
update_weekview(filter_params)
diff --git a/ietf/templates/meeting/agenda.txt b/ietf/templates/meeting/agenda.txt
index ce804b224..489ebbe6a 100644
--- a/ietf/templates/meeting/agenda.txt
+++ b/ietf/templates/meeting/agenda.txt
@@ -14,17 +14,17 @@
{{ item.timeslot.time|date:"l"|upper }}, {{ item.timeslot.time|date:"F j, Y" }}
-{% endifchanged %}{% if item.timeslot.type.slug == "reg" %}
-{{ item.timeslot.time_desc }} {{ item.timeslot.name }}{% if schedule.meeting.reg_area %} - {{ schedule.meeting.reg_area }}{% endif %}{% endif %}{% if item.timeslot.type.slug == "plenary" %}
+{% endifchanged %}{% if item.slot_type.slug == "reg" %}
+{{ item.timeslot.time_desc }} {{ item.timeslot.name }}{% if schedule.meeting.reg_area %} - {{ schedule.meeting.reg_area }}{% endif %}{% endif %}{% if item.slot_type.slug == "plenary" %}
{{ item.timeslot.time_desc }} {{ item.session.name }} - {{ item.timeslot.location.name }}
{{ item.session.agenda_text.strip|indent:"3" }}
-{% endif %}{% if item.timeslot.type_id == 'regular' %}{% if item.session.historic_group %}{% ifchanged %}
+{% endif %}{% if item.slot_type.slug == 'regular' %}{% if item.session.historic_group %}{% ifchanged %}
{{ item.timeslot.time_desc }} {{ item.timeslot.name }}
{% endifchanged %}{{ item.timeslot.location.name|ljust:14 }} {{ item.session.historic_group.historic_parent.acronym|upper|ljust:4 }} {{ item.session.historic_group.acronym|ljust:10 }} {{ item.session.historic_group.name }} {% if item.session.historic_group.state_id == "bof" %}BOF{% elif item.session.historic_group.type_id == "wg" %}WG{% endif %}{% if item.session.agenda_note %} - {{ item.session.agenda_note }}{% endif %}{% if item.session.current_status == 'canceled' %} *** CANCELLED ***{% elif item.session.current_status == 'resched' %} *** RESCHEDULED{% if item.session.rescheduled_to %} TO {{ item.session.rescheduled_to.time|date:"l G:i"|upper }}-{{ item.session.rescheduled_to.end_time|date:"G:i" }}{% endif %} ***{% endif %}
-{% endif %}{% endif %}{% if item.timeslot.type.slug == "break" %}
-{{ item.timeslot.time_desc }} {{ item.timeslot.name }}{% if schedule.meeting.break_area and item.timeslot.show_location %} - {{ schedule.meeting.break_area }}{% endif %}{% endif %}{% if item.timeslot.type.slug == "other" %}
+{% endif %}{% endif %}{% if item.slot_type.slug == "break" %}
+{{ item.timeslot.time_desc }} {{ item.timeslot.name }}{% if schedule.meeting.break_area and item.timeslot.show_location %} - {{ schedule.meeting.break_area }}{% endif %}{% endif %}{% if item.slot_type.slug == "other" %}
{{ item.timeslot.time_desc }} {{ item.timeslot.name }} - {{ item.timeslot.location.name }}{% endif %}{% endfor %}
====================================================================
diff --git a/ietf/templates/meeting/agenda_by_room.html b/ietf/templates/meeting/agenda_by_room.html
index 2e0a68bd7..8f292fda0 100644
--- a/ietf/templates/meeting/agenda_by_room.html
+++ b/ietf/templates/meeting/agenda_by_room.html
@@ -29,7 +29,7 @@ ul.sessionlist { list-style:none; padding-left:2em; margin-bottom:10px;}
{{room.grouper|default:"Location Unavailable"}}
{% for ss in room.list %}
- - {{ss.timeslot.time|date:"H:i"}}-{{ss.timeslot.end_time|date:"H:i"}} {{ss.session.short_name}}
+ - {{ss.timeslot.time|date:"H:i"}}-{{ss.timeslot.end_time|date:"H:i"}} {{ss.session.short_name}}
{% endfor %}
diff --git a/ietf/templates/meeting/agenda_filter.html b/ietf/templates/meeting/agenda_filter.html
index cd91e7c1f..dff07a03a 100644
--- a/ietf/templates/meeting/agenda_filter.html
+++ b/ietf/templates/meeting/agenda_filter.html
@@ -61,12 +61,12 @@ Optional parameters:
{% for fc in filter_categories %}
{% if not forloop.first %} | | {% endif %}
{% for p in fc %}
-
+ |
- {% for button in p.children|dictsort:"label" %}
+ {% for button in p.children %}
|