diff --git a/src/routes/search.rs b/src/routes/search.rs index ea05515b1..aae92286b 100644 --- a/src/routes/search.rs +++ b/src/routes/search.rs @@ -81,11 +81,16 @@ impl Document for SearchMod { #[derive(Serialize, Deserialize)] pub struct SearchRequest { - q: Option, - f: Option, - v: Option, - o: Option, - s: Option, + #[serde(rename = "q")] + query: Option, + #[serde(rename = "f")] + filters: Option, + #[serde(rename = "v")] + version: Option, + #[serde(rename = "o")] + offset: Option, + #[serde(rename = "s")] + index: Option, } #[post("search")] @@ -93,12 +98,11 @@ pub async fn search_post( web::Query(info): web::Query, hb: Data>, ) -> HttpResponse { - let results = search(web::Query(info)); - + let results = search(&info); let data = json!({ + "query": info, "results": results, }); - let body = hb.render("search-results", &data).unwrap(); HttpResponse::Ok().body(body) @@ -109,9 +113,10 @@ pub async fn search_get( web::Query(info): web::Query, hb: Data>, ) -> HttpResponse { - let results = search(web::Query(info)); + let results = search(&info); let data = json!({ + "query": info, "results": results, }); @@ -120,40 +125,40 @@ pub async fn search_get( HttpResponse::Ok().body(body) } -fn search(web::Query(info): web::Query) -> Vec { +fn search(info: &SearchRequest) -> Vec { let client = Client::new("http://localhost:7700", ""); - let search_query: String; - let mut filters = "".to_string(); + let search_query: &str; + let mut filters = String::new(); let mut offset = 0; - let mut index = "relevance".to_string(); + let mut index = "relevance"; - match info.q { + match info.query.as_ref() { Some(q) => search_query = q, - None => search_query = "{}{}{}".to_string(), + None => search_query = "{}{}{}", } - if let Some(f) = info.f { - filters = f; + if let Some(f) = info.filters.as_ref() { + filters = f.clone(); } - if let Some(v) = info.v { + if let Some(v) = info.version.as_ref() { if filters.is_empty() { - filters = v; + filters = v.clone(); } else { filters = format!("({}) AND ({})", filters, v); } } - if let Some(o) = info.o { + if let Some(o) = info.offset.as_ref() { offset = o.parse().unwrap(); } - if let Some(s) = info.s { + if let Some(s) = info.index.as_ref() { index = s; } - let mut query = Query::new(&search_query).with_limit(10).with_offset(offset); + let mut query = Query::new(search_query).with_limit(10).with_offset(offset); if !filters.is_empty() { query = query.with_filters(&filters); diff --git a/static/css/search.css b/static/css/search.css index d8e8ef2ed..16801313b 100644 --- a/static/css/search.css +++ b/static/css/search.css @@ -156,6 +156,7 @@ display: flex; flex-direction: row; align-items: center; + flex-wrap: wrap; } .mod-info img { @@ -163,9 +164,22 @@ padding: 0; } -.mod-info p { +.mod-info span { font-size: 12px; - padding: 0 15px 0 5px !important; + padding-right: 15px; + white-space: nowrap; +} +.mod-info > span > img { + padding-right: 5px; + vertical-align: top; +} +.loader-icons > * { + vertical-align: top; + white-space: nowrap; + display: inline-block; +} +.loader-icons img { + padding-right: 5px; } .results { @@ -173,9 +187,12 @@ margin: 0 auto; } +.search-error { + text-align: center; +} .result { display: flex; - height: 100px; + min-height: 100px; margin: 15px auto; padding: 5px; width: 100%; @@ -194,17 +211,30 @@ flex-direction: column; } -.result-info * { +.result-info > * { padding: 0 5px 0 0; margin: 0; } .result-title { - display: flex; - flex-direction: row; - align-items: baseline; text-decoration: none; } +.result-title * { + display: inline; + padding-right: 5px; +} +.result-author-container { + white-space: nowrap; +} + +@media screen and (max-width: 1340px) { + .result-badge.result-badge { + width: initial; + } + .result-badge > p { + display: none; + } +} .result-name { text-decoration: none; @@ -326,14 +356,14 @@ .forge { height: 12px; - padding-top: 5px !important; fill: var(--forge-color); } .back-to-top { position: fixed; top: 80%; - left: 19%; + /* left column = 25%, width ~= 90px, left column padding = 20px */ + left: calc(25% - 90px - 20px); background-color: var(--highlight); text-align: center; padding: 20px; diff --git a/templates/search-results.hbs b/templates/search-results.hbs index be55396ae..0c8865d8d 100644 --- a/templates/search-results.hbs +++ b/templates/search-results.hbs @@ -3,113 +3,135 @@

{{this.description}}

- download -

{{format this.downloads}}

+ + downloads{{format this.downloads}} + - created -

{{this.date_created}}

+ + created{{this.date_created}} + - updated -

{{this.date_modified}}

+ + updated{{this.date_modified}} + - version -

{{this.latest_version}}

+ + version{{this.latest_version}} +
{{#contains this.keywords "forge"}} - - - +
+ + + Forge +
{{/contains}} {{#contains this.keywords "fabric"}} - fabric +
+ fabricFabric +
{{/contains}}
{{#contains this.keywords "technology"}} -
+
tech

TECH

{{/contains}} {{#contains this.keywords "adventure"}} -
+
adventure

ADVENTURE

{{/contains}} {{#contains this.keywords "magic"}} -
+
magic

MAGIC

{{/contains}} {{#contains this.keywords "utility"}} -
+
util

UTILITY

{{/contains}} {{#contains this.keywords "decoration"}} -
+
decoration

DECORATION

{{/contains}} {{#contains this.keywords "library"}} -
+
library

LIBRARY

{{/contains}} {{#contains this.keywords "worldgen"}} -
+
world

WORLDGEN

{{/contains}} {{#contains this.keywords "cursed"}} -
+
cursed

CURSED

CURSED

{{/contains}} {{#contains this.keywords "storage"}} -
+
storage

STORAGE

{{/contains}} {{#contains this.keywords "food"}} -
+
food

FOOD

{{/contains}} {{#contains this.keywords "equipment"}} -
+
equipment

EQUIPMENT

{{/contains}} {{#contains this.keywords "misc"}} -
+
misc

MISC

{{/contains}}
+{{else}} +
+ {{#if ../query.q}} +

No results found for query "{{../query.q}}"

+ {{else}} +

No results found

+ {{/if}} +
{{/each}}