render items using table or list
[MojoFacets.git] / lib / MojoFacets / Data.pm
index 67f5658..de1a226 100644 (file)
@@ -157,22 +157,28 @@ sub filter {
 
        $self->session( 'offset' => 0 );
 
-       $self->redirect_to('/data/table');
+       $self->redirect_to('/data/items');
 }
 
 sub _filter_item {
        my ( $self, $filters, $i ) = @_;
        my $pass = 1;
        foreach my $n ( keys %$filters ) {
-               # filter must exists in element
-               if ( ! defined $i->{$n} ) {
-                       $pass = 0;
-                       last;
+               my @filter_values = @{ $filters->{$n} };
+               my $include_missing = grep { /^_missing/ } @filter_values;
+               if ( ! exists $i->{$n} ) {
+                       if ( $include_missing ) {
+                               $pass = 1;
+                               next;
+                       } else {
+                               $pass = 0;
+                               last;
+                       }
                }
                # and match any of values in element
                my $have_values = 0;
                foreach my $v ( @{ $i->{$n} } ) { # FIXME not array?
-                       $have_values ||= 1 if grep { m/^\Q$v\E$/ } @{ $filters->{$n} };
+                       $have_values ||= 1 if grep { m/^\Q$v\E$/ } @filter_values;
                }
                if ( ! $have_values ) {
                        $pass = 0;
@@ -190,7 +196,7 @@ sub _data_items {
        } @{ $data->{items} };
 }
 
-sub table {
+sub items {
     my $self = shift;
 
        $self->redirect_to('/data/index') unless $data->{items};
@@ -202,15 +208,18 @@ sub table {
        my $offset  = $self->_perm_scalar('offset', 0);
        my $limit   = $self->_perm_scalar('limit', 20);
 
+       # fix offset when changing limit
+       $offset = int( $offset / $limit ) * $limit;
+
        # FIXME - multi-level sort
        my $numeric = $self->_is_numeric($order);
+       my $missing = $numeric ? 0 : '';
+       no warnings qw(numeric);
        my @sorted = sort {
-               my ($v1,$v2) = ( $a->{$order}->[0], $b->{$order}->[0] );
+               my $v1 = exists $a->{$order} ? join('', @{$a->{$order}}) : $missing;
+               my $v2 = exists $b->{$order} ? join('', @{$b->{$order}}) : $missing;
                ($v1,$v2) = ($v2,$v1) if $sort eq 'd';
-               $numeric
-                       ? $v1 <=> $v2
-                       : ( $v1 || '' ) cmp ( $v2 || '' )
-                       ;
+               $numeric ? $v1 <=> $v2 : $v1 cmp $v2 ;
        } $self->_data_items;
 
 #      warn "# sorted ", dump @sorted;
@@ -234,7 +243,7 @@ sub order {
        my $self = shift;
        $self->session('order', $self->param('order'));
        $self->session('sort', $self->param('sort'));
-       $self->redirect_to('/data/table');
+       $self->redirect_to('/data/items');
 }
 
 sub _is_numeric {
@@ -252,15 +261,16 @@ sub facet {
                my $f = $self->session('filters');
                delete $f->{$remove};
                $self->session( 'filters' => $f );
-               $self->redirect_to( '/data/table' );
+               $self->redirect_to( '/data/items' );
        }
 
        my $facet;
        my $name = $self->param('name') || die "no name";
 
        foreach my $i ( $self->_data_items ) {
-               next unless exists $i->{$name};
-               if ( ref $i->{$name} eq 'ARRAY' ) {
+               if ( ! exists $i->{$name} ) {
+                       $facet->{ _missing }++;
+               } elsif ( ref $i->{$name} eq 'ARRAY' ) {
                        $facet->{$_}++ foreach @{ $i->{$name} };
                } else {
                        $facet->{ $i->{$name} }++;