==== Patch level 2 Source: 4548d020-06a0-4b37-8aa3-720a432dc893:/local/html-widget:317 Target: 2b3c1e6d-4512-0410-8515-bb3e84fa098e:/trunk/HTML-Widget:15 (http://oook.de/svn/trunk/HTML-Widget) Log: r315@am-mbook: andremar | 2006-05-03 15:24:09 +0200 initial copy of html-widget repo r316@am-mbook: andremar | 2006-05-03 23:45:35 +0200 events support r317@am-mbook: andremar | 2006-05-04 12:33:04 +0200 doc updates for event-stuff === t/10element_events.t ================================================================== --- t/10element_events.t (revision 15) +++ t/10element_events.t (patch events-support level 2) @@ -0,0 +1,67 @@ +use Test::More tests => 87; + +use_ok('HTML::Widget'); + +use lib 't/lib'; +use HTMLWidget::TestLib; + + +my %elements = ( + Button => [qw/onfocus onblur onselect onchange/], + Checkbox => [qw/onfocus onblur onselect onchange/], + Hidden => [], + Password => [qw/onfocus onblur onselect onchange/], + Radio => [qw/onfocus onblur onselect onchange/], + RadioGroup => [qw/onfocus onblur onselect onchange/], + Reset => [qw/onfocus onblur onselect onchange/], + Select => [qw/onfocus onblur onchange/], + Submit => [qw/onfocus onblur onselect onchange/], + Textarea => [qw/onfocus onblur onselect onchange/], + Textfield => [qw/onfocus onblur onselect onchange/], + Upload => [qw/onfocus onblur onselect onchange/], +); + +my @intristic_events = [qw/onclick ondblclick onmousedown onmouseup + onmouseover onmouseout onkeypress onkeydown onkeyup /]; + +my $event_handler = "alert('testing event')"; +my $event_handler_sub = sub {my $element = shift; return "alert('testing event')"}; + +foreach my $e_type (keys %elements) { + foreach my $event (@{$elements{$e_type}}) { + my $w = HTML::Widget->new; + $w->element('Textfield', 'foo')->value('foo')->size(30)->label('Foo'); + + + my $e = $w->element($e_type, 'test_elem')->events( + $event => $event_handler + ); + $e->values([qw/fool radiogroup/])->value('fool') if $e->can('values'); + $e->options([qw/fool radiogroup/])->value('fool') if $e->can('options'); + # Without query + { + + my $f = $w->process; + my $re = $event . '="' . $event_handler . '"'; + ok( substr("$f",$re) , 'XML output is filled out form' ); + } + + $e = $w->element($e_type, 'test_elem')->events( + $event => $event_handler_sub + ); + $e->values([qw/fool radiogroup/])->value('fool') if $e->can('values'); + $e->options([qw/fool radiogroup/])->value('fool') if $e->can('options'); + + # With mocked basic query + { + my $query = HTMLWidget::TestLib->mock_query({ + foo => 'yada', bar => '23', test_elem => 'fool' + }); + + my $f = $w->process($query); + my $re = $event . '="' . $event_handler . '"'; + ok( substr("$f",$re) , 'XML output is filled out form' ); + + } + } +} === lib/HTML/Widget/Element.pm ================================================================== --- lib/HTML/Widget/Element.pm (revision 15) +++ lib/HTML/Widget/Element.pm (patch events-support level 2) @@ -13,6 +13,10 @@ __PACKAGE__->mk_accessors(qw/name passive/); __PACKAGE__->mk_attr_accessors(qw/class/); +# intristic events +__PACKAGE__->mk_attr_accessors(qw/onclick ondblclick onmousedown onmouseup + onmouseover onmouseout onkeypress onkeydown onkeyup /); + =head1 NAME HTML::Widget::Element - Element Base Class @@ -23,6 +27,8 @@ $e->attributes( { class => 'foo' } ); $e->name('bar'); $e->class('foo'); + $e->events(onchange => "alert('field has new value: ' . this.value)"); + $e->events(onchange => sub { my $e = shift; return "alert('field has new value: ' . this.value)"}) =head1 DESCRIPTION @@ -58,6 +64,61 @@ return $self->_container_class_accessor(@_); } +=head2 $self->events(event => jscode || subref returning jscode) + +Adds the appropriate attributes to the element. + +=cut + +sub events { + my $self = shift; + my %events = @_; + foreach my $event (keys %events) { + # we want to stay XHTML-compliant, with all lowercase events + $event = lc($event); + if ($self->can($event)) { + # the event is recognized as an attribute, thus each Element + # subclass should mk_attr_accessors(qw/events they support/); + my $event_handler = $events{$event}; + + if (ref($event_handler) and ref($event_handler) eq 'CODE') { + # this is a coderef + $event_handler = $event_handler->($self); + } + $self->$event($event_handler); + } + } + return $self; +} + +=head3 INTRISTIC EVENTS + +These events are shared by all Element subclasses. They can all be accesses via +C<< $self->events($event => 'javascript' or code-ref) >> or directly +as C<< $self->$event('javascript' or code-ref) >>. + +=over 4 + +=item * onclick + +=item * ondblclick + +=item * onmousedown + +=item * onmouseup + +=item * onmouseover + +=item * onmouseout + +=item * onkeypress + +=item * onkeyup + +=item * onkeydown + +=back + =head2 $self->id($widget) Creates a element id. @@ -196,7 +257,9 @@ =head2 $self->containerize -Containerize the element, label and error for later rendering. Uses HTML::Widget::Container by default, but this can be over-ridden on a class or instance basis via L. +Containerize the element, label and error for later rendering. Uses +HTML::Widget::Container by default, but this can be over-ridden on a class +or instance basis via L. =cut @@ -204,7 +267,9 @@ =head2 $self->container_class($class) -Contains the class to use for contain the element which then get rendered. Defaults to L. C can be set at a class or instance level: +Contains the class to use for contain the element which then get rendered. +Defaults to L. C can be set at a +class or instance level: HTML::Widget::Element->container_class('My::Container'); # Override default to custom class === lib/HTML/Widget/Element/Upload.pm ================================================================== --- lib/HTML/Widget/Element/Upload.pm (revision 15) +++ lib/HTML/Widget/Element/Upload.pm (patch events-support level 2) @@ -7,6 +7,9 @@ __PACKAGE__->mk_accessors(qw/comment label/); __PACKAGE__->mk_attr_accessors(qw/accept maxlength size/); +# events +__PACKAGE__->mk_attr_accessors(qw/onfocus onblur onselect onchange/); + =head1 NAME HTML::Widget::Element::Upload - Upload Element @@ -58,6 +61,26 @@ return $self->container( { element => $i, error => $e, label => $l } ); } +=head3 JAVASCRIPT EVENTS + +The following events are special for the Upload type of elements. +In addition the L are available. +They can all be accesses via +C<< $self->events($event => 'javascript' or code-ref) >> or directly +as C<< $self->$event('javascript' or code-ref) >>. + +=over 4 + +=item * onfocus + +=item * onblur + +=item * onchange + +=item * onselect + +=back + =head1 AUTHOR Sebastian Riedel, C === lib/HTML/Widget/Element/Checkbox.pm ================================================================== --- lib/HTML/Widget/Element/Checkbox.pm (revision 15) +++ lib/HTML/Widget/Element/Checkbox.pm (patch events-support level 2) @@ -7,6 +7,9 @@ __PACKAGE__->mk_accessors(qw/checked comment label value/); +# events +__PACKAGE__->mk_attr_accessors(qw/onfocus onblur onselect onchange/); + =head1 NAME HTML::Widget::Element::Checkbox - Checkbox Element @@ -55,6 +58,26 @@ return $self->container( { element => $i, error => $e, label => $l } ); } +=head3 JAVASCRIPT EVENTS + +The following events are special for the Checkbox type of elements. +In addition the L are available. +They can all be accesses via +C<< $self->events($event => 'javascript' or code-ref) >> or directly +as C<< $self->$event('javascript' or code-ref) >>. + +=over 4 + +=item * onfocus + +=item * onblur + +=item * onchange + +=item * onselect + +=back + =head1 AUTHOR Sebastian Riedel, C === lib/HTML/Widget/Element/Textfield.pm ================================================================== --- lib/HTML/Widget/Element/Textfield.pm (revision 15) +++ lib/HTML/Widget/Element/Textfield.pm (patch events-support level 2) @@ -7,6 +7,9 @@ __PACKAGE__->mk_accessors(qw/comment label value/); __PACKAGE__->mk_attr_accessors(qw/size maxlength/); +# events +__PACKAGE__->mk_attr_accessors(qw/onfocus onblur onselect onchange/); + =head1 NAME HTML::Widget::Element::Textfield - Textfield Element @@ -44,6 +47,26 @@ return $self->container( { element => $i, error => $e, label => $l } ); } +=head3 JAVASCRIPT EVENTS + +The following events are special for the Textfield type of elements. +In addition the L are available. +They can all be accesses via +C<< $self->events($event => 'javascript' or code-ref) >> or directly +as C<< $self->$event('javascript' or code-ref) >>. + +=over 4 + +=item * onfocus + +=item * onblur + +=item * onchange + +=item * onselect + +=back + =head1 AUTHOR Sebastian Riedel, C === lib/HTML/Widget/Element/Button.pm ================================================================== --- lib/HTML/Widget/Element/Button.pm (revision 15) +++ lib/HTML/Widget/Element/Button.pm (patch events-support level 2) @@ -7,6 +7,9 @@ __PACKAGE__->mk_accessors(qw/value content type/); +# events +__PACKAGE__->mk_attr_accessors(qw/onfocus onblur onselect onchange/); + # alias *label = \&value; @@ -74,6 +77,26 @@ return $self->container( { element => $i } ); } +=head3 JAVASCRIPT EVENTS + +The following events are special for the Button type of elements. +In addition the L are available. +They can all be accesses via +C<< $self->events($event => 'javascript' or code-ref) >> or directly +as C<< $self->$event('javascript' or code-ref) >>. + +=over 4 + +=item * onfocus + +=item * onblur + +=item * onchange + +=item * onselect + +=back + =head1 AUTHOR Marcus Ramberg, C === lib/HTML/Widget/Element/Hidden.pm ================================================================== --- lib/HTML/Widget/Element/Hidden.pm (revision 15) +++ lib/HTML/Widget/Element/Hidden.pm (patch events-support level 2) @@ -50,6 +50,18 @@ return $self->container( { element => $i } ); } +=head3 JAVASCRIPT EVENTS + +The Hidden class of elements does not have any events, except the ones +inherited from L. +They can all be accesses via +C<< $self->events($event => 'javascript' or code-ref) >> or directly +as C<< $self->$event('javascript' or code-ref) >>. + +=over 4 + +=back + =head1 AUTHOR Sebastian Riedel, C === lib/HTML/Widget/Element/RadioGroup.pm ================================================================== --- lib/HTML/Widget/Element/RadioGroup.pm (revision 15) +++ lib/HTML/Widget/Element/RadioGroup.pm (patch events-support level 2) @@ -6,6 +6,9 @@ __PACKAGE__->mk_accessors(qw/comment label options values labels comments value _current_subelement/); +# events +__PACKAGE__->mk_attr_accessors(qw/onfocus onblur onselect onchange/); + =head1 NAME HTML::Widget::Element::RadioGroup - Radio Element grouping @@ -152,7 +155,27 @@ : $id; } +=head3 JAVASCRIPT EVENTS +The following events are special for the RadioGroup type of elements. +In addition the L are available. +They can all be accesses via +C<< $self->events($event => 'javascript' or code-ref) >> or directly +as C<< $self->$event('javascript' or code-ref) >>. + +=over 4 + +=item * onfocus + +=item * onblur + +=item * onchange + +=item * onselect + +=back + + =head1 AUTHOR Jess Robinson === lib/HTML/Widget/Element/Textarea.pm ================================================================== --- lib/HTML/Widget/Element/Textarea.pm (revision 15) +++ lib/HTML/Widget/Element/Textarea.pm (patch events-support level 2) @@ -9,6 +9,9 @@ __PACKAGE__->mk_accessors(qw/comment label value/); __PACKAGE__->mk_attr_accessors(qw/cols rows wrap/); +# events +__PACKAGE__->mk_attr_accessors(qw/onfocus onblur onselect onchange/); + =head1 NAME HTML::Widget::Element::Textarea - Textarea Element @@ -77,6 +80,26 @@ =head2 wrap +=head3 JAVASCRIPT EVENTS + +The following events are special for the Textarea type of elements. +In addition the L are available. +They can all be accesses via +C<< $self->events($event => 'javascript' or code-ref) >> or directly +as C<< $self->$event('javascript' or code-ref) >>. + +=over 4 + +=item * onfocus + +=item * onblur + +=item * onchange + +=item * onselect + +=back + =head1 AUTHOR Sebastian Riedel, C === lib/HTML/Widget/Element/Radio.pm ================================================================== --- lib/HTML/Widget/Element/Radio.pm (revision 15) +++ lib/HTML/Widget/Element/Radio.pm (patch events-support level 2) @@ -7,6 +7,9 @@ __PACKAGE__->mk_accessors(qw/comment checked label value/); +# events +__PACKAGE__->mk_attr_accessors(qw/onfocus onblur onselect onchange/); + =head1 NAME HTML::Widget::Element::Radio - Radio Element @@ -92,6 +95,26 @@ return $self->container( { element => $i, error => $e, label => $l } ); } +=head3 JAVASCRIPT EVENTS + +The following events are special for the Radio type of elements. +In addition the L are available. +They can all be accesses via +C<< $self->events($event => 'javascript' or code-ref) >> or directly +as C<< $self->$event('javascript' or code-ref) >>. + +=over 4 + +=item * onfocus + +=item * onblur + +=item * onchange + +=item * onselect + +=back + =head1 AUTHOR Sebastian Riedel, C === lib/HTML/Widget/Element/Select.pm ================================================================== --- lib/HTML/Widget/Element/Select.pm (revision 15) +++ lib/HTML/Widget/Element/Select.pm (patch events-support level 2) @@ -10,6 +10,10 @@ __PACKAGE__->mk_accessors(qw/comment label multiple options selected/); __PACKAGE__->mk_attr_accessors(qw/size/); +# events +__PACKAGE__->mk_attr_accessors(qw/onfocus onblur onchange/); + + =head1 NAME HTML::Widget::Element::Select - Select Element @@ -186,6 +190,24 @@ return $self->container( { element => $selectelm, error => $e, label => $label } ); } +=head3 JAVASCRIPT EVENTS + +The following events are special for the Select type of elements. +In addition the L are available. +They can all be accesses via +C<< $self->events($event => 'javascript' or code-ref) >> or directly +as C<< $self->$event('javascript' or code-ref) >>. + +=over 4 + +=item * onfocus + +=item * onblur + +=item * onchange + +=back + =head1 AUTHOR Sebastian Riedel, C === lib/HTML/Widget/Element/Span.pm ================================================================== --- lib/HTML/Widget/Element/Span.pm (revision 15) +++ lib/HTML/Widget/Element/Span.pm (patch events-support level 2) @@ -38,6 +38,17 @@ return $self->container( { element => $e } ); } +=head3 JAVASCRIPT EVENTS + +The Span class of elements does not have any events, except the ones +inherited from L. +They can all be accesses via +C<< $self->events($event => 'javascript' or code-ref) >> or directly +as C<< $self->$event('javascript' or code-ref) >>. + +=over 4 + +=back =head1 AUTHOR Sebastian Riedel, C === lib/HTML/Widget/Element/Password.pm ================================================================== --- lib/HTML/Widget/Element/Password.pm (revision 15) +++ lib/HTML/Widget/Element/Password.pm (patch events-support level 2) @@ -7,6 +7,9 @@ __PACKAGE__->mk_accessors(qw/comment fill label value/); __PACKAGE__->mk_attr_accessors(qw/size/); +# events +__PACKAGE__->mk_attr_accessors(qw/onfocus onblur onselect onchange/); + =head1 NAME HTML::Widget::Element::Password - Password Element @@ -46,6 +49,26 @@ return $self->container( { element => $i, error => $e, label => $l } ); } +=head3 JAVASCRIPT EVENTS + +The following events are special for the Button type of elements. +In addition the L are available. +They can all be accesses via +C<< $self->events($event => 'javascript' or code-ref) >> or directly +as C<< $self->$event('javascript' or code-ref) >>. + +=over 4 + +=item * onfocus + +=item * onblur + +=item * onchange + +=item * onselect + +=back + =head1 AUTHOR Sebastian Riedel, C === lib/HTML/Widget/Element/Reset.pm ================================================================== --- lib/HTML/Widget/Element/Reset.pm (revision 15) +++ lib/HTML/Widget/Element/Reset.pm (patch events-support level 2) @@ -7,6 +7,9 @@ __PACKAGE__->mk_accessors(qw/value/); +# events +__PACKAGE__->mk_attr_accessors(qw/onfocus onblur onselect onchange/); + # alias *label = \&value; @@ -47,6 +50,26 @@ return $self->container( { element => $i } ); } +=head3 JAVASCRIPT EVENTS + +The following events are special for the Reset type of elements. +In addition the L are available. +They can all be accesses via +C<< $self->events($event => 'javascript' or code-ref) >> or directly +as C<< $self->$event('javascript' or code-ref) >>. + +=over 4 + +=item * onfocus + +=item * onblur + +=item * onchange + +=item * onselect + +=back + =head1 AUTHOR Sebastian Riedel, C === lib/HTML/Widget/Element/Submit.pm ================================================================== --- lib/HTML/Widget/Element/Submit.pm (revision 15) +++ lib/HTML/Widget/Element/Submit.pm (patch events-support level 2) @@ -7,6 +7,9 @@ __PACKAGE__->mk_accessors(qw/value src height width/); +# events +__PACKAGE__->mk_attr_accessors(qw/onfocus onblur onselect onchange/); + # alias *label = \&value; @@ -75,6 +78,26 @@ return $self->container( { element => $i } ); } +=head3 JAVASCRIPT EVENTS + +The following events are special for the Submit type of elements. +In addition the L are available. +They can all be accesses via +C<< $self->events($event => 'javascript' or code-ref) >> or directly +as C<< $self->$event('javascript' or code-ref) >>. + +=over 4 + +=item * onfocus + +=item * onblur + +=item * onchange + +=item * onselect + +=back + =head1 AUTHOR Sebastian Riedel, C ==== BEGIN SVK PATCH BLOCK ==== Version: svk 1.07 (darwin) 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 ==== END SVK PATCH BLOCK ====