Fix Create a new process page accessibility issues

- Added missing aria-label to delete buttons
- Moved hardcoded translation to translation files
- Fix color contrast issues on buttons
- Fix minor alignment issues
- Added missing aria labels to input and select elements
This commit is contained in:
Alexandre Vryghem
2023-11-28 00:20:35 +01:00
parent 4ea487cc0d
commit 52c0977489
11 changed files with 44 additions and 16 deletions

View File

@@ -3,12 +3,12 @@
<h2 class="col-12"> <h2 class="col-12">
{{headerKey | translate}} {{headerKey | translate}}
</h2> </h2>
<div class="col-12 col-md-6"> <div class="col-12 col-md-6 mb-2">
<form #form="ngForm" (ngSubmit)="submitForm(form)"> <form #form="ngForm" (ngSubmit)="submitForm(form)">
<ds-scripts-select [script]="selectedScript" (select)="selectedScript = $event; parameters = undefined"></ds-scripts-select> <ds-scripts-select [script]="selectedScript" (select)="selectedScript = $event; parameters = undefined"></ds-scripts-select>
<ds-process-parameters [initialParams]="parameters" [script]="selectedScript" (updateParameters)="parameters = $event"></ds-process-parameters> <ds-process-parameters [initialParams]="parameters" [script]="selectedScript" (updateParameters)="parameters = $event"></ds-process-parameters>
<button [routerLink]="['/processes']" class="btn btn-light float-left">{{ 'process.new.cancel' | translate }}</button> <a [routerLink]="['/processes']" class="btn btn-danger float-left">{{ 'process.new.cancel' | translate }}</a>
<button type="submit" class="btn btn-light float-right">{{ 'process.new.submit' | translate }}</button> <button type="submit" class="btn btn-primary float-right">{{ 'process.new.submit' | translate }}</button>
</form> </form>
</div> </div>
<div class="col-12 col-md-6"> <div class="col-12 col-md-6">

View File

@@ -1,16 +1,20 @@
<div class="form-row mb-2 mx-0"> <div class="form-row gap-2 mb-2 mx-0">
<select id="process-parameters" <select id="process-parameters"
class="form-control col" class="form-control col"
name="parameter-{{index}}" name="parameter-{{index}}"
[attr.aria-label]="'process.new.select-parameter' | translate"
[(ngModel)]="selectedParameter" [(ngModel)]="selectedParameter"
#param="ngModel"> #param="ngModel">
<option [ngValue]="undefined">Add a parameter...</option> <option [ngValue]="undefined">{{ 'process.new.add-parameter' | translate }}</option>
<option *ngFor="let param of parameters" [ngValue]="param.name"> <option *ngFor="let param of parameters" [ngValue]="param.name">
{{param.nameLong || param.name}} {{param.nameLong || param.name}}
</option> </option>
</select> </select>
<ds-parameter-value-input [initialValue]="parameterValue.value" [parameter]="selectedScriptParameter" (updateValue)="selectedParameterValue = $event" class="d-block col" [index]="index"></ds-parameter-value-input> <ds-parameter-value-input [initialValue]="parameterValue.value" [parameter]="selectedScriptParameter" (updateValue)="selectedParameterValue = $event" class="d-block col px-0" [index]="index"></ds-parameter-value-input>
<button *ngIf="removable" class="btn btn-light col-1 remove-button" (click)="removeParameter.emit(parameterValue);"><span class="fas fa-trash"></span></button> <button *ngIf="removable" [attr.aria-label]="'process.new.delete-parameter' | translate"
(click)="removeParameter.emit(parameterValue);" class="btn btn-danger col-1 remove-button">
<i class="fas fa-trash"></i>
</button>
<span *ngIf="!removable" class="col-1"></span> <span *ngIf="!removable" class="col-1"></span>
</div> </div>

View File

@@ -1,5 +1,5 @@
import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing'; import { waitForAsync, ComponentFixture, TestBed } from '@angular/core/testing';
import { TranslateModule } from '@ngx-translate/core';
import { ParameterSelectComponent } from './parameter-select.component'; import { ParameterSelectComponent } from './parameter-select.component';
import { NO_ERRORS_SCHEMA } from '@angular/core'; import { NO_ERRORS_SCHEMA } from '@angular/core';
import { FormsModule } from '@angular/forms'; import { FormsModule } from '@angular/forms';
@@ -33,7 +33,10 @@ describe('ParameterSelectComponent', () => {
beforeEach(waitForAsync(() => { beforeEach(waitForAsync(() => {
init(); init();
TestBed.configureTestingModule({ TestBed.configureTestingModule({
imports: [FormsModule], imports: [
FormsModule,
TranslateModule.forRoot(),
],
declarations: [ParameterSelectComponent], declarations: [ParameterSelectComponent],
schemas: [NO_ERRORS_SCHEMA] schemas: [NO_ERRORS_SCHEMA]
}) })

View File

@@ -1 +1 @@
<input type="hidden" value="true" name="boolean-value-{{index}}" id="boolean-value-{{index}}"/> <input [attr.aria-label]="'process.new.parameter.label' | translate" type="hidden" value="true" name="boolean-value-{{index}}" id="boolean-value-{{index}}"/>

View File

@@ -1,5 +1,5 @@
import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing'; import { ComponentFixture, TestBed, waitForAsync } from '@angular/core/testing';
import { TranslateModule } from '@ngx-translate/core';
import { BooleanValueInputComponent } from './boolean-value-input.component'; import { BooleanValueInputComponent } from './boolean-value-input.component';
describe('BooleanValueInputComponent', () => { describe('BooleanValueInputComponent', () => {
@@ -8,6 +8,9 @@ describe('BooleanValueInputComponent', () => {
beforeEach(waitForAsync(() => { beforeEach(waitForAsync(() => {
TestBed.configureTestingModule({ TestBed.configureTestingModule({
imports: [
TranslateModule.forRoot(),
],
declarations: [BooleanValueInputComponent] declarations: [BooleanValueInputComponent]
}) })
.compileComponents(); .compileComponents();

View File

@@ -1,6 +1,6 @@
<input required #string="ngModel" type="text" class="form-control" name="date-value-{{index}}" id="date-value-{{index}}" [ngModel]="value" (ngModelChange)="setValue($event)"/> <input [attr.aria-label]="'process.new.parameter.label' | translate" required #string="ngModel" type="text" class="form-control" name="date-value-{{index}}" id="date-value-{{index}}" [ngModel]="value" (ngModelChange)="setValue($event)"/>
<div *ngIf="string.invalid && (string.dirty || string.touched)" <div *ngIf="string.invalid && (string.dirty || string.touched)"
class="alert alert-danger validation-error"> class="alert alert-danger validation-error mb-0">
<div *ngIf="string.errors.required"> <div *ngIf="string.errors.required">
{{'process.new.parameter.string.required' | translate}} {{'process.new.parameter.string.required' | translate}}
</div> </div>

View File

@@ -0,0 +1,5 @@
:host {
display: flex;
flex-direction: column;
gap: calc(var(--bs-spacer) / 2);
}

View File

@@ -1,5 +1,5 @@
<label for="file-upload-{{index}}" class="d-flex align-items-center m-0"> <label for="file-upload-{{index}}" class="d-flex align-items-center m-0">
<span class="btn btn-light"> <span class="btn btn-primary">
{{'process.new.parameter.file.upload-button' | translate}} {{'process.new.parameter.file.upload-button' | translate}}
</span> </span>
<span class="file-name ml-1">{{fileObject?.name}}</span> <span class="file-name ml-1">{{fileObject?.name}}</span>

View File

@@ -1,6 +1,6 @@
<input required #string="ngModel" type="text" name="string-value-{{index}}" class="form-control" id="string-value-{{index}}" [ngModel]="value" (ngModelChange)="setValue($event)"/> <input [attr.aria-label]="'process.new.parameter.label' | translate" required #string="ngModel" type="text" name="string-value-{{index}}" class="form-control" id="string-value-{{index}}" [ngModel]="value" (ngModelChange)="setValue($event)"/>
<div *ngIf="string.invalid && (string.dirty || string.touched)" <div *ngIf="string.invalid && (string.dirty || string.touched)"
class="alert alert-danger validation-error"> class="alert alert-danger validation-error mb-0">
<div *ngIf="string.errors.required"> <div *ngIf="string.errors.required">
{{'process.new.parameter.string.required' | translate}} {{'process.new.parameter.string.required' | translate}}
</div> </div>

View File

@@ -0,0 +1,5 @@
:host {
display: flex;
flex-direction: column;
gap: calc(var(--bs-spacer) / 2);
}

View File

@@ -3136,6 +3136,14 @@
"process.new.select-parameters": "Parameters", "process.new.select-parameters": "Parameters",
"process.new.select-parameter": "Select parameter",
"process.new.add-parameter": "Add a parameter...",
"process.new.delete-parameter": "Delete parameter",
"process.new.parameter.label": "Parameter value",
"process.new.cancel": "Cancel", "process.new.cancel": "Cancel",
"process.new.submit": "Save", "process.new.submit": "Save",