monday-ui-react-core
Version:
Official monday.com UI resources for application development in React.js
147 lines (136 loc) • 3.45 kB
JSX
import React, { forwardRef } from "react";
import PropTypes from "prop-types";
import classNames from "classnames";
import "./Search.scss";
import TextField from "../TextField/TextField";
import useMergeRefs from "../../hooks/useMergeRefs";
import { SIZES, TYPES } from "./SearchConstats";
const NOOP = () => {};
const TYPE_CLASSES = {
round: "search_component--round",
underline: "input-component__input--only-underline",
square: ""
};
function getType(type) {
return TYPE_CLASSES[type] || "";
}
const ICON_NAMES = {
primary: "Search",
secondary: "Clear Search"
};
const Search = forwardRef(
(
{
secondaryIconName,
iconName,
onChange,
autoFocus,
underline,
value,
placeholder,
disabled,
debounceRate,
onBlur,
onFocus,
wrapperClassName,
setRef,
autoComplete,
size,
type,
className,
id,
validation,
inputAriaLabel,
iconNames
},
ref
) => {
const mergedRef = useMergeRefs({ refs: [ref, setRef] });
return (
<TextField
id={id}
iconName={iconName}
value={value}
onChange={onChange}
autoFocus={autoFocus}
underline={underline}
placeholder={placeholder}
disabled={disabled}
debounceRate={debounceRate}
className={classNames(className, "search_component", getType(type))}
secondaryIconName={secondaryIconName}
wrapperClassName={classNames(wrapperClassName, "search_component_wrapper")}
onBlur={onBlur}
onFocus={onFocus}
ref={mergedRef}
autoComplete={autoComplete}
size={size}
clearOnIconClick
validation={validation}
inputAriaLabel={inputAriaLabel}
iconsNames={iconNames}
type="search"
role="search"
/>
);
}
);
Search.sizes = SIZES;
Search.types = TYPES;
Search.propTypes = {
secondaryIconName: PropTypes.string,
iconName: PropTypes.string,
onChange: PropTypes.func,
autoFocus: PropTypes.bool,
underline: PropTypes.bool,
value: PropTypes.string,
placeholder: PropTypes.string,
disabled: PropTypes.bool,
debounceRate: PropTypes.number,
onBlur: PropTypes.func,
onFocus: PropTypes.func,
wrapperClassName: PropTypes.string,
setRef: PropTypes.func,
autoComplete: PropTypes.string,
/* SIZES is exposed on the component itself */
size: PropTypes.oneOf([SIZES.SMALL, SIZES.MEDIUM, SIZES.LARGE]),
/* TYPES is exposed on the component itself */
type: PropTypes.oneOf([TYPES.SQUARE, TYPES.SQUARE, TYPES.UNDERLINE]),
className: PropTypes.string,
id: PropTypes.string,
validation: PropTypes.shape({
status: PropTypes.string,
text: PropTypes.string
}),
inputAriaLabel: PropTypes.string,
/* Icon names labels for a11y */
iconNames: PropTypes.shape({
layout: PropTypes.string,
primary: PropTypes.string,
secondary: PropTypes.string
})
};
Search.defaultProps = {
secondaryIconName: "icon-dapulse-close",
iconName: "icon-v2-search",
onChange: NOOP,
autoFocus: false,
underline: false,
value: "",
placeholder: "",
disabled: false,
debounceRate: 200,
onBlur: NOOP,
onFocus: NOOP,
wrapperClassName: "",
setRef: NOOP,
autoComplete: "off",
size: SIZES.MEDIUM,
type: TYPES.SQUARE,
className: "",
id: "search",
validation: null,
inputAriaLabel: "",
iconNames: ICON_NAMES
};
export default Search;