--- trunk/lib/Strix/View/User.pm 2008/07/11 10:29:31 95 +++ trunk/lib/Frey/Web/Item.pm 2008/07/15 17:14:10 135 @@ -1,70 +1,68 @@ -package Strix::View::User; +package Frey::Web::Item; use Data::Dump qw/dump/; use Carp qw/carp/; -use metaclass 'Moose::Meta::Class' => ( - attribute_metaclass => 'Continuity::Meta::Attribute::FormField' -); +use Moose::Role; +with 'Frey::Web::Field'; +#with 'BonusTypes'; -use Moose; +use Moose::Util::TypeConstraints; -extends 'Continuity::Widget'; -#with 'BonusTypes'; +enum 'Render_as' => qw( view edit none ); +has render_as => ( is => 'rw', isa => 'Render_as', required => 1, default => 'view' ); -sub edit_delete_buttons { - my $self = shift; +has fey => ( + is => 'rw', + isa => 'Object', # FIXME Strix::User? +# required => 1, # XXX if we require it we can't have Add form +); - return unless $self->_fey; +has fey_class => ( + is => 'rw', + isa => 'Str', + required => 1, +); - $self->add_button( 'Edit' => sub { - $self->remove_button( 'Delete' ); - $self->rename_button( 'Edit' => 'Save' ); - my $out = $self->render_edit; - my $f = $self->next($out); - my $hash = $self->set_from_hash($f); - #warn "# Edit/Save hash = ",dump( $hash ); - $self->_fey->update( %$hash ) if $hash; - $self->rename_button( 'Save' => 'Edit' ); - $self->delete_button; - }); - $self->delete_button; -} +enum 'Layouts' => qw( div table columns ); +has layout => ( + is => 'rw', + isa => 'Layouts', + default => 'div', + required => 1, +); -sub delete_button { - my $self = shift; - $self->add_button('Delete' => sub { - print STDERR "delete ID @{[$self->id]}!\n"; - $self->_fey->delete; - $self->next("Deleted id @{[$self->id]}!"); - $self->render_as( 'deleted' ); - Strix::Schema->ClearObjectCaches(); # XXX important! - }); +has 'display_columns' => ( + is => 'rw', + isa => 'ArrayRef[Str]', + lazy_build => 1, +); + +sub set_from_hash { + my ($self, $f) = @_; + my $attrmap = $self->fey->meta->get_attribute_map if $self->fey; + my $hash; + foreach my $name ( @{ $self->display_columns } ) { + my $field_name = $self->field_name($name); + if(defined $f->{$field_name}) { + $hash->{ $name } = $f->{$field_name}; + + if ( defined $attrmap->{$name} ) { + my $writer = $attrmap->{$name}->get_write_method; + $self->fey->$writer($f->{$field_name}); + } else { + warn "can't store value back into fey->$name"; + } + } + } + warn "# set_from_hash ", $self->uuid," produced hash = ",dump( $hash ) if $hash; + return $hash; } sub main { my ( $self ) = @_; - if ( ! $self->_fey ) { - $self->add_button( 'Add' => sub { - my $f = shift; - my $hash = $self->set_from_hash($f); - delete( $hash->{id} ); # FIXME clear primary key - my $u = Strix::User->insert( %$hash ); - warn "Inserted ",$u->id; - # XXX store object for later - $self->_fey( $u ); - # put ID in widget, so that it know it's not new - $self->id( $u->id ); - $self->render_as( 'view' ); - $self->edit_delete_buttons; - $self->remove_button( 'Add' ); - }); - } - - $self->edit_delete_buttons; - - warn "# ",$self->uuid, " [", $self->id ,"] _fey = ",dump( $self->_fey ); + warn "# ",$self->uuid, " fey = ",dump( $self->fey ); while(1) { my $out; @@ -80,63 +78,92 @@ warn ">>> ",length($out),"\n"; my $f = $self->next($out); $self->set_from_hash($f); - $self->exec_buttons($f); + $self->exec_callbacks($f); } }; +sub field_value { + my ( $self, $name ) = @_; + my $val = ''; + $val = $self->fey->$name if $self->fey && $self->fey->can($name); + return $val; +} + +sub field_label { + my ( $self, $name ) = @_; + my $label = ucfirst($name); + return $label; +} + sub render_edit { my $self = shift; - warn "# render_edit ",$self->id," ",$self->uuid, " ", $self->_layout, "\n"; - my $out = $self->render_iterator( sub { - #warn "# edit render_iterator ",dump( @_ ); - my ( $name, $field_name, $label, $val ) = @_; - return if $name =~ /^_/; - return qq| + warn "# render_edit ",$self->uuid, " ", $self->layout, "\n"; + my $out; + foreach my $name ( @{ $self->display_columns } ) { + next if $name =~ /^_/; + + my $field_name = $self->field_name( $name ); + my $label = $self->field_label( $name ); + my $val = $self->field_value( $name ); + + if ( $self->layout eq 'table' ) { + $out .= qq| $label - | if $self->_layout eq 'table'; - return qq| + |; + } elsif ( $self->layout eq 'columns' ) { + $out .= qq| - | if $self->_layout eq 'columns'; - return qq| + |; + } else { + $out .= qq|
- |; - }); + |; + } + }; - return qq|$out| . $self->render_buttons . qq|| if $self->_layout eq 'columns'; + return qq|$out| . $self->render_callbacks . qq|| if $self->layout eq 'columns'; $self->render_wrapper_class( $out, 'editform' ); } sub render_view { my $self = shift; - warn "# render_view ",$self->id," ",$self->uuid," ", $self->_layout,"\n"; - my $out = $self->render_iterator( sub { - #warn "# view render_iterator ",dump( @_ ); - my ( $name, $field_name, $label, $val ) = @_; - return if $name =~ /^_/; - return qq|$label$val| if $self->_layout eq 'table'; - return qq|$val| if $self->_layout eq 'columns'; - return qq| + warn "# render_view ",$self->uuid," ", $self->layout,"\n"; + my $out; + foreach my $name ( @{ $self->display_columns } ) { + next if $name =~ /^_/; + + my $field_name = $self->field_name( $name ); + my $label = $self->field_label( $name ); + my $val = $self->field_value( $name ); + + if ( $self->layout eq 'table' ) { + $out .= qq|$label$val|; + } elsif ( $self->layout eq 'columns' ) { + $out .= qq|$val|; + } else { + $out .= qq|
$label
$val
- |; - }); - return qq|$out| . $self->render_buttons . qq|| if $self->_layout eq 'columns'; + |; + } + }; + return qq|$out| . $self->render_callbacks . qq|| if $self->layout eq 'columns'; $self->render_wrapper_class( $out, 'view' ); } @@ -147,43 +174,27 @@ return ''; } $out =~ s/^\t+//mg; # XXX compress output - return $out . qq|| . $self->render_buttons . qq|| if $self->_layout eq 'table'; - return qq|
| . $out . $self->render_buttons . qq|
|; + return $out . qq|| . $self->render_callbacks . qq|| if $self->layout eq 'table'; + return qq|
| . $out . $self->render_callbacks . qq|
|; } -use Data::Dump qw/dump/; +sub _build_display_columns { + my $self = shift; -use Strix::User; -my $m = Strix::User->meta; + my $m = $self->fey_class->meta; -foreach ( $m->get_attribute_list ) { - my $attr = $m->get_attribute( $_ ); - warn ">> $_\n"; + my @cols; - # FIXME primary key would have to be read-only! + foreach ( $m->get_attribute_list ) { + my $attr = $m->get_attribute( $_ ); + warn "_build_display_columns $_\n" if $self->debug; + # FIXME primary key would have to be read-only! + push @cols, $_; + } - has $_ => ( - is => $attr->_is_metadata, - label => ucfirst($_), - required => $attr->is_required, - ); + warn "## display_columns ",dump( @cols ) if $self->debug; + return \@cols; } -has _fey => ( - is => 'rw', - label => 'Fey object', - isa => 'Strix::User', -); - -use Moose::Util::TypeConstraints; - -enum 'Layouts' => qw( div table columns ); - -has _layout => ( - is => 'rw', - isa => 'Layouts', - default => 'div', -); - 1;