Class: Www::VideoSectionComponent

Inherits:
ApplicationComponent show all
Includes:
PagesHelper, PresenterHelper, SeoHelper
Defined in:
app/components/www/video_section_component.rb

Overview

Renders the video section block: a grid or Splide slider of videos with an
optional section title, description, and "view more" link, plus video
schema.org markup collected via add_page_schema.

See Also:

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

Instance Method Summary collapse

Methods included from SeoHelper

#add_page_schema, #add_webpage_schema, #canada?, #collect_schema, #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 PresenterHelper

#generic_present, #present

Methods included from PagesHelper

#banner_trust_badges, #heated_driveway_cost_rows, #page_article_faqs, #page_banner_image, #page_header_h1, #page_header_h2, #page_header_h3, #page_posts, #page_publications, #page_showcases, #page_videos, #review_benefit_card, #review_trust_badge

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 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(videos: nil, slugs: nil, cloudflare_uids: nil, ids: nil, featured_videos: nil, title_heading_level: nil, section_title: nil, description: nil, view_more_title: nil, view_more_href: nil, render_only_thumbnails: nil, add_schema: true, display_category_badge: false, display_duration: true, header_style: 'h2', use_slider: true, border: nil) ⇒ VideoSectionComponent

rubocop:disable Metrics/ParameterLists

Parameters:

  • videos (ActiveRecord::Relation<Video>, Array<Video>, nil) (defaults to: nil)

    videos to render; when nil, resolved from slugs/cloudflare_uids/ids

  • slugs (Array<String>, nil) (defaults to: nil)

    video slugs to look up (preserves given order)

  • cloudflare_uids (Array<String>, nil) (defaults to: nil)

    Cloudflare Stream UIDs to look up (preserves given order)

  • ids (Array<Integer, String>, nil) (defaults to: nil)

    video IDs to look up (preserves given order)

  • featured_videos (Array<Video>, Video, nil) (defaults to: nil)

    videos prepended to the grid and de-duplicated from regular results

  • title_heading_level (String, nil) (defaults to: nil)

    heading level override for individual video titles

  • section_title (String, nil) (defaults to: nil)

    heading for the whole section

  • description (String, nil) (defaults to: nil)

    descriptive copy rendered under the section title

  • view_more_title (String, nil) (defaults to: nil)

    label for the "view more" link

  • view_more_href (String, nil) (defaults to: nil)

    URL for the "view more" link

  • render_only_thumbnails (Boolean, nil) (defaults to: nil)

    force thumbnail-only rendering; when nil, inferred from blank title/description/link

  • add_schema (Boolean) (defaults to: true)

    whether to register video schema.org entries before render

  • display_category_badge (Boolean) (defaults to: false)

    whether to show the category badge on each video

  • display_duration (Boolean) (defaults to: true)

    whether to show the duration on each video

  • header_style (String) (defaults to: 'h2')

    HTML tag used for the section title

  • use_slider (Boolean) (defaults to: true)

    whether to render a Splide slider instead of a grid

  • border (Symbol, nil) (defaults to: nil)

    border style: :top, :bottom, or :both



31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# File 'app/components/www/video_section_component.rb', line 31

def initialize(
  videos: nil,
  slugs: nil,
  cloudflare_uids: nil,
  ids: nil,
  featured_videos: nil,
  title_heading_level: nil,
  section_title: nil,
  description: nil,
  view_more_title: nil,
  view_more_href: nil,
  render_only_thumbnails: nil,
  add_schema: true,
  display_category_badge: false,
  display_duration: true,
  header_style: 'h2',
  use_slider: true,
  border: nil
)
  super()
  @videos = videos || resolve_videos(slugs: slugs, cloudflare_uids: cloudflare_uids, ids: ids)
  @featured_videos = Array(featured_videos)
  @title_heading_level = title_heading_level
  @section_title = section_title
  @description = description
  @view_more_title = view_more_title
  @view_more_href = view_more_href
  @render_only_thumbnails = render_only_thumbnails
  @add_schema = add_schema
  @display_category_badge = display_category_badge
  @display_duration = display_duration
  @header_style = header_style
  @use_slider = use_slider
  @border = border
end

Instance Method Details

#display_videosArray<Video>

Videos to render in the grid/slider, with all featured videos (if any)
prepended and de-duplicated from the regular results so a video tagged
as featured doesn't appear twice when it's also on page 1.

Returns:

  • (Array<Video>)

    featured videos first, then non-featured videos



89
90
91
92
93
94
# File 'app/components/www/video_section_component.rb', line 89

def display_videos
  return videos if featured_videos.empty?

  featured_ids = featured_videos.map(&:id)
  featured_videos + Array(videos).reject { |v| featured_ids.include?(v.id) }
end

#featured?(video) ⇒ Boolean

Whether the given video is one of the featured videos.

Parameters:

  • video (Video)

    the video to check

Returns:

  • (Boolean)

    true when the video is featured



100
101
102
# File 'app/components/www/video_section_component.rb', line 100

def featured?(video)
  featured_videos.any? { |fv| fv.id == video.id }
end

#render?Boolean

Whether the component has any videos to display.

Returns:

  • (Boolean)

    true when at least one video will be rendered



71
72
73
# File 'app/components/www/video_section_component.rb', line 71

def render?
  display_videos.present?
end

#with_collection(videos) ⇒ Www::VideoSectionComponent

Replaces the videos when rendering a collection.

Parameters:

  • videos (ActiveRecord::Relation<Video>, Array<Video>)

    videos to render

Returns:



79
80
81
82
# File 'app/components/www/video_section_component.rb', line 79

def with_collection(videos)
  @videos = videos
  self
end