1 package Reaction::UI::ViewPort::Collection::Role::Order;
5 use namespace::clean -except => [ qw(meta) ];
7 has enable_order_by => (is => 'rw', isa => 'ArrayRef');
8 has coerce_order_by => (isa => 'HashRef', is => 'rw');
13 trigger_adopt('order_by'),
14 clearer => 'clear_order_by'
17 has order_by_desc => (
20 trigger_adopt('order_by'),
24 sub _build_order_by_desc { 0 }
27 shift->clear_current_collection;
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 };
36 sub _order_search_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};
45 my $key = $self->order_by_desc ? '-desc' : '-asc';
46 $attrs{order_by} = { $key => $order_by };
51 after clear_order_by => sub {
53 $self->order_by_desc(0);
54 $self->clear_current_collection;
57 around _build_current_collection => sub {
60 my $collection = $orig->(@_);
61 return $collection->where(undef, $self->_order_search_attrs);
64 around accept_events => sub { ('order_by', 'order_by_desc', shift->(@_)); };