File Coverage

blib/lib/Mojolicious/Plugin/FormFieldsFromJSON/Date.pm
Criterion Covered Total %
statement 57 58 98.2
branch 19 26 73.0
condition 10 20 50.0
subroutine 7 7 100.0
pod 1 1 100.0
total 94 112 83.9


line stmt bran cond sub pod time code
1             package Mojolicious::Plugin::FormFieldsFromJSON::Date;
2 3     3   2363 use Mojo::Base 'Mojolicious::Plugin';
  3         5  
  3         18  
3              
4             our $VERSION = '0.03';
5              
6 3     3   1736 use Time::Piece;
  3         12729  
  3         19  
7              
8             sub register {
9 3     3 1 142 my ($self, $app) = @_;
10              
11 3         11 1;
12             }
13              
14             sub Mojolicious::Plugin::FormFieldsFromJSON::_date {
15 4     4   161053 my ($self, $c, $field, %params) = @_;
16              
17 4   33     34 my $name = $field->{name} // $field->{label} // '';
      50        
18 4   33     130 my $id = $field->{id} // $name;
19 4 100       8 my %local_params = %{ $params{$name} || {} };
  4         30  
20              
21 4 100       35 my $requested = ( $c->param( $name . '-day' ) ) ?
22             ( sprintf "%04d-%02d-%02d",
23             $c->param( $name . '-year' ),
24             $c->param( $name . '-month' ),
25             $c->param( $name . '-day' ),
26             ) :
27             "";
28              
29 4         2432 my $now = localtime;
30 4   66     367 my $default = $local_params{data} || $requested || $field->{data} || $now->ymd;
31 4         114 my $selected = Time::Piece->strptime( $default, '%Y-%m-%d' );
32              
33 4 50       42 my $day = _day_dropdown(
34             $c,
35 4         118 %{ $field->{attributes} || {} },
36             %local_params,
37             day => $selected->mday,
38             id => $id . '-day',
39             name => $name . '-day',
40             );
41              
42 4 50       50 my $month = _month_dropdown(
43             $c,
44 4         7141 %{ $field->{attributes} || {} },
45             %local_params,
46             month => $selected->mon,
47             id => $id . '-month',
48             name => $name . '-month',
49             );
50              
51 4 50       41 my $year = _year_dropdown(
52             $c,
53             startyear => $field->{startyear},
54 4         2299 %{ $field->{attributes} || {} },
55             %local_params,
56             year => $selected->year,
57             id => $id . '-year',
58             name => $name . '-year',
59             );
60              
61 4   50     1728 my $format = $params{format} || $field->{format} || '%Y-%m-%d';
62 4         18 $format =~ s/-//g;
63 4         23 $format =~ s/\%Y/$year/g;
64 4         35 $format =~ s/\%m/$month/g;
65 4         41 $format =~ s/\%d/$day/g;
66              
67 4         91 return $format;
68             }
69              
70             sub _day_dropdown {
71 4     4   373 my ($c, %params) = @_;
72              
73 124 100       170 my @days = map{
74 4         15 my %opts = ( $_ == $params{day} ) ?
75             ('selected' => 'selected') :
76             ();
77 124         269 [ $_ => sprintf("%02d", $_) , %opts ]
78             }(1 .. 31);
79              
80 4         22 $c->param( $params{name}, '' );
81              
82 4 50       92 my $select = $c->select_field(
83             $params{name},
84             \@days,
85             id => $params{id},
86 4         257 %{ $params{attrs} || {} },
87             );
88             }
89              
90             sub _month_dropdown {
91 4     4   46 my ($c, %params) = @_;
92              
93 48 100       79 my @months = map{
94 4         10 my %opts = ( $_ == $params{month} ) ?
95             ('selected' => 'selected') :
96             ();
97 48         125 [ $_ => sprintf("%02d", $_), %opts ]
98             }(1 .. 12);
99              
100 4         21 $c->param( $params{name}, '' );
101              
102 4 50       45 my $select = $c->select_field(
103             $params{name},
104             \@months,
105             id => $params{id},
106 4         262 %{ $params{attrs} || {} },
107             );
108             }
109              
110             sub _year_dropdown {
111 4     4   39 my ($c, %params) = @_;
112              
113 4         14 my $now = localtime;
114 4   66     257 my $base = ( $params{startyear} // $now->year );
115 4   50     28 my $start = $base - ( $params{past} // 1 );
116 4   50     18 my $stop = $base + ( $params{future} // 5 );
117              
118 4         15 $c->param( $params{name}, '' );
119              
120 4         249 my $has_year;
121 28 100       51 my @years = map{
122 4         15 $has_year++ if $_ == $params{year};
123 28 100       54 my %opts = ( $_ == $params{year} ) ?
124             ('selected' => 'selected') :
125             ();
126 28         53 [ $_ => $_, %opts ]
127             }($start .. $stop);
128              
129 4 50       12 if ( !$has_year ) {
130 0         0 unshift @years, [ $params{year} => $params{year}, { selected => 'selected' } ];
131             }
132              
133 4 50       38 my $select = $c->select_field(
134             $params{name},
135             \@years,
136             id => $params{id},
137 4         16 %{ $params{attrs} || {} },
138             );
139             }
140              
141             1;
142              
143             __END__