File Coverage

lib/Mojolicious/Plugin/BootstrapAlerts.pm
Criterion Covered Total %
statement 57 57 100.0
branch 16 20 80.0
condition 14 24 58.3
subroutine 8 8 100.0
pod 1 1 100.0
total 96 110 87.2


line stmt bran cond sub pod time code
1             package Mojolicious::Plugin::BootstrapAlerts;
2              
3             # ABSTRACT: Bootstrap alerts for your web app
4              
5 7     7   5560 use strict;
  7         18  
  7         269  
6 7     7   41 use warnings;
  7         15  
  7         253  
7              
8 7     7   11730 use parent 'Mojolicious::Plugin';
  7         2324  
  7         51  
9              
10 7     7   434 use Mojo::ByteStream;
  7         12  
  7         4796  
11              
12             our $VERSION = 0.06;
13              
14             sub register {
15 7     7 1 6624 my ($self, $app, $config) = @_;
16              
17 7   66     100 my $dismissable = !( $config && exists $config->{dismissable} && $config->{dismissable} == 0 );
18              
19             $app->helper( notify => sub {
20 17     17   342276 my $c = shift;
21 17         38 push @{ $c->stash->{__NOTIFICATIONS__} }, [ @_ ];
  17         61  
22 7         89 } );
23              
24             $app->helper( notifications => sub {
25 13     13   98390 my $c = shift;
26 13         34 my $notifications_config = shift;
27              
28 13         31 my $output = '';
29              
30 13 100       28 for my $notification ( @{ $c->stash('__NOTIFICATIONS__') || [] } ) {
  13         50  
31 17         171 my ($type, $message, $config) = @{ $notification };
  17         42  
32              
33 17         39 my ($dismissable_class, $dismissable_button) = ("","");
34 17 100 100     160 if ( $config->{dismissable} || (!exists $config->{dismissable} && $dismissable) ) {
      33        
35 12         23 $dismissable_class = 'alert-dismissable';
36 12         20 $dismissable_button = '';
37             }
38              
39 17 100 66     94 if ( ref $message and ref $message eq 'ARRAY' ) {
40 6         18 my $items = join '', map{ "
  • $_
  • " }@{ $message };
      12         39  
      6         14  
    41 6 100       33 my $list_type = $config->{ordered_list} ? 'ol' : 'ul';
    42              
    43 6         24 $message = "<$list_type>$items";
    44             }
    45              
    46 17 100       51 $type = 'danger' if $type eq 'error';
    47              
    48 17         127 $output .= qq~
    49            
    50             $dismissable_button
    51             $message
    52            
    53             ~;
    54             }
    55              
    56 13         253 return Mojo::ByteStream->new( $output );
    57 7         919 } );
    58              
    59 7 50 66     755 if ( $config && $config->{auto_inject} && ($config->{before} || $config->{after}) ) {
          33        
          66        
    60             $app->hook( after_render => sub {
    61 4     4   9844 my ($c, $content, $format) = @_;
    62              
    63 4 50       24 return if $format ne 'html';
    64              
    65 4         44 my $notifications = $c->notifications->to_string;
    66              
    67 4 50       187 return if !$notifications;
    68              
    69 4         8 my $dom = Mojo::DOM->new( ${$content} );
      4         34  
    70 4   33     1622 my $selector = $config->{before} || $config->{after};
    71 4         19 my $element = $dom->at( $selector );
    72              
    73 4 100       1330 if ( !$element ) {
    74 2         47 $c->app->log->debug( 'no matching element found (' . $selector . ')' );
    75 2         130 return;
    76             }
    77              
    78 2 50       27 my @elems = $config->{before} ? ($notifications, "$element") : ("$element", $notifications);
    79 2         283 my $replacement = sprintf "%s%s", @elems;
    80 2         5 my $temp = "$element";
    81              
    82 2         197 ${$content} =~ s/\Q$temp\E/$replacement/;
      2         45  
    83 2         36 });
    84             }
    85             }
    86              
    87             1;
    88              
    89             __END__