@flexis/ui
Version:
Styleless React Components
241 lines • 18.4 kB
JavaScript
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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