@altiore/form
Version:
Form helper for building powerful forms
99 lines (98 loc) • 5.06 kB
JavaScript
;
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
if (ar || !(i in from)) {
if (!ar) ar = Array.prototype.slice.call(from, 0, i);
ar[i] = from[i];
}
}
return to.concat(ar || Array.prototype.slice.call(from));
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.getFormValues = exports.toFlatErrors = exports.getArrayValue = void 0;
var get_1 = __importDefault(require("lodash/get"));
var set_1 = __importDefault(require("lodash/set"));
var types_1 = require("../@common/types");
var utils_1 = require("../@common/utils");
var getArrayValue = function (fieldName, values, items) {
var arrValue = (0, get_1.default)(values, fieldName);
if (arrValue) {
var resArr_1 = [];
items.forEach(function (index) {
if (typeof index === 'number' && (arrValue === null || arrValue === void 0 ? void 0 : arrValue[index]) !== undefined) {
resArr_1.push(arrValue === null || arrValue === void 0 ? void 0 : arrValue[index]);
}
});
return resArr_1;
}
else {
return [];
}
};
exports.getArrayValue = getArrayValue;
var toFlatErrors = function (errors, setErrors, prefix) {
if (prefix === void 0) { prefix = ''; }
Object.entries(errors).forEach(function (_a) {
var namePart = _a[0], errorField = _a[1];
var name = (prefix ? prefix + "." : '') + namePart;
if ((Array.isArray(errorField) && typeof errorField[0] === 'string') ||
typeof errorField === 'string') {
setErrors(name, typeof errorField === 'string' ? [errorField] : errorField);
}
else {
(0, exports.toFlatErrors)(errorField, setErrors, name);
}
});
};
exports.toFlatErrors = toFlatErrors;
var getFormValues = function (formRefCurrent, fields) {
var formData = new window.FormData(formRefCurrent !== null && formRefCurrent !== void 0 ? formRefCurrent : undefined);
var values = {};
var formDataMap = new Map(Array.from(formData));
var fieldKeys = Object.keys(fields);
fieldKeys.forEach(function (name) {
var _a, _b;
var value = formDataMap.has(name) ? formDataMap.get(name) : undefined;
// Мы не можем проверить ошибки валидации внутри этого цикла, т.к. данные еще не
// полностью сформированы (особенно для массивов)
var fieldType = (_a = fields[name]) === null || _a === void 0 ? void 0 : _a.fieldType;
// TODO: возможно, не нужно пропускать это значение
// пропускаем массив, т.к. если мы найдем это значение позже вложенных в массив элементов,
// то они могут затереться
if (fieldType === types_1.FieldType.ARRAY) {
return;
}
if (fieldType === types_1.FieldType.SELECT_MULTIPLE) {
if (!Array.isArray(value)) {
value = Array.from(((_b = document.querySelector("select[name='" + name + "']")) === null || _b === void 0 ? void 0 : _b.options) || [])
.filter(function (el) { return el.selected; })
.map(function (el) { return el.value; });
}
}
// TODO: возможно, этот код больше не актуален и полностью покрывается кодом выше про SELECT_MULTIPLE
var prevValue = (0, get_1.default)(values, name);
if (prevValue) {
// если предыдущее значение существует, значит это массив
value = Array.isArray(prevValue)
? __spreadArray(__spreadArray([], prevValue, true), [value], false) : [prevValue, value];
}
// если функция преобразования данных к правильному формату есть -
// применяем ее
var prepareValue = utils_1.parseValueByType.get(fieldType);
(0, set_1.default)(values, name, prepareValue ? prepareValue(value) : value);
});
// установить данные из полей, которые не были зарегистрированы в библиотеке, но есть в форме
// (только с непустым полем name)
Array.from(formDataMap.keys())
.filter(function (key) { return !fieldKeys.includes(key); })
.forEach(function (name) {
if (name) {
(0, set_1.default)(values, name, formDataMap.get(name));
}
});
return values;
};
exports.getFormValues = getFormValues;