class SwedbankPay::SidebarHTMLBuilder

The builder of HTML for the Sidebar

Public Class Methods

new(tree) click to toggle source
# File lib/sidebar_html_builder.rb, line 9
def initialize(tree)
  @tree = tree
end

Public Instance Methods

build(current_page) click to toggle source
# File lib/sidebar_html_builder.rb, line 13
def build(current_page)
  raise ArgumentError, 'current_page cannot be nil' if current_page.nil?
  raise ArgumentError, "#{current_page.class} is not a #{SidebarPage}" unless current_page.is_a? SidebarPage

  build_markup(@tree, current_page)
end

Private Instance Methods

build_markup(pages, current_page) click to toggle source
# File lib/sidebar_html_builder.rb, line 22
def build_markup(pages, current_page)
  return '' if pages.empty?

  markup = ''

  pages.each do |page|
    current_page_name = current_page.respond_to?(:name) ? current_page.name : current_page.to_s

    if page.hidden_for?(current_page)
      SidebarLogger.debug("#{page.name} is hidden for #{current_page_name}")
      next
    elsif page.hidden?
      SidebarLogger.debug("Hidden page #{page.name} is not hidden for #{current_page_name}")
    end

    sub_items_markup = sub_items_markup(page, current_page)
    markup << item_markup(page, current_page, sub_items_markup, false)
  end

  markup
end
group_class(level) click to toggle source
# File lib/sidebar_html_builder.rb, line 68
def group_class(level)
  level.zero? ? 'nav-group' : 'nav-subgroup'
end
group_heading_class(level) click to toggle source
# File lib/sidebar_html_builder.rb, line 72
def group_heading_class(level)
  group_class = group_class(level)
  "#{group_class}-heading"
end
header_markup(page, header) click to toggle source
# File lib/sidebar_html_builder.rb, line 112
def header_markup(page, header)
  hash = header[:hash]
  subtitle = header[:title]
  href = "#{page.path}#{hash}"
  leaf_markup(href, subtitle)
end
headers_markup(page, current_page) click to toggle source
# File lib/sidebar_html_builder.rb, line 98
def headers_markup(page, current_page)
  # If there's no page headers, only return a leaf item for the page itself.
  main_title = page.title.nil? ? nil : page.title.main
  return leaf_markup(page.path, main_title, page.level) unless page.headers?

  # If there's no children, only return the headers as leaf node items.
  return page.headers.map { |h| header_markup(page, h) }.join unless page.children?

  headers_markup = page.headers.map { |h| header_markup(page, h) }.join
  headers_markup = "<ul class=\"nav-ul\">#{headers_markup}</ul>"

  item_markup(page, current_page, headers_markup, true)
end
item_class(page, current_page, level, is_leaf) click to toggle source
# File lib/sidebar_html_builder.rb, line 61
def item_class(page, current_page, level, is_leaf)
  active = page.active?(current_page, is_leaf: is_leaf)
  item_class = group_class(level)
  item_class += ' active' if active
  item_class
end
item_markup(page, current_page, sub_items_markup, is_leaf) click to toggle source
# File lib/sidebar_html_builder.rb, line 44
def item_markup(page, current_page, sub_items_markup, is_leaf)
  # If we're rendering a leaf node, just set the level to a non-zero value
  # to get the 'nav-subgroup' class and such.
  level = is_leaf ? -1 : page.level
  title_markup = title_markup(page, level, is_leaf)
  item_class = item_class(page, current_page, level, is_leaf)
  group_heading_class = group_heading_class(level)

  "<li class=\"#{item_class}\">
    <div class=\"#{group_heading_class}\">
      <i class=\"material-icons\">arrow_right</i>
      #{title_markup}
    </div>
    #{sub_items_markup}
  </li>"
end
lead_title(page) click to toggle source
# File lib/sidebar_html_builder.rb, line 124
def lead_title(page)
  return page.title.lead unless page.title.nil? || page.title.lead.nil?
  return page.parent.title.to_s unless page.parent.nil? || page.parent.title.nil?

  ''
end
leaf_markup(href, title, level = 0) click to toggle source
# File lib/sidebar_html_builder.rb, line 119
def leaf_markup(href, title, level = 0)
  leaf_class = level.positive? ? 'nav-leaf nav-subgroup-leaf' : 'nav-leaf'
  "<li class=\"#{leaf_class}\"><a href=\"#{href}\">#{title}</a></li>"
end
main_title(page, is_leaf) click to toggle source
# File lib/sidebar_html_builder.rb, line 131
def main_title(page, is_leaf)
  unless page.nil? || page.title.nil?
    lead_title = lead_title(page)
    parent_lead_title = parent_lead_title(page)
    main_title = page.title.main

    # If the lead title is different to the parent's or we're not on a leaf
    # node item, use the lead title as the main title. This causes 'section: Card'
    # to be used as title for the Card item, but allows the nav-subgroup-heading
    # 'Introduction' item to use the main title 'Introduction'.
    main_title = lead_title unless lead_title == parent_lead_title || is_leaf

    return main_title || page.title.to_s
  end

  ''
end
parent_lead_title(page) click to toggle source
# File lib/sidebar_html_builder.rb, line 149
def parent_lead_title(page)
  return page.parent.title.lead unless page.parent.nil? || page.parent.title.nil?

  nil
end
sub_items_markup(page, current_page) click to toggle source
# File lib/sidebar_html_builder.rb, line 86
def sub_items_markup(page, current_page)
  headers_markup = headers_markup(page, current_page)
  child_markup = build_markup(page.children, current_page)

  return '' if headers_markup.empty? && child_markup.empty?

  "<ul class=\"nav-ul\">
    #{headers_markup}
    #{child_markup}
  </ul>"
end
title_markup(page, level, is_leaf) click to toggle source
# File lib/sidebar_html_builder.rb, line 77
def title_markup(page, level, is_leaf)
  lead_title = lead_title(page)
  return "<span>#{lead_title}</span>" if level.zero?

  main_title = main_title(page, is_leaf)

  "<a href=\"#{page.path}\">#{main_title}</a>"
end