diff --git a/src/components/DatePicker/DatePickers/DatePicker.js b/src/components/DatePicker/DatePickers/DatePicker.js index 93fd149c2e..efe08b7231 100644 --- a/src/components/DatePicker/DatePickers/DatePicker.js +++ b/src/components/DatePicker/DatePickers/DatePicker.js @@ -242,6 +242,7 @@ const CalendarMonth = props => { aria-label={ariaLabel} className={classes} data-date={isoDateString} + data-current={isCurrent && !isDisabled ? 'true' : undefined} key={cellKey} onClick={onClick} onMouseEnter={onMouseEnter} @@ -467,30 +468,39 @@ const DatePicker = props => { if (event.key === 'ArrowLeft') { event.preventDefault(); + event.stopPropagation(); updateCurrentDate(getPreviousDay(currentDate)); } else if (event.key === 'ArrowRight') { event.preventDefault(); + event.stopPropagation(); updateCurrentDate(getNextDay(currentDate)); } else if (event.key === 'ArrowUp') { event.preventDefault(); + event.stopPropagation(); updateCurrentDate(subDays(currentDate, 7)); } else if (event.key === 'ArrowDown') { event.preventDefault(); + event.stopPropagation(); updateCurrentDate(addDays(currentDate, 7)); } else if (event.key === 'PageUp') { event.preventDefault(); + event.stopPropagation(); updateCurrentDate(getPreviousMonth(currentDate)); } else if (event.key === 'PageDown') { event.preventDefault(); + event.stopPropagation(); updateCurrentDate(getNextMonth(currentDate)); } else if (event.key === 'Home') { event.preventDefault(); + event.stopPropagation(); updateCurrentDate(getFirstOfMonth(currentDate)); } else if (event.key === 'End') { event.preventDefault(); + event.stopPropagation(); updateCurrentDate(getLastOfMonth(currentDate)); } else if (event.key === 'Space' || event.key === 'Enter') { event.preventDefault(); + event.stopPropagation(); onSelectDate(currentDate); } }; diff --git a/src/components/FieldSelectTree/FieldSelectTree.js b/src/components/FieldSelectTree/FieldSelectTree.js index 7fe36ca05c..9cf18387ae 100644 --- a/src/components/FieldSelectTree/FieldSelectTree.js +++ b/src/components/FieldSelectTree/FieldSelectTree.js @@ -1,4 +1,4 @@ -import React from 'react'; +import React, { useRef } from 'react'; import { Field } from 'react-final-form'; import { useIntl } from 'react-intl'; import classNames from 'classnames'; @@ -9,6 +9,102 @@ import { ValidationError } from '../../components'; import css from './FieldSelectTree.module.css'; const MIN_LENGTH_FOR_LONG_WORDS = 16; + +/** + * Collects all focusable option buttons in the tree in DFS order. + * + * @param {HTMLElement} container - The container element containing the option buttons + * @returns {Array} Array of focusable option buttons in order + */ +const getAllFocusableOptions = container => { + if (!container) return []; + const buttons = container.querySelectorAll('button'); + return Array.from(buttons).filter(button => { + // Filter out disabled buttons and buttons with negative tabIndex + return !button.disabled && button.tabIndex !== -1; + }); +}; + +/** + * Finds the parent