--- trunk/lib/Frey/Action.pm 2009/01/09 21:50:21 976 +++ trunk/lib/Frey/Action.pm 2009/06/28 23:08:02 1101 @@ -104,6 +104,14 @@ sub params_form { my ( $self ) = @_; + + foreach my $checkbox ( split(/\s+/, $self->params->{'frey-checkboxes'} ) ) { + next if defined $self->params->{ $checkbox }; + + $self->params->{ $checkbox } = 0; + warn "# checkbox $checkbox not ticked"; + } + my $required = $self->required('as_hash'); if ( $required ) { warn $self->class, " required params ", dump( keys %$required ) if $self->debug; @@ -134,10 +142,14 @@ my $max_value_len = 0; my @values; + my $display; my $html = ''; foreach ( @$values ) { my $v = ref($_) eq 'HASH' ? $_->{$name} : $_; + if ( $v =~ s/\t+(.+)$// ) { + $display->{$v} = $1; + } warn "## value '$v'"; push @values, $v; $max_value_len = length($v) if length($v) > $max_value_len; @@ -150,7 +162,8 @@ if ( $#values > 3 && $render !~ m{radio} ) { my $options = join("\n", map { - qq||; + my $d = $display->{$_} || $_; + qq||; } @values ); # onchange="alert(this.options[this.selectedIndex].value);" @@ -193,26 +206,34 @@ } - foreach my $checkbox ( split(/\s+/, $default->{'frey-checkboxes'} ) ) { - next if defined $default->{ $checkbox }; - - $default->{ $checkbox } = 0; - $self->params->{ $checkbox } = 0; - warn "# checkbox $checkbox not ticked"; - } - my @checkboxes; my $label_width = 1; # minimum - foreach my $name ( + my @fields = grep { die "$_ doesn't have meta" unless $class->can('meta'); ! $class->meta->get_attribute($_)->is_lazy && ! defined $default->{$_} && ! m{^_} # skip _private - } $self->attributes - ) { + } $self->attributes; + + my $fieldset; + + my $last; + foreach my $name ( @fields ) { + my $set = $name; + $set =~ s{_[^_]+$}{}; + push @{ $fieldset->{$set} }, $name; + } + + delete( $fieldset->{$_} ) + foreach ( grep { $#{ $fieldset->{$_} } == 0 } keys %$fieldset ); + +warn "XXX fields = ",dump( @fields ); +warn "XXX set = ",dump( $fieldset ); + + foreach my $name ( @fields ) { my $attr_type = ''; my $type = $name =~ m/^pass/ ? 'password' : 'text'; my $label = $name; @@ -225,7 +246,7 @@ my $value = defined $default->{$name} ? $default->{$name} : $attr->has_default ? $attr->default( $name ) : - ''; + undef; if ( ref($params_config) eq 'HASH' && defined $params_config->{$name} ) { $value = $params_config->{$name}; @@ -234,12 +255,18 @@ $default->{$name} = $params_config->[0]->{$name}; } elsif ( $attr->has_type_constraint && $attr->type_constraint->can('values') ) { $value_html = select_values( $name, $attr_type, $attr->type_constraint->values ); + } elsif ( $class->can( $name . '_available' ) ) { + my $available = eval $class . '->' . $name . '_available'; + confess $@ if $@; + $available =~ s/^\s+//gs; + $available =~ s/\s+$//gs; + $value_html = select_values( $name, $attr_type, [ split(/\n/,$available) ]); } elsif ( $attr_type =~ m{^Bool} ) { my $suffix = ''; - $suffix = ' checked' if $value; - $value_html = qq||; + $suffix = ' checked=1' if $value; + $value_html = qq||; push @checkboxes, $name; - } elsif ( ! defined $value ) { + } elsif ( ! defined $value && ! $required->{$name} ) { $value_html = qq|undef|; # FIXME if $self->debug } elsif ( $attr_type !~ m{^(Str|Int)$} || $value =~ $Frey::Web::re_html || $name =~ m{text} ) { $value_html = qq||; @@ -257,7 +284,26 @@ $label_title .= qq| class="required"| if $required->{$name}; $label =~ s/_/ /g; - $form .= qq|$value_html
|; + my $set = $name; + $set =~ s{_[^_]+$}{}; + + my ( $before, $after ) = ( '', '
' ); + + if ( my $s = $fieldset->{$set} ) { + if ($s->[0] eq $name) { + $before = qq| +
+ $set + |; + } elsif ( $s->[ -1 ] eq $name ) { + $after = qq| +
+ |; + } + $label =~ s{^\Q$set\E\s+}{}; + } + + $form .= qq|$before$value_html $after|; my $ll = length($label); $label_width = $ll if $ll > $label_width; } @@ -293,6 +339,11 @@ br { clear: left; } + + fieldset { + margin: 0; + padding: 0; + } |); my $html;