--- 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||
- );
- } 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|
-
-
- |;
- },
- 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|
+
+
+ |;
+ });
+ 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;