@carbon/ibm-cloud-cognitive-cdai
Version:
Carbon for Cloud & Cognitive CD&AI UI components
300 lines (295 loc) • 12.7 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _typeof = require("@babel/runtime/helpers/typeof");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.default = void 0;
var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _react = _interopRequireWildcard(require("react"));
var _propTypes = _interopRequireDefault(require("prop-types"));
var _pluralize = _interopRequireDefault(require("pluralize"));
var _creatable = _interopRequireDefault(require("react-select/creatable"));
var _carbonComponentsReact = require("carbon-components-react");
var _iconsReact = require("@carbon/icons-react");
var _settings = require("../../globals/js/settings");
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(e) { return e ? t : r; })(e); }
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != _typeof(e) && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; } //
// Copyright IBM Corp. 2020, 2020
//
// This source code is licensed under the Apache-2.0 license found in the
// LICENSE file in the root directory of this source tree.
//
var Highlight = /*#__PURE__*/_react.default.memo(function (_ref) {
var children = _ref.children,
search = _ref.search;
if (
// We accept arbitrary React nodes but we can't highlight them
typeof children !== 'string' || !search) {
return children;
}
var searchRegExp = new RegExp(search.replace(/[.*+?^${}()|[\]\\]/g, '\\$&'), 'ig');
var newChildren = [];
var result;
var index = 0;
while ((result = searchRegExp.exec(children)) !== null) {
newChildren.push(
// Non-matching substring (could be empty)
children.substring(index, result.index),
/*#__PURE__*/
// Matching substring (can't be empty)
_react.default.createElement("mark", {
key: newChildren.length
}, children.substring(result.index, searchRegExp.lastIndex)));
index = searchRegExp.lastIndex;
}
// Remainder of string did not match (could be empty)
newChildren.push(children.substring(index));
return newChildren;
});
Highlight.displayName = 'Highlight';
Highlight.propTypes = {
children: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.node]),
search: _propTypes.default.string
};
// custom styling
var customStyles = {
multiValueLabel: function multiValueLabel(provided) {
return _objectSpread(_objectSpread({}, provided), {}, {
color: 'inherit'
});
},
control: function control(provided, state) {
var style = _objectSpread(_objectSpread({}, provided), {}, {
borderRadius: 0,
paddingLeft: '26px',
minHeight: '3rem',
outline: '2px solid transparent',
// important overrides
borderTop: 'none',
borderRight: 'none',
borderLeft: 'none',
backgroundColor: undefined
});
if (state.isFocused || state.isHovered) {
style = _objectSpread(_objectSpread({}, style), {}, {
borderBottom: 'solid 1px transparent',
paddingLeft: '27px'
});
}
return style;
},
menu: function menu(provided) {
return _objectSpread(_objectSpread({}, provided), {}, {
borderRadius: 0,
padding: '1rem 26px',
margin: '2px 0',
// important overrides
backgroundColor: undefined
});
},
placeholder: function placeholder(provided) {
return _objectSpread({}, provided);
},
groupHeading: function groupHeading(provided) {
return _objectSpread(_objectSpread({}, provided), {}, {
textTransform: 'none',
fontSize: '0.875rem'
});
}
};
// custom behaviour
var getNewOptionData = function getNewOptionData() {
var allowPlaintext = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
return function (inputValue, optionLabel) {
if (allowPlaintext) {
return {
label: optionLabel,
value: inputValue,
__plaintext__: true
};
}
};
};
var formatCreateLabel = function formatCreateLabel(searchForText) {
return function (inputValue) {
return "".concat(searchForText, " \"").concat(inputValue, "\"");
};
};
var findCategoryForOption = function findCategoryForOption(option, allOptions) {
var category = allOptions.find(function (category) {
return category.options.find(function (thisOption) {
return thisOption.value === option.value;
});
});
return _pluralize.default.singular(category.label);
};
var _formatOptionLabel = function formatOptionLabel(option, context, allOptions) {
// highlight search text if we"re rendering an existing option in the menu,
// not in the tags already selected, and not in the "seach for..." option
var shouldHighlight = !context.selectValue.includes(option) && !option.__plaintext__;
// when rendering in the input, rather than the list, we want to include
// the category name, but not for plain text searches
var includeCategory = context.selectValue.includes(option) && !option.__plaintext__;
var valueSection = shouldHighlight ? /*#__PURE__*/_react.default.createElement(Highlight, {
search: context.inputValue
}, option.label) : option.label;
return includeCategory ? /*#__PURE__*/_react.default.createElement(_react.Fragment, null, /*#__PURE__*/_react.default.createElement("span", {
className: "".concat(_settings.idePrefix, "-filter--category")
}, findCategoryForOption(option, allOptions), ":"), valueSection) : valueSection;
};
// custom components
var MultiValueContainer = function MultiValueContainer(props) {
return /*#__PURE__*/_react.default.createElement(_carbonComponentsReact.Tag, {
type: props.data.type || 'filter',
className: "".concat(_settings.idePrefix, "-filter--tag")
}, /*#__PURE__*/_react.default.createElement("div", {
className: "".concat(_settings.idePrefix, "-filter--tag-container")
}, props.children));
};
var MultiValueRemove = function MultiValueRemove(props) {
var type = props.data.type || 'filter';
return /*#__PURE__*/_react.default.createElement("button", (0, _extends2.default)({
type: "button"
}, props.innerProps, {
className: "".concat(_settings.idePrefix, "-filter--close").concat(type === 'filter' ? " ".concat(_settings.idePrefix, "-filter--tag-filter") : /* istanbul ignore next */'')
}), /*#__PURE__*/_react.default.createElement(_iconsReact.Close16, {
description: "Close"
}));
};
var DropdownIndicator = function DropdownIndicator() {
return null;
};
var IndicatorSeparator = function IndicatorSeparator() {
return null;
};
var ClearIndicator = function ClearIndicator(props) {
return /*#__PURE__*/_react.default.createElement("div", (0, _extends2.default)({}, props.innerProps, {
className: "".concat(_settings.idePrefix, "-filter--clear")
}), /*#__PURE__*/_react.default.createElement(_iconsReact.Close16, {
description: "Clear"
}));
};
var IdeFilter = function IdeFilter(_ref2) {
var ariaLabel = _ref2.ariaLabel,
onChange = _ref2.onChange,
onInputChange = _ref2.onInputChange,
onBlur = _ref2.onBlur,
onFocus = _ref2.onFocus,
options = _ref2.options,
value = _ref2.value,
inputValue = _ref2.inputValue,
placeholderText = _ref2.placeholderText,
menuIsOpen = _ref2.menuIsOpen,
loadingMessage = _ref2.loadingMessage,
allowCreateWhileLoading = _ref2.allowCreateWhileLoading,
light = _ref2.light,
isLoading = _ref2.isLoading,
searchForText = _ref2.searchForText,
SearchIcon = _ref2.searchIcon,
autoFocus = _ref2.autoFocus,
allowPlaintext = _ref2.allowPlaintext;
return /*#__PURE__*/_react.default.createElement("div", {
className: "".concat(_settings.idePrefix, "-filter").concat(light ? " ".concat(_settings.idePrefix, "-filter--light") : '')
}, SearchIcon ? /*#__PURE__*/_react.default.createElement(SearchIcon, {
className: "".concat(_settings.idePrefix, "-filter--search-icon")
}) : /*#__PURE__*/_react.default.createElement(_iconsReact.Search16, {
className: "".concat(_settings.idePrefix, "-filter--search-icon"),
description: placeholderText
}), /*#__PURE__*/_react.default.createElement(_creatable.default, {
components: {
MultiValueContainer: MultiValueContainer,
MultiValueRemove: MultiValueRemove,
DropdownIndicator: DropdownIndicator,
IndicatorSeparator: IndicatorSeparator,
ClearIndicator: ClearIndicator
},
"aria-label": ariaLabel,
styles: customStyles,
menuIsOpen: menuIsOpen,
isMulti: true,
value: value,
inputValue: inputValue,
onChange: onChange,
onInputChange: onInputChange,
onBlur: onBlur,
onFocus: onFocus,
options: options,
placeholder: placeholderText,
className: "".concat(_settings.idePrefix, "-filter--select"),
classNamePrefix: "".concat(_settings.idePrefix, "-filter"),
formatOptionLabel: function formatOptionLabel(option, context) {
return _formatOptionLabel(option, context, options);
},
formatCreateLabel: formatCreateLabel(searchForText),
getNewOptionData: getNewOptionData(allowPlaintext),
loadingMessage: loadingMessage,
allowCreateWhileLoading: allowCreateWhileLoading,
isLoading: isLoading
// eslint-disable-next-line jsx-a11y/no-autofocus
,
autoFocus: autoFocus
}));
};
IdeFilter.displayName = 'IdeFilter';
IdeFilter.defaultProps = {
placeholderText: 'Search',
ariaLabel: 'Search',
searchForText: 'Search for',
closeText: 'Close',
clearText: 'Clear',
allowCreateWhileLoading: true,
isLoading: false,
autoFocus: false,
allowPlaintext: true
};
IdeFilter.propTypes = {
allowCreateWhileLoading: _propTypes.default.bool,
allowPlaintext: _propTypes.default.bool,
ariaLabel: _propTypes.default.string,
autoFocus: _propTypes.default.bool,
inputValue: _propTypes.default.string,
isLoading: _propTypes.default.bool,
light: _propTypes.default.bool,
loadingMessage: _propTypes.default.func,
menuIsOpen: _propTypes.default.bool,
onBlur: _propTypes.default.func,
onChange: _propTypes.default.func.isRequired,
onFocus: _propTypes.default.func,
onInputChange: _propTypes.default.func,
options: _propTypes.default.arrayOf(_propTypes.default.shape({
label: _propTypes.default.string.isRequired,
options: _propTypes.default.arrayOf(_propTypes.default.shape({
label: _propTypes.default.string.isRequired,
value: _propTypes.default.string.isRequired,
type: _propTypes.default.string
})).isRequired
})).isRequired,
placeholderText: _propTypes.default.string,
searchForText: _propTypes.default.string,
searchIcon: _propTypes.default.oneOfType([_propTypes.default.element, _propTypes.default.func]),
value: _propTypes.default.arrayOf(_propTypes.default.shape({
label: _propTypes.default.string.isRequired,
value: _propTypes.default.string.isRequired
}))
};
MultiValueContainer.propTypes = {
children: _propTypes.default.node,
data: _propTypes.default.shape({
type: _propTypes.default.string
})
};
MultiValueRemove.propTypes = {
children: _propTypes.default.node,
data: _propTypes.default.shape({
type: _propTypes.default.string
}),
innerProps: _propTypes.default.object
};
ClearIndicator.propTypes = {
innerProps: _propTypes.default.object
};
var _default = exports.default = IdeFilter;