do not include .git directory
[catagits/Reaction.git] / lib / Reaction / UI / Widget / Field / Mutable / ChooseMany.pm
1 package Reaction::UI::Widget::Field::Mutable::ChooseMany;
2
3 use Reaction::UI::WidgetClass;
4
5 use namespace::clean -except => [ qw(meta) ];
6 extends 'Reaction::UI::Widget::Field::Mutable';
7
8
9
10 implements fragment action_buttons {
11   foreach my $event (
12     qw(add_all_values do_add_values do_remove_values remove_all_values)
13       ) {
14     arg "event_id_${event}" => event_id $event;
15   }
16 };
17
18 implements fragment current_values {
19   my $current_choices = $_{viewport}->current_value_choices;
20   if( @$current_choices ){
21     arg field_name => event_id 'value';
22     render hidden_value => over $current_choices;
23   } else {
24     arg field_name => event_id 'no_current_value';
25     arg '_' => {value => 1};
26     render 'hidden_value';
27   }
28 };
29
30 implements fragment selected_values {
31   arg event_id_remove_values => event_id 'remove_values';
32   render value_option => over $_{viewport}->current_value_choices;
33 };
34
35 implements fragment available_values {
36   arg event_id_add_values => event_id 'add_values';
37   render value_option => over $_{viewport}->available_value_choices;
38 };
39
40 implements fragment value_option {
41   arg option_name => $_->{name};
42   arg option_value => $_->{value};
43 };
44
45 implements fragment hidden_value {
46   arg hidden_value => $_->{value};
47 };
48
49 __PACKAGE__->meta->make_immutable;
50
51
52 1;
53
54 __END__;
55
56 =head1 NAME
57
58 Reaction::UI::Widget::Field::Mutable::ChooseMany - Choose a number of items
59
60 =head1 DESCRIPTION
61
62 See L<Reaction::UI::Widget::Field::Mutable>
63
64 This needs a refactor to not be tied to a dual select box, but ENOTIME
65
66 =head1 FRAGMENTS
67
68 =head2 action_buttons
69
70 Sets the following events by the name C<event_id_$name> as arguments with their viewport 
71 event ids as values:
72
73   add_all_values
74   do_add_values
75   do_remove_values
76   remove_all_values
77
78 =head2 current_values
79
80 Renders the C<hidden_value> fragment to store the currently selected values either once
81 for every item in the viewport's C<current_value_choices> (with the C<field_name> argument
82 set to the viewport's event id for C<value>. Or, if no current values exist, uses the 
83 C<no_current_value> event id from the viewport and sets the topic argument C<_> to 1.
84
85 =head2 selected_values
86
87 Sets C<event_id_remove_values> to the viewport's event id for C<remove_values> and renders
88 the C<value_option> fragment over the viewport's C<current_value_choices>.
89
90 =head2 available_values
91
92 Sets C<event_id_add_values> to the viewport's event id for C<add_values> and renders
93 the C<value_option> fragment over the viewport's C<available_value_choices>.
94
95 =head2 value_option
96
97 Sets the C<option_name> argument to the current topic argument's C<name> key and the
98 C<option_value> to the current topic argument's C<value> key.
99
100 =head2 hidden_value
101
102 Sets C<hidden_value> to the current topic's C<value> key.
103
104 =head2 field
105
106 renders C<available_values>, C<action_buttons>, C<selected_values> and C<current_values>
107
108 =head1 LAYOUT SETS
109
110 =head2 base
111
112   share/skin/base/layout/field/mutable/choose_many.tt
113
114 This layout set provides a table containing two lists separated by action buttons that
115 allow the user to add values from the available list to the selected list.
116
117 =head2 default
118
119   share/skin/default/layout/field/mutable/choose_many.tt
120
121 Same as in the C<base> skin, except that after each action button a C<br> element will
122 be rendered.
123
124 =head1 AUTHORS
125
126 See L<Reaction::Class> for authors.
127
128 =head1 LICENSE
129
130 See L<Reaction::Class> for the license.
131
132 =cut