UNPKG

grommet

Version:

focus on the essential experience

151 lines (147 loc) 7.1 kB
"use strict"; exports.__esModule = true; exports.DataSearch = void 0; var _react = _interopRequireWildcard(require("react")); var _Search = require("grommet-icons/icons/Search"); var _Box = require("../Box"); var _DataContext = require("../../contexts/DataContext"); var _DropButton = require("../DropButton"); var _DataFormContext = require("../../contexts/DataFormContext"); var _FormField = require("../FormField"); var _Skeleton = require("../Skeleton"); var _TextInput = require("../TextInput"); var _Keyboard = require("../Keyboard"); var _MessageContext = require("../../contexts/MessageContext"); var _ResponsiveContext = require("../../contexts/ResponsiveContext"); var _propTypes = require("./propTypes"); var _responsive = require("../../utils/responsive"); var _useDebounce = require("../../utils/use-debounce"); var _useThemeValue2 = require("../../utils/useThemeValue"); var _excluded = ["drop", "id", "responsive", "updateOn"]; function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, "default": e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); } function _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); } function _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; } var dropProps = { align: { top: 'bottom', left: 'left' } }; // 300ms was chosen empirically as a reasonable default var DEBOUNCE_TIMEOUT = 300; var DataSearch = exports.DataSearch = function DataSearch(_ref) { var _theme$dataSearch$ico, _theme$data$button, _theme$data; var drop = _ref.drop, idProp = _ref.id, responsive = _ref.responsive, updateOn = _ref.updateOn, rest = _objectWithoutPropertiesLoose(_ref, _excluded); var _useContext = (0, _react.useContext)(_DataContext.DataContext), dataId = _useContext.id, messages = _useContext.messages, addToolbarKey = _useContext.addToolbarKey, onView = _useContext.onView, view = _useContext.view, views = _useContext.views; var _useContext2 = (0, _react.useContext)(_DataFormContext.DataFormContext), inDataForm = _useContext2.inDataForm; var _useContext3 = (0, _react.useContext)(_MessageContext.MessageContext), format = _useContext3.format; var _useThemeValue = (0, _useThemeValue2.useThemeValue)(), theme = _useThemeValue.theme; var size = (0, _react.useContext)(_ResponsiveContext.ResponsiveContext); var skeleton = (0, _Skeleton.useSkeleton)(); var debounce = (0, _useDebounce.useDebounce)(DEBOUNCE_TIMEOUT); var _useState = (0, _react.useState)(), showContent = _useState[0], setShowContent = _useState[1]; var _useState2 = (0, _react.useState)(view == null ? void 0 : view.search), value = _useState2[0], setValue = _useState2[1]; var id = idProp || dataId + "--search"; var SearchIcon = ((_theme$dataSearch$ico = theme.dataSearch.icons) == null ? void 0 : _theme$dataSearch$ico.search) || _Search.Search; (0, _react.useEffect)(function () { if (!inDataForm) addToolbarKey('_search'); }, [addToolbarKey, inDataForm]); (0, _react.useEffect)(function () { return setValue(view == null ? void 0 : view.search); }, [view == null ? void 0 : view.search]); var updateView = function updateView(e) { var _e$target; var nextView = _extends({}, view, { search: (_e$target = e.target) == null ? void 0 : _e$target.value }); // If there's a named view in effect that has a search term // we'll clear the named view (but leave it's other filters) var currentView = nextView.view && (views == null ? void 0 : views.find(function (v) { return v.name === nextView.view; })); if (currentView != null && currentView.search) { delete nextView.view; delete nextView.name; } // If page is set, reset it to 1 if (nextView.page) { nextView.page = 1; } onView(nextView); }; var onChange = function onChange(e) { var _e$target2, _e$target3; setValue((_e$target2 = e.target) == null ? void 0 : _e$target2.value); // do the search if the input was cleared or update on change if (updateOn !== 'submit' || ((_e$target3 = e.target) == null ? void 0 : _e$target3.value) === '') debounce(function () { return function () { return updateView(e); }; }); }; var content = skeleton ? null : /*#__PURE__*/_react["default"].createElement(_TextInput.TextInput, _extends({ "aria-label": format({ id: 'dataSearch.label', messages: messages == null ? void 0 : messages.dataSearch }), id: id, name: "_search", icon: /*#__PURE__*/_react["default"].createElement(SearchIcon, null), type: "search", value: value, onChange: onChange }, rest)); if (updateOn === 'submit') content = /*#__PURE__*/_react["default"].createElement(_Keyboard.Keyboard, { onEnter: updateView }, content); if (!inDataForm) // likely in Toolbar. // Wrap in Box to give it a reasonable width content = /*#__PURE__*/_react["default"].createElement(_Box.Box, null, content);else content = /*#__PURE__*/_react["default"].createElement(_FormField.FormField, { htmlFor: id, label: format({ id: 'dataSearch.label', messages: messages == null ? void 0 : messages.dataSearch }) }, content); if (!drop && (!responsive || !(0, _responsive.isSmall)(size))) return content; var control = /*#__PURE__*/_react["default"].createElement(_DropButton.DropButton, _extends({ id: dataId + "--search-control", "aria-label": format({ id: 'dataSearch.open', messages: messages == null ? void 0 : messages.dataSort }), kind: (_theme$data$button = theme.data.button) == null ? void 0 : _theme$data$button.kind, icon: /*#__PURE__*/_react["default"].createElement(SearchIcon, null), dropProps: dropProps, dropContent: /*#__PURE__*/_react["default"].createElement(_Box.Box, { pad: (_theme$data = theme.data) == null || (_theme$data = _theme$data.drop) == null ? void 0 : _theme$data.pad }, content), open: showContent, onOpen: function onOpen() { return setShowContent(undefined); }, onClose: function onClose() { return setShowContent(undefined); } }, rest)); return control; }; DataSearch.propTypes = _propTypes.DataSearchPropTypes;