From 0ec89146c847ab57493e85c3f4acf993d7fe6f31 Mon Sep 17 00:00:00 2001 From: neon_arch Date: Fri, 17 Nov 2023 22:10:06 +0300 Subject: [PATCH] =?UTF-8?q?=E2=99=BB=EF=B8=8F=20=20refactor(maud):=20rewri?= =?UTF-8?q?te=20the=20frontend=20code=20with=20maud=20html=20framework=20(?= =?UTF-8?q?#302)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- public/templates/404.html | 10 -- public/templates/about.html | 29 ----- public/templates/bar.html | 3 - public/templates/cookies_tab.html | 12 -- public/templates/engines_tab.html | 32 ----- public/templates/footer.html | 16 --- public/templates/general_tab.html | 13 -- public/templates/header.html | 16 --- public/templates/index.html | 8 -- public/templates/navbar.html | 6 - public/templates/search.html | 86 -------------- public/templates/search_bar.html | 36 ------ public/templates/settings.html | 22 ---- public/templates/user_interface_tab.html | 28 ----- src/templates/mod.rs | 4 + src/templates/partials/bar.rs | 12 ++ src/templates/partials/footer.rs | 24 ++++ src/templates/partials/header.rs | 26 ++++ src/templates/partials/mod.rs | 8 ++ src/templates/partials/navbar.rs | 15 +++ src/templates/partials/search_bar.rs | 64 ++++++++++ .../partials/settings_tabs/cookies.rs | 21 ++++ .../partials/settings_tabs/engines.rs | 35 ++++++ .../partials/settings_tabs/general.rs | 23 ++++ src/templates/partials/settings_tabs/mod.rs | 6 + .../partials/settings_tabs/user_interface.rs | 48 ++++++++ src/templates/views/about.rs | 39 ++++++ src/templates/views/index.rs | 19 +++ src/templates/views/mod.rs | 7 ++ src/templates/views/not_found.rs | 20 ++++ src/templates/views/search.rs | 111 ++++++++++++++++++ src/templates/views/settings.rs | 45 +++++++ 32 files changed, 527 insertions(+), 317 deletions(-) delete mode 100644 public/templates/404.html delete mode 100644 public/templates/about.html delete mode 100644 public/templates/bar.html delete mode 100644 public/templates/cookies_tab.html delete mode 100644 public/templates/engines_tab.html delete mode 100644 public/templates/footer.html delete mode 100644 public/templates/general_tab.html delete mode 100644 public/templates/header.html delete mode 100644 public/templates/index.html delete mode 100644 public/templates/navbar.html delete mode 100644 public/templates/search.html delete mode 100644 public/templates/search_bar.html delete mode 100644 public/templates/settings.html delete mode 100644 public/templates/user_interface_tab.html create mode 100644 src/templates/mod.rs create mode 100644 src/templates/partials/bar.rs create mode 100644 src/templates/partials/footer.rs create mode 100644 src/templates/partials/header.rs create mode 100644 src/templates/partials/mod.rs create mode 100644 src/templates/partials/navbar.rs create mode 100644 src/templates/partials/search_bar.rs create mode 100644 src/templates/partials/settings_tabs/cookies.rs create mode 100644 src/templates/partials/settings_tabs/engines.rs create mode 100644 src/templates/partials/settings_tabs/general.rs create mode 100644 src/templates/partials/settings_tabs/mod.rs create mode 100644 src/templates/partials/settings_tabs/user_interface.rs create mode 100644 src/templates/views/about.rs create mode 100644 src/templates/views/index.rs create mode 100644 src/templates/views/mod.rs create mode 100644 src/templates/views/not_found.rs create mode 100644 src/templates/views/search.rs create mode 100644 src/templates/views/settings.rs diff --git a/public/templates/404.html b/public/templates/404.html deleted file mode 100644 index a8a9ac7..0000000 --- a/public/templates/404.html +++ /dev/null @@ -1,10 +0,0 @@ -{{>header this}} -
- Image of broken robot. -
-

Aw! snap

-

404 Page Not Found!

-

Go to search page

-
-
-{{>footer}} diff --git a/public/templates/about.html b/public/templates/about.html deleted file mode 100644 index 9c4cbb0..0000000 --- a/public/templates/about.html +++ /dev/null @@ -1,29 +0,0 @@ -{{>header this}} -
-
-
-

Websurfx

-
-
-

A modern-looking, lightning-fast, privacy-respecting, secure meta search engine written in Rust. It provides a fast and secure search experience while respecting user privacy.
It aggregates results from multiple search engines and presents them in an unbiased manner, filtering out trackers and ads. -

- -

Some of the Top Features:

- -
    Lightning fast - Results load within milliseconds for an instant search experience.
- -
    Secure search - All searches are performed over an encrypted connection to prevent snooping.
- -
    Ad free results - All search results are ad free and clutter free for a clean search experience.
- -
    Privacy focused - Websurface does not track, store or sell your search data. Your privacy is our priority.
- -
    Free and Open source - The entire project's code is open source and available for free on GitHub under an GNU Affero General Public License.
- -
    Highly customizable - Websurface comes with 9 built-in color themes and supports creating custom themes effortlessly.
-
- -

Devoloped by: Websurfx team

-
-{{>footer}} - diff --git a/public/templates/bar.html b/public/templates/bar.html deleted file mode 100644 index 489b075..0000000 --- a/public/templates/bar.html +++ /dev/null @@ -1,3 +0,0 @@ - - - -{{>footer}} diff --git a/public/templates/navbar.html b/public/templates/navbar.html deleted file mode 100644 index c369739..0000000 --- a/public/templates/navbar.html +++ /dev/null @@ -1,6 +0,0 @@ - diff --git a/public/templates/search.html b/public/templates/search.html deleted file mode 100644 index c6c9d6a..0000000 --- a/public/templates/search.html +++ /dev/null @@ -1,86 +0,0 @@ -{{>header this.style}} -
- {{>search_bar this}} -
- {{#if results}} {{#each results}} -
-

{{{this.title}}}

- {{{this.url}}} -

{{{this.description}}}

-
- {{#each engine}} - {{{this}}} - {{/each}} -
-
- {{/each}} {{else}} {{#if disallowed}} -
-
-

- Your search - {{{this.pageQuery}}} - - has been disallowed. -

-

Dear user,

-

- The query - {{{this.pageQuery}}} - has - been blacklisted via server configuration and hence disallowed by the - server. Henceforth no results could be displayed for your query. -

-
- Image of a Barricade -
- {{else}} {{#if filtered}} -
-
-

- Your search - {{{this.pageQuery}}} - - has been filtered. -

-

Dear user,

-

- All the search results contain results that has been configured to be - filtered out via server configuration and henceforth has been - completely filtered out. -

-
- Image of a paper inside a funnel -
- {{else}} {{#if noEnginesSelected}} -
-
-

- No results could be fetched for your search "{{{this.pageQuery}}}" . -

-

Dear user,

-

- No results could be retrieved from the upstream search engines as no - upstream search engines were selected from the settings page. -

-
- Image of a white cross inside a red circle -
- {{else}} -
-

Your search - {{{this.pageQuery}}} - did not match any documents.

-

Suggestions:

-
    -
  • Make sure that all words are spelled correctly.
  • -
  • Try different keywords.
  • -
  • Try more general keywords.
  • -
- Man fishing gif -
- {{/if}} {{/if}} {{/if}} {{/if}} -
- -
- - - - -{{>footer}} diff --git a/public/templates/search_bar.html b/public/templates/search_bar.html deleted file mode 100644 index a006d89..0000000 --- a/public/templates/search_bar.html +++ /dev/null @@ -1,36 +0,0 @@ -
- {{>bar this}} -
- {{#if engineErrorsInfo}} - - - {{else}} - - - {{/if}} -
-
-
- -
- diff --git a/public/templates/settings.html b/public/templates/settings.html deleted file mode 100644 index 3c97213..0000000 --- a/public/templates/settings.html +++ /dev/null @@ -1,22 +0,0 @@ -{{>header this}} -
-

Settings

-
-
- -
- {{> general_tab}} {{> user_interface_tab}} {{> engines_tab}} {{> - cookies_tab}} -

- -
-
-
- - -{{>footer}} diff --git a/public/templates/user_interface_tab.html b/public/templates/user_interface_tab.html deleted file mode 100644 index 7de0f06..0000000 --- a/public/templates/user_interface_tab.html +++ /dev/null @@ -1,28 +0,0 @@ -
-

User Interface

-

select theme

-

- Select the theme from the available themes to be used in user interface -

- -

select color scheme

-

- Select the color scheme for your theme to be used in user interface -

- -
diff --git a/src/templates/mod.rs b/src/templates/mod.rs new file mode 100644 index 0000000..cddec20 --- /dev/null +++ b/src/templates/mod.rs @@ -0,0 +1,4 @@ +//! + +mod partials; +pub mod views; diff --git a/src/templates/partials/bar.rs b/src/templates/partials/bar.rs new file mode 100644 index 0000000..da6939d --- /dev/null +++ b/src/templates/partials/bar.rs @@ -0,0 +1,12 @@ +//! + +use maud::{html, Markup,PreEscaped}; + +/// +pub fn bar(query: &str) -> Markup { + html!( + (PreEscaped("
")) + input type="search" name="search-box" value=(query) placeholder="Type to search"; + button type="submit" onclick="searchWeb()"{"search"} + ) +} diff --git a/src/templates/partials/footer.rs b/src/templates/partials/footer.rs new file mode 100644 index 0000000..c35aa4f --- /dev/null +++ b/src/templates/partials/footer.rs @@ -0,0 +1,24 @@ +//! + +use maud::{html, Markup, PreEscaped}; + +/// +pub fn footer() -> Markup { + html!( + footer{ + div{ + span{"Powered By "b{"Websurfx"}}span{"-"}span{"a lightening fast, privacy respecting, secure meta + search engine"} + } + div{ + ul{ + li{a href="https://github.com/neon-mmd/websurfx"{"Source Code"}} + li{a href="https://github.com/neon-mmd/websurfx/issues"{"Issues/Bugs"}} + } + } + } + script src="static/settings.js"{} + (PreEscaped("")) + (PreEscaped("")) + ) +} diff --git a/src/templates/partials/header.rs b/src/templates/partials/header.rs new file mode 100644 index 0000000..6b0c60f --- /dev/null +++ b/src/templates/partials/header.rs @@ -0,0 +1,26 @@ +//! + +use crate::templates::partials::navbar::navbar; +use maud::{html, Markup, PreEscaped, DOCTYPE}; + +/// +pub fn header(colorscheme: &str, theme: &str) -> Markup { + html!( + (DOCTYPE) + html lang="en" + + head{ + title{"Websurfx"} + meta charset="UTF-8"; + meta name="viewport" content="width=device-width, initial-scale=1"; + link href=(format!("static/colorschemes/{colorscheme}.css")) rel="stylesheet" type="text/css"; + link href=(format!("static/themes/{theme}.css")) rel="stylesheet" type="text/css"; + } + + (PreEscaped("")) + header{ + h1{a href="/"{"Websurfx"}} + (navbar()) + } + ) +} diff --git a/src/templates/partials/mod.rs b/src/templates/partials/mod.rs new file mode 100644 index 0000000..3635d80 --- /dev/null +++ b/src/templates/partials/mod.rs @@ -0,0 +1,8 @@ +//! + +pub mod footer; +pub mod header; +pub mod navbar; +pub mod bar; +pub mod settings_tabs; +pub mod search_bar; diff --git a/src/templates/partials/navbar.rs b/src/templates/partials/navbar.rs new file mode 100644 index 0000000..812ca5c --- /dev/null +++ b/src/templates/partials/navbar.rs @@ -0,0 +1,15 @@ +//! + +use maud::{html, Markup}; + +/// +pub fn navbar() -> Markup { + html!( + nav{ + ul{ + li{a href="about"{"about"}} + li{a href="settings"{"settings"}} + } + } + ) +} diff --git a/src/templates/partials/search_bar.rs b/src/templates/partials/search_bar.rs new file mode 100644 index 0000000..b1eb48f --- /dev/null +++ b/src/templates/partials/search_bar.rs @@ -0,0 +1,64 @@ +//! + +use maud::{html, Markup, PreEscaped}; + +use crate::{models::aggregation_models::EngineErrorInfo, templates::partials::bar::bar}; + +const SAFE_SEARCH_LEVELS_NAME: [&str; 3] = ["None", "Low", "Moderate"]; + +/// +pub fn search_bar( + engine_errors_info: &[EngineErrorInfo], + safe_search_level: u8, + query: &str, +) -> Markup { + html!( + .search_area{ + (bar(query)) + .error_box { + @if !engine_errors_info.is_empty(){ + button onclick="toggleErrorBox()" class="error_box_toggle_button"{ + img src="./images/warning.svg" alt="Info icon for error box"; + } + .dropdown_error_box{ + @for errors in engine_errors_info{ + .error_item{ + span class="engine_name"{(errors.engine)} + span class="engine_name"{(errors.error)} + span class="severity_color" style="background: {{{this.severity_color}}};"{} + } + } + } + } + @else { + button onclick="toggleErrorBox()" class="error_box_toggle_button"{ + img src="./images/info.svg" alt="Warning icon for error box"; + } + .dropdown_error_box { + .no_errors{ + "Everything looks good 🙂!!" + } + } + } + } + (PreEscaped("
")) + .search_options { + @if safe_search_level >= 3 { + (PreEscaped("")) + } + @for (idx, name) in SAFE_SEARCH_LEVELS_NAME.iter().enumerate() { + @if (safe_search_level as usize) == idx { + option value=(idx) selected {(format!("SafeSearch: {name}"))} + } + @else{ + option value=(idx) {(format!("SafeSearch: {name}"))} + } + } + (PreEscaped("")) + } + } + ) +} diff --git a/src/templates/partials/settings_tabs/cookies.rs b/src/templates/partials/settings_tabs/cookies.rs new file mode 100644 index 0000000..5b673b1 --- /dev/null +++ b/src/templates/partials/settings_tabs/cookies.rs @@ -0,0 +1,21 @@ +//! + +use maud::{html, Markup}; + +/// +pub fn cookies() -> Markup { + html!( + div class="cookies tab"{ + h1{"Cookies"} + p class="description"{ + "This is the cookies are saved on your system and it contains the preferences + you chose in the settings page" + } + input type="text" name="cookie_field" value="" readonly; + p class="description"{ + "The cookies stored are not used by us for any malicious intend or for + tracking you in any way." + } + } + ) +} diff --git a/src/templates/partials/settings_tabs/engines.rs b/src/templates/partials/settings_tabs/engines.rs new file mode 100644 index 0000000..1272926 --- /dev/null +++ b/src/templates/partials/settings_tabs/engines.rs @@ -0,0 +1,35 @@ +//! + +use maud::{html, Markup}; + +/// +pub fn engines(engine_names: &[&String]) -> Markup { + html!( + div class="engines tab"{ + h1{"Engines"} + h3{"select search engines"} + p class="description"{ + "Select the search engines from the list of engines that you want results from" + } + .engine_selection{ + .toggle_btn{ + label class="switch"{ + input type="checkbox" class="select_all" onchange="toggleAllSelection()"; + span class="slider round"{} + } + "Select All" + } + hr; + @for engine_name in engine_names{ + .toggle_btn{ + label class="switch"{ + input type="checkbox" class="engine"; + span class="slider round"{} + } + (format!("{}{}",engine_name[..1].to_uppercase().to_owned(), engine_name[1..].to_owned())) + } + } + } + } + ) +} diff --git a/src/templates/partials/settings_tabs/general.rs b/src/templates/partials/settings_tabs/general.rs new file mode 100644 index 0000000..06c4258 --- /dev/null +++ b/src/templates/partials/settings_tabs/general.rs @@ -0,0 +1,23 @@ +//! + +use maud::{html, Markup}; + +const SAFE_SEARCH_LEVELS: [(u8, &'static str); 3] = [(0, "None"), (1, "Low"), (2, "Moderate")]; + +/// +pub fn general() -> Markup { + html!( + div class="general tab active"{ + h1{"General"} + h3{"Select a safe search level"} + p class="description"{ + "Select a safe search level from the menu below to filter content based on the level." + } + select name="safe_search_levels"{ + @for (k,v) in SAFE_SEARCH_LEVELS{ + option value=(k){(v)} + } + } + } + ) +} diff --git a/src/templates/partials/settings_tabs/mod.rs b/src/templates/partials/settings_tabs/mod.rs new file mode 100644 index 0000000..ab73511 --- /dev/null +++ b/src/templates/partials/settings_tabs/mod.rs @@ -0,0 +1,6 @@ +//! + +pub mod general; +pub mod engines; +pub mod cookies; +pub mod user_interface; diff --git a/src/templates/partials/settings_tabs/user_interface.rs b/src/templates/partials/settings_tabs/user_interface.rs new file mode 100644 index 0000000..76580b9 --- /dev/null +++ b/src/templates/partials/settings_tabs/user_interface.rs @@ -0,0 +1,48 @@ +//! + +use crate::handler::paths::{file_path, FileType}; +use maud::{html, Markup}; +use std::fs::read_dir; + +fn style_option_list( + style_type: &str, +) -> Result, Box> { + let mut style_option_names: Vec<(String, String)> = Vec::new(); + for file in read_dir(format!( + "{}static/{}/", + file_path(FileType::Theme)?, + style_type, + ))? { + let style_name = file?.file_name().to_str().unwrap().replace(".css", ""); + style_option_names.push((style_name.clone(), style_name.replace("-", " "))); + } + + Ok(style_option_names) +} + +/// +pub fn user_interface() -> Result> { + Ok(html!( + div class="user_interface tab"{ + h1{"User Interface"} + h3{"select theme"} + p class="description"{ + "Select the theme from the available themes to be used in user interface" + } + select name="themes"{ + @for (k,v) in style_option_list("themes")?{ + option value=(k){(v)} + } + } + h3{"select color scheme"} + p class="description"{ + "Select the color scheme for your theme to be used in user interface" + } + select name="colorschemes"{ + @for (k,v) in style_option_list("colorschemes")?{ + option value=(k){(v)} + } + } + } + )) +} diff --git a/src/templates/views/about.rs b/src/templates/views/about.rs new file mode 100644 index 0000000..419187d --- /dev/null +++ b/src/templates/views/about.rs @@ -0,0 +1,39 @@ +//! + +use maud::{html, Markup}; + +use crate::templates::partials::{footer::footer, header::header}; + +/// +pub fn about(colorscheme: &str, theme: &str) -> Markup { + html!( + (header(colorscheme, theme)) + main class="about-container"{ + article { + div{ + h1{"Websurfx"} + hr size="4" width="100%" color="#a6e3a1"{} + } + p{"A modern-looking, lightning-fast, privacy-respecting, secure meta search engine written in Rust. It provides a fast and secure search experience while respecting user privacy."br{}" It aggregates results from multiple search engines and presents them in an unbiased manner, filtering out trackers and ads." + } + + h2{"Some of the Top Features:"} + + ul{strong{"Lightning fast "}"- Results load within milliseconds for an instant search experience."} + + ul{strong{"Secure search"}" - All searches are performed over an encrypted connection to prevent snooping."} + + ul{strong{"Ad free results"}" - All search results are ad free and clutter free for a clean search experience."} + + ul{strong{"Privacy focused"}" - Websurfx does not track, store or sell your search data. Your privacy is our priority."} + + ul{strong{"Free and Open source"}" - The entire project's code is open source and available for free on "{a href="https://github.com/neon-mmd/websurfx"{"GitHub"}}" under an GNU Affero General Public License."} + + ul{strong{"Highly customizable"}" - Websurfx comes with 9 built-in color themes and supports creating custom themes effortlessly."} + } + + h3{"Devoloped by: "{a href="https://github.com/neon-mmd/websurfx"{"Websurfx team"}}} + } + (footer()) + ) +} diff --git a/src/templates/views/index.rs b/src/templates/views/index.rs new file mode 100644 index 0000000..ae5acf8 --- /dev/null +++ b/src/templates/views/index.rs @@ -0,0 +1,19 @@ +//! + +use maud::{html, Markup, PreEscaped}; + +use crate::templates::partials::{bar::bar, footer::footer, header::header}; + +/// +pub fn index(colorscheme: &str, theme: &str, query: &str) -> Markup { + html!( + (header(colorscheme, theme)) + main class="search-container"{ + img src="../images/websurfx_logo.png" alt="Websurfx meta-search engine logo"; + (bar(query)) + (PreEscaped("")) + } + script src="static/index.js"{} + (footer()) + ) +} diff --git a/src/templates/views/mod.rs b/src/templates/views/mod.rs new file mode 100644 index 0000000..5093897 --- /dev/null +++ b/src/templates/views/mod.rs @@ -0,0 +1,7 @@ +//! + +pub mod about; +pub mod index; +pub mod not_found; +pub mod settings; +pub mod search; diff --git a/src/templates/views/not_found.rs b/src/templates/views/not_found.rs new file mode 100644 index 0000000..4f809b1 --- /dev/null +++ b/src/templates/views/not_found.rs @@ -0,0 +1,20 @@ +//! + +use crate::templates::partials::{footer::footer, header::header}; +use maud::{html, Markup}; + +/// +pub fn not_found(colorscheme: &str, theme: &str) -> Markup { + html!( + (header(colorscheme, theme)) + main class="error_container"{ + img src="images/robot-404.svg" alt="Image of broken robot."; + div class="error_content"{ + h1{"Aw! snap"} + h2{"404 Page Not Found!"} + p{"Go to "{a href="/"{"search page"}}} + } + } + (footer()) + ) +} diff --git a/src/templates/views/search.rs b/src/templates/views/search.rs new file mode 100644 index 0000000..90e8b0e --- /dev/null +++ b/src/templates/views/search.rs @@ -0,0 +1,111 @@ +//! + +use maud::{html, Markup, PreEscaped}; + +use crate::{ + models::aggregation_models::SearchResults, + templates::partials::{footer::footer, header::header, search_bar::search_bar}, +}; + +/// +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"; + } + } + @else{ + .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()) + ) +} diff --git a/src/templates/views/settings.rs b/src/templates/views/settings.rs new file mode 100644 index 0000000..7d89c17 --- /dev/null +++ b/src/templates/views/settings.rs @@ -0,0 +1,45 @@ +//! + +use maud::{html, Markup}; + +use crate::templates::partials::{ + footer::footer, + header::header, + settings_tabs::{ + cookies::cookies, engines::engines, general::general, user_interface::user_interface, + }, +}; + +/// +pub fn settings( + colorscheme: &str, + theme: &str, + engine_names: &[&String], +) -> Result> { + Ok(html!( + (header(colorscheme, theme)) + main class="settings"{ + h1{"Settings"} + hr; + .settings_container{ + .sidebar{ + div class="btn active" onclick="setActiveTab(this)"{"general"} + .btn onclick="setActiveTab(this)"{"user interface"} + .btn onclick="setActiveTab(this)"{"engines"} + .btn onclick="setActiveTab(this)"{"cookies"} + } + .main_container{ + (general()) + (user_interface()?) + (engines(engine_names)) + (cookies()) + p class="message"{} + button type="submit" onclick="setClientSettings()"{"Save"} + } + } + } + script src="static/settings.js"{} + script src="static/cookies.js"{} + (footer()) + )) +}