--- trunk/lib/Strix/View/User.pm 2008/07/11 12:47:50 96
+++ trunk/lib/Frey/Web/Row.pm 2008/07/13 16:17:34 111
@@ -1,30 +1,84 @@
-package Strix::View::User;
+package Frey::Web::Row;
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';
extends 'Frey::Web::Button';
#with 'BonusTypes';
-has _render_as => ( is => 'rw', isa => 'Str', required => 1, default => 'view' );
+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',
+ isa => 'Object', # FIXME Strix::User?
+# required => 1, # XXX if we require it we can't have Add form
+);
+
+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 '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;
+}
+
+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 %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 %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);
- $out .= $iterator->( $name, $field_name, $attr->label, $val ) || ''; # || '' to shut warnings
+ 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;
}
@@ -32,7 +86,7 @@
sub edit_delete_buttons {
my $self = shift;
- return unless $self->_fey;
+ return unless $self->fey;
$self->add_button( 'Edit' => sub {
$self->remove_button( 'Delete' );
@@ -41,7 +95,7 @@
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->fey->update( %$hash ) if $hash;
$self->rename_button( 'Save' => 'Edit' );
$self->delete_button;
});
@@ -51,29 +105,29 @@
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->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 ) {
+ 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 = Strix::User->insert( %$hash );
+ my $u = $self->fey_class->insert( %$hash );
warn "Inserted ",$u->id;
# XXX store object for later
- $self->_fey( $u );
+ $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' );
});
@@ -81,16 +135,16 @@
$self->edit_delete_buttons;
- warn "# ",$self->uuid, " [", $self->id ,"] _fey = ",dump( $self->_fey );
+ warn "# ",$self->uuid, " [", $self->id ,"] fey = ",dump( $self->fey );
while(1) {
my $out;
- if ( $self->_render_as eq 'edit' ) {
+ if ( $self->render_as eq 'edit' ) {
$out .= $self->render_edit;
- } elsif ( $self->_render_as eq 'view' ) {
+ } 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 $@;
@@ -103,11 +157,12 @@
sub render_edit {
my $self = shift;
- warn "# render_edit ",$self->id," ",$self->uuid, " ", $self->_layout, "\n";
+ 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 =~ /^_/;
+ $val ||= '';
return qq|
$label |
@@ -115,12 +170,12 @@
- | if $self->_layout eq 'table';
+ | if $self->layout eq 'table';
return qq|
|
- | if $self->_layout eq 'columns';
+ | if $self->layout eq 'columns';
return qq|
@@ -131,20 +186,21 @@
|;
});
- return qq|
$out| . $self->render_buttons . qq| |
| if $self->_layout eq 'columns';
+ 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";
+ 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';
+ $val ||= '';
+ return qq|
$label | $val |
| if $self->layout eq 'table';
+ return qq|
$val | | if $self->layout eq 'columns';
return qq|
$label
@@ -153,7 +209,7 @@
|;
});
- return qq|
$out| . $self->render_buttons . qq| |
| if $self->_layout eq 'columns';
+ return qq|
$out| . $self->render_buttons . qq| |
| if $self->layout eq 'columns';
$self->render_wrapper_class( $out, 'view' );
}
@@ -164,43 +220,27 @@
return '';
}
$out =~ s/^\t+//mg; # XXX compress output
- return $out . qq|
| . $self->render_buttons . qq| |
| if $self->_layout eq 'table';
+ return $out . qq|
| . $self->render_buttons . qq| |
| if $self->layout eq 'table';
return qq|
| . $out . $self->render_buttons . qq|
|;
}
-use Data::Dump qw/dump/;
+sub _build_display_columns {
+ my $self = shift;
-use Strix::User;
-my $m = Strix::User->meta;
+ my $m = $self->fey_class->meta;
-foreach ( $m->get_attribute_list ) {
- my $attr = $m->get_attribute( $_ );
- warn ">> $_\n";
+ my @cols;
- # FIXME primary key would have to be read-only!
+ 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, $_;
+ }
- has $_ => (
- is => $attr->_is_metadata,
- label => ucfirst($_),
- required => $attr->is_required,
- );
+ warn "## display_columns ",dump( @cols ) if $self->debug;
+ return \@cols;
}
-has _fey => (
- is => 'rw',
- label => 'Fey object',
- isa => 'Strix::User',
-);
-
-use Moose::Util::TypeConstraints;
-
-enum 'Layouts' => qw( div table columns );
-
-has _layout => (
- is => 'rw',
- isa => 'Layouts',
- default => 'div',
-);
-
1;