diff options
author | matthewt <matthewt@03d0b0b2-0e1a-0410-a411-fdb2f4bd65d7> | 2007-12-14 21:10:01 +0000 |
---|---|---|
committer | matthewt <matthewt@03d0b0b2-0e1a-0410-a411-fdb2f4bd65d7> | 2007-12-14 21:10:01 +0000 |
commit | 664d660c64b882714d87f3a8dc7491723042ae0c (patch) | |
tree | eb70016566ed692ef60e63c65f9ecced4311c96f /lib/Reaction/UI/Widget | |
parent | aa8c0c904641fa20c5f50882d09c1502aae19b3a (diff) | |
download | reaction-664d660c64b882714d87f3a8dc7491723042ae0c.tar.gz reaction-664d660c64b882714d87f3a8dc7491723042ae0c.zip |
port actionform, field widgets to declarative system
Diffstat (limited to 'lib/Reaction/UI/Widget')
-rw-r--r-- | lib/Reaction/UI/Widget/ActionForm.pm | 52 | ||||
-rw-r--r-- | lib/Reaction/UI/Widget/Field.pm | 31 | ||||
-rw-r--r-- | lib/Reaction/UI/Widget/Field/Boolean.pm | 8 | ||||
-rw-r--r-- | lib/Reaction/UI/Widget/Field/ChooseMany.pm | 39 | ||||
-rw-r--r-- | lib/Reaction/UI/Widget/Field/ChooseOne.pm | 33 | ||||
-rw-r--r-- | lib/Reaction/UI/Widget/Field/DateTime.pm | 2 | ||||
-rw-r--r-- | lib/Reaction/UI/Widget/Field/HiddenArray.pm | 9 | ||||
-rw-r--r-- | lib/Reaction/UI/Widget/Field/Password.pm | 5 | ||||
-rw-r--r-- | lib/Reaction/UI/Widget/ListView.pm | 53 |
9 files changed, 184 insertions, 48 deletions
diff --git a/lib/Reaction/UI/Widget/ActionForm.pm b/lib/Reaction/UI/Widget/ActionForm.pm index 2f587e9..858d218 100644 --- a/lib/Reaction/UI/Widget/ActionForm.pm +++ b/lib/Reaction/UI/Widget/ActionForm.pm @@ -3,22 +3,42 @@ package Reaction::UI::Widget::ActionForm; use Reaction::UI::WidgetClass; class ActionForm, which { - fragment widget [ qw/header field_list buttons footer/ ] - => {id => sub { $_{viewport}->location } }; - - fragment field_list [field => over func('viewport','ordered_fields')]; - fragment field [ 'viewport' ]; - - #move button logic here - fragment buttons [ string {"DUMMY"} ], - { message => sub{ $_{viewport}->can('message') ? $_{viewport}->message : "" }, - ok_label => func(viewport => 'ok_label'), - close_label => func(viewport => 'close_label'), - apply_label => func(viewport => 'apply_label'), - }; - - fragment header [ string {"DUMMY"} ]; - fragment footer [ string {"DUMMY"} ]; + + #implements fragment widget { + # arg form_id => $_{viewport}->location; + #}; + + implements fragment field_list { + render field => over $_{viewport}->ordered_fields; + }; + + implements fragment field { + render 'viewport'; + }; + + implements fragment ok_button_fragment { + if (grep { $_ eq 'ok' } $_{viewport}->accept_events) { + arg 'event_id' => event_id 'ok'; + arg 'label' => $_{viewport}->ok_label; + render 'ok_button'; + } + }; + + implements fragment apply_button_fragment { + if (grep { $_ eq 'apply' } $_{viewport}->accept_events) { + arg 'event_id' => event_id 'apply'; + arg 'label' => $_{viewport}->apply_label; + render 'apply_button'; + } + }; + + implements fragment cancel_button_fragment { + if (grep { $_ eq 'cancel' } $_{viewport}->accept_events) { + arg 'event_id' => event_id 'cancel'; + arg 'label' => $_{viewport}->cancel_label; + render 'cancel_button'; + } + }; }; diff --git a/lib/Reaction/UI/Widget/Field.pm b/lib/Reaction/UI/Widget/Field.pm index 40ca595..9b22905 100644 --- a/lib/Reaction/UI/Widget/Field.pm +++ b/lib/Reaction/UI/Widget/Field.pm @@ -4,15 +4,28 @@ use Reaction::UI::WidgetClass; class Field, which { - fragment widget [qw/label field message/ - => { id => sub { $_{viewport}->event_id_for('value') }, - name => sub { $_{viewport}->event_id_for('value') }, - ]; - - fragment field [ string { $_{viewport}->value }, ]; - - fragment label [ string { $_{viewport}->label }, ]; - fragment message [ string { $_{viewport}->message }, ]; + 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'; + } + }; + + implements fragment label_fragment { + if (my $label = $_{viewport}->label) { + arg label => $label; + render 'label'; + } + }; }; diff --git a/lib/Reaction/UI/Widget/Field/Boolean.pm b/lib/Reaction/UI/Widget/Field/Boolean.pm index a4defcd..986d7b0 100644 --- a/lib/Reaction/UI/Widget/Field/Boolean.pm +++ b/lib/Reaction/UI/Widget/Field/Boolean.pm @@ -4,6 +4,14 @@ 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; diff --git a/lib/Reaction/UI/Widget/Field/ChooseMany.pm b/lib/Reaction/UI/Widget/Field/ChooseMany.pm index 8520068..efb100d 100644 --- a/lib/Reaction/UI/Widget/Field/ChooseMany.pm +++ b/lib/Reaction/UI/Widget/Field/ChooseMany.pm @@ -4,15 +4,36 @@ use Reaction::UI::WidgetClass; class ChooseMany is 'Reaction::UI::Widget::Field', which { - fragment field [qw/available_values action_buttons selected_values current_values/]; - - fragment current_values [ hidden_value => over func('viewport', 'current_value_choices') ]; - fragment hidden_value [ string { $_->{value} } ]; - - fragment available_values [ option => over func('viewport', 'available_value_choices') ]; - fragment selected_values [ option => over func('viewport', 'current_value_choices') ]; - fragment option [string {"DUMMY"}], { v_value => sub {$_->{value}}, v_name => sub {$_->{name}} }; - fragment action_buttons [ string {"DUMMY"} ]; + implements fragment action_buttons { + foreach my $event ( + qw(add_all_values do_add_values do_remove_values remove_all_values) + ) { + arg "event_id_${event}" => event_id $event; + } + }; + + implements fragment current_values { + render hidden_value => over $_{viewport}->current_value_choices; + }; + + implements fragment selected_values { + arg event_id_remove_values => event_id 'remove_values'; + render value_option => over $_{viewport}->current_value_choices; + }; + + implements fragment available_values { + arg event_id_add_values => event_id 'add_values'; + render value_option => over $_{viewport}->available_value_choices; + }; + + implements fragment value_option { + arg option_name => $_->{name}; + arg option_value => $_->{value}; + }; + + implements fragment hidden_value { + arg hidden_value => $_->{value}; + }; }; diff --git a/lib/Reaction/UI/Widget/Field/ChooseOne.pm b/lib/Reaction/UI/Widget/Field/ChooseOne.pm index c127cef..e9aa439 100644 --- a/lib/Reaction/UI/Widget/Field/ChooseOne.pm +++ b/lib/Reaction/UI/Widget/Field/ChooseOne.pm @@ -4,15 +4,30 @@ use Reaction::UI::WidgetClass; class ChooseOne is 'Reaction::UI::Widget::Field', which { - fragment field [ option => over func('viewport', 'value_choices') ], - { is_required => sub{ $_{viewport}->attribute->required } }; - - fragment option [string {"DUMMY"}], - { - v_value => sub { $_->{value} }, - v_name => sub { $_->{name} }, - is_selected => sub { $_{viewport}->is_current_value($_->{value}) }, - }; + implements fragment option_is_required { + if ($_{viewport}->attribute->required) { + render 'options_is_required_yes'; + } else { + render 'options_is_required_no'; + } + }; + + implements fragment option_list { + render option => over $_{viewport}->value_choices; + }; + + implements fragment option { + arg option_name => $_->{name}; + arg option_value => $_->{value}; + }; + + implements fragment option_is_selected { + if ($_{viewport}->is_current_value($_->{value})) { + render 'option_is_selected_yes'; + } else { + render 'option_is_selected_no'; + } + }; }; diff --git a/lib/Reaction/UI/Widget/Field/DateTime.pm b/lib/Reaction/UI/Widget/Field/DateTime.pm index 21e0069..d174d0f 100644 --- a/lib/Reaction/UI/Widget/Field/DateTime.pm +++ b/lib/Reaction/UI/Widget/Field/DateTime.pm @@ -4,8 +4,6 @@ use Reaction::UI::WidgetClass; class DateTime is 'Reaction::UI::Widget::Field', which { - fragment field [ string { $_{viewport}->value_string }, ]; - }; 1; diff --git a/lib/Reaction/UI/Widget/Field/HiddenArray.pm b/lib/Reaction/UI/Widget/Field/HiddenArray.pm index a7d4a2d..d64e4ca 100644 --- a/lib/Reaction/UI/Widget/Field/HiddenArray.pm +++ b/lib/Reaction/UI/Widget/Field/HiddenArray.pm @@ -4,8 +4,13 @@ use Reaction::UI::WidgetClass; class HiddenArray is 'Reaction::UI::Widget::Field', which { - fragment field [ item => over func('viewport', 'value') ]; - fragment item [ string { $_ } ]; + implements fragment hidden_list { + render hidden_field => over $_{viewport}->value; + }; + + implements fragment hidden_field { + arg field_value => $_; + }; }; diff --git a/lib/Reaction/UI/Widget/Field/Password.pm b/lib/Reaction/UI/Widget/Field/Password.pm index 7525530..472f929 100644 --- a/lib/Reaction/UI/Widget/Field/Password.pm +++ b/lib/Reaction/UI/Widget/Field/Password.pm @@ -4,6 +4,11 @@ use Reaction::UI::WidgetClass; class Password is 'Reaction::UI::Widget::Field', which { + around fragment widget { + call_next; + arg field_type => 'password'; + }; + }; 1; diff --git a/lib/Reaction/UI/Widget/ListView.pm b/lib/Reaction/UI/Widget/ListView.pm index 9562900..cfd8028 100644 --- a/lib/Reaction/UI/Widget/ListView.pm +++ b/lib/Reaction/UI/Widget/ListView.pm @@ -4,6 +4,10 @@ use Reaction::UI::WidgetClass; class ListView is 'Reaction::UI::Widget::GridView', which { + after fragment widget { + arg pager_obj => $_{viewport}->pager; + }; + implements fragment actions { render action => over $_{viewport}->actions; }; @@ -28,7 +32,54 @@ class ListView is 'Reaction::UI::Widget::GridView', which { }; implements fragment header_action_cell { - arg 'col_count' => $_{viewport}->object_action_count; + arg col_count => $_{viewport}->object_action_count; + }; + + implements fragment page_list { + render numbered_page_fragment + => over [ $_{pager_obj}->first_page .. $_{pager_obj}->last_page ]; + }; + + implements fragment numbered_page_fragment { + arg page_uri => event_uri { page => $_ }; + arg page_number => $_; + if ($_{pager_obj}->current_page == $_) { + render 'numbered_page_this_page'; + } else { + render 'numbered_page'; + } + }; + + implements fragment first_page { + arg page_uri => event_uri { page => $_{pager_obj}->first_page }; + arg page_name => 'First'; + render 'named_page'; + }; + + implements fragment last_page { + arg page_uri => event_uri { page => $_{pager_obj}->last_page }; + arg page_name => 'Last'; + render 'named_page'; + }; + + implements fragment next_page { + arg page_name => 'Next'; + if (my $page = $_{pager_obj}->next_page) { + arg page_uri => event_uri { page => $page }; + render 'named_page'; + } else { + render 'named_page_no_page'; + } + }; + + implements fragment previous_page { + arg page_name => 'Previous'; + if (my $page = $_{pager_obj}->previous_page) { + arg page_uri => event_uri { page => $page }; + render 'named_page'; + } else { + render 'named_page_no_page'; + } }; }; |