f9fa02315060e80003f55f78c770dea0830d128c lrnassar Tue Apr 7 15:33:47 2026 -0700 Make Recent Genomes and Connected Hubs cards keyboard-accessible on hgGateway. refs #37342 diff --git src/hg/js/hgGateway.js src/hg/js/hgGateway.js index 85240aa9215..ee2980cf0b6 100644 --- src/hg/js/hgGateway.js +++ src/hg/js/hgGateway.js @@ -1841,60 +1841,73 @@ // emptyMessage: message to show when no items // onCardClick: optional callback for card clicks (defaults to setDbFromAutocomplete) $panel.empty(); if (!items || items.length === 0) { if (emptyMessage) { $panel.html('
' + emptyMessage + '
'); } return; } var clickHandler = onCardClick || setDbFromAutocomplete; // Render each item as a card (vertical layout) items.forEach(function(item) { - var $card = $('
'); + var $card = $('
'); var label = item.label || item.shortLabel || item.value || item.genome || item.commonName; var genome = trackHubSkipHubName(item.genome || item.db || ''); + // Build aria-label from label and genome + var ariaLabel = label; + if (genome && label.indexOf(genome) < 0) { + ariaLabel = label + ' (' + genome + ')'; + } + $card.attr('aria-label', ariaLabel); + $card.append('
' + escapeHtml(label) + '
'); if (genome && label.indexOf(genome) < 0) { $card.append('
' + escapeHtml(genome) + '
'); } // Add category label: "External" for assembly hubs, "UCSC Curated" for everything else. // The indexOf check handles both the new "Assembly Hub" category from handleSetDb // and legacy localStorage entries from addHubsToList or older code. var shortCategory; var catForDisplay = item.originalCategory || item.category; if (catForDisplay && catForDisplay.indexOf('Assembly Hub') >= 0) { shortCategory = 'External'; } else { shortCategory = 'UCSC Curated'; } $card.append('
' + escapeHtml(shortCategory) + '
'); - // Store item data for click handler + // Store item data for click/keyboard handler $card.data('item', item); $card.on('click', function() { var clickedItem = $(this).data('item'); clickHandler(clickedItem); // Highlight selected card in this panel $panel.find('.recentGenomeCard').removeClass('selected'); $(this).addClass('selected'); }); + $card.on('keydown', function(e) { + if (e.key === 'Enter' || e.key === ' ') { + e.preventDefault(); + $(this).trigger('click'); + } + }); $panel.append($card); }); } function displayRecentGenomesInPanel() { // Display recent genomes in the panel on page load and after genome selection var recentGenomes = getRecentGenomes(); // Show the section (hidden by default in HTML) $('#recentGenomesTitle').show(); $('#recentGenomesSection').show(); var emptyMessage = 'Search for a genome above, or click a popular species icon'; renderGenomeCards(recentGenomes, $('#recentGenomesList'), emptyMessage); // Clear any selected state from connected hub cards (selection was transient, // the genome is now reflected in the recent genomes panel)