web-toolkit
Version:
A GTK inspired toolkit designed to build awesome web apps
181 lines (144 loc) • 5.7 kB
JavaScript
"use strict";
var _interopRequireWildcard = require("@babel/runtime/helpers/interopRequireWildcard");
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/slicedToArray"));
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/esm/objectWithoutProperties"));
var _react = _interopRequireWildcard(require("react"));
var _propTypes = _interopRequireDefault(require("prop-types"));
var _clsx = _interopRequireDefault(require("clsx"));
var _useControlled3 = _interopRequireDefault(require("../utils/useControlled"));
var _Box = _interopRequireDefault(require("./Box"));
var _Expander = _interopRequireDefault(require("./Expander"));
var _Input = _interopRequireDefault(require("./Input"));
var _Label = _interopRequireDefault(require("./Label"));
var _List = _interopRequireDefault(require("./List"));
var _Popover = _interopRequireDefault(require("./Popover"));
/*
* Autocomplete.js
*/
var propTypes = {
className: _propTypes.default.string,
value: _propTypes.default.string,
defaultValue: _propTypes.default.string,
/** The options shown in the list */
options: _propTypes.default.arrayOf(_propTypes.default.shape({
value: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.number]),
label: _propTypes.default.node
})),
/** Enables basic filtering of options.
* Set to `false` if you want to implement your own filtering. */
enableFilter: _propTypes.default.bool,
/** Called when the value changes (may prevent the value from updating, in conjuction with `value`) */
onChange: _propTypes.default.func,
/** Called when the value changes (passive) */
onSearch: _propTypes.default.func
};
var defaultProps = {
defaultValue: '',
enableFilter: true,
options: []
};
function Autocomplete(_ref) {
var className = _ref.className,
options = _ref.options,
valueProp = _ref.value,
defaultValue = _ref.defaultValue,
enableFilter = _ref.enableFilter,
refProp = _ref.ref,
onSearch = _ref.onSearch,
onChangeProp = _ref.onChange,
rest = (0, _objectWithoutProperties2.default)(_ref, ["className", "options", "value", "defaultValue", "enableFilter", "ref", "onSearch", "onChange"]);
var input = (0, _react.useRef)();
var _useControlled = (0, _useControlled3.default)(valueProp, defaultValue, onChangeProp),
_useControlled2 = (0, _slicedToArray2.default)(_useControlled, 2),
value = _useControlled2[0],
setValue = _useControlled2[1];
var _useState = (0, _react.useState)(false),
_useState2 = (0, _slicedToArray2.default)(_useState, 2),
isFocused = _useState2[0],
setIsFocused = _useState2[1];
var open = isFocused && options.length > 0;
var lowerCaseValue = value.toLowerCase();
var filteredOptions = enableFilter === false ? options : options.filter(function (o) {
return o.value.toLowerCase().includes(lowerCaseValue);
});
var onFocus = function onFocus() {
return setIsFocused(true);
};
var onBlur = function onBlur(ev) {
var _ev$relatedTarget;
var newValue = ev === null || ev === void 0 ? void 0 : (_ev$relatedTarget = ev.relatedTarget) === null || _ev$relatedTarget === void 0 ? void 0 : _ev$relatedTarget.getAttribute('data-value');
if (newValue) {
setValue(newValue);
}
setIsFocused(false);
};
var elementClassName = (0, _clsx.default)('Autocomplete', className);
var select = function select(option) {
setValue(option.value);
if (input.current) input.current.querySelector('input').blur();
};
var onChange = function onChange(newValue) {
setValue(newValue);
if (onSearch) onSearch(newValue);
};
var onAccept = function onAccept() {
if (filteredOptions.length > 0) select(filteredOptions[0]);
};
var content = /*#__PURE__*/_react.default.createElement(_Expander.default, {
open: open,
fitContent: true
}, /*#__PURE__*/_react.default.createElement(_List.default, {
border: false,
separators: false
}, filteredOptions.map(function (o) {
return /*#__PURE__*/_react.default.createElement(_List.default.Item, {
key: o.value,
activatable: true,
onClick: function onClick() {
return select(o);
},
"data-value": o.value
}, o.label || o.value);
}), filteredOptions.length === 0 && /*#__PURE__*/_react.default.createElement(_List.default.Item, {
key: "empty"
}, /*#__PURE__*/_react.default.createElement(_Box.default, {
justify: true
}, /*#__PURE__*/_react.default.createElement(_Label.default, {
muted: true,
italic: true
}, "(No results found)")))));
return /*#__PURE__*/_react.default.createElement(_Popover.default, {
className: "Autocomplete__popover",
open: open,
content: content,
arrow: false,
placement: "bottom-start",
width: "trigger-min",
shouldAttachEarly: true
}, /*#__PURE__*/_react.default.createElement(_Input.default, Object.assign({
className: elementClassName,
value: value,
onBlur: onBlur,
onFocus: onFocus,
onChange: onChange,
onAccept: onAccept
}, rest, {
ref: function ref(_ref2) {
input.current = _ref2;
if (refProp) {
if (typeof refProp === 'function') refProp(_ref2);else refProp.current = _ref2;
}
}
})));
}
var Export = Autocomplete;
Export.propTypes = propTypes;
Export.defaultProps = defaultProps;
var _default = Export;
exports.default = _default;
//# sourceMappingURL=Autocomplete.js.map