passkeep/app/helpers/sidemenu_helper.rb

114 lines
3.6 KiB
Ruby

# frozen_string_literal: true
# Module for building side menu
module SidemenuHelper
def build_side_menu
ret = nav_link('Home', '/', '', 'fa-home')
ret += divider
ret += heading('Nazwa')
submenu = ['other components:', ['Buttons', '/', '/'],
['Cards', '/home/index', '/home/index']]
ret += nav_link_submenu(['Components', 'fa-cog', 'Comp'],
submenu,
['/', '/home/index'])
ret.html_safe
end
# divider for menu
def divider
# <hr class="sidebar-divider">
tag.hr class: 'sidebar-divider'
end
# heading for menu
def heading(name)
# <div class="sidebar-heading">Addons</div>
content_tag(:div, name, class: 'sidebar-heading')
end
# link without submenu
def nav_link(text, link, for_active, icon)
nav_class = check_link_active(for_active) ? 'nav-item active' : 'nav-item'
content_tag(:li, nav_link_to(text, icon, link), class: nav_class)
end
# link_to for navigation
def nav_link_to(text, icon, link, name = nil, expand = nil)
icon_text = icon.nil? ? '' : "<i class=\"fas fa-fw #{icon}\"></i>"
if name.nil?
link_to(raw("#{icon_text}<span>#{text}</span>"),
link, class: 'nav-link')
else
link_to(raw("#{icon_text}<span>#{text}</span>"),
link, class: "nav-link#{expand ? '' : ' collapsed'}",
data: { toggle: 'collapse', target: "#collapse#{name}" },
aria: { expanded: "#{expand}", controls: "collapse#{name}" })
end
end
# create link with sub_menu
# @params:
# a_name [Array] - [name of menu, icon, div_id]
# submenu [Array] - array of :
# -> [name of link {str}, link{str}, active{str or arr}]
# -> nil - to add divider to menu
# -> 'String' - to add header to menu
# for_active - all links in this submenu
def nav_link_submenu(a_name, submenu, for_active)
content_tag :li, class: 'nav-item' do
expand = check_link_active(for_active)
r = nav_link_to(a_name[0], a_name[1], '#', a_name[2], expand)
r += content_tag(:div, inner_submenu(submenu),
id: "collapse#{a_name[2]}",
class: "collapse#{expand ? ' show' : ''}",
aria: { labelledby: "heading#{a_name[2]}" },
data: { parent: '#accordionSidebar' })
r
end
end
# creates inner_submenu
# submenu [Array] - array of :
# -> [name of link {str}, link{str}, active{str or arr}]
# -> nil - to add divider to menu
# -> 'String' - to add header to menu
def inner_submenu(submenu)
content_tag :div, class: 'bg-white py-2 collapse-inner rounded' do
r = nil
submenu.each do |sub|
r += submenu_element(sub) unless r.nil?
r = submenu_element(sub) if r.nil?
end
r
end
end
def submenu_element(sub)
if sub.nil?
# divider
tag.div class: 'collapse-divider'
elsif sub.class.to_s == 'String'
# header
content_tag :h6, sub, class: 'collapse-header'
elsif sub.class.to_s == 'Array'
# link (menu item)
activecl = check_link_active(sub[2]) ? ' active' : ''
link_to(sub[0], sub[1], class: "collapse-item#{activecl}")
end
end
# check if this link is active
def check_link_active(for_active)
is_active = false
if for_active.class.to_s == 'String'
is_active = controller_path.to_s.include?(for_active)
elsif for_active.class.to_s == 'Array'
for_active.each do |fa|
is_active = true if controller_path.to_s.include?(fa)
break if is_active
end
end
is_active
end
end