projects
/
kivitendo-erp.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
SL::DB::Object: clone_and_reset unter Umgehung von itime, mtime
[kivitendo-erp.git]
/
SL
/
ClientJS.pm
diff --git
a/SL/ClientJS.pm
b/SL/ClientJS.pm
index
204e320
..
335bf81
100644
(file)
--- a/
SL/ClientJS.pm
+++ b/
SL/ClientJS.pm
@@
-9,13
+9,11
@@
use SL::JSON ();
use Rose::Object::MakeMethods::Generic
(
use Rose::Object::MakeMethods::Generic
(
+ scalar => [ qw(controller) ],
'scalar --get_set_init' => [ qw(_actions _flash _error) ],
);
my %supported_methods = (
'scalar --get_set_init' => [ qw(_actions _flash _error) ],
);
my %supported_methods = (
- # ## Non-jQuery methods ##
- flash => 2, # kivi.display_flash(<TARGET>, <ARGS>)
-
# ## jQuery basics ##
# Basic effects
# ## jQuery basics ##
# Basic effects
@@
-68,7
+66,7
@@
my %supported_methods = (
removeData => 2,
# Form Events
removeData => 2,
# Form Events
- focus => 1,
+ focus => 1,
# kivi.set_focus(<TARGET>)
# Generic Event Handling ## pattern: $(<TARGET>).<FUNCTION>(<ARG1>, kivi.get_function_by_name(<ARG2>))
on => 3,
# Generic Event Handling ## pattern: $(<TARGET>).<FUNCTION>(<ARG1>, kivi.get_function_by_name(<ARG2>))
on => 3,
@@
-77,7
+75,8
@@
my %supported_methods = (
# ## jQuery UI dialog plugin ## pattern: $(<TARGET>).dialog('<FUNCTION>')
# ## jQuery UI dialog plugin ## pattern: $(<TARGET>).dialog('<FUNCTION>')
- # Closing and removing the popup
+ # Opening and closing and closing a popup
+ 'dialog:open' => 1, # kivi.popup_dialog(<TARGET>)
'dialog:close' => 1,
# ## jQuery Form plugin ##
'dialog:close' => 1,
# ## jQuery Form plugin ##
@@
-109,12
+108,22
@@
my %supported_methods = (
'jstree:deselect_node' => 2,
'jstree:deselect_all' => 1,
'jstree:deselect_node' => 2,
'jstree:deselect_all' => 1,
+ # ## ckeditor stuff ##
+ 'focus_ckeditor' => 1, # kivi.focus_ckeditor_when_ready(<TARGET>)
+
# ## other stuff ##
redirect_to => 1, # window.location.href = <TARGET>
# ## other stuff ##
redirect_to => 1, # window.location.href = <TARGET>
+ flash => 2, # kivi.display_flash(<TARGET>, <ARGS>)
reinit_widgets => 0, # kivi.reinit_widgets()
reinit_widgets => 0, # kivi.reinit_widgets()
+ run => -1, # kivi.run(<TARGET>, <ARGS>)
+ run_once_for => 3, # kivi.run_once_for(<TARGET>, <ARGS>)
+
+ scroll_into_view => 1, # $(<TARGET>)[0].scrollIntoView()
);
);
+my %trim_target_for = map { ($_ => 1) } qw(insertAfter insertBefore appendTo prependTo);
+
sub AUTOLOAD {
our $AUTOLOAD;
sub AUTOLOAD {
our $AUTOLOAD;
@@
-132,15
+141,26
@@
sub action {
$method = (delete($self->{_prefix}) || '') . $method;
my $num_args = $supported_methods{$method};
$method = (delete($self->{_prefix}) || '') . $method;
my $num_args = $supported_methods{$method};
- croak "Unsupported jQuery action: $method" unless defined $num_args;
- croak "Parameter count mismatch for $method(actual: " . scalar(@args) . " wanted: $num_args)" if scalar(@args) != $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;
+ } else {
+ $num_args *= -1;
+ croak "Parameter count mismatch for $method(actual: " . scalar(@args) . " wanted at least: $num_args)" if scalar(@args) < $num_args;
+ $num_args = scalar @args;
+ }
foreach my $idx (0..$num_args - 1) {
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: $("<p>test</p>").appendTo('#some-id'). jQuery croaks
+ # on leading whitespaces, e.g. on $(" <p>test</p>").
+ $args[0] =~ s{^\s+}{} if $trim_target_for{$method};
+
push @{ $self->_actions }, [ $method, @args ];
return $self;
push @{ $self->_actions }, [ $method, @args ];
return $self;
@@
-178,6
+198,7
@@
sub to_array {
sub render {
my ($self, $controller) = @_;
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' });
}
$self->reinit_widgets if $::request->presenter->need_reinit_widgets;
return $controller->render(\$self->to_json, { type => 'json' });
}
@@
-194,6
+215,12
@@
sub dialog {
return $self;
}
return $self;
}
+sub ckeditor {
+ my ($self) = @_;
+ $self->{_prefix} = 'ckeditor:';
+ return $self;
+}
+
sub flash {
my ($self, $type, @messages) = @_;
sub flash {
my ($self, $type, @messages) = @_;
@@
-253,7
+280,7
@@
Now some Perl code:
my ($self) = @_;
# Create a new client-side JS object and do stuff with it!
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');
# Show some element on the page:
$js->show('#usually_hidden');
@@
-279,7
+306,7
@@
Now some Perl code:
# Rendering can also be chained, e.g.
$js->html('#selector', $html)
# Rendering can also be chained, e.g.
$js->html('#selector', $html)
- ->render
($self)
;
+ ->render;
}
=head1 OVERVIEW
}
=head1 OVERVIEW
@@
-329,13
+356,16
@@
are the function parameters.
Returns the actions gathered so far as a JSON string ready to be sent
to the client.
Returns the actions gathered so far as a JSON string ready to be sent
to the client.
-=item C<render
$controller
>
+=item C<render
[$controller]
>
Renders C<$self> via the controller. Useful for chaining. Equivalent
to the following:
$controller->render(\$self->to_json, { type => 'json' });
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<render>.
+
=item C<dialog>
Tells C<$self> that the next action is to be called on a jQuery UI
=item C<dialog>
Tells C<$self> that the next action is to be called on a jQuery UI
@@
-447,6
+477,26
@@
L<SL::Request/is_ajax>.
=back
=back
+=head2 KIVITENDO FUNCTIONS
+
+The following functions from the C<kivi> namespace are supported:
+
+=over 4
+
+=item Displaying stuff
+
+C<flash> (don't call directly, use L</flash> instead)
+
+=item Running functions
+
+C<run>, C<run_once_for>
+
+=item Widgets
+
+C<reinit_widgets>
+
+=back
+
=head2 JQUERY FUNCTIONS
The following jQuery functions are supported:
=head2 JQUERY FUNCTIONS
The following jQuery functions are supported:
@@
-481,6
+531,10
@@
C<replaceAll>, C<replaceWith>
C<attr>, C<prop>, C<removeAttr>, C<removeProp>, C<val>
C<attr>, C<prop>, C<removeAttr>, C<removeProp>, C<val>
+=item Class attributes
+
+C<addClass>, C<removeClass>, C<toggleClass>
+
=item Data storage
C<data>, C<removeData>
=item Data storage
C<data>, C<removeData>
@@
-500,13
+554,45
@@
already exist when the handler is added.
=back
=back
-=head2 JSTREE JQUERY PLUGIN
+=head2 JQUERY POPUP DIALOG PLUGIN
+
+Supported functions of the C<popup dialog> plugin to jQuery. They are
+invoked by first calling C<dialog> in the ClientJS instance and then
+the function itself:
+
+ $js->dialog->close(...);
+
+=over 4
+
+=item Closing and removing the popup
+
+C<close>
+
+=back
-The following functions of the C<jstree> plugin to jQuery are
+=head2 AJAXFORM JQUERY PLUGIN
+
+The following functions of the C<ajaxForm> plugin to jQuery are
supported:
=over 4
supported:
=over 4
+=item All functions by the generic accessor function:
+
+C<ajaxForm>
+
+=back
+
+=head2 JSTREE JQUERY PLUGIN
+
+Supported functions of the C<jstree> plugin to jQuery. They are
+invoked by first calling C<jstree> in the ClientJS instance and then
+the function itself:
+
+ $js->jstree->open_node(...);
+
+=over 4
+
=item Operations on the whole tree
C<lock>, C<unlock>
=item Operations on the whole tree
C<lock>, C<unlock>
@@
-537,7
+623,10
@@
C<js/client_js.js> accordingly. The steps are:
=item 1. Add lines in this file to the C<%supported_methods> hash. The
key is the function name and the value is the number of expected
=item 1. Add lines in this file to the C<%supported_methods> hash. The
key is the function name and the value is the number of expected
-parameters.
+parameters. The value can be negative to indicate that the function
+takes at least the absolute of this value as parameters and optionally
+more. In such a case the C<E<lt>ARGSE<gt>> format expands to an actual
+array (and the individual elements if the value is positive>.
=item 2. Run C<scripts/generate_client_js_actions.pl>. It will
generate C<js/client_js.js> automatically.
=item 2. Run C<scripts/generate_client_js_actions.pl>. It will
generate C<js/client_js.js> automatically.