--- trunk/lib/Frey/Web/Row.pm 2008/07/11 22:54:42 101 +++ trunk/lib/Frey/Web/Item.pm 2008/07/16 23:21:19 153 @@ -1,11 +1,13 @@ -package Frey::Web::Row; +package Frey::Web::Item; use Data::Dump qw/dump/; use Carp qw/carp/; use Moose; - -extends 'Frey::Web::Button'; +extends 'Frey'; +with 'Frey::Web::Field'; +with 'Frey::Web::Layout'; +with 'Frey::Storage'; #with 'BonusTypes'; use Moose::Util::TypeConstraints; @@ -25,25 +27,21 @@ required => 1, ); -enum 'Layouts' => qw( div table columns ); -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; -} +has 'labels' => ( + is => 'rw', + isa => 'HashRef[Str]', + default => sub { + my $self = shift; + $self->load( 'var/design/' . $self->fey_class . '-labels' ) || {} + }, +); + sub set_from_hash { my ($self, $f) = @_; @@ -66,76 +64,10 @@ 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|
Deleted id @{[$self->id]}!
|); - $self->render_as( 'none' ); -# Strix::Schema->ClearObjectCaches(); # XXX important! - }); -} - sub main { my ( $self ) = @_; - 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 = $self->fey_class->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 "# item ",$self->uuid, " fey = ",dump( $self->fey ) if $self->debug; while(1) { my $out; @@ -151,75 +83,23 @@ warn ">>> ",length($out),"\n"; my $f = $self->next($out); $self->set_from_hash($f); - $self->exec_buttons($f); + $self->exec_callbacks($f) if $self->can('exec_callbacks'); } }; -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| - - $label - - - - - | if $self->layout eq 'table'; - return qq| - - - - | if $self->layout eq 'columns'; - return qq| -
- -
- -
-
- |; - }); - - return qq|$out| . $self->render_buttons . qq|| if $self->layout eq 'columns'; - - $self->render_wrapper_class( $out, 'editform' ); +sub field_value { + my ( $self, $name ) = @_; + my $val = ''; + $val = $self->fey->$name if $self->fey && $self->fey->can($name); + return $val; } -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| -
-
$label
-
$val
-
- - |; - }); - return qq|$out| . $self->render_buttons . qq|| if $self->layout eq 'columns'; - $self->render_wrapper_class( $out, 'view' ); -} - -sub render_wrapper_class { - my ( $self, $out, $class ) = @_; - if ( length($out) == 0 ) { - carp "no output, skipping"; - 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|
|; +sub field_label { + my ( $self, $name ) = @_; + my $new_labels = $self->reload( 'var/design/' . $self->fey_class . '-labels' ); + $self->labels( $new_labels ) if $new_labels; + my $label = $self->labels->{$name} || ucfirst($name); + return $label; } sub _build_display_columns { @@ -231,12 +111,12 @@ foreach ( $m->get_attribute_list ) { my $attr = $m->get_attribute( $_ ); - warn ">> $_\n"; + warn "_build_display_columns $_\n" if $self->debug; # FIXME primary key would have to be read-only! push @cols, $_; } - warn "## display_columns ",dump( @cols ); + warn "## display_columns ",dump( @cols ) if $self->debug; return \@cols; }