UNPKG

@fluentui/react-northstar

Version:
258 lines (255 loc) 10.2 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); exports.__esModule = true; exports.treeItemClassName = exports.TreeItem = void 0; var _invoke2 = _interopRequireDefault(require("lodash/invoke")); var _accessibility = require("@fluentui/accessibility"); var _reactBindings = require("@fluentui/react-bindings"); var customPropTypes = _interopRequireWildcard(require("@fluentui/react-proptypes")); var PropTypes = _interopRequireWildcard(require("prop-types")); var React = _interopRequireWildcard(require("react")); var _reactComponentRef = require("@fluentui/react-component-ref"); var _utils = require("../../utils"); var _TreeTitle = require("./TreeTitle"); var _context = require("./context"); function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(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; } var treeItemClassName = 'ui-tree__item'; /** * A TreeItem renders an item of a Tree. * * @accessibility * Implements [ARIA TreeView](https://www.w3.org/TR/wai-aria-practices-1.1/#TreeView) design pattern. */ exports.treeItemClassName = treeItemClassName; var TreeItem = /*#__PURE__*/React.forwardRef(function (props, ref) { var context = (0, _reactBindings.useFluentContext)(); var _useTelemetry = (0, _reactBindings.useTelemetry)(TreeItem.displayName, context.telemetry), setStart = _useTelemetry.setStart, setEnd = _useTelemetry.setEnd; setStart(); var accessibility = props.accessibility, children = props.children, className = props.className, contentRef = props.contentRef, design = props.design, title = props.title, renderItemTitle = props.renderItemTitle, expanded = props.expanded, level = props.level, index = props.index, styles = props.styles, variables = props.variables, treeSize = props.treeSize, selectionIndicator = props.selectionIndicator, selectable = props.selectable, id = props.id, parent = props.parent; var _React$useContext = React.useContext(_context.TreeContext), getItemById = _React$useContext.getItemById, registerItemRef = _React$useContext.registerItemRef, toggleItemActive = _React$useContext.toggleItemActive, focusItemById = _React$useContext.focusItemById, expandSiblings = _React$useContext.expandSiblings, toggleItemSelect = _React$useContext.toggleItemSelect, getToFocusIDByFirstCharacter = _React$useContext.getToFocusIDByFirstCharacter; var _getItemById = getItemById(id), selected = _getItemById.selected, hasSubtree = _getItemById.hasSubtree, childrenIds = _getItemById.childrenIds; var getA11Props = (0, _reactBindings.useAccessibility)(accessibility, { actionHandlers: { performClick: function performClick(e) { if ((0, _utils.shouldPreventDefaultOnKeyDown)(e)) { e.preventDefault(); } e.stopPropagation(); toggleItemActive(e, id); (0, _invoke2.default)(props, 'onTitleClick', e, props); }, focusParent: function focusParent(e) { e.preventDefault(); e.stopPropagation(); handleFocusParent(e); }, collapse: function collapse(e) { e.preventDefault(); e.stopPropagation(); toggleItemActive(e, id); }, expand: function expand(e) { e.preventDefault(); e.stopPropagation(); toggleItemActive(e, id); }, focusFirstChild: function focusFirstChild(e) { e.preventDefault(); e.stopPropagation(); handleFocusFirstChild(e); }, expandSiblings: function expandSiblings(e) { e.preventDefault(); e.stopPropagation(); handleSiblingsExpand(e); }, performSelection: function performSelection(e) { e.preventDefault(); e.stopPropagation(); handleSelection(e); } }, debugName: TreeItem.displayName, mapPropsToBehavior: function mapPropsToBehavior() { return { expanded: expanded, level: level, index: index, hasSubtree: hasSubtree, treeSize: treeSize, selected: selected === true, selectable: selectable, indeterminate: selected === 'indeterminate' }; }, rtl: context.rtl }); var _useStyles = (0, _reactBindings.useStyles)(TreeItem.displayName, { className: treeItemClassName, mapPropsToStyles: function mapPropsToStyles() { return { level: level, selectable: selectable }; }, mapPropsToInlineStyles: function mapPropsToInlineStyles() { return { className: className, design: design, styles: styles, variables: variables }; }, rtl: context.rtl, unstyled: props.unstyled }), classes = _useStyles.classes; var handleSelection = function handleSelection(e) { if (selectable) { toggleItemSelect(e, id); } (0, _invoke2.default)(props, 'onTitleClick', e, props); }; var handleFocusFirstChild = function handleFocusFirstChild(e) { (0, _invoke2.default)(props, 'onFocusFirstChild', e, props); focusItemById(childrenIds == null ? void 0 : childrenIds[0]); }; var handleFocusParent = function handleFocusParent(e) { (0, _invoke2.default)(props, 'onFocusParent', e, props); focusItemById(parent); }; var handleSiblingsExpand = function handleSiblingsExpand(e) { (0, _invoke2.default)(props, 'onSiblingsExpand', e, props); expandSiblings(e, props.id); }; var handleTitleOverrides = function handleTitleOverrides(predefinedProps) { return { id: id, onClick: function onClick(e, titleProps) { (0, _invoke2.default)(props, 'onTitleClick', e, props); (0, _invoke2.default)(predefinedProps, 'onClick', e, titleProps); } }; }; var handleClick = function handleClick(e) { if (e.target === e.currentTarget) { // onClick listener for mouse click on treeItem DOM only, // which could be triggered by VO+space on selectable tree parent node handleSelection(e); } (0, _invoke2.default)(props, 'onClick', e, props); }; var handleKeyDown = function handleKeyDown(e) { if (e.key && e.key.length === 1 && e.key.match(/\S/) && e.key !== '*' && !e.altKey && !e.ctrlKey && !e.metaKey) { e.preventDefault(); e.stopPropagation(); var toFocusID = getToFocusIDByFirstCharacter(e, props.id); if (toFocusID !== props.id) { focusItemById(toFocusID); } } (0, _invoke2.default)(props, 'onKeyDown', e, props); }; var elementRef = React.useCallback(function (node) { registerItemRef(id, node); (0, _reactComponentRef.handleRef)(contentRef, node); (0, _reactComponentRef.handleRef)(ref, node); }, [id, contentRef, registerItemRef, ref]); var ElementType = (0, _reactBindings.getElementType)(props); var unhandledProps = (0, _reactBindings.useUnhandledProps)(TreeItem.handledProps, props); var element = /*#__PURE__*/React.createElement(ElementType, getA11Props('root', Object.assign({ className: classes.root, id: id, ref: elementRef, selected: selected === true, onClick: handleClick, onKeyDown: handleKeyDown }, _utils.rtlTextContainer.getAttributes({ forElements: [children] }), unhandledProps)), (0, _utils.childrenExist)(children) ? children : _TreeTitle.TreeTitle.create(title, { defaultProps: function defaultProps() { return getA11Props('title', Object.assign({ hasSubtree: hasSubtree, as: hasSubtree ? 'span' : 'a', level: level, treeSize: treeSize, expanded: expanded, index: index, selected: selected === true, selectable: selectable, parent: parent }, hasSubtree && { indeterminate: selected === 'indeterminate' }, { selectionIndicator: selectionIndicator })); }, render: renderItemTitle, overrideProps: handleTitleOverrides })); setEnd(); return element; }); exports.TreeItem = TreeItem; TreeItem.displayName = 'TreeItem'; TreeItem.propTypes = Object.assign({}, _utils.commonPropTypes.createCommon({ content: false }), { contentRef: customPropTypes.ref, id: PropTypes.string.isRequired, index: PropTypes.number, items: customPropTypes.collectionShorthand, level: PropTypes.number, onFocusFirstChild: PropTypes.func, onFocusParent: PropTypes.func, onTitleClick: PropTypes.func, onSiblingsExpand: PropTypes.func, expanded: PropTypes.bool, parent: PropTypes.string, renderItemTitle: PropTypes.func, treeSize: PropTypes.number, title: customPropTypes.itemShorthand, selectionIndicator: customPropTypes.shorthandAllowingChildren, selectable: PropTypes.bool, unstyled: PropTypes.bool, onKeyDown: PropTypes.func }); TreeItem.defaultProps = { accessibility: _accessibility.treeItemBehavior, selectable: true }; TreeItem.handledProps = Object.keys(TreeItem.propTypes); TreeItem.create = (0, _utils.createShorthandFactory)({ Component: TreeItem, mappedProp: 'title' }); //# sourceMappingURL=TreeItem.js.map