UNPKG

@wix/design-system

Version:

@wix/design-system

444 lines (442 loc) 18.1 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); exports.__esModule = true; exports["default"] = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray")); var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime/helpers/possibleConstructorReturn")); var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf")); var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits")); var _react = _interopRequireDefault(require("react")); var _Content = _interopRequireDefault(require("./Content")); var _Box = _interopRequireDefault(require("../Box")); var _Search = _interopRequireDefault(require("../Search")); var _Text = _interopRequireDefault(require("../Text")); var _ToggleAllCheckbox = _interopRequireDefault(require("./ToggleAllCheckbox")); var _SelectorList2 = require("./SelectorList.helpers"); var _constants = require("./constants"); var _SelectorListSt = require("./SelectorList.st.css.js"); var _jsxFileName = "/home/builduser/work/57e038ea7326c1ec/packages/wix-design-system/dist/cjs/SelectorList/SelectorList.jsx"; function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; } function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2["default"])(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } function _callSuper(t, o, e) { return o = (0, _getPrototypeOf2["default"])(o), (0, _possibleConstructorReturn2["default"])(t, _isNativeReflectConstruct() ? Reflect.construct(o, e || [], (0, _getPrototypeOf2["default"])(t).constructor) : o.apply(t, e)); } function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); } /** * Use this component when needed to select one / multiple items having complex descriptions. * E.g.: choosing products to promote via ShoutOuts */ var SelectorList = exports["default"] = /*#__PURE__*/function (_React$PureComponent) { function SelectorList() { var _this; (0, _classCallCheck2["default"])(this, SelectorList); for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) { args[_key] = arguments[_key]; } _this = _callSuper(this, SelectorList, [].concat(args)); _this.state = { isLoaded: false, isSearching: false, items: [], searchValue: '', selectedItems: [], indeterminateItems: [], noResultsFound: false, isEmpty: false }; _this._renderList = function () { var _this$props = _this.props, dataHook = _this$props.dataHook, emptyState = _this$props.emptyState, renderNoResults = _this$props.renderNoResults, height = _this$props.height, maxHeight = _this$props.maxHeight, size = _this$props.size, imageSize = _this$props.imageSize, imageShape = _this$props.imageShape, multiple = _this$props.multiple, showDivider = _this$props.showDivider; var _this$state = _this.state, items = _this$state.items, isLoaded = _this$state.isLoaded, isEmpty = _this$state.isEmpty, isSearching = _this$state.isSearching, searchValue = _this$state.searchValue, noResultsFound = _this$state.noResultsFound, selectedItems = _this$state.selectedItems; var hasMore = _this._hasMore(); var contentProps = { items: items, selectedItems: selectedItems, onToggle: _this._onToggle, emptyState: emptyState, renderNoResults: renderNoResults, isEmpty: isEmpty, isLoading: !isLoaded || isSearching, noResultsFound: noResultsFound, size: size, imageSize: imageSize || _constants.DEFAULT_IMAGE_SIZE_BY_SIZE[size], imageShape: imageShape, multiple: multiple, showDivider: showDivider, loadMore: _this._loadMore, hasMore: hasMore, checkIsSelected: _this._checkIsSelected, checkIndeterminate: _this._checkIndeterminate, searchValue: searchValue }; var shouldRenderSubheader = isLoaded && !isEmpty; return /*#__PURE__*/_react["default"].createElement(_Box["default"], { direction: "vertical", overflow: "hidden", dataHook: dataHook, height: height, maxHeight: maxHeight, __self: _this, __source: { fileName: _jsxFileName, lineNumber: 109, columnNumber: 7 } }, shouldRenderSubheader && _this._renderSubheader(), /*#__PURE__*/_react["default"].createElement(_Content["default"], (0, _extends2["default"])({}, contentProps, { __self: _this, __source: { fileName: _jsxFileName, lineNumber: 119, columnNumber: 9 } }))); }; _this._renderSubheader = function () { var _this$props2 = _this.props, subtitle = _this$props2.subtitle, withSearch = _this$props2.withSearch, size = _this$props2.size, searchDebounceMs = _this$props2.searchDebounceMs, searchPlaceholder = _this$props2.searchPlaceholder, autoFocus = _this$props2.autoFocus, searchMaxLength = _this$props2.searchMaxLength; var searchValue = _this.state.searchValue; return /*#__PURE__*/_react["default"].createElement("div", { className: (0, _SelectorListSt.st)(_SelectorListSt.classes.subheaderWrapper, { withSearch: withSearch, size: size }), __self: _this, __source: { fileName: _jsxFileName, lineNumber: 137, columnNumber: 7 } }, subtitle && /*#__PURE__*/_react["default"].createElement("div", { className: _SelectorListSt.classes.subtitleWrapper, __self: _this, __source: { fileName: _jsxFileName, lineNumber: 144, columnNumber: 11 } }, typeof subtitle === 'string' ? /*#__PURE__*/_react["default"].createElement(_Text["default"], { dataHook: _SelectorList2.dataHooks.subtitle, __self: _this, __source: { fileName: _jsxFileName, lineNumber: 146, columnNumber: 15 } }, subtitle) : subtitle), withSearch && /*#__PURE__*/_react["default"].createElement(_Search["default"], { dataHook: _SelectorList2.dataHooks.search, placeholder: searchPlaceholder, onChange: _this._onSearchChange, onClear: _this._onClear, debounceMs: searchDebounceMs, value: searchValue, size: _constants.SEARCH_SIZE_BY_SIZE[size], autoFocus: autoFocus, maxLength: searchMaxLength, __self: _this, __source: { fileName: _jsxFileName, lineNumber: 153, columnNumber: 11 } })); }; _this._renderToggleAllCheckbox = function () { var _this$props3 = _this.props, selectAllText = _this$props3.selectAllText, deselectAllText = _this$props3.deselectAllText, size = _this$props3.size; var _this$state2 = _this.state, items = _this$state2.items, selectedItems = _this$state2.selectedItems; var enabledItemsAmount = _this._getEnabledItems(items).length; var selectedEnabledItemsAmount = _this._getEnabledItems(selectedItems).length; var checkboxProps = { selectAllText: selectAllText, deselectAllText: deselectAllText, size: size, enabledItemsAmount: enabledItemsAmount, selectedEnabledItemsAmount: selectedEnabledItemsAmount, selectAll: _this._selectAll, deselectAll: _this._deselectAll }; return /*#__PURE__*/_react["default"].createElement(_ToggleAllCheckbox["default"], (0, _extends2["default"])({}, checkboxProps, { __self: _this, __source: { fileName: _jsxFileName, lineNumber: 187, columnNumber: 12 } })); }; _this._updateSearchValue = function (searchValue) { return _this.setState({ searchValue: searchValue, isSearching: true, items: [] }, function () { return _this._loadInitialItems(searchValue); }); }; _this._onSearchChange = function (event) { return _this._updateSearchValue(event.target.value); }; _this._onClear = function () { var searchValue = ''; _this.setState({ searchValue: searchValue, isSearching: true, items: [] }, function () { _this._getInitialData(searchValue).then(function (dataSourceProps) { var _this$state3 = _this.state, items = _this$state3.items, selectedItems = _this$state3.selectedItems, indeterminateItems = _this$state3.indeterminateItems; var newItems = [].concat((0, _toConsumableArray2["default"])(items), (0, _toConsumableArray2["default"])(dataSourceProps.items)); var newSelectedItems = selectedItems; var newIndeterminateItems = indeterminateItems; var noResultsFound = newItems.length === 0 && Boolean(searchValue); var isEmpty = newItems.length === 0 && !searchValue; _this.setState({ items: newItems, selectedItems: newSelectedItems, indeterminateItems: newIndeterminateItems, isLoaded: true, isEmpty: isEmpty, isSearching: false, noResultsFound: noResultsFound, totalCount: dataSourceProps.totalCount }); }); }); }; _this._checkIsSelected = function (item) { var selectedItems = _this.state.selectedItems; return !!selectedItems.find(function (_ref) { var id = _ref.id; return item.id === id; }); }; _this._checkIndeterminate = function (item) { var indeterminateItems = _this.state.indeterminateItems; return !!indeterminateItems.find(function (_ref2) { var id = _ref2.id; return item.id === id; }); }; _this._toggleItem = function (item) { var multiple = _this.props.multiple; _this.setState(function (_ref3) { var selectedItems = _ref3.selectedItems, indeterminateItems = _ref3.indeterminateItems; return { selectedItems: multiple ? _this._checkIsSelected(item) ? selectedItems.filter(function (_ref4) { var id = _ref4.id; return item.id !== id; }) : selectedItems.concat(item) : [item], indeterminateItems: indeterminateItems.filter(function (_ref5) { var id = _ref5.id; return item.id !== id; }) }; }); }; _this._onToggle = function (item) { var onSelect = _this.props.onSelect; _this._toggleItem(item); if (onSelect) { onSelect(item); } }; _this._selectAll = function () { var _this$state4 = _this.state, selectedItems = _this$state4.selectedItems, items = _this$state4.items; var enabledItems = _this._getEnabledItems(items); _this.setState({ selectedItems: selectedItems.concat(enabledItems), indeterminateItems: [] }); }; _this._deselectAll = function () { return _this.setState(function (_ref6) { var selectedItems = _ref6.selectedItems; return { selectedItems: selectedItems.filter(function (_ref7) { var disabled = _ref7.disabled; return disabled; }), indeterminateItems: [] }; }); }; _this._updateItems = function (_ref8) { var resetItems = _ref8.resetItems, nextPageItems = _ref8.items, totalCount = _ref8.totalCount, searchValue = _ref8.searchValue; var _this$state5 = _this.state, items = _this$state5.items, selectedItems = _this$state5.selectedItems, indeterminateItems = _this$state5.indeterminateItems; // react only to the resolve of the relevant search if (searchValue !== _this.state.searchValue) { return; } var newItems = [].concat((0, _toConsumableArray2["default"])(resetItems ? [] : items), (0, _toConsumableArray2["default"])(nextPageItems)); var newSelectedItems = selectedItems.concat(nextPageItems.filter(function (_ref9) { var selected = _ref9.selected; return selected; })).filter(function (value, index, self) { return self.findIndex(function (_ref0) { var id = _ref0.id; return id === value.id; }) === index; }); var newIndeterminateItems = indeterminateItems.concat(nextPageItems.filter(function (_ref1) { var indeterminate = _ref1.indeterminate; return indeterminate; })).filter(function (value, index, self) { return self.findIndex(function (_ref10) { var id = _ref10.id; return id === value.id; }) === index; }); var noResultsFound = newItems.length === 0 && Boolean(searchValue); var isEmpty = newItems.length === 0 && !searchValue; _this.setState({ items: newItems, selectedItems: newSelectedItems, indeterminateItems: newIndeterminateItems, isLoaded: true, isEmpty: isEmpty, isSearching: false, totalCount: totalCount, noResultsFound: noResultsFound }); }; _this._loadInitialItems = function () { var searchValue = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ''; var _ref11 = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {}, resetItems = _ref11.resetItems; _this._getInitialData(searchValue).then(function (dataSourceProps) { return _this._updateItems(_objectSpread(_objectSpread({ resetItems: resetItems }, dataSourceProps), {}, { searchValue: searchValue })); }); }; _this._getInitialData = function () { var searchValue = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ''; var _this$props4 = _this.props, dataSource = _this$props4.dataSource, itemsPerPage = _this$props4.itemsPerPage; var initialAmountToLoad = _this.props.initialAmountToLoad || itemsPerPage; return dataSource(searchValue, 0, initialAmountToLoad); }; _this._loadMore = function () { var _this$props5 = _this.props, dataSource = _this$props5.dataSource, itemsPerPage = _this$props5.itemsPerPage; var _this$state6 = _this.state, items = _this$state6.items, searchValue = _this$state6.searchValue; dataSource(searchValue, items.length, itemsPerPage).then(function (dataSourceProps) { return _this._updateItems(_objectSpread(_objectSpread({}, dataSourceProps), {}, { searchValue: searchValue })); }); }; _this._getEnabledItems = function (items) { return items.filter(function (_ref12) { var disabled = _ref12.disabled; return !disabled; }); }; return _this; } (0, _inherits2["default"])(SelectorList, _React$PureComponent); return (0, _createClass2["default"])(SelectorList, [{ key: "componentDidMount", value: function componentDidMount() { this._loadInitialItems(); } /** Resets list items and loads first page from dataSource while persisting searchValue */ }, { key: "reloadInitialItems", value: function reloadInitialItems() { var searchValue = this.state.searchValue; this.setState({ searchValue: searchValue, isSearching: Boolean(searchValue), isLoaded: false }); this._loadInitialItems(searchValue, { resetItems: true }); } }, { key: "render", value: function render() { var children = this.props.children; var selectedItems = this.state.selectedItems; if (typeof children === 'function') { return children({ renderList: this._renderList, renderToggleAllCheckbox: this._renderToggleAllCheckbox, selectedItems: selectedItems }); } return this._renderList(); } }, { key: "_hasMore", value: function _hasMore() { var _this$state7 = this.state, items = _this$state7.items, isLoaded = _this$state7.isLoaded, totalCount = _this$state7.totalCount, isSearching = _this$state7.isSearching; return items.length === 0 && !isLoaded || items.length < totalCount || isSearching; } }]); }(_react["default"].PureComponent); SelectorList.displayName = 'SelectorList'; SelectorList.defaultProps = { searchPlaceholder: 'Search...', size: 'medium', imageShape: 'rectangular', showDivider: false, itemsPerPage: 50, withSearch: true, height: '100%', maxHeight: '100%', deselectAllText: 'Deselect all', multiple: false, selectAllText: 'Select all' };