UNPKG

wix-style-react

Version:
215 lines (184 loc) • 8.28 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; var _react = _interopRequireDefault(require("react")); var _propTypes = _interopRequireDefault(require("prop-types")); var _ContentSt = require("./Content.st.css"); var _SelectorList = require("../SelectorList.helpers"); var _Selector = _interopRequireDefault(require("../../Selector")); var _Loader = _interopRequireDefault(require("../../Loader")); var _InfiniteScroll = _interopRequireDefault(require("../../utils/InfiniteScroll")); var _Text = _interopRequireDefault(require("../../Text")); var DEFAULT_EMPTY = /*#__PURE__*/_react["default"].createElement("div", { className: _ContentSt.classes.defaultEmptyStateWrapper }, /*#__PURE__*/_react["default"].createElement(_Text["default"], null, "You don't have any items")); var ListItems = function ListItems(_ref) { var items = _ref.items, checkIsSelected = _ref.checkIsSelected, _onToggle = _ref.onToggle, imageSize = _ref.imageSize, imageShape = _ref.imageShape, multiple = _ref.multiple; if (!items.length) { return null; } return /*#__PURE__*/_react["default"].createElement("ul", { "data-hook": _SelectorList.dataHooks.list, className: _ContentSt.classes.list }, items.map(function (item) { return /*#__PURE__*/_react["default"].createElement(_Selector["default"], { id: item.id, key: item.id, dataHook: _SelectorList.dataHooks.selector, imageSize: imageSize, imageShape: imageShape, toggleType: multiple ? 'checkbox' : 'radio', image: item.image, title: item.title, subtitle: item.subtitle, extraNode: item.extraNode ? item.extraNode : item.extraText && /*#__PURE__*/_react["default"].createElement(_Text["default"], { secondary: true }, item.extraText), subtitleNode: item.subtitleNode, belowNode: item.belowNode, showBelowNodeOnSelect: item.showBelowNodeOnSelect, isSelected: checkIsSelected(item), isDisabled: item.disabled, onToggle: function onToggle() { !item.disabled && _onToggle(item); } }); })); }; var SelectorListContent = function SelectorListContent(_ref2) { var dataHook = _ref2.dataHook, items = _ref2.items, topScrollableContent = _ref2.topScrollableContent, onToggle = _ref2.onToggle, emptyState = _ref2.emptyState, renderNoResults = _ref2.renderNoResults, isLoading = _ref2.isLoading, checkIsSelected = _ref2.checkIsSelected, isEmpty = _ref2.isEmpty, noResultsFound = _ref2.noResultsFound, imageSize = _ref2.imageSize, imageShape = _ref2.imageShape, multiple = _ref2.multiple, searchValue = _ref2.searchValue, loadMore = _ref2.loadMore, hasMore = _ref2.hasMore, infiniteScrollRef = _ref2.infiniteScrollRef; return /*#__PURE__*/_react["default"].createElement("div", { className: _ContentSt.classes.content, "data-hook": dataHook }, isLoading && /*#__PURE__*/_react["default"].createElement("div", { className: _ContentSt.classes.mainLoaderWrapper }, /*#__PURE__*/_react["default"].createElement(_Loader["default"], { size: "medium", dataHook: _SelectorList.dataHooks.mainLoader })), isEmpty && /*#__PURE__*/_react["default"].createElement("div", { "data-hook": _SelectorList.dataHooks.emptyState, className: _ContentSt.classes.emptyStateWrapper, children: emptyState }), items.length > 0 && /*#__PURE__*/_react["default"].createElement(_InfiniteScroll["default"], { key: searchValue, ref: infiniteScrollRef, data: items, loadMore: loadMore, hasMore: hasMore, useWindow: false, initialLoad: false, loader: /*#__PURE__*/_react["default"].createElement("div", { className: _ContentSt.classes.nextPageLoaderWrapper }, /*#__PURE__*/_react["default"].createElement(_Loader["default"], { size: "small", dataHook: _SelectorList.dataHooks.nextPageLoader })) }, topScrollableContent, /*#__PURE__*/_react["default"].createElement(ListItems, { items: items, checkIsSelected: checkIsSelected, onToggle: onToggle, imageSize: imageSize, imageShape: imageShape, multiple: multiple })), noResultsFound && /*#__PURE__*/_react["default"].createElement("div", { "data-hook": _SelectorList.dataHooks.noResultsFoundState, className: _ContentSt.classes.noResultsFoundStateWrapper, children: renderNoResults(searchValue) })); }; SelectorListContent.propTypes = { /** applied as data-hook HTML attribute that can be used to create driver in testing */ dataHook: _propTypes["default"].string, /** array of selector items to show */ items: _propTypes["default"].arrayOf(_propTypes["default"].shape({ id: _propTypes["default"].oneOfType([_propTypes["default"].number, _propTypes["default"].string]).isRequired, title: _propTypes["default"].node.isRequired, subtitle: _propTypes["default"].string, extraText: _propTypes["default"].string, extraNode: _propTypes["default"].node, disabled: _propTypes["default"].bool, // show item as disabled, dont count it in "select all", exclude from `onOk` selected: _propTypes["default"].bool, // force item as selected image: _propTypes["default"].node, subtitleNode: _propTypes["default"].node, belowNode: _propTypes["default"].node, showBelowNodeOnSelect: _propTypes["default"].bool })), /** Component/element that will be rendered above the list that will not be sticky, but scrollable */ topScrollableContent: _propTypes["default"].node, /** callback to trigger when toggling a selector, receives SelectorList item */ onToggle: _propTypes["default"].func, /** * Component/element that will be rendered when there is nothing to display, * i.e. empty `{items:[], totalCount: 0}` was returned on the first call to `dataSource` * */ emptyState: _propTypes["default"].node, /** * Function that will get the current `searchQuery` and should return the component/element * that will be rendered when there are no items that suffice the entered search query * */ renderNoResults: _propTypes["default"].func, /** whether list is loading */ isLoading: _propTypes["default"].bool, /** a function that receives an item and checks if it is selected */ checkIsSelected: _propTypes["default"].func.isRequired, /** whether list is empty */ isEmpty: _propTypes["default"].bool, /** whether list search found no matching items */ noResultsFound: _propTypes["default"].bool, /** Image icon size */ imageSize: _propTypes["default"].oneOf(['tiny', 'small', 'portrait', 'large', 'cinema']), /** * Image icon shape, `rectangular` or `circle`.<br> * NOTE: `circle` is not compatible with `imageSize` of `portrait` or `cinema` * */ imageShape: function imageShape(props, propName, componentName) { if (['portrait', 'cinema'].includes(props.imageSize) && props[propName] === 'circle') { return new Error("".concat(componentName, ": prop \"imageSize\" with value of \"").concat(props.imageSize, "\" is incompatible with prop imageShape with value of \"circle\" \u2014 use \"rectangular\" instead.")); } }, /** display checkbox and allow multi selection */ multiple: _propTypes["default"].bool, /** search input value */ searchValue: _propTypes["default"].string.isRequired, /** A callback called when more items are requested to be rendered. */ loadMore: _propTypes["default"].func.isRequired, /** Whether there are more items to be loaded. */ hasMore: _propTypes["default"].bool }; SelectorListContent.defaultProps = { dataHook: _SelectorList.dataHooks.content, emptyState: DEFAULT_EMPTY, renderNoResults: function renderNoResults(searchValue) { return /*#__PURE__*/_react["default"].createElement("div", { className: _ContentSt.classes.defaultNoResultsFoundStateWrapper }, /*#__PURE__*/_react["default"].createElement(_Text["default"], null, "No items matched your search ", "\"".concat(searchValue, "\""))); } }; var _default = SelectorListContent; exports["default"] = _default;