--- trunk/lib/Strix/View/User.pm 2008/07/11 13:11:36 97 +++ trunk/lib/Frey/Web/Row.pm 2008/07/11 17:53:08 98 @@ -1,47 +1,79 @@ -package Strix::View::User; +package Frey::Web::Row; use Data::Dump qw/dump/; use Carp qw/carp/; -use metaclass 'Moose::Meta::Class' => ( - attribute_metaclass => 'Continuity::Meta::Attribute::FormField' -); - use Moose; -#extends 'Continuity::Widget'; extends 'Frey::Web::Button'; #with 'BonusTypes'; use Moose::Util::TypeConstraints; enum 'Render_as' => qw( view edit none ); -has _render_as => ( is => 'rw', isa => 'Render_as', required => 1, default => 'view' ); +has render_as => ( is => 'rw', isa => 'Render_as', required => 1, default => 'view' ); -has _fey => ( +has fey => ( is => 'rw', label => 'Fey object', - isa => 'Strix::User', + isa => 'Object', # FIXME Strix::User? +# required => 1, # XXX if we require it we can't have Add form ); enum 'Layouts' => qw( div table columns ); -has _layout => ( +has layout => ( is => 'rw', isa => 'Layouts', default => 'div', required => 1, ); +has 'display_columns' => ( + is => 'rw', + isa => 'ArrayRef[Str]', + lazy_build => 1, +); + +sub id { + my $self = shift; + carp "LEGACY: called ->id"; + $self->fey->id if $self->fey; +} + +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 render_iterator { confess "BACKWARD INCOMATIBLE CHANGE: render_iterator works ONLY with 2 params!" unless $#_ == 1; my ($self, $iterator) = @_; - my %attrmap = %{ $self->meta->get_attribute_map }; my $out; - while( my ($name, $attr) = each %attrmap ) { - my $reader = $attr->get_read_method; - my $val = $self->$reader || ''; +# my %attrmap = %{ $self->meta->get_attribute_map }; +# while( my ($name, $attr) = each %attrmap ) { +# my $reader = $attr->get_read_method; +# my $val = $self->$reader || ''; + foreach my $name ( @{ $self->display_columns } ) { my $field_name = $self->field_name($name); - $out .= $iterator->( $name, $field_name, $attr->label, $val ) || ''; # || '' to shut warnings + my $val; + $val = $self->fey->$name if $self->fey && $self->fey->can($name); + $out .= $iterator->( $name, $field_name, ucfirst($name), $val ) || ''; # || '' to shut warnings } return $out; } @@ -49,7 +81,7 @@ sub edit_delete_buttons { my $self = shift; - return unless $self->_fey; + return unless $self->fey; $self->add_button( 'Edit' => sub { $self->remove_button( 'Delete' ); @@ -58,7 +90,7 @@ 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->fey->update( %$hash ) if $hash; $self->rename_button( 'Save' => 'Edit' ); $self->delete_button; }); @@ -68,9 +100,9 @@ sub delete_button { my $self = shift; $self->add_button('Delete' => sub { - $self->_fey->delete; + $self->fey->delete; $self->next( qq|
Deleted id @{[$self->id]}!
|); - $self->_render_as( 'none' ); + $self->render_as( 'none' ); # Strix::Schema->ClearObjectCaches(); # XXX important! }); } @@ -78,18 +110,19 @@ sub main { my ( $self ) = @_; - if ( ! $self->_fey ) { + if ( ! $self->fey ) { $self->add_button( 'Add' => sub { my $f = shift; my $hash = $self->set_from_hash($f); + warn "## Add hash ", $self->uuid, " => ",dump( $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 ); + $self->fey( $u ); # put ID in widget, so that it know it's not new $self->id( $u->id ); - $self->_render_as( 'view' ); + $self->render_as( 'view' ); $self->edit_delete_buttons; $self->remove_button( 'Add' ); }); @@ -97,16 +130,16 @@ $self->edit_delete_buttons; - warn "# ",$self->uuid, " [", $self->id ,"] _fey = ",dump( $self->_fey ); + warn "# ",$self->uuid, " [", $self->id ,"] fey = ",dump( $self->fey ); while(1) { my $out; - if ( $self->_render_as eq 'edit' ) { + if ( $self->render_as eq 'edit' ) { $out .= $self->render_edit; - } elsif ( $self->_render_as eq 'view' ) { + } elsif ( $self->render_as eq 'view' ) { $out .= $self->render_view; } else { - warn "no renderer ",dump( $self->_render_as ), " skipping..."; + warn "no renderer ",dump( $self->render_as ), " skipping..."; } warn $@ if $@; @@ -119,7 +152,7 @@ sub render_edit { my $self = shift; - warn "# render_edit ",$self->id," ",$self->uuid, " ", $self->_layout, "\n"; + 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 ) = @_; @@ -131,12 +164,12 @@ - | if $self->_layout eq 'table'; + | if $self->layout eq 'table'; return qq| - | if $self->_layout eq 'columns'; + | if $self->layout eq 'columns'; return qq|
@@ -147,20 +180,20 @@ |; }); - return qq|$out| . $self->render_buttons . qq|| if $self->_layout eq 'columns'; + return qq|$out| . $self->render_buttons . 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"; + 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|$label$val| if $self->layout eq 'table'; + return qq|$val| if $self->layout eq 'columns'; return qq|
$label
@@ -169,7 +202,7 @@
|; }); - return qq|$out| . $self->render_buttons . qq|| if $self->_layout eq 'columns'; + return qq|$out| . $self->render_buttons . qq|| if $self->layout eq 'columns'; $self->render_wrapper_class( $out, 'view' ); } @@ -180,27 +213,29 @@ return ''; } $out =~ s/^\t+//mg; # XXX compress output - return $out . qq|| . $self->render_buttons . qq|| if $self->_layout eq 'table'; + return $out . qq|| . $self->render_buttons . qq|| if $self->layout eq 'table'; return qq|
| . $out . $self->render_buttons . qq|
|; } -use Data::Dump qw/dump/; - use Strix::User; -my $m = Strix::User->meta; -foreach ( $m->get_attribute_list ) { - my $attr = $m->get_attribute( $_ ); - warn ">> $_\n"; - - # FIXME primary key would have to be read-only! - - has $_ => ( - is => $attr->_is_metadata, - label => ucfirst($_), - required => $attr->is_required, - ); +sub _build_display_columns { + my $self = shift; + + my $m = Strix::User->meta; + + my @cols; + + foreach ( $m->get_attribute_list ) { + my $attr = $m->get_attribute( $_ ); + warn ">> $_\n"; + # FIXME primary key would have to be read-only! + push @cols, $_; + } + + warn "## display_columns ",dump( @cols ); + return \@cols; } 1;