The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
[%# generic RHTMLO form generator. %]
[%
# specific a specific field order with the 'fields.order' array.
# the 'readonly' for values that should not be edited
# but should be displayed (as with creation timestamps, etc)
#
# TODO some default JS validation would be nice here.

# table tags
SET thopen  = '<th class="crud" valign="top">';
SET thclose = '</th>';
SET tdopen  = '<td class="crud" valign="top">';
SET tdclose = '</td>';

# DEFAULT didn't work as expected here.
UNLESS fields.defined;
    SET fields = { order = [], readonly = {} };
END;
UNLESS fields.order.size;
    fields.order    = form.field_names_by_rank;
END;
UNLESS fields.readonly.size;
    # common readonly field names for auto-timestamps.
    # to avoid getting these set automatically,
    # set them explicitly in fields.readonly
    # in the .tt that PROCESSes this one
    fields.readonly.ctime = 1;
    fields.readonly.mtime = 1;
    fields.readonly.created = 1;
    fields.readonly.modified = 1;
END;

DEFAULT oid = object_id;
IF (oid);
    oid = c.controller.make_primary_key_string(object) || 0;
END;

USE Autoformat( all = 1 );  # for textarea readonly

%]
[% BLOCK datetime_popup %]
[% SET id = field.id %]
<span class="calendar_container" id="[% id %]_calendar_container"><img class='calendar'
     src='[% CalendarIconUrl %]'
     onclick='YAHOO.crud.datetime_picker("[% id %]")'
     alt="calendar icon" />
</span>
[% END %]
[% BLOCK date_popup %]
[% SET id = field.id %]
<span class="calendar_container" id="[% id %]_calendar_container">
<img class='calendar'
     src='[% YUIBaseURL %]/[% YUIVersion %]/examples/button/assets/calendar_icon.gif'
     onclick='YAHOO.crud.date_picker("[% id %]")'
     alt="calendar icon" />
</span>
[% END %]

[% IF (error || form.error) %]
<div class="error">[% error || form.error %]</div>
[% END %]

<table class="crud">
[%  FOREACH fname = fields.order;

        field = form.field( fname );
        
        # make sure any serial (autoincrem) fields
        # are skipped. This is a backwards compat fix
        # since RDG used to generate a hidden serial
        # field for autoincrem PKs
        IF (field.class == 'serial' || field.isa('Rose::HTMLx::Form::Field::Serial'));
            NEXT;
        END;
        
        # set DateTime format
        IF field.isa('Rose::HTML::Form::Field::DateTime');
            IF (field.internal_value.epoch.defined);
                CALL field.output_format( yui.serializer.datetime_format );
            END;
        END;
        
        # prevent <enter> key in text fields from submitting form prematurely.
        IF field.isa('Rose::HTML::Form::Field::Text');
            IF(!field.onkeypress);
                CALL field.onkeypress("return YAHOO.crud.check_return_key(event)");
            END;
        END;
 %]
 <tr class="[% (loop.count % 2) ? 'alternate' : '' %]">
 [% IF (field.description.defined && field.description.text.length) %]
 <tr><th colspan="2"><div class="description">
 The <strong>[% field.name %]</strong> field specifies [% field.description %].
 </div></th></tr>
 [% END %]
 [%

        # read-only fields
        # check these first as this is not a field attribute
        IF (fields.readonly.defined( fname ));
            thopen; field.xhtml_label; thclose;
            
            tdopen;

            "<div class='input'>";
            IF field.isa('Rose::HTML::Form::Field::TextArea');
                # if there is raw html in the field, assume it
                # handles it's own line breaks, etc.
                UNLESS field.output_value.match('<.+>');
                    "<pre>"; 
                    autoformat( field.output_value ) | html;
                    "</pre>";
                ELSE;
                    field.output_value;
                END;
            ELSIF field.isa('Rose::HTML::Form::Field::DateTime');
              IF (field.internal_value.epoch.defined);
                field.output_value _ '';
              END;
            ELSIF field.isa('Rose::HTMLx::Form::Field::Boolean');
                field.output_value == '1' ? 'true' : 'false';
            ELSIF field.isa('Rose::HTML::Form::Field::PopUpMenu');
                field.value_label;
            ELSE;
                form.field_value( fname );
            END;
            
            PROCESS crud/related_field_link.tt;
            
            "</div>";
            
            # optionally pass the readonly value through hidden
            # as when creating an object with a FK that is readonly.
            # this only works with values that are not objects themselves.
            IF (fields.readonly.item( fname ) > 1) 
 %]
              <input type="hidden" name="[% fname %]" value="[% field.output_value %]" />
 [% 
            END;
            
            tdclose;
        
        # autocomplete magic
        ELSIF (field.can('autocomplete'));
            u = field.url;
            USE url = url( u.0, u.1 );
            SET input = {
                    label       = field.xhtml_label,
                    url         = u.0,
                    params      = url.match('\?(.+)$').0.replace('&amp;','&'),
                    id          = 'ac_' _ fname,      # fname will be used as hidden field name
                    hidden_value = field.internal_value,
                    fname       = fname,
                    param       = u.1,
                    limit       = field.limit,
                    cache_size  = 50,
                    csize       = field.size || 0,
                    tabindex    = field.tabindex,
            };
            # if searching, we do not have an object yet.
            IF (object);
                input.value  = 
                    form.metadata.foreign_field_value( fname, object )
                    ||
                    field.internal_value;
            END;
            PROCESS crud/autocomplete_field.tt;

        # checkboxes
        ELSIF (field.can('xhtml_checkbox'));
            thopen; field.xhtml_label; thclose;
            tdopen; field.xhtml_checkbox; tdclose;
      
        # hidden fields
        ELSIF (field.isa('Rose::HTML::Form::Field::Hidden'));
            IF show_hidden_fields;
                t = form.hidden_to_text_field(field);
                thopen;
                t.xhtml_label;
                thclose;
                tdopen;
                t.xhtml;
                tdclose;
            ELSE;
                field.xhtml;
            END;
                  
        # Dates and DateTimes get a popup calendar
        ELSIF field.isa('Rose::HTML::Form::Field::DateTime');
            thopen;
            field.xhtml_label;
            thclose;
            tdopen;
            field.xhtml;
            PROCESS datetime_popup;
            tdclose;
            
        ELSIF field.isa('Rose::HTML::Form::Field::Date');
            thopen;
            field.xhtml_label;
            thclose;
            tdopen;
            field.xhtml;
            PROCESS date_popup;
            tdclose;
            
        # default
        ELSE;
            thopen;           
            field.xhtml_label;
            thclose;
            tdopen;
            field.xhtml;
            PROCESS crud/related_field_link.tt;
            tdclose;
            
        END;    # IF/ELSE
    '</tr>';        
    END;  # FOREACH     
%]
</table>