--- trunk/lib/Frey/Web/Row.pm 2008/07/11 22:54:42 101
+++ trunk/lib/Frey/Web/Item.pm 2008/07/16 23:21:19 153
@@ -1,11 +1,13 @@
-package Frey::Web::Row;
+package Frey::Web::Item;
use Data::Dump qw/dump/;
use Carp qw/carp/;
use Moose;
-
-extends 'Frey::Web::Button';
+extends 'Frey';
+with 'Frey::Web::Field';
+with 'Frey::Web::Layout';
+with 'Frey::Storage';
#with 'BonusTypes';
use Moose::Util::TypeConstraints;
@@ -25,25 +27,21 @@
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;
-}
+has 'labels' => (
+ is => 'rw',
+ isa => 'HashRef[Str]',
+ default => sub {
+ my $self = shift;
+ $self->load( 'var/design/' . $self->fey_class . '-labels' ) || {}
+ },
+);
+
sub set_from_hash {
my ($self, $f) = @_;
@@ -66,76 +64,10 @@
return $hash;
}
-sub render_iterator {
- confess "BACKWARD INCOMATIBLE CHANGE: render_iterator works ONLY with 2 params!" unless $#_ == 1;
- my ($self, $iterator) = @_;
- my $out;
-# 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);
- 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;
-}
-
-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);
- 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 {
- $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 ) {
- $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 = $self->fey_class->insert( %$hash );
- warn "Inserted ",$u->id;
- # XXX store object for later
- $self->fey( $u );
- # put ID in widget, so that it know it's not new
- $self->id( $u->id );
- $self->render_as( 'view' );
- $self->edit_delete_buttons;
- $self->remove_button( 'Add' );
- });
- }
-
- $self->edit_delete_buttons;
-
- warn "# ",$self->uuid, " [", $self->id ,"] fey = ",dump( $self->fey );
+ warn "# item ",$self->uuid, " fey = ",dump( $self->fey ) if $self->debug;
while(1) {
my $out;
@@ -151,75 +83,23 @@
warn ">>> ",length($out),"\n";
my $f = $self->next($out);
$self->set_from_hash($f);
- $self->exec_buttons($f);
+ $self->exec_callbacks($f) if $self->can('exec_callbacks');
}
};
-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 field_value {
+ my ( $self, $name ) = @_;
+ my $val = '';
+ $val = $self->fey->$name if $self->fey && $self->fey->can($name);
+ return $val;
}
-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|
|;
+sub field_label {
+ my ( $self, $name ) = @_;
+ my $new_labels = $self->reload( 'var/design/' . $self->fey_class . '-labels' );
+ $self->labels( $new_labels ) if $new_labels;
+ my $label = $self->labels->{$name} || ucfirst($name);
+ return $label;
}
sub _build_display_columns {
@@ -231,12 +111,12 @@
foreach ( $m->get_attribute_list ) {
my $attr = $m->get_attribute( $_ );
- warn ">> $_\n";
+ warn "_build_display_columns $_\n" if $self->debug;
# FIXME primary key would have to be read-only!
push @cols, $_;
}
- warn "## display_columns ",dump( @cols );
+ warn "## display_columns ",dump( @cols ) if $self->debug;
return \@cols;
}