Class: Integral::ListItemRenderer
- Inherits:
-
Object
- Object
- Integral::ListItemRenderer
- 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
Instance Attribute Summary collapse
-
#list_item ⇒ Object
Returns the value of attribute list_item.
-
#opts ⇒ Object
Returns the value of attribute opts.
Class Method Summary collapse
-
.render(list_item, opts = {}) ⇒ String
Renders the provided list item with options given.
Instance Method Summary collapse
-
#description ⇒ String
Description of list item.
-
#fallback_image_url ⇒ String
Path to fallback image for list items.
- #image ⇒ Object
- #image_url(size: :medium, fallback: true) ⇒ Object
-
#initialize(list_item, opts = {}) ⇒ ListItemRenderer
constructor
A new instance of ListItemRenderer.
-
#item_options ⇒ Hash
List item options.
- #non_object_image ⇒ Object
-
#non_object_image_url(size: :medium) ⇒ Object
Returns the non object image path.
- #object_data ⇒ Object
-
#object_image_url(size: :medium) ⇒ Object
Returns the non object image path.
-
#render ⇒ String
Renders the provided list_item.
-
#render_children ⇒ String
Loop over all list item children calling render on each.
-
#render_item ⇒ String
List item HTML.
-
#subtitle ⇒ String
Subtitle of list item.
-
#target ⇒ String
Target of list item.
-
#title ⇒ String
Title of list item.
-
#title_required? ⇒ Boolean
TODO: This and other methods which are only used in backend could be moved to decorators.
-
#type_for_dropdown ⇒ Object
Used within backend for preselecting type in dropdown TODO: Move this onto the model level.
-
#url ⇒ String
URL of list item.
- #video? ⇒ Boolean
Constructor Details
#initialize(list_item, opts = {}) ⇒ ListItemRenderer
Returns a new instance of ListItemRenderer.
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_item ⇒ Object
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 |
#opts ⇒ Object
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
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
#description ⇒ String
Returns description of list item.
95 96 97 |
# File 'lib/integral/list_item_renderer.rb', line 95 def description provide_attr(:description) end |
#fallback_image_url ⇒ String
Returns 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 |
#image ⇒ Object
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.) else url_helpers.url_for(image.representation(Integral..merge!(resize_to_limit: Integral.image_sizes[size]))) end else fallback_image_url if fallback end end |
#item_options ⇒ Hash
Returns list item options.
59 60 61 62 63 64 65 66 |
# File 'lib/integral/list_item_renderer.rb', line 59 def 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_image ⇒ Object
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..merge!(resize_to_limit: Integral.image_sizes[size]))) else fallback_image_url end end |
#object_data ⇒ Object
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..merge!(resize_to_limit: Integral.image_sizes[size]))) elsif image.present? image else fallback_image_url end end |
#render ⇒ String
Renders the provided list_item
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? content_tag opts[:wrapper_element], class: html_classes do concat render_item concat content_tag opts[:child_wrapper_element], render_children, { class: opts[:child_wrapper_class] }, false end else if opts[:wrapper_element] content_tag opts[:wrapper_element], class: html_classes do render_item end else render_item end end end |
#render_children ⇒ String
Loop over all list item children calling render on each
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_item ⇒ String
Returns list item HTML.
54 55 56 |
# File 'lib/integral/list_item_renderer.rb', line 54 def render_item content_tag :a, title, end |
#subtitle ⇒ String
Returns subtitle of list item.
117 118 119 |
# File 'lib/integral/list_item_renderer.rb', line 117 def subtitle provide_attr(:subtitle) end |
#target ⇒ String
Returns 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 |
#title ⇒ String
Returns 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
169 170 171 |
# File 'lib/integral/list_item_renderer.rb', line 169 def title_required? !list_item.object? end |
#type_for_dropdown ⇒ Object
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 |
#url ⇒ String
Returns 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.[:host]}#{url}") end |
#video? ⇒ Boolean
184 185 186 |
# File 'lib/integral/list_item_renderer.rb', line 184 def video? object_data&.fetch(:image)&.video? end |