From 8fdeb07435d3d7562ec8bcf4f7d521444108ccb9 Mon Sep 17 00:00:00 2001 From: Artur Pata Date: Mon, 3 Feb 2025 20:54:29 +0200 Subject: [PATCH] Share adapter --- .../query-periods/comparison-period-menu.tsx | 56 +++++++++---------- .../query-periods/query-period-menu.tsx | 22 ++++---- .../query-periods/query-periods-picker.tsx | 16 ++---- .../query-periods/shared-menu-items.tsx | 26 ++++++++- 4 files changed, 63 insertions(+), 57 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 6c37b83b9919..a161c9de2811 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, { useCallback, useEffect, useRef, useState } from 'react' +import React from 'react' import { clearedComparisonSearch } from '../../query' import classNames from 'classnames' import { useQueryContext } from '../../query-context' @@ -26,36 +26,24 @@ import { DateMenuChevron, PopoverMenuProps, linkClassName, - MenuSeparator + MenuSeparator, + useDropdownWithCalendar, + DropdownWithCalendarState, + DropdownState, + calendarPositionClassName } from './shared-menu-items' import { DateRangeCalendar } from './date-range-calendar' import { formatISO, nowForSite } from '../../util/date' export const ComparisonPeriodMenuItems = ({ - dropdownIsOpen, - closeDropdown -}: PopoverMenuProps) => { + panelRef, + dropdownState, + closeDropdown, + toggleDropdown +}: Omit) => { const site = useSiteContext() const navigate = useAppNavigate() const { query } = useQueryContext() - const [calendarIsOpen, setCalendarIsOpen] = useState(false) - const closeCalendar = useCallback(() => setCalendarIsOpen(false), []) - const openCalendar = useCallback(() => setCalendarIsOpen(true), []) - - useEffect(() => { - if (!dropdownIsOpen) { - closeCalendar() - } - return closeCalendar - }, [dropdownIsOpen, closeCalendar]) - - const panelRef = useRef(null) - - useEffect(() => { - if (calendarIsOpen && panelRef.current?.focus) { - panelRef.current.focus() - } - }, [calendarIsOpen]) if (!isComparisonEnabled(query.comparison)) { return null @@ -67,18 +55,20 @@ export const ComparisonPeriodMenuItems = ({ className={classNames( 'mt-2', popover.transition.classNames.fullwidth, - calendarIsOpen ? 'md:left-auto' : 'md:left-auto md:w-56' + dropdownState === DropdownState.CALENDAR + ? 'md:left-auto' + : 'md:left-auto md:w-56' )} > - {calendarIsOpen && ( + {dropdownState === DropdownState.CALENDAR && ( { @@ -96,7 +86,7 @@ export const ComparisonPeriodMenuItems = ({ } /> )} - {!calendarIsOpen && ( + {dropdownState === DropdownState.MENU && ( <> {[ ComparisonMode.off, @@ -122,7 +112,7 @@ export const ComparisonPeriodMenuItems = ({ className={linkClassName} search={(s) => s} onClick={() => { - openCalendar() + toggleDropdown('calendar') }} > {COMPARISON_MODES[ComparisonMode.custom]} @@ -163,10 +153,13 @@ export const ComparisonPeriodMenuItems = ({ ) } -export const ComparisonPeriodMenuButton = () => { +export const ComparisonPeriodMenu = (props: PopoverMenuProps) => { const site = useSiteContext() const { query } = useQueryContext() - const buttonRef = useRef(null) + const { buttonRef, ...rest } = useDropdownWithCalendar({ + ...props, + query + }) return ( <> @@ -177,6 +170,7 @@ export const ComparisonPeriodMenuButton = () => { + ) } 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 c0d4d0b519d4..fb4a837424e6 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 @@ -37,7 +37,8 @@ import { MenuSeparator, useDropdownWithCalendar, DropdownWithCalendarState, - DropdownState + DropdownState, + calendarPositionClassName } from './shared-menu-items' import { DateRangeCalendar } from './date-range-calendar' import { formatISO, nowForSite } from '../../util/date' @@ -88,11 +89,10 @@ export const QueryPeriodMenu = (props: PopoverMenuProps) => { const site = useSiteContext() const { query } = useQueryContext() - const { buttonRef, closeDropdown, toggleDropdown, dropdownState } = - useDropdownWithCalendar({ - ...props, - query - }) + const { buttonRef, ...rest } = useDropdownWithCalendar({ + ...props, + query + }) return ( <> @@ -103,16 +103,13 @@ export const QueryPeriodMenu = (props: PopoverMenuProps) => { - + ) } const QueryPeriodMenuInner = ({ + panelRef, dropdownState, closeDropdown, toggleDropdown @@ -156,9 +153,10 @@ const QueryPeriodMenuInner = ({ )} > {({ close, open }) => ( - <> - - - + )} 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 b8a4774a8ca5..b2c42d9e8fdf 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 @@ -25,6 +25,8 @@ export const datemenuButtonClassName = classNames( 'justify-between px-2 w-full' ) +export const calendarPositionClassName = '*:!top-auto *:!right-0 *:!absolute' + export const DateMenuChevron = () => ( ) @@ -49,6 +51,7 @@ export interface DropdownWithCalendarState { toggleDropdown: (mode: 'menu' | 'calendar') => void dropdownState: DropdownState buttonRef: RefObject + panelRef: RefObject } export const useDropdownWithCalendar = ({ @@ -57,6 +60,7 @@ export const useDropdownWithCalendar = ({ dropdownIsOpen }: PopoverMenuProps & { query: DashboardQuery }): DropdownWithCalendarState => { const buttonRef = useRef(null) + const panelRef = useRef(null) const [currentMode, setCurrentMode] = useState<'menu' | 'calendar'>('menu') // closes dropdown when query changes @@ -84,13 +88,29 @@ export const useDropdownWithCalendar = ({ setCurrentMode('menu') } else { setCurrentMode(mode) - if (mode === 'calendar' && !dropdownIsOpen) { - buttonRef.current?.click() + if ( + mode === 'calendar' && + !dropdownIsOpen && + typeof buttonRef.current?.click === 'function' + ) { + buttonRef.current.click() + } + if ( + mode === 'calendar' && + typeof panelRef.current?.focus === 'function' + ) { + panelRef.current.focus() } } }, [closeDropdown, currentMode, dropdownIsOpen] ) - return { buttonRef, dropdownState: state, closeDropdown, toggleDropdown } + return { + panelRef, + buttonRef, + dropdownState: state, + closeDropdown, + toggleDropdown + } }