Skip to content

Commit 463749c

Browse files
Filter year group checkboxes by programme
Use htmx's hx-select-oob to dynamically update year group options when the programme changes. This keeps the filtering logic server-side, with better progressive enhancement.
1 parent c662271 commit 463749c

File tree

4 files changed

+50
-6
lines changed

4 files changed

+50
-6
lines changed

mavis/reporting/api_client/client.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,13 @@
11
from mavis.reporting.helpers import mavis_helper
22
from mavis.reporting.helpers.mavis_helper import MavisApiError, parse_json_response
33

4+
PROGRAMME_YEAR_GROUPS = {
5+
"flu": ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13"],
6+
"hpv": ["8", "9", "10", "11"],
7+
"menacwy": ["9", "10", "11"],
8+
"td_ipv": ["9", "10", "11"],
9+
}
10+
411

512
class MavisApiClient:
613
def __init__(self, app=None, session=None):
@@ -104,6 +111,11 @@ def get_year_groups(self) -> list[dict]:
104111
{"value": "11", "text": "Year 11"},
105112
]
106113

114+
def get_year_groups_for_programme(self, programme: str) -> list[dict]:
115+
all_year_groups = self.get_year_groups()
116+
eligible_values = PROGRAMME_YEAR_GROUPS.get(programme, [])
117+
return [yg for yg in all_year_groups if yg["value"] in eligible_values]
118+
107119
# https://www.datadictionary.nhs.uk/attributes/person_gender_code.html
108120
def get_genders(self) -> list[dict]:
109121
return [

mavis/reporting/templates/components/filters.jinja

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,16 @@
66
{% from "button/macro.jinja" import button %}
77

88
{% macro filters(params) %}
9-
<form method="get"
9+
<form id="filters-form"
10+
method="get"
1011
action="{{ params.form_action }}"
1112
hx-get="{{ params.form_action }}"
1213
hx-trigger="change from:input"
1314
hx-target="#dashboard"
1415
hx-select="#dashboard"
16+
hx-select-oob="#filters-form:outerHTML"
1517
hx-swap="outerHTML"
16-
hx-replace-url="true"
17-
hx-sync="this:replace">
18+
hx-replace-url="true">
1819
{% call fieldset({
1920
"legend": {
2021
"text": "Filter data",

mavis/reporting/views.py

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -149,13 +149,18 @@ def vaccinations(workgroup):
149149
filters = {}
150150

151151
filters["team_workgroup"] = team.workgroup
152-
filters["programme"] = request.args.get("programme") or "hpv"
152+
filters["programme"] = request.args.get("programme") or "flu"
153153

154154
gender_values = request.args.getlist("gender")
155155
if gender_values:
156156
filters["gender"] = gender_values
157157

158-
year_group_values = request.args.getlist("year-group")
158+
year_groups = g.api_client.get_year_groups_for_programme(filters["programme"])
159+
valid_year_group_values = {yg["value"] for yg in year_groups}
160+
161+
year_group_values = [
162+
v for v in request.args.getlist("year-group") if v in valid_year_group_values
163+
]
159164
if year_group_values:
160165
filters["year_group"] = year_group_values
161166

@@ -165,7 +170,7 @@ def vaccinations(workgroup):
165170
"vaccinations.jinja",
166171
team=team,
167172
programmes=g.api_client.get_programmes(),
168-
year_groups=g.api_client.get_year_groups(),
173+
year_groups=year_groups,
169174
genders=g.api_client.get_genders(),
170175
academic_year=get_current_academic_year_range(),
171176
data=data,

tests/api_client/test_client.py

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,3 +45,29 @@ def test_valid_vaccination_data(api_client, mock_mavis_get_request):
4545

4646
assert result["cohort"] == expected_cohort
4747
assert "vaccinated_percentage" in result
48+
49+
50+
class TestGetYearGroupsForProgramme:
51+
def test_flu_returns_all_year_groups(self, api_client):
52+
result = api_client.get_year_groups_for_programme("flu")
53+
values = [yg["value"] for yg in result]
54+
assert values == ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11"]
55+
56+
def test_hpv_returns_years_8_to_11(self, api_client):
57+
result = api_client.get_year_groups_for_programme("hpv")
58+
values = [yg["value"] for yg in result]
59+
assert values == ["8", "9", "10", "11"]
60+
61+
def test_menacwy_returns_years_9_to_11(self, api_client):
62+
result = api_client.get_year_groups_for_programme("menacwy")
63+
values = [yg["value"] for yg in result]
64+
assert values == ["9", "10", "11"]
65+
66+
def test_td_ipv_returns_years_9_to_11(self, api_client):
67+
result = api_client.get_year_groups_for_programme("td_ipv")
68+
values = [yg["value"] for yg in result]
69+
assert values == ["9", "10", "11"]
70+
71+
def test_unknown_programme_returns_empty_list(self, api_client):
72+
result = api_client.get_year_groups_for_programme("unknown")
73+
assert result == []

0 commit comments

Comments
 (0)