coreui
Version:
Platform Core UI
402 lines (315 loc) • 13.1 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 _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('coreui-deps/lib/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 _componentFromProp = require('recompose/componentFromProp');
var _componentFromProp2 = _interopRequireDefault(_componentFromProp);
var _getContext = require('recompose/getContext');
var _getContext2 = _interopRequireDefault(_getContext);
var _lifecycle = require('recompose/lifecycle');
var _lifecycle2 = _interopRequireDefault(_lifecycle);
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 _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; }
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; }
var addInputTypes = _reactFormal2.default.addInputTypes,
RFFormButton = _reactFormal2.default.Button,
Context = _reactFormal2.default.Context,
Field = _reactFormal2.default.Field,
Message = _reactFormal2.default.Message,
Summary = _reactFormal2.default.Summary,
Trigger = _reactFormal2.default.Trigger;
var systemStyles = {};
var handleSubmit = function handleSubmit(_ref, formValue) {
var coreuiModalContext = _ref.coreuiModalContext,
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 FormButtonBase = (0, _componentFromProp2.default)('baseComponent');
var FormButton = (0, _mapProps2.default)(function (props) {
var className = props.className,
component = props.component,
type = props.type,
rest = _objectWithoutProperties(props, ['className', 'component', 'type']);
var isSubmit = type === 'submit';
var baseProps = _extends({}, rest, {
baseComponent: isSubmit ? RFFormButton : _Button2.default,
className: (0, _dedupe2.default)({ 'btn-primary': type === 'submit' }, className),
type: type
});
return !isSubmit ? baseProps : (0, _ramda.assoc)('component', component || _Button2.default, baseProps);
})(FormButtonBase);
var FormField = (0, _defaultProps2.default)({ errorClass: 'has-danger' })(Field);
var FormMessage = (0, _compose2.default)((0, _defaultProps2.default)({ errorClass: 'has-danger' }), (0, _mapProps2.default)(function (_ref2) {
var className = _ref2.className,
rest = _objectWithoutProperties(_ref2, ['className']);
return _extends({
className: (0, _dedupe2.default)('form-msg', className)
}, rest);
}))(Message);
var setup = function setup() {
var _Shared$getRegistered = _Shared2.default.getRegisteredComponents(),
CalendarInput = _Shared$getRegistered.CalendarInput,
ComboboxInput = _Shared$getRegistered.ComboboxInput,
DateTimePickerInput = _Shared$getRegistered.DateTimePickerInput,
DropdownListInput = _Shared$getRegistered.DropdownListInput,
MultiselectInput = _Shared$getRegistered.MultiselectInput,
NumberPickerInput = _Shared$getRegistered.NumberPickerInput,
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', 'textarea', 'url']
}];
inputs.forEach(function (_ref3) {
var component = _ref3.component,
types = _ref3.types;
if (component) {
types.forEach(function (t) {
return addInputTypes(_defineProperty({}, t, (0, _toClass2.default)(component)));
});
}
});
};
var FormContainer = (0, _compose2.default)((0, _lifecycle2.default)({
componentWillMount: function componentWillMount() {
setup();
}
}), (0, _getContext2.default)({ coreuiModalContext: _react.PropTypes.object }), (0, _mapProps2.default)(function (_ref4) {
var className = _ref4.className,
sheet = _ref4.sheet,
style = _ref4.style,
theme = _ref4.theme,
rest = _objectWithoutProperties(_ref4, ['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]);
} }))(_reactFormal2.default);
var StyledForm = _Shared2.default.injectSheet(systemStyles)(FormContainer);
var Form = function Form(props) {
return _react2.default.createElement(
StyledForm,
props,
props.children
);
};
Form.Button = FormButton;
Form.Context = Context;
Form.Field = FormField;
Form.Message = FormMessage;
Form.Summary = Summary;
Form.Trigger = Trigger;
Form.addInputTypes = 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) {
var model = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
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 = addInputTypes;
exports.Button = FormButton;
exports.Context = Context;
exports.Field = FormField;
exports.Message = FormMessage;
exports.Summary = Summary;
exports.Trigger = Trigger;
_Shared2.default.registerComponent('Form', Form);
exports.default = Form;