UNPKG

@wix/design-system

Version:

@wix/design-system

400 lines (399 loc) 16.6 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); exports.__esModule = true; exports.default = exports.FormField = void 0; var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _react = _interopRequireWildcard(require("react")); var _InfoIcon = _interopRequireDefault(require("../InfoIcon")); var _uniqueId = _interopRequireDefault(require("lodash/uniqueId")); var _Text = _interopRequireWildcard(require("../Text")); var _FormField2 = require("./FormField.constants"); var _FormFieldSt = require("./FormField.st.css.js"); var _wixUiIconsCommon = require("@wix/wix-ui-icons-common"); var _system = require("@wix/wix-ui-icons-common/system"); var _StatusContext = require("./StatusContext"); var _FieldSet = require("../FieldSet/FieldSet.context"); var _IconThemeContext = require("../WixDesignSystemIconThemeProvider/IconThemeContext"); var _context = require("../WixDesignSystemProvider/context"); var _jsxFileName = "/home/builduser/work/57e038ea7326c1ec/packages/wix-design-system/dist/cjs/FormField/FormField.tsx"; function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); } 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; } class FormField extends _react.Component { constructor(props) { super(props); this.labelId = void 0; this.statusId = void 0; this.state = { lengthLeft: undefined }; this.childrenRenderPropInterface = { setCharactersLeft: lengthLeft => this.setState({ lengthLeft }) }; this._getLabelPlacement = () => { var _ref = this.context, mobile = _ref.mobile; return mobile ? _FormField2.PLACEMENT.top : this.props.labelPlacement; }; this._hasCharCounter = () => this.props.charCount !== undefined || typeof this.state.lengthLeft === 'number'; this.charactersLeft = lengthLeft => { var labelSize = this.props.labelSize; var colorProps = lengthLeft && lengthLeft >= 0 ? { light: true, secondary: true } : { skin: _Text.SKINS.error }; return /*#__PURE__*/_react.default.createElement(_Text.default, (0, _extends2.default)({ className: (0, _FormFieldSt.st)(_FormFieldSt.classes.charCount, { labelSize }), size: _Text.SIZES.small, weight: _Text.WEIGHTS.normal }, colorProps, { dataHook: _FormField2.DATA_HOOKS.counter, children: lengthLeft, __self: this, __source: { fileName: _jsxFileName, lineNumber: 83, columnNumber: 7 } })); }; this._renderCharCounter = () => { if (!this._hasCharCounter()) { return; } var charCount = this.props.charCount; return this.charactersLeft(charCount !== undefined ? charCount : this.state.lengthLeft); }; this._renderInfoIcon = () => { var _this$props = this.props, infoContent = _this$props.infoContent, infoTooltipProps = _this$props.infoTooltipProps, showInfoIconOnHover = _this$props.showInfoIconOnHover; return infoContent && /*#__PURE__*/_react.default.createElement(_InfoIcon.default, { dataHook: _FormField2.DATA_HOOKS.infoIcon, className: (0, _FormFieldSt.st)(_FormFieldSt.classes.infoIcon, { showInfoIconOnHover: String(showInfoIconOnHover) }), content: infoContent, tooltipProps: infoTooltipProps, size: "small", __self: this, __source: { fileName: _jsxFileName, lineNumber: 108, columnNumber: 9 } }); }; this._renderSuffix = () => { var suffix = this.props.suffix; return (suffix || this._hasCharCounter()) && /*#__PURE__*/_react.default.createElement("div", { "data-hook": _FormField2.DATA_HOOKS.suffix, className: (0, _FormFieldSt.st)(_FormFieldSt.classes.suffix, { noLabel: !this.props.label || this._getLabelPlacement() !== _FormField2.PLACEMENT.top }), __self: this, __source: { fileName: _jsxFileName, lineNumber: 126, columnNumber: 9 } }, suffix ? suffix : this._renderCharCounter()); }; this._hasInlineElements = (label, labelPlacement) => { var hasInlineLabel = label && (labelPlacement === _FormField2.PLACEMENT.left || labelPlacement === _FormField2.PLACEMENT.right); var hasInlineIndicator = !label && (this.props.required || !!this.props.infoContent); return hasInlineLabel || hasInlineIndicator; }; this._renderLabel = _ref2 => { var trimLongText = _ref2.trimLongText, labelSize = _ref2.labelSize, asterisk = _ref2.asterisk; var _this$props2 = this.props, label = _this$props2.label, id = _this$props2.id, required = _this$props2.required, infoContent = _this$props2.infoContent, ellipsis = _this$props2.ellipsis, maxLines = _this$props2.maxLines; var weight = labelSize === 'tiny' ? 'normal' : undefined; var hasSuffix = required || infoContent; return /*#__PURE__*/_react.default.createElement(_Text.default, { size: labelSize, weight: weight, htmlFor: id, id: this.labelId, tagName: "label", dataHook: _FormField2.DATA_HOOKS.label, ellipsis: ellipsis !== null && ellipsis !== void 0 ? ellipsis : trimLongText, maxLines: maxLines, style: { display: 'block' // allows the label to be centered vertically }, secondary: true, className: (0, _FormFieldSt.st)(_FormFieldSt.classes.label, { labelSize, size: labelSize }), suffix: hasSuffix ? /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, required && asterisk, this._renderInfoIcon()) : undefined, __self: this, __source: { fileName: _jsxFileName, lineNumber: 165, columnNumber: 7 } }, label); }; this._renderStatusIcon = icons => { var status = this.props.status; if (!status || status === 'loading') return; var iconByStatus = { [_FormField2.STATUS.error]: icons.StatusAlertFilledSmall, [_FormField2.STATUS.warning]: icons.StatusWarningFilledSmall }; var Icon = iconByStatus[status]; return /*#__PURE__*/_react.default.createElement("div", { className: _FormFieldSt.classes.statusIcon, __self: this, __source: { fileName: _jsxFileName, lineNumber: 213, columnNumber: 7 } }, /*#__PURE__*/_react.default.createElement(Icon, { __self: this, __source: { fileName: _jsxFileName, lineNumber: 214, columnNumber: 9 } })); }; this._renderStatusMessage = icons => { var _this$props3 = this.props, statusMessage = _this$props3.statusMessage, status = _this$props3.status, labelSize = _this$props3.labelSize; return /*#__PURE__*/_react.default.createElement("div", { className: (0, _FormFieldSt.st)(_FormFieldSt.classes.statusMessage, { status, labelSize }), __self: this, __source: { fileName: _jsxFileName, lineNumber: 226, columnNumber: 7 } }, (status === _FormField2.STATUS.error || status === _FormField2.STATUS.warning) && this._renderStatusIcon(icons), /*#__PURE__*/_react.default.createElement(_Text.default, { id: this.statusId, dataHook: _FormField2.DATA_HOOKS.statusMessage, skin: status === _FormField2.STATUS.error ? 'error' : 'standard', secondary: status !== _FormField2.STATUS.error, size: "tiny", __self: this, __source: { fileName: _jsxFileName, lineNumber: 234, columnNumber: 9 } }, statusMessage)); }; this._getCustomColumns = () => { var _this$props4 = this.props, labelWidth = _this$props4.labelWidth, inputWidth = _this$props4.inputWidth; var labelPlacement = this._getLabelPlacement(); var labelColumn = labelWidth !== null && labelWidth !== void 0 ? labelWidth : 'auto'; var inputColumn = inputWidth !== null && inputWidth !== void 0 ? inputWidth : 'auto'; if (labelPlacement === _FormField2.PLACEMENT.left) { return "".concat(labelColumn, " ").concat(inputColumn); } else if (labelPlacement === _FormField2.PLACEMENT.right) { return "".concat(inputColumn, " ").concat(labelColumn); } else return undefined; }; this.labelId = props.labelId || (0, _uniqueId.default)('formfield-'); this.statusId = props.labelId ? "".concat(props.labelId, "-status") : (0, _uniqueId.default)('formfield-status-'); } _renderChildren() { var children = this.props.children; if (typeof children === 'function') { return children(this.childrenRenderPropInterface); } return children; } render() { var _this$props5 = this.props, label = _this$props5.label, labelAlignment = _this$props5.labelAlignment, labelSize = _this$props5.labelSize, required = _this$props5.required, dataHook = _this$props5.dataHook, children = _this$props5.children, classNames = _this$props5.classNames, stretchContent = _this$props5.stretchContent, statusMessage = _this$props5.statusMessage, status = _this$props5.status, labelWidth = _this$props5.labelWidth, inputWidth = _this$props5.inputWidth, ellipsis = _this$props5.ellipsis; var labelPlacement = this._getLabelPlacement(); var rootStyles = label ? { labelPlacement, labelAlignment, stretchContent, required, minLabelHeight: !children } : { stretchContent, required, minLabelHeight: !children }; var hasInlineElements = this._hasInlineElements(label, labelPlacement); var hasCustomWidth = !!labelWidth || !!inputWidth; return /*#__PURE__*/_react.default.createElement(_IconThemeContext.IconThemeContext.Consumer, { __self: this, __source: { fileName: _jsxFileName, lineNumber: 297, columnNumber: 7 } }, _ref3 => { var _themeIcons$FormField, _themeIcons$FormField2, _themeIcons$FormField3; var _ref3$icons = _ref3.icons, themeIcons = _ref3$icons === void 0 ? {} : _ref3$icons; var icons = { Asterisk: ((_themeIcons$FormField = themeIcons.FormField) == null ? void 0 : _themeIcons$FormField.Asterisk) || _system.Asterisk, StatusAlertFilledSmall: ((_themeIcons$FormField2 = themeIcons.FormField) == null ? void 0 : _themeIcons$FormField2.StatusAlertFilledSmall) || _wixUiIconsCommon.StatusAlertFilledSmall, StatusWarningFilledSmall: ((_themeIcons$FormField3 = themeIcons.FormField) == null ? void 0 : _themeIcons$FormField3.StatusWarningFilledSmall) || _wixUiIconsCommon.StatusWarningFilledSmall }; var asterisk = /*#__PURE__*/_react.default.createElement("div", { "data-hook": _FormField2.DATA_HOOKS.asterisk, className: _FormFieldSt.classes.asterisk, __self: this, __source: { fileName: _jsxFileName, lineNumber: 310, columnNumber: 13 } }, /*#__PURE__*/_react.default.createElement(icons.Asterisk, { __self: this, __source: { fileName: _jsxFileName, lineNumber: 311, columnNumber: 15 } })); return /*#__PURE__*/_react.default.createElement("div", { "data-hoverable-action-trigger": true, "data-hook": dataHook, "data-status": status, className: (0, _FormFieldSt.st)(_FormFieldSt.classes.root, _objectSpread(_objectSpread(_objectSpread({}, rootStyles), label ? { labelSize } : {}), {}, { hasInlineElements }), classNames), style: labelPlacement !== _FormField2.PLACEMENT.top && hasCustomWidth ? { gridTemplateColumns: this._getCustomColumns() } : {}, __self: this, __source: { fileName: _jsxFileName, lineNumber: 316, columnNumber: 13 } }, label && labelPlacement === _FormField2.PLACEMENT.top && /*#__PURE__*/_react.default.createElement("div", { className: _FormFieldSt.classes.labelRow, __self: this, __source: { fileName: _jsxFileName, lineNumber: 336, columnNumber: 17 } }, /*#__PURE__*/_react.default.createElement("div", { className: _FormFieldSt.classes.labelRowMain, __self: this, __source: { fileName: _jsxFileName, lineNumber: 337, columnNumber: 19 } }, this._renderLabel({ trimLongText: true, labelSize, asterisk })), this._renderSuffix()), children && /*#__PURE__*/_react.default.createElement("div", { "data-hook": _FormField2.DATA_HOOKS.children, className: (0, _FormFieldSt.st)(_FormFieldSt.classes.children, { childrenWithInlineLabel: hasInlineElements }), __self: this, __source: { fileName: _jsxFileName, lineNumber: 349, columnNumber: 17 } }, !label && this._renderSuffix(), /*#__PURE__*/_react.default.createElement(_FieldSet.FieldSetContext.Consumer, { __self: this, __source: { fileName: _jsxFileName, lineNumber: 356, columnNumber: 19 } }, fieldSet => /*#__PURE__*/_react.default.createElement(_StatusContext.StatusContext.Provider, { value: { status, ariaLabelledBy: this.labelId, ariaDescribedBy: [this.statusId, status === fieldSet.status && fieldSet.statusId].filter(Boolean).join(' ') }, __self: this, __source: { fileName: _jsxFileName, lineNumber: 358, columnNumber: 23 } }, this._renderChildren()))), hasInlineElements && /*#__PURE__*/_react.default.createElement("div", { className: (0, _FormFieldSt.st)(_FormFieldSt.classes.labelRow, { ellipsis }), __self: this, __source: { fileName: _jsxFileName, lineNumber: 378, columnNumber: 17 } }, /*#__PURE__*/_react.default.createElement("div", { className: _FormFieldSt.classes.labelRowMain, __self: this, __source: { fileName: _jsxFileName, lineNumber: 383, columnNumber: 19 } }, this._renderLabel({ trimLongText: false, labelSize, asterisk })), !!label && this._renderSuffix()), statusMessage && this._renderStatusMessage(icons)); }); } } exports.FormField = FormField; FormField.displayName = 'FormField'; FormField.contextType = _context.WixDesignSystemContext; FormField.defaultProps = { required: false, stretchContent: true, labelSize: 'small', labelPlacement: _FormField2.PLACEMENT.top, labelAlignment: _FormField2.ALIGN.middle }; var _default = exports.default = FormField; //# sourceMappingURL=FormField.js.map