vdr-react-form-manager
Version:
145 lines (144 loc) • 7.07 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const FormManager_constant_1 = require("../constant/FormManager.constant");
const array_utils_1 = require("./array.utils");
const form_utils_1 = require("./form.utils");
const formInputProperties_utils_1 = require("./formInputProperties.utils");
const formInputsValidator_utils_1 = require("./formInputsValidator.utils");
const object_utils_1 = require("./object.utils");
/* Form is disabled, so we need to set his value to the inputs */
const forceDisabledInput = (formInputs) => {
Object.keys(formInputs).forEach(x => {
formInputs[x].originalDisabledValue = formInputs[x].disabled;
formInputs[x].disabled = true;
});
};
const createIState = (newFormInputs, currentState) => {
const { formProperties } = currentState;
return {
formInputs: newFormInputs,
formProperties: Object.assign(Object.assign(Object.assign({}, formProperties), { isFormTouched: formProperties.isFormTouched ? formProperties.isFormTouched : form_utils_1.getIsFormTouched(newFormInputs), isFormPristine: form_utils_1.getIsFormPristine(newFormInputs) }), form_utils_1.getFormValidity(newFormInputs, formProperties.formValidators)),
lastFieldUpdated: null,
};
};
const isInvalidFormStateInputs = (formStateInputs) => !formStateInputs || !Object.keys(formStateInputs).length;
const getUpdatedInputProps = (currentFormInput, updatedFormInput) => {
const { label, disabled, classNames, validators, availableValues, customProps } = updatedFormInput;
return {
label: Boolean(label) ? label : currentFormInput.label,
disabled: typeof disabled === FormManager_constant_1.typeBoolean ? disabled : currentFormInput.disabled,
classNames: array_utils_1.isValidArray(classNames) ? classNames : currentFormInput.classNames,
validators: array_utils_1.isValidArray(validators) ? formInputProperties_utils_1.getInputValidators(validators) : currentFormInput.validators,
availableValues: array_utils_1.isValidArray(availableValues)
? formInputProperties_utils_1.getInputAvailableValues(availableValues)
: currentFormInput.availableValues,
customProps: object_utils_1.isValidObject(customProps) ? customProps : currentFormInput.customProps,
};
};
const updateFormInputData = (currentFormInput, updatedFormInput, forceInputIsTouched) => {
const params = updatedFormInput || {};
const { value, resetIsPristine } = params;
let newValue;
let isTouched;
// tslint:disable-next-line:triple-equals
if (value != undefined && !exports.inputValueAreEquals(value, currentFormInput.value)) {
newValue = value;
isTouched = true;
}
else {
newValue = currentFormInput.value;
isTouched = forceInputIsTouched ? true : currentFormInput.isTouched;
}
// tslint:disable-next-line:triple-equals
if (Boolean(resetIsPristine) && value != undefined) {
currentFormInput.value = value;
currentFormInput.originalValue = value;
isTouched = forceInputIsTouched ? true : false;
}
const updatedInputProps = getUpdatedInputProps(currentFormInput, updatedFormInput);
const errors = formInputsValidator_utils_1.validateFormInput(newValue, updatedInputProps.validators);
return Object.assign(Object.assign(Object.assign(Object.assign({}, currentFormInput), { value: newValue, isTouched, isPristine: exports.inputValueAreEquals(newValue, currentFormInput.originalValue), errors, isValid: errors.length === 0 }), updatedInputProps), { updateId: formInputProperties_utils_1.createUpdateId(newValue) });
};
exports.addInputs = (formInputsToAdd, currentState) => {
if (isInvalidFormStateInputs(formInputsToAdd)) {
return currentState;
}
const { formInputs } = currentState;
/* do not add existing inputs */
const inputList = Object.keys(formInputsToAdd).filter(x => !formInputs[x]);
if (!inputList.length) {
return currentState;
}
/* form is disabled */
if (currentState.formProperties.isFormDisabled === true) {
forceDisabledInput(formInputsToAdd);
}
/* keep order to not overwritte existing inputs */
const newFormInputs = Object.assign(Object.assign({}, formInputsToAdd), formInputs);
return createIState(newFormInputs, currentState);
};
exports.updateInputs = (formInputsToUpdate, currentState, forceInputIsTouched) => {
if (isInvalidFormStateInputs(formInputsToUpdate)) {
return currentState;
}
const { formInputs } = currentState;
/* update only existing inputs */
const inputList = Object.keys(formInputsToUpdate).filter(x => formInputs[x]);
if (!inputList.length) {
return currentState;
}
const updatedFormInputs = inputList.reduce((object, inputKey) => (Object.assign(Object.assign({}, object), { [inputKey]: Object.assign({}, updateFormInputData(formInputs[inputKey], formInputsToUpdate[inputKey], forceInputIsTouched)) })), {});
/* form is disabled */
if (currentState.formProperties.isFormDisabled === true) {
forceDisabledInput(updatedFormInputs);
}
/* keep order to not overwritte updated inputs */
const newFormInputs = Object.assign(Object.assign({}, formInputs), updatedFormInputs);
return createIState(newFormInputs, currentState);
};
exports.removeInputs = (inputNameList, currentState) => {
if (!inputNameList || !inputNameList.length) {
return currentState;
}
const { formInputs } = currentState;
inputNameList.forEach(formInputName => delete formInputs[formInputName]);
return createIState(Object.assign({}, formInputs), currentState);
};
exports.validateInputs = (inputNameList, currentState) => {
const inputsToValidate = inputNameList ? inputNameList : Object.keys(currentState.formInputs);
if (!inputsToValidate || !inputsToValidate.length) {
return currentState;
}
const { formInputs } = currentState;
const formInputsMutation = inputsToValidate
.filter((x) => formInputs[x])
.reduce((object, inputKey) => (Object.assign(Object.assign({}, object), { [inputKey]: {} })), {});
// updateInputs will validate the input
return exports.updateInputs(formInputsMutation, currentState, true);
};
exports.inputValueAreEquals = (currentValue, newValue) => {
const currentType = typeof currentValue;
const newValueType = typeof newValue;
if (currentType !== newValueType) {
return false;
}
switch (currentType.toLowerCase()) {
case 'string': {
return (currentValue
.split(',')
.sort()
.join('') ===
newValue
.split(',')
.sort()
.join(''));
}
case 'object':
return JSON.stringify(currentValue) === JSON.stringify(newValue);
case 'function':
case 'symbol':
return false;
default:
return currentValue === newValue;
}
};