@elliemae/ds-data-table 3.60.0-next.2 → 3.60.0-next.21
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/addons/Filters/Components/CurrencyRangeFilter/index.js +1 -0
- package/dist/cjs/addons/Filters/Components/CurrencyRangeFilter/index.js.map +2 -2
- package/dist/cjs/addons/Filters/Components/DateRangeFilter/index.js +2 -0
- package/dist/cjs/addons/Filters/Components/DateRangeFilter/index.js.map +2 -2
- package/dist/cjs/addons/Filters/Components/DateSwitcherFilter/index.js +2 -0
- package/dist/cjs/addons/Filters/Components/DateSwitcherFilter/index.js.map +2 -2
- package/dist/cjs/addons/Filters/Components/FreeTextSearchFilter/index.js +1 -0
- package/dist/cjs/addons/Filters/Components/FreeTextSearchFilter/index.js.map +2 -2
- package/dist/cjs/addons/Filters/Components/NumberRangeFilter/index.js +1 -0
- package/dist/cjs/addons/Filters/Components/NumberRangeFilter/index.js.map +2 -2
- package/dist/cjs/addons/Filters/Components/SelectFilter/BaseSelectFilter.js +1 -0
- package/dist/cjs/addons/Filters/Components/SelectFilter/BaseSelectFilter.js.map +2 -2
- package/dist/cjs/addons/Filters/Components/SingleDateFilter/index.js +2 -0
- package/dist/cjs/addons/Filters/Components/SingleDateFilter/index.js.map +2 -2
- package/dist/cjs/exported-related/FilterPopover/index.js +45 -33
- package/dist/cjs/exported-related/FilterPopover/index.js.map +2 -2
- package/dist/cjs/exported-related/FilterPopover/types.js.map +1 -1
- package/dist/cjs/exported-related/FilterPopover/useTrackFocusableElements.js +59 -0
- package/dist/cjs/exported-related/FilterPopover/useTrackFocusableElements.js.map +7 -0
- package/dist/cjs/parts/FilterBar/DeprecatedDropdown.js +2 -2
- package/dist/cjs/parts/FilterBar/DeprecatedDropdown.js.map +2 -2
- package/dist/esm/addons/Filters/Components/CurrencyRangeFilter/index.js +1 -0
- package/dist/esm/addons/Filters/Components/CurrencyRangeFilter/index.js.map +2 -2
- package/dist/esm/addons/Filters/Components/DateRangeFilter/index.js +2 -0
- package/dist/esm/addons/Filters/Components/DateRangeFilter/index.js.map +2 -2
- package/dist/esm/addons/Filters/Components/DateSwitcherFilter/index.js +2 -0
- package/dist/esm/addons/Filters/Components/DateSwitcherFilter/index.js.map +2 -2
- package/dist/esm/addons/Filters/Components/FreeTextSearchFilter/index.js +1 -0
- package/dist/esm/addons/Filters/Components/FreeTextSearchFilter/index.js.map +2 -2
- package/dist/esm/addons/Filters/Components/NumberRangeFilter/index.js +1 -0
- package/dist/esm/addons/Filters/Components/NumberRangeFilter/index.js.map +2 -2
- package/dist/esm/addons/Filters/Components/SelectFilter/BaseSelectFilter.js +1 -0
- package/dist/esm/addons/Filters/Components/SelectFilter/BaseSelectFilter.js.map +2 -2
- package/dist/esm/addons/Filters/Components/SingleDateFilter/index.js +2 -0
- package/dist/esm/addons/Filters/Components/SingleDateFilter/index.js.map +2 -2
- package/dist/esm/exported-related/FilterPopover/index.js +38 -26
- package/dist/esm/exported-related/FilterPopover/index.js.map +2 -2
- package/dist/esm/exported-related/FilterPopover/useTrackFocusableElements.js +29 -0
- package/dist/esm/exported-related/FilterPopover/useTrackFocusableElements.js.map +7 -0
- package/dist/esm/parts/FilterBar/DeprecatedDropdown.js +1 -1
- package/dist/esm/parts/FilterBar/DeprecatedDropdown.js.map +1 -1
- package/dist/types/exported-related/FilterPopover/types.d.ts +1 -0
- package/dist/types/exported-related/FilterPopover/useTrackFocusableElements.d.ts +17 -0
- package/dist/types/tests/playwright/DSDataTable.ControlledFilterTestRenderer.d.ts +2 -0
- package/package.json +50 -52
|
@@ -1,14 +1,16 @@
|
|
|
1
1
|
import * as React from "react";
|
|
2
2
|
import { jsx, jsxs } from "react/jsx-runtime";
|
|
3
3
|
import { DSButtonV2 } from "@elliemae/ds-button-v2";
|
|
4
|
+
import { useFocusTrap } from "@elliemae/ds-hooks-focus-trap";
|
|
4
5
|
import { DSPopperJS } from "@elliemae/ds-popperjs";
|
|
5
6
|
import { mergeRefs, styled } from "@elliemae/ds-system";
|
|
6
7
|
import { useCallback, useEffect, useRef, useState } from "react";
|
|
7
|
-
import { DSDataTableName, DSDataTableSlots } from "../../constants/index.js";
|
|
8
8
|
import { DATA_TESTID } from "../../configs/constants.js";
|
|
9
|
-
import {
|
|
9
|
+
import { usePropsStore } from "../../configs/useStore/createInternalAndPropsContext.js";
|
|
10
|
+
import { DSDataTableName, DSDataTableSlots } from "../../constants/index.js";
|
|
10
11
|
import { useGetFilterHandlers } from "./useGetFilterHandlers.js";
|
|
11
12
|
import { useGetFilterVisibility } from "./useGetFilterVisibility.js";
|
|
13
|
+
import { useTrackFocusableElements } from "./useTrackFocusableElements.js";
|
|
12
14
|
const FilterButton = styled("span", { name: DSDataTableName, slot: DSDataTableSlots.FILTER_POPOVER_BUTTON })`
|
|
13
15
|
display: inline-grid;
|
|
14
16
|
${(props) => props.hide ? "opacity: 0; display: none; width: 0;" : ""}
|
|
@@ -20,18 +22,8 @@ const StyledPoppoverJS = styled(DSPopperJS, {
|
|
|
20
22
|
name: DSDataTableName,
|
|
21
23
|
slot: DSDataTableSlots.FILTER_POPOVER
|
|
22
24
|
})``;
|
|
23
|
-
const ButtonTrap = ({ cb }) => /* @__PURE__ */ jsx(
|
|
24
|
-
"span",
|
|
25
|
-
{
|
|
26
|
-
tabIndex: 0,
|
|
27
|
-
onFocus: (e) => {
|
|
28
|
-
e.stopPropagation();
|
|
29
|
-
cb();
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
);
|
|
33
25
|
const FilterPopover = (props) => {
|
|
34
|
-
const { column, customStyles, reduxHeader, menuContent,
|
|
26
|
+
const { column, customStyles, reduxHeader, menuContent, ariaLabel, triggerIcon, innerRef, columnReference } = props;
|
|
35
27
|
const filters = usePropsStore((state) => state.filters);
|
|
36
28
|
const getOwnerProps = usePropsStore((store) => store.get);
|
|
37
29
|
const getOwnerPropsArguments = useCallback(
|
|
@@ -40,18 +32,40 @@ const FilterPopover = (props) => {
|
|
|
40
32
|
}),
|
|
41
33
|
[column.id]
|
|
42
34
|
);
|
|
43
|
-
const patchHeader = useInternalStore((state) => state.patchHeader);
|
|
44
35
|
const { isIconVisible, isMenuOpen } = useGetFilterVisibility(reduxHeader);
|
|
45
36
|
const [buttonReference, setButtonReference] = useState(null);
|
|
46
37
|
const [isButtonFocused, setIsButtonFocused] = useState(false);
|
|
47
38
|
const { handleTriggerClick, handleClickOutsideMenu, handleMenuOnKeyDown, handleTriggerOnFocus, handleTriggerOnBlur } = useGetFilterHandlers(props, isMenuOpen, buttonReference, setIsButtonFocused);
|
|
48
|
-
const buttonTrapCallback = useCallback(() => {
|
|
49
|
-
patchHeader(columnId, { hideFilterMenu: true, hideFilterButton: false });
|
|
50
|
-
buttonReference?.focus();
|
|
51
|
-
}, [columnId, patchHeader, buttonReference]);
|
|
52
39
|
const actionRef = useRef({
|
|
53
40
|
update: null
|
|
54
41
|
});
|
|
42
|
+
const popoverContentRef = useRef(null);
|
|
43
|
+
const { firstElementRef, lastElementRef } = useTrackFocusableElements({
|
|
44
|
+
containerRef: popoverContentRef,
|
|
45
|
+
dependencies: [isMenuOpen, menuContent]
|
|
46
|
+
});
|
|
47
|
+
const focusedDayRef = useRef(null);
|
|
48
|
+
const handleOnKeyDown = useFocusTrap({
|
|
49
|
+
firstElementRef,
|
|
50
|
+
lastElementRef,
|
|
51
|
+
onKeyDown: (e) => {
|
|
52
|
+
const target = e.target;
|
|
53
|
+
const dayWrapper = target.closest(".focusedDay");
|
|
54
|
+
if (dayWrapper) {
|
|
55
|
+
if (focusedDayRef.current && focusedDayRef.current !== dayWrapper) {
|
|
56
|
+
focusedDayRef.current.classList.remove("focusedDay");
|
|
57
|
+
}
|
|
58
|
+
focusedDayRef.current = dayWrapper;
|
|
59
|
+
lastElementRef.current = target;
|
|
60
|
+
}
|
|
61
|
+
if (e.key === "Tab" && focusedDayRef.current) {
|
|
62
|
+
setTimeout(() => {
|
|
63
|
+
focusedDayRef.current?.classList.remove("focusedDay");
|
|
64
|
+
focusedDayRef.current = null;
|
|
65
|
+
}, 0);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
});
|
|
55
69
|
useEffect(() => {
|
|
56
70
|
void actionRef.current.update?.();
|
|
57
71
|
}, [filters]);
|
|
@@ -85,16 +99,16 @@ const FilterPopover = (props) => {
|
|
|
85
99
|
)
|
|
86
100
|
}
|
|
87
101
|
),
|
|
88
|
-
buttonReference && /* @__PURE__ */ jsx(
|
|
102
|
+
(columnReference || buttonReference) && /* @__PURE__ */ jsx(
|
|
89
103
|
StyledPoppoverJS,
|
|
90
104
|
{
|
|
91
105
|
actionRef,
|
|
92
|
-
referenceElement: buttonReference,
|
|
106
|
+
referenceElement: columnReference || buttonReference,
|
|
93
107
|
showPopover: isMenuOpen,
|
|
94
108
|
closeContextMenu: handleClickOutsideMenu,
|
|
95
109
|
"data-testid": DATA_TESTID.DATA_TABLE_FILTER_MENU_CONTENT,
|
|
96
110
|
startPlacementPreference: "bottom-end",
|
|
97
|
-
customOffset: [5, 4],
|
|
111
|
+
customOffset: columnReference ? [0, 1] : [5, 4],
|
|
98
112
|
withoutArrow: true,
|
|
99
113
|
withoutAnimation: true,
|
|
100
114
|
extraPopperStyles: {
|
|
@@ -104,11 +118,9 @@ const FilterPopover = (props) => {
|
|
|
104
118
|
placementOrderPreference: ["bottom-end", "top-end"],
|
|
105
119
|
getOwnerProps,
|
|
106
120
|
getOwnerPropsArguments,
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
/* @__PURE__ */ jsx(ButtonTrap, { cb: buttonTrapCallback })
|
|
111
|
-
] })
|
|
121
|
+
role: "dialog",
|
|
122
|
+
"aria-label": `Filter by ${column.Header}`,
|
|
123
|
+
children: /* @__PURE__ */ jsx(PopperContent, { getOwnerProps, innerRef: popoverContentRef, onKeyDown: handleOnKeyDown, children: menuContent })
|
|
112
124
|
}
|
|
113
125
|
)
|
|
114
126
|
]
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../../../scripts/build/transpile/react-shim.js", "../../../../src/exported-related/FilterPopover/index.tsx"],
|
|
4
|
-
"sourcesContent": ["import * as React from 'react';\nexport { React };\n", "/* eslint-disable import/no-cycle */\n/* eslint-disable no-void */\n/* eslint-disable jsx-a11y/no-static-element-interactions */\nimport { DSButtonV2 } from '@elliemae/ds-button-v2';\nimport type { DSPopperJST } from '@elliemae/ds-popperjs';\nimport { DSPopperJS } from '@elliemae/ds-popperjs';\nimport { mergeRefs, styled } from '@elliemae/ds-system';\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\nimport {
|
|
5
|
-
"mappings": "AAAA,YAAY,WAAW;
|
|
4
|
+
"sourcesContent": ["import * as React from 'react';\nexport { React };\n", "/* eslint-disable import/no-cycle */\n/* eslint-disable no-void */\n/* eslint-disable jsx-a11y/no-static-element-interactions */\nimport { DSButtonV2 } from '@elliemae/ds-button-v2';\nimport { useFocusTrap } from '@elliemae/ds-hooks-focus-trap';\nimport type { DSPopperJST } from '@elliemae/ds-popperjs';\nimport { DSPopperJS } from '@elliemae/ds-popperjs';\nimport { mergeRefs, styled } from '@elliemae/ds-system';\nimport React, { useCallback, useEffect, useRef, useState } from 'react';\nimport { DATA_TESTID } from '../../configs/constants.js';\nimport { usePropsStore } from '../../configs/useStore/createInternalAndPropsContext.js';\nimport { DSDataTableName, DSDataTableSlots } from '../../constants/index.js';\nimport type { FilterPopoverProps } from './types.js';\nimport { useGetFilterHandlers } from './useGetFilterHandlers.js';\nimport { useGetFilterVisibility } from './useGetFilterVisibility.js';\nimport { useTrackFocusableElements } from './useTrackFocusableElements.js';\n\nconst FilterButton = styled('span', { name: DSDataTableName, slot: DSDataTableSlots.FILTER_POPOVER_BUTTON })<{\n hide: boolean;\n}>`\n display: inline-grid;\n ${(props) => (props.hide ? 'opacity: 0; display: none; width: 0;' : '')}\n`;\n\nconst PopperContent = styled('div', { name: DSDataTableName, slot: DSDataTableSlots.FILTER_POPOVER_CONTENT })`\n background-color: #fff;\n`;\n\nconst StyledPoppoverJS = styled(DSPopperJS, {\n name: DSDataTableName,\n slot: DSDataTableSlots.FILTER_POPOVER,\n})``;\n\nexport const FilterPopover: React.ComponentType<FilterPopoverProps> = (props: FilterPopoverProps) => {\n const { column, customStyles, reduxHeader, menuContent, ariaLabel, triggerIcon, innerRef, columnReference } = props;\n\n const filters = usePropsStore((state) => state.filters);\n const getOwnerProps = usePropsStore((store) => store.get);\n\n const getOwnerPropsArguments = useCallback(\n () => ({\n columnId: column.id,\n }),\n [column.id],\n );\n\n const { isIconVisible, isMenuOpen } = useGetFilterVisibility(reduxHeader);\n\n const [buttonReference, setButtonReference] = useState<HTMLButtonElement | null>(null);\n\n const [isButtonFocused, setIsButtonFocused] = useState(false);\n\n const { handleTriggerClick, handleClickOutsideMenu, handleMenuOnKeyDown, handleTriggerOnFocus, handleTriggerOnBlur } =\n useGetFilterHandlers(props, isMenuOpen, buttonReference, setIsButtonFocused);\n\n const actionRef: Required<DSPopperJST.Props>['actionRef'] = useRef({\n update: null,\n });\n const popoverContentRef = useRef<HTMLDivElement>(null);\n const { firstElementRef, lastElementRef } = useTrackFocusableElements({\n containerRef: popoverContentRef,\n dependencies: [isMenuOpen, menuContent],\n });\n\n const focusedDayRef = useRef<HTMLElement | null>(null);\n const handleOnKeyDown = useFocusTrap({\n firstElementRef,\n lastElementRef,\n onKeyDown: (e) => {\n const target = e.target as HTMLElement;\n // Special handling for DateRangePicker calendar: days use a roving tabindex pattern.\n // Track the focused day to update the lastElementRef and clear visual focus on Tab loop.\n const dayWrapper = target.closest('.focusedDay') as HTMLElement;\n if (dayWrapper) {\n // Remove visual focus from the previously focused day\n if (focusedDayRef.current && focusedDayRef.current !== dayWrapper) {\n focusedDayRef.current.classList.remove('focusedDay');\n }\n\n focusedDayRef.current = dayWrapper;\n // Update trap boundary to the focused day's button\n lastElementRef.current = target;\n }\n // Clear visual focus when Tab navigates away from the calendar\n if (e.key === 'Tab' && focusedDayRef.current) {\n setTimeout(() => {\n focusedDayRef.current?.classList.remove('focusedDay');\n focusedDayRef.current = null;\n }, 0);\n }\n },\n });\n\n useEffect(() => {\n // When the filters change, we need to update the popper position,\n // because the filter bar might push the datatable up or down, causing the popper to be misaligned\n void actionRef.current.update?.();\n }, [filters]);\n\n return (\n <div\n // This is here to prevent propagation, and not trigger the sort functionality\n onClick={(e) => e.stopPropagation()}\n onKeyDown={handleMenuOnKeyDown}\n >\n <FilterButton\n hide={!isIconVisible}\n data-testid={DATA_TESTID.DATA_TABLE_FILTER_BUTTON}\n getOwnerProps={getOwnerProps}\n >\n <DSButtonV2\n buttonType=\"icon\"\n size=\"s\"\n onClick={handleTriggerClick}\n onFocus={handleTriggerOnFocus}\n onBlur={handleTriggerOnBlur}\n innerRef={mergeRefs(isIconVisible && setButtonReference, innerRef)}\n tabIndex={reduxHeader?.withTabStops ? 0 : -1}\n aria-label={ariaLabel}\n aria-hidden={!isButtonFocused}\n data-testid={DATA_TESTID.DATA_TABLE_FILTER_BUTTON_ELEMENT}\n >\n {triggerIcon}\n </DSButtonV2>\n </FilterButton>\n {(columnReference || buttonReference) && (\n <StyledPoppoverJS\n actionRef={actionRef}\n referenceElement={columnReference || buttonReference}\n showPopover={isMenuOpen}\n closeContextMenu={handleClickOutsideMenu}\n data-testid={DATA_TESTID.DATA_TABLE_FILTER_MENU_CONTENT}\n startPlacementPreference=\"bottom-end\"\n customOffset={columnReference ? [0, 1] : [5, 4]}\n withoutArrow\n withoutAnimation\n extraPopperStyles={{\n ...customStyles,\n minWidth: column.ref?.current?.offsetWidth ?? '0px',\n }}\n placementOrderPreference={['bottom-end', 'top-end']}\n getOwnerProps={getOwnerProps}\n getOwnerPropsArguments={getOwnerPropsArguments}\n role=\"dialog\"\n aria-label={`Filter by ${column.Header as string}`}\n >\n <PopperContent getOwnerProps={getOwnerProps} innerRef={popoverContentRef} onKeyDown={handleOnKeyDown}>\n {menuContent}\n </PopperContent>\n </StyledPoppoverJS>\n )}\n </div>\n );\n};\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
import { useEffect, useRef } from "react";
|
|
3
|
+
const DEFAULT_FOCUSABLE_SELECTOR = 'button:not([disabled]):not([tabindex="-1"]), [href], input:not([disabled]):not([tabindex="-1"]), select:not([disabled]), button[data-isfocused="true"],textarea:not([disabled]), [tabindex]:not([tabindex="-1"]):not([disabled])';
|
|
4
|
+
const useTrackFocusableElements = ({
|
|
5
|
+
containerRef,
|
|
6
|
+
selector = DEFAULT_FOCUSABLE_SELECTOR,
|
|
7
|
+
dependencies = []
|
|
8
|
+
}) => {
|
|
9
|
+
const firstElementRef = useRef(null);
|
|
10
|
+
const lastElementRef = useRef(null);
|
|
11
|
+
useEffect(() => {
|
|
12
|
+
const container = containerRef && "current" in containerRef ? containerRef.current : containerRef;
|
|
13
|
+
if (!container) return;
|
|
14
|
+
const elements = container.querySelectorAll(selector);
|
|
15
|
+
if (elements.length > 0) {
|
|
16
|
+
const [firstElement] = elements;
|
|
17
|
+
firstElementRef.current = firstElement;
|
|
18
|
+
lastElementRef.current = elements[elements.length - 1];
|
|
19
|
+
} else {
|
|
20
|
+
firstElementRef.current = null;
|
|
21
|
+
lastElementRef.current = null;
|
|
22
|
+
}
|
|
23
|
+
}, [containerRef, selector, ...dependencies]);
|
|
24
|
+
return { firstElementRef, lastElementRef };
|
|
25
|
+
};
|
|
26
|
+
export {
|
|
27
|
+
useTrackFocusableElements
|
|
28
|
+
};
|
|
29
|
+
//# sourceMappingURL=useTrackFocusableElements.js.map
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
{
|
|
2
|
+
"version": 3,
|
|
3
|
+
"sources": ["../../../../../../../scripts/build/transpile/react-shim.js", "../../../../src/exported-related/FilterPopover/useTrackFocusableElements.ts"],
|
|
4
|
+
"sourcesContent": ["import * as React from 'react';\nexport { React };\n", "import { useEffect, useRef } from 'react';\n\n/**\n * Tracks the first and last focusable elements in a container.\n * Used by the FilterPopover focus trap.\n */\ninterface UseTrackFocusableElementsConfig {\n /** Container element (HTMLElement or RefObject) */\n containerRef: React.RefObject<HTMLElement> | HTMLElement | null;\n\n /** CSS selector for focusable elements */\n selector?: string;\n\n /** Dependencies to trigger re-scan */\n dependencies?: React.DependencyList;\n}\n\nconst DEFAULT_FOCUSABLE_SELECTOR =\n 'button:not([disabled]):not([tabindex=\"-1\"]), ' +\n '[href], ' +\n 'input:not([disabled]):not([tabindex=\"-1\"]), ' +\n 'select:not([disabled]), ' +\n 'button[data-isfocused=\"true\"],' +\n 'textarea:not([disabled]), ' +\n '[tabindex]:not([tabindex=\"-1\"]):not([disabled])';\n\nexport const useTrackFocusableElements = ({\n containerRef,\n selector = DEFAULT_FOCUSABLE_SELECTOR,\n dependencies = [],\n}: UseTrackFocusableElementsConfig) => {\n const firstElementRef = useRef<HTMLElement | null>(null);\n const lastElementRef = useRef<HTMLElement | null>(null);\n\n useEffect(() => {\n const container = containerRef && 'current' in containerRef ? containerRef.current : containerRef;\n\n if (!container) return;\n\n const elements = container.querySelectorAll<HTMLElement>(selector);\n\n if (elements.length > 0) {\n const [firstElement] = elements;\n firstElementRef.current = firstElement;\n lastElementRef.current = elements[elements.length - 1];\n } else {\n firstElementRef.current = null;\n lastElementRef.current = null;\n }\n // Spread operator is intentionally used to allow consumers to pass dynamic dependencies.\n // ESLint cannot statically verify spread elements, but this pattern enables flexible hook composition.\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [containerRef, selector, ...dependencies]);\n\n return { firstElementRef, lastElementRef };\n};\n"],
|
|
5
|
+
"mappings": "AAAA,YAAY,WAAW;ACAvB,SAAS,WAAW,cAAc;AAiBlC,MAAM,6BACJ;AAQK,MAAM,4BAA4B,CAAC;AAAA,EACxC;AAAA,EACA,WAAW;AAAA,EACX,eAAe,CAAC;AAClB,MAAuC;AACrC,QAAM,kBAAkB,OAA2B,IAAI;AACvD,QAAM,iBAAiB,OAA2B,IAAI;AAEtD,YAAU,MAAM;AACd,UAAM,YAAY,gBAAgB,aAAa,eAAe,aAAa,UAAU;AAErF,QAAI,CAAC,UAAW;AAEhB,UAAM,WAAW,UAAU,iBAA8B,QAAQ;AAEjE,QAAI,SAAS,SAAS,GAAG;AACvB,YAAM,CAAC,YAAY,IAAI;AACvB,sBAAgB,UAAU;AAC1B,qBAAe,UAAU,SAAS,SAAS,SAAS,CAAC;AAAA,IACvD,OAAO;AACL,sBAAgB,UAAU;AAC1B,qBAAe,UAAU;AAAA,IAC3B;AAAA,EAIF,GAAG,CAAC,cAAc,UAAU,GAAG,YAAY,CAAC;AAE5C,SAAO,EAAE,iBAAiB,eAAe;AAC3C;",
|
|
6
|
+
"names": []
|
|
7
|
+
}
|
|
@@ -2,7 +2,7 @@ import * as React from "react";
|
|
|
2
2
|
import { jsx } from "react/jsx-runtime";
|
|
3
3
|
import { DSButtonV2 } from "@elliemae/ds-button-v2";
|
|
4
4
|
import { MoreOptionsVert } from "@elliemae/ds-icons";
|
|
5
|
-
import { DSDropdownMenu } from "@elliemae/ds-dropdownmenu";
|
|
5
|
+
import { DSDropdownMenu } from "@elliemae/ds-legacy-dropdownmenu";
|
|
6
6
|
import { DATA_TESTID } from "../../configs/index.js";
|
|
7
7
|
const DeprecatedDropdown = ({
|
|
8
8
|
finalIsOpen,
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../../../../../../scripts/build/transpile/react-shim.js", "../../../../src/parts/FilterBar/DeprecatedDropdown.tsx"],
|
|
4
|
-
"sourcesContent": ["import * as React from 'react';\nexport { React };\n", "// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-nocheck This is using the deprecated dropdown menu\nimport React from 'react';\nimport { DSButtonV2 } from '@elliemae/ds-button-v2';\nimport { MoreOptionsVert } from '@elliemae/ds-icons';\nimport { DSDropdownMenu } from '@elliemae/ds-dropdownmenu';\nimport { DATA_TESTID } from '../../configs/index.js';\nimport type { DSDataTableT } from '../../react-desc-prop-types.js';\n\ninterface DeprecatedDropdownProps {\n finalIsOpen: boolean;\n onFilterBarClose: () => void;\n onFilterBarOnClickOutside: () => void;\n removeAllFilters: () => void;\n filterBarProps: DSDataTableT.Props['filterBarProps'];\n dropdownMenuRef: React.MutableRefObject<HTMLButtonElement | null>;\n onTriggerClick: () => void;\n}\n\nexport const DeprecatedDropdown: React.ComponentType<DeprecatedDropdownProps> = ({\n finalIsOpen,\n onFilterBarClose,\n onFilterBarOnClickOutside,\n removeAllFilters,\n filterBarProps,\n dropdownMenuRef,\n onTriggerClick,\n}) => (\n <DSDropdownMenu\n preventOverflow=\"scrollParent\"\n isOpen={finalIsOpen}\n onClose={onFilterBarClose}\n onClickOutsideMenu={onFilterBarOnClickOutside}\n options={[\n {\n id: '__internal__option__clear__filters',\n label: 'Clear Filters',\n onClick: removeAllFilters,\n onKeyDown: (e: React.KeyboardEvent) => {\n if (['Enter', 'Space'].includes(e.code)) removeAllFilters();\n },\n },\n ...(filterBarProps?.extraOptions || []).map((option) => ({\n ...option,\n onKeyDown: (e: React.KeyboardEvent) => {\n if (['Enter', 'Space'].includes(e.code)) option?.onClick?.(e);\n },\n })),\n ]}\n triggerComponent={\n <DSButtonV2\n data-testid={DATA_TESTID.DATA_TABLE_FILTER_BAR_DD_MENU_BUTTON}\n buttonType=\"icon\"\n innerRef={dropdownMenuRef}\n onClick={onTriggerClick}\n aria-label=\"Filter bar addon\"\n style={{ marginLeft: 'auto' }}\n >\n <MoreOptionsVert />\n </DSButtonV2>\n }\n />\n);\n"],
|
|
4
|
+
"sourcesContent": ["import * as React from 'react';\nexport { React };\n", "// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-nocheck This is using the deprecated dropdown menu\nimport React from 'react';\nimport { DSButtonV2 } from '@elliemae/ds-button-v2';\nimport { MoreOptionsVert } from '@elliemae/ds-icons';\nimport { DSDropdownMenu } from '@elliemae/ds-legacy-dropdownmenu';\nimport { DATA_TESTID } from '../../configs/index.js';\nimport type { DSDataTableT } from '../../react-desc-prop-types.js';\n\ninterface DeprecatedDropdownProps {\n finalIsOpen: boolean;\n onFilterBarClose: () => void;\n onFilterBarOnClickOutside: () => void;\n removeAllFilters: () => void;\n filterBarProps: DSDataTableT.Props['filterBarProps'];\n dropdownMenuRef: React.MutableRefObject<HTMLButtonElement | null>;\n onTriggerClick: () => void;\n}\n\nexport const DeprecatedDropdown: React.ComponentType<DeprecatedDropdownProps> = ({\n finalIsOpen,\n onFilterBarClose,\n onFilterBarOnClickOutside,\n removeAllFilters,\n filterBarProps,\n dropdownMenuRef,\n onTriggerClick,\n}) => (\n <DSDropdownMenu\n preventOverflow=\"scrollParent\"\n isOpen={finalIsOpen}\n onClose={onFilterBarClose}\n onClickOutsideMenu={onFilterBarOnClickOutside}\n options={[\n {\n id: '__internal__option__clear__filters',\n label: 'Clear Filters',\n onClick: removeAllFilters,\n onKeyDown: (e: React.KeyboardEvent) => {\n if (['Enter', 'Space'].includes(e.code)) removeAllFilters();\n },\n },\n ...(filterBarProps?.extraOptions || []).map((option) => ({\n ...option,\n onKeyDown: (e: React.KeyboardEvent) => {\n if (['Enter', 'Space'].includes(e.code)) option?.onClick?.(e);\n },\n })),\n ]}\n triggerComponent={\n <DSButtonV2\n data-testid={DATA_TESTID.DATA_TABLE_FILTER_BAR_DD_MENU_BUTTON}\n buttonType=\"icon\"\n innerRef={dropdownMenuRef}\n onClick={onTriggerClick}\n aria-label=\"Filter bar addon\"\n style={{ marginLeft: 'auto' }}\n >\n <MoreOptionsVert />\n </DSButtonV2>\n }\n />\n);\n"],
|
|
5
5
|
"mappings": "AAAA,YAAY,WAAW;AC0Df;AAvDR,SAAS,kBAAkB;AAC3B,SAAS,uBAAuB;AAChC,SAAS,sBAAsB;AAC/B,SAAS,mBAAmB;AAarB,MAAM,qBAAmE,CAAC;AAAA,EAC/E;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AACF,MACE;AAAA,EAAC;AAAA;AAAA,IACC,iBAAgB;AAAA,IAChB,QAAQ;AAAA,IACR,SAAS;AAAA,IACT,oBAAoB;AAAA,IACpB,SAAS;AAAA,MACP;AAAA,QACE,IAAI;AAAA,QACJ,OAAO;AAAA,QACP,SAAS;AAAA,QACT,WAAW,CAAC,MAA2B;AACrC,cAAI,CAAC,SAAS,OAAO,EAAE,SAAS,EAAE,IAAI,EAAG,kBAAiB;AAAA,QAC5D;AAAA,MACF;AAAA,MACA,IAAI,gBAAgB,gBAAgB,CAAC,GAAG,IAAI,CAAC,YAAY;AAAA,QACvD,GAAG;AAAA,QACH,WAAW,CAAC,MAA2B;AACrC,cAAI,CAAC,SAAS,OAAO,EAAE,SAAS,EAAE,IAAI,EAAG,SAAQ,UAAU,CAAC;AAAA,QAC9D;AAAA,MACF,EAAE;AAAA,IACJ;AAAA,IACA,kBACE;AAAA,MAAC;AAAA;AAAA,QACC,eAAa,YAAY;AAAA,QACzB,YAAW;AAAA,QACX,UAAU;AAAA,QACV,SAAS;AAAA,QACT,cAAW;AAAA,QACX,OAAO,EAAE,YAAY,OAAO;AAAA,QAE5B,8BAAC,mBAAgB;AAAA;AAAA,IACnB;AAAA;AAEJ;",
|
|
6
6
|
"names": []
|
|
7
7
|
}
|
|
@@ -3,6 +3,7 @@ import type { DSDataTableT } from '../../react-desc-prop-types.js';
|
|
|
3
3
|
export interface FilterPopoverProps {
|
|
4
4
|
column: DSDataTableT.InternalColumn;
|
|
5
5
|
columnId: string;
|
|
6
|
+
columnReference?: HTMLElement | null;
|
|
6
7
|
triggerIcon: JSX.Element;
|
|
7
8
|
menuContent: JSX.Element;
|
|
8
9
|
onTriggerClick?: (id: string, e: React.MouseEvent | React.KeyboardEvent) => void;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Tracks the first and last focusable elements in a container.
|
|
3
|
+
* Used by the FilterPopover focus trap.
|
|
4
|
+
*/
|
|
5
|
+
interface UseTrackFocusableElementsConfig {
|
|
6
|
+
/** Container element (HTMLElement or RefObject) */
|
|
7
|
+
containerRef: React.RefObject<HTMLElement> | HTMLElement | null;
|
|
8
|
+
/** CSS selector for focusable elements */
|
|
9
|
+
selector?: string;
|
|
10
|
+
/** Dependencies to trigger re-scan */
|
|
11
|
+
dependencies?: React.DependencyList;
|
|
12
|
+
}
|
|
13
|
+
export declare const useTrackFocusableElements: ({ containerRef, selector, dependencies, }: UseTrackFocusableElementsConfig) => {
|
|
14
|
+
firstElementRef: import("react").MutableRefObject<HTMLElement | null>;
|
|
15
|
+
lastElementRef: import("react").MutableRefObject<HTMLElement | null>;
|
|
16
|
+
};
|
|
17
|
+
export {};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@elliemae/ds-data-table",
|
|
3
|
-
"version": "3.60.0-next.
|
|
3
|
+
"version": "3.60.0-next.21",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"description": "ICE MT - Dimsum - Data Table",
|
|
6
6
|
"files": [
|
|
@@ -35,64 +35,62 @@
|
|
|
35
35
|
"reportFile": "tests.xml",
|
|
36
36
|
"indent": 4
|
|
37
37
|
},
|
|
38
|
-
"scripts": {
|
|
39
|
-
"dev": "cross-env NODE_ENV=development node ../../../scripts/build/build.mjs --watch",
|
|
40
|
-
"test": "playwright test -c ./playwright.config.mjs && pui-cli test --passWithNoTests --coverage=\"false\"",
|
|
41
|
-
"lint": "node ../../../scripts/lint.mjs --fix",
|
|
42
|
-
"lint:strict": "node ../../../scripts/lint-strict.mjs",
|
|
43
|
-
"dts": "node ../../../scripts/dts.mjs",
|
|
44
|
-
"build": "cross-env NODE_ENV=production node ../../../scripts/build/build.mjs",
|
|
45
|
-
"checkDeps": "npm exec ../../util/ds-codemods -- check-missing-packages --projectFolderPath=\"./\" --ignorePackagesGlobPattern=\"\" --ignoreFilesGlobPattern=\"**/test-ables/*,**/tests/*\""
|
|
46
|
-
},
|
|
47
38
|
"dependencies": {
|
|
48
|
-
"@elliemae/ds-
|
|
49
|
-
"
|
|
50
|
-
"
|
|
51
|
-
"
|
|
52
|
-
"@elliemae/ds-
|
|
53
|
-
"@elliemae/ds-
|
|
54
|
-
"@elliemae/ds-
|
|
55
|
-
"@elliemae/ds-
|
|
56
|
-
"@elliemae/ds-form-
|
|
57
|
-
"@elliemae/ds-form-
|
|
58
|
-
"@elliemae/ds-form-
|
|
59
|
-
"@elliemae/ds-form-
|
|
60
|
-
"@elliemae/ds-form-
|
|
61
|
-
"@elliemae/ds-
|
|
62
|
-
"@elliemae/ds-
|
|
63
|
-
"@elliemae/ds-
|
|
64
|
-
"@elliemae/ds-
|
|
65
|
-
"@elliemae/ds-
|
|
66
|
-
"@elliemae/ds-
|
|
67
|
-
"@elliemae/ds-
|
|
68
|
-
"@elliemae/ds-
|
|
69
|
-
"@elliemae/ds-
|
|
70
|
-
"@elliemae/ds-
|
|
71
|
-
"@elliemae/ds-
|
|
72
|
-
"@elliemae/ds-
|
|
73
|
-
"
|
|
74
|
-
"
|
|
75
|
-
"
|
|
39
|
+
"@elliemae/ds-legacy-dropdownmenu": "1.0.16",
|
|
40
|
+
"react-virtual": "~2.10.4",
|
|
41
|
+
"uid": "^2.0.2",
|
|
42
|
+
"use-onclickoutside": "0.4.1",
|
|
43
|
+
"@elliemae/ds-button-v2": "3.60.0-next.21",
|
|
44
|
+
"@elliemae/ds-circular-progress-indicator": "3.60.0-next.21",
|
|
45
|
+
"@elliemae/ds-drag-and-drop": "3.60.0-next.21",
|
|
46
|
+
"@elliemae/ds-dropdownmenu-v2": "3.60.0-next.21",
|
|
47
|
+
"@elliemae/ds-form-checkbox": "3.60.0-next.21",
|
|
48
|
+
"@elliemae/ds-form-combobox": "3.60.0-next.21",
|
|
49
|
+
"@elliemae/ds-form-date-range-picker": "3.60.0-next.21",
|
|
50
|
+
"@elliemae/ds-form-date-time-picker": "3.60.0-next.21",
|
|
51
|
+
"@elliemae/ds-form-helpers-mask-hooks": "3.60.0-next.21",
|
|
52
|
+
"@elliemae/ds-form-input-text": "3.60.0-next.21",
|
|
53
|
+
"@elliemae/ds-form-layout-blocks": "3.60.0-next.21",
|
|
54
|
+
"@elliemae/ds-form-radio": "3.60.0-next.21",
|
|
55
|
+
"@elliemae/ds-grid": "3.60.0-next.21",
|
|
56
|
+
"@elliemae/ds-menu-button": "3.60.0-next.21",
|
|
57
|
+
"@elliemae/ds-pagination": "3.60.0-next.21",
|
|
58
|
+
"@elliemae/ds-icons": "3.60.0-next.21",
|
|
59
|
+
"@elliemae/ds-pills-v2": "3.60.0-next.21",
|
|
60
|
+
"@elliemae/ds-popperjs": "3.60.0-next.21",
|
|
61
|
+
"@elliemae/ds-props-helpers": "3.60.0-next.21",
|
|
62
|
+
"@elliemae/ds-skeleton": "3.60.0-next.21",
|
|
63
|
+
"@elliemae/ds-system": "3.60.0-next.21",
|
|
64
|
+
"@elliemae/ds-truncated-tooltip-text": "3.60.0-next.21",
|
|
65
|
+
"@elliemae/ds-typescript-helpers": "3.60.0-next.21",
|
|
66
|
+
"@elliemae/ds-zustand-helpers": "3.60.0-next.21"
|
|
76
67
|
},
|
|
77
68
|
"devDependencies": {
|
|
78
|
-
"
|
|
79
|
-
"
|
|
80
|
-
"
|
|
81
|
-
"@elliemae/
|
|
82
|
-
"
|
|
83
|
-
"
|
|
84
|
-
"styled-system": "catalog:"
|
|
69
|
+
"jest": "^30.0.0",
|
|
70
|
+
"styled-components": "~5.3.9",
|
|
71
|
+
"styled-system": "^5.1.5",
|
|
72
|
+
"@elliemae/ds-monorepo-devops": "3.60.0-next.21",
|
|
73
|
+
"@elliemae/ds-test-utils": "3.60.0-next.21",
|
|
74
|
+
"@elliemae/ds-toolbar-v2": "3.60.0-next.21"
|
|
85
75
|
},
|
|
86
76
|
"peerDependencies": {
|
|
87
|
-
"lodash-es": "
|
|
88
|
-
"react": "
|
|
89
|
-
"react-dom": "
|
|
90
|
-
"styled-components": "
|
|
91
|
-
"styled-system": "
|
|
77
|
+
"lodash-es": "^4.17.21",
|
|
78
|
+
"react": "^18.3.1",
|
|
79
|
+
"react-dom": "^18.3.1",
|
|
80
|
+
"styled-components": "~5.3.9",
|
|
81
|
+
"styled-system": "^5.1.5"
|
|
92
82
|
},
|
|
93
83
|
"publishConfig": {
|
|
94
84
|
"access": "public",
|
|
95
85
|
"typeSafety": false
|
|
96
86
|
},
|
|
97
|
-
"
|
|
98
|
-
|
|
87
|
+
"scripts": {
|
|
88
|
+
"dev": "cross-env NODE_ENV=development node ../../../scripts/build/build.mjs --watch",
|
|
89
|
+
"test": "playwright test -c ./playwright.config.mjs && ds-monorepo-devops test --passWithNoTests --coverage=\"false\"",
|
|
90
|
+
"lint": "node ../../../scripts/lint.mjs --fix",
|
|
91
|
+
"lint:strict": "node ../../../scripts/lint-strict.mjs",
|
|
92
|
+
"dts": "node ../../../scripts/dts.mjs",
|
|
93
|
+
"build": "cross-env NODE_ENV=production node ../../../scripts/build/build.mjs",
|
|
94
|
+
"checkDeps": "npx -yes ../../util/ds-codemods check-missing-packages --projectFolderPath=\"./\" --ignorePackagesGlobPattern=\"\" --ignoreFilesGlobPattern=\"**/test-ables/*,**/tests/*\""
|
|
95
|
+
}
|
|
96
|
+
}
|