diff --git a/aleksis/core/forms.py b/aleksis/core/forms.py index e1c0be7ef4f28e609c93f3b58208aa0ea4d58b3a..9297980c7cc8bbd494f6124ee914f6d542b1863f 100644 --- a/aleksis/core/forms.py +++ b/aleksis/core/forms.py @@ -5,7 +5,7 @@ from django.contrib.auth import get_user_model from django.core.exceptions import ValidationError from django.utils.translation import gettext_lazy as _ -from django_select2.forms import ModelSelect2MultipleWidget, Select2Widget +from django_select2.forms import ModelSelect2MultipleWidget, ModelSelect2Widget, Select2Widget from dynamic_preferences.forms import PreferenceForm from material import Fieldset, Layout, Row @@ -24,7 +24,7 @@ class PersonAccountForm(forms.ModelForm): class Meta: model = Person fields = ["last_name", "first_name", "user"] - widgets = {"user": Select2Widget} + widgets = {"user": Select2Widget(attrs={"class": "browser-default"})} new_user = forms.CharField(required=False) @@ -107,7 +107,19 @@ class EditPersonForm(ExtensibleForm): "primary_group", ] widgets = { - "user": Select2Widget, + "user": Select2Widget(attrs={"class": "browser-default"}), + "primary_group": ModelSelect2Widget( + search_fields=["name__icontains", "short_name__icontains"], + attrs={"data-minimum-input-length": 0, "class": "browser-default"}, + ), + "guardians": ModelSelect2MultipleWidget( + search_fields=[ + "first_name__icontains", + "last_name__icontains", + "short_name__icontains", + ], + attrs={"data-minimum-input-length": 0, "class": "browser-default"}, + ), } new_user = forms.CharField( @@ -138,19 +150,25 @@ class EditGroupForm(SchoolTermRelatedExtensibleForm): "first_name__icontains", "last_name__icontains", "short_name__icontains", - ] + ], + attrs={"data-minimum-input-length": 0, "class": "browser-default"}, ), "owners": ModelSelect2MultipleWidget( search_fields=[ "first_name__icontains", "last_name__icontains", "short_name__icontains", - ] + ], + attrs={"data-minimum-input-length": 0, "class": "browser-default"}, ), "parent_groups": ModelSelect2MultipleWidget( - search_fields=["name__icontains", "short_name__icontains"] + search_fields=["name__icontains", "short_name__icontains"], + attrs={"data-minimum-input-length": 0, "class": "browser-default"}, + ), + "additional_fields": ModelSelect2MultipleWidget( + search_fields=["title__icontains",], + attrs={"data-minimum-input-length": 0, "class": "browser-default"}, ), - "additional_fields": ModelSelect2MultipleWidget(search_fields=["title__icontains",]), } @@ -167,9 +185,27 @@ class AnnouncementForm(ExtensibleForm): valid_until_time = forms.TimeField(label=_("Time")) persons = forms.ModelMultipleChoiceField( - Person.objects.all(), label=_("Persons"), required=False + queryset=Person.objects.all(), + label=_("Persons"), + required=False, + widget=ModelSelect2MultipleWidget( + search_fields=[ + "first_name__icontains", + "last_name__icontains", + "short_name__icontains", + ], + attrs={"data-minimum-input-length": 0, "class": "browser-default"}, + ), + ) + groups = forms.ModelMultipleChoiceField( + queryset=None, + label=_("Groups"), + required=False, + widget=ModelSelect2MultipleWidget( + search_fields=["name__icontains", "short_name__icontains",], + attrs={"data-minimum-input-length": 0, "class": "browser-default"}, + ), ) - groups = forms.ModelMultipleChoiceField(queryset=None, label=_("Groups"), required=False) layout = Layout( Fieldset( diff --git a/aleksis/core/templates/core/announcement/form.html b/aleksis/core/templates/core/announcement/form.html index 0cd31cdefc11e8f1a2d29a30fb72a001357a946f..44d60280c6d358f74c60cb9c5ccff2c7aba89b07 100644 --- a/aleksis/core/templates/core/announcement/form.html +++ b/aleksis/core/templates/core/announcement/form.html @@ -2,8 +2,12 @@ {% extends "core/base.html" %} -{% load i18n material_form %} +{% load i18n material_form any_js %} +{% block extra_head %} + {{ form.media.css }} + {% include_css "select2-materialize" %} +{% endblock %} {% block browser_title %} {% if mode == "edit" %} @@ -30,4 +34,6 @@ {% trans "Save und publish announcement" %} </button> </form> + {% include_js "select2-materialize" %} + {{ form.media.js }} {% endblock %} diff --git a/aleksis/core/templates/core/group/edit.html b/aleksis/core/templates/core/group/edit.html index b26a28d1efc5ee292a257220bca00754512c1b99..146a5d83abe78307c20f5f70aaff28dc82b62fed 100644 --- a/aleksis/core/templates/core/group/edit.html +++ b/aleksis/core/templates/core/group/edit.html @@ -1,7 +1,12 @@ {# -*- engine:django -*- #} {% extends "core/base.html" %} -{% load material_form i18n %} +{% load material_form i18n any_js %} + +{% block extra_head %} + {{ edit_group_form.media.css }} + {% include_css "select2-materialize" %} +{% endblock %} {% block browser_title %}{% blocktrans %}Edit group{% endblocktrans %}{% endblock %} {% block page_title %}{% blocktrans %}Edit group{% endblocktrans %}{% endblock %} @@ -13,5 +18,7 @@ {% form form=edit_group_form %}{% endform %} {% include "core/partials/save_button.html" %} </form> + {% include_js "select2-materialize" %} + {{ edit_group_form.media.js }} {% endblock %} diff --git a/aleksis/core/templates/core/person/accounts.html b/aleksis/core/templates/core/person/accounts.html index 672b089aaa949560e958d829597e1b7abd986265..03725518dfcbf8552a53199790daa44d541bac32 100644 --- a/aleksis/core/templates/core/person/accounts.html +++ b/aleksis/core/templates/core/person/accounts.html @@ -2,7 +2,12 @@ {% extends "core/base.html" %} -{% load i18n %} +{% load i18n any_js %} + +{% block extra_head %} + {{ persons_accounts_formset.media.css }} + {% include_css "select2-materialize" %} +{% endblock %} {% block browser_title %}{% blocktrans %}Link persons to accounts{% endblocktrans %}{% endblock %} {% block page_title %} @@ -55,4 +60,6 @@ {% blocktrans %}Update{% endblocktrans %} </button> </form> + {% include_js "select2-materialize" %} + {{ persons_accounts_formset.media.js }} {% endblock %} diff --git a/aleksis/core/templates/core/person/edit.html b/aleksis/core/templates/core/person/edit.html index 261249f6867a4370745f66d3bd0abc05891442cf..3bf16ca3521ea744acfe48c6829dfae21db06eb5 100644 --- a/aleksis/core/templates/core/person/edit.html +++ b/aleksis/core/templates/core/person/edit.html @@ -2,10 +2,11 @@ {% extends "core/base.html" %} -{% load material_form i18n %} +{% load material_form i18n any_js %} {% block extra_head %} {{ edit_person_form.media }} + {% include_css "select2-materialize" %} {% endblock %} {% block browser_title %}{% blocktrans %}Edit person{% endblocktrans %}{% endblock %} @@ -19,5 +20,7 @@ {% form form=edit_person_form %}{% endform %} {% include "core/partials/save_button.html" %} </form> + {% include_js "select2-materialize" %} + {{ edit_group_form.media.js }} {% endblock %} diff --git a/aleksis/core/templates/material/fields/django_select2_modelselect2multiplewidget.html b/aleksis/core/templates/material/fields/django_select2_modelselect2multiplewidget.html new file mode 100644 index 0000000000000000000000000000000000000000..1b19d8ec88bf72a694e32066c935327691c00738 --- /dev/null +++ b/aleksis/core/templates/material/fields/django_select2_modelselect2multiplewidget.html @@ -0,0 +1,21 @@ +{% load l10n material_form material_form_internal %} +{% part bound_field.field %}<{{ field.widget.component|default:'dmc-select' }}> + <label>{{ bound_field.label }}</label> + <div class="row"> + <div{% attrs bound_field 'group' %} + id="id_{{ bound_field.html_name }}_container" + class="input-field col s12{% if field.required %} required{% endif %}{% if bound_field.errors %} has-error{% endif %}" + style="margin-top: 0" + {% endattrs %}> + {% part field prefix %}{% endpart %} + {% part field control %} + {{ bound_field }} + {% endpart %} + {% part field help_text %}{% if field.help_text %} + <div class="help-block">{{ bound_field.help_text|safe }}</div> + {% endif %}{% endpart %}{% part field errors %} + {% if bound_field.errors %} + {% include 'material/field_errors.html' %} + {% endif %}{% endpart %}{{ hidden_initial }} + </div> +</div></{{ field.widget.component|default:'dmc-select' }}>{% endpart %} diff --git a/aleksis/core/templates/material/fields/django_select2_select2widget.html b/aleksis/core/templates/material/fields/django_select2_select2widget.html new file mode 100644 index 0000000000000000000000000000000000000000..1b19d8ec88bf72a694e32066c935327691c00738 --- /dev/null +++ b/aleksis/core/templates/material/fields/django_select2_select2widget.html @@ -0,0 +1,21 @@ +{% load l10n material_form material_form_internal %} +{% part bound_field.field %}<{{ field.widget.component|default:'dmc-select' }}> + <label>{{ bound_field.label }}</label> + <div class="row"> + <div{% attrs bound_field 'group' %} + id="id_{{ bound_field.html_name }}_container" + class="input-field col s12{% if field.required %} required{% endif %}{% if bound_field.errors %} has-error{% endif %}" + style="margin-top: 0" + {% endattrs %}> + {% part field prefix %}{% endpart %} + {% part field control %} + {{ bound_field }} + {% endpart %} + {% part field help_text %}{% if field.help_text %} + <div class="help-block">{{ bound_field.help_text|safe }}</div> + {% endif %}{% endpart %}{% part field errors %} + {% if bound_field.errors %} + {% include 'material/field_errors.html' %} + {% endif %}{% endpart %}{{ hidden_initial }} + </div> +</div></{{ field.widget.component|default:'dmc-select' }}>{% endpart %}