Skip to content

Commit d9d5234

Browse files
Use updated filter scheme for week-view and agenda
- Legacy-Id: 18457
1 parent b1e3c1f commit d9d5234

4 files changed

Lines changed: 228 additions & 99 deletions

File tree

ietf/meeting/tests_js.py

Lines changed: 78 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -285,10 +285,6 @@ def testReorderSlides(self):
285285

286286
@skipIf(skip_selenium, skip_message)
287287
class AgendaTests(MeetingTestCase):
288-
# Groups whose display logic is inverted in agenda.html. These have
289-
# toggles with class 'pickviewneg' in the template.
290-
PICKVIEWNEG = ['iepg', 'tools', 'edu', 'ietf', 'iesg', 'iab']
291-
292288
def setUp(self):
293289
super(AgendaTests, self).setUp()
294290
self.meeting = make_meeting_test_data()
@@ -377,40 +373,75 @@ def test_agenda_view_js_func_toggle_list_item(self):
377373
self.assertEqual(result[4], ['item1', 'item3'], 'Removing middle item from list failed')
378374
self.assertEqual(result[5], ['item1', 'item2'], 'Removing last item from list failed')
379375

376+
def do_agenda_view_filter_test(self, querystring, visible_groups=()):
377+
self.login()
378+
self.driver.get(self.absreverse('ietf.meeting.views.agenda') + querystring)
379+
self.assert_agenda_item_visibility(visible_groups)
380+
weekview_iframe = self.driver.find_element_by_id('weekview')
381+
if len(querystring) == 0:
382+
self.assertFalse(weekview_iframe.is_displayed(), 'Weekview should be hidden when filters off')
383+
else:
384+
self.assertTrue(weekview_iframe.is_displayed(), 'Weekview should be visible when filters on')
385+
self.driver.switch_to.frame(weekview_iframe)
386+
self.assert_weekview_item_visibility(visible_groups)
387+
self.driver.switch_to.default_content()
388+
380389
def test_agenda_view_filter_show_one(self):
381390
"""Filtered agenda view should display only matching rows (one group selected)"""
382-
self.login()
383-
self.driver.get(self.absreverse('ietf.meeting.views.agenda') + '?show=mars')
384-
self.assert_agenda_item_visibility(['mars'] + self.PICKVIEWNEG) # ames and secretariat not selected
391+
self.do_agenda_view_filter_test('?show=mars', ['mars'])
385392

386393
def test_agenda_view_filter_show_two(self):
387394
"""Filtered agenda view should display only matching rows (two groups selected)"""
388-
self.login()
389-
self.driver.get(self.absreverse('ietf.meeting.views.agenda') + '?show=mars,ames')
390-
self.assert_agenda_item_visibility(['mars', 'ames'] + self.PICKVIEWNEG) # secretariat not selected
395+
self.do_agenda_view_filter_test('?show=mars,ames', ['mars', 'ames'])
391396

392397
def test_agenda_view_filter_all(self):
393398
"""Filtered agenda view should display only matching rows (all groups selected)"""
394-
self.login()
395-
self.driver.get(self.absreverse('ietf.meeting.views.agenda'))
396-
self.assert_agenda_item_visibility()
399+
self.do_agenda_view_filter_test('', None) # None means all should be visible
397400

398401
def test_agenda_view_filter_hide(self):
399-
self.login()
400-
self.driver.get(self.absreverse('ietf.meeting.views.agenda') + '?hide=ietf')
401-
self.assert_agenda_item_visibility([g for g in self.PICKVIEWNEG if g != 'ietf'])
402+
self.do_agenda_view_filter_test('?hide=ietf', [])
402403

403404
def test_agenda_view_filter_show_and_hide(self):
404-
self.login()
405-
self.driver.get(self.absreverse('ietf.meeting.views.agenda') + '?show=mars&hide=ietf')
406-
self.assert_agenda_item_visibility(
407-
['mars'] + [g for g in self.PICKVIEWNEG if g != 'ietf']
408-
)
405+
self.do_agenda_view_filter_test('?show=mars&hide=ietf', ['mars'])
406+
407+
def test_agenda_view_filter_show_and_hide_same_group(self):
408+
self.do_agenda_view_filter_test('?show=mars&hide=mars', [])
409409

410-
def assert_agenda_item_visibility(self, visible_groups=()):
410+
def test_agenda_view_filter_showtypes(self):
411+
self.do_agenda_view_filter_test('?showtypes=plenary', ['ietf']) # ietf has a plenary session
412+
413+
def test_agenda_view_filter_hidetypes(self):
414+
self.do_agenda_view_filter_test('?hidetypes=plenary', [])
415+
416+
def test_agenda_view_filter_showtypes_and_hidetypes(self):
417+
self.do_agenda_view_filter_test('?showtypes=plenary&hidetypes=regular', ['ietf']) # ietf has a plenary session
418+
419+
def test_agenda_view_filter_showtypes_and_hidetypes_same_type(self):
420+
self.do_agenda_view_filter_test('?showtypes=plenary&hidetypes=plenary', [])
421+
422+
def test_agenda_view_filter_show_and_showtypes(self):
423+
self.do_agenda_view_filter_test('?show=mars&showtypes=plenary', ['mars', 'ietf']) # ietf has a plenary session
424+
425+
def test_agenda_view_filter_show_and_hidetypes(self):
426+
self.do_agenda_view_filter_test('?show=ietf,mars&hidetypes=plenary', ['mars']) # ietf has a plenary session
427+
428+
def test_agenda_view_filter_hide_and_hidetypes(self):
429+
self.do_agenda_view_filter_test('?hide=ietf,mars&hidetypes=plenary', [])
430+
431+
def test_agenda_view_filter_show_hide_and_showtypes(self):
432+
self.do_agenda_view_filter_test('?show=mars&hide=ames&showtypes=plenary,regular', ['mars', 'ietf']) # ietf has plenary session
433+
434+
def test_agenda_view_filter_show_hide_and_hidetypes(self):
435+
self.do_agenda_view_filter_test('?show=mars,ietf&hide=ames&hidetypes=plenary', ['mars']) # ietf has plenary session
436+
437+
def test_agenda_view_filter_all_params(self):
438+
self.do_agenda_view_filter_test('?show=secretariat,ietf&hide=ames&showtypes=regular&hidetypes=plenary',
439+
['secretariat', 'mars'])
440+
441+
def assert_agenda_item_visibility(self, visible_groups=None):
411442
"""Assert that correct items are visible in current browser window
412443
413-
If visible_groups is empty (the default), expects all items to be visible.
444+
If visible_groups is None (the default), expects all items to be visible.
414445
"""
415446
for item in self.get_expected_items():
416447
row_id = self.row_id_for_item(item)
@@ -419,11 +450,33 @@ def assert_agenda_item_visibility(self, visible_groups=()):
419450
except NoSuchElementException:
420451
item_row = None
421452
self.assertIsNotNone(item_row, 'No row for schedule item "%s"' % row_id)
422-
if len(visible_groups) == 0 or item.session.group.acronym in visible_groups:
453+
if visible_groups is None or item.session.group.acronym in visible_groups:
423454
self.assertTrue(item_row.is_displayed(), 'Row for schedule item "%s" is not displayed but should be' % row_id)
424455
else:
425456
self.assertFalse(item_row.is_displayed(), 'Row for schedule item "%s" is displayed but should not be' % row_id)
426457

458+
def assert_weekview_item_visibility(self, visible_groups=None):
459+
for item in self.get_expected_items():
460+
if item.session.name:
461+
label = item.session.name
462+
elif item.timeslot.type_id == 'break':
463+
label = item.timeslot.name
464+
elif item.session.group:
465+
label = item.session.group.name
466+
else:
467+
label = 'Free Slot'
468+
469+
try:
470+
item_div = self.driver.find_element_by_xpath('//div/span[contains(text(),"%s")]/..' % label)
471+
except NoSuchElementException:
472+
item_div = None
473+
474+
if visible_groups is None or item.session.group.acronym in visible_groups:
475+
self.assertIsNotNone(item_div, 'No weekview entry for "%s" (%s)' % (label, item.slug()))
476+
self.assertTrue(item_div.is_displayed(), 'Entry for "%s (%s)" is not displayed but should be' % (label, item.slug()))
477+
else:
478+
self.assertIsNone(item_div, 'Unexpected weekview entry for "%s" (%s)' % (label, item.slug()))
479+
427480
def test_agenda_view_group_filter_toggle(self):
428481
"""Clicking a group toggle enables/disables agenda filtering"""
429482
group_acronym = 'mars'
@@ -449,7 +502,7 @@ def test_agenda_view_group_filter_toggle(self):
449502
group_button.click()
450503

451504
# Check visibility
452-
self.assert_agenda_item_visibility([group_acronym] + self.PICKVIEWNEG)
505+
self.assert_agenda_item_visibility([group_acronym])
453506

454507
# Click the group button again
455508
group_button = WebDriverWait(self.driver, 2).until(

ietf/meeting/tests_views.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -801,7 +801,7 @@ def test_ical_filter_show_hide_and_showtypes(self):
801801
# ames regular session should be suppressed
802802
self.do_ical_filter_test(
803803
meeting,
804-
querystring='?show=mars&hide=ames&showtypes=plenary,regular',
804+
querystring='?show=ietf&hide=ames&showtypes=regular',
805805
expected_session_summaries=[
806806
'IETF Plenary',
807807
'mars - Martian Special Interest Group',

ietf/templates/meeting/agenda.html

Lines changed: 79 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -120,12 +120,12 @@ <h4 class="panel-title">
120120
{% endif %}
121121
<p>Also show special sessions of these groups:</p>
122122
<div class="btn-group btn-group-justified">
123-
<div class="btn-group"><button class="btn btn-default pickviewneg active iepg"> IEPG</button></div>
124-
<div class="btn-group"><button class="btn btn-default pickviewneg active tools"> Tools</button></div>
125-
<div class="btn-group"><button class="btn btn-default pickviewneg active edu"> EDU</button></div>
126-
<div class="btn-group"><button class="btn btn-default pickviewneg active ietf"> IETF</button></div>
127-
<div class="btn-group"><button class="btn btn-default pickviewneg active iesg"> IESG</button></div>
128-
<div class="btn-group"><button class="btn btn-default pickviewneg active iab"> IAB</button></div>
123+
<div class="btn-group"><button class="btn btn-default pickview iepg"> IEPG</button></div>
124+
<div class="btn-group"><button class="btn btn-default pickview tools"> Tools</button></div>
125+
<div class="btn-group"><button class="btn btn-default pickview edu"> EDU</button></div>
126+
<div class="btn-group"><button class="btn btn-default pickview ietf"> IETF</button></div>
127+
<div class="btn-group"><button class="btn btn-default pickview iesg"> IESG</button></div>
128+
<div class="btn-group"><button class="btn btn-default pickview iab"> IAB</button></div>
129129
</div>
130130
</div>
131131
</div>
@@ -362,10 +362,13 @@ <h2>
362362
function parse_query_params(qs) {
363363
var params = {};
364364
qs = qs.replace(/^\?/, '');
365-
$.each(qs.split('&'), function(i, v) {
366-
var toks = v.split('=', 2)
367-
params[toks[0]] = toks[1].toLowerCase();
368-
});
365+
if (qs) {
366+
var param_strs = qs.split('&');
367+
for (var ii = 0; ii < param_strs.length; ii++) {
368+
var toks = param_strs[ii].split('=', 2)
369+
params[toks[0]] = toks[1] || true;
370+
}
371+
}
369372
return params;
370373
}
371374

@@ -374,43 +377,56 @@ <h2>
374377
return qparams[filt] ? qparams[filt].split(',') : [];
375378
}
376379

377-
function toggle_visibility() {
378-
var qparams = parse_query_params(window.location.search);
379-
var show_groups = get_filter_from_qparams(qparams, 'show');
380-
var hide_groups = get_filter_from_qparams(qparams, 'hide');
380+
function get_filter_params(qparams) {
381+
return {
382+
show_groups: get_filter_from_qparams(qparams, 'show'),
383+
hide_groups: get_filter_from_qparams(qparams, 'hide'),
384+
show_types: get_filter_from_qparams(qparams, 'showtypes'),
385+
hide_types: get_filter_from_qparams(qparams, 'hidetypes'),
386+
};
387+
}
381388

389+
function toggle_visibility(filter_params) {
382390
// reset UI elements to default state
383391
$(".pickview").removeClass("active disabled");
384392
$(".pickviewneg").addClass("active");
385393

386-
if (show_groups.length || hide_groups.length) {
387-
// if groups were selected for filtering, hide all rows that are
388-
// hidden by default, show all rows that are shown by default
394+
if (filter_params['show_groups'].length ||
395+
filter_params['hide_groups'].length ||
396+
filter_params['show_types'].length ||
397+
filter_params['hide_types'].length
398+
) {
399+
// if groups were selected for filtering, hide all rows by default
389400
$('[id^="row-"]').hide();
390-
$.each($(".pickviewneg").text().trim().split(/ +/), function (i, v) {
391-
v = v.trim().toLowerCase();
392-
$('[id^="row-"]').filter('[id*="-' + v + '"]').show();
393-
});
394401

395402
// show the customizer
396403
$("#customize").collapse("show");
397404

398405
// loop through the has items and change the UI element and row visibilities accordingly
399-
$.each(hide_groups, function (i, v) {
400-
// this is a "negative" item: when present, hide these rows
406+
$.each(filter_params['show_groups'], function (i, v) {
407+
// this is a regular item by wg: when present, show these rows
408+
$('[id^="row-"]').filter('[id*="-' + v + '"]').show();
409+
$(".view." + v).find("button").addClass("active disabled");
410+
$("button.pickview." + v).addClass("active");
411+
});
412+
$.each(filter_params['show_types'], function (i, v) {
413+
// this is a regular item by type: when present, show these rows
414+
$('[id^="row-"]').filter('[timeslot-type*="' + v + '"]').show();
415+
});
416+
$.each(filter_params['hide_groups'], function (i, v) {
417+
// this is a "negative" item by wg: when present, hide these rows
401418
$('[id^="row-"]').filter('[id*="-' + v + '"]').hide();
402419
$(".view." + v).find("button").removeClass("active disabled");
403420
$("button.pickviewneg." + v).removeClass("active");
404421
});
405-
$.each(show_groups, function (i, v) {
406-
// this is a regular item: when present, show these rows
407-
$('[id^="row-"]').filter('[id*="-' + v + '"]').show();
408-
$(".view." + v).find("button").addClass("active disabled");
409-
$("button.pickview." + v).addClass("active");
422+
$.each(filter_params['hide_types'], function (i, v) {
423+
// this is a "negative" item by type: when present, hide these rows
424+
$('[id^="row-"]').filter('[timeslot-type*="' + v + '"]').hide();
410425
});
411426

412427
// show the week view
413-
$("#weekview").attr("src", "week-view.html" + window.location.search).removeClass("hidden");
428+
update_weekview();
429+
$("#weekview").removeClass("hidden");
414430

415431
// show the custom .ics link
416432
$("#ical-link").attr("href",$("#ical-link").attr("href").split("?")[0]+window.location.search);
@@ -426,16 +442,14 @@ <h2>
426442
$(".pickview, .pickviewneg").click(function () {
427443
// Get clicked item label
428444
var item = $(this).text().trim().toLowerCase();
429-
var qparams = parse_query_params(window.location.search);
430-
var show_groups = get_filter_from_qparams(qparams, 'show');
431-
var hide_groups = get_filter_from_qparams(qparams, 'hide');
445+
var fp = get_filter_params(parse_query_params(window.location.search));
432446

433447
if ($(this).hasClass("pickviewneg")) {
434-
toggle_list_item(hide_groups, item);
448+
toggle_list_item(fp['hide_groups'], item);
435449
} else {
436-
toggle_list_item(show_groups, item);
450+
toggle_list_item(fp['show_groups'], item);
437451
}
438-
update_filters(show_groups, hide_groups);
452+
update_filters(fp);
439453
});
440454

441455
/* Add to list if not present, remove if present */
@@ -448,14 +462,20 @@ <h2>
448462
}
449463
}
450464

451-
function update_filters(show, hide) {
465+
function update_filters(filter_params) {
452466
var qparams = [];
453467
var search = '';
454-
if (show.length > 0) {
455-
qparams.push('show=' + show.join());
468+
if (filter_params['show_groups'].length > 0) {
469+
qparams.push('show=' + filter_params['show_groups'].join());
470+
}
471+
if (filter_params['hide_groups'].length > 0) {
472+
qparams.push('hide=' + filter_params['hide_groups'].join());
473+
}
474+
if (filter_params['show_types'].length > 0) {
475+
qparams.push('showtypes=' + filter_params['show_types'].join());
456476
}
457-
if (hide.length > 0) {
458-
qparams.push('hide=' + hide.join());
477+
if (filter_params['hide_types'].length > 0) {
478+
qparams.push('hidetypes=' + filter_params['hide_types'].join());
459479
}
460480
if (qparams.length > 0) {
461481
search = '?' + qparams.join('&');
@@ -466,15 +486,32 @@ <h2>
466486
if (window.history && window.history.replaceState) {
467487
// Keep current origin, replace search string, no page reload
468488
history.replaceState({}, document.title, new_url);
469-
toggle_visibility();
489+
toggle_visibility(filter_params);
470490
} else {
471491
// No window.history.replaceState support, page reload required
472492
window.location = new_url;
473493
}
474494
}
475495

496+
function update_weekview() {
497+
var wv_iframe = document.getElementById('weekview');
498+
var wv_window = wv_iframe.contentWindow;
499+
var new_url = 'week-view.html' + window.location.search;
500+
if (wv_iframe.src && wv_window.history && wv_window.history.replaceState) {
501+
wv_window.history.replaceState({}, '', new_url);
502+
wv_window.draw_calendar()
503+
} else {
504+
// ho history.replaceState, page reload required
505+
wv_iframe.src = new_url;
506+
}
507+
}
508+
476509
$(document).ready(function () {
477-
toggle_visibility();
510+
toggle_visibility(
511+
get_filter_params(
512+
parse_query_params(window.location.search)
513+
)
514+
);
478515
});
479516

480517
$(".modal").on("show.bs.modal", function () {

0 commit comments

Comments
 (0)