/[Frey]/trunk/lib/Frey/Action.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

Diff of /trunk/lib/Frey/Action.pm

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1112 by dpavlin, Mon Jun 29 16:46:03 2009 UTC revision 1113 by dpavlin, Mon Jun 29 18:25:33 2009 UTC
# Line 102  sub attributes { Line 102  sub attributes {
102    
103  =cut  =cut
104    
105    sub form_id {
106            my ($self) = @_;
107            my $form_id = $self->class;
108            $form_id =~ s{\W+}{_}g;
109            return $form_id;
110    }
111    
112    sub select_values {
113            my ( $self, $name, $attr_type, $values ) = @_;
114    
115            $attr_type ||= '?' and warn "$name doesn't have attr_type";
116    
117            my $form_id = $self->form_id;
118            my $max_value_len = 0;
119            my @values;
120            my $display;
121            my $html = '';
122    
123            foreach ( @$values ) {
124                    my $v = ref($_) eq 'HASH' ? $_->{$name} : $_;
125                    if ( $v =~ s/\t+(.+)$// ) {
126                            $display->{$v} = $1;
127                    }
128                    warn "## value '$v'";
129                    push @values, $v;
130                    $max_value_len = length($v) if length($v) > $max_value_len;
131            }
132    
133            warn "# max_value_len: $max_value_len";
134            #my $render = eval $class . '->render_' . $name;
135            my $call = 'render_' . $name;
136            my $render = $self->class->$call;
137            warn "## render $@";
138    
139            if ( $#values > 3 && $render !~ m{radio} ) {
140                    my $options = join("\n",
141                            map {
142                                    my $d = $display->{$_} || $_;
143                                    qq|<option value="$_">$d</option>|;
144                            } @values
145                    );
146                    # onchange="alert(this.options[this.selectedIndex].value);"
147                    $html = qq|
148                            <select title="$attr_type" name="$name">
149                            $options
150                            </select>
151                    | if $options;
152            } else {
153                    my $delimiter = $max_value_len > $self->input_step_size ? qq|<br>| : '';
154                    my $radio =
155    #                               $delimiter .
156                            join("\n",
157                            map { strip(qq|
158                                            <span title="$attr_type">
159                                            <input type="radio" name="$name" value="$_">
160                                            $_
161                                            </span>
162                                            $delimiter
163                            |) } @values
164                    );
165                    if ( $radio ) {
166                            
167                            my $size = int( $max_value_len / $self->input_step_size ) + 1;
168                            $size = 5 if $size > 5;
169                            $size *= $self->input_step_size;
170                            $radio .= qq|
171                                    <span>
172                                    <input type="radio" name="$name" value=" " onclick="document.getElementById('new-$name').focus();" >
173                                    <input type="text" name="new-$name" id="new-$name" onchange="clear_radio('$form_id','$name'); this.disable = false;" onblur="this.disable = true;" title="enter new value" size="$size">
174                                    </span>
175                            |;
176                    }
177                    $html = qq|<div style="display: block;">$radio</div>|;
178            }
179    
180            return
181    #                       qq|<input type="text" name="$name">| .
182                    $html
183    }
184    
185  sub params_form {  sub params_form {
186          my ( $self ) = @_;          my ( $self ) = @_;
187    
# Line 132  sub params_form { Line 212  sub params_form {
212          warn "# $class config = ",dump( $params_config ) if $self->debug;          warn "# $class config = ",dump( $params_config ) if $self->debug;
213    
214          my $form;          my $form;
215          my $form_id = $class;          my $form_id = $self->form_id;
         $form_id =~ s{\W+}{_}g;  
   
         sub select_values {  
                 my ( $name, $attr_type, $values ) = @_;  
   
                 $attr_type ||= '?' and warn "$name doesn't have attr_type";  
   
                 my $max_value_len = 0;  
                 my @values;  
                 my $display;  
                 my $html = '';  
   
                 foreach ( @$values ) {  
                         my $v = ref($_) eq 'HASH' ? $_->{$name} : $_;  
                         if ( $v =~ s/\t+(.+)$// ) {  
                                 $display->{$v} = $1;  
                         }  
                         warn "## value '$v'";  
                         push @values, $v;  
                         $max_value_len = length($v) if length($v) > $max_value_len;  
                 }  
   
                 warn "# max_value_len: $max_value_len";  
                 my $render = eval $class . '->render_' . $name;  
                 warn "## render $@";  
   
                 if ( $#values > 3 && $render !~ m{radio} ) {  
                         my $options = join("\n",  
                                 map {  
                                         my $d = $display->{$_} || $_;  
                                         qq|<option value="$_">$d</option>|;  
                                 } @values  
                         );  
                         # onchange="alert(this.options[this.selectedIndex].value);"  
                         $html = qq|  
                                 <select title="$attr_type" name="$name">  
                                 $options  
                                 </select>  
                         | if $options;  
                 } else {  
                         my $delimiter = $max_value_len > $self->input_step_size ? qq|<br>| : '';  
                         my $radio =  
 #                               $delimiter .  
                                 join("\n",  
                                 map { strip(qq|  
                                                 <span title="$attr_type">  
                                                 <input type="radio" name="$name" value="$_">  
                                                 $_  
                                                 </span>  
                                                 $delimiter  
                                 |) } @values  
                         );  
                         if ( $radio ) {  
                                   
                                 my $size = int( $max_value_len / $self->input_step_size ) + 1;  
                                 $size = 5 if $size > 5;  
                                 $size *= $self->input_step_size;  
                                 $radio .= qq|  
                                         <span>  
                                         <input type="radio" name="$name" value=" " onclick="document.getElementById('new-$name').focus();" >  
                                         <input type="text" name="new-$name" id="new-$name" onchange="clear_radio('$form_id','$name'); this.disable = false;" onblur="this.disable = true;" title="enter new value" size="$size">  
                                         </span>  
                                 |;  
                         }  
                         $html = qq|<div style="display: block;">$radio</div>|;  
                 }  
   
                 return  
 #                       qq|<input type="text" name="$name">| .  
                         $html  
         }  
   
216    
217          my @checkboxes;          my @checkboxes;
218    
# Line 250  sub params_form { Line 258  sub params_form {
258                  if ( ref($params_config) eq 'HASH' && defined $params_config->{$name} ) {                  if ( ref($params_config) eq 'HASH' && defined $params_config->{$name} ) {
259                          $value = $params_config->{$name};                          $value = $params_config->{$name};
260                  } elsif ( ref($params_config) eq 'ARRAY' ) {                  } elsif ( ref($params_config) eq 'ARRAY' ) {
261                          $value_html = select_values( $name, $attr_type, $params_config );                          $value_html = $self->select_values( $name, $attr_type, $params_config );
262                          $default->{$name} = $params_config->[0]->{$name};                          $default->{$name} = $params_config->[0]->{$name};
263                  } elsif ( $attr->has_type_constraint && $attr->type_constraint->can('values') ) {                  } elsif ( $attr->has_type_constraint && $attr->type_constraint->can('values') ) {
264                          $value_html = select_values( $name, $attr_type, $attr->type_constraint->values );                          $value_html = $self->select_values( $name, $attr_type, $attr->type_constraint->values );
265                  } elsif ( $class->can( $name . '_available' ) ) {                  } elsif ( $class->can( $name . '_available' ) ) {
266                          my $available = eval $class . '->' . $name . '_available';                          my $available = $class->$name . '_available';
267                          confess $@ if $@;                          confess $@ if $@;
268                          $available =~ s/^\s+//gs;                          $available =~ s/^\s+//gs;
269                          $available =~ s/\s+$//gs;                          $available =~ s/\s+$//gs;
270                          $value_html = select_values( $name, $attr_type, [ split(/\n/,$available) ]);                          $value_html = $self->select_values( $name, $attr_type, [ split(/\n/,$available) ]);
271                  } elsif ( $attr_type =~ m{^Bool} ) {                  } elsif ( $attr_type =~ m{^Bool} ) {
272                          my $suffix = '';                          my $suffix = '';
273                          $suffix = ' checked=1' if $value;                          $suffix = ' checked=1' if $value;

Legend:
Removed from v.1112  
changed lines
  Added in v.1113

  ViewVC Help
Powered by ViewVC 1.1.26