]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/dashboard: Improve level A accessibility for datatable component
authornsedrickm <nsedrick101@gmail.com>
Mon, 4 Jul 2022 15:14:17 +0000 (16:14 +0100)
committerNizamudeen A <nia@redhat.com>
Thu, 12 Jan 2023 10:26:04 +0000 (15:56 +0530)
* Add accessible names for table action buttons, dropdowns and table input elements
* Update accent color to primary color
* Add custom row selection checkbox

Fixes: https://tracker.ceph.com/issues/56022
Signed-off-by: nsedrickm <nsedrick101@gmail.com>
(cherry picked from commit 020460cdec30adc7d4e12347db55f91d26d791bf)

src/pybind/mgr/dashboard/frontend/src/app/shared/datatable/table-actions/table-actions.component.html
src/pybind/mgr/dashboard/frontend/src/app/shared/datatable/table-actions/table-actions.component.scss
src/pybind/mgr/dashboard/frontend/src/app/shared/datatable/table/table.component.html
src/pybind/mgr/dashboard/frontend/src/app/shared/datatable/table/table.component.scss
src/pybind/mgr/dashboard/frontend/src/app/shared/datatable/table/table.component.ts
src/pybind/mgr/dashboard/frontend/src/styles/defaults/_bootstrap-defaults.scss

index 905aaa96b69be5721fad0edc874f2ce4ab198bbb..ef2a4481dbe25dd9d63dad89e2356022960634a0 100644 (file)
@@ -5,11 +5,12 @@
             class="btn btn-{{btnColor}}"
             [ngClass]="{'disabled': disableSelectionAction(currentAction)}"
             (click)="useClickAction(currentAction)"
+            [disabled]="disableSelectionAction(currentAction)"
             [routerLink]="useRouterLink(currentAction)"
             [attr.aria-label]="currentAction.name"
             [preserveFragment]="currentAction.preserveFragment ? '' : null">
       <i [ngClass]="[currentAction.icon]"></i>
-      <span>{{ currentAction.name }}</span>
+      <span class="action-label">{{ currentAction.name }}</span>
     </button>
   </ng-container>
   <div class="btn-group"
@@ -17,7 +18,8 @@
        role="group"
        *ngIf="dropDownActions.length > 1"
        aria-label="Button group with nested dropdown">
-    <button class="btn btn-{{btnColor}} dropdown-toggle-split"
+    <button aria-label="dropdown-menu-toggle"
+            class="btn btn-{{btnColor}} dropdown-toggle-split"
             ngbDropdownToggle>
       <ng-container *ngIf="dropDownOnly">{{ dropDownOnly }} </ng-container>
       <span *ngIf="!dropDownOnly"
index f996de72794e9d4cfdee4ad819e16eb4cc8762c8..084b466150a617a1771456b127665c7b0fc7190a 100644 (file)
@@ -1,8 +1,19 @@
+@use './src/styles/vendor/variables' as vv;
+
 button.disabled {
+  color: vv.$gray-500;
   cursor: default !important;
   pointer-events: auto;
 }
 
+button.dropdown-item:hover {
+  background-color: vv.$gray-300;
+}
+
 .action-icon {
   padding-right: 1.5rem;
 }
+
+.action-label {
+  font-weight: bold;
+}
index d7dd7e5c703ffbbf4b8a69e13fe82200a351cea2..2c653f809081f7e54d8c274994c23979e57aa5b5 100644 (file)
@@ -21,7 +21,8 @@
            placement="bottom-right"
            class="tc_filter_name">
         <button ngbDropdownToggle
-                class="btn btn-light">
+                class="btn btn-light"
+                title="Filter">
           <i [ngClass]="[icons.large, icons.filter]"></i>
           {{ selectedFilter.column.name }}
         </button>
           <i [ngClass]="[icons.search]"></i>
         </span>
       </span>
-      <input class="form-control"
+      <input aria-label="search"
+             class="form-control"
              type="text"
              [(ngModel)]="search"
              (keyup)="updateFilter()">
       <div class="input-group-append">
         <button type="button"
                 class="btn btn-light"
+                title="Clear"
                 (click)="onClearSearch()">
           <i class="icon-prepend {{ icons.destroy }}"></i>
         </button>
@@ -80,7 +83,8 @@
     <!-- pagination limit -->
     <div class="input-group dataTables_paginate"
          *ngIf="limit">
-      <input class="form-control"
+      <input aria-label="table pagination"
+             class="form-control"
              type="number"
              min="1"
              max="9999"
            autoClose="outside"
            class="tc_menuitem">
         <button ngbDropdownToggle
-                class="btn btn-light tc_columnBtn">
+                class="btn btn-light tc_columnBtn"
+                title="toggle columns">
           <i [ngClass]="[icons.large, icons.table]"></i>
         </button>
         <div ngbDropdownMenu>
       <button type="button"
               [class]="'btn btn-' + status.type"
               [ngbTooltip]="status.msg"
-              (click)="refreshBtn()">
+              (click)="refreshBtn()"
+              title="Refresh">
         <i [ngClass]="[icons.large, icons.refresh]"
            [class.fa-spin]="updating || loadingIndicator"></i>
       </button>
                  [rowIdentity]="rowIdentity()"
                  [rowHeight]="'auto'">
 
+    <!-- Row Selection Template-->
+    <ng-template #rowSelectionTpl
+                 let-value="value"
+                 let-isSelected="isSelected"
+                 ngx-datatable-cell-template>
+      <input type="checkbox"
+             [attr.aria-label]="isSelected ? 'selected' : 'select'"
+             [checked]="isSelected"
+             class="cd-datatable-checkbox" />
+    </ng-template>
+
     <!-- Row Detail Template -->
     <ngx-datatable-row-detail rowHeight="auto"
                               #detailRow>
index 57b8e48de9cd6de1def089c19786806b4efbb257..4762b301ff0dcd5082d7e3bbfb0b725b42259d3d 100644 (file)
 
   .cd-datatable-checkbox {
     text-align: center;
+
+    &:checked {
+      accent-color: vv.$primary;
+    }
   }
 }
 
index 57c9e4862d01ea97c80f668ce43a3b7bcb0f24a0..c6c9369acfc637dd0c3bdb7235704ec220602acf 100644 (file)
@@ -70,6 +70,8 @@ export class TableComponent implements AfterContentChecked, OnInit, OnChanges, O
   timeAgoTpl: TemplateRef<any>;
   @ViewChild('rowDetailsTpl', { static: true })
   rowDetailsTpl: TemplateRef<any>;
+  @ViewChild('rowSelectionTpl', { static: true })
+  rowSelectionTpl: TemplateRef<any>;
 
   // This is the array with the items to be shown.
   @Input()
@@ -428,9 +430,10 @@ export class TableComponent implements AfterContentChecked, OnInit, OnChanges, O
         resizeable: false,
         sortable: false,
         draggable: false,
-        checkboxable: true,
+        checkboxable: false,
         canAutoResize: false,
         cellClass: 'cd-datatable-checkbox',
+        cellTemplate: this.rowSelectionTpl,
         width: 30
       });
     }
index 27547c36b04351e89e89441b7b03988237d7bc62..c2f1cf2992e15048ffced6ec5ff4ae80604cedc8 100644 (file)
@@ -43,13 +43,14 @@ $light-green-300: #ace12e;
 
 // Extra theme colors.
 $accent: $red !default;
+$accent-wcag-aa-regular-text: #25828e !default;
 $warning-dark: $orange !default;
 
 $fg-color-over-dark-bg: $white !default;
 $fg-hover-color-over-dark-bg: $gray-500 !default;
 
 $theme-colors: (
-  'accent': $accent,
+  'accent': $accent-wcag-aa-regular-text,
   'warning-dark': $warning-dark
 ) !default;