react-lightning-design-components
Version:
Salesforce Lightning Design System components built with React 16
1,075 lines (979 loc) • 100 kB
JavaScript
'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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