From 2633518a130e02aadc47f4ef3c900ee1e7a577af Mon Sep 17 00:00:00 2001 From: Artur Pata Date: Thu, 30 Jan 2025 19:47:05 +0200 Subject: [PATCH] Close calendar on keyboard nav to othe menus as well --- .../query-periods/comparison-period-menu.tsx | 26 +++++++++------- .../query-periods/query-period-menu.tsx | 30 +++++++++++++------ .../query-periods/query-periods-picker.tsx | 26 +++++++--------- .../query-periods/shared-menu-items.tsx | 25 +++++++++++++++- 4 files changed, 70 insertions(+), 37 deletions(-) diff --git a/assets/js/dashboard/nav-menu/query-periods/comparison-period-menu.tsx b/assets/js/dashboard/nav-menu/query-periods/comparison-period-menu.tsx index e9c5c856a24d..d089dee000b3 100644 --- a/assets/js/dashboard/nav-menu/query-periods/comparison-period-menu.tsx +++ b/assets/js/dashboard/nav-menu/query-periods/comparison-period-menu.tsx @@ -1,6 +1,6 @@ /** @format */ -import React, { useEffect, useRef } from 'react' +import React, { useRef } from 'react' import { clearedComparisonSearch } from '../../query' import classNames from 'classnames' import { useQueryContext } from '../../query-context' @@ -20,22 +20,26 @@ import { popover } from '../../components/popover' import { datemenuButtonClassName, DateMenuChevron, + DropdownItemsProps, linkClassName, - MenuSeparator + MenuSeparator, + useCloseCalendarOnDropdownOpen } from './shared-menu-items' export const ComparisonPeriodMenuItems = ({ + dropdownIsOpen, closeDropdown, - toggleCalendar -}: { - closeDropdown: () => void - toggleCalendar: () => void -}) => { + openCalendar, + closeCalendar, + calendarIsOpen +}: DropdownItemsProps) => { const { query } = useQueryContext() - useEffect(() => { - closeDropdown() - }, [closeDropdown, query]) + useCloseCalendarOnDropdownOpen({ + dropdownIsOpen, + calendarIsOpen, + closeCalendar + }) if (!isComparisonEnabled(query.comparison)) { return null @@ -79,7 +83,7 @@ export const ComparisonPeriodMenuItems = ({ // custom handler is needed to prevent // the calendar from immediately closing // due to Menu.Button grabbing focus - toggleCalendar() + openCalendar() closeDropdown() }} > diff --git a/assets/js/dashboard/nav-menu/query-periods/query-period-menu.tsx b/assets/js/dashboard/nav-menu/query-periods/query-period-menu.tsx index 8482f3204be7..e664378ced64 100644 --- a/assets/js/dashboard/nav-menu/query-periods/query-period-menu.tsx +++ b/assets/js/dashboard/nav-menu/query-periods/query-period-menu.tsx @@ -31,8 +31,10 @@ import { popover } from '../../components/popover' import { datemenuButtonClassName, DateMenuChevron, + DropdownItemsProps, linkClassName, - MenuSeparator + MenuSeparator, + useCloseCalendarOnDropdownOpen } from './shared-menu-items' function QueryPeriodMenuItems({ groups }: { groups: LinkItem[][] }) { @@ -139,14 +141,20 @@ export const QueryPeriodMenuButton = () => { export const QueryPeriodMenu = ({ closeDropdown, - toggleCalendar -}: { - closeDropdown: () => void - toggleCalendar: () => void -}) => { + openCalendar, + closeCalendar, + dropdownIsOpen, + calendarIsOpen +}: DropdownItemsProps) => { const site = useSiteContext() const { query } = useQueryContext() + useCloseCalendarOnDropdownOpen({ + dropdownIsOpen, + calendarIsOpen, + closeCalendar + }) + const groups = useMemo(() => { const compareLink = getCompareLinkItem({ site, query }) return getDatePeriodGroups({ @@ -159,8 +167,12 @@ export const QueryPeriodMenu = ({ search: (s) => s, isActive: ({ query }) => query.period === QueryPeriod.custom, onEvent: () => { - toggleCalendar() - closeDropdown() + if (calendarIsOpen) { + closeCalendar() + } else { + openCalendar() + closeDropdown() + } } } ] @@ -169,7 +181,7 @@ export const QueryPeriodMenu = ({ ? [] : [[compareLink]] }) - }, [site, query, toggleCalendar, closeDropdown]) + }, [site, query, calendarIsOpen, closeCalendar, openCalendar, closeDropdown]) return ( <> diff --git a/assets/js/dashboard/nav-menu/query-periods/query-periods-picker.tsx b/assets/js/dashboard/nav-menu/query-periods/query-periods-picker.tsx index 4c4f2e4f817e..fb3070fe1752 100644 --- a/assets/js/dashboard/nav-menu/query-periods/query-periods-picker.tsx +++ b/assets/js/dashboard/nav-menu/query-periods/query-periods-picker.tsx @@ -58,18 +58,15 @@ export function QueryPeriodsPicker({ className }: { className?: string }) {
- {({ close }) => ( + {({ close, open }) => ( <> { - if (calendar === 'main') { - setCalendar(null) - } else { - setCalendar('main') - } - }} + openCalendar={() => setCalendar('main')} + closeCalendar={() => setCalendar(null)} /> )} @@ -103,18 +100,15 @@ export function QueryPeriodsPicker({ className }: { className?: string }) { vs.
- {({ close }) => ( + {({ close, open }) => ( <> { - if (calendar === 'compare') { - setCalendar(null) - } else { - setCalendar('compare') - } - }} + openCalendar={() => setCalendar('compare')} + closeCalendar={() => setCalendar(null)} /> )} diff --git a/assets/js/dashboard/nav-menu/query-periods/shared-menu-items.tsx b/assets/js/dashboard/nav-menu/query-periods/shared-menu-items.tsx index 53521ce127ce..a08e3c440d35 100644 --- a/assets/js/dashboard/nav-menu/query-periods/shared-menu-items.tsx +++ b/assets/js/dashboard/nav-menu/query-periods/shared-menu-items.tsx @@ -1,6 +1,6 @@ /** @format */ -import React from 'react' +import React, { useEffect } from 'react' import classNames from 'classnames' import { popover } from '../../components/popover' import { ChevronDownIcon } from '@heroicons/react/20/solid' @@ -25,3 +25,26 @@ export const DateMenuChevron = () => ( export const MenuSeparator = () => (
) + +export interface DropdownItemsProps { + dropdownIsOpen: boolean + calendarIsOpen: boolean + closeDropdown: () => void + openCalendar: () => void + closeCalendar: () => void +} + +export const useCloseCalendarOnDropdownOpen = ({ + dropdownIsOpen, + calendarIsOpen, + closeCalendar +}: Pick< + DropdownItemsProps, + 'dropdownIsOpen' | 'calendarIsOpen' | 'closeCalendar' +>) => { + useEffect(() => { + if (dropdownIsOpen && calendarIsOpen) { + closeCalendar() + } + }, [dropdownIsOpen, calendarIsOpen, closeCalendar]) +}