/[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 1142 by dpavlin, Wed Jul 1 12:23:58 2009 UTC revision 1182 by dpavlin, Wed Jul 8 20:16:44 2009 UTC
# Line 53  sub required { Line 53  sub required {
53          my @required =          my @required =
54                  grep {                  grep {
55                          defined $_ && $_->can('name') &&                          defined $_ && $_->can('name') &&
                         ! defined( $self->params->{ $_->name } ) &&  
56                          ! $_->is_lazy                          ! $_->is_lazy
57                  }                  }
58                  map {                  map {
# Line 66  sub required { Line 65  sub required {
65    
66          if ( $param eq 'as_hash' ) {          if ( $param eq 'as_hash' ) {
67                  my $hash;                  my $hash;
68                  map { $hash->{$_}++ } @required;                  map {
69                            $hash->{$_} = 1;
70                            $hash->{$_} = 0 if defined $self->params->{$_};
71                    } @required;
72                  return $hash;                  return $hash;
73          }          }
74          return @required if wantarray;          return @required if wantarray;
# Line 115  sub select_values { Line 117  sub select_values {
117    
118          my $form_id = $self->form_id;          my $form_id = $self->form_id;
119          my $max_value_len = 0;          my $max_value_len = 0;
120            my $form_value_len = $self->class->form_value_len if $self->class->can('form_value_len');
121          my @values;          my @values;
122          my $display;          my $display;
123          my $html = '';          my $html = '';
# Line 129  sub select_values { Line 132  sub select_values {
132                  $max_value_len = length($v) if length($v) > $max_value_len;                  $max_value_len = length($v) if length($v) > $max_value_len;
133          }          }
134    
135            if ( my $l = $form_value_len->{$name} ) {
136                    $max_value_len = $l if $l > $max_value_len;
137            }
138    
139          warn "# max_value_len: $max_value_len";          warn "# max_value_len: $max_value_len";
140          #my $render = eval $class . '->render_' . $name;          #my $render = eval $class . '->render_' . $name;
141          my $call = 'render_' . $name;          my $call = 'render_' . $name;
# Line 162  sub select_values { Line 169  sub select_values {
169                          |) } @values                          |) } @values
170                  );                  );
171                  if ( $radio ) {                  if ( $radio ) {
172                                            
173                            $self->add_js('static/Frey/Action.js'); # clear_radio
174                            my $js = qq{
175                                    onfocus="clear_radio('$form_id','$name'); this.disabled = false;" onblur="clear_radio('$form_id','$name'); this.disabled = true;"
176                            };
177                          my $size = int( $max_value_len / $self->input_step_size ) + 1;                          my $size = int( $max_value_len / $self->input_step_size ) + 1;
178                          $size = 5 if $size > 5;                          my $span = qq|
                         $size *= $self->input_step_size;  
                         $radio .= qq|  
                                 <span>  
179                                  <input type="radio" name="$name" value=" " onclick="document.getElementById('new-$name').focus();" >                                  <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>  
180                          |;                          |;
181    
182                            if ( $size <= 5 ) {
183    
184                                    $size *= $self->input_step_size;
185                                    $span .= qq|<input type="text" name="new-$name" id="new-$name" $js title="enter new value" size="$size">|;
186    
187                            } else {
188    
189                                    my $cols = $self->input_step_size * 5;
190                                    my $rows = int( $max_value_len / $cols ) + 1;
191                                    $span .= qq|<textarea name="new-$name" id="new-$name" cols=$cols rows=$rows $js title="enter new value"></textarea>|;
192    
193                            }
194    
195                            $radio .= qq|<span>$span</span>|;
196    
197                  }                  }
198                  $html = qq|<div style="display: block;">$radio</div>|;                  $html = qq|<div style="display: block;">$radio</div>|;
199          }          }
200    
201          return          return $html;
 #                       qq|<input type="text" name="$name">| .  
                 $html  
202  }  }
203    
204  sub params_form {  sub params_form {
# Line 192  sub params_form { Line 212  sub params_form {
212          }          }
213    
214          my $required = $self->required('as_hash');          my $required = $self->required('as_hash');
215          if ( $required ) {          if ( grep { $required->{$_} } keys %$required ) {
216                  warn $self->class, " required params ", dump( keys %$required ) if $self->debug;                  warn $self->class, " required params ", dump( keys %$required ) if $self->debug;
217          } else {          } else {
218                  warn "all params available ", dump( $self->params ), " not creating form" if $self->debug;                  warn "all params available ", dump( $self->params ), " not creating form" if $self->debug;
# Line 254  sub params_form { Line 274  sub params_form {
274                          $attr->has_default        ? $attr->default( $name ) :                          $attr->has_default        ? $attr->default( $name ) :
275                          undef;                          undef;
276    
277                  if ( ref($params_config) eq 'HASH' && defined $params_config->{$name} ) {                  if ( defined $params_config && ref($params_config) eq 'HASH' && defined $params_config->{$name} ) {
278                          $value = $params_config->{$name};                          $value = $params_config->{$name};
279                  } elsif ( ref($params_config) eq 'ARRAY' ) {                  } elsif ( ref($params_config) eq 'ARRAY' ) {
280                          $value_html = $self->select_values( $name, $attr_type, $params_config );                          $value_html = $self->select_values( $name, $attr_type, $params_config );
# Line 281  sub params_form { Line 301  sub params_form {
301    
302                  $label_title = qq| title="| . $attr->documentation . qq|"| if $attr->has_documentation;                  $label_title = qq| title="| . $attr->documentation . qq|"| if $attr->has_documentation;
303    
304                    my $value_size = '';
305    
306                  $default->{$name} = $value unless defined $default->{$name};                  $default->{$name} = $value unless defined $default->{$name};
307    
308                  my $size = ( int( length($value) / $self->input_step_size ) + 1 ) * $self->input_step_size;                  if ( ! $value_html ) { # fallback to default input type=text
309                  $value_html = qq|<input type="$type" name="$name" title="$attr_type" value="$value" size="$size">| unless $value_html;  
310                            my $form_value_len = $self->class->form_value_len->{$name} if $self->class->can('form_value_len');
311                            $form_value_len = length($value) if length($value) > $form_value_len;
312            
313                            my $size = ( int( $form_value_len / ( $self->input_step_size * 1.5 ) ) + 1 ) * $self->input_step_size if $form_value_len;
314                            $value = qq|value="$value"| if defined $value;
315                            $size = qq|size="$size"| if $size;
316                            $value_html = qq|<input type="$type" name="$name" title="$attr_type" $value $size>| unless $value_html;
317    
318                    }
319    
320  #               warn "# required $name ", $class->meta->get_attribute( $name )->dump( 2 );  #               warn "# required $name ", $class->meta->get_attribute( $name )->dump( 2 );
321    
322                  if ( $required->{$name} ) {                  if ( defined $required->{$name} ) {
323                          $label_title .= qq| class="required"|;                          $label_title .= qq| class="required"|;
324                          $value_html =~ s{(<\S+)\s}{$1 class=required };                          my $class = 'required';
325                               $class = 'required-filled' if ! $required->{$name};
326                            $value_html =~ s{(<\S+)\s}{$1 class=$class };
327                  }                  }
                 $label =~ s/_/ /g;  
328    
329                  my $set = $name;                  my $set = $name;
330                  $set =~ s{_[^_]+$}{};                  $set =~ s{_[^_]+$}{};
# Line 310  sub params_form { Line 342  sub params_form {
342                                          </fieldset>                                          </fieldset>
343                                  |;                                  |;
344                          }                          }
345                          $label =~ s{^\Q$set\E\s+}{};                          $label =~ s{^\Q$set\E_+}{};
346                  }                  }
347    
348                    $label = $self->_label( $label );
349                  $form .= qq|$before<label for="$name"$label_title>$label</label>$value_html $after|;                  $form .= qq|$before<label for="$name"$label_title>$label</label>$value_html $after|;
350                  my $ll = length($label);                  my $ll = length($label);
351                  $label_width = $ll if $ll > $label_width;                  $label_width = $ll if $ll > $label_width;
# Line 321  sub params_form { Line 354  sub params_form {
354    
355          $label_width += 2; # XXX padding left+right em          $label_width += 2; # XXX padding left+right em
356    
         $self->add_js('static/Frey/Action.js');  
   
357          $self->add_css(qq|          $self->add_css(qq|
358                  label,input {                  label,input {
359                          display: block;                          display: block;
# Line 345  sub params_form { Line 376  sub params_form {
376                  label.required {                  label.required {
377                          font-weight: bold;                          font-weight: bold;
378                  }                  }
379    
380                  input.required,                  input.required,
381                  select.required {                  select.required {
382                          border-color: #c00;                          border-color: #c00;
383                  }                  }
384                    input.required-filled,
385                    select.required-filled {
386                            border-color: #0c0;
387                    }
388    
389                  br {                  br {
390                          clear: left;                          clear: left;
# Line 366  sub params_form { Line 402  sub params_form {
402          # http://www.quirksmode.org/oddsandends/forms.html          # http://www.quirksmode.org/oddsandends/forms.html
403  #       $form =~ s{<([^>]+)(name=")([^"]+)(")([^>]*)>}{<$1$2$3$4 id="$3" $5}gs;  #       $form =~ s{<([^>]+)(name=")([^"]+)(")([^>]*)>}{<$1$2$3$4 id="$3" $5}gs;
404    
405          $html = qq|          if ( $form ) {
406                  <h1>$class params</h1>  
407                  <form name="$form_id" id="$form_id" method="post">                  if ( $self->class->can('form_header') ) {
408                  $form                          $html = $self->class->form_header;
409                  <input type="submit" value="Run $class">                  } else {
410                  </form>                          $html = qq|
411          | if $form;                                  <h1>$class params</h1>
412                            |;
413                    }
414    
415                    my $submit = $self->_label( 'submit' );
416                    $submit =~ s{^submit$}{Run $class};
417    
418                    $html .= qq|
419                            <form name="$form_id" id="$form_id" method="post">
420                            $form
421                            <input type="submit" value="$submit">
422                            </form>
423                    |;
424                    $html .= $self->class->form_footer if $self->class->can('form_footer');
425            }
426    
427          $self->add_status({          $self->add_status({
428                  $self->class => {                  $self->class => {
# Line 382  sub params_form { Line 432  sub params_form {
432                  },                  },
433          });          });
434    
435            if ( $self->class->can('title') ) {
436                    my $title = eval {
437                            $self->class->title;
438                    };
439                    $self->title( $title ) if defined $title && ! $@;
440            }
441    
442          return ($html,$default) if wantarray;          return ($html,$default) if wantarray;
443          return $html;          return $html;
444  }  }
445    
446    sub _label {
447            my ($self,$name) = @_;
448            my $labels = $self->class->form_labels if $self->class->can('form_labels');
449            my $label = $labels->{$name};
450            if ( ! defined $label ) {
451                    $label = $name;
452                    $label =~ s{_}{ }g;
453            }
454            return $label;
455    }
456    
457  =head1 SEE ALSO  =head1 SEE ALSO
458    
459  L<http://www.quirksmode.org/css/forms.html> for info on CSS2 forms  L<http://www.quirksmode.org/css/forms.html> for info on CSS2 forms

Legend:
Removed from v.1142  
changed lines
  Added in v.1182

  ViewVC Help
Powered by ViewVC 1.1.26