aboutsummaryrefslogtreecommitdiffstats
path: root/lib/Reaction/UI/Widget
diff options
context:
space:
mode:
authormatthewt <matthewt@03d0b0b2-0e1a-0410-a411-fdb2f4bd65d7>2007-12-14 21:10:01 +0000
committermatthewt <matthewt@03d0b0b2-0e1a-0410-a411-fdb2f4bd65d7>2007-12-14 21:10:01 +0000
commit664d660c64b882714d87f3a8dc7491723042ae0c (patch)
treeeb70016566ed692ef60e63c65f9ecced4311c96f /lib/Reaction/UI/Widget
parentaa8c0c904641fa20c5f50882d09c1502aae19b3a (diff)
downloadreaction-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.pm52
-rw-r--r--lib/Reaction/UI/Widget/Field.pm31
-rw-r--r--lib/Reaction/UI/Widget/Field/Boolean.pm8
-rw-r--r--lib/Reaction/UI/Widget/Field/ChooseMany.pm39
-rw-r--r--lib/Reaction/UI/Widget/Field/ChooseOne.pm33
-rw-r--r--lib/Reaction/UI/Widget/Field/DateTime.pm2
-rw-r--r--lib/Reaction/UI/Widget/Field/HiddenArray.pm9
-rw-r--r--lib/Reaction/UI/Widget/Field/Password.pm5
-rw-r--r--lib/Reaction/UI/Widget/ListView.pm53
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';
+ }
};
};