blob: 97f5a44d4ab9eb9b653cf593a1b131c6e37fbce4 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
|
package Reaction::UI::ViewPort::Action;
use Reaction::Class;
use MooseX::Types::Moose qw/Int Str/;
use Reaction::Types::Core qw/NonEmptySimpleStr/;
use namespace::clean -except => [ qw(meta) ];
extends 'Reaction::UI::ViewPort::Object::Mutable';
with 'Reaction::UI::ViewPort::Action::Role::OK';
has message => (is => 'rw', isa => Str);
has error_message => (is => 'rw', isa => Str);
#this has to fucking go. it BLOWS.
has method => (
is => 'rw',
isa => NonEmptySimpleStr,
default => sub { 'post' }
);
has changed => (
is => 'rw',
isa => Int,
reader => 'is_changed',
default => sub{0}
);
sub can_apply {
my ($self) = @_;
foreach my $field ( @{ $self->fields } ) {
return 0 if $field->needs_sync;
# if e.g. a datetime field has an invalid value that can't be re-assembled
# into a datetime object, the action may be in a consistent state but
# not synchronized from the fields; in this case, we must not apply
}
return $self->model->can_apply;
}
sub do_apply {
shift->model->do_apply;
}
after apply_child_events => sub {
# interrupt here because fields will have been updated
my ($self) = @_;
$self->sync_action_from_fields;
};
sub sync_action_from_fields {
my ($self) = @_;
foreach my $field (@{$self->fields}) {
$field->sync_to_action; # get the field to populate the $action if possible
}
$self->model->sync_all;
foreach my $field (@{$self->fields}) {
$field->sync_from_action; # get errors from $action if applicable
}
}
__PACKAGE__->meta->make_immutable;
1;
__END__;
=head1 NAME
Reaction::UI::ViewPort::Action
=head1 SYNOPSIS
=head1 DESCRIPTION
This subclass of L<Reaction::UI::ViewPort::Object::Mutable> is used for
rendering a complete form supporting Apply, Close and OK.
=head1 ATTRIBUTES
=head2 method
post / get
=head2 changed
Returns true if a field has been edited.
=head1 METHODS
=head2 can_apply
=head2 do_apply
=head2 sync_action_from_fields
=head1 SEE ALSO
L<Reaction::UI::ViewPort>
L<Reaction::UI::ViewPort::Object>
L<Reaction::UI::ViewPort::Object::Mutable>
L<Reaction::InterfaceModel::Action::Role::Apply>
L<Reaction::InterfaceModel::Action::Role::Close>
L<Reaction::InterfaceModel::Action::Role::OK>
=head1 AUTHORS
See L<Reaction::Class> for authors.
=head1 LICENSE
See L<Reaction::Class> for the license.
=cut
|