mirror of
https://github.com/zulip/zulip.git
synced 2025-11-05 06:23:38 +00:00
inbox: Add page up/down support similar to recent topics.
Leaving page up / down to browser doesn't work very well due to our custom header, filters and compose.
This commit is contained in:
@@ -665,6 +665,8 @@ export function process_hotkey(e, hotkey) {
|
|||||||
case "vim_down":
|
case "vim_down":
|
||||||
case "vim_left":
|
case "vim_left":
|
||||||
case "vim_right":
|
case "vim_right":
|
||||||
|
case "page_up":
|
||||||
|
case "page_down":
|
||||||
if (inbox_ui.is_in_focus()) {
|
if (inbox_ui.is_in_focus()) {
|
||||||
return inbox_ui.change_focused_element(event_name);
|
return inbox_ui.change_focused_element(event_name);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -837,6 +837,48 @@ function is_muted_filter_focused() {
|
|||||||
return current_focus_id === MUTED_FILTER_ID;
|
return current_focus_id === MUTED_FILTER_ID;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function get_page_up_down_delta() {
|
||||||
|
const element_above = document.querySelector("#inbox-filters");
|
||||||
|
const element_down = document.querySelector("#compose");
|
||||||
|
const visible_top = element_above.getBoundingClientRect().bottom;
|
||||||
|
const visible_bottom = element_down.getBoundingClientRect().top;
|
||||||
|
// One usually wants PageDown to move what had been the bottom row
|
||||||
|
// to now be at the top, so one can be confident one will see
|
||||||
|
// every row using it. This offset helps achieve that goal.
|
||||||
|
//
|
||||||
|
// See navigate.amount_to_paginate for similar logic in the message feed.
|
||||||
|
const scrolling_reduction_to_maintain_context = 30;
|
||||||
|
|
||||||
|
const delta = visible_bottom - visible_top - scrolling_reduction_to_maintain_context;
|
||||||
|
return delta;
|
||||||
|
}
|
||||||
|
|
||||||
|
function page_up_navigation() {
|
||||||
|
const delta = get_page_up_down_delta();
|
||||||
|
const scroll_element = document.documentElement;
|
||||||
|
const new_scrollTop = scroll_element.scrollTop - delta;
|
||||||
|
if (new_scrollTop <= 0) {
|
||||||
|
row_focus = 0;
|
||||||
|
}
|
||||||
|
scroll_element.scrollTop = new_scrollTop;
|
||||||
|
set_list_focus();
|
||||||
|
}
|
||||||
|
|
||||||
|
function page_down_navigation() {
|
||||||
|
const delta = get_page_up_down_delta();
|
||||||
|
const scroll_element = document.documentElement;
|
||||||
|
const new_scrollTop = scroll_element.scrollTop + delta;
|
||||||
|
const $all_rows = get_all_rows();
|
||||||
|
const $last_row = $all_rows.last();
|
||||||
|
const last_row_bottom = $last_row.offset().top + $last_row.outerHeight();
|
||||||
|
// Move focus to last row if it is visible and we are at the bottom.
|
||||||
|
if (last_row_bottom <= new_scrollTop) {
|
||||||
|
row_focus = get_all_rows().length - 1;
|
||||||
|
}
|
||||||
|
scroll_element.scrollTop = new_scrollTop;
|
||||||
|
set_list_focus();
|
||||||
|
}
|
||||||
|
|
||||||
export function change_focused_element(input_key) {
|
export function change_focused_element(input_key) {
|
||||||
if (is_search_focused()) {
|
if (is_search_focused()) {
|
||||||
const textInput = $(`#${INBOX_SEARCH_ID}`).get(0);
|
const textInput = $(`#${INBOX_SEARCH_ID}`).get(0);
|
||||||
@@ -911,6 +953,12 @@ export function change_focused_element(input_key) {
|
|||||||
col_focus -= 1;
|
col_focus -= 1;
|
||||||
set_list_focus(input_key);
|
set_list_focus(input_key);
|
||||||
return true;
|
return true;
|
||||||
|
case "page_up":
|
||||||
|
page_up_navigation();
|
||||||
|
return true;
|
||||||
|
case "page_down":
|
||||||
|
page_down_navigation();
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user