ffr-components
Version:
Fiori styled UI components
199 lines (168 loc) • 7.21 kB
JavaScript
import _extends from "@babel/runtime/helpers/esm/extends";
import _defineProperty from "@babel/runtime/helpers/esm/defineProperty";
import _objectWithoutProperties from "@babel/runtime/helpers/esm/objectWithoutProperties";
import _classCallCheck from "@babel/runtime/helpers/esm/classCallCheck";
import _createClass from "@babel/runtime/helpers/esm/createClass";
import _possibleConstructorReturn from "@babel/runtime/helpers/esm/possibleConstructorReturn";
import _getPrototypeOf from "@babel/runtime/helpers/esm/getPrototypeOf";
import _assertThisInitialized from "@babel/runtime/helpers/esm/assertThisInitialized";
import _inherits from "@babel/runtime/helpers/esm/inherits";
function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); keys.push.apply(keys, symbols); } return keys; }
function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(source, true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(source).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
import React from 'react';
import classnames from 'classnames';
import { FormMessage } from './FormMessage';
import FormLabel from './FormLabel';
import { FormConsumer, ITEM_LAYOUT } from './Form';
import { getRandom } from '../utils';
import { elementState, trigger } from './constants';
var MemoLabel = React.memo(function (_ref) {
var label = _ref.label,
required = _ref.required,
id = _ref.id;
return React.createElement(FormLabel, {
required: required,
htmlFor: id
}, label);
});
var FormItem =
/*#__PURE__*/
function (_React$Component) {
_inherits(FormItem, _React$Component);
/**
* label : can be either string or react element
* fieldMeta: an configuration object with following properties:
* name: field name
* fieldType : number,
* semantics : string,currency, password...
* mandatory :bool
* rules: an array of validators, validator is object with fields function (or string) and message
* show : show or hide current field
*/
function FormItem(_props) {
var _this;
_classCallCheck(this, FormItem);
_this = _possibleConstructorReturn(this, _getPrototypeOf(FormItem).call(this, _props));
_this.update = function (_ref2) {
var state = _ref2.state,
message = _ref2.message,
show = _ref2.show;
_this.setState({
state: state,
message: message
});
};
_this.mapMessageType = function (state) {
switch (state) {
case elementState.invalid:
return 'error';
case elementState.normal:
case elementState.valid:
return 'help';
default:
return state;
}
};
_this.renderElements = function (props) {
var _this$props = _this.props,
label = _this$props.label,
children = _this$props.children;
var mandatory = props.mandatory,
id = props.id,
show = props.show,
state = props.state,
message = props.message,
restProps = _objectWithoutProperties(props, ["mandatory", "id", "show", "state", "message"]);
var checkProps = {};
if (_this.isCheck) {
checkProps.required = mandatory;
}
return React.createElement(React.Fragment, null, !_this.isCheck && label && React.createElement(MemoLabel, {
label: label,
required: mandatory,
id: id
}), React.createElement("div", {
className: "ffr-form-element"
}, React.cloneElement(children, _objectSpread({
id: id,
state: state,
label: label
}, checkProps, {}, restProps)), message ? React.createElement(FormMessage, {
type: _this.mapMessageType(state)
}, message) : null));
};
_this.renderFormItem = function (_ref3) {
var connect = _ref3.connect,
itemLayout = _ref3.itemLayout;
var _this$props2 = _this.props,
label = _this$props2.label,
children = _this$props2.children,
_this$props2$isInline = _this$props2.isInline,
isInline = _this$props2$isInline === void 0 ? false : _this$props2$isInline,
className = _this$props2.className,
rest = _objectWithoutProperties(_this$props2, ["label", "children", "isInline", "className"]);
var props = connect(_assertThisInitialized(_this), _objectSpread({}, rest, {}, _this.localFieldMeta));
var show = props.show;
var klass = classnames(className, 'fd-form-item', {
'ffr-form-item__h': itemLayout === ITEM_LAYOUT.horizontal
}, {
'ffr-form-item__v': itemLayout === ITEM_LAYOUT.vertical
}, {
'ffr-form-item__r': !itemLayout
}, {
'ffr-form-checkbox': _this.isCheck
}, {
'fd-form-item--inline': isInline
});
var id = props.id,
divProps = _objectWithoutProperties(props, ["id"]);
return show === false ? null : React.createElement("div", _extends({}, divProps, {
className: klass
}), _this.renderElements(props));
};
var _this$props3 = _this.props,
_children = _this$props3.children,
name = _this$props3.name;
if (!React.isValidElement(_children)) {
throw new Error("children for Form item must be single React element");
}
_this.state = {
state: 'normal',
// normal, valid, invalid, warning
message: null // type : error, warning, help
};
_this.localFieldMeta = {};
if (!_this.localFieldMeta.id) {
if (_children.props.id) {
_this.localFieldMeta.id = _children.props.id;
} else {
_this.localFieldMeta.id = _this._generateId(name);
}
}
Object.keys(_children.props).forEach(function (k) {
if (k === trigger.change || k === trigger.blur) {
if (_this.localFieldMeta.originAction) {
_this.localFieldMeta.originAction[k] = _children.props[k];
} else {
_this.localFieldMeta.originAction = _defineProperty({}, k, _children.props[k]);
}
}
});
_this.localFieldMeta.disabled = Boolean(_children.props.disabled);
_this.isCheck = _this.localFieldMeta.isCheck = _children.type && _children.type.displayName === 'Checkbox';
return _this;
}
_createClass(FormItem, [{
key: "_generateId",
value: function _generateId(name) {
return "".concat(name, "_").concat(getRandom());
}
}, {
key: "render",
value: function render() {
return React.createElement(FormConsumer, null, this.renderFormItem);
}
}]);
return FormItem;
}(React.Component);
export { FormItem as default };