Class: Www::AddToCartButtonComponent

Inherits:
ApplicationComponent show all
Includes:
ApplicationHelper
Defined in:
app/components/www/add_to_cart_button_component.rb

Overview

Reusable Add to Cart button component with optional quantity selector

Examples:

Basic usage with a product presenter

render Www::AddToCartButtonComponent.new(product: @pcp)

Compact card style (no quantity selector)

render Www::AddToCartButtonComponent.new(
  product: @pcp,
  show_quantity: false,
  size: :small,
  style: :outline
)

Manual product data

render Www::AddToCartButtonComponent.new(
  sku: "ABC-123",
  name: "Product Name",
  price: 99.99,
  category: "Floor Heating",
  image_url: "https://..."
)

Constant Summary

Constants included from SeoHelper

SeoHelper::AWARDS, SeoHelper::CA_ADDRESS, SeoHelper::CA_BUSINESS_HOURS, SeoHelper::CA_CONTACT_POINT, SeoHelper::CA_CURRENCIES, SeoHelper::CA_DESCRIPTION, SeoHelper::CA_FOUNDING_DATE, SeoHelper::CA_GLOBAL_LOCATION_NUMBER, SeoHelper::CA_LEGAL_NAME, SeoHelper::CA_LOCAL_BUSINESS, SeoHelper::CA_ONLINE_STORE, SeoHelper::CA_RETURN_POLICY, SeoHelper::CA_SALES_DEPARTMENT, SeoHelper::CA_SERVICE_AREA, SeoHelper::CA_URL, SeoHelper::CA_VAT_ID, SeoHelper::CA_WAREHOUSE_DEPARTMENT, SeoHelper::CA_WAREHOUSE_HOURS, SeoHelper::COMPANY_EMAIL, SeoHelper::COMPANY_LOGO, SeoHelper::COMPANY_NAME, SeoHelper::COMPANY_SLOGAN, SeoHelper::EXPERTISE, SeoHelper::FAX_NUMBER, SeoHelper::GS1_COMPANY_PREFIX, SeoHelper::ISO6523_CODE, SeoHelper::PAYMENT_METHODS, SeoHelper::PHONE_NUMBER, SeoHelper::PRIMARY_NAICS, SeoHelper::REFUND_TYPE, SeoHelper::RETURN_FEES, SeoHelper::RETURN_METHOD, SeoHelper::RETURN_POLICY_CATEGORY, SeoHelper::SECONDARY_NAICS, SeoHelper::SOCIAL_PROFILES, SeoHelper::US_ADDRESS, SeoHelper::US_BUSINESS_HOURS, SeoHelper::US_CONTACT_POINT, SeoHelper::US_CURRENCIES, SeoHelper::US_DESCRIPTION, SeoHelper::US_FOUNDING_DATE, SeoHelper::US_GLOBAL_LOCATION_NUMBER, SeoHelper::US_IMAGE, SeoHelper::US_LEGAL_NAME, SeoHelper::US_LOCAL_BUSINESS, SeoHelper::US_ONLINE_STORE, SeoHelper::US_RETURN_POLICY, SeoHelper::US_SALES_DEPARTMENT, SeoHelper::US_SERVICE_AREA, SeoHelper::US_TAX_ID, SeoHelper::US_URL, SeoHelper::US_WAREHOUSE_DEPARTMENT, SeoHelper::US_WAREHOUSE_HOURS

Constants included from IconHelper

IconHelper::CUSTOM_ICON_MAP, IconHelper::CUSTOM_SVG_DIR, IconHelper::DEFAULT_FAMILY

Instance Method Summary collapse

Methods included from ApplicationHelper

#better_number_to_currency, #check_force_logout, #check_or_cross, #check_or_times, #error_messages, #general_disclaimer_on_product_installation_and_local_codes, #gridjs_from_html_table, #gridjs_table, #is_wy_ip, #line_break, #parent_layout, #pass_or_fail, #render_error_messages_list, #render_video_card, #resolved_auth_form_turbo_frame, #return_path_or, #safe_css_color, #set_return_path_if_present, #set_section_if_present, #tab_frame_id, #to_underscore, #track_page?, #turbo_section_wrapper, #turbo_tabs_request?, #url_on_same_domain_as_request, #widget_index_daily_focus_index_path, #working_hours?, #yes_or_no, #yes_or_no_highlighted, #yes_or_no_with_check_or_cross, #youtube_video

Methods included from UppyUploaderHelper

#file_uploader, #image_uploader, #large_file_uploader_s3, #lead_sketch_uploader, #rma_image_uploader, #rma_image_uploader_s3, #uppy_uploader, #video_uploader

Methods included from ImagesHelper

#image_asset_tag, #image_asset_url

Methods included from SeoHelper

#add_page_schema, #canada?, #company_social_links, #ensure_context_json, #json_ld_script_tag, #local_business_schema, #online_store_id, #online_store_schema, #page_main_entity, #page_main_entity_json, #render_auto_collection_page_schema, #render_collection_page_schema, #render_local_business_schema, #render_online_store_schema, #render_page_schemas, #render_page_video_schemas, #render_webpage_schema, #render_webpage_schema_with_collections, #usa?

Methods included from UrlsHelper

#catalog_breadcrumb_links, #catalog_link, #catalog_link_for_product_line, #catalog_link_for_sku, #cms_link, #delocalized_path, #path_to_sales_product_sku, #path_to_sales_product_sku_for_product_line, #path_to_sales_product_sku_for_product_line_slug, #product_line_from_catalog_link, #protocol_neutral_url, #sanitize_external_url, #valid_external_url?

Methods included from IconHelper

#account_nav_icon, #fa_icon, #star_rating_html

Methods inherited from ApplicationComponent

#cms_link, #fetch_or_fallback, #image_asset_tag, #image_tag, #number_to_currency, #number_with_delimiter, #post_path, #post_url, #strip_tags

Constructor Details

#initialize(product: nil, sku: nil, show_quantity: false, out_of_stock: nil, expected_soon: nil, max_quantity: nil, style: :primary, size: :normal, label: "Add to Cart", advance_order_label: "Advance Order", button_id: nil, wrapper_class: nil) ⇒ AddToCartButtonComponent

Returns a new instance of AddToCartButtonComponent.

Parameters:

  • product (Www::ProductCatalogPresenter, CatalogItem, Item) (defaults to: nil)

    Product object

  • sku (String) (defaults to: nil)

    Manual SKU (if no product)

  • name (String)

    Manual product name

  • price (Numeric)

    Manual price

  • category (String)

    Manual category for analytics

  • image_url (String)

    Manual image URL for toast

  • show_quantity (Boolean) (defaults to: false)

    Show quantity selector (default: false)

  • out_of_stock (Boolean) (defaults to: nil)

    Force out of stock state

  • expected_soon (Boolean) (defaults to: nil)

    Show "Expected soon" badge

  • max_quantity (Integer) (defaults to: nil)

    Max quantity (for refurbished items)

  • style (Symbol) (defaults to: :primary)

    Button style - :primary, :outline, :success

  • size (Symbol) (defaults to: :normal)

    Button size - :normal, :small, :block

  • label (String) (defaults to: "Add to Cart")

    Custom button label

  • advance_order_label (String) (defaults to: "Advance Order")

    Custom advance order label

  • button_id (String) (defaults to: nil)

    Custom button ID

  • wrapper_class (String) (defaults to: nil)

    Additional wrapper classes



44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
# File 'app/components/www/add_to_cart_button_component.rb', line 44

def initialize(
  product: nil,
  sku: nil,
  show_quantity: false,
  out_of_stock: nil,
  expected_soon: nil,
  max_quantity: nil,
  style: :primary,
  size: :normal,
  label: "Add to Cart",
  advance_order_label: "Advance Order",
  button_id: nil,
  wrapper_class: nil
)
  @product = product
  @manual_sku = sku
  @show_quantity = show_quantity
  @force_out_of_stock = out_of_stock
  @force_expected_soon = expected_soon
  @max_quantity = max_quantity
  @style = style
  @size = size
  @label = label
  @advance_order_label = advance_order_label
  @button_id = button_id
  @wrapper_class = wrapper_class
end

Instance Method Details

#button_classesObject



101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
# File 'app/components/www/add_to_cart_button_component.rb', line 101

def button_classes
  classes = ["btn", "d-inline-flex", "align-items-center", "justify-content-center"]

  # Style
  case @style
  when :outline
    classes << (out_of_stock? ? "btn-outline-primary" : "btn-outline-primary")
  when :success
    classes << "btn-success"
  else # :primary
    classes << (out_of_stock? ? "btn-outline-primary" : "btn-primary")
  end

  # Size
  case @size
  when :small
    classes << "btn-sm"
  when :block
    classes << "btn-block w-100"
  end

  classes.join(" ")
end

#button_html_idObject



131
132
133
# File 'app/components/www/add_to_cart_button_component.rb', line 131

def button_html_id
  @button_id || "add-to-cart-#{sku&.parameterize}"
end

#button_labelObject



97
98
99
# File 'app/components/www/add_to_cart_button_component.rb', line 97

def button_label
  out_of_stock? ? @advance_order_label : @label
end

#expected_soon?Boolean

Returns:

  • (Boolean)


83
84
85
86
87
# File 'app/components/www/add_to_cart_button_component.rb', line 83

def expected_soon?
  return @force_expected_soon unless @force_expected_soon.nil?

  extract_expected_soon
end

#max_stockObject



89
90
91
# File 'app/components/www/add_to_cart_button_component.rb', line 89

def max_stock
  @max_quantity || extract_max_stock
end

#out_of_stock?Boolean

Returns:

  • (Boolean)


77
78
79
80
81
# File 'app/components/www/add_to_cart_button_component.rb', line 77

def out_of_stock?
  return @force_out_of_stock unless @force_out_of_stock.nil?

  extract_out_of_stock
end

#render?Boolean

Returns:

  • (Boolean)


135
136
137
# File 'app/components/www/add_to_cart_button_component.rb', line 135

def render?
  sku.present?
end

#show_quantity?Boolean

Returns:

  • (Boolean)


93
94
95
# File 'app/components/www/add_to_cart_button_component.rb', line 93

def show_quantity?
  @show_quantity
end

#skuObject

Extracted product data accessors



73
74
75
# File 'app/components/www/add_to_cart_button_component.rb', line 73

def sku
  @manual_sku || product_sku
end

#wrapper_classesObject



125
126
127
128
129
# File 'app/components/www/add_to_cart_button_component.rb', line 125

def wrapper_classes
  classes = ["add-to-cart-component"]
  classes << @wrapper_class if @wrapper_class.present?
  classes.join(" ")
end