From 59ffb84d3c83286608c7b80e8acd4098d9dfe9fa Mon Sep 17 00:00:00 2001 From: Elke Kreim <elke.kreim@hs-hannover.de> Date: Sun, 29 Nov 2020 21:50:22 +0100 Subject: [PATCH] Add helptext-tags for fields change checkbox input behaviour Differences between multi select checkboxes and single checkbox are considered. Field label for single checkbox becomes checkbox label while multi select checkboxes have a field label and additional checkbox or option labels. --- hshassets/forms/utils.py | 19 +++++++++++++++---- hshassets/templatetags/bulma.py | 11 +++++++++-- setup.py | 2 +- 3 files changed, 25 insertions(+), 7 deletions(-) diff --git a/hshassets/forms/utils.py b/hshassets/forms/utils.py index 31a1cf0b..daa637c0 100644 --- a/hshassets/forms/utils.py +++ b/hshassets/forms/utils.py @@ -27,7 +27,13 @@ def render_form_field(field, label=''): out = label_or_not(BulmaFieldMarkup.with_icons(field, field.as_widget())) elif input_type and getattr(BulmaFieldMarkup, input_type, None): # something else explicitly defined - out = getattr(BulmaFieldMarkup, input_type)(field, field.as_widget()) + allow_multiple_selected = getattr(field.field.widget, 'allow_multiple_selected', False) + if input_type == 'checkbox' and allow_multiple_selected: + # Checkboxes for multi select have common label above and checkboxes + # with label of choice option. + out = label_or_not(BulmaFieldMarkup.div_control(field.as_widget())) + else: + out = getattr(BulmaFieldMarkup, input_type)(field, field.as_widget()) else: # fallback default out = label_or_not(BulmaFieldMarkup.div_control(field.as_widget())) @@ -48,7 +54,11 @@ class BulmaFieldMarkup(object): """Bulma requires to wrap every input field with this <div class="field">""" args_generator = ([str(e)] for e in field.errors) error_tags = format_html_join(str(), '<p class="help is-danger">{0}</p>', args_generator) - return format_html('<div class="field">{}{}</div>', content, error_tags) + if field.help_text: + help_tags = format_html('<p class=help>{}</p>', mark_safe(field.help_text)) + else: + help_tags = '' + return format_html('<div class="field">{}{}{}</div>', content, error_tags, help_tags) @classmethod def div_control(cls, content, control_class='control'): @@ -105,6 +115,7 @@ class BulmaFieldMarkup(object): """Checkboxes are super special, they wrap the input field with the label""" return cls.div_control(cls.label(mark_safe(content + ' ' + str(field.label)), css_class='checkbox')) + @classmethod def radio(cls, field, content): choice_markup = '' @@ -128,14 +139,14 @@ def render_form_generics( rendered_errors, rendered_submit_button, submit_only_once=True, - form_id='' + form_id='', ): csrf_field = defaulttags.CsrfTokenNode().render(context) submit_only_once = "true" if submit_only_once else "false" form_icon = None form_id = 'id={}'.format(form_id) if form_id else '' return format_html( - """ + f""" <form method="post" {form_id} data-submit-only-once="{submit_only_once}"> {csrf_field} {rendered_errors} diff --git a/hshassets/templatetags/bulma.py b/hshassets/templatetags/bulma.py index b2daafbc..0d2d35bf 100644 --- a/hshassets/templatetags/bulma.py +++ b/hshassets/templatetags/bulma.py @@ -63,13 +63,20 @@ def bulma_form( submit_class="button is-outlined", submit_icon="fas fa-check", submit_only_once=True, - form_id='' + form_id='', ): """Renders whole form, including errors, csrf and a submit button.""" fields = bulma_form_fields(form) errors = bulma_form_errors(form) submit = bulma_submit_button(text=submit_text, css_class=submit_class, icon=submit_icon) - return render_form_generics(context, fields, errors, submit, submit_only_once, form_id) + return render_form_generics( + context, + fields, + errors, + submit, + submit_only_once, + form_id, + ) def render_layout(elements, form): diff --git a/setup.py b/setup.py index 0120713b..249ff9f9 100644 --- a/setup.py +++ b/setup.py @@ -7,7 +7,7 @@ os.chdir(os.path.normpath(os.path.join(os.path.abspath(__file__), os.pardir))) setup( name='django-hshassets', - version='2.2.18', + version='2.2.21', packages=find_packages(), include_package_data=True, license='MIT License', -- GitLab