UNPKG

react-lightning-design-components

Version:

Salesforce Lightning Design System components built with React 16

1,075 lines (979 loc) 100 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); var _getIterator2 = require('babel-runtime/core-js/get-iterator'); var _getIterator3 = _interopRequireDefault(_getIterator2); var _objectWithoutProperties2 = require('babel-runtime/helpers/objectWithoutProperties'); var _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2); var _extends2 = require('babel-runtime/helpers/extends'); var _extends3 = _interopRequireDefault(_extends2); var _getPrototypeOf = require('babel-runtime/core-js/object/get-prototype-of'); var _getPrototypeOf2 = _interopRequireDefault(_getPrototypeOf); var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck'); var _classCallCheck3 = _interopRequireDefault(_classCallCheck2); var _createClass2 = require('babel-runtime/helpers/createClass'); var _createClass3 = _interopRequireDefault(_createClass2); var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn'); var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2); var _inherits2 = require('babel-runtime/helpers/inherits'); var _inherits3 = _interopRequireDefault(_inherits2); var _react = require('react'); var _react2 = _interopRequireDefault(_react); var _reactDom = require('react-dom'); var _reactDom2 = _interopRequireDefault(_reactDom); var _classnames = require('classnames'); var _classnames2 = _interopRequireDefault(_classnames); var _uuid = require('uuid'); var _uuid2 = _interopRequireDefault(_uuid); var _FormElement = require('./FormElement'); var _FormElement2 = _interopRequireDefault(_FormElement); var _Input = require('./Input'); var _Input2 = _interopRequireDefault(_Input); var _Icon = require('./Icon'); var _Icon2 = _interopRequireDefault(_Icon); var _Spinner = require('./Spinner'); var _Spinner2 = _interopRequireDefault(_Spinner); var _Button = require('./Button'); var _Button2 = _interopRequireDefault(_Button); var _DropdownButton = require('./DropdownButton'); var _DropdownButton2 = _interopRequireDefault(_DropdownButton); var _DropdownMenu = require('./DropdownMenu'); var _util = require('./util'); var _reactInfiniteScrollContainer = require('react-infinite-scroll-container'); var _reactInfiniteScrollContainer2 = _interopRequireDefault(_reactInfiniteScrollContainer); var _propTypes = require('prop-types'); var _propTypes2 = _interopRequireDefault(_propTypes); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } /** * */ var LookupSelection = function (_Component) { (0, _inherits3.default)(LookupSelection, _Component); function LookupSelection(props) { (0, _classCallCheck3.default)(this, LookupSelection); var _this = (0, _possibleConstructorReturn3.default)(this, (LookupSelection.__proto__ || (0, _getPrototypeOf2.default)(LookupSelection)).call(this, props)); _this.onKeyDown = _this.onKeyDown.bind(_this); _this.pillRef = _this.pillRef.bind(_this); return _this; } (0, _createClass3.default)(LookupSelection, [{ key: 'componentDidMount', value: function componentDidMount() { if (this.props.autoFocus) _reactDom2.default.findDOMNode(this.pill).focus(); } }, { key: 'onKeyDown', value: function onKeyDown(e) { if (e.keyCode === 8 || e.keyCode === 46) { // Bacspace / DEL e.preventDefault(); e.stopPropagation(); if (this.props.onResetSelection) { this.props.onResetSelection(true); } } } }, { key: 'pillRef', value: function pillRef(ref) { this.pill = ref; } }, { key: 'renderPillResetButton', value: function renderPillResetButton() { return _react2.default.createElement(_Button2.default, { className: 'slds-pill__remove', type: 'icon-bare', icon: 'close', alt: 'Remove', tabIndex: 0, onClick: this.props.onResetSelection, key: 'resetButton' }); } }, { key: 'renderPillSelectedLabel', value: function renderPillSelectedLabel() { var _props = this.props, selected = _props.selected, htmlAttributes = _props.htmlAttributes; return _react2.default.createElement( 'span', (0, _extends3.default)({ className: 'slds-pill__label' }, htmlAttributes, { key: 'selectedLabel' }), selected.label ); } }, { key: 'renderPillSelectedIcon', value: function renderPillSelectedIcon() { var selected = this.props.selected; return selected.icon ? _react2.default.createElement(_Icon2.default, { className: 'slds-pill__icon', category: selected.category, icon: selected.icon, key: 'selectedIcon' }) : undefined; } }, { key: 'renderLookUpData', value: function renderLookUpData() { var _props2 = this.props, selected = _props2.selected, htmlAttributes = _props2.htmlAttributes; return [this.renderPillSelectedIcon(selected), this.renderPillSelectedLabel(selected, htmlAttributes), this.renderPillResetButton()]; } }, { key: 'renderPill', value: function renderPill() { var onPillClick = function onPillClick(e) { e.target.focus(); e.preventDefault(); e.stopPropagation(); }; var lookupReadOnly = this.props.lookupReadOnly; var styles = { height: '28px' }; var lookupProps = { style: styles, className: 'slds-pill slds-truncate', id: this.props.id, ref: this.pillRef, tabIndex: -1 }; return lookupReadOnly ? _react2.default.createElement( 'span', lookupProps, this.renderLookUpData() ) : _react2.default.createElement( 'a', (0, _extends3.default)({}, lookupProps, { onClick: onPillClick }), this.renderLookUpData() ); } }, { key: 'render', value: function render() { var _props3 = this.props, hidden = _props3.hidden, selected = _props3.selected; var lookupClassNames = (0, _classnames2.default)({ 'slds-hide': hidden }); return _react2.default.createElement( 'div', { className: lookupClassNames }, _react2.default.createElement( 'div', { className: 'slds-pill__container', onKeyDown: this.onKeyDown }, selected ? this.renderPill() : undefined ) ); } }]); return LookupSelection; }(_react.Component); var LookupEntryType = _propTypes2.default.shape({ category: _propTypes2.default.string, icon: _propTypes2.default.string, label: _propTypes2.default.string, value: _propTypes2.default.string, context: _propTypes2.default.object }); LookupSelection.propTypes = { id: _propTypes2.default.string, selected: LookupEntryType, hidden: _propTypes2.default.bool, onResetSelection: _propTypes2.default.func, autoFocus: _propTypes2.default.bool, htmlAttributes: _propTypes2.default.object, lookupReadOnly: _propTypes2.default.bool }; /** * */ var LookupSearch = function (_Component2) { (0, _inherits3.default)(LookupSearch, _Component2); function LookupSearch(props) { (0, _classCallCheck3.default)(this, LookupSearch); /* eslint-disable max-len */ var _this2 = (0, _possibleConstructorReturn3.default)(this, (LookupSearch.__proto__ || (0, _getPrototypeOf2.default)(LookupSearch)).call(this, props)); (0, _util.registerStyle)('lookupSearch', [['.slds-lookup[data-scope="multi"] .react-slds-lookup-scope-selector', '{ min-width: 3rem; }'], ['.slds-lookup[data-scope="multi"] .react-slds-lookup-scope-selector .slds-dropdown-trigger', '{ margin-left: 0; }'], ['.slds-lookup[data-scope="multi"] .react-slds-lookup-scope-selector .slds-dropdown-trigger .slds-button', '{ padding: 0 0.25rem; }'], ['.slds-lookup[data-scope="multi"] .slds-box--border', '{ background-color: white; }'], ['.slds-lookup[data-scope="multi"] .slds-box--border .slds-input--bare', '{ width: 100%; }']]); _this2.inputRef = _this2.inputRef.bind(_this2); return _this2; } (0, _createClass3.default)(LookupSearch, [{ key: 'onLookupIconClick', value: function onLookupIconClick() { this.props.onSubmit(); } }, { key: 'onInputKeyDown', value: function onInputKeyDown(e) { if (e.keyCode === 13) { // return key e.preventDefault(); e.stopPropagation(); var searchText = e.target.value; if (searchText) { this.props.onSubmit(); } else { // if no search text, quit lookup search if (this.props.onComplete) { this.props.onComplete(); } } } else if (e.keyCode === 40) { // down key e.preventDefault(); e.stopPropagation(); this.props.onPressDown(); } else if (e.keyCode === 27) { // ESC e.preventDefault(); e.stopPropagation(); // quit lookup search (cancel) var cancel = true; if (this.props.onComplete) { this.props.onComplete(cancel); } } if (this.props.onKeyDown) { this.props.onKeyDown(e); } } }, { key: 'onInputChange', value: function onInputChange(e) { var searchText = e.target.value; this.props.onChange(searchText); } }, { key: 'onInputBlur', value: function onInputBlur(e) { if (this.props.onBlur) { this.props.onBlur(e); } } }, { key: 'onScopeMenuClick', value: function onScopeMenuClick(e) { if (this.props.onScopeMenuClick) { this.props.onScopeMenuClick(e); } } }, { key: 'onMenuItemClick', value: function onMenuItemClick(scope) { if (this.props.onScopeChange) { this.props.onScopeChange(scope.value); } } }, { key: 'onInputClicked', value: function onInputClicked(e) { if (this.props.onFocus) { this.props.onFocus(e); } if (this.props.onInputClicked) { this.props.onInputClicked(e.target.value); } } }, { key: 'onInputFocus', value: function onInputFocus(e) { if (this.props.onInputFocus) { if (this.props.onFocus) this.props.onFocus(e); this.props.onInputFocus(e.target.value); } } }, { key: 'inputRef', value: function inputRef(ref) { this.input = ref; } }, { key: 'renderSearchInput', value: function renderSearchInput(props) { var className = props.className, hidden = props.hidden, searchText = props.searchText, _props$iconAlign = props.iconAlign, iconAlign = _props$iconAlign === undefined ? 'left' : _props$iconAlign, scopes = props.scopes, pprops = (0, _objectWithoutProperties3.default)(props, ['className', 'hidden', 'searchText', 'iconAlign', 'scopes']); delete pprops.onInputClicked; delete pprops.onInputFocus; delete pprops.focusOnInput; if (scopes) delete pprops.autoFocus; var searchInputClassNames = (0, _classnames2.default)('slds-grid', 'slds-input-has-icon', 'slds-input-has-icon--' + iconAlign, { 'slds-hide': hidden }, className); return _react2.default.createElement( 'div', { className: searchInputClassNames }, _react2.default.createElement(_Input2.default, (0, _extends3.default)({}, pprops, { ref: this.inputRef, value: searchText, onKeyDown: this.onInputKeyDown.bind(this), onChange: this.onInputChange.bind(this), onBlur: this.onInputBlur.bind(this), onClick: this.onInputClicked.bind(this), onFocus: this.onInputFocus.bind(this) })), _react2.default.createElement(_Icon2.default, { icon: 'search', className: 'slds-input__icon', style: { cursor: 'pointer' }, onClick: this.onLookupIconClick.bind(this) }) ); } }, { key: 'renderScopeSelector', value: function renderScopeSelector(scopes, target, autoFocus) { var targetScope = scopes[0] || {}; var _iteratorNormalCompletion = true; var _didIteratorError = false; var _iteratorError = undefined; try { for (var _iterator = (0, _getIterator3.default)(scopes), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { var scope = _step.value; if (scope.value === target) { targetScope = scope; break; } } } catch (err) { _didIteratorError = true; _iteratorError = err; } finally { try { if (!_iteratorNormalCompletion && _iterator.return) { _iterator.return(); } } finally { if (_didIteratorError) { throw _iteratorError; } } } var icon = _react2.default.createElement(_Icon2.default, { icon: targetScope.icon || 'none', className: 'slds-pill__icon' }); var selectorClassNames = (0, _classnames2.default)('slds-grid', 'slds-grid--align-center', 'slds-grid--vertical-align-center', 'react-slds-lookup-scope-selector'); return _react2.default.createElement( 'div', { className: selectorClassNames }, _react2.default.createElement( _DropdownButton2.default, { label: icon, onClick: this.onScopeMenuClick.bind(this), onMenuItemClick: this.onMenuItemClick.bind(this), onBlur: this.onInputBlur.bind(this), autoFocus: autoFocus, focusOnInput: this.props.focusOnInput }, scopes.map(function (scope) { return _react2.default.createElement(_DropdownMenu.DropdownMenuItem, (0, _extends3.default)({ key: scope.value }, scope)); }) ) ); } }, { key: 'render', value: function render() { var _props4 = this.props, scopes = _props4.scopes, hidden = _props4.hidden, targetScope = _props4.targetScope, autoFocus = _props4.autoFocus, props = (0, _objectWithoutProperties3.default)(_props4, ['scopes', 'hidden', 'targetScope', 'autoFocus']); if (scopes) { var lookupSearchClassNames = (0, _classnames2.default)('slds-grid', 'slds-form-element__control', 'slds-box--border', { 'slds-hide': hidden }); var styles = { WebkitFlexWrap: 'nowrap', msFlexWrap: 'nowrap', flexWrap: 'nowrap', height: '32px' }; return _react2.default.createElement( 'div', { className: lookupSearchClassNames, style: styles }, this.renderScopeSelector(scopes, targetScope, autoFocus), this.renderSearchInput((0, _extends3.default)({}, props, { className: 'slds-col', bare: true })) ); } return this.renderSearchInput(this.props); } }]); return LookupSearch; }(_react.Component); var ICON_ALIGNS = ['left', 'right']; LookupSearch.propTypes = { className: _propTypes2.default.string, hidden: _propTypes2.default.bool, autoFocus: _propTypes2.default.bool, searchText: _propTypes2.default.string, scopes: _propTypes2.default.arrayOf(_propTypes2.default.shape({ label: _propTypes2.default.string, value: _propTypes2.default.string, icon: _propTypes2.default.string, externalIcon: _propTypes2.default.object })), targetScope: _propTypes2.default.any, iconAlign: _propTypes2.default.arrayOf(ICON_ALIGNS), onKeyDown: _propTypes2.default.func, onBlur: _propTypes2.default.func, onChange: _propTypes2.default.func, onScopeMenuClick: _propTypes2.default.func, onScopeChange: _propTypes2.default.func, onPressDown: _propTypes2.default.func, onSubmit: _propTypes2.default.func, onComplete: _propTypes2.default.func, onInputClicked: _propTypes2.default.func, onFocus: _propTypes2.default.func, focusOnInput: _propTypes2.default.func, onInputFocus: _propTypes2.default.func }; /** * */ var LookupCandidateList = function (_Component3) { (0, _inherits3.default)(LookupCandidateList, _Component3); function LookupCandidateList() { (0, _classCallCheck3.default)(this, LookupCandidateList); return (0, _possibleConstructorReturn3.default)(this, (LookupCandidateList.__proto__ || (0, _getPrototypeOf2.default)(LookupCandidateList)).apply(this, arguments)); } (0, _createClass3.default)(LookupCandidateList, [{ key: 'componentDidMount', value: function componentDidMount() { this.reset = false; if (this.props.focus) { this.focusToTargetItemEl(0); } } }, { key: 'componentWillReceiveProps', value: function componentWillReceiveProps(newProps) { if (newProps.searchText !== this.props.searchText) this.reset = true;else this.reset = false; } }, { key: 'componentDidUpdate', value: function componentDidUpdate(prevProps) { if (this.props.focus && !prevProps.focus) { this.focusToTargetItemEl(0); } } }, { key: 'onSelect', value: function onSelect(entry) { if (this.props.onSelect) { this.props.onSelect(entry); } } }, { key: 'onKeyDown', value: function onKeyDown(e) { if (e.keyCode === 38 || e.keyCode === 40) { // UP/DOWN e.preventDefault(); e.stopPropagation(); var currentEl = e.target.parentElement; var itemEl = e.keyCode === 40 ? currentEl.nextSibling : currentEl.previousSibling; while (itemEl) { var anchorEl = itemEl.querySelector('.react-slds-candidate[tabIndex]'); if (anchorEl && !anchorEl.disabled) { anchorEl.focus(); return; } itemEl = e.keyCode === 40 ? itemEl.nextSibling : itemEl.previousSibling; } } else if (e.keyCode === 27) { // ESC e.preventDefault(); e.stopPropagation(); this.onSelect(null); } } }, { key: 'focusToTargetItemEl', value: function focusToTargetItemEl(index) { var el = _reactDom2.default.findDOMNode(this); var anchors = el.querySelectorAll('.react-slds-candidate[tabIndex]'); if (anchors[index]) { anchors[index].focus(); } } }, { key: 'loadMoreData', value: function loadMoreData(page) { if (this.props.onScroll) this.props.onScroll(page); } }, { key: 'renderCustomIcon', value: function renderCustomIcon(entry) { var customClasses = (0, _classnames2.default)('slds-avatar', { 'slds-avatar--circle': entry.context.img }, 'slds-avatar--small'); return _react2.default.createElement( 'div', { key: entry.label, className: 'custom_icon' }, (entry.context.img || entry.icon) && _react2.default.createElement( 'div', { className: 'slds-show--inline-block' }, _react2.default.createElement( 'span', { className: customClasses }, entry.context.img ? _react2.default.createElement('img', { src: entry.context.img, alt: 'entry.context.title' }) : _react2.default.createElement(_Icon2.default, { category: entry.category, icon: entry.icon, size: 'small' }) ) ), _react2.default.createElement( 'div', { className: (0, _classnames2.default)('slds-text-body--regular', 'slds-show--inline-block', 'slds-p-left--x-small'), style: { verticalAlign: 'top' } }, _react2.default.createElement( 'div', null, entry.context.title ), _react2.default.createElement( 'div', { className: 'slds-text-body--small' }, entry.context.sub_title ) ) ); } }, { key: 'renderCandidate', value: function renderCandidate(entry) { var _this4 = this; var getCandidateUniqueKey = this.props.getCandidateUniqueKey; var icon = entry.context ? this.renderCustomIcon(entry) : _react2.default.createElement(_Icon2.default, { category: entry.category, icon: entry.icon, size: 'small' }); var condidateKey = getCandidateUniqueKey ? getCandidateUniqueKey(entry) : entry.value + '_' + entry.label; return _react2.default.createElement( 'li', { className: 'slds-lookup__item', key: condidateKey }, _react2.default.createElement( 'a', { className: 'slds-truncate react-slds-candidate', tabIndex: -1, role: 'option', onKeyDown: function onKeyDown(e) { return e.keyCode === 13 && _this4.onSelect(entry); }, onBlur: this.props.onBlur, onClick: function onClick() { return _this4.onSelect(entry); } }, icon, !this.props.hideLabel ? entry.label : null ) ); } }, { key: 'render', value: function render() { var _props5 = this.props, _props5$data = _props5.data, data = _props5$data === undefined ? [] : _props5$data, hidden = _props5.hidden, loading = _props5.loading, header = _props5.header, footer = _props5.footer, renderMoreDetailsToggleButton = _props5.renderMoreDetailsToggleButton, toggleClassName = _props5.toggleClassName, _props5$filter = _props5.filter, filter = _props5$filter === undefined ? function () { return true; } : _props5$filter; var filteredDate = data.filter(filter); var lookupMenuClassNames = (0, _classnames2.default)('slds-lookup__menu', { 'slds-hide': hidden, 'slds-show': !hidden && filteredDate.length }); return _react2.default.createElement( 'div', { className: lookupMenuClassNames, role: 'listbox', onKeyDown: this.onKeyDown.bind(this) }, header ? _react2.default.createElement( 'div', { className: 'slds-lookup__item' }, header ) : undefined, _react2.default.createElement( 'ul', { className: 'slds-lookup__list', role: 'presentation' }, renderMoreDetailsToggleButton && _react2.default.createElement( 'li', { className: toggleClassName }, renderMoreDetailsToggleButton() ), _react2.default.createElement( _reactInfiniteScrollContainer2.default, { pageStart: 0, loadMore: this.loadMoreData.bind(this), hasMore: this.props.hasMore, useWindow: false, element: 'div', initialLoad: false, threshold: 20, resetPageLoader: this.reset, loader: _react2.default.createElement( 'li', { className: 'slds-lookup__item', key: 'loading' }, _react2.default.createElement(_Spinner2.default, { size: 'small', style: { margin: '0 auto' } }) ) }, filteredDate.map(this.renderCandidate.bind(this)) ), loading ? _react2.default.createElement( 'li', { className: 'slds-lookup__item', key: 'loading' }, _react2.default.createElement(_Spinner2.default, { size: 'small', style: { margin: '0 auto' } }) ) : undefined ), footer ? _react2.default.createElement( 'div', { className: 'slds-lookup__item' }, footer ) : undefined ); } }]); return LookupCandidateList; }(_react.Component); LookupCandidateList.propTypes = { data: _propTypes2.default.arrayOf(LookupEntryType), focus: _propTypes2.default.bool, loading: _propTypes2.default.bool, hidden: _propTypes2.default.bool, hideLabel: _propTypes2.default.bool, filter: _propTypes2.default.func, onSelect: _propTypes2.default.func, onBlur: _propTypes2.default.func, header: _propTypes2.default.node, footer: _propTypes2.default.node, hasMore: _propTypes2.default.bool, searchText: _propTypes2.default.string, onScroll: _propTypes2.default.func, toggleClassName: _propTypes2.default.string, renderMoreDetailsToggleButton: _propTypes2.default.func, LookupCandidateList: _propTypes2.default.func, getCandidateUniqueKey: _propTypes2.default.func }; /** * */ var Lookup = function (_Component4) { (0, _inherits3.default)(Lookup, _Component4); function Lookup(props) { (0, _classCallCheck3.default)(this, Lookup); var _this5 = (0, _possibleConstructorReturn3.default)(this, (Lookup.__proto__ || (0, _getPrototypeOf2.default)(Lookup)).call(this, props)); _this5.state = { id: 'form-element-' + (0, _uuid2.default)(), selected: props.defaultSelected, opened: props.defaultOpened, searchText: props.defaultSearchText, targetScope: props.defaultTargetScope, focusFirstCandidate: false }; _this5.onResetSelectionByX = _this5.onResetSelectionByX.bind(_this5); _this5.candidateListRef = _this5.candidateListRef.bind(_this5); _this5.selectionRef = _this5.selectionRef.bind(_this5); _this5.searchRef = _this5.searchRef.bind(_this5); return _this5; } (0, _createClass3.default)(Lookup, [{ key: 'onScopeMenuClick', value: function onScopeMenuClick(e) { this.props.onBlur(); if (this.props.onScopeMenuClick) { this.props.onScopeMenuClick(e); } } }, { key: 'onScopeChange', value: function onScopeChange(targetScope) { this.setState({ targetScope: targetScope, searchText: '' }); if (this.props.onScopeChange) { this.props.onScopeChange(targetScope); } } }, { key: 'onSearchTextChange', value: function onSearchTextChange(searchText, page) { this.setState({ searchText: searchText }); if (this.props.onSearchTextChange) { this.props.onSearchTextChange(searchText, page); } } }, { key: 'onScroll', value: function onScroll(page) { if (this.props.onScroll) { this.props.onScroll(this.state.searchText, page); } } }, { key: 'onLookupRequest', value: function onLookupRequest(searchText) { this.setState({ opened: true }); if (this.props.onLookupRequest) { this.props.onLookupRequest(searchText); } } }, { key: 'onResetSelectionByX', value: function onResetSelectionByX() { this.onResetSelection(this.state.searchText !== ''); } }, { key: 'onResetSelection', value: function onResetSelection(invokeSearchByText) { var _this6 = this; this.setState({ selected: null }); if (this.props.onSelect) { this.props.onSelect(null); } if (invokeSearchByText) this.onSearchTextChange(''); this.onLookupRequest(''); setTimeout(function () { var searchElem = _reactDom2.default.findDOMNode(_this6.search); if (searchElem) { var inputElem = searchElem.querySelector('input'); inputElem.focus(); } }, 10); } }, { key: 'onLookupItemSelect', value: function onLookupItemSelect(selected) { var _this7 = this; if (selected) { this.setState({ selected: selected, opened: false }); if (this.props.onSelect) { this.props.onSelect(selected); } setTimeout(function () { var selectionElem = _reactDom2.default.findDOMNode(_this7.selection); if (selectionElem) { var pillElem = selectionElem.querySelector('a'); if (pillElem) { pillElem.focus(); } } }, 10); } else { this.setState({ opened: false }); setTimeout(function () { var searchElem = _reactDom2.default.findDOMNode(_this7.search); var inputElem = searchElem.querySelector('input'); inputElem.focus(); }, 10); } if (this.props.onComplete) { this.props.onComplete(); // tell the component container to quit lookup } } }, { key: 'onFocusFirstCandidate', value: function onFocusFirstCandidate() { var _this8 = this; var _props$opened = this.props.opened, opened = _props$opened === undefined ? this.state.opened : _props$opened; if (!opened) { this.onLookupRequest(this.state.searchText); } else { this.setState({ focusFirstCandidate: true }); setTimeout(function () { _this8.setState({ focusFirstCandidate: false }); }, 10); } } }, { key: 'onBlur', value: function onBlur() { var _this9 = this; setTimeout(function () { if (!_this9.isFocusedInComponent()) { _this9.setState({ opened: false }); if (_this9.props.onBlur) { _this9.props.onBlur(); } if (_this9.props.onComplete) { _this9.props.onComplete(true); // quit lookup (cancel) } } }, 10); } }, { key: 'isFocusedInComponent', value: function isFocusedInComponent() { var rootEl = _reactDom2.default.findDOMNode(this); var targetEl = document.activeElement; while (targetEl && targetEl !== rootEl) { targetEl = targetEl.parentNode; } return !!targetEl; } }, { key: 'candidateListRef', value: function candidateListRef(ref) { this.candidateList = ref; } }, { key: 'selectionRef', value: function selectionRef(ref) { this.selection = ref; } }, { key: 'searchRef', value: function searchRef(ref) { this.search = ref; } }, { key: 'render', value: function render() { var _this10 = this; var id = this.props.id || this.state.id; var _props6 = this.props, totalCols = _props6.totalCols, cols = _props6.cols, label = _props6.label, required = _props6.required, error = _props6.error, className = _props6.className, hideLabel = _props6.hideLabel, _props6$selected = _props6.selected, selected = _props6$selected === undefined ? this.state.selected : _props6$selected, _props6$opened = _props6.opened, opened = _props6$opened === undefined ? this.state.opened : _props6$opened, _props6$searchText = _props6.searchText, searchText = _props6$searchText === undefined ? this.state.searchText : _props6$searchText, _props6$targetScope = _props6.targetScope, targetScope = _props6$targetScope === undefined ? this.state.targetScope : _props6$targetScope, loading = _props6.loading, lookupFilter = _props6.lookupFilter, listHeader = _props6.listHeader, listFooter = _props6.listFooter, data = _props6.data, onComplete = _props6.onComplete, hasMore = _props6.hasMore, htmlAttributes = _props6.htmlAttributes, lookupReadOnly = _props6.lookupReadOnly, renderMoreDetailsToggleButton = _props6.renderMoreDetailsToggleButton, toggleClassName = _props6.toggleClassName, getCandidateUniqueKey = _props6.getCandidateUniqueKey, tooltip = _props6.tooltip, props = (0, _objectWithoutProperties3.default)(_props6, ['totalCols', 'cols', 'label', 'required', 'error', 'className', 'hideLabel', 'selected', 'opened', 'searchText', 'targetScope', 'loading', 'lookupFilter', 'listHeader', 'listFooter', 'data', 'onComplete', 'hasMore', 'htmlAttributes', 'lookupReadOnly', 'renderMoreDetailsToggleButton', 'toggleClassName', 'getCandidateUniqueKey', 'tooltip']); var dropdown = _react2.default.createElement(LookupCandidateList, { ref: this.candidateListRef, data: data, focus: this.state.focusFirstCandidate, hidden: !opened, loading: loading, hideLabel: hideLabel, filter: lookupFilter ? function (entry) { return lookupFilter(entry, searchText, targetScope); } : undefined, header: listHeader, footer: listFooter, onSelect: this.onLookupItemSelect.bind(this), onBlur: this.onBlur.bind(this), searchText: searchText, onScroll: this.onScroll.bind(this), hasMore: hasMore, renderMoreDetailsToggleButton: renderMoreDetailsToggleButton, toggleClassName: toggleClassName, getCandidateUniqueKey: getCandidateUniqueKey }); var lookupClassNames = (0, _classnames2.default)('slds-lookup', { 'slds-has-selection': selected }, className); var formElemProps = { id: id, totalCols: totalCols, cols: cols, label: label, required: required, error: error, dropdown: dropdown, tooltip: tooltip }; return _react2.default.createElement( _FormElement2.default, formElemProps, _react2.default.createElement( 'div', { className: lookupClassNames, 'data-select': 'single', 'data-scope': props.scopes ? 'multi' : 'single', 'data-typeahead': false }, selected ? _react2.default.createElement(LookupSelection, { htmlAttributes: htmlAttributes, autoFocus: props.autoFocus, id: id, ref: this.selectionRef, selected: selected, onResetSelection: this.onResetSelectionByX.bind(this), lookupReadOnly: lookupReadOnly }) : _react2.default.createElement(LookupSearch, (0, _extends3.default)({}, props, { id: id, ref: this.searchRef, searchText: searchText, targetScope: targetScope, onScopeMenuClick: this.onScopeMenuClick.bind(this), onScopeChange: this.onScopeChange.bind(this), onChange: this.onSearchTextChange.bind(this), onSubmit: function onSubmit() { return _this10.onLookupRequest(searchText); }, onPressDown: this.onFocusFirstCandidate.bind(this), onComplete: onComplete, onBlur: this.onBlur.bind(this) })) ) ); } }]); return Lookup; }(_react.Component); exports.default = Lookup; Lookup.propTypes = { id: _propTypes2.default.string, className: _propTypes2.default.string, label: _propTypes2.default.string, required: _propTypes2.default.bool, error: _propTypes2.default.oneOfType([_propTypes2.default.bool, _propTypes2.default.string, _propTypes2.default.shape({ message: _propTypes2.default.string })]), value: _propTypes2.default.string, defaultValue: _propTypes2.default.string, selected: LookupEntryType, defaultSelected: LookupEntryType, opened: _propTypes2.default.bool, hideLabel: _propTypes2.default.bool, defaultOpened: _propTypes2.default.bool, searchText: _propTypes2.default.string, defaultSearchText: _propTypes2.default.string, loading: _propTypes2.default.bool, data: _propTypes2.default.arrayOf(LookupEntryType), lookupFilter: _propTypes2.default.func, listHeader: _propTypes2.default.node, listFooter: _propTypes2.default.node, scopes: _propTypes2.default.arrayOf(_propTypes2.default.shape({ label: _propTypes2.default.string, value: _propTypes2.default.string, icon: _propTypes2.default.string })), targetScope: _propTypes2.default.string, iconAlign: _propTypes2.default.arrayOf(ICON_ALIGNS), defaultTargetScope: _propTypes2.default.string, onSearchTextChange: _propTypes2.default.func, onScopeMenuClick: _propTypes2.default.func, onScopeChange: _propTypes2.default.func, onLookupRequest: _propTypes2.default.func, onBlur: _propTypes2.default.func, onSelect: _propTypes2.default.func, onComplete: _propTypes2.default.func, totalCols: _propTypes2.default.number, cols: _propTypes2.default.number, onInputClicked: _propTypes2.default.func, onInputFocus: _propTypes2.default.func, autoFocus: _propTypes2.default.bool, hasMore: _propTypes2.default.bool, onScroll: _propTypes2.default.func, htmlAttributes: _propTypes2.default.object, lookupReadOnly: _propTypes2.default.bool, renderMoreDetailsToggleButton: _propTypes2.default.func, toggleClassName: _propTypes2.default.string, focusOnInput: _propTypes2.default.func, getCandidateUniqueKey: _propTypes2.default.func, tooltip: _propTypes2.default.element }; Lookup.isFormElement = true; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9zY3JpcHRzL0xvb2t1cC5qcyJdLCJuYW1lcyI6WyJMb29rdXBTZWxlY3Rpb24iLCJwcm9wcyIsIm9uS2V5RG93biIsImJpbmQiLCJwaWxsUmVmIiwiYXV0b0ZvY3VzIiwiZmluZERPTU5vZGUiLCJwaWxsIiwiZm9jdXMiLCJlIiwia2V5Q29kZSIsInByZXZlbnREZWZhdWx0Iiwic3RvcFByb3BhZ2F0aW9uIiwib25SZXNldFNlbGVjdGlvbiIsInJlZiIsInNlbGVjdGVkIiwiaHRtbEF0dHJpYnV0ZXMiLCJsYWJlbCIsImljb24iLCJjYXRlZ29yeSIsInVuZGVmaW5lZCIsInJlbmRlclBpbGxTZWxlY3RlZEljb24iLCJyZW5kZXJQaWxsU2VsZWN0ZWRMYWJlbCIsInJlbmRlclBpbGxSZXNldEJ1dHRvbiIsIm9uUGlsbENsaWNrIiwidGFyZ2V0IiwibG9va3VwUmVhZE9ubHkiLCJzdHlsZXMiLCJoZWlnaHQiLCJsb29rdXBQcm9wcyIsInN0eWxlIiwiY2xhc3NOYW1lIiwiaWQiLCJ0YWJJbmRleCIsInJlbmRlckxvb2tVcERhdGEiLCJoaWRkZW4iLCJsb29rdXBDbGFzc05hbWVzIiwicmVuZGVyUGlsbCIsIkxvb2t1cEVudHJ5VHlwZSIsInNoYXBlIiwic3RyaW5nIiwidmFsdWUiLCJjb250ZXh0Iiwib2JqZWN0IiwicHJvcFR5cGVzIiwiYm9vbCIsImZ1bmMiLCJMb29rdXBTZWFyY2giLCJpbnB1dFJlZiIsIm9uU3VibWl0Iiwic2VhcmNoVGV4dCIsIm9uQ29tcGxldGUiLCJvblByZXNzRG93biIsImNhbmNlbCIsIm9uQ2hhbmdlIiwib25CbHVyIiwib25TY29wZU1lbnVDbGljayIsInNjb3BlIiwib25TY29wZUNoYW5nZSIsIm9uRm9jdXMiLCJvbklucHV0Q2xpY2tlZCIsIm9uSW5wdXRGb2N1cyIsImlucHV0IiwiaWNvbkFsaWduIiwic2NvcGVzIiwicHByb3BzIiwiZm9jdXNPbklucHV0Iiwic2VhcmNoSW5wdXRDbGFzc05hbWVzIiwib25JbnB1dEtleURvd24iLCJvbklucHV0Q2hhbmdlIiwib25JbnB1dEJsdXIiLCJjdXJzb3IiLCJvbkxvb2t1cEljb25DbGljayIsInRhcmdldFNjb3BlIiwic2VsZWN0b3JDbGFzc05hbWVzIiwib25NZW51SXRlbUNsaWNrIiwibWFwIiwibG9va3VwU2VhcmNoQ2xhc3NOYW1lcyIsIldlYmtpdEZsZXhXcmFwIiwibXNGbGV4V3JhcCIsImZsZXhXcmFwIiwicmVuZGVyU2NvcGVTZWxlY3RvciIsInJlbmRlclNlYXJjaElucHV0IiwiYmFyZSIsIklDT05fQUxJR05TIiwiYXJyYXlPZiIsImV4dGVybmFsSWNvbiIsImFueSIsIkxvb2t1cENhbmRpZGF0ZUxpc3QiLCJyZXNldCIsImZvY3VzVG9UYXJnZXRJdGVtRWwiLCJuZXdQcm9wcyIsInByZXZQcm9wcyIsImVudHJ5Iiwib25TZWxlY3QiLCJjdXJyZW50RWwiLCJwYXJlbnRFbGVtZW50IiwiaXRlbUVsIiwibmV4dFNpYmxpbmciLCJwcmV2aW91c1NpYmxpbmciLCJhbmNob3JFbCIsInF1ZXJ5U2VsZWN0b3IiLCJkaXNhYmxlZCIsImluZGV4IiwiZWwiLCJhbmNob3JzIiwicXVlcnlTZWxlY3RvckFsbCIsInBhZ2UiLCJvblNjcm9sbCIsImN1c3RvbUNsYXNzZXMiLCJpbWciLCJ2ZXJ0aWNhbEFsaWduIiwidGl0bGUiLCJzdWJfdGl0bGUiLCJnZXRDYW5kaWRhdGVVbmlxdWVLZXkiLCJyZW5kZXJDdXN0b21JY29uIiwiY29uZGlkYXRlS2V5IiwiaGlkZUxhYmVsIiwiZGF0YSIsImxvYWRpbmciLCJoZWFkZXIiLCJmb290ZXIiLCJyZW5kZXJNb3JlRGV0YWlsc1RvZ2dsZUJ1dHRvbiIsInRvZ2dsZUNsYXNzTmFtZSIsImZpbHRlciIsImZpbHRlcmVkRGF0ZSIsImxvb2t1cE1lbnVDbGFzc05hbWVzIiwibGVuZ3RoIiwibG9hZE1vcmVEYXRhIiwiaGFzTW9yZSIsIm1hcmdpbiIsInJlbmRlckNhbmRpZGF0ZSIsIm5vZGUiLCJMb29rdXAiLCJzdGF0ZSIsImRlZmF1bHRTZWxlY3RlZCIsIm9wZW5lZCIsImRlZmF1bHRPcGVuZWQiLCJkZWZhdWx0U2VhcmNoVGV4dCIsImRlZmF1bHRUYXJnZXRTY29wZSIsImZvY3VzRmlyc3RDYW5kaWRhdGUiLCJvblJlc2V0U2VsZWN0aW9uQnlYIiwiY2FuZGlkYXRlTGlzdFJlZiIsInNlbGVjdGlvblJlZiIsInNlYXJjaFJlZiIsInNldFN0YXRlIiwib25TZWFyY2hUZXh0Q2hhbmdlIiwib25Mb29rdXBSZXF1ZXN0IiwiaW52b2tlU2VhcmNoQnlUZXh0Iiwic2V0VGltZW91dCIsInNlYXJjaEVsZW0iLCJzZWFyY2giLCJpbnB1dEVsZW0iLCJzZWxlY3Rpb25FbGVtIiwic2VsZWN0aW9uIiwicGlsbEVsZW0iLCJpc0ZvY3VzZWRJbkNvbXBvbmVudCIsInJvb3RFbCIsInRhcmdldEVsIiwiZG9jdW1lbnQiLCJhY3RpdmVFbGVtZW50IiwicGFyZW50Tm9kZSIsImNhbmRpZGF0ZUxpc3QiLCJ0b3RhbENvbHMiLCJjb2xzIiwicmVxdWlyZWQiLCJlcnJvciIsImxvb2t1cEZpbHRlciIsImxpc3RIZWFkZXIiLCJsaXN0Rm9vdGVyIiwidG9vbHRpcCIsImRyb3Bkb3duIiwib25Mb29rdXBJdGVtU2VsZWN0IiwiZm9ybUVsZW1Qcm9wcyIsIm9uRm9jdXNGaXJzdENhbmRpZGF0ZSIsIm9uZU9mVHlwZSIsIm1lc3NhZ2UiLCJkZWZhdWx0VmFsdWUiLCJudW1iZXIiLCJlbGVtZW50IiwiaXNGb3JtRWxlbWVudCJdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOzs7O0FBQ0E7Ozs7QUFDQTs7OztBQUNBOztBQUNBOztBQUNBOzs7O0FBQ0E7Ozs7OztBQUNBOzs7SUFHTUEsZTs7O0FBQ0osMkJBQVlDLEtBQVosRUFBbUI7QUFBQTs7QUFBQSx3SkFDWEEsS0FEVzs7QUFFakIsVUFBS0Ms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