From a30341a728625dc7fdc2b0a54b88dfc737977b7a Mon Sep 17 00:00:00 2001 From: Brian Ingles Date: Wed, 19 Jun 2024 08:59:03 -0500 Subject: [PATCH] feat: ComboBoxNormalized - windowed data component (#2072) * Created `ComboBoxNormalized` component. This component handles normalized item and section data which is needed to support windowed data. (there will be 1 more PR providing the ComboBox component in the jsapi-components package that will handle the table support. Similar to Picker) * Styleguide example showing controlled data + validation for no selection * Split out `usePickerNormalizedProps` hook from `PickerNormalized` so that the logic could be reused in `ComboBoxNormalized` * Cleaned up some generics for utils using Spectrum `DomRef` resolves #2071 --- .../code-studio/src/styleguide/Pickers.tsx | 28 +++- .../components/src/SearchableCombobox.tsx | 5 +- .../src/spectrum/comboBox/ComboBox.tsx | 4 +- .../spectrum/comboBox/ComboBoxNormalized.tsx | 39 +++++ .../components/src/spectrum/comboBox/index.ts | 1 + .../src/spectrum/listView/ListViewWrapper.tsx | 2 +- .../components/src/spectrum/picker/Picker.tsx | 11 +- .../src/spectrum/picker/PickerNormalized.tsx | 98 +----------- .../components/src/spectrum/picker/index.ts | 1 + .../picker/usePickerNormalizedProps.tsx | 151 ++++++++++++++++++ .../src/spectrum/picker/usePickerProps.ts | 30 ++-- .../spectrum/picker/usePickerScrollOnOpen.ts | 10 +- .../spectrum/utils/useStringifiedSelection.ts | 6 +- .../react-hooks/src/SpectrumUtils.test.ts | 12 +- packages/react-hooks/src/SpectrumUtils.ts | 33 ++-- .../useSpectrumDisableSpellcheckRef.test.ts | 9 +- .../src/useSpectrumDisableSpellcheckRef.ts | 8 +- .../pickers-chromium-linux.png | Bin 19495 -> 21574 bytes .../pickers-firefox-linux.png | Bin 31731 -> 35320 bytes .../pickers-webkit-linux.png | Bin 7153 -> 8341 bytes 20 files changed, 287 insertions(+), 161 deletions(-) create mode 100644 packages/components/src/spectrum/comboBox/ComboBoxNormalized.tsx create mode 100644 packages/components/src/spectrum/picker/usePickerNormalizedProps.tsx diff --git a/packages/code-studio/src/styleguide/Pickers.tsx b/packages/code-studio/src/styleguide/Pickers.tsx index 739ff8d512..bef43fbf91 100644 --- a/packages/code-studio/src/styleguide/Pickers.tsx +++ b/packages/code-studio/src/styleguide/Pickers.tsx @@ -9,6 +9,7 @@ import { PickerNormalized, Checkbox, ComboBox, + ComboBoxNormalized, } from '@deephaven/components'; import { vsPerson } from '@deephaven/icons'; import { Icon } from '@adobe/react-spectrum'; @@ -61,10 +62,24 @@ function PersonIcon(): JSX.Element { } export function Pickers(): JSX.Element { - const [selectedKey, setSelectedKey] = useState(null); + const [selectedKey, setSelectedKey] = useState(200); const [showIcons, setShowIcons] = useState(true); + const [filteredItems, setFilteredItems] = useState(itemsWithIcons); + + const onSearch = useCallback( + (searchText: string) => + setFilteredItems( + searchText === '' + ? itemsWithIcons + : itemsWithIcons.filter( + ({ item }) => item?.textValue?.includes(searchText) + ) + ), + [] + ); + const getInitialScrollPosition = useCallback( async () => getPositionOfSelectedItem({ @@ -163,6 +178,17 @@ export function Pickers(): JSX.Element { showItemIcons={showIcons} onChange={onChange} /> + diff --git a/packages/components/src/SearchableCombobox.tsx b/packages/components/src/SearchableCombobox.tsx index 5848315419..33af6ab35c 100644 --- a/packages/components/src/SearchableCombobox.tsx +++ b/packages/components/src/SearchableCombobox.tsx @@ -1,8 +1,7 @@ /* eslint-disable react/jsx-props-no-spreading */ import { Key, useCallback } from 'react'; import { ComboBox, Item, SpectrumComboBoxProps } from '@adobe/react-spectrum'; -import type { FocusableRef } from '@react-types/shared'; -import type { ReactSpectrumComponent } from '@deephaven/react-hooks'; +import type { DOMRefValue, FocusableRef } from '@react-types/shared'; import TextWithTooltip from './TextWithTooltip'; export interface SearchableComboboxProps @@ -12,7 +11,7 @@ export interface SearchableComboboxProps > { getItemDisplayText: (item: TItem | null | undefined) => string | null; getKey: (item: TItem | null | undefined) => TKey | null; - scrollRef: React.RefObject>; + scrollRef: React.RefObject; onSelectionChange: (key: TKey | null) => void; } diff --git a/packages/components/src/spectrum/comboBox/ComboBox.tsx b/packages/components/src/spectrum/comboBox/ComboBox.tsx index 6b4647fb49..75baff7de4 100644 --- a/packages/components/src/spectrum/comboBox/ComboBox.tsx +++ b/packages/components/src/spectrum/comboBox/ComboBox.tsx @@ -16,8 +16,8 @@ export function ComboBox({ const { defaultSelectedKey, disabledKeys, + ref, selectedKey, - scrollRef, ...comboBoxProps } = usePickerProps(props); @@ -25,8 +25,8 @@ export function ComboBox({ } UNSAFE_className={cl('dh-combobox', UNSAFE_className)} + ref={ref as FocusableRef} // Type assertions are necessary here since Spectrum types don't account // for number and boolean key values even though they are valid runtime // values. diff --git a/packages/components/src/spectrum/comboBox/ComboBoxNormalized.tsx b/packages/components/src/spectrum/comboBox/ComboBoxNormalized.tsx new file mode 100644 index 0000000000..b963803a47 --- /dev/null +++ b/packages/components/src/spectrum/comboBox/ComboBoxNormalized.tsx @@ -0,0 +1,39 @@ +import { ComboBox as SpectrumComboBox } from '@adobe/react-spectrum'; +import { FocusableRef } from '@react-types/shared'; +import cl from 'classnames'; +import { PickerNormalizedPropsT, usePickerNormalizedProps } from '../picker'; +import { ComboBoxProps } from './ComboBox'; + +export type ComboBoxNormalizedProps = PickerNormalizedPropsT; + +/** + * ComboBox that takes an array of `NormalizedItem` or `NormalizedSection` items + * as children and uses a render item function to render the items. `NormalizedItem` + * and `NormalizedSection` datums always provide a `key` property but have an + * optional `item` property that can be lazy loaded. This is necessary to support + * windowed data since we need a representative key for every item in the + * collection. + */ +export function ComboBoxNormalized({ + UNSAFE_className, + ...props +}: ComboBoxNormalizedProps): JSX.Element { + const { forceRerenderKey, ref, ...pickerProps } = + usePickerNormalizedProps(props); + + return ( + } + UNSAFE_className={cl( + 'dh-combobox', + 'dh-combobox-normalized', + UNSAFE_className + )} + /> + ); +} + +export default ComboBoxNormalized; diff --git a/packages/components/src/spectrum/comboBox/index.ts b/packages/components/src/spectrum/comboBox/index.ts index d122f03ba6..e184e7b6b4 100644 --- a/packages/components/src/spectrum/comboBox/index.ts +++ b/packages/components/src/spectrum/comboBox/index.ts @@ -1 +1,2 @@ export * from './ComboBox'; +export * from './ComboBoxNormalized'; diff --git a/packages/components/src/spectrum/listView/ListViewWrapper.tsx b/packages/components/src/spectrum/listView/ListViewWrapper.tsx index 7aff7f9884..b08f98e87d 100644 --- a/packages/components/src/spectrum/listView/ListViewWrapper.tsx +++ b/packages/components/src/spectrum/listView/ListViewWrapper.tsx @@ -46,7 +46,7 @@ export function ListViewWrapper( // of the parent container and only render the ListView when it has a non-zero // height. See https://github.com/adobe/react-spectrum/issues/6213 const { ref: contentRectRef, contentRect } = useContentRect( - extractSpectrumHTMLElement + extractSpectrumHTMLElement ); return ( diff --git a/packages/components/src/spectrum/picker/Picker.tsx b/packages/components/src/spectrum/picker/Picker.tsx index d6a85ce873..543f6888ab 100644 --- a/packages/components/src/spectrum/picker/Picker.tsx +++ b/packages/components/src/spectrum/picker/Picker.tsx @@ -2,7 +2,6 @@ import { Picker as SpectrumPicker, SpectrumPickerProps, } from '@adobe/react-spectrum'; -import type { DOMRef } from '@react-types/shared'; import cl from 'classnames'; import type { NormalizedItem } from '../utils'; import type { PickerProps } from './PickerProps'; @@ -19,19 +18,13 @@ export function Picker({ UNSAFE_className, ...props }: PickerProps): JSX.Element { - const { - defaultSelectedKey, - disabledKeys, - selectedKey, - scrollRef, - ...pickerProps - } = usePickerProps(props); + const { defaultSelectedKey, disabledKeys, selectedKey, ...pickerProps } = + usePickerProps(props); return ( } UNSAFE_className={cl('dh-picker', UNSAFE_className)} // Type assertions are necessary here since Spectrum types don't account // for number and boolean key values even though they are valid runtime diff --git a/packages/components/src/spectrum/picker/PickerNormalized.tsx b/packages/components/src/spectrum/picker/PickerNormalized.tsx index 4e4409b922..ffe18b594f 100644 --- a/packages/components/src/spectrum/picker/PickerNormalized.tsx +++ b/packages/components/src/spectrum/picker/PickerNormalized.tsx @@ -1,19 +1,8 @@ -import { useMemo } from 'react'; import { Picker as SpectrumPicker } from '@adobe/react-spectrum'; -import type { DOMRef } from '@react-types/shared'; import cl from 'classnames'; -import { EMPTY_FUNCTION } from '@deephaven/utils'; -import { Section } from '../shared'; import type { PickerNormalizedProps } from './PickerProps'; -import { - getItemKey, - isNormalizedSection, - normalizeTooltipOptions, - useRenderNormalizedItem, - useStringifiedSelection, -} from '../utils'; -import usePickerScrollOnOpen from './usePickerScrollOnOpen'; +import usePickerNormalizedProps from './usePickerNormalizedProps'; /** * Picker that takes an array of `NormalizedItem` or `NormalizedSection` items @@ -21,98 +10,25 @@ import usePickerScrollOnOpen from './usePickerScrollOnOpen'; * necessary to support windowed data. */ export function PickerNormalized({ - normalizedItems, - tooltip = true, - selectedKey, - defaultSelectedKey, - disabledKeys, - showItemIcons, UNSAFE_className, - getInitialScrollPosition, - onChange, - onOpenChange, - onScroll = EMPTY_FUNCTION, - onSelectionChange, ...props }: PickerNormalizedProps): JSX.Element { - const tooltipOptions = useMemo( - () => normalizeTooltipOptions(tooltip), - [tooltip] - ); - - const renderNormalizedItem = useRenderNormalizedItem({ - itemIconSlot: 'icon', - // Descriptions introduce variable item heights which throws off calculation - // of initial scroll position and setting viewport on windowed data. For now - // not going to implement description support in Picker. - // https://github.com/deephaven/web-client-ui/issues/1958 - showItemDescriptions: false, - showItemIcons, - tooltipOptions, - }); - - // Spectrum doesn't re-render if only the `renderNormalizedItems` function - // changes, so we create a key from its dependencies that can be used to force - // re-render. - const forceRerenderKey = `${showItemIcons}-${tooltipOptions?.placement}`; - - const { ref: scrollRef, onOpenChange: onOpenChangeInternal } = - usePickerScrollOnOpen({ - getInitialScrollPosition, - onScroll, - onOpenChange, - }); - - // Spectrum Picker treats keys as strings if the `key` prop is explicitly - // set on `Item` elements. Since we do this in `renderItem`, we need to - // map original key types to and from strings so that selection works. - const { - selectedStringKey, - defaultSelectedStringKey, - disabledStringKeys, - onStringSelectionChange, - } = useStringifiedSelection({ - normalizedItems, - selectedKey, - defaultSelectedKey, - disabledKeys, - onChange: onChange ?? onSelectionChange, - }); + const { forceRerenderKey, ...pickerProps } = usePickerNormalizedProps< + PickerNormalizedProps, + HTMLDivElement + >(props); return ( } UNSAFE_className={cl( 'dh-picker', 'dh-picker-normalized', UNSAFE_className )} - items={normalizedItems} - selectedKey={selectedStringKey} - defaultSelectedKey={defaultSelectedStringKey} - disabledKeys={disabledStringKeys} - onSelectionChange={onStringSelectionChange} - onOpenChange={onOpenChangeInternal} - > - {itemOrSection => { - if (isNormalizedSection(itemOrSection)) { - return ( -
- {renderNormalizedItem} -
- ); - } - - return renderNormalizedItem(itemOrSection); - }} -
+ /> ); } diff --git a/packages/components/src/spectrum/picker/index.ts b/packages/components/src/spectrum/picker/index.ts index f1180f5214..1582bec05e 100644 --- a/packages/components/src/spectrum/picker/index.ts +++ b/packages/components/src/spectrum/picker/index.ts @@ -2,5 +2,6 @@ export * from './Picker'; export * from './PickerNormalized'; export * from './PickerProps'; export * from './usePickerItemScale'; +export * from './usePickerNormalizedProps'; export * from './usePickerProps'; export * from './usePickerScrollOnOpen'; diff --git a/packages/components/src/spectrum/picker/usePickerNormalizedProps.tsx b/packages/components/src/spectrum/picker/usePickerNormalizedProps.tsx new file mode 100644 index 0000000000..01c2d7938e --- /dev/null +++ b/packages/components/src/spectrum/picker/usePickerNormalizedProps.tsx @@ -0,0 +1,151 @@ +import { Key, useCallback, useMemo } from 'react'; +import { EMPTY_FUNCTION } from '@deephaven/utils'; +import type { DOMRef } from '@react-types/shared'; +import { + getItemKey, + isNormalizedSection, + NormalizedItem, + NormalizedSection, + normalizeTooltipOptions, + useRenderNormalizedItem, + useStringifiedSelection, +} from '../utils'; +import { PickerNormalizedPropsT } from './PickerProps'; +import { usePickerScrollOnOpen } from './usePickerScrollOnOpen'; +import { Section } from '../shared'; + +/** Props that are derived by `usePickerNormalizedProps` */ +export type UsePickerNormalizedDerivedProps = { + children: (itemOrSection: NormalizedItem | NormalizedSection) => JSX.Element; + forceRerenderKey: Key; + items: (NormalizedItem | NormalizedSection)[]; + defaultSelectedKey?: Key; + disabledKeys?: Iterable; + ref: DOMRef; + selectedKey?: Key | null; + onSelectionChange: (key: Key | null) => void; + onOpenChange: (isOpen: boolean) => void; +}; + +/** + * Props that are passed through untouched. (should exclude all of the + * destructured props passed into `usePickerNormalizedProps` that are not in the + * spread ...props) + */ +export type UsePickerNormalizedPassthroughProps = Omit< + PickerNormalizedPropsT, + | 'defaultSelectedKey' + | 'disabledKeys' + | 'getInitialScrollPosition' + | 'normalizedItems' + | 'onChange' + | 'onOpenChange' + | 'onScroll' + | 'onSelectionChange' + | 'selectedKey' + | 'showItemIcons' + | 'tooltip' +>; + +/** Props returned from `usePickerNormalizedProps` hook. */ +export type UsePickerNormalizedProps< + TProps, + THtml extends HTMLElement, +> = UsePickerNormalizedDerivedProps & + UsePickerNormalizedPassthroughProps; + +export function usePickerNormalizedProps< + TProps, + THtml extends HTMLElement = HTMLElement, +>({ + defaultSelectedKey, + disabledKeys, + getInitialScrollPosition, + normalizedItems, + onChange, + onOpenChange, + onScroll = EMPTY_FUNCTION, + onSelectionChange, + selectedKey, + showItemIcons, + tooltip = true, + ...props +}: PickerNormalizedPropsT): UsePickerNormalizedProps { + const tooltipOptions = useMemo( + () => normalizeTooltipOptions(tooltip), + [tooltip] + ); + + const renderNormalizedItem = useRenderNormalizedItem({ + itemIconSlot: 'icon', + // Descriptions introduce variable item heights which throws off calculation + // of initial scroll position and setting viewport on windowed data. For now + // not going to implement description support in Picker. + // https://github.com/deephaven/web-client-ui/issues/1958 + showItemDescriptions: false, + showItemIcons, + tooltipOptions, + }); + + // Spectrum doesn't re-render if only the `renderNormalizedItems` function + // changes, so we create a key from its dependencies that can be used to force + // re-render. + const forceRerenderKey = `${showItemIcons}-${tooltipOptions?.placement}`; + + const { ref, onOpenChange: onOpenChangeInternal } = + usePickerScrollOnOpen({ + getInitialScrollPosition, + onScroll, + onOpenChange, + }); + + // Spectrum Picker treats keys as strings if the `key` prop is explicitly + // set on `Item` elements. Since we do this in `renderItem`, we need to + // map original key types to and from strings so that selection works. + const { + selectedStringKey, + defaultSelectedStringKey, + disabledStringKeys, + onStringSelectionChange, + } = useStringifiedSelection({ + normalizedItems, + selectedKey, + defaultSelectedKey, + disabledKeys, + onChange: onChange ?? onSelectionChange, + }); + + const children = useCallback( + (itemOrSection: NormalizedItem | NormalizedSection) => { + if (isNormalizedSection(itemOrSection)) { + return ( +
+ {renderNormalizedItem} +
+ ); + } + + return renderNormalizedItem(itemOrSection); + }, + [renderNormalizedItem] + ); + + return { + ...props, + children, + forceRerenderKey, + ref, + items: normalizedItems, + selectedKey: selectedStringKey, + defaultSelectedKey: defaultSelectedStringKey, + disabledKeys: disabledStringKeys, + onSelectionChange: onStringSelectionChange, + onOpenChange: onOpenChangeInternal, + }; +} + +export default usePickerNormalizedProps; diff --git a/packages/components/src/spectrum/picker/usePickerProps.ts b/packages/components/src/spectrum/picker/usePickerProps.ts index 2d7535d1ca..e0a86a80f7 100644 --- a/packages/components/src/spectrum/picker/usePickerProps.ts +++ b/packages/components/src/spectrum/picker/usePickerProps.ts @@ -18,17 +18,21 @@ import type { PickerPropsT } from './PickerProps'; import usePickerItemScale from './usePickerItemScale'; import usePickerScrollOnOpen from './usePickerScrollOnOpen'; -/** Props that are derived. */ -export type UsePickerDerivedProps = { +/** Props that are derived by `usePickerProps`. */ +export type UsePickerDerivedProps = { children: (SectionElement | ItemElement)[]; defaultSelectedKey?: ItemKey | undefined; + ref: DOMRef; selectedKey?: ItemKey | null | undefined; - scrollRef: DOMRef; onOpenChange: (isOpen: boolean) => void; onSelectionChange: ((key: ItemKey | null) => void) | undefined; }; -/** Props that are passed through untouched. */ +/** + * Props that are passed through untouched. (should exclude all of the + * destructured props passed into `usePickerProps` that are not in the spread + * ...props) +) */ export type UsePickerPassthroughProps = Omit< PickerPropsT, | 'children' @@ -41,15 +45,21 @@ export type UsePickerPassthroughProps = Omit< | 'onSelectionChange' >; -export type UsePickerProps = UsePickerDerivedProps & - UsePickerPassthroughProps; +/** Props returned from `usePickerProps` hook. */ +export type UsePickerProps< + TProps, + THtml extends HTMLElement, +> = UsePickerDerivedProps & UsePickerPassthroughProps; /** * Derive props for Picker components (e.g. Picker and ComboBox). Specifically * handles wrapping children items and initial scroll position when the picker * is opened. */ -export function usePickerProps({ +export function usePickerProps< + TProps, + THtml extends HTMLElement = HTMLElement, +>({ children, defaultSelectedKey, selectedKey, @@ -59,7 +69,7 @@ export function usePickerProps({ onScroll = EMPTY_FUNCTION, onSelectionChange: onSelectionChangeHandler, ...props -}: PickerPropsT): UsePickerProps { +}: PickerPropsT): UsePickerProps { const { itemHeight } = usePickerItemScale(); const tooltipOptions = useMemo( @@ -86,7 +96,7 @@ export function usePickerProps({ topOffset: PICKER_TOP_OFFSET, }); - const { ref: scrollRef, onOpenChange } = usePickerScrollOnOpen({ + const { ref, onOpenChange } = usePickerScrollOnOpen({ getInitialScrollPosition, onScroll, onOpenChange: onOpenChangeHandler, @@ -95,9 +105,9 @@ export function usePickerProps({ return { ...props, defaultSelectedKey, + ref, selectedKey, children: items, - scrollRef, onOpenChange, onSelectionChange: onChangeMaybeUncontrolled, }; diff --git a/packages/components/src/spectrum/picker/usePickerScrollOnOpen.ts b/packages/components/src/spectrum/picker/usePickerScrollOnOpen.ts index d9ad3114f4..6e0c5bc0e6 100644 --- a/packages/components/src/spectrum/picker/usePickerScrollOnOpen.ts +++ b/packages/components/src/spectrum/picker/usePickerScrollOnOpen.ts @@ -11,8 +11,8 @@ export interface UsePickerScrollOnOpenOptions { onOpenChange?: (isOpen: boolean) => void; } -export interface UsePickerScrollOnOpenResult { - ref: DOMRef; +export interface UsePickerScrollOnOpenResult { + ref: DOMRef; onOpenChange: (isOpen: boolean) => void; } @@ -25,13 +25,13 @@ export interface UsePickerScrollOnOpenResult { * @return A ref to attach to the Picker and a callback to handle open change * events for the Picker. */ -export function usePickerScrollOnOpen({ +export function usePickerScrollOnOpen({ getInitialScrollPosition, onScroll, onOpenChange, -}: UsePickerScrollOnOpenOptions): UsePickerScrollOnOpenResult { +}: UsePickerScrollOnOpenOptions): UsePickerScrollOnOpenResult { const { ref, onOpenChange: popoverOnOpenChange } = usePopoverOnScrollRef( - findSpectrumPickerScrollArea, + findSpectrumPickerScrollArea, onScroll, getInitialScrollPosition ); diff --git a/packages/components/src/spectrum/utils/useStringifiedSelection.ts b/packages/components/src/spectrum/utils/useStringifiedSelection.ts index ffea625f53..d954760c77 100644 --- a/packages/components/src/spectrum/utils/useStringifiedSelection.ts +++ b/packages/components/src/spectrum/utils/useStringifiedSelection.ts @@ -12,14 +12,14 @@ export interface UseStringifiedSelectionOptions { selectedKey: ItemKey | null | undefined; defaultSelectedKey: ItemKey | undefined; disabledKeys: Iterable | undefined; - onChange: ((key: ItemKey) => void) | undefined; + onChange: ((key: ItemKey | null) => void) | undefined; } export interface UseStringifiedSelectionResult { defaultSelectedStringKey?: Key; selectedStringKey?: Key | null; disabledStringKeys?: Set; - onStringSelectionChange: (key: Key) => void; + onStringSelectionChange: (key: Key | null) => void; } /** @@ -63,7 +63,7 @@ export function useStringifiedSelection({ ); const onStringSelectionChange = useCallback( - (key: Key): void => { + (key: Key | null): void => { if (onChange == null) { return; } diff --git a/packages/react-hooks/src/SpectrumUtils.test.ts b/packages/react-hooks/src/SpectrumUtils.test.ts index 5e7dc6ad25..9fb99afe31 100644 --- a/packages/react-hooks/src/SpectrumUtils.test.ts +++ b/packages/react-hooks/src/SpectrumUtils.test.ts @@ -1,4 +1,5 @@ import { KeyedItem, TestUtils } from '@deephaven/utils'; +import type { DOMRefValue } from '@react-types/shared'; import { createValidationProps, extractSpectrumHTMLElement, @@ -8,7 +9,6 @@ import { findSpectrumPopoverScrollArea, getPositionOfSelectedItem, identityExtractHTMLElement, - ReactSpectrumComponent, } from './SpectrumUtils'; const { asMock, createMockProxy } = TestUtils; @@ -31,7 +31,7 @@ describe('createValidationProps', () => { describe('extractSpectrumHTMLElement', () => { const mock = { element: createMockProxy(), - ref: createMockProxy(), + ref: createMockProxy(), }; beforeEach(() => { @@ -49,7 +49,7 @@ describe('extractSpectrumHTMLElement', () => { describe('extractSpectrumLastChildHTMLElement', () => { const mock = { - ref: createMockProxy(), + ref: createMockProxy(), }; it('should return null if ref is null', () => { @@ -86,8 +86,8 @@ describe('extractSpectrumLastChildHTMLElement', () => { describe.each([ // General popover function - ['i', findSpectrumPopoverScrollArea], - ['span', findSpectrumPopoverScrollArea], + ['i', findSpectrumPopoverScrollArea], + ['span', findSpectrumPopoverScrollArea], // Specific consumer functions ['input', findSpectrumComboBoxScrollArea], ['button', findSpectrumPickerScrollArea], @@ -128,7 +128,7 @@ describe.each([ 'should find `aria-controls` element of trigger element', (hasRef, hasTrigger, hasPopup, shouldFind) => { const ref = hasRef - ? createMockProxy({ + ? createMockProxy({ UNSAFE_getDOMNode: () => el.component, }) : null; diff --git a/packages/react-hooks/src/SpectrumUtils.ts b/packages/react-hooks/src/SpectrumUtils.ts index 2f48b318ce..41e2ab3656 100644 --- a/packages/react-hooks/src/SpectrumUtils.ts +++ b/packages/react-hooks/src/SpectrumUtils.ts @@ -2,9 +2,6 @@ import type { SpectrumTextFieldProps } from '@adobe/react-spectrum'; import { KeyedItem } from '@deephaven/utils'; import type { DOMRefValue } from '@react-types/shared'; -export type ReactSpectrumComponent = - DOMRefValue; - /** * Creates validation props for a Spectrum field. If `isValid` is true, returns * empty props. If false, returns { errorMessage, validationState: 'invalid' } @@ -29,9 +26,9 @@ export function createValidationProps( * Extract DOM node from React Spectrum component ref. * @param ref */ -export function extractSpectrumHTMLElement( - ref: ReactSpectrumComponent | null -): HTMLElement | null { +export function extractSpectrumHTMLElement< + THtml extends HTMLElement = HTMLElement, +>(ref: DOMRefValue | null): HTMLElement | null { return ref?.UNSAFE_getDOMNode() ?? null; } @@ -40,9 +37,9 @@ export function extractSpectrumHTMLElement( * ref. * @param ref */ -export function extractSpectrumLastChildHTMLElement( - ref: ReactSpectrumComponent | null -): HTMLElement | null { +export function extractSpectrumLastChildHTMLElement< + THtml extends HTMLElement = HTMLElement, +>(ref: DOMRefValue | null): HTMLElement | null { const maybeHTMLElement = ref?.UNSAFE_getDOMNode().lastElementChild; return identityExtractHTMLElement(maybeHTMLElement); } @@ -51,9 +48,9 @@ export function extractSpectrumLastChildHTMLElement( * Find the popover associated with a given Spectrum ComboBox ref. * @param ref The ref to the Spectrum ComboBox component */ -export function findSpectrumComboBoxScrollArea( - ref: ReactSpectrumComponent | null -): HTMLElement | null { +export function findSpectrumComboBoxScrollArea< + THtml extends HTMLElement = HTMLElement, +>(ref: DOMRefValue | null): HTMLElement | null { return findSpectrumPopoverScrollArea(ref, 'input'); } @@ -61,9 +58,9 @@ export function findSpectrumComboBoxScrollArea( * Find the popover associated with a given Spectrum Picker ref. * @param ref The ref to the Spectrum Picker component */ -export function findSpectrumPickerScrollArea( - ref: ReactSpectrumComponent | null -): HTMLElement | null { +export function findSpectrumPickerScrollArea< + THtml extends HTMLElement = HTMLElement, +>(ref: DOMRefValue | null): HTMLElement | null { return findSpectrumPopoverScrollArea(ref, 'button'); } @@ -74,10 +71,8 @@ export function findSpectrumPickerScrollArea( */ export function findSpectrumPopoverScrollArea< K extends keyof HTMLElementTagNameMap, ->( - ref: ReactSpectrumComponent | null, - triggerElementType: K -): HTMLElement | null { + THtml extends HTMLElement = HTMLElement, +>(ref: DOMRefValue | null, triggerElementType: K): HTMLElement | null { const maybeHTMLElement = ref?.UNSAFE_getDOMNode(); const trigger = maybeHTMLElement?.querySelector(triggerElementType); const popupId = trigger?.getAttribute('aria-controls'); diff --git a/packages/react-hooks/src/useSpectrumDisableSpellcheckRef.test.ts b/packages/react-hooks/src/useSpectrumDisableSpellcheckRef.test.ts index 1185f27510..e02a4172c8 100644 --- a/packages/react-hooks/src/useSpectrumDisableSpellcheckRef.test.ts +++ b/packages/react-hooks/src/useSpectrumDisableSpellcheckRef.test.ts @@ -1,9 +1,6 @@ import { renderHook } from '@testing-library/react-hooks'; -import { - ReactSpectrumComponent, - SPELLCHECK_FALSE_ATTRIBUTE, - TestUtils, -} from '@deephaven/utils'; +import { DOMRefValue } from '@react-types/shared'; +import { SPELLCHECK_FALSE_ATTRIBUTE, TestUtils } from '@deephaven/utils'; import useSetAttributesCallback from './useSetAttributesCallback'; import useSpectrumDisableSpellcheckRef from './useSpectrumDisableSpellcheckRef'; @@ -20,7 +17,7 @@ describe('useSpectrumDisableSpellcheckRef', () => { const mock = { useSetAttributesCallbackResult: jest.fn(), selectors: 'mock.selectors', - ref: createMockProxy(), + ref: createMockProxy(), rootEl: createMockProxy(), }; diff --git a/packages/react-hooks/src/useSpectrumDisableSpellcheckRef.ts b/packages/react-hooks/src/useSpectrumDisableSpellcheckRef.ts index 4016e792be..33fb7ab266 100644 --- a/packages/react-hooks/src/useSpectrumDisableSpellcheckRef.ts +++ b/packages/react-hooks/src/useSpectrumDisableSpellcheckRef.ts @@ -1,8 +1,6 @@ import { SPELLCHECK_FALSE_ATTRIBUTE } from '@deephaven/utils'; -import { - extractSpectrumHTMLElement, - ReactSpectrumComponent, -} from './SpectrumUtils'; +import type { DOMRefValue } from '@react-types/shared'; +import { extractSpectrumHTMLElement } from './SpectrumUtils'; import useMappedRef from './useMappedRef'; import useSetAttributesCallback from './useSetAttributesCallback'; @@ -15,7 +13,7 @@ import useSetAttributesCallback from './useSetAttributesCallback'; */ export function useSpectrumDisableSpellcheckRef( selectors?: string -): (ref: ReactSpectrumComponent | null) => void { +): (ref: DOMRefValue | null) => void { const disableSpellcheck = useSetAttributesCallback( SPELLCHECK_FALSE_ATTRIBUTE, selectors diff --git a/tests/styleguide.spec.ts-snapshots/pickers-chromium-linux.png b/tests/styleguide.spec.ts-snapshots/pickers-chromium-linux.png index 10724bfe6433728254036df499ea2047ff8ebfb1..b4dfbf9842f75fba1e253341711583c00a33e598 100644 GIT binary patch literal 21574 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 literal 19495 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 G{C@zJD&u_s diff --git a/tests/styleguide.spec.ts-snapshots/pickers-firefox-linux.png b/tests/styleguide.spec.ts-snapshots/pickers-firefox-linux.png index c2d689247e23626a2f6158ece8505cff4cf48ec7..c6542e6f6983e5e85f147d6b77719530d943129b 100644 GIT binary patch delta 10637 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%0Dmw}T`MKj<2+!2+@*${9bJQNCp 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 delta 7020 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 literal 7153 zcmd6scT`i^+wYGeMG=@m=_sP2^o~dgO$6y65tORZqzKZR5Jpf$1B&z-5D9Gp6X^*g zh|-aOp;x6Tp+tHocQbd^eP`~y@B4fI`Q3HHT005noV}mD_ftOmn;27LU6vEPCm;x7 z(Yv926M~N2hM*(DOh>_grb53Yf;Wcy2D;i1?eH(Bz90dD_|SUVn(&~^#WCtD{_kPj zKVeJbW{FET7#Q+TQQHN1=b^8~U#RNoG){ea8#MhU4BP8mA*Z4uhgVVG*nX_> zx}`Sl`}We(W zs}Q7dkDfVKlO-?p2n6vK$Zfg7^;Q>_zq2cDY?|yzg6moS%}X-HU(Jq!8(0)6^dJKX(qn8b)bo6LQ(>k|y+1%4Gx86~Bhe9o9m5tzi(YM4AD#qx*HOi zr&cRpg|EYcu~*-1eW}sTdy$59(kT@!{}lg z3ZCBo*@<*EeqVvAo;M>N3nvOe)(q+ONzYJe3g;t?t1d?w;U*4@HcK+}OqRwcd5}4>&dExF zd4DTxvYmoo0E?C8X2w+6s|7yAplz69i(P!i63*dVDn959^DhW^T?}Q0poYiXggcGX zZxz+KcPw^b#~B#W9w_}W+2WKoYtTLKy-UE#eKj(+sk!iYej|(X5CXl)2)5Jh!MC5e z7jCs2Zfr4bR2(cyj{FHhVC&U?N6S1=x*ygj14c`9`;UP|4W=L{;;V4f|1T|4JgSR` zmBHJQ`B1I{JWj}OdwhKU&#QVwJ1f|a7TzP84|pcKG<(bME{`Lq1WPJX%%=WKO~!Z_?d1r{X-->HR}Z#JaoS zZ!shDN1@6ubF@=u&Ls!;^Ya!P%X+rfAm+;%RZ<2b=F5r=#f(^dJ(f_b+ALuvbdWwd z#*2cgo3bQZV_zo5I1q9*H8zACmwT?=XLevrnM-ldwS5%3`6ejH=vmcj?zADFzrSjD zP)H!g+f{movlAhv8P5>wtjLDpI49vh^EbO(i0I85;IErSKA zWIvHBILD=s$6+vE{_6WI?p!*7WNMZ;I9Iq|ZXai~AOwSR^z?pKCO=c=4WXa9&|@~n zVGw!TSA6+HTnKx!8eflhKnQc*PH|tNrQHm%AlB$ze~lJwX1+Gq7Rqrvu4vF|t@@5X zBk1NU>Z9dP)=Dapx!$SE2UK3gj{pH>e)`%y3X^XKfaayWu5h09D>XZB~e= zIRx8_Lw8&Ed2-ig9KB;o0^jqe1__0CYmKi4HYZ*0)qR>~VF)7^brw#B%~+kaNW#?@ zB>jA&FzJ6JVh6;TmX65xgFAdG4GK(!*%U9@Y^zh!BT^KVGf~4eJ+Sy4w5!} z5Ri7Ix5G3evP>=@MGYhWlHXwA{K2D3DF=7W!#}03o0}el4i9SchIr<|oRN;Kc3hC~ zP~*32y6sedD=|gNA4lJ@%1FPkyxi2CAlK$Q6I}XT&XiOL9ex2QLPDo z6dYVT=4p9`jiq~j-E*`C>+e6`Ur_CHMwr}s9c>oZn8u)yC-Hc$$R&HP{xV{<$E&KU z%5%K#j=!pWLpF>}^*t`+>o+>$&WQaOAxve;?B&asvavRfyfebdu8_R#Zkj_&sqIKO zbu6%cH=!p>C9tZxnu{xi@bl@!5TPn-xv=Fd!Vn$*(lC#|NtPu7JyKa$xA(2Tzdm%c zI4dZD%TYpX*kI&=yK<7c902OMDUlk(1yFh zkJgGD$gH#ByK-*9Z=@-|+%#n;i|^{Rc7^gnQ6lz&r(sF`(+gdDdWPi-e1a+>$Dj}G zW=t#+%sjj@$ok^+a3vzKo;GnX5wm!5QGM|0)hZ2W*To zC*&vFAAP0?Fa?H2w?xbNx#D+!#I( z6}q@SKelvtYCI{a3^DcTGHO(Hb9kPkxmnfqK04T>gIfn9FGGe3P2)0zv`ITXi!qm5 ze>7uN)~t<*qp9J%k^vr*PQyb_%@nipn_7rlTSa6ks_mUQuOa+(QB!w9ZOr#gfSeD4y z?}cB@o4aFP2@4^ybScg(?f9{!P2%Rq;=Cr8oUjFz9h%jsd1{K` ztfVt+14Q=_su@^Fl_|^Ubk*uYNC;6t7{|VP$5<^y!|h z9ba@-*G8K~fRLm=jB;Lhaa7mRiF(&*f+Gi>YCf4Gn$-QDLI&#L{L51hb< zD$djQnyBx?(ea0|Obm2TTZy}La|kkwz}hs9l*qelREMNw>>(2NN@kfHr7^74 z>}_rD+Fzuy^D!+X&Pdpf!?1o{5g4in(=U_Cb~(Wqp&oOZ`WQ|z-;fh38K~@+mJ4z z*iR?Sp?AGCm-2RfyWDv)P|j`uN##*5Do}lcjBVkHeRtB$8Wm=Gb?U)6Y|5HxB<48- zZ;I=+#gp|$2roTaF6%K;D99HB{3D1*p7;zDTh-<3ZUHOm0$6zRi^SNF6-~*d^n0}QpE8p3!t-I zn|kH4+L5B;mikSD+B0>BK=XMB0AwEAf{De@Jx6IhoaN|j=V^d5=Ie$9McPT;-I=mn z@UN5Cvp%oEFqxO#B<;B%ZXbl}=+_F^w{3jGx4Gz(62GG?3VM=Tvgb~Xp!(%F({)^i zUz?>RjKfP`(apf#{n2Q9np;>`{i2*oY*&SNR@aZ?YtI-ot}0_lrS{F1PA97z1?E2u zz>#j3hiws|k4d?&b!@Zwd2dczk=6ZLb6&1RqqdMvbCTmhs;Nr-z|l^e^QL`5vpX0F zoFJWVVaGpL&uq(AA50X$&KVCWD3W#R4`DGkJTKPe@s?Z|ATSF~RsrRk{wJG^+-G#o zSVZ&+GUzN*-f@TcTna8#C9OYZpzv@&hQgb+Q?u9p$vV97m(G51U6A_})`ejB2L za(-=;I6SA^rN_y$f&*sSA^I@I{U5DyL7$tya#mkt$?nFYd-cezmTPotA@z%kix><> zMJ4cmV;z3jN`7CZE`Fd4vDee0qM~xENYv4QfB>H`=o;D#3DRKj zVH)%u0Ehek{9u?>Oc!y_%N{pKoBUzka>C;n6oEah)!Q+WBFS2u{$XH9@hGIhncQsV z9;t-7&vyhm7tfR1{jU)t-Zk+W`pE0UoBfkH1!$8~1;)g>K&O176Sch^kc9g3r&Aql zF!)1{&Ql->gXQ26iPG9k@a0RHAl6k8HZWeOaUz1&-rn9(U|fnRv#k&DcbIy-z04m* z83g8S&`uBDc-SXFPPGJe0x2HLY+F47^POENGQT_^V67g!l7X>se;Bs7vYSH6R2qpD z7Z)*~l=$Vn*Sl=DRM$=+P`!1WqiWPWf7oBMwYJCm%(M@ce-{;ysWEEYD{?{0Ab?SK zgrgo*s`34^aQ8Kn%N{o0cu$r38`~}p4-Z@28Nyc)W_d+e2&9X6~ zEi{6ipC6hcal`lQ=skmb+qhA6T6*SXonZl@dzaU-Y8Q zdP!~&jfWOpxW*rEZ29i1V@O=r0S_qj@~p>ZD0+qO+tb>l5ZfJcF7{zdwPns8l4=HW zg)iSuyda&semPht45mN%7*13*ppIp-LxBIcOTAH#SK5d>DN+Y}-_?m>yBml-Hkzx4 zm`J(Ca@t$XhY8r;wwv@qUAipj;%6ZOo%U&UN1+JmF{vo9`GE&(c=fQ=0t{*PiRAud zmPLvGnt?7UGgzTMMl(O&j#cO&P}En}!MX!~27*$(HdC6zzE6a25)V>n8!3ow%L&?t zK-wOOwl6hK=yj_Mr=boGh$^%lIyP15s-#@2!dZHq3r_&SIe$Muc3TowJn-c4p&_L( zN>Vt-+FDP6;*~C^q9+Ut^WB$ZZsV@x`MdWt`6Po~*GOIB(vo_-xGk{%gK^OqPn#%s zrMB;a2nZ)dhU&*T7s{sD=E^3evp~>;LPXu2MrQlagJ|^~O*}b#=ZE=FNltEX5;DJ| zJNDELyI6wwjQ)N1yp2wR9N5+}wZPqlvarSN=(CT1rnwLj!z2rd&m;z<;AfN_8`IKk zFh z;h_7}rgYH{FD!ZiH)5PR zO^p-+%)(sK;(pbzG} zyHKATk67jhN+qty1rF3t@sktcf_XtO@>*>ox`hpb94)6enbu>|N7_^>We16ud}S4m z(*ZlOmK6=2bE?Lmws}UY@Aj%W@VzpTbn=jxDfP?a)vJrqn(T^6%9cG2&MXc8Qy;0U zB_>qV#)F6Hno^qSTm69e-5CuO5U|&xjynJM;{SIXI0OL+Ny)P|>NRzBqn_0zanTGv z)wcVET&Taqjw`f@+0Pk@hj$K^fB#L_!V%mD=mts9Y@mcm#?V4UmwMLey0H zQ^)IzFXZYijo~+e%CXWuUQ7orpAV=Uc_=n1{B`!T$;d;+5#ZnPCmlsP#m_^KQT{K$ ztS5PYwe8bDy_g{QVJX4@e&$l|3BL0ID?kwm6zoOurP;=tC#<*%BlAqosO&$H`FrVl%D{Kti@JiRQ5W_0mI^7t-q8;-bWzIvG%p(UQ^2zg0S|tD>vIuX z*k$Qw#e@YTaKA#Lm(GJk&8%*F1+KCq?19`n=XU}_q%gN{aXu97z%Cy}a}*)|dol%( zz~z#rkZP8DQ3bLouv{R_4L`NVu1sPr{14W>$` zvl#Tm8Q24FWM0+(Q;ZljC}kI_|B`VLX|>%}8{0v(x3jk2?XNbWP7o1JPBSxrB>D$R z?dow@Zvy292&!i<#A9EEv!kV!BV`=a;pVqbmBjH<0`M+fnJ|CK^p3;)Ws~soJ~vQn zZGp6rCg*~WZvu-hjXfG1}===2u)X?da^((Ixt7645N$*GMg{Q!j>&SlXiv^4m`gJJ(`*&l0b*`P?9F%V6 zboh*O*ZN=B0)9})eyYCnQJwI!|7r2Z!eBx2`{F;O0M=z^q%#J(mJvFek^h-p-4Z%~%XLHux?n8()vVr3>8V z`U1{-s`)}m2{Uu)Qo_eZE%)_!-O@n(EylwztJo}Euts=fLWLK@qce{>7=kRGAYT@h53?!CnfRFmJ^tARr*U>&DupT6drP E4>k-A@c;k-