mirror of
https://github.com/zulip/zulip.git
synced 2025-11-04 14:03:30 +00:00
search: Empty input on open, and show current narrow search suggestions.
Fixes #30911
This commit is contained in:
@@ -179,8 +179,6 @@ async function search_and_check(
|
|||||||
): Promise<void> {
|
): Promise<void> {
|
||||||
await page.click(".search_icon");
|
await page.click(".search_icon");
|
||||||
await page.waitForSelector(".navbar-search.expanded", {visible: true});
|
await page.waitForSelector(".navbar-search.expanded", {visible: true});
|
||||||
// Close the "in: home" pill
|
|
||||||
await page.click(".navbar-search .pill-close-button");
|
|
||||||
await common.select_item_via_typeahead(page, "#search_query", search_str, item_to_select);
|
await common.select_item_via_typeahead(page, "#search_query", search_str, item_to_select);
|
||||||
// Enter to trigger search
|
// Enter to trigger search
|
||||||
await page.keyboard.press("Enter");
|
await page.keyboard.press("Enter");
|
||||||
@@ -193,8 +191,6 @@ async function search_and_check(
|
|||||||
async function search_silent_user(page: Page, str: string, item: string): Promise<void> {
|
async function search_silent_user(page: Page, str: string, item: string): Promise<void> {
|
||||||
await page.click(".search_icon");
|
await page.click(".search_icon");
|
||||||
await page.waitForSelector(".navbar-search.expanded", {visible: true});
|
await page.waitForSelector(".navbar-search.expanded", {visible: true});
|
||||||
// Close the "in: home" pill
|
|
||||||
await page.click(".navbar-search .pill-close-button");
|
|
||||||
await common.select_item_via_typeahead(page, "#search_query", str, item);
|
await common.select_item_via_typeahead(page, "#search_query", str, item);
|
||||||
// Enter to trigger search
|
// Enter to trigger search
|
||||||
await page.keyboard.press("Enter");
|
await page.keyboard.press("Enter");
|
||||||
|
|||||||
@@ -6,7 +6,6 @@ import render_search_list_item from "../templates/search_list_item.hbs";
|
|||||||
import {Typeahead} from "./bootstrap_typeahead";
|
import {Typeahead} from "./bootstrap_typeahead";
|
||||||
import type {TypeaheadInputElement} from "./bootstrap_typeahead";
|
import type {TypeaheadInputElement} from "./bootstrap_typeahead";
|
||||||
import {Filter} from "./filter";
|
import {Filter} from "./filter";
|
||||||
import type {RemovePillTrigger} from "./input_pill";
|
|
||||||
import * as keydown_util from "./keydown_util";
|
import * as keydown_util from "./keydown_util";
|
||||||
import * as narrow_state from "./narrow_state";
|
import * as narrow_state from "./narrow_state";
|
||||||
import * as popovers from "./popovers";
|
import * as popovers from "./popovers";
|
||||||
@@ -168,7 +167,13 @@ export function initialize(opts: {on_narrow_search: OnNarrowSearch}): void {
|
|||||||
assert(search_pill_widget !== null);
|
assert(search_pill_widget !== null);
|
||||||
const query_from_pills =
|
const query_from_pills =
|
||||||
search_pill.get_current_search_string_for_widget(search_pill_widget);
|
search_pill.get_current_search_string_for_widget(search_pill_widget);
|
||||||
const suggestions = search_suggestion.get_suggestions(query_from_pills, query);
|
const add_current_filter =
|
||||||
|
query_from_pills === "" && narrow_state.filter() !== undefined;
|
||||||
|
const suggestions = search_suggestion.get_suggestions(
|
||||||
|
query_from_pills,
|
||||||
|
query,
|
||||||
|
add_current_filter,
|
||||||
|
);
|
||||||
// Update our global search_map hash
|
// Update our global search_map hash
|
||||||
search_map = suggestions.lookup_table;
|
search_map = suggestions.lookup_table;
|
||||||
return suggestions.strings;
|
return suggestions.strings;
|
||||||
@@ -361,7 +366,7 @@ export function initialize(opts: {on_narrow_search: OnNarrowSearch}): void {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export function initiate_search(): void {
|
export function initiate_search(): void {
|
||||||
open_search_bar_and_close_narrow_description();
|
open_search_bar_and_close_narrow_description(true);
|
||||||
focus_search_input_at_end();
|
focus_search_input_at_end();
|
||||||
|
|
||||||
// Open the typeahead after opening the search bar, so that we don't
|
// Open the typeahead after opening the search bar, so that we don't
|
||||||
@@ -372,15 +377,17 @@ export function initiate_search(): void {
|
|||||||
|
|
||||||
// we rely entirely on this function to ensure
|
// we rely entirely on this function to ensure
|
||||||
// the searchbar has the right text/pills.
|
// the searchbar has the right text/pills.
|
||||||
function reset_searchbox(): void {
|
function reset_searchbox(clear = false): void {
|
||||||
assert(search_pill_widget !== null);
|
assert(search_pill_widget !== null);
|
||||||
search_pill_widget.clear(true);
|
search_pill_widget.clear(true);
|
||||||
search_input_has_changed = false;
|
search_input_has_changed = false;
|
||||||
|
if (!clear) {
|
||||||
search_pill.set_search_bar_contents(
|
search_pill.set_search_bar_contents(
|
||||||
narrow_state.search_terms(),
|
narrow_state.search_terms(),
|
||||||
search_pill_widget,
|
search_pill_widget,
|
||||||
set_search_bar_text,
|
set_search_bar_text,
|
||||||
);
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function exit_search(opts: {keep_search_narrow_open: boolean}): void {
|
function exit_search(opts: {keep_search_narrow_open: boolean}): void {
|
||||||
@@ -399,8 +406,8 @@ function exit_search(opts: {keep_search_narrow_open: boolean}): void {
|
|||||||
$(".app").trigger("focus");
|
$(".app").trigger("focus");
|
||||||
}
|
}
|
||||||
|
|
||||||
export function open_search_bar_and_close_narrow_description(): void {
|
export function open_search_bar_and_close_narrow_description(clear = false): void {
|
||||||
reset_searchbox();
|
reset_searchbox(clear);
|
||||||
$(".navbar-search").addClass("expanded");
|
$(".navbar-search").addClass("expanded");
|
||||||
$("#message_view_header").addClass("hidden");
|
$("#message_view_header").addClass("hidden");
|
||||||
popovers.hide_all();
|
popovers.hide_all();
|
||||||
|
|||||||
@@ -842,13 +842,51 @@ function suggestion_search_string(suggestion_line: SuggestionLine): string {
|
|||||||
return search_strings.join(" ");
|
return search_strings.join(" ");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function suggestions_for_current_filter(): SuggestionLine[] {
|
||||||
|
if (narrow_state.stream_name() && narrow_state.topic() !== "") {
|
||||||
|
return [
|
||||||
|
get_default_suggestion_line([
|
||||||
|
{
|
||||||
|
operator: "channel",
|
||||||
|
operand: narrow_state.stream_name()!,
|
||||||
|
},
|
||||||
|
]),
|
||||||
|
get_default_suggestion_line(narrow_state.search_terms()),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
if (narrow_state.pm_emails_string()) {
|
||||||
|
return [
|
||||||
|
get_default_suggestion_line([
|
||||||
|
{
|
||||||
|
operator: "is",
|
||||||
|
operand: "dm",
|
||||||
|
},
|
||||||
|
]),
|
||||||
|
get_default_suggestion_line(narrow_state.search_terms()),
|
||||||
|
];
|
||||||
|
}
|
||||||
|
return [get_default_suggestion_line(narrow_state.search_terms())];
|
||||||
|
}
|
||||||
|
|
||||||
class Attacher {
|
class Attacher {
|
||||||
result: SuggestionLine[] = [];
|
result: SuggestionLine[] = [];
|
||||||
prev = new Set<string>();
|
prev = new Set<string>();
|
||||||
base: SuggestionLine;
|
base: SuggestionLine;
|
||||||
|
add_current_filter: boolean;
|
||||||
|
|
||||||
constructor(base: SuggestionLine) {
|
constructor(base: SuggestionLine, search_query_is_empty: boolean, add_current_filter: boolean) {
|
||||||
this.base = base;
|
this.base = base;
|
||||||
|
this.add_current_filter = add_current_filter;
|
||||||
|
// Sometimes we add suggestions with the current filter in case
|
||||||
|
// the user wants to search within the current filter. For an empty
|
||||||
|
// search query, we put the current filter suggestions at the start
|
||||||
|
// of the list.
|
||||||
|
if (search_query_is_empty && this.add_current_filter) {
|
||||||
|
this.add_current_filter = false;
|
||||||
|
for (const current_filter_line of suggestions_for_current_filter()) {
|
||||||
|
this.push(current_filter_line);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
push(suggestion_line: SuggestionLine): void {
|
push(suggestion_line: SuggestionLine): void {
|
||||||
@@ -926,7 +964,11 @@ class Attacher {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
export function get_search_result(query_from_pills: string, query_from_text: string): Suggestion[] {
|
export function get_search_result(
|
||||||
|
query_from_pills: string,
|
||||||
|
query_from_text: string,
|
||||||
|
add_current_filter = false,
|
||||||
|
): Suggestion[] {
|
||||||
let suggestion_line: SuggestionLine;
|
let suggestion_line: SuggestionLine;
|
||||||
|
|
||||||
// search_terms correspond to the terms for the query in the input.
|
// search_terms correspond to the terms for the query in the input.
|
||||||
@@ -971,7 +1013,7 @@ export function get_search_result(query_from_pills: string, query_from_text: str
|
|||||||
|
|
||||||
const base_terms = [...pill_search_terms, ...text_search_terms.slice(0, -1)];
|
const base_terms = [...pill_search_terms, ...text_search_terms.slice(0, -1)];
|
||||||
const base = get_default_suggestion_line(base_terms);
|
const base = get_default_suggestion_line(base_terms);
|
||||||
const attacher = new Attacher(base);
|
const attacher = new Attacher(base, all_search_terms.length === 0, add_current_filter);
|
||||||
|
|
||||||
// Display the default first, unless it has invalid terms.
|
// Display the default first, unless it has invalid terms.
|
||||||
if (last.operator === "search") {
|
if (last.operator === "search") {
|
||||||
@@ -1055,11 +1097,12 @@ export function get_search_result(query_from_pills: string, query_from_text: str
|
|||||||
export function get_suggestions(
|
export function get_suggestions(
|
||||||
query_from_pills: string,
|
query_from_pills: string,
|
||||||
query_from_text: string,
|
query_from_text: string,
|
||||||
|
add_current_filter = false,
|
||||||
): {
|
): {
|
||||||
strings: string[];
|
strings: string[];
|
||||||
lookup_table: Map<string, Suggestion>;
|
lookup_table: Map<string, Suggestion>;
|
||||||
} {
|
} {
|
||||||
const result = get_search_result(query_from_pills, query_from_text);
|
const result = get_search_result(query_from_pills, query_from_text, add_current_filter);
|
||||||
return finalize_search_result(result);
|
return finalize_search_result(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user