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 <frioux+cpan@gmail.com>

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.

