The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
[%# RelOpts hash has the following supporting keys:

* skip

Hashref of method names. If a relationship method exists in the hash,
it is skipped.

* alias

Hashref of method name to method name. If a relationship method appears
as a hash key, its corresponding value should be another relationship
method name. 'alias' can be used with 'skip'
to mask some methods or make "foo" act like "bar".

* lock

Hashref of method names. If a relationship method exists in the hash,
no link is created for the "Create association from 'method_name'" feature.

* order

Arrayref of relationship names in the order they should appear. Defaults
to all relationships, sorted alphabetically by label.

# end doc
%]
[%

# don't bother if we do not have any relationships
IF (!form.metadata.relationships.size);
    RETURN;
END;

# EDITMODE is global flag indicating whether user may edit.
CALL yui.show_remove_button(EDITMODE);

# TODO since we use tabs, only load livegrids when they are selected
SET Tabs = [];
SET activeTab = 0;
SET RelsToShow = [];
SET RelsCreateLinks = [];
DEFAULT RelOpts = {};
SET rel_order = [];
IF RelOpts.order;
    rel_order = RelOpts.order;
ELSE;
    rel_order = form.metadata.relationships.sort_by('label');
END;
FOREACH rel IN rel_order;
    NEXT IF rel.type && rel.type == 'foreign key';
    NEXT IF rel.type && rel.type == 'many to one';
    NEXT IF rel.type && rel.type == 'one to one';
    
    SET rel_info = form.metadata.relationship_info( rel );
    NEXT IF rel_info.foreign_class == form.metadata.object_class;    
    SET method = rel_info.method;
    NEXT IF RelOpts.skip.exists( method );
    
    IF (RelOpts.alias.exists( method ));
        SET old_info = rel_info;
        rel_info = form.metadata.relationship_info( RelOpts.alias.item( method ) );
        method = rel_info.method;
        rel_info.label = old_info.label;
    END;
    
    activeTab = activeTab + 1;
    SET tabLabel  = method;
    SET thisLabel = rel_info.label || method;
    SET thisTabActive = 0;
    IF (!form.metadata.default_selected && activeTab == 1);
        thisTabActive = 1;
    ELSIF (form.metadata.default_selected == tabLabel);
        thisTabActive = 1;
    END;
    
    # create the tab structure
    Tabs.push({ 
        label   => thisLabel,
        id      => tabLabel _ 'Tab',
        active  => thisTabActive,
    });
    
    # in case we have not yet initialized the controller instance
    SET rel_controller = rel_info.get_controller;
    
    SET livegrid = yui.livegrid({
            'results'       => object, 
            'controller'    => rel_controller, 
            'form'          => rel_controller.form(c),
            'method_name'   => method,
            'field_names'   => rel_controller.form(c).metadata.field_methods,
            'c'             => c,
    });
        
    SET base_url       = c.uri_for('/' _ rel_controller.path_prefix);
    SET map_params     = {};
    SET map_to         = '';
    SET m2m_url        = '';
    SET m2m_map_to_url = '';
    SET authz_controller = rel_controller;
    IF (rel_info.type == 'many to many');
        m2m_url         = c.uri_for('/' _ rel_controller.path_prefix, 'livegrid_create_form');
        m2m_map_to_url  = c.uri_for('/' _ c.controller(rel_info.map_class_controller_class).path_prefix);
        authz_controller = c.controller(rel_info.map_class_controller_class);
    ELSE;
        FOREACH local_col IN rel_info.cmap.keys.sort;
            SET fk          = rel_info.cmap.$local_col;
            map_params.$fk  = object.$local_col;
        END;
        IF (map_params.keys.size == 1);
            map_to = rel_info.cmap.each.1;
        ELSE;
            #THROW crud '"map_to" not yet supported for multiple-column FKs in ' _ component.name;
            map_to = rel_info.cmap.values.join(';;');
        END;
    END;
            
    USE create_new_url    = url(base_url _ "/create", map_params);  
    USE export_as_xls_url = url(base_url _ "/search", map_params);
    export_as_xls_url     = export_as_xls_url _ '&cxc-fmt=xls&cxc-no_page=1';
    
    SET num_fields        = rel_controller.field_names(c).size;
    SET rowclick_action   = c.session.prefs.default_crud_action || 'view';
    IF (EDITMODE);
        rowclick_action   = 'edit';
    END;
    IF (LIVEGRID_FORM_SIZE > num_fields && EDITMODE && !map_form_url);   # experimental
        rowclick_action = 'livegrid_edit_form';
    END;
    
    RelsToShow.push({
        'authz_controller'  => authz_controller,
        'method'            => method,
        'livegrid'          => livegrid,
        'rel_info'          => rel_info,
        'map_to'            => map_to,
        'map_params'        => map_params,
        'm2m_url'           => m2m_url,
        'num_fields'        => num_fields,
        'rowclick_action'   => rowclick_action,
        'base_url'          => base_url,
        'm2m_map_to_url'    => m2m_map_to_url,
        'create_new_url'    => create_new_url,
        'export_as_xls_url' => export_as_xls_url,
        'thisLabel'         => thisLabel,
        'tabLabel'          => tabLabel,
    });
    
END;

%]