Skip to content

Commit 80948d9

Browse files
committed
119602: Force minimum time out
1 parent 59cb19a commit 80948d9

5 files changed

Lines changed: 53 additions & 5 deletions

File tree

src/app/accessibility/accessibility-settings.service.stub.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,4 +37,8 @@ export class AccessibilitySettingsServiceStub {
3737
convertStoredValuesToFormValues = jasmine.createSpy('convertStoredValuesToFormValues').and.returnValue({});
3838

3939
getPlaceholder = jasmine.createSpy('getPlaceholder').and.returnValue('placeholder');
40+
41+
isValid = jasmine.createSpy('isValid').and.returnValue(true);
42+
43+
allValid = jasmine.createSpy('allValid').and.returnValue(true);
4044
}

src/app/accessibility/accessibility-settings.service.ts

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import { Injectable } from '@angular/core';
22
import { Observable, of, switchMap } from 'rxjs';
33
import { map, take } from 'rxjs/operators';
44
import { CookieService } from '../core/services/cookie.service';
5-
import { hasValue, isNotEmpty } from '../shared/empty.util';
5+
import { hasValue, isNotEmpty, hasNoValue } from '../shared/empty.util';
66
import { AuthService } from '../core/auth/auth.service';
77
import { EPerson } from '../core/eperson/models/eperson.model';
88
import { EPersonDataService } from '../core/eperson/eperson-data.service';
@@ -276,6 +276,26 @@ export class AccessibilitySettingsService {
276276
};
277277
}
278278

279+
/**
280+
* Returns true if the provided value is a valid value for the provided AccessibilitySetting.
281+
*/
282+
isValid(setting: AccessibilitySetting | string, value: string): boolean {
283+
switch (setting) {
284+
case 'notificationTimeOut':
285+
return hasNoValue(value) || parseFloat(value) > 0;
286+
case 'liveRegionTimeOut':
287+
return hasNoValue(value) || parseFloat(value) > 0;
288+
default:
289+
throw new Error(`Unhandled accessibility setting during validity check: ${setting}`);
290+
}
291+
}
292+
293+
/**
294+
* Returns true if all settings in the provided AccessibilitySettings object are valid
295+
*/
296+
allValid(settings: AccessibilitySettings) {
297+
return Object.entries(settings).every(([setting, value], _) => this.isValid(setting, value));
298+
}
279299
}
280300

281301
/**

src/app/info/accessibility-settings/accessibility-settings.component.html

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,15 @@ <h2>{{ 'info.accessibility-settings.title' | translate }}</h2>
3030

3131
<div class="col-sm-4">
3232
<input [type]="'number'" [id]="'notificationTimeOutInput'" class="form-control"
33+
[ngClass]="{'is-invalid': !settingsService.isValid('notificationTimeOut', formValues.notificationTimeOut)}"
34+
[min]="1"
3335
[placeholder]="getPlaceholder('notificationTimeOut')"
3436
[readOnly]="!formValues.notificationTimeOutEnabled"
3537
[(ngModel)]="formValues.notificationTimeOut" [ngModelOptions]="{ standalone: true }"
3638
[attr.aria-describedby]="'notificationTimeOutHint'">
39+
<div class="invalid-feedback" [ngClass]="{ 'd-block': !settingsService.isValid('notificationTimeOut', formValues.notificationTimeOut) }">
40+
{{ 'info.accessibility-settings.notificationTimeOut.invalid' | translate }}
41+
</div>
3742
</div>
3843

3944

@@ -53,9 +58,14 @@ <h2>{{ 'info.accessibility-settings.title' | translate }}</h2>
5358

5459
<div class="col-sm-4">
5560
<input [type]="'number'" [id]="'liveRegionTimeOutInput'" class="form-control"
61+
[ngClass]="{'is-invalid': !settingsService.isValid('liveRegionTimeOut', formValues.liveRegionTimeOut)}"
62+
[min]="1"
5663
[placeholder]="getPlaceholder('liveRegionTimeOut')"
5764
[(ngModel)]="formValues.liveRegionTimeOut" [ngModelOptions]="{ standalone: true }"
5865
[attr.aria-describedby]="'liveRegionTimeOutHint'">
66+
<div class="invalid-feedback" [ngClass]="{ 'd-block': !settingsService.isValid('liveRegionTimeOut', formValues.liveRegionTimeOut) }">
67+
{{ 'info.accessibility-settings.liveRegionTimeOut.invalid' | translate }}
68+
</div>
5969
</div>
6070

6171

src/app/info/accessibility-settings/accessibility-settings.component.ts

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,10 +42,18 @@ export class AccessibilitySettingsComponent implements OnInit {
4242
saveSettings() {
4343
const formValues = this.formValues;
4444
const convertedValues = this.settingsService.convertFormValuesToStoredValues(formValues);
45-
this.settingsService.setSettings(convertedValues).pipe(take(1)).subscribe(location => {
46-
this.notificationsService.success(null, this.translateService.instant('info.accessibility-settings.save-notification.' + location));
47-
this.updateFormValues();
48-
});
45+
46+
if (this.settingsService.allValid(convertedValues)) {
47+
this.settingsService.setSettings(convertedValues).pipe(take(1)).subscribe(location => {
48+
this.notificationsService.success(null, this.translateService.instant('info.accessibility-settings.save-notification.' + location));
49+
this.updateFormValues();
50+
});
51+
} else {
52+
this.notificationsService.error(
53+
null,
54+
this.translateService.instant('info.accessibility-settings.invalid-form-notification'),
55+
);
56+
}
4957
}
5058

5159
/**

src/assets/i18n/en.json5

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1848,14 +1848,20 @@
18481848

18491849
"info.accessibility-settings.disableNotificationTimeOut.hint": "When this toggle is activated, notifications will close automatically after the time out passes. When deactivated, notifications will remain open untill manually closed.",
18501850

1851+
"info.accessibility-settings.invalid-form-notification": "Did not save. The form contains invalid values.",
1852+
18511853
"info.accessibility-settings.liveRegionTimeOut.label": "ARIA Live region time out (in seconds)",
18521854

18531855
"info.accessibility-settings.liveRegionTimeOut.hint": "The duration after which a message in the ARIA live region disappears. ARIA live regions are not visible on the page, but proivde announcements of notifications (or other actions) to screen readers.",
18541856

1857+
"info.accessibility-settings.liveRegionTimeOut.invalid": "Live region time out must be greater than 0",
1858+
18551859
"info.accessibility-settings.notificationTimeOut.label": "Notification time out (in seconds)",
18561860

18571861
"info.accessibility-settings.notificationTimeOut.hint": "The duration after which a notification disappears.",
18581862

1863+
"info.accessibility-settings.notificationTimeOut.invalid": "Notification time out must be greater than 0",
1864+
18591865
"info.accessibility-settings.save-notification.cookie": "Successfully saved settings locally.",
18601866

18611867
"info.accessibility-settings.save-notification.metadata": "Successfully saved settings on the user profile.",

0 commit comments

Comments
 (0)