es6-react-admin-lte
Version:
An AdminLTE Template made to use for React and ES2015-and-so-on
412 lines (382 loc) • 16.6 kB
JavaScript
'use strict';
Object.defineProperty(exports, "__esModule", {
value: true
});
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
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 _react = require('react');
var _react2 = _interopRequireDefault(_react);
var _loadStatus = require('../utilities/load-status.js');
var _loadStatus2 = _interopRequireDefault(_loadStatus);
var _select = require('./pieces/select.js');
var _select2 = _interopRequireDefault(_select);
var _datePicker = require('./pieces/date-picker.js');
var _datePicker2 = _interopRequireDefault(_datePicker);
var _propTypes = require('prop-types');
var _propTypes2 = _interopRequireDefault(_propTypes);
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; }
var Form = function (_React$Component) {
_inherits(Form, _React$Component);
function Form(props) {
_classCallCheck(this, Form);
var _this = _possibleConstructorReturn(this, (Form.__proto__ || Object.getPrototypeOf(Form)).call(this, props));
_this.state = {
data: _this.props.data
};
_this.loadForm = _this.loadForm.bind(_this);
_this.changeHandler = _this.changeHandler.bind(_this);
_this.clickHandler = _this.clickHandler.bind(_this);
_this.convertToDataType = _this.convertToDataType.bind(_this);
return _this;
}
_createClass(Form, [{
key: 'componentWillReceiveProps',
value: function componentWillReceiveProps(nextProps) {
this.setState({
data: nextProps.data
});
}
}, {
key: 'loadForm',
value: function loadForm() {
var _this2 = this;
return this.props.fields.map(function (field, i) {
var required = field.required || false;
var disabled = field.disabled || false;
var fieldVal = _this2.state.data && _this2.state.data[field.id.replace(/-/g, '_')] !== null ? _this2.state.data[field.id.replace(/-/g, '_')] : '';
var fieldElement = void 0;
switch (field.type) {
case 'uncertain-radio':
fieldElement = _react2.default.createElement(
'div',
{ id: field.id, className: 'row' },
_react2.default.createElement(
'div',
{ className: 'col-xs-4 col-sm-3' },
_react2.default.createElement('input', {
type: 'radio',
className: 'form-check-input',
name: field.id,
value: 0,
checked: fieldVal !== null && fieldVal !== undefined ? Number(fieldVal) === 0 : true,
onChange: _this2.changeHandler,
required: required,
disabled: field.disabled
}),
'\xA0Undecided'
),
_react2.default.createElement(
'div',
{ className: 'col-xs-4 col-sm-3 col-md-2' },
_react2.default.createElement('input', {
type: 'radio',
className: 'form-check-input',
name: field.id,
value: 1,
checked: Number(fieldVal) === 1,
onChange: _this2.changeHandler,
required: required,
disabled: field.disabled
}),
'\xA0Yes'
),
_react2.default.createElement(
'div',
{ className: 'col-xs-4 col-sm-3 col-md-2' },
_react2.default.createElement('input', {
type: 'radio',
className: 'form-check-input',
name: field.id,
value: -1,
checked: Number(fieldVal) === -1,
onChange: _this2.changeHandler,
required: required,
disabled: field.disabled
}),
'\xA0No'
)
);
break;
case 'certain-radio':
fieldElement = _react2.default.createElement(
'div',
{ id: field.id, className: 'row' },
_react2.default.createElement(
'div',
{ className: 'col-xs-4 col-sm-3 col-md-2' },
_react2.default.createElement('input', {
type: 'radio',
className: 'form-check-input',
name: field.id,
value: 1,
checked: Number(fieldVal) === 1,
onChange: _this2.changeHandler,
required: required,
disabled: field.disabled
}),
'\xA0Yes'
),
_react2.default.createElement(
'div',
{ className: 'col-xs-4 col-sm-3 col-md-2' },
_react2.default.createElement('input', {
type: 'radio',
className: 'form-check-input',
name: field.id,
value: 0,
checked: fieldVal !== null && fieldVal !== undefined ? Number(fieldVal) === 0 : true,
onChange: _this2.changeHandler,
required: required,
disabled: field.disabled
}),
'\xA0No'
)
);
break;
case 'textarea':
fieldElement = _react2.default.createElement('textarea', {
className: 'form-control',
id: field.id,
name: field.id,
onChange: _this2.changeHandler,
required: required,
value: fieldVal,
placeholder: field.placeholder || null,
disabled: field.disabled
});
break;
case 'number':
fieldElement = _react2.default.createElement('input', {
className: 'form-control',
type: field.type,
id: field.id,
name: field.id,
value: fieldVal,
onChange: _this2.changeHandler,
required: required,
min: field.min || 0,
placeholder: field.placeholder || null,
disabled: field.disabled
});
break;
case 'checkbox':
fieldElement = _react2.default.createElement('input', {
className: 'form-check-input',
style: { marginLeft: '1em' },
type: field.type,
id: field.id,
name: field.id,
checked: fieldVal,
onChange: _this2.changeHandler,
required: required,
min: field.min || 0,
disabled: field.disabled
});
break;
case 'dropdown':
fieldElement = _react2.default.createElement(_select2.default, {
id: field.id,
options: field.options,
error: field.error,
loading: field.loading,
emptyValue: field.name,
value: Boolean(fieldVal) ? fieldVal : field.name,
onChange: _this2.changeHandler,
required: required,
disabled: disabled,
valueProperty: field.valueProperty,
displayProperty: field.displayProperty
});
break;
case 'date':
var val = fieldVal ? moment.unix(fieldVal).format('MMMM, DD, YYYY') : '';
fieldElement = _react2.default.createElement(_datePicker2.default, {
id: field.id,
onChange: _this2.changeHandler,
value: val,
required: required,
disabled: disabled
});
break;
default:
fieldElement = _react2.default.createElement('input', {
className: 'form-control',
type: field.type,
id: field.id,
name: field.id,
value: fieldVal,
onChange: _this2.changeHandler,
required: required,
placeholder: field.placeholder || null,
'data-confirms': field.confirms || null,
disabled: field.disabled
});
break;
}
return _react2.default.createElement(
'div',
{
className: 'form-group' + (field.hidden ? ' hidden' : ''),
key: i,
style: { clear: 'both' }
},
_react2.default.createElement(
'label',
{ htmlFor: field.id, style: { color: '#848484' } },
field.name
),
fieldElement
);
});
}
}, {
key: 'convertToDataType',
value: function convertToDataType(data, toType) {
switch (toType) {
case 'number':
return Number(data);
case 'boolean':
return Boolean(data);
case 'binary':
return Boolean(data) === true ? 1 : 0;
case 'object':
return (typeof data === 'undefined' ? 'undefined' : _typeof(data)) === 'object' ? data : JSON.parse(data);
default:
return (typeof data === 'undefined' ? 'undefined' : _typeof(data)) === 'object' ? JSON.stringify(data) : '' + data;
}
}
}, {
key: 'clickHandler',
value: function clickHandler(e) {
var _this3 = this;
e.preventDefault();
var submitData = this.state.data;
for (var i = 0; i < this.props.fields.length; i++) {
if (this.props.fields[i].id.indexOf('ignore-') >= 0) {
delete submitData[this.props.fields[i].id.replace(/-/g, '_')];
}
}
var requiredErrs = this.props.fields.filter(function (field) {
return field.required && !submitData[field.id.replace(/-/g, '_')];
}).map(function (reqfield) {
return reqfield.name;
});
var confirmErrs = this.props.fields.filter(function (field) {
var confirms = field.confirms !== null && field.confirms !== undefined && field.confirms !== '';
var matchesCounterpart = true;
if (confirms) {
matchesCounterpart = submitData[field.confirms.replace(/-/g, '_')] === submitData[field.id.replace(/-/g, '_')];
}
return confirms && !matchesCounterpart;
}).map(function (reqfield) {
var shouldMatch = _this3.props.fields.find(function (field) {
return field.id === reqfield.confirms;
});
return '\'' + reqfield.name + '\' & \'' + shouldMatch.name + '\' do not match.';
});
var _loop = function _loop(dp) {
if (Object.prototype.hasOwnProperty.call(submitData, dp)) {
var dataType = _this3.props.fields.filter(function (field) {
return field.id === dp.replace(/_/g, '-');
});
if (dataType[0] !== undefined && dataType[0] !== null) {
submitData[dp] = submitData[dp] === null || submitData[dp] === undefined || submitData[dp] === '' ? null : _this3.convertToDataType(submitData[dp], dataType[0].validate ? dataType[0].validate : '');
}
}
};
for (var dp in submitData) {
_loop(dp);
}
this.props.clickHandler(submitData, requiredErrs, confirmErrs);
}
}, {
key: 'changeHandler',
value: function changeHandler(e) {
var formData = this.state.data;
var value = e.currentTarget.type !== 'checkbox' ? e.currentTarget.value : e.currentTarget.checked;
if (e.currentTarget.id.indexOf('datepickerator-') >= 0) {
value = moment(value, 'MMMM, DD, YYYY').valueOf() / 1000;
}
var fieldId = Boolean(e.currentTarget.id) ? e.currentTarget.id.replace('datepickerator-', '').replace(/-/g, '_') : e.currentTarget.name.replace('datepickerator-', '').replace(/-/g, '_');
var fieldDetails = this.props.fields.filter(function (field) {
return field.id === fieldId.replace(/_/g, '-');
});
var isString = fieldDetails[0].validate === 'string' && typeof value === 'string';
var isNum = fieldDetails[0].validate === 'number' && !isNaN(value);
var isBool = (fieldDetails[0].validate === 'boolean' || fieldDetails[0].validate === 'binary') && (value === true || value === false || value === 'true' || value === 'false' || value === 0 || value === 1);
if (isString || isNum || isBool) {
formData[fieldId] = value;
this.setState({ data: formData });
}
}
}, {
key: 'render',
value: function render() {
// A field object in the fields prop takes 6 properties (*required):
// *id, name, *type, required, validate
// Otherwise you can place children to fill the form; or both!
var fields = this.props.fields ? this.loadForm() : '';
return _react2.default.createElement(
'form',
{ role: 'form', id: this.props.id, noValidate: true },
_react2.default.createElement(
'div',
{ className: 'box-body' },
!this.props.loading ? _react2.default.createElement(
'div',
null,
fields,
this.props.children,
_react2.default.createElement(
'div',
{ className: 'text-right' },
this.props.moreButtons,
this.props.hideMainButton ? '' : _react2.default.createElement(
'button',
{
id: 'btn-modder',
className: 'btn ' + (this.props.submitTheme || 'btn-success'),
onClick: this.clickHandler,
style: { margin: '0 0 0 1em' }
},
this.props.submitIcon ? _react2.default.createElement('i', { className: 'fa ' + this.props.submitIcon }) : '',
this.props.submitIcon && this.props.submitHeader ? _react2.default.createElement(
'span',
null,
'\xA0'
) : '',
this.props.submitHeader || 'Submit'
)
)
) : _react2.default.createElement(
'div',
{ className: 'text-center' },
_react2.default.createElement(_loadStatus2.default, { size: '3em', color: '#848484', spins: true })
)
)
);
}
}]);
return Form;
}(_react2.default.Component);
Form.propTypes = {
loading: _propTypes2.default.bool,
id: _propTypes2.default.string,
fields: _propTypes2.default.array,
data: _propTypes2.default.object,
clickHandler: _propTypes2.default.func,
submitIcon: _propTypes2.default.string,
submitHeader: _propTypes2.default.string,
submitTheme: _propTypes2.default.string,
hideMainButton: _propTypes2.default.bool,
moreButtons: _propTypes2.default.oneOfType([_propTypes2.default.array, _propTypes2.default.element])
};
Form.defaultProps = {
hideMainButton: false
};
exports.default = Form;
module.exports = exports['default'];
//# sourceMappingURL=form.js.map