Merge pull request 'dav_registration: change filter button logic from select buttons to OR' (#72) from filter_buttons into master
All checks were successful
Run tests / Execute tox to run the test suite (push) Successful in 2m29s
Run tests every night at 05:05 / Execute tox to run the test suite (push) Successful in 2m19s

Reviewed-on: #72
This commit was merged in pull request #72.
This commit is contained in:
2024-08-02 15:41:35 +02:00
3 changed files with 59 additions and 49 deletions

View File

@@ -31,6 +31,10 @@ class ChoiceSet(object):
else: else:
return False return False
@property
def codes(self):
return self._codes
def get_label(self, code): def get_label(self, code):
return self._labels[code] return self._labels[code]

View File

@@ -18,16 +18,13 @@
<table id="objects_table" class="table table-bordered table-hover"> <table id="objects_table" class="table table-bordered table-hover">
<thead> <thead>
<tr> <tr>
<th class="hidden">Sport</th>
<th class="hidden">Level</th>
<th><input type="text" id="searchfield" placeholder="{% trans 'Volltextsuche' %}"></th> <th><input type="text" id="searchfield" placeholder="{% trans 'Volltextsuche' %}"></th>
<th class="hidden">Attributes</th>
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
{% for event in event_list %} {% for event in event_list %}
<tr> <tr>
<td class="hidden">{{ event.sport }}</td>
<td class="hidden">{{ event.level }}</td>
<td> <td>
<div class="pull-right" style="margin-left: 2em;"> <div class="pull-right" style="margin-left: 2em;">
<a role="button" id="controlChevronCollapseDetails{{ event.id }}" data-toggle="collapse" <a role="button" id="controlChevronCollapseDetails{{ event.id }}" data-toggle="collapse"
@@ -122,42 +119,55 @@
}); });
</script> </script>
</td> </td>
<td class="hidden">{{ event.sport }},{{ event.level }},</td>
</tr> </tr>
{% endfor %} {% endfor %}
</tbody> </tbody>
</table> </table>
<script type="text/javascript"> <script type="text/javascript">
function filter_table(table, sport, level) { function filter_table(table, filter) {
const sport_choices = ["B", "K", "M", "S", "W"]; const sport_choices = ["B", "K", "M", "S", "W"];
const level_choices = ["beginner", "advanced", "family"]; const level_choices = ["beginner", "advanced", "family"];
var choices = sport_choices.concat(level_choices);
var filter_cleaned = [];
var filter_expr;
if(sport != "*") if(filter.length > 0) {
$("#btn-filter-" + sport).removeClass("btn-white");
if(level != "*")
$("#btn-filter-" + level).removeClass("btn-white");
if(sport == "*" && level == "*")
$("#btn-filter-All").removeClass("btn-white");
else
$("#btn-filter-All").addClass("btn-white"); $("#btn-filter-All").addClass("btn-white");
} else {
for(let i in sport_choices) { $("#btn-filter-All").removeClass("btn-white");
if(sport != sport_choices[i])
$("#btn-filter-" + sport_choices[i]).addClass("btn-white");
}
for(let i in level_choices) {
if(level != level_choices[i])
$("#btn-filter-" + level_choices[i]).addClass("btn-white");
} }
if(sport == "*") for(let i in choices) {
sport = "" if(filter.indexOf(choices[i]) >= 0) {
table.column(0).search(sport).draw(); filter_cleaned.push(choices[i]);
$("#btn-filter-" + choices[i]).removeClass("btn-white");
} else {
$("#btn-filter-" + choices[i]).addClass("btn-white");
}
}
if(level == "*") if(filter_cleaned.length > 0) {
level = "" filter_expr = "(" + filter_cleaned.join("|") + "),";
table.column(1).search(level).draw(); } else {
}; filter_expr = "";
}
table.column(1).search(filter_expr, true, false);
table.draw();
}
function toggle_filter(table, filter, attribute) {
let i = filter.indexOf(attribute);
if(i >= 0)
filter.splice(i, 1);
else
filter.push(attribute);
filter_table(table, filter);
}
function reset_filter(table, filter) {
filter.splice(0, filter.length);
filter_table(table, filter);
}
$(document).ready( function () { $(document).ready( function () {
var table = $("#objects_table").DataTable( { var table = $("#objects_table").DataTable( {
ordering: false, ordering: false,
@@ -172,32 +182,33 @@
zeroRecords: "{% trans 'Keine passenden Einträge.' %}", zeroRecords: "{% trans 'Keine passenden Einträge.' %}",
} }
} ); } );
var filter = ['{{ init_filter|join:"','" }}'];
$("#btn-filter-All").on("click", function() { $("#btn-filter-All").on("click", function() {
filter_table(table, "*", "*"); reset_filter(table, filter);
} ); } );
$("#btn-filter-B").on("click", function() { $("#btn-filter-B").on("click", function() {
filter_table(table, "B", "*") toggle_filter(table, filter, "B");
} ); } );
$("#btn-filter-K").on("click", function() { $("#btn-filter-K").on("click", function() {
filter_table(table, "K", "*") toggle_filter(table, filter, "K");
} ); } );
$("#btn-filter-M").on("click", function() { $("#btn-filter-M").on("click", function() {
filter_table(table, "M", "*") toggle_filter(table, filter, "M");
} ); } );
$("#btn-filter-S").on("click", function() { $("#btn-filter-S").on("click", function() {
filter_table(table, "S", "*") toggle_filter(table, filter, "S");
} ); } );
$("#btn-filter-W").on("click", function() { $("#btn-filter-W").on("click", function() {
filter_table(table, "W", "*") toggle_filter(table, filter, "W");
} ); } );
$("#btn-filter-family").on("click", function() { $("#btn-filter-family").on("click", function() {
filter_table(table, "*", "family") toggle_filter(table, filter, "family");
} ); } );
$("#searchfield").on( "keyup change", function() { $("#searchfield").on( "keyup change", function() {
table.column(2).search( this.value ).draw(); table.column(0).search( this.value ).draw();
} ); } );
$("#objects_table_filter").hide(); $("#objects_table_filter").hide();
filter_table(table, "{{ init_sport_filter|default:'*' }}", "{{ init_level_filter|default:'*' }}"); filter_table(table, filter);
} ); } );
</script> </script>
</div> </div>

View File

@@ -51,21 +51,16 @@ class EventListView(generic.ListView):
def get_context_data(self, **kwargs): def get_context_data(self, **kwargs):
context = super().get_context_data(**kwargs) context = super().get_context_data(**kwargs)
if hasattr(self, 'init_sport_filter'): if hasattr(self, 'init_filter'):
context['init_sport_filter'] = self.init_sport_filter context['init_filter'] = self.init_filter
if hasattr(self, 'init_level_filter'):
context['init_level_filter'] = self.init_level_filter
return context return context
def get(self, request, *args, **kwargs): def get(self, request, *args, **kwargs):
if 'sport' in request.GET: if 'filter' in request.GET:
sport = request.GET['sport'] choices = SPORT_CHOICES.codes + LEVEL_CHOICES.codes
if (sport, 'Bogus') in SPORT_CHOICES: filter_input = request.GET['filter'].split(',')
self.init_sport_filter = sport filter_cleaned = list(set(filter_input) & set(choices))
if 'level' in request.GET: self.init_filter = filter_cleaned
level = request.GET['level']
if (level, 'Bogus') in LEVEL_CHOICES:
self.init_level_filter = level
return super().get(request, *args, **kwargs) return super().get(request, *args, **kwargs)