--- trunk/lib/Strix/View/User.pm 2008/07/11 13:11:36 97
+++ trunk/lib/Frey/Web/Row.pm 2008/07/11 17:53:08 98
@@ -1,47 +1,79 @@
-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';
use Moose::Util::TypeConstraints;
enum 'Render_as' => qw( view edit none );
-has _render_as => ( is => 'rw', isa => 'Render_as', required => 1, default => 'view' );
+has render_as => ( is => 'rw', isa => 'Render_as', required => 1, default => 'view' );
-has _fey => (
+has fey => (
is => 'rw',
label => 'Fey object',
- isa => 'Strix::User',
+ isa => 'Object', # FIXME Strix::User?
+# required => 1, # XXX if we require it we can't have Add form
);
enum 'Layouts' => qw( div table columns );
-has _layout => (
+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;
}
@@ -49,7 +81,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' );
@@ -58,7 +90,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;
});
@@ -68,9 +100,9 @@
sub delete_button {
my $self = shift;
$self->add_button('Delete' => sub {
- $self->_fey->delete;
+ $self->fey->delete;
$self->next( qq|
Deleted id @{[$self->id]}!
|);
- $self->_render_as( 'none' );
+ $self->render_as( 'none' );
# Strix::Schema->ClearObjectCaches(); # XXX important!
});
}
@@ -78,18 +110,19 @@
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 );
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' );
});
@@ -97,16 +130,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 $@;
@@ -119,7 +152,7 @@
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 ) = @_;
@@ -131,12 +164,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|
@@ -147,20 +180,20 @@
|;
});
- 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';
+ return qq|
$label | $val |
| if $self->layout eq 'table';
+ return qq|
$val | | if $self->layout eq 'columns';
return qq|
$label
@@ -169,7 +202,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' );
}
@@ -180,27 +213,29 @@
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/;
-
use Strix::User;
-my $m = Strix::User->meta;
-foreach ( $m->get_attribute_list ) {
- my $attr = $m->get_attribute( $_ );
- warn ">> $_\n";
-
- # FIXME primary key would have to be read-only!
-
- has $_ => (
- is => $attr->_is_metadata,
- label => ucfirst($_),
- required => $attr->is_required,
- );
+sub _build_display_columns {
+ my $self = shift;
+
+ my $m = Strix::User->meta;
+
+ my @cols;
+
+ foreach ( $m->get_attribute_list ) {
+ my $attr = $m->get_attribute( $_ );
+ warn ">> $_\n";
+ # FIXME primary key would have to be read-only!
+ push @cols, $_;
+ }
+
+ warn "## display_columns ",dump( @cols );
+ return \@cols;
}
1;