LP1828468 Keyboard navigation for main navbar
authorStephanie Leary <stephanie.leary@equinoxOLI.org>
Tue, 4 Oct 2022 20:37:23 +0000 (15:37 -0500)
committerStephanie Leary <stephanie.leary@equinoxOLI.org>
Tue, 4 Oct 2022 20:37:23 +0000 (15:37 -0500)
In the main navbar, all items except the home icon are unreachable using
only a keyboard. This includes the logout/change operator menu on the
far right.

This is caused by the lack of an href attribute on the <a> tags, which
prevents the link from having a focus state.

This patch adds tabindex="0" to the parent menu items and the submenu
items that use (click) or routerLink. Submenu items are also given the
ngbDropdownItem directive, which allows up/down arrow navigation within
submenus.

The patch does not include CSS to make the focus state prettier; a
separate patch for style is forthcoming.

Related: Bug #1814978

Open-ILS/src/eg2/src/app/staff/nav.component.html

index ab959ca..a850ec3 100644 (file)
 
     <div class="navbar-nav">
       <div ngbDropdown class="nav-item dropdown">
-        <a ngbDropdownToggle i18n class="nav-link dropdown-toggle">
+        <a ngbDropdownToggle i18n class="nav-link dropdown-toggle" tabindex="0">
          Search
         </a>
         <div class="dropdown-menu" ngbDropdownMenu>
-          <a class="dropdown-item" href="/eg/staff/circ/patron/search"
+          <a class="dropdown-item" ngbDropdownItem href="/eg/staff/circ/patron/search"
             egAccessKey keyCtx="navbar" i18n-keySpec i18n-keyDesc
             keySpec="alt+s f4" keyDesc="Patron Search">
             <span class="material-icons" aria-hidden="true">person</span>
             <span i18n>Search for Patrons</span>
           </a>
-          <a class="dropdown-item" href="/eg/staff/cat/item/search">
+          <a class="dropdown-item" ngbDropdownItem href="/eg/staff/cat/item/search">
             <span class="material-icons" aria-hidden="true">assignment</span>
             <span i18n>Search for Items by Barcode</span>
           </a>
-          <a class="dropdown-item" routerLink="/staff/catalog"
+          <a class="dropdown-item" ngbDropdownItem routerLink="/staff/catalog"
             egAccessKey keyCtx="navbar" i18n-keySpec i18n-keyDesc
             keySpec="f3" keyDesc="Catalog">
             <span class="material-icons" aria-hidden="true">search</span>
 
     <div class="navbar-nav">
       <div ngbDropdown class="nav-item dropdown">
-        <a ngbDropdownToggle class="nav-link dropdown-toggle">
+        <a ngbDropdownToggle class="nav-link dropdown-toggle" tabindex="0">
          <span i18n>Circulation</span>
         </a>
         <div class="dropdown-menu" ngbDropdownMenu>
-          <a class="dropdown-item" href="/eg/staff/circ/patron/bcsearch"
+          <a class="dropdown-item" ngbDropdownItem href="/eg/staff/circ/patron/bcsearch"
             egAccessKey keyCtx="navbar" i18n-keySpec i18n-keyDesc
             keySpec="f1" keyDesc="Checkout">
             <span class="material-icons" aria-hidden="true">trending_up</span>
             <span i18n>Check Out</span>
           </a>
-          <a class="dropdown-item" href="/eg/staff/circ/checkin/checkin"
+          <a class="dropdown-item" ngbDropdownItem href="/eg/staff/circ/checkin/checkin"
             egAccessKey keyCtx="navbar" i18n-keySpec i18n-keyDesc
             keySpec="f2" keyDesc="Checkin">
             <span class="material-icons" aria-hidden="true">trending_down</span>
             <span i18n>Check In</span>
           </a>
-          <a class="dropdown-item" href="/eg/staff/circ/checkin/capture"
+          <a class="dropdown-item" ngbDropdownItem href="/eg/staff/circ/checkin/capture"
             egAccessKey keyCtx="navbar" i18n-keySpec i18n-keyDesc
             keySpec="shift+f2" keyDesc="Capture Holds">
             <span class="material-icons" aria-hidden="true">pin_drop</span>
             <span i18n>Capture Holds</span>
           </a>
-          <a class="dropdown-item" routerLink="/staff/circ/holds/pull-list">
+          <a class="dropdown-item" ngbDropdownItem routerLink="/staff/circ/holds/pull-list">
             <span class="material-icons" aria-hidden="true">view_list</span>
             <span i18n>Pull List for Hold Requests</span>
           </a>
-          <a class="dropdown-item" href="/eg/staff/circ/renew/renew"
+          <a class="dropdown-item" ngbDropdownItem href="/eg/staff/circ/renew/renew"
             egAccessKey keyCtx="navbar" i18n-keySpec i18n-keyDesc
             keySpec="ctrl+f2" keyDesc="Renew Items">
             <span class="material-icons" aria-hidden="true">autorenew</span>
             <span i18n>Renew Items</span>
           </a>
-          <a class="dropdown-item" href="/eg/staff/circ/patron/register"
+          <a class="dropdown-item" ngbDropdownItem href="/eg/staff/circ/patron/register"
             egAccessKey keyCtx="navbar" i18n-keySpec i18n-keyDesc
             keySpec="shift+f1" keyDesc="Register Patron">
             <span class="material-icons" aria-hidden="true">person_add</span>
             <span i18n>Register Patron</span>
           </a>
-          <a class="dropdown-item" href="/eg/staff/circ/patron/last"
+          <a class="dropdown-item" ngbDropdownItem href="/eg/staff/circ/patron/last"
             egAccessKey keyCtx="navbar" i18n-keySpec i18n-keyDesc
             keySpec="f8" keyDesc="Retrieve Last Patron">
             <span class="material-icons" aria-hidden="true">redo</span>
             <span i18n>Retrieve Last Patron</span>
           </a>
-          <a class="dropdown-item" href="/eg/staff/circ/patron/search?show_recent=1">
+          <a class="dropdown-item" ngbDropdownItem href="/eg/staff/circ/patron/search?show_recent=1">
             <span class="material-icons" aria-hidden="true">redo</span>
             <span i18n>Retrieve Recent Patrons</span>
           </a>
-          <a class="dropdown-item" href="/eg/staff/circ/patron/pending/list">
+          <a class="dropdown-item" ngbDropdownItem href="/eg/staff/circ/patron/pending/list">
             <span class="material-icons" aria-hidden="true">thumb_up</span>
             <span i18n>Pending Patrons</span>
           </a>
-          <a class="dropdown-item" href="/eg/staff/circ/patron/bucket/view">
+          <a class="dropdown-item" ngbDropdownItem href="/eg/staff/circ/patron/bucket/view">
             <span class="material-icons" aria-hidden="true">list</span>
             <span i18n>User Buckets</span>
           </a>
-          <a class="dropdown-item" href="/eg/staff/cat/bucket/batch_hold/list">
+          <a class="dropdown-item" ngbDropdownItem href="/eg/staff/cat/bucket/batch_hold/list">
             <span class="material-icons" aria-hidden="true">list</span>
             <span i18n>Hold Groups</span>
           </a>
           <div class="dropdown-divider"></div>
-          <a class="dropdown-item" href="/eg/staff/circ/patron/credentials">
+          <a class="dropdown-item" ngbDropdownItem href="/eg/staff/circ/patron/credentials">
             <span class="material-icons" aria-hidden="true">check_circle</span>
             <span i18n>Verify Credentials</span>
           </a>
-          <a class="dropdown-item" href="/eg/staff/circ/in_house_use/index"
+          <a class="dropdown-item" ngbDropdownItem href="/eg/staff/circ/in_house_use/index"
             egAccessKey keyCtx="navbar" i18n-keySpec i18n-keyDesc
             keySpec="f6" keyDesc="Record In-House Use">
             <span class="material-icons" aria-hidden="true">playlist_add</span>
             <span i18n>Record In-House Use</span>
           </a>
-          <a class="dropdown-item" href="/eg/staff/circ/holds/shelf">
+          <a class="dropdown-item" ngbDropdownItem href="/eg/staff/circ/holds/shelf">
             <span class="material-icons" aria-hidden="true">format_list_bulleted</span>
             <span i18n>Holds Shelf</span>
           </a>
           <div class="dropdown-divider"></div>
-          <a class="dropdown-item" href="/eg/staff/cat/item/replace_barcode/index">
+          <a class="dropdown-item" ngbDropdownItem href="/eg/staff/cat/item/replace_barcode/index">
             <span class="material-icons" aria-hidden="true">library_books</span>
             <span i18n>Replace Barcode</span>
           </a>
-          <a class="dropdown-item" href="/eg/staff/cat/item/search"
+          <a class="dropdown-item" ngbDropdownItem href="/eg/staff/cat/item/search"
             egAccessKey keyCtx="navbar" i18n-keySpec i18n-keyDesc
             keySpec="f5" keyDesc="Navigate To Item Status">
             <span class="material-icons" aria-hidden="true">question_answer</span>
             <span i18n>Item Status</span>
           </a>
-          <a class="dropdown-item" routerLink="/staff/cat/item/missing_pieces">
+          <a class="dropdown-item" ngbDropdownItem routerLink="/staff/cat/item/missing_pieces">
             <span class="material-icons" aria-hidden="true">grid_on</span>
             <span i18n>Scan Item as Missing Pieces</span>
           </a>
           <div class="dropdown-divider"></div>
-          <a class="dropdown-item" (click)="reprintLast()"
+          <a class="dropdown-item" ngbDropdownItem tabindex="0" (click)="reprintLast()"
             egAccessKey keyCtx="navbar" i18n-keySpec i18n-keyDesc
             keySpec="f9" keyDesc="Reprint Last Receipt">
             <span class="material-icons" aria-hidden="true">redo</span>
             <span i18n>Reprint Last Receipt</span>
           </a>
           <div class="dropdown-divider"></div>
-          <a class="dropdown-item" href="/eg/staff/offline-interface">
+          <a class="dropdown-item" ngbDropdownItem href="/eg/staff/offline-interface">
             <span class="material-icons" aria-hidden="true">signal_wifi_off</span>
             <span i18n>Offline Circulation</span>
           </a>
           <div *ngIf="curbsideEnabled" class="dropdown-divider"></div>
-          <a *ngIf="curbsideEnabled" class="dropdown-item" href="/eg/staff/circ/curbside/index">
+          <a *ngIf="curbsideEnabled" ngbDropdownItem class="dropdown-item" href="/eg/staff/circ/curbside/index">
             <span class="material-icons">directions_bus</span>
             <span i18n>Curbside Pickup</span>
           </a>
     
     <div class="navbar-nav">
       <div ngbDropdown class="nav-item dropdown">
-        <a ngbDropdownToggle i18n class="nav-link dropdown-toggle">
+        <a ngbDropdownToggle i18n class="nav-link dropdown-toggle" tabindex="0">
          Cataloging
         </a>
         <div class="dropdown-menu" ngbDropdownMenu>
 
-          <a class="dropdown-item" routerLink="/staff/catalog/search"
+          <a class="dropdown-item" ngbDropdownItem routerLink="/staff/catalog/search"
             egAccessKey keyCtx="navbar"i18n-keySpec i18n-keyDesc
             keySpec="f3" keyDesc="Catalog">
             <span class="material-icons" aria-hidden="true">search</span>
             <span i18n>Search the Catalog</span>
           </a>
-          <a *ngIf="showTraditionalCatalog" href="/eg/staff/cat/catalog/index" class="dropdown-item">
+          <a *ngIf="showTraditionalCatalog" ngbDropdownItem href="/eg/staff/cat/catalog/index" class="dropdown-item">
             <span class="material-icons" aria-hidden="true">search</span>
             <span i18n>Search the Catalog (Traditional)</span>
           </a>
-          <a class="dropdown-item" href="/eg/staff/cat/item/search"
+          <a class="dropdown-item" ngbDropdownItem href="/eg/staff/cat/item/search"
             egAccessKey keyCtx="navbar" i18n-keySpec i18n-keyDesc
             keySpec="f5" keyDesc="Navigate To Item Status">
             <span class="material-icons" aria-hidden="true">question_answer</span>
             <span i18n>Item Status</span>
           </a>
           <div class="dropdown-divider"></div>
-          <a href="/eg/staff/cat/bucket/record/view" class="dropdown-item">
+          <a href="/eg/staff/cat/bucket/record/view" class="dropdown-item" ngbDropdownItem>
             <span class="material-icons" aria-hidden="true">list</span>
             <span i18n>Record Buckets</span>
           </a>
-          <a href="/eg/staff/cat/bucket/copy/view" class="dropdown-item">
+          <a href="/eg/staff/cat/bucket/copy/view" class="dropdown-item" ngbDropdownItem>
             <span class="material-icons" aria-hidden="true">list</span>
             <span i18n>Item Buckets</span>
           </a>
           <div class="dropdown-divider"></div>
-          <a routerLink="/staff/cat/bib-from/id" class="dropdown-item">
+          <a routerLink="/staff/cat/bib-from/id" class="dropdown-item" ngbDropdownItem>
             <span class="material-icons" aria-hidden="true">collections</span>
             <span i18n>Retrieve Bib Record by ID</span>
           </a>
-          <a routerLink="/staff/cat/bib-from/tcn" class="dropdown-item"
+          <a routerLink="/staff/cat/bib-from/tcn" class="dropdown-item" ngbDropdownItem
             egAccessKey keyCtx="navbar" i18n-keySpec i18n-keyDesc
             keySpec="shift+f3" keyDesc="Retrieve Bib Record by TCN">
             <span class="material-icons" aria-hidden="true">collections_bookmark</span>
             <span i18n>Retrieve Bib Record by TCN</span>
           </a>
-          <a (click)="retrieveLastRecord()"
+          <a (click)="retrieveLastRecord()" ngbDropdownItem tabindex="0"
             egAccessKey keyCtx="navbar" i18n-keySpec i18n-keyDesc
             keySpec="shift+f8" keyDesc="Retrieve Last Bib Record">
             <span class="material-icons" aria-hidden="true">redo</span>
             <span i18n>Retrieve Last Bib Record</span>
           </a>
           <div class="dropdown-divider"></div>
-          <a href="/eg/staff/cat/catalog/new_bib" class="dropdown-item">
+          <a href="/eg/staff/cat/catalog/new_bib" class="dropdown-item" ngbDropdownItem>
             <span class="material-icons" aria-hidden="true">add</span>
             <span i18n>Create New MARC Record</span>
           </a>
-          <a href="/eg/staff/cat/z3950/index" class="dropdown-item">
+          <a href="/eg/staff/cat/z3950/index" class="dropdown-item" ngbDropdownItem>
             <span class="material-icons" aria-hidden="true">cloud_download</span>
             <span i18n>Import Record from Z39.50</span>
           </a>
-          <a routerLink="/staff/cat/vandelay/import" class="dropdown-item">
+          <a routerLink="/staff/cat/vandelay/import" class="dropdown-item" ngbDropdownItem>
             <span class="material-icons" aria-hidden="true">import_export</span>
             <span i18n>MARC Batch Import/Export</span>
           </a>
-          <a routerLink="/staff/cat/marcbatch" class="dropdown-item">
+          <a routerLink="/staff/cat/marcbatch" class="dropdown-item" ngbDropdownItem>
             <span class="material-icons" aria-hidden="true">format_paint</span>
             <span i18n>MARC Batch Edit</span>
           </a>
           <div class="dropdown-divider"></div>
-          <a href="/eg/staff/cat/catalog/verifyURLs" class="dropdown-item">
+          <a href="/eg/staff/cat/catalog/verifyURLs" class="dropdown-item" ngbDropdownItem>
             <span class="material-icons" aria-hidden="true">link</span>
             <span i18n>Link Checker</span>
           </a>
           <div class="dropdown-divider"></div>
-          <a routerLink="/staff/cat/authority/browse" class="dropdown-item">
+          <a routerLink="/staff/cat/authority/browse" class="dropdown-item" ngbDropdownItem>
             <span class="material-icons" aria-hidden="true">lock</span>
             <span i18n>Manage Authorities</span>
           </a>
-          <a routerLink="/staff/cat/authority/edit" class="dropdown-item">
+          <a routerLink="/staff/cat/authority/edit" class="dropdown-item" ngbDropdownItem>
             <span class="material-icons" aria-hidden="true">collections</span>
             <span i18n>Retrieve Authority Record by ID</span>
           </a>
 
     <div class="navbar-nav">
       <div ngbDropdown class="nav-item dropdown">
-        <a ngbDropdownToggle i18n class="nav-link dropdown-toggle">
+        <a ngbDropdownToggle i18n class="nav-link dropdown-toggle" tabindex="0">
           Acquisitions
         </a>
         <div class="dropdown-menu" ngbDropdownMenu>
-          <a class="dropdown-item" 
+          <a class="dropdown-item" ngbDropdownItem 
             routerLink="/staff/acq/search">
             <span class="material-icons" aria-hidden="true">search</span>
             <span i18n>General Search</span>
           </a>
           <div class="dropdown-divider"></div>
-          <a class="dropdown-item" 
+          <a class="dropdown-item" ngbDropdownItem
             routerLink="/staff/acq/provider">
             <span class="material-icons" aria-hidden="true">search</span>
             <span i18n>Provider Search</span>
           </a>
           <div class="dropdown-divider"></div>
-          <a class="dropdown-item"
+          <a class="dropdown-item" ngbDropdownItem
             routerLink="/staff/acq/search/selectionlists">
             <span class="material-icons" aria-hidden="true">view_list</span>
             <span i18n>Selection Lists</span>
           </a>
-          <a class="dropdown-item" 
+          <a class="dropdown-item" ngbDropdownItem
             href="/eg/staff/acq/legacy/picklist/brief_record">
             <span class="material-icons" aria-hidden="true">edit</span>
             <span i18n>New Brief Record</span>
           </a>
-          <a class="dropdown-item" 
+          <a class="dropdown-item" ngbDropdownItem
             href="/eg/staff/acq/legacy/picklist/user_request">
             <span class="material-icons" aria-hidden="true">thumb_up</span>
             <span i18n>Patron Requests</span>
           </a>
-          <a class="dropdown-item" 
+          <a class="dropdown-item" ngbDropdownItem
             href="/eg/staff/acq/legacy/picklist/bib_search">
             <span class="material-icons" aria-hidden="true">cloud_download</span>
             <span i18n>MARC Federated Search</span>
           </a>
-          <a class="dropdown-item" 
+          <a class="dropdown-item" ngbDropdownItem
             href="/eg/staff/acq/legacy/picklist/from_bib">
             <span class="material-icons" aria-hidden="true">trending_down</span>
             <span i18n>Load Catalog Record IDs</span>
           </a>
           <div class="dropdown-divider"></div>
-          <a class="dropdown-item" 
+          <a class="dropdown-item" ngbDropdownItem
           routerLink="/staff/acq/picklist/upload">
           <span class="material-icons" aria-hidden="true">cloud_upload</span>
           <span i18n>Load MARC Order Records</span>
         </a>
-          <a class="dropdown-item"
+          <a class="dropdown-item" ngbDropdownItem
             routerLink="/staff/acq/search/purchaseorders">
             <span class="material-icons" aria-hidden="true">shopping_cart</span>
             <span i18n>Purchase Orders</span>
           </a>
-          <a class="dropdown-item" routerLink="/staff/acq/po/create">
+          <a class="dropdown-item" ngbDropdownItem routerLink="/staff/acq/po/create">
             <span class="material-icons" aria-hidden="true">add_shopping_cart</span>
             <span i18n>Create Purchase Order</span>
           </a>
           <div class="dropdown-divider"></div>
-          <a class="dropdown-item" 
+          <a class="dropdown-item" ngbDropdownItem
             href="/eg/staff/acq/legacy/financial/claim_eligible">
             <span class="material-icons" aria-hidden="true">contact_phone</span>
             <span i18n>Claim-Ready Items</span>
           </a>
-          <a class="dropdown-item"
+          <a class="dropdown-item" ngbDropdownItem
             routerLink="/staff/acq/search/invoices">
             <span class="material-icons" aria-hidden="true">attach_money</span>
             <span i18n>Invoices</span>
           </a>
-          <a class="dropdown-item" 
+          <a class="dropdown-item" ngbDropdownItem
             href="/eg/staff/acq/legacy/invoice/view?create=1">
             <span class="material-icons" aria-hidden="true">monetization_on</span>
             <span i18n>Create Invoice</span>
 
     <div class="navbar-nav">
       <div ngbDropdown class="nav-item dropdown">
-        <a ngbDropdownToggle i18n class="nav-link dropdown-toggle">
+        <a ngbDropdownToggle i18n class="nav-link dropdown-toggle" tabindex="0">
           Booking
         </a>
         <div class="dropdown-menu" ngbDropdownMenu>
-          <a class="dropdown-item" routerLink="/staff/booking/create_reservation">
+          <a class="dropdown-item" ngbDropdownItem routerLink="/staff/booking/create_reservation">
             <span class="material-icons" aria-hidden="true">add</span>
             <span i18n>Create Reservations</span>
           </a>
-          <a class="dropdown-item" routerLink="/staff/booking/pull_list">
+          <a class="dropdown-item" ngbDropdownItem routerLink="/staff/booking/pull_list">
             <span class="material-icons" aria-hidden="true">list</span>
             <span i18n>Pull List</span>
           </a>
-          <a class="dropdown-item" routerLink="/staff/booking/capture">
+          <a class="dropdown-item" ngbDropdownItem routerLink="/staff/booking/capture">
             <span class="material-icons" aria-hidden="true">pin_drop</span>
             <span i18n>Capture Resources</span>
           </a>
-          <a class="dropdown-item" routerLink="/staff/booking/pickup">
+          <a class="dropdown-item" ngbDropdownItem routerLink="/staff/booking/pickup">
             <span class="material-icons" aria-hidden="true">trending_up</span>
             <span i18n>Pick Up Reservations</span>
           </a>
-          <a class="dropdown-item" routerLink="/staff/booking/return">
+          <a class="dropdown-item" ngbDropdownItem routerLink="/staff/booking/return">
             <span class="material-icons" aria-hidden="true">trending_down</span>
             <span i18n>Return Reservations</span>
           </a>
-          <a class="dropdown-item" routerLink="/staff/booking/manage_reservations">
+          <a class="dropdown-item" ngbDropdownItem routerLink="/staff/booking/manage_reservations">
             <span class="material-icons" aria-hidden="true">layers</span>
             <span i18n>Manage Reservations</span>
           </a>
 
     <div class="navbar-nav">
       <div ngbDropdown class="nav-item dropdown">
-        <a ngbDropdownToggle i18n class="nav-link dropdown-toggle">
+        <a ngbDropdownToggle i18n class="nav-link dropdown-toggle" tabindex="0">
           Administration
         </a>
         <div class="dropdown-menu" ngbDropdownMenu>
-          <a class="dropdown-item" href="/eg/staff/admin/workstation/index">
+          <a class="dropdown-item" ngbDropdownItem href="/eg/staff/admin/workstation/index">
             <span class="material-icons" aria-hidden="true">computer</span>
             <span i18n>Workstation</span>
           </a>
             <span i18n>Registered Workstations</span>
           </a>
           -->
-          <a class="dropdown-item" href="/eg/staff/admin/user_perms">
+          <a class="dropdown-item" ngbDropdownItem href="/eg/staff/admin/user_perms">
             <span class="material-icons" aria-hidden="true">person</span>
             <span i18n>User Permission Editor</span>
           </a>
-          <a class="dropdown-item"
+          <a class="dropdown-item" ngbDropdownItem
               routerLink="/staff/admin/server/splash">
             <span class="material-icons" aria-hidden="true">account_balance</span>
             <span i18n>Server Administration</span>
           </a>
-          <a class="dropdown-item" routerLink="/staff/admin/local/splash">
+          <a class="dropdown-item" ngbDropdownItem routerLink="/staff/admin/local/splash">
             <span class="material-icons" aria-hidden="true">landscape</span>
             <span i18n>Local Administration</span>
           </a>
-          <a class="dropdown-item"
+          <a class="dropdown-item" ngbDropdownItem
               routerLink="/staff/admin/acq/splash">
             <span class="material-icons" aria-hidden="true">attach_money</span>
             <span i18n>Acquisitions Administration</span>
           </a>
-          <a class="dropdown-item" href="/eg/staff/admin/serials/index">
+          <a class="dropdown-item" ngbDropdownItem href="/eg/staff/admin/serials/index">
             <span class="material-icons" aria-hidden="true">layers</span>
             <span i18n>Serials Administration</span>
           </a>
-          <a class="dropdown-item"
+          <a class="dropdown-item" ngbDropdownItem
               routerLink="/staff/admin/booking/splash">
             <span class="material-icons" aria-hidden="true">business_center</span>
             <span i18n>Booking Administration</span>
           </a>
-          <a class="dropdown-item" href="/eg/staff/reporter/legacy/main">
+          <a class="dropdown-item" ngbDropdownItem href="/eg/staff/reporter/legacy/main">
             <span class="material-icons" aria-hidden="true">insert_chart</span>
             <span i18n>Reports</span>
           </a>
-          <a class="dropdown-item" routerLink="/staff/reporter/simple">
+          <a class="dropdown-item" ngbDropdownItem routerLink="/staff/reporter/simple">
             <span class="material-icons" aria-hidden="true">insert_chart</span>
             <span i18n>Simple Reports</span>
           </a>
       <div ngbDropdown class="nav-item dropdown" placement="bottom-right">
         <a ngbDropdownToggle i18n i18n-title
           title="Select Locale"
-          class="nav-link dropdown-toggle no-caret with-material-icon">
+          class="nav-link dropdown-toggle no-caret with-material-icon" tabindex="0">
           <i class="material-icons" aria-hidden="true">flag</i>
           <span>{{currentLocale.name()}}</span>
         </a>
         <div class="dropdown-menu" ngbDropdownMenu>
-          <a class="dropdown-item" (click)="setLocale(locale)" 
+          <a class="dropdown-item" ngbDropdownItem tabindex="0" (click)="setLocale(locale)" 
             [ngClass]="{disabled: currentLocale.code() === locale.code()}"
             *ngFor="let locale of locales">
             <span class="material-icons" aria-hidden="true">add_location</span>
     </div>
     <div class="navbar-nav" *ngIf="user()">
       <div ngbDropdown class="nav-item dropdown" placement="bottom-right">
-        <a ngbDropdownToggle i18n 
+        <a ngbDropdownToggle i18n tabindex="0"
           i18n-title
           title="Log out and more..."
           class="nav-link dropdown-toggle no-caret with-material-icon">
             failMessage="Operator Change Failed"
             successMessage="Operator Change Succeeded">
           </eg-op-change>
-          <a class="dropdown-item" *ngIf="!opChangeActive()" 
+          <a class="dropdown-item" ngbDropdownItem tabindex="0" *ngIf="!opChangeActive()" 
             (click)="navOpChange.open()">
             <span class="material-icons" aria-hidden="true">transform</span>
             <span i18n>Change Operator</span>
           </a>
-          <a *ngIf="opChangeActive()" class="dropdown-item" 
+          <a class="dropdown-item" ngbDropdownItem tabindex="0" *ngIf="opChangeActive()"
             (click)="navOpChange.restore()">
             <span class="material-icons" aria-hidden="true">transform</span>
             <span i18n>Restore Operator</span>
           </a>
-          <a class="dropdown-item" (click)="logout()">
+          <a class="dropdown-item" ngbDropdownItem tabindex="0" (click)="logout()">
             <span class="material-icons" aria-hidden="true">lock_outline</span>
             <span i18n>Logout</span>
           </a>
-          <a class="dropdown-item" routerLink="/staff/about">
+          <a class="dropdown-item" ngbDropdownItem routerLink="/staff/about">
             <span class="material-icons" aria-hidden="true">info_outline</span>
             <span i18n>About</span>
           </a>