diff --git a/wagtail/admin/filters.py b/wagtail/admin/filters.py index c706f0d33d..7df37d06ce 100644 --- a/wagtail/admin/filters.py +++ b/wagtail/admin/filters.py @@ -3,7 +3,8 @@ from django import forms from django.utils.translation import gettext_lazy as _ from django_filters.widgets import SuffixedMultiWidget -from wagtail.core.models import Page, TaskState, Workflow, WorkflowState +from wagtail.admin.staticfiles import versioned_static +from wagtail.core.models import Page, Task, TaskState, Workflow, WorkflowState from .widgets import AdminDateInput @@ -67,6 +68,128 @@ class DateRangePickerWidget(SuffixedMultiWidget): return [None, None] +class FilteredSelect(forms.Select): + """ + A select box variant that adds 'data-' attributes to the + + + + + + +
+ + +
+*/ + +$(function() { + $('[data-widget="filtered-select"]').each(function() { + var sourceSelect = $('#' + this.dataset.filterField); + var self = $(this); + + var optionData = []; + $('option', this).each(function() { + var filterValue; + if ('filterValue' in this.dataset) { + filterValue = this.dataset.filterValue.split(',') + } else { + filterValue = []; + } + + optionData.push({ + value: this.value, + label: this.label, + filterValue: filterValue + }) + }); + + function updateFromSource() { + var currentValue = self.val(); + self.empty(); + var chosenFilter = sourceSelect.val(); + var filteredValues; + + if (chosenFilter == '') { + /* no filter selected - show all options */ + filteredValues = optionData; + } else { + filteredValues = []; + for (var i = 0; i < optionData.length; i++) { + if (optionData[i].value == '' || optionData[i].filterValue.indexOf(chosenFilter) != -1) { + filteredValues.push(optionData[i]); + } + } + } + + var foundValue = false; + for (var i = 0; i < filteredValues.length; i++) { + var option = $('