Commit | Line | Data |
e984a788 |
1 | package Reaction::UI::ViewPort::Object::Mutable; |
2 | |
3 | use Reaction::Class; |
4 | |
5 | use aliased 'Reaction::UI::ViewPort::Object'; |
6 | use aliased 'Reaction::UI::ViewPort::Field::Mutable::Text'; |
7 | use aliased 'Reaction::UI::ViewPort::Field::Mutable::Array'; |
8 | use aliased 'Reaction::UI::ViewPort::Field::Mutable::String'; |
9 | use aliased 'Reaction::UI::ViewPort::Field::Mutable::Number'; |
10 | use aliased 'Reaction::UI::ViewPort::Field::Mutable::Integer'; |
11 | use aliased 'Reaction::UI::ViewPort::Field::Mutable::Boolean'; |
12 | use aliased 'Reaction::UI::ViewPort::Field::Mutable::Password'; |
13 | use aliased 'Reaction::UI::ViewPort::Field::Mutable::DateTime'; |
14 | use aliased 'Reaction::UI::ViewPort::Field::Mutable::ChooseOne'; |
15 | use aliased 'Reaction::UI::ViewPort::Field::Mutable::ChooseMany'; |
16 | use aliased 'Reaction::UI::ViewPort::Field::Mutable::File'; |
17 | |
18 | use namespace::clean -except => [ qw(meta) ]; |
19 | extends Object; |
20 | |
21 | #this her for now. mutable fields need an action to build correctly |
22 | has model => ( |
23 | is => 'ro', |
24 | isa => 'Reaction::InterfaceModel::Action', |
25 | required => 1, |
26 | ); |
27 | |
029c34a8 |
28 | sub is_modified { |
29 | my $self = shift; |
30 | foreach my $field (@{$self->fields}) { |
31 | return 1 if $field->is_modified; |
32 | } |
33 | return 0; |
34 | } |
35 | |
e984a788 |
36 | sub _build_fields_for_type_Num { |
37 | my ($self, $attr, $args) = @_; |
38 | $self->_build_simple_field(attribute => $attr, class => Number, %$args); |
39 | } |
40 | |
41 | sub _build_fields_for_type_Int { |
42 | my ($self, $attr, $args) = @_; |
43 | $self->_build_simple_field(attribute => $attr, class => Integer, %$args); |
44 | } |
45 | |
46 | sub _build_fields_for_type_Bool { |
47 | my ($self, $attr, $args) = @_; |
48 | $self->_build_simple_field(attribute => $attr, class => Boolean, %$args); |
49 | } |
50 | |
51 | sub _build_fields_for_type_Reaction_Types_Core_SimpleStr { |
52 | my ($self, $attr, $args) = @_; |
53 | $self->_build_simple_field(attribute => $attr, class => String, %$args); |
54 | } |
55 | |
56 | sub _build_fields_for_type_Reaction_Types_File_File { |
57 | my ($self, $attr, $args) = @_; |
58 | $self->_build_simple_field(attribute => $attr, class => File, %$args); |
59 | } |
60 | |
61 | sub _build_fields_for_type_Str { |
62 | my ($self, $attr, $args) = @_; |
63 | if ($attr->has_valid_values) { # There's probably a better way to do this |
64 | $self->_build_simple_field(attribute => $attr, class => ChooseOne, %$args); |
65 | } else { |
66 | $self->_build_simple_field(attribute => $attr, class => Text, %$args); |
67 | } |
68 | } |
69 | |
70 | sub _build_fields_for_type_Reaction_Types_Core_Password { |
71 | my ($self, $attr, $args) = @_; |
72 | $self->_build_simple_field(attribute => $attr, class => Password, %$args); |
73 | } |
74 | |
75 | sub _build_fields_for_type_Reaction_Types_DateTime_DateTime { |
76 | my ($self, $attr, $args) = @_; |
77 | $self->_build_simple_field(attribute => $attr, class => DateTime, %$args); |
78 | } |
79 | |
80 | sub _build_fields_for_type_Enum { |
81 | my ($self, $attr, $args) = @_; |
82 | $self->_build_simple_field(attribute => $attr, class => ChooseOne, %$args); |
83 | } |
84 | |
85 | #this needs to be fixed. somehow. beats the shit our of me. really. |
86 | #implements build_fields_for_type_Reaction_InterfaceModel_Object => as { |
87 | sub _build_fields_for_type_DBIx_Class_Row { |
88 | my ($self, $attr, $args) = @_; |
89 | $self->_build_simple_field(attribute => $attr, class => ChooseOne, %$args); |
90 | } |
91 | |
92 | sub _build_fields_for_type_ArrayRef { |
93 | my ($self, $attr, $args) = @_; |
94 | if ($attr->has_valid_values) { |
95 | $self->_build_simple_field(attribute => $attr, class => ChooseMany, %$args); |
96 | } else { |
97 | $self->_build_simple_field |
98 | ( |
99 | attribute => $attr, |
100 | class => Array, |
101 | layout => 'field/mutable/hidden_array', |
102 | %$args); |
103 | } |
104 | } |
105 | |
baee102d |
106 | sub _build_fields_for_type_MooseX_Types_Common_String_SimpleStr { |
107 | my ($self, $attr, $args) = @_; |
108 | $self->_build_simple_field(attribute => $attr, class => String, %$args); |
109 | } |
110 | |
111 | sub _build_fields_for_type_MooseX_Types_Common_String_Password { |
112 | my ($self, $attr, $args) = @_; |
113 | $self->_build_simple_field(attribute => $attr, class => Password, %$args); |
114 | } |
115 | |
116 | sub _build_fields_for_type_MooseX_Types_DateTime_DateTime { |
117 | my ($self, $attr, $args) = @_; |
118 | $self->_build_simple_field(attribute => $attr, class => DateTime, %$args); |
119 | } |
120 | |
121 | sub _build_fields_for_type_DateTime { |
122 | my ($self, $attr, $args) = @_; |
123 | $self->_build_simple_field(attribute => $attr, class => DateTime, %$args); |
124 | } |
125 | |
e984a788 |
126 | __PACKAGE__->meta->make_immutable; |
127 | |
128 | 1; |
129 | |
130 | __END__; |
131 | |
132 | =head1 NAME |
133 | |
63bb30b4 |
134 | Reaction::UI::ViewPort::Object::Mutable - Allow the user to to perform an InterfaceModel Action |
e984a788 |
135 | |
136 | =head1 SYNOPSIS |
137 | |
63bb30b4 |
138 | use aliased 'Reaction::UI::ViewPort::Object::Mutable'; |
139 | |
140 | ... |
141 | $controller->push_viewport(Mutable, |
142 | model => $interface_model_action, |
143 | ); |
144 | |
e984a788 |
145 | =head1 DESCRIPTION |
146 | |
147 | This subclass of L<Reaction::UI::ViewPort::Object> is used for rendering a |
148 | collection of C<Reaction::UI::ViewPort::Field::Mutable::*> objects for user editing. |
149 | |
150 | =head1 ATTRIBUTES |
151 | |
152 | =head2 model |
153 | |
154 | L<Reaction::InterfaceModel::Action> |
155 | |
156 | =head1 METHODS |
157 | |
63bb30b4 |
158 | =head2 is_modified |
159 | |
160 | Returns true if any of the L<fields|Reaction::UI::ViewPort::Object/fields> has been |
161 | modified. |
162 | |
163 | =head1 INTERNAL METHODS |
164 | |
165 | The builder methods are resolved in the same way as described in L<Reaction::UI::ViewPort::Object>, |
166 | but they create L<Reaction::UI::ViewPort::Field::Mutable> objects. |
167 | |
168 | =head2 Mutable Field Types |
169 | |
170 | L<Text|Reaction::UI::ViewPort::Field::Mutable::Text>, |
171 | L<Array|Reaction::UI::ViewPort::Field::Mutable::Array>, |
172 | L<String|Reaction::UI::ViewPort::Field::Mutable::String>, |
173 | L<Number|Reaction::UI::ViewPort::Field::Mutable::Number>, |
174 | L<Integer|Reaction::UI::ViewPort::Field::Mutable::Integer>, |
175 | L<Boolean|Reaction::UI::ViewPort::Field::Mutable::Boolean>, |
176 | L<Password|Reaction::UI::ViewPort::Field::Mutable::Password>, |
177 | L<DateTime|Reaction::UI::ViewPort::Field::Mutable::DateTime>, |
178 | L<ChooseOne|Reaction::UI::ViewPort::Field::Mutable::ChooseOne>, |
179 | L<ChooseMany|Reaction::UI::ViewPort::Field::Mutable::ChooseMany>, |
180 | L<Files|Reaction::UI::ViewPort::Field::Mutable::File> |
181 | |
e984a788 |
182 | =head2 _build_fields_for_type_Num |
183 | |
184 | =head2 _build_fields_for_type_Int |
185 | |
186 | =head2 _build_fields_for_type_Bool |
187 | |
188 | =head2 _build_fields_for_type_Reaction_Types_Core_SimpleStr |
189 | |
190 | =head2 _build_fields_for_type_Reaction_Types_File_File |
191 | |
192 | =head2 _build_fields_for_type_Str |
193 | |
194 | =head2 _build_fields_for_type_Reaction_Types_Core_Password |
195 | |
196 | =head2 _build_fields_for_type_Reaction_Types_DateTime_DateTime |
197 | |
198 | =head2 _build_fields_for_type_Enum |
199 | |
200 | =head2 _build_fields_for_type_DBIx_Class_Row |
201 | |
202 | =head2 _build_fields_for_type_ArrayRef |
203 | |
204 | =head1 SEE ALSO |
205 | |
206 | L<Reaction::UI::ViewPort::Object> |
207 | |
208 | L<Reaction::UI::ViewPort> |
209 | |
210 | L<Reaction::InterfaceModel::Action> |
211 | |
212 | =head1 AUTHORS |
213 | |
214 | See L<Reaction::Class> for authors. |
215 | |
216 | =head1 LICENSE |
217 | |
218 | See L<Reaction::Class> for the license. |
219 | |
220 | =cut |
221 | |