diff --git a/app/main/forms.py b/app/main/forms.py index bd513ba73..eee4082e1 100644 --- a/app/main/forms.py +++ b/app/main/forms.py @@ -837,10 +837,7 @@ class RadioFieldWithNoneOption(FieldWithNoneOption, RadioField): pass -class NestedRadioField(RadioFieldWithNoneOption): - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - +class NestedFieldMixin: def children(self): # start map with root option as a single child entry child_map = {None: [option for option in self @@ -864,6 +861,14 @@ class NestedRadioField(RadioFieldWithNoneOption): return child_map +class NestedRadioField(RadioFieldWithNoneOption, NestedFieldMixin): + pass + + +class NestedCheckboxesField(SelectMultipleField, NestedFieldMixin): + pass + + class HiddenFieldWithNoneOption(FieldWithNoneOption, HiddenField): pass diff --git a/app/templates/components/radios.html b/app/templates/components/radios.html index 351158acb..b7b51f6cd 100644 --- a/app/templates/components/radios.html +++ b/app/templates/components/radios.html @@ -1,111 +1,27 @@ -{% macro radios( - field, - hint=None, - disable=[], - option_hints={}, - hide_legend=False -) %} - {% call radios_wrapper( - field, hint, disable, option_hints, hide_legend - ) %} - {% for option in field %} - {{ radio(option, disable, option_hints) }} - {% endfor %} - {% endcall %} +{% from "components/select-input.html" import select, select_list, select_nested, select_wrapper %} + +{% macro radios(field, hint=None, disable=[], option_hints={}, hide_legend=False) %} + {{ select(field, hint=None, disable=[], option_hints={}, hide_legend=False, input="radio") }} {% endmacro %} -{% macro radio_list( - options, - child_map, - disable=[], - option_hints={} -) %} - +{% macro radio_list(options, child_map, disable=[], option_hints={}) %} + {{ select_list(options, child_map, disable=[], option_hints={}, input="radio") }} {% endmacro %} -{% macro radios_nested( - field, - child_map, - hint=None, - disable=[], - option_hints={}, - hide_legend=False -) %} - {% call radios_wrapper( - field, hint, disable, option_hints, hide_legend - ) %} -
- {{ radio_list(child_map[None], child_map, disable, option_hints) }} -
- {% endcall %} +{% macro radios_nested(field, child_map, hint=None, disable=[], option_hints={}, hide_legend=False) %} + {{ select_nested(field, child_map, hint=None, disable=[], option_hints={}, hide_legend=False, input="radio") }} {% endmacro %} + {% macro radios_wrapper(field, hint=None, disable=[], option_hints={}, hide_legend=False) %} -
-
- - {% if hide_legend %}{% endif %} - {{ field.label.text|safe }} - {% if hide_legend %}{% endif %} - {% if hint %} - - {{ hint }} - - {% endif %} - {% if field.errors %} - - {{ field.errors[0] }} - - {% endif %} - - {{ caller() }} -
-
+ {{ select_wrapper(field, hint=None, disable=[], option_hints={}, hide_legend=False, input="radio") }} {% endmacro %} + {% macro radio(option, disable=[], option_hints={}, data_target=None, as_list_item=False) %} - {% if as_list_item %} -
  • - {% else %} -
    - {% endif %} - - - {% if caller %} - {{ caller() }} - {% endif %} - {% if as_list_item %} -
  • - {% else %} - - {% endif %} + {{ select_input(option, disable=[], option_hints={}, data_target=None, as_list_item=False, input="radio") }} {% endmacro %} diff --git a/app/templates/components/select-input.html b/app/templates/components/select-input.html new file mode 100644 index 000000000..b3cfbb9e4 --- /dev/null +++ b/app/templates/components/select-input.html @@ -0,0 +1,92 @@ +{% macro select(field, hint=None, disable=[], option_hints={}, hide_legend=False, input="radio") %} + {% call select_wrapper( + field, hint, disable, option_hints, hide_legend + ) %} + {% for option in field %} + {{ select_input(option, disable, option_hints, input=input) }} + {% endfor %} + {% endcall %} +{% endmacro %} + + +{% macro select_list(options, child_map, disable=[], option_hints={}, input="radio") %} + +{% endmacro %} + + +{% macro select_nested(field, child_map, hint=None, disable=[], option_hints={}, hide_legend=False, input="radio") %} + {% call select_wrapper( + field, hint, disable, option_hints, hide_legend + ) %} +
    + {{ select_list(child_map[None], child_map, disable, option_hints, input=input) }} +
    + {% endcall %} +{% endmacro %} + + +{% macro select_wrapper(field, hint=None, disable=[], option_hints={}, hide_legend=False) %} +
    +
    + + {% if hide_legend %}{% endif %} + {{ field.label.text|safe }} + {% if hide_legend %}{% endif %} + {% if hint %} + + {{ hint }} + + {% endif %} + {% if field.errors %} + + {{ field.errors[0] }} + + {% endif %} + + {{ caller() }} +
    +
    +{% endmacro %} + +{% macro select_input(option, disable=[], option_hints={}, data_target=None, as_list_item=False, input="radio") %} + {% if as_list_item %} +
  • + {% else %} +
    + {% endif %} + + + {% if caller %} + {{ caller() }} + {% endif %} + {% if as_list_item %} +
  • + {% else %} + + {% endif %} +{% endmacro %}