use Rose::Object::MakeMethods::Generic
(
- scalar => [ qw(controller) ],
- 'scalar --get_set_init' => [ qw(_actions _flash _error) ],
+ scalar => [ qw() ],
+ 'scalar --get_set_init' => [ qw(controller _actions _flash _flash_detail _no_flash_clear _error) ],
);
my %supported_methods = (
'dialog:close' => 1,
# ## jQuery Form plugin ##
- 'ajaxForm' => 1, # pattern: $(<TARGET>).ajaxForm({ success: eval_json_result })
+ 'ajaxForm' => 1, # $(<TARGET>).ajaxForm({ success: eval_json_result })
# ## jstree plugin ## pattern: $.jstree._reference($(<TARGET>)).<FUNCTION>(<ARGS>)
redirect_to => 1, # window.location.href = <TARGET>
flash => 2, # kivi.display_flash(<TARGET>, <ARGS>)
+ flash_detail => 2, # kivi.display_flash_detail(<TARGET>, <ARGS>)
+ clear_flash => 2, # kivi.clear_flash(<TARGET>, <ARGS>)
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;
$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;
foreach my $idx (0..$num_args - 1) {
# Force flattening from SL::Presenter::EscapedText.
- $args[$idx] = "" . $args[$idx] if ref($args[$idx]) eq '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;
return {};
}
+sub init__flash_detail {
+ return {};
+}
+
sub init__error {
return '';
}
+sub init__no_flash_clear {
+ return '';
+}
+
sub to_json {
my ($self) = @_;
- return SL::JSON::to_json({ error => $self->_error }) if $self->_error;
- return SL::JSON::to_json({ eval_actions => $self->_actions });
+ return SL::JSON::to_json({ error => $self->_error }) if $self->_error;
+ return SL::JSON::to_json({ no_flash_clear => $self->_no_flash_clear, eval_actions => $self->_actions });
}
sub to_array {
return $self;
}
+sub flash_detail {
+ my ($self, $type, @messages) = @_;
+
+ my $message = join '<br>', grep { $_ } @messages;
+
+ if (!$self->_flash_detail->{$type}) {
+ $self->_flash_detail->{$type} = [ 'flash_detail', $type, $message ];
+ push @{ $self->_actions }, $self->_flash_detail->{$type};
+ } else {
+ $self->_flash_detail->{$type}->[-1] .= ' ' . $message;
+ }
+
+ return $self;
+}
+
+sub no_flash_clear{
+ my ($self) = @_;
+ $self->_no_flash_clear('1');
+ return $self;
+}
+
sub error {
my ($self, @messages) = @_;
return $self;
}
+sub init_controller {
+ # fallback
+ require SL::Controller::Base;
+ SL::Controller::Base->new;
+}
+
1;
__END__
On the client side the flashes of all types will be cleared after each
successful ClientJS call that did not end with C<$js-E<gt>error(...)>.
+This clearing can be switched of by the function C<no_flash_clear>
+
+=item C<flash_detail $type, $message>
+
+Display a detailed message C<$message> in the flash of type C<$type>. Multiple calls of
+C<flash_detail> on the same C<$self> will be merged by type.
+So the flash message can be hold short and the visibility of details can toggled by the user.
+
+=item C<no_flash_clear>
+
+No automatic clearing of flash after successful ClientJS call
=item C<error $message>