test: Validate HTML rendered during tests (#3782)

This commit is contained in:
Lars Eggert 2022-04-07 19:30:38 +03:00 committed by GitHub
parent db254f7a48
commit 3234f1a121
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
333 changed files with 4120 additions and 4275 deletions

View file

@ -4,59 +4,38 @@
root = true
# Settings for IETF datatracker
# Global settings for IETF datatracker
# ---------------------------------------------------------
# PEP8 Style
[*]
indent_style = space
indent_size = 4
end_of_line = lf
charset = utf-8
# to avoid tripping Henrik's commit hook:
trim_trailing_whitespace = false
insert_final_newline = false
trim_trailing_whitespace = true
insert_final_newline = true
# Specializations below *add to* the above defaults
# Settings for .github folder
# ---------------------------------------------------------
# GitHub Markdown Style
[.github/**]
indent_style = space
indent_size = 2
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = false
insert_final_newline = true
# Settings for client-side JS / Vue files
# ---------------------------------------------------------
# StandardJS Style
[client/**]
indent_style = space
indent_size = 2
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
[package.json]
indent_style = space
indent_size = 2
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true
# Settings for cypress tests
# ---------------------------------------------------------
# StandardJS Style
[cypress/**]
indent_style = space
indent_size = 2
end_of_line = lf
charset = utf-8
trim_trailing_whitespace = true
insert_final_newline = true

2
.gitignore vendored
View file

@ -14,6 +14,8 @@
*.#*
.*.swp
.DS_store
datatracker.sublime-project
datatracker.sublime-workspace
# Simulated Subversion default ignores end here
/.coverage
/.factoryboy_random_state

View file

@ -24,7 +24,6 @@ RUN apt-get install -qy \
build-essential \
curl \
docker-ce-cli \
default-jdk \
enscript \
gawk \
gcc \
@ -46,7 +45,6 @@ RUN apt-get install -qy \
libxtst6 \
libmagic-dev \
libmariadb-dev \
libtidy-dev \
locales \
mariadb-client \
netcat \
@ -109,9 +107,6 @@ RUN pip3 --disable-pip-version-check --no-cache-dir install -r /tmp/pip-tmp/requ
# Turn off rsyslog kernel logging (doesn't work in Docker)
RUN sed -i '/imklog/s/^/#/' /etc/rsyslog.conf
# Install the Nu Html Checker (v.Nu)
ADD https://github.com/validator/validator/releases/download/latest/vnu.jar /
# Fetch wait-for utility
ADD https://raw.githubusercontent.com/eficode/wait-for/v2.1.3/wait-for /usr/local/bin/
RUN chmod +rx /usr/local/bin/wait-for

View file

@ -31,7 +31,6 @@ RUN apt-get install -qy \
bash \
build-essential \
curl \
default-jdk \
docker-ce-cli \
enscript \
fish \
@ -56,7 +55,6 @@ RUN apt-get install -qy \
libmagic-dev \
libmariadb-dev \
libmemcached-tools \
libtidy-dev \
locales \
mariadb-client \
memcached \
@ -125,9 +123,6 @@ RUN sed -i '/imklog/s/^/#/' /etc/rsyslog.conf
# Colorize the bash shell
RUN sed -i 's/#force_color_prompt=/force_color_prompt=/' /root/.bashrc
# Install the Nu Html Checker (v.Nu)
ADD https://github.com/validator/validator/releases/download/latest/vnu.jar /
ADD https://raw.githubusercontent.com/eficode/wait-for/v2.1.3/wait-for /usr/local/bin/
RUN chmod +rx /usr/local/bin/wait-for

View file

@ -33,8 +33,8 @@
<h2>Template content</h2>
<div class = "card">
<p class='pasted'>{{ template.content }}</p>
<div class="card">
<p class="pasted">{{ template.content }}</p>
</div>
{% endblock %}
{% endblock %}

View file

@ -109,14 +109,15 @@ def ballot_icon(context, doc):
else:
typename = "IESG"
res = ['<a %s href="%s" data-bs-toggle="modal" data-bs-target="#modal-%d" title="%s positions (click to show more)" class="ballot-icon"><table' % (
res = ['<a %s href="%s" data-bs-toggle="modal" data-bs-target="#modal-%d" aria-label="%s positions" title="%s positions (click to show more)" class="ballot-icon"><table' % (
right_click_string,
urlreverse("ietf.doc.views_doc.ballot_popup", kwargs=dict(name=doc.name, ballot_id=ballot.pk)),
ballot.pk,
typename,
typename,)]
if my_blocking:
res.append(' class="is-blocking" ')
res.append('>')
res.append('><tbody>')
res.append("<tr>")
@ -137,7 +138,7 @@ def ballot_icon(context, doc):
res.append('<td class="position-empty"></td>')
i = i + 1
res.append("</tr></table></a>")
res.append("</tr></tbody></table></a>")
res.append('<div id="modal-%d" class="modal fade" tabindex="-1" role="dialog" aria-hidden="true"><div class="modal-dialog modal-dialog-scrollable modal-xl"><div class="modal-content"></div></div></div>' % ballot.pk)
return mark_safe("".join(res))

View file

@ -413,13 +413,13 @@ def format_snippet(text, trunc_words=25):
full = keep_spacing(collapsebr(linebreaksbr(mark_safe(sanitize_fragment(text)))))
snippet = truncatewords_html(full, trunc_words)
if snippet != full:
return mark_safe('<div class="snippet">%s<button class="btn btn-sm btn-primary show-all"><i class="bi bi-caret-down"></i></button></div><div class="visually-hidden full">%s</div>' % (snippet, full))
return mark_safe('<div class="snippet">%s<button type="button" aria-label="Expand" class="btn btn-sm btn-primary show-all"><i class="bi bi-caret-down"></i></button></div><div class="visually-hidden full">%s</div>' % (snippet, full))
return mark_safe(full)
@register.simple_tag
def doc_edit_button(url_name, *args, **kwargs):
"""Given URL name/args/kwargs, looks up the URL just like "url" tag and returns a properly formatted button for the document material tables."""
return mark_safe('<a class="btn btn-primary btn-sm" role="button" href="%s">Edit</a>' % (urlreverse(url_name, args=args, kwargs=kwargs)))
return mark_safe('<a class="btn btn-primary btn-sm" type="button" href="%s">Edit</a>' % (urlreverse(url_name, args=args, kwargs=kwargs)))
@register.filter
def textify(text):

View file

@ -1595,7 +1595,7 @@ class DocTestCase(TestCase):
href = q(f'div.balloter-name a[href$="{author_slug}"]').attr('href')
ids = [
target.attr('id')
for target in q(f'h5[id$="{author_slug}"]').items()
for target in q(f'p.h5[id$="{author_slug}"]').items()
]
self.assertEqual(len(ids), 1, 'Should be exactly one link for the balloter')
self.assertEqual(href, f'#{ids[0]}', 'Anchor href should match ID')

View file

@ -1196,9 +1196,9 @@ class BallotContentTests(TestCase):
)
def _assertBallotMessage(self, q, balloter, expected):
heading = q(f'h5[id$="_{slugify(balloter.plain_name())}"]')
heading = q(f'p.h5[id$="_{slugify(balloter.plain_name())}"]')
self.assertEqual(len(heading), 1)
# <h5/> is followed by a panel with the message of interest, so use next()
# <p.h5/> is followed by a panel with the message of interest, so use next()
self.assertEqual(
len(heading.next().find(
f'*[title="{expected}"]'
@ -1379,4 +1379,4 @@ class BallotContentTests(TestCase):
q = PyQuery(content)
self._assertBallotMessage(q, balloters[0], 'No email send requests for this discuss')
self._assertBallotMessage(q, balloters[1], 'No ballot position send log available')
self._assertBallotMessage(q, old_balloter, 'No ballot position send log available')
self._assertBallotMessage(q, old_balloter, 'No ballot position send log available')

View file

@ -106,7 +106,7 @@ class ChangeStateTests(TestCase):
self.assertEqual(len(q('form select[name=state]')), 1)
if next_states:
self.assertEqual(len(q('[type=submit][value="%s"]' % next_states[0].name)), 1)
self.assertEqual(len(q('[type=submit]:contains("%s")' % next_states[0].name)), 1)
# faulty post
@ -148,7 +148,7 @@ class ChangeStateTests(TestCase):
r = self.client.get(url)
self.assertEqual(r.status_code, 200)
q = PyQuery(r.content)
self.assertEqual(len(q('form [type=submit][value="%s"]' % first_state.name)), 1)
self.assertEqual(len(q('form [type=submit]:contains("%s")' % first_state.name)), 1)
def test_pull_from_rfc_queue(self):
ad = Person.objects.get(user__username="ad")
@ -1383,7 +1383,7 @@ class SubmitToIesgTests(TestCase):
r = self.client.get(url)
self.assertEqual(r.status_code,200)
q = PyQuery(r.content)
self.assertEqual(len(q('form input[name="confirm"]')),1)
self.assertEqual(len(q('form button[name="confirm"]')),1)
url = urlreverse('ietf.doc.views_draft.to_iesg', kwargs=dict(name=self.docname))

View file

@ -38,6 +38,7 @@ from ietf.utils.mail import outbox, empty_outbox, parseaddr, on_behalf_of, get_p
from ietf.utils.test_utils import login_testing_unauthorized, reload_db_objects
from ietf.utils.test_utils import TestCase
from ietf.utils.text import strip_prefix, xslugify
from django.utils.html import escape
class ReviewTests(TestCase):
def setUp(self):
@ -175,7 +176,7 @@ class ReviewTests(TestCase):
self.assertContains(r, review_req.team.name)
try:
# FIXME-LARS
self.assertContains(r, author.name)
self.assertContains(r, escape(author.name))
except:
print(r.content)
self.assertContains(r, author.name)

View file

@ -574,7 +574,7 @@ def lastcalltext(request, name):
e.save()
# make sure form has the updated text
form = LastCallTextForm(initial=dict(last_call_text=e.text))
form = LastCallTextForm(initial=dict(last_call_text=escape(e.text)))
s = doc.get_state("draft-iesg")
@ -813,7 +813,7 @@ def ballot_approvaltext(request, name):
e.save()
# make sure form has the updated text
form = ApprovalTextForm(initial=dict(approval_text=e.text))
form = ApprovalTextForm(initial=dict(approval_text=escape(e.text)))
can_announce = doc.get_state("draft-iesg").order > 19
need_intended_status = ""

View file

@ -556,8 +556,8 @@ def review_announcement_text(request, name):
(existing, existing_new_work) = default_review_text(group, charter, by)
existing.save()
existing_new_work.save()
form = ReviewAnnouncementTextForm(initial=dict(announcement_text=existing.text,
new_work_text=existing_new_work.text))
form = ReviewAnnouncementTextForm(initial=dict(announcement_text=escape(existing.text),
new_work_text=escape(existing_new_work.text)))
if any(x in request.POST for x in ['send_annc_only','send_nw_only','send_both']) and form.is_valid():
if any(x in request.POST for x in ['send_annc_only','send_both']):
@ -613,7 +613,7 @@ def action_announcement_text(request, name):
if "regenerate_text" in request.POST:
e = default_action_text(group, charter, by)
e.save()
form = ActionAnnouncementTextForm(initial=dict(announcement_text=e.text))
form = ActionAnnouncementTextForm(initial=dict(announcement_text=escape(e.text)))
if "send_text" in request.POST and form.is_valid():
parsed_msg = send_mail_preformatted(request, form.cleaned_data['announcement_text'])

View file

@ -716,7 +716,7 @@ def last_call(request, name):
if "regenerate_last_call_text" in request.POST:
e = generate_last_call_text(request,status_change)
form = LastCallTextForm(initial=dict(last_call_text=e.text))
form = LastCallTextForm(initial=dict(last_call_text=escape(e.text)))
return render(request, 'doc/status_change/last_call.html',
dict(doc=status_change,

View file

@ -1527,7 +1527,7 @@ class DatelessMilestoneTests(TestCase):
r = self.client.get(url)
self.assertEqual(r.status_code, 200)
q = PyQuery(r.content)
self.assertEqual(q('#switch-date-use-form button').attr('style'), 'display:none;')
self.assertTrue(q('#switch-date-use-form button').hasClass('d-none'))
ms.group.charter.rev='00-00'
ms.group.charter.save()

View file

@ -744,17 +744,17 @@ def login(request, extra_context=None):
logout(request)
response = render(request, 'registration/missing_person.html')
if require_consent:
messages.warning(request, mark_safe("""
messages.warning(request, mark_safe('''
You have personal information associated with your account which is not
derived from draft submissions or other ietf work, namely: %s. Please go
to your <a href='/accounts/profile'>account profile</a> and review your
to your <a href="/accounts/profile">account profile</a> and review your
personal information, then scoll to the bottom and check the 'confirm'
checkbox and submit the form, in order to to indicate that that the
provided personal information may be used and displayed within the IETF
datatracker.
""" % ', '.join(require_consent)))
''' % ', '.join(require_consent)))
return response
@login_required
@ -816,4 +816,4 @@ def apikey_disable(request):
messages.error(request, "Key validation failed; key not disabled")
else:
form = KeyDeleteForm(request.GET)
return render(request, 'form.html', {'form':form, 'title':"Disable a personal API key", 'description':'', 'button':'Disable key'})
return render(request, 'form.html', {'form':form, 'title':"Disable a personal API key", 'description':'', 'button':'Disable key'})

View file

@ -317,7 +317,7 @@ class LiaisonManagementTests(TestCase):
r = self.client.get(url)
self.assertEqual(r.status_code, 200)
q = PyQuery(r.content)
self.assertEqual(len(q('form input[name=do_action_taken]')), 0)
self.assertEqual(len(q('form button[name=do_action_taken]')), 0)
# log in and get
self.client.login(username="secretary", password="secretary+password")
@ -325,13 +325,13 @@ class LiaisonManagementTests(TestCase):
r = self.client.get(url)
self.assertEqual(r.status_code, 200)
q = PyQuery(r.content)
self.assertEqual(len(q('form input[name=do_action_taken]')), 1)
self.assertEqual(len(q('form button[name=do_action_taken]')), 1)
# mark action taken
r = self.client.post(url, dict(do_action_taken="1"))
self.assertEqual(r.status_code, 200)
q = PyQuery(r.content)
self.assertEqual(len(q('form input[name=do_action_taken]')), 0)
self.assertEqual(len(q('form button[name=do_action_taken]')), 0)
liaison = LiaisonStatement.objects.get(id=liaison.id)
self.assertTrue(liaison.action_taken)
@ -357,7 +357,7 @@ class LiaisonManagementTests(TestCase):
self.assertEqual(r.status_code, 200)
self.assertContains(r, liaison.title)
q = PyQuery(r.content)
self.assertEqual(len(q('form input[name=approved]')), 0)
self.assertEqual(len(q('form button[name=approved]')), 0)
# check the detail page / authorized
self.client.login(username="ulm-liaiman", password="ulm-liaiman+password")
@ -368,7 +368,7 @@ class LiaisonManagementTests(TestCase):
from ietf.liaisons.utils import can_edit_liaison
user = User.objects.get(username='ulm-liaiman')
self.assertTrue(can_edit_liaison(user, liaison))
self.assertEqual(len(q('form input[name=approved]')), 1)
self.assertEqual(len(q('form button[name=approved]')), 1)
# approve
mailbox_before = len(outbox)

View file

@ -18,21 +18,21 @@ class ButtonWidget(Widget):
super(ButtonWidget, self).__init__(*args, **kwargs)
def render(self, name, value, **kwargs):
html = '<span style="display: none;" class="showAttachsOn">%s</span>' % conditional_escape(self.show_on)
html += '<span style="display: none;" class="attachEnabledLabel">%s</span>' % conditional_escape(self.label)
html = '<span class="d-none showAttachsOn">%s</span>' % conditional_escape(self.show_on)
html += '<span class="d-none attachEnabledLabel">%s</span>' % conditional_escape(self.label)
if self.require:
for i in self.require:
html += '<span style="display: none;" class="attachRequiredField">%s</span>' % conditional_escape(i)
html += '<span class="d-none attachRequiredField">%s</span>' % conditional_escape(i)
required_str = 'Please fill in %s to attach a new file' % conditional_escape(self.required_label)
html += '<span style="display: none;" class="attachDisabledLabel">%s</span>' % conditional_escape(required_str)
html += '<input type="button" class="addAttachmentWidget btn btn-primary btn-sm" value="%s">' % conditional_escape(self.label)
html += '<span class="d-none attachDisabledLabel">%s</span>' % conditional_escape(required_str)
html += '<button type="button" class="addAttachmentWidget btn btn-primary btn-sm">%s</button>' % conditional_escape(self.label)
return mark_safe(html)
class ShowAttachmentsWidget(Widget):
def render(self, name, value, **kwargs):
html = '<div id="id_%s">' % name
html += '<span style="display: none;" class="showAttachmentsEmpty form-control widget">No files attached</span>'
html += '<span class="d-none showAttachmentsEmpty form-control widget">No files attached</span>'
html += '<div class="attachedFiles form-control widget">'
if value and isinstance(value, QuerySet):
for attachment in value:

View file

@ -3001,7 +3001,7 @@ def ajax_get_utc(request):
utc_day_offset = (naive_utc_dt.date() - dt.date()).days
html = "<span>{utc} UTC</span>".format(utc=utc)
if utc_day_offset != 0:
html = html + "<span class='day-offset'> {0:+d} Day</span>".format(utc_day_offset)
html = html + '<span class="day-offset"> {0:+d} Day</span>'.format(utc_day_offset)
context_data = {'timezone': timezone,
'time': time,
'utc': utc,

View file

@ -117,7 +117,7 @@ class SessionForm(forms.Form):
self._add_widget_class(constraint_field.widget, 'wg_constraint')
selector_field = forms.ChoiceField(choices=group_acronym_choices, required=False)
selector_field.widget.attrs['data-slug'] = constraintname.slug # used by onChange handler
selector_field.widget.attrs['data-slug'] = constraintname.slug # used by onchange handler
self._add_widget_class(selector_field.widget, 'wg_constraint_selector')
cfield_id = 'constraint_{}'.format(constraintname.slug)
@ -150,7 +150,7 @@ class SessionForm(forms.Form):
field_id)
)
self.fields['joint_with_groups_selector'].widget.attrs['onChange'] = "document.form_post.joint_with_groups.value=document.form_post.joint_with_groups.value + ' ' + this.options[this.selectedIndex].value; return 1;"
self.fields['joint_with_groups_selector'].widget.attrs['onchange'] = "document.form_post.joint_with_groups.value=document.form_post.joint_with_groups.value + ' ' + this.options[this.selectedIndex].value; return 1;"
self.fields["resources"].choices = [(x.pk,x.desc) for x in ResourceAssociation.objects.filter(name__used=True).order_by('name__order') ]
if self.hidden:

View file

@ -33,7 +33,7 @@ Subject: {{ message.subject }}
<div class="button-group">
<ul id="announcement-button-list">
<li><button type="submit" name="submit" value="Send">Send</button></li>
<li><button onclick="history.go(-1);return false">Back</button></li>
<li><button type="button" onclick="history.go(-1);return false">Back</button></li>
<li><button type="submit" name="submit" value="Cancel">Cancel</button></li>
</ul>
</div> <!-- button-group -->

View file

@ -13,18 +13,20 @@
<form method="post">{% csrf_token %}
<table class="new-style full-width amstable" id="announce-table">
<tbody>
{% if form.non_field_errors %}{{ form.non_field_errors }}{% endif %}
{% for field in form.visible_fields %}
<tr>
<th>{{ field.label_tag }}{% if field.field.required %}<span class="required"> *</span>{% endif %}</th>
<th scope="row">{{ field.label_tag }}{% if field.field.required %}<span class="required"> *</span>{% endif %}</th>
<td>{{ field.errors }}{{ field }}{% if field.help_text %}<br>{{ field.help_text }}{% endif %}</td>
</tr>
{% endfor %}
</tbody>
</table>
<div class="button-group">
<ul id="announcement-button-list">
<li><button type="submit" name="submit" value="Continue">Continue</button></li>
<li><button onclick="window.location='../'" value="Cancel">Cancel</button></li>
<li><button type="button" onclick="window.location='../'" value="Cancel">Cancel</button></li>
</ul>
</div> <!-- button-group -->

View file

@ -17,9 +17,9 @@
<table id="areas-list-table" class="full-width">
<thead>
<tr>
<th>Name</th>
<th>Acronym</th>
<th>Status</th>
<th scope="col">Name</th>
<th scope="col">Acronym</th>
<th scope="col">Status</th>
</tr>
</thead>
<tbody>

View file

@ -3,7 +3,7 @@
{% block title %}Areas - People{% endblock %}
{% block extrahead %}{{ block.super }}
<link rel="stylesheet" href="{% static 'ietf/css/jquery-ui.css' %}" />
<link rel="stylesheet" href="{% static 'ietf/css/jquery-ui.css' %}">
<script src="{% static 'ietf/js/jquery-ui.js' %}"></script>
<script src="{% static 'secr/js/utils.js' %}"></script>
{% endblock %}
@ -21,15 +21,15 @@
<table class="center">
{% for director in directors %}
<form action="modify/" method="post">{% csrf_token %}
<input type="hidden" name="tag" value="{{ director.person.id }}" />
<input type="hidden" name="tag" value="{{ director.person.id }}">
<tr>
<td id="id-ad-name"><a href="#">{{ director.person.name }}</a></td>
<td>{% if director.name.slug == "ad" %}
Voting Enabled
{% else %}
<input type="submit" name="submit" value="Enable Voting" /></td>
<button type="submit" name="submit">Enable Voting</button></td>
{% endif %}
<td><input type="submit" name="submit" value="Retire" /></td>
<td><button type="submit" name="submit">Retire</button></td>
</tr>
</form>
{% endfor %}
@ -40,18 +40,21 @@
<p>
<form action="." method="post">{% csrf_token %}
<table class="center">
<tbody>
<!-- [html-validate-disable-block element-required-attributes -- FIXME: as_table renders without scope] -->
{{ form.as_table }}
<tr>
<td></td>
<td><input type="submit" name="submit" value="Add" /></td>
<td><button type="submit" name="submit">Add</button></td>
</tr>
</tbody>
</table>
</form>
</div> <!-- iniline-related -->
<div class="button-group">
<ul>
<li><button onclick="history.go(-1);return true">Back</button></li>
<li><button type="button" onclick="history.go(-1);return true">Back</button></li>
</ul>
</div> <!-- button-group -->
</div> <!-- module -->

View file

@ -16,7 +16,7 @@
<div class="module">
<h2>Area - View</h2>
<table class="full-width">
<tbody>
<tr><td>Area Acronym:</td><td>{{ area.acronym }}</td></tr>
<tr><td>Area Name:</td><td>{{ area.name }}</td></tr>
<tr><td>Status:</td><td>{{ area.state }}</td></tr>
@ -24,23 +24,26 @@
<tr><td>Concluded Date:</td><td>{{ area.concluded_date|date:"Y-m-d" }}</td></tr>
<tr><td>Last Modified Date:</td><td>{{ area.time|date:"Y-m-d" }}</td></tr>
<tr><td>Comments:</td><td>{{ area.comments}}</td></tr>
</tbody>
</table>
<div class="inline-related">
<h2>Directors</h2>
<table class="full-width">
<tbody>
{% for director in directors %}
<tr><td><a href="{% url 'ietf.secr.rolodex.views.view' id=director.person.id %}">{{ director.person.name }}</a>{% if director.name.slug == "pre-ad" %} (Incoming){% endif %}</td></tr>
{% endfor %}
</tbody>
</table>
</div> <!-- inline-group -->
<div class="button-group">
<ul>
<!-- <li><button onclick="window.location='../../'">Back</button></li> -->
<li><button onclick="window.location='edit/'">Edit</button></li>
<li><button onclick="window.location='people/'">People</button></li>
<li><button onclick="window.location='{% url 'ietf.secr.groups.views.search' %}?primary_area={{ area.id }}'">Groups</button></li>
<!-- <li><button type="button" onclick="window.location='../../'">Back</button></li> -->
<li><button type="button" onclick="window.location='edit/'">Edit</button></li>
<li><button type="button" onclick="window.location='people/'">People</button></li>
<li><button type="button" onclick="window.location='{% url 'ietf.secr.groups.views.search' %}?primary_area={{ area.id }}'">Groups</button></li>
</ul>
</div> <!-- button-group -->
</div> <!-- module -->

View file

@ -1,18 +1,18 @@
<!doctype html>
<!DOCTYPE html>
{% load staticfiles %}
<html lang="en">
<head>
<meta charset="utf-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>{% block title %}{% endblock %}</title>
<link rel="stylesheet" href="{% block stylesheet %}{% static 'secr/css/base.css' %}{% endblock %}" />
<link rel="stylesheet" href="{% static 'secr/css/forms.css' %}" />
<link rel="stylesheet" href="{% static 'secr/css/custom.css' %}" />
<link rel="stylesheet" href="{% block stylesheet %}{% static 'secr/css/base.css' %}{% endblock %}">
<link rel="stylesheet" href="{% static 'secr/css/forms.css' %}">
<link rel="stylesheet" href="{% static 'secr/css/custom.css' %}">
<link rel="stylesheet" href="{% static 'ietf/css/ietf.css' %}">
{% if not server_mode == "production" %}
<link rel="stylesheet" href="{% static 'secr/css/test.css' %}" />
<link rel="stylesheet" href="{% static 'secr/css/test.css' %}">
{% endif %}
{% block extrastyle %}{% endblock %}
@ -20,7 +20,7 @@
<script src="{% static 'ietf/js/ietf.js' %}"></script>
{% endblock %}
{% block blockbots %}<meta name="robots" content="NONE,NOARCHIVE" />{% endblock %}
{% block blockbots %}<meta name="robots" content="NONE,NOARCHIVE">{% endblock %}
</head>
<body class="{% if is_popup %}popup {% endif %}{% block bodyclass %}{% endblock %}">
@ -41,6 +41,7 @@
<!-- Breadcrumbs -->
<div class="breadcrumbs">
<table>
<tbody>
<tr>
<td class="text-start">
{% block breadcrumbs %}<a href="/secr/">Home</a>{% endblock %}
@ -49,6 +50,7 @@
{% block instructions %}{% endblock %}
</td>
</tr>
</tbody>
</table>
</div>
<!-- END Breadcrumbs -->
@ -65,6 +67,7 @@
<!-- Content -->
<div id="content" class="{% block coltype %}colM{% endblock %}">
<!-- [html-validate-disable-block input-missing-label -- FIXME: a lot of broken HTML in secr templates] -->
{% block pretitle %}{% endblock %}
{% block content_title %}{% if title %}<h1>{{ title }}</h1>{% endif %}{% endblock %}
{% block content %}
@ -72,7 +75,7 @@
{{ content }}
{% endblock %}
{% block sidebar %}{% endblock %}
<br class="clear" />
<br class="clear">
</div>
<!-- END Content -->

View file

@ -1,17 +1,17 @@
<!doctype html>
<!DOCTYPE html>
{% load staticfiles %}
<html lang="en">
<head>
<meta charset="utf-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<title>{% block title %}{% endblock %}</title>
<link rel="stylesheet" href="{% static 'ietf/css/ietf.css' %}"/>
<link rel="stylesheet" href="{% block stylesheet %}{% static 'secr/css/base.css' %}{% endblock %}" />
<link rel="stylesheet" href="{% static 'secr/css/forms.css' %}" />
<link rel="stylesheet" href="{% static 'secr/css/custom.css' %}" />
<link rel="stylesheet" href="{% static 'ietf/css/ietf.css' %}">
<link rel="stylesheet" href="{% block stylesheet %}{% static 'secr/css/base.css' %}{% endblock %}">
<link rel="stylesheet" href="{% static 'secr/css/forms.css' %}">
<link rel="stylesheet" href="{% static 'secr/css/custom.css' %}">
{% if not server_mode == "production" %}
<link rel="stylesheet" href="{% static 'secr/css/test.css' %}" />
<link rel="stylesheet" href="{% static 'secr/css/test.css' %}">
{% endif %}
{% block extrastyle %}{% endblock %}
@ -19,7 +19,7 @@
<script src="{% static 'ietf/js/ietf.js' %}"></script>
{% endblock %}
{% block blockbots %}<meta name="robots" content="NONE,NOARCHIVE" />{% endblock %}
{% block blockbots %}<meta name="robots" content="NONE,NOARCHIVE">{% endblock %}
</head>
<body class="{% if is_popup %}popup {% endif %}{% block bodyclass %}{% endblock %}">
@ -40,6 +40,7 @@
<!-- Breadcrumbs -->
<div class="breadcrumbs">
<table>
<tbody>
<tr>
<td class="text-start">
{% block breadcrumbs %}<a href="/secr/">Home</a>{% endblock %}
@ -48,6 +49,7 @@
{% block instructions %}{% endblock %}
</td>
</tr>
</tbody>
</table>
</div>
<!-- END Breadcrumbs -->
@ -64,6 +66,7 @@
<!-- Content -->
<div id="content" class="{% block coltype %}colM{% endblock %}">
<!-- [html-validate-disable-block input-missing-label -- FIXME: a lot of broken HTML in secr templates] -->
{% block pretitle %}{% endblock %}
{% block content_title %}{% if title %}<h1>{{ title }}</h1>{% endif %}{% endblock %}
{% block content %}
@ -71,7 +74,7 @@
{{ content }}
{% endblock %}
{% block sidebar %}{% endblock %}
<br class="clear" />
<br class="clear">
</div>
<!-- END Content -->

View file

@ -7,6 +7,7 @@
{% block branding %}
<table>
<tbody>
<tr>
<td class="text-start">
<h1 id="site-name">{% if user|has_role:"Secretariat" %} Secretariat Dashboard {% else %} IETF Dashboard {% endif %}</h1>
@ -16,6 +17,7 @@
<span class="login">{% if user|has_role:"Secretariat" %}Secretariat {% endif %}Logged in: <a href="/accounts/profile/">{{ user }}</a> | <a rel="nofollow" href="/accounts/logout/">Log out</a></span>
</td>
</tr>
</tbody>
</table>
{% endblock %}
@ -31,7 +33,7 @@
</div>
<div id="footer-logo">
<a href="https://www.amsl.com/"><img src="{% static 'secr/images/ams_logo.png' %}" alt="AMS" class="text-end p-3" /></a>
<a href="https://www.amsl.com/"><img src="{% static 'secr/images/ams_logo.png' %}" alt="AMS" class="text-end p-3" ></a>
</div>
</div>
{% endblock %}
{% endblock %}

View file

@ -7,6 +7,7 @@
{% block branding %}
<table>
<tbody>
<tr>
<td class="text-start">
<h1 id="site-name">{% if user|has_role:"Secretariat" %} Secretariat Dashboard {% else %} WG Chair Dashboard {% endif %}</h1>
@ -16,6 +17,7 @@
<span class="login">{% if user|has_role:"Secretariat" %}Secretariat {% endif %}Logged in: <a href="/accounts/profile/">{{ user }}</a> | <a rel="nofollow" href="/accounts/logout/">Log out</a></span>
</td>
</tr>
</tbody>
</table>
{% endblock %}
@ -31,7 +33,7 @@
</div>
<div id="footer-logo">
<a href="https://www.amsl.com/"><img src="{% static 'secr/images/ams_logo.png' %}" alt="AMS" class="text-end p-3" /></a>
<a href="https://www.amsl.com/"><img src="{% static 'secr/images/ams_logo.png' %}" alt="AMS" class="text-end p-3" ></a>
</div>
</div>
{% endblock %}
{% endblock %}

View file

@ -16,7 +16,7 @@
<div>
<p>
<input type="hidden" name="post" value="yes">
<input type="submit" value="Yes, I'm sure">
<button type="submit">Yes, I'm sure</button>
<a href="#" onclick="history.go(-1);return false;" class="button cancel-link">Take me back</a>
</p>
</div>

View file

@ -16,7 +16,7 @@
<div>
<p>
<input type="hidden" name="post" value="yes">
<input type="submit" value="Yes, I'm sure">
<button type="submit">Yes, I'm sure</button>
<a href="#" onclick="history.go(-1);return false;" class="button cancel-link">Take me back</a>
</p>
</div>

View file

@ -12,7 +12,9 @@
<h2>Console</h2>
<table class="full-width amstable" id="announce-table">
<tr><th>Latest DocEvent</th><td>{{ latest_docevent }}</td></tr>
<tbody>
<tr><th scope="row">Latest DocEvent</th><td>{{ latest_docevent }}</td></tr>
</tbody>
</table>
</div> <!-- module -->

View file

@ -4,7 +4,7 @@
{% block title %}Groups - People{% endblock %}
{% block extrahead %}{{ block.super }}
<link rel="stylesheet" href="{% static 'ietf/css/jquery-ui.css' %}" />
<link rel="stylesheet" href="{% static 'ietf/css/jquery-ui.css' %}">
<script src="{% static 'ietf/js/jquery-ui.js' %}"></script>
<script src="{% static 'secr/js/utils.js' %}"></script>
{% endblock %}
@ -22,10 +22,10 @@
<table class="full-width">
<thead>
<tr>
<th>Role</th>
<th>Name</th>
<th>Email</th>
<th>Action</th>
<th scope="col">Role</th>
<th scope="col">Name</th>
<th scope="col">Email</th>
<th scope="col">Action</th>
</tr>
</thead>
{% if group.role_set.all %}
@ -49,19 +49,21 @@
{{ form.non_field_errors }}
{{ form.group_acronym }}
<table class="full-width">
<tbody>
<tr>
<td>{{ form.name.errors }}{{ form.name }}</td>
<td>{{ form.person.errors }}{{ form.person }}{% if form.person.help_text %}<br>{{ form.person.help_text }}{% endif %}</td>
<td>{{ form.email.errors }}{{ form.email }}{% if form.email.help_text %}<br>{{ form.email.help_text }}{% endif %}</td>
<td><input type="submit" name="submit" value="Add" /></td>
<td>{{ form.name.errors }}<label for="{{ form.name.id_for_label }}" aria-label="Name"></label>{{ form.name }}</td>
<td>{{ form.person.errors }}<label for="{{ form.person.id_for_label }}" aria-label="Person"></label>{{ form.person }}{% if form.person.help_text %}<br>{{ form.person.help_text }}{% endif %}</td>
<td>{{ form.email.errors }}<label for="{{ form.email.id_for_label }}" aria-label="Email"></label>{{ form.email }}{% if form.email.help_text %}<br>{{ form.email.help_text }}{% endif %}</td>
<td><button type="submit" name="submit">Add</button></td>
</tr>
</tbody>
</table>
</form>
</div> <!-- inline-related -->
<div class="button-group">
<ul>
<li><button onclick="window.location='../'">Back</button></li>
<li><button type="button" onclick="window.location='../'">Back</button></li>
</ul>
</div> <!-- button-group -->

View file

@ -19,7 +19,10 @@
<h2>Groups - Search</h2>
<form enctype="multipart/form-data" method="post">{% csrf_token %}
<table class="full-width amstable">
{{ form.as_table }}
<tbody>
<!-- [html-validate-disable-block element-required-attributes -- FIXME: as_table renders without scope] -->
{{ form.as_table }}
</tbody>
</table>
{% include "includes/buttons_search.html" %}

View file

@ -18,7 +18,7 @@
<div id="groups-view-col1">
<h2>Groups - View</h2>
<table >
<tbody>
<tr><td>Group Acronym:</td><td>{{ group.acronym }}</td></tr>
<tr><td>Group Name:</td><td>{{ group.name }}</td></tr>
<tr><td>Status:</td><td>{{ group.state }}</td></tr>
@ -56,6 +56,7 @@
{% endif %}
<tr><td>Comments:</td><td>{{ group.comments }}</td></tr>
<tr><td>Last Modified Date:</td><td>{{ group.time }}</td></tr>
</tbody>
</table>
@ -109,11 +110,11 @@
<div class="button-group">
<ul>
<li><button onclick="window.location='edit/'">Edit</button></li>
<li><button onclick="window.location='people/'">People</button></li>
<li><button type="button" onclick="window.location='edit/'">Edit</button></li>
<li><button type="button" onclick="window.location='people/'">People</button></li>
{% comment %}
<li><button onclick="window.location='{% url "sec.ids.views.search" id=group.group_acronym.acronym_id %}'">Drafts</button></li>
<li><button onclick="window.location='{% url "sec.rfcs.views.search" id=group.group_acronym.acronym_id %}'">RFCs</button></li>
<li><button type="button" onclick="window.location='{% url "sec.ids.views.search" id=group.group_acronym.acronym_id %}'">Drafts</button></li>
<li><button type="button" onclick="window.location='{% url "sec.rfcs.views.search" id=group.group_acronym.acronym_id %}'">RFCs</button></li>
{% endcomment %}
</ul>
</div> <!-- button-group -->

View file

@ -3,10 +3,10 @@
<table class="full-width">
<thead>
<tr>
<th>Date</th>
<th>Time</th>
<th>Action</th>
<th>Name</th>
<th scope="col">Date</th>
<th scope="col">Time</th>
<th scope="col">Action</th>
<th scope="col">Name</th>
</tr>
</thead>
<tbody>

View file

@ -1,5 +1,5 @@
<div class="button-group">
<ul>
<li><button onclick="window.location='../'">Back</button></li>
<li><button type="button" onclick="window.location='../'">Back</button></li>
</ul>
</div> <!-- button-group -->

View file

@ -1,11 +1,11 @@
<table id="group-search-results" class="center" cellspacing="0">
<thead>
<tr>
<th>Group Name</th>
<th>Group Acronym</th>
<th>Status</th>
<th>Type</th>
<th>Meeting Scheduled</th>
<th scope="col">Group Name</th>
<th scope="col">Group Acronym</th>
<th scope="col">Status</th>
<th scope="col">Type</th>
<th scope="col">Meeting Scheduled</th>
</tr>
</thead>
<tbody>

View file

@ -2,12 +2,12 @@
<p>Use this to process meeting materials files that have been converted to PDF and uploaded to the server.</p>
<ul class="none">
<li>
<button onclick="window.location='{% url 'ietf.secr.proceedings.views.process_pdfs' meeting_num=meeting.number %}'">Process PDFs</button>
<button type="button" onclick="window.location='{% url 'ietf.secr.proceedings.views.process_pdfs' meeting_num=meeting.number %}'">Process PDFs</button>
&nbsp;&nbsp;<span class="{% if ppt_count > 0 %}alert{% endif %}">{{ ppt_count }} PowerPoint files waiting to be converted</span>
</li>
</ul>
<p>Use this to input session recording information.</p>
<ul class="none">
<li><button onclick="window.location='{% url 'ietf.secr.proceedings.views.recording' meeting_num=meeting.number %}'">Recordings</button>
<li><button type="button" onclick="window.location='{% url 'ietf.secr.proceedings.views.recording' meeting_num=meeting.number %}'">Recordings</button>
</li>
</ul>

View file

@ -1,9 +1,9 @@
<table class="full-width">
<thead>
<tr>
<th>Name</th>
<th>Email</th>
<th>ID</th>
<th scope="col">Name</th>
<th scope="col">Email</th>
<th scope="col">ID</th>
</tr>
</thead>
{% if results %}

View file

@ -5,7 +5,7 @@
{{ form.non_field_errors }}
{% endif %}
<table id="sessions-new-table">
<tbody>
<tr class="bg1"><td>Working Group Name:</td><td>{{ group.name }} ({{ group.acronym }})</td></tr>
<tr class="bg2"><td>Area Name:</td><td>{% if group.parent %}{{ group.parent.name }} ({{ group.parent.acronym }}){% endif %}</td></tr>
<tr class="bg1"><td>Number of Sessions:<span class="required">*</span></td><td>{{ form.num_session.errors }}{{ form.num_session }}</td></tr>
@ -31,6 +31,7 @@
<tr class="bg1"><td>Conflicts to Avoid:</td>
<td>
<table>
<tbody>
<tr>
<td colspan="2">Other WGs that included {{ group.name }} in their conflict lists:</td>
<td>{{ session_conflicts.inbound|default:"None" }}</td>
@ -40,7 +41,7 @@
{% if forloop.first %}<td rowspan="{{ form.wg_constraint_count }}" >WG Sessions:<br>You may select multiple WGs within each category</td>{% endif %}
<td>{{ cname|title }}</td>
<td>{{ cselector }}
<input type="button" id="wg_delete_{{ cname.slug }}" value="Delete the last entry" onClick="ietf_sessions.delete_wg_constraint_clicked('{{ cname.slug }}')"><br>
<button type="button" id="wg_delete_{{ cname.slug }}" onclick="ietf_sessions.delete_wg_constraint_clicked('{{ cname.slug }}')">Delete the last entry</button><br>
{{ cfield.errors }}{{ cfield }}
</td>
</tr>
@ -64,6 +65,7 @@
<td colspan="2">BOF Sessions:</td>
<td>If the sessions can not be found in the fields above, please enter free form requests in the Special Requests field below.</td>
</tr>
</tbody>
</table>
</td>
</tr>
@ -77,22 +79,23 @@
</tr>
<tr class="bg1">
<td>Times during which this WG can <strong>not</strong> meet:</td>
<!-- [html-validate-disable-block no-redundant-for -- FIXME: form renders with redundant for attributes] -->
<td>{{ form.timeranges.errors }}{{ form.timeranges }}</td>
</tr>
<tr class="bg2">
<td>
Plan session adjacent with another WG:<br />
Plan session adjacent with another WG:<br>
(Immediately before or after another WG, no break in between, in the same room.)
</td>
<td>{{ form.adjacent_with_wg.errors }}{{ form.adjacent_with_wg }}</td>
</tr>
<tr class="bg1">
<td>
Joint session with:<br />
Joint session with:<br>
(To request one session for multiple WGs together.)
</td>
<td>{{ form.joint_with_groups_selector }}
<input type="button" value="Delete the last entry" onClick="ietf_sessions.delete_last_joint_with_groups(); return 1;"><br>
<button type="button" onclick="ietf_sessions.delete_last_joint_with_groups(); return 1;">Delete the last entry</button><br>
{{ form.joint_with_groups.errors }}{{ form.joint_with_groups }}
</td>
</tr>
@ -106,9 +109,10 @@
{% endif %}
<tr class="bg2">
<td>Special Requests:<br />&nbsp;<br />i.e. restrictions on meeting times / days, etc.<br /> (limit 200 characters)</td>
<td>Special Requests:<br>&nbsp;<br>i.e. restrictions on meeting times / days, etc.<br> (limit 200 characters)</td>
<td>{{ form.comments.errors }}{{ form.comments }}</td>
</tr>
</tbody>
</table>
<div class="button-group">

View file

@ -1,6 +1,6 @@
{% load ams_filters %}
<table class="full-width">
<tbody>
<tr class="row1"><td>Working Group Name:</td><td>{{ group.name }} ({{ group.acronym }})</td></tr>
<tr class="row2"><td>Area Name:</td><td>{{ group.parent }}</td></tr>
<tr class="row1"><td>Number of Sessions Requested:</td><td>{% if session.third_session %}3{% else %}{{ session.num_session }}{% endif %}</td></tr>
@ -15,9 +15,11 @@
<td>
{% if session_conflicts.outbound %}
<table>
<tbody>
{% for conflict in session_conflicts.outbound %}
<tr><td>{{ conflict.name|title }}: </td><td>{{ conflict.groups }}</td></tr>
{% endfor %}
</tbody>
</table>
{% else %}<i>None</i>{% endif %}
</td>
@ -57,4 +59,5 @@
</tr>
{% endif %}
<tr class="row1"><td>Special Requests:</td><td>{{ session.comments }}</td></tr>
</table>
</tbody>
</table>

View file

@ -2,5 +2,5 @@
<li><a href="https://www.ietf.org/instructions/meeting_materials_tool.html" target="_blank">Instructions</a>.</li>
<li>If you require assistance in using this tool, or wish to report a bug, then please send a message to <a href="mailto:{{settings.SECRETARIAT_ACTION_EMAIL}}">ietf-action@ietf.org</a>.</li>
<li>To submit your materials via email, please send agendas to <a href="mailto:agenda@ietf.org">agenda@ietf.org</a> and minutes/presentation slides to <a href="mailto:proceedings@ietf.org">proceedings@ietf.org</a>.</li>
<li><b>Note:</b> Normal session materials materials management is now performed using the {% if meeting.number %}<a href="{% url 'ietf.meeting.views.materials' num=meeting.number %}">{% endif %}materials page{% if meeting.number %}</a>{% endif %}
</ul>
<li><b>Note:</b> Normal session materials materials management is now performed using the {% if meeting.number %}<a href="{% url 'ietf.meeting.views.materials' num=meeting.number %}">{% endif %}materials page{% if meeting.number %}</a>{% endif %}</li>
</ul>

View file

@ -7,9 +7,10 @@
{% if user|has_role:"Secretariat" %}
<table class="menu">
<tbody>
<tr>
<td>
<h3>IESG</h3>
<h2>IESG</h2>
<ul>
<li> <a href="{% url 'ietf.secr.announcement.views.main' %}"><b>Announcement</b></a></li>
<li> <a href="{% url 'ietf.secr.telechat.views.main' %}"><b>Telechat</b></a></li>
@ -17,7 +18,7 @@
</ul>
</td>
<td>
<h3>IDs and WGs Process</h3>
<h2>IDs and WGs Process</h2>
<ul>
<li> <a href="{% url "ietf.secr.areas.views.list_areas" %}"><b>Areas</b></a></li>
<li> <a href="{% url 'ietf.secr.groups.views.search' %}"><b>Groups</b></a></li>
@ -28,7 +29,7 @@
</tr>
<tr>
<td>
<h3>Meetings and Proceedings</h3>
<h2>Meetings and Proceedings</h2>
<ul>
<li> <a href="{% url "ietf.secr.sreq.views.main" %}"><b>Session Requests</b></a></li>
<li> <a href="{% url 'ietf.secr.proceedings.views.main' %}"><b>Meeting Materials Manager (Proceedings)</b></a></li>
@ -37,20 +38,22 @@
</ul>
</td>
<td>
<h3>IPR</h3>
<h2>IPR</h2>
<ul>
<li> <a href="{% url 'ietf.ipr.views.admin' state='pending' %}"><b>IPR Admin</b></a></li>
</ul>
</td>
</tr>
</tbody>
</table>
{% else %}
<table class="menu">
<tbody>
<tr>
<td>
<h3>Section 1</h3>
<h2>Section 1</h2>
<ul>
<li> <a href="{% url "ietf.secr.sreq.views.main" %}"><b>Session Requests</b></a></li>
<li> <a href="{% url 'ietf.secr.proceedings.views.main' %}"><b>Meeting Material Manager</b></a></li>
@ -58,17 +61,18 @@
</ul>
</td>
<td>
<h3>Section 2</h3>
<h2>Section 2</h2>
</td>
</tr>
<tr>
<td>
<h3>Section 3</h3>
<h2>Section 3</h2>
</td>
<td>
<h3>Section 4</h3>
<h2>Section 4</h2>
</td>
</tr>
</tbody>
</table>
{% endif %}

View file

@ -18,7 +18,10 @@
<h2>Proceedings - Add</h2>
<form id="proceedings-add-form" enctype="multipart/form-data" method="post">{% csrf_token %}
<table id="proceedings-add-table">
<tbody>
<!-- [html-validate-disable-block element-required-attributes, no-redundant-for -- FIXME: as_table renders without scope] -->
{{ form.as_table }}
</tbody>
</table>
{% include "includes/buttons_save_cancel.html"%}
</form>

View file

@ -4,7 +4,7 @@
{% block title %}Meetings{% endblock %}
{% block extrahead %}{{ block.super }}
<link rel="stylesheet" href="{% static 'ietf/css/jquery-ui.css' %}" />
<link rel="stylesheet" href="{% static 'ietf/css/jquery-ui.css' %}">
<script src="{% static 'ietf/js/jquery-ui.js' %}"></script>
<script src="{% static 'secr/js/utils.js' %}"></script>
<script src="{% static 'secr/js/dynamic_inlines.js' %}"></script>

View file

@ -21,8 +21,8 @@
<p>Use this to generate blue sheets for meeting sessions.</p>
<ul class="none">
<li>
<form style="display:inline" method="post" action="{% url "ietf.secr.meetings.views.blue_sheet_generate" meeting_id=meeting.number%}">{% csrf_token %}
<input type="submit" value="Generate Blue Sheets">
<form class="d-inline" method="post" action="{% url "ietf.secr.meetings.views.blue_sheet_generate" meeting_id=meeting.number%}">{% csrf_token %}
<button type="submit">Generate Blue Sheets</button>
</form>
&nbsp;&nbsp;Last run:
{% if last_run %}
@ -35,15 +35,14 @@
<p>Use this to download the blue sheets from the server.</p>
<ul class="none">
<li>
<button onclick="window.location='{{ url }}'">Download Blue Sheets</button>
<button type="button" onclick="window.location='{{ url }}'">Download Blue Sheets</button>
</li>
</ul>
<hr />
<hr>
<p>
Use the session details page for a group to upload scanned bluesheets. The session details pages for a group can be reached from the meeting's <a href="{% url 'ietf.meeting.views.materials' num=meeting.number %}">materials page</a>.
</p>
</div> <!-- module -->
{% endblock %}

View file

@ -19,7 +19,10 @@
<form action="." method="post">{% csrf_token %}
<h2>Meetings - Edit</h2>
<table id="proceedings-edit-table">
<tbody>
<!-- [html-validate-disable-block element-required-attributes -- FIXME: as_table renders without scope] -->
{{ form.as_table }}
</tbody>
</table>
{% include "includes/buttons_save_cancel.html"%}
@ -28,4 +31,3 @@
</div> <!-- module -->
{% endblock %}

View file

@ -29,9 +29,12 @@
<br>
<form method="post">{% csrf_token %}
<table>
{{ form }}
<tbody>
<!-- [html-validate-disable-block element-required-attributes -- FIXME: as_table renders without scope] -->
{{ form.as_table }}
</tbody>
</table>
<input type="submit" value="Select" />
<button type="submit">Select</button>
</form>
</div> <!-- inline-related -->
</div> <!-- module -->

View file

@ -7,7 +7,10 @@
<h3>Session: {{ slot.name }}</h3>
<form id="misc-session-edit-form" enctype="multipart/form-data" action="." method="post">{% csrf_token %}
<table class="full-width amstable">
<tbody>
<!-- [html-validate-disable-block element-required-attributes -- FIXME: as_table renders without scope] -->
{{ form.as_table }}
</tbody>
</table>
<div class="button-group">

View file

@ -9,17 +9,17 @@
<table id="misc-sessions" class="full-width">
<thead>
<tr>
<th>Day</th>
<th>Time</th>
<th>Name</th>
<th>Short Name</th>
<th>Group</th>
<th>Location</th>
<th>Show Loc.</th>
<th>Type</th>
<th></th>
<th></th>
<th></th>
<th scope="col">Day</th>
<th scope="col">Time</th>
<th scope="col">Name</th>
<th scope="col">Short Name</th>
<th scope="col">Group</th>
<th scope="col">Location</th>
<th scope="col">Show Loc.</th>
<th scope="col">Type</th>
<th scope="col"></th>
<th scope="col"></th>
<th scope="col"></th>
</tr>
</thead>
<tbody>
@ -51,21 +51,23 @@
{% else %}
<h3>No timeslots exist for this meeting. Add rooms with the "duplicate timeslots" option enabled to copy timeslots from the last meeting.</h3>
{% endif %}
<br /><hr />
<br><hr>
<div>
<form id="timeslot-form" method="post">{% csrf_token %}
<table class="full-width amstable">
<tbody>
<!-- [html-validate-disable-block element-required-attributes -- FIXME: as_table renders without scope] -->
{{ form.as_table }}
<tr><td colspan="2" class="text-center"><input type="submit" name="submit" value="Add" /></td></tr>
<tr><td colspan="2" class="text-center"><button type="submit" name="submit">Add</button></td></tr>
</tbody>
</table>
</form>
</div>
<div class="button-group">
<ul>
<li><button onclick="window.location='../'">Back</button></li>
<li><button type="button" onclick="window.location='../'">Back</button></li>
</ul>
</div> <!-- button-group -->

View file

@ -19,8 +19,8 @@
<h2>IETF {{ meeting.number }} - Send Notifications</h2>
<form id="id_notification_form" action="." method="post">{% csrf_token %}
<p>The following groups are in state 'schedw' (Waiting for scheduling). Pressing the Send Now button will change them to be in state 'sched' (Scheduled), and send email notifications each of them that their session has been scheduled. The last time this button was pressed was {{ last_notice.time|date:"Y-m-d" }}:</p>
<p id="id_notification_list">{% if not groups %}(none){% endif %}{% for group in groups %}{{ group.acronym }}{% if not forloop.last %}, {% endif %}{% endfor %}<p>
<input type="submit" value="Send Now" name="submit" onclick="return window.confirm('Are you sure you want to send notifications?');">
<p id="id_notification_list">{% if not groups %}(none){% endif %}{% for group in groups %}{{ group.acronym }}{% if not forloop.last %}, {% endif %}{% endfor %}</p>
<button type="submit" name="submit" onclick="return window.confirm('Are you sure you want to send notifications?');">Send Now</button>
</form>
{% include "includes/buttons_back.html" %}
@ -28,26 +28,3 @@
</div> <!-- module -->
{% endblock %}

View file

@ -20,24 +20,26 @@
<form id="meetings-schedule-form" method="post">{% csrf_token %}
<div class="inline-related{% if forloop.last %} last-related{% endif %}">
<table class="full-width amstable">
<tbody>
<tr>
<th>Day:</th>
<th scope="row">Day:</th>
<td>{% if timeslot %}{{ timeslot.time|date:"l" }}{% endif %}</td>
</tr>
<tr>
<th>Time:</th>
<th scope="row">Time:</th>
<td>{% if timeslot %}{{ timeslot.time|time:"H:i" }}{% endif %}</td>
</tr>
<tr>
<th>Room:</th>
<th scope="row">Room:</th>
<td>{% if timeslot %}{{ timeslot.location.name }}{% endif %}</td>
</tr>
<tr>
<th>Status:</th>
<th scope="row">Status:</th>
<td>{{ current_status_name }}</td>
</tr>
{{ form }}
<!-- [html-validate-disable-block element-required-attributes -- FIXME: as_table renders without scope] -->
{{ form.as_table }}
</tbody>
</table>
</div> <!-- inline-related -->

View file

@ -8,6 +8,7 @@
<div class="inline-group">
<div class="tabular inline-related">
<!-- [html-validate-disable-block wcag/h32 -- FIXME: no submit button] -->
<form id="meetings-meta-rooms" method="post">{% csrf_token %}
{{ formset.management_form }}
{{ formset.non_form_errors }}
@ -16,9 +17,9 @@
<table id="id_rooms_table" class="full-width">
<thead>
<tr>
<th></th>
<th scope="col"></th>
{% for field in formset.forms.0.visible_fields %}
<th>{{ field.label|capfirst }}</th>
<th scope="col">{{ field.label|capfirst }}</th>
{% endfor %}
</tr>
</thead>

View file

@ -9,13 +9,13 @@
<table class="table table-sm table-striped ipr-table tablesorter">
<thead>
<tr>
<th>Group</th>
<th>Time</th>
<th>Room</th>
<th>Agenda Note</th>
<th>Status</th>
<th></th>
<th></th>
<th scope="col">Group</th>
<th scope="col">Time</th>
<th scope="col">Room</th>
<th scope="col">Agenda Note</th>
<th scope="col">Status</th>
<th scope="col"></th>
<th scope="col"></th>
</tr>
</thead>
<tbody>
@ -40,7 +40,7 @@
<form method="post">
{% csrf_token %}
<input type="hidden" name="pk" value="{{ session.pk }}">
<input type="submit" name="cancel" value="Cancel">
<button type="submit" name="cancel">Cancel</button>
</form>
{% endif %}
</td>

View file

@ -9,11 +9,11 @@
<table class="full-width">
<thead>
<tr>
<th>Day</th>
<th>Time</th>
<th>Name</th>
<th></th>
<th></th>
<th scope="col">Day</th>
<th scope="col">Time</th>
<th scope="col">Name</th>
<th scope="col"></th>
<th scope="col"></th>
</tr>
</thead>
<tbody>
@ -31,24 +31,26 @@
{% else %}
<h3>No timeslots exist for this meeting. Add rooms with the "duplicate timeslots" option enabled to copy timeslots from the last meeting.</h3>
{% endif %}
<br /><hr />
<br><hr>
<form method="post">{% csrf_token %}
{{ form.non_field_errors }}
<table id="timeslot-form" class="full-width">
<tbody>
<tr>
<td>Day<br>{{ form.day.errors }}{{ form.day }}</td>
<td>Time<br>{{ form.time.errors }}{{ form.time }}</td>
<td>Duration<br>{{ form.duration.errors }}{{ form.duration }}</td>
<td>Name<br>{{ form.name.errors }}{{ form.name }}</td>
<td><input type="submit" name="submit" value="Add" /></td>
<td><button type="submit" name="submit">Add</button></td>
</tr>
</tbody>
</table>
</form>
<div class="button-group">
<ul>
<li><button onclick="window.location='../'">Back</button></li>
<li><button type="button" onclick="window.location='../'">Back</button></li>
</ul>
</div>

View file

@ -7,7 +7,10 @@
<p><h3>TimeSlot:</h3></p>
<form id="times-edit-form" enctype="multipart/form-data" action="." method="post">{% csrf_token %}
<table class="full-width amstable">
{{ form.as_table }}
<tbody>
<!-- [html-validate-disable-block element-required-attributes -- FIXME: as_table renders without scope] -->
{{ form.as_table }}
</tbody>
</table>
{% include "includes/buttons_save_cancel.html" %}

View file

@ -20,6 +20,7 @@
<ul class="errorlist"><li> THIS IS A FROZEN PROCEEDING</li></ul>
{% endif %}
<table class="full-width" id="proceedings-view-first-col">
<tbody>
<tr><td>Start Date:</td><td> {{ meeting.date }}</td></tr>
<tr><td>City:</td><td> {{ meeting.city }} </td></tr>
<tr><td>Country:</td><td> {{ meeting.country }} </td></tr>
@ -28,16 +29,18 @@
<tr><td>Venue Address:</td><td> {{ meeting.venue_addr }} </td></tr>
<tr><td>Break Area:</td><td> {{ meeting.break_area }} </td></tr>
<tr><td>Registration Area:</td><td> {{ meeting.reg_area }} </td></tr>
</tbody>
</table>
<div class="button-group">
<ul>
<li><button onclick="window.location='{% url "ietf.secr.meetings.views.edit_meeting" meeting_id=meeting.number %}'">Edit</button></li>
<li><button onclick="window.location='{% url "ietf.secr.meetings.views.notifications" meeting_id=meeting.number %}'">Notifications</button></li>
<li><button onclick="window.location='{% url "ietf.secr.meetings.views.blue_sheet" meeting_id=meeting.number %}'">Blue Sheets</button></li>
<li><button onclick="window.location='{% url "ietf.meeting.views.list_schedules" num=meeting.number %}'">Agenda List</button></li>
<li><button type="button" onclick="window.location='{% url "ietf.secr.meetings.views.edit_meeting" meeting_id=meeting.number %}'">Edit</button></li>
<li><button type="button" onclick="window.location='{% url "ietf.secr.meetings.views.notifications" meeting_id=meeting.number %}'">Notifications</button></li>
<li><button type="button" onclick="window.location='{% url "ietf.secr.meetings.views.blue_sheet" meeting_id=meeting.number %}'">Blue Sheets</button></li>
<li><button type="button" onclick="window.location='{% url "ietf.meeting.views.list_schedules" num=meeting.number %}'">Agenda List</button></li>
<li>
<!-- [html-validate-disable-block wcag/h32 -- FIXME: no submit button] -->
<form id="id_schedule_selector">
<select name="forma" onchange="location = this.options[this.selectedIndex].value;">
<option value="">Select a schedule...</option>
@ -48,7 +51,7 @@
</form>
</li>
{% if meeting.schedule %}
<li><button onclick="window.location='{% url "ietf.secr.meetings.views.rooms" meeting_id=meeting.number schedule_name=meeting.schedule.name %}'">Official Schedule</button></li>
<li><button type="button" onclick="window.location='{% url "ietf.secr.meetings.views.rooms" meeting_id=meeting.number schedule_name=meeting.schedule.name %}'">Official Schedule</button></li>
{% endif %}
</ul>
</div> <!-- button-group -->

View file

@ -12,7 +12,7 @@
</tr>
{% for meeting in meetings %}
<tr class="{% cycle 'row1' 'row2' %}">
<td class="text-start" style="white-space: nowrap">{{ meeting.date }}</td>
<td class="text-start text-nowrap">{{ meeting.date }}</td>
<td><a href="https://datatracker.ietf.org/wg/{{ meeting.group.acronym }}">{{ meeting.group.acronym }}</a></td>
{% if meeting.schedule %}
<td class="text-center"><a href="{{ meeting.schedule.get_absolute_url }}">Agenda</a></td>

View file

@ -19,13 +19,13 @@
<table id="proceedings-list-table" class="full-width{% if user|has_role:"Secretariat" %} secretariat{% endif %}">
<thead>
<tr>
<th>IETF Meeting</th>
<th scope="col">IETF Meeting</th>
</tr>
</thead>
{% if meetings %}
<tbody>
{% for meeting in meetings %}
<tr class = "{% cycle 'row1' 'row2' %}{% if meeting.get_submission_correction_date < today %} frozen{% else %} open{% endif %}">
<tr class="{% cycle 'row1' 'row2' %}{% if meeting.get_submission_correction_date < today %} frozen{% else %} open{% endif %}">
<td>
<a href="{% url 'ietf.secr.proceedings.views.select' meeting_num=meeting.number %}">{{ meeting.number }}</a>
</td>
@ -37,7 +37,7 @@
{% if user|has_role:"Secretariat" %}
<div class="button-group">
<ul id="proceedings-meeting-buttons">
<li><button onclick="window.location='{% url "ietf.secr.meetings.views.add" %}'">Add</button></li>
<li><button type="button" onclick="window.location='{% url "ietf.secr.meetings.views.add" %}'">Add</button></li>
</ul>
</div> <!-- button-group -->
{% endif %}
@ -48,14 +48,14 @@
<table id="proceedings-interim-table" class="full-width{% if user|has_role:"Secretariat" %} secretariat{% endif %}">
<thead>
<tr>
<th>Interim Meeting</th>
<th scope="col">Interim Meeting</th>
</tr>
</thead>
{% if interim_meetings %}
<tbody>
{% for meeting in interim_meetings %}
<tr class = "{% cycle 'row1' 'row2' %}">
<tr class="{% cycle 'row1' 'row2' %}">
<td>{{ meeting.group.acronym }}</td>
<td><a href="{% url "ietf.meeting.views.session_details" num=meeting.number acronym=meeting.group.acronym %}">{{ meeting.date }}</a></td>
</tr>
@ -66,7 +66,7 @@
</div> <!-- scroll -->
<div class="button-group">
<ul id="proceedings-interim-buttons">
<li><button onclick="window.location='{% url "ietf.meeting.views.interim_request" %}'">Request Interim Meeting</button></li>
<li><button type="button" onclick="window.location='{% url "ietf.meeting.views.interim_request" %}'">Request Interim Meeting</button></li>
</ul>
</div> <!-- button-group -->
</div>
@ -81,7 +81,7 @@
<div class="button-group">
<ul id="proceedings-button-list">
<li><button onclick="window.location='../'">Back</button></li>
<li><button type="button" onclick="window.location='../'">Back</button></li>
</ul>
</div> <!-- button-group -->
</div> <!-- module -->

View file

@ -4,7 +4,7 @@
{% block title %}Proceedings{% endblock %}
{% block extrastyle %}{{ block.super }}
<link rel="stylesheet" href="{% static 'ietf/css/jquery-ui.css' %}" />
<link rel="stylesheet" href="{% static 'ietf/css/jquery-ui.css' %}">
<link rel="stylesheet" href="{% static 'ietf/css/select2.css' %}">
{% endblock %}
@ -32,7 +32,10 @@
<h2>Recording Metadata</h2>
<form id="recording-form" enctype="multipart/form-data" action="." method="post">{% csrf_token %}
<table class="center" id="proceedings-upload-table">
<tbody>
<!-- [html-validate-disable-block element-required-attributes -- FIXME: as_table renders without scope] -->
{{ form.as_table }}
</tbody>
</table>
<div class="button-group">
@ -49,11 +52,11 @@
<table class="center">
<thead>
<tr>
<th>Group</th>
<th>Session</th>
<th>Name</th>
<th>URL</th>
<th>Edit</th>
<th scope="col">Group</th>
<th scope="col">Session</th>
<th scope="col">Name</th>
<th scope="col">URL</th>
<th scope="col">Edit</th>
</tr>
</thead>
{% if sessions %}
@ -93,7 +96,7 @@
<table class="center">
<thead>
<tr>
<th>Filename</th>
<th scope="col">Filename</th>
</tr>
</thead>
{% if unmatched_recordings %}

View file

@ -27,7 +27,10 @@
<p><h3>Edit Recording Metadata:</h3></p>
<form id="recording-form" method="post">{% csrf_token %}
<table>
<tbody>
<!-- [html-validate-disable-block element-required-attributes -- FIXME: as_table renders without scope] -->
{{ form.as_table }}
</tbody>
</table>
{% include "includes/buttons_save_cancel.html" %}

View file

@ -22,16 +22,16 @@
<table class="center">
<form action="modify/" method="post">{% csrf_token %}
<tr>
<input type="hidden" name="frozen" value="{{ proceeding.frozen }}" />
<input type="hidden" name="frozen" value="{{ proceeding.frozen }}">
{% if not proceeding.frozen %}
<tr>
<td>Active Proceeding</td>
<td><input type="submit" name="submit" value="Freeze" /></td>
<td><button type="submit" name="submit">Freeze</button></td>
{% endif %}
{% if proceeding.frozen %}
<tr>
<td>Frozen Proceeding</td>
<td><input type="submit" name="submit" value="Activate" /></td>
<td><button type="submit" name="submit">Activate</button></td>
{% endif %}
</tr>
</form>
@ -39,10 +39,9 @@
<div class="button-group">
<ul>
<li><button onclick="history.go(-1);return true">Back</button></li>
<li><button type="button" onclick="history.go(-1);return true">Back</button></li>
</ul>
</div> <!-- button-group -->
</div> <!-- module -->
{% endblock %}

View file

@ -19,34 +19,38 @@
<ul class="errorlist"><li> THIS IS A FROZEN PROCEEDING</li></ul>
{% endif %}
<table class="full-width" id="proceedings-view-first-col">
<tbody>
<tr><td>Meeting Start Date:</td><td> {{ meeting.date }}</td></tr>
<tr><td>Meeting End Date:</td><td> {{ meeting.end_date }} </td></tr>
<tr><td>Meeting City:</td><td> {{ meeting.city }} </td></tr>
<tr><td>Meeting Country:</td><td> {{ meeting.country }} </td></tr>
</tbody>
</table>
<div class="inline-related">
<h2>Dates</h2>
<table class="full-width" id="proceedings-view-first-col">
<tbody>
<tr><td>Submission Start Date:</td><td> {{ meeting.get_submission_start_date }} </td></tr>
<tr><td>Submission Cut Off Date:</td><td> {{ meeting.get_submission_cut_off_date }} </td></tr>
<tr><td>Submission Correction Cut Off Date:</td><td> {{ meeting.get_submission_correction_date }} </td></tr>
<tr><td>Progress Report Start:</td><td> {{ meeting.pr_from_date }} </td></tr>
<tr><td>Progress Report End:</td><td> {{ meeting.pr_to_date }} </td></tr>
</tbody>
</table>
</div><!-- inline-related-->
<div class="button-group">
{% if meeting.frozen == 0 %}
<ul>
<li><button onclick="window.location='{% url 'ietf.secr.proceedings.views.select' meeting_num=meeting.number %}'">Upload Materials</button></li>
<li><button onclick="window.location='convert/'">Convert Materials</button></li>
<li><button onclick="window.location='status/'">Proceedings {{ meeting.number }} Status</button></li>
<li><button type="button" onclick="window.location='{% url 'ietf.secr.proceedings.views.select' meeting_num=meeting.number %}'">Upload Materials</button></li>
<li><button type="button" onclick="window.location='convert/'">Convert Materials</button></li>
<li><button type="button" onclick="window.location='status/'">Proceedings {{ meeting.number }} Status</button></li>
</ul>
{% endif %}
{% if meeting.frozen == 1 %}
<ul>
<li><button onclick="window.location='status/'">Proceedings {{ meeting.number }} Status</button></li>
<li><button type="button" onclick="window.location='status/'">Proceedings {{ meeting.number }} Status</button></li>
</ul>
{% endif %}
</div> <!-- button-group -->

View file

@ -14,9 +14,9 @@
<div class="module" >
<h2>Proceedings</h2>
<hr />
<hr>
<h2>{{ message }}</h2>
<img class="loading" src="{% static "secr/images/ajax-loader.webp" %}" alt="loading..." />
<img class="loading" src="{% static "secr/images/ajax-loader.webp" %}" alt="loading...">
</div> <!-- module -->
{% endblock %}

View file

@ -4,7 +4,7 @@
{% block title %}Roles{% endblock %}
{% block extrahead %}{{ block.super }}
<link rel="stylesheet" href="{% static 'ietf/css/jquery-ui.css' %}" />
<link rel="stylesheet" href="{% static 'ietf/css/jquery-ui.css' %}">
<script src="{% static 'ietf/js/jquery-ui.js' %}"></script>
<script src="{% static 'secr/js/utils.js' %}"></script>
@ -16,7 +16,7 @@
$('#id_group').change(function(){
var loadUrl = "/secr/roles/ajax/get-roles/" + $(this).val() + "/";
var ajax_load = '<img class="loading" src="{% static "secr/images/ajax-loader.webp" %}" alt="loading..." />';
var ajax_load = '<img class="loading" src="{% static "secr/images/ajax-loader.webp" %}" alt="loading...">';
var text = $(this).val();
$("#id_group_acronym").val(text);
$("#roles-list").html(ajax_load).load(loadUrl);
@ -59,13 +59,15 @@
{% with role_form as form %}
{{ role_form.non_field_errors }}
<table class="full-width">
<tbody>
<tr>
<td>{{ form.group_acronym.errors }}{{ form.group_acronym }}</td>
<td>{{ form.name.errors }}{{ form.name }}</td>
<td>{{ form.person.errors }}{{ form.person }}{% if form.person.help_text %}<br>{{ form.person.help_text }}{% endif %}</td>
<td>{{ form.email.errors }}{{ form.email }}{% if form.email.help_text %}<br>{{ form.email.help_text }}{% endif %}</td>
<td><input type="submit" name="submit" value="Add" /></td>
<td><button type="submit" name="submit">Add</button></td>
</tr>
</tbody>
</table>
{% endwith %}
</div> <!-- inline-related -->
@ -73,7 +75,7 @@
<div class="button-group">
<ul>
<li><button onclick="window.location='../'">Back</button></li>
<li><button type="button" onclick="window.location='../'">Back</button></li>
</ul>
</div> <!-- button-group -->

View file

@ -1,10 +1,10 @@
<table class="full-width">
<thead>
<tr>
<th>Role</th>
<th>Name</th>
<th>Email</th>
<th>Action</th>
<th scope="col">Role</th>
<th scope="col">Name</th>
<th scope="col">Email</th>
<th scope="col">Action</th>
</tr>
</thead>
<tbody>

View file

@ -27,7 +27,7 @@
<div class="button-group">
<ul>
<li><button onclick="history.go(-1);return true">Back</button></li>
<li><button type="button" onclick="history.go(-1);return true">Back</button></li>
<li><button type="submit" name="submit" value="Continue">Continue</button></li>
</ul>
</div> <!-- button-group -->
@ -40,8 +40,10 @@
<h2>Name</h2>
<form id="rolodex-add-form" enctype="multipart/form-data" method="post">{% csrf_token %}
<table class="full-width amstable">
<tbody>
<!-- [html-validate-disable-block element-required-attributes -- FIXME: as_table renders without scope] -->
{{ form.as_table }}
</tbody>
</table>
{% include "includes/buttons_proceed.html" %}

View file

@ -8,13 +8,16 @@
{% endblock %}
{% block content %}
<h1>Adding {{ name }}</h1>
<h2>Adding {{ name }}</h2>
<form method="post" id="rolodex-add-form">{% csrf_token %}
<div class="module">
<h2>Rolodex - Add</h2>
<h3>Rolodex - Add</h3>
<table class="full-width amstable">
<tbody>
<!-- [html-validate-disable-block element-required-attributes -- FIXME: as_table renders without scope] -->
{{ form.as_table }}
</tbody>
</table>
</div> <!-- module -->

View file

@ -23,7 +23,7 @@
</ul>
</li></ul>
<form method="post">{% csrf_token %}
<input type="hidden" name="post" value="yes" />
<input type="submit" value="Yes, I'm sure" />
<input type="hidden" name="post" value="yes">
<button type="submit">Yes, I'm sure</button>
</form>
{% endblock %}

View file

@ -18,7 +18,10 @@
<div class="module">
<h2>Rolodex - Edit</h2>
<table id="rolodex-edit-table" class="full-width amstable">
<tbody>
<!-- [html-validate-disable-block element-required-attributes -- FIXME: as_table renders without scope] -->
{{ person_form.as_table }}
</tbody>
</table>
<div class="inline-group">
@ -29,10 +32,10 @@
<table id="rolodex-email-table" class="full-width">
<thead>
<tr>
<th></th>
<th scope="col"></th>
{% for field in email_formset.forms.0 %}
{% if not field.is_hidden %}
<th>{{ field.label }}</th>
<th scope="col">{{ field.label }}</th>
{% endif %}
{% endfor %}
</tr>

View file

@ -16,8 +16,10 @@
<h2>Rolodex - Search <span class="unlocked"><a href="add/" class="addlink">Add</a></span></h2>
<form id="rolodex-search-form" action="." method="post">{% csrf_token %}
<table class="full-width amstable">
<tbody>
<!-- [html-validate-disable-block element-required-attributes -- FIXME: as_table renders without scope] -->
{{ form.as_table }}
</tbody>
</table>
{% include "includes/buttons_search.html" %}

View file

@ -13,27 +13,28 @@
<table id="rolodex-view-table" class="full-width">
<tbody>
<tr><td>Name:</td><td>{{ person.name }}</td></tr>
<tr><td>Ascii Name:</td><td>{{ person.ascii }}</td></tr>
<tr><td>Short Name:</td><td>{{ person.ascii_short }}</td></tr>
<tr><td>Aliases:</td><td>{% for alias in person.alias_set.all %}{% if not forloop.first %}, {% endif %}{{ alias.name }}{% endfor %}</td>
<tr><td>Aliases:</td><td>{% for alias in person.alias_set.all %}{% if not forloop.first %}, {% endif %}{{ alias.name }}{% endfor %}</td></tr>
<tr><td>User:</td><td>{{ person.user }}</td></tr>
<tr><td></td><td></td></tr>
{% for email in person.emails %}
<tr><td>Email {{ forloop.counter }}:</td><td>{{ email }}</td></tr>
{% endfor %}
</tbody>
</table>
<br />
<br>
<div class="inline-related">
<h2><b>Roles</b></h2>
<table id="rolodex-role-table" class="full-width">
<thead>
<tr>
<th>Role Name</th>
<th>Group / Area</th>
<th>Email</th>
<th scope="col">Role Name</th>
<th scope="col">Group / Area</th>
<th scope="col">Email</th>
</tr>
</thead>
{% if roles %}
@ -58,14 +59,14 @@
<div class="button-group">
<ul>
<li><button onclick="window.location='../'">Search</button></li>
<li><button onclick="window.location='edit/'">Edit</button></li>
<li><button type="button" onclick="window.location='../'">Search</button></li>
<li><button type="button" onclick="window.location='edit/'">Edit</button></li>
{% comment %}
Removed per Glen
<li><button onclick="window.location='../../delete/{{ person.person_or_org_tag }}'">Delete</button></li>
{% endcomment %}
<li><button type="button" onclick="window.location='../../delete/{{ person.person_or_org_tag }}'">Delete</button></li>
{% endcomment %}
</ul>
</div> <!-- view-buttons -->
</div> <!-- view-container -->
{% endblock %}
{% endblock %}

View file

@ -32,15 +32,13 @@
{% if group.features.acts_like_wg and form.session_forms.forms_to_keep|length > 2 %}
<br>
<span class="alert">
<p>
<b>
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
request to the area directors.
</b>
</p>
</span>
<p class="alert">
<b>
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
request to the area directors.
</b>
</p>
<br>
{% endif %}

View file

@ -20,7 +20,7 @@
<div class="button-group">
<ul>
<li><button onclick="window.location='../'">Back</button></li>
<li><button type="button" onclick="window.location='../'">Back</button></li>
</ul>
</div> <!-- button-group -->

View file

@ -28,8 +28,8 @@
<div class="inline-related">
<br>
<ul class="session-buttons">
<li><button onclick="if (window.confirm('A message will be sent to agenda@ietf.com as well as to the area director(s).\n\nContinue?')) { window.location='{% url "ietf.secr.sreq.views.no_session" acronym=group.acronym %}'};">Send a notification that the group does not plan to hold a session at IETF {{ meeting.number }}</button></li>
<li><button onclick="window.location='{% url "ietf.secr.sreq.views.new" acronym=group.acronym %}?previous'">Retrieve all information from previous meeting</button></li>
<li><button type="button" onclick="if (window.confirm('A message will be sent to agenda@ietf.com as well as to the area director(s).\n\nContinue?')) { window.location='{% url "ietf.secr.sreq.views.no_session" acronym=group.acronym %}'};">Send a notification that the group does not plan to hold a session at IETF {{ meeting.number }}</button></li>
<li><button type="button" onclick="window.location='{% url "ietf.secr.sreq.views.new" acronym=group.acronym %}?previous'">Retrieve all information from previous meeting</button></li>
</ul>
</div>
{% include "includes/sessions_request_form.html" %}

View file

@ -19,7 +19,10 @@
<p>Enter the message that you would like displayed to the WG Chair when this tool is locked.</p>
<form method="post">{% csrf_token %}
<table>
{{ form.as_table }}
<tbody>
<!-- [html-validate-disable-block element-required-attributes -- FIXME: as_table renders without scope] -->
{{ form.as_table }}
</tbody>
</table>
<div class="button-group">
<ul>

View file

@ -29,12 +29,12 @@
<div class="button-group">
<ul>
<li><button name="edit" onclick="window.location='{% url "ietf.secr.sreq.views.edit" acronym=group.acronym num=meeting.number %}'"{% if is_locked %} disabled{% endif %}>Edit</button></li>
<li><button type="button" name="edit" onclick="window.location='{% url "ietf.secr.sreq.views.edit" acronym=group.acronym num=meeting.number %}'"{% if is_locked %} disabled{% endif %}>Edit</button></li>
{% if show_approve_button %}
<li><button onclick="window.location='approve/'">Approve Third Session</button></li>
<li><button type="button" onclick="window.location='approve/'">Approve Third Session</button></li>
{% endif %}
<li><button onclick="if (window.confirm('Do you really want to cancel this session?')) { window.location='cancel/' };" {% if is_locked %} disabled{% endif %}>Cancel this Request</button></li>
<li><button onclick="window.location='{% url "ietf.secr.sreq.views.main" %}'">Back</button></li>
<li><button type="button" onclick="if (window.confirm('Do you really want to cancel this session?')) { window.location='cancel/' };" {% if is_locked %} disabled{% endif %}>Cancel this Request</button></li>
<li><button type="button" onclick="window.location='{% url "ietf.secr.sreq.views.main" %}'">Back</button></li>
</ul>
</div> <!-- button-group -->
</div> <!-- module -->

View file

@ -5,7 +5,7 @@
{% block extrahead %}{{ block.super }}
<script src="{% static 'secr/js/utils.js' %}"></script>
<link rel="stylesheet" href="{% static 'secr/css/telechat.css' %}" />
<link rel="stylesheet" href="{% static 'secr/css/telechat.css' %}">
{% endblock %}
{% block breadcrumbs %}{{ block.super }}

View file

@ -10,43 +10,44 @@
{% if document %}
{% if not nav_start %}<a href="./previous/">&laquo; Previous</a>{% endif %}
{% if not nav_end %}<span class="right-nav"><a href="./next/">Next &raquo;</a></span>{% endif %}
<br />
<br>
<h3>
{% for line in header %}
{{ line }}<br />
{{ line }}<br>
{% endfor %}
</h3>
<br />
<br>
<h3>{{ document.name }}-{{ document.rev }} ({{ document.intended_std_level }})</h3>
{% if conflictdoc %}References: <a href="{{ conflictdoc.get_absolute_url }}">{{ conflictdoc }}</a><br />{% endif %}
<a href="#writeup">Ballot Writeup</a><br />
Token: {{ document.ad.name }}<br />
{% if conflictdoc %}References: <a href="{{ conflictdoc.get_absolute_url }}">{{ conflictdoc }}</a><br>{% endif %}
<a href="#writeup">Ballot Writeup</a><br>
Token: {{ document.ad.name }}<br>
{% if document.type_id == "draft" %}
Consensus: {{ document|consensus }}<br />
Has downref: {% if downrefs %}Yes{% else %}No{% endif %}<br />
Consensus: {{ document|consensus }}<br>
Has downref: {% if downrefs %}Yes{% else %}No{% endif %}<br>
{% endif %}
Number of Open Positions: {{ open_positions }}<br />
<br />
Number of Open Positions: {{ open_positions }}<br>
<br>
<div>
<form method="post">{% csrf_token %}
{{ formset.management_form }}
<table id="telechat-positions-table">
<tbody>
<tr>
<th>Area Director</th>
<th scope="col">Area Director</th>
{% for position in document.active_ballot.ballot_type.positions.all %}
<th>{{ position.name }}</th>
<th scope="col">{{ position.name }}</th>
{% endfor %}
</tr>
{% for form in formset.forms %}
<tr{% if form.initial.position == 'norecord' or form.initial.position == None %} class="green-row"{% endif %}{% if form.initial.position == 'discuss' %} class="red-row"{% endif %}><td>{{ form.initial.name }}{{ form.name }}{{ form.id }}</td>
{% with form.position as field %}
{% for choice in field.field.choices %}
<td><input type="radio" {% if form.initial.position == choice.0 %}checked="checked" {% endif %}id="id_{{ field.html_name }}_{{ forloop.counter0 }}" value="{{ choice.0 }}" name="{{ field.html_name }}" /></td>
<td><input type="radio" {% if form.initial.position == choice.0 %}checked {% endif %}id="id_{{ field.html_name }}_{{ forloop.counter0 }}" value="{{ choice.0 }}" name="{{ field.html_name }}"></td>
{% endfor %}
{% endwith %}
</tr>
{% endfor %}
</tbody>
</table>
<div class="telechat-button">
<ul><li><button type="submit" name="submit" value="update_ballot">Update Ballot</button></li></ul>
@ -54,22 +55,26 @@
</form>
</div>
<hr /><br />
<hr><br>
<!-- [html-validate-disable-block wcag/h32 -- FIXME: no submit button] -->
<form method="post">{% csrf_token %}
<table>
<tbody>
<!-- [html-validate-disable-block element-required-attributes -- FIXME: as_table renders without scope] -->
{{ state_form.as_table }}
</tbody>
</table>
<div class="telechat-button">
<ul><li><button type="submit" name="submit" value="update_state">Update State</button></li></ul>
</div>
</form>
<hr /><br />
<hr><br>
{% if document.type_id == "charter" %}
{% include "telechat/group.html" %}
<br /><hr /><br />
<br><hr><br>
{% endif %}
<h2 id="writeup">Ballot Writeup</h2>
@ -82,12 +87,12 @@
{% for ref in downrefs %}
<p>Add {{ref.target.document.canonical_name}}
({{ref.target.document.std_level}} - {{ref.target.document.stream.desc}})
to downref registry.<br />
to downref registry.<br>
{% if not ref.target.document.std_level %}
+++ Warning: The standards level has not been set yet!!!<br />
+++ Warning: The standards level has not been set yet!!!<br>
{% endif %}
{% if not ref.target.document.stream %}
+++ Warning: document stream has not been set yet!!!<br />
+++ Warning: document stream has not been set yet!!!<br>
{% endif %}
{% endfor %}</p>
{% endif %}

View file

@ -9,12 +9,12 @@
<div id="telechat-content">
<span class="telechat-warn"><h3>This feature is pending</h3></span>
<h3>Roll Call</h3>
<br />
<br>
<form method="post">{% csrf_token %}
{% for person in people %}
<input type="checkbox" name="attendee" value="{{ person.id }}" checked="checked" /> {{ person.name }}<br />
<input type="checkbox" name="attendee" value="{{ person.id }}" checked> {{ person.name }}<br>
{% endfor %}
<input type="submit" value="Update" />
<button type="submit">Update</button>
</form>
</div>

View file

@ -149,6 +149,27 @@ table tbody.meta {
max-width: 300px;
}
// Style the photo cards
.photo {
width: 13em;
.card-img-top {
object-fit: cover;
height: 15em;
}
.photo-placeholder {
height: 15em;
font-size: 12em;
}
}
// Style the righthand navigation panel
#righthand-nav {
height: 70vh;
width: inherit;
}
// Add some padding when there are multiple buttons in a line than can wrap
.buttonlist .btn {
margin-top: map.get($spacers, 2);

View file

@ -34,9 +34,9 @@ var agenda_materials; // public interface
data = "<p>Error retrieving " + data_src
+ ": Missing content-type in response header</p>";
} else if (t.indexOf("text/plain") > -1) {
data = "<pre class='agenda'>" + data + "</pre>";
data = '<pre class="agenda">' + data + "</pre>";
} else if (t.indexOf("text/markdown") > -1) {
data = "<pre class='agenda'>" + data + "</pre>";
data = '<pre class="agenda">' + data + "</pre>";
} else if(t.indexOf("text/html") > -1) {
// nothing to do here
} else {

View file

@ -124,7 +124,7 @@ function format_tooltip_notice(start, end) {
// Format tooltip table
function format_tooltip_table(start, end) {
var current_timezone = get_current_tz_cb();
var out = '<div class="text-start"><table class="table table-sm"><tr><th></th><th>Session start</th><th>Session end</th></tr>';
var out = '<div class="text-start"><table class="table table-sm"><thead><tr><th scope="col"></th><th scope="col">Session start</th><th scope="col">Session end</th></tr></thead>';
if (window.meeting_timezone !== "") {
out += '<tr><th class="timehead">Meeting timezone</th><td>' +
format_time(start, window.meeting_timezone, 0) + '</td><td>' +

View file

@ -182,7 +182,7 @@ $(function () {
.attr("tabindex", 0)
.after($(`
<div class="col-xl-2 ps-0 small">
<nav id="righthand-nav" class="position-fixed navbar navbar-light bg-light overflow-auto flex-fill" style="height: 70vh; width: inherit;">
<nav id="righthand-nav" class="position-fixed navbar navbar-light bg-light overflow-auto flex-fill">
</nav>
</div>
`))

View file

@ -64,7 +64,7 @@ var attachmentWidget = {
} else {
html += ' ' + field.val();
}
html += '<span style="display: none;" class="removeField">';
html += '<span class="d-none removeField">';
html += container.attr('id');
html += '</span>';
container.hide();

View file

@ -70,7 +70,7 @@ $(document)
.addClass("sort");
// $(header_row)
// .children("th, td")
// .wrapInner("<span class='tablesorter-th'></span>");
// .wrapInner('<span class="tablesorter-th"></span>');
// // .each((i, e) => field_magic(i, e, fields));
if ($(header_row)

View file

@ -6,8 +6,8 @@
<img class="col-2 mb-5"
src="{% static 'ietf/images/ietflogo.png' %}"
alt="IETF">
<div class='alert alert-warning my-3'>
<h2>Authentication Required</h2>
<div class="alert alert-warning my-3">
<h1>Authentication Required</h1>
<hr>
<p>
The server could not verify that you are authorized to view this page using

View file

@ -6,8 +6,8 @@
<img class="col-2 mb-5"
src="{% static 'ietf/images/ietflogo.png' %}"
alt="IETF">
<div class='alert alert-warning my-3'>
<h2>Restricted Access</h2>
<div class="alert alert-warning my-3">
<h1>Restricted Access</h1>
<hr>
<p>
{{ exception }}

View file

@ -6,8 +6,8 @@
<img class="col-2 mb-5"
src="{% static 'ietf/images/ietflogo.png' %}"
alt="IETF">
<div class='alert alert-warning my-3'>
<h2>The page you were looking for couldn't be found</h2>
<div class="alert alert-warning my-3">
<h1>The page you were looking for couldn't be found</h1>
<hr>
<p>
The requested URL was not found on this server. If you entered the URL

View file

@ -6,8 +6,8 @@
<img class="col-2 mb-5"
src="{% static 'ietf/images/ietflogo.png' %}"
alt="IETF">
<div class='alert alert-warning my-3'>
<h2>Internal Server Error</h2>
<div class="alert alert-warning my-3">
<h1>Internal Server Error</h1>
<hr>
<p>
The server encountered an internal error and was unable to complete

View file

@ -135,14 +135,8 @@ $ curl 'https://datatracker.ietf.org/api/v1/doc/document/?limit=0&amp;name__cont
A simplified Documents API, intended for cases where only a limited set of
document attributes are necessary for an application is
available for all documents at the relative url <code>doc.json</code>, e.g.,
<code>{% url 'ietf.doc.views_doc.document_json' name='draft-ietf-poised95-std-proc-3' %}</code>
<a href="{% url 'ietf.doc.views_doc.document_json' name='draft-ietf-poised95-std-proc-3' %}">
<i class="bi bi-box-arrow-up-right"></i>
</a>.
You can also specify an RFC: <code>{% url 'ietf.doc.views_doc.document_json' name='rfc2026' %}</code>
<a href="{% url 'ietf.doc.views_doc.document_json' name='rfc2026' %}">
<i class="bi bi-box-arrow-up-right"></i>
</a>.
<code><a class="text-reset" href="{% url 'ietf.doc.views_doc.document_json' name='draft-ietf-poised95-std-proc-3' %}">{% url 'ietf.doc.views_doc.document_json' name='draft-ietf-poised95-std-proc-3' %}</a></code>.
You can also specify an RFC: <code><a class="text-reset" href="{% url 'ietf.doc.views_doc.document_json' name='rfc2026' %}">{% url 'ietf.doc.views_doc.document_json' name='rfc2026' %}</a></code>.
No API key is needed to access this.
</p>
<p>
@ -255,9 +249,7 @@ $ curl -S -F "apikey=DgAAAMLSi3coaE5TjrRs518xO8eBRlCmFF3eQcC8_SjUTtRGLGiJh7-1SYP
rather than having general access or requiring username/password
login, see for example details for
<code>{% url 'ietf.doc.views_ballot.api_set_position' %}</code>
<a href="#iesg-position-api">
above
</a>.
<a href="#iesg-position-api">above</a>.
Personal API keys are available from your
<a href="{% url 'ietf.ietfauth.views.apikey_index' %}">
Account API Keys

View file

@ -1,5 +1,5 @@
{# Copyright The IETF Trust 2015-2022, All Rights Reserved #}
<!doctype html>
<!DOCTYPE html>
{% load ietf_filters static %}
{% load origin %}
{% origin %}
@ -58,11 +58,13 @@
</a>
{% endif %}
<div class="d-flex d-none d-lg-block">
<label aria-label="Document search">
<input class="form-control select2-field"
id="navbar-doc-search"
data-ajax--url="{% url 'ietf.doc.views_search.ajax_select2_search_docs' model_name='docalias' doc_type='draft' %}"
type="text"
data-placeholder="Document search">
</label>
</div>
<button class="navbar-toggler"
type="button"

View file

@ -154,7 +154,7 @@
</li>
{% endif %}
<li {% if flavor == 'top' %}class="dropdown-header"{% else %}class="nav-item fw-bolder"{% endif %}>
Review Teams
Review Teams
</li>
{% for g in user|managed_review_groups %}
<li>
@ -171,7 +171,7 @@
</li>
{% endif %}
<li {% if flavor == 'top' %}class="dropdown-header"{% else %}class="nav-item fw-bolder"{% endif %}>
NomComs
NomComs
</li>
{% for g in user|active_nomcoms %}
<li>

View file

@ -224,4 +224,4 @@
</a>
</li>
{% endif %}
{% if flavor == "top" %}</ul>{% endif %}
{% if flavor == "top" %}</ul></li>{% endif %}

View file

@ -27,8 +27,10 @@
</p>
<table class="table table-sm table-striped tablesorter">
<thead>
<th data-sort="doc">Document</th>
<th>Manage</th>
<tr>
<th scope="col" data-sort="doc">Document</th>
<th scope="col">Manage</th>
</tr>
</thead>
<tbody>
{% for d in individually_added %}
@ -38,7 +40,7 @@
<form method="post" id="remove_document_{{ d.pk }}">
{% csrf_token %}
<input type="hidden" name="document" value="{{ d.pk }}">
<button class="btn btn-danger btn-sm" name="action" value="remove_document">Remove</button>
<button type="submit" class="btn btn-danger btn-sm" name="action" value="remove_document">Remove</button>
</form>
</td>
</tr>
@ -78,10 +80,10 @@
<table class="table table-sm table-striped tablesorter">
<thead>
<tr>
<th data-sort="rule">Rule</th>
<th data-sort="value">Value</th>
<th data-sort="num">Matching Documents</th>
<th>Manage</th>
<th scope="col" data-sort="rule">Rule</th>
<th scope="col" data-sort="value">Value</th>
<th scope="col" data-sort="num">Matching Documents</th>
<th scope="col">Manage</th>
</tr>
</thead>
<tbody>
@ -104,7 +106,7 @@
<form method="post">
{% csrf_token %}
<input type="hidden" name="rule" value="{{ rule.pk }}">
<button class="btn btn-danger btn-sm" name="action" value="remove_rule">Remove</button>
<button type="submit" class="btn btn-danger btn-sm" name="action" value="remove_rule">Remove</button>
</form>
</td>
</tr>

View file

@ -9,6 +9,6 @@
<p>
Add {{ name }} to the list?
</p>
<input type="submit" class="btn btn-primary" value="Track document">
<button type="submit" class="btn btn-primary" value="Track document">Track document</button>
</form>
{% endblock %}
{% endblock %}

View file

@ -9,7 +9,9 @@
<p>
Remove {{ name }} from the list?
</p>
<input type="submit"
<button type="submit"
class="btn btn-primary"
value="Remove tracking of document">
</form>
Remove tracking of document
</button>
</form>

View file

@ -15,13 +15,13 @@
<table class="table table-sm tablesorter">
<thead>
<tr>
<th data-sort="num">#</th>
<th data-sort="query">SQL</th>
<th data-sort="num">Count</th>
<th data-sort="where">WHERE</th>
<th data-sort="num">View/Templ.</th>
<th data-sort="num">Time</th>
<th data-sort="num">Acc.</th>
<th scope="col" data-sort="num">#</th>
<th scope="col" data-sort="query">SQL</th>
<th scope="col" data-sort="num">Count</th>
<th scope="col" data-sort="where">WHERE</th>
<th scope="col" data-sort="num">View/Templ.</th>
<th scope="col" data-sort="num">Time</th>
<th scope="col" data-sort="num">Acc.</th>
</tr>
</thead>
<tbody>
@ -61,9 +61,9 @@
<table class="table table-sm">
<thead>
<tr>
<th>File (line)</th>
<th>Method</th>
<th>Code</th>
<th scope="col">File (line)</th>
<th scope="col">Method</th>
<th scope="col">Code</th>
</tr>
</thead>
<tbody>
@ -103,7 +103,7 @@
</div>
</div>
{% else %}
<small class='text-center text-muted'>
<small class="text-center text-muted">
Add <code>ietf.context_processors.sql_debug</code> to <code>settings.DEV_TEMPLATE_CONTEXT_PROCESSORS</code> to turn on the SQL statement table.
</small>
{% endif %}

View file

@ -14,11 +14,11 @@
{% csrf_token %}
<pre class="border p-3 mb-3">{{ announcement }}</pre>
{% if action == "to_announcement_list" %}
<button class="btn btn-primary" type="submit">Notify RFC Editor, send announcement & close ballot</button>
<button class="btn btn-primary" type="submit">Notify RFC Editor, send announcement &amp; close ballot</button>
{% elif action == "to_rfc_editor" %}
<button class="btn btn-primary" type="submit">Email RFC Editor & close ballot</button>
<button class="btn btn-primary" type="submit">Email RFC Editor &amp; close ballot</button>
{% elif action == "do_not_publish" %}
<button class="btn btn-primary" type="submit">Email RFC Editor (DNP) & close ballot"</button>
<button class="btn btn-primary" type="submit">Email RFC Editor (DNP) &amp; close ballot"</button>
{% endif %}
<a class="btn btn-secondary float-end"
href="{% url "ietf.doc.views_doc.document_main" name=doc.canonical_name %}">

Some files were not shown because too many files have changed in this diff Show more