diff --git a/app/assets/stylesheets/items/sources.sass b/app/assets/stylesheets/items/sources.sass index 9ace7135..6c536c14 100644 --- a/app/assets/stylesheets/items/sources.sass +++ b/app/assets/stylesheets/items/sources.sass @@ -52,3 +52,7 @@ .actions-cell button /* Bootstrap's Purple 600 */ +awesome-button-color(#59359a) + + .special-color-explanation + text-wrap: balance + font-style: italic diff --git a/app/helpers/items_helper.rb b/app/helpers/items_helper.rb index d86ad3c2..ad0d42b2 100644 --- a/app/helpers/items_helper.rb +++ b/app/helpers/items_helper.rb @@ -97,8 +97,9 @@ module ItemsHelper SHOP_WIZARD_URL_TEMPLATE = Addressable::Template.new( "https://www.neopets.com/shops/wizard.phtml{?string}" ) - def shop_wizard_url_for(item) - SHOP_WIZARD_URL_TEMPLATE.expand(string: item.name).to_s + def shop_wizard_url_for(item_or_name) + item_or_name = item_or_name.name if item_or_name.is_a? Item + SHOP_WIZARD_URL_TEMPLATE.expand(string: item_or_name).to_s end SUPER_SHOP_WIZARD_URL_TEMPLATE = Addressable::Template.new( @@ -111,8 +112,9 @@ module ItemsHelper TRADING_POST_URL_TEMPLATE = Addressable::Template.new( "https://www.neopets.com/island/tradingpost.phtml?type=browse&criteria=item_exact{&search_string}" ) - def trading_post_url_for(item) - TRADING_POST_URL_TEMPLATE.expand(search_string: item.name).to_s + def trading_post_url_for(item_or_name) + item_or_name = item_or_name.name if item_or_name.is_a? Item + TRADING_POST_URL_TEMPLATE.expand(search_string: item_or_name).to_s end AUCTION_GENIE_URL_TEMPLATE = Addressable::Template.new( diff --git a/app/models/item.rb b/app/models/item.rb index 15f7dc18..1c70ae5d 100644 --- a/app/models/item.rb +++ b/app/models/item.rb @@ -179,6 +179,28 @@ class Item < ApplicationRecord nc_mall_record&.current_price end + # If this is a PB item, return the corresponding Color, inferred from the + # item name. If it's not a PB item, or we fail to infer, return nil. + def pb_color + return nil unless pb? + + # NOTE: To handle colors like "Royalboy", where the items aren't consistent + # with the color name regarding whether or not there's spaces, we remove + # all spaces from the item name and color name when matching. We also + # hackily handle the fact that "Elderlyboy" color has items named "Elderly + # Male" (and same for Girl/Female) by replacing those words, too. These + # hacks could cause false matches in theory, but I'm not aware of any rn! + normalized_name = name.downcase.gsub("female", "girl").gsub("male", "boy"). + gsub(/\s/, "") + + Color.order(:name). + find { |c| normalized_name.include?(c.name.downcase.gsub(/\s/, "")) } + end + + def pb_item_name + pb_color&.pb_item_name + end + def restricted_zones(options={}) options[:scope] ||= Zone.all options[:scope].find(restricted_zone_ids) diff --git a/app/views/items/sources.html.haml b/app/views/items/sources.html.haml index 4e523423..23e45426 100644 --- a/app/views/items/sources.html.haml +++ b/app/views/items/sources.html.haml @@ -54,13 +54,31 @@ target: "_blank", icon: search_icon - if @pb_items.present? - %h2 Paintbrush items + %h2 Paint Brush items :markdown - These items are part of a paintbrush set. Once you paint your pet, + These items are part of a paint brush set. Once you paint your pet, these items will be semi-permanently added to your Closet, even if your pet changes color again! You can use this to mix-and-match styles for "cross-paint" outfits. - = render @pb_items + %table.item-list + %thead + %td + %th{colspan: 2} + Total: #{pluralize @pb_items.size, "item"} + %tbody + - @pb_items.each do |item| + = render "item_list_row", item: do + - if item.pb_item_name.present? + = button_link_to "Shops", + shop_wizard_url_for(item.pb_item_name), + target: "_blank", icon: search_icon + = button_link_to "Trades", + trading_post_url_for(item.pb_item_name), + target: "_blank", icon: search_icon + - else + .special-color-explanation + No Paint Brush for this color. Get via Lab + Ray, morphing potions, etc. - if @other_nc_items.present? %h2 Neocash items (Capsules, Dyeworks, events, retired, etc.) diff --git a/db/migrate/20240522222040_add_pb_item_name_to_colors.rb b/db/migrate/20240522222040_add_pb_item_name_to_colors.rb new file mode 100644 index 00000000..961713e0 --- /dev/null +++ b/db/migrate/20240522222040_add_pb_item_name_to_colors.rb @@ -0,0 +1,5 @@ +class AddPbItemNameToColors < ActiveRecord::Migration[7.1] + def change + add_column :colors, :pb_item_name, :string + end +end diff --git a/db/schema.rb b/db/schema.rb index 3afd9d56..ac34a581 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[7.1].define(version: 2024_05_11_003019) do +ActiveRecord::Schema[7.1].define(version: 2024_05_22_222040) do create_table "alt_styles", charset: "utf8mb4", collation: "utf8mb4_unicode_520_ci", force: :cascade do |t| t.integer "species_id", null: false t.integer "color_id", null: false @@ -76,6 +76,7 @@ ActiveRecord::Schema[7.1].define(version: 2024_05_11_003019) do t.boolean "standard" t.boolean "prank", default: false, null: false t.string "name", null: false + t.string "pb_item_name" end create_table "contributions", id: :integer, charset: "utf8mb4", collation: "utf8mb4_unicode_520_ci", force: :cascade do |t|