Trees are displayed in various places in the UI. Most notable are trees in explorer-like pages. Other examples include the snapshot tree for VMs and RBAC feature tree under Settings/Access Controll/Roles.
Trees are built using TreeBuilder
subclasses located in app/presenters/tree_builder*
.
Example tree builder:
class TreeBuilderInstances < TreeBuilder
has_kids_for AvailabilityZone, [:x_get_tree_az_kids]
has_kids_for ExtManagementSystem, [:x_get_tree_ems_kids]
include TreeBuilderArchived
def tree_init_options(_tree_name)
{
:leaf => 'VmCloud'
}
end
def set_locals_for_render
locals = super
locals.merge!(
:tree_id => "instances_treebox",
:tree_name => "instances_tree",
:autoload => true
)
end
def root_options
[_("Instances by Provider"), _("All Instances by Provider that I can see")]
end
def x_get_tree_roots(count_only, _options)
count_only_or_objects_filtered(count_only, EmsCloud, "name", :match_via_descendants => VmCloud) +
count_only_or_objects(count_only, x_get_tree_arch_orph_nodes("Instances"))
end
def x_get_tree_ems_kids(object, count_only)
count_only_or_objects_filtered(count_only, object.availability_zones, "name") +
count_only_or_objects_filtered(count_only, object.vms.where(:availability_zone_id => nil), "name")
end
# Get AvailabilityZone children count/array
def x_get_tree_az_kids(object, count_only)
count_only_or_objects_filtered(count_only, object.vms.not_archived_nor_orphaned, "name")
end
end
x_get_tree_roots
describes the root element(s) of the tree.has_kids_for
is used to declare non-root branches in the tree and methods that produce those.
Rules for buiding particular tree nodes are in TreeNodeBuilder
and it's subclasses in app/presenters/tree_node_builder*
.
Trees in explorer screens are wrapped in accordions. The list of accordions with trees in a particular controller is specified via "features".
Example:
def features
[
ApplicationController::Feature.new_with_hash(
:role => "vandt_accord",
:name => :vandt,
:title => _("VMs & Templates")),
ApplicationController::Feature.new_with_hash(
:role => "vms_filter_accord",
:name => :vms_filter,
:title => _("VMs"),),
ApplicationController::Feature.new_with_hash(
:role => "templates_filter_accord",
:name => :templates_filter,
:title => _("Templates"),),
]
end