@talend/react-components
Version:
Set of react components.
260 lines (258 loc) • 8.02 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = FilterBar;
var _react = require("react");
var _reactDebounceInput = _interopRequireDefault(require("react-debounce-input"));
var _reactI18next = require("react-i18next");
var _classnames = _interopRequireDefault(require("classnames"));
var _propTypes = _interopRequireDefault(require("prop-types"));
var _reactBootstrap = require("@talend/react-bootstrap");
var _Actions = require("../Actions");
var _constants = _interopRequireDefault(require("../constants"));
var _Icon = _interopRequireDefault(require("../Icon"));
var _FilterBarModule = _interopRequireDefault(require("./FilterBar.module.scss"));
var _jsxRuntime = require("react/jsx-runtime");
function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; }
function forceBlur(event) {
event.target.blur();
}
function onKeyDown(event, escAction, enterAction) {
switch (event.key) {
case 'Enter':
if (enterAction) {
enterAction(event);
}
break;
case 'Esc':
case 'Escape':
if (escAction) {
escAction(event);
}
break;
default:
break;
}
}
function FilterInput(props) {
const {
id,
debounceMinLength,
debounceTimeout,
onBlur,
onClear,
onFocus,
onFilter,
autoFocus,
placeholder,
value,
disabled,
...rest
} = props;
const {
t
} = (0, _reactI18next.useTranslation)(_constants.default);
const placeholderLabel = placeholder || t('LIST_FILTER_LABEL', {
defaultValue: 'Filter'
});
const inputProps = {
'data-test': rest['data-test'],
'data-feature': rest['data-feature'],
id,
name: 'search',
type: 'search',
value,
placeholder: placeholderLabel,
autoComplete: 'off',
disabled,
className: (0, _classnames.default)(_FilterBarModule.default.search),
'aria-label': placeholderLabel,
onBlur: onBlur && (event => {
onBlur(event, event.target.value);
}),
onFocus: onFocus && (event => onFocus(event, event.target.value)),
onChange: event => onFilter(event, event.target.value),
onKeyDown: event => onKeyDown(event, onClear, forceBlur),
autoFocus,
role: 'searchbox'
};
if (debounceMinLength || debounceTimeout) {
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactDebounceInput.default, {
...inputProps,
element: _reactBootstrap.FormControl,
minLength: debounceMinLength,
debounceTimeout: debounceTimeout
});
}
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_reactBootstrap.FormControl, {
...inputProps
});
}
FilterInput.propTypes = {
autoFocus: _propTypes.default.bool,
id: _propTypes.default.string,
debounceMinLength: _propTypes.default.number,
debounceTimeout: _propTypes.default.number,
onBlur: _propTypes.default.func,
onClear: _propTypes.default.func,
onFocus: _propTypes.default.func,
onFilter: _propTypes.default.func.isRequired,
placeholder: _propTypes.default.string,
value: _propTypes.default.string,
'data-test': _propTypes.default.string,
'data-feature': _propTypes.default.string,
disabled: _propTypes.default.bool
};
/**
* @param {object} props react props
* @example
<FilterBar id="my-filter" docked="false" onFilter="filter()"></Filter>
*/
function FilterBar(props) {
const {
onFocus,
onBlur,
onToggle,
onFilter
} = props;
const [focus, setFocus] = (0, _react.useState)();
const [value, setValue] = (0, _react.useState)();
const {
t
} = (0, _reactI18next.useTranslation)(_constants.default);
(0, _react.useEffect)(() => {
// in controlled mode, if the value changes, replace the current value
setValue(props.value);
}, [props.value]);
const onFocusCallback = event => {
setFocus(true);
if (onFocus) {
onFocus(event);
}
};
const onBlurCallback = event => {
setFocus(false);
if (onBlur) {
onBlur(event);
}
if (!value && onToggle) {
onToggle(event);
}
};
const onFilterCallback = event => {
setValue(event.target.value);
if (onFilter) {
onFilter(event, event.target.value);
}
};
const onClearCallback = event => {
// needed to avoid blur of the input
event.preventDefault();
onFilterCallback({
target: {
value: ''
}
});
};
const onSubmit = event => {
event.preventDefault();
return onFilterCallback(event);
};
if (props.dockable && props.docked) {
return /*#__PURE__*/(0, _jsxRuntime.jsx)(_Actions.Action, {
id: props.id,
className: (0, _classnames.default)(props.className, _FilterBarModule.default['button-docked']),
onClick: props.onToggle,
label: t('LIST_FILTER_TOGGLE', {
defaultValue: 'Toggle filter'
}),
hideLabel: true,
icon: "talend-search",
"data-feature": props['data-feature'],
tooltipPlacement: props.tooltipPlacement,
role: "search"
});
}
const classes = (0, _classnames.default)(_FilterBarModule.default.filter, props.className, {
[_FilterBarModule.default.highlight]: props.highlight,
[_FilterBarModule.default.navbar]: props.navbar
});
return /*#__PURE__*/(0, _jsxRuntime.jsx)("form", {
className: classes,
role: "search",
onSubmit: onSubmit,
children: /*#__PURE__*/(0, _jsxRuntime.jsxs)("div", {
className: (0, _classnames.default)('form-group', {
[_FilterBarModule.default.animate]: props.dockable
}),
children: [/*#__PURE__*/(0, _jsxRuntime.jsx)(_Icon.default, {
name: "talend-search",
className: (0, _classnames.default)(_FilterBarModule.default['search-icon'], {
[_FilterBarModule.default['search-focused']]: focus
})
}), /*#__PURE__*/(0, _jsxRuntime.jsx)(FilterInput, {
disabled: props.disabled,
"data-feature": props['data-feature'],
"data-test": props['data-test']
// eslint-disable-next-line jsx-a11y/no-autofocus
,
autoFocus: props.autoFocus,
id: props.id && `${props.id}-input`,
debounceMinLength: props.debounceMinLength,
debounceTimeout: props.debounceTimeout,
onBlur: onBlurCallback,
onClear: onClearCallback,
onFocus: onFocusCallback,
onFilter: onFilterCallback,
onToggle: props.onToggle,
placeholder: props.placeholder,
value: value,
dockable: props.dockable,
t: t
}), value ? /*#__PURE__*/(0, _jsxRuntime.jsx)(_Actions.Action, {
className: _FilterBarModule.default.remove,
id: props.id && `${props.id}-cross-icon`,
"data-test": props['data-test'] && `${props['data-test']}-reset`,
"data-feature": props['data-feature'] && `${props['data-feature']}-reset`,
icon: "talend-cross",
label: t('LIST_FILTER_REMOVE', {
defaultValue: 'Remove filter'
}),
hideLabel: true,
tooltipPlacement: props.tooltipPlacement,
onMouseDown: onClearCallback
}) : null]
})
});
}
FilterBar.propTypes = {
autoFocus: _propTypes.default.bool,
id: _propTypes.default.string,
className: _propTypes.default.string,
'data-test': _propTypes.default.string,
'data-feature': _propTypes.default.string,
debounceMinLength: _propTypes.default.number,
debounceTimeout: _propTypes.default.number,
docked: _propTypes.default.bool,
dockable: _propTypes.default.bool,
navbar: _propTypes.default.bool,
onBlur: _propTypes.default.func,
onFocus: _propTypes.default.func,
onFilter: _propTypes.default.func.isRequired,
onToggle: _propTypes.default.func,
highlight: _propTypes.default.bool,
placeholder: _propTypes.default.string,
value: _propTypes.default.string,
tooltipPlacement: _propTypes.default.string,
disabled: _propTypes.default.bool
};
FilterBar.defaultProps = {
autoFocus: true,
dockable: true,
docked: true,
navbar: true,
disabled: false,
className: ''
};
//# sourceMappingURL=FilterBar.component.js.map