Class: Integral::ListItemRenderer

Inherits:
Object
  • Object
show all
Includes:
ActionView::Context, ActionView::Helpers::AssetTagHelper, ActionView::Helpers::TagHelper, ActionView::Helpers::TextHelper
Defined in:
lib/integral/list_item_renderer.rb

Overview

Handles safely rendering list items

Direct Known Subclasses

PartialListItemRenderer

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(list_item, opts = {}) ⇒ ListItemRenderer

Returns a new instance of ListItemRenderer.

Parameters:

  • list_item (ListItem)

    object to render

  • opts (Hash) (defaults to: {})

    options hash



21
22
23
24
25
26
27
28
29
# File 'lib/integral/list_item_renderer.rb', line 21

def initialize(list_item, opts = {})
  @opts = opts.reverse_merge(
    wrapper_element: 'li',
    child_wrapper_element: 'ul',
    child_wrapper_class: ''
  )

  @list_item = list_item
end

Instance Attribute Details

#list_itemObject

Returns the value of attribute list_item.



9
10
11
# File 'lib/integral/list_item_renderer.rb', line 9

def list_item
  @list_item
end

#optsObject

Returns the value of attribute opts.



9
10
11
# File 'lib/integral/list_item_renderer.rb', line 9

def opts
  @opts
end

Class Method Details

.render(list_item, opts = {}) ⇒ String

Renders the provided list item with options given

Returns:

  • (String)

    the rendered list item



14
15
16
17
# File 'lib/integral/list_item_renderer.rb', line 14

def self.render(list_item, opts = {})
  renderer = new(list_item, opts)
  renderer.render
end

Instance Method Details

#descriptionString

Returns description of list item.

Returns:

  • (String)

    description of list item



95
96
97
# File 'lib/integral/list_item_renderer.rb', line 95

def description
  provide_attr(:description)
end

#fallback_image_urlString

Returns path to fallback image for list items.

Returns:

  • (String)

    path to fallback image for list items



174
175
176
# File 'lib/integral/list_item_renderer.rb', line 174

def fallback_image_url
  ActionController::Base.helpers.image_path('integral/defaults/no_image_available.jpg')
end

#imageObject



147
148
149
150
151
152
153
# File 'lib/integral/list_item_renderer.rb', line 147

def image
  if list_item.image.present?
    return list_item.image
  elsif object_available? && object_data[:image].present?
    object_data[:image]
  end
end

#image_url(size: :medium, fallback: true) ⇒ Object



155
156
157
158
159
160
161
162
163
164
165
# File 'lib/integral/list_item_renderer.rb', line 155

def image_url(size: :medium, fallback: true)
  if image.present?
    if size == :original
      url_helpers.url_for(image.attachment)
    else
      url_helpers.url_for(image.representation(Integral.image_transformation_options.merge!(resize_to_limit: Integral.image_sizes[size])))
    end
  else
    fallback_image_url if fallback
  end
end

#item_optionsHash

Returns list item options.

Returns:

  • (Hash)

    list item options



59
60
61
62
63
64
65
66
# File 'lib/integral/list_item_renderer.rb', line 59

def item_options
  opts = {}
  opts[:class] = 'dropdown-button' if list_item.has_children?
  opts[:href] = url if url.present?
  opts[:target] = target if target.present? && target != '_self'

  opts
end

#non_object_imageObject



134
135
136
# File 'lib/integral/list_item_renderer.rb', line 134

def non_object_image
  list_item.image if list_item.image.present? && list_item.image.attached?
end

#non_object_image_url(size: :medium) ⇒ Object

Returns the non object image path



139
140
141
142
143
144
145
# File 'lib/integral/list_item_renderer.rb', line 139

def non_object_image_url(size: :medium)
  if non_object_image.present?
    url_helpers.url_for(non_object_image.representation(Integral.image_transformation_options.merge!(resize_to_limit: Integral.image_sizes[size])))
  else
    fallback_image_url
  end
end

#object_dataObject



178
179
180
181
182
# File 'lib/integral/list_item_renderer.rb', line 178

def object_data
  return nil unless object_available?

  @object_data ||= list_item.object.to_list_item
end

#object_image_url(size: :medium) ⇒ Object

Returns the non object image path



122
123
124
125
126
127
128
129
130
131
132
# File 'lib/integral/list_item_renderer.rb', line 122

def object_image_url(size: :medium)
  image = object_data[:image] if object_available?

  if image.respond_to?(:attached?) && image.attached?
    url_helpers.url_for(image.representation(Integral.image_transformation_options.merge!(resize_to_limit: Integral.image_sizes[size])))
  elsif image.present?
    image
  else
    fallback_image_url
  end
end

#renderString

Renders the provided list_item

Returns:

  • (String)

    the rendered list item (including possible children)



34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/integral/list_item_renderer.rb', line 34

def render
  return render_no_object_warning if list_item.object? && !object_available?

  if list_item.has_children?
     opts[:wrapper_element], class: html_classes do
      concat render_item
      concat  opts[:child_wrapper_element], render_children, { class: opts[:child_wrapper_class] }, false
    end
  else
    if opts[:wrapper_element]
       opts[:wrapper_element], class: html_classes do
        render_item
      end
    else
      render_item
    end
  end
end

#render_childrenString

Loop over all list item children calling render on each

Returns:

  • (String)

    compiled string of all the rendered list item children



71
72
73
74
75
76
77
78
79
# File 'lib/integral/list_item_renderer.rb', line 71

def render_children
  children = ''

  list_item.children.each do |child|
    children += self.class.render(child, opts)
  end

  children
end

#render_itemString

Returns list item HTML.

Returns:

  • (String)

    list item HTML



54
55
56
# File 'lib/integral/list_item_renderer.rb', line 54

def render_item
   :a, title, item_options
end

#subtitleString

Returns subtitle of list item.

Returns:

  • (String)

    subtitle of list item



117
118
119
# File 'lib/integral/list_item_renderer.rb', line 117

def subtitle
  provide_attr(:subtitle)
end

#targetString

Returns target of list item.

Returns:

  • (String)

    target of list item



100
101
102
# File 'lib/integral/list_item_renderer.rb', line 100

def target
  list_item.target unless list_item.basic?
end

#titleString

Returns title of list item.

Returns:

  • (String)

    title of list item



90
91
92
# File 'lib/integral/list_item_renderer.rb', line 90

def title
  provide_attr(:title)
end

#title_required?Boolean

TODO: This and other methods which are only used in backend could be moved to decorators

Returns:

  • (Boolean)

    whether or not title is a required attribute



169
170
171
# File 'lib/integral/list_item_renderer.rb', line 169

def title_required?
  !list_item.object?
end

#type_for_dropdownObject

Used within backend for preselecting type in dropdown TODO: Move this onto the model level



83
84
85
86
87
# File 'lib/integral/list_item_renderer.rb', line 83

def type_for_dropdown
  return list_item.type unless list_item.object?

  list_item.object_type.to_s
end

#urlString

Returns URL of list item.

Returns:

  • (String)

    URL of list item



105
106
107
108
109
110
111
112
113
114
# File 'lib/integral/list_item_renderer.rb', line 105

def url
  return if list_item.basic?

  url = provide_attr(:url)

  return url if url.nil? || url.empty?
  return CGI.unescape(url) if url.match?(URI::DEFAULT_PARSER.make_regexp)

  CGI.unescape("#{Rails.application.routes.default_url_options[:host]}#{url}")
end

#video?Boolean

Returns:

  • (Boolean)


184
185
186
# File 'lib/integral/list_item_renderer.rb', line 184

def video?
  object_data&.fetch(:image)&.video?
end