--- trunk/lib/Frey/Action.pm 2008/11/19 01:56:12 440
+++ trunk/lib/Frey/Action.pm 2008/12/06 00:57:49 734
@@ -36,9 +36,12 @@
sub required {
my ( $self ) = @_;
$self->load_class( $self->class );
+
my @required =
grep {
- defined $_ && $_->can('name') && !defined( $self->params->{ $_->name } )
+ defined $_ && $_->can('name') &&
+ ! defined( $self->params->{ $_->name } ) &&
+ ! $_->is_lazy
}
map {
my $attr = $self->class->meta->get_attribute($_);
@@ -95,63 +98,152 @@
my $default = clone $self->params; # XXX we really don't want to modify params!
- my $config_params = {};
- $config_params = $self->config($class);
- warn "# $class config = ",dump( $config_params ) if $self->debug;
+ my $params_config = {};
+ $params_config = $self->config($class);
+ warn "# $class config = ",dump( $params_config ) if $self->debug;
my $form;
- foreach my $name ( grep { ! $class->meta->get_attribute($_)->is_lazy } $self->attributes ) {
+ sub select_values {
+ my ( $name, $attr_type, $values ) = @_;
+
+ if ( $#$values > 3 ) {
+ my $options = join("\n",
+ map {
+ my $v = ref($_) eq 'HASH' ? $_->{$name} : $_;
+ qq|| if $v;
+ } @$values
+ );
+ qq|| if $options;
+ } else {
+ my $radio = join("\n",
+ map {
+ my $v = ref($_) eq 'HASH' ? $_->{$name} : $_;
+ qq|$v|;
+ } @$values
+ );
+ qq|
$radio
|;
+ }
+ }
+
+ 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 $skip_prefix;
+ if ( $self->class->can('action') ) {
+ my $action = eval $self->class . '->action';
+ $skip_prefix->{$_}++ foreach eval $self->class .'->action_order';
+ warn "# skip_prefix = ", $self->dump( $skip_prefix );
+ }
+
+ my $label_width = 1; # minimum
+
+ foreach my $name (
+ grep {
+ ! $class->meta->get_attribute($_)->is_lazy
+ && ! defined $default->{$_}
+ && ! m{^_} # skip _private
+ } $self->attributes
+ ) {
my $attr_type = '';
my $type = $name =~ m/^pass/ ? 'password' : 'text';
my $label = $name;
- my $value = '';
my $label_title = '';
my $value_html = '';
- if ( ref($config_params) eq 'HASH' ) {
- $value = $config_params->{$name};
- } elsif ( ref($config_params) eq 'ARRAY' ) {
- $value_html = qq||;
- $default->{$name} = $config_params->[0]->{$name};
- } elsif ( my $attr = $class->meta->get_attribute( $name ) ) {
- if ( $attr->has_type_constraint ) {
- $attr_type = $attr->type_constraint->name;
- if ( $attr->type_constraint->can('values') ) {
- $value_html = qq||;
- } elsif ( $attr_type !~ m{^(Str|Int)$} ) {
- $value_html = qq||;
- }
- }
- $value = $attr->default( $name ) if ! $value && $attr->has_default;
- $label_title = qq| title="| . $attr->documentation . qq|"| if $attr->has_documentation;
- } else {
- warn "wired attribute $name";
+
+ my $attr = $class->meta->get_attribute( $name );
+ $attr_type = $attr->type_constraint->name if $attr->has_type_constraint;
+
+ my $value =
+ defined $default->{$name} ? $default->{$name} :
+ $attr->has_default ? $attr->default( $name ) :
+ '';
+
+ if ( ref($params_config) eq 'HASH' ) {
+ $value = $params_config->{$name};
+ } elsif ( ref($params_config) eq 'ARRAY' ) {
+ $value_html = 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 );
+ } elsif ( $attr_type =~ m{^Bool} ) {
+ my $suffix = '';
+ $suffix = ' checked' if $value;
+ $value_html = qq||;
+ push @checkboxes, $name;
+ } elsif ( ! defined $value ) {
+ $value_html = qq|undef|; # FIXME if $self->debug
+ } elsif ( $attr_type !~ m{^(Str|Int)$} || $value =~ $Frey::Web::re_html ) {
+ $value_html = qq||;
}
- $value_html = qq|| unless $value_html;
+ $label_title = qq| title="| . $attr->documentation . qq|"| if $attr->has_documentation;
$default->{$name} = $value unless defined $default->{$name};
+ $value_html = qq|| unless $value_html;
+
# warn "# required $name ", $class->meta->get_attribute( $name )->dump( 2 );
- $form .= qq|| . $value_html;
+ $form .= qq|$value_html
|;
+ my $ll = length($label);
+ $label_width = $ll if $ll > $label_width;
}
- my $html = qq|$class params
|;
- push @{ $self->status }, { 'Params' =>
- {
- 'Config' => $config_params,
- 'Default' => $default
+ $form .= qq|| if @checkboxes;
+
+ $self->add_css(qq|
+ label,input {
+ display: block;
+ float: left;
+ margin-bottom: 10px;
+ }
+
+ label {
+ text-align: right;
+ width: ${label_width}ex;
+ padding-right: 20px;
+ }
+
+ br {
+ clear: left;
+ }
+ |);
+
+ my $html;
+
+ # http://www.quirksmode.org/oddsandends/forms.html
+# $form =~ s{<([^>]+)(name=")([^"]+)(")([^>]*)>}{<$1$2$3$4 id="$3" $5}gs;
+
+ $html = qq|
+ $class params
+
+ | if $form;
+
+ $self->add_status({
+ $self->class => {
+ params => $self->params,
+ params_config => $params_config,
+ default => $default,
},
- };
+ });
return ($html,$default) if wantarray;
return $html;
}
+=head1 SEE ALSO
+
+L for info on CSS2 forms
+
+=cut
+
1;