--- trunk/lib/Strix/View/User.pm 2008/07/08 12:22:16 63 +++ trunk/lib/Frey/Web/Row.pm 2008/07/13 16:17:34 111 @@ -1,35 +1,246 @@ -package Strix::View::User; +package Frey::Web::Row; -use metaclass 'Moose::Meta::Class' => ( - attribute_metaclass => 'Continuity::Meta::Attribute::FormField' -); +use Data::Dump qw/dump/; +use Carp qw/carp/; use Moose; -extends 'Continuity::Widget'; +extends 'Frey::Web::Button'; #with 'BonusTypes'; -use Data::Dump qw/dump/; +use Moose::Util::TypeConstraints; -use Strix::User; +enum 'Render_as' => qw( view edit none ); +has render_as => ( is => 'rw', isa => 'Render_as', required => 1, default => 'view' ); -my $m = Strix::User->meta; - -foreach ( $m->get_attribute_list ) { - warn ">> $_\n"; - my $attr = $m->get_attribute( $_ ); +has fey => ( + is => 'rw', + isa => 'Object', # FIXME Strix::User? +# required => 1, # XXX if we require it we can't have Add form +); - has $_ => ( - is => $attr->_is_metadata, - label => ucfirst($_), - required => $attr->is_required, - ); +has fey_class => ( + is => 'rw', + isa => 'Str', + required => 1, +); -} +enum 'Layouts' => qw( div table columns ); +has layout => ( + is => 'rw', + isa => 'Layouts', + default => 'div', + required => 1, +); -has foo => ( +has 'display_columns' => ( is => 'rw', - label => 'Foo', + 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 $out; +# 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); + 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; +} + +sub edit_delete_buttons { + my $self = shift; + + return unless $self->fey; + + $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; +} + +sub delete_button { + my $self = shift; + $self->add_button('Delete' => sub { + $self->fey->delete; + $self->next( qq|