/[Frey]/trunk/lib/Frey/Web/Row.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/Row.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 90 - (hide annotations)
Thu Jul 10 20:57:27 2008 UTC (15 years, 9 months ago) by dpavlin
Original Path: trunk/lib/Strix/View/User.pm
File size: 3973 byte(s)
design tweaks

- better forms in table layout
- compress html a bit by removing leading tabs
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 dpavlin 90 <tr class="editform">
88     <td class="label">$label</td>
89     <td class="field">
90 dpavlin 89 <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 dpavlin 90 <label for="$field_name">$label</label>
97 dpavlin 89 <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 dpavlin 90 $out =~ s/^\t+//mg; # XXX compress output
132 dpavlin 89 return $out . qq|<tr><td colspan=2>| . $self->render_buttons . qq|</td></tr>| if $self->_layout eq 'table';
133     return qq|<div class="$class">| . $out . $self->render_buttons . qq|</div>|;
134     }
135    
136 dpavlin 63 use Data::Dump qw/dump/;
137    
138     use Strix::User;
139     my $m = Strix::User->meta;
140    
141     foreach ( $m->get_attribute_list ) {
142 dpavlin 74 my $attr = $m->get_attribute( $_ );
143 dpavlin 63 warn ">> $_\n";
144    
145 dpavlin 74 # FIXME primary key would have to be read-only!
146    
147 dpavlin 63 has $_ => (
148     is => $attr->_is_metadata,
149     label => ucfirst($_),
150     required => $attr->is_required,
151     );
152    
153     }
154    
155 dpavlin 71 has _fey => (
156     is => 'rw',
157     label => 'Fey object',
158     isa => 'Strix::User',
159     );
160    
161 dpavlin 89 use Moose::Util::TypeConstraints;
162    
163     enum 'Layouts' => qw( div table );
164    
165     has _layout => (
166     is => 'rw',
167     isa => 'Layouts',
168     default => 'div',
169     );
170    
171 dpavlin 63 1;

  ViewVC Help
Powered by ViewVC 1.1.26