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..8cc3822a4 100644 --- a/static/css/search.css +++ b/static/css/search.css @@ -145,10 +145,10 @@ background-color: var(--content-background); border-color: var(--border); height: 2em; - margin-top: 30px; - margin-bottom: 15px; + margin: 30px auto 15px auto; top: 80px; - width: 100%; + width: calc(100% - 20px); + display: block; } .mod-info { @@ -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,12 +187,16 @@ margin: 0 auto; } +.search-error { + text-align: center; + word-break: break-word; +} .result { display: flex; - height: 100px; - margin: 15px auto; + min-height: 100px; + margin: 15px 5px; padding: 5px; - width: 100%; + width: calc(100% - 20px); flex-direction: row; align-items: center; background-color: var(--content-background); @@ -187,6 +205,11 @@ .result-image { object-fit: scale-down; padding: 0 10px 0 5px; + min-width: 75px; +} +.badge-image { + object-fit: scale-down; + padding: 0 10px 0 5px; } .result-info { @@ -194,17 +217,34 @@ 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-name > * { + margin: 0; +} +.result-author-container { + white-space: nowrap; + display: inline-block; +} + +@media screen and (max-width: 1340px) { + .result-badge.result-badge { + width: initial; + } + .result-badge > p { + display: none; + } +} .result-name { text-decoration: none; @@ -326,14 +366,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..ff3215229 100644 --- a/templates/search-results.hbs +++ b/templates/search-results.hbs @@ -3,113 +3,127 @@

{{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"}} - - - +
+ +
{{/contains}} {{#contains this.keywords "fabric"}} - fabric +
+ fabric +
{{/contains}}
{{#contains this.keywords "technology"}} -
- tech +
+ tech

TECH

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

ADVENTURE

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

MAGIC

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

UTILITY

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

DECORATION

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

LIBRARY

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

WORLDGEN

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

CURSED

CURSED

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

STORAGE

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

FOOD

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

EQUIPMENT

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

MISC

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

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

+ {{else}} +

No results found

+ {{/if}} +
{{/each}} diff --git a/templates/search.hbs b/templates/search.hbs index 59cb3fb1e..b7bec52f9 100644 --- a/templates/search.hbs +++ b/templates/search.hbs @@ -26,6 +26,16 @@
+ + + + + + up @@ -46,51 +56,51 @@

Categories

- tech + tech

TECH

- adventure + adventure

ADVENTURE

- magic + magic

MAGIC

- util + util

UTILITY

- decoration + decoration

DECORATION

- library + library

LIBRARY

- world + world

WORLDGEN

- cursed + cursed

CURSED

- storage + storage

STORAGE

- food + food

FOOD

- equipment + equipment

EQUIPMENT

- misc + misc

MISC

@@ -100,11 +110,11 @@

Loaders

- forge + forge

FORGE

- fabric + fabric

FABRIC