/
image_card_helper.rb
161 lines (139 loc) · 5.2 KB
/
image_card_helper.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
module GovukPublishingComponents
module Presenters
class ImageCardHelper
include ActionView::Helpers
include ActionView::Context
attr_reader :href_data_attributes, :extra_details, :extra_details_no_indent, :heading_text, :metadata, :lang, :image_loading, :youtube_video_id, :image_src, :two_thirds, :large_font_size_mobile
def initialize(local_assigns, brand_helper)
@href = local_assigns[:href]
@href_data_attributes = local_assigns[:href_data_attributes]
@extra_details = local_assigns[:extra_details] || []
@image_src = local_assigns[:image_src]
@image_alt = local_assigns[:image_alt] || ""
@youtube_video_alt = local_assigns[:youtube_video_alt]
@image_loading = local_assigns[:image_loading] || "auto"
@srcset = local_assigns[:srcset] || nil
@sizes = local_assigns[:sizes] || nil
@image_loading = local_assigns[:image_loading] || "auto"
@context = local_assigns[:context]
@description = local_assigns[:description]
@large = local_assigns[:large]
@two_thirds = local_assigns[:two_thirds] || false
@large_font_size_mobile = local_assigns[:large_font_size_mobile] || false
@heading_text = local_assigns[:heading_text]
@extra_details_no_indent = local_assigns[:extra_details_no_indent]
@metadata = local_assigns[:metadata]
@lang = local_assigns[:lang]
@youtube_video_id = local_assigns[:youtube_video_id] || nil
@brand_helper = brand_helper
end
def href
return youtube_href if @youtube_video_id
@href
end
def large
# if youtube video, we don't want to use
# the small variant, large will be always
# true if a youtube_video_id is supplied
@youtube_video_id || @large
end
def large_mobile_font_size?
# allow the font-size to be 19px on mobile
# for the two-thirds varation of the
# image card component
@two_thirds && @large_font_size_mobile
end
def is_tracking?
return true if @href_data_attributes
if @extra_details
@extra_details.each do |link|
return true if link[:data_attributes]
end
end
false
end
def media
return youtube_link if @youtube_video_id
image
end
def image
classes = %w[gem-c-image-card__image-wrapper]
classes << "gem-c-image-card__image-wrapper--one-third" if @two_thirds
height = 200
width = 300
height = 90 if @two_thirds
width = 90 if @two_thirds
if @image_src
content_tag(:figure, class: classes) do
image_tag(
@image_src,
class: "gem-c-image-card__image",
alt: @image_alt,
loading: @image_loading,
sizes: @sizes,
srcset: @srcset,
height:,
width:,
)
end
end
end
def context
return unless @context
content_tag(:p, class: "gem-c-image-card__context") do
if @context[:date]
date = content_tag(:time, l(@context[:date], format: "%e %B %Y"), datetime: @context[:date].iso8601, lang: "en")
dash = content_tag(:span, " — ", 'aria-hidden': true)
if @context[:text]
date.concat(dash).concat(@context[:text])
else
date
end
else
@context[:text]
end
end
end
def description
return content_tag(:div, @description, class: "gem-c-image-card__description gem-c-image-card__description--large-font-size-mobile") if @description && large_mobile_font_size?
content_tag(:div, @description, class: "gem-c-image-card__description") if @description
end
def youtube_href
"https://www.youtube.com/watch?v=#{@youtube_video_id}"
end
def youtube_thumbnail_url
"https://img.youtube.com/vi/#{@youtube_video_id}/maxresdefault.jpg"
end
def youtube_thumbnail
thumbnail = content_tag(:div, class: "gem-c-image-card__youtube-thumbnail-image-container") do
image_tag(
youtube_thumbnail_url,
class: "gem-c-image-card__image gem-c-image-card__youtube-thumbnail-image",
alt: "",
loading: @image_loading,
)
end
thumbnail + content_tag(:figcaption, @youtube_video_alt, class: "gem-c-image-card__youtube-thumbnail-container-text govuk-link #{@brand_helper.color_class}")
end
def youtube_link
content_tag(
:figure,
class: "gem-c-image-card__image-wrapper gem-c-image-card__image-wrapper--youtube-embed",
) do
content_tag(:div) do
link_to(
href,
{
class: "govuk-body govuk-link gem-c-image-card__youtube-thumbnail-container js-youtube-card-embed",
"data-youtube-player-analytics": true,
"data-youtube-player-analytics-category": "EmbeddedYoutube",
},
) do
youtube_thumbnail
end
end
end
end
end
end
end