format :html do
# @param tab_hash [Hash] keys are the tab names
# Each value can be either a String or a Hash.
# If a Hash can contain the following keys:
# :title - the label to appear in the clickable tab nav.
# if title is not specified, the key is used
# :content - body of tab pane
# :button_attr - attributes for button link in tab nav.
#
# If using lazy loading (see :load below), the following options also apply
# :path - explicit path to use for tab pane
# :view - card view from which to auto-construct path (if missing, uses key)
#
# If the value is a String, it is treated as the tab content for static tabs and
# the view for lazy tabs
#
# @param active_name [String] label of the tab that should be active at the
#
# @param args [Hash] options
# @option args [String] :tab_type ('tabs') use pills or tabs
# @option args [Hash] :panel_attr html args used for the panel div
# @option args [Hash] :pane_attr html args used for the pane div
# @option args [Hash] :load. `:lazy` for lazy-loading tabs
#
# @param block [Block] content of the active tab (for lazy-loading)
# beginning (default is the first)
#
# @return [HTML] bootstrap tabs element with all content preloaded
def tabs tab_hash, active_name=nil, args={}, &block
klass = args[:load] == :lazy ? Card::LazyTab : Card::Tab
args.reverse_merge!(
panel_attr: {},
pane_attr: {},
tab_type: "tabs",
block: block,
tab_objects: Card::Tab.tab_objects(self, tab_hash, active_name, klass)
)
haml :tab_panel, args
end
view :tabs do
construct_tabs "tabs"
end
def construct_tabs tab_type
tabs = { active: {}, paths: {} }
voo.items[:view] ||= :content
card.each_item_name_with_options(_render_raw) do |name, options|
construct_tab tabs, name, options
end
tabs tabs[:paths], tabs[:active][:name], tab_type: tab_type, load: :lazy do
tabs[:active][:content]
end
end
def construct_tab tabs, name, explicit_options
tab_options = item_view_options explicit_options
tabs[:paths][name] = {
title: nest(name, view: :title, title: tab_options[:title]),
path: nest_path(name, tab_options).html_safe
}
return unless tabs[:active].empty?
tabs[:active] = { name: name, content: nest(name, tab_options) }
end
# def tab_title title, name
# return name unless title
# name.to_name.title title, @context_names
# end
view :pills do
construct_tabs "pills"
end
view :tabs_static do
construct_static_tabs "tabs"
end
view :pills_static do
construct_static_tabs "pills"
end
def construct_static_tabs tab_type
tabs = {}
card.item_cards.each do |item|
tabs[item.name] = nest item, item_view_options(args)
end
tabs tabs, nil, tab_type: tab_type
end
end