coreui
Version:
Platform Core UI
416 lines (322 loc) • 14.3 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.Trigger = exports.Summary = exports.Message = exports.Field = exports.Context = exports.Button = exports.addInputTypes = undefined;
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
var _react = require('react');
var _react2 = _interopRequireDefault(_react);
var _Button = require('../Button');
var _Button2 = _interopRequireDefault(_Button);
var _TextInput = require('../TextInput');
var _TextInput2 = _interopRequireDefault(_TextInput);
var _Shared = require('../../Shared');
var _Shared2 = _interopRequireDefault(_Shared);
var _Form = require('../../theme/components/Form');
var _Form2 = _interopRequireDefault(_Form);
var _reactFormal = require('react-formal');
var _reactFormal2 = _interopRequireDefault(_reactFormal);
var _compose = require('recompose/compose');
var _compose2 = _interopRequireDefault(_compose);
var _dedupe = require('classnames/dedupe');
var _dedupe2 = _interopRequireDefault(_dedupe);
var _defaultProps = require('recompose/defaultProps');
var _defaultProps2 = _interopRequireDefault(_defaultProps);
var _propertyExpr = require('property-expr');
var _propertyExpr2 = _interopRequireDefault(_propertyExpr);
var _getContext = require('recompose/getContext');
var _getContext2 = _interopRequireDefault(_getContext);
var _mapProps = require('recompose/mapProps');
var _mapProps2 = _interopRequireDefault(_mapProps);
var _toClass = require('recompose/toClass');
var _toClass2 = _interopRequireDefault(_toClass);
var _withHandlers = require('recompose/withHandlers');
var _withHandlers2 = _interopRequireDefault(_withHandlers);
var _ramda = require('ramda');
function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
function _objectWithoutProperties(obj, keys) { var target = {}; for (var i in obj) { if (keys.indexOf(i) >= 0) continue; if (!Object.prototype.hasOwnProperty.call(obj, i)) continue; target[i] = obj[i]; } return target; }
function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
var systemStyles = {};
var handleSubmit = function handleSubmit(_ref, formValue) {
var coreuiModalContext = _ref.coreuiModalContext;
var onSubmit = _ref.onSubmit;
if (!coreuiModalContext) {
onSubmit(formValue);
} else {
var event = new CustomEvent('coreuiSubmit', { bubbles: true, cancelable: true, detail: { stopPropagation: false } });
var onHide = coreuiModalContext.onHide;
onSubmit(formValue, event);
if ((0, _ramda.is)(Function, onHide) && !(0, _ramda.path)(['detail', 'stopPropagation'], event)) {
onHide(event);
}
}
};
var setup = function setup() {
var _Shared$getRegistered = _Shared2.default.getRegisteredComponents();
var CalendarInput = _Shared$getRegistered.CalendarInput;
var ComboboxInput = _Shared$getRegistered.ComboboxInput;
var DateTimePickerInput = _Shared$getRegistered.DateTimePickerInput;
var DropdownListInput = _Shared$getRegistered.DropdownListInput;
var MultiselectInput = _Shared$getRegistered.MultiselectInput;
var NumberPickerInput = _Shared$getRegistered.NumberPickerInput;
var SelectListInput = _Shared$getRegistered.SelectListInput;
var inputs = [{ component: CalendarInput, types: ['calendar'] }, { component: ComboboxInput, types: ['combobox'] }, { component: DateTimePickerInput,
types: ['date', 'time', 'datepicker', 'datetimepicker', 'timepicker']
}, { component: DropdownListInput, types: ['dropdownlist'] }, { component: MultiselectInput, types: ['array', 'multiselect'] }, { component: NumberPickerInput, types: ['number'] }, { component: SelectListInput, types: ['selectlist'] }, {
component: _TextInput2.default,
types: ['email', 'password', 'search', 'string', 'tel', 'text', 'url']
}];
inputs.forEach(function (_ref2) {
var component = _ref2.component;
var types = _ref2.types;
if (component) {
types.forEach(function (t) {
return (0, _reactFormal.addInputTypes)(_defineProperty({}, t, (0, _toClass2.default)(component)));
});
}
});
};
var FormButton = (0, _compose2.default)((0, _defaultProps2.default)({ component: _Button2.default }), (0, _mapProps2.default)(function (_ref3) {
var className = _ref3.className;
var type = _ref3.type;
var rest = _objectWithoutProperties(_ref3, ['className', 'type']);
return _extends({
className: (0, _dedupe2.default)({ 'btn-primary': type === 'submit' }, className),
type: type
}, rest);
}))(_reactFormal.Button);
var FormField = (0, _defaultProps2.default)({ errorClass: 'has-danger' })(_reactFormal.Field);
var FormMessage = (0, _compose2.default)((0, _defaultProps2.default)({ errorClass: 'has-danger' }), (0, _mapProps2.default)(function (_ref4) {
var className = _ref4.className;
var rest = _objectWithoutProperties(_ref4, ['className']);
return _extends({
className: (0, _dedupe2.default)('form-msg', className)
}, rest);
}))(_reactFormal.Message);
var FormBase = function (_Component) {
_inherits(FormBase, _Component);
function FormBase() {
_classCallCheck(this, FormBase);
return _possibleConstructorReturn(this, Object.getPrototypeOf(FormBase).apply(this, arguments));
}
_createClass(FormBase, [{
key: 'componentWillMount',
value: function componentWillMount() {
setup();
}
}, {
key: 'render',
value: function render() {
var props = this.props;
return _react2.default.createElement(
_reactFormal2.default,
props,
props.children
);
}
}]);
return FormBase;
}(_react.Component);
var FormContainer = (0, _compose2.default)((0, _getContext2.default)({ coreuiModalContext: _react.PropTypes.object }), (0, _mapProps2.default)(function (_ref5) {
var className = _ref5.className;
var sheet = _ref5.sheet;
var style = _ref5.style;
var theme = _ref5.theme;
var rest = _objectWithoutProperties(_ref5, ['className', 'sheet', 'style', 'theme']);
return _extends({
className: (0, _dedupe2.default)(sheet.classes.form, theme.classes.form, className),
style: (0, _ramda.merge)(theme.styles.form, style)
}, rest);
}), (0, _withHandlers2.default)({ onSubmit: function onSubmit(props) {
return (0, _ramda.partial)(handleSubmit, [props]);
} }))(FormBase);
var StyledForm = _Shared2.default.useSheet(FormContainer, systemStyles);
var Form = function Form(props) {
return _react2.default.createElement(
StyledForm,
props,
props.children
);
};
Form.Button = FormButton;
Form.Context = _reactFormal.Context;
Form.Field = FormField;
Form.Message = FormMessage;
Form.Summary = _reactFormal.Summary;
Form.Trigger = _reactFormal.Trigger;
Form.addInputTypes = _reactFormal.addInputTypes;
var classes = _Form2.default.classes;
var options = _Form2.default.options;
var styles = _Form2.default.styles;
Form.defaultProps = {
component: 'form',
delay: 300,
getter: function getter(path, model) {
return path ? _propertyExpr2.default.getter(path, true)(model || {}) : model;
},
strict: false,
theme: { classes: classes, options: options, styles: styles }
};
Form.displayName = 'Form';
Form.propTypes = {
children: _react.PropTypes.node,
className: _react.PropTypes.string,
/**
* A tag name or Component class the Form should render.
*
* If `null` are `false` the form will simply render it's child. In
* this instance there must only be one child.
*/
component: _react.PropTypes.oneOfType([_react.PropTypes.func, _react.PropTypes.string, _react.PropTypes.oneOf([null, false])]).isRequired,
/**
* Time in milliseconds that validations should be debounced. Reduces the amount of validation calls
* made at the expense of a slight delay. Helpful for performance.
*/
delay: _react.PropTypes.number,
/**
* An object hash of field errors for the form. The object should be keyed with paths
* with the values being an array of messages or message objects. Errors can be
* left [uncontrolled](/controllables) (use `defaultErrors` to set an initial value)
* or managed along with the `onError` callback. You can use any object shape you'd like for
* messages, as long as you provide the Form.Message component an `extract` prop that
* understands how to pull out the strings message. By default it understands strings and objects
* with a `'message'` property.
*
* ```js
* <Form errors={{
* "name.first": [
* 'First names are required',
* {
* message: "Names must be at least 2 characters long",
* type: 'min'
* }
* ],
* }}/>
* ```
*/
errors: _react.PropTypes.object,
/**
* A value getter function. `getter` is called with `path` and `value` and
* should return the plain **javascript** value at the path.
*
* ```js
* function(
* path: string,
* value: any,
* ) -> object
* ```
*/
getter: _react.PropTypes.func,
/**
* Turns off input validation for the Form, value updates will continue to work.
*/
noValidate: _react.PropTypes.bool,
/**
* Callback that is called when the `value` prop changes.
*
* ```js
* function(
* value: object,
* updatedPaths: array<string>
* )
* ```
*/
onChange: _react.PropTypes.func,
/**
* Callback that is called when a validation error occurs. It is called with an `errors` object
*
* ```editable
* <Form schema={modelSchema}
* defaultValue={modelSchema.default()}
* errors={this.state ? this.state.errors : {}}
* onError={errors => {
* if( errors.dateOfBirth )
* errors.dateOfBirth = 'hijacked!'
* this.setState({ errors })
* }}>
*
* <Form.Field name='dateOfBirth'/>
* <Form.Message for='dateOfBirth'/>
*
* <Form.Button type='submit'>Submit</Form.Button>
* </Form>
* ```
*/
onError: _react.PropTypes.func,
/**
* Callback that is fired when the native onSubmit event is triggered. Only relevant when
* the `component` prop renders a `<form/>` tag. onInvalidSubmit will trigger only if the form is invalid.
*
* ```js
* function onInvalidSubmit(errors){
* // do something with errors
* }
* ```
*/
onInvalidSubmit: _react.PropTypes.func,
/**
* Callback that is fired when the native onSubmit event is triggered. Only relevant when
* the `component` prop renders a `<form/>` tag. onSubmit will trigger only if the form is valid.
*
* ```js
* function onSubmit(formValue){
* // do something with valid value
* }
* ```
*/
onSubmit: _react.PropTypes.func,
/**
* Callback that is called whenever a validation is triggered.
* It is called _before_ the validation is actually run.
* ```js
* function onValidate(event){
* let { type, fields, args } = event
* }
* ```
*/
onValidate: _react.PropTypes.func,
/**
* A Yup schema that validates the Form `value` prop. Used to validate the form input values
* For more information about the yup api check out: https://github.com/jquense/yup/blob/master/README.md
* @type {YupSchema}
*/
schema: _react.PropTypes.any,
/**
* A value setter function. `setter` is called with `path`, the form `value` and the path `value`.
* The `setter` must return updated form `value`, which allows you to leave the original value unmutated.
*
* The default implementation uses the [react immutability helpers](http://facebook.github.io/react/docs/update.html),
* letting you treat the form `value` as immutable.
* ```js
* function(
* path: string,
* formValue: object,
* pathValue: any
* ) -> object
* ```
*/
setter: _react.PropTypes.func,
/**
* Validations will be strict, making no attempt to coarce input values to the appropriate type.
*/
strict: _react.PropTypes.bool,
theme: _react.PropTypes.oneOfType([_react.PropTypes.bool, _react.PropTypes.object]),
/**
* Form value object, can be left [uncontrolled](/controllables);
* use the `defaultValue` prop to initialize an uncontrolled form.
*/
value: _react.PropTypes.object
};
exports.addInputTypes = _reactFormal.addInputTypes;
exports.Button = FormButton;
exports.Context = _reactFormal.Context;
exports.Field = FormField;
exports.Message = FormMessage;
exports.Summary = _reactFormal.Summary;
exports.Trigger = _reactFormal.Trigger;
_Shared2.default.registerComponent('Form', Form);
exports.default = Form;