UNPKG

@flexis/ui

Version:

Styleless React Components

360 lines (316 loc) 22.7 kB
import _Object$defineProperty from "@babel/runtime-corejs3/core-js-stable/object/define-property"; import _Object$defineProperties from "@babel/runtime-corejs3/core-js-stable/object/define-properties"; import _Object$getOwnPropertyDescriptors from "@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors"; import _forEachInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/for-each"; import _Object$getOwnPropertyDescriptor from "@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor"; import _filterInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/filter"; import _Object$getOwnPropertySymbols from "@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols"; import _Object$keys from "@babel/runtime-corejs3/core-js-stable/object/keys"; import _defineProperty from "@babel/runtime-corejs3/helpers/defineProperty"; import _extends from "@babel/runtime-corejs3/helpers/extends"; import _sliceInstanceProperty from "@babel/runtime-corejs3/core-js-stable/instance/slice"; import _toArray from "@babel/runtime-corejs3/helpers/toArray"; import _objectWithoutProperties from "@babel/runtime-corejs3/helpers/objectWithoutProperties"; import _classCallCheck from "@babel/runtime-corejs3/helpers/classCallCheck"; import _createClass from "@babel/runtime-corejs3/helpers/createClass"; import _possibleConstructorReturn from "@babel/runtime-corejs3/helpers/possibleConstructorReturn"; import _getPrototypeOf from "@babel/runtime-corejs3/helpers/getPrototypeOf"; import _inherits from "@babel/runtime-corejs3/helpers/inherits"; function ownKeys(object, enumerableOnly) { var keys = _Object$keys(object); if (_Object$getOwnPropertySymbols) { var symbols = _Object$getOwnPropertySymbols(object); if (enumerableOnly) symbols = _filterInstanceProperty(symbols).call(symbols, function (sym) { return _Object$getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { var _context; _forEachInstanceProperty(_context = ownKeys(Object(source), true)).call(_context, function (key) { _defineProperty(target, key, source[key]); }); } else if (_Object$getOwnPropertyDescriptors) { _Object$defineProperties(target, _Object$getOwnPropertyDescriptors(source)); } else { var _context2; _forEachInstanceProperty(_context2 = ownKeys(Object(source))).call(_context2, function (key) { _Object$defineProperty(target, key, _Object$getOwnPropertyDescriptor(source, key)); }); } } return target; } import { __decorate } from "tslib"; import React from 'react'; var _createElement = React.createElement; var PureComponent = React.PureComponent, Children = React.Children, cloneElement = React.cloneElement; 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'; var HALF = 2; var ESC_KEY = 27; var Dropdown = /** @class */ function () { var Dropdown = /*#__PURE__*/function (_PureComponent) { _inherits(Dropdown, _PureComponent); function Dropdown(props) { var _this; _classCallCheck(this, Dropdown); _this = _possibleConstructorReturn(this, _getPrototypeOf(Dropdown).call(this, props)); _this.elementRef = null; _this.contentRef = null; _this.unsubscribeFromOutsideClick = null; _this.unblockScroll = null; var defaultActive = props.defaultActive; _this.state = { active: defaultActive, contentWithOffset: false }; return _this; } _createClass(Dropdown, [{ key: "render", value: function render() { var _this$props = this.props, className = _this$props.className, disabled = _this$props.disabled, children = _this$props.children, props = _objectWithoutProperties(_this$props, ["className", "disabled", "children"]); var active = this.state.active; var _Children$toArray = Children.toArray(children), _Children$toArray2 = _toArray(_Children$toArray), toggler = _Children$toArray2[0], content = _Children$toArray2[1], misc = _sliceInstanceProperty(_Children$toArray2).call(_Children$toArray2, 2); return _createElement("span", _extends({ ref: this.onElementRef }, omit(props, ['defaultActive', 'active', 'blockScroll', 'align', 'transitionDuration', 'hideOnClick']), { className: style(classes.root, { active: active, disabled: 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); } }, { key: "renderContent", value: function renderContent(toggler, content) { var _style; var _this$props2 = this.props, align = _this$props2.align, transitionDuration = _this$props2.transitionDuration, hideOnClick = _this$props2.hideOnClick; var _this$state = this.state, active = _this$state.active, contentWithOffset = _this$state.contentWithOffset; return _createElement(StylableTransition, { in: active, states: cssStates, statesElement: "content", timeout: transitionDuration, appear: true }, cloneElement(content, _objectSpread({}, getAriaLabelProps({ role: 'region', labelledBy: toggler.props.id }, content.props), { 'className': style(classes.content, (_style = {}, _defineProperty(_style, "".concat(align, "Align"), Boolean(align)), _defineProperty(_style, "offset", contentWithOffset), _style), content.props.className), 'elementRef': this.onContentRef, 'onKeyDown': this.onEscPress, 'aria-hidden': !active, 'hideOnClick': hideOnClick }))); } }, { key: "componentDidMount", value: function componentDidMount() { this.toggleEffects(); } }, { key: "componentWillUnmount", value: function componentWillUnmount() { this.removeEffects(); } }, { key: "componentDidUpdate", value: function componentDidUpdate(_, _ref) { var prevActive = _ref.active; var active = this.state.active; if (prevActive !== active) { this.toggleEffects(); } } }, { key: "onElementRef", value: function onElementRef(ref) { this.elementRef = ref; } }, { key: "onContentRef", value: function onContentRef(ref) { this.contentRef = ref; } }, { key: "onToggle", value: function onToggle(event) { this.toggleActiveState(null, event); } }, { key: "onEscPress", value: function onEscPress(event) { if (event.keyCode === ESC_KEY) { event.stopPropagation(); this.toggleActiveState(false, event); } } }, { key: "onOutsideClick", value: function onOutsideClick(event) { var active = this.state.active; if (active) { this.toggleActiveState(false, event); } } }, { key: "toggleActiveState", value: function toggleActiveState(forceState) { var event = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; var _this$props3 = this.props, activeProp = _this$props3.active, onToggle = _this$props3.onToggle, disabled = _this$props3.disabled; if (disabled) { return; } var active = this.state.active; var nextActive = typeof forceState === 'boolean' ? forceState : !active; if (nextActive === active) { return; } if (typeof activeProp !== 'boolean') { this.setState(function () { return { active: nextActive }; }); } if (typeof onToggle === 'function') { onToggle(nextActive, event); } } }, { key: "toggleEffects", value: function toggleEffects() { var elementRef = this.elementRef, contentRef = this.contentRef; var blockScroll = this.props.blockScroll; var active = this.state.active; var parentElement = elementRef.parentElement; var 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); } } }, { key: "removeEffects", value: function removeEffects() { if (typeof this.unblockScroll === 'function') { this.unblockScroll(); this.unblockScroll = null; } if (typeof this.unsubscribeFromOutsideClick === 'function') { this.unsubscribeFromOutsideClick(); this.unsubscribeFromOutsideClick = null; } } }, { key: "setContentPosition", value: function setContentPosition() { var elementRef = this.elementRef, contentRef = this.contentRef; if (!elementRef || !contentRef) { return; } var align = this.props.align; var _elementRef$getBoundi = elementRef.getBoundingClientRect(), elementTop = _elementRef$getBoundi.top, elementLeft = _elementRef$getBoundi.left, elementWidth = _elementRef$getBoundi.width, elementHeight = _elementRef$getBoundi.height; var contentWidth = contentRef.offsetWidth, style = contentRef.style; var top = 0; var 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 = "".concat(elementWidth, "px"); style.top = "".concat(top, "px"); style.left = "".concat(left, "px"); var withOffset = setOverflowOffset(contentRef, top, left); this.setState(function () { return { contentWithOffset: withOffset }; }); } }], [{ key: "getDerivedStateFromProps", value: function getDerivedStateFromProps(_ref2, _ref3) { var active = _ref2.active, disabled = _ref2.disabled; var prevActive = _ref3.active; var nextActive = !disabled && (typeof active === 'boolean' ? active : prevActive); if (nextActive === prevActive) { return null; } return { active: nextActive }; } }]); return Dropdown; }(PureComponent); process.env.NODE_ENV !== "production" ? 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 } : void 0; 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;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL0Ryb3Bkb3duL0Ryb3Bkb3duLnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQSxPQUFPLEtBQVAsTUFTTyxPQVRQOzs7OztBQVVBLFNBQ0MsWUFERCxRQUVPLFdBRlA7QUFHQSxPQUFPLFNBQVAsTUFBc0IsWUFBdEI7QUFDQSxTQUVDLElBRkQsRUFHQyxjQUhELEVBSUMsaUJBSkQsRUFLQyxJQUxELFFBTU8sZUFOUDtBQU9BLFNBRUMsWUFGRCxFQUdDLFdBSEQsUUFJTyxpQkFKUDtBQUtBLE9BQU8saUJBQVAsTUFBOEIsNkJBQTlCO0FBQ0EsT0FBTyxpQkFBUCxNQUE4Qiw2QkFBOUI7QUFDQSxPQUFPLGFBQVAsTUFBMEIseUJBQTFCO0FBQ0EsT0FBTyxrQkFBUCxNQUErQix1QkFBL0I7QUFDQSxTQUNDLEtBREQsRUFFQyxPQUZELEVBR0MsU0FIRCxRQUlPLG1CQUpQO0FBTUEsY0FBYyxtQkFBZDtBQXdCQSxJQUFNLElBQUksR0FBRyxDQUFiO0FBQ0EsSUFBTSxPQUFPLEdBQUcsRUFBaEI7O0FBRUEsSUFBQSxRQUFBO0FBQUE7QUFBQSxZQUFBO0FBQUEsTUFBcUIsUUFBckI7QUFBQTs7QUFvREMsc0JBQVksS0FBWixFQUFpQjtBQUFBOztBQUFBOztBQUVoQixvRkFBTSxLQUFOO0FBUE8sWUFBQSxVQUFBLEdBQThCLElBQTlCO0FBQ0EsWUFBQSxVQUFBLEdBQTBCLElBQTFCO0FBQ0EsWUFBQSwyQkFBQSxHQUEwQyxJQUExQztBQUNBLFlBQUEsYUFBQSxHQUE0QixJQUE1QjtBQUVTLFVBS2YsYUFMZSxHQU1aLEtBTlksQ0FLZixhQUxlO0FBUWhCLFlBQUssS0FBTCxHQUFhO0FBQ1osUUFBQSxNQUFNLEVBQWEsYUFEUDtBQUVaLFFBQUEsaUJBQWlCLEVBQUU7QUFGUCxPQUFiO0FBUmdCO0FBWWhCOztBQWhFRjtBQUFBO0FBQUEsK0JBa0VPO0FBQUEsMEJBT0QsS0FB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