UNPKG

@flexis/ui

Version:

Styleless React Components

241 lines 18.4 kB
import { __decorate } from "tslib"; import React, { PureComponent, Children, cloneElement } from 'react'; import { createPortal } from 'react-dom'; import PropTypes from 'prop-types'; import { Bind, subscribeEvent, getAriaLabelProps, omit } from '../../helpers'; import { AlignVariant, AlignValues } from '../common/types'; import setOverflowOffset from '../common/setOverflowOffset'; import toggleScrollBlock from '../common/toggleScrollBlock'; import throttleFocus from '../common/throttleFocus'; import StylableTransition from '../StylableTransition'; import { style, classes, cssStates } from './Dropdown.st.css'; export * from './DropdownContent'; const HALF = 2; const ESC_KEY = 27; let Dropdown = /** @class */ (() => { class Dropdown extends PureComponent { constructor(props) { super(props); this.elementRef = null; this.contentRef = null; this.unsubscribeFromOutsideClick = null; this.unblockScroll = null; const { defaultActive } = props; this.state = { active: defaultActive, contentWithOffset: false }; } static getDerivedStateFromProps({ active, disabled }, { active: prevActive }) { const nextActive = !disabled && (typeof active === 'boolean' ? active : prevActive); if (nextActive === prevActive) { return null; } return { active: nextActive }; } render() { const { className, disabled, children, ...props } = this.props; const { active } = this.state; const [toggler, content, ...misc] = Children.toArray(children); return (<span ref={this.onElementRef} {...omit(props, [ 'defaultActive', 'active', 'blockScroll', 'align', 'transitionDuration', 'hideOnClick' ])} className={style(classes.root, { active, disabled }, className)} onClick={this.onToggle} aria-disabled={disabled}> {cloneElement(toggler, { 'aria-haspopup': true, 'aria-expanded': active, 'aria-disabled': disabled, 'disabled': disabled })} {createPortal(this.renderContent(toggler, content), document.body)} {misc} </span>); } renderContent(toggler, content) { const { align, transitionDuration, hideOnClick } = this.props; const { active, contentWithOffset } = this.state; return (<StylableTransition in={active} states={cssStates} statesElement='content' timeout={transitionDuration} appear> {cloneElement(content, { ...getAriaLabelProps({ role: 'region', labelledBy: toggler.props.id }, content.props), 'className': style(classes.content, { [`${align}Align`]: Boolean(align), offset: contentWithOffset }, content.props.className), 'elementRef': this.onContentRef, 'onKeyDown': this.onEscPress, 'aria-hidden': !active, 'hideOnClick': hideOnClick })} </StylableTransition>); } componentDidMount() { this.toggleEffects(); } componentWillUnmount() { this.removeEffects(); } componentDidUpdate(_, { active: prevActive }) { const { active } = this.state; if (prevActive !== active) { this.toggleEffects(); } } onElementRef(ref) { this.elementRef = ref; } onContentRef(ref) { this.contentRef = ref; } onToggle(event) { this.toggleActiveState(null, event); } onEscPress(event) { if (event.keyCode === ESC_KEY) { event.stopPropagation(); this.toggleActiveState(false, event); } } onOutsideClick(event) { const { active } = this.state; if (active) { this.toggleActiveState(false, event); } } toggleActiveState(forceState, event = null) { const { active: activeProp, onToggle, disabled } = this.props; if (disabled) { return; } const { active } = this.state; const nextActive = typeof forceState === 'boolean' ? forceState : !active; if (nextActive === active) { return; } if (typeof activeProp !== 'boolean') { this.setState(() => ({ active: nextActive })); } if (typeof onToggle === 'function') { onToggle(nextActive, event); } } toggleEffects() { const { elementRef, contentRef } = this; const { blockScroll } = this.props; const { active } = this.state; const { parentElement } = elementRef; const outsideClickSubscribed = typeof this.unsubscribeFromOutsideClick === 'function'; if (active) { this.setContentPosition(); throttleFocus(contentRef); if (!outsideClickSubscribed) { this.unsubscribeFromOutsideClick = subscribeEvent(document, 'click', this.onOutsideClick); } } else { throttleFocus(elementRef.firstElementChild); if (outsideClickSubscribed) { this.unsubscribeFromOutsideClick(); this.unsubscribeFromOutsideClick = null; } } if (blockScroll) { this.unblockScroll = toggleScrollBlock(active, this.unblockScroll, parentElement); } } removeEffects() { if (typeof this.unblockScroll === 'function') { this.unblockScroll(); this.unblockScroll = null; } if (typeof this.unsubscribeFromOutsideClick === 'function') { this.unsubscribeFromOutsideClick(); this.unsubscribeFromOutsideClick = null; } } setContentPosition() { const { elementRef, contentRef } = this; if (!elementRef || !contentRef) { return; } const { align } = this.props; const { top: elementTop, left: elementLeft, width: elementWidth, height: elementHeight } = elementRef.getBoundingClientRect(); const { offsetWidth: contentWidth, style } = contentRef; let top = 0; let left = 0; top = elementTop + elementHeight; switch (align) { case AlignVariant.Start: left = elementLeft; break; case AlignVariant.Center: left = elementLeft + elementWidth / HALF; break; case AlignVariant.End: left = elementLeft + elementWidth - contentWidth; break; default: } style.minWidth = `${elementWidth}px`; style.top = `${top}px`; style.left = `${left}px`; const withOffset = setOverflowOffset(contentRef, top, left); this.setState(() => ({ contentWithOffset: withOffset })); } } Dropdown.propTypes = { onToggle: PropTypes.func, defaultActive: PropTypes.bool, active: PropTypes.bool, disabled: PropTypes.bool, blockScroll: PropTypes.bool, hideOnClick: PropTypes.bool, align: PropTypes.oneOf(AlignValues), children: PropTypes.arrayOf(PropTypes.element).isRequired, transitionDuration: PropTypes.number }; Dropdown.defaultProps = { defaultActive: false, disabled: false, blockScroll: true, align: AlignVariant.Start, transitionDuration: 0 }; __decorate([ Bind() ], Dropdown.prototype, "onElementRef", null); __decorate([ Bind() ], Dropdown.prototype, "onContentRef", null); __decorate([ Bind() ], Dropdown.prototype, "onToggle", null); __decorate([ Bind() ], Dropdown.prototype, "onEscPress", null); __decorate([ Bind() ], Dropdown.prototype, "onOutsideClick", null); return Dropdown; })(); export default Dropdown; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiRHJvcGRvd24uanN4Iiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvRHJvcGRvd24vRHJvcGRvd24udHN4Il0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEtBQUssRUFBRSxFQU1iLGFBQWEsRUFDYixRQUFRLEVBQ1IsWUFBWSxFQUNaLE1BQU0sT0FBTyxDQUFDO0FBQ2YsT0FBTyxFQUNOLFlBQVksRUFDWixNQUFNLFdBQVcsQ0FBQztBQUNuQixPQUFPLFNBQVMsTUFBTSxZQUFZLENBQUM7QUFDbkMsT0FBTyxFQUVOLElBQUksRUFDSixjQUFjLEVBQ2QsaUJBQWlCLEVBQ2pCLElBQUksRUFDSixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBRU4sWUFBWSxFQUNaLFdBQVcsRUFDWCxNQUFNLGlCQUFpQixDQUFDO0FBQ3pCLE9BQU8saUJBQWlCLE1BQU0sNkJBQTZCLENBQUM7QUFDNUQsT0FBTyxpQkFBaUIsTUFBTSw2QkFBNkIsQ0FBQztBQUM1RCxPQUFPLGFBQWEsTUFBTSx5QkFBeUIsQ0FBQztBQUNwRCxPQUFPLGtCQUFrQixNQUFNLHVCQUF1QixDQUFDO0FBQ3ZELE9BQU8sRUFDTixLQUFLLEVBQ0wsT0FBTyxFQUNQLFNBQVMsRUFDVCxNQUFNLG1CQUFtQixDQUFDO0FBRTNCLGNBQWMsbUJBQW1CLENBQUM7QUF3QmxDLE1BQU0sSUFBSSxHQUFHLENBQUMsQ0FBQztBQUNmLE1BQU0sT0FBTyxHQUFHLEVBQUUsQ0FBQztBQUVuQjtJQUFBLE1BQXFCLFFBQVMsU0FBUSxhQUE2QjtRQW9EbEUsWUFBWSxLQUFLO1lBRWhCLEtBQUssQ0FBQyxLQUFLLENBQUMsQ0FBQztZQVBOLGVBQVUsR0FBb0IsSUFBSSxDQUFDO1lBQ25DLGVBQVUsR0FBZ0IsSUFBSSxDQUFDO1lBQy9CLGdDQUEyQixHQUFlLElBQUksQ0FBQztZQUMvQyxrQkFBYSxHQUFlLElBQUksQ0FBQztZQU14QyxNQUFNLEVBQ0wsYUFBYSxF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