@wix/design-system
Version:
@wix/design-system
444 lines (442 loc) • 18.1 kB
JavaScript
"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'
};