From cf1d28dd62956982772c80cc1188f8369a3c67eb Mon Sep 17 00:00:00 2001 From: Emi Matchu Date: Sun, 30 Jun 2024 23:34:27 -0700 Subject: [PATCH] [WIP] Add species/color picker for simplified item page preview Still a lot missing here, like choosing the right default for Baby etc items, and saving the user's preferences. But it's a start! --- app/assets/stylesheets/items/_show.sass | 11 +++++++ app/controllers/items_controller.rb | 41 ++++++++++++++++++++++--- app/views/items/show.html.haml | 15 +++++++++ 3 files changed, 63 insertions(+), 4 deletions(-) diff --git a/app/assets/stylesheets/items/_show.sass b/app/assets/stylesheets/items/_show.sass index 4958c1d6..a546885d 100644 --- a/app/assets/stylesheets/items/_show.sass +++ b/app/assets/stylesheets/items/_show.sass @@ -57,3 +57,14 @@ body.items-show img width: 100% height: 100% + + .species-color-picker + .error-icon + cursor: help + margin-right: .25em + + &[data-is-valid="false"] + select + border-color: $error-border-color + color: $error-color + diff --git a/app/controllers/items_controller.rb b/app/controllers/items_controller.rb index cc75d736..ff6999a8 100644 --- a/app/controllers/items_controller.rb +++ b/app/controllers/items_controller.rb @@ -83,15 +83,16 @@ class ItemsController < ApplicationController @current_user_quantities = current_user.item_quantities_for(@item) end - @preview_pet_type = PetType.find_by_color_id_and_species_id( - Color.find_by_name("Blue"), - Species.find_by_name("Acara"), - ) + @selected_preview_pet_type = load_selected_preview_pet_type + @preview_pet_type = load_preview_pet_type + @item_layers = @item.appearance_for( @preview_pet_type, swf_asset_includes: [:zone] ).swf_assets @pet_layers = @preview_pet_type.canonical_pet_state.swf_assets. includes(:zone) + + @preview_error = validate_preview end format.gif do @@ -198,6 +199,38 @@ class ItemsController < ApplicationController SwfAsset.preload_manifests(swf_assets) end end + + def load_selected_preview_pet_type + color_id = params.dig(:preview, :color_id) + species_id = params.dig(:preview, :species_id) + + return load_default_preview_pet_type if color_id.nil? || species_id.nil? + + PetType.find_or_initialize_by(color_id:, species_id:) + end + + def load_preview_pet_type + if @selected_preview_pet_type.persisted? + @selected_preview_pet_type + else + load_default_preview_pet_type + end + end + + def load_default_preview_pet_type + PetType.find_by_color_id_and_species_id( + Color.find_by_name("Blue"), + Species.find_by_name("Acara"), + ) + end + + def validate_preview + if @selected_preview_pet_type.new_record? + :pet_type_does_not_exist + elsif @item_layers.empty? + :no_item_data + end + end def search_error(e) @items = [] diff --git a/app/views/items/show.html.haml b/app/views/items/show.html.haml index b4416fdd..014a9940 100644 --- a/app/views/items/show.html.haml +++ b/app/views/items/show.html.haml @@ -19,6 +19,21 @@ %outfit-item-appearance = outfit_viewer_layers @item_layers += form_for item_path(@item), method: :get, class: "species-color-picker", + data: {"is-valid": @preview_error.nil?} do |f| + - if @preview_error == :pet_type_does_not_exist + %span.error-icon{title: "We haven't seen this kind of pet before."} ⚠️ + - elsif @preview_error == :no_item_data + %span.error-icon{title: "We haven't seen this item on this pet before."} ⚠️ + + = select_tag "preview[color_id]", + options_from_collection_for_select(Color.funny.alphabetical, + "id", "human_name", @selected_preview_pet_type.color_id) + = select_tag "preview[species_id]", + options_from_collection_for_select(Species.alphabetical, + "id", "human_name", @selected_preview_pet_type.species_id) + = submit_tag "Go", name: nil + - unless @contributors_with_counts.empty? #item-contributors %header #{t '.contributors.header'}: