search changing newest to relevance on search now
This commit is contained in:
@@ -2,6 +2,10 @@
|
||||
server-side on first load. Holds the result summary, the product grid and
|
||||
pagination. #}
|
||||
{% set L = lang | default(value='sk') %}
|
||||
{# On htmx responses the toolbar's Sort dropdown isn't in this swapped region;
|
||||
re-render it out-of-band so a search-triggered "newest → relevance" switch is
|
||||
reflected in the visible selection. #}
|
||||
{% if is_fragment | default(value=false) %}{% set oob = true %}{% include "shop/_sort_select.html" %}{% endif %}
|
||||
<div class="space-y-4">
|
||||
<div class="flex flex-wrap items-center justify-between gap-2">
|
||||
<p class="text-sm text-on-surface/70 dark:text-on-surface-dark/70" aria-live="polite">
|
||||
|
||||
@@ -51,12 +51,7 @@
|
||||
<div class="flex flex-wrap items-center justify-end gap-3">
|
||||
<label class="flex items-center gap-2 text-xs font-medium text-on-surface/70 dark:text-on-surface-dark/70">
|
||||
{{ t(key="sort-label", lang=L) }}
|
||||
<select name="sort"
|
||||
class="rounded-radius border border-outline bg-surface px-2 py-1.5 text-sm text-on-surface focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary dark:border-outline-dark dark:bg-surface-dark dark:text-on-surface-dark">
|
||||
{% for opt in ["newest", "relevance", "price_asc", "price_desc", "name_asc", "name_desc"] %}
|
||||
<option value="{{ opt }}"{% if sort == opt %} selected{% endif %}>{{ t(key="sort-" ~ opt, lang=L) }}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
{% include "shop/_sort_select.html" %}
|
||||
</label>
|
||||
|
||||
<!-- per-page count -->
|
||||
|
||||
12
assets/views/shop/_sort_select.html
Normal file
12
assets/views/shop/_sort_select.html
Normal file
@@ -0,0 +1,12 @@
|
||||
{# Sort dropdown, shared by the toolbar (in the search form) and the results
|
||||
fragment. A search promotes the default "newest" to "relevance" server-side,
|
||||
but the toolbar select lives outside the swapped #shop-results region — so on
|
||||
htmx responses _results.html re-renders this with `oob = true` (hx-swap-oob)
|
||||
to keep the visible selection in sync with the actual ordering. #}
|
||||
{% set L = lang | default(value='sk') %}
|
||||
<select id="sort-select" name="sort"{% if oob | default(value=false) %} hx-swap-oob="true"{% endif %}
|
||||
class="rounded-radius border border-outline bg-surface px-2 py-1.5 text-sm text-on-surface focus-visible:outline-2 focus-visible:outline-offset-2 focus-visible:outline-primary dark:border-outline-dark dark:bg-surface-dark dark:text-on-surface-dark">
|
||||
{% for opt in ["newest", "relevance", "price_asc", "price_desc", "name_asc", "name_desc"] %}
|
||||
<option value="{{ opt }}"{% if sort == opt %} selected{% endif %}>{{ t(key="sort-" ~ opt, lang=L) }}</option>
|
||||
{% endfor %}
|
||||
</select>
|
||||
@@ -194,12 +194,17 @@ async fn run_search(
|
||||
items.retain(|i| view::category_filter_keep(&filter, i.product.category_id));
|
||||
|
||||
// 6. Sort. Newest-first is the default; relevance (the ranked search order)
|
||||
// is available explicitly via the sort control.
|
||||
let sort = params
|
||||
// is available explicitly via the sort control. When a search runs, the
|
||||
// default "newest" becomes "relevance" (a query implies relevance matters
|
||||
// most); any explicitly chosen non-newest sort is left untouched.
|
||||
let mut sort = params
|
||||
.sort
|
||||
.clone()
|
||||
.filter(|s| !s.is_empty())
|
||||
.unwrap_or_else(|| "newest".to_string());
|
||||
if !q_trim.is_empty() && sort == "newest" {
|
||||
sort = "relevance".to_string();
|
||||
}
|
||||
match sort.as_str() {
|
||||
"price_asc" => items.sort_by(|a, b| a.priced.price_cents.cmp(&b.priced.price_cents)),
|
||||
"price_desc" => items.sort_by(|a, b| b.priced.price_cents.cmp(&a.priced.price_cents)),
|
||||
@@ -391,6 +396,9 @@ async fn search(
|
||||
if fragment {
|
||||
if let Some(map) = context.as_object_mut() {
|
||||
map.insert("lang".into(), json!(lang));
|
||||
// Lets _results.html out-of-band swap the toolbar's Sort dropdown
|
||||
// (which lives outside the swapped region) to match the ordering.
|
||||
map.insert("is_fragment".into(), json!(true));
|
||||
}
|
||||
return format::view(&v, "shop/_results.html", context);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user