NAME
   Web::Util::ExtPaging - Paginate DBIx::Class::ResultSets for ExtJS
   consumption

VERSION
   version 0.001003

SYNOPSIS
     package MyApp::People;

     use Web::Simple;
     use JSON::MaybeXS;
     use Web::Util::ExtPaging;

     sub dispatch_request {
       my $people_rs = get_rs();

       sub (/people) {
         [
            200,
            [ 'Content-type', 'application/json' ],
            [ encode_json(ext_paginate($rs->search(undef, { rows => 25 }))) ],
         ]
       },
       sub (/people_lite) {
         [
            200,
            [ 'Content-type', 'application/json' ],
            [
               encode_json(ext_paginate(
                  $rs->search(undef, { rows => 25 }), sub {
                     my $person = shift;
                     return {
                        first_name => $person->first_name,
                        last_name => $person->last_name,
                     }
                  },
               ))
            ],
         ]
       },
       sub (/people_more_different) {
         [
            200,
            [ 'Content-type', 'application/json' ],
            [
               # this will call the 'foo' method on each person and put the
               # returned value into the datastructure
               encode_json(ext_paginate(
                  $rs->search(undef, { rows => 25 }), 'foo',
               ))
            ],
         ]
       },
       sub (/programmers_do_it_by_hand) {
         [
            200,
            [ 'Content-type', 'application/json' ],
            [ encode_json(ext_parcel([qw( foo bar baz )], 10)) ],
         ]
       },
       sub (/programmers_do_it_by_hand_partially) {
         [
            200,
            [ 'Content-type', 'application/json' ],
            # defaults total to amount of items passed in
            [ encode_json(ext_parcel([qw( foo bar baz )])) ],
         ]
       },
       sub () { [ 404, [ 'Content-type', 'text/plain' ], [ 'not found' ] ] }
     }

DESCRIPTION
   This module is mostly for sending DBIx::Class paginated data to ExtJS
   based javascript code.

METHODS
 ext_paginate
     my $json      = ext_paginate($resultset, { root => 'root' });
     my $json_str  = json_encode($json);

  Description
   Returns a structure like the following from the ResultSet:

     {
        data  => \@results,
        total => $count_before_pagination
     }

  Valid arguments are:
     rs - paginated ResultSet to get the data from
     (optional) coderef - any valid scalar that can be called on the result object
     (optional) config - passed to ext_parcel

 ext_parcel
     my $items    = [qw{foo bar baz}];
     my $total    = 7;
     my $json     = $self->ext_parcel($data, $total, { root => 'root' });
     my $json_str = to_json($json);

  Description
   Returns a structure like the following:

     {
        data  => [@{$items}],
        total => $total || scalar @{$items}
     }

  Valid arguments are:
     list  - a list of anything you want to be in the data structure
     total - whatever you want to say the total is.  Defaults to size of
             the list passed in.
     (optional) config - a hashref containing root or total_property.  root is the
             key used to store the data under, total_property is the key used to
             store the total under

SEE ALSO
   Catalyst::TraitFor::Controller::DoesExtPaging, which this module was
   factored out of.

AUTHOR
   Arthur Axel "fREW" Schmidt <[email protected]>

COPYRIGHT AND LICENSE
   This software is copyright (c) 2015 by Arthur Axel "fREW" Schmidt.

   This is free software; you can redistribute it and/or modify it under
   the same terms as the Perl 5 programming language system itself.