X-Git-Url: http://wagnertech.de/git?a=blobdiff_plain;f=SL%2FClientJS.pm;h=335bf8163107cdfcf383cd7c7e19a9de039d36cd;hb=deb4d2dbb676d7d6f69dfe7815d6e0cb09bd4a44;hp=ff4aeb8e2eb015b218cc5a4ae5aaaf67592c705b;hpb=a82f3befb2c673b0d1af747033a284ef2434c061;p=kivitendo-erp.git diff --git a/SL/ClientJS.pm b/SL/ClientJS.pm index ff4aeb8e2..335bf8163 100644 --- a/SL/ClientJS.pm +++ b/SL/ClientJS.pm @@ -9,6 +9,7 @@ use SL::JSON (); use Rose::Object::MakeMethods::Generic ( + scalar => [ qw(controller) ], 'scalar --get_set_init' => [ qw(_actions _flash _error) ], ); @@ -65,7 +66,7 @@ my %supported_methods = ( removeData => 2, # Form Events - focus => 1, + focus => 1, # kivi.set_focus() # Generic Event Handling ## pattern: $().(, kivi.get_function_by_name()) on => 3, @@ -74,7 +75,8 @@ my %supported_methods = ( # ## jQuery UI dialog plugin ## pattern: $().dialog('') - # Closing and removing the popup + # Opening and closing and closing a popup + 'dialog:open' => 1, # kivi.popup_dialog() 'dialog:close' => 1, # ## jQuery Form plugin ## @@ -106,6 +108,9 @@ my %supported_methods = ( 'jstree:deselect_node' => 2, 'jstree:deselect_all' => 1, + # ## ckeditor stuff ## + 'focus_ckeditor' => 1, # kivi.focus_ckeditor_when_ready() + # ## other stuff ## redirect_to => 1, # window.location.href = @@ -113,8 +118,12 @@ my %supported_methods = ( reinit_widgets => 0, # kivi.reinit_widgets() run => -1, # kivi.run(, ) run_once_for => 3, # kivi.run_once_for(, ) + + scroll_into_view => 1, # $()[0].scrollIntoView() ); +my %trim_target_for = map { ($_ => 1) } qw(insertAfter insertBefore appendTo prependTo); + sub AUTOLOAD { our $AUTOLOAD; @@ -132,10 +141,10 @@ sub action { $method = (delete($self->{_prefix}) || '') . $method; my $num_args = $supported_methods{$method}; - croak "Unsupported jQuery action: $method" unless defined $num_args; + croak "Unsupported jQuery action: $method" unless defined $num_args; if ($num_args > 0) { - croak "Parameter count mismatch for $method(actual: " . scalar(@args) . " wanted: $num_args)" if scalar(@args) != $num_args; + croak "Parameter count mismatch for $method(actual: " . scalar(@args) . " wanted: $num_args)" if scalar(@args) != $num_args; } else { $num_args *= -1; croak "Parameter count mismatch for $method(actual: " . scalar(@args) . " wanted at least: $num_args)" if scalar(@args) < $num_args; @@ -143,11 +152,15 @@ sub action { } foreach my $idx (0..$num_args - 1) { - # Force flattening from SL::Presenter::EscapedText and trim leading whitespace for scalars - $args[$idx] = "" . $args[$idx] if ref($args[$idx]) eq 'SL::Presenter::EscapedText'; - $args[$idx] =~ s/^\s+// if !ref($args[$idx]); + # Force flattening from SL::Presenter::EscapedText. + $args[$idx] = "" . $args[$idx] if ref($args[$idx]) eq 'SL::Presenter::EscapedText'; } + # Trim leading whitespaces for certain jQuery functions that operate + # on HTML code: $("

test

").appendTo('#some-id'). jQuery croaks + # on leading whitespaces, e.g. on $("

test

"). + $args[0] =~ s{^\s+}{} if $trim_target_for{$method}; + push @{ $self->_actions }, [ $method, @args ]; return $self; @@ -185,6 +198,7 @@ sub to_array { sub render { my ($self, $controller) = @_; + $controller ||= $self->controller; $self->reinit_widgets if $::request->presenter->need_reinit_widgets; return $controller->render(\$self->to_json, { type => 'json' }); } @@ -201,6 +215,12 @@ sub dialog { return $self; } +sub ckeditor { + my ($self) = @_; + $self->{_prefix} = 'ckeditor:'; + return $self; +} + sub flash { my ($self, $type, @messages) = @_; @@ -260,7 +280,7 @@ Now some Perl code: my ($self) = @_; # Create a new client-side JS object and do stuff with it! - my $js = SL::ClientJS->new; + my $js = SL::ClientJS->new(controller => $self); # Show some element on the page: $js->show('#usually_hidden'); @@ -286,7 +306,7 @@ Now some Perl code: # Rendering can also be chained, e.g. $js->html('#selector', $html) - ->render($self); + ->render; } =head1 OVERVIEW @@ -336,13 +356,16 @@ are the function parameters. Returns the actions gathered so far as a JSON string ready to be sent to the client. -=item C +=item C Renders C<$self> via the controller. Useful for chaining. Equivalent to the following: $controller->render(\$self->to_json, { type => 'json' }); +The controller instance to use can be set during object creation (see +synopsis) or as an argument to C. + =item C Tells C<$self> that the next action is to be called on a jQuery UI