UNPKG

vdr-react-form-manager

Version:
145 lines (144 loc) 7.07 kB
"use strict"; 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; } };