--- trunk/lib/Strix/View/User.pm 2008/07/10 15:29:01 82 +++ trunk/lib/Strix/View/User.pm 2008/07/11 13:11:36 97 @@ -1,6 +1,7 @@ package Strix::View::User; use Data::Dump qw/dump/; +use Carp qw/carp/; use metaclass 'Moose::Meta::Class' => ( attribute_metaclass => 'Continuity::Meta::Attribute::FormField' @@ -8,29 +9,70 @@ use Moose; -extends 'Continuity::Widget'; +#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 _fey => ( + is => 'rw', + label => 'Fey object', + isa => 'Strix::User', +); + +enum 'Layouts' => qw( div table columns ); +has _layout => ( + is => 'rw', + isa => 'Layouts', + default => 'div', + required => 1, +); + +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 $field_name = $self->field_name($name); + $out .= $iterator->( $name, $field_name, $attr->label, $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); - $self->_fey->update( %$hash ); + 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 { - 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! + $self->next( qq|
Deleted id @{[$self->id]}!
|); + $self->_render_as( 'none' ); +# Strix::Schema->ClearObjectCaches(); # XXX important! }); - } sub main { @@ -47,7 +89,7 @@ $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' ); }); @@ -59,43 +101,12 @@ while(1) { my $out; - if ( $self->render_as eq 'edit' ) { - $out = $self->render_iterator( - qq|
|, - sub { - #warn "# edit render_iterator ",dump( @_ ); - my ( $name, $field_name, $label, $val ) = @_; - return if $name =~ /^_/; - return qq| -
-
$label
-
- -
-
- |; - }, - qq|
| - ); - } elsif ( $self->render_as eq 'view' ) { - $out = $self->render_iterator( - qq|
|, - sub { - #warn "# view render_iterator ",dump( @_ ); - my ( $name, $field_name, $label, $val ) = @_; - return if $name =~ /^_/; - return qq| -
-
$label
-
$val
-
-
- |; - }, - qq|| - ); + if ( $self->_render_as eq 'edit' ) { + $out .= $self->render_edit; + } 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 $@; @@ -106,6 +117,73 @@ } }; +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 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|
|; +} + use Data::Dump qw/dump/; use Strix::User; @@ -125,15 +203,4 @@ } -has _foo => ( - is => 'rw', - label => 'Foo', -); - -has _fey => ( - is => 'rw', - label => 'Fey object', - isa => 'Strix::User', -); - 1;