yarfl
Version:
Yet Another Redux Forms Library
214 lines • 10.9 kB
JavaScript
var __assign = (this && this.__assign) || Object.assign || function(t) {
for (var s, i = 1, n = arguments.length; i < n; i++) {
s = arguments[i];
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
t[p] = s[p];
}
return t;
};
import { connect } from 'react-redux';
import ThunkFactory from './actions/ThunkFactory';
import { extract, flatten, pick, selectField, throwError, } from './helpers/utils';
import { FieldType, } from './typings';
export var createConnector = function (config) { return function (mapStateToProps, mapDispatchToProps, mergeProps, options) {
var extendedMapState = function (state) {
return __assign({ __YARFL__: config.mapState(state) }, (mapStateToProps ? mapStateToProps(state) : {}));
};
var extendedMapDispatch = function (dispatch) { return (__assign({ __YARFL__: mapDispatch(config)(dispatch) }, (mapDispatchToProps ? mapDispatchToProps(dispatch) : {}))); };
var extendedMergeProps = function (stateProps, dispatchProps, ownProps) {
var _a;
var formState = stateProps.__YARFL__;
var formDispatchers = dispatchProps.__YARFL__;
var userMergedProps = mergeProps
? mergeProps(stateProps, dispatchProps, ownProps)
: ownProps;
return __assign((_a = {}, _a[config.name] = mergeFormProps(config)(formState, formDispatchers), _a), userMergedProps);
};
return connect(extendedMapState, extendedMapDispatch, extendedMergeProps, options);
}; };
export var connectDirectly = function (config, options) {
var mapState = createStateMapper(config);
var mergeProps = function (stateProps, dispatchProps, ownProps) {
var _a;
return __assign({}, ownProps, (_a = {}, _a[config.name] = mergeFormProps(config)(stateProps, dispatchProps), _a));
};
return options
? connect(mapState, mapDispatch(config), mergeProps, options)
: connect(mapState, mapDispatch(config), mergeProps);
};
export var localFormMap = function (config) { return function (state, dispatch) {
var mappedState = createStateMapper(config)(state);
var mappedDispatch = mapDispatch(config)(dispatch);
var mergedProps = mergeFormProps(config)(mappedState, mappedDispatch);
return mergedProps;
}; };
export var createStateMapper = function (config) {
var name = config.name, mapState = config.mapState;
return function (state) {
var formState = mapState(state);
if (typeof formState === 'undefined') {
throwError("'mapStateToProps' for form " + name + " returned undefined. Make sure", "you add a selector function to the config object if you used", "'combineReducers' to add forms to your redux.");
}
return formState;
};
};
export var mapDispatch = function (config) { return function (dispatch) {
var thunks = new ThunkFactory(config).getThunks();
var updateForm = thunks.updateForm, clearForm = thunks.clearForm, resetForm = thunks.resetForm, showFormErrors = thunks.showFormErrors, updateField = thunks.updateField, focusField = thunks.focusField, blurField = thunks.blurField, clearField = thunks.clearField, resetField = thunks.resetField, showFieldErrors = thunks.showFieldErrors, validateField = thunks.validateField, addArrayField = thunks.addArrayField, deleteArrayField = thunks.deleteArrayField;
return {
updateForm: function (value) { return dispatch(updateForm(value)); },
clearForm: function () { return dispatch(clearForm()); },
resetForm: function () { return dispatch(resetForm()); },
showFormErrors: function (showErrors) {
return dispatch(showFormErrors(showErrors));
},
updateField: function (key, value) {
return dispatch(updateField(key, value));
},
focusField: function (key) { return dispatch(focusField(key)); },
blurField: function (key) { return dispatch(blurField(key)); },
clearField: function (key) { return dispatch(clearField(key)); },
resetField: function (key) { return dispatch(resetField(key)); },
validateField: function (key) { return dispatch(validateField(key)); },
showFieldErrors: function (key, showErrors) {
return dispatch(showFieldErrors(key, showErrors));
},
addArrayField: function (key) { return dispatch(addArrayField(key)); },
deleteArrayField: function (key, index) {
return dispatch(deleteArrayField(key, index));
},
};
}; };
export var mergeFormProps = function (config) { return function (state, dispatchers) {
var methods = createFormMethods(config)(state, dispatchers);
var fields = state.fields, extra = state.extra;
var errors = Object.values(extract(fields, 'errors', {
ignoreEmptyStrings: true,
flatten: true,
})).filter(function (err) { return !Array.isArray(err); });
var errorCount = errors.length;
var select = createSelect(config)(state, dispatchers);
var values = extract(state.fields, 'value');
return __assign({ name: config.name }, methods, { extra: extra,
errors: errors,
errorCount: errorCount, valid: !errorCount, select: select,
values: values });
}; };
var createFormMethods = function (config) { return function (state, dispatchers) {
var updateForm = dispatchers.updateForm, clearForm = dispatchers.clearForm, resetForm = dispatchers.resetForm, showFormErrors = dispatchers.showFormErrors;
return {
// TODO: allow set to update other properties
set: function (value) { return updateForm(value); },
clear: function () { return clearForm(); },
reset: function () { return resetForm(); },
showErrors: function (showErrors) { return showFormErrors(showErrors); },
extract: function (key, flatten) {
if (flatten === void 0) { flatten = false; }
return extract(state.fields, key, { flatten: flatten });
},
bind: createFormBinder(config),
};
}; };
var createFormBinder = function (config) { return function () {
return pick(config, [
'action',
'name',
'method',
'onSubmit',
'onChange',
'onInput',
'onInvalid',
]);
}; };
var createSelect = function (config) { return function (state, dispatchers, prefix) { return function (keyStr) {
var props = selectField(state, prefix ? prefix + "." + keyStr : keyStr);
if (!props) {
throwError("Key '" + keyStr + "' does not correspond to an existing node in the state.", "Check spelling and/or that the parent key is included.");
}
var methods = createFieldMethods(config)(keyStr, props, dispatchers);
var showErrors = props.showErrors, extra = props.extra, fields = props.fields, fieldType = props.fieldType;
var errors = fieldType === FieldType.Simple
? props.errors
: flatten(Object.values(extract(fields, 'errors', { flatten: true })));
var errorCount = errors.length;
var valid = !errorCount;
var common = __assign({}, props, methods, { errors: errors,
errorCount: errorCount,
valid: valid,
extra: extra });
if (props.fieldType === FieldType.Array) {
common.length = fields.length;
return common;
}
if (props.fieldType === FieldType.Parent) {
return common;
}
var errorMessage = showErrors && !valid ? errors[0] : '';
var options = mapOptions(props, methods);
return __assign({}, common, { errorMessage: errorMessage, options: options });
}; }; };
var createFieldMethods = function (config) { return function (key, props, dispatchers) {
var updateField = dispatchers.updateField, clearField = dispatchers.clearField, resetField = dispatchers.resetField, showFieldErrors = dispatchers.showFieldErrors, addArrayField = dispatchers.addArrayField, deleteArrayField = dispatchers.deleteArrayField;
var common = {
set: function (value) { return updateField(key, value); },
clear: function () { return clearField(key); },
reset: function () { return resetField(key); },
showErrors: function (showErrors) { return showFieldErrors(key, showErrors); },
};
if (props.fieldType === FieldType.Array) {
return __assign({}, common, { add: function () { return addArrayField(key); }, del: function (index) { return deleteArrayField(key, index); } });
}
if (props.fieldType === FieldType.Simple) {
var _a = (selectField(config, key, true) || {}).getter, getter = _a === void 0 ? function (v) { return v; } : _a;
return __assign({}, common, { bind: createFieldBinder(key, props, dispatchers, getter) });
}
return common;
}; };
var createFieldBinder = function (key, props, dispatchers, getter) { return function () {
var type = props.type, multiple = props.multiple;
var inputProps = pick(props, [
'type',
'default',
'id',
'label',
'placeholder',
'name',
'disabled',
'autoFocus',
'multiple',
'autoComplete',
]);
var fetchedValue = getter(props.value);
var updateField = dispatchers.updateField, focusField = dispatchers.focusField, blurField = dispatchers.blurField;
var bindProps = __assign({ value: fetchedValue }, inputProps, { onChange: function (e, value) {
if (value !== undefined && value !== null) {
updateField(key, value);
}
else if (type === 'select' && multiple) {
var update = Array.from(e.target.options)
.filter(function (opt) { return opt.selected; })
.map(function (opt) { return opt.value; });
updateField(key, update);
}
else {
var currentTarget = e.currentTarget, target = e.target;
var _a = (currentTarget ||
target), checked = _a.checked, targetValue = _a.value;
var setValue = type === 'checkbox' ? checked : targetValue;
updateField(key, setValue);
}
}, onBlur: function () { return blurField(key); }, onFocus: function () { return focusField(key); } });
return type === 'checkbox'
? __assign({}, bindProps, { checked: !!fetchedValue }) : bindProps;
}; };
var mapOptions = function (props, methods) {
var options = props.options, value = props.value, type = props.type;
if (!options || !Array.isArray(options) || !options.length)
return [];
var onChange = methods.bind().onChange;
return options.map(function (opt) {
var bindProps = __assign({}, opt, { onChange: onChange, checked: type !== 'select' ? opt.value === value : undefined });
return __assign({}, opt, { bind: function () { return bindProps; } });
});
};
//# sourceMappingURL=connect.js.map