Skip to content

Commit 7387784

Browse files
authored
assets/js: Map Split Mode for Budgeting (#1139)
1 parent 86154c4 commit 7387784

File tree

5 files changed

+136
-111
lines changed

5 files changed

+136
-111
lines changed
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
{% extends "a4_candy_contrib/includes/map_list_view_base.html" %}
2+
{% load i18n discovery_tags static maps_tags module_tags contrib_tags %}
3+
4+
{% block map_content %}
5+
{% if object_list %}
6+
{% if object_list.0|has_feature:"rate" %}
7+
{% map_display_points object_list module.settings_instance.polygon %}
8+
{% else %}
9+
{% map_display_points object_list module.settings_instance.polygon 'true' %}
10+
{% endif %}
11+
{% else %}
12+
{% map_display_points object_list module.settings_instance.polygon %}
13+
{% endif %}
14+
{% endblock map_content %}
15+
16+
{% block list_content %}
17+
<ul class="u-list-reset">
18+
{% for object in paginated_list %}
19+
{% include "a4_candy_budgeting/includes/proposal_list_item.html" with object=object %}
20+
{% empty %}
21+
{% translate "Nothing to show" %}
22+
{% endfor %}
23+
</ul>
24+
{% endblock list_content %}

apps/budgeting/templates/a4_candy_budgeting/proposal_list.html

Lines changed: 6 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,11 @@
44
{% block extra_js %}
55
<script type="text/javascript" src="{% static 'a4maps_display_points.js' %}"></script>
66
{{ block.super }}
7-
{% endblock %}
7+
{% endblock extra_js %}
88

99
{% block extra_css %}
10-
<link type="text/css" href="{% static 'a4maps_display_points.css'%}" rel="stylesheet" />
11-
{% endblock %}
10+
<link type="text/css" href="{% static 'a4maps_display_points.css' %}" rel="stylesheet" />
11+
{% endblock extra_css %}
1212

1313
{% block project_action %}
1414
{% has_or_would_have_perm 'a4_candy_budgeting.add_proposal' request.user module as propose_allowed %}
@@ -17,51 +17,8 @@
1717
{% translate 'Submit proposal' %}
1818
</a>
1919
{% endif %}
20-
{% endblock %}
20+
{% endblock project_action %}
2121

2222
{% block phase_content %}
23-
<div class="l-top-overlap" id="index">
24-
<div class="row">
25-
<div class="col-md-10 col-lg-8 offset-md-1 offset-lg-2">
26-
{% include "a4_candy_contrib/includes/map_filter_and_sort.html" with filter=view.filter mode=view.mode %}
27-
</div>
28-
</div>
29-
</div>
30-
{% if view.mode == 'map' %}
31-
<div class="map-list">
32-
<div class="map-list__controls">
33-
<div class="container">
34-
<div class="leaflet-control-zoom leaflet-bar leaflet-control mt-4 mt-md-0">
35-
<a class="leaflet-control-zoom-in" id="zoom-in" href="#" title="{% translate 'Zoom in' %}">+</a>
36-
<a class="leaflet-control-zoom-out leaflet-disabled" id="zoom-out" href="#" title="{% translate 'Zoom out' %}">-</a>
37-
</div>
38-
</div>
39-
</div>
40-
{% if object_list %}
41-
{% if object_list.0|has_feature:"rate" %}
42-
{% map_display_points object_list module.settings_instance.polygon %}
43-
{% else %}
44-
{% map_display_points object_list module.settings_instance.polygon 'true' %}
45-
{% endif %}
46-
{% else %}
47-
{% map_display_points object_list module.settings_instance.polygon %}
48-
{% endif %}
49-
</div>
50-
{% else %}
51-
<div class="bg--light">
52-
<div class="row">
53-
<div class="col-md-10 col-lg-8 offset-md-1 offset-lg-2">
54-
<ul class="u-list-reset">
55-
{% for object in object_list %}
56-
{% include "a4_candy_budgeting/includes/proposal_list_item.html" with object=object %}
57-
{% empty %}
58-
{% translate "Nothing to show" %}
59-
{% endfor %}
60-
</ul>
61-
62-
{% include "a4_candy_contrib/includes/pagination.html" %}
63-
</div>
64-
</div>
65-
</div>
66-
{% endif %}
67-
{% endblock %}
23+
{% include "a4_candy_budgeting/includes/proposal_map_list_view.html" with view=view filter=view.filter %}
24+
{% endblock phase_content %}

apps/budgeting/views.py

Lines changed: 26 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,8 @@
1+
import re
2+
13
import django_filters
4+
from django.core.paginator import EmptyPage
5+
from django.core.paginator import Paginator
26
from django.urls import reverse
37
from django.utils.translation import gettext_lazy as _
48

@@ -51,12 +55,29 @@ class Meta:
5155
class ProposalListView(idea_views.AbstractIdeaListView, DisplayProjectOrModuleMixin):
5256
model = models.Proposal
5357
filter_set = ProposalFilterSet
58+
paginate_by = 0 # Maps need all ideas, pagination is handled in get_context_data
5459

55-
def dispatch(self, request, **kwargs):
56-
self.mode = request.GET.get("mode", "map")
57-
if self.mode == "map":
58-
self.paginate_by = 0
59-
return super().dispatch(request, **kwargs)
60+
def get_context_data(self, **kwargs):
61+
context = super().get_context_data(**kwargs)
62+
ua = self.request.headers.get("User-Agent", "")
63+
is_mobile = bool(re.search(r"Mobi|Android|iPhone|iPod|Windows Phone", ua, re.I))
64+
page_size = int(self.request.GET.get("page_size", 15 if is_mobile else 8))
65+
self.mode = self.request.GET.get("mode", "map")
66+
object_list = context.get("object_list", [])
67+
68+
if page_size > 0:
69+
paginator = Paginator(object_list, page_size)
70+
page = int(self.request.GET.get("page", 1))
71+
try:
72+
paginated_list = paginator.page(page)
73+
except EmptyPage:
74+
paginated_list = paginator.page(paginator.num_pages)
75+
else:
76+
paginated_list = object_list
77+
context["paginated_list"] = paginated_list
78+
context["page_obj"] = paginated_list # page_obj ist die paginierte Liste selbst
79+
context["is_paginated"] = paginator.num_pages > 1 if page_size > 0 else False
80+
return context
6081

6182

6283
class ProposalDetailView(idea_views.AbstractIdeaDetailView):
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
{% load i18n discovery_tags static maps_tags module_tags contrib_tags %}
2+
<span class="map-list-view">
3+
<div class="view-toggle l-top-overlap" id="index">
4+
<div class="row">
5+
<div class="col-md-10 col-lg-8 offset-md-1 offset-lg-2">
6+
{% include "a4_candy_contrib/includes/map_filter_and_sort.html" with filter=filter mode=view.mode %}
7+
</div>
8+
</div>
9+
</div>
10+
11+
<div class="map-list list-view {% if view.mode == 'list' %}mobile-hide{% endif %}" id="map-view">
12+
<div class="map-list__controls">
13+
<div class="container">
14+
<div class="leaflet-control-zoom leaflet-bar leaflet-control mt-4 mt-md-0">
15+
<a class="leaflet-control-zoom-in" id="zoom-in" href="#" title="{% translate 'Zoom in' %}">+</a>
16+
<a class="leaflet-control-zoom-out leaflet-disabled" id="zoom-out" href="#" title="{% translate 'Zoom out' %}">-</a>
17+
</div>
18+
</div>
19+
</div>
20+
{% block map_content %}
21+
{% if object_list %}
22+
{% if object_list.0|has_feature:"rate" %}
23+
{% map_display_points object_list module.settings_instance.polygon %}
24+
{% else %}
25+
{% map_display_points object_list module.settings_instance.polygon 'true' %}
26+
{% endif %}
27+
{% else %}
28+
{% map_display_points object_list module.settings_instance.polygon %}
29+
{% endif %}
30+
{% endblock map_content %}
31+
</div>
32+
33+
<div class="list-view {% if view.mode != 'list' %}mobile-hide{% endif %}" id="list-view">
34+
<div class="row">
35+
<div class="col-md-10 col-lg-8 offset-md-1 offset-lg-2">
36+
<div class="filter-bar__spaced">
37+
{% for field in filter.form %}
38+
{% if field.name != 'ordering' %}
39+
<div class="me-1 mt-2">
40+
{{ field }}
41+
</div>
42+
{% endif %}
43+
{% endfor %}
44+
45+
<div class="ms-sm-auto mt-2">
46+
{{ filter.form.ordering }}
47+
</div>
48+
</div>
49+
50+
{% block list_content %}
51+
{# Überschreiben in konkreten Templates #}
52+
{% endblock list_content %}
53+
54+
{% include "a4_candy_contrib/includes/pagination.html" %}
55+
</div>
56+
</div>
57+
</div>
58+
</span>
59+
Lines changed: 21 additions & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -1,61 +1,25 @@
1+
{% extends "a4_candy_contrib/includes/map_list_view_base.html" %}
12
{% load i18n discovery_tags static maps_tags module_tags contrib_tags %}
2-
<span class="map-list-view">
3-
<div class="view-toggle l-top-overlap" id="index">
4-
<div class="row">
5-
<div class="col-md-10 col-lg-8 offset-md-1 offset-lg-2">
6-
{% include "a4_candy_contrib/includes/map_filter_and_sort.html" with filter=view.filter mode=view.mode %}
7-
</div>
8-
</div>
9-
</div>
103

11-
<div class="map-list list-view {% if view.mode == 'list' %}mobile-hide{% endif %}" id="map-view">
12-
<div class="map-list__controls">
13-
<div class="container">
14-
<div class="leaflet-control-zoom leaflet-bar leaflet-control mt-4 mt-md-0">
15-
<a class="leaflet-control-zoom-in" id="zoom-in" href="#" title="{% translate 'Zoom in' %}">+</a>
16-
<a class="leaflet-control-zoom-out leaflet-disabled" id="zoom-out" href="#" title="{% translate 'Zoom out' %}">-</a>
17-
</div>
18-
</div>
19-
</div>
20-
{% if object_list %}
21-
{% if object_list.0|has_feature:"rate" %}
22-
{% map_display_points object_list module.settings_instance.polygon %}
23-
{% else %}
24-
{% map_display_points object_list module.settings_instance.polygon 'true' %}
25-
{% endif %}
26-
{% else %}
27-
{% map_display_points object_list module.settings_instance.polygon %}
28-
{% endif %}
29-
</div>
4+
{% block map_content %}
5+
{% if object_list %}
6+
{% if object_list.0|has_feature:"rate" %}
7+
{% map_display_points object_list module.settings_instance.polygon %}
8+
{% else %}
9+
{% map_display_points object_list module.settings_instance.polygon 'true' %}
10+
{% endif %}
11+
{% else %}
12+
{% map_display_points object_list module.settings_instance.polygon %}
13+
{% endif %}
14+
{% endblock map_content %}
3015

31-
<div class="list-view {% if view.mode != 'list' %}mobile-hide{% endif %}" id="list-view">
32-
<div class="row">
33-
<div class="col-md-10 col-lg-8 offset-md-1 offset-lg-2">
34-
<div class="filter-bar__spaced">
35-
{% for field in filter.form %}
36-
{% if field.name != 'ordering' %}
37-
<div class="me-1 mt-2">
38-
{{ field }}
39-
</div>
40-
{% endif %}
41-
{% endfor %}
42-
43-
<div class="ms-sm-auto mt-2">
44-
{{ filter.form.ordering }}
45-
</div>
46-
</div>
47-
48-
<ul class="u-list-reset">
49-
{% for object in paginated_list %}
50-
{% include "a4_candy_mapideas/includes/mapidea_list_item.html" with object=object %}
51-
{% empty %}
52-
{% translate "Nothing to show" %}
53-
{% endfor %}
54-
</ul>
55-
56-
{% include "a4_candy_contrib/includes/pagination.html" %}
57-
</div>
58-
</div>
59-
</div>
60-
</span>
16+
{% block list_content %}
17+
<ul class="u-list-reset">
18+
{% for object in paginated_list %}
19+
{% include "a4_candy_mapideas/includes/mapidea_list_item.html" with object=object %}
20+
{% empty %}
21+
{% translate "Nothing to show" %}
22+
{% endfor %}
23+
</ul>
24+
{% endblock list_content %}
6125

0 commit comments

Comments
 (0)