X-Git-Url: http://wagnertech.de/gitweb/gitweb.cgi/mfinanz.git/blobdiff_plain/5b22ebf0e0e3cf62364dfb46a7f2de28f90289da..072c821:/SL/Template/Plugin/L.pm?ds=sidebyside diff --git a/SL/Template/Plugin/L.pm b/SL/Template/Plugin/L.pm index c590082cf..8de38ab17 100644 --- a/SL/Template/Plugin/L.pm +++ b/SL/Template/Plugin/L.pm @@ -6,6 +6,8 @@ use List::MoreUtils qw(apply); use List::Util qw(max); use Scalar::Util qw(blessed); +use SL::Presenter; + use strict; { # This will give you an id for identifying html tags and such. @@ -50,6 +52,18 @@ sub _context { return $_[0]->{CONTEXT}; } +sub _call_presenter { + my ($method, @args) = @_; + + my $presenter = $::request->presenter; + + return '' unless $presenter->can($method); + + splice @args, -1, 1, %{ $args[-1] } if @args && (ref($args[-1]) eq 'HASH'); + + $presenter->$method(@args); +} + sub name_to_id { my $self = shift; my $name = shift; @@ -114,6 +128,8 @@ sub select_tag { my $with_empty = delete($attributes{with_empty}); my $empty_title = delete($attributes{empty_title}); + my $with_optgroups = delete($attributes{with_optgroups}); + my %selected; if ( ref($attributes{default}) eq 'ARRAY' ) { @@ -128,91 +144,71 @@ sub select_tag { delete($attributes{default}); - my @options; - - if ( $with_empty ) { - push(@options, [undef, $empty_title || '']); - } + my @all_options; + push @all_options, [undef, $empty_title || ''] if $with_empty; my $normalize_entry = sub { - my ($type, $entry, $sub, $key) = @_; - if ( $sub ) { - return $sub->($entry); - } + return $sub->($entry) if $sub; my $ref = ref($entry); if ( !$ref ) { - - if ( $type eq 'value' || $type eq 'title' ) { - return $entry; - } - + return $entry if $type eq 'value' || $type eq 'title'; return 0; } if ( $ref eq 'ARRAY' ) { - - if ( $type eq 'value' ) { - return $entry->[0]; - } - - if ( $type eq 'title' ) { - return $entry->[1]; - } - - return $entry->[2]; - } - - if ( $ref eq 'HASH' ) { - return $entry->{$key}; - } - - if ( $type ne 'default' || $entry->can($key) ) { - return $entry->$key; + return $entry->[ $type eq 'value' ? 0 : $type eq 'title' ? 1 : 2 ]; } + return $entry->{$key} if $ref eq 'HASH'; + return $entry->$key if $type ne 'default' || $entry->can($key); return undef; }; - foreach my $entry ( @{ $collection } ) { - my $value; - my $title; + my $list_to_code = sub { + my ($sub_collection) = @_; - if ( $value_title_sub ) { - ($value, $title) = @{ $value_title_sub->($entry) }; - } else { + my @options; + foreach my $entry ( @{ $sub_collection } ) { + my $value; + my $title; - $value = $normalize_entry->('value', $entry, $value_sub, $value_key); - $title = $normalize_entry->('title', $entry, $title_sub, $title_key); - } + if ( $value_title_sub ) { + ($value, $title) = @{ $value_title_sub->($entry) }; + } else { - my $default = $normalize_entry->('default', $entry, $default_sub, $default_key); + $value = $normalize_entry->('value', $entry, $value_sub, $value_key); + $title = $normalize_entry->('title', $entry, $title_sub, $title_key); + } - push(@options, [$value, $title, $default]); - } + my $default = $normalize_entry->('default', $entry, $default_sub, $default_key); - foreach my $entry (@options) { - if ( exists($selected{$entry->[0]}) ) { - $entry->[2] = 1; + push(@options, [$value, $title, $default]); } - } - my $code = ''; + foreach my $entry (@options) { + $entry->[2] = 1 if $selected{$entry->[0]}; + } - foreach my $entry (@options) { - my %args = (value => $entry->[0]); + return join '', map { $self->html_tag('option', _H($_->[1]), value => $_->[0], selected => $_->[2]) } @options; + }; - $args{selected} = $entry->[2]; + my $code; - $code .= $self->html_tag('option', _H($entry->[1]), %args); - } + if (!$with_optgroups) { + $code = $list_to_code->($collection); - $code = $self->html_tag('select', $code, %attributes, name => $name); + } else { + $code = join '', map { + my ($optgroup_title, $sub_collection) = @{ $_ }; + $self->html_tag('optgroup', $list_to_code->($sub_collection), label => $optgroup_title) + } @{ $collection }; + } - return $code; + return $self->html_tag('select', $code, %attributes, name => $name); } sub textarea_tag { @@ -281,7 +277,8 @@ sub input_tag { } sub hidden_tag { - return shift->input_tag(@_, type => 'hidden'); + my ($self, $name, $value, @slurp) = @_; + return $self->input_tag($name, $value, _hashify(@slurp), type => 'hidden'); } sub div_tag { @@ -355,75 +352,33 @@ sub stylesheet_tag { return $code; } +my $date_tag_id_idx = 0; sub date_tag { my ($self, $name, $value, @slurp) = @_; + my %params = _hashify(@slurp); - my $name_e = _H($name); - my $seq = _tag_id(); - my $datefmt = apply { - s/d+/\%d/gi; - s/m+/\%m/gi; - s/y+/\%Y/gi; - } $::myconfig{"dateformat"}; - - my $cal_align = delete $params{cal_align} || 'BR'; - my $onchange = delete $params{onchange}; - my $str_value = blessed $value ? $value->to_lxoffice : $value; - - $self->input_tag($name, $str_value, - id => $name_e, + my $id = $self->name_to_id($name) . _tag_id(); + my @onchange = $params{onchange} ? (onChange => delete $params{onchange}) : (); + my @class = $params{no_cal} || $params{readonly} ? () : (class => 'datepicker'); + + return $self->input_tag( + $name, blessed($value) ? $value->to_lxoffice : $value, + id => $id, size => 11, - title => _H($::myconfig{dateformat}), - onBlur => 'check_right_date_format(this)', - ($onchange ? ( - onChange => $onchange, - ) : ()), - %params, - ) . ((!$params{no_cal} && !$params{readonly}) ? - $self->html_tag('img', undef, - src => 'image/calendar.png', - alt => $::locale->text('Calendar'), - id => "trigger$seq", - title => _H($::myconfig{dateformat}), + onblur => "check_right_date_format(this);", %params, - ) . - $self->javascript( - "Calendar.setup({ inputField: '$name_e', ifFormat: '$datefmt', align: '$cal_align', button: 'trigger$seq' });" - ) : ''); + @class, @onchange, + ); } sub customer_picker { my ($self, $name, $value, %params) = @_; my $name_e = _H($name); - $self->hidden_tag($name, (ref $value && $value->can('id')) ? $value->id : '') . - $self->input_tag("$name_e\_name", (ref $value && $value->can('name')) ? $value->name : '', %params) . - $self->javascript(<{layout}->add_javascripts('autocomplete_customer.js'); + + $self->hidden_tag($name, (ref $value && $value->can('id') ? $value->id : ''), class => 'customer_autocomplete') . + $self->input_tag("$name_e\_name", (ref $value && $value->can('name')) ? $value->name : '', %params); } # simple version with select_tag @@ -486,27 +441,15 @@ sub tabbed { next if $tab eq ''; - my $selected = $params{selected} == $i; - my $tab_id = "__tab_id_$i"; - push @header, $self->li_tag( - $self->link('', $tab->{name}, rel => $tab_id), - ($selected ? (class => 'selected') : ()) - ); - push @blocks, $self->div_tag($tab->{data}, - id => $tab_id, class => 'tabcontent'); + my $tab_id = "__tab_id_$i"; + push @header, $self->li_tag($self->link('#' . $tab_id, $tab->{name})); + push @blocks, $self->div_tag($tab->{data}, id => $tab_id); } return '' unless @header; - return $self->ul_tag( - join('', @header), id => $id, class => 'shadetabs' - ) . - $self->div_tag( - join('', @blocks), class => 'tabcontentstyle' - ) . - $self->javascript( - qq|var $id = new ddtabcontent("$id");$id.setpersist(true);| . - qq|$id.setselectedClassTarget("link");$id.init();| - ); + + my $ul = $self->ul_tag(join('', @header), id => $id); + return $self->div_tag(join('', $ul, @blocks), class => 'tabwidget'); } sub tab { @@ -647,15 +590,8 @@ sub dump { } sub truncate { - my ($self, $text, @slurp) = @_; - my %params = _hashify(@slurp); - - $params{at} ||= 50; - $params{at} = 3 if 3 > $params{at}; - $params{at} -= 3; - - return $text if length($text) < $params{at}; - return substr($text, 0, $params{at}) . '...'; + my $self = shift; + return _call_presenter('truncate', @_); } sub sortable_table_header { @@ -699,9 +635,12 @@ sub paginate_controls { }, ); - my $output; - $controller->_template_obj->process('templates/webpages/common/paginate.html', \%template_params, \$output); - return $output; + return SL::Presenter->get->render('common/paginate', %template_params); +} + +sub simple_format { + my $self = shift; + return _call_presenter('simple_format', @_); } 1; @@ -814,6 +753,37 @@ selected. The tag's C defaults to C. +If the option C is set then this function expects +C<\@collection> to be one level deeper. The upper-most level is +translated into a HTML C tag. So the structure becomes: + +=over 4 + +=item 1. Array of array references. Each element in the +C<\@collection> is converted into an optgroup. + +=item 2. The optgroup's C