]> wagnertech.de Git - mfinanz.git/blobdiff - SL/Template/Plugin/L.pm
Standard-Auswahl für Umlaufvermögenskonto (Bank) mandantenweit setzen. Ferner yearend...
[mfinanz.git] / SL / Template / Plugin / L.pm
index 4f5632b9d2cf0240c3115dc807c86dc849b7fb20..d1ecdbd8c6d239e909cb0a07cccefc7e6e1040ed 100644 (file)
@@ -5,6 +5,15 @@ use Template::Plugin;
 
 use strict;
 
+{ # This will give you an id for identifying html tags and such.
+  # It's guaranteed to be unique unless you exceed 10 mio calls per request.
+  # Do not use these id's to store information across requests.
+my $_id_sequence = int rand 1e7;
+sub _tag_id {
+  return $_id_sequence = ($_id_sequence + 1) % 1e7;
+}
+}
+
 sub _H {
   my $string = shift;
   return $::locale->quote_special_chars('HTML', $string);
@@ -107,7 +116,9 @@ sub options_for_select {
   my $value_key     = $options{value} || 'id';
   my $title_key     = $options{title} || $value_key;
 
-  my @tags          = ();
+  my @elements      = ();
+  push @elements, [ undef, $options{empty_title} || '' ] if $options{with_empty};
+
   if ($collection && (ref $collection eq 'ARRAY')) {
     foreach my $element (@{ $collection }) {
       my @result = !ref $element            ? ( $element,               $element               )
@@ -115,14 +126,49 @@ sub options_for_select {
                  :  ref $element eq 'HASH'  ? ( $element->{$value_key}, $element->{$title_key} )
                  :                            ( $element->$value_key,   $element->$title_key   );
 
-      my %attributes = ( value => $result[0] );
-      $attributes{selected} = 'selected' if $options{default} && ($options{default} eq ($result[0] || ''));
-
-      push @tags, $self->html_tag('option', _H($result[1]), %attributes);
+      push @elements, \@result;
     }
   }
 
-  return join('', @tags);
+  my $code = '';
+  foreach my $result (@elements) {
+    my %attributes = ( value => $result->[0] );
+    $attributes{selected} = 'selected' if $options{default} && ($options{default} eq ($result->[0] || ''));
+
+    $code .= $self->html_tag('option', _H($result->[1]), %attributes);
+  }
+
+  return $code;
+}
+
+sub javascript {
+  my ($self, $data) = @_;
+  return $self->html_tag('script', $data, type => 'text/javascript');
+}
+
+sub date_tag {
+  my ($self, $name, $value, @slurp) = @_;
+  my %params   = _hashify(@slurp);
+  my $name_e   = _H($name);
+  my $seq      = _tag_id();
+
+  $params{cal_align} ||= 'BR';
+
+  $self->input_tag($name, $value,
+    size   => 11,
+    title  => _H($::myconfig{dateformat}),
+    onBlur => 'check_right_date_format(this)',
+    %params,
+  ) . ((!$params{no_cal}) ?
+  $self->html_tag('img', undef,
+    src    => 'image/calendar.png',
+    id     => "trigger$seq",
+    title  => _H($::myconfig{dateformat}),
+    %params,
+  ) .
+  $self->javascript(
+    "Calendar.setup({ inputField: '$name_e', ifFormat: '$::myconfig{jsc_dateformat}', align: '$params{cal_align}', button: 'trigger$seq'  });"
+  ) : '');
 }
 
 1;
@@ -206,6 +252,16 @@ If C<%attributes> contains a key C<label> then a HTML 'label' tag is
 created with said C<label>. No attribute named C<label> is created in
 that case.
 
+=item C<date_tag $name, $value, %attributes>
+
+=item C<date_tag $name, $value, cal_align =E<gt> $align_code, %attributes>
+
+Creates a date input field, with an attached javascript that will open a
+calendar on click. The javascript ist by default anchoered at the bottom right
+sight. This can be overridden with C<cal_align>, see Calendar documentation for
+the details, usually you'll want a two letter abbreviation of the alignment.
+Right + Bottom becomes C<BL>.
+
 =back
 
 =head2 CONVERSION FUNCTIONS
@@ -240,6 +296,11 @@ respectively.
 For cases 3 and 4 C<$options{value}> defaults to C<id> and
 C<$options{title}> defaults to C<$options{value}>.
 
+If the option C<with_empty> is set then an empty element (value
+C<undef>) will be used as the first element. The title to display for
+this element can be set with the option C<empty_title> and defaults to
+an empty string.
+
 =back
 
 =head1 MODULE AUTHORS