class Integral::ListRenderer

Handles safely rendering lists

Attributes

list[RW]
opts[RW]

Public Class Methods

new(list, opts = {}) click to toggle source

@param list [List] object to render @param opts [Hash] options hash

# File lib/integral/list_renderer.rb, line 21
def initialize(list, opts = {})
  @opts = opts.reverse_merge(
    item_renderer: ListItemRenderer,
    item_renderer_opts: {},
    wrapper_element: 'ul'
  )

  @list = list
end
render(list, opts = {}) click to toggle source

Renders the provided list with options given

@return [String] the rendered list

# File lib/integral/list_renderer.rb, line 14
def self.render(list, opts = {})
  renderer = new(list, opts)
  renderer.render_safely.html_safe
end

Public Instance Methods

render() click to toggle source

Renders the provided list

@return [String] the rendered list item

# File lib/integral/list_renderer.rb, line 42
def render
  rendered_items = ''

  list.list_items.each do |list_item|
    rendered_items += render_item(list_item)
  end

  if opts[:wrapper_element]
    content_tag opts[:wrapper_element], rendered_items, html_options, false
  else
    rendered_items
  end
end
render_safely() click to toggle source

Performs checks before rendering to see if provided list exists and contains list items

# File lib/integral/list_renderer.rb, line 32
def render_safely
  return render_no_list_warning if list.nil?
  return render_no_items_warning if list.list_items.empty?

  render
end

Private Instance Methods

html_classes() click to toggle source
# File lib/integral/list_renderer.rb, line 90
def html_classes
  return list.html_classes unless opts[:html_classes].present?

  "#{list.html_classes} #{opts[:html_classes]}"
end
html_id() click to toggle source
# File lib/integral/list_renderer.rb, line 83
def html_id
  return list.html_id if list.html_id.present?
  return opts[:html_id] if opts[:html_id].present?

  ''
end
html_options() click to toggle source
# File lib/integral/list_renderer.rb, line 70
def html_options
  opts = {}
  opts[:id] = html_id if html_id.present?
  opts[:class] = html_classes if html_classes.present?
  opts[:data] = self.opts[:data_attributes]

  opts
end
render_item(item) click to toggle source
# File lib/integral/list_renderer.rb, line 79
def render_item(item)
  opts[:item_renderer].render(item, opts[:item_renderer_opts])
end
render_no_items_warning() click to toggle source

@return [String] HTML comment informing list contains 0 items

# File lib/integral/list_renderer.rb, line 65
def render_no_items_warning
  Rails.logger.debug('IntegralMessage: Tried to render a list with no items.')
  '<!-- Warning: Tried to render a list with no items. -->'
end
render_no_list_warning() click to toggle source

@return [String] HTML comment informing nil argument was provided as the list

# File lib/integral/list_renderer.rb, line 59
def render_no_list_warning
  Rails.logger.debug('IntegralMessage: Tried to render a list with a nil argument.')
  '<!-- Warning: Tried to render a list with a nil argument. -->'
end