hotkeys: Add arrow key navigation in streams/subscriptions menu.

Fixes #4198.
This commit is contained in:
Cynthia Lin 2017-03-21 18:49:52 -07:00 committed by Tim Abbott
parent 1a6efc9705
commit 1dfac12c4b
3 changed files with 41 additions and 0 deletions

View File

@ -174,6 +174,7 @@ function stubbing(func_name_to_stub, test_function) {
// Ok, now test keys that work when we're viewing messages.
hotkey.processing_text = return_false;
hotkey.is_settings_page = return_false;
hotkey.is_subs = return_false;
assert_mapping('?', 'ui.show_info_overlay');
assert_mapping('/', 'search.initiate_search');
@ -278,6 +279,12 @@ function stubbing(func_name_to_stub, test_function) {
assert_mapping('left_arrow', 'lightbox.prev');
assert_mapping('right_arrow', 'lightbox.next');
hotkey.is_subs = return_true;
global.ui_state.home_tab_obscured = return_true;
assert_mapping('up_arrow', 'subs.arrow_keys');
assert_mapping('down_arrow', 'subs.arrow_keys');
global.ui_state.home_tab_obscured = return_false;
hotkey.is_settings_page = return_true;
assert_unmapped('end');
assert_unmapped('home');

View File

@ -33,6 +33,10 @@ exports.is_lightbox_open = function () {
return lightbox.is_open;
};
exports.is_subs = function () {
return subs.is_open;
};
var actions_dropdown_hotkeys = [
'down_arrow',
'up_arrow',
@ -427,6 +431,11 @@ exports.process_hotkey = function (e, hotkey) {
}
if (hotkey.message_view_only && ui_state.home_tab_obscured()) {
// if up/down arrow key was pressed and streams menu is open
if ((event_name === 'up_arrow' || event_name === 'down_arrow') && exports.is_subs()) {
subs.arrow_keys(event_name);
return true;
}
return false;
}

View File

@ -715,6 +715,31 @@ exports.close = function () {
subs.remove_miscategorized_streams();
};
exports.arrow_keys = function (event) {
var active_row = $('div.stream-row.active'); // current active row
var switch_row; // initialize var for row that we're switching to
// if rows have undefined attributes (no selected/active row)
if (!active_row.attr('data-stream-id')) {
switch_row = $('div.stream-row:first-child'); // set active row to first row
} else if (event === 'up_arrow') {
switch_row = active_row.prev(); // previous row
} else if (event === 'down_arrow') {
switch_row = active_row.next(); // next row
}
var switch_row_id = switch_row.attr('data-stream-id');
// if both ID and row are defined, making sure to escape hidden rows
if (switch_row_id && !switch_row.hasClass('notdisplayed')) {
var switch_row_name = stream_data.get_sub_by_id(switch_row_id).name;
var hash = ['#streams', switch_row_id, switch_row_name]; // set hash
var hash_components = { // hash_components to send to subs.change_state()
base: hash.shift(),
arguments: hash,
};
exports.change_state(hash_components);
}
};
function ajaxSubscribe(stream) {
// Subscribe yourself to a single stream.
var true_stream_name;