left_sidebar: Show the search bar all the time.

This is preparation for adding channel folders to the sidebar
and removing the CHANNELS header, where we'll want to have an
always open search bar.
This commit is contained in:
Evy Kassirer
2025-06-24 12:10:59 -07:00
committed by Tim Abbott
parent 0ba4c9cb6c
commit dc013b6a10
9 changed files with 21 additions and 161 deletions

View File

@@ -43,15 +43,6 @@ export function initialize(): void {
placement: "bottom", placement: "bottom",
}); });
const filter_streams_tooltip: (tippy.ReferenceElement & HTMLElement) | undefined =
$("#filter_streams_tooltip").get(0);
// If `filter_streams_tooltip` is not triggered yet, this will set its initial placement.
assert(filter_streams_tooltip !== undefined);
filter_streams_tooltip.dataset.tippyPlacement = "bottom";
filter_streams_tooltip._tippy?.setProps({
placement: "bottom",
});
return undefined; return undefined;
}, },
onHidden(instance) { onHidden(instance) {
@@ -70,14 +61,6 @@ export function initialize(): void {
add_streams_tooltip._tippy?.setProps({ add_streams_tooltip._tippy?.setProps({
placement: "top", placement: "top",
}); });
const filter_streams_tooltip: (tippy.ReferenceElement & HTMLElement) | undefined =
$("#filter_streams_tooltip").get(0);
assert(filter_streams_tooltip !== undefined);
filter_streams_tooltip.dataset.tippyPlacement = "top";
filter_streams_tooltip._tippy?.setProps({
placement: "top",
});
}, },
}); });
} }

View File

@@ -830,11 +830,6 @@ export function initialize(): void {
topic_list.clear_topic_search, topic_list.clear_topic_search,
); );
$(".streams_filter_icon").on("click", (e) => {
e.stopPropagation();
stream_list.toggle_filter_displayed(e);
});
$("body").on("click", "#direct-messages-section-header.zoom-out", (e) => { $("body").on("click", "#direct-messages-section-header.zoom-out", (e) => {
if ($(e.target).closest("#show-all-direct-messages").length === 1) { if ($(e.target).closest("#show-all-direct-messages").length === 1) {
// Let the browser handle the "direct message feed" widget. // Let the browser handle the "direct message feed" widget.

View File

@@ -432,7 +432,7 @@ export function process_escape_key(e) {
} }
if (stream_list.searching()) { if (stream_list.searching()) {
stream_list.clear_and_hide_search(); stream_list.clear_search();
return true; return true;
} }
@@ -597,14 +597,6 @@ export function process_enter_key(e) {
} }
if (processing_text()) { if (processing_text()) {
if (stream_list.searching()) {
// This is sort of funny behavior, but I think
// the intention is that we want it super easy
// to close stream search.
stream_list.clear_and_hide_search();
return true;
}
// Don't send the message if topic box is focused. // Don't send the message if topic box is focused.
if (compose.is_topic_input_focused()) { if (compose.is_topic_input_focused()) {
return true; return true;

View File

@@ -137,7 +137,7 @@ export function initialize(): void {
}); });
tippy.delegate("body", { tippy.delegate("body", {
target: ["#streams_header .streams-tooltip-target", "#filter_streams_tooltip"].join(","), target: "#streams_header .streams-tooltip-target",
appendTo: () => document.body, appendTo: () => document.body,
}); });

View File

@@ -923,7 +923,7 @@ function on_sidebar_channel_click(
e: JQuery.ClickEvent | null, e: JQuery.ClickEvent | null,
show_channel_feed: (stream_id: number, trigger: string) => void, show_channel_feed: (stream_id: number, trigger: string) => void,
): void { ): void {
clear_and_hide_search(); clear_search();
if (e !== null) { if (e !== null) {
e.preventDefault(); e.preventDefault();
e.stopPropagation(); e.stopPropagation();
@@ -1126,21 +1126,8 @@ export function test_clear_search(): void {
update_streams_for_search(); update_streams_for_search();
} }
export function show_search_section(): void {
$("#streams_header").addClass("showing-stream-search-section");
$(".stream_search_section").expectOne().removeClass("notdisplayed");
resize.resize_stream_filters_container();
}
export function hide_search_section(): void {
$("#streams_header").removeClass("showing-stream-search-section");
$(".stream_search_section").expectOne().addClass("notdisplayed");
resize.resize_stream_filters_container();
}
export function initiate_search(): void { export function initiate_search(): void {
popovers.hide_all(); popovers.hide_all();
show_search_section();
const $filter = $(".stream-list-filter").expectOne(); const $filter = $(".stream-list-filter").expectOne();
@@ -1150,7 +1137,7 @@ export function initiate_search(): void {
stream_cursor.reset(); stream_cursor.reset();
} }
export function clear_and_hide_search(): void { export function clear_search(): void {
const $filter = $(".stream-list-filter").expectOne(); const $filter = $(".stream-list-filter").expectOne();
if ($filter.val() !== "") { if ($filter.val() !== "") {
$filter.val(""); $filter.val("");
@@ -1158,17 +1145,6 @@ export function clear_and_hide_search(): void {
} }
stream_cursor.clear(); stream_cursor.clear();
$filter.trigger("blur"); $filter.trigger("blur");
hide_search_section();
}
export function toggle_filter_displayed(e: JQuery.ClickEvent): void {
if ($(".stream_search_section.notdisplayed").length === 0) {
clear_and_hide_search();
} else {
initiate_search();
}
e.preventDefault();
} }
function scroll_stream_into_view($stream_li: JQuery): void { function scroll_stream_into_view($stream_li: JQuery): void {

View File

@@ -48,8 +48,7 @@
margin-right: var(--left-sidebar-right-margin); margin-right: var(--left-sidebar-right-margin);
} }
#streams_inline_icon, #streams_inline_icon {
.streams_filter_icon {
color: var(--color-left-sidebar-heads-up-icon); color: var(--color-left-sidebar-heads-up-icon);
border-radius: 3px; border-radius: 3px;
@@ -62,10 +61,6 @@
} }
} }
.streams_filter_icon.web_public {
margin-right: 10px;
}
.masked_unread_count { .masked_unread_count {
/* 8px at 16px/14em */ /* 8px at 16px/14em */
font-size: 0.5em; font-size: 0.5em;
@@ -1818,18 +1813,6 @@ li.topic-list-item {
} }
} }
#filter_streams_tooltip {
display: none;
align-items: center;
justify-content: center;
grid-row: 1 / 1;
margin: 2px 0;
@media (hover: none) {
display: flex;
}
}
#add_streams_tooltip { #add_streams_tooltip {
grid-row: 1 / 1; grid-row: 1 / 1;
margin: 2px 0; margin: 2px 0;
@@ -1862,7 +1845,6 @@ li.topic-list-item {
opacity: var(--opacity-sidebar-heading-hover); opacity: var(--opacity-sidebar-heading-hover);
} }
#filter_streams_tooltip,
#streams_inline_icon { #streams_inline_icon {
display: flex; display: flex;
} }

View File

@@ -195,10 +195,9 @@
</div> </div>
<div id="streams_list" class="zoom-out"> <div id="streams_list" class="zoom-out">
<div id="streams_header" class="zoom-in-hide"> <div id="streams_header" class="showing-stream-search-section zoom-in-hide">
<h4 class="left-sidebar-title"><span class="streams-tooltip-target" data-tooltip-template-id="filter-streams-tooltip-template">{{t 'CHANNELS' }}</span></h4> <h4 class="left-sidebar-title"><span class="streams-tooltip-target">{{t 'CHANNELS' }}</span></h4>
<div class="left-sidebar-controls"> <div class="left-sidebar-controls">
<i id="filter_streams_tooltip" class="streams_filter_icon zulip-icon zulip-icon-search" aria-hidden="true" data-tooltip-template-id="filter-streams-tooltip-template"></i>
<span id="add_streams_tooltip" class="hidden-for-spectators"> <span id="add_streams_tooltip" class="hidden-for-spectators">
<i id="streams_inline_icon" class="zulip-icon zulip-icon-square-plus" aria-hidden="true" ></i> <i id="streams_inline_icon" class="zulip-icon zulip-icon-square-plus" aria-hidden="true" ></i>
</span> </span>
@@ -210,7 +209,7 @@
</span> </span>
</div> </div>
<div class="left-sidebar-filter-input-container"> <div class="left-sidebar-filter-input-container">
{{#> input_wrapper input_type="filter-input" custom_classes="notdisplayed stream_search_section" icon="search" input_button_icon="close"}} {{#> input_wrapper input_type="filter-input" custom_classes="stream_search_section" icon="search" input_button_icon="close"}}
<input type="text" class="input-element stream-list-filter home-page-input" autocomplete="off" placeholder="{{t 'Filter channels' }}" /> <input type="text" class="input-element stream-list-filter home-page-input" autocomplete="off" placeholder="{{t 'Filter channels' }}" />
{{/input_wrapper}} {{/input_wrapper}}
</div> </div>

View File

@@ -181,10 +181,6 @@
<div class="tootlip-inner-content views-message-count italic"></div> <div class="tootlip-inner-content views-message-count italic"></div>
</div> </div>
</template> </template>
<template id="filter-streams-tooltip-template">
{{t 'Filter channels' }}
{{tooltip_hotkey_hints "Q"}}
</template>
<template id="message-expander-tooltip-template"> <template id="message-expander-tooltip-template">
{{t 'Show more' }} {{t 'Show more' }}
{{tooltip_hotkey_hints "-"}} {{tooltip_hotkey_hints "-"}}

View File

@@ -41,21 +41,6 @@ function make_cursor_helper(override_rewire) {
}; };
} }
function simulate_search_expanded() {
// The way we check if the search widget is expanded
// is kind of awkward.
$(".stream_search_section.notdisplayed").length = 0;
}
function simulate_search_collapsed() {
$(".stream_search_section.notdisplayed").length = 1;
}
function toggle_filter() {
stream_list.toggle_filter_displayed({preventDefault: noop});
}
function clear_search_input() { function clear_search_input() {
stream_list.test_clear_search(); stream_list.test_clear_search();
} }
@@ -65,28 +50,19 @@ run_test("basics", ({override, override_rewire}) => {
override(sidebar_ui, "show_left_sidebar", noop); override(sidebar_ui, "show_left_sidebar", noop);
const $input = $(".stream-list-filter"); const $input = $(".stream-list-filter");
const $section = $(".stream_search_section");
expand_sidebar(); expand_sidebar();
$section.addClass("notdisplayed");
let cursor_helper = make_cursor_helper(override_rewire); let cursor_helper = make_cursor_helper(override_rewire);
function verify_expanded() {
assert.ok(!$section.hasClass("notdisplayed"));
simulate_search_expanded();
}
function verify_focused() { function verify_focused() {
assert.ok(stream_list.searching()); assert.ok(stream_list.searching());
assert.ok($input.is_focused()); assert.ok($input.is_focused());
} }
function verify_collapsed() { function verify_not_focused() {
assert.ok($section.hasClass("notdisplayed"));
assert.ok(!$input.is_focused());
assert.ok(!stream_list.searching()); assert.ok(!stream_list.searching());
simulate_search_collapsed(); assert.ok(!$input.is_focused());
} }
function verify_list_updated(f) { function verify_list_updated(f) {
@@ -99,70 +75,31 @@ run_test("basics", ({override, override_rewire}) => {
assert.ok(updated); assert.ok(updated);
} }
// Initiate search (so expand widget). // Initiate search
stream_list.initiate_search(); stream_list.initiate_search();
verify_expanded();
verify_focused(); verify_focused();
assert.deepEqual(cursor_helper.events, ["reset"]); (function add_some_text_and_clear() {
stream_list.initiate_search();
// Collapse the widget.
cursor_helper = make_cursor_helper(override_rewire);
toggle_filter();
verify_collapsed();
assert.deepEqual(cursor_helper.events, ["clear"]);
// Expand the widget.
toggle_filter();
verify_expanded();
verify_focused();
(function add_some_text_and_collapse() {
cursor_helper = make_cursor_helper(override_rewire); cursor_helper = make_cursor_helper(override_rewire);
$input.val("foo"); $input.val("foo");
verify_list_updated(() => { verify_list_updated(() => {
toggle_filter(); clear_search_input();
}); });
assert.deepEqual(cursor_helper.events, ["reset"]);
verify_collapsed();
assert.deepEqual(cursor_helper.events, ["reset", "clear"]);
})(); })();
// Expand the widget.
toggle_filter();
verify_expanded();
verify_focused();
// Expand the widget.
toggle_filter();
stream_list.initiate_search();
// Clear a non-empty search.
$input.val("foo");
verify_list_updated(() => {
clear_search_input();
});
verify_expanded();
// Expand the widget.
toggle_filter();
stream_list.initiate_search();
// Escape a non-empty search. // Escape a non-empty search.
$input.val("foo");
stream_list.clear_and_hide_search();
verify_collapsed();
// Expand the widget.
toggle_filter();
stream_list.initiate_search(); stream_list.initiate_search();
$input.val("foo");
stream_list.clear_search();
verify_not_focused();
// Escape an empty search. // Escape an empty search.
stream_list.initiate_search();
$input.val(""); $input.val("");
stream_list.clear_and_hide_search(); stream_list.clear_search();
verify_collapsed(); verify_not_focused();
}); });
run_test("expanding_sidebar", ({override, override_rewire}) => { run_test("expanding_sidebar", ({override, override_rewire}) => {