Umkreissuche (nur akt. Pos.)

This commit is contained in:
Daniel Grams 2020-10-05 16:23:17 +02:00
parent 905d849490
commit 9ec9dc9068
8 changed files with 164 additions and 51 deletions

View File

@ -1,3 +1,4 @@
from flask import request
from flask_babelex import lazy_gettext, gettext
from flask_wtf import FlaskForm
from flask_wtf.file import FileField, FileAllowed
@ -150,4 +151,7 @@ class FindEventForm(FlaskForm):
organizer_id = SelectField(lazy_gettext('Organizer'), validators=[Optional()], coerce=int)
submit = SubmitField(lazy_gettext("Find events"))
submit = SubmitField(lazy_gettext("Find events"))
def is_submitted(self):
return 'submit' in request.args

View File

@ -1,7 +1,8 @@
from flask import request
from flask_babelex import lazy_gettext, gettext
from flask_wtf import FlaskForm
from flask_wtf.file import FileField, FileAllowed
from wtforms import SelectMultipleField, FieldList, RadioField, DateTimeField, StringField, SubmitField, TextAreaField, SelectField, BooleanField, IntegerField, FormField
from wtforms import HiddenField, SelectMultipleField, FieldList, RadioField, DateTimeField, StringField, SubmitField, TextAreaField, SelectField, BooleanField, IntegerField, FormField
from wtforms.fields.html5 import DateTimeLocalField, EmailField
from wtforms.validators import DataRequired, Optional
from wtforms.widgets import html_params, HTMLString
@ -16,7 +17,12 @@ class FindEventDateForm(FlaskForm):
date_from = CustomDateField(lazy_gettext('From'), validators=[Optional()])
date_to = CustomDateField(lazy_gettext('to'), validators=[Optional()])
keyword = StringField(lazy_gettext('Keyword'), validators=[Optional()])
category_id = SelectField(lazy_gettext('Category'), validators=[Optional()], coerce=int)
coordinate = HiddenField(validators=[Optional()])
location = StringField(lazy_gettext('Location'), validators=[Optional()])
distance = IntegerField(lazy_gettext('Distance'), validators=[Optional()])
submit = SubmitField(lazy_gettext("Find"))
submit = SubmitField(lazy_gettext("Find"))
def is_submitted(self):
return 'submit' in request.args

View File

@ -9,6 +9,7 @@ class EventSearchParams(object):
self._date_to = None
self._date_from_str = None
self._date_to_str = None
self._coordinate = None
self.admin_unit_id = None
self.keyword = None
self.latitude = None
@ -53,6 +54,19 @@ class EventSearchParams(object):
self._date_to_str = value
self._date_to = form_input_to_date(value)
@property
def coordinate(self):
return self._coordinate
@coordinate.setter
def coordinate(self, value):
self._coordinate = value
if value is not None and len(value) > 0:
(self.latitude, self.longitude) = value.split(",")
else:
self.latitude = None
self.longitude = None
def set_default_date_range(self):
self.date_from = today
self.date_to = date_set_end_of_day(today + relativedelta(months=12))
@ -68,9 +82,7 @@ class EventSearchParams(object):
self.keyword = request.args['keyword']
if "coordinate" in request.args:
coordinate = request.args['coordinate']
if coordinate is not None and len(coordinate) > 0:
(self.latitude, self.longitude) = coordinate.split(",")
self.coordinate = request.args['coordinate']
if "distance" in request.args:
self.distance = request.args['distance']

View File

@ -166,4 +166,45 @@ $( function() {
$('.datepicker').each(function (index, element){
start_datepicker($(element));
});
$("#clear_location_btn").click(function () {
$("#coordinate").val("");
$("#location").val("");
$("#distance").val("");
});
$("#geolocation_btn").click(function () {
if ("geolocation" in navigator){
navigator.geolocation.getCurrentPosition(function(position){
$("#coordinate").val(position.coords.latitude+","+position.coords.longitude);
$("#location").val("Aktuelle Position");
$("#postcode").val("");
$("#location").removeClass("is-invalid");
if ($("#distance").val() == "") {
$("#distance").val("500");
}
}, handleError);
function handleError(error){
//Handle Errors
switch(error.code) {
case error.PERMISSION_DENIED:
alert("User denied the request for Geolocation.");
break;
case error.POSITION_UNAVAILABLE:
alert("Location information is unavailable.");
break;
case error.TIMEOUT:
alert("The request to get user location timed out.");
break;
case error.UNKNOWN_ERROR:
alert("An unknown error occurred.");
break;
}
}
}else{
alert("Browser doesn't support geolocation!");
}
});
});

View File

@ -567,49 +567,63 @@ $( function() {
{% endmacro %}
{% macro render_event_dates_filter_form(form) %}
<form action="" class="form-inline mb-4" method="GET" autocomplete="off">
<form action="" class="form" method="GET" autocomplete="off">
{{ form.hidden_tag() }}
<div class="input-group mb-2 mr-sm-2">
<div class="input-group-prepend">
<span class="input-group-text">{{ form.date_from.label.text }}</span>
</div>
{{ form.date_from(class="form-control datepicker")|safe }}
</div>
<div class="input-group mb-2 mr-sm-2">
<div class="input-group-prepend">
<span class="input-group-text">{{ form.date_to.label.text }}</span>
</div>
{{ form.date_to(class="form-control datepicker")|safe }}
</div>
{% if form.category_id %}
<div class="input-group mb-2 mr-sm-2">
<div class="input-group-prepend">
<span class="input-group-text">{{ form.category_id.label.text }}</span>
</div>
{{ form.category_id(class="form-control")|safe }}
</div>
{% endif %}
{{ render_field_with_errors(form.keyword) }}
{% if form.organizer_id %}
<div class="input-group mb-2 mr-sm-2">
<div class="input-group-prepend">
<span class="input-group-text">{{ form.organizer_id.label.text }}</span>
{{ render_field_with_errors(form.organizer_id) }}
{% endif %}
<div class="form-group row">
<label class="col-sm-2 col-form-label">{{ _('Date') }}</label>
<div class="col-sm-5 mb-1">
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text">{{ form.date_from.label.text }}</span>
</div>
{{ form.date_from(class="form-control datepicker")|safe }}
</div>
{{ form.organizer_id(class="form-control")|safe }}
</div>
<div class="col-sm-5">
<div class="input-group">
<div class="input-group-prepend">
<span class="input-group-text">{{ form.date_to.label.text }}</span>
</div>
{{ form.date_to(class="form-control datepicker")|safe }}
</div>
</div>
</div>
{% if form.location %}
<div class="form-group row">
<label for="location" class="col-sm-2 col-form-label">{{ _('Radius') }}</label>
<div class="col-sm-7 mb-1">
<div class="input-group">
{{ form.location(class="form-control", disabled="disabled", placeholder=form.location.label.text, autocomplete="off")|safe }}
<div class="input-group-append">
<button class="btn btn-outline-secondary" type="button" id="clear_location_btn">
<i class="fa fa-times"></i>
</button>
<button class="btn btn-outline-primary" type="button" id="geolocation_btn">
<i class="fa fa-location-arrow"></i>
</button>
</div>
</div>
</div>
<div class="col-sm-3">
<div class="input-group">
{{ form.distance(class="form-control")|safe }}
<div class="input-group-append">
<span class="input-group-text">m</span>
</div>
</div>
</div>
</div>
{% endif %}
<div class="input-group mb-2 mr-sm-2">
<div class="input-group-prepend">
<span class="input-group-text">{{ form.keyword.label.text }}</span>
</div>
{{ form.keyword(class="form-control")|safe }}
</div>
<button type="submit" class="btn btn-primary mb-2">{{ _('Find') }}</button>
{{ render_field(form.submit) }}
</form>
{% endmacro %}

View File

@ -5,9 +5,11 @@
{% endblock %}
{% block content %}
<h1>{{ _('Event Dates') }}</h1>
<h1>{{ _('Event Dates') }} <button type="button" class="btn btn-outline-secondary mx-2" data-toggle="collapse" data-target="#search_form" aria-expanded="{% if form.is_submitted() %}true{% else %}false{% endif %}"><i class="fa fa-filter"></i></button></h1>
{{ render_event_dates_filter_form(form) }}
<div class="{% if form.is_submitted() %}{% else %}collapse{% endif %}" id="search_form">
{{ render_event_dates_filter_form(form) }}
</div>
{% for date in dates %}
<div class="card mb-3" style="max-width: 768px;">

View File

@ -6,16 +6,16 @@
{% endblock %}
{% block content %}
<h1>{{ _('Events') }}</h1>
<div class="my-4">
{{ render_event_dates_filter_form(form) }}
</div>
<h1>{{ _('Events') }} <button type="button" class="btn btn-outline-secondary mx-2" data-toggle="collapse" data-target="#search_form" aria-expanded="{% if form.is_submitted() %}true{% else %}false{% endif %}"><i class="fa fa-filter"></i></button></h1>
<div class="my-4">
<a class="btn btn-outline-secondary my-1" href="{{ url_for('event_create_for_admin_unit_id', id=admin_unit.id) }}" role="button"><i class="fa fa-plus"></i> {{ _('Create event') }}</a>
</div>
<div class="my-4 {% if form.is_submitted() %}{% else %}collapse{% endif %}" id="search_form">
{{ render_event_dates_filter_form(form) }}
</div>
<ul class="list-group">
{% for event in events %}
<li class="list-group-item">

View File

@ -1,5 +1,5 @@
{% extends "layout.html" %}
{% from "_macros.html" import render_event_dates_filter_form, render_pagination, render_event_status_pill, render_event_status_pill, render_place, render_events_sub_menu %}
{% from "_macros.html" import render_pagination, render_event_status_pill, render_event_status_pill, render_place, render_events_sub_menu %}
{% block title %}
{{ _('Widget') }}
{% endblock %}
@ -10,7 +10,41 @@
{% endblock %}
{% block content %}
{{ render_event_dates_filter_form(form) }}
<form action="" class="form-inline mb-4" method="GET" autocomplete="off">
{{ form.hidden_tag() }}
<div class="input-group mb-2 mr-sm-2">
<div class="input-group-prepend">
<span class="input-group-text">{{ form.date_from.label.text }}</span>
</div>
{{ form.date_from(class="form-control datepicker")|safe }}
</div>
<div class="input-group mb-2 mr-sm-2">
<div class="input-group-prepend">
<span class="input-group-text">{{ form.date_to.label.text }}</span>
</div>
{{ form.date_to(class="form-control datepicker")|safe }}
</div>
{% if form.category_id %}
<div class="input-group mb-2 mr-sm-2">
<div class="input-group-prepend">
<span class="input-group-text">{{ form.category_id.label.text }}</span>
</div>
{{ form.category_id(class="form-control")|safe }}
</div>
{% endif %}
<div class="input-group mb-2 mr-sm-2">
<div class="input-group-prepend">
<span class="input-group-text">{{ form.keyword.label.text }}</span>
</div>
{{ form.keyword(class="form-control")|safe }}
</div>
<button type="submit" class="btn btn-primary mb-2">{{ _('Find') }}</button>
</form>
{% for date in dates %}