@flexis/ui
Version:
Styleless React Components
412 lines (338 loc) • 24.3 kB
JavaScript
"use strict";
var _Object$keys2 = require("@babel/runtime-corejs3/core-js-stable/object/keys");
var _forEachInstanceProperty2 = require("@babel/runtime-corejs3/core-js-stable/instance/for-each");
var _context3;
var _interopRequireDefault = require("@babel/runtime-corejs3/helpers/interopRequireDefault");
var _Object$defineProperty2 = require("@babel/runtime-corejs3/core-js-stable/object/define-property");
_Object$defineProperty2(exports, "__esModule", {
value: true
});
var _exportNames = {};
exports.default = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/define-property"));
var _defineProperties = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/define-properties"));
var _getOwnPropertyDescriptors = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptors"));
var _forEach = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/for-each"));
var _getOwnPropertyDescriptor = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-descriptor"));
var _filter = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/filter"));
var _getOwnPropertySymbols = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/get-own-property-symbols"));
var _keys = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/object/keys"));
var _defineProperty3 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/defineProperty"));
var _extends2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/extends"));
var _slice = _interopRequireDefault(require("@babel/runtime-corejs3/core-js-stable/instance/slice"));
var _toArray2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/toArray"));
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/objectWithoutProperties"));
var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/classCallCheck"));
var _createClass2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/createClass"));
var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/possibleConstructorReturn"));
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/getPrototypeOf"));
var _inherits2 = _interopRequireDefault(require("@babel/runtime-corejs3/helpers/inherits"));
var _tslib = require("tslib");
var _react = _interopRequireDefault(require("react"));
var _reactDom = require("react-dom");
var _propTypes = _interopRequireDefault(require("prop-types"));
var _helpers = require("../../helpers");
var _types = require("../common/types");
var _setOverflowOffset = _interopRequireDefault(require("../common/setOverflowOffset"));
var _toggleScrollBlock = _interopRequireDefault(require("../common/toggleScrollBlock"));
var _throttleFocus = _interopRequireDefault(require("../common/throttleFocus"));
var _StylableTransition = _interopRequireDefault(require("../StylableTransition"));
var _DropdownSt = require("./Dropdown.st.css");
var _DropdownContent = require("./DropdownContent");
_forEachInstanceProperty2(_context3 = _Object$keys2(_DropdownContent)).call(_context3, function (key) {
if (key === "default" || key === "__esModule") return;
if (Object.prototype.hasOwnProperty.call(_exportNames, key)) return;
_Object$defineProperty2(exports, key, {
enumerable: true,
get: function get() {
return _DropdownContent[key];
}
});
});
function ownKeys(object, enumerableOnly) { var keys = (0, _keys.default)(object); if (_getOwnPropertySymbols.default) { var symbols = (0, _getOwnPropertySymbols.default)(object); if (enumerableOnly) symbols = (0, _filter.default)(symbols).call(symbols, function (sym) { return (0, _getOwnPropertyDescriptor.default)(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; (0, _forEach.default)(_context = ownKeys(Object(source), true)).call(_context, function (key) { (0, _defineProperty3.default)(target, key, source[key]); }); } else if (_getOwnPropertyDescriptors.default) { (0, _defineProperties.default)(target, (0, _getOwnPropertyDescriptors.default)(source)); } else { var _context2; (0, _forEach.default)(_context2 = ownKeys(Object(source))).call(_context2, function (key) { (0, _defineProperty2.default)(target, key, (0, _getOwnPropertyDescriptor.default)(source, key)); }); } } return target; }
var _createElement = _react.default.createElement;
var PureComponent = _react.default.PureComponent,
Children = _react.default.Children,
cloneElement = _react.default.cloneElement;
var HALF = 2;
var ESC_KEY = 27;
var Dropdown =
/** @class */
function () {
var Dropdown = /*#__PURE__*/function (_PureComponent) {
(0, _inherits2.default)(Dropdown, _PureComponent);
function Dropdown(props) {
var _this;
(0, _classCallCheck2.default)(this, Dropdown);
_this = (0, _possibleConstructorReturn2.default)(this, (0, _getPrototypeOf2.default)(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;
}
(0, _createClass2.default)(Dropdown, [{
key: "render",
value: function render() {
var _this$props = this.props,
className = _this$props.className,
disabled = _this$props.disabled,
children = _this$props.children,
props = (0, _objectWithoutProperties2.default)(_this$props, ["className", "disabled", "children"]);
var active = this.state.active;
var _Children$toArray = Children.toArray(children),
_Children$toArray2 = (0, _toArray2.default)(_Children$toArray),
toggler = _Children$toArray2[0],
content = _Children$toArray2[1],
misc = (0, _slice.default)(_Children$toArray2).call(_Children$toArray2, 2);
return _createElement("span", (0, _extends2.default)({
ref: this.onElementRef
}, (0, _helpers.omit)(props, ['defaultActive', 'active', 'blockScroll', 'align', 'transitionDuration', 'hideOnClick']), {
className: (0, _DropdownSt.style)(_DropdownSt.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
}), (0, _reactDom.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.default, {
in: active,
states: _DropdownSt.cssStates,
statesElement: "content",
timeout: transitionDuration,
appear: true
}, cloneElement(content, _objectSpread({}, (0, _helpers.getAriaLabelProps)({
role: 'region',
labelledBy: toggler.props.id
}, content.props), {
'className': (0, _DropdownSt.style)(_DropdownSt.classes.content, (_style = {}, (0, _defineProperty3.default)(_style, "".concat(align, "Align"), Boolean(align)), (0, _defineProperty3.default)(_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();
(0, _throttleFocus.default)(contentRef);
if (!outsideClickSubscribed) {
this.unsubscribeFromOutsideClick = (0, _helpers.subscribeEvent)(document, 'click', this.onOutsideClick);
}
} else {
(0, _throttleFocus.default)(elementRef.firstElementChild);
if (outsideClickSubscribed) {
this.unsubscribeFromOutsideClick();
this.unsubscribeFromOutsideClick = null;
}
}
if (blockScroll) {
this.unblockScroll = (0, _toggleScrollBlock.default)(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 _types.AlignVariant.Start:
left = elementLeft;
break;
case _types.AlignVariant.Center:
left = elementLeft + elementWidth / HALF;
break;
case _types.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 = (0, _setOverflowOffset.default)(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.default.func,
defaultActive: _propTypes.default.bool,
active: _propTypes.default.bool,
disabled: _propTypes.default.bool,
blockScroll: _propTypes.default.bool,
hideOnClick: _propTypes.default.bool,
align: _propTypes.default.oneOf(_types.AlignValues),
children: _propTypes.default.arrayOf(_propTypes.default.element).isRequired,
transitionDuration: _propTypes.default.number
} : void 0;
Dropdown.defaultProps = {
defaultActive: false,
disabled: false,
blockScroll: true,
align: _types.AlignVariant.Start,
transitionDuration: 0
};
(0, _tslib.__decorate)([(0, _helpers.Bind)()], Dropdown.prototype, "onElementRef", null);
(0, _tslib.__decorate)([(0, _helpers.Bind)()], Dropdown.prototype, "onContentRef", null);
(0, _tslib.__decorate)([(0, _helpers.Bind)()], Dropdown.prototype, "onToggle", null);
(0, _tslib.__decorate)([(0, _helpers.Bind)()], Dropdown.prototype, "onEscPress", null);
(0, _tslib.__decorate)([(0, _helpers.Bind)()], Dropdown.prototype, "onOutsideClick", null);
return Dropdown;
}();
var _default = Dropdown;
exports.default = _default;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL0Ryb3Bkb3duL0Ryb3Bkb3duLnRzeCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7QUFVQTs7QUFHQTs7QUFDQTs7QUFPQTs7QUFLQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFDQTs7QUFNQTs7QUFBQTtBQUFBO0FBQUE7O0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUE7Ozs7Ozs7Ozs7QUF3QkEsSUFBTSxJQUFJLEdBQUcsQ0FBYjtBQUNBLElBQU0sT0FBTyxHQUFHLEVBQWhCOztBQUVBLElBQUEsUUFBQTtBQUFBO0FBQUEsWUFBQTtBQUFBLE1BQXFCLFFBQXJCO0FBQUE7O0FBb0RDLHNCQUFZLEtBQVosRUFBaUI7QUFBQTs7QUFBQTtBQUVoQixnSEFBTSxLQUFOO0FBUE8sWUFBQSxVQUFBLEdBQThCLElBQTlCO0FBQ0EsWUFBQSxVQUFBLEdBQTBCLElBQTFCO0FBQ0EsWUFBQSwyQkFBQSxHQUEwQyxJQUExQztBQUNBLFlBQUEsYUFBQSxHQUE0QixJQUE1QjtBQUVTLFVBS2YsYUFMZSxHQU1aLEtBTlksQ0FLZixhQUxlO0FBUWhCLFlBQUssS0FBTCxHQUFhO0FBQ1osUUFBQSxNQUFNLEVBQWEsYUFEUDtBQUVaLFFBQUEsaUJBQWlCLEVBQUU7QUFGUCxPQUFiO0FBUmdCO0FBWWhCOztBQWhFRjtBQUFBO0FBQUEsK0JBa0VPO0FBQUEsMEJBT0QsS0FBSyxLQVBKO0FBQUEsWUFHSixTQUhJLGVBR0osU0FISTtBQUFBLFlBSUosUUFKSSxlQUlKLFFBSkk7QUFBQSxZQUtKLFFBTEksZUFLSixRQUxJO0FBQUEsWUFNRCxLQU5DO0FBQUEsWUFTSixNQVRJLEdBVUQsS0FBSyxLQVZKLENBU0osTUFUSTs7QUFBQSxnQ0FlRCxRQUFRLENBQUMsT0FBVCxDQUFpQixRQUFqQixDQWZDO0FBQUE7QUFBQSxZ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