UNPKG

8.59 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3exports.SearchInput = void 0;
4const tslib_1 = require("tslib");
5const React = tslib_1.__importStar(require("react"));
6const search_input_1 = tslib_1.__importDefault(require("@patternfly/react-styles/css/components/SearchInput/search-input"));
7const react_styles_1 = require("@patternfly/react-styles");
8const Button_1 = require("../Button");
9const Badge_1 = require("../Badge");
10const angle_down_icon_1 = tslib_1.__importDefault(require('@patternfly/react-icons/dist/js/icons/angle-down-icon'));
11const angle_up_icon_1 = tslib_1.__importDefault(require('@patternfly/react-icons/dist/js/icons/angle-up-icon'));
12const times_icon_1 = tslib_1.__importDefault(require('@patternfly/react-icons/dist/js/icons/times-icon'));
13const search_icon_1 = tslib_1.__importDefault(require('@patternfly/react-icons/dist/js/icons/search-icon'));
14const caret_down_icon_1 = tslib_1.__importDefault(require('@patternfly/react-icons/dist/js/icons/caret-down-icon'));
15const arrow_right_icon_1 = tslib_1.__importDefault(require('@patternfly/react-icons/dist/js/icons/arrow-right-icon'));
16const InputGroup_1 = require("../InputGroup");
17const AdvancedSearchMenu_1 = require("./AdvancedSearchMenu");
18const SearchInputBase = (_a) => {
19 var { className, value = '', attributes = [], formAdditionalItems, hasWordsAttrLabel = 'Has words', advancedSearchDelimiter, placeholder, hint, onChange, onSearch, onClear, onToggleAdvancedSearch, isAdvancedSearchOpen, resultsCount, onNextClick, onPreviousClick, innerRef, 'aria-label': ariaLabel = 'Search input', resetButtonLabel = 'Reset', openMenuButtonAriaLabel = 'Open advanced search', submitSearchButtonLabel = 'Search', isDisabled = false } = _a, props = tslib_1.__rest(_a, ["className", "value", "attributes", "formAdditionalItems", "hasWordsAttrLabel", "advancedSearchDelimiter", "placeholder", "hint", "onChange", "onSearch", "onClear", "onToggleAdvancedSearch", "isAdvancedSearchOpen", "resultsCount", "onNextClick", "onPreviousClick", "innerRef", 'aria-label', "resetButtonLabel", "openMenuButtonAriaLabel", "submitSearchButtonLabel", "isDisabled"]);
20 const [isSearchMenuOpen, setIsSearchMenuOpen] = React.useState(false);
21 const [searchValue, setSearchValue] = React.useState(value);
22 const searchInputRef = React.useRef(null);
23 const searchInputInputRef = innerRef || React.useRef(null);
24 React.useEffect(() => {
25 setSearchValue(value);
26 }, [value]);
27 React.useEffect(() => {
28 if (attributes.length > 0 && !advancedSearchDelimiter) {
29 // eslint-disable-next-line no-console
30 console.error('An advancedSearchDelimiter prop is required when advanced search attributes are provided using the attributes prop');
31 }
32 });
33 React.useEffect(() => {
34 setIsSearchMenuOpen(isAdvancedSearchOpen);
35 }, [isAdvancedSearchOpen]);
36 const onChangeHandler = (event) => {
37 if (onChange) {
38 onChange(event.currentTarget.value, event);
39 }
40 setSearchValue(event.currentTarget.value);
41 };
42 const onToggle = (e) => {
43 const isOpen = !isSearchMenuOpen;
44 setIsSearchMenuOpen(isOpen);
45 if (onToggleAdvancedSearch) {
46 onToggleAdvancedSearch(e, isOpen);
47 }
48 };
49 const onSearchHandler = (event) => {
50 event.preventDefault();
51 if (onSearch) {
52 onSearch(value, event, getAttrValueMap());
53 }
54 setIsSearchMenuOpen(false);
55 };
56 const getAttrValueMap = () => {
57 const attrValue = {};
58 const pairs = searchValue.split(' ');
59 pairs.map(pair => {
60 const splitPair = pair.split(advancedSearchDelimiter);
61 if (splitPair.length === 2) {
62 attrValue[splitPair[0]] = splitPair[1];
63 }
64 else if (splitPair.length === 1) {
65 attrValue.haswords = attrValue.hasOwnProperty('haswords')
66 ? `${attrValue.haswords} ${splitPair[0]}`
67 : splitPair[0];
68 }
69 });
70 return attrValue;
71 };
72 const onEnter = (event) => {
73 if (event.key === 'Enter') {
74 onSearchHandler(event);
75 }
76 };
77 const onClearInput = (e) => {
78 if (onClear) {
79 onClear(e);
80 }
81 if (searchInputInputRef && searchInputInputRef.current) {
82 searchInputInputRef.current.focus();
83 }
84 };
85 return (React.createElement("div", Object.assign({ className: react_styles_1.css(className, search_input_1.default.searchInput), ref: searchInputRef }, props),
86 React.createElement(InputGroup_1.InputGroup, null,
87 React.createElement("div", { className: react_styles_1.css(search_input_1.default.searchInputBar) },
88 React.createElement("span", { className: react_styles_1.css(search_input_1.default.searchInputText) },
89 React.createElement("span", { className: react_styles_1.css(search_input_1.default.searchInputIcon) },
90 React.createElement(search_icon_1.default, null)),
91 hint && (React.createElement("input", { className: react_styles_1.css(search_input_1.default.searchInputTextInput, search_input_1.default.modifiers.hint), type: "text", disabled: true, "aria-hidden": "true", value: hint })),
92 React.createElement("input", { ref: searchInputInputRef, className: react_styles_1.css(search_input_1.default.searchInputTextInput), value: searchValue, placeholder: placeholder, "aria-label": ariaLabel, onKeyDown: onEnter, onChange: onChangeHandler, disabled: isDisabled })),
93 value && (React.createElement("span", { className: react_styles_1.css(search_input_1.default.searchInputUtilities) },
94 resultsCount && (React.createElement("span", { className: react_styles_1.css(search_input_1.default.searchInputCount) },
95 React.createElement(Badge_1.Badge, { isRead: true }, resultsCount))),
96 !!onNextClick && !!onPreviousClick && (React.createElement("span", { className: react_styles_1.css(search_input_1.default.searchInputNav) },
97 React.createElement(Button_1.Button, { variant: Button_1.ButtonVariant.plain, "aria-label": "Previous", isDisabled: isDisabled, onClick: onPreviousClick },
98 React.createElement(angle_up_icon_1.default, null)),
99 React.createElement(Button_1.Button, { variant: Button_1.ButtonVariant.plain, "aria-label": "Next", isDisabled: isDisabled, onClick: onNextClick },
100 React.createElement(angle_down_icon_1.default, null)))),
101 !!onClear && (React.createElement("span", { className: "pf-c-search-input__clear" },
102 React.createElement(Button_1.Button, { variant: Button_1.ButtonVariant.plain, isDisabled: isDisabled, "aria-label": resetButtonLabel, onClick: onClearInput },
103 React.createElement(times_icon_1.default, null))))))),
104 (attributes.length > 0 || onToggleAdvancedSearch) && (React.createElement(Button_1.Button, { className: isSearchMenuOpen && 'pf-m-expanded', variant: Button_1.ButtonVariant.control, "aria-label": openMenuButtonAriaLabel, onClick: onToggle, isDisabled: isDisabled, "aria-expanded": isSearchMenuOpen },
105 React.createElement(caret_down_icon_1.default, null))),
106 !!onSearch && (React.createElement(Button_1.Button, { type: "submit", variant: Button_1.ButtonVariant.control, "aria-label": submitSearchButtonLabel, onClick: onSearchHandler, isDisabled: isDisabled },
107 React.createElement(arrow_right_icon_1.default, null)))),
108 attributes.length > 0 && (React.createElement(AdvancedSearchMenu_1.AdvancedSearchMenu, { value: value, parentRef: searchInputRef, parentInputRef: searchInputInputRef, onSearch: onSearch, onClear: onClear, onChange: onChange, onToggleAdvancedMenu: onToggle, resetButtonLabel: resetButtonLabel, submitSearchButtonLabel: submitSearchButtonLabel, attributes: attributes, formAdditionalItems: formAdditionalItems, hasWordsAttrLabel: hasWordsAttrLabel, advancedSearchDelimiter: advancedSearchDelimiter, getAttrValueMap: getAttrValueMap, isSearchMenuOpen: isSearchMenuOpen }))));
109};
110SearchInputBase.displayName = 'SearchInputBase';
111exports.SearchInput = React.forwardRef((props, ref) => (React.createElement(SearchInputBase, Object.assign({}, props, { innerRef: ref }))));
112exports.SearchInput.displayName = 'SearchInput';
113//# sourceMappingURL=SearchInput.js.map
\No newline at end of file