X-Git-Url: http://wagnertech.de/gitweb/gitweb.cgi/mfinanz.git/blobdiff_plain/67079598f8f98a12e12a8acddc3afbf12bb58c5d..51d0274dc6b40830d38bcc209bb9c402433c1b38:/SL/Template/Plugin/L.pm diff --git a/SL/Template/Plugin/L.pm b/SL/Template/Plugin/L.pm index 0b4967d34..9cf5ebb85 100644 --- a/SL/Template/Plugin/L.pm +++ b/SL/Template/Plugin/L.pm @@ -28,8 +28,8 @@ sub _H { } sub _J { - my $string = "" . shift; - $string =~ s/\"/\\\"/g; + my $string = shift; + $string =~ s/(\"|\'|\\)/\\$1/g; return $string; } @@ -86,13 +86,122 @@ sub html_tag { sub select_tag { my $self = shift; my $name = shift; - my $options_str = shift; + my $collection = shift; my %attributes = _hashify(@_); $attributes{id} ||= $self->name_to_id($name); - $options_str = $self->options_for_select($options_str) if ref $options_str; - return $self->html_tag('select', $options_str, %attributes, name => $name); + my $value_key = delete($attributes{value_key}) || 'id'; + my $title_key = delete($attributes{title_key}) || $value_key; + my $default_key = delete($attributes{default_key}) || 'selected'; + + + my $value_title_sub = delete($attributes{value_title_sub}); + + my $value_sub = delete($attributes{value_sub}); + my $title_sub = delete($attributes{title_sub}); + my $default_sub = delete($attributes{default_sub}); + + + my %selected; + + if ( ref($attributes{default}) eq 'ARRAY' ) { + + foreach my $entry (@{$attributes{default}}) { + $selected{$entry} = 1; + } + } elsif ( defined($attributes{default}) ) { + $selected{$attributes{default}} = 1; + } + + delete($attributes{default}); + + + my @options; + + if ( delete($attributes{with_empty}) ) { + push(@options, [undef, $attributes{empty_title} || '']); + } + + my $normalize_entry = sub { + + my ($type, $entry, $sub, $key) = @_; + + if ( $sub ) { + return $sub->($entry); + } + + my $ref = ref($entry); + + if ( !$ref ) { + + if ( $type eq 'value' || $type eq 'title' ) { + return $entry; + } + + 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 undef; + }; + + foreach my $entry ( @{ $collection } ) { + my $value; + my $title; + + if ( $value_title_sub ) { + ($value, $title) = $value_title_sub->($entry); + } else { + + $value = $normalize_entry->('value', $entry, $value_sub, $value_key); + $title = $normalize_entry->('title', $entry, $title_sub, $title_key); + } + + my $default = $normalize_entry->('default', $entry, $default_sub, $default_key); + + push(@options, [$value, $title, $default]); + } + + foreach my $entry (@options) { + if ( exists($selected{$entry->[0]}) ) { + $entry->[2] = 1; + } + } + + my $code = ''; + + foreach my $entry (@options) { + my %args = (value => $entry->[0]); + + $args{selected} = $entry->[2]; + + $code .= $self->html_tag('option', _H($entry->[1]), %args); + } + + $code = $self->html_tag('select', $code, %attributes, name => $name); + + return $code; } sub textarea_tag { @@ -207,49 +316,11 @@ sub button_tag { return $self->html_tag('input', undef, %attributes, value => $value, onclick => $onclick); } -sub options_for_select { - my $self = shift; - my $collection = shift; - my %options = _hashify(@_); - - my $value_key = $options{value} || 'id'; - my $title_key = $options{title} || $value_key; - - my $value_sub = $options{value_sub}; - my $title_sub = $options{title_sub}; - - my $value_title_sub = $options{value_title_sub}; - - my %selected = map { ( $_ => 1 ) } @{ ref($options{default}) eq 'ARRAY' ? $options{default} : defined($options{default}) ? [ $options{default} ] : [] }; - - my $access = sub { - my ($element, $index, $key, $sub) = @_; - my $ref = ref $element; - return $sub ? $sub->($element) - : !$ref ? $element - : $ref eq 'ARRAY' ? $element->[$index] - : $ref eq 'HASH' ? $element->{$key} - : $element->$key; - }; - - my @elements = (); - push @elements, [ undef, $options{empty_title} || '' ] if $options{with_empty}; - push @elements, map [ - $value_title_sub ? @{ $value_title_sub->($_) } : ( - $access->($_, 0, $value_key, $value_sub), - $access->($_, 1, $title_key, $title_sub), - ) - ], @{ $collection } if $collection && ref $collection eq 'ARRAY'; +sub yes_no_tag { + my ($self, $name, $value) = splice @_, 0, 3; + my %attributes = _hashify(@_); - my $code = ''; - foreach my $result (@elements) { - my %attributes = ( value => $result->[0] ); - $attributes{selected} = 'selected' if $selected{ defined($result->[0]) ? $result->[0] : '' }; - - $code .= $self->html_tag('option', _H($result->[1]), %attributes); - } - - return $code; + return $self->select_tag($name, [ [ 1 => $::locale->text('Yes') ], [ 0 => $::locale->text('No') ] ], default => $value ? 1 : 0, %attributes); } sub javascript { @@ -348,12 +419,12 @@ sub vendor_selector { my $actual_vendor_id = (defined $::form->{"$name"})? ((ref $::form->{"$name"}) ? $::form->{"$name"}->id : $::form->{"$name"}) : (ref $value && $value->can('id')) ? $value->id : ''; - my $options_str = $self->options_for_select(SL::DB::Manager::Vendor->get_all(), - default => $actual_vendor_id, - title_sub => sub { $_[0]->vendornumber . " : " . $_[0]->name }, - 'with_empty' => 1); - - return $self->select_tag($name, $options_str, %params); + + return $self->select_tag($name, SL::DB::Manager::Vendor->get_all(), + default => $actual_vendor_id, + title_sub => sub { $_[0]->vendornumber . " : " . $_[0]->name }, + 'with_empty' => 1, + %params); } @@ -363,12 +434,12 @@ sub part_selector { my $actual_part_id = (defined $::form->{"$name"})? ((ref $::form->{"$name"})? $::form->{"$name"}->id : $::form->{"$name"}) : (ref $value && $value->can('id')) ? $value->id : ''; - my $options_str = $self->options_for_select(SL::DB::Manager::Part->get_all(), - default => $actual_part_id, - title_sub => sub { $_[0]->partnumber . " : " . $_[0]->description }, - 'with_empty' => 1); - - return $self->select_tag($name, $options_str, %params); + + return $self->select_tag($name, SL::DB::Manager::Part->get_all(), + default => $actual_part_id, + title_sub => sub { $_[0]->partnumber . " : " . $_[0]->description }, + with_empty => 1, + %params); } @@ -562,6 +633,41 @@ sub dump { return '
' . Data::Dumper::Dumper(@_) . ''; } +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}) . '...'; +} + +sub sortable_table_header { + my ($self, $by, @slurp) = @_; + my %params = _hashify(@slurp); + + my $controller = $self->{CONTEXT}->stash->get('SELF'); + my $sort_spec = $controller->get_sort_spec; + my $by_spec = $sort_spec->{$by}; + my %current_sort_params = $controller->get_current_sort_params; + my ($image, $new_dir) = ('', $current_sort_params{dir}); + my $title = delete($params{title}) || $by_spec->{title}; + + if ($current_sort_params{by} eq $by) { + my $current_dir = $current_sort_params{dir} ? 'up' : 'down'; + $image = '
';
+ $new_dir = 1 - ($current_sort_params{dir} || 0);
+ }
+
+ $params{ $sort_spec->{FORM_PARAMS}->[0] } = $by;
+ $params{ $sort_spec->{FORM_PARAMS}->[1] } = ($new_dir ? '1' : '0');
+
+ return '' . _H($title) . $image . '';
+}
+
1;
__END__
@@ -576,11 +682,15 @@ Usage from a template:
[% USE L %]
- [% L.select_tag('direction', [ [ 'left', 'To the left' ], [ 'right', 'To the right' ] ]) %]
+ [% L.select_tag('direction', [ [ 'left', 'To the left' ], [ 'right', 'To the right', 1 ] ]) %]
+
+ [% L.select_tag('direction', [ { direction => 'left', display => 'To the left' },
+ { direction => 'right', display => 'To the right' } ],
+ value_key => 'direction', title_key => 'display', default => 'right')) %]
- [% L.select_tag('direction', L.options_for_select([ { direction => 'left', display => 'To the left' },
- { direction => 'right', display => 'To the right' } ],
- value => 'direction', title => 'display', default => 'right')) %]
+ [% L.select_tag('direction', [ { direction => 'left', display => 'To the left' },
+ { direction => 'right', display => 'To the right', selected => 1 } ],
+ value_key => 'direction', title_key => 'display')) %]
=head1 DESCRIPTION
@@ -618,16 +728,62 @@ C<$content_string> is not HTML escaped.
=over 4
-=item C