Skip to content
Snippets Groups Projects
Commit e5e1060a authored by Hangzhi Yu's avatar Hangzhi Yu
Browse files

- Models: remove toplevel field and replace it with placeholder field for...

- Models: remove toplevel field and replace it with placeholder field for children, adding tagging option for children
- Migrations: change 0002_add_bug_report.py according to models.py
- Forms: add default placeholder for first field, remove queryset filtering according to toplevel attribute
- Admin: remove displaying of toplevel and replacing it by placeholder, add tagging
- Views/URLs: replace rebus_get_icon AJAX request with a new rebus_get_next_properties which also includes the children's placeholder and tagging possibility
- rebus.html template: remove default bug category labels, change javascript updating of next field according to new AJAX request, add functionality to toggle the ability to use tagging input and to change placeholder dynamically
parent 0625a943
No related branches found
No related tags found
1 merge request!8Resolve "Rewrite REBUS with django-select2"
......@@ -44,7 +44,7 @@ class FAQQuestionAdmin(admin.ModelAdmin):
class REBUSCategoryAdmin(admin.ModelAdmin):
list_display = ("name", "_icon", "_parent", "_toplevel")
list_display = ("name", "_icon", "_parent", "_placeholder", "_tagging")
class Media:
css = {
......@@ -57,8 +57,11 @@ class REBUSCategoryAdmin(admin.ModelAdmin):
def _parent(self, obj):
return obj.parent
def _toplevel(self, obj):
return obj.toplevel
def _placeholder(self, obj):
return obj.placeholder
def _tagging(self, obj):
return obj.tagging
admin.site.register(FAQQuestion, FAQQuestionAdmin)
......
......@@ -16,17 +16,17 @@ class REBUSForm(forms.Form):
bug_category_1 = forms.ModelChoiceField(
label=_("Category A"),
required=True,
queryset=REBUSCategory.objects.filter(parent=None).filter(toplevel=False),
queryset=REBUSCategory.objects.filter(parent=None),
widget=ModelSelect2Widget(
model=REBUSCategory,
search_fields=["name__icontains"],
attrs={"data-minimum-input-length": 0, "class": "browser-default"},
attrs={"data-minimum-input-length": 0, "class": "browser-default", "data-placeholder": _("Select a category")},
),
)
bug_category_2 = forms.ModelChoiceField(
label=_("Category B"),
required=False,
queryset=REBUSCategory.objects.exclude(parent=None).filter(toplevel=False),
queryset=REBUSCategory.objects.exclude(parent=None),
widget=ModelSelect2Widget(
dependent_fields={"bug_category_1": "parent"},
search_fields=["name__icontains"],
......@@ -36,7 +36,7 @@ class REBUSForm(forms.Form):
bug_category_3 = forms.ModelChoiceField(
label=_("Category C"),
required=False,
queryset=REBUSCategory.objects.exclude(parent=None).filter(toplevel=False),
queryset=REBUSCategory.objects.exclude(parent=None),
widget=ModelSelect2Widget(
dependent_fields={"bug_category_2": "parent"},
search_fields=["name__icontains"],
......
This diff is collapsed.
......@@ -58,7 +58,8 @@ class REBUSCategory(models.Model):
verbose_name=_("Symbol"))
parent = models.ForeignKey("self", related_name="children", on_delete=models.CASCADE, blank=True,
null=True, verbose_name=_("Parent"))
toplevel = models.BooleanField(verbose_name=_("Top-level select"), default=False)
tagging = models.BooleanField(verbose_name=_("Tagging allowed"), default=False)
placeholder = models.CharField(max_length=100, verbose_name=_("Placeholder"), blank=True, null=True)
def __str__(self):
return self.name
......
......@@ -22,7 +22,6 @@
<i class="material-icons prefix small">bug_report</i>
</div>
<div class="bug-category-field">
{{ form.bug_category_1.label_tag }}
{{ form.bug_category_1 }}
</div>
</div>
......@@ -32,7 +31,6 @@
<div id="bug_category_2_icon" class="bug-category-icon">
</div>
<div class="bug-category-field">
{{ form.bug_category_2.label_tag }}
{{ form.bug_category_2 }}
</div>
</div>
......@@ -42,7 +40,6 @@
<div id="bug_category_3_icon" class="bug-category-icon">
</div>
<div class="bug-category-field">
{{ form.bug_category_3.label_tag }}
{{ form.bug_category_3 }}
</div>
</div>
......@@ -84,22 +81,25 @@
M.toast({html: "<i class='material-icons left'>error</i>Bitte fülle alle benötigten Felder aus!"})
}
});
$.fn.setIcons = function (field_id, icon_id) {
$.fn.setNextProperties = function (field_id, icon_id, next_field_name) {
var category = $('#' + field_id).find(':selected').text();
console.log(category);
$.ajax({
url: '{% url "rebus-get-icon" %}',
url: '{% url "rebus-get-next-properties" %}',
data: {
'category': category
},
dataType: 'json',
success: function (data) {
$(icon_id).html("<i class=\"material-icons prefix small\">" + data.icon + "</i>");
$("[name=" + next_field_name + "]").djangoSelect2({tags: data.tagging});
$("[name=" + next_field_name + "]").data('select2').selection.placeholder.text = data.placeholder;
$("[name=" + next_field_name + "]").next("span.select2:first").find("span.select2-selection__placeholder").html(data.placeholder);
}
});
}
$("#{{ form.bug_category_1.auto_id }}").on('input', function() {
$.fn.setIcons(this.id, "#bug_category_2_icon")
$.fn.setNextProperties(this.id, "#bug_category_2_icon", "bug_category_2")
if ($("#{{ form.bug_category_2.auto_id }}").is(':hidden')) {
$("#{{ form.bug_category_2.auto_id }}").show();
} else if ($("#{{ form.bug_category_3.auto_id }}").is(':visible')) {
......@@ -107,7 +107,7 @@
}
});
$("#{{ form.bug_category_2.auto_id }}").on('input', function() {
$.fn.setIcons(this.id, "#bug_category_3_icon")
$.fn.setNextProperties(this.id, "#bug_category_3_icon", "bug_category_3")
if ($("#{{ form.bug_category_3.auto_id }}").is(':hidden')) {
$("#{{ form.bug_category_3.auto_id }}").show();
}
......
......@@ -7,5 +7,5 @@ urlpatterns = [
path("feedback/", views.feedback, name="feedback"),
path("faq/", views.faq, name="faq"),
path("faq/ask/", views.ask, name="ask-faq"),
path("ajax/rebus_get_icon/", views.rebus_get_icon, name="rebus-get-icon"),
path("ajax/rebus_get_next_properties/", views.rebus_get_next_properties, name="rebus-get-next-properties"),
]
......@@ -69,10 +69,10 @@ def add_arrows(array: list):
return "".join([item for item in array if item != ""])
def rebus_get_icon(request):
def rebus_get_next_properties(request):
category = request.GET.get("category", None)
icon = {"icon": REBUSCategory.objects.get(name=category).icon}
return JsonResponse(icon)
next_properties = {"icon": REBUSCategory.objects.get(name=category).icon, "tagging": REBUSCategory.objects.get(name=category).tagging, "placeholder": REBUSCategory.objects.get(name=category).placeholder}
return JsonResponse(next_properties)
@login_required
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment