Skip to content

Commit 319aea7

Browse files
authored
Merge pull request #34 from TechnologyEnhancedLearning/Develop/Features/TD-4183-input-error-alert
Expose date input errors to screen reader
2 parents 1ead950 + e45b6ce commit 319aea7

File tree

1 file changed

+44
-6
lines changed
  • NHSUKViewComponents.Web/Views/Shared/Components/DateInput

1 file changed

+44
-6
lines changed

NHSUKViewComponents.Web/Views/Shared/Components/DateInput/Default.cshtml

Lines changed: 44 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -54,12 +54,13 @@
5454
id="@Model.DayId"
5555
name="@Model.DayId"
5656
value="@Model.DayValue"
57-
type="number"
57+
type="text"
5858
pattern="[0-9]*"
5959
min="1"
6060
max="31"
6161
step="1"
62-
inputmode="numeric" />
62+
inputmode="numeric"
63+
aria-describedby="date-error" aria-invalid="false" />
6364
</div>
6465
</div>
6566
<div class="nhsuk-date-input__item">
@@ -69,12 +70,13 @@
6970
id="@Model.MonthId"
7071
name="@Model.MonthId"
7172
value="@Model.MonthValue"
72-
type="number"
73+
type="text"
7374
pattern="[0-9]*"
7475
min="1"
7576
max="12"
7677
step="1"
77-
inputmode="numeric" />
78+
inputmode="numeric"
79+
aria-describedby="date-error" aria-invalid="false" />
7880
</div>
7981
</div>
8082
<div class="nhsuk-date-input__item">
@@ -84,14 +86,50 @@
8486
id="@Model.YearId"
8587
name="@Model.YearId"
8688
value="@Model.YearValue"
87-
type="number"
89+
type="text"
8890
pattern="[0-9]*"
8991
min="1900"
9092
max="9999"
9193
step="1"
92-
inputmode="numeric" />
94+
inputmode="numeric"
95+
aria-describedby="date-error" aria-invalid="false" />
9396
</div>
9497
</div>
98+
<span id="date-error" class="error-message--margin-bottom-1 nhsuk-error-message" aria-live="polite" style="visibility: hidden;">
99+
</span>
95100
</div>
96101
</fieldset>
102+
<script>
103+
const fields = [@Model.DayId, @Model.MonthId, @Model.YearId];
104+
105+
const errorElement = document.getElementById('date-error');
106+
for (let field of fields) {
107+
const inputElement = document.getElementById(field.id);
108+
109+
inputElement.addEventListener('input', function (event) {
110+
111+
if (event.inputType === 'deleteContentBackward') {
112+
return;
113+
}
114+
115+
const value = event.data;
116+
const min = parseInt(inputElement.getAttribute('min'));
117+
const max = parseInt(inputElement.getAttribute('max'));
118+
119+
inputElement.setAttribute('aria-invalid', 'false');
120+
errorElement.textContent = '';
121+
errorElement.style.visibility = 'hidden';
122+
123+
setTimeout(function () {
124+
if (value < 1 || value > max || !value.match(/^[0-9]*$/)) {
125+
inputElement.value = inputElement.value.slice(0, -1) + 1;
126+
inputElement.value = inputElement.value.slice(0, -1);
127+
inputElement.setAttribute('aria-invalid', 'true');
128+
errorElement.textContent = `Invalid input. Please enter a number between ${min} and ${max}.`;
129+
errorElement.style.visibility = 'visible';
130+
}
131+
}, 0);
132+
});
133+
}
134+
</script>
97135
</div>

0 commit comments

Comments
 (0)