PriceSource: credit_notes auch im Popup unterstützen
[kivitendo-erp.git] / SL / Controller / Helper / ParseFilter.pm
index 9b5eb51..37b0673 100644 (file)
@@ -10,6 +10,7 @@ use SL::Helper::DateTime;
 use List::MoreUtils qw(uniq);
 use SL::MoreCommon qw(listify);
 use Data::Dumper;
+use Text::ParseWords;
 
 my %filters = (
   date    => sub { DateTime->from_lxoffice($_[0]) },
@@ -103,10 +104,24 @@ sub _parse_filter {
     my ($key, $value) = ($flattened->[$i], $flattened->[$i+1]);
     my ($type, $op)   = $key =~ m{:(.+)::(.+)};
 
-    ($key, $value) = _apply_all($key, $value, qr/\b:(\w+)/,  { %filters, %{ $params{filters} || {} } });
-    ($key, $value) = _apply_all($key, $value, qr/\b::(\w+)/, { %methods, %{ $params{methods} || {} } });
-    ($key, $value) = _dispatch_custom_filters($params{class}, $with_objects, $key, $value) if $params{class};
-    ($key, $value) = _apply_value_filters($key, $value, $type, $op);
+    if ($key =~ s/:multi//) {
+      my @multi;
+      my $orig_key = $key;
+      for my $value (parse_line('\s+', 0, $value)) {
+        ($key, $value) = _apply_all($key, $value, qr/\b:(\w+)/,  { %filters, %{ $params{filters} || {} } });
+        ($key, $value) = _apply_all($key, $value, qr/\b::(\w+)/, { %methods, %{ $params{methods} || {} } });
+        ($key, $value) = _dispatch_custom_filters($params{class}, $with_objects, $key, $value) if $params{class};
+        ($key, $value) = _apply_value_filters($key, $value, $type, $op);
+        push @multi, $key, $value;
+        $key = $orig_key;
+      }
+      ($key, $value) = (and => \@multi);
+    } else {
+      ($key, $value) = _apply_all($key, $value, qr/\b:(\w+)/,  { %filters, %{ $params{filters} || {} } });
+      ($key, $value) = _apply_all($key, $value, qr/\b::(\w+)/, { %methods, %{ $params{methods} || {} } });
+      ($key, $value) = _dispatch_custom_filters($params{class}, $with_objects, $key, $value) if $params{class};
+      ($key, $value) = _apply_value_filters($key, $value, $type, $op);
+    }
 
     push @result, $key, $value if defined $key;
   }
@@ -152,7 +167,7 @@ sub _dispatch_custom_filters {
   my $obj_prefix = join '.', @tokens, '';
 
   if ($manager->can('filter')) {
-    ($key, $value, my $obj) = $manager->filter($last_token, $value, $obj_prefix);
+    ($key, $value, my $obj) = $manager->filter($last_token, $value, $obj_prefix, $obj_path);
     _add_uniq($with_objects, $obj) if $obj;
   } else {
     _add_uniq($with_objects, $obj_path) if $obj_path;