/[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

Contents of /trunk/lib/Frey/Web/Row.pm

Parent Directory Parent Directory | Revision Log Revision Log


Revision 90 - (show annotations)
Thu Jul 10 20:57:27 2008 UTC (15 years, 8 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 package Strix::View::User;
2
3 use Data::Dump qw/dump/;
4 use Carp qw/carp/;
5
6 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 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 sub main {
38 my ( $self ) = @_;
39
40 if ( ! $self->_fey ) {
41 $self->add_button( 'Add' => sub {
42 my $f = shift;
43 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 });
55 }
56
57 $self->edit_delete_buttons;
58
59 warn "# ",$self->uuid, " [", $self->id ,"] _fey = ",dump( $self->_fey );
60
61 while(1) {
62 my $out;
63 if ( $self->render_as eq 'edit' ) {
64 $out .= $self->render_edit;
65 } elsif ( $self->render_as eq 'view' ) {
66 $out .= $self->render_view;
67 } else {
68 warn "no renderer ",dump( $self->render_as ), " skipping...";
69 }
70
71 warn $@ if $@;
72 warn ">>> ",length($out),"\n";
73 my $f = $self->next($out);
74 $self->set_from_hash($f);
75 $self->exec_buttons($f);
76 }
77 };
78
79 sub render_edit {
80 my $self = shift;
81 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 class="editform">
88 <td class="label">$label</td>
89 <td class="field">
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 <label for="$field_name">$label</label>
97 <div class=field>
98 <input type=text id="$field_name" name="$field_name" value="$val">
99 </div>
100 </div>
101 |;
102 });
103 $self->render_wrapper_class( $out, 'editform' );
104 }
105
106 sub render_view {
107 my $self = shift;
108 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 </div>
119 </div>
120 |;
121 });
122 $self->render_wrapper_class( $out, 'view' );
123 }
124
125 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 $out =~ s/^\t+//mg; # XXX compress output
132 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 use Data::Dump qw/dump/;
137
138 use Strix::User;
139 my $m = Strix::User->meta;
140
141 foreach ( $m->get_attribute_list ) {
142 my $attr = $m->get_attribute( $_ );
143 warn ">> $_\n";
144
145 # FIXME primary key would have to be read-only!
146
147 has $_ => (
148 is => $attr->_is_metadata,
149 label => ucfirst($_),
150 required => $attr->is_required,
151 );
152
153 }
154
155 has _fey => (
156 is => 'rw',
157 label => 'Fey object',
158 isa => 'Strix::User',
159 );
160
161 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 1;

  ViewVC Help
Powered by ViewVC 1.1.26