1 package Reaction::UI::ViewPort::SearchableListViewContainer;
4 #use aliased 'Reaction::InterfaceModel::Search::Spec', 'SearchSpec';
5 use aliased 'Reaction::InterfaceModel::Action::Search::UpdateSpec', 'UpdateSearchSpec';
6 use aliased 'Reaction::UI::ViewPort::ListViewWithSearch';
7 use aliased 'Reaction::UI::ViewPort::Action' => 'ActionVP';
8 use aliased 'Reaction::UI::ViewPort::Collection::Role::Pager', 'PagerRole';
10 use Method::Signatures::Simple;
12 use namespace::clean -except => 'meta';
14 extends 'Reaction::UI::ViewPort';
17 isa => ListViewWithSearch,
22 has 'search_form' => (isa => ActionVP, is => 'ro', required => 1);
24 override BUILDARGS => sub {
26 my $spec_event_id = $args->{location}.':search-spec';
27 my $spec_class = $args->{spec_class}
28 or confess "Argument spec_class is required";
29 my $action_class = $args->{action_class}
30 or confess "Argument action_class is required";
31 # TODO: how do we autodiscover spec classes?
32 # $spec_class =~ s/^::/${\SearchSpec}::/;
33 Class::MOP::load_class($spec_class);
35 if (my $string = $args->{ctx}->req->query_params->{$spec_event_id}) {
36 $spec_class->from_string($string, $args->{spec}||{});
38 $spec_class->new($args->{spec}||{});
41 my $listview_location = $args->{location}.'-listview';
42 # should this maybe use the listview class in $args->{listview}?
43 my $listview = $args->{listview} = ListViewWithSearch->new(
45 layout => 'list_view',
47 location => $listview_location,
49 # same as with listview wrt. class name
50 $args->{search_form} = ActionVP->new(
51 model => $action_class->new(target_model => $spec),
52 location => $args->{location}.'-search_form',
53 apply_label => 'search',
55 on_apply_callback => sub {
57 my $req = $vp->ctx->req;
58 my $new_uri = $req->uri->clone;
59 my %query = %{$req->query_parameters};
60 delete @query{grep /^\Q${listview_location}\E/, keys %query};
61 $query{$spec_event_id} = $spec->to_string;
62 $new_uri->query_form(\%query);
64 $listview->clear_page;
65 $listview->clear_order_by;
67 %{$args->{search}||{}}
72 override child_event_sinks => method () {
73 ((map $self->$_, 'listview', 'search_form'), super);