1 package SL::Presenter::DatePeriod;
5 use Exporter qw(import);
8 get_dialog_defaults_from_report_generator
9 populate_hidden_variables
12 use SL::Presenter::Tag qw(name_to_id);
14 sub date_period_picker {
15 my ($name, $value_from, $value_to, %params) = @_;
17 my $id = name_to_id($name);
18 my @classes = $params{class} ? ($params{class}) : ();
19 push @classes, 'date_period_picker';
21 my $dialog_defaults = {
22 year => $params{dialog_defaults}->{year} // DateTime->today->year,
23 type => $params{dialog_defaults}->{type} // 'yearly',
24 quarter => $params{dialog_defaults}->{quarter} // 'A',
25 month => $params{dialog_defaults}->{month} // '1',
28 my $html = SL::Presenter->get->render(
29 'presenter/date_period/date_period_picker',
33 report_period_from_date => $value_from || '',
34 report_period_to_date => $value_to || '',
35 dialog => $dialog_defaults
37 years_list => get_years(),
38 months_list => get_months(),
40 $::request->layout->add_javascripts('kivi.Presenter.DatePeriodPicker.js');
45 ### convenience functions
47 sub get_dialog_defaults_from_report_generator {
50 my $id = name_to_id($name);
52 my %fallback_dateperiod_dialog = (
53 year => DateTime->today->year,
59 for (keys %fallback_dateperiod_dialog) {
60 $defaults_dialog{$_} = $::form->{$id . '_selected_preset_' . $_} //
61 $::form->{'report_generator_hidden_' . $id . '_selected_preset_' . $_} //
62 $fallback_dateperiod_dialog{$_};
64 return \%defaults_dialog;
67 sub populate_hidden_variables {
68 my ($name, $hidden_variables_ref) = @_;
70 my $id = name_to_id($name);
77 _selected_preset_quarter
78 _selected_preset_month
81 push @{ $hidden_variables_ref }, map { $id . $_ } @vars;
87 my $dt = DateTime->now;
88 my $months = $dt->{locale}->{locale_data}->{month_format_wide};
90 [ map { $i++; [ $i, $::locale->text($_) ] } @{ $months } ];
94 my $current = DateTime->today->year;
95 [ map { [ $current - $_, $current - $_, ] } (0..39) ];
98 sub picker { goto &date_period_picker }
108 SL::Presenter::DatePeriod - Date period stuff
113 use SL::Presenter::DatePeriod qw(date_period_picker);
114 my $html = date_period_picker('my-picker-id', '', '');
115 my $html = date_period_picker('my-other-picker-id', $from_date, $to_date);
118 [% P.date_period.picker('my-picker-id', '', '') %]
119 [% P.date_period.picker('my-other-picker-id',
122 dialog_defaults => defaults.dialog) %]
124 see also L<SL::Presenter>
126 =head1 DATE PERIOD PICKER UI DESCRIPTION
128 Two date input fields are shown: 'From' and 'To', to select a date period.
130 Additionally a button is shown: 'Select from preset'.
132 When clicked it shows a dialog that allows the selection of a date period
133 from sensible presets.
139 The dialog shows a select 'Year', containing the current year plus years up
142 A period is selected with a radio button, that is either 'yearly' (default),
143 'quarterly' or 'monthly'.
145 For quarterly and monthly there is a select shown containing the respective
154 =item C<date_period_picker $name, $value_from, $value_to, %params>
156 Renders a date period picker with preset dialog.
158 C<$name> should be a unique name. It is converted to an id for the main
159 element. This id is also used as a prefix for all sub-elements that need an id.
161 B<Important:> The selected dates are available from the form elements
163 C<id _ '_from_date'> and C<id _ '_to_date'>.
165 In above example this would be C<'my-picker-id_from_date'> and
166 C<'my-picker-id_to_date'>.
168 C<$value_from> and C<$value_to> are used as preset values for the respective
169 date fields. This may be useful to keep entered value between page switches.
171 C<$params> Classes in C<class> are forwarded to the main element.
173 If you want to keep the selection over multiple requests this has to be handled
176 C<$params> can therefor contain a hash called C<dialog_defaults> with the
179 year => DateTime->today->year, # numeric year
180 type => 'yearly', # the radio button selection:
181 # 'yearly', 'monthly', 'quarterly'
182 quarter => 'A', # the quarter as a letter code:
183 # 'A', 'B', 'C', 'D' A being 1st quarter etc.
184 month => '1', # numeric month
186 The values will be used to pre-select the dialog fields.
188 These values are also set into some hidden fields with the id in the format
189 e.g.: C<id _ '_selected_preset_year'>.
191 Convenience functions to handle report generator hidden variables are provided.
194 use SL::Presenter::DatePeriod qw(get_dialog_defaults_from_report_generator
195 populate_hidden_variables);
197 # use values from form, then report generator form, then fallback
199 dateperiod_from_date => '',
200 dateperiod_to_date => '',
205 for (keys %fallback) {
206 $defaults{$_} = $::form->{$_} // $::form->{'report_generator_hidden_' . $_} // $fallback{$_};
209 # set dialog defaults
210 $defaults{dialog} = get_dialog_defaults_from_report_generator('dateperiod');
212 # set hidden fields for the report generator
213 my @hidden_variables = qw(chart_id); # e.g.
214 populate_hidden_variables('dateperiod', \@hidden_variables);
216 =item C<get_dialog_defaults_from_report_generator $name>
218 Convenience function to get the dialog defaults from hidden report generator
219 fields. (Use in controller.)
221 First uses form fields: C<$id . '_selected_preset_' ...>.
222 Then report generator fields: C<'report_generator_hidden_' . $id . '_selected_preset_' ...>
224 C<$name> name of the date picker.
226 =item C<populate_hidden_variables $name $hidden_variables_ref>
228 Convenience function Add hidden variables to report a generator.
231 C<$name> name of the date picker.
233 C<$hidden_variables_ref> reference to the hidden variable array.
237 =head1 USE / MOTIVATION / GOAL
239 Use date_period_picker when you want to select a date period with preset
242 Planned use: ListTransactions report settings view (new, replacement for
245 Possible uses in report settings views for:
247 - rp/erfolgsrechnung (swiss)
249 - Inventory/stock_usage
253 Current implementations for report periods repeat a lot of template and
254 perl code in different places. Hopefully this can be reduced.
256 While this UI may require slightly more clicks than previous / current
257 implementations, the interface is much more concise. It is easier on the eyes
258 and fits better into the new design 4.0.
262 If multiple date_period_picker elements were to be used on the same page the
263 handling of hidden variables becomes ugly.
265 my @hidden_variables = qw(
268 dateperiod_selected_preset_year
269 dateperiod_selected_preset_type
273 Convenience functions are provided to help handle this. Currently i don't see
274 another way of handling this.
282 Cem Aydin E<lt>cem.aydin@revamp-it.chE<gt>