[WV2] Add zone badges to search results
Show which zones each item occupies in search result cards. Zone badges appear as small, muted labels (e.g., "Background", "Hat", "Static") after the NC/NP and date badges. Items that occupy multiple zones show multiple badges. Zone badges only appear in search results, not in outfit items, since outfit items are already grouped by zone which provides sufficient context. Implementation: - Created zones badge partial to render zone labels from item appearances - Updated controller to load item appearances with zone data for search results - Pass appearance data through the rendering chain (search_results → item_card → item_card_content) - Added subtle CSS styling for zone badges (light gray background, gray text) Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
This commit is contained in:
parent
4ab1426c61
commit
8d728c84d1
5 changed files with 16 additions and 3 deletions
|
|
@ -105,6 +105,12 @@ class WardrobeController < ApplicationController
|
||||||
)
|
)
|
||||||
@query = Item::Search::Query.from_params(query_params, current_user)
|
@query = Item::Search::Query.from_params(query_params, current_user)
|
||||||
@search_results = @query.results.paginate(page: params.dig(:q, :page), per_page: 30)
|
@search_results = @query.results.paginate(page: params.dig(:q, :page), per_page: 30)
|
||||||
|
|
||||||
|
# Load appearances for search results to get zone information
|
||||||
|
target = @alt_style || @pet_type
|
||||||
|
if target
|
||||||
|
@appearances_by_item_id = Item.appearances_for(@search_results, target, swf_asset_includes: [:zone])
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
render layout: false
|
render layout: false
|
||||||
|
|
|
||||||
|
|
@ -4,11 +4,11 @@
|
||||||
- if defined?(zone_id) && zone_id
|
- if defined?(zone_id) && zone_id
|
||||||
%label.item-card-label
|
%label.item-card-label
|
||||||
%input.visually-hidden{type: "radio", name: "zone_#{zone_id}", checked: is_worn || nil, "aria-label": item.name}
|
%input.visually-hidden{type: "radio", name: "zone_#{zone_id}", checked: is_worn || nil, "aria-label": item.name}
|
||||||
= render "wardrobe/items/item_card_content", item: item
|
= render "wardrobe/items/item_card_content", item: item, appearance: local_assigns[:appearance]
|
||||||
- else
|
- else
|
||||||
%label.item-card-label
|
%label.item-card-label
|
||||||
%input.visually-hidden{type: "checkbox", checked: is_worn || nil, "aria-label": item.name}
|
%input.visually-hidden{type: "checkbox", checked: is_worn || nil, "aria-label": item.name}
|
||||||
= render "wardrobe/items/item_card_content", item: item
|
= render "wardrobe/items/item_card_content", item: item, appearance: local_assigns[:appearance]
|
||||||
- if is_worn
|
- if is_worn
|
||||||
= button_to @wardrobe_path, method: :get, class: "item-hide-button", title: "Hide #{item.name}", "aria-label": "Hide #{item.name}" do
|
= button_to @wardrobe_path, method: :get, class: "item-hide-button", title: "Hide #{item.name}", "aria-label": "Hide #{item.name}" do
|
||||||
👁️🗨️
|
👁️🗨️
|
||||||
|
|
|
||||||
|
|
@ -7,4 +7,6 @@
|
||||||
%span{aria: {label: "Item info"}} ℹ️
|
%span{aria: {label: "Item info"}} ℹ️
|
||||||
.item-badges
|
.item-badges
|
||||||
= render "items/badges/kind", item: item
|
= render "items/badges/kind", item: item
|
||||||
|
- if local_assigns[:appearance]
|
||||||
|
= render "wardrobe/items/badges/zones", appearance: appearance
|
||||||
= render "items/badges/first_seen", item: item
|
= render "items/badges/first_seen", item: item
|
||||||
|
|
|
||||||
|
|
@ -4,7 +4,8 @@
|
||||||
|
|
||||||
%ul.search-results-list
|
%ul.search-results-list
|
||||||
- @search_results.each do |item|
|
- @search_results.each do |item|
|
||||||
= render "items/item_card", item: item
|
- appearance = @appearances_by_item_id&.dig(item.id)
|
||||||
|
= render "items/item_card", item: item, appearance: appearance
|
||||||
|
|
||||||
= will_paginate @search_results, param_name: "q[page]", params: @outfit.wardrobe_params.merge(q: params[:q])
|
= will_paginate @search_results, param_name: "q[page]", params: @outfit.wardrobe_params.merge(q: params[:q])
|
||||||
|
|
||||||
|
|
|
||||||
4
app/views/wardrobe/items/badges/_zones.html.haml
Normal file
4
app/views/wardrobe/items/badges/_zones.html.haml
Normal file
|
|
@ -0,0 +1,4 @@
|
||||||
|
- if local_assigns[:appearance] && appearance.present?
|
||||||
|
- zones = appearance.swf_assets.map(&:zone).uniq.sort_by(&:label)
|
||||||
|
- zones.each do |zone|
|
||||||
|
%span.item-badge= zone.label
|
||||||
Loading…
Reference in a new issue