order_by fixes including enable_order_by and coerce_order_by
[catagits/Reaction.git] / lib / Reaction / UI / ViewPort / Collection / Role / Order.pm
CommitLineData
ddccc6a2 1package Reaction::UI::ViewPort::Collection::Role::Order;
e22de101 2
3use Reaction::Role;
4
81393881 5use namespace::clean -except => [ qw(meta) ];
e22de101 6
c1b16a7d 7has enable_order_by => (is => 'rw', isa => 'ArrayRef');
8has coerce_order_by => (isa => 'HashRef', is => 'rw');
9
10has order_by => (
11 isa => 'Str',
12 is => 'rw',
13 trigger_adopt('order_by'),
14 clearer => 'clear_order_by'
15);
16
17has order_by_desc => (
18 isa => 'Int',
19 is => 'rw',
20 trigger_adopt('order_by'),
21 lazy_build => 1
22);
23
24sub _build_order_by_desc { 0 }
e22de101 25
81393881 26sub adopt_order_by {
27 shift->clear_current_collection;
c1b16a7d 28}
29
30sub can_order_by {
31 my ($self,$order_by) = @_;
32 return 1 unless $self->has_enable_order_by;
33 return scalar grep { $order_by eq $_ } @{ $self->enable_order_by };
34}
35
36sub _order_search_attrs {
37 my $self = shift;
38 my %attrs;
39 if ($self->has_order_by) {
40 my $order_by = $self->order_by;
41 if( $self->has_coerce_order_by ){
42 $order_by = $self->coerce_order_by->{$order_by}
43 if exists $self->coerce_order_by->{$order_by};
44 }
45 my $key = $self->order_by_desc ? '-desc' : '-asc';
46 $attrs{order_by} = { $key => $order_by };
47 }
48 return \%attrs;
49}
b8faba69 50
cf6fb234 51after clear_order_by => sub {
52 my ($self) = @_;
53 $self->order_by_desc(0);
54 $self->clear_current_collection;
55};
56
81393881 57around _build_current_collection => sub {
58 my $orig = shift;
59 my ($self) = @_;
60 my $collection = $orig->(@_);
c1b16a7d 61 return $collection->where(undef, $self->_order_search_attrs);
81393881 62};
e22de101 63
81393881 64around accept_events => sub { ('order_by', 'order_by_desc', shift->(@_)); };
e22de101 65
e22de101 66
e22de101 67
681;