CSV-Helfer: Leere Zeilen ignorieren.
[kivitendo-erp.git] / SL / Presenter / Part.pm
index 26f296c..8131eff 100644 (file)
@@ -5,53 +5,62 @@ use strict;
 use SL::DB::Part;
 use SL::DB::PartClassification;
 use SL::Locale::String qw(t8);
+use SL::Presenter::EscapedText qw(escape is_escaped);
+use SL::Presenter::Tag qw(input_tag html_tag name_to_id select_tag);
 
 use Exporter qw(import);
-our @EXPORT = qw(part_picker part select_classification classification_abbreviation type_abbreviation separate_abbreviation typeclass_abbreviation);
+our @EXPORT_OK = qw(
+  part_picker part select_classification classification_abbreviation
+  type_abbreviation separate_abbreviation typeclass_abbreviation
+);
+our %EXPORT_TAGS = (ALL => \@EXPORT_OK);
 
 use Carp;
 
 sub part {
-  my ($self, $part, %params) = @_;
+  my ($part, %params) = @_;
 
   $params{display} ||= 'inline';
 
   croak "Unknown display type '$params{display}'" unless $params{display} =~ m/^(?:inline|table-cell)$/;
 
   my $text = join '', (
-    $params{no_link} ? '' : '<a href="controller.pl?action=Part/edit&part.id=' . $self->escape($part->id) . '">',
-    $self->escape($part->partnumber),
+    $params{no_link} ? '' : '<a href="controller.pl?action=Part/edit&part.id=' . escape($part->id) . '">',
+    escape($part->partnumber),
     $params{no_link} ? '' : '</a>',
   );
-  return $self->escaped_text($text);
+
+  is_escaped($text);
 }
 
 sub part_picker {
-  my ($self, $name, $value, %params) = @_;
+  my ($name, $value, %params) = @_;
 
   $value = SL::DB::Manager::Part->find_by(id => $value) if $value && !ref $value;
-  my $id = $params{id} || $self->name_to_id($name);
+  my $id = $params{id} || name_to_id($name);
 
   my @classes = $params{class} ? ($params{class}) : ();
   push @classes, 'part_autocomplete';
 
   my $ret =
-    $self->input_tag($name, (ref $value && $value->can('id') ? $value->id : ''), class => "@classes", type => 'hidden', id => $id,
+    input_tag($name, (ref $value && $value->can('id') ? $value->id : ''), class => "@classes", type => 'hidden', id => $id,
       'data-part-picker-data' => JSON::to_json(\%params),
     ) .
-    $self->input_tag("", ref $value ? $value->displayable_name : '', id => "${id}_name", %params);
+    input_tag("", ref $value ? $value->displayable_name : '', id => "${id}_name", %params);
 
   $::request->layout->add_javascripts('kivi.Part.js');
   $::request->presenter->need_reinit_widgets($id);
 
-  $self->html_tag('span', $ret, class => 'part_picker');
+  html_tag('span', $ret, class => 'part_picker');
 }
 
+sub picker { goto &part_picker }
+
 #
 # shortcut for article type
 #
 sub type_abbreviation {
-  my ($self, $part_type) = @_;
+  my ($part_type) = @_;
   return $::locale->text('Assembly (typeabbreviation)')   if $part_type eq 'assembly';
   return $::locale->text('Part (typeabbreviation)')       if $part_type eq 'part';
   return $::locale->text('Assortment (typeabbreviation)') if $part_type eq 'assortment';
@@ -77,23 +86,23 @@ sub type_abbreviation {
 # shortcut for article type
 #
 sub classification_abbreviation {
-  my ($self, $id) = @_;
+  my ($id) = @_;
   SL::DB::Manager::PartClassification->cache_all();
   my $obj = SL::DB::PartClassification->load_cached($id);
   $obj && $obj->abbreviation ? t8($obj->abbreviation) : '';
 }
 
 sub typeclass_abbreviation {
-  my ($self, $part) = @_;
+  my ($part) = @_;
   return '' if !$part || !$part->isa('SL::DB::Part');
-  return $self->type_abbreviation($part->part_type).$self->classification_abbreviation($part->classification_id);
+  return type_abbreviation($part->part_type) . classification_abbreviation($part->classification_id);
 }
 
 #
 # shortcut for article type
 #
 sub separate_abbreviation {
-  my ($self, $id) = @_;
+  my ($id) = @_;
   SL::DB::Manager::PartClassification->cache_all();
   my $obj = SL::DB::PartClassification->load_cached($id);
   $obj && $obj->abbreviation && $obj->report_separate ? t8($obj->abbreviation) : '';
@@ -103,12 +112,16 @@ sub separate_abbreviation {
 # generate selection tag
 #
 sub select_classification {
-  my ($self, $name, %attributes) = @_;
+  my ($name, %attributes) = @_;
+
   $attributes{value_key} = 'id';
   $attributes{title_key} = 'description';
-  my $collection = SL::DB::Manager::PartClassification->get_all_sorted();
+
+  my $classification_type_filter = delete $attributes{type} // [];
+
+  my $collection = SL::DB::Manager::PartClassification->get_all_sorted( where => $classification_type_filter );
   $_->description($::locale->text($_->description)) for @{ $collection };
-  return $self->select_tag( $name, $collection, %attributes );
+  select_tag( $name, $collection, %attributes );
 }
 
 1;
@@ -124,7 +137,7 @@ SL::Presenter::Part - Part related presenter stuff
 =head1 SYNOPSIS
 
   # Create an html link for editing/opening a part/service/assembly
-  my $object = my $object = SL::DB::Manager::Part->get_first;
+  my $object = SL::DB::Manager::Part->get_first;
   my $html   = SL::Presenter->get->part($object, display => 'inline');
 
 see also L<SL::Presenter>
@@ -168,7 +181,7 @@ Returns the shortcut of the classification
 
 =item C<separate_abbreviation $classification_id>
 
-Returns the shortcut of the classification if the classifiaction has the separate flag set.
+Returns the shortcut of the classification if the classification has the separate flag set.
 
 =back
 
@@ -176,7 +189,7 @@ Returns the shortcut of the classification if the classifiaction has the separat
 
 =item C<select_classification $name,%params>
 
-Returns a HTML Select Tag with all available Classifications
+Returns an HTML select tag with all available classifications.
 
 C<%params> can include:
 
@@ -184,7 +197,7 @@ C<%params> can include:
 
 =item * default
 
-The Id of the selected item .
+The id of the selected item.
 
 =back
 
@@ -233,10 +246,10 @@ set in C<params.actions>:
 
 =item * C<commit_one>
 
-If exactly one element matches the input, the internal id will set to this id,
-the internal state will be set to C<PICKED> and the C<change> even on the
-picker will be fired. Additionally, if C<params> contain C<fat_set_item>
-special event C<set_item:PartPicker> will be fired which is guaranteed to
+If exactly one element matches the input, the internal id will be set to this
+id, the internal state will be set to C<PICKED> and the C<change> event on the
+picker will be fired. Additionally, if C<params> contains C<fat_set_item> a
+special event C<set_item:PartPicker> will be fired which is guaranteed to
 contain a complete JSON representation of the part.
 
 After that the action C<commit_one> will be executed, which defaults to
@@ -248,7 +261,7 @@ If more than one element matches the input, the internal state will be set to
 undefined.
 
 After that the action C<commit_one> will be executed, which defaults to
-opening a popup dialog for graphical interaction. If C<params> contain
+opening a popup dialog for graphical interaction. If C<params> contains
 C<multiple> an alternative popup will be opened, allowing multiple items to be
 selected. Note however that this requires an additional callback
 C<set_multi_items> to work.