--- trunk/lib/Strix/View/User.pm 2008/07/10 10:33:04 79
+++ trunk/lib/Frey/Web/Item.pm 2008/07/15 17:14:10 135
@@ -1,139 +1,200 @@
-package Strix::View::User;
+package Frey::Web::Item;
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';
+use Moose::Role;
+with 'Frey::Web::Field';
#with 'BonusTypes';
-sub main {
- my ( $self ) = @_;
+use Moose::Util::TypeConstraints;
- if ( ! $self->_fey ) {
- $self->add_button( 'Add' => sub {
- warn "## Add button callback ",dump( @_ );
- my $f = shift;
-# my $out = $self->render_edit;
-# my $f = $self->next($out);
- warn "## my uuid ",$self->uuid;
- $self->set_from_hash($f, sub {
- warn "## inside set_from_hash ",dump( @_ );
- my $hash = shift || die "no hash?";
- delete( $hash->{id} ); # FIXME clear primary key
-# $hash->{id} = undef;
- my $u = Strix::User->insert( %$hash );
- warn "Inserted ",$u->id;
- $self->_fey( $u );
- $self->render_as( 'view' );
- });
- });
- }
+enum 'Render_as' => qw( view edit none );
+has render_as => ( is => 'rw', isa => 'Render_as', required => 1, default => 'view' );
- warn "# _fey = ",dump( $self->_fey );
+has fey => (
+ is => 'rw',
+ isa => 'Object', # FIXME Strix::User?
+# required => 1, # XXX if we require it we can't have Add form
+);
- if ( $self->_fey ) {
+has fey_class => (
+ is => 'rw',
+ isa => 'Str',
+ required => 1,
+);
- $self->add_button( 'Edit' => sub {
- my $out = $self->render_edit;
- my $f = $self->next($out);
- $self->set_from_hash($f, sub {
- warn "## inside set_from_hash ",dump( @_ );
- my $hash = shift || die "no hash?";
- $self->_fey->update( %$hash );
- });
- });
-
- $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!
- });
+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 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 main {
+ my ( $self ) = @_;
+
+ warn "# ",$self->uuid, " fey = ",dump( $self->fey );
while(1) {
my $out;
if ( $self->render_as eq 'edit' ) {
- $out = $self->render_iterator(
- qq|
|
- );
+ $out .= $self->render_edit;
} 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||
- );
+ $out .= $self->render_view;
} else {
warn "no renderer ",dump( $self->render_as ), " skipping...";
}
warn $@ if $@;
+ warn ">>> ",length($out),"\n";
my $f = $self->next($out);
$self->set_from_hash($f);
- $self->exec_buttons($f);
+ $self->exec_callbacks($f);
}
};
-use Data::Dump qw/dump/;
+sub field_value {
+ my ( $self, $name ) = @_;
+ my $val = '';
+ $val = $self->fey->$name if $self->fey && $self->fey->can($name);
+ return $val;
+}
-use Strix::User;
-my $m = Strix::User->meta;
+sub field_label {
+ my ( $self, $name ) = @_;
+ my $label = ucfirst($name);
+ return $label;
+}
-foreach ( $m->get_attribute_list ) {
- my $attr = $m->get_attribute( $_ );
- warn ">> $_\n";
+sub render_edit {
+ my $self = shift;
+ warn "# render_edit ",$self->uuid, " ", $self->layout, "\n";
+ my $out;
+ foreach my $name ( @{ $self->display_columns } ) {
+ next if $name =~ /^_/;
+
+ my $field_name = $self->field_name( $name );
+ my $label = $self->field_label( $name );
+ my $val = $self->field_value( $name );
+
+ if ( $self->layout eq 'table' ) {
+ $out .= qq|
+
+ $label |
+
+
+ |
+
+ |;
+ } elsif ( $self->layout eq 'columns' ) {
+ $out .= qq|
+
+
+ |
+ |;
+ } else {
+ $out .= qq|
+
+ |;
+ }
+ };
- # FIXME primary key would have to be read-only!
+ return qq|$out| . $self->render_callbacks . qq| |
| if $self->layout eq 'columns';
- has $_ => (
- is => $attr->_is_metadata,
- label => ucfirst($_),
- required => $attr->is_required,
- );
+ $self->render_wrapper_class( $out, 'editform' );
+}
+sub render_view {
+ my $self = shift;
+ warn "# render_view ",$self->uuid," ", $self->layout,"\n";
+ my $out;
+ foreach my $name ( @{ $self->display_columns } ) {
+ next if $name =~ /^_/;
+
+ my $field_name = $self->field_name( $name );
+ my $label = $self->field_label( $name );
+ my $val = $self->field_value( $name );
+
+ if ( $self->layout eq 'table' ) {
+ $out .= qq|$label | $val |
|;
+ } elsif ( $self->layout eq 'columns' ) {
+ $out .= qq|$val | |;
+ } else {
+ $out .= qq|
+
+
+ |;
+ }
+ };
+ return qq|$out| . $self->render_callbacks . qq| |
| if $self->layout eq 'columns';
+ $self->render_wrapper_class( $out, 'view' );
}
-has _foo => (
- is => 'rw',
- label => 'Foo',
-);
+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_callbacks . qq| |
| if $self->layout eq 'table';
+ return qq|| . $out . $self->render_callbacks . qq|
|;
+}
-has _fey => (
- is => 'rw',
- label => 'Fey object',
- isa => 'Strix::User',
-);
+sub _build_display_columns {
+ my $self = shift;
+
+ my $m = $self->fey_class->meta;
+
+ my @cols;
+
+ foreach ( $m->get_attribute_list ) {
+ my $attr = $m->get_attribute( $_ );
+ warn "_build_display_columns $_\n" if $self->debug;
+ # FIXME primary key would have to be read-only!
+ push @cols, $_;
+ }
+
+ warn "## display_columns ",dump( @cols ) if $self->debug;
+
+ return \@cols;
+}
1;