UNPKG

@wix/design-system

Version:

@wix/design-system

414 lines (413 loc) 15.1 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 _propTypes = _interopRequireDefault(require("prop-types")); 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 _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; } var asterisk = /*#__PURE__*/_react.default.createElement("div", { "data-hook": _FormField2.DATA_HOOKS.asterisk, className: _FormFieldSt.classes.asterisk, __self: void 0, __source: { fileName: _jsxFileName, lineNumber: 23, columnNumber: 3 } }, /*#__PURE__*/_react.default.createElement(_system.Asterisk, { __self: void 0, __source: { fileName: _jsxFileName, lineNumber: 24, columnNumber: 5 } })); 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._hasCharCounter = () => this.props.charCount !== undefined || typeof this.state.lengthLeft === 'number'; this.charactersLeft = lengthLeft => { var { labelSize } = this.props; 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: 103, columnNumber: 7 } })); }; this._renderCharCounter = () => { if (!this._hasCharCounter()) { return; } var { charCount } = this.props; return this.charactersLeft(charCount !== undefined ? charCount : this.state.lengthLeft); }; this._renderInfoIcon = () => { var { infoContent, infoTooltipProps, showInfoIconOnHover } = this.props; 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: 128, columnNumber: 9 } }); }; this._renderSuffix = () => { var { suffix } = this.props; 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.props.labelPlacement !== _FormField2.PLACEMENT.top }), __self: this, __source: { fileName: _jsxFileName, lineNumber: 146, 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 = _ref => { var { trimLongText, labelSize } = _ref; var { label, id, required, infoContent, ellipsis, maxLines } = this.props; 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: 183, columnNumber: 7 } }, label); }; this._renderStatusIcon = () => { var { status } = this.props; if (!status || status === 'loading') return; var iconByStatus = { [_FormField2.STATUS.error]: _wixUiIconsCommon.StatusAlertFilledSmall, [_FormField2.STATUS.warning]: _wixUiIconsCommon.StatusWarningFilledSmall }; var Icon = iconByStatus[status]; return /*#__PURE__*/_react.default.createElement("div", { className: _FormFieldSt.classes.statusIcon, __self: this, __source: { fileName: _jsxFileName, lineNumber: 225, columnNumber: 7 } }, /*#__PURE__*/_react.default.createElement(Icon, { __self: this, __source: { fileName: _jsxFileName, lineNumber: 226, columnNumber: 9 } })); }; this._renderStatusMessage = () => { var { statusMessage, status, labelSize } = this.props; return /*#__PURE__*/_react.default.createElement("div", { className: (0, _FormFieldSt.st)(_FormFieldSt.classes.statusMessage, { status, labelSize }), __self: this, __source: { fileName: _jsxFileName, lineNumber: 235, columnNumber: 7 } }, (status === _FormField2.STATUS.error || status === _FormField2.STATUS.warning) && this._renderStatusIcon(), /*#__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: 243, columnNumber: 9 } }, statusMessage)); }; this._getCustomColumns = () => { var { labelPlacement, labelWidth, inputWidth } = this.props; 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; if (typeof children === 'function') { return children(this.childrenRenderPropInterface); } return children; } render() { var { label, labelPlacement, labelAlignment, labelSize, required, dataHook, children, classNames, stretchContent, statusMessage, status, labelWidth, inputWidth, ellipsis } = this.props; 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("div", (0, _extends2.default)({}, this.props.showInfoIconOnHover && { '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: 304, columnNumber: 7 } }), label && labelPlacement === _FormField2.PLACEMENT.top && /*#__PURE__*/_react.default.createElement("div", { className: _FormFieldSt.classes.labelRow, __self: this, __source: { fileName: _jsxFileName, lineNumber: 322, columnNumber: 11 } }, /*#__PURE__*/_react.default.createElement("div", { className: _FormFieldSt.classes.labelRowMain, __self: this, __source: { fileName: _jsxFileName, lineNumber: 323, columnNumber: 13 } }, this._renderLabel({ trimLongText: true, labelSize })), 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: 331, columnNumber: 11 } }, !label && this._renderSuffix(), /*#__PURE__*/_react.default.createElement(_FieldSet.FieldSetContext.Consumer, { __self: this, __source: { fileName: _jsxFileName, lineNumber: 338, columnNumber: 13 } }, 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: 340, columnNumber: 17 } }, this._renderChildren()))), hasInlineElements && /*#__PURE__*/_react.default.createElement("div", { className: (0, _FormFieldSt.st)(_FormFieldSt.classes.labelRow, { ellipsis }), __self: this, __source: { fileName: _jsxFileName, lineNumber: 360, columnNumber: 11 } }, /*#__PURE__*/_react.default.createElement("div", { className: _FormFieldSt.classes.labelRowMain, __self: this, __source: { fileName: _jsxFileName, lineNumber: 365, columnNumber: 13 } }, this._renderLabel({ trimLongText: false, labelSize })), !!label && this._renderSuffix()), statusMessage && this._renderStatusMessage()); } } exports.FormField = FormField; FormField.displayName = 'FormField'; FormField.propTypes = { children: _propTypes.default.any, dataHook: _propTypes.default.any, id: _propTypes.default.any, infoContent: _propTypes.default.any, infoTooltipProps: _propTypes.default.any, showInfoIconOnHover: _propTypes.default.any, label: _propTypes.default.any, labelAlignment: _propTypes.default.any, labelPlacement: _propTypes.default.any, labelSize: _propTypes.default.any, required: _propTypes.default.any, stretchContent: _propTypes.default.any, suffix: _propTypes.default.any, charCount: _propTypes.default.any, labelId: _propTypes.default.any, statusMessage: _propTypes.default.any, status: _propTypes.default.any, ellipsis: _propTypes.default.any, maxLines: _propTypes.default.any, labelWidth: _propTypes.default.any, inputWidth: _propTypes.default.any }; 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