dav_registration: change filter button logic from select buttons to OR
All checks were successful
buildbot/django-dav-events--test Build done.

This commit is contained in:
2023-07-12 10:06:01 +02:00
parent 811983abfe
commit b86708598f
3 changed files with 59 additions and 49 deletions

View File

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

View File

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

View File

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