UNPKG

@activecollab/components

Version:

ActiveCollab Components

452 lines (450 loc) • 20.1 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.Autocomplete = void 0; exports.isOptionGroup = isOptionGroup; var _styledComponents = _interopRequireDefault(require("styled-components")); var _react = _interopRequireWildcard(require("react")); var _reactCustomScrollbars = require("react-custom-scrollbars-2"); var _HandleKeyboard = require("./HandleKeyboard"); var _Styles = require("./Styles"); var _useHighlightText = _interopRequireDefault(require("../../hooks/useHighlightText")); var _Option = require("../Select/Option"); var _Styles2 = require("../Select/Option/Styles"); var _OptionGroup = require("../Select/OptionGroup"); function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); } function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && Object.prototype.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); } function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } } function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; } 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) { _defineProperty(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 _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == typeof i ? i : String(i); } function _toPrimitive(t, r) { if ("object" != typeof t || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != typeof i) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); } function isOptionGroup(item) { return item.options !== undefined; } var Autocomplete = exports.Autocomplete = function Autocomplete(_ref) { var type = _ref.type, _ref$options = _ref.options, options = _ref$options === void 0 ? [] : _ref$options, inputEl = _ref.inputEl, _ref$selected = _ref.selected, selected = _ref$selected === void 0 ? [] : _ref$selected, emptyValue = _ref.emptyValue, noResultText = _ref.noResultText, _ref$renderOption = _ref.renderOption, renderOption = _ref$renderOption === void 0 ? function (option) { return option === null || option === void 0 ? void 0 : option.name; } : _ref$renderOption, defaultValue = _ref.defaultValue, _ref$sortDirection = _ref.sortDirection, sortDirection = _ref$sortDirection === void 0 ? "asc" : _ref$sortDirection, handleChange = _ref.handleChange, optionClassName = _ref.optionClassName, handleEmptyAction = _ref.handleEmptyAction, disabledInternalSort = _ref.disabledInternalSort, AutocompleteClassName = _ref.AutocompleteClassName, handleDefaultOptionChange = _ref.handleDefaultOptionChange, preselectDefaultValue = _ref.preselectDefaultValue, _ref$keepSameOptionsO = _ref.keepSameOptionsOrder, keepSameOptionsOrder = _ref$keepSameOptionsO === void 0 ? false : _ref$keepSameOptionsO, _ref$autoHeightMax = _ref.autoHeightMax, autoHeightMax = _ref$autoHeightMax === void 0 ? 340 : _ref$autoHeightMax, clearInputOnSelect = _ref.clearInputOnSelect, _ref$mixedOptions = _ref.mixedOptions, mixedOptions = _ref$mixedOptions === void 0 ? [] : _ref$mixedOptions; var itemRef = (0, _react.useRef)(null); var listRef = (0, _react.useRef)(null); var selectedOptions = (0, _react.useMemo)(function () { if (Array.isArray(selected)) { return selected; } return [selected]; }, [selected]); var handleSort = (0, _react.useCallback)(function (opts) { var _opts$; if (keepSameOptionsOrder) { return opts; } var isGrouped = Array.isArray((_opts$ = opts[0]) === null || _opts$ === void 0 ? void 0 : _opts$.options); var sortOptions = function sortOptions(a, b) { var aSelected = selectedOptions.includes(a.id); var bSelected = selectedOptions.includes(b.id); var aMixed = mixedOptions.includes(a.id); var bMixed = mixedOptions.includes(b.id); if (aSelected && !bSelected) { return -1; } if (!aSelected && bSelected) { return 1; } if (aMixed && !bMixed) { return -1; } if (!aMixed && bMixed) { return 1; } return 0; }; if (isGrouped) { return opts.map(function (group) { var sortedGroupOptions = group.options.sort(sortOptions); return _objectSpread(_objectSpread({}, group), {}, { options: sortedGroupOptions }); }); } else { return opts.sort(sortOptions); } // eslint-disable-next-line react-hooks/exhaustive-deps }, []); var sortList = (0, _react.useCallback)(function (options) { var _options$; if (disabledInternalSort) { return handleSort([...options]); } var isGrouped = Array.isArray((_options$ = options[0]) === null || _options$ === void 0 ? void 0 : _options$.options); if (isGrouped) { var sortedOptions = options.map(function (group) { var sortedGroupOptions = group.options.sort(function (a, b) { return sortDirection === "asc" ? a.name.localeCompare(b.name) : b.name.localeCompare(a.name); }); return _objectSpread(_objectSpread({}, group), {}, { options: handleSort(sortedGroupOptions) }); }); return handleSort(sortedOptions); } else { var _sortedOptions = options.sort(function (a, b) { return sortDirection === "asc" ? a.name.localeCompare(b.name) : b.name.localeCompare(a.name); }); return handleSort(_sortedOptions); } }, [sortDirection, disabledInternalSort, handleSort]); var sortedList = (0, _react.useMemo)(function () { return sortList(options); }, [options, sortList]); var _useState = (0, _react.useState)({ item: undefined, by: undefined }), _useState2 = _slicedToArray(_useState, 2), hover = _useState2[0], setHover = _useState2[1]; var _useState3 = (0, _react.useState)(""), _useState4 = _slicedToArray(_useState3, 2), filter = _useState4[0], setFilter = _useState4[1]; var handleEmpty = (0, _react.useCallback)(function (e) { if (e && e.button !== 0) { return; } if (handleEmptyAction) { var _inputEl$current; inputEl === null || inputEl === void 0 || (_inputEl$current = inputEl.current) === null || _inputEl$current === void 0 || _inputEl$current.focus(); setFilter(""); handleEmptyAction(filter); } }, [filter, handleEmptyAction, inputEl]); var onAddNewMouseEnter = (0, _react.useCallback)(function () { return setHover({ item: "addNew", by: "mouse" }); }, []); var showAddNew = (0, _react.useMemo)(function () { return !!(emptyValue && filter.trim() && options.every(function (option) { if (isOptionGroup(option)) { return option.options.every(function (v) { return v.name.toLowerCase() !== filter.trim().toLowerCase(); }); } return option.name.toLowerCase() !== filter.trim().toLowerCase(); })); }, [emptyValue, filter, options]); var renderAddNew = (0, _react.useMemo)(function () { return /*#__PURE__*/_react.default.createElement(_Styles.StyledAutocompleteNewItem, { ref: hover.item === "addNew" ? itemRef : null, key: "emptyValue", hover: hover.item === "addNew", onMouseDown: handleEmpty, onMouseEnter: onAddNewMouseEnter }, emptyValue); }, [emptyValue, handleEmpty, hover, onAddNewMouseEnter]); var filterOptions = (0, _react.useCallback)(function (options, filter) { var trimmedFilter = filter.trim(); var isGrouped = options[0] && isOptionGroup(options[0]); if (isGrouped) { var hovered = false; return options.reduce(function (acc, groupedOption) { var filteredOptions = groupedOption.options.filter(function (v) { return v.name.toLowerCase().includes(trimmedFilter.toLowerCase()); }); if (filteredOptions.length > 0) { if (!hovered && filter) { setHover({ item: filteredOptions[0].id, by: "keyboard" }); } hovered = true; return [...acc, _objectSpread(_objectSpread({}, groupedOption), {}, { options: filteredOptions })]; } return [...acc]; }, []); } else { var filteredOptions = options.filter(function (v) { return v.name.toLowerCase().includes(trimmedFilter.toLowerCase()); }); if (filter && filteredOptions.length > 0) { setHover({ item: filteredOptions[0].id, by: "keyboard" }); } if (filteredOptions.length === 0 && emptyValue) { setHover({ item: "addNew", by: "keyboard" }); } return filteredOptions; } }, [emptyValue]); var list = (0, _react.useMemo)(function () { return filterOptions(sortedList, filter); }, [filter, filterOptions, sortedList]); var showDefaultOption = (0, _react.useMemo)(function () { return !!defaultValue && !filter; }, [defaultValue, filter]); var flatOptions = (0, _react.useMemo)(function () { var options = list.reduce(function (acc, option) { if (!isOptionGroup(option)) { return [...acc, option]; } return [...acc, ...option.options]; }, []); return filterOptions(options, filter); }, [filter, filterOptions, list]); var handleInputChange = (0, _react.useCallback)(function (e) { if (e.target && !(e.key === "ArrowDown") && !(e.key === "ArrowUp") && !(e.key === "Enter")) { setFilter(e.target.value); } }, []); var handleHoverCallback = (0, _react.useCallback)(function (e) { setHover({ item: e, by: "mouse" }); }, []); var toggleSelected = (0, _react.useCallback)(function (id) { var result; if (id !== null) { if (type === "multiple") { if (selectedOptions.includes(id)) { result = selectedOptions.filter(function (_id) { return _id !== id; }); } else { result = [...selectedOptions, id]; } } else { result = id; } if (clearInputOnSelect && inputEl !== null && inputEl !== void 0 && inputEl.current) { inputEl.current.value = ""; inputEl.current.dispatchEvent(new Event("change", { bubbles: true })); } setFilter(""); } else { if (typeof handleDefaultOptionChange === "function") { handleDefaultOptionChange(); return; } } if (typeof handleChange === "function") { handleChange(result); } }, [clearInputOnSelect, handleChange, handleDefaultOptionChange, inputEl, selectedOptions, type]); var handleMouseEnter = (0, _react.useCallback)(function (e) { if (e === undefined || e === null) { return setHover({ item: null, by: "mouse" }); } setHover({ item: e, by: "mouse" }); }, []); var handleClick = (0, _react.useCallback)(function (e) { e.preventDefault(); toggleSelected(hover.item); }, [toggleSelected, hover]); var handleRenderOption = (0, _react.useCallback)(function (item, index) { if (isOptionGroup(item)) { return /*#__PURE__*/_react.default.createElement(_OptionGroup.OptionGroup, { checked: selectedOptions, name: item.name, tooltip: item.tooltip, key: item.id, setHover: handleHoverCallback, id: item.id, hover: hover.item, options: item.options, renderOptions: handleRenderOption, type: type, onChange: handleChange, filter: filter, mixedOptions: mixedOptions }); } return /*#__PURE__*/_react.default.createElement(_Option.Option, { name: item.name, ref: itemRef, key: index, tooltip: item.tooltip, onMouseEnter: handleMouseEnter, onClick: handleClick, id: item.id, hover: item.id === hover.item, className: optionClassName, renderOption: renderOption(_objectSpread(_objectSpread({}, item), {}, { name: (0, _useHighlightText.default)(item.name, filter) }), { id: "option_".concat(item.id), checked: selectedOptions && selectedOptions.includes(item.id), hover: hover.item === item.id, onChange: function onChange() { return null; } }) }); }, [handleClick, handleMouseEnter, hover.item, optionClassName, renderOption, filter, selectedOptions, handleHoverCallback, type, handleChange, mixedOptions]); var handleOnMouseLeave = (0, _react.useCallback)(function () { setHover({ item: undefined, by: "mouse" }); }, []); var handleScroll = (0, _react.useCallback)(function (list, itemOffset) { if (list.getClientHeight() + list.getScrollTop() < itemOffset + 40) { return list.scrollTop(itemOffset - list.getClientHeight() + 30); } if (list.getScrollTop() > itemOffset) { return list.scrollTop(itemOffset); } }, []); (0, _react.useEffect)(function () { if (hover.by === "keyboard" && hover.item !== undefined) { var item = itemRef.current; var _list = listRef.current; if (itemRef && item && _list) { handleScroll(_list, item.offsetTop); } } }, [handleScroll, hover]); var handleOnKeyDown = (0, _react.useCallback)(function (e) { if (e.key === "Enter") { e.preventDefault(); if (hover.item === undefined && filter === "") { return; } if (hover.item === "addNew") { handleEmpty(null); return; } if (hover.item === null && handleDefaultOptionChange) { handleDefaultOptionChange(); return; } if (typeof hover.item !== "undefined" || hover.item !== null) { toggleSelected(hover.item); setFilter(""); } return; } setHover({ item: (0, _HandleKeyboard.handleKeyboardMovement)(e, hover.item, flatOptions, showAddNew, showDefaultOption), by: "keyboard" }); }, [filter, flatOptions, toggleSelected, handleDefaultOptionChange, handleEmpty, hover, showAddNew, showDefaultOption]); (0, _react.useEffect)(function () { var _inputEl$current2; var listenerTarget = (_inputEl$current2 = inputEl === null || inputEl === void 0 ? void 0 : inputEl.current) !== null && _inputEl$current2 !== void 0 ? _inputEl$current2 : document; listenerTarget.addEventListener("input", handleInputChange); listenerTarget.addEventListener("keydown", handleOnKeyDown); return function () { listenerTarget.removeEventListener("input", handleInputChange); listenerTarget.removeEventListener("keydown", handleOnKeyDown); }; }, [handleInputChange, handleOnKeyDown, inputEl]); var isDefaultOptionSelected = (0, _react.useCallback)(function () { if (preselectDefaultValue) { return selectedOptions.length < 1 || selectedOptions[0] === ""; } else { return selectedOptions[0] === null || selectedOptions.length === flatOptions.length; } }, [flatOptions.length, preselectDefaultValue, selectedOptions]); var showNoResult = (0, _react.useMemo)(function () { return noResultText && !showAddNew && list.length < 1 && (defaultValue && filter || !defaultValue); }, [noResultText, showAddNew, list.length, defaultValue, filter]); var renderNoResult = (0, _react.useMemo)(function () { return /*#__PURE__*/_react.default.createElement(_StyledStyledOption, null, noResultText); }, [noResultText]); return /*#__PURE__*/_react.default.createElement(_Styles.StyledAutocompleteScrollShadow, { className: AutocompleteClassName, $isHidden: !defaultValue && !emptyValue && !noResultText && list.length < 1 }, function (_ref2) { var onScroll = _ref2.onScroll; return /*#__PURE__*/_react.default.createElement(_Styles.StyledAutocompleteBody, { key: "body", onMouseLeave: handleOnMouseLeave }, /*#__PURE__*/_react.default.createElement(_reactCustomScrollbars.Scrollbars, { ref: listRef, key: "scrollBar", autoHeight: true, autoHeightMax: autoHeightMax, onScroll: onScroll }, defaultValue && !filter && /*#__PURE__*/_react.default.createElement(_Option.Option, { name: defaultValue, ref: itemRef, hover: hover.item === null, onMouseEnter: handleMouseEnter, onClick: function onClick(e) { e.preventDefault(); toggleSelected(null); }, renderOption: renderOption({ name: defaultValue, id: null }, { checked: isDefaultOptionSelected(), hover: hover.item === null, onChange: function onChange() { return null; } }) }), list.map(function (item, index) { return handleRenderOption(item, index); }), showNoResult && renderNoResult, showAddNew && renderAddNew)); }); }; Autocomplete.displayName = "Autocomplete"; var _StyledStyledOption = (0, _styledComponents.default)(_Styles2.StyledOption).withConfig({ displayName: "Autocomplete___StyledStyledOption", componentId: "sc-9x4q7e-0" })(["cursor:auto"]); //# sourceMappingURL=Autocomplete.js.map