From 5dfbdd864433a01271e8025842b20608146e5152 Mon Sep 17 00:00:00 2001 From: Daniel Friesel Date: Sat, 2 Apr 2022 15:24:39 +0200 Subject: [PATCH] history map: add filter by date --- lib/Travelynx/Controller/Traveling.pm | 29 ++++++++++++++++++++++++- lib/Travelynx/Model/Journeys.pm | 31 ++++++++++++++++----------- templates/history_map.html.ep | 24 ++++++++++++++++++++- 3 files changed, 70 insertions(+), 14 deletions(-) diff --git a/lib/Travelynx/Controller/Traveling.pm b/lib/Travelynx/Controller/Traveling.pm index 9f8a193..7a036a7 100755 --- a/lib/Travelynx/Controller/Traveling.pm +++ b/lib/Travelynx/Controller/Traveling.pm @@ -797,11 +797,38 @@ sub map_history { } my $route_type = $self->param('route_type'); + my $filter_from = $self->param('filter_after'); + my $filter_until = $self->param('filter_before'); my $with_polyline = $route_type eq 'beeline' ? 0 : 1; + my $parser = DateTime::Format::Strptime->new( + pattern => '%d.%m.%Y', + locale => 'de_DE', + time_zone => 'Europe/Berlin' + ); + + if ( $filter_from and $filter_from =~ m{ ^ (\d+) [.] (\d+) [.] (\d+) $ }x ) + { + $filter_from = $parser->parse_datetime($filter_from); + } + else { + $filter_from = undef; + } + + if ( $filter_until + and $filter_until =~ m{ ^ (\d+) [.] (\d+) [.] (\d+) $ }x ) + { + $filter_until = $parser->parse_datetime($filter_until); + } + else { + $filter_until = undef; + } + my @journeys = $self->journeys->get( uid => $self->current_user->{id}, - with_polyline => $with_polyline + with_polyline => $with_polyline, + after => $filter_from, + before => $filter_until, ); if ( not @journeys ) { diff --git a/lib/Travelynx/Model/Journeys.pm b/lib/Travelynx/Model/Journeys.pm index 2e97150..8567d27 100755 --- a/lib/Travelynx/Model/Journeys.pm +++ b/lib/Travelynx/Model/Journeys.pm @@ -156,7 +156,7 @@ sub add { push( @route, [ $station_info->[1], {}, undef ] ); } else { - push( @route, [ $station, {}, undef ] ); + push( @route, [ $station, {}, undef ] ); push( @unknown_stations, $station ); } } @@ -519,6 +519,12 @@ sub get { $where{real_dep_ts} = { -between => [ $opt{after}->epoch, $opt{before}->epoch, ] }; } + elsif ( $opt{after} ) { + $where{real_dep_ts} = { '>=', $opt{after}->epoch }; + } + elsif ( $opt{before} ) { + $where{real_dep_ts} = { '<=', $opt{before}->epoch }; + } if ( $opt{with_polyline} ) { push( @select, 'polyline' ); @@ -975,9 +981,10 @@ sub get_travel_distance { for my $station (@polyline) { #lonlatlonlat - $distance_polyline - += $geo->distance_metal( $prev_station->[1], - $prev_station->[0], $station->[1], $station->[0] ); + $distance_polyline += $geo->distance_metal( + $prev_station->[1], $prev_station->[0], + $station->[1], $station->[0] + ); $prev_station = $station; } @@ -1004,9 +1011,10 @@ sub get_travel_distance { $to_station_beeline = $station; } if ( $#{$prev_station} >= 4 and $#{$station} >= 4 ) { - $distance_intermediate - += $geo->distance_metal( $prev_station->[4], - $prev_station->[3], $station->[4], $station->[3] ); + $distance_intermediate += $geo->distance_metal( + $prev_station->[4], $prev_station->[3], + $station->[4], $station->[3] + ); } else { $skipped++; @@ -1017,9 +1025,8 @@ sub get_travel_distance { if ( $from_station_beeline and $to_station_beeline ) { $distance_beeline = $geo->distance_metal( - $from_station_beeline->[4], - $from_station_beeline->[3], $to_station_beeline->[4], - $to_station_beeline->[3] + $from_station_beeline->[4], $from_station_beeline->[3], + $to_station_beeline->[4], $to_station_beeline->[3] ); } @@ -1120,8 +1127,8 @@ sub get_stats { } my $uid = $opt{uid}; - my $db = $opt{db} // $self->{pg}->db; - my $year = $opt{year} // 0; + my $db = $opt{db} // $self->{pg}->db; + my $year = $opt{year} // 0; my $month = $opt{month} // 0; # Assumption: If the stats cache contains an entry it is up-to-date. diff --git a/templates/history_map.html.ep b/templates/history_map.html.ep index 06429f7..0976ab4 100644 --- a/templates/history_map.html.ep +++ b/templates/history_map.html.ep @@ -13,7 +13,7 @@ %= form_for '/history/map' => begin

- Detailgrad und Filter: + Detailgrad:

@@ -54,6 +54,28 @@
+

+ Weitere Filter: +

+
+
+ %= text_field 'filter_after', id => 'filter_after', class => 'validate', pattern => '[0-9][0-9]?[.][0-9][0-9]?[.][0-9][0-9][0-9][0-9]( +[0-9][0-9]:[0-9][0-9])?' + +
+
+
+
+ %= text_field 'filter_before', id => 'filter_before', class => 'validate', pattern => '[0-9][0-9]?[.][0-9][0-9]?[.][0-9][0-9][0-9][0-9]( +[0-9][0-9]:[0-9][0-9])?' + +
+
+
+
+ +
+
%= end