--- trunk/lib/Frey/Action.pm 2009/06/29 18:14:35 1112 +++ trunk/lib/Frey/Action.pm 2009/06/29 18:25:33 1113 @@ -102,6 +102,86 @@ =cut +sub form_id { + my ($self) = @_; + my $form_id = $self->class; + $form_id =~ s{\W+}{_}g; + return $form_id; +} + +sub select_values { + my ( $self, $name, $attr_type, $values ) = @_; + + $attr_type ||= '?' and warn "$name doesn't have attr_type"; + + my $form_id = $self->form_id; + 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; + } + + warn "# max_value_len: $max_value_len"; + #my $render = eval $class . '->render_' . $name; + my $call = 'render_' . $name; + my $render = $self->class->$call; + warn "## render $@"; + + if ( $#values > 3 && $render !~ m{radio} ) { + my $options = join("\n", + map { + my $d = $display->{$_} || $_; + qq||; + } @values + ); + # onchange="alert(this.options[this.selectedIndex].value);" + $html = qq| + + | if $options; + } else { + my $delimiter = $max_value_len > $self->input_step_size ? qq|
| : ''; + my $radio = +# $delimiter . + join("\n", + map { strip(qq| + + + $_ + + $delimiter + |) } @values + ); + if ( $radio ) { + + my $size = int( $max_value_len / $self->input_step_size ) + 1; + $size = 5 if $size > 5; + $size *= $self->input_step_size; + $radio .= qq| + + + + + |; + } + $html = qq|
$radio
|; + } + + return +# qq|| . + $html +} + sub params_form { my ( $self ) = @_; @@ -132,79 +212,7 @@ warn "# $class config = ",dump( $params_config ) if $self->debug; my $form; - my $form_id = $class; - $form_id =~ s{\W+}{_}g; - - sub select_values { - my ( $name, $attr_type, $values ) = @_; - - $attr_type ||= '?' and warn "$name doesn't have attr_type"; - - 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; - } - - warn "# max_value_len: $max_value_len"; - my $render = eval $class . '->render_' . $name; - warn "## render $@"; - - if ( $#values > 3 && $render !~ m{radio} ) { - my $options = join("\n", - map { - my $d = $display->{$_} || $_; - qq||; - } @values - ); - # onchange="alert(this.options[this.selectedIndex].value);" - $html = qq| - - | if $options; - } else { - my $delimiter = $max_value_len > $self->input_step_size ? qq|
| : ''; - my $radio = -# $delimiter . - join("\n", - map { strip(qq| - - - $_ - - $delimiter - |) } @values - ); - if ( $radio ) { - - my $size = int( $max_value_len / $self->input_step_size ) + 1; - $size = 5 if $size > 5; - $size *= $self->input_step_size; - $radio .= qq| - - - - - |; - } - $html = qq|
$radio
|; - } - - return -# qq|| . - $html - } - + my $form_id = $self->form_id; my @checkboxes; @@ -250,16 +258,16 @@ if ( ref($params_config) eq 'HASH' && defined $params_config->{$name} ) { $value = $params_config->{$name}; } elsif ( ref($params_config) eq 'ARRAY' ) { - $value_html = select_values( $name, $attr_type, $params_config ); + $value_html = $self->select_values( $name, $attr_type, $params_config ); $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 ); + $value_html = $self->select_values( $name, $attr_type, $attr->type_constraint->values ); } elsif ( $class->can( $name . '_available' ) ) { - my $available = eval $class . '->' . $name . '_available'; + my $available = $class->$name . '_available'; confess $@ if $@; $available =~ s/^\s+//gs; $available =~ s/\s+$//gs; - $value_html = select_values( $name, $attr_type, [ split(/\n/,$available) ]); + $value_html = $self->select_values( $name, $attr_type, [ split(/\n/,$available) ]); } elsif ( $attr_type =~ m{^Bool} ) { my $suffix = ''; $suffix = ' checked=1' if $value;