Unverified Commit e9373246 authored by Birte Kristina Friesel's avatar Birte Kristina Friesel
Browse files

landing page: show past stops if geolocation is unavailable

parent eb1ed1bb
Loading
Loading
Loading
Loading
+6 −0
Original line number Diff line number Diff line
@@ -376,6 +376,7 @@ sub homepage {
	my ($self) = @_;
	if ( $self->is_user_authenticated ) {
		my $status = $self->get_user_status;
		my @recent_targets;
		if ( $status->{checked_in} ) {
			if ( defined $status->{arrival_countdown}
				and $status->{arrival_countdown} < ( 40 * 60 ) )
@@ -414,10 +415,15 @@ sub homepage {
				return;
			}
		}
		else {
			@recent_targets = $self->journeys->get_latest_checkout_stations(
				uid => $self->current_user->{id} );
		}
		$self->render(
			'landingpage',
			version           => $self->app->config->{version} // 'UNKNOWN',
			user_status       => $status,
			recent_targets    => \@recent_targets,
			with_autocomplete => 1,
			with_geolocation  => 1
		);
+38 −0
Original line number Diff line number Diff line
@@ -739,6 +739,44 @@ sub get_latest_checkout_station_id {
	return $res_h->{checkout_station_id};
}

sub get_latest_checkout_stations {
	my ( $self, %opt ) = @_;
	my $uid   = $opt{uid};
	my $db    = $opt{db}    // $self->{pg}->db;
	my $limit = $opt{limit} // 5;

	my $res = $db->select(
		'journeys_str',
		[ 'arr_name', 'arr_eva' ],
		{
			user_id   => $uid,
			cancelled => 0
		},
		{
			limit    => $limit,
			order_by => { -desc => 'real_arr_ts' }
		}
	);

	if ( not $res ) {
		return;
	}

	my @ret;

	while ( my $row = $res->hash ) {
		push(
			@ret,
			{
				name => $row->{arr_name},
				eva  => $row->{arr_eva}
			}
		);
	}

	return @ret;
}

sub get_nav_years {
	my ( $self, %opt ) = @_;

+25 −11
Original line number Diff line number Diff line
@@ -4,23 +4,36 @@
 * SPDX-License-Identifier: AGPL-3.0-or-later
 */
$(document).ready(function() {
	function getPlaceholder() {
	const getPlaceholder = function() {
		return $('div.geolocation div.progress');
	}
	var showError = function(header, message, code) {
		getPlaceholder().remove();
		var errnode = $(document.createElement('div'));
	const showError = function(header, message, code) {
		const errnode = $(document.createElement('div'));
		errnode.attr('class', 'error');
		errnode.text(message);

		var headnode = $(document.createElement('strong'));
		headnode.text(header);
		const headnode = $(document.createElement('strong'));
		headnode.text(header + ' ');
		errnode.prepend(headnode);

		$('div.geolocation').append(errnode);

		const recent = $('div.geolocation').data('recent');
		if (recent) {
			const stops = recent.split('|');
			const res = $(document.createElement('p'));
			$.each(stops, function(i, stop) {
				const parts = stop.split(';');
				res.append($('<a class="tablerow" href="/s/' + parts[0] + '"><span>' + parts[1] + '</span></a>'));
			});
			$('p.geolocationhint').text('Letzte Ziele:');
			getPlaceholder().replaceWith(res);
		} else {
			getPlaceholder().remove();
		}
	};

	var processResult = function(data) {
	const processResult = function(data) {
		if (data.error) {
			showError('Backend-Fehler:', data.error, null);
		} else if (data.candidates.length == 0) {
@@ -39,11 +52,11 @@ $(document).ready(function() {
		}
	};

	var processLocation = function(loc) {
	const processLocation = function(loc) {
		$.post('/geolocation', {lon: loc.coords.longitude, lat: loc.coords.latitude}, processResult);
	};

	var processError = function(error) {
	const processError = function(error) {
		if (error.code == error.PERMISSION_DENIED) {
			showError('Standortanfrage nicht möglich.', 'Vermutlich fehlen die Rechte im Browser oder der Android Location Service ist deaktiviert.', 'geolocation.error.PERMISSION_DENIED');
		} else if (error.code == error.POSITION_UNAVAILABLE) {
@@ -55,8 +68,9 @@ $(document).ready(function() {
		}
	};

	var geoLocationButton = $('div.geolocation > button');
	var getGeoLocation = function() {
	const geoLocationButton = $('div.geolocation > button');
	const recentStops = geoLocationButton.data('recent');
	const getGeoLocation = function() {
		geoLocationButton.replaceWith($('<p class="geolocationhint">Stationen in der Umgebung:</p><div class="progress"><div class="indeterminate"></div></div>'));
		navigator.geolocation.getCurrentPosition(processLocation, processError);
	}
+1 −1
Original line number Diff line number Diff line
@@ -49,7 +49,7 @@
					<div class="card-content">
						<span class="card-title">Hallo, <%= current_user->{name} %>!</span>
						<p>Du bist gerade nicht eingecheckt.</p>
						<div class="geolocation">
						<div class="geolocation" data-recent="<%= join('|', map { $_->{eva} . ';' . $_->{name} } @{stash('recent_targets') // []} ) %>">
							<button class="btn waves-effect waves-light btn-flat">Stationen in der Umgebung abfragen</button>
						</div>
						%= form_for 'list_departures' => begin