Use select2 input for category fields

This commit is contained in:
Raphael Michel
2020-02-04 18:22:03 +01:00
parent 833cd32578
commit 22dfa0e61d
3 changed files with 67 additions and 2 deletions

View File

@@ -227,6 +227,18 @@ class ItemCreateForm(I18nModelForm):
super().__init__(*args, **kwargs)
self.fields['category'].queryset = self.instance.event.categories.all()
self.fields['category'].widget = Select2(
attrs={
'data-model-select2': 'generic',
'data-select2-url': reverse('control:event.items.categories.select2', kwargs={
'event': self.instance.event.slug,
'organizer': self.instance.event.organizer.slug,
}),
'data-placeholder': _('No category'),
}
)
self.fields['category'].widget.choices = self.fields['category'].choices
self.fields['tax_rule'].queryset = self.instance.event.tax_rules.all()
change_decimal_field(self.fields['default_price'], self.instance.event.currency)
self.fields['tax_rule'].empty_label = _('No taxation')
@@ -399,7 +411,6 @@ class TicketNullBooleanSelect(forms.NullBooleanSelect):
class ItemUpdateForm(I18nModelForm):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['category'].queryset = self.instance.event.categories.all()
self.fields['tax_rule'].queryset = self.instance.event.tax_rules.all()
self.fields['description'].widget.attrs['placeholder'] = _(
'e.g. This reduced price is available for full-time students, jobless and people '
@@ -431,6 +442,19 @@ class ItemUpdateForm(I18nModelForm):
self.fields['hidden_if_available'].widget.choices = self.fields['hidden_if_available'].choices
self.fields['hidden_if_available'].required = False
self.fields['category'].queryset = self.instance.event.categories.all()
self.fields['category'].widget = Select2(
attrs={
'data-model-select2': 'generic',
'data-select2-url': reverse('control:event.items.categories.select2', kwargs={
'event': self.instance.event.slug,
'organizer': self.instance.event.organizer.slug,
}),
'data-placeholder': _('No category'),
}
)
self.fields['category'].widget.choices = self.fields['category'].choices
def clean(self):
d = super().clean()
if d['issue_giftcard']:
@@ -604,6 +628,16 @@ class ItemAddOnForm(I18nModelForm):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.fields['addon_category'].queryset = self.event.categories.all()
self.fields['addon_category'].widget = Select2(
attrs={
'data-model-select2': 'generic',
'data-select2-url': reverse('control:event.items.categories.select2', kwargs={
'event': self.event.slug,
'organizer': self.event.organizer.slug,
}),
}
)
self.fields['addon_category'].widget.choices = self.fields['addon_category'].choices
class Meta:
model = ItemAddOn

View File

@@ -160,6 +160,7 @@ urlpatterns = [
url(r'^items/(?P<item>\d+)/down$', item.item_move_down, name='event.items.down'),
url(r'^items/(?P<item>\d+)/delete$', item.ItemDelete.as_view(), name='event.items.delete'),
url(r'^categories/$', item.CategoryList.as_view(), name='event.items.categories'),
url(r'^categories/select2$', typeahead.category_select2, name='event.items.categories.select2'),
url(r'^categories/(?P<category>\d+)/delete$', item.CategoryDelete.as_view(),
name='event.items.categories.delete'),
url(r'^categories/(?P<category>\d+)/up$', item.category_move_up, name='event.items.categories.up'),

View File

@@ -319,6 +319,36 @@ def quotas_select2(request, **kwargs):
return JsonResponse(doc)
@event_permission_required(None)
def category_select2(request, **kwargs):
query = request.GET.get('query', '')
try:
page = int(request.GET.get('page', '1'))
except ValueError:
page = 1
qs = request.event.categories.filter(
name__icontains=i18ncomp(query)
).order_by('name')
total = qs.count()
pagesize = 20
offset = (page - 1) * pagesize
doc = {
'results': [
{
'id': e.pk,
'text': str(e),
}
for e in qs[offset:offset + pagesize]
],
'pagination': {
"more": total >= (offset + pagesize)
}
}
return JsonResponse(doc)
@event_permission_required(None)
def checkinlist_select2(request, **kwargs):
query = request.GET.get('query', '')
@@ -327,7 +357,7 @@ def checkinlist_select2(request, **kwargs):
except ValueError:
page = 1
qf = Q(name__icontains=i18ncomp(query))
qf = Q(name__icontains=query)
try:
dt = parse(query)