suomifi-ui-components
Version:
Suomi.fi UI component library
257 lines (251 loc) • 11.7 kB
JavaScript
'use strict';
var tslib = require('tslib');
var React = require('react');
var styledComponents = require('styled-components');
var classnames = require('classnames');
var AutoId = require('../../utils/AutoId/AutoId.js');
var SuomifiThemeProvider = require('../../theme/SuomifiThemeProvider/SuomifiThemeProvider.js');
require('../../theme/SuomifiTheme/SuomifiTheme.js');
var SpacingProvider = require('../../theme/SpacingProvider/SpacingProvider.js');
var spacing = require('../../theme/utils/spacing.js');
var aria = require('../../../utils/aria/aria.js');
var Debounce = require('../../utils/Debounce/Debounce.js');
require('../../../reset/HtmlA/HtmlA.js');
var HtmlButton = require('../../../reset/HtmlButton/HtmlButton.js');
var HtmlDiv = require('../../../reset/HtmlDiv/HtmlDiv.js');
require('../../../reset/HtmlFieldSet/HtmlFieldSet.js');
require('../../../reset/HtmlH/HtmlH.js');
var HtmlInput = require('../../../reset/HtmlInput/HtmlInput.js');
require('../../../reset/HtmlLabel/HtmlLabel.js');
require('../../../reset/HtmlLegend/HtmlLegend.js');
require('../../../reset/HtmlLi/HtmlLi.js');
require('../../../reset/HtmlNav/HtmlNav.js');
require('../../../reset/HtmlOl/HtmlOl.js');
var HtmlSpan = require('../../../reset/HtmlSpan/HtmlSpan.js');
require('../../../reset/HtmlTextarea/HtmlTextarea.js');
require('../../../reset/HtmlUl/HtmlUl.js');
require('../../../reset/HtmlTable/HtmlTable.js');
require('../../../reset/HtmlTable/HtmlTableCaption.js');
require('../../../reset/HtmlTable/HtmlTableHeader.js');
require('../../../reset/HtmlTable/HtmlTableRow.js');
require('../../../reset/HtmlTable/HtmlTableBody.js');
require('../../../reset/HtmlTable/HtmlTableHeaderCell.js');
require('../../../reset/HtmlTable/HtmlTableCell.js');
var VisuallyHidden = require('../../VisuallyHidden/VisuallyHidden.js');
var StatusText = require('../StatusText/StatusText.js');
var Label = require('../Label/Label.js');
var suomifiIcons = require('suomifi-icons');
var SearchInput_baseStyles = require('./SearchInput.baseStyles.js');
var InputClearButton = require('../InputClearButton/InputClearButton.js');
var common = require('../../../utils/common/common.js');
function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
var React__default = /*#__PURE__*/_interopDefault(React);
var classnames__default = /*#__PURE__*/_interopDefault(classnames);
var baseClassName = 'fi-search-input';
var searchInputClassNames = {
fullWidth: "".concat(baseClassName, "--full-width"),
error: "".concat(baseClassName, "--error"),
notEmpty: "".concat(baseClassName, "--not-empty"),
labelIsVisible: "".concat(baseClassName, "_label--visible"),
styleWrapper: "".concat(baseClassName, "_wrapper"),
inputElement: "".concat(baseClassName, "_input"),
inputElementContainer: "".concat(baseClassName, "_input-element-container"),
functionalityContainer: "".concat(baseClassName, "_functionality-container"),
statusTextHasContent: "".concat(baseClassName, "_statusText--has-content"),
button: "".concat(baseClassName, "_button"),
searchButton: "".concat(baseClassName, "_button-search"),
searchIcon: "".concat(baseClassName, "_button-search-icon"),
clearButton: "".concat(baseClassName, "_button-clear"),
clearIcon: "".concat(baseClassName, "_button-clear-icon")
};
var BaseSearchInput = function (_super) {
tslib.__extends(BaseSearchInput, _super);
function BaseSearchInput() {
var _this = _super !== null && _super.apply(this, arguments) || this;
_this.state = {
value: _this.props.value || _this.props.defaultValue || ''
};
_this.inputRef = _this.props.forwardedRef || /*#__PURE__*/React.createRef();
return _this;
}
BaseSearchInput.getDerivedStateFromProps = function (nextProps, prevState) {
var value = nextProps.value;
if ('value' in nextProps && value !== prevState.value) {
return {
value: value
};
}
return null;
};
BaseSearchInput.prototype.render = function () {
var _a, _b, _c;
var _this = this;
var _d = this.props;
_d.value;
_d.defaultValue;
var className = _d.className,
labelText = _d.labelText,
labelMode = _d.labelMode,
clearButtonLabel = _d.clearButtonLabel,
searchButtonLabel = _d.searchButtonLabel,
searchButtonProps = _d.searchButtonProps,
style = _d.style,
propOnChange = _d.onChange,
propOnSearch = _d.onSearch;
_d.children;
var status = _d.status,
statusText = _d.statusText,
visualPlaceholder = _d.visualPlaceholder,
id = _d.id,
fullWidth = _d.fullWidth,
debounce = _d.debounce;
_d.theme;
_d.forwardedRef;
var ariaDescribedBy = _d["aria-describedby"],
_e = _d.statusTextAriaLiveMode,
statusTextAriaLiveMode = _e === void 0 ? 'assertive' : _e,
rest = tslib.__rest(_d, ["value", "defaultValue", "className", "labelText", "labelMode", "clearButtonLabel", "searchButtonLabel", "searchButtonProps", "style", "onChange", "onSearch", "children", "status", "statusText", "visualPlaceholder", "id", "fullWidth", "debounce", "theme", "forwardedRef", 'aria-describedby', "statusTextAriaLiveMode"]);
var _f = spacing.separateMarginProps(rest),
passProps = _f[1];
var statusTextId = "".concat(id, "-statusText");
var conditionalSetState = function conditionalSetState(newValue) {
if (!('value' in _this.props)) {
_this.setState({
value: newValue
});
}
};
var onSearch = function onSearch() {
if (!!propOnSearch) {
propOnSearch(_this.state.value);
}
};
var onClear = function onClear() {
conditionalSetState('');
if (propOnChange) {
propOnChange('');
}
setTimeout(function () {
if (_this.inputRef.current) {
_this.inputRef.current.focus();
}
}, 100);
};
var onKeyPress = function onKeyPress(event) {
if (!!_this.state.value && (event === null || event === void 0 ? void 0 : event.key) === 'Enter') {
onSearch();
}
};
var onKeyDown = function onKeyDown(event) {
if ((event === null || event === void 0 ? void 0 : event.key) === 'Escape') {
event.preventDefault();
}
};
var searchButtonDerivedProps = tslib.__assign(tslib.__assign(tslib.__assign({}, searchButtonProps), {
className: classnames__default.default(searchButtonProps === null || searchButtonProps === void 0 ? void 0 : searchButtonProps.className, searchInputClassNames.button, searchInputClassNames.searchButton)
}), !!this.state.value ? {
onClick: onSearch
} : {
tabIndex: -1,
hidden: true
});
var clearButtonProps = tslib.__assign({
className: classnames__default.default(searchInputClassNames.button, searchInputClassNames.clearButton)
}, !!this.state.value ? {
onClick: onClear
} : {
tabIndex: -1,
hidden: true
});
return /*#__PURE__*/React__default.default.createElement(HtmlDiv.HtmlDiv, {
className: classnames__default.default(className, baseClassName, (_a = {}, _a[searchInputClassNames.error] = status === 'error', _a[searchInputClassNames.notEmpty] = !!this.state.value, _a[searchInputClassNames.fullWidth] = fullWidth, _a)),
style: style
}, /*#__PURE__*/React__default.default.createElement(HtmlSpan.HtmlSpan, {
className: searchInputClassNames.styleWrapper
}, /*#__PURE__*/React__default.default.createElement(Label.Label, {
htmlFor: id,
labelMode: labelMode,
className: classnames__default.default((_b = {}, _b[searchInputClassNames.labelIsVisible] = labelMode !== 'hidden', _b))
}, labelText), /*#__PURE__*/React__default.default.createElement(Debounce.Debounce, {
waitFor: debounce
}, function (debouncer, cancelDebounce) {
return /*#__PURE__*/React__default.default.createElement(HtmlDiv.HtmlDiv, {
className: searchInputClassNames.functionalityContainer
}, /*#__PURE__*/React__default.default.createElement(HtmlDiv.HtmlDiv, {
className: searchInputClassNames.inputElementContainer
}, /*#__PURE__*/React__default.default.createElement(HtmlInput.HtmlInput, tslib.__assign({}, passProps, aria.getConditionalAriaProp('aria-describedby', [!!statusText ? statusTextId : undefined, ariaDescribedBy]), {
forwardedRef: _this.inputRef,
"aria-invalid": status === 'error',
id: id,
className: searchInputClassNames.inputElement,
type: "search",
role: "searchbox",
value: _this.state.value,
placeholder: visualPlaceholder,
onChange: function onChange(event) {
var eventValue = event.currentTarget.value;
conditionalSetState(eventValue);
if (propOnChange) {
debouncer(propOnChange, eventValue);
}
},
onKeyPress: onKeyPress,
onKeyDown: onKeyDown
}))), /*#__PURE__*/React__default.default.createElement(InputClearButton.InputClearButton, tslib.__assign({}, clearButtonProps, {
label: clearButtonLabel,
onClick: function onClick() {
onClear();
cancelDebounce();
}
})), /*#__PURE__*/React__default.default.createElement(HtmlButton.HtmlButton, tslib.__assign({}, searchButtonDerivedProps), /*#__PURE__*/React__default.default.createElement(VisuallyHidden.VisuallyHidden, null, searchButtonLabel), /*#__PURE__*/React__default.default.createElement(suomifiIcons.IconSearch, {
"aria-hidden": true,
className: searchInputClassNames.searchIcon
})));
}), /*#__PURE__*/React__default.default.createElement(StatusText.StatusText, {
id: statusTextId,
className: classnames__default.default((_c = {}, _c[searchInputClassNames.statusTextHasContent] = !!statusText, _c)),
status: status,
ariaLiveMode: statusTextAriaLiveMode
}, statusText)));
};
return BaseSearchInput;
}(React.Component);
var StyledSearchInput = styledComponents.styled(function (_a) {
_a.globalMargins;
var passProps = tslib.__rest(_a, ["globalMargins"]);
return /*#__PURE__*/React__default.default.createElement(BaseSearchInput, tslib.__assign({}, passProps));
}).withConfig({
componentId: "sc-15b5myw-0"
})(templateObject_1 || (templateObject_1 = tslib.__makeTemplateObject(["\n ", "\n"], ["\n ", "\n"])), function (_a) {
var theme = _a.theme,
globalMargins = _a.globalMargins,
rest = tslib.__rest(_a, ["theme", "globalMargins"]);
var _b = spacing.separateMarginProps(rest),
marginProps = _b[0];
var cleanedGlobalMargins = common.filterDuplicateKeys(globalMargins.searchInput, marginProps);
return SearchInput_baseStyles.baseStyles(theme, cleanedGlobalMargins, marginProps);
});
var SearchInput = /*#__PURE__*/React.forwardRef(function (props, ref) {
var propId = props.id,
passProps = tslib.__rest(props, ["id"]);
return /*#__PURE__*/React__default.default.createElement(SpacingProvider.SpacingConsumer, null, function (_a) {
var margins = _a.margins;
return /*#__PURE__*/React__default.default.createElement(SuomifiThemeProvider.SuomifiThemeConsumer, null, function (_a) {
var suomifiTheme = _a.suomifiTheme;
return /*#__PURE__*/React__default.default.createElement(AutoId.AutoId, {
id: propId
}, function (id) {
return /*#__PURE__*/React__default.default.createElement(StyledSearchInput, tslib.__assign({
theme: suomifiTheme,
id: id,
globalMargins: margins,
forwardedRef: ref
}, passProps));
});
});
});
});
SearchInput.displayName = 'SearchInput';
var templateObject_1;
exports.SearchInput = SearchInput;
//# sourceMappingURL=SearchInput.js.map