More agenda template fixes.

- Legacy-Id: 19656
This commit is contained in:
Lars Eggert 2021-11-12 17:47:17 +00:00
parent be3a8f71ce
commit 75b5fc158e
5 changed files with 155 additions and 208 deletions

View file

@ -2,7 +2,7 @@ module.exports = {
extends: ["eslint:recommended"], extends: ["eslint:recommended"],
rules: { rules: {
indent: ["error", 4], indent: ["error", 4],
quotes: ["error", "double", { avoidEscape: true, allowTemplateLiterals: true }], quotes: "off",
"no-multiple-empty-lines": ["error", { max: 2, maxEOF: 0 }], "no-multiple-empty-lines": ["error", { max: 2, maxEOF: 0 }],
"quote-props": ["error", "as-needed"], "quote-props": ["error", "as-needed"],
"brace-style": ["error", "1tbs", { allowSingleLine: true }], "brace-style": ["error", "1tbs", { allowSingleLine: true }],

View file

@ -73,7 +73,7 @@
</ul> </ul>
</div> </div>
{% endif %} {% endif %}
<div class="col" id="content"> <div class="col mx-3" id="content">
{% comment %} {% bootstrap_messages %} {% endcomment %} {% comment %} {% bootstrap_messages %} {% endcomment %}
{% for message in messages %} {% for message in messages %}
<div class="alert{% if message.level_tag %} alert-{% if message.level_tag == 'error' %}danger{% else %}{{ message.level_tag }}{% endif %}{% endif %}{% if message.extra_tags %} {{ message.extra_tags }}{% endif %} alert-dismissable fade show"> <div class="alert{% if message.level_tag %} alert-{% if message.level_tag == 'error' %}danger{% else %}{{ message.level_tag }}{% endif %}{% endif %}{% if message.extra_tags %} {{ message.extra_tags }}{% endif %} alert-dismissable fade show">

View file

@ -7,48 +7,14 @@
{% load htmlfilters agenda_custom_tags%} {% load htmlfilters agenda_custom_tags%}
{% block title %} {% block title %}
IETF {{ schedule.meeting.number }} meeting agenda IETF {{ schedule.meeting.number }} Meeting Agenda
{% if "-utc" in request.path %} {% if "-utc" in request.path %}
(UTC) (UTC)
{% endif %} {% endif %}
{% endblock %} {% endblock %}
{% block morecss %} {% block morecss %}
iframe#weekview { height: 600px; width: 100%; } iframe#weekview { height: 25em; }
tr:not(:first-child) th.gap {
height: 3em !important;
background-color: inherit !important;
border: none !important;
}
tr:first-child th.gap {
height: 0 !important;
background-color: inherit !important;
border: none !important;
}
.session-materials .agenda-frame,.minutes-frame {
white-space: normal;
}
div.tz-display {
margin-bottom: 0.5em;
margin-top: 1em;
text-align: right;
}
.tz-display a {
cursor: pointer;
}
.tz-display label {
font-weight: normal;
}
.tz-display select {
min-width: 15em;
}
#affix .nav li.tz-display {
padding: 4px 20px;
}
#affix .nav li.tz-display a {
display: inline;
padding: 0;
}
{% endblock %} {% endblock %}
{% block bodyAttrs %}data-spy="scroll" data-target="#affix"{% endblock %} {% block bodyAttrs %}data-spy="scroll" data-target="#affix"{% endblock %}
@ -57,14 +23,12 @@
{% origin %} {% origin %}
<div class="row"> <div class="row">
<div class="col-md-12"> {% if "-utc" in request.path %}
{% if "-utc" in request.path %} {% include "meeting/meeting_heading.html" with meeting=schedule.meeting updated=updated selected="agenda-utc" title_extra="(UTC)" %}
{% include "meeting/meeting_heading.html" with meeting=schedule.meeting updated=updated selected="agenda-utc" title_extra="(UTC)" %} {% else %}
{% else %} {% include "meeting/meeting_heading.html" with meeting=schedule.meeting updated=updated selected="agenda" title_extra="" %}
{% include "meeting/meeting_heading.html" with meeting=schedule.meeting updated=updated selected="agenda" title_extra="" %} {% endif %}
{% endif %}
</div>
</div> </div>
<div class="row"> <div class="row">
<div class="col-md-10"> <div class="col-md-10">
@ -72,22 +36,25 @@
{% load cache %} {% load cache %}
{% cache cache_time ietf_meeting_agenda_utc schedule.meeting.number request.path %} {% cache cache_time ietf_meeting_agenda_utc schedule.meeting.number request.path %}
<div class="row"> <div class="row">
<div class="col-xs-6"><h1>Agenda</h1></div> <div class="col-5">
<div class="col-xs-6"> <h2>Agenda</h2>
<div class="tz-display"> </div>
<div><small> <div class="col float-end">
<label for="timezone-select">Time zone:</label> <div class="input-group input-group-sm">
<a id="meeting-timezone" onclick="ietf_timezone.use('{{ timezone }}')">Meeting</a> | <label class="input-group-text border-secondary">Time zone:</label>
<a id="local-timezone" onclick="ietf_timezone.use('local')">Local</a> | <button class="btn btn-outline-secondary" type="button" id="meeting-timezone" onclick="ietf_timezone.use('{{ timezone }}')">Meeting</button>
<a id="utc-timezone" onclick="ietf_timezone.use('UTC')">UTC</a> <button class="btn btn-outline-secondary" type="button" id="local-timezone" onclick="ietf_timezone.use('local')">Local</button>
</small></div> <button class="btn btn-outline-secondary" type="button" id="utc-timezone" onclick="ietf_timezone.use('UTC')">UTC</button>
<select id="timezone-select" class="tz-select"> <select id="timezone-select" class="tz-select form-select border-secondary">
{# Avoid blank while loading. JavaScript replaces the option list after init. #} {# Avoid blank while loading. JavaScript replaces the option list after init. #}
<option selected>{{ timezone }}</option> <option selected>{{ timezone }}</option>
</select> </select>
</div> </div>
</div> </div>
</div> </div>
{% if is_current_meeting %} {% if is_current_meeting %}
<p class="alert alert-info"> <p class="alert alert-info">
<b>Note:</b> IETF agendas are subject to change, up to and during a meeting. <b>Note:</b> IETF agendas are subject to change, up to and during a meeting.
@ -100,23 +67,22 @@
</p> </p>
{% endif %} {% endif %}
{% include "meeting/agenda_filter.html" with filter_categories=filter_categories customize_button_text="Customize the agenda view..." %} <p>
{% include "meeting/agenda_filter.html" with filter_categories=filter_categories customize_button_text="Customize the agenda view..." %}
</p>
<h2>Download as .ics</h2> <h2>Download as .ics</h2>
<p class="buttonlist"> <p>
{% for fc in filter_categories %} {% for fc in filter_categories %}
{% if not forloop.last %} {# skip the last group, it's the office hours/misc #} {% if not forloop.last %} {# skip the last group, it's the office hours/misc #}
<div style="display:inline-block;margin-right:1em"> {% for p in fc|dictsort:"label" %}
{% for p in fc|dictsort:"label" %} <a class="btn btn-primary btn-sm mb-3" href="{% url "ietf.meeting.views.agenda_ical" num=schedule.meeting.number %}?show={{p.keyword}}">{{p.label}}</a>
<a class="btn btn-default" href="{% url "ietf.meeting.views.agenda_ical" num=schedule.meeting.number %}?show={{p.keyword}}">{{p.label}}</a> {% endfor %}
{% endfor %}
</div>
{% endif %} {% endif %}
{% endfor %} {% endfor %}
<div style="display:inline-block">
<a class="btn btn-default" href="{% url "ietf.meeting.views.agenda_ical" num=schedule.meeting.number %}?show={{ non_area_keywords|join:',' }}">Non-area events</a> <a class="btn btn-primary btn-sm mb-3" href="{% url "ietf.meeting.views.agenda_ical" num=schedule.meeting.number %}?show={{ non_area_keywords|join:',' }}">Non-area events</a>
<a id="ical-link" class="hidden btn btn-primary agenda-link filterable" href="{% url "ietf.meeting.views.agenda_ical" num=schedule.meeting.number %}">Customized schedule</a>
</div> <a id="ical-link" class="hidden btn btn-primary btn-sm mb-3 agenda-link filterable" href="{% url "ietf.meeting.views.agenda_ical" num=schedule.meeting.number %}">Customized schedule</a>
</p> </p>
<h2> <h2>
@ -127,18 +93,19 @@
{% endif %} {% endif %}
</h2> </h2>
<iframe class="hidden" id="weekview"></iframe> <iframe class="hidden w-100" scrolling="no" id="weekview"></iframe>
<h2>Detailed Agenda</h2>
<table class="table table-sm table-striped"> <table class="table table-sm table-striped">
{% for item in filtered_assignments %} {% for item in filtered_assignments %}
{% ifchanged item.timeslot.time|date:"Y-m-d" %} {% ifchanged item.timeslot.time|date:"Y-m-d" %}
<tr><th class="gap" colspan="7"></th></tr>
<tr class="table-warning"> <tr class="table-warning">
<th colspan="7"> <th colspan="7">
{# The anchor here needs to be in a div, not in the th, in order for the anchor-target margin hack to work #} {# The anchor here needs to be in a div, not in the th, in order for the anchor-target margin hack to work #}
<div class="anchor-target" id="{{item.timeslot.time|slugify}}"></div> <div class="anchor-target" id="{{item.timeslot.time|slugify}}"></div>
{{ item.timeslot.time|date:"l, F j, Y" }} <h6 class="mt-2">{{ item.timeslot.time|date:"l, F j, Y" }}</h6>
</th> </th>
</tr> </tr>
{% endifchanged %} {% endifchanged %}
@ -165,7 +132,7 @@
{% if item.timeslot.location.floorplan %} {% if item.timeslot.location.floorplan %}
<div class="hidden-xs"> <div class="hidden-xs">
<a href="{% url 'ietf.meeting.views.floor_plan' num=schedule.meeting.number %}#{{floor.name|xslugify}}" <a href="{% url 'ietf.meeting.views.floor_plan' num=schedule.meeting.number %}#{{floor.name|xslugify}}"
class="float-end" title="{{floor.name}}"><span class="badge bg-blank label-wide">{{floor.short}}</span></a> class="float-end" title="{{floor.name}}"><span class="badge bg-secondary label-wide">{{floor.short}}</span></a>
</div> </div>
{% endif %} {% endif %}
{% endwith %} {% endwith %}
@ -179,7 +146,7 @@
{% if item.session.current_status == 'canceled' %} {% if item.session.current_status == 'canceled' %}
<span class="badge bg-danger float-end">CANCELLED</span> <span class="badge bg-danger float-end">CANCELLED</span>
{% else %} {% else %}
<div class="float-end padded-left"> <div class="float-end ps-3">
{% if item.slot_type.slug == 'other' %} {% if item.slot_type.slug == 'other' %}
{% if item.session.agenda or item.session.remote_instructions or item.session.agenda_note %} {% 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 %} {% include "meeting/session_buttons_include.html" with show_agenda=True item=item schedule=schedule %}
@ -249,7 +216,7 @@
{% if item.timeslot.location.floorplan %} {% if item.timeslot.location.floorplan %}
<div class="hidden-xs"> <div class="hidden-xs">
<a href="{% url 'ietf.meeting.views.floor_plan' num=schedule.meeting.number %}#{{floor.name|xslugify}}" <a href="{% url 'ietf.meeting.views.floor_plan' num=schedule.meeting.number %}#{{floor.name|xslugify}}"
class="float-end" title="{{floor.name}}"><span class="badge bg-blank">{{floor.short}}</span></a> class="float-end" title="{{floor.name}}"><span class="badge bg-secondary">{{floor.short}}</span></a>
</div> </div>
{% endif %} {% endif %}
{% endwith %} {% endwith %}
@ -285,7 +252,7 @@
{% endif %} {% endif %}
{% if item.session.historic_group.state_id == "bof" %} {% if item.session.historic_group.state_id == "bof" %}
<span class="badge bg-success float-end">BOF</span> <span class="badge bg-success float-end me-2">BOF</span>
{% endif %} {% endif %}
{% if item.session.current_status == 'resched' %} {% if item.session.current_status == 'resched' %}

View file

@ -10,85 +10,64 @@ Optional parameters:
<div class="accordion" id="accordion"> <div class="accordion" id="accordion">
<div class="accordion-item"> <div class="accordion-item">
<h2 class="accordion-header" id="heading"> <h2 class="accordion-header" id="heading">
<button class="accordion-button {% if not always_show %}collapsed{% endif %}" type="button" data-bs-toggle="collapse" data-bs-target="#collapse" aria-expanded="{% if not always_show %}false{% else %}true{% endif %}" aria-controls="collapse"> <button class="accordion-button {% if not always_show %}collapsed{% endif %}" type="button" data-bs-toggle="collapse" data-bs-target="#customize" aria-expanded="{% if not always_show %}false{% else %}true{% endif %}" aria-controls="customize">
{% firstof customize_button_text "Customize..."%} {% firstof customize_button_text "Customize..."%}
</button> </button>
</h2> </h2>
<div id="customize" class="{% if not always_show %}panel-collapse collapse{% endif %}">
<span hidden {# options to pass to the JS - correspond to keys in opts object #}
id="agenda-filter-options"
data-always-show="{% firstof always_show False %}">
</span>
<div id="collapse" class="accordion-collapse collapse" aria-labelledby="heading" data-bs-parent="#accordion"> <div id="customize" class="accordion-collapse collapse{% if always_show %} show{% endif %}" aria-labelledby="heading" data-bs-parent="#accordion">
<div class="accordion-body"> <div class="accordion-body">
<span hidden {# options to pass to the JS - correspond to keys in opts object #}
id="agenda-filter-options"
data-always-show="{% firstof always_show False %}">
</span>
<p> <p>
You can customize the agenda view to show only selected sessions, You can customize the agenda view to show only selected sessions,
by clicking on groups and areas in the table below. by clicking on groups and areas in the table below.
To be able to return to the customized view later, bookmark the resulting URL. To be able to return to the customized view later, bookmark the resulting URL.
</p> </p>
{% if filter_categories|length %} {% if filter_categories|length %}
<p>Groups displayed in <b><i>italics</i></b> are BOFs.</p> <p>Groups displayed in <b><i>italics</i></b> are BOFs.</p>
{% with spacer_scale=5 %} <div class="row">
{% with width_scale=filter_categories|agenda_width_scale:spacer_scale %} {% for fc in filter_categories %}
<table class="table table-sm"> {% for area in fc %}
<thead> <div class="col-1 ms-1">
<tr> <div class="row">
{% for fc in filter_categories %} {% if area.label or area.keyword %}
{% if not forloop.first %} <button type="button" class="btn btn-sm btn-outline-primary pickview {{ area.keyword }}" data-filter-item="{{ area.keyword }}">
<th style="width:{% widthratio 1 width_scale 100 %}%"></th> {% firstof area.label area.keyword %}
{% endif %} </button>
{% for area in fc %} {% endif %}
<th style="width:{% widthratio spacer_scale width_scale 100 %}%"> </div>
{% if area.keyword %} <div class="row view{% if p.keyword %} {{ p.keyword }}{% endif %}">
<button class="btn btn-primary btn-block pickview {{ area.keyword }}" <div class="m-0 p-0 btn-group-vertical btn-group-sm " role="group" aria-label="{% firstof area.label area.keyword %}">
data-filter-item="{{ area.keyword }}"> {% for group in area.children %}
{% firstof area.label area.keyword %} <button type="button" class="overflow-hidden btn btn-outline-secondary pickview {{ group.keyword }}" {% if group.toggled_by %}data-filter-keywords="{{ group.toggled_by|join:"," }}"{% endif %} data-filter-item="{{ group.keyword }}">
</button> <small>
{% if group.is_bof %}
<i>{{ group.label }}</i>
{% else %}
{{ group.label }}
{% endif %} {% endif %}
</th> </small>
{% endfor %} </button>
{% endfor %} {% endfor %}
</tr> </div>
</thead> </div>
<tbody> </div>
<tr> {% endfor %}
{% for fc in filter_categories %} {% endfor %}
{% if not forloop.first %} <td></td> {% endif %}
{% for p in fc %} </div>
<td class="view{% if p.keyword %} {{ p.keyword }}{% endif %}"> {% else %}
<div class="btn-group-vertical btn-block"> <blockquote><i>No WG / RG data available -- no WG / RG sessions have been scheduled yet.</i>
{% for button in p.children %} </blockquote>
<div class="btn-group btn-group-xs btn-group-justified"> {% endif %}
<button class="btn btn-primary pickview {{ button.keyword }}"
{% if button.toggled_by %}data-filter-keywords="{{ button.toggled_by|join:"," }}"{% endif %}
data-filter-item="{{ button.keyword }}">
{% if button.is_bof %}
<i>{{ button.label }}</i>
{% else %}
{{ button.label }}
{% endif %}
</button>
</div>
{% endfor %}
</div>
</td>
{% endfor %}
{% endfor %}
</tr>
</tbody>
</table>
{% endwith %}
{% endwith %}
{% else %}
<blockquote><i>No WG / RG data available -- no WG / RG sessions have been scheduled yet.</i>
</blockquote>
{% endif %}
</div>
</div> </div>
</div> </div>
</div> </div>

View file

@ -7,75 +7,76 @@
{% if schedule != meeting.schedule %} {% if schedule != meeting.schedule %}
<h3 class="alert alert-danger text-center"> <h3 class="alert alert-danger text-center">
This is schedule {{schedule.owner.email}}/{{ schedule.name }}, not the official schedule. This is schedule {{ schedule.owner.email }}/{{ schedule.name }}, not the official schedule.
</h3> </h3>
{% endif %} {% endif %}
<h1> <h1>
IETF {{ meeting.number }} Meeting Agenda {{ title_extra }} IETF {{ meeting.number }} Meeting Agenda {{ title_extra }}
<br>
<small>
{{ meeting.city|default:"Location TBD" }}, {{ meeting.date|date:"F j" }} -
{% if meeting.date.month != meeting.end_date.month %}
{{ meeting.end_date|date:"F " }}
{% endif %}
{{ meeting.end_date|date:"j, Y" }}
{% if updated %}
<span class="float-end">
Updated {{ updated|date:"Y-m-d \a\t G:i:s (T)" }}
</span>
{% endif %}
</small>
</h1> </h1>
<h4>
{# <a> tags with the agenda-link filterable classes will be updated with show/hide parameters #} {{ meeting.city|default:"Location TBD" }}, {{ meeting.date|date:"F j" }} -
<ul class="nav nav-tabs"> {% if meeting.date.month != meeting.end_date.month %}
<li class="nav-item"> {{ meeting.end_date|date:"F " }}
<a class="nav-link {% if selected == "agenda" %}active{% endif %}" href="{% url 'ietf.meeting.views.agenda' num=meeting.number %}"
class="agenda-link filterable">
Agenda
</a>
</li>
<li class="nav-item">
<a class="nav-link {% if selected == "agenda-utc" %}active{% endif %}" href="{% url 'ietf.meeting.views.agenda' num=meeting.number utc='-utc' %}"
class="agenda-link filterable">
UTC Agenda
</a>
</li>
{% if user|has_role:"Secretariat,Area Director,IAB" %}
{% if schedule != meeting.schedule %}
<li class="nav-item">
<a class="nav-link {% if selected == "by-room" %}active{% endif %}"
href="{% url 'ietf.meeting.views.agenda_by_room' num=meeting.number name=schedule.name owner=schedule.owner.email %}">by
Room</a></li>
<li class="nav-item">
<a class="nav-link {% if selected == "by-type" %}active{% endif %}"
href="{% url 'ietf.meeting.views.agenda_by_type' num=meeting.number name=schedule.name owner=schedule.owner.email %}">by
Type</a></li>
<li class="nav-item">
<a class="nav-link {% if selected == "room-view" %}active{% endif %}"
href="{% url 'ietf.meeting.views.room_view' num=meeting.number name=schedule.name owner=schedule.owner.email %}">Room
grid</a></li>
{% else %}
<li class="nav-item">
<a class="nav-link {% if selected == "by-room" %}active{% endif %}" href="{% url 'ietf.meeting.views.agenda_by_room' num=meeting.number %}">by Room</a></li>
<li class="nav-item">
<a class="nav-link {% if selected == "by-type" %}active{% endif %}" href="{% url 'ietf.meeting.views.agenda_by_type' num=meeting.number %}">by Type</a></li>
<li class="nav-item">
<a class="nav-link {% if selected == "room-view" %}active{% endif %}" href="{% url 'ietf.meeting.views.room_view' num=meeting.number %}">Room grid</a></li>
{% endif %}
{% endif %} {% endif %}
<li class="nav-item"> {{ meeting.end_date|date:"j, Y" }}
<a class="nav-link {% if selected == "floor-plan" %}active{% endif %}" href="{% url 'ietf.meeting.views.floor_plan' num=meeting.number %}">Floor plan</a></li> {% if updated %}
<li class="nav-item"> <span class="float-end">
<a class="nav-link" href="{% url 'ietf.meeting.views.agenda' num=meeting.number ext='.txt' %}"> Updated: {{ updated|date:"Y-m-d \a\t G:i:s (T)" }}
Plaintext </span>
</a> {% endif %}
</li> </h4>
<li class="nav-item">
<a class="nav-link {% if selected == "select-sessions" %}active{% endif %}" href="{% url 'ietf.meeting.views.agenda_personalize' num=meeting.number %}" <p>
class="agenda-link filterable"> {# a tags with the agenda-link filterable classes will be updated with show/hide parameters #}
Select Sessions <ul class="nav nav-tabs">
</a> <li class="nav-item">
</li> <a class="nav-link {% if selected == "agenda" %}active{% endif %}" href="{% url 'ietf.meeting.views.agenda' num=meeting.number %}"
</ul> class="agenda-link filterable">
Agenda
</a>
</li>
<li class="nav-item">
<a class="nav-link {% if selected == "agenda-utc" %}active{% endif %}" href="{% url 'ietf.meeting.views.agenda' num=meeting.number utc='-utc' %}"
class="agenda-link filterable">
UTC Agenda
</a>
</li>
{% if user|has_role:"Secretariat,Area Director,IAB" %}
{% if schedule != meeting.schedule %}
<li class="nav-item">
<a class="nav-link {% if selected == "by-room" %}active{% endif %}"
href="{% url 'ietf.meeting.views.agenda_by_room' num=meeting.number name=schedule.name owner=schedule.owner.email %}">by
Room</a></li>
<li class="nav-item">
<a class="nav-link {% if selected == "by-type" %}active{% endif %}"
href="{% url 'ietf.meeting.views.agenda_by_type' num=meeting.number name=schedule.name owner=schedule.owner.email %}">by
Type</a></li>
<li class="nav-item">
<a class="nav-link {% if selected == "room-view" %}active{% endif %}"
href="{% url 'ietf.meeting.views.room_view' num=meeting.number name=schedule.name owner=schedule.owner.email %}">Room
grid</a></li>
{% else %}
<li class="nav-item">
<a class="nav-link {% if selected == "by-room" %}active{% endif %}" href="{% url 'ietf.meeting.views.agenda_by_room' num=meeting.number %}">by Room</a></li>
<li class="nav-item">
<a class="nav-link {% if selected == "by-type" %}active{% endif %}" href="{% url 'ietf.meeting.views.agenda_by_type' num=meeting.number %}">by Type</a></li>
<li class="nav-item">
<a class="nav-link {% if selected == "room-view" %}active{% endif %}" href="{% url 'ietf.meeting.views.room_view' num=meeting.number %}">Room grid</a></li>
{% endif %}
{% endif %}
<li class="nav-item">
<a class="nav-link {% if selected == "floor-plan" %}active{% endif %}" href="{% url 'ietf.meeting.views.floor_plan' num=meeting.number %}">Floor plan</a></li>
<li class="nav-item">
<a class="nav-link" href="{% url 'ietf.meeting.views.agenda' num=meeting.number ext='.txt' %}">
Plaintext
</a>
</li>
<li class="nav-item">
<a class="nav-link {% if selected == "select-sessions" %}active{% endif %}" href="{% url 'ietf.meeting.views.agenda_personalize' num=meeting.number %}"
class="agenda-link filterable">
Select Sessions
</a>
</li>
</ul>
</p>