Allow hiding/blurring sessions and timeslots based on TimeSlotType in the schedule editor
- Legacy-Id: 19438
This commit is contained in:
parent
3e3d681e5f
commit
b6ac3d4b1d
|
@ -310,7 +310,7 @@ class AgendaKeywordTool:
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def filterable_purposes(self):
|
def filterable_purposes(self):
|
||||||
return SessionPurposeName.objects.exclude(slug='session').order_by('name')
|
return SessionPurposeName.objects.exclude(slug='regular').order_by('name')
|
||||||
|
|
||||||
|
|
||||||
class AgendaFilterOrganizer(AgendaKeywordTool):
|
class AgendaFilterOrganizer(AgendaKeywordTool):
|
||||||
|
|
|
@ -991,6 +991,14 @@ def edit_meeting_schedule(request, num=None, owner=None, name=None):
|
||||||
p.light_scheduling_color = "rgb({}, {}, {})".format(*tuple(int(round((0.9 + 0.1 * x) * 255)) for x in rgb_color))
|
p.light_scheduling_color = "rgb({}, {}, {})".format(*tuple(int(round((0.9 + 0.1 * x) * 255)) for x in rgb_color))
|
||||||
|
|
||||||
session_purposes = sorted(set(s.purpose for s in sessions if s.purpose), key=lambda p: p.name)
|
session_purposes = sorted(set(s.purpose for s in sessions if s.purpose), key=lambda p: p.name)
|
||||||
|
timeslot_types = sorted(
|
||||||
|
set(
|
||||||
|
s.type for s in sessions if s.type
|
||||||
|
).union(
|
||||||
|
t.type for t in timeslots_qs.all()
|
||||||
|
),
|
||||||
|
key=lambda tstype: tstype.name,
|
||||||
|
)
|
||||||
|
|
||||||
return render(request, "meeting/edit_meeting_schedule.html", {
|
return render(request, "meeting/edit_meeting_schedule.html", {
|
||||||
'meeting': meeting,
|
'meeting': meeting,
|
||||||
|
@ -1003,6 +1011,7 @@ def edit_meeting_schedule(request, num=None, owner=None, name=None):
|
||||||
'unassigned_sessions': unassigned_sessions,
|
'unassigned_sessions': unassigned_sessions,
|
||||||
'session_parents': session_parents,
|
'session_parents': session_parents,
|
||||||
'session_purposes': session_purposes,
|
'session_purposes': session_purposes,
|
||||||
|
'timeslot_types': timeslot_types,
|
||||||
'hide_menu': True,
|
'hide_menu': True,
|
||||||
'lock_time': lock_time,
|
'lock_time': lock_time,
|
||||||
})
|
})
|
||||||
|
|
|
@ -94,8 +94,10 @@ class SessionForm(forms.Form):
|
||||||
self.session_forms = formset_class(group=self.group, meeting=meeting, data=data)
|
self.session_forms = formset_class(group=self.group, meeting=meeting, data=data)
|
||||||
super(SessionForm, self).__init__(data=data, *args, **kwargs)
|
super(SessionForm, self).__init__(data=data, *args, **kwargs)
|
||||||
|
|
||||||
|
# Allow additional sessions for non-wg-like groups
|
||||||
if not self.group.features.acts_like_wg:
|
if not self.group.features.acts_like_wg:
|
||||||
self.fields['num_session'].choices = ((n, str(n)) for n in range(1, 13))
|
self.fields['num_session'].choices = ((n, str(n)) for n in range(1, 13))
|
||||||
|
|
||||||
self.fields['comments'].widget = forms.Textarea(attrs={'rows':'3','cols':'65'})
|
self.fields['comments'].widget = forms.Textarea(attrs={'rows':'3','cols':'65'})
|
||||||
|
|
||||||
other_groups = list(allowed_conflicting_groups().exclude(pk=group.pk).values_list('acronym', 'acronym').order_by('acronym'))
|
other_groups = list(allowed_conflicting_groups().exclude(pk=group.pk).values_list('acronym', 'acronym').order_by('acronym'))
|
||||||
|
|
|
@ -1333,10 +1333,20 @@ a.fc-event, .fc-event, .fc-content, .fc-title, .fc-event-container {
|
||||||
|
|
||||||
.edit-meeting-schedule .scheduling-panel .preferences {
|
.edit-meeting-schedule .scheduling-panel .preferences {
|
||||||
margin: 0.5em 0;
|
margin: 0.5em 0;
|
||||||
|
display: flex;
|
||||||
|
align-items: flex-start;
|
||||||
}
|
}
|
||||||
|
|
||||||
.edit-meeting-schedule .scheduling-panel .preferences > span {
|
.edit-meeting-schedule .scheduling-panel .preferences > div {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: flex-start;
|
||||||
|
}
|
||||||
|
|
||||||
|
.edit-meeting-schedule .scheduling-panel .preferences > div > span {
|
||||||
|
margin-top: 0;
|
||||||
margin-right: 1em;
|
margin-right: 1em;
|
||||||
|
white-space: nowrap;
|
||||||
}
|
}
|
||||||
|
|
||||||
.edit-meeting-schedule .sort-unassigned select {
|
.edit-meeting-schedule .sort-unassigned select {
|
||||||
|
@ -1363,7 +1373,7 @@ a.fc-event, .fc-event, .fc-content, .fc-title, .fc-event-container {
|
||||||
margin-top: 1em;
|
margin-top: 1em;
|
||||||
}
|
}
|
||||||
|
|
||||||
.edit-meeting-schedule .session-parent-toggles label {
|
.edit-meeting-schedule .toggle-inputs label {
|
||||||
font-weight: normal;
|
font-weight: normal;
|
||||||
margin-right: 1em;
|
margin-right: 1em;
|
||||||
padding: 0 1em;
|
padding: 0 1em;
|
||||||
|
|
|
@ -724,6 +724,23 @@ jQuery(document).ready(function () {
|
||||||
sessionParentInputs.on("click", updateSessionParentToggling);
|
sessionParentInputs.on("click", updateSessionParentToggling);
|
||||||
updateSessionParentToggling();
|
updateSessionParentToggling();
|
||||||
|
|
||||||
|
// Toggling timeslot types
|
||||||
|
let timeSlotTypeInputs = content.find('.timeslot-type-toggles input');
|
||||||
|
function updateTimeSlotTypeToggling() {
|
||||||
|
let checked = [];
|
||||||
|
timeSlotTypeInputs.filter(":checked").each(function () {
|
||||||
|
checked.push("[data-type=" + this.value + "]");
|
||||||
|
});
|
||||||
|
|
||||||
|
sessions.filter(checked.join(",")).removeClass('hidden-timeslot-type');
|
||||||
|
sessions.not(checked.join(",")).addClass('hidden-timeslot-type');
|
||||||
|
timeslots.filter(checked.join(",")).removeClass('hidden-timeslot-type');
|
||||||
|
timeslots.not(checked.join(",")).addClass('hidden-timeslot-type');
|
||||||
|
}
|
||||||
|
|
||||||
|
timeSlotTypeInputs.on("click", updateTimeSlotTypeToggling);
|
||||||
|
updateTimeSlotTypeToggling();
|
||||||
|
|
||||||
// Toggling session purposes
|
// Toggling session purposes
|
||||||
let sessionPurposeInputs = content.find('.session-purpose-toggles input');
|
let sessionPurposeInputs = content.find('.session-purpose-toggles input');
|
||||||
function updateSessionPurposeToggling() {
|
function updateSessionPurposeToggling() {
|
||||||
|
|
|
@ -55,7 +55,7 @@
|
||||||
|
|
||||||
function update_name_field_visibility(name_elt, purpose) {
|
function update_name_field_visibility(name_elt, purpose) {
|
||||||
const row = name_elt.closest('tr');
|
const row = name_elt.closest('tr');
|
||||||
if (purpose === 'session') {
|
if (purpose === 'regular') {
|
||||||
row.setAttribute('hidden', 'hidden');
|
row.setAttribute('hidden', 'hidden');
|
||||||
} else {
|
} else {
|
||||||
row.removeAttribute('hidden');
|
row.removeAttribute('hidden');
|
||||||
|
|
|
@ -17,9 +17,12 @@
|
||||||
.edit-meeting-schedule .past-flag { visibility: hidden; font-size: smaller; }
|
.edit-meeting-schedule .past-flag { visibility: hidden; font-size: smaller; }
|
||||||
.edit-meeting-schedule .edit-grid .timeslot.past .past-flag { visibility: visible; color: #aaaaaa; }
|
.edit-meeting-schedule .edit-grid .timeslot.past .past-flag { visibility: visible; color: #aaaaaa; }
|
||||||
{# type and purpose styling #}
|
{# type and purpose styling #}
|
||||||
.edit-meeting-schedule .edit-grid .timeslot.wrong-timeslot-type { background-color: transparent; ); }
|
.edit-meeting-schedule .edit-grid .timeslot.wrong-timeslot-type,
|
||||||
.edit-meeting-schedule .edit-grid .timeslot.wrong-timeslot-type .time-label { color: transparent; ); }
|
.edit-meeting-schedule .edit-grid .timeslot.hidden-timeslot-type { background-color: transparent; ); }
|
||||||
.edit-meeting-schedule .session.hidden-purpose { filter: blur(3px); }
|
.edit-meeting-schedule .edit-grid .timeslot.wrong-timeslot-type .time-label,
|
||||||
|
.edit-meeting-schedule .edit-grid .timeslot.hidden-timeslot-type .time-label { color: transparent; ); }
|
||||||
|
.edit-meeting-schedule .session.hidden-purpose,
|
||||||
|
.edit-meeting-schedule .session.hidden-timeslot-type { filter: blur(3px); }
|
||||||
{% endblock morecss %}
|
{% endblock morecss %}
|
||||||
|
|
||||||
{% block title %}{{ schedule.name }}: IETF {{ meeting.number }} meeting agenda{% endblock %}
|
{% block title %}{{ schedule.name }}: IETF {{ meeting.number }} meeting agenda{% endblock %}
|
||||||
|
@ -172,32 +175,44 @@
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="preferences">
|
<div class="preferences">
|
||||||
<span class="sort-unassigned">
|
<div>
|
||||||
Sort unassigned:
|
<span class="sort-unassigned">
|
||||||
<select name="sort_unassigned" class="form-control">
|
Sort unassigned:
|
||||||
<option value="name" selected="selected">By name</option>
|
<select name="sort_unassigned" class="form-control">
|
||||||
<option value="parent">By area</option>
|
<option value="name" selected="selected">By name</option>
|
||||||
<option value="duration">By duration</option>
|
<option value="parent">By area</option>
|
||||||
<option value="comments">Special requests</option>
|
<option value="duration">By duration</option>
|
||||||
</select>
|
<option value="comments">Special requests</option>
|
||||||
</span>
|
</select>
|
||||||
|
</span>
|
||||||
|
|
||||||
<span class="session-parent-toggles">
|
<span class="timeslot-group-toggles">
|
||||||
Show:
|
<button class="btn btn-default" data-toggle="modal" data-target="#timeslot-group-toggles-modal"><input type="checkbox" checked="checked" disabled> Timeslots</button>
|
||||||
{% for p in session_parents %}
|
</span>
|
||||||
<label class="parent-{{ p.acronym }}"><input type="checkbox" checked value="{{ p.acronym }}"> {{ p.acronym }}</label>
|
</div>
|
||||||
{% endfor %}
|
|
||||||
</span>
|
|
||||||
|
|
||||||
<span class="session-purpose-toggles">
|
<div>
|
||||||
{% for purpose in session_purposes %}
|
<span class="toggle-inputs session-parent-toggles">
|
||||||
<label class="purpose-{{ purpose.slug }}"><input type="checkbox" checked value="{{ purpose.slug }}"> {{ purpose }}</label>
|
Show:
|
||||||
{% endfor %}
|
{% for p in session_parents %}
|
||||||
</span>
|
<label class="parent-{{ p.acronym }}"><input type="checkbox" checked value="{{ p.acronym }}"> {{ p.acronym }}</label>
|
||||||
|
{% endfor %}
|
||||||
|
</span>
|
||||||
|
|
||||||
<span class="timeslot-group-toggles">
|
<span class="toggle-inputs session-purpose-toggles">
|
||||||
<button class="btn btn-default" data-toggle="modal" data-target="#timeslot-group-toggles-modal"><input type="checkbox" checked="checked" disabled> Timeslots</button>
|
Purpose:
|
||||||
</span>
|
{% for purpose in session_purposes %}
|
||||||
|
<label class="purpose-{{ purpose.slug }}"><input type="checkbox" checked value="{{ purpose.slug }}"> {{ purpose }}</label>
|
||||||
|
{% endfor %}
|
||||||
|
</span>
|
||||||
|
|
||||||
|
<span class="toggle-inputs timeslot-type-toggles">
|
||||||
|
Type:
|
||||||
|
{% for type in timeslot_types %}
|
||||||
|
<label class="timeslot-type-{{ type.slug }}"><input type="checkbox" checked value="{{ type.slug }}"> {{ type }}</label>
|
||||||
|
{% endfor %}
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue