yarfl
Version:
Yet Another Redux Forms Library
136 lines • 5.83 kB
JavaScript
"use strict";
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;
};
Object.defineProperty(exports, "__esModule", { value: true });
var creatorFactory_1 = require("./actions/creatorFactory");
var utils_1 = require("./helpers/utils");
var validator_1 = require("./helpers/validator");
var arrayReducer_1 = require("./reducers/arrayReducer");
var formReducer_1 = require("./reducers/formReducer");
var typings_1 = require("./typings");
exports.initializeFormState = function (config, isAsync) {
if (isAsync === void 0) { isAsync = false; }
var name = config.name, _a = config.extra, extra = _a === void 0 ? {} : _a, _b = config.action, action = _b === void 0 ? '' : _b, _c = config.method, method = _c === void 0 ? 'POST' : _c;
var fields = initFields(config.fields, config.addDefaults);
var state = {
action: action,
name: name,
method: method,
fields: fields,
isAsync: isAsync,
extra: extra,
};
return initHooks(config, state);
};
var initHooks = function (config, state) {
var showErrorsOnInit = config.showErrorsOnInit, validateOnInit = config.validateOnInit;
if (showErrorsOnInit) {
var _a = creatorFactory_1.default(config), showFormErrors = _a.showFormErrors, validateForm = _a.validateForm;
var showErrorsAction = showFormErrors(true);
var updated = formReducer_1.formShowErrorsReducer(config)(state, showErrorsAction);
var validator = validator_1.validatorFactory(config)(state);
var validateAction = validateForm(validator);
return formReducer_1.formValidateReducer(config)(updated, validateAction);
}
if (validateOnInit) {
var validator = validator_1.validatorFactory(config)(state);
var validateAction = creatorFactory_1.default(config).validateForm(validator);
return formReducer_1.formValidateReducer(config)(state, validateAction);
}
return state;
};
var initFields = function (fields, addDefaults) {
if (addDefaults === void 0) { addDefaults = true; }
var entries = Object.entries(fields);
return entries.map(function (_a) {
var key = _a[0], field = _a[1];
var _b;
return (_b = {}, _b[key] = initField(key, field, addDefaults), _b);
})
.reduce(function (prev, curr) { return (__assign({}, prev, curr)); });
};
var initField = function (key, field, addDefaults) {
var common = {
key: key,
focused: false,
touched: false,
changed: false,
showErrors: false,
extra: field.extra || {},
};
if (field.fields) {
var fields = initFields(field.fields);
if (field.multiple) {
return __assign({}, common, { fieldType: typings_1.FieldType.Array, default: fields, fields: [arrayReducer_1.createNewField(key, fields, 0)] });
}
return __assign({}, common, { fields: fields, fieldType: typings_1.FieldType.Parent });
}
var errors = [];
if (!addDefaults) {
return __assign({}, common, { value: '', rules: '', errors: errors }, field);
}
var rules = utils_1.firstDefined(field.rules, '');
var name = utils_1.firstDefined(field.name, key);
var autoComplete = utils_1.firstDefined(field.autoComplete, name);
var id = utils_1.firstDefined(field.id, utils_1.kebabCase(name));
var label = utils_1.firstDefined(field.label, utils_1.titleCase(name));
var placeholder = utils_1.firstDefined(field.placeholder, label);
var disabled = utils_1.firstDefined(!!field.disabled, false);
var autoFocus = utils_1.firstDefined(!!field.autoFocus, false);
var multiple = field.multiple;
var value = utils_1.firstDefined(field.value, field.default, multiple ? [] : '');
var dfault = utils_1.firstDefined(field.default, multiple ? [] : '');
var type = utils_1.firstDefined(field.type, inputType(value));
var options = field.options
? optionMapper(field.options, id, name, key, type)
: undefined;
var props = __assign({}, common, { fieldType: typings_1.FieldType.Simple, value: type === 'checkbox' ? !!value : value, default: dfault, initial: value, rules: rules,
name: name,
id: id,
type: type,
label: label,
placeholder: placeholder,
disabled: disabled,
autoFocus: autoFocus,
autoComplete: autoComplete,
errors: errors });
return (options ? __assign({}, props, { options: options, multiple: multiple }) : props);
};
var optionMapper = function (options, id, name, key, type) {
if (!options.length) {
return [];
}
var optionType = typeof options[0];
if (optionType !== 'object' && optionType !== 'string')
throw new Error("'options' for field '" + key + "' must be defined as an array of strings or objects ({ value, label })");
// 'selected' for option elements and 'checked' for radio buttons and checkboxes
return options.map(function (opt) {
var _a = typeof opt === 'string' ? { value: opt, label: opt } : opt, value = _a.value, label = _a.label;
return {
type: type,
value: value,
label: label,
name: utils_1.camelCase(name + " " + value),
id: utils_1.kebabCase(id + " " + value),
};
});
};
var inputType = function (test) {
switch (typeof test) {
case 'string':
return 'text';
case 'number':
return 'number';
case 'boolean':
return 'checkbox';
default:
return 'text';
}
};
//# sourceMappingURL=initializeState.js.map