@flexis/ui
Version:
Styleless React Components
360 lines (316 loc) • 22.7 kB
JavaScript
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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