Projekt

Allgemein

Profil

Herunterladen (7,58 KB) Statistiken
| Zweig: | Markierung: | Revision:
package SL::Presenter::DatePeriod;

use strict;

use Exporter qw(import);
our @EXPORT_OK = qw(
date_period_picker
get_dialog_defaults_from_report_generator
populate_hidden_variables
);

use SL::Presenter::Tag qw(name_to_id);

sub date_period_picker {
my ($name, $value_from, $value_to, %params) = @_;

my $id = name_to_id($name);
my @classes = $params{class} ? ($params{class}) : ();
push @classes, 'date_period_picker';

my $dialog_defaults = {
year => $params{dialog_defaults}->{year} // DateTime->today->year,
type => $params{dialog_defaults}->{type} // 'yearly',
quarter => $params{dialog_defaults}->{quarter} // 'A',
month => $params{dialog_defaults}->{month} // '1',
};

my $html = SL::Presenter->get->render(
'presenter/date_period/date_period_picker',
id => $id,
classes => \@classes,
defaults => {
report_period_from_date => $value_from || '',
report_period_to_date => $value_to || '',
dialog => $dialog_defaults
},
years_list => get_years(),
months_list => get_months(),
);
$::request->layout->add_javascripts('kivi.Presenter.DatePeriodPicker.js');

return $html;
}

### convenience functions

sub get_dialog_defaults_from_report_generator {
my ($name) = @_;

my $id = name_to_id($name);

my %fallback_dateperiod_dialog = (
year => DateTime->today->year,
type => 'yearly',
quarter => 'A',
month => '1',
);
my %defaults_dialog;
for (keys %fallback_dateperiod_dialog) {
$defaults_dialog{$_} = $::form->{$id . '_selected_preset_' . $_} //
$::form->{'report_generator_hidden_' . $id . '_selected_preset_' . $_} //
$fallback_dateperiod_dialog{$_};
}
return \%defaults_dialog;
}

sub populate_hidden_variables {
my ($name, $hidden_variables_ref) = @_;

my $id = name_to_id($name);

my @vars = qw(
_from_date
_to_date
_selected_preset_year
_selected_preset_type
_selected_preset_quarter
_selected_preset_month
);

push @{ $hidden_variables_ref }, map { $id . $_ } @vars;
}

### helper

sub get_months {
my $dt = DateTime->now;
my $months = $dt->{locale}->{locale_data}->{month_format_wide};
my $i = 0;
[ map { $i++; [ $i, $::locale->text($_) ] } @{ $months } ];
}

sub get_years {
my $current = DateTime->today->year;
[ map { [ $current - $_, $current - $_, ] } (0..39) ];
}

sub picker { goto &date_period_picker }

1;

__END__

=encoding utf-8

=head1 NAME

SL::Presenter::DatePeriod - Date period stuff

=head1 SYNOPSIS

# use in perl code
use SL::Presenter::DatePeriod qw(date_period_picker);
my $html = date_period_picker('my-picker-id', '', '');
my $html = date_period_picker('my-other-picker-id', $from_date, $to_date);

# use in template
[% P.date_period.picker('my-picker-id', '', '') %]
[% P.date_period.picker('my-other-picker-id',
defaults.from_date,
defaults.to_date,
dialog_defaults => defaults.dialog) %]

see also L<SL::Presenter>

=head1 DATE PERIOD PICKER UI DESCRIPTION

Two date input fields are shown: 'From' and 'To', to select a date period.

Additionally a button is shown: 'Select from preset'.

When clicked it shows a dialog that allows the selection of a date period
from sensible presets.

=over 2

=item Dialog:

The dialog shows a select 'Year', containing the current year plus years up
to forty years back.

A period is selected with a radio button, that is either 'yearly' (default),
'quarterly' or 'monthly'.

For quarterly and monthly there is a select shown containing the respective
values.

=back

=head1 FUNCTIONS

=over 2

=item C<date_period_picker $name, $value_from, $value_to, %params>

Renders a date period picker with preset dialog.

C<$name> should be a unique name. It is converted to an id for the main
element. This id is also used as a prefix for all sub-elements that need an id.

B<Important:> The selected dates are available from the form elements

C<id _ '_from_date'> and C<id _ '_to_date'>.

In above example this would be C<'my-picker-id_from_date'> and
C<'my-picker-id_to_date'>.

C<$value_from> and C<$value_to> are used as preset values for the respective
date fields. This may be useful to keep entered value between page switches.

C<$params> Classes in C<class> are forwarded to the main element.

If you want to keep the selection over multiple requests this has to be handled
in the controller.

C<$params> can therefor contain a hash called C<dialog_defaults> with the
key/values:

year => DateTime->today->year, # numeric year
type => 'yearly', # the radio button selection:
# 'yearly', 'monthly', 'quarterly'
quarter => 'A', # the quarter as a letter code:
# 'A', 'B', 'C', 'D' A being 1st quarter etc.
month => '1', # numeric month

The values will be used to pre-select the dialog fields.

These values are also set into some hidden fields with the id in the format
e.g.: C<id _ '_selected_preset_year'>.

Convenience functions to handle report generator hidden variables are provided.
E.g.:

use SL::Presenter::DatePeriod qw(get_dialog_defaults_from_report_generator
populate_hidden_variables);

# use values from form, then report generator form, then fallback
my %fallback = (
dateperiod_from_date => '',
dateperiod_to_date => '',
# other fields e.g.:
# chart_id => '',
);
my %defaults;
for (keys %fallback) {
$defaults{$_} = $::form->{$_} // $::form->{'report_generator_hidden_' . $_} // $fallback{$_};
}

# set dialog defaults
$defaults{dialog} = get_dialog_defaults_from_report_generator('dateperiod');

# set hidden fields for the report generator
my @hidden_variables = qw(chart_id); # e.g.
populate_hidden_variables('dateperiod', \@hidden_variables);

=item C<get_dialog_defaults_from_report_generator $name>

Convenience function to get the dialog defaults from hidden report generator
fields. (Use in controller.)

First uses form fields: C<$id . '_selected_preset_' ...>.
Then report generator fields: C<'report_generator_hidden_' . $id . '_selected_preset_' ...>

C<$name> name of the date picker.

=item C<populate_hidden_variables $name $hidden_variables_ref>

Convenience function Add hidden variables to report a generator.
(Use in controller.)

C<$name> name of the date picker.

C<$hidden_variables_ref> reference to the hidden variable array.

=back

=head1 USE / MOTIVATION / GOAL

Use date_period_picker when you want to select a date period with preset
dialog.

Planned use: ListTransactions report settings view (new, replacement for
ca/list).

Possible uses in report settings views for:

- rp/erfolgsrechnung (swiss)
- rp/trial_balance
- Inventory/stock_usage

And possibly more.

Current implementations for report periods repeat a lot of template and
perl code in different places. Hopefully this can be reduced.

While this UI may require slightly more clicks than previous / current
implementations, the interface is much more concise. It is easier on the eyes
and fits better into the new design 4.0.

=head1 LIMITATIONS

If multiple date_period_picker elements were to be used on the same page the
handling of hidden variables becomes ugly.

my @hidden_variables = qw(
dateperiod_from_date
dateperiod_to_date
dateperiod_selected_preset_year
dateperiod_selected_preset_type
# ... etc.
);

Convenience functions are provided to help handle this. Currently i don't see
another way of handling this.

=head1 BUGS

None atm :)

=head1 AUTHOR

Cem Aydin E<lt>cem.aydin@revamp-it.chE<gt>

=cut
(7-7/34)