UNPKG

@mui/x-tree-view

Version:

The community edition of the MUI X Tree View components.

116 lines (114 loc) 4 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault").default; Object.defineProperty(exports, "__esModule", { value: true }); exports.useTreeViewFocus = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _useEventCallback = _interopRequireDefault(require("@mui/utils/useEventCallback")); var _useInstanceEventHandler = require("../../hooks/useInstanceEventHandler"); var _useTreeViewFocus = require("./useTreeViewFocus.selectors"); var _useTreeViewExpansion = require("../useTreeViewExpansion/useTreeViewExpansion.selectors"); var _useTreeViewItems = require("../useTreeViewItems/useTreeViewItems.selectors"); const useTreeViewFocus = ({ instance, params, store }) => { const setFocusedItemId = (0, _useEventCallback.default)(itemId => { store.update(prevState => { const focusedItemId = (0, _useTreeViewFocus.selectorFocusedItemId)(prevState); if (focusedItemId === itemId) { return prevState; } return (0, _extends2.default)({}, prevState, { focus: (0, _extends2.default)({}, prevState.focus, { focusedItemId: itemId }) }); }); }); const isItemVisible = itemId => { const itemMeta = (0, _useTreeViewItems.selectorItemMeta)(store.value, itemId); return itemMeta && (itemMeta.parentId == null || (0, _useTreeViewExpansion.selectorIsItemExpanded)(store.value, itemMeta.parentId)); }; const innerFocusItem = (event, itemId) => { const itemElement = instance.getItemDOMElement(itemId); if (itemElement) { itemElement.focus(); } setFocusedItemId(itemId); if (params.onItemFocus) { params.onItemFocus(event, itemId); } }; const focusItem = (0, _useEventCallback.default)((event, itemId) => { // If we receive an itemId, and it is visible, the focus will be set to it if (isItemVisible(itemId)) { innerFocusItem(event, itemId); } }); const removeFocusedItem = (0, _useEventCallback.default)(() => { const focusedItemId = (0, _useTreeViewFocus.selectorFocusedItemId)(store.value); if (focusedItemId == null) { return; } const itemMeta = (0, _useTreeViewItems.selectorItemMeta)(store.value, focusedItemId); if (itemMeta) { const itemElement = instance.getItemDOMElement(focusedItemId); if (itemElement) { itemElement.blur(); } } setFocusedItemId(null); }); (0, _useInstanceEventHandler.useInstanceEventHandler)(instance, 'removeItem', ({ id }) => { const focusedItemId = (0, _useTreeViewFocus.selectorFocusedItemId)(store.value); const defaultFocusableItemId = (0, _useTreeViewFocus.selectorDefaultFocusableItemId)(store.value); if (focusedItemId === id && defaultFocusableItemId != null) { innerFocusItem(null, defaultFocusableItemId); } }); const createRootHandleFocus = otherHandlers => event => { otherHandlers.onFocus?.(event); if (event.defaultMuiPrevented) { return; } // if the event bubbled (which is React specific) we don't want to steal focus const defaultFocusableItemId = (0, _useTreeViewFocus.selectorDefaultFocusableItemId)(store.value); if (event.target === event.currentTarget && defaultFocusableItemId != null) { innerFocusItem(event, defaultFocusableItemId); } }; const createRootHandleBlur = otherHandlers => event => { otherHandlers.onBlur?.(event); if (event.defaultMuiPrevented) { return; } setFocusedItemId(null); }; return { getRootProps: otherHandlers => ({ onFocus: createRootHandleFocus(otherHandlers), onBlur: createRootHandleBlur(otherHandlers) }), publicAPI: { focusItem }, instance: { focusItem, removeFocusedItem } }; }; exports.useTreeViewFocus = useTreeViewFocus; useTreeViewFocus.getInitialState = () => ({ focus: { focusedItemId: null } }); useTreeViewFocus.params = { onItemFocus: true };