diff options
author | groditi <groditi@03d0b0b2-0e1a-0410-a411-fdb2f4bd65d7> | 2007-12-31 22:16:22 +0000 |
---|---|---|
committer | groditi <groditi@03d0b0b2-0e1a-0410-a411-fdb2f4bd65d7> | 2007-12-31 22:16:22 +0000 |
commit | 2f670e13aa8f30bbf6ba910f2d8ef97aa8a9e3e5 (patch) | |
tree | 512313d4cac594a322e3d1e2d4c81e4736a50567 | |
parent | 5353e3f64517073ba9f06e732dd610fd2e52a01f (diff) | |
download | reaction-2f670e13aa8f30bbf6ba910f2d8ef97aa8a9e3e5.tar.gz reaction-2f670e13aa8f30bbf6ba910f2d8ef97aa8a9e3e5.zip |
renaming widget packages to match new viewports
34 files changed, 253 insertions, 683 deletions
diff --git a/lib/Reaction/UI/ViewPort/Action.pm b/lib/Reaction/UI/ViewPort/Action.pm index d02719d..e7a21a5 100644 --- a/lib/Reaction/UI/ViewPort/Action.pm +++ b/lib/Reaction/UI/ViewPort/Action.pm @@ -16,7 +16,7 @@ use aliased 'Reaction::UI::ViewPort::Field::Mutable::ChooseMany'; #use aliased 'Reaction::UI::ViewPort::InterfaceModel::Field::Mutable::File'; #use aliased 'Reaction::UI::ViewPort::InterfaceModel::Field::Mutable::TimeRange'; -class ActionForm is 'Reaction::UI::ViewPort', which { +class Action is 'Reaction::UI::ViewPort::Object', which { has '+model' => (isa => 'Reaction::InterfaceModel::Action'); has next_action => (is => 'rw', isa => 'ArrayRef'); @@ -189,7 +189,7 @@ Reaction::UI::ViewPort::InterfaceModel::Action =head1 SYNOPSIS - use aliased 'Reaction::UI::ViewPort::ActionForm'; + use aliased 'Reaction::UI::ViewPort::Action'; $self->push_viewport(Action, layout => 'register', diff --git a/lib/Reaction/UI/ViewPort/ActionForm.pm b/lib/Reaction/UI/ViewPort/ActionForm.pm deleted file mode 100644 index 484b5c6..0000000 --- a/lib/Reaction/UI/ViewPort/ActionForm.pm +++ /dev/null @@ -1,395 +0,0 @@ -package Reaction::UI::ViewPort::ActionForm; - -use Reaction::Class; - -use aliased 'Reaction::UI::ViewPort::Field::Text'; -use aliased 'Reaction::UI::ViewPort::Field::Number'; -use aliased 'Reaction::UI::ViewPort::Field::Boolean'; -use aliased 'Reaction::UI::ViewPort::Field::File'; -use aliased 'Reaction::UI::ViewPort::Field::String'; -use aliased 'Reaction::UI::ViewPort::Field::Password'; -use aliased 'Reaction::UI::ViewPort::Field::DateTime'; -use aliased 'Reaction::UI::ViewPort::Field::ChooseOne'; -use aliased 'Reaction::UI::ViewPort::Field::ChooseMany'; -use aliased 'Reaction::UI::ViewPort::Field::HiddenArray'; -use aliased 'Reaction::UI::ViewPort::Field::TimeRange'; - -class ActionForm is 'Reaction::UI::ViewPort', which { - has action => ( - isa => 'Reaction::InterfaceModel::Action', is => 'ro', required => 1 - ); - - has ordered_fields => (is => 'rw', isa => 'ArrayRef', lazy_build => 1); - - has _field_map => ( - isa => 'HashRef', is => 'rw', init_arg => 'fields', lazy_build => 1, - ); - - has changed => ( - isa => 'Int', is => 'rw', reader => 'is_changed', default => sub { 0 } - ); - - has next_action => ( - isa => 'ArrayRef', is => 'rw', required => 0, predicate => 'has_next_action' - ); - - has on_apply_callback => ( - isa => 'CodeRef', is => 'rw', required => 0, - predicate => 'has_on_apply_callback' - ); - - has ok_label => ( - isa => 'Str', is => 'rw', required => 1, default => sub { 'ok' } - ); - - has apply_label => ( - isa => 'Str', is => 'rw', required => 1, default => sub { 'apply' } - ); - - has close_label => (isa => 'Str', is => 'rw', lazy_fail => 1); - - has close_label_close => ( - isa => 'Str', is => 'rw', required => 1, default => sub { 'close' } - ); - - has close_label_cancel => ( - isa => 'Str', is => 'rw', required => 1, default => sub { 'cancel' } - ); - - sub fields { shift->_field_map } - - implements BUILD => as { - my ($self, $args) = @_; - unless ($self->_has_field_map) { - my @field_map; - my $action = $self->action; - foreach my $attr ($action->parameter_attributes) { - push(@field_map, $self->_build_fields_for($attr => $args)); - } - $self->_field_map({ @field_map }); - } - $self->close_label($self->close_label_close); - }; - - implements _build_fields_for => as { - my ($self, $attr, $args) = @_; - my $attr_name = $attr->name; - #TODO: DOCUMENT ME!!!!!!!!!!!!!!!!! - my $builder = "_build_fields_for_name_${attr_name}"; - my @fields; - if ($self->can($builder)) { - @fields = $self->$builder($attr, $args); # re-use coderef from can() - } elsif ($attr->has_type_constraint) { - my $constraint = $attr->type_constraint; - my $base_name = $constraint->name; - my $tried_isa = 0; - CONSTRAINT: while (defined($constraint)) { - my $name = $constraint->name; - $name = $attr->_isa_metadata if($name eq '__ANON__'); - if (eval { $name->can('meta') } && !$tried_isa++) { - foreach my $class ($name->meta->class_precedence_list) { - my $mangled_name = $class; - $mangled_name =~ s/:+/_/g; - my $builder = "_build_fields_for_type_${mangled_name}"; - if ($self->can($builder)) { - @fields = $self->$builder($attr, $args); - last CONSTRAINT; - } - } - } - if (defined($name)) { - unless (defined($base_name)) { - $base_name = "(anon subtype of ${name})"; - } - my $mangled_name = $name; - $mangled_name =~ s/:+/_/g; - my $builder = "_build_fields_for_type_${mangled_name}"; - if ($self->can($builder)) { - @fields = $self->$builder($attr, $args); - last CONSTRAINT; - } - } - $constraint = $constraint->parent; - } - if (!defined($constraint)) { - confess "Can't build field ${attr_name} of type ${base_name} without $builder method or _build_fields_for_type_<type> method for type or any supertype"; - } - } else { - confess "Can't build field ${attr} without $builder method or type constraint"; - } - return @fields; - }; - - implements _build_field_map => as { - confess "Lazy field map building not supported by default"; - }; - - implements _build_ordered_fields => as { - my $self = shift; - my $ordered = $self->sort_by_spec($self->column_order, [keys %{$self->_field_map}]); - return [@{$self->_field_map}{@$ordered}]; - }; - - implements can_apply => as { - my ($self) = @_; - foreach my $field ( @{ $self->ordered_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->action->can_apply; - }; - - implements do_apply => as { - my $self = shift; - return $self->action->do_apply; - }; - - implements ok => as { - my $self = shift; - if ($self->apply(@_)) { - $self->close(@_); - } - }; - - implements apply => as { - my $self = shift; - if ($self->can_apply && (my $result = $self->do_apply)) { - $self->changed(0); - $self->close_label($self->close_label_close); - $self->on_apply_callback->($self => $result) if $self->has_on_apply_callback; - return 1; - } else { - $self->changed(1); - $self->close_label($self->close_label_cancel); - return 0; - } - }; - - implements close => as { - my $self = shift; - my ($controller, $name, @args) = @{$self->next_action}; - $controller->pop_viewport; - $controller->$name($self->action->ctx, @args); - }; - - sub can_close { 1 } - - override accept_events => sub { - (($_[0]->has_next_action ? ('ok', 'close') : ()), 'apply', super()); - }; # can't do a close-type operation if there's nowhere to go afterwards - - override child_event_sinks => sub { - my ($self) = @_; - return ((grep { ref($_) =~ 'Hidden' } values %{$self->_field_map}), - (grep { ref($_) !~ 'Hidden' } values %{$self->_field_map}), - super()); - }; - - after apply_child_events => sub { - # interrupt here because fields will have been updated - my ($self) = @_; - $self->sync_action_from_fields; - }; - - implements sync_action_from_fields => as { - my ($self) = @_; - my $field_map = $self->_field_map; - my @fields = values %{$field_map}; - foreach my $field (@fields) { - $field->sync_to_action; # get the field to populate the $action if possible - } - $self->action->sync_all; - foreach my $field (@fields) { - $field->sync_from_action; # get errors from $action if applicable - } - }; - - implements _build_simple_field => as { - my ($self, $class, $attr, $args) = @_; - my $attr_name = $attr->name; - my %extra; - if (my $config = $args->{Field}{$attr_name}) { - %extra = %$config; - } - my $field = $class->new( - action => $self->action, - attribute => $attr, - name => $attr->name, - location => join('-', $self->location, 'field', $attr->name), - ctx => $self->ctx, - %extra - ); - return ($attr_name => $field); - }; - - implements _build_fields_for_type_Num => as { - my ($self, $attr, $args) = @_; - return $self->_build_simple_field(Number, $attr, $args); - }; - - implements _build_fields_for_type_Int => as { - my ($self, $attr, $args) = @_; - return $self->_build_simple_field(Number, $attr, $args); - }; - - implements _build_fields_for_type_Bool => as { - my ($self, $attr, $args) = @_; - return $self->_build_simple_field(Boolean, $attr, $args); - }; - - implements _build_fields_for_type_File => as { - my ($self, $attr, $args) = @_; - return $self->_build_simple_field(File, $attr, $args); - }; - - implements _build_fields_for_type_Str => as { - my ($self, $attr, $args) = @_; - if ($attr->has_valid_values) { # There's probably a better way to do this - return $self->_build_simple_field(ChooseOne, $attr, $args); - } - return $self->_build_simple_field(Text, $attr, $args); - }; - - implements _build_fields_for_type_SimpleStr => as { - my ($self, $attr, $args) = @_; - return $self->_build_simple_field(String, $attr, $args); - }; - - implements _build_fields_for_type_Password => as { - my ($self, $attr, $args) = @_; - return $self->_build_simple_field(Password, $attr, $args); - }; - - implements _build_fields_for_type_DateTime => as { - my ($self, $attr, $args) = @_; - return $self->_build_simple_field(DateTime, $attr, $args); - }; - - implements _build_fields_for_type_Enum => as { - my ($self, $attr, $args) = @_; - return $self->_build_simple_field(ChooseOne, $attr, $args); - }; - - #implements build_fields_for_type_Reaction_InterfaceModel_Object => as { - implements _build_fields_for_type_DBIx_Class_Row => as { - my ($self, $attr, $args) = @_; - return $self->_build_simple_field(ChooseOne, $attr, $args); - }; - - implements _build_fields_for_type_ArrayRef => as { - my ($self, $attr, $args) = @_; - if ($attr->has_valid_values) { - return $self->_build_simple_field(ChooseMany, $attr, $args) - } else { - return $self->_build_simple_field(HiddenArray, $attr, $args) - } - }; - - implements _build_fields_for_type_DateTime_Spanset => as { - my ($self, $attr, $args) = @_; - return $self->_build_simple_field(TimeRange, $attr, $args); - }; - - no Moose; - - no strict 'refs'; - delete ${__PACKAGE__ . '::'}{inner}; - -}; - - 1; - -=head1 NAME - -Reaction::UI::ViewPort::ActionForm - -=head1 SYNOPSIS - - use aliased 'Reaction::UI::ViewPort::ActionForm'; - - $self->push_viewport(ActionForm, - layout => 'register', - action => $action, - next_action => [ $self, 'redirect_to', 'accounts', $c->req->captures ], - ctx => $c, - column_order => [ - qw / contact_title company_name email address1 address2 address3 - city country post_code telephone mobile fax/ ], - ); - -=head1 DESCRIPTION - -This subclass of viewport is used for rendering a collection of -L<Reaction::UI::ViewPort::Field> objects for user editing. - -=head1 ATTRIBUTES - -=head2 action - -L<Reaction::InterfaceModel::Action> - -=head2 ok_label - -Default: 'ok' - -=head2 apply_label - -Default: 'apply' - -=head2 close_label_close - -Default: 'close' - -=head2 close_label_cancel - -This label is only shown when C<changed> is true. - -Default: 'cancel' - -=head2 fields - -=head2 can_apply - -=head2 can_close - -=head2 changed - -Returns true if a field has been edited. - -=head2 next_action - -=head2 on_apply_callback - -CodeRef. - -=head1 METHODS - -=head2 ok - -Calls C<apply>, and then C<close> if successful. - -=head2 close - -Pop viewport and proceed to C<next_action>. - -=head2 apply - -Attempt to save changes and update C<changed> attribute if required. - -=head1 SEE ALSO - -L<Reaction::UI::ViewPort> - -L<Reaction::InterfaceModel::Action> - -=head1 AUTHORS - -See L<Reaction::Class> for authors. - -=head1 LICENSE - -See L<Reaction::Class> for the license. - -=cut diff --git a/lib/Reaction/UI/Widget/ActionForm.pm b/lib/Reaction/UI/Widget/Action.pm index 858d218..c7e1e04 100644 --- a/lib/Reaction/UI/Widget/ActionForm.pm +++ b/lib/Reaction/UI/Widget/Action.pm @@ -1,20 +1,20 @@ -package Reaction::UI::Widget::ActionForm; +package Reaction::UI::Widget::Action; use Reaction::UI::WidgetClass; -class ActionForm, which { +class Action is 'Reaction::UI::Widget::Object', which { - #implements fragment widget { + #before fragment widget { # arg form_id => $_{viewport}->location; #}; - implements fragment field_list { - render field => over $_{viewport}->ordered_fields; - }; + #implements fragment field_list { + # render field => over $_{viewport}->ordered_fields; + #}; - implements fragment field { - render 'viewport'; - }; + #implements fragment field { + # render 'viewport'; + #}; implements fragment ok_button_fragment { if (grep { $_ eq 'ok' } $_{viewport}->accept_events) { @@ -48,7 +48,7 @@ __END__; =head1 NAME -Reaction::UI::Widget::ActionForm +Reaction::UI::Widget::Action =head1 DESCRIPTION @@ -56,8 +56,6 @@ Reaction::UI::Widget::ActionForm =head2 widget -Additional variables available in topic hash: "viewport". - Renders "header", "field_list", "buttons" and "footer" =head2 field_list diff --git a/lib/Reaction/UI/Widget/GridView/Action.pm b/lib/Reaction/UI/Widget/Action/Link.pm index d5336f3..4c766b2 100644 --- a/lib/Reaction/UI/Widget/GridView/Action.pm +++ b/lib/Reaction/UI/Widget/Action/Link.pm @@ -1,8 +1,9 @@ -package Reaction::UI::Widget::GridView::Action; +package Reaction::UI::Widget::Action::Link; use Reaction::UI::WidgetClass; -class Action, which { +#I want to change this at some point. +class Link, which { before fragment widget { arg uri => $_{viewport}->uri; diff --git a/lib/Reaction/UI/Widget/Collection.pm b/lib/Reaction/UI/Widget/Collection.pm new file mode 100644 index 0000000..65e9d64 --- /dev/null +++ b/lib/Reaction/UI/Widget/Collection.pm @@ -0,0 +1,19 @@ +package Reaction::UI::Widget::Collection; + +use Reaction::UI::WidgetClass; + +class Collection, which { + + implements fragment members { + render member => over $_{viewport}->members; + }; + + implements fragment member { + render 'viewport'; + }; + +}; + +1; + +__END__; diff --git a/lib/Reaction/UI/Widget/GridView.pm b/lib/Reaction/UI/Widget/Collection/Grid.pm index c7c2530..13c59be 100644 --- a/lib/Reaction/UI/Widget/GridView.pm +++ b/lib/Reaction/UI/Widget/Collection/Grid.pm @@ -1,22 +1,14 @@ -package Reaction::UI::Widget::GridView; +package Reaction::UI::Widget::Collection::Grid; use Reaction::UI::WidgetClass; -class GridView, which { +class Grid is 'Reaction::UI::Widget::Collection', which { implements fragment header_cells { arg 'labels' => $_{viewport}->field_labels; render header_cell => over $_{viewport}->field_order; }; - implements fragment body_rows { - render body_row => over $_{viewport}->entities; - }; - - implements fragment body_row { - render 'viewport'; - }; - implements fragment header_cell { arg label => $_{labels}->{$_}; }; diff --git a/lib/Reaction/UI/Widget/DisplayField/String.pm b/lib/Reaction/UI/Widget/Collection/Grid/Member.pm index 0301a15..a2a1b0a 100644 --- a/lib/Reaction/UI/Widget/DisplayField/String.pm +++ b/lib/Reaction/UI/Widget/Collection/Grid/Member.pm @@ -1,8 +1,9 @@ -package Reaction::UI::Widget::DisplayField::String; +package Reaction::UI::Widget::Collection::Grid::Member; use Reaction::UI::WidgetClass; -class String is 'Reaction::UI::Widget::DisplayField', which { +class Member is 'Reaction::UI::Widget::Object', which { + }; @@ -10,13 +11,14 @@ class String is 'Reaction::UI::Widget::DisplayField', which { __END__; + =head1 NAME -Reaction::UI::Widget::DisplayField::String +Reaction::UI::Widget::Collection::Grid::Member =head1 DESCRIPTION -See L<Reaction::UI::Widget::DisplayField> +=head1 FRAGMENTS =head1 AUTHORS diff --git a/lib/Reaction/UI/Widget/GridView/Entity/WithActions.pm b/lib/Reaction/UI/Widget/Collection/Grid/Member/WithActions.pm index 1684356..0ed6727 100644 --- a/lib/Reaction/UI/Widget/GridView/Entity/WithActions.pm +++ b/lib/Reaction/UI/Widget/Collection/Grid/Member/WithActions.pm @@ -1,13 +1,13 @@ -package Reaction::UI::Widget::GridView::Entity::WithActions; +package Reaction::UI::Widget::Collection::Grid::Member::WithActions; use Reaction::UI::WidgetClass; -class WithActions, is 'Reaction::UI::Widget::GridView::Entity', which { +class WithActions, is 'Reaction::UI::Widget::Collection::Grid::Member', which { implements fragment actions { render action => over $_{viewport}->actions; }; - + implements fragment action { render 'viewport'; }; diff --git a/lib/Reaction/UI/Widget/DisplayField.pm b/lib/Reaction/UI/Widget/DisplayField.pm deleted file mode 100644 index d881025..0000000 --- a/lib/Reaction/UI/Widget/DisplayField.pm +++ /dev/null @@ -1,48 +0,0 @@ -package Reaction::UI::Widget::DisplayField; - -use Reaction::UI::WidgetClass; - -class DisplayField, which { - - before fragment widget { - arg label => $_{viewport}->label; - arg value => $_{viewport}->value_string; - }; - -}; - -1; - -__END__; - -=head1 NAME - -Reaction::UI::Widget::DisplayField - -=head1 DESCRIPTION - -=head1 FRAGMENTS - -=head2 widget - -Additional variables available in topic hash: "viewport". - -Renders "label" and "field" - -=head2 field - - C<content> will contain the value, if any, of the field. - -=head2 label - - C<content> will contain the label, if any, of the field. - -=head1 AUTHORS - -See L<Reaction::Class> for authors. - -=head1 LICENSE - -See L<Reaction::Class> for the license. - -=cut diff --git a/lib/Reaction/UI/Widget/DisplayField/Boolean.pm b/lib/Reaction/UI/Widget/DisplayField/Boolean.pm deleted file mode 100644 index 76ba41f..0000000 --- a/lib/Reaction/UI/Widget/DisplayField/Boolean.pm +++ /dev/null @@ -1,35 +0,0 @@ -package Reaction::UI::Widget::DisplayField::Boolean; - -use Reaction::UI::WidgetClass; - -class Boolean is 'Reaction::UI::Widget::DisplayField', which { - -}; - -1; - -__END__; - -=head1 NAME - -Reaction::UI::Widget::DisplayField::Boolean - -=head1 DESCRIPTION - -See L<Reaction::UI::Widget::DisplayField> - -=head1 FRAGMENTS - -=head2 value - -C<content> contains the viewport's value_string - -=head1 AUTHORS - -See L<Reaction::Class> for authors. - -=head1 LICENSE - -See L<Reaction::Class> for the license. - -=cut diff --git a/lib/Reaction/UI/Widget/DisplayField/DateTime.pm b/lib/Reaction/UI/Widget/DisplayField/DateTime.pm deleted file mode 100644 index 35b2651..0000000 --- a/lib/Reaction/UI/Widget/DisplayField/DateTime.pm +++ /dev/null @@ -1,35 +0,0 @@ -package Reaction::UI::Widget::DisplayField::DateTime; - -use Reaction::UI::WidgetClass; - -class DateTime is 'Reaction::UI::Widget::DisplayField', which { - -}; - -1; - -__END__; - -=head1 NAME - -Reaction::UI::Widget::DisplayField::DateTime - -=head1 DESCRIPTION - -See L<Reaction::UI::Widget::DisplayField> - -=head1 FRAGMENTS - -=head2 value - -C<content> contains the viewport's value_string - -=head1 AUTHORS - -See L<Reaction::Class> for authors. - -=head1 LICENSE - -See L<Reaction::Class> for the license. - -=cut diff --git a/lib/Reaction/UI/Widget/DisplayField/Number.pm b/lib/Reaction/UI/Widget/DisplayField/Number.pm deleted file mode 100644 index 9260c2e..0000000 --- a/lib/Reaction/UI/Widget/DisplayField/Number.pm +++ /dev/null @@ -1,29 +0,0 @@ -package Reaction::UI::Widget::DisplayField::Number; - -use Reaction::UI::WidgetClass; - -class Number is 'Reaction::UI::Widget::DisplayField', which { - -}; - -1; - -__END__; - -=head1 NAME - -Reaction::UI::Widget::DisplayField::Numberx - -=head1 DESCRIPTION - -See L<Reaction::UI::Widget::DisplayField> - -=head1 AUTHORS - -See L<Reaction::Class> for authors. - -=head1 LICENSE - -See L<Reaction::Class> for the license. - -=cut diff --git a/lib/Reaction/UI/Widget/Field.pm b/lib/Reaction/UI/Widget/Field.pm index 9b22905..4d91afa 100644 --- a/lib/Reaction/UI/Widget/Field.pm +++ b/lib/Reaction/UI/Widget/Field.pm @@ -5,18 +5,10 @@ use Reaction::UI::WidgetClass; class Field, which { before fragment widget { - arg 'field_id' => event_id 'value'; - arg 'field_name' => event_id 'value'; - arg 'field_type' => 'text'; if ($_{viewport}->can('value_string')) { arg 'field_value' => $_{viewport}->value_string; - } - }; - - implements fragment message_fragment { - if (my $message = $_{viewport}->message) { - arg message => $message; - render 'message'; + } else { + arg 'field_value' => $_{viewport}->value; } }; diff --git a/lib/Reaction/UI/Widget/Field/Boolean.pm b/lib/Reaction/UI/Widget/Field/Boolean.pm index 986d7b0..a205e9f 100644 --- a/lib/Reaction/UI/Widget/Field/Boolean.pm +++ b/lib/Reaction/UI/Widget/Field/Boolean.pm @@ -4,14 +4,6 @@ use Reaction::UI::WidgetClass; class Boolean is 'Reaction::UI::Widget::Field', which { - implements fragment is_checked { - if ($_{viewport}->value) { - render 'is_checked_yes'; - } else { - render 'is_checked_no'; - } - }; - }; 1; @@ -26,6 +18,12 @@ Reaction::UI::Widget::Field::Boolean See L<Reaction::UI::Widget::Field> +=head1 FRAGMENTS + +=head2 value + +C<content> contains the viewport's value_string + =head1 AUTHORS See L<Reaction::Class> for authors. diff --git a/lib/Reaction/UI/Widget/DisplayField/Collection.pm b/lib/Reaction/UI/Widget/Field/Collection.pm index 40bedd3..7d01cbb 100644 --- a/lib/Reaction/UI/Widget/DisplayField/Collection.pm +++ b/lib/Reaction/UI/Widget/Field/Collection.pm @@ -1,4 +1,4 @@ -package Reaction::UI::Widget::DisplayField::Collection; +package Reaction::UI::Widget::Field::Collection; use Reaction::UI::WidgetClass; @@ -25,7 +25,7 @@ __END__; =head1 NAME -Reaction::UI::Widget::DisplayField::Collection +Reaction::UI::Widget::Field::Collection =head1 DESCRIPTION diff --git a/lib/Reaction/UI/Widget/Field/DateTime.pm b/lib/Reaction/UI/Widget/Field/DateTime.pm index d174d0f..0ada1a4 100644 --- a/lib/Reaction/UI/Widget/Field/DateTime.pm +++ b/lib/Reaction/UI/Widget/Field/DateTime.pm @@ -20,9 +20,9 @@ See L<Reaction::UI::Widget::Field> =head1 FRAGMENTS -=head2 field +=head2 value -C<content> contains viewport's C<value_string> +C<content> contains the viewport's value_string =head1 AUTHORS diff --git a/lib/Reaction/UI/Widget/DisplayField/List.pm b/lib/Reaction/UI/Widget/Field/List.pm index f53b704..57f9d92 100644 --- a/lib/Reaction/UI/Widget/DisplayField/List.pm +++ b/lib/Reaction/UI/Widget/Field/List.pm @@ -1,12 +1,21 @@ -package Reaction::UI::Widget::DisplayField::List; +package Reaction::UI::Widget::Field::List; use Reaction::UI::WidgetClass; class List, which { - fragment widget [ qw/label list item/ ]; - fragment label [ string { $_{viewport}->label } ]; - fragment list [ item => over func('viewport', 'value_names') ]; - fragment item [ string { $_ } ]; + + before fragment widget { + arg 'label' => $_{viewport}->label; + }; + + implements fragment list { + render 'item' => over $_{viewport}->value_names; + }; + + implements fragment item { + arg 'name' => $_; + }; + }; 1; diff --git a/lib/Reaction/UI/Widget/Field/Mutable.pm b/lib/Reaction/UI/Widget/Field/Mutable.pm new file mode 100644 index 0000000..2ff669a --- /dev/null +++ b/lib/Reaction/UI/Widget/Field/Mutable.pm @@ -0,0 +1,24 @@ +package Reaction::UI::Widget::Field::Mutable; + +use Reaction::UI::WidgetClass; + +class Field is 'Reaction::UI::Widget::Field', which { + + before fragment widget { + arg 'field_id' => event_id 'value'; + arg 'field_name' => event_id 'value'; + arg 'field_type' => 'text'; + }; + + implements fragment message_fragment { + if (my $message = $_{viewport}->message) { + arg message => $message; + render 'message'; + } + }; + +}; + +1; + +__END__; diff --git a/lib/Reaction/UI/Widget/Field/Mutable/Boolean.pm b/lib/Reaction/UI/Widget/Field/Mutable/Boolean.pm new file mode 100644 index 0000000..0afb40c --- /dev/null +++ b/lib/Reaction/UI/Widget/Field/Mutable/Boolean.pm @@ -0,0 +1,37 @@ +package Reaction::UI::Widget::Field::Mutable::Boolean; + +use Reaction::UI::WidgetClass; + +class Boolean is 'Reaction::UI::Widget::Field::Mutable', which { + + implements fragment is_checked { + if ($_{viewport}->value) { + render 'is_checked_yes'; + } else { + render 'is_checked_no'; + } + }; + +}; + +1; + +__END__; + +=head1 NAME + +Reaction::UI::Widget::Field::Boolean + +=head1 DESCRIPTION + +See L<Reaction::UI::Widget::Field> + +=head1 AUTHORS + +See L<Reaction::Class> for authors. + +=head1 LICENSE + +See L<Reaction::Class> for the license. + +=cut diff --git a/lib/Reaction/UI/Widget/Field/ChooseMany.pm b/lib/Reaction/UI/Widget/Field/Mutable/ChooseMany.pm index efb100d..697e672 100644 --- a/lib/Reaction/UI/Widget/Field/ChooseMany.pm +++ b/lib/Reaction/UI/Widget/Field/Mutable/ChooseMany.pm @@ -1,8 +1,8 @@ -package Reaction::UI::Widget::Field::ChooseMany; +package Reaction::UI::Widget::Field::Mutable::ChooseMany; use Reaction::UI::WidgetClass; -class ChooseMany is 'Reaction::UI::Widget::Field', which { +class ChooseMany is 'Reaction::UI::Widget::Field::Mutable', which { implements fragment action_buttons { foreach my $event ( diff --git a/lib/Reaction/UI/Widget/Field/ChooseOne.pm b/lib/Reaction/UI/Widget/Field/Mutable/ChooseOne.pm index cd6ed5e..79c75fc 100644 --- a/lib/Reaction/UI/Widget/Field/ChooseOne.pm +++ b/lib/Reaction/UI/Widget/Field/Mutable/ChooseOne.pm @@ -1,8 +1,8 @@ -package Reaction::UI::Widget::Field::ChooseOne; +package Reaction::UI::Widget::Field::Mutable::ChooseOne; use Reaction::UI::WidgetClass; -class ChooseOne is 'Reaction::UI::Widget::Field', which { +class ChooseOne is 'Reaction::UI::Widget::Field::Mutable', which { implements fragment option_is_required { if ($_{viewport}->attribute->is_required) { diff --git a/lib/Reaction/UI/Widget/Field/Mutable/DateTime.pm b/lib/Reaction/UI/Widget/Field/Mutable/DateTime.pm new file mode 100644 index 0000000..0095594 --- /dev/null +++ b/lib/Reaction/UI/Widget/Field/Mutable/DateTime.pm @@ -0,0 +1,35 @@ +package Reaction::UI::Widget::Field::Mutable::DateTime; + +use Reaction::UI::WidgetClass; + +class DateTime is 'Reaction::UI::Widget::Field::Mutable', which { + +}; + +1; + +__END__; + +=head1 NAME + +Reaction::UI::Widget::Field::DateTime + +=head1 DESCRIPTION + +See L<Reaction::UI::Widget::Field> + +=head1 FRAGMENTS + +=head2 field + +C<content> contains viewport's C<value_string> + +=head1 AUTHORS + +See L<Reaction::Class> for authors. + +=head1 LICENSE + +See L<Reaction::Class> for the license. + +=cut diff --git a/lib/Reaction/UI/Widget/Field/File.pm b/lib/Reaction/UI/Widget/Field/Mutable/File.pm index 009eea3..42c1137 100644 --- a/lib/Reaction/UI/Widget/Field/File.pm +++ b/lib/Reaction/UI/Widget/Field/Mutable/File.pm @@ -1,8 +1,8 @@ -package Reaction::UI::Widget::Field::File; +package Reaction::UI::Widget::Field::Mutable::File; use Reaction::UI::WidgetClass; -class File is 'Reaction::UI::Widget::Field', which { +class File is 'Reaction::UI::Widget::Field::Mutable', which { after fragment widget { arg field_type => 'file'; diff --git a/lib/Reaction/UI/Widget/Field/HiddenArray.pm b/lib/Reaction/UI/Widget/Field/Mutable/HiddenArray.pm index d64e4ca..675b2d1 100644 --- a/lib/Reaction/UI/Widget/Field/HiddenArray.pm +++ b/lib/Reaction/UI/Widget/Field/Mutable/HiddenArray.pm @@ -1,8 +1,9 @@ -package Reaction::UI::Widget::Field::HiddenArray; +package Reaction::UI::Widget::Field::Mutable::HiddenArray; use Reaction::UI::WidgetClass; -class HiddenArray is 'Reaction::UI::Widget::Field', which { +#move this to a normal list and let the hidden part be decided by the template.. +class HiddenArray is 'Reaction::UI::Widget::Field::Mutable', which { implements fragment hidden_list { render hidden_field => over $_{viewport}->value; diff --git a/lib/Reaction/UI/Widget/Field/Mutable/Number.pm b/lib/Reaction/UI/Widget/Field/Mutable/Number.pm new file mode 100644 index 0000000..d73079c --- /dev/null +++ b/lib/Reaction/UI/Widget/Field/Mutable/Number.pm @@ -0,0 +1,29 @@ +package Reaction::UI::Widget::Field::Mutable::Number; + +use Reaction::UI::WidgetClass; + +class Number is 'Reaction::UI::Widget::Field::Mutable', which { + +}; + +1; + +__END__; + +=head1 NAME + +Reaction::UI::Widget::Field::Number + +=head1 DESCRIPTION + +See L<Reaction::UI::Widget::Field> + +=head1 AUTHORS + +See L<Reaction::Class> for authors. + +=head1 LICENSE + +See L<Reaction::Class> for the license. + +=cut diff --git a/lib/Reaction/UI/Widget/Field/Password.pm b/lib/Reaction/UI/Widget/Field/Mutable/Password.pm index 472f929..c11a909 100644 --- a/lib/Reaction/UI/Widget/Field/Password.pm +++ b/lib/Reaction/UI/Widget/Field/Mutable/Password.pm @@ -1,8 +1,8 @@ -package Reaction::UI::Widget::Field::Password; +package Reaction::UI::Widget::Field::Mutable::Password; use Reaction::UI::WidgetClass; -class Password is 'Reaction::UI::Widget::Field', which { +class Password is 'Reaction::UI::Widget::Field::Mutable', which { around fragment widget { call_next; diff --git a/lib/Reaction/UI/Widget/Field/Mutable/String.pm b/lib/Reaction/UI/Widget/Field/Mutable/String.pm new file mode 100644 index 0000000..7405c4a --- /dev/null +++ b/lib/Reaction/UI/Widget/Field/Mutable/String.pm @@ -0,0 +1,29 @@ +package Reaction::UI::Widget::Field::Mutable::String; + +use Reaction::UI::WidgetClass; + +class String is 'Reaction::UI::Widget::Field::Mutable', which { + +}; + +1; + +__END__; + +=head1 NAME + +Reaction::UI::Widget::Field::String + +=head1 DESCRIPTION + +See L<Reaction::UI::Widget::Field> + +=head1 AUTHORS + +See L<Reaction::Class> for authors. + +=head1 LICENSE + +See L<Reaction::Class> for the license. + +=cut diff --git a/lib/Reaction/UI/Widget/DisplayField/Text.pm b/lib/Reaction/UI/Widget/Field/Mutable/Text.pm index d7c4c2e..2cb7134 100644 --- a/lib/Reaction/UI/Widget/DisplayField/Text.pm +++ b/lib/Reaction/UI/Widget/Field/Mutable/Text.pm @@ -1,8 +1,8 @@ -package Reaction::UI::Widget::DisplayField::Text; +package Reaction::UI::Widget::Field::Mutable::Text; use Reaction::UI::WidgetClass; -class Text is 'Reaction::UI::Widget::DisplayField', which { +class Text is 'Reaction::UI::Widget::Field::Mutable', which { }; @@ -12,11 +12,11 @@ __END__; =head1 NAME -Reaction::UI::Widget::DisplayField::Text +Reaction::UI::Widget::Field::Text =head1 DESCRIPTION -See L<Reaction::UI::Widget::DisplayField> +See L<Reaction::UI::Widget::Field> =head1 AUTHORS diff --git a/lib/Reaction/UI/Widget/Field/TimeRange.pm b/lib/Reaction/UI/Widget/Field/Mutable/TimeRange.pm index bc2ba05..0cdb4aa 100644 --- a/lib/Reaction/UI/Widget/Field/TimeRange.pm +++ b/lib/Reaction/UI/Widget/Field/Mutable/TimeRange.pm @@ -1,8 +1,8 @@ -package Reaction::UI::Widget::Field::TimeRange; +package Reaction::UI::Widget::Field::Mutable::TimeRange; use Reaction::UI::WidgetClass; -class TimeRange is 'Reaction::UI::Widget::Field', which { +class TimeRange is 'Reaction::UI::Widget::Field::Mutable', which { }; diff --git a/lib/Reaction/UI/Widget/Field/Number.pm b/lib/Reaction/UI/Widget/Field/Number.pm index 48ef120..f80144e 100644 --- a/lib/Reaction/UI/Widget/Field/Number.pm +++ b/lib/Reaction/UI/Widget/Field/Number.pm @@ -12,11 +12,11 @@ __END__; =head1 NAME -Reaction::UI::Widget::Field::Number +Reaction::UI::Widget::DisplayField::Numberx =head1 DESCRIPTION -See L<Reaction::UI::Widget::Field> +See L<Reaction::UI::Widget::DisplayField> =head1 AUTHORS diff --git a/lib/Reaction/UI/Widget/DisplayField/RelatedObject.pm b/lib/Reaction/UI/Widget/Field/RelatedObject.pm index f6aef23..010e7c0 100644 --- a/lib/Reaction/UI/Widget/DisplayField/RelatedObject.pm +++ b/lib/Reaction/UI/Widget/Field/RelatedObject.pm @@ -1,8 +1,8 @@ -package Reaction::UI::Widget::DisplayField::RelatedObject; +package Reaction::UI::Widget::Field::RelatedObject; use Reaction::UI::WidgetClass; -class RelatedObject is 'Reaction::UI::Widget::DisplayField', which { +class RelatedObject is 'Reaction::UI::Widget::Field', which { }; diff --git a/lib/Reaction/UI/Widget/Field/String.pm b/lib/Reaction/UI/Widget/Field/String.pm index 7e64510..023c082 100644 --- a/lib/Reaction/UI/Widget/Field/String.pm +++ b/lib/Reaction/UI/Widget/Field/String.pm @@ -12,11 +12,11 @@ __END__; =head1 NAME -Reaction::UI::Widget::Field::String +Reaction::UI::Widget::DisplayField::String =head1 DESCRIPTION -See L<Reaction::UI::Widget::Field> +See L<Reaction::UI::Widget::DisplayField> =head1 AUTHORS diff --git a/lib/Reaction/UI/Widget/GridView/Entity.pm b/lib/Reaction/UI/Widget/GridView/Entity.pm deleted file mode 100644 index 3efc1a4..0000000 --- a/lib/Reaction/UI/Widget/GridView/Entity.pm +++ /dev/null @@ -1,52 +0,0 @@ -package Reaction::UI::Widget::GridView::Entity; - -use Reaction::UI::WidgetClass; - -class Entity, which { - - implements fragment field_list { - render 'field' => over $_{viewport}->fields; - }; - - implements fragment field { - render 'viewport'; - }; - -}; - -1; - -__END__; - - -=head1 NAME - -Reaction::UI::Widget::GridView::Entity - -=head1 DESCRIPTION - -=head1 FRAGMENTS - -=head2 widget - -Additional variables available in topic hash: "viewport". - -Renders "field_list" - -=head2 field_list - -Sequentially renders the C<fields> of the viewport as "field" - -=head2 field - -renders the cell value - -=head1 AUTHORS - -See L<Reaction::Class> for authors. - -=head1 LICENSE - -See L<Reaction::Class> for the license. - -=cut diff --git a/lib/Reaction/UI/Widget/ObjectView.pm b/lib/Reaction/UI/Widget/Object.pm index a3455ba..68b47f3 100644 --- a/lib/Reaction/UI/Widget/ObjectView.pm +++ b/lib/Reaction/UI/Widget/Object.pm @@ -1,8 +1,8 @@ -package Reaction::UI::Widget::ObjectView; +package Reaction::UI::Widget::Object; use Reaction::UI::WidgetClass; -class ObjectView, which { +class Object, which { implements fragment field_list { render field => over $_{viewport}->ordered_fields; @@ -21,7 +21,7 @@ __END__; =head1 NAME -Reaction::UI::Widget::ObjectView +Reaction::UI::Widget::Object =head1 DESCRIPTION @@ -29,13 +29,11 @@ Reaction::UI::Widget::ObjectView =head2 widget -Additional variables available in topic hash: "viewport". - -Renders "field_list" +Renders C<field_list> =head2 field_list -Sequentially renders the C<ordered_fields> of the viewport +Sequentially renders the C<ordered_fields> of the viewport. =head1 AUTHORS |