/[Frey]/trunk/lib/Frey/Web/Item.pm
This is repository of my old source code which isn't updated any more. Go to git.rot13.org for current projects!
ViewVC logotype

Annotation of /trunk/lib/Frey/Web/Item.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 89 - (hide annotations)
Thu Jul 10 20:00:54 2008 UTC (15 years, 9 months ago) by dpavlin
Original Path: trunk/lib/Strix/View/User.pm
File size: 3875 byte(s)
implemented div and table layout [0.07]
1 dpavlin 63 package Strix::View::User;
2    
3 dpavlin 71 use Data::Dump qw/dump/;
4 dpavlin 89 use Carp qw/carp/;
5 dpavlin 71
6 dpavlin 63 use metaclass 'Moose::Meta::Class' => (
7     attribute_metaclass => 'Continuity::Meta::Attribute::FormField'
8     );
9    
10     use Moose;
11    
12     extends 'Continuity::Widget';
13     #with 'BonusTypes';
14    
15 dpavlin 82 sub edit_delete_buttons {
16     my $self = shift;
17    
18     return unless $self->_fey;
19    
20     $self->add_button( 'Edit' => sub {
21     my $out = $self->render_edit;
22     my $f = $self->next($out);
23     my $hash = $self->set_from_hash($f);
24     $self->_fey->update( %$hash );
25     });
26    
27     $self->add_button('Delete' => sub {
28     print STDERR "delete ID @{[$self->id]}!\n";
29     $self->_fey->delete;
30     $self->next("Deleted id @{[$self->id]}!");
31     $self->render_as( 'deleted' );
32     Strix::Schema->ClearObjectCaches(); # XXX important!
33     });
34    
35     }
36    
37 dpavlin 74 sub main {
38     my ( $self ) = @_;
39    
40     if ( ! $self->_fey ) {
41     $self->add_button( 'Add' => sub {
42     my $f = shift;
43 dpavlin 82 my $hash = $self->set_from_hash($f);
44     delete( $hash->{id} ); # FIXME clear primary key
45     my $u = Strix::User->insert( %$hash );
46     warn "Inserted ",$u->id;
47     # XXX store object for later
48     $self->_fey( $u );
49     # put ID in widget, so that it know it's not new
50     $self->id( $u->id );
51     $self->render_as( 'view' );
52     $self->edit_delete_buttons;
53     $self->remove_button( 'Add' );
54 dpavlin 74 });
55 dpavlin 79 }
56 dpavlin 74
57 dpavlin 82 $self->edit_delete_buttons;
58 dpavlin 79
59 dpavlin 82 warn "# ",$self->uuid, " [", $self->id ,"] _fey = ",dump( $self->_fey );
60 dpavlin 79
61 dpavlin 74 while(1) {
62 dpavlin 79 my $out;
63     if ( $self->render_as eq 'edit' ) {
64 dpavlin 86 $out .= $self->render_edit;
65 dpavlin 79 } elsif ( $self->render_as eq 'view' ) {
66 dpavlin 86 $out .= $self->render_view;
67 dpavlin 79 } else {
68     warn "no renderer ",dump( $self->render_as ), " skipping...";
69     }
70    
71 dpavlin 74 warn $@ if $@;
72 dpavlin 82 warn ">>> ",length($out),"\n";
73 dpavlin 71 my $f = $self->next($out);
74 dpavlin 74 $self->set_from_hash($f);
75     $self->exec_buttons($f);
76     }
77 dpavlin 71 };
78    
79 dpavlin 86 sub render_edit {
80     my $self = shift;
81 dpavlin 89 warn "# render_edit ",$self->id," ",$self->uuid, " ", $self->_layout, "\n";
82     my $out = $self->render_iterator( sub {
83     #warn "# edit render_iterator ",dump( @_ );
84     my ( $name, $field_name, $label, $val ) = @_;
85     return if $name =~ /^_/;
86     return qq|
87     <tr>
88     <td>$label</td>
89     <td>
90     <input type=text id="$field_name" name="$field_name" value="$val">
91     </td>
92     </tr>
93     | if $self->_layout eq 'table';
94     return qq|
95     <div class=fieldholder>
96     <div class=label>$label</div>
97     <div class=field>
98     <input type=text id="$field_name" name="$field_name" value="$val">
99 dpavlin 86 </div>
100 dpavlin 89 </div>
101     |;
102     });
103     $self->render_wrapper_class( $out, 'editform' );
104 dpavlin 86 }
105    
106     sub render_view {
107     my $self = shift;
108 dpavlin 89 warn "# render_view ",$self->id," ",$self->uuid," ", $self->_layout,"\n";
109     my $out = $self->render_iterator( sub {
110     #warn "# view render_iterator ",dump( @_ );
111     my ( $name, $field_name, $label, $val ) = @_;
112     return if $name =~ /^_/;
113     return qq|<tr><td>$label</td><td>$val</td></tr>| if $self->_layout eq 'table';
114     return qq|
115     <div class=fieldholder>
116     <div class=label>$label</div>
117     <div class=field>$val</div>
118 dpavlin 86 </div>
119 dpavlin 89 </div>
120     |;
121     });
122     $self->render_wrapper_class( $out, 'view' );
123 dpavlin 86 }
124    
125 dpavlin 89 sub render_wrapper_class {
126     my ( $self, $out, $class ) = @_;
127     if ( length($out) == 0 ) {
128     carp "no output, skipping";
129     return '<!-- no output -->';
130     }
131     return $out . qq|<tr><td colspan=2>| . $self->render_buttons . qq|</td></tr>| if $self->_layout eq 'table';
132     return qq|<div class="$class">| . $out . $self->render_buttons . qq|</div>|;
133     }
134    
135 dpavlin 63 use Data::Dump qw/dump/;
136    
137     use Strix::User;
138     my $m = Strix::User->meta;
139    
140     foreach ( $m->get_attribute_list ) {
141 dpavlin 74 my $attr = $m->get_attribute( $_ );
142 dpavlin 63 warn ">> $_\n";
143    
144 dpavlin 74 # FIXME primary key would have to be read-only!
145    
146 dpavlin 63 has $_ => (
147     is => $attr->_is_metadata,
148     label => ucfirst($_),
149     required => $attr->is_required,
150     );
151    
152     }
153    
154 dpavlin 71 has _fey => (
155     is => 'rw',
156     label => 'Fey object',
157     isa => 'Strix::User',
158     );
159    
160 dpavlin 89 use Moose::Util::TypeConstraints;
161    
162     enum 'Layouts' => qw( div table );
163    
164     has _layout => (
165     is => 'rw',
166     isa => 'Layouts',
167     default => 'div',
168     );
169    
170 dpavlin 63 1;

  ViewVC Help
Powered by ViewVC 1.1.26