{% from 'govuk_frontend_jinja/components/accordion/macro.html' import govukAccordion %} {% from 'govuk_frontend_jinja/components/radios/macro.html' import govukRadios %} {% from 'govuk_frontend_jinja/components/input/macro.html' import govukInput %} {% from 'govuk_frontend_jinja/components/select/macro.html' import govukSelect %} {% from 'govuk_frontend_jinja/components/date-input/macro.html' import govukDateInput %} {% from 'govuk_frontend_jinja/components/button/macro.html' import govukButton %} {% from 'govuk_frontend_jinja/components/details/macro.html' import govukDetails %} {% from 'govuk_frontend_jinja/components/pagination/macro.html' import govukPagination %} {# Helper macro to get active filter value #} {% macro get_active_filter_value(active_filters, filter_index) -%} {%- if active_filters -%} {%- for filter_data in active_filters -%} {# Handle both 3-tuple (old format) and 4-tuple (new format with operation) #} {%- if filter_data|length == 4 -%} {%- set idx, flt_name, operation, value = filter_data -%} {%- else -%} {%- set idx, flt_name, value = filter_data -%} {%- endif -%} {%- if idx == filter_index -%}{{ value }}{%- endif -%} {%- endfor -%} {%- endif -%} {%- endmacro %} {# Render individual filter input based on filter type #} {% macro render_filter_input(filter, filter_key, current_value, filters) %} {% if filter.type == 'datepicker' %} {# GOV.UK Date Input - split into day/month/year fields #} {% set date_parts = current_value.split('-') if current_value and current_value.strip() else [] %} {% set day_value = date_parts[2] if date_parts|length == 3 else '' %} {% set month_value = date_parts[1] if date_parts|length == 3 else '' %} {% set year_value = date_parts[0] if date_parts|length == 3 else '' %} {{ govukDateInput({ "id": filter_key, "namePrefix": filter_key, "fieldset": { "legend": { "text": filter.operation, "classes": "govuk-fieldset__legend--s" } }, "hint": { "text": "For example, 27 3 2024" }, "items": [ { "name": "day", "classes": "govuk-input--width-2", "value": day_value }, { "name": "month", "classes": "govuk-input--width-2", "value": month_value }, { "name": "year", "classes": "govuk-input--width-4", "value": year_value } ] }) }} {% elif filter.type == 'datetimepicker' %} {# For datetime, provide text input with format hint #} {{ govukInput({ "id": filter_key, "name": filter_key, "label": {"text": filter.operation, "classes": "govuk-label--s"}, "hint": {"text": "Format: YYYY-MM-DD HH:MM:SS, for example 2024-03-27 14:30:00"}, "value": current_value if current_value else "", "classes": "govuk-input--width-20" }) }} {% elif filter.options %} {# Select dropdown for filters with predefined options #} {# Get the actual filter object from filters list using filter.index #} {% set actual_filter = filters[filter.index] if filters and filter.index < filters|length else none %} {# Check if this is an ArrayOverlapFilter (multi-select) #} {% set is_array_overlap = actual_filter and actual_filter.__class__.__name__ == 'ArrayOverlapFilter' %} {% if is_array_overlap %} {# Render multi-select for array overlap filters #} {% set select_items = [] %} {% set selected_values = current_value.split(',') if current_value else [] %} {% for opt_value, opt_label in filter.options %} {% set is_selected = opt_value in selected_values %} {% set _ = select_items.append({"value": opt_value, "text": opt_label, "selected": is_selected}) %} {% endfor %} {% set params = { "id": filter_key, "name": filter_key, "label": {"text": filter.operation, "classes": "govuk-label--s"}, "multiple": true, "select_items": select_items, "attributes": {"data-remove-duplicates": "true"} } %} {% include 'select-with-search.html' %} {% else %} {# Standard single-select dropdown #} {% set select_items = [{"value": "", "text": "Select..."}] %} {% for opt_value, opt_label in filter.options %} {# For enum filters, Flask-Admin provides enum values in options but expects enum names in form submission #} {# Check if the actual filter object has enum_class attribute (for EnumEqualFilter, etc.) #} {% if actual_filter and actual_filter.enum_class is defined and actual_filter.enum_class is not none %} {# opt_value contains the enum value (e.g., "red") from column.type.enums #} {# We need to find the enum name (e.g., "RED") for form submission #} {# And use the enum value (e.g., "red") for display #} {% set ns = namespace(enum_name=opt_value, display_label=opt_value) %} {% for member in actual_filter.enum_class %} {% if member.value == opt_value or member.name == opt_value %} {% set ns.enum_name = opt_value %} {% set ns.display_label = member.value %} {% endif %} {% endfor %} {% set is_selected = (current_value and current_value.strip() == ns.enum_name|string) %} {% set _ = select_items.append({"value": ns.enum_name, "text": ns.display_label, "selected": is_selected}) %} {% else %} {% set is_selected = (current_value and current_value.strip() == opt_value|string) %} {% set _ = select_items.append({"value": opt_value, "text": opt_label, "selected": is_selected}) %} {% endif %} {% endfor %} {{ govukSelect({ "id": filter_key, "name": filter_key, "label": {"text": filter.operation, "classes": "govuk-label--s"}, "items": select_items }) }} {% endif %} {% else %} {# Standard text input for text/number filters #} {% set input_params = { "id": filter_key, "name": filter_key, "label": {"text": filter.operation, "classes": "govuk-label--s"}, "value": current_value if current_value else "", "classes": "govuk-input--width-20" } %} {# Add inputmode for numeric filters #} {% if filter.type in ['int', 'float'] %} {% set _ = input_params.update({"inputmode": "numeric", "pattern": "[0-9]*"}) %} {% endif %} {{ govukInput(input_params) }} {% endif %} {% endmacro %} {# Render all filters for a given filter group #} {% macro render_filter_group_content(filter_name, filter_list, active_filters, filters) %}