@activecollab/components
Version:
ActiveCollab Components
452 lines (450 loc) • 20.1 kB
JavaScript
;
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