2023-11-18 13:23:22 -05:00
|
|
|
//! A module that handles the view for the search page in the `websurfx` frontend.
|
2023-11-17 14:10:06 -05:00
|
|
|
|
|
|
|
use maud::{html, Markup, PreEscaped};
|
|
|
|
|
|
|
|
use crate::{
|
|
|
|
models::aggregation_models::SearchResults,
|
|
|
|
templates::partials::{footer::footer, header::header, search_bar::search_bar},
|
|
|
|
};
|
|
|
|
|
2023-11-18 13:23:22 -05:00
|
|
|
/// A function that handles the html code for the search page view in the search engine frontend.
|
2023-11-17 14:10:06 -05:00
|
|
|
///
|
2023-11-18 13:23:22 -05:00
|
|
|
/// # Arguments
|
|
|
|
///
|
|
|
|
/// * `colorscheme` - It takes the colorscheme name as an argument.
|
|
|
|
/// * `theme` - It takes the theme name as an argument.
|
|
|
|
/// * `query` - It takes the current search query provided by the user as an argument.
|
|
|
|
/// * `search_results` - It takes the aggregated search results as an argument.
|
|
|
|
///
|
|
|
|
/// # Returns
|
|
|
|
///
|
|
|
|
/// It returns the compiled html markup code as a result.
|
2023-11-17 14:10:06 -05:00
|
|
|
pub fn search(
|
|
|
|
colorscheme: &str,
|
|
|
|
theme: &str,
|
|
|
|
query: &str,
|
|
|
|
search_results: &SearchResults,
|
|
|
|
) -> Markup {
|
|
|
|
html!(
|
|
|
|
(header(colorscheme, theme))
|
|
|
|
main class="results"{
|
|
|
|
(search_bar(&search_results.engine_errors_info, search_results.safe_search_level, query))
|
|
|
|
.results_aggregated{
|
|
|
|
@if !search_results.results.is_empty() {
|
|
|
|
@for result in search_results.results.iter(){
|
|
|
|
.result {
|
|
|
|
h1{a href=(result.url){(PreEscaped(&result.title))}}
|
|
|
|
small{(result.url)}
|
|
|
|
p{(PreEscaped(&result.description))}
|
|
|
|
.upstream_engines{
|
|
|
|
@for name in result.clone().engine{
|
|
|
|
span{(name)}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
@else if search_results.disallowed{
|
|
|
|
.result_disallowed{
|
|
|
|
.description{
|
|
|
|
p{
|
|
|
|
"Your search - "{span class="user_query"{(query)}}" -
|
|
|
|
has been disallowed."
|
|
|
|
}
|
|
|
|
p class="description_paragraph"{"Dear user,"}
|
|
|
|
p class="description_paragraph"{
|
|
|
|
"The query - "{span class="user_query"{(query)}}" - has
|
|
|
|
been blacklisted via server configuration and hence disallowed by the
|
|
|
|
server. Henceforth no results could be displayed for your query."
|
|
|
|
}
|
|
|
|
}
|
|
|
|
img src="./images/barricade.png" alt="Image of a Barricade";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
@else if search_results.filtered {
|
|
|
|
.result_filtered{
|
|
|
|
.description{
|
|
|
|
p{
|
|
|
|
"Your search - "{span class="user_query"{(query)}}" -
|
|
|
|
has been filtered."
|
|
|
|
}
|
|
|
|
p class="description_paragraph"{"Dear user,"}
|
|
|
|
p class="description_paragraph"{
|
|
|
|
"All the search results contain results that has been configured to be
|
|
|
|
filtered out via server configuration and henceforth has been
|
|
|
|
completely filtered out."
|
|
|
|
}
|
|
|
|
}
|
|
|
|
img src="./images/filter.png" alt="Image of a paper inside a funnel";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
@else if search_results.no_engines_selected {
|
|
|
|
.result_engine_not_selected{
|
|
|
|
.description{
|
|
|
|
p{
|
|
|
|
"No results could be fetched for your search '{span class="user_query"{(query)}}'."
|
|
|
|
}
|
|
|
|
p class="description_paragraph"{"Dear user,"}
|
|
|
|
p class="description_paragraph"{
|
|
|
|
"No results could be retrieved from the upstream search engines as no
|
|
|
|
upstream search engines were selected from the settings page."
|
|
|
|
}
|
|
|
|
}
|
|
|
|
img src="./images/no_selection.png" alt="Image of a white cross inside a red circle";
|
|
|
|
}
|
|
|
|
}
|
2023-11-27 01:45:28 -05:00
|
|
|
@else {
|
2023-11-17 14:10:06 -05:00
|
|
|
.result_not_found {
|
|
|
|
p{"Your search - "{(query)}" - did not match any documents."}
|
|
|
|
p class="suggestions"{"Suggestions:"}
|
|
|
|
ul{
|
|
|
|
li{"Make sure that all words are spelled correctly."}
|
|
|
|
li{"Try different keywords."}
|
|
|
|
li{"Try more general keywords."}
|
|
|
|
}
|
|
|
|
img src="./images/no_results.gif" alt="Man fishing gif";
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
.page_navigation {
|
|
|
|
button type="button" onclick="navigate_backward()"{
|
|
|
|
(PreEscaped("←")) "previous"
|
|
|
|
}
|
|
|
|
button type="button" onclick="navigate_forward()"{"next" (PreEscaped("→"))}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
script src="static/index.js"{}
|
|
|
|
script src="static/search_area_options.js"{}
|
|
|
|
script src="static/pagination.js"{}
|
|
|
|
script src="static/error_box.js"{}
|
|
|
|
(footer())
|
|
|
|
)
|
|
|
|
}
|