UNPKG

@primer/components

Version:
147 lines (125 loc) 6.1 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.SelectPanel = SelectPanel; var _react = _interopRequireWildcard(require("react")); var _FilteredActionList = require("../FilteredActionList"); var _DropdownMenu = require("../DropdownMenu"); var _AnchoredOverlay = require("../AnchoredOverlay"); var _useProvidedStateOrCreate = require("../hooks/useProvidedStateOrCreate"); var _hooks = require("../hooks"); function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function (nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } function _extends() { _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; }; return _extends.apply(this, arguments); } function isMultiSelectVariant(selected) { return Array.isArray(selected); } const focusZoneSettings = { // Let FilteredActionList handle focus zone disabled: true }; function SelectPanel({ open, onOpenChange, renderAnchor = props => /*#__PURE__*/_react.default.createElement(_DropdownMenu.DropdownButton, props), anchorRef: externalAnchorRef, placeholder, selected, onSelectedChange, filterValue: externalFilterValue, onFilterChange: externalOnFilterChange, items, textInputProps, overlayProps, sx, ...listProps }) { const [filterValue, setInternalFilterValue] = (0, _useProvidedStateOrCreate.useProvidedStateOrCreate)(externalFilterValue, undefined, ''); const onFilterChange = (0, _react.useCallback)((value, e) => { externalOnFilterChange(value, e); setInternalFilterValue(value); }, [externalOnFilterChange, setInternalFilterValue]); const anchorRef = (0, _hooks.useProvidedRefOrCreate)(externalAnchorRef); const onOpen = (0, _react.useCallback)(gesture => onOpenChange(true, gesture), [onOpenChange]); const onClose = (0, _react.useCallback)(gesture => { onOpenChange(false, gesture); }, [onOpenChange]); const renderMenuAnchor = (0, _react.useMemo)(() => { if (renderAnchor === null) { return null; } const selectedItems = Array.isArray(selected) ? selected : [...(selected ? [selected] : [])]; return props => { return renderAnchor({ ...props, children: selectedItems.length ? selectedItems.map(item => item.text).join(', ') : placeholder }); }; }, [placeholder, renderAnchor, selected]); const itemsToRender = (0, _react.useMemo)(() => { return items.map(item => { const isItemSelected = isMultiSelectVariant(selected) ? selected.includes(item) : selected === item; return { ...item, role: 'option', selected: 'selected' in item && item.selected === undefined ? undefined : isItemSelected, onAction: (itemFromAction, event) => { var _item$onAction; (_item$onAction = item.onAction) === null || _item$onAction === void 0 ? void 0 : _item$onAction.call(item, itemFromAction, event); if (event.defaultPrevented) { return; } if (isMultiSelectVariant(selected)) { const otherSelectedItems = selected.filter(selectedItem => selectedItem !== item); const newSelectedItems = selected.includes(item) ? otherSelectedItems : [...otherSelectedItems, item]; const multiSelectOnChange = onSelectedChange; multiSelectOnChange(newSelectedItems); return; } // single select const singleSelectOnChange = onSelectedChange; singleSelectOnChange(item === selected ? undefined : item); onClose('selection'); } }; }); }, [onClose, onSelectedChange, items, selected]); const inputRef = _react.default.useRef(null); const focusTrapSettings = { initialFocusRef: inputRef }; const extendedTextInputProps = (0, _react.useMemo)(() => { return { sx: { m: 2 }, contrast: true, ...textInputProps }; }, [textInputProps]); return /*#__PURE__*/_react.default.createElement(_AnchoredOverlay.AnchoredOverlay, { renderAnchor: renderMenuAnchor, anchorRef: anchorRef, open: open, onOpen: onOpen, onClose: onClose, overlayProps: overlayProps, focusTrapSettings: focusTrapSettings, focusZoneSettings: focusZoneSettings }, /*#__PURE__*/_react.default.createElement(_FilteredActionList.FilteredActionList, _extends({ filterValue: filterValue, onFilterChange: onFilterChange }, listProps, { role: "listbox", items: itemsToRender, selectionVariant: isMultiSelectVariant(selected) ? 'multiple' : 'single', textInputProps: extendedTextInputProps, inputRef: inputRef // inheriting height and maxHeight ensures that the FilteredActionList is never taller // than the Overlay (which would break scrolling the items) , sx: { ...sx, height: 'inherit', maxHeight: 'inherit' } }))); } SelectPanel.displayName = "SelectPanel"; SelectPanel.displayName = 'SelectPanel';